ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IGQ5ZTkzOWUuLmE3NDdhOTkgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMSwxMCArMSwxMyBAQAogIyBUT0RPOiAgRmluZCBhIGJldHRlciB3YXkgdG8gc2VwYXJhdGUgYnVpbGQgY29uZmlncyBmb3IgQURQIHZzIG5vbi1BRFAgZGV2aWNlcwogaWZuZXEgKCQoVEFSR0VUX0JPQVJEX0FVVE8pLHRydWUpCi0gIGlmbmVxICgkKGZpbHRlciBtc204OTk2LCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSksKQotICAgIGlmbmVxICgkKHN0cmlwICQoVVNFX0NBTUVSQV9TVFVCKSksdHJ1ZSkKLSAgICAgIGlmbmVxICgkKEJVSUxEX1RJTllfQU5EUk9JRCksdHJ1ZSkKKyAgaWZuZXEgKCQoc3RyaXAgJChVU0VfQ0FNRVJBX1NUVUIpKSx0cnVlKQorICAgIGlmbmVxICgkKEJVSUxEX1RJTllfQU5EUk9JRCksdHJ1ZSkKKyAgICAgIGlmbmVxICgkKGZpbHRlciBtc204OTk2LCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSksKQogICAgICAgICBpbmNsdWRlICQoY2FsbCBhbGwtc3ViZGlyLW1ha2VmaWxlcykKICAgICAgIGVuZGlmCisgICAgICBpZm5lcSAoJChmaWx0ZXIgbXNtY29iYWx0LCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSksKQorICAgICAgICBpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoY2FsbCBteS1kaXIpL21zbWNvYmFsdCkKKyAgICAgIGVuZGlmCiAgICAgZW5kaWYKICAgZW5kaWYKIGVuZGlmCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9BbmRyb2lkLm1rIGIvUUNhbWVyYTIvQW5kcm9pZC5tawppbmRleCA4MDgxZmU3Li5hNzFkM2Y5IDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9BbmRyb2lkLm1rCisrKyBiL1FDYW1lcmEyL0FuZHJvaWQubWsKQEAgLTExLDYgKzExLDcgQEAKICAgICAgICAgdXRpbC9RQ2FtZXJhRmxhc2guY3BwIFwKICAgICAgICAgdXRpbC9RQ2FtZXJhUGVyZi5jcHAgXAogICAgICAgICB1dGlsL1FDYW1lcmFRdWV1ZS5jcHAgXAorICAgICAgICB1dGlsL1FDYW1lcmFDb21tb24uY3BwIFwKICAgICAgICAgUUNhbWVyYTJIYWwuY3BwIFwKICAgICAgICAgUUNhbWVyYTJGYWN0b3J5LmNwcAogCkBAIC01MCw2ICs1MSwxMSBAQAogTE9DQUxfQ0ZMQUdTICs9IC1EVkFOSUxMQV9IQUwKIGVuZGlmCiAKKyN1c2UgbWVkaWEgZXh0ZW5zaW9uCitpZmVxICgkKFRBUkdFVF9VU0VTX01FRElBX0VYVEVOU0lPTlMpLCB0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX01FRElBX0VYVEVOU0lPTlMKK2VuZGlmCisKICNIQUwgMS4wIEZsYWdzCiBMT0NBTF9DRkxBR1MgKz0gLURERUZBVUxUX0RFTk9JU0VfTU9ERV9PTiAtREhBTDMgLURRQ0FNRVJBX1JFREVGSU5FX0xPRwogCkBAIC02MCw2ICs2Niw3IEBACiAgICAgICAgICQoTE9DQUxfUEFUSCkvc3RhY2svY29tbW9uIFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL2luYyBcCiAgICAgICAgICQoTE9DQUxfUEFUSCkvdXRpbCBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvSEFMMyBcCiAgICAgICAgIGhhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUvaGFyZHdhcmUgXAogICAgICAgICBoYXJkd2FyZS9xY29tL21lZGlhL21zbTg5OTYvbGlic3RhZ2VmcmlnaHRodyBcCiAgICAgICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9tbS1jb3JlL29teGNvcmUgXApAQCAtOTUsNiArMTAyLDcgQEAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY2FtZXJhX2NsaWVudCBsaWJsb2cgbGliaGFyZHdhcmUgbGlidXRpbHMgbGliY3V0aWxzIGxpYmRsIGxpYnN5bmMgbGliZ3VpCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYm1tY2FtZXJhX2ludGVyZmFjZSBsaWJtbWpwZWdfaW50ZXJmYWNlIGxpYnVpIGxpYmNhbWVyYV9tZXRhZGF0YQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJxZE1ldGFEYXRhIGxpYnFzZXJ2aWNlIGxpYmJpbmRlcgorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJjdXRpbHMgbGliZGwKIGlmZXEgKCQoVEFSR0VUX1RTX01BS0VVUCksdHJ1ZSkKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlidHNfZmFjZV9iZWF1dGlmeV9oYWwgbGlidHNfZGV0ZWN0ZWRfZmFjZV9oYWwKIGVuZGlmCkBAIC0xMDcsNSArMTE1LDQgQEAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAogaW5jbHVkZSAkKGNhbGwgZmlyc3QtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCi0KIGVuZGlmCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYTJIV0kuY3BwIGIvUUNhbWVyYTIvSEFML1FDYW1lcmEySFdJLmNwcAppbmRleCBkMTJkYzE2Li41NTI2MGFmIDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYTJIV0kuY3BwCisrKyBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhMkhXSS5jcHAKQEAgLTc1Nyw2ICs3NTcsNyBAQAogICAgICAgICAgICAgc3RydWN0IGNhbWVyYV9kZXZpY2UgKmRldmljZSwgY29uc3Qgdm9pZCAqb3BhcXVlKQogewogICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50MzJfdCByZXQgPSBOT19FUlJPUjsKICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpodyA9CiAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqPihkZXZpY2UtPnByaXYpOwogICAgIGlmICghaHcpIHsKQEAgLTc2OCw5ICs3NjksMjIgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBMT0dEKCJFIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKworICAgIC8vQ2xvc2UgYW5kIGRlbGV0ZSBkdXBsaWNhdGVkIG5hdGl2ZSBoYW5kbGUgYW5kIEZEJ3MuCisgICAgaWYgKGh3LT5tVmlkZW9NZW0gIT0gTlVMTCkgeworICAgICAgICByZXQgPSBody0+bVZpZGVvTWVtLT5jbG9zZU5hdGl2ZUhhbmRsZShvcGFxdWUsCisgICAgICAgICAgICAgICAgaHctPm1TdG9yZU1ldGFEYXRhSW5GcmFtZSA+IDApOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHZpZGVvIG1ldGFkYXRhIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dXKCJQb3NzaWJsZSBGRCBsZWFrLiBSZWxlYXNlIHJlY29yZGluZyBjYWxsZWQgYWZ0ZXIgc3RvcCIpOworICAgIH0KKwogICAgIGh3LT5sb2NrQVBJKCk7CiAgICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgYXBpUmVzdWx0OwotICAgIGludDMyX3QgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfUkVMRUFTRV9SRUNPUklETkdfRlJBTUUsICh2b2lkICopb3BhcXVlKTsKKyAgICByZXQgPSBody0+cHJvY2Vzc0FQSShRQ0FNRVJBX1NNX0VWVF9SRUxFQVNFX1JFQ09SSUROR19GUkFNRSwgKHZvaWQgKilvcGFxdWUpOwogICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgaHctPndhaXRBUElSZXN1bHQoUUNBTUVSQV9TTV9FVlRfUkVMRUFTRV9SRUNPUklETkdfRlJBTUUsICZhcGlSZXN1bHQpOwogICAgIH0KQEAgLTE2NjEsNiArMTY3NSw3IEBACiAgICAgICBtSnBlZ0NsaWVudEhhbmRsZSgwKSwKICAgICAgIG1KcGVnSGFuZGxlT3duZXIoZmFsc2UpLAogICAgICAgbU1ldGFkYXRhTWVtKE5VTEwpLAorICAgICAgbVZpZGVvTWVtKE5VTEwpLAogICAgICAgbUNBQ0RvbmVSZWNlaXZlZChmYWxzZSksCiAgICAgICBtX2JOZWVkUmVzdGFydChmYWxzZSkKIHsKQEAgLTIwMjQsNiArMjAzOSwzNyBAQAogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzRnJhbWVTeW5jRW5hYmxlZAorICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm5zIHdoZXRoZXIgZnJhbWUgc3luYyBpcyBlbmFibGVkCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogYm9vbCBpbmRpY2F0aW5nIHdoZXRoZXIgZnJhbWUgc3luYyBpcyBlbmFibGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6aXNGcmFtZVN5bmNFbmFibGVkKHZvaWQpCit7CisgICAgcmV0dXJuIG1QYXJhbWV0ZXJzLmlzRnJhbWVTeW5jRW5hYmxlZCgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEZyYW1lU3luY0VuYWJsZWQKKyAqCisgKiBERVNDUklQVElPTjogc2V0cyB3aGV0aGVyIGZyYW1lIHN5bmMgaXMgZW5hYmxlZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZW5hYmxlICA6IGZsYWcgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBmcmFtZSBzeW5jCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzZXRGcmFtZVN5bmNFbmFibGVkKGJvb2wgZW5hYmxlKQoreworICAgIHJldHVybiBtUGFyYW1ldGVycy5zZXRGcmFtZVN5bmNFbmFibGVkKGVuYWJsZSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBGVU5DVElPTiAgIDogZ2V0UmVsYXRlZENhbVN5bmNJbmZvCiAgKgogICogREVTQ1JJUFRJT046cmV0dXJucyB0aGUgcmVsYXRlZCBjYW0gc3luYyBpbmZvIGZvciB0aGlzIEhXSSBpbnN0YW5jZQpAQCAtMjI3Niw3ICsyMzIyLDcgQEAKICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX0NBUEFCSUxJVFksCiAgICAgICAgICAgICAwIC8qc3RyZWFtIGlkKi8sIDAgLypidWZmZXIgaW5kZXgqLywgLTEgLypwbGFuZSBpbmRleCovLAogICAgICAgICAgICAgMCAvKmNvb2tpZSovLCBjYXBhYmlsaXR5SGVhcC0+Z2V0RmQoMCksIHNpemVvZihjYW1fY2FwYWJpbGl0eV90KSwKLSAgICAgICAgICAgIGJ1Zk1hcExpc3QpOworICAgICAgICAgICAgYnVmTWFwTGlzdCwgY2FwYWJpbGl0eUhlYXAtPmdldFB0cigwKSk7CiAKICAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgcmMgPSBjYW1lcmFIYW5kbGUtPm9wcy0+bWFwX2J1ZnMoY2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLApAQCAtMjMwMyw4ICsyMzQ5LDE0IEBACiAgICAgfQogICAgIG1lbWNweShnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0sIERBVEFfUFRSKGNhcGFiaWxpdHlIZWFwLDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjYW1fY2FwYWJpbGl0eV90KSk7Ci0gICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5hbmFseXNpc19wYWRkaW5nX2luZm8ub2Zmc2V0X2luZm8ub2Zmc2V0X3ggPSAwOwotICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLm9mZnNldF9pbmZvLm9mZnNldF95ID0gMDsKKworICAgIGludCBpbmRleDsKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBDQU1fQU5BTFlTSVNfSU5GT19NQVg7IGluZGV4KyspIHsKKyAgICAgICAgY2FtX2FuYWx5c2lzX2luZm9fdCAqcF9hbmFseXNpc19pbmZvID0KKyAgICAgICAgICAgICAgICAmZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5hbmFseXNpc19pbmZvW2luZGV4XTsKKyAgICAgICAgcF9hbmFseXNpc19pbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8ub2Zmc2V0X2luZm8ub2Zmc2V0X3ggPSAwOworICAgICAgICBwX2FuYWx5c2lzX2luZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5vZmZzZXRfaW5mby5vZmZzZXRfeSA9IDA7CisgICAgfQogCiAgICAgcmMgPSBOT19FUlJPUjsKIApAQCAtMjgwNSw2ICsyODU3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHZpZGVvTWVtb3J5LT5zZXRWaWRlb0luZm8odXNhZ2UsIGZtdCk7CiAgICAgICAgICAgICBtZW0gPSB2aWRlb01lbW9yeTsKKyAgICAgICAgICAgIG1WaWRlb01lbSA9IHZpZGVvTWVtb3J5OwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX0NBTExCQUNLOgpAQCAtMjg4Nyw3ICsyOTQwLDcgQEAKICAgICB1aW50OF90IGJ1Zk51bSA9IDA7CiAgICAgc2l6ZV90IGJ1ZlNpemUgPSAwOwogICAgIFFDYW1lcmFIZWFwTWVtb3J5ICptaXNjQnVmID0gTlVMTDsKLSAgICB1aW50MzJfdCBmZWF0dXJlX21hc2sgPQorICAgIGNhbV9mZWF0dXJlX21hc2tfdCBmZWF0dXJlX21hc2sgPQogICAgICAgICAgICAgc3RyZWFtSW5mby0+cmVwcm9jZXNzX2NvbmZpZy5wcF9mZWF0dXJlX2NvbmZpZy5mZWF0dXJlX21hc2s7CiAKICAgICBzd2l0Y2ggKHN0cmVhbUluZm8tPnN0cmVhbV90eXBlKSB7CkBAIC0zMTM1LDYgKzMxODgsNyBAQAogICAgICAgICB9CiAgICAgICAgIHZpZGVvX21lbS0+c2V0VmlkZW9JbmZvKHVzYWdlLCBmbXQpOwogICAgICAgICBtZW0gPSBzdGF0aWNfY2FzdDxRQ2FtZXJhTWVtb3J5ICo+KHZpZGVvX21lbSk7CisgICAgICAgIG1WaWRlb01lbSA9IHZpZGVvX21lbTsKICAgICB9CiAgICAgYnJlYWs7CiAKQEAgLTMyODksNyArMzM0MywxNiBAQAogICAgICAgICAgICAgICBQcmV2aWV3IGNhbGxiYWNrICBpbiBVQldDIGNhc2UqLwogICAgICAgICBpZiAoIShtc2dUeXBlRW5hYmxlZChDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpKSAmJgogICAgICAgICAgICAgICAgIChtc2dfdHlwZSAmIENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSkpIHsKLSAgICAgICAgICAgIGlmIChtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9DQUxMQkFDS10gIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gU3RhcnQgY2FsbGJhY2sgY2hhbm5lbCBvbmx5IHdoZW4gcHJldmlldy96c2wgY2hhbm5lbCBpcyBhY3RpdmUKKyAgICAgICAgICAgIFFDYW1lcmFDaGFubmVsKiBwcmV2aWV3Q2ggPSBOVUxMOworICAgICAgICAgICAgaWYgKGlzWlNMTW9kZSgpICYmIChnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSAhPSB0cnVlKSkgeworICAgICAgICAgICAgICAgIHByZXZpZXdDaCA9IG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1pTTF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByZXZpZXdDaCA9IG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1BSRVZJRVddOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUUNhbWVyYUNoYW5uZWwqIGNhbGxiYWNrQ2ggPSBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9DQUxMQkFDS107CisgICAgICAgICAgICBpZiAoKGNhbGxiYWNrQ2ggIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHByZXZpZXdDaCAhPSBOVUxMKSAmJiBwcmV2aWV3Q2gtPmlzQWN0aXZlKCkpIHsKICAgICAgICAgICAgICAgICByYyA9IHN0YXJ0Q2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfQ0FMTEJBQ0spOwogICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICBMT0dFKCJTVEFSVCBDYWxsYmFjayBDaGFubmVsIGZhaWxlZCIpOwpAQCAtMzMyMiw3ICszMzg1LDkgQEAKICAgICAgICAgLypTVE9QIENBTExCQUNLIFNUUkVBTSovCiAgICAgICAgIGlmICgobXNnVHlwZUVuYWJsZWQoQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKSkgJiYKICAgICAgICAgICAgICAgICAobXNnX3R5cGUgJiBDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpKSB7Ci0gICAgICAgICAgICBpZiAobV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfQ0FMTEJBQ0tdICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIFN0b3AgY2FsbGJhY2sgY2hhbm5lbCBvbmx5IGlmIGl0IGlzIGFjdGl2ZQorICAgICAgICAgICAgaWYgKChtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9DQUxMQkFDS10gIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAobV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfQ0FMTEJBQ0tdLT5pc0FjdGl2ZSgpKSkgewogICAgICAgICAgICAgICAgIHJjID0gc3RvcENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX0NBTExCQUNLKTsKICAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgTE9HRSgiU1RPUCBDYWxsYmFjayBDaGFubmVsIGZhaWxlZCIpOwpAQCAtMzQzOSw4ICszNTA0LDEwIEBACiAgICAgbV9wZXJmTG9jay5sb2NrX3JlbCgpOwogCiAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIFNldCBwb3dlciBIaW50IGZvciBwcmV2aWV3Ci0gICAgICAgIG1fcGVyZkxvY2sucG93ZXJIaW50KFBPV0VSX0hJTlRfVklERU9fRU5DT0RFLCB0cnVlKTsKKyAgICAgICAgaWYgKCFtUGFyYW1ldGVycy5pc1NlZU1vcmVFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIC8vIFNldCBwb3dlciBIaW50IGZvciBwcmV2aWV3CisgICAgICAgICAgICBtX3BlcmZMb2NrLnBvd2VySGludChQT1dFUl9ISU5UX1ZJREVPX0VOQ09ERSwgdHJ1ZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBMT0dJKCJYIHJjID0gJWQiLCByYyk7CkBAIC0zNTczLDYgKzM2NDAsNyBAQAogICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKIAogICAgIExPR0koIkUiKTsKKyAgICBtVmlkZW9NZW0gPSBOVUxMOwogICAgIC8vbGluayBtZXRhIHN0cmVhbSB3aXRoIHZpZGVvIGNoYW5uZWwgaWYgbG93IHBvd2VyIG1vZGUuCiAgICAgaWYgKGlzTG93UG93ZXJNb2RlKCkpIHsKICAgICAgICAgLy8gRmluZCBhbmQgdHJ5IHRvIGxpbmsgYSBtZXRhZGF0YSBzdHJlYW0gZnJvbSBwcmV2aWV3IGNoYW5uZWwKQEAgLTM2NDAsOCArMzcwOCwxMCBAQAogICAgIH0KIAogICAgIGlmIChyYyA9PSBOT19FUlJPUikgewotICAgICAgICAvLyBTZXQgcG93ZXIgSGludCBmb3IgdmlkZW8gZW5jb2RpbmcKLSAgICAgICAgbV9wZXJmTG9jay5wb3dlckhpbnQoUE9XRVJfSElOVF9WSURFT19FTkNPREUsIHRydWUpOworICAgICAgICBpZiAoIW1QYXJhbWV0ZXJzLmlzU2VlTW9yZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgLy8gU2V0IHBvd2VyIEhpbnQgZm9yIHZpZGVvIGVuY29kaW5nCisgICAgICAgICAgICBtX3BlcmZMb2NrLnBvd2VySGludChQT1dFUl9ISU5UX1ZJREVPX0VOQ09ERSwgdHJ1ZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBMT0dJKCJYIHJjID0gJWQiLCByYyk7CkBAIC0zNjY5LDkgKzM3MzksMTAgQEAKICAgICB9CiAgICAgaW50IHJjID0gc3RvcENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1ZJREVPKTsKIAorICAgIG1fY2JOb3RpZmllci5mbHVzaFZpZGVvTm90aWZpY2F0aW9ucygpOwogICAgIC8vIERpc2FibGUgcG93ZXIgaGludCBmb3IgdmlkZW8gZW5jb2RpbmcKICAgICBtX3BlcmZMb2NrLnBvd2VySGludChQT1dFUl9ISU5UX1ZJREVPX0VOQ09ERSwgZmFsc2UpOwotCisgICAgbVZpZGVvTWVtID0gTlVMTDsKICAgICBMT0dJKCJYIHJjID0gJWQiLCByYyk7CiAgICAgcmV0dXJuIHJjOwogfQpAQCAtMzY5Miw4ICszNzYzLDkgQEAKIHsKICAgICBpbnQzMl90IHJjID0gVU5LTk9XTl9FUlJPUjsKICAgICBRQ2FtZXJhVmlkZW9DaGFubmVsICpwQ2hhbm5lbCA9Ci0gICAgICAgIChRQ2FtZXJhVmlkZW9DaGFubmVsICopbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfVklERU9dOworICAgICAgICAgICAgKFFDYW1lcmFWaWRlb0NoYW5uZWwgKiltX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9WSURFT107CiAgICAgTE9HRCgib3BhcXVlIGRhdGEgPSAlcCIsb3BhcXVlKTsKKwogICAgIGlmKHBDaGFubmVsICE9IE5VTEwpIHsKICAgICAgICAgcmMgPSBwQ2hhbm5lbC0+cmVsZWFzZUZyYW1lKG9wYXF1ZSwgbVN0b3JlTWV0YURhdGFJbkZyYW1lID4gMCk7CiAgICAgfQpAQCAtMzcxNyw4ICszNzg5LDYgQEAKICAgICBjYW1fZm9jdXNfbW9kZV90eXBlIGZvY3VzTW9kZSA9IG1QYXJhbWV0ZXJzLmdldEZvY3VzTW9kZSgpOwogICAgIExPR0goIkUiKTsKIAotICAgIG1fY3VycmVudEZvY3VzU3RhdGUgPSBDQU1fQUZfU1RBVEVfSU5BQ1RJVkU7Ci0KICAgICBzd2l0Y2ggKGZvY3VzTW9kZSkgewogICAgIGNhc2UgQ0FNX0ZPQ1VTX01PREVfQVVUTzoKICAgICBjYXNlIENBTV9GT0NVU19NT0RFX01BQ1JPOgpAQCAtNDUwMCw3ICs0NTcwLDcgQEAKICAgICAgICAgICAgIGlmICgoIW1QYXJhbWV0ZXJzLmlzQWR2Q2FtRmVhdHVyZXNFbmFibGVkKCkgJiYKICAgICAgICAgICAgICAgICAgICAgIW1GbGFzaE5lZWRlZCAmJgogICAgICAgICAgICAgICAgICAgICAhaXNMb25nc2hvdEVuYWJsZWQoKSAmJgotICAgICAgICAgICAgICAgICAgICBnZXRSZWxhdGVkQ2FtU3luY0luZm8oKS0+aXNfZnJhbWVfc3luY19lbmFibGVkKSAmJgorICAgICAgICAgICAgICAgICAgICBpc0ZyYW1lU3luY0VuYWJsZWQoKSkgJiYKICAgICAgICAgICAgICAgICAgICAgKGdldFJlbGF0ZWRDYW1TeW5jSW5mbygpLT5zeW5jX2NvbnRyb2wgPT0KICAgICAgICAgICAgICAgICAgICAgQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09OKSkgewogICAgICAgICAgICAgICAgIGlmIChnZXRSZWxhdGVkQ2FtU3luY0luZm8oKS0+bW9kZSA9PSBDQU1fTU9ERV9QUklNQVJZKSB7CkBAIC00OTQzLDcgKzUwMTMsMTEgQEAKICAgICAgICAgTE9HRSgidGFrZV9waWN0dXJlX3RocmVhZDogTlVMTCBjYW1lcmEgZGV2aWNlIik7CiAgICAgICAgIHJldHVybiAodm9pZCAqKUJBRF9WQUxVRTsKICAgICB9Ci0gICAgaHctPnRha2VMaXZlU25hcHNob3RfaW50ZXJuYWwoKTsKKyAgICBpZiAoaHctPmJMaXZlU25hcHNob3QpIHsKKyAgICAgICAgaHctPnRha2VMaXZlU25hcHNob3RfaW50ZXJuYWwoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBody0+Y2FuY2VsTGl2ZVNuYXBzaG90X2ludGVybmFsKCk7CisgICAgfQogICAgIHJldHVybiAodm9pZCogKU5VTEw7CiB9CiAKQEAgLTQ5OTcsNiArNTA3MSwxMSBAQAogaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnRha2VMaXZlU25hcHNob3QoKQogewogICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIGlmIChtTGl2ZVNuYXBzaG90VGhyZWFkICE9IDApIHsKKyAgICAgICAgcHRocmVhZF9qb2luKG1MaXZlU25hcHNob3RUaHJlYWQsTlVMTCk7CisgICAgICAgIG1MaXZlU25hcHNob3RUaHJlYWQgPSAwOworICAgIH0KKyAgICBiTGl2ZVNuYXBzaG90ID0gdHJ1ZTsKICAgICByYz0gcHRocmVhZF9jcmVhdGUoJm1MaXZlU25hcHNob3RUaHJlYWQsIE5VTEwsIExpdmVfU25hcHNob3RfdGhyZWFkLCAodm9pZCAqKSB0aGlzKTsKICAgICBpZiAoIXJjKSB7CiAgICAgICAgIHB0aHJlYWRfc2V0bmFtZV9ucChtTGl2ZVNuYXBzaG90VGhyZWFkLCAiQ0FNX2xpdmVTbmFwIik7CkBAIC01NDEwLDYgKzU0ODksMzEgQEAKIGludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpjYW5jZWxMaXZlU25hcHNob3QoKQogewogICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIGlmIChtTGl2ZVNuYXBzaG90VGhyZWFkICE9IDApIHsKKyAgICAgICAgcHRocmVhZF9qb2luKG1MaXZlU25hcHNob3RUaHJlYWQsTlVMTCk7CisgICAgICAgIG1MaXZlU25hcHNob3RUaHJlYWQgPSAwOworICAgIH0KKyAgICBiTGl2ZVNuYXBzaG90ID0gZmFsc2U7CisgICAgcmM9IHB0aHJlYWRfY3JlYXRlKCZtTGl2ZVNuYXBzaG90VGhyZWFkLCBOVUxMLCBMaXZlX1NuYXBzaG90X3RocmVhZCwgKHZvaWQgKikgdGhpcyk7CisgICAgaWYgKCFyYykgeworICAgICAgICBwdGhyZWFkX3NldG5hbWVfbnAobUxpdmVTbmFwc2hvdFRocmVhZCwgIkNBTV9jYW5jZWxfbGl2ZVNuYXAiKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhbmNlbExpdmVTbmFwc2hvdF9pbnRlcm5hbAorICoKKyAqIERFU0NSSVBUSU9OOiBjYW5jZWwgbGl2ZSBzbmFwc2hvdCBkdXJpbmcgcmVjb3JkaW5nCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Y2FuY2VsTGl2ZVNuYXBzaG90X2ludGVybmFsKCkgeworICAgIGludCByYyA9IE5PX0VSUk9SOwogCiAgICAgdW5jb25maWd1cmVBZHZhbmNlZENhcHR1cmUoKTsKICAgICBMT0dIKCJFbmFibGUgZGlzcGxheSBmcmFtZXMgYWdhaW4iKTsKQEAgLTU0MTksMTEgKzU1MjMsNiBAQAogICAgICAgICBtX3BlcmZMb2NrLmxvY2tfcmVsKCk7CiAgICAgfQogCi0gICAgaWYgKG1MaXZlU25hcHNob3RUaHJlYWQgIT0gMCkgewotICAgICAgICBwdGhyZWFkX2pvaW4obUxpdmVTbmFwc2hvdFRocmVhZCxOVUxMKTsKLSAgICAgICAgbUxpdmVTbmFwc2hvdFRocmVhZCA9IDA7Ci0gICAgfQotCiAgICAgLy9zdG9wIHBvc3QgcHJvY2Vzc29yCiAgICAgbV9wb3N0cHJvY2Vzc29yLnN0b3AoKTsKIApAQCAtNTY2NCw3ICs1NzYzLDggQEAKIAogICAgIHNzaXplX3QgYnVmU2l6ZSA9IGltZ0J1Zi0+Z2V0U2l6ZSgwKTsKICAgICBpZiAoQkFEX0lOREVYICE9IGJ1ZlNpemUpIHsKLSAgICAgICAgcmMgPSBwQ2hhbm5lbC0+ZG9SZXByb2Nlc3MoaW1nQnVmLT5nZXRGZCgwKSwgKHNpemVfdClidWZTaXplLCBmYWNlSUQpOworICAgICAgICByYyA9IHBDaGFubmVsLT5kb1JlcHJvY2VzcyhpbWdCdWYtPmdldEZkKDApLCBpbWdCdWYtPmdldFB0cigwKSwKKyAgICAgICAgICAgICAgICAoc2l6ZV90KWJ1ZlNpemUsIGZhY2VJRCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGJ1ZmZlciBzaXplIChiYWQgaW5kZXgpIik7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwpAQCAtNjM4Miw0NiArNjQ4Miw0NSBAQAogaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpwcm9jZXNzQVNEVXBkYXRlKAogICAgICAgICBfX3VudXNlZCBjYW1fYXNkX2RlY2lzaW9uX3QgYXNkX2RlY2lzaW9uKQogewotICAgIHNpemVfdCBkYXRhX2xlbiA9IHNpemVvZihjYW1fYXV0b19zY2VuZV90KTsKLSAgICBzaXplX3QgYnVmZmVyX2xlbiA9IDEgKnNpemVvZihpbnQpICAgICAgIC8vbWV0YSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgKyAxICpzaXplb2YoaW50KSAgICAgICAvL2RhdGEgbGVuCi0gICAgICAgICAgICAgICAgICAgICAgKyBkYXRhX2xlbjsgICAgICAgICAgICAvL2RhdGEKLSAgICBjYW1lcmFfbWVtb3J5X3QgKmFzZEJ1ZmZlciA9IG1HZXRNZW1vcnkoLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0Nvb2tpZSk7Ci0gICAgaWYgKCBOVUxMID09IGFzZEJ1ZmZlciApIHsKLSAgICAgICAgTE9HRSgiTm90IGVub3VnaCBtZW1vcnkgZm9yIGhpc3RvZ3JhbSBkYXRhIik7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgaW50ICpwQVNERGF0YSA9IChpbnQgKilhc2RCdWZmZXItPmRhdGE7Ci0gICAgaWYgKHBBU0REYXRhID09IE5VTEwpIHsKLSAgICAgICAgTE9HRSgibWVtb3J5IGRhdGEgcHRyIGlzIE5VTEwiKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCiAjaWZuZGVmIFZBTklMTEFfSEFMCi0gICAgcEFTRERhdGFbMF0gPSBDQU1FUkFfTUVUQV9EQVRBX0FTRDsKLSAgICBwQVNERGF0YVsxXSA9IChpbnQpZGF0YV9sZW47Ci0gICAgcEFTRERhdGFbMl0gPSBhc2RfZGVjaXNpb24uZGV0ZWN0ZWRfc2NlbmU7CisgICAgaWYgKCBtc2dUeXBlRW5hYmxlZChDQU1FUkFfTVNHX01FVEFfREFUQSkgKSB7CisgICAgICAgIHNpemVfdCBkYXRhX2xlbiA9IHNpemVvZihjYW1fYXV0b19zY2VuZV90KTsKKyAgICAgICAgc2l6ZV90IGJ1ZmZlcl9sZW4gPSAxICpzaXplb2YoaW50KSAgICAgICAvL21ldGEgdHlwZQorICAgICAgICAgICAgICAgICsgMSAqc2l6ZW9mKGludCkgICAgICAgLy9kYXRhIGxlbgorICAgICAgICAgICAgICAgICsgZGF0YV9sZW47ICAgICAgICAgICAgLy9kYXRhCisgICAgICAgIGNhbWVyYV9tZW1vcnlfdCAqYXNkQnVmZmVyID0gbUdldE1lbW9yeSgtMSwKKyAgICAgICAgICAgICAgICBidWZmZXJfbGVuLCAxLCBtQ2FsbGJhY2tDb29raWUpOworICAgICAgICBpZiAoIE5VTEwgPT0gYXNkQnVmZmVyICkgeworICAgICAgICAgICAgTE9HRSgiTm90IGVub3VnaCBtZW1vcnkgZm9yIGhpc3RvZ3JhbSBkYXRhIik7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CiAKLSAgICBxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCBjYkFyZzsKLSAgICBtZW1zZXQoJmNiQXJnLCAwLCBzaXplb2YocWNhbWVyYV9jYWxsYmFja19hcmdtX3QpKTsKLSAgICBjYkFyZy5jYl90eXBlID0gUUNBTUVSQV9EQVRBX0NBTExCQUNLOwotICAgIGNiQXJnLm1zZ190eXBlID0gQ0FNRVJBX01TR19NRVRBX0RBVEE7Ci0gICAgY2JBcmcuZGF0YSA9IGFzZEJ1ZmZlcjsKLSAgICBjYkFyZy51c2VyX2RhdGEgPSBhc2RCdWZmZXI7Ci0gICAgY2JBcmcuY29va2llID0gdGhpczsKLSAgICBjYkFyZy5yZWxlYXNlX2NiID0gcmVsZWFzZUNhbWVyYU1lbW9yeTsKLSAgICBpbnQzMl90IHJjID0gbV9jYk5vdGlmaWVyLm5vdGlmeUNhbGxiYWNrKGNiQXJnKTsKLSAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgTE9HRSgiZmFpbCBzZW5kaW5nIG5vdGlmaWNhdGlvbiIpOwotICAgICAgICBhc2RCdWZmZXItPnJlbGVhc2UoYXNkQnVmZmVyKTsKKyAgICAgICAgaW50ICpwQVNERGF0YSA9IChpbnQgKilhc2RCdWZmZXItPmRhdGE7CisgICAgICAgIGlmIChwQVNERGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJtZW1vcnkgZGF0YSBwdHIgaXMgTlVMTCIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBwQVNERGF0YVswXSA9IENBTUVSQV9NRVRBX0RBVEFfQVNEOworICAgICAgICBwQVNERGF0YVsxXSA9IChpbnQpZGF0YV9sZW47CisgICAgICAgIHBBU0REYXRhWzJdID0gYXNkX2RlY2lzaW9uLmRldGVjdGVkX3NjZW5lOworCisgICAgICAgIHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90IGNiQXJnOworICAgICAgICBtZW1zZXQoJmNiQXJnLCAwLCBzaXplb2YocWNhbWVyYV9jYWxsYmFja19hcmdtX3QpKTsKKyAgICAgICAgY2JBcmcuY2JfdHlwZSA9IFFDQU1FUkFfREFUQV9DQUxMQkFDSzsKKyAgICAgICAgY2JBcmcubXNnX3R5cGUgPSBDQU1FUkFfTVNHX01FVEFfREFUQTsKKyAgICAgICAgY2JBcmcuZGF0YSA9IGFzZEJ1ZmZlcjsKKyAgICAgICAgY2JBcmcudXNlcl9kYXRhID0gYXNkQnVmZmVyOworICAgICAgICBjYkFyZy5jb29raWUgPSB0aGlzOworICAgICAgICBjYkFyZy5yZWxlYXNlX2NiID0gcmVsZWFzZUNhbWVyYU1lbW9yeTsKKyAgICAgICAgaW50MzJfdCByYyA9IG1fY2JOb3RpZmllci5ub3RpZnlDYWxsYmFjayhjYkFyZyk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiZmFpbCBzZW5kaW5nIG5vdGlmaWNhdGlvbiIpOworICAgICAgICAgICAgYXNkQnVmZmVyLT5yZWxlYXNlKGFzZEJ1ZmZlcik7CisgICAgICAgIH0KICAgICB9CiAjZW5kaWYKICAgICByZXR1cm4gTk9fRVJST1I7Ci0KIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTY2NTAsOSArNjc0OSwyNSBAQAogICAgIH0KIAogICAgIGNhbV9wYWRkaW5nX2luZm9fdCBwYWRkaW5nX2luZm87CisKICAgICBpZiAoc3RyZWFtVHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfQU5BTFlTSVMpIHsKLSAgICAgICAgcGFkZGluZ19pbmZvID0KLSAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5hbmFseXNpc19wYWRkaW5nX2luZm87CisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3QgYW5hbHlzaXNJbmZvOworICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgZmVhdHVyZU1hc2s7CisKKyAgICAgICAgZmVhdHVyZU1hc2sgPSAwOworICAgICAgICBtUGFyYW1ldGVycy5nZXRTdHJlYW1QcE1hc2soQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTLCBmZWF0dXJlTWFzayk7CisgICAgICAgIHJjID0gbVBhcmFtZXRlcnMuZ2V0QW5hbHlzaXNJbmZvKAorICAgICAgICAgICAgICAgICgobVBhcmFtZXRlcnMuZ2V0UmVjb3JkaW5nSGludFZhbHVlKCkgPT0gdHJ1ZSkgJiYKKyAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZmRNb2RlSW5WaWRlbygpKSwKKyAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICBmZWF0dXJlTWFzaywKKyAgICAgICAgICAgICAgICAmYW5hbHlzaXNJbmZvKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJnZXRBbmFseXNpc0luZm8gZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIHBhZGRpbmdfaW5mbyA9IGFuYWx5c2lzSW5mby5hbmFseXNpc19wYWRkaW5nX2luZm87CiAgICAgfSBlbHNlIHsKICAgICAgICAgcGFkZGluZ19pbmZvID0KICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5wYWRkaW5nX2luZm87CkBAIC03MDM0LDcgKzcxNDksNyBAQAogICAgICAgICBtUGFyYW1ldGVycy5pc0luc3RhbnRDYXB0dXJlRW5hYmxlZCgpID8gKHVpbnQ4X3QpbVBhcmFtZXRlcnMuZ2V0QWVjRnJhbWVCb3VuZFZhbHVlKCkgOiAwOwogCiAgICAgLy9FbmFibGVkIG1hdGNoZWQgcXVldWUKLSAgICBpZiAoZ2V0UmVsYXRlZENhbVN5bmNJbmZvKCktPmlzX2ZyYW1lX3N5bmNfZW5hYmxlZCkgeworICAgIGlmIChpc0ZyYW1lU3luY0VuYWJsZWQoKSkgewogICAgICAgICBMT0dIKCJFbmFibGluZyBmcmFtZSBzeW5jIGZvciBkdWFsIGNhbWVyYSwgY2FtZXJhIElkOiAlZCIsCiAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZCk7CiAgICAgICAgIGF0dHIuZW5hYmxlX2ZyYW1lX3N5bmMgPSAxOwpAQCAtNzM4OSw5ICs3NTA0LDkgQEAKICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXRSZXByb2NDb3VudCgpLCBjdXJJbmRleCk7CiAgICAgfQogCi0gICAgTE9HSCgiU3VwcG9ydGVkIHBwcm9jIGZlYXR1cmUgbWFzayA9ICV4IiwKKyAgICBMT0dIKCJTdXBwb3J0ZWQgcHByb2MgZmVhdHVyZSBtYXNrID0gJWxseCIsCiAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2spOwotICAgIHVpbnQzMl90IGZlYXR1cmVfbWFzayA9IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnFjb21fc3VwcG9ydGVkX2ZlYXR1cmVfbWFzazsKKyAgICBjYW1fZmVhdHVyZV9tYXNrX3QgZmVhdHVyZV9tYXNrID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrOwogICAgIGludDMyX3Qgem9vbUxldmVsID0gbVBhcmFtZXRlcnMuZ2V0UGFybVpvb21MZXZlbCgpOwogICAgIHVpbnQzMl90IHJvdGF0aW9uID0gbVBhcmFtZXRlcnMuZ2V0SnBlZ1JvdGF0aW9uKCk7CiAgICAgaW50MzJfdCBlZmZlY3QgPSBtUGFyYW1ldGVycy5nZXRFZmZlY3RWYWx1ZSgpOwpAQCAtNzU3NSw3ICs3NjkwLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgfQotICAgIExPR0goInBwcm9jIGZlYXR1cmUgbWFzayBzZXQgPSAleCBwYXNzIGNvdW50ID0gJWQiLAorICAgIExPR0goInBwcm9jIGZlYXR1cmUgbWFzayBzZXQgPSAlbGx4IHBhc3MgY291bnQgPSAlZCIsCiAgICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzaywgY3VySW5kZXgpOwogICAgIHJldHVybiByYzsKIH0KQEAgLTc2NDAsNyArNzc1NSw3IEBACiAgICAgdWludDhfdCBtaW5TdHJlYW1CdWZOdW0gPSBnZXRCdWZOdW1SZXF1aXJlZChDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DKTsKIAogICAgIC8vV05SIGFuZCBIRFIgaGFwcGVuIGlubGluZS4gTm8gZXh0cmEgYnVmZmVycyBuZWVkZWQuCi0gICAgdWludDMyX3QgdGVtcF9mZWF0dXJlX21hc2sgPSBwcF9jb25maWcuZmVhdHVyZV9tYXNrOworICAgIGNhbV9mZWF0dXJlX21hc2tfdCB0ZW1wX2ZlYXR1cmVfbWFzayA9IHBwX2NvbmZpZy5mZWF0dXJlX21hc2s7CiAgICAgdGVtcF9mZWF0dXJlX21hc2sgJj0gfkNBTV9RQ09NX0ZFQVRVUkVfSERSOwogICAgIGlmICh0ZW1wX2ZlYXR1cmVfbWFzayAmJiBtUGFyYW1ldGVycy5pc0hEUkVuYWJsZWQoKSkgewogICAgICAgICBtaW5TdHJlYW1CdWZOdW0gPSAodWludDhfdCkoMSArIG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFIRFJJbkJ1ZnNJZk5lZWRlZCgpKTsKQEAgLTc2ODMsMTEgKzc3OTgsMTEgQEAKICAgICB9CiAKICAgICAvL01hc2sgb3V0IGZlYXR1cmVzIHRoYXQgYXJlIGFscmVhZHkgcHJvY2Vzc2VkIGluIHNuYXBzaG90IHN0cmVhbS4KLSAgICB1aW50MzJfdCBzbmFwc2hvdF9mZWF0dXJlX21hc2sgPSAwOworICAgIGNhbV9mZWF0dXJlX21hc2tfdCBzbmFwc2hvdF9mZWF0dXJlX21hc2sgPSAwOwogICAgIG1QYXJhbWV0ZXJzLmdldFN0cmVhbVBwTWFzayhDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QsIHNuYXBzaG90X2ZlYXR1cmVfbWFzayk7CiAKICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrICY9IH5zbmFwc2hvdF9mZWF0dXJlX21hc2s7Ci0gICAgTE9HSCgiU25hcHNob3QgZmVhdHVyZSBtYXNrOiAweCV4LCByZXByb2MgZmVhdHVyZSBtYXNrOiAweCV4IiwKKyAgICBMT0dIKCJTbmFwc2hvdCBmZWF0dXJlIG1hc2s6IDB4JWxseCwgcmVwcm9jIGZlYXR1cmUgbWFzazogMHglbGx4IiwKICAgICAgICAgICAgIHNuYXBzaG90X2ZlYXR1cmVfbWFzaywgcHBfY29uZmlnLmZlYXR1cmVfbWFzayk7CiAKICAgICBib29sIG9mZmxpbmVSZXByb2MgPSBpc1JlZ3VsYXJDYXB0dXJlKCk7CkBAIC04MDE3LDcgKzgxMzIsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgTE9HSSgiRSByYyA9ICVkIiwgcmMpOworICAgIExPR0koIlggcmMgPSAlZCIsIHJjKTsKICAgICByZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL0hBTC9RQ2FtZXJhMkhXSS5oIGIvUUNhbWVyYTIvSEFML1FDYW1lcmEySFdJLmgKaW5kZXggNGNhZWM1OS4uMGMxYTAwYSAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvSEFML1FDYW1lcmEySFdJLmgKKysrIGIvUUNhbWVyYTIvSEFML1FDYW1lcmEySFdJLmgKQEAgLTE2OCw3ICsxNjgsOSBAQAogICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VOb3RpZmljYXRpb25zKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSk7CiAgICAgc3RhdGljIGJvb2wgbWF0Y2hTbmFwc2hvdE5vdGlmaWNhdGlvbnModm9pZCAqZGF0YSwgdm9pZCAqdXNlcl9kYXRhKTsKICAgICBzdGF0aWMgYm9vbCBtYXRjaFByZXZpZXdOb3RpZmljYXRpb25zKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSk7CisgICAgc3RhdGljIGJvb2wgbWF0Y2hUaW1lc3RhbXBOb3RpZmljYXRpb25zKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSk7CiAgICAgdmlydHVhbCBpbnQzMl90IGZsdXNoUHJldmlld05vdGlmaWNhdGlvbnMoKTsKKyAgICB2aXJ0dWFsIGludDMyX3QgZmx1c2hWaWRlb05vdGlmaWNhdGlvbnMoKTsKIHByaXZhdGU6CiAKICAgICBjYW1lcmFfbm90aWZ5X2NhbGxiYWNrICAgICAgICAgbU5vdGlmeUNiOwpAQCAtMjE3LDYgKzIxOSw3IEBACiAgICAgc3RhdGljIGludCBwcmVfdGFrZV9waWN0dXJlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOwogICAgIHN0YXRpYyBpbnQgdGFrZV9waWN0dXJlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOwogICAgIGludCB0YWtlTGl2ZVNuYXBzaG90X2ludGVybmFsKCk7CisgICAgaW50IGNhbmNlbExpdmVTbmFwc2hvdF9pbnRlcm5hbCgpOwogICAgIGludCB0YWtlQmFja2VuZFBpY19pbnRlcm5hbChib29sICpKcGVnTWVtT3B0LCBjaGFyICpyYXdfZm9ybWF0KTsKICAgICB2b2lkIGNsZWFySW50UGVuZGluZ0V2ZW50cygpOwogICAgIHZvaWQgY2hlY2tJbnRQaWNQZW5kaW5nKGJvb2wgSnBlZ01lbU9wdCwgY2hhciAqcmF3X2Zvcm1hdCk7CkBAIC0yNTQsNiArMjU3LDggQEAKICAgICAgICAgICAgIHZvaWQpOwogICAgIGludDMyX3Qgc2V0UmVsYXRlZENhbVN5bmNJbmZvKAogICAgICAgICAgICAgY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCogaW5mbyk7CisgICAgYm9vbCBpc0ZyYW1lU3luY0VuYWJsZWQodm9pZCk7CisgICAgaW50MzJfdCBzZXRGcmFtZVN5bmNFbmFibGVkKGJvb2wgZW5hYmxlKTsKICAgICBpbnQzMl90IHNldE1wb0NvbXBvc2l0aW9uKGJvb2wgZW5hYmxlKTsKICAgICBib29sIGdldE1wb0NvbXBvc2l0aW9uKHZvaWQpOwogICAgIGJvb2wgZ2V0UmVjb3JkaW5nSGludFZhbHVlKHZvaWQpOwpAQCAtMjk3LDYgKzMwMiw3IEBACiAgICAgaW50MzJfdCBnZXRKcGVnSGFuZGxlSW5mbyhtbV9qcGVnX29wc190ICpvcHMsCiAgICAgICAgICAgICBtbV9qcGVnX21wb19vcHNfdCAqbXBvX29wcywgdWludDMyX3QgKnBKcGVnQ2xpZW50SGFuZGxlKTsKICAgICB1aW50MzJfdCBnZXRDYW1lcmFJZCgpIHsgcmV0dXJuIG1DYW1lcmFJZDsgfTsKKyAgICBib29sIGJMaXZlU25hcHNob3Q7CiBwcml2YXRlOgogICAgIGludCBzZXRQcmV2aWV3V2luZG93KHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKndpbmRvdyk7CiAgICAgaW50IHNldENhbGxCYWNrcygKQEAgLTc0Niw3ICs3NTIsNiBAQAogICAgIG1tX2pwZWdfbXBvX29wc190ICAgICBtSnBlZ01wb0hhbmRsZTsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgbUpwZWdDbGllbnRIYW5kbGU7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgIG1KcGVnSGFuZGxlT3duZXI7Ci0KICAgIC8vdHMgYWRkIGZvciBtYWtldXAKICNpZmRlZiBUQVJHRVRfVFNfTUFLRVVQCiAgICAgVFNSZWN0IG1GYWNlUmVjdDsKQEAgLTc1NSw2ICs3NjAsNyBAQAogICAgIGJvb2wgVHNNYWtldXBQcm9jZXNzKG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lLFFDYW1lcmFTdHJlYW0gKiBzdHJlYW0sVFNSZWN0JiBmYWNlUmVjdCk7CiAjZW5kaWYKICAgICBRQ2FtZXJhTWVtb3J5ICptTWV0YWRhdGFNZW07CisgICAgUUNhbWVyYVZpZGVvTWVtb3J5ICptVmlkZW9NZW07CiAKICAgICBzdGF0aWMgdWludDMyX3Qgc05leHRKb2JJZDsKIApkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvSEFML1FDYW1lcmEySFdJQ2FsbGJhY2tzLmNwcCBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhMkhXSUNhbGxiYWNrcy5jcHAKaW5kZXggZmNmYWM2OC4uNWM3ZDI4MCAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvSEFML1FDYW1lcmEySFdJQ2FsbGJhY2tzLmNwcAorKysgYi9RQ2FtZXJhMi9IQUwvUUNhbWVyYTJIV0lDYWxsYmFja3MuY3BwCkBAIC0zNyw5ICszNyw2IEBACiAjaW5jbHVkZSBTVEFUX0gKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIAotLy8gT3Blbk1BWCBkZXBlbmRlbmNpZXMKLSNpbmNsdWRlICJRQ29tT01YTWV0YWRhdGEuaCIKLQogLy8gQ2FtZXJhIGRlcGVuZGVuY2llcwogI2luY2x1ZGUgIlFDYW1lcmEySFdJLmgiCiAjaW5jbHVkZSAiUUNhbWVyYVRyYWNlLmgiCkBAIC0xMzg2LDcgKzEzODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIFFDYW1lcmFNZW1vcnkgKnZpZGVvTWVtT2JqID0gTlVMTDsKKyAgICBRQ2FtZXJhVmlkZW9NZW1vcnkgKnZpZGVvTWVtT2JqID0gTlVMTDsKICAgICBjYW1lcmFfbWVtb3J5X3QgKnZpZGVvX21lbSA9IE5VTEw7CiAgICAgbnNlY3NfdCB0aW1lU3RhbXAgPSAwOwogICAgIGJvb2wgdHJpZ2dlclRDQiA9IEZBTFNFOwpAQCAtMTQyMywxMSArMTQyMCwxMiBAQAogICAgICAgICAgICAgTE9HRCgiVmlkZW8gZnJhbWUgdG8gZW5jb2RlciBUaW1lU3RhbXAgOiAlbGxkIGJhdGNoID0gMCIsCiAgICAgICAgICAgICAgICAgICAgIHRpbWVTdGFtcCk7CiAgICAgICAgICAgICBwbWUtPmR1bXBGcmFtZVRvRmlsZShzdHJlYW0sIGZyYW1lLCBRQ0FNRVJBX0RVTVBfRlJNX1ZJREVPKTsKLSAgICAgICAgICAgIHZpZGVvTWVtT2JqID0gKFFDYW1lcmFNZW1vcnkgKilmcmFtZS0+bWVtX2luZm87CisgICAgICAgICAgICB2aWRlb01lbU9iaiA9IChRQ2FtZXJhVmlkZW9NZW1vcnkgKilmcmFtZS0+bWVtX2luZm87CiAgICAgICAgICAgICB2aWRlb19tZW0gPSBOVUxMOwogICAgICAgICAgICAgaWYgKE5VTEwgIT0gdmlkZW9NZW1PYmopIHsKICAgICAgICAgICAgICAgICB2aWRlb19tZW0gPSB2aWRlb01lbU9iai0+Z2V0TWVtb3J5KGZyYW1lLT5idWZfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgKHBtZS0+bVN0b3JlTWV0YURhdGFJbkZyYW1lID4gMCk/IHRydWUgOiBmYWxzZSk7CisgICAgICAgICAgICAgICAgdmlkZW9NZW1PYmotPnVwZGF0ZU5hdGl2ZUhhbmRsZShmcmFtZS0+YnVmX2lkeCk7CiAgICAgICAgICAgICAgICAgdHJpZ2dlclRDQiA9IFRSVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDQ5LDcgKzE0NDcsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHZpZGVvX21lbSA9IHN0cmVhbS0+bUN1ck1ldGFNZW1vcnk7Ci0gICAgICAgICAgICBpZiAodmlkZW9fbWVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIG5oID0gdmlkZW9NZW1PYmotPnVwZGF0ZU5hdGl2ZUhhbmRsZShzdHJlYW0tPm1DdXJNZXRhSW5kZXgpOworICAgICAgICAgICAgaWYgKHZpZGVvX21lbSA9PSBOVUxMIHx8IG5oID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBMT0dFKCJObyBGcmVlIG1ldGFkYXRhLiBEcm9wIHRoaXMgZnJhbWUiKTsKICAgICAgICAgICAgICAgICBzdHJlYW0tPm1DdXJCdWZJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgIHN0cmVhbS0+YnVmRG9uZShmcmFtZS0+YnVmX2lkeCk7CkBAIC0xNDU3LDkgKzE0NTYsNiBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3RydWN0IGVuY29kZXJfbWVkaWFfYnVmZmVyX3R5cGUgKiBwYWNrZXQgPQotICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGVuY29kZXJfbWVkaWFfYnVmZmVyX3R5cGUgKil2aWRlb19tZW0tPmRhdGE7Ci0gICAgICAgICAgICBuaCA9IGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHBhY2tldC0+bWV0YV9oYW5kbGUpOwogICAgICAgICAgICAgaW50IGluZGV4ID0gc3RyZWFtLT5tQ3VyQnVmSW5kZXg7CiAgICAgICAgICAgICBpbnQgZmRfY250ID0gcG1lLT5tUGFyYW1ldGVycy5nZXRWaWRlb0JhdGNoU2l6ZSgpOwogICAgICAgICAgICAgbnNlY3NfdCBmcmFtZV90cyA9IG5zZWNzX3QoZnJhbWUtPnRzLnR2X3NlYykgKiAxMDAwMDAwMDAwTEwKQEAgLTE0OTksMTkgKzE0OTUsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHZpZGVvTWVtT2JqID0gKFFDYW1lcmFNZW1vcnkgKilmcmFtZS0+bWVtX2luZm87CisgICAgICAgIHZpZGVvTWVtT2JqID0gKFFDYW1lcmFWaWRlb01lbW9yeSAqKWZyYW1lLT5tZW1faW5mbzsKICAgICAgICAgdmlkZW9fbWVtID0gTlVMTDsKICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IE5VTEw7CiAgICAgICAgIGludCBmZF9jbnQgPSBmcmFtZS0+dXNlcl9idWYuYnVmc191c2VkOwogICAgICAgICBpZiAoTlVMTCAhPSB2aWRlb01lbU9iaikgewogICAgICAgICAgICAgdmlkZW9fbWVtID0gdmlkZW9NZW1PYmotPmdldE1lbW9yeShmcmFtZS0+YnVmX2lkeCwgdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAodmlkZW9fbWVtICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgZW5jb2Rlcl9tZWRpYV9idWZmZXJfdHlwZSAqIHBhY2tldCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGVuY29kZXJfbWVkaWFfYnVmZmVyX3R5cGUgKil2aWRlb19tZW0tPmRhdGE7Ci0gICAgICAgICAgICAgICAgbmggPSBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihwYWNrZXQtPm1ldGFfaGFuZGxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTE9HRSgidmlkZW9fbWVtIE5VTEwiKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5oID0gdmlkZW9NZW1PYmotPnVwZGF0ZU5hdGl2ZUhhbmRsZShmcmFtZS0+YnVmX2lkeCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMT0dFKCJ2aWRlb01lbU9iaiBOVUxMIik7CiAgICAgICAgIH0KQEAgLTIzNTcsNiArMjM0NywzMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2Jlc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdCwgYmVzdGF0c19leGlmX2RlYnVnX3BhcmFtcywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR19CRVNUQVRTLCBwTWV0YURhdGEpIHsKKyAgICAgICAgaWYgKHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zKSB7CisgICAgICAgICAgICBwbWUtPm1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+YmVzdGF0c19kZWJ1Z19wYXJhbXMgPSAqYmVzdGF0c19leGlmX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5iZXN0YXRzX2RlYnVnX3BhcmFtc192YWxpZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fYmhpc3RfYnVmZmVyX2V4aWZfZGVidWdfdCwgYmhpc3RfZXhpZl9kZWJ1Z19wYXJhbXMsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQkhJU1QsIHBNZXRhRGF0YSkgeworICAgICAgICBpZiAocG1lLT5tRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5iaGlzdF9kZWJ1Z19wYXJhbXMgPSAqYmhpc3RfZXhpZl9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICBwbWUtPm1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+Ymhpc3RfZGVidWdfcGFyYW1zX3ZhbGlkID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9xM2FfdHVuaW5nX2luZm9fdCwgcTNhX3R1bmluZ19leGlmX2RlYnVnX3BhcmFtcywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR18zQV9UVU5JTkcsIHBNZXRhRGF0YSkgeworICAgICAgICBpZiAocG1lLT5tRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5xM2FfdHVuaW5nX2RlYnVnX3BhcmFtcyA9ICpxM2FfdHVuaW5nX2V4aWZfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgcG1lLT5tRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMtPnEzYV90dW5pbmdfZGVidWdfcGFyYW1zX3ZhbGlkID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCBsZWRfbW9kZSwgQ0FNX0lOVEZfTUVUQV9MRURfTU9ERV9PVkVSUklERSwgcE1ldGFEYXRhKSB7CiAgICAgICAgIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqcGF5bG9hZCA9CiAgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqKQpAQCAtMzA5Nyw2ICszMTExLDMzIEBACiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbWF0Y2hUaW1lc3RhbXBOb3RpZmljYXRpb25zCisgKgorICogREVTQ1JJUFRJT046IG1hdGNoZXMgdGltZXN0YW1wIGRhdGEgY2FsbGJhY2tzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkYXRhICAgICAgOiBkYXRhIHRvIG1hdGNoCisgKiAgIEB1c2VyX2RhdGEgOiBjb250ZXh0IGRhdGEKKyAqCisgKiBSRVRVUk4gICAgIDogYm9vbCBtYXRjaAorICogICAgICAgICAgICAgIHRydWUgLSBtYXRjaCBmb3VuZAorICogICAgICAgICAgICAgIGZhbHNlLSBtYXRjaCBub3QgZm91bmQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhQ2JOb3RpZmllcjo6bWF0Y2hUaW1lc3RhbXBOb3RpZmljYXRpb25zKHZvaWQgKmRhdGEsCisgICAgICAgIHZvaWQgKi8qdXNlcl9kYXRhKi8pCit7CisgICAgcWNhbWVyYV9jYWxsYmFja19hcmdtX3QgKmFyZyA9ICggcWNhbWVyYV9jYWxsYmFja19hcmdtX3QgKiApIGRhdGE7CisgICAgaWYgKE5VTEwgIT0gYXJnKSB7CisgICAgICAgIGlmICgoUUNBTUVSQV9EQVRBX1RJTUVTVEFNUF9DQUxMQkFDSyA9PSBhcmctPmNiX3R5cGUpICYmCisgICAgICAgICAgICAgICAgKENBTUVSQV9NU0dfVklERU9fRlJBTUUgPT0gYXJnLT5tc2dfdHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogRlVOQ1RJT04gICA6IGNiTm90aWZ5Um91dGluZQogICoKICAqIERFU0NSSVBUSU9OOiBjYWxsYmFjayB0aHJlYWQgd2hpY2ggaW50ZXJmYWNlcyB3aXRoIHRoZSB1cHBlciBsYXllcnMKQEAgLTMxNDAsNyArMzE4MSw3IEBACiAgICAgICAgICAgICAgICAgbnVtT2ZTbmFwc2hvdEV4cGVjdGVkID0gcG1lLT5tUGFyZW50LT5udW1PZlNuYXBzaG90c0V4cGVjdGVkKCk7CiAgICAgICAgICAgICAgICAgbG9uZ1Nob3RFbmFibGVkID0gcG1lLT5tUGFyZW50LT5pc0xvbmdzaG90RW5hYmxlZCgpOwogICAgICAgICAgICAgICAgIExPR0QoIk51bSBTbmFwc2hvdHMgRXhwZWN0ZWQgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgbnVtT2ZTbmFwc2hvdEV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbnVtT2ZTbmFwc2hvdEV4cGVjdGVkKTsKICAgICAgICAgICAgICAgICBudW1PZlNuYXBzaG90UmN2ZCA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTMxNjAsNyArMzIwMSw3IEBACiAgICAgICAgICAgICAgICAgY2JTdGF0dXMgPSBOT19FUlJPUjsKICAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBjYikgewogICAgICAgICAgICAgICAgICAgICBMT0dEKCJjYiB0eXBlICVkIHJlY2VpdmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPmNiX3R5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPmNiX3R5cGUpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChwbWUtPm1QYXJlbnQtPm1zZ1R5cGVFbmFibGVkV2l0aExvY2soY2ItPm1zZ190eXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjYi0+Y2JfdHlwZSkgewpAQCAtMzE3Niw3ICszMjE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPmV4dDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+bUNhbGxiYWNrQ29va2llKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIm5vdGlmeSBjYWxsYmFjayBub3Qgc2V0ISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HVygibm90aWZ5IGNhbGxiYWNrIG5vdCBzZXQhIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiLT5yZWxlYXNlX2NiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi0+cmVsZWFzZV9jYihjYi0+dXNlcl9kYXRhLCBjYi0+Y29va2llLApAQCAtMzE5Myw3ICszMjM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi0+bWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tQ2FsbGJhY2tDb29raWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiZGF0YSBjYWxsYmFjayBub3Qgc2V0ISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HVygiZGF0YSBjYWxsYmFjayBub3Qgc2V0ISIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYi0+cmVsZWFzZV9jYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPnJlbGVhc2VfY2IoY2ItPnVzZXJfZGF0YSwgY2ItPmNvb2tpZSwKQEAgLTMyNTAsOCArMzI5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVsZWFzZV9jYiBzaG91bGQgbm90IGJlIGNhbGxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11eGVyIHdpbGwgcmVsZWFzZSBhZnRlciBpdHMgZG9uZSB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc2luZyB0aGUgYnVmZmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihwbWUtPm1EYXRhQ2IpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+bURhdGFDYihjYi0+bXNnX3R5cGUsIGNiLT5kYXRhLCBjYi0+aW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi0+bWV0YWRhdGEsIHBtZS0+bUNhbGxiYWNrQ29va2llKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ItPnJlbGVhc2VfY2IpIHsKQEAgLTMyNjUsNyArMzMwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiaW52YWxpZCBjYiB0eXBlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPmNiX3R5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPmNiX3R5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYlN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiLT5yZWxlYXNlX2NiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi0+cmVsZWFzZV9jYihjYi0+dXNlcl9kYXRhLCBjYi0+Y29va2llLApAQCAtMzI3NSwxNiArMzMxNSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImNiIG1lc3NhZ2UgdHlwZSAlZCBub3QgZW5hYmxlZCEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPm1zZ190eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1coImNiIG1lc3NhZ2UgdHlwZSAlZCBub3QgZW5hYmxlZCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLT5tc2dfdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYlN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNiLT5yZWxlYXNlX2NiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPnJlbGVhc2VfY2IoY2ItPnVzZXJfZGF0YSwgY2ItPmNvb2tpZSwgY2JTdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGVsZXRlIGNiOworICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2I7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HRSgiaW52YWxpZCBjYiB0eXBlIHBhc3NlZCIpOworICAgICAgICAgICAgICAgICAgICBMT0dXKCJpbnZhbGlkIGNiIHR5cGUgcGFzc2VkIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0zNDEzLDkgKzM0NTMsMjkgQEAKICAgICAgICAgTE9HRSgibm90aWZ5IHRocmVhZCBpcyBub3QgYWN0aXZlIik7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KLQogICAgIG1EYXRhUS5mbHVzaE5vZGVzKG1hdGNoUHJldmlld05vdGlmaWNhdGlvbnMpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBmbHVzaFZpZGVvTm90aWZpY2F0aW9ucworICoKKyAqIERFU0NSSVBUSU9OOiBmbHVzaCBhbGwgcGVuZGluZyB2aWRlbyBub3RpZmljYXRpb25zCisgKiAgICAgICAgICAgICAgZnJvbSB0aGUgbm90aWZpZXIgcXVldWUKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYUNiTm90aWZpZXI6OmZsdXNoVmlkZW9Ob3RpZmljYXRpb25zKCkKK3sKKyAgICBpZiAoIW1BY3RpdmUpIHsKKyAgICAgICAgTE9HRSgibm90aWZ5IHRocmVhZCBpcyBub3QgYWN0aXZlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtRGF0YVEuZmx1c2hOb2RlcyhtYXRjaFRpbWVzdGFtcE5vdGlmaWNhdGlvbnMpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvSEFML1FDYW1lcmFDaGFubmVsLmNwcCBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhQ2hhbm5lbC5jcHAKaW5kZXggY2ZmOGRmNS4uN2NlYjU4YyAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvSEFML1FDYW1lcmFDaGFubmVsLmNwcAorKysgYi9RQ2FtZXJhMi9IQUwvUUNhbWVyYUNoYW5uZWwuY3BwCkBAIC0yOTYsNiArMjk2LDEwIEBACiB7CiAgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOwogCisgICAgaWYobV9iSXNBY3RpdmUpIHsKKyAgICAgICAgTE9HVygiQXR0ZW1wdCB0byBzdGFydCBhY3RpdmUgY2hhbm5lbCIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQogICAgIGlmIChtU3RyZWFtcy5zaXplKCkgPiAxKSB7CiAgICAgICAgIC8vIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc3RyZWFtIGluIHRoZSBjaGFubmVsCiAgICAgICAgIC8vIHdlIG5lZWQgdG8gbm90aWZ5IG1jdGwgdGhhdCBhbGwgc3RyZWFtcyBpbiB0aGlzIGNoYW5uZWwgbmVlZCB0byBiZSBidW5kbGVkCkBAIC04OTIsNyArODk2LDYgQEAKICAqIFBBUkFNRVRFUlMgOgogICogICBAY2FtX2hhbmRsZSA6IGNhbWVyYSBoYW5kbGUKICAqICAgQGNhbV9vcHMgICAgOiBwdHIgdG8gY2FtZXJhIG9wcyB0YWJsZQotICogICBAcHBfbWFzayAgICA6IHBvc3QtcHJvY2Nlc3MgZmVhdHVyZSBtYXNrCiAgKgogICogUkVUVVJOICAgICA6IG5vbmUKICAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwpAQCAtMTAxMSw3ICsxMDE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+aXNUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1BPU1RWSUVXKSB8fAogICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcpIHx8CiAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVcpKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgZmVhdHVyZV9tYXNrID0gZmVhdHVyZUNvbmZpZy5mZWF0dXJlX21hc2s7CisgICAgICAgICAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IGZlYXR1cmVfbWFzayA9IGZlYXR1cmVDb25maWcuZmVhdHVyZV9tYXNrOwogCiAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aHVtYm5haWwgcmVwcm9jZXNzaW5nIGlmIG5vdCBuZWVkZWQKICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtLm5lZWRUaHVtYm5haWxSZXByb2Nlc3MoJmZlYXR1cmVfbWFzaykpIHsKQEAgLTEzMDYsNiArMTMwOSw3IEBACiAgICAgICAgICAgICAgICAgbWV0YV9idWZfaW5kZXgsCiAgICAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgICAgbWV0YV9idWYtPmZkLAorICAgICAgICAgICAgICAgIG1ldGFfYnVmLT5idWZmZXIsCiAgICAgICAgICAgICAgICAgbWV0YV9idWYtPmZyYW1lX2xlbik7CiAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYyApIHsKICAgICAgICAgICAgIExPR0UoIkVycm9yIGR1cmluZyBtZXRhZGF0YSBidWZmZXIgbWFwcGluZyIpOwpAQCAtMTMyNCw2ICsxMzI4LDcgQEAKICAgICAgICAgICAgICBidWZfaW5kZXgsCiAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgZnJhbWUtPmZkLAorICAgICAgICAgICAgIGZyYW1lLT5idWZmZXIsCiAgICAgICAgICAgICAgZnJhbWUtPmZyYW1lX2xlbik7CiAgICAgaWYgKE5PX0VSUk9SICE9IHJjICkgewogICAgICAgICBMT0dFKCJFcnJvciBkdXJpbmcgcmVwcm9jZXNzIGlucHV0IGJ1ZmZlciBtYXBwaW5nIik7CkBAIC0xNTQxLDYgKzE1NDYsNyBAQAogICoKICAqIFBBUkFNRVRFUlMgOgogICogICBAYnVmX2ZkICAgICA6IGZkIHRvIHRoZSBpbnB1dCBidWZmZXIgdGhhdCBuZWVkcyByZXByb2Nlc3MKKyAqICAgQGJ1ZmZlciAgICAgOiBidWZmZXIgcG9pbnRlciBvZiBhY3R1YWwgYnVmZmVyCiAgKiAgIEBidWZfbGVuZ2h0IDogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIKICAqICAgQHJldF92YWwgICAgOiByZXN1bHQgb2YgcmVwcm9jZXNzLgogICogICAgICAgICAgICAgICAgIEV4YW1wbGU6IENvdWxkIGJlIGZhY2VJRCBpbiBjYXNlIG9mIHJlZ2lzdGVyIGZhY2UgaW1hZ2UuCkBAIC0xNTQ5LDcgKzE1NTUsNyBAQAogICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCiAgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQzMl90IFFDYW1lcmFSZXByb2Nlc3NDaGFubmVsOjpkb1JlcHJvY2VzcyhpbnQgYnVmX2ZkLAoraW50MzJfdCBRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbDo6ZG9SZXByb2Nlc3MoaW50IGJ1Zl9mZCwgdm9pZCAqYnVmZmVyLAogICAgICAgICBzaXplX3QgYnVmX2xlbmd0aCwgaW50MzJfdCAmcmV0X3ZhbCkKIHsKICAgICBpbnQzMl90IHJjID0gMDsKQEAgLTE1NjYsNyArMTU3Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmMgPSBtU3RyZWFtc1tpXS0+bWFwQnVmKENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfSU5QVVRfQlVGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX2lkeCwgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfZmQsIGJ1Zl9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX2ZkLCBidWZmZXIsIGJ1Zl9sZW5ndGgpOwogCiAgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90IHBhcmFtOwpkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvSEFML1FDYW1lcmFDaGFubmVsLmggYi9RQ2FtZXJhMi9IQUwvUUNhbWVyYUNoYW5uZWwuaAppbmRleCA1ZDljODA3Li42NTExMmUwIDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYUNoYW5uZWwuaAorKysgYi9RQ2FtZXJhMi9IQUwvUUNhbWVyYUNoYW5uZWwuaApAQCAtNzMsNyArNzMsNyBAQAogICAgIHZvaWQgZGVsZXRlQ2hhbm5lbCgpOwogICAgIGludDMyX3Qgc2V0U3RyZWFtU3luY0NCIChjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwKICAgICAgICAgICAgIHN0cmVhbV9jYl9yb3V0aW5lIHN0cmVhbV9jYik7Ci0KKyAgICBib29sIGlzQWN0aXZlKCkgeyByZXR1cm4gbV9iSXNBY3RpdmU7IH0KIHByb3RlY3RlZDoKICAgICB1aW50MzJfdCBtX2NhbUhhbmRsZTsKICAgICBtbV9jYW1lcmFfb3BzX3QgKm1fY2FtT3BzOwpAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgICAgICAgICB1aW50OF90IG1ldGFfYnVmX2luZGV4KTsKIAogICAgIC8vIG9mZmxpbmUgcmVwcm9jZXNzCi0gICAgaW50MzJfdCBkb1JlcHJvY2VzcyhpbnQgYnVmX2ZkLCBzaXplX3QgYnVmX2xlbmd0aCwgaW50MzJfdCAmcmV0X3ZhbCk7CisgICAgaW50MzJfdCBkb1JlcHJvY2VzcyhpbnQgYnVmX2ZkLCB2b2lkICpidWZmZXIsIHNpemVfdCBidWZfbGVuZ3RoLCBpbnQzMl90ICZyZXRfdmFsKTsKIAogICAgIGludDMyX3QgZG9SZXByb2Nlc3NPZmZsaW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUsCiAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqbWV0YV9idWYsIFFDYW1lcmFQYXJhbWV0ZXJzSW50ZiAmcGFyYW0pOwpkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvSEFML1FDYW1lcmFNZW0uY3BwIGIvUUNhbWVyYTIvSEFML1FDYW1lcmFNZW0uY3BwCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKaW5kZXggY2RiMWFlMS4uZTczOGMwMQotLS0gYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYU1lbS5jcHAKKysrIGIvUUNhbWVyYTIvSEFML1FDYW1lcmFNZW0uY3BwCkBAIC0zNywxNiArMzcsMjIgQEAKICNpbmNsdWRlICJncmFsbG9jLmgiCiAjaW5jbHVkZSAiZ3JhbGxvY19wcml2LmgiCiAKLS8vIE9wZW5NQVggZGVwZW5kZW5jaWVzCi0jaW5jbHVkZSAiT01YX1FDT01FeHRucy5oIgotI2luY2x1ZGUgIlFDb21PTVhNZXRhZGF0YS5oIgotCiAvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCiAjaW5jbHVkZSAiUUNhbWVyYTJIV0kuaCIKICNpbmNsdWRlICJRQ2FtZXJhTWVtLmgiCiAjaW5jbHVkZSAiUUNhbWVyYVBhcmFtZXRlcnMuaCIKICNpbmNsdWRlICJRQ2FtZXJhVHJhY2UuaCIKIAorLy8gTWVkaWEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiT01YX1FDT01FeHRucy5oIgorI2lmZGVmIFVTRV9NRURJQV9FWFRFTlNJT05TCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KK3R5cGVkZWYgc3RydWN0IFZpZGVvTmF0aXZlSGFuZGxlTWV0YWRhdGEgbWVkaWFfbWV0YWRhdGFfYnVmZmVyOworI2Vsc2UKKyNpbmNsdWRlICJRQ29tT01YTWV0YWRhdGEuaCIKK3R5cGVkZWYgc3RydWN0IGVuY29kZXJfbWVkaWFfYnVmZmVyX3R5cGUgbWVkaWFfbWV0YWRhdGFfYnVmZmVyOworI2VuZGlmCisKIGV4dGVybiAiQyIgewogI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKICNpbmNsdWRlICJtbV9jYW1lcmFfaW50ZXJmYWNlLmgiCkBAIC0xMjc5LDEwICsxMjg1LDExIEBACiAgICAgOiBRQ2FtZXJhU3RyZWFtTWVtb3J5KG1lbW9yeSwgY2FjaGVkKQogewogICAgIG1lbXNldChtTWV0YWRhdGEsIDAsIHNpemVvZihtTWV0YWRhdGEpKTsKKyAgICBtZW1zZXQobU5hdGl2ZUhhbmRsZSwgMCwgc2l6ZW9mKG1OYXRpdmVIYW5kbGUpKTsKICAgICBtTWV0YUJ1ZkNvdW50ID0gMDsKICAgICBtQnVmVHlwZSA9IGJ1ZlR5cGU7CiAgICAgLy9TZXQgRGVmYXVsdCBjb2xvciBjb252ZXJzaW9uIGZvcm1hdAotICAgIG1Vc2FnZSA9IHByaXZhdGVfaGFuZGxlX3Q6OlBSSVZfRkxBR1NfSVRVX1JfNzA5OworICAgIG1Vc2FnZSA9IHByaXZhdGVfaGFuZGxlX3Q6OlBSSVZfRkxBR1NfSVRVX1JfNjAxX0ZSOwogCiAgICAgLy9TZXQgRGVmYXVsdCBmcmFtZSBmb3JtYXQKICAgICBtRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7CkBAIC0xMzM0LDkgKzEzNDEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHJjOwogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKLSAgICAgICAgICAgIHN0cnVjdCBlbmNvZGVyX21lZGlhX2J1ZmZlcl90eXBlICogcGFja2V0ID0KLSAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBlbmNvZGVyX21lZGlhX2J1ZmZlcl90eXBlICopbU1ldGFkYXRhW2ldLT5kYXRhOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICogbmggPSBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihwYWNrZXQtPm1ldGFfaGFuZGxlKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPSAgbU5hdGl2ZUhhbmRsZVtpXTsKICAgICAgICAgICAgIGlmICghbmgpIHsKICAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciBpbiBnZXR0aW5nIHZpZGVvIG5hdGl2ZSBoYW5kbGUiKTsKICAgICAgICAgICAgICAgICBBVFJBQ0VfRU5EKCk7CkBAIC0xMzgwLDcgKzEzODUsNyBAQAogICAgIGlmICghKG1CdWZUeXBlICYgUUNBTUVSQV9NRU1fVFlQRV9CQVRDSCkpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IG1CdWZmZXJDb3VudDsgaSA8IGNvdW50ICsgbUJ1ZmZlckNvdW50OyBpICsrKSB7CiAgICAgICAgICAgICBtTWV0YWRhdGFbaV0gPSBtR2V0TWVtb3J5KC0xLAotICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGVuY29kZXJfbWVkaWFfYnVmZmVyX3R5cGUpLCAxLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1lZGlhX21ldGFkYXRhX2J1ZmZlciksIDEsIHRoaXMpOwogICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGFbaV0pIHsKICAgICAgICAgICAgICAgICBMT0dFKCJhbGxvY2F0aW9uIG9mIHZpZGVvIG1ldGFkYXRhIGZhaWxlZC4iKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gbUJ1ZmZlckNvdW50OyBqIDw9IGktMTsgaiArKykgewpAQCAtMTM5MiwxNCArMTM5NywxOSBAQAogICAgICAgICAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RydWN0IGVuY29kZXJfbWVkaWFfYnVmZmVyX3R5cGUgKiBwYWNrZXQgPQotICAgICAgICAgICAgICAgICAgICAoc3RydWN0IGVuY29kZXJfbWVkaWFfYnVmZmVyX3R5cGUgKiltTWV0YWRhdGFbaV0tPmRhdGE7Ci0KKyAgICAgICAgICAgIG1lZGlhX21ldGFkYXRhX2J1ZmZlciAqIHBhY2tldCA9CisgICAgICAgICAgICAgICAgICAgIChtZWRpYV9tZXRhZGF0YV9idWZmZXIgKiltTWV0YWRhdGFbaV0tPmRhdGE7CiAgICAgICAgICAgICAvL0ZEcyA9IDEKICAgICAgICAgICAgIC8vbnVtSW50cyAgPSA1IChvZmZzZXQsIHNpemUsIHVzYWdlLCB0aW1lc3RhbXAsIGZvcm1hdCkKLSAgICAgICAgICAgIHBhY2tldC0+bWV0YV9oYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCBWSURFT19NRVRBREFUQV9OVU1fSU5UUyk7CisgICAgICAgICAgICBtTmF0aXZlSGFuZGxlW2ldID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgVklERU9fTUVUQURBVEFfTlVNX0lOVFMpOworI2lmZGVmIFVTRV9NRURJQV9FWFRFTlNJT05TCisgICAgICAgICAgICBwYWNrZXQtPmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZTsKKyAgICAgICAgICAgIHBhY2tldC0+cEhhbmRsZSA9IG1OYXRpdmVIYW5kbGVbaV07CisjZWxzZQogICAgICAgICAgICAgcGFja2V0LT5idWZmZXJfdHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVDYW1lcmFTb3VyY2U7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKiBuaCA9IGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KHBhY2tldC0+bWV0YV9oYW5kbGUpOworICAgICAgICAgICAgcGFja2V0LT5tZXRhX2hhbmRsZSA9IG1OYXRpdmVIYW5kbGVbaV07CisjZW5kaWYKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPSAgbU5hdGl2ZUhhbmRsZVtpXTsKICAgICAgICAgICAgIGlmICghbmgpIHsKICAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciBpbiBnZXR0aW5nIHZpZGVvIG5hdGl2ZSBoYW5kbGUiKTsKICAgICAgICAgICAgICAgICBBVFJBQ0VfRU5EKCk7CkBAIC0xNDM3LDI1ICsxNDQ3LDM4IEBACiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Zl9jbnQ7IGkrKykgewogICAgICAgICBtTWV0YWRhdGFbaV0gPSBtR2V0TWVtb3J5KC0xLAotICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgZW5jb2Rlcl9tZWRpYV9idWZmZXJfdHlwZSksIDEsIHRoaXMpOworICAgICAgICAgICAgICAgIHNpemVvZihtZWRpYV9tZXRhZGF0YV9idWZmZXIpLCAxLCB0aGlzKTsKICAgICAgICAgaWYgKCFtTWV0YWRhdGFbaV0pIHsKICAgICAgICAgICAgIExPR0UoImFsbG9jYXRpb24gb2YgdmlkZW8gbWV0YWRhdGEgZmFpbGVkLiIpOwogICAgICAgICAgICAgZm9yIChpbnQgaiA9IChpIC0gMSk7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gbU5hdGl2ZUhhbmRsZVtqXSkgeworICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG1OYXRpdmVIYW5kbGVbal0pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtTWV0YWRhdGFbal0tPnJlbGVhc2UobU1ldGFkYXRhW2pdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KLSAgICAgICAgc3RydWN0IGVuY29kZXJfbWVkaWFfYnVmZmVyX3R5cGUgKiBwYWNrZXQgPQotICAgICAgICAgICAgICAgIChzdHJ1Y3QgZW5jb2Rlcl9tZWRpYV9idWZmZXJfdHlwZSAqKW1NZXRhZGF0YVtpXS0+ZGF0YTsKLSAgICAgICAgcGFja2V0LT5tZXRhX2hhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKG51bUZEcywgKG51bUludHMgKiBudW1GRHMpKTsKLSAgICAgICAgcGFja2V0LT5idWZmZXJfdHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVDYW1lcmFTb3VyY2U7Ci0gICAgICAgIGlmIChwYWNrZXQtPm1ldGFfaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgbWVkaWFfbWV0YWRhdGFfYnVmZmVyICpwYWNrZXQgPQorICAgICAgICAgICAgICAgIChtZWRpYV9tZXRhZGF0YV9idWZmZXIgKiltTWV0YWRhdGFbaV0tPmRhdGE7CisgICAgICAgIG1OYXRpdmVIYW5kbGVbaV0gPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShudW1GRHMsIChudW1JbnRzICogbnVtRkRzKSk7CisgICAgICAgIGlmIChtTmF0aXZlSGFuZGxlW2ldID09IE5VTEwpIHsKICAgICAgICAgICAgIExPR0UoIkVycm9yIGluIGdldHRpbmcgdmlkZW8gbmF0aXZlIGhhbmRsZSIpOwogICAgICAgICAgICAgZm9yIChpbnQgaiA9IChpIC0gMSk7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICAgICAgbU1ldGFkYXRhW2ldLT5yZWxlYXNlKG1NZXRhZGF0YVtpXSk7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gbU5hdGl2ZUhhbmRsZVtqXSkgeworICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG1OYXRpdmVIYW5kbGVbal0pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtTWV0YWRhdGFbal0tPnJlbGVhc2UobU1ldGFkYXRhW2pdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KKyNpZmRlZiBVU0VfTUVESUFfRVhURU5TSU9OUworICAgICAgICBwYWNrZXQtPmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZTsKKyAgICAgICAgcGFja2V0LT5wSGFuZGxlID0gbU5hdGl2ZUhhbmRsZVtpXTsKKyNlbHNlCisgICAgICAgIHBhY2tldC0+YnVmZmVyX3R5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlQ2FtZXJhU291cmNlOworICAgICAgICBwYWNrZXQtPm1ldGFfaGFuZGxlID0gbU5hdGl2ZUhhbmRsZVtpXTsKKyNlbmRpZgogICAgIH0KICAgICBtTWV0YUJ1ZkNvdW50ID0gYnVmX2NudDsKICAgICByZXR1cm4gcmM7CkBAIC0xNDczLDIwICsxNDk2LDE1IEBACiB2b2lkIFFDYW1lcmFWaWRlb01lbW9yeTo6ZGVhbGxvY2F0ZU1ldGEoKQogewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU1ldGFCdWZDb3VudDsgaSsrKSB7Ci0gICAgICAgIHN0cnVjdCBlbmNvZGVyX21lZGlhX2J1ZmZlcl90eXBlICogcGFja2V0ID0KLSAgICAgICAgICAgICAgICAoc3RydWN0IGVuY29kZXJfbWVkaWFfYnVmZmVyX3R5cGUgKiltTWV0YWRhdGFbaV0tPmRhdGE7Ci0gICAgICAgIGlmIChOVUxMICE9IHBhY2tldCkgewotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICogbmggPSBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihwYWNrZXQtPm1ldGFfaGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChOVUxMICE9IG5oKSB7Ci0gICAgICAgICAgICAgICBpZiAobmF0aXZlX2hhbmRsZV9kZWxldGUobmgpKSB7Ci0gICAgICAgICAgICAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGRlbGV0ZSBuYXRpdmUgaGFuZGxlIik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgTE9HRSgibmF0aXZlIGhhbmRsZSBub3QgYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICB9CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPSBtTmF0aXZlSGFuZGxlW2ldOworICAgICAgICBpZiAoTlVMTCAhPSBuaCkgeworICAgICAgICAgICBpZiAobmF0aXZlX2hhbmRsZV9kZWxldGUobmgpKSB7CisgICAgICAgICAgICAgICBMT0dFKCJVbmFibGUgdG8gZGVsZXRlIG5hdGl2ZSBoYW5kbGUiKTsKKyAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HRSgicGFja2V0IG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgTE9HRSgibmF0aXZlIGhhbmRsZSBub3QgYXZhaWxhYmxlIik7CiAgICAgICAgIH0KKyAgICAgICAgbU5hdGl2ZUhhbmRsZVtpXSA9IE5VTEw7CiAgICAgICAgIG1NZXRhZGF0YVtpXS0+cmVsZWFzZShtTWV0YWRhdGFbaV0pOwogICAgICAgICBtTWV0YWRhdGFbaV0gPSBOVUxMOwogICAgIH0KQEAgLTE1MzcsNiArMTU1NSw4OCBAQAogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVwZGF0ZU5hdGl2ZUhhbmRsZQorICoKKyAqIERFU0NSSVBUSU9OOiBVcGRhdGluZyBuYXRpdmUgaGFuZGxlIHBvaW50ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBidWZmZXIgaW5kZXgKKyAqICAgQG1ldGFkYXRhOiBmbGFnIGlmIGl0J3MgbWV0YWRhdGEKKyAqCisgKiBSRVRVUk4gICAgIDogY2FtZXJhIG5hdGl2ZSBoYW5kbGUgcHRyCisgKiAgICAgICAgICAgICAgTlVMTCBpZiBub3Qgc3VwcG9ydGVkIG9yIGZhaWxlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCituYXRpdmVfaGFuZGxlX3QgKlFDYW1lcmFWaWRlb01lbW9yeTo6dXBkYXRlTmF0aXZlSGFuZGxlKHVpbnQzMl90IGluZGV4LCBib29sIG1ldGFkYXRhKQoreworICAgIGlmIChpbmRleCA+PSBtTWV0YUJ1ZkNvdW50IHx8ICghbWV0YWRhdGEgJiYgaW5kZXggPj0gbUJ1ZmZlckNvdW50KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm5oID0gTlVMTDsKKyAgICBpZiAobWV0YWRhdGEgJiYgbU1ldGFkYXRhW2luZGV4XSAhPSBOVUxMKSB7CisgICAgICAgIG1lZGlhX21ldGFkYXRhX2J1ZmZlciAqcGFja2V0ID0KKyAgICAgICAgICAgICAgICAobWVkaWFfbWV0YWRhdGFfYnVmZmVyICopbU1ldGFkYXRhW2luZGV4XS0+ZGF0YTsKKyAgICAgICAgbmggPSBtTmF0aXZlSGFuZGxlW2luZGV4XTsKKyNpZmRlZiBVU0VfTUVESUFfRVhURU5TSU9OUworICAgICAgICBwYWNrZXQtPnBIYW5kbGUgPSBuaDsKKyNlbHNlCisgICAgICAgIHBhY2tldC0+bWV0YV9oYW5kbGUgPSBuaDsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gbmg7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2xvc2VOYXRpdmVIYW5kbGUKKyAqCisgKiBERVNDUklQVElPTjogY2xvc2UgdmlkZW8gbmF0aXZlIGhhbmRsZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb3BhcXVlICA6IHB0ciB0byB2aWRlbyBmcmFtZSB0byBiZSByZXR1cm5lZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhVmlkZW9NZW1vcnk6OmNsb3NlTmF0aXZlSGFuZGxlKF9fdW51c2VkIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgICAgIF9fdW51c2VkIGJvb2wgbWV0YWRhdGEpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisjaWZkZWYgVVNFX01FRElBX0VYVEVOU0lPTlMKKyAgICBpbnQzMl90IGluZGV4ID0gLTE7CisgICAgY2FtZXJhX21lbW9yeV90ICp2aWRlb19tZW0gPSBOVUxMOworCisgICAgaWYgKG1ldGFkYXRhKSB7CisgICAgICAgIGluZGV4ID0gZ2V0TWF0Y2hCdWZJbmRleChkYXRhLCBtZXRhZGF0YSk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHZpZGVvX21lbSA9IGdldE1lbW9yeShpbmRleCwgbWV0YWRhdGEpOworICAgICAgICBtZWRpYV9tZXRhZGF0YV9idWZmZXIgKiBwYWNrZXQgPSBOVUxMOworICAgICAgICBpZiAodmlkZW9fbWVtKSB7CisgICAgICAgICAgICAgcGFja2V0ID0gKG1lZGlhX21ldGFkYXRhX2J1ZmZlciAqKXZpZGVvX21lbS0+ZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYWNrZXQgIT0gTlVMTCAmJiBwYWNrZXQtPmVUeXBlID09CisgICAgICAgICAgICAgICAga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZSkgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShwYWNrZXQtPnBIYW5kbGUpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUocGFja2V0LT5wSGFuZGxlKTsKKyAgICAgICAgICAgIHBhY2tldC0+cEhhbmRsZSA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIERhdGEuIENvdWxkIG5vdCByZWxlYXNlIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiTm90IG9mIHR5cGUgdmlkZW8gbWV0YSBidWZmZXIuIEZhaWxlZCIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZVTkNUSU9OICAgOiBnZXRNYXRjaEJ1ZkluZGV4CiAgKgogICogREVTQ1JJUFRJT046IHF1ZXJ5IGJ1ZmZlciBpbmRleCBieSBvcGFxdWUgcHRyCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYU1lbS5oIGIvUUNhbWVyYTIvSEFML1FDYW1lcmFNZW0uaAppbmRleCBjNTJjZWExLi5hMjBlMjlhIDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYU1lbS5oCisrKyBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhTWVtLmgKQEAgLTIzMSwxMCArMjMxLDEzIEBACiAgICAgaW50IGdldFVzYWdlKCl7cmV0dXJuIG1Vc2FnZTt9OwogICAgIGludCBnZXRGb3JtYXQoKXtyZXR1cm4gbUZvcm1hdDt9OwogICAgIGludCBjb252Q2FtdG9PTVhGb3JtYXQoY2FtX2Zvcm1hdF90IGZvcm1hdCk7CisgICAgbmF0aXZlX2hhbmRsZV90ICp1cGRhdGVOYXRpdmVIYW5kbGUodWludDMyX3QgaW5kZXgsIGJvb2wgbWV0YWRhdGEgPSB0cnVlKTsKKyAgICBpbnQgY2xvc2VOYXRpdmVIYW5kbGUoY29uc3Qgdm9pZCAqZGF0YSwgYm9vbCBtZXRhZGF0YSA9IHRydWUpOwogcHJpdmF0ZToKICAgICBjYW1lcmFfbWVtb3J5X3QgKm1NZXRhZGF0YVtNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVNdOwogICAgIHVpbnQ4X3QgbU1ldGFCdWZDb3VudDsKICAgICBpbnQgbVVzYWdlLCBtRm9ybWF0OworICAgIG5hdGl2ZV9oYW5kbGVfdCAqbU5hdGl2ZUhhbmRsZVtNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVNdOwogfTsKIAogCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYU11eGVyLmNwcCBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhTXV4ZXIuY3BwCmluZGV4IDFjMGM5YzEuLmJhZDczOTMgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL0hBTC9RQ2FtZXJhTXV4ZXIuY3BwCisrKyBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhTXV4ZXIuY3BwCkBAIC00MCw2ICs0MCw3IEBACiAvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCiAjaW5jbHVkZSAiUUNhbWVyYU11eGVyLmgiCiAjaW5jbHVkZSAiUUNhbWVyYTJIV0kuaCIKKyNpbmNsdWRlICJRQ2FtZXJhM0hXSS5oIgogCiBleHRlcm4gIkMiIHsKICNpbmNsdWRlICJtbV9jYW1lcmFfZGJnLmgiCkBAIC0xOTA5LDcgKzE5MTAsNiBAQAogewogICAgIGludCByYyA9IE5PX0VSUk9SOwogICAgIExPR0goIkUsIGNhbWVyYV9pZCA9ICVkIiwgY2FtZXJhX2lkKTsKLSAgICBjYW1fc3luY190eXBlX3QgY2FtX3R5cGUgPSBDQU1fVFlQRV9NQUlOOwogCiAgICAgaWYgKCFtX25Mb2dpY2FsQ2FtZXJhcyB8fCAoY2FtZXJhX2lkID49IG1fbkxvZ2ljYWxDYW1lcmFzKSB8fAogICAgICAgICAgICAgIWluZm8gfHwgKGNhbWVyYV9pZCA8IDApKSB7CkBAIC0xOTI1LDcgKzE5MjUsMTAgQEAKICAgICB1aW50MzJfdCBwaHlfaWQgPQogICAgICAgICAgICAgbV9wTG9naWNhbENhbWVyYVtjYW1lcmFfaWRdLnBJZFsKICAgICAgICAgICAgIG1fcExvZ2ljYWxDYW1lcmFbY2FtZXJhX2lkXS5uUHJpbWFyeVBoeUNhbUluZGV4XTsKLSAgICByYyA9IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmdldENhcGFiaWxpdGllcyhwaHlfaWQsIGluZm8sICZjYW1fdHlwZSk7CisgICAgLy8gQ2FsbCBIQUwzIGdldENhbUluZm8gdG8gZ2V0IHRoZSBmbGFzaCBsaWdodCBpbmZvIHRocm91Z2ggc3RhdGljIG1ldGF0ZGF0YQorICAgIC8vIHJlZ2FyZGxlc3Mgb2YgSEFMIHZlcnNpb24KKyAgICByYyA9IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmdldENhbUluZm8ocGh5X2lkLCBpbmZvKTsKKyAgICBpbmZvLT5kZXZpY2VfdmVyc2lvbiA9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOyAvLyBIYXJkY29kZSB0aGUgSEFMIHRvIEhBTDEKICAgICBMT0dIKCJYIik7CiAgICAgcmV0dXJuIHJjOwogfQpAQCAtMjEzNiw4ICsyMTM5LDggQEAKICAgICAgICAgICAgIGluZm8uc3luY19jb250cm9sID0gQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09OOwogICAgICAgICAgICAgaW5mby5tb2RlID0gbV9wUGh5Q2FtZXJhW3BoeUlkXS5tb2RlOwogICAgICAgICAgICAgaW5mby50eXBlID0gbV9wUGh5Q2FtZXJhW3BoeUlkXS50eXBlOwotICAgICAgICAgICAgaW5mby5pc19mcmFtZV9zeW5jX2VuYWJsZWQgPSBtX2JGcmFtZVN5bmNFbmFibGVkOwogICAgICAgICAgICAgcmMgPSBody0+c2V0UmVsYXRlZENhbVN5bmNJbmZvKCZpbmZvKTsKKyAgICAgICAgICAgIGh3LT5zZXRGcmFtZVN5bmNFbmFibGVkKG1fYkZyYW1lU3luY0VuYWJsZWQpOwogICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgTE9HRSgic2V0UmVsYXRlZENhbVN5bmNJbmZvIGZhaWxlZCAlZCIsIHJjKTsKICAgICAgICAgICAgICAgICBkZWxldGUgaHc7CmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYU11eGVyLmggYi9RQ2FtZXJhMi9IQUwvUUNhbWVyYU11eGVyLmgKaW5kZXggZDJlNjdlMS4uYTg1NjEyZSAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvSEFML1FDYW1lcmFNdXhlci5oCisrKyBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhTXV4ZXIuaApAQCAtMzEsNiArMzEsNyBAQAogCiAjaW5jbHVkZSAiY2FtZXJhLmgiCiAjaW5jbHVkZSAiUUNhbWVyYTJIV0kuaCIKKyNpbmNsdWRlICJRQ2FtZXJhM0hXSS5oIgogCiBuYW1lc3BhY2UgcWNhbWVyYSB7CiAKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL0hBTC9RQ2FtZXJhUGFyYW1ldGVycy5jcHAgYi9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBhcmFtZXRlcnMuY3BwCmluZGV4IDk3Mzk0MWEuLmU3YjBkYTQgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL0hBTC9RQ2FtZXJhUGFyYW1ldGVycy5jcHAKKysrIGIvUUNhbWVyYTIvSEFML1FDYW1lcmFQYXJhbWV0ZXJzLmNwcApAQCAtMzk1LDcgKzM5NSw2IEBACiBjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTUFYX1NDRV9GQUNUT1JbXSA9ICJtYXgtc2NlLWZhY3RvciI7CiBjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU0NFX0ZBQ1RPUl9TVEVQW10gPSAic2NlLWZhY3Rvci1zdGVwIjsKIAotY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9DQU1FUkFfRkVBVFVSRVNbXSA9ICJxYy1jYW1lcmEtZmVhdHVyZXMiOwogY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX01BWF9OVU1fUkVRVUVTVEVEX0ZBQ0VTW10gPSAicWMtbWF4LW51bS1yZXF1ZXN0ZWQtZmFjZXMiOwogCiAvL1ZhbHVlcyBmb3IgREVOT0lTRQpAQCAtNDkzLDEyICs0OTIsMTIgQEAKIHN0YXRpYyBjb25zdCBjaGFyKiBsYW5kc2NhcGUgPSAibGFuZHNjYXBlIjsKIAogY29uc3QgY2FtX2RpbWVuc2lvbl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpUSFVNQk5BSUxfU0laRVNfTUFQW10gPSB7Ci0gICAgeyA1MTIsIDI4OCB9LCAvLzEuNzc3Nzc4Ci0gICAgeyA0ODAsIDI4OCB9LCAvLzEuNjY2NjY3CiAgICAgeyAyNTYsIDE1NCB9LCAvLzEuNjYyMzMKLSAgICB7IDQzMiwgMjg4IH0sIC8vMS41CisgICAgeyAyNDAsIDE2MCB9LCAvLzEuNQogICAgIHsgMzIwLCAzMjAgfSwgLy8xLjAKICAgICB7IDMyMCwgMjQwIH0sIC8vMS4zMzMzMworICAgIHsgMjU2LCAxNDQgfSwgLy8xLjc3Nzc3OAorICAgIHsgMjQwLCAxNDQgfSwgLy8xLjY2NjY2NwogICAgIHsgMTc2LCAxNDQgfSwgLy8xLjIyMjIyMgogICAgIC8qVGh1bWJuYWlsIHNpemVzIHRvIG1hdGNoIHBvcnRyYWl0IHBpY3R1cmUgc2l6ZSBhc3BlY3QgcmF0aW8qLwogICAgIHsgMjQwLCAzMjAgfSwgLy90byBtYXRjaCA0ODBYNjQwICYgMjQwWDMyMCBwaWN0dXJlIHNpemUKQEAgLTg5MywxMiArODkyLDE0IEBACiBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYVBhcmFtZXRlcnMoKQogICAgIDogQ2FtZXJhUGFyYW1ldGVycygpLAogICAgICAgbV9yZXByb2NTY2FsZVBhcmFtKCksCisgICAgICBtQ29tbW9uKCksCiAgICAgICBtX3BDYXBhYmlsaXR5KE5VTEwpLAogICAgICAgbV9wQ2FtT3BzVGJsKE5VTEwpLAogICAgICAgbV9wUGFyYW1IZWFwKE5VTEwpLAogICAgICAgbV9wUGFyYW1CdWYoTlVMTCksCiAgICAgICBtX3BSZWxDYW1TeW5jSGVhcChOVUxMKSwKICAgICAgIG1fcFJlbENhbVN5bmNCdWYoTlVMTCksCisgICAgICBtX2JGcmFtZVN5bmNFbmFibGVkKGZhbHNlKSwKICAgICAgIG1Jc1R5cGUoSVNfVFlQRV9OT05FKSwKICAgICAgIG1fYlpzbE1vZGUoZmFsc2UpLAogICAgICAgbV9iWnNsTW9kZV9uZXcoZmFsc2UpLApAQCAtOTMwLDYgKzkzMSw3IEBACiAgICAgICBtX2JTbmFwc2hvdEZsaXBDaGFuZ2VkKGZhbHNlKSwKICAgICAgIG1fYkZpeGVkRnJhbWVSYXRlU2V0KGZhbHNlKSwKICAgICAgIG1fYkhEUkVuYWJsZWQoZmFsc2UpLAorICAgICAgbV9iTG9jYWxIRFJFbmFibGVkKGZhbHNlKSwKICAgICAgIG1fYkFWVGltZXJFbmFibGVkKGZhbHNlKSwKICAgICAgIG1fYkRJU0VuYWJsZWQoZmFsc2UpLAogICAgICAgbV9Nb2JpTWFzaygwKSwKQEAgLTEwMzMsNiArMTAzNSw3IEBACiAgICAgbV9wUGFyYW1CdWYoTlVMTCksCiAgICAgbV9wUmVsQ2FtU3luY0hlYXAoTlVMTCksCiAgICAgbV9wUmVsQ2FtU3luY0J1ZihOVUxMKSwKKyAgICBtX2JGcmFtZVN5bmNFbmFibGVkKGZhbHNlKSwKICAgICBtX2Jac2xNb2RlKGZhbHNlKSwKICAgICBtX2Jac2xNb2RlX25ldyhmYWxzZSksCiAgICAgbV9iRm9yY2Vac2xNb2RlKGZhbHNlKSwKQEAgLTEwNjAsNiArMTA2Myw3IEBACiAgICAgbV9iU25hcHNob3RGbGlwQ2hhbmdlZChmYWxzZSksCiAgICAgbV9iRml4ZWRGcmFtZVJhdGVTZXQoZmFsc2UpLAogICAgIG1fYkhEUkVuYWJsZWQoZmFsc2UpLAorICAgIG1fYkxvY2FsSERSRW5hYmxlZChmYWxzZSksCiAgICAgbV9iQVZUaW1lckVuYWJsZWQoZmFsc2UpLAogICAgIG1fQWRqdXN0RlBTKE5VTEwpLAogICAgIG1fYkhEUjF4RnJhbWVFbmFibGVkKGZhbHNlKSwKQEAgLTEzMjUsMTIgKzEzMjksMTIgQEAKIAogICAgIGlmIChsZW4gPiAwKSB7CiAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlZHglZCIsCi0gICAgICAgICAgICAgICAgIHZhbHVlc1swXS5kaW0ud2lkdGgsIHZhbHVlc1swXS5kaW0uaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgdmFsdWVzWzBdLmRpbVswXS53aWR0aCwgdmFsdWVzWzBdLmRpbVswXS5oZWlnaHQpOwogICAgICAgICBzdHIuYXBwZW5kKGJ1ZmZlcik7CiAgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiwlZHglZCIsCi0gICAgICAgICAgICAgICAgIHZhbHVlc1tpXS5kaW0ud2lkdGgsIHZhbHVlc1tpXS5kaW0uaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgdmFsdWVzW2ldLmRpbVswXS53aWR0aCwgdmFsdWVzW2ldLmRpbVswXS5oZWlnaHQpOwogICAgICAgICBzdHIuYXBwZW5kKGJ1ZmZlcik7CiAgICAgfQogICAgIHJldHVybiBzdHI7CkBAIC0zNTY2LDYgKzM1NzAsMTcgQEAKICAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfU0NFTkVfTU9ERSk7CiAgICAgTE9HSCgic3RyIC0gJXMsIHByZXZfc3RyIC0gJXMiLCBzdHIsIHByZXZfc3RyKTsKIAorICAgIC8vIEhEUiAmIFJlY29yZGluZyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGFuZCBzbyBkaXNhYmxlIEhEUiBpZiByZWNvcmRpbmcgaGludCBpcyBzZXQKKyAgICBpZiAobV9iUmVjb3JkaW5nSGludF9uZXcgJiYgbV9iSERSRW5hYmxlZCkgeworICAgICAgICBMT0dIKCJEaXNhYmxlIHRoZSBIRFIgYW5kIHNldCBpdCB0byBBdXRvIik7CisgICAgICAgIHN0ciA9IFNDRU5FX01PREVfQVVUTzsKKyAgICAgICAgbV9iTG9jYWxIRFJFbmFibGVkID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFtX2JSZWNvcmRpbmdIaW50X25ldyAmJiBtX2JMb2NhbEhEUkVuYWJsZWQpIHsKKyAgICAgICAgTE9HSCgiUmVzdG9yZSB0aGUgSERSIGZyb20gQXV0byBzY2VuZSBtb2RlIik7CisgICAgICAgIHN0ciA9IFNDRU5FX01PREVfSERSOworICAgICAgICBtX2JMb2NhbEhEUkVuYWJsZWQgPSBmYWxzZTsKKyAgICB9CisKICAgICBpZiAoc3RyICE9IE5VTEwpIHsKICAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKICAgICAgICAgICAgIHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSB7CkBAIC00NzQwLDcgKzQ3NTUsNyBAQAogICAgICAgICBtZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKICAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS56c2wuYmFja2xvb2tjbnQiLCBwcm9wLCAiMiIpOwogICAgICAgICB1aW50MzJfdCBsb29rX2JhY2tfY250ID0gYXRvaShwcm9wKTsKLSAgICAgICAgaWYgKG1fcmVsQ2FtU3luY0luZm8uaXNfZnJhbWVfc3luY19lbmFibGVkKSB7CisgICAgICAgIGlmIChtX2JGcmFtZVN5bmNFbmFibGVkKSB7CiAgICAgICAgICAgICBsb29rX2JhY2tfY250ICs9IEVYVFJBX0ZSQU1FX1NZTkNfQlVGRkVSUzsKICAgICAgICAgfQogICAgICAgICBzZXQoS0VZX1FDX1pTTF9CVVJTVF9MT09LQkFDSywgbG9va19iYWNrX2NudCk7CkBAIC00NzU0LDcgKzQ3NjksNyBAQAogICAgICAgICBtZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKICAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS56c2wucXVldWVkZXB0aCIsIHByb3AsICIyIik7CiAgICAgICAgIHVpbnQzMl90IHF1ZXVlX2RlcHRoID0gYXRvaShwcm9wKTsKLSAgICAgICAgaWYgKG1fcmVsQ2FtU3luY0luZm8uaXNfZnJhbWVfc3luY19lbmFibGVkKSB7CisgICAgICAgIGlmIChtX2JGcmFtZVN5bmNFbmFibGVkKSB7CiAgICAgICAgICAgICBxdWV1ZV9kZXB0aCArPSBFWFRSQV9GUkFNRV9TWU5DX0JVRkZFUlM7CiAgICAgICAgIH0KICAgICAgICAgc2V0KEtFWV9RQ19aU0xfUVVFVUVfREVQVEgsIHF1ZXVlX2RlcHRoKTsKQEAgLTQ5MDgsMTMgKzQ5MjMsMTMgQEAKICAgICBpZiAoc3RyICE9IE5VTEwpIHsKICAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKICAgICAgICAgICAgIHNldChLRVlfUUNfTE9OR19TSE9ULCBzdHIpOwotICAgICAgICAgICAgaWYgKCFzdHJjbXAoc3RyLCAib2ZmIikpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9iTG9uZ3Nob3RFbmFibGVkID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgcmVzdGFydCBoZXJlLCB0byByZXNldCB0aGUgRlBTIGFuZCBubwotICAgICAgICAgICAgICAgICAgICAvLyBvZiBidWZmZXJzIGFzIHBlciB0aGUgcmVxdWlyZW1lbnQgb2Ygc2luZ2xlIHNuYXBzaG90IHVzZWNhc2UuCi0gICAgICAgICAgICAgICAgICAgIG1fYk5lZWRSZXN0YXJ0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbV9iTG9uZ3Nob3RFbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAocHJldl9zdHIgJiYgIXN0cmNtcChzdHIsICJvZmYiKSAmJiAhc3RyY21wKHByZXZfc3RyLCAib24iKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIHJlc3RhcnQgaGVyZSwgdG8gcmVzZXQgdGhlIEZQUyBhbmQgbm8KKyAgICAgICAgICAgICAgICAvLyBvZiBidWZmZXJzIGFzIHBlciB0aGUgcmVxdWlyZW1lbnQgb2Ygc2luZ2xlIHNuYXBzaG90IHVzZWNhc2UuCisgICAgICAgICAgICAgICAgLy8gSGVyZSByZXN0YXJ0IGhhcHBlbnMgd2hlbiBjb250aW51b3VzIHNob3QgaXMgY2hhbmdlZCB0byBvZmYgZnJvbSBvbi4KKyAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIGNvbnRpbnVvdXMgc2hvdCBvbiwgcmVzdGFydCBpcyB0YWtlbiBjYXJlIHdoZW4gYWN0dWFsCisgICAgICAgICAgICAgICAgLy8gbG9uZ3Nob3QgY29tbWFuZCBpcyB0cmlnZ2VyZWQgdGhyb3VnaCBzZW5kQ29tbWFuZC4KKyAgICAgICAgICAgICAgICBtX2JOZWVkUmVzdGFydCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01MTg1LDggKzUyMDAsNiBAQAogICAgICAgICBtX3BDYXBhYmlsaXR5LT5hdXRvX2V4cG9zdXJlX2xvY2tfc3VwcG9ydGVkPyBWQUxVRV9UUlVFIDogVkFMVUVfRkFMU0UpOwogICAgIHNldChLRVlfQVVUT19XSElURUJBTEFOQ0VfTE9DS19TVVBQT1JURUQsCiAgICAgICAgIG1fcENhcGFiaWxpdHktPmF1dG9fd2JfbG9ja19zdXBwb3J0ZWQ/IFZBTFVFX1RSVUUgOiBWQUxVRV9GQUxTRSk7Ci0gICAgc2V0KEtFWV9RQ19TVVBQT1JURURfQ0FNRVJBX0ZFQVRVUkVTLAotICAgICAgICAgICAgKGludCltX3BDYXBhYmlsaXR5LT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2spOwogICAgIHNldChLRVlfTUFYX05VTV9ERVRFQ1RFRF9GQUNFU19IVywgbV9wQ2FwYWJpbGl0eS0+bWF4X251bV9yb2kpOwogICAgIHNldChLRVlfTUFYX05VTV9ERVRFQ1RFRF9GQUNFU19TVywgbV9wQ2FwYWJpbGl0eS0+bWF4X251bV9yb2kpOwogICAgIHNldChLRVlfUUNfTUFYX05VTV9SRVFVRVNURURfRkFDRVMsIG1fcENhcGFiaWxpdHktPm1heF9udW1fcm9pKTsKQEAgLTU0MTksNyArNTQzMiw3IEBACiAgICAgbV9wQ2FwYWJpbGl0eS0+bWluX2ZvY3VzX3Bvc1tDQU1fTUFOVUFMX0ZPQ1VTX01PREVfRElPUFRFUl0gPSAwOwogICAgIGlmIChtX3BDYXBhYmlsaXR5LT5taW5fZm9jdXNfZGlzdGFuY2UgPiAwKSB7CiAgICAgICAgIG1fcENhcGFiaWxpdHktPm1heF9mb2N1c19wb3NbQ0FNX01BTlVBTF9GT0NVU19NT0RFX0RJT1BURVJdID0KLSAgICAgICAgICAgICAgICAxMDAuMGYgLyBtX3BDYXBhYmlsaXR5LT5taW5fZm9jdXNfZGlzdGFuY2U7CisgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+bWluX2ZvY3VzX2Rpc3RhbmNlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1fcENhcGFiaWxpdHktPm1heF9mb2N1c19wb3NbQ0FNX01BTlVBTF9GT0NVU19NT0RFX0RJT1BURVJdID0gMDsKICAgICB9CkBAIC01OTk2LDcgKzYwMDksNyBAQAogICAgIH0KIAogICAgIHNldE9mZmxpbmVSQVcoKTsKLSAgICBtZW1zZXQobVN0cmVhbVBwTWFzaywgMCwgc2l6ZW9mKHVpbnQzMl90KSpDQU1fU1RSRUFNX1RZUEVfTUFYKTsKKyAgICBtZW1zZXQobVN0cmVhbVBwTWFzaywgMCwgc2l6ZW9mKGNhbV9mZWF0dXJlX21hc2tfdCkqQ0FNX1NUUkVBTV9UWVBFX01BWCk7CiAgICAgLy9TZXQgdmlkZW8gYnVmZmVycyBhcyB1bmNhY2hlZCBieSBkZWZhdWx0CiAgICAgc2V0KEtFWV9RQ19DQUNIRV9WSURFT19CVUZGRVJTLCBWQUxVRV9ESVNBQkxFKTsKIApAQCAtNjEyOCw3ICs2MTQxLDggQEAKICAgICByYyA9IFFDYW1lcmFCdWZmZXJNYXBzOjptYWtlU2luZ2xldG9uQnVmTWFwTGlzdCgKICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1BBUk1fQlVGLCAwIC8qc3RyZWFtIGlkKi8sCiAgICAgICAgICAgICAwIC8qYnVmZmVyIGluZGV4Ki8sIC0xIC8qcGxhbmUgaW5kZXgqLywgMCAvKmNvb2tpZSovLAotICAgICAgICAgICAgbV9wUGFyYW1IZWFwLT5nZXRGZCgwKSwgc2l6ZW9mKHBhcm1fYnVmZmVyX3QpLCBidWZNYXBMaXN0KTsKKyAgICAgICAgICAgIG1fcFBhcmFtSGVhcC0+Z2V0RmQoMCksIHNpemVvZihwYXJtX2J1ZmZlcl90KSwgYnVmTWFwTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgbV9wUGFyYW1IZWFwLT5nZXRQdHIoMCkpOwogCiAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CiAgICAgICAgIHJjID0gbV9wQ2FtT3BzVGJsLT5vcHMtPm1hcF9idWZzKG1fcENhbU9wc1RibC0+Y2FtZXJhX2hhbmRsZSwKQEAgLTYxNjAsNyArNjE3NCw4IEBACiAgICAgICAgIHJjID0gbV9wQ2FtT3BzVGJsLT5vcHMtPm1hcF9idWYobV9wQ2FtT3BzVGJsLT5jYW1lcmFfaGFuZGxlLAogICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NZTkNfUkVMQVRFRF9TRU5TT1JTX0JVRiwKICAgICAgICAgICAgICAgICBtX3BSZWxDYW1TeW5jSGVhcC0+Z2V0RmQoMCksCi0gICAgICAgICAgICAgICAgc2l6ZW9mKGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QpKTsKKyAgICAgICAgICAgICAgICBzaXplb2YoY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCksCisgICAgICAgICAgICAgICAgKGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QqKURBVEFfUFRSKG1fcFJlbENhbVN5bmNIZWFwLDApKTsKICAgICAgICAgaWYocmMgPCAwKSB7CiAgICAgICAgICAgICBMT0dFKCJmYWlsZWQgdG8gbWFwIFJlbGF0ZWQgY2FtIHN5bmMgYnVmZmVyIik7CiAgICAgICAgICAgICByYyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKQEAgLTYxNjksOSArNjE4NCw4IEBACiAgICAgICAgIG1fcFJlbENhbVN5bmNCdWYgPQogICAgICAgICAgICAgICAgIChjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KikgREFUQV9QVFIobV9wUmVsQ2FtU3luY0hlYXAsMCk7CiAgICAgfQotCiAgICAgaW5pdERlZmF1bHRQYXJhbWV0ZXJzKCk7Ci0KKyAgICBtQ29tbW9uLmluaXQoY2FwYWJpbGl0aWVzKTsKICAgICBtX2JJbml0ZWQgPSB0cnVlOwogCiAgICAgZ290byBUUkFOU19JTklUX0RPTkU7CkBAIC02NDAxLDcgKzY0MTUsMTAgQEAKICAgICAgICAgICAgICAgICAgbWluX2ZwcywgbWF4X2ZwcywgdmlkX21pbl9mcHMsIHZpZF9tYXhfZnBzKTsKIAogICAgIGlmKGZpeGVkRnBzVmFsdWUgIT0gMCkgewotICAgICAgbWluX2ZwcyA9IG1heF9mcHMgPSB2aWRfbWluX2ZwcyA9IHZpZF9tYXhfZnBzID0gKGludClmaXhlZEZwc1ZhbHVlKjEwMDA7CisgICAgICAgIG1pbl9mcHMgPSBtYXhfZnBzID0gZml4ZWRGcHNWYWx1ZSoxMDAwOworICAgICAgICBpZiAoIWlzSGZyTW9kZSgpKSB7CisgICAgICAgICAgICAgdmlkX21pbl9mcHMgPSB2aWRfbWF4X2ZwcyA9IGZpeGVkRnBzVmFsdWUqMTAwMDsKKyAgICAgICAgfQogICAgIH0KICAgICBzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiJWQsJWQiLCBtaW5fZnBzLCBtYXhfZnBzKTsKICAgICBMT0dIKCJTZXR0aW5nIHByZXZpZXcgZnBzIHJhbmdlICVzIiwgc3RyKTsKQEAgLTcyMDEsNyArNzIxOCw3IEBACiAgICAgICAgIHJldHVybiByYzsKICAgICB9CiAKLSAgICBpZiAoZW5hYmxlID09IHRydWUpIG1fYkxvbmdzaG90RW5hYmxlZCA9IGVuYWJsZTsKKyAgICBtX2JMb25nc2hvdEVuYWJsZWQgPSBlbmFibGU7CiAKICAgICByZXR1cm4gcmM7CiB9CkBAIC05OTM1LDEzICs5OTUyLDI4IEBACiAgICAgICAgIGZvcm1hdCA9IG1BcHBQcmV2aWV3Rm9ybWF0OwogICAgICAgICBicmVhazsKICAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUzoKLSAgICAgICAgaWYgKG1fcENhcGFiaWxpdHktPmh3X2FuYWx5c2lzX3N1cHBvcnRlZCAmJgotICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPmFuYWx5c2lzX3JlY29tbWVuZGVkX2Zvcm1hdCA9PSBDQU1fRk9STUFUX1lfT05MWSkgewotICAgICAgICAgICAgZm9ybWF0ID0gbV9wQ2FwYWJpbGl0eS0+YW5hbHlzaXNfcmVjb21tZW5kZWRfZm9ybWF0OworICAgICAgICBjYW1fYW5hbHlzaXNfaW5mb190IGFuYWx5c2lzSW5mbzsKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IGZlYXR1cmVNYXNrOworCisgICAgICAgIGZlYXR1cmVNYXNrID0gMDsKKyAgICAgICAgZ2V0U3RyZWFtUHBNYXNrKENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUywgZmVhdHVyZU1hc2spOworICAgICAgICByZXQgPSBnZXRBbmFseXNpc0luZm8oCisgICAgICAgICAgICAgICAgKChnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSA9PSB0cnVlKSAmJiBmZE1vZGVJblZpZGVvKCkpLAorICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgIGZlYXR1cmVNYXNrLAorICAgICAgICAgICAgICAgICZhbmFseXNpc0luZm8pOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJnZXRBbmFseXNpc0luZm8gZmFpbGVkLCByZXQgPSAlZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFuYWx5c2lzSW5mby5od19hbmFseXNpc19zdXBwb3J0ZWQgJiYKKyAgICAgICAgICAgICAgICBhbmFseXNpc0luZm8uYW5hbHlzaXNfZm9ybWF0ID09IENBTV9GT1JNQVRfWV9PTkxZKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBhbmFseXNpc0luZm8uYW5hbHlzaXNfZm9ybWF0OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fcENhcGFiaWxpdHktPmh3X2FuYWx5c2lzX3N1cHBvcnRlZCkgewotICAgICAgICAgICAgICAgIExPR1coIkludmFsaWQgYW5hbHlzaXNfcmVjb21tZW5kZWRfZm9ybWF0ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+YW5hbHlzaXNfcmVjb21tZW5kZWRfZm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChhbmFseXNpc0luZm8uaHdfYW5hbHlzaXNfc3VwcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgTE9HVygiSW52YWxpZCBhbmFseXNpc19mb3JtYXQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhbmFseXNpc0luZm8uYW5hbHlzaXNfZm9ybWF0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvcm1hdCA9IG1BcHBQcmV2aWV3Rm9ybWF0OwogICAgICAgICB9CkBAIC0xMDEzOCwxNiArMTAxNzAsMjQgQEAKICAgICAgICAgLyogQW5hbHlzaXMgc3RyZWFtIG5lZWQgYXNwZWN0IHJhdGlvIGFzIHByZXZpZXcgc3RyZWFtICovCiAgICAgICAgIGdldFByZXZpZXdTaXplKCZwcnZfZGltLndpZHRoLCAmcHJ2X2RpbS5oZWlnaHQpOwogCi0gICAgICAgIG1heF9kaW0ud2lkdGggPSBtX3BDYXBhYmlsaXR5LT5hbmFseXNpc19tYXhfcmVzLndpZHRoOwotICAgICAgICBtYXhfZGltLmhlaWdodCA9IG1fcENhcGFiaWxpdHktPmFuYWx5c2lzX21heF9yZXMuaGVpZ2h0OworICAgICAgICBjYW1fYW5hbHlzaXNfaW5mb190IGFuYWx5c2lzSW5mbzsKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IGZlYXR1cmVNYXNrOwogCi0gICAgICAgIGlmICgoZ2V0UmVjb3JkaW5nSGludFZhbHVlKCkgPT0gdHJ1ZSkKLSAgICAgICAgICAgICAgICAmJiBmZE1vZGVJblZpZGVvKCkKLSAgICAgICAgICAgICAgICAmJiBtX3BDYXBhYmlsaXR5LT5od19hbmFseXNpc19zdXBwb3J0ZWQpIHsKLSAgICAgICAgICAgIG1heF9kaW0ud2lkdGggLz0gMjsKLSAgICAgICAgICAgIG1heF9kaW0uaGVpZ2h0IC89IDI7CisgICAgICAgIGZlYXR1cmVNYXNrID0gMDsKKyAgICAgICAgZ2V0U3RyZWFtUHBNYXNrKENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUywgZmVhdHVyZU1hc2spOworICAgICAgICByZXQgPSBnZXRBbmFseXNpc0luZm8oCisgICAgICAgICAgICAgICAgKChnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSA9PSB0cnVlKSAmJiBmZE1vZGVJblZpZGVvKCkpLAorICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgIGZlYXR1cmVNYXNrLAorICAgICAgICAgICAgICAgICZhbmFseXNpc0luZm8pOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJnZXRBbmFseXNpc0luZm8gZmFpbGVkLCByZXQgPSAlZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAKKyAgICAgICAgbWF4X2RpbS53aWR0aCA9IGFuYWx5c2lzSW5mby5hbmFseXNpc19tYXhfcmVzLndpZHRoOworICAgICAgICBtYXhfZGltLmhlaWdodCA9IGFuYWx5c2lzSW5mby5hbmFseXNpc19tYXhfcmVzLmhlaWdodDsKKwogICAgICAgICBpZiAocHJ2X2RpbS53aWR0aCA+IG1heF9kaW0ud2lkdGggfHwgcHJ2X2RpbS5oZWlnaHQgPiBtYXhfZGltLmhlaWdodCkgewogICAgICAgICAgICAgZG91YmxlIG1heF9yYXRpbywgcmVxdWVzdGVkX3JhdGlvOwogCkBAIC0xMTc4OSw2ICsxMTgyOSwzOCBAQAogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEZyYW1lU3luY0VuYWJsZWQKKyAqCisgKiBERVNDUklQVElPTjogc2V0cyB3aGV0aGVyIGZyYW1lIHN5bmMgaXMgZW5hYmxlZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZW5hYmxlICA6IGZsYWcgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBmcmFtZSBzeW5jCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0RnJhbWVTeW5jRW5hYmxlZChib29sIGVuYWJsZSkKK3sKKyAgICBtX2JGcmFtZVN5bmNFbmFibGVkID0gZW5hYmxlOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc0ZyYW1lU3luY0VuYWJsZWQKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJucyB3aGV0aGVyIGZyYW1lIHN5bmMgaXMgZW5hYmxlZAorICoKKyAqIFBBUkFNRVRFUlMgOm5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogYm9vbCBpbmRpY2F0aW5nIHdoZXRoZXIgZnJhbWUgc3luYyBpcyBlbmFibGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnM6OmlzRnJhbWVTeW5jRW5hYmxlZCh2b2lkKQoreworICAgIHJldHVybiBtX2JGcmFtZVN5bmNFbmFibGVkOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogRlVOQ1RJT04gICA6IGJ1bmRsZVJlbGF0ZWRDYW1lcmFzCiAgKgogICogREVTQ1JJUFRJT046IHNlbmQgdHJpZ2dlciBmb3IgYnVuZGxpbmcgcmVsYXRlZCBjYW1lcmEgc2Vzc2lvbnMgaW4gdGhlIHNlcnZlcgpAQCAtMTE5MDQsNyArMTE5NzYsNiBAQAogaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6aW5pdEJhdGNoVXBkYXRlKHBhcm1fYnVmZmVyX3QgKnBfdGFibGUpCiB7CiAgICAgbV90ZW1wTWFwLmNsZWFyKCk7Ci0KICAgICBjbGVhcl9tZXRhZGF0YV9idWZmZXIocF90YWJsZSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMTI2NDAsMTIgKzEyNzExLDkgQEAKICAgICBtZW1zZXQoJnN0cmVhbV9jb25maWdfaW5mbywgMCwgc2l6ZW9mKHN0cmVhbV9jb25maWdfaW5mbykpOwogICAgIHN0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtcyA9IDA7CiAKLSAgICBpZiAobV9iU3RyZWFtc0NvbmZpZ3VyZWQpIHsKKyAgICBpZiAocmVzZXRDb25maWcpIHsKICAgICAgICAgTE9HSCgiUmVzZXQgc3RyZWFtIGNvbmZpZyEhIik7CiAgICAgICAgIHJjID0gc2VuZFN0cmVhbUNvbmZpZ0luZm8oc3RyZWFtX2NvbmZpZ19pbmZvKTsKLSAgICAgICAgbV9iU3RyZWFtc0NvbmZpZ3VyZWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHJlc2V0Q29uZmlnKSB7CiAgICAgICAgIExPR0goIkRvbmUgUmVzZXR0aW5nIHN0cmVhbSBjb25maWchISIpOwogICAgICAgICByZXR1cm4gcmM7CiAgICAgfQpAQCAtMTI2NTUsMTIgKzEyNzIzLDYgQEAKICAgICBzdHJlYW1fY29uZmlnX2luZm8ubWluX3N0cmlkZSAgICAgPSBtX3BDYXBhYmlsaXR5LT5taW5fc3RyaWRlOwogICAgIHN0cmVhbV9jb25maWdfaW5mby5taW5fc2NhbmxpbmUgICA9IG1fcENhcGFiaWxpdHktPm1pbl9zY2FubGluZTsKICAgICBzdHJlYW1fY29uZmlnX2luZm8uYmF0Y2hfc2l6ZSA9IGdldEJ1ZkJhdGNoQ291bnQoKTsKLSAgICBMT0dIKCJidWZfYWxpZ25tZW50PSVkIHN0cmlkZSBYIHNjYW49JWR4JWQgYmF0Y2ggc2l6ZSA9ICVkXG4iLAotICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+YnVmX2FsaWdubWVudCwKLSAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPm1pbl9zdHJpZGUsCi0gICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5taW5fc2NhbmxpbmUsCi0gICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uYmF0Y2hfc2l6ZSk7Ci0KIAogICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEucmF3X3l1diIsIHZhbHVlLCAiMCIpOwogICAgIHJhd195dXYgPSBhdG9pKHZhbHVlKSA+IDAgPyB0cnVlIDogZmFsc2U7CkBAIC0xMjg3Myw3ICsxMjkzNSw3IEBACiAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtcysrOwogICAgIH0KICAgICBmb3IgKHVpbnQzMl90IGsgPSAwOyBrIDwgc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zOyBrKyspIHsKLSAgICAgICAgTE9HSSgiU1RSRUFNIElORk8gOiB0eXBlICVkLCB3eGg6ICVkIHggJWQsIHBwX21hc2s6IDB4JXggRm9ybWF0ID0gJWQiLAorICAgICAgICBMT0dJKCJTVFJFQU0gSU5GTyA6IHR5cGUgJWQsIHd4aDogJWQgeCAlZCwgcHBfbWFzazogMHglbGx4IEZvcm1hdCA9ICVkIiwKICAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8udHlwZVtrXSwKICAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uc3RyZWFtX3NpemVzW2tdLndpZHRoLAogICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5zdHJlYW1fc2l6ZXNba10uaGVpZ2h0LApAQCAtMTI4ODIsOCArMTI5NDQsNiBAQAogICAgIH0KIAogICAgIHJjID0gc2VuZFN0cmVhbUNvbmZpZ0luZm8oc3RyZWFtX2NvbmZpZ19pbmZvKTsKLSAgICBtX2JTdHJlYW1zQ29uZmlndXJlZCA9IHRydWU7Ci0KICAgICByZXR1cm4gcmM7CiB9CiAKQEAgLTEyOTY0LDcgKzEzMDI0LDcgQEAKICAqIFJFVFVSTiAgICAgOiB0cnVlOiBuZWVkZWQKICAqICAgICAgICAgICAgICBmYWxzZTogbm8gbmVlZAogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1ib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjpuZWVkVGh1bWJuYWlsUmVwcm9jZXNzKHVpbnQzMl90ICpwRmVhdHVyZU1hc2spCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjpuZWVkVGh1bWJuYWlsUmVwcm9jZXNzKGNhbV9mZWF0dXJlX21hc2tfdCAqcEZlYXR1cmVNYXNrKQogewogICAgIGlmIChpc1ViaUZvY3VzRW5hYmxlZCgpIHx8IGlzQ2hyb21hRmxhc2hFbmFibGVkKCkgfHwKICAgICAgICAgICAgIGlzT3B0aVpvb21FbmFibGVkKCkgfHwgaXNVYmlSZWZvY3VzKCkgfHwKQEAgLTEzMjczLDcgKzEzMzMzLDcgQEAKICAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6dXBkYXRlUHBGZWF0dXJlTWFzayhjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSkgewogCi0gICAgdWludDMyX3QgZmVhdHVyZV9tYXNrID0gMDsKKyAgICBjYW1fZmVhdHVyZV9tYXNrX3QgZmVhdHVyZV9tYXNrID0gMDsKIAogICAgIGlmIChzdHJlYW1fdHlwZSA+PSBDQU1fU1RSRUFNX1RZUEVfTUFYKSB7CiAgICAgICAgIExPR0UoIkVycm9yISEgc3RyZWFtIHR5cGU6ICVkIG5vdCB2YWxpZCIsIHN0cmVhbV90eXBlKTsKQEAgLTEzMzc4LDkgKzEzNDM4LDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBQcmV2aWV3IGFzc2lzdGVkIGF1dG9mb2N1cyBuZWVkcyB0byBiZSBzdXBwb3J0ZWQgZm9yCisgICAgLy8gY2FsbGJhY2ssIHByZXZpZXcsIG9yIHZpZGVvIHN0cmVhbXMKKyAgICBzd2l0Y2ggKHN0cmVhbV90eXBlKSB7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfQ0FMTEJBQ0s6CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzoKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9WSURFTzoKKyAgICAgICAgZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfUEFBRjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCiAgICAgLy8gU3RvcmUgc3RyZWFtIGZlYXR1cmUgbWFzawogICAgIHNldFN0cmVhbVBwTWFzayhzdHJlYW1fdHlwZSwgZmVhdHVyZV9tYXNrKTsKLSAgICBMT0dIKCJzdHJlYW0gdHlwZTogJWQsIHBwX21hc2s6IDB4JXgiLCBzdHJlYW1fdHlwZSwgZmVhdHVyZV9tYXNrKTsKKyAgICBMT0dIKCJzdHJlYW0gdHlwZTogJWQsIHBwX21hc2s6IDB4JWxseCIsIHN0cmVhbV90eXBlLCBmZWF0dXJlX21hc2spOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMTMzOTgsNyArMTM0NzAsNyBAQAogICogICAgICAgICAgICAgIGludDMyX3QgdHlwZSBvZiBzdGF0dXMKICAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0U3RyZWFtUHBNYXNrKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlLAotICAgICAgICB1aW50MzJfdCBwcF9tYXNrKSB7CisgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwcF9tYXNrKSB7CiAKICAgICBpZihzdHJlYW1fdHlwZSA+PSBDQU1fU1RSRUFNX1RZUEVfTUFYKSB7CiAgICAgICAgIHJldHVybiBCQURfVFlQRTsKQEAgLTEzNDIxLDcgKzEzNDkzLDcgQEAKICAqICAgICAgICAgICAgICBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCiAgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIGludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldFN0cmVhbVBwTWFzayhjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwKLSAgICAgICAgdWludDMyX3QgJnBwX21hc2spIHsKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190ICZwcF9tYXNrKSB7CiAKICAgICBpZihzdHJlYW1fdHlwZSA+PSBDQU1fU1RSRUFNX1RZUEVfTUFYKSB7CiAgICAgICAgIHJldHVybiBCQURfVFlQRTsKQEAgLTE0MDI2LDcgKzE0MDk4LDEwIEBACiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIHVpbnQ4X3QgZmR2aWRlbyA9IDA7CiAKLSAgICBpZiAoIW1fcENhcGFiaWxpdHktPmh3X2FuYWx5c2lzX3N1cHBvcnRlZCkgeworICAgIGNhbV9hbmFseXNpc19pbmZvX3QgKnBBbmFseXNpc0luZm8gPQorICAgICAgICAgICAgJm1fcENhcGFiaWxpdHktPmFuYWx5c2lzX2luZm9bQ0FNX0FOQUxZU0lTX0lORk9fRkRfVklERU9dOworCisgICAgaWYgKCFwQW5hbHlzaXNJbmZvLT5od19hbmFseXNpc19zdXBwb3J0ZWQpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0xNDIzNyw0ICsxNDMxMiwyOSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRBbmFseXNpc0luZm8KKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSBBbmFseXNpcyBpbmZvcm1hdGlvbiBiYXNlZCBvbgorICogICAgIGN1cnJlbnQgbW9kZSBhbmQgZmVhdHVyZSBtYXNrCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmZFZpZGVvRW5hYmxlZCA6IFdoZXRoZXIgZmRWaWRlbyBlbmFibGVkIGN1cnJlbnRseQorICogICBAdmlkZW9FbmFibGVkICAgOiBXaGV0aGVyIGhhbDMgb3IgaGFsMQorICogICBAZmVhdHVyZU1hc2sgICAgOiBGZWF0dXJlIG1hc2sKKyAqICAgQGFuYWx5c2lzX2luZm8gIDogQW5hbHlzaXMgaW5mbyB0byBiZSBmaWxsZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpnZXRBbmFseXNpc0luZm8oCisgICAgICAgIGJvb2wgZmRWaWRlb0VuYWJsZWQsCisgICAgICAgIGJvb2wgaGFsMywKKyAgICAgICAgdWludDMyX3QgZmVhdHVyZU1hc2ssCisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3QgKnBBbmFseXNpc0luZm8pCit7CisgICAgcmV0dXJuIG1Db21tb24uZ2V0QW5hbHlzaXNJbmZvKGZkVmlkZW9FbmFibGVkLCBoYWwzLCBmZWF0dXJlTWFzaywgcEFuYWx5c2lzSW5mbyk7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBxY2FtZXJhCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBhcmFtZXRlcnMuaCBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhUGFyYW1ldGVycy5oCmluZGV4IDkzMWIyNmQuLjE0MTg3OTYgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL0hBTC9RQ2FtZXJhUGFyYW1ldGVycy5oCisrKyBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhUGFyYW1ldGVycy5oCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiUUNhbWVyYU1lbS5oIgogI2luY2x1ZGUgIlFDYW1lcmFQYXJhbWV0ZXJzSW50Zi5oIgogI2luY2x1ZGUgIlFDYW1lcmFUaGVybWFsQWRhcHRlci5oIgorI2luY2x1ZGUgIlFDYW1lcmFDb21tb24uaCIKIAogZXh0ZXJuICJDIiB7CiAjaW5jbHVkZSAibW1fanBlZ19pbnRlcmZhY2UuaCIKQEAgLTI1OSwxMCArMjYwLDYgQEAKICAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfRkFDRV9SRUNPR05JVElPTltdOwogICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TVVBQT1JURURfRkFDRV9SRUNPR05JVElPTltdOwogCi0gICAgLy8gc3VwcG9ydGVkIGNhbWVyYSBmZWF0dXJlcyB0byBiZSBxdWVyaWVkIGJ5IFNuYXBkcmFnb24gU0RLCi0gICAgLy9SZWFkIG9ubHkKLSAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX0NBTUVSQV9GRUFUVVJFU1tdOwotCiAgICAgLy9JbmRpY2F0ZXMgbnVtYmVyIG9mIGZhY2VzIHJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24uCiAgICAgLy9UaGlzIHZhbHVlIHdpbGwgYmUgcmVqZWN0ZWQgaWYgdGhlIHJlcXVlc3RlZCBmYWNlcwogICAgIC8vZ3JlYXRlciB0aGFuIHN1cHBvcnRlZCBieSBoYXJkd2FyZS4KQEAgLTc0NCwxNCArNzQxLDE0IEBACiAKICAgICBjb25zdCBjaGFyICpnZXRBU0RTdGF0ZVN0cmluZyhjYW1fYXV0b19zY2VuZV90IHNjZW5lKTsKICAgICBib29sIGlzSERSVGh1bWJuYWlsUHJvY2Vzc05lZWRlZCgpIHsgcmV0dXJuIG1fYkhEUlRodW1ibmFpbFByb2Nlc3NOZWVkZWQ7IH07Ci0gICAgdm9pZCBzZXRNaW5QcE1hc2sodWludDMyX3QgbWluX3BwX21hc2spIHsgbV9uTWluUmVxdWlyZWRQcE1hc2sgPSBtaW5fcHBfbWFzazsgfTsKKyAgICB2b2lkIHNldE1pblBwTWFzayhjYW1fZmVhdHVyZV9tYXNrX3QgbWluX3BwX21hc2spIHsgbV9uTWluUmVxdWlyZWRQcE1hc2sgPSBtaW5fcHBfbWFzazsgfTsKICAgICBib29sIHNldFN0cmVhbUNvbmZpZ3VyZShib29sIGlzQ2FwdHVyZSwgYm9vbCBwcmV2aWV3QXNQb3N0dmlldywgYm9vbCByZXNldENvbmZpZyk7CiAgICAgaW50MzJfdCBhZGRPbmxpbmVSb3RhdGlvbih1aW50MzJfdCByb3RhdGlvbiwgdWludDMyX3Qgc3RyZWFtSWQsIGludDMyX3QgZGV2aWNlX3JvdGF0aW9uKTsKICAgICB1aW50OF90IGdldE51bU9mRXh0cmFCdWZmZXJzRm9ySW1hZ2VQcm9jKCk7CiAgICAgdWludDhfdCBnZXROdW1PZkV4dHJhQnVmZmVyc0ZvclZpZGVvKCk7CiAgICAgdWludDhfdCBnZXROdW1PZkV4dHJhQnVmZmVyc0ZvclByZXZpZXcoKTsKICAgICB1aW50MzJfdCBnZXRFeGlmQnVmSW5kZXgodWludDMyX3QgY2FwdHVyZUluZGV4KTsKLSAgICBib29sIG5lZWRUaHVtYm5haWxSZXByb2Nlc3ModWludDMyX3QgKnBGZWF0dXJlTWFzayk7CisgICAgYm9vbCBuZWVkVGh1bWJuYWlsUmVwcm9jZXNzKGNhbV9mZWF0dXJlX21hc2tfdCAqcEZlYXR1cmVNYXNrKTsKICAgICBpbmxpbmUgYm9vbCBpc1ViaUZvY3VzRW5hYmxlZCgpIHtyZXR1cm4gbV9iQUZCcmFja2V0aW5nT24gJiYgIW1fYlJlRm9jdXNPbjt9OwogICAgIGlubGluZSBib29sIGlzQ2hyb21hRmxhc2hFbmFibGVkKCkge3JldHVybiBtX2JDaHJvbWFGbGFzaE9uO307CiAgICAgaW5saW5lIGJvb2wgaXNIaWdoUXVhbGl0eU5vaXNlUmVkdWN0aW9uTW9kZSgpIHtyZXR1cm4gbV9iSGlnaFF1YWxpdHlOb2lzZVJlZHVjdGlvbk1vZGU7fTsKQEAgLTc5NCw3ICs3OTEsNyBAQAogICAgIGludDMyX3Qgc2V0SW50RXZlbnQoY2FtX2ludF9ldnRfcGFyYW1zX3QgcGFyYW1zKTsKICAgICBib29sIGdldG9mZmxpbmVSQVcoKSB7cmV0dXJuIG1PZmZsaW5lUkFXO30KICAgICBpbnQzMl90IHVwZGF0ZVBwRmVhdHVyZU1hc2soY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUpOwotICAgIGludDMyX3QgZ2V0U3RyZWFtUHBNYXNrKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlLCB1aW50MzJfdCAmcHBfbWFzayk7CisgICAgaW50MzJfdCBnZXRTdHJlYW1QcE1hc2soY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUsIGNhbV9mZWF0dXJlX21hc2tfdCAmcHBfbWFzayk7CiAgICAgaW50MzJfdCBnZXRTaGFycG5lc3MoKSB7cmV0dXJuIG1fblNoYXJwbmVzczt9OwogICAgIGludDMyX3QgZ2V0RWZmZWN0KCkge3JldHVybiBtUGFybUVmZmVjdDt9OwogICAgIGludDMyX3QgdXBkYXRlRmxhc2hNb2RlKGNhbV9mbGFzaF9tb2RlX3QgZmxhc2hfbW9kZSk7CkBAIC04NDYsNiArODQzLDggQEAKICAgICAgICAgICAgIGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QqIGluZm8pOwogICAgIGNvbnN0IGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QqCiAgICAgICAgICAgICBnZXRSZWxhdGVkQ2FtU3luY0luZm8odm9pZCk7CisgICAgaW50MzJfdCBzZXRGcmFtZVN5bmNFbmFibGVkKGJvb2wgZW5hYmxlKTsKKyAgICBib29sIGlzRnJhbWVTeW5jRW5hYmxlZCh2b2lkKTsKICAgICBpbnQzMl90IGdldFJlbGF0ZWRDYW1DYWxpYnJhdGlvbigKICAgICAgICAgICAgIGNhbV9yZWxhdGVkX3N5c3RlbV9jYWxpYnJhdGlvbl9kYXRhX3QqIGNhbGliKTsKICAgICBpbnQzMl90IGJ1bmRsZVJlbGF0ZWRDYW1lcmFzKGJvb2wgc3luYywgdWludDMyX3Qgc2Vzc2lvbmlkKTsKQEAgLTg2MSw2ICs4NjAsMTIgQEAKIAogICAgIGludDMyX3QgY2hlY2tGZWF0dXJlQ29uY3VycmVuY3koKTsKICAgICBpbnQzMl90IHNldEluc3RhbnRBRUModWludDhfdCBlbmFibGUsIGJvb2wgaW5pdENvbW1pdCk7CisKKyAgICBpbnQzMl90IGdldEFuYWx5c2lzSW5mbygKKyAgICAgICAgYm9vbCBmZFZpZGVvRW5hYmxlZCwKKyAgICAgICAgYm9vbCBoYWwzLAorICAgICAgICB1aW50MzJfdCBmZWF0dXJlTWFzaywKKyAgICAgICAgY2FtX2FuYWx5c2lzX2luZm9fdCAqcEFuYWx5c2lzSW5mbyk7CiBwcml2YXRlOgogICAgIGludDMyX3Qgc2V0UHJldmlld1NpemUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CiAgICAgaW50MzJfdCBzZXRWaWRlb1NpemUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CkBAIC0xMDExLDcgKzEwMTYsNyBAQAogICAgIHZvaWQgc2V0QnVmQmF0Y2hDb3VudChpbnQ4X3QgYnVmX2NudCk7CiAgICAgdm9pZCBzZXRWaWRlb0JhdGNoU2l6ZSgpOwogICAgIHZvaWQgc2V0RGNyZigpOwotICAgIGludDMyX3Qgc2V0U3RyZWFtUHBNYXNrKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlLCB1aW50MzJfdCBwcF9tYXNrKTsKKyAgICBpbnQzMl90IHNldFN0cmVhbVBwTWFzayhjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwgY2FtX2ZlYXR1cmVfbWFza190IHBwX21hc2spOwogICAgIHZvaWQgc2V0T2ZmbGluZVJBVyhib29sIHZhbHVlID0gMCk7CiAgICAgaW50MzJfdCBjb25maWd1cmVGbGFzaChjYW1fY2FwdHVyZV9mcmFtZV9jb25maWdfdCAmZnJhbWVfY29uZmlnKTsKICAgICBpbnQzMl90IGNvbmZpZ3VyZUxvd0xpZ2h0KGNhbV9jYXB0dXJlX2ZyYW1lX2NvbmZpZ190ICZmcmFtZV9jb25maWcpOwpAQCAtMTA5NSw2ICsxMTAwLDcgQEAKICAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxpbnQ+IE5PSVNFX1JFRFVDVElPTl9NT0RFU19NQVBbXTsKIAogICAgIFFDYW1lcmFSZXByb2NTY2FsZVBhcmFtIG1fcmVwcm9jU2NhbGVQYXJhbTsKKyAgICBRQ2FtZXJhQ29tbW9uICAgICAgICAgICBtQ29tbW9uOwogCiAgICAgY2FtX2NhcGFiaWxpdHlfdCAqbV9wQ2FwYWJpbGl0eTsKICAgICBtbV9jYW1lcmFfdnRibF90ICptX3BDYW1PcHNUYmw7CkBAIC0xMTA1LDYgKzExMTEsNyBAQAogICAgIC8qIHB0ciB0byBzeW5jIGJ1ZmZlciBpbiBtX3BSZWxDYW1TeW5jSGVhcCAqLwogICAgIGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QgKm1fcFJlbENhbVN5bmNCdWY7CiAgICAgY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCBtX3JlbENhbVN5bmNJbmZvOworICAgIGJvb2wgbV9iRnJhbWVTeW5jRW5hYmxlZDsKICAgICBjYW1faXNfdHlwZV90IG1Jc1R5cGU7CiAKICAgICBib29sIG1fYlpzbE1vZGU7ICAgICAgICAgICAgICAgIC8vIGlmIFpTTCBpcyBlbmFibGVkCkBAIC0xMTQyLDYgKzExNDksNyBAQAogICAgIGNhbV9kaW1lbnNpb25fdCBtX3Jhd1NpemU7IC8vIGxpdmUgc25hcHNob3Qgc2l6ZQogICAgIGNhbV9kaW1lbnNpb25fdCBtX21heFBpY1NpemU7CiAgICAgYm9vbCBtX2JIRFJFbmFibGVkOyAgICAgICAgICAgICAvLyBpZiBIRFIgaXMgZW5hYmxlZAorICAgIGJvb2wgbV9iTG9jYWxIRFJFbmFibGVkOyAgIC8vIFRoaXMgZmxhZyB0ZWxscyB3aGV0aGVyIEhEUiBlbmFibGVkIG9yIG5vdCByZWdhcmxlc3Mgb2YgQVBQIG1vZGUKICAgICBib29sIG1fYkFWVGltZXJFbmFibGVkOyAgICAvL2lmIEFWVGltZXIgaXMgZW5hYmxlZAogICAgIGJvb2wgbV9iRElTRW5hYmxlZDsKICAgICBib29sIG1fYk9JU0VuYWJsZWQ7CkBAIC0xMTc4LDEzICsxMTg2LDEyIEBACiAgICAgYm9vbCBtX2JIRFJNb2RlU2Vuc29yOwogICAgIGJvb2wgbU9mZmxpbmVSQVc7CiAgICAgYm9vbCBtX2JUcnVlUG9ydHJhaXRPbjsKLSAgICB1aW50MzJfdCBtX25NaW5SZXF1aXJlZFBwTWFzazsKLSAgICB1aW50MzJfdCBtU3RyZWFtUHBNYXNrW0NBTV9TVFJFQU1fVFlQRV9NQVhdOworICAgIGNhbV9mZWF0dXJlX21hc2tfdCBtX25NaW5SZXF1aXJlZFBwTWFzazsKKyAgICBjYW1fZmVhdHVyZV9tYXNrX3QgbVN0cmVhbVBwTWFza1tDQU1fU1RSRUFNX1RZUEVfTUFYXTsKICAgICBpbnQzMl90IG1fblNoYXJwbmVzczsKICAgICBpbnQ4X3QgbVRvdGFsUFBDb3VudDsKICAgICBpbnQ4X3QgbUN1clBQQ291bnQ7CiAgICAgaW50MzJfdCBtWm9vbUxldmVsOwotICAgIGJvb2wgbV9iU3RyZWFtc0NvbmZpZ3VyZWQ7CiAgICAgaW50MzJfdCBtUGFybVpvb21MZXZlbDsKICAgICBib29sIG1fYklzTG93TWVtb3J5RGV2aWNlOwogICAgIGludDMyX3QgbUNkc19tb2RlOwpkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvSEFML1FDYW1lcmFQYXJhbWV0ZXJzSW50Zi5jcHAgYi9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBhcmFtZXRlcnNJbnRmLmNwcAppbmRleCBjMmUwMjY5Li41YWUzYzc2IDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBhcmFtZXRlcnNJbnRmLmNwcAorKysgYi9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBhcmFtZXRlcnNJbnRmLmNwcApAQCAtNzUwLDcgKzc1MCw3IEBACiAgICAgcmV0dXJuIG1JbXBsLT5pc0hEUlRodW1ibmFpbFByb2Nlc3NOZWVkZWQoKTsKIH0KIAotdm9pZCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OnNldE1pblBwTWFzayh1aW50MzJfdCBtaW5fcHBfbWFzaykKK3ZvaWQgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpzZXRNaW5QcE1hc2soY2FtX2ZlYXR1cmVfbWFza190IG1pbl9wcF9tYXNrKQogewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKQEAgLTgwMiw3ICs4MDIsNyBAQAogICAgIHJldHVybiBtSW1wbC0+Z2V0RXhpZkJ1ZkluZGV4KGNhcHR1cmVJbmRleCk7CiB9CiAKLWJvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpuZWVkVGh1bWJuYWlsUmVwcm9jZXNzKHVpbnQzMl90ICpwRmVhdHVyZU1hc2spCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6bmVlZFRodW1ibmFpbFJlcHJvY2VzcyhjYW1fZmVhdHVyZV9tYXNrX3QgKnBGZWF0dXJlTWFzaykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CkBAIC0xMDI2LDcgKzEwMjYsNyBAQAogfQogCiBpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0U3RyZWFtUHBNYXNrKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlLAotICAgICAgICB1aW50MzJfdCAmcHBfbWFzaykKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190ICZwcF9tYXNrKQogewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKQEAgLTEyOTMsNiArMTI5MywyMSBAQAogICAgIHJldHVybiBtSW1wbC0+Z2V0UmVsYXRlZENhbVN5bmNJbmZvKCk7CiB9CiAKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpzZXRGcmFtZVN5bmNFbmFibGVkKAorCWJvb2wgZW5hYmxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPnNldEZyYW1lU3luY0VuYWJsZWQoZW5hYmxlKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzRnJhbWVTeW5jRW5hYmxlZCh2b2lkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzRnJhbWVTeW5jRW5hYmxlZCgpOworfQorCiBpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0UmVsYXRlZENhbUNhbGlicmF0aW9uKAogCWNhbV9yZWxhdGVkX3N5c3RlbV9jYWxpYnJhdGlvbl9kYXRhX3QqIGNhbGliKQogewpAQCAtMTM3MSw0ICsxMzg2LDE1IEBACiAgICAgcmV0dXJuIG1JbXBsLT5zZXRJbnN0YW50QUVDKGVuYWJsZSwgaW5pdENvbW1pdCk7CiB9CiAKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRBbmFseXNpc0luZm8oCisgICAgICAgIGJvb2wgZmRWaWRlb0VuYWJsZWQsCisgICAgICAgIGJvb2wgaGFsMywKKyAgICAgICAgdWludDMyX3QgZmVhdHVyZU1hc2ssCisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3QgKnBBbmFseXNpc0luZm8pCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0QW5hbHlzaXNJbmZvKGZkVmlkZW9FbmFibGVkLCBoYWwzLCBmZWF0dXJlTWFzaywgcEFuYWx5c2lzSW5mbyk7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBxY2FtZXJhCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBhcmFtZXRlcnNJbnRmLmggYi9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBhcmFtZXRlcnNJbnRmLmgKaW5kZXggYjYwN2YxMC4uMGZiNjBiNSAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvSEFML1FDYW1lcmFQYXJhbWV0ZXJzSW50Zi5oCisrKyBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhUGFyYW1ldGVyc0ludGYuaApAQCAtMTgzLDcgKzE4Myw3IEBACiAKICAgICBjb25zdCBjaGFyICpnZXRBU0RTdGF0ZVN0cmluZyhjYW1fYXV0b19zY2VuZV90IHNjZW5lKTsKICAgICBib29sIGlzSERSVGh1bWJuYWlsUHJvY2Vzc05lZWRlZCgpOwotICAgIHZvaWQgc2V0TWluUHBNYXNrKHVpbnQzMl90IG1pbl9wcF9tYXNrKTsKKyAgICB2b2lkIHNldE1pblBwTWFzayhjYW1fZmVhdHVyZV9tYXNrX3QgbWluX3BwX21hc2spOwogICAgIGJvb2wgc2V0U3RyZWFtQ29uZmlndXJlKGJvb2wgaXNDYXB0dXJlLAogICAgICAgICAgICAgYm9vbCBwcmV2aWV3QXNQb3N0dmlldywgYm9vbCByZXNldENvbmZpZyk7CiAgICAgaW50MzJfdCBhZGRPbmxpbmVSb3RhdGlvbih1aW50MzJfdCByb3RhdGlvbiwgdWludDMyX3Qgc3RyZWFtSWQsCkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICB1aW50OF90IGdldE51bU9mRXh0cmFCdWZmZXJzRm9yVmlkZW8oKTsKICAgICB1aW50OF90IGdldE51bU9mRXh0cmFCdWZmZXJzRm9yUHJldmlldygpOwogICAgIHVpbnQzMl90IGdldEV4aWZCdWZJbmRleCh1aW50MzJfdCBjYXB0dXJlSW5kZXgpOwotICAgIGJvb2wgbmVlZFRodW1ibmFpbFJlcHJvY2Vzcyh1aW50MzJfdCAqcEZlYXR1cmVNYXNrKTsKKyAgICBib29sIG5lZWRUaHVtYm5haWxSZXByb2Nlc3MoY2FtX2ZlYXR1cmVfbWFza190ICpwRmVhdHVyZU1hc2spOwogICAgIGJvb2wgaXNVYmlGb2N1c0VuYWJsZWQoKTsKICAgICBib29sIGlzQ2hyb21hRmxhc2hFbmFibGVkKCk7CiAgICAgYm9vbCBpc0hpZ2hRdWFsaXR5Tm9pc2VSZWR1Y3Rpb25Nb2RlKCk7CkBAIC0yMjgsNyArMjI4LDcgQEAKICAgICBpbnQzMl90IHNldEludEV2ZW50KGNhbV9pbnRfZXZ0X3BhcmFtc190IHBhcmFtcyk7CiAgICAgYm9vbCBnZXRvZmZsaW5lUkFXKCk7CiAgICAgaW50MzJfdCB1cGRhdGVQcEZlYXR1cmVNYXNrKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlKTsKLSAgICBpbnQzMl90IGdldFN0cmVhbVBwTWFzayhjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwgdWludDMyX3QgJnBwX21hc2spOworICAgIGludDMyX3QgZ2V0U3RyZWFtUHBNYXNrKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlLCBjYW1fZmVhdHVyZV9tYXNrX3QgJnBwX21hc2spOwogICAgIGludDMyX3QgZ2V0U2hhcnBuZXNzKCk7CiAgICAgaW50MzJfdCBnZXRFZmZlY3QoKTsKICAgICBpbnQzMl90IHVwZGF0ZUZsYXNoTW9kZShjYW1fZmxhc2hfbW9kZV90IGZsYXNoX21vZGUpOwpAQCAtMjc0LDYgKzI3NCw4IEBACiAgICAgICAgICAgICBjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KiBpbmZvKTsKICAgICBjb25zdCBjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KgogICAgICAgICAgICAgZ2V0UmVsYXRlZENhbVN5bmNJbmZvKHZvaWQpOworICAgIGludDMyX3Qgc2V0RnJhbWVTeW5jRW5hYmxlZChib29sIGVuYWJsZSk7CisgICAgYm9vbCBpc0ZyYW1lU3luY0VuYWJsZWQodm9pZCk7CiAgICAgaW50MzJfdCBnZXRSZWxhdGVkQ2FtQ2FsaWJyYXRpb24oCiAgICAgICAgICAgICBjYW1fcmVsYXRlZF9zeXN0ZW1fY2FsaWJyYXRpb25fZGF0YV90KiBjYWxpYik7CiAgICAgaW50MzJfdCBidW5kbGVSZWxhdGVkQ2FtZXJhcyhib29sIHN5bmMsIHVpbnQzMl90IHNlc3Npb25pZCk7CkBAIC0yODksNiArMjkxLDEyIEBACiAKICAgICBpbnQzMl90IGNoZWNrRmVhdHVyZUNvbmN1cnJlbmN5KCk7CiAgICAgaW50MzJfdCBzZXRJbnN0YW50QUVDKHVpbnQ4X3QgZW5hYmxlLCBib29sIGluaXRDb21taXQpOworCisgICAgaW50MzJfdCBnZXRBbmFseXNpc0luZm8oCisgICAgICAgIGJvb2wgZmRWaWRlb0VuYWJsZWQsCisgICAgICAgIGJvb2wgaGFsMywKKyAgICAgICAgdWludDMyX3QgZmVhdHVyZU1hc2ssCisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3QgKnBBbmFseXNpc0luZm8pOwogcHJpdmF0ZToKICAgICBRQ2FtZXJhUGFyYW1ldGVycyAqbUltcGw7CiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL0hBTC9RQ2FtZXJhUG9zdFByb2MuY3BwIGIvUUNhbWVyYTIvSEFML1FDYW1lcmFQb3N0UHJvYy5jcHAKaW5kZXggMjI0MTNhMS4uOGVkZGNjZiAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvSEFML1FDYW1lcmFQb3N0UHJvYy5jcHAKKysrIGIvUUNhbWVyYTIvSEFML1FDYW1lcmFQb3N0UHJvYy5jcHAKQEAgLTk3LDYgKzk3LDcgQEAKICAgICBtZW1zZXQobVBQQ2hhbm5lbHMsIDAsIHNpemVvZihtUFBDaGFubmVscykpOwogICAgIG1fRGF0YU1lbSA9IE5VTEw7CiAgICAgbU9mZmxpbmVEYXRhQnVmcyA9IE5VTEw7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtX3JlcHJvY2Vzc19sb2NrLE5VTEwpOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTI0LDYgKzEyNSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgbVBQQ2hhbm5lbENvdW50ID0gMDsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1fcmVwcm9jZXNzX2xvY2spOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTQzNSw5ICsxNDM3LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBmcmVlIHBwIGpvYiBidWYKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX3JlcHJvY2Vzc19sb2NrKTsKICAgICAgICAgaWYgKGpvYikgewogICAgICAgICAgICAgZnJlZShqb2IpOwogICAgICAgICB9CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX3JlcHJvY2Vzc19sb2NrKTsKICAgICB9CiAKICAgICBMT0dEKCIiKTsKQEAgLTI0NTUsNiArMjQ1OSwxMiBAQAogICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YXNkX2RlYnVnX3BhcmFtc192YWxpZDsKICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19zdGF0c2RlYnVnX3N0YXRzX3BhcmFtc192YWxpZCA9CiAgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5zdGF0c19kZWJ1Z19wYXJhbXNfdmFsaWQ7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+aXNfc3RhdHNkZWJ1Z19iZXN0YXRzX3BhcmFtc192YWxpZCA9CisgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iZXN0YXRzX2RlYnVnX3BhcmFtc192YWxpZDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19zdGF0c2RlYnVnX2JoaXN0X3BhcmFtc192YWxpZCA9CisgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iaGlzdF9kZWJ1Z19wYXJhbXNfdmFsaWQ7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+aXNfc3RhdHNkZWJ1Z18zYV90dW5pbmdfcGFyYW1zX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPnEzYV90dW5pbmdfZGVidWdfcGFyYW1zX3ZhbGlkOwogCiAgICAgICAgICAgICBpZiAoanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmFlX2RlYnVnX3BhcmFtc192YWxpZCkgewogICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5zdGF0c2RlYnVnX2FlX2RhdGEgPQpAQCAtMjQ3Niw2ICsyNDg2LDE4IEBACiAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPnN0YXRzZGVidWdfc3RhdHNfYnVmZmVyX2RhdGEgPQogICAgICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPnN0YXRzX2RlYnVnX3BhcmFtczsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YmVzdGF0c19kZWJ1Z19wYXJhbXNfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+c3RhdHNkZWJ1Z19iZXN0YXRzX2J1ZmZlcl9kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iZXN0YXRzX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+Ymhpc3RfZGVidWdfcGFyYW1zX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPnN0YXRzZGVidWdfYmhpc3RfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+Ymhpc3RfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5xM2FfdHVuaW5nX2RlYnVnX3BhcmFtc192YWxpZCkgeworICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5zdGF0c2RlYnVnXzNhX3R1bmluZ19kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5xM2FfdHVuaW5nX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgfQpAQCAtMzEwOCw5ICszMTMwLDExIEBACiAgICAgICAgIGlmICgobV9wYXJlbnQtPmlzUmVndWxhckNhcHR1cmUoKSkgfHwgKHBwcmVxX2pvYi0+b2ZmbGluZV9idWZmZXIpKSB7CiAgICAgICAgICAgICBtX2J1ZkNvdW50UFBRKys7CiAgICAgICAgICAgICBpZiAobV9vbmdvaW5nUFBRLmVucXVldWUoKHZvaWQgKilwcHJlcV9qb2IpKSB7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX3JlcHJvY2Vzc19sb2NrKTsKICAgICAgICAgICAgICAgICByZXQgPSBtUFBDaGFubmVsc1ttQ3VyQ2hhbm5lbElkeF0tPmRvUmVwcm9jZXNzT2ZmbGluZShwcElucHV0RnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX2J1ZiwgbV9wYXJlbnQtPm1QYXJhbWV0ZXJzKTsKICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX3JlcHJvY2Vzc19sb2NrKTsKICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zMTE5LDYgKzMxNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICBtUFBDaGFubmVsc1ttQ3VyQ2hhbm5lbElkeF0tPmRvUmVwcm9jZXNzT2ZmbGluZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHJlcV9qb2ItPm9mZmxpbmVfcmVwcm9jX2J1ZiwgbWV0YV9idWYpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9yZXByb2Nlc3NfbG9jayk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIExPR1coIm1fb25nb2luZ1BQUSBpcyBub3QgYWN0aXZlISEhIik7CiAgICAgICAgICAgICAgICAgcmV0ID0gVU5LTk9XTl9FUlJPUjsKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL0hBTC9RQ2FtZXJhUG9zdFByb2MuaCBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhUG9zdFByb2MuaAppbmRleCA1OGY4ODY1Li41YzU2MjE0IDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBvc3RQcm9jLmgKKysrIGIvUUNhbWVyYTIvSEFML1FDYW1lcmFQb3N0UHJvYy5oCkBAIC0yMzksNiArMjM5LDcgQEAKICAgICBpbnQzMl90IG1fYnVmQ291bnRQUFE7CiAgICAgVmVjdG9yPG1tX2NhbWVyYV9idWZfZGVmX3QgKj4gbV9JbnB1dE1ldGFkYXRhOyAvLyBzdG9yZSBpbnB1dCBtZXRhZGF0YSBidWZmZXJzIGZvciBBT1NUIGNhc2VzCiAgICAgc2l6ZV90IG1fUFBpbmRleDsgICAgICAgICAgICAgICAgICAgLy8gY291bnRlciBmb3IgZWFjaCBpbmNvbWluZyBBT1NUIGJ1ZmZlcgorICAgIHB0aHJlYWRfbXV0ZXhfdCBtX3JlcHJvY2Vzc19sb2NrOyAgIC8vIGxvY2sgdG8gZW5zdXJlIHJlcHJvY2VzcyBqb2IgaXMgbm90IGZyZWVkIGVhcmx5LgogCiBwdWJsaWM6CiAgICAgY2FtX2RpbWVuc2lvbl90IG1fZHN0X2RpbTsKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL0hBTC9RQ2FtZXJhU3RhdGVNYWNoaW5lLmNwcCBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhU3RhdGVNYWNoaW5lLmNwcAppbmRleCBhMTc3MDEwLi5mOWU4NWI4IDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYVN0YXRlTWFjaGluZS5jcHAKKysrIGIvUUNhbWVyYTIvSEFML1FDYW1lcmFTdGF0ZU1hY2hpbmUuY3BwCkBAIC0xODM0LDYgKzE4MzQsMTggQEAKICAgICAgICAgICAgIHN3aXRjaCAoY2FtX2V2dC0+c2VydmVyX2V2ZW50X3R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgQ0FNX0VWRU5UX1RZUEVfREFFTU9OX0RJRUQ6CiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGludGVybmFsIGV2ZW50cyB0byBzdG9wIGluZGVmaW5pdGUgd2FpdCBvbiBwcmVwYXJlCisgICAgICAgICAgICAgICAgICAgIC8vIHNuYXBzaG90IGRvbmUgZXZlbnQuCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gUUNBTUVSQV9TTV9FVlRfUFJFUEFSRV9TTkFQU0hPVDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gUUNBTUVSQV9TTV9FVlRfVEFLRV9QSUNUVVJFOworICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisKICAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0VSUk9SX1NFUlZFUl9ESUVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKQEAgLTIyMTcsOCArMjIyOSw4IEBACiAgICAgICAgICAgICBzd2l0Y2ggKGNhbV9ldnQtPnNlcnZlcl9ldmVudF90eXBlKSB7CiAgICAgICAgICAgICBjYXNlIENBTV9FVkVOVF9UWVBFX0RBRU1PTl9ESUVEOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBpbnRlcm5hbCBldmVudHMgdG8gcmVsZWFzZSBzdGF0ZW1hY2hpbmUKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkIHRvIHByb2Nlc3MgQ0FNRVJBX0VSUk9SX1NFUlZFUl9ESUVEIGVycm9yCisgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgaW50ZXJuYWwgZXZlbnRzIHRvIHN0b3AgaW5kZWZpbml0ZSB3YWl0IG9uIHByZXBhcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gc25hcHNob3QgZG9uZSBldmVudC4KICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOwogICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBRQ0FNRVJBX1NNX0VWVF9QUkVQQVJFX1NOQVBTSE9UOwogICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CkBAIC0zNTc5LDYgKzM1OTEsMTggQEAKICAgICAgICAgICAgIHN3aXRjaCAoY2FtX2V2dC0+c2VydmVyX2V2ZW50X3R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgQ0FNX0VWRU5UX1RZUEVfREFFTU9OX0RJRUQ6CiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGludGVybmFsIGV2ZW50cyB0byBzdG9wIGluZGVmaW5pdGUgd2FpdCBvbiBwcmVwYXJlCisgICAgICAgICAgICAgICAgICAgIC8vIHNuYXBzaG90IGRvbmUgZXZlbnQuCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gUUNBTUVSQV9TTV9FVlRfUFJFUEFSRV9TTkFQU0hPVDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gUUNBTUVSQV9TTV9FVlRfVEFLRV9QSUNUVVJFOworICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisKICAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0VSUk9SX1NFUlZFUl9ESUVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL0hBTC9RQ2FtZXJhU3RyZWFtLmNwcCBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhU3RyZWFtLmNwcAppbmRleCBmYjE5ZGViLi5hOGY0NGMwIDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYVN0cmVhbS5jcHAKKysrIGIvUUNhbWVyYTIvSEFML1FDYW1lcmFTdHJlYW0uY3BwCkBAIC01OTMsNyArNTkzLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHJjID0gYnVmZmVyTWFwcy5lbnF1ZXVlKGJ1ZlR5cGUsIG1IYW5kbGUsIGkgLypidWYgaW5kZXgqLywgLTEgLypwbGFuZSBpbmRleCovLAotICAgICAgICAgICAgICAgIDAgLypjb29raWUqLywgQnVmLT5nZXRGZChpKSwgYnVmU2l6ZSk7CisgICAgICAgICAgICAgICAgMCAvKmNvb2tpZSovLCBCdWYtPmdldEZkKGkpLCBidWZTaXplLCBCdWYtPmdldFB0cihpKSk7CiAKICAgICAgICAgaWYgKHJjIDwgMCkgewogICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIG1hcCBidWZmZXJzIik7CkBAIC0xMzAzLDcgKzEzMDMsOCBAQAogCiAgICAgICAgIHJjID0gYnVmZmVyTWFwcy5lbnF1ZXVlKENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsCiAgICAgICAgICAgICAgICAgMCAvKnN0cmVhbSBpZCovLCBpIC8qYnVmIGluZGV4Ki8sIC0xIC8qcGxhbmUgaW5kZXgqLywKLSAgICAgICAgICAgICAgICAwIC8qY29va2llKi8sIG1TdHJlYW1CdWZzLT5nZXRGZChpKSwgYnVmU2l6ZSk7CisgICAgICAgICAgICAgICAgMCAvKmNvb2tpZSovLCBtU3RyZWFtQnVmcy0+Z2V0RmQoaSksIGJ1ZlNpemUsCisgICAgICAgICAgICAgICAgbVN0cmVhbUJ1ZnMtPmdldFB0cihpKSk7CiAKICAgICAgICAgaWYgKHJjIDwgMCkgewogICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIG1hcCBidWZmZXJzIik7CkBAIC0xNDcyLDcgKzE0NzMsNyBAQAogICAgIHJjID0gUUNhbWVyYUJ1ZmZlck1hcHM6Om1ha2VTaW5nbGV0b25CdWZNYXBMaXN0KAogICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiwgMCAvKnN0cmVhbSBpZCovLCBpbmRleCwKICAgICAgICAgICAgIC0xIC8qcGxhbmUgaW5kZXgqLywgMCAvKmNvb2tpZSovLCBtU3RyZWFtQnVmcy0+Z2V0RmQoaW5kZXgpLAotICAgICAgICAgICAgYnVmU2l6ZSwgYnVmTWFwTGlzdCk7CisgICAgICAgICAgICBidWZTaXplLCBidWZNYXBMaXN0LCBtU3RyZWFtQnVmcy0+Z2V0UHRyKGluZGV4KSk7CiAKICAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgcmMgPSBtX01lbU9wc1RibC5idW5kbGVkX21hcF9vcHMoJmJ1Zk1hcExpc3QsIG1fTWVtT3BzVGJsLnVzZXJkYXRhKTsKQEAgLTE2NDEsNyArMTY0Miw4IEBACiAgICAgICAgIGlmIChCQURfSU5ERVggIT0gYnVmU2l6ZSkgewogICAgICAgICAgICAgcmMgPSBidWZmZXJNYXBzLmVucXVldWUoQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiwgbUhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgaSAvKmJ1ZiBpbmRleCovLCAtMSAvKnBsYW5lIGluZGV4Ki8sIDAgLypjb29raWUqLywKLSAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUJ1ZnMtPmdldEZkKGkpLCBidWZTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUJ1ZnMtPmdldEZkKGkpLCBidWZTaXplLAorICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQnVmcy0+Z2V0UHRyKGkpKTsKIAogICAgICAgICAgICAgaWYgKHJjIDwgMCkgewogICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBtYXAgYnVmZmVycyIpOwpAQCAtMTcwOSw3ICsxNzExLDggQEAKICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtQnVmc1RvTWFwOyBpKyspIHsKICAgICAgICAgcmMgPSBidWZmZXJNYXBzLmVucXVldWUoQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX1VTRVJfQlVGLAogICAgICAgICAgICAgICAgIDAgLypzdHJlYW0gaWQqLywgaSAvKmJ1ZiBpbmRleCovLCAtMSAvKnBsYW5lIGluZGV4Ki8sCi0gICAgICAgICAgICAgICAgMCAvKmNvb2tpZSovLCBtU3RyZWFtQmF0Y2hCdWZzLT5nZXRGZChpKSwgbU51bUJ1ZnMpOworICAgICAgICAgICAgICAgIDAgLypjb29raWUqLywgbVN0cmVhbUJhdGNoQnVmcy0+Z2V0RmQoaSksCisgICAgICAgICAgICAgICAgbU51bUJ1ZnMsIG1TdHJlYW1CYXRjaEJ1ZnMtPmdldFB0cihpKSk7CiAKICAgICAgICAgaWYgKHJjIDwgMCkgewogICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIG1hcCBidWZmZXJzIik7CkBAIC0xNzU4LDcgKzE3NjEsOCBAQAogICAgICAgICBpZiAoQkFEX0lOREVYICE9IGJ1ZlNpemUpIHsKICAgICAgICAgICAgIHJjID0gcGxhbmVCdWZmZXJNYXBzLmVucXVldWUoQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiwKICAgICAgICAgICAgICAgICAgICAgMCAvKnN0cmVhbSBpZCovLCBpIC8qYnVmIGluZGV4Ki8sIC0xIC8qcGxhbmUgaW5kZXgqLywKLSAgICAgICAgICAgICAgICAgICAgMCAvKmNvb2tpZSovLCBtU3RyZWFtQnVmcy0+Z2V0RmQoaSksIGJ1ZlNpemUpOworICAgICAgICAgICAgICAgICAgICAwIC8qY29va2llKi8sIG1TdHJlYW1CdWZzLT5nZXRGZChpKSwgYnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUJ1ZnMtPmdldFB0cihpKSk7CiAKICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gbWFwIGJ1ZmZlcnMiKTsKQEAgLTIwMDUsNyArMjAwOSw4IEBACiAKICAgICAgICAgICAgIHJjID0gYnVmZmVyTWFwcy5lbnF1ZXVlKENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsCiAgICAgICAgICAgICAgICAgICAgIHBtZS0+bUhhbmRsZSwgaSAvKmJ1ZiBpbmRleCovLCAtMSAvKnBsYW5lIGluZGV4Ki8sCi0gICAgICAgICAgICAgICAgICAgIDAgLypjb29raWUqLywgcG1lLT5tU3RyZWFtQnVmcy0+Z2V0RmQoaSksIGJ1ZlNpemUpOworICAgICAgICAgICAgICAgICAgICAwIC8qY29va2llKi8sIHBtZS0+bVN0cmVhbUJ1ZnMtPmdldEZkKGkpLCBidWZTaXplLAorICAgICAgICAgICAgICAgICAgICBwbWUtPm1TdHJlYW1CdWZzLT5nZXRQdHIoaSkpOwogCiAgICAgICAgICAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIG1hcCBidWZmZXJzIik7CkBAIC0yNDMzLDIwICsyNDM4LDIyIEBACiAgKiAgIEBidWZfaWR4ICA6IGluZGV4IG9mIGJ1ZmZlcgogICogICBAcGxhbmVfaWR4OiBwbGFuZSBpbmRleAogICogICBAZmQgICAgICAgOiBmZCBvZiB0aGUgYnVmZmVyCisgKiAgIEBidWZmZXIgICA6IGJ1ZmZlciBhZGRyZXNzCiAgKiAgIEBzaXplICAgICA6IGxlbmdodCBvZiB0aGUgYnVmZmVyCi0gKiAgIEBvcHNfdGJsICAgIDogcHRyIHRvIGJ1ZiBtYXBwaW5nL3VubWFwcGluZyBvcHMKKyAqICAgQG9wc190YmwgIDogcHRyIHRvIGJ1ZiBtYXBwaW5nL3VubWFwcGluZyBvcHMKICAqCiAgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cwogICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCiAgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiBpbnQzMl90IFFDYW1lcmFTdHJlYW06Om1hcEJ1Zih1aW50OF90IGJ1Zl90eXBlLCB1aW50MzJfdCBidWZfaWR4LAotICAgICAgICBpbnQzMl90IHBsYW5lX2lkeCwgaW50IGZkLCBzaXplX3Qgc2l6ZSwgbW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKm9wc190YmwpCisgICAgICAgIGludDMyX3QgcGxhbmVfaWR4LCBpbnQgZmQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCisgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsKQogewogICAgIGNhbV9idWZfbWFwX3R5cGVfbGlzdCBidWZNYXBMaXN0OwogICAgIGludDMyX3QgcmMgPSBRQ2FtZXJhQnVmZmVyTWFwczo6bWFrZVNpbmdsZXRvbkJ1Zk1hcExpc3QoCiAgICAgICAgICAgIChjYW1fbWFwcGluZ19idWZfdHlwZSlidWZfdHlwZSwgbUhhbmRsZSwgYnVmX2lkeCwgcGxhbmVfaWR4LAotICAgICAgICAgICAwIC8qY29va2llKi8sIGZkLCBzaXplLCBidWZNYXBMaXN0KTsKKyAgICAgICAgICAgMCAvKmNvb2tpZSovLCBmZCwgc2l6ZSwgYnVmTWFwTGlzdCwgYnVmZmVyKTsKIAogICAgIGlmIChyYyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYVN0cmVhbS5oIGIvUUNhbWVyYTIvSEFML1FDYW1lcmFTdHJlYW0uaAppbmRleCBmYzVjNDQzLi40MjAwZjVkIDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9IQUwvUUNhbWVyYVN0cmVhbS5oCisrKyBiL1FDYW1lcmEyL0hBTC9RQ2FtZXJhU3RyZWFtLmgKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgIGludDMyX3QgYWNxdWlyZVN0cmVhbUJ1ZnMoKTsKIAogICAgIGludDMyX3QgbWFwQnVmKHVpbnQ4X3QgYnVmX3R5cGUsIHVpbnQzMl90IGJ1Zl9pZHgsCi0gICAgICAgICAgICBpbnQzMl90IHBsYW5lX2lkeCwgaW50IGZkLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4LCBpbnQgZmQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCA9IE5VTEwpOwogICAgIGludDMyX3QgbWFwQnVmcyhjYW1fYnVmX21hcF90eXBlX2xpc3QgYnVmTWFwTGlzdCwKICAgICAgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsID0gTlVMTCk7CmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzQ2hhbm5lbC5jcHAgYi9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzQ2hhbm5lbC5jcHAKaW5kZXggNmEwMGVkNS4uM2I4YzJmNSAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM0NoYW5uZWwuY3BwCisrKyBiL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNDaGFubmVsLmNwcApAQCAtMjcsNiArMjcsNyBAQAogKgogKi8KIAorCiAjZGVmaW5lIExPR19UQUcgIlFDYW1lcmEzQ2hhbm5lbCIKIAogLy8gVG8gcmVtb3ZlCkBAIC02Nyw4ICs2OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY2Jfcm91dGluZSBjYl9yb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY2JfYnVmZmVyX2VyciBjYl9idWZmZXJfZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG9zdHByb2Nlc3NfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwgdWludDMyX3QgbnVtQnVmZmVycykKIHsKICAgICBtX2NhbUhhbmRsZSA9IGNhbV9oYW5kbGU7CkBAIC04Miw2ICs4NCw3IEBACiAKICAgICBtU3RyZWFtSW5mb0J1ZiA9IE5VTEw7CiAgICAgbUNoYW5uZWxDQiA9IGNiX3JvdXRpbmU7CisgICAgbUNoYW5uZWxDYkJ1ZkVyciA9IGNiX2J1ZmZlcl9lcnI7CiAgICAgbVBhZGRpbmdJbmZvID0gKnBhZGRpbmdJbmZvOwogICAgIG1QYWRkaW5nSW5mby5vZmZzZXRfaW5mby5vZmZzZXRfeCA9IDA7CiAgICAgbVBhZGRpbmdJbmZvLm9mZnNldF9pbmZvLm9mZnNldF95ID0gMDsKQEAgLTkxLDcgKzk0LDcgQEAKICAgICBtSXNUeXBlID0gSVNfVFlQRV9OT05FOwogICAgIG1OdW1CdWZmZXJzID0gbnVtQnVmZmVyczsKICAgICBtUGVyRnJhbWVNYXBVbm1hcEVuYWJsZSA9IHRydWU7Ci0gICAgZHVtcEZybUNudCA9IDA7CisgICAgbUR1bXBGcm1DbnQgPSAwOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTU2LDcgKzE1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90IHN0cmVhbURpbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcm90YXRpb25fdCBzdHJlYW1Sb3RhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1pblN0cmVhbUJ1Zk51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3N0cHJvY2Vzc01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IHBvc3Rwcm9jZXNzTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1faXNfdHlwZV90IGlzVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiYXRjaFNpemUpCiB7CkBAIC00OTgsMjQgKzUwMSwyNCBAQAogICAgIHN0YXRpYyBpbnQgY291bnRlciA9IDA7CiAgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5kdW1waW1nIiwgcHJvcCwgIjAiKTsKLSAgICBtWVVWRHVtcCA9ICh1aW50OF90KSBhdG9pKHByb3ApOworICAgIG1ZVVZEdW1wID0gKHVpbnQzMl90KWF0b2kocHJvcCk7CiAgICAgaWYgKG1ZVVZEdW1wICYgZHVtcF90eXBlKSB7Ci0gICAgICAgIGZybV9udW0gPSAoKG1ZVVZEdW1wICYgMHhmZmZmMDAwMCkgPj4gMTYpOwotICAgICAgICBpZiAoZnJtX251bSA9PSAwKSB7Ci0gICAgICAgICAgICBmcm1fbnVtID0gMTA7CisgICAgICAgIG1Gcm1OdW0gPSAoKG1ZVVZEdW1wICYgMHhmZmZmMDAwMCkgPj4gMTYpOworICAgICAgICBpZiAobUZybU51bSA9PSAwKSB7CisgICAgICAgICAgICBtRnJtTnVtID0gMTA7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGZybV9udW0gPiAyNTYpIHsKLSAgICAgICAgICAgIGZybV9udW0gPSAyNTY7CisgICAgICAgIGlmIChtRnJtTnVtID4gMjU2KSB7CisgICAgICAgICAgICBtRnJtTnVtID0gMjU2OwogICAgICAgICB9Ci0gICAgICAgIHNraXBfbW9kZSA9ICgobVlVVkR1bXAgJiAweDAwMDBmZjAwKSA+PiA4KTsKLSAgICAgICAgaWYgKHNraXBfbW9kZSA9PSAwKSB7Ci0gICAgICAgICAgICBza2lwX21vZGUgPSAxOworICAgICAgICBtU2tpcE1vZGUgPSAoKG1ZVVZEdW1wICYgMHgwMDAwZmYwMCkgPj4gOCk7CisgICAgICAgIGlmIChtU2tpcE1vZGUgPT0gMCkgeworICAgICAgICAgICAgbVNraXBNb2RlID0gMTsKICAgICAgICAgfQogICAgICAgICBpZiAobUR1bXBTa2lwQ250ID09IDApIHsKICAgICAgICAgICAgIG1EdW1wU2tpcENudCA9IDE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1EdW1wU2tpcENudCAlIHNraXBfbW9kZSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoZHVtcEZybUNudCA8PSBmcm1fbnVtKSB7CisgICAgICAgIGlmIChtRHVtcFNraXBDbnQgJSBtU2tpcE1vZGUgPT0gMCkgeworICAgICAgICAgICAgaWYgKG1EdW1wRnJtQ250IDw9IG1Gcm1OdW0pIHsKICAgICAgICAgICAgICAgICAvKiBOb3RlIHRoYXQgdGhlIGltYWdlIGRpbWVuc2lvbiB3aWxsIGJlIHRoZSB1bnJvdGF0ZWQgc3RyZWFtIGRpbWVuc2lvbi4KICAgICAgICAgICAgICAgICAqIElmIHlvdSBmZWVsIHRoYXQgdGhlIGltYWdlIHdvdWxkIGhhdmUgYmVlbiByb3RhdGVkIGR1cmluZyByZXByb2Nlc3MKICAgICAgICAgICAgICAgICAqIHRoZW4gc3dhcCB0aGUgZGltZW5zaW9ucyB3aGlsZSBvcGVuaW5nIHRoZSBmaWxlCkBAIC01NjQsNyArNTY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBMT0dIKCJ3cml0dGVuIG51bWJlciBvZiBieXRlcyAlbGRcbiIsIHdyaXR0ZW5fbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgZHVtcEZybUNudCsrOworICAgICAgICAgICAgICAgICAgICBtRHVtcEZybUNudCsrOwogICAgICAgICAgICAgICAgICAgICBjbG9zZShmaWxlX2ZkKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBMT0dFKCJmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGR1bXAgaW1hZ2UiKTsKQEAgLTYyMiw3ICs2MjUsOCBAQAogICoqIFJFVFVSTiAgICA6IGZvcm1hdCBmb3Igc3RyZWFtIHR5cGUKICAqCiAgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWNhbV9mb3JtYXRfdCBRQ2FtZXJhM0NoYW5uZWw6OmdldFN0cmVhbURlZmF1bHRGb3JtYXQoY2FtX3N0cmVhbV90eXBlX3QgdHlwZSkKK2NhbV9mb3JtYXRfdCBRQ2FtZXJhM0NoYW5uZWw6OmdldFN0cmVhbURlZmF1bHRGb3JtYXQoY2FtX3N0cmVhbV90eXBlX3QgdHlwZSwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKIHsKICAgICBjYW1fZm9ybWF0X3Qgc3RyZWFtRm9ybWF0OwogCkBAIC02NDQsNyArNjQ4LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfVklERU86Ci0gICAgICAgIGlmIChpc1VCV0NFbmFibGVkKCkpIHsKKyAgICB7CisgICAgICAgIC8qIERpc2FibGUgVUJXQyBmb3Igc21hbGxlciB2aWRlbyByZXNvbHV0aW9ucyBkdWUgdG8gQ1BQIGRvd25zY2FsZQorICAgICAgICAgICAgbGltaXRzLiBSZWZlciBjcHBfaHdfcGFyYW1zLmg6OkNQUF9ET1dOU0NBTEVfTElNSVRfVUJXQyAqLworICAgICAgICBpZiAoaXNVQldDRW5hYmxlZCgpICYmICh3aWR0aCA+PSA2NDApICYmIChoZWlnaHQgPj0gNDgwKSkgewogICAgICAgICAgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgICAgICAgICBpbnQgcEZvcm1hdDsKICAgICAgICAgICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOwpAQCAtNjYzLDYgKzY3MCw3IEBACiAjZW5kaWYKICAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICB9CiAgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q6CiAgICAgICAgIHN0cmVhbUZvcm1hdCA9IENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxOwogICAgICAgICBicmVhazsKQEAgLTcwNCwxNSArNzEyLDE2IEBACiAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxfaGFuZGxlLAogICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCiAgICAgICAgIGNoYW5uZWxfY2Jfcm91dGluZSBjYl9yb3V0aW5lLAorICAgICAgICBjaGFubmVsX2NiX2J1ZmZlcl9lcnIgY2JfYnVmZmVyX2VyciwKICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKICAgICAgICAgdm9pZCAqdXNlckRhdGEsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbSwKICAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUsCi0gICAgICAgIHVpbnQzMl90IHBvc3Rwcm9jZXNzX21hc2ssCisgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAogICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKm1ldGFkYXRhQ2hhbm5lbCwKICAgICAgICAgdWludDMyX3QgbnVtQnVmZmVycykgOgogICAgICAgICAgICAgUUNhbWVyYTNDaGFubmVsKGNhbV9oYW5kbGUsIGNoYW5uZWxfaGFuZGxlLCBjYW1fb3BzLCBjYl9yb3V0aW5lLAotICAgICAgICAgICAgICAgICAgICBwYWRkaW5nSW5mbywgcG9zdHByb2Nlc3NfbWFzaywgdXNlckRhdGEsIG51bUJ1ZmZlcnMpLAorICAgICAgICAgICAgICAgICAgICBjYl9idWZmZXJfZXJyLCBwYWRkaW5nSW5mbywgcG9zdHByb2Nlc3NfbWFzaywgdXNlckRhdGEsIG51bUJ1ZmZlcnMpLAogICAgICAgICAgICAgbV9wb3N0cHJvY2Vzc29yKHRoaXMpLAogICAgICAgICAgICAgbUZyYW1lQ291bnQoMCksCiAgICAgICAgICAgICBtTGFzdEZyYW1lQ291bnQoMCksCkBAIC03MzMsNyArNzQyLDcgQEAKICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuZGVidWcuc2Yuc2hvd2ZwcyIsIHByb3AsICIwIik7CiAgICAgbURlYnVnRlBTID0gKHVpbnQ4X3QpIGF0b2kocHJvcCk7CiAKLSAgICBpbnQzMl90IHJjID0gbV9wb3N0cHJvY2Vzc29yLmluaXQoJm1NZW1vcnksIG1Qb3N0UHJvY01hc2spOworICAgIGludDMyX3QgcmMgPSBtX3Bvc3Rwcm9jZXNzb3IuaW5pdCgmbU1lbW9yeSk7CiAgICAgaWYgKHJjICE9IDApIHsKICAgICAgICAgTE9HRSgiSW5pdCBQb3N0cHJvY2Vzc29yIGZhaWxlZCIpOwogICAgIH0KQEAgLTgxNSw0MyArODI0LDg2IEBACiAgICAgfSBlbHNlIGlmIChzdHJlYW0tPmdldE15VHlwZSgpID09IENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSykgewogICAgICAgICBkdW1wWVVWKHN1cGVyX2ZyYW1lLT5idWZzWzBdLCBkaW0sIG9mZnNldCwgUUNBTUVSQV9EVU1QX0ZSTV9DQUxMQkFDSyk7CiAgICAgfQotICAgIC8vLy9Vc2UgYmVsb3cgZGF0YSB0byBpc3N1ZSBmcmFtZXdvcmsgY2FsbGJhY2sKLSAgICByZXN1bHRCdWZmZXIgPSAoYnVmZmVyX2hhbmRsZV90ICopbU1lbW9yeS5nZXRCdWZmZXJIYW5kbGUoZnJhbWVJbmRleCk7Ci0gICAgcmVzdWx0RnJhbWVOdW1iZXIgPSBtTWVtb3J5LmdldEZyYW1lTnVtYmVyKGZyYW1lSW5kZXgpOwogCi0gICAgcmVzdWx0LnN0cmVhbSA9IG1DYW1lcmEzU3RyZWFtOwotICAgIHJlc3VsdC5idWZmZXIgPSByZXN1bHRCdWZmZXI7Ci0gICAgaWYgKElTX0JVRkZFUl9FUlJPUihzdXBlcl9mcmFtZS0+YnVmc1swXS0+ZmxhZ3MpKSB7Ci0gICAgICAgIHJlc3VsdC5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgICAgIExPR1coIkNBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUiBmb3Igc3RyZWFtX3R5cGU6ICVkIiwKLSAgICAgICAgICAgICAgICBtU3RyZWFtc1swXS0+Z2V0TXlUeXBlKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdC5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0s7Ci0gICAgfQotICAgIHJlc3VsdC5hY3F1aXJlX2ZlbmNlID0gLTE7Ci0gICAgcmVzdWx0LnJlbGVhc2VfZmVuY2UgPSAtMTsKLSAgICBpZihtUGVyRnJhbWVNYXBVbm1hcEVuYWJsZSkgewotICAgICAgICBpbnQzMl90IHJjID0gc3RyZWFtLT5idWZSZWxlYXNlKGZyYW1lSW5kZXgpOwotICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKLSAgICAgICAgICAgIExPR0UoIkVycm9yICVkIHJlbGVhc2luZyBzdHJlYW0gYnVmZmVyICVkIiwKLSAgICAgICAgICAgICAgICAgICAgIHJjLCBmcmFtZUluZGV4KTsKLSAgICAgICAgfQorICAgIGRvIHsKIAotICAgICAgICByYyA9IG1NZW1vcnkudW5yZWdpc3RlckJ1ZmZlcihmcmFtZUluZGV4KTsKLSAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7Ci0gICAgICAgICAgICBMT0dFKCJFcnJvciAlZCB1bnJlZ2lzdGVyaW5nIHN0cmVhbSBidWZmZXIgJWQiLAotICAgICAgICAgICAgICAgICAgICAgcmMsIGZyYW1lSW5kZXgpOwotICAgICAgICB9Ci0gICAgfQorICAgICAgIC8vVXNlIGJlbG93IGRhdGEgdG8gaXNzdWUgZnJhbWV3b3JrIGNhbGxiYWNrCisgICAgICAgcmVzdWx0QnVmZmVyID0gKGJ1ZmZlcl9oYW5kbGVfdCAqKW1NZW1vcnkuZ2V0QnVmZmVySGFuZGxlKGZyYW1lSW5kZXgpOworICAgICAgIHJlc3VsdEZyYW1lTnVtYmVyID0gbU1lbW9yeS5nZXRGcmFtZU51bWJlcihmcmFtZUluZGV4KTsKKyAgICAgICB1aW50MzJfdCBvbGRlc3RCdWZJbmRleDsKKyAgICAgICBpbnQzMl90IGxvd2VzdEZyYW1lTnVtYmVyID0gbU1lbW9yeS5nZXRPbGRlc3RGcmFtZU51bWJlcihvbGRlc3RCdWZJbmRleCk7CisgICAgICAgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSogaGFsX29iaiA9IChRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlKiltVXNlckRhdGE7CisgICAgICAgaWYgKChsb3dlc3RGcmFtZU51bWJlciAhPSAtMSApICYmIChsb3dlc3RGcmFtZU51bWJlciA8IHJlc3VsdEZyYW1lTnVtYmVyKSAmJgorICAgICAgICAgICAgaGFsX29iai0+bU9wTW9kZSAhPSBDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSkgeworICAgICAgICAgICBMT0dFKCJFcnJvciBidWZmZXIgZHJvcHBlZCBmb3IgZnJhbWVudW1iZXI6JWQgd2l0aCBidWZpZHg6JWQiLAorICAgICAgICAgICAgICAgICAgIGxvd2VzdEZyYW1lTnVtYmVyLCBvbGRlc3RCdWZJbmRleCk7CisgICAgICAgICAgIGlmIChtT3V0T2ZTZXF1ZW5jZUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICAgICAgICBzdHJlYW0tPmNhbmNlbEJ1ZmZlcihvbGRlc3RCdWZJbmRleCk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgbU91dE9mU2VxdWVuY2VCdWZmZXJzLnB1c2hfYmFjayhzdXBlcl9mcmFtZSk7CisgICAgICAgICAgIHJldHVybjsKKyAgICAgICB9CiAKLSAgICBpZiAoMCA8PSByZXN1bHRGcmFtZU51bWJlcikgewotICAgICAgICBpZiAobUNoYW5uZWxDQikgewotICAgICAgICAgICAgbUNoYW5uZWxDQihOVUxMLCAmcmVzdWx0LCAodWludDMyX3QpcmVzdWx0RnJhbWVOdW1iZXIsIGZhbHNlLCBtVXNlckRhdGEpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HRSgiQmFkIGZyYW1lIG51bWJlciIpOwotICAgIH0KLSAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKKyAgICAgICByZXN1bHQuc3RyZWFtID0gbUNhbWVyYTNTdHJlYW07CisgICAgICAgcmVzdWx0LmJ1ZmZlciA9IHJlc3VsdEJ1ZmZlcjsKKyAgICAgICBpZiAoSVNfQlVGRkVSX0VSUk9SKHN1cGVyX2ZyYW1lLT5idWZzWzBdLT5mbGFncykpIHsKKyAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICAgTE9HVygiQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SIGZvciBzdHJlYW1fdHlwZTogJWQiLAorICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zWzBdLT5nZXRNeVR5cGUoKSk7CisgICAgICAgICAgIG1DaGFubmVsQ2JCdWZFcnIodGhpcywgcmVzdWx0RnJhbWVOdW1iZXIsIENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUiwgbVVzZXJEYXRhKTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LOworICAgICAgIH0KKyAgICAgICByZXN1bHQuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgIHJlc3VsdC5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgaWYobVBlckZyYW1lTWFwVW5tYXBFbmFibGUpIHsKKyAgICAgICAgICAgaW50MzJfdCByYyA9IHN0cmVhbS0+YnVmUmVsZWFzZShmcmFtZUluZGV4KTsKKyAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICAgICBMT0dFKCJFcnJvciAlZCByZWxlYXNpbmcgc3RyZWFtIGJ1ZmZlciAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICByYywgZnJhbWVJbmRleCk7CisgICAgICAgICAgIH0KKworICAgICAgICAgICByYyA9IG1NZW1vcnkudW5yZWdpc3RlckJ1ZmZlcihmcmFtZUluZGV4KTsKKyAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICAgICBMT0dFKCJFcnJvciAlZCB1bnJlZ2lzdGVyaW5nIHN0cmVhbSBidWZmZXIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgcmMsIGZyYW1lSW5kZXgpOworICAgICAgICAgICB9CisgICAgICAgfQorCisgICAgICAgaWYgKDAgPD0gcmVzdWx0RnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgaWYgKG1DaGFubmVsQ0IpIHsKKyAgICAgICAgICAgICAgIG1DaGFubmVsQ0IoTlVMTCwgJnJlc3VsdCwgKHVpbnQzMl90KXJlc3VsdEZyYW1lTnVtYmVyLCBmYWxzZSwgbVVzZXJEYXRhKTsKKyAgICAgICAgICAgfQorICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIExPR0UoIkJhZCBmcmFtZSBudW1iZXIiKTsKKyAgICAgICB9CisgICAgICAgZnJlZShzdXBlcl9mcmFtZSk7CisgICAgICAgc3VwZXJfZnJhbWUgPSBOVUxMOworICAgICAgIGlmIChtT3V0T2ZTZXF1ZW5jZUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICAgIGJyZWFrOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdXRvIGl0ciA9IG1PdXRPZlNlcXVlbmNlQnVmZmVycy5iZWdpbigpOworICAgICAgICAgICAgc3VwZXJfZnJhbWUgPSAqaXRyOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHN1cGVyX2ZyYW1lLT5idWZzWzBdLT5idWZfaWR4OworICAgICAgICAgICAgcmVzdWx0RnJhbWVOdW1iZXIgPSBtTWVtb3J5LmdldEZyYW1lTnVtYmVyKGZyYW1lSW5kZXgpOworICAgICAgICAgICAgbG93ZXN0RnJhbWVOdW1iZXIgPSBtTWVtb3J5LmdldE9sZGVzdEZyYW1lTnVtYmVyKG9sZGVzdEJ1ZkluZGV4KTsKKyAgICAgICAgICAgIExPR0UoIkF0dGVtcHRpbmcgdG8gcmVjb3ZlciBuZXh0IGZyYW1lOiByZXN1bHQgRnJhbWUjOiAlZCwgcmVzdWx0SWR4OiAlZCwgIgorICAgICAgICAgICAgICAgICAgICAiTG93ZXN0IEZyYW1lIzogJWQsIG9sZGVzdEJ1ZkluZGV4OiAlZCIsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZyYW1lTnVtYmVyLCBmcmFtZUluZGV4LCBsb3dlc3RGcmFtZU51bWJlciwgb2xkZXN0QnVmSW5kZXgpOworICAgICAgICAgICAgaWYgKChsb3dlc3RGcmFtZU51bWJlciAhPSAtMSkgJiYgKGxvd2VzdEZyYW1lTnVtYmVyIDwgcmVzdWx0RnJhbWVOdW1iZXIpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiTXVsdGlwbGUgZnJhbWUgZHJvcHBlZCByZXF1ZXN0aW5nIGNhbmNlbCBmb3IgZnJhbWUgJWQsIGlkeDolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBsb3dlc3RGcmFtZU51bWJlciwgb2xkZXN0QnVmSW5kZXgpOworICAgICAgICAgICAgICAgIHN0cmVhbS0+Y2FuY2VsQnVmZmVyKG9sZGVzdEJ1ZkluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgfSBlbHNlIGlmIChsb3dlc3RGcmFtZU51bWJlciA9PSByZXN1bHRGcmFtZU51bWJlcikgeworICAgICAgICAgICAgICAgIExPR0UoIlRpbWUgdG8gZmx1c2ggb3V0IGhlYWQgb2YgbGlzdCBjb250aW51ZSBsb29wIHdpdGggdGhpcyBuZXcgc3VwZXIgZnJhbWUiKTsKKyAgICAgICAgICAgICAgICBpdHIgPSBtT3V0T2ZTZXF1ZW5jZUJ1ZmZlcnMuZXJhc2UoaXRyKTsKKyAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIlVuZXhwZWN0ZWQgY29uZGl0aW9uIGhlYWQgb2YgbGlzdCBpcyBub3QgdGhlIGxvd2VzdCBmcmFtZSBudW1iZXIiKTsKKyAgICAgICAgICAgICAgICBpdHIgPSBtT3V0T2ZTZXF1ZW5jZUJ1ZmZlcnMuZXJhc2UoaXRyKTsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgIH0gd2hpbGUgKDEpOwogICAgIHJldHVybjsKIH0KIApAQCAtODc3LDYgKzkyOSwzMyBAQAogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHRpbWVvdXRGcmFtZQorICoKKyAqIERFU0NSSVBUSU9OOiBNZXRob2QgdG8gaW5kaWNhdGUgdG8gY2hhbm5lbCB0aGF0IGEgZ2l2ZW4gZnJhbWUgaGFzIHRha2UgdG9vCisgKiAgICAgICAgICAgICAgbG9uZyB0byBiZSBnZW5lcmF0ZWQKKyAqCisgKiBQQVJBTUVURVJTIDogZnJhbWVudW1iZXIgaW5kaWNhdGluZyB0aGUgZnJhbWVudW1iZXIgb2YgdGhlIGJ1ZmZlciB0aW1pbmdvdXQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OnRpbWVvdXRGcmFtZSh1aW50MzJfdCBmcmFtZU51bWJlcikKK3sKKyAgICBpbnQzMl90IGJ1ZklkeDsKKworICAgIGJ1ZklkeCA9IG1NZW1vcnkuZ2V0QnVmZmVySW5kZXgoZnJhbWVOdW1iZXIpOworCisgICAgaWYgKGJ1ZklkeCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBCdWZmZXIgbm90IGZvdW5kIGZvciBmcmFtZTolZCIsIF9fZnVuY19fLCBmcmFtZU51bWJlcik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtU3RyZWFtc1swXS0+dGltZW91dEZyYW1lKGJ1ZklkeCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogRlVOQ1RJT04gICA6IHJlcXVlc3QKICAqCiAgKiBERVNDUklQVElPTjogaGFuZGxlIHRoZSByZXF1ZXN0IC0gZWl0aGVyIHdpdGggYW4gaW5wdXQgYnVmZmVyIG9yIGEgZGlyZWN0CkBAIC04OTUsNyArOTc0LDggQEAKIGludDMyX3QgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbDo6cmVxdWVzdChidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwKICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KiBwSW5wdXRCdWZmZXIsCi0gICAgICAgIG1ldGFkYXRhX2J1ZmZlcl90KiBtZXRhZGF0YSkKKyAgICAgICAgbWV0YWRhdGFfYnVmZmVyX3QqIG1ldGFkYXRhLAorICAgICAgICBpbnQgJmluZGV4VXNlZCkKIHsKICAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CiAgICAgaW50IGluZGV4OwpAQCAtOTYyLDEyICsxMDQyLDE5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHJjID0gbU1lbW9yeS5tYXJrRnJhbWVOdW1iZXIoaW5kZXgsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgaWYocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkVycm9yIG1hcmtpbmcgZnJhbWUgbnVtYmVyOiVkIGZvciBpbmRleCAlZCIsIGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgIGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQogICAgICAgICByYyA9IG1TdHJlYW1zWzBdLT5idWZEb25lKGluZGV4KTsKICAgICAgICAgaWYocmMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBRIG5ldyBidWZmZXIgdG8gc3RyZWFtIik7CisgICAgICAgICAgICBtTWVtb3J5Lm1hcmtGcmFtZU51bWJlcihpbmRleCwgLTEpOwogICAgICAgICAgICAgcmV0dXJuIHJjOwogICAgICAgICB9Ci0gICAgICAgIHJjID0gbU1lbW9yeS5tYXJrRnJhbWVOdW1iZXIoaW5kZXgsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgaW5kZXhVc2VkID0gaW5kZXg7CiAgICAgfQogICAgIHJldHVybiByYzsKIH0KQEAgLTk5Nyw2ICsxMDg0LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBMT0dFKCJDb3VsZCBub3QgYWxsb2NhdGUgb2ZmbGluZSBtZXRhIGJ1ZmZlcnMgZm9yIGlucHV0IHJlcHJvY2VzcyIpOwogICAgIH0KKyAgICBtT3V0T2ZTZXF1ZW5jZUJ1ZmZlcnMuY2xlYXIoKTsKICAgICByZXR1cm4gcmM7CiB9CiAKQEAgLTEzNDMsMjQgKzE0MzEsMjkgQEAKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODg6CiAgICAgICAgICAgICBpZihzdHJlYW0tPnN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX0lOUFVUKXsKICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UOwotICAgICAgICAgICAgICAgIHN0cmVhbUZvcm1hdCA9IGdldFN0cmVhbURlZmF1bHRGb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1Gb3JtYXQgPSBnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+d2lkdGgsIHN0cmVhbS0+aGVpZ2h0KTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSzsKLSAgICAgICAgICAgICAgICBzdHJlYW1Gb3JtYXQgPSBnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSyk7CisgICAgICAgICAgICAgICAgc3RyZWFtRm9ybWF0ID0gZ2V0U3RyZWFtRGVmYXVsdEZvcm1hdChDQU1fU1RSRUFNX1RZUEVfQ0FMTEJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPndpZHRoLCBzdHJlYW0tPmhlaWdodCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6CiAgICAgICAgICAgICBpZiAoc3RyZWFtLT51c2FnZSAmIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUikgewogICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBDQU1fU1RSRUFNX1RZUEVfVklERU87Ci0gICAgICAgICAgICAgICAgc3RyZWFtRm9ybWF0ID0gZ2V0U3RyZWFtRGVmYXVsdEZvcm1hdChDQU1fU1RSRUFNX1RZUEVfVklERU8pOworICAgICAgICAgICAgICAgIHN0cmVhbUZvcm1hdCA9IGdldFN0cmVhbURlZmF1bHRGb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX1ZJREVPLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT53aWR0aCwgc3RyZWFtLT5oZWlnaHQpOwogICAgICAgICAgICAgfSBlbHNlIGlmKHN0cmVhbS0+c3RyZWFtX3R5cGUgPT0gQ0FNRVJBM19TVFJFQU1fSU5QVVQgfHwKICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5zdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9CSURJUkVDVElPTkFMIHx8CiAgICAgICAgICAgICAgICAgICAgIElTX1VTQUdFX1pTTChzdHJlYW0tPnVzYWdlKSl7CiAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVDsKLSAgICAgICAgICAgICAgICBzdHJlYW1Gb3JtYXQgPSBnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCk7CisgICAgICAgICAgICAgICAgc3RyZWFtRm9ybWF0ID0gZ2V0U3RyZWFtRGVmYXVsdEZvcm1hdChDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPndpZHRoLCBzdHJlYW0tPmhlaWdodCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzsKLSAgICAgICAgICAgICAgICBzdHJlYW1Gb3JtYXQgPSBnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1Gb3JtYXQgPSBnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT53aWR0aCwgc3RyZWFtLT5oZWlnaHQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVdfT1BBUVVFOgpAQCAtMTU1MSw4ICsxNjQ0LDggQEAKICAgICAgICAgICAgICAgICAoZG91YmxlKShzMm5zKDEpKSkgLyAoZG91YmxlKWRpZmY7CiAgICAgICAgIHN3aXRjaChzdHJlYW1UeXBlKSB7CiAgICAgICAgICAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXOgotICAgICAgICAgICAgICAgIExPR0goIlBST0ZJTEVfUFJFVklFV19GUkFNRVNfUEVSX1NFQ09ORCA6ICUuNGYiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZwcyk7CisgICAgICAgICAgICAgICAgTE9HSCgiUFJPRklMRV9QUkVWSUVXX0ZSQU1FU19QRVJfU0VDT05EIDogJS40ZjogbUZyYW1lQ291bnQ9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZwcywgbUZyYW1lQ291bnQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfVklERU86CiAgICAgICAgICAgICAgICAgTE9HSCgiUFJPRklMRV9WSURFT19GUkFNRVNfUEVSX1NFQ09ORCA6ICUuNGYiLApAQCAtMTYzOSwxNSArMTczMiwxNiBAQAogICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAogICAgICAgICBjaGFubmVsX2NiX3JvdXRpbmUgY2Jfcm91dGluZSwKKyAgICAgICAgY2hhbm5lbF9jYl9idWZmZXJfZXJyIGNiX2J1ZmZlcl9lcnIsCiAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sCiAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAogICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpzdHJlYW0sCiAgICAgICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlLAotICAgICAgICB1aW50MzJfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKICAgICAgICAgUUNhbWVyYTNDaGFubmVsICptZXRhZGF0YUNoYW5uZWwsCiAgICAgICAgIHVpbnQzMl90IG51bUJ1ZmZlcnMpIDoKICAgICAgICAgICAgIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwoY2FtX2hhbmRsZSwgY2hhbm5lbF9oYW5kbGUsIGNhbV9vcHMsCi0gICAgICAgICAgICAgICAgICAgIGNiX3JvdXRpbmUsIHBhZGRpbmdJbmZvLCB1c2VyRGF0YSwgc3RyZWFtLCBzdHJlYW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgY2Jfcm91dGluZSwgY2JfYnVmZmVyX2VyciwgcGFkZGluZ0luZm8sIHVzZXJEYXRhLCBzdHJlYW0sIHN0cmVhbV90eXBlLAogICAgICAgICAgICAgICAgICAgICBwb3N0cHJvY2Vzc19tYXNrLCBtZXRhZGF0YUNoYW5uZWwsIG51bUJ1ZmZlcnMpLAogICAgICAgICAgICAgbUJhdGNoU2l6ZSgwKSwKICAgICAgICAgICAgIG1Sb3RhdGlvbihST1RBVEVfMCkKQEAgLTE4MzYsNyArMTkzMCw3IEBACiAgKiAgICAgICAgICAgICAgLUVJTlZBTCBvbiBpbnZhbGlkIGlucHV0CiAgKiAgICAgICAgICAgICAgLUVOT0RFViBvbiBzZXJpb3VzIGVycm9yCiAgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludDMyX3QgUUNhbWVyYTNSZWd1bGFyQ2hhbm5lbDo6cmVxdWVzdChidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgdWludDMyX3QgZnJhbWVOdW1iZXIpCitpbnQzMl90IFFDYW1lcmEzUmVndWxhckNoYW5uZWw6OnJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIHVpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQgJmluZGV4VXNlZCkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIC8vRklYIE1FOiBSZXR1cm4gYnVmZmVyIGJhY2sgaW4gY2FzZSBvZiBmYWlsdXJlcyBiZWxvdy4KQEAgLTE4ODEsMTMgKzE5NzUsMTkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHJjID0gbU1lbW9yeS5tYXJrRnJhbWVOdW1iZXIoKHVpbnQzMl90KWluZGV4LCBmcmFtZU51bWJlcik7CisgICAgaWYocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIG1hcmsgRnJhbWVOdW1iZXI6JWQsaWR4OiVkIixmcmFtZU51bWJlcixpbmRleCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CiAgICAgcmMgPSBtU3RyZWFtc1swXS0+YnVmRG9uZSgodWludDMyX3QpaW5kZXgpOwogICAgIGlmKHJjICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIExPR0UoIkZhaWxlZCB0byBRIG5ldyBidWZmZXIgdG8gc3RyZWFtIik7CisgICAgICAgIG1NZW1vcnkubWFya0ZyYW1lTnVtYmVyKGluZGV4LCAtMSk7CiAgICAgICAgIHJldHVybiByYzsKICAgICB9CiAKLSAgICByYyA9IG1NZW1vcnkubWFya0ZyYW1lTnVtYmVyKCh1aW50MzJfdClpbmRleCwgZnJhbWVOdW1iZXIpOworICAgIGluZGV4VXNlZCA9IGluZGV4OwogICAgIHJldHVybiByYzsKIH0KIApAQCAtMTkxMCwxMSArMjAxMCwxMiBAQAogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2NiX3JvdXRpbmUgY2Jfcm91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jYl9idWZmZXJfZXJyIGNiX2J1ZmZlcl9lcnIsCiAgICAgICAgICAgICAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBvc3Rwcm9jZXNzX21hc2ssCisgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAogICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwgdWludDMyX3QgbnVtQnVmZmVycykgOgogICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYTNDaGFubmVsKGNhbV9oYW5kbGUsIGNoYW5uZWxfaGFuZGxlLCBjYW1fb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9yb3V0aW5lLCBwYWRkaW5nSW5mbywgcG9zdHByb2Nlc3NfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jfcm91dGluZSwgY2JfYnVmZmVyX2VyciwgcGFkZGluZ0luZm8sIHBvc3Rwcm9jZXNzX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhLCBudW1CdWZmZXJzKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1NZW1vcnkoTlVMTCkKIHsKQEAgLTE5NTUsNyArMjA1Niw4IEBACiB9CiAKIGludDMyX3QgUUNhbWVyYTNNZXRhZGF0YUNoYW5uZWw6OnJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICogLypidWZmZXIqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IC8qZnJhbWVOdW1iZXIqLykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IC8qZnJhbWVOdW1iZXIqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgIC8qaW5kZXhVc2VkKi8pCiB7CiAgICAgaWYgKCFtX2JJc0FjdGl2ZSkgewogICAgICAgICByZXR1cm4gc3RhcnQoKTsKQEAgLTIwMTYsMTQgKzIxMTgsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtX29wcywKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jYl9yb3V0aW5lIGNiX3JvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY2JfYnVmZmVyX2VyciBjYl9idWZmZXJfZXJyLAogICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAogICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fdCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYTNDaGFubmVsICptZXRhZGF0YUNoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmF3XzE2LCB1aW50MzJfdCBudW1CdWZmZXJzKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM1JlZ3VsYXJDaGFubmVsKGNhbV9oYW5kbGUsIGNoYW5uZWxfaGFuZGxlLCBjYW1fb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9yb3V0aW5lLCBwYWRkaW5nSW5mbywgdXNlckRhdGEsIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jfcm91dGluZSwgY2JfYnVmZmVyX2VyciwgcGFkZGluZ0luZm8sIHVzZXJEYXRhLCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9SQVcsIHBvc3Rwcm9jZXNzX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQ2hhbm5lbCwgbnVtQnVmZmVycyksCiAgICAgICAgICAgICAgICAgICAgICAgICBtSXNSYXcxNihyYXdfMTYpCkBAIC0yMDY1LDggKzIxNjgsOSBAQAogICAgICAgICBkdW1wUmF3U25hcHNob3Qoc3VwZXJfZnJhbWUtPmJ1ZnNbMF0pOwogCiAgICAgaWYgKG1Jc1JhdzE2KSB7Ci0gICAgICAgIGlmIChnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KENBTV9TVFJFQU1fVFlQRV9SQVcpID09Ci0gICAgICAgICAgICAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMEJQUF9HQlJHKQorICAgICAgICBjYW1fZm9ybWF0X3Qgc3RyZWFtRm9ybWF0ID0gZ2V0U3RyZWFtRGVmYXVsdEZvcm1hdChDQU1fU1RSRUFNX1RZUEVfUkFXLAorICAgICAgICAgICAgICAgIG1DYW1lcmEzU3RyZWFtLT53aWR0aCwgbUNhbWVyYTNTdHJlYW0tPmhlaWdodCk7CisgICAgICAgIGlmIChzdHJlYW1Gb3JtYXQgPT0gQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMEJQUF9HQlJHKQogICAgICAgICAgICAgY29udmVydE1pcGlUb1JhdzE2KHN1cGVyX2ZyYW1lLT5idWZzWzBdKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgY29udmVydExlZ2FjeVRvUmF3MTYoc3VwZXJfZnJhbWUtPmJ1ZnNbMF0pOwpAQCAtMjI0MCw5ICsyMzQ0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90IHJhd0R1bXBTaXplLAogICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAogICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG9zdHByb2Nlc3NfbWFzaywgdWludDMyX3QgbnVtQnVmZmVycykgOgorICAgICAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywgdWludDMyX3QgbnVtQnVmZmVycykgOgogICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYTNDaGFubmVsKGNhbV9oYW5kbGUsIGNoYW5uZWxfaGFuZGxlLCBjYW1fb3BzLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nSW5mbywgcG9zdHByb2Nlc3NfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgcGFkZGluZ0luZm8sIHBvc3Rwcm9jZXNzX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhLCBudW1CdWZmZXJzKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1EaW0ocmF3RHVtcFNpemUpLAogICAgICAgICAgICAgICAgICAgICAgICAgbU1lbW9yeShOVUxMKQpAQCAtMjI5OSwxNCArMjQwMywxNSBAQAogCiAgICAgICAgIGlmIChOVUxMICE9IHRpbWVpbmZvKSB7CiAgICAgICAgICAgICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAvKiBDb25zaXN0ZW50IG5hbWluZyBmb3IgSnBlZyttZXRhK3JhdzogUmF3IG5hbWUgKi8KICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCiAgICAgICAgICAgICAgICAgICAgIFFDQU1FUkFfRFVNUF9GUk1fTE9DQVRJT04KLSAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkLSUwMmQtJTAyZC0lMDJkLSUwNmxkXyVkXyVkeCVkLnJhdyIsCisgICAgICAgICAgICAgICAgICAgICJJTUdfJTA0ZCUwMmQlMDJkXyUwMmQlMDJkJTAyZF8lZHglZC5yYXciLAogICAgICAgICAgICAgICAgICAgICB0aW1laW5mby0+dG1feWVhciArIDE5MDAsIHRpbWVpbmZvLT50bV9tb24gKyAxLAogICAgICAgICAgICAgICAgICAgICB0aW1laW5mby0+dG1fbWRheSwgdGltZWluZm8tPnRtX2hvdXIsCi0gICAgICAgICAgICAgICAgICAgIHRpbWVpbmZvLT50bV9taW4sIHRpbWVpbmZvLT50bV9zZWMsdHYudHZfdXNlYywKLSAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmZyYW1lX2lkeCwgZGltLndpZHRoLCBkaW0uaGVpZ2h0KTsKLQorICAgICAgICAgICAgICAgICAgICB0aW1laW5mby0+dG1fbWluLCB0aW1laW5mby0+dG1fc2VjLAorICAgICAgICAgICAgICAgICAgICBkaW0ud2lkdGgsIGRpbS5oZWlnaHQpOworICAgICAgICAgICAgLyogQ29uc2lzdGVudCBuYW1pbmcgZm9yIEpwZWcrbWV0YStyYXc6IFJhdyBuYW1lIGVuZCovCiAgICAgICAgICAgICBpbnQgZmlsZV9mZCA9IG9wZW4oYnVmLCBPX1JEV1J8IE9fQ1JFQVQsIDA3NzcpOwogICAgICAgICAgICAgaWYgKGZpbGVfZmQgPj0gMCkgewogICAgICAgICAgICAgICAgIHNzaXplX3Qgd3JpdHRlbl9sZW4gPQpAQCAtMjQxNiw3ICsyNTIxLDggQEAKICAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCiAgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIGludDMyX3QgUUNhbWVyYTNSYXdEdW1wQ2hhbm5lbDo6cmVxdWVzdChidWZmZXJfaGFuZGxlX3QgKiAvKmJ1ZmZlciovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgLypmcmFtZU51bWJlciovKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgLypmcmFtZU51bWJlciovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICYgLyppbmRleFVzZWQqLykKIHsKICAgICBpZiAoIW1fYklzQWN0aXZlKSB7CiAgICAgICAgIHJldHVybiBRQ2FtZXJhM0NoYW5uZWw6OnN0YXJ0KCk7CkBAIC0yNDc0LDE0ICsyNTgwLDE1IEBACiAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxfaGFuZGxlLAogICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCiAgICAgICAgIGNoYW5uZWxfY2Jfcm91dGluZSBjYl9yb3V0aW5lLAorICAgICAgICBjaGFubmVsX2NiX2J1ZmZlcl9lcnIgY2JfYnVmX2VyciwKICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKICAgICAgICAgdm9pZCAqdXNlckRhdGEsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbSwKICAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUsCi0gICAgICAgIHVpbnQzMl90IHBvc3Rwcm9jZXNzX21hc2ssCisgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAogICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKm1ldGFkYXRhQ2hhbm5lbCkgOgogICAgICAgICAgICAgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbChjYW1faGFuZGxlLCBjaGFubmVsX2hhbmRsZSwgY2FtX29wcywKLSAgICAgICAgICAgICAgICAgICAgY2Jfcm91dGluZSwgcGFkZGluZ0luZm8sIHVzZXJEYXRhLCBzdHJlYW0sIHN0cmVhbV90eXBlLAorICAgICAgICAgICAgICAgICAgICBjYl9yb3V0aW5lLCBjYl9idWZfZXJyLCBwYWRkaW5nSW5mbywgdXNlckRhdGEsIHN0cmVhbSwgc3RyZWFtX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgIHBvc3Rwcm9jZXNzX21hc2ssIG1ldGFkYXRhQ2hhbm5lbCkKIHsKIApAQCAtMjUzOCw3ICsyNjQ1LDggQEAKICAgICB9CiAKICAgICBtSXNUeXBlICA9IGlzVHlwZTsKLSAgICBtU3RyZWFtRm9ybWF0ID0gZ2V0U3RyZWFtRGVmYXVsdEZvcm1hdChDQU1fU1RSRUFNX1RZUEVfQ0FMTEJBQ0spOworICAgIG1TdHJlYW1Gb3JtYXQgPSBnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSywKKyAgICAgICAgICAgIG1DYW1lcmEzU3RyZWFtLT53aWR0aCwgbUNhbWVyYTNTdHJlYW0tPmhlaWdodCk7CiAgICAgc3RyZWFtRGltLndpZHRoID0gbUNhbWVyYTNTdHJlYW0tPndpZHRoOwogICAgIHN0cmVhbURpbS5oZWlnaHQgPSBtQ2FtZXJhM1N0cmVhbS0+aGVpZ2h0OwogCkBAIC0yNjA2LDcgKzI3MTQsOCBAQAogaW50MzJfdCBRQ2FtZXJhM1lVVkNoYW5uZWw6OnJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsCiAgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyLAogICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCogcElucHV0QnVmZmVyLAotICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCogbWV0YWRhdGEsIGJvb2wgJm5lZWRNZXRhZGF0YSkKKyAgICAgICAgbWV0YWRhdGFfYnVmZmVyX3QqIG1ldGFkYXRhLCBib29sICZuZWVkTWV0YWRhdGEsCisgICAgICAgIGludCAmaW5kZXhVc2VkKQogewogICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtT2ZmbGluZVBwTG9jayk7CkBAIC0yNjMyLDcgKzI3NDEsNyBAQAogICAgIGlmICghcHBJbmZvLm9mZmxpbmVQcEZsYWcpIHsKICAgICAgICAgLy8gcmVndWxhciByZXF1ZXN0CiAgICAgICAgIHJldHVybiBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsOjpyZXF1ZXN0KGJ1ZmZlciwgZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgcElucHV0QnVmZmVyLCBtZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgcElucHV0QnVmZmVyLCBtZXRhZGF0YSwgaW5kZXhVc2VkKTsKICAgICB9IGVsc2UgewogICAgICAgICBpZighbV9iSXNBY3RpdmUpIHsKICAgICAgICAgICAgIHJjID0gc3RhcnQoKTsKQEAgLTI2NzIsNiArMjc4MSw3IEBACiAgICAgICAgIExPR0QoImVyYXNpbmcgJWQiLCBidWZJZHgpOwogCiAgICAgICAgIG1NZW1vcnkubWFya0ZyYW1lTnVtYmVyKGJ1ZklkeCwgZnJhbWVOdW1iZXIpOworICAgICAgICBpbmRleFVzZWQgPSBidWZJZHg7CiAgICAgICAgIG1TdHJlYW1zWzBdLT5idWZEb25lKGJ1ZklkeCk7CiAKICAgICB9CkBAIC0yNzI3LDYgKzI4MzcsMTEgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIGlmIChJU19CVUZGRVJfRVJST1Ioc3VwZXJfZnJhbWUtPmJ1ZnNbMF0tPmZsYWdzKSkgeworICAgICAgICAgICAgbUNoYW5uZWxDYkJ1ZkVycih0aGlzLCByZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IsIG1Vc2VyRGF0YSk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAocHBJbmZvLT5vZmZsaW5lUHBGbGFnKSB7CiAgICAgICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lID0KICAgICAgICAgICAgICAgICAgICAgKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqKW1hbGxvYyhzaXplb2YobW1fY2FtZXJhX3N1cGVyX2J1Zl90KSk7CkBAIC0yOTA4LDcgKzMwMjMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgYnVmZmVySW5kZXgsIHJlc3VsdEZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKyAgICAgICAgbU1lbW9yeS5tYXJrRnJhbWVOdW1iZXIoYnVmZmVySW5kZXgsIC0xKTsKICAgICAgICAgbUZyZWVIZWFwQnVmZmVyTGlzdC5wdXNoX2JhY2soYnVmZmVySW5kZXgpOworICAgICAgICAvL01vdmUgaGVhcCBidWZmZXIgaW50byBmcmVlIHBvb2wgYW5kIGludmFsaWRhdGUgdGhlIGZyYW1lIG51bWJlcgogICAgICAgICBwcEluZm8gPSBtT2ZmbGluZVBwSW5mb0xpc3QuZXJhc2UocHBJbmZvKTsKIAogICAgICAgICAvLyBSZXR1cm4gcGVuZGluZyBidWZmZXIgY2FsbGJhY2tzCkBAIC0zMDIyLDYgKzMxMzksNDMgQEAKICAgICAgICAgICAgICAgICAgICAgY2hhciAqanBlZ19lb2YgPSAmanBlZ19idWZbanBlZ19lb2Zfb2Zmc2V0XTsKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGpwZWdfZW9mLCAmanBlZ0hlYWRlciwgc2l6ZW9mKGpwZWdIZWFkZXIpKTsKICAgICAgICAgICAgICAgICAgICAgb2JqLT5tTWVtb3J5LmNsZWFuSW52YWxpZGF0ZUNhY2hlKGJ1ZklkeCk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wganBlZ0R1bXAgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuanBlZy5kdW1wIiwgcHJvcCwgIjAiKTsKKyAgICAgICAgICAgICAgICAgICAganBlZ0R1bXAgPSBhdG9pKHByb3ApOworICAgICAgICAgICAgICAgICAgICBpZiAoanBlZ0R1bXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmW0ZJTEVOQU1FX01BWF07CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHRpbWVCdWZbRklMRU5BTUVfTUFYXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCh0aW1lQnVmLCAwLCBzaXplb2YodGltZUJ1ZikpOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZV90IGN1cnJlbnRfdGltZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0bSAqIHRpbWVpbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgdGltZSAoJmN1cnJlbnRfdGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1laW5mbyA9IGxvY2FsdGltZSAoJmN1cnJlbnRfdGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZWluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnNpc3RlbnQgbmFtaW5nIGZvciBKcGVnK21ldGErcmF3OiBtZXRhIG5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJmdGltZSAodGltZUJ1Ziwgc2l6ZW9mKHRpbWVCdWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNBTUVSQV9EVU1QX0ZSTV9MT0NBVElPTiJJTUdfJVklbSVkXyVIJU0lUyIsIHRpbWVpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb25zaXN0ZW50IG5hbWluZyBmb3IgSnBlZyttZXRhK3JhdzogbWV0YSBuYW1lIGVuZCovCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGZpbGVQYXRoKHRpbWVCdWYpOworICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIl8lZC5qcGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmotPm1NZW1vcnkuZ2V0RnJhbWVOdW1iZXIoYnVmSWR4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aC5hcHBlbmQoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlX2ZkID0gb3BlbihmaWxlUGF0aC5zdHJpbmcoKSwgT19SRFdSIHwgT19DUkVBVCwgMDc3Nyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IHdyaXR0ZW5fbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2ZkID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2htb2QoZmlsZV9mZCwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbl9sZW4gKz0gd3JpdGUoZmlsZV9mZCwganBlZ19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KW1heEpwZWdTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dJKCJ3cml0dGVuIG51bWJlciBvZiBieXRlcyAlbGQgYXR0ZW1wdGVkOiAlbGRcbiIsIHdyaXR0ZW5fbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhKcGVnU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoZmlsZV9mZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImZhaWxlZCB0byBvcGVuIGZpbGUgdG8gZHVtcCBpbWFnZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBMT0dFKCJKUEVHIGJ1ZmZlciBub3QgZm91bmQgYW5kIGluZGV4OiAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmSWR4KTsKQEAgLTMxMDksNiArMzI2Myw3IEBACiAgICAgICAgICAgICBmcmVlKGpvYik7CiAgICAgICAgIH0KIAorICAgICAgICBvYmotPnJlc2V0Q3BwUGVyZlBhcmFtKCk7CiAgICAgICAgIHJldHVybjsKICAgICAgICAgLy8gfQogICAgIH0gZWxzZSB7CkBAIC0zMTIwLDE2ICszMjc1LDE3IEBACiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY2Jfcm91dGluZSBjYl9yb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2NiX2J1ZmZlcl9lcnIgY2JfYnVmX2VyciwKICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG9zdHByb2Nlc3NfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBpczRLVmlkZW8sCisgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICBfX3VudXNlZCBib29sIGlzNEtWaWRlbywKICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0lucHV0U3RyZWFtQ29uZmlndXJlZCwKICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYTNDaGFubmVsICptZXRhZGF0YUNoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bUJ1ZmZlcnMpIDoKICAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwoY2FtX2hhbmRsZSwgY2hhbm5lbF9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9vcHMsIGNiX3JvdXRpbmUsIHBhZGRpbmdJbmZvLCB1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX29wcywgY2Jfcm91dGluZSwgY2JfYnVmX2VyciwgcGFkZGluZ0luZm8sIHVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHByb2Nlc3NfbWFzaywgbWV0YWRhdGFDaGFubmVsLCBudW1CdWZmZXJzKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1TbmFwc2hvdEJ1ZnMoMCksCkBAIC0zMTQyLDEwICszMjk4LDEwIEBACiAgICAgbVl1dldpZHRoID0gc3RyZWFtLT53aWR0aDsKICAgICBtWXV2SGVpZ2h0ID0gc3RyZWFtLT5oZWlnaHQ7CiAgICAgbVN0cmVhbVR5cGUgPSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q7CisgICAgbVBlbmRpbmdMaXZlU25hcHNob3RGcmFtZXMgPSAwOwogICAgIC8vIFVzZSBzYW1lIHBpeGVsZm9ybWF0IGZvciA0SyB2aWRlbyBjYXNlCi0gICAgbVN0cmVhbUZvcm1hdCA9IGlzNEtWaWRlbyA/Ci0gICAgICAgICAgICBnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KENBTV9TVFJFQU1fVFlQRV9WSURFTykKLSAgICAgICAgICAgIDpnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCk7CisgICAgbVN0cmVhbUZvcm1hdCA9IGdldFN0cmVhbURlZmF1bHRGb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9ULAorICAgICAgICAgICAgc3RyZWFtLT53aWR0aCwgc3RyZWFtLT5oZWlnaHQpOwogICAgIGludDMyX3QgcmMgPSBtX3Bvc3Rwcm9jZXNzb3IuaW5pdEpwZWcoanBlZ0V2dEhhbmRsZSwgJm1fbWF4X3BpY19kaW0sIHRoaXMpOwogICAgIGlmIChyYyAhPSAwKSB7CiAgICAgICAgIExPR0UoIkluaXQgUG9zdHByb2Nlc3NvciBmYWlsZWQiKTsKQEAgLTMyNTksNyArMzQxNSw3IEBACiBpbnQzMl90IFFDYW1lcmEzUGljQ2hhbm5lbDo6cmVxdWVzdChidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwKICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpwSW5wdXRCdWZmZXIsCi0gICAgICAgIG1ldGFkYXRhX2J1ZmZlcl90ICptZXRhZGF0YSkKKyAgICAgICAgbWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhLCBpbnQgJmluZGV4VXNlZCkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIC8vRklYIE1FOiBSZXR1cm4gYnVmZmVyIGJhY2sgaW4gY2FzZSBvZiBmYWlsdXJlcyBiZWxvdy4KQEAgLTMzMDQsNiArMzQ2MCwxMSBAQAogICAgIC8vIFN0YXJ0IHBvc3Rwcm9jZXNzb3IKICAgICBzdGFydFBvc3RQcm9jKHJlcHJvY19jZmcpOwogCisgICAgLy8gT25seSBzZXQgdGhlIHBlcmYgbW9kZSBmb3Igb25saW5lIGNwcCBwcm9jZXNzaW5nCisgICAgaWYgKHJlcHJvY19jZmcucmVwcm9jZXNzX3R5cGUgPT0gUkVQUk9DRVNTX1RZUEVfTk9ORSkgeworICAgICAgICBzZXRDcHBQZXJmUGFyYW0oKTsKKyAgICB9CisKICAgICAvLyBRdWV1ZSBqcGVnIHNldHRpbmdzCiAgICAgcmMgPSBxdWV1ZUpwZWdTZXR0aW5nKCh1aW50MzJfdClpbmRleCwgbWV0YWRhdGEpOwogCkBAIC0zMzI1LDYgKzM0ODYsNyBAQAogICAgICAgICB9CiAgICAgICAgIG1ZdXZNZW1vcnktPm1hcmtGcmFtZU51bWJlcihidWZJZHgsIGZyYW1lTnVtYmVyKTsKICAgICAgICAgbVN0cmVhbXNbMF0tPmJ1ZkRvbmUoYnVmSWR4KTsKKyAgICAgICAgaW5kZXhVc2VkID0gYnVmSWR4OwogICAgIH0gZWxzZSB7CiAgICAgICAgIHFjYW1lcmFfZndrX2lucHV0X3BwX2RhdGFfdCAqc3JjX2ZyYW1lID0gTlVMTDsKICAgICAgICAgc3JjX2ZyYW1lID0gKHFjYW1lcmFfZndrX2lucHV0X3BwX2RhdGFfdCAqKWNhbGxvYygxLApAQCAtMzQ1MSw2ICszNjEzLDExIEBACiAgICAgc3RyZWFtLT5nZXRGcmFtZU9mZnNldChvZmZzZXQpOwogICAgIGR1bXBZVVYoZnJhbWUtPmJ1ZnNbMF0sIGRpbSwgb2Zmc2V0LCBRQ0FNRVJBX0RVTVBfRlJNX0lOUFVUX1JFUFJPQ0VTUyk7CiAKKyAgICBpZiAoSVNfQlVGRkVSX0VSUk9SKHN1cGVyX2ZyYW1lLT5idWZzWzBdLT5mbGFncykpIHsKKyAgICAgICAgbUNoYW5uZWxDYkJ1ZkVycih0aGlzLCBtWXV2TWVtb3J5LT5nZXRGcmFtZU51bWJlcihmcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IsIG1Vc2VyRGF0YSk7CisgICAgfQorCiAgICAgbV9wb3N0cHJvY2Vzc29yLnByb2Nlc3NEYXRhKGZyYW1lKTsKICAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKICAgICByZXR1cm47CkBAIC0zNTgxLDYgKzM3NDgsODkgQEAKICAgICByZXR1cm4gZXhwZWN0ZWRSZXByb2Nlc3M7CiB9CiAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0Q3BwUGVyZlBhcmFtCisgKgorICogREVTQ1JJUFRJT046IHNldCB0aGUgcGVyZm9ybWFuY2UgcmVsYXRlZCBzdHJlYW0gcGFyYW1zCisgKgorICogUEFSQU1FVEVSUyA6IE5PTkUKKyAqCisgKiBSRVRVUk4gICAgIDogTk9ORQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgUUNhbWVyYTNQaWNDaGFubmVsOjpzZXRDcHBQZXJmUGFyYW0oKQoreworICAgIGlmIChtUGVuZGluZ0xpdmVTbmFwc2hvdEZyYW1lcyA9PSAwKSB7CisgICAgICAgIGludDMyX3QgcmMgPSAwOworICAgICAgICBRQ2FtZXJhM1N0cmVhbSAqcFN0cmVhbSA9IG1TdHJlYW1zWzBdOworICAgICAgICBjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgcGFyYW07CisgICAgICAgIG1lbXNldCgmcGFyYW0sIDAsIHNpemVvZihjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QpKTsKKyAgICAgICAgcGFyYW0udHlwZSA9IENBTV9TVFJFQU1fUEFSQU1fVFlQRV9SRVFVRVNUX09QU19NT0RFOworICAgICAgICBwYXJhbS5wZXJmX21vZGUgPSBDQU1fUEVSRl9TRVQ7CisgICAgICAgIHJjID0gcFN0cmVhbS0+c2V0UGFyYW1ldGVyKHBhcmFtKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCIlczogc2V0UGFyYW1ldGVyIGZvciBDQU1fUEVSRl9TRVQgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICB9CisgICAgbVBlbmRpbmdMaXZlU25hcHNob3RGcmFtZXMrKzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZXNldENwcFBlcmZQYXJhbQorICoKKyAqIERFU0NSSVBUSU9OOiByZXNldCB0aGUgcGVyZm9ybWFuY2UgcmVsYXRlZCBzdHJlYW0gcGFyYW1zCisgKgorICogUEFSQU1FVEVSUyA6IE5PTkUKKyAqCisgKiBSRVRVUk4gICAgIDogTk9ORQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgUUNhbWVyYTNQaWNDaGFubmVsOjpyZXNldENwcFBlcmZQYXJhbSgpCit7CisgICAgaWYgKG1QZW5kaW5nTGl2ZVNuYXBzaG90RnJhbWVzID4gMCkgeworICAgICAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgICAgIFFDYW1lcmEzU3RyZWFtICpwU3RyZWFtID0gbVN0cmVhbXNbMF07CisgICAgICAgIGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCBwYXJhbTsKKyAgICAgICAgbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCkpOworICAgICAgICBwYXJhbS50eXBlID0gQ0FNX1NUUkVBTV9QQVJBTV9UWVBFX1JFUVVFU1RfT1BTX01PREU7CisgICAgICAgIHBhcmFtLnBlcmZfbW9kZSA9IENBTV9QRVJGX1JFU0VUOworICAgICAgICByYyA9IHBTdHJlYW0tPnNldFBhcmFtZXRlcihwYXJhbSk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiJXM6IHNldFBhcmFtZXRlciBmb3IgQ0FNX1BFUkZfUkVTRVQgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICAgICAgbVBlbmRpbmdMaXZlU25hcHNob3RGcmFtZXMtLTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdGltZW91dEZyYW1lCisgKgorICogREVTQ1JJUFRJT046IE1ldGhvZCB0byBpbmRpY2F0ZSB0byBjaGFubmVsIHRoYXQgYSBnaXZlbiBmcmFtZSBoYXMgdGFrZSB0b28KKyAqICAgICAgICAgICAgICBsb25nIHRvIGJlIGdlbmVyYXRlZAorICoKKyAqIFBBUkFNRVRFUlMgOiBmcmFtZW51bWJlciBpbmRpY2F0aW5nIHRoZSBmcmFtZW51bWJlciBvZiB0aGUgYnVmZmVyIHRpbWluZ291dAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNQaWNDaGFubmVsOjp0aW1lb3V0RnJhbWUodWludDMyX3QgZnJhbWVOdW1iZXIpCit7CisgICAgaW50MzJfdCBidWZJZHg7CisKKyAgICBidWZJZHggPSBtWXV2TWVtb3J5LT5nZXRCdWZmZXJJbmRleChmcmFtZU51bWJlcik7CisKKyAgICBpZiAoYnVmSWR4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEJ1ZmZlciBub3QgZm91bmQgZm9yIGZyYW1lOiVkIiwgX19mdW5jX18sIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1TdHJlYW1zWzBdLT50aW1lb3V0RnJhbWUoYnVmSWR4KTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhM1JlcHJvY2Vzc0NoYW5uZWwKQEAgLTM1OTgsMTMgKzM4NDgsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jYl9yb3V0aW5lIGNiX3JvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jYl9idWZmZXJfZXJyIGNiX2J1Zl9lcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLCB2b2lkICpjaF9oZGwpIDoKICAgICAvKiBJbiBjYXNlIG9mIGZyYW1ld29yayByZXByb2Nlc3NpbmcsIHBwcm9jIGFuZCBqcGVnIG9wZXJhdGlvbnMgY291bGQgYmUKICAgICAgKiBwYXJhbGxlbGl6ZWQgYnkgYWxsb3dpbmcgMSBleHRyYSBidWZmZXIgZm9yIHJlcHJvY2Vzc2luZyBvdXRwdXQ6CiAgICAgICogY2hfaGRsLT5nZXROdW1CdWZmZXJzKCkgKyAxICovCi0gICAgUUNhbWVyYTNDaGFubmVsKGNhbV9oYW5kbGUsIGNoYW5uZWxfaGFuZGxlLCBjYW1fb3BzLCBjYl9yb3V0aW5lLCBwYWRkaW5nSW5mbywKKyAgICBRQ2FtZXJhM0NoYW5uZWwoY2FtX2hhbmRsZSwgY2hhbm5lbF9oYW5kbGUsIGNhbV9vcHMsIGNiX3JvdXRpbmUsIGNiX2J1Zl9lcnIsIHBhZGRpbmdJbmZvLAogICAgICAgICAgICAgICAgICAgICBwb3N0cHJvY2Vzc19tYXNrLCB1c2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgKChRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsICopY2hfaGRsKS0+Z2V0TnVtQnVmZmVycygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChNQVhfUkVQUk9DRVNTX1BJUEVMSU5FX1NUQUdFUyAtIDEpKSwKQEAgLTM3OTYsOCArNDA0Nyw4IEBACiAgICAgICAgICAgICBvYmotPm1fcG9zdHByb2Nlc3Nvci5yZWxlYXNlUFBKb2JEYXRhKHBwX2pvYik7CiAgICAgICAgIH0KICAgICAgICAgZnJlZShwcF9qb2IpOwotICAgICAgICByZXNldFRvQ2FtUGVyZk5vcm1hbChyZXN1bHRGcmFtZU51bWJlcik7CiAgICAgfQorICAgIHJlc2V0VG9DYW1QZXJmTm9ybWFsKHJlc3VsdEZyYW1lTnVtYmVyKTsKICAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKICAgICByZXR1cm47CiB9CkBAIC00MTU5LDYgKzQ0MTAsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoanBlZ19zZXR0aW5ncy0+anBlZ19vcmllbnRhdGlvbiA9PSAyNzApIHsKICAgICAgICAgICAgICAgICAgICByb3RhdGlvbl9pbmZvLnJvdGF0aW9uID0gUk9UQVRFXzI3MDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcm90YXRpb25faW5mby5kZXZpY2Vfcm90YXRpb24gPSBST1RBVEVfMDsKICAgICAgICAgICAgICAgICByb3RhdGlvbl9pbmZvLnN0cmVhbUlkID0gbVN0cmVhbXNbMF0tPmdldE15U2VydmVySUQoKTsKICAgICAgICAgICAgICAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1ldGEsIENBTV9JTlRGX1BBUk1fUk9UQVRJT04sIHJvdGF0aW9uX2luZm8pOwogICAgICAgICAgICAgfQpAQCAtNDM4NiwxMiArNDYzOCwxNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICByYyA9IG1HcmFsbG9jTWVtb3J5Lm1hcmtGcmFtZU51bWJlcihpbmRleCwgZnJhbWUtPmZyYW1lTnVtYmVyKTsKKyAgICAgICAgaWYocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBtYXJrIGZyYW1lIzolZCwgaW5kZXg6JWQiLGZyYW1lLT5mcmFtZU51bWJlcixpbmRleCk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KICAgICAgICAgcmMgPSBwU3RyZWFtLT5idWZEb25lKGluZGV4KTsKICAgICAgICAgaWYocmMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBRIG5ldyBidWZmZXIgdG8gc3RyZWFtIik7CisgICAgICAgICAgICBtR3JhbGxvY01lbW9yeS5tYXJrRnJhbWVOdW1iZXIoaW5kZXgsIC0xKTsKICAgICAgICAgICAgIHJldHVybiByYzsKICAgICAgICAgfQotICAgICAgICByYyA9IG1HcmFsbG9jTWVtb3J5Lm1hcmtGcmFtZU51bWJlcihpbmRleCwgZnJhbWUtPmZyYW1lTnVtYmVyKTsKIAogICAgIH0gZWxzZSBpZiAobVJlcHJvY2Vzc1R5cGUgPT0gUkVQUk9DRVNTX1RZUEVfSlBFRykgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRnJlZUJ1ZmZlcnNMb2NrKTsKQEAgLTQ0MjYsNyArNDY4Myw4IEBACiAgICAgcmMgPSBwU3RyZWFtLT5tYXBCdWYoCiAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX0lOUFVUX0JVRiwKICAgICAgICAgICAgIGJ1Zl9pZHgsIC0xLAotICAgICAgICAgICAgZnJhbWUtPmlucHV0X2J1ZmZlci5mZCwgZnJhbWUtPmlucHV0X2J1ZmZlci5mcmFtZV9sZW4pOworICAgICAgICAgICAgZnJhbWUtPmlucHV0X2J1ZmZlci5mZCwgZnJhbWUtPmlucHV0X2J1ZmZlci5idWZmZXIsCisgICAgICAgICAgICBmcmFtZS0+aW5wdXRfYnVmZmVyLmZyYW1lX2xlbik7CiAgICAgaWYgKE5PX0VSUk9SID09IHJjKSB7CiAgICAgICAgIG1hcHBlZEJ1ZmZlci5pbmRleCA9IGJ1Zl9pZHg7CiAgICAgICAgIG1hcHBlZEJ1ZmZlci5zdHJlYW0gPSBwU3RyZWFtOwpAQCAtNDQ0NSw3ICs0NzAzLDggQEAKICAgICByYyB8PSBwU3RyZWFtLT5tYXBCdWYoCiAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX01FVEFfQlVGLAogICAgICAgICAgICAgbWV0YV9idWZfaWR4LCAtMSwKLSAgICAgICAgICAgIGZyYW1lLT5tZXRhZGF0YV9idWZmZXIuZmQsIGZyYW1lLT5tZXRhZGF0YV9idWZmZXIuZnJhbWVfbGVuKTsKKyAgICAgICAgICAgIGZyYW1lLT5tZXRhZGF0YV9idWZmZXIuZmQsIGZyYW1lLT5tZXRhZGF0YV9idWZmZXIuYnVmZmVyLAorICAgICAgICAgICAgZnJhbWUtPm1ldGFkYXRhX2J1ZmZlci5mcmFtZV9sZW4pOwogICAgIGlmIChOT19FUlJPUiA9PSByYykgewogICAgICAgICBtYXBwZWRCdWZmZXIuaW5kZXggPSBtZXRhX2J1Zl9pZHg7CiAgICAgICAgIG1hcHBlZEJ1ZmZlci5zdHJlYW0gPSBwU3RyZWFtOwpAQCAtNDQ1OSw3ICs0NzE4LDcgQEAKICAgICAgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90IHBhcmFtOwogICAgICAgICB1aW50MzJfdCBudW1QZW5kaW5nUHJpb3JpdHlGcmFtZXMgPSAwOwogCi0gICAgICAgIGlmKGlzUHJpb3JpdHlGcmFtZSAmJiAobVJlcHJvY2Vzc1R5cGUgIT0gUkVQUk9DRVNTX1RZUEVfSlBFRykpIHsKKyAgICAgICAgaWYoaXNQcmlvcml0eUZyYW1lKSB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtUHJpb3JpdHlGcmFtZXNMb2NrKTsKICAgICAgICAgICAgIC8qIHJlYWQgdGhlIGxlbmd0aCBiZWZvcmUgcHVzaGluZyB0aGUgZnJhbWUgbnVtYmVyIHRvIGNoZWNrIGlmCiAgICAgICAgICAgICAgKiB2ZWN0b3IgaXMgZW1wdHkgKi8KQEAgLTQ0NjcsMTIgKzQ3MjYsMTIgQEAKICAgICAgICAgICAgIG1Qcmlvcml0eUZyYW1lcy5wdXNoKGZyYW1lLT5mcmFtZU51bWJlcik7CiAgICAgICAgIH0KIAotICAgICAgICBpZihpc1ByaW9yaXR5RnJhbWUgJiYgIW51bVBlbmRpbmdQcmlvcml0eUZyYW1lcyAmJgotICAgICAgICAgICAgKG1SZXByb2Nlc3NUeXBlICE9IFJFUFJPQ0VTU19UWVBFX0pQRUcpKSB7CisgICAgICAgIGlmKGlzUHJpb3JpdHlGcmFtZSAmJiAhbnVtUGVuZGluZ1ByaW9yaXR5RnJhbWVzKSB7CiAgICAgICAgICAgICBtZW1zZXQoJnBhcmFtLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90KSk7CiAgICAgICAgICAgICBwYXJhbS50eXBlID0gQ0FNX1NUUkVBTV9QQVJBTV9UWVBFX1JFUVVFU1RfT1BTX01PREU7CiAgICAgICAgICAgICBwYXJhbS5wZXJmX21vZGUgPSBDQU1fUEVSRl9ISUdIX1BFUkZPUk1BTkNFOwogICAgICAgICAgICAgcmMgPSBwU3RyZWFtLT5zZXRQYXJhbWV0ZXIocGFyYW0pOworCiAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHNldFBhcmFtZXRlciBmb3IgQ0FNX1BFUkZfSElHSF9QRVJGT1JNQU5DRSBmYWlsZWQiLAogICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CkBAIC00NTEyLDYgKzQ3NzEsNyBAQAogICoKICAqIFBBUkFNRVRFUlMgOgogICogICBAYnVmX2ZkICAgICA6IGZkIHRvIHRoZSBpbnB1dCBidWZmZXIgdGhhdCBuZWVkcyByZXByb2Nlc3MKKyAqICAgQGJ1ZmZlciAgICAgOiBCdWZmZXIgcHRyCiAgKiAgIEBidWZfbGVuZ2h0IDogbGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIKICAqICAgQHJldF92YWwgICAgOiByZXN1bHQgb2YgcmVwcm9jZXNzLgogICogICAgICAgICAgICAgICAgIEV4YW1wbGU6IENvdWxkIGJlIGZhY2VJRCBpbiBjYXNlIG9mIHJlZ2lzdGVyIGZhY2UgaW1hZ2UuCkBAIC00NTIxLDcgKzQ3ODEsNyBAQAogICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCiAgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQzMl90IFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbDo6ZG9SZXByb2Nlc3MoaW50IGJ1Zl9mZCwgc2l6ZV90IGJ1Zl9sZW5ndGgsCitpbnQzMl90IFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbDo6ZG9SZXByb2Nlc3MoaW50IGJ1Zl9mZCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmX2xlbmd0aCwKICAgICAgICAgaW50MzJfdCAmcmV0X3ZhbCwgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICptZXRhX2ZyYW1lKQogewogICAgIGludDMyX3QgcmMgPSAwOwpAQCAtNDUzOCw3ICs0Nzk4LDcgQEAKICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9udW1TdHJlYW1zOyBpKyspIHsKICAgICAgICAgcmMgPSBtU3RyZWFtc1tpXS0+bWFwQnVmKENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfSU5QVVRfQlVGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX2lkeCwgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfZmQsIGJ1Zl9sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX2ZkLCBidWZmZXIsIGJ1Zl9sZW5ndGgpOwogCiAgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90IHBhcmFtOwpAQCAtNDY1OSwxNCArNDkxOSwxNCBAQAogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAogICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKICAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90ICpkaW0sCiAgICAgICAgICAgICAgICAgICAgIGNhbV9mb3JtYXRfdCBzdHJlYW1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaHdfYW5hbHlzaXNfc3VwcG9ydGVkLAogICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwgdWludDMyX3QgbnVtQnVmZmVycykgOgogICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYTNDaGFubmVsKGNhbV9oYW5kbGUsIGNoYW5uZWxfaGFuZGxlLCBjYW1fb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBwYWRkaW5nSW5mbywgcG9zdHByb2Nlc3NfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgcGFkZGluZ0luZm8sIHBvc3Rwcm9jZXNzX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhLCBudW1CdWZmZXJzKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1NZW1vcnkoTlVMTCkKIHsKQEAgLTQ2NzUsNyArNDkzNSw4IEBACiAgICAgbVN0cmVhbUZvcm1hdCA9IHN0cmVhbUZvcm1hdDsKICAgIC8vIE1ha2UgQW5hbHlzaXMgc2FtZSBhcyBQcmV2aWV3IGZvcm1hdAogICAgaWYgKCFod19hbmFseXNpc19zdXBwb3J0ZWQgJiYgbVN0cmVhbVR5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTKSB7Ci0gICAgICAgIG1TdHJlYW1Gb3JtYXQgPSBnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKTsKKyAgICAgICAgbVN0cmVhbUZvcm1hdCA9IGdldFN0cmVhbURlZmF1bHRGb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcsCisgICAgICAgICAgICAgICAgZGltLT53aWR0aCwgZGltLT5oZWlnaHQpOwogICAgfQogfQogCkBAIC00NzEwLDcgKzQ5NzEsOCBAQAogfQogCiBpbnQzMl90IFFDYW1lcmEzU3VwcG9ydENoYW5uZWw6OnJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICogLypidWZmZXIqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IC8qZnJhbWVOdW1iZXIqLykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IC8qZnJhbWVOdW1iZXIqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmIC8qaW5kZXhVc2VkKi8pCiB7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM0NoYW5uZWwuaCBiL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNDaGFubmVsLmgKaW5kZXggOTM5MTAxYy4uMzI1M2JlYSAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM0NoYW5uZWwuaAorKysgYi9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzQ2hhbm5lbC5oCkBAIC02OSw2ICs2OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmcmFtZV9udW1iZXIsIGJvb2wgaXNJbnB1dEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCit0eXBlZGVmIHZvaWQgKCpjaGFubmVsX2NiX2J1ZmZlcl9lcnIpKFFDYW1lcmEzQ2hhbm5lbCogY2gsIHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKwogY2xhc3MgUUNhbWVyYTNDaGFubmVsCiB7CiBwdWJsaWM6CkBAIC03Niw4ICs4MSw5IEBACiAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAogICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY2Jfcm91dGluZSBjYl9yb3V0aW5lLAorICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY2JfYnVmZmVyX2VyciBjYl9idWZfZXJyLAogICAgICAgICAgICAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sCi0gICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG9zdHByb2Nlc3NfbWFzaywKKyAgICAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwgdWludDMyX3QgbnVtQnVmZmVycyk7CiAgICAgdmlydHVhbCB+UUNhbWVyYTNDaGFubmVsKCk7CiAKQEAgLTk0LDExICsxMDAsMTMgQEAKICAgICB2b2lkIGRlc3Ryb3koKTsKICAgICB2aXJ0dWFsIGludDMyX3QgaW5pdGlhbGl6ZShjYW1faXNfdHlwZV90IGlzVHlwZSkgPSAwOwogICAgIHZpcnR1YWwgaW50MzJfdCByZXF1ZXN0KGJ1ZmZlcl9oYW5kbGVfdCAqIC8qYnVmZmVyKi8sCi0gICAgICAgICAgICAgICAgdWludDMyX3QgLypmcmFtZU51bWJlciovKXsgcmV0dXJuIDA7fTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAvKmZyYW1lTnVtYmVyKi8sCisgICAgICAgICAgICAgICAgaW50ICYvKmluZGV4VXNlZCovKXsgcmV0dXJuIDA7fTsKICAgICB2aXJ0dWFsIGludDMyX3QgcmVxdWVzdChidWZmZXJfaGFuZGxlX3QgKiAvKmJ1ZmZlciovLAogICAgICAgICAgICAgICAgIHVpbnQzMl90IC8qZnJhbWVOdW1iZXIqLywKICAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCogLypwSW5wdXRCdWZmZXIqLywKLSAgICAgICAgICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCogLyptZXRhZGF0YSovKXsgcmV0dXJuIDA7fTsKKyAgICAgICAgICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCogLyptZXRhZGF0YSovLAorICAgICAgICAgICAgICAgIGludCAmIC8qaW5kZXhVc2VkKi8peyByZXR1cm4gMDt9OwogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM1N0cmVhbSAqc3RyZWFtKSA9IDA7CiAKQEAgLTExOCw3ICsxMjYsOSBAQAogICAgIHZvaWQgZHVtcFlVVihtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZSwgY2FtX2RpbWVuc2lvbl90IGRpbSwKICAgICAgICAgICAgIGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3Qgb2Zmc2V0LCB1aW50OF90IG5hbWUpOwogICAgIGJvb2wgaXNVQldDRW5hYmxlZCgpOwotICAgIGNhbV9mb3JtYXRfdCBnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KGNhbV9zdHJlYW1fdHlwZV90IHR5cGUpOworICAgIGNhbV9mb3JtYXRfdCBnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KGNhbV9zdHJlYW1fdHlwZV90IHR5cGUsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKKyAgICB2aXJ0dWFsIGludDMyX3QgdGltZW91dEZyYW1lKF9fdW51c2VkIHVpbnQzMl90IGZyYW1lTnVtYmVyKSA9IDA7CiAKICAgICB2b2lkICptVXNlckRhdGE7CiAgICAgY2FtX3BhZGRpbmdfaW5mb190IG1QYWRkaW5nSW5mbzsKQEAgLTEzMSw3ICsxNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCBzdHJlYW1EaW0sCiAgICAgICAgICAgICAgICAgICAgICAgY2FtX3JvdGF0aW9uX3Qgc3RyZWFtUm90YXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtaW5TdHJlYW1CdWZudW0sCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG9zdHByb2Nlc3NNYXNrLAorICAgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc01hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgY2FtX2lzX3R5cGVfdCBpc1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmF0Y2hTaXplID0gMCk7CiAKQEAgLTE0OSw4ICsxNTksOSBAQAogCiAgICAgUUNhbWVyYTNIZWFwTWVtb3J5ICptU3RyZWFtSW5mb0J1ZjsKICAgICBjaGFubmVsX2NiX3JvdXRpbmUgbUNoYW5uZWxDQjsKKyAgICBjaGFubmVsX2NiX2J1ZmZlcl9lcnIgbUNoYW5uZWxDYkJ1ZkVycjsKICAgICAvL2NhbV9wYWRkaW5nX2luZm9fdCAqbVBhZGRpbmdJbmZvOwotICAgIHVpbnQzMl90IG1Qb3N0UHJvY01hc2s7CisgICAgY2FtX2ZlYXR1cmVfbWFza190IG1Qb3N0UHJvY01hc2s7CiAgICAgdWludDMyX3QgbVlVVkR1bXA7CiAgICAgY2FtX2lzX3R5cGVfdCBtSXNUeXBlOwogICAgIHVpbnQzMl90IG1OdW1CdWZmZXJzOwpAQCAtMTU4LDkgKzE2OSw5IEBACiAgICAgICogZm9yIHRoaXMgZmxhZyBpcyB0cnVlIGFuZCBpcyBzZWxlY3RpdmVseSBzZXQgdG8gZmFsc2UgZm9yIHRoZSB1c2VjYXNlcwogICAgICAqIHN1Y2ggYXMgSEZSIHRvIGF2b2lkIGFueSBwZXJmb3JtYW5jZSBoaXQgZHVlIHRvIG1hcHBpbmcvdW5tYXBwaW5nICovCiAgICAgYm9vbCAgICBtUGVyRnJhbWVNYXBVbm1hcEVuYWJsZTsKLSAgICB1aW50MzJfdCBmcm1fbnVtOwotICAgIHVpbnQzMl90IGR1bXBGcm1DbnQ7Ci0gICAgdWludDMyX3Qgc2tpcF9tb2RlOworICAgIHVpbnQzMl90IG1Gcm1OdW07CisgICAgdWludDMyX3QgbUR1bXBGcm1DbnQ7CisgICAgdWludDMyX3QgbVNraXBNb2RlOwogICAgIHVpbnQzMl90IG1EdW1wU2tpcENudDsKIH07CiAKQEAgLTE3NSwxMSArMTg2LDEyIEBACiAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxfaGFuZGxlLAogICAgICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCiAgICAgICAgICAgIGNoYW5uZWxfY2Jfcm91dGluZSBjYl9yb3V0aW5lLAorICAgICAgICAgICBjaGFubmVsX2NiX2J1ZmZlcl9lcnIgY2JfYnVmZmVyX2VyciwKICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCiAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbSwKICAgICAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUsCi0gICAgICAgICAgIHVpbnQzMl90IHBvc3Rwcm9jZXNzX21hc2ssCisgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAogICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKm1ldGFkYXRhQ2hhbm5lbCwKICAgICAgICAgICAgdWludDMyX3QgbnVtQnVmZmVycyA9IE1BWF9JTkZMSUdIVF9SRVFVRVNUUyk7CiAKQEAgLTE4OSw3ICsyMDEsNyBAQAogICAgIHZpcnR1YWwgaW50MzJfdCByZXF1ZXN0KGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLAogICAgICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCogcElucHV0QnVmZmVyLAotICAgICAgICAgICAgbWV0YWRhdGFfYnVmZmVyX3QqIG1ldGFkYXRhKTsKKyAgICAgICAgICAgIG1ldGFkYXRhX2J1ZmZlcl90KiBtZXRhZGF0YSwgaW50ICZpbmRleFVzZWQpOwogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKICAgICAgICAgICAgIFFDYW1lcmEzU3RyZWFtICpzdHJlYW0pOwogICAgIHZpcnR1YWwgUUNhbWVyYTNTdHJlYW1NZW0gKmdldFN0cmVhbUJ1ZnModWludDMyX3QgbGVuKTsKQEAgLTIyMSw2ICsyMzMsNyBAQAogICAgIGludDMyX3QgY2hlY2tTdHJlYW1DYkVycm9ycyhtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2ZyYW1lLAogICAgICAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSk7CiAgICAgaW50MzJfdCBnZXRTdHJlYW1TaXplKGNhbV9kaW1lbnNpb25fdCAmZGltKTsKKyAgICB2aXJ0dWFsIGludDMyX3QgdGltZW91dEZyYW1lKHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKIAogICAgIFFDYW1lcmEzUG9zdFByb2Nlc3NvciBtX3Bvc3Rwcm9jZXNzb3I7IC8vIHBvc3QgcHJvY2Vzc29yCiAgICAgdm9pZCBzaG93RGVidWdGUFMoaW50MzJfdCBzdHJlYW1UeXBlKTsKQEAgLTI1Myw2ICsyNjYsNyBAQAogICAgIFFDYW1lcmEzU3RyZWFtTWVtIG1PZmZsaW5lTWV0YU1lbW9yeTsgLy9yZXByb2Nlc3NpbmcgbWV0YWRhdGEgYnVmZmVyCiAgICAgTGlzdDx1aW50MzJfdD4gbUZyZWVPZmZsaW5lTWV0YUJ1ZmZlcnNMaXN0OwogICAgIE11dGV4IG1GcmVlT2ZmbGluZU1ldGFCdWZmZXJzTG9jazsKKyAgICBhbmRyb2lkOjpMaXN0PG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqPiBtT3V0T2ZTZXF1ZW5jZUJ1ZmZlcnM7CiAKIHByaXZhdGU6CiAKQEAgLTI2OSwxMSArMjgzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY2Jfcm91dGluZSBjYl9yb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2NiX2J1ZmZlcl9lcnIgY2JfYnVmZmVyX2VyciwKICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBvc3Rwcm9jZXNzX21hc2ssCisgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAogICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKm1ldGFkYXRhQ2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtQnVmZmVycyA9IE1BWF9JTkZMSUdIVF9SRVFVRVNUUyk7CiAKQEAgLTI4NCw3ICsyOTksOCBAQAogICAgIHZpcnR1YWwgaW50MzJfdCBxdWV1ZUJhdGNoQnVmKCk7CiAgICAgdmlydHVhbCBpbnQzMl90IGluaXRpYWxpemUoY2FtX2lzX3R5cGVfdCBpc1R5cGUpOwogICAgIHVzaW5nIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OnJlcXVlc3Q7Ci0gICAgdmlydHVhbCBpbnQzMl90IHJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKKyAgICB2aXJ0dWFsIGludDMyX3QgcmVxdWVzdChidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgdWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXhVc2VkKTsKICAgICB2aXJ0dWFsIHJlcHJvY2Vzc190eXBlX3QgZ2V0UmVwcm9jZXNzVHlwZSgpOwogCiBwcml2YXRlOgpAQCAtMzAyLDE1ICszMTgsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtX29wcywKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jYl9yb3V0aW5lIGNiX3JvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY2JfYnVmZmVyX2VyciBjYl9idWZmZXJfZXJyLAogICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bUJ1ZmZlcnMgPSBNSU5fU1RSRUFNSU5HX0JVRkZFUl9OVU0pOwogICAgIHZpcnR1YWwgflFDYW1lcmEzTWV0YWRhdGFDaGFubmVsKCk7CiAKICAgICB2aXJ0dWFsIGludDMyX3QgaW5pdGlhbGl6ZShjYW1faXNfdHlwZV90IGlzVHlwZSk7CiAKLSAgICB2aXJ0dWFsIGludDMyX3QgcmVxdWVzdChidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgdWludDMyX3QgZnJhbWVOdW1iZXIpOworICAgIHZpcnR1YWwgaW50MzJfdCByZXF1ZXN0KGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLCB1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleFVzZWQpOwogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM1N0cmVhbSAqc3RyZWFtKTsKIApAQCAtMzE4LDYgKzMzNiw3IEBACiAgICAgdmlydHVhbCB2b2lkIHB1dFN0cmVhbUJ1ZnMoKTsKICAgICB2aXJ0dWFsIGludDMyX3QgcmVnaXN0ZXJCdWZmZXIoYnVmZmVyX2hhbmRsZV90ICogLypidWZmZXIqLywgY2FtX2lzX3R5cGVfdCAvKmlzVHlwZSovKQogICAgICAgICAgICAgeyByZXR1cm4gTk9fRVJST1I7IH07CisgICAgdmlydHVhbCBpbnQzMl90IHRpbWVvdXRGcmFtZShfX3VudXNlZCB1aW50MzJfdCBmcmFtZU51bWJlcikge3JldHVybiBOT19FUlJPUjsgfTsKIAogcHJpdmF0ZToKICAgICBRQ2FtZXJhM1N0cmVhbU1lbSAqbU1lbW9yeTsKQEAgLTMzMiwxMCArMzUxLDExIEBACiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY2Jfcm91dGluZSBjYl9yb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2NiX2J1ZmZlcl9lcnIgY2JfYnVmZmVyX2VyciwKICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG9zdHByb2Nlc3NfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IHBvc3Rwcm9jZXNzX21hc2ssCiAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqbWV0YWRhdGFDaGFubmVsLAogICAgICAgICAgICAgICAgICAgICBib29sIHJhd18xNiA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1CdWZmZXJzID0gTUFYX0lORkxJR0hUX1JFUVVFU1RTKTsKQEAgLTM3MSw3ICszOTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3QgcmF3RHVtcFNpemUsCiAgICAgICAgICAgICAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3N0cHJvY2Vzc19tYXNrLCB1aW50MzJfdCBudW1CdWZmZXJzID0gM1UpOworICAgICAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywgdWludDMyX3QgbnVtQnVmZmVycyA9IDNVKTsKICAgICB2aXJ0dWFsIH5RQ2FtZXJhM1Jhd0R1bXBDaGFubmVsKCk7CiAgICAgdmlydHVhbCBpbnQzMl90IGluaXRpYWxpemUoY2FtX2lzX3R5cGVfdCBpc1R5cGUpOwogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKQEAgLTM4MCw3ICs0MDAsOSBAQAogICAgIHZpcnR1YWwgdm9pZCBwdXRTdHJlYW1CdWZzKCk7CiAgICAgdmlydHVhbCBpbnQzMl90IHJlZ2lzdGVyQnVmZmVyKGJ1ZmZlcl9oYW5kbGVfdCAqIC8qYnVmZmVyKi8sIGNhbV9pc190eXBlX3QgLyppc1R5cGUqLykKICAgICAgICAgICAgIHsgcmV0dXJuIE5PX0VSUk9SOyB9OwotICAgIHZpcnR1YWwgaW50MzJfdCByZXF1ZXN0KGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLCB1aW50MzJfdCBmcmFtZU51bWJlcik7CisgICAgdmlydHVhbCBpbnQzMl90IHRpbWVvdXRGcmFtZShfX3VudXNlZCB1aW50MzJfdCBmcmFtZU51bWJlcikge3JldHVybiBOT19FUlJPUjt9OworICAgIHZpcnR1YWwgaW50MzJfdCByZXF1ZXN0KGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLCB1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgIGludCAmaW5kZXhVc2VkKTsKICAgICB2b2lkIGR1bXBSYXdTbmFwc2hvdChtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZSk7CiAKIHB1YmxpYzoKQEAgLTQwMSwxMSArNDIzLDEyIEBACiAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtX29wcywKICAgICAgICAgICAgIGNoYW5uZWxfY2Jfcm91dGluZSBjYl9yb3V0aW5lLAorICAgICAgICAgICAgY2hhbm5lbF9jYl9idWZmZXJfZXJyIGNiX2J1ZmZlcl9lcnIsCiAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAogICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpzdHJlYW0sCiAgICAgICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwKLSAgICAgICAgICAgIHVpbnQzMl90IHBvc3Rwcm9jZXNzX21hc2ssCisgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKICAgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqbWV0YWRhdGFDaGFubmVsKTsKICAgICB+UUNhbWVyYTNZVVZDaGFubmVsKCk7CiAgICAgdmlydHVhbCBpbnQzMl90IGluaXRpYWxpemUoY2FtX2lzX3R5cGVfdCBpc1R5cGUpOwpAQCAtNDEzLDcgKzQzNiw4IEBACiAgICAgdmlydHVhbCBpbnQzMl90IHJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsCiAgICAgICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlciwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KiBwSW5wdXRCdWZmZXIsCi0gICAgICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCogbWV0YWRhdGEsIGJvb2wgJm5lZWRNZXRhZGF0YSk7CisgICAgICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCogbWV0YWRhdGEsIGJvb2wgJm5lZWRNZXRhZGF0YSwKKyAgICAgICAgICAgIGludCAmaW5kZXhVc2VkKTsKICAgICB2aXJ0dWFsIHJlcHJvY2Vzc190eXBlX3QgZ2V0UmVwcm9jZXNzVHlwZSgpOwogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKICAgICAgICAgICAgIFFDYW1lcmEzU3RyZWFtICpzdHJlYW0pOwpAQCAtNDYxLDEwICs0ODUsMTEgQEAKICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxfaGFuZGxlLAogICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAogICAgICAgICAgICAgY2hhbm5lbF9jYl9yb3V0aW5lIGNiX3JvdXRpbmUsCisgICAgICAgICAgICBjaGFubmVsX2NiX2J1ZmZlcl9lcnIgY2JfYnVmZmVyX2VyciwKICAgICAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sCiAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbSwKLSAgICAgICAgICAgIHVpbnQzMl90IHBvc3Rwcm9jZXNzX21hc2ssCisgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKICAgICAgICAgICAgIGJvb2wgaXM0S1ZpZGVvLAogICAgICAgICAgICAgYm9vbCBpc0lucHV0U3RyZWFtQ29uZmlndXJlZCwKICAgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqbWV0YWRhdGFDaGFubmVsLApAQCAtNDc2LDEzICs1MDEsMTUgQEAKICAgICB2aXJ0dWFsIGludDMyX3QgcmVxdWVzdChidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwKICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyLAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QqIHBJbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgIG1ldGFkYXRhX2J1ZmZlcl90KiBtZXRhZGF0YSk7CisgICAgICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCogbWV0YWRhdGEsCisgICAgICAgICAgICBpbnQgJmluZGV4VXNlZCk7CiAgICAgdmlydHVhbCB2b2lkIHN0cmVhbUNiUm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2ZyYW1lLAogICAgICAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSk7CiAKICAgICB2aXJ0dWFsIFFDYW1lcmEzU3RyZWFtTWVtICpnZXRTdHJlYW1CdWZzKHVpbnQzMl90IGxlKTsKICAgICB2aXJ0dWFsIHZvaWQgcHV0U3RyZWFtQnVmcygpOwogICAgIHZpcnR1YWwgcmVwcm9jZXNzX3R5cGVfdCBnZXRSZXByb2Nlc3NUeXBlKCk7CisgICAgdmlydHVhbCBpbnQzMl90IHRpbWVvdXRGcmFtZSh1aW50MzJfdCBmcmFtZU51bWJlcik7CiAKICAgICBRQ2FtZXJhM0V4aWYgKmdldEV4aWZEYXRhKG1ldGFkYXRhX2J1ZmZlcl90ICptZXRhZGF0YSwKICAgICAgICAgICAgIGpwZWdfc2V0dGluZ3NfdCAqanBlZ19zZXR0aW5ncyk7CkBAIC00OTQsNiArNTIxLDggQEAKICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKICAgICBzdGF0aWMgdm9pZCBkYXRhTm90aWZ5Q0IobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSwKICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKyAgICB2b2lkIHNldENwcFBlcmZQYXJhbSgpOworICAgIHZvaWQgcmVzZXRDcHBQZXJmUGFyYW0oKTsKIAogcHJpdmF0ZToKICAgICBpbnQzMl90IHF1ZXVlSnBlZ1NldHRpbmcodWludDMyX3Qgb3V0X2J1Zl9pbmRleCwgbWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhKTsKQEAgLTUxMSw2ICs1NDAsNyBAQAogICAgIE11dGV4IG1GcmVlQnVmZmVyc0xvY2s7CiAgICAgTGlzdDx1aW50MzJfdD4gbUZyZWVCdWZmZXJMaXN0OwogICAgIHVpbnQzMl90IG1GcmFtZUxlbjsKKyAgICB1aW50MzJfdCBtUGVuZGluZ0xpdmVTbmFwc2hvdEZyYW1lczsKIH07CiAKIC8vIHJlcHJvY2VzcyBjaGFubmVsIGNsYXNzCkBAIC01MjEsOCArNTUxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jYl9yb3V0aW5lIGNiX3JvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jYl9idWZmZXJfZXJyIGNiX2J1ZmZlcl9lcnIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLCB2b2lkICpjaF9oZGwpOwogICAgIFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbCgpOwogICAgIHZpcnR1YWwgflFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbCgpOwpAQCAtNTMxLDcgKzU2Miw3IEBACiAgICAgdmlydHVhbCBpbnQzMl90IHN0b3AoKTsKICAgICBpbnQzMl90IGRvUmVwcm9jZXNzT2ZmbGluZShxY2FtZXJhX2Z3a19pbnB1dF9wcF9kYXRhX3QgKmZyYW1lLAogICAgICAgICAgICAgYm9vbCBpc1ByaW9yaXR5RnJhbWUgPSBmYWxzZSk7Ci0gICAgaW50MzJfdCBkb1JlcHJvY2VzcyhpbnQgYnVmX2ZkLCBzaXplX3QgYnVmX2xlbmd0aCwgaW50MzJfdCAmcmV0X3ZhbCwKKyAgICBpbnQzMl90IGRvUmVwcm9jZXNzKGludCBidWZfZmQsdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmX2xlbmd0aCwgaW50MzJfdCAmcmV0X3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqbWV0YV9idWYpOwogICAgIGludDMyX3Qgb3ZlcnJpZGVNZXRhZGF0YShxY2FtZXJhX2hhbDNfcHBfYnVmZmVyX3QgKnBwX2J1ZmZlciwKICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1ldGFfYnVmZmVyLApAQCAtNTU0LDYgKzU4NSw3IEBACiAgICAgUUNhbWVyYTNTdHJlYW0gKmdldFN0cmVhbUJ5U3JjSGFuZGxlKHVpbnQzMl90IHNyY0hhbmRsZSk7CiAgICAgUUNhbWVyYTNTdHJlYW0gKmdldFNyY1N0cmVhbUJ5U3JjSGFuZGxlKHVpbnQzMl90IHNyY0hhbmRsZSk7CiAgICAgdmlydHVhbCBpbnQzMl90IHJlZ2lzdGVyQnVmZmVyKGJ1ZmZlcl9oYW5kbGVfdCAqIGJ1ZmZlciwgY2FtX2lzX3R5cGVfdCBpc1R5cGUpOworICAgIHZpcnR1YWwgaW50MzJfdCB0aW1lb3V0RnJhbWUoX191bnVzZWQgdWludDMyX3QgZnJhbWVOdW1iZXIpIHtyZXR1cm4gTk9fRVJST1I7fTsKIAogcHVibGljOgogICAgIHZvaWQgKmlucHV0Q2hIYW5kbGU7CkBAIC01OTMsNyArNjI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbF9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtX29wcywKICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcG9zdHByb2Nlc3NfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IHBvc3Rwcm9jZXNzX21hc2ssCiAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCAqZGltLAogICAgICAgICAgICAgICAgICAgICBjYW1fZm9ybWF0X3Qgc3RyZWFtRm9ybWF0LApAQCAtNjA1LDcgKzYzNyw4IEBACiAKICAgICB2aXJ0dWFsIGludDMyX3QgaW5pdGlhbGl6ZShjYW1faXNfdHlwZV90IGlzVHlwZSk7CiAKLSAgICB2aXJ0dWFsIGludDMyX3QgcmVxdWVzdChidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgdWludDMyX3QgZnJhbWVOdW1iZXIpOworICAgIHZpcnR1YWwgaW50MzJfdCByZXF1ZXN0KGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLCB1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleFVzZWQpOwogICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM1N0cmVhbSAqc3RyZWFtKTsKIApAQCAtNjEzLDYgKzY0Niw3IEBACiAgICAgdmlydHVhbCB2b2lkIHB1dFN0cmVhbUJ1ZnMoKTsKICAgICB2aXJ0dWFsIGludDMyX3QgcmVnaXN0ZXJCdWZmZXIoYnVmZmVyX2hhbmRsZV90ICogLypidWZmZXIqLywgY2FtX2lzX3R5cGVfdCAvKmlzVHlwZSovKQogICAgICAgICAgICAgeyByZXR1cm4gTk9fRVJST1I7IH07CisgICAgdmlydHVhbCBpbnQzMl90IHRpbWVvdXRGcmFtZShfX3VudXNlZCB1aW50MzJfdCBmcmFtZU51bWJlcikge3JldHVybiBOT19FUlJPUjt9OwogCiAgICAgc3RhdGljIGNhbV9kaW1lbnNpb25fdCBrRGltOwogcHJpdmF0ZToKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNIV0kuY3BwIGIvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM0hXSS5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA1YTNmOWY1Li5jNGFjZGM2Ci0tLSBhL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNIV0kuY3BwCisrKyBiL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNIV0kuY3BwCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxzeW5jL3N5bmMuaD4KICNpbmNsdWRlICJncmFsbG9jX3ByaXYuaCIKIApAQCAtNzQsOCArNzUsOCBAQAogI2RlZmluZSBWSURFT180S19XSURUSCAgMzg0MAogI2RlZmluZSBWSURFT180S19IRUlHSFQgMjE2MAogCi0jZGVmaW5lIE1BWF9FSVNfV0lEVEggMTkyMAotI2RlZmluZSBNQVhfRUlTX0hFSUdIVCAxMDgwCisjZGVmaW5lIE1BWF9FSVNfV0lEVEggMzg0MAorI2RlZmluZSBNQVhfRUlTX0hFSUdIVCAyMTYwCiAKICNkZWZpbmUgTUFYX1JBV19TVFJFQU1TICAgICAgICAxCiAjZGVmaW5lIE1BWF9TVEFMTElOR19TVFJFQU1TICAgMQpAQCAtODQsMTAgKzg1LDEwIEBACiAjZGVmaW5lIE1JTl9GUFNfRk9SX0JBVENIX01PREUgKDEyMCkKICNkZWZpbmUgUFJFVklFV19GUFNfRk9SX0hGUiAgICAoMzApCiAjZGVmaW5lIERFRkFVTFRfVklERU9fRlBTICAgICAgKDMwLjApCisjZGVmaW5lIFRFTVBMQVRFX01BWF9QUkVWSUVXX0ZQUyAoMzAuMCkKICNkZWZpbmUgTUFYX0hGUl9CQVRDSF9TSVpFICAgICAoOCkKICNkZWZpbmUgUkVHSU9OU19UVVBMRV9DT1VOVCAgICA1CiAjZGVmaW5lIEhEUl9QTFVTX1BFUkZfVElNRV9PVVQgICg3MDAwKSAvLyBtaWxsaXNlY29uZHMKLSNkZWZpbmUgQlVSU1RfUkVQUk9DRVNTX1BFUkZfVElNRV9PVVQgICgxMDAwKSAvLyBtaWxsaXNlY29uZHMKIC8vIFNldCBhIHRocmVzaG9sZCBmb3IgZGV0ZWN0aW9uIG9mIG1pc3NpbmcgYnVmZmVycyAvL3NlY29uZHMKICNkZWZpbmUgTUlTU0lOR19SRVFVRVNUX0JVRl9USU1FT1VUIDMKICNkZWZpbmUgRkxVU0hfVElNRU9VVCAzCkBAIC0yNDQsMjAgKzI0NSwxMiBAQAogCiBjb25zdCBpbnQzMl90IGF2YWlsYWJsZV90aHVtYm5haWxfc2l6ZXNbXSA9IHswLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2LCAxNDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAsIDI0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzMiwgMjg4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwLCAyODgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIsIDI4OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMiwgMzg0fTsKLQotY29uc3QgY2FtX2RpbWVuc2lvbl90IGRlZmF1bHRfaGZyX3ZpZGVvX3NpemVzW10gPSB7Ci0gICAgeyAzODQwLCAyMTYwIH0sCi0gICAgeyAxOTIwLCAxMDgwIH0sCi0gICAgeyAxMjgwLCAgNzIwIH0sCi0gICAgeyAgNjQwLCAgNDgwIH0sCi0gICAgeyAgNDgwLCAgMzIwIH0KLX07Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MCwgMTQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU2LCAxNDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAsIDE2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NiwgMTU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwLCAyNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAsIDI0MH07CiAKIGNvbnN0IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OlFDYW1lcmFNYXA8CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2Vuc29yX3Rlc3RfcGF0dGVybl9tb2RlX3QsCkBAIC0zMjAsNiArMzEzLDkgQEAKICAgICAucmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHswfSwKIH07CiAKKy8vIGluaXRpYWxpc2UgdG8gc29tZSBkZWZhdWx0IHZhbHVlCit1aW50MzJfdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpzZXNzaW9uSWRbXSA9IHsweERFQURCRUVGLCAweERFQURCRUVGLCAweERFQURCRUVGfTsKKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlCiAgKgpAQCAtMzQzLDYgKzMzOSw4IEBACiAgICAgICBtQW5hbHlzaXNDaGFubmVsKE5VTEwpLAogICAgICAgbVJhd0R1bXBDaGFubmVsKE5VTEwpLAogICAgICAgbUR1bW15QmF0Y2hDaGFubmVsKE5VTEwpLAorICAgICAgbV9wZXJmTG9jaygpLAorICAgICAgbUNvbW1vbigpLAogICAgICAgbUNoYW5uZWxIYW5kbGUoMCksCiAgICAgICBtRmlyc3RDb25maWd1cmF0aW9uKHRydWUpLAogICAgICAgbUZsdXNoKGZhbHNlKSwKQEAgLTM2MywyMSArMzYxLDMzIEBACiAgICAgICBtQ2FsbGJhY2tzKGNhbGxiYWNrcyksCiAgICAgICBtQ2FwdHVyZUludGVudCgwKSwKICAgICAgIG1DYWNNb2RlKDApLAorICAgICAgbUh5YnJpZEFlRW5hYmxlKDApLAorICAgICAgLyogRGV2Q2FtRGVidWcgbWV0YWRhdGEgaW50ZXJuYWwgbSBjb250cm9sKi8KKyAgICAgIG1EZXZDYW1EZWJ1Z01ldGFFbmFibGUoMCksCisgICAgICAvKiBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSBlbmQgKi8KICAgICAgIG1CYXRjaFNpemUoMCksCiAgICAgICBtVG9CZVF1ZXVlZFZpZEJ1ZnMoMCksCiAgICAgICBtSEZSVmlkZW9GcHMoREVGQVVMVF9WSURFT19GUFMpLAogICAgICAgbU9wTW9kZShDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX05PUk1BTF9NT0RFKSwKICAgICAgIG1GaXJzdEZyYW1lTnVtYmVySW5CYXRjaCgwKSwKICAgICAgIG1OZWVkU2Vuc29yUmVzdGFydChmYWxzZSksCisgICAgICBtTWluSW5GbGlnaHRSZXF1ZXN0cyhNSU5fSU5GTElHSFRfUkVRVUVTVFMpLAorICAgICAgbU1heEluRmxpZ2h0UmVxdWVzdHMoTUFYX0lORkxJR0hUX1JFUVVFU1RTKSwKICAgICAgIG1MZGFmQ2FsaWJFeGlzdChmYWxzZSksCiAgICAgICBtUG93ZXJIaW50RW5hYmxlZChmYWxzZSksCiAgICAgICBtTGFzdEN1c3RJbnRlbnRGcm1OdW0oLTEpLAotICAgICAgbVN0YXRlKENMT1NFRCkKKyAgICAgIG1TdGF0ZShDTE9TRUQpLAorICAgICAgbUlzRGV2aWNlTGlua2VkKGZhbHNlKSwKKyAgICAgIG1Jc01haW5DYW1lcmEodHJ1ZSksCisgICAgICBtTGlua2VkQ2FtZXJhSWQoMCksCisgICAgICBtX3BSZWxDYW1TeW5jSGVhcChOVUxMKSwKKyAgICAgIG1fcFJlbENhbVN5bmNCdWYoTlVMTCkKIHsKICAgICBnZXRMb2dMZXZlbCgpOwogICAgIG1fcGVyZkxvY2subG9ja19pbml0KCk7CisgICAgbUNvbW1vbi5pbml0KGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXSk7CiAgICAgbUNhbWVyYURldmljZS5jb21tb24udGFnID0gSEFSRFdBUkVfREVWSUNFX1RBRzsKLSAgICBtQ2FtZXJhRGV2aWNlLmNvbW1vbi52ZXJzaW9uID0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM7CisgICAgbUNhbWVyYURldmljZS5jb21tb24udmVyc2lvbiA9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OwogICAgIG1DYW1lcmFEZXZpY2UuY29tbW9uLmNsb3NlID0gY2xvc2VfY2FtZXJhX2RldmljZTsKICAgICBtQ2FtZXJhRGV2aWNlLm9wcyA9ICZtQ2FtZXJhT3BzOwogICAgIG1DYW1lcmFEZXZpY2UucHJpdiA9IHRoaXM7CkBAIC00MTUsNiArNDI1LDEwIEBACiAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS50bnIudmlkZW8iLCBwcm9wLCAiMCIpOwogICAgIG1fYlRuclZpZGVvID0gKHVpbnQ4X3QpYXRvaShwcm9wKTsKIAorICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuYXZ0aW1lci5kZWJ1ZyIsIHByb3AsICIwIik7CisgICAgbV9kZWJ1Z19hdnRpbWVyID0gKHVpbnQ4X3QpYXRvaShwcm9wKTsKKwogICAgIC8vTG9hZCBhbmQgcmVhZCBHUFUgbGlicmFyeS4KICAgICBsaWJfc3VyZmFjZV91dGlscyA9IE5VTEw7CiAgICAgTElOS19nZXRfc3VyZmFjZV9waXhlbF9hbGlnbm1lbnQgPSBOVUxMOwpAQCAtNDI4LDYgKzQ0Miw4IEBACiAgICAgICAgICB9CiAgICAgICAgICBkbGNsb3NlKGxpYl9zdXJmYWNlX3V0aWxzKTsKICAgICB9CisKKyAgICBtNjBIelpvbmUgPSBpczYwSHpab25lKCk7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC03NDQsNiArNzYwLDQ0IEBACiAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnQ2FtTG9jayk7CiAgICAgfQogCisgICAgLy9maWxsIHRoZSBzZXNzaW9uIGlkIG5lZWRlZCB3aGlsZSBsaW5raW5nIGR1YWwgY2FtCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnQ2FtTG9jayk7CisgICAgcmMgPSBtQ2FtZXJhSGFuZGxlLT5vcHMtPmdldF9zZXNzaW9uX2lkKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICZzZXNzaW9uSWRbbUNhbWVyYUlkXSk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdDYW1Mb2NrKTsKKworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiRXJyb3IsIGZhaWxlZCB0byBnZXQgc2Vzc2lpb24gaWQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy9BbGxvY2F0ZSByZWxhdGVkIGNhbSBzeW5jIGJ1ZmZlcgorICAgICAgICAvL3RoaXMgaXMgbmVlZGVkIGZvciB0aGUgcGF5bG9hZCB0aGF0IGdvZXMgYWxvbmcgd2l0aCBidW5kbGluZyBjbWQgZm9yIHJlbGF0ZWQKKyAgICAgICAgLy9jYW1lcmEgdXNlIGNhc2VzCisgICAgICAgIG1fcFJlbENhbVN5bmNIZWFwID0gbmV3IFFDYW1lcmEzSGVhcE1lbW9yeSgxKTsKKyAgICAgICAgcmMgPSBtX3BSZWxDYW1TeW5jSGVhcC0+YWxsb2NhdGUoc2l6ZW9mKGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QpKTsKKyAgICAgICAgaWYocmMgIT0gT0spIHsKKyAgICAgICAgICAgIHJjID0gTk9fTUVNT1JZOworICAgICAgICAgICAgTE9HRSgiRHVhbGNhbTogRmFpbGVkIHRvIGFsbG9jYXRlIFJlbGF0ZWQgY2FtIHN5bmMgSGVhcCBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKworICAgICAgICAvL01hcCBtZW1vcnkgZm9yIHJlbGF0ZWQgY2FtIHN5bmMgYnVmZmVyCisgICAgICAgIHJjID0gbUNhbWVyYUhhbmRsZS0+b3BzLT5tYXBfYnVmKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1lOQ19SRUxBVEVEX1NFTlNPUlNfQlVGLAorICAgICAgICAgICAgICAgIG1fcFJlbENhbVN5bmNIZWFwLT5nZXRGZCgwKSwKKyAgICAgICAgICAgICAgICBzaXplb2YoY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCksCisgICAgICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0hlYXAtPmdldFB0cigwKSk7CisgICAgICAgIGlmKHJjIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiRHVhbGNhbTogZmFpbGVkIHRvIG1hcCBSZWxhdGVkIGNhbSBzeW5jIGJ1ZmZlciIpOworICAgICAgICAgICAgcmMgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG1fcFJlbENhbVN5bmNCdWYgPQorICAgICAgICAgICAgICAgIChjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KikgREFUQV9QVFIobV9wUmVsQ2FtU3luY0hlYXAsMCk7CisgICAgfQorCisgICAgTE9HSCgibUNhbWVyYUlkPSVkIixtQ2FtZXJhSWQpOworCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC03NjksNiArODIzLDExIEBACiAgICAgcmMgPSBtQ2FtZXJhSGFuZGxlLT5vcHMtPmNsb3NlX2NhbWVyYShtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlKTsKICAgICBtQ2FtZXJhSGFuZGxlID0gTlVMTDsKIAorICAgIC8vcmVzZXQgc2Vzc2lvbiBpZCB0byBzb21lIGludmFsaWQgaWQKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdDYW1Mb2NrKTsKKyAgICBzZXNzaW9uSWRbbUNhbWVyYUlkXSA9IDB4REVBREJFRUY7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdDYW1Mb2NrKTsKKwogICAgIC8vTm90aWZ5IGRpc3BsYXkgSEFMIHRoYXQgdGhlcmUgaXMgbm8gYWN0aXZlIGNhbWVyYSBzZXNzaW9uCiAgICAgLy9idXQgYXZvaWQgY2FsbGluZyB0aGUgc2FtZSBkdXJpbmcgYm9vdHVwLiBSZWZlciB0byBvcGVuQ2FtZXJhCiAgICAgLy9mb3IgbW9yZSBkZXRhaWxzLgpAQCAtNzgxLDYgKzg0MCwxMyBAQAogICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0NhbUxvY2spOwogICAgIH0KIAorICAgIGlmIChOVUxMICE9IG1fcFJlbENhbVN5bmNIZWFwKSB7CisgICAgICAgIG1fcFJlbENhbVN5bmNIZWFwLT5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbGV0ZSBtX3BSZWxDYW1TeW5jSGVhcDsKKyAgICAgICAgbV9wUmVsQ2FtU3luY0hlYXAgPSBOVUxMOworICAgICAgICBtX3BSZWxDYW1TeW5jQnVmID0gTlVMTDsKKyAgICB9CisKICAgICBpZiAobUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zKSB7CiAgICAgICAgIGZyZWUobUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zKTsKICAgICAgICAgbUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zID0gTlVMTDsKQEAgLTgyMCwxMyArODg2LDYgQEAKICAgICAgICAgY2FzZSBPUEVORUQ6CiAgICAgICAgICAgICAvKiB2YWxpZCBzdGF0ZSAqLwogICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBFUlJPUjoKLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOwotICAgICAgICAgICAgaGFuZGxlQ2FtZXJhRGV2aWNlRXJyb3IoKTsKLSAgICAgICAgICAgIHJjID0gLUVOT0RFVjsKLSAgICAgICAgICAgIGdvdG8gZXJyMjsKLQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7CiAgICAgICAgICAgICByYyA9IC1FTk9ERVY7CkBAIC04NTcsNyArOTE2LDYgQEAKIAogZXJyMToKICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKLWVycjI6CiAgICAgcmV0dXJuIHJjOwogfQogCkBAIC0xMTM4LDcgKzExOTYsNyBAQAogICAgICAgICB1aW50MzJfdCBzdHJlYW1faWR4KQogewogICAgIGNoYXIgZmVhdHVyZV9tYXNrX3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgdWludDMyX3QgZmVhdHVyZV9tYXNrOworICAgIGNhbV9mZWF0dXJlX21hc2tfdCBmZWF0dXJlX21hc2s7CiAgICAgaW50IGFyZ3NfY29udmVydGVkOwogICAgIGludCBwcm9wZXJ0eV9sZW47CiAKQEAgLTExNDcsOSArMTIwNSw5IEBACiAgICAgICAgICAgICBmZWF0dXJlX21hc2tfdmFsdWUsICIwIik7CiAgICAgaWYgKChwcm9wZXJ0eV9sZW4gPiAyKSAmJiAoZmVhdHVyZV9tYXNrX3ZhbHVlWzBdID09ICcwJykgJiYKICAgICAgICAgICAgIChmZWF0dXJlX21hc2tfdmFsdWVbMV0gPT0gJ3gnKSkgewotICAgICAgICBhcmdzX2NvbnZlcnRlZCA9IHNzY2FuZihmZWF0dXJlX21hc2tfdmFsdWUsICIweCV4IiwgJmZlYXR1cmVfbWFzayk7CisgICAgICAgIGFyZ3NfY29udmVydGVkID0gc3NjYW5mKGZlYXR1cmVfbWFza192YWx1ZSwgIjB4JWxseCIsICZmZWF0dXJlX21hc2spOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGFyZ3NfY29udmVydGVkID0gc3NjYW5mKGZlYXR1cmVfbWFza192YWx1ZSwgIiVkIiwgJmZlYXR1cmVfbWFzayk7CisgICAgICAgIGFyZ3NfY29udmVydGVkID0gc3NjYW5mKGZlYXR1cmVfbWFza192YWx1ZSwgIiVsbGQiLCAmZmVhdHVyZV9tYXNrKTsKICAgICB9CiAgICAgaWYgKDEgIT0gYXJnc19jb252ZXJ0ZWQpIHsKICAgICAgICAgZmVhdHVyZV9tYXNrID0gMDsKQEAgLTExNzQsNyArMTIzMiw3IEBACiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIExPR0QoIlBQIGZlYXR1cmUgbWFzayAleCIsCisgICAgTE9HRCgiUFAgZmVhdHVyZSBtYXNrICVsbHgiLAogICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1tzdHJlYW1faWR4XSk7CiB9CiAKQEAgLTEyMTcsNiArMTI3NSwzNyBAQAogICAgIH0KIH0KIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB1cGRhdGVUaW1lU3RhbXBJblBlbmRpbmdCdWZmZXJzCisgKgorICogREVTQ1JJUFRJT046IHVwZGF0ZSB0aW1lc3RhbXAgaW4gZGlzcGxheSBtZXRhZGF0YSBmb3IgYWxsIHBlbmRpbmcgYnVmZmVycworICogICAgICAgICAgICAgIG9mIGEgZnJhbWUgbnVtYmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmcmFtZV9udW1iZXI6IGZyYW1lX251bWJlci4gVGltZXN0YW1wIHdpbGwgYmUgc2V0IG9uIHBlbmRpbmcgYnVmZmVycyBvZiB0aGlzIGZyYW1lIG51bWJlcgorICogICBAdGltZXN0YW1wICAgOiB0aW1lc3RhbXAgdG8gYmUgc2V0CisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6dXBkYXRlVGltZVN0YW1wSW5QZW5kaW5nQnVmZmVycygKKyAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsIG5zZWNzX3QgdGltZXN0YW1wKQoreworICAgIGZvciAoYXV0byByZXEgPSBtUGVuZGluZ0J1ZmZlcnNNYXAubVBlbmRpbmdCdWZmZXJzSW5SZXF1ZXN0LmJlZ2luKCk7CisgICAgICAgICAgICByZXEgIT0gbVBlbmRpbmdCdWZmZXJzTWFwLm1QZW5kaW5nQnVmZmVyc0luUmVxdWVzdC5lbmQoKTsgcmVxKyspIHsKKyAgICAgICAgaWYgKHJlcS0+ZnJhbWVfbnVtYmVyICE9IGZyYW1lTnVtYmVyKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZm9yIChhdXRvIGsgPSByZXEtPm1QZW5kaW5nQnVmZmVyTGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgIGsgIT0gcmVxLT5tUGVuZGluZ0J1ZmZlckxpc3QuZW5kKCk7IGsrKyApIHsKKyAgICAgICAgICAgIHN0cnVjdCBwcml2YXRlX2hhbmRsZV90ICpwcml2X2hhbmRsZSA9CisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgcHJpdmF0ZV9oYW5kbGVfdCAqKSAoKihrLT5idWZmZXIpKTsKKyAgICAgICAgICAgIHNldE1ldGFEYXRhKHByaXZfaGFuZGxlLCBTRVRfVlRfVElNRVNUQU1QLCAmdGltZXN0YW1wKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBGVU5DVElPTiAgIDogY29uZmlndXJlU3RyZWFtcwogICoKQEAgLTEyOTEsNyArMTM4MCw5IEBACiAgICAgZm9yIChMaXN0PHN0cmVhbV9pbmZvX3QqPjo6aXRlcmF0b3IgaXQgPSBtU3RyZWFtSW5mby5iZWdpbigpOwogICAgICAgICAgICAgaXQgIT0gbVN0cmVhbUluZm8uZW5kKCk7IGl0KyspIHsKICAgICAgICAgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCAqY2hhbm5lbCA9IChRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsKikoKml0KS0+c3RyZWFtLT5wcml2OwotICAgICAgICBjaGFubmVsLT5zdG9wKCk7CisgICAgICAgIGlmIChjaGFubmVsKSB7CisgICAgICAgICAgY2hhbm5lbC0+c3RvcCgpOworICAgICAgICB9CiAgICAgICAgICgqaXQpLT5zdGF0dXMgPSBJTlZBTElEOwogICAgIH0KIApAQCAtMTMyNiwxMiArMTQxNyw2IEBACiAgICAgICAgIGNhc2UgU1RBUlRFRDoKICAgICAgICAgICAgIC8qIHZhbGlkIHN0YXRlICovCiAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEVSUk9SOgotICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7Ci0gICAgICAgICAgICBoYW5kbGVDYW1lcmFEZXZpY2VFcnJvcigpOwotICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIExPR0UoIkludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOwogICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CkBAIC0xMzU2LDggKzE0NDEsOSBAQAogICAgIGNhbV9kaW1lbnNpb25fdCBsYXJnZVl1djg4OFNpemUgPSB7MCwgMH07CiAgICAgY2FtX2RpbWVuc2lvbl90IG1heFZpZXdmaW5kZXJTaXplID0gezAsIDB9OwogICAgIGJvb2wgYkpwZWdFeGNlZWRzNEsgPSBmYWxzZTsKKyAgICBib29sIGJKcGVnT25FbmNvZGVyID0gZmFsc2U7CiAgICAgYm9vbCBiVXNlQ29tbW9uRmVhdHVyZU1hc2sgPSBmYWxzZTsKLSAgICB1aW50MzJfdCBjb21tb25GZWF0dXJlTWFzayA9IDA7CisgICAgY2FtX2ZlYXR1cmVfbWFza190IGNvbW1vbkZlYXR1cmVNYXNrID0gMDsKICAgICBib29sIGJTbWFsbEpwZWdTaXplID0gZmFsc2U7CiAgICAgdWludDMyX3Qgd2lkdGhfcmF0aW87CiAgICAgdWludDMyX3QgaGVpZ2h0X3JhdGlvOwpAQCAtMTQ1NSw4ICsxNTQxLDggQEAKICAgICAgICAgICAgICAgICBzdGFsbFN0cmVhbUNudCsrOwogICAgICAgICAgICAgICAgIGlmIChpc09uRW5jb2RlcihtYXhWaWV3ZmluZGVyU2l6ZSwgbmV3U3RyZWFtLT53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbS0+aGVpZ2h0KSkgewotICAgICAgICAgICAgICAgICAgICBjb21tb25GZWF0dXJlTWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX05PTkU7CiAgICAgICAgICAgICAgICAgICAgIG51bVN0cmVhbXNPbkVuY29kZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgYkpwZWdPbkVuY29kZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB3aWR0aF9yYXRpbyA9IENFSUxfRElWSVNJT04oZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWN0aXZlX2FycmF5X3NpemUud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPndpZHRoKTsKQEAgLTE0NzksMTAgKzE1NjUsOCBAQAogICAgICAgICAgICAgICAgIHByb2Nlc3NlZFN0cmVhbUNudCsrOwogICAgICAgICAgICAgICAgIGlmIChpc09uRW5jb2RlcihtYXhWaWV3ZmluZGVyU2l6ZSwgbmV3U3RyZWFtLT53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbS0+aGVpZ2h0KSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RyZWFtLT5zdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9CSURJUkVDVElPTkFMIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfVVNBR0VfWlNMKG5ld1N0cmVhbS0+dXNhZ2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tb25GZWF0dXJlTWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdHJlYW0tPnN0cmVhbV90eXBlICE9IENBTUVSQTNfU1RSRUFNX0JJRElSRUNUSU9OQUwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhSVNfVVNBR0VfWlNMKG5ld1N0cmVhbS0+dXNhZ2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25GZWF0dXJlTWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX1BQX1NVUEVSU0VUX0hBTDM7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbnVtU3RyZWFtc09uRW5jb2RlcisrOwpAQCAtMTQ5OCw4ICsxNTgyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0cmVhbS0+d2lkdGggPD0gVklERU9fNEtfV0lEVEggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPmhlaWdodCA8PSBWSURFT180S19IRUlHSFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbkZlYXR1cmVNYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfUFBfU1VQRVJTRVRfSEFMMzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbkZlYXR1cmVNYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfTk9ORTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBudW1TdHJlYW1zT25FbmNvZGVyKys7CiAgICAgICAgICAgICAgICAgICAgIG51bVl1djg4OE9uRW5jb2RlcisrOwpAQCAtMTU2NCw2ICsxNjQ2LDIxIEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAorICAgIC8vIFdoZW4gSlBFRyBhbmQgcHJldmlldyBzdHJlYW1zIHNoYXJlIFZGRSBvdXRwdXQsIENQUCB3aWxsIG5vdCBhcHBseSBDQUMyCisgICAgLy8gb24gSlBFRyBzdHJlYW0uIFNvIGRpc2FibGUgc3VjaCBjb25maWd1cmF0aW9ucyB0byBlbnN1cmUgQ0FDMiBpcyBhcHBsaWVkLgorICAgIC8vIERvbid0IGZhaWwgZm9yIHJlcHJvY2VzcyBjb25maWd1cmF0aW9ucy4gQWxzbyBkb24ndCBmYWlsIGlmIGJKcGVnRXhjZWVkczRLCisgICAgLy8gaXMgbm90IHRydWUuIE90aGVyd2lzZSB0ZXN0TWFuZGF0b3J5T3V0cHV0Q29tYmluYXRpb25zIHdpbGwgZmFpbCB3aXRoIGZvbGxvd2luZworICAgIC8vIGNvbmZpZ3VyYXRpb25zOgorICAgIC8vICAgIHtbUFJJViwgUFJFVklFV10gW1BSSVYsIFJFQ09SRF0gW0pQRUcsIFJFQ09SRF19CisgICAgLy8gICAge1tQUklWLCBQUkVWSUVXXSBbWVVWLCBSRUNPUkRdIFtKUEVHLCBSRUNPUkRdfQorICAgIC8vICAgIChUaGVzZSB0d28gY29uZmlndXJhdGlvbnMgd2lsbCBub3QgaGF2ZSBDQUMyIGVuYWJsZWQgZXZlbiBpbiBIUSBtb2Rlcy4pCisgICAgaWYgKCFpc1pzbCAmJiBiSnBlZ09uRW5jb2RlciAmJiBiSnBlZ0V4Y2VlZHM0SyAmJiBiVXNlQ29tbW9uRmVhdHVyZU1hc2spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBCbG9iIHNpemUgZ3JlYXRlciB0aGFuIDRrIGFuZCBtdWx0aXBsZSBzdHJlYW1zIGFyZSBvbiBlbmNvZGVyIG91dHB1dCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCiAgICAgLy8gSWYganBlZyBzdHJlYW0gaXMgYXZhaWxhYmxlLCBhbmQgYSBZVVYgODg4IHN0cmVhbSBpcyBvbiBFbmNvZGVyIHBhdGgsIGFuZAogICAgIC8vIHRoZSBZVVYgc3RyZWFtJ3Mgc2l6ZSBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBKUEVHIHNpemUsIHNldCBjb21tb24KICAgICAvLyBwb3N0cHJvY2VzcyBtYXNrIHRvIE5PTkUsIHNvIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHBvc3Rwcm9jIGJ5cGFzcy4KQEAgLTE1NzYsNyArMTY3Myw3IEBACiAgICAgICAgIGNvbW1vbkZlYXR1cmVNYXNrID0gQ0FNX1FDT01fRkVBVFVSRV9QUF9TVVBFUlNFVF9IQUwzOwogICAgIH0KIAotICAgIExPR0goIm1heCB2aWV3ZmluZGVyIHdpZHRoICVkIGhlaWdodCAlZCBpc1pzbCAlZCBiVXNlQ29tbW9uRmVhdHVyZSAleCBjb21tb25GZWF0dXJlTWFzayAleCIsCisgICAgTE9HSCgibWF4IHZpZXdmaW5kZXIgd2lkdGggJWQgaGVpZ2h0ICVkIGlzWnNsICVkIGJVc2VDb21tb25GZWF0dXJlICV4IGNvbW1vbkZlYXR1cmVNYXNrICVsbHgiLAogICAgICAgICAgICAgbWF4Vmlld2ZpbmRlclNpemUud2lkdGgsIG1heFZpZXdmaW5kZXJTaXplLmhlaWdodCwgaXNac2wsIGJVc2VDb21tb25GZWF0dXJlTWFzaywKICAgICAgICAgICAgIGNvbW1vbkZlYXR1cmVNYXNrKTsKICAgICBMT0dIKCJudW1TdHJlYW1zT25FbmNvZGVyICVkLCBwcm9jZXNzZWRTdHJlYW1DbnQgJWQsIHN0YWxsY250ICVkIGJTbWFsbEpwZWdTaXplICVkIiwKQEAgLTE2OTksOSArMTc5NiwxMiBAQAogICAgIH0KIAogICAgIC8vQ3JlYXRlIG1ldGFkYXRhIGNoYW5uZWwgYW5kIGluaXRpYWxpemUgaXQKKyAgICBjYW1fZmVhdHVyZV9tYXNrX3QgbWV0YWRhdGFGZWF0dXJlTWFzayA9IENBTV9RQ09NX0ZFQVRVUkVfTk9ORTsKKyAgICBzZXRQQUFGU3VwcG9ydChtZXRhZGF0YUZlYXR1cmVNYXNrLCBDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEsCisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCk7CiAgICAgbU1ldGFkYXRhQ2hhbm5lbCA9IG5ldyBRQ2FtZXJhM01ldGFkYXRhQ2hhbm5lbChtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbEhhbmRsZSwgbUNhbWVyYUhhbmRsZS0+b3BzLCBjYXB0dXJlUmVzdWx0Q2IsCi0gICAgICAgICAgICAgICAgICAgICZwYWRkaW5nX2luZm8sIENBTV9RQ09NX0ZFQVRVUkVfTk9ORSwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIHNldEJ1ZmZlckVycm9yU3RhdHVzLCAmcGFkZGluZ19pbmZvLCBtZXRhZGF0YUZlYXR1cmVNYXNrLCB0aGlzKTsKICAgICBpZiAobU1ldGFkYXRhQ2hhbm5lbCA9PSBOVUxMKSB7CiAgICAgICAgIExPR0UoImZhaWxlZCB0byBhbGxvY2F0ZSBtZXRhZGF0YSBjaGFubmVsIik7CiAgICAgICAgIHJjID0gLUVOT01FTTsKQEAgLTE3MTksMTggKzE4MTksMzggQEAKIAogICAgIC8vIENyZWF0ZSBhbmFseXNpcyBzdHJlYW0gYWxsIHRoZSB0aW1lLCBldmVuIHdoZW4gaC93IHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZQogICAgIHsKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IGFuYWx5c2lzRmVhdHVyZU1hc2sgPSBDQU1fUUNPTV9GRUFUVVJFX1BQX1NVUEVSU0VUX0hBTDM7CisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3QgYW5hbHlzaXNJbmZvOworICAgICAgICByYyA9IG1Db21tb24uZ2V0QW5hbHlzaXNJbmZvKAorICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgIFRSVUUsCisgICAgICAgICAgICAgICAgYW5hbHlzaXNGZWF0dXJlTWFzaywKKyAgICAgICAgICAgICAgICAmYW5hbHlzaXNJbmZvKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJnZXRBbmFseXNpc0luZm8gZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisKKyAgICAgICAgY2FtX2NvbG9yX2ZpbHRlcl9hcnJhbmdlbWVudF90IGFuYWx5c2lzX2NvbG9yX2FycmFuZ2VtZW50ID0KKyAgICAgICAgICAgICAgICAoYW5hbHlzaXNJbmZvLmFuYWx5c2lzX2Zvcm1hdCA9PSBDQU1fRk9STUFUX1lfT05MWSA/CisgICAgICAgICAgICAgICAgQ0FNX0ZJTFRFUl9BUlJBTkdFTUVOVF9ZIDoKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCk7CisgICAgICAgIHNldFBBQUZTdXBwb3J0KGFuYWx5c2lzRmVhdHVyZU1hc2ssIENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUywKKyAgICAgICAgICAgICAgICBhbmFseXNpc19jb2xvcl9hcnJhbmdlbWVudCk7CisKICAgICAgICAgbUFuYWx5c2lzQ2hhbm5lbCA9IG5ldyBRQ2FtZXJhM1N1cHBvcnRDaGFubmVsKAogICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCiAgICAgICAgICAgICAgICAgbUNoYW5uZWxIYW5kbGUsCiAgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzLAotICAgICAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5hbmFseXNpc19wYWRkaW5nX2luZm8sCi0gICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9QUF9TVVBFUlNFVF9IQUwzLAorICAgICAgICAgICAgICAgICZhbmFseXNpc0luZm8uYW5hbHlzaXNfcGFkZGluZ19pbmZvLAorICAgICAgICAgICAgICAgIGFuYWx5c2lzRmVhdHVyZU1hc2ssCiAgICAgICAgICAgICAgICAgQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTLAotICAgICAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5hbmFseXNpc19yZWNvbW1lbmRlZF9yZXMsCi0gICAgICAgICAgICAgICAgKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmFuYWx5c2lzX3JlY29tbWVuZGVkX2Zvcm1hdAorICAgICAgICAgICAgICAgICZhbmFseXNpc0luZm8uYW5hbHlzaXNfbWF4X3JlcywKKyAgICAgICAgICAgICAgICAoYW5hbHlzaXNJbmZvLmFuYWx5c2lzX2Zvcm1hdAogICAgICAgICAgICAgICAgID09IENBTV9GT1JNQVRfWV9PTkxZID8gQ0FNX0ZPUk1BVF9ZX09OTFkKICAgICAgICAgICAgICAgICA6IENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxKSwKLSAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5od19hbmFseXNpc19zdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgYW5hbHlzaXNJbmZvLmh3X2FuYWx5c2lzX3N1cHBvcnRlZCwKICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgIDApOyAvLyBmb3JjZSBidWZmZXIgY291bnQgdG8gMAogICAgICAgICBpZiAoIW1BbmFseXNpc0NoYW5uZWwpIHsKQEAgLTE3NzksNiArMTg5OSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChtX2JUbnJFbmFibGVkICYmIG1fYlRuclZpZGVvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSB8PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfQ1BQX1ROUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vVE5SIGFuZCBDRFMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gU28gcmVzZXQgQ0RTIGZyb20gZmVhdHVyZSBtYXNrCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSAmPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+Q0FNX1FDT01fRkVBVFVSRV9DRFM7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8udHlwZVttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gPQpAQCAtMTc4Niw2ICsxOTA5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1fYlRuckVuYWJsZWQgJiYgbV9iVG5yUHJldmlldykgewogICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gfD0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9DUFBfVE5SOworICAgICAgICAgICAgICAgICAgICAgICAgLy9UTlIgYW5kIENEUyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBTbyByZXNldCBDRFMgZnJvbSBmZWF0dXJlIG1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnBvc3Rwcm9jZXNzX21hc2tbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdICY9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5DQU1fUUNPTV9GRUFUVVJFX0NEUzsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBwYWRkaW5nX2luZm8ud2lkdGhfcGFkZGluZyA9IG1TdXJmYWNlU3RyaWRlUGFkZGluZzsKICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ19pbmZvLmhlaWdodF9wYWRkaW5nID0gQ0FNX1BBRF9UT18yOwpAQCAtMTg1Myw2ICsxOTc5LDcgQEAKICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxNjoKICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxMDoKICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby50eXBlW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9IENBTV9TVFJFQU1fVFlQRV9SQVc7CisgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gPSBDQU1fUUNPTV9GRUFUVVJFX05PTkU7CiAgICAgICAgICAgICAgICAgaXNSYXdTdHJlYW1SZXF1ZXN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTE4NjIsNiArMTk4OSwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgc2V0UEFBRlN1cHBvcnQobVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10sCisgICAgICAgICAgICAgICAgKGNhbV9zdHJlYW1fdHlwZV90KSBtU3RyZWFtQ29uZmlnSW5mby50eXBlW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCk7CisKICAgICAgICAgaWYgKG5ld1N0cmVhbS0+cHJpdiA9PSBOVUxMKSB7CiAgICAgICAgICAgICAvL05ldyBzdHJlYW0sIGNvbnN0cnVjdCBjaGFubmVsCiAgICAgICAgICAgICBzd2l0Y2ggKG5ld1N0cmVhbS0+c3RyZWFtX3R5cGUpIHsKQEAgLTE5MDgsNyArMjAzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IG5ldyBRQ2FtZXJhM1JlZ3VsYXJDaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLCBtQ2FtZXJhSGFuZGxlLT5vcHMsIGNhcHR1cmVSZXN1bHRDYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnBhZGRpbmdfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QnVmZmVyRXJyb3JTdGF0dXMsICZnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5wYWRkaW5nX2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbV9zdHJlYW1fdHlwZV90KQpAQCAtMTkzNyw3ICsyMDY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBuZXcgUUNhbWVyYTNSZWd1bGFyQ2hhbm5lbChtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbEhhbmRsZSwgbUNhbWVyYUhhbmRsZS0+b3BzLCBjYXB0dXJlUmVzdWx0Q2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5wYWRkaW5nX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEJ1ZmZlckVycm9yU3RhdHVzLCAmZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cGFkZGluZ19pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYW1fc3RyZWFtX3R5cGVfdCkKQEAgLTE5NTAsNyArMjA4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPm1heF9idWZmZXJzID0gY2hhbm5lbC0+Z2V0TnVtQnVmZmVycygpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT5tYXhfYnVmZmVycyA9IE1BWF9JTkZMSUdIVF82MEZQU19SRVFVRVNUUzsKICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbS0+cHJpdiA9IGNoYW5uZWw7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xOTU4LDcgKzIwODksNyBAQAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gbmV3IFFDYW1lcmEzWVVWQ2hhbm5lbChtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPm9wcywgY2FwdHVyZVJlc3VsdENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYWRkaW5nX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QnVmZmVyRXJyb3JTdGF0dXMsICZwYWRkaW5nX2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbV9zdHJlYW1fdHlwZV90KQpAQCAtMTk4MCw4ICsyMTExLDkgQEAKICAgICAgICAgICAgICAgICAgICAgbVJhd0NoYW5uZWwgPSBuZXcgUUNhbWVyYTNSYXdDaGFubmVsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsIG1DaGFubmVsSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPm9wcywgY2FwdHVyZVJlc3VsdENiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYWRkaW5nX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbmV3U3RyZWFtLCBDQU1fUUNPTV9GRUFUVVJFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0QnVmZmVyRXJyb3JTdGF0dXMsICZwYWRkaW5nX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbmV3U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnBvc3Rwcm9jZXNzX21hc2tbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZXRhZGF0YUNoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5ld1N0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfUkFXMTYpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1SYXdDaGFubmVsID09IE5VTEwpIHsKQEAgLTE5OTksNyArMjEzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1QaWN0dXJlQ2hhbm5lbCA9IG5ldyBRQ2FtZXJhM1BpY0NoYW5uZWwoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwgbUNoYW5uZWxIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzLCBjYXB0dXJlUmVzdWx0Q2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhZGRpbmdfaW5mbywgdGhpcywgbmV3U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEJ1ZmZlckVycm9yU3RhdHVzLCAmcGFkZGluZ19pbmZvLCB0aGlzLCBuZXdTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iSXM0S1ZpZGVvLCBpc1pzbCwgbU1ldGFkYXRhQ2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9iSXNWaWRlbyA/IDEgOiBNQVhfSU5GTElHSFRfQkxPQikpOwpAQCAtMjAzMCw3ICsyMTYyLDggQEAKICAgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqY2hhbm5lbCA9IChRQ2FtZXJhM0NoYW5uZWwqKSBuZXdTdHJlYW0tPnByaXY7CiAgICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSBOVUxMICYmIGNoYW5uZWwtPmlzVUJXQ0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgIGNhbV9mb3JtYXRfdCBmbXQgPSBjaGFubmVsLT5nZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8udHlwZVttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10pOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8udHlwZVttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPndpZHRoLCBuZXdTdHJlYW0tPmhlaWdodCk7CiAgICAgICAgICAgICAgICAgaWYoZm10ID09IENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyX1VCV0MpIHsKICAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT51c2FnZSB8PSBHUkFMTE9DX1VTQUdFX1BSSVZBVEVfQUxMT0NfVUJXQzsKICAgICAgICAgICAgICAgICB9CkBAIC0yMDYwLDEyICsyMTkzLDE2IEBACiAgICAgaWYgKG1FbmFibGVSYXdEdW1wICYmIGlzUmF3U3RyZWFtUmVxdWVzdGVkID09IGZhbHNlKXsKICAgICAgICAgY2FtX2RpbWVuc2lvbl90IHJhd0R1bXBTaXplOwogICAgICAgICByYXdEdW1wU2l6ZSA9IGdldE1heFJhd1NpemUobUNhbWVyYUlkKTsKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IHJhd0R1bXBGZWF0dXJlTWFzayA9IENBTV9RQ09NX0ZFQVRVUkVfTk9ORTsKKyAgICAgICAgc2V0UEFBRlN1cHBvcnQocmF3RHVtcEZlYXR1cmVNYXNrLAorICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9SQVcsCisgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+Y29sb3JfYXJyYW5nZW1lbnQpOwogICAgICAgICBtUmF3RHVtcENoYW5uZWwgPSBuZXcgUUNhbWVyYTNSYXdEdW1wQ2hhbm5lbChtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPm9wcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdEdW1wU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFkZGluZ19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIENBTV9RQ09NX0ZFQVRVUkVfTk9ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgcmF3RHVtcEZlYXR1cmVNYXNrKTsKICAgICAgICAgaWYgKCFtUmF3RHVtcENoYW5uZWwpIHsKICAgICAgICAgICAgIExPR0UoIlJhdyBEdW1wIGNoYW5uZWwgY2Fubm90IGJlIGNyZWF0ZWQiKTsKICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOwpAQCAtMjA3NSwyNyArMjIxMiw1NyBAQAogCiAKICAgICBpZiAobUFuYWx5c2lzQ2hhbm5lbCkgewotICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5zdHJlYW1fc2l6ZXNbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdID0KLSAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5hbmFseXNpc19yZWNvbW1lbmRlZF9yZXM7CisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3QgYW5hbHlzaXNJbmZvOworICAgICAgICBtZW1zZXQoJmFuYWx5c2lzSW5mbywgMCwgc2l6ZW9mKGNhbV9hbmFseXNpc19pbmZvX3QpKTsKICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8udHlwZVttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gPQogICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUzsKICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gPQogICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfUFBfU1VQRVJTRVRfSEFMMzsKKyAgICAgICAgcmMgPSBtQ29tbW9uLmdldEFuYWx5c2lzSW5mbyhGQUxTRSwgVFJVRSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICAmYW5hbHlzaXNJbmZvKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJnZXRBbmFseXNpc0luZm8gZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgICAgIGNhbV9jb2xvcl9maWx0ZXJfYXJyYW5nZW1lbnRfdCBhbmFseXNpc19jb2xvcl9hcnJhbmdlbWVudCA9CisgICAgICAgICAgICAgICAgKGFuYWx5c2lzSW5mby5hbmFseXNpc19mb3JtYXQgPT0gQ0FNX0ZPUk1BVF9ZX09OTFkgPworICAgICAgICAgICAgICAgIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfWSA6CisgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+Y29sb3JfYXJyYW5nZW1lbnQpOworICAgICAgICBzZXRQQUFGU3VwcG9ydChtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby50eXBlW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICBhbmFseXNpc19jb2xvcl9hcnJhbmdlbWVudCk7CisKKyAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8uc3RyZWFtX3NpemVzW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgYW5hbHlzaXNJbmZvLmFuYWx5c2lzX21heF9yZXM7CiAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zKys7CiAgICAgfQogCiAgICAgaWYgKGlzU3VwcG9ydENoYW5uZWxOZWVkZWQoc3RyZWFtTGlzdCwgbVN0cmVhbUNvbmZpZ0luZm8pKSB7CisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3Qgc3VwcG9ydEluZm87CisgICAgICAgIG1lbXNldCgmc3VwcG9ydEluZm8sIDAsIHNpemVvZihjYW1fYW5hbHlzaXNfaW5mb190KSk7CisgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBjYWxsYmFja0ZlYXR1cmVNYXNrID0gQ0FNX1FDT01fRkVBVFVSRV9QUF9TVVBFUlNFVF9IQUwzOworICAgICAgICBzZXRQQUFGU3VwcG9ydChjYWxsYmFja0ZlYXR1cmVNYXNrLAorICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSywKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCk7CisgICAgICAgIHJjID0gbUNvbW1vbi5nZXRBbmFseXNpc0luZm8oRkFMU0UsIFRSVUUsIGNhbGxiYWNrRmVhdHVyZU1hc2ssICZzdXBwb3J0SW5mbyk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiZ2V0QW5hbHlzaXNJbmZvIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQogICAgICAgICBtU3VwcG9ydENoYW5uZWwgPSBuZXcgUUNhbWVyYTNTdXBwb3J0Q2hhbm5lbCgKICAgICAgICAgICAgICAgICBtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAogICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLAogICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPm9wcywKICAgICAgICAgICAgICAgICAmZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cGFkZGluZ19pbmZvLAotICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfUFBfU1VQRVJTRVRfSEFMMywKKyAgICAgICAgICAgICAgICBjYWxsYmFja0ZlYXR1cmVNYXNrLAogICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSywKICAgICAgICAgICAgICAgICAmUUNhbWVyYTNTdXBwb3J0Q2hhbm5lbDo6a0RpbSwKICAgICAgICAgICAgICAgICBDQU1fRk9STUFUX1lVVl80MjBfTlYyMSwKLSAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5od19hbmFseXNpc19zdXBwb3J0ZWQsCi0gICAgICAgICAgICAgICAgdGhpcyk7CisgICAgICAgICAgICAgICAgc3VwcG9ydEluZm8uaHdfYW5hbHlzaXNfc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgIHRoaXMsIDApOwogICAgICAgICBpZiAoIW1TdXBwb3J0Q2hhbm5lbCkgewogICAgICAgICAgICAgTE9HRSgiZHVtbXkgY2hhbm5lbCBjYW5ub3QgYmUgY3JlYXRlZCIpOwogICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CkBAIC0yMTEwLDYgKzIyNzcsOSBAQAogICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSzsKICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gPQogICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfUFBfU1VQRVJTRVRfSEFMMzsKKyAgICAgICAgc2V0UEFBRlN1cHBvcnQobVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10sCisgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8udHlwZVttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10sCisgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+Y29sb3JfYXJyYW5nZW1lbnQpOwogICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtcysrOwogICAgIH0KIApAQCAtMjEyMiw2ICsyMjkyLDkgQEAKICAgICAgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfUkFXOwogICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9CiAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9OT05FOworICAgICAgICBzZXRQQUFGU3VwcG9ydChtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby50eXBlW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCk7CiAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zKys7CiAgICAgfQogICAgIC8qIEluIEhGUiBtb2RlLCBpZiB2aWRlbyBzdHJlYW0gaXMgbm90IGFkZGVkLCBjcmVhdGUgYSBkdW1teSBjaGFubmVsIHNvIHRoYXQKQEAgLTIxMjksMTQgKzIzMDIsMTggQEAKICAgICAgKiBuZXZlciAnc3RhcnQnZWQgKG5vIHN0cmVhbS1vbiksIGl0IGlzIG9ubHkgJ2luaXRpYWxpemVkJyAgKi8KICAgICBpZiAoKG1PcE1vZGUgPT0gQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpICYmCiAgICAgICAgICAgICAhbV9iSXNWaWRlbykgeworICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgZHVtbXlGZWF0dXJlTWFzayA9IENBTV9RQ09NX0ZFQVRVUkVfUFBfU1VQRVJTRVRfSEFMMzsKKyAgICAgICAgc2V0UEFBRlN1cHBvcnQoZHVtbXlGZWF0dXJlTWFzaywKKyAgICAgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfVklERU8sCisgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+Y29sb3JfYXJyYW5nZW1lbnQpOwogICAgICAgICBtRHVtbXlCYXRjaENoYW5uZWwgPSBuZXcgUUNhbWVyYTNSZWd1bGFyQ2hhbm5lbChtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAogICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLAogICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPm9wcywgY2FwdHVyZVJlc3VsdENiLAotICAgICAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5wYWRkaW5nX2luZm8sCisgICAgICAgICAgICAgICAgc2V0QnVmZmVyRXJyb3JTdGF0dXMsICZnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5wYWRkaW5nX2luZm8sCiAgICAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICAgICAmbUR1bW15QmF0Y2hTdHJlYW0sCiAgICAgICAgICAgICAgICAgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPLAotICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfUFBfU1VQRVJTRVRfSEFMMywKKyAgICAgICAgICAgICAgICBkdW1teUZlYXR1cmVNYXNrLAogICAgICAgICAgICAgICAgIG1NZXRhZGF0YUNoYW5uZWwpOwogICAgICAgICBpZiAoTlVMTCA9PSBtRHVtbXlCYXRjaENoYW5uZWwpIHsKICAgICAgICAgICAgIExPR0UoImNyZWF0aW9uIG9mIG1EdW1teUJhdGNoQ2hhbm5lbCBmYWlsZWQuIgpAQCAtMjE1Miw2ICsyMzI5LDkgQEAKICAgICAgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfVklERU87CiAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnBvc3Rwcm9jZXNzX21hc2tbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdID0KICAgICAgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX1BQX1NVUEVSU0VUX0hBTDM7CisgICAgICAgIHNldFBBQUZTdXBwb3J0KG1TdHJlYW1Db25maWdJbmZvLnBvc3Rwcm9jZXNzX21hc2tbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdLAorICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnR5cGVbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdLAorICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmNvbG9yX2FycmFuZ2VtZW50KTsKICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXMrKzsKICAgICB9CiAKQEAgLTI1NTEsMjMgKzI3MzEsMzggQEAKICAgICAgKiBjb3JyZXNwb25kaW5nIGZyYW1lIG51bWJlcnMgYW5kIHRpbWUgc3RhbXBzICovCiAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOwogICAgIGlmICh1cmdlbnRfZnJhbWVfbnVtYmVyX3ZhbGlkKSB7Ci0gICAgICAgIGZpcnN0X3VyZ2VudF9mcmFtZV9udW1iZXIgPQotICAgICAgICAgICAgICAgIG1QZW5kaW5nQmF0Y2hNYXAudmFsdWVGb3IobGFzdF91cmdlbnRfZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgc3NpemVfdCBpZHggPSBtUGVuZGluZ0JhdGNoTWFwLmluZGV4T2ZLZXkobGFzdF91cmdlbnRfZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgaWYoaWR4IDwgMCkgeworICAgICAgICAgICAgTE9HRSgiSW52YWxpZCB1cmdlbnQgZnJhbWUgbnVtYmVyIHJlY2VpdmVkOiAlZC4gSXJyZWNvdmVyYWJsZSBlcnJvciIsCisgICAgICAgICAgICAgICAgbGFzdF91cmdlbnRfZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IEVSUk9SOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmlyc3RfdXJnZW50X2ZyYW1lX251bWJlciA9IG1QZW5kaW5nQmF0Y2hNYXAudmFsdWVBdChpZHgpOwogICAgICAgICB1cmdlbnRGcmFtZU51bURpZmYgPSBsYXN0X3VyZ2VudF9mcmFtZV9udW1iZXIgKyAxIC0KICAgICAgICAgICAgICAgICBmaXJzdF91cmdlbnRfZnJhbWVfbnVtYmVyOwogCi0gICAgICAgIExPR0QoInVyZ2VudF9mcm06IHZhbGlkOiAlZCBmcm1fbnVtOiAlZCAtICVkIiwKKyAgICAgICAgTE9HSCgidXJnZW50X2ZybTogdmFsaWQ6ICVkIGZybV9udW06ICVkIC0gJWQiLAogICAgICAgICAgICAgICAgICB1cmdlbnRfZnJhbWVfbnVtYmVyX3ZhbGlkLAogICAgICAgICAgICAgICAgIGZpcnN0X3VyZ2VudF9mcmFtZV9udW1iZXIsIGxhc3RfdXJnZW50X2ZyYW1lX251bWJlcik7CiAgICAgfQogCiAgICAgaWYgKGZyYW1lX251bWJlcl92YWxpZCkgewotICAgICAgICBmaXJzdF9mcmFtZV9udW1iZXIgPSBtUGVuZGluZ0JhdGNoTWFwLnZhbHVlRm9yKGxhc3RfZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgc3NpemVfdCBpZHggPSBtUGVuZGluZ0JhdGNoTWFwLmluZGV4T2ZLZXkobGFzdF9mcmFtZV9udW1iZXIpOworICAgICAgICBpZihpZHggPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGZyYW1lIG51bWJlciByZWNlaXZlZDogJWQuIElycmVjb3ZlcmFibGUgZXJyb3IiLAorICAgICAgICAgICAgICAgIGxhc3RfZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgIG1TdGF0ZSA9IEVSUk9SOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmlyc3RfZnJhbWVfbnVtYmVyID0gbVBlbmRpbmdCYXRjaE1hcC52YWx1ZUF0KGlkeCk7CiAgICAgICAgIGZyYW1lTnVtRGlmZiA9IGxhc3RfZnJhbWVfbnVtYmVyICsgMSAtCiAgICAgICAgICAgICAgICAgZmlyc3RfZnJhbWVfbnVtYmVyOwogICAgICAgICBtUGVuZGluZ0JhdGNoTWFwLnJlbW92ZUl0ZW0obGFzdF9mcmFtZV9udW1iZXIpOwogCi0gICAgICAgIExPR0QoImZybTogdmFsaWQ6ICVkIGZybV9udW06ICVkIC0gJWQiLAorICAgICAgICBMT0dIKCJmcm06IHZhbGlkOiAlZCBmcm1fbnVtOiAlZCAtICVkIiwKICAgICAgICAgICAgICAgICAgZnJhbWVfbnVtYmVyX3ZhbGlkLAogICAgICAgICAgICAgICAgIGZpcnN0X2ZyYW1lX251bWJlciwgbGFzdF9mcmFtZV9udW1iZXIpOwogCkBAIC0yNjIzLDE4ICsyODE4LDE5IEBACiAgICAgICAgICAgICBpZiAobGFzdF9mcmFtZV9jYXB0dXJlX3RpbWUpIHsKICAgICAgICAgICAgICAgICAvL0luZmVyIHRpbWVzdGFtcAogICAgICAgICAgICAgICAgIGZpcnN0X2ZyYW1lX2NhcHR1cmVfdGltZSA9IGxhc3RfZnJhbWVfY2FwdHVyZV90aW1lIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICgoKGxvb3BDb3VudCAtIDEpICogTlNFQ19QRVJfU0VDKSAvIG1IRlJWaWRlb0Zwcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKChsb29wQ291bnQgLSAxKSAqIE5TRUNfUEVSX1NFQykgLyAoZG91YmxlKSBtSEZSVmlkZW9GcHMpOwogICAgICAgICAgICAgICAgIGNhcHR1cmVfdGltZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9mcmFtZV9jYXB0dXJlX3RpbWUgKyAoaSAqIE5TRUNfUEVSX1NFQyAvIG1IRlJWaWRlb0Zwcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9mcmFtZV9jYXB0dXJlX3RpbWUgKyAoaSAqIE5TRUNfUEVSX1NFQyAvIChkb3VibGUpIG1IRlJWaWRlb0Zwcyk7CiAgICAgICAgICAgICAgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfU0VOU09SX1RJTUVTVEFNUCwgY2FwdHVyZV90aW1lKTsKLSAgICAgICAgICAgICAgICBMT0dEKCJiYXRjaCBjYXB0dXJlX3RpbWU6ICVsbGQsIGNhcHR1cmVfdGltZTogJWxsZCIsCisgICAgICAgICAgICAgICAgTE9HSCgiYmF0Y2ggY2FwdHVyZV90aW1lOiAlbGxkLCBjYXB0dXJlX3RpbWU6ICVsbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfZnJhbWVfY2FwdHVyZV90aW1lLCBjYXB0dXJlX3RpbWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKICAgICAgICAgaGFuZGxlTWV0YWRhdGFXaXRoTG9jayhtZXRhZGF0YV9idWYsCi0gICAgICAgICAgICAgICAgZmFsc2UgLyogZnJlZV9hbmRfYnVmZG9uZV9tZXRhX2J1ZiAqLyk7CisgICAgICAgICAgICAgICAgZmFsc2UgLyogZnJlZV9hbmRfYnVmZG9uZV9tZXRhX2J1ZiAqLywKKyAgICAgICAgICAgICAgICAoaSA9PSAwKSAvKiBmaXJzdCBtZXRhZGF0YSBpbiB0aGUgYmF0Y2ggbWV0YWRhdGEgKi8pOwogICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKICAgICB9CiAKQEAgLTI2NDUsNiArMjg0MSwxOSBAQAogICAgIH0KIH0KIAordm9pZCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpub3RpZnlFcnJvcih1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgY2FtZXJhM19lcnJvcl9tc2dfY29kZV90IGVycm9yQ29kZSkKK3sKKyAgICBjYW1lcmEzX25vdGlmeV9tc2dfdCBub3RpZnlfbXNnOworICAgIG1lbXNldCgmbm90aWZ5X21zZywgMCwgc2l6ZW9mKGNhbWVyYTNfbm90aWZ5X21zZ190KSk7CisgICAgbm90aWZ5X21zZy50eXBlID0gQ0FNRVJBM19NU0dfRVJST1I7CisgICAgbm90aWZ5X21zZy5tZXNzYWdlLmVycm9yLmVycm9yX2NvZGUgPSBlcnJvckNvZGU7CisgICAgbm90aWZ5X21zZy5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IE5VTEw7CisgICAgbm90aWZ5X21zZy5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciA9IGZyYW1lTnVtYmVyOworICAgIG1DYWxsYmFja09wcy0+bm90aWZ5KG1DYWxsYmFja09wcywgJm5vdGlmeV9tc2cpOworCisgICAgcmV0dXJuOworfQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZVTkNUSU9OICAgOiBoYW5kbGVNZXRhZGF0YVdpdGhMb2NrCiAgKgpAQCAtMjY1MywxMiArMjg2MiwxNSBAQAogICogUEFSQU1FVEVSUyA6IEBtZXRhZGF0YV9idWY6IG1ldGFkYXRhIGJ1ZmZlcgogICogICAgICAgICAgICAgIEBmcmVlX2FuZF9idWZkb25lX21ldGFfYnVmOiBCdWYgZG9uZSBvbiB0aGUgbWV0YSBidWYgYW5kIGZyZWUKICAqICAgICAgICAgICAgICAgICB0aGUgbWV0YSBidWYgaW4gdGhpcyBtZXRob2QKKyAqICAgICAgICAgICAgICBAZmlyc3RNZXRhZGF0YUluQmF0Y2g6IEJvb2xlYW4gdG8gaW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIHRoZQorICogICAgICAgICAgICAgICAgICBmaXJzdCBtZXRhZGF0YSBpbiBhIGJhdGNoLiBWYWxpZCBvbmx5IGZvciBiYXRjaCBtb2RlCiAgKgogICogUkVUVVJOICAgICA6CiAgKgogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiB2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmhhbmRsZU1ldGFkYXRhV2l0aExvY2soCi0gICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICptZXRhZGF0YV9idWYsIGJvb2wgZnJlZV9hbmRfYnVmZG9uZV9tZXRhX2J1ZikKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKm1ldGFkYXRhX2J1ZiwgYm9vbCBmcmVlX2FuZF9idWZkb25lX21ldGFfYnVmLAorICAgIGJvb2wgZmlyc3RNZXRhZGF0YUluQmF0Y2gpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAoKG1GbHVzaFBlcmYpIHx8IChFUlJPUiA9PSBtU3RhdGUpIHx8IChERUlOSVQgPT0gbVN0YXRlKSkgewpAQCAtMjY4Niw3ICsyODk4LDcgQEAKICAgICAgICAgICAgIFBPSU5URVJfT0ZfTUVUQShDQU1fSU5URl9NRVRBX1VSR0VOVF9GUkFNRV9OVU1CRVJfVkFMSUQsIG1ldGFkYXRhKTsKICAgICB1aW50MzJfdCAqcF91cmdlbnRfZnJhbWVfbnVtYmVyID0KICAgICAgICAgICAgIFBPSU5URVJfT0ZfTUVUQShDQU1fSU5URl9NRVRBX1VSR0VOVF9GUkFNRV9OVU1CRVIsIG1ldGFkYXRhKTsKLSAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fZnJhbWVfZHJvcHBlZF90LCBwX2NhbV9mcmFtZV9kcm9wLCBDQU1fSU5URl9NRVRBX0ZSQU1FX0RST1BQRUQsCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3N0cmVhbV9JRF90LCBwX2NhbV9mcmFtZV9kcm9wLCBDQU1fSU5URl9NRVRBX0ZSQU1FX0RST1BQRUQsCiAgICAgICAgICAgICBtZXRhZGF0YSkgewogICAgICAgICBMT0dEKCJEcm9wcGVkIGZyYW1lIGluZm8gZm9yIGZyYW1lX251bWJlcl92YWxpZCAlZCwgZnJhbWVfbnVtYmVyICVkIiwKICAgICAgICAgICAgICAgICAgKnBfZnJhbWVfbnVtYmVyX3ZhbGlkLCAqcF9mcmFtZV9udW1iZXIpOwpAQCAtMjcxMywxMCArMjkyNSwxOCBAQAogICAgICAgICBpZiAoIChjdXJyZW50U3lzVGltZSAtIHJlcS50aW1lc3RhbXApID4KICAgICAgICAgICAgIHMybnMoTUlTU0lOR19SRVFVRVNUX0JVRl9USU1FT1VUKSApIHsKICAgICAgICAgICAgIGZvciAoYXV0byAmbWlzc2VkIDogcmVxLm1QZW5kaW5nQnVmZmVyTGlzdCkgewotICAgICAgICAgICAgICAgIExPR0UoIkN1cnJlbnQgZnJhbWU6ICVkLiBNaXNzaW5nOiBmcmFtZSA9ICVkLCBidWZmZXIgPSAlcCwiCi0gICAgICAgICAgICAgICAgICAgICJzdHJlYW0gdHlwZSA9ICVkLCBzdHJlYW0gZm9ybWF0ID0gJWQiLAotICAgICAgICAgICAgICAgICAgICBmcmFtZV9udW1iZXIsIHJlcS5mcmFtZV9udW1iZXIsIG1pc3NlZC5idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIG1pc3NlZC5zdHJlYW0tPnN0cmVhbV90eXBlLCBtaXNzZWQuc3RyZWFtLT5mb3JtYXQpOworICAgICAgICAgICAgICAgIGFzc2VydChtaXNzZWQuc3RyZWFtLT5wcml2KTsKKyAgICAgICAgICAgICAgICBpZiAobWlzc2VkLnN0cmVhbS0+cHJpdikgeworICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKmNoID0gKFFDYW1lcmEzQ2hhbm5lbCAqKShtaXNzZWQuc3RyZWFtLT5wcml2KTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGNoLT5tU3RyZWFtc1swXSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaC0+bVN0cmVhbXNbMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR1coIk1pc3Npbmc6IGZyYW1lID0gJWQsIGJ1ZmZlciA9ICVwLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtIHR5cGUgPSAlZCwgc3RyZWFtIGZvcm1hdCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuZnJhbWVfbnVtYmVyLCBtaXNzZWQuYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoLT5tU3RyZWFtc1swXS0+Z2V0TXlUeXBlKCksIG1pc3NlZC5zdHJlYW0tPmZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjaC0+dGltZW91dEZyYW1lKHJlcS5mcmFtZV9udW1iZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjc4OSw3ICszMDA5LDcgQEAKICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhbnkgc3RyZWFtIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaXMgZHJvcHBlZCBvciBub3QKICAgICAgICAgLy8gSWYgZHJvcHBlZCwgdGhlbiBzZW5kIHRoZSBFUlJPUl9CVUZGRVIgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHN0cmVhbQogICAgICAgICAvLyBUaGUgQVBJIGRvZXMgbm90IGV4cGVjdCBhIGJsb2IgYnVmZmVyIHRvIGJlIGRyb3BwZWQKLSAgICAgICAgaWYgKHBfY2FtX2ZyYW1lX2Ryb3AgJiYgcF9jYW1fZnJhbWVfZHJvcC0+ZnJhbWVfZHJvcHBlZCkgeworICAgICAgICBpZiAocF9jYW1fZnJhbWVfZHJvcCkgewogICAgICAgICAgICAgLyogQ2xlYXIgbm90aWZ5X21zZyBzdHJ1Y3R1cmUgKi8KICAgICAgICAgICAgIGNhbWVyYTNfbm90aWZ5X21zZ190IG5vdGlmeV9tc2c7CiAgICAgICAgICAgICBtZW1zZXQoJm5vdGlmeV9tc2csIDAsIHNpemVvZihjYW1lcmEzX25vdGlmeV9tc2dfdCkpOwpAQCAtMjc5Nyw4ICszMDE3LDggQEAKICAgICAgICAgICAgICAgICAgICAgaiAhPSBpLT5idWZmZXJzLmVuZCgpOyBqKyspIHsKICAgICAgICAgICAgICAgICBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsICpjaGFubmVsID0gKFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwgKilqLT5zdHJlYW0tPnByaXY7CiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtSUQgPSBjaGFubmVsLT5nZXRTdHJlYW1JRChjaGFubmVsLT5nZXRTdHJlYW1UeXBlTWFzaygpKTsKLSAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGsgPSAwOyBrIDwgcF9jYW1fZnJhbWVfZHJvcC0+Y2FtX3N0cmVhbV9JRC5udW1fc3RyZWFtczsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JRCA9PSBwX2NhbV9mcmFtZV9kcm9wLT5jYW1fc3RyZWFtX0lELnN0cmVhbUlEW2tdKSB7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBrID0gMDsgayA8IHBfY2FtX2ZyYW1lX2Ryb3AtPm51bV9zdHJlYW1zOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbUlEID09IHBfY2FtX2ZyYW1lX2Ryb3AtPnN0cmVhbV9yZXF1ZXN0W2tdLnN0cmVhbUlEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIEVycm9yIG5vdGlmeSB0byBmcmFtZXdvcmtzIHdpdGggQ0FNRVJBM19NU0dfRVJST1JfQlVGRkVSCiAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCIlczogU3RhcnQgb2YgcmVwb3J0aW5nIGVycm9yIGZyYW1lIz0ldSwgc3RyZWFtSUQ9JXUgc3RyZWFtRm9ybWF0PSVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGktPmZyYW1lX251bWJlciwgc3RyZWFtSUQsIGotPnN0cmVhbS0+Zm9ybWF0KTsKQEAgLTI4MzAsMTMgKzMwNTAsMTQgQEAKICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExPR0UoIkZhdGFsOiBNaXNzaW5nIG1ldGFkYXRhIGJ1ZmZlciBmb3IgZnJhbWUgbnVtYmVyICVkIiwgaS0+ZnJhbWVfbnVtYmVyKTsKLSAgICAgICAgICAgICAgICBpZiAoZnJlZV9hbmRfYnVmZG9uZV9tZXRhX2J1ZikgewotICAgICAgICAgICAgICAgICAgICBtTWV0YWRhdGFDaGFubmVsLT5idWZEb25lKG1ldGFkYXRhX2J1Zik7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUobWV0YWRhdGFfYnVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gRVJST1I7Ci0gICAgICAgICAgICAgICAgZ290byBkb25lX21ldGFkYXRhOworCisgICAgICAgICAgICAgICAgbVBlbmRpbmdMaXZlUmVxdWVzdC0tOworCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgZHVtbXlNZXRhZGF0YTsKKyAgICAgICAgICAgICAgICBkdW1teU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsICYoaS0+cmVxdWVzdF9pZCksIDEpOworICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPSBkdW1teU1ldGFkYXRhLnJlbGVhc2UoKTsKKworICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKGktPmZyYW1lX251bWJlciwgQ0FNRVJBM19NU0dfRVJST1JfUkVTVUxUKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1QZW5kaW5nTGl2ZVJlcXVlc3QtLTsKQEAgLTI4NTIsNiArMzA3MywxMSBAQAogCiAgICAgICAgICAgICBpLT50aW1lc3RhbXAgPSBjYXB0dXJlX3RpbWU7CiAKKyAgICAgICAgICAgIC8qIFNldCB0aGUgdGltZXN0YW1wIGluIGRpc3BsYXkgbWV0YWRhdGEgc28gdGhhdCBjbGllbnRzIGF3YXJlIG9mCisgICAgICAgICAgICAgICBwcml2YXRlX2hhbmRsZSBzdWNoIGFzIFZUIGNhbiB1c2UgdGhpcyB1bi1tb2RpZmllZCB0aW1lc3RhbXBzLgorICAgICAgICAgICAgICAgQ2FtZXJhIGZyYW1ld29yayBpcyB1bmF3YXJlIG9mIHRoaXMgdGltZXN0YW1wIGFuZCBjYW5ub3QgY2hhbmdlIHRoaXMgKi8KKyAgICAgICAgICAgIHVwZGF0ZVRpbWVTdGFtcEluUGVuZGluZ0J1ZmZlcnMoaS0+ZnJhbWVfbnVtYmVyLCBpLT50aW1lc3RhbXApOworCiAgICAgICAgICAgICAvLyBGaW5kIGNoYW5uZWwgcmVxdWlyaW5nIG1ldGFkYXRhLCBtZWFuaW5nIGludGVybmFsIG9mZmxpbmUgcG9zdHByb2Nlc3MKICAgICAgICAgICAgIC8vIGlzIG5lZWRlZC4KICAgICAgICAgICAgIC8vVE9ETzogZm9yIG5vdywgd2UgZG9uJ3Qgc3VwcG9ydCB0d28gc3RyZWFtcyByZXF1aXJpbmcgbWV0YWRhdGEgYXQgdGhlIHNhbWUgdGltZS4KQEAgLTI4NjgsOSArMzA5NCwxNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gYXRyYWNlX2JlZ2luKEFUUkFDRV9UQUdfQUxXQVlTLCAidHJhbnNsYXRlRnJvbUhhbE1ldGFkYXRhIik7CiAgICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gdHJhbnNsYXRlRnJvbUhhbE1ldGFkYXRhKG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICBpLT50aW1lc3RhbXAsIGktPnJlcXVlc3RfaWQsIGktPmpwZWdNZXRhZGF0YSwgaS0+cGlwZWxpbmVfZGVwdGgsCi0gICAgICAgICAgICAgICAgICAgIGktPmNhcHR1cmVfaW50ZW50LCBpbnRlcm5hbFBwcm9jLCBpLT5md2tDYWNNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgaS0+Y2FwdHVyZV9pbnRlbnQsIGktPmh5YnJpZF9hZV9lbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAvKiBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSB0cmFuc2xhdGVGcm9tSGFsTWV0YWRhdGEgZnVuY3Rpb24gY2FsbCovCisgICAgICAgICAgICAgICAgICAgIGktPkRldkNhbURlYnVnX21ldGFfZW5hYmxlLAorICAgICAgICAgICAgICAgICAgICAvKiBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSBlbmQgKi8KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxQcHJvYywgaS0+ZndrQ2FjTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RNZXRhZGF0YUluQmF0Y2gpOworICAgICAgICAgICAgLy8gYXRyYWNlX2VuZChBVFJBQ0VfVEFHX0FMV0FZUyk7CiAKICAgICAgICAgICAgIHNhdmVFeGlmUGFyYW1zKG1ldGFkYXRhKTsKIApAQCAtMjkzNiwxMiArMzE2OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBqLT5idWZmZXItPnN0YXR1cyB8PSBtUGVuZGluZ0J1ZmZlcnNNYXAuZ2V0QnVmRXJyU3RhdHVzKGotPmJ1ZmZlci0+YnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQnVmZmVyc01hcC5yZW1vdmVCdWYoai0+YnVmZmVyLT5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X2J1ZmZlcnNbcmVzdWx0X2J1ZmZlcnNfaWR4KytdID0gKihqLT5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShqLT5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgai0+YnVmZmVyID0gTlVMTDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHJlc3VsdC5vdXRwdXRfYnVmZmVycyA9IHJlc3VsdF9idWZmZXJzOwogICAgICAgICAgICAgICAgIG1DYWxsYmFja09wcy0+cHJvY2Vzc19jYXB0dXJlX3Jlc3VsdChtQ2FsbGJhY2tPcHMsICZyZXN1bHQpOwogICAgICAgICAgICAgICAgIExPR0QoIm1ldGEgZnJhbWVfbnVtYmVyID0gJXUsIGNhcHR1cmVfdGltZSA9ICVsbGQiLApAQCAtMzE0NSw2ICszMzgwLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBidWZmZXItPnN0YXR1cyB8PSBtUGVuZGluZ0J1ZmZlcnNNYXAuZ2V0QnVmRXJyU3RhdHVzKGJ1ZmZlci0+YnVmZmVyKTsKICAgICAgICAgcmVzdWx0Lm91dHB1dF9idWZmZXJzID0gYnVmZmVyOwogICAgICAgICBMT0dIKCJyZXN1bHQgZnJhbWVfbnVtYmVyID0gJWQsIGJ1ZmZlciA9ICVwIiwKICAgICAgICAgICAgICAgICAgZnJhbWVfbnVtYmVyLCBidWZmZXItPmJ1ZmZlcik7CkBAIC0zMTgwLDYgKzM0MTYsNyBAQAogICAgICAgICAgICAgICAgICAgIExPR0UoImlucHV0IGJ1ZmZlciBzeW5jIHdhaXQgZmFpbGVkICVkIiwgcmMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyLT5zdGF0dXMgfD0gbVBlbmRpbmdCdWZmZXJzTWFwLmdldEJ1ZkVyclN0YXR1cyhidWZmZXItPmJ1ZmZlcik7CiAgICAgICAgICAgICBtUGVuZGluZ0J1ZmZlcnNNYXAucmVtb3ZlQnVmKGJ1ZmZlci0+YnVmZmVyKTsKIAogICAgICAgICAgICAgYm9vbCBub3RpZnlOb3cgPSB0cnVlOwpAQCAtMzI3MCw4ICszNTA3LDYgQEAKICAgICBpbnQgcmMgPSBOT19FUlJPUjsKICAgICBpbnQzMl90IHJlcXVlc3RfaWQ7CiAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YTsKLSAgICB1aW50MzJfdCBtaW5JbkZsaWdodFJlcXVlc3RzID0gTUlOX0lORkxJR0hUX1JFUVVFU1RTOwotICAgIHVpbnQzMl90IG1heEluRmxpZ2h0UmVxdWVzdHMgPSBNQVhfSU5GTElHSFRfUkVRVUVTVFM7CiAgICAgYm9vbCBpc1ZpZEJ1ZlJlcXVlc3RlZCA9IGZhbHNlOwogICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpwSW5wdXRCdWZmZXIgPSBOVUxMOwogCkBAIC0zMzg0LDE0ICszNjE5LDUwIEBACiAgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGRpc2FibGUgQ0RTIGZvciBIRlIgbW9kZSIpOwogCiAgICAgICAgIH0KKworICAgICAgICBpZiAobV9kZWJ1Z19hdnRpbWVyIHx8IG1ldGEuZXhpc3RzKFFDQU1FUkEzX1VTRV9BVl9USU1FUikpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QqIHVzZV9hdl90aW1lciA9IE5VTEw7CisKKyAgICAgICAgICAgIGlmIChtX2RlYnVnX2F2dGltZXIpeworICAgICAgICAgICAgICAgIHVzZV9hdl90aW1lciA9ICZtX2RlYnVnX2F2dGltZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIHVzZV9hdl90aW1lciA9CisgICAgICAgICAgICAgICAgICAgIG1ldGEuZmluZChRQ0FNRVJBM19VU0VfQVZfVElNRVIpLmRhdGEudTg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1QYXJhbWV0ZXJzLCBDQU1fSU5URl9NRVRBX1VTRV9BVl9USU1FUiwgKnVzZV9hdl90aW1lcikpIHsKKyAgICAgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHNldE1vYmljYXQoKTsKIAogICAgICAgICAvKiBTZXQgZnBzIGFuZCBoZnIgbW9kZSB3aGlsZSBzZW5kaW5nIG1ldGEgc3RyZWFtIGluZm8gc28gdGhhdCBzZW5zb3IKICAgICAgICAgICogY2FuIGNvbmZpZ3VyZSBhcHByb3ByaWF0ZSBzdHJlYW1pbmcgbW9kZSAqLwogICAgICAgICBtSEZSVmlkZW9GcHMgPSBERUZBVUxUX1ZJREVPX0ZQUzsKKyAgICAgICAgbU1pbkluRmxpZ2h0UmVxdWVzdHMgPSBNSU5fSU5GTElHSFRfUkVRVUVTVFM7CisgICAgICAgIG1NYXhJbkZsaWdodFJlcXVlc3RzID0gTUFYX0lORkxJR0hUX1JFUVVFU1RTOwogICAgICAgICBpZiAobWV0YS5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FFX1RBUkdFVF9GUFNfUkFOR0UpKSB7CiAgICAgICAgICAgICByYyA9IHNldEhhbEZwc1JhbmdlKG1ldGEsIG1QYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhfZnBzID0KKyAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpIG1ldGEuZmluZChBTkRST0lEX0NPTlRST0xfQUVfVEFSR0VUX0ZQU19SQU5HRSkuZGF0YS5pMzJbMV07CisgICAgICAgICAgICAgICAgaWYgKG1CYXRjaFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRm9yIEhGUiwgbW9yZSBidWZmZXJzIGFyZSBkZXF1ZXVlZCB1cGZyb250IHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlICovCisgICAgICAgICAgICAgICAgICAgIG1NaW5JbkZsaWdodFJlcXVlc3RzID0gTUlOX0lORkxJR0hUX0hGUl9SRVFVRVNUUzsKKyAgICAgICAgICAgICAgICAgICAgbU1heEluRmxpZ2h0UmVxdWVzdHMgPSBNQVhfSU5GTElHSFRfSEZSX1JFUVVFU1RTOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF4X2ZwcyA9PSA2MCkgeworICAgICAgICAgICAgICAgICAgICAvKiBmb3IgNjAgZnBzIHVzZWNhcyBpbmNyZWFzZSBpbmZsaWdodCByZXF1ZXN0cyAqLworICAgICAgICAgICAgICAgICAgICBtTWluSW5GbGlnaHRSZXF1ZXN0cyA9IE1JTl9JTkZMSUdIVF82MEZQU19SRVFVRVNUUzsKKyAgICAgICAgICAgICAgICAgICAgbU1heEluRmxpZ2h0UmVxdWVzdHMgPSBNQVhfSU5GTElHSFRfNjBGUFNfUkVRVUVTVFM7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ2FwdHVyZUludGVudCA9PSBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfVklERU9fUkVDT1JEKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGZvciBub24gNjAgZnBzIHZpZGVvIHVzZSBjYXNlcywgc2V0IG1pbiA9IG1heCBpbmZsaWdodCByZXF1ZXN0cyB0bworICAgICAgICAgICAgICAgICAgICBhdm9pZCBmcmFtZSBkcm9wcyBkdWUgdG8gZGVncmFkZWQgc3lzdGVtIHBlcmZvcm1hbmNlICovCisgICAgICAgICAgICAgICAgICAgIG1NaW5JbkZsaWdodFJlcXVlc3RzID0gTUFYX0lORkxJR0hUX1JFUVVFU1RTOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIExPR0UoInNldEhhbEZwc1JhbmdlIGZhaWxlZCIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zNDAyLDYgKzM2NzMsOCBAQAogICAgICAgICAgICAgICAgIExPR0UoImV4dHJhY3RTY2VuZU1vZGUgZmFpbGVkIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KCZtQmF0Y2hlZFN0cmVhbXNBcnJheSwgMCwgc2l6ZW9mKGNhbV9zdHJlYW1fSURfdCkpOworCiAKICAgICAgICAgLy9UT0RPOiB2YWxpZGF0ZSB0aGUgYXJndW1lbnRzLCBIU1Ygc2NlbmVtb2RlIHNob3VsZCBoYXZlIG9ubHkgdGhlCiAgICAgICAgIC8vYWR2ZXJ0aXNlZCBmcHMgcmFuZ2VzCkBAIC0zNDE4LDYgKzM2OTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW2ldLAogICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5mb3JtYXRbaV0pOwogICAgICAgICB9CisKICAgICAgICAgcmMgPSBtQ2FtZXJhSGFuZGxlLT5vcHMtPnNldF9wYXJtcyhtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycyk7CiAgICAgICAgIGlmIChyYyA8IDApIHsKQEAgLTM1MjEsNiArMzc5NSw2MyBAQAogICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OwogICAgICAgICB9CiAKKyAgICAgICAgLy91cGRhdGUgc2V0dGluZ3MgZnJvbSBhcHAgaGVyZQorICAgICAgICBpZiAobWV0YS5leGlzdHMoUUNBTUVSQTNfRFVBTENBTV9MSU5LX0VOQUJMRSkpIHsKKyAgICAgICAgICAgIG1Jc0RldmljZUxpbmtlZCA9IG1ldGEuZmluZChRQ0FNRVJBM19EVUFMQ0FNX0xJTktfRU5BQkxFKS5kYXRhLnU4WzBdOworICAgICAgICAgICAgTE9HSCgiRHVhbGNhbTogc2V0dGluZyBPbj0lZCBpZCA9JWQiLCBtSXNEZXZpY2VMaW5rZWQsIG1DYW1lcmFJZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGEuZXhpc3RzKFFDQU1FUkEzX0RVQUxDQU1fTElOS19JU19NQUlOKSkgeworICAgICAgICAgICAgbUlzTWFpbkNhbWVyYSA9IG1ldGEuZmluZChRQ0FNRVJBM19EVUFMQ0FNX0xJTktfSVNfTUFJTikuZGF0YS51OFswXTsKKyAgICAgICAgICAgIExPR0goIkR1YWxjYW06IElzIHRoaXMgbWFpbiBjYW1lcmEgPSAlZCBpZCA9JWQiLCBtSXNNYWluQ2FtZXJhLCBtQ2FtZXJhSWQpOworICAgICAgICB9CisgICAgICAgIGlmIChtZXRhLmV4aXN0cyhRQ0FNRVJBM19EVUFMQ0FNX0xJTktfUkVMQVRFRF9DQU1FUkFfSUQpKSB7CisgICAgICAgICAgICBtTGlua2VkQ2FtZXJhSWQgPSBtZXRhLmZpbmQoUUNBTUVSQTNfRFVBTENBTV9MSU5LX1JFTEFURURfQ0FNRVJBX0lEKS5kYXRhLnU4WzBdOworICAgICAgICAgICAgTE9HSCgiRHVhbGNhbTogTGlua2VkIGNhbWVyYSBJZCAlZCBpZCA9JWQiLCBtTGlua2VkQ2FtZXJhSWQsIG1DYW1lcmFJZCk7CisKKyAgICAgICAgICAgIGlmICggKG1MaW5rZWRDYW1lcmFJZCA+PSBNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTKSAmJgorICAgICAgICAgICAgICAgIChtTGlua2VkQ2FtZXJhSWQgIT0gbUNhbWVyYUlkKSApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJEdWFsY2FtOiBtTGlua2VkQ2FtZXJhSWQgJWQgaXMgaW52YWxpZCwgY3VycmVudCBjYW0gaWQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgIG1MaW5rZWRDYW1lcmFJZCwgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgYnVuZGxlIHJlbGF0ZWQgY2FtZXJhcworICAgICAgICBMT0dIKCIlczogRHVhbGNhbTogaWQgPSVkLCBtSXNEZXZpY2VMaW5rZWQ9JWQiLCBfX2Z1bmNfXyxtQ2FtZXJhSWQsIG1Jc0RldmljZUxpbmtlZCk7CisgICAgICAgIGlmIChtZXRhLmV4aXN0cyhRQ0FNRVJBM19EVUFMQ0FNX0xJTktfRU5BQkxFKSkgeworICAgICAgICAgICAgaWYgKG1Jc0RldmljZUxpbmtlZCkKKyAgICAgICAgICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT5zeW5jX2NvbnRyb2wgPSBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT047CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+c3luY19jb250cm9sID0gQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09GRjsKKworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnQ2FtTG9jayk7CisKKyAgICAgICAgICAgIGlmIChzZXNzaW9uSWRbbUxpbmtlZENhbWVyYUlkXSA9PSAweERFQURCRUVGKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRHVhbGNhbTogSW52YWxpZCBTZXNzaW9uIElkICIpOworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnQ2FtTG9jayk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUlzTWFpbkNhbWVyYSA9PSAxKSB7CisgICAgICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+bW9kZSA9IENBTV9NT0RFX1BSSU1BUlk7CisgICAgICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+dHlwZSA9IENBTV9UWVBFX01BSU47CisgICAgICAgICAgICAgICAgLy8gcmVsYXRlZCBzZXNzaW9uIGlkIHNob3VsZCBiZSBzZXNzaW9uIGlkIG9mIGxpbmtlZCBzZXNzaW9uCisgICAgICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+cmVsYXRlZF9zZW5zb3Jfc2Vzc2lvbl9pZCA9IHNlc3Npb25JZFttTGlua2VkQ2FtZXJhSWRdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT5tb2RlID0gQ0FNX01PREVfU0VDT05EQVJZOworICAgICAgICAgICAgICAgIG1fcFJlbENhbVN5bmNCdWYtPnR5cGUgPSBDQU1fVFlQRV9BVVg7CisgICAgICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+cmVsYXRlZF9zZW5zb3Jfc2Vzc2lvbl9pZCA9IHNlc3Npb25JZFttTGlua2VkQ2FtZXJhSWRdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdDYW1Mb2NrKTsKKworICAgICAgICAgICAgcmMgPSBtQ2FtZXJhSGFuZGxlLT5vcHMtPnN5bmNfcmVsYXRlZF9zZW5zb3JzKAorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLCBtX3BSZWxDYW1TeW5jQnVmKTsKKyAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJEdWFsY2FtOiBsaW5rIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIC8vVGhlbiBzdGFydCB0aGVtLgogICAgICAgICBMT0dIKCJTdGFydCBNRVRBIENoYW5uZWwiKTsKICAgICAgICAgcmMgPSBtTWV0YWRhdGFDaGFubmVsLT5zdGFydCgpOwpAQCAtMzYwMiw3ICszOTMzLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0KICAgICAgICAgZ290byBub19lcnJvcjsKIGVycm9yX2V4aXQ6CiAgICAgICAgIG1fcGVyZkxvY2subG9ja19yZWwoKTsKQEAgLTM2MTcsNyArMzk0Nyw3IEBACiAgICAgfQogCiAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIgPSByZXF1ZXN0LT5mcmFtZV9udW1iZXI7Ci0gICAgY2FtX3N0cmVhbV9JRF90IHN0cmVhbUlEOworICAgIGNhbV9zdHJlYW1fSURfdCBzdHJlYW1zQXJyYXk7CiAKICAgICBpZiAobUZsdXNoUGVyZikgewogICAgICAgICAvL3dlIGNhbm5vdCBhY2NlcHQgYW55IHJlcXVlc3RzIGR1cmluZyBmbHVzaApAQCAtMzY0NSw3ICszOTc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPmlucHV0X2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKICAgICAvLyBBY3F1aXJlIGFsbCByZXF1ZXN0IGJ1ZmZlcnMgZmlyc3QKLSAgICBzdHJlYW1JRC5udW1fc3RyZWFtcyA9IDA7CisgICAgc3RyZWFtc0FycmF5Lm51bV9zdHJlYW1zID0gMDsKICAgICBpbnQgYmxvYl9yZXF1ZXN0ID0gMDsKICAgICB1aW50MzJfdCBzbmFwc2hvdFN0cmVhbUlkID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVyczsgaSsrKSB7CkBAIC0zNjY4LDkgKzM5OTgsOCBAQAogICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBzdHJlYW1JRC5zdHJlYW1JRFtzdHJlYW1JRC5udW1fc3RyZWFtc10gPQorICAgICAgICBzdHJlYW1zQXJyYXkuc3RyZWFtX3JlcXVlc3Rbc3RyZWFtc0FycmF5Lm51bV9zdHJlYW1zKytdLnN0cmVhbUlEID0KICAgICAgICAgICAgIGNoYW5uZWwtPmdldFN0cmVhbUlEKGNoYW5uZWwtPmdldFN0cmVhbVR5cGVNYXNrKCkpOwotICAgICAgICBzdHJlYW1JRC5udW1fc3RyZWFtcysrOwogCiAgICAgICAgIGlmICgoMVUgPDwgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPKSA9PSBjaGFubmVsLT5nZXRTdHJlYW1UeXBlTWFzaygpKSB7CiAgICAgICAgICAgICBpc1ZpZEJ1ZlJlcXVlc3RlZCA9IHRydWU7CkBAIC0zNjgyLDkgKzQwMTEsOSBAQAogICAgIH0KICAgICBpZiAoYmxvYl9yZXF1ZXN0ICYmIG1SYXdEdW1wQ2hhbm5lbCkgewogICAgICAgICBMT0dEKCJUcmlnZ2VyIFJhdyBiYXNlZCBvbiBibG9iIHJlcXVlc3QgaWYgUmF3IGR1bXAgaXMgZW5hYmxlZCIpOwotICAgICAgICBzdHJlYW1JRC5zdHJlYW1JRFtzdHJlYW1JRC5udW1fc3RyZWFtc10gPQorICAgICAgICBzdHJlYW1zQXJyYXkuc3RyZWFtX3JlcXVlc3Rbc3RyZWFtc0FycmF5Lm51bV9zdHJlYW1zXS5zdHJlYW1JRCA9CiAgICAgICAgICAgICBtUmF3RHVtcENoYW5uZWwtPmdldFN0cmVhbUlEKG1SYXdEdW1wQ2hhbm5lbC0+Z2V0U3RyZWFtVHlwZU1hc2soKSk7Ci0gICAgICAgIHN0cmVhbUlELm51bV9zdHJlYW1zKys7CisgICAgICAgIHN0cmVhbXNBcnJheS5zdHJlYW1fcmVxdWVzdFtzdHJlYW1zQXJyYXkubnVtX3N0cmVhbXMrK10uYnVmX2luZGV4ID0gQ0FNX0ZSRUVSVU5fSURYOwogICAgIH0KIAogICAgIGlmKHJlcXVlc3QtPmlucHV0X2J1ZmZlciA9PSBOVUxMKSB7CkBAIC0zNjk4LDcgKzQwMjcsNyBAQAogICAgICAgICBpZiAoIW1CYXRjaFNpemUgfHwKICAgICAgICAgICAgKG1CYXRjaFNpemUgJiYgIWlzVmlkQnVmUmVxdWVzdGVkKSB8fAogICAgICAgICAgICAobUJhdGNoU2l6ZSAmJiBpc1ZpZEJ1ZlJlcXVlc3RlZCAmJiAhbVRvQmVRdWV1ZWRWaWRCdWZzKSkgewotICAgICAgICAgICAgcmMgPSBzZXRGcmFtZVBhcmFtZXRlcnMocmVxdWVzdCwgc3RyZWFtSUQsIGJsb2JfcmVxdWVzdCwgc25hcHNob3RTdHJlYW1JZCk7CisgICAgICAgICAgICByYyA9IHNldEZyYW1lUGFyYW1ldGVycyhyZXF1ZXN0LCBzdHJlYW1zQXJyYXksIGJsb2JfcmVxdWVzdCwgc25hcHNob3RTdHJlYW1JZCk7CiAgICAgICAgICAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgICAgICAgICAgTE9HRSgiZmFpbCB0byBzZXQgZnJhbWUgcGFyYW1ldGVycyIpOwogICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOwpAQCAtMzc4MSw3ICs0MTEwLDE5IEBACiAgICAgICAgIG1DYXB0dXJlSW50ZW50ID0KICAgICAgICAgICAgICAgICBtZXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UKS5kYXRhLnU4WzBdOwogICAgIH0KKyAgICBpZiAobWV0YS5leGlzdHMoTkVYVVNfRVhQRVJJTUVOVEFMXzIwMTZfSFlCUklEX0FFX0VOQUJMRSkpIHsKKyAgICAgICAgbUh5YnJpZEFlRW5hYmxlID0KKyAgICAgICAgICAgICAgICBtZXRhLmZpbmQoTkVYVVNfRVhQRVJJTUVOVEFMXzIwMTZfSFlCUklEX0FFX0VOQUJMRSkuZGF0YS51OFswXTsKKyAgICB9CiAgICAgcGVuZGluZ1JlcXVlc3QuY2FwdHVyZV9pbnRlbnQgPSBtQ2FwdHVyZUludGVudDsKKyAgICBwZW5kaW5nUmVxdWVzdC5oeWJyaWRfYWVfZW5hYmxlID0gbUh5YnJpZEFlRW5hYmxlOworICAgIC8qIERldkNhbURlYnVnIG1ldGFkYXRhIHByb2Nlc3NDYXB0dXJlUmVxdWVzdCAqLworICAgIGlmIChtZXRhLmV4aXN0cyhERVZDQU1ERUJVR19NRVRBX0VOQUJMRSkpIHsKKyAgICAgICAgbURldkNhbURlYnVnTWV0YUVuYWJsZSA9CisgICAgICAgICAgICAgICAgbWV0YS5maW5kKERFVkNBTURFQlVHX01FVEFfRU5BQkxFKS5kYXRhLnU4WzBdOworICAgIH0KKyAgICBwZW5kaW5nUmVxdWVzdC5EZXZDYW1EZWJ1Z19tZXRhX2VuYWJsZSA9IG1EZXZDYW1EZWJ1Z01ldGFFbmFibGU7CisgICAgLyogRGV2Q2FtRGVidWcgbWV0YWRhdGEgZW5kICovCiAKICAgICAvL2V4dHJhY3QgQ0FDIGluZm8KICAgICBpZiAobWV0YS5leGlzdHMoQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERSkpIHsKQEAgLTM4MjAsMTIgKzQxNjEsMTQgQEAKICAgICBsYXRlc3RSZXF1ZXN0ID0gbVBlbmRpbmdSZXF1ZXN0c0xpc3QuaW5zZXJ0KAogICAgICAgICAgICAgbVBlbmRpbmdSZXF1ZXN0c0xpc3QuZW5kKCksIHBlbmRpbmdSZXF1ZXN0KTsKICAgICBpZihtRmx1c2gpIHsKKyAgICAgICAgTE9HSSgibUZsdXNoIGlzIHRydWUiKTsKICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKKyAgICBpbnQgaW5kZXhVc2VkOwogICAgIC8vIE5vdGlmeSBtZXRhZGF0YSBjaGFubmVsIHdlIHJlY2VpdmUgYSByZXF1ZXN0Ci0gICAgbU1ldGFkYXRhQ2hhbm5lbC0+cmVxdWVzdChOVUxMLCBmcmFtZU51bWJlcik7CisgICAgbU1ldGFkYXRhQ2hhbm5lbC0+cmVxdWVzdChOVUxMLCBmcmFtZU51bWJlciwgaW5kZXhVc2VkKTsKIAogICAgIGlmKHJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBOVUxMKXsKICAgICAgICAgTE9HRCgiSW5wdXQgcmVxdWVzdCwgZnJhbWVfbnVtYmVyICVkIiwgZnJhbWVOdW1iZXIpOwpAQCAtMzg1NCw3ICs0MTk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnVmZmVyLCByZXF1ZXN0LT5pbnB1dF9idWZmZXIsIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIGlmKHJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBOVUxMKXsKICAgICAgICAgICAgICAgICByYyA9IGNoYW5uZWwtPnJlcXVlc3Qob3V0cHV0LmJ1ZmZlciwgZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmZXIsICZtUmVwcm9jTWV0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmZXIsICZtUmVwcm9jTWV0YSwgaW5kZXhVc2VkKTsKICAgICAgICAgICAgICAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWwgdG8gcmVxdWVzdCBvbiBwaWN0dXJlIGNoYW5uZWwiKTsKICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CkBAIC0zODY1LDQxICs0MjA4LDY0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmJ1ZmZlciwgZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdC0+c2V0dGluZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgcmMgPSBjaGFubmVsLT5yZXF1ZXN0KG91dHB1dC5idWZmZXIsIGZyYW1lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIG1QcmV2UGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgbVByZXZQYXJhbWV0ZXJzLCBpbmRleFVzZWQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHJjID0gY2hhbm5lbC0+cmVxdWVzdChvdXRwdXQuYnVmZmVyLCBmcmFtZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBtUGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgbVBhcmFtZXRlcnMsIGluZGV4VXNlZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgTE9HRSgiRmFpbCB0byByZXF1ZXN0IG9uIHBpY3R1cmUgY2hhbm5lbCIpOwogICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOwogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbUlkID0gY2hhbm5lbC0+Z2V0U3RyZWFtSUQoY2hhbm5lbC0+Z2V0U3RyZWFtVHlwZU1hc2soKSk7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaiA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHN0cmVhbXNBcnJheS5udW1fc3RyZWFtczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1zQXJyYXkuc3RyZWFtX3JlcXVlc3Rbal0uc3RyZWFtSUQgPT0gc3RyZWFtSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAobU9wTW9kZSA9PSBDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtc0FycmF5LnN0cmVhbV9yZXF1ZXN0W2pdLmJ1Zl9pbmRleCA9IENBTV9GUkVFUlVOX0lEWDsKKyAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbXNBcnJheS5zdHJlYW1fcmVxdWVzdFtqXS5idWZfaW5kZXggPSBpbmRleFVzZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSBzdHJlYW1zQXJyYXkubnVtX3N0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiRGlkIG5vdCBmaW5kIG1hdGNoaW5nIHN0cmVhbSB0byB1cGRhdGUgaW5kZXgiKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHBlbmRpbmdCdWZmZXJJdGVyLT5uZWVkX21ldGFkYXRhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBzdHJlYW1zX25lZWRfbWV0YWRhdGErKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChvdXRwdXQuc3RyZWFtLT5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4KSB7CiAgICAgICAgICAgICBib29sIG5lZWRNZXRhZGF0YSA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAobV9wZXJmTG9jay5pc1BlcmZMb2NrVGltZWRBY3F1aXJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1fcGVyZkxvY2suaXNUaW1lclJlc2V0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtX3BlcmZMb2NrLmxvY2tfcmVsX3RpbWVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1fcGVyZkxvY2subG9ja19hY3FfdGltZWQoQlVSU1RfUkVQUk9DRVNTX1BFUkZfVElNRV9PVVQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbV9wZXJmTG9jay5sb2NrX2FjcV90aW1lZChCVVJTVF9SRVBST0NFU1NfUEVSRl9USU1FX09VVCk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIFFDYW1lcmEzWVVWQ2hhbm5lbCAqeXV2Q2hhbm5lbCA9IChRQ2FtZXJhM1lVVkNoYW5uZWwgKiljaGFubmVsOwogICAgICAgICAgICAgcmMgPSB5dXZDaGFubmVsLT5yZXF1ZXN0KG91dHB1dC5idWZmZXIsIGZyYW1lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIChwSW5wdXRCdWZmZXIgPyAmbVJlcHJvY01ldGEgOiBtUGFyYW1ldGVycyksIG5lZWRNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIChwSW5wdXRCdWZmZXIgPyAmbVJlcHJvY01ldGEgOiBtUGFyYW1ldGVycyksIG5lZWRNZXRhZGF0YSwgaW5kZXhVc2VkKTsKICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsIHRvIHJlcXVlc3Qgb24gWVVWIGNoYW5uZWwiKTsKICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmM7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbUlkID0gY2hhbm5lbC0+Z2V0U3RyZWFtSUQoY2hhbm5lbC0+Z2V0U3RyZWFtVHlwZU1hc2soKSk7CisgICAgICAgICAgICB1aW50MzJfdCBqID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdHJlYW1zQXJyYXkubnVtX3N0cmVhbXM7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChzdHJlYW1zQXJyYXkuc3RyZWFtX3JlcXVlc3Rbal0uc3RyZWFtSUQgPT0gc3RyZWFtSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1PcE1vZGUgPT0gQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zQXJyYXkuc3RyZWFtX3JlcXVlc3Rbal0uYnVmX2luZGV4ID0gQ0FNX0ZSRUVSVU5fSURYOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zQXJyYXkuc3RyZWFtX3JlcXVlc3Rbal0uYnVmX2luZGV4ID0gaW5kZXhVc2VkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA9PSBzdHJlYW1zQXJyYXkubnVtX3N0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJEaWQgbm90IGZpbmQgbWF0Y2hpbmcgc3RyZWFtIHRvIHVwZGF0ZSBpbmRleCIpOworICAgICAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcGVuZGluZ0J1ZmZlckl0ZXItPm5lZWRfbWV0YWRhdGEgPSBuZWVkTWV0YWRhdGE7CiAgICAgICAgICAgICBpZiAobmVlZE1ldGFkYXRhKQogICAgICAgICAgICAgICAgIHN0cmVhbXNfbmVlZF9tZXRhZGF0YSArPSAxOwpAQCAtMzkwOCwyMCArNDI3NCwyNSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTE9HRCgicmVxdWVzdCB3aXRoIGJ1ZmZlciAlcCwgZnJhbWVfbnVtYmVyICVkIiwKICAgICAgICAgICAgICAgICAgIG91dHB1dC5idWZmZXIsIGZyYW1lTnVtYmVyKTsKLSAgICAgICAgICAgIC8qIFNldCBwZXJmIGxvY2sgZm9yIEFQSS0yIHpzbCAqLwotICAgICAgICAgICAgaWYgKElTX1VTQUdFX1pTTChvdXRwdXQuc3RyZWFtLT51c2FnZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAobV9wZXJmTG9jay5pc1BlcmZMb2NrVGltZWRBY3F1aXJlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BlcmZMb2NrLmlzVGltZXJSZXNldCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BlcmZMb2NrLmxvY2tfcmVsX3RpbWVkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BlcmZMb2NrLmxvY2tfYWNxX3RpbWVkKEJVUlNUX1JFUFJPQ0VTU19QRVJGX1RJTUVfT1VUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1fcGVyZkxvY2subG9ja19hY3FfdGltZWQoQlVSU1RfUkVQUk9DRVNTX1BFUkZfVElNRV9PVVQpOworCisgICAgICAgICAgICByYyA9IGNoYW5uZWwtPnJlcXVlc3Qob3V0cHV0LmJ1ZmZlciwgZnJhbWVOdW1iZXIsIGluZGV4VXNlZCk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbUlkID0gY2hhbm5lbC0+Z2V0U3RyZWFtSUQoY2hhbm5lbC0+Z2V0U3RyZWFtVHlwZU1hc2soKSk7CisgICAgICAgICAgICB1aW50MzJfdCBqID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdHJlYW1zQXJyYXkubnVtX3N0cmVhbXM7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChzdHJlYW1zQXJyYXkuc3RyZWFtX3JlcXVlc3Rbal0uc3RyZWFtSUQgPT0gc3RyZWFtSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1PcE1vZGUgPT0gQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zQXJyYXkuc3RyZWFtX3JlcXVlc3Rbal0uYnVmX2luZGV4ID0gQ0FNX0ZSRUVSVU5fSURYOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zQXJyYXkuc3RyZWFtX3JlcXVlc3Rbal0uYnVmX2luZGV4ID0gaW5kZXhVc2VkOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA9PSBzdHJlYW1zQXJyYXkubnVtX3N0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJEaWQgbm90IGZpbmQgbWF0Y2hpbmcgc3RyZWFtIHRvIHVwZGF0ZSBpbmRleCIpOworICAgICAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmMgPSBjaGFubmVsLT5yZXF1ZXN0KG91dHB1dC5idWZmZXIsIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIGlmICgoKDFVIDw8IENBTV9TVFJFQU1fVFlQRV9WSURFTykgPT0gY2hhbm5lbC0+Z2V0U3RyZWFtVHlwZU1hc2soKSkKICAgICAgICAgICAgICAgICAgICAgJiYgbUJhdGNoU2l6ZSkgewogICAgICAgICAgICAgICAgIG1Ub0JlUXVldWVkVmlkQnVmcysrOwpAQCAtMzk0Nyw3ICs0MzE4LDcgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0gICAgaWYocmVxdWVzdC0+aW5wdXRfYnVmZmVyID09IE5VTEwpIHsKKyAgICBpZiAocmVxdWVzdC0+aW5wdXRfYnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgLyogU2V0IHRoZSBwYXJhbWV0ZXJzIHRvIGJhY2tlbmQ6CiAgICAgICAgICAqIC0gRm9yIGV2ZXJ5IHJlcXVlc3QgaW4gTk9STUFMIE1PREUKICAgICAgICAgICogLSBGb3IgZXZlcnkgcmVxdWVzdCBpbiBIRlIgbW9kZSBkdXJpbmcgcHJldmlldyBvbmx5IGNhc2UKQEAgLTM5NTksNiArNDMzMCwzMSBAQAogICAgICAgICAgICAgTE9HRCgic2V0X3Bhcm1zICBiYXRjaFN6OiAlZCBJc1ZpZEJ1ZlJlcTogJWQgdmlkQnVmVG9iZVFkOiAlZCAiLAogICAgICAgICAgICAgICAgICAgICAgbUJhdGNoU2l6ZSwgaXNWaWRCdWZSZXF1ZXN0ZWQsCiAgICAgICAgICAgICAgICAgICAgIG1Ub0JlUXVldWVkVmlkQnVmcyk7CisKKyAgICAgICAgICAgIGlmKG1CYXRjaFNpemUgJiYgaXNWaWRCdWZSZXF1ZXN0ZWQgJiYgKG1Ub0JlUXVldWVkVmlkQnVmcyA9PSBtQmF0Y2hTaXplKSkgeworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgayA9IDA7IGsgPCBzdHJlYW1zQXJyYXkubnVtX3N0cmVhbXM7IGsrKykgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IG1CYXRjaGVkU3RyZWFtc0FycmF5Lm51bV9zdHJlYW1zOyBtKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1zQXJyYXkuc3RyZWFtX3JlcXVlc3Rba10uc3RyZWFtSUQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJhdGNoZWRTdHJlYW1zQXJyYXkuc3RyZWFtX3JlcXVlc3RbbV0uc3RyZWFtSUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobSA9PSBtQmF0Y2hlZFN0cmVhbXNBcnJheS5udW1fc3RyZWFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXRjaGVkU3RyZWFtc0FycmF5LnN0cmVhbV9yZXF1ZXN0W21CYXRjaGVkU3RyZWFtc0FycmF5Lm51bV9zdHJlYW1zXS5zdHJlYW1JRCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbXNBcnJheS5zdHJlYW1fcmVxdWVzdFtrXS5zdHJlYW1JRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmF0Y2hlZFN0cmVhbXNBcnJheS5zdHJlYW1fcmVxdWVzdFttQmF0Y2hlZFN0cmVhbXNBcnJheS5udW1fc3RyZWFtc10uYnVmX2luZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtc0FycmF5LnN0cmVhbV9yZXF1ZXN0W2tdLmJ1Zl9pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmF0Y2hlZFN0cmVhbXNBcnJheS5udW1fc3RyZWFtcyA9IG1CYXRjaGVkU3RyZWFtc0FycmF5Lm51bV9zdHJlYW1zICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyZWFtc0FycmF5ID0gbUJhdGNoZWRTdHJlYW1zQXJyYXk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBVcGRhdGUgc3RyZWFtIGlkIG9mIGFsbCB0aGUgcmVxdWVzdGVkIGJ1ZmZlcnMgKi8KKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1QYXJhbWV0ZXJzLCBDQU1fSU5URl9NRVRBX1NUUkVBTV9JRCwgc3RyZWFtc0FycmF5KSkgeworICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgc3RyZWFtIHR5cGUgbWFzayBpbiB0aGUgcGFyYW1ldGVycyIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJjID0gbUNhbWVyYUhhbmRsZS0+b3BzLT5zZXRfcGFybXMobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMpOwogICAgICAgICAgICAgaWYgKHJjIDwgMCkgewpAQCAtMzk2Nyw2ICs0MzYzLDIzIEBACiAgICAgICAgICAgICAvKiByZXNldCB0byB6ZXJvIGNveiwgdGhlIGJhdGNoIGlzIHF1ZXVlZCAqLwogICAgICAgICAgICAgbVRvQmVRdWV1ZWRWaWRCdWZzID0gMDsKICAgICAgICAgICAgIG1QZW5kaW5nQmF0Y2hNYXAuYWRkKGZyYW1lTnVtYmVyLCBtRmlyc3RGcmFtZU51bWJlckluQmF0Y2gpOworICAgICAgICAgICAgbWVtc2V0KCZtQmF0Y2hlZFN0cmVhbXNBcnJheSwgMCwgc2l6ZW9mKGNhbV9zdHJlYW1fSURfdCkpOworICAgICAgICB9IGVsc2UgaWYgKG1CYXRjaFNpemUgJiYgaXNWaWRCdWZSZXF1ZXN0ZWQgJiYgKG1Ub0JlUXVldWVkVmlkQnVmcyAhPSBtQmF0Y2hTaXplKSkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBrID0gMDsgayA8IHN0cmVhbXNBcnJheS5udW1fc3RyZWFtczsgaysrKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IG1CYXRjaGVkU3RyZWFtc0FycmF5Lm51bV9zdHJlYW1zOyBtKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbXNBcnJheS5zdHJlYW1fcmVxdWVzdFtrXS5zdHJlYW1JRCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CYXRjaGVkU3RyZWFtc0FycmF5LnN0cmVhbV9yZXF1ZXN0W21dLnN0cmVhbUlEKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtID09IG1CYXRjaGVkU3RyZWFtc0FycmF5Lm51bV9zdHJlYW1zKSB7CisgICAgICAgICAgICAgICAgICAgIG1CYXRjaGVkU3RyZWFtc0FycmF5LnN0cmVhbV9yZXF1ZXN0W21CYXRjaGVkU3RyZWFtc0FycmF5Lm51bV9zdHJlYW1zXS5zdHJlYW1JRCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1zQXJyYXkuc3RyZWFtX3JlcXVlc3Rba10uc3RyZWFtSUQ7CisgICAgICAgICAgICAgICAgICAgIG1CYXRjaGVkU3RyZWFtc0FycmF5LnN0cmVhbV9yZXF1ZXN0W21CYXRjaGVkU3RyZWFtc0FycmF5Lm51bV9zdHJlYW1zXS5idWZfaW5kZXggPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtc0FycmF5LnN0cmVhbV9yZXF1ZXN0W2tdLmJ1Zl9pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgbUJhdGNoZWRTdHJlYW1zQXJyYXkubnVtX3N0cmVhbXMgPSBtQmF0Y2hlZFN0cmVhbXNBcnJheS5udW1fc3RyZWFtcyArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1QZW5kaW5nTGl2ZVJlcXVlc3QrKzsKICAgICB9CkBAIC0zOTg3LDE1ICs0NDAwLDcgQEAKICAgICAgIHRzLnR2X3NlYyArPSA1OwogICAgIH0KICAgICAvL0Jsb2NrIG9uIGNvbmRpdGlvbmFsIHZhcmlhYmxlCi0gICAgaWYgKG1CYXRjaFNpemUpIHsKLSAgICAgICAgLyogRm9yIEhGUiwgbW9yZSBidWZmZXJzIGFyZSBkZXF1ZXVlZCB1cGZyb250IHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlICovCi0gICAgICAgIG1pbkluRmxpZ2h0UmVxdWVzdHMgPSBNSU5fSU5GTElHSFRfSEZSX1JFUVVFU1RTOwotICAgICAgICBtYXhJbkZsaWdodFJlcXVlc3RzID0gTUFYX0lORkxJR0hUX0hGUl9SRVFVRVNUUzsKLSAgICB9Ci0gICAgaWYgKG1fcGVyZkxvY2suaXNQZXJmTG9ja1RpbWVkQWNxdWlyZWQoKSAmJiBtX3BlcmZMb2NrLmlzVGltZXJSZXNldCgpKQotICAgICAgICBtX3BlcmZMb2NrLmxvY2tfcmVsX3RpbWVkKCk7Ci0KLSAgICB3aGlsZSAoKG1QZW5kaW5nTGl2ZVJlcXVlc3QgPj0gbWluSW5GbGlnaHRSZXF1ZXN0cykgJiYgIXBJbnB1dEJ1ZmZlciAmJgorICAgIHdoaWxlICgobVBlbmRpbmdMaXZlUmVxdWVzdCA+PSBtTWluSW5GbGlnaHRSZXF1ZXN0cykgJiYgIXBJbnB1dEJ1ZmZlciAmJgogICAgICAgICAgICAgKG1TdGF0ZSAhPSBFUlJPUikgJiYgKG1TdGF0ZSAhPSBERUlOSVQpKSB7CiAgICAgICAgIGlmICghaXNWYWxpZFRpbWVvdXQpIHsKICAgICAgICAgICAgIExPR0QoIkJsb2NraW5nIG9uIGNvbmRpdGlvbmFsIHdhaXQiKTsKQEAgLTQwMTMsNyArNDQxOCw3IEBACiAgICAgICAgIExPR0QoIlVuYmxvY2tlZCIpOwogICAgICAgICBpZiAobVdva2VuVXBCeURhZW1vbikgewogICAgICAgICAgICAgbVdva2VuVXBCeURhZW1vbiA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1QZW5kaW5nTGl2ZVJlcXVlc3QgPCBtYXhJbkZsaWdodFJlcXVlc3RzKQorICAgICAgICAgICAgaWYgKG1QZW5kaW5nTGl2ZVJlcXVlc3QgPCBtTWF4SW5GbGlnaHRSZXF1ZXN0cykKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTQxMDcsNiArNDUxMiwzMCBAQAogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOwogCiAgICAgcmMgPSBzdG9wQWxsQ2hhbm5lbHMoKTsKKyAgICAvLyB1bmxpbmsgb2YgZHVhbGNhbQorICAgIGlmIChtSXNEZXZpY2VMaW5rZWQpIHsKKyAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+c3luY19jb250cm9sID0gQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09GRjsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnQ2FtTG9jayk7CisKKyAgICAgICAgaWYgKG1Jc01haW5DYW1lcmEgPT0gMSkgeworICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+bW9kZSA9IENBTV9NT0RFX1BSSU1BUlk7CisgICAgICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT50eXBlID0gQ0FNX1RZUEVfTUFJTjsKKyAgICAgICAgICAgIC8vIHJlbGF0ZWQgc2Vzc2lvbiBpZCBzaG91bGQgYmUgc2Vzc2lvbiBpZCBvZiBsaW5rZWQgc2Vzc2lvbgorICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+cmVsYXRlZF9zZW5zb3Jfc2Vzc2lvbl9pZCA9IHNlc3Npb25JZFttTGlua2VkQ2FtZXJhSWRdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+bW9kZSA9IENBTV9NT0RFX1NFQ09OREFSWTsKKyAgICAgICAgICAgIG1fcFJlbENhbVN5bmNCdWYtPnR5cGUgPSBDQU1fVFlQRV9BVVg7CisgICAgICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT5yZWxhdGVkX3NlbnNvcl9zZXNzaW9uX2lkID0gc2Vzc2lvbklkW21MaW5rZWRDYW1lcmFJZF07CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdDYW1Mb2NrKTsKKworICAgICAgICByYyA9IG1DYW1lcmFIYW5kbGUtPm9wcy0+c3luY19yZWxhdGVkX3NlbnNvcnMoCisgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwgbV9wUmVsQ2FtU3luY0J1Zik7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIkR1YWxjYW06IFVubGluayBmYWlsZWQsIGJ1dCBzdGlsbCBwcm9jZWVkIHRvIGNsb3NlIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgIExPR0UoInN0b3BBbGxDaGFubmVscyBmYWlsZWQiKTsKICAgICAgICAgcmV0dXJuIHJjOwpAQCAtNDMzOCwxNCArNDc2NywxOCBAQAogICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpidWZmZXIsIHVpbnQzMl90IGZyYW1lX251bWJlciwgYm9vbCBpc0lucHV0QnVmZmVyKQogewogICAgIGlmIChtZXRhZGF0YV9idWYpIHsKLSAgICAgICAgaWYgKG1CYXRjaFNpemUpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworICAgICAgICB1aW50OF90IGJhdGNoU2l6ZSA9IG1CYXRjaFNpemU7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICBpZiAoYmF0Y2hTaXplKSB7CiAgICAgICAgICAgICBoYW5kbGVCYXRjaE1ldGFkYXRhKG1ldGFkYXRhX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBmcmVlX2FuZF9idWZkb25lX21ldGFfYnVmICovKTsKICAgICAgICAgfSBlbHNlIHsgLyogbUJhdGNoU2l6ZSA9IDAgKi8KICAgICAgICAgICAgIGhkclBsdXNQZXJmTG9jayhtZXRhZGF0YV9idWYpOwogICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOwogICAgICAgICAgICAgaGFuZGxlTWV0YWRhdGFXaXRoTG9jayhtZXRhZGF0YV9idWYsCi0gICAgICAgICAgICAgICAgICAgIHRydWUgLyogZnJlZV9hbmRfYnVmZG9uZV9tZXRhX2J1ZiAqLyk7CisgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZnJlZV9hbmRfYnVmZG9uZV9tZXRhX2J1ZiAqLywKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogZmlyc3QgZnJhbWUgb2YgYmF0Y2ggbWV0YWRhdGEgKi8gKTsKICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChpc0lucHV0QnVmZmVyKSB7CkBAIC00NTAxLDYgKzQ5MzQsMTAgQEAKICAqICAgQHRpbWVzdGFtcDogbWV0YWRhdGEgYnVmZmVyIHRpbWVzdGFtcAogICogICBAcmVxdWVzdF9pZDogcmVxdWVzdCBpZAogICogICBAanBlZ01ldGFkYXRhOiBhZGRpdGlvbmFsIGpwZWcgbWV0YWRhdGEKKyAqICAgQGh5YnJpZF9hZV9lbmFibGU6IHdoZXRoZXIgaHlicmlkIGFlIGlzIGVuYWJsZWQKKyAqICAgLy8gRGV2Q2FtRGVidWcgbWV0YWRhdGEKKyAqICAgQERldkNhbURlYnVnX21ldGFfZW5hYmxlOiBlbmFibGUgRGV2Q2FtRGVidWcgbWV0YQorICogICAvLyBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSBlbmQKICAqICAgQHBwcm9jRG9uZTogd2hldGhlciBpbnRlcm5hbCBvZmZsaW5lIHBvc3Rwcm9jc2VzaW5nIGlzIGRvbmUKICAqCiAgKiBSRVRVUk4gICAgIDogY2FtZXJhX21ldGFkYXRhX3QqCkBAIC00NTE0LDEyICs0OTUxLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYganBlZ01ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBwaXBlbGluZV9kZXB0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2FwdHVyZV9pbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGh5YnJpZF9hZV9lbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSB0cmFuc2xhdGVGcm9tSGFsTWV0YWRhdGEgYXJndW1lbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgRGV2Q2FtRGVidWdfbWV0YV9lbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSBlbmQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHByb2NEb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmd2tfY2FjTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZndrX2NhY01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZpcnN0TWV0YWRhdGFJbkJhdGNoKQogewogICAgIENhbWVyYU1ldGFkYXRhIGNhbU1ldGFkYXRhOwogICAgIGNhbWVyYV9tZXRhZGF0YV90ICpyZXN1bHRNZXRhZGF0YTsKIAorICAgIGlmIChtQmF0Y2hTaXplICYmICFmaXJzdE1ldGFkYXRhSW5CYXRjaCkgeworICAgICAgICAvKiBJbiBiYXRjaCBtb2RlLCB1c2UgY2FjaGVkIG1ldGFkYXRhIGZyb20gdGhlIGZpcnN0IG1ldGFkYXRhCisgICAgICAgICAgICBpbiB0aGUgYmF0Y2ggKi8KKyAgICAgICAgY2FtTWV0YWRhdGEuY2xlYXIoKTsKKyAgICAgICAgY2FtTWV0YWRhdGEgPSBtQ2FjaGVkTWV0YWRhdGE7CisgICAgfQorCiAgICAgaWYgKGpwZWdNZXRhZGF0YS5lbnRyeUNvdW50KCkpCiAgICAgICAgIGNhbU1ldGFkYXRhLmFwcGVuZChqcGVnTWV0YWRhdGEpOwogCkBAIC00NTI3LDYgKzQ5NzYsMjU0IEBACiAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwgJnJlcXVlc3RfaWQsIDEpOwogICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfUElQRUxJTkVfREVQVEgsICZwaXBlbGluZV9kZXB0aCwgMSk7CiAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCwgJmNhcHR1cmVfaW50ZW50LCAxKTsKKyAgICBjYW1NZXRhZGF0YS51cGRhdGUoTkVYVVNfRVhQRVJJTUVOVEFMXzIwMTZfSFlCUklEX0FFX0VOQUJMRSwgJmh5YnJpZF9hZV9lbmFibGUsIDEpOworICAgIGlmIChtQmF0Y2hTaXplID09IDApIHsKKyAgICAgICAgLy8gRGV2Q2FtRGVidWcgbWV0YWRhdGEgdHJhbnNsYXRlRnJvbUhhbE1ldGFkYXRhLiBPbmx5IHVwZGF0ZSB0aGlzIG9uZSBmb3Igbm9uLUhGUiBtb2RlCisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19NRVRBX0VOQUJMRSwgJkRldkNhbURlYnVnX21ldGFfZW5hYmxlLCAxKTsKKyAgICB9CisKKyAgICBpZiAobUJhdGNoU2l6ZSAmJiAhZmlyc3RNZXRhZGF0YUluQmF0Y2gpIHsKKyAgICAgICAgLyogSW4gYmF0Y2ggbW9kZSwgdXNlIGNhY2hlZCBtZXRhZGF0YSBpbnN0ZWFkIG9mIHBhcnNpbmcgbWV0YWRhdGEgYnVmZmVyIGFnYWluICovCisgICAgICAgIHJlc3VsdE1ldGFkYXRhID0gY2FtTWV0YWRhdGEucmVsZWFzZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0TWV0YWRhdGE7CisgICAgfQorCisgICAgLy8gYXRyYWNlX2JlZ2luKEFUUkFDRV9UQUdfQUxXQVlTLCAiRGV2Q2FtRGVidWdJbmZvIik7CisgICAgLy8gT25seSB1cGRhdGUgRGV2Q2FtZXJhRGVidWcgbWV0YWR0YSBjb25kaXRpb25hbGx5OiBub24tSEZSIG1vZGUgYW5kIGl0IGlzIGVuYWJsZWQuCisgICAgaWYgKG1CYXRjaFNpemUgPT0gMCAmJiBEZXZDYW1EZWJ1Z19tZXRhX2VuYWJsZSAhPSAwKSB7CisgICAgICAgIC8vIERldkNhbURlYnVnIG1ldGFkYXRhIHRyYW5zbGF0ZUZyb21IYWxNZXRhZGF0YSBBRgorICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCBEZXZDYW1EZWJ1Z19hZl9sZW5zX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9MRU5TX1BPU0lUSU9OLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgaW50MzJfdCBmd2tfRGV2Q2FtRGVidWdfYWZfbGVuc19wb3NpdGlvbiA9ICpEZXZDYW1EZWJ1Z19hZl9sZW5zX3Bvc2l0aW9uOworICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKERFVkNBTURFQlVHX0FGX0xFTlNfUE9TSVRJT04sICZmd2tfRGV2Q2FtRGVidWdfYWZfbGVuc19wb3NpdGlvbiwgMSk7CisgICAgICAgIH0KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgRGV2Q2FtRGVidWdfYWZfdG9mX2NvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1RPRl9DT05GSURFTkNFLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgaW50MzJfdCBmd2tfRGV2Q2FtRGVidWdfYWZfdG9mX2NvbmZpZGVuY2UgPSAqRGV2Q2FtRGVidWdfYWZfdG9mX2NvbmZpZGVuY2U7CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoREVWQ0FNREVCVUdfQUZfVE9GX0NPTkZJREVOQ0UsICZmd2tfRGV2Q2FtRGVidWdfYWZfdG9mX2NvbmZpZGVuY2UsIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIERldkNhbURlYnVnX2FmX3RvZl9kaXN0YW5jZSwKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfVE9GX0RJU1RBTkNFLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgaW50MzJfdCBmd2tfRGV2Q2FtRGVidWdfYWZfdG9mX2Rpc3RhbmNlID0gKkRldkNhbURlYnVnX2FmX3RvZl9kaXN0YW5jZTsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRl9UT0ZfRElTVEFOQ0UsICZmd2tfRGV2Q2FtRGVidWdfYWZfdG9mX2Rpc3RhbmNlLCAxKTsKKyAgICAgICAgfQorICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCBEZXZDYW1EZWJ1Z19hZl9sdW1hLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9MVU1BLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgaW50MzJfdCBmd2tfRGV2Q2FtRGVidWdfYWZfbHVtYSA9ICpEZXZDYW1EZWJ1Z19hZl9sdW1hOworICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKERFVkNBTURFQlVHX0FGX0xVTUEsICZmd2tfRGV2Q2FtRGVidWdfYWZfbHVtYSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgRGV2Q2FtRGVidWdfYWZfaGFmX3N0YXRlLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9IQUZfU1RBVEUsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQzMl90IGZ3a19EZXZDYW1EZWJ1Z19hZl9oYWZfc3RhdGUgPSAqRGV2Q2FtRGVidWdfYWZfaGFmX3N0YXRlOworICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKERFVkNBTURFQlVHX0FGX0hBRl9TVEFURSwgJmZ3a19EZXZDYW1EZWJ1Z19hZl9oYWZfc3RhdGUsIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIERldkNhbURlYnVnX2FmX21vbml0b3JfcGRhZl90YXJnZXRfcG9zLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9NT05JVE9SX1BEQUZfVEFSR0VUX1BPUywgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGludDMyX3QgZndrX0RldkNhbURlYnVnX2FmX21vbml0b3JfcGRhZl90YXJnZXRfcG9zID0KKyAgICAgICAgICAgICAgICAqRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl9wZGFmX3RhcmdldF9wb3M7CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoREVWQ0FNREVCVUdfQUZfTU9OSVRPUl9QREFGX1RBUkdFVF9QT1MsCisgICAgICAgICAgICAgICAgJmZ3a19EZXZDYW1EZWJ1Z19hZl9tb25pdG9yX3BkYWZfdGFyZ2V0X3BvcywgMSk7CisgICAgICAgIH0KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl9wZGFmX2NvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfUERBRl9DT05GSURFTkNFLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgaW50MzJfdCBmd2tfRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl9wZGFmX2NvbmZpZGVuY2UgPQorICAgICAgICAgICAgICAgICpEZXZDYW1EZWJ1Z19hZl9tb25pdG9yX3BkYWZfY29uZmlkZW5jZTsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRl9NT05JVE9SX1BEQUZfQ09ORklERU5DRSwKKyAgICAgICAgICAgICAgICAmZndrX0RldkNhbURlYnVnX2FmX21vbml0b3JfcGRhZl9jb25maWRlbmNlLCAxKTsKKyAgICAgICAgfQorICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCBEZXZDYW1EZWJ1Z19hZl9tb25pdG9yX3BkYWZfcmVmb2N1cywKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfTU9OSVRPUl9QREFGX1JFRk9DVVMsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQzMl90IGZ3a19EZXZDYW1EZWJ1Z19hZl9tb25pdG9yX3BkYWZfcmVmb2N1cyA9ICpEZXZDYW1EZWJ1Z19hZl9tb25pdG9yX3BkYWZfcmVmb2N1czsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRl9NT05JVE9SX1BEQUZfUkVGT0NVUywKKyAgICAgICAgICAgICAgICAmZndrX0RldkNhbURlYnVnX2FmX21vbml0b3JfcGRhZl9yZWZvY3VzLCAxKTsKKyAgICAgICAgfQorICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCBEZXZDYW1EZWJ1Z19hZl9tb25pdG9yX3RvZl90YXJnZXRfcG9zLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9NT05JVE9SX1RPRl9UQVJHRVRfUE9TLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgaW50MzJfdCBmd2tfRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl90b2ZfdGFyZ2V0X3BvcyA9CisgICAgICAgICAgICAgICAgKkRldkNhbURlYnVnX2FmX21vbml0b3JfdG9mX3RhcmdldF9wb3M7CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoREVWQ0FNREVCVUdfQUZfTU9OSVRPUl9UT0ZfVEFSR0VUX1BPUywKKyAgICAgICAgICAgICAgICAmZndrX0RldkNhbURlYnVnX2FmX21vbml0b3JfdG9mX3RhcmdldF9wb3MsIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIERldkNhbURlYnVnX2FmX21vbml0b3JfdG9mX2NvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfVE9GX0NPTkZJREVOQ0UsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQzMl90IGZ3a19EZXZDYW1EZWJ1Z19hZl9tb25pdG9yX3RvZl9jb25maWRlbmNlID0KKyAgICAgICAgICAgICAgICAqRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl90b2ZfY29uZmlkZW5jZTsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRl9NT05JVE9SX1RPRl9DT05GSURFTkNFLAorICAgICAgICAgICAgICAgICZmd2tfRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl90b2ZfY29uZmlkZW5jZSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl90b2ZfcmVmb2N1cywKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfTU9OSVRPUl9UT0ZfUkVGT0NVUywgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGludDMyX3QgZndrX0RldkNhbURlYnVnX2FmX21vbml0b3JfdG9mX3JlZm9jdXMgPSAqRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl90b2ZfcmVmb2N1czsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRl9NT05JVE9SX1RPRl9SRUZPQ1VTLAorICAgICAgICAgICAgICAgICZmd2tfRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl90b2ZfcmVmb2N1cywgMSk7CisgICAgICAgIH0KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl90eXBlX3NlbGVjdCwKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfTU9OSVRPUl9UWVBFX1NFTEVDVCwgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGludDMyX3QgZndrX0RldkNhbURlYnVnX2FmX21vbml0b3JfdHlwZV9zZWxlY3QgPSAqRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl90eXBlX3NlbGVjdDsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRl9NT05JVE9SX1RZUEVfU0VMRUNULAorICAgICAgICAgICAgICAgICZmd2tfRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl90eXBlX3NlbGVjdCwgMSk7CisgICAgICAgIH0KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl9yZWZvY3VzLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9NT05JVE9SX1JFRk9DVVMsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQzMl90IGZ3a19EZXZDYW1EZWJ1Z19hZl9tb25pdG9yX3JlZm9jdXMgPSAqRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl9yZWZvY3VzOworICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKERFVkNBTURFQlVHX0FGX01PTklUT1JfUkVGT0NVUywKKyAgICAgICAgICAgICAgICAmZndrX0RldkNhbURlYnVnX2FmX21vbml0b3JfcmVmb2N1cywgMSk7CisgICAgICAgIH0KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl90YXJnZXRfcG9zLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9NT05JVE9SX1RBUkdFVF9QT1MsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQzMl90IGZ3a19EZXZDYW1EZWJ1Z19hZl9tb25pdG9yX3RhcmdldF9wb3MgPSAqRGV2Q2FtRGVidWdfYWZfbW9uaXRvcl90YXJnZXRfcG9zOworICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKERFVkNBTURFQlVHX0FGX01PTklUT1JfVEFSR0VUX1BPUywKKyAgICAgICAgICAgICAgICAmZndrX0RldkNhbURlYnVnX2FmX21vbml0b3JfdGFyZ2V0X3BvcywgMSk7CisgICAgICAgIH0KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgRGV2Q2FtRGVidWdfYWZfc2VhcmNoX3BkYWZfdGFyZ2V0X3BvcywKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfU0VBUkNIX1BEQUZfVEFSR0VUX1BPUywgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGludDMyX3QgZndrX0RldkNhbURlYnVnX2FmX3NlYXJjaF9wZGFmX3RhcmdldF9wb3MgPQorICAgICAgICAgICAgICAgICpEZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl90YXJnZXRfcG9zOworICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKERFVkNBTURFQlVHX0FGX1NFQVJDSF9QREFGX1RBUkdFVF9QT1MsCisgICAgICAgICAgICAgICAgJmZ3a19EZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl90YXJnZXRfcG9zLCAxKTsKKyAgICAgICAgfQorICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCBEZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl9uZXh0X3BvcywKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfU0VBUkNIX1BEQUZfTkVYVF9QT1MsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQzMl90IGZ3a19EZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl9uZXh0X3BvcyA9ICpEZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl9uZXh0X3BvczsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRl9TRUFSQ0hfUERBRl9ORVhUX1BPUywKKyAgICAgICAgICAgICAgICAmZndrX0RldkNhbURlYnVnX2FmX3NlYXJjaF9wZGFmX25leHRfcG9zLCAxKTsKKyAgICAgICAgfQorICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCBEZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl9uZWFyX3BvcywKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfU0VBUkNIX1BEQUZfTkVBUl9QT1MsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQzMl90IGZ3a19EZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl9uZWFyX3BvcyA9ICpEZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl9uZWFyX3BvczsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRl9TRUFSQ0hfUERBRl9ORUFSX1BPUywKKyAgICAgICAgICAgICAgICAmZndrX0RldkNhbURlYnVnX2FmX3NlYXJjaF9wZGFmX25lYXJfcG9zLCAxKTsKKyAgICAgICAgfQorICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCBEZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl9mYXJfcG9zLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9TRUFSQ0hfUERBRl9GQVJfUE9TLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgaW50MzJfdCBmd2tfRGV2Q2FtRGVidWdfYWZfc2VhcmNoX3BkYWZfZmFyX3BvcyA9ICpEZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl9mYXJfcG9zOworICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKERFVkNBTURFQlVHX0FGX1NFQVJDSF9QREFGX0ZBUl9QT1MsCisgICAgICAgICAgICAgICAgJmZ3a19EZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl9mYXJfcG9zLCAxKTsKKyAgICAgICAgfQorICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCBEZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl9jb25maWRlbmNlLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9TRUFSQ0hfUERBRl9DT05GSURFTkNFLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgaW50MzJfdCBmd2tfRGV2Q2FtRGVidWdfYWZfc2VhcmNoX3BkYWZfY29uZmlkZW5jZSA9ICpEZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl9jb25maWRlbmNlOworICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKERFVkNBTURFQlVHX0FGX1NFQVJDSF9QREFGX0NPTkZJREVOQ0UsCisgICAgICAgICAgICAgICAgJmZ3a19EZXZDYW1EZWJ1Z19hZl9zZWFyY2hfcGRhZl9jb25maWRlbmNlLCAxKTsKKyAgICAgICAgfQorICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCBEZXZDYW1EZWJ1Z19hZl9zZWFyY2hfdG9mX3RhcmdldF9wb3MsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9UT0ZfVEFSR0VUX1BPUywgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGludDMyX3QgZndrX0RldkNhbURlYnVnX2FmX3NlYXJjaF90b2ZfdGFyZ2V0X3BvcyA9CisgICAgICAgICAgICAgICAgKkRldkNhbURlYnVnX2FmX3NlYXJjaF90b2ZfdGFyZ2V0X3BvczsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRl9TRUFSQ0hfVE9GX1RBUkdFVF9QT1MsCisgICAgICAgICAgICAgICAgJmZ3a19EZXZDYW1EZWJ1Z19hZl9zZWFyY2hfdG9mX3RhcmdldF9wb3MsIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIERldkNhbURlYnVnX2FmX3NlYXJjaF90b2ZfbmV4dF9wb3MsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9UT0ZfTkVYVF9QT1MsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQzMl90IGZ3a19EZXZDYW1EZWJ1Z19hZl9zZWFyY2hfdG9mX25leHRfcG9zID0gKkRldkNhbURlYnVnX2FmX3NlYXJjaF90b2ZfbmV4dF9wb3M7CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoREVWQ0FNREVCVUdfQUZfU0VBUkNIX1RPRl9ORVhUX1BPUywKKyAgICAgICAgICAgICAgICAmZndrX0RldkNhbURlYnVnX2FmX3NlYXJjaF90b2ZfbmV4dF9wb3MsIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIERldkNhbURlYnVnX2FmX3NlYXJjaF90b2ZfbmVhcl9wb3MsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9UT0ZfTkVBUl9QT1MsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQzMl90IGZ3a19EZXZDYW1EZWJ1Z19hZl9zZWFyY2hfdG9mX25lYXJfcG9zID0gKkRldkNhbURlYnVnX2FmX3NlYXJjaF90b2ZfbmVhcl9wb3M7CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoREVWQ0FNREVCVUdfQUZfU0VBUkNIX1RPRl9ORUFSX1BPUywKKyAgICAgICAgICAgICAgICAmZndrX0RldkNhbURlYnVnX2FmX3NlYXJjaF90b2ZfbmVhcl9wb3MsIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIERldkNhbURlYnVnX2FmX3NlYXJjaF90b2ZfZmFyX3BvcywKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfU0VBUkNIX1RPRl9GQVJfUE9TLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgaW50MzJfdCBmd2tfRGV2Q2FtRGVidWdfYWZfc2VhcmNoX3RvZl9mYXJfcG9zID0gKkRldkNhbURlYnVnX2FmX3NlYXJjaF90b2ZfZmFyX3BvczsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRl9TRUFSQ0hfVE9GX0ZBUl9QT1MsCisgICAgICAgICAgICAgICAgJmZ3a19EZXZDYW1EZWJ1Z19hZl9zZWFyY2hfdG9mX2Zhcl9wb3MsIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIERldkNhbURlYnVnX2FmX3NlYXJjaF90b2ZfY29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfU0VBUkNIX1RPRl9DT05GSURFTkNFLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgaW50MzJfdCBmd2tfRGV2Q2FtRGVidWdfYWZfc2VhcmNoX3RvZl9jb25maWRlbmNlID0gKkRldkNhbURlYnVnX2FmX3NlYXJjaF90b2ZfY29uZmlkZW5jZTsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRl9TRUFSQ0hfVE9GX0NPTkZJREVOQ0UsCisgICAgICAgICAgICAgICAgJmZ3a19EZXZDYW1EZWJ1Z19hZl9zZWFyY2hfdG9mX2NvbmZpZGVuY2UsIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIERldkNhbURlYnVnX2FmX3NlYXJjaF90eXBlX3NlbGVjdCwKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfU0VBUkNIX1RZUEVfU0VMRUNULCBtZXRhZGF0YSkgeworICAgICAgICAgICAgaW50MzJfdCBmd2tfRGV2Q2FtRGVidWdfYWZfc2VhcmNoX3R5cGVfc2VsZWN0ID0gKkRldkNhbURlYnVnX2FmX3NlYXJjaF90eXBlX3NlbGVjdDsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRl9TRUFSQ0hfVFlQRV9TRUxFQ1QsCisgICAgICAgICAgICAgICAgJmZ3a19EZXZDYW1EZWJ1Z19hZl9zZWFyY2hfdHlwZV9zZWxlY3QsIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIERldkNhbURlYnVnX2FmX3NlYXJjaF9uZXh0X3BvcywKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfU0VBUkNIX05FWFRfUE9TLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgaW50MzJfdCBmd2tfRGV2Q2FtRGVidWdfYWZfc2VhcmNoX25leHRfcG9zID0gKkRldkNhbURlYnVnX2FmX3NlYXJjaF9uZXh0X3BvczsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRl9TRUFSQ0hfTkVYVF9QT1MsCisgICAgICAgICAgICAgICAgJmZ3a19EZXZDYW1EZWJ1Z19hZl9zZWFyY2hfbmV4dF9wb3MsIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIERldkNhbURlYnVnX2FmX3NlYXJjaF90YXJnZXRfcG9zLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9TRUFSQ0hfVEFSR0VUX1BPUywgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGludDMyX3QgZndrX0RldkNhbURlYnVnX2FmX3NlYXJjaF90YXJnZXRfcG9zID0gKkRldkNhbURlYnVnX2FmX3NlYXJjaF90YXJnZXRfcG9zOworICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKERFVkNBTURFQlVHX0FGX1NFQVJDSF9UQVJHRVRfUE9TLAorICAgICAgICAgICAgICAgICZmd2tfRGV2Q2FtRGVidWdfYWZfc2VhcmNoX3RhcmdldF9wb3MsIDEpOworICAgICAgICB9CisgICAgICAgIC8vIERldkNhbURlYnVnIG1ldGFkYXRhIHRyYW5zbGF0ZUZyb21IYWxNZXRhZGF0YSBBRUMKKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgRGV2Q2FtRGVidWdfYWVjX3RhcmdldF9sdW1hLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRUNfVEFSR0VUX0xVTUEsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQzMl90IGZ3a19EZXZDYW1EZWJ1Z19hZWNfdGFyZ2V0X2x1bWEgPSAqRGV2Q2FtRGVidWdfYWVjX3RhcmdldF9sdW1hOworICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKERFVkNBTURFQlVHX0FFQ19UQVJHRVRfTFVNQSwgJmZ3a19EZXZDYW1EZWJ1Z19hZWNfdGFyZ2V0X2x1bWEsIDEpOworICAgIH0KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgRGV2Q2FtRGVidWdfYWVjX2NvbXBfbHVtYSwKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX0NPTVBfTFVNQSwgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGludDMyX3QgZndrX0RldkNhbURlYnVnX2FlY19jb21wX2x1bWEgPSAqRGV2Q2FtRGVidWdfYWVjX2NvbXBfbHVtYTsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRUNfQ09NUF9MVU1BLCAmZndrX0RldkNhbURlYnVnX2FlY19jb21wX2x1bWEsIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIERldkNhbURlYnVnX2FlY19hdmdfbHVtYSwKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX0FWR19MVU1BLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgaW50MzJfdCBmd2tfRGV2Q2FtRGVidWdfYWVjX2F2Z19sdW1hID0gKkRldkNhbURlYnVnX2FlY19hdmdfbHVtYTsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRUNfQVZHX0xVTUEsICZmd2tfRGV2Q2FtRGVidWdfYWVjX2F2Z19sdW1hLCAxKTsKKyAgICAgICAgfQorICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCBEZXZDYW1EZWJ1Z19hZWNfY3VyX2x1bWEsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FFQ19DVVJfTFVNQSwgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGludDMyX3QgZndrX0RldkNhbURlYnVnX2FlY19jdXJfbHVtYSA9ICpEZXZDYW1EZWJ1Z19hZWNfY3VyX2x1bWE7CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoREVWQ0FNREVCVUdfQUVDX0NVUl9MVU1BLCAmZndrX0RldkNhbURlYnVnX2FlY19jdXJfbHVtYSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgRGV2Q2FtRGVidWdfYWVjX2xpbmVjb3VudCwKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX0xJTkVDT1VOVCwgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGludDMyX3QgZndrX0RldkNhbURlYnVnX2FlY19saW5lY291bnQgPSAqRGV2Q2FtRGVidWdfYWVjX2xpbmVjb3VudDsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRUNfTElORUNPVU5ULCAmZndrX0RldkNhbURlYnVnX2FlY19saW5lY291bnQsIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGZsb2F0LCBEZXZDYW1EZWJ1Z19hZWNfcmVhbF9nYWluLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRUNfUkVBTF9HQUlOLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgZmxvYXQgZndrX0RldkNhbURlYnVnX2FlY19yZWFsX2dhaW4gPSAqRGV2Q2FtRGVidWdfYWVjX3JlYWxfZ2FpbjsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BRUNfUkVBTF9HQUlOLCAmZndrX0RldkNhbURlYnVnX2FlY19yZWFsX2dhaW4sIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIERldkNhbURlYnVnX2FlY19leHBfaW5kZXgsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FFQ19FWFBfSU5ERVgsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQzMl90IGZ3a19EZXZDYW1EZWJ1Z19hZWNfZXhwX2luZGV4ID0gKkRldkNhbURlYnVnX2FlY19leHBfaW5kZXg7CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoREVWQ0FNREVCVUdfQUVDX0VYUF9JTkRFWCwgJmZ3a19EZXZDYW1EZWJ1Z19hZWNfZXhwX2luZGV4LCAxKTsKKyAgICAgICAgfQorICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShmbG9hdCwgRGV2Q2FtRGVidWdfYWVjX2x1eF9pZHgsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FFQ19MVVhfSURYLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgZmxvYXQgZndrX0RldkNhbURlYnVnX2FlY19sdXhfaWR4ID0gKkRldkNhbURlYnVnX2FlY19sdXhfaWR4OworICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKERFVkNBTURFQlVHX0FFQ19MVVhfSURYLCAmZndrX0RldkNhbURlYnVnX2FlY19sdXhfaWR4LCAxKTsKKyAgICAgICAgfQorICAgICAgICAvLyBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSB0cmFuc2xhdGVGcm9tSGFsTWV0YWRhdGEgQVdCCisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGZsb2F0LCBEZXZDYW1EZWJ1Z19hd2Jfcl9nYWluLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BV0JfUl9HQUlOLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgZmxvYXQgZndrX0RldkNhbURlYnVnX2F3Yl9yX2dhaW4gPSAqRGV2Q2FtRGVidWdfYXdiX3JfZ2FpbjsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BV0JfUl9HQUlOLCAmZndrX0RldkNhbURlYnVnX2F3Yl9yX2dhaW4sIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGZsb2F0LCBEZXZDYW1EZWJ1Z19hd2JfZ19nYWluLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BV0JfR19HQUlOLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgZmxvYXQgZndrX0RldkNhbURlYnVnX2F3Yl9nX2dhaW4gPSAqRGV2Q2FtRGVidWdfYXdiX2dfZ2FpbjsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BV0JfR19HQUlOLCAmZndrX0RldkNhbURlYnVnX2F3Yl9nX2dhaW4sIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGZsb2F0LCBEZXZDYW1EZWJ1Z19hd2JfYl9nYWluLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BV0JfQl9HQUlOLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgZmxvYXQgZndrX0RldkNhbURlYnVnX2F3Yl9iX2dhaW4gPSAqRGV2Q2FtRGVidWdfYXdiX2JfZ2FpbjsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShERVZDQU1ERUJVR19BV0JfQl9HQUlOLCAmZndrX0RldkNhbURlYnVnX2F3Yl9iX2dhaW4sIDEpOworICAgICAgICB9CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIERldkNhbURlYnVnX2F3Yl9jY3QsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FXQl9DQ1QsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQzMl90IGZ3a19EZXZDYW1EZWJ1Z19hd2JfY2N0ID0gKkRldkNhbURlYnVnX2F3Yl9jY3Q7CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoREVWQ0FNREVCVUdfQVdCX0NDVCwgJmZ3a19EZXZDYW1EZWJ1Z19hd2JfY2N0LCAxKTsKKyAgICAgICAgfQorICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCBEZXZDYW1EZWJ1Z19hd2JfZGVjaXNpb24sCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FXQl9ERUNJU0lPTiwgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGludDMyX3QgZndrX0RldkNhbURlYnVnX2F3Yl9kZWNpc2lvbiA9ICpEZXZDYW1EZWJ1Z19hd2JfZGVjaXNpb247CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoREVWQ0FNREVCVUdfQVdCX0RFQ0lTSU9OLCAmZndrX0RldkNhbURlYnVnX2F3Yl9kZWNpc2lvbiwgMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gYXRyYWNlX2VuZChBVFJBQ0VfVEFHX0FMV0FZUyk7CiAKICAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgZnJhbWVfbnVtYmVyLCBDQU1fSU5URl9NRVRBX0ZSQU1FX05VTUJFUiwgbWV0YWRhdGEpIHsKICAgICAgICAgaW50NjRfdCBmd2tfZnJhbWVfbnVtYmVyID0gKmZyYW1lX251bWJlcjsKQEAgLTQ2NDksNDAgKzUzNDYsMzAgQEAKICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVQUk9DRVNTX0VGRkVDVElWRV9FWFBPU1VSRV9GQUNUT1IsIGVmZmVjdGl2ZUV4cG9zdXJlRmFjdG9yLCAxKTsKICAgICB9CiAKLSAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fYmxhY2tfbGV2ZWxfbWV0YWRhdGFfdCwgYmxhY2tMZXZlbFNvdXJjZVBhdHRlcm4sCi0gICAgICAgIENBTV9JTlRGX01FVEFfQkxBQ0tfTEVWRUxfU09VUkNFX1BBVFRFUk4sIG1ldGFkYXRhKSB7Ci0KLSAgICAgICAgTE9HRCgiZHluYW1pY2JsYWNrTGV2ZWwgPSAlZiAlZiAlZiAlZiIsCi0gICAgICAgICAgYmxhY2tMZXZlbFNvdXJjZVBhdHRlcm4tPmNhbV9ibGFja19sZXZlbFswXSwKLSAgICAgICAgICBibGFja0xldmVsU291cmNlUGF0dGVybi0+Y2FtX2JsYWNrX2xldmVsWzFdLAotICAgICAgICAgIGJsYWNrTGV2ZWxTb3VyY2VQYXR0ZXJuLT5jYW1fYmxhY2tfbGV2ZWxbMl0sCi0gICAgICAgICAgYmxhY2tMZXZlbFNvdXJjZVBhdHRlcm4tPmNhbV9ibGFja19sZXZlbFszXSk7Ci0gICAgfQotCiAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2JsYWNrX2xldmVsX21ldGFkYXRhX3QsIGJsYWNrTGV2ZWxBcHBsaWVkUGF0dGVybiwKICAgICAgICAgQ0FNX0lOVEZfTUVUQV9CTEFDS19MRVZFTF9BUFBMSUVEX1BBVFRFUk4sIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZsb2F0IGZ3a19ibGFja0xldmVsSW5kWzRdOworICAgICAgICBmbG9hdCBmd2tfYmxhY2tMZXZlbEluZFtCTEFDS19MRVZFTF9QQVRURVJOX0NOVF07CiAKLSAgICAgICAgZndrX2JsYWNrTGV2ZWxJbmRbMF0gPSBibGFja0xldmVsQXBwbGllZFBhdHRlcm4tPmNhbV9ibGFja19sZXZlbFswXTsKLSAgICAgICAgZndrX2JsYWNrTGV2ZWxJbmRbMV0gPSBibGFja0xldmVsQXBwbGllZFBhdHRlcm4tPmNhbV9ibGFja19sZXZlbFsxXTsKLSAgICAgICAgZndrX2JsYWNrTGV2ZWxJbmRbMl0gPSBibGFja0xldmVsQXBwbGllZFBhdHRlcm4tPmNhbV9ibGFja19sZXZlbFsyXTsKLSAgICAgICAgZndrX2JsYWNrTGV2ZWxJbmRbM10gPSBibGFja0xldmVsQXBwbGllZFBhdHRlcm4tPmNhbV9ibGFja19sZXZlbFszXTsKKyAgICAgICAgYWRqdXN0QmxhY2tMZXZlbEZvckNGQShibGFja0xldmVsQXBwbGllZFBhdHRlcm4tPmNhbV9ibGFja19sZXZlbCwgZndrX2JsYWNrTGV2ZWxJbmQsCisgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmNvbG9yX2FycmFuZ2VtZW50KTsKIAotICAgICAgICBMT0dEKCJhcHBsaWVkIGR5bmFtaWNibGFja0xldmVsID0gJWYgJWYgJWYgJWYiLAorICAgICAgICBMT0dEKCJhcHBsaWVkIGR5bmFtaWNibGFja0xldmVsIGluIFJHR0Igb3JkZXIgPSAlZiAlZiAlZiAlZiIsCiAgICAgICAgICAgYmxhY2tMZXZlbEFwcGxpZWRQYXR0ZXJuLT5jYW1fYmxhY2tfbGV2ZWxbMF0sCiAgICAgICAgICAgYmxhY2tMZXZlbEFwcGxpZWRQYXR0ZXJuLT5jYW1fYmxhY2tfbGV2ZWxbMV0sCiAgICAgICAgICAgYmxhY2tMZXZlbEFwcGxpZWRQYXR0ZXJuLT5jYW1fYmxhY2tfbGV2ZWxbMl0sCiAgICAgICAgICAgYmxhY2tMZXZlbEFwcGxpZWRQYXR0ZXJuLT5jYW1fYmxhY2tfbGV2ZWxbM10pOwotICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoUUNBTUVSQTNfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUxfUEFUVEVSTiwgZndrX2JsYWNrTGV2ZWxJbmQsIDQpOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoUUNBTUVSQTNfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUxfUEFUVEVSTiwgZndrX2JsYWNrTGV2ZWxJbmQsCisgICAgICAgICAgICAgICAgQkxBQ0tfTEVWRUxfUEFUVEVSTl9DTlQpOwogCiAgICAgICAgIC8vIFVwZGF0ZSB0aGUgQU5EUk9JRF9TRU5TT1JfRFlOQU1JQ19CTEFDS19MRVZFTAotICAgICAgICAvLyBOZWVkIGNvbnZlcnQgdGhlIGludGVybmFsIDE2IGJpdCBkZXB0aCB0byBzZW5zb3IgMTAgYml0IHNlbnNvciByYXcKKyAgICAgICAgLy8gTmVlZCBjb252ZXJ0IHRoZSBpbnRlcm5hbCAxMiBiaXQgZGVwdGggdG8gc2Vuc29yIDEwIGJpdCBzZW5zb3IgcmF3CiAgICAgICAgIC8vIGRlcHRoIHNwYWNlLgotICAgICAgICBmd2tfYmxhY2tMZXZlbEluZFswXSAvPSA2NC4wOwotICAgICAgICBmd2tfYmxhY2tMZXZlbEluZFsxXSAvPSA2NC4wOwotICAgICAgICBmd2tfYmxhY2tMZXZlbEluZFsyXSAvPSA2NC4wOwotICAgICAgICBmd2tfYmxhY2tMZXZlbEluZFszXSAvPSA2NC4wOwotICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfRFlOQU1JQ19CTEFDS19MRVZFTCwgZndrX2JsYWNrTGV2ZWxJbmQsIDQpOworICAgICAgICBmd2tfYmxhY2tMZXZlbEluZFswXSAvPSA0LjA7CisgICAgICAgIGZ3a19ibGFja0xldmVsSW5kWzFdIC89IDQuMDsKKyAgICAgICAgZndrX2JsYWNrTGV2ZWxJbmRbMl0gLz0gNC4wOworICAgICAgICBmd2tfYmxhY2tMZXZlbEluZFszXSAvPSA0LjA7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMLCBmd2tfYmxhY2tMZXZlbEluZCwKKyAgICAgICAgICAgICAgICBCTEFDS19MRVZFTF9QQVRURVJOX0NOVCk7CiAgICAgfQogCiAgICAgLy8gRml4ZWQgd2hpdGVsZXZlbCBpcyB1c2VkIGJ5IElTUC9TZW5zb3IKQEAgLTQ3NDEsMTAgKzU0MjgsMTQgQEAKICAgICAgICAgICAgICAgICAoc2l6ZV90KSAoMiAqIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPm51bV9jb2xvcl9jaGFubmVscykpOwogICAgIH0KIAorICAgIGludDMyX3QgZndrX2lzcFNlbnNpdGl2aXR5ID0gMTAwOwogICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIGlzcFNlbnNpdGl2aXR5LCBDQU1fSU5URl9NRVRBX0lTUF9TRU5TSVRJVklUWSwgbWV0YWRhdGEpIHsKLSAgICAgICAgaW50MzJfdCBmd2tfaXNwU2Vuc2l0aXZpdHkgPSAoaW50MzJfdCkgKmlzcFNlbnNpdGl2aXR5OwotICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NULCAmZndrX2lzcFNlbnNpdGl2aXR5LCAxKTsKKyAgICAgICAgZndrX2lzcFNlbnNpdGl2aXR5ID0gKGludDMyX3QpICppc3BTZW5zaXRpdml0eTsKICAgICB9CisgICAgSUZfTUVUQV9BVkFJTEFCTEUoZmxvYXQsIHBvc3RTdGF0c1NlbnNpdGl2aXR5LCBDQU1fSU5URl9NRVRBX0lTUF9QT1NUX1NUQVRTX1NFTlNJVElWSVRZLCBtZXRhZGF0YSkgeworICAgICAgICBmd2tfaXNwU2Vuc2l0aXZpdHkgPSAoaW50MzJfdCkgKCpwb3N0U3RhdHNTZW5zaXRpdml0eSAqIGZ3a19pc3BTZW5zaXRpdml0eSk7CisgICAgfQorICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfUE9TVF9SQVdfU0VOU0lUSVZJVFlfQk9PU1QsICZmd2tfaXNwU2Vuc2l0aXZpdHksIDEpOwogCiAgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIHNoYWRpbmdNb2RlLCBDQU1fSU5URl9NRVRBX1NIQURJTkdfTU9ERSwgbWV0YWRhdGEpIHsKICAgICAgICAgdWludDhfdCBmd2tfc2hhZGluZ01vZGUgPSAodWludDhfdCkgKnNoYWRpbmdNb2RlOwpAQCAtNTEwNCwxMCArNTc5NSwyMiBAQAogICAgICAgICAgICAgICAgIGhBZVJlZ2lvbnMtPnJlY3QuaGVpZ2h0KTsKICAgICB9CiAKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgZm9jdXNNb2RlLCBDQU1fSU5URl9QQVJNX0ZPQ1VTX01PREUsIG1ldGFkYXRhKSB7CisgICAgICAgIGludCB2YWwgPSBsb29rdXBGd2tOYW1lKEZPQ1VTX01PREVTX01BUCwgTUVUQURBVEFfTUFQX1NJWkUoRk9DVVNfTU9ERVNfTUFQKSwgKmZvY3VzTW9kZSk7CisgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZndrQWZNb2RlID0gKHVpbnQ4X3QpdmFsOworICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLCAmZndrQWZNb2RlLCAxKTsKKyAgICAgICAgICAgIExPR0QoIk1ldGFkYXRhIDogQU5EUk9JRF9DT05UUk9MX0FGX01PREUgJWQiLCB2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HSCgiTWV0YWRhdGEgbm90IGZvdW5kIDogQU5EUk9JRF9DT05UUk9MX0FGX01PREUgJWQiLAorICAgICAgICAgICAgICAgICAgICB2YWwpOworICAgICAgICB9CisgICAgfQorCiAgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIGFmU3RhdGUsIENBTV9JTlRGX01FVEFfQUZfU1RBVEUsIG1ldGFkYXRhKSB7CiAgICAgICAgIHVpbnQ4X3QgZndrX2FmU3RhdGUgPSAodWludDhfdCkgKmFmU3RhdGU7CiAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsICZmd2tfYWZTdGF0ZSwgMSk7Ci0gICAgICAgIExPR0QoInVyZ2VudCBNZXRhZGF0YSA6IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSAldSIsICphZlN0YXRlKTsKKyAgICAgICAgTE9HRCgiTWV0YWRhdGEgOiBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUgJXUiLCAqYWZTdGF0ZSk7CiAgICAgfQogCiAgICAgSUZfTUVUQV9BVkFJTEFCTEUoZmxvYXQsIGZvY3VzRGlzdGFuY2UsIENBTV9JTlRGX01FVEFfTEVOU19GT0NVU19ESVNUQU5DRSwgbWV0YWRhdGEpIHsKQEAgLTUxNDEsOCArNTg0NCwxMyBAQAogICAgIH0KIAogICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCBoYWxfYWJfbW9kZSwgQ0FNX0lOVEZfUEFSTV9BTlRJQkFORElORywgbWV0YWRhdGEpIHsKKyAgICAgICAgdWludDMyX3QgYWJfbW9kZSA9ICpoYWxfYWJfbW9kZTsKKyAgICAgICAgaWYgKGFiX21vZGUgPT0gQ0FNX0FOVElCQU5ESU5HX01PREVfQVVUT182MEhaIHx8CisgICAgICAgICAgICAgICAgYWJfbW9kZSA9PSBDQU1fQU5USUJBTkRJTkdfTU9ERV9BVVRPXzUwSFopIHsKKyAgICAgICAgICAgICAgYWJfbW9kZSA9IENBTV9BTlRJQkFORElOR19NT0RFX0FVVE87CisgICAgICAgIH0KICAgICAgICAgaW50IHZhbCA9IGxvb2t1cEZ3a05hbWUoQU5USUJBTkRJTkdfTU9ERVNfTUFQLCBNRVRBREFUQV9NQVBfU0laRShBTlRJQkFORElOR19NT0RFU19NQVApLAotICAgICAgICAgICAgICAgICpoYWxfYWJfbW9kZSk7CisgICAgICAgICAgICAgICAgYWJfbW9kZSk7CiAgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKICAgICAgICAgICAgIHVpbnQ4X3QgZndrX2FiX21vZGUgPSAodWludDhfdCl2YWw7CiAgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX0FOVElCQU5ESU5HX01PREUsICZmd2tfYWJfbW9kZSwgMSk7CkBAIC01MzI0LDYgKzYwMzIsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8vIEFGIHNjZW5lIGNoYW5nZQorICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQ4X3QsIGFmU2NlbmVDaGFuZ2UsIENBTV9JTlRGX01FVEFfQUZfU0NFTkVfQ0hBTkdFLCBtZXRhZGF0YSkgeworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoTkVYVVNfRVhQRVJJTUVOVEFMXzIwMTZfQUZfU0NFTkVfQ0hBTkdFLCBhZlNjZW5lQ2hhbmdlLCAxKTsKKyAgICB9CisKKyAgICAvKiBJbiBiYXRjaCBtb2RlLCBjYWNoZSB0aGUgZmlyc3QgbWV0YWRhdGEgaW4gdGhlIGJhdGNoICovCisgICAgaWYgKG1CYXRjaFNpemUgJiYgZmlyc3RNZXRhZGF0YUluQmF0Y2gpIHsKKyAgICAgICAgbUNhY2hlZE1ldGFkYXRhLmNsZWFyKCk7CisgICAgICAgIG1DYWNoZWRNZXRhZGF0YSA9IGNhbU1ldGFkYXRhOworICAgIH0KKwogICAgIHJlc3VsdE1ldGFkYXRhID0gY2FtTWV0YWRhdGEucmVsZWFzZSgpOwogICAgIHJldHVybiByZXN1bHRNZXRhZGF0YTsKIH0KQEAgLTUzNzYsNiArNjA5NSwyNyBAQAogICAgICAgICAgICAgbUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5zdGF0c19kZWJ1Z19wYXJhbXNfdmFsaWQgPSBUUlVFOwogICAgICAgICB9CiAgICAgfQorICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9iZXN0YXRzX2J1ZmZlcl9leGlmX2RlYnVnX3QsYmVzdGF0c19leGlmX2RlYnVnX3BhcmFtcywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR19CRVNUQVRTLCBtZXRhZGF0YSkgeworICAgICAgICBpZiAobUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zKSB7CisgICAgICAgICAgICBtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMtPmJlc3RhdHNfZGVidWdfcGFyYW1zID0gKmJlc3RhdHNfZXhpZl9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICBtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMtPmJlc3RhdHNfZGVidWdfcGFyYW1zX3ZhbGlkID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fYmhpc3RfYnVmZmVyX2V4aWZfZGVidWdfdCwgYmhpc3RfZXhpZl9kZWJ1Z19wYXJhbXMsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQkhJU1QsIG1ldGFkYXRhKSB7CisgICAgICAgIGlmIChtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgICAgIG1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+Ymhpc3RfZGVidWdfcGFyYW1zID0gKmJoaXN0X2V4aWZfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgbUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5iaGlzdF9kZWJ1Z19wYXJhbXNfdmFsaWQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9xM2FfdHVuaW5nX2luZm9fdCwgcTNhX3R1bmluZ19leGlmX2RlYnVnX3BhcmFtcywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR18zQV9UVU5JTkcsIG1ldGFkYXRhKSB7CisgICAgICAgIGlmIChtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgICAgIG1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+cTNhX3R1bmluZ19kZWJ1Z19wYXJhbXMgPSAqcTNhX3R1bmluZ19leGlmX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIG1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+cTNhX3R1bmluZ19kZWJ1Z19wYXJhbXNfdmFsaWQgPSBUUlVFOworICAgICAgICB9CisgICAgfQogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNTQzNiwxOCArNjE3Niw2IEBACiAgICAgICAgIExPR0QoInVyZ2VudCBNZXRhZGF0YSA6IEFORFJPSURfQ09OVFJPTF9BRV9TVEFURSAldSIsICphZV9zdGF0ZSk7CiAgICAgfQogCi0gICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIGZvY3VzTW9kZSwgQ0FNX0lOVEZfUEFSTV9GT0NVU19NT0RFLCBtZXRhZGF0YSkgewotICAgICAgICBpbnQgdmFsID0gbG9va3VwRndrTmFtZShGT0NVU19NT0RFU19NQVAsIE1FVEFEQVRBX01BUF9TSVpFKEZPQ1VTX01PREVTX01BUCksICpmb2N1c01vZGUpOwotICAgICAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gdmFsKSB7Ci0gICAgICAgICAgICB1aW50OF90IGZ3a0FmTW9kZSA9ICh1aW50OF90KXZhbDsKLSAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwgJmZ3a0FmTW9kZSwgMSk7Ci0gICAgICAgICAgICBMT0dEKCJ1cmdlbnQgTWV0YWRhdGEgOiBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSAlZCIsIHZhbCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0dIKCJ1cmdlbnQgTWV0YWRhdGEgbm90IGZvdW5kIDogQU5EUk9JRF9DT05UUk9MX0FGX01PREUgJWQiLAotICAgICAgICAgICAgICAgICAgICB2YWwpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3RyaWdnZXJfdCwgYWZfdHJpZ2dlciwgQ0FNX0lOVEZfTUVUQV9BRl9UUklHR0VSLCBtZXRhZGF0YSkgewogICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVIsCiAgICAgICAgICAgICAgICAgJmFmX3RyaWdnZXItPnRyaWdnZXIsIDEpOwpAQCAtNTU2OSwxNiArNjI5NywyMCBAQAogICAgICAgICB0aW1lICgmY3VycmVudF90aW1lKTsKICAgICAgICAgdGltZWluZm8gPSBsb2NhbHRpbWUgKCZjdXJyZW50X3RpbWUpOwogICAgICAgICBpZiAodGltZWluZm8gIT0gTlVMTCkgeworICAgICAgICAgICAgLyogQ29uc2lzdGVudCBuYW1pbmcgZm9yIEpwZWcrbWV0YStyYXc6IG1ldGEgbmFtZSAqLwogICAgICAgICAgICAgc3RyZnRpbWUgKHRpbWVCdWYsIHNpemVvZih0aW1lQnVmKSwKLSAgICAgICAgICAgICAgICAgICAgUUNBTUVSQV9EVU1QX0ZSTV9MT0NBVElPTiIlWSVtJWQlSCVNJVMiLCB0aW1laW5mbyk7CisgICAgICAgICAgICAgICAgICAgIFFDQU1FUkFfRFVNUF9GUk1fTE9DQVRJT04iSU1HXyVZJW0lZF8lSCVNJVMiLCB0aW1laW5mbyk7CisgICAgICAgICAgICAvKiBDb25zaXN0ZW50IG5hbWluZyBmb3IgSnBlZyttZXRhK3JhdzogbWV0YSBuYW1lIGVuZCovCiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nOCBmaWxlUGF0aCh0aW1lQnVmKTsKKyAgICAgICAgIC8qIENvbnNpc3RlbnQgbmFtaW5nIGZvciBKcGVnK21ldGErcmF3ICovCiAgICAgICAgIHNucHJpbnRmKGJ1ZiwKICAgICAgICAgICAgICAgICBzaXplb2YoYnVmKSwKICAgICAgICAgICAgICAgICAiJWRtXyVzXyVkLmJpbiIsCiAgICAgICAgICAgICAgICAgZHVtcEZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcik7CisgICAgICAgICAvKiBDb25zaXN0ZW50IG5hbWluZyBmb3IgSnBlZyttZXRhK3JhdyBlbmQgKi8KICAgICAgICAgZmlsZVBhdGguYXBwZW5kKGJ1Zik7CiAgICAgICAgIGludCBmaWxlX2ZkID0gb3BlbihmaWxlUGF0aC5zdHJpbmcoKSwgT19SRFdSIHwgT19DUkVBVCwgMDc3Nyk7CiAgICAgICAgIGlmIChmaWxlX2ZkID49IDApIHsKQEAgLTU5MTYsNyArNjY0OCw4IEBACiAgICAgcmMgPSBjYW1lcmFIYW5kbGUtPm9wcy0+bWFwX2J1ZihjYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX0NBUEFCSUxJVFksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlIZWFwLT5nZXRGZCgwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNhbV9jYXBhYmlsaXR5X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNhbV9jYXBhYmlsaXR5X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5SGVhcC0+Z2V0UHRyKDApKTsKICAgICBpZihyYyA8IDApIHsKICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIG1hcCBjYXBhYmlsaXR5IGJ1ZmZlciIpOwogICAgICAgICBnb3RvIG1hcF9mYWlsZWQ7CkBAIC01OTM1LDggKzY2NjgsMTQgQEAKICAgICB9CiAgICAgbWVtY3B5KGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXSwgREFUQV9QVFIoY2FwYWJpbGl0eUhlYXAsMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNhbV9jYXBhYmlsaXR5X3QpKTsKLSAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5vZmZzZXRfaW5mby5vZmZzZXRfeCA9IDA7Ci0gICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5hbmFseXNpc19wYWRkaW5nX2luZm8ub2Zmc2V0X2luZm8ub2Zmc2V0X3kgPSAwOworCisgICAgaW50IGluZGV4OworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IENBTV9BTkFMWVNJU19JTkZPX01BWDsgaW5kZXgrKykgeworICAgICAgICBjYW1fYW5hbHlzaXNfaW5mb190ICpwX2FuYWx5c2lzX2luZm8gPQorICAgICAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmFuYWx5c2lzX2luZm9baW5kZXhdOworICAgICAgICBwX2FuYWx5c2lzX2luZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5vZmZzZXRfaW5mby5vZmZzZXRfeCA9IDA7CisgICAgICAgIHBfYW5hbHlzaXNfaW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLm9mZnNldF9pbmZvLm9mZnNldF95ID0gMDsKKyAgICB9CiAgICAgcmMgPSAwOwogCiBxdWVyeV9mYWlsZWQ6CkBAIC02MDA0LDcgKzY3NDMsOCBAQAogICAgIHJjID0gbUNhbWVyYUhhbmRsZS0+b3BzLT5tYXBfYnVmKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCiAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9QQVJNX0JVRiwKICAgICAgICAgICAgIG1QYXJhbUhlYXAtPmdldEZkKDApLAotICAgICAgICAgICAgc2l6ZW9mKG1ldGFkYXRhX2J1ZmZlcl90KSk7CisgICAgICAgICAgICBzaXplb2YobWV0YWRhdGFfYnVmZmVyX3QpLAorICAgICAgICAgICAgKG1ldGFkYXRhX2J1ZmZlcl90ICopIERBVEFfUFRSKG1QYXJhbUhlYXAsMCkpOwogICAgIGlmKHJjIDwgMCkgewogICAgICAgICBMT0dFKCJmYWlsZWQgdG8gbWFwIFNFVFBBUk0gYnVmZmVyIik7CiAgICAgICAgIHJjID0gRkFJTEVEX1RSQU5TQUNUSU9OOwpAQCAtNjIyNiw3ICs2OTY2LDggQEAKIAogICAgIHVpbnQ4X3Qgc3VwcG9ydGVkSHdMdmwgPSBsaW1pdGVkRGV2aWNlID8KICAgICAgICAgICAgIEFORFJPSURfSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfTElNSVRFRCA6Ci0gICAgICAgICAgICBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0ZVTEw7CisgICAgICAgICAgICAvLyBMRVZFTF8zIC0gVGhpcyBkZXZpY2Ugd2lsbCBzdXBwb3J0IGxldmVsIDMuCisgICAgICAgICAgICBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMXzM7CiAKICAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMLAogICAgICAgICAgICAgJnN1cHBvcnRlZEh3THZsLCAxKTsKQEAgLTYyOTcsOCArNzAzOCwxMSBAQAogICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0VOU09SX0lORk9fV0hJVEVfTEVWRUwsCiAgICAgICAgICAgICAmZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT53aGl0ZV9sZXZlbCwgMSk7CiAKKyAgICBpbnQzMl90IGFkanVzdGVkX2JsX3Blcl9jZmFbQkxBQ0tfTEVWRUxfUEFUVEVSTl9DTlRdOworICAgIGFkanVzdEJsYWNrTGV2ZWxGb3JDRkEoZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5ibGFja19sZXZlbF9wYXR0ZXJuLCBhZGp1c3RlZF9ibF9wZXJfY2ZhLAorICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCk7CiAgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTiwKLSAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+YmxhY2tfbGV2ZWxfcGF0dGVybiwgQkxBQ0tfTEVWRUxfUEFUVEVSTl9DTlQpOworICAgICAgICAgICAgYWRqdXN0ZWRfYmxfcGVyX2NmYSwgQkxBQ0tfTEVWRUxfUEFUVEVSTl9DTlQpOwogCiAgICAgYm9vbCBoYXNCbGFja1JlZ2lvbnMgPSBmYWxzZTsKICAgICBpZiAoZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5vcHRpY2FsX2JsYWNrX3JlZ2lvbl9jb3VudCA+IE1BWF9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMpIHsKQEAgLTYzMjIsNyArNzA2Niw5IEBACiAgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9UT05FTUFQX01BWF9DVVJWRV9QT0lOVFMsCiAgICAgICAgICAgICAmZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5tYXhfdG9uZV9tYXBfY3VydmVfcG9pbnRzLCAxKTsKIAotICAgIHVpbnQ4X3QgdGltZXN0YW1wU291cmNlID0gQU5EUk9JRF9TRU5TT1JfSU5GT19USU1FU1RBTVBfU09VUkNFX1JFQUxUSU1FOworICAgIHVpbnQ4X3QgdGltZXN0YW1wU291cmNlID0gKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+dGltZXN0YW1wX2NhbGlicmF0ZWQgPworICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfSU5GT19USU1FU1RBTVBfU09VUkNFX1JFQUxUSU1FIDoKKyAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fVElNRVNUQU1QX1NPVVJDRV9VTktOT1dOKTsKICAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0UsCiAgICAgICAgICAgICAmdGltZXN0YW1wU291cmNlLCAxKTsKIApAQCAtNjU3OCwzNCArNzMyNCwzMyBAQAogICAgICAgICAvKiBBZHZlcnRpc2Ugb25seSBNSU5fRlBTX0ZPUl9CQVRDSF9NT0RFIG9yIGFib3ZlIGFzIEhJR0hfU1BFRURfQ09ORklHUyAqLwogICAgICAgICBpZiAoZnBzID49IE1JTl9GUFNfRk9SX0JBVENIX01PREUpIHsKICAgICAgICAgICAgIC8qIEZvciBlYWNoIEhGUiBmcmFtZSByYXRlLCBuZWVkIHRvIGFkdmVydGlzZSBvbmUgdmFyaWFibGUgZnBzIHJhbmdlCi0gICAgICAgICAgICAgKiBhbmQgb25lIGZpeGVkIGZwcyByYW5nZS4gRWc6IGZvciAxMjAgRlBTLCBhZHZlcnRpc2UgWzMwLCAxMjBdIGFuZAotICAgICAgICAgICAgICogWzEyMCwgMTIwXS4gV2hpbGUgY2FtY29yZGVyIHByZXZpZXcgYWxvbmUgaXMgcnVubmluZyBbMzAsIDEyMF0gaXMKKyAgICAgICAgICAgICAqIGFuZCBvbmUgZml4ZWQgZnBzIHJhbmdlIHBlciBkaW1lbnNpb24uIEVnOiBmb3IgMTIwIEZQUywgYWR2ZXJ0aXNlIFszMCwgMTIwXQorICAgICAgICAgICAgICogYW5kIFsxMjAsIDEyMF0uIFdoaWxlIGNhbWNvcmRlciBwcmV2aWV3IGFsb25lIGlzIHJ1bm5pbmcgWzMwLCAxMjBdIGlzCiAgICAgICAgICAgICAgKiBzZXQgYnkgdGhlIGFwcC4gV2hlbiB2aWRlbyByZWNvcmRpbmcgaXMgc3RhcnRlZCwgWzEyMCwgMTIwXSBpcwogICAgICAgICAgICAgICogc2V0LiBUaGlzIHdheSBzZW5zb3IgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBjaGFuZ2Ugd2hlbiByZWNvcmRpbmcKICAgICAgICAgICAgICAqIGlzIHN0YXJ0ZWQgKi8KIAotICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHNpemVvZihkZWZhdWx0X2hmcl92aWRlb19zaXplcykgLyBzaXplb2YoZGVmYXVsdF9oZnJfdmlkZW9fc2l6ZXNbMF0pOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBsZW47IGorKykgewotICAgICAgICAgICAgICAgIGlmICgoZGVmYXVsdF9oZnJfdmlkZW9fc2l6ZXNbal0ud2lkdGggPD0gZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5oZnJfdGJsW2ldLmRpbS53aWR0aCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHRfaGZyX3ZpZGVvX3NpemVzW2pdLmhlaWdodCA8PSBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmhmcl90YmxbaV0uZGltLmhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBNaWdodCBuZWVkIGFkZGl0aW9uYWwgZmlsdGVyaW5nIGJhc2VkIG9uIFZGRS9DUFAvQ1BVIGNhcGFiaWxpdGllcworICAgICAgICAgICAgLyogKHdpZHRoLCBoZWlnaHQsIGZwc19taW4sIGZwc19tYXgsIGJhdGNoX3NpemVfbWF4KSAqLworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmhmcl90YmxbaV0uZGltX2NudCAmJgorICAgICAgICAgICAgICAgIGogPCBNQVhfU0laRVNfQ05UOyBqKyspIHsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVfaGZyX2NvbmZpZ3MuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5oZnJfdGJsW2ldLmRpbVtqXS53aWR0aCk7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2hmcl9jb25maWdzLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+aGZyX3RibFtpXS5kaW1bal0uaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVfaGZyX2NvbmZpZ3MuYWRkKFBSRVZJRVdfRlBTX0ZPUl9IRlIpOworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9oZnJfY29uZmlncy5hZGQoZnBzKTsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVfaGZyX2NvbmZpZ3MuYWRkKGZwcyAvIFBSRVZJRVdfRlBTX0ZPUl9IRlIpOwogCi0gICAgICAgICAgICAgICAgICAgIC8qICh3aWR0aCwgaGVpZ2h0LCBmcHNfbWluLCBmcHNfbWF4LCBiYXRjaF9zaXplX21heCkgKi8KLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2hmcl9jb25maWdzLmFkZChkZWZhdWx0X2hmcl92aWRlb19zaXplc1tqXS53aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9oZnJfY29uZmlncy5hZGQoZGVmYXVsdF9oZnJfdmlkZW9fc2l6ZXNbal0uaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2hmcl9jb25maWdzLmFkZChQUkVWSUVXX0ZQU19GT1JfSEZSKTsKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2hmcl9jb25maWdzLmFkZChmcHMpOwotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVfaGZyX2NvbmZpZ3MuYWRkKGZwcyAvIFBSRVZJRVdfRlBTX0ZPUl9IRlIpOwotCi0gICAgICAgICAgICAgICAgICAgIC8qICh3aWR0aCwgaGVpZ2h0LCBmcHNfbWluLCBmcHNfbWF4LCBiYXRjaF9zaXplX21heCkgKi8KLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2hmcl9jb25maWdzLmFkZChkZWZhdWx0X2hmcl92aWRlb19zaXplc1tqXS53aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9oZnJfY29uZmlncy5hZGQoZGVmYXVsdF9oZnJfdmlkZW9fc2l6ZXNbal0uaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2hmcl9jb25maWdzLmFkZChmcHMpOwotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVfaGZyX2NvbmZpZ3MuYWRkKGZwcyk7Ci0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9oZnJfY29uZmlncy5hZGQoZnBzIC8gUFJFVklFV19GUFNfRk9SX0hGUik7Ci0gICAgICAgICAgICAgICAgfS8vIGlmCi0gICAgICAgICAgICB9Ly8gZm9yICguLi47IGogPCBsZW47Li4uKQotICAgICAgIH0gLy9pZiAoZnBzID49IE1JTl9GUFNfRk9SX0JBVENIX01PREUpCisgICAgICAgICAgICAgICAgLyogKHdpZHRoLCBoZWlnaHQsIGZwc19taW4sIGZwc19tYXgsIGJhdGNoX3NpemVfbWF4KSAqLworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9oZnJfY29uZmlncy5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmhmcl90YmxbaV0uZGltW2pdLndpZHRoKTsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVfaGZyX2NvbmZpZ3MuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5oZnJfdGJsW2ldLmRpbVtqXS5oZWlnaHQpOworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9oZnJfY29uZmlncy5hZGQoZnBzKTsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVfaGZyX2NvbmZpZ3MuYWRkKGZwcyk7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2hmcl9jb25maWdzLmFkZChmcHMgLyBQUkVWSUVXX0ZQU19GT1JfSEZSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICB9CiAgICAgfQogICAgIC8vQWR2ZXJ0aXNlIEhGUiBjYXBhYmlsaXR5IG9ubHkgaWYgdGhlIHByb3BlcnR5IGlzIHNldAogICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOwpAQCAtNzAzMSw3ICs3Nzc2LDExIEBACiAgICAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0hJU1RPR1JBTV9NT0RFLCBBTkRST0lEX1NUQVRJU1RJQ1NfU0hBUlBORVNTX01BUF9NT0RFLAogICAgICAgIEFORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREUsIEFORFJPSURfVE9ORU1BUF9DVVJWRV9CTFVFLAogICAgICAgIEFORFJPSURfVE9ORU1BUF9DVVJWRV9HUkVFTiwgQU5EUk9JRF9UT05FTUFQX0NVUlZFX1JFRCwgQU5EUk9JRF9UT05FTUFQX01PREUsCi0gICAgICAgQU5EUk9JRF9CTEFDS19MRVZFTF9MT0NLIH07CisgICAgICAgQU5EUk9JRF9CTEFDS19MRVZFTF9MT0NLLCBORVhVU19FWFBFUklNRU5UQUxfMjAxNl9IWUJSSURfQUVfRU5BQkxFLAorICAgICAgIC8qIERldkNhbURlYnVnIG1ldGFkYXRhIHJlcXVlc3Rfa2V5c19iYXNpYyAqLworICAgICAgIERFVkNBTURFQlVHX01FVEFfRU5BQkxFLAorICAgICAgIC8qIERldkNhbURlYnVnIG1ldGFkYXRhIGVuZCAqLworICAgICAgIH07CiAKICAgICBzaXplX3QgcmVxdWVzdF9rZXlzX2NudCA9CiAgICAgICAgICAgICBzaXplb2YocmVxdWVzdF9rZXlzX2Jhc2ljKS9zaXplb2YocmVxdWVzdF9rZXlzX2Jhc2ljWzBdKTsKQEAgLTcwNjcsOSArNzgxNiw1NSBAQAogICAgICAgIEFORFJPSURfU1RBVElTVElDU19QUkVESUNURURfQ09MT1JfR0FJTlMsIEFORFJPSURfU1RBVElTVElDU19QUkVESUNURURfQ09MT1JfVFJBTlNGT1JNLAogICAgICAgIEFORFJPSURfU1RBVElTVElDU19TQ0VORV9GTElDS0VSLCBBTkRST0lEX1NUQVRJU1RJQ1NfRkFDRV9SRUNUQU5HTEVTLAogICAgICAgIEFORFJPSURfU1RBVElTVElDU19GQUNFX1NDT1JFUywKLSAgICAgICBBTkRST0lEX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMLAotICAgICAgIEFORFJPSURfU0VOU09SX0RZTkFNSUNfV0hJVEVfTEVWRUwsCi0gICAgICAgQU5EUk9JRF9DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NUIH07CisgICAgICAgTkVYVVNfRVhQRVJJTUVOVEFMXzIwMTZfSFlCUklEX0FFX0VOQUJMRSwKKyAgICAgICBORVhVU19FWFBFUklNRU5UQUxfMjAxNl9BRl9TQ0VORV9DSEFOR0UsCisgICAgICAgLy8gRGV2Q2FtRGVidWcgbWV0YWRhdGEgcmVzdWx0X2tleXNfYmFzaWMKKyAgICAgICBERVZDQU1ERUJVR19NRVRBX0VOQUJMRSwKKyAgICAgICAvLyBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSByZXN1bHRfa2V5cyBBRgorICAgICAgIERFVkNBTURFQlVHX0FGX0xFTlNfUE9TSVRJT04sCisgICAgICAgREVWQ0FNREVCVUdfQUZfVE9GX0NPTkZJREVOQ0UsCisgICAgICAgREVWQ0FNREVCVUdfQUZfVE9GX0RJU1RBTkNFLAorICAgICAgIERFVkNBTURFQlVHX0FGX0xVTUEsCisgICAgICAgREVWQ0FNREVCVUdfQUZfSEFGX1NUQVRFLAorICAgICAgIERFVkNBTURFQlVHX0FGX01PTklUT1JfUERBRl9UQVJHRVRfUE9TLAorICAgICAgIERFVkNBTURFQlVHX0FGX01PTklUT1JfUERBRl9DT05GSURFTkNFLAorICAgICAgIERFVkNBTURFQlVHX0FGX01PTklUT1JfUERBRl9SRUZPQ1VTLAorICAgICAgIERFVkNBTURFQlVHX0FGX01PTklUT1JfVE9GX1RBUkdFVF9QT1MsCisgICAgICAgREVWQ0FNREVCVUdfQUZfTU9OSVRPUl9UT0ZfQ09ORklERU5DRSwKKyAgICAgICBERVZDQU1ERUJVR19BRl9NT05JVE9SX1RPRl9SRUZPQ1VTLAorICAgICAgIERFVkNBTURFQlVHX0FGX01PTklUT1JfVFlQRV9TRUxFQ1QsCisgICAgICAgREVWQ0FNREVCVUdfQUZfTU9OSVRPUl9SRUZPQ1VTLAorICAgICAgIERFVkNBTURFQlVHX0FGX01PTklUT1JfVEFSR0VUX1BPUywKKyAgICAgICBERVZDQU1ERUJVR19BRl9TRUFSQ0hfUERBRl9UQVJHRVRfUE9TLAorICAgICAgIERFVkNBTURFQlVHX0FGX1NFQVJDSF9QREFGX05FWFRfUE9TLAorICAgICAgIERFVkNBTURFQlVHX0FGX1NFQVJDSF9QREFGX05FQVJfUE9TLAorICAgICAgIERFVkNBTURFQlVHX0FGX1NFQVJDSF9QREFGX0ZBUl9QT1MsCisgICAgICAgREVWQ0FNREVCVUdfQUZfU0VBUkNIX1BEQUZfQ09ORklERU5DRSwKKyAgICAgICBERVZDQU1ERUJVR19BRl9TRUFSQ0hfVE9GX1RBUkdFVF9QT1MsCisgICAgICAgREVWQ0FNREVCVUdfQUZfU0VBUkNIX1RPRl9ORVhUX1BPUywKKyAgICAgICBERVZDQU1ERUJVR19BRl9TRUFSQ0hfVE9GX05FQVJfUE9TLAorICAgICAgIERFVkNBTURFQlVHX0FGX1NFQVJDSF9UT0ZfRkFSX1BPUywKKyAgICAgICBERVZDQU1ERUJVR19BRl9TRUFSQ0hfVE9GX0NPTkZJREVOQ0UsCisgICAgICAgREVWQ0FNREVCVUdfQUZfU0VBUkNIX1RZUEVfU0VMRUNULAorICAgICAgIERFVkNBTURFQlVHX0FGX1NFQVJDSF9ORVhUX1BPUywKKyAgICAgICBERVZDQU1ERUJVR19BRl9TRUFSQ0hfVEFSR0VUX1BPUywKKyAgICAgICAvLyBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSByZXN1bHRfa2V5cyBBRUMKKyAgICAgICBERVZDQU1ERUJVR19BRUNfVEFSR0VUX0xVTUEsCisgICAgICAgREVWQ0FNREVCVUdfQUVDX0NPTVBfTFVNQSwKKyAgICAgICBERVZDQU1ERUJVR19BRUNfQVZHX0xVTUEsCisgICAgICAgREVWQ0FNREVCVUdfQUVDX0NVUl9MVU1BLAorICAgICAgIERFVkNBTURFQlVHX0FFQ19MSU5FQ09VTlQsCisgICAgICAgREVWQ0FNREVCVUdfQUVDX1JFQUxfR0FJTiwKKyAgICAgICBERVZDQU1ERUJVR19BRUNfRVhQX0lOREVYLAorICAgICAgIERFVkNBTURFQlVHX0FFQ19MVVhfSURYLAorICAgICAgIC8vIERldkNhbURlYnVnIG1ldGFkYXRhIHJlc3VsdF9rZXlzIEFXQgorICAgICAgIERFVkNBTURFQlVHX0FXQl9SX0dBSU4sCisgICAgICAgREVWQ0FNREVCVUdfQVdCX0dfR0FJTiwKKyAgICAgICBERVZDQU1ERUJVR19BV0JfQl9HQUlOLAorICAgICAgIERFVkNBTURFQlVHX0FXQl9DQ1QsCisgICAgICAgREVWQ0FNREVCVUdfQVdCX0RFQ0lTSU9OLAorICAgICAgIC8qIERldkNhbURlYnVnIG1ldGFkYXRhIGVuZCAqLworICAgICAgIH07CiAgICAgc2l6ZV90IHJlc3VsdF9rZXlzX2NudCA9CiAgICAgICAgICAgICBzaXplb2YocmVzdWx0X2tleXNfYmFzaWMpL3NpemVvZihyZXN1bHRfa2V5c19iYXNpY1swXSk7CiAKQEAgLTcwOTAsNiArNzg4NSwxMCBAQAogICAgICAgICBhdmFpbGFibGVfcmVzdWx0X2tleXMuYWRkKEFORFJPSURfU1RBVElTVElDU19GQUNFX0lEUyk7CiAgICAgICAgIGF2YWlsYWJsZV9yZXN1bHRfa2V5cy5hZGQoQU5EUk9JRF9TVEFUSVNUSUNTX0ZBQ0VfTEFORE1BUktTKTsKICAgICB9CisgICAgaWYgKGhhc0JsYWNrUmVnaW9ucykgeworICAgICAgICBhdmFpbGFibGVfcmVzdWx0X2tleXMuYWRkKEFORFJPSURfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwpOworICAgICAgICBhdmFpbGFibGVfcmVzdWx0X2tleXMuYWRkKEFORFJPSURfU0VOU09SX0RZTkFNSUNfV0hJVEVfTEVWRUwpOworICAgIH0KICAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTLAogICAgICAgICAgICAgYXZhaWxhYmxlX3Jlc3VsdF9rZXlzLmFycmF5KCksIGF2YWlsYWJsZV9yZXN1bHRfa2V5cy5zaXplKCkpOwogCkBAIC03NTI0LDcgKzgzMjMsNyBAQAogCiAKICAgICBpbmZvLT5vcmllbnRhdGlvbiA9IChpbnQpZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zZW5zb3JfbW91bnRfYW5nbGU7Ci0gICAgaW5mby0+ZGV2aWNlX3ZlcnNpb24gPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMzsKKyAgICBpbmZvLT5kZXZpY2VfdmVyc2lvbiA9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OwogICAgIGluZm8tPnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzID0gZ1N0YXRpY01ldGFkYXRhW2NhbWVyYUlkXTsKIAogICAgIC8vRm9yIG5vdyBhc3N1bWUgYm90aCBjYW1lcmFzIGNhbiBvcGVyYXRlIGluZGVwZW5kZW50bHkuCkBAIC03NTk2LDYgKzgzOTUsMTIgQEAKICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmVpcy5lbmFibGUiLCBlaXNfcHJvcCwgIjAiKTsKICAgICBjb25zdCB1aW50OF90IGVpc19wcm9wX3NldCA9ICh1aW50OF90KWF0b2koZWlzX3Byb3ApOwogCisgICAgLy8gSHlicmlkIEFFIGVuYWJsZS9kaXNhYmxlCisgICAgY2hhciBoeWJyaWRfYWVfcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldChoeWJyaWRfYWVfcHJvcCwgMCwgc2l6ZW9mKGh5YnJpZF9hZV9wcm9wKSk7CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5oeWJyaWRfYWUuZW5hYmxlIiwgaHlicmlkX2FlX3Byb3AsICIwIik7CisgICAgY29uc3QgdWludDhfdCBoeWJyaWRfYWUgPSAodWludDhfdClhdG9pKGh5YnJpZF9hZV9wcm9wKTsKKwogICAgIGNvbnN0IGJvb2wgZmFjaW5nQmFjayA9IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnBvc2l0aW9uID09IENBTV9QT1NJVElPTl9CQUNLOwogICAgIC8vIFRoaXMgaXMgYSBiaXQgaGFja3kuIEVJUyBpcyBlbmFibGVkIG9ubHkgd2hlbiB0aGUgYWJvdmUgc2V0cHJvcAogICAgIC8vIGlzIHNldCB0byBub24temVybyB2YWx1ZSBhbmQgb24gYmFjayBjYW1lcmEgKGZvciAyMDE1IE5leHVzKS4KQEAgLTc2MTcsNiArODQyMiw4IEBACiAgICAgYm9vbCBmYXN0TW9kZUVudHJ5QXZhaWxhYmxlID0gRkFMU0U7CiAgICAgdnNNb2RlID0gQU5EUk9JRF9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERV9PRkY7CiAgICAgb3B0U3RhYk1vZGUgPSBBTkRST0lEX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREVfT0ZGOworICAgIHVpbnQ4X3Qgc2hhZGluZ21hcF9tb2RlID0gQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVBfTU9ERV9PRkY7CisKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9QUkVWSUVXOgogICAgICAgICBjb250cm9sSW50ZW50ID0gQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX1BSRVZJRVc7CkBAIC03NjUwLDYgKzg0NTcsOSBAQAogICAgICAgICB9IGVsc2UgaWYgKGZhc3RNb2RlRW50cnlBdmFpbGFibGUpIHsKICAgICAgICAgICAgIGNhY01vZGUgPSBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFX0ZBU1Q7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKENBTV9TRU5TT1JfUkFXID09IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnNlbnNvcl90eXBlLnNlbnNfdHlwZSkgeworICAgICAgICAgICAgc2hhZGluZ21hcF9tb2RlID0gQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVBfTU9ERV9PTjsKKyAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9WSURFT19SRUNPUkQ6CiAgICAgICAgIGNvbnRyb2xJbnRlbnQgPSBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfVklERU9fUkVDT1JEOwpAQCAtNzcwMyw2ICs4NTEzLDcgQEAKICAgICAgICAgdG9uZW1hcF9tb2RlID0gQU5EUk9JRF9UT05FTUFQX01PREVfRkFTVDsKICAgICAgICAgY2FjTW9kZSA9IEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX01PREVfRkFTVDsKICAgICAgICAgY29udHJvbEludGVudCA9IEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9DVVNUT007CisgICAgICAgIGZvY3VzTW9kZSA9IEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX0NPTlRJTlVPVVNfUElDVFVSRTsKICAgICAgICAgb3B0U3RhYk1vZGUgPSBBTkRST0lEX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREVfT0ZGOwogICAgICAgICBicmVhazsKICAgICB9CkBAIC03NzIyLDYgKzg1MzMsNyBAQAogICAgICAgICAgICAgfHwgb2lzX2Rpc2FibGUpCiAgICAgICAgIG9wdFN0YWJNb2RlID0gQU5EUk9JRF9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFX09GRjsKICAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFLCAmb3B0U3RhYk1vZGUsIDEpOworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUF9NT0RFLCAmc2hhZGluZ21hcF9tb2RlLCAxKTsKIAogICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfRVhQT1NVUkVfQ09NUEVOU0FUSU9OLAogICAgICAgICAgICAgJmdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmV4cG9zdXJlX2NvbXBlbnNhdGlvbl9kZWZhdWx0LCAxKTsKQEAgLTc3NjgsOCArODU4MCwxMCBAQAogICAgIGZsb2F0IGRlZmF1bHRfZm9jYWxfbGVuZ3RoID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+Zm9jYWxfbGVuZ3RoOwogICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0xFTlNfRk9DQUxfTEVOR1RILCAmZGVmYXVsdF9mb2NhbF9sZW5ndGgsIDEpOwogCi0gICAgZmxvYXQgZGVmYXVsdF9mb2N1c19kaXN0YW5jZSA9IDA7Ci0gICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfTEVOU19GT0NVU19ESVNUQU5DRSwgJmRlZmF1bHRfZm9jdXNfZGlzdGFuY2UsIDEpOworICAgIGlmIChmb2N1c01vZGUgPT0gQU5EUk9JRF9DT05UUk9MX0FGX01PREVfT0ZGKSB7CisgICAgICAgIGZsb2F0IGRlZmF1bHRfZm9jdXNfZGlzdGFuY2UgPSAwOworICAgICAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9MRU5TX0ZPQ1VTX0RJU1RBTkNFLCAmZGVmYXVsdF9mb2N1c19kaXN0YW5jZSwgMSk7CisgICAgfQogCiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGVtb3NhaWNNb2RlID0gQU5EUk9JRF9ERU1PU0FJQ19NT0RFX0ZBU1Q7CiAgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfREVNT1NBSUNfTU9ERSwgJmRlbW9zYWljTW9kZSwgMSk7CkBAIC03NzkzLDggKzg2MDcsNiBAQAogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGhvdFBpeGVsTWFwTW9kZSA9IEFORFJPSURfU1RBVElTVElDU19IT1RfUElYRUxfTUFQX01PREVfT0ZGOwogICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX1NUQVRJU1RJQ1NfSE9UX1BJWEVMX01BUF9NT0RFLCAmaG90UGl4ZWxNYXBNb2RlLCAxKTsKIAotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGxlbnNTaGFkaW5nTW9kZSA9IEFORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREVfT0ZGOwotICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUF9NT0RFLCAmbGVuc1NoYWRpbmdNb2RlLCAxKTsKIAogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGJsYWNrTGV2ZWxMb2NrID0gQU5EUk9JRF9CTEFDS19MRVZFTF9MT0NLX09GRjsKICAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9CTEFDS19MRVZFTF9MT0NLLCAmYmxhY2tMZXZlbExvY2ssIDEpOwpAQCAtNzgxMCw2ICs4NjIyLDkgQEAKICAgICAvKiBzZW5zaXRpdml0eSAqLwogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGRlZmF1bHRfc2Vuc2l0aXZpdHkgPSAxMDA7CiAgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfU0VOU09SX1NFTlNJVElWSVRZLCAmZGVmYXVsdF9zZW5zaXRpdml0eSwgMSk7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgZGVmYXVsdF9pc3Bfc2Vuc2l0aXZpdHkgPQorICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+aXNwX3NlbnNpdGl2aXR5X3JhbmdlLm1pbl9zZW5zaXRpdml0eTsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NULCAmZGVmYXVsdF9pc3Bfc2Vuc2l0aXZpdHksIDEpOwogCiAgICAgLyplZGdlIG1vZGUqLwogICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0VER0VfTU9ERSwgJmVkZ2VfbW9kZSwgMSk7CkBAIC03ODM5LDExICs4NjU0LDE2IEBACiAgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfTEVOU19GT0NVU19ESVNUQU5DRSwgJmZvY3VzX2Rpc3RhbmNlLCAxKTsKIAogICAgIC8qdGFyZ2V0IGZwcyByYW5nZTogdXNlIG1heGltdW0gcmFuZ2UgZm9yIHBpY3R1cmUsIGFuZCBtYXhpbXVtIGZpeGVkIHJhbmdlIGZvciB2aWRlbyovCisgICAgLyogUmVzdHJpY3QgZGVmYXVsdCBwcmV2aWV3IHRlbXBsYXRlIHRvIG1heCAzMCBmcHMgKi8KICAgICBmbG9hdCBtYXhfcmFuZ2UgPSAwLjA7CiAgICAgZmxvYXQgbWF4X2ZpeGVkX2ZwcyA9IDAuMDsKICAgICBpbnQzMl90IGZwc19yYW5nZVsyXSA9IHswLCAwfTsKICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+ZnBzX3Jhbmdlc190YmxfY250OwogICAgICAgICAgICAgaSsrKSB7CisgICAgICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5mcHNfcmFuZ2VzX3RibFtpXS5tYXhfZnBzID4KKyAgICAgICAgICAgICAgICBURU1QTEFURV9NQVhfUFJFVklFV19GUFMpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAgICAgICAgIGZsb2F0IHJhbmdlID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+ZnBzX3Jhbmdlc190YmxbaV0ubWF4X2ZwcyAtCiAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5mcHNfcmFuZ2VzX3RibFtpXS5taW5fZnBzOwogICAgICAgICBpZiAodHlwZSA9PSBDQU1FUkEzX1RFTVBMQVRFX1BSRVZJRVcgfHwKQEAgLTc4OTUsMTMgKzg3MTUsNiBAQAogICAgIHVpbnQ4X3QgYmxhY2tsZXZlbF9sb2NrID0gQU5EUk9JRF9CTEFDS19MRVZFTF9MT0NLX09GRjsKICAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9CTEFDS19MRVZFTF9MT0NLLCAmYmxhY2tsZXZlbF9sb2NrLCAxKTsKIAotICAgIC8qIGxlbnMgc2hhZGluZyBtYXAgbW9kZSAqLwotICAgIHVpbnQ4X3Qgc2hhZGluZ21hcF9tb2RlID0gQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVBfTU9ERV9PRkY7Ci0gICAgaWYgKENBTV9TRU5TT1JfUkFXID09IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnNlbnNvcl90eXBlLnNlbnNfdHlwZSkgewotICAgICAgICBzaGFkaW5nbWFwX21vZGUgPSBBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUF9NT0RFX09OOwotICAgIH0KLSAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVBfTU9ERSwgJnNoYWRpbmdtYXBfbW9kZSwgMSk7Ci0KICAgICAvL3NwZWNpYWwgZGVmYXVsdHMgZm9yIG1hbnVhbCB0ZW1wbGF0ZQogICAgIGlmICh0eXBlID09IENBTUVSQTNfVEVNUExBVEVfTUFOVUFMKSB7CiAgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG1hbnVhbENvbnRyb2xNb2RlID0gQU5EUk9JRF9DT05UUk9MX01PREVfT0ZGOwpAQCAtNzkzNiw3ICs4NzQ5LDYgQEAKIAogICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9WSURFT19SRUNPUkQ6Ci0gICAgICAgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfVklERU9fU05BUFNIT1Q6CiAgICAgICAgICAgICAgICAgICAgIHRucl9lbmFibGUgPSAxOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNzk1Myw2ICs4NzY1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRucl9lbmFibGUsIHRucl9wcm9jZXNzX3R5cGUsIHR5cGUpOwogICAgIH0KIAorICAgIC8vVXBkYXRlIExpbmsgdGFncyB0byBkZWZhdWx0CisgICAgaW50MzJfdCBzeW5jX3R5cGUgPSBDQU1fVFlQRV9TVEFOREFMT05FOworICAgIHNldHRpbmdzLnVwZGF0ZShRQ0FNRVJBM19EVUFMQ0FNX0xJTktfRU5BQkxFLCAmc3luY190eXBlLCAxKTsKKworICAgIGludDMyX3QgaXNfbWFpbiA9IDA7IC8vdGhpcyBkb2Vzbid0IG1hdHRlciBhcyBhcHAgc2hvdWxkIG92ZXJ3cml0ZQorICAgIHNldHRpbmdzLnVwZGF0ZShRQ0FNRVJBM19EVUFMQ0FNX0xJTktfSVNfTUFJTiwgJmlzX21haW4sIDEpOworCisgICAgc2V0dGluZ3MudXBkYXRlKFFDQU1FUkEzX0RVQUxDQU1fTElOS19SRUxBVEVEX0NBTUVSQV9JRCwgJmlzX21haW4sIDEpOworCiAgICAgLyogQ0RTIGRlZmF1bHQgKi8KICAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKICAgICBtZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKQEAgLTc5NjksNiArODc5MCwxMCBAQAogCiAgICAgaW50MzJfdCBtb2RlID0gY2RzX21vZGU7CiAgICAgc2V0dGluZ3MudXBkYXRlKFFDQU1FUkEzX0NEU19NT0RFLCAmbW9kZSwgMSk7CisKKyAgICAvKiBoeWJyaWQgYWUgKi8KKyAgICBzZXR0aW5ncy51cGRhdGUoTkVYVVNfRVhQRVJJTUVOVEFMXzIwMTZfSFlCUklEX0FFX0VOQUJMRSwgJmh5YnJpZF9hZSwgMSk7CisKICAgICBtRGVmYXVsdE1ldGFkYXRhW3R5cGVdID0gc2V0dGluZ3MucmVsZWFzZSgpOwogCiAgICAgcmV0dXJuIG1EZWZhdWx0TWV0YWRhdGFbdHlwZV07CkBAIC03OTgyLDcgKzg4MDcsNyBAQAogICoKICAqIFBBUkFNRVRFUlMgOgogICogICBAcmVxdWVzdCAgIDogcmVxdWVzdCB0aGF0IG5lZWRzIHRvIGJlIHNlcnZpY2VkCi0gKiAgIEBzdHJlYW1JRCA6IFN0cmVhbSBJRCBvZiBhbGwgdGhlIHJlcXVlc3RlZCBzdHJlYW1zCisgKiAgIEBzdHJlYW1zQXJyYXkgOiBTdHJlYW0gSUQgb2YgYWxsIHRoZSByZXF1ZXN0ZWQgc3RyZWFtcwogICogICBAYmxvYl9yZXF1ZXN0OiBXaGV0aGVyIHRoaXMgcmVxdWVzdCBpcyBhIGJsb2IgcmVxdWVzdCBvciBub3QKICAqCiAgKiBSRVRVUk4gICAgIDogc3VjY2VzczogTk9fRVJST1IKQEAgLTc5OTAsNyArODgxNSw3IEBACiAgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIGludCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpzZXRGcmFtZVBhcmFtZXRlcnMoCiAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgKnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fSURfdCBzdHJlYW1JRCwKKyAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9JRF90IHN0cmVhbXNBcnJheSwKICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2JfcmVxdWVzdCwKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc25hcHNob3RTdHJlYW1JZCkKIHsKQEAgLTgwMTIsNyArODgzNyw3IEBACiAgICAgfQogCiAgICAgLyogVXBkYXRlIHN0cmVhbSBpZCBvZiBhbGwgdGhlIHJlcXVlc3RlZCBidWZmZXJzICovCi0gICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobVBhcmFtZXRlcnMsIENBTV9JTlRGX01FVEFfU1RSRUFNX0lELCBzdHJlYW1JRCkpIHsKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtUGFyYW1ldGVycywgQ0FNX0lOVEZfTUVUQV9TVFJFQU1fSUQsIHN0cmVhbXNBcnJheSkpIHsKICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBzdHJlYW0gdHlwZSBtYXNrIGluIHRoZSBwYXJhbWV0ZXJzIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtODQ2MCw2ICs5Mjg1LDEzIEBACiAgICAgICAgICAgICAgICAgTUVUQURBVEFfTUFQX1NJWkUoQU5USUJBTkRJTkdfTU9ERVNfTUFQKSwgZndrX2FudGliYW5kaW5nTW9kZSk7CiAgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKICAgICAgICAgICAgIHVpbnQzMl90IGhhbF9hbnRpYmFuZGluZ01vZGUgPSAodWludDMyX3QpdmFsOworICAgICAgICAgICAgaWYgKGhhbF9hbnRpYmFuZGluZ01vZGUgPT0gQ0FNX0FOVElCQU5ESU5HX01PREVfQVVUTykgeworICAgICAgICAgICAgICAgIGlmIChtNjBIelpvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFsX2FudGliYW5kaW5nTW9kZSA9IENBTV9BTlRJQkFORElOR19NT0RFX0FVVE9fNjBIWjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBoYWxfYW50aWJhbmRpbmdNb2RlID0gQ0FNX0FOVElCQU5ESU5HX01PREVfQVVUT181MEhaOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfUEFSTV9BTlRJQkFORElORywKICAgICAgICAgICAgICAgICAgICAgaGFsX2FudGliYW5kaW5nTW9kZSkpIHsKICAgICAgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKQEAgLTkwNjcsNiArOTg5OSw3IEBACiAgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gPT0gMjcwKSB7CiAgICAgICAgICAgIHJvdGF0aW9uX2luZm8ucm90YXRpb24gPSBST1RBVEVfMjcwOwogICAgICAgICB9CisgICAgICAgIHJvdGF0aW9uX2luZm8uZGV2aWNlX3JvdGF0aW9uID0gUk9UQVRFXzA7CiAgICAgICAgIHJvdGF0aW9uX2luZm8uc3RyZWFtSWQgPSBzbmFwc2hvdFN0cmVhbUlkOwogICAgICAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9KUEVHX09SSUVOVEFUSU9OLCBvcmllbnRhdGlvbik7CiAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfUEFSTV9ST1RBVElPTiwgcm90YXRpb25faW5mbykpIHsKQEAgLTkxMTAsMTQgKzk5NDMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhRQ0FNRVJBM19VU0VfQVZfVElNRVIpKSB7Ci0gICAgICAgIHVpbnQ4X3QqIHVzZV9hdl90aW1lciA9Ci0gICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChRQ0FNRVJBM19VU0VfQVZfVElNRVIpLmRhdGEudTg7Ci0gICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9VU0VfQVZfVElNRVIsICp1c2VfYXZfdGltZXIpKSB7Ci0gICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8vIEVWIHN0ZXAKICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX1BBUk1fRVZfU1RFUCwKICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmV4cF9jb21wZW5zYXRpb25fc3RlcCkpIHsKQEAgLTkxMzUsNiArOTk2MCwxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gSHlicmlkIEFFCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhORVhVU19FWFBFUklNRU5UQUxfMjAxNl9IWUJSSURfQUVfRU5BQkxFKSkgeworICAgICAgICB1aW50OF90ICpoeWJyaWRfYWUgPSAodWludDhfdCAqKQorICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoTkVYVVNfRVhQRVJJTUVOVEFMXzIwMTZfSFlCUklEX0FFX0VOQUJMRSkuZGF0YS51ODsKKworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9IWUJSSURfQUUsICpoeWJyaWRfYWUpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiByYzsKIH0KIApAQCAtOTE2NCw3ICsxMDAwMCw1MiBAQAogICAgIHJldHVybjsKIH0KIAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRCdWZmZXJFcnJvclN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDYWxsYmFjayBoYW5kbGVyIGZvciBjaGFubmVscyB0byByZXBvcnQgYW55IGJ1ZmZlciBlcnJvcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNoICAgICA6IENoYW5uZWwgb24gd2hpY2ggYnVmZmVyIGVycm9yIGlzIHJlcG9ydGVkIGZyb20KKyAqICAgQGZyYW1lX251bWJlciAgOiBmcmFtZSBudW1iZXIgb24gd2hpY2ggYnVmZmVyIGVycm9yIGlzIHJlcG9ydGVkIG9uCisgKiAgIEBidWZmZXJfc3RhdHVzIDogYnVmZmVyIGVycm9yIHN0YXR1cworICogICBAdXNlcmRhdGE6IHVzZXJkYXRhCisgKgorICogUkVUVVJOICAgICA6IE5PTkUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpzZXRCdWZmZXJFcnJvclN0YXR1cyhRQ2FtZXJhM0NoYW5uZWwqIGNoLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX251bWJlciwgY2FtZXJhM19idWZmZXJfc3RhdHVzX3QgZXJyLAorICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKQoreworICAgIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0gKFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UgKil1c2VyZGF0YTsKKyAgICBpZiAoaHcgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGh3ICVwIiwgaHcpOworICAgICAgICByZXR1cm47CisgICAgfQogCisgICAgaHctPnNldEJ1ZmZlckVycm9yU3RhdHVzKGNoLCBmcmFtZV9udW1iZXIsIGVycik7CisgICAgcmV0dXJuOworfQorCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OnNldEJ1ZmZlckVycm9yU3RhdHVzKFFDYW1lcmEzQ2hhbm5lbCogY2gsCisgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IGVycikKK3sKKyAgICBMT0dEKCJjaGFubmVsOiAlcCwgZnJhbWUjICVkLCBidWYgZXJyOiAlZCIsIGNoLCBmcmFtZU51bWJlciwgZXJyKTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisKKyAgICBmb3IgKGF1dG8mIHJlcSA6IG1QZW5kaW5nQnVmZmVyc01hcC5tUGVuZGluZ0J1ZmZlcnNJblJlcXVlc3QpIHsKKyAgICAgICAgaWYgKHJlcS5mcmFtZV9udW1iZXIgIT0gZnJhbWVOdW1iZXIpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yIChhdXRvJiBrIDogcmVxLm1QZW5kaW5nQnVmZmVyTGlzdCkgeworICAgICAgICAgICAgaWYoay5zdHJlYW0tPnByaXYgPT0gY2gpIHsKKyAgICAgICAgICAgICAgICBrLmJ1ZlN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgIHJldHVybjsKK30KIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBGVU5DVElPTiAgIDogaW5pdGlhbGl6ZQogICoKQEAgLTk1MjYsNyArMTA0MDcsNyBAQAogICogUkVUVVJOICAgICA6IHRydWU6IG5lZWRlZAogICogICAgICAgICAgICAgIGZhbHNlOiBubyBuZWVkCiAgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWJvb2wgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6bmVlZFJlcHJvY2Vzcyh1aW50MzJfdCBwb3N0cHJvY2Vzc19tYXNrKQorYm9vbCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpuZWVkUmVwcm9jZXNzKGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrKQogewogICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgPiAwKSB7CiAgICAgICAgIC8vIFRPRE86IGFkZCBmb3IgWlNMIEhEUiBsYXRlcgpAQCAtOTU4Miw4ICsxMDQ2Myw4IEBACiAgICAgUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsICpwQ2hhbm5lbCA9IE5VTEw7CiAKICAgICBwQ2hhbm5lbCA9IG5ldyBRQ2FtZXJhM1JlcHJvY2Vzc0NoYW5uZWwobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKLSAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLCBtQ2FtZXJhSGFuZGxlLT5vcHMsIGNhcHR1cmVSZXN1bHRDYiwgY29uZmlnLnBhZGRpbmcsCi0gICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX05PTkUsIHRoaXMsIGlucHV0Q2hIYW5kbGUpOworICAgICAgICAgICAgbUNoYW5uZWxIYW5kbGUsIG1DYW1lcmFIYW5kbGUtPm9wcywgY2FwdHVyZVJlc3VsdENiLCBzZXRCdWZmZXJFcnJvclN0YXR1cywKKyAgICAgICAgICAgIGNvbmZpZy5wYWRkaW5nLCBDQU1fUUNPTV9GRUFUVVJFX05PTkUsIHRoaXMsIGlucHV0Q2hIYW5kbGUpOwogICAgIGlmIChOVUxMID09IHBDaGFubmVsKSB7CiAgICAgICAgIExPR0UoIm5vIG1lbSBmb3IgcmVwcm9jZXNzIGNoYW5uZWwiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xMDI0Myw0ICsxMTEyNCwxMzcgQEAKICAgICAgICAgICAgIGdldF9udW1fb3ZlcmFsbF9idWZmZXJzKCkpOwogfQogCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEJ1ZkVyclN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgYnVmZmVyIGVycm9yIHN0YXR1cworICoKKyAqIFBBUkFNRVRFUlMgOiBAYnVmZmVyOiBidWZmZXIgaGFuZGxlCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUGVuZGluZ0J1ZmZlcnNNYXA6OmdldEJ1ZkVyclN0YXR1cyhidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcikKK3sKKyAgICBmb3IgKGF1dG8mIHJlcSA6IG1QZW5kaW5nQnVmZmVyc0luUmVxdWVzdCkgeworICAgICAgICBmb3IgKGF1dG8mIGsgOiByZXEubVBlbmRpbmdCdWZmZXJMaXN0KSB7CisgICAgICAgICAgICBpZiAoay5idWZmZXIgPT0gYnVmZmVyKQorICAgICAgICAgICAgICAgIHJldHVybiBrLmJ1ZlN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFBBQUZTdXBwb3J0CisgKgorICogREVTQ1JJUFRJT046IFNldCB0aGUgcHJldmlldy1hc3Npc3RlZCBhdXRvIGZvY3VzIHN1cHBvcnQgYml0IGluCisgKiAgICAgICAgICAgICAgZmVhdHVyZSBtYXNrIGFjY29yZGluZyB0byBzdHJlYW0gdHlwZSBhbmQgZmlsdGVyCisgKiAgICAgICAgICAgICAgYXJyYW5nZW1lbnQKKyAqCisgKiBQQVJBTUVURVJTIDogQGZlYXR1cmVfbWFzazogY3VycmVudCBmZWF0dXJlIG1hc2ssIHdoaWNoIG1heSBiZSBtb2RpZmllZAorICogICAgICAgICAgICAgIEBzdHJlYW1fdHlwZTogc3RyZWFtIHR5cGUKKyAqICAgICAgICAgICAgICBAZmlsdGVyX2FycmFuZ2VtZW50OiBmaWx0ZXIgYXJyYW5nZW1lbnQKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OnNldFBBQUZTdXBwb3J0KAorICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QmIGZlYXR1cmVfbWFzaywKKyAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUsCisgICAgICAgIGNhbV9jb2xvcl9maWx0ZXJfYXJyYW5nZW1lbnRfdCBmaWx0ZXJfYXJyYW5nZW1lbnQpCit7CisgICAgc3dpdGNoIChmaWx0ZXJfYXJyYW5nZW1lbnQpIHsKKyAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfUkdHQjoKKyAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfR1JCRzoKKyAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfR0JSRzoKKyAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfQkdHUjoKKyAgICAgICAgaWYgKChzdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVykgfHwKKyAgICAgICAgICAgICAgICAoc3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX1ZJREVPKSkgeworICAgICAgICAgICAgZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfUEFBRjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfWToKKyAgICAgICAgaWYgKHN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUykgeworICAgICAgICAgICAgZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfUEFBRjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgTE9HRCgiZmVhdHVyZV9tYXNrPTB4JWxseDsgc3RyZWFtX3R5cGU9JWQsIGZpbHRlcl9hcnJhbmdlbWVudD0lZCIsCisgICAgICAgICAgICBmZWF0dXJlX21hc2ssIHN0cmVhbV90eXBlLCBmaWx0ZXJfYXJyYW5nZW1lbnQpOworCisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhZGp1c3RCbGFja0xldmVsRm9yQ0ZBCisgKgorICogREVTQ1JJUFRJT046IEFkanVzdCB0aGUgYmxhY2sgbGV2ZWwgcGF0dGVybiBpbiB0aGUgb3JkZXIgb2YgUkdHQiB0byB0aGUgb3JkZXIKKyAqICAgICAgICAgICAgICBvZiBiYXllciBDRkEgKENvbG9yIEZpbHRlciBBcnJheSkuCisgKgorICogUEFSQU1FVEVSUyA6IEBpbnB1dDogYmxhY2sgbGV2ZWwgcGF0dGVybiBpbiB0aGUgb3JkZXIgb2YgUkdHQgorICogICAgICAgICAgICAgIEBvdXRwdXQ6IGJsYWNrIGxldmVsIHBhdHRlcm4gaW4gdGhlIG9yZGVyIG9mIENGQQorICogICAgICAgICAgICAgIEBjb2xvcl9hcnJhbmdlbWVudDogQ0ZBIGNvbG9yIGFycmFuZ2VtZW50CisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6YWRqdXN0QmxhY2tMZXZlbEZvckNGQSgKKyAgICAgICAgVCBpbnB1dFtCTEFDS19MRVZFTF9QQVRURVJOX0NOVF0sCisgICAgICAgIFQgb3V0cHV0W0JMQUNLX0xFVkVMX1BBVFRFUk5fQ05UXSwKKyAgICAgICAgY2FtX2NvbG9yX2ZpbHRlcl9hcnJhbmdlbWVudF90IGNvbG9yX2FycmFuZ2VtZW50KQoreworICAgIHN3aXRjaCAoY29sb3JfYXJyYW5nZW1lbnQpIHsKKyAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfR1JCRzoKKyAgICAgICAgb3V0cHV0WzBdID0gaW5wdXRbMV07CisgICAgICAgIG91dHB1dFsxXSA9IGlucHV0WzBdOworICAgICAgICBvdXRwdXRbMl0gPSBpbnB1dFszXTsKKyAgICAgICAgb3V0cHV0WzNdID0gaW5wdXRbMl07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZJTFRFUl9BUlJBTkdFTUVOVF9HQlJHOgorICAgICAgICBvdXRwdXRbMF0gPSBpbnB1dFsyXTsKKyAgICAgICAgb3V0cHV0WzFdID0gaW5wdXRbM107CisgICAgICAgIG91dHB1dFsyXSA9IGlucHV0WzBdOworICAgICAgICBvdXRwdXRbM10gPSBpbnB1dFsxXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRklMVEVSX0FSUkFOR0VNRU5UX0JHR1I6CisgICAgICAgIG91dHB1dFswXSA9IGlucHV0WzNdOworICAgICAgICBvdXRwdXRbMV0gPSBpbnB1dFsyXTsKKyAgICAgICAgb3V0cHV0WzJdID0gaW5wdXRbMV07CisgICAgICAgIG91dHB1dFszXSA9IGlucHV0WzBdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfUkdHQjoKKyAgICAgICAgb3V0cHV0WzBdID0gaW5wdXRbMF07CisgICAgICAgIG91dHB1dFsxXSA9IGlucHV0WzFdOworICAgICAgICBvdXRwdXRbMl0gPSBpbnB1dFsyXTsKKyAgICAgICAgb3V0cHV0WzNdID0gaW5wdXRbM107CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoIkludmFsaWQgY29sb3IgYXJyYW5nZW1lbnQgdG8gZGVyaXZlIGR5bmFtaWMgYmxhY2tsZXZlbCIpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXM2MEh6Wm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBXaGV0aGVyIHRoZSBwaG9uZSBpcyBpbiB6b25lIHdpdGggNjBoeiBlbGVjdHJpY2l0eSBmcmVxdWVuY3kKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBUcnVlIGlmIGluIDYwSHogem9uZSwgRmFsc2Ugb3RoZXJ3aXNlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6aXM2MEh6Wm9uZSgpCit7CisgICAgdGltZV90IHQgPSB0aW1lKE5VTEwpOworICAgIHN0cnVjdCB0bSBsdDsKKworICAgIHN0cnVjdCB0bSogciA9IGxvY2FsdGltZV9yKCZ0LCAmbHQpOworCisgICAgaWYgKHIgPT0gTlVMTCB8fCBsdC50bV9nbXRvZmYgPD0gIC0yKjYwKjYwIHx8IGx0LnRtX2dtdG9mZiA+PSA4KjYwKjYwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKK30KIH07IC8vZW5kIG5hbWVzcGFjZSBxY2FtZXJhCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzSFdJLmggYi9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzSFdJLmgKaW5kZXggMDIzNjhiMC4uY2I1OWRhZCAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM0hXSS5oCisrKyBiL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNIV0kuaApAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgIlFDYW1lcmEzSEFMSGVhZGVyLmgiCiAjaW5jbHVkZSAiUUNhbWVyYTNNZW0uaCIKICNpbmNsdWRlICJRQ2FtZXJhUGVyZi5oIgorI2luY2x1ZGUgIlFDYW1lcmFDb21tb24uaCIKIAogZXh0ZXJuICJDIiB7CiAjaW5jbHVkZSAibW1fY2FtZXJhX2ludGVyZmFjZS5oIgpAQCAtOTYsNiArOTcsOCBAQAogICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbTsKICAgICAvLyBCdWZmZXIgaGFuZGxlCiAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXI7CisgICAgLy8gQnVmZmVyIHN0YXR1cworICAgIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IGJ1ZlN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSzsKIH0gUGVuZGluZ0J1ZmZlckluZm87CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTExNCw2ICsxMTcsNyBAQAogICAgIExpc3Q8UGVuZGluZ0J1ZmZlcnNJblJlcXVlc3Q+IG1QZW5kaW5nQnVmZmVyc0luUmVxdWVzdDsKICAgICB1aW50MzJfdCBnZXRfbnVtX292ZXJhbGxfYnVmZmVycygpOwogICAgIHZvaWQgcmVtb3ZlQnVmKGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyKTsKKyAgICBpbnQzMl90IGdldEJ1ZkVyclN0YXR1cyhidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcik7CiB9OwogCiAKQEAgLTEyMSw2ICsxMjUsOCBAQAogcHVibGljOgogICAgIC8qIHN0YXRpYyB2YXJpYWJsZSBhbmQgZnVuY3Rpb25zIGFjY2Vzc2VkIGJ5IGNhbWVyYSBzZXJ2aWNlICovCiAgICAgc3RhdGljIGNhbWVyYTNfZGV2aWNlX29wc190IG1DYW1lcmFPcHM7CisgICAgLy9JZCBvZiBlYWNoIHNlc3Npb24gaW4gYnVuZGxlL2xpbmsKKyAgICBzdGF0aWMgdWludDMyX3Qgc2Vzc2lvbklkW01NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlNdOwogICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZShjb25zdCBzdHJ1Y3QgY2FtZXJhM19kZXZpY2UgKiwKICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX2NhbGxiYWNrX29wc190ICpjYWxsYmFja19vcHMpOwogICAgIHN0YXRpYyBpbnQgY29uZmlndXJlX3N0cmVhbXMoY29uc3Qgc3RydWN0IGNhbWVyYTNfZGV2aWNlICosCkBAIC0xODgsNyArMTk0LDEyIEBACiAgICAgY2FtZXJhX21ldGFkYXRhX3QqIHRyYW5zbGF0ZUZyb21IYWxNZXRhZGF0YShtZXRhZGF0YV9idWZmZXJfdCAqbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGludDMyX3QgcmVxdWVzdF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYganBlZ01ldGFkYXRhLCB1aW50OF90IHBpcGVsaW5lX2RlcHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2FwdHVyZV9pbnRlbnQsIGJvb2wgcHByb2NEb25lLCB1aW50OF90IGZ3a19jYWNNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNhcHR1cmVfaW50ZW50LCB1aW50OF90IGh5YnJpZF9hZV9lbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV2Q2FtRGVidWcgbWV0YWRhdGEgdHJhbnNsYXRlRnJvbUhhbE1ldGFkYXRhIGF1Z21lbnQgLmggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IERldkNhbURlYnVnX21ldGFfZW5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldkNhbURlYnVnIG1ldGFkYXRhIGVuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHByb2NEb25lLCB1aW50OF90IGZ3a19jYWNNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmlyc3RNZXRhZGF0YUluQmF0Y2gpOwogICAgIGNhbWVyYV9tZXRhZGF0YV90KiBzYXZlUmVxdWVzdFNldHRpbmdzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBqcGVnTWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqcmVxdWVzdCk7CiAgICAgaW50IGluaXRQYXJhbWV0ZXJzKCk7CkBAIC0xOTYsOCArMjA3LDkgQEAKICAgICBRQ2FtZXJhM1JlcHJvY2Vzc0NoYW5uZWwgKmFkZE9mZmxpbmVSZXByb2NDaGFubmVsKGNvbnN0IHJlcHJvY2Vzc19jb25maWdfdCAmY29uZmlnLAogICAgICAgICAgICAgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCAqaW5wdXRDaEhhbmRsZSk7CiAgICAgYm9vbCBuZWVkUm90YXRpb25SZXByb2Nlc3MoKTsKLSAgICBib29sIG5lZWRSZXByb2Nlc3ModWludDMyX3QgcG9zdHByb2Nlc3NfbWFzayk7CiAgICAgYm9vbCBuZWVkSnBlZ0V4aWZSb3RhdGlvbigpOworICAgIGJvb2wgbmVlZFJlcHJvY2VzcyhjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzayk7CisgICAgYm9vbCBuZWVkSnBlZ1JvdGF0aW9uKCk7CiAgICAgY2FtX2Rlbm9pc2VfcHJvY2Vzc190eXBlX3QgZ2V0V2F2ZWxldERlbm9pc2VQcm9jZXNzUGxhdGUoKTsKICAgICBjYW1fZGVub2lzZV9wcm9jZXNzX3R5cGVfdCBnZXRUZW1wb3JhbERlbm9pc2VQcm9jZXNzUGxhdGUoKTsKIApAQCAtMjE2LDYgKzIyOCwxMSBAQAogICAgIGNvbnN0IGNoYXIgKmdldEVlcHJvbVZlcnNpb25JbmZvKCk7CiAgICAgY29uc3QgdWludDMyX3QgKmdldExkYWZDYWxpYigpOwogICAgIHZvaWQgZ2V0M0FWZXJzaW9uKGNhbV9xM2FfdmVyc2lvbl90ICZzd1ZlcnNpb24pOworICAgIHN0YXRpYyB2b2lkIHNldEJ1ZmZlckVycm9yU3RhdHVzKFFDYW1lcmEzQ2hhbm5lbCosIHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgY2FtZXJhM19idWZmZXJfc3RhdHVzX3QgZXJyLCB2b2lkICp1c2VyZGF0YSk7CisgICAgdm9pZCBzZXRCdWZmZXJFcnJvclN0YXR1cyhRQ2FtZXJhM0NoYW5uZWwqLCB1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgIGNhbWVyYTNfYnVmZmVyX3N0YXR1c190IGVycik7CisgICAgYm9vbCBpczYwSHpab25lKCk7CiAKICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgZndrVHlwZSwgdHlwZW5hbWUgaGFsVHlwZT4gc3RydWN0IFFDYW1lcmFNYXAgewogICAgICAgICBmd2tUeXBlIGZ3a19uYW1lOwpAQCAtMjI3LDcgKzI0NCw2IEBACiAgICAgICAgIGNhbV9jZHNfbW9kZV90eXBlX3QgdmFsOwogICAgIH0gUUNhbWVyYVByb3BNYXA7CiAKLQogcHJpdmF0ZToKIAogICAgIC8vIFN0YXRlIHRyYW5zaXRpb24gY29uZGl0aW9uczoKQEAgLTI3OCw3ICsyOTQsOCBAQAogICAgIGludDMyX3QgaGFuZGxlUGVuZGluZ1JlcHJvY1Jlc3VsdHModWludDMyX3QgZnJhbWVfbnVtYmVyKTsKICAgICBpbnQ2NF90IGdldE1pbkZyYW1lRHVyYXRpb24oY29uc3QgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqcmVxdWVzdCk7CiAgICAgdm9pZCBoYW5kbGVNZXRhZGF0YVdpdGhMb2NrKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqbWV0YWRhdGFfYnVmLAotICAgICAgICAgICAgYm9vbCBmcmVlX2FuZF9idWZkb25lX21ldGFfYnVmKTsKKyAgICAgICAgICAgIGJvb2wgZnJlZV9hbmRfYnVmZG9uZV9tZXRhX2J1ZiwKKyAgICAgICAgICAgIGJvb2wgZmlyc3RNZXRhZGF0YUluQmF0Y2gpOwogICAgIHZvaWQgaGFuZGxlQmF0Y2hNZXRhZGF0YShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKm1ldGFkYXRhX2J1ZiwKICAgICAgICAgICAgIGJvb2wgZnJlZV9hbmRfYnVmZG9uZV9tZXRhX2J1Zik7CiAgICAgdm9pZCBoYW5kbGVCdWZmZXJXaXRoTG9jayhjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqYnVmZmVyLApAQCAtMzA3LDYgKzMyNCw3IEBACiAKICAgICB2b2lkIGFkZFRvUFBGZWF0dXJlTWFzayhpbnQgc3RyZWFtX2Zvcm1hdCwgdWludDMyX3Qgc3RyZWFtX2lkeCk7CiAgICAgdm9pZCB1cGRhdGVGcHNJblByZXZpZXdCdWZmZXIobWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhLCB1aW50MzJfdCBmcmFtZV9udW1iZXIpOworICAgIHZvaWQgdXBkYXRlVGltZVN0YW1wSW5QZW5kaW5nQnVmZmVycyh1aW50MzJfdCBmcmFtZU51bWJlciwgbnNlY3NfdCB0aW1lc3RhbXApOwogCiAgICAgdm9pZCBlbmFibGVQb3dlckhpbnQoKTsKICAgICB2b2lkIGRpc2FibGVQb3dlckhpbnQoKTsKQEAgLTMxNCw2ICszMzIsOCBAQAogICAgIGludDMyX3Qgc3RhcnRBbGxDaGFubmVscygpOwogICAgIGludDMyX3Qgc3RvcEFsbENoYW5uZWxzKCk7CiAgICAgaW50MzJfdCBub3RpZnlFcnJvckZvclBlbmRpbmdSZXF1ZXN0cygpOworICAgIHZvaWQgbm90aWZ5RXJyb3IodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBjYW1lcmEzX2Vycm9yX21zZ19jb2RlX3QgZXJyb3JDb2RlKTsKICAgICBpbnQzMl90IGdldFJlcHJvY2Vzc2libGVPdXRwdXRTdHJlYW1JZCh1aW50MzJfdCAmaWQpOwogICAgIGludDMyX3QgaGFuZGxlQ2FtZXJhRGV2aWNlRXJyb3IoKTsKIApAQCAtMzI0LDYgKzM0NCwxNSBAQAogICAgIHN0YXRpYyBib29sIHN1cHBvcnRCdXJzdENhcHR1cmUodWludDMyX3QgY2FtZXJhSWQpOwogICAgIGludDMyX3Qgc2V0QnVuZGxlSW5mbygpOwogCisgICAgc3RhdGljIHZvaWQgc2V0UEFBRlN1cHBvcnQoY2FtX2ZlYXR1cmVfbWFza190JiBmZWF0dXJlX21hc2ssCisgICAgICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwKKyAgICAgICAgICAgIGNhbV9jb2xvcl9maWx0ZXJfYXJyYW5nZW1lbnRfdCBmaWx0ZXJfYXJyYW5nZW1lbnQpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIHZvaWQgYWRqdXN0QmxhY2tMZXZlbEZvckNGQShUIGlucHV0W0JMQUNLX0xFVkVMX1BBVFRFUk5fQ05UXSwKKyAgICAgICAgICAgIFQgb3V0cHV0W0JMQUNLX0xFVkVMX1BBVFRFUk5fQ05UXSwKKyAgICAgICAgICAgIGNhbV9jb2xvcl9maWx0ZXJfYXJyYW5nZW1lbnRfdCBjb2xvcl9hcnJhbmdlbWVudCk7CisKICAgICBjYW1lcmEzX2RldmljZV90ICAgbUNhbWVyYURldmljZTsKICAgICB1aW50MzJfdCAgICAgICAgICAgbUNhbWVyYUlkOwogICAgIG1tX2NhbWVyYV92dGJsX3QgICptQ2FtZXJhSGFuZGxlOwpAQCAtMzM5LDYgKzM2OCw3IEBACiAgICAgUUNhbWVyYTNSYXdEdW1wQ2hhbm5lbCAqbVJhd0R1bXBDaGFubmVsOwogICAgIFFDYW1lcmEzUmVndWxhckNoYW5uZWwgKm1EdW1teUJhdGNoQ2hhbm5lbDsKICAgICBRQ2FtZXJhUGVyZkxvY2sgbV9wZXJmTG9jazsKKyAgICBRQ2FtZXJhQ29tbW9uICAgbUNvbW1vbjsKIAogICAgIHVpbnQzMl90IG1DaGFubmVsSGFuZGxlOwogCkBAIC0zNzAsNiArNDAwLDcgQEAKICAgICBpbnQ4X3QgIG1TdXBwb3J0ZWRGYWNlRGV0ZWN0TW9kZTsKICAgICB1aW50OF90IG1fYlRuclByZXZpZXc7CiAgICAgdWludDhfdCBtX2JUbnJWaWRlbzsKKyAgICB1aW50OF90IG1fZGVidWdfYXZ0aW1lcjsKIAogICAgIC8qIERhdGEgc3RydWN0dXJlIHRvIHN0b3JlIHBlbmRpbmcgcmVxdWVzdCAqLwogICAgIHR5cGVkZWYgc3RydWN0IHsKQEAgLTM5NSw2ICs0MjYsMTAgQEAKICAgICAgICAgdWludDhfdCBjYXB0dXJlX2ludGVudDsKICAgICAgICAgdWludDhfdCBmd2tDYWNNb2RlOwogICAgICAgICBib29sIHNodXR0ZXJfbm90aWZpZWQ7CisgICAgICAgIHVpbnQ4X3QgaHlicmlkX2FlX2VuYWJsZTsKKyAgICAgICAgLyogRGV2Q2FtRGVidWcgbWV0YWRhdGEgUGVuZGluZ1JlcXVlc3RJbmZvICovCisgICAgICAgIHVpbnQ4X3QgRGV2Q2FtRGVidWdfbWV0YV9lbmFibGU7CisgICAgICAgIC8qIERldkNhbURlYnVnIG1ldGFkYXRhIGVuZCAqLwogICAgIH0gUGVuZGluZ1JlcXVlc3RJbmZvOwogICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOwpAQCAtNDE5LDYgKzQ1NCw3IEBACiAgICAgLyogVXNlIGxhc3QgZnJhbWUgbnVtYmVyIG9mIHRoZSBiYXRjaCBhcyBrZXkgYW5kIGZpcnN0IGZyYW1lIG51bWJlciBvZiB0aGUKICAgICAgKiBiYXRjaCBhcyB2YWx1ZSBmb3IgdGhhdCBrZXkgKi8KICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgdWludDMyX3Q+IG1QZW5kaW5nQmF0Y2hNYXA7CisgICAgY2FtX3N0cmVhbV9JRF90IG1CYXRjaGVkU3RyZWFtc0FycmF5OwogCiAgICAgUGVuZGluZ0J1ZmZlcnNNYXAgbVBlbmRpbmdCdWZmZXJzTWFwOwogICAgIHB0aHJlYWRfY29uZF90IG1SZXF1ZXN0Q29uZDsKQEAgLTQ0NSw2ICs0ODEsMTEgQEAKIAogICAgIHVpbnQ4X3QgbUNhcHR1cmVJbnRlbnQ7CiAgICAgdWludDhfdCBtQ2FjTW9kZTsKKyAgICB1aW50OF90IG1IeWJyaWRBZUVuYWJsZTsKKyAgICAvLyBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSBpbnRlcm5hbCB2YXJpYWJsZQorICAgIHVpbnQ4X3QgbURldkNhbURlYnVnTWV0YUVuYWJsZTsKKyAgICAvKiBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSBlbmQgKi8KKwogICAgIG1ldGFkYXRhX2J1ZmZlcl90IG1SZXByb2NNZXRhOyAvL3NjcmF0Y2ggbWV0YSBidWZmZXIKICAgICAvKiAwOiBOb3QgYmF0Y2gsIG5vbi16ZXJvOiBOdW1iZXIgb2YgaW1hZ2UgYnVmZmVycyBpbiBhIGJhdGNoICovCiAgICAgdWludDhfdCBtQmF0Y2hTaXplOwpAQCAtNDUyLDEwICs0OTMsMTQgQEAKICAgICB1aW50OF90IG1Ub0JlUXVldWVkVmlkQnVmczsKICAgICAvLyBGaXhlZCB2aWRlbyBmcHMKICAgICBmbG9hdCBtSEZSVmlkZW9GcHM7CitwdWJsaWM6CiAgICAgdWludDhfdCBtT3BNb2RlOworcHJpdmF0ZToKICAgICB1aW50MzJfdCBtRmlyc3RGcmFtZU51bWJlckluQmF0Y2g7CiAgICAgY2FtZXJhM19zdHJlYW1fdCBtRHVtbXlCYXRjaFN0cmVhbTsKICAgICBib29sIG1OZWVkU2Vuc29yUmVzdGFydDsKKyAgICB1aW50MzJfdCBtTWluSW5GbGlnaHRSZXF1ZXN0czsKKyAgICB1aW50MzJfdCBtTWF4SW5GbGlnaHRSZXF1ZXN0czsKIAogICAgIC8qIHNlbnNvciBvdXRwdXQgc2l6ZSB3aXRoIGN1cnJlbnQgc3RyZWFtIGNvbmZpZ3VyYXRpb24gKi8KICAgICBRQ2FtZXJhM0Nyb3BSZWdpb25NYXBwZXIgbUNyb3BSZWdpb25NYXBwZXI7CkBAIC00NjUsNiArNTEwLDcgQEAKICAgICB1aW50MzJfdCBtTGRhZkNhbGliWzJdOwogICAgIGJvb2wgbVBvd2VySGludEVuYWJsZWQ7CiAgICAgaW50MzJfdCBtTGFzdEN1c3RJbnRlbnRGcm1OdW07CisgICAgQ2FtZXJhTWV0YWRhdGEgIG1DYWNoZWRNZXRhZGF0YTsKIAogICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfY29udHJvbF9lZmZlY3RfbW9kZV90LAogICAgICAgICAgICAgY2FtX2VmZmVjdF9tb2RlX3R5cGU+IEVGRkVDVF9NT0RFU19NQVBbXTsKQEAgLTUwNCw2ICs1NTAsMTUgQEAKICAgICB1aW50MzJfdCBtU3VyZmFjZVN0cmlkZVBhZGRpbmc7CiAKICAgICBTdGF0ZSBtU3RhdGU7CisgICAgLy9EdWFsIGNhbWVyYSByZWxhdGVkIHBhcmFtcworICAgIGJvb2wgbUlzRGV2aWNlTGlua2VkOworICAgIGJvb2wgbUlzTWFpbkNhbWVyYTsKKyAgICB1aW50OF90IG1MaW5rZWRDYW1lcmFJZDsKKyAgICBRQ2FtZXJhM0hlYXBNZW1vcnkgKm1fcFJlbENhbVN5bmNIZWFwOworICAgIGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QgKm1fcFJlbENhbVN5bmNCdWY7CisgICAgY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCBtX3JlbENhbVN5bmNJbmZvOworICAgIGJvb2wgbTYwSHpab25lOworCiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQpkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM01lbS5jcHAgYi9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzTWVtLmNwcAppbmRleCBlYmNjM2JhLi42ZjBiZDhiIDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzTWVtLmNwcAorKysgYi9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzTWVtLmNwcApAQCAtNjgsMTEgKzY4LDExIEBACiAgICAgbUJ1ZmZlckNvdW50ID0gMDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUzsgaSsrKSB7CiAgICAgICAgIG1NZW1JbmZvW2ldLmZkID0gLTE7Ci0gICAgICAgIG1NZW1JbmZvW2ldLm1haW5faW9uX2ZkID0gLTE7CiAgICAgICAgIG1NZW1JbmZvW2ldLmhhbmRsZSA9IDA7CiAgICAgICAgIG1NZW1JbmZvW2ldLnNpemUgPSAwOwogICAgICAgICBtQ3VycmVudEZyYW1lTnVtYmVyc1tpXSA9IC0xOwogICAgIH0KKyAgICBtYWluX2lvbl9mZCA9IG9wZW4oIi9kZXYvaW9uIiwgT19SRE9OTFkpOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtODYsNiArODYsNyBAQAogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiBRQ2FtZXJhM01lbW9yeTo6flFDYW1lcmEzTWVtb3J5KCkKIHsKKyAgICBjbG9zZShtYWluX2lvbl9mZCk7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xMzMsOCArMTM0LDggQEAKICAgICBMT0dEKCJhZGRyID0gJXAsIGZkID0gJWQsIGhhbmRsZSA9ICVseCBsZW5ndGggPSAlZCwgSU9OIEZkID0gJWQiLAogICAgICAgICAgIGNhY2hlX2ludl9kYXRhLnZhZGRyLCBjYWNoZV9pbnZfZGF0YS5mZCwKICAgICAgICAgICh1bnNpZ25lZCBsb25nKWNhY2hlX2ludl9kYXRhLmhhbmRsZSwgY2FjaGVfaW52X2RhdGEubGVuZ3RoLAotICAgICAgICAgbU1lbUluZm9baW5kZXhdLm1haW5faW9uX2ZkKTsKLSAgICByZXQgPSBpb2N0bChtTWVtSW5mb1tpbmRleF0ubWFpbl9pb25fZmQsIElPTl9JT0NfQ1VTVE9NLCAmY3VzdG9tX2RhdGEpOworICAgICAgICAgbWFpbl9pb25fZmQpOworICAgIHJldCA9IGlvY3RsKG1haW5faW9uX2ZkLCBJT05fSU9DX0NVU1RPTSwgJmN1c3RvbV9kYXRhKTsKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgTE9HRSgiQ2FjaGUgSW52YWxpZGF0ZSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwogCkBAIC0zMDYsOSArMzA3LDcgQEAKICAgICBzdHJ1Y3QgaW9uX2hhbmRsZV9kYXRhIGhhbmRsZV9kYXRhOwogICAgIHN0cnVjdCBpb25fYWxsb2NhdGlvbl9kYXRhIGFsbG9jRGF0YTsKICAgICBzdHJ1Y3QgaW9uX2ZkX2RhdGEgaW9uX2luZm9fZmQ7Ci0gICAgaW50IG1haW5faW9uX2ZkID0gLTE7CiAKLSAgICBtYWluX2lvbl9mZCA9IG9wZW4oIi9kZXYvaW9uIiwgT19SRE9OTFkpOwogICAgIGlmIChtYWluX2lvbl9mZCA8IDApIHsKICAgICAgICAgTE9HRSgiSW9uIGRldiBvcGVuIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIGdvdG8gSU9OX09QRU5fRkFJTEVEOwpAQCAtMzM2LDcgKzMzNSw2IEBACiAgICAgICAgIGdvdG8gSU9OX01BUF9GQUlMRUQ7CiAgICAgfQogCi0gICAgbWVtSW5mby5tYWluX2lvbl9mZCA9IG1haW5faW9uX2ZkOwogICAgIG1lbUluZm8uZmQgPSBpb25faW5mb19mZC5mZDsKICAgICBtZW1JbmZvLmhhbmRsZSA9IGlvbl9pbmZvX2ZkLmhhbmRsZTsKICAgICBtZW1JbmZvLnNpemUgPSBhbGxvY0RhdGEubGVuOwpAQCAtMzQ3LDcgKzM0NSw2IEBACiAgICAgaGFuZGxlX2RhdGEuaGFuZGxlID0gaW9uX2luZm9fZmQuaGFuZGxlOwogICAgIGlvY3RsKG1haW5faW9uX2ZkLCBJT05fSU9DX0ZSRUUsICZoYW5kbGVfZGF0YSk7CiBJT05fQUxMT0NfRkFJTEVEOgotICAgIGNsb3NlKG1haW5faW9uX2ZkKTsKIElPTl9PUEVOX0ZBSUxFRDoKICAgICByZXR1cm4gTk9fTUVNT1JZOwogfQpAQCAtMzcxLDEyICszNjgsMTAgQEAKICAgICAgICAgbWVtSW5mby5mZCA9IC0xOwogICAgIH0KIAotICAgIGlmIChtZW1JbmZvLm1haW5faW9uX2ZkID49IDApIHsKKyAgICBpZiAobWFpbl9pb25fZmQgPj0gMCkgewogICAgICAgICBtZW1zZXQoJmhhbmRsZV9kYXRhLCAwLCBzaXplb2YoaGFuZGxlX2RhdGEpKTsKICAgICAgICAgaGFuZGxlX2RhdGEuaGFuZGxlID0gbWVtSW5mby5oYW5kbGU7Ci0gICAgICAgIGlvY3RsKG1lbUluZm8ubWFpbl9pb25fZmQsIElPTl9JT0NfRlJFRSwgJmhhbmRsZV9kYXRhKTsKLSAgICAgICAgY2xvc2UobWVtSW5mby5tYWluX2lvbl9mZCk7Ci0gICAgICAgIG1lbUluZm8ubWFpbl9pb25fZmQgPSAtMTsKKyAgICAgICAgaW9jdGwobWFpbl9pb25fZmQsIElPTl9JT0NfRlJFRSwgJmhhbmRsZV9kYXRhKTsKICAgICB9CiAgICAgbWVtSW5mby5oYW5kbGUgPSAwOwogICAgIG1lbUluZm8uc2l6ZSA9IDA7CkBAIC00MzcsNiArNDMyLDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZVTkNUSU9OICAgOiBnZXRGcmFtZU51bWJlcgogICoKQEAgLTQ2OSw2ICs0NjUsNDQgQEAKICAgICByZXR1cm4gbUN1cnJlbnRGcmFtZU51bWJlcnNbaW5kZXhdOwogfQogCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0T2xkZXN0RnJhbWVOdW1iZXIKKyAqCisgKiBERVNDUklQVElPTjogV2UgdXNlIHRoaXMgdG8gZmV0Y2ggdGhlIG9sZGVzdCBmcmFtZSBudW1iZXIgZXhwZWN0ZWQgcGVyIEZJRk8KKyAqCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IGZyYW1lTnVtYmVyCisgKiAgICAgICAgICAgICAgbmVnYXRpdmUgZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzSGVhcE1lbW9yeTo6Z2V0T2xkZXN0RnJhbWVOdW1iZXIodWludDMyX3QgJmJ1ZkluZGV4KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGludDMyX3Qgb2xkZXN0ID0gSU5UX01BWDsKKyAgICBib29sIGVtcHR5ID0gdHJ1ZTsKKworICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOworICAgICAgICAgICAgaW5kZXggPCBtQnVmZmVyQ291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKG1NZW1JbmZvW2luZGV4XS5oYW5kbGUpIHsKKyAgICAgICAgICAgIGlmICgoZW1wdHkpIHx8ICghZW1wdHkgJiYgb2xkZXN0ID4gbUN1cnJlbnRGcmFtZU51bWJlcnNbaW5kZXhdCisgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRGcmFtZU51bWJlcnNbaW5kZXhdICE9IC0xKSkgeworICAgICAgICAgICAgICAgIG9sZGVzdCA9IG1DdXJyZW50RnJhbWVOdW1iZXJzW2luZGV4XTsKKyAgICAgICAgICAgICAgICBidWZJbmRleCA9IGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW1wdHkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZW1wdHkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBvbGRlc3Q7Cit9CisKKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZVTkNUSU9OICAgOiBnZXRCdWZmZXJJbmRleAogICoKQEAgLTc3NSwxNyArODA5LDE1IEBACiAKICAgICBzZXRNZXRhRGF0YShtUHJpdmF0ZUhhbmRsZVtpZHhdLCBVUERBVEVfQ09MT1JfU1BBQ0UsICZjb2xvclNwYWNlKTsKIAotICAgIG1NZW1JbmZvW2lkeF0ubWFpbl9pb25fZmQgPSBvcGVuKCIvZGV2L2lvbiIsIE9fUkRPTkxZKTsKLSAgICBpZiAobU1lbUluZm9baWR4XS5tYWluX2lvbl9mZCA8IDApIHsKKyAgICBpZiAobWFpbl9pb25fZmQgPCAwKSB7CiAgICAgICAgIExPR0UoImZhaWxlZDogY291bGQgbm90IG9wZW4gaW9uIGRldmljZSIpOwogICAgICAgICByZXQgPSBOT19NRU1PUlk7CiAgICAgICAgIGdvdG8gZW5kOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlvbl9pbmZvX2ZkLmZkID0gbVByaXZhdGVIYW5kbGVbaWR4XS0+ZmQ7Ci0gICAgICAgIGlmIChpb2N0bChtTWVtSW5mb1tpZHhdLm1haW5faW9uX2ZkLAorICAgICAgICBpZiAoaW9jdGwobWFpbl9pb25fZmQsCiAgICAgICAgICAgICAgICAgICBJT05fSU9DX0lNUE9SVCwgJmlvbl9pbmZvX2ZkKSA8IDApIHsKICAgICAgICAgICAgIExPR0UoIklPTiBpbXBvcnQgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIGNsb3NlKG1NZW1JbmZvW2lkeF0ubWFpbl9pb25fZmQpOwogICAgICAgICAgICAgcmV0ID0gTk9fTUVNT1JZOwogICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgIH0KQEAgLTgzOCwxMiArODcwLDEwIEBACiAgICAgc3RydWN0IGlvbl9oYW5kbGVfZGF0YSBpb25faGFuZGxlOwogICAgIG1lbXNldCgmaW9uX2hhbmRsZSwgMCwgc2l6ZW9mKGlvbl9oYW5kbGUpKTsKICAgICBpb25faGFuZGxlLmhhbmRsZSA9IG1NZW1JbmZvW2lkeF0uaGFuZGxlOwotICAgIGlmIChpb2N0bChtTWVtSW5mb1tpZHhdLm1haW5faW9uX2ZkLCBJT05fSU9DX0ZSRUUsICZpb25faGFuZGxlKSA8IDApIHsKKyAgICBpZiAoaW9jdGwobWFpbl9pb25fZmQsIElPTl9JT0NfRlJFRSwgJmlvbl9oYW5kbGUpIDwgMCkgewogICAgICAgICBMT0dFKCJpb24gZnJlZSBmYWlsZWQiKTsKICAgICB9Ci0gICAgY2xvc2UobU1lbUluZm9baWR4XS5tYWluX2lvbl9mZCk7CiAgICAgbWVtc2V0KCZtTWVtSW5mb1tpZHhdLCAwLCBzaXplb2Yoc3RydWN0IFFDYW1lcmEzTWVtSW5mbykpOwotICAgIG1NZW1JbmZvW2lkeF0ubWFpbl9pb25fZmQgPSAtMTsKICAgICBtQnVmZmVySGFuZGxlW2lkeF0gPSBOVUxMOwogICAgIG1Qcml2YXRlSGFuZGxlW2lkeF0gPSBOVUxMOwogICAgIG1DdXJyZW50RnJhbWVOdW1iZXJzW2lkeF0gPSAtMTsKQEAgLTEwMDIsNiArMTAzMiw0MSBAQAogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldE9sZGVzdEZyYW1lTnVtYmVyCisgKgorICogREVTQ1JJUFRJT046IFdlIHVzZSB0aGlzIHRvIGZldGNoIHRoZSBvbGRlc3QgZnJhbWUgbnVtYmVyIGV4cGVjdGVkIHBlciBGSUZPCisgKgorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCBmcmFtZU51bWJlcgorICogICAgICAgICAgICAgIG5lZ2F0aXZlIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM0dyYWxsb2NNZW1vcnk6OmdldE9sZGVzdEZyYW1lTnVtYmVyKHVpbnQzMl90ICZidWZJbmRleCkKK3sKKyAgICBpbnQzMl90IG9sZGVzdCA9IElOVF9NQVg7CisgICAgYm9vbCBlbXB0eSA9IHRydWU7CisgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IG1TdGFydElkeDsKKyAgICAgICAgICAgIGluZGV4IDwgTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTOyBpbmRleCsrKSB7CisgICAgICAgIGlmIChtTWVtSW5mb1tpbmRleF0uaGFuZGxlKSB7CisgICAgICAgICAgICBpZiAoKGVtcHR5KSB8fAorICAgICAgICAgICAgICAgICghZW1wdHkgJiYgb2xkZXN0ID4gbUN1cnJlbnRGcmFtZU51bWJlcnNbaW5kZXhdCisgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRGcmFtZU51bWJlcnNbaW5kZXhdICE9IC0xKSkgeworICAgICAgICAgICAgICAgIG9sZGVzdCA9IG1DdXJyZW50RnJhbWVOdW1iZXJzW2luZGV4XTsKKyAgICAgICAgICAgICAgICBidWZJbmRleCA9IGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW1wdHkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZW1wdHkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBvbGRlc3Q7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZVTkNUSU9OICAgOiBnZXRCdWZmZXJJbmRleAogICoKICAqIERFU0NSSVBUSU9OOiBXZSB1c2UgdGhpcyB0byBmZXRjaCB0aGUgYnVmZmVyIGluZGV4IGZvciB0aGUgcmVxdWVzdCB3aXRoCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzTWVtLmggYi9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzTWVtLmgKaW5kZXggYzk5MDc5ZC4uNDQ5NTU3NyAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM01lbS5oCisrKyBiL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNNZW0uaApAQCAtNzIsNiArNzIsNyBAQAogICAgIHZpcnR1YWwgaW50MzJfdCBtYXJrRnJhbWVOdW1iZXIodWludDMyX3QgaW5kZXgsIHVpbnQzMl90IGZyYW1lTnVtYmVyKSA9IDA7CiAgICAgdmlydHVhbCBpbnQzMl90IGdldEZyYW1lTnVtYmVyKHVpbnQzMl90IGluZGV4KSA9IDA7CiAgICAgdmlydHVhbCBpbnQzMl90IGdldEJ1ZmZlckluZGV4KHVpbnQzMl90IGZyYW1lTnVtYmVyKSA9IDA7CisgICAgdmlydHVhbCBpbnQzMl90IGdldE9sZGVzdEZyYW1lTnVtYmVyKHVpbnQzMl90ICZpbmRleCkgPSAwOwogCiAgICAgUUNhbWVyYTNNZW1vcnkoKTsKICAgICB2aXJ0dWFsIH5RQ2FtZXJhM01lbW9yeSgpOwpAQCAtODIsNyArODMsNiBAQAogcHJvdGVjdGVkOgogICAgIHN0cnVjdCBRQ2FtZXJhM01lbUluZm8gewogICAgICAgICBpbnQgZmQ7Ci0gICAgICAgIGludCBtYWluX2lvbl9mZDsKICAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgaGFuZGxlOwogICAgICAgICBzaXplX3Qgc2l6ZTsKICAgICB9OwpAQCAtOTUsNiArOTUsNyBAQAogICAgIHZvaWQgKm1QdHJbTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTXTsKICAgICBpbnQzMl90IG1DdXJyZW50RnJhbWVOdW1iZXJzW01NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FU107CiAgICAgTXV0ZXggbUxvY2s7CisgICAgaW50IG1haW5faW9uX2ZkID0gLTE7CiB9OwogCiAvLyBJbnRlcm5hbCBoZWFwIG1lbW9yeSBpcyB1c2VkIGZvciBtZW1vcmllcyB1c2VkIGludGVybmFsbHkKQEAgLTExNiw2ICsxMTcsNyBAQAogICAgIHZpcnR1YWwgaW50MzJfdCBtYXJrRnJhbWVOdW1iZXIodWludDMyX3QgaW5kZXgsIHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0RnJhbWVOdW1iZXIodWludDMyX3QgaW5kZXgpOwogICAgIHZpcnR1YWwgaW50MzJfdCBnZXRCdWZmZXJJbmRleCh1aW50MzJfdCBmcmFtZU51bWJlcik7CisgICAgdmlydHVhbCBpbnQzMl90IGdldE9sZGVzdEZyYW1lTnVtYmVyKHVpbnQzMl90ICZpbmRleCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIHZvaWQgKmdldFB0ckxvY2tlZCh1aW50MzJfdCBpbmRleCk7CkBAIC0xNDIsNiArMTQ0LDcgQEAKICAgICB2aXJ0dWFsIGludDMyX3QgbWFya0ZyYW1lTnVtYmVyKHVpbnQzMl90IGluZGV4LCB1aW50MzJfdCBmcmFtZU51bWJlcik7CiAgICAgdmlydHVhbCBpbnQzMl90IGdldEZyYW1lTnVtYmVyKHVpbnQzMl90IGluZGV4KTsKICAgICB2aXJ0dWFsIGludDMyX3QgZ2V0QnVmZmVySW5kZXgodWludDMyX3QgZnJhbWVOdW1iZXIpOworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRPbGRlc3RGcmFtZU51bWJlcih1aW50MzJfdCAmaW5kZXgpOwogCiAgICAgdm9pZCAqZ2V0QnVmZmVySGFuZGxlKHVpbnQzMl90IGluZGV4KTsKIHByb3RlY3RlZDoKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNQb3N0UHJvYy5jcHAgYi9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzUG9zdFByb2MuY3BwCmluZGV4IDgyZTUxM2UuLjU4MTA4MWYgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNQb3N0UHJvYy5jcHAKKysrIGIvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1Bvc3RQcm9jLmNwcApAQCAtMTExLDE4ICsxMTEsMTUgQEAKICAqCiAgKiBQQVJBTUVURVJTIDoKICAqICAgQG1lbW9yeSAgICAgICAgICAgICAgOiBvdXRwdXQgYnVmZmVyIG1lbW9yeQotICogICBAcG9zdHByb2Nlc3NfbWFzayAgICA6IHBvc3Rwcm9jZXNzIG1hc2sgZm9yIHRoZSBidWZmZXIKICAqCiAgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cwogICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCiAgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQzMl90IFFDYW1lcmEzUG9zdFByb2Nlc3Nvcjo6aW5pdChRQ2FtZXJhM1N0cmVhbU1lbSAqbWVtb3J5LAotICAgICAgICB1aW50MzJfdCBwb3N0cHJvY2Vzc19tYXNrKQoraW50MzJfdCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OmluaXQoUUNhbWVyYTNTdHJlYW1NZW0gKm1lbW9yeSkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIG1PdXRwdXRNZW0gPSBtZW1vcnk7Ci0gICAgbVBvc3RQcm9jTWFzayA9IHBvc3Rwcm9jZXNzX21hc2s7CiAgICAgbV9kYXRhUHJvY1RoLmxhdW5jaChkYXRhUHJvY2Vzc1JvdXRpbmUsIHRoaXMpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNjA0LDcgKzYwMSw3IEBACiBpbnQzMl90IFFDYW1lcmEzUG9zdFByb2Nlc3Nvcjo6cHJvY2Vzc0RhdGEocWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICpmcmFtZSkKIHsKICAgICBpZiAoZnJhbWUtPnJlcHJvY19jb25maWcucmVwcm9jZXNzX3R5cGUgIT0gUkVQUk9DRVNTX1RZUEVfTk9ORSkgewotICAgICAgICBBVFJBQ0VfSU5UKCJDYW1lcmE6UmVwcm9jZXNzIiwgMSk7CisgICAgICAgIEtQSV9BVFJBQ0VfSU5UKCJDYW1lcmE6UmVwcm9jZXNzIiwgMSk7CiAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbVJlcHJvY0pvYkxvY2spOwogICAgICAgICAvLyBlbnF1ZXUgdG8gcG9zdCBwcm9jIGlucHV0IHF1ZXVlCiAgICAgICAgIG1faW5wdXRGV0tQUFEuZW5xdWV1ZSgodm9pZCAqKWZyYW1lKTsKQEAgLTcwOSw3ICs3MDYsNyBAQAogaW50MzJfdCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OnByb2Nlc3NQUERhdGEobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSkKIHsKICAgICBxY2FtZXJhX2hhbDNfcHBfZGF0YV90ICpqb2IgPSAocWNhbWVyYV9oYWwzX3BwX2RhdGFfdCAqKW1fb25nb2luZ1BQUS5kZXF1ZXVlKCk7Ci0gICAgQVRSQUNFX0lOVCgiQ2FtZXJhOlJlcHJvY2VzcyIsIDApOworICAgIEtQSV9BVFJBQ0VfSU5UKCJDYW1lcmE6UmVwcm9jZXNzIiwgMCk7CiAgICAgaWYgKGpvYiA9PSBOVUxMIHx8ICgoTlVMTCA9PSBqb2ItPnNyY19mcmFtZSkgJiYgKE5VTEwgPT0gam9iLT5md2tfc3JjX2ZyYW1lKSkpIHsKICAgICAgICAgTE9HRSgiQ2Fubm90IGZpbmQgcmVwcm9jZXNzIGpvYiIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMTYzMSw2ICsxNjI4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5hc2RfZGVidWdfcGFyYW1zX3ZhbGlkOwogICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPmlzX3N0YXRzZGVidWdfc3RhdHNfcGFyYW1zX3ZhbGlkID0KICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPnN0YXRzX2RlYnVnX3BhcmFtc192YWxpZDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19zdGF0c2RlYnVnX2Jlc3RhdHNfcGFyYW1zX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmJlc3RhdHNfZGVidWdfcGFyYW1zX3ZhbGlkOworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPmlzX3N0YXRzZGVidWdfYmhpc3RfcGFyYW1zX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmJoaXN0X2RlYnVnX3BhcmFtc192YWxpZDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19zdGF0c2RlYnVnXzNhX3R1bmluZ19wYXJhbXNfdmFsaWQgPQorICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+cTNhX3R1bmluZ19kZWJ1Z19wYXJhbXNfdmFsaWQ7CiAKICAgICAgICAgICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YWVfZGVidWdfcGFyYW1zX3ZhbGlkKSB7CiAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPnN0YXRzZGVidWdfYWVfZGF0YSA9CkBAIC0xNjUyLDYgKzE2NTUsMTggQEAKICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+c3RhdHNkZWJ1Z19zdGF0c19idWZmZXJfZGF0YSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+c3RhdHNfZGVidWdfcGFyYW1zOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iZXN0YXRzX2RlYnVnX3BhcmFtc192YWxpZCkgeworICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5zdGF0c2RlYnVnX2Jlc3RhdHNfYnVmZmVyX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmJlc3RhdHNfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iaGlzdF9kZWJ1Z19wYXJhbXNfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+c3RhdHNkZWJ1Z19iaGlzdF9kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iaGlzdF9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPnEzYV90dW5pbmdfZGVidWdfcGFyYW1zX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPnN0YXRzZGVidWdfM2FfdHVuaW5nX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPnEzYV90dW5pbmdfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICBMT0dXKCJNZXRhZGF0YSBpcyBudWxsIik7CkBAIC0xODE4LDcgKzE4MzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGludG8gb25nb2luZyBQUCBqb2IgUQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfam9iLT5md2tfc3JjX2ZyYW1lID0gZndrX2ZyYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tX29uZ29pbmdQUFEuZW5xdWV1ZSgodm9pZCAqKXBwX2pvYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBwbWUtPm1fcFJlcHJvY0NoYW5uZWwtPmRvUmVwcm9jZXNzT2ZmbGluZShmd2tfZnJhbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcG1lLT5tX3BSZXByb2NDaGFubmVsLT5kb1JlcHJvY2Vzc09mZmxpbmUoZndrX2ZyYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBvbmdvaW5nIFBQIGpvYiBRCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tX29uZ29pbmdQUFEuZGVxdWV1ZShmYWxzZSk7CmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzUG9zdFByb2MuaCBiL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNQb3N0UHJvYy5oCmluZGV4IDkxMTRiNDkuLjlmY2Q0OTcgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNQb3N0UHJvYy5oCisrKyBiL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNQb3N0UHJvYy5oCkBAIC0xMTEsOCArMTExLDcgQEAKICAgICBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IoUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCAqY2hfY3RybCk7CiAgICAgdmlydHVhbCB+UUNhbWVyYTNQb3N0UHJvY2Vzc29yKCk7CiAKLSAgICBpbnQzMl90IGluaXQoUUNhbWVyYTNTdHJlYW1NZW0gKm1NZW1vcnksCi0gICAgICAgICAgICB1aW50MzJfdCBwb3N0cHJvY2Vzc19tYXNrKTsKKyAgICBpbnQzMl90IGluaXQoUUNhbWVyYTNTdHJlYW1NZW0gKm1NZW1vcnkpOwogICAgIGludDMyX3QgaW5pdEpwZWcoanBlZ19lbmNvZGVfY2FsbGJhY2tfdCBqcGVnX2NiLAogICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90ICptX21heF9waWNfZGltLAogICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKQEAgLTE2Nyw3ICsxNjYsNiBAQAogICAgIG1tX2pwZWdfb3BzX3QgICAgICAgICAgICAgIG1KcGVnSGFuZGxlOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1KcGVnQ2xpZW50SGFuZGxlOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1KcGVnU2Vzc2lvbklkOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1Qb3N0UHJvY01hc2s7CiAKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBtX2JUaHVtYm5haWxOZWVkZWQ7CiAgICAgUUNhbWVyYTNTdHJlYW1NZW0gICAgICAgICAgKm1PdXRwdXRNZW07CmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzU3RyZWFtLmNwcCBiL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNTdHJlYW0uY3BwCmluZGV4IGY3ZWQ0MTcuLjkyNzRkN2UgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNTdHJlYW0uY3BwCisrKyBiL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNTdHJlYW0uY3BwCkBAIC0yNDYsNiArMjQ2LDcgQEAKICAgICAgICAgbURhdGFDQihOVUxMKSwKICAgICAgICAgbVVzZXJEYXRhKE5VTEwpLAogICAgICAgICBtRGF0YVEocmVsZWFzZUZyYW1lRGF0YSwgdGhpcyksCisgICAgICAgIG1UaW1lb3V0RnJhbWVRKE5VTEwsIHRoaXMpLAogICAgICAgICBtU3RyZWFtSW5mb0J1ZihOVUxMKSwKICAgICAgICAgbVN0cmVhbUJ1ZnMoTlVMTCksCiAgICAgICAgIG1CdWZEZWZzKE5VTEwpLApAQCAtMzI0LDcgKzMyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3JvdGF0aW9uX3Qgc3RyZWFtUm90YXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9yZXByb2NfY29uZmlnX3QqIHJlcHJvY2Vzc19jb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtaW5OdW1CdWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBvc3Rwcm9jZXNzX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IHBvc3Rwcm9jZXNzX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2lzX3R5cGVfdCBpc190eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJhdGNoU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWwzX3N0cmVhbV9jYl9yb3V0aW5lIHN0cmVhbV9jYiwKQEAgLTM2NiwxNCArMzY3LDE1IEBACiAgICAgbVN0cmVhbUluZm8tPnBwX2NvbmZpZy5mZWF0dXJlX21hc2sgPSBwb3N0cHJvY2Vzc19tYXNrOwogICAgIG1TdHJlYW1JbmZvLT5pc190eXBlID0gaXNfdHlwZTsKICAgICBtU3RyZWFtSW5mby0+cHBfY29uZmlnLnJvdGF0aW9uID0gc3RyZWFtUm90YXRpb247Ci0gICAgTE9HRCgic3RyZWFtX3R5cGUgaXMgJWQsIGZlYXR1cmVfbWFzayBpcyAlZCIsCisgICAgTE9HRCgic3RyZWFtX3R5cGUgaXMgJWQsIGZlYXR1cmVfbWFzayBpcyAlTGQiLAogICAgICAgICAgICBtU3RyZWFtSW5mby0+c3RyZWFtX3R5cGUsIG1TdHJlYW1JbmZvLT5wcF9jb25maWcuZmVhdHVyZV9tYXNrKTsKIAogICAgIGJ1ZlNpemUgPSBtU3RyZWFtSW5mb0J1Zi0+Z2V0U2l6ZSgwKTsKICAgICBpZiAoQkFEX0lOREVYICE9IGJ1ZlNpemUpIHsKICAgICAgICAgcmMgPSBtQ2FtT3BzLT5tYXBfc3RyZWFtX2J1ZihtQ2FtSGFuZGxlLAogICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLCBtSGFuZGxlLCBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fSU5GTywKLSAgICAgICAgICAgICAgICAwLCAtMSwgbVN0cmVhbUluZm9CdWYtPmdldEZkKDApLCAoc2l6ZV90KWJ1ZlNpemUpOworICAgICAgICAgICAgICAgIDAsIC0xLCBtU3RyZWFtSW5mb0J1Zi0+Z2V0RmQoMCksIChzaXplX3QpYnVmU2l6ZSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtSW5mb0J1Zi0+Z2V0UHRyKDApKTsKICAgICAgICAgaWYgKHJjIDwgMCkgewogICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIG1hcCBzdHJlYW0gaW5mbyBidWZmZXIiKTsKICAgICAgICAgICAgIGdvdG8gZXJyMzsKQEAgLTQ2NSw2ICs0NjcsNyBAQAogICAgIGludDMyX3QgcmMgPSAwOwogCiAgICAgbURhdGFRLmluaXQoKTsKKyAgICBtVGltZW91dEZyYW1lUS5pbml0KCk7CiAgICAgaWYgKG1CYXRjaFNpemUpCiAgICAgICAgIG1GcmVlQmF0Y2hCdWZRLmluaXQoKTsKICAgICByYyA9IG1Qcm9jVGgubGF1bmNoKGRhdGFQcm9jUm91dGluZSwgdGhpcyk7CkBAIC00OTAsNiArNDkzLDM1IEBACiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdGltZW91dEZyYW1lCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIHRvIGlzc3VlIHRpbWVvdXQgb24gZnJhbWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJ1ZklkeCAgOiBidWZmZXIgaW5kZXggb2YgdGhlIGZyYW1lIHRvIGJlIHRpbWVkIG91dAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW06OnRpbWVvdXRGcmFtZShpbnQzMl90IGJ1ZklkeCkKK3sKKyAgICBMT0dEKCJFXG4iKTsKKyAgICBpbnQzMl90IHJjOworICAgIGlmIChtVGltZW91dEZyYW1lUS5lbnF1ZXVlKCh2b2lkICopYnVmSWR4KSkgeworICAgICAgICByYyA9IG1Qcm9jVGguc2VuZENtZChDQU1FUkFfQ01EX1RZUEVfVElNRU9VVCwgRkFMU0UsIEZBTFNFKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJTdHJlYW0gdGhyZWFkIGlzIG5vdCBhY3RpdmUsIG5vIG9wcyBoZXJlIik7CisgICAgICAgIHJjID0gTk9fRVJST1I7CisgICAgfQorICAgIExPR0QoIlhcbiIpOworICAgIHJldHVybiByYzsKK30KKworCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZVTkNUSU9OICAgOiBwcm9jZXNzRGF0YU5vdGlmeQogICoKICAqIERFU0NSSVBUSU9OOiBwcm9jZXNzIHN0cmVhbSBkYXRhIG5vdGlmeQpAQCAtNTg3LDYgKzYxOSwxMiBAQAogICAgICAgICAvLyB3ZSBnb3Qgbm90aWZpZWQgYWJvdXQgbmV3IGNtZCBhdmFpbCBpbiBjbWQgcXVldWUKICAgICAgICAgY2FtZXJhX2NtZF90eXBlX3QgY21kID0gY21kVGhyZWFkLT5nZXRDbWQoKTsKICAgICAgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1RZUEVfVElNRU9VVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGJ1ZklkeCA9IChpbnQzMl90KShwbWUtPm1UaW1lb3V0RnJhbWVRLmRlcXVldWUoKSk7CisgICAgICAgICAgICAgICAgcG1lLT5jYW5jZWxCdWZmZXIoYnVmSWR4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1RZUEVfRE9fTkVYVF9KT0I6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgTE9HRCgiRG8gbmV4dCBqb2IiKTsKQEAgLTYwOSw2ICs2NDcsNyBAQAogICAgICAgICAgICAgTE9HSCgiRXhpdCIpOwogICAgICAgICAgICAgLyogZmx1c2ggZGF0YSBidWYgcXVldWUgKi8KICAgICAgICAgICAgIHBtZS0+bURhdGFRLmZsdXNoKCk7CisgICAgICAgICAgICBwbWUtPm1UaW1lb3V0RnJhbWVRLmZsdXNoKCk7CiAgICAgICAgICAgICBwbWUtPmZsdXNoRnJlZUJhdGNoQnVmUSgpOwogICAgICAgICAgICAgcnVubmluZyA9IDA7CiAgICAgICAgICAgICBicmVhazsKQEAgLTY1OCw3ICs2OTcsOCBAQAogICAgICAgICBpZiAoQkFEX0lOREVYICE9IGJ1ZlNpemUpIHsKICAgICAgICAgICAgIExPR0QoIk1hcCBzdHJlYW1CdWZJZHg6ICVkIiwgaW5kZXgpOwogICAgICAgICAgICAgcmMgPSBtTWVtT3BzLT5tYXBfb3BzKGluZGV4LCAtMSwgbVN0cmVhbUJ1ZnMtPmdldEZkKGluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgKHNpemVfdClidWZTaXplLCBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGLCBtTWVtT3BzLT51c2VyZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIChzaXplX3QpYnVmU2l6ZSwgbVN0cmVhbUJ1ZnMtPmdldFB0cihpbmRleCksCisgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsIG1NZW1PcHMtPnVzZXJkYXRhKTsKICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gbWFwIGNhbWVyYSBidWZmZXIgJWQiLCBpbmRleCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOwpAQCAtNjg5LDYgKzcyOSw0NiBAQAogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhbmNlbEJ1ZmZlcgorICoKKyAqIERFU0NSSVBUSU9OOiBJc3N1ZSBjYW5jZWwgYnVmZmVyIHJlcXVlc3QgdG8ga2VybmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgYnVmZmVyIHRvIGJlIGNhbmNlbGxlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW06OmNhbmNlbEJ1ZmZlcih1aW50MzJfdCBpbmRleCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgaWYgKChpbmRleCA+PSBtTnVtQnVmcykgfHwgKG1CdWZEZWZzID09IE5VTEwpKSB7CisgICAgICAgIExPR0UoImluZGV4OyAlZCwgbU51bUJ1ZnM6ICVkIiwgaW5kZXgsIG1OdW1CdWZzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisgICAgaWYgKG1TdHJlYW1CdWZzID09IE5VTEwpCisgICAgeworICAgICAgICBMT0dFKCJwdXRCdWZzIGFscmVhZHkgY2FsbGVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvKiBpZiAoVU5MSUtFTFkobUJhdGNoU2l6ZSkpIHsKKyAgICAgICAgRklYTUUKKyAgICB9IGVsc2UgKi97CisgICAgICAgIEFMT0dFKCJDYWxsaW5nIGNhbmNlbCBidWYgb24gaWR4OiVkIGZvciBzdHJlYW0gdHlwZTolZCIsaW5kZXgsIGdldE15VHlwZSgpKTsKKyAgICAgICAgcmMgPSBtQ2FtT3BzLT5jYW5jZWxfYnVmZmVyKG1DYW1IYW5kbGUsIG1DaGFubmVsSGFuZGxlLCBtSGFuZGxlLCBpbmRleCk7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBGVU5DVElPTiAgIDogYnVmUmVsZWFzZQogICoKICAqIERFU0NSSVBUSU9OOiByZWxlYXNlIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVmZmVyCkBAIC03ODEsNyArODYxLDggQEAKICAgICAgICAgICAgIHNzaXplX3QgYnVmU2l6ZSA9IG1TdHJlYW1CdWZzLT5nZXRTaXplKGkpOwogICAgICAgICAgICAgaWYgKEJBRF9JTkRFWCAhPSBidWZTaXplKSB7CiAgICAgICAgICAgICAgICAgcmMgPSBvcHNfdGJsLT5tYXBfb3BzKGksIC0xLCBtU3RyZWFtQnVmcy0+Z2V0RmQoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KWJ1ZlNpemUsIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KWJ1ZlNpemUsIG1TdHJlYW1CdWZzLT5nZXRQdHIoaSksCisgICAgICAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGLAogICAgICAgICAgICAgICAgICAgICAgICAgb3BzX3RibC0+dXNlcmRhdGEpOwogICAgICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgTE9HRSgibWFwX3N0cmVhbV9idWYgZmFpbGVkOiAlZCIsIHJjKTsKQEAgLTEwNDUsNiArMTEyNiw3IEBACiAgKiAgIEBidWZfaWR4ICA6IGluZGV4IG9mIGJ1ZmZlcgogICogICBAcGxhbmVfaWR4OiBwbGFuZSBpbmRleAogICogICBAZmQgICAgICAgOiBmZCBvZiB0aGUgYnVmZmVyCisgKiAgIEBidWZmZXIgOiBidWZmZXIgcHRyCiAgKiAgIEBzaXplICAgICA6IGxlbmdodCBvZiB0aGUgYnVmZmVyCiAgKgogICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKQEAgLTEwNTIsMTIgKzExMzQsMTIgQEAKICAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCiAgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIGludDMyX3QgUUNhbWVyYTNTdHJlYW06Om1hcEJ1Zih1aW50OF90IGJ1Zl90eXBlLCB1aW50MzJfdCBidWZfaWR4LAotICAgICAgICBpbnQzMl90IHBsYW5lX2lkeCwgaW50IGZkLCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgaW50MzJfdCBwbGFuZV9pZHgsIGludCBmZCwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKIHsKICAgICByZXR1cm4gbUNhbU9wcy0+bWFwX3N0cmVhbV9idWYobUNhbUhhbmRsZSwgbUNoYW5uZWxIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsIGJ1Zl90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfaWR4LCBwbGFuZV9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIHNpemUsIGJ1ZmZlcik7CiAKIH0KIApAQCAtMTE5Nyw3ICsxMjc5LDggQEAKICAgICAgICAgICAgIC8vRm9yIFVTRVJfQlVGLCBzaXplID0gbnVtYmVyX29mX2NvbnRhaW5lciBidWZzIGluc3RlYWQgb2YgdGhlIHRvdGFsCiAgICAgICAgICAgICAvL2J1ZiBzaXplCiAgICAgICAgICAgICByYyA9IG9wc190YmwtPm1hcF9vcHMoaSwgLTEsIG1TdHJlYW1CYXRjaEJ1ZnMtPmdldEZkKGkpLAotICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KW1OdW1CYXRjaEJ1ZnMsIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9VU0VSX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgKHNpemVfdCltTnVtQmF0Y2hCdWZzLCBtU3RyZWFtQmF0Y2hCdWZzLT5nZXRQdHIoaSksCisgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9VU0VSX0JVRiwKICAgICAgICAgICAgICAgICAgICAgb3BzX3RibC0+dXNlcmRhdGEpOwogICAgICAgICAgICAgaWYgKHJjIDwgMCkgewogICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBtYXAgc3RyZWFtIGNvbnRhaW5lciBidWZmZXI6ICVkIiwKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNTdHJlYW0uaCBiL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNTdHJlYW0uaAppbmRleCAxMDFlM2YzLi5lOTlkYzg5IDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzU3RyZWFtLmgKKysrIGIvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1N0cmVhbS5oCkBAIC02NywxMiArNjcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcm90YXRpb25fdCBzdHJlYW1Sb3RhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX3JlcHJvY19jb25maWdfdCogcmVwcm9jZXNzX2NvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1pblN0cmVhbUJ1Zk51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9pc190eXBlX3QgaXNfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiYXRjaFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsM19zdHJlYW1fY2Jfcm91dGluZSBzdHJlYW1fY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOwogICAgIHZpcnR1YWwgaW50MzJfdCBidWZEb25lKHVpbnQzMl90IGluZGV4KTsKKyAgICB2aXJ0dWFsIGludDMyX3QgY2FuY2VsQnVmZmVyKHVpbnQzMl90IGluZGV4KTsKICAgICB2aXJ0dWFsIGludDMyX3QgYnVmUmVsZWFzZShpbnQzMl90IGluZGV4KTsKICAgICB2aXJ0dWFsIGludDMyX3QgcHJvY2Vzc0RhdGFOb3RpZnkobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpidWZzKTsKICAgICB2aXJ0dWFsIGludDMyX3Qgc3RhcnQoKTsKQEAgLTkwLDEyICs5MSwxMyBAQAogICAgIHVpbnQzMl90IGdldE15U2VydmVySUQoKTsKIAogICAgIGludDMyX3QgbWFwQnVmKHVpbnQ4X3QgYnVmX3R5cGUsIHVpbnQzMl90IGJ1Zl9pZHgsCi0gICAgICAgICAgICBpbnQzMl90IHBsYW5lX2lkeCwgaW50IGZkLCBzaXplX3Qgc2l6ZSk7CisgICAgICAgICAgICBpbnQzMl90IHBsYW5lX2lkeCwgaW50IGZkLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKICAgICBpbnQzMl90IHVubWFwQnVmKHVpbnQ4X3QgYnVmX3R5cGUsIHVpbnQzMl90IGJ1Zl9pZHgsIGludDMyX3QgcGxhbmVfaWR4KTsKICAgICBpbnQzMl90IHNldFBhcmFtZXRlcihjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgJnBhcmFtKTsKICAgICBjYW1fc3RyZWFtX2luZm9fdCogZ2V0U3RyZWFtSW5mbygpIGNvbnN0IHtyZXR1cm4gbVN0cmVhbUluZm87IH07CiAKICAgICBzdGF0aWMgdm9pZCByZWxlYXNlRnJhbWVEYXRhKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSk7CisgICAgaW50MzJfdCB0aW1lb3V0RnJhbWUoaW50MzJfdCBidWZJZHgpOwogCiBwcml2YXRlOgogICAgIHVpbnQzMl90IG1DYW1IYW5kbGU7CkBAIC0xMTAsNiArMTEyLDcgQEAKICAgICB2b2lkICptVXNlckRhdGE7CiAKICAgICBRQ2FtZXJhUXVldWUgICAgIG1EYXRhUTsKKyAgICBRQ2FtZXJhUXVldWUgICAgIG1UaW1lb3V0RnJhbWVROwogICAgIFFDYW1lcmFDbWRUaHJlYWQgbVByb2NUaDsgLy8gdGhyZWFkIGZvciBkYXRhQ0IKIAogICAgIFFDYW1lcmEzSGVhcE1lbW9yeSAqbVN0cmVhbUluZm9CdWY7CmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzU3RyZWFtTWVtLmNwcCBiL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNTdHJlYW1NZW0uY3BwCmluZGV4IDM4NDNhZmIuLmFhMjM4OGUgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNTdHJlYW1NZW0uY3BwCisrKyBiL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNTdHJlYW1NZW0uY3BwCkBAIC00MTQsNiArNDE0LDQ3IEBACiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0T2xkZXN0RnJhbWVOdW1iZXIKKyAqCisgKiBERVNDUklQVElPTjogV2UgdXNlIHRoaXMgdG8gZmV0Y2ggdGhlIGZyYW1lTnVtYmVyIGV4cGVjdGVkIGFzIHBlciBGSUZPCisgKgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGluZGV4IG9mIHRoZSBidWZmZXIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCBmcmFtZU51bWJlcgorICogICAgICAgICAgICAgIHBvc2l0aXZlL3plcm8gIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBuZWdhdGl2ZSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW1NZW06OmdldE9sZGVzdEZyYW1lTnVtYmVyKHVpbnQzMl90ICZidWZJZHgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGludDMyX3Qgb2xkZXN0ID0gSU5UX01BWDsKKyAgICBib29sIGVtcHR5ID0gdHJ1ZTsKKyAgICBpZiAobUhlYXBNZW0uZ2V0Q250KCkpeworICAgICAgICBlbXB0eSA9IGZhbHNlOworICAgICAgICBvbGRlc3QgPSBtSGVhcE1lbS5nZXRPbGRlc3RGcmFtZU51bWJlcihidWZJZHgpOworICAgIH0KKworICAgIGlmIChtR3JhbGxvY01lbS5nZXRDbnQoKSkgeworICAgICAgICB1aW50MzJfdCBncmFsbG9jQnVmSWR4OworICAgICAgICBpbnQzMl90IG9sZGVzdEdyYWxsb2NGcmFtZU51bWJlciA9IG1HcmFsbG9jTWVtLmdldE9sZGVzdEZyYW1lTnVtYmVyKGdyYWxsb2NCdWZJZHgpOworCisgICAgICAgIGlmIChlbXB0eSB8fCAoIWVtcHR5ICYmIChvbGRlc3RHcmFsbG9jRnJhbWVOdW1iZXIgPCBvbGRlc3QpKSl7CisgICAgICAgICAgICBvbGRlc3QgPSBvbGRlc3RHcmFsbG9jRnJhbWVOdW1iZXI7CisgICAgICAgICAgICBidWZJZHggPSBncmFsbG9jQnVmSWR4OworICAgICAgICB9CisgICAgICAgIGVtcHR5ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGVtcHR5ICkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG9sZGVzdDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogRlVOQ1RJT04gICA6IGdldEZyYW1lTnVtYmVyCiAgKgogICogREVTQ1JJUFRJT046IFdlIHVzZSB0aGlzIHRvIGZldGNoIHRoZSBmcmFtZU51bWJlciBmb3IgdGhlIHJlcXVlc3Qgd2l0aCB3aGljaApAQCAtNDc0LDQgKzUxNSwzMCBAQAogICAgIHJldHVybiBpbmRleDsKIH0KIAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEJ1ZmZlckluZGV4CisgKgorICogREVTQ1JJUFRJT046IFdlIHVzZSB0aGlzIHRvIGZldGNoIHRoZSBidWZmZXIgaW5kZXggYmFzZWQgb24gZnJhbWVOdW1iZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZyYW1lTnVtYmVyIDogZnJhbWUgTnVtYmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgYnVmZmVyIGluZGV4CisgKiAgICAgICAgICAgICAgcG9zaXRpdmUvemVybyAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5lZ2F0aXZlIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1N0cmVhbU1lbTo6Z2V0QnVmZmVySW5kZXgodWludDMyX3QgZnJhbWVOdW1iZXIpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGludDMyX3QgaW5kZXggPSBtR3JhbGxvY01lbS5nZXRCdWZmZXJJbmRleChmcmFtZU51bWJlcik7CisKKyAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICByZXR1cm4gbUhlYXBNZW0uZ2V0QnVmZmVySW5kZXgoZnJhbWVOdW1iZXIpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGluZGV4OworfQorCisKKwogfTsgLy9uYW1lc3BhY2UgcWNhbWVyYQpkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1N0cmVhbU1lbS5oIGIvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1N0cmVhbU1lbS5oCmluZGV4IDc0YmFiMDYuLjkwOTViZGIgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNTdHJlYW1NZW0uaAorKysgYi9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzU3RyZWFtTWVtLmgKQEAgLTgxLDggKzgxLDEwIEBACiAgICAgLy8gRnJhbWUgbnVtYmVyIGdldHRlciBhbmQgc2V0dGVyCiAgICAgaW50MzJfdCBtYXJrRnJhbWVOdW1iZXIodWludDMyX3QgaW5kZXgsIHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKICAgICBpbnQzMl90IGdldEZyYW1lTnVtYmVyKHVpbnQzMl90IGluZGV4KTsKKyAgICBpbnQzMl90IGdldE9sZGVzdEZyYW1lTnVtYmVyKHVpbnQzMl90ICZpbmRleCk7CiAgICAgaW50MzJfdCBnZXRHcmFsbG9jQnVmZmVySW5kZXgodWludDMyX3QgZnJhbWVOdW1iZXIpOwogICAgIGludDMyX3QgZ2V0SGVhcEJ1ZmZlckluZGV4KHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKKyAgICBpbnQzMl90IGdldEJ1ZmZlckluZGV4KHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKIAogcHJpdmF0ZToKICAgICAvL3ZhcmlhYmxlcwpkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1ZlbmRvclRhZ3MuY3BwIGIvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1ZlbmRvclRhZ3MuY3BwCmluZGV4IGU3YjQ4NDMuLmNiZGY3ZjggMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNWZW5kb3JUYWdzLmNwcAorKysgYi9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzVmVuZG9yVGFncy5jcHAKQEAgLTUxLDYgKzUxLDkgQEAKICAgICAgICAgUUNBTUVSQTNfVEVNUE9SQUxfREVOT0lTRV9FTkQsCiAgICAgICAgIFFDQU1FUkEzX0FWX1RJTUVSX0VORCwKICAgICAgICAgUUNBTUVSQTNfU0VOU09SX01FVEFfREFUQV9FTkQsCisgICAgICAgIE5FWFVTX0VYUEVSSU1FTlRBTF8yMDE2X0VORCwKKyAgICAgICAgUUNBTUVSQTNfRFVBTENBTV9MSU5LX01FVEFfREFUQV9FTkQsCisgICAgICAgIFFDQU1FUkEzX0RVQUxDQU1fQ0FMSUJfTUVUQV9EQVRBX0VORAogfSA7CiAKIHR5cGVkZWYgc3RydWN0IHZlbmRvcl90YWdfaW5mbyB7CkBAIC02OCw2ICs3MSw5IEBACiAgICAgIm9yZy5jb2RlYXVyb3JhLnFjYW1lcmEzLnRlbXBvcmFsX2Rlbm9pc2UiLAogICAgICJvcmcuY29kZWF1cm9yYS5xY2FtZXJhMy5hdl90aW1lciIsCiAgICAgIm9yZy5jb2RlYXVyb3JhLnFjYW1lcmEzLnNlbnNvcl9tZXRhX2RhdGEiLAorICAgICJjb20uZ29vZ2xlLm5leHVzLmV4cGVyaW1lbnRhbDIwMTYiLAorICAgICJvcmcuY29kZWF1cm9yYS5xY2FtZXJhMy5kdWFsY2FtX2xpbmtfbWV0YV9kYXRhIiwKKyAgICAib3JnLmNvZGVhdXJvcmEucWNhbWVyYTMuZHVhbGNhbV9jYWxpYl9tZXRhX2RhdGEiCiB9OwogCiB2ZW5kb3JfdGFnX2luZm9fdCBxY2FtZXJhM19wcml2YXRlZGF0YVtRQ0FNRVJBM19QUklWQVRFREFUQV9FTkQgLSBRQ0FNRVJBM19QUklWQVRFREFUQV9TVEFSVF0gPSB7CkBAIC0xMDksNyArMTE1LDczIEBACiAKIHZlbmRvcl90YWdfaW5mbyBxY2FtZXJhM19zZW5zb3JfbWV0YV9kYXRhW1FDQU1FUkEzX1NFTlNPUl9NRVRBX0RBVEFfRU5EIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ0FNRVJBM19TRU5TT1JfTUVUQV9EQVRBX1NUQVJUXSA9IHsKLSAgIHsiZHluYW1pY19ibGFja19sZXZlbF9wYXR0ZXJuIiwgVFlQRV9GTE9BVCB9CisgICB7ImR5bmFtaWNfYmxhY2tfbGV2ZWxfcGF0dGVybiIsIFRZUEVfRkxPQVQgfSwKKyAgIHsiaXNfbW9ub19vbmx5IiwgICAgICAgICAgICAgICAgVFlQRV9CWVRFIH0KK307CisKK3ZlbmRvcl90YWdfaW5mb190IG5leHVzX2V4cGVyaW1lbnRhbF8yMDE2W05FWFVTX0VYUEVSSU1FTlRBTF8yMDE2X0VORCAtCisgICAgICAgIE5FWFVTX0VYUEVSSU1FTlRBTF8yMDE2X1NUQVJUXSA9IHsKKyAgIHsiM2EuaHlicmlkX2FlX2VuYWJsZSIsICAgICAgICAgICAgICAgICAgICAgVFlQRV9CWVRFICB9LAorICAgeyJjb250cm9sLmFmX3NjZW5lX2NoYW5nZSIsICAgICAgICAgICAgICAgICBUWVBFX0JZVEUgIH0sCisgICAvLyBEZXZDYW1EZWJ1ZyB2ZW5kb3IgdGFnCisgICB7ICJkZXZjYW1kZWJ1Z19tZXRhX2VuYWJsZSIsICAgICAgICAgICAgICAgIFRZUEVfQllURSAgfSwKKyAgIC8vIERldkNhbURlYnVnIHZlbmRvciB0YWcgQUYKKyAgIHsgImRldmNhbWRlYnVnX2FmX2xlbnNfcG9zaXRpb24iLCAgICAgICAgICAgVFlQRV9JTlQzMiB9LAorICAgeyAiZGV2Y2FtZGVidWdfYWZfdG9mX2NvbmZpZGVuY2UiLCAgICAgICAgICBUWVBFX0lOVDMyIH0sCisgICB7ICJkZXZjYW1kZWJ1Z19hZl90b2ZfZGlzdGFuY2UiLCAgICAgICAgICAgIFRZUEVfSU5UMzIgfSwKKyAgIHsgImRldmNhbWRlYnVnX2FmX2x1bWEiLCAgICAgICAgICAgICAgICAgICAgVFlQRV9JTlQzMiB9LAorICAgeyAiZGV2Y2FtZGVidWdfYWZfaGFmX3N0YXRlIiwgICAgICAgICAgICAgICBUWVBFX0lOVDMyIH0sCisgICB7ICJkZXZjYW1kZWJ1Z19hZl9tb25pdG9yX3BkYWZfdGFyZ2V0X3BvcyIsIFRZUEVfSU5UMzIgfSwKKyAgIHsgImRldmNhbWRlYnVnX2FmX21vbml0b3JfcGRhZl9jb25maWRlbmNlIiwgVFlQRV9JTlQzMiB9LAorICAgeyAiZGV2Y2FtZGVidWdfYWZfbW9uaXRvcl9wZGFmX3JlZm9jdXMiLCAgICBUWVBFX0lOVDMyIH0sCisgICB7ICJkZXZjYW1kZWJ1Z19hZl9tb25pdG9yX3RvZl90YXJnZXRfcG9zIiwgIFRZUEVfSU5UMzIgfSwKKyAgIHsgImRldmNhbWRlYnVnX2FmX21vbml0b3JfdG9mX2NvbmZpZGVuY2UiLCAgVFlQRV9JTlQzMiB9LAorICAgeyAiZGV2Y2FtZGVidWdfYWZfbW9uaXRvcl90b2ZfcmVmb2N1cyIsICAgICBUWVBFX0lOVDMyIH0sCisgICB7ICJkZXZjYW1kZWJ1Z19hZl9tb25pdG9yX3R5cGVfc2VsZWN0IiwgICAgIFRZUEVfSU5UMzIgfSwKKyAgIHsgImRldmNhbWRlYnVnX2FmX21vbml0b3JfcmVmb2N1cyIsICAgICAgICAgVFlQRV9JTlQzMiB9LAorICAgeyAiZGV2Y2FtZGVidWdfYWZfbW9uaXRvcl90YXJnZXRfcG9zIiwgICAgICBUWVBFX0lOVDMyIH0sCisgICB7ICJkZXZjYW1kZWJ1Z19hZl9zZWFyY2hfcGRhZl90YXJnZXRfcG9zIiwgIFRZUEVfSU5UMzIgfSwKKyAgIHsgImRldmNhbWRlYnVnX2FmX3NlYXJjaF9wZGFmX25leHRfcG9zIiwgICAgVFlQRV9JTlQzMiB9LAorICAgeyAiZGV2Y2FtZGVidWdfYWZfc2VhcmNoX3BkYWZfbmVhcl9wb3MiLCAgICBUWVBFX0lOVDMyIH0sCisgICB7ICJkZXZjYW1kZWJ1Z19hZl9zZWFyY2hfcGRhZl9mYXJfcG9zIiwgICAgIFRZUEVfSU5UMzIgfSwKKyAgIHsgImRldmNhbWRlYnVnX2FmX3NlYXJjaF9wZGFmX2NvbmZpZGVuY2UiLCAgVFlQRV9JTlQzMiB9LAorICAgeyAiZGV2Y2FtZGVidWdfYWZfc2VhcmNoX3RvZl90YXJnZXRfcG9zIiwgICBUWVBFX0lOVDMyIH0sCisgICB7ICJkZXZjYW1kZWJ1Z19hZl9zZWFyY2hfdG9mX25leHRfcG9zIiwgICAgIFRZUEVfSU5UMzIgfSwKKyAgIHsgImRldmNhbWRlYnVnX2FmX3NlYXJjaF90b2ZfbmVhcl9wb3MiLCAgICAgVFlQRV9JTlQzMiB9LAorICAgeyAiZGV2Y2FtZGVidWdfYWZfc2VhcmNoX3RvZl9mYXJfcG9zIiwgICAgICBUWVBFX0lOVDMyIH0sCisgICB7ICJkZXZjYW1kZWJ1Z19hZl9zZWFyY2hfdG9mX2NvbmZpZGVuY2UiLCAgIFRZUEVfSU5UMzIgfSwKKyAgIHsgImRldmNhbWRlYnVnX2FmX3NlYXJjaF90eXBlX3NlbGVjdCIsICAgICAgVFlQRV9JTlQzMiB9LAorICAgeyAiZGV2Y2FtZGVidWdfYWZfc2VhcmNoX25leHRfcG9zIiwgICAgICAgICBUWVBFX0lOVDMyIH0sCisgICB7ICJkZXZjYW1kZWJ1Z19hZl9zZWFyY2hfdGFyZ2V0X3BvcyIsICAgICAgIFRZUEVfSU5UMzIgfSwKKyAgIC8vIERldkNhbURlYnVnIHZlbmRvciB0YWcgQUVDCisgICB7ICJkZXZjYW1kZWJ1Z19hZWNfdGFyZ2V0X2x1bWEiLCAgICAgICAgICAgIFRZUEVfSU5UMzIgfSwKKyAgIHsgImRldmNhbWRlYnVnX2FlY19jb21wX2x1bWEiLCAgICAgICAgICAgICAgVFlQRV9JTlQzMiB9LAorICAgeyAiZGV2Y2FtZGVidWdfYWVjX2F2Z19sdW1hIiwgICAgICAgICAgICAgICBUWVBFX0lOVDMyIH0sCisgICB7ICJkZXZjYW1kZWJ1Z19hZWNfY3VyX2x1bWEiLCAgICAgICAgICAgICAgIFRZUEVfSU5UMzIgfSwKKyAgIHsgImRldmNhbWRlYnVnX2FlY19saW5lY291bnQiLCAgICAgICAgICAgICAgVFlQRV9JTlQzMiB9LAorICAgeyAiZGV2Y2FtZGVidWdfYWVjX3JlYWxfZ2FpbiIsICAgICAgICAgICAgICBUWVBFX0ZMT0FUIH0sCisgICB7ICJkZXZjYW1kZWJ1Z19hZWNfZXhwX2luZGV4IiwgICAgICAgICAgICAgIFRZUEVfSU5UMzIgfSwKKyAgIHsgImRldmNhbWRlYnVnX2FlY19sdXhfaWR4IiwgICAgICAgICAgICAgICAgVFlQRV9GTE9BVCB9LAorICAgLy8gRGV2Q2FtRGVidWcgdmVuZG9yIHRhZyBBV0IKKyAgIHsgImRldmNhbWRlYnVnX2F3Yl9yX2dhaW4iLCAgICAgICAgICAgICAgICAgVFlQRV9GTE9BVCB9LAorICAgeyAiZGV2Y2FtZGVidWdfYXdiX2dfZ2FpbiIsICAgICAgICAgICAgICAgICBUWVBFX0ZMT0FUIH0sCisgICB7ICJkZXZjYW1kZWJ1Z19hd2JfYl9nYWluIiwgICAgICAgICAgICAgICAgIFRZUEVfRkxPQVQgfSwKKyAgIHsgImRldmNhbWRlYnVnX2F3Yl9jY3QiLCAgICAgICAgICAgICAgICAgICAgVFlQRV9JTlQzMiB9LAorICAgeyAiZGV2Y2FtZGVidWdfYXdiX2RlY2lzaW9uIiwgICAgICAgICAgICAgICBUWVBFX0lOVDMyIH0sCit9OworCit2ZW5kb3JfdGFnX2luZm9fdAorICAgICAgICBxY2FtZXJhM19kdWFsY2FtX2xpbmtfbWV0YV9kYXRhW1FDQU1FUkEzX0RVQUxDQU1fTElOS19NRVRBX0RBVEFfRU5EIC0KKyAgICAgICAgUUNBTUVSQTNfRFVBTENBTV9MSU5LX01FVEFfREFUQV9TVEFSVF0gPSB7CisgICAgeyAiZW5hYmxlIiwgICAgICAgICAgICBUWVBFX0JZVEUgfSwKKyAgICB7ICJpc19tYWluIiwgICAgICAgICAgIFRZUEVfQllURSB9LAorICAgIHsgInJlbGF0ZWRfY2FtZXJhX2lkIiwgVFlQRV9JTlQzMiB9Cit9OworCit2ZW5kb3JfdGFnX2luZm9fdAorICAgICAgICBxY2FtZXJhM19kdWFsY2FtX2NhbGliX21ldGFfZGF0YVtRQ0FNRVJBM19EVUFMQ0FNX0NBTElCX01FVEFfREFUQV9FTkQgLQorICAgICAgICBRQ0FNRVJBM19EVUFMQ0FNX0NBTElCX01FVEFfREFUQV9TVEFSVF0gPSB7CisgICAgeyAiZHVhbGNhbV9jYWxpYl9tZXRhX2RhdGFfYmxvYiIsIFRZUEVfQllURSB9CiB9OwogCiB2ZW5kb3JfdGFnX2luZm9fdCAqcWNhbWVyYTNfdGFnX2luZm9bUUNBTUVSQTNfU0VDVElPTlNfRU5EIC0KQEAgLTEyMiw2ICsxOTQsOSBAQAogICAgIHFjYW1lcmEzX3RlbXBvcmFsX2Rlbm9pc2UsCiAgICAgcWNhbWVyYTNfYXZfdGltZXIsCiAgICAgcWNhbWVyYTNfc2Vuc29yX21ldGFfZGF0YSwKKyAgICBuZXh1c19leHBlcmltZW50YWxfMjAxNiwKKyAgICBxY2FtZXJhM19kdWFsY2FtX2xpbmtfbWV0YV9kYXRhLAorICAgIHFjYW1lcmEzX2R1YWxjYW1fY2FsaWJfbWV0YV9kYXRhCiB9OwogCiB1aW50MzJfdCBxY2FtZXJhM19hbGxfdGFnc1tdID0gewpAQCAtMTUyLDYgKzIyNyw2NSBAQAogCiAgICAgLy9RQ0FNRVJBM19TRU5TT1JfTUVUQV9EQVRBCiAgICAgKHVpbnQzMl90KVFDQU1FUkEzX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMX1BBVFRFUk4sCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX1NFTlNPUl9JU19NT05PX09OTFksCisKKyAgICAvL05FWFVTX0VYUEVSSU1FTlRBTF8yMDE2CisgICAgKHVpbnQzMl90KU5FWFVTX0VYUEVSSU1FTlRBTF8yMDE2X0hZQlJJRF9BRV9FTkFCTEUsCisgICAgKHVpbnQzMl90KU5FWFVTX0VYUEVSSU1FTlRBTF8yMDE2X0FGX1NDRU5FX0NIQU5HRSwKKyAgICAvLyBERVZDQU1ERUJVRworICAgICh1aW50MzJfdClERVZDQU1ERUJVR19NRVRBX0VOQUJMRSwKKyAgICAvLyBERVZDQU1ERUJVRyBBRgorICAgICh1aW50MzJfdClERVZDQU1ERUJVR19BRl9MRU5TX1BPU0lUSU9OLAorICAgICh1aW50MzJfdClERVZDQU1ERUJVR19BRl9UT0ZfQ09ORklERU5DRSwKKyAgICAodWludDMyX3QpREVWQ0FNREVCVUdfQUZfVE9GX0RJU1RBTkNFLAorICAgICh1aW50MzJfdClERVZDQU1ERUJVR19BRl9MVU1BLAorICAgICh1aW50MzJfdClERVZDQU1ERUJVR19BRl9IQUZfU1RBVEUsCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FGX01PTklUT1JfUERBRl9UQVJHRVRfUE9TLAorICAgICh1aW50MzJfdClERVZDQU1ERUJVR19BRl9NT05JVE9SX1BEQUZfQ09ORklERU5DRSwKKyAgICAodWludDMyX3QpREVWQ0FNREVCVUdfQUZfTU9OSVRPUl9QREFGX1JFRk9DVVMsCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FGX01PTklUT1JfVE9GX1RBUkdFVF9QT1MsCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FGX01PTklUT1JfVE9GX0NPTkZJREVOQ0UsCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FGX01PTklUT1JfVE9GX1JFRk9DVVMsCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FGX01PTklUT1JfVFlQRV9TRUxFQ1QsCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FGX01PTklUT1JfUkVGT0NVUywKKyAgICAodWludDMyX3QpREVWQ0FNREVCVUdfQUZfTU9OSVRPUl9UQVJHRVRfUE9TLAorICAgICh1aW50MzJfdClERVZDQU1ERUJVR19BRl9TRUFSQ0hfUERBRl9UQVJHRVRfUE9TLAorICAgICh1aW50MzJfdClERVZDQU1ERUJVR19BRl9TRUFSQ0hfUERBRl9ORVhUX1BPUywKKyAgICAodWludDMyX3QpREVWQ0FNREVCVUdfQUZfU0VBUkNIX1BEQUZfTkVBUl9QT1MsCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FGX1NFQVJDSF9QREFGX0ZBUl9QT1MsCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FGX1NFQVJDSF9QREFGX0NPTkZJREVOQ0UsCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FGX1NFQVJDSF9UT0ZfVEFSR0VUX1BPUywKKyAgICAodWludDMyX3QpREVWQ0FNREVCVUdfQUZfU0VBUkNIX1RPRl9ORVhUX1BPUywKKyAgICAodWludDMyX3QpREVWQ0FNREVCVUdfQUZfU0VBUkNIX1RPRl9ORUFSX1BPUywKKyAgICAodWludDMyX3QpREVWQ0FNREVCVUdfQUZfU0VBUkNIX1RPRl9GQVJfUE9TLAorICAgICh1aW50MzJfdClERVZDQU1ERUJVR19BRl9TRUFSQ0hfVE9GX0NPTkZJREVOQ0UsCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FGX1NFQVJDSF9UWVBFX1NFTEVDVCwKKyAgICAodWludDMyX3QpREVWQ0FNREVCVUdfQUZfU0VBUkNIX05FWFRfUE9TLAorICAgICh1aW50MzJfdClERVZDQU1ERUJVR19BRl9TRUFSQ0hfVEFSR0VUX1BPUywKKyAgICAvLyBERVZDQU1ERUJVRyBBRUMKKyAgICAodWludDMyX3QpREVWQ0FNREVCVUdfQUVDX1RBUkdFVF9MVU1BLAorICAgICh1aW50MzJfdClERVZDQU1ERUJVR19BRUNfQ09NUF9MVU1BLAorICAgICh1aW50MzJfdClERVZDQU1ERUJVR19BRUNfQVZHX0xVTUEsCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FFQ19DVVJfTFVNQSwKKyAgICAodWludDMyX3QpREVWQ0FNREVCVUdfQUVDX0xJTkVDT1VOVCwKKyAgICAodWludDMyX3QpREVWQ0FNREVCVUdfQUVDX1JFQUxfR0FJTiwKKyAgICAodWludDMyX3QpREVWQ0FNREVCVUdfQUVDX0VYUF9JTkRFWCwKKyAgICAodWludDMyX3QpREVWQ0FNREVCVUdfQUVDX0xVWF9JRFgsCisgICAgLy8gREVWQ0FNREVCVUcgQVdCCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FXQl9SX0dBSU4sCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FXQl9HX0dBSU4sCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FXQl9CX0dBSU4sCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FXQl9DQ1QsCisgICAgKHVpbnQzMl90KURFVkNBTURFQlVHX0FXQl9ERUNJU0lPTiwKKyAgICAvLyBERVZDQU1ERUJVRyBFTkQKKworICAgIC8vIFFDQU1FUkEzX0RVQUxDQU1fTElOS19NRVRBX0RBVEEKKyAgICAodWludDMyX3QpUUNBTUVSQTNfRFVBTENBTV9MSU5LX0VOQUJMRSwKKyAgICAodWludDMyX3QpUUNBTUVSQTNfRFVBTENBTV9MSU5LX0lTX01BSU4sCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX0RVQUxDQU1fTElOS19SRUxBVEVEX0NBTUVSQV9JRCwKKworICAgIC8vIFFDQU1FUkEzX0RVQUxDQU1fQ0FMSUJfTUVUQV9EQVRBCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX0RVQUxDQU1fQ0FMSUJfTUVUQV9EQVRBX0JMT0IsCiB9OwogCiBjb25zdCB2ZW5kb3JfdGFnX29wc190KiBRQ2FtZXJhM1ZlbmRvclRhZ3M6Ok9wcyA9IE5VTEw7CmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzVmVuZG9yVGFncy5oIGIvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1ZlbmRvclRhZ3MuaAppbmRleCA2ZmFlN2ZmLi40YzM4MTIxIDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzVmVuZG9yVGFncy5oCisrKyBiL1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNWZW5kb3JUYWdzLmgKQEAgLTQ0LDYgKzQ0LDkgQEAKICAgICBRQ0FNRVJBM19URU1QT1JBTF9ERU5PSVNFLAogICAgIFFDQU1FUkEzX0FWX1RJTUVSLAogICAgIFFDQU1FUkEzX1NFTlNPUl9NRVRBX0RBVEEsCisgICAgTkVYVVNfRVhQRVJJTUVOVEFMXzIwMTYsCisgICAgUUNBTUVSQTNfRFVBTENBTV9MSU5LX01FVEFfREFUQSwKKyAgICBRQ0FNRVJBM19EVUFMQ0FNX0NBTElCX01FVEFfREFUQSwKICAgICBRQ0FNRVJBM19TRUNUSU9OU19FTkQKIH07CiAKQEAgLTU2LDYgKzU5LDkgQEAKICAgICBRQ0FNRVJBM19URU1QT1JBTF9ERU5PSVNFX1NUQVJUID0gUUNBTUVSQTNfVEVNUE9SQUxfREVOT0lTRSA8PCAxNiwKICAgICBRQ0FNRVJBM19BVl9USU1FUl9TVEFSVCA9IFFDQU1FUkEzX0FWX1RJTUVSIDw8IDE2LAogICAgIFFDQU1FUkEzX1NFTlNPUl9NRVRBX0RBVEFfU1RBUlQgPSBRQ0FNRVJBM19TRU5TT1JfTUVUQV9EQVRBIDw8IDE2LAorICAgIE5FWFVTX0VYUEVSSU1FTlRBTF8yMDE2X1NUQVJUID0gTkVYVVNfRVhQRVJJTUVOVEFMXzIwMTYgPDwgMTYsCisgICAgUUNBTUVSQTNfRFVBTENBTV9MSU5LX01FVEFfREFUQV9TVEFSVCA9IFFDQU1FUkEzX0RVQUxDQU1fTElOS19NRVRBX0RBVEEgPDwgMTYsCisgICAgUUNBTUVSQTNfRFVBTENBTV9DQUxJQl9NRVRBX0RBVEFfU1RBUlQgPSBRQ0FNRVJBM19EVUFMQ0FNX0NBTElCX01FVEFfREFUQSA8PCAxNgogfTsKIAogZW51bSBxY2FtZXJhM19leHRfdGFncyB7CkBAIC0xMzMsNyArMTM5LDY2IEBACiAgICAgUUNBTUVSQTNfQVZfVElNRVJfRU5ELAogCiAgICAgUUNBTUVSQTNfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUxfUEFUVEVSTiA9IFFDQU1FUkEzX1NFTlNPUl9NRVRBX0RBVEFfU1RBUlQsCisgICAgUUNBTUVSQTNfU0VOU09SX0lTX01PTk9fT05MWSwKICAgICBRQ0FNRVJBM19TRU5TT1JfTUVUQV9EQVRBX0VORCwKKworICAgIE5FWFVTX0VYUEVSSU1FTlRBTF8yMDE2X0hZQlJJRF9BRV9FTkFCTEUgPSBORVhVU19FWFBFUklNRU5UQUxfMjAxNl9TVEFSVCwKKyAgICBORVhVU19FWFBFUklNRU5UQUxfMjAxNl9BRl9TQ0VORV9DSEFOR0UsCisgICAgLy8gREVWQ0FNREVCVUcKKyAgICBERVZDQU1ERUJVR19NRVRBX0VOQUJMRSwKKyAgICAvLyBERVZDQU1ERUJVRyBBRgorICAgIERFVkNBTURFQlVHX0FGX0xFTlNfUE9TSVRJT04sCisgICAgREVWQ0FNREVCVUdfQUZfVE9GX0NPTkZJREVOQ0UsCisgICAgREVWQ0FNREVCVUdfQUZfVE9GX0RJU1RBTkNFLAorICAgIERFVkNBTURFQlVHX0FGX0xVTUEsCisgICAgREVWQ0FNREVCVUdfQUZfSEFGX1NUQVRFLAorICAgIERFVkNBTURFQlVHX0FGX01PTklUT1JfUERBRl9UQVJHRVRfUE9TLAorICAgIERFVkNBTURFQlVHX0FGX01PTklUT1JfUERBRl9DT05GSURFTkNFLAorICAgIERFVkNBTURFQlVHX0FGX01PTklUT1JfUERBRl9SRUZPQ1VTLAorICAgIERFVkNBTURFQlVHX0FGX01PTklUT1JfVE9GX1RBUkdFVF9QT1MsCisgICAgREVWQ0FNREVCVUdfQUZfTU9OSVRPUl9UT0ZfQ09ORklERU5DRSwKKyAgICBERVZDQU1ERUJVR19BRl9NT05JVE9SX1RPRl9SRUZPQ1VTLAorICAgIERFVkNBTURFQlVHX0FGX01PTklUT1JfVFlQRV9TRUxFQ1QsCisgICAgREVWQ0FNREVCVUdfQUZfTU9OSVRPUl9SRUZPQ1VTLAorICAgIERFVkNBTURFQlVHX0FGX01PTklUT1JfVEFSR0VUX1BPUywKKyAgICBERVZDQU1ERUJVR19BRl9TRUFSQ0hfUERBRl9UQVJHRVRfUE9TLAorICAgIERFVkNBTURFQlVHX0FGX1NFQVJDSF9QREFGX05FWFRfUE9TLAorICAgIERFVkNBTURFQlVHX0FGX1NFQVJDSF9QREFGX05FQVJfUE9TLAorICAgIERFVkNBTURFQlVHX0FGX1NFQVJDSF9QREFGX0ZBUl9QT1MsCisgICAgREVWQ0FNREVCVUdfQUZfU0VBUkNIX1BEQUZfQ09ORklERU5DRSwKKyAgICBERVZDQU1ERUJVR19BRl9TRUFSQ0hfVE9GX1RBUkdFVF9QT1MsCisgICAgREVWQ0FNREVCVUdfQUZfU0VBUkNIX1RPRl9ORVhUX1BPUywKKyAgICBERVZDQU1ERUJVR19BRl9TRUFSQ0hfVE9GX05FQVJfUE9TLAorICAgIERFVkNBTURFQlVHX0FGX1NFQVJDSF9UT0ZfRkFSX1BPUywKKyAgICBERVZDQU1ERUJVR19BRl9TRUFSQ0hfVE9GX0NPTkZJREVOQ0UsCisgICAgREVWQ0FNREVCVUdfQUZfU0VBUkNIX1RZUEVfU0VMRUNULAorICAgIERFVkNBTURFQlVHX0FGX1NFQVJDSF9ORVhUX1BPUywKKyAgICBERVZDQU1ERUJVR19BRl9TRUFSQ0hfVEFSR0VUX1BPUywKKyAgICAvLyBERVZDQU1ERUJVRyBBRUMKKyAgICBERVZDQU1ERUJVR19BRUNfVEFSR0VUX0xVTUEsCisgICAgREVWQ0FNREVCVUdfQUVDX0NPTVBfTFVNQSwKKyAgICBERVZDQU1ERUJVR19BRUNfQVZHX0xVTUEsCisgICAgREVWQ0FNREVCVUdfQUVDX0NVUl9MVU1BLAorICAgIERFVkNBTURFQlVHX0FFQ19MSU5FQ09VTlQsCisgICAgREVWQ0FNREVCVUdfQUVDX1JFQUxfR0FJTiwKKyAgICBERVZDQU1ERUJVR19BRUNfRVhQX0lOREVYLAorICAgIERFVkNBTURFQlVHX0FFQ19MVVhfSURYLAorICAgIC8vIERFVkNBTURFQlVHIEFXQgorICAgIERFVkNBTURFQlVHX0FXQl9SX0dBSU4sCisgICAgREVWQ0FNREVCVUdfQVdCX0dfR0FJTiwKKyAgICBERVZDQU1ERUJVR19BV0JfQl9HQUlOLAorICAgIERFVkNBTURFQlVHX0FXQl9DQ1QsCisgICAgREVWQ0FNREVCVUdfQVdCX0RFQ0lTSU9OLAorICAgIC8vIERFVkNBTURFQlVHIEVORAorICAgIE5FWFVTX0VYUEVSSU1FTlRBTF8yMDE2X0VORCwKKworICAgIFFDQU1FUkEzX0RVQUxDQU1fTElOS19FTkFCTEUgPSBRQ0FNRVJBM19EVUFMQ0FNX0xJTktfTUVUQV9EQVRBX1NUQVJULAorICAgIFFDQU1FUkEzX0RVQUxDQU1fTElOS19JU19NQUlOLAorICAgIFFDQU1FUkEzX0RVQUxDQU1fTElOS19SRUxBVEVEX0NBTUVSQV9JRCwKKyAgICBRQ0FNRVJBM19EVUFMQ0FNX0xJTktfTUVUQV9EQVRBX0VORCwKKworICAgIFFDQU1FUkEzX0RVQUxDQU1fQ0FMSUJfTUVUQV9EQVRBX0JMT0IgPSBRQ0FNRVJBM19EVUFMQ0FNX0NBTElCX01FVEFfREFUQV9TVEFSVCwKKyAgICBRQ0FNRVJBM19EVUFMQ0FNX0NBTElCX01FVEFfREFUQV9FTkQKIH07CiAKIC8vIFFDQU1FUkEzX09QQVFVRV9SQVdfRk9STUFUCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9RQ2FtZXJhMkZhY3RvcnkuY3BwIGIvUUNhbWVyYTIvUUNhbWVyYTJGYWN0b3J5LmNwcAppbmRleCBiNmRiMzNlLi5hNDY0YTNlIDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9RQ2FtZXJhMkZhY3RvcnkuY3BwCisrKyBiL1FDYW1lcmEyL1FDYW1lcmEyRmFjdG9yeS5jcHAKQEAgLTMwMiw3ICszMDIsNiBAQAogaW50IFFDYW1lcmEyRmFjdG9yeTo6Z2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhX2lkLCBzdHJ1Y3QgY2FtZXJhX2luZm8gKmluZm8pCiB7CiAgICAgaW50IHJjOwotICAgIGNhbV9zeW5jX3R5cGVfdCBjYW1fdHlwZSA9IENBTV9UWVBFX01BSU47CiAKICAgICBpZiAoIW1OdW1PZkNhbWVyYXMgfHwgY2FtZXJhX2lkID49IG1OdW1PZkNhbWVyYXMgfHwgIWluZm8gfHwKICAgICAgICAgKGNhbWVyYV9pZCA8IDApKSB7CkBAIC0zMTcsMTkgKzMxNiwxNiBAQAogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKLSAgICBpZiAoIG1IYWxEZXNjcmlwdG9yc1tjYW1lcmFfaWRdLmRldmljZV92ZXJzaW9uID09Ci0gICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMCApIHsKLSAgICAgICAgcmMgPSBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpnZXRDYW1JbmZvKAotICAgICAgICAgICAgICAgIG1IYWxEZXNjcmlwdG9yc1tjYW1lcmFfaWRdLmNhbWVyYUlkLCBpbmZvKTsKLSAgICB9IGVsc2UgaWYgKG1IYWxEZXNjcmlwdG9yc1tjYW1lcmFfaWRdLmRldmljZV92ZXJzaW9uID09CisgICAgTE9HSSgiQ2FtZXJhIGlkICVkIEFQSSB2ZXJzaW9uICVkIiwKKyAgICAgICAgICAgIGNhbWVyYV9pZCwgbUhhbERlc2NyaXB0b3JzW2NhbWVyYV9pZF0uZGV2aWNlX3ZlcnNpb24pOworCisgICAgLy8gTmVlZCBBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFIHByb3BlcnR5IGZvciBmbGFzaGxpZ2h0IHdpZGdldCB0bworICAgIC8vIHdvcmsgYW5kIHNvIGdldCB0aGUgc3RhdGljIGRhdGEgcmVnYXJkbGVzcyBvZiBIQUwgdmVyc2lvbgorICAgIHJjID0gUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Z2V0Q2FtSW5mbygKKyAgICAgICAgICAgIG1IYWxEZXNjcmlwdG9yc1tjYW1lcmFfaWRdLmNhbWVyYUlkLCBpbmZvKTsKKyAgICBpZiAobUhhbERlc2NyaXB0b3JzW2NhbWVyYV9pZF0uZGV2aWNlX3ZlcnNpb24gPT0KICAgICAgICAgICAgIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKSB7Ci0gICAgICAgIHJjID0gUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Z2V0Q2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgICAgIG1IYWxEZXNjcmlwdG9yc1tjYW1lcmFfaWRdLmNhbWVyYUlkLCBpbmZvLCAmY2FtX3R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR0UoIkRldmljZSB2ZXJzaW9uIGZvciBjYW1lcmEgaWQgJWQgaW52YWxpZCAlZCIsCi0gICAgICAgICAgICAgIGNhbWVyYV9pZCwKLSAgICAgICAgICAgICAgbUhhbERlc2NyaXB0b3JzW2NhbWVyYV9pZF0uZGV2aWNlX3ZlcnNpb24pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBpbmZvLT5kZXZpY2VfdmVyc2lvbiA9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOwogICAgIH0KIAogICAgIHJldHVybiByYzsKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9jYW1faW50Zi5oIGIvUUNhbWVyYTIvc3RhY2svY29tbW9uL2NhbV9pbnRmLmgKaW5kZXggYmQ0ZGI0Yy4uMGUzNzNmYSAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvc3RhY2svY29tbW9uL2NhbV9pbnRmLmgKKysrIGIvUUNhbWVyYTIvc3RhY2svY29tbW9uL2NhbV9pbnRmLmgKQEAgLTYxLDYgKzYxLDk3IEBACiAgICAgQ0FNX1BSSVZfRkxVU0gKIH0gY2FtX3ByaXZhdGVfaW9jdGxfZW51bV90OwogCit0eXBlZGVmIGVudW0geworICAgIC8qIHN0YXJ0IHN5bmNpbmcgZm9yIHJlbGF0ZWQgY2FtZXJhcyAqLworICAgIENBTV9TWU5DX1JFTEFURURfU0VOU09SU19PTiA9IDEsCisgICAgLyogc3RvcCBzeW5jaW5nIGZvciByZWxhdGVkIGNhbWVyYXMgKi8KKyAgICBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT0ZGCit9IGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19jb250cm9sX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgLyogRHJpdmluZyBjYW1lcmEgb2YgdGhlIHJlbGF0ZWQgY2FtZXJhIHN1Yi1zeXN0ZW0gKi8KKyAgICAvKiBDZXJ0YWluIGZlYXR1cmVzIGFyZSBlbmFibGVkIG9ubHkgZm9yIHByaW1hcnkgY2FtZXJhCisgICAgICAgc3VjaCBhcyBkaXNwbGF5IG1vZGUgZm9yIHByZXZpZXcsIGF1dG9mb2N1cyBldGMKKyAgICAgICBJbiBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIGZvciBlZy4gd2hlbiBvcHRpY2FsIHpvb20KKyAgICAgICBsaW1pdCBpcyByZWFjaGVkLCBBdXggQ2FtZXJhIHdvdWxkIGJlY29tZQorICAgICAgIHRoZSBkcml2aW5nIGNhbWVyYSBhbmQgdGhlcmUgd2lsbCBiZSByb2xlIHN3aXRjaC4qLworICAgIENBTV9NT0RFX1BSSU1BUlkgPSAwLAorICAgIC8qIE5vbi1kcml2aW5nIGNhbWVyYSBvZiB0aGUgcmVsYXRlZCBjYW1lcmEgc3ViLXN5c3RlbQorICAgICAgIG5vIGRpc3BsYXkgbW9kZSBzZXQgZm9yIHNlY29uZGFyeSBjYW1lcmEgKi8KKyAgICBDQU1fTU9ERV9TRUNPTkRBUlkKK30gY2FtX3N5bmNfbW9kZV90OworCisvKiBQYXlsb2FkIGZvciBzZW5kaW5nIGJ1bmRsaW5nIGluZm8gdG8gYmFja2VuZCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19jb250cm9sX3Qgc3luY19jb250cm9sOworICAgIGNhbV9zeW5jX3R5cGVfdCB0eXBlOworICAgIGNhbV9zeW5jX21vZGVfdCBtb2RlOworICAgIC8qIHNlc3Npb24gSWQgb2YgdGhlIG90aGVyIGNhbWVyYSBzZXNzaW9uCisgICAgICAgTGlua2luZyB3aWxsIGJlIGRvbmUgd2l0aCB0aGlzIHNlc3Npb24gaW4gdGhlCisgICAgICAgYmFja2VuZCAqLworICAgIHVpbnQzMl90IHJlbGF0ZWRfc2Vuc29yX3Nlc3Npb25faWQ7CisgICAgdWludDhfdCBpc19mcmFtZV9zeW5jX2VuYWJsZWQ7Cit9Y2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdDsKKworLyogUmVsYXRlZCBjYW1lcmEgc2Vuc29yIHNwZWNpZmljIGNhbGlicmF0aW9uIGRhdGEgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBGb2NhbCBsZW5ndGggaW4gcGl4ZWxzIEAgY2FsaWJyYXRpb24gcmVzb2x1dGlvbi4qLworICAgIGZsb2F0ICAgICAgIG5vcm1hbGl6ZWRfZm9jYWxfbGVuZ3RoOworICAgIC8qIE5hdGl2ZSBzZW5zb3IgcmVzb2x1dGlvbiBXIHRoYXQgd2FzIHVzZWQgdG8gY2FwdHVyZSBjYWxpYnJhdGlvbiBpbWFnZSAqLworICAgIHVpbnQxNl90ICAgIG5hdGl2ZV9zZW5zb3JfcmVzb2x1dGlvbl93aWR0aDsKKyAgICAvKiBOYXRpdmUgc2Vuc29yIHJlc29sdXRpb24gSCB0aGF0IHdhcyB1c2VkIHRvIGNhcHR1cmUgY2FsaWJyYXRpb24gaW1hZ2UgKi8KKyAgICB1aW50MTZfdCAgICBuYXRpdmVfc2Vuc29yX3Jlc29sdXRpb25faGVpZ2h0OworICAgIC8qIEltYWdlIHNpemUgVyB1c2VkIGludGVybmFsbHkgYnkgY2FsaWJyYXRpb24gdG9vbCAqLworICAgIHVpbnQxNl90ICAgIGNhbGlicmF0aW9uX3NlbnNvcl9yZXNvbHV0aW9uX3dpZHRoOworICAgIC8qIEltYWdlIHNpemUgSCB1c2VkIGludGVybmFsbHkgYnkgY2FsaWJyYXRpb24gdG9vbCAqLworICAgIHVpbnQxNl90ICAgIGNhbGlicmF0aW9uX3NlbnNvcl9yZXNvbHV0aW9uX2hlaWdodDsKKyAgICAvKiBGb2NhbCBsZW5ndGggcmF0aW8gQCBDYWxpYnJhdGlvbiAqLworICAgIGZsb2F0ICAgICAgIGZvY2FsX2xlbmd0aF9yYXRpbzsKK31jYW1fcmVsYXRlZF9zZW5zb3JfY2FsaWJyYXRpb25fZGF0YV90OworCisvKiBSZWxhdGVkIENhbWVyYSBTeXN0ZW0gQ2FsaWJyYXRpb24gZGF0YQorICAgQ2FsaWJyYXRpb24gZGF0YSBmb3IgdGhlIGVudGlyZSByZWxhdGVkIGNhbSBzdWItc3lzdGVtIGlzCisgICBpbiBhIHNoYXJlZCBFRVBST00uIFdlIGhhdmUgMiBmaWVsZHMgd2hpY2ggYXJlIHNwZWNpZmljIHRvCisgICBlYWNoIHNlbnNvciBmb2xsb3dlZCBieSBhIHNldCBvZiBjb21tb24gY2FsaWJyYXRpb24gb2YgdGhlCisgICBlbnRpcmUgcmVsYXRlZCBjYW0gc3lzdGVtKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBWZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgdWludDMyX3QgICAgY2FsaWJyYXRpb25fZm9ybWF0X3ZlcnNpb247CisgICAgLyogTWFpbiBDYW1lcmEgU2Vuc29yIHNwZWNpZmljIGNhbGlicmF0aW9uICovCisgICAgY2FtX3JlbGF0ZWRfc2Vuc29yX2NhbGlicmF0aW9uX2RhdGFfdCAgbWFpbl9jYW1fc3BlY2lmaWNfY2FsaWJyYXRpb247CisgICAgLyogQXV4IENhbWVyYSBTZW5zb3Igc3BlY2lmaWMgY2FsaWJyYXRpb24gKi8KKyAgICBjYW1fcmVsYXRlZF9zZW5zb3JfY2FsaWJyYXRpb25fZGF0YV90ICBhdXhfY2FtX3NwZWNpZmljX2NhbGlicmF0aW9uOworICAgIC8qIFJlbGF0aXZlIHZpZXdwb2ludCBtYXRjaGluZyBtYXRyaXggdy5yLnQgTWFpbiAqLworICAgIGZsb2F0ICAgICAgcmVsYXRpdmVfcm90YXRpb25fbWF0cml4W1JFTENBTV9DQUxJQl9ST1RfTUFUUklYX01BWF07CisgICAgLyogUmVsYXRpdmUgZ2VvbWV0cmljIHN1cmZhY2UgZGVzY3JpcHRpb24gcGFyYW1ldGVycyAqLworICAgIGZsb2F0ICAgICAgcmVsYXRpdmVfZ2VvbWV0cmljX3N1cmZhY2VfcGFyYW1ldGVyc1sKKyAgICAgICAgICAgIFJFTENBTV9DQUxJQl9TVVJGQUNFX1BBUk1TX01BWF07CisgICAgLyogUmVsYXRpdmUgb2Zmc2V0IG9mIHNlbnNvciBjZW50ZXIgZnJvbSBvcHRpY2FsIGF4aXMgYWxvbmcgaG9yaXpvbnRhbCBkaW1lbnNpb24gKi8KKyAgICBmbG9hdCAgICAgIHJlbGF0aXZlX3ByaW5jaXBsZV9wb2ludF94X29mZnNldDsKKyAgICAvKiBSZWxhdGl2ZSBvZmZzZXQgb2Ygc2Vuc29yIGNlbnRlciBmcm9tIG9wdGljYWwgYXhpcyBhbG9uZyB2ZXJ0aWNhbCBkaW1lbnNpb24gKi8KKyAgICBmbG9hdCAgICAgIHJlbGF0aXZlX3ByaW5jaXBsZV9wb2ludF95X29mZnNldDsKKyAgICAvKiAwPU1haW4gQ2FtZXJhIGlzIG9uIHRoZSBsZWZ0IG9mIEF1eDsgMT1NYWluIENhbWVyYSBpcyBvbiB0aGUgcmlnaHQgb2YgQXV4ICovCisgICAgdWludDE2X3QgICByZWxhdGl2ZV9wb3NpdGlvbl9mbGFnOworICAgIC8qIENhbWVyYSBzZXBhcmF0aW9uIGluIG1tICovCisgICAgZmxvYXQgICAgICByZWxhdGl2ZV9iYXNlbGluZV9kaXN0YW5jZTsKKyAgICAvKiBtYWluIHNlbnNvciBzZXR0aW5nIGR1cmluZyBjYWw6IDAtbm9uZSwgMS1ob3ItbWlycm9yLCAyLXZlci1mbGlwLCAzLWJvdGggKi8KKyAgICB1aW50MTZfdCAgIG1haW5fc2Vuc29yX21pcnJvcl9mbGlwX3NldHRpbmc7CisgICAgLyogYXV4IHNlbnNvciBzZXR0aW5nIGR1cmluZyBjYWw6IDAtbm9uZSwgMS1ob3ItbWlycm9yLCAyLXZlci1mbGlwLCAzLWJvdGggKi8KKyAgICB1aW50MTZfdCAgIGF1eF9zZW5zb3JfbWlycm9yX2ZsaXBfc2V0dGluZzsKKyAgICAvKiBtb2R1bGUgb3JpZW50YXRpb24gZHVyaW5nIGNhbDogMC1zZW5zb3JzIGluIGxhbmRzY2FwZSwgMS1zZW5zb3JzIGluIHBvcnRyYWl0ICovCisgICAgdWludDE2X3QgICBtb2R1bGVfb3JpZW50YXRpb25fZHVyaW5nX2NhbGlicmF0aW9uOworICAgIC8qIGNhbCBpbWFnZXMgcmVxdWlyZWQgcm90YXRpb246IDAtbm8sIDEtOTAgZGVncmVlcyByaWdodCwgMi05MCBkZWdyZWVzIGxlZnQgKi8KKyAgICB1aW50MTZfdCAgIHJvdGF0aW9uX2ZsYWc7CisgICAgLyogUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KKyAgICBmbG9hdCAgICAgIHJlc2VydmVkW1JFTENBTV9DQUxJQl9SRVNFUlZFRF9NQVhdOworfSBjYW1fcmVsYXRlZF9zeXN0ZW1fY2FsaWJyYXRpb25fZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IGRlZmF1bHRfc2Vuc29yX2ZsaXA7CisgIHVpbnQzMl90IHNlbnNvcl9tb3VudF9hbmdsZTsKKyAgY2FtX3JlbGF0ZWRfc3lzdGVtX2NhbGlicmF0aW9uX2RhdGFfdCBvdHBfY2FsaWJyYXRpb25fZGF0YTsKK30gY2FtX2pwZWdfbWV0YWRhdGFfdDsKKwogLyogY2FwYWJpbGl0eSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgSEFMIDEqLwogdHlwZWRlZiBzdHJ1Y3R7CiAgICAgY2FtX2hhbF92ZXJzaW9uX3QgdmVyc2lvbjsKQEAgLTIxOCw4ICszMDksOCBAQAogICAgIC8qIFFDT00gSERSIHNwZWNpZmljIGNvbnRyb2wuIEluZGljYXRlcyBudW1iZXIgb2YgZnJhbWVzIGFuZCBleHBvc3VyZSBuZWVkcyBmb3IgdGhlIGZyYW1lcyAqLwogICAgIGNhbV9oZHJfYnJhY2tldGluZ19pbmZvX3QgaGRyX2JyYWNrZXRpbmdfc2V0dGluZzsKIAotICAgIHVpbnQzMl90IHFjb21fc3VwcG9ydGVkX2ZlYXR1cmVfbWFzazsgLyogbWFzayBvZiBxY29tIHNwZWNpZmljIGZlYXR1cmVzIHN1cHBvcnRlZDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN1Y2ggYXMgQ0FNX1FDT01fRkVBVFVSRV9TVVBQT1JURURfRkFDRV9ERVRFQ1RJT04qLworICAgIGNhbV9mZWF0dXJlX21hc2tfdCBxY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2s7IC8qIG1hc2sgb2YgcWNvbSBzcGVjaWZpYyBmZWF0dXJlcyBzdXBwb3J0ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3VjaCBhcyBDQU1fUUNPTV9GRUFUVVJFX1NVUFBPUlRFRF9GQUNFX0RFVEVDVElPTiovCiAgICAgY2FtX3BhZGRpbmdfaW5mb190IHBhZGRpbmdfaW5mbzsgICAgICAvKiBwYWRkaW5nIGluZm9ybWF0aW9uIGZyb20gUFAgKi8KICAgICB1aW50MzJfdCBtaW5fbnVtX3BwX2J1ZnM7ICAgICAgICAgICAgIC8qIG1pbmltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgbmVlZGVkIGJ5IHBvc3Rwcm9jIG1vZHVsZSAqLwogICAgIGNhbV9mb3JtYXRfdCByZGlfbW9kZV9zdHJlYW1fZm10OyAgLyogc3RyZWFtIGZvcm1hdCBzdXBwb3J0ZWQgaW4gcmRpIG1vZGUgKi8KQEAgLTI3OCw3ICszNjksNyBAQAogICAgIGludDMyX3Qgd2hpdGVfbGV2ZWw7CiAKICAgICAvKiBBIGZpeGVkIGJsYWNrIGxldmVsIG9mZnNldCBmb3IgZWFjaCBvZiB0aGUgQmF5ZXIKLSAgICAgICBtb3NhaWMgY2hhbm5lbHMgKi8KKyAgICAgICBtb3NhaWMgY2hhbm5lbHMgaW4gUkdHQiBvcmRlciovCiAgICAgaW50MzJfdCBibGFja19sZXZlbF9wYXR0ZXJuW0JMQUNLX0xFVkVMX1BBVFRFUk5fQ05UXTsKIAogICAgIC8qIFRpbWUgdGFrZW4gYmVmb3JlIGZsYXNoIGNhbiBmaXJlIGFnYWluIGluIG5hbm8gc2VjcyAqLwpAQCAtMzA2LDcgKzM5Nyw2IEBACiAgICAgY2FtX2Zvcm1hdF90IHN1cHBvcnRlZF9zY2FsYXJfZm10c1tDQU1fRk9STUFUX01BWF07CiAKICAgICB1aW50MzJfdCBtYXhfZmFjZV9kZXRlY3Rpb25fY291bnQ7Ci0gICAgdWludDhfdCBod19hbmFseXNpc19zdXBwb3J0ZWQ7CiAKICAgICB1aW50OF90IGhpc3RvZ3JhbV9zdXBwb3J0ZWQ7CiAgICAgLyogTnVtYmVyIG9mIGhpc3RvZ3JhbSBidWNrZXRzIHN1cHBvcnRlZCAqLwpAQCAtMzg1LDE4ICs0NzUsMTEgQEAKICAgICAgKiB0aW1lc3RhbXBzIGZyb20gb3RoZXIgc3ViLXN5c3RlbXMgKGd5cm8sIGFjY2VsZXJvbWV0ZXIgZXRjLikgKi8KICAgICB1aW50OF90IGlzVGltZXN0YW1wQ2FsaWJyYXRlZDsKIAotICAgIC8qIEFuYWx5c2lzIHN0cmVhbSBtYXggc3VwcG9ydGVkIHNpemUgKi8KLSAgICBjYW1fZGltZW5zaW9uX3QgYW5hbHlzaXNfbWF4X3JlczsKLSAgICAvKiBBbmFseXNpcyBzdHJlYW0gcGFkZGluZyBpbmZvICovCi0gICAgY2FtX3BhZGRpbmdfaW5mb190IGFuYWx5c2lzX3BhZGRpbmdfaW5mbzsKICAgICAvKiBNYXggc2l6ZSBzdXBwb3J0ZWQgYnkgSVNQIHZpZXdmaW5kZXIgcGF0aCAqLwogICAgIGNhbV9kaW1lbnNpb25fdCBtYXhfdmlld2ZpbmRlcl9zaXplOwogCi0gICAgLyogQW5hbHlzaXMgcmVjb21tZW5kZWQgc2l6ZSAqLwotICAgIGNhbV9kaW1lbnNpb25fdCBhbmFseXNpc19yZWNvbW1lbmRlZF9yZXM7Ci0KLSAgICAvKiBBbmFseXNpcyByZWNvbW1lbmRlZCBmb3JtYXQgKi8KLSAgICBjYW1fZm9ybWF0X3QgYW5hbHlzaXNfcmVjb21tZW5kZWRfZm9ybWF0OworICAgIC8qIEFuYWx5c2lzIGJ1ZmZlciByZXF1aXJlbWVudHMgKi8KKyAgICBjYW1fYW5hbHlzaXNfaW5mb190IGFuYWx5c2lzX2luZm9bQ0FNX0FOQUxZU0lTX0lORk9fTUFYXTsKIAogICAgIC8qIFRoaXMgaXMgc2V0IHRvICd0cnVlJyBpZiBzZW5zb3IgY2Fubm90IGd1YXJhbnRlZSBwZXIgZnJhbWUgY29udHJvbCAqLwogICAgIC8qIERlZmF1bHQgdmFsdWUgb2YgdGhpcyBjYXBhYmlsaXR5IGlzICdmYWxzZScgaW5kaWNhdGluZyBwZXItZnJhbWUgKi8KQEAgLTQzNyw2ICs1MjAsMTEgQEAKICAgICAvKiBzdXBwb3J0ZWQgaW5zdGFudCBjYXB0dXJlL0FFQyBjb252ZXJnZW5jZSBtb2RlcyAqLwogICAgIHNpemVfdCBzdXBwb3J0ZWRfaW5zdGFudF9hZWNfbW9kZXNfY250OwogICAgIGNhbV9hZWNfY29udmVyZ2VuY2VfdHlwZSBzdXBwb3J0ZWRfaW5zdGFudF9hZWNfbW9kZXNbQ0FNX0FFQ19DT05WRVJHRU5DRV9NQVhdOworCisgICAgLyogRHVhbCBjYW0gY2FsaWJyYXRpb24gZGF0YSAqLworICAgIGNhbV9yZWxhdGVkX3N5c3RlbV9jYWxpYnJhdGlvbl9kYXRhX3QgcmVsYXRlZF9jYW1fY2FsaWJyYXRpb247CisgICAgLyogV2hldGhlciBjYW1lcmEgdGltZXN0YW1wIGlzIGNhbGlicmF0ZWQgd2l0aCBzZW5zb3IgKi8KKyAgICB1aW50OF90IHRpbWVzdGFtcF9jYWxpYnJhdGVkOwogfSBjYW1fY2FwYWJpbGl0eV90OwogCiB0eXBlZGVmIGVudW0gewpAQCAtNDY5LDEwNSArNTU3LDYgQEAKICAgICB1aW50MzJfdCBmbGlwX21hc2s7CiB9IGNhbV9mbGlwX21vZGVfdDsKIAotdHlwZWRlZiBlbnVtIHsKLSAgICAvKiBzdGFydCBzeW5jaW5nIGZvciByZWxhdGVkIGNhbWVyYXMgKi8KLSAgICBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT04gPSAxLAotICAgIC8qIHN0b3Agc3luY2luZyBmb3IgcmVsYXRlZCBjYW1lcmFzICovCi0gICAgQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09GRgotfSBjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfY29udHJvbF90OwotCi10eXBlZGVmIGVudW0gewotICAgIC8qIERyaXZpbmcgY2FtZXJhIG9mIHRoZSByZWxhdGVkIGNhbWVyYSBzdWItc3lzdGVtICovCi0gICAgLyogQ2VydGFpbiBmZWF0dXJlcyBhcmUgZW5hYmxlZCBvbmx5IGZvciBwcmltYXJ5IGNhbWVyYQotICAgICAgIHN1Y2ggYXMgZGlzcGxheSBtb2RlIGZvciBwcmV2aWV3LCBhdXRvZm9jdXMgZXRjCi0gICAgICAgSW4gY2VydGFpbiBjb25maWd1cmF0aW9ucyBmb3IgZWcuIHdoZW4gb3B0aWNhbCB6b29tCi0gICAgICAgbGltaXQgaXMgcmVhY2hlZCwgQXV4IENhbWVyYSB3b3VsZCBiZWNvbWUKLSAgICAgICB0aGUgZHJpdmluZyBjYW1lcmEgYW5kIHRoZXJlIHdpbGwgYmUgcm9sZSBzd2l0Y2guKi8KLSAgICBDQU1fTU9ERV9QUklNQVJZID0gMCwKLSAgICAvKiBOb24tZHJpdmluZyBjYW1lcmEgb2YgdGhlIHJlbGF0ZWQgY2FtZXJhIHN1Yi1zeXN0ZW0KLSAgICAgICBubyBkaXNwbGF5IG1vZGUgc2V0IGZvciBzZWNvbmRhcnkgY2FtZXJhICovCi0gICAgQ0FNX01PREVfU0VDT05EQVJZCi19IGNhbV9zeW5jX21vZGVfdDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICAvKiBNYWluIGNhbWVyYSBvZiB0aGUgcmVsYXRlZCBjYW0gc3Vic3lzdGVtIHdoaWNoIGNvbnRyb2xzCi0gICAgICAgSFcgc3luYyBhdCBzZW5zb3IgbGV2ZWwqLwotICAgIENBTV9UWVBFX01BSU4gPSAwLAotICAgIC8qIEF1eCBjYW1lcmEgb2YgdGhlIHJlbGF0ZWQgY2FtIHN1YnN5c3RlbSAqLwotICAgIENBTV9UWVBFX0FVWAotfSBjYW1fc3luY190eXBlX3Q7Ci0KLS8qIFBheWxvYWQgZm9yIHNlbmRpbmcgYnVuZGxpbmcgaW5mbyB0byBiYWNrZW5kICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2NvbnRyb2xfdCBzeW5jX2NvbnRyb2w7Ci0gICAgY2FtX3N5bmNfdHlwZV90IHR5cGU7Ci0gICAgY2FtX3N5bmNfbW9kZV90IG1vZGU7Ci0gICAgLyogc2Vzc2lvbiBJZCBvZiB0aGUgb3RoZXIgY2FtZXJhIHNlc3Npb24KLSAgICAgICBMaW5raW5nIHdpbGwgYmUgZG9uZSB3aXRoIHRoaXMgc2Vzc2lvbiBpbiB0aGUKLSAgICAgICBiYWNrZW5kICovCi0gICAgdWludDMyX3QgcmVsYXRlZF9zZW5zb3Jfc2Vzc2lvbl9pZDsKLSAgICB1aW50OF90IGlzX2ZyYW1lX3N5bmNfZW5hYmxlZDsKLX1jYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190OwotCi0vKiBSZWxhdGVkIGNhbWVyYSBzZW5zb3Igc3BlY2lmaWMgY2FsaWJyYXRpb24gZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qIEZvY2FsIGxlbmd0aCBpbiBwaXhlbHMgQCBjYWxpYnJhdGlvbiByZXNvbHV0aW9uLiovCi0gICAgZmxvYXQgICAgICAgbm9ybWFsaXplZF9mb2NhbF9sZW5ndGg7Ci0gICAgLyogTmF0aXZlIHNlbnNvciByZXNvbHV0aW9uIFcgdGhhdCB3YXMgdXNlZCB0byBjYXB0dXJlIGNhbGlicmF0aW9uIGltYWdlICovCi0gICAgdWludDE2X3QgICAgbmF0aXZlX3NlbnNvcl9yZXNvbHV0aW9uX3dpZHRoOwotICAgIC8qIE5hdGl2ZSBzZW5zb3IgcmVzb2x1dGlvbiBIIHRoYXQgd2FzIHVzZWQgdG8gY2FwdHVyZSBjYWxpYnJhdGlvbiBpbWFnZSAqLwotICAgIHVpbnQxNl90ICAgIG5hdGl2ZV9zZW5zb3JfcmVzb2x1dGlvbl9oZWlnaHQ7Ci0gICAgLyogSW1hZ2Ugc2l6ZSBXIHVzZWQgaW50ZXJuYWxseSBieSBjYWxpYnJhdGlvbiB0b29sICovCi0gICAgdWludDE2X3QgICAgY2FsaWJyYXRpb25fc2Vuc29yX3Jlc29sdXRpb25fd2lkdGg7Ci0gICAgLyogSW1hZ2Ugc2l6ZSBIIHVzZWQgaW50ZXJuYWxseSBieSBjYWxpYnJhdGlvbiB0b29sICovCi0gICAgdWludDE2X3QgICAgY2FsaWJyYXRpb25fc2Vuc29yX3Jlc29sdXRpb25faGVpZ2h0OwotICAgIC8qIEZvY2FsIGxlbmd0aCByYXRpbyBAIENhbGlicmF0aW9uICovCi0gICAgZmxvYXQgICAgICAgZm9jYWxfbGVuZ3RoX3JhdGlvOwotfWNhbV9yZWxhdGVkX3NlbnNvcl9jYWxpYnJhdGlvbl9kYXRhX3Q7Ci0KLS8qIFJlbGF0ZWQgQ2FtZXJhIFN5c3RlbSBDYWxpYnJhdGlvbiBkYXRhCi0gICBDYWxpYnJhdGlvbiBkYXRhIGZvciB0aGUgZW50aXJlIHJlbGF0ZWQgY2FtIHN1Yi1zeXN0ZW0gaXMKLSAgIGluIGEgc2hhcmVkIEVFUFJPTS4gV2UgaGF2ZSAyIGZpZWxkcyB3aGljaCBhcmUgc3BlY2lmaWMgdG8KLSAgIGVhY2ggc2Vuc29yIGZvbGxvd2VkIGJ5IGEgc2V0IG9mIGNvbW1vbiBjYWxpYnJhdGlvbiBvZiB0aGUKLSAgIGVudGlyZSByZWxhdGVkIGNhbSBzeXN0ZW0qLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIC8qIFZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICB1aW50MzJfdCAgICBjYWxpYnJhdGlvbl9mb3JtYXRfdmVyc2lvbjsKLSAgICAvKiBNYWluIENhbWVyYSBTZW5zb3Igc3BlY2lmaWMgY2FsaWJyYXRpb24gKi8KLSAgICBjYW1fcmVsYXRlZF9zZW5zb3JfY2FsaWJyYXRpb25fZGF0YV90ICBtYWluX2NhbV9zcGVjaWZpY19jYWxpYnJhdGlvbjsKLSAgICAvKiBBdXggQ2FtZXJhIFNlbnNvciBzcGVjaWZpYyBjYWxpYnJhdGlvbiAqLwotICAgIGNhbV9yZWxhdGVkX3NlbnNvcl9jYWxpYnJhdGlvbl9kYXRhX3QgIGF1eF9jYW1fc3BlY2lmaWNfY2FsaWJyYXRpb247Ci0gICAgLyogUmVsYXRpdmUgdmlld3BvaW50IG1hdGNoaW5nIG1hdHJpeCB3LnIudCBNYWluICovCi0gICAgZmxvYXQgICAgICByZWxhdGl2ZV9yb3RhdGlvbl9tYXRyaXhbUkVMQ0FNX0NBTElCX1JPVF9NQVRSSVhfTUFYXTsKLSAgICAvKiBSZWxhdGl2ZSBnZW9tZXRyaWMgc3VyZmFjZSBkZXNjcmlwdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgZmxvYXQgICAgICByZWxhdGl2ZV9nZW9tZXRyaWNfc3VyZmFjZV9wYXJhbWV0ZXJzWwotICAgICAgICAgICAgUkVMQ0FNX0NBTElCX1NVUkZBQ0VfUEFSTVNfTUFYXTsKLSAgICAvKiBSZWxhdGl2ZSBvZmZzZXQgb2Ygc2Vuc29yIGNlbnRlciBmcm9tIG9wdGljYWwgYXhpcyBhbG9uZyBob3Jpem9udGFsIGRpbWVuc2lvbiAqLwotICAgIGZsb2F0ICAgICAgcmVsYXRpdmVfcHJpbmNpcGxlX3BvaW50X3hfb2Zmc2V0OwotICAgIC8qIFJlbGF0aXZlIG9mZnNldCBvZiBzZW5zb3IgY2VudGVyIGZyb20gb3B0aWNhbCBheGlzIGFsb25nIHZlcnRpY2FsIGRpbWVuc2lvbiAqLwotICAgIGZsb2F0ICAgICAgcmVsYXRpdmVfcHJpbmNpcGxlX3BvaW50X3lfb2Zmc2V0OwotICAgIC8qIDA9TWFpbiBDYW1lcmEgaXMgb24gdGhlIGxlZnQgb2YgQXV4OyAxPU1haW4gQ2FtZXJhIGlzIG9uIHRoZSByaWdodCBvZiBBdXggKi8KLSAgICB1aW50MTZfdCAgIHJlbGF0aXZlX3Bvc2l0aW9uX2ZsYWc7Ci0gICAgLyogQ2FtZXJhIHNlcGFyYXRpb24gaW4gbW0gKi8KLSAgICBmbG9hdCAgICAgIHJlbGF0aXZlX2Jhc2VsaW5lX2Rpc3RhbmNlOwotICAgIC8qIG1haW4gc2Vuc29yIHNldHRpbmcgZHVyaW5nIGNhbDogMC1ub25lLCAxLWhvci1taXJyb3IsIDItdmVyLWZsaXAsIDMtYm90aCAqLwotICAgIHVpbnQxNl90ICAgbWFpbl9zZW5zb3JfbWlycm9yX2ZsaXBfc2V0dGluZzsKLSAgICAvKiBhdXggc2Vuc29yIHNldHRpbmcgZHVyaW5nIGNhbDogMC1ub25lLCAxLWhvci1taXJyb3IsIDItdmVyLWZsaXAsIDMtYm90aCAqLwotICAgIHVpbnQxNl90ICAgYXV4X3NlbnNvcl9taXJyb3JfZmxpcF9zZXR0aW5nOwotICAgIC8qIG1vZHVsZSBvcmllbnRhdGlvbiBkdXJpbmcgY2FsOiAwLXNlbnNvcnMgaW4gbGFuZHNjYXBlLCAxLXNlbnNvcnMgaW4gcG9ydHJhaXQgKi8KLSAgICB1aW50MTZfdCAgIG1vZHVsZV9vcmllbnRhdGlvbl9kdXJpbmdfY2FsaWJyYXRpb247Ci0gICAgLyogY2FsIGltYWdlcyByZXF1aXJlZCByb3RhdGlvbjogMC1ubywgMS05MCBkZWdyZWVzIHJpZ2h0LCAyLTkwIGRlZ3JlZXMgbGVmdCAqLwotICAgIHVpbnQxNl90ICAgcm90YXRpb25fZmxhZzsKLSAgICAvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLwotICAgIGZsb2F0ICAgICAgcmVzZXJ2ZWRbUkVMQ0FNX0NBTElCX1JFU0VSVkVEX01BWF07Ci19IGNhbV9yZWxhdGVkX3N5c3RlbV9jYWxpYnJhdGlvbl9kYXRhX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3QgZGVmYXVsdF9zZW5zb3JfZmxpcDsKLSAgdWludDMyX3Qgc2Vuc29yX21vdW50X2FuZ2xlOwotICBjYW1fcmVsYXRlZF9zeXN0ZW1fY2FsaWJyYXRpb25fZGF0YV90IG90cF9jYWxpYnJhdGlvbl9kYXRhOwotfSBjYW1fanBlZ19tZXRhZGF0YV90OwotCiAjZGVmaW5lIElNR19OQU1FX1NJWkUgMzIKIHR5cGVkZWYgc3RydWN0IHsKICAgICBjYW1fcmVjdF90IGNyb3A7ICAvKiBjcm9wIGluZm8gZm9yIHRoZSBpbWFnZSAqLwpAQCAtNzc2LDcgKzc2NSw3IEBACiAgICAgLyogU3BlY2lmaWMgdG8gSEFMMyAqLwogICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GUkFNRV9OVU1CRVJfVkFMSUQsICAgICAgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgIDEpOwogICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9VUkdFTlRfRlJBTUVfTlVNQkVSX1ZBTElELCAgICBpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgIDEpOwotICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GUkFNRV9EUk9QUEVELCAgICAgICAgICAgICAgICBjYW1fZnJhbWVfZHJvcHBlZF90LCAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GUkFNRV9EUk9QUEVELCAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX0lEX3QsICAgICAgICAgICAgIDEpOwogICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GUkFNRV9OVU1CRVIsICAgICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOwogICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9VUkdFTlRfRlJBTUVfTlVNQkVSLCAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOwogICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9DT0xPUl9DT1JSRUNUX01PREUsICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOwpAQCAtODMzLDcgKzgyMiwxMSBAQAogICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX0FXQiwgICAgICAgICAgICAgICBjYW1fYXdiX2V4aWZfZGVidWdfdCwgICAgICAgIDEpOwogICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX0FGLCAgICAgICAgICAgICAgICBjYW1fYWZfZXhpZl9kZWJ1Z190LCAgICAgICAgIDEpOwogICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX0FTRCwgICAgICAgICAgICAgICBjYW1fYXNkX2V4aWZfZGVidWdfdCwgICAgICAgIDEpOwotICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX1NUQVRTLCAgICAgICAgICAgICBjYW1fc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdCwgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfU1RBVFMsICAgICAgICAgICAgIGNhbV9zdGF0c19idWZmZXJfZXhpZl9kZWJ1Z190LCAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX0JFU1RBVFMsICAgICAgICAgICBjYW1fYmVzdGF0c19idWZmZXJfZXhpZl9kZWJ1Z190LCAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR19CSElTVCwgICAgICAgICAgICAgY2FtX2JoaXN0X2J1ZmZlcl9leGlmX2RlYnVnX3QsICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfM0FfVFVOSU5HLCAgICAgICAgIGNhbV9xM2FfdHVuaW5nX2luZm9fdCwgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0FTRF9TQ0VORV9DQVBUVVJFX1RZUEUsICAgICAgIGNhbV9hdXRvX3NjZW5lX3QsICAgICAgICAgICAgMSk7CiAgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0VGRkVDVCwgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgLyogRGVmaW5pbmcgYXMgaW50MzJfdCBzbyB0aGF0IHRoaXMgYXJyYXkgaXMgNCBieXRlIGFsaWduZWQgKi8KICAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfUFJJVkFURV9EQVRBLCAgICAgICAgICAgICAgICAgaW50MzJfdCwKQEAgLTk2Niw2ICs5NTksNTUgQEAKICAgICBJTkNMVURFKENBTV9JTlRGX0FGX1NUQVRFX1RSQU5TSVRJT04sICAgICAgICAgICAgICAgdWludDhfdCwgICAgICAgICAgICAgICAgICAgICAxKTsKICAgICBJTkNMVURFKENBTV9JTlRGX1BBUk1fSU5JVElBTF9FWFBPU1VSRV9JTkRFWCwgICAgICAgdWludDMyX3QsICAgICAgICAgICAgICAgICAgICAxKTsKICAgICBJTkNMVURFKENBTV9JTlRGX1BBUk1fSU5TVEFOVF9BRUMsICAgICAgICAgICAgICAgICAgdWludDhfdCwgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfSFlCUklEX0FFLCAgICAgICAgICAgICAgICAgICAgdWludDhfdCwgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfQUZfU0NFTkVfQ0hBTkdFLCAgICAgICAgICAgICAgdWludDhfdCwgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAvKiBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSBDQU1fSU5URi5IICovCisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0RFVl9DQU1fRU5BQkxFLCAgICAgICAgICAgICAgIHVpbnQ4X3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgLyogRGV2Q2FtRGVidWcgbWV0YWRhdGEgQ0FNX0lOVEYuSCBBRiAqLworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX0xFTlNfUE9TSVRJT04sICAgICBpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1RPRl9DT05GSURFTkNFLCAgICBpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1RPRl9ESVNUQU5DRSwgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX0xVTUEsICAgICAgICAgICAgICAgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX0hBRl9TVEFURSwgICAgICAgICAgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfUERBRl9UQVJHRVRfUE9TLCBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfUERBRl9DT05GSURFTkNFLCBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfUERBRl9SRUZPQ1VTLCAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfVE9GX1RBUkdFVF9QT1MsICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfVE9GX0NPTkZJREVOQ0UsICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfVE9GX1JFRk9DVVMsICAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfVFlQRV9TRUxFQ1QsICAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfUkVGT0NVUywgICAgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfVEFSR0VUX1BPUywgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9QREFGX1RBUkdFVF9QT1MsICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9QREFGX05FWFRfUE9TLCAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9QREFGX05FQVJfUE9TLCAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9QREFGX0ZBUl9QT1MsICAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9QREFGX0NPTkZJREVOQ0UsICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9UT0ZfVEFSR0VUX1BPUywgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9UT0ZfTkVYVF9QT1MsICAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9UT0ZfTkVBUl9QT1MsICAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9UT0ZfRkFSX1BPUywgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9UT0ZfQ09ORklERU5DRSwgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9UWVBFX1NFTEVDVCwgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9ORVhUX1BPUywgICAgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9UQVJHRVRfUE9TLCAgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgIDEpOworICAgIC8qIERldkNhbURlYnVnIG1ldGFkYXRhIENBTV9JTlRGLkggQUVDICovCisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX1RBUkdFVF9MVU1BLCAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX0NPTVBfTFVNQSwgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX0FWR19MVU1BLCAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX0NVUl9MVU1BLCAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX0xJTkVDT1VOVCwgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX1JFQUxfR0FJTiwgICAgICAgIGZsb2F0LCAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX0VYUF9JTkRFWCwgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX0xVWF9JRFgsICAgICAgICAgIGZsb2F0LCAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgLyogRGV2Q2FtRGVidWcgbWV0YWRhdGEgQ0FNX0lOVEYuSCBBV0IgKi8KKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfREVWX0NBTV9BV0JfUl9HQUlOLCAgICAgICAgICAgZmxvYXQsICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfREVWX0NBTV9BV0JfR19HQUlOLCAgICAgICAgICAgZmxvYXQsICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfREVWX0NBTV9BV0JfQl9HQUlOLCAgICAgICAgICAgZmxvYXQsICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfREVWX0NBTV9BV0JfQ0NULCAgICAgICAgICAgICAgaW50MzJfdCwgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfREVWX0NBTV9BV0JfREVDSVNJT04sICAgICAgICAgaW50MzJfdCwgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAvKiBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSBlbmQgKi8KKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfSVNQX1BPU1RfU1RBVFNfU0VOU0lUSVZJVFksICAgZmxvYXQsICAgICAgICAgICAgICAgICAgICAgICAxKTsKIH0gbWV0YWRhdGFfZGF0YV90OwogCiAvKiBVcGRhdGUgY2xlYXJfbWV0YWRhdGFfYnVmZmVyKCkgZnVuY3Rpb24gd2hlbiBhIG5ldyBpc194eHhfdmFsaWQgaXMgYWRkZWQgdG8KQEAgLTEwMDIsNiArMTA0NCwxNiBAQAogCiAgICAgdWludDhfdCBpc19zdGF0c2RlYnVnX3N0YXRzX3BhcmFtc192YWxpZDsKICAgICBjYW1fc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdCBzdGF0c2RlYnVnX3N0YXRzX2J1ZmZlcl9kYXRhOworCisgICAgdWludDhfdCBpc19zdGF0c2RlYnVnX2Jlc3RhdHNfcGFyYW1zX3ZhbGlkOworICAgIGNhbV9iZXN0YXRzX2J1ZmZlcl9leGlmX2RlYnVnX3Qgc3RhdHNkZWJ1Z19iZXN0YXRzX2J1ZmZlcl9kYXRhOworCisgICAgdWludDhfdCBpc19zdGF0c2RlYnVnX2JoaXN0X3BhcmFtc192YWxpZDsKKyAgICBjYW1fYmhpc3RfYnVmZmVyX2V4aWZfZGVidWdfdCBzdGF0c2RlYnVnX2JoaXN0X2RhdGE7CisKKyAgICB1aW50OF90IGlzX3N0YXRzZGVidWdfM2FfdHVuaW5nX3BhcmFtc192YWxpZDsKKyAgICBjYW1fcTNhX3R1bmluZ19pbmZvX3Qgc3RhdHNkZWJ1Z18zYV90dW5pbmdfZGF0YTsKKwogfSBtZXRhZGF0YV9idWZmZXJfdDsKIAogdHlwZWRlZiBtZXRhZGF0YV9idWZmZXJfdCBwYXJtX2J1ZmZlcl90OwpAQCAtMTAyMyw2ICsxMDc1LDkgQEAKICAgICAgIG1ldGEtPmlzX3N0YXRzZGVidWdfYWZfcGFyYW1zX3ZhbGlkID0gMDsKICAgICAgIG1ldGEtPmlzX3N0YXRzZGVidWdfYXNkX3BhcmFtc192YWxpZCA9IDA7CiAgICAgICBtZXRhLT5pc19zdGF0c2RlYnVnX3N0YXRzX3BhcmFtc192YWxpZCA9IDA7CisgICAgICBtZXRhLT5pc19zdGF0c2RlYnVnX2Jlc3RhdHNfcGFyYW1zX3ZhbGlkID0gMDsKKyAgICAgIG1ldGEtPmlzX3N0YXRzZGVidWdfYmhpc3RfcGFyYW1zX3ZhbGlkID0gMDsKKyAgICAgIG1ldGEtPmlzX3N0YXRzZGVidWdfM2FfdHVuaW5nX3BhcmFtc192YWxpZCA9IDA7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9zdGFjay9jb21tb24vY2FtX3R5cGVzLmggYi9RQ2FtZXJhMi9zdGFjay9jb21tb24vY2FtX3R5cGVzLmgKaW5kZXggOTcyNzE4YS4uY2RkMDhiMiAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvc3RhY2svY29tbW9uL2NhbV90eXBlcy5oCisrKyBiL1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9jYW1fdHlwZXMuaApAQCAtMzUsMTMgKzM1LDE1IEBACiAjaW5jbHVkZSA8bWVkaWEvbXNtYl9jYW1lcmEuaD4KIAogI2RlZmluZSBDQU1fTUFYX05VTV9CVUZTX1BFUl9TVFJFQU0gNjQKLSNkZWZpbmUgTUFYX01FVEFEQVRBX1BSSVZBVEVfUEFZTE9BRF9TSVpFX0lOX0JZVEVTIDgwOTYKKyNkZWZpbmUgTUFYX01FVEFEQVRBX1BSSVZBVEVfUEFZTE9BRF9TSVpFX0lOX0JZVEVTIDY5NzIKICNkZWZpbmUgQVdCX0RFQlVHX0RBVEFfU0laRSAgICAgICAgICAgICAgICg0NTAwMCkKICNkZWZpbmUgQUVDX0RFQlVHX0RBVEFfU0laRSAgICAgICAgICAgICAgICg1MDAwKQotI2RlZmluZSBBRl9ERUJVR19EQVRBX1NJWkUgICAgICAgICAgICAgICAgKDEwMDAwKQotI2RlZmluZSBBRl9TVEFUU19ERUJVR19EQVRBX1NJWkUgICAgICAgICAgKDQwMDAwKQorI2RlZmluZSBBRl9ERUJVR19EQVRBX1NJWkUgICAgICAgICAgICAgICAgKDUwMDAwKQogI2RlZmluZSBBU0RfREVCVUdfREFUQV9TSVpFICAgICAgICAgICAgICAgKDEwMCkKICNkZWZpbmUgU1RBVFNfQlVGRkVSX0RFQlVHX0RBVEFfU0laRSAgICAgICg3NTAwMCkKKyNkZWZpbmUgQkVTVEFUU19CVUZGRVJfREVCVUdfREFUQV9TSVpFICAgICgxNTAwMDApCisjZGVmaW5lIEJISVNUX1NUQVRTX0RFQlVHX0RBVEFfU0laRSAgICAgICAoNzAwMDApCisjZGVmaW5lIFRVTklOR19JTkZPX0RFQlVHX0RBVEFfU0laRSAgICAgICAoNCkKIAogI2RlZmluZSBDRUlMSU5HNjQoWCkgKCgoWCkgKyAweDAwMDNGKSAmIDB4RkZGRkZGQzApCiAjZGVmaW5lIENFSUxJTkczMihYKSAoKChYKSArIDB4MDAwMUYpICYgMHhGRkZGRkZFMCkKQEAgLTEwNyw2ICsxMDksOCBAQAogI2RlZmluZSBNQVhfSU5GTElHSFRfUkVRVUVTVFMgIDYKICNkZWZpbmUgTUFYX0lORkxJR0hUX0JMT0IgICAgICAzCiAjZGVmaW5lIE1JTl9JTkZMSUdIVF9SRVFVRVNUUyAgMworI2RlZmluZSBNSU5fSU5GTElHSFRfNjBGUFNfUkVRVUVTVFMgKDYpCisjZGVmaW5lIE1BWF9JTkZMSUdIVF82MEZQU19SRVFVRVNUUyAoOCkKICNkZWZpbmUgTUFYX0lORkxJR0hUX1JFUFJPQ0VTU19SRVFVRVNUUyAxCiAjZGVmaW5lIE1BWF9JTkZMSUdIVF9IRlJfUkVRVUVTVFMgKDQ4KQogI2RlZmluZSBNSU5fSU5GTElHSFRfSEZSX1JFUVVFU1RTICg0MCkKQEAgLTE0MiwxOCArMTQ2LDI0IEBACiAvKiBEZWZpbmVzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgY29sb3IgY29ycmVjdGlvbiBtYXRyaXggKENDTSkgKi8KICNkZWZpbmUgQVdCX05VTV9DQ01fQ09MUyAoMykKIAorLyogSW5kZXggdG8gc3dpdGNoIEgvVyB0byBjb25zdW1lIHRvIGZyZWUtcnVuIFEqLworI2RlZmluZSBDQU1fRlJFRVJVTl9JRFggMHhGRkZGRkZGRgorCit0eXBlZGVmIHVpbnQ2NF90IGNhbV9mZWF0dXJlX21hc2tfdDsKKwogdHlwZWRlZiBlbnVtIHsKICAgICBDQU1fSEFMX1YxID0gMSwKICAgICBDQU1fSEFMX1YzID0gMwogfSBjYW1faGFsX3ZlcnNpb25fdDsKIAotdHlwZWRlZiBlbnVtIHsKLSAgICBDQU1fU1RBVFVTX1NVQ0NFU1MsICAgICAgIC8qIE9wZXJhdGlvbiBTdWNjZWRlZCAqLwotICAgIENBTV9TVEFUVVNfRkFJTEVELCAgICAgICAgLyogRmFpbHVyZSBpbiBkb2luZyBvcGVyYXRpb24gKi8KLSAgICBDQU1fU1RBVFVTX0lOVkFMSURfUEFSTSwgIC8qIEluYXZsaWQgcGFyYW1ldGVyIHByb3ZpZGVkICovCi0gICAgQ0FNX1NUQVRVU19OT1RfU1VQUE9SVEVELCAvKiBQYXJhbWV0ZXIvb3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgKi8KLSAgICBDQU1fU1RBVFVTX0FDQ0VQVEVELCAgICAgIC8qIFBhcmFtZXRlciBhY2NlcHRlZCAqLwotICAgIENBTV9TVEFUVVNfTUFYLAorIHR5cGVkZWYgZW51bSB7CisgICAgQ0FNX1NUQVRVU19JTlZBTElEX1BBUk0gID0gLTQsIC8qIEluYXZsaWQgcGFyYW1ldGVyIHByb3ZpZGVkICovCisgICAgQ0FNX1NUQVRVU19OT1RfU1VQUE9SVEVEID0gLTMsIC8qIFBhcmFtZXRlci9vcGVyYXRpb24gbm90IHN1cHBvcnRlZCAqLworICAgIENBTV9TVEFUVVNfQlVTWSAgICAgICAgICA9IC0yLCAvKiBvcGVyYXRpb24gYnVzeSAqLworICAgIENBTV9TVEFUVVNfRkFJTEVEICAgICAgICA9IC0xLCAvKiBGYWlsdXJlIGluIGRvaW5nIG9wZXJhdGlvbiAqLworICAgIENBTV9TVEFUVVNfU1VDQ0VTUyAgICAgICA9ICAwLCAvKiBPcGVyYXRpb24gU3VjY2VkZWQgKi8KKyAgICBDQU1fU1RBVFVTX0FDQ0VQVEVEICAgICAgPSAgMSwgLyogUGFyYW1ldGVyIGFjY2VwdGVkICovCisgICAgQ0FNX1NUQVRVU19NQVggICAgICAgICAgID0gIDIsCiB9IGNhbV9zdGF0dXNfdDsKIAogdHlwZWRlZiBlbnVtIHsKQEAgLTQyNSw2ICs0MzUsNyBAQAogICAgIHVpbnQzMl90IGNvb2tpZTsgICAgICAvKiBjb3VsZCBiZSBqb2JfaWQodWludDMyX3QpIHRvIGlkZW50aWZ5IG1hcHBpbmcgam9iICovCiAgICAgaW50MzJfdCBmZDsgICAgICAgICAgIC8qIG9yaWdpbiBmZCAqLwogICAgIHNpemVfdCBzaXplOyAgICAgICAgICAvKiBzaXplIG9mIHRoZSBidWZmZXIgKi8KKyAgICB2b2lkICpidWZmZXI7ICAgICAgICAgLyogQnVmZmVyIHBvaW50ZXIgKi8KIH0gY2FtX2J1Zl9tYXBfdHlwZTsKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtNDY0LDYgKzQ3NSw3IEBACiAgICAgICAgIGNhbV9idWZfdW5tYXBfdHlwZV9saXN0IGJ1Zl91bm1hcF9saXN0OwogICAgIH0gcGF5bG9hZDsKIH0gY2FtX3NvY2tfcGFja2V0X3Q7Cit0eXBlZGVmIGNhbV9zb2NrX3BhY2tldF90IGNhbV9yZWdfYnVmX3Q7CiAKIHR5cGVkZWYgZW51bSB7CiAgICAgQ0FNX01PREVfMkQgPSAoMTw8MCksCkBAIC01NTYsOSArNTY4LDkgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIGNhbV9oZnJfbW9kZV90IG1vZGU7Ci0gICAgY2FtX2RpbWVuc2lvbl90IGRpbTsKLSAgICB1aW50OF90IGZyYW1lX3NraXA7Ci0gICAgdWludDhfdCBsaXZlc25hcHNob3Rfc2l6ZXNfdGJsX2NudDsgICAgICAgICAgICAgICAgICAgICAvKiBsaXZlc25hcHNob3Qgc2l6ZXMgdGFibGUgc2l6ZSAqLworICAgIHVpbnQ4X3QgZGltX2NudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGZyIHNpemVzIHRhYmxlIGNvdW50ICovCisgICAgY2FtX2RpbWVuc2lvbl90IGRpbVtNQVhfU0laRVNfQ05UXTsgICAgICAgICAgICAgICAgICAgICAvKiBoZnIgc2l6ZXMgdGFibGUgKi8KKyAgICB1aW50OF90IGxpdmVzbmFwc2hvdF9zaXplc190YmxfY250OyAgICAgICAgICAgICAgICAgICAgIC8qIGxpdmVzbmFwc2hvdCBzaXplcyB0YWJsZSBjb3VudCAqLwogICAgIGNhbV9kaW1lbnNpb25fdCBsaXZlc25hcHNob3Rfc2l6ZXNfdGJsW01BWF9TSVpFU19DTlRdOyAgLyogbGl2ZXNuYXBzaG90IHNpemVzIHRhYmxlICovCiB9IGNhbV9oZnJfaW5mb190OwogCkBAIC0xNDk5LDE1ICsxNTExLDEwIEBACiAgICAgY2hhciBhd2JfcHJpdmF0ZV9kZWJ1Z19kYXRhW0FXQl9ERUJVR19EQVRBX1NJWkVdOwogfSBjYW1fYXdiX2V4aWZfZGVidWdfdDsKIAorLyogQUYgZGVidWcgZGF0YSBmb3IgZXhpZiovCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgaW50MzJfdCBhZl9kZWJ1Z19kYXRhX3NpemU7Ci0gICAgaW50MzJfdCBoYWZfZGVidWdfZGF0YV9zaXplOwotICAgIGludDMyX3QgdG9mX2RlYnVnX2RhdGFfc2l6ZTsKLSAgICBpbnQzMl90IGRjaWFmX2RlYnVnX2RhdGFfc2l6ZTsKLSAgICBpbnQzMl90IHBkYWZfZGVidWdfZGF0YV9zaXplOwogICAgIGNoYXIgYWZfcHJpdmF0ZV9kZWJ1Z19kYXRhW0FGX0RFQlVHX0RBVEFfU0laRV07Ci0gICAgaW50MzJfdCBhZl9zdGF0c19idWZmZXJfc2l6ZTsKLSAgICBjaGFyIGFmX3N0YXRzX3ByaXZhdGVfZGVidWdfZGF0YVtBRl9TVEFUU19ERUJVR19EQVRBX1NJWkVdOwogfSBjYW1fYWZfZXhpZl9kZWJ1Z190OwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0xNTE3LDExICsxNTI0LDIxIEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBpbnQzMl90IGJnX3N0YXRzX2J1ZmZlcl9zaXplOwotICAgIGludDMyX3QgYmhpc3Rfc3RhdHNfYnVmZmVyX3NpemU7CiAgICAgaW50MzJfdCBiZ19jb25maWdfYnVmZmVyX3NpemU7CiAgICAgY2hhciBzdGF0c19idWZmZXJfcHJpdmF0ZV9kZWJ1Z19kYXRhW1NUQVRTX0JVRkZFUl9ERUJVR19EQVRBX1NJWkVdOwogfSBjYW1fc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdDsKIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgYmVfc3RhdHNfYnVmZmVyX3NpemU7CisgICAgaW50MzJfdCBiZV9jb25maWdfYnVmZmVyX3NpemU7CisgICAgY2hhciBiZXN0YXRzX2J1ZmZlcl9wcml2YXRlX2RlYnVnX2RhdGFbQkVTVEFUU19CVUZGRVJfREVCVUdfREFUQV9TSVpFXTsKK30gY2FtX2Jlc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgYmhpc3Rfc3RhdHNfYnVmZmVyX3NpemU7CisgICAgY2hhciBiaGlzdF9wcml2YXRlX2RlYnVnX2RhdGFbQkhJU1RfU1RBVFNfREVCVUdfREFUQV9TSVpFXTsKK30gY2FtX2JoaXN0X2J1ZmZlcl9leGlmX2RlYnVnX3Q7CisKIC8qIDNBIHZlcnNpb24qLwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIHVpbnQxNl90IG1ham9yX3ZlcnNpb247CkBAIC0xNTMxLDYgKzE1NDgsMTEgQEAKIH0gY2FtX3EzYV92ZXJzaW9uX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQzMl90IHR1bmluZ19pbmZvX2J1ZmZlcl9zaXplOworICAgIGNoYXIgdHVuaW5nX2luZm9fcHJpdmF0ZV9kZWJ1Z19kYXRhW1RVTklOR19JTkZPX0RFQlVHX0RBVEFfU0laRV07Cit9IGNhbV9xM2FfdHVuaW5nX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgewogICAgIHVpbnQzMl90IHR1bmluZ19kYXRhX3ZlcnNpb247CiAgICAgc2l6ZV90IHR1bmluZ19zZW5zb3JfZGF0YV9zaXplOwogICAgIHNpemVfdCB0dW5pbmdfdmZlX2RhdGFfc2l6ZTsKQEAgLTE1NzgsMTEgKzE2MDAsMjEgQEAKICAgIHVpbnQzMl90IG1heF9idWZmZXJzOwogfSBjYW1fYnVmZmVyX2luZm9fdDsKIAordHlwZWRlZiBlbnVtIHsKKyAgICAvKiBTdGFuZGFsb25lIGNhbWVyYSAod29uJ3QgYmUgbGlua2VkKSAqLworICAgIENBTV9UWVBFX1NUQU5EQUxPTkU9MCwKKyAgICAvKiBNYWluIGNhbWVyYSBvZiB0aGUgcmVsYXRlZCBjYW0gc3Vic3lzdGVtIHdoaWNoIGNvbnRyb2xzCisgICAgICAgSFcgc3luYyBhdCBzZW5zb3IgbGV2ZWwqLworICAgIENBTV9UWVBFX01BSU4sCisgICAgLyogQXV4IGNhbWVyYSBvZiB0aGUgcmVsYXRlZCBjYW0gc3Vic3lzdGVtICovCisgICAgQ0FNX1RZUEVfQVVYCit9IGNhbV9zeW5jX3R5cGVfdDsKKwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIGNhbV9kaW1lbnNpb25fdCBzdHJlYW1fc2l6ZXNbTUFYX05VTV9TVFJFQU1TXTsKICAgICB1aW50MzJfdCBudW1fc3RyZWFtczsKICAgICBjYW1fc3RyZWFtX3R5cGVfdCB0eXBlW01BWF9OVU1fU1RSRUFNU107Ci0gICAgdWludDMyX3QgcG9zdHByb2Nlc3NfbWFza1tNQVhfTlVNX1NUUkVBTVNdOworICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrW01BWF9OVU1fU1RSRUFNU107CiAgICAgY2FtX2J1ZmZlcl9pbmZvX3QgYnVmZmVyX2luZm87CiAgICAgY2FtX2lzX3R5cGVfdCBpc190eXBlOwogICAgIGNhbV9oZnJfbW9kZV90IGhmcl9tb2RlOwpAQCAtMTU5MSw2ICsxNjIzLDcgQEAKICAgICB1aW50MzJfdCBtaW5fc3RyaWRlOwogICAgIHVpbnQzMl90IG1pbl9zY2FubGluZTsKICAgICB1aW50OF90IGJhdGNoX3NpemU7CisgICAgY2FtX3N5bmNfdHlwZV90IHN5bmNfdHlwZTsKIH0gY2FtX3N0cmVhbV9zaXplX2luZm9fdDsKIAogCkBAIC0xNjIzLDggKzE2NTYsMTMgQEAKIH0gY2FtX2h3X2RhdGFfb3ZlcndyaXRlX3Q7CiAKIHR5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBzdHJlYW1JRDsKKyAgICB1aW50MzJfdCBidWZfaW5kZXg7Cit9IGNhbV9zdHJlYW1fcmVxdWVzdF90OworCit0eXBlZGVmIHN0cnVjdCB7CiAgICAgdWludDMyX3QgbnVtX3N0cmVhbXM7Ci0gICAgdWludDMyX3Qgc3RyZWFtSURbTUFYX05VTV9TVFJFQU1TXTsKKyAgICBjYW1fc3RyZWFtX3JlcXVlc3RfdCBzdHJlYW1fcmVxdWVzdFtNQVhfTlVNX1NUUkVBTVNdOwogfSBjYW1fc3RyZWFtX0lEX3Q7CiAKIC8qQ0FDIE1lc3NhZ2UgcG9zdGVkIGR1cmluZyBwaXBlbGluZSovCkBAIC0xNzA5LDYgKzE3NDcsMTQgQEAKICAgICB1aW50OF90IGlzX3N0YXRzX2J1ZmZlcl9leGlmX2RlYnVnX3ZhbGlkOwogICAgIGNhbV9zdGF0c19idWZmZXJfZXhpZl9kZWJ1Z190IHN0YXRzX2J1ZmZlcl9leGlmX2RlYnVnX3BhcmFtczsKIAorICAgIC8qIEJFIHN0YXRzIGJ1ZmZlciBleGlmIGRlYnVnIHBhcmFtZXRlcnMgKi8KKyAgICB1aW50OF90IGlzX2Jlc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdmFsaWQ7CisgICAgY2FtX2Jlc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdCBiZXN0YXRzX2J1ZmZlcl9leGlmX2RlYnVnX3BhcmFtczsKKworICAgIC8qIEJoaXN0IGV4aWYgZGVidWcgcGFyYW1ldGVycy4gKi8KKyAgICB1aW50OF90IGlzX2JoaXN0X2V4aWZfZGVidWdfdmFsaWQ7CisgICAgY2FtX2JoaXN0X2J1ZmZlcl9leGlmX2RlYnVnX3QgYmhpc3RfZXhpZl9kZWJ1Z19wYXJhbXM7CisKICAgICAvKiBBV0IgcGFyYW1ldGVycyAqLwogICAgIHVpbnQ4X3QgaXNfYXdiX3BhcmFtc192YWxpZDsKICAgICBjYW1fYXdiX3BhcmFtc190IGF3Yl9wYXJhbXM7CkBAIC0xODM3LDYgKzE4ODMsOSBAQAogICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR19BRiwKICAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQVNELAogICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR19TVEFUUywKKyAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQkVTVEFUUywKKyAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQkhJU1QsCisgICAgQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHXzNBX1RVTklORywKICAgICBDQU1fSU5URl9QQVJNX0dFVF9DSFJPTUFUSVgsCiAgICAgQ0FNX0lOVEZfUEFSTV9TRVRfUkVMT0FEX0NIUk9NQVRJWCwKICAgICBDQU1fSU5URl9QQVJNX1NFVF9BVVRPRk9DVVNUVU5JTkcsIC8qIDgwICovCkBAIC0yMDg2LDYgKzIxMzUsNyBAQAogICAgIC8qQmxhY2sgbGV2ZWwgcGFyYW1ldGVycyovCiAgICAgQ0FNX0lOVEZfTUVUQV9MREFGX0VYSUYsCiAgICAgQ0FNX0lOVEZfTUVUQV9CTEFDS19MRVZFTF9TT1VSQ0VfUEFUVEVSTiwKKyAgICAvKiBBcHBsaWVkIGJsYWNrIGxldmVsIHBhdHRlcm4gaW4gUkdHQiBvcmRlciAqLwogICAgIENBTV9JTlRGX01FVEFfQkxBQ0tfTEVWRUxfQVBQTElFRF9QQVRURVJOLCAvKiAyMDAgKi8KICAgICBDQU1fSU5URl9NRVRBX0NEU19EQVRBLAogICAgIC8qM0EgbG93IGxpZ2h0IGxldmVsIGluZm9ybWF0aW9uKi8KQEAgLTIxMTUsMTEgKzIxNjUsNjMgQEAKICAgICBDQU1fSU5URl9NRVRBX1RPVUNIX0FFX1JFU1VMVCwKICAgICAvKiBQYXJhbSBmb3IgdXBkYXRpbmcgaW5pdGlhbCBleHBvc3VyZSBpbmRleCB2YWx1ZSovCiAgICAgQ0FNX0lOVEZfUEFSTV9JTklUSUFMX0VYUE9TVVJFX0lOREVYLAotICAgIC8qIEdhaW4gYXBwbGllZCBwb3N0IHJhdyBjYXB0cnVlLgorICAgIC8qIEdhaW4gYXBwbGllZCBwb3N0IHJhdyBjYXB0cnVlIHByaW9yIHRvIHN0YXRzIGNvbGxlY3Rpb24uCiAgICAgICAgSVNQIGRpZ2l0YWwgZ2FpbiAqLwogICAgIENBTV9JTlRGX01FVEFfSVNQX1NFTlNJVElWSVRZLAogICAgIC8qIFBhcmFtIGZvciBlbmFibGluZyBpbnN0YW50IGFlYyovCiAgICAgQ0FNX0lOVEZfUEFSTV9JTlNUQU5UX0FFQywKKyAgICAvKiBXaGV0aGVyIHRvIGVuYWJsZSBoeWJyaWQgYWUgbW9kZSAqLworICAgIENBTV9JTlRGX01FVEFfSFlCUklEX0FFLAorICAgIC8qIERldkNhbURlYnVnIG1ldGFkYXRhIENBTV9UWVBFUy5oICovCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0VOQUJMRSwKKyAgICAvKiBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSBDQU1fVFlQRVMuaCBBRiAqLworICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9MRU5TX1BPU0lUSU9OLAorICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9UT0ZfQ09ORklERU5DRSwKKyAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfVE9GX0RJU1RBTkNFLAorICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9MVU1BLAorICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9IQUZfU1RBVEUsCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfUERBRl9UQVJHRVRfUE9TLAorICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9NT05JVE9SX1BEQUZfQ09ORklERU5DRSwKKyAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfTU9OSVRPUl9QREFGX1JFRk9DVVMsCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfVE9GX1RBUkdFVF9QT1MsCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfVE9GX0NPTkZJREVOQ0UsCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfVE9GX1JFRk9DVVMsCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfVFlQRV9TRUxFQ1QsCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX01PTklUT1JfUkVGT0NVUywKKyAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfTU9OSVRPUl9UQVJHRVRfUE9TLAorICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9TRUFSQ0hfUERBRl9UQVJHRVRfUE9TLAorICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9TRUFSQ0hfUERBRl9ORVhUX1BPUywKKyAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfU0VBUkNIX1BEQUZfTkVBUl9QT1MsCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9QREFGX0ZBUl9QT1MsCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9QREFGX0NPTkZJREVOQ0UsCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9UT0ZfVEFSR0VUX1BPUywKKyAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfU0VBUkNIX1RPRl9ORVhUX1BPUywKKyAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfU0VBUkNIX1RPRl9ORUFSX1BPUywKKyAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfU0VBUkNIX1RPRl9GQVJfUE9TLAorICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9TRUFSQ0hfVE9GX0NPTkZJREVOQ0UsCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FGX1NFQVJDSF9UWVBFX1NFTEVDVCwKKyAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUZfU0VBUkNIX05FWFRfUE9TLAorICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRl9TRUFSQ0hfVEFSR0VUX1BPUywKKyAgICAvKiBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSBDQU1fVFlQRVMuaCBBRUMgKi8KKyAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX1RBUkdFVF9MVU1BLAorICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRUNfQ09NUF9MVU1BLAorICAgIENBTV9JTlRGX01FVEFfREVWX0NBTV9BRUNfQVZHX0xVTUEsCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FFQ19DVVJfTFVNQSwKKyAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX0xJTkVDT1VOVCwKKyAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX1JFQUxfR0FJTiwKKyAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX0VYUF9JTkRFWCwKKyAgICBDQU1fSU5URl9NRVRBX0RFVl9DQU1fQUVDX0xVWF9JRFgsCisgICAgLyogRGV2Q2FtRGVidWcgbWV0YWRhdGEgQ0FNX1RZUEVTLmggQVdCICovCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FXQl9SX0dBSU4sCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FXQl9HX0dBSU4sCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FXQl9CX0dBSU4sCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FXQl9DQ1QsCisgICAgQ0FNX0lOVEZfTUVUQV9ERVZfQ0FNX0FXQl9ERUNJU0lPTiwKKyAgICAvKiBEZXZDYW1EZWJ1ZyBtZXRhZGF0YSBlbmQgKi8KKyAgICAvKiBBRiBzY2VuZSBjaGFuZ2UgKi8KKyAgICBDQU1fSU5URl9NRVRBX0FGX1NDRU5FX0NIQU5HRSwKKyAgICAvKiBHYWluIGFwcGxpZWQgcG9zdCBzdGF0cyBjb2xsZWN0aW9uIGluIElTUCAqLworICAgIENBTV9JTlRGX01FVEFfSVNQX1BPU1RfU1RBVFNfU0VOU0lUSVZJVFksCiAgICAgQ0FNX0lOVEZfUEFSTV9NQVgKIH0gY2FtX2ludGZfcGFybV90eXBlX3Q7CiAKQEAgLTIyMzQsNyArMjMzNiw3IEBACiAjZGVmaW5lIENBTV9NQVhfTUFQX1dJRFRIICAgICAgICAgNgogI2RlZmluZSBDQU1fTUFYX1NIQURJTkdfTUFQX1dJRFRIIDE3CiAjZGVmaW5lIENBTV9NQVhfU0hBRElOR19NQVBfSEVJR0hUIDEzCi0jZGVmaW5lIENBTV9NQVhfVE9ORU1BUF9DVVJWRV9TSVpFICAgIDUxMgorI2RlZmluZSBDQU1fTUFYX1RPTkVNQVBfQ1VSVkVfU0laRSA2NAogI2RlZmluZSBDQU1fTUFYX0ZMQVNIX0JSQUNLRVRJTkcgICAgNQogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0yMjc3LDExICsyMzc5LDYgQEAKIH0gY2FtX2ZsYXNoX2N0cmxfdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVpbnQ4X3QgZnJhbWVfZHJvcHBlZDsgLyogIFRoaXMgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBhbnkgc3RyZWFtIGJ1ZmZlciBpcyBkcm9wcGVkIG9yIG5vdCAqLwotICAgIGNhbV9zdHJlYW1fSURfdCBjYW1fc3RyZWFtX0lEOyAvKiBpZiBkcm9wcGVkLCBTdHJlYW0gSUQgb2YgZHJvcHBlZCBzdHJlYW1zICovCi19IGNhbV9mcmFtZV9kcm9wcGVkX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKICAgICB1aW50OF90IGFlX21vZGU7CiAgICAgdWludDhfdCBhd2JfbW9kZTsKICAgICB1aW50OF90IGFmX21vZGU7CkBAIC0yMzEyLDQwICsyNDA5LDQwIEBACiAgICAgaW50MzJfdCBzdGVwOwogfSBjYW1fY29udHJvbF9yYW5nZV90OwogCi0jZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfTk9ORSAgICAgICAgICAgIDBVCi0jZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfRkFDRV9ERVRFQ1RJT04gKDFVPDwwKQotI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0RFTk9JU0UyRCAgICAgICgxVTw8MSkKLSNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9DUk9QICAgICAgICAgICAoMVU8PDIpCi0jZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfUk9UQVRJT04gICAgICAgKDFVPDwzKQotI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0ZMSVAgICAgICAgICAgICgxVTw8NCkKLSNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9IRFIgICAgICAgICAgICAoMVU8PDUpCi0jZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfUkVHSVNURVJfRkFDRSAgKDFVPDw2KQotI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX1NIQVJQTkVTUyAgICAgICgxVTw8NykKLSNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9WSURFT19IRFIgICAgICAoMVU8PDgpCi0jZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfQ0FDICAgICAgICAgICAgKDFVPDw5KQotI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX1NDQUxFICAgICAgICAgICgxVTw8MTApCi0jZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfRUZGRUNUICAgICAgICAgKDFVPDwxMSkKLSNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9VQklGT0NVUyAgICAgICAoMVU8PDEyKQotI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0NIUk9NQV9GTEFTSCAgICgxVTw8MTMpCi0jZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfT1BUSVpPT00gICAgICAgKDFVPDwxNCkKLSNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9TRU5TT1JfSERSICAgICAoMVU8PDE1KQotI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX1JFRk9DVVMgICAgICAgICgxVTw8MTYpCi0jZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfQ1BQX1ROUiAgICAgICAgKDFVPDwxNykKLSNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9SQVdfUFJPQ0VTU0lORyAoMVU8PDE4KQotI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX1RSVUVQT1JUUkFJVCAgICgxVTw8MTkpCi0jZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfTExWRCAgICAgICAgICAgKDFVPDwyMCkKLSNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9ESVMyMCAgICAgICAgICAoMVU8PDIxKQotI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX1NUSUxMTU9SRSAgICAgICgxVTw8MjIpCi0jZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfRENSRiAgICAgICAgICAgKDFVPDwyMykKLSNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9DRFMgICAgICAgICAgICAoMVU8PDI0KQotI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0VaVFVORSAgICAgICAgICgxVTw8MjUpCi0jZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfRFNETiAgICAgICAgICAgKDFVPDwyNikgLy9TcGVjaWFsIENEUyBpbiBDUFAgYmxvY2sKLSNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9TVzJEICAgICAgICAgICAoMVU8PDI3KQotI2RlZmluZSBDQU1fT0VNX0ZFQVRVUkVfMSAgICAgICAgICAgICAgICgxVTw8MjgpCi0jZGVmaW5lIENBTV9PRU1fRkVBVFVSRV8yICAgICAgICAgICAgICAgKDFVPDwyOSkKLSNkZWZpbmUgQ0FNX1FUSV9GRUFUVVJFX1NXX1ROUiAgICAgICAgICAoMVU8PDMwKQotI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX01FVEFEQVRBX1BST0NFU1NJTkcgKDFVPDwzMSkKLSNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9NQVggICAgICAgICAgICAzMgorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX05PTkUgICAgICAgICAgICAoY2FtX2ZlYXR1cmVfbWFza190KTBVTAorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0ZBQ0VfREVURUNUSU9OICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MCkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9ERU5PSVNFMkQgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDEpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfQ1JPUCAgICAgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwyKQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX1JPVEFUSU9OICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MykKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9GTElQICAgICAgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDQpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfSERSICAgICAgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDw1KQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX1JFR0lTVEVSX0ZBQ0UgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8NikKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9TSEFSUE5FU1MgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDcpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfVklERU9fSERSICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDw4KQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0NBQyAgICAgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8OSkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9TQ0FMRSAgICAgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDEwKQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0VGRkVDVCAgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MTEpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfVUJJRk9DVVMgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwxMikKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9DSFJPTUFfRkxBU0ggICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDEzKQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX09QVElaT09NICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MTQpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfU0VOU09SX0hEUiAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwxNSkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9SRUZPQ1VTICAgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDE2KQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0NQUF9UTlIgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MTcpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfUkFXX1BST0NFU1NJTkcgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwxOCkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9UUlVFUE9SVFJBSVQgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDE5KQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0xMVkQgICAgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MjApCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfRElTMjAgICAgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwyMSkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9TVElMTE1PUkUgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDIyKQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0RDUkYgICAgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MjMpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfQ0RTICAgICAgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwyNCkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9FWlRVTkUgICAgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDI1KQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0RTRE4gICAgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MjYpIC8vU3BlY2lhbCBDRFMgaW4gQ1BQIGJsb2NrCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfU1cyRCAgICAgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwyNykKKyNkZWZpbmUgQ0FNX09FTV9GRUFUVVJFXzEgICAgICAgICAgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDI4KQorI2RlZmluZSBDQU1fT0VNX0ZFQVRVUkVfMiAgICAgICAgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MjkpCisjZGVmaW5lIENBTV9RVElfRkVBVFVSRV9TV19UTlIgICAgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwzMCkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9NRVRBREFUQV9QUk9DRVNTSU5HICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MzEpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfUEFBRiAgICAgICAgICAgKCgoY2FtX2ZlYXR1cmVfbWFza190KTFVTCk8PDMyKQogI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX1BQX1NVUEVSU0VUICAgIChDQU1fUUNPTV9GRUFUVVJFX0RFTk9JU0UyRHxDQU1fUUNPTV9GRUFUVVJFX0NST1B8XAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX1JPVEFUSU9OfENBTV9RQ09NX0ZFQVRVUkVfU0hBUlBORVNTfFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9TQ0FMRXxDQU1fUUNPTV9GRUFUVVJFX0NBQ3xcCkBAIC0yNDYzLDcgKzI1NjAsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgLyogcmVwcm9jZXNzIGZlYXR1cmUgbWFzayAqLwotICAgIHVpbnQzMl90IGZlYXR1cmVfbWFzazsKKyAgICBjYW1fZmVhdHVyZV9tYXNrX3QgZmVhdHVyZV9tYXNrOwogCiAgICAgLyogaW5kaXZpZHVhbCBzZXR0aW5nIGZvciBmZWF0dXJlcyB0byBiZSByZXByb2Nlc3NlZCAqLwogICAgIGNhbV9kZW5vaXNlX3BhcmFtX3QgZGVub2lzZTJkOwpAQCAtMjYyMyw2ICsyNzIwLDggQEAKICAgICBDQU1fUEVSRl9OT1JNQUwgPSAwLAogICAgIENBTV9QRVJGX0hJR0gsCiAgICAgQ0FNX1BFUkZfSElHSF9QRVJGT1JNQU5DRSwKKyAgICBDQU1fUEVSRl9SRVNFVCwKKyAgICBDQU1fUEVSRl9TRVQKIH0gY2FtX3BlcmZfbW9kZV90OwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0yNjU1LDYgKzI3NTQsNDQgQEAKICAgICBDQU1fTUFOVUFMX0NBUFRVUkVfVFlQRV80ICAgIC8qT2ZmbGluZSBSQVcgcHJvY2Vzc2luZyB3aXRoIG11bHRpcGxlIFJBVyovCiB9IGNhbV9tYW51YWxfY2FwdHVyZV90eXBlOwogCit0eXBlZGVmIGVudW0geworICAgIENBTV9BTkFMWVNJU19JTkZPX0ZEX1NUSUxMLCAgIC8qQW5hbHlzaXMgcmVxdWlyZW1lbnRzIGZvciBTVElMTCBQUkVWSUVXKi8KKyAgICBDQU1fQU5BTFlTSVNfSU5GT19GRF9WSURFTywgICAvKkFuYWx5c2lzIHJlcXVpcmVtZW50cyBmb3IgVklERU8qLworICAgIENBTV9BTkFMWVNJU19JTkZPX1BBQUYsICAgICAgIC8qQW5hbHlzaXMgcmVxdWlyZW1lbnRzIGZvciBQQUFGKi8KKyAgICBDQU1fQU5BTFlTSVNfSU5GT19NQVgsICAgICAvKk1heCBudW1iZXIqLworfSBjYW1fYW5hbHlzaXNfaW5mb190eXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogV2hldGhlciB0aGUgaW5mb3JtYXRpb24gaGVyZSBpcyB2YWxpZCBvciBub3QgKi8KKyAgICB1aW50OF90IHZhbGlkOworCisgICAgLyogV2hldGhlciBhbmFseXNpcyBzdXBwb3J0ZWQgYnkgaHcgKi8KKyAgICB1aW50OF90IGh3X2FuYWx5c2lzX3N1cHBvcnRlZDsKKworICAgIC8qIEFuYWx5c2lzIHN0cmVhbSBtYXggc3VwcG9ydGVkIHNpemUgKi8KKyAgICBjYW1fZGltZW5zaW9uX3QgYW5hbHlzaXNfbWF4X3JlczsKKworICAgIC8qIEFuYWx5c2lzIHN0cmVhbSBwYWRkaW5nIGluZm8gKi8KKyAgICBjYW1fcGFkZGluZ19pbmZvX3QgYW5hbHlzaXNfcGFkZGluZ19pbmZvOworCisgICAgLyogQW5hbHlzaXMgZm9ybWF0ICovCisgICAgY2FtX2Zvcm1hdF90IGFuYWx5c2lzX2Zvcm1hdDsKKworICAgIC8qIEFuYWx5c2lzIHJlY29tbWVuZGVkIHNpemUgKi8KKyAgICBjYW1fZGltZW5zaW9uX3QgYW5hbHlzaXNfcmVjb21tZW5kZWRfcmVzOworfSBjYW1fYW5hbHlzaXNfaW5mb190OworCisvKiogbW1fY2FtZXJhX2V2ZW50X3Q6IHN0cnVjdHVyZSBmb3IgZXZlbnQKKyogICAgQHNlcnZlcl9ldmVudF90eXBlIDogZXZlbnQgdHlwZSBmcm9tIHNlcmVyCisqICAgIEBzdGF0dXMgOiBzdGF0dXMgb2YgYW4gZXZlbnQsIHZhbHVlIGNvdWxkIGJlCisqICAgICAgICAgICAgICBDQU1fU1RBVFVTX1NVQ0NFU1MKKyogICAgICAgICAgICAgIENBTV9TVEFUVVNfRkFJTEVECisqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1fZXZlbnRfdHlwZV90IHNlcnZlcl9ldmVudF90eXBlOworICAgIHVpbnQzMl90IHN0YXR1czsKK30gY2FtX2V2ZW50X3Q7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBFTlVNIGRlZmluaXRpb24gZm9yIGN1c3RvbSBwYXJhbWV0ZXIgdHlwZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjY2Miw0ICsyNzk5LDUgQEAKICAgICBDQU1fQ1VTVE9NX1BBUk1fRVhBTVBMRSwKICAgICBDQU1fQ1VTVE9NX1BBUk1fTUFYLAogfSBjYW1fY3VzdG9tX3Bhcm1fdHlwZTsKKwogI2VuZGlmIC8qIF9fUUNBTUVSQV9UWVBFU19IX18gKi8KZGlmZiAtLWdpdCBhL1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9tbV9jYW1lcmFfaW50ZXJmYWNlLmggYi9RQ2FtZXJhMi9zdGFjay9jb21tb24vbW1fY2FtZXJhX2ludGVyZmFjZS5oCmluZGV4IDQwYmQ2ZDMuLmQ2YmQ5MmUgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9tbV9jYW1lcmFfaW50ZXJmYWNlLmgKKysrIGIvUUNhbWVyYTIvc3RhY2svY29tbW9uL21tX2NhbWVyYV9pbnRlcmZhY2UuaApAQCAtMTgyLDE2ICsxODIsNyBAQAogICAgIHVpbnQ4X3QgcHJpbWFyeV9vbmx5OwogfSBtbV9jYW1lcmFfcmVxX2J1Zl90OwogCi0vKiogbW1fY2FtZXJhX2V2ZW50X3Q6IHN0cnVjdHVyZSBmb3IgZXZlbnQKLSogICAgQHNlcnZlcl9ldmVudF90eXBlIDogZXZlbnQgdHlwZSBmcm9tIHNlcmVyCi0qICAgIEBzdGF0dXMgOiBzdGF0dXMgb2YgYW4gZXZlbnQsIHZhbHVlIGNvdWxkIGJlCi0qICAgICAgICAgICAgICBDQU1fU1RBVFVTX1NVQ0NFU1MKLSogICAgICAgICAgICAgIENBTV9TVEFUVVNfRkFJTEVECi0qKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjYW1fZXZlbnRfdHlwZV90IHNlcnZlcl9ldmVudF90eXBlOwotICAgIHVpbnQzMl90IHN0YXR1czsKLX0gbW1fY2FtZXJhX2V2ZW50X3Q7Cit0eXBlZGVmIGNhbV9ldmVudF90IG1tX2NhbWVyYV9ldmVudF90OwogCiAvKiogbW1fY2FtZXJhX2V2ZW50X25vdGlmeV90OiBmdW5jdGlvbiBkZWZpbml0aW9uIGZvciBldmVudAogKiAgIG5vdGlmeSBoYW5kbGluZwpAQCAtMjE5LDEyICsyMTAsMTQgQEAKICogICAgICAgICAgICAgICAgICAgdGhlIGluZGV4IHRvIHBsYW5lICgwLi5udW1fb2ZfcGxhbmVzKQogKiAgICBAZmQgOiBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHN0cmVhbSBidWZmZXIKICogICAgQHNpemU6IHNpemUgb2YgdGhlIHN0cmVhbSBidWZmZXIKKyogICAgQGJ1ZmZlcjogUG9pbnRlciB0byBidWZmZXIgdG8gcmVnaXN0ZXIKICogICAgQHVzZXJkYXRhIDogdXNlciBkYXRhIHBvaW50ZXIKICoqLwogdHlwZWRlZiBpbnQzMl90ICgqbWFwX3N0cmVhbV9idWZfb3BfdCkgKHVpbnQzMl90IGZyYW1lX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBsYW5lX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9tYXBwaW5nX2J1Zl90eXBlIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOwogCkBAIC00MzYsNyArNDI5LDggQEAKICAgICBpbnQzMl90ICgqbWFwX2J1ZikgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJ1Zl90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIpOwogCiAgICAgLyoqIG1hcF9idWZzOiBmdW5jdGlvbiBkZWZpbml0aW9uIGZvciBtYXBwaW5nIG11bHRpcGxlIGNhbWVyYSBidWZmZXJzCiAgICAgICogICAgICAgICAgIHZpYSBkb21haW4gc29ja2V0CkBAIC02NDIsNyArNjM2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyKTsKIAogICAgIC8qKiBtYXBfc3RyZWFtX2J1ZnM6IGZ1bmN0aW9uIGRlZmluaXRpb24gZm9yIG1hcHBpbmcgbXVsdGlwbGUKICAgICAgKiAgICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlcnMgdmlhIGRvbWFpbiBzb2NrZXQKQEAgLTc0NSw2ICs3NDAsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAogICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqYnVmKTsKIAorICAgIC8qKiBjYW5jZWxfYnVmZmVyOiBmdWNudGlvbiBkZWZpbml0aW9uIGZvciByZWNhbGxpbmcgYSBmcmFtZQorICAgICAqICAgICAgICBidWZmZXIgZnJvbSB0aGUga2VybmVsIHRoaXMgaXMgbW9zdCBsaWtlbHkgd2hlbiBoL3cKKyAgICAgKiAgICAgICAgZmFpbGVkIHRvIHVzZSB0aGlzIGJ1ZmZlciBhbmQgZHJvcHBlZCB0aGUgZnJhbWUgd2UgdXNlCisgICAgICogICAgICAgIHRoaXMgQVBJIHRvIHJlY2FsbCB0aGUgYnVmZmVyIGFuZCByZXR1cm4gaXQgdG8gdGhlCisgICAgICogICAgICAgIGZyYW1ld29yaworICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXIgaGFuZGxlcgorICAgICAqICAgIEBjaF9pZCA6IGNoYW5uZWwgaGFuZGxlcgorICAgICAqICAgIEBzdHJlYW1faWQgOiBzdHJlYW0gaGFuZGxlCisgICAgICogICAgQGJ1ZiA6IGEgZnJhbWUgYnVmZmVyIHRvIGJlIHF1ZXVlZCBiYWNrIHRvIGtlcm5lbAorICAgICAqICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICAqICAgICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAgICAgKiovCisgICAgaW50MzJfdCAoKmNhbmNlbF9idWZmZXIpICh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfaWR4KTsKKworCiAgICAgLyoqIGdldF9xdWV1ZWRfYnVmX2NvdW50OiBmdWNudGlvbiBkZWZpbml0aW9uIGZvciBxdWVyeWluZyBxdWV1ZWQgYnVmIGNvdW50CiAgICAgICogICAgQGNhbWVyYV9oYW5kbGUgOiBjYW1lciBoYW5kbGVyCiAgICAgICogICAgQGNoX2lkIDogY2hhbm5lbCBoYW5kbGVyCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9zdGFjay9jb21tb24vbW1fY2FtZXJhX3NoaW0uaCBiL1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9tbV9jYW1lcmFfc2hpbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YjBlYjkKLS0tIC9kZXYvbnVsbAorKysgYi9RQ2FtZXJhMi9zdGFjay9jb21tb24vbW1fY2FtZXJhX3NoaW0uaApAQCAtMCwwICsxLDk5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIF9fTU1fQ0FNRVJBX1NISU1MQVlFUl9IXworI2RlZmluZSBfX01NX0NBTUVSQV9TSElNTEFZRVJfSF8KKworI2luY2x1ZGUgImNhbV9pbnRmLmgiCisKKy8qCisgKiBNQ1Qgc2hpbSBsYXllciBBUElzCisgKi8KKyNkZWZpbmUgU0hJTUxBWUVSX0xJQiAiL3N5c3RlbS92ZW5kb3IvbGliL2xpYm1tY2FtZXJhMl9tY3Rfc2hpbWxheWVyLnNvIgorCitzdHJ1Y3QgY2FtX3NoaW1fcGFja2V0OworCisvKgorKiBCdW5kbGVkIGV2ZW50cyBzdHJ1Y3R1cmUuCisqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgY21kX2NvdW50OyAgICAgICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBldmVudHMgaW4gdGhpcyBwYWNrZXQgKi8KKyAgICBzdHJ1Y3QgY2FtX3NoaW1fcGFja2V0ICpjbWQ7ICAvKkV2ZW50cyB0byBwcm9jZXNzKi8KK30gY2FtX3NoaW1fY21kX3BhY2tldF90OworCisvKgorKiBCdW5kbGVkIHN0cmVhbSBldmVudCBzdHJ1Y3R1cmUKKyovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBzdHJlYW1fY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKk51bWJlciBvZiBzdHJlYW1zIGluIGEgYnVuZGxlKi8KKyAgICBjYW1fc2hpbV9jbWRfcGFja2V0X3Qgc3RyZWFtX2V2ZW50W01BWF9OVU1fU1RSRUFNU107IC8qRXZlbnQgZm9yIGRpZmZlcmVudCBzdHJlYW1zKi8KK30gY2FtX3NoaW1fc3RyZWFtX2NtZF9wYWNrZXRfdDsKKworLyoKKyogQ29tbWFuZCB0eXBlcyB0byBwcm9jZXNzIGluIHNoaW0gbGF5ZXIKKyovCit0eXBlZGVmIGVudW0geworICAgIENBTV9TSElNX1NFVF9QQVJNLCAgIC8qdjRsMiBzZXQgcGFyYW1ldGVyKi8KKyAgICBDQU1fU0hJTV9HRVRfUEFSTSwgICAvKnY0bDIgZ2V0IHBhcmFtZXRlciovCisgICAgQ0FNX1NISU1fUkVHX0JVRiwgICAgLypSZWcvdW5yZWcgYnVmZmVycyB3aXRoIGJhY2stZW5kKi8KKyAgICBDQU1fU0hJTV9CVU5ETEVfQ01ELCAvKkJ1bmRsZWQgY29tbWFuZCBmb3Igc3RyZWFtcyovCit9IGNhbV9zaGltX2NtZF90eXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgY29tbWFuZDsgICAgLypWNEwyIG9yIHByaXZhdGUgY29tbWFuZCovCisgICAgdWludDMyX3Qgc3RyZWFtX2lkOyAgLypzdHJlYW1JRCovCisgICAgdm9pZCAqdmFsdWU7ICAgICAgICAgIC8qY29tbWFuZCB2YWx1ZS9kYXRhKi8KK30gY2FtX3NoaW1fY21kX2RhdGE7CisKKy8qCisqIFN0cnVjdHVyZSB0byBjb21tdW5pY2F0ZSBjb21tYW5kIHdpdGggc2hpbSBsYXllcgorKi8KK3R5cGVkZWYgc3RydWN0IGNhbV9zaGltX3BhY2tldCB7CisgICAgdWludDMyX3Qgc2Vzc2lvbl9pZDsKKyAgICBjYW1fc2hpbV9jbWRfdHlwZSBjbWRfdHlwZTsgICAgICAgICAgICAgICAgIC8qQ29tbWFuZCB0eXBlIHRvIHByb2Nlc3MqLworICAgIHVuaW9uIHsKKyAgICAgICAgY2FtX3NoaW1fY21kX2RhdGEgY21kX2RhdGE7ICAgICAgICAgICAgIC8qZ2V0L3NldCBwYXJhbWV0ZXIgc3RydWN0dXJlKi8KKyAgICAgICAgY2FtX3JlZ19idWZfdCByZWdfYnVmOyAgICAgICAgICAgICAgICAgIC8qQnVmZmVyIHJlZ2lzdGVyIGFuZCB1bnJlZ2lzdGVyKi8KKyAgICAgICAgY2FtX3NoaW1fc3RyZWFtX2NtZF9wYWNrZXRfdCBidW5kbGVfY21kOy8qQnVuZGxlZCBjb21tYW5kKi8KKyAgICB9OworfSBjYW1fc2hpbV9wYWNrZXRfdDsKKwordHlwZWRlZiBpbnQzMl90ICgqbW1fY2FtZXJhX3NoaW1fZXZlbnRfaGFuZGxlcl9mdW5jKSh1aW50MzJfdCBzZXNzaW9uX2lkLAorICAgICAgICBjYW1fZXZlbnRfdCAqZXZlbnQpOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtX3N0YXR1c190ICgqbW1fY2FtZXJhX3NoaW1fb3Blbl9zZXNzaW9uKSAoaW50IHNlc3Npb24sCisgICAgICAgICAgICBtbV9jYW1lcmFfc2hpbV9ldmVudF9oYW5kbGVyX2Z1bmMgZXZ0X2NiKTsKKyAgICBpbnQzMl90ICgqbW1fY2FtZXJhX3NoaW1fY2xvc2Vfc2Vzc2lvbikoaW50IHNlc3Npb24pOworICAgIGludDMyX3QgKCptbV9jYW1lcmFfc2hpbV9zZW5kX2NtZCkoY2FtX3NoaW1fcGFja2V0X3QgKmV2ZW50KTsKK30gbW1fY2FtZXJhX3NoaW1fb3BzX3Q7CisKK2ludDMyX3QgKCptbV9jYW1lcmFfc2hpbV9tb2R1bGVfaW5pdCkobW1fY2FtZXJhX3NoaW1fb3BzX3QgKnNoaW1fb3BzKTsKKworI2VuZGlmICAvKl9fTU1fQ0FNRVJBX1NISU1MQVlFUl9IXyovCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9zdGFjay9jb21tb24vbW1fanBlZ19pbnRlcmZhY2UuaCBiL1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9tbV9qcGVnX2ludGVyZmFjZS5oCmluZGV4IGEwMGQ5NDAuLjczZmM3YWQgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9tbV9qcGVnX2ludGVyZmFjZS5oCisrKyBiL1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9tbV9qcGVnX2ludGVyZmFjZS5oCkBAIC01OSwxMSArNTksMTcgQEAKICAgY2FtX2FmX2V4aWZfZGVidWdfdCBhZl9kZWJ1Z19wYXJhbXM7CiAgIGNhbV9hc2RfZXhpZl9kZWJ1Z190IGFzZF9kZWJ1Z19wYXJhbXM7CiAgIGNhbV9zdGF0c19idWZmZXJfZXhpZl9kZWJ1Z190IHN0YXRzX2RlYnVnX3BhcmFtczsKKyAgY2FtX2Jlc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdCBiZXN0YXRzX2RlYnVnX3BhcmFtczsKKyAgY2FtX2JoaXN0X2J1ZmZlcl9leGlmX2RlYnVnX3QgYmhpc3RfZGVidWdfcGFyYW1zOworICBjYW1fcTNhX3R1bmluZ19pbmZvX3QgcTNhX3R1bmluZ19kZWJ1Z19wYXJhbXM7CiAgIHVpbnQ4X3QgYWVfZGVidWdfcGFyYW1zX3ZhbGlkOwogICB1aW50OF90IGF3Yl9kZWJ1Z19wYXJhbXNfdmFsaWQ7CiAgIHVpbnQ4X3QgYWZfZGVidWdfcGFyYW1zX3ZhbGlkOwogICB1aW50OF90IGFzZF9kZWJ1Z19wYXJhbXNfdmFsaWQ7CiAgIHVpbnQ4X3Qgc3RhdHNfZGVidWdfcGFyYW1zX3ZhbGlkOworICB1aW50OF90IGJlc3RhdHNfZGVidWdfcGFyYW1zX3ZhbGlkOworICB1aW50OF90IGJoaXN0X2RlYnVnX3BhcmFtc192YWxpZDsKKyAgdWludDhfdCBxM2FfdHVuaW5nX2RlYnVnX3BhcmFtc192YWxpZDsKIH0gbW1fanBlZ19kZWJ1Z19leGlmX3BhcmFtc190OwogCiB0eXBlZGVmIHN0cnVjdCB7CmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL0FuZHJvaWQubWsgYi9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL0FuZHJvaWQubWsKaW5kZXggNmNiN2JjOC4uMGE3ZDY1ZiAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9BbmRyb2lkLm1rCisrKyBiL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2UvQW5kcm9pZC5tawpAQCAtMTIsNiArMTIsMTEgQEAKICAgICAgICAgc3JjL21tX2NhbWVyYV90aHJlYWQuYyBcCiAgICAgICAgIHNyYy9tbV9jYW1lcmFfc29jay5jCiAKK2lmZXEgKCQoQ0FNRVJBX0RBRU1PTl9OT1RfUFJFU0VOVCksIHRydWUpCitlbHNlCitMT0NBTF9DRkxBR1MgKz0gLUREQUVNT05fUFJFU0VOVAorZW5kaWYKKwogIyBTeXN0ZW0gaGVhZGVyIGZpbGUgcGF0aCBwcmVmaXgKIExPQ0FMX0NGTEFHUyArPSAtRFNZU1RFTV9IRUFERVJfUFJFRklYPXN5cwogCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL2luYy9tbV9jYW1lcmEuaCBiL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2UvaW5jL21tX2NhbWVyYS5oCmluZGV4IGM0ZjY2MGIuLmNlMGNhZjcgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2UvaW5jL21tX2NhbWVyYS5oCisrKyBiL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2UvaW5jL21tX2NhbWVyYS5oCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSAiY2FtZXJhX2NvbW1vbi5oIgogI2luY2x1ZGUgImNhbV9zZW1hcGhvcmUuaCIKICNpbmNsdWRlICJtbV9jYW1lcmFfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibW1fY2FtZXJhX3NoaW0uaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRGF0YSBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zCkBAIC0yMDcsNiArMjA4LDcgQEAKICAgICBNTV9TVFJFQU1fRVZUX0dFVF9QQVJNLAogICAgIE1NX1NUUkVBTV9FVlRfRE9fQUNUSU9OLAogICAgIE1NX1NUUkVBTV9FVlRfR0VUX1FVRVVFRF9CVUZfQ09VTlQsCisgICAgTU1fU1RSRUFNX0VWVF9DQU5DRUxfQlVGLAogICAgIE1NX1NUUkVBTV9FVlRfTUFYCiB9IG1tX3N0cmVhbV9ldnRfdHlwZV90OwogCkBAIC0zNTQsMTMgKzM1NiwxNCBAQAogICAgIG1tX3N0cmVhbV9kYXRhX2NiX3QgYnVmX2NiOwogfSBtbV9ldnRfcGF5bG9kX3JlZ19zdHJlYW1fYnVmX2NiOwogCi0KIHR5cGVkZWYgc3RydWN0IHsKICAgICB1aW50OF90IG51bV9vZl9idWZzOwogICAgIG1tX2NhbWVyYV9idWZfaW5mb190IHN1cGVyX2J1ZltNQVhfU1RSRUFNX05VTV9JTl9CVU5ETEVdOwogICAgIHVpbnQ4X3QgbWF0Y2hlZDsKLSAgICB1aW50OF90IGV4cGVjdGVkOworICAgIHVpbnQ4X3QgZXhwZWN0ZWRfZnJhbWU7CiAgICAgdWludDMyX3QgZnJhbWVfaWR4OworICAgIC8qIHVubWF0Y2hlZCBtZXRhIGlkeCBuZWVkZWQgaW4gY2FzZSBvZiBsb3cgcHJpb3JpdHkgcXVldWUgKi8KKyAgICB1aW50MzJfdCB1bm1hdGNoZWRfbWV0YV9pZHg7CiB9IG1tX2NoYW5uZWxfcXVldWVfbm9kZV90OwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC0zNzcsNiArMzgwLDcgQEAKICAgICB1aW50MzJfdCBsZWRfb25fbnVtX2ZyYW1lczsKICAgICB1aW50MzJfdCBvbmNlOwogICAgIHVpbnQzMl90IGZyYW1lX3NraXBfY291bnQ7CisgICAgdWludDMyX3QgZ29vZF9mcmFtZV9pZDsKIH0gbW1fY2hhbm5lbF9xdWV1ZV90OwogCiB0eXBlZGVmIHN0cnVjdCB7CkBAIC01MzUsNiArNTM5LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIGludDhfdCBudW1fY2FtOworICAgIG1tX2NhbWVyYV9zaGltX29wc190IGNhbV9zaGltX29wczsKICAgICBjaGFyIHZpZGVvX2Rldl9uYW1lW01NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlNdW01NX0NBTUVSQV9ERVZfTkFNRV9MRU5dOwogICAgIG1tX2NhbWVyYV9vYmpfdCAqY2FtX29ialtNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTXTsKICAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mb1tNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTXTsKQEAgLTU1MywxNCArNTU4LDEyIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIHV0aWxpdHkgZnVuY3Rpb25zICovCiAvKiBzZXQgaW50MzJfdCB2YWx1ZSAqLwotZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3V0aWxfc19jdHJsKGludDMyX3QgZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqdmFsdWUpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3V0aWxfc19jdHJsKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICBpbnQgc3RyZWFtX2lkLCBpbnQzMl90IGZkLCB1aW50MzJfdCBpZCwgaW50MzJfdCAqdmFsdWUpOwogCiAvKiBnZXQgaW50MzJfdCB2YWx1ZSAqLwotZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3V0aWxfZ19jdHJsKGludDMyX3QgZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqdmFsdWUpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3V0aWxfZ19jdHJsKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICBpbnQgc3RyZWFtX2lkLCBpbnQzMl90IGZkLCB1aW50MzJfdCBpZCwgaW50MzJfdCAqdmFsdWUpOwogCiAvKiBzZW5kIG1zZyB0aHJvdWdodCBkb21haW4gc29ja2V0IGZvciBmZCBtYXBwaW5nICovCiBleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfdXRpbF9zZW5kbXNnKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLApAQCAtNTg3LDYgKzU5MCwxMCBAQAogZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3FidWYobW1fY2FtZXJhX29ial90ICpteV9vYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmJ1Zik7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfY2FuY2VsX2J1ZihtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmX2lkeCk7CiBleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfZ2V0X3F1ZXVlZF9idWZfY291bnQobW1fY2FtZXJhX29ial90ICpteV9vYmosCiAgICAgICAgIHVpbnQzMl90IGNoX2lkLCB1aW50MzJfdCBzdHJlYW1faWQpOwogZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3F1ZXJ5X2NhcGFiaWxpdHkobW1fY2FtZXJhX29ial90ICpteV9vYmopOwpAQCAtNTk3LDcgKzYwNCw4IEBACiBleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfbWFwX2J1ZihtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlcik7CiBleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfbWFwX2J1ZnMobW1fY2FtZXJhX29ial90ICpteV9vYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtX2J1Zl9tYXBfdHlwZV9saXN0ICpidWZfbWFwX2xpc3QpOwogZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3VubWFwX2J1ZihtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKQEAgLTY3Miw3ICs2ODAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1Zl9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwbGFuZV9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIpOwogZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX21hcF9zdHJlYW1fYnVmcyhtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbV9idWZfbWFwX3R5cGVfbGlzdCAqYnVmX21hcF9saXN0KTsKQEAgLTcwNSw2ICs3MTQsOCBAQAogICogZnJvbSB0aGUgY29udGV4dCBvZiBkYXRhQ0IsIGJ1dCBhc3luYyBzdG9wIGlzIGhvbGRpbmcgY2hfbG9jayAqLwogZXh0ZXJuIGludDMyX3QgbW1fY2hhbm5lbF9xYnVmKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmJ1Zik7CitleHRlcm4gaW50MzJfdCBtbV9jaGFubmVsX2NhbmNlbF9idWYobW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQsIHVpbnQzMl90IGJ1Zl9pZHgpOwogLyogbW1fc3RyZWFtICovCiBleHRlcm4gaW50MzJfdCBtbV9zdHJlYW1fZnNtX2ZuKG1tX3N0cmVhbV90ICpteV9vYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX3N0cmVhbV9ldnRfdHlwZV90IGV2dCwKQEAgLTcxOCw3ICs3MjksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhbWVfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwbGFuZV9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlcik7CiBleHRlcm4gaW50MzJfdCBtbV9zdHJlYW1fbWFwX2J1ZnMobW1fc3RyZWFtX3QgKm15X29iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1fYnVmX21hcF90eXBlX2xpc3QgKmJ1Zl9tYXBfbGlzdCk7CiBleHRlcm4gaW50MzJfdCBtbV9zdHJlYW1fdW5tYXBfYnVmKG1tX3N0cmVhbV90ICpteV9vYmosCkBAIC03MjYsNyArNzM4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhbWVfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBsYW5lX2lkeCk7CiAKLQogLyogdXRpbHRpdHkgZnVjbnRpb24gZGVjbGFyZWQgaW4gbW0tY2FtZXJhLWludGVmYWNlMi5jCiAgKiBhbmQgbmVlZCBiZSB1c2VkIGJ5IG1tLWNhbWVyYSBhbmQgYmVsb3cqLwogdWludDMyX3QgbW1fY2FtZXJhX3V0aWxfZ2VuZXJhdGVfaGFuZGxlcih1aW50OF90IGluZGV4KTsKQEAgLTc2MSw0ICs3NzIsMTcgQEAKIGV4dGVybiBpbnQzMl90IG1tX2NhbWVyYV9jaGFubmVsX2FkdmFuY2VkX2NhcHR1cmUobW1fY2FtZXJhX29ial90ICpteV9vYmosCiAgICAgICAgIHVpbnQzMl90IGNoX2lkLCBtbV9jYW1lcmFfYWR2YW5jZWRfY2FwdHVyZV90IHR5cGUsCiAgICAgICAgIHVpbnQzMl90IHRyaWdnZXIsIHZvaWQgKmluX3ZhbHVlKTsKK2ludDMyX3QgbW1fY2FtZXJhX2VucXVldWVfZXZ0KG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2V2ZW50X3QgKmV2ZW50KTsKK2ludDMyX3QgbW1fY2FtZXJhX2xvYWRfc2hpbV9saWIoKTsKK2NhbV9zaGltX3BhY2tldF90ICptbV9jYW1lcmFfY3JlYXRlX3NoaW1fY21kX3BhY2tldChjYW1fc2hpbV9jbWRfdHlwZSB0eXBlLAorICAgICAgICB1aW50MzJfdCBzZXNzaW9uSUQsIHZvaWQgKmRhdGEpOworaW50MzJfdCBtbV9jYW1lcmFfZGVzdHJveV9zaGltX2NtZF9wYWNrZXQoY2FtX3NoaW1fcGFja2V0X3QgKmNtZCk7CitpbnQzMl90IG1tX2NhbWVyYV9tb2R1bGVfZXZlbnRfaGFuZGxlcigKKyAgICAgICAgdWludDMyX3Qgc2Vzc2lvbl9pZCwgY2FtX2V2ZW50X3QgKmV2ZW50KTsKK2NhbV9zdGF0dXNfdCBtbV9jYW1lcmFfbW9kdWxlX29wZW5fc2Vzc2lvbihpbnQgc2Vzc2lvbmlkLAorICAgICAgICBpbnQgKCpldmVudF9jYikodWludDMyX3Qgc2Vzc2lvbmlkLCBjYW1fZXZlbnRfdCAqZXZlbnQpKTsKK2ludDMyX3QgbW1fY2FtZXJhX21vZHVsZV9jbG9zZV9zZXNzaW9uKGludCBzZXNzaW9uKTsKK2ludDMyX3QgbW1fY2FtZXJhX21vZHVsZV9zZW5kX2NtZChjYW1fc2hpbV9wYWNrZXRfdCAqZXZlbnQpOworCiAjZW5kaWYgLyogX19NTV9DQU1FUkFfSF9fICovCmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmEuYyBiL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2Uvc3JjL21tX2NhbWVyYS5jCmluZGV4IGE1NTk4MTUuLjliOTc5ZDkgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2Uvc3JjL21tX2NhbWVyYS5jCisrKyBiL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2Uvc3JjL21tX2NhbWVyYS5jCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQsIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgogI2RlZmluZSBJT0NUTF9IIDxTWVNURU1fSEVBREVSX1BSRUZJWC9pb2N0bC5oPgogI2luY2x1ZGUgSU9DVExfSAogCkBAIC01Niw2ICs1Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVnX2ZsYWcpOwogaW50MzJfdCBtbV9jYW1lcmFfZW5xdWV1ZV9ldnQobW1fY2FtZXJhX29ial90ICpteV9vYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfZXZlbnRfdCAqZXZlbnQpOworZXh0ZXJuIG1tX2NhbWVyYV9vYmpfdCogbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9zZXNzaW9uX2lkCisgICAgICAgICh1aW50MzJfdCBzZXNzaW9uX2lkKTsKIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfdXRpbF9nZXRfY2hhbm5lbF9ieV9oYW5kbGVyCkBAIC0yODIsNyArMjg1LDYgQEAKICAgICAgICAgbF9lcnJubyA9IGVycm5vOwogICAgICAgICBMT0dEKCJjdHJsX2ZkID0gJWQsIGVycm5vID09ICVkIiwgbXlfb2JqLT5jdHJsX2ZkLCBsX2Vycm5vKTsKICAgICAgICAgaWYoKG15X29iai0+Y3RybF9mZCA+PSAwKSB8fCAoZXJybm8gIT0gRUlPICYmIGVycm5vICE9IEVUSU1FRE9VVCkgfHwgKG5fdHJ5IDw9IDAgKSkgewotICAgICAgICAgICAgTE9HSCgib3BlbmVkLCBicmVhayBvdXQgd2hpbGUgbG9vcCIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgTE9HRSgiRmFpbGVkIHdpdGggJXMgZXJyb3IsIHJldHJ5aW5nIGFmdGVyICVkIG1pbGxpLXNlY29uZHMiLApAQCAtMjk4LDggKzMwMCwxMiBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICByYyA9IC0xOwogICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgIH0gZWxzZSB7CisgICAgICAgIG1tX2NhbWVyYV9nZXRfc2Vzc2lvbl9pZChteV9vYmosICZteV9vYmotPnNlc3Npb25pZCk7CisgICAgICAgIExPR0goIkNhbWVyYSBPcGVuZWQgaWQgPSAlZCBzZXNzaW9uaWQgPSAlZCIsIGNhbV9pZHgsIG15X29iai0+c2Vzc2lvbmlkKTsKICAgICB9CiAKKyNpZmRlZiBEQUVNT05fUFJFU0VOVAogICAgIC8qIG9wZW4gZG9tYWluIHNvY2tldCovCiAgICAgbl90cnkgPSBNTV9DQU1FUkFfREVWX09QRU5fVFJJRVM7CiAgICAgZG8gewpAQCAtMzIyLDggKzMyOCwyMiBAQAogICAgICAgICByYyA9IC0xOwogICAgICAgICBnb3RvIG9uX2Vycm9yOwogICAgIH0KLSAgICBwdGhyZWFkX211dGV4X2luaXQoJm15X29iai0+bXNnX2xvY2ssIE5VTEwpOworI2Vsc2UgLyogREFFTU9OX1BSRVNFTlQgKi8KKyAgICBjYW1fc3RhdHVzX3QgY2FtX3N0YXR1czsKKyAgICBjYW1fc3RhdHVzID0gbW1fY2FtZXJhX21vZHVsZV9vcGVuX3Nlc3Npb24obXlfb2JqLT5zZXNzaW9uaWQsCisgICAgICAgICAgICBtbV9jYW1lcmFfbW9kdWxlX2V2ZW50X2hhbmRsZXIpOworICAgIGlmIChjYW1fc3RhdHVzIDwgMCkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gb3BlbiBzZXNzaW9uIik7CisgICAgICAgIGlmIChjYW1fc3RhdHVzID09IENBTV9TVEFUVVNfQlVTWSkgeworICAgICAgICAgICAgcmMgPSAtRVVTRVJTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgIH0KKyNlbmRpZiAvKiBEQUVNT05fUFJFU0VOVCAqLwogCisgICAgcHRocmVhZF9tdXRleF9pbml0KCZteV9vYmotPm1zZ19sb2NrLCBOVUxMKTsKICAgICBwdGhyZWFkX211dGV4X2luaXQoJm15X29iai0+Y2JfbG9jaywgTlVMTCk7CiAgICAgcHRocmVhZF9tdXRleF9pbml0KCZteV9vYmotPmV2dF9sb2NrLCBOVUxMKTsKICAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbXlfb2JqLT5ldnRfY29uZCwgTlVMTCk7CkBAIC0zNjMsMTAgKzM4MywxMiBAQAogICAgICAgICAgICAgY2xvc2UobXlfb2JqLT5jdHJsX2ZkKTsKICAgICAgICAgICAgIG15X29iai0+Y3RybF9mZCA9IC0xOwogICAgICAgICB9CisjaWZkZWYgREFFTU9OX1BSRVNFTlQKICAgICAgICAgaWYgKG15X29iai0+ZHNfZmQgPj0gMCkgewogICAgICAgICAgICAgbW1fY2FtZXJhX3NvY2tldF9jbG9zZShteV9vYmotPmRzX2ZkKTsKICAgICAgICAgICAgIG15X29iai0+ZHNfZmQgPSAtMTsKICAgICAgICAgfQorI2VuZGlmCiAgICAgfQogCiAgICAgLyogdW5sb2NrIGNhbV9sb2NrLCB3ZSBuZWVkIHJlbGVhc2UgZ2xvYmFsIGludGZfbG9jayBpbiBjYW1lcmFfb3BlbigpLApAQCAtMzkyLDYgKzQxNCwxMSBAQAogaW50MzJfdCBtbV9jYW1lcmFfY2xvc2UobW1fY2FtZXJhX29ial90ICpteV9vYmopCiB7CiAgICAgTE9HRCgidW5zdWJzY3JpYmUgZXZ0Iik7CisKKyNpZm5kZWYgREFFTU9OX1BSRVNFTlQKKyAgICBtbV9jYW1lcmFfbW9kdWxlX2Nsb3NlX3Nlc3Npb24obXlfb2JqLT5zZXNzaW9uaWQpOworI2VuZGlmIC8qIERBRU1PTl9QUkVTRU5UICovCisKICAgICBtbV9jYW1lcmFfZXZ0X3N1YihteV9vYmosIEZBTFNFKTsKIAogICAgIExPR0QoIkNsb3NlIGV2dCBQb2xsIFRocmVhZCBpbiBDYW0gQ2xvc2UiKTsKQEAgLTQwNCwxNiArNDMxLDE4IEBACiAgICAgICAgIGNsb3NlKG15X29iai0+Y3RybF9mZCk7CiAgICAgICAgIG15X29iai0+Y3RybF9mZCA9IC0xOwogICAgIH0KKworI2lmZGVmIERBRU1PTl9QUkVTRU5UCiAgICAgaWYobXlfb2JqLT5kc19mZCA+PSAwKSB7CiAgICAgICAgIG1tX2NhbWVyYV9zb2NrZXRfY2xvc2UobXlfb2JqLT5kc19mZCk7CiAgICAgICAgIG15X29iai0+ZHNfZmQgPSAtMTsKICAgICB9Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZteV9vYmotPm1zZ19sb2NrKTsKKyNlbmRpZgogCisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZteV9vYmotPm1zZ19sb2NrKTsKICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm15X29iai0+Y2JfbG9jayk7CiAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZteV9vYmotPmV2dF9sb2NrKTsKICAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbXlfb2JqLT5ldnRfY29uZCk7Ci0KICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC01MzEsNiArNTYwLDM4IEBACiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2NhbmNlbF9idWYKKyAqCisgKiBERVNDUklQVElPTjogQ2FuY2VsIGFuIGFscmVhZHkgcXVldWVkIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2FtZXJhIG9iamVjdAorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqCisgKiAgIEBidWYgICAgICAgICAgOiBidWYgcHRyIHRvIGJlIGVucXVldWVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9jYW5jZWxfYnVmKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfaWR4KQoreworICAgIGludCByYyA9IC0xOworICAgIG1tX2NoYW5uZWxfdCAqIGNoX29iaiA9IE5VTEw7CisgICAgY2hfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NoYW5uZWxfYnlfaGFuZGxlcihteV9vYmosIGNoX2lkKTsKKworICAgIGlmIChOVUxMICE9IGNoX29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHJjID0gbW1fY2hhbm5lbF9jYW5jZWxfYnVmKGNoX29iaixzdHJlYW1faWQsYnVmX2lkeCk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9nZXRfcXVldWVkX2J1Zl9jb3VudAogICoKICAqIERFU0NSSVBUSU9OOiByZXR1cm4gcXVldWVkIGJ1ZmZlciBjb3VudApAQCAtNTgwLDE5ICs2NDEsMzAgQEAKIGludDMyX3QgbW1fY2FtZXJhX3F1ZXJ5X2NhcGFiaWxpdHkobW1fY2FtZXJhX29ial90ICpteV9vYmopCiB7CiAgICAgaW50MzJfdCByYyA9IDA7Ci0gICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSBjYXA7CiAKKyNpZmRlZiBEQUVNT05fUFJFU0VOVAorICAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgY2FwOwogICAgIC8qIGdldCBjYW1lcmEgY2FwYWJpbGl0aWVzICovCiAgICAgbWVtc2V0KCZjYXAsIDAsIHNpemVvZihjYXApKTsKICAgICByYyA9IGlvY3RsKG15X29iai0+Y3RybF9mZCwgVklESU9DX1FVRVJZQ0FQLCAmY2FwKTsKKyNlbHNlIC8qIERBRU1PTl9QUkVTRU5UICovCisgICAgY2FtX3NoaW1fcGFja2V0X3QgKnNoaW1fY21kOworICAgIGNhbV9zaGltX2NtZF9kYXRhIHNoaW1fY21kX2RhdGE7CisgICAgbWVtc2V0KCZzaGltX2NtZF9kYXRhLCAwLCBzaXplb2Yoc2hpbV9jbWRfZGF0YSkpOworICAgIHNoaW1fY21kX2RhdGEuY29tbWFuZCA9IE1TTV9DQU1FUkFfUFJJVl9RVUVSWV9DQVA7CisgICAgc2hpbV9jbWRfZGF0YS5zdHJlYW1faWQgPSAwOworICAgIHNoaW1fY21kX2RhdGEudmFsdWUgPSBOVUxMOworICAgIHNoaW1fY21kID0gbW1fY2FtZXJhX2NyZWF0ZV9zaGltX2NtZF9wYWNrZXQoQ0FNX1NISU1fR0VUX1BBUk0sCisgICAgICAgICAgICBteV9vYmotPnNlc3Npb25pZCwmc2hpbV9jbWRfZGF0YSk7CisgICAgcmMgPSBtbV9jYW1lcmFfbW9kdWxlX3NlbmRfY21kKHNoaW1fY21kKTsKKyAgICBtbV9jYW1lcmFfZGVzdHJveV9zaGltX2NtZF9wYWNrZXQoc2hpbV9jbWQpOworI2VuZGlmIC8qIERBRU1PTl9QUkVTRU5UICovCiAgICAgaWYgKHJjICE9IDApIHsKICAgICAgICAgTE9HRSgiY2Fubm90IGdldCBjYW1lcmEgY2FwYWJpbGl0aWVzLCByYyA9ICVkLCBlcnJubyAlZCIsCi0gICAgICAgICAgICAgICAgIHJjLCBlcnJubyk7CisgICAgICAgICAgICAgICAgcmMsIGVycm5vKTsKICAgICB9Ci0KICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CiAgICAgcmV0dXJuIHJjOwotCiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC02MTcsNyArNjg5LDggQEAKICAgICBpbnQzMl90IHJjID0gLTE7CiAgICAgaW50MzJfdCB2YWx1ZSA9IDA7CiAgICAgaWYgKHBhcm1zICE9ICBOVUxMKSB7Ci0gICAgICAgIHJjID0gbW1fY2FtZXJhX3V0aWxfc19jdHJsKG15X29iai0+Y3RybF9mZCwgQ0FNX1BSSVZfUEFSTSwgJnZhbHVlKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zX2N0cmwobXlfb2JqLCAwLCBteV9vYmotPmN0cmxfZmQsCisgICAgICAgICAgICBDQU1fUFJJVl9QQVJNLCAmdmFsdWUpOwogICAgIH0KICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CiAgICAgcmV0dXJuIHJjOwpAQCAtNjQ3LDcgKzcyMCw3IEBACiAgICAgaW50MzJfdCByYyA9IC0xOwogICAgIGludDMyX3QgdmFsdWUgPSAwOwogICAgIGlmIChwYXJtcyAhPSBOVUxMKSB7Ci0gICAgICAgIHJjID0gbW1fY2FtZXJhX3V0aWxfZ19jdHJsKG15X29iai0+Y3RybF9mZCwgQ0FNX1BSSVZfUEFSTSwgJnZhbHVlKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9nX2N0cmwobXlfb2JqLCAwLCBteV9vYmotPmN0cmxfZmQsIENBTV9QUklWX1BBUk0sICZ2YWx1ZSk7CiAgICAgfQogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKICAgICByZXR1cm4gcmM7CkBAIC02NzEsNyArNzQ0LDcgQEAKIHsKICAgICBpbnQzMl90IHJjID0gLTE7CiAgICAgaW50MzJfdCB2YWx1ZSA9IDA7Ci0gICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zX2N0cmwobXlfb2JqLT5jdHJsX2ZkLCBDQU1fUFJJVl9ET19BVVRPX0ZPQ1VTLCAmdmFsdWUpOworICAgIHJjID0gbW1fY2FtZXJhX3V0aWxfc19jdHJsKG15X29iaiwgMCwgbXlfb2JqLT5jdHJsX2ZkLCBDQU1fUFJJVl9ET19BVVRPX0ZPQ1VTLCAmdmFsdWUpOwogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKICAgICByZXR1cm4gcmM7CiB9CkBAIC02OTIsNyArNzY1LDcgQEAKIHsKICAgICBpbnQzMl90IHJjID0gLTE7CiAgICAgaW50MzJfdCB2YWx1ZSA9IDA7Ci0gICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zX2N0cmwobXlfb2JqLT5jdHJsX2ZkLCBDQU1fUFJJVl9DQU5DRUxfQVVUT19GT0NVUywgJnZhbHVlKTsKKyAgICByYyA9IG1tX2NhbWVyYV91dGlsX3NfY3RybChteV9vYmosIDAsIG15X29iai0+Y3RybF9mZCwgQ0FNX1BSSVZfQ0FOQ0VMX0FVVE9fRk9DVVMsICZ2YWx1ZSk7CiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOwogICAgIHJldHVybiByYzsKIH0KQEAgLTcxNSw3ICs3ODgsNyBAQAogewogICAgIGludDMyX3QgcmMgPSAtMTsKICAgICBpbnQzMl90IHZhbHVlID0gZG9fYWZfZmxhZzsKLSAgICByYyA9IG1tX2NhbWVyYV91dGlsX3NfY3RybChteV9vYmotPmN0cmxfZmQsIENBTV9QUklWX1BSRVBBUkVfU05BUFNIT1QsICZ2YWx1ZSk7CisgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zX2N0cmwobXlfb2JqLCAwLCBteV9vYmotPmN0cmxfZmQsIENBTV9QUklWX1BSRVBBUkVfU05BUFNIT1QsICZ2YWx1ZSk7CiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOwogICAgIHJldHVybiByYzsKIH0KQEAgLTczNyw3ICs4MTAsNyBAQAogICAgIGludDMyX3QgcmMgPSAtMTsKICAgICBpbnQzMl90IHZhbHVlID0gMDsKIAotICAgIHJjID0gbW1fY2FtZXJhX3V0aWxfc19jdHJsKG15X29iai0+Y3RybF9mZCwKKyAgICByYyA9IG1tX2NhbWVyYV91dGlsX3NfY3RybChteV9vYmosIDAsIG15X29iai0+Y3RybF9mZCwKICAgICAgICAgICAgICBDQU1fUFJJVl9TVEFSVF9aU0xfU05BUFNIT1QsICZ2YWx1ZSk7CiAgICAgcmV0dXJuIHJjOwogfQpAQCAtNzU4LDcgKzgzMSw3IEBACiB7CiAgICAgaW50MzJfdCByYyA9IC0xOwogICAgIGludDMyX3QgdmFsdWU7Ci0gICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zX2N0cmwobXlfb2JqLT5jdHJsX2ZkLAorICAgIHJjID0gbW1fY2FtZXJhX3V0aWxfc19jdHJsKG15X29iaiwgMCwgbXlfb2JqLT5jdHJsX2ZkLAogICAgICAgICAgICAgIENBTV9QUklWX1NUT1BfWlNMX1NOQVBTSE9ULCAmdmFsdWUpOwogICAgIHJldHVybiByYzsKIH0KQEAgLTc3OSw3ICs4NTIsNyBAQAogewogICAgIGludDMyX3QgcmMgPSAtMTsKICAgICBpbnQzMl90IHZhbHVlOwotICAgIHJjID0gbW1fY2FtZXJhX3V0aWxfc19jdHJsKG15X29iai0+Y3RybF9mZCwKKyAgICByYyA9IG1tX2NhbWVyYV91dGlsX3NfY3RybChteV9vYmosIDAsIG15X29iai0+Y3RybF9mZCwKICAgICAgICAgICAgIENBTV9QUklWX0ZMVVNILCAmdmFsdWUpOwogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKICAgICByZXR1cm4gcmM7CkBAIC0xNTMyLDcgKzE2MDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmX2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlcikKIHsKICAgICBpbnQzMl90IHJjID0gLTE7CiAgICAgY2FtX2J1Zl9tYXBfdHlwZSBwYXlsb2FkOwpAQCAtMTU1MCw2ICsxNjI0LDcgQEAKICAgICAgICAgcGF5bG9hZC5wbGFuZV9pZHggPSBwbGFuZV9pZHg7CiAgICAgICAgIHBheWxvYWQuZmQgPSBmZDsKICAgICAgICAgcGF5bG9hZC5zaXplID0gc2l6ZTsKKyAgICAgICAgcGF5bG9hZC5idWZmZXIgPSBidWZmZXI7CiAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9mc21fZm4oY2hfb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NIQU5ORUxfRVZUX01BUF9TVFJFQU1fQlVGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikmcGF5bG9hZCwKQEAgLTE4MjQsNyArMTg5OSw3IEBACiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX21hcF9idWYKKyAqIEZVTkNUSU9hICAgOiBtbV9jYW1lcmFfbWFwX2J1ZgogICoKICAqIERFU0NSSVBUSU9OOiBtYXBwaW5nIGNhbWVyYSBidWZmZXIgdmlhIGRvbWFpbiBzb2NrZXQgdG8gc2VydmVyCiAgKgpAQCAtMTg0MiwyMSArMTkxNywyOSBAQAogICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKICAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogaW50MzJfdCBtbV9jYW1lcmFfbWFwX2J1ZihtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBidWZfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkKKyAgICAgICAgdWludDhfdCBidWZfdHlwZSwgaW50IGZkLCBzaXplX3Qgc2l6ZSwgdm9pZCAqYnVmZmVyKQogewogICAgIGludDMyX3QgcmMgPSAwOworCiAgICAgY2FtX3NvY2tfcGFja2V0X3QgcGFja2V0OwogICAgIG1lbXNldCgmcGFja2V0LCAwLCBzaXplb2YoY2FtX3NvY2tfcGFja2V0X3QpKTsKICAgICBwYWNrZXQubXNnX3R5cGUgPSBDQU1fTUFQUElOR19UWVBFX0ZEX01BUFBJTkc7CiAgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcC50eXBlID0gYnVmX3R5cGU7CiAgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcC5mZCA9IGZkOwogICAgIHBhY2tldC5wYXlsb2FkLmJ1Zl9tYXAuc2l6ZSA9IHNpemU7CisgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcC5idWZmZXIgPSBidWZmZXI7CisjaWZkZWYgREFFTU9OX1BSRVNFTlQKICAgICByYyA9IG1tX2NhbWVyYV91dGlsX3NlbmRtc2cobXlfb2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FtX3NvY2tfcGFja2V0X3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCk7CisjZWxzZQorICAgIGNhbV9zaGltX3BhY2tldF90ICpzaGltX2NtZDsKKyAgICBzaGltX2NtZCA9IG1tX2NhbWVyYV9jcmVhdGVfc2hpbV9jbWRfcGFja2V0KENBTV9TSElNX1JFR19CVUYsCisgICAgICAgICAgICBteV9vYmotPnNlc3Npb25pZCwgJnBhY2tldCk7CisgICAgcmMgPSBtbV9jYW1lcmFfbW9kdWxlX3NlbmRfY21kKHNoaW1fY21kKTsKKyAgICBtbV9jYW1lcmFfZGVzdHJveV9zaGltX2NtZF9wYWNrZXQoc2hpbV9jbWQpOworI2VuZGlmCiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOwogICAgIHJldHVybiByYzsKIH0KQEAgLTE4OTAsMTggKzE5NzMsMjUgQEAKICAgICB1aW50MzJfdCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBudW1idWZzOyBpKyspIHsKICAgICAgICAgc2VuZGZkc1tpXSA9IHBhY2tldC5wYXlsb2FkLmJ1Zl9tYXBfbGlzdC5idWZfbWFwc1tpXS5mZDsKKyAgICAgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcF9saXN0LmJ1Zl9tYXBzW2ldLmJ1ZmZlciA9CisgICAgICAgICAgICAgICAgYnVmX21hcF9saXN0LT5idWZfbWFwc1tpXS5idWZmZXI7CiAgICAgfQotCiAgICAgZm9yIChpID0gbnVtYnVmczsgaSA8IENBTV9NQVhfTlVNX0JVRlNfUEVSX1NUUkVBTTsgaSsrKSB7CiAgICAgICAgIHBhY2tldC5wYXlsb2FkLmJ1Zl9tYXBfbGlzdC5idWZfbWFwc1tpXS5mZCA9IC0xOwogICAgICAgICBzZW5kZmRzW2ldID0gLTE7CiAgICAgfQogCisjaWZkZWYgREFFTU9OX1BSRVNFTlQKICAgICByYyA9IG1tX2NhbWVyYV91dGlsX2J1bmRsZWRfc2VuZG1zZyhteV9vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FtX3NvY2tfcGFja2V0X3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRmZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYnVmcyk7CisgICAgICAgICAgICAmcGFja2V0LCBzaXplb2YoY2FtX3NvY2tfcGFja2V0X3QpLAorICAgICAgICAgICAgc2VuZGZkcywgbnVtYnVmcyk7CisjZWxzZQorICAgIGNhbV9zaGltX3BhY2tldF90ICpzaGltX2NtZDsKKyAgICBzaGltX2NtZCA9IG1tX2NhbWVyYV9jcmVhdGVfc2hpbV9jbWRfcGFja2V0KENBTV9TSElNX1JFR19CVUYsCisgICAgICAgICAgICBteV9vYmotPnNlc3Npb25pZCwgJnBhY2tldCk7CisgICAgcmMgPSBtbV9jYW1lcmFfbW9kdWxlX3NlbmRfY21kKHNoaW1fY21kKTsKKyAgICBtbV9jYW1lcmFfZGVzdHJveV9zaGltX2NtZF9wYWNrZXQoc2hpbV9jbWQpOworI2VuZGlmCiAKICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CiAgICAgcmV0dXJuIHJjOwpAQCAtMTkzMSwxMCArMjAyMSwxOCBAQAogICAgIG1lbXNldCgmcGFja2V0LCAwLCBzaXplb2YoY2FtX3NvY2tfcGFja2V0X3QpKTsKICAgICBwYWNrZXQubXNnX3R5cGUgPSBDQU1fTUFQUElOR19UWVBFX0ZEX1VOTUFQUElORzsKICAgICBwYWNrZXQucGF5bG9hZC5idWZfdW5tYXAudHlwZSA9IGJ1Zl90eXBlOworI2lmZGVmIERBRU1PTl9QUkVTRU5UCiAgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zZW5kbXNnKG15X29iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNhbV9zb2NrX3BhY2tldF90KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpOworI2Vsc2UKKyAgICBjYW1fc2hpbV9wYWNrZXRfdCAqc2hpbV9jbWQ7CisgICAgc2hpbV9jbWQgPSBtbV9jYW1lcmFfY3JlYXRlX3NoaW1fY21kX3BhY2tldChDQU1fU0hJTV9SRUdfQlVGLAorICAgICAgICAgICAgbXlfb2JqLT5zZXNzaW9uaWQsICZwYWNrZXQpOworICAgIHJjID0gbW1fY2FtZXJhX21vZHVsZV9zZW5kX2NtZChzaGltX2NtZCk7CisgICAgbW1fY2FtZXJhX2Rlc3Ryb3lfc2hpbV9jbWRfcGFja2V0KHNoaW1fY21kKTsKKyNlbmRpZgogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKICAgICByZXR1cm4gcmM7CiB9CkBAIC0xOTQ1LDYgKzIwNDMsOCBAQAogICogREVTQ1JJUFRJT046IHV0aWxpdHkgZnVuY3Rpb24gdG8gc2VuZCB2NGwyIGlvY3RsIGZvciBzX2N0cmwKICAqCiAgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgOkNhbWVyYSBvYmplY3QKKyAqICAgQHN0cmVhbV9pZCA6c3RyZWFtSUQKICAqICAgQGZkICAgICAgOiBmaWxlIGRlc2NyaXRwb3IgZm9yIHNlbmRpbmcgaW9jdGwKICAqICAgQGlkICAgICAgOiBjb250cm9sIGlkCiAgKiAgIEB2YWx1ZSAgIDogdmFsdWUgb2YgdGhlIGlvY3RsIHRvIGJlIHNlbnQKQEAgLTE5NTMsMTggKzIwNTMsMjAgQEAKICAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCiAgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi1pbnQzMl90IG1tX2NhbWVyYV91dGlsX3NfY3RybChpbnQzMl90IGZkLCAgdWludDMyX3QgaWQsIGludDMyX3QgKnZhbHVlKQoraW50MzJfdCBtbV9jYW1lcmFfdXRpbF9zX2N0cmwoX191bnVzZWQgbW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgIF9fdW51c2VkIGludCBzdHJlYW1faWQsIGludDMyX3QgZmQsCisgICAgICAgIHVpbnQzMl90IGlkLCBpbnQzMl90ICp2YWx1ZSkKIHsKICAgICBpbnQgcmMgPSAwOwotICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKIAorI2lmZGVmIERBRU1PTl9QUkVTRU5UCisgICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwogICAgIG1lbXNldCgmY29udHJvbCwgMCwgc2l6ZW9mKGNvbnRyb2wpKTsKICAgICBjb250cm9sLmlkID0gaWQ7CiAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKICAgICAgICAgY29udHJvbC52YWx1ZSA9ICp2YWx1ZTsKICAgICB9CiAgICAgcmMgPSBpb2N0bChmZCwgVklESU9DX1NfQ1RSTCwgJmNvbnRyb2wpOwotCiAgICAgTE9HRCgiZmQ9JWQsIFNfQ1RSTCwgaWQ9MHgleCwgdmFsdWUgPSAlcCwgcmMgPSAlZFxuIiwKICAgICAgICAgICBmZCwgaWQsIHZhbHVlLCByYyk7CiAgICAgaWYgKHJjIDwgMCkgewpAQCAtMTk3Miw2ICsyMDc0LDIxIEBACiAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBOVUxMKSB7CiAgICAgICAgICp2YWx1ZSA9IGNvbnRyb2wudmFsdWU7CiAgICAgfQorI2Vsc2UgLyogREFFTU9OX1BSRVNFTlQgKi8KKyAgICBjYW1fc2hpbV9wYWNrZXRfdCAqc2hpbV9jbWQ7CisgICAgY2FtX3NoaW1fY21kX2RhdGEgc2hpbV9jbWRfZGF0YTsKKyAgICAodm9pZClmZDsKKyAgICAodm9pZCl2YWx1ZTsKKyAgICBtZW1zZXQoJnNoaW1fY21kX2RhdGEsIDAsIHNpemVvZihzaGltX2NtZF9kYXRhKSk7CisKKyAgICBzaGltX2NtZF9kYXRhLmNvbW1hbmQgPSBpZDsKKyAgICBzaGltX2NtZF9kYXRhLnN0cmVhbV9pZCA9IHN0cmVhbV9pZDsKKyAgICBzaGltX2NtZF9kYXRhLnZhbHVlID0gTlVMTDsKKyAgICBzaGltX2NtZCA9IG1tX2NhbWVyYV9jcmVhdGVfc2hpbV9jbWRfcGFja2V0KENBTV9TSElNX1NFVF9QQVJNLAorICAgICAgICAgICAgbXlfb2JqLT5zZXNzaW9uaWQsJnNoaW1fY21kX2RhdGEpOworICAgIHJjID0gbW1fY2FtZXJhX21vZHVsZV9zZW5kX2NtZChzaGltX2NtZCk7CisgICAgbW1fY2FtZXJhX2Rlc3Ryb3lfc2hpbV9jbWRfcGFja2V0KHNoaW1fY21kKTsKKyNlbmRpZiAvKiBEQUVNT05fUFJFU0VOVCAqLwogICAgIHJldHVybiAocmMgPj0gMCk/IDAgOiAtMTsKIH0KIApAQCAtMTk4MSw2ICsyMDk4LDggQEAKICAqIERFU0NSSVBUSU9OOiB1dGlsaXR5IGZ1bmN0aW9uIHRvIHNlbmQgdjRsMiBpb2N0bCBmb3IgZ19jdHJsCiAgKgogICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgIDpDYW1lcmEgb2JqZWN0CisgKiAgIEBzdHJlYW1faWQgOnN0cmVhbUlECiAgKiAgIEBmZCAgICAgIDogZmlsZSBkZXNjcml0cG9yIGZvciBzZW5kaW5nIGlvY3RsCiAgKiAgIEBpZCAgICAgIDogY29udHJvbCBpZAogICogICBAdmFsdWUgICA6IHZhbHVlIG9mIHRoZSBpb2N0bCB0byBiZSBzZW50CkBAIC0xOTg5LDcgKzIxMDgsOCBAQAogICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKICAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCiAgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLWludDMyX3QgbW1fY2FtZXJhX3V0aWxfZ19jdHJsKCBpbnQzMl90IGZkLCB1aW50MzJfdCBpZCwgaW50MzJfdCAqdmFsdWUpCitpbnQzMl90IG1tX2NhbWVyYV91dGlsX2dfY3RybChfX3VudXNlZCBtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgX191bnVzZWQgaW50IHN0cmVhbV9pZCwgaW50MzJfdCBmZCwgdWludDMyX3QgaWQsIGludDMyX3QgKnZhbHVlKQogewogICAgIGludCByYyA9IDA7CiAgICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOwpAQCAtMTk5OSwxNSArMjExOSwxMzYgQEAKICAgICBpZiAodmFsdWUgIT0gTlVMTCkgewogICAgICAgICBjb250cm9sLnZhbHVlID0gKnZhbHVlOwogICAgIH0KKworI2lmZGVmIERBRU1PTl9QUkVTRU5UCiAgICAgcmMgPSBpb2N0bChmZCwgVklESU9DX0dfQ1RSTCwgJmNvbnRyb2wpOwogICAgIExPR0QoImZkPSVkLCBHX0NUUkwsIGlkPTB4JXgsIHJjID0gJWRcbiIsIGZkLCBpZCwgcmMpOwogICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CiAgICAgICAgICp2YWx1ZSA9IGNvbnRyb2wudmFsdWU7CiAgICAgfQorI2Vsc2UgLyogREFFTU9OX1BSRVNFTlQgKi8KKyAgICBjYW1fc2hpbV9wYWNrZXRfdCAqc2hpbV9jbWQ7CisgICAgY2FtX3NoaW1fY21kX2RhdGEgc2hpbV9jbWRfZGF0YTsKKyAgICAodm9pZClmZDsKKyAgICBtZW1zZXQoJnNoaW1fY21kX2RhdGEsIDAsIHNpemVvZihzaGltX2NtZF9kYXRhKSk7CisKKyAgICBzaGltX2NtZF9kYXRhLmNvbW1hbmQgPSBpZDsKKyAgICBzaGltX2NtZF9kYXRhLnN0cmVhbV9pZCA9IHN0cmVhbV9pZDsKKyAgICBzaGltX2NtZF9kYXRhLnZhbHVlID0gdmFsdWU7CisgICAgc2hpbV9jbWQgPSBtbV9jYW1lcmFfY3JlYXRlX3NoaW1fY21kX3BhY2tldChDQU1fU0hJTV9HRVRfUEFSTSwKKyAgICAgICAgICAgIG15X29iai0+c2Vzc2lvbmlkLCAmc2hpbV9jbWRfZGF0YSk7CisKKyAgICByYyA9IG1tX2NhbWVyYV9tb2R1bGVfc2VuZF9jbWQoc2hpbV9jbWQpOworICAgIG1tX2NhbWVyYV9kZXN0cm95X3NoaW1fY21kX3BhY2tldChzaGltX2NtZCk7CisjZW5kaWYgLyogREFFTU9OX1BSRVNFTlQgKi8KICAgICByZXR1cm4gKHJjID49IDApPyAwIDogLTE7CiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2NyZWF0ZV9zaGltX2NtZAorICoKKyAqIERFU0NSSVBUSU9OOiBQcmVwYXJlIGNvbWFuZCBwYWNrZXQgdG8gcGFzcyB0byBiYWNrLWVuZCB0aHJvdWdoIHNoaW0gbGF5ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHR5cGUgICAgICAgICAgICAgICAgOiB0eXBlIG9mIGNvbW1hbmQKKyAqICAgQHNlc3Npb25JRCAgICAgICAgOiBjYW1lcmEgc2Vzc2lvbklECisgICogIEBkYXRhICAgICAgICAgICAgICAgIDogY29tbWFuZCBkYXRhCisgKgorICogUkVUVVJOICAgICA6IE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlcworICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBwb2ludGVyIHRvIHNoaW0gcGFja2V0CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2NhbV9zaGltX3BhY2tldF90ICptbV9jYW1lcmFfY3JlYXRlX3NoaW1fY21kX3BhY2tldChjYW1fc2hpbV9jbWRfdHlwZSB0eXBlLAorICAgICAgICB1aW50MzJfdCBzZXNzaW9uSUQsIHZvaWQgKmRhdGEpCit7CisgICAgY2FtX3NoaW1fcGFja2V0X3QgKnNoaW1fcGFjayA9IE5VTEw7CisgICAgdWludDMyX3QgaSA9IDA7CisKKyAgICBzaGltX3BhY2sgPSAoY2FtX3NoaW1fcGFja2V0X3QgKiltYWxsb2Moc2l6ZW9mKGNhbV9zaGltX3BhY2tldF90KSk7CisgICAgaWYgKHNoaW1fcGFjayA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBhbGxvY2F0ZSBhIG1lbW9yeSBmb3Igc2hpbSBwYWNrZXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldChzaGltX3BhY2ssIDAsIHNpemVvZihjYW1fc2hpbV9wYWNrZXRfdCkpOworICAgIHNoaW1fcGFjay0+Y21kX3R5cGUgPSB0eXBlOworICAgIHNoaW1fcGFjay0+c2Vzc2lvbl9pZCA9IHNlc3Npb25JRDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBDQU1fU0hJTV9TRVRfUEFSTToKKyAgICAgICAgY2FzZSBDQU1fU0hJTV9HRVRfUEFSTTogeworICAgICAgICAgICAgY2FtX3NoaW1fY21kX2RhdGEgKmNtZF9kYXRhID0gKGNhbV9zaGltX2NtZF9kYXRhICopZGF0YTsKKyAgICAgICAgICAgIHNoaW1fcGFjay0+Y21kX2RhdGEgPSAqY21kX2RhdGE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENBTV9TSElNX1JFR19CVUY6IHsKKyAgICAgICAgICAgIGNhbV9yZWdfYnVmX3QgKmNtZF9kYXRhID0gKGNhbV9yZWdfYnVmX3QgKilkYXRhOworICAgICAgICAgICAgc2hpbV9wYWNrLT5yZWdfYnVmID0gKmNtZF9kYXRhOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDQU1fU0hJTV9CVU5ETEVfQ01EOiB7CisgICAgICAgICAgICBjYW1fc2hpbV9zdHJlYW1fY21kX3BhY2tldF90ICpjbWRfZGF0YSA9IChjYW1fc2hpbV9zdHJlYW1fY21kX3BhY2tldF90ICopZGF0YTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbWRfZGF0YS0+c3RyZWFtX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBzaGltX3BhY2stPmJ1bmRsZV9jbWQuc3RyZWFtX2V2ZW50W2ldID0gY21kX2RhdGEtPnN0cmVhbV9ldmVudFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNoaW1fcGFjay0+YnVuZGxlX2NtZC5zdHJlYW1fY291bnQgPSBjbWRfZGF0YS0+c3RyZWFtX2NvdW50OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1coIk5vIERhdGEgZm9yIHRoaXMgY29tbWFuZCIpOworICAgIH0KKyAgICByZXR1cm4gc2hpbV9wYWNrOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9kZXN0cm95X3NoaW1fY21kCisgKgorICogREVTQ1JJUFRJT046IGRlc3Ryb3kgc2hpbSBwYWNrZXQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNtZCAgICAgICAgICAgICAgICA6IHB0ciB0byBzaGltIHBhY2tldAorCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX2Rlc3Ryb3lfc2hpbV9jbWRfcGFja2V0KGNhbV9zaGltX3BhY2tldF90ICpjbWQpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgdWludDMyX3QgaSA9IDAsIGogPSAwOworCisgICAgaWYgKGNtZCA9PSBOVUxMKSB7CisgICAgICAgIExPR1coIkNvbW1hbmQgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgc3dpdGNoIChjbWQtPmNtZF90eXBlKSB7CisgICAgICAgIGNhc2UgQ0FNX1NISU1fU0VUX1BBUk06CisgICAgICAgIGNhc2UgQ0FNX1NISU1fR0VUX1BBUk06CisgICAgICAgIGNhc2UgQ0FNX1NISU1fUkVHX0JVRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTV9TSElNX0JVTkRMRV9DTUQ6IHsKKyAgICAgICAgICAgIGNhbV9zaGltX3N0cmVhbV9jbWRfcGFja2V0X3QgKmNtZF9kYXRhID0gKGNhbV9zaGltX3N0cmVhbV9jbWRfcGFja2V0X3QgKiljbWQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY21kX2RhdGEtPnN0cmVhbV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2FtX3NoaW1fY21kX3BhY2tldF90ICpzdHJlYW1fZXZ0ID0gJmNtZF9kYXRhLT5zdHJlYW1fZXZlbnRbaV07CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHN0cmVhbV9ldnQtPmNtZF9jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1fZXZ0LT5jbWQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RyZWFtX2V2dC0+Y21kLT5jbWRfdHlwZSA9PSBDQU1fU0hJTV9CVU5ETEVfQ01EKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2Rlc3Ryb3lfc2hpbV9jbWRfcGFja2V0KHN0cmVhbV9ldnQtPmNtZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHN0cmVhbV9ldnQtPmNtZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fZXZ0LT5jbWQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1coIk5vIERhdGEgZm9yIHRoaXMgY29tbWFuZCIpOworICAgIH0KKyAgICBmcmVlKGNtZCk7CisgICAgY21kID0gTlVMTDsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2NoYW5uZWxfYWR2YW5jZWRfY2FwdHVyZQogICoKICAqIERFU0NSSVBUSU9OOiBzZXRzIHRoZSBjaGFubmVsIGFkdmFuY2VkIGNhcHR1cmUKQEAgLTIwOTgsMTYgKzIzMzksMTggQEAKICAgICBpbnQzMl90IHJjID0gLTE7CiAgICAgaW50MzJfdCB2YWx1ZSA9IDA7CiAgICAgaWYoc2Vzc2lvbmlkICE9IE5VTEwpIHsKLSAgICAgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9nX2N0cmwobXlfb2JqLT5jdHJsX2ZkLAotICAgICAgICAgICAgICAgIE1TTV9DQU1FUkFfUFJJVl9HX1NFU1NJT05fSUQsICZ2YWx1ZSk7CisgICAgICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY29udHJvbDsKKyAgICAgICAgbWVtc2V0KCZjb250cm9sLCAwLCBzaXplb2YoY29udHJvbCkpOworICAgICAgICBjb250cm9sLmlkID0gTVNNX0NBTUVSQV9QUklWX0dfU0VTU0lPTl9JRDsKKyAgICAgICAgY29udHJvbC52YWx1ZSA9IHZhbHVlOworCisgICAgICAgIHJjID0gaW9jdGwobXlfb2JqLT5jdHJsX2ZkLCBWSURJT0NfR19DVFJMLCAmY29udHJvbCk7CisgICAgICAgIHZhbHVlID0gY29udHJvbC52YWx1ZTsKICAgICAgICAgTE9HRCgiZmQ9JWQsIGdldF9zZXNzaW9uX2lkLCBpZD0weCV4LCB2YWx1ZSA9ICVkLCByYyA9ICVkXG4iLAogICAgICAgICAgICAgICAgICBteV9vYmotPmN0cmxfZmQsIE1TTV9DQU1FUkFfUFJJVl9HX1NFU1NJT05fSUQsCiAgICAgICAgICAgICAgICAgdmFsdWUsIHJjKTsKICAgICAgICAgKnNlc3Npb25pZCA9IHZhbHVlOwotICAgICAgICBteV9vYmotPnNlc3Npb25pZCA9IHZhbHVlOwogICAgIH0KLQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKICAgICByZXR1cm4gcmM7CiB9CiAKQEAgLTIxMzMsNyArMjM3Niw3IEBACiAgICAgaW50MzJfdCByYyA9IC0xOwogICAgIGludDMyX3QgdmFsdWUgPSAwOwogICAgIGlmIChwYXJtcyAhPSAgTlVMTCkgewotICAgICAgICByYyA9IG1tX2NhbWVyYV91dGlsX3NfY3RybChteV9vYmotPmN0cmxfZmQsCisgICAgICAgIHJjID0gbW1fY2FtZXJhX3V0aWxfc19jdHJsKG15X29iaiwgMCwgbXlfb2JqLT5jdHJsX2ZkLAogICAgICAgICAgICAgICAgIENBTV9QUklWX1NZTkNfUkVMQVRFRF9TRU5TT1JTLCAmdmFsdWUpOwogICAgIH0KICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmFfY2hhbm5lbC5jIGIvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9zcmMvbW1fY2FtZXJhX2NoYW5uZWwuYwppbmRleCBlZTQ3YjU2Li4zMTI0NDg0IDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmFfY2hhbm5lbC5jCisrKyBiL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2Uvc3JjL21tX2NhbWVyYV9jaGFubmVsLmMKQEAgLTQ4LDYgKzQ4LDggQEAKIC8qIGludGVybmFsIGZ1bmN0aW9uIGRlY2xhcmUgZ29lcyBoZXJlICovCiBpbnQzMl90IG1tX2NoYW5uZWxfcWJ1ZihtbV9jaGFubmVsX3QgKm15X29iaiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmJ1Zik7CitpbnQzMl90IG1tX2NoYW5uZWxfY2FuY2VsX2J1ZihtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCwgdWludDMyX3QgYnVmX2lkeCk7CiBpbnQzMl90IG1tX2NoYW5uZWxfaW5pdChtbV9jaGFubmVsX3QgKm15X29iaiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfbm90aWZ5X3QgY2hhbm5lbF9jYiwKQEAgLTU0Myw2ICs1NDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5jdXJfY2FwdHVyZV9pZHgrKzsKICAgICAgICAgICAgICAgICAgICAgICAgIGNoX29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLmV4cGVjdGVkX2ZyYW1lX2lkID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5jYXB0dXJlX2ZyYW1lX2lkW2NoX29iai0+Y3VyX2NhcHR1cmVfaWR4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoX29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLmdvb2RfZnJhbWVfaWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaF9vYmotPmNhcHR1cmVfZnJhbWVfaWRbY2hfb2JqLT5jdXJfY2FwdHVyZV9pZHhdOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgTE9HSCgiTmVlZCAlZCBmcmFtZXMgbW9yZSBmb3IgYmF0Y2ggJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaF9vYmotPmZyYW1lQ29uZmlnLmNvbmZpZ3NbY2hfb2JqLT5jdXJfY2FwdHVyZV9pZHhdLm51bV9mcmFtZXMsCkBAIC04ODUsNyArODg5LDcgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dFKCJpbnZhbGlkIHN0YXRlICglZCkgZm9yIGV2dCAoJWQpIiwKKyAgICAgICAgTE9HVygiaW52YWxpZCBzdGF0ZSAoJWQpIGZvciBldnQgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIG15X29iai0+c3RhdGUsIGV2dCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTE1MTMsNiArMTUxNyw3IEBACiAgICAgICAgIG15X29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLmxlZF9vZmZfc3RhcnRfZnJhbWVfaWQgPSAwOwogICAgICAgICBteV9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5sZWRfb25fc3RhcnRfZnJhbWVfaWQgPSAwOwogICAgICAgICBteV9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5sZWRfb25fbnVtX2ZyYW1lcyA9IDA7CisgICAgICAgIG15X29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLmdvb2RfZnJhbWVfaWQgPSAwOwogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3RyZWFtc190b19zdGFydDsgaSsrKSB7CiAgICAgICAgICAgICAvKiBPbmx5IGJ1bmRsZSBzdHJlYW1zIHRoYXQgYmVsb25nIHRvIHRoZSBjaGFubmVsICovCkBAIC0xNzUwLDYgKzE3NTUsNyBAQAogICAgICAgICAvKiByZXNldCBmZXcgZmllbGRzIGluIHRoZSBidW5kbGUgaW5mbyAqLwogICAgICAgICBteV9vYmotPmJ1bmRsZS5pc19hY3RpdmUgPSAwOwogICAgICAgICBteV9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5leHBlY3RlZF9mcmFtZV9pZCA9IDA7CisgICAgICAgIG15X29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLmdvb2RfZnJhbWVfaWQgPSAwOwogICAgICAgICBteV9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5tYXRjaF9jbnQgPSAwOwogICAgIH0KIApAQCAtMjAzOCw2ICsyMDQ0LDQ0IEBACiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF9jYW5jZWxfYnVmCisgKgorICogREVTQ1JJUFRJT046IEdldCBiYWNrIGJ1ZmZlciBhbHJlYWR5IHNlbnQgdG8ga2VybmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjaGFubmVsIG9iamVjdAorICogICBAYnVmICAgICAgICAgIDogYnVmIHB0ciB0byBiZSBlbnF1ZXVlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jaGFubmVsX2NhbmNlbF9idWYobW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQsIHVpbnQzMl90IGJ1Zl9pZHgpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX3N0cmVhbV90KiBzX29iaiA9IG1tX2NoYW5uZWxfdXRpbF9nZXRfc3RyZWFtX2J5X2hhbmRsZXIobXlfb2JqLCBzdHJlYW1faWQpOworCisgICAgaWYgKE5VTEwgIT0gc19vYmopIHsKKyAgICAgICAgaWYgKHNfb2JqLT5jaF9vYmogIT0gbXlfb2JqKSB7CisgICAgICAgICAgICAvKiBSZWRpcmVjdCB0byBsaW5rZWQgc3RyZWFtICovCisgICAgICAgICAgICByYyA9IG1tX3N0cmVhbV9mc21fZm4oc19vYmotPmxpbmtlZF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIE1NX1NUUkVBTV9FVlRfQ0FOQ0VMX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmYnVmX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYyA9IG1tX3N0cmVhbV9mc21fZm4oc19vYmosCisgICAgICAgICAgICAgICAgICAgIE1NX1NUUkVBTV9FVlRfQ0FOQ0VMX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmYnVmX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX2dldF9xdWV1ZWRfYnVmX2NvdW50CiAgKgogICogREVTQ1JJUFRJT046IHJldHVybiBxdWV1ZWQgYnVmZmVyIGNvdW50CkBAIC0yMjA2LDE5ICsyMjUwLDE2IEBACiB7CiAgICAgaW50MzJfdCByYyA9IC0xOwogICAgIG1tX3N0cmVhbV90KiBzX29iaiA9IG1tX2NoYW5uZWxfdXRpbF9nZXRfc3RyZWFtX2J5X2hhbmRsZXIobXlfb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC0+c3RyZWFtX2lkKTsKKyAgICAgICAgICAgIHBheWxvYWQtPnN0cmVhbV9pZCk7CiAgICAgaWYgKE5VTEwgIT0gc19vYmopIHsKICAgICAgICAgaWYgKHNfb2JqLT5jaF9vYmogIT0gbXlfb2JqKSB7CiAgICAgICAgICAgICAvKiBObyBvcC4gb24gbGlua2VkIHN0cmVhbXMgKi8KICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0KICAgICAgICAgcmMgPSBtbV9zdHJlYW1fbWFwX2J1ZihzX29iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLT50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQtPmZyYW1lX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLT5wbGFuZV9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC0+ZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC0+c2l6ZSk7CisgICAgICAgICAgICAgICAgcGF5bG9hZC0+dHlwZSwgcGF5bG9hZC0+ZnJhbWVfaWR4LAorICAgICAgICAgICAgICAgIHBheWxvYWQtPnBsYW5lX2lkeCwgcGF5bG9hZC0+ZmQsCisgICAgICAgICAgICAgICAgcGF5bG9hZC0+c2l6ZSwgcGF5bG9hZC0+YnVmZmVyKTsKICAgICB9CiAKICAgICByZXR1cm4gcmM7CkBAIC0yMzU1LDYgKzIzOTYsNTYgQEAKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3ZhbGlkYXRlX3N1cGVyX2J1Zi4KKyAqCisgKiBERVNDUklQVElPTjogVmFsaWRhdGUgaW5jb21pbmcgYnVmZmVyIHdpdGggZXhpc3Rpbmcgc3VwZXIgYnVmZmVyLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2hfb2JqICA6IGNoYW5uZWwgb2JqZWN0CisgKiAgIEBxdWV1ZSAgIDogc3VwZXJidWYgcXVldWUKKyAqICAgQGJ1Zl9pbmZvOiBuZXcgYnVmZmVyIGZyb20gc3RyZWFtCisgKgorICogUkVUVVJOICAgICA6IGludDhfdCB0eXBlIG9mIHZhbGlkYXRpb24gcmVzdWx0CisgKiAgICAgICAgICAgICAgPjAgIC0tIFZhbGlkIGZyYW1lCisgKiAgICAgICAgICAgICAgPTAgIC0tIENhbm5vdCB2YWxpZGF0ZQorICogICAgICAgICAgICAgIDwwICAtLSBJbnZhbGlkIGZyYW1lLiBDYW4gYmUgZnJlZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50OF90IG1tX2NoYW5uZWxfdmFsaWRhdGVfc3VwZXJfYnVmKF9fdW51c2VkIG1tX2NoYW5uZWxfdCogY2hfb2JqLAorICAgICAgICBtbV9jaGFubmVsX3F1ZXVlX3QgKnF1ZXVlLCBtbV9jYW1lcmFfYnVmX2luZm9fdCAqYnVmX2luZm8pCit7CisgICAgaW50OF90IHJldCA9IDA7CisgICAgY2FtX25vZGVfdCogbm9kZSA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpoZWFkID0gTlVMTDsKKyAgICBzdHJ1Y3QgY2FtX2xpc3QgKnBvcyA9IE5VTEw7CisgICAgbW1fY2hhbm5lbF9xdWV1ZV9ub2RlX3QqIHN1cGVyX2J1ZiA9IE5VTEw7CisKKyAgICAodm9pZCljaF9vYmo7CisKKyAgICAvKiBjb21wICovCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZxdWV1ZS0+cXVlLmxvY2spOworICAgIGhlYWQgPSAmcXVldWUtPnF1ZS5oZWFkLmxpc3Q7CisgICAgLyogZ2V0IHRoZSBsYXN0IG9uZSBpbiB0aGUgcXVldWUgd2hpY2ggaXMgcG9zc2libHkgaGF2aW5nIG5vIG1hdGNoaW5nICovCisgICAgcG9zID0gaGVhZC0+bmV4dDsKKyAgICB3aGlsZSAocG9zICE9IGhlYWQpIHsKKyAgICAgICAgbm9kZSA9IG1lbWJlcl9vZihwb3MsIGNhbV9ub2RlX3QsIGxpc3QpOworICAgICAgICBzdXBlcl9idWYgPSAobW1fY2hhbm5lbF9xdWV1ZV9ub2RlX3QqKW5vZGUtPmRhdGE7CisgICAgICAgIGlmIChOVUxMICE9IHN1cGVyX2J1ZikgeworICAgICAgICAgICAgaWYgKChzdXBlcl9idWYtPmV4cGVjdGVkX2ZyYW1lKSAmJgorICAgICAgICAgICAgICAgICAgICAoYnVmX2luZm8tPmZyYW1lX2lkeCA9PSBzdXBlcl9idWYtPmZyYW1lX2lkeCkpIHsKKyAgICAgICAgICAgICAgICAvL1RoaXMgaXMgZ29vZCBmcmFtZS4gRXhwZWN0aW5nIG1vcmUgZnJhbWVzLiBLZWVwaW5nIHRoaXMgZnJhbWUuCisgICAgICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcG9zID0gcG9zLT5uZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+cXVlLmxvY2spOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF9oYW5kbGVfbWV0YWRhdGEKICAqCiAgKiBERVNDUklQVElPTjogSGFuZGxlIGZyYW1lIG1hdGNoaW5nIGxvZ2ljIGNoYW5nZSBkdWUgdG8gbWV0YWRhdGEKQEAgLTI1MDMsNyArMjU5NCw4IEBACiAgICAgICAgIGlmIChpc19nb29kX2ZyYW1lX2lkeF9yYW5nZV92YWxpZCkgewogICAgICAgICAgICAgcXVldWUtPmV4cGVjdGVkX2ZyYW1lX2lkID0KICAgICAgICAgICAgICAgICBnb29kX2ZyYW1lX2lkeF9yYW5nZS5taW5fZnJhbWVfaWR4OwotICAgICAgICAgICAgIGlmKChjaF9vYmotPm5lZWRMRURGbGFzaCA9PSBUUlVFKSAmJiAoY2hfb2JqLT5idXJzdFNuYXBOdW0gPiAxKSkgeworICAgICAgICAgICAgcXVldWUtPmdvb2RfZnJhbWVfaWQgPSBnb29kX2ZyYW1lX2lkeF9yYW5nZS5taW5fZnJhbWVfaWR4OworICAgICAgICAgICAgaWYoKGNoX29iai0+bmVlZExFREZsYXNoID09IFRSVUUpICYmIChjaF9vYmotPmJ1cnN0U25hcE51bSA+IDEpKSB7CiAgICAgICAgICAgICAgICAgcXVldWUtPmxlZF9vbl9zdGFydF9mcmFtZV9pZCA9CiAgICAgICAgICAgICAgICAgZ29vZF9mcmFtZV9pZHhfcmFuZ2UubWluX2ZyYW1lX2lkeDsKICAgICAgICAgICAgICAgICBxdWV1ZS0+bGVkX29mZl9zdGFydF9mcmFtZV9pZCA9CkBAIC0yNTMyLDE2ICsyNjI0LDE4IEBACiAgICAgICAgICAgICAqIGluIHZhbGlkIHJhbmdlIG1pbiBmcmFtZSBpcyB3aXRoIGxlZCBmbGFzaCBhbmQgbWF4IGZyYW1lIGlzCiAgICAgICAgICAgICAqIHdpdGhvdXQgbGVkIGZsYXNoICovCiAgICAgICAgICAgICBxdWV1ZS0+ZXhwZWN0ZWRfZnJhbWVfaWQgPQotICAgICAgICAgICAgICAgIGdvb2RfZnJhbWVfaWR4X3JhbmdlLm1pbl9mcmFtZV9pZHg7CisgICAgICAgICAgICAgICAgICAgIGdvb2RfZnJhbWVfaWR4X3JhbmdlLm1pbl9mcmFtZV9pZHg7CiAgICAgICAgICAgICAvKiBtYXggZnJhbWUgaXMgd2l0aG91dCBsZWQgZmxhc2ggKi8KICAgICAgICAgICAgIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZF93aXRob3V0X2xlZCA9Ci0gICAgICAgICAgICAgICAgZ29vZF9mcmFtZV9pZHhfcmFuZ2UubWF4X2ZyYW1lX2lkeDsKLQorICAgICAgICAgICAgICAgICAgICBnb29kX2ZyYW1lX2lkeF9yYW5nZS5tYXhfZnJhbWVfaWR4OworICAgICAgICAgICAgcXVldWUtPmdvb2RfZnJhbWVfaWQgPQorICAgICAgICAgICAgICAgICAgICBnb29kX2ZyYW1lX2lkeF9yYW5nZS5taW5fZnJhbWVfaWR4OwogICAgICAgICB9IGVsc2UgaWYgKGlzX2dvb2RfZnJhbWVfaWR4X3JhbmdlX3ZhbGlkKSB7CiAgICAgICAgICAgICBxdWV1ZS0+ZXhwZWN0ZWRfZnJhbWVfaWQgPQogICAgICAgICAgICAgICAgICAgICBnb29kX2ZyYW1lX2lkeF9yYW5nZS5taW5fZnJhbWVfaWR4OwotCiAgICAgICAgICAgICBjaF9vYmotPmJyYWNrZXRpbmdTdGF0ZSA9IE1NX0NIQU5ORUxfQlJBQ0tFVElOR19TVEFURV9BQ1RJVkU7CisgICAgICAgICAgICBxdWV1ZS0+Z29vZF9mcmFtZV9pZCA9CisgICAgICAgICAgICAgICAgICAgIGdvb2RfZnJhbWVfaWR4X3JhbmdlLm1pbl9mcmFtZV9pZHg7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoY2hfb2JqLT5pc0NvbmZpZ0NhcHR1cmUgJiYgaXNfZ29vZF9mcmFtZV9pZHhfcmFuZ2VfdmFsaWQKQEAgLTI1NTksNiArMjY1Myw3IEBACiAgICAgICAgICAgICAgICAgcXVldWUtPmV4cGVjdGVkX2ZyYW1lX2lkID0KICAgICAgICAgICAgICAgICAgICAgICAgIGNoX29iai0+Y2FwdHVyZV9mcmFtZV9pZFtjaF9vYmotPmN1cl9jYXB0dXJlX2lkeF07CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBxdWV1ZS0+Z29vZF9mcmFtZV9pZCA9IHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZDsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgoY2hfb2JqLT5idXJzdFNuYXBOdW0gPiAxKSAmJiAoY2hfb2JqLT5uZWVkTEVERmxhc2ggPT0gVFJVRSkKQEAgLTI2NTksOCArMjc1NCw5IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAobW1fY2hhbm5lbF91dGlsX3NlcV9jb21wX3dfcm9sbG92ZXIoYnVmX2luZm8tPmZyYW1lX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUtPmV4cGVjdGVkX2ZyYW1lX2lkKSA8IDApIHsKKyAgICBpZiAoKG1tX2NoYW5uZWxfdXRpbF9zZXFfY29tcF93X3JvbGxvdmVyKGJ1Zl9pbmZvLT5mcmFtZV9pZHgsCisgICAgICAgICAgICBxdWV1ZS0+ZXhwZWN0ZWRfZnJhbWVfaWQpIDwgMCkgJiYKKyAgICAgICAgICAgIChtbV9jaGFubmVsX3ZhbGlkYXRlX3N1cGVyX2J1ZihjaF9vYmosIHF1ZXVlLCBidWZfaW5mbykgPD0gMCkpIHsKICAgICAgICAgTE9HSCgiaW5jb21pbmcgYnVmIGlkKCVkKSBpcyBvbGRlciB0aGFuIGV4cGVjdGVkIGJ1ZiBpZCglZCksIHdpbGwgZGlzY2FyZCBpdCIsCiAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5mcmFtZV9pZHgsIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZCk7CiAgICAgICAgIG1tX2NoYW5uZWxfcWJ1ZihjaF9vYmosIGJ1Zl9pbmZvLT5idWYpOwpAQCAtMjY4OCw3ICsyNzg0LDcgQEAKICAgICAgICAgICAgICAgICAvKiBmaW5kIGEgbWF0Y2hlZCBzdXBlciBidWYsIG1vdmUgdG8gbmV4dCBvbmUgKi8KICAgICAgICAgICAgICAgICBwb3MgPSBwb3MtPm5leHQ7CiAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCBidWZfaW5mby0+ZnJhbWVfaWR4ID09IHN1cGVyX2J1Zi0+ZnJhbWVfaWR4CisgICAgICAgICAgICB9IGVsc2UgaWYgKCggYnVmX2luZm8tPmZyYW1lX2lkeCA9PSBzdXBlcl9idWYtPmZyYW1lX2lkeCApCiAgICAgICAgICAgICAgICAgICAgIC8qUGljayBtZXRhZGF0YSBncmVhdGVyIHRoYW4gYXZhaWxhYmxlIGZyYW1lSUQqLwogICAgICAgICAgICAgICAgICAgICB8fCAoKHF1ZXVlLT5hdHRyLnByaW9yaXR5ID09IE1NX0NBTUVSQV9TVVBFUl9CVUZfUFJJT1JJVFlfTE9XKQogICAgICAgICAgICAgICAgICAgICAmJiAoc3VwZXJfYnVmLT5zdXBlcl9idWZbYnVmX3NfaWR4XS5mcmFtZV9pZHggPT0gMCkKQEAgLTI2OTgsMTEgKzI3OTQsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgfHwgKChxdWV1ZS0+YXR0ci5wcmlvcml0eSA9PSBNTV9DQU1FUkFfU1VQRVJfQlVGX1BSSU9SSVRZX0xPVykKICAgICAgICAgICAgICAgICAgICAgJiYgKGJ1Zl9pbmZvLT5idWYtPnN0cmVhbV90eXBlICE9IENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSkKICAgICAgICAgICAgICAgICAgICAgJiYgKHN1cGVyX2J1Zi0+c3VwZXJfYnVmW2J1Zl9zX2lkeF0uZnJhbWVfaWR4ID09IDApCi0gICAgICAgICAgICAgICAgICAgICYmIChzdXBlcl9idWYtPmZyYW1lX2lkeCA+IGJ1Zl9pbmZvLT5mcmFtZV9pZHgpKSl7CisgICAgICAgICAgICAgICAgICAgICYmIChzdXBlcl9idWYtPnVubWF0Y2hlZF9tZXRhX2lkeCA+IGJ1Zl9pbmZvLT5mcmFtZV9pZHgpKSl7CiAgICAgICAgICAgICAgICAgLypzdXBlciBidWZmZXIgZnJhbWUgSURzIG1hdGNoaW5nIE9SIEluIGxvdyBwcmlvcml0eSBidW5kbGluZwogICAgICAgICAgICAgICAgIG1ldGFkYXRhIGZyYW1lSUQgZ3JlYXRlciB0aGFuIGF2aWFsYmFsZSBzdXBlciBidWZmZXIgZnJhbWVJRCAgT1IKICAgICAgICAgICAgICAgICBtZXRhZGF0YSBmcmFtZSBjbG9zZXN0IHRvIGluY29taW5nIGZyYW1lSUQgd2lsbCBiZSBidW5kbGVkKi8KICAgICAgICAgICAgICAgICBmb3VuZF9zdXBlcl9idWYgPSAxOworICAgICAgICAgICAgICAgIC8qIElmIHdlIGFyZSBmaWxsaW5nIGludG8gYSAnbWV0YSBvbmx5JyBzdXBlcmJ1ZiwgbWFrZSBzdXJlIHRvIHJlc2V0CisgICAgICAgICAgICAgICAgdGhlIHN1cGVyX2J1ZiBmcmFtZV9pZHggc28gdGhhdCBtaXNzaW5nIHN0cmVhbXMgaW4gdGhpcyBzdXBlcmJ1ZgorICAgICAgICAgICAgICAgIGFyZSBmaWxsZWQgYXMgcGVyIG1hdGNoaW5nIGZyYW1lIGlkIGxvZ2ljLiBOb3RlIHRoYXQsIGluIGxvdyBwcmlvcml0eQorICAgICAgICAgICAgICAgIHF1ZXVlLCBvbmx5IG1ldGEgZnJhbWUgaWQgbmVlZCBub3QgbWF0Y2ggKGNsb3Nlc3Qgc3VmZmljZXMpIGJ1dAorICAgICAgICAgICAgICAgIHRoZSBvdGhlciBzdHJlYW1zIGluIHRoaXMgc3VwZXJidWYgc2hvdWxkIGhhdmUgc2FtZSBmcmFtZSBpZC4gKi8KKyAgICAgICAgICAgICAgICBpZiAoc3VwZXJfYnVmLT51bm1hdGNoZWRfbWV0YV9pZHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyX2J1Zi0+dW5tYXRjaGVkX21ldGFfaWR4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXJfYnVmLT5mcmFtZV9pZHggPSBidWZfaW5mby0+ZnJhbWVfaWR4OworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdW5tYXRjaGVkX2J1bmRsZXMrKzsKQEAgLTI3NTUsNyArMjg2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHF1ZXVlLT5hdHRyLnBvc3RfZnJhbWVfc2tpcDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3VwZXJfYnVmLT5leHBlY3RlZCA9IEZBTFNFOworICAgICAgICAgICAgc3VwZXJfYnVmLT5leHBlY3RlZF9mcmFtZSA9IEZBTFNFOwogCiAgICAgICAgICAgICBMT0dEKCJjdXJyID0gJWQsIHNraXAgPSAlZCAsIEV4cGVjdGVkIEZyYW1lIElEOiAlZCIsCiAgICAgICAgICAgICAgICAgICAgICBidWZfaW5mby0+ZnJhbWVfaWR4LApAQCAtMjc5MSw3ICsyODk2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfWVsc2UgewogICAgICAgICAgICAgaWYgKGNoX29iai0+ZGl2ZXJ0ZWRfZnJhbWVfaWQgPT0gYnVmX2luZm8tPmZyYW1lX2lkeCkgewotICAgICAgICAgICAgICAgIHN1cGVyX2J1Zi0+ZXhwZWN0ZWQgPSBUUlVFOworICAgICAgICAgICAgICAgIHN1cGVyX2J1Zi0+ZXhwZWN0ZWRfZnJhbWUgPSBUUlVFOwogICAgICAgICAgICAgICAgIGNoX29iai0+ZGl2ZXJ0ZWRfZnJhbWVfaWQgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yODA4LDcgKzI5MTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiAobGFzdF9idWZfcHRyICE9IE5VTEwgJiYgbGFzdF9idWZfcHRyICE9IHBvcykpIHsKICAgICAgICAgICAgICAgICBub2RlID0gbWVtYmVyX29mKGxhc3RfYnVmX3B0ciwgY2FtX25vZGVfdCwgbGlzdCk7CiAgICAgICAgICAgICAgICAgc3VwZXJfYnVmID0gKG1tX2NoYW5uZWxfcXVldWVfbm9kZV90Kilub2RlLT5kYXRhOwotICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHN1cGVyX2J1ZiAmJiBzdXBlcl9idWYtPmV4cGVjdGVkID09IEZBTFNFCisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gc3VwZXJfYnVmICYmIHN1cGVyX2J1Zi0+ZXhwZWN0ZWRfZnJhbWUgPT0gRkFMU0UKICAgICAgICAgICAgICAgICAgICAgICAgICYmICgmbm9kZS0+bGlzdCAhPSBpbnNlcnRfYmVmb3JlX2J1ZikpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8c3VwZXJfYnVmLT5udW1fb2ZfYnVmczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VwZXJfYnVmLT5zdXBlcl9idWZbaV0uZnJhbWVfaWR4ICE9IDApIHsKQEAgLTI4NTMsOCArMjk1OCw5IEBACiAgICAgICAgICAgICAgICAgbmV3X2J1Zi0+c3VwZXJfYnVmW2J1Zl9zX2lkeF0gPSAqYnVmX2luZm87CiAgICAgICAgICAgICAgICAgbmV3X2J1Zi0+ZnJhbWVfaWR4ID0gYnVmX2luZm8tPmZyYW1lX2lkeDsKIAotICAgICAgICAgICAgICAgIGlmIChjaF9vYmotPmRpdmVydGVkX2ZyYW1lX2lkID09IGJ1Zl9pbmZvLT5mcmFtZV9pZHgpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3X2J1Zi0+ZXhwZWN0ZWQgPSBUUlVFOworICAgICAgICAgICAgICAgIGlmICgoY2hfb2JqLT5kaXZlcnRlZF9mcmFtZV9pZCA9PSBidWZfaW5mby0+ZnJhbWVfaWR4KQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGJ1Zl9pbmZvLT5mcmFtZV9pZHggPT0gcXVldWUtPmdvb2RfZnJhbWVfaWQpKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld19idWYtPmV4cGVjdGVkX2ZyYW1lID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5kaXZlcnRlZF9mcmFtZV9pZCA9IDA7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yODY4LDcgKzI5NzQsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYocXVldWUtPm51bV9zdHJlYW1zID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgbmV3X2J1Zi0+bWF0Y2hlZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIG5ld19idWYtPmV4cGVjdGVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIG5ld19idWYtPmV4cGVjdGVkX2ZyYW1lID0gRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZCA9IGJ1Zl9pbmZvLT5mcmFtZV9pZHggKyBxdWV1ZS0+YXR0ci5wb3N0X2ZyYW1lX3NraXA7CiAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT5tYXRjaF9jbnQrKzsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNoX29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLmF0dHIuZW5hYmxlX2ZyYW1lX3N5bmMpIHsKQEAgLTI4NzcsNiArMjk4MywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmZzX2xvY2spOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEluIGxvdyBwcmlvcml0eSBxdWV1ZSwgdGhpcyB3aWxsIGJlY29tZSBhICdtZXRhIG9ubHknIHN1cGVyYnVmLiBTZXQgdGhlCisgICAgICAgICAgICAgICAgdW5tYXRjaGVkX2ZyYW1lX2lkeCBzbyB0aGF0IHRoZSB1cGNvbWluZyBzdHJlYW0gYnVmZmVycyAob3RoZXIgdGhhbiBtZXRhKQorICAgICAgICAgICAgICAgIGNhbiBiZSBmaWxsZWQgaW50byB0aGlzIHdoaWNoIGFyZSBuZWFyZXN0IHRvIHRoaXMgaWR4LiAqLworICAgICAgICAgICAgICAgIGlmICgocXVldWUtPmF0dHIucHJpb3JpdHkgPT0gTU1fQ0FNRVJBX1NVUEVSX0JVRl9QUklPUklUWV9MT1cpCisgICAgICAgICAgICAgICAgICAgICYmIChidWZfaW5mby0+YnVmLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld19idWYtPnVubWF0Y2hlZF9tZXRhX2lkeCA9IGJ1Zl9pbmZvLT5mcmFtZV9pZHg7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvKiBObyBtZW1vcnkgKi8KICAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBuZXdfYnVmKSB7CmRpZmYgLS1naXQgYS9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmFfaW50ZXJmYWNlLmMgYi9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmFfaW50ZXJmYWNlLmMKaW5kZXggYzE0Y2VmNC4uMjkxYTQ5NSAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9zcmMvbW1fY2FtZXJhX2ludGVyZmFjZS5jCisrKyBiL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2Uvc3JjL21tX2NhbWVyYV9pbnRlcmZhY2UuYwpAQCAtMzcsMTMgKzM3LDE0IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8bGludXgvbWVkaWEuaD4KICNpbmNsdWRlIDxtZWRpYS9tc21fY2FtX3NlbnNvci5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisKICNkZWZpbmUgSU9DVExfSCA8U1lTVEVNX0hFQURFUl9QUkVGSVgvaW9jdGwuaD4KICNpbmNsdWRlIElPQ1RMX0gKIAogLy8gQ2FtZXJhIGRlcGVuZGVuY2llcwogI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKICNpbmNsdWRlICJtbV9jYW1lcmFfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAibW1fY2FtZXJhX3NvY2suaCIKICNpbmNsdWRlICJtbV9jYW1lcmEuaCIKIAogc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBnX2ludGZfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CkBAIC0xNDEsNiArMTQyLDMxIEBACiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9zZXNzaW9uX2lkCisgKgorICogREVTQ1JJUFRJT046IHV0aWxpdHkgZnVuY3Rpb24gdG8gZ2V0IGNhbWVyYSBvYmplY3QgZnJvbSBjYW1lcmEgc2Vzc2lvbklECisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzZXNzaW9uX2lkOiBzZXNzaW9uaWQgZm9yIHdoaWNoIGNhbSBvYmogbWFwcGVkCisgKgorICogUkVUVVJOICAgICA6IHB0ciB0byB0aGUgY2FtZXJhIG9iamVjdCBzdG9yZWQgaW4gZ2xvYmFsIHZhcmlhYmxlCisgKiBOT1RFICAgICAgIDogY2FsbGVyIHNob3VsZCBub3QgZnJlZSB0aGUgY2FtZXJhIG9iamVjdCBwdHIKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworbW1fY2FtZXJhX29ial90KiBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X3Nlc3Npb25faWQodWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKyAgIGludCBjYW1faWR4ID0gMDsKKyAgIG1tX2NhbWVyYV9vYmpfdCAqY2FtX29iaiA9IE5VTEw7CisgICBmb3IgKGNhbV9pZHggPSAwOyBjYW1faWR4IDwgTU1fQ0FNRVJBX01BWF9OVU1fU0VOU09SUzsgY2FtX2lkeCsrKSB7CisgICAgICAgIGlmICgoTlVMTCAhPSBnX2NhbV9jdHJsLmNhbV9vYmpbY2FtX2lkeF0pICYmCisgICAgICAgICAgICAgICAgKHNlc3Npb25faWQgPT0gKHVpbnQzMl90KWdfY2FtX2N0cmwuY2FtX29ialtjYW1faWR4XS0+c2Vzc2lvbmlkKSkgeworICAgICAgICAgICAgTE9HRCgic2Vzc2lvbiBpZDolZCBtYXRjaCBpZHg6JWRcbiIsIHNlc3Npb25faWQsIGNhbV9pZHgpOworICAgICAgICAgICAgY2FtX29iaiA9IGdfY2FtX2N0cmwuY2FtX29ialtjYW1faWR4XTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2FtX29iajsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfaW50Zl9xdWVyeV9jYXBhYmlsaXR5CiAgKgogICogREVTQ1JJUFRJT046IHF1ZXJ5IGNhbWVyYSBjYXBhYmlsaXR5CkBAIC02MDYsNiArNjMyLDQxIEBACiB9CiAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfcWJ1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBlbnF1ZXVlIGJ1ZmZlciBiYWNrIHRvIGtlcm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqICAgQGJ1ZiAgICAgICAgICA6IGJ1ZiBwdHIgdG8gYmUgZW5xdWV1ZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX2NhbmNlbF9idWYodWludDMyX3QgY2FtZXJhX2hhbmRsZSwgdWludDMyX3QgY2hfaWQsIHVpbnQzMl90IHN0cmVhbV9pZCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1Zl9pZHgpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfaW50Zl9sb2NrKTsKKyAgICBteV9vYmogPSBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X2hhbmRsZXIoY2FtZXJhX2hhbmRsZSk7CisKKyAgICBpZihteV9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfY2FuY2VsX2J1ZihteV9vYmosIGNoX2lkLCBzdHJlYW1faWQsIGJ1Zl9pZHgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgfQorICAgIExPR0QoIlggZXZ0X3R5cGUgPSAlZCIscmMpOworICAgIHJldHVybiByYzsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX2dldF9xdWV1ZWRfYnVmX2NvdW50CiAgKgogICogREVTQ1JJUFRJT046IHJldHVybnMgdGhlIHF1ZXVlZCBidWZmZXIgY291bnQKQEAgLTEwOTcsOSArMTE1OCw3IEBACiAgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiBzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfaW50Zl9tYXBfYnVmKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpCisgICAgdWludDhfdCBidWZfdHlwZSwgaW50IGZkLCBzaXplX3Qgc2l6ZSwgdm9pZCAqYnVmZmVyKQogewogICAgIGludDMyX3QgcmMgPSAtMTsKICAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOwpAQCAtMTExMCwxNSArMTE2OSwzMSBAQAogICAgIGlmKG15X29iaikgewogICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2FtX2xvY2spOwogICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOwotICAgICAgICByYyA9IG1tX2NhbWVyYV9tYXBfYnVmKG15X29iaiwgYnVmX3R5cGUsIGZkLCBzaXplKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfbWFwX2J1ZihteV9vYmosIGJ1Zl90eXBlLCBmZCwgc2l6ZSwgYnVmZmVyKTsKICAgICB9IGVsc2UgewogICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOwogICAgIH0KICAgICByZXR1cm4gcmM7CiB9CiAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfbWFwX2J1ZnMKKyAqCisgKiBERVNDUklQVElPTjogbWFwcGluZyBjYW1lcmEgYnVmZmVyIHZpYSBkb21haW4gc29ja2V0IHRvIHNlcnZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAYnVmX3R5cGUgICAgIDogdHlwZSBvZiBidWZmZXIgdG8gYmUgbWFwcGVkLiBjb3VsZCBiZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfQ0FQQUJJTElUWQorICogICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU0VUUEFSTV9CVUYKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX0dFVFBBUk1fQlVGCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiBzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfaW50Zl9tYXBfYnVmcyh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtX2J1Zl9tYXBfdHlwZV9saXN0ICpidWZfbWFwX2xpc3QpCisgICAgICAgIGNvbnN0IGNhbV9idWZfbWFwX3R5cGVfbGlzdCAqYnVmX21hcF9saXN0KQogewogICAgIGludDMyX3QgcmMgPSAtMTsKICAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOwpAQCAtMTI4NywxMyArMTM2Miw5IEBACiAgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiBzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfaW50Zl9tYXBfc3RyZWFtX2J1Zih1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJ1Zl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpCisgICAgICAgIHVpbnQzMl90IGNoX2lkLCB1aW50MzJfdCBzdHJlYW1faWQsIHVpbnQ4X3QgYnVmX3R5cGUsCisgICAgICAgIHVpbnQzMl90IGJ1Zl9pZHgsIGludDMyX3QgcGxhbmVfaWR4LCBpbnQgZmQsCisgICAgICAgIHNpemVfdCBzaXplLCB2b2lkICpidWZmZXIpCiB7CiAgICAgaW50MzJfdCByYyA9IC0xOwogICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CkBAIC0xMzA5LDcgKzEzODAsNyBAQAogICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOwogICAgICAgICByYyA9IG1tX2NhbWVyYV9tYXBfc3RyZWFtX2J1ZihteV9vYmosIGNoX2lkLCBzdHJlYW1faWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl90eXBlLCBidWZfaWR4LCBwbGFuZV9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIHNpemUsIGJ1ZmZlcik7CiAgICAgfWVsc2V7CiAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CiAgICAgfQpAQCAtMTQzNiw3ICsxNTA3LDkgQEAKICAgICBpZihteV9vYmopIHsKICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKLSAgICAgICAgcmMgPSBtbV9jYW1lcmFfZ2V0X3Nlc3Npb25faWQobXlfb2JqLCBzZXNzaW9uaWQpOworICAgICAgICAqc2Vzc2lvbmlkID0gbXlfb2JqLT5zZXNzaW9uaWQ7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgcmMgPSAwOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CiAgICAgfQpAQCAtMTcxOSwxMCArMTc5MiwxNiBAQAogICAgIGludCBkZWNyeXB0ID0gYXRvaShwcm9wKTsKICAgICBpZiAoZGVjcnlwdCA9PSAxKQogICAgICByZXR1cm4gMDsKLQotICAgIC8qIGxvY2sgdGhlIG11dGV4ICovCiAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CiAKKyAgICBtZW1zZXQgKCZnX2NhbV9jdHJsLCAwLCBzaXplb2YgKGdfY2FtX2N0cmwpKTsKKyNpZm5kZWYgREFFTU9OX1BSRVNFTlQKKyAgICBpZiAobW1fY2FtZXJhX2xvYWRfc2hpbV9saWIoKSA8IDApIHsKKyAgICAgICAgTE9HRSAoIkZhaWxlZCB0byBtb2R1bGUgc2hpbSBsaWJyYXJ5Iik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZiAvKiBEQUVNT05fUFJFU0VOVCAqLworCiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgdWludDMyX3QgbnVtX2VudGl0aWVzID0gMVU7CiAgICAgICAgIGNoYXIgZGV2X25hbWVbMzJdOwpAQCAtMTk2Nyw2ICsyMDQ2LDcgQEAKICAgICAuZGVsZXRlX3N0cmVhbSA9IG1tX2NhbWVyYV9pbnRmX2RlbF9zdHJlYW0sCiAgICAgLmNvbmZpZ19zdHJlYW0gPSBtbV9jYW1lcmFfaW50Zl9jb25maWdfc3RyZWFtLAogICAgIC5xYnVmID0gbW1fY2FtZXJhX2ludGZfcWJ1ZiwKKyAgICAuY2FuY2VsX2J1ZmZlciA9IG1tX2NhbWVyYV9pbnRmX2NhbmNlbF9idWYsCiAgICAgLmdldF9xdWV1ZWRfYnVmX2NvdW50ID0gbW1fY2FtZXJhX2ludGZfZ2V0X3F1ZXVlZF9idWZfY291bnQsCiAgICAgLm1hcF9zdHJlYW1fYnVmID0gbW1fY2FtZXJhX2ludGZfbWFwX3N0cmVhbV9idWYsCiAgICAgLm1hcF9zdHJlYW1fYnVmcyA9IG1tX2NhbWVyYV9pbnRmX21hcF9zdHJlYW1fYnVmcywKQEAgLTIwNjYsMyArMjE0NiwxNDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9sb2FkX3NoaW1fbGliCisgKgorICogREVTQ1JJUFRJT046IExvYWQgc2hpbSBsYXllciBsaWJyYXJ5CisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IHN0YXR1cyBvZiBsb2FkIHNoaW0gbGlicmFyeQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9sb2FkX3NoaW1fbGliKCkKK3sKKyAgICBjb25zdCBjaGFyKiBlcnJvciA9IE5VTEw7CisgICAgdm9pZCAqcWRhZW1vbl9saWIgPSBOVUxMOworCisgICAgTE9HRCgiRSIpOworICAgIHFkYWVtb25fbGliID0gZGxvcGVuKFNISU1MQVlFUl9MSUIsIFJUTERfTk9XKTsKKyAgICBpZiAoIXFkYWVtb25fbGliKSB7CisgICAgICAgIGVycm9yID0gZGxlcnJvcigpOworICAgICAgICBMT0dFKCJkbG9wZW4gZmFpbGVkIHdpdGggZXJyb3IgJXMiLCBlcnJvciA/IGVycm9yIDogIiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgKih2b2lkICoqKSZtbV9jYW1lcmFfc2hpbV9tb2R1bGVfaW5pdCA9CisgICAgICAgICAgICBkbHN5bShxZGFlbW9uX2xpYiwgIm1jdF9zaGltbGF5ZXJfcHJvY2Vzc19tb2R1bGVfaW5pdCIpOworICAgIGlmICghbW1fY2FtZXJhX3NoaW1fbW9kdWxlX2luaXQpIHsKKyAgICAgICAgZXJyb3IgPSBkbGVycm9yKCk7CisgICAgICAgIExPR0UoImRsc3ltIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJXMiLCBlcnJvciA/IGVycm9yOiAiIik7CisgICAgICAgIGRsY2xvc2UocWRhZW1vbl9saWIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIG1tX2NhbWVyYV9zaGltX21vZHVsZV9pbml0KCZnX2NhbV9jdHJsLmNhbV9zaGltX29wcyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX21vZHVsZV9vcGVuX3Nlc3Npb24KKyAqCisgKiBERVNDUklQVElPTjogd3JhcHBlciBmdW5jdGlvbiB0byBjYWxsIHNoaW0gbGF5ZXIgQVBJIHRvIG9wZW4gc2Vzc2lvbi4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHNlc3Npb25pZCAgOiBzZXNzaW9uSUQgdG8gb3BlbiBzZXNzaW9uCisgKiAgIEBldnRfY2IgICAgIDogRXZlbnQgY2FsbGJhY2sgZnVuY3Rpb24KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub24temVybyBlcnJvciBjb2RlIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY2FtX3N0YXR1c190IG1tX2NhbWVyYV9tb2R1bGVfb3Blbl9zZXNzaW9uKGludCBzZXNzaW9uaWQsCisgICAgICAgIG1tX2NhbWVyYV9zaGltX2V2ZW50X2hhbmRsZXJfZnVuYyBldnRfY2IpCit7CisgICAgY2FtX3N0YXR1c190IHJjID0gLTE7CisgICAgaWYoZ19jYW1fY3RybC5jYW1fc2hpbV9vcHMubW1fY2FtZXJhX3NoaW1fb3Blbl9zZXNzaW9uKSB7CisgICAgICAgIHJjID0gZ19jYW1fY3RybC5jYW1fc2hpbV9vcHMubW1fY2FtZXJhX3NoaW1fb3Blbl9zZXNzaW9uKAorICAgICAgICAgICAgICAgIHNlc3Npb25pZCwgZXZ0X2NiKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9tb2R1bGVfY2xvc2Vfc2Vzc2lvbgorICoKKyAqIERFU0NSSVBUSU9OOiB3cmFwcGVyIGZ1bmN0aW9uIHRvIGNhbGwgc2hpbSBsYXllciBBUEkgdG8gY2xvc2Ugc2Vzc2lvbgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc2Vzc2lvbmlkICA6IHNlc3Npb25JRCB0byBvcGVuIHNlc3Npb24KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub24temVybyBlcnJvciBjb2RlIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfbW9kdWxlX2Nsb3NlX3Nlc3Npb24oaW50IHNlc3Npb24pCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIGlmKGdfY2FtX2N0cmwuY2FtX3NoaW1fb3BzLm1tX2NhbWVyYV9zaGltX2Nsb3NlX3Nlc3Npb24pIHsKKyAgICAgICAgcmMgPSBnX2NhbV9jdHJsLmNhbV9zaGltX29wcy5tbV9jYW1lcmFfc2hpbV9jbG9zZV9zZXNzaW9uKHNlc3Npb24pOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX21vZHVsZV9vcGVuX3Nlc3Npb24KKyAqCisgKiBERVNDUklQVElPTjogd3JhcHBlciBmdW5jdGlvbiB0byBjYWxsIHNoaW0gbGF5ZXIgQVBJCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzZXNzaW9uaWQgIDogc2Vzc2lvbklEIHRvIG9wZW4gc2Vzc2lvbgorICogICBAZXZ0X2NiICAgICA6IEV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uLXplcm8gZXJyb3IgY29kZSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX21vZHVsZV9zZW5kX2NtZChjYW1fc2hpbV9wYWNrZXRfdCAqZXZlbnQpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIGlmKGdfY2FtX2N0cmwuY2FtX3NoaW1fb3BzLm1tX2NhbWVyYV9zaGltX3NlbmRfY21kKSB7CisgICAgICAgIHJjID0gZ19jYW1fY3RybC5jYW1fc2hpbV9vcHMubW1fY2FtZXJhX3NoaW1fc2VuZF9jbWQoZXZlbnQpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX21vZHVsZV9ldmVudF9oYW5kbGVyCisgKgorICogREVTQ1JJUFRJT046IGNhbGwgYmFjayBmdW5jdGlvbiBmb3Igc2hpbSBsYXllcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOiBzdGF0dXMgb2YgY2FsbCBiYWNrIGZ1bmN0aW9uCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBtbV9jYW1lcmFfbW9kdWxlX2V2ZW50X2hhbmRsZXIodWludDMyX3Qgc2Vzc2lvbl9pZCwgY2FtX2V2ZW50X3QgKmV2ZW50KQoreworICAgIGlmICghZXZlbnQpIHsKKyAgICAgICAgTE9HRSgibnVsbCBldmVudCIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIG1tX2NhbWVyYV9ldmVudF90IGV2dDsKKworICAgIExPR0QoInNlc3Npb25faWQ6JWQsIGNtZDoweCV4Iiwgc2Vzc2lvbl9pZCwgZXZlbnQtPnNlcnZlcl9ldmVudF90eXBlKTsKKyAgICBtZW1zZXQoJmV2dCwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9ldmVudF90KSk7CisKKyAgICBldnQgPSAqZXZlbnQ7CisgICAgbW1fY2FtZXJhX29ial90ICpteV9vYmogPQorICAgICAgICAgbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9zZXNzaW9uX2lkKHNlc3Npb25faWQpOworICAgIGlmICghbXlfb2JqKSB7CisgICAgICAgIExPR0UoIm15X29iajolcCIsIG15X29iaik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgc3dpdGNoKCBldnQuc2VydmVyX2V2ZW50X3R5cGUpIHsKKyAgICAgICBjYXNlIENBTV9FVkVOVF9UWVBFX0RBRU1PTl9QVUxMX1JFUToKKyAgICAgICBjYXNlIENBTV9FVkVOVF9UWVBFX0NBQ19ET05FOgorICAgICAgIGNhc2UgQ0FNX0VWRU5UX1RZUEVfREFFTU9OX0RJRUQ6CisgICAgICAgY2FzZSBDQU1fRVZFTlRfVFlQRV9JTlRfVEFLRV9KUEVHOgorICAgICAgIGNhc2UgQ0FNX0VWRU5UX1RZUEVfSU5UX1RBS0VfUkFXOgorICAgICAgICAgICBtbV9jYW1lcmFfZW5xdWV1ZV9ldnQobXlfb2JqLCAmZXZ0KTsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgTE9HRSgiY21kOiV4IGZyb20gc2hpbSBsYXllciBpcyBub3QgaGFuZGxlZCIsIGV2dC5zZXJ2ZXJfZXZlbnRfdHlwZSk7CisgICAgICAgICAgIGJyZWFrOworICAgfQorICAgcmV0dXJuIFRSVUU7Cit9CisKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2Uvc3JjL21tX2NhbWVyYV9zdHJlYW0uYyBiL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2Uvc3JjL21tX2NhbWVyYV9zdHJlYW0uYwppbmRleCAyZTYyODU4Li40ZWY5OWEzIDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmFfc3RyZWFtLmMKKysrIGIvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9zcmMvbW1fY2FtZXJhX3N0cmVhbS5jCkBAIC00OSw2ICs0OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmJ1Zik7CiBpbnQzMl90IG1tX3N0cmVhbV9zZXRfZXh0X21vZGUobW1fc3RyZWFtX3QgKiBteV9vYmopOwogaW50MzJfdCBtbV9zdHJlYW1fc2V0X2ZtdChtbV9zdHJlYW1fdCAqIG15X29iaik7CitpbnQzMl90IG1tX3N0cmVhbV9jYW5jZWxfYnVmKG1tX3N0cmVhbV90ICogbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmX2lkeCk7CiBpbnQzMl90IG1tX3N0cmVhbV9zeW5jX2luZm8obW1fc3RyZWFtX3QgKm15X29iaik7CiBpbnQzMl90IG1tX3N0cmVhbV9pbml0X2J1ZnMobW1fc3RyZWFtX3QgKiBteV9vYmopOwogaW50MzJfdCBtbV9zdHJlYW1fZGVpbml0X2J1ZnMobW1fc3RyZWFtX3QgKiBteV9vYmopOwpAQCAtODgwLDYgKzg4Miw5IEBACiAgICAgY2FzZSBNTV9TVFJFQU1fRVZUX1FCVUY6CiAgICAgICAgIHJjID0gbW1fc3RyZWFtX2J1Zl9kb25lKG15X29iaiwgKG1tX2NhbWVyYV9idWZfZGVmX3QgKilpbl92YWwpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX1NUUkVBTV9FVlRfQ0FOQ0VMX0JVRjoKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fY2FuY2VsX2J1ZihteV9vYmosICooKHVpbnQzMl90Kilpbl92YWwpKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBNTV9TVFJFQU1fRVZUX0dFVF9RVUVVRURfQlVGX0NPVU5UOgogICAgICAgICByYyA9IG1tX3N0cmVhbV9nZXRfcXVldWVkX2J1Zl9jb3VudChteV9vYmopOwogICAgICAgICBicmVhazsKQEAgLTk1NiwxNiArOTYxLDEzIEBACiAgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQogICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiBzdGF0aWMgaW50MzJfdCBtbV9zdHJlYW1fbWFwX2J1Zl9vcHModWludDMyX3QgZnJhbWVfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fbWFwcGluZ19idWZfdHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKQorICAgICAgICBpbnQzMl90IHBsYW5lX2lkeCwgaW50IGZkLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgdm9pZCAqYnVmZmVyLCBjYW1fbWFwcGluZ19idWZfdHlwZSB0eXBlLAorICAgICAgICB2b2lkICp1c2VyZGF0YSkKIHsKICAgICBtbV9zdHJlYW1fdCAqbXlfb2JqID0gKG1tX3N0cmVhbV90ICopdXNlcmRhdGE7CiAgICAgcmV0dXJuIG1tX3N0cmVhbV9tYXBfYnVmKG15X29iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfaWR4LCBwbGFuZV9pZHgsIGZkLCBzaXplKTsKKyAgICAgICAgICAgIHR5cGUsIGZyYW1lX2lkeCwgcGxhbmVfaWR4LCBmZCwgc2l6ZSwgYnVmZmVyKTsKIH0KIAogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTExMDgsOCArMTExMCwyNSBAQAogICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKIAogICAgIC8qIGNsb3NlIGZkICovCi0gICAgaWYobXlfb2JqLT5mZCA+PSAwKQotICAgIHsKKyAgICBpZiAobXlfb2JqLT5mZCA+PSAwKSB7CisjaWZuZGVmIERBRU1PTl9QUkVTRU5UCisgICAgICAgIGludDMyX3QgcmMgPSAwOworICAgICAgICBjYW1fc2hpbV9wYWNrZXRfdCAqc2hpbV9jbWQ7CisgICAgICAgIGNhbV9zaGltX2NtZF9kYXRhIHNoaW1fY21kX2RhdGE7CisgICAgICAgIG1tX2NhbWVyYV9vYmpfdCAqY2FtX29iaiA9IG15X29iai0+Y2hfb2JqLT5jYW1fb2JqOworCisgICAgICAgIG1lbXNldCgmc2hpbV9jbWRfZGF0YSwgMCwgc2l6ZW9mKHNoaW1fY21kX2RhdGEpKTsKKyAgICAgICAgc2hpbV9jbWRfZGF0YS5jb21tYW5kID0gTVNNX0NBTUVSQV9QUklWX0RFTF9TVFJFQU07CisgICAgICAgIHNoaW1fY21kX2RhdGEuc3RyZWFtX2lkID0gbXlfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkOworICAgICAgICBzaGltX2NtZF9kYXRhLnZhbHVlID0gTlVMTDsKKyAgICAgICAgc2hpbV9jbWQgPSBtbV9jYW1lcmFfY3JlYXRlX3NoaW1fY21kX3BhY2tldChDQU1fU0hJTV9TRVRfUEFSTSwKKyAgICAgICAgICAgICAgICBjYW1fb2JqLT5zZXNzaW9uaWQsICZzaGltX2NtZF9kYXRhKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfbW9kdWxlX3NlbmRfY21kKHNoaW1fY21kKTsKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIERFTEVURSBTVFJFQU0iKTsKKyAgICAgICAgfQorICAgICAgICBtbV9jYW1lcmFfZGVzdHJveV9zaGltX2NtZF9wYWNrZXQoc2hpbV9jbWQpOworI2VuZGlmIC8qIERBRU1PTl9QUkVTRU5UICovCiAgICAgICAgIGNsb3NlKG15X29iai0+ZmQpOwogICAgIH0KIApAQCAtMTE3NiwxNCArMTE5NSw0MyBAQAogICAgICAgICAgICAgICAgIG15X29iai0+bXlfaGRsLCBtbV9jYW1lcmFfc3luY19jYWxsKTsKICAgICAgICAgcmV0dXJuIHJjOwogICAgIH0KKyAgICBtbV9jYW1lcmFfb2JqX3QgKmNhbV9vYmogPSBteV9vYmotPmNoX29iai0+Y2FtX29iajsKKyAgICBMT0dEKCJFLCBteV9oYW5kbGUgPSAweCV4LCBmZCA9ICVkLCBzdGF0ZSA9ICVkIHNlc3Npb25faWQ6JWQgc3RyZWFtX2lkOiVkIiwKKyAgICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlLCBjYW1fb2JqLT5zZXNzaW9uaWQsCisgICAgICAgICAgICBteV9vYmotPnNlcnZlcl9zdHJlYW1faWQpOwogCiAgICAgcmMgPSBpb2N0bChteV9vYmotPmZkLCBWSURJT0NfU1RSRUFNT04sICZidWZfdHlwZSk7Ci0gICAgaWYgKHJjIDwgMCkgeworICAgIGlmIChyYyA8IDAgJiYgbXlfb2JqLT5zdHJlYW1faW5mby0+bnVtX2J1ZnMgIT0gMCkgewogICAgICAgICBMT0dFKCJpb2N0bCBWSURJT0NfU1RSRUFNT04gZmFpbGVkOiByYz0lZCwgZXJybm8gJWQiLAotICAgICAgICAgICAgICAgICAgICByYywgZXJybm8pOwotICAgICAgICAvKiByZW1vdmUgZmQgZnJvbSBkYXRhIHBvbGwgdGhyZWFkIGluIGNhc2Ugb2YgZmFpbHVyZSAqLwotICAgICAgICBtbV9jYW1lcmFfcG9sbF90aHJlYWRfZGVsX3BvbGxfZmQoJm15X29iai0+Y2hfb2JqLT5wb2xsX3RocmVhZFswXSwgbXlfb2JqLT5teV9oZGwsIG1tX2NhbWVyYV9zeW5jX2NhbGwpOworICAgICAgICAgICAgICAgIHJjLCBlcnJubyk7CisgICAgICAgIGdvdG8gZXJyb3JfY2FzZTsKICAgICB9CisKKyNpZm5kZWYgREFFTU9OX1BSRVNFTlQKKyAgICBjYW1fc2hpbV9wYWNrZXRfdCAqc2hpbV9jbWQ7CisgICAgY2FtX3NoaW1fY21kX2RhdGEgc2hpbV9jbWRfZGF0YTsKKworICAgIG1lbXNldCgmc2hpbV9jbWRfZGF0YSwgMCwgc2l6ZW9mKHNoaW1fY21kX2RhdGEpKTsKKyAgICBzaGltX2NtZF9kYXRhLmNvbW1hbmQgPSBNU01fQ0FNRVJBX1BSSVZfU1RSRUFNX09OOworICAgIHNoaW1fY21kX2RhdGEuc3RyZWFtX2lkID0gbXlfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkOworICAgIHNoaW1fY21kX2RhdGEudmFsdWUgPSBOVUxMOworICAgIHNoaW1fY21kID0gbW1fY2FtZXJhX2NyZWF0ZV9zaGltX2NtZF9wYWNrZXQoQ0FNX1NISU1fU0VUX1BBUk0sCisgICAgICAgICAgICBjYW1fb2JqLT5zZXNzaW9uaWQsICZzaGltX2NtZF9kYXRhKTsKKyAgICByYyA9IG1tX2NhbWVyYV9tb2R1bGVfc2VuZF9jbWQoc2hpbV9jbWQpOworICAgIG1tX2NhbWVyYV9kZXN0cm95X3NoaW1fY21kX3BhY2tldChzaGltX2NtZCk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJNb2R1bGUgU3RyZWFtT04gZmFpbGVkOiByYz0lZCIsIHJjKTsKKyAgICAgICAgaW9jdGwobXlfb2JqLT5mZCwgVklESU9DX1NUUkVBTU9GRiwgJmJ1Zl90eXBlKTsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlOworICAgIH0KKyNlbmRpZgorICAgIExPR0QoIlggcmMgPSAlZCIscmMpOworICAgIHJldHVybiByYzsKK2Vycm9yX2Nhc2U6CisgICAgIC8qIHJlbW92ZSBmZCBmcm9tIGRhdGEgcG9sbCB0aHJlYWQgaW4gY2FzZSBvZiBmYWlsdXJlICovCisgICAgIG1tX2NhbWVyYV9wb2xsX3RocmVhZF9kZWxfcG9sbF9mZCgmbXlfb2JqLT5jaF9vYmotPnBvbGxfdGhyZWFkWzBdLAorICAgICAgICAgICAgIG15X29iai0+bXlfaGRsLCBtbV9jYW1lcmFfc3luY19jYWxsKTsKKwogICAgIExPR0QoIlggcmMgPSAlZCIscmMpOwogICAgIHJldHVybiByYzsKIH0KQEAgLTEyMTUsMTggKzEyNjMsMzUgQEAKICAgICAgICAgICogd2FpdCBmb3IgYWxsIHVwZGF0ZXMgdG8gY29tcGxldGUgYmVmb3JlIHByb2NlZWRpbmcuICovCiAgICAgICAgIHJjID0gbW1fY2FtZXJhX3BvbGxfdGhyZWFkX2NvbW1pdF91cGRhdGVzKCZteV9vYmotPmNoX29iai0+cG9sbF90aHJlYWRbMF0pOwogICAgICAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJQb2xsIHN5bmMgZmFpbGVkICVkIiwKLSAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgIExPR0UoIlBvbGwgc3luYyBmYWlsZWQgJWQiLCByYyk7CisgICAgICAgICAgICByYyA9IDA7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiBzdGVwMjogc3RyZWFtIG9mZiAqLwotICAgIHJjID0gaW9jdGwobXlfb2JqLT5mZCwgVklESU9DX1NUUkVBTU9GRiwgJmJ1Zl90eXBlKTsKKyNpZm5kZWYgREFFTU9OX1BSRVNFTlQKKyAgICBjYW1fc2hpbV9wYWNrZXRfdCAqc2hpbV9jbWQ7CisgICAgY2FtX3NoaW1fY21kX2RhdGEgc2hpbV9jbWRfZGF0YTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKmNhbV9vYmogPSBteV9vYmotPmNoX29iai0+Y2FtX29iajsKKworICAgIG1lbXNldCgmc2hpbV9jbWRfZGF0YSwgMCwgc2l6ZW9mKHNoaW1fY21kX2RhdGEpKTsKKyAgICBzaGltX2NtZF9kYXRhLmNvbW1hbmQgPSBNU01fQ0FNRVJBX1BSSVZfU1RSRUFNX09GRjsKKyAgICBzaGltX2NtZF9kYXRhLnN0cmVhbV9pZCA9IG15X29iai0+c2VydmVyX3N0cmVhbV9pZDsKKyAgICBzaGltX2NtZF9kYXRhLnZhbHVlID0gTlVMTDsKKyAgICBzaGltX2NtZCA9IG1tX2NhbWVyYV9jcmVhdGVfc2hpbV9jbWRfcGFja2V0KENBTV9TSElNX1NFVF9QQVJNLAorICAgICAgICAgICAgY2FtX29iai0+c2Vzc2lvbmlkLCAmc2hpbV9jbWRfZGF0YSk7CisKKyAgICByYyB8PSBtbV9jYW1lcmFfbW9kdWxlX3NlbmRfY21kKHNoaW1fY21kKTsKKyAgICBtbV9jYW1lcmFfZGVzdHJveV9zaGltX2NtZF9wYWNrZXQoc2hpbV9jbWQpOwogICAgIGlmIChyYyA8IDApIHsKLSAgICAgICAgTE9HRSgiU1RSRUFNT0ZGIGZhaWxlZDogJXNcbiIsCi0gICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIExPR0UoIk1vZHVsZSBTdHJlYW1PRkYgZmFpbGVkOiByYz0lZCIsIHJjKQogICAgIH0KLSAgICBMT0dEKCJYIHJjID0gJWQiLHJjKTsKKyNlbmRpZgorCisgICAgLyogc3RlcDI6IHN0cmVhbSBvZmYgKi8KKyAgICByYyB8PSBpb2N0bChteV9vYmotPmZkLCBWSURJT0NfU1RSRUFNT0ZGLCAmYnVmX3R5cGUpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiU1RSRUFNT0ZGIGlvY3RsIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KICAgICByZXR1cm4gcmM7CiB9CiAKQEAgLTEyNTEsOCArMTMxNiwxMCBAQAogICAgIHN0cnVjdCBtc21fY2FtZXJhX3VzZXJfYnVmX2NvbnRfdCAqY29udF9idWYgPSBOVUxMOwogCiAgICAgaWYgKGJ1Zi0+YnVmX3R5cGUgPT0gQ0FNX1NUUkVBTV9CVUZfVFlQRV9VU0VSUFRSKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5idWZfbG9jayk7CiAgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tidWYtPmJ1Zl9pZHhdLmJ1Zl9yZWZjbnQtLTsKICAgICAgICAgaWYgKDAgPT0gbXlfb2JqLT5idWZfc3RhdHVzW2J1Zi0+YnVmX2lkeF0uYnVmX3JlZmNudCkgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+YnVmX2xvY2spOwogICAgICAgICAgICAgY29udF9idWYgPSAoc3RydWN0IG1zbV9jYW1lcmFfdXNlcl9idWZfY29udF90ICopbXlfb2JqLT5idWZbYnVmLT5idWZfaWR4XS5idWZmZXI7CiAgICAgICAgICAgICBjb250X2J1Zi0+YnVmX2NudCA9IG15X29iai0+YnVmW2J1Zi0+YnVmX2lkeF0udXNlcl9idWYuYnVmc191c2VkOwogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQzMl90KWNvbnRfYnVmLT5idWZfY250OyBpKyspIHsKQEAgLTEyNzIsNiArMTMzOSw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBMT0dEKCI8REVCVUc+IDogcmVmIGNvdW50IHBlbmRpbmcgY291bnQgOiVkIGlkeCA9ICVkIiwKICAgICAgICAgICAgICAgICAgbXlfb2JqLT5idWZfc3RhdHVzW2J1Zi0+YnVmX2lkeF0uYnVmX3JlZmNudCwgYnVmLT5idWZfaWR4KTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmM7CiAgICAgfQpAQCAtMTMwOCw4ICsxMzc2LDEwIEBACiAKICAgICBpZiAobXlfb2JqLT5jdXJfYnVmc19zdGFnZWQKICAgICAgICAgICAgID09IG15X29iai0+YnVmW2luZGV4XS51c2VyX2J1Zi5idWZzX3VzZWQpeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+YnVmX2xvY2spOwogICAgICAgICBteV9vYmotPmJ1Zl9zdGF0dXNbaW5kZXhdLmJ1Zl9yZWZjbnQtLTsKICAgICAgICAgaWYgKDAgPT0gbXlfb2JqLT5idWZfc3RhdHVzW2luZGV4XS5idWZfcmVmY250KSB7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5idWZfbG9jayk7CiAgICAgICAgICAgICBjb250X2J1ZiA9IChzdHJ1Y3QgbXNtX2NhbWVyYV91c2VyX2J1Zl9jb250X3QgKilteV9vYmotPmJ1ZltpbmRleF0uYnVmZmVyOwogICAgICAgICAgICAgY29udF9idWYtPmJ1Zl9jbnQgPSBteV9vYmotPmJ1ZltpbmRleF0udXNlcl9idWYuYnVmc191c2VkOwogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQzMl90KWNvbnRfYnVmLT5idWZfY250OyBpKyspIHsKQEAgLTEzMzEsNiArMTQwMSw3IEBACiAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgTE9HRCgiPERFQlVHPiA6IHJlZiBjb3VudCBwZW5kaW5nIGNvdW50IDolZCBpZHggPSAlZCIsCiAgICAgICAgICAgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tpbmRleF0uYnVmX3JlZmNudCwgaW5kZXgpOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+YnVmX2xvY2spOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDY3LDYgKzE1MzgsNyBAQAogICAgICAgICAgICAgTE9HSCgiU3RvcHBlZCBwb2xsIG9uIHN0cmVhbSAlcCB0eXBlOiAlZCIsCiAgICAgICAgICAgICAgICAgbXlfb2JqLCBteV9vYmotPnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSk7CiAgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+YnVmX2xvY2spOwogICAgICAgICB1aW50MzJfdCBpZHggPSB2Yi5pbmRleDsKICAgICAgICAgYnVmX2luZm8tPmJ1ZiA9ICZteV9vYmotPmJ1ZltpZHhdOwogICAgICAgICBidWZfaW5mby0+ZnJhbWVfaWR4ID0gdmIuc2VxdWVuY2U7CkBAIC0xNDkyLDcgKzE1NjQsNiBAQAogICAgICAgICBpZihidWZfaW5mby0+YnVmLT5idWZfdHlwZSA9PSBDQU1fU1RSRUFNX0JVRl9UWVBFX1VTRVJQVFIpIHsKICAgICAgICAgICAgIG1tX3N0cmVhbV9yZWFkX3VzZXJfYnVmKG15X29iaiwgYnVmX2luZm8pOwogICAgICAgICB9Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKIAogICAgICAgICBpZiAoIE5VTEwgIT0gbXlfb2JqLT5tZW1fdnRibC5jbGVhbl9pbnZhbGlkYXRlX2J1ZiApIHsKICAgICAgICAgICAgIHJjID0gbXlfb2JqLT5tZW1fdnRibC5jbGVhbl9pbnZhbGlkYXRlX2J1ZihpZHgsCkBAIC0xNTMyLDEwICsxNjAzLDEzIEBACiAgICAgaW50MzJfdCByYyA9IC0xOwogICAgIGludDMyX3QgdmFsdWUgPSAwOwogICAgIGlmIChpbl92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgIHJjID0gbW1fY2FtZXJhX3V0aWxfc19jdHJsKG15X29iai0+ZmQsIENBTV9QUklWX1NUUkVBTV9QQVJNLCAmdmFsdWUpOwotICAgICAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IHN0cmVhbSBwYXJhbWV0ZXIgdHlwZSA9ICVkIiwgaW5fdmFsdWUtPnR5cGUpOwotICAgICAgICB9CisgICAgICBtbV9jYW1lcmFfb2JqX3QgKmNhbV9vYmogPSBteV9vYmotPmNoX29iai0+Y2FtX29iajsKKyAgICAgIGludCBzdHJlYW1faWQgPSBteV9vYmotPnNlcnZlcl9zdHJlYW1faWQ7CisgICAgICByYyA9IG1tX2NhbWVyYV91dGlsX3NfY3RybChjYW1fb2JqLCBzdHJlYW1faWQsIG15X29iai0+ZmQsCisgICAgICAgICAgICAgIENBTV9QUklWX1NUUkVBTV9QQVJNLCAmdmFsdWUpOworICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IHN0cmVhbSBwYXJhbWV0ZXIgdHlwZSA9ICVkIiwgaW5fdmFsdWUtPnR5cGUpOworICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmM7CiB9CkBAIC0xNTYyLDcgKzE2MzYsMTAgQEAKICAgICBpbnQzMl90IHJjID0gLTE7CiAgICAgaW50MzJfdCB2YWx1ZSA9IDA7CiAgICAgaWYgKGluX3ZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9nX2N0cmwobXlfb2JqLT5mZCwgQ0FNX1BSSVZfU1RSRUFNX1BBUk0sICZ2YWx1ZSk7CisgICAgICAgIG1tX2NhbWVyYV9vYmpfdCAqY2FtX29iaiA9IG15X29iai0+Y2hfb2JqLT5jYW1fb2JqOworICAgICAgICBpbnQgc3RyZWFtX2lkID0gbXlfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkOworICAgICAgICByYyA9IG1tX2NhbWVyYV91dGlsX2dfY3RybChjYW1fb2JqLCBzdHJlYW1faWQsIG15X29iai0+ZmQsCisgICAgICAgICAgICAgIENBTV9QUklWX1NUUkVBTV9QQVJNLCAmdmFsdWUpOwogICAgIH0KICAgICByZXR1cm4gcmM7CiB9CkBAIC0xNTg5LDcgKzE2NjYsMTAgQEAKICAgICBpbnQzMl90IHJjID0gLTE7CiAgICAgaW50MzJfdCB2YWx1ZSA9IDA7CiAgICAgaWYgKGluX3ZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zX2N0cmwobXlfb2JqLT5mZCwgQ0FNX1BSSVZfU1RSRUFNX1BBUk0sICZ2YWx1ZSk7CisgICAgICAgIG1tX2NhbWVyYV9vYmpfdCAqY2FtX29iaiA9IG15X29iai0+Y2hfb2JqLT5jYW1fb2JqOworICAgICAgICBpbnQgc3RyZWFtX2lkID0gbXlfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkOworICAgICAgICByYyA9IG1tX2NhbWVyYV91dGlsX3NfY3RybChjYW1fb2JqLCBzdHJlYW1faWQsIG15X29iai0+ZmQsCisgICAgICAgICAgICAgIENBTV9QUklWX1NUUkVBTV9QQVJNLCAmdmFsdWUpOwogICAgIH0KICAgICByZXR1cm4gcmM7CiB9CkBAIC0xNjIwLDEzICsxNzAwLDI3IEBACiAgICAgc19wYXJtLnR5cGUgPSAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKIAogICAgIHJjID0gaW9jdGwobXlfb2JqLT5mZCwgVklESU9DX1NfUEFSTSwgJnNfcGFybSk7Ci0gICAgTE9HRCgic3RyZWFtIGZkPSVkLCByYz0lZCwgZXh0ZW5kZWRfbW9kZT0lZFxuIiwKLSAgICAgICAgICBteV9vYmotPmZkLCByYywgc19wYXJtLnBhcm0uY2FwdHVyZS5leHRlbmRlZG1vZGUpOworICAgIExPR0QoInN0cmVhbSBmZD0lZCwgcmM9JWQsIGV4dGVuZGVkX21vZGU9JWQiLAorICAgICAgICAgbXlfb2JqLT5mZCwgcmMsIHNfcGFybS5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlKTsKKwogICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgIC8qIGdldCBzZXJ2ZXIgc3RyZWFtIGlkICovCiAgICAgICAgIG15X29iai0+c2VydmVyX3N0cmVhbV9pZCA9IHNfcGFybS5wYXJtLmNhcHR1cmUuZXh0ZW5kZWRtb2RlOworI2lmbmRlZiBEQUVNT05fUFJFU0VOVAorICAgICAgICBjYW1fc2hpbV9wYWNrZXRfdCAqc2hpbV9jbWQ7CisgICAgICAgIGNhbV9zaGltX2NtZF9kYXRhIHNoaW1fY21kX2RhdGE7CisgICAgICAgIG1tX2NhbWVyYV9vYmpfdCAqY2FtX29iaiA9IG15X29iai0+Y2hfb2JqLT5jYW1fb2JqOworCisgICAgICAgIG1lbXNldCgmc2hpbV9jbWRfZGF0YSwgMCwgc2l6ZW9mKHNoaW1fY21kX2RhdGEpKTsKKyAgICAgICAgc2hpbV9jbWRfZGF0YS5jb21tYW5kID0gTVNNX0NBTUVSQV9QUklWX05FV19TVFJFQU07CisgICAgICAgIHNoaW1fY21kX2RhdGEuc3RyZWFtX2lkID0gbXlfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkOworICAgICAgICBzaGltX2NtZF9kYXRhLnZhbHVlID0gTlVMTDsKKyAgICAgICAgc2hpbV9jbWQgPSBtbV9jYW1lcmFfY3JlYXRlX3NoaW1fY21kX3BhY2tldChDQU1fU0hJTV9TRVRfUEFSTSwKKyAgICAgICAgICAgICAgICBjYW1fb2JqLT5zZXNzaW9uaWQsICZzaGltX2NtZF9kYXRhKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfbW9kdWxlX3NlbmRfY21kKHNoaW1fY21kKTsKKyAgICAgICAgbW1fY2FtZXJhX2Rlc3Ryb3lfc2hpbV9jbWRfcGFja2V0KHNoaW1fY21kKTsKKyNlbmRpZiAvKiBEQUVNT05fUFJFU0VOVCAqLwogICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR0UoIlZJRElPQ19TX1BBUk0gZmFpbGVkICVkLCBlcnJubyAlZCIsIHJjLCBlcnJubyk7CisgICAgICAgIExPR0UoIlZJRElPQ19TX1BBUk0gIGV4dGVuZGVkbW9kZSBlcnJvciIpOwogICAgIH0KICAgICByZXR1cm4gcmM7CiB9CkBAIC0xNjg1LDYgKzE3NzksNyBAQAogICAgICAgICBMT0dFKCJDYWNoZSBpbnZhbGlkYXRlIG9wIG5vdCBhZGRlZCIpOwogICAgIH0KIAorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5idWZfbG9jayk7CiAgICAgbXlfb2JqLT5xdWV1ZWRfYnVmZmVyX2NvdW50Kys7CiAgICAgaWYgKDEgPT0gbXlfb2JqLT5xdWV1ZWRfYnVmZmVyX2NvdW50KSB7CiAgICAgICAgIC8qIEFkZCBmZCB0byBkYXRhIHBvbGwgdGhyZWFkICovCkBAIC0xNzAxLDggKzE3OTYsMTAgQEAKICAgICAgICAgICAgICAgICBteV9vYmosIG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlKTsKICAgICAgICAgfQogICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5idWZfbG9jayk7CiAKICAgICByYyA9IGlvY3RsKG15X29iai0+ZmQsIFZJRElPQ19RQlVGLCAmYnVmZmVyKTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+YnVmX2xvY2spOwogICAgIGlmICgwID4gcmMpIHsKICAgICAgICAgTE9HRSgiVklESU9DX1FCVUYgaW9jdGwgY2FsbCBmYWlsZWQgb24gc3RyZWFtIHR5cGUgJWQgKHJjPSVkKTogJXMiLAogICAgICAgICAgICAgIG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlLCByYywgc3RyZXJyb3IoZXJybm8pKTsKQEAgLTE3MjMsNiArMTgyMCw3IEBACiAgICAgICAgICAgICAgICAgIGJ1ZmZlci5pbmRleCwgYnVmLT5mcmFtZV9pZHgsIG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlLCByYywKICAgICAgICAgICAgICAgICBteV9vYmotPnF1ZXVlZF9idWZmZXJfY291bnQsIGJ1Zi0+YnVmX3R5cGUpOwogICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5idWZfbG9jayk7CiAKICAgICByZXR1cm4gcmM7CiB9CkBAIC0xODI3LDExICsxOTI1LDkgQEAKICAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCiAgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIGludDMyX3QgbW1fc3RyZWFtX21hcF9idWYobW1fc3RyZWFtX3QgKiBteV9vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwbGFuZV9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKQorICAgICAgICB1aW50OF90IGJ1Zl90eXBlLCB1aW50MzJfdCBmcmFtZV9pZHgsCisgICAgICAgIGludDMyX3QgcGxhbmVfaWR4LCBpbnQzMl90IGZkLAorICAgICAgICBzaXplX3Qgc2l6ZSwgdm9pZCAqYnVmZmVyKQogewogICAgIGludDMyX3QgcmMgPSAwOwogICAgIGlmIChOVUxMID09IG15X29iaiB8fCBOVUxMID09IG15X29iai0+Y2hfb2JqIHx8IE5VTEwgPT0gbXlfb2JqLT5jaF9vYmotPmNhbV9vYmopIHsKQEAgLTE4NDgsMTEgKzE5NDQsMjAgQEAKICAgICBwYWNrZXQucGF5bG9hZC5idWZfbWFwLnN0cmVhbV9pZCA9IG15X29iai0+c2VydmVyX3N0cmVhbV9pZDsKICAgICBwYWNrZXQucGF5bG9hZC5idWZfbWFwLmZyYW1lX2lkeCA9IGZyYW1lX2lkeDsKICAgICBwYWNrZXQucGF5bG9hZC5idWZfbWFwLnBsYW5lX2lkeCA9IHBsYW5lX2lkeDsKKyAgICBwYWNrZXQucGF5bG9hZC5idWZfbWFwLmJ1ZmZlciA9IGJ1ZmZlcjsKICAgICBMT0dEKCJtYXBwaW5nIGJ1Zl90eXBlICVkLCBzdHJlYW1faWQgJWQsIGZyYW1lX2lkeCAlZCwgZmQgJWQsIHNpemUgJWQiLAogICAgICAgICAgICAgIGJ1Zl90eXBlLCBteV9vYmotPnNlcnZlcl9zdHJlYW1faWQsIGZyYW1lX2lkeCwgZmQsIHNpemUpOwotICAgIHJjID0gbW1fY2FtZXJhX3V0aWxfc2VuZG1zZyhteV9vYmotPmNoX29iai0+Y2FtX29iaiwKLSAgICAgICAgICAgICZwYWNrZXQsIHNpemVvZihjYW1fc29ja19wYWNrZXRfdCksIGZkKTsKIAorI2lmZGVmIERBRU1PTl9QUkVTRU5UCisgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zZW5kbXNnKG15X29iai0+Y2hfb2JqLT5jYW1fb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFja2V0LCBzaXplb2YoY2FtX3NvY2tfcGFja2V0X3QpLCBmZCk7CisjZWxzZQorICAgIGNhbV9zaGltX3BhY2tldF90ICpzaGltX2NtZDsKKyAgICBzaGltX2NtZCA9IG1tX2NhbWVyYV9jcmVhdGVfc2hpbV9jbWRfcGFja2V0KENBTV9TSElNX1JFR19CVUYsCisgICAgICAgICAgICBteV9vYmotPmNoX29iai0+Y2FtX29iai0+c2Vzc2lvbmlkLCAmcGFja2V0KTsKKyAgICByYyA9IG1tX2NhbWVyYV9tb2R1bGVfc2VuZF9jbWQoc2hpbV9jbWQpOworICAgIG1tX2NhbWVyYV9kZXN0cm95X3NoaW1fY21kX3BhY2tldChzaGltX2NtZCk7CisjZW5kaWYKICAgICBpZiAoKGJ1Zl90eXBlID09IENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYpCiAgICAgICAgICAgICB8fCAoKGJ1Zl90eXBlCiAgICAgICAgICAgICA9PSBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fVVNFUl9CVUYpCkBAIC0xODYyLDYgKzE5NjcsNyBAQAogICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+YnVmX2xvY2spOwogICAgICAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgICAgICBteV9vYmotPmJ1Zl9zdGF0dXNbZnJhbWVfaWR4XS5tYXBfc3RhdHVzID0gLTE7CisgICAgICAgICAgICBMT0dFKCJmYWlsIHN0YXR1cyA9JWQiLCBteV9vYmotPmJ1Zl9zdGF0dXNbZnJhbWVfaWR4XS5tYXBfc3RhdHVzKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tmcmFtZV9pZHhdLm1hcF9zdGF0dXMgPSAxOwogICAgICAgICB9CkBAIC0xOTIyLDggKzIwMjgsMTYgQEAKICAgICAgICAgc2VuZGZkc1tpXSA9IC0xOwogICAgIH0KIAorI2lmZGVmIERBRU1PTl9QUkVTRU5UCiAgICAgaW50MzJfdCByZXQgPSBtbV9jYW1lcmFfdXRpbF9idW5kbGVkX3NlbmRtc2cobXlfb2JqLT5jaF9vYmotPmNhbV9vYmosCiAgICAgICAgICAgICAmcGFja2V0LCBzaXplb2YoY2FtX3NvY2tfcGFja2V0X3QpLCBzZW5kZmRzLCBudW1idWZzKTsKKyNlbHNlCisgICAgY2FtX3NoaW1fcGFja2V0X3QgKnNoaW1fY21kOworICAgIHNoaW1fY21kID0gbW1fY2FtZXJhX2NyZWF0ZV9zaGltX2NtZF9wYWNrZXQoQ0FNX1NISU1fUkVHX0JVRiwKKyAgICAgICAgICAgIG15X29iai0+Y2hfb2JqLT5jYW1fb2JqLT5zZXNzaW9uaWQsICZwYWNrZXQpOworICAgIGludDMyX3QgcmV0ID0gbW1fY2FtZXJhX21vZHVsZV9zZW5kX2NtZChzaGltX2NtZCk7CisgICAgbW1fY2FtZXJhX2Rlc3Ryb3lfc2hpbV9jbWRfcGFja2V0KHNoaW1fY21kKTsKKyNlbmRpZgogICAgIGlmICgobnVtYnVmcyA+IDApICYmICgoYnVmX21hcF9saXN0LT5idWZfbWFwc1swXS50eXBlCiAgICAgICAgICAgICA9PSBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGKQogICAgICAgICAgICAgfHwgKChidWZfbWFwX2xpc3QtPmJ1Zl9tYXBzWzBdLnR5cGUgPT0KQEAgLTE5NzcsNiArMjA5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhbWVfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4KQogeworICAgIGludDMyX3QgcmV0OwogICAgIGlmIChOVUxMID09IG15X29iaiB8fCBOVUxMID09IG15X29iai0+Y2hfb2JqIHx8IE5VTEwgPT0gbXlfb2JqLT5jaF9vYmotPmNhbV9vYmopIHsKICAgICAgICAgTE9HRSgiTlVMTCBvYmogb2Ygc3RyZWFtL2NoYW5uZWwvY2FtZXJhIik7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTE5ODgsMTAgKzIxMDMsMTYgQEAKICAgICBwYWNrZXQucGF5bG9hZC5idWZfdW5tYXAuc3RyZWFtX2lkID0gbXlfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkOwogICAgIHBhY2tldC5wYXlsb2FkLmJ1Zl91bm1hcC5mcmFtZV9pZHggPSBmcmFtZV9pZHg7CiAgICAgcGFja2V0LnBheWxvYWQuYnVmX3VubWFwLnBsYW5lX2lkeCA9IHBsYW5lX2lkeDsKLSAgICBpbnQzMl90IHJldCA9IG1tX2NhbWVyYV91dGlsX3NlbmRtc2cobXlfb2JqLT5jaF9vYmotPmNhbV9vYmosCi0gICAgICAgICAgICAmcGFja2V0LAotICAgICAgICAgICAgc2l6ZW9mKGNhbV9zb2NrX3BhY2tldF90KSwKLSAgICAgICAgICAgIC0xKTsKKyNpZmRlZiBEQUVNT05fUFJFU0VOVAorICAgIHJldCA9IG1tX2NhbWVyYV91dGlsX3NlbmRtc2cobXlfb2JqLT5jaF9vYmotPmNhbV9vYmosCisgICAgICAgICAgICAmcGFja2V0LCBzaXplb2YoY2FtX3NvY2tfcGFja2V0X3QpLCAtMSk7CisjZWxzZQorICAgIGNhbV9zaGltX3BhY2tldF90ICpzaGltX2NtZDsKKyAgICBzaGltX2NtZCA9IG1tX2NhbWVyYV9jcmVhdGVfc2hpbV9jbWRfcGFja2V0KENBTV9TSElNX1JFR19CVUYsCisgICAgICAgICAgICBteV9vYmotPmNoX29iai0+Y2FtX29iai0+c2Vzc2lvbmlkLCAmcGFja2V0KTsKKyAgICByZXQgPSBtbV9jYW1lcmFfbW9kdWxlX3NlbmRfY21kKHNoaW1fY21kKTsKKyAgICBtbV9jYW1lcmFfZGVzdHJveV9zaGltX2NtZF9wYWNrZXQoc2hpbV9jbWQpOworI2VuZGlmCiAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKICAgICBteV9vYmotPmJ1Zl9zdGF0dXNbZnJhbWVfaWR4XS5tYXBfc3RhdHVzID0gMDsKICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5idWZfbG9jayk7CkBAIC0yMTQzLDcgKzIyNjQsNiBAQAogICAgICAgICByZXR1cm4gcmM7CiAgICAgfQogCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKICAgICBteV9vYmotPnF1ZXVlZF9idWZmZXJfY291bnQgPSAwOwogICAgIGZvcihpID0gMDsgaSA8IG15X29iai0+YnVmX251bTsgaSsrKXsKICAgICAgICAgLyogY2hlY2sgaWYgbmVlZCB0byBxYnVmIGluaXRpYWxseSAqLwpAQCAtMjE2Miw3ICsyMjgyLDYgQEAKICAgICAgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tpXS5pbl9rZXJuZWwgPSAwOwogICAgICAgICB9CiAgICAgfQotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKIAogICAgIHJldHVybiByYzsKIH0KQEAgLTIyMzEsMjcgKzIzNTAsMzUgQEAKICAgICAgICAgdmFsID0gVjRMMl9QSVhfRk1UX05WMjE7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEJQUF9HQlJHOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMEJQUF9HQlJHOgogICAgICAgICB2YWw9IFY0TDJfUElYX0ZNVF9TR0JSRzEwOwogICAgICAgICBicmVhazsKICAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBCUFBfR1JCRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTBCUFBfR1JCRzoKICAgICAgICAgdmFsPSBWNEwyX1BJWF9GTVRfU0dSQkcxMDsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEwQlBQX1JHR0I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX1JHR0I6CiAgICAgICAgIHZhbD0gVjRMMl9QSVhfRk1UX1NSR0dCMTA7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEJQUF9CR0dSOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMEJQUF9CR0dSOgogICAgICAgICB2YWw9IFY0TDJfUElYX0ZNVF9TQkdHUjEwOwogICAgICAgICBicmVhazsKICAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTJCUFBfR0JSRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJCUFBfR0JSRzoKICAgICAgICAgdmFsPSBWNEwyX1BJWF9GTVRfU0dCUkcxMjsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQlBQX0dSQkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEyQlBQX0dSQkc6CiAgICAgICAgIHZhbD0gVjRMMl9QSVhfRk1UX1NHUkJHMTI7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMkJQUF9SR0dCOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMkJQUF9SR0dCOgogICAgICAgICB2YWw9IFY0TDJfUElYX0ZNVF9TUkdHQjEyOwogICAgICAgICBicmVhazsKICAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTJCUFBfQkdHUjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJCUFBfQkdHUjoKICAgICAgICAgdmFsID0gVjRMMl9QSVhfRk1UX1NCR0dSMTI7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xNEJQUF9HQlJHOgpAQCAtMjI5NCw2ICsyNDIxLDE4IEBACiAgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWToKICAgICAgICAgdmFsPSBWNEwyX1BJWF9GTVRfR1JFWTsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWV8xMF9CUFA6CisgICAgICAgIHZhbD0gVjRMMl9QSVhfRk1UX1kxMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWV8xMl9CUFA6CisgICAgICAgIHZhbD0gVjRMMl9QSVhfRk1UX1kxMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWV8xNF9CUFA6CisgICAgICAgIC8qIE5vIHY0bDIgZm9ybWF0IGlzIGRlZmluZWQgeWV0IGZvciBDQU1fRk9STUFUX1lfT05MWV8xNF9CUFAgKi8KKyAgICAgICAgLyogdmFsPSBWNEwyX1BJWF9GTVRfWTE0OyAqLworICAgICAgICB2YWwgPSAwOworICAgICAgICBMT0dFKCJVbmtub3duIGZtdD0lZCIsIGZtdCk7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ0FNX0ZPUk1BVF9NQVg6CiAgICAgICAgIC8qIENBTV9TVFJFQU1fVFlQRV9ERUZBVUxULAogICAgICAgICAgKiBDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DLApAQCAtMjMzOSw2ICsyNDc4LDEwIEBACiAgICAgc3dpdGNoIChzdHJlYW1faW5mby0+Zm10KSB7CiAgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMjoKICAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZX09OTFk6CisgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWV8xMF9CUFA6CisgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWV8xMl9CUFA6CisgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWV8xNF9CUFA6CiAgICAgICAgIC8qIDIgcGxhbmVzOiBZICsgQ2JDciAqLwogICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAyOwogCkBAIC0yNjc1LDYgKzI4MTgsMTAgQEAKICAgICBzd2l0Y2ggKGZtdCkgewogICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTI6CiAgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYyMToKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZX09OTFlfMTBfQlBQOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZX09OTFlfMTJfQlBQOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZX09OTFlfMTRfQlBQOgogICAgICAgICAvKiAyIHBsYW5lczogWSArIENiQ3IgKi8KICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMjsKIApAQCAtMjk4NCw2ICszMTMxLDEwIEBACiAgICAgc3dpdGNoIChmbXQpIHsKICAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjE6CisgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWToKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzEwX0JQUDoKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzEyX0JQUDoKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzE0X0JQUDoKICAgICAgICAgLyogMiBwbGFuZXM6IFkgKyBDYkNyICovCiAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDI7CiAKQEAgLTMzNDMsMTggKzM0OTQsMjIgQEAKICAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfOEJQUF9HUkJHOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV184QlBQX1JHR0I6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzhCUFBfQkdHUjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfOEJQUF9HUkVZOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV184QlBQX0dCUkc6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzhCUFBfR1JCRzoKICAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfOEJQUF9SR0dCOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV184QlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzhCUFBfR1JFWToKICAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fOEJQUF9HQlJHOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV84QlBQX0dSQkc6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzhCUFBfUkdHQjoKICAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fOEJQUF9CR0dSOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV84QlBQX0dSRVk6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzhCUFBfR0JSRzoKICAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfOEJQUF9HUkJHOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV84QlBQX1JHR0I6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzhCUFBfQkdHUjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfOEJQUF9HUkVZOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU44XzhCUFBfR0JSRzoKICAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOOF84QlBQX0dSQkc6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjhfOEJQUF9SR0dCOgpAQCAtMzM4MiwxMCArMzUzNywxMiBAQAogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEJQUF9HUkJHOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEJQUF9SR0dCOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEJQUF9CR0dSOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEJQUF9HUkVZOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMEJQUF9HQlJHOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMEJQUF9HUkJHOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMEJQUF9SR0dCOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMEJQUF9CR0dSOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMEJQUF9HUkVZOgogICAgICAgICAvKiBFdmVyeSAxMiBwaXhlbHMgb2NjdXB5IDE2IGJ5dGVzICovCiAgICAgICAgIHN0cmlkZSA9IChkaW0tPndpZHRoICsgMTEpLzEyICogMTI7CiAgICAgICAgIHN0cmlkZV9pbl9ieXRlcyA9IHN0cmlkZSAqIDggLyA2OwpAQCAtMzQwOCwxMCArMzU2NSwxMiBAQAogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMkJQUF9HUkJHOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMkJQUF9SR0dCOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMkJQUF9CR0dSOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMkJQUF9HUkVZOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMkJQUF9HQlJHOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMkJQUF9HUkJHOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMkJQUF9SR0dCOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMkJQUF9CR0dSOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMkJQUF9HUkVZOgogICAgICAgICAvKiBFdmVyeSAxMCBwaXhlbHMgb2NjdXB5IDE2IGJ5dGVzICovCiAgICAgICAgIHN0cmlkZSA9IChkaW0tPndpZHRoICsgOSkvMTAgKiAxMDsKICAgICAgICAgc3RyaWRlX2luX2J5dGVzID0gc3RyaWRlICogOCAvIDU7CkBAIC0zNDM0LDEwICszNTkzLDEyIEBACiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX0dSQkc6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX1JHR0I6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX0dSRVk6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEwQlBQX0dCUkc6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEwQlBQX0dSQkc6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEwQlBQX1JHR0I6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEwQlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEwQlBQX0dSRVk6CiAgICAgICAgIC8qIEV2ZXJ5IDY0IHBpeGVscyBvY2N1cHkgODAgYnl0ZXMgKi8KICAgICAgICAgc3RyaWRlID0gUEFEX1RPX1NJWkUoZGltLT53aWR0aCwgQ0FNX1BBRF9UT180KTsKICAgICAgICAgc3RyaWRlX2luX2J5dGVzID0gUEFEX1RPX1NJWkUoc3RyaWRlICogNSAvIDQsIENBTV9QQURfVE9fOCk7CkBAIC0zNDYwLDEwICszNjIxLDEyIEBACiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEyQlBQX0dSQkc6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEyQlBQX1JHR0I6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEyQlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEyQlBQX0dSRVk6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEyQlBQX0dCUkc6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEyQlBQX0dSQkc6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEyQlBQX1JHR0I6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEyQlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEyQlBQX0dSRVk6CiAgICAgICAgIC8qIEV2ZXJ5IDMyIHBpeGVscyBvY2N1cHkgNDggYnl0ZXMgKi8KICAgICAgICAgc3RyaWRlID0gUEFEX1RPX1NJWkUoZGltLT53aWR0aCwgQ0FNX1BBRF9UT18zMik7CiAgICAgICAgIHN0cmlkZV9pbl9ieXRlcyA9IHN0cmlkZSAqIDMgLyAyOwpAQCAtMzUyMCwxMCArMzY4MywxMiBAQAogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xNEJQUF9HUkJHOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xNEJQUF9SR0dCOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xNEJQUF9CR0dSOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xNEJQUF9HUkVZOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xNEJQUF9HQlJHOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xNEJQUF9HUkJHOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xNEJQUF9SR0dCOgogICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xNEJQUF9CR0dSOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xNEJQUF9HUkVZOgogICAgICAgICAvKiBFdmVyeSA2NCBwaXhlbHMgb2NjdXB5IDExMiBieXRlcyAqLwogICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCBDQU1fUEFEX1RPXzY0KTsKICAgICAgICAgc3RyaWRlX2luX2J5dGVzID0gc3RyaWRlICogNyAvIDQ7CkBAIC0zNTQ2LDEwICszNzExLDEyIEBACiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX0dSQkc6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX1JHR0I6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX0dSRVk6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzE0QlBQX0dCUkc6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzE0QlBQX0dSQkc6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzE0QlBQX1JHR0I6CiAgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzE0QlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzE0QlBQX0dSRVk6CiAgICAgICAgIC8qIEV2ZXJ5IDE2IHBpeGVscyBvY2N1cHkgMzIgYnl0ZXMgKi8KICAgICAgICAgc3RyaWRlID0gUEFEX1RPX1NJWkUoZGltLT53aWR0aCwgQ0FNX1BBRF9UT18xNik7CiAgICAgICAgIHN0cmlkZV9pbl9ieXRlcyA9IHN0cmlkZSAqIDI7CkBAIC0zNTk4LDExICszNzY1LDE4IEBACiB7CiAgICAgaW50MzJfdCByYyA9IDA7CiAgICAgaW50IHN0cmlkZSA9IDAsIHNjYW5saW5lID0gMDsKKworICAgICNpZmRlZiBVQldDX1BSRVNFTlQKICAgICBpbnQgbWV0YV9zdHJpZGUgPSAwLG1ldGFfc2NhbmxpbmUgPSAwOworICAgICNlbmRpZgogCiAKICAgICBzd2l0Y2ggKGZtdCkgewogICAgICAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyOgorICAgICAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZOgorICAgICAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzEwX0JQUDoKKyAgICAgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWV8xMl9CUFA6CisgICAgICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZX09OTFlfMTRfQlBQOgogICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMjsKIAogICAgICAgICAgICAgc3RyaWRlID0gZGltLT53aWR0aDsKQEAgLTM5NjUsNiArNDEzOSw5IEBACiAgICAgICAgICAgICBDQU1fUEFEX1RPXzRLKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWToKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzEwX0JQUDoKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzEyX0JQUDoKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzE0X0JQUDoKICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMTsKIAogICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiA9CkBAIC00MDQ4LDYgKzQyMjUsNTcgQEAKICAgICAgICAgcmMgPSAtMTsKICNlbmRpZgogICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyX1VCV0M6CisjaWZkZWYgVUJXQ19QUkVTRU5UCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtZXRhX3N0cmlkZSA9IDAsbWV0YV9zY2FubGluZSA9IDA7CisgICAgICAgICAgICAvLyB1c2luZyBVQldDCisgICAgICAgICAgICBzdHJpZGUgPSBWRU5VU19ZX1NUUklERShDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPndpZHRoKTsKKyAgICAgICAgICAgIHNjYW5saW5lID0gVkVOVVNfWV9TQ0FOTElORVMoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT5oZWlnaHQpOworICAgICAgICAgICAgbWV0YV9zdHJpZGUgPSBWRU5VU19ZX01FVEFfU1RSSURFKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+d2lkdGgpOworICAgICAgICAgICAgbWV0YV9zY2FubGluZSA9IFZFTlVTX1lfTUVUQV9TQ0FOTElORVMoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT5oZWlnaHQpOworCisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9CisgICAgICAgICAgICAgICAgICAgIFZFTlVTX0JVRkZFUl9TSVpFKENPTE9SX0ZNVF9OVjEyX1VCV0MsIHN0cmlkZSwgc2NhbmxpbmUpOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMjsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPTA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5tZXRhX3N0cmlkZSA9IG1ldGFfc3RyaWRlOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5tZXRhX3NjYW5saW5lID0gbWV0YV9zY2FubGluZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubWV0YV9sZW4gPQorICAgICAgICAgICAgICAgICAgICBNU01fTUVESUFfQUxJR04obWV0YV9zdHJpZGUgKiBtZXRhX3NjYW5saW5lLCA0MDk2KTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0KKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShNU01fTUVESUFfQUxJR04oKHN0cmlkZSAqIHNjYW5saW5lKSwgNDA5NikgKworICAgICAgICAgICAgICAgICAgICAoYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5tZXRhX2xlbikpOworCisgICAgICAgICAgICBzdHJpZGUgPSBWRU5VU19VVl9TVFJJREUoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT53aWR0aCk7CisgICAgICAgICAgICBzY2FubGluZSA9IFZFTlVTX1VWX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPmhlaWdodCk7CisgICAgICAgICAgICBtZXRhX3N0cmlkZSA9IFZFTlVTX1VWX01FVEFfU1RSSURFKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+d2lkdGgpOworICAgICAgICAgICAgbWV0YV9zY2FubGluZSA9IFZFTlVTX1VWX01FVEFfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3ggPTA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF95ID0gMDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmhlaWdodCA9IGRpbS0+aGVpZ2h0LzI7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm1ldGFfc3RyaWRlID0gbWV0YV9zdHJpZGU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm1ldGFfc2NhbmxpbmUgPSBtZXRhX3NjYW5saW5lOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5tZXRhX2xlbiA9CisgICAgICAgICAgICAgICAgICAgIE1TTV9NRURJQV9BTElHTihtZXRhX3N0cmlkZSAqIG1ldGFfc2NhbmxpbmUsIDQwOTYpOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5sZW4gPQorICAgICAgICAgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiAtIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuOworICAgICAgICB9CisjZWxzZQorICAgICAgICBMT0dFKCJVQldDIGhhcmR3YXJlIG5vdCBhdmFpbCwgY2Fubm90IHVzZSB0aGlzIGZvcm1hdCIpOworICAgICAgICByYyA9IC0xOworI2VuZGlmCisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIExPR0UoIkludmFsaWQgY2FtX2Zvcm1hdCBmb3IgYW5seXNpcyAlZCIsCiAgICAgICAgICAgICAgICAgICAgIGZtdCk7CkBAIC00Mjk2LDkgKzQ1MjQsMTAgQEAKICAgICByYyA9IG1tX3N0cmVhbV9jYWxjX29mZnNldChteV9vYmopOwogCiAgICAgaWYgKHJjID09IDApIHsKLSAgICAgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zX2N0cmwobXlfb2JqLT5mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1BSSVZfU1RSRUFNX0lORk9fU1lOQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgICAgICAgbW1fY2FtZXJhX29ial90ICpjYW1fb2JqID0gbXlfb2JqLT5jaF9vYmotPmNhbV9vYmo7CisgICAgICAgIGludCBzdHJlYW1faWQgID0gIG15X29iai0+c2VydmVyX3N0cmVhbV9pZDsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zX2N0cmwoY2FtX29iaiwgc3RyZWFtX2lkLCBteV9vYmotPmZkLAorICAgICAgICAgICAgICAgIENBTV9QUklWX1NUUkVBTV9JTkZPX1NZTkMsICZ2YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiByYzsKIH0KQEAgLTQzMjEsNyArNDU1MCw2IEBACiAgICAgc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKICAgICBzdHJ1Y3QgbXNtX3Y0bDJfZm9ybWF0X2RhdGEgbXNtX2ZtdDsKICAgICBpbnQgaTsKLQogICAgIExPR0QoIkUsIG15X2hhbmRsZSA9IDB4JXgsIGZkID0gJWQsIHN0YXRlID0gJWQiLAogICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlKTsKIApAQCAtNDMzOSw3ICs0NTY3LDYgQEAKICAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7CiAgICAgbXNtX2ZtdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKIAotCiAgICAgbXNtX2ZtdC53aWR0aCA9ICh1bnNpZ25lZCBpbnQpbXlfb2JqLT5zdHJlYW1faW5mby0+ZGltLndpZHRoOwogICAgIG1zbV9mbXQuaGVpZ2h0ID0gKHVuc2lnbmVkIGludClteV9vYmotPnN0cmVhbV9pbmZvLT5kaW0uaGVpZ2h0OwogICAgIG1zbV9mbXQucGl4ZWxmb3JtYXQgPSBtbV9zdHJlYW1fZ2V0X3Y0bDJfZm10KG15X29iai0+c3RyZWFtX2luZm8tPmZtdCk7CkBAIC00MzU3LDEyICs0NTg0LDkyIEBACiAgICAgbWVtY3B5KGZtdC5mbXQucmF3X2RhdGEsICZtc21fZm10LCBzaXplb2YobXNtX2ZtdCkpOwogICAgIHJjID0gaW9jdGwobXlfb2JqLT5mZCwgVklESU9DX1NfRk1ULCAmZm10KTsKICAgICBpZiAocmMgPCAwKSB7Ci0gICAgICAgIExPR0UoImlvY3RsIGZhaWxlZCAlZCwgZXJybm8gJWQiLCByYywgZXJybm8pOworICAgICAgICBMT0dFKCJpb2N0bCBWSURJT0NfU19GTVQgZmFpbGVkOiByYz0lZCBlcnJubyAlZFxuIiwgcmMsIGVycm5vKTsKKyAgICB9IGVsc2UgeworI2lmbmRlZiBEQUVNT05fUFJFU0VOVAorICAgICAgICBtbV9jYW1lcmFfb2JqX3QgKmNhbV9vYmogPSBteV9vYmotPmNoX29iai0+Y2FtX29iajsKKyAgICAgICAgY2FtX3NoaW1fcGFja2V0X3QgKnNoaW1fY21kOworICAgICAgICBjYW1fc2hpbV9jbWRfZGF0YSBzaGltX2NtZF9kYXRhOworCisgICAgICAgIG1lbXNldCgmc2hpbV9jbWRfZGF0YSwgMCwgc2l6ZW9mKHNoaW1fY21kX2RhdGEpKTsKKyAgICAgICAgc2hpbV9jbWRfZGF0YS5jb21tYW5kID0gTVNNX0NBTUVSQV9QUklWX1NfRk1UOworICAgICAgICBzaGltX2NtZF9kYXRhLnN0cmVhbV9pZCA9IG15X29iai0+c2VydmVyX3N0cmVhbV9pZDsKKyAgICAgICAgc2hpbV9jbWRfZGF0YS52YWx1ZSA9IE5VTEw7CisgICAgICAgIHNoaW1fY21kID0gbW1fY2FtZXJhX2NyZWF0ZV9zaGltX2NtZF9wYWNrZXQoQ0FNX1NISU1fU0VUX1BBUk0sCisgICAgICAgICAgICAgICAgY2FtX29iai0+c2Vzc2lvbmlkLCAmc2hpbV9jbWRfZGF0YSk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX21vZHVsZV9zZW5kX2NtZChzaGltX2NtZCk7CisgICAgICAgIG1tX2NhbWVyYV9kZXN0cm95X3NoaW1fY21kX3BhY2tldChzaGltX2NtZCk7CisjZW5kaWYgLyogREFFTU9OX1BSRVNFTlQgKi8KICAgICB9CiAgICAgcmV0dXJuIHJjOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9jYW5jZWxfYnVmCisgKgorICogREVTQ1JJUFRJT046IEdldCBidWZmZXIgYmFjayBmcm9tIGtlcm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogc3RyZWFtIG9iamVjdAorICogICBAYnVmX2lkeCAgICAgICAgOiBmcmFtZSBpbmRleCB0byBiZSBkZS1xdWV1ZWQgYmFjayBmcm9tIGtlcm5lbAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9zdHJlYW1fY2FuY2VsX2J1ZihtbV9zdHJlYW1fdCAqIG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1Zl9pZHgpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgTE9HRCgiRSwgbXlfaGFuZGxlID0gMHgleCwgZmQgPSAlZCwgc3RhdGUgPSAlZCIsCisgICAgICAgICAgbXlfb2JqLT5teV9oZGwsIG15X29iai0+ZmQsIG15X29iai0+c3RhdGUpOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICBpZihteV9vYmotPmJ1Zl9zdGF0dXNbYnVmX2lkeF0uYnVmX3JlZmNudCAhPSAwKSB7CisgICAgICAgIExPR0UoIkVycm9yIFRyeWluZyB0byBleHRyYWN0IGEgZnJhbWUgYWxyZWFkeSBzZW50IHRvIEhBTChpZHg9JWQpIGNvdW50PSVkXG4iLAorICAgICAgICAgICAgICAgICAgICBidWZfaWR4LAorICAgICAgICAgICAgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tidWZfaWR4XS5idWZfcmVmY250KTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+YnVmX2xvY2spOworICAgICAgICByYyA9IC0xOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICBpZiAobXlfb2JqLT5zdHJlYW1faW5mby0+c3RyZWFtaW5nX21vZGUgPT0gQ0FNX1NUUkVBTUlOR19NT0RFX0JBVENIKSB7CisgICAgICAgIC8qcmMgPSBtbV9zdHJlYW1fd3JpdGVfdXNlcl9idWYobXlfb2JqLCBmcmFtZSk7Ki8KKyAgICAgICAgLy8gVE9ETyBoYW5kbGluZyBiYXRjaCBidWZmZXJzCisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICAgICAgLy9teV9vYmotPmJ1Zl9zdGF0dXNbYnVmX2lkeF0uYnVmX3JlZmNudCsrOworICAgICAgICB7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5idWZfbG9jayk7CisgICAgICAgICAgICBMT0dEKCI8REVCVUc+IDogQ2FuY2VsIEJ1ZmZlciBkb25lIGZvciBidWZmZXI6JWQsIHN0cmVhbSB0eXBlOiVkIiwgYnVmX2lkeCwgbXlfb2JqLT5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUpOworCisgICAgICAgICAgICBzdHJ1Y3QgbXNtX2NhbWVyYV9yZXR1cm5fYnVmIGJ1ZmlkOworICAgICAgICAgICAgbWVtc2V0KCZidWZpZCwgMCwgc2l6ZW9mKHN0cnVjdCBtc21fY2FtZXJhX3JldHVybl9idWYpKTsKKyAgICAgICAgICAgIGJ1ZmlkLmluZGV4ID0gYnVmX2lkeDsKKworICAgICAgICAgICAgc3RydWN0IG1zbV9jYW1lcmFfcHJpdmF0ZV9pb2N0bF9hcmcgYXJnOworICAgICAgICAgICAgbWVtc2V0KCZhcmcsIDAsIHNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV9wcml2YXRlX2lvY3RsX2FyZykpOworICAgICAgICAgICAgYXJnLmlkID0gTVNNX0NBTUVSQV9QUklWX0lPQ1RMX0lEX1JFVFVSTl9CVUY7CisgICAgICAgICAgICBhcmcuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV9yZXR1cm5fYnVmKTsKKyAgICAgICAgICAgIGFyZy5pb2N0bF9wdHIgPSAodWludDMyX3QpICZidWZpZDsKKworCisgICAgICAgICAgICByYyA9IGlvY3RsKG15X29iai0+ZmQsIFZJRElPQ19NU01fQ0FNRVJBX1BSSVZBVEVfSU9DVExfQ01ELCAmYXJnKTsKKworICAgICAgICAgICAgaWYocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fc3RyZWFtX2NhbmNlbF9idWYoaWR4PSVkKSBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX2lkeCwgcmMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL215X29iai0+YnVmX3N0YXR1c1tmcmFtZS0+YnVmX2lkeF0uaW5fa2VybmVsID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fYnVmX2RvbmUKICAqCiAgKiBERVNDUklQVElPTjogZW5xdWV1ZSBidWZmZXIgYmFjayB0byBrZXJuZWwKQEAgLTQzODMsMTYgKzQ2OTAsMjIgQEAKICAgICAgICAgICBteV9vYmotPm15X2hkbCwgbXlfb2JqLT5mZCwgbXlfb2JqLT5zdGF0ZSk7CiAKICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+YnVmX2xvY2spOwotICAgIGlmIChteV9vYmotPnN0cmVhbV9pbmZvLT5zdHJlYW1pbmdfbW9kZSA9PSBDQU1fU1RSRUFNSU5HX01PREVfQkFUQ0gpIHsKLSAgICAgICAgcmMgPSBtbV9zdHJlYW1fd3JpdGVfdXNlcl9idWYobXlfb2JqLCBmcmFtZSk7Ci0gICAgfSBlbHNlIGlmKG15X29iai0+YnVmX3N0YXR1c1tmcmFtZS0+YnVmX2lkeF0uYnVmX3JlZmNudCA9PSAwKSB7Ci0gICAgICAgIExPR0QoIkVycm9yIFRyeWluZyB0byBmcmVlIHNlY29uZCB0aW1lPyhpZHg9JWQpIGNvdW50PSVkXG4iLAorICAgIGlmKG15X29iai0+YnVmX3N0YXR1c1tmcmFtZS0+YnVmX2lkeF0uYnVmX3JlZmNudCA9PSAwKSB7CisgICAgICAgIExPR0UoIkVycm9yIFRyeWluZyB0byBmcmVlIHNlY29uZCB0aW1lPyhpZHg9JWQpIGNvdW50PSVkXG4iLAogICAgICAgICAgICAgICAgICAgICBmcmFtZS0+YnVmX2lkeCwKICAgICAgICAgICAgICAgICAgICBteV9vYmotPmJ1Zl9zdGF0dXNbZnJhbWUtPmJ1Zl9pZHhdLmJ1Zl9yZWZjbnQpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5idWZfbG9jayk7CiAgICAgICAgIHJjID0gLTE7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+YnVmX2xvY2spOworICAgIGlmIChteV9vYmotPnN0cmVhbV9pbmZvLT5zdHJlYW1pbmdfbW9kZSA9PSBDQU1fU1RSRUFNSU5HX01PREVfQkFUQ0gpIHsKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fd3JpdGVfdXNlcl9idWYobXlfb2JqLCBmcmFtZSk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKICAgICAgICAgbXlfb2JqLT5idWZfc3RhdHVzW2ZyYW1lLT5idWZfaWR4XS5idWZfcmVmY250LS07CiAgICAgICAgIGlmICgwID09IG15X29iai0+YnVmX3N0YXR1c1tmcmFtZS0+YnVmX2lkeF0uYnVmX3JlZmNudCkgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+YnVmX2xvY2spOwogICAgICAgICAgICAgTE9HRCgiPERFQlVHPiA6IEJ1ZiBkb25lIGZvciBidWZmZXI6JWQsIHN0cmVhbTolZCIsIGZyYW1lLT5idWZfaWR4LCBmcmFtZS0+c3RyZWFtX3R5cGUpOwogICAgICAgICAgICAgcmMgPSBtbV9zdHJlYW1fcWJ1ZihteV9vYmosIGZyYW1lKTsKICAgICAgICAgICAgIGlmKHJjIDwgMCkgewpAQCAtNDQwNiw5ICs0NzE5LDkgQEAKICAgICAgICAgICAgICAgICAgbXlfb2JqLT5idWZfc3RhdHVzW2ZyYW1lLT5idWZfaWR4XS5idWZfcmVmY250KTsKICAgICAgICAgICAgIExPR0QoIjxERUJVRz4gOiBmb3IgYnVmZmVyOiVwOiVkIiwKICAgICAgICAgICAgICAgICAgbXlfb2JqLCBmcmFtZS0+YnVmX2lkeCk7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5idWZfbG9jayk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+YnVmX2xvY2spOwogICAgIHJldHVybiByYzsKIH0KIApkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3QvQW5kcm9pZC5tayBiL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L0FuZHJvaWQubWsKaW5kZXggMGVhMjJlMC4uYzZjMzE2MyAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3QvQW5kcm9pZC5taworKysgYi9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9BbmRyb2lkLm1rCkBAIC04Niw3ICs4Niw3IEBACiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCi0gICAgICAgICBsaWJjdXRpbHMgbGliZGwgbGlibW1jYW1lcmFfaW50ZXJmYWNlCisgICAgICAgICBsaWJsb2cgbGliY3V0aWxzIGxpYmRsIGxpYm1tY2FtZXJhX2ludGVyZmFjZQogCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCkBAIC0xODAsNyArMTgwLDcgQEAKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKLSAgICAgICAgIGxpYmN1dGlscyBsaWJkbCBsaWJtbWNhbWVyYV9pbnRlcmZhY2UKKyAgICAgICAgIGxpYmxvZyBsaWJjdXRpbHMgbGliZGwgbGlibW1jYW1lcmFfaW50ZXJmYWNlCiAKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiAKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX2FwcC5jIGIvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfYXBwLmMKaW5kZXggMDJkZjczMy4uMzA2MmIxZiAxMDA2NDQKLS0tIGEvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfYXBwLmMKKysrIGIvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfYXBwLmMKQEAgLTQxNCw2ICs0MTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnVmc1tpXS5mZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClwQnVmc1tpXS5mcmFtZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiwgb3BzX3RibC0+dXNlcmRhdGEpOwogICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CiAgICAgICAgICAgICBMT0dFKCJtYXBwaW5nIGJ1ZlslZF0gZXJyID0gJWQiLCAgaSwgcmMpOwpAQCAtNTMzLDcgKzUzNCw4IEBACiAgICAgcmMgPSB0ZXN0X29iai0+Y2FtLT5vcHMtPm1hcF9idWYodGVzdF9vYmotPmNhbS0+Y2FtZXJhX2hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9DQVBBQklMSVRZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb2JqLT5jYXBfYnVmLm1lbV9pbmZvLmZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb2JqLT5jYXBfYnVmLm1lbV9pbmZvLnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb2JqLT5jYXBfYnVmLm1lbV9pbmZvLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgewogICAgICAgICBMT0dFKCJtYXAgZm9yIGNhcGFiaWxpdHkgZXJyb3JcbiIpOwogICAgICAgICBnb3RvIGVycm9yX2FmdGVyX2NhcF9idWZfYWxsb2M7CkBAIC01NTYsNyArNTU4LDggQEAKICAgICByYyA9IHRlc3Rfb2JqLT5jYW0tPm9wcy0+bWFwX2J1Zih0ZXN0X29iai0+Y2FtLT5jYW1lcmFfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1BBUk1fQlVGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5mZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X29iai0+cGFybV9idWYubWVtX2luZm8uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9vYmotPnBhcm1fYnVmLm1lbV9pbmZvLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgewogICAgICAgICBMT0dFKCJtYXAgZ2V0cGFybV9idWYgZXJyb3JcbiIpOwogICAgICAgICBnb3RvIGVycm9yX2FmdGVyX2dldHBhcm1fYnVmX2FsbG9jOwpAQCAtNzY5LDcgKzc3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnNfaW5mb19idWYubWVtX2luZm8uZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClzdHJlYW0tPnNfaW5mb19idWYubWVtX2luZm8uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClzdHJlYW0tPnNfaW5mb19idWYubWVtX2luZm8uc2l6ZSwgTlVMTCk7CiAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgewogICAgICAgICBMT0dFKCJtYXAgc2V0cGFybV9idWYgZXJyb3JcbiIpOwogICAgICAgICBtbV9hcHBfZGVhbGxvY2F0ZV9pb25fbWVtb3J5KCZzdHJlYW0tPnNfaW5mb19idWYpOwpkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfcHJldmlldy5jIGIvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfcHJldmlldy5jCmluZGV4IGE1ZmJhNGIuLjIxZmE0YzMgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX3ByZXZpZXcuYworKysgYi9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9zcmMvbW1fcWNhbWVyYV9wcmV2aWV3LmMKQEAgLTU2NCw3ICs1NjQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1fZGltZW5zaW9uX3QqIHByZXZpZXdfZGltKQogewogICAgIGNhbV9jYXBhYmlsaXR5X3QgKmNhbV9jYXAgPSAoY2FtX2NhcGFiaWxpdHlfdCAqKSh0ZXN0X29iai0+Y2FwX2J1Zi5idWYuYnVmZmVyKTsKLSAgICBjYW1fZGltZW5zaW9uX3QgbWF4X2FuYWx5c2lzX2RpbSA9IGNhbV9jYXAtPmFuYWx5c2lzX21heF9yZXM7CisgICAgY2FtX2RpbWVuc2lvbl90IG1heF9hbmFseXNpc19kaW0gPQorICAgICAgICBjYW1fY2FwLT5hbmFseXNpc19pbmZvW0NBTV9BTkFMWVNJU19JTkZPX0ZEX1NUSUxMXS5hbmFseXNpc19tYXhfcmVzOwogICAgIGNhbV9kaW1lbnNpb25fdCBhbmFseXNpc19kaW0gPSB7MCwgMH07CiAKICAgICBpZiAocHJldmlld19kaW0tPndpZHRoID4gbWF4X2FuYWx5c2lzX2RpbS53aWR0aCB8fApAQCAtNjM5LDcgKzY0MCw4IEBACiAgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+c3RyZWFtaW5nX21vZGUgPSBDQU1fU1RSRUFNSU5HX01PREVfQ09OVElOVU9VUzsKICAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5mbXQgPSBERUZBVUxUX1BSRVZJRVdfRk9STUFUOwogICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbSA9IGFuYWx5c2lzX2RpbTsKLSAgICBzdHJlYW0tPnNfY29uZmlnLnBhZGRpbmdfaW5mbyA9IGNhbV9jYXAtPmFuYWx5c2lzX3BhZGRpbmdfaW5mbzsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnBhZGRpbmdfaW5mbyA9CisgICAgICAgIGNhbV9jYXAtPmFuYWx5c2lzX2luZm9bQ0FNX0FOQUxZU0lTX0lORk9fRkRfU1RJTExdLmFuYWx5c2lzX3BhZGRpbmdfaW5mbzsKIAogICAgIHJjID0gbW1fYXBwX2NvbmZpZ19zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwsIHN0cmVhbSwgJnN0cmVhbS0+c19jb25maWcpOwogICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMpIHsKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3NyYy9tbV9qcGVnX2V4aWYuYyBiL1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3NyYy9tbV9qcGVnX2V4aWYuYwppbmRleCBlNTZmYzI0Li4zZmE3NDY0IDEwMDY0NAotLS0gYS9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9zcmMvbW1fanBlZ19leGlmLmMKKysrIGIvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2Uvc3JjL21tX2pwZWdfZXhpZi5jCkBAIC01NjYsMTAgKzU2NiwyNSBAQAogICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAvKiBIQUwgVjMgKi8KKyAgICAgIHBfM2FfcGFyYW1zLmlzb192YWx1ZSA9IDEwMDsKKwogICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgaXNvLCBDQU1fSU5URl9NRVRBX1NFTlNPUl9TRU5TSVRJVklUWSwgcF9tZXRhKSB7Ci0gICAgICAgIHBfM2FfcGFyYW1zLmlzb192YWx1ZT0gKmlzbzsKKyAgICAgICAgcF8zYV9wYXJhbXMuaXNvX3ZhbHVlPSBwXzNhX3BhcmFtcy5pc29fdmFsdWUgKiAoKmlzbykgLyAxMDA7CiAgICAgICB9IGVsc2UgewotICAgICAgICBMT0dFKCJDYW5ub3QgZXh0cmFjdCBJc28gdmFsdWUiKTsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGV4dHJhY3QgU0VOU09SX1NFTlNJVElWSVRZIHZhbHVlIik7CisgICAgICB9CisKKyAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIGlzcF9pc28sIENBTV9JTlRGX01FVEFfSVNQX1NFTlNJVElWSVRZLCBwX21ldGEpIHsKKyAgICAgICAgcF8zYV9wYXJhbXMuaXNvX3ZhbHVlPSBwXzNhX3BhcmFtcy5pc29fdmFsdWUgKiAoKmlzcF9pc28pIC8gMTAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGV4dHJhY3QgSVNQX1NFTlNJVElWSVRZIHZhbHVlIik7CisgICAgICB9CisKKyAgICAgIElGX01FVEFfQVZBSUxBQkxFKGZsb2F0LCBwb3N0X3N0YXRzX2lzbywgQ0FNX0lOVEZfTUVUQV9JU1BfUE9TVF9TVEFUU19TRU5TSVRJVklUWSwgcF9tZXRhKSB7CisgICAgICAgIHBfM2FfcGFyYW1zLmlzb192YWx1ZT0gcF8zYV9wYXJhbXMuaXNvX3ZhbHVlICogKCpwb3N0X3N0YXRzX2lzbyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvKiBDQU1fSU5URl9NRVRBX0lTUF9QT1NUX1NUQVRTX1NFTlNJVElWSVRZIGlzIG9wdGlvbmFsICovCisgICAgICAgIExPR0QoIkNhbm5vdCBleHRyYWN0IElTUF9QT1NUX1NUQVRTX1NFTlNJVElWSVRZIHZhbHVlIik7CiAgICAgICB9CiAKICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDY0X3QsIHNlbnNvcl9leHBvc3VyZV90aW1lLApkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2UvdGVzdC9BbmRyb2lkLm1rIGIvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2UvdGVzdC9BbmRyb2lkLm1rCmluZGV4IGI0MjYzNmMuLjQ2YTE3ZGEgMTAwNjQ0Ci0tLSBhL1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3Rlc3QvQW5kcm9pZC5taworKysgYi9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS90ZXN0L0FuZHJvaWQubWsKQEAgLTM3LDcgKzM3LDcgQEAKIExPQ0FMXzMyX0JJVF9PTkxZIDo9ICQoQk9BUkRfUVRJX0NBTUVSQV8zMkJJVF9PTkxZKQogTE9DQUxfTU9EVUxFICAgICAgICAgICA6PSBtbS1qcGVnLWludGVyZmFjZS10ZXN0CiBMT0NBTF9QUkVMSU5LX01PRFVMRSAgIDo9IGZhbHNlCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJkbCBsaWJtbWpwZWdfaW50ZXJmYWNlCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMgbGliZGwgbGlibW1qcGVnX2ludGVyZmFjZQogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIApAQCAtODAsOCArODAsOCBAQAogTE9DQUxfMzJfQklUX09OTFkgOj0gJChCT0FSRF9RVElfQ0FNRVJBXzMyQklUX09OTFkpCiBMT0NBTF9NT0RVTEUgICAgICAgICAgIDo9IG1tLWpwZWdkZWMtaW50ZXJmYWNlLXRlc3QKIExPQ0FMX1BSRUxJTktfTU9EVUxFICAgOj0gZmFsc2UKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYmRsIGxpYm1tanBlZ19pbnRlcmZhY2UKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibG9nIGxpYmN1dGlscyBsaWJkbCBsaWJtbWpwZWdfaW50ZXJmYWNlCiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCi1MT0NBTF9QQVRIIDo9ICQoT0xEX0xPQ0FMX1BBVEgpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorTE9DQUxfUEFUSCA6PSAkKE9MRF9MT0NBTF9QQVRIKQpkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhQnVmZmVyTWFwcy5jcHAgYi9RQ2FtZXJhMi91dGlsL1FDYW1lcmFCdWZmZXJNYXBzLmNwcAppbmRleCBkN2MwNThlLi41Y2Q4MTU5IDEwMDY0NAotLS0gYS9RQ2FtZXJhMi91dGlsL1FDYW1lcmFCdWZmZXJNYXBzLmNwcAorKysgYi9RQ2FtZXJhMi91dGlsL1FDYW1lcmFCdWZmZXJNYXBzLmNwcApAQCAtMTA3LDEwICsxMDcsMTEgQEAKICAgICAgICAgaW50MzJfdCBwUGxhbmVJbmRleCwKICAgICAgICAgdWludDMyX3QgcENvb2tpZSwKICAgICAgICAgaW50MzJfdCBwRmQsCi0gICAgICAgIHNpemVfdCBwU2l6ZSkKKyAgICAgICAgc2l6ZV90IHBTaXplLAorICAgICAgICB2b2lkICpidWZmZXIpCiB7CiAgICAgbWVtc2V0KCZtQnVmTWFwTGlzdCwgMCwgc2l6ZW9mKG1CdWZNYXBMaXN0KSk7Ci0gICAgZW5xdWV1ZShwVHlwZSwgcFN0cmVhbUlkLCBwRnJhbWVJbmRleCwgcFBsYW5lSW5kZXgsIHBDb29raWUsIHBGZCwgcFNpemUpOworICAgIGVucXVldWUocFR5cGUsIHBTdHJlYW1JZCwgcEZyYW1lSW5kZXgsIHBQbGFuZUluZGV4LCBwQ29va2llLCBwRmQsIHBTaXplLCBidWZmZXIpOwogfQogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTY4LDcgKzE2OSw4IEBACiAgICAgICAgIGludDMyX3QgcFBsYW5lSW5kZXgsCiAgICAgICAgIHVpbnQzMl90IHBDb29raWUsCiAgICAgICAgIGludDMyX3QgcEZkLAotICAgICAgICBzaXplX3QgcFNpemUpCisgICAgICAgIHNpemVfdCBwU2l6ZSwKKyAgICAgICAgdm9pZCAqYnVmZmVyKQogewogICAgIHVpbnQzMl90IHBvcyA9IG1CdWZNYXBMaXN0Lmxlbmd0aCsrOwogICAgIG1CdWZNYXBMaXN0LmJ1Zl9tYXBzW3Bvc10udHlwZSA9IHBUeXBlOwpAQCAtMTc4LDYgKzE4MCw3IEBACiAgICAgbUJ1Zk1hcExpc3QuYnVmX21hcHNbcG9zXS5jb29raWUgPSBwQ29va2llOwogICAgIG1CdWZNYXBMaXN0LmJ1Zl9tYXBzW3Bvc10uZmQgPSBwRmQ7CiAgICAgbUJ1Zk1hcExpc3QuYnVmX21hcHNbcG9zXS5zaXplID0gcFNpemU7CisgICAgbUJ1Zk1hcExpc3QuYnVmX21hcHNbcG9zXS5idWZmZXIgPSBidWZmZXI7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0yMjcsNyArMjMwLDggQEAKICAgICAgICAgdWludDMyX3QgcENvb2tpZSwKICAgICAgICAgaW50MzJfdCBwRmQsCiAgICAgICAgIHNpemVfdCBwU2l6ZSwKLSAgICAgICAgY2FtX2J1Zl9tYXBfdHlwZV9saXN0JiBwQnVmTWFwTGlzdCkKKyAgICAgICAgY2FtX2J1Zl9tYXBfdHlwZV9saXN0JiBwQnVmTWFwTGlzdCwKKyAgICAgICAgdm9pZCAqYnVmZmVyKQogewogICAgIHVpbnQzMl90IHJjID0gTk9fRVJST1I7CiAKQEAgLTIzNyw3ICsyNDEsOCBAQAogICAgICAgICAgICAgcFBsYW5lSW5kZXgsCiAgICAgICAgICAgICBwQ29va2llLAogICAgICAgICAgICAgcEZkLAotICAgICAgICAgICAgcFNpemUpOworICAgICAgICAgICAgcFNpemUsCisgICAgICAgICAgICBidWZmZXIpOwogICAgIHJjID0gYnVmZmVyTWFwcy5nZXRDYW1CdWZNYXBMaXN0KHBCdWZNYXBMaXN0KTsKIAogICAgIHJldHVybiByYzsKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL3V0aWwvUUNhbWVyYUJ1ZmZlck1hcHMuaCBiL1FDYW1lcmEyL3V0aWwvUUNhbWVyYUJ1ZmZlck1hcHMuaAppbmRleCBlYWE0NzA3Li5hMGJkZmNlIDEwMDY0NAotLS0gYS9RQ2FtZXJhMi91dGlsL1FDYW1lcmFCdWZmZXJNYXBzLmgKKysrIGIvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhQnVmZmVyTWFwcy5oCkBAIC00Niw3ICs0Niw4IEBACiAgICAgICAgICAgICBpbnQzMl90IHBQbGFuZUluZGV4LAogICAgICAgICAgICAgdWludDMyX3QgcENvb2tpZSwKICAgICAgICAgICAgIGludDMyX3QgcEZkLAotICAgICAgICAgICAgc2l6ZV90IHBTaXplKTsKKyAgICAgICAgICAgIHNpemVfdCBwU2l6ZSwKKyAgICAgICAgICAgIHZvaWQgKmJ1ZmZlcik7CiAKICAgICB+UUNhbWVyYUJ1ZmZlck1hcHMoKTsKIApAQCAtNTgsNyArNTksOCBAQAogICAgICAgICAgICAgaW50MzJfdCBwUGxhbmVJbmRleCwKICAgICAgICAgICAgIHVpbnQzMl90IHBDb29raWUsCiAgICAgICAgICAgICBpbnQzMl90IHBGZCwKLSAgICAgICAgICAgIHNpemVfdCBwU2l6ZSk7CisgICAgICAgICAgICBzaXplX3QgcFNpemUsCisgICAgICAgICAgICB2b2lkICpidWZmZXIpOwogCiAgICAgdWludDMyX3QgZ2V0Q2FtQnVmTWFwTGlzdChjYW1fYnVmX21hcF90eXBlX2xpc3QmIHBCdWZNYXBMaXN0KSBjb25zdDsKIApAQCAtNjksNyArNzEsOCBAQAogICAgICAgICAgICAgdWludDMyX3QgcENvb2tpZSwKICAgICAgICAgICAgIGludDMyX3QgcEZkLAogICAgICAgICAgICAgc2l6ZV90IHBTaXplLAotICAgICAgICAgICAgY2FtX2J1Zl9tYXBfdHlwZV9saXN0JiBwQnVmTWFwTGlzdCk7CisgICAgICAgICAgICBjYW1fYnVmX21hcF90eXBlX2xpc3QmIHBCdWZNYXBMaXN0LAorICAgICAgICAgICAgdm9pZCAqYnVmZmVyKTsKIAogcHJpdmF0ZToKICAgICBjYW1fYnVmX21hcF90eXBlX2xpc3QgbUJ1Zk1hcExpc3Q7CmRpZmYgLS1naXQgYS9RQ2FtZXJhMi91dGlsL1FDYW1lcmFDbWRUaHJlYWQuY3BwIGIvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhQ21kVGhyZWFkLmNwcAppbmRleCBmNGM2ZjIyLi44YjE5MWIwIDEwMDY0NAotLS0gYS9RQ2FtZXJhMi91dGlsL1FDYW1lcmFDbWRUaHJlYWQuY3BwCisrKyBiL1FDYW1lcmEyL3V0aWwvUUNhbWVyYUNtZFRocmVhZC5jcHAKQEAgLTcyLDYgKzcyLDcgQEAKICAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogUUNhbWVyYUNtZFRocmVhZDo6flFDYW1lcmFDbWRUaHJlYWQoKQogeworICAgIGV4aXQoKTsKICAgICBjYW1fc2VtX2Rlc3Ryb3koJnN5bmNfc2VtKTsKICAgICBjYW1fc2VtX2Rlc3Ryb3koJmNtZF9zZW0pOwogfQpkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhQ21kVGhyZWFkLmggYi9RQ2FtZXJhMi91dGlsL1FDYW1lcmFDbWRUaHJlYWQuaAppbmRleCBiMDc2NGI2Li4wMGFhZWM5IDEwMDY0NAotLS0gYS9RQ2FtZXJhMi91dGlsL1FDYW1lcmFDbWRUaHJlYWQuaAorKysgYi9RQ2FtZXJhMi91dGlsL1FDYW1lcmFDbWRUaHJlYWQuaApAQCAtNDcsNiArNDcsNyBAQAogICAgIENBTUVSQV9DTURfVFlQRV9TVE9QX0RBVEFfUFJPQywKICAgICBDQU1FUkFfQ01EX1RZUEVfRE9fTkVYVF9KT0IsCiAgICAgQ0FNRVJBX0NNRF9UWVBFX0VYSVQsCisgICAgQ0FNRVJBX0NNRF9UWVBFX1RJTUVPVVQsCiAgICAgQ0FNRVJBX0NNRF9UWVBFX01BWAogfSBjYW1lcmFfY21kX3R5cGVfdDsKIApkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhQ29tbW9uLmNwcCBiL1FDYW1lcmEyL3V0aWwvUUNhbWVyYUNvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjMjY1NAotLS0gL2Rldi9udWxsCisrKyBiL1FDYW1lcmEyL3V0aWwvUUNhbWVyYUNvbW1vbi5jcHAKQEAgLTAsMCArMSwyMjYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYUNvbW1vbiIKKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiUUNhbWVyYUNvbW1vbi5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhQ29tbW9uCisgKgorICogREVTQ1JJUFRJT046IGRlZmF1bHQgY29uc3RydWN0b3Igb2YgUUNhbWVyYUNvbW1vbgorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYUNvbW1vbjo6UUNhbWVyYUNvbW1vbigpIDoKKyAgICBtX3BDYXBhYmlsaXR5KE5VTEwpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogflFDYW1lcmFDb21tb24KKyAqCisgKiBERVNDUklQVElPTjogZGVzdHJ1Y3RvciBvZiBRQ2FtZXJhQ29tbW9uCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhQ29tbW9uOjp+UUNhbWVyYUNvbW1vbigpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW5pdAorICoKKyAqIERFU0NSSVBUSU9OOiBJbml0IGZ1bmN0aW9uIGZvciBRQ2FtZXJhQ29tbW9uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwQ2FwYWJpbGl0eSA6IENhcGFiaWxpdGllcworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYUNvbW1vbjo6aW5pdChjYW1fY2FwYWJpbGl0eV90ICpwQ2FwYWJpbGl0eSkKK3sKKyAgICBtX3BDYXBhYmlsaXR5ID0gcENhcGFiaWxpdHk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2FsY3VsYXRlTENNCisgKgorICogREVTQ1JJUFRJT046IEdldCB0aGUgTENNIG9mIDIgbnVtYmVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbnVtMSAgIDogRmlyc3QgbnVtYmVyCisgKiAgIEBudW0yICAgOiBzZWNvbmQgbnVtYmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSAoTENNKQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgUUNhbWVyYUNvbW1vbjo6Y2FsY3VsYXRlTENNKGludDMyX3QgbnVtMSwgaW50MzJfdCBudW0yKQoreworICAgdWludDMyX3QgbGNtID0gMDsKKyAgIHVpbnQzMl90IHRlbXAgPSAwOworCisgICBpZiAoKG51bTEgPCAxKSAmJiAobnVtMiA8IDEpKSB7CisgICAgICAgcmV0dXJuIDA7CisgICB9IGVsc2UgaWYgKG51bTEgPCAxKSB7CisgICAgICAgcmV0dXJuIG51bTI7CisgICB9IGVsc2UgaWYgKG51bTIgPCAxKSB7CisgICAgICAgcmV0dXJuIG51bTE7CisgICB9CisKKyAgIGlmIChudW0xID4gbnVtMikgeworICAgICAgIGxjbSA9IG51bTE7CisgICB9IGVsc2UgeworICAgICAgIGxjbSA9IG51bTI7CisgICB9CisgICB0ZW1wID0gbGNtOworCisgICB3aGlsZSAoMSkgeworICAgICAgIGlmICgoKGxjbSAlIG51bTEpID09IDApICYmICgobGNtICUgbnVtMikgPT0gMCkpIHsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICAgIGxjbSArPSB0ZW1wOworICAgfQorICAgcmV0dXJuIGxjbTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRBbmFseXNpc0luZm8KKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSBBbmFseXNpcyBpbmZvcm1hdGlvbiBiYXNlZCBvbgorICogICAgIGN1cnJlbnQgbW9kZSBhbmQgZmVhdHVyZSBtYXNrCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmZFZpZGVvRW5hYmxlZCA6IFdoZXRoZXIgZmRWaWRlbyBlbmFibGVkIGN1cnJlbnRseQorICogICBAaGFsMyAgICAgICAgICAgOiBXaGV0aGVyIGhhbDMgb3IgaGFsMQorICogICBAZmVhdHVyZU1hc2sgICAgOiBGZWF0dXJlIG1hc2sKKyAqICAgQHBBbmFseXNpc19pbmZvIDogQW5hbHlzaXMgaW5mbyB0byBiZSBmaWxsZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFDb21tb246OmdldEFuYWx5c2lzSW5mbygKKyAgICAgICAgYm9vbCBmZFZpZGVvRW5hYmxlZCwKKyAgICAgICAgYm9vbCBoYWwzLAorICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgZmVhdHVyZU1hc2ssCisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3QgKnBBbmFseXNpc0luZm8pCit7CisgICAgaWYgKCFwQW5hbHlzaXNJbmZvKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcEFuYWx5c2lzSW5mby0+dmFsaWQgPSAwOworCisgICAgaWYgKChmZFZpZGVvRW5hYmxlZCA9PSBUUlVFKSAmJiAoaGFsMyA9PSBGQUxTRSkgJiYKKyAgICAgICAgICAgIChtX3BDYXBhYmlsaXR5LT5hbmFseXNpc19pbmZvW0NBTV9BTkFMWVNJU19JTkZPX0ZEX1ZJREVPXS5od19hbmFseXNpc19zdXBwb3J0ZWQpICYmCisgICAgICAgICAgICAobV9wQ2FwYWJpbGl0eS0+YW5hbHlzaXNfaW5mb1tDQU1fQU5BTFlTSVNfSU5GT19GRF9WSURFT10udmFsaWQpKSB7CisgICAgICAgICpwQW5hbHlzaXNJbmZvID0KKyAgICAgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5hbmFseXNpc19pbmZvW0NBTV9BTkFMWVNJU19JTkZPX0ZEX1ZJREVPXTsKKyAgICB9IGVsc2UgaWYgKG1fcENhcGFiaWxpdHktPmFuYWx5c2lzX2luZm9bQ0FNX0FOQUxZU0lTX0lORk9fRkRfU1RJTExdLnZhbGlkKSB7CisgICAgICAgICpwQW5hbHlzaXNJbmZvID0KKyAgICAgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5hbmFseXNpc19pbmZvW0NBTV9BTkFMWVNJU19JTkZPX0ZEX1NUSUxMXTsKKyAgICAgICAgaWYgKGhhbDMgPT0gVFJVRSkgeworICAgICAgICAgICAgcEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfbWF4X3JlcyA9IHBBbmFseXNpc0luZm8tPmFuYWx5c2lzX3JlY29tbWVuZGVkX3JlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmVhdHVyZU1hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX1BBQUYpICYmCisgICAgICAobV9wQ2FwYWJpbGl0eS0+YW5hbHlzaXNfaW5mb1tDQU1fQU5BTFlTSVNfSU5GT19QQUFGXS52YWxpZCkpIHsKKyAgICAgICAgY2FtX2FuYWx5c2lzX2luZm9fdCAqcFBhYWZJbmZvID0KKyAgICAgICAgICAmbV9wQ2FwYWJpbGl0eS0+YW5hbHlzaXNfaW5mb1tDQU1fQU5BTFlTSVNfSU5GT19QQUFGXTsKKworICAgICAgICBpZiAoIXBBbmFseXNpc0luZm8tPnZhbGlkKSB7CisgICAgICAgICAgICAqcEFuYWx5c2lzSW5mbyA9ICpwUGFhZkluZm87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19tYXhfcmVzLndpZHRoID0KKyAgICAgICAgICAgICAgICBNQVgocEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfbWF4X3Jlcy53aWR0aCwKKyAgICAgICAgICAgICAgICBwUGFhZkluZm8tPmFuYWx5c2lzX21heF9yZXMud2lkdGgpOworICAgICAgICAgICAgcEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfbWF4X3Jlcy5oZWlnaHQgPQorICAgICAgICAgICAgICAgIE1BWChwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19tYXhfcmVzLmhlaWdodCwKKyAgICAgICAgICAgICAgICBwUGFhZkluZm8tPmFuYWx5c2lzX21heF9yZXMuaGVpZ2h0KTsKKyAgICAgICAgICAgIHBBbmFseXNpc0luZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5oZWlnaHRfcGFkZGluZyA9CisgICAgICAgICAgICAgICAgY2FsY3VsYXRlTENNKHBBbmFseXNpc0luZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5oZWlnaHRfcGFkZGluZywKKyAgICAgICAgICAgICAgICBwUGFhZkluZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5oZWlnaHRfcGFkZGluZyk7CisgICAgICAgICAgICBwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8ud2lkdGhfcGFkZGluZyA9CisgICAgICAgICAgICAgICAgY2FsY3VsYXRlTENNKHBBbmFseXNpc0luZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby53aWR0aF9wYWRkaW5nLAorICAgICAgICAgICAgICAgIHBQYWFmSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLndpZHRoX3BhZGRpbmcpOworICAgICAgICAgICAgcEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLnBsYW5lX3BhZGRpbmcgPQorICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUxDTShwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8ucGxhbmVfcGFkZGluZywKKyAgICAgICAgICAgICAgICBwUGFhZkluZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgICAgIHBBbmFseXNpc0luZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5taW5fc3RyaWRlID0KKyAgICAgICAgICAgICAgICBNQVgocEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLm1pbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgcFBhYWZJbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8ubWluX3N0cmlkZSk7CisgICAgICAgICAgICBwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8ubWluX3N0cmlkZSA9CisgICAgICAgICAgICAgICAgQUxJR04ocEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLm1pbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgcEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLndpZHRoX3BhZGRpbmcpOworCisgICAgICAgICAgICBwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8ubWluX3NjYW5saW5lID0KKyAgICAgICAgICAgICAgICBNQVgocEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLm1pbl9zY2FubGluZSwKKyAgICAgICAgICAgICAgICBwUGFhZkluZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5taW5fc2NhbmxpbmUpOworICAgICAgICAgICAgcEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLm1pbl9zY2FubGluZSA9CisgICAgICAgICAgICAgICAgQUxJR04ocEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLm1pbl9zY2FubGluZSwKKyAgICAgICAgICAgICAgICBwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8uaGVpZ2h0X3BhZGRpbmcpOworCisgICAgICAgICAgICBwQW5hbHlzaXNJbmZvLT5od19hbmFseXNpc19zdXBwb3J0ZWQgfD0KKyAgICAgICAgICAgICAgICBwUGFhZkluZm8tPmh3X2FuYWx5c2lzX3N1cHBvcnRlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwQW5hbHlzaXNJbmZvLT52YWxpZCA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworfQorCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQpkaWZmIC0tZ2l0IGEvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhQ29tbW9uLmggYi9RQ2FtZXJhMi91dGlsL1FDYW1lcmFDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDRiMDg3Ci0tLSAvZGV2L251bGwKKysrIGIvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhQ29tbW9uLmgKQEAgLTAsMCArMSw2MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1FDQU1FUkFfQ09NTU9OX0hfXworI2RlZmluZSBfX1FDQU1FUkFfQ09NTU9OX0hfXworCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiY2FtX3R5cGVzLmgiCisjaW5jbHVkZSAiY2FtX2ludGYuaCIKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisjZGVmaW5lIEFMSUdOKGEsIGIpICgoKGEpICsgKGIpKSAmIH4oYikpCisjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorCitjbGFzcyBRQ2FtZXJhQ29tbW9uIHsKK3B1YmxpYzoKKyAgICBRQ2FtZXJhQ29tbW9uKCk7CisgICAgflFDYW1lcmFDb21tb24oKTsKKworICAgIGludDMyX3QgaW5pdChjYW1fY2FwYWJpbGl0eV90ICpjYXApOworCisgICAgaW50MzJfdCBnZXRBbmFseXNpc0luZm8oCisgICAgICAgIGJvb2wgZmRWaWRlb0VuYWJsZWQsIGJvb2wgaGFsMywgY2FtX2ZlYXR1cmVfbWFza190IGZlYXR1cmVNYXNrLAorICAgICAgICBjYW1fYW5hbHlzaXNfaW5mb190ICpwQW5hbHlzaXNJbmZvKTsKKyAgICBzdGF0aWMgdWludDMyX3QgY2FsY3VsYXRlTENNKGludDMyX3QgbnVtMSwgaW50MzJfdCBudW0yKTsKKworcHJpdmF0ZToKKyAgICBjYW1fY2FwYWJpbGl0eV90ICptX3BDYXBhYmlsaXR5OworCit9OworCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQorI2VuZGlmIC8qIF9fUUNBTUVSQV9DT01NT05fSF9fICovCisKZGlmZiAtLWdpdCBhL1FDYW1lcmEyL3V0aWwvUUNhbWVyYVBlcmYuaCBiL1FDYW1lcmEyL3V0aWwvUUNhbWVyYVBlcmYuaAppbmRleCAwMDk2MTM5Li5hNTk3OGRhIDEwMDY0NAotLS0gYS9RQ2FtZXJhMi91dGlsL1FDYW1lcmFQZXJmLmgKKysrIGIvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhUGVyZi5oCkBAIC02Nyw3ICs2Nyw2IEBACiAgICAgYm9vbCAgICBpc1RpbWVyUmVzZXQoKTsKICAgICB2b2lkICAgIHBvd2VySGludEludGVybmFsKHBvd2VyX2hpbnRfdCBoaW50LCBib29sIGVuYWJsZSk7CiAgICAgdm9pZCAgICBwb3dlckhpbnQocG93ZXJfaGludF90IGhpbnQsIGJvb2wgZW5hYmxlKTsKLSAgICBib29sICAgIGlzUGVyZkxvY2tUaW1lZEFjcXVpcmVkKCkgeyByZXR1cm4gKDAgPD0gbVBlcmZMb2NrSGFuZGxlVGltZWQpOyB9CiAKIHByaXZhdGU6CiAgICAgaW50MzJfdCAgICAgICAgKCpwZXJmX2xvY2tfYWNxKShpbnQsIGludCwgaW50W10sIGludCk7CmRpZmYgLS1naXQgYS9tbS1pbWFnZS1jb2RlYy9xb214X2NvcmUvQW5kcm9pZC5tayBiL21tLWltYWdlLWNvZGVjL3FvbXhfY29yZS9BbmRyb2lkLm1rCmluZGV4IGZhNzI0MmIuLjkxMDhjMmMgMTAwNjQ0Ci0tLSBhL21tLWltYWdlLWNvZGVjL3FvbXhfY29yZS9BbmRyb2lkLm1rCisrKyBiL21tLWltYWdlLWNvZGVjL3FvbXhfY29yZS9BbmRyb2lkLm1rCkBAIC0yMCw3ICsyMCw3IEBACiAKIExPQ0FMX01PRFVMRSAgICAgICAgICAgOj0gbGlicW9teF9jb3JlCiBMT0NBTF9QUkVMSU5LX01PRFVMRSAgIDo9IGZhbHNlCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJkbAorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cgbGliY3V0aWxzIGxpYmRsCiAKIExPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9DbGVhblNwZWMubWsgYi9tc21jb2JhbHQvQ2xlYW5TcGVjLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiODZhZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvQ2xlYW5TcGVjLm1rCkBAIC0wLDAgKzEsNDcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgSWYgeW91IGRvbid0IG5lZWQgdG8gZG8gYSBmdWxsIGNsZWFuIGJ1aWxkIGJ1dCB3b3VsZCBsaWtlIHRvIHRvdWNoCisjIGEgZmlsZSBvciBkZWxldGUgc29tZSBpbnRlcm1lZGlhdGUgZmlsZXMsIGFkZCBhIGNsZWFuIHN0ZXAgdG8gdGhlIGVuZAorIyBvZiB0aGUgbGlzdC4gIFRoZXNlIHN0ZXBzIHdpbGwgb25seSBiZSBydW4gb25jZSwgaWYgdGhleSBoYXZlbid0IGJlZW4KKyMgcnVuIGJlZm9yZS4KKyMKKyMgRS5nLjoKKyMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgdG91Y2ggLWMgZXh0ZXJuYWwvc3FsaXRlL3NxbGl0ZTMuaCkKKyMgICAgICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL29iai9TVEFUSUNfTElCUkFSSUVTL2xpYnpfaW50ZXJtZWRpYXRlcykKKyMKKyMgQWx3YXlzIHVzZSAidG91Y2ggLWMiIGFuZCAicm0gLWYiIG9yICJybSAtcmYiIHRvIGdyYWNlZnVsbHkgZGVhbCB3aXRoCisjIGZpbGVzIHRoYXQgYXJlIG1pc3Npbmcgb3IgaGF2ZSBiZWVuIG1vdmVkLgorIworIyBVc2UgJChQUk9EVUNUX09VVCkgdG8gZ2V0IHRvIHRoZSAib3V0L3RhcmdldC9wcm9kdWN0L2JsYWgvIiBkaXJlY3RvcnkuCisjIFVzZSAkKE9VVF9ESVIpIHRvIHJlZmVyIHRvIHRoZSAib3V0IiBkaXJlY3RvcnkuCisjCisjIElmIHlvdSBuZWVkIHRvIHJlLWRvIHNvbWV0aGluZyB0aGF0J3MgYWxyZWFkeSBtZW50aW9uZWQsIGp1c3QgY29weQorIyB0aGUgY29tbWFuZCBhbmQgYWRkIGl0IHRvIHRoZSBib3R0b20gb2YgdGhlIGxpc3QuICBFLmcuLCBpZiBhIGNoYW5nZQorIyB0aGF0IHlvdSBtYWRlIGxhc3Qgd2VlayByZXF1aXJlZCB0b3VjaGluZyBhIGZpbGUgYW5kIGEgY2hhbmdlIHlvdQorIyBtYWRlIHRvZGF5IHJlcXVpcmVzIHRvdWNoaW5nIHRoZSBzYW1lIGZpbGUsIGp1c3QgY29weSB0aGUgb2xkCisjIHRvdWNoIHN0ZXAgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorIworIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgTkVXRVIgQ0xFQU4gU1RFUFMgTVVTVCBCRSBBVCBUSEUgRU5EIE9GIFRIRSBMSVNUCisjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjIEZvciBleGFtcGxlOgorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9BbmRyb2lkVGVzdHNfaW50ZXJtZWRpYXRlcykKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIHJtIC1yZiAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2NvcmVfaW50ZXJtZWRpYXRlcykKKyMkKGNhbGwgYWRkLWNsZWFuLXN0ZXAsIGZpbmQgJChPVVRfRElSKSAtdHlwZSBmIC1uYW1lICJJR1RhbGtTZXNzaW9uKiIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1mKQorIyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL2RhdGEvKikKKworJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBmaW5kICQoT1VUX0RJUikgLW5hbWUgImNhbWVyYS5tc204OTYwKiIgLXByaW50MCB8IHhhcmdzIC0wIHJtIC1yZikKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9NT0RVTEVfTElDRU5TRV9CU0QgYi9tc21jb2JhbHQvTU9EVUxFX0xJQ0VOU0VfQlNECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvTU9EVUxFX0xJQ0VOU0VfQlNECmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvQW5kcm9pZC5tayBiL21zbWNvYmFsdC9RQ2FtZXJhMi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNzhjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDEzMyBAQAoraWZuZXEgKCwkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgYXJtIGFybTY0KSkKKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9DT1BZX0hFQURFUlNfVE8gOj0gcWNvbS9jYW1lcmEKK0xPQ0FMX0NPUFlfSEVBREVSUyA6PSBRQ2FtZXJhRm9ybWF0LmgKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAgICAgdXRpbC9RQ2FtZXJhQnVmZmVyTWFwcy5jcHAgXAorICAgICAgICB1dGlsL1FDYW1lcmFDbWRUaHJlYWQuY3BwIFwKKyAgICAgICAgdXRpbC9RQ2FtZXJhRmxhc2guY3BwIFwKKyAgICAgICAgdXRpbC9RQ2FtZXJhUGVyZi5jcHAgXAorICAgICAgICB1dGlsL1FDYW1lcmFRdWV1ZS5jcHAgXAorICAgICAgICB1dGlsL1FDYW1lcmFDb21tb24uY3BwIFwKKyAgICAgICAgUUNhbWVyYTJIYWwuY3BwIFwKKyAgICAgICAgUUNhbWVyYTJGYWN0b3J5LmNwcAorCisjSEFMIDMuMCBzb3VyY2UKK0xPQ0FMX1NSQ19GSUxFUyArPSBcCisgICAgICAgIEhBTDMvUUNhbWVyYTNIV0kuY3BwIFwKKyAgICAgICAgSEFMMy9RQ2FtZXJhM01lbS5jcHAgXAorICAgICAgICBIQUwzL1FDYW1lcmEzU3RyZWFtLmNwcCBcCisgICAgICAgIEhBTDMvUUNhbWVyYTNDaGFubmVsLmNwcCBcCisgICAgICAgIEhBTDMvUUNhbWVyYTNWZW5kb3JUYWdzLmNwcCBcCisgICAgICAgIEhBTDMvUUNhbWVyYTNQb3N0UHJvYy5jcHAgXAorICAgICAgICBIQUwzL1FDYW1lcmEzQ3JvcFJlZ2lvbk1hcHBlci5jcHAgXAorICAgICAgICBIQUwzL1FDYW1lcmEzU3RyZWFtTWVtLmNwcAorCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCisKKyNIQUwgMS4wIHNvdXJjZQorCitpZmVxICgkKFRBUkdFVF9TVVBQT1JUX0hBTDEpLGZhbHNlKQorTE9DQUxfQ0ZMQUdTICs9IC1EUUNBTUVSQV9IQUwzX1NVUFBPUlQKK2Vsc2UKK0xPQ0FMX0NGTEFHUyArPSAtRFFDQU1FUkFfSEFMMV9TVVBQT1JUCitMT0NBTF9TUkNfRklMRVMgKz0gXAorICAgICAgICBIQUwvUUNhbWVyYTJIV0kuY3BwIFwKKyAgICAgICAgSEFML1FDYW1lcmFNdXhlci5jcHAgXAorICAgICAgICBIQUwvUUNhbWVyYU1lbS5jcHAgXAorICAgICAgICBIQUwvUUNhbWVyYVN0YXRlTWFjaGluZS5jcHAgXAorICAgICAgICB1dGlsL1FDYW1lcmFEaXNwbGF5LmNwcCBcCisgICAgICAgIEhBTC9RQ2FtZXJhQ2hhbm5lbC5jcHAgXAorICAgICAgICBIQUwvUUNhbWVyYVN0cmVhbS5jcHAgXAorICAgICAgICBIQUwvUUNhbWVyYVBvc3RQcm9jLmNwcCBcCisgICAgICAgIEhBTC9RQ2FtZXJhMkhXSUNhbGxiYWNrcy5jcHAgXAorICAgICAgICBIQUwvUUNhbWVyYVBhcmFtZXRlcnMuY3BwIFwKKyAgICAgICAgSEFML1FDYW1lcmFQYXJhbWV0ZXJzSW50Zi5jcHAgXAorICAgICAgICBIQUwvUUNhbWVyYVRoZXJtYWxBZGFwdGVyLmNwcAorZW5kaWYKKworIyBTeXN0ZW0gaGVhZGVyIGZpbGUgcGF0aCBwcmVmaXgKK0xPQ0FMX0NGTEFHUyArPSAtRFNZU1RFTV9IRUFERVJfUFJFRklYPXN5cworCitMT0NBTF9DRkxBR1MgKz0gLURIQVNfTVVMVElNRURJQV9ISU5UUyAtRF9BTkRST0lECisKK2lmZXEgKCQoVEFSR0VUX1VTRVNfQU9TUCksdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFZBTklMTEFfSEFMCitlbmRpZgorCitpZmVxICgxLCQoZmlsdGVyIDEsJChzaGVsbCBlY2hvICIkJCgoICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pIDw9IDIzICkpIiApKSkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9IQUxfM18zCitlbmRpZgorCisjdXNlIG1lZGlhIGV4dGVuc2lvbgoraWZlcSAoJChUQVJHRVRfVVNFU19NRURJQV9FWFRFTlNJT05TKSwgdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9NRURJQV9FWFRFTlNJT05TCitlbmRpZgorCitMT0NBTF9DRkxBR1MgKz0gLXN0ZD1jKysxMSAtc3RkPWdudSsrMHgKKyNIQUwgMS4wIEZsYWdzCitMT0NBTF9DRkxBR1MgKz0gLURERUZBVUxUX0RFTk9JU0VfTU9ERV9PTiAtREhBTDMgLURRQ0FNRVJBX1JFREVGSU5FX0xPRworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9tbS1pbWFnZS1jb2RlYy9xZXhpZiBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vbW0taW1hZ2UtY29kZWMvcW9teF9jb3JlIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9zdGFjay9jb21tb24gXAorICAgICAgICAkKExPQ0FMX1BBVEgpL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2UvaW5jIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS91dGlsIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9IQUwzIFwKKyAgICAgICAgaGFyZHdhcmUvbGliaGFyZHdhcmUvaW5jbHVkZS9oYXJkd2FyZSBcCisgICAgICAgICQoU1JDX01FRElBX0hBTF9ESVIpL2xpYnN0YWdlZnJpZ2h0aHcgXAorICAgICAgICAkKFNSQ19NRURJQV9IQUxfRElSKS9tbS1jb3JlL2luYyBcCisgICAgICAgIHN5c3RlbS9jb3JlL2luY2x1ZGUvY3V0aWxzIFwKKyAgICAgICAgc3lzdGVtL2NvcmUvaW5jbHVkZS9zeXN0ZW0gXAorICAgICAgICBzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUvc3lzdGVtCisKKyNIQUwgMS4wIEluY2x1ZGUgcGF0aHMKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICAgICBoYXJkd2FyZS9xY29tL2NhbWVyYS9RQ2FtZXJhMi9IQUwKKworaWZlcSAoJChUQVJHRVRfQ09NUElMRV9XSVRIX01TTV9LRVJORUwpLHRydWUpCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoVEFSR0VUX09VVF9JTlRFUk1FRElBVEVTKS9LRVJORUxfT0JKL3Vzci9pbmNsdWRlCitMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvS0VSTkVMX09CSi91c3IKK2VuZGlmCitpZmVxICgkKFRBUkdFVF9UU19NQUtFVVApLHRydWUpCitMT0NBTF9DRkxBR1MgKz0gLURUQVJHRVRfVFNfTUFLRVVQCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvSEFML3RzTWFrZXVwbGliL2luY2x1ZGUKK2VuZGlmCitpZm5lcSAoLCQoZmlsdGVyIG1zbTg5NzQgbXNtODkxNiBtc204MjI2IG1zbTg2MTAgbXNtODkxNiBhcHE4MDg0IG1zbTgwODQgbXNtODk5NCBtc204OTkyIG1zbTg5NTIgbXNtODkzNyBtc204OTUzIG1zbTg5OTYgbXNtY29iYWx0IG1zbWZhbGNvbiwgJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pKSkKKyAgICBMT0NBTF9DRkxBR1MgKz0gLURWRU5VU19QUkVTRU5UCitlbmRpZgorCitpZm5lcSAoLCQoZmlsdGVyIG1zbTg5OTYgbXNtY29iYWx0IG1zbWZhbGNvbiwkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpKQorICAgIExPQ0FMX0NGTEFHUyArPSAtRFVCV0NfUFJFU0VOVAorZW5kaWYKKworI0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlicWNhbWVyYTJfdXRpbAorTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9tbS1jb3JlL29teGNvcmUgXAorICAgICAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvcWNvbS9kaXNwbGF5CitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAgICAgaGFyZHdhcmUvcWNvbS9kaXNwbGF5L2xpYnFzZXJ2aWNlCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmNhbWVyYV9jbGllbnQgbGlibG9nIGxpYmhhcmR3YXJlIGxpYnV0aWxzIGxpYmN1dGlscyBsaWJkbCBsaWJzeW5jIGxpYmd1aQorTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJtbWNhbWVyYV9pbnRlcmZhY2UgbGlibW1qcGVnX2ludGVyZmFjZSBsaWJ1aSBsaWJjYW1lcmFfbWV0YWRhdGEKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlicWRNZXRhRGF0YSBsaWJxc2VydmljZSBsaWJiaW5kZXIKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliY3V0aWxzIGxpYmRsCitpZmVxICgkKFRBUkdFVF9UU19NQUtFVVApLHRydWUpCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYnRzX2ZhY2VfYmVhdXRpZnlfaGFsIGxpYnRzX2RldGVjdGVkX2ZhY2VfaGFsCitlbmRpZgorCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBodworTE9DQUxfTU9EVUxFIDo9IGNhbWVyYS4kKFRBUkdFVF9CT0FSRF9QTEFURk9STSkKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9ICQoQk9BUkRfUVRJX0NBTUVSQV8zMkJJVF9PTkxZKQoraW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCitpbmNsdWRlICQoY2FsbCBmaXJzdC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKK2VuZGlmCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmEySFdJLmNwcCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYTJIV0kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjc3MzYKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmEySFdJLmNwcApAQCAtMCwwICsxLDEwNTMzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYTJIV0kiCisKKy8vIFRvIHJlbW92ZQorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKy8vIFN5c3RlbSBkZWZpbml0aW9ucworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJncmFsbG9jX3ByaXYuaCIKKyNpbmNsdWRlICJuYXRpdmVfaGFuZGxlLmgiCisKKy8vIENhbWVyYSBkZWZpbml0aW9ucworI2luY2x1ZGUgImFuZHJvaWQvUUNhbWVyYTJFeHRlcm5hbC5oIgorI2luY2x1ZGUgIlFDYW1lcmEySFdJLmgiCisjaW5jbHVkZSAiUUNhbWVyYUJ1ZmZlck1hcHMuaCIKKyNpbmNsdWRlICJRQ2FtZXJhRmxhc2guaCIKKyNpbmNsdWRlICJRQ2FtZXJhVHJhY2UuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorfQorCisjZGVmaW5lIE1BUF9UT19EUklWRVJfQ09PUkRJTkFURSh2YWwsIGJhc2UsIHNjYWxlLCBvZmZzZXQpIFwKKyAgICAoKGludDMyX3QpdmFsICogKGludDMyX3Qpc2NhbGUgLyAoaW50MzJfdCliYXNlICsgKGludDMyX3Qpb2Zmc2V0KQorI2RlZmluZSBDQU1FUkFfTUlOX1NUUkVBTUlOR19CVUZGRVJTICAgICAzCisjZGVmaW5lIEVYVFJBX1pTTF9QUkVWSUVXX1NUUkVBTV9CVUYgICAgIDIKKyNkZWZpbmUgQ0FNRVJBX01JTl9KUEVHX0VOQ09ESU5HX0JVRkZFUlMgMgorI2RlZmluZSBDQU1FUkFfTUlOX1ZJREVPX0JVRkZFUlMgICAgICAgICA5CisjZGVmaW5lIENBTUVSQV9NSU5fQ0FMTEJBQ0tfQlVGRkVSUyAgICAgIDUKKyNkZWZpbmUgQ0FNRVJBX0xPTkdTSE9UX1NUQUdFUyAgICAgICAgICAgNAorI2RlZmluZSBDQU1FUkFfTUlOX0NBTUVSQV9CQVRDSF9CVUZGRVJTICA2CisjZGVmaW5lIENBTUVSQV9JU1BfUElOR19QT05HX0JVRkZFUlMgICAgIDIKKyNkZWZpbmUgTUlOX1VOREVRVUVVRURfQlVGRkVSUyAgICAgICAgICAgMSAvLyBUaGlzIGlzIHJlcXVpcmVkIGlmIHByZXZpZXcgd2luZG93IGlzIG5vdCBzZXQKKworI2RlZmluZSBIRFJfQ09ORklERU5DRV9USFJFU0hPTEQgMC40CisKKyNkZWZpbmUgQ0FNRVJBX09QRU5fUEVSRl9USU1FX09VVCA1MDAgLy8gNTAwIG1pbGxpc2Vjb25kcworCisvLyBWZXJ5IGxvbmcgd2FpdCwganVzdCB0byBiZSBzdXJlIHdlIGRvbid0IGRlYWRsb2NrCisjZGVmaW5lIENBTUVSQV9ERUZFUlJFRF9USFJFQURfVElNRU9VVCA1MDAwMDAwMDAwIC8vIDUgc2Vjb25kcworI2RlZmluZSBDQU1FUkFfREVGRVJSRURfTUFQX0JVRl9USU1FT1VUIDIwMDAwMDAwMDAgLy8gMiBzZWNvbmRzCisjZGVmaW5lIENBTUVSQV9NSU5fTUVUQURBVEFfQlVGRkVSUyAxMCAvLyBOZWVkIGF0IGxlYXN0IDEwIGZvciBaU0wgc25hcHNob3QKKyNkZWZpbmUgQ0FNRVJBX0lOSVRJQUxfTUFQUEFCTEVfUFJFVklFV19CVUZGRVJTIDUKKyNkZWZpbmUgQ0FNRVJBX01BWF9QQVJBTV9BUFBMWV9ERUxBWSAzCisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworZXh0ZXJuIGNhbV9jYXBhYmlsaXR5X3QgKmdDYW1DYXBhYmlsaXR5W01NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlNdOworZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCBnQ2FtTG9jazsKK3ZvbGF0aWxlIHVpbnQzMl90IGdDYW1IYWxMb2dMZXZlbCA9IDE7CitleHRlcm4gdWludDhfdCBnTnVtQ2FtZXJhU2Vzc2lvbnM7Cit1aW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzTmV4dEpvYklkID0gMTsKKworY2FtZXJhX2RldmljZV9vcHNfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjptQ2FtZXJhT3BzID0geworICAgIC5zZXRfcHJldmlld193aW5kb3cgPSAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c2V0X3ByZXZpZXdfd2luZG93LAorICAgIC5zZXRfY2FsbGJhY2tzID0gICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c2V0X0NhbGxCYWNrcywKKyAgICAuZW5hYmxlX21zZ190eXBlID0gICAgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmVuYWJsZV9tc2dfdHlwZSwKKyAgICAuZGlzYWJsZV9tc2dfdHlwZSA9ICAgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmRpc2FibGVfbXNnX3R5cGUsCisgICAgLm1zZ190eXBlX2VuYWJsZWQgPSAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjptc2dfdHlwZV9lbmFibGVkLAorCisgICAgLnN0YXJ0X3ByZXZpZXcgPSAgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzdGFydF9wcmV2aWV3LAorICAgIC5zdG9wX3ByZXZpZXcgPSAgICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c3RvcF9wcmV2aWV3LAorICAgIC5wcmV2aWV3X2VuYWJsZWQgPSAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHJldmlld19lbmFibGVkLAorICAgIC5zdG9yZV9tZXRhX2RhdGFfaW5fYnVmZmVycz0gUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c3RvcmVfbWV0YV9kYXRhX2luX2J1ZmZlcnMsCisKKyAgICAuc3RhcnRfcmVjb3JkaW5nID0gICAgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnN0YXJ0X3JlY29yZGluZywKKyAgICAuc3RvcF9yZWNvcmRpbmcgPSAgICAgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnN0b3BfcmVjb3JkaW5nLAorICAgIC5yZWNvcmRpbmdfZW5hYmxlZCA9ICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cmVjb3JkaW5nX2VuYWJsZWQsCisgICAgLnJlbGVhc2VfcmVjb3JkaW5nX2ZyYW1lID0gICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpyZWxlYXNlX3JlY29yZGluZ19mcmFtZSwKKworICAgIC5hdXRvX2ZvY3VzID0gICAgICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6YXV0b19mb2N1cywKKyAgICAuY2FuY2VsX2F1dG9fZm9jdXMgPSAgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmNhbmNlbF9hdXRvX2ZvY3VzLAorCisgICAgLnRha2VfcGljdHVyZSA9ICAgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjp0YWtlX3BpY3R1cmUsCisgICAgLmNhbmNlbF9waWN0dXJlID0gICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpjYW5jZWxfcGljdHVyZSwKKworICAgIC5zZXRfcGFyYW1ldGVycyA9ICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c2V0X3BhcmFtZXRlcnMsCisgICAgLmdldF9wYXJhbWV0ZXJzID0gICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpnZXRfcGFyYW1ldGVycywKKyAgICAucHV0X3BhcmFtZXRlcnMgPSAgICAgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnB1dF9wYXJhbWV0ZXJzLAorICAgIC5zZW5kX2NvbW1hbmQgPSAgICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c2VuZF9jb21tYW5kLAorCisgICAgLnJlbGVhc2UgPSAgICAgICAgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpyZWxlYXNlLAorICAgIC5kdW1wID0gICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6ZHVtcCwKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0X3ByZXZpZXdfd2luZG93CisgKgorICogREVTQ1JJUFRJT046IHNldCBwcmV2aWV3IHdpbmRvdy4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSAgOiBwdHIgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3QKKyAqICAgQHdpbmRvdyAgOiB3aW5kb3cgb3BzIHRhYmxlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnNldF9wcmV2aWV3X3dpbmRvdyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlLAorICAgICAgICBzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3aW5kb3cpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpodyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqPihkZXZpY2UtPnByaXYpOworICAgIGlmICghaHcpIHsKKyAgICAgICAgTE9HRSgiTlVMTCBjYW1lcmEgZGV2aWNlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIExPR0QoIkUgY2FtZXJhIGlkICVkIHdpbmRvdyA9ICVwIiwgaHctPmdldENhbWVyYUlkKCksIHdpbmRvdyk7CisKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKyAgICByYyA9IGh3LT5wcm9jZXNzQVBJKFFDQU1FUkFfU01fRVZUX1NFVF9QUkVWSUVXX1dJTkRPVywgKHZvaWQgKil3aW5kb3cpOworICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9TRVRfUFJFVklFV19XSU5ET1csICZhcGlSZXN1bHQpOworICAgICAgICByYyA9IGFwaVJlc3VsdC5zdGF0dXM7CisgICAgfQorICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICBMT0dEKCJYIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRfQ2FsbEJhY2tzCisgKgorICogREVTQ1JJUFRJT046IHNldCBjYWxsYmFja3MgZm9yIG5vdGlmeSBhbmQgZGF0YQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlICAgICA6IHB0ciB0byBjYW1lcmEgZGV2aWNlIHN0cnVjdAorICogICBAbm90aWZ5X2NiICA6IG5vdGlmeSBjYgorICogICBAZGF0YV9jYiAgICA6IGRhdGEgY2IKKyAqICAgQGRhdGFfY2JfdGltZXN0YW1wICA6IHZpZGVvIGRhdGEgY2Qgd2l0aCB0aW1lc3RhbXAKKyAqICAgQGdldF9tZW1vcnkgOiBvcHMgdGFibGUgZm9yIHJlcXVlc3QgZ3JhbGxvYyBtZW1vcnkKKyAqICAgQHVzZXIgICAgICAgOiB1c2VyIGRhdGEgcHRyCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzZXRfQ2FsbEJhY2tzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UsCisgICAgICAgIGNhbWVyYV9ub3RpZnlfY2FsbGJhY2sgbm90aWZ5X2NiLAorICAgICAgICBjYW1lcmFfZGF0YV9jYWxsYmFjayBkYXRhX2NiLAorICAgICAgICBjYW1lcmFfZGF0YV90aW1lc3RhbXBfY2FsbGJhY2sgZGF0YV9jYl90aW1lc3RhbXAsCisgICAgICAgIGNhbWVyYV9yZXF1ZXN0X21lbW9yeSBnZXRfbWVtb3J5LAorICAgICAgICB2b2lkICp1c2VyKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHcgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKj4oZGV2aWNlLT5wcml2KTsKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExPR0QoIkUgY2FtZXJhIGlkICVkIiwgaHctPmdldENhbWVyYUlkKCkpOworCisgICAgcWNhbWVyYV9zbV9ldnRfc2V0Y2JfcGF5bG9hZF90IHBheWxvYWQ7CisgICAgcGF5bG9hZC5ub3RpZnlfY2IgPSBub3RpZnlfY2I7CisgICAgcGF5bG9hZC5kYXRhX2NiID0gZGF0YV9jYjsKKyAgICBwYXlsb2FkLmRhdGFfY2JfdGltZXN0YW1wID0gZGF0YV9jYl90aW1lc3RhbXA7CisgICAgcGF5bG9hZC5nZXRfbWVtb3J5ID0gZ2V0X21lbW9yeTsKKyAgICBwYXlsb2FkLnVzZXIgPSB1c2VyOworCisgICAgaHctPmxvY2tBUEkoKTsKKyAgICBxY2FtZXJhX2FwaV9yZXN1bHRfdCBhcGlSZXN1bHQ7CisgICAgaW50MzJfdCByYyA9IGh3LT5wcm9jZXNzQVBJKFFDQU1FUkFfU01fRVZUX1NFVF9DQUxMQkFDS1MsICh2b2lkICopJnBheWxvYWQpOworICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9TRVRfQ0FMTEJBQ0tTLCAmYXBpUmVzdWx0KTsKKyAgICB9CisgICAgaHctPnVubG9ja0FQSSgpOworICAgIExPR0QoIlggY2FtZXJhIGlkICVkIiwgaHctPmdldENhbWVyYUlkKCkpOworCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZW5hYmxlX21zZ190eXBlCisgKgorICogREVTQ1JJUFRJT046IGVuYWJsZSBjZXJ0YWluIG1zZyB0eXBlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgICAgIDogcHRyIHRvIGNhbWVyYSBkZXZpY2Ugc3RydWN0CisgKiAgIEBtc2dfdHlwZSAgIDogbXNnIHR5cGUgbWFzaworICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6ZW5hYmxlX21zZ190eXBlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UsIGludDMyX3QgbXNnX3R5cGUpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpodyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqPihkZXZpY2UtPnByaXYpOworICAgIGlmICghaHcpIHsKKyAgICAgICAgTE9HRSgiTlVMTCBjYW1lcmEgZGV2aWNlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgTE9HRCgiRSBjYW1lcmEgaWQgJWQiLCBody0+Z2V0Q2FtZXJhSWQoKSk7CisKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKyAgICBpbnQzMl90IHJjID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfRU5BQkxFX01TR19UWVBFLCAodm9pZCAqKSZtc2dfdHlwZSk7CisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIGh3LT53YWl0QVBJUmVzdWx0KFFDQU1FUkFfU01fRVZUX0VOQUJMRV9NU0dfVFlQRSwgJmFwaVJlc3VsdCk7CisgICAgfQorICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICBMT0dEKCJYIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGRpc2FibGVfbXNnX3R5cGUKKyAqCisgKiBERVNDUklQVElPTjogZGlzYWJsZSBjZXJ0YWluIG1zZyB0eXBlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgICAgIDogcHRyIHRvIGNhbWVyYSBkZXZpY2Ugc3RydWN0CisgKiAgIEBtc2dfdHlwZSAgIDogbXNnIHR5cGUgbWFzaworICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6ZGlzYWJsZV9tc2dfdHlwZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlLCBpbnQzMl90IG1zZ190eXBlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHcgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKj4oZGV2aWNlLT5wcml2KTsKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExPR0QoIkUgY2FtZXJhIGlkICVkIiwgaHctPmdldENhbWVyYUlkKCkpOworCisgICAgaHctPmxvY2tBUEkoKTsKKyAgICBxY2FtZXJhX2FwaV9yZXN1bHRfdCBhcGlSZXN1bHQ7CisgICAgaW50MzJfdCByYyA9IGh3LT5wcm9jZXNzQVBJKFFDQU1FUkFfU01fRVZUX0RJU0FCTEVfTVNHX1RZUEUsICh2b2lkICopJm1zZ190eXBlKTsKKyAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaHctPndhaXRBUElSZXN1bHQoUUNBTUVSQV9TTV9FVlRfRElTQUJMRV9NU0dfVFlQRSwgJmFwaVJlc3VsdCk7CisgICAgfQorICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICBMT0dEKCJYIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1zZ190eXBlX2VuYWJsZWQKKyAqCisgKiBERVNDUklQVElPTjogaWYgY2VydGFpbiBtc2cgdHlwZSBpcyBlbmFibGVkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgICAgIDogcHRyIHRvIGNhbWVyYSBkZXZpY2Ugc3RydWN0CisgKiAgIEBtc2dfdHlwZSAgIDogbXNnIHR5cGUgbWFzaworICoKKyAqIFJFVFVSTiAgICAgOiAxIC0tIGVuYWJsZWQKKyAqICAgICAgICAgICAgICAwIC0tIG5vdCBlbmFibGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjptc2dfdHlwZV9lbmFibGVkKHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UsIGludDMyX3QgbXNnX3R5cGUpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpbnQgcmV0ID0gTk9fRVJST1I7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHcgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKj4oZGV2aWNlLT5wcml2KTsKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBMT0dEKCJFIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKworICAgIGh3LT5sb2NrQVBJKCk7CisgICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgYXBpUmVzdWx0OworICAgIHJldCA9IGh3LT5wcm9jZXNzQVBJKFFDQU1FUkFfU01fRVZUX01TR19UWVBFX0VOQUJMRUQsICh2b2lkICopJm1zZ190eXBlKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIGh3LT53YWl0QVBJUmVzdWx0KFFDQU1FUkFfU01fRVZUX01TR19UWVBFX0VOQUJMRUQsICZhcGlSZXN1bHQpOworICAgICAgICByZXQgPSBhcGlSZXN1bHQuZW5hYmxlZDsKKyAgICB9CisgICAgaHctPnVubG9ja0FQSSgpOworICAgIExPR0QoIlggY2FtZXJhIGlkICVkIiwgaHctPmdldENhbWVyYUlkKCkpOworCisgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByZXBhcmVfcHJldmlldworICoKKyAqIERFU0NSSVBUSU9OOiBwcmVwYXJlIHByZXZpZXcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSAgOiBwdHIgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHJlcGFyZV9wcmV2aWV3KHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpbnQgcmV0ID0gTk9fRVJST1I7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHcgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKj4oZGV2aWNlLT5wcml2KTsKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBMT0dIKCJbS1BJIFBlcmZdOiBFIFBST0ZJTEVfUFJFUEFSRV9QUkVWSUVXIGNhbWVyYSBpZCAlZCIsCisgICAgICAgICAgICAgaHctPmdldENhbWVyYUlkKCkpOworICAgIGh3LT5sb2NrQVBJKCk7CisgICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgYXBpUmVzdWx0OworICAgIHFjYW1lcmFfc21fZXZ0X2VudW1fdCBldnQgPSBRQ0FNRVJBX1NNX0VWVF9QUkVQQVJFX1BSRVZJRVc7CisgICAgcmV0ID0gaHctPnByb2Nlc3NBUEkoZXZ0LCBOVUxMKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIGh3LT53YWl0QVBJUmVzdWx0KGV2dCwgJmFwaVJlc3VsdCk7CisgICAgICAgIHJldCA9IGFwaVJlc3VsdC5zdGF0dXM7CisgICAgfQorICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICBMT0dIKCJbS1BJIFBlcmZdOiBYIik7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0YXJ0X3ByZXZpZXcKKyAqCisgKiBERVNDUklQVElPTjogc3RhcnQgcHJldmlldworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlICA6IHB0ciB0byBjYW1lcmEgZGV2aWNlIHN0cnVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzdGFydF9wcmV2aWV3KHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UpCit7CisgICAgS1BJX0FUUkFDRV9DQUxMKCk7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HSSgiW0tQSSBQZXJmXTogRSBQUk9GSUxFX1NUQVJUX1BSRVZJRVcgY2FtZXJhIGlkICVkIiwKKyAgICAgICAgICAgICBody0+Z2V0Q2FtZXJhSWQoKSk7CisKKyAgICAvLyBSZWxlYXNlIHRoZSB0aW1lZCBwZXJmIGxvY2sgYWNxdWlyZWQgaW4gb3BlbkNhbWVyYQorICAgIGh3LT5tX3BlcmZMb2NrLmxvY2tfcmVsX3RpbWVkKCk7CisKKyAgICBody0+bV9wZXJmTG9jay5sb2NrX2FjcSgpOworICAgIGh3LT5sb2NrQVBJKCk7CisgICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgYXBpUmVzdWx0OworICAgIHFjYW1lcmFfc21fZXZ0X2VudW1fdCBldnQgPSBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9QUkVWSUVXOworICAgIGlmIChody0+aXNOb0Rpc3BsYXlNb2RlKCkpIHsKKyAgICAgICAgZXZ0ID0gUUNBTUVSQV9TTV9FVlRfU1RBUlRfTk9ESVNQTEFZX1BSRVZJRVc7CisgICAgfQorICAgIHJldCA9IGh3LT5wcm9jZXNzQVBJKGV2dCwgTlVMTCk7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBody0+d2FpdEFQSVJlc3VsdChldnQsICZhcGlSZXN1bHQpOworICAgICAgICByZXQgPSBhcGlSZXN1bHQuc3RhdHVzOworICAgIH0KKyAgICBody0+dW5sb2NrQVBJKCk7CisgICAgaHctPm1fYlByZXZpZXdTdGFydGVkID0gdHJ1ZTsKKyAgICBMT0dJKCJbS1BJIFBlcmZdOiBYIHJldCA9ICVkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0b3BfcHJldmlldworICoKKyAqIERFU0NSSVBUSU9OOiBzdG9wIHByZXZpZXcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSAgOiBwdHIgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnN0b3BfcHJldmlldyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlKQoreworICAgIEtQSV9BVFJBQ0VfQ0FMTCgpOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMT0dJKCJbS1BJIFBlcmZdOiBFIFBST0ZJTEVfU1RPUF9QUkVWSUVXIGNhbWVyYSBpZCAlZCIsCisgICAgICAgICAgICAgaHctPmdldENhbWVyYUlkKCkpOworCisgICAgLy8gRGlzYWJsZSBwb3dlciBIaW50IGZvciBwcmV2aWV3CisgICAgaHctPm1fcGVyZkxvY2sucG93ZXJIaW50KFBPV0VSX0hJTlRfVklERU9fRU5DT0RFLCBmYWxzZSk7CisKKyAgICBody0+bV9wZXJmTG9jay5sb2NrX2FjcSgpOworICAgIGh3LT5sb2NrQVBJKCk7CisgICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgYXBpUmVzdWx0OworICAgIGludDMyX3QgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfU1RPUF9QUkVWSUVXLCBOVUxMKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIGh3LT53YWl0QVBJUmVzdWx0KFFDQU1FUkFfU01fRVZUX1NUT1BfUFJFVklFVywgJmFwaVJlc3VsdCk7CisgICAgfQorICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICBMT0dJKCJbS1BJIFBlcmZdOiBYIHJldCA9ICVkIiwgcmV0KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcmV2aWV3X2VuYWJsZWQKKyAqCisgKiBERVNDUklQVElPTjogaWYgcHJldmlldyBpcyBydW5uaW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgIDogcHRyIHRvIGNhbWVyYSBkZXZpY2Ugc3RydWN0CisgKgorICogUkVUVVJOICAgICA6IDEgLS0gcnVubmluZworICogICAgICAgICAgICAgIDAgLS0gbm90IHJ1bm5pbmcKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnByZXZpZXdfZW5hYmxlZChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HRCgiRSBjYW1lcmEgaWQgJWQiLCBody0+Z2V0Q2FtZXJhSWQoKSk7CisKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKyAgICByZXQgPSBody0+cHJvY2Vzc0FQSShRQ0FNRVJBX1NNX0VWVF9QUkVWSUVXX0VOQUJMRUQsIE5VTEwpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaHctPndhaXRBUElSZXN1bHQoUUNBTUVSQV9TTV9FVlRfUFJFVklFV19FTkFCTEVELCAmYXBpUmVzdWx0KTsKKyAgICAgICAgcmV0ID0gYXBpUmVzdWx0LmVuYWJsZWQ7CisgICAgfQorCisgICAgLy9pZiBwcmV2aWV3IGVuYWJsZWQsIGNhbiBlbmFibGUgcHJldmlldyBjYWxsYmFjayBzZW5kCisgICAgaWYoYXBpUmVzdWx0LmVuYWJsZWQpIHsKKyAgICAgICAgaHctPm1fc3RhdGVNYWNoaW5lLnNldFByZXZpZXdDYWxsYmFja05lZWRlZCh0cnVlKTsKKyAgICB9CisgICAgaHctPnVubG9ja0FQSSgpOworICAgIExPR0QoIlggY2FtZXJhIGlkICVkIiwgaHctPmdldENhbWVyYUlkKCkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdG9yZV9tZXRhX2RhdGFfaW5fYnVmZmVycworICoKKyAqIERFU0NSSVBUSU9OOiBpZiBuZWVkIHRvIHN0b3JlIG1ldGEgZGF0YSBpbiBidWZmZXJzIGZvciB2aWRlbyBmcmFtZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlICA6IHB0ciB0byBjYW1lcmEgZGV2aWNlIHN0cnVjdAorICogICBAZW5hYmxlICA6IGZsYWcgaWYgZW5hYmxlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnN0b3JlX21ldGFfZGF0YV9pbl9idWZmZXJzKAorICAgICAgICAgICAgICAgIHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UsIGludCBlbmFibGUpCit7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HRCgiRSBjYW1lcmEgaWQgJWQiLCBody0+Z2V0Q2FtZXJhSWQoKSk7CisKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKyAgICByZXQgPSBody0+cHJvY2Vzc0FQSShRQ0FNRVJBX1NNX0VWVF9TVE9SRV9NRVRBREFUQV9JTl9CVUZTLCAodm9pZCAqKSZlbmFibGUpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaHctPndhaXRBUElSZXN1bHQoUUNBTUVSQV9TTV9FVlRfU1RPUkVfTUVUQURBVEFfSU5fQlVGUywgJmFwaVJlc3VsdCk7CisgICAgICAgIHJldCA9IGFwaVJlc3VsdC5zdGF0dXM7CisgICAgfQorICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICBMT0dEKCJYIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVzdGFydF9zdGFydF9wcmV2aWV3CisgKgorICogREVTQ1JJUFRJT046IHN0YXJ0IHByZXZpZXcgYXMgcGFydCBvZiB0aGUgcmVzdGFydCBwcmV2aWV3CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgIDogcHRyIHRvIGNhbWVyYSBkZXZpY2Ugc3RydWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnJlc3RhcnRfc3RhcnRfcHJldmlldyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HSSgiRSBjYW1lcmEgaWQgJWQiLCBody0+Z2V0Q2FtZXJhSWQoKSk7CisgICAgaHctPmxvY2tBUEkoKTsKKyAgICBxY2FtZXJhX2FwaV9yZXN1bHRfdCBhcGlSZXN1bHQ7CisKKyAgICBpZiAoaHctPmdldFJlbGF0ZWRDYW1TeW5jSW5mbygpLT5zeW5jX2NvbnRyb2wgPT0gQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09OKSB7CisgICAgICAgIHJldCA9IGh3LT5wcm9jZXNzQVBJKFFDQU1FUkFfU01fRVZUX1JFU1RBUlRfU1RBUlRfUFJFVklFVywgTlVMTCk7CisgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGh3LT53YWl0QVBJUmVzdWx0KFFDQU1FUkFfU01fRVZUX1JFU1RBUlRfU1RBUlRfUFJFVklFVywgJmFwaVJlc3VsdCk7CisgICAgICAgICAgICByZXQgPSBhcGlSZXN1bHQuc3RhdHVzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiVGhpcyBmdW5jdGlvbiBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGluIHNpbmdsZS1jYW1lcmEgbW9kZSIpOworICAgICAgICByZXQgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgLy8gUHJldmlldyByZXN0YXJ0IGRvbmUsIHVwZGF0ZSB0aGUgbVByZXZpZXdSZXN0YXJ0TmVlZGVkIGZsYWcgdG8gZmFsc2UuCisgICAgaHctPm1QcmV2aWV3UmVzdGFydE5lZWRlZCA9IGZhbHNlOworICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICBMT0dJKCJYIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVzdGFydF9zdG9wX3ByZXZpZXcKKyAqCisgKiBERVNDUklQVElPTjogc3RvcCBwcmV2aWV3IGFzIHBhcnQgb2YgdGhlIHJlc3RhcnQgcHJldmlldworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlICA6IHB0ciB0byBjYW1lcmEgZGV2aWNlIHN0cnVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpyZXN0YXJ0X3N0b3BfcHJldmlldyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HSSgiRSBjYW1lcmEgaWQgJWQiLCBody0+Z2V0Q2FtZXJhSWQoKSk7CisgICAgaHctPmxvY2tBUEkoKTsKKyAgICBxY2FtZXJhX2FwaV9yZXN1bHRfdCBhcGlSZXN1bHQ7CisKKyAgICBpZiAoaHctPmdldFJlbGF0ZWRDYW1TeW5jSW5mbygpLT5zeW5jX2NvbnRyb2wgPT0gQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09OKSB7CisgICAgICAgIHJldCA9IGh3LT5wcm9jZXNzQVBJKFFDQU1FUkFfU01fRVZUX1JFU1RBUlRfU1RPUF9QUkVWSUVXLCBOVUxMKTsKKyAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaHctPndhaXRBUElSZXN1bHQoUUNBTUVSQV9TTV9FVlRfUkVTVEFSVF9TVE9QX1BSRVZJRVcsICZhcGlSZXN1bHQpOworICAgICAgICAgICAgcmV0ID0gYXBpUmVzdWx0LnN0YXR1czsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIlRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBpbiBzaW5nbGUtY2FtZXJhIG1vZGUiKTsKKyAgICAgICAgcmV0ID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaHctPnVubG9ja0FQSSgpOworICAgIExPR0koIlggY2FtZXJhIGlkICVkIiwgaHctPmdldENhbWVyYUlkKCkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcmVfc3RhcnRfcmVjb3JkaW5nCisgKgorICogREVTQ1JJUFRJT046IHByZXBhcmUgZm9yIHRoZSBzdGFydCByZWNvcmRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSAgOiBwdHIgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHJlX3N0YXJ0X3JlY29yZGluZyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HSCgiW0tQSSBQZXJmXTogRSBQUk9GSUxFX1BSRV9TVEFSVF9SRUNPUkRJTkcgY2FtZXJhIGlkICVkIiwKKyAgICAgICAgICBody0+Z2V0Q2FtZXJhSWQoKSk7CisgICAgaHctPmxvY2tBUEkoKTsKKyAgICBxY2FtZXJhX2FwaV9yZXN1bHRfdCBhcGlSZXN1bHQ7CisgICAgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfUFJFX1NUQVJUX1JFQ09SRElORywgTlVMTCk7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9QUkVfU1RBUlRfUkVDT1JESU5HLCAmYXBpUmVzdWx0KTsKKyAgICAgICAgcmV0ID0gYXBpUmVzdWx0LnN0YXR1czsKKyAgICB9CisgICAgaHctPnVubG9ja0FQSSgpOworICAgIExPR0goIltLUEkgUGVyZl06IFgiKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0YXJ0X3JlY29yZGluZworICoKKyAqIERFU0NSSVBUSU9OOiBzdGFydCByZWNvcmRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSAgOiBwdHIgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c3RhcnRfcmVjb3JkaW5nKHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpbnQgcmV0ID0gTk9fRVJST1I7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHcgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKj4oZGV2aWNlLT5wcml2KTsKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBMT0dJKCJbS1BJIFBlcmZdOiBFIFBST0ZJTEVfU1RBUlRfUkVDT1JESU5HIGNhbWVyYSBpZCAlZCIsCisgICAgICAgICAgaHctPmdldENhbWVyYUlkKCkpOworICAgIC8vIEdpdmUgSFdJIGNvbnRyb2wgdG8gY2FsbCBwcmVfc3RhcnRfcmVjb3JkaW5nIGluIHNpbmdsZSBjYW1lcmEgbW9kZS4KKyAgICAvLyBJbiBkdWFsLWNhbSBtb2RlLCB0aGlzIGNvbnRyb2wgYmVsb25ncyB0byBtdXhlci4KKyAgICBpZiAoaHctPmdldFJlbGF0ZWRDYW1TeW5jSW5mbygpLT5zeW5jX2NvbnRyb2wgIT0gQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09OKSB7CisgICAgICAgIHJldCA9IHByZV9zdGFydF9yZWNvcmRpbmcoZGV2aWNlKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgicHJlX3N0YXJ0X3JlY29yZGluZyBmYWlsZWQgd2l0aCByZXQgPSAlZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaHctPmxvY2tBUEkoKTsKKyAgICBxY2FtZXJhX2FwaV9yZXN1bHRfdCBhcGlSZXN1bHQ7CisgICAgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfU1RBUlRfUkVDT1JESU5HLCBOVUxMKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIGh3LT53YWl0QVBJUmVzdWx0KFFDQU1FUkFfU01fRVZUX1NUQVJUX1JFQ09SRElORywgJmFwaVJlc3VsdCk7CisgICAgICAgIHJldCA9IGFwaVJlc3VsdC5zdGF0dXM7CisgICAgfQorICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICBody0+bV9iUmVjb3JkU3RhcnRlZCA9IHRydWU7CisgICAgTE9HSSgiW0tQSSBQZXJmXTogWCByZXQgPSAlZCIsIHJldCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0b3BfcmVjb3JkaW5nCisgKgorICogREVTQ1JJUFRJT046IHN0b3AgcmVjb3JkaW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgIDogcHRyIHRvIGNhbWVyYSBkZXZpY2Ugc3RydWN0CisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzdG9wX3JlY29yZGluZyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHcgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKj4oZGV2aWNlLT5wcml2KTsKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExPR0koIltLUEkgUGVyZl06IEUgUFJPRklMRV9TVE9QX1JFQ09SRElORyBjYW1lcmEgaWQgJWQiLAorICAgICAgICAgICAgIGh3LT5nZXRDYW1lcmFJZCgpKTsKKworICAgIGh3LT5sb2NrQVBJKCk7CisgICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgYXBpUmVzdWx0OworICAgIGludDMyX3QgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfU1RPUF9SRUNPUkRJTkcsIE5VTEwpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaHctPndhaXRBUElSZXN1bHQoUUNBTUVSQV9TTV9FVlRfU1RPUF9SRUNPUkRJTkcsICZhcGlSZXN1bHQpOworICAgIH0KKyAgICBody0+dW5sb2NrQVBJKCk7CisgICAgTE9HSSgiW0tQSSBQZXJmXTogWCByZXQgPSAlZCIsIHJldCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVjb3JkaW5nX2VuYWJsZWQKKyAqCisgKiBERVNDUklQVElPTjogaWYgcmVjb3JkaW5nIGlzIHJ1bm5pbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSAgOiBwdHIgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogMSAtLSBydW5uaW5nCisgKiAgICAgICAgICAgICAgMCAtLSBub3QgcnVubmluZworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cmVjb3JkaW5nX2VuYWJsZWQoc3RydWN0IGNhbWVyYV9kZXZpY2UgKmRldmljZSkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludCByZXQgPSBOT19FUlJPUjsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpodyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqPihkZXZpY2UtPnByaXYpOworICAgIGlmICghaHcpIHsKKyAgICAgICAgTE9HRSgiTlVMTCBjYW1lcmEgZGV2aWNlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIExPR0QoIkUgY2FtZXJhIGlkICVkIiwgaHctPmdldENhbWVyYUlkKCkpOworICAgIGh3LT5sb2NrQVBJKCk7CisgICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgYXBpUmVzdWx0OworICAgIHJldCA9IGh3LT5wcm9jZXNzQVBJKFFDQU1FUkFfU01fRVZUX1JFQ09SRElOR19FTkFCTEVELCBOVUxMKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIGh3LT53YWl0QVBJUmVzdWx0KFFDQU1FUkFfU01fRVZUX1JFQ09SRElOR19FTkFCTEVELCAmYXBpUmVzdWx0KTsKKyAgICAgICAgcmV0ID0gYXBpUmVzdWx0LmVuYWJsZWQ7CisgICAgfQorICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICBMT0dEKCJYIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVsZWFzZV9yZWNvcmRpbmdfZnJhbWUKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIHJlY29yZGluZyBmcmFtZSBiYWNrCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgIDogcHRyIHRvIGNhbWVyYSBkZXZpY2Ugc3RydWN0CisgKiAgIEBvcGFxdWUgIDogcHRyIHRvIGZyYW1lIHRvIGJlIHJldHVybmVkCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpyZWxlYXNlX3JlY29yZGluZ19mcmFtZSgKKyAgICAgICAgICAgIHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UsIGNvbnN0IHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludDMyX3QgcmV0ID0gTk9fRVJST1I7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHcgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKj4oZGV2aWNlLT5wcml2KTsKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghb3BhcXVlKSB7CisgICAgICAgIExPR0UoIkVycm9yISEgRnJhbWUgaW5mbyBpcyBOVUxMIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgTE9HRCgiRSBjYW1lcmEgaWQgJWQiLCBody0+Z2V0Q2FtZXJhSWQoKSk7CisKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKyAgICByZXQgPSBody0+cHJvY2Vzc0FQSShRQ0FNRVJBX1NNX0VWVF9SRUxFQVNFX1JFQ09SSUROR19GUkFNRSwgKHZvaWQgKilvcGFxdWUpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaHctPndhaXRBUElSZXN1bHQoUUNBTUVSQV9TTV9FVlRfUkVMRUFTRV9SRUNPUklETkdfRlJBTUUsICZhcGlSZXN1bHQpOworICAgIH0KKyAgICBody0+dW5sb2NrQVBJKCk7CisgICAgTE9HRCgiWCBjYW1lcmEgaWQgJWQiLCBody0+Z2V0Q2FtZXJhSWQoKSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYXV0b19mb2N1cworICoKKyAqIERFU0NSSVBUSU9OOiBzdGFydCBhdXRvIGZvY3VzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgIDogcHRyIHRvIGNhbWVyYSBkZXZpY2Ugc3RydWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmF1dG9fZm9jdXMoc3RydWN0IGNhbWVyYV9kZXZpY2UgKmRldmljZSkKK3sKKyAgICBLUElfQVRSQUNFX0lOVCgiQ2FtZXJhOkF1dG9Gb2N1cyIsIDEpOworICAgIGludCByZXQgPSBOT19FUlJPUjsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpodyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqPihkZXZpY2UtPnByaXYpOworICAgIGlmICghaHcpIHsKKyAgICAgICAgTE9HRSgiTlVMTCBjYW1lcmEgZGV2aWNlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIExPR0goIltLUEkgUGVyZl0gOiBFIFBST0ZJTEVfQVVUT19GT0NVUyBjYW1lcmEgaWQgJWQiLAorICAgICAgICAgICAgIGh3LT5nZXRDYW1lcmFJZCgpKTsKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKyAgICByZXQgPSBody0+cHJvY2Vzc0FQSShRQ0FNRVJBX1NNX0VWVF9TVEFSVF9BVVRPX0ZPQ1VTLCBOVUxMKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIGh3LT53YWl0QVBJUmVzdWx0KFFDQU1FUkFfU01fRVZUX1NUQVJUX0FVVE9fRk9DVVMsICZhcGlSZXN1bHQpOworICAgICAgICByZXQgPSBhcGlSZXN1bHQuc3RhdHVzOworICAgIH0KKyAgICBody0+dW5sb2NrQVBJKCk7CisgICAgTE9HSCgiW0tQSSBQZXJmXSA6IFggcmV0ID0gJWQiLCByZXQpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYW5jZWxfYXV0b19mb2N1cworICoKKyAqIERFU0NSSVBUSU9OOiBjYW5jZWwgYXV0byBmb2N1cworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlICA6IHB0ciB0byBjYW1lcmEgZGV2aWNlIHN0cnVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpjYW5jZWxfYXV0b19mb2N1cyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HSCgiW0tQSSBQZXJmXSA6IEUgUFJPRklMRV9DQU5DRUxfQVVUT19GT0NVUyBjYW1lcmEgaWQgJWQiLAorICAgICAgICAgICAgIGh3LT5nZXRDYW1lcmFJZCgpKTsKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKyAgICByZXQgPSBody0+cHJvY2Vzc0FQSShRQ0FNRVJBX1NNX0VWVF9TVE9QX0FVVE9fRk9DVVMsIE5VTEwpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaHctPndhaXRBUElSZXN1bHQoUUNBTUVSQV9TTV9FVlRfU1RPUF9BVVRPX0ZPQ1VTLCAmYXBpUmVzdWx0KTsKKyAgICAgICAgcmV0ID0gYXBpUmVzdWx0LnN0YXR1czsKKyAgICB9CisgICAgaHctPnVubG9ja0FQSSgpOworICAgIExPR0goIltLUEkgUGVyZl0gOiBYIHJldCA9ICVkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByZV90YWtlX3BpY3R1cmUKKyAqCisgKiBERVNDUklQVElPTjogcHJlIHRha2UgcGljdHVyZSwgcmVzdGFydCBwcmV2aWV3IGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSAgOiBwdHIgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHJlX3Rha2VfcGljdHVyZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HSCgiW0tQSSBQZXJmXTogRSBQUk9GSUxFX1BSRV9UQUtFX1BJQ1RVUkUgY2FtZXJhIGlkICVkIiwKKyAgICAgICAgICBody0+Z2V0Q2FtZXJhSWQoKSk7CisgICAgaHctPmxvY2tBUEkoKTsKKyAgICBxY2FtZXJhX2FwaV9yZXN1bHRfdCBhcGlSZXN1bHQ7CisgICAgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfUFJFX1RBS0VfUElDVFVSRSwgTlVMTCk7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9QUkVfVEFLRV9QSUNUVVJFLCAmYXBpUmVzdWx0KTsKKyAgICAgICAgcmV0ID0gYXBpUmVzdWx0LnN0YXR1czsKKyAgICB9CisgICAgaHctPnVubG9ja0FQSSgpOworICAgIExPR0goIltLUEkgUGVyZl06IFgiKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHRha2VfcGljdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiB0YWtlIHBpY3R1cmUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSAgOiBwdHIgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6dGFrZV9waWN0dXJlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UpCit7CisgICAgS1BJX0FUUkFDRV9DQUxMKCk7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HSSgiW0tQSSBQZXJmXTogRSBQUk9GSUxFX1RBS0VfUElDVFVSRSBjYW1lcmEgaWQgJWQiLAorICAgICAgICAgICAgIGh3LT5nZXRDYW1lcmFJZCgpKTsKKyAgICBpZiAoIWh3LT5tTG9uZ3Nob3RFbmFibGVkKSB7CisgICAgICAgIGh3LT5tX3BlcmZMb2NrLmxvY2tfYWNxKCk7CisgICAgfQorICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKworICAgLyoqIEFkZGVkIHN1cHBvcnQgZm9yIFJldHJvLWFjdGl2ZSBGcmFtZXM6CisgICAgICogIHRha2VQaWN0dXJlKCkgaXMgY2FsbGVkIGJlZm9yZSBwcmVwYXJpbmcgU25hcHNob3QgdG8gaW5kaWNhdGUgdGhlCisgICAgICogIG1tLWNhbWVyYS1jaGFubmVsIHRvIHBpY2sgdXAgbGVnYWN5IGZyYW1lcyBldmVuCisgICAgICogIGJlZm9yZSBMRUQgZXN0aW1hdGlvbiBpcyB0cmlnZ2VyZWQuCisgICAgICovCisKKyAgICBMT0dIKCJpc0xpdmVTbmFwICVkLCBpc1pTTCAlZCwgaXNIRFIgJWQgbG9uZ3Nob3QgPSAlZCIsCisgICAgICAgICAgIGh3LT5pc0xpdmVTbmFwc2hvdCgpLCBody0+aXNaU0xNb2RlKCksIGh3LT5pc0hEUk1vZGUoKSwKKyAgICAgICAgICAgaHctPmlzTG9uZ3Nob3RFbmFibGVkKCkpOworCisgICAgLy8gQ2hlY2sgZm9yIFJldHJvLWFjdGl2ZSBGcmFtZXMKKyAgICBpZiAoKGh3LT5tUGFyYW1ldGVycy5nZXROdW1PZlJldHJvU25hcHNob3RzKCkgPiAwKSAmJgorICAgICAgICAhaHctPmlzTGl2ZVNuYXBzaG90KCkgJiYgaHctPmlzWlNMTW9kZSgpICYmCisgICAgICAgICFody0+aXNIRFJNb2RlKCkgJiYgIWh3LT5pc0xvbmdzaG90RW5hYmxlZCgpKSB7CisgICAgICAgIC8vIFNldCBSZXRybyBQaWN0dXJlIE1vZGUKKyAgICAgICAgaHctPnNldFJldHJvUGljdHVyZSgxKTsKKyAgICAgICAgaHctPm1fYkxlZEFmQWVjTG9jayA9IDA7CisgICAgICAgIExPR0woIlJldHJvIEVuYWJsZWQiKTsKKworICAgICAgICAvLyBHaXZlIEhXSSBjb250cm9sIHRvIGNhbGwgcHJlX3Rha2VfcGljdHVyZSBpbiBzaW5nbGUgY2FtZXJhIG1vZGUuCisgICAgICAgIC8vIEluIGR1YWwtY2FtIG1vZGUsIHRoaXMgY29udHJvbCBiZWxvbmdzIHRvIG11eGVyLgorICAgICAgICBpZiAoaHctPmdldFJlbGF0ZWRDYW1TeW5jSW5mbygpLT5zeW5jX2NvbnRyb2wgIT0gQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09OKSB7CisgICAgICAgICAgICByZXQgPSBwcmVfdGFrZV9waWN0dXJlKGRldmljZSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgicHJlX3Rha2VfcGljdHVyZSBmYWlsZWQgd2l0aCByZXQgPSAlZCIscmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2FsbCB0YWtlIFBpY3R1cmUgZm9yIHRvdGFsIG51bWJlciBvZiBzbmFwc2hvdHMgcmVxdWlyZWQuCisgICAgICAgICAgICAgVGhpcyBpbmNsdWRlcyB0aGUgbnVtYmVyIG9mIHJldHJvIGZyYW1lcyBhbmQgbm9ybWFsIGZyYW1lcyAqLworICAgICAgICBody0+bG9ja0FQSSgpOworICAgICAgICByZXQgPSBody0+cHJvY2Vzc0FQSShRQ0FNRVJBX1NNX0VWVF9UQUtFX1BJQ1RVUkUsIE5VTEwpOworICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgLy8gV2FpdCBmb3IgcmV0cm8gZnJhbWVzLCBiZWZvcmUgY2FsbGluZyBwcmVwYXJlIHNuYXBzaG90CisgICAgICAgICAgTE9HRCgiV2FpdCBmb3IgUmV0cm8gZnJhbWVzIHRvIGJlIGRvbmUiKTsKKyAgICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9UQUtFX1BJQ1RVUkUsICZhcGlSZXN1bHQpOworICAgICAgICAgICAgcmV0ID0gYXBpUmVzdWx0LnN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAvKiBVbmxvY2sgQVBJIHNpbmNlIGl0IGlzIGFjcXVpcmVkIGluIHByZXBhcmUgc25hcHNob3Qgc2VwZXJhdGVseSAqLworICAgICAgICBody0+dW5sb2NrQVBJKCk7CisKKyAgICAgICAgLyogUHJlcGFyZSBzbmFwc2hvdCBpbiBjYXNlIExFRCBuZWVkcyB0byBiZSBmbGFzaGVkICovCisgICAgICAgIExPR0QoIlN0YXJ0IFByZXBhcmUgU25hcHNob3QiKTsKKyAgICAgICAgcmV0ID0gaHctPnByZXBhcmVfc25hcHNob3QoZGV2aWNlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGh3LT5zZXRSZXRyb1BpY3R1cmUoMCk7CisgICAgICAgIC8vIENoZWNrIGlmIHByZXBhcmUgc25hcHNob3QgaXMgZG9uZQorICAgICAgICBpZiAoIWh3LT5tUHJlcFNuYXBSdW4pIHsKKyAgICAgICAgICAgIC8vIElnbm9yZSB0aGUgc3RhdHVzIGZyb20gcHJlcGFyZV9zbmFwc2hvdAorICAgICAgICAgICAgaHctPnByZXBhcmVfc25hcHNob3QoZGV2aWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdpdmUgSFdJIGNvbnRyb2wgdG8gY2FsbCBwcmVfdGFrZV9waWN0dXJlIGluIHNpbmdsZSBjYW1lcmEgbW9kZS4KKyAgICAgICAgLy8gSW4gZHVhbC1jYW0gbW9kZSwgdGhpcyBjb250cm9sIGJlbG9uZ3MgdG8gbXV4ZXIuCisgICAgICAgIGlmIChody0+Z2V0UmVsYXRlZENhbVN5bmNJbmZvKCktPnN5bmNfY29udHJvbCAhPSBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT04pIHsKKyAgICAgICAgICAgIHJldCA9IHByZV90YWtlX3BpY3R1cmUoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJwcmVfdGFrZV9waWN0dXJlIGZhaWxlZCB3aXRoIHJldCA9ICVkIixyZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWdhcmRsZXNzIHdoYXQgdGhlIHJlc3VsdCB2YWx1ZSBmb3IgcHJlcGFyZV9zbmFwc2hvdCwKKyAgICAgICAgLy8gZ28gYWhlYWQgd2l0aCBjYXB0dXJlIGFueXdheS4gSnVzdCBsaWtlIHRoZSB3YXkgYXV0b2ZvY3VzCisgICAgICAgIC8vIGlzIGhhbmRsZWQgaW4gY2FwdHVyZSBjYXNlCisgICAgICAgIC8qIGNhcHR1cmUgKi8KKyAgICAgICAgTE9HTCgiQ2FwdHVyaW5nIG5vcm1hbCBmcmFtZXMiKTsKKyAgICAgICAgaHctPmxvY2tBUEkoKTsKKyAgICAgICAgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfVEFLRV9QSUNUVVJFLCBOVUxMKTsKKyAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgIGh3LT53YWl0QVBJUmVzdWx0KFFDQU1FUkFfU01fRVZUX1RBS0VfUElDVFVSRSwgJmFwaVJlc3VsdCk7CisgICAgICAgICAgICByZXQgPSBhcGlSZXN1bHQuc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICAgICAgaWYgKCFody0+aXNMb25nc2hvdEVuYWJsZWQoKSl7CisgICAgICAgICAgICAvLyBGb3IgbG9uZ3Nob3QgbW9kZSwgd2UgcHJlcGFyZSBzbmFwc2hvdCBvbmx5IG9uY2UKKyAgICAgICAgICAgIGh3LT5tUHJlcFNuYXBSdW4gPSBmYWxzZTsKKyAgICAgICAgIH0KKyAgICB9CisgICAgTE9HSSgiW0tQSSBQZXJmXTogWCByZXQgPSAlZCIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYW5jZWxfcGljdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBjYW5jZWwgY3VycmVudCB0YWtlIHBpY3R1cmUgcmVxdWVzdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlICA6IHB0ciB0byBjYW1lcmEgZGV2aWNlIHN0cnVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpjYW5jZWxfcGljdHVyZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HSSgiW0tQSSBQZXJmXTogRSBQUk9GSUxFX0NBTkNFTF9QSUNUVVJFIGNhbWVyYSBpZCAlZCIsCisgICAgICAgICAgICAgaHctPmdldENhbWVyYUlkKCkpOworICAgIGh3LT5sb2NrQVBJKCk7CisgICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgYXBpUmVzdWx0OworICAgIHJldCA9IGh3LT5wcm9jZXNzQVBJKFFDQU1FUkFfU01fRVZUX0NBTkNFTF9QSUNUVVJFLCBOVUxMKTsKKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIGh3LT53YWl0QVBJUmVzdWx0KFFDQU1FUkFfU01fRVZUX0NBTkNFTF9QSUNUVVJFLCAmYXBpUmVzdWx0KTsKKyAgICAgICAgcmV0ID0gYXBpUmVzdWx0LnN0YXR1czsKKyAgICB9CisgICAgaHctPnVubG9ja0FQSSgpOworICAgIExPR0koIltLUEkgUGVyZl06IFggY2FtZXJhIGlkICVkIHJldCA9ICVkIiwgaHctPmdldENhbWVyYUlkKCksIHJldCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldF9wYXJhbWV0ZXJzCisgKgorICogREVTQ1JJUFRJT046IHNldCBjYW1lcmEgcGFyYW1ldGVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlICA6IHB0ciB0byBjYW1lcmEgZGV2aWNlIHN0cnVjdAorICogICBAcGFybXMgICA6IHN0cmluZyBvZiBwYWNrZWQgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzZXRfcGFyYW1ldGVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhcm1zKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HRCgiRSBjYW1lcmEgaWQgJWQiLCBody0+Z2V0Q2FtZXJhSWQoKSk7CisgICAgaHctPmxvY2tBUEkoKTsKKyAgICBxY2FtZXJhX2FwaV9yZXN1bHRfdCBhcGlSZXN1bHQ7CisgICAgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNUywgKHZvaWQgKilwYXJtcyk7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TLCAmYXBpUmVzdWx0KTsKKyAgICAgICAgcmV0ID0gYXBpUmVzdWx0LnN0YXR1czsKKyAgICB9CisKKyAgICAvLyBHaXZlIEhXSSBjb250cm9sIHRvIHJlc3RhcnQgKGlmIG5lY2Vzc2FyeSkgYWZ0ZXIgc2V0IHBhcmFtcworICAgIC8vIGluIHNpbmdsZSBjYW1lcmEgbW9kZS4gSW4gZHVhbC1jYW0gbW9kZSwgdGhpcyBjb250cm9sIGJlbG9uZ3MgdG8gbXV4ZXIuCisgICAgaWYgKGh3LT5nZXRSZWxhdGVkQ2FtU3luY0luZm8oKS0+c3luY19jb250cm9sICE9IENBTV9TWU5DX1JFTEFURURfU0VOU09SU19PTikgeworICAgICAgICBpZiAoKHJldCA9PSBOT19FUlJPUikgJiYgaHctPmdldE5lZWRSZXN0YXJ0KCkpIHsKKyAgICAgICAgICAgIExPR0QoInN0b3BwaW5nIGFmdGVyIHBhcmFtIGNoYW5nZSIpOworICAgICAgICAgICAgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19TVE9QLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TX1NUT1AsICZhcGlSZXN1bHQpOworICAgICAgICAgICAgICAgIHJldCA9IGFwaVJlc3VsdC5zdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dEKCJjb21taXR0aW5nIHBhcmFtIGNoYW5nZSIpOworICAgICAgICAgICAgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19DT01NSVQsIE5VTEwpOworICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGh3LT53YWl0QVBJUmVzdWx0KFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVNfQ09NTUlULCAmYXBpUmVzdWx0KTsKKyAgICAgICAgICAgICAgICByZXQgPSBhcGlSZXN1bHQuc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPT0gTk9fRVJST1IpICYmIGh3LT5nZXROZWVkUmVzdGFydCgpKSB7CisgICAgICAgICAgICBMT0dEKCJyZXN0YXJ0aW5nIGFmdGVyIHBhcmFtIGNoYW5nZSIpOworICAgICAgICAgICAgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19SRVNUQVJULCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TX1JFU1RBUlQsICZhcGlSZXN1bHQpOworICAgICAgICAgICAgICAgIHJldCA9IGFwaVJlc3VsdC5zdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBody0+dW5sb2NrQVBJKCk7CisgICAgTE9HRCgiWCBjYW1lcmEgaWQgJWQgcmV0ICVkIiwgaHctPmdldENhbWVyYUlkKCksIHJldCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0b3BfYWZ0ZXJfc2V0X3BhcmFtcworICoKKyAqIERFU0NSSVBUSU9OOiBzdG9wIGFmdGVyIGEgc2V0IHBhcmFtIGNhbGwsIGlmIG5lY2Vzc2FyeQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlICA6IHB0ciB0byBjYW1lcmEgZGV2aWNlIHN0cnVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzdG9wX2FmdGVyX3NldF9wYXJhbXMoc3RydWN0IGNhbWVyYV9kZXZpY2UgKmRldmljZSkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludCByZXQgPSBOT19FUlJPUjsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpodyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqPihkZXZpY2UtPnByaXYpOworICAgIGlmICghaHcpIHsKKyAgICAgICAgTE9HRSgiTlVMTCBjYW1lcmEgZGV2aWNlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIExPR0QoIkUgY2FtZXJhIGlkICVkIiwgaHctPmdldENhbWVyYUlkKCkpOworICAgIGh3LT5sb2NrQVBJKCk7CisgICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgYXBpUmVzdWx0OworCisgICAgaWYgKGh3LT5nZXRSZWxhdGVkQ2FtU3luY0luZm8oKS0+c3luY19jb250cm9sID09IENBTV9TWU5DX1JFTEFURURfU0VOU09SU19PTikgeworICAgICAgICByZXQgPSBody0+cHJvY2Vzc0FQSShRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TX1NUT1AsIE5VTEwpOworICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TX1NUT1AsICZhcGlSZXN1bHQpOworICAgICAgICAgICAgcmV0ID0gYXBpUmVzdWx0LnN0YXR1czsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoImlzIG5vdCBzdXBwb3NlZCB0byBiZSBjYWxsZWQgaW4gc2luZ2xlLWNhbWVyYSBtb2RlIik7CisgICAgICAgIHJldCA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICBMT0dEKCJYIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY29tbWl0X3BhcmFtcworICoKKyAqIERFU0NSSVBUSU9OOiBjb21taXQgYWZ0ZXIgYSBzZXQgcGFyYW0gY2FsbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlICA6IHB0ciB0byBjYW1lcmEgZGV2aWNlIHN0cnVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpjb21taXRfcGFyYW1zKHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpbnQgcmV0ID0gTk9fRVJST1I7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHcgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKj4oZGV2aWNlLT5wcml2KTsKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBMT0dEKCJFIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKworICAgIGlmIChody0+Z2V0UmVsYXRlZENhbVN5bmNJbmZvKCktPnN5bmNfY29udHJvbCA9PSBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT04pIHsKKyAgICAgICAgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19DT01NSVQsIE5VTEwpOworICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TX0NPTU1JVCwgJmFwaVJlc3VsdCk7CisgICAgICAgICAgICByZXQgPSBhcGlSZXN1bHQuc3RhdHVzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiaXMgbm90IHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBpbiBzaW5nbGUtY2FtZXJhIG1vZGUiKTsKKyAgICAgICAgcmV0ID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaHctPnVubG9ja0FQSSgpOworICAgIExPR0QoIlggY2FtZXJhIGlkICVkIiwgaHctPmdldENhbWVyYUlkKCkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZXN0YXJ0X2FmdGVyX3NldF9wYXJhbXMKKyAqCisgKiBERVNDUklQVElPTjogcmVzdGFydCBhZnRlciBhIHNldCBwYXJhbSBjYWxsLCBpZiBuZWNlc3NhcnkKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSAgOiBwdHIgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cmVzdGFydF9hZnRlcl9zZXRfcGFyYW1zKHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpbnQgcmV0ID0gTk9fRVJST1I7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHcgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKj4oZGV2aWNlLT5wcml2KTsKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBMT0dEKCJFIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKworICAgIGlmIChody0+Z2V0UmVsYXRlZENhbVN5bmNJbmZvKCktPnN5bmNfY29udHJvbCA9PSBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT04pIHsKKyAgICAgICAgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19SRVNUQVJULCBOVUxMKTsKKyAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaHctPndhaXRBUElSZXN1bHQoUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19SRVNUQVJULCAmYXBpUmVzdWx0KTsKKyAgICAgICAgICAgIHJldCA9IGFwaVJlc3VsdC5zdGF0dXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJpcyBub3Qgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGluIHNpbmdsZS1jYW1lcmEgbW9kZSIpOworICAgICAgICByZXQgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBody0+dW5sb2NrQVBJKCk7CisgICAgTE9HRCgiWCBjYW1lcmEgaWQgJWQiLCBody0+Z2V0Q2FtZXJhSWQoKSk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRfcGFyYW1ldGVycworICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBjYW1lcmEgcGFyYW1ldGVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlICA6IHB0ciB0byBjYW1lcmEgZGV2aWNlIHN0cnVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBwYWNrZWQgcGFyYW1ldGVycyBpbiBhIHN0cmluZworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjaGFyKiBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpnZXRfcGFyYW1ldGVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgY2hhciAqcmV0ID0gTlVMTDsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpodyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqPihkZXZpY2UtPnByaXYpOworICAgIGlmICghaHcpIHsKKyAgICAgICAgTE9HRSgiTlVMTCBjYW1lcmEgZGV2aWNlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBMT0dEKCJFIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKyAgICBpbnQzMl90IHJjID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfR0VUX1BBUkFNUywgTlVMTCk7CisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIGh3LT53YWl0QVBJUmVzdWx0KFFDQU1FUkFfU01fRVZUX0dFVF9QQVJBTVMsICZhcGlSZXN1bHQpOworICAgICAgICByZXQgPSBhcGlSZXN1bHQucGFyYW1zOworICAgIH0KKyAgICBody0+dW5sb2NrQVBJKCk7CisgICAgTE9HRCgiRSBjYW1lcmEgaWQgJWQiLCBody0+Z2V0Q2FtZXJhSWQoKSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHB1dF9wYXJhbWV0ZXJzCisgKgorICogREVTQ1JJUFRJT046IHJldHVybiBjYW1lcmEgcGFyYW1ldGVycyBzdHJpbmcgYmFjayB0byBIQUwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSAgOiBwdHIgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3QKKyAqICAgQHBhcm0gICAgOiBwdHIgdG8gcGFyYW1ldGVyIHN0cmluZyB0byBiZSByZXR1cm5lZAorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHV0X3BhcmFtZXRlcnMoc3RydWN0IGNhbWVyYV9kZXZpY2UgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFybSkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMT0dEKCJFIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKyAgICBpbnQzMl90IHJldCA9IGh3LT5wcm9jZXNzQVBJKFFDQU1FUkFfU01fRVZUX1BVVF9QQVJBTVMsICh2b2lkICopcGFybSk7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9QVVRfUEFSQU1TLCAmYXBpUmVzdWx0KTsKKyAgICB9CisgICAgaHctPnVubG9ja0FQSSgpOworICAgIExPR0QoIkUgY2FtZXJhIGlkICVkIiwgaHctPmdldENhbWVyYUlkKCkpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNlbmRfY29tbWFuZAorICoKKyAqIERFU0NSSVBUSU9OOiBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgIDogcHRyIHRvIGNhbWVyYSBkZXZpY2Ugc3RydWN0CisgKiAgIEBjbWQgICAgIDogY21kIHRvIGJlIGV4ZWN1dGVkCisgKiAgIEBhcmcxICAgIDogcHRyIHRvIG9wdGlvbmFsIGFyZ3VtZW50MQorICogICBAYXJnMiAgICA6IHB0ciB0byBvcHRpb25hbCBhcmd1bWVudDIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c2VuZF9jb21tYW5kKHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYXJnMikKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludCByZXQgPSBOT19FUlJPUjsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpodyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqPihkZXZpY2UtPnByaXYpOworICAgIGlmICghaHcpIHsKKyAgICAgICAgTE9HRSgiTlVMTCBjYW1lcmEgZGV2aWNlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIExPR0QoIkUgY2FtZXJhIGlkICVkIiwgaHctPmdldENhbWVyYUlkKCkpOworCisgICAgcWNhbWVyYV9zbV9ldnRfY29tbWFuZF9wYXlsb2FkX3QgcGF5bG9hZDsKKyAgICBtZW1zZXQoJnBheWxvYWQsIDAsIHNpemVvZihxY2FtZXJhX3NtX2V2dF9jb21tYW5kX3BheWxvYWRfdCkpOworICAgIHBheWxvYWQuY21kID0gY21kOworICAgIHBheWxvYWQuYXJnMSA9IGFyZzE7CisgICAgcGF5bG9hZC5hcmcyID0gYXJnMjsKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKyAgICByZXQgPSBody0+cHJvY2Vzc0FQSShRQ0FNRVJBX1NNX0VWVF9TRU5EX0NPTU1BTkQsICh2b2lkICopJnBheWxvYWQpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaHctPndhaXRBUElSZXN1bHQoUUNBTUVSQV9TTV9FVlRfU0VORF9DT01NQU5ELCAmYXBpUmVzdWx0KTsKKyAgICAgICAgcmV0ID0gYXBpUmVzdWx0LnN0YXR1czsKKyAgICB9CisgICAgaHctPnVubG9ja0FQSSgpOworICAgIExPR0QoIkUgY2FtZXJhIGlkICVkIiwgaHctPmdldENhbWVyYUlkKCkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZW5kX2NvbW1hbmRfcmVzdGFydAorICoKKyAqIERFU0NSSVBUSU9OOiByZXN0YXJ0IGlmIG5lY2Vzc2FyeSBhZnRlciBhIHNlbmRfY29tbWFuZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlICA6IHB0ciB0byBjYW1lcmEgZGV2aWNlIHN0cnVjdAorICogICBAY21kICAgICA6IGNtZCB0byBiZSBleGVjdXRlZAorICogICBAYXJnMSAgICA6IHB0ciB0byBvcHRpb25hbCBhcmd1bWVudDEKKyAqICAgQGFyZzIgICAgOiBwdHIgdG8gb3B0aW9uYWwgYXJndW1lbnQyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnNlbmRfY29tbWFuZF9yZXN0YXJ0KHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UsCisgICAgICAgIGludDMyX3QgY21kLAorICAgICAgICBpbnQzMl90IGFyZzEsCisgICAgICAgIGludDMyX3QgYXJnMikKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludCByZXQgPSBOT19FUlJPUjsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpodyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKj4oZGV2aWNlLT5wcml2KTsKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHFjYW1lcmFfc21fZXZ0X2NvbW1hbmRfcGF5bG9hZF90IHBheWxvYWQ7CisgICAgbWVtc2V0KCZwYXlsb2FkLCAwLCBzaXplb2YocWNhbWVyYV9zbV9ldnRfY29tbWFuZF9wYXlsb2FkX3QpKTsKKyAgICBwYXlsb2FkLmNtZCA9IGNtZDsKKyAgICBwYXlsb2FkLmFyZzEgPSBhcmcxOworICAgIHBheWxvYWQuYXJnMiA9IGFyZzI7CisgICAgaHctPmxvY2tBUEkoKTsKKyAgICBxY2FtZXJhX2FwaV9yZXN1bHRfdCBhcGlSZXN1bHQ7CisgICAgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfU0VORF9DT01NQU5EX1JFU1RBUlQsICh2b2lkICopJnBheWxvYWQpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaHctPndhaXRBUElSZXN1bHQoUUNBTUVSQV9TTV9FVlRfU0VORF9DT01NQU5EX1JFU1RBUlQsICZhcGlSZXN1bHQpOworICAgICAgICByZXQgPSBhcGlSZXN1bHQuc3RhdHVzOworICAgIH0KKyAgICBody0+dW5sb2NrQVBJKCk7CisgICAgTE9HRCgiRSBjYW1lcmEgaWQgJWQiLCBody0+Z2V0Q2FtZXJhSWQoKSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbGVhc2UKKyAqCisgKiBERVNDUklQVElPTjogcmVsZWFzZSBjYW1lcmEgcmVzb3VyY2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSAgOiBwdHIgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnJlbGVhc2Uoc3RydWN0IGNhbWVyYV9kZXZpY2UgKmRldmljZSkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMT0dEKCJFIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKyAgICBpbnQzMl90IHJldCA9IGh3LT5wcm9jZXNzQVBJKFFDQU1FUkFfU01fRVZUX1JFTEVBU0UsIE5VTEwpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaHctPndhaXRBUElSZXN1bHQoUUNBTUVSQV9TTV9FVlRfUkVMRUFTRSwgJmFwaVJlc3VsdCk7CisgICAgfQorICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICBMT0dEKCJFIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkdW1wCisgKgorICogREVTQ1JJUFRJT046IGR1bXAgY2FtZXJhIHN0YXR1cworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlICA6IHB0ciB0byBjYW1lcmEgZGV2aWNlIHN0cnVjdAorICogICBAZmQgICAgICA6IGZkIGZvciBzdGF0dXMgdG8gYmUgZHVtcGVkIHRvCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmR1bXAoc3RydWN0IGNhbWVyYV9kZXZpY2UgKmRldmljZSwgaW50IGZkKQoreworICAgIGludCByZXQgPSBOT19FUlJPUjsKKworICAgIC8vTG9nIGxldmVsIHByb3BlcnR5IGlzIHJlYWQgd2hlbiAiYWRiIHNoZWxsIGR1bXBzeXMgbWVkaWEuY2FtZXJhIiBpcworICAgIC8vY2FsbGVkIHNvIHRoYXQgdGhlIGxvZyBsZXZlbCBjYW4gYmUgY29udHJvbGxlZCB3aXRob3V0IHJlc3RhcnRpbmcKKyAgICAvL21lZGlhIHNlcnZlcgorICAgIGdldExvZ0xldmVsKCk7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHcgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKj4oZGV2aWNlLT5wcml2KTsKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBMT0dEKCJFIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKyAgICByZXQgPSBody0+cHJvY2Vzc0FQSShRQ0FNRVJBX1NNX0VWVF9EVU1QLCAodm9pZCAqKSZmZCk7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9EVU1QLCAmYXBpUmVzdWx0KTsKKyAgICAgICAgcmV0ID0gYXBpUmVzdWx0LnN0YXR1czsKKyAgICB9CisgICAgaHctPnVubG9ja0FQSSgpOworICAgIExPR0QoIkUgY2FtZXJhIGlkICVkIiwgaHctPmdldENhbWVyYUlkKCkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjbG9zZV9jYW1lcmFfZGV2aWNlCisgKgorICogREVTQ1JJUFRJT046IGNsb3NlIGNhbWVyYSBkZXZpY2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSAgOiBwdHIgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Y2xvc2VfY2FtZXJhX2RldmljZShod19kZXZpY2VfdCAqaHdfZGV2KQoreworICAgIEtQSV9BVFJBQ0VfQ0FMTCgpOworICAgIGludCByZXQgPSBOT19FUlJPUjsKKworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfZGV2aWNlX3QgKj4oaHdfZGV2KS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HSSgiW0tQSSBQZXJmXTogRSBjYW1lcmEgaWQgJWQiLCBody0+Z2V0Q2FtZXJhSWQoKSk7CisgICAgZGVsZXRlIGh3OworICAgIExPR0koIltLUEkgUGVyZl06IFgiKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlZ2lzdGVyX2ZhY2VfaW1hZ2UKKyAqCisgKiBERVNDUklQVElPTjogcmVnaXN0ZXIgYSBmYWNlIGltYWdlIGludG8gaW1hZ2luZyBsaWIgZm9yIGZhY2UgYXV0aGVudGljYXRpby8KKyAqICAgICAgICAgICAgICBmYWNlIHJlY29nbml0aW9uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgIDogcHRyIHRvIGNhbWVyYSBkZXZpY2Ugc3RydWN0CisgKiAgIEBpbWdfcHRyIDogcHRyIHRvIGltYWdlIGJ1ZmZlcgorICogICBAY29uZmlnICA6IHB0ciB0byBjb25maWcgYWJvdXQgaW5wdXQgaW1hZ2UsIGkuZS4sIGZvcm1hdCwgZGltZW5zaW9uLCBhbmQgZXRjLgorICoKKyAqIFJFVFVSTiAgICAgOiA+PTAgdW5pcXVlIElEIG9mIGZhY2UgcmVnaXN0ZXJkLgorICogICAgICAgICAgICAgIDwwICBmYWlsdXJlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cmVnaXN0ZXJfZmFjZV9pbWFnZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqaW1nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9wcF9vZmZsaW5lX3NyY19jb25maWdfdCAqY29uZmlnKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HRCgiRSBjYW1lcmEgaWQgJWQiLCBody0+Z2V0Q2FtZXJhSWQoKSk7CisgICAgcWNhbWVyYV9zbV9ldnRfcmVnX2ZhY2VfcGF5bG9hZF90IHBheWxvYWQ7CisgICAgbWVtc2V0KCZwYXlsb2FkLCAwLCBzaXplb2YocWNhbWVyYV9zbV9ldnRfcmVnX2ZhY2VfcGF5bG9hZF90KSk7CisgICAgcGF5bG9hZC5pbWdfcHRyID0gaW1nX3B0cjsKKyAgICBwYXlsb2FkLmNvbmZpZyA9IGNvbmZpZzsKKyAgICBody0+bG9ja0FQSSgpOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKyAgICByZXQgPSBody0+cHJvY2Vzc0FQSShRQ0FNRVJBX1NNX0VWVF9SRUdfRkFDRV9JTUFHRSwgKHZvaWQgKikmcGF5bG9hZCk7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9SRUdfRkFDRV9JTUFHRSwgJmFwaVJlc3VsdCk7CisgICAgICAgIHJldCA9IGFwaVJlc3VsdC5oYW5kbGU7CisgICAgfQorICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICBMT0dEKCJFIGNhbWVyYSBpZCAlZCIsIGh3LT5nZXRDYW1lcmFJZCgpKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJlcGFyZV9zbmFwc2hvdAorICoKKyAqIERFU0NSSVBUSU9OOiBwcmVwYXJlcyBoYXJkd2FyZSBmb3Igc25hcHNob3QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSAgOiBwdHIgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHJlcGFyZV9zbmFwc2hvdChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqZGV2aWNlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKGh3LT5pc0xvbmdzaG90RW5hYmxlZCgpICYmIGh3LT5tUHJlcFNuYXBSdW4gPT0gdHJ1ZSkgeworICAgICAgICAvLyBGb3IgbG9uZ3Nob3QgbW9kZSwgd2UgcHJlcGFyZSBzbmFwc2hvdCBvbmx5IG9uY2UKKyAgICAgICAgTE9HSCgicHJlcGFyZSBzbmFwc2hvdCBvbmx5IG9uY2UgIik7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgTE9HSCgiW0tQSSBQZXJmXTogRSBQUk9GSUxFX1BSRVBBUkVfU05BUFNIT1QgY2FtZXJhIGlkICVkIiwKKyAgICAgICAgICAgICBody0+Z2V0Q2FtZXJhSWQoKSk7CisgICAgaHctPmxvY2tBUEkoKTsKKyAgICBxY2FtZXJhX2FwaV9yZXN1bHRfdCBhcGlSZXN1bHQ7CisKKyAgICAvKiBQcmVwYXJlIHNuYXBzaG90IGluIGNhc2UgTEVEIG5lZWRzIHRvIGJlIGZsYXNoZWQgKi8KKyAgICBpZiAoaHctPm1GbGFzaE5lZWRlZCB8fCBody0+bVBhcmFtZXRlcnMuaXNDaHJvbWFGbGFzaEVuYWJsZWQoKSkgeworICAgICAgICAvKiBQcmVwYXJlIHNuYXBzaG90IGluIGNhc2UgTEVEIG5lZWRzIHRvIGJlIGZsYXNoZWQgKi8KKyAgICAgICAgcmV0ID0gaHctPnByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfUFJFUEFSRV9TTkFQU0hPVCwgTlVMTCk7CisgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICBody0+d2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9QUkVQQVJFX1NOQVBTSE9ULCAmYXBpUmVzdWx0KTsKKyAgICAgICAgICAgIHJldCA9IGFwaVJlc3VsdC5zdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaHctPm1QcmVwU25hcFJ1biA9IHRydWU7CisgICAgfQorICAgIGh3LT51bmxvY2tBUEkoKTsKKyAgICBMT0dIKCJbS1BJIFBlcmZdOiBYLCByZXQ6ICVkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UKKyAqCisgKiBERVNDUklQVElPTjogY29uc3RydWN0b3Igb2YgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhSWQgIDogY2FtZXJhIElECisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6UUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSh1aW50MzJfdCBjYW1lcmFJZCkKKyAgICA6IG1DYW1lcmFJZChjYW1lcmFJZCksCisgICAgICBtQ2FtZXJhSGFuZGxlKE5VTEwpLAorICAgICAgbUNhbWVyYU9wZW5lZChmYWxzZSksCisgICAgICBtX2JSZWxDYW1DYWxpYlZhbGlkKGZhbHNlKSwKKyAgICAgIG1QcmV2aWV3V2luZG93KE5VTEwpLAorICAgICAgbU1zZ0VuYWJsZWQoMCksCisgICAgICBtU3RvcmVNZXRhRGF0YUluRnJhbWUoMCksCisgICAgICBtSnBlZ0NiKE5VTEwpLAorICAgICAgbUNhbGxiYWNrQ29va2llKE5VTEwpLAorICAgICAgbUpwZWdDYWxsYmFja0Nvb2tpZShOVUxMKSwKKyAgICAgIG1fYk1wb0VuYWJsZWQoVFJVRSksCisgICAgICBtX3N0YXRlTWFjaGluZSh0aGlzKSwKKyAgICAgIG1fc21UaHJlYWRBY3RpdmUodHJ1ZSksCisgICAgICBtX3Bvc3Rwcm9jZXNzb3IodGhpcyksCisgICAgICBtX3RoZXJtYWxBZGFwdGVyKFFDYW1lcmFUaGVybWFsQWRhcHRlcjo6Z2V0SW5zdGFuY2UoKSksCisgICAgICBtX2NiTm90aWZpZXIodGhpcyksCisgICAgICBtX2JQcmV2aWV3U3RhcnRlZChmYWxzZSksCisgICAgICBtX2JSZWNvcmRTdGFydGVkKGZhbHNlKSwKKyAgICAgIG1fY3VycmVudEZvY3VzU3RhdGUoQ0FNX0FGX1NUQVRFX0lOQUNUSVZFKSwKKyAgICAgIG1EdW1wRnJtQ250KDBVKSwKKyAgICAgIG1EdW1wU2tpcENudCgwVSksCisgICAgICBtVGhlcm1hbExldmVsKFFDQU1FUkFfVEhFUk1BTF9OT19BREpVU1RNRU5UKSwKKyAgICAgIG1BY3RpdmVBRihmYWxzZSksCisgICAgICBtX0hEUlNjZW5lRW5hYmxlZChmYWxzZSksCisgICAgICBtTG9uZ3Nob3RFbmFibGVkKGZhbHNlKSwKKyAgICAgIG1MaXZlU25hcHNob3RUaHJlYWQoMCksCisgICAgICBtSW50UGljVGhyZWFkKDApLAorICAgICAgbUZsYXNoTmVlZGVkKGZhbHNlKSwKKyAgICAgIG1GbGFzaENvbmZpZ3VyZWQoZmFsc2UpLAorICAgICAgbURldmljZVJvdGF0aW9uKDBVKSwKKyAgICAgIG1DYXB0dXJlUm90YXRpb24oMFUpLAorICAgICAgbUpwZWdFeGlmUm90YXRpb24oMFUpLAorICAgICAgbVVzZUpwZWdFeGlmUm90YXRpb24oZmFsc2UpLAorICAgICAgbUlzM0FMb2NrZWQoZmFsc2UpLAorICAgICAgbVByZXBTbmFwUnVuKGZhbHNlKSwKKyAgICAgIG1ab29tTGV2ZWwoMCksCisgICAgICBtUHJldmlld1Jlc3RhcnROZWVkZWQoZmFsc2UpLAorICAgICAgbVZGcmFtZUNvdW50KDApLAorICAgICAgbVZMYXN0RnJhbWVDb3VudCgwKSwKKyAgICAgIG1WTGFzdEZwc1RpbWUoMCksCisgICAgICBtVkZwcygwKSwKKyAgICAgIG1QRnJhbWVDb3VudCgwKSwKKyAgICAgIG1QTGFzdEZyYW1lQ291bnQoMCksCisgICAgICBtUExhc3RGcHNUaW1lKDApLAorICAgICAgbVBGcHMoMCksCisgICAgICBtTG93TGlnaHRDb25maWd1cmVkKGZhbHNlKSwKKyAgICAgIG1JbnN0YW50QWVjRnJhbWVDb3VudCgwKSwKKyAgICAgIG1fYkludEpwZWdFdnRQZW5kaW5nKGZhbHNlKSwKKyAgICAgIG1fYkludFJhd0V2dFBlbmRpbmcoZmFsc2UpLAorICAgICAgbVJlcHJvY0pvYigwKSwKKyAgICAgIG1KcGVnSm9iKDApLAorICAgICAgbU1ldGFkYXRhQWxsb2NKb2IoMCksCisgICAgICBtSW5pdFBQcm9jSm9iKDApLAorICAgICAgbVBhcmFtQWxsb2NKb2IoMCksCisgICAgICBtUGFyYW1Jbml0Sm9iKDApLAorICAgICAgbU91dHB1dENvdW50KDApLAorICAgICAgbUlucHV0Q291bnQoMCksCisgICAgICBtQWR2YW5jZWRDYXB0dXJlQ29uZmlndXJlZChmYWxzZSksCisgICAgICBtSERSQnJhY2tldGluZ0VuYWJsZWQoZmFsc2UpLAorICAgICAgbU51bVByZXZpZXdGYWNlcygtMSksCisgICAgICBtSnBlZ0NsaWVudEhhbmRsZSgwKSwKKyAgICAgIG1KcGVnSGFuZGxlT3duZXIoZmFsc2UpLAorICAgICAgbU1ldGFkYXRhTWVtKE5VTEwpLAorICAgICAgbUNBQ0RvbmVSZWNlaXZlZChmYWxzZSksCisgICAgICBtX2JOZWVkUmVzdGFydChmYWxzZSksCisgICAgICBtQm9vdFRvTW9ub1RpbWVzdGFtcE9mZnNldCgwKSwKKyAgICAgIGJEZXB0aEFGQ2FsbGJhY2tzKHRydWUpCit7CisjaWZkZWYgVEFSR0VUX1RTX01BS0VVUAorICAgIG1lbXNldCgmbUZhY2VSZWN0LCAtMSwgc2l6ZW9mKG1GYWNlUmVjdCkpOworI2VuZGlmCisgICAgZ2V0TG9nTGV2ZWwoKTsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIG1DYW1lcmFEZXZpY2UuY29tbW9uLnRhZyA9IEhBUkRXQVJFX0RFVklDRV9UQUc7CisgICAgbUNhbWVyYURldmljZS5jb21tb24udmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigxLCAwKTsKKyAgICBtQ2FtZXJhRGV2aWNlLmNvbW1vbi5jbG9zZSA9IGNsb3NlX2NhbWVyYV9kZXZpY2U7CisgICAgbUNhbWVyYURldmljZS5vcHMgPSAmbUNhbWVyYU9wczsKKyAgICBtQ2FtZXJhRGV2aWNlLnByaXYgPSB0aGlzOworCisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtX2xvY2ssIE5VTEwpOworICAgIHB0aHJlYWRfY29uZF9pbml0KCZtX2NvbmQsIE5VTEwpOworCisgICAgbV9hcGlSZXN1bHRMaXN0ID0gTlVMTDsKKworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbV9ldnRMb2NrLCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbV9ldnRDb25kLCBOVUxMKTsKKyAgICBtZW1zZXQoJm1fZXZ0UmVzdWx0LCAwLCBzaXplb2YocWNhbWVyYV9hcGlfcmVzdWx0X3QpKTsKKworCisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtX2ludF9sb2NrLCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbV9pbnRfY29uZCwgTlVMTCk7CisKKyAgICBtZW1zZXQobV9jaGFubmVscywgMCwgc2l6ZW9mKG1fY2hhbm5lbHMpKTsKKworICAgIG1lbXNldCgmbUV4aWZQYXJhbXMsIDAsIHNpemVvZihtbV9qcGVnX2V4aWZfcGFyYW1zX3QpKTsKKworICAgIG1lbXNldChtX0JhY2tlbmRGaWxlTmFtZSwgMCwgUUNBTUVSQV9NQVhfRklMRVBBVEhfTEVOR1RIKTsKKworICAgIG1lbXNldChtRGVmT25nb2luZ0pvYnMsIDAsIHNpemVvZihtRGVmT25nb2luZ0pvYnMpKTsKKyAgICBtZW1zZXQoJm1KcGVnTWV0YWRhdGEsIDAsIHNpemVvZihtSnBlZ01ldGFkYXRhKSk7CisgICAgbWVtc2V0KCZtSnBlZ0hhbmRsZSwgMCwgc2l6ZW9mKG1KcGVnSGFuZGxlKSk7CisgICAgbWVtc2V0KCZtSnBlZ01wb0hhbmRsZSwgMCwgc2l6ZW9mKG1KcGVnTXBvSGFuZGxlKSk7CisKKyAgICBtRGVmZXJyZWRXb3JrVGhyZWFkLmxhdW5jaChkZWZlcnJlZFdvcmtSb3V0aW5lLCB0aGlzKTsKKyAgICBtRGVmZXJyZWRXb3JrVGhyZWFkLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX1NUQVJUX0RBVEFfUFJPQywgRkFMU0UsIEZBTFNFKTsKKyAgICBtX3BlcmZMb2NrLmxvY2tfaW5pdCgpOworCisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtR3JhbGxvY0xvY2ssIE5VTEwpOworICAgIG1FbnF1ZXVlZEJ1ZmZlcnMgPSAwOworICAgIG1GcmFtZVNraXBTdGFydCA9IDA7CisgICAgbUZyYW1lU2tpcEVuZCA9IDA7CisgICAgbUxhc3RQcmV2aWV3RnJhbWVJRCA9IDA7CisKKyAgICAvL0xvYWQgYW5kIHJlYWQgR1BVIGxpYnJhcnkuCisgICAgbGliX3N1cmZhY2VfdXRpbHMgPSBOVUxMOworICAgIExJTktfZ2V0X3N1cmZhY2VfcGl4ZWxfYWxpZ25tZW50ID0gTlVMTDsKKyAgICBtU3VyZmFjZVN0cmlkZVBhZGRpbmcgPSBDQU1fUEFEX1RPXzMyOworICAgIGxpYl9zdXJmYWNlX3V0aWxzID0gZGxvcGVuKCJsaWJhZHJlbm9fdXRpbHMuc28iLCBSVExEX05PVyk7CisgICAgaWYgKGxpYl9zdXJmYWNlX3V0aWxzKSB7CisgICAgICAgICoodm9pZCAqKikmTElOS19nZXRfc3VyZmFjZV9waXhlbF9hbGlnbm1lbnQgPQorICAgICAgICAgICAgICAgIGRsc3ltKGxpYl9zdXJmYWNlX3V0aWxzLCAiZ2V0X2dwdV9waXhlbF9hbGlnbm1lbnQiKTsKKyAgICAgICAgIGlmIChMSU5LX2dldF9zdXJmYWNlX3BpeGVsX2FsaWdubWVudCkgeworICAgICAgICAgICAgIG1TdXJmYWNlU3RyaWRlUGFkZGluZyA9IExJTktfZ2V0X3N1cmZhY2VfcGl4ZWxfYWxpZ25tZW50KCk7CisgICAgICAgICB9CisgICAgICAgICBkbGNsb3NlKGxpYl9zdXJmYWNlX3V0aWxzKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogflFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UKKyAqCisgKiBERVNDUklQVElPTjogZGVzdHJ1Y3RvciBvZiBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjp+UUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSgpCit7CisgICAgTE9HSCgiRSIpOworCisgICAgbURlZmVycmVkV29ya1RocmVhZC5zZW5kQ21kKENBTUVSQV9DTURfVFlQRV9TVE9QX0RBVEFfUFJPQywgVFJVRSwgVFJVRSk7CisgICAgbURlZmVycmVkV29ya1RocmVhZC5leGl0KCk7CisKKyAgICBpZiAobU1ldGFkYXRhTWVtICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1NZXRhZGF0YU1lbTsKKyAgICAgICAgbU1ldGFkYXRhTWVtID0gTlVMTDsKKyAgICB9CisKKyAgICBtX3BlcmZMb2NrLmxvY2tfYWNxKCk7CisgICAgbG9ja0FQSSgpOworICAgIG1fc21UaHJlYWRBY3RpdmUgPSBmYWxzZTsKKyAgICB1bmxvY2tBUEkoKTsKKyAgICBtX3N0YXRlTWFjaGluZS5yZWxlYXNlVGhyZWFkKCk7CisgICAgY2xvc2VDYW1lcmEoKTsKKyAgICBtX3BlcmZMb2NrLmxvY2tfcmVsKCk7CisgICAgbV9wZXJmTG9jay5sb2NrX2RlaW5pdCgpOworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbV9sb2NrKTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbV9jb25kKTsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1fZXZ0TG9jayk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJm1fZXZ0Q29uZCk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtX2ludF9sb2NrKTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbV9pbnRfY29uZCk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtR3JhbGxvY0xvY2spOworICAgIExPR0goIlgiKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkZWZlclBQSW5pdAorICoKKyAqIERFU0NSSVBUSU9OOiBRdWV1ZSBwb3N0cHJvYyBpbml0IHRhc2sgdG8gZGVmZXJyZWQgdGhyZWFkCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdWludDMyX3Qgam9iIGlkIG9mIHBwcm9jIGluaXQgam9iCisgKiAgICAgICAgICAgICAgMCAgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpkZWZlclBQSW5pdCgpCit7CisgICAgLy8gaW5pdCBwcHJvYworICAgIERlZmVyV29ya0FyZ3MgYXJnczsKKyAgICBEZWZlclBQcm9jSW5pdEFyZ3MgcHByb2NJbml0QXJnczsKKworICAgIG1lbXNldCgmYXJncywgMCwgc2l6ZW9mKERlZmVyV29ya0FyZ3MpKTsKKyAgICBtZW1zZXQoJnBwcm9jSW5pdEFyZ3MsIDAsIHNpemVvZihEZWZlclBQcm9jSW5pdEFyZ3MpKTsKKworICAgIHBwcm9jSW5pdEFyZ3MuanBlZ19jYiA9IGpwZWdFdnRIYW5kbGU7CisgICAgcHByb2NJbml0QXJncy51c2VyX2RhdGEgPSB0aGlzOworICAgIGFyZ3MucHByb2NJbml0QXJncyA9IHBwcm9jSW5pdEFyZ3M7CisKKyAgICByZXR1cm4gcXVldWVEZWZlcnJlZFdvcmsoQ01EX0RFRl9QUFJPQ19JTklULAorICAgICAgICAgICAgYXJncyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogb3BlbkNhbWVyYQorICoKKyAqIERFU0NSSVBUSU9OOiBvcGVuIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaHdfZGV2aWNlICA6IGRvdWJsZSBwdHIgZm9yIGNhbWVyYSBkZXZpY2Ugc3RydWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6Om9wZW5DYW1lcmEoc3RydWN0IGh3X2RldmljZV90ICoqaHdfZGV2aWNlKQoreworICAgIEtQSV9BVFJBQ0VfQ0FMTCgpOworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIGlmIChtQ2FtZXJhT3BlbmVkKSB7CisgICAgICAgICpod19kZXZpY2UgPSBOVUxMOworICAgICAgICBMT0dFKCJQZXJtaXNzaW9uIERlbmllZCIpOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIExPR0koIltLUEkgUGVyZl06IEUgUFJPRklMRV9PUEVOX0NBTUVSQSBjYW1lcmEgaWQgJWQiLAorICAgICAgICAgICAgbUNhbWVyYUlkKTsKKyAgICBtX3BlcmZMb2NrLmxvY2tfYWNxX3RpbWVkKENBTUVSQV9PUEVOX1BFUkZfVElNRV9PVVQpOworICAgIHJjID0gb3BlbkNhbWVyYSgpOworICAgIGlmIChyYyA9PSBOT19FUlJPUil7CisgICAgICAgICpod19kZXZpY2UgPSAmbUNhbWVyYURldmljZS5jb21tb247CisgICAgICAgIGlmIChtX3RoZXJtYWxBZGFwdGVyLmluaXQodGhpcykgIT0gMCkgeworICAgICAgICAgIExPR1coIkluaXQgdGhlcm1hbCBhZGFwdGVyIGZhaWxlZCIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgKmh3X2RldmljZSA9IE5VTEw7CisKKyAgICBMT0dJKCJbS1BJIFBlcmZdOiBYIFBST0ZJTEVfT1BFTl9DQU1FUkEgY2FtZXJhIGlkICVkLCByYzogJWQiLAorICAgICAgICAgICAgbUNhbWVyYUlkLCByYyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogb3BlbkNhbWVyYQorICoKKyAqIERFU0NSSVBUSU9OOiBvcGVuIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6Om9wZW5DYW1lcmEoKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICBpZiAobUNhbWVyYUhhbmRsZSkgeworICAgICAgICBMT0dFKCJGYWlsdXJlOiBDYW1lcmEgYWxyZWFkeSBvcGVuZWQiKTsKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIH0KKworICAgIHJjID0gUUNhbWVyYUZsYXNoOjpnZXRJbnN0YW5jZSgpLnJlc2VydmVGbGFzaEZvckNhbWVyYShtQ2FtZXJhSWQpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJlc2VydmUgZmxhc2ggZm9yIGNhbWVyYSBpZDogJWQiLAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIGFsbG9jIHBhcmFtIGJ1ZmZlcgorICAgIERlZmVyV29ya0FyZ3MgYXJnczsKKyAgICBtZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisgICAgbVBhcmFtQWxsb2NKb2IgPSBxdWV1ZURlZmVycmVkV29yayhDTURfREVGX1BBUkFNX0FMTE9DLCBhcmdzKTsKKyAgICBpZiAobVBhcmFtQWxsb2NKb2IgPT0gMCkgeworICAgICAgICBMT0dFKCJGYWlsZWQgcXVldWVpbmcgUEFSQU1fQUxMT0Mgam9iIik7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKworICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdICE9IE5VTEwpIHsKKyAgICAgICAgLy8gYWxsb2NhdGUgbWV0YWRhdGEgYnVmZmVycworICAgICAgICBEZWZlcldvcmtBcmdzIGFyZ3M7CisgICAgICAgIERlZmVyTWV0YWRhdGFBbGxvY0FyZ3MgbWV0YWRhdGFBbGxvY0FyZ3M7CisKKyAgICAgICAgbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoYXJncykpOworICAgICAgICBtZW1zZXQoJm1ldGFkYXRhQWxsb2NBcmdzLCAwLCBzaXplb2YobWV0YWRhdGFBbGxvY0FyZ3MpKTsKKworICAgICAgICB1aW50MzJfdCBwYWRkaW5nID0KKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5wYWRkaW5nX2luZm8ucGxhbmVfcGFkZGluZzsKKyAgICAgICAgbWV0YWRhdGFBbGxvY0FyZ3Muc2l6ZSA9IFBBRF9UT19TSVpFKHNpemVvZihtZXRhZGF0YV9idWZmZXJfdCksCisgICAgICAgICAgICAgICAgcGFkZGluZyk7CisgICAgICAgIG1ldGFkYXRhQWxsb2NBcmdzLmJ1ZmZlckNudCA9IENBTUVSQV9NSU5fTUVUQURBVEFfQlVGRkVSUzsKKyAgICAgICAgYXJncy5tZXRhZGF0YUFsbG9jQXJncyA9IG1ldGFkYXRhQWxsb2NBcmdzOworCisgICAgICAgIG1NZXRhZGF0YUFsbG9jSm9iID0gcXVldWVEZWZlcnJlZFdvcmsoQ01EX0RFRl9NRVRBREFUQV9BTExPQywgYXJncyk7CisgICAgICAgIGlmIChtTWV0YWRhdGFBbGxvY0pvYiA9PSAwKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWV0YWRhdGEgYnVmZmVyIik7CisgICAgICAgICAgICByYyA9IC1FTk9NRU07CisgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQxOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBjYW1lcmFfb3BlbigodWludDhfdCltQ2FtZXJhSWQsICZtQ2FtZXJhSGFuZGxlKTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICBMT0dFKCJjYW1lcmFfb3BlbiBmYWlsZWQuIHJjID0gJWQsIG1DYW1lcmFIYW5kbGUgPSAlcCIsCisgICAgICAgICAgICAgICAgICAgICByYywgbUNhbWVyYUhhbmRsZSk7CisgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQyOworICAgICAgICB9CisKKyAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzLT5yZWdpc3Rlcl9ldmVudF9ub3RpZnkobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICBjYW1FdnRIYW5kbGUsCisgICAgICAgICAgICAgICAgKHZvaWQgKikgdGhpcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HSCgiQ2FwYWJpbGl0aWVzIG5vdCBpbml0ZWQsIGluaXRpYWxpemluZyBub3cuIik7CisKKyAgICAgICAgcmMgPSBjYW1lcmFfb3BlbigodWludDhfdCltQ2FtZXJhSWQsICZtQ2FtZXJhSGFuZGxlKTsKKyAgICAgICAgaWYgKHJjKSB7CisgICAgICAgICAgICBMT0dFKCJjYW1lcmFfb3BlbiBmYWlsZWQuIHJjID0gJWQsIG1DYW1lcmFIYW5kbGUgPSAlcCIsCisgICAgICAgICAgICAgICAgICAgICByYywgbUNhbWVyYUhhbmRsZSk7CisgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQyOworICAgICAgICB9CisKKyAgICAgICAgaWYoTk9fRVJST1IgIT0gaW5pdENhcGFiaWxpdGllcyhtQ2FtZXJhSWQsbUNhbWVyYUhhbmRsZSkpIHsKKyAgICAgICAgICAgIExPR0UoImluaXRDYXBhYmlsaXRpZXMgZmFpbGVkLiIpOworICAgICAgICAgICAgcmMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgZ290byBlcnJvcl9leGl0MzsKKyAgICAgICAgfQorCisgICAgICAgIG1DYW1lcmFIYW5kbGUtPm9wcy0+cmVnaXN0ZXJfZXZlbnRfbm90aWZ5KG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgY2FtRXZ0SGFuZGxlLAorICAgICAgICAgICAgICAgICh2b2lkICopIHRoaXMpOworICAgIH0KKworICAgIC8vIEluaXQgcGFyYW1zIGluIHRoZSBiYWNrZ3JvdW5kCisgICAgLy8gMS4gSXQncyBzYWZlIHRvIHF1ZXVlIGluaXQgam9iLCBldmVuIGlmIGFsbG9jIGpvYiBpcyBub3QgeWV0IGNvbXBsZXRlLgorICAgIC8vIEl0IHdpbGwgYmUgcXVldWVkIHRvIHRoZSBzYW1lIHRocmVhZCwgc28gdGhlIGFsbG9jIGlzIGd1YXJhbnRlZWQgdG8KKyAgICAvLyBmaW5pc2ggZmlyc3QuCisgICAgLy8gMi4gSG93ZXZlciwgaXQgaXMgbm90IHNhZmUgdG8gYmVnaW4gcGFyYW0gaW5pdCB1bnRpbCBhZnRlciBjYW1lcmEgaXMKKyAgICAvLyBvcGVuLiBUaGF0IGlzIHdoeSB3ZSB3YWl0IHVudGlsIGFmdGVyIGNhbWVyYSBvcGVuIGNvbXBsZXRlcyB0byBzY2hlZHVsZQorICAgIC8vIHRoaXMgdGFzay4KKyAgICBtZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisgICAgbVBhcmFtSW5pdEpvYiA9IHF1ZXVlRGVmZXJyZWRXb3JrKENNRF9ERUZfUEFSQU1fSU5JVCwgYXJncyk7CisgICAgaWYgKG1QYXJhbUluaXRKb2IgPT0gMCkgeworICAgICAgICBMT0dFKCJGYWlsZWQgcXVldWluZyBQQVJBTV9JTklUIGpvYiIpOworICAgICAgICByYyA9IC1FTk9NRU07CisgICAgICAgIGdvdG8gZXJyb3JfZXhpdDM7CisgICAgfQorCisgICAgbUNhbWVyYU9wZW5lZCA9IHRydWU7CisKKyAgICAvL05vdGlmeSBkaXNwbGF5IEhBTCB0aGF0IGEgY2FtZXJhIHNlc3Npb24gaXMgYWN0aXZlLgorICAgIC8vQnV0IGF2b2lkIGNhbGxpbmcgdGhlIHNhbWUgZHVyaW5nIGJvb3R1cCBiZWNhdXNlIGNhbWVyYSBzZXJ2aWNlIG1pZ2h0IG9wZW4vY2xvc2UKKyAgICAvL2NhbWVyYXMgYXQgYm9vdCB0aW1lIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24gYW5kIGRpc3BsYXkgc2VydmljZSB3aWxsIGFsc28gaW50ZXJuYWxseQorICAgIC8vd2FpdCBmb3IgY2FtZXJhIHNlcnZpY2UgdG8gaW5pdGlhbGl6ZSBmaXJzdCB3aGlsZSBjYWxsaW5nIHRoaXMgZGlzcGxheSBBUEksIHJlc3VsdGluZyBpbiBhCisgICAgLy9kZWFkbG9jayBzaXR1YXRpb24uIFNpbmNlIGJvb3QgdGltZSBjYW1lcmEgb3Blbi9jbG9zZSBjYWxscyBhcmUgbWFkZSBvbmx5IHRvIGZldGNoCisgICAgLy9jYXBhYmlsaXRpZXMsIG5vIG5lZWQgb2YgdGhpcyBkaXNwbGF5IGJ3IG9wdGltaXphdGlvbi4KKyAgICAvL1VzZSAic2VydmljZS5ib290YW5pbS5leGl0IiBwcm9wZXJ0eSB0byBrbm93IGJvb3Qgc3RhdHVzLgorICAgIHByb3BlcnR5X2dldCgic2VydmljZS5ib290YW5pbS5leGl0IiwgdmFsdWUsICIwIik7CisgICAgaWYgKGF0b2kodmFsdWUpID09IDEpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnQ2FtTG9jayk7CisgICAgICAgIGlmIChnTnVtQ2FtZXJhU2Vzc2lvbnMrKyA9PSAwKSB7CisgICAgICAgICAgICBzZXRDYW1lcmFMYXVuY2hTdGF0dXModHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdDYW1Mb2NrKTsKKyAgICB9CisKKyAgICAvLyBTZXRwcm9wIHRvIGRlY2lkZSB0aGUgdGltZSBzb3VyY2UgKHdoZXRoZXIgYm9vdHRpbWUgb3IgbW9ub3RvbmljKS4KKyAgICAvLyBCeSBkZWZhdWx0LCB1c2UgbW9ub3RvbmljIHRpbWUuCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS50aW1lLm1vbm90b25pYyIsIHZhbHVlLCAiMSIpOworICAgIG1Cb290VG9Nb25vVGltZXN0YW1wT2Zmc2V0ID0gMDsKKyAgICBpZiAoYXRvaSh2YWx1ZSkgPT0gMSkgeworICAgICAgICAvLyBpZiBtb25vdG9uaWMgaXMgc2V0LCB0aGVuIG5lZWQgdG8gdXNlIHRpbWUgaW4gbW9ub3RvbmljLgorICAgICAgICAvLyBTbywgTWVhc3VyZSB0aGUgY2xvY2sgb2Zmc2V0IGJldHdlZW4gQk9PVFRJTUUgYW5kIE1PTk9UT05JQworICAgICAgICAvLyBUaGUgY2xvY2sgZG9tYWluIHNvdXJjZSBmb3IgSVNQIGlzIEJPT1RUSU1FIGFuZAorICAgICAgICAvLyBmb3IgVmlkZW8vZGlzcGxheSBpcyBNT05PVE9OSUMKKyAgICAgICAgLy8gVGhlIGJlbG93IG9mZnNldCBpcyB1c2VkIHRvIGNvbnZlcnQgZnJvbSBjbG9jayBkb21haW4gb2Ygb3RoZXIgc3Vic3lzdGVtCisgICAgICAgIC8vICh2aWRlby9oYXJkd2FyZSBjb21wb3NlcikgdG8gdGhhdCBvZiBjYW1lcmEuIEFzc3VtcHRpb24gaXMgdGhhdCB0aGlzCisgICAgICAgIC8vIG9mZnNldCB3b24ndCBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlIGN5Y2xlIG9mIHRoZSBjYW1lcmEgZGV2aWNlLiBJbiBvdGhlcgorICAgICAgICAvLyB3b3JkcywgY2FtZXJhIGRldmljZSBzaG91bGRuJ3QgYmUgb3BlbiBkdXJpbmcgQ1BVIHN1c3BlbmQuCisgICAgICAgIG1Cb290VG9Nb25vVGltZXN0YW1wT2Zmc2V0ID0gZ2V0Qm9vdFRvTW9ub1RpbWVPZmZzZXQoKTsKKyAgICB9CisgICAgTE9HSCgibUJvb3RUb01vbm9UaW1lc3RhbXBPZmZzZXQgPSAlbGxkIiwgbUJvb3RUb01vbm9UaW1lc3RhbXBPZmZzZXQpOworCisgICAgbWVtc2V0KHZhbHVlLCAwLCBzaXplb2YodmFsdWUpKTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmRlcHRoLmZvY3VzLmNiIiwgdmFsdWUsICIxIik7CisgICAgYkRlcHRoQUZDYWxsYmFja3MgPSBhdG9pKHZhbHVlKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKKworZXJyb3JfZXhpdDM6CisgICAgaWYobUpwZWdDbGllbnRIYW5kbGUpIHsKKyAgICAgICAgZGVpbml0SnBlZ0hhbmRsZSgpOworICAgIH0KKyAgICBtQ2FtZXJhSGFuZGxlLT5vcHMtPmNsb3NlX2NhbWVyYShtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlKTsKKyAgICBtQ2FtZXJhSGFuZGxlID0gTlVMTDsKK2Vycm9yX2V4aXQyOgorICAgIHdhaXREZWZlcnJlZFdvcmsobU1ldGFkYXRhQWxsb2NKb2IpOworZXJyb3JfZXhpdDE6CisgICAgd2FpdERlZmVycmVkV29yayhtUGFyYW1BbGxvY0pvYik7CisgICAgcmV0dXJuIHJjOworCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYnVuZGxlUmVsYXRlZENhbWVyYXMKKyAqCisgKiBERVNDUklQVElPTjogYnVuZGxlIGNhbWVyYXMgdG8gZW5hYmxlIHN5bmNpbmcgb2YgY2FtZXJhcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3luYyAgICAgICAgOmluZGljYXRlcyB3aGV0aGVyIHN5bmNpbmcgaXMgT24gb3IgT2ZmCisgKiAgIEBzZXNzaW9uaWQgIDpzZXNzaW9uIGlkIGZvciBvdGhlciBjYW1lcmEgc2Vzc2lvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpidW5kbGVSZWxhdGVkQ2FtZXJhcyhib29sIHN5bmNPbiwKKyAgICAgICAgICAgIHVpbnQzMl90IHNlc3Npb25pZCkKK3sKKyAgICBMT0dEKCJidW5kbGVSZWxhdGVkQ2FtZXJhcyBzeW5jICVkIHdpdGggc2Vzc2lvbmlkICVkIiwKKyAgICAgICAgICAgIHN5bmNPbiwgc2Vzc2lvbmlkKTsKKworICAgIGludDMyX3QgcmMgPSBtUGFyYW1ldGVycy5idW5kbGVSZWxhdGVkQ2FtZXJhcyhzeW5jT24sIHNlc3Npb25pZCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoImJ1bmRsZVJlbGF0ZWRDYW1lcmFzIGZhaWxlZCAlZCIsIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0Q2FtZXJhU2Vzc2lvbklkCisgKgorICogREVTQ1JJUFRJT046IGdldHMgdGhlIGJhY2tlbmQgc2Vzc2lvbiBJZCBvZiB0aGlzIEhXSSBpbnN0YW5jZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc2Vzc2lvbmlkICA6IHBvaW50ZXIgdG8gdGhlIG91dHB1dCBzZXNzaW9uIGlkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmdldENhbWVyYVNlc3Npb25JZCh1aW50MzJfdCogc2Vzc2lvbl9pZCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBpZihzZXNzaW9uX2lkICE9IE5VTEwpIHsKKyAgICAgICAgcmMgPSBtQ2FtZXJhSGFuZGxlLT5vcHMtPmdldF9zZXNzaW9uX2lkKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgc2Vzc2lvbl9pZCk7CisgICAgICAgIExPR0QoIkdldHRpbmcgQ2FtZXJhIFNlc3Npb24gSWQgJWQiLCAqc2Vzc2lvbl9pZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiU2Vzc2lvbiBJZCBpcyBOdWxsIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNGcmFtZVN5bmNFbmFibGVkCisgKgorICogREVTQ1JJUFRJT046IHJldHVybnMgd2hldGhlciBmcmFtZSBzeW5jIGlzIGVuYWJsZWQKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBib29sIGluZGljYXRpbmcgd2hldGhlciBmcmFtZSBzeW5jIGlzIGVuYWJsZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjppc0ZyYW1lU3luY0VuYWJsZWQodm9pZCkKK3sKKyAgICByZXR1cm4gbVBhcmFtZXRlcnMuaXNGcmFtZVN5bmNFbmFibGVkKCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0RnJhbWVTeW5jRW5hYmxlZAorICoKKyAqIERFU0NSSVBUSU9OOiBzZXRzIHdoZXRoZXIgZnJhbWUgc3luYyBpcyBlbmFibGVkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBlbmFibGUgIDogZmxhZyB3aGV0aGVyIHRvIGVuYWJsZSBvciBkaXNhYmxlIGZyYW1lIHN5bmMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnNldEZyYW1lU3luY0VuYWJsZWQoYm9vbCBlbmFibGUpCit7CisgICAgcmV0dXJuIG1QYXJhbWV0ZXJzLnNldEZyYW1lU3luY0VuYWJsZWQoZW5hYmxlKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRSZWxhdGVkQ2FtU3luY0luZm8KKyAqCisgKiBERVNDUklQVElPTjpyZXR1cm5zIHRoZSByZWxhdGVkIGNhbSBzeW5jIGluZm8gZm9yIHRoaXMgSFdJIGluc3RhbmNlCisgKgorICogUEFSQU1FVEVSUyA6bm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBjb25zdCBwb2ludGVyIHRvIGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY29uc3QgY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCoKKyAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Z2V0UmVsYXRlZENhbVN5bmNJbmZvKHZvaWQpCit7CisgICAgcmV0dXJuIG1QYXJhbWV0ZXJzLmdldFJlbGF0ZWRDYW1TeW5jSW5mbygpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFJlbGF0ZWRDYW1TeW5jSW5mbworICoKKyAqIERFU0NSSVBUSU9OOnNldHMgdGhlIHJlbGF0ZWQgY2FtIHN5bmMgaW5mbyBmb3IgdGhpcyBIV0kgaW5zdGFuY2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZm8gIDogcHRyIHRvIHJlbGF0ZWQgY2FtIGluZm8gcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c2V0UmVsYXRlZENhbVN5bmNJbmZvKAorICAgICAgICBjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KiBpbmZvKQoreworICAgIGlmKGluZm8pIHsKKyAgICAgICAgcmV0dXJuIG1QYXJhbWV0ZXJzLnNldFJlbGF0ZWRDYW1TeW5jSW5mbyhpbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldE1wb0NvbXBvc2l0aW9uCisgKgorICogREVTQ1JJUFRJT046ZnVuY3Rpb24gdG8gcmV0cmlldmUgd2hldGhlciBNcG8gY29tcG9zaXRpb24gc2hvdWxkIGJlIGVuYWJsZWQKKyAqICAgICAgICAgICAgICAgICAgICBvciBub3QKKyAqCisgKiBQQVJBTUVURVJTIDpub25lCisgKgorICogUkVUVVJOICAgICA6IGJvb2wgaW5kaWNhdGVzIHdoZXRoZXIgbXBvIGNvbXBvc2l0aW9uIGlzIGVuYWJsZWQgb3Igbm90CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Z2V0TXBvQ29tcG9zaXRpb24odm9pZCkKK3sKKyAgICBMT0dIKCJNcG9Db21wb3NpdGlvbjolZCAiLCBtX2JNcG9FbmFibGVkKTsKKyAgICByZXR1cm4gbV9iTXBvRW5hYmxlZDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRNcG9Db21wb3NpdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOnNldCBpZiBNcG8gY29tcG9zaXRpb24gc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHRoaXMgSFdJIGluc3RhbmNlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBlbmFibGUgIDogaW5kaWNhdGVzIHdoZXRoZXIgTXBvIGNvbXBvc2l0aW9uIGVuYWJsZWQgb3Igbm90CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzZXRNcG9Db21wb3NpdGlvbihib29sIGVuYWJsZSkKK3sKKyAgICAvLyBCeSBkZWZhdWx0IHNldCBNcG8gY29tcG9zaXRpb24gdG8gZGlzYWJsZQorICAgIG1fYk1wb0VuYWJsZWQgPSBmYWxzZTsKKworICAgIC8vIEVuYWJsZSBNcG8gY29tcG9zaXRpb24gb25seSBpZgorICAgIC8vIDEpIGZyYW1lIHN5bmMgaXMgT04gYmV0d2VlbiB0d28gY2FtZXJhcyBhbmQKKyAgICAvLyAyKSBhbnkgYWR2YW5jZWQgZmVhdHVyZXMgYXJlIG5vdCBlbmFibGVkIChBT1NUIGZlYXR1cmVzKSBhbmQKKyAgICAvLyAzKSBub3QgaW4gcmVjb3JkaW5nIG1vZGUgKGZvciBsaXZlc2hvdCBjYXNlKQorICAgIC8vIDQpIGZsYXNoIGlzIG5vdCBuZWVkZWQKKyAgICBpZiAoKGdldFJlbGF0ZWRDYW1TeW5jSW5mbygpLT5zeW5jX2NvbnRyb2wgPT0gQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09OKSAmJgorICAgICAgICAgICAgIW1QYXJhbWV0ZXJzLmlzQWR2Q2FtRmVhdHVyZXNFbmFibGVkKCkgJiYKKyAgICAgICAgICAgICFtUGFyYW1ldGVycy5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKSAmJgorICAgICAgICAgICAgIW1GbGFzaE5lZWRlZCAmJgorICAgICAgICAgICAgIWlzTG9uZ3Nob3RFbmFibGVkKCkpIHsKKyAgICAgICAgbV9iTXBvRW5hYmxlZCA9IGVuYWJsZTsKKyAgICAgICAgTE9HSCgiTXBvQ29tcG9zaXRpb246JWQgIiwgbV9iTXBvRW5hYmxlZCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFJlY29yZGluZ0hpbnRWYWx1ZQorICoKKyAqIERFU0NSSVBUSU9OOmZ1bmN0aW9uIHRvIHJldHJpZXZlIHJlY29yZGluZyBoaW50IHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6bm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBib29sIGluZGljYXRlcyB3aGV0aGVyIHJlY29yZGluZyBoaW50IGlzIGVuYWJsZWQgb3Igbm90CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Z2V0UmVjb3JkaW5nSGludFZhbHVlKHZvaWQpCit7CisgICAgcmV0dXJuIG1QYXJhbWV0ZXJzLmdldFJlY29yZGluZ0hpbnRWYWx1ZSgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFJlY29yZGluZ0hpbnRWYWx1ZQorICoKKyAqIERFU0NSSVBUSU9OOnNldCByZWNvcmRpbmcgaGludCB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZW5hYmxlICA6IHZpZGVvIGhpbnQgdmFsdWUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnNldFJlY29yZGluZ0hpbnRWYWx1ZShpbnQzMl90IHZhbHVlKQoreworICAgIHJldHVybiBtUGFyYW1ldGVycy51cGRhdGVSZWNvcmRpbmdIaW50VmFsdWUodmFsdWUpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNsb3NlQ2FtZXJhCisgKgorICogREVTQ1JJUFRJT046IGNsb3NlIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmNsb3NlQ2FtZXJhKCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICBpbnQgaTsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgTE9HSSgiRSIpOworICAgIGlmICghbUNhbWVyYU9wZW5lZCkgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIExPR0koIltLUEkgUGVyZl06IEUgUFJPRklMRV9DTE9TRV9DQU1FUkEgY2FtZXJhIGlkICVkIiwKKyAgICAgICAgICAgICBtQ2FtZXJhSWQpOworCisgICAgLy8gc2V0IG9wZW4gZmxhZyB0byBmYWxzZQorICAgIG1DYW1lcmFPcGVuZWQgPSBmYWxzZTsKKworICAgIC8vIFJlc2V0IFN0cmVhbSBjb25maWcgaW5mbworICAgIG1QYXJhbWV0ZXJzLnNldFN0cmVhbUNvbmZpZ3VyZShmYWxzZSwgZmFsc2UsIHRydWUpOworCisgICAgLy8gZGVpbml0IFBhcmFtZXRlcnMKKyAgICBtUGFyYW1ldGVycy5kZWluaXQoKTsKKworICAgIC8vIGV4aXQgbm90aWZpZXIKKyAgICBtX2NiTm90aWZpZXIuZXhpdCgpOworCisgICAgLy8gc3RvcCBhbmQgZGVpbml0IHBvc3Rwcm9jZXNzb3IKKyAgICB3YWl0RGVmZXJyZWRXb3JrKG1SZXByb2NKb2IpOworICAgIC8vIENsb3NlIHRoZSBKUEVHIHNlc3Npb24KKyAgICB3YWl0RGVmZXJyZWRXb3JrKG1KcGVnSm9iKTsKKyAgICBtX3Bvc3Rwcm9jZXNzb3Iuc3RvcCgpOworICAgIGRlaW5pdEpwZWdIYW5kbGUoKTsKKyAgICBtX3Bvc3Rwcm9jZXNzb3IuZGVpbml0KCk7CisgICAgbUluaXRQUHJvY0pvYiA9IDA7IC8vIHJlc2V0IGpvYiBpZCwgc28gcHByb2MgY2FuIGJlIHJlaW5pdGVkIGxhdGVyCisKKyAgICBtX3RoZXJtYWxBZGFwdGVyLmRlaW5pdCgpOworCisgICAgLy8gZGVsZXRlIGFsbCBjaGFubmVscyBpZiBub3QgYWxyZWFkeSBkZWxldGVkCisgICAgZm9yIChpID0gMDsgaSA8IFFDQU1FUkFfQ0hfVFlQRV9NQVg7IGkrKykgeworICAgICAgICBpZiAobV9jaGFubmVsc1tpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtX2NoYW5uZWxzW2ldLT5zdG9wKCk7CisgICAgICAgICAgICBkZWxldGUgbV9jaGFubmVsc1tpXTsKKyAgICAgICAgICAgIG1fY2hhbm5lbHNbaV0gPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgLy9mcmVlIGFsbCBwZW5kaW5nIGFwaSByZXN1bHRzIGhlcmUKKyAgICBpZihtX2FwaVJlc3VsdExpc3QgIT0gTlVMTCkgeworICAgICAgICBhcGlfcmVzdWx0X2xpc3QgKmFwaVJlc3VsdExpc3QgPSBtX2FwaVJlc3VsdExpc3Q7CisgICAgICAgIGFwaV9yZXN1bHRfbGlzdCAqYXBpUmVzdWx0TGlzdE5leHQ7CisgICAgICAgIHdoaWxlIChhcGlSZXN1bHRMaXN0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGFwaVJlc3VsdExpc3ROZXh0ID0gYXBpUmVzdWx0TGlzdC0+bmV4dDsKKyAgICAgICAgICAgIGZyZWUoYXBpUmVzdWx0TGlzdCk7CisgICAgICAgICAgICBhcGlSZXN1bHRMaXN0ID0gYXBpUmVzdWx0TGlzdE5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByYyA9IG1DYW1lcmFIYW5kbGUtPm9wcy0+Y2xvc2VfY2FtZXJhKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUpOworICAgIG1DYW1lcmFIYW5kbGUgPSBOVUxMOworCisgICAgLy9Ob3RpZnkgZGlzcGxheSBIQUwgdGhhdCB0aGVyZSBpcyBubyBhY3RpdmUgY2FtZXJhIHNlc3Npb24KKyAgICAvL2J1dCBhdm9pZCBjYWxsaW5nIHRoZSBzYW1lIGR1cmluZyBib290dXAuIFJlZmVyIHRvIG9wZW5DYW1lcmEKKyAgICAvL2ZvciBtb3JlIGRldGFpbHMuCisgICAgcHJvcGVydHlfZ2V0KCJzZXJ2aWNlLmJvb3RhbmltLmV4aXQiLCB2YWx1ZSwgIjAiKTsKKyAgICBpZiAoYXRvaSh2YWx1ZSkgPT0gMSkgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdDYW1Mb2NrKTsKKyAgICAgICAgaWYgKC0tZ051bUNhbWVyYVNlc3Npb25zID09IDApIHsKKyAgICAgICAgICAgIHNldENhbWVyYUxhdW5jaFN0YXR1cyhmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdDYW1Mb2NrKTsKKyAgICB9CisKKyAgICBpZiAobUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zKSB7CisgICAgICAgIGZyZWUobUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zKTsKKyAgICAgICAgbUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoUUNhbWVyYUZsYXNoOjpnZXRJbnN0YW5jZSgpLnJlbGVhc2VGbGFzaEZyb21DYW1lcmEobUNhbWVyYUlkKSAhPSAwKSB7CisgICAgICAgIExPR0QoIkZhaWxlZCB0byByZWxlYXNlIGZsYXNoIGZvciBjYW1lcmEgaWQ6ICVkIiwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSWQpOworICAgIH0KKworICAgIExPR0koIltLUEkgUGVyZl06IFggUFJPRklMRV9DTE9TRV9DQU1FUkEgY2FtZXJhIGlkICVkLCByYzogJWQiLAorICAgICAgICAgbUNhbWVyYUlkLCByYyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKyNkZWZpbmUgREFUQV9QVFIoTUVNX09CSixJTkRFWCkgTUVNX09CSi0+Z2V0UHRyKCBJTkRFWCApCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW5pdENhcGFiaWxpdGllcworICoKKyAqIERFU0NSSVBUSU9OOiBpbml0aWFsaXplIGNhbWVyYSBjYXBhYmlsaXRpZXMgaW4gc3RhdGljIGRhdGEgc3RydWN0CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFJZCAgOiBjYW1lcmEgSWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6aW5pdENhcGFiaWxpdGllcyh1aW50MzJfdCBjYW1lcmFJZCwKKyAgICAgICAgbW1fY2FtZXJhX3Z0YmxfdCAqY2FtZXJhSGFuZGxlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgUUNhbWVyYUhlYXBNZW1vcnkgKmNhcGFiaWxpdHlIZWFwID0gTlVMTDsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgY2FwYWJpbGl0eSBidWZmZXIgKi8KKyAgICBjYXBhYmlsaXR5SGVhcCA9IG5ldyBRQ2FtZXJhSGVhcE1lbW9yeShRQ0FNRVJBX0lPTl9VU0VfQ0FDSEUpOworICAgIHJjID0gY2FwYWJpbGl0eUhlYXAtPmFsbG9jYXRlKDEsIHNpemVvZihjYW1fY2FwYWJpbGl0eV90KSwgTk9OX1NFQ1VSRSk7CisgICAgaWYocmMgIT0gT0spIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBjYXBwYWJpbGl0eSIpOworICAgICAgICBnb3RvIGFsbG9jYXRlX2ZhaWxlZDsKKyAgICB9CisKKyAgICAvKiBNYXAgbWVtb3J5IGZvciBjYXBhYmlsaXR5IGJ1ZmZlciAqLworICAgIG1lbXNldChEQVRBX1BUUihjYXBhYmlsaXR5SGVhcCwwKSwgMCwgc2l6ZW9mKGNhbV9jYXBhYmlsaXR5X3QpKTsKKworICAgIGNhbV9idWZfbWFwX3R5cGVfbGlzdCBidWZNYXBMaXN0OworICAgIHJjID0gUUNhbWVyYUJ1ZmZlck1hcHM6Om1ha2VTaW5nbGV0b25CdWZNYXBMaXN0KAorICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfQ0FQQUJJTElUWSwKKyAgICAgICAgICAgIDAgLypzdHJlYW0gaWQqLywgMCAvKmJ1ZmZlciBpbmRleCovLCAtMSAvKnBsYW5lIGluZGV4Ki8sCisgICAgICAgICAgICAwIC8qY29va2llKi8sIGNhcGFiaWxpdHlIZWFwLT5nZXRGZCgwKSwgc2l6ZW9mKGNhbV9jYXBhYmlsaXR5X3QpLAorICAgICAgICAgICAgYnVmTWFwTGlzdCwgY2FwYWJpbGl0eUhlYXAtPmdldFB0cigwKSk7CisKKyAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmMgPSBjYW1lcmFIYW5kbGUtPm9wcy0+bWFwX2J1ZnMoY2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICZidWZNYXBMaXN0KTsKKyAgICB9CisKKyAgICBpZihyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHRvIG1hcCBjYXBhYmlsaXR5IGJ1ZmZlciIpOworICAgICAgICBnb3RvIG1hcF9mYWlsZWQ7CisgICAgfQorCisgICAgLyogUXVlcnkgQ2FwYWJpbGl0eSAqLworICAgIHJjID0gY2FtZXJhSGFuZGxlLT5vcHMtPnF1ZXJ5X2NhcGFiaWxpdHkoY2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlKTsKKyAgICBpZihyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHRvIHF1ZXJ5IGNhcGFiaWxpdHkiKTsKKyAgICAgICAgZ290byBxdWVyeV9mYWlsZWQ7CisgICAgfQorICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXSA9CisgICAgICAgICAgICAoY2FtX2NhcGFiaWxpdHlfdCAqKW1hbGxvYyhzaXplb2YoY2FtX2NhcGFiaWxpdHlfdCkpOworCisgICAgaWYgKCFnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0pIHsKKyAgICAgICAgTE9HRSgib3V0IG9mIG1lbW9yeSIpOworICAgICAgICBnb3RvIHF1ZXJ5X2ZhaWxlZDsKKyAgICB9CisgICAgbWVtY3B5KGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXSwgREFUQV9QVFIoY2FwYWJpbGl0eUhlYXAsMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNhbV9jYXBhYmlsaXR5X3QpKTsKKworICAgIGludCBpbmRleDsKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBDQU1fQU5BTFlTSVNfSU5GT19NQVg7IGluZGV4KyspIHsKKyAgICAgICAgY2FtX2FuYWx5c2lzX2luZm9fdCAqcF9hbmFseXNpc19pbmZvID0KKyAgICAgICAgICAgICAgICAmZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5hbmFseXNpc19pbmZvW2luZGV4XTsKKyAgICAgICAgcF9hbmFseXNpc19pbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8ub2Zmc2V0X2luZm8ub2Zmc2V0X3ggPSAwOworICAgICAgICBwX2FuYWx5c2lzX2luZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5vZmZzZXRfaW5mby5vZmZzZXRfeSA9IDA7CisgICAgfQorCisgICAgcmMgPSBOT19FUlJPUjsKKworcXVlcnlfZmFpbGVkOgorICAgIGNhbWVyYUhhbmRsZS0+b3BzLT51bm1hcF9idWYoY2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX0NBUEFCSUxJVFkpOworbWFwX2ZhaWxlZDoKKyAgICBjYXBhYmlsaXR5SGVhcC0+ZGVhbGxvY2F0ZSgpOworICAgIGRlbGV0ZSBjYXBhYmlsaXR5SGVhcDsKK2FsbG9jYXRlX2ZhaWxlZDoKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0Q2FwYWJpbGl0aWVzCisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IGNhbWVyYSBjYXBhYmlsaXRpZXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYUlkICA6IGNhbWVyYSBJZAorICogICBAaW5mbyAgICAgIDogY2FtZXJhIGluZm8gc3RydWN0IHRvIGJlIGZpbGxlZCBpbiB3aXRoIGNhbWVyYSBjYXBhYmlsaXRpZXMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpnZXRDYXBhYmlsaXRpZXModWludDMyX3QgY2FtZXJhSWQsCisgICAgICAgIHN0cnVjdCBjYW1lcmFfaW5mbyAqaW5mbywgY2FtX3N5bmNfdHlwZV90ICpwX2NhbV90eXBlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgc3RydWN0ICBjYW1lcmFfaW5mbyAqcF9pbmZvID0gTlVMTDsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdDYW1Mb2NrKTsKKyAgICBwX2luZm8gPSBnZXRfY2FtX2luZm8oY2FtZXJhSWQsIHBfY2FtX3R5cGUpOworICAgIHBfaW5mby0+ZGV2aWNlX3ZlcnNpb24gPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDsKKyAgICBwX2luZm8tPnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzID0gTlVMTDsKKyAgICBtZW1jcHkoaW5mbywgcF9pbmZvLCBzaXplb2YgKHN0cnVjdCBjYW1lcmFfaW5mbykpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnQ2FtTG9jayk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldENhbUhhbENhcGFiaWxpdGllcworICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgdGhlIEhBTCBjYXBhYmlsaXRpZXMgc3RydWN0dXJlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFJZCAgOiBjYW1lcmEgSWQKKyAqCisgKiBSRVRVUk4gICAgIDogY2FwYWJpbGl0eSBzdHJ1Y3R1cmUgb2YgcmVzcGVjdGl2ZSBjYW1lcmEKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2NhbV9jYXBhYmlsaXR5X3QqIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmdldENhbUhhbENhcGFiaWxpdGllcygpCit7CisgICAgcmV0dXJuIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF07Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0QnVmTnVtUmVxdWlyZWQKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIG51bWJlciBvZiBzdHJlYW0gYnVmZmVycyBuZWVkZWQgZm9yIGdpdmVuIHN0cmVhbSB0eXBlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdHJlYW1fdHlwZSAgOiB0eXBlIG9mIHN0cmVhbQorICoKKyAqIFJFVFVSTiAgICAgOiBudW1iZXIgb2YgYnVmZmVycyBuZWVkZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDhfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpnZXRCdWZOdW1SZXF1aXJlZChjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSkKK3sKKyAgICBpbnQgYnVmZmVyQ250ID0gMDsKKyAgICBpbnQgbWluQ2FwdHVyZUJ1ZmZlcnMgPSBtUGFyYW1ldGVycy5nZXROdW1PZlNuYXBzaG90cygpOworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBib29sIHJhd195dXYgPSBmYWxzZTsKKyAgICBpbnQgcGVyc2lzdF9jbnQgPSAwOworCisgICAgaW50IHpzbFFCdWZmZXJzID0gbVBhcmFtZXRlcnMuZ2V0WlNMUXVldWVEZXB0aCgpOworCisgICAgaW50IG1pbkNpcmN1bGFyQnVmTnVtID0gbVBhcmFtZXRlcnMuZ2V0TWF4VW5tYXRjaGVkRnJhbWVzSW5RdWV1ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfTUlOX0pQRUdfRU5DT0RJTkdfQlVGRkVSUzsKKworICAgIGludCBtYXhTdHJlYW1CdWYgPSBtaW5DYXB0dXJlQnVmZmVycyArIG1QYXJhbWV0ZXJzLmdldE1heFVubWF0Y2hlZEZyYW1lc0luUXVldWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFIRFJJbkJ1ZnNJZk5lZWRlZCgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0TnVtT2ZFeHRyYUhEUk91dEJ1ZnNJZk5lZWRlZCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JJbWFnZVByb2MoKSArCisgICAgICAgICAgICAgICAgICAgICAgIEVYVFJBX1pTTF9QUkVWSUVXX1NUUkVBTV9CVUY7CisKKyAgICBpbnQgbWluVW5kZXF1ZUNvdW50ID0gMDsKKyAgICBpZiAoIWlzTm9EaXNwbGF5TW9kZSgpKSB7CisgICAgICAgIGlmKG1QcmV2aWV3V2luZG93ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChtUHJldmlld1dpbmRvdy0+Z2V0X21pbl91bmRlcXVldWVkX2J1ZmZlcl9jb3VudChtUHJldmlld1dpbmRvdywmbWluVW5kZXF1ZUNvdW50KQorICAgICAgICAgICAgICAgICE9IDApIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJnZXRfbWluX3VuZGVxdWV1ZWRfYnVmZmVyX2NvdW50ICBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAvL1RPRE86IGhhcmRjb2RlZCBiZWNhdXNlIE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgbm90IGRlZmluZWQKKyAgICAgICAgICAgICAgICAvL21pblVuZGVxdWVDb3VudCA9IEJ1ZmZlclF1ZXVlOjpNSU5fVU5ERVFVRVVFRF9CVUZGRVJTOworICAgICAgICAgICAgICAgIG1pblVuZGVxdWVDb3VudCA9IE1JTl9VTkRFUVVFVUVEX0JVRkZFUlM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvL3ByZXZpZXcgd2luZG93IG1pZ2h0IG5vdCBiZSBzZXQgYXQgdGhpcyBwb2ludC4gU28sIHF1ZXJ5IGRpcmVjdGx5CisgICAgICAgICAgICAvL2Zyb20gQnVmZmVyUXVldWUgaW1wbGVtZW50YXRpb24gb2YgZ3JhbGxvYyBidWZmZXJzLgorICAgICAgICAgICAgLy9taW5VbmRlcXVlQ291bnQgPSBCdWZmZXJRdWV1ZTo6TUlOX1VOREVRVUVVRURfQlVGRkVSUzsKKyAgICAgICAgICAgIC8vaGFyZGNvZGVkIGJlY2F1c2UgTUlOX1VOREVRVUVVRURfQlVGRkVSUyBub3QgZGVmaW5lZC4gUkVWSVNJVAorICAgICAgICAgICAgbWluVW5kZXF1ZUNvdW50ID0gTUlOX1VOREVRVUVVRURfQlVGRkVSUzsKKyAgICAgICAgfQorICAgICAgICBpZiAobWluVW5kZXF1ZUNvdW50ICE9IE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIC8vIG1pblVuZGVxdWVDb3VudCBmcm9tIHZhbGlkIHByZXZpZXcgd2luZG93ICE9IGhhcmRjb2RlZCBNSU5fVU5ERVFVRVVFRF9CVUZGRVJTCisgICAgICAgICAgICAvLyBhbmQgc28gY2hhbmdlIHRoZSBNQUNSTyBhcyBwZXIgbWluVW5kZXF1ZUNvdW50CisgICAgICAgICAgICBMT0dXKCJXQVJOSU5HIDogbWluVW5kZXF1ZUNvdW50KCVkKSAhPSBoYXJkY29kZWQgdmFsdWUoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgIG1pblVuZGVxdWVDb3VudCwgTUlOX1VOREVRVUVVRURfQlVGRkVSUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dEKCJtaW5DYXB0dXJlQnVmZmVycyA9ICVkIHpzbFFCdWZmZXJzID0gJWQgbWluQ2lyY3VsYXJCdWZOdW0gPSAlZCIKKyAgICAgICAgICAgICJtYXhTdHJlYW1CdWYgPSAlZCBtaW5VbmRlcXVlQ291bnQgPSAlZCIsCisgICAgICAgICAgICBtaW5DYXB0dXJlQnVmZmVycywgenNsUUJ1ZmZlcnMsIG1pbkNpcmN1bGFyQnVmTnVtLAorICAgICAgICAgICAgbWF4U3RyZWFtQnVmLCBtaW5VbmRlcXVlQ291bnQpOworICAgIC8vIEdldCBidWZmZXIgY291bnQgZm9yIHRoZSBwYXJ0aWN1bGFyIHN0cmVhbSB0eXBlCisgICAgc3dpdGNoIChzdHJlYW1fdHlwZSkgeworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5pc1pTTE1vZGUoKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRkIHR3byBleHRyYSBzdHJlbWluZyBidWZmZXJzIHRvIGFkZAorICAgICAgICAgICAgICAgIC8vIGZsZXhpYmlsaXR5IGluIGZvcm1pbmcgbWF0Y2hlZCBzdXBlciBidWYgaW4gWlNMIHF1ZXVlLgorICAgICAgICAgICAgICAgIC8vIHdpdGggbnVtYmVyIGJlaW5nICd6c2xRQnVmZmVycyArIG1pbkNpcmN1bGFyQnVmTnVtJworICAgICAgICAgICAgICAgIC8vIHdlIHNlZSBwcmV2aWV3IGJ1ZmZlcnMgc29tZXRpbWVzIGdldCBkcm9wcGVkIGF0IENQUAorICAgICAgICAgICAgICAgIC8vIGFuZCBzdXBlciBidWYgaXMgbm90IGZvcm1pbmcgaW4gWlNMIFEgZm9yIGxvbmcgdGltZS4KKworICAgICAgICAgICAgICAgIGJ1ZmZlckNudCA9IHpzbFFCdWZmZXJzICsgbWluQ2lyY3VsYXJCdWZOdW0gKworICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JJbWFnZVByb2MoKSArCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXROdW1PZkV4dHJhQnVmZmVyc0ZvclByZXZpZXcoKSArCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXROdW1PZkV4dHJhSERSSW5CdWZzSWZOZWVkZWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyQ250ID0gQ0FNRVJBX01JTl9TVFJFQU1JTkdfQlVGRkVSUyArCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXRNYXhVbm1hdGNoZWRGcmFtZXNJblF1ZXVlKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JQcmV2aWV3KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJU1AgYWxsb2NhdGVzIG5hdGl2ZSBwcmV2aWV3IGJ1ZmZlcnMgYW5kIHNvIHJlZHVjaW5nIHNhbWUgZnJvbSBIQUwgYWxsb2NhdGlvbgorICAgICAgICAgICAgaWYgKGJ1ZmZlckNudCA+IENBTUVSQV9JU1BfUElOR19QT05HX0JVRkZFUlMgKQorICAgICAgICAgICAgICAgIGJ1ZmZlckNudCAtPSBDQU1FUkFfSVNQX1BJTkdfUE9OR19CVUZGRVJTOworCisgICAgICAgICAgICAvLyBFeHRyYSBaU0wgcHJldmlldyBmcmFtZXMgYXJlIG5vdCBuZWVkZWQgZm9yIEhGUiBjYXNlLgorICAgICAgICAgICAgLy8gVGh1bWJuYWlsIHdpbGwgbm90IGJlIGRlcml2ZWQgZnJvbSBwcmV2aWV3IGZvciBIRlIgbGl2ZSBzbmFwc2hvdCBjYXNlLgorICAgICAgICAgICAgaWYgKChtUGFyYW1ldGVycy5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKSA9PSB0cnVlKQorICAgICAgICAgICAgICAgICAgICAmJiAoIW1QYXJhbWV0ZXJzLmlzSGZyTW9kZSgpKSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlckNudCArPSBFWFRSQV9aU0xfUFJFVklFV19TVFJFQU1fQlVGOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBBZGQgdGhlIGRpc3BsYXkgbWluVW5kZXF1ZUNvdW50IGNvdW50IG9uIHRvcCBvZiBjYW1lcmEgcmVxdWlyZW1lbnQKKyAgICAgICAgICAgIGJ1ZmZlckNudCArPSBtaW5VbmRlcXVlQ291bnQ7CisKKyAgICAgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEucHJldmlld195dXYiLCB2YWx1ZSwgIjAiKTsKKyAgICAgICAgICAgIHBlcnNpc3RfY250ID0gYXRvaSh2YWx1ZSk7CisgICAgICAgICAgICBpZiAoKHBlcnNpc3RfY250IDwgQ0FNX01BWF9OVU1fQlVGU19QRVJfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAmJiAoYnVmZmVyQ250IDwgcGVyc2lzdF9jbnQpKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyQ250ID0gcGVyc2lzdF9jbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZmZlckNudCA9IG1pbkNhcHR1cmVCdWZmZXJzICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldE1heFVubWF0Y2hlZEZyYW1lc0luUXVldWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXROdW1PZkV4dHJhSERSSW5CdWZzSWZOZWVkZWQoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXROdW1PZkV4dHJhSERST3V0QnVmc0lmTmVlZGVkKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JJbWFnZVByb2MoKTsKKworICAgICAgICAgICAgaWYgKGJ1ZmZlckNudCA+IG1heFN0cmVhbUJ1ZikgeworICAgICAgICAgICAgICAgIGJ1ZmZlckNudCA9IG1heFN0cmVhbUJ1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlckNudCArPSBtaW5VbmRlcXVlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5pc1pTTE1vZGUoKSB8fCBtTG9uZ3Nob3RFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKChtaW5DYXB0dXJlQnVmZmVycyA9PSAxIHx8IG1QYXJhbWV0ZXJzLmlzVWJpUmVmb2N1cygpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1Mb25nc2hvdEVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIFpTTCBzbmFwc2hvdCBjYXNlCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckNudCA9IHpzbFFCdWZmZXJzICsgQ0FNRVJBX01JTl9TVFJFQU1JTkdfQlVGRkVSUyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JJbWFnZVByb2MoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFpTTCBCdXJzdCBvciBMb25nc2hvdCBjYXNlCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckNudCA9IHpzbFFCdWZmZXJzICsgbWluQ2lyY3VsYXJCdWZOdW0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFCdWZmZXJzRm9ySW1hZ2VQcm9jKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChnZXRTZW5zb3JUeXBlKCkgPT0gQ0FNX1NFTlNPUl9ZVVYgJiYgYnVmZmVyQ250ID4gQ0FNRVJBX0lTUF9QSU5HX1BPTkdfQlVGRkVSUykgeworICAgICAgICAgICAgICAgICAgICAvL0lTUCBhbGxvY2F0ZXMgbmF0aXZlIGJ1ZmZlcnMgaW4gWVVWIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyQ250IC09IENBTUVSQV9JU1BfUElOR19QT05HX0JVRkZFUlM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXJDbnQgPSBtaW5DYXB0dXJlQnVmZmVycyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0TnVtT2ZFeHRyYUhEUkluQnVmc0lmTmVlZGVkKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFIRFJPdXRCdWZzSWZOZWVkZWQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JJbWFnZVByb2MoKTsKKworICAgICAgICAgICAgICAgIGlmIChidWZmZXJDbnQgPiBtYXhTdHJlYW1CdWYpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyQ250ID0gbWF4U3RyZWFtQnVmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9SQVc6CisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEucmF3X3l1diIsIHZhbHVlLCAiMCIpOworICAgICAgICByYXdfeXV2ID0gYXRvaSh2YWx1ZSkgPiAwID8gdHJ1ZSA6IGZhbHNlOworCisgICAgICAgIGlmIChpc1JkaU1vZGUoKSB8fCByYXdfeXV2KSB7CisgICAgICAgICAgICBidWZmZXJDbnQgPSB6c2xRQnVmZmVycyArIG1pbkNpcmN1bGFyQnVmTnVtOworICAgICAgICB9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLmlzWlNMTW9kZSgpKSB7CisgICAgICAgICAgICBidWZmZXJDbnQgPSB6c2xRQnVmZmVycyArIG1pbkNpcmN1bGFyQnVmTnVtOworICAgICAgICAgICAgaWYgKGdldFNlbnNvclR5cGUoKSA9PSBDQU1fU0VOU09SX1lVViAmJiBidWZmZXJDbnQgPiBDQU1FUkFfSVNQX1BJTkdfUE9OR19CVUZGRVJTKSB7CisgICAgICAgICAgICAgICAgLy9JU1AgYWxsb2NhdGVzIG5hdGl2ZSBidWZmZXJzIGluIFlVViBjYXNlCisgICAgICAgICAgICAgICAgYnVmZmVyQ250IC09IENBTUVSQV9JU1BfUElOR19QT05HX0JVRkZFUlM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlckNudCA9IG1pbkNhcHR1cmVCdWZmZXJzICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFIRFJJbkJ1ZnNJZk5lZWRlZCgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFIRFJPdXRCdWZzSWZOZWVkZWQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXROdW1PZkV4dHJhQnVmZmVyc0ZvckltYWdlUHJvYygpOworCisgICAgICAgICAgICBpZiAoYnVmZmVyQ250ID4gbWF4U3RyZWFtQnVmKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyQ250ID0gbWF4U3RyZWFtQnVmOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5wcmV2aWV3X3JhdyIsIHZhbHVlLCAiMCIpOworICAgICAgICBwZXJzaXN0X2NudCA9IGF0b2kodmFsdWUpOworICAgICAgICBpZiAoKHBlcnNpc3RfY250IDwgQ0FNX01BWF9OVU1fQlVGU19QRVJfU1RSRUFNKQorICAgICAgICAgICAgICAgICYmIChidWZmZXJDbnQgPCBwZXJzaXN0X2NudCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlckNudCA9IHBlcnNpc3RfY250OworICAgICAgICB9CisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEudmlkZW9fcmF3IiwgdmFsdWUsICIwIik7CisgICAgICAgIHBlcnNpc3RfY250ID0gYXRvaSh2YWx1ZSk7CisgICAgICAgIGlmICgocGVyc2lzdF9jbnQgPCBDQU1fTUFYX05VTV9CVUZTX1BFUl9TVFJFQU0pCisgICAgICAgICAgICAgICAgJiYgKGJ1ZmZlckNudCA8IHBlcnNpc3RfY250KSkgeworICAgICAgICAgICAgYnVmZmVyQ250ID0gcGVyc2lzdF9jbnQ7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9WSURFTzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmdldEJ1ZkJhdGNoQ291bnQoKSkgeworICAgICAgICAgICAgICAgIC8vVmlkZW8gQnVmZmVyIGluIGNhc2Ugb2YgSEZSIG9yIGNhbWVyYSBiYXRjaGluZy4uCisgICAgICAgICAgICAgICAgYnVmZmVyQ250ID0gQ0FNRVJBX01JTl9DQU1FUkFfQkFUQ0hfQlVGRkVSUzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVBhcmFtZXRlcnMuZ2V0VmlkZW9CYXRjaFNpemUoKSkgeworICAgICAgICAgICAgICAgIC8vVmlkZW8gQnVmZmVyIGNvdW50IG9ubHkgZm9yIEhBTCB0byBIQUwgYmF0Y2hpbmcuCisgICAgICAgICAgICAgICAgYnVmZmVyQ250ID0gKENBTUVSQV9NSU5fVklERU9fQkFUQ0hfQlVGRkVSUworICAgICAgICAgICAgICAgICAgICAgICAgKiBtUGFyYW1ldGVycy5nZXRWaWRlb0JhdGNoU2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyQ250IDwgQ0FNRVJBX01JTl9WSURFT19CVUZGRVJTKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckNudCA9IENBTUVSQV9NSU5fVklERU9fQlVGRkVSUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE5vIGJhdGNoaW5nIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgYnVmZmVyQ250ID0gQ0FNRVJBX01JTl9WSURFT19CVUZGRVJTOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidWZmZXJDbnQgKz0gbVBhcmFtZXRlcnMuZ2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JWaWRlbygpOworICAgICAgICAgICAgLy9pZiBpdHMgNEsgZW5jb2RpbmcgdXNlY2FzZSwgdGhlbiBhZGQgZXh0cmEgYnVmZmVyCisgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3QgZGltOworICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0U3RyZWFtRGltZW5zaW9uKENBTV9TVFJFQU1fVFlQRV9WSURFTywgZGltKTsKKyAgICAgICAgICAgIGlmIChpczRrMmtSZXNvbHV0aW9uKCZkaW0pKSB7CisgICAgICAgICAgICAgICAgIC8vZ2V0IGFkZGl0aW9uYWwgYnVmZmVyIGNvdW50CisgICAgICAgICAgICAgICAgIHByb3BlcnR5X2dldCgidmlkYy5lbmMuZGN2cy5leHRyYS1idWZmLWNvdW50IiwgdmFsdWUsICIwIik7CisgICAgICAgICAgICAgICAgIGJ1ZmZlckNudCArPSBhdG9pKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmlzWlNMTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gTWV0YURhdGEgYnVmZmVycyBzaG91bGQgYmUgPj0gKFByZXZpZXcgYnVmZmVycy1taW5VbmRlcXVlQ291bnQpCisgICAgICAgICAgICAgICAgYnVmZmVyQ250ID0genNsUUJ1ZmZlcnMgKyBtaW5DaXJjdWxhckJ1Zk51bSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0TnVtT2ZFeHRyYUhEUkluQnVmc0lmTmVlZGVkKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFIRFJPdXRCdWZzSWZOZWVkZWQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JJbWFnZVByb2MoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFfWlNMX1BSRVZJRVdfU1RSRUFNX0JVRjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmZmVyQ250ID0gbWluQ2FwdHVyZUJ1ZmZlcnMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFIRFJJbkJ1ZnNJZk5lZWRlZCgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXROdW1PZkV4dHJhSERST3V0QnVmc0lmTmVlZGVkKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldE1heFVubWF0Y2hlZEZyYW1lc0luUXVldWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX01JTl9TVFJFQU1JTkdfQlVGRkVSUyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JJbWFnZVByb2MoKTsKKworICAgICAgICAgICAgICAgIGlmIChidWZmZXJDbnQgPiB6c2xRQnVmZmVycyArIG1pbkNpcmN1bGFyQnVmTnVtKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckNudCA9IHpzbFFCdWZmZXJzICsgbWluQ2lyY3VsYXJCdWZOdW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKENBTUVSQV9NSU5fTUVUQURBVEFfQlVGRkVSUyA+IGJ1ZmZlckNudCkgeworICAgICAgICAgICAgICAgIGJ1ZmZlckNudCA9IENBTUVSQV9NSU5fTUVUQURBVEFfQlVGRkVSUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0M6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZmZlckNudCA9IG1pbkNhcHR1cmVCdWZmZXJzOworICAgICAgICAgICAgLy8gT25lIG9mIHRoZSB1Ymlmb2N1cyBidWZmZXJzIGlzIG1pc2NlbGxhbmVvdXMgYnVmZmVyCisgICAgICAgICAgICBpZiAobVBhcmFtZXRlcnMuaXNVYmlSZWZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICBidWZmZXJDbnQgLT0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtTG9uZ3Nob3RFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyQ250ID0gbVBhcmFtZXRlcnMuZ2V0TG9uZ3Nob3RTdGFnZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSzoKKyAgICAgICAgYnVmZmVyQ250ID0gQ0FNRVJBX01JTl9DQUxMQkFDS19CVUZGRVJTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUzoKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9ERUZBVUxUOgorICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX01BWDoKKyAgICBkZWZhdWx0OgorICAgICAgICBidWZmZXJDbnQgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBMT0dIKCJCdWZmZXIgY291bnQgPSAlZCBmb3Igc3RyZWFtIHR5cGUgPSAlZCIsIGJ1ZmZlckNudCwgc3RyZWFtX3R5cGUpOworICAgIGlmIChDQU1fTUFYX05VTV9CVUZTX1BFUl9TVFJFQU0gPCBidWZmZXJDbnQpIHsKKyAgICAgICAgTE9HVygiQnVmZmVyIGNvdW50ICVkIGZvciBzdHJlYW0gdHlwZSAlZCBleGNlZWRzIGxpbWl0ICVkIiwKKyAgICAgICAgICAgICAgICAgYnVmZmVyQ250LCBzdHJlYW1fdHlwZSwgQ0FNX01BWF9OVU1fQlVGU19QRVJfU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuIENBTV9NQVhfTlVNX0JVRlNfUEVSX1NUUkVBTTsKKyAgICB9CisKKyAgICByZXR1cm4gKHVpbnQ4X3QpYnVmZmVyQ250OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFsbG9jYXRlU3RyZWFtQnVmCisgKgorICogREVTQ1JJUFRJT046IGFsb2NhdGUgc3RyZWFtIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN0cmVhbV90eXBlICA6IHR5cGUgb2Ygc3RyZWFtCisgKiAgIEBzaXplICAgICAgICAgOiBzaXplIG9mIGJ1ZmZlcgorICogICBAc3RyaWRlICAgICAgIDogc3RyaWRlIG9mIGJ1ZmZlcgorICogICBAc2NhbmxpbmUgICAgIDogc2NhbmxpbmUgb2YgYnVmZmVyCisgKiAgIEBidWZmZXJDbnQgICAgOiBbSU4vT1VUXSBtaW5pbXVtIG51bSBvZiBidWZmZXJzIHRvIGJlIGFsbG9jYXRlZC4KKyAqICAgICAgICAgICAgICAgICAgIGNvdWxkIGJlIG1vZGlmaWVkIGR1cmluZyBhbGxvY2F0aW9uIGlmIG1vcmUgYnVmZmVycyBuZWVkZWQKKyAqCisgKiBSRVRVUk4gICAgIDogcHRyIHRvIGEgbWVtb3J5IG9iaiB0aGF0IGhvbGRzIHN0cmVhbSBidWZmZXJzLgorICogICAgICAgICAgICAgIE5VTEwgaWYgZmFpbGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFNZW1vcnkgKlFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmFsbG9jYXRlU3RyZWFtQnVmKAorICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwgc2l6ZV90IHNpemUsIGludCBzdHJpZGUsIGludCBzY2FubGluZSwKKyAgICAgICAgdWludDhfdCAmYnVmZmVyQ250KQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIFFDYW1lcmFNZW1vcnkgKm1lbSA9IE5VTEw7CisgICAgYm9vbCBiQ2FjaGVkTWVtID0gUUNBTUVSQV9JT05fVVNFX0NBQ0hFOworICAgIGJvb2wgYlBvb2xNZW0gPSBmYWxzZTsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5tZW0udXNlcG9vbCIsIHZhbHVlLCAiMSIpOworICAgIGlmIChhdG9pKHZhbHVlKSA9PSAxKSB7CisgICAgICAgIGJQb29sTWVtID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSBzdHJlYW0gYnVmZmVyIG1lbW9yeSBvYmplY3QKKyAgICBzd2l0Y2ggKHN0cmVhbV90eXBlKSB7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzTm9EaXNwbGF5TW9kZSgpKSB7CisgICAgICAgICAgICAgICAgbWVtID0gbmV3IFFDYW1lcmFTdHJlYW1NZW1vcnkobUdldE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJDYWNoZWRNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAoYlBvb2xNZW0pID8gJm1fbWVtb3J5UG9vbCA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fdHlwZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCBkaW07CisgICAgICAgICAgICAgICAgaW50IG1pbkZQUywgbWF4RlBTOworICAgICAgICAgICAgICAgIFFDYW1lcmFHcmFsbG9jTWVtb3J5ICpncmFsbG9jTWVtb3J5ID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFFDYW1lcmFHcmFsbG9jTWVtb3J5KG1HZXRNZW1vcnkpOworCisgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0U3RyZWFtRGltZW5zaW9uKHN0cmVhbV90eXBlLCBkaW0pOworICAgICAgICAgICAgICAgIC8qIHdlIGFyZSBpbnRlcmVzdGVkIG9ubHkgaW4gbWF4ZnBzIGhlcmUgKi8KKyAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXRQcmV2aWV3RnBzUmFuZ2UoJm1pbkZQUywgJm1heEZQUyk7CisgICAgICAgICAgICAgICAgaW50IHVzYWdlID0gMDsKKyAgICAgICAgICAgICAgICBpZihtUGFyYW1ldGVycy5pc1VCV0NFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FtX2Zvcm1hdF90IGZtdDsKKyAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0U3RyZWFtRm9ybWF0KENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXLGZtdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmbXQgPT0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVUJXQykgeworICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgPSBHUkFMTE9DX1VTQUdFX1BSSVZBVEVfQUxMT0NfVUJXQyA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdyYWxsb2NNZW1vcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY01lbW9yeS0+c2V0TWFwcGFibGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0lOSVRJQUxfTUFQUEFCTEVfUFJFVklFV19CVUZGRVJTKTsKKyAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY01lbW9yeS0+c2V0V2luZG93SW5mbyhtUHJldmlld1dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW0ud2lkdGgsZGltLmhlaWdodCwgc3RyaWRlLCBzY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXRQcmV2aWV3SGFsUGl4ZWxGb3JtYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhGUFMsIHVzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtR3JhbGxvY0xvY2spOworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyQ250ID4gQ0FNRVJBX0lOSVRJQUxfTUFQUEFCTEVfUFJFVklFV19CVUZGRVJTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRW5xdWV1ZWRCdWZmZXJzID0gKGJ1ZmZlckNudCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9JTklUSUFMX01BUFBBQkxFX1BSRVZJRVdfQlVGRkVSUyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRW5xdWV1ZWRCdWZmZXJzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUdyYWxsb2NMb2NrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtID0gZ3JhbGxvY01lbW9yeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzTm9EaXNwbGF5TW9kZSgpIHx8IGlzUHJldmlld1Jlc3RhcnRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBtZW0gPSBuZXcgUUNhbWVyYVN0cmVhbU1lbW9yeShtR2V0TWVtb3J5LCBiQ2FjaGVkTWVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90IGRpbTsKKyAgICAgICAgICAgICAgICBpbnQgbWluRlBTLCBtYXhGUFM7CisgICAgICAgICAgICAgICAgUUNhbWVyYUdyYWxsb2NNZW1vcnkgKmdyYWxsb2NNZW1vcnkgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFFDYW1lcmFHcmFsbG9jTWVtb3J5KG1HZXRNZW1vcnkpOworCisgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0U3RyZWFtRGltZW5zaW9uKHN0cmVhbV90eXBlLCBkaW0pOworICAgICAgICAgICAgICAgIC8qIHdlIGFyZSBpbnRlcmVzdGVkIG9ubHkgaW4gbWF4ZnBzIGhlcmUgKi8KKyAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXRQcmV2aWV3RnBzUmFuZ2UoJm1pbkZQUywgJm1heEZQUyk7CisgICAgICAgICAgICAgICAgaWYgKGdyYWxsb2NNZW1vcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY01lbW9yeS0+c2V0V2luZG93SW5mbyhtUHJldmlld1dpbmRvdywgZGltLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbS5oZWlnaHQsIHN0cmlkZSwgc2NhbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0UHJldmlld0hhbFBpeGVsRm9ybWF0KCksIG1heEZQUyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbSA9IGdyYWxsb2NNZW1vcnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfQU5BTFlTSVM6CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q6CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUkFXOgorICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX09GRkxJTkVfUFJPQzoKKyAgICAgICAgbWVtID0gbmV3IFFDYW1lcmFTdHJlYW1NZW1vcnkobUdldE1lbW9yeSwKKyAgICAgICAgICAgICAgICBiQ2FjaGVkTWVtLAorICAgICAgICAgICAgICAgIChiUG9vbE1lbSkgPyAmbV9tZW1vcnlQb29sIDogTlVMTCwKKyAgICAgICAgICAgICAgICBzdHJlYW1fdHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobU1ldGFkYXRhTWVtID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtZW0gPSBuZXcgUUNhbWVyYU1ldGFkYXRhU3RyZWFtTWVtb3J5KFFDQU1FUkFfSU9OX1VTRV9DQUNIRSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbSA9IG1NZXRhZGF0YU1lbTsKKyAgICAgICAgICAgICAgICBtTWV0YWRhdGFNZW0gPSBOVUxMOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBudW1BZGRpdGlvbmFsQnVmZmVycyA9IGJ1ZmZlckNudCAtIG1lbS0+Z2V0Q250KCk7CisgICAgICAgICAgICAgICAgaWYgKG51bUFkZGl0aW9uYWxCdWZmZXJzID4gMCkgeworICAgICAgICAgICAgICAgICAgICByYyA9IG1lbS0+YWxsb2NhdGVNb3JlKG51bUFkZGl0aW9uYWxCdWZmZXJzLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgYWRkaXRpb25hbCBidWZmZXJzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgYXR0ZW1wdGluZyB0byBwcm9jZWVkLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlckNudCA9IG1lbS0+Z2V0Q250KCk7CisgICAgICAgICAgICAgICAgLy8gVGhlIG1lbW9yeSBpcyBhbHJlYWR5IGFsbG9jYXRlZCAgYW5kIGluaXRpYWxpemVkLCBzbworICAgICAgICAgICAgICAgIC8vIHNpbXBseSByZXR1cm4gaGVyZS4KKyAgICAgICAgICAgICAgICByZXR1cm4gbWVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPOgorICAgICAgICB7CisgICAgICAgICAgICAvL1VzZSB1bmNhY2hlZCBhbGxvY2F0aW9uIGJ5IGRlZmF1bHQKKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5pc1ZpZGVvQnVmZmVyc0NhY2hlZCgpIHx8IG1QYXJhbWV0ZXJzLmlzU2VlTW9yZUVuYWJsZWQoKSB8fAorICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5pc0hpZ2hRdWFsaXR5Tm9pc2VSZWR1Y3Rpb25Nb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBiQ2FjaGVkTWVtID0gUUNBTUVSQV9JT05fVVNFX0NBQ0hFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYkNhY2hlZE1lbSA9IFFDQU1FUkFfSU9OX1VTRV9OT0NBQ0hFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBRQ2FtZXJhVmlkZW9NZW1vcnkgKnZpZGVvTWVtb3J5ID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5nZXRWaWRlb0JhdGNoU2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgdmlkZW9NZW1vcnkgPSBuZXcgUUNhbWVyYVZpZGVvTWVtb3J5KAorICAgICAgICAgICAgICAgICAgICAgICAgbUdldE1lbW9yeSwgRkFMU0UsIFFDQU1FUkFfTUVNX1RZUEVfQkFUQ0gpOworICAgICAgICAgICAgICAgIGlmICh2aWRlb01lbW9yeSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIk91dCBvZiBtZW1vcnkgZm9yIHZpZGVvIGJhdGNoaW5nIG9iaiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqICAgbnVtRkRzID0gQkFUQ0ggc2l6ZQorICAgICAgICAgICAgICAgICogIG51bUludHMgPSA1ICAvLyBPRkZTRVQsIFNJWkUsIFVTQUdFLCBUSU1FU1RBTVAsIEZPUk1BVAorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmMgPSB2aWRlb01lbW9yeS0+YWxsb2NhdGVNZXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX01JTl9WSURFT19CQVRDSF9CVUZGRVJTLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0VmlkZW9CYXRjaFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZJREVPX01FVEFEQVRBX05VTV9JTlRTKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB2aWRlb01lbW9yeTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2aWRlb01lbW9yeSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUUNhbWVyYVZpZGVvTWVtb3J5KG1HZXRNZW1vcnksIGJDYWNoZWRNZW0pOworICAgICAgICAgICAgICAgIGlmICh2aWRlb01lbW9yeSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIk91dCBvZiBtZW1vcnkgZm9yIHZpZGVvIG9iaiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCB1c2FnZSA9IDA7CisgICAgICAgICAgICBjYW1fZm9ybWF0X3QgZm10OworICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0U3RyZWFtRm9ybWF0KENBTV9TVFJFQU1fVFlQRV9WSURFTyxmbXQpOworICAgICAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmlzVUJXQ0VuYWJsZWQoKSAmJiAoZm10ID09IENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyX1VCV0MpKSB7CisgICAgICAgICAgICAgICAgdXNhZ2UgPSBwcml2YXRlX2hhbmRsZV90OjpQUklWX0ZMQUdTX1VCV0NfQUxJR05FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZGVvTWVtb3J5LT5zZXRWaWRlb0luZm8odXNhZ2UsIGZtdCk7CisgICAgICAgICAgICBtZW0gPSB2aWRlb01lbW9yeTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSzoKKyAgICAgICAgbWVtID0gbmV3IFFDYW1lcmFTdHJlYW1NZW1vcnkobUdldE1lbW9yeSwKKyAgICAgICAgICAgICAgICBiQ2FjaGVkTWVtLAorICAgICAgICAgICAgICAgIChiUG9vbE1lbSkgPyAmbV9tZW1vcnlQb29sIDogTlVMTCwKKyAgICAgICAgICAgICAgICBzdHJlYW1fdHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX0RFRkFVTFQ6CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfTUFYOgorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIW1lbSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoYnVmZmVyQ250ID4gMCkgeworICAgICAgICBpZiAobVBhcmFtZXRlcnMuaXNTZWN1cmVNb2RlKCkgJiYKKyAgICAgICAgICAgIChzdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUkFXKSAmJgorICAgICAgICAgICAgKG1QYXJhbWV0ZXJzLmlzUmRpTW9kZSgpKSkgeworICAgICAgICAgICAgTE9HRCgiQWxsb2NhdGluZyAlZCBzZWN1cmUgYnVmZmVycyBvZiBzaXplICVkICIsIGJ1ZmZlckNudCwgc2l6ZSk7CisgICAgICAgICAgICByYyA9IG1lbS0+YWxsb2NhdGUoYnVmZmVyQ250LCBzaXplLCBTRUNVUkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmMgPSBtZW0tPmFsbG9jYXRlKGJ1ZmZlckNudCwgc2l6ZSwgTk9OX1NFQ1VSRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgZGVsZXRlIG1lbTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlckNudCA9IG1lbS0+Z2V0Q250KCk7CisgICAgfQorICAgIExPR0goInJjID0gJWQgdHlwZSA9ICVkIGNvdW50ID0gJWQgc2l6ZSA9ICVkIGNhY2hlID0gJWQsIHBvb2wgPSAlZCIsCisgICAgICAgICAgICByYywgc3RyZWFtX3R5cGUsIGJ1ZmZlckNudCwgc2l6ZSwgYkNhY2hlZE1lbSwgYlBvb2xNZW0pOworICAgIHJldHVybiBtZW07Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWxsb2NhdGVNb3JlU3RyZWFtQnVmCisgKgorICogREVTQ1JJUFRJT046IGFsb2NhdGUgbW9yZSBzdHJlYW0gYnVmZmVycyBmcm9tIHRoZSBtZW1vcnkgb2JqZWN0CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtZW1fb2JqICAgICAgOiBtZW1vcnkgb2JqZWN0IHB0cgorICogICBAc2l6ZSAgICAgICAgIDogc2l6ZSBvZiBidWZmZXIKKyAqICAgQGJ1ZmZlckNudCAgICA6IFtJTi9PVVRdIGFkZGl0aW9uYWwgbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkLgorICogICAgICAgICAgICAgICAgICAgb3V0cHV0IHdpbGwgYmUgdGhlIG51bWJlciBvZiB0b3RhbCBidWZmZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjphbGxvY2F0ZU1vcmVTdHJlYW1CdWYoCisgICAgICAgIFFDYW1lcmFNZW1vcnkgKm1lbV9vYmosIHNpemVfdCBzaXplLCB1aW50OF90ICZidWZmZXJDbnQpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisKKyAgICBpZiAoYnVmZmVyQ250ID4gMCkgeworICAgICAgICByYyA9IG1lbV9vYmotPmFsbG9jYXRlTW9yZShidWZmZXJDbnQsIHNpemUpOworICAgICAgICBidWZmZXJDbnQgPSBtZW1fb2JqLT5nZXRDbnQoKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFsbG9jYXRlTWlzY0J1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBhbG9jYXRlIG1pc2NlbGxhbmVvdXMgYnVmZmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdHJlYW1JbmZvICA6IHN0cmVhbSBpbmZvCisgKgorICogUkVUVVJOICAgICA6IHB0ciB0byBhIG1lbW9yeSBvYmogdGhhdCBob2xkcyBzdHJlYW0gaW5mbyBidWZmZXIuCisgKiAgICAgICAgICAgICAgTlVMTCBpZiBmYWlsZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYUhlYXBNZW1vcnkgKlFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmFsbG9jYXRlTWlzY0J1ZigKKyAgICAgICAgY2FtX3N0cmVhbV9pbmZvX3QgKnN0cmVhbUluZm8pCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgdWludDhfdCBidWZOdW0gPSAwOworICAgIHNpemVfdCBidWZTaXplID0gMDsKKyAgICBRQ2FtZXJhSGVhcE1lbW9yeSAqbWlzY0J1ZiA9IE5VTEw7CisgICAgY2FtX2ZlYXR1cmVfbWFza190IGZlYXR1cmVfbWFzayA9CisgICAgICAgICAgICBzdHJlYW1JbmZvLT5yZXByb2Nlc3NfY29uZmlnLnBwX2ZlYXR1cmVfY29uZmlnLmZlYXR1cmVfbWFzazsKKworICAgIHN3aXRjaCAoc3RyZWFtSW5mby0+c3RyZWFtX3R5cGUpIHsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0M6CisgICAgICAgIGlmIChDQU1fUUNPTV9GRUFUVVJFX1RSVUVQT1JUUkFJVCAmIGZlYXR1cmVfbWFzaykgeworICAgICAgICAgICAgYnVmTnVtID0gMTsKKyAgICAgICAgICAgIGJ1ZlNpemUgPSBtUGFyYW1ldGVycy5nZXRUUE1heE1ldGFTaXplKCk7CisgICAgICAgIH0gZWxzZSBpZiAoQ0FNX1FDT01fRkVBVFVSRV9SRUZPQ1VTICYgZmVhdHVyZV9tYXNrKSB7CisgICAgICAgICAgICBidWZOdW0gPSAxOworICAgICAgICAgICAgYnVmU2l6ZSA9IG1QYXJhbWV0ZXJzLmdldFJlZm9jdXNNYXhNZXRhU2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChidWZOdW0gJiYgYnVmU2l6ZSkgeworICAgICAgICBtaXNjQnVmID0gbmV3IFFDYW1lcmFIZWFwTWVtb3J5KFFDQU1FUkFfSU9OX1VTRV9DQUNIRSk7CisKKyAgICAgICAgaWYgKCFtaXNjQnVmKSB7CisgICAgICAgICAgICBMT0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgbWlzY0J1ZiBvYmplY3QiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBtaXNjQnVmLT5hbGxvY2F0ZShidWZOdW0sIGJ1ZlNpemUsIE5PTl9TRUNVUkUpOworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWlzYyBidWZmZXIgbWVtb3J5Iik7CisgICAgICAgICAgICBkZWxldGUgbWlzY0J1ZjsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG1pc2NCdWY7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWxsb2NhdGVTdHJlYW1JbmZvQnVmCisgKgorICogREVTQ1JJUFRJT046IGFsb2NhdGUgc3RyZWFtIGluZm8gYnVmZmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdHJlYW1fdHlwZSAgOiB0eXBlIG9mIHN0cmVhbQorICoKKyAqIFJFVFVSTiAgICAgOiBwdHIgdG8gYSBtZW1vcnkgb2JqIHRoYXQgaG9sZHMgc3RyZWFtIGluZm8gYnVmZmVyLgorICogICAgICAgICAgICAgIE5VTEwgaWYgZmFpbGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFIZWFwTWVtb3J5ICpRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjphbGxvY2F0ZVN0cmVhbUluZm9CdWYoCisgICAgICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBib29sIHJhd195dXYgPSBmYWxzZTsKKyAgICBpbnQzMl90IGR0ID0gMDsKKyAgICBpbnQzMl90IHZjID0gMDsKKworCisgICAgUUNhbWVyYUhlYXBNZW1vcnkgKnN0cmVhbUluZm9CdWYgPSBuZXcgUUNhbWVyYUhlYXBNZW1vcnkoUUNBTUVSQV9JT05fVVNFX0NBQ0hFKTsKKyAgICBpZiAoIXN0cmVhbUluZm9CdWYpIHsKKyAgICAgICAgTE9HRSgiYWxsb2NhdGVTdHJlYW1JbmZvQnVmOiBVbmFibGUgdG8gYWxsb2NhdGUgc3RyZWFtSW5mbyBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmMgPSBzdHJlYW1JbmZvQnVmLT5hbGxvY2F0ZSgxLCBzaXplb2YoY2FtX3N0cmVhbV9pbmZvX3QpLCBOT05fU0VDVVJFKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoImFsbG9jYXRlU3RyZWFtSW5mb0J1ZjogRmFpbGVkIHRvIGFsbG9jYXRlIHN0cmVhbSBpbmZvIG1lbW9yeSIpOworICAgICAgICBkZWxldGUgc3RyZWFtSW5mb0J1ZjsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY2FtX3N0cmVhbV9pbmZvX3QgKnN0cmVhbUluZm8gPSAoY2FtX3N0cmVhbV9pbmZvX3QgKilzdHJlYW1JbmZvQnVmLT5nZXRQdHIoMCk7CisgICAgbWVtc2V0KHN0cmVhbUluZm8sIDAsIHNpemVvZihjYW1fc3RyZWFtX2luZm9fdCkpOworICAgIHN0cmVhbUluZm8tPnN0cmVhbV90eXBlID0gc3RyZWFtX3R5cGU7CisgICAgcmMgPSBtUGFyYW1ldGVycy5nZXRTdHJlYW1Gb3JtYXQoc3RyZWFtX3R5cGUsIHN0cmVhbUluZm8tPmZtdCk7CisgICAgcmMgPSBtUGFyYW1ldGVycy5nZXRTdHJlYW1EaW1lbnNpb24oc3RyZWFtX3R5cGUsIHN0cmVhbUluZm8tPmRpbSk7CisgICAgcmMgPSBtUGFyYW1ldGVycy5nZXRTdHJlYW1Sb3RhdGlvbihzdHJlYW1fdHlwZSwgc3RyZWFtSW5mby0+cHBfY29uZmlnLCBzdHJlYW1JbmZvLT5kaW0pOworICAgIHN0cmVhbUluZm8tPm51bV9idWZzID0gZ2V0QnVmTnVtUmVxdWlyZWQoc3RyZWFtX3R5cGUpOworICAgIHN0cmVhbUluZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0NPTlRJTlVPVVM7CisgICAgc3RyZWFtSW5mby0+aXNfc2VjdXJlID0gTk9OX1NFQ1VSRTsKKworICAgIHN3aXRjaCAoc3RyZWFtX3R5cGUpIHsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVDoKKyAgICAgICAgaWYgKChtUGFyYW1ldGVycy5pc1pTTE1vZGUoKSAmJiBtUGFyYW1ldGVycy5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKSAhPSB0cnVlKSB8fAorICAgICAgICAgICAgbUxvbmdzaG90RW5hYmxlZCkgeworICAgICAgICAgICAgc3RyZWFtSW5mby0+c3RyZWFtaW5nX21vZGUgPSBDQU1fU1RSRUFNSU5HX01PREVfQ09OVElOVU9VUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmVhbUluZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0JVUlNUOworICAgICAgICAgICAgc3RyZWFtSW5mby0+bnVtX29mX2J1cnN0ID0gKHVpbnQ4X3QpCisgICAgICAgICAgICAgICAgICAgIChtUGFyYW1ldGVycy5nZXROdW1PZlNuYXBzaG90cygpCisgICAgICAgICAgICAgICAgICAgICAgICArIG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFIRFJJbkJ1ZnNJZk5lZWRlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAtIG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFIRFJPdXRCdWZzSWZOZWVkZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBtUGFyYW1ldGVycy5nZXROdW1PZkV4dHJhQnVmZmVyc0ZvckltYWdlUHJvYygpKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9SQVc6CisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEucmF3X3l1diIsIHZhbHVlLCAiMCIpOworICAgICAgICByYXdfeXV2ID0gYXRvaSh2YWx1ZSkgPiAwID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBpZiAoKG1QYXJhbWV0ZXJzLmlzWlNMTW9kZSgpKSB8fCAoaXNSZGlNb2RlKCkpIHx8IChyYXdfeXV2KSkgeworICAgICAgICAgICAgc3RyZWFtSW5mby0+c3RyZWFtaW5nX21vZGUgPSBDQU1fU1RSRUFNSU5HX01PREVfQ09OVElOVU9VUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmVhbUluZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0JVUlNUOworICAgICAgICAgICAgc3RyZWFtSW5mby0+bnVtX29mX2J1cnN0ID0gbVBhcmFtZXRlcnMuZ2V0TnVtT2ZTbmFwc2hvdHMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVBhcmFtZXRlcnMuaXNTZWN1cmVNb2RlKCkgJiYgbVBhcmFtZXRlcnMuaXNSZGlNb2RlKCkpIHsKKyAgICAgICAgICAgIHN0cmVhbUluZm8tPmlzX3NlY3VyZSA9IFNFQ1VSRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmVhbUluZm8tPmlzX3NlY3VyZSA9IE5PTl9TRUNVUkU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENBTV9GT1JNQVRfTUVUQV9SQVdfMTBCSVQgPT0gc3RyZWFtSW5mby0+Zm10KSB7CisgICAgICAgICAgICBtUGFyYW1ldGVycy51cGRhdGVEdFZjKCZkdCwgJnZjKTsKKyAgICAgICAgICAgIGlmIChkdCkKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLT5kdCA9IGR0OworICAgICAgICAgICAgc3RyZWFtSW5mby0+dmMgPSB2YzsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1BPU1RWSUVXOgorICAgICAgICBpZiAobUxvbmdzaG90RW5hYmxlZCkgeworICAgICAgICAgICAgc3RyZWFtSW5mby0+c3RyZWFtaW5nX21vZGUgPSBDQU1fU1RSRUFNSU5HX01PREVfQ09OVElOVU9VUzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmVhbUluZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0JVUlNUOworICAgICAgICAgICAgc3RyZWFtSW5mby0+bnVtX29mX2J1cnN0ID0gKHVpbnQ4X3QpKG1QYXJhbWV0ZXJzLmdldE51bU9mU25hcHNob3RzKCkKKyAgICAgICAgICAgICAgICArIG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFIRFJJbkJ1ZnNJZk5lZWRlZCgpCisgICAgICAgICAgICAgICAgLSBtUGFyYW1ldGVycy5nZXROdW1PZkV4dHJhSERST3V0QnVmc0lmTmVlZGVkKCkKKyAgICAgICAgICAgICAgICArIG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFCdWZmZXJzRm9ySW1hZ2VQcm9jKCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPOgorICAgICAgICBzdHJlYW1JbmZvLT5kaXNfZW5hYmxlID0gbVBhcmFtZXRlcnMuaXNESVNFbmFibGVkKCk7CisgICAgICAgIGlmIChtUGFyYW1ldGVycy5nZXRCdWZCYXRjaENvdW50KCkpIHsKKyAgICAgICAgICAgIC8vVXBkYXRlIHN0cmVhbSBpbmZvIHN0cnVjdHVyZSB3aXRoIGJhdGNoIG1vZGUgaW5mbworICAgICAgICAgICAgc3RyZWFtSW5mby0+c3RyZWFtaW5nX21vZGUgPSBDQU1fU1RSRUFNSU5HX01PREVfQkFUQ0g7CisgICAgICAgICAgICBzdHJlYW1JbmZvLT51c2VyX2J1Zl9pbmZvLmZyYW1lX2J1Zl9jbnQgPSBtUGFyYW1ldGVycy5nZXRCdWZCYXRjaENvdW50KCk7CisgICAgICAgICAgICBzdHJlYW1JbmZvLT51c2VyX2J1Zl9pbmZvLnNpemUgPQorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKHNpemVvZihzdHJ1Y3QgbXNtX2NhbWVyYV91c2VyX2J1Zl9jb250X3QpKTsKKyAgICAgICAgICAgIGNhbV9mcHNfcmFuZ2VfdCBwRnBzUmFuZ2U7CisgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXRIZnJGcHMocEZwc1JhbmdlKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8tPnVzZXJfYnVmX2luZm8uZnJhbWVJbnRlcnZhbCA9CisgICAgICAgICAgICAgICAgICAgIChsb25nKSgoMTAwMC9wRnBzUmFuZ2UudmlkZW9fbWF4X2ZwcykgKiAxMDAwKTsKKyAgICAgICAgICAgIExPR0goIlZpZGVvIEJhdGNoIENvdW50ID0gJWQsIGludGVydmFsID0gJWQiLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLT51c2VyX2J1Zl9pbmZvLmZyYW1lX2J1Zl9jbnQsCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8tPnVzZXJfYnVmX2luZm8uZnJhbWVJbnRlcnZhbCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmdldFJlY29yZGluZ0hpbnRWYWx1ZSgpKSB7CisgICAgICAgICAgICBpZihtUGFyYW1ldGVycy5pc0RJU0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIHN0cmVhbUluZm8tPmlzX3R5cGUgPSBtUGFyYW1ldGVycy5nZXRWaWRlb0lTVHlwZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLT5pc190eXBlID0gSVNfVFlQRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtUGFyYW1ldGVycy5pc1NlY3VyZU1vZGUoKSkgeworICAgICAgICAgICAgc3RyZWFtSW5mby0+aXNfc2VjdXJlID0gU0VDVVJFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVc6CisgICAgICAgIGlmIChtUGFyYW1ldGVycy5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKSkgeworICAgICAgICAgICAgaWYobVBhcmFtZXRlcnMuaXNESVNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLT5pc190eXBlID0gbVBhcmFtZXRlcnMuZ2V0UHJldmlld0lTVHlwZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLT5pc190eXBlID0gSVNfVFlQRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtUGFyYW1ldGVycy5pc1NlY3VyZU1vZGUoKSkgeworICAgICAgICAgICAgc3RyZWFtSW5mby0+aXNfc2VjdXJlID0gU0VDVVJFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTOgorICAgICAgICBzdHJlYW1JbmZvLT5ub0ZyYW1lRXhwZWN0ZWQgPSAxOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBVcGRhdGUgZmVhdHVyZSBtYXNrCisgICAgbVBhcmFtZXRlcnMudXBkYXRlUHBGZWF0dXJlTWFzayhzdHJlYW1fdHlwZSk7CisKKyAgICAvLyBHZXQgZmVhdHVyZSBtYXNrCisgICAgbVBhcmFtZXRlcnMuZ2V0U3RyZWFtUHBNYXNrKHN0cmVhbV90eXBlLCBzdHJlYW1JbmZvLT5wcF9jb25maWcuZmVhdHVyZV9tYXNrKTsKKworICAgIC8vIFVwZGF0ZSBwcCBjb25maWcKKyAgICBpZiAoc3RyZWFtSW5mby0+cHBfY29uZmlnLmZlYXR1cmVfbWFzayAmIENBTV9RQ09NX0ZFQVRVUkVfRkxJUCkgeworICAgICAgICBpbnQgZmxpcE1vZGUgPSBtUGFyYW1ldGVycy5nZXRGbGlwTW9kZShzdHJlYW1fdHlwZSk7CisgICAgICAgIGlmIChmbGlwTW9kZSA+IDApIHsKKyAgICAgICAgICAgIHN0cmVhbUluZm8tPnBwX2NvbmZpZy5mbGlwID0gKHVpbnQzMl90KWZsaXBNb2RlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdHJlYW1JbmZvLT5wcF9jb25maWcuZmVhdHVyZV9tYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9TSEFSUE5FU1MpIHsKKyAgICAgICAgc3RyZWFtSW5mby0+cHBfY29uZmlnLnNoYXJwbmVzcyA9IG1QYXJhbWV0ZXJzLmdldFNoYXJwbmVzcygpOworICAgIH0KKyAgICBpZiAoc3RyZWFtSW5mby0+cHBfY29uZmlnLmZlYXR1cmVfbWFzayAmIENBTV9RQ09NX0ZFQVRVUkVfRUZGRUNUKSB7CisgICAgICAgIHN0cmVhbUluZm8tPnBwX2NvbmZpZy5lZmZlY3QgPSBtUGFyYW1ldGVycy5nZXRFZmZlY3RWYWx1ZSgpOworICAgIH0KKworICAgIGlmIChzdHJlYW1JbmZvLT5wcF9jb25maWcuZmVhdHVyZV9tYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9ERU5PSVNFMkQpIHsKKyAgICAgICAgc3RyZWFtSW5mby0+cHBfY29uZmlnLmRlbm9pc2UyZC5kZW5vaXNlX2VuYWJsZSA9IDE7CisgICAgICAgIHN0cmVhbUluZm8tPnBwX2NvbmZpZy5kZW5vaXNlMmQucHJvY2Vzc19wbGF0ZXMgPQorICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldERlbm9pc2VQcm9jZXNzUGxhdGUoQ0FNX0lOVEZfUEFSTV9XQVZFTEVUX0RFTk9JU0UpOworICAgIH0KKworICAgIGlmICghKChuZWVkUmVwcm9jZXNzKCkpICYmIChDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QgPT0gc3RyZWFtX3R5cGUgfHwKKyAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9SQVcgPT0gc3RyZWFtX3R5cGUpKSkgeworICAgICAgICBpZiAoZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYKKyAgICAgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX0NST1ApCisgICAgICAgICAgICBzdHJlYW1JbmZvLT5wcF9jb25maWcuZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfQ1JPUDsKKyAgICAgICAgaWYgKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnFjb21fc3VwcG9ydGVkX2ZlYXR1cmVfbWFzayAmCisgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9TQ0FMRSkKKyAgICAgICAgICAgIHN0cmVhbUluZm8tPnBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9TQ0FMRTsKKyAgICB9CisKKyAgICBMT0dIKCJ0eXBlICVkLCBmbXQgJWQsIGRpbSAlZHglZCwgbnVtX2J1ZnMgJWQgbWFzayA9IDB4JXggaXNfdHlwZSAlZFxuIiwKKyAgICAgICAgICAgc3RyZWFtX3R5cGUsIHN0cmVhbUluZm8tPmZtdCwgc3RyZWFtSW5mby0+ZGltLndpZHRoLAorICAgICAgICAgICBzdHJlYW1JbmZvLT5kaW0uaGVpZ2h0LCBzdHJlYW1JbmZvLT5udW1fYnVmcywKKyAgICAgICAgICAgc3RyZWFtSW5mby0+cHBfY29uZmlnLmZlYXR1cmVfbWFzaywKKyAgICAgICAgICAgc3RyZWFtSW5mby0+aXNfdHlwZSk7CisKKyAgICByZXR1cm4gc3RyZWFtSW5mb0J1ZjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhbGxvY2F0ZVN0cmVhbVVzZXJCdWYKKyAqCisgKiBERVNDUklQVElPTjogYWxsb2NhdGUgdXNlciBwdHIgZm9yIHN0cmVhbSBidWZmZXJzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdHJlYW1JbmZvICA6IHN0cmVhbSBpbmZvIHN0cnVjdHVyZQorICoKKyAqIFJFVFVSTiAgICAgOiBwdHIgdG8gYSBtZW1vcnkgb2JqIHRoYXQgaG9sZHMgc3RyZWFtIGluZm8gYnVmZmVyLgorICogICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgZmFpbGVkCisKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYU1lbW9yeSAqUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6YWxsb2NhdGVTdHJlYW1Vc2VyQnVmKAorICAgICAgICBjYW1fc3RyZWFtX2luZm9fdCAqc3RyZWFtSW5mbykKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICBRQ2FtZXJhTWVtb3J5ICptZW0gPSBOVUxMOworICAgIGludCBzaXplID0gMDsKKworICAgIGlmIChzdHJlYW1JbmZvLT5zdHJlYW1pbmdfbW9kZSAhPSBDQU1fU1RSRUFNSU5HX01PREVfQkFUQ0gpIHsKKyAgICAgICAgTE9HRSgiU3RyZWFtIGlzIG5vdCBpbiBCQVRDSCBtb2RlLiBJbnZhbGlkIFN0cmVhbSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSBzdHJlYW0gdXNlciBidWZmZXIgbWVtb3J5IG9iamVjdAorICAgIHN3aXRjaCAoc3RyZWFtSW5mby0+c3RyZWFtX3R5cGUpIHsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9WSURFTzogeworICAgICAgICBRQ2FtZXJhVmlkZW9NZW1vcnkgKnZpZGVvX21lbSA9IG5ldyBRQ2FtZXJhVmlkZW9NZW1vcnkoCisgICAgICAgICAgICAgICAgbUdldE1lbW9yeSwgRkFMU0UsIFFDQU1FUkFfTUVNX1RZUEVfQkFUQ0gpOworICAgICAgICBpZiAodmlkZW9fbWVtID09IE5VTEwpIHsKKyAgICAgICAgICAgIExPR0UoIk91dCBvZiBtZW1vcnkgZm9yIHZpZGVvIG9iaiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgKiAgIG51bUZEcyA9IEJBVENIIHNpemUKKyAgICAgICAgKiAgbnVtSW50cyA9IDUgIC8vIE9GRlNFVCwgU0laRSwgVVNBR0UsIFRJTUVTVEFNUCwgRk9STUFUCisgICAgICAgICovCisgICAgICAgIHJjID0gdmlkZW9fbWVtLT5hbGxvY2F0ZU1ldGEoc3RyZWFtSW5mby0+bnVtX2J1ZnMsCisgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0QnVmQmF0Y2hDb3VudCgpLCBWSURFT19NRVRBREFUQV9OVU1fSU5UUyk7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIExPR0UoImFsbG9jYXRlTWV0YSBmYWlsZWQiKTsKKyAgICAgICAgICAgIGRlbGV0ZSB2aWRlb19tZW07CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpbnQgdXNhZ2UgPSAwOworICAgICAgICBjYW1fZm9ybWF0X3QgZm10OworICAgICAgICBtUGFyYW1ldGVycy5nZXRTdHJlYW1Gb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX1ZJREVPLCBmbXQpOworICAgICAgICBpZihtUGFyYW1ldGVycy5pc1VCV0NFbmFibGVkKCkgJiYgKGZtdCA9PSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9VQldDKSkgeworICAgICAgICAgICAgdXNhZ2UgPSBwcml2YXRlX2hhbmRsZV90OjpQUklWX0ZMQUdTX1VCV0NfQUxJR05FRDsKKyAgICAgICAgfQorICAgICAgICB2aWRlb19tZW0tPnNldFZpZGVvSW5mbyh1c2FnZSwgZm10KTsKKyAgICAgICAgbWVtID0gc3RhdGljX2Nhc3Q8UUNhbWVyYU1lbW9yeSAqPih2aWRlb19tZW0pOworICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVc6CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVc6CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfQU5BTFlTSVM6CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q6CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUkFXOgorICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBOgorICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX09GRkxJTkVfUFJPQzoKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSzoKKyAgICAgICAgTE9HRSgiU3RyZWFtIHR5cGUgTm90IHN1cHBvcnRlZC5mb3IgQkFUQ0ggcHJvY2Vzc2luZyIpOworICAgIGJyZWFrOworCisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfREVGQVVMVDoKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9NQVg6CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghbWVtKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW0iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLypTaXplIG9mIHRoaXMgYnVmZmVyIHdpbGwgYmUgbnVtYmVyIG9mIGJhdGNoIGJ1ZmZlciAqLworICAgIHNpemUgPSBQQURfVE9fU0laRSgoc3RyZWFtSW5mby0+bnVtX2J1ZnMgKiBzdHJlYW1JbmZvLT51c2VyX2J1Zl9pbmZvLnNpemUpLAorICAgICAgICAgICAgQ0FNX1BBRF9UT180Syk7CisKKyAgICBMT0dIKCJBbGxvY2F0aW5nIEJBVENIIEJ1ZmZlciBjb3VudCA9ICVkIiwgc3RyZWFtSW5mby0+bnVtX2J1ZnMpOworCisgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgIC8vIEFsbG9jYXRpbmcgb25lIGJ1ZmZlciBmb3IgYWxsIGJhdGNoIGJ1ZmZlcnMKKyAgICAgICAgcmMgPSBtZW0tPmFsbG9jYXRlKDEsIHNpemUsIE5PTl9TRUNVUkUpOworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBkZWxldGUgbWVtOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1lbTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHdhaXRGb3JEZWZlcnJlZEFsbG9jCisgKgorICogREVTQ1JJUFRJT046IFdhaXQgZm9yIGRlZmVycmVkIGFsbG9jYXRpb24sIGlmIGFwcGxpY2FibGUKKyAqICAgICAgICAgICAgICAoYXBwbGljYWJsZSBvbmx5IGZvciBtZXRhZGF0YSBidWZmZXJzIHNvIGZhcikKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN0cmVhbV90eXBlICA6IHR5cGUgb2Ygc3RyZWFtIHRvIChwb3NzaWJseSkgd2FpdCBmb3IKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OndhaXRGb3JEZWZlcnJlZEFsbG9jKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlKQoreworICAgIGlmIChzdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpIHsKKyAgICAgICAgd2FpdERlZmVycmVkV29yayhtTWV0YWRhdGFBbGxvY0pvYik7CisgICAgfQorfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0UHJldmlld1dpbmRvdworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgcHJldmlldyB3aW5kb3cgaW1wbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAd2luZG93ICA6IHB0ciB0byB3aW5kb3cgb3BzIHRhYmxlIHN0cnVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzZXRQcmV2aWV3V2luZG93KAorICAgICAgICBzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3aW5kb3cpCit7CisgICAgbVByZXZpZXdXaW5kb3cgPSB3aW5kb3c7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldENhbGxCYWNrcworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgY2FsbGJhY2tzIGltcGwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG5vdGlmeV9jYiAgOiBub3RpZnkgY2IKKyAqICAgQGRhdGFfY2IgICAgOiBkYXRhIGNiCisgKiAgIEBkYXRhX2NiX3RpbWVzdGFtcCA6IGRhdGEgY2Igd2l0aCB0aW1lIHN0YW1wCisgKiAgIEBnZXRfbWVtb3J5IDogcmVxdWVzdCBtZW1vcnkgb3BzIHRhYmxlCisgKiAgIEB1c2VyICAgICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzZXRDYWxsQmFja3MoY2FtZXJhX25vdGlmeV9jYWxsYmFjayBub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9kYXRhX2NhbGxiYWNrIGRhdGFfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9kYXRhX3RpbWVzdGFtcF9jYWxsYmFjayBkYXRhX2NiX3RpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX3JlcXVlc3RfbWVtb3J5IGdldF9tZW1vcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXIpCit7CisgICAgbU5vdGlmeUNiICAgICAgICA9IG5vdGlmeV9jYjsKKyAgICBtRGF0YUNiICAgICAgICAgID0gZGF0YV9jYjsKKyAgICBtRGF0YUNiVGltZXN0YW1wID0gZGF0YV9jYl90aW1lc3RhbXA7CisgICAgbUdldE1lbW9yeSAgICAgICA9IGdldF9tZW1vcnk7CisgICAgbUNhbGxiYWNrQ29va2llICA9IHVzZXI7CisgICAgbV9jYk5vdGlmaWVyLnNldENhbGxiYWNrcyhub3RpZnlfY2IsIGRhdGFfY2IsIGRhdGFfY2JfdGltZXN0YW1wLCB1c2VyKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0SnBlZ0NhbGxCYWNrcworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgSlBFRyBjYWxsYmFja3MgaW1wbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAanBlZ0NiICA6IEpwZWcgY2FsbGJhY2sgbWV0aG9kCisgKiAgIEBjYWxsYmFja0Nvb2tpZSAgICA6IGNhbGxiYWNrIGNvb2tpZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c2V0SnBlZ0NhbGxCYWNrcyhqcGVnX2RhdGFfY2FsbGJhY2sganBlZ0NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjYWxsYmFja0Nvb2tpZSkKK3sKKyAgICBMT0dIKCJjYW1lcmEgaWQgJWQiLCBnZXRDYW1lcmFJZCgpKTsKKyAgICBtSnBlZ0NiICAgICAgICA9IGpwZWdDYjsKKyAgICBtSnBlZ0NhbGxiYWNrQ29va2llICA9IGNhbGxiYWNrQ29va2llOworICAgIG1fY2JOb3RpZmllci5zZXRKcGVnQ2FsbEJhY2tzKG1KcGVnQ2IsIG1KcGVnQ2FsbGJhY2tDb29raWUpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGVuYWJsZU1zZ1R5cGUKKyAqCisgKiBERVNDUklQVElPTjogZW5hYmxlIG1zZyB0eXBlIGltcGwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1zZ190eXBlICA6IG1zZyB0eXBlIG1hc2sgdG8gYmUgZW5hYmxlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjplbmFibGVNc2dUeXBlKGludDMyX3QgbXNnX3R5cGUpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKG1QYXJhbWV0ZXJzLmlzVUJXQ0VuYWJsZWQoKSkgeworICAgICAgICAvKk5lZWQgU3BlY2lhbCBDQUxMQkFDSyBzdHJlYW0gaW5jYXNlIGFwcGxpY2F0aW9uIHJlcXVlc3RpbmcgZm9yCisgICAgICAgICAgICAgIFByZXZpZXcgY2FsbGJhY2sgIGluIFVCV0MgY2FzZSovCisgICAgICAgIGlmICghKG1zZ1R5cGVFbmFibGVkKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSkpICYmCisgICAgICAgICAgICAgICAgKG1zZ190eXBlICYgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKSkgeworICAgICAgICAgICAgLy8gU3RhcnQgY2FsbGJhY2sgY2hhbm5lbCBvbmx5IHdoZW4gcHJldmlldy96c2wgY2hhbm5lbCBpcyBhY3RpdmUKKyAgICAgICAgICAgIFFDYW1lcmFDaGFubmVsKiBwcmV2aWV3Q2ggPSBOVUxMOworICAgICAgICAgICAgaWYgKGlzWlNMTW9kZSgpICYmIChnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSAhPSB0cnVlKSkgeworICAgICAgICAgICAgICAgIHByZXZpZXdDaCA9IG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1pTTF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByZXZpZXdDaCA9IG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1BSRVZJRVddOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUUNhbWVyYUNoYW5uZWwqIGNhbGxiYWNrQ2ggPSBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9DQUxMQkFDS107CisgICAgICAgICAgICBpZiAoKGNhbGxiYWNrQ2ggIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHByZXZpZXdDaCAhPSBOVUxMKSAmJiBwcmV2aWV3Q2gtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICByYyA9IHN0YXJ0Q2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfQ0FMTEJBQ0spOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJTVEFSVCBDYWxsYmFjayBDaGFubmVsIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtTXNnRW5hYmxlZCB8PSBtc2dfdHlwZTsKKyAgICBMT0dIKCIoMHgleCkgOiBtTXNnRW5hYmxlZCA9IDB4JXggcmMgPSAlZCIsIG1zZ190eXBlICwgbU1zZ0VuYWJsZWQsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGlzYWJsZU1zZ1R5cGUKKyAqCisgKiBERVNDUklQVElPTjogZGlzYWJsZSBtc2cgdHlwZSBpbXBsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtc2dfdHlwZSAgOiBtc2cgdHlwZSBtYXNrIHRvIGJlIGRpc2FibGVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmRpc2FibGVNc2dUeXBlKGludDMyX3QgbXNnX3R5cGUpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKG1QYXJhbWV0ZXJzLmlzVUJXQ0VuYWJsZWQoKSkgeworICAgICAgICAvKlNUT1AgQ0FMTEJBQ0sgU1RSRUFNKi8KKyAgICAgICAgaWYgKChtc2dUeXBlRW5hYmxlZChDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpKSAmJgorICAgICAgICAgICAgICAgIChtc2dfdHlwZSAmIENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSkpIHsKKyAgICAgICAgICAgIC8vIFN0b3AgY2FsbGJhY2sgY2hhbm5lbCBvbmx5IGlmIGl0IGlzIGFjdGl2ZQorICAgICAgICAgICAgaWYgKChtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9DQUxMQkFDS10gIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAobV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfQ0FMTEJBQ0tdLT5pc0FjdGl2ZSgpKSkgeworICAgICAgICAgICAgICAgIHJjID0gc3RvcENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX0NBTExCQUNLKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiU1RPUCBDYWxsYmFjayBDaGFubmVsIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtTXNnRW5hYmxlZCAmPSB+bXNnX3R5cGU7CisgICAgTE9HSCgiKDB4JXgpIDogbU1zZ0VuYWJsZWQgPSAweCV4IHJjID0gJWQiLCBtc2dfdHlwZSAsIG1Nc2dFbmFibGVkLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1zZ1R5cGVFbmFibGVkCisgKgorICogREVTQ1JJUFRJT046IGltcGwgdG8gZGV0ZXJtaW5lIGlmIGNlcnRhaW4gbXNnX3R5cGUgaXMgZW5hYmxlZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXNnX3R5cGUgIDogbXNnIHR5cGUgbWFzaworICoKKyAqIFJFVFVSTiAgICAgOiAwIC0tIG5vdCBlbmFibGVkCisgKiAgICAgICAgICAgICAgbm9uZSAwIC0tIGVuYWJsZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6Om1zZ1R5cGVFbmFibGVkKGludDMyX3QgbXNnX3R5cGUpCit7CisgICAgcmV0dXJuIChtTXNnRW5hYmxlZCAmIG1zZ190eXBlKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtc2dUeXBlRW5hYmxlZFdpdGhMb2NrCisgKgorICogREVTQ1JJUFRJT046IGltcGwgdG8gZGV0ZXJtaW5lIGlmIGNlcnRhaW4gbXNnX3R5cGUgaXMgZW5hYmxlZCB3aXRoIGxvY2sKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1zZ190eXBlICA6IG1zZyB0eXBlIG1hc2sKKyAqCisgKiBSRVRVUk4gICAgIDogMCAtLSBub3QgZW5hYmxlZAorICogICAgICAgICAgICAgIG5vbmUgMCAtLSBlbmFibGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjptc2dUeXBlRW5hYmxlZFdpdGhMb2NrKGludDMyX3QgbXNnX3R5cGUpCit7CisgICAgaW50IGVuYWJsZWQgPSAwOworICAgIGxvY2tBUEkoKTsKKyAgICBlbmFibGVkID0gbU1zZ0VuYWJsZWQgJiBtc2dfdHlwZTsKKyAgICB1bmxvY2tBUEkoKTsKKyAgICByZXR1cm4gZW5hYmxlZDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdGFydFByZXZpZXcKKyAqCisgKiBERVNDUklQVElPTjogc3RhcnQgcHJldmlldyBpbXBsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c3RhcnRQcmV2aWV3KCkKK3sKKyAgICBLUElfQVRSQUNFX0NBTEwoKTsKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBMT0dJKCJFIFpTTCA9ICVkIFJlY29yZGluZyBIaW50ID0gJWQiLCBtUGFyYW1ldGVycy5pc1pTTE1vZGUoKSwKKyAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldFJlY29yZGluZ0hpbnRWYWx1ZSgpKTsKKworICAgIG1fcGVyZkxvY2subG9ja19hY3EoKTsKKworICAgIHVwZGF0ZVRoZXJtYWxMZXZlbCgodm9pZCAqKSZtVGhlcm1hbExldmVsKTsKKworICAgIHNldERpc3BsYXlGcmFtZVNraXAoKTsKKworICAgIC8vIHN0YXJ0IHByZXZpZXcgc3RyZWFtCisgICAgaWYgKG1QYXJhbWV0ZXJzLmlzWlNMTW9kZSgpICYmIG1QYXJhbWV0ZXJzLmdldFJlY29yZGluZ0hpbnRWYWx1ZSgpICE9IHRydWUpIHsKKyAgICAgICAgcmMgPSBzdGFydENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1pTTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmMgPSBzdGFydENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1BSRVZJRVcpOworICAgIH0KKworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gc3RhcnQgY2hhbm5lbHMiKTsKKyAgICAgICAgbV9wZXJmTG9jay5sb2NrX3JlbCgpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgaWYgKChtc2dUeXBlRW5hYmxlZChDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpKQorICAgICAgICAgICAgJiYgKG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX0NBTExCQUNLXSAhPSBOVUxMKSkgeworICAgICAgICByYyA9IHN0YXJ0Q2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfQ0FMTEJBQ0spOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoImZhaWxlZCB0byBzdGFydCBjYWxsYmFjayBzdHJlYW0iKTsKKyAgICAgICAgICAgIHN0b3BDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9aU0wpOworICAgICAgICAgICAgc3RvcENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1BSRVZJRVcpOworICAgICAgICAgICAgbV9wZXJmTG9jay5sb2NrX3JlbCgpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgdXBkYXRlUG9zdFByZXZpZXdQYXJhbWV0ZXJzKCk7CisgICAgbV9zdGF0ZU1hY2hpbmUuc2V0UHJldmlld0NhbGxiYWNrTmVlZGVkKHRydWUpOworCisgICAgLy8gaWYgam9iIGlkIGlzIG5vbi16ZXJvLCB0aGF0IG1lYW5zIHRoZSBwb3N0cHJvYyBpbml0IGpvYiBpcyBhbHJlYWR5CisgICAgLy8gcGVuZGluZyBvciBjb21wbGV0ZQorICAgIGlmIChtSW5pdFBQcm9jSm9iID09IDApIHsKKyAgICAgICAgbUluaXRQUHJvY0pvYiA9IGRlZmVyUFBJbml0KCk7CisgICAgICAgIGlmIChtSW5pdFBQcm9jSm9iID09IDApIHsKKyAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIHBvc3Rwcm9jZXNzb3IsIG1DYW1lcmFIYW5kbGUgPSAlcCIsCisgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSGFuZGxlKTsKKyAgICAgICAgICAgIHJjID0gLUVOT01FTTsKKyAgICAgICAgICAgIG1fcGVyZkxvY2subG9ja19yZWwoKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBtX3BlcmZMb2NrLmxvY2tfcmVsKCk7CisKKyAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gU2V0IHBvd2VyIEhpbnQgZm9yIHByZXZpZXcKKyAgICAgICAgbV9wZXJmTG9jay5wb3dlckhpbnQoUE9XRVJfSElOVF9WSURFT19FTkNPREUsIHRydWUpOworICAgIH0KKworICAgIExPR0koIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6dXBkYXRlUG9zdFByZXZpZXdQYXJhbWV0ZXJzKCkgeworICAgIC8vIEVuYWJsZSBPSVMgb25seSBpbiBDYW1lcmEgbW9kZSBhbmQgNGsyayBjYW1jb2RlciBtb2RlCisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIHJjID0gbVBhcmFtZXRlcnMudXBkYXRlT2lzVmFsdWUoMSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0b3BQcmV2aWV3CisgKgorICogREVTQ1JJUFRJT046IHN0b3AgcHJldmlldyBpbXBsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c3RvcFByZXZpZXcoKQoreworICAgIEtQSV9BVFJBQ0VfQ0FMTCgpOworICAgIExPR0koIkUiKTsKKyAgICBtTnVtUHJldmlld0ZhY2VzID0gLTE7CisgICAgbUFjdGl2ZUFGID0gZmFsc2U7CisKKyAgICAvLyBEaXNhYmxlIHBvd2VyIEhpbnQgZm9yIHByZXZpZXcKKyAgICBtX3BlcmZMb2NrLnBvd2VySGludChQT1dFUl9ISU5UX1ZJREVPX0VOQ09ERSwgZmFsc2UpOworCisgICAgbV9wZXJmTG9jay5sb2NrX2FjcSgpOworCisgICAgLy8gc3RvcCBwcmV2aWV3IHN0cmVhbQorICAgIHN0b3BDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9DQUxMQkFDSyk7CisgICAgc3RvcENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1pTTCk7CisgICAgc3RvcENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1BSRVZJRVcpOworICAgIHN0b3BDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9SQVcpOworCisgICAgbV9jYk5vdGlmaWVyLmZsdXNoUHJldmlld05vdGlmaWNhdGlvbnMoKTsKKyAgICAvL2FkZCBmb3IgdHMgbWFrZXVwCisjaWZkZWYgVEFSR0VUX1RTX01BS0VVUAorICAgIHRzX21ha2V1cF9maW5pc2goKTsKKyNlbmRpZgorICAgIC8vIGRlbGV0ZSBhbGwgY2hhbm5lbHMgZnJvbSBwcmVwYXJlUHJldmlldworICAgIHVucHJlcGFyZVByZXZpZXcoKTsKKworICAgIG1fcGVyZkxvY2subG9ja19yZWwoKTsKKworICAgIExPR0koIlgiKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RvcmVNZXRhRGF0YUluQnVmZmVycworICoKKyAqIERFU0NSSVBUSU9OOiBlbmFibGUgc3RvcmUgbWV0YSBkYXRhIGluIGJ1ZmZlcnMgZm9yIHZpZGVvIGZyYW1lcyBpbXBsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBlbmFibGUgIDogZmxhZyBpZiBuZWVkIGVuYWJsZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzdG9yZU1ldGFEYXRhSW5CdWZmZXJzKGludCBlbmFibGUpCit7CisgICAgbVN0b3JlTWV0YURhdGFJbkZyYW1lID0gZW5hYmxlOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcmVTdGFydFJlY29yZGluZworICoKKyAqIERFU0NSSVBUSU9OOiBQcmVwYXJlIHN0YXJ0IHJlY29yZGluZyBpbXBsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHJlU3RhcnRSZWNvcmRpbmcoKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBMT0dIKCJFIik7CisgICAgaWYgKG1QYXJhbWV0ZXJzLmdldFJlY29yZGluZ0hpbnRWYWx1ZSgpID09IGZhbHNlKSB7CisKKyAgICAgICAgLy8gR2l2ZSBIV0kgY29udHJvbCB0byByZXN0YXJ0IHByZXZpZXcgb25seSBpbiBzaW5nbGUgY2FtZXJhIG1vZGUuCisgICAgICAgIC8vIEluIGR1YWwtY2FtIG1vZGUsIHRoaXMgY29udHJvbCBiZWxvbmdzIHRvIG11eGVyLgorICAgICAgICBpZiAoZ2V0UmVsYXRlZENhbVN5bmNJbmZvKCktPnN5bmNfY29udHJvbCAhPSBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT04pIHsKKyAgICAgICAgICAgIExPR0goInN0YXJ0IHJlY29yZGluZyB3aGVuIGhpbnQgaXMgZmFsc2UsIHN0b3AgcHJldmlldyBmaXJzdCIpOworICAgICAgICAgICAgc3RvcFByZXZpZXcoKTsKKworICAgICAgICAgICAgLy8gU2V0IHJlY29yZGluZyBoaW50IHRvIFRSVUUKKyAgICAgICAgICAgIG1QYXJhbWV0ZXJzLnVwZGF0ZVJlY29yZGluZ0hpbnRWYWx1ZShUUlVFKTsKKyAgICAgICAgICAgIHJjID0gcHJlcGFyZVByZXZpZXcoKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJjID0gc3RhcnRQcmV2aWV3KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBGb3IgZHVhbCBjYW0gbW9kZSwgdXBkYXRlIHRoZSBmbGFnIG1QcmV2aWV3UmVzdGFydE5lZWRlZCB0byB0cnVlCisgICAgICAgICAgICAvLyBSZXN0YXJ0IGNvbnRyb2wgd2lsbCBiZSBoYW5kbGVkIGJ5IG11eGVyLgorICAgICAgICAgICAgbVByZXZpZXdSZXN0YXJ0TmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR0goIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RhcnRSZWNvcmRpbmcKKyAqCisgKiBERVNDUklQVElPTjogc3RhcnQgcmVjb3JkaW5nIGltcGwKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzdGFydFJlY29yZGluZygpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgTE9HSSgiRSIpOworICAgIC8vbGluayBtZXRhIHN0cmVhbSB3aXRoIHZpZGVvIGNoYW5uZWwgaWYgbG93IHBvd2VyIG1vZGUuCisgICAgaWYgKGlzTG93UG93ZXJNb2RlKCkpIHsKKyAgICAgICAgLy8gRmluZCBhbmQgdHJ5IHRvIGxpbmsgYSBtZXRhZGF0YSBzdHJlYW0gZnJvbSBwcmV2aWV3IGNoYW5uZWwKKyAgICAgICAgUUNhbWVyYUNoYW5uZWwgKnBNZXRhQ2hhbm5lbCA9IE5VTEw7CisgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBNZXRhU3RyZWFtID0gTlVMTDsKKyAgICAgICAgUUNhbWVyYUNoYW5uZWwgKnBWaWRlb0NoYW5uZWwgPSBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9WSURFT107CisKKyAgICAgICAgaWYgKG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1BSRVZJRVddICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHBNZXRhQ2hhbm5lbCA9IG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1BSRVZJRVddOworICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtTnVtID0gcE1ldGFDaGFubmVsLT5nZXROdW1PZlN0cmVhbXMoKTsKKyAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBTdHJlYW0gPSBOVUxMOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMCA7IGkgPCBzdHJlYW1OdW0gOyBpKysgKSB7CisgICAgICAgICAgICAgICAgcFN0cmVhbSA9IHBNZXRhQ2hhbm5lbC0+Z2V0U3RyZWFtQnlJbmRleChpKTsKKyAgICAgICAgICAgICAgICBpZiAoKE5VTEwgIT0gcFN0cmVhbSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEgPT0gcFN0cmVhbS0+Z2V0TXlUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHBNZXRhU3RyZWFtID0gcFN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChOVUxMICE9IHBNZXRhQ2hhbm5lbCkgJiYgKE5VTEwgIT0gcE1ldGFTdHJlYW0pKSB7CisgICAgICAgICAgICByYyA9IHBWaWRlb0NoYW5uZWwtPmxpbmtTdHJlYW0ocE1ldGFDaGFubmVsLCBwTWV0YVN0cmVhbSk7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJNZXRhZGF0YSBzdHJlYW0gbGluayBmYWlsZWQgJWQiLCByYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmMgPSBzdGFydENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1ZJREVPKTsKKyAgICB9CisKKyAgICBpZiAobVBhcmFtZXRlcnMuaXNUTlJTbmFwc2hvdEVuYWJsZWQoKSAmJiAhaXNMb3dQb3dlck1vZGUoKSkgeworICAgICAgICBRQ2FtZXJhQ2hhbm5lbCAqcENoYW5uZWwgPSBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9TTkFQU0hPVF07CisgICAgICAgIGlmICghbVBhcmFtZXRlcnMuaXM0azJrVmlkZW9SZXNvbHV0aW9uKCkpIHsKKyAgICAgICAgICAgIC8vIEZpbmQgYW5kIHRyeSB0byBsaW5rIGEgbWV0YWRhdGEgc3RyZWFtIGZyb20gcHJldmlldyBjaGFubmVsCisgICAgICAgICAgICBRQ2FtZXJhQ2hhbm5lbCAqcE1ldGFDaGFubmVsID0gTlVMTDsKKyAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBNZXRhU3RyZWFtID0gTlVMTDsKKworICAgICAgICAgICAgaWYgKG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1BSRVZJRVddICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwTWV0YUNoYW5uZWwgPSBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9QUkVWSUVXXTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1OdW0gPSBwTWV0YUNoYW5uZWwtPmdldE51bU9mU3RyZWFtcygpOworICAgICAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBTdHJlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDAgOyBpIDwgc3RyZWFtTnVtIDsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBwU3RyZWFtID0gcE1ldGFDaGFubmVsLT5nZXRTdHJlYW1CeUluZGV4KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoKE5VTEwgIT0gcFN0cmVhbSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+Z2V0TXlUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwTWV0YVN0cmVhbSA9IHBTdHJlYW07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChOVUxMICE9IHBNZXRhQ2hhbm5lbCkgJiYgKE5VTEwgIT0gcE1ldGFTdHJlYW0pKSB7CisgICAgICAgICAgICAgICAgcmMgPSBwQ2hhbm5lbC0+bGlua1N0cmVhbShwTWV0YUNoYW5uZWwsIHBNZXRhU3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVygiTWV0YWRhdGEgc3RyZWFtIGxpbmsgZmFpbGVkICVkIiwgcmMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMT0dIKCJTVEFSVCBzbmFwc2hvdCBDaGFubmVsIGZvciBUTlIgcHJvY2Vzc2luZyIpOworICAgICAgICByYyA9IHBDaGFubmVsLT5zdGFydCgpOworICAgIH0KKworICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBTZXQgcG93ZXIgSGludCBmb3IgdmlkZW8gZW5jb2RpbmcKKyAgICAgICAgbV9wZXJmTG9jay5wb3dlckhpbnQoUE9XRVJfSElOVF9WSURFT19FTkNPREUsIHRydWUpOworICAgIH0KKworICAgIExPR0koIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RvcFJlY29yZGluZworICoKKyAqIERFU0NSSVBUSU9OOiBzdG9wIHJlY29yZGluZyBpbXBsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c3RvcFJlY29yZGluZygpCit7CisgICAgTE9HSSgiRSIpOworICAgIC8vIHN0b3Agc25hcHNob3QgY2hhbm5lbAorICAgIGlmIChtUGFyYW1ldGVycy5pc1ROUlNuYXBzaG90RW5hYmxlZCgpKSB7CisgICAgICAgIExPR0goIlNUT1Agc25hcHNob3QgQ2hhbm5lbCBmb3IgVE5SIHByb2Nlc3NpbmciKTsKKyAgICAgICAgc3RvcENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1NOQVBTSE9UKTsKKyAgICB9CisgICAgaW50IHJjID0gc3RvcENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1ZJREVPKTsKKworICAgIG1fY2JOb3RpZmllci5mbHVzaFZpZGVvTm90aWZpY2F0aW9ucygpOworICAgIC8vIERpc2FibGUgcG93ZXIgaGludCBmb3IgdmlkZW8gZW5jb2RpbmcKKyAgICBtX3BlcmZMb2NrLnBvd2VySGludChQT1dFUl9ISU5UX1ZJREVPX0VOQ09ERSwgZmFsc2UpOworICAgIExPR0koIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVsZWFzZVJlY29yZGluZ0ZyYW1lCisgKgorICogREVTQ1JJUFRJT046IHJldHVybiB2aWRlbyBmcmFtZSBpbXBsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBvcGFxdWUgIDogcHRyIHRvIHZpZGVvIGZyYW1lIHRvIGJlIHJldHVybmVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCB2b2lkICogb3BhcXVlKQoreworICAgIGludDMyX3QgcmMgPSBVTktOT1dOX0VSUk9SOworICAgIFFDYW1lcmFWaWRlb0NoYW5uZWwgKnBDaGFubmVsID0KKyAgICAgICAgICAgIChRQ2FtZXJhVmlkZW9DaGFubmVsICopbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfVklERU9dOworICAgIExPR0QoIm9wYXF1ZSBkYXRhID0gJXAiLG9wYXF1ZSk7CisKKyAgICBpZihwQ2hhbm5lbCAhPSBOVUxMKSB7CisgICAgICAgIHJjID0gcENoYW5uZWwtPnJlbGVhc2VGcmFtZShvcGFxdWUsIG1TdG9yZU1ldGFEYXRhSW5GcmFtZSA+IDApOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYXV0b0ZvY3VzCisgKgorICogREVTQ1JJUFRJT046IHN0YXJ0IGF1dG8gZm9jdXMgaW1wbAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmF1dG9Gb2N1cygpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgY2FtX2ZvY3VzX21vZGVfdHlwZSBmb2N1c01vZGUgPSBtUGFyYW1ldGVycy5nZXRGb2N1c01vZGUoKTsKKyAgICBMT0dIKCJFIik7CisKKyAgICBzd2l0Y2ggKGZvY3VzTW9kZSkgeworICAgIGNhc2UgQ0FNX0ZPQ1VTX01PREVfQVVUTzoKKyAgICBjYXNlIENBTV9GT0NVU19NT0RFX01BQ1JPOgorICAgIGNhc2UgQ0FNX0ZPQ1VTX01PREVfQ09OVElOT1VTX1ZJREVPOgorICAgIGNhc2UgQ0FNX0ZPQ1VTX01PREVfQ09OVElOT1VTX1BJQ1RVUkU6CisgICAgICAgIG1BY3RpdmVBRiA9IHRydWU7CisgICAgICAgIExPR0koIlNlbmQgQVVUTyBGT0NVUyBldmVudC4gZm9jdXNNb2RlPSVkLCBtX2N1cnJlbnRGb2N1c1N0YXRlPSVkIiwKKyAgICAgICAgICAgICAgICBmb2N1c01vZGUsIG1fY3VycmVudEZvY3VzU3RhdGUpOworICAgICAgICByYyA9IG1DYW1lcmFIYW5kbGUtPm9wcy0+ZG9fYXV0b19mb2N1cyhtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9DVVNfTU9ERV9JTkZJTklUWToKKyAgICBjYXNlIENBTV9GT0NVU19NT0RFX0ZJWEVEOgorICAgIGNhc2UgQ0FNX0ZPQ1VTX01PREVfRURPRjoKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dJKCJObyBvcHMgaW4gZm9jdXNNb2RlICglZCkiLCBmb2N1c01vZGUpOworICAgICAgICByYyA9IHNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19GT0NVUywgdHJ1ZSwgMCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICBtQWN0aXZlQUYgPSBmYWxzZTsKKyAgICB9CisgICAgTE9HSCgiWCByYyA9ICVkIiwgcmMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYW5jZWxBdXRvRm9jdXMKKyAqCisgKiBERVNDUklQVElPTjogY2FuY2VsIGF1dG8gZm9jdXMgaW1wbAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmNhbmNlbEF1dG9Gb2N1cygpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgY2FtX2ZvY3VzX21vZGVfdHlwZSBmb2N1c01vZGUgPSBtUGFyYW1ldGVycy5nZXRGb2N1c01vZGUoKTsKKworICAgIHN3aXRjaCAoZm9jdXNNb2RlKSB7CisgICAgY2FzZSBDQU1fRk9DVVNfTU9ERV9BVVRPOgorICAgIGNhc2UgQ0FNX0ZPQ1VTX01PREVfTUFDUk86CisgICAgY2FzZSBDQU1fRk9DVVNfTU9ERV9DT05USU5PVVNfVklERU86CisgICAgY2FzZSBDQU1fRk9DVVNfTU9ERV9DT05USU5PVVNfUElDVFVSRToKKyAgICAgICAgbUFjdGl2ZUFGID0gZmFsc2U7CisgICAgICAgIHJjID0gbUNhbWVyYUhhbmRsZS0+b3BzLT5jYW5jZWxfYXV0b19mb2N1cyhtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9DVVNfTU9ERV9JTkZJTklUWToKKyAgICBjYXNlIENBTV9GT0NVU19NT0RFX0ZJWEVEOgorICAgIGNhc2UgQ0FNX0ZPQ1VTX01PREVfRURPRjoKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dEKCJObyBvcHMgaW4gZm9jdXNNb2RlICglZCkiLCBmb2N1c01vZGUpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2Nlc3NVRkR1bXBzCisgKgorICogREVTQ1JJUFRJT046IHByb2Nlc3MgVUYganBlZyBkdW1wcyBmb3IgcmVmb2N1cyBzdXBwb3J0CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBldnQgICAgIDogcGF5bG9hZCBvZiBqcGVnIGV2ZW50LCBpbmNsdWRpbmcgaW5mb3JtYXRpb24gYWJvdXQganBlZyBlbmNvZGluZworICogICAgICAgICAgICAgIHN0YXR1cywganBlZyBzaXplIGFuZCBzbyBvbi4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICoKKyAqIE5PVEUgICAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHJvY2Vzc1VGRHVtcHMocWNhbWVyYV9qcGVnX2V2dF9wYXlsb2FkX3QgKmV2dCkKK3sKKyAgIGJvb2wgcmV0ID0gdHJ1ZTsKKyAgIGlmIChtUGFyYW1ldGVycy5pc1ViaVJlZm9jdXMoKSkgeworICAgICAgIGludCBpbmRleCA9IChpbnQpZ2V0T3V0cHV0SW1hZ2VDb3VudCgpOworICAgICAgIGJvb2wgYWxsRm9jdXNJbWFnZSA9IChpbmRleCA9PSAoKGludCltUGFyYW1ldGVycy5nZXRSZWZvY3VzT3V0cHV0Q291bnQoKSAtIDEpKTsKKyAgICAgICBjaGFyIG5hbWVbRklMRU5BTUVfTUFYXTsKKworICAgICAgIGNhbWVyYV9tZW1vcnlfdCAqanBlZ19tZW0gPSBOVUxMOworICAgICAgIG9teF9qcGVnX291cHV0X2J1Zl90ICpqcGVnX291dCA9IE5VTEw7CisgICAgICAgc2l6ZV90IGRhdGFMZW47CisgICAgICAgdWludDhfdCAqZGF0YVB0cjsKKyAgICAgICBpZiAoTk9fRVJST1IgIT0gd2FpdERlZmVycmVkV29yayhtSW5pdFBQcm9jSm9iKSkgeworICAgICAgICAgICBMT0dFKCJJbml0IFBQcm9jIERlZmVycmVkIHdvcmsgZmFpbGVkIik7CisgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICB9CisgICAgICAgaWYgKCFtX3Bvc3Rwcm9jZXNzb3IuZ2V0SnBlZ01lbU9wdCgpKSB7CisgICAgICAgICAgIGRhdGFMZW4gPSBldnQtPm91dF9kYXRhLmJ1Zl9maWxsZWRfbGVuOworICAgICAgICAgICBkYXRhUHRyID0gZXZ0LT5vdXRfZGF0YS5idWZfdmFkZHI7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAganBlZ19vdXQgID0gKG9teF9qcGVnX291cHV0X2J1Zl90KikgZXZ0LT5vdXRfZGF0YS5idWZfdmFkZHI7CisgICAgICAgICAgIGlmICghanBlZ19vdXQpIHsKKyAgICAgICAgICAgICAgTE9HRSgiTnVsbCBwb2ludGVyIGRldGVjdGVkIik7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBqcGVnX21lbSA9IChjYW1lcmFfbWVtb3J5X3QgKilqcGVnX291dC0+bWVtX2hkbDsKKyAgICAgICAgICAgaWYgKCFqcGVnX21lbSkgeworICAgICAgICAgICAgICBMT0dFKCJOdWxsIHBvaW50ZXIgZGV0ZWN0ZWQiKTsKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICB9CisgICAgICAgICAgIGRhdGFQdHIgPSAodWludDhfdCAqKWpwZWdfbWVtLT5kYXRhOworICAgICAgICAgICBkYXRhTGVuID0ganBlZ19tZW0tPnNpemU7CisgICAgICAgfQorCisgICAgICAgaWYgKGFsbEZvY3VzSW1hZ2UpICB7CisgICAgICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIkFsbEZvY3VzSW1hZ2UiKTsKKyAgICAgICAgICAgaW5kZXggPSAtMTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlZCIsIDApOworICAgICAgIH0KKyAgICAgICBDQU1fRFVNUF9UT19GSUxFKFFDQU1FUkFfRFVNUF9GUk1fTE9DQVRJT04idWJpZm9jdXMiLCBuYW1lLCBpbmRleCwgImpwZyIsCisgICAgICAgICAgIGRhdGFQdHIsIGRhdGFMZW4pOworICAgICAgIExPR0QoIkR1bXAgdGhlIGltYWdlICVkICVkIGFsbEZvY3VzSW1hZ2UgJWQiLAorICAgICAgICAgICBnZXRPdXRwdXRJbWFnZUNvdW50KCksIGluZGV4LCBhbGxGb2N1c0ltYWdlKTsKKyAgICAgICBzZXRPdXRwdXRJbWFnZUNvdW50KGdldE91dHB1dEltYWdlQ291bnQoKSArIDEpOworICAgICAgIGlmICghYWxsRm9jdXNJbWFnZSkgeworICAgICAgICAgICByZXQgPSBmYWxzZTsKKyAgICAgICB9CisgICB9CisgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVuY29uZmlndXJlQWR2YW5jZWRDYXB0dXJlCisgKgorICogREVTQ1JJUFRJT046IHVuY29uZmlndXJlIEFkdmFuY2VkIENhcHR1cmUuCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnVuY29uZmlndXJlQWR2YW5jZWRDYXB0dXJlKCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICAvKkRpc2FibGUgUXVhZHJhIENGQSBtb2RlKi8KKyAgICBMT0dIKCJEaXNhYmxpbmcgUXVhZHJhIENGQSBtb2RlIik7CisgICAgbVBhcmFtZXRlcnMuc2V0UXVhZHJhQ2ZhTW9kZShmYWxzZSwgdHJ1ZSk7CisKKyAgICBpZiAobUFkdmFuY2VkQ2FwdHVyZUNvbmZpZ3VyZWQpIHsKKworICAgICAgICBtQWR2YW5jZWRDYXB0dXJlQ29uZmlndXJlZCA9IGZhbHNlOworCisgICAgICAgIGlmKG1JczNBTG9ja2VkKSB7CisgICAgICAgICAgICBtUGFyYW1ldGVycy5zZXQzQUxvY2soZmFsc2UpOworICAgICAgICAgICAgbUlzM0FMb2NrZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVBhcmFtZXRlcnMuaXNIRFJFbmFibGVkKCkgfHwgbVBhcmFtZXRlcnMuaXNBRUJyYWNrZXRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHJjID0gbVBhcmFtZXRlcnMuc2V0VG9uZU1hcE1vZGUodHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJGYWlsZWQgdG8gZW5hYmxlIHRvbmUgbWFwIGR1cmluZyBIRFIvQUVCcmFja2V0aW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSERSQnJhY2tldGluZ0VuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJjID0gbVBhcmFtZXRlcnMuc3RvcEFFQnJhY2tldCgpOworICAgICAgICB9IGVsc2UgaWYgKChtUGFyYW1ldGVycy5pc0Nocm9tYUZsYXNoRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIHx8IChtRmxhc2hDb25maWd1cmVkICYmICFtTG9uZ3Nob3RFbmFibGVkKQorICAgICAgICAgICAgICAgIHx8IChtTG93TGlnaHRDb25maWd1cmVkID09IHRydWUpCisgICAgICAgICAgICAgICAgfHwgKG1QYXJhbWV0ZXJzLmdldE1hbnVhbENhcHR1cmVNb2RlKCkgPj0gQ0FNX01BTlVBTF9DQVBUVVJFX1RZUEVfMikpIHsKKyAgICAgICAgICAgIHJjID0gbVBhcmFtZXRlcnMucmVzZXRGcmFtZUNhcHR1cmUoVFJVRSwgbUxvd0xpZ2h0Q29uZmlndXJlZCk7CisgICAgICAgIH0gZWxzZSBpZiAobVBhcmFtZXRlcnMuaXNVYmlGb2N1c0VuYWJsZWQoKSB8fCBtUGFyYW1ldGVycy5pc1ViaVJlZm9jdXMoKSkgeworICAgICAgICAgICAgcmMgPSBjb25maWd1cmVBRkJyYWNrZXRpbmcoZmFsc2UpOworICAgICAgICB9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLmlzT3B0aVpvb21FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHJjID0gbVBhcmFtZXRlcnMuc2V0QW5kQ29tbWl0Wm9vbShtWm9vbUxldmVsKTsKKyAgICAgICAgICAgIHNldERpc3BsYXlTa2lwKEZBTFNFLCBDQU1FUkFfTUFYX1BBUkFNX0FQUExZX0RFTEFZKTsKKyAgICAgICAgfSBlbHNlIGlmIChtUGFyYW1ldGVycy5pc1N0aWxsTW9yZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgY2FtX3N0aWxsX21vcmVfdCBzdGlsbG1vcmVfY29uZmlnID0gbVBhcmFtZXRlcnMuZ2V0U3RpbGxNb3JlU2V0dGluZ3MoKTsKKyAgICAgICAgICAgIHN0aWxsbW9yZV9jb25maWcuYnVyc3RfY291bnQgPSAwOworICAgICAgICAgICAgbVBhcmFtZXRlcnMuc2V0U3RpbGxNb3JlU2V0dGluZ3Moc3RpbGxtb3JlX2NvbmZpZyk7CisKKyAgICAgICAgICAgIC8qIElmIFNlZU1vcmUgaXMgcnVubmluZywgaXQgd2lsbCBoYW5kbGUgcmUtZW5hYmxpbmcgdG9uZSBtYXAgKi8KKyAgICAgICAgICAgIGlmICghbVBhcmFtZXRlcnMuaXNTZWVNb3JlRW5hYmxlZCgpICYmICFtUGFyYW1ldGVycy5pc0xUTUZvclNlZU1vcmVFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICByYyA9IG1QYXJhbWV0ZXJzLnNldFRvbmVNYXBNb2RlKHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBMT0dXKCJGYWlsZWQgdG8gZW5hYmxlIHRvbmUgbWFwIGR1cmluZyBTdGlsbE1vcmUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFJlLWVuYWJsZSBUaW50bGVzcyAqLworICAgICAgICAgICAgbVBhcmFtZXRlcnMuc2V0VGludGxlc3ModHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dXKCJObyBBZHZhbmNlZCBDYXB0dXJlIGZlYXR1cmUgZW5hYmxlZCEhIik7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjb25maWd1cmVBZHZhbmNlZENhcHR1cmUKKyAqCisgKiBERVNDUklQVElPTjogY29uZmlndXJlIEFkdmFuY2VkIENhcHR1cmUuCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmNvbmZpZ3VyZUFkdmFuY2VkQ2FwdHVyZSgpCit7CisgICAgTE9HSCgiRSIpOworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIHJjID0gbVBhcmFtZXRlcnMuY2hlY2tGZWF0dXJlQ29uY3VycmVuY3koKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IHN1cHBvcnQgQWR2YW5jZWQgY2FwdHVyZSBtb2RlcyIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIC8qRW5hYmxlIFF1YWRyYSBDRkEgbW9kZSovCisgICAgTE9HSCgiRW5hYmxpbmcgUXVhZHJhIENGQSBtb2RlIik7CisgICAgbVBhcmFtZXRlcnMuc2V0UXVhZHJhQ2ZhTW9kZSh0cnVlLCB0cnVlKTsKKworICAgIHNldE91dHB1dEltYWdlQ291bnQoMCk7CisgICAgbUlucHV0Q291bnQgPSAwOworICAgIG1BZHZhbmNlZENhcHR1cmVDb25maWd1cmVkID0gdHJ1ZTsKKyAgICAvKiBEaXNwbGF5IHNob3VsZCBiZSBkaXNhYmxlZCBmb3IgYWR2YW5jZWQgbW9kZXMgKi8KKyAgICBib29sIGJTa2lwRGlzcGxheSA9IHRydWU7CisKKyAgICBpZiAoZ2V0UmVsYXRlZENhbVN5bmNJbmZvKCktPm1vZGUgPT0gQ0FNX01PREVfU0VDT05EQVJZKSB7CisgICAgICAgIC8vIG5vIEFkdmFuY2UgY2FwdHVyZSBzZXR0aW5ncyBmb3IgQXV4IGNhbWVyYQorICAgICAgICBMT0dIKCJYIFNlY29uZGFyeSBDYW1lcmEsIG5vIG5lZWQgdG8gcHJvY2VzcyEhICIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogRG8gbm90IHN0b3AgZGlzcGxheSBpZiBpbiBzdGlsbG1vcmUgbGl2ZXNuYXBzaG90ICovCisgICAgaWYgKG1QYXJhbWV0ZXJzLmlzU3RpbGxNb3JlRW5hYmxlZCgpICYmCisgICAgICAgICAgICBtUGFyYW1ldGVycy5pc1NlZU1vcmVFbmFibGVkKCkpIHsKKyAgICAgICAgYlNraXBEaXNwbGF5ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChtUGFyYW1ldGVycy5pc1ViaUZvY3VzRW5hYmxlZCgpIHx8IG1QYXJhbWV0ZXJzLmlzVWJpUmVmb2N1cygpKSB7CisgICAgICAgIHJjID0gY29uZmlndXJlQUZCcmFja2V0aW5nKCk7CisgICAgfSBlbHNlIGlmIChtUGFyYW1ldGVycy5pc09wdGlab29tRW5hYmxlZCgpKSB7CisgICAgICAgIHJjID0gY29uZmlndXJlT3B0aVpvb20oKTsKKyAgICB9IGVsc2UgaWYobVBhcmFtZXRlcnMuaXNIRFJFbmFibGVkKCkpIHsKKyAgICAgICAgcmMgPSBjb25maWd1cmVIRFJCcmFja2V0aW5nKCk7CisgICAgICAgIGlmIChtSERSQnJhY2tldGluZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgIHJjID0gbVBhcmFtZXRlcnMuc2V0VG9uZU1hcE1vZGUoZmFsc2UsIHRydWUpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HVygiRmFpbGVkIHRvIGRpc2FibGUgdG9uZSBtYXAgZHVyaW5nIEhEUiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtUGFyYW1ldGVycy5pc0FFQnJhY2tldEVuYWJsZWQoKSkgeworICAgICAgICByYyA9IG1QYXJhbWV0ZXJzLnNldFRvbmVNYXBNb2RlKGZhbHNlLCB0cnVlKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dXKCJGYWlsZWQgdG8gZGlzYWJsZSB0b25lIG1hcCBkdXJpbmcgQUVCcmFja2V0aW5nIik7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBjb25maWd1cmVBRUJyYWNrZXRpbmcoKTsKKyAgICB9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLmlzU3RpbGxNb3JlRW5hYmxlZCgpKSB7CisgICAgICAgIGJTa2lwRGlzcGxheSA9IGZhbHNlOworICAgICAgICByYyA9IGNvbmZpZ3VyZVN0aWxsTW9yZSgpOworICAgIH0gZWxzZSBpZiAoKG1QYXJhbWV0ZXJzLmlzQ2hyb21hRmxhc2hFbmFibGVkKCkpCisgICAgICAgICAgICB8fCAobVBhcmFtZXRlcnMuZ2V0TG93TGlnaHRMZXZlbCgpICE9IENBTV9MT1dfTElHSFRfT0ZGKQorICAgICAgICAgICAgfHwgKG1QYXJhbWV0ZXJzLmdldE1hbnVhbENhcHR1cmVNb2RlKCkgPj0gQ0FNX01BTlVBTF9DQVBUVVJFX1RZUEVfMikpIHsKKyAgICAgICAgcmMgPSBtUGFyYW1ldGVycy5jb25maWdGcmFtZUNhcHR1cmUoVFJVRSk7CisgICAgICAgIGlmIChtUGFyYW1ldGVycy5nZXRMb3dMaWdodExldmVsKCkgIT0gQ0FNX0xPV19MSUdIVF9PRkYpIHsKKyAgICAgICAgICAgIG1Mb3dMaWdodENvbmZpZ3VyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtRmxhc2hOZWVkZWQgJiYgIW1Mb25nc2hvdEVuYWJsZWQpIHsKKyAgICAgICAgcmMgPSBtUGFyYW1ldGVycy5jb25maWdGcmFtZUNhcHR1cmUoVFJVRSk7CisgICAgICAgIG1GbGFzaENvbmZpZ3VyZWQgPSB0cnVlOworICAgICAgICBiU2tpcERpc3BsYXkgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dIKCJBZHZhbmNlZCBDYXB0dXJlIGZlYXR1cmUgbm90IGVuYWJsZWQhISAiKTsKKyAgICAgICAgbUFkdmFuY2VkQ2FwdHVyZUNvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICAgICAgYlNraXBEaXNwbGF5ID0gZmFsc2U7CisgICAgfQorCisgICAgTE9HSCgiU3RvcCBwcmV2aWV3IHRlbXBvcmFyaWx5IGZvciBhZHZhbmNlZCBjYXB0dXJlcyIpOworICAgIHNldERpc3BsYXlTa2lwKGJTa2lwRGlzcGxheSk7CisKKyAgICBMT0dIKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbmZpZ3VyZUFGQnJhY2tldGluZworICoKKyAqIERFU0NSSVBUSU9OOiBjb25maWd1cmUgQUYgQnJhY2tldGluZy4KKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Y29uZmlndXJlQUZCcmFja2V0aW5nKGJvb2wgZW5hYmxlKQoreworICAgIExPR0goIkUiKTsKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgY2FtX2FmX2JyYWNrZXRpbmdfdCAqYWZfYnJhY2tldGluZ19uZWVkOworCisgICAgaWYgKG1QYXJhbWV0ZXJzLmlzVWJpUmVmb2N1cygpKSB7CisgICAgICAgIGFmX2JyYWNrZXRpbmdfbmVlZCA9CisgICAgICAgICAgICAgICAgJmdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnJlZm9jdXNfYWZfYnJhY2tldGluZ19uZWVkOworICAgIH0gZWxzZSB7CisgICAgICAgIGFmX2JyYWNrZXRpbmdfbmVlZCA9CisgICAgICAgICAgICAgICAgJmdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnViaWZvY3VzX2FmX2JyYWNrZXRpbmdfbmVlZDsKKyAgICB9CisKKyAgICAvL0VuYWJsZSBBRiBCcmFja2V0aW5nLgorICAgIGNhbV9hZl9icmFja2V0aW5nX3QgYWZCcmFja2V0OworICAgIG1lbXNldCgmYWZCcmFja2V0LCAwLCBzaXplb2YoY2FtX2FmX2JyYWNrZXRpbmdfdCkpOworICAgIGFmQnJhY2tldC5lbmFibGUgPSBlbmFibGU7CisgICAgYWZCcmFja2V0LmJ1cnN0X2NvdW50ID0gYWZfYnJhY2tldGluZ19uZWVkLT5idXJzdF9jb3VudDsKKworICAgIGZvcihpbnQ4X3QgaSA9IDA7IGkgPCBNQVhfQUZfQlJBQ0tFVElOR19WQUxVRVM7IGkrKykgeworICAgICAgICBhZkJyYWNrZXQuZm9jdXNfc3RlcHNbaV0gPSBhZl9icmFja2V0aW5nX25lZWQtPmZvY3VzX3N0ZXBzW2ldOworICAgICAgICBMT0dIKCJmb2N1c19zdGVwWyVkXSA9ICVkIiwgaSwgYWZCcmFja2V0LmZvY3VzX3N0ZXBzW2ldKTsKKyAgICB9CisgICAgLy9TZW5kIGNtZCB0byBiYWNrZW5kIHRvIHNldCBBRiBCcmFja2V0aW5nIGZvciBVYmkgRm9jdXMuCisgICAgcmMgPSBtUGFyYW1ldGVycy5jb21taXRBRkJyYWNrZXQoYWZCcmFja2V0KTsKKyAgICBpZiAoIE5PX0VSUk9SICE9IHJjICkgeworICAgICAgICBMT0dFKCJjYW5ub3QgY29uZmlndXJlIEFGIGJyYWNrZXRpbmciKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgIG1QYXJhbWV0ZXJzLnNldDNBTG9jayh0cnVlKTsKKyAgICAgICAgbUlzM0FMb2NrZWQgPSB0cnVlOworICAgIH0KKyAgICBMT0dIKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbmZpZ3VyZUhEUkJyYWNrZXRpbmcKKyAqCisgKiBERVNDUklQVElPTjogY29uZmlndXJlIEhEUiBCcmFja2V0aW5nLgorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpjb25maWd1cmVIRFJCcmFja2V0aW5nKCkKK3sKKyAgICBMT0dIKCJFIik7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgY2FtX2hkcl9icmFja2V0aW5nX2luZm9fdCYgaGRyQnJhY2tldGluZ1NldHRpbmcgPQorICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+aGRyX2JyYWNrZXRpbmdfc2V0dGluZzsKKworICAgIC8vICd2YWx1ZXMnIHNob3VsZCBiZSBpbiAiaWR4MSxpZHgyLGlkeDMsLi4uIiBmb3JtYXQKKyAgICB1aW50MzJfdCBoZHJGcmFtZUNvdW50ID0KKyAgICAgICAgICAgIGhkckJyYWNrZXRpbmdTZXR0aW5nLm51bV9mcmFtZXM7CisgICAgTE9HSCgiSERSIHZhbHVlcyAlZCwgJWQgZnJhbWUgY291bnQ6ICV1IiwKKyAgICAgICAgICAoaW50OF90KSBoZHJCcmFja2V0aW5nU2V0dGluZy5leHBfdmFsLnZhbHVlc1swXSwKKyAgICAgICAgICAoaW50OF90KSBoZHJCcmFja2V0aW5nU2V0dGluZy5leHBfdmFsLnZhbHVlc1sxXSwKKyAgICAgICAgICBoZHJGcmFtZUNvdW50KTsKKworICAgIC8vIEVuYWJsZSBBRSBCcmFja2V0aW5nIGZvciBIRFIKKyAgICBjYW1fZXhwX2JyYWNrZXRpbmdfdCBhZUJyYWNrZXQ7CisgICAgbWVtc2V0KCZhZUJyYWNrZXQsIDAsIHNpemVvZihjYW1fZXhwX2JyYWNrZXRpbmdfdCkpOworICAgIGFlQnJhY2tldC5tb2RlID0KKyAgICAgICAgaGRyQnJhY2tldGluZ1NldHRpbmcuZXhwX3ZhbC5tb2RlOworCisgICAgaWYgKGFlQnJhY2tldC5tb2RlID09IENBTV9FWFBfQlJBQ0tFVElOR19PTikgeworICAgICAgICBtSERSQnJhY2tldGluZ0VuYWJsZWQgPSB0cnVlOworICAgIH0KKworICAgIFN0cmluZzggdG1wOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBoZHJGcmFtZUNvdW50OyBpKyspIHsKKyAgICAgICAgdG1wLmFwcGVuZEZvcm1hdCgiJWQiLAorICAgICAgICAgICAgKGludDhfdCkgaGRyQnJhY2tldGluZ1NldHRpbmcuZXhwX3ZhbC52YWx1ZXNbaV0pOworICAgICAgICB0bXAuYXBwZW5kKCIsIik7CisgICAgfQorICAgIGlmIChtUGFyYW1ldGVycy5pc0hEUjF4RnJhbWVFbmFibGVkKCkKKyAgICAgICAgJiYgbVBhcmFtZXRlcnMuaXNIRFIxeEV4dHJhQnVmZmVyTmVlZGVkKCkpIHsKKyAgICAgICAgICAgIHRtcC5hcHBlbmRGb3JtYXQoIiVkIiwgMCk7CisgICAgICAgICAgICB0bXAuYXBwZW5kKCIsIik7CisgICAgfQorCisgICAgaWYoICF0bXAuaXNFbXB0eSgpICYmCisgICAgICAgICggTUFYX0VYUF9CUkFDS0VUSU5HX0xFTkdUSCA+IHRtcC5sZW5ndGgoKSApICkgeworICAgICAgICAvL1RyaW0gbGFzdCBjb21tYQorICAgICAgICBtZW1zZXQoYWVCcmFja2V0LnZhbHVlcywgJ1wwJywgTUFYX0VYUF9CUkFDS0VUSU5HX0xFTkdUSCk7CisgICAgICAgIG1lbWNweShhZUJyYWNrZXQudmFsdWVzLCB0bXAuc3RyaW5nKCksIHRtcC5sZW5ndGgoKSAtIDEpOworICAgIH0KKworICAgIExPR0goIkhEUiBjb25maWcgdmFsdWVzICVzIiwKKyAgICAgICAgICBhZUJyYWNrZXQudmFsdWVzKTsKKyAgICByYyA9IG1QYXJhbWV0ZXJzLnNldEhEUkFFQnJhY2tldChhZUJyYWNrZXQpOworICAgIGlmICggTk9fRVJST1IgIT0gcmMgKSB7CisgICAgICAgIExPR0UoImNhbm5vdCBjb25maWd1cmUgSERSIGJyYWNrZXRpbmciKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICBMT0dIKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbmZpZ3VyZUFFQnJhY2tldGluZworICoKKyAqIERFU0NSSVBUSU9OOiBjb25maWd1cmUgQUUgQnJhY2tldGluZy4KKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Y29uZmlndXJlQUVCcmFja2V0aW5nKCkKK3sKKyAgICBMT0dIKCJFIik7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgcmMgPSBtUGFyYW1ldGVycy5zZXRBRUJyYWNrZXRpbmcoKTsKKyAgICBpZiAoIE5PX0VSUk9SICE9IHJjICkgeworICAgICAgICBMT0dFKCJjYW5ub3QgY29uZmlndXJlIEFFIGJyYWNrZXRpbmciKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICBMT0dIKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbmZpZ3VyZU9wdGlab29tCisgKgorICogREVTQ1JJUFRJT046IGNvbmZpZ3VyZSBPcHRpIFpvb20uCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmNvbmZpZ3VyZU9wdGlab29tKCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICAvL3N0b3JlIGN1cnJlbnQgem9vbSBsZXZlbC4KKyAgICBtWm9vbUxldmVsID0gbVBhcmFtZXRlcnMuZ2V0UGFybVpvb21MZXZlbCgpOworCisgICAgLy9zZXQgem9vbSBsZXZlbCB0byAxeDsKKyAgICBtUGFyYW1ldGVycy5zZXRBbmRDb21taXRab29tKDApOworCisgICAgbVBhcmFtZXRlcnMuc2V0M0FMb2NrKHRydWUpOworICAgIG1JczNBTG9ja2VkID0gdHJ1ZTsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjb25maWd1cmVTdGlsbE1vcmUKKyAqCisgKiBERVNDUklQVElPTjogY29uZmlndXJlIFN0aWxsTW9yZS4KKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Y29uZmlndXJlU3RpbGxNb3JlKCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgdWludDhfdCBidXJzdF9jbnQgPSAwOworICAgIGNhbV9zdGlsbF9tb3JlX3Qgc3RpbGxtb3JlX2NvbmZpZzsKKyAgICBjYW1fc3RpbGxfbW9yZV90IHN0aWxsbW9yZV9jYXA7CisKKyAgICAvKiBEaXNhYmxlIFRvbmUgTWFwLiBJZiBzZWVtb3JlIGlzIGVuYWJsZWQsIGl0IHdpbGwgaGFuZGxlIGRpc2FibGluZyBpdC4gKi8KKyAgICBpZiAoIW1QYXJhbWV0ZXJzLmlzU2VlTW9yZUVuYWJsZWQoKSAmJiAhbVBhcmFtZXRlcnMuaXNMVE1Gb3JTZWVNb3JlRW5hYmxlZCgpKSB7CisgICAgICAgIHJjID0gbVBhcmFtZXRlcnMuc2V0VG9uZU1hcE1vZGUoZmFsc2UsIHRydWUpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR1coIkZhaWxlZCB0byBkaXNhYmxlIHRvbmUgbWFwIGR1cmluZyBTdGlsbE1vcmUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIExvY2sgM0EgKi8KKyAgICBtUGFyYW1ldGVycy5zZXQzQUxvY2sodHJ1ZSk7CisgICAgbUlzM0FMb2NrZWQgPSB0cnVlOworCisgICAgLyogRGlzYWJsZSBUaW50bGVzcyAqLworICAgIG1QYXJhbWV0ZXJzLnNldFRpbnRsZXNzKGZhbHNlKTsKKworICAgIC8qIEluaXRpYWxpemUgYnVyc3QgY291bnQgZnJvbSBjYXBhYmlsaXR5ICovCisgICAgc3RpbGxtb3JlX2NhcCA9IG1QYXJhbWV0ZXJzLmdldFN0aWxsTW9yZUNhcGFiaWxpdHkoKTsKKyAgICBidXJzdF9jbnQgPSBzdGlsbG1vcmVfY2FwLm1heF9idXJzdF9jb3VudDsKKworICAgIC8qIFJlY29uZmlndXJlIGJ1cnN0IGNvdW50IGZyb20gZHluYW1pYyBzY2VuZSBkYXRhICovCisgICAgY2FtX2R5bl9pbWdfZGF0YV90IGR5bmFtaWNfaW1nX2RhdGEgPSBtUGFyYW1ldGVycy5nZXREeW5hbWljSW1nRGF0YSgpOworICAgIGlmIChkeW5hbWljX2ltZ19kYXRhLmlucHV0X2NvdW50ID49IHN0aWxsbW9yZV9jYXAubWluX2J1cnN0X2NvdW50ICYmCisgICAgICAgICAgICBkeW5hbWljX2ltZ19kYXRhLmlucHV0X2NvdW50IDw9IHN0aWxsbW9yZV9jYXAubWF4X2J1cnN0X2NvdW50KSB7CisgICAgICAgIGJ1cnN0X2NudCA9IGR5bmFtaWNfaW1nX2RhdGEuaW5wdXRfY291bnQ7CisgICAgfQorCisgICAgLyogUmVjb25maWd1cmUgYnVyc3QgY291bnQgaW4gdGhlIGNhc2Ugb2YgbGl2ZXNob3QgKi8KKyAgICBpZiAobVBhcmFtZXRlcnMuaXNTZWVNb3JlRW5hYmxlZCgpKSB7CisgICAgICAgIGJ1cnN0X2NudCA9IDE7CisgICAgfQorCisgICAgLyogUmVjb25maWd1cmUgYnVyc3QgY291bnQgZnJvbSB1c2VyIGlucHV0ICovCisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5pbWdsaWIuc3RpbGxtb3JlIiwgcHJvcCwgIjAiKTsKKyAgICB1aW50OF90IGJ1cnN0X3NldHByb3AgPSAodWludDMyX3QpYXRvaShwcm9wKTsKKyAgICBpZiAoYnVyc3Rfc2V0cHJvcCAhPSAwKSAgeworICAgICAgIGlmICgoYnVyc3Rfc2V0cHJvcCA8IHN0aWxsbW9yZV9jYXAubWluX2J1cnN0X2NvdW50KSB8fAorICAgICAgICAgICAgICAgKGJ1cnN0X3NldHByb3AgPiBzdGlsbG1vcmVfY2FwLm1heF9idXJzdF9jb3VudCkpIHsKKyAgICAgICAgICAgYnVyc3RfY250ID0gc3RpbGxtb3JlX2NhcC5tYXhfYnVyc3RfY291bnQ7CisgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgYnVyc3RfY250ID0gYnVyc3Rfc2V0cHJvcDsKKyAgICAgICB9CisgICAgfQorCisgICAgbWVtc2V0KCZzdGlsbG1vcmVfY29uZmlnLCAwLCBzaXplb2YoY2FtX3N0aWxsX21vcmVfdCkpOworICAgIHN0aWxsbW9yZV9jb25maWcuYnVyc3RfY291bnQgPSBidXJzdF9jbnQ7CisgICAgbVBhcmFtZXRlcnMuc2V0U3RpbGxNb3JlU2V0dGluZ3Moc3RpbGxtb3JlX2NvbmZpZyk7CisKKyAgICBMT0dIKCJTdGlsbG1vcmUgYnVyc3QgJWQiLCBidXJzdF9jbnQpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0b3BBZHZhbmNlZENhcHR1cmUKKyAqCisgKiBERVNDUklQVElPTjogc3RvcHMgYWR2YW5jZWQgY2FwdHVyZSBiYXNlZCBvbiBjYXB0dXJlIHR5cGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBDaGFubmVsIDogY2hhbm5lbC4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnN0b3BBZHZhbmNlZENhcHR1cmUoCisgICAgICAgIFFDYW1lcmFQaWNDaGFubmVsICpwQ2hhbm5lbCkKK3sKKyAgICBMT0dIKCJzdG9wIGJyYWNrZXRpZyIpOworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIGlmKG1QYXJhbWV0ZXJzLmlzVWJpRm9jdXNFbmFibGVkKCkgfHwgbVBhcmFtZXRlcnMuaXNVYmlSZWZvY3VzKCkpIHsKKyAgICAgICAgcmMgPSBwQ2hhbm5lbC0+c3RvcEFkdmFuY2VkQ2FwdHVyZShNTV9DQU1FUkFfQUZfQlJBQ0tFVElORyk7CisgICAgfSBlbHNlIGlmIChtUGFyYW1ldGVycy5pc0Nocm9tYUZsYXNoRW5hYmxlZCgpCisgICAgICAgICAgICB8fCAobUZsYXNoQ29uZmlndXJlZCAmJiAhbUxvbmdzaG90RW5hYmxlZCkKKyAgICAgICAgICAgIHx8IChtTG93TGlnaHRDb25maWd1cmVkID09IHRydWUpCisgICAgICAgICAgICB8fCAobVBhcmFtZXRlcnMuZ2V0TWFudWFsQ2FwdHVyZU1vZGUoKSA+PSBDQU1fTUFOVUFMX0NBUFRVUkVfVFlQRV8yKSkgeworICAgICAgICByYyA9IHBDaGFubmVsLT5zdG9wQWR2YW5jZWRDYXB0dXJlKE1NX0NBTUVSQV9GUkFNRV9DQVBUVVJFKTsKKyAgICAgICAgbUZsYXNoQ29uZmlndXJlZCA9IGZhbHNlOworICAgICAgICBtTG93TGlnaHRDb25maWd1cmVkID0gZmFsc2U7CisgICAgfSBlbHNlIGlmKG1QYXJhbWV0ZXJzLmlzSERSRW5hYmxlZCgpCisgICAgICAgICAgICB8fCBtUGFyYW1ldGVycy5pc0FFQnJhY2tldEVuYWJsZWQoKSkgeworICAgICAgICByYyA9IHBDaGFubmVsLT5zdG9wQWR2YW5jZWRDYXB0dXJlKE1NX0NBTUVSQV9BRV9CUkFDS0VUSU5HKTsKKyAgICB9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLmlzT3B0aVpvb21FbmFibGVkKCkpIHsKKyAgICAgICAgcmMgPSBwQ2hhbm5lbC0+c3RvcEFkdmFuY2VkQ2FwdHVyZShNTV9DQU1FUkFfWk9PTV8xWCk7CisgICAgfSBlbHNlIGlmIChtUGFyYW1ldGVycy5pc1N0aWxsTW9yZUVuYWJsZWQoKSkgeworICAgICAgICBMT0dIKCJzdG9wQWR2YW5jZWRDYXB0dXJlIG5vdCBuZWVkZWQgZm9yIFN0aWxsTW9yZSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0goIk5vIEFkdmFuY2VkIENhcHR1cmUgZmVhdHVyZSBlbmFibGVkISIpOworICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0YXJ0QWR2YW5jZWRDYXB0dXJlCisgKgorICogREVTQ1JJUFRJT046IHN0YXJ0cyBhZHZhbmNlZCBjYXB0dXJlIGJhc2VkIG9uIGNhcHR1cmUgdHlwZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcENoYW5uZWwgOiBjaGFubmVsLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c3RhcnRBZHZhbmNlZENhcHR1cmUoCisgICAgICAgIFFDYW1lcmFQaWNDaGFubmVsICpwQ2hhbm5lbCkKK3sKKyAgICBMT0dIKCJTdGFydCBicmFja2V0aW5nIik7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgaWYobVBhcmFtZXRlcnMuaXNVYmlGb2N1c0VuYWJsZWQoKSB8fCBtUGFyYW1ldGVycy5pc1ViaVJlZm9jdXMoKSkgeworICAgICAgICByYyA9IHBDaGFubmVsLT5zdGFydEFkdmFuY2VkQ2FwdHVyZShNTV9DQU1FUkFfQUZfQlJBQ0tFVElORyk7CisgICAgfSBlbHNlIGlmIChtUGFyYW1ldGVycy5pc09wdGlab29tRW5hYmxlZCgpKSB7CisgICAgICAgIHJjID0gcENoYW5uZWwtPnN0YXJ0QWR2YW5jZWRDYXB0dXJlKE1NX0NBTUVSQV9aT09NXzFYKTsKKyAgICB9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLmlzU3RpbGxNb3JlRW5hYmxlZCgpKSB7CisgICAgICAgIExPR0goInN0YXJ0QWR2YW5jZWRDYXB0dXJlIG5vdCBuZWVkZWQgZm9yIFN0aWxsTW9yZSIpOworICAgIH0gZWxzZSBpZiAobVBhcmFtZXRlcnMuaXNIRFJFbmFibGVkKCkKKyAgICAgICAgICAgIHx8IG1QYXJhbWV0ZXJzLmlzQUVCcmFja2V0RW5hYmxlZCgpKSB7CisgICAgICAgIHJjID0gcENoYW5uZWwtPnN0YXJ0QWR2YW5jZWRDYXB0dXJlKE1NX0NBTUVSQV9BRV9CUkFDS0VUSU5HKTsKKyAgICB9IGVsc2UgaWYgKG1QYXJhbWV0ZXJzLmlzQ2hyb21hRmxhc2hFbmFibGVkKCkKKyAgICAgICAgICAgIHx8IChtRmxhc2hOZWVkZWQgJiYgIW1Mb25nc2hvdEVuYWJsZWQpCisgICAgICAgICAgICB8fCAobUxvd0xpZ2h0Q29uZmlndXJlZCA9PSB0cnVlKQorICAgICAgICAgICAgfHwgKG1QYXJhbWV0ZXJzLmdldE1hbnVhbENhcHR1cmVNb2RlKCkgPj0gQ0FNX01BTlVBTF9DQVBUVVJFX1RZUEVfMikpIHsKKyAgICAgICAgY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QgY29uZmlnID0gbVBhcmFtZXRlcnMuZ2V0Q2FwdHVyZUZyYW1lQ29uZmlnKCk7CisgICAgICAgIHJjID0gcENoYW5uZWwtPnN0YXJ0QWR2YW5jZWRDYXB0dXJlKE1NX0NBTUVSQV9GUkFNRV9DQVBUVVJFLCAmY29uZmlnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJObyBBZHZhbmNlZCBDYXB0dXJlIGZlYXR1cmUgZW5hYmxlZCEiKTsKKyAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcmVUYWtlUGljdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBQcmVwYXJlIHRha2UgcGljdHVyZSBpbXBsLCBSZXN0YXJ0cyBwcmV2aWV3IGlmIG5lY2Vzc2FyeQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnByZVRha2VQaWN0dXJlKCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgTE9HSCgiRSIpOworICAgIGlmIChtUGFyYW1ldGVycy5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKSA9PSB0cnVlKSB7CisKKyAgICAgICAgLy8gR2l2ZSBIV0kgY29udHJvbCB0byByZXN0YXJ0IHByZXZpZXcgb25seSBpbiBzaW5nbGUgY2FtZXJhIG1vZGUuCisgICAgICAgIC8vIEluIGR1YWwtY2FtIG1vZGUsIHRoaXMgY29udHJvbCBiZWxvbmdzIHRvIG11eGVyLgorICAgICAgICBpZiAoZ2V0UmVsYXRlZENhbVN5bmNJbmZvKCktPnN5bmNfY29udHJvbCAhPSBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT04pIHsKKyAgICAgICAgICAgIExPR0goInJlc3RhcnQgcHJldmlldyBpZiByZWMgaGludCBpcyB0cnVlIGFuZCBwcmV2aWV3IGlzIHJ1bm5pbmciKTsKKyAgICAgICAgICAgIHN0b3BQcmV2aWV3KCk7CisgICAgICAgICAgICBtUGFyYW1ldGVycy51cGRhdGVSZWNvcmRpbmdIaW50VmFsdWUoRkFMU0UpOworICAgICAgICAgICAgLy8gc3RhcnQgcHJldmlldyBhZ2FpbgorICAgICAgICAgICAgcmMgPSBwcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmMgPSBzdGFydFByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZvciBkdWFsIGNhbSBtb2RlLCB1cGRhdGUgdGhlIGZsYWcgbVByZXZpZXdSZXN0YXJ0TmVlZGVkIHRvIHRydWUKKyAgICAgICAgICAgIC8vIFJlc3RhcnQgY29udHJvbCB3aWxsIGJlIGhhbmRsZWQgYnkgbXV4ZXIuCisgICAgICAgICAgICBtUHJldmlld1Jlc3RhcnROZWVkZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HSCgiWCByYyA9ICVkIiwgcmMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB0YWtlUGljdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiB0YWtlIHBpY3R1cmUgaW1wbAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnRha2VQaWN0dXJlKCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKworICAgIC8vIEdldCB0b3RhbCBudW1iZXIgZm9yIHNuYXBzaG90cyAocmV0cm8gKyByZWd1bGFyKQorICAgIHVpbnQ4X3QgbnVtU25hcHNob3RzID0gbVBhcmFtZXRlcnMuZ2V0TnVtT2ZTbmFwc2hvdHMoKTsKKyAgICAvLyBHZXQgbnVtYmVyIG9mIHJldHJvLWFjdGl2ZSBzbmFwc2hvdHMKKyAgICB1aW50OF90IG51bVJldHJvU25hcHNob3RzID0gbVBhcmFtZXRlcnMuZ2V0TnVtT2ZSZXRyb1NuYXBzaG90cygpOworICAgIExPR0goIkUiKTsKKworICAgIC8vU2V0IHJvdGF0aW9uIHZhbHVlIGZyb20gdXNlciBzZXR0aW5ncyBhcyBKcGVnIHJvdGF0aW9uCisgICAgLy90byBjb25maWd1cmUgYmFjay1lbmQgbW9kdWxlcy4KKyAgICBtUGFyYW1ldGVycy5zZXRKcGVnUm90YXRpb24obVBhcmFtZXRlcnMuZ2V0Um90YXRpb24oKSk7CisKKyAgICAvLyBDaGVjayBpZiByZXRyby1hY3RpdmUgc25hcHNob3RzIGFyZSBub3QgZW5hYmxlZAorICAgIGlmICghaXNSZXRyb1BpY3R1cmUoKSB8fCAhbVBhcmFtZXRlcnMuaXNaU0xNb2RlKCkpIHsKKyAgICAgIG51bVJldHJvU25hcHNob3RzID0gMDsKKyAgICAgIExPR0goIlJlc2V0IHJldHJvIHNuYXBob3QgY291bnQgdG8gemVybyIpOworICAgIH0KKworICAgIC8vRG8gc3BlY2lhbCBjb25maWd1cmUgZm9yIGFkdmFuY2VkIGNhcHR1cmUgbW9kZXMuCisgICAgcmMgPSBjb25maWd1cmVBZHZhbmNlZENhcHR1cmUoKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiVW5zdXBwb3J0ZWQgY2FwdHVyZSBjYWxsIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAobUFkdmFuY2VkQ2FwdHVyZUNvbmZpZ3VyZWQpIHsKKyAgICAgICAgbnVtU25hcHNob3RzID0gbVBhcmFtZXRlcnMuZ2V0QnVyc3RDb3VudEZvckFkdmFuY2VkQ2FwdHVyZSgpOworICAgIH0KKyAgICBMT0dJKCJzbmFwIGNvdW50ID0gJWQgenNsID0gJWQgYWR2YW5jZWQgPSAlZCIsCisgICAgICAgICAgICBudW1TbmFwc2hvdHMsIG1QYXJhbWV0ZXJzLmlzWlNMTW9kZSgpLCBtQWR2YW5jZWRDYXB0dXJlQ29uZmlndXJlZCk7CisKKyAgICBpZiAobVBhcmFtZXRlcnMuaXNaU0xNb2RlKCkpIHsKKyAgICAgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsID0gbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfWlNMXTsKKyAgICAgICAgUUNhbWVyYVBpY0NoYW5uZWwgKnBQaWNDaGFubmVsID0gKFFDYW1lcmFQaWNDaGFubmVsICopcENoYW5uZWw7CisgICAgICAgIGlmIChOVUxMICE9IHBQaWNDaGFubmVsKSB7CisKKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5nZXRvZmZsaW5lUkFXKCkpIHsKKyAgICAgICAgICAgICAgICBzdGFydFJBV0NoYW5uZWwocFBpY0NoYW5uZWwpOworICAgICAgICAgICAgICAgIHBQaWNDaGFubmVsID0gKFFDYW1lcmFQaWNDaGFubmVsICopbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfUkFXXTsKKyAgICAgICAgICAgICAgICBpZiAocFBpY0NoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJSQVcgQ2hhbm5lbCBpcyBOVUxMIGluIE1hbnVhbCBjYXB0dXJlIG1vZGUiKTsKKyAgICAgICAgICAgICAgICAgICAgc3RvcFJBV0NoYW5uZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IGNvbmZpZ3VyZU9ubGluZVJvdGF0aW9uKCpwUGljQ2hhbm5lbCk7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJvbmxpbmUgcm90YXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzdGFydCBwb3N0cHJvY2Vzc29yCisgICAgICAgICAgICBEZWZlcldvcmtBcmdzIGFyZ3M7CisgICAgICAgICAgICBtZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihEZWZlcldvcmtBcmdzKSk7CisKKyAgICAgICAgICAgIGFyZ3MucHByb2NBcmdzID0gcFBpY0NoYW5uZWw7CisKKyAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gd2FpdCBmb3IgbUluaXRQUHJvY0pvYiBoZXJlLCBiZWNhdXNlIGl0IHdhcworICAgICAgICAgICAgLy8gcXVldWVkIGluIHN0YXJ0UHJldmlldywgYW5kIHdpbGwgZGVmaW5pdGVseSBiZSBwcm9jZXNzZWQgYmVmb3JlCisgICAgICAgICAgICAvLyBtUmVwcm9jSm9iIGNhbiBiZWdpbi4KKyAgICAgICAgICAgIG1SZXByb2NKb2IgPSBxdWV1ZURlZmVycmVkV29yayhDTURfREVGX1BQUk9DX1NUQVJULAorICAgICAgICAgICAgICAgICAgICBhcmdzKTsKKyAgICAgICAgICAgIGlmIChtUmVwcm9jSm9iID09IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJGYWlsdXJlOiBVbmFibGUgdG8gc3RhcnQgcHByb2MiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYWxsIHByZXZpZXcgYnVmZmVycyBhcmUgbWFwcGVkIGJlZm9yZSBjcmVhdGluZworICAgICAgICAgICAgLy8gYSBqcGVnIHNlc3Npb24gYXMgcHJldmlldyBzdHJlYW0gYnVmZmVycyBhcmUgcXVlcmllZCBkdXJpbmcgdGhlIHNhbWUKKyAgICAgICAgICAgIHVpbnQ4X3QgbnVtU3RyZWFtcyA9IHBDaGFubmVsLT5nZXROdW1PZlN0cmVhbXMoKTsKKyAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBTdHJlYW0gPSBOVUxMOworICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqcFByZXZpZXdTdHJlYW0gPSBOVUxMOworICAgICAgICAgICAgZm9yICh1aW50OF90IGkgPSAwIDsgaSA8IG51bVN0cmVhbXMgOyBpKysgKSB7CisgICAgICAgICAgICAgICAgcFN0cmVhbSA9IHBDaGFubmVsLT5nZXRTdHJlYW1CeUluZGV4KGkpOworICAgICAgICAgICAgICAgIGlmICghcFN0cmVhbSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXID09IHBTdHJlYW0tPmdldE15VHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHBQcmV2aWV3U3RyZWFtID0gcFN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBQcmV2aWV3U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTWFwTG9jayk7CisgICAgICAgICAgICAgICAgUUNhbWVyYU1lbW9yeSAqcE1lbW9yeSA9IHBTdHJlYW0tPmdldFN0cmVhbUJ1ZnMoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXBNZW1vcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IhISBwTWVtb3J5IGlzIE5VTEwiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdWludDhfdCB3YWl0Q250ID0gMjsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIXBNZW1vcnktPmNoZWNrSWZBbGxCdWZmZXJzTWFwcGVkKCkgJiYgKHdhaXRDbnQgPiAwKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dMKCIgV2FpdGluZyBmb3IgcHJldmlldyBidWZmZXJzIHRvIGJlIG1hcHBlZCIpOworICAgICAgICAgICAgICAgICAgICBtTWFwQ29uZC53YWl0UmVsYXRpdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hcExvY2ssIENBTUVSQV9ERUZFUlJFRF9NQVBfQlVGX1RJTUVPVVQpOworICAgICAgICAgICAgICAgICAgICBMT0dMKCJXYWl0IGNvbXBsZXRlZCEhIik7CisgICAgICAgICAgICAgICAgICAgIHdhaXRDbnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gSWYgYWxsIGJ1ZmZlcnMgYXJlIG5vdCBtYXBwZWQgYWZ0ZXIgcmV0cmllcywgYXNzZXJ0CisgICAgICAgICAgICAgICAgYXNzZXJ0KHBNZW1vcnktPmNoZWNrSWZBbGxCdWZmZXJzTWFwcGVkKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQocFByZXZpZXdTdHJlYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDcmVhdGUgSlBFRyBzZXNzaW9uCisgICAgICAgICAgICBtSnBlZ0pvYiA9IHF1ZXVlRGVmZXJyZWRXb3JrKENNRF9ERUZfQ1JFQVRFX0pQRUdfU0VTU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgYXJncyk7CisgICAgICAgICAgICBpZiAobUpwZWdKb2IgPT0gMCkgeworICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBxdWV1ZSBDUkVBVEVfSlBFR19TRVNTSU9OIik7CisgICAgICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHdhaXREZWZlcnJlZFdvcmsobVJlcHJvY0pvYikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIlJlcHJvY2VzcyBEZWZlcnJlZCB3b3JrIHdhcyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbV9wb3N0cHJvY2Vzc29yLnN0b3AoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1BZHZhbmNlZENhcHR1cmVDb25maWd1cmVkKSB7CisgICAgICAgICAgICAgICAgcmMgPSBzdGFydEFkdmFuY2VkQ2FwdHVyZShwUGljQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoImNhbm5vdCBzdGFydCB6c2wgYWR2YW5jZWQgY2FwdHVyZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1Mb25nc2hvdEVuYWJsZWQgJiYgbVByZXBTbmFwUnVuKSB7CisgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzLT5zdGFydF96c2xfc25hcHNob3QoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgcFBpY0NoYW5uZWwtPmdldE15SGFuZGxlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgZnJhbWUgc3luYyBpcyBPTiBhbmQgaXQgaXMgYSBTRUNPTkRBUlkgY2FtZXJhLAorICAgICAgICAgICAgLy8gd2UgZG8gbm90IG5lZWQgdG8gc2VuZCB0aGUgdGFrZSBwaWN0dXJlIGNvbW1hbmQgdG8gaW50ZXJmYWNlCisgICAgICAgICAgICAvLyBJdCB3aWxsIGJlIGhhbmRsZWQgYWxvbmcgd2l0aCBQUklNQVJZIGNhbWVyYSB0YWtlUGljdHVyZSByZXF1ZXN0CisgICAgICAgICAgICBtbV9jYW1lcmFfcmVxX2J1Zl90IGJ1ZjsKKyAgICAgICAgICAgIG1lbXNldCgmYnVmLCAweDAsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgIGlmICgoIW1QYXJhbWV0ZXJzLmlzQWR2Q2FtRmVhdHVyZXNFbmFibGVkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1GbGFzaE5lZWRlZCAmJgorICAgICAgICAgICAgICAgICAgICAhaXNMb25nc2hvdEVuYWJsZWQoKSAmJgorICAgICAgICAgICAgICAgICAgICBpc0ZyYW1lU3luY0VuYWJsZWQoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGdldFJlbGF0ZWRDYW1TeW5jSW5mbygpLT5zeW5jX2NvbnRyb2wgPT0KKyAgICAgICAgICAgICAgICAgICAgQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09OKSkgeworICAgICAgICAgICAgICAgIGlmIChnZXRSZWxhdGVkQ2FtU3luY0luZm8oKS0+bW9kZSA9PSBDQU1fTU9ERV9QUklNQVJZKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi50eXBlID0gTU1fQ0FNRVJBX1JFUV9GUkFNRV9TWU5DX0JVRjsKKyAgICAgICAgICAgICAgICAgICAgYnVmLm51bV9idWZfcmVxdWVzdGVkID0gbnVtU25hcHNob3RzOworICAgICAgICAgICAgICAgICAgICByYyA9IHBQaWNDaGFubmVsLT50YWtlUGljdHVyZSgmYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGU19EQkcgY2Fubm90IHRha2UgWlNMIHBpY3R1cmUsIHN0b3AgcHByb2MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSB3YWl0RGVmZXJyZWRXb3JrKG1SZXByb2NKb2IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiUmVwcm9jZXNzIERlZmVycmVkIHdvcmsgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gd2FpdERlZmVycmVkV29yayhtSnBlZ0pvYikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJKcGVnIERlZmVycmVkIHdvcmsgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3Bvc3Rwcm9jZXNzb3Iuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExPR0koIlBSSU1BUlkgY2FtZXJhOiBzZW5kIGZyYW1lIHN5bmMgdGFrZVBpY3R1cmUhISIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmLnR5cGUgPSBNTV9DQU1FUkFfUkVRX1NVUEVSX0JVRjsKKyAgICAgICAgICAgICAgICBidWYubnVtX2J1Zl9yZXF1ZXN0ZWQgPSBudW1TbmFwc2hvdHM7CisgICAgICAgICAgICAgICAgYnVmLm51bV9yZXRyb19idWZfcmVxdWVzdGVkID0gbnVtUmV0cm9TbmFwc2hvdHM7CisgICAgICAgICAgICAgICAgcmMgPSBwUGljQ2hhbm5lbC0+dGFrZVBpY3R1cmUoJmJ1Zik7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoImNhbm5vdCB0YWtlIFpTTCBwaWN0dXJlLCBzdG9wIHBwcm9jIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gd2FpdERlZmVycmVkV29yayhtUmVwcm9jSm9iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIlJlcHJvY2VzcyBEZWZlcnJlZCB3b3JrIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHdhaXREZWZlcnJlZFdvcmsobUpwZWdKb2IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiSnBlZyBEZWZlcnJlZCB3b3JrIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtX3Bvc3Rwcm9jZXNzb3Iuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiWlNMIGNoYW5uZWwgaXMgTlVMTCIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworCisgICAgICAgIC8vIHN0YXJ0IHNuYXBzaG90CisgICAgICAgIGlmIChtUGFyYW1ldGVycy5pc0pwZWdQaWN0dXJlRm9ybWF0KCkgfHwKKyAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5pc05WMTZQaWN0dXJlRm9ybWF0KCkgfHwKKyAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5pc05WMjFQaWN0dXJlRm9ybWF0KCkpIHsKKworICAgICAgICAgICAgLy9TVE9QIFByZXZpZXcgZm9yIE5vbiBaU0wgdXNlIGNhc2UKKyAgICAgICAgICAgIHN0b3BQcmV2aWV3KCk7CisKKyAgICAgICAgICAgIC8vQ29uZmlnIENBUFRVUkUgY2hhbm5lbHMKKyAgICAgICAgICAgIHJjID0gZGVjbGFyZVNuYXBzaG90U3RyZWFtcygpOworICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IGFkZENhcHR1cmVDaGFubmVsKCk7CisgICAgICAgICAgICBpZiAoKHJjID09IE5PX0VSUk9SKSAmJgorICAgICAgICAgICAgICAgICAgICAoTlVMTCAhPSBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9DQVBUVVJFXSkpIHsKKworICAgICAgICAgICAgICAgIGlmICghbVBhcmFtZXRlcnMuZ2V0b2ZmbGluZVJBVygpKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gY29uZmlndXJlT25saW5lUm90YXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAqbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfQ0FQVFVSRV0pOworICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIm9ubGluZSByb3RhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX0NBUFRVUkUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRGVmZXJXb3JrQXJncyBhcmdzOworICAgICAgICAgICAgICAgIG1lbXNldCgmYXJncywgMCwgc2l6ZW9mKERlZmVyV29ya0FyZ3MpKTsKKworICAgICAgICAgICAgICAgIGFyZ3MucHByb2NBcmdzID0gbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfQ0FQVFVSRV07CisKKyAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHdhaXQgZm9yIG1Jbml0UFByb2NKb2IgaGVyZSwgYmVjYXVzZSBpdCB3YXMKKyAgICAgICAgICAgICAgICAvLyBxdWV1ZWQgaW4gc3RhcnRQcmV2aWV3LCBhbmQgd2lsbCBkZWZpbml0ZWx5IGJlIHByb2Nlc3NlZCBiZWZvcmUKKyAgICAgICAgICAgICAgICAvLyBtUmVwcm9jSm9iIGNhbiBiZWdpbi4KKyAgICAgICAgICAgICAgICBtUmVwcm9jSm9iID0gcXVldWVEZWZlcnJlZFdvcmsoQ01EX0RFRl9QUFJPQ19TVEFSVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MpOworICAgICAgICAgICAgICAgIGlmIChtUmVwcm9jSm9iID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiRmFpbHVyZTogVW5hYmxlIHRvIHN0YXJ0IHBwcm9jIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBKUEVHIHNlc3Npb24KKyAgICAgICAgICAgICAgICBtSnBlZ0pvYiA9IHF1ZXVlRGVmZXJyZWRXb3JrKENNRF9ERUZfQ1JFQVRFX0pQRUdfU0VTU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MpOworICAgICAgICAgICAgICAgIGlmIChtSnBlZ0pvYiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBxdWV1ZSBDUkVBVEVfSlBFR19TRVNTSU9OIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSB3YWl0RGVmZXJyZWRXb3JrKG1SZXByb2NKb2IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJSZXByb2Nlc3MgRGVmZXJyZWQgd29yayB3YXMgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbV9wb3N0cHJvY2Vzc29yLnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc3RhcnQgY2F0cHVyZSBjaGFubmVsCisgICAgICAgICAgICAgICAgcmMgPSAgbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfQ0FQVFVSRV0tPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoImNhbm5vdCBzdGFydCBjYXB0dXJlIGNoYW5uZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHdhaXREZWZlcnJlZFdvcmsobVJlcHJvY0pvYikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIlJlcHJvY2VzcyBEZWZlcnJlZCB3b3JrIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHdhaXREZWZlcnJlZFdvcmsobUpwZWdKb2IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJKcGVnIERlZmVycmVkIHdvcmsgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWxDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9DQVBUVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFFDYW1lcmFQaWNDaGFubmVsICpwQ2FwQ2hhbm5lbCA9CisgICAgICAgICAgICAgICAgICAgIChRQ2FtZXJhUGljQ2hhbm5lbCAqKW1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX0NBUFRVUkVdOworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHBDYXBDaGFubmVsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5pc1ViaUZvY3VzRW5hYmxlZCgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuaXNVYmlSZWZvY3VzKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5pc0Nocm9tYUZsYXNoRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IHN0YXJ0QWR2YW5jZWRDYXB0dXJlKHBDYXBDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImNhbm5vdCBzdGFydCBhZHZhbmNlZCBjYXB0dXJlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggbUxvbmdzaG90RW5hYmxlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBsb25nU2hvdCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSB3YWl0RGVmZXJyZWRXb3JrKG1SZXByb2NKb2IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiUmVwcm9jZXNzIERlZmVycmVkIHdvcmsgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gd2FpdERlZmVycmVkV29yayhtSnBlZ0pvYikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJKcGVnIERlZmVycmVkIHdvcmsgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9DQVBUVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiY2Fubm90IGFkZCBjYXB0dXJlIGNoYW5uZWwiKTsKKyAgICAgICAgICAgICAgICBkZWxDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9DQVBUVVJFKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTdG9wIFByZXZpZXcgYmVmb3JlIHRha2luZyBOWlNMIHNuYXBzaG90CisgICAgICAgICAgICBzdG9wUHJldmlldygpOworCisgICAgICAgICAgICByYyA9IG1QYXJhbWV0ZXJzLnVwZGF0ZVJBVyhnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5yYXdfZGltWzBdKTsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgIExPR0UoIlJhdyBkaW1lbnNpb24gdXBkYXRlIGZhaWxlZCAlZCIsIHJjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gZGVjbGFyZVNuYXBzaG90U3RyZWFtcygpOworICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiUkFXIHN0cmVhbSBpbmZvIGNvbmZpZ3VyYXRpb24gZmFpbGVkICVkIiwgcmMpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBhZGRDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9SQVcpOworICAgICAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgLy8gc3RhcnQgcG9zdHByb2Nlc3NvcgorICAgICAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSB3YWl0RGVmZXJyZWRXb3JrKG1Jbml0UFByb2NKb2IpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIlJlcHJvY2VzcyBEZWZlcnJlZCB3b3JrIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByYyA9IG1fcG9zdHByb2Nlc3Nvci5zdGFydChtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9SQVddKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiY2Fubm90IHN0YXJ0IHBvc3Rwcm9jZXNzb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfUkFXKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJjID0gc3RhcnRDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9SQVcpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJjYW5ub3Qgc3RhcnQgcmF3IGNoYW5uZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgbV9wb3N0cHJvY2Vzc29yLnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfUkFXKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiY2Fubm90IGFkZCByYXcgY2hhbm5lbCIpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vV2hlbiB0YWtlIHBpY3R1cmUsIHN0b3Agc2VuZGluZyBwcmV2aWV3IGNhbGxiYWNrcyB0byBBUFAKKyAgICBtX3N0YXRlTWFjaGluZS5zZXRQcmV2aWV3Q2FsbGJhY2tOZWVkZWQoZmFsc2UpOworICAgIExPR0koIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY29uZmlndXJlT25saW5lUm90YXRpb24KKyAqCisgKiBERVNDUklQVElPTjogQ29uZmlndXJlIGJhY2tlbmQgd2l0aCBleHBlY3RlZCByb3RhdGlvbiBmb3Igc25hcHNob3Qgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgICBAY2ggICAgIDogQ2hhbm5lbCBjb250YWluaW5nIGEgc25hcHNob3Qgc3RyZWFtCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpjb25maWd1cmVPbmxpbmVSb3RhdGlvbihRQ2FtZXJhQ2hhbm5lbCAmY2gpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgdWludDMyX3Qgc3RyZWFtSWQgPSAwOworICAgIFFDYW1lcmFTdHJlYW0gKnBTdHJlYW0gPSBOVUxMOworCisgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgY2guZ2V0TnVtT2ZTdHJlYW1zKCk7IGkrKykgeworICAgICAgICBRQ2FtZXJhU3RyZWFtICpzdHJlYW0gPSBjaC5nZXRTdHJlYW1CeUluZGV4KGkpOworICAgICAgICBpZiAoKE5VTEwgIT0gc3RyZWFtKSAmJgorICAgICAgICAgICAgICAgICgoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UID09IHN0cmVhbS0+Z2V0TXlUeXBlKCkpCisgICAgICAgICAgICAgICAgfHwgKENBTV9TVFJFQU1fVFlQRV9SQVcgPT0gc3RyZWFtLT5nZXRNeVR5cGUoKSkpKSB7CisgICAgICAgICAgICBwU3RyZWFtID0gc3RyZWFtOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBwU3RyZWFtKSB7CisgICAgICAgIExPR0UoIk5vIHNuYXBzaG90IHN0cmVhbSBmb3VuZCEiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdHJlYW1JZCA9IHBTdHJlYW0tPmdldE15U2VydmVySUQoKTsKKyAgICAvLyBVcGRhdGUgb25saW5lIHJvdGF0aW9uIGNvbmZpZ3VyYXRpb24KKyAgICByYyA9IG1QYXJhbWV0ZXJzLmFkZE9ubGluZVJvdGF0aW9uKG1QYXJhbWV0ZXJzLmdldEpwZWdSb3RhdGlvbigpLCBzdHJlYW1JZCwKKyAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldERldmljZVJvdGF0aW9uKCkpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJhZGRPbmxpbmVSb3RhdGlvbiBmYWlsZWQgJWQiLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGVjbGFyZVNuYXBzaG90U3RyZWFtcworICoKKyAqIERFU0NSSVBUSU9OOiBDb25maWd1cmUgYmFja2VuZCB3aXRoIGV4cGVjdGVkIHNuYXBzaG90IHN0cmVhbXMKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6ZGVjbGFyZVNuYXBzaG90U3RyZWFtcygpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisKKyAgICAvLyBVcGRhdGUgc3RyZWFtIGluZm8gY29uZmlndXJhdGlvbgorICAgIHJjID0gbVBhcmFtZXRlcnMuc2V0U3RyZWFtQ29uZmlndXJlKHRydWUsIG1Mb25nc2hvdEVuYWJsZWQsIGZhbHNlKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgic2V0U3RyZWFtQ29uZmlndXJlIGZhaWxlZCAlZCIsIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBsb25nU2hvdAorICoKKyAqIERFU0NSSVBUSU9OOiBRdWV1ZSBvbmUgbW9yZSBaU0wgZnJhbWUKKyAqICAgICAgICAgICAgICBpbiB0aGUgbG9uZ3Nob3QgcGlwZS4KKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6bG9uZ1Nob3QoKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICB1aW50OF90IG51bVNuYXBzaG90cyA9IG1QYXJhbWV0ZXJzLmdldE51bU9mU25hcHNob3RzKCk7CisgICAgUUNhbWVyYVBpY0NoYW5uZWwgKnBDaGFubmVsID0gTlVMTDsKKworICAgIGlmIChtUGFyYW1ldGVycy5pc1pTTE1vZGUoKSkgeworICAgICAgICBwQ2hhbm5lbCA9IChRQ2FtZXJhUGljQ2hhbm5lbCAqKW1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1pTTF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcENoYW5uZWwgPSAoUUNhbWVyYVBpY0NoYW5uZWwgKiltX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9DQVBUVVJFXTsKKyAgICB9CisKKyAgICBpZiAoTlVMTCAhPSBwQ2hhbm5lbCkgeworICAgICAgICBtbV9jYW1lcmFfcmVxX2J1Zl90IGJ1ZjsKKyAgICAgICAgbWVtc2V0KCZidWYsIDB4MCwgc2l6ZW9mKGJ1ZikpOworICAgICAgICBidWYudHlwZSA9IE1NX0NBTUVSQV9SRVFfU1VQRVJfQlVGOworICAgICAgICBidWYubnVtX2J1Zl9yZXF1ZXN0ZWQgPSBudW1TbmFwc2hvdHM7CisgICAgICAgIHJjID0gcENoYW5uZWwtPnRha2VQaWN0dXJlKCZidWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkNhcHR1cmUgY2hhbm5lbCBub3QgaW5pdGlhbGl6ZWQhIik7CisgICAgICAgIHJjID0gTk9fSU5JVDsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCitlbmQ6CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0b3BDYXB0dXJlQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBTdG9wcyBjYXB0dXJlIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRlc3Ryb3kgOiBTZXQgdG8gdHJ1ZSB0byBzdG9wIGFuZCBkZWxldGUgY2FtZXJhIGNoYW5uZWwuCisgKiAgICAgICAgICAgICAgU2V0IHRvIGZhbHNlIHRvIG9ubHkgc3RvcCBjYXB0dXJlIGNoYW5uZWwuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnN0b3BDYXB0dXJlQ2hhbm5lbChib29sIGRlc3Ryb3kpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgaWYgKG1QYXJhbWV0ZXJzLmlzSnBlZ1BpY3R1cmVGb3JtYXQoKSB8fAorICAgICAgICBtUGFyYW1ldGVycy5pc05WMTZQaWN0dXJlRm9ybWF0KCkgfHwKKyAgICAgICAgbVBhcmFtZXRlcnMuaXNOVjIxUGljdHVyZUZvcm1hdCgpKSB7CisgICAgICAgIG1QYXJhbWV0ZXJzLnNldFF1YWRyYUNmYU1vZGUoZmFsc2UsIHRydWUpOworICAgICAgICByYyA9IHN0b3BDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9DQVBUVVJFKTsKKyAgICAgICAgaWYgKGRlc3Ryb3kgJiYgKE5PX0VSUk9SID09IHJjKSkgeworICAgICAgICAgICAgLy8gRGVzdHJveSBjYW1lcmEgY2hhbm5lbCBidXQgZG9udCByZWxlYXNlIGNvbnRleHQKKyAgICAgICAgICAgIHdhaXREZWZlcnJlZFdvcmsobUpwZWdKb2IpOworICAgICAgICAgICAgcmMgPSBkZWxDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9DQVBUVVJFLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2FuY2VsUGljdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBjYW5jZWwgcGljdHVyZSBpbXBsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Y2FuY2VsUGljdHVyZSgpCit7CisgICAgd2FpdERlZmVycmVkV29yayhtUmVwcm9jSm9iKTsKKyAgICB3YWl0RGVmZXJyZWRXb3JrKG1KcGVnSm9iKTsKKworICAgIC8vc3RvcCBwb3N0IHByb2Nlc3NvcgorICAgIG1fcG9zdHByb2Nlc3Nvci5zdG9wKCk7CisKKyAgICB1bmNvbmZpZ3VyZUFkdmFuY2VkQ2FwdHVyZSgpOworICAgIExPR0goIkVuYWJsZSBkaXNwbGF5IGZyYW1lcyBhZ2FpbiIpOworICAgIHNldERpc3BsYXlTa2lwKEZBTFNFKTsKKworICAgIGlmICghbUxvbmdzaG90RW5hYmxlZCkgeworICAgICAgICBtX3BlcmZMb2NrLmxvY2tfcmVsKCk7CisgICAgfQorCisgICAgaWYgKG1QYXJhbWV0ZXJzLmlzWlNMTW9kZSgpKSB7CisgICAgICAgIFFDYW1lcmFQaWNDaGFubmVsICpwUGljQ2hhbm5lbCA9IE5VTEw7CisgICAgICAgIGlmIChtUGFyYW1ldGVycy5nZXRvZmZsaW5lUkFXKCkpIHsKKyAgICAgICAgICAgIHBQaWNDaGFubmVsID0gKFFDYW1lcmFQaWNDaGFubmVsICopbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfUkFXXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBQaWNDaGFubmVsID0gKFFDYW1lcmFQaWNDaGFubmVsICopbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfWlNMXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoTlVMTCAhPSBwUGljQ2hhbm5lbCkgeworICAgICAgICAgICAgcFBpY0NoYW5uZWwtPmNhbmNlbFBpY3R1cmUoKTsKKyAgICAgICAgICAgIHN0b3BSQVdDaGFubmVsKCk7CisgICAgICAgICAgICBzdG9wQWR2YW5jZWRDYXB0dXJlKHBQaWNDaGFubmVsKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisKKyAgICAgICAgLy8gbm9ybWFsIGNhcHR1cmUgY2FzZQorICAgICAgICBpZiAobVBhcmFtZXRlcnMuaXNKcGVnUGljdHVyZUZvcm1hdCgpIHx8CisgICAgICAgICAgICBtUGFyYW1ldGVycy5pc05WMTZQaWN0dXJlRm9ybWF0KCkgfHwKKyAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmlzTlYyMVBpY3R1cmVGb3JtYXQoKSkgeworICAgICAgICAgICAgc3RvcENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX0NBUFRVUkUpOworICAgICAgICAgICAgZGVsQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfQ0FQVFVSRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdG9wQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfUkFXKTsKKyAgICAgICAgICAgIGRlbENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1JBVyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2FwdHVyZURvbmUKKyAqCisgKiBERVNDUklQVElPTjogRnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNhcHR1cmUgaXMgY29tcGxldGVkIGJlZm9yZSBlbmNvZGluZworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpjYXB0dXJlRG9uZSgpCit7CisgICAgcWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICpwYXlsb2FkID0KKyAgICAgICAocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICopCisgICAgICAgbWFsbG9jKHNpemVvZihxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QpKTsKKyAgICBpZiAoTlVMTCAhPSBwYXlsb2FkKSB7CisgICAgICAgIG1lbXNldChwYXlsb2FkLCAwLCBzaXplb2YocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90KSk7CisgICAgICAgIHBheWxvYWQtPmV2dF90eXBlID0gUUNBTUVSQV9JTlRFUk5BTF9FVlRfWlNMX0NBUFRVUkVfRE9ORTsKKyAgICAgICAgaW50MzJfdCByYyA9IHByb2Nlc3NFdnQoUUNBTUVSQV9TTV9FVlRfRVZUX0lOVEVSTkFMLCBwYXlsb2FkKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJwcm9jZXNzRXZ0IFpTTCBjYXB0dXJlIGRvbmUgZmFpbGVkIik7CisgICAgICAgICAgICBmcmVlKHBheWxvYWQpOworICAgICAgICAgICAgcGF5bG9hZCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIFpTTCBjYXB0dXJlIGRvbmUgZXZlbnQiKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogTGl2ZV9TbmFwc2hvdF90aHJlYWQKKyAqCisgKiBERVNDUklQVElPTjogU2VwZXJhdGUgdGhyZWFkIGZvciB0YWtpbmcgbGl2ZSBzbmFwc2hvdCBkdXJpbmcgcmVjb3JkaW5nCisgKgorICogUEFSQU1FVEVSUyA6IEBkYXRhIC0gcG9pbnRlciB0byBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlIGNsYXNzIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQqIExpdmVfU25hcHNob3RfdGhyZWFkICh2b2lkKiBkYXRhKQoreworCisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHcgPSByZWludGVycHJldF9jYXN0PFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKj4oZGF0YSk7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJ0YWtlX3BpY3R1cmVfdGhyZWFkOiBOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuICh2b2lkICopQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoaHctPmJMaXZlU25hcHNob3QpIHsKKyAgICAgICAgaHctPnRha2VMaXZlU25hcHNob3RfaW50ZXJuYWwoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBody0+Y2FuY2VsTGl2ZVNuYXBzaG90X2ludGVybmFsKCk7CisgICAgfQorICAgIHJldHVybiAodm9pZCogKU5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogSW50X1BpY190aHJlYWQKKyAqCisgKiBERVNDUklQVElPTjogU2VwZXJhdGUgdGhyZWFkIGZvciB0YWtpbmcgc25hcHNob3QgdHJpZ2dlcmVkIGJ5IGNhbWVyYSBiYWNrZW5kCisgKgorICogUEFSQU1FVEVSUyA6IEBkYXRhIC0gcG9pbnRlciB0byBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlIGNsYXNzIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQqIEludF9QaWNfdGhyZWFkICh2b2lkKiBkYXRhKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworCisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHcgPSByZWludGVycHJldF9jYXN0PFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKj4oZGF0YSk7CisKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoInRha2VfcGljdHVyZV90aHJlYWQ6IE5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm4gKHZvaWQgKilCQURfVkFMVUU7CisgICAgfQorCisgICAgYm9vbCBKcGVnTWVtT3B0ID0gZmFsc2U7CisgICAgY2hhciByYXdfZm9ybWF0W1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICBtZW1zZXQocmF3X2Zvcm1hdCwgMCwgc2l6ZW9mKHJhd19mb3JtYXQpKTsKKworICAgIHJjID0gaHctPnRha2VCYWNrZW5kUGljX2ludGVybmFsKCZKcGVnTWVtT3B0LCAmcmF3X2Zvcm1hdFswXSk7CisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIGh3LT5jaGVja0ludFBpY1BlbmRpbmcoSnBlZ01lbU9wdCwgJnJhd19mb3JtYXRbMF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vU25hcHNob3QgYXR0ZW1wdCBub3Qgc3VjY2Vzc2Z1bCwgd2UgbmVlZCB0byBkbyBjbGVhbnVwIGhlcmUKKyAgICAgICAgaHctPmNsZWFySW50UGVuZGluZ0V2ZW50cygpOworICAgIH0KKworICAgIHJldHVybiAodm9pZCogKU5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdGFrZUxpdmVTbmFwc2hvdAorICoKKyAqIERFU0NSSVBUSU9OOiB0YWtlIGxpdmUgc25hcHNob3QgZHVyaW5nIHJlY29yZGluZworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnRha2VMaXZlU25hcHNob3QoKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIGlmIChtTGl2ZVNuYXBzaG90VGhyZWFkICE9IDApIHsKKyAgICAgICAgcHRocmVhZF9qb2luKG1MaXZlU25hcHNob3RUaHJlYWQsTlVMTCk7CisgICAgICAgIG1MaXZlU25hcHNob3RUaHJlYWQgPSAwOworICAgIH0KKyAgICBiTGl2ZVNuYXBzaG90ID0gdHJ1ZTsKKyAgICByYz0gcHRocmVhZF9jcmVhdGUoJm1MaXZlU25hcHNob3RUaHJlYWQsIE5VTEwsIExpdmVfU25hcHNob3RfdGhyZWFkLCAodm9pZCAqKSB0aGlzKTsKKyAgICBpZiAoIXJjKSB7CisgICAgICAgIHB0aHJlYWRfc2V0bmFtZV9ucChtTGl2ZVNuYXBzaG90VGhyZWFkLCAiQ0FNX2xpdmVTbmFwIik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB0YWtlUGljdHVyZUludGVybmFsCisgKgorICogREVTQ1JJUFRJT046IHRha2Ugc25hcHNob3QgdHJpZ2dlcmVkIGJ5IGJhY2tlbmQKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjp0YWtlUGljdHVyZUludGVybmFsKCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICByYz0gcHRocmVhZF9jcmVhdGUoJm1JbnRQaWNUaHJlYWQsIE5VTEwsIEludF9QaWNfdGhyZWFkLCAodm9pZCAqKSB0aGlzKTsKKyAgICBpZiAoIXJjKSB7CisgICAgICAgIHB0aHJlYWRfc2V0bmFtZV9ucChtSW50UGljVGhyZWFkLCAiQ0FNX0ludFBpYyIpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2hlY2tJbnRQaWNQZW5kaW5nCisgKgorICogREVTQ1JJUFRJT046IHRpbWVkIHdhaXQgZm9yIGpwZWcgY29tcGxldGlvbiBldmVudCwgYW5kIHNlbmQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgYmFjayBjb21wbGV0aW9uIGV2ZW50IHRvIGJhY2tlbmQKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Y2hlY2tJbnRQaWNQZW5kaW5nKGJvb2wgSnBlZ01lbU9wdCwgY2hhciAqcmF3X2Zvcm1hdCkKK3sKKyAgICBib29sIGJTZW5kVG9CYWNrZW5kID0gdHJ1ZTsKKyAgICBjYW1faW50X2V2dF9wYXJhbXNfdCBwYXJhbXM7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICB0czsKKyAgICBzdHJ1Y3QgdGltZXZhbCAgICB0cDsKKyAgICBnZXR0aW1lb2ZkYXkoJnRwLCBOVUxMKTsKKyAgICB0cy50dl9zZWMgID0gdHAudHZfc2VjICsgNTsKKyAgICB0cy50dl9uc2VjID0gdHAudHZfdXNlYyAqIDEwMDA7CisKKyAgICBpZiAodHJ1ZSA9PSBtX2JJbnRKcGVnRXZ0UGVuZGluZyB8fAorICAgICAgICAodHJ1ZSA9PSBtX2JJbnRSYXdFdnRQZW5kaW5nKSkgeworICAgICAgICAvL1dhaXRpbmcgaW4gSEFMIGZvciBzbmFwc2hvdCB0YWtlbiBub3RpZmljYXRpb24KKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2ludF9sb2NrKTsKKyAgICAgICAgcmMgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZtX2ludF9jb25kLCAmbV9pbnRfbG9jaywgJnRzKTsKKyAgICAgICAgaWYgKEVUSU1FRE9VVCA9PSByYyB8fCAweDAgPT0gbV9CYWNrZW5kRmlsZU5hbWVbMF0pIHsKKyAgICAgICAgICAgIC8vSGl0IGEgdGltZW91dCwgb3Igc29tZSBzcHVyaW91cyBhY3Rpdml0eQorICAgICAgICAgICAgYlNlbmRUb0JhY2tlbmQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0cnVlID09IG1fYkludEpwZWdFdnRQZW5kaW5nKSB7CisgICAgICAgICAgICBwYXJhbXMuZXZlbnRfdHlwZSA9IDA7CisgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXRTdHJlYW1Gb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9ULCBwYXJhbXMucGljdHVyZV9mb3JtYXQpOworICAgICAgICB9IGVsc2UgaWYgKHRydWUgPT0gbV9iSW50UmF3RXZ0UGVuZGluZykgeworICAgICAgICAgICAgcGFyYW1zLmV2ZW50X3R5cGUgPSAxOworICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0U3RyZWFtRm9ybWF0KENBTV9TVFJFQU1fVFlQRV9SQVcsIHBhcmFtcy5waWN0dXJlX2Zvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1faW50X2xvY2spOworCisgICAgICAgIGlmICh0cnVlID09IG1fYkludEpwZWdFdnRQZW5kaW5nKSB7CisgICAgICAgICAgICAvL0F0dGVtcHRpbmcgdG8gcmVzdGFydCBwcmV2aWV3IGFmdGVyIHRha2luZyBKUEVHIHNuYXBzaG90CisgICAgICAgICAgICBsb2NrQVBJKCk7CisgICAgICAgICAgICByYyA9IHByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfU05BUFNIT1RfRE9ORSwgTlVMTCk7CisgICAgICAgICAgICB1bmxvY2tBUEkoKTsKKyAgICAgICAgICAgIG1fcG9zdHByb2Nlc3Nvci5zZXRKcGVnTWVtT3B0KEpwZWdNZW1PcHQpOworICAgICAgICB9IGVsc2UgaWYgKHRydWUgPT0gbV9iSW50UmF3RXZ0UGVuZGluZykgeworICAgICAgICAgICAgLy9BdHRlbXB0aW5nIHRvIHJlc3RhcnQgcHJldmlldyBhZnRlciB0YWtpbmcgUkFXIHNuYXBzaG90CisgICAgICAgICAgICBzdG9wQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfUkFXKTsKKyAgICAgICAgICAgIGRlbENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1JBVyk7CisgICAgICAgICAgICAvL3Jlc3RvcmluZyB0aGUgb2xkIHJhdyBmb3JtYXQKKyAgICAgICAgICAgIHByb3BlcnR5X3NldCgicGVyc2lzdC5jYW1lcmEucmF3LmZvcm1hdCIsIHJhd19mb3JtYXQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRydWUgPT0gYlNlbmRUb0JhY2tlbmQpIHsKKyAgICAgICAgICAgIC8vc2VuZCBldmVudCBiYWNrIHRvIHNlcnZlciB3aXRoIHRoZSBmaWxlIHBhdGgKKyAgICAgICAgICAgIHBhcmFtcy5kaW0gPSBtX3Bvc3Rwcm9jZXNzb3IubV9kc3RfZGltOworICAgICAgICAgICAgbWVtY3B5KCZwYXJhbXMucGF0aFswXSwgJm1fQmFja2VuZEZpbGVOYW1lWzBdLCBRQ0FNRVJBX01BWF9GSUxFUEFUSF9MRU5HVEgpOworICAgICAgICAgICAgbWVtc2V0KCZtX0JhY2tlbmRGaWxlTmFtZVswXSwgMHgwLCBRQ0FNRVJBX01BWF9GSUxFUEFUSF9MRU5HVEgpOworICAgICAgICAgICAgcGFyYW1zLnNpemUgPSBtQmFja2VuZEZpbGVTaXplOworICAgICAgICAgICAgcmMgPSBtUGFyYW1ldGVycy5zZXRJbnRFdmVudChwYXJhbXMpOworICAgICAgICB9CisKKyAgICAgICAgY2xlYXJJbnRQZW5kaW5nRXZlbnRzKCk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHRha2VCYWNrZW5kUGljX2ludGVybmFsCisgKgorICogREVTQ1JJUFRJT046IHRha2Ugc25hcHNob3QgdHJpZ2dlcmVkIGJ5IGJhY2tlbmQKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjp0YWtlQmFja2VuZFBpY19pbnRlcm5hbChib29sICpKcGVnTWVtT3B0LCBjaGFyICpyYXdfZm9ybWF0KQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IGFwaVJlc3VsdDsKKworICAgIGxvY2tBUEkoKTsKKyAgICAvL1NldCByb3RhdGlvbiB2YWx1ZSBmcm9tIHVzZXIgc2V0dGluZ3MgYXMgSnBlZyByb3RhdGlvbgorICAgIC8vdG8gY29uZmlndXJlIGJhY2stZW5kIG1vZHVsZXMuCisgICAgbVBhcmFtZXRlcnMuc2V0SnBlZ1JvdGF0aW9uKG1QYXJhbWV0ZXJzLmdldFJvdGF0aW9uKCkpOworCisgICAgc2V0UmV0cm9QaWN0dXJlKDApOworICAgIC8qIFByZXBhcmUgc25hcHNob3QgaW4gY2FzZSBMRUQgbmVlZHMgdG8gYmUgZmxhc2hlZCAqLworICAgIGlmIChtRmxhc2hOZWVkZWQgPT0gMSB8fCBtUGFyYW1ldGVycy5pc0Nocm9tYUZsYXNoRW5hYmxlZCgpKSB7CisgICAgICAgIC8vIFN0YXJ0IFByZXBhcmluZyBmb3Igbm9ybWFsIEZyYW1lcworICAgICAgICBMT0dIKCJTdGFydCBQcmVwYXJlIFNuYXBzaG90Iik7CisgICAgICAgIC8qIFByZXBhcmUgc25hcHNob3QgaW4gY2FzZSBMRUQgbmVlZHMgdG8gYmUgZmxhc2hlZCAqLworICAgICAgICByYyA9IHByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfUFJFUEFSRV9TTkFQU0hPVCwgTlVMTCk7CisgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgd2FpdEFQSVJlc3VsdChRQ0FNRVJBX1NNX0VWVF9QUkVQQVJFX1NOQVBTSE9ULCAmYXBpUmVzdWx0KTsKKyAgICAgICAgICAgIHJjID0gYXBpUmVzdWx0LnN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBMT0dIKCJQcmVwIFNuYXBzaG90IGRvbmUgcmMgPSAlZCIsIHJjKTsKKyAgICAgICAgbVByZXBTbmFwUnVuID0gdHJ1ZTsKKyAgICB9CisgICAgdW5sb2NrQVBJKCk7CisKKyAgICBpZiAodHJ1ZSA9PSBtX2JJbnRKcGVnRXZ0UGVuZGluZykgeworICAgICAgICAvL0F0dGVtcHRpbmcgdG8gdGFrZSBKUEVHIHNuYXBzaG90CisgICAgICAgIGlmIChOT19FUlJPUiAhPSB3YWl0RGVmZXJyZWRXb3JrKG1Jbml0UFByb2NKb2IpKSB7CisgICAgICAgICAgICBMT0dFKCJJbml0IFBQcm9jIERlZmVycmVkIHdvcmsgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAqSnBlZ01lbU9wdCA9IG1fcG9zdHByb2Nlc3Nvci5nZXRKcGVnTWVtT3B0KCk7CisgICAgICAgIG1fcG9zdHByb2Nlc3Nvci5zZXRKcGVnTWVtT3B0KGZhbHNlKTsKKworICAgICAgICAvKiBjYXB0dXJlICovCisgICAgICAgIGxvY2tBUEkoKTsKKyAgICAgICAgTE9HSCgiQ2FwdHVyaW5nIGludGVybmFsIHNuYXBzaG90Iik7CisgICAgICAgIHJjID0gcHJvY2Vzc0FQSShRQ0FNRVJBX1NNX0VWVF9UQUtFX1BJQ1RVUkUsIE5VTEwpOworICAgICAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHdhaXRBUElSZXN1bHQoUUNBTUVSQV9TTV9FVlRfVEFLRV9QSUNUVVJFLCAmYXBpUmVzdWx0KTsKKyAgICAgICAgICAgIHJjID0gYXBpUmVzdWx0LnN0YXR1czsKKyAgICAgICAgfQorICAgICAgICB1bmxvY2tBUEkoKTsKKyAgICB9IGVsc2UgaWYgKHRydWUgPT0gbV9iSW50UmF3RXZ0UGVuZGluZykgeworICAgICAgICAvL0F0dGVtcHRpbmcgdG8gdGFrZSBSQVcgc25hcHNob3QKKyAgICAgICAgKHZvaWQpSnBlZ01lbU9wdDsKKyAgICAgICAgc3RvcFByZXZpZXcoKTsKKworICAgICAgICAvL2dldHRpbmcgdGhlIGV4aXN0aW5nIHJhdyBmb3JtYXQgdHlwZQorICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnJhdy5mb3JtYXQiLCByYXdfZm9ybWF0LCAiMTciKTsKKyAgICAgICAgLy9zZXR0aW5nIGl0IHRvIGEgZGVmYXVsdCBrbm93IHZhbHVlIGZvciB0aGlzIHRhc2sKKyAgICAgICAgcHJvcGVydHlfc2V0KCJwZXJzaXN0LmNhbWVyYS5yYXcuZm9ybWF0IiwgIjE4Iik7CisKKyAgICAgICAgcmMgPSBhZGRDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9SQVcpOworICAgICAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIHN0YXJ0IHBvc3Rwcm9jZXNzb3IKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSB3YWl0RGVmZXJyZWRXb3JrKG1Jbml0UFByb2NKb2IpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiSW5pdCBQUHJvYyBEZWZlcnJlZCB3b3JrIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmMgPSBtX3Bvc3Rwcm9jZXNzb3Iuc3RhcnQobV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfUkFXXSk7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJjYW5ub3Qgc3RhcnQgcG9zdHByb2Nlc3NvciIpOworICAgICAgICAgICAgICAgIGRlbENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1JBVyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IHN0YXJ0Q2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfUkFXKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR0UoImNhbm5vdCBzdGFydCByYXcgY2hhbm5lbCIpOworICAgICAgICAgICAgICAgIG1fcG9zdHByb2Nlc3Nvci5zdG9wKCk7CisgICAgICAgICAgICAgICAgZGVsQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfUkFXKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJjYW5ub3QgYWRkIHJhdyBjaGFubmVsIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2xlYXJJbnRQZW5kaW5nRXZlbnRzCisgKgorICogREVTQ1JJUFRJT046IGNsZWFyIGludGVybmFsIHBlbmRpbmcgZXZlbnRzIHBlcnRhaW5pbmcgdG8gYmFja2VuZAorICogICAgICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdCByZXF1ZXN0cworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpjbGVhckludFBlbmRpbmdFdmVudHMoKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKHRydWUgPT0gbV9iSW50UmF3RXZ0UGVuZGluZykgeworICAgICAgICBwcmVwYXJlUHJldmlldygpOworICAgICAgICBzdGFydFByZXZpZXcoKTsKKyAgICB9CisgICAgaWYgKHRydWUgPT0gbV9iSW50SnBlZ0V2dFBlbmRpbmcpIHsKKyAgICAgICAgaWYgKGZhbHNlID09IG1QYXJhbWV0ZXJzLmlzWlNMTW9kZSgpKSB7CisgICAgICAgICAgICBsb2NrQVBJKCk7CisgICAgICAgICAgICByYyA9IHByb2Nlc3NBUEkoUUNBTUVSQV9TTV9FVlRfU1RBUlRfUFJFVklFVywgTlVMTCk7CisgICAgICAgICAgICB1bmxvY2tBUEkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9pbnRfbG9jayk7CisgICAgaWYgKHRydWUgPT0gbV9iSW50SnBlZ0V2dFBlbmRpbmcpIHsKKyAgICAgICAgbV9iSW50SnBlZ0V2dFBlbmRpbmcgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHRydWUgPT0gbV9iSW50UmF3RXZ0UGVuZGluZykgeworICAgICAgICBtX2JJbnRSYXdFdnRQZW5kaW5nID0gZmFsc2U7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2ludF9sb2NrKTsKKyAgICByZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdGFrZUxpdmVTbmFwc2hvdF9pbnRlcm5hbAorICoKKyAqIERFU0NSSVBUSU9OOiB0YWtlIGxpdmUgc25hcHNob3QgZHVyaW5nIHJlY29yZGluZworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnRha2VMaXZlU25hcHNob3RfaW50ZXJuYWwoKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworCisgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsID0gTlVMTDsKKyAgICBRQ2FtZXJhQ2hhbm5lbCAqcFByZXZpZXdDaGFubmVsID0gTlVMTDsKKyAgICBRQ2FtZXJhU3RyZWFtICAqcFByZXZpZXdTdHJlYW0gPSBOVUxMOworICAgIFFDYW1lcmFTdHJlYW0gICpwU3RyZWFtID0gTlVMTDsKKworICAgIC8vU2V0IHJvdGF0aW9uIHZhbHVlIGZyb20gdXNlciBzZXR0aW5ncyBhcyBKcGVnIHJvdGF0aW9uCisgICAgLy90byBjb25maWd1cmUgYmFjay1lbmQgbW9kdWxlcy4KKyAgICBtUGFyYW1ldGVycy5zZXRKcGVnUm90YXRpb24obVBhcmFtZXRlcnMuZ2V0Um90YXRpb24oKSk7CisKKyAgICAvLyBDb25maWd1cmUgYWR2YW5jZWQgY2FwdHVyZQorICAgIHJjID0gY29uZmlndXJlQWR2YW5jZWRDYXB0dXJlKCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIlVuc3VwcG9ydGVkIGNhcHR1cmUgY2FsbCIpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAoaXNMb3dQb3dlck1vZGUoKSkgeworICAgICAgICBwQ2hhbm5lbCA9IG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1ZJREVPXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwQ2hhbm5lbCA9IG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1NOQVBTSE9UXTsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBwQ2hhbm5lbCkgeworICAgICAgICBMT0dFKCJTbmFwc2hvdC9WaWRlbyBjaGFubmVsIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByYyA9IE5PX0lOSVQ7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIGFsbCBwcmV2aWV3IGJ1ZmZlcnMgYXJlIG1hcHBlZCBiZWZvcmUgY3JlYXRpbmcKKyAgICAvLyBhIGpwZWcgc2Vzc2lvbiBhcyBwcmV2aWV3IHN0cmVhbSBidWZmZXJzIGFyZSBxdWVyaWVkIGR1cmluZyB0aGUgc2FtZQorICAgIHBQcmV2aWV3Q2hhbm5lbCA9IG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1BSRVZJRVddOworICAgIGlmIChwUHJldmlld0NoYW5uZWwgIT0gTlVMTCkgeworICAgICAgICB1aW50MzJfdCBudW1TdHJlYW1zID0gcFByZXZpZXdDaGFubmVsLT5nZXROdW1PZlN0cmVhbXMoKTsKKworICAgICAgICBmb3IgKHVpbnQ4X3QgaSA9IDAgOyBpIDwgbnVtU3RyZWFtcyA7IGkrKyApIHsKKyAgICAgICAgICAgIHBTdHJlYW0gPSBwUHJldmlld0NoYW5uZWwtPmdldFN0cmVhbUJ5SW5kZXgoaSk7CisgICAgICAgICAgICBpZiAoIXBTdHJlYW0pCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcgPT0gcFN0cmVhbS0+Z2V0TXlUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBwUHJldmlld1N0cmVhbSA9IHBTdHJlYW07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocFByZXZpZXdTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU1hcExvY2spOworICAgICAgICAgICAgUUNhbWVyYU1lbW9yeSAqcE1lbW9yeSA9IHBTdHJlYW0tPmdldFN0cmVhbUJ1ZnMoKTsKKyAgICAgICAgICAgIGlmICghcE1lbW9yeSkgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yISEgcE1lbW9yeSBpcyBOVUxMIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2FpdENudCA9IDI7CisgICAgICAgICAgICB3aGlsZSAoIXBNZW1vcnktPmNoZWNrSWZBbGxCdWZmZXJzTWFwcGVkKCkgJiYgKHdhaXRDbnQgPiAwKSkgeworICAgICAgICAgICAgICAgIExPR0woIiBXYWl0aW5nIGZvciBwcmV2aWV3IGJ1ZmZlcnMgdG8gYmUgbWFwcGVkIik7CisgICAgICAgICAgICAgICAgbU1hcENvbmQud2FpdFJlbGF0aXZlKAorICAgICAgICAgICAgICAgICAgICAgICAgbU1hcExvY2ssIENBTUVSQV9ERUZFUlJFRF9NQVBfQlVGX1RJTUVPVVQpOworICAgICAgICAgICAgICAgIExPR0woIldhaXQgY29tcGxldGVkISEiKTsKKyAgICAgICAgICAgICAgICB3YWl0Q250LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiBhbGwgYnVmZmVycyBhcmUgbm90IG1hcHBlZCBhZnRlciByZXRyaWVzLCBhc3NlcnQKKyAgICAgICAgICAgIGFzc2VydChwTWVtb3J5LT5jaGVja0lmQWxsQnVmZmVyc01hcHBlZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydChwUHJldmlld1N0cmVhbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEZWZlcldvcmtBcmdzIGFyZ3M7CisgICAgbWVtc2V0KCZhcmdzLCAwLCBzaXplb2YoRGVmZXJXb3JrQXJncykpOworCisgICAgYXJncy5wcHJvY0FyZ3MgPSBwQ2hhbm5lbDsKKworICAgIC8vIE5vIG5lZWQgdG8gd2FpdCBmb3IgbUluaXRQUHJvY0pvYiBoZXJlLCBiZWNhdXNlIGl0IHdhcworICAgIC8vIHF1ZXVlZCBpbiBzdGFydFByZXZpZXcsIGFuZCB3aWxsIGRlZmluaXRlbHkgYmUgcHJvY2Vzc2VkIGJlZm9yZQorICAgIC8vIG1SZXByb2NKb2IgY2FuIGJlZ2luLgorICAgIG1SZXByb2NKb2IgPSBxdWV1ZURlZmVycmVkV29yayhDTURfREVGX1BQUk9DX1NUQVJULAorICAgICAgICAgICAgYXJncyk7CisgICAgaWYgKG1SZXByb2NKb2IgPT0gMCkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gcXVldWUgQ01EX0RFRl9QUFJPQ19TVEFSVCIpOworICAgICAgICByYyA9IC1FTk9NRU07CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8vIENyZWF0ZSBKUEVHIHNlc3Npb24KKyAgICBtSnBlZ0pvYiA9IHF1ZXVlRGVmZXJyZWRXb3JrKENNRF9ERUZfQ1JFQVRFX0pQRUdfU0VTU0lPTiwKKyAgICAgICAgICAgIGFyZ3MpOworICAgIGlmIChtSnBlZ0pvYiA9PSAwKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBxdWV1ZSBDUkVBVEVfSlBFR19TRVNTSU9OIik7CisgICAgICAgIGlmIChOT19FUlJPUiAhPSB3YWl0RGVmZXJyZWRXb3JrKG1SZXByb2NKb2IpKSB7CisgICAgICAgICAgICBMT0dFKCJSZXByb2Nlc3MgRGVmZXJyZWQgd29yayB3YXMgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICAgICAgbV9wb3N0cHJvY2Vzc29yLnN0b3AoKTsKKyAgICAgICAgcmMgPSAtRU5PTUVNOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiAoaXNMb3dQb3dlck1vZGUoKSkgeworICAgICAgICBtbV9jYW1lcmFfcmVxX2J1Zl90IGJ1ZjsKKyAgICAgICAgbWVtc2V0KCZidWYsIDB4MCwgc2l6ZW9mKGJ1ZikpOworICAgICAgICBidWYudHlwZSA9IE1NX0NBTUVSQV9SRVFfU1VQRVJfQlVGOworICAgICAgICBidWYubnVtX2J1Zl9yZXF1ZXN0ZWQgPSAxOworICAgICAgICByYyA9ICgoUUNhbWVyYVZpZGVvQ2hhbm5lbCopcENoYW5uZWwpLT50YWtlUGljdHVyZSgmYnVmKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLy9EaXNhYmxlIHJlcHJvY2VzcyBmb3IgNEsgbGl2ZXNob3QgY2FzZQorICAgIGlmICghbVBhcmFtZXRlcnMuaXM0azJrVmlkZW9SZXNvbHV0aW9uKCkpIHsKKyAgICAgICAgcmMgPSBjb25maWd1cmVPbmxpbmVSb3RhdGlvbigqbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfU05BUFNIT1RdKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJvbmxpbmUgcm90YXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gd2FpdERlZmVycmVkV29yayhtUmVwcm9jSm9iKSkgeworICAgICAgICAgICAgICAgIExPR0UoIlJlcHJvY2VzcyBEZWZlcnJlZCB3b3JrIHdhcyBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSB3YWl0RGVmZXJyZWRXb3JrKG1KcGVnSm9iKSkgeworICAgICAgICAgICAgICAgIExPR0UoIkpwZWcgRGVmZXJyZWQgd29yayB3YXMgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3Bvc3Rwcm9jZXNzb3Iuc3RvcCgpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChOVUxMICE9IHBDaGFubmVsKSAmJiAobVBhcmFtZXRlcnMuaXNUTlJTbmFwc2hvdEVuYWJsZWQoKSkpIHsKKyAgICAgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9IE5VTEw7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDAgOyBpIDwgcENoYW5uZWwtPmdldE51bU9mU3RyZWFtcygpOyBpKysgKSB7CisgICAgICAgICAgICBwU3RyZWFtID0gcENoYW5uZWwtPmdldFN0cmVhbUJ5SW5kZXgoaSk7CisgICAgICAgICAgICBpZiAoKE5VTEwgIT0gcFN0cmVhbSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCA9PSBwU3RyZWFtLT5nZXRNeVR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBMT0dEKCJSRVFVRVNUX0ZSQU1FUyBldmVudCBmb3IgVE5SIHNuYXBzaG90Iik7CisgICAgICAgICAgICBjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgcGFyYW07CisgICAgICAgICAgICBtZW1zZXQoJnBhcmFtLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90KSk7CisgICAgICAgICAgICBwYXJhbS50eXBlID0gQ0FNX1NUUkVBTV9QQVJBTV9UWVBFX1JFUVVFU1RfRlJBTUVTOworICAgICAgICAgICAgcGFyYW0uZnJhbWVSZXF1ZXN0LmVuYWJsZVN0cmVhbSA9IDE7CisgICAgICAgICAgICByYyA9IHBTdHJlYW0tPnNldFBhcmFtZXRlcihwYXJhbSk7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJTdHJlYW0gRXZlbnQgUkVRVUVTVF9GUkFNRVMgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHN0YXJ0IHNuYXBzaG90IGNoYW5uZWwKKyAgICBpZiAoKHJjID09IE5PX0VSUk9SKSAmJiAoTlVMTCAhPSBwQ2hhbm5lbCkpIHsKKyAgICAgICAgLy8gRG8gbm90IGxpbmsgbWV0YWRhdGEgc3RyZWFtIGZvciA0SzJrIHJlc29sdXRpb24KKyAgICAgICAgLy8gYXMgQ1BQIHByb2Nlc3Npbmcgd291bGQgYmUgZG9uZSBvbiBzbmFwc2hvdCBzdHJlYW0gYW5kIG5vdAorICAgICAgICAvLyByZXByb2Nlc3Mgc3RyZWFtCisgICAgICAgIGlmICghbVBhcmFtZXRlcnMuaXM0azJrVmlkZW9SZXNvbHV0aW9uKCkpIHsKKyAgICAgICAgICAgIC8vIEZpbmQgYW5kIHRyeSB0byBsaW5rIGEgbWV0YWRhdGEgc3RyZWFtIGZyb20gcHJldmlldyBjaGFubmVsCisgICAgICAgICAgICBRQ2FtZXJhQ2hhbm5lbCAqcE1ldGFDaGFubmVsID0gTlVMTDsKKyAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBNZXRhU3RyZWFtID0gTlVMTDsKKyAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBQcmV2aWV3U3RyZWFtID0gTlVMTDsKKworICAgICAgICAgICAgaWYgKG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1BSRVZJRVddICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwTWV0YUNoYW5uZWwgPSBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9QUkVWSUVXXTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1OdW0gPSBwTWV0YUNoYW5uZWwtPmdldE51bU9mU3RyZWFtcygpOworICAgICAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBTdHJlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDAgOyBpIDwgc3RyZWFtTnVtIDsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBwU3RyZWFtID0gcE1ldGFDaGFubmVsLT5nZXRTdHJlYW1CeUluZGV4KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBwU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBID09IHBTdHJlYW0tPmdldE15VHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1ldGFTdHJlYW0gPSBwU3RyZWFtOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcgPT0gcFN0cmVhbS0+Z2V0TXlUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghbVBhcmFtZXRlcnMuaXNIZnJNb2RlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGxpbmsgcHJldmlldyBzdHJlYW0gZm9yIEhGUiBsaXZlIHNuYXBzaG90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRodW1ibmFpbCB3aWxsIG5vdCBiZSBkZXJpdmVkIGZyb20gcHJldmlldyBmb3IgSEZSIGxpdmUgc25hcHNob3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByZXZpZXdTdHJlYW0gPSBwU3RyZWFtOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKE5VTEwgIT0gcE1ldGFDaGFubmVsKSAmJiAoTlVMTCAhPSBwTWV0YVN0cmVhbSkpIHsKKyAgICAgICAgICAgICAgICByYyA9IHBDaGFubmVsLT5saW5rU3RyZWFtKHBNZXRhQ2hhbm5lbCwgcE1ldGFTdHJlYW0pOworICAgICAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJNZXRhZGF0YSBzdHJlYW0gbGluayBmYWlsZWQgJWQiLCByYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChOVUxMICE9IHBNZXRhQ2hhbm5lbCkgJiYgKE5VTEwgIT0gcFByZXZpZXdTdHJlYW0pKSB7CisgICAgICAgICAgICAgICAgcmMgPSBwQ2hhbm5lbC0+bGlua1N0cmVhbShwTWV0YUNoYW5uZWwsIHBQcmV2aWV3U3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiUHJldmlldyBzdHJlYW0gbGluayBmYWlsZWQgJWQiLCByYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJjID0gcENoYW5uZWwtPnN0YXJ0KCk7CisgICAgfQorCitlbmQ6CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJjID0gcHJvY2Vzc0FQSShRQ0FNRVJBX1NNX0VWVF9DQU5DRUxfUElDVFVSRSwgTlVMTCk7CisgICAgICAgIHJjID0gc2VuZEV2dE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLCBVTktOT1dOX0VSUk9SLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhbmNlbExpdmVTbmFwc2hvdAorICoKKyAqIERFU0NSSVBUSU9OOiBjYW5jZWwgY3VycmVudCBsaXZlIHNuYXBzaG90IHJlcXVlc3QKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpjYW5jZWxMaXZlU25hcHNob3QoKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIGlmIChtTGl2ZVNuYXBzaG90VGhyZWFkICE9IDApIHsKKyAgICAgICAgcHRocmVhZF9qb2luKG1MaXZlU25hcHNob3RUaHJlYWQsTlVMTCk7CisgICAgICAgIG1MaXZlU25hcHNob3RUaHJlYWQgPSAwOworICAgIH0KKyAgICBiTGl2ZVNuYXBzaG90ID0gZmFsc2U7CisgICAgcmM9IHB0aHJlYWRfY3JlYXRlKCZtTGl2ZVNuYXBzaG90VGhyZWFkLCBOVUxMLCBMaXZlX1NuYXBzaG90X3RocmVhZCwgKHZvaWQgKikgdGhpcyk7CisgICAgaWYgKCFyYykgeworICAgICAgICBwdGhyZWFkX3NldG5hbWVfbnAobUxpdmVTbmFwc2hvdFRocmVhZCwgIkNBTV9jYW5jZWxfbGl2ZVNuYXAiKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhbmNlbExpdmVTbmFwc2hvdF9pbnRlcm5hbAorICoKKyAqIERFU0NSSVBUSU9OOiBjYW5jZWwgbGl2ZSBzbmFwc2hvdCBkdXJpbmcgcmVjb3JkaW5nCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Y2FuY2VsTGl2ZVNuYXBzaG90X2ludGVybmFsKCkgeworICAgIGludCByYyA9IE5PX0VSUk9SOworCisgICAgdW5jb25maWd1cmVBZHZhbmNlZENhcHR1cmUoKTsKKyAgICBMT0dIKCJFbmFibGUgZGlzcGxheSBmcmFtZXMgYWdhaW4iKTsKKyAgICBzZXREaXNwbGF5U2tpcChGQUxTRSk7CisKKyAgICBpZiAoIW1Mb25nc2hvdEVuYWJsZWQpIHsKKyAgICAgICAgbV9wZXJmTG9jay5sb2NrX3JlbCgpOworICAgIH0KKworICAgIC8vc3RvcCBwb3N0IHByb2Nlc3NvcgorICAgIG1fcG9zdHByb2Nlc3Nvci5zdG9wKCk7CisKKyAgICAvLyBzdG9wIHNuYXBzaG90IGNoYW5uZWwKKyAgICBpZiAoIW1QYXJhbWV0ZXJzLmlzVE5SU25hcHNob3RFbmFibGVkKCkpIHsKKyAgICAgICAgcmMgPSBzdG9wQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfU05BUFNIT1QpOworICAgIH0gZWxzZSB7CisgICAgICAgIFFDYW1lcmFDaGFubmVsICpwQ2hhbm5lbCA9IG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1NOQVBTSE9UXTsKKyAgICAgICAgaWYgKE5VTEwgIT0gcENoYW5uZWwpIHsKKyAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBTdHJlYW0gPSBOVUxMOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMCA7IGkgPCBwQ2hhbm5lbC0+Z2V0TnVtT2ZTdHJlYW1zKCk7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBwU3RyZWFtID0gcENoYW5uZWwtPmdldFN0cmVhbUJ5SW5kZXgoaSk7CisgICAgICAgICAgICAgICAgaWYgKChOVUxMICE9IHBTdHJlYW0pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UID09CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5nZXRNeVR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIExPR0QoIlJFUVVFU1RfRlJBTUVTIGV2ZW50IGZvciBUTlIgc25hcHNob3QiKTsKKyAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgcGFyYW07CisgICAgICAgICAgICAgICAgbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCkpOworICAgICAgICAgICAgICAgIHBhcmFtLnR5cGUgPSBDQU1fU1RSRUFNX1BBUkFNX1RZUEVfUkVRVUVTVF9GUkFNRVM7CisgICAgICAgICAgICAgICAgcGFyYW0uZnJhbWVSZXF1ZXN0LmVuYWJsZVN0cmVhbSA9IDA7CisgICAgICAgICAgICAgICAgcmMgPSBwU3RyZWFtLT5zZXRQYXJhbWV0ZXIocGFyYW0pOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJTdHJlYW0gRXZlbnQgUkVRVUVTVF9GUkFNRVMgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHB1dFBhcmFtZXRlcnMKKyAqCisgKiBERVNDUklQVElPTjogcHV0IHBhcmFtZXRlcnMgc3RyaW5nIGltcGwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcm1zICAgOiBwYXJhbWV0ZXJzIHN0cmluZyB0byBiZSByZWxlYXNlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpwdXRQYXJhbWV0ZXJzKGNoYXIgKnBhcm1zKQoreworICAgIGZyZWUocGFybXMpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZW5kQ29tbWFuZAorICoKKyAqIERFU0NSSVBUSU9OOiBzZW5kIGNvbW1hbmQgaW1wbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY29tbWFuZCA6IGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQKKyAqICAgQGFyZzEgICAgOiBvcHRpb25hbCBhcmd1bWVudCAxCisgKiAgIEBhcmcyICAgIDogb3B0aW9uYWwgYXJndW1lbnQgMgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzZW5kQ29tbWFuZChpbnQzMl90IGNvbW1hbmQsCisgICAgICAgIF9fdW51c2VkIGludDMyX3QgJmFyZzEsIF9fdW51c2VkIGludDMyX3QgJmFyZzIpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisKKyAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyNpZm5kZWYgVkFOSUxMQV9IQUwKKyAgICBjYXNlIENBTUVSQV9DTURfTE9OR1NIT1RfT046CisgICAgICAgIG1fcGVyZkxvY2subG9ja19hY3EoKTsKKyAgICAgICAgYXJnMSA9IGFyZzIgPSAwOworICAgICAgICAvLyBMb25nc2hvdCBjYW4gb25seSBiZSBlbmFibGVkIHdoZW4gaW1hZ2UgY2FwdHVyZQorICAgICAgICAvLyBpcyBub3QgYWN0aXZlLgorICAgICAgICBpZiAoICFtX3N0YXRlTWFjaGluZS5pc0NhcHR1cmVSdW5uaW5nKCkgKSB7CisgICAgICAgICAgICBMT0dJKCJMb25nc2hvdCBFbmFibGVkIik7CisgICAgICAgICAgICBtTG9uZ3Nob3RFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHJjID0gbVBhcmFtZXRlcnMuc2V0TG9uZ3Nob3RFbmFibGUobUxvbmdzaG90RW5hYmxlZCk7CisKKyAgICAgICAgICAgIC8vIER1ZSB0byByZWNlbnQgYnVmZmVyIGNvdW50IG9wdGltaXphdGlvbnMKKyAgICAgICAgICAgIC8vIFpTTCBtaWdodCBydW4gd2l0aCBjb25zaWRlcmFibHkgbGVzcyBidWZmZXJzCisgICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBsb25nc2hvdCBtb2RlLiBQcmV2aWV3IG5lZWRzIHRvCisgICAgICAgICAgICAvLyByZXN0YXJ0IGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIGlmIChpc1pTTE1vZGUoKSAmJiBtX3N0YXRlTWFjaGluZS5pc1ByZXZpZXdSdW5uaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBRQ2FtZXJhQ2hhbm5lbCAqcENoYW5uZWwgPSBOVUxMOworICAgICAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBTbmFwU3RyZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICBwQ2hhbm5lbCA9IG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1pTTF07CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gcENoYW5uZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ2hhbm5lbC0+Z2V0TnVtT2ZTdHJlYW1zKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbSA9IHBDaGFubmVsLT5nZXRTdHJlYW1CeUluZGV4KGkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTbmFwU3RyZWFtID0gcFN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHBTbmFwU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlcXVpcmVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkID0gZ2V0QnVmTnVtUmVxdWlyZWQoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwU25hcFN0cmVhbS0+Z2V0QnVmZmVyQ291bnQoKSA8IHJlcXVpcmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgcmVzdGFydCBoZXJlLCB0byByZXNldCB0aGUgRlBTIGFuZCBubworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGJ1ZmZlcnMgYXMgcGVyIHRoZSByZXF1aXJlbWVudCBvZiBsb25nc2hvdCB1c2VjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEgPSBRQ0FNRVJBX1NNX0VWVF9SRVNUQVJUX1BFUlZJRVc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldFJlbGF0ZWRDYW1TeW5jSW5mbygpLT5zeW5jX2NvbnRyb2wgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9TWU5DX1JFTEFURURfU0VOU09SU19PTikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcyID0gUUNBTUVSQV9TTV9FVlRfREVMQVlFRF9SRVNUQVJUOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBtUHJlcFNuYXBSdW4gPSBmYWxzZTsKKyAgICAgICAgICAgIG1DQUNEb25lUmVjZWl2ZWQgPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJjID0gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTUVSQV9DTURfTE9OR1NIT1RfT0ZGOgorICAgICAgICBtX3BlcmZMb2NrLmxvY2tfcmVsKCk7CisgICAgICAgIGlmICggbUxvbmdzaG90RW5hYmxlZCAmJiBtX3N0YXRlTWFjaGluZS5pc0NhcHR1cmVSdW5uaW5nKCkgKSB7CisgICAgICAgICAgICBjYW5jZWxQaWN0dXJlKCk7CisgICAgICAgICAgICBwcm9jZXNzRXZ0KFFDQU1FUkFfU01fRVZUX1NOQVBTSE9UX0RPTkUsIE5VTEwpOworICAgICAgICAgICAgUUNhbWVyYUNoYW5uZWwgKnBaU0xDaGFubmVsID0gbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfWlNMXTsKKyAgICAgICAgICAgIGlmIChpc1pTTE1vZGUoKSAmJiAoTlVMTCAhPSBwWlNMQ2hhbm5lbCkgJiYgbVByZXBTbmFwUnVuKSB7CisgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzLT5zdG9wX3pzbF9zbmFwc2hvdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBwWlNMQ2hhbm5lbC0+Z2V0TXlIYW5kbGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVByZXBTbmFwUnVuID0gZmFsc2U7CisgICAgICAgIExPR0koIkxvbmdzaG90IERpc2FibGVkIik7CisgICAgICAgIG1Mb25nc2hvdEVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgcmMgPSBtUGFyYW1ldGVycy5zZXRMb25nc2hvdEVuYWJsZShtTG9uZ3Nob3RFbmFibGVkKTsKKyAgICAgICAgbUNBQ0RvbmVSZWNlaXZlZCA9IEZBTFNFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTUVSQV9DTURfSElTVE9HUkFNX09OOgorICAgIGNhc2UgQ0FNRVJBX0NNRF9ISVNUT0dSQU1fT0ZGOgorICAgICAgICByYyA9IHNldEhpc3RvZ3JhbShjb21tYW5kID09IENBTUVSQV9DTURfSElTVE9HUkFNX09OPyB0cnVlIDogZmFsc2UpOworICAgICAgICBMT0dIKCJIaXN0b2dyYW0gLT4gJXMiLAorICAgICAgICAgICAgICBtUGFyYW1ldGVycy5pc0hpc3RvZ3JhbUVuYWJsZWQoKSA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGNhc2UgQ0FNRVJBX0NNRF9TVEFSVF9GQUNFX0RFVEVDVElPTjoKKyAgICBjYXNlIENBTUVSQV9DTURfU1RPUF9GQUNFX0RFVEVDVElPTjoKKyAgICAgICAgbVBhcmFtZXRlcnMuc2V0RmFjZURldGVjdGlvbk9wdGlvbihjb21tYW5kID09IENBTUVSQV9DTURfU1RBUlRfRkFDRV9ERVRFQ1RJT04/IHRydWUgOiBmYWxzZSk7CisgICAgICAgIHJjID0gc2V0RmFjZURldGVjdGlvbihjb21tYW5kID09IENBTUVSQV9DTURfU1RBUlRfRkFDRV9ERVRFQ1RJT04/IHRydWUgOiBmYWxzZSk7CisgICAgICAgIExPR0goIkZhY2VEZXRlY3Rpb24gLT4gJXMiLAorICAgICAgICAgICAgICBtUGFyYW1ldGVycy5pc0ZhY2VEZXRlY3Rpb25FbmFibGVkKCkgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKyAgICAgICAgYnJlYWs7CisjaWZuZGVmIFZBTklMTEFfSEFMCisgICAgY2FzZSBDQU1FUkFfQ01EX0hJU1RPR1JBTV9TRU5EX0RBVEE6CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICByYyA9IE5PX0VSUk9SOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlZ2lzdGVyRmFjZUltYWdlCisgKgorICogREVTQ1JJUFRJT046IHJlZ2lzdGVyIGZhY2UgaW1hZ2UgaW1wbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW1nX3B0ciA6IHB0ciB0byBpbWFnZSBidWZmZXIKKyAqICAgQGNvbmZpZyAgOiBwdHIgdG8gY29uZmlnIHN0cnVjdCBhYm91dCBpbnB1dCBpbWFnZSBpbmZvCisgKiAgIEBmYWNlSUQgIDogW09VVF0gZmFjZSBJRCB0byB1bmlxdWVseSBpZGVudGlmaXkgdGhlIHJlZ2lzdGVyZWQgZmFjZSBpbWFnZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpyZWdpc3RlckZhY2VJbWFnZSh2b2lkICppbWdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9wcF9vZmZsaW5lX3NyY19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJmZhY2VJRCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICBmYWNlSUQgPSAtMTsKKworICAgIGlmIChpbWdfcHRyID09IE5VTEwgfHwgY29uZmlnID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiaW1nX3B0ciBvciBjb25maWcgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIGFsbG9jYXRlIGlvbiBtZW1vcnkgZm9yIHNvdXJjZSBpbWFnZQorICAgIFFDYW1lcmFIZWFwTWVtb3J5ICppbWdCdWYgPSBuZXcgUUNhbWVyYUhlYXBNZW1vcnkoUUNBTUVSQV9JT05fVVNFX0NBQ0hFKTsKKyAgICBpZiAoaW1nQnVmID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIG5ldyBoZWFwIG1lbW9yeSBvYmogZm9yIGltYWdlIGJ1ZiIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHJjID0gaW1nQnVmLT5hbGxvY2F0ZSgxLCBjb25maWctPmlucHV0X2J1Zl9wbGFuZXMucGxhbmVfaW5mby5mcmFtZV9sZW4sIE5PTl9TRUNVUkUpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGFsbG9jYXRlIGhlYXAgbWVtb3J5IGZvciBpbWFnZSBidWYiKTsKKyAgICAgICAgZGVsZXRlIGltZ0J1ZjsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB2b2lkICpwQnVmUHRyID0gaW1nQnVmLT5nZXRQdHIoMCk7CisgICAgaWYgKHBCdWZQdHIgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJpbWFnZSBidWYgaXMgTlVMTCIpOworICAgICAgICBpbWdCdWYtPmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVsZXRlIGltZ0J1ZjsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtY3B5KHBCdWZQdHIsIGltZ19wdHIsIGNvbmZpZy0+aW5wdXRfYnVmX3BsYW5lcy5wbGFuZV9pbmZvLmZyYW1lX2xlbik7CisKKyAgICBjYW1fcHBfZmVhdHVyZV9jb25maWdfdCBwcF9mZWF0dXJlOworICAgIG1lbXNldCgmcHBfZmVhdHVyZSwgMCwgc2l6ZW9mKGNhbV9wcF9mZWF0dXJlX2NvbmZpZ190KSk7CisgICAgcHBfZmVhdHVyZS5mZWF0dXJlX21hc2sgPSBDQU1fUUNPTV9GRUFUVVJFX1JFR0lTVEVSX0ZBQ0U7CisgICAgUUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWwgKnBDaGFubmVsID0KKyAgICAgICAgYWRkT2ZmbGluZVJlcHJvY0NoYW5uZWwoKmNvbmZpZywgcHBfZmVhdHVyZSwgTlVMTCwgTlVMTCk7CisKKyAgICBpZiAocENoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJmYWlsIHRvIGFkZCBvZmZsaW5lIHJlcHJvY2VzcyBjaGFubmVsIik7CisgICAgICAgIGltZ0J1Zi0+ZGVhbGxvY2F0ZSgpOworICAgICAgICBkZWxldGUgaW1nQnVmOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByYyA9IHBDaGFubmVsLT5zdGFydCgpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJDYW5ub3Qgc3RhcnQgcmVwcm9jZXNzIGNoYW5uZWwiKTsKKyAgICAgICAgaW1nQnVmLT5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbGV0ZSBpbWdCdWY7CisgICAgICAgIGRlbGV0ZSBwQ2hhbm5lbDsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHNzaXplX3QgYnVmU2l6ZSA9IGltZ0J1Zi0+Z2V0U2l6ZSgwKTsKKyAgICBpZiAoQkFEX0lOREVYICE9IGJ1ZlNpemUpIHsKKyAgICAgICAgcmMgPSBwQ2hhbm5lbC0+ZG9SZXByb2Nlc3MoaW1nQnVmLT5nZXRGZCgwKSwgaW1nQnVmLT5nZXRQdHIoMCksCisgICAgICAgICAgICAgICAgKHNpemVfdClidWZTaXplLCBmYWNlSUQpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBidWZmZXIgc2l6ZSAoYmFkIGluZGV4KSIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBkb25lIHdpdGggcmVnaXN0ZXIgZmFjZSBpbWFnZSwgZnJlZSBpbWdidWYgYW5kIGRlbGV0ZSByZXByb2Nlc3MgY2hhbm5lbAorICAgIGltZ0J1Zi0+ZGVhbGxvY2F0ZSgpOworICAgIGRlbGV0ZSBpbWdCdWY7CisgICAgaW1nQnVmID0gTlVMTDsKKyAgICBwQ2hhbm5lbC0+c3RvcCgpOworICAgIGRlbGV0ZSBwQ2hhbm5lbDsKKyAgICBwQ2hhbm5lbCA9IE5VTEw7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVsZWFzZQorICoKKyAqIERFU0NSSVBUSU9OOiByZWxlYXNlIGNhbWVyYSByZXNvdXJjZSBpbXBsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cmVsZWFzZSgpCit7CisgICAgLy8gc3RvcCBhbmQgZGVsZXRlIGFsbCBjaGFubmVscworICAgIGZvciAoaW50IGkgPSAwOyBpIDxRQ0FNRVJBX0NIX1RZUEVfTUFYIDsgaSsrKSB7CisgICAgICAgIGlmIChtX2NoYW5uZWxzW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0b3BDaGFubmVsKChxY2FtZXJhX2NoX3R5cGVfZW51bV90KWkpOworICAgICAgICAgICAgZGVsQ2hhbm5lbCgocWNhbWVyYV9jaF90eXBlX2VudW1fdClpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkdW1wCisgKgorICogREVTQ1JJUFRJT046IGNhbWVyYSBzdGF0dXMgZHVtcCBpbXBsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmZCAgICAgIDogZmQgZm9yIHRoZSBidWZmZXIgdG8gYmUgZHVtcGVkIHdpdGggY2FtZXJhIHN0YXR1cworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpkdW1wKGludCBmZCkKK3sKKyAgICBkcHJpbnRmKGZkLCAiXG4gQ2FtZXJhIEhBTCBpbmZvcm1hdGlvbiBCZWdpbiBcbiIpOworICAgIGRwcmludGYoZmQsICJDYW1lcmEgSUQ6ICVkIFxuIiwgbUNhbWVyYUlkKTsKKyAgICBkcHJpbnRmKGZkLCAiU3RvcmVNZXRhRGF0YUluRnJhbWU6ICVkIFxuIiwgbVN0b3JlTWV0YURhdGFJbkZyYW1lKTsKKyAgICBkcHJpbnRmKGZkLCAiXG4gQ29uZmlndXJhdGlvbjogJXMiLCBtUGFyYW1ldGVycy5kdW1wKCkuc3RyaW5nKCkpOworICAgIGRwcmludGYoZmQsICJcbiBTdGF0ZSBJbmZvcm1hdGlvbjogJXMiLCBtX3N0YXRlTWFjaGluZS5kdW1wKCkuc3RyaW5nKCkpOworICAgIGRwcmludGYoZmQsICJcbiBDYW1lcmEgSEFMIGluZm9ybWF0aW9uIEVuZCBcbiIpOworCisgICAgLyogc2VuZCBVUERBVEVfREVCVUdfTEVWRUwgdG8gdGhlIGJhY2tlbmQgc28gdGhhdCB0aGV5IGNhbiByZWFkIHRoZQorICAgICAgIGRlYnVnIGxldmVsIHByb3BlcnR5ICovCisgICAgbVBhcmFtZXRlcnMudXBkYXRlRGVidWdMZXZlbCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jZXNzQVBJCisgKgorICogREVTQ1JJUFRJT046IHByb2Nlc3MgQVBJIGNhbGxzIGZyb20gdXBwZXIgbGF5ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGFwaSAgICAgICAgIDogQVBJIHRvIGJlIHByb2Nlc3NlZAorICogICBAYXBpX3BheWxvYWQgOiBwdHIgdG8gQVBJIHBheWxvYWQgaWYgYW55CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnByb2Nlc3NBUEkocWNhbWVyYV9zbV9ldnRfZW51bV90IGFwaSwgdm9pZCAqYXBpX3BheWxvYWQpCit7CisgICAgaW50IHJldCA9IERFQURfT0JKRUNUOworCisgICAgaWYgKG1fc21UaHJlYWRBY3RpdmUpIHsKKyAgICAgICAgcmV0ID0gbV9zdGF0ZU1hY2hpbmUucHJvY0FQSShhcGksIGFwaV9wYXlsb2FkKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2Nlc3NFdnQKKyAqCisgKiBERVNDUklQVElPTjogcHJvY2VzcyBFdnQgZnJvbSBiYWNrZW5kIHZpYSBtbS1jYW1lcmEtaW50ZXJmYWNlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBldnQgICAgICAgICA6IGV2ZW50IHR5cGUgdG8gYmUgcHJvY2Vzc2VkCisgKiAgIEBldnRfcGF5bG9hZCA6IHB0ciB0byBldmVudCBwYXlsb2FkIGlmIGFueQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpwcm9jZXNzRXZ0KHFjYW1lcmFfc21fZXZ0X2VudW1fdCBldnQsIHZvaWQgKmV2dF9wYXlsb2FkKQoreworICAgIHJldHVybiBtX3N0YXRlTWFjaGluZS5wcm9jRXZ0KGV2dCwgZXZ0X3BheWxvYWQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2Nlc3NTeW5jRXZ0CisgKgorICogREVTQ1JJUFRJT046IHByb2Nlc3Mgc3luY2hyb25vdXMgRXZ0IGZyb20gYmFja2VuZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZXZ0ICAgICAgICAgOiBldmVudCB0eXBlIHRvIGJlIHByb2Nlc3NlZAorICogICBAZXZ0X3BheWxvYWQgOiBwdHIgdG8gZXZlbnQgcGF5bG9hZCBpZiBhbnkKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHJvY2Vzc1N5bmNFdnQocWNhbWVyYV9zbV9ldnRfZW51bV90IGV2dCwgdm9pZCAqZXZ0X3BheWxvYWQpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fZXZ0TG9jayk7CisgICAgcmMgPSAgcHJvY2Vzc0V2dChldnQsIGV2dF9wYXlsb2FkKTsKKyAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbWVtc2V0KCZtX2V2dFJlc3VsdCwgMCwgc2l6ZW9mKHFjYW1lcmFfYXBpX3Jlc3VsdF90KSk7CisgICAgICAgIHdoaWxlIChtX2V2dFJlc3VsdC5yZXF1ZXN0X2FwaSAhPSBldnQpIHsKKyAgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZtX2V2dENvbmQsICZtX2V2dExvY2spOworICAgICAgICB9CisgICAgICAgIHJjID0gIG1fZXZ0UmVzdWx0LnN0YXR1czsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fZXZ0TG9jayk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZXZ0SGFuZGxlCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIHJlZ2lzdGVyZCB0byBtbS1jYW1lcmEtaW50ZXJmYWNlIHRvIGhhbmRsZSBiYWNrZW5kIGV2ZW50cworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZSA6IGV2ZW50IHR5cGUgdG8gYmUgcHJvY2Vzc2VkCisgKiAgIEBldnQgICAgICAgICAgIDogcHRyIHRvIGV2ZW50CisgKiAgIEB1c2VyX2RhdGEgICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Y2FtRXZ0SGFuZGxlKHVpbnQzMl90IC8qY2FtZXJhX2hhbmRsZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2V2ZW50X3QgKmV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpvYmogPSAoUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqKXVzZXJfZGF0YTsKKyAgICBpZiAob2JqICYmIGV2dCkgeworICAgICAgICBtbV9jYW1lcmFfZXZlbnRfdCAqcGF5bG9hZCA9CisgICAgICAgICAgICAobW1fY2FtZXJhX2V2ZW50X3QgKiltYWxsb2Moc2l6ZW9mKG1tX2NhbWVyYV9ldmVudF90KSk7CisgICAgICAgIGlmIChOVUxMICE9IHBheWxvYWQpIHsKKyAgICAgICAgICAgICpwYXlsb2FkID0gKmV2dDsKKyAgICAgICAgICAgIC8vcGVlayBpbnRvIHRoZSBldmVudCwgaWYgdGhpcyBpcyBhbiBlenR1bmUgZXZlbnQgZnJvbSBzZXJ2ZXIsCisgICAgICAgICAgICAvL3RoZW4gd2UgZG9uJ3QgbmVlZCB0byBwb3N0IGl0IHRvIHRoZSBTTSBRcywgd2Ugc2h1ZCBkaXJlY3RseQorICAgICAgICAgICAgLy9zcGF3biBhIHRocmVhZCBhbmQgZ2V0IHRoZSBqb2IgZG9uZSAoanBlZyBvciByYXcgc25hcHNob3QpCisgICAgICAgICAgICBzd2l0Y2ggKHBheWxvYWQtPnNlcnZlcl9ldmVudF90eXBlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDQU1fRVZFTlRfVFlQRV9JTlRfVEFLRV9KUEVHOgorICAgICAgICAgICAgICAgICAgICAvL1JlY2VpdmVkIEpQRUcgdHJpZ2dlciBmcm9tIGV6dHVuZQorICAgICAgICAgICAgICAgICAgICBpZiAoZmFsc2UgPT0gb2JqLT5tX2JJbnRKcGVnRXZ0UGVuZGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZvYmotPm1faW50X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgb2JqLT5tX2JJbnRKcGVnRXZ0UGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmb2JqLT5tX2ludF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iai0+dGFrZVBpY3R1cmVJbnRlcm5hbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyZWUocGF5bG9hZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0FNX0VWRU5UX1RZUEVfSU5UX1RBS0VfUkFXOgorICAgICAgICAgICAgICAgICAgICAvL1JlY2VpdmVkIFJBVyB0cmlnZ2VyIGZyb20gZXp0dW5lCisgICAgICAgICAgICAgICAgICAgIGlmIChmYWxzZSA9PSBvYmotPm1fYkludFJhd0V2dFBlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmb2JqLT5tX2ludF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iai0+bV9iSW50UmF3RXZ0UGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmb2JqLT5tX2ludF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iai0+dGFrZVBpY3R1cmVJbnRlcm5hbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyZWUocGF5bG9hZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0FNX0VWRU5UX1RZUEVfREFFTU9OX0RJRUQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG9iai0+bURlZkxvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgb2JqLT5tRGVmQ29uZC5icm9hZGNhc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0goImJyb2FkY2FzdCBtRGVmQ29uZCBzaWduYWxcbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgb2JqLT5wcm9jZXNzRXZ0KFFDQU1FUkFfU01fRVZUX0VWVF9OT1RJRlksIHBheWxvYWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIk5VTEwgdXNlcl9kYXRhIik7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGpwZWdFdnRIYW5kbGUKKyAqCisgKiBERVNDUklQVElPTjogRnVuY3Rpb24gcmVnaXN0ZXJkIHRvIG1tLWpwZWctaW50ZXJmYWNlIHRvIGhhbmRsZSBqcGVnIGV2ZW50cworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3RhdHVzICAgIDogc3RhdHVzIG9mIGpwZWcgam9iCisgKiAgIEBjbGllbnRfaGRsOiBqcGVnIGNsaWVudCBoYW5kbGUKKyAqICAgQGpvYklkICAgICA6IGpwZWcgam9iIElkCisgKiAgIEBwX291cHV0ICAgOiBwdHIgdG8ganBlZyBvdXRwdXQgcmVzdWx0IHN0cnVjdAorICogICBAdXNlcmRhdGEgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6anBlZ0V2dEhhbmRsZShqcGVnX2pvYl9zdGF0dXNfdCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgLypjbGllbnRfaGRsKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgam9iSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fanBlZ19vdXRwdXRfdCAqcF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqb2JqID0gKFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKil1c2VyZGF0YTsKKyAgICBpZiAob2JqKSB7CisgICAgICAgIHFjYW1lcmFfanBlZ19ldnRfcGF5bG9hZF90ICpwYXlsb2FkID0KKyAgICAgICAgICAgIChxY2FtZXJhX2pwZWdfZXZ0X3BheWxvYWRfdCAqKW1hbGxvYyhzaXplb2YocWNhbWVyYV9qcGVnX2V2dF9wYXlsb2FkX3QpKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gcGF5bG9hZCkgeworICAgICAgICAgICAgbWVtc2V0KHBheWxvYWQsIDAsIHNpemVvZihxY2FtZXJhX2pwZWdfZXZ0X3BheWxvYWRfdCkpOworICAgICAgICAgICAgcGF5bG9hZC0+c3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgcGF5bG9hZC0+am9iSWQgPSBqb2JJZDsKKyAgICAgICAgICAgIGlmIChwX291dHB1dCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcGF5bG9hZC0+b3V0X2RhdGEgPSAqcF9vdXRwdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvYmotPnByb2Nlc3NFdnQoUUNBTUVSQV9TTV9FVlRfSlBFR19FVlRfTk9USUZZLCBwYXlsb2FkKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIk5VTEwgdXNlcl9kYXRhIik7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHRoZXJtYWxFdnRIYW5kbGUKKyAqCisgKiBERVNDUklQVElPTjogcm91dGluZSB0byBoYW5kbGUgdGhlcm1hbCBldmVudCBub3RpZmljYXRpb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGxldmVsICAgICAgOiB0aGVybWFsIGxldmVsCisgKiAgIEB1c2VyZGF0YSAgIDogdXNlcmRhdGEgcGFzc2VkIGluIGR1cmluZyByZWdpc3RyYXRpb24KKyAqICAgQGRhdGEgICAgICAgOiBvcGFxdWUgZGF0YSBmcm9tIHRoZXJtYWwgY2xpZW50CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnRoZXJtYWxFdnRIYW5kbGUoCisgICAgICAgIHFjYW1lcmFfdGhlcm1hbF9sZXZlbF9lbnVtX3QgKmxldmVsLCB2b2lkICp1c2VyZGF0YSwgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoIW1DYW1lcmFPcGVuZWQpIHsKKyAgICAgICAgTE9HSCgiQ2FtZXJhIGlzIG5vdCBvcGVuZWQsIG5vIG5lZWQgdG8gaGFuZGxlIHRoZXJtYWwgZXZ0Iik7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgdGhlcm1hbCBldmVudHMgYXJlIGxvZ2dlZAorICAgIExPR0goImxldmVsID0gJWQsIHVzZXJkYXRhID0gJXAsIGRhdGEgPSAlcCIsCisgICAgICAgICAqbGV2ZWwsIHVzZXJkYXRhLCBkYXRhKTsKKyAgICAvL1dlIGRvbid0IG5lZWQgdG8gbG9ja0FQSSwgd2FpdEFQSSBoZXJlLiBRQ0FNRVJBX1NNX0VWVF9USEVSTUFMX05PVElGWQorICAgIC8vIGJlY29tZXMgYW4gYXluYyBjYWxsLiBUaGlzIGFsc28gbWVhbnMgd2UgY2FuIG9ubHkgcGFzcyBwYXlsb2FkCisgICAgLy8gYnkgdmFsdWUsIG5vdCBieSBhZGRyZXNzLgorICAgIHJldHVybiBwcm9jZXNzQVBJKFFDQU1FUkFfU01fRVZUX1RIRVJNQUxfTk9USUZZLCAodm9pZCAqKWxldmVsKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZW5kRXZ0Tm90aWZ5CisgKgorICogREVTQ1JJUFRJT046IHNlbmQgZXZlbnQgbm90aWZ5IHRvIG5vdGlmeSB0aHJlYWQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1zZ190eXBlOiBtc2cgdHlwZSB0byBiZSBzZW50CisgKiAgIEBleHQxICAgIDogb3B0aW9uYWwgZXh0ZW5zaW9uMQorICogICBAZXh0MiAgICA6IG9wdGlvbmFsIGV4dGVuc2lvbjIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnNlbmRFdnROb3RpZnkoaW50MzJfdCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV4dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBleHQyKQoreworICAgIHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90IGNiQXJnOworICAgIG1lbXNldCgmY2JBcmcsIDAsIHNpemVvZihxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCkpOworICAgIGNiQXJnLmNiX3R5cGUgPSBRQ0FNRVJBX05PVElGWV9DQUxMQkFDSzsKKyAgICBjYkFyZy5tc2dfdHlwZSA9IG1zZ190eXBlOworICAgIGNiQXJnLmV4dDEgPSBleHQxOworICAgIGNiQXJnLmV4dDIgPSBleHQyOworICAgIHJldHVybiBtX2NiTm90aWZpZXIubm90aWZ5Q2FsbGJhY2soY2JBcmcpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2Nlc3NBRUluZm8KKyAqCisgKiBERVNDUklQVElPTjogcHJvY2VzcyBBRSB1cGRhdGVzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBhZV9wYXJhbXM6IGN1cnJlbnQgQUUgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHJvY2Vzc0FFSW5mbyhjYW1fM2FfcGFyYW1zX3QgJmFlX3BhcmFtcykKK3sKKyAgICBtUGFyYW1ldGVycy51cGRhdGVBRUluZm8oYWVfcGFyYW1zKTsKKyAgICBpZiAobVBhcmFtZXRlcnMuaXNJbnN0YW50QUVDRW5hYmxlZCgpKSB7CisgICAgICAgIC8vIFJlc2V0IEluc3RhbnQgQUVDIGluZm8gb25seSBpZiBpbnN0YW50IGFlYyBlbmFibGVkLgorICAgICAgICBib29sIGJSZXNldEluc3RhbnRBZWMgPSBmYWxzZTsKKyAgICAgICAgaWYgKGFlX3BhcmFtcy5zZXR0bGVkKSB7CisgICAgICAgICAgICAvLyBJZiBBRUMgc2V0dGxlZCwgcmVzZXQgaW5zdGFudCBBRUMKKyAgICAgICAgICAgIGJSZXNldEluc3RhbnRBZWMgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKChtUGFyYW1ldGVycy5pc0luc3RhbnRDYXB0dXJlRW5hYmxlZCgpKSAmJgorICAgICAgICAgICAgICAgIChtSW5zdGFudEFlY0ZyYW1lQ291bnQgPj0gbVBhcmFtZXRlcnMuZ2V0QWVjRnJhbWVCb3VuZFZhbHVlKCkpKSB7CisgICAgICAgICAgICAvLyBpZiBBRUMgbm90IHNldHRsZWQsIGFuZCBpbnN0YW50IGNhcHR1cmUgZW5hYmxlZCwKKyAgICAgICAgICAgIC8vIHJlc2V0IGluc3RhbnQgQUVDIG9ubHkgd2hlbiBmcmFtZSBjb3VudCBpcworICAgICAgICAgICAgLy8gbW9yZSBvciBlcXVhbCB0byBBRUMgZnJhbWUgYm91bmQgdmFsdWUuCisgICAgICAgICAgICBiUmVzZXRJbnN0YW50QWVjID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICgobVBhcmFtZXRlcnMuaXNJbnN0YW50QUVDRW5hYmxlZCgpKSAmJgorICAgICAgICAgICAgICAgIChtSW5zdGFudEFlY0ZyYW1lQ291bnQgPj0gbVBhcmFtZXRlcnMuZ2V0QWVjU2tpcERpc3BsYXlGcmFtZUJvdW5kKCkpKSB7CisgICAgICAgICAgICAvLyBpZiBBRUMgbm90IHNldHRsZWQsIGFuZCBvbmx5IGluc3RhbnQgQUVDIGVuYWJsZWQsCisgICAgICAgICAgICAvLyByZXNldCBpbnN0YW50IEFFQyBvbmx5IHdoZW4gZnJhbWUgY291bnQgaXMKKyAgICAgICAgICAgIC8vIG1vcmUgb3IgZXF1YWwgdG8gQUVDIHNraXAgZGlzcGxheSBmcmFtZSBib3VuZCB2YWx1ZS4KKyAgICAgICAgICAgIGJSZXNldEluc3RhbnRBZWMgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJSZXNldEluc3RhbnRBZWMpIHsKKyAgICAgICAgICAgIExPR0QoInNldHRpbmcgaW5zdGFudCBBRUMgdG8gZmFsc2UiKTsKKyAgICAgICAgICAgIG1QYXJhbWV0ZXJzLnNldEluc3RhbnRBRUMoZmFsc2UsIHRydWUpOworICAgICAgICAgICAgbUluc3RhbnRBZWNGcmFtZUNvdW50ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJvY2Vzc0ZvY3VzUG9zaXRpb25JbmZvCisgKgorICogREVTQ1JJUFRJT046IHByb2Nlc3MgQUYgdXBkYXRlcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY3VyX3Bvc19pbmZvOiBjdXJyZW50IGxlbnMgcG9zaXRpb24KKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnByb2Nlc3NGb2N1c1Bvc2l0aW9uSW5mbyhjYW1fZm9jdXNfcG9zX2luZm9fdCAmY3VyX3Bvc19pbmZvKQoreworICAgIG1QYXJhbWV0ZXJzLnVwZGF0ZUN1cnJlbnRGb2N1c1Bvc2l0aW9uKGN1cl9wb3NfaW5mbyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2Nlc3NBdXRvRm9jdXNFdmVudAorICoKKyAqIERFU0NSSVBUSU9OOiBwcm9jZXNzIGF1dG8gZm9jdXMgZXZlbnQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZvY3VzX2RhdGE6IHN0cnVjdCBjb250YWluaW5nIGF1dG8gZm9jdXMgcmVzdWx0IGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnByb2Nlc3NBdXRvRm9jdXNFdmVudChjYW1fYXV0b19mb2N1c19kYXRhX3QgJmZvY3VzX2RhdGEpCit7CisgICAgaW50MzJfdCByZXQgPSBOT19FUlJPUjsKKyAgICBMT0dIKCJFIik7CisKKyAgICBpZiAoZ2V0UmVsYXRlZENhbVN5bmNJbmZvKCktPm1vZGUgPT0gQ0FNX01PREVfU0VDT05EQVJZKSB7CisgICAgICAgIC8vIElnbm9yZSBmb2N1cyB1cGRhdGVzCisgICAgICAgIExPR0goIlggU2Vjb25kYXJ5IENhbWVyYSwgbm8gbmVlZCB0byBwcm9jZXNzISEgIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGNhbV9mb2N1c19tb2RlX3R5cGUgZm9jdXNNb2RlID0gbVBhcmFtZXRlcnMuZ2V0Rm9jdXNNb2RlKCk7CisgICAgTE9HSCgiW0FGX0RCR10gIGZvY3VzTW9kZT0lZCwgZm9jdXNTdGF0ZT0lZCBpc0RlcHRoPSVkIiwKKyAgICAgICAgICAgICBmb2N1c01vZGUsIGZvY3VzX2RhdGEuZm9jdXNfc3RhdGUsIGZvY3VzX2RhdGEuaXNEZXB0aCk7CisKKyAgICBzd2l0Y2ggKGZvY3VzTW9kZSkgeworICAgIGNhc2UgQ0FNX0ZPQ1VTX01PREVfQVVUTzoKKyAgICBjYXNlIENBTV9GT0NVU19NT0RFX01BQ1JPOgorICAgICAgICAvLyBpZ25vcmUgQUYgZXZlbnQgaWYgQUYgd2FzIGFscmVhZHkgY2FuY2VsbGVkIG1lYW53aGlsZQorICAgICAgICBpZiAoIW1BY3RpdmVBRikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgdGhlIEhBTCBmb2N1cyBtb2RlIGlzIGRpZmZlcmVudCBmcm9tIEFGIElORklOSVRZIGZvY3VzIG1vZGUsIHNlbmQgZXZlbnQgdG8gYXBwCisgICAgICAgIGlmICgoZm9jdXNfZGF0YS5mb2N1c19tb2RlID09IENBTV9GT0NVU19NT0RFX0lORklOSVRZKSAmJgorICAgICAgICAgICAgICAgIChmb2N1c19kYXRhLmZvY3VzX3N0YXRlID09IENBTV9BRl9TVEFURV9JTkFDVElWRSkpIHsKKyAgICAgICAgICAgIHJldCA9IHNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19GT0NVUywgdHJ1ZSwgMCk7CisgICAgICAgICAgICBtQWN0aXZlQUYgPSBmYWxzZTsgLy8gcmVzZXQgdGhlIG1BY3RpdmVBRiBpbiB0aGlzIHNwZWNpYWwgY2FzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvL3doaWxlIHRyYW5zaXRpb25pbmcgZnJvbSBDQUYtPkF1dG8vTWFjcm8sIHdlIG1pZ2h0IHJlY2VpdmUgQ0FGIHJlbGF0ZWQKKyAgICAgICAgLy9ldmVudHMgKFBBU1NJVkVfKikgZHVlIHRvIHRpbWluZy4gSWdub3JlIHN1Y2ggZXZlbnRzIGlmIGFueS4KKyAgICAgICAgaWYgKChmb2N1c19kYXRhLmZvY3VzX3N0YXRlID09IENBTV9BRl9TVEFURV9QQVNTSVZFX1NDQU4pIHx8CisgICAgICAgICAgICAgICAgKGZvY3VzX2RhdGEuZm9jdXNfc3RhdGUgPT0gQ0FNX0FGX1NUQVRFX1BBU1NJVkVfRk9DVVNFRCkgfHwKKyAgICAgICAgICAgICAgICAoZm9jdXNfZGF0YS5mb2N1c19zdGF0ZSA9PSBDQU1fQUZfU1RBVEVfUEFTU0lWRV9VTkZPQ1VTRUQpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vVGhpcyBpcyBqdXN0IGFuIGludGVybWVkaWF0ZSB1cGRhdGUgdG8gSEFMIGluZGljYXRpbmcgZm9jdXMgaXMgaW4gcHJvZ3Jlc3MuIE5vIG5lZWQKKyAgICAgICAgLy90byBzZW5kIHRoaXMgZXZlbnQgdG8gYXBwLiBTYW1lIGFwcGxpZXMgdG8gSU5BQ1RJVkUgc3RhdGUgYXMgd2VsbC4KKyAgICAgICAgaWYgKChmb2N1c19kYXRhLmZvY3VzX3N0YXRlID09IENBTV9BRl9TVEFURV9BQ1RJVkVfU0NBTikgfHwKKyAgICAgICAgICAgICAgICAoZm9jdXNfZGF0YS5mb2N1c19zdGF0ZSA9PSBDQU1fQUZfU1RBVEVfSU5BQ1RJVkUpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyB1cGRhdGUgZm9jdXMgZGlzdGFuY2UKKyAgICAgICAgbVBhcmFtZXRlcnMudXBkYXRlRm9jdXNEaXN0YW5jZXMoJmZvY3VzX2RhdGEuZm9jdXNfZGlzdCk7CisKKyAgICAgICAgLy9mbHVzaCBhbnkgb2xkIHNuYXBzaG90IGZyYW1lcyBpbiBaU0wgUSB3aGljaCBhcmUgbm90IGZvY3VzZWQuCisgICAgICAgIGlmIChtUGFyYW1ldGVycy5pc1pTTE1vZGUoKSAmJiBmb2N1c19kYXRhLmZsdXNoX2luZm8ubmVlZEZsdXNoICkgeworICAgICAgICAgICAgUUNhbWVyYVBpY0NoYW5uZWwgKnBaU0xDaGFubmVsID0KKyAgICAgICAgICAgICAgICAgICAgKFFDYW1lcmFQaWNDaGFubmVsICopbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfWlNMXTsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IHBaU0xDaGFubmVsKSB7CisgICAgICAgICAgICAgICAgLy9mbHVzaCB0aGUgenNsLWJ1ZmZlcgorICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsdXNoX2ZyYW1lX2lkeCA9IGZvY3VzX2RhdGEuZmx1c2hfaW5mby5mb2N1c2VkX2ZyYW1lX2lkeDsKKyAgICAgICAgICAgICAgICBMT0dEKCJmbHVzaCB0aGUgenNsLWJ1ZmZlciBiZWZvcmUgZnJhbWUgPSAldS4iLCBmbHVzaF9mcmFtZV9pZHgpOworICAgICAgICAgICAgICAgIHBaU0xDaGFubmVsLT5mbHVzaFN1cGVyYnVmZmVyKGZsdXNoX2ZyYW1lX2lkeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL3NlbmQgZXZlbnQgdG8gYXBwIGZpbmFsbHkKKyAgICAgICAgTE9HSSgiU2VuZCBBRiBET25lIGV2ZW50IHRvIGFwcCIpOworICAgICAgICByZXQgPSBzZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRk9DVVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzX2RhdGEuZm9jdXNfc3RhdGUgPT0gQ0FNX0FGX1NUQVRFX0ZPQ1VTRURfTE9DS0VEKSwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPQ1VTX01PREVfQ09OVElOT1VTX1ZJREVPOgorICAgIGNhc2UgQ0FNX0ZPQ1VTX01PREVfQ09OVElOT1VTX1BJQ1RVUkU6CisKKyAgICAgICAgLy8gSWYgdGhlIEhBTCBmb2N1cyBtb2RlIGlzIGRpZmZlcmVudCBmcm9tIEFGIElORklOSVRZIGZvY3VzIG1vZGUsIHNlbmQgZXZlbnQgdG8gYXBwCisgICAgICAgIGlmICgoZm9jdXNfZGF0YS5mb2N1c19tb2RlID09IENBTV9GT0NVU19NT0RFX0lORklOSVRZKSAmJgorICAgICAgICAgICAgICAgIChmb2N1c19kYXRhLmZvY3VzX3N0YXRlID09IENBTV9BRl9TVEFURV9JTkFDVElWRSkpIHsKKyAgICAgICAgICAgIHJldCA9IHNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19GT0NVUywgZmFsc2UsIDApOworICAgICAgICAgICAgbUFjdGl2ZUFGID0gZmFsc2U7IC8vIHJlc2V0IHRoZSBtQWN0aXZlQUYgaW4gdGhpcyBzcGVjaWFsIGNhc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy9JZiBBdXRvRm9jdXMoKSBpcyB0cmlnZ2VyZWQgd2hpbGUgaW4gQ0FGIG1vZGUsIGlnbm9yZSBhbGwgQ0FGIGV2ZW50cyAoUEFTU0lWRV8qKSBhbmQKKyAgICAgICAgLy9wcm9jZXNzL3dhaXQgZm9yIG9ubHkgQUNUSVZFXyogZXZlbnRzLgorICAgICAgICBpZiAoKChmb2N1c19kYXRhLmZvY3VzX3N0YXRlID09IENBTV9BRl9TVEFURV9QQVNTSVZFX0ZPQ1VTRUQpIHx8CisgICAgICAgICAgICAgICAgKGZvY3VzX2RhdGEuZm9jdXNfc3RhdGUgPT0gQ0FNX0FGX1NUQVRFX1BBU1NJVkVfVU5GT0NVU0VEKSB8fAorICAgICAgICAgICAgICAgIChmb2N1c19kYXRhLmZvY3VzX3N0YXRlID09IENBTV9BRl9TVEFURV9QQVNTSVZFX1NDQU4pKSAmJiBtQWN0aXZlQUYpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFiRGVwdGhBRkNhbGxiYWNrcyAmJiBmb2N1c19kYXRhLmlzRGVwdGggJiYKKyAgICAgICAgICAgICAgICAoZm9jdXNfZGF0YS5mb2N1c19zdGF0ZSA9PSBDQU1fQUZfU1RBVEVfUEFTU0lWRV9TQ0FOKSkgeworICAgICAgICAgICAgTE9HRCgiU2tpcCBzZW5kaW5nIHNjYW4gc3RhdGUgdG8gYXBwLCBpZiBkZXB0aCBmb2N1cyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvL1RoZXNlIGFyZSB0aGUgQUYgc3RhdGVzIGZvciB3aGljaCB3ZSBuZWVkIHRvIHNlbmQgbm90aWZpY2F0aW9uIHRvIGFwcCBpbiBDQUYgbW9kZS4KKyAgICAgICAgLy9UaGlzIGluY2x1ZGVzIGJvdGggcmVndWxhciBDQUYgKFBBU1NJVkUpIGV2ZW50cyBhcyB3ZWxsIGFzIEFDVElWRSBldmVudHMgKCBpbiBjYXNlCisgICAgICAgIC8vQUYgaXMgdHJpZ2dlcmVkIHdoaWxlIGluIENBRiBtb2RlKQorICAgICAgICBpZiAoKGZvY3VzX2RhdGEuZm9jdXNfc3RhdGUgPT0gQ0FNX0FGX1NUQVRFX1BBU1NJVkVfRk9DVVNFRCkgfHwKKyAgICAgICAgICAgICAgICAoZm9jdXNfZGF0YS5mb2N1c19zdGF0ZSA9PSBDQU1fQUZfU1RBVEVfUEFTU0lWRV9VTkZPQ1VTRUQpIHx8CisgICAgICAgICAgICAgICAgKGZvY3VzX2RhdGEuZm9jdXNfc3RhdGUgPT0gQ0FNX0FGX1NUQVRFX0ZPQ1VTRURfTE9DS0VEKSB8fAorICAgICAgICAgICAgICAgIChmb2N1c19kYXRhLmZvY3VzX3N0YXRlID09IENBTV9BRl9TVEFURV9OT1RfRk9DVVNFRF9MT0NLRUQpKSB7CisKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBmb2N1cyBkaXN0YW5jZQorICAgICAgICAgICAgbVBhcmFtZXRlcnMudXBkYXRlRm9jdXNEaXN0YW5jZXMoJmZvY3VzX2RhdGEuZm9jdXNfZGlzdCk7CisKKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5pc1pTTE1vZGUoKSAmJiBmb2N1c19kYXRhLmZsdXNoX2luZm8ubmVlZEZsdXNoICkgeworICAgICAgICAgICAgICAgIFFDYW1lcmFQaWNDaGFubmVsICpwWlNMQ2hhbm5lbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoUUNhbWVyYVBpY0NoYW5uZWwgKiltX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9aU0xdOworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHBaU0xDaGFubmVsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vZmx1c2ggdGhlIHpzbC1idWZmZXIKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmx1c2hfZnJhbWVfaWR4ID0gZm9jdXNfZGF0YS5mbHVzaF9pbmZvLmZvY3VzZWRfZnJhbWVfaWR4OworICAgICAgICAgICAgICAgICAgICBMT0dEKCJmbHVzaCB0aGUgenNsLWJ1ZmZlciBiZWZvcmUgZnJhbWUgPSAldS4iLCBmbHVzaF9mcmFtZV9pZHgpOworICAgICAgICAgICAgICAgICAgICBwWlNMQ2hhbm5lbC0+Zmx1c2hTdXBlcmJ1ZmZlcihmbHVzaF9mcmFtZV9pZHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1BY3RpdmVBRikgeworICAgICAgICAgICAgICAgIExPR0koIlNlbmQgQUYgRG9uZSBldmVudCB0byBhcHAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IHNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19GT0NVUywKKyAgICAgICAgICAgICAgICAgICAgKChmb2N1c19kYXRhLmZvY3VzX3N0YXRlID09IENBTV9BRl9TVEFURV9QQVNTSVZFX0ZPQ1VTRUQpIHx8CisgICAgICAgICAgICAgICAgICAgIChmb2N1c19kYXRhLmZvY3VzX3N0YXRlID09IENBTV9BRl9TVEFURV9GT0NVU0VEX0xPQ0tFRCkpLCAwKTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBzZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRk9DVVNfTU9WRSwKKyAgICAgICAgICAgICAgICAoZm9jdXNfZGF0YS5mb2N1c19zdGF0ZSA9PSBDQU1fQUZfU1RBVEVfUEFTU0lWRV9TQ0FOKSwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPQ1VTX01PREVfSU5GSU5JVFk6CisgICAgY2FzZSBDQU1fRk9DVVNfTU9ERV9GSVhFRDoKKyAgICBjYXNlIENBTV9GT0NVU19NT0RFX0VET0Y6CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HSCgibm8gb3BzIGZvciBhdXRvZm9jdXMgZXZlbnQgaW4gZm9jdXNtb2RlICVkIiwgZm9jdXNNb2RlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy9SZXNldCBtQWN0aXZlQUYgb25jZSB3ZSByZWNlaXZlIGZvY3VzIGRvbmUgZXZlbnQKKyAgICBpZiAoKGZvY3VzX2RhdGEuZm9jdXNfc3RhdGUgPT0gQ0FNX0FGX1NUQVRFX0ZPQ1VTRURfTE9DS0VEKSB8fAorICAgICAgICAgICAgKGZvY3VzX2RhdGEuZm9jdXNfc3RhdGUgPT0gQ0FNX0FGX1NUQVRFX05PVF9GT0NVU0VEX0xPQ0tFRCkpIHsKKyAgICAgICAgbUFjdGl2ZUFGID0gZmFsc2U7CisgICAgfQorCisgICAgTE9HSCgiWCIpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJvY2Vzc1pvb21FdmVudAorICoKKyAqIERFU0NSSVBUSU9OOiBwcm9jZXNzIHpvb20gZXZlbnQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNyb3BfaW5mbyA6IGNyb3AgaW5mbyBhcyBhIHJlc3VsdCBvZiB6b29tIG9wZXJhdGlvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHJvY2Vzc1pvb21FdmVudChjYW1fY3JvcF9kYXRhX3QgJmNyb3BfaW5mbykKK3sKKyAgICBpbnQzMl90IHJldCA9IE5PX0VSUk9SOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBRQ0FNRVJBX0NIX1RZUEVfTUFYOyBpKyspIHsKKyAgICAgICAgaWYgKG1fY2hhbm5lbHNbaV0gIT0gTlVMTCkgeworICAgICAgICAgICAgcmV0ID0gbV9jaGFubmVsc1tpXS0+cHJvY2Vzc1pvb21Eb25lKG1QcmV2aWV3V2luZG93LCBjcm9wX2luZm8pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJvY2Vzc1pTTENhcHR1cmVEb25lCisgKgorICogREVTQ1JJUFRJT046IHByb2Nlc3MgWlNMIGNhcHR1cmUgZG9uZSBldmVudHMKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHJvY2Vzc1pTTENhcHR1cmVEb25lKCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKworICAgIGlmICgrK21JbnB1dENvdW50ID49IG1QYXJhbWV0ZXJzLmdldEJ1cnN0Q291bnRGb3JBZHZhbmNlZENhcHR1cmUoKSkgeworICAgICAgICByYyA9IHVuY29uZmlndXJlQWR2YW5jZWRDYXB0dXJlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2Nlc3NSZXRyb0FFQ1VubG9jaworICoKKyAqIERFU0NSSVBUSU9OOiBwcm9jZXNzIHJldHJvIGJ1cnN0IEFFQyB1bmxvY2sgZXZlbnRzCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnByb2Nlc3NSZXRyb0FFQ1VubG9jaygpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisKKyAgICBMT0dIKCJMRUQgYXNzaXN0ZWQgQUYgUmVsZWFzZSBBRUMgTG9jayIpOworICAgIHJjID0gbVBhcmFtZXRlcnMuc2V0QWVjTG9jaygiZmFsc2UiKTsKKyAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgiRXJyb3Igc2V0dGluZyBBRUMgbG9jayIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmMgPSBtUGFyYW1ldGVycy5jb21taXRQYXJhbWV0ZXJzKCk7CisgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgIExPR0UoIkVycm9yIGR1cmluZyBjYW1lcmEgcGFyYW1ldGVyIGNvbW1pdCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fYkxlZEFmQWVjTG9jayA9IEZBTFNFOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jZXNzSERSRGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBwcm9jZXNzIEhEUiBzY2VuZSBldmVudHMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGhkcl9zY2VuZSA6IEhEUiBzY2VuZSBldmVudCBkYXRhCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpwcm9jZXNzSERSRGF0YSgKKyAgICAgICAgX191bnVzZWQgY2FtX2FzZF9oZHJfc2NlbmVfZGF0YV90IGhkcl9zY2VuZSkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKworI2lmbmRlZiBWQU5JTExBX0hBTAorICAgIGlmIChoZHJfc2NlbmUuaXNfaGRyX3NjZW5lICYmCisgICAgICAoaGRyX3NjZW5lLmhkcl9jb25maWRlbmNlID4gSERSX0NPTkZJREVOQ0VfVEhSRVNIT0xEKSAmJgorICAgICAgbVBhcmFtZXRlcnMuaXNBdXRvSERSRW5hYmxlZCgpKSB7CisgICAgICAgIG1fSERSU2NlbmVFbmFibGVkID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX0hEUlNjZW5lRW5hYmxlZCA9IGZhbHNlOworICAgIH0KKyAgICBtUGFyYW1ldGVycy5zZXRIRFJTY2VuZUVuYWJsZShtX0hEUlNjZW5lRW5hYmxlZCk7CisKKyAgICBpZiAoIG1zZ1R5cGVFbmFibGVkKENBTUVSQV9NU0dfTUVUQV9EQVRBKSApIHsKKworICAgICAgICBzaXplX3QgZGF0YV9sZW4gPSBzaXplb2YoaW50KTsKKyAgICAgICAgc2l6ZV90IGJ1ZmZlcl9sZW4gPSAxICpzaXplb2YoaW50KSAgICAgICAvL21ldGEgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICArIDEgKnNpemVvZihpbnQpICAgICAgIC8vZGF0YSBsZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxICpzaXplb2YoaW50KTsgICAgICAvL2RhdGEKKyAgICAgICAgY2FtZXJhX21lbW9yeV90ICpoZHJCdWZmZXIgPSBtR2V0TWVtb3J5KC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb29raWUpOworICAgICAgICBpZiAoIE5VTEwgPT0gaGRyQnVmZmVyICkgeworICAgICAgICAgICAgTE9HRSgiTm90IGVub3VnaCBtZW1vcnkgZm9yIGF1dG8gSERSIGRhdGEiKTsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgKnBIRFJEYXRhID0gKGludCAqKWhkckJ1ZmZlci0+ZGF0YTsKKyAgICAgICAgaWYgKHBIRFJEYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIExPR0UoIm1lbW9yeSBkYXRhIHB0ciBpcyBOVUxMIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHBIRFJEYXRhWzBdID0gQ0FNRVJBX01FVEFfREFUQV9IRFI7CisgICAgICAgIHBIRFJEYXRhWzFdID0gKGludClkYXRhX2xlbjsKKyAgICAgICAgcEhEUkRhdGFbMl0gPSBtX0hEUlNjZW5lRW5hYmxlZDsKKworICAgICAgICBxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCBjYkFyZzsKKyAgICAgICAgbWVtc2V0KCZjYkFyZywgMCwgc2l6ZW9mKHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90KSk7CisgICAgICAgIGNiQXJnLmNiX3R5cGUgPSBRQ0FNRVJBX0RBVEFfQ0FMTEJBQ0s7CisgICAgICAgIGNiQXJnLm1zZ190eXBlID0gQ0FNRVJBX01TR19NRVRBX0RBVEE7CisgICAgICAgIGNiQXJnLmRhdGEgPSBoZHJCdWZmZXI7CisgICAgICAgIGNiQXJnLnVzZXJfZGF0YSA9IGhkckJ1ZmZlcjsKKyAgICAgICAgY2JBcmcuY29va2llID0gdGhpczsKKyAgICAgICAgY2JBcmcucmVsZWFzZV9jYiA9IHJlbGVhc2VDYW1lcmFNZW1vcnk7CisgICAgICAgIHJjID0gbV9jYk5vdGlmaWVyLm5vdGlmeUNhbGxiYWNrKGNiQXJnKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJmYWlsIHNlbmRpbmcgYXV0byBIRFIgbm90aWZpY2F0aW9uIik7CisgICAgICAgICAgICBoZHJCdWZmZXItPnJlbGVhc2UoaGRyQnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR0goImhkcl9zY2VuZV9kYXRhOiBwcm9jZXNzSERSRGF0YTogJWQgJWYiLAorICAgICAgICAgIGhkcl9zY2VuZS5pc19oZHJfc2NlbmUsCisgICAgICAgICAgaGRyX3NjZW5lLmhkcl9jb25maWRlbmNlKTsKKworI2VuZGlmCisgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB0cmFuc0F3Yk1ldGFUb1BhcmFtcworICoKKyAqIERFU0NSSVBUSU9OOiB0cmFuc2xhdGUgYXdiIHBhcmFtcyBmcm9tIG1ldGFkYXRhIGNhbGxiYWNrIHRvIFFDYW1lcmFQYXJhbWV0ZXJzSW50ZgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAYXdiX3BhcmFtcyA6IGF3YiBwYXJhbXMgZnJvbSBtZXRhZGF0YSBjYWxsYmFjaworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6dHJhbnNBd2JNZXRhVG9QYXJhbXMoY2FtX2F3Yl9wYXJhbXNfdCAmYXdiX3BhcmFtcykKK3sKKyAgICBtUGFyYW1ldGVycy51cGRhdGVBV0JQYXJhbXMoYXdiX3BhcmFtcyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2Nlc3NQcmVwU25hcHNob3REb25lCisgKgorICogREVTQ1JJUFRJT046IHByb2Nlc3MgcHJlcCBzbmFwc2hvdCBkb25lIGV2ZW50CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwcmVwX3NuYXBzaG90X3N0YXRlICA6IHN0YXRlIG9mIHByZXBhcmUgc25hcHNob3QgZG9uZS4gSW4gb3RoZXIgd29yZHMsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZS4gd2hldGhlciBuZWVkIGZ1dHVyZSBmcmFtZXMgZm9yIGNhcHR1cmUuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpwcm9jZXNzUHJlcFNuYXBzaG90RG9uZUV2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3ByZXBfc25hcHNob3Rfc3RhdGVfdCBwcmVwX3NuYXBzaG90X3N0YXRlKQoreworICAgIGludDMyX3QgcmV0ID0gTk9fRVJST1I7CisgICAgTE9HSSgiW0tQSSBQZXJmXTogUmVjZWl2ZWQgUFJFUEFSRSBTQU5TUEhPVCBEb25lIGV2ZW50IHN0YXRlID0gJWQiLAorICAgICAgICAgICAgcHJlcF9zbmFwc2hvdF9zdGF0ZSk7CisgICAgaWYgKG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1pTTF0gJiYKKyAgICAgICAgcHJlcF9zbmFwc2hvdF9zdGF0ZSA9PSBORUVEX0ZVVFVSRV9GUkFNRSkgeworICAgICAgICBMT0dIKCJhbHJlYWR5IGhhbmRsZWQgaW4gbW0tY2FtZXJhLWludGYsIG5vIG9wcyBoZXJlIik7CisgICAgICAgIGlmIChpc1JldHJvUGljdHVyZSgpKSB7CisgICAgICAgICAgICBtUGFyYW1ldGVycy5zZXRBZWNMb2NrKCJ0cnVlIik7CisgICAgICAgICAgICBtUGFyYW1ldGVycy5jb21taXRQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBtX2JMZWRBZkFlY0xvY2sgPSBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJvY2Vzc0FTRFVwZGF0ZQorICoKKyAqIERFU0NSSVBUSU9OOiBwcm9jZXNzIEFTRCB1cGRhdGUgZXZlbnQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHNjZW5lOiBzZWxlY3RlZCBzY2VuZSBtb2RlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpwcm9jZXNzQVNEVXBkYXRlKAorICAgICAgICBfX3VudXNlZCBjYW1fYXNkX2RlY2lzaW9uX3QgYXNkX2RlY2lzaW9uKQoreworI2lmbmRlZiBWQU5JTExBX0hBTAorICAgIGlmICggbXNnVHlwZUVuYWJsZWQoQ0FNRVJBX01TR19NRVRBX0RBVEEpICkgeworICAgICAgICBzaXplX3QgZGF0YV9sZW4gPSBzaXplb2YoY2FtX2F1dG9fc2NlbmVfdCk7CisgICAgICAgIHNpemVfdCBidWZmZXJfbGVuID0gMSAqc2l6ZW9mKGludCkgICAgICAgLy9tZXRhIHR5cGUKKyAgICAgICAgICAgICAgICArIDEgKnNpemVvZihpbnQpICAgICAgIC8vZGF0YSBsZW4KKyAgICAgICAgICAgICAgICArIGRhdGFfbGVuOyAgICAgICAgICAgIC8vZGF0YQorICAgICAgICBjYW1lcmFfbWVtb3J5X3QgKmFzZEJ1ZmZlciA9IG1HZXRNZW1vcnkoLTEsCisgICAgICAgICAgICAgICAgYnVmZmVyX2xlbiwgMSwgbUNhbGxiYWNrQ29va2llKTsKKyAgICAgICAgaWYgKCBOVUxMID09IGFzZEJ1ZmZlciApIHsKKyAgICAgICAgICAgIExPR0UoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBoaXN0b2dyYW0gZGF0YSIpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorCisgICAgICAgIGludCAqcEFTRERhdGEgPSAoaW50ICopYXNkQnVmZmVyLT5kYXRhOworICAgICAgICBpZiAocEFTRERhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgibWVtb3J5IGRhdGEgcHRyIGlzIE5VTEwiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgcEFTRERhdGFbMF0gPSBDQU1FUkFfTUVUQV9EQVRBX0FTRDsKKyAgICAgICAgcEFTRERhdGFbMV0gPSAoaW50KWRhdGFfbGVuOworICAgICAgICBwQVNERGF0YVsyXSA9IGFzZF9kZWNpc2lvbi5kZXRlY3RlZF9zY2VuZTsKKworICAgICAgICBxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCBjYkFyZzsKKyAgICAgICAgbWVtc2V0KCZjYkFyZywgMCwgc2l6ZW9mKHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90KSk7CisgICAgICAgIGNiQXJnLmNiX3R5cGUgPSBRQ0FNRVJBX0RBVEFfQ0FMTEJBQ0s7CisgICAgICAgIGNiQXJnLm1zZ190eXBlID0gQ0FNRVJBX01TR19NRVRBX0RBVEE7CisgICAgICAgIGNiQXJnLmRhdGEgPSBhc2RCdWZmZXI7CisgICAgICAgIGNiQXJnLnVzZXJfZGF0YSA9IGFzZEJ1ZmZlcjsKKyAgICAgICAgY2JBcmcuY29va2llID0gdGhpczsKKyAgICAgICAgY2JBcmcucmVsZWFzZV9jYiA9IHJlbGVhc2VDYW1lcmFNZW1vcnk7CisgICAgICAgIGludDMyX3QgcmMgPSBtX2NiTm90aWZpZXIubm90aWZ5Q2FsbGJhY2soY2JBcmcpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoImZhaWwgc2VuZGluZyBub3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgIGFzZEJ1ZmZlci0+cmVsZWFzZShhc2RCdWZmZXIpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2Nlc3NKcGVnTm90aWZ5CisgKgorICogREVTQ1JJUFRJT046IHByb2Nlc3MganBlZyBldmVudAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAanBlZ19ldnQ6IHB0ciB0byBqcGVnIGV2ZW50IHBheWxvYWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnByb2Nlc3NKcGVnTm90aWZ5KHFjYW1lcmFfanBlZ19ldnRfcGF5bG9hZF90ICpqcGVnX2V2dCkKK3sKKyAgICByZXR1cm4gbV9wb3N0cHJvY2Vzc29yLnByb2Nlc3NKcGVnRXZ0KGpwZWdfZXZ0KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBsb2NrQVBJCisgKgorICogREVTQ1JJUFRJT046IGxvY2sgdG8gcHJvY2VzcyBBUEkKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6bG9ja0FQSSgpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHdhaXRBUElSZXN1bHQKKyAqCisgKiBERVNDUklQVElPTjogd2FpdCBmb3IgQVBJIHJlc3VsdCBjb21pbmcgYmFjay4gVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwsIGl0IHdpbGwKKyAqICAgICAgICAgICAgICByZXR1cm4gb25seSBjZXJudGFpbiBBUEkgZXZlbnQgdHlwZSBhcnJpdmVzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBhcGlfZXZ0IDogQVBJIGV2ZW50IHR5cGUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OndhaXRBUElSZXN1bHQocWNhbWVyYV9zbV9ldnRfZW51bV90IGFwaV9ldnQsCisgICAgICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90ICphcGlSZXN1bHQpCit7CisgICAgTE9HRCgid2FpdCBmb3IgQVBJIHJlc3VsdCBvZiBldnQgKCVkKSIsIGFwaV9ldnQpOworICAgIGludCByZXN1bHRSZWNlaXZlZCA9IDA7CisgICAgd2hpbGUgICghcmVzdWx0UmVjZWl2ZWQpIHsKKyAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJm1fY29uZCwgJm1fbG9jayk7CisgICAgICAgIGlmIChtX2FwaVJlc3VsdExpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgYXBpX3Jlc3VsdF9saXN0ICphcGlSZXN1bHRMaXN0ID0gbV9hcGlSZXN1bHRMaXN0OworICAgICAgICAgICAgYXBpX3Jlc3VsdF9saXN0ICphcGlSZXN1bHRMaXN0UHJldmlvdXMgPSBtX2FwaVJlc3VsdExpc3Q7CisgICAgICAgICAgICB3aGlsZSAoYXBpUmVzdWx0TGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKGFwaVJlc3VsdExpc3QtPnJlc3VsdC5yZXF1ZXN0X2FwaSA9PSBhcGlfZXZ0KSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFJlY2VpdmVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgKmFwaVJlc3VsdCA9IGFwaVJlc3VsdExpc3QtPnJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgYXBpUmVzdWx0TGlzdFByZXZpb3VzLT5uZXh0ID0gYXBpUmVzdWx0TGlzdC0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFwaVJlc3VsdExpc3QgPT0gbV9hcGlSZXN1bHRMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2FwaVJlc3VsdExpc3QgPSBhcGlSZXN1bHRMaXN0LT5uZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyZWUoYXBpUmVzdWx0TGlzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXBpUmVzdWx0TGlzdFByZXZpb3VzID0gYXBpUmVzdWx0TGlzdDsKKyAgICAgICAgICAgICAgICAgICAgYXBpUmVzdWx0TGlzdCA9IGFwaVJlc3VsdExpc3QtPm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIExPR0QoInJldHVybiAoJWQpIGZyb20gQVBJIHJlc3VsdCB3YWl0IGZvciBldnQgKCVkKSIsCisgICAgICAgICAgIGFwaVJlc3VsdC0+c3RhdHVzLCBhcGlfZXZ0KTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVubG9ja0FQSQorICoKKyAqIERFU0NSSVBUSU9OOiBBUEkgcHJvY2Vzc2luZyBpcyBkb25lLCB1bmxvY2sKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6dW5sb2NrQVBJKCkKK3sKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9sb2NrKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzaWduYWxBUElSZXN1bHQKKyAqCisgKiBERVNDUklQVElPTjogc2lnbmFsIGNvbmRpdGlvbiB2aWFyYWJsZSB0aGF0IGNlcm50YWluIEFQSSBldmVudCB0eXBlIGFycml2ZXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHJlc3VsdCAgOiBBUEkgcmVzdWx0CisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzaWduYWxBUElSZXN1bHQocWNhbWVyYV9hcGlfcmVzdWx0X3QgKnJlc3VsdCkKK3sKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9sb2NrKTsKKyAgICBhcGlfcmVzdWx0X2xpc3QgKmFwaVJlc3VsdCA9IChhcGlfcmVzdWx0X2xpc3QgKiltYWxsb2Moc2l6ZW9mKGFwaV9yZXN1bHRfbGlzdCkpOworICAgIGlmIChhcGlSZXN1bHQgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJFUlJPUjogbWFsbG9jIGZvciBhcGkgcmVzdWx0IGZhaWxlZCwgUmVzdWx0IHdpbGwgbm90IGJlIHNlbnQiKTsKKyAgICAgICAgZ290byBtYWxsb2NfZmFpbGVkOworICAgIH0KKyAgICBhcGlSZXN1bHQtPnJlc3VsdCA9ICpyZXN1bHQ7CisgICAgYXBpUmVzdWx0LT5uZXh0ID0gTlVMTDsKKyAgICBpZiAobV9hcGlSZXN1bHRMaXN0ID09IE5VTEwpIG1fYXBpUmVzdWx0TGlzdCA9IGFwaVJlc3VsdDsKKyAgICBlbHNlIHsKKyAgICAgICAgYXBpX3Jlc3VsdF9saXN0ICphcGlSZXN1bHRMaXN0ID0gbV9hcGlSZXN1bHRMaXN0OworICAgICAgICB3aGlsZShhcGlSZXN1bHRMaXN0LT5uZXh0ICE9IE5VTEwpIGFwaVJlc3VsdExpc3QgPSBhcGlSZXN1bHRMaXN0LT5uZXh0OworICAgICAgICBhcGlSZXN1bHRMaXN0LT5uZXh0ID0gYXBpUmVzdWx0OworICAgIH0KK21hbGxvY19mYWlsZWQ6CisgICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmbV9jb25kKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9sb2NrKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzaWduYWxFdnRSZXN1bHQKKyAqCisgKiBERVNDUklQVElPTjogc2lnbmFsIGNvbmRpdGlvbiB2YXJpYWJsZSB0aGF0IGNlcnRhaW4gZXZlbnQgd2FzIHByb2Nlc3NlZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVzdWx0ICA6IEV2ZW50IHJlc3VsdAorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c2lnbmFsRXZ0UmVzdWx0KHFjYW1lcmFfYXBpX3Jlc3VsdF90ICpyZXN1bHQpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2V2dExvY2spOworICAgIG1fZXZ0UmVzdWx0ID0gKnJlc3VsdDsKKyAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZtX2V2dENvbmQpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2V2dExvY2spOworfQorCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnByZXBhcmVSYXdTdHJlYW0oUUNhbWVyYUNoYW5uZWwgKmN1ckNoYW5uZWwpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGNhbV9kaW1lbnNpb25fdCBzdHJfZGltLG1heF9kaW07CisgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsOworCisgICAgbWF4X2RpbS53aWR0aCA9IDA7CisgICAgbWF4X2RpbS5oZWlnaHQgPSAwOworCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBRQ0FNRVJBX0NIX1RZUEVfTUFYOyBqKyspIHsKKyAgICAgICAgaWYgKG1fY2hhbm5lbHNbal0gIT0gTlVMTCkgeworICAgICAgICAgICAgcENoYW5uZWwgPSBtX2NoYW5uZWxzW2pdOworICAgICAgICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgcENoYW5uZWwtPmdldE51bU9mU3RyZWFtcygpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0gcENoYW5uZWwtPmdldFN0cmVhbUJ5SW5kZXgoaSk7CisgICAgICAgICAgICAgICAgaWYgKHBTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVykpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5nZXRGcmFtZURpbWVuc2lvbihzdHJfZGltKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cl9kaW0ud2lkdGggPiBtYXhfZGltLndpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfZGltLndpZHRoID0gc3RyX2RpbS53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyX2RpbS5oZWlnaHQgPiBtYXhfZGltLmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RpbS5oZWlnaHQgPSBzdHJfZGltLmhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8IGN1ckNoYW5uZWwtPmdldE51bU9mU3RyZWFtcygpOyBpKyspIHsKKyAgICAgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9IGN1ckNoYW5uZWwtPmdldFN0cmVhbUJ5SW5kZXgoaSk7CisgICAgICAgIGlmIChwU3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICgocFN0cmVhbS0+aXNUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVykpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU3RyZWFtLT5nZXRGcmFtZURpbWVuc2lvbihzdHJfZGltKTsKKyAgICAgICAgICAgIGlmIChzdHJfZGltLndpZHRoID4gbWF4X2RpbS53aWR0aCkgeworICAgICAgICAgICAgICAgIG1heF9kaW0ud2lkdGggPSBzdHJfZGltLndpZHRoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cl9kaW0uaGVpZ2h0ID4gbWF4X2RpbS5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtYXhfZGltLmhlaWdodCA9IHN0cl9kaW0uaGVpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJjID0gbVBhcmFtZXRlcnMudXBkYXRlUkFXKG1heF9kaW0pOworICAgIHJldHVybiByYzsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWRkU3RyZWFtVG9DaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGFkZCBhIHN0cmVhbSBpbnRvIGEgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcENoYW5uZWwgICA6IHB0ciB0byBjaGFubmVsIG9iagorICogICBAc3RyZWFtVHlwZSA6IHR5cGUgb2Ygc3RyZWFtIHRvIGJlIGFkZGVkCisgKiAgIEBzdHJlYW1DQiAgIDogY2FsbGJhY2sgb2Ygc3RyZWFtCisgKiAgIEB1c2VyRGF0YSAgIDogdXNlciBkYXRhIHB0ciB0byBjYWxsYmFjaworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6YWRkU3RyZWFtVG9DaGFubmVsKFFDYW1lcmFDaGFubmVsICpwQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fY2Jfcm91dGluZSBzdHJlYW1DQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIGlmIChzdHJlYW1UeXBlID09IENBTV9TVFJFQU1fVFlQRV9SQVcpIHsKKyAgICAgICAgcHJlcGFyZVJhd1N0cmVhbShwQ2hhbm5lbCk7CisgICAgfQorICAgIFFDYW1lcmFIZWFwTWVtb3J5ICpwU3RyZWFtSW5mbyA9IGFsbG9jYXRlU3RyZWFtSW5mb0J1ZihzdHJlYW1UeXBlKTsKKyAgICBpZiAocFN0cmVhbUluZm8gPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJubyBtZW0gZm9yIHN0cmVhbSBpbmZvIGJ1ZiIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICB1aW50OF90IG1pblN0cmVhbUJ1Zk51bSA9IGdldEJ1Zk51bVJlcXVpcmVkKHN0cmVhbVR5cGUpOworICAgIGJvb2wgYkR5bkFsbG9jQnVmID0gZmFsc2U7CisgICAgaWYgKGlzWlNMTW9kZSgpICYmIHN0cmVhbVR5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKSB7CisgICAgICAgIGJEeW5BbGxvY0J1ZiA9IHRydWU7CisgICAgfQorCisgICAgY2FtX3BhZGRpbmdfaW5mb190IHBhZGRpbmdfaW5mbzsKKworICAgIGlmIChzdHJlYW1UeXBlID09IENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUykgeworICAgICAgICBjYW1fYW5hbHlzaXNfaW5mb190IGFuYWx5c2lzSW5mbzsKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IGZlYXR1cmVNYXNrOworCisgICAgICAgIGZlYXR1cmVNYXNrID0gMDsKKyAgICAgICAgbVBhcmFtZXRlcnMuZ2V0U3RyZWFtUHBNYXNrKENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUywgZmVhdHVyZU1hc2spOworICAgICAgICByYyA9IG1QYXJhbWV0ZXJzLmdldEFuYWx5c2lzSW5mbygKKyAgICAgICAgICAgICAgICAoKG1QYXJhbWV0ZXJzLmdldFJlY29yZGluZ0hpbnRWYWx1ZSgpID09IHRydWUpICYmCisgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmZkTW9kZUluVmlkZW8oKSksCisgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgZmVhdHVyZU1hc2ssCisgICAgICAgICAgICAgICAgJmFuYWx5c2lzSW5mbyk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiZ2V0QW5hbHlzaXNJbmZvIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKworICAgICAgICBwYWRkaW5nX2luZm8gPSBhbmFseXNpc0luZm8uYW5hbHlzaXNfcGFkZGluZ19pbmZvOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhZGRpbmdfaW5mbyA9CisgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cGFkZGluZ19pbmZvOworICAgICAgICBpZiAoc3RyZWFtVHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVykgeworICAgICAgICAgICAgcGFkZGluZ19pbmZvLndpZHRoX3BhZGRpbmcgPSBtU3VyZmFjZVN0cmlkZVBhZGRpbmc7CisgICAgICAgICAgICBwYWRkaW5nX2luZm8uaGVpZ2h0X3BhZGRpbmcgPSBDQU1fUEFEX1RPXzI7CisgICAgICAgIH0KKyAgICAgICAgaWYoKCFuZWVkUmVwcm9jZXNzKCkpCisgICAgICAgICAgICAgICAgfHwgKHN0cmVhbVR5cGUgIT0gQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKQorICAgICAgICAgICAgICAgIHx8ICghbVBhcmFtZXRlcnMuaXNMTE5vaXNlRW5hYmxlZCgpKSkgeworICAgICAgICAgICAgcGFkZGluZ19pbmZvLm9mZnNldF9pbmZvLm9mZnNldF94ID0gMDsKKyAgICAgICAgICAgIHBhZGRpbmdfaW5mby5vZmZzZXRfaW5mby5vZmZzZXRfeSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGRlZmVyQWxsb2NhdGlvbiA9IG5lZWREZWZlcnJlZChzdHJlYW1UeXBlKTsKKyAgICBMT0dEKCJkZWZlckFsbG9jYXRpb24gPSAlZCBiRHluQWxsb2NCdWYgPSAlZCwgc3RyZWFtIHR5cGUgPSAlZCIsCisgICAgICAgICAgICBkZWZlckFsbG9jYXRpb24sIGJEeW5BbGxvY0J1Ziwgc3RyZWFtVHlwZSk7CisgICAgcmMgPSBwQ2hhbm5lbC0+YWRkU3RyZWFtKCp0aGlzLAorICAgICAgICAgICAgcFN0cmVhbUluZm8sCisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgbWluU3RyZWFtQnVmTnVtLAorICAgICAgICAgICAgJnBhZGRpbmdfaW5mbywKKyAgICAgICAgICAgIHN0cmVhbUNCLCB1c2VyRGF0YSwKKyAgICAgICAgICAgIGJEeW5BbGxvY0J1ZiwKKyAgICAgICAgICAgIGRlZmVyQWxsb2NhdGlvbik7CisKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiYWRkIHN0cmVhbSB0eXBlICglZCkgZmFpbGVkLCByZXQgPSAlZCIsCisgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWRkUHJldmlld0NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogYWRkIGEgcHJldmlldyBjaGFubmVsIHRoYXQgY29udGFpbnMgYSBwcmV2aWV3IHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjphZGRQcmV2aWV3Q2hhbm5lbCgpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIFFDYW1lcmFDaGFubmVsICpwQ2hhbm5lbCA9IE5VTEw7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGJvb2wgcmF3X3l1diA9IGZhbHNlOworCisKKyAgICBpZiAobV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfUFJFVklFV10gIT0gTlVMTCkgeworICAgICAgICAvLyBpZiB3ZSBoYWQgcHJldmlldyBjaGFubmVsIGJlZm9yZSwgZGVsZXRlIGl0IGZpcnN0CisgICAgICAgIGRlbGV0ZSBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9QUkVWSUVXXTsKKyAgICAgICAgbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfUFJFVklFV10gPSBOVUxMOworICAgIH0KKworICAgIHBDaGFubmVsID0gbmV3IFFDYW1lcmFDaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzKTsKKyAgICBpZiAoTlVMTCA9PSBwQ2hhbm5lbCkgeworICAgICAgICBMT0dFKCJubyBtZW0gZm9yIHByZXZpZXcgY2hhbm5lbCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIC8vIHByZXZpZXcgb25seSBjaGFubmVsLCBkb24ndCBuZWVkIGJ1bmRsZSBhdHRyIGFuZCBjYgorICAgIHJjID0gcENoYW5uZWwtPmluaXQoTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoImluaXQgcHJldmlldyBjaGFubmVsIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvLyBtZXRhIGRhdGEgc3RyZWFtIGFsd2F5cyBjb2V4aXN0cyB3aXRoIHByZXZpZXcgaWYgYXBwbGljYWJsZQorICAgIHJjID0gYWRkU3RyZWFtVG9DaGFubmVsKHBDaGFubmVsLCBDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfc3RyZWFtX2NiX3JvdXRpbmUsIHRoaXMpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJhZGQgbWV0YWRhdGEgc3RyZWFtIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAoaXNSZGlNb2RlKCkpIHsKKyAgICAgICAgcmMgPSBhZGRTdHJlYW1Ub0NoYW5uZWwocENoYW5uZWwsIENBTV9TVFJFQU1fVFlQRV9SQVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJkaV9tb2RlX3N0cmVhbV9jYl9yb3V0aW5lLCB0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaXNOb0Rpc3BsYXlNb2RlKCkpIHsKKyAgICAgICAgICAgIHJjID0gYWRkU3RyZWFtVG9DaGFubmVsKHBDaGFubmVsLCBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGlzcGxheV9wcmV2aWV3X3N0cmVhbV9jYl9yb3V0aW5lLCB0aGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJjID0gYWRkU3RyZWFtVG9DaGFubmVsKHBDaGFubmVsLCBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdfc3RyZWFtX2NiX3JvdXRpbmUsIHRoaXMpOworI2lmZGVmIFRBUkdFVF9UU19NQUtFVVAKKyAgICAgICAgICAgIGludCB3aGl0ZUxldmVsLCBjbGVhbkxldmVsOworICAgICAgICAgICAgaWYobVBhcmFtZXRlcnMuZ2V0VHNNYWtldXBJbmZvKHdoaXRlTGV2ZWwsIGNsZWFuTGV2ZWwpID09IGZhbHNlKQorI2VuZGlmCisgICAgICAgICAgICBwQ2hhbm5lbC0+c2V0U3RyZWFtU3luY0NCKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXLAorICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbm91c19zdHJlYW1fY2Jfcm91dGluZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKChtUGFyYW1ldGVycy5mZE1vZGVJblZpZGVvKCkpCisgICAgICAgICAgICB8fCAobVBhcmFtZXRlcnMuZ2V0RGNyZigpID09IHRydWUpCisgICAgICAgICAgICB8fCAobVBhcmFtZXRlcnMuZ2V0UmVjb3JkaW5nSGludFZhbHVlKCkgIT0gdHJ1ZSkpCisgICAgICAgICAgICAmJiAoIW1QYXJhbWV0ZXJzLmlzU2VjdXJlTW9kZSgpKSkgeworICAgICAgICByYyA9IGFkZFN0cmVhbVRvQ2hhbm5lbChwQ2hhbm5lbCwgQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTLAorICAgICAgICAgICAgICAgIE5VTEwsIHRoaXMpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoImFkZCBBbmFseXNpcyBzdHJlYW0gZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEucmF3X3l1diIsIHZhbHVlLCAiMCIpOworICAgIHJhd195dXYgPSBhdG9pKHZhbHVlKSA+IDAgPyB0cnVlIDogZmFsc2U7CisgICAgaWYgKCByYXdfeXV2ICkgeworICAgICAgICByYyA9IGFkZFN0cmVhbVRvQ2hhbm5lbChwQ2hhbm5lbCxDQU1fU1RSRUFNX1RZUEVfUkFXLAorICAgICAgICAgICAgICAgIHByZXZpZXdfcmF3X3N0cmVhbV9jYl9yb3V0aW5lLHRoaXMpOworICAgICAgICBpZiAoIHJjICE9IE5PX0VSUk9SICkgeworICAgICAgICAgICAgTE9HRSgiYWRkIHJhdyBzdHJlYW0gZmFpbGVkLCByZXQgPSAlZCIsIF9fRlVOQ1RJT05fXywgcmMpOworICAgICAgICAgICAgZGVsZXRlIHBDaGFubmVsOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoImFkZCBwcmV2aWV3IHN0cmVhbSBmYWlsZWQsIHJldCA9ICVkIiwgcmMpOworICAgICAgICBkZWxldGUgcENoYW5uZWw7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9QUkVWSUVXXSA9IHBDaGFubmVsOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhZGRWaWRlb0NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogYWRkIGEgdmlkZW8gY2hhbm5lbCB0aGF0IGNvbnRhaW5zIGEgdmlkZW8gc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmFkZFZpZGVvQ2hhbm5lbCgpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIFFDYW1lcmFWaWRlb0NoYW5uZWwgKnBDaGFubmVsID0gTlVMTDsKKworICAgIGlmIChtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9WSURFT10gIT0gTlVMTCkgeworICAgICAgICAvLyBpZiB3ZSBoYWQgdmlkZW8gY2hhbm5lbCBiZWZvcmUsIGRlbGV0ZSBpdCBmaXJzdAorICAgICAgICBkZWxldGUgbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfVklERU9dOworICAgICAgICBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9WSURFT10gPSBOVUxMOworICAgIH0KKworICAgIHBDaGFubmVsID0gbmV3IFFDYW1lcmFWaWRlb0NoYW5uZWwobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPm9wcyk7CisgICAgaWYgKE5VTEwgPT0gcENoYW5uZWwpIHsKKyAgICAgICAgTE9HRSgibm8gbWVtIGZvciB2aWRlbyBjaGFubmVsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgaWYgKGlzTG93UG93ZXJNb2RlKCkpIHsKKyAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfYXR0cl90IGF0dHI7CisgICAgICAgIG1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCkpOworICAgICAgICBhdHRyLm5vdGlmeV9tb2RlID0gTU1fQ0FNRVJBX1NVUEVSX0JVRl9OT1RJRllfQlVSU1Q7CisgICAgICAgIGF0dHIubG9va19iYWNrID0gMDsgLy93YWl0IGZvciBmdXR1cmUgZnJhbWUgZm9yIGxpdmVzaG90CisgICAgICAgIGF0dHIucG9zdF9mcmFtZV9za2lwID0gbVBhcmFtZXRlcnMuZ2V0WlNMQnVyc3RJbnRlcnZhbCgpOworICAgICAgICBhdHRyLndhdGVyX21hcmsgPSAxOyAvL2hvbGQgbWluIGJ1ZmZlcnMgcG9zc2libGUgaW4gUQorICAgICAgICBhdHRyLm1heF91bm1hdGNoZWRfZnJhbWVzID0gbVBhcmFtZXRlcnMuZ2V0TWF4VW5tYXRjaGVkRnJhbWVzSW5RdWV1ZSgpOworICAgICAgICByYyA9IHBDaGFubmVsLT5pbml0KCZhdHRyLCBzbmFwc2hvdF9jaGFubmVsX2NiX3JvdXRpbmUsIHRoaXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHByZXZpZXcgb25seSBjaGFubmVsLCBkb24ndCBuZWVkIGJ1bmRsZSBhdHRyIGFuZCBjYgorICAgICAgICByYyA9IHBDaGFubmVsLT5pbml0KE5VTEwsIE5VTEwsIE5VTEwpOworICAgIH0KKworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIExPR0UoImluaXQgdmlkZW8gY2hhbm5lbCBmYWlsZWQsIHJldCA9ICVkIiwgcmMpOworICAgICAgICBkZWxldGUgcENoYW5uZWw7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByYyA9IGFkZFN0cmVhbVRvQ2hhbm5lbChwQ2hhbm5lbCwgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX3N0cmVhbV9jYl9yb3V0aW5lLCB0aGlzKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiYWRkIHZpZGVvIHN0cmVhbSBmYWlsZWQsIHJldCA9ICVkIiwgcmMpOworICAgICAgICBkZWxldGUgcENoYW5uZWw7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9WSURFT10gPSBwQ2hhbm5lbDsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWRkU25hcHNob3RDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGFkZCBhIHNuYXBzaG90IGNoYW5uZWwgdGhhdCBjb250YWlucyBhIHNuYXBzaG90IHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqIE5PVEUgICAgICAgOiBBZGQgdGhpcyBjaGFubmVsIGZvciBsaXZlIHNuYXBzaG90IHVzZWNhc2UuIFJlZ3VsYXIgY2FwdHVyZSB3aWxsCisgKiAgICAgICAgICAgICAgdXNlIGFkZENhcHR1cmVDaGFubmVsLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmFkZFNuYXBzaG90Q2hhbm5lbCgpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIFFDYW1lcmFDaGFubmVsICpwQ2hhbm5lbCA9IE5VTEw7CisKKyAgICBpZiAobV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfU05BUFNIT1RdICE9IE5VTEwpIHsKKyAgICAgICAgLy8gaWYgd2UgaGFkIFpTTCBjaGFubmVsIGJlZm9yZSwgZGVsZXRlIGl0IGZpcnN0CisgICAgICAgIGRlbGV0ZSBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9TTkFQU0hPVF07CisgICAgICAgIG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1NOQVBTSE9UXSA9IE5VTEw7CisgICAgfQorCisgICAgcENoYW5uZWwgPSBuZXcgUUNhbWVyYUNoYW5uZWwobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSGFuZGxlLT5vcHMpOworICAgIGlmIChOVUxMID09IHBDaGFubmVsKSB7CisgICAgICAgIExPR0UoIm5vIG1lbSBmb3Igc25hcHNob3QgY2hhbm5lbCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCBhdHRyOworICAgIG1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCkpOworICAgIGF0dHIubm90aWZ5X21vZGUgPSBNTV9DQU1FUkFfU1VQRVJfQlVGX05PVElGWV9DT05USU5VT1VTOworICAgIGF0dHIubG9va19iYWNrID0gMDsgLy93YWl0IGZvciBmdXR1cmUgZnJhbWUgZm9yIGxpdmVzaG90CisgICAgYXR0ci5wb3N0X2ZyYW1lX3NraXAgPSBtUGFyYW1ldGVycy5nZXRaU0xCdXJzdEludGVydmFsKCk7CisgICAgYXR0ci53YXRlcl9tYXJrID0gMTsgLy9ob2xkIG1pbiBidWZmZXJzIHBvc3NpYmxlIGluIFEKKyAgICBhdHRyLm1heF91bm1hdGNoZWRfZnJhbWVzID0gbVBhcmFtZXRlcnMuZ2V0TWF4VW5tYXRjaGVkRnJhbWVzSW5RdWV1ZSgpOworICAgIGF0dHIucHJpb3JpdHkgPSBNTV9DQU1FUkFfU1VQRVJfQlVGX1BSSU9SSVRZX0xPVzsKKyAgICByYyA9IHBDaGFubmVsLT5pbml0KCZhdHRyLCBzbmFwc2hvdF9jaGFubmVsX2NiX3JvdXRpbmUsIHRoaXMpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJpbml0IHNuYXBzaG90IGNoYW5uZWwgZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgZGVsZXRlIHBDaGFubmVsOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmMgPSBhZGRTdHJlYW1Ub0NoYW5uZWwocENoYW5uZWwsIENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCwKKyAgICAgICAgICAgIE5VTEwsIE5VTEwpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJhZGQgc25hcHNob3Qgc3RyZWFtIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgIGRlbGV0ZSBwQ2hhbm5lbDsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1NOQVBTSE9UXSA9IHBDaGFubmVsOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhZGRSYXdDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGFkZCBhIHJhdyBjaGFubmVsIHRoYXQgY29udGFpbnMgYSByYXcgaW1hZ2Ugc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmFkZFJhd0NoYW5uZWwoKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBRQ2FtZXJhQ2hhbm5lbCAqcENoYW5uZWwgPSBOVUxMOworCisgICAgaWYgKG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1JBV10gIT0gTlVMTCkgeworICAgICAgICAvLyBpZiB3ZSBoYWQgcmF3IGNoYW5uZWwgYmVmb3JlLCBkZWxldGUgaXQgZmlyc3QKKyAgICAgICAgZGVsZXRlIG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1JBV107CisgICAgICAgIG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1JBV10gPSBOVUxMOworICAgIH0KKworICAgIHBDaGFubmVsID0gbmV3IFFDYW1lcmFDaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzKTsKKyAgICBpZiAoTlVMTCA9PSBwQ2hhbm5lbCkgeworICAgICAgICBMT0dFKCJubyBtZW0gZm9yIHJhdyBjaGFubmVsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgaWYgKG1QYXJhbWV0ZXJzLmdldG9mZmxpbmVSQVcoKSkgeworICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3QgYXR0cjsKKyAgICAgICAgbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YobW1fY2FtZXJhX2NoYW5uZWxfYXR0cl90KSk7CisgICAgICAgIGF0dHIubm90aWZ5X21vZGUgPSBNTV9DQU1FUkFfU1VQRVJfQlVGX05PVElGWV9CVVJTVDsKKyAgICAgICAgYXR0ci5sb29rX2JhY2sgPSBtUGFyYW1ldGVycy5nZXRaU0xCYWNrTG9va0NvdW50KCk7CisgICAgICAgIGF0dHIucG9zdF9mcmFtZV9za2lwID0gbVBhcmFtZXRlcnMuZ2V0WlNMQnVyc3RJbnRlcnZhbCgpOworICAgICAgICBhdHRyLndhdGVyX21hcmsgPSAxOworICAgICAgICBhdHRyLm1heF91bm1hdGNoZWRfZnJhbWVzID0gbVBhcmFtZXRlcnMuZ2V0TWF4VW5tYXRjaGVkRnJhbWVzSW5RdWV1ZSgpOworICAgICAgICByYyA9IHBDaGFubmVsLT5pbml0KCZhdHRyLCByYXdfY2hhbm5lbF9jYl9yb3V0aW5lLCB0aGlzKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJpbml0IFJBVyBjaGFubmVsIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgICAgICBkZWxldGUgcENoYW5uZWw7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByYyA9IHBDaGFubmVsLT5pbml0KE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoImluaXQgcmF3IGNoYW5uZWwgZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgICAgIGRlbGV0ZSBwQ2hhbm5lbDsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbVBhcmFtZXRlcnMuaXNaU0xNb2RlKCkpIHsKKyAgICAgICAgLy8gbWV0YSBkYXRhIHN0cmVhbSBhbHdheXMgY29leGlzdHMgd2l0aCBzbmFwc2hvdCBpbiByZWd1bGFyIFJBVyBjYXB0dXJlIGNhc2UKKyAgICAgICAgcmMgPSBhZGRTdHJlYW1Ub0NoYW5uZWwocENoYW5uZWwsIENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSwKKyAgICAgICAgICAgICAgICBtZXRhZGF0YV9zdHJlYW1fY2Jfcm91dGluZSwgdGhpcyk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiYWRkIG1ldGFkYXRhIHN0cmVhbSBmYWlsZWQsIHJldCA9ICVkIiwgcmMpOworICAgICAgICAgICAgZGVsZXRlIHBDaGFubmVsOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1QYXJhbWV0ZXJzLmdldG9mZmxpbmVSQVcoKSkgeworICAgICAgICByYyA9IGFkZFN0cmVhbVRvQ2hhbm5lbChwQ2hhbm5lbCwgQ0FNX1NUUkVBTV9UWVBFX1JBVywKKyAgICAgICAgICAgICAgICBOVUxMLCB0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgICByYyA9IGFkZFN0cmVhbVRvQ2hhbm5lbChwQ2hhbm5lbCwgQ0FNX1NUUkVBTV9UWVBFX1JBVywKKyAgICAgICAgICAgICAgICByYXdfc3RyZWFtX2NiX3JvdXRpbmUsIHRoaXMpOworICAgIH0KKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiYWRkIHNuYXBzaG90IHN0cmVhbSBmYWlsZWQsIHJldCA9ICVkIiwgcmMpOworICAgICAgICBkZWxldGUgcENoYW5uZWw7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfUkFXXSA9IHBDaGFubmVsOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhZGRaU0xDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGFkZCBhIFpTTCBjaGFubmVsIHRoYXQgY29udGFpbnMgYSBwcmV2aWV3IHN0cmVhbSBhbmQKKyAqICAgICAgICAgICAgICBhIHNuYXBzaG90IHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjphZGRaU0xDaGFubmVsKCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgUUNhbWVyYVBpY0NoYW5uZWwgKnBDaGFubmVsID0gTlVMTDsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgYm9vbCByYXdfeXV2ID0gZmFsc2U7CisKKyAgICBpZiAobV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfWlNMXSAhPSBOVUxMKSB7CisgICAgICAgIC8vIGlmIHdlIGhhZCBaU0wgY2hhbm5lbCBiZWZvcmUsIGRlbGV0ZSBpdCBmaXJzdAorICAgICAgICBkZWxldGUgbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfWlNMXTsKKyAgICAgICAgbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfWlNMXSA9IE5VTEw7CisgICAgfQorCisgICAgcENoYW5uZWwgPSBuZXcgUUNhbWVyYVBpY0NoYW5uZWwobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSGFuZGxlLT5vcHMpOworICAgIGlmIChOVUxMID09IHBDaGFubmVsKSB7CisgICAgICAgIExPR0UoIm5vIG1lbSBmb3IgWlNMIGNoYW5uZWwiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICAvLyBaU0wgY2hhbm5lbCwgaW5pdCB3aXRoIGJ1bmRsZSBhdHRyIGFuZCBjYgorICAgIG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCBhdHRyOworICAgIG1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCkpOworICAgIGlmIChtUGFyYW1ldGVycy5pc1NjZW5lU2VsZWN0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgIGF0dHIubm90aWZ5X21vZGUgPSBNTV9DQU1FUkFfU1VQRVJfQlVGX05PVElGWV9DT05USU5VT1VTOworICAgIH0gZWxzZSB7CisgICAgICAgIGF0dHIubm90aWZ5X21vZGUgPSBNTV9DQU1FUkFfU1VQRVJfQlVGX05PVElGWV9CVVJTVDsKKyAgICB9CisgICAgYXR0ci5sb29rX2JhY2sgPSBtUGFyYW1ldGVycy5nZXRaU0xCYWNrTG9va0NvdW50KCk7CisgICAgYXR0ci5wb3N0X2ZyYW1lX3NraXAgPSBtUGFyYW1ldGVycy5nZXRaU0xCdXJzdEludGVydmFsKCk7CisgICAgaWYgKG1QYXJhbWV0ZXJzLmlzT0VNRmVhdEVuYWJsZWQoKSkgeworICAgICAgICBhdHRyLnBvc3RfZnJhbWVfc2tpcCsrOworICAgIH0KKyAgICBhdHRyLndhdGVyX21hcmsgPSBtUGFyYW1ldGVycy5nZXRaU0xRdWV1ZURlcHRoKCk7CisgICAgYXR0ci5tYXhfdW5tYXRjaGVkX2ZyYW1lcyA9IG1QYXJhbWV0ZXJzLmdldE1heFVubWF0Y2hlZEZyYW1lc0luUXVldWUoKTsKKyAgICBhdHRyLnVzZXJfZXhwZWN0ZWRfZnJhbWVfaWQgPQorICAgICAgICBtUGFyYW1ldGVycy5pc0luc3RhbnRDYXB0dXJlRW5hYmxlZCgpID8gKHVpbnQ4X3QpbVBhcmFtZXRlcnMuZ2V0QWVjRnJhbWVCb3VuZFZhbHVlKCkgOiAwOworCisgICAgLy9FbmFibGVkIG1hdGNoZWQgcXVldWUKKyAgICBpZiAoaXNGcmFtZVN5bmNFbmFibGVkKCkpIHsKKyAgICAgICAgTE9HSCgiRW5hYmxpbmcgZnJhbWUgc3luYyBmb3IgZHVhbCBjYW1lcmEsIGNhbWVyYSBJZDogJWQiLAorICAgICAgICAgICAgICAgICBtQ2FtZXJhSWQpOworICAgICAgICBhdHRyLmVuYWJsZV9mcmFtZV9zeW5jID0gMTsKKyAgICB9CisgICAgcmMgPSBwQ2hhbm5lbC0+aW5pdCgmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHpzbF9jaGFubmVsX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgTE9HRSgiaW5pdCBaU0wgY2hhbm5lbCBmYWlsZWQsIHJldCA9ICVkIiwgcmMpOworICAgICAgICBkZWxldGUgcENoYW5uZWw7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvLyBtZXRhIGRhdGEgc3RyZWFtIGFsd2F5cyBjb2V4aXN0cyB3aXRoIHByZXZpZXcgaWYgYXBwbGljYWJsZQorICAgIHJjID0gYWRkU3RyZWFtVG9DaGFubmVsKHBDaGFubmVsLCBDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfc3RyZWFtX2NiX3JvdXRpbmUsIHRoaXMpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJhZGQgbWV0YWRhdGEgc3RyZWFtIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgIGRlbGV0ZSBwQ2hhbm5lbDsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmIChpc05vRGlzcGxheU1vZGUoKSkgeworICAgICAgICByYyA9IGFkZFN0cmVhbVRvQ2hhbm5lbChwQ2hhbm5lbCwgQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGlzcGxheV9wcmV2aWV3X3N0cmVhbV9jYl9yb3V0aW5lLCB0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgICByYyA9IGFkZFN0cmVhbVRvQ2hhbm5lbChwQ2hhbm5lbCwgQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdfc3RyZWFtX2NiX3JvdXRpbmUsIHRoaXMpOworI2lmZGVmIFRBUkdFVF9UU19NQUtFVVAKKyAgICAgICAgaW50IHdoaXRlTGV2ZWwsIGNsZWFuTGV2ZWw7CisgICAgICAgIGlmKG1QYXJhbWV0ZXJzLmdldFRzTWFrZXVwSW5mbyh3aGl0ZUxldmVsLCBjbGVhbkxldmVsKSA9PSBmYWxzZSkKKyNlbmRpZgorICAgICAgICBwQ2hhbm5lbC0+c2V0U3RyZWFtU3luY0NCKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXLAorICAgICAgICAgICAgICAgIHN5bmNocm9ub3VzX3N0cmVhbV9jYl9yb3V0aW5lKTsKKyAgICB9CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoImFkZCBwcmV2aWV3IHN0cmVhbSBmYWlsZWQsIHJldCA9ICVkIiwgcmMpOworICAgICAgICBkZWxldGUgcENoYW5uZWw7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByYyA9IGFkZFN0cmVhbVRvQ2hhbm5lbChwQ2hhbm5lbCwgQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHRoaXMpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJhZGQgc25hcHNob3Qgc3RyZWFtIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgIGRlbGV0ZSBwQ2hhbm5lbDsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmICghbVBhcmFtZXRlcnMuaXNTZWN1cmVNb2RlKCkpIHsKKyAgICAgICAgcmMgPSBhZGRTdHJlYW1Ub0NoYW5uZWwocENoYW5uZWwsIENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUywKKyAgICAgICAgICAgICAgICBOVUxMLCB0aGlzKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJhZGQgQW5hbHlzaXMgc3RyZWFtIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgICAgICBkZWxldGUgcENoYW5uZWw7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnJhd195dXYiLCB2YWx1ZSwgIjAiKTsKKyAgICByYXdfeXV2ID0gYXRvaSh2YWx1ZSkgPiAwID8gdHJ1ZSA6IGZhbHNlOworICAgIGlmIChyYXdfeXV2KSB7CisgICAgICAgIHJjID0gYWRkU3RyZWFtVG9DaGFubmVsKHBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfUkFXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3X3Jhd19zdHJlYW1fY2Jfcm91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiYWRkIHJhdyBzdHJlYW0gZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgICAgIGRlbGV0ZSBwQ2hhbm5lbDsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1pTTF0gPSBwQ2hhbm5lbDsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWRkQ2FwdHVyZUNoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogYWRkIGEgY2FwdHVyZSBjaGFubmVsIHRoYXQgY29udGFpbnMgYSBzbmFwc2hvdCBzdHJlYW0KKyAqICAgICAgICAgICAgICBhbmQgYSBwb3N0dmlldyBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKiBOT1RFICAgICAgIDogQWRkIHRoaXMgY2hhbm5lbCBmb3IgcmVndWxhciBjYXB0dXJlIHVzZWNhc2UuCisgKiAgICAgICAgICAgICAgRm9yIExpdmUgc25hcHNob3QgdXNlY2FzZSwgdXNlIGFkZFNuYXBzaG90Q2hhbm5lbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjphZGRDYXB0dXJlQ2hhbm5lbCgpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIFFDYW1lcmFQaWNDaGFubmVsICpwQ2hhbm5lbCA9IE5VTEw7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGJvb2wgcmF3X3l1diA9IGZhbHNlOworCisgICAgaWYgKG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX0NBUFRVUkVdICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX0NBUFRVUkVdOworICAgICAgICBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9DQVBUVVJFXSA9IE5VTEw7CisgICAgfQorCisgICAgcENoYW5uZWwgPSBuZXcgUUNhbWVyYVBpY0NoYW5uZWwobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSGFuZGxlLT5vcHMpOworICAgIGlmIChOVUxMID09IHBDaGFubmVsKSB7CisgICAgICAgIExPR0UoIm5vIG1lbSBmb3IgY2FwdHVyZSBjaGFubmVsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgLy8gQ2FwdHVyZSBjaGFubmVsLCBvbmx5IG5lZWQgc25hcHNob3QgYW5kIHBvc3R2aWV3IHN0cmVhbXMgc3RhcnQgdG9nZXRoZXIKKyAgICBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3QgYXR0cjsKKyAgICBtZW1zZXQoJmF0dHIsIDAsIHNpemVvZihtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3QpKTsKKyAgICBpZiAoIG1Mb25nc2hvdEVuYWJsZWQgKSB7CisgICAgICAgIGF0dHIubm90aWZ5X21vZGUgPSBNTV9DQU1FUkFfU1VQRVJfQlVGX05PVElGWV9CVVJTVDsKKyAgICAgICAgYXR0ci5sb29rX2JhY2sgPSBtUGFyYW1ldGVycy5nZXRaU0xCYWNrTG9va0NvdW50KCk7CisgICAgICAgIGF0dHIud2F0ZXJfbWFyayA9IG1QYXJhbWV0ZXJzLmdldFpTTFF1ZXVlRGVwdGgoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdHRyLm5vdGlmeV9tb2RlID0gTU1fQ0FNRVJBX1NVUEVSX0JVRl9OT1RJRllfQ09OVElOVU9VUzsKKyAgICB9CisgICAgYXR0ci5tYXhfdW5tYXRjaGVkX2ZyYW1lcyA9IG1QYXJhbWV0ZXJzLmdldE1heFVubWF0Y2hlZEZyYW1lc0luUXVldWUoKTsKKworICAgIHJjID0gcENoYW5uZWwtPmluaXQoJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlX2NoYW5uZWxfY2Jfcm91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJpbml0IGNhcHR1cmUgY2hhbm5lbCBmYWlsZWQsIHJldCA9ICVkIiwgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLy8gbWV0YSBkYXRhIHN0cmVhbSBhbHdheXMgY29leGlzdHMgd2l0aCBzbmFwc2hvdCBpbiByZWd1bGFyIGNhcHR1cmUgY2FzZQorICAgIHJjID0gYWRkU3RyZWFtVG9DaGFubmVsKHBDaGFubmVsLCBDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfc3RyZWFtX2NiX3JvdXRpbmUsIHRoaXMpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJhZGQgbWV0YWRhdGEgc3RyZWFtIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAobUxvbmdzaG90RW5hYmxlZCkgeworICAgICAgICByYyA9IGFkZFN0cmVhbVRvQ2hhbm5lbChwQ2hhbm5lbCwgQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdfc3RyZWFtX2NiX3JvdXRpbmUsIHRoaXMpOworCisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiYWRkIHByZXZpZXcgc3RyZWFtIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyNpZmRlZiBUQVJHRVRfVFNfTUFLRVVQCisgICAgICAgIGludCB3aGl0ZUxldmVsLCBjbGVhbkxldmVsOworICAgICAgICBpZihtUGFyYW1ldGVycy5nZXRUc01ha2V1cEluZm8od2hpdGVMZXZlbCwgY2xlYW5MZXZlbCkgPT0gZmFsc2UpCisjZW5kaWYKKyAgICAgICAgcENoYW5uZWwtPnNldFN0cmVhbVN5bmNDQihDQU1fU1RSRUFNX1RZUEVfUFJFVklFVywKKyAgICAgICAgICAgICAgICBzeW5jaHJvbm91c19zdHJlYW1fY2Jfcm91dGluZSk7CisgICAgLy9Ob3QgYWRkaW5nIHRoZSBwb3N0dmlldyBzdHJlYW0gdG8gdGhlIGNhcHR1cmUgY2hhbm5lbCBpZiBRdWFkcmEgQ0ZBIGlzIGVuYWJsZWQuCisgICAgfSBlbHNlIGlmICghbVBhcmFtZXRlcnMuZ2V0UXVhZHJhQ2ZhKCkpIHsKKyAgICAgICAgcmMgPSBhZGRTdHJlYW1Ub0NoYW5uZWwocENoYW5uZWwsIENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgdGhpcyk7CisKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJhZGQgcG9zdHZpZXcgc3RyZWFtIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1QYXJhbWV0ZXJzLmdldG9mZmxpbmVSQVcoKSkgeworICAgICAgICByYyA9IGFkZFN0cmVhbVRvQ2hhbm5lbChwQ2hhbm5lbCwgQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9ULAorICAgICAgICAgICAgICAgIE5VTEwsIHRoaXMpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoImFkZCBzbmFwc2hvdCBzdHJlYW0gZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0cmVhbV9jYl9yb3V0aW5lIHN0cmVhbV9jYiA9IE5VTEw7CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5yYXdfeXV2IiwgdmFsdWUsICIwIik7CisgICAgcmF3X3l1diA9IGF0b2kodmFsdWUpID4gMCA/IHRydWUgOiBmYWxzZTsKKworICAgIGlmIChyYXdfeXV2KSB7CisgICAgICAgIHN0cmVhbV9jYiA9IHNuYXBzaG90X3Jhd19zdHJlYW1fY2Jfcm91dGluZTsKKyAgICB9CisKKyAgICBpZiAoKHJhd195dXYpIHx8IChtUGFyYW1ldGVycy5nZXRvZmZsaW5lUkFXKCkpKSB7CisgICAgICAgIHJjID0gYWRkU3RyZWFtVG9DaGFubmVsKHBDaGFubmVsLAorICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9SQVcsIHN0cmVhbV9jYiwgdGhpcyk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiYWRkIHJhdyBzdHJlYW0gZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX0NBUFRVUkVdID0gcENoYW5uZWw7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFkZE1ldGFEYXRhQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBhZGQgYSBtZXRhIGRhdGEgY2hhbm5lbCB0aGF0IGNvbnRhaW5zIGEgbWV0YWRhdGEgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmFkZE1ldGFEYXRhQ2hhbm5lbCgpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIFFDYW1lcmFDaGFubmVsICpwQ2hhbm5lbCA9IE5VTEw7CisKKyAgICBpZiAobV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfTUVUQURBVEFdICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX01FVEFEQVRBXTsKKyAgICAgICAgbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfTUVUQURBVEFdID0gTlVMTDsKKyAgICB9CisKKyAgICBwQ2hhbm5lbCA9IG5ldyBRQ2FtZXJhQ2hhbm5lbChtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPm9wcyk7CisgICAgaWYgKE5VTEwgPT0gcENoYW5uZWwpIHsKKyAgICAgICAgTE9HRSgibm8gbWVtIGZvciBtZXRhZGF0YSBjaGFubmVsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgcmMgPSBwQ2hhbm5lbC0+aW5pdChOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJpbml0IG1ldGFkYXRhIGNoYW5uZWwgZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgZGVsZXRlIHBDaGFubmVsOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmMgPSBhZGRTdHJlYW1Ub0NoYW5uZWwocENoYW5uZWwsIENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YV9zdHJlYW1fY2Jfcm91dGluZSwgdGhpcyk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoImFkZCBtZXRhZGF0YSBzdHJlYW0gZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgZGVsZXRlIHBDaGFubmVsOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfTUVUQURBVEFdID0gcENoYW5uZWw7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFkZENhbGxiYWNrQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBhZGQgYSBjYWxsYmFjayBjaGFubmVsIHRoYXQgY29udGFpbnMgYSBjYWxsYmFjayBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6YWRkQ2FsbGJhY2tDaGFubmVsKCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsID0gTlVMTDsKKworICAgIGlmIChtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9DQUxMQkFDS10gIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfQ0FMTEJBQ0tdOworICAgICAgICBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9DQUxMQkFDS10gPSBOVUxMOworICAgIH0KKworICAgIHBDaGFubmVsID0gbmV3IFFDYW1lcmFDaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICBtQ2FtZXJhSGFuZGxlLT5vcHMpOworICAgIGlmIChOVUxMID09IHBDaGFubmVsKSB7CisgICAgICAgIExPR0UoIm5vIG1lbSBmb3IgY2FsbGJhY2sgY2hhbm5lbCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHJjID0gcENoYW5uZWwtPmluaXQoTlVMTCwgTlVMTCwgdGhpcyk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoImluaXQgY2FsbGJhY2sgY2hhbm5lbCBmYWlsZWQsIHJldCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICBkZWxldGUgcENoYW5uZWw7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByYyA9IGFkZFN0cmVhbVRvQ2hhbm5lbChwQ2hhbm5lbCwgQ0FNX1NUUkVBTV9UWVBFX0NBTExCQUNLLAorICAgICAgICAgICAgY2FsbGJhY2tfc3RyZWFtX2NiX3JvdXRpbmUsIHRoaXMpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJhZGQgY2FsbGJhY2sgc3RyZWFtIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgIGRlbGV0ZSBwQ2hhbm5lbDsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIG1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX0NBTExCQUNLXSA9IHBDaGFubmVsOworICAgIHJldHVybiByYzsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFkZEFuYWx5c2lzQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBhZGQgYSBhbmFseXNpcyBjaGFubmVsIHRoYXQgY29udGFpbnMgYSBhbmFseXNpcyBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6YWRkQW5hbHlzaXNDaGFubmVsKCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsID0gTlVMTDsKKworICAgIGlmIChtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9BTkFMWVNJU10gIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfQU5BTFlTSVNdOworICAgICAgICBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9BTkFMWVNJU10gPSBOVUxMOworICAgIH0KKworICAgIHBDaGFubmVsID0gbmV3IFFDYW1lcmFDaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzKTsKKyAgICBpZiAoTlVMTCA9PSBwQ2hhbm5lbCkgeworICAgICAgICBMT0dFKCJubyBtZW0gZm9yIG1ldGFkYXRhIGNoYW5uZWwiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICByYyA9IHBDaGFubmVsLT5pbml0KE5VTEwsIE5VTEwsIHRoaXMpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJpbml0IEFuYWx5c2lzIGNoYW5uZWwgZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgZGVsZXRlIHBDaGFubmVsOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmMgPSBhZGRTdHJlYW1Ub0NoYW5uZWwocENoYW5uZWwsIENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCB0aGlzKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiYWRkIEFuYWx5c2lzIHN0cmVhbSBmYWlsZWQsIHJldCA9ICVkIiwgcmMpOworICAgICAgICBkZWxldGUgcENoYW5uZWw7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBtX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9BTkFMWVNJU10gPSBwQ2hhbm5lbDsKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRQUENvbmZpZworICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgUG9zdCBwcm9jZXNzaW5nIGNvbmZpZ2FyYXRpb24gZGF0YQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogQHBwIGNvbmZpZzogIHBwIGNvbmZpZyBzdHJ1Y3R1cmUgcG9pbnRlciwKKyAqIEBjdXJJbmRleDogIGN1cnJlbnQgcHAgY2hhbm5lbCBpbmRleAorICogQG11bHRpcGFzczogRmxhZyBpZiBtdWx0aXBhc3MgcHJjZXNzaW5nIGVuYWJsZWQuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpnZXRQUENvbmZpZyhjYW1fcHBfZmVhdHVyZV9jb25maWdfdCAmcHBfY29uZmlnLAorICAgICAgICBpbnQ4X3QgY3VySW5kZXgsIGJvb2wgbXVsdGlwYXNzKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpbnQzMl90IGZlYXR1cmVfc2V0ID0gMDsKKworICAgIGlmIChtdWx0aXBhc3MpIHsKKyAgICAgICAgTE9HVygiTXVsdGkgcGFzcyBlbmFibGVkLiBUb3RhbCBQYXNzID0gJWQsIGN1ciBpbmRleCA9ICVkIiwKKyAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXRSZXByb2NDb3VudCgpLCBjdXJJbmRleCk7CisgICAgfQorCisgICAgTE9HSCgiU3VwcG9ydGVkIHBwcm9jIGZlYXR1cmUgbWFzayA9ICVsbHgiLAorICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrKTsKKyAgICBjYW1fZmVhdHVyZV9tYXNrX3QgZmVhdHVyZV9tYXNrID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrOworICAgIGludDMyX3Qgem9vbUxldmVsID0gbVBhcmFtZXRlcnMuZ2V0UGFybVpvb21MZXZlbCgpOworICAgIHVpbnQzMl90IHJvdGF0aW9uID0gbVBhcmFtZXRlcnMuZ2V0SnBlZ1JvdGF0aW9uKCk7CisgICAgaW50MzJfdCBlZmZlY3QgPSBtUGFyYW1ldGVycy5nZXRFZmZlY3RWYWx1ZSgpOworCisgICAgcHBfY29uZmlnLmN1cl9yZXByb2NfY291bnQgPSBjdXJJbmRleCArIDE7CisgICAgcHBfY29uZmlnLnRvdGFsX3JlcHJvY19jb3VudCA9IG1QYXJhbWV0ZXJzLmdldFJlcHJvY0NvdW50KCk7CisKKyAgICAvL0NoZWNraW5nIHdoYXQgZmVhdHVyZSBtYXNrIHRvIGVuYWJsZQorICAgIGlmIChjdXJJbmRleCA9PSAwKSB7CisgICAgICAgIGlmIChtUGFyYW1ldGVycy5nZXRRdWFkcmFDZmEoKSkgeworICAgICAgICAgICAgZmVhdHVyZV9zZXQgPSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmVhdHVyZV9zZXQgPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjdXJJbmRleCA9PSAxKSB7CisgICAgICAgIGlmIChtUGFyYW1ldGVycy5nZXRRdWFkcmFDZmEoKSkgeworICAgICAgICAgICAgZmVhdHVyZV9zZXQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmVhdHVyZV9zZXQgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoKGZlYXR1cmVfc2V0KSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIC8vQ29uZmlndXJlIGZlYXR1cmUgbWFzayBmb3IgZmlyc3QgcGFzcyBvZiByZXByb2Nlc3NpbmcKKyAgICAgICAgICAgIC8vY2hlY2sgaWYgYW55IGVmZmVjdHMgYXJlIGVuYWJsZWQKKyAgICAgICAgICAgIGlmICgoQ0FNX0VGRkVDVF9NT0RFX09GRiAhPSBlZmZlY3QpICYmCisgICAgICAgICAgICAgICAgKGZlYXR1cmVfbWFzayAmIENBTV9RQ09NX0ZFQVRVUkVfRUZGRUNUKSkgeworICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9FRkZFQ1Q7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmVmZmVjdCA9IGVmZmVjdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9jaGVjayBmb3IgZmVhdHVyZXMgdGhhdCBuZWVkIHRvIGJlIGVuYWJsZWQgYnkgZGVmYXVsdCBsaWtlIHNoYXJwbmVzcworICAgICAgICAgICAgLy8oaWYgc3VwcG9ydGVkIGJ5IGh3KS4KKyAgICAgICAgICAgIGlmICgoZmVhdHVyZV9tYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9TSEFSUE5FU1MpICYmCisgICAgICAgICAgICAgICAgIW1QYXJhbWV0ZXJzLmlzT3B0aVpvb21FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfU0hBUlBORVNTOworICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5zaGFycG5lc3MgPSBtUGFyYW1ldGVycy5nZXRTaGFycG5lc3MoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9jaGVjayBpZiB6b29tIGlzIGVuYWJsZWQKKyAgICAgICAgICAgIGlmICgoem9vbUxldmVsID4gMCkgJiYgKGZlYXR1cmVfbWFzayAmIENBTV9RQ09NX0ZFQVRVUkVfQ1JPUCkpIHsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfQ1JPUDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmlzV05SRW5hYmxlZCgpICYmCisgICAgICAgICAgICAgICAgKGZlYXR1cmVfbWFzayAmIENBTV9RQ09NX0ZFQVRVUkVfREVOT0lTRTJEKSkgeworICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9ERU5PSVNFMkQ7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmRlbm9pc2UyZC5kZW5vaXNlX2VuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmRlbm9pc2UyZC5wcm9jZXNzX3BsYXRlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXREZW5vaXNlUHJvY2Vzc1BsYXRlKENBTV9JTlRGX1BBUk1fV0FWRUxFVF9ERU5PSVNFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzQ0FDRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX0NBQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9jaGVjayBpZiByb3RhdGlvbiBpcyByZXF1aXJlZAorICAgICAgICAgICAgaWYgKChmZWF0dXJlX21hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX1JPVEFUSU9OKSAmJiAocm90YXRpb24gPiAwKSkgeworICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9ST1RBVElPTjsKKyAgICAgICAgICAgICAgICBpZiAocm90YXRpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwcF9jb25maWcucm90YXRpb24gPSBST1RBVEVfMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uID09IDkwKSB7CisgICAgICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5yb3RhdGlvbiA9IFJPVEFURV85MDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uID09IDE4MCkgeworICAgICAgICAgICAgICAgICAgICBwcF9jb25maWcucm90YXRpb24gPSBST1RBVEVfMTgwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm90YXRpb24gPT0gMjcwKSB7CisgICAgICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5yb3RhdGlvbiA9IFJPVEFURV8yNzA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVBhcmFtZXRlcnMuaXNIRFJFbmFibGVkKCkpeworICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9IRFI7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmhkcl9wYXJhbS5oZHJfZW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcuaGRyX3BhcmFtLmhkcl9uZWVkXzF4ID0gbVBhcmFtZXRlcnMuaXNIRFIxeEZyYW1lRW5hYmxlZCgpOworICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5oZHJfcGFyYW0uaGRyX21vZGUgPSBDQU1fSERSX01PREVfTVVMVElGUkFNRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayAmPSB+Q0FNX1FDT01fRkVBVFVSRV9IRFI7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmhkcl9wYXJhbS5oZHJfZW5hYmxlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9jaGVjayBpZiBzY2FsaW5nIGlzIGVuYWJsZWQKKyAgICAgICAgICAgIGlmICgoZmVhdHVyZV9tYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9TQ0FMRSkgJiYKKyAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5pc1JlcHJvY1NjYWxlRW5hYmxlZCgpICYmCisgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuaXNVbmRlclJlcHJvY1NjYWxpbmcoKSl7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX1NDQUxFOworICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldFBpY1NpemVGcm9tQVBLKAorICAgICAgICAgICAgICAgICAgICAgICAgcHBfY29uZmlnLnNjYWxlX3BhcmFtLm91dHB1dF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5zY2FsZV9wYXJhbS5vdXRwdXRfaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYobVBhcmFtZXRlcnMuaXNVYmlGb2N1c0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9VQklGT0NVUzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayAmPSB+Q0FNX1FDT01fRkVBVFVSRV9VQklGT0NVUzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYobVBhcmFtZXRlcnMuaXNVYmlSZWZvY3VzKCkpIHsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfUkVGT0NVUzsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcubWlzY19idWZfcGFyYW0ubWlzY19idWZmZXJfaW5kZXggPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrICY9IH5DQU1fUUNPTV9GRUFUVVJFX1JFRk9DVVM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKG1QYXJhbWV0ZXJzLmlzQ2hyb21hRmxhc2hFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfQ0hST01BX0ZMQVNIOworICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5mbGFzaF92YWx1ZSA9IENBTV9GTEFTSF9PTjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayAmPSB+Q0FNX1FDT01fRkVBVFVSRV9DSFJPTUFfRkxBU0g7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKG1QYXJhbWV0ZXJzLmlzT3B0aVpvb21FbmFibGVkKCkgJiYgKDAgPD0gem9vbUxldmVsKSkgeworICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9PUFRJWk9PTTsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcuem9vbV9sZXZlbCA9ICh1aW50OF90KSB6b29tTGV2ZWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgJj0gfkNBTV9RQ09NX0ZFQVRVUkVfT1BUSVpPT007CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5nZXRvZmZsaW5lUkFXKCkpIHsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfUkFXX1BST0NFU1NJTkc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5pc1RydWVQb3J0cmFpdEVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9UUlVFUE9SVFJBSVQ7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLm1pc2NfYnVmX3BhcmFtLm1pc2NfYnVmZmVyX2luZGV4ID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayAmPSB+Q0FNX1FDT01fRkVBVFVSRV9UUlVFUE9SVFJBSVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKG1QYXJhbWV0ZXJzLmlzU3RpbGxNb3JlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX1NUSUxMTU9SRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayAmPSB+Q0FNX1FDT01fRkVBVFVSRV9TVElMTE1PUkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5pc09FTUZlYXRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrIHw9IENBTV9PRU1fRkVBVFVSRV8xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVBhcmFtZXRlcnMuZ2V0Q0RTTW9kZSgpICE9IENBTV9DRFNfTU9ERV9PRkYpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZV9tYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9EU0ROKSB7CisgICAgICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9EU0ROOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9DRFM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKG11bHRpcGFzcykgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1fcG9zdHByb2Nlc3Nvci5nZXRQUENoYW5uZWxDb3VudCgpID4gMSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCFtUGFyYW1ldGVycy5nZXRRdWFkcmFDZmEoKSkpIHsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrICY9IH5DQU1fUUNPTV9GRUFUVVJFX1BQX1BBU1NfMjsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrICY9IH5DQU1fUUNPTV9GRUFUVVJFX1JPVEFUSU9OOworICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgJj0gfkNBTV9RQ09NX0ZFQVRVUkVfQ0RTOworICAgICAgICAgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgJj0gfkNBTV9RQ09NX0ZFQVRVUkVfRFNETjsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfQ1JPUDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX1NDQUxFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3QgdGh1bWJfc3JjX2RpbTsKKyAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCB0aHVtYl9kc3RfZGltOworICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0VGh1bWJuYWlsU2l6ZSgmKHRodW1iX2RzdF9kaW0ud2lkdGgpLCAmKHRodW1iX2RzdF9kaW0uaGVpZ2h0KSk7CisgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXRTdHJlYW1EaW1lbnNpb24oQ0FNX1NUUkVBTV9UWVBFX1BPU1RWSUVXLHRodW1iX3NyY19kaW0pOworICAgICAgICAgICAgaWYgKCh0aHVtYl9kc3RfZGltLndpZHRoICE9IHRodW1iX3NyY19kaW0ud2lkdGgpIHx8CisgICAgICAgICAgICAgICAgICAgICh0aHVtYl9kc3RfZGltLmhlaWdodCAhPSB0aHVtYl9zcmNfZGltLmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodGh1bWJfZHN0X2RpbS53aWR0aCAhPSAwICYmIHRodW1iX2RzdF9kaW0uaGVpZ2h0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX0NST1A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAvL0NvbmZpZ3VyZSBmZWF0dXJlIG1hc2sgZm9yIHNlY29uZCBwYXNzIG9mIHJlcHJvY2Vzc2luZworICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX1BQX1BBU1NfMjsKKyAgICAgICAgICAgIGlmICgoZmVhdHVyZV9tYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9ST1RBVElPTikgJiYgKHJvdGF0aW9uID4gMCkpIHsKKyAgICAgICAgICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfUk9UQVRJT047CisgICAgICAgICAgICAgICAgaWYgKHJvdGF0aW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHBfY29uZmlnLnJvdGF0aW9uID0gUk9UQVRFXzA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbiA9PSA5MCkgeworICAgICAgICAgICAgICAgICAgICBwcF9jb25maWcucm90YXRpb24gPSBST1RBVEVfOTA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbiA9PSAxODApIHsKKyAgICAgICAgICAgICAgICAgICAgcHBfY29uZmlnLnJvdGF0aW9uID0gUk9UQVRFXzE4MDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uID09IDI3MCkgeworICAgICAgICAgICAgICAgICAgICBwcF9jb25maWcucm90YXRpb24gPSBST1RBVEVfMjcwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5nZXRDRFNNb2RlKCkgIT0gQ0FNX0NEU19NT0RFX09GRikgeworICAgICAgICAgICAgICAgIGlmIChmZWF0dXJlX21hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX0RTRE4pIHsKKyAgICAgICAgICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX0RTRE47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX0NEUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrICY9IH5DQU1fUUNPTV9GRUFUVVJFX1JBV19QUk9DRVNTSU5HOworICAgICAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayAmPSB+Q0FNX1FDT01fRkVBVFVSRV9NRVRBREFUQV9QUk9DRVNTSU5HOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgLy9TZXR0aW5nIGZlYXR1cmUgZm9yIFF1YWRyYSBDRkEKKyAgICAgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9RVUFEUkFfQ0ZBOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICB9CisKKyAgICBMT0dIKCJwcHJvYyBmZWF0dXJlIG1hc2sgc2V0ID0gJWxseCBwYXNzIGNvdW50ID0gJWQiLAorICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrLCBjdXJJbmRleCk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFkZFJlcHJvY0NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogYWRkIGEgcmVwcm9jZXNzIGNoYW5uZWwgdGhhdCB3aWxsIGRvIHJlcHJvY2VzcyBvbiBmcmFtZXMKKyAqICAgICAgICAgICAgICBjb21pbmcgZnJvbSBpbnB1dCBjaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwSW5wdXRDaGFubmVsIDogcHRyIHRvIGlucHV0IGNoYW5uZWwgd2hvc2UgZnJhbWVzIHdpbGwgYmUgcG9zdC1wcm9jZXNzZWQKKyAqICAgQGN1cl9jaGFubmVsX2luZGV4IDogQ3VycmVudCBjaGFubmVsIGluZGV4IGluIG11bHRpcGFzcworICoKKyAqIFJFVFVSTiAgICAgOiBQdHIgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgY2hhbm5lbCBvYmouIE5VTEwgaWYgZmFpbGVkLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbCAqUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6YWRkUmVwcm9jQ2hhbm5lbCgKKyAgICAgICAgUUNhbWVyYUNoYW5uZWwgKnBJbnB1dENoYW5uZWwsIGludDhfdCBjdXJfY2hhbm5lbF9pbmRleCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgUUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWwgKnBDaGFubmVsID0gTlVMTDsKKyAgICB1aW50MzJfdCBidXJzdF9jbnQgPSBtUGFyYW1ldGVycy5nZXROdW1PZlNuYXBzaG90cygpOworCisgICAgaWYgKHBJbnB1dENoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJpbnB1dCBjaGFubmVsIG9iaiBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBDaGFubmVsID0gbmV3IFFDYW1lcmFSZXByb2Nlc3NDaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzKTsKKyAgICBpZiAoTlVMTCA9PSBwQ2hhbm5lbCkgeworICAgICAgICBMT0dFKCJubyBtZW0gZm9yIHJlcHJvY2VzcyBjaGFubmVsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIENhcHR1cmUgY2hhbm5lbCwgb25seSBuZWVkIHNuYXBzaG90IGFuZCBwb3N0dmlldyBzdHJlYW1zIHN0YXJ0IHRvZ2V0aGVyCisgICAgbW1fY2FtZXJhX2NoYW5uZWxfYXR0cl90IGF0dHI7CisgICAgbWVtc2V0KCZhdHRyLCAwLCBzaXplb2YobW1fY2FtZXJhX2NoYW5uZWxfYXR0cl90KSk7CisgICAgYXR0ci5ub3RpZnlfbW9kZSA9IE1NX0NBTUVSQV9TVVBFUl9CVUZfTk9USUZZX0NPTlRJTlVPVVM7CisgICAgYXR0ci5tYXhfdW5tYXRjaGVkX2ZyYW1lcyA9IG1QYXJhbWV0ZXJzLmdldE1heFVubWF0Y2hlZEZyYW1lc0luUXVldWUoKTsKKyAgICByYyA9IHBDaGFubmVsLT5pbml0KCZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHByb2NfY2hhbm5lbF9jYl9yb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoImluaXQgcmVwcm9jZXNzIGNoYW5uZWwgZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgZGVsZXRlIHBDaGFubmVsOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBwcCBmZWF0dXJlIGNvbmZpZworICAgIGNhbV9wcF9mZWF0dXJlX2NvbmZpZ190IHBwX2NvbmZpZzsKKyAgICBtZW1zZXQoJnBwX2NvbmZpZywgMCwgc2l6ZW9mKGNhbV9wcF9mZWF0dXJlX2NvbmZpZ190KSk7CisKKyAgICByYyA9IGdldFBQQ29uZmlnKHBwX2NvbmZpZywgY3VyX2NoYW5uZWxfaW5kZXgsCisgICAgICAgICAgICAoKG1QYXJhbWV0ZXJzLmdldFJlcHJvY0NvdW50KCkgPiAxKSA/IFRSVUUgOiBGQUxTRSkpOworICAgIGlmIChyYyAhPSBOT19FUlJPUil7CisgICAgICAgIExPR0UoIkVycm9yIHdoaWxlIGNyZWF0aW5nIFBQIGNvbmZpZyIpOworICAgICAgICBkZWxldGUgcENoYW5uZWw7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHVpbnQ4X3QgbWluU3RyZWFtQnVmTnVtID0gZ2V0QnVmTnVtUmVxdWlyZWQoQ0FNX1NUUkVBTV9UWVBFX09GRkxJTkVfUFJPQyk7CisKKyAgICAvL1dOUiBhbmQgSERSIGhhcHBlbiBpbmxpbmUuIE5vIGV4dHJhIGJ1ZmZlcnMgbmVlZGVkLgorICAgIGNhbV9mZWF0dXJlX21hc2tfdCB0ZW1wX2ZlYXR1cmVfbWFzayA9IHBwX2NvbmZpZy5mZWF0dXJlX21hc2s7CisgICAgdGVtcF9mZWF0dXJlX21hc2sgJj0gfkNBTV9RQ09NX0ZFQVRVUkVfSERSOworICAgIGlmICh0ZW1wX2ZlYXR1cmVfbWFzayAmJiBtUGFyYW1ldGVycy5pc0hEUkVuYWJsZWQoKSkgeworICAgICAgICBtaW5TdHJlYW1CdWZOdW0gPSAodWludDhfdCkoMSArIG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFIRFJJbkJ1ZnNJZk5lZWRlZCgpKTsKKyAgICB9CisKKyAgICBpZiAobVBhcmFtZXRlcnMuaXNTdGlsbE1vcmVFbmFibGVkKCkpIHsKKyAgICAgICAgY2FtX3N0aWxsX21vcmVfdCBzdGlsbG1vcmVfY29uZmlnID0gbVBhcmFtZXRlcnMuZ2V0U3RpbGxNb3JlU2V0dGluZ3MoKTsKKyAgICAgICAgcHBfY29uZmlnLmJ1cnN0X2NudCA9IHN0aWxsbW9yZV9jb25maWcuYnVyc3RfY291bnQ7CisgICAgICAgIExPR0goIlN0aWxsbW9yZSBidXJzdCAlZCIsIHBwX2NvbmZpZy5idXJzdF9jbnQpOworCisgICAgICAgIC8vIGdldE51bU9mRXh0cmFCdWZmZXJzRm9ySW1hZ2VQcm9jIHJldHVybnMgMSBsZXNzIGJ1ZmZlciBhc3N1bWluZworICAgICAgICAvLyBudW1iZXIgb2YgY2FwdHVyZSBpcyBhbHJlYWR5IGFkZGVkLiBJbiB0aGUgY2FzZSBvZiBsaXZlc2hvdCwKKyAgICAgICAgLy8gc3RpbGxtb3JlIGJ1cnN0IGlzIDEuIFRoaXMgaXMgdG8gYWNjb3VudCBmb3IgdGhlIHByZW1hdHVyZSBkZWNyZW1lbnQKKyAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmdldE51bU9mRXh0cmFCdWZmZXJzRm9ySW1hZ2VQcm9jKCkgPT0gMCkgeworICAgICAgICAgICAgbWluU3RyZWFtQnVmTnVtICs9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobVBhcmFtZXRlcnMuZ2V0TWFudWFsQ2FwdHVyZU1vZGUoKSA+PSBDQU1fTUFOVUFMX0NBUFRVUkVfVFlQRV8zKSB7CisgICAgICAgIG1pblN0cmVhbUJ1Zk51bSArPSBtUGFyYW1ldGVycy5nZXRSZXByb2NDb3VudCgpIC0gMTsKKyAgICAgICAgYnVyc3RfY250ID0gbVBhcmFtZXRlcnMuZ2V0UmVwcm9jQ291bnQoKTsKKyAgICAgICAgaWYgKGN1cl9jaGFubmVsX2luZGV4ID09IDApIHsKKyAgICAgICAgICAgIHBDaGFubmVsLT5zZXRSZXByb2NDb3VudCgyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBDaGFubmVsLT5zZXRSZXByb2NDb3VudCgxKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBDaGFubmVsLT5zZXRSZXByb2NDb3VudCgxKTsKKyAgICB9CisKKyAgICAvLyBBZGQgbm9uIGlucGxhY2UgaW1hZ2UgbGliIGJ1ZmZlcnMgb25seSB3aGVuIHBwcHJvYyBpcyBwcmVzZW50LAorICAgIC8vIGJlY3Vhc2UgcHByb2MgaXMgbm9uIGlucGxhY2UgYW5kIGlucHV0IGJ1ZmZlcnMgZm9yIGltZyBsaWIKKyAgICAvLyBhcmUgb3V0cHV0IGZvciBwcHJvYyBhbmQgdGhpcyBudW1iZXIgb2YgZXh0cmEgYnVmZmVycyBpcyByZXF1aXJlZAorICAgIC8vIElmIHBwcm9jIGlzIG5vdCB0aGVyZSwgaW5wdXQgYnVmZmVycyBmb3IgaW1nbGliIGFyZSBmcm9tIHNuYXBzaG90IHN0cmVhbQorICAgIHVpbnQ4X3QgaW1nbGliX2V4dHJhX2J1ZnMgPSBtUGFyYW1ldGVycy5nZXROdW1PZkV4dHJhQnVmZmVyc0ZvckltYWdlUHJvYygpOworICAgIGlmICh0ZW1wX2ZlYXR1cmVfbWFzayAmJiBpbWdsaWJfZXh0cmFfYnVmcykgeworICAgICAgICAvLyAxIGlzIGFkZGVkIGJlY2F1c2UgZ2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JJbWFnZVByb2MgcmV0dXJucyBleHRyYQorICAgICAgICAvLyBidWZmZXJzIGFzc3VtaW5nIG51bWJlciBvZiBjYXB0dXJlIGlzIGFscmVhZHkgYWRkZWQKKyAgICAgICAgbWluU3RyZWFtQnVmTnVtID0gKHVpbnQ4X3QpKG1pblN0cmVhbUJ1Zk51bSArIGltZ2xpYl9leHRyYV9idWZzICsgMSk7CisgICAgfQorCisgICAgLy9NYXNrIG91dCBmZWF0dXJlcyB0aGF0IGFyZSBhbHJlYWR5IHByb2Nlc3NlZCBpbiBzbmFwc2hvdCBzdHJlYW0uCisgICAgY2FtX2ZlYXR1cmVfbWFza190IHNuYXBzaG90X2ZlYXR1cmVfbWFzayA9IDA7CisgICAgbVBhcmFtZXRlcnMuZ2V0U3RyZWFtUHBNYXNrKENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCwgc25hcHNob3RfZmVhdHVyZV9tYXNrKTsKKworICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgJj0gfnNuYXBzaG90X2ZlYXR1cmVfbWFzazsKKyAgICBMT0dIKCJTbmFwc2hvdCBmZWF0dXJlIG1hc2s6IDB4JWxseCwgcmVwcm9jIGZlYXR1cmUgbWFzazogMHglbGx4IiwKKyAgICAgICAgICAgIHNuYXBzaG90X2ZlYXR1cmVfbWFzaywgcHBfY29uZmlnLmZlYXR1cmVfbWFzayk7CisKKyAgICBib29sIG9mZmxpbmVSZXByb2MgPSBpc1JlZ3VsYXJDYXB0dXJlKCk7CisgICAgaWYgKG1fcG9zdHByb2Nlc3Nvci5tT2ZmbGluZURhdGFCdWZzICE9IE5VTEwpIHsKKyAgICAgICAgb2ZmbGluZVJlcHJvYyA9IFRSVUU7CisgICAgfQorCisgICAgY2FtX3BhZGRpbmdfaW5mb190IHBhZGRpbmdJbmZvID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cGFkZGluZ19pbmZvOworICAgIHBhZGRpbmdJbmZvLm9mZnNldF9pbmZvLm9mZnNldF94ID0gMDsKKyAgICBwYWRkaW5nSW5mby5vZmZzZXRfaW5mby5vZmZzZXRfeSA9IDA7CisgICAgcmMgPSBwQ2hhbm5lbC0+YWRkUmVwcm9jU3RyZWFtc0Zyb21Tb3VyY2UoKnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dENoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluU3RyZWFtQnVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1cnN0X2NudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFkZGluZ0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvbmdzaG90RW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsaW5lUmVwcm9jKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgZGVsZXRlIHBDaGFubmVsOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcENoYW5uZWw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWRkT2ZmbGluZVJlcHJvY0NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogYWRkIGEgb2ZmbGluZSByZXByb2Nlc3MgY2hhbm5lbCBjb250YWlucyBvbmUgcmVwcm9jIHN0cmVhbSwKKyAqICAgICAgICAgICAgICB0aGF0IHdpbGwgZG8gcmVwcm9jZXNzIG9uIGZyYW1lcyBjb21pbmcgZnJvbSBleHRlcm5hbCBpbWFnZXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGltZ19jb25maWcgIDogb2ZmbGluZSByZXBvcmNlc3MgaW1hZ2UgaW5mbworICogICBAcHBfZmVhdHVyZSAgOiBwcCBmZWF0dXJlIGNvbmZpZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFSZXByb2Nlc3NDaGFubmVsICpRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjphZGRPZmZsaW5lUmVwcm9jQ2hhbm5lbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3BwX29mZmxpbmVfc3JjX2NvbmZpZ190ICZpbWdfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcHBfZmVhdHVyZV9jb25maWdfdCAmcHBfZmVhdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NiX3JvdXRpbmUgc3RyZWFtX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgUUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWwgKnBDaGFubmVsID0gTlVMTDsKKworICAgIHBDaGFubmVsID0gbmV3IFFDYW1lcmFSZXByb2Nlc3NDaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzKTsKKyAgICBpZiAoTlVMTCA9PSBwQ2hhbm5lbCkgeworICAgICAgICBMT0dFKCJubyBtZW0gZm9yIHJlcHJvY2VzcyBjaGFubmVsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJjID0gcENoYW5uZWwtPmluaXQoTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoImluaXQgcmVwcm9jZXNzIGNoYW5uZWwgZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgZGVsZXRlIHBDaGFubmVsOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBRQ2FtZXJhSGVhcE1lbW9yeSAqcFN0cmVhbUluZm8gPSBhbGxvY2F0ZVN0cmVhbUluZm9CdWYoQ0FNX1NUUkVBTV9UWVBFX09GRkxJTkVfUFJPQyk7CisgICAgaWYgKHBTdHJlYW1JbmZvID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgibm8gbWVtIGZvciBzdHJlYW0gaW5mbyBidWYiKTsKKyAgICAgICAgZGVsZXRlIHBDaGFubmVsOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjYW1fc3RyZWFtX2luZm9fdCAqc3RyZWFtSW5mb0J1ZiA9IChjYW1fc3RyZWFtX2luZm9fdCAqKXBTdHJlYW1JbmZvLT5nZXRQdHIoMCk7CisgICAgbWVtc2V0KHN0cmVhbUluZm9CdWYsIDAsIHNpemVvZihjYW1fc3RyZWFtX2luZm9fdCkpOworICAgIHN0cmVhbUluZm9CdWYtPnN0cmVhbV90eXBlID0gQ0FNX1NUUkVBTV9UWVBFX09GRkxJTkVfUFJPQzsKKyAgICBzdHJlYW1JbmZvQnVmLT5mbXQgPSBpbWdfY29uZmlnLmlucHV0X2ZtdDsKKyAgICBzdHJlYW1JbmZvQnVmLT5kaW0gPSBpbWdfY29uZmlnLmlucHV0X2RpbTsKKyAgICBzdHJlYW1JbmZvQnVmLT5idWZfcGxhbmVzID0gaW1nX2NvbmZpZy5pbnB1dF9idWZfcGxhbmVzOworICAgIHN0cmVhbUluZm9CdWYtPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0JVUlNUOworICAgIHN0cmVhbUluZm9CdWYtPm51bV9vZl9idXJzdCA9IGltZ19jb25maWcubnVtX29mX2J1ZnM7CisKKyAgICBzdHJlYW1JbmZvQnVmLT5yZXByb2Nlc3NfY29uZmlnLnBwX3R5cGUgPSBDQU1fT0ZGTElORV9SRVBST0NFU1NfVFlQRTsKKyAgICBzdHJlYW1JbmZvQnVmLT5yZXByb2Nlc3NfY29uZmlnLm9mZmxpbmUgPSBpbWdfY29uZmlnOworICAgIHN0cmVhbUluZm9CdWYtPnJlcHJvY2Vzc19jb25maWcucHBfZmVhdHVyZV9jb25maWcgPSBwcF9mZWF0dXJlOworCisgICAgcmMgPSBwQ2hhbm5lbC0+YWRkU3RyZWFtKCp0aGlzLAorICAgICAgICAgICAgcFN0cmVhbUluZm8sIE5VTEwsIGltZ19jb25maWcubnVtX29mX2J1ZnMsCisgICAgICAgICAgICAmZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cGFkZGluZ19pbmZvLAorICAgICAgICAgICAgc3RyZWFtX2NiLCB1c2VyZGF0YSwgZmFsc2UpOworCisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoImFkZCByZXByb2Nlc3Mgc3RyZWFtIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgIGRlbGV0ZSBwQ2hhbm5lbDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHBDaGFubmVsOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFkZENoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogYWRkIGEgY2hhbm5lbCBieSBpdHMgdHlwZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2hfdHlwZSA6IGNoYW5uZWwgdHlwZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6YWRkQ2hhbm5lbChxY2FtZXJhX2NoX3R5cGVfZW51bV90IGNoX3R5cGUpCit7CisgICAgaW50MzJfdCByYyA9IFVOS05PV05fRVJST1I7CisgICAgc3dpdGNoIChjaF90eXBlKSB7CisgICAgY2FzZSBRQ0FNRVJBX0NIX1RZUEVfWlNMOgorICAgICAgICByYyA9IGFkZFpTTENoYW5uZWwoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX0NIX1RZUEVfQ0FQVFVSRToKKyAgICAgICAgcmMgPSBhZGRDYXB0dXJlQ2hhbm5lbCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfQ0hfVFlQRV9QUkVWSUVXOgorICAgICAgICByYyA9IGFkZFByZXZpZXdDaGFubmVsKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9DSF9UWVBFX1ZJREVPOgorICAgICAgICByYyA9IGFkZFZpZGVvQ2hhbm5lbCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfQ0hfVFlQRV9TTkFQU0hPVDoKKyAgICAgICAgcmMgPSBhZGRTbmFwc2hvdENoYW5uZWwoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX0NIX1RZUEVfUkFXOgorICAgICAgICByYyA9IGFkZFJhd0NoYW5uZWwoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX0NIX1RZUEVfTUVUQURBVEE6CisgICAgICAgIHJjID0gYWRkTWV0YURhdGFDaGFubmVsKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9DSF9UWVBFX0NBTExCQUNLOgorICAgICAgICByYyA9IGFkZENhbGxiYWNrQ2hhbm5lbCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfQ0hfVFlQRV9BTkFMWVNJUzoKKyAgICAgICAgcmMgPSBhZGRBbmFseXNpc0NoYW5uZWwoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkZWxDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGRlbGV0ZSBhIGNoYW5uZWwgYnkgaXRzIHR5cGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNoX3R5cGUgOiBjaGFubmVsIHR5cGUKKyAqICAgQGRlc3Ryb3kgOiBkZWxldGUgY29udGV4dCBhcyB3ZWxsCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpkZWxDaGFubmVsKHFjYW1lcmFfY2hfdHlwZV9lbnVtX3QgY2hfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRlc3Ryb3kpCit7CisgICAgaWYgKG1fY2hhbm5lbHNbY2hfdHlwZV0gIT0gTlVMTCkgeworICAgICAgICBpZiAoZGVzdHJveSkgeworICAgICAgICAgICAgZGVsZXRlIG1fY2hhbm5lbHNbY2hfdHlwZV07CisgICAgICAgICAgICBtX2NoYW5uZWxzW2NoX3R5cGVdID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fY2hhbm5lbHNbY2hfdHlwZV0tPmRlbGV0ZUNoYW5uZWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdGFydENoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogc3RhcnQgYSBjaGFubmVsIGJ5IGl0cyB0eXBlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjaF90eXBlIDogY2hhbm5lbCB0eXBlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzdGFydENoYW5uZWwocWNhbWVyYV9jaF90eXBlX2VudW1fdCBjaF90eXBlKQoreworICAgIGludDMyX3QgcmMgPSBVTktOT1dOX0VSUk9SOworICAgIGlmIChtX2NoYW5uZWxzW2NoX3R5cGVdICE9IE5VTEwpIHsKKyAgICAgICAgcmMgPSBtX2NoYW5uZWxzW2NoX3R5cGVdLT5zdGFydCgpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RvcENoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogc3RvcCBhIGNoYW5uZWwgYnkgaXRzIHR5cGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNoX3R5cGUgOiBjaGFubmVsIHR5cGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnN0b3BDaGFubmVsKHFjYW1lcmFfY2hfdHlwZV9lbnVtX3QgY2hfdHlwZSkKK3sKKyAgICBpbnQzMl90IHJjID0gVU5LTk9XTl9FUlJPUjsKKyAgICBpZiAobV9jaGFubmVsc1tjaF90eXBlXSAhPSBOVUxMKSB7CisgICAgICAgIHJjID0gbV9jaGFubmVsc1tjaF90eXBlXS0+c3RvcCgpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcmVwYXJlUHJldmlldworICoKKyAqIERFU0NSSVBUSU9OOiBhZGQgY2hhbm5lbHMgbmVlZGVkIGZvciBwcmV2aWV3CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnByZXBhcmVQcmV2aWV3KCkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIExPR0koIkUiKTsKKyAgICByYyA9IG1QYXJhbWV0ZXJzLnNldFN0cmVhbUNvbmZpZ3VyZShmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgic2V0U3RyZWFtQ29uZmlndXJlIGZhaWxlZCAlZCIsIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmIChtUGFyYW1ldGVycy5pc1pTTE1vZGUoKSAmJiBtUGFyYW1ldGVycy5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKSAhPSB0cnVlKSB7CisgICAgICAgIHJjID0gYWRkQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfWlNMKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJmYWlsZWQhISByYyA9ICVkIiwgcmMpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmlzVUJXQ0VuYWJsZWQoKSkgeworICAgICAgICAgICAgY2FtX2Zvcm1hdF90IGZtdDsKKyAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldFN0cmVhbUZvcm1hdChDQU1fU1RSRUFNX1RZUEVfUFJFVklFVywgZm10KTsKKyAgICAgICAgICAgIGlmIChmbXQgPT0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVUJXQykgeworICAgICAgICAgICAgICAgIHJjID0gYWRkQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfQ0FMTEJBQ0spOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBkZWxDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9aU0wpOworICAgICAgICAgICAgICAgICAgICBMT0dFKCJmYWlsZWQhISByYyA9ICVkIiwgcmMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmdldG9mZmxpbmVSQVcoKSAmJiAhbVBhcmFtZXRlcnMuZ2V0UXVhZHJhQ2ZhKCkpIHsKKyAgICAgICAgICAgIGFkZENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1JBVyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBib29sIHJlY29yZGluZ0hpbnQgPSBtUGFyYW1ldGVycy5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKTsKKyAgICAgICAgaWYoIWlzUmRpTW9kZSgpICYmIHJlY29yZGluZ0hpbnQpIHsKKyAgICAgICAgICAgIC8vc3RvcCBmYWNlIGRldGVjdGlvbixsb25nc2hvdCxldGMgaWYgdHVybmVkIE9OIGluIENhbWVyYSBtb2RlCisjaWZuZGVmIFZBTklMTEFfSEFMCisgICAgICAgICAgICBpbnQzMl90IGFyZzsgLy9kdW1teSBhcmcKKyAgICAgICAgICAgIGlmIChpc0xvbmdzaG90RW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQoQ0FNRVJBX0NNRF9MT05HU0hPVF9PRkYsIGFyZywgYXJnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5pc0ZhY2VEZXRlY3Rpb25FbmFibGVkKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCFtUGFyYW1ldGVycy5mZE1vZGVJblZpZGVvKCkpKSB7CisgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQoQ0FNRVJBX0NNRF9TVE9QX0ZBQ0VfREVURUNUSU9OLCBhcmcsIGFyZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBhcmFtZXRlcnMuaXNIaXN0b2dyYW1FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBzZW5kQ29tbWFuZChDQU1FUkFfQ01EX0hJU1RPR1JBTV9PRkYsIGFyZywgYXJnKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgLy9Eb24ndCBjcmVhdGUgc25hcHNob3QgY2hhbm5lbCBmb3IgbGl2ZXNob3QsIGlmIGxvdyBwb3dlciBtb2RlIGlzIHNldC4KKyAgICAgICAgICAgIC8vVXNlIHZpZGVvIHN0cmVhbSBpbnN0ZWFkLgorICAgICAgICAgICAgaWYgKCFpc0xvd1Bvd2VyTW9kZSgpKSB7CisgICAgICAgICAgICAgICByYyA9IGFkZENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1NOQVBTSE9UKTsKKyAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBhZGRDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9WSURFTyk7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBkZWxDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9TTkFQU0hPVCk7CisgICAgICAgICAgICAgICAgTE9HRSgiZmFpbGVkISEgcmMgPSAlZCIsIHJjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByYyA9IGFkZENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1BSRVZJRVcpOworICAgICAgICBpZiAoIWlzUmRpTW9kZSgpICYmIChyYyAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgICAgIGlmIChyZWNvcmRpbmdIaW50KSB7CisgICAgICAgICAgICAgICAgZGVsQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfU05BUFNIT1QpOworICAgICAgICAgICAgICAgIGRlbENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1ZJREVPKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtUGFyYW1ldGVycy5pc1VCV0NFbmFibGVkKCkgJiYgIXJlY29yZGluZ0hpbnQpIHsKKyAgICAgICAgICAgIGNhbV9mb3JtYXRfdCBmbXQ7CisgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXRTdHJlYW1Gb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcsIGZtdCk7CisgICAgICAgICAgICBpZiAoZm10ID09IENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyX1VCV0MpIHsKKyAgICAgICAgICAgICAgICByYyA9IGFkZENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX0NBTExCQUNLKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfUFJFVklFVyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNSZGlNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1NOQVBTSE9UKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1ZJREVPKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBMT0dFKCJmYWlsZWQhISByYyA9ICVkIiwgcmMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICBkZWxDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9QUkVWSUVXKTsKKyAgICAgICAgICAgIExPR0UoImZhaWxlZCEhIHJjID0gJWQiLCByYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dJKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVucHJlcGFyZVByZXZpZXcKKyAqCisgKiBERVNDUklQVElPTjogZGVsZXRlIGNoYW5uZWxzIGZvciBwcmV2aWV3CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnVucHJlcGFyZVByZXZpZXcoKQoreworICAgIGRlbENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1pTTCk7CisgICAgZGVsQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfUFJFVklFVyk7CisgICAgZGVsQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfVklERU8pOworICAgIGRlbENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1NOQVBTSE9UKTsKKyAgICBkZWxDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9DQUxMQkFDSyk7CisgICAgZGVsQ2hhbm5lbChRQ0FNRVJBX0NIX1RZUEVfUkFXKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwbGF5U2h1dHRlcgorICoKKyAqIERFU0NSSVBUSU9OOiBzZW5kIHJlcXVlc3QgdG8gcGxheSBzaHV0dGVyIHNvdW5kCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnBsYXlTaHV0dGVyKCl7CisgICAgIGlmIChtTm90aWZ5Q2IgPT0gTlVMTCB8fAorICAgICAgICAgbXNnVHlwZUVuYWJsZWRXaXRoTG9jayhDQU1FUkFfTVNHX1NIVVRURVIpID09IDApeworICAgICAgICAgTE9HRCgic2h1dHRlciBtc2cgbm90IGVuYWJsZWQgb3IgTlVMTCBjYiIpOworICAgICAgICAgcmV0dXJuOworICAgICB9CisgICAgIExPR0goIkNBTUVSQV9NU0dfU0hVVFRFUiAiKTsKKyAgICAgcWNhbWVyYV9jYWxsYmFja19hcmdtX3QgY2JBcmc7CisgICAgIG1lbXNldCgmY2JBcmcsIDAsIHNpemVvZihxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCkpOworICAgICBjYkFyZy5jYl90eXBlID0gUUNBTUVSQV9OT1RJRllfQ0FMTEJBQ0s7CisgICAgIGNiQXJnLm1zZ190eXBlID0gQ0FNRVJBX01TR19TSFVUVEVSOworICAgICBjYkFyZy5leHQxID0gMDsKKyAgICAgY2JBcmcuZXh0MiA9IGZhbHNlOworICAgICBtX2NiTm90aWZpZXIubm90aWZ5Q2FsbGJhY2soY2JBcmcpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldENoYW5uZWxCeUhhbmRsZQorICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm4gYSBjaGFubmVsIGJ5IGl0cyBoYW5kbGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNoYW5uZWxIYW5kbGUgOiBjaGFubmVsIGhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiBhIGNoYW5uZWwgb2JqIGlmIGZvdW5kLCBOVUxMIGlmIG5vdCBmb3VuZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhQ2hhbm5lbCAqUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Z2V0Q2hhbm5lbEJ5SGFuZGxlKHVpbnQzMl90IGNoYW5uZWxIYW5kbGUpCit7CisgICAgZm9yKGludCBpID0gMDsgaSA8IFFDQU1FUkFfQ0hfVFlQRV9NQVg7IGkrKykgeworICAgICAgICBpZiAobV9jaGFubmVsc1tpXSAhPSBOVUxMICYmCisgICAgICAgICAgICBtX2NoYW5uZWxzW2ldLT5nZXRNeUhhbmRsZSgpID09IGNoYW5uZWxIYW5kbGUpIHsKKyAgICAgICAgICAgIHJldHVybiBtX2NoYW5uZWxzW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG5lZWRQcmV2aWV3RkRDYWxsYmFjaworICoKKyAqIERFU0NSSVBUSU9OOiBkZWNpZGVzIGlmIG5lZWRQcmV2aWV3RkRDYWxsYmFjaworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbnVtX2ZhY2VzIDogbnVtYmVyIG9mIGZhY2VzCisgKgorICogUkVUVVJOICAgICA6IGJvb2wgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICB0cnVlICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgZmFsZSAtLSBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpuZWVkUHJldmlld0ZEQ2FsbGJhY2sodWludDhfdCBudW1fZmFjZXMpCit7CisgICAgaWYgKG51bV9mYWNlcyA9PSAwICYmIG1OdW1QcmV2aWV3RmFjZXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJvY2Vzc0ZhY2VEZXRlY3Rpb25SZXVzbHQKKyAqCisgKiBERVNDUklQVElPTjogcHJvY2VzcyBmYWNlIGRldGVjdGlvbiByZXVzbHQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZhY2VzX2RhdGEgOiBwdHIgdG8gZmFjZSBwcm9jZXNzaW5nIHJlc3VsdCBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnByb2Nlc3NGYWNlRGV0ZWN0aW9uUmVzdWx0KGNhbV9mYWNlc19kYXRhX3QgKmZhY2VzX2RhdGEpCit7CisgICAgaWYgKCFtUGFyYW1ldGVycy5pc0ZhY2VEZXRlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgTE9HSCgiRmFjZURldGVjdGlvbiBub3QgZW5hYmxlZCwgbm8gb3BzIGhlcmUiKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHFjYW1lcmFfZmFjZV9kZXRlY3RfdHlwZV90IGZkX3R5cGUgPSBmYWNlc19kYXRhLT5kZXRlY3Rpb25fZGF0YS5mZF90eXBlOworICAgIGNhbV9mYWNlX2RldGVjdGlvbl9kYXRhX3QgKmRldGVjdF9kYXRhID0gJihmYWNlc19kYXRhLT5kZXRlY3Rpb25fZGF0YSk7CisgICAgaWYgKChOVUxMID09IG1EYXRhQ2IpIHx8CisgICAgICAgIChmZF90eXBlID09IFFDQU1FUkFfRkRfUFJFVklFVyAmJiAhbXNnVHlwZUVuYWJsZWQoQ0FNRVJBX01TR19QUkVWSUVXX01FVEFEQVRBKSkgfHwKKyAgICAgICAgKCFuZWVkUHJldmlld0ZEQ2FsbGJhY2soZGV0ZWN0X2RhdGEtPm51bV9mYWNlc19kZXRlY3RlZCkpCisjaWZuZGVmIFZBTklMTEFfSEFMCisgICAgICAgIHx8IChmZF90eXBlID09IFFDQU1FUkFfRkRfU05BUFNIT1QgJiYgIW1zZ1R5cGVFbmFibGVkKENBTUVSQV9NU0dfTUVUQV9EQVRBKSkKKyNlbmRpZgorICAgICAgICApIHsKKyAgICAgICAgTE9HSCgibWV0YWRhdGEgbXNndHlwZSBub3QgZW5hYmxlZCwgbm8gb3BzIGhlcmUiKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGlmICgoZmRfdHlwZSA9PSBRQ0FNRVJBX0ZEX1BSRVZJRVcpICYmIChkZXRlY3RfZGF0YS0+dXBkYXRlX2ZsYWcgPT0gRkFMU0UpKSB7CisgICAgICAgIC8vIERvbid0IHNlbmQgY2FsbGJhY2sgdG8gYXBwIGlmIHRoaXMgaXMgc2tpcHBlZCBieSBmZCBhdCBiYWNrZW5kCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBjYW1fZGltZW5zaW9uX3QgZGlzcGxheV9kaW07CisgICAgbVBhcmFtZXRlcnMuZ2V0U3RyZWFtRGltZW5zaW9uKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXLCBkaXNwbGF5X2RpbSk7CisgICAgaWYgKGRpc3BsYXlfZGltLndpZHRoIDw9IDAgfHwgZGlzcGxheV9kaW0uaGVpZ2h0IDw9IDApIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBwcmV2aWV3IHdpZHRoIG9yIGhlaWdodCAoJWQgeCAlZCkiLAorICAgICAgICAgICAgICAgZGlzcGxheV9kaW0ud2lkdGgsIGRpc3BsYXlfZGltLmhlaWdodCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIC8vIHByb2Nlc3MgZmFjZSBkZXRlY3Rpb24gcmVzdWx0CisgICAgLy8gbmVlZCBzZXBhcmF0ZSBmYWNlIGRldGVjdGlvbiBpbiBwcmV2aWV3IG9yIHNuYXBzaG90IHR5cGUKKyAgICBzaXplX3QgZmFjZVJlc3VsdFNpemUgPSAwOworICAgIHNpemVfdCBkYXRhX2xlbiA9IDA7CisgICAgaWYoZmRfdHlwZSA9PSBRQ0FNRVJBX0ZEX1BSRVZJRVcpeworICAgICAgICAvL2ZkIGZvciBwcmV2aWV3IGZyYW1lcworICAgICAgICBmYWNlUmVzdWx0U2l6ZSA9IHNpemVvZihjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCk7CisgICAgICAgIGZhY2VSZXN1bHRTaXplICs9IHNpemVvZihjYW1lcmFfZmFjZV90KSAqIE1BWF9ST0k7CisgICAgfWVsc2UgaWYoZmRfdHlwZSA9PSBRQ0FNRVJBX0ZEX1NOQVBTSE9UKXsKKyNpZm5kZWYgVkFOSUxMQV9IQUwKKyAgICAgICAgLy8gZmQgZm9yIHNuYXBzaG90IGZyYW1lcworICAgICAgICAvL2NoZWNrIGlmIGZhY2UgaXMgZGV0ZWN0ZWQgaW4gdGhpcyBmcmFtZQorICAgICAgICBpZihkZXRlY3RfZGF0YS0+bnVtX2ZhY2VzX2RldGVjdGVkID4gMCl7CisgICAgICAgICAgICBkYXRhX2xlbiA9IHNpemVvZihjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCkgKworICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FtZXJhX2ZhY2VfdCkgKiBkZXRlY3RfZGF0YS0+bnVtX2ZhY2VzX2RldGVjdGVkOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8vbm8gZmFjZQorICAgICAgICAgICAgZGF0YV9sZW4gPSAwOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZmFjZVJlc3VsdFNpemUgPSAxICpzaXplb2YoaW50KSAgICAvL21ldGEgZGF0YSB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICsgMSAqc2l6ZW9mKGludCkgICAgLy8gbWV0YSBkYXRhIGxlbgorICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFfbGVuOyAgICAgICAgIC8vZGF0YQorICAgIH0KKworICAgIGNhbWVyYV9tZW1vcnlfdCAqZmFjZVJlc3VsdEJ1ZmZlciA9IG1HZXRNZW1vcnkoLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlUmVzdWx0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tDb29raWUpOworICAgIGlmICggTlVMTCA9PSBmYWNlUmVzdWx0QnVmZmVyICkgeworICAgICAgICBMT0dFKCJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgZmFjZSByZXN1bHQgZGF0YSIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHVuc2lnbmVkIGNoYXIgKnBGYWNlUmVzdWx0ID0gKCB1bnNpZ25lZCBjaGFyICogKSBmYWNlUmVzdWx0QnVmZmVyLT5kYXRhOworICAgIG1lbXNldChwRmFjZVJlc3VsdCwgMCwgZmFjZVJlc3VsdFNpemUpOworICAgIHVuc2lnbmVkIGNoYXIgKmZhY2VEYXRhID0gTlVMTDsKKyAgICBpZihmZF90eXBlID09IFFDQU1FUkFfRkRfUFJFVklFVyl7CisgICAgICAgIGZhY2VEYXRhID0gcEZhY2VSZXN1bHQ7CisgICAgICAgIG1OdW1QcmV2aWV3RmFjZXMgPSBkZXRlY3RfZGF0YS0+bnVtX2ZhY2VzX2RldGVjdGVkOworICAgIH1lbHNlIGlmKGZkX3R5cGUgPT0gUUNBTUVSQV9GRF9TTkFQU0hPVCl7CisjaWZuZGVmIFZBTklMTEFfSEFMCisgICAgICAgIC8vbmVlZCBmaWxsIG1ldGEgdHlwZSBhbmQgbWV0YSBkYXRhIGxlbiBmaXJzdAorICAgICAgICBpbnQgKmRhdGFfaGVhZGVyID0gKGludCogKXBGYWNlUmVzdWx0OworICAgICAgICBkYXRhX2hlYWRlclswXSA9IENBTUVSQV9NRVRBX0RBVEFfRkQ7CisgICAgICAgIGRhdGFfaGVhZGVyWzFdID0gKGludClkYXRhX2xlbjsKKworICAgICAgICBpZihkYXRhX2xlbiA8PSAwKXsKKyAgICAgICAgICAgIC8vaWYgZmFjZSBpcyBub3QgdmFsaWQgb3IgZG8gbm90IGhhdmUgZmFjZSwgcmV0dXJuCisgICAgICAgICAgICBxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCBjYkFyZzsKKyAgICAgICAgICAgIG1lbXNldCgmY2JBcmcsIDAsIHNpemVvZihxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCkpOworICAgICAgICAgICAgY2JBcmcuY2JfdHlwZSA9IFFDQU1FUkFfREFUQV9DQUxMQkFDSzsKKyAgICAgICAgICAgIGNiQXJnLm1zZ190eXBlID0gQ0FNRVJBX01TR19NRVRBX0RBVEE7CisgICAgICAgICAgICBjYkFyZy5kYXRhID0gZmFjZVJlc3VsdEJ1ZmZlcjsKKyAgICAgICAgICAgIGNiQXJnLnVzZXJfZGF0YSA9IGZhY2VSZXN1bHRCdWZmZXI7CisgICAgICAgICAgICBjYkFyZy5jb29raWUgPSB0aGlzOworICAgICAgICAgICAgY2JBcmcucmVsZWFzZV9jYiA9IHJlbGVhc2VDYW1lcmFNZW1vcnk7CisgICAgICAgICAgICBpbnQzMl90IHJjID0gbV9jYk5vdGlmaWVyLm5vdGlmeUNhbGxiYWNrKGNiQXJnKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR0UoImZhaWwgc2VuZGluZyBub3RpZmljYXRpb24iKTsKKyAgICAgICAgICAgICAgICBmYWNlUmVzdWx0QnVmZmVyLT5yZWxlYXNlKGZhY2VSZXN1bHRCdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZmFjZURhdGEgPSBwRmFjZVJlc3VsdCArIDIgKnNpemVvZihpbnQpOyAvL3NraXAgdHdvIGludCBsZW5ndGgKKyAgICB9CisKKyAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqcm9pRGF0YSA9IChjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqICkgZmFjZURhdGE7CisgICAgY2FtZXJhX2ZhY2VfdCAqZmFjZXMgPSAoY2FtZXJhX2ZhY2VfdCAqKSAoIGZhY2VEYXRhICsgc2l6ZW9mKGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90KSApOworCisgICAgcm9pRGF0YS0+bnVtYmVyX29mX2ZhY2VzID0gZGV0ZWN0X2RhdGEtPm51bV9mYWNlc19kZXRlY3RlZDsKKyAgICByb2lEYXRhLT5mYWNlcyA9IGZhY2VzOworICAgIGlmIChyb2lEYXRhLT5udW1iZXJfb2ZfZmFjZXMgPiAwKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm9pRGF0YS0+bnVtYmVyX29mX2ZhY2VzOyBpKyspIHsKKyAgICAgICAgICAgIGZhY2VzW2ldLmlkID0gZGV0ZWN0X2RhdGEtPmZhY2VzW2ldLmZhY2VfaWQ7CisgICAgICAgICAgICBmYWNlc1tpXS5zY29yZSA9IGRldGVjdF9kYXRhLT5mYWNlc1tpXS5zY29yZTsKKworICAgICAgICAgICAgLy8gbGVmdAorICAgICAgICAgICAgZmFjZXNbaV0ucmVjdFswXSA9IE1BUF9UT19EUklWRVJfQ09PUkRJTkFURSgKKyAgICAgICAgICAgICAgICAgICAgZGV0ZWN0X2RhdGEtPmZhY2VzW2ldLmZhY2VfYm91bmRhcnkubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9kaW0ud2lkdGgsIDIwMDAsIC0xMDAwKTsKKworICAgICAgICAgICAgLy8gdG9wCisgICAgICAgICAgICBmYWNlc1tpXS5yZWN0WzFdID0gTUFQX1RPX0RSSVZFUl9DT09SRElOQVRFKAorICAgICAgICAgICAgICAgICAgICBkZXRlY3RfZGF0YS0+ZmFjZXNbaV0uZmFjZV9ib3VuZGFyeS50b3AsCisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZGltLmhlaWdodCwgMjAwMCwgLTEwMDApOworCisgICAgICAgICAgICAvLyByaWdodAorICAgICAgICAgICAgZmFjZXNbaV0ucmVjdFsyXSA9IGZhY2VzW2ldLnJlY3RbMF0gKworICAgICAgICAgICAgICAgICAgICBNQVBfVE9fRFJJVkVSX0NPT1JESU5BVEUoCisgICAgICAgICAgICAgICAgICAgIGRldGVjdF9kYXRhLT5mYWNlc1tpXS5mYWNlX2JvdW5kYXJ5LndpZHRoLAorICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2RpbS53aWR0aCwgMjAwMCwgMCk7CisKKyAgICAgICAgICAgICAvLyBib3R0b20KKyAgICAgICAgICAgIGZhY2VzW2ldLnJlY3RbM10gPSBmYWNlc1tpXS5yZWN0WzFdICsKKyAgICAgICAgICAgICAgICAgICAgTUFQX1RPX0RSSVZFUl9DT09SRElOQVRFKAorICAgICAgICAgICAgICAgICAgICBkZXRlY3RfZGF0YS0+ZmFjZXNbaV0uZmFjZV9ib3VuZGFyeS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZGltLmhlaWdodCwgMjAwMCwgMCk7CisKKyAgICAgICAgICAgIGlmIChmYWNlc19kYXRhLT5sYW5kbWFya192YWxpZCkgeworICAgICAgICAgICAgICAgIC8vIENlbnRlciBvZiBsZWZ0IGV5ZQorICAgICAgICAgICAgICAgIGlmIChmYWNlc19kYXRhLT5sYW5kbWFya19kYXRhLmZhY2VfbGFuZG1hcmtzW2ldLmlzX2xlZnRfZXllX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIGZhY2VzW2ldLmxlZnRfZXllWzBdID0gTUFQX1RPX0RSSVZFUl9DT09SRElOQVRFKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzX2RhdGEtPmxhbmRtYXJrX2RhdGEuZmFjZV9sYW5kbWFya3NbaV0ubGVmdF9leWVfY2VudGVyLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9kaW0ud2lkdGgsIDIwMDAsIC0xMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgZmFjZXNbaV0ubGVmdF9leWVbMV0gPSBNQVBfVE9fRFJJVkVSX0NPT1JESU5BVEUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNfZGF0YS0+bGFuZG1hcmtfZGF0YS5mYWNlX2xhbmRtYXJrc1tpXS5sZWZ0X2V5ZV9jZW50ZXIueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2RpbS5oZWlnaHQsIDIwMDAsIC0xMDAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmYWNlc1tpXS5sZWZ0X2V5ZVswXSA9IEZBQ0VfSU5WQUxJRF9QT0lOVDsKKyAgICAgICAgICAgICAgICAgICAgZmFjZXNbaV0ubGVmdF9leWVbMV0gPSBGQUNFX0lOVkFMSURfUE9JTlQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ2VudGVyIG9mIHJpZ2h0IGV5ZQorICAgICAgICAgICAgICAgIGlmIChmYWNlc19kYXRhLT5sYW5kbWFya19kYXRhLmZhY2VfbGFuZG1hcmtzW2ldLmlzX3JpZ2h0X2V5ZV92YWxpZCkgeworICAgICAgICAgICAgICAgICAgICBmYWNlc1tpXS5yaWdodF9leWVbMF0gPSBNQVBfVE9fRFJJVkVSX0NPT1JESU5BVEUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNfZGF0YS0+bGFuZG1hcmtfZGF0YS5mYWNlX2xhbmRtYXJrc1tpXS5yaWdodF9leWVfY2VudGVyLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9kaW0ud2lkdGgsIDIwMDAsIC0xMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgZmFjZXNbaV0ucmlnaHRfZXllWzFdID0gTUFQX1RPX0RSSVZFUl9DT09SRElOQVRFKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzX2RhdGEtPmxhbmRtYXJrX2RhdGEuZmFjZV9sYW5kbWFya3NbaV0ucmlnaHRfZXllX2NlbnRlci55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZGltLmhlaWdodCwgMjAwMCwgLTEwMDApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZhY2VzW2ldLnJpZ2h0X2V5ZVswXSA9IEZBQ0VfSU5WQUxJRF9QT0lOVDsKKyAgICAgICAgICAgICAgICAgICAgZmFjZXNbaV0ucmlnaHRfZXllWzFdID0gRkFDRV9JTlZBTElEX1BPSU5UOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENlbnRlciBvZiBtb3V0aAorICAgICAgICAgICAgICAgIGlmIChmYWNlc19kYXRhLT5sYW5kbWFya19kYXRhLmZhY2VfbGFuZG1hcmtzW2ldLmlzX21vdXRoX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIGZhY2VzW2ldLm1vdXRoWzBdID0gTUFQX1RPX0RSSVZFUl9DT09SRElOQVRFKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VzX2RhdGEtPmxhbmRtYXJrX2RhdGEuZmFjZV9sYW5kbWFya3NbaV0ubW91dGhfY2VudGVyLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9kaW0ud2lkdGgsIDIwMDAsIC0xMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgZmFjZXNbaV0ubW91dGhbMV0gPSBNQVBfVE9fRFJJVkVSX0NPT1JESU5BVEUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZXNfZGF0YS0+bGFuZG1hcmtfZGF0YS5mYWNlX2xhbmRtYXJrc1tpXS5tb3V0aF9jZW50ZXIueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2RpbS5oZWlnaHQsIDIwMDAsIC0xMDAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmYWNlc1tpXS5tb3V0aFswXSA9IEZBQ0VfSU5WQUxJRF9QT0lOVDsKKyAgICAgICAgICAgICAgICAgICAgZmFjZXNbaV0ubW91dGhbMV0gPSBGQUNFX0lOVkFMSURfUE9JTlQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gLTIwMDAgaWYgaW52YWxpZAorICAgICAgICAgICAgICAgIGZhY2VzW2ldLmxlZnRfZXllWzBdID0gRkFDRV9JTlZBTElEX1BPSU5UOworICAgICAgICAgICAgICAgIGZhY2VzW2ldLmxlZnRfZXllWzFdID0gRkFDRV9JTlZBTElEX1BPSU5UOworCisgICAgICAgICAgICAgICAgZmFjZXNbaV0ucmlnaHRfZXllWzBdID0gRkFDRV9JTlZBTElEX1BPSU5UOworICAgICAgICAgICAgICAgIGZhY2VzW2ldLnJpZ2h0X2V5ZVsxXSA9IEZBQ0VfSU5WQUxJRF9QT0lOVDsKKworICAgICAgICAgICAgICAgIGZhY2VzW2ldLm1vdXRoWzBdID0gRkFDRV9JTlZBTElEX1BPSU5UOworICAgICAgICAgICAgICAgIGZhY2VzW2ldLm1vdXRoWzFdID0gRkFDRV9JTlZBTElEX1BPSU5UOworICAgICAgICAgICAgfQorCisjaWZuZGVmIFZBTklMTEFfSEFMCisjaWZkZWYgVEFSR0VUX1RTX01BS0VVUAorICAgICAgICAgICAgbUZhY2VSZWN0LmxlZnQgPSBkZXRlY3RfZGF0YS0+ZmFjZXNbaV0uZmFjZV9ib3VuZGFyeS5sZWZ0OworICAgICAgICAgICAgbUZhY2VSZWN0LnRvcCA9IGRldGVjdF9kYXRhLT5mYWNlc1tpXS5mYWNlX2JvdW5kYXJ5LnRvcDsKKyAgICAgICAgICAgIG1GYWNlUmVjdC5yaWdodCA9IGRldGVjdF9kYXRhLT5mYWNlc1tpXS5mYWNlX2JvdW5kYXJ5LndpZHRoK21GYWNlUmVjdC5sZWZ0OworICAgICAgICAgICAgbUZhY2VSZWN0LmJvdHRvbSA9IGRldGVjdF9kYXRhLT5mYWNlc1tpXS5mYWNlX2JvdW5kYXJ5LmhlaWdodCttRmFjZVJlY3QudG9wOworI2VuZGlmCisgICAgICAgICAgICBpZiAoZmFjZXNfZGF0YS0+c21pbGVfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICBmYWNlc1tpXS5zbWlsZV9kZWdyZWUgPSBmYWNlc19kYXRhLT5zbWlsZV9kYXRhLnNtaWxlW2ldLnNtaWxlX2RlZ3JlZTsKKyAgICAgICAgICAgICAgICBmYWNlc1tpXS5zbWlsZV9zY29yZSA9IGZhY2VzX2RhdGEtPnNtaWxlX2RhdGEuc21pbGVbaV0uc21pbGVfY29uZmlkZW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmYWNlc19kYXRhLT5ibGlua192YWxpZCkgeworICAgICAgICAgICAgICAgIGZhY2VzW2ldLmJsaW5rX2RldGVjdGVkID0gZmFjZXNfZGF0YS0+YmxpbmtfZGF0YS5ibGlua1tpXS5ibGlua19kZXRlY3RlZDsKKyAgICAgICAgICAgICAgICBmYWNlc1tpXS5sZXllX2JsaW5rID0gZmFjZXNfZGF0YS0+YmxpbmtfZGF0YS5ibGlua1tpXS5sZWZ0X2JsaW5rOworICAgICAgICAgICAgICAgIGZhY2VzW2ldLnJleWVfYmxpbmsgPSBmYWNlc19kYXRhLT5ibGlua19kYXRhLmJsaW5rW2ldLnJpZ2h0X2JsaW5rOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZhY2VzX2RhdGEtPnJlY29nX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAgZmFjZXNbaV0uZmFjZV9yZWNvZ25pc2VkID0gZmFjZXNfZGF0YS0+cmVjb2dfZGF0YS5mYWNlX3JlY1tpXS5mYWNlX3JlY29nbmlzZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmFjZXNfZGF0YS0+Z2F6ZV92YWxpZCkgeworICAgICAgICAgICAgICAgIGZhY2VzW2ldLmdhemVfYW5nbGUgPSBmYWNlc19kYXRhLT5nYXplX2RhdGEuZ2F6ZVtpXS5nYXplX2FuZ2xlOworICAgICAgICAgICAgICAgIGZhY2VzW2ldLnVwZG93bl9kaXIgPSBmYWNlc19kYXRhLT5nYXplX2RhdGEuZ2F6ZVtpXS51cGRvd25fZGlyOworICAgICAgICAgICAgICAgIGZhY2VzW2ldLmxlZnRyaWdodF9kaXIgPSBmYWNlc19kYXRhLT5nYXplX2RhdGEuZ2F6ZVtpXS5sZWZ0cmlnaHRfZGlyOworICAgICAgICAgICAgICAgIGZhY2VzW2ldLnJvbGxfZGlyID0gZmFjZXNfZGF0YS0+Z2F6ZV9kYXRhLmdhemVbaV0ucm9sbF9kaXI7CisgICAgICAgICAgICAgICAgZmFjZXNbaV0ubGVmdF9yaWdodF9nYXplID0gZmFjZXNfZGF0YS0+Z2F6ZV9kYXRhLmdhemVbaV0ubGVmdF9yaWdodF9nYXplOworICAgICAgICAgICAgICAgIGZhY2VzW2ldLnRvcF9ib3R0b21fZ2F6ZSA9IGZhY2VzX2RhdGEtPmdhemVfZGF0YS5nYXplW2ldLnRvcF9ib3R0b21fZ2F6ZTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZXsKKyNpZmRlZiBUQVJHRVRfVFNfTUFLRVVQCisgICAgICAgIG1lbXNldCgmbUZhY2VSZWN0LC0xLHNpemVvZihtRmFjZVJlY3QpKTsKKyNlbmRpZgorICAgIH0KKyAgICBxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCBjYkFyZzsKKyAgICBtZW1zZXQoJmNiQXJnLCAwLCBzaXplb2YocWNhbWVyYV9jYWxsYmFja19hcmdtX3QpKTsKKyAgICBjYkFyZy5jYl90eXBlID0gUUNBTUVSQV9EQVRBX0NBTExCQUNLOworICAgIGlmKGZkX3R5cGUgPT0gUUNBTUVSQV9GRF9QUkVWSUVXKXsKKyAgICAgICAgY2JBcmcubXNnX3R5cGUgPSBDQU1FUkFfTVNHX1BSRVZJRVdfTUVUQURBVEE7CisgICAgfQorI2lmbmRlZiBWQU5JTExBX0hBTAorICAgIGVsc2UgaWYoZmRfdHlwZSA9PSBRQ0FNRVJBX0ZEX1NOQVBTSE9UKXsKKyAgICAgICAgY2JBcmcubXNnX3R5cGUgPSBDQU1FUkFfTVNHX01FVEFfREFUQTsKKyAgICB9CisjZW5kaWYKKyAgICBjYkFyZy5kYXRhID0gZmFjZVJlc3VsdEJ1ZmZlcjsKKyAgICBjYkFyZy5tZXRhZGF0YSA9IHJvaURhdGE7CisgICAgY2JBcmcudXNlcl9kYXRhID0gZmFjZVJlc3VsdEJ1ZmZlcjsKKyAgICBjYkFyZy5jb29raWUgPSB0aGlzOworICAgIGNiQXJnLnJlbGVhc2VfY2IgPSByZWxlYXNlQ2FtZXJhTWVtb3J5OworICAgIGludDMyX3QgcmMgPSBtX2NiTm90aWZpZXIubm90aWZ5Q2FsbGJhY2soY2JBcmcpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJmYWlsIHNlbmRpbmcgbm90aWZpY2F0aW9uIik7CisgICAgICAgIGZhY2VSZXN1bHRCdWZmZXItPnJlbGVhc2UoZmFjZVJlc3VsdEJ1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbGVhc2VDYW1lcmFNZW1vcnkKKyAqCisgKiBERVNDUklQVElPTjogcmVsZWFzZXMgY2FtZXJhIG1lbW9yeSBvYmplY3RzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkYXRhICAgIDogYnVmZmVyIHRvIGJlIHJlbGVhc2VkCisgKiAgIEBjb29raWUgIDogY29udGV4dCBkYXRhCisgKiAgIEBjYlN0YXR1czogY2FsbGJhY2sgc3RhdHVzCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpyZWxlYXNlQ2FtZXJhTWVtb3J5KHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqLypjb29raWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qY2JTdGF0dXMqLykKK3sKKyAgICBjYW1lcmFfbWVtb3J5X3QgKm1lbSA9ICggY2FtZXJhX21lbW9yeV90ICogKSBkYXRhOworICAgIGlmICggTlVMTCAhPSBtZW0gKSB7CisgICAgICAgIG1lbS0+cmVsZWFzZShtZW0pOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZXR1cm5TdHJlYW1CdWZmZXIKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJucyBiYWNrIGEgc3RyZWFtIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGF0YSAgICA6IGJ1ZmZlciB0byBiZSByZWxlYXNlZAorICogICBAY29va2llICA6IGNvbnRleHQgZGF0YQorICogICBAY2JTdGF0dXM6IGNhbGxiYWNrIHN0YXR1cworICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cmV0dXJuU3RyZWFtQnVmZmVyKHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qY2JTdGF0dXMqLykKK3sKKyAgICBRQ2FtZXJhU3RyZWFtICpzdHJlYW0gPSAoIFFDYW1lcmFTdHJlYW0gKiApIGNvb2tpZTsKKyAgICBpbnQgaWR4ID0gKigoaW50ICopZGF0YSk7CisgICAgaWYgKChOVUxMICE9IHN0cmVhbSkgJiYgKDAgPD0gaWR4KSkgeworICAgICAgICBzdHJlYW0tPmJ1ZkRvbmUoKHVpbnQzMl90KWlkeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IHJldHVybiBidWZmZXIgJWQgJXAiLCBpZHgsIGNvb2tpZSk7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2Nlc3NIaXN0b2dyYW1TdGF0cworICoKKyAqIERFU0NSSVBUSU9OOiBwcm9jZXNzIGhpc3RvZ3JhbSBzdGF0cworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaGlzdF9kYXRhIDogcHRyIHRvIGhpc3RvZ3JhbSBzdGF0cyBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnByb2Nlc3NIaXN0b2dyYW1TdGF0cygKKyAgICAgICAgX191bnVzZWQgY2FtX2hpc3Rfc3RhdHNfdCAmc3RhdHNfZGF0YSkKK3sKKyNpZm5kZWYgVkFOSUxMQV9IQUwKKyAgICBpZiAoIW1QYXJhbWV0ZXJzLmlzSGlzdG9ncmFtRW5hYmxlZCgpKSB7CisgICAgICAgIExPR0goIkhpc3RvZ3JhbSBub3QgZW5hYmxlZCwgbm8gb3BzIGhlcmUiKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGNhbWVyYV9tZW1vcnlfdCAqaGlzdEJ1ZmZlciA9IG1HZXRNZW1vcnkoLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FtX2hpc3RvZ3JhbV9kYXRhX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0Nvb2tpZSk7CisgICAgaWYgKCBOVUxMID09IGhpc3RCdWZmZXIgKSB7CisgICAgICAgIExPR0UoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBoaXN0b2dyYW0gZGF0YSIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGNhbV9oaXN0b2dyYW1fZGF0YV90ICpwSGlzdERhdGEgPSAoY2FtX2hpc3RvZ3JhbV9kYXRhX3QgKiloaXN0QnVmZmVyLT5kYXRhOworICAgIGlmIChwSGlzdERhdGEgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJtZW1vcnkgZGF0YSBwdHIgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHN0YXRzX2RhdGEudHlwZSkgeworICAgIGNhc2UgQ0FNX0hJU1RPR1JBTV9UWVBFX0JBWUVSOgorICAgICAgICBzd2l0Y2ggKHN0YXRzX2RhdGEuYmF5ZXJfc3RhdHMuZGF0YV90eXBlKSB7CisgICAgICAgICAgICBjYXNlIENBTV9TVEFUU19DSEFOTkVMX1k6CisgICAgICAgICAgICBjYXNlIENBTV9TVEFUU19DSEFOTkVMX1I6CisgICAgICAgICAgICAgICAgKnBIaXN0RGF0YSA9IHN0YXRzX2RhdGEuYmF5ZXJfc3RhdHMucl9zdGF0czsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FNX1NUQVRTX0NIQU5ORUxfR1I6CisgICAgICAgICAgICAgICAgKnBIaXN0RGF0YSA9IHN0YXRzX2RhdGEuYmF5ZXJfc3RhdHMuZ3Jfc3RhdHM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTV9TVEFUU19DSEFOTkVMX0dCOgorICAgICAgICAgICAgY2FzZSBDQU1fU1RBVFNfQ0hBTk5FTF9BTEw6CisgICAgICAgICAgICAgICAgKnBIaXN0RGF0YSA9IHN0YXRzX2RhdGEuYmF5ZXJfc3RhdHMuZ2Jfc3RhdHM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTV9TVEFUU19DSEFOTkVMX0I6CisgICAgICAgICAgICAgICAgKnBIaXN0RGF0YSA9IHN0YXRzX2RhdGEuYmF5ZXJfc3RhdHMuYl9zdGF0czsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgKnBIaXN0RGF0YSA9IHN0YXRzX2RhdGEuYmF5ZXJfc3RhdHMucl9zdGF0czsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9ISVNUT0dSQU1fVFlQRV9ZVVY6CisgICAgICAgICpwSGlzdERhdGEgPSBzdGF0c19kYXRhLnl1dl9zdGF0czsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcWNhbWVyYV9jYWxsYmFja19hcmdtX3QgY2JBcmc7CisgICAgbWVtc2V0KCZjYkFyZywgMCwgc2l6ZW9mKHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90KSk7CisgICAgY2JBcmcuY2JfdHlwZSA9IFFDQU1FUkFfREFUQV9DQUxMQkFDSzsKKyAgICBjYkFyZy5tc2dfdHlwZSA9IENBTUVSQV9NU0dfU1RBVFNfREFUQTsKKyAgICBjYkFyZy5kYXRhID0gaGlzdEJ1ZmZlcjsKKyAgICBjYkFyZy51c2VyX2RhdGEgPSBoaXN0QnVmZmVyOworICAgIGNiQXJnLmNvb2tpZSA9IHRoaXM7CisgICAgY2JBcmcucmVsZWFzZV9jYiA9IHJlbGVhc2VDYW1lcmFNZW1vcnk7CisgICAgaW50MzJfdCByYyA9IG1fY2JOb3RpZmllci5ub3RpZnlDYWxsYmFjayhjYkFyZyk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoImZhaWwgc2VuZGluZyBub3RpZmljYXRpb24iKTsKKyAgICAgICAgaGlzdEJ1ZmZlci0+cmVsZWFzZShoaXN0QnVmZmVyKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2FsY1RoZXJtYWxMZXZlbAorICoKKyAqIERFU0NSSVBUSU9OOiBDYWxjdWxhdGVzIHRoZSB0YXJnZXQgZnBzIHJhbmdlIGRlcGVuZGluZyBvbgorICogICAgICAgICAgICAgIHRoZSB0aGVybWFsIGxldmVsLgorICogICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZnJvbSBRQ2FtZXJhUGFyYW1ldGVyc0ludGYKKyAqICAgICAgICAgICAgICB3aGlsZSBtdXRleCBpcyBoZWxkLiBTbyBpdCBzaG91bGQgbm90IGNhbGwgYmFjayBpbnRvCisgKiAgICAgICAgICAgICAgUUNhbWVyYVBhcmFtZXRlcnNJbnRmIGNhdXNpbmcgZGVhZGxvY2suCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBsZXZlbCAgICAgIDogcmVjZWl2ZWQgdGhlcm1hbCBsZXZlbAorICogICBAbWluRlBTICAgICA6IG1pbmltdW0gY29uZmlndXJlZCBmcHMgcmFuZ2UKKyAqICAgQG1heEZQUyAgICAgOiBtYXhpbXVtIGNvbmZpZ3VyZWQgZnBzIHJhbmdlCisgKiAgIEBtaW5WaWRlb0ZwczogbWluaW11bSBjb25maWd1cmVkIGZwcyByYW5nZQorICogICBAbWF4VmlkZW9GcHM6IG1heGltdW0gY29uZmlndXJlZCBmcHMgcmFuZ2UKKyAqICAgQGFkanVzdGVkUmFuZ2UgOiB0YXJnZXQgZnBzIHJhbmdlCisgKiAgIEBza2lwUGF0dGVybiA6IHRhcmdldCBza2lwIHBhdHRlcm4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Y2FsY1RoZXJtYWxMZXZlbCgKKyAgICAgICAgICAgIHFjYW1lcmFfdGhlcm1hbF9sZXZlbF9lbnVtX3QgbGV2ZWwsCisgICAgICAgICAgICBjb25zdCBpbnQgbWluRlBTaSwKKyAgICAgICAgICAgIGNvbnN0IGludCBtYXhGUFNpLAorICAgICAgICAgICAgY29uc3QgZmxvYXQgJm1pblZpZGVvRnBzLAorICAgICAgICAgICAgY29uc3QgZmxvYXQgJm1heFZpZGVvRnBzLAorICAgICAgICAgICAgY2FtX2Zwc19yYW5nZV90ICZhZGp1c3RlZFJhbmdlLAorICAgICAgICAgICAgZW51bSBtc21fdmZlX2ZyYW1lX3NraXBfcGF0dGVybiAmc2tpcFBhdHRlcm4pCit7CisgICAgY29uc3QgZmxvYXQgbWluRlBTID0gKGZsb2F0KW1pbkZQU2k7CisgICAgY29uc3QgZmxvYXQgbWF4RlBTID0gKGZsb2F0KW1heEZQU2k7CisKKyAgICBMT0dIKCJsZXZlbDogJWQsIHByZXZpZXcgbWluZnBzICVmLCBwcmV2aWV3IG1heGZwUyAlZiwgIgorICAgICAgICAgICAgICAidmlkZW8gbWluZnBzICVmLCB2aWRlbyBtYXhmcFMgJWYiLAorICAgICAgICAgICAgIGxldmVsLCBtaW5GUFMsIG1heEZQUywgbWluVmlkZW9GcHMsIG1heFZpZGVvRnBzKTsKKworICAgIHN3aXRjaChsZXZlbCkgeworICAgIGNhc2UgUUNBTUVSQV9USEVSTUFMX05PX0FESlVTVE1FTlQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGFkanVzdGVkUmFuZ2UubWluX2ZwcyA9IG1pbkZQUyAvIDEwMDAuMGY7CisgICAgICAgICAgICBhZGp1c3RlZFJhbmdlLm1heF9mcHMgPSBtYXhGUFMgLyAxMDAwLjBmOworICAgICAgICAgICAgYWRqdXN0ZWRSYW5nZS52aWRlb19taW5fZnBzID0gbWluVmlkZW9GcHMgLyAxMDAwLjBmOworICAgICAgICAgICAgYWRqdXN0ZWRSYW5nZS52aWRlb19tYXhfZnBzID0gbWF4VmlkZW9GcHMgLyAxMDAwLjBmOworICAgICAgICAgICAgc2tpcFBhdHRlcm4gPSBOT19TS0lQOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9USEVSTUFMX1NMSUdIVF9BREpVU1RNRU5UOgorICAgICAgICB7CisgICAgICAgICAgICBhZGp1c3RlZFJhbmdlLm1pbl9mcHMgPSBtaW5GUFMgLyAxMDAwLjBmOworICAgICAgICAgICAgYWRqdXN0ZWRSYW5nZS5tYXhfZnBzID0gbWF4RlBTIC8gMTAwMC4wZjsKKyAgICAgICAgICAgIGFkanVzdGVkUmFuZ2UubWluX2ZwcyAtPSAwLjFmICogYWRqdXN0ZWRSYW5nZS5taW5fZnBzOworICAgICAgICAgICAgYWRqdXN0ZWRSYW5nZS5tYXhfZnBzIC09IDAuMWYgKiBhZGp1c3RlZFJhbmdlLm1heF9mcHM7CisgICAgICAgICAgICBhZGp1c3RlZFJhbmdlLnZpZGVvX21pbl9mcHMgPSBtaW5WaWRlb0ZwcyAvIDEwMDAuMGY7CisgICAgICAgICAgICBhZGp1c3RlZFJhbmdlLnZpZGVvX21heF9mcHMgPSBtYXhWaWRlb0ZwcyAvIDEwMDAuMGY7CisgICAgICAgICAgICBhZGp1c3RlZFJhbmdlLnZpZGVvX21pbl9mcHMgLT0gMC4xZiAqIGFkanVzdGVkUmFuZ2UudmlkZW9fbWluX2ZwczsKKyAgICAgICAgICAgIGFkanVzdGVkUmFuZ2UudmlkZW9fbWF4X2ZwcyAtPSAwLjFmICogYWRqdXN0ZWRSYW5nZS52aWRlb19tYXhfZnBzOworICAgICAgICAgICAgaWYgKCBhZGp1c3RlZFJhbmdlLm1pbl9mcHMgPCAxICkgeworICAgICAgICAgICAgICAgIGFkanVzdGVkUmFuZ2UubWluX2ZwcyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGFkanVzdGVkUmFuZ2UubWF4X2ZwcyA8IDEgKSB7CisgICAgICAgICAgICAgICAgYWRqdXN0ZWRSYW5nZS5tYXhfZnBzID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggYWRqdXN0ZWRSYW5nZS52aWRlb19taW5fZnBzIDwgMSApIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RlZFJhbmdlLnZpZGVvX21pbl9mcHMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBhZGp1c3RlZFJhbmdlLnZpZGVvX21heF9mcHMgPCAxICkgeworICAgICAgICAgICAgICAgIGFkanVzdGVkUmFuZ2UudmlkZW9fbWF4X2ZwcyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBza2lwUGF0dGVybiA9IEVWRVJZXzJGUkFNRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfVEhFUk1BTF9CSUdfQURKVVNUTUVOVDoKKyAgICAgICAgeworICAgICAgICAgICAgYWRqdXN0ZWRSYW5nZS5taW5fZnBzID0gbWluRlBTIC8gMTAwMC4wZjsKKyAgICAgICAgICAgIGFkanVzdGVkUmFuZ2UubWF4X2ZwcyA9IG1heEZQUyAvIDEwMDAuMGY7CisgICAgICAgICAgICBhZGp1c3RlZFJhbmdlLm1pbl9mcHMgLT0gMC4yZiAqIGFkanVzdGVkUmFuZ2UubWluX2ZwczsKKyAgICAgICAgICAgIGFkanVzdGVkUmFuZ2UubWF4X2ZwcyAtPSAwLjJmICogYWRqdXN0ZWRSYW5nZS5tYXhfZnBzOworICAgICAgICAgICAgYWRqdXN0ZWRSYW5nZS52aWRlb19taW5fZnBzID0gbWluVmlkZW9GcHMgLyAxMDAwLjBmOworICAgICAgICAgICAgYWRqdXN0ZWRSYW5nZS52aWRlb19tYXhfZnBzID0gbWF4VmlkZW9GcHMgLyAxMDAwLjBmOworICAgICAgICAgICAgYWRqdXN0ZWRSYW5nZS52aWRlb19taW5fZnBzIC09IDAuMmYgKiBhZGp1c3RlZFJhbmdlLnZpZGVvX21pbl9mcHM7CisgICAgICAgICAgICBhZGp1c3RlZFJhbmdlLnZpZGVvX21heF9mcHMgLT0gMC4yZiAqIGFkanVzdGVkUmFuZ2UudmlkZW9fbWF4X2ZwczsKKyAgICAgICAgICAgIGlmICggYWRqdXN0ZWRSYW5nZS5taW5fZnBzIDwgMSApIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RlZFJhbmdlLm1pbl9mcHMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBhZGp1c3RlZFJhbmdlLm1heF9mcHMgPCAxICkgeworICAgICAgICAgICAgICAgIGFkanVzdGVkUmFuZ2UubWF4X2ZwcyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGFkanVzdGVkUmFuZ2UudmlkZW9fbWluX2ZwcyA8IDEgKSB7CisgICAgICAgICAgICAgICAgYWRqdXN0ZWRSYW5nZS52aWRlb19taW5fZnBzID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggYWRqdXN0ZWRSYW5nZS52aWRlb19tYXhfZnBzIDwgMSApIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RlZFJhbmdlLnZpZGVvX21heF9mcHMgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2tpcFBhdHRlcm4gPSBFVkVSWV80RlJBTUU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1RIRVJNQUxfTUFYX0FESlVTVE1FTlQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFN0b3AgUHJldmlldz8KKyAgICAgICAgICAgIC8vIFNldCBsb3dlc3QgbWluIEZQUyBmb3Igbm93CisgICAgICAgICAgICBhZGp1c3RlZFJhbmdlLm1pbl9mcHMgPSBtaW5GUFMvMTAwMC4wZjsKKyAgICAgICAgICAgIGFkanVzdGVkUmFuZ2UubWF4X2ZwcyA9IG1pbkZQUy8xMDAwLjBmOworICAgICAgICAgICAgY2FtX2NhcGFiaWxpdHlfdCAqY2FwYWJpbGl0eSA9IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF07CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgIGkgPCBjYXBhYmlsaXR5LT5mcHNfcmFuZ2VzX3RibF9jbnQ7CisgICAgICAgICAgICAgICAgICAgICBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eS0+ZnBzX3Jhbmdlc190YmxbaV0ubWluX2ZwcyA8CisgICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZFJhbmdlLm1pbl9mcHMpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRSYW5nZS5taW5fZnBzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5LT5mcHNfcmFuZ2VzX3RibFtpXS5taW5fZnBzOworICAgICAgICAgICAgICAgICAgICBhZGp1c3RlZFJhbmdlLm1heF9mcHMgPSBhZGp1c3RlZFJhbmdlLm1pbl9mcHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2tpcFBhdHRlcm4gPSBNQVhfU0tJUDsKKyAgICAgICAgICAgIGFkanVzdGVkUmFuZ2UudmlkZW9fbWluX2ZwcyA9IGFkanVzdGVkUmFuZ2UubWluX2ZwczsKKyAgICAgICAgICAgIGFkanVzdGVkUmFuZ2UudmlkZW9fbWF4X2ZwcyA9IGFkanVzdGVkUmFuZ2UubWF4X2ZwczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfVEhFUk1BTF9TSFVURE9XTjoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2VuZCBlcnJvciBub3RpZnkKKyAgICAgICAgICAgIExPR0UoIlJlY2VpdmVkIHNodXRkb3duIHRoZXJtYWwgbGV2ZWwuIENsb3NpbmcgY2FtZXJhIik7CisgICAgICAgICAgICBzZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsIENBTUVSQV9FUlJPUl9TRVJWRVJfRElFRCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgTE9HVygiSW52YWxpZCB0aGVybWFsIGxldmVsICVkIiwgbGV2ZWwpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVjYWxjRlBTUmFuZ2UKKyAqCisgKiBERVNDUklQVElPTjogYWRqdXN0IHRoZSBjb25maWd1cmVkIGZwcyByYW5nZSByZWdhcmRpbmcKKyAqICAgICAgICAgICAgICB0aGUgbGFzdCB0aGVybWFsIGxldmVsLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbWluRlBTICAgICAgOiBtaW5pbXVtIGNvbmZpZ3VyZWQgZnBzIHJhbmdlCisgKiAgIEBtYXhGUFMgICAgICA6IG1heGltdW0gY29uZmlndXJlZCBmcHMgcmFuZ2UKKyAqICAgQG1pblZpZGVvRlBTIDogbWluaW11bSBjb25maWd1cmVkIHZpZGVvIGZwcworICogICBAbWF4VmlkZW9GUFMgOiBtYXhpbXVtIGNvbmZpZ3VyZWQgdmlkZW8gZnBzCisgKiAgIEBhZGp1c3RlZFJhbmdlIDogdGFyZ2V0IGZwcyByYW5nZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpyZWNhbGNGUFNSYW5nZShpbnQgJm1pbkZQUywgaW50ICZtYXhGUFMsCisgICAgICAgIGNvbnN0IGZsb2F0ICZtaW5WaWRlb0ZQUywgY29uc3QgZmxvYXQgJm1heFZpZGVvRlBTLAorICAgICAgICBjYW1fZnBzX3JhbmdlX3QgJmFkanVzdGVkUmFuZ2UpCit7CisgICAgZW51bSBtc21fdmZlX2ZyYW1lX3NraXBfcGF0dGVybiBza2lwUGF0dGVybjsKKyAgICBjYWxjVGhlcm1hbExldmVsKG1UaGVybWFsTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICBtaW5GUFMsCisgICAgICAgICAgICAgICAgICAgICBtYXhGUFMsCisgICAgICAgICAgICAgICAgICAgICBtaW5WaWRlb0ZQUywKKyAgICAgICAgICAgICAgICAgICAgIG1heFZpZGVvRlBTLAorICAgICAgICAgICAgICAgICAgICAgYWRqdXN0ZWRSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgIHNraXBQYXR0ZXJuKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdXBkYXRlVGhlcm1hbExldmVsCisgKgorICogREVTQ1JJUFRJT046IHVwZGF0ZSB0aGVybWFsIGxldmVsIGRlcGVuZGluZyBvbiB0aGVybWFsIGV2ZW50cworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbGV2ZWwgICA6IHRoZXJtYWwgbGV2ZWwKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6dXBkYXRlVGhlcm1hbExldmVsKHZvaWQgKnRoZXJtYWxfbGV2ZWwpCit7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIGNhbV9mcHNfcmFuZ2VfdCBhZGp1c3RlZFJhbmdlOworICAgIGludCBtaW5GUFMsIG1heEZQUzsKKyAgICBmbG9hdCBtaW5WaWRlb0ZQUywgbWF4VmlkZW9GUFM7CisgICAgZW51bSBtc21fdmZlX2ZyYW1lX3NraXBfcGF0dGVybiBza2lwUGF0dGVybjsKKyAgICBxY2FtZXJhX3RoZXJtYWxfbGV2ZWxfZW51bV90IGxldmVsID0gKihxY2FtZXJhX3RoZXJtYWxfbGV2ZWxfZW51bV90ICopdGhlcm1hbF9sZXZlbDsKKworCisgICAgaWYgKCFtQ2FtZXJhT3BlbmVkKSB7CisgICAgICAgIExPR0goIkNhbWVyYSBpcyBub3Qgb3BlbmVkLCBubyBuZWVkIHRvIHVwZGF0ZSBjYW1lcmEgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGlmIChtUGFyYW1ldGVycy5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKSkgeworICAgICAgICBMT0dIKCJUaGVybWFsIG1pdGlnYXRpb24gaXNuJ3QgZW5hYmxlZCBpbiBjYW1jb3JkZXIgbW9kZSIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgbVBhcmFtZXRlcnMuZ2V0UHJldmlld0Zwc1JhbmdlKCZtaW5GUFMsICZtYXhGUFMpOworICAgIHFjYW1lcmFfdGhlcm1hbF9tb2RlIHRoZXJtYWxNb2RlID0gbVBhcmFtZXRlcnMuZ2V0VGhlcm1hbE1vZGUoKTsKKyAgICBpZiAobVBhcmFtZXRlcnMuaXNIZnJNb2RlKCkpIHsKKyAgICAgICAgY2FtX2Zwc19yYW5nZV90IGhmckZwc1JhbmdlOworICAgICAgICBtUGFyYW1ldGVycy5nZXRIZnJGcHMoaGZyRnBzUmFuZ2UpOworICAgICAgICBtaW5WaWRlb0ZQUyA9IGhmckZwc1JhbmdlLnZpZGVvX21pbl9mcHM7CisgICAgICAgIG1heFZpZGVvRlBTID0gaGZyRnBzUmFuZ2UudmlkZW9fbWF4X2ZwczsKKyAgICB9IGVsc2UgeworICAgICAgICBtaW5WaWRlb0ZQUyA9IG1pbkZQUzsKKyAgICAgICAgbWF4VmlkZW9GUFMgPSBtYXhGUFM7CisgICAgfQorCisgICAgY2FsY1RoZXJtYWxMZXZlbChsZXZlbCwgbWluRlBTLCBtYXhGUFMsIG1pblZpZGVvRlBTLCBtYXhWaWRlb0ZQUywKKyAgICAgICAgICAgIGFkanVzdGVkUmFuZ2UsIHNraXBQYXR0ZXJuKTsKKyAgICBtVGhlcm1hbExldmVsID0gbGV2ZWw7CisKKyAgICBpZiAodGhlcm1hbE1vZGUgPT0gUUNBTUVSQV9USEVSTUFMX0FESlVTVF9GUFMpCisgICAgICAgIHJldCA9IG1QYXJhbWV0ZXJzLmFkanVzdFByZXZpZXdGcHNSYW5nZSgmYWRqdXN0ZWRSYW5nZSk7CisgICAgZWxzZSBpZiAodGhlcm1hbE1vZGUgPT0gUUNBTUVSQV9USEVSTUFMX0FESlVTVF9GUkFNRVNLSVApCisgICAgICAgIHJldCA9IG1QYXJhbWV0ZXJzLnNldEZyYW1lU2tpcChza2lwUGF0dGVybik7CisgICAgZWxzZQorICAgICAgICBMT0dXKCJJbmNvcnJlY3QgdGhlcm1hbCBtb2RlICVkIiwgdGhlcm1hbE1vZGUpOworCisgICAgcmV0dXJuIHJldDsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVwZGF0ZVBhcmFtZXRlcnMKKyAqCisgKiBERVNDUklQVElPTjogdXBkYXRlIHBhcmFtZXRlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcm1zICAgICAgIDogaW5wdXQgcGFyYW1ldGVycyBzdHJpbmcKKyAqICAgQG5lZWRSZXN0YXJ0IDogb3V0cHV0LCBmbGFnIHRvIGluZGljYXRlIGlmIHByZXZpZXcgcmVzdGFydCBpcyBuZWVkZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6dXBkYXRlUGFyYW1ldGVycyhjb25zdCBjaGFyICpwYXJtcywgYm9vbCAmbmVlZFJlc3RhcnQpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisKKyAgICBTdHJpbmc4IHN0ciA9IFN0cmluZzgocGFybXMpOworICAgIHJjID0gIG1QYXJhbWV0ZXJzLnVwZGF0ZVBhcmFtZXRlcnMoc3RyLCBuZWVkUmVzdGFydCk7CisgICAgc2V0TmVlZFJlc3RhcnQobmVlZFJlc3RhcnQpOworCisgICAgLy8gdXBkYXRlIHN0cmVhbSBiYXNlZCBwYXJhbWV0ZXIgc2V0dGluZ3MKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFFDQU1FUkFfQ0hfVFlQRV9NQVg7IGkrKykgeworICAgICAgICBpZiAobV9jaGFubmVsc1tpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtX2NoYW5uZWxzW2ldLT5VcGRhdGVTdHJlYW1CYXNlZFBhcmFtZXRlcnMobVBhcmFtZXRlcnMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbW1pdFBhcmFtZXRlckNoYW5nZXMKKyAqCisgKiBERVNDUklQVElPTjogY29tbWl0IHBhcmFtZXRlciBjaGFuZ2VzIHRvIHRoZSBiYWNrZW5kIHRvIHRha2UgZWZmZWN0CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICogTk9URSAgICAgICA6IFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdXBkYXRlUGFyYW1ldGVycy4KKyAqICAgICAgICAgICAgICBPdGhlcndpc2UsIG5vIGNoYW5nZSB3aWxsIGJlIHBhc3NlZCB0byBiYWNrZW5kIHRvIHRha2UgZWZmZWN0LgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Y29tbWl0UGFyYW1ldGVyQ2hhbmdlcygpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgcmMgPSBtUGFyYW1ldGVycy5jb21taXRQYXJhbWV0ZXJzKCk7CisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIHVwZGF0ZSBudW1iZXIgb2Ygc25hcHNob3QgYmFzZWQgb24gY29tbWl0dGVkIHBhcmFtZXRlcnMgc2V0dGluZworICAgICAgICByYyA9IG1QYXJhbWV0ZXJzLnNldE51bU9mU25hcHNob3QoKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG5lZWREZWJ1Z0ZwcworICoKKyAqIERFU0NSSVBUSU9OOiBpZiBmcHMgbG9nIGluZm8gbmVlZCB0byBiZSBwcmludGVkIG91dAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IHRydWU6IG5lZWQgcHJpbnQgb3V0IGZwcyBsb2cKKyAqICAgICAgICAgICAgICBmYWxzZTogbm8gbmVlZCB0byBwcmludCBvdXQgZnBzIGxvZworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6Om5lZWREZWJ1Z0ZwcygpCit7CisgICAgYm9vbCBuZWVkRnBzID0gZmFsc2U7CisgICAgbmVlZEZwcyA9IG1QYXJhbWV0ZXJzLmlzRnBzRGVidWdFbmFibGVkKCk7CisgICAgcmV0dXJuIG5lZWRGcHM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNDQUNFbmFibGVkCisgKgorICogREVTQ1JJUFRJT046IGlmIENBQyBpcyBlbmFibGVkCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZTogbmVlZGVkCisgKiAgICAgICAgICAgICAgZmFsc2U6IG5vIG5lZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjppc0NBQ0VuYWJsZWQoKQoreworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuZmVhdHVyZS5jYWMiLCBwcm9wLCAiMCIpOworICAgIGludCBlbmFibGVDQUMgPSBhdG9pKHByb3ApOworICAgIHJldHVybiBlbmFibGVDQUMgPT0gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpczRrMmtSZXNvbHV0aW9uCisgKgorICogREVTQ1JJUFRJT046IGlmIHJlc29sdXRpb24gaXMgNGsgeCAyayBvciB0cnVlIDRrIHggMmsKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlOiBuZWVkZWQKKyAqICAgICAgICAgICAgICBmYWxzZTogbm8gbmVlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmlzNGsya1Jlc29sdXRpb24oY2FtX2RpbWVuc2lvbl90KiByZXNvbHV0aW9uKQoreworICAgYm9vbCBlbmFibGVkID0gZmFsc2U7CisgICBpZiAoKHJlc29sdXRpb24tPndpZHRoID09IDQwOTYgJiYgcmVzb2x1dGlvbi0+aGVpZ2h0ID09IDIxNjApIHx8CisgICAgICAgKHJlc29sdXRpb24tPndpZHRoID09IDM4NDAgJiYgcmVzb2x1dGlvbi0+aGVpZ2h0ID09IDIxNjApICkgeworICAgICAgZW5hYmxlZCA9IHRydWU7CisgICB9CisgICByZXR1cm4gZW5hYmxlZDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc1ByZXZpZXdSZXN0YXJ0RW5hYmxlZAorICoKKyAqIERFU0NSSVBUSU9OOiBDaGVjayB3aGV0aGVyIHByZXZpZXcgc2hvdWxkIGJlIHJlc3RhcnRlZCBhdXRvbWF0aWNhbGx5CisgKiAgICAgICAgICAgICAgZHVyaW5nIGltYWdlIGNhcHR1cmUuCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZTogbmVlZGVkCisgKiAgICAgICAgICAgICAgZmFsc2U6IG5vIG5lZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjppc1ByZXZpZXdSZXN0YXJ0RW5hYmxlZCgpCit7CisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5mZWF0dXJlLnJlc3RhcnQiLCBwcm9wLCAiMCIpOworICAgIGludCBlYXJseVJlc3RhcnQgPSBhdG9pKHByb3ApOworICAgIHJldHVybiBlYXJseVJlc3RhcnQgPT0gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBuZWVkUmVwcm9jZXNzCisgKgorICogREVTQ1JJUFRJT046IGlmIHJlcHJvY2VzcyBpcyBuZWVkZWQKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlOiBuZWVkZWQKKyAqICAgICAgICAgICAgICBmYWxzZTogbm8gbmVlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6Om5lZWRSZXByb2Nlc3MoKQoreworICAgIGJvb2wgbmVlZFJlcHJvY2VzcyA9IGZhbHNlOworCisgICAgaWYgKCFtUGFyYW1ldGVycy5pc0pwZWdQaWN0dXJlRm9ybWF0KCkgJiYKKyAgICAgICAgIW1QYXJhbWV0ZXJzLmlzTlYyMVBpY3R1cmVGb3JtYXQoKSkgeworICAgICAgICAvLyBSQVcgaW1hZ2UsIG5vIG5lZWQgdG8gcmVwcm9jZXNzCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvL0Rpc2FibGUgcmVwcm9jZXNzIGZvciA0SyBsaXZlc2hvdCBjYXNlIGJ1dCBlbmFibGUgaWYgbG93cG93ZXIgbW9kZQorICAgIGlmIChtUGFyYW1ldGVycy5pczRrMmtWaWRlb1Jlc29sdXRpb24oKSAmJiBtUGFyYW1ldGVycy5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKQorICAgICAgICAgICAgJiYgIWlzTG93UG93ZXJNb2RlKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHBwIGZlYXR1cmUgY29uZmlnCisgICAgY2FtX3BwX2ZlYXR1cmVfY29uZmlnX3QgcHBfY29uZmlnOworICAgIG1lbXNldCgmcHBfY29uZmlnLCAwLCBzaXplb2YoY2FtX3BwX2ZlYXR1cmVfY29uZmlnX3QpKTsKKworICAgIC8vRGVjaWRlIHdoZXRoZXIgdG8gZG8gcmVwcm9jZXNzIG9yIG5vdCBiYXNlZCBvbgorICAgIC8vcHBjb25maWcgb2J0YWluZWQgaW4gdGhlIGZpcnN0IHBhc3MuCisgICAgZ2V0UFBDb25maWcocHBfY29uZmlnKTsKKworICAgIGlmIChwcF9jb25maWcuZmVhdHVyZV9tYXNrID4gMCkgeworICAgICAgICBuZWVkUmVwcm9jZXNzID0gdHJ1ZTsKKyAgICB9CisKKyAgICBMT0dIKCJuZWVkUmVwcm9jZXNzICVzIiwgbmVlZFJlcHJvY2VzcyA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgIHJldHVybiBuZWVkUmVwcm9jZXNzOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbmVlZFJvdGF0aW9uUmVwcm9jZXNzCisgKgorICogREVTQ1JJUFRJT046IGlmIHJvdGF0aW9uIG5lZWRzIHRvIGJlIGRvbmUgYnkgcmVwcm9jZXNzIGluIHBwCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZTogbmVlZGVkCisgKiAgICAgICAgICAgICAgZmFsc2U6IG5vIG5lZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpuZWVkUm90YXRpb25SZXByb2Nlc3MoKQoreworICAgIGlmICghbVBhcmFtZXRlcnMuaXNKcGVnUGljdHVyZUZvcm1hdCgpICYmCisgICAgICAgICFtUGFyYW1ldGVycy5pc05WMjFQaWN0dXJlRm9ybWF0KCkpIHsKKyAgICAgICAgLy8gUkFXIGltYWdlLCBubyBuZWVkIHRvIHJlcHJvY2VzcworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy9EaXNhYmxlIHJlcHJvY2VzcyBmb3IgNEsgbGl2ZXNob3QgY2FzZQorICAgIGlmIChtUGFyYW1ldGVycy5pczRrMmtWaWRlb1Jlc29sdXRpb24oKSAmJiBtUGFyYW1ldGVycy5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKQorICAgICAgICAgICAgJiYgIWlzTG93UG93ZXJNb2RlKCkpIHsKKyAgICAgICAgLy9EaXNhYmxlIHJlcHJvY2VzcyBmb3IgNEsgbGl2ZXNob3QgY2FzZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgJgorICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9ST1RBVElPTikgPiAwICYmCisgICAgICAgICAgICAobVBhcmFtZXRlcnMuZ2V0SnBlZ1JvdGF0aW9uKCkgPiAwKSkgeworICAgICAgICAvLyBjdXJyZW50IHJvdGF0aW9uIGlzIG5vdCB6ZXJvLCBhbmQgcHAgaGFzIHRoZSBjYXBhYmlsaXR5IHRvIHByb2Nlc3Mgcm90YXRpb24KKyAgICAgICAgTE9HSCgibmVlZCB0byBkbyByZXByb2Nlc3MgZm9yIHJvdGF0aW9uPSVkIiwKKyAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0SnBlZ1JvdGF0aW9uKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0VGh1bWJuYWlsU2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgdXNlciBzZXQgdGh1bWJuYWlsIHNpemUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRpbSAgICAgOiBvdXRwdXQgb2YgdGh1bWJuYWlsIGRpbWVuc2lvbgorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Z2V0VGh1bWJuYWlsU2l6ZShjYW1fZGltZW5zaW9uX3QgJmRpbSkKK3sKKyAgICBtUGFyYW1ldGVycy5nZXRUaHVtYm5haWxTaXplKCZkaW0ud2lkdGgsICZkaW0uaGVpZ2h0KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRKcGVnUXVhbGl0eQorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgdXNlciBzZXQganBlZyBxdWFsaXR5CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDoganBlZyBxdWFsaXR5IHNldHRpbmcKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Z2V0SnBlZ1F1YWxpdHkoKQoreworICAgIHVpbnQzMl90IHF1YWxpdHkgPSAwOworICAgIHF1YWxpdHkgPSAgbVBhcmFtZXRlcnMuZ2V0SnBlZ1F1YWxpdHkoKTsKKyAgICByZXR1cm4gcXVhbGl0eTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRFeGlmRGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgZXhpZiBkYXRhIHRvIGJlIHBhc3NlZCBpbnRvIGpwZWcgZW5jb2RpbmcKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBleGlmIGRhdGEgZnJvbSB1c2VyIHNldHRpbmcgYW5kIEdQUworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhRXhpZiAqUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Z2V0RXhpZkRhdGEoKQoreworICAgIFFDYW1lcmFFeGlmICpleGlmID0gbmV3IFFDYW1lcmFFeGlmKCk7CisgICAgaWYgKGV4aWYgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIFFDYW1lcmFFeGlmIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIC8vIGFkZCBleGlmIGVudHJpZXMKKyAgICBTdHJpbmc4IGRhdGVUaW1lLCBzdWJTZWNUaW1lOworICAgIHJjID0gbVBhcmFtZXRlcnMuZ2V0RXhpZkRhdGVUaW1lKGRhdGVUaW1lLCBzdWJTZWNUaW1lKTsKKyAgICBpZihyYyA9PSBOT19FUlJPUikgeworICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfREFURV9USU1FLCBFWElGX0FTQ0lJLAorICAgICAgICAgICAgICAgICh1aW50MzJfdCkoZGF0ZVRpbWUubGVuZ3RoKCkgKyAxKSwgKHZvaWQgKilkYXRlVGltZS5zdHJpbmcoKSk7CisgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9FWElGX0RBVEVfVElNRV9PUklHSU5BTCwgRVhJRl9BU0NJSSwKKyAgICAgICAgICAgICAgICAodWludDMyX3QpKGRhdGVUaW1lLmxlbmd0aCgpICsgMSksICh2b2lkICopZGF0ZVRpbWUuc3RyaW5nKCkpOworICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfRVhJRl9EQVRFX1RJTUVfRElHSVRJWkVELCBFWElGX0FTQ0lJLAorICAgICAgICAgICAgICAgICh1aW50MzJfdCkoZGF0ZVRpbWUubGVuZ3RoKCkgKyAxKSwgKHZvaWQgKilkYXRlVGltZS5zdHJpbmcoKSk7CisgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9TVUJTRUNfVElNRSwgRVhJRl9BU0NJSSwKKyAgICAgICAgICAgICAgICAodWludDMyX3QpKHN1YlNlY1RpbWUubGVuZ3RoKCkgKyAxKSwgKHZvaWQgKilzdWJTZWNUaW1lLnN0cmluZygpKTsKKyAgICAgICAgZXhpZi0+YWRkRW50cnkoRVhJRlRBR0lEX1NVQlNFQ19USU1FX09SSUdJTkFMLCBFWElGX0FTQ0lJLAorICAgICAgICAgICAgICAgICh1aW50MzJfdCkoc3ViU2VjVGltZS5sZW5ndGgoKSArIDEpLCAodm9pZCAqKXN1YlNlY1RpbWUuc3RyaW5nKCkpOworICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfU1VCU0VDX1RJTUVfRElHSVRJWkVELCBFWElGX0FTQ0lJLAorICAgICAgICAgICAgICAgICh1aW50MzJfdCkoc3ViU2VjVGltZS5sZW5ndGgoKSArIDEpLCAodm9pZCAqKXN1YlNlY1RpbWUuc3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coImdldEV4aWZEYXRlVGltZSBmYWlsZWQiKTsKKyAgICB9CisKKyAgICByYXRfdCBmb2NhbExlbmd0aDsKKyAgICByYyA9IG1QYXJhbWV0ZXJzLmdldEV4aWZGb2NhbExlbmd0aCgmZm9jYWxMZW5ndGgpOworICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfRk9DQUxfTEVOR1RILAorICAgICAgICAgICAgICAgICAgICAgICBFWElGX1JBVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSYoZm9jYWxMZW5ndGgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dXKCJnZXRFeGlmRm9jYWxMZW5ndGggZmFpbGVkIik7CisgICAgfQorCisgICAgdWludDE2X3QgaXNvU3BlZWQgPSBtUGFyYW1ldGVycy5nZXRFeGlmSXNvU3BlZWQoKTsKKyAgICBpZiAoZ2V0U2Vuc29yVHlwZSgpICE9IENBTV9TRU5TT1JfWVVWKSB7CisgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9JU09fU1BFRURfUkFUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICBFWElGX1NIT1JULAorICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSYoaXNvU3BlZWQpKTsKKyAgICB9CisKKyAgICBjaGFyIGdwc1Byb2Nlc3NpbmdNZXRob2RbRVhJRl9BU0NJSV9QUkVGSVhfU0laRSArIEdQU19QUk9DRVNTSU5HX01FVEhPRF9TSVpFXTsKKyAgICB1aW50MzJfdCBjb3VudCA9IDA7CisKKyAgICAvKmdwcyBkYXRhIG1pZ2h0IG5vdCBiZSBhdmFpbGFibGUgKi8KKyAgICByYyA9IG1QYXJhbWV0ZXJzLmdldEV4aWZHcHNQcm9jZXNzaW5nTWV0aG9kKGdwc1Byb2Nlc3NpbmdNZXRob2QsIGNvdW50KTsKKyAgICBpZihyYyA9PSBOT19FUlJPUikgeworICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfR1BTX1BST0NFU1NJTkdNRVRIT0QsCisgICAgICAgICAgICAgICAgICAgICAgIEVYSUZfQVNDSUksCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWdwc1Byb2Nlc3NpbmdNZXRob2QpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coImdldEV4aWZHcHNQcm9jZXNzaW5nTWV0aG9kIGZhaWxlZCIpOworICAgIH0KKworICAgIHJhdF90IGxhdGl0dWRlWzNdOworICAgIGNoYXIgbGF0UmVmWzJdOworICAgIHJjID0gbVBhcmFtZXRlcnMuZ2V0RXhpZkxhdGl0dWRlKGxhdGl0dWRlLCBsYXRSZWYpOworICAgIGlmKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9HUFNfTEFUSVRVREUsCisgICAgICAgICAgICAgICAgICAgICAgIEVYSUZfUkFUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbGF0aXR1ZGUpOworICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfR1BTX0xBVElUVURFX1JFRiwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhJRl9BU0NJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilsYXRSZWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coImdldEV4aWZMYXRpdHVkZSBmYWlsZWQiKTsKKyAgICB9CisKKyAgICByYXRfdCBsb25naXR1ZGVbM107CisgICAgY2hhciBsb25SZWZbMl07CisgICAgcmMgPSBtUGFyYW1ldGVycy5nZXRFeGlmTG9uZ2l0dWRlKGxvbmdpdHVkZSwgbG9uUmVmKTsKKyAgICBpZihyYyA9PSBOT19FUlJPUikgeworICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfR1BTX0xPTkdJVFVERSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhJRl9SQVRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilsb25naXR1ZGUpOworCisgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9HUFNfTE9OR0lUVURFX1JFRiwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhJRl9BU0NJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilsb25SZWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coImdldEV4aWZMb25naXR1ZGUgZmFpbGVkIik7CisgICAgfQorCisgICAgcmF0X3QgYWx0aXR1ZGU7CisgICAgY2hhciBhbHRSZWY7CisgICAgcmMgPSBtUGFyYW1ldGVycy5nZXRFeGlmQWx0aXR1ZGUoJmFsdGl0dWRlLCAmYWx0UmVmKTsKKyAgICBpZihyYyA9PSBOT19FUlJPUikgeworICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfR1BTX0FMVElUVURFLAorICAgICAgICAgICAgICAgICAgICAgICBFWElGX1JBVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSYoYWx0aXR1ZGUpKTsKKworICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfR1BTX0FMVElUVURFX1JFRiwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhJRl9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZhbHRSZWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coImdldEV4aWZBbHRpdHVkZSBmYWlsZWQiKTsKKyAgICB9CisKKyAgICBjaGFyIGdwc0RhdGVTdGFtcFsyMF07CisgICAgcmF0X3QgZ3BzVGltZVN0YW1wWzNdOworICAgIHJjID0gbVBhcmFtZXRlcnMuZ2V0RXhpZkdwc0RhdGVUaW1lU3RhbXAoZ3BzRGF0ZVN0YW1wLCAyMCwgZ3BzVGltZVN0YW1wKTsKKyAgICBpZihyYyA9PSBOT19FUlJPUikgeworICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfR1BTX0RBVEVTVEFNUCwKKyAgICAgICAgICAgICAgICAgICAgICAgRVhJRl9BU0NJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShzdHJsZW4oZ3BzRGF0ZVN0YW1wKSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWdwc0RhdGVTdGFtcCk7CisKKyAgICAgICAgZXhpZi0+YWRkRW50cnkoRVhJRlRBR0lEX0dQU19USU1FU1RBTVAsCisgICAgICAgICAgICAgICAgICAgICAgIEVYSUZfUkFUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopZ3BzVGltZVN0YW1wKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dXKCJnZXRFeGlmR3BzRGF0YVRpbWVTdGFtcCBmYWlsZWQiKTsKKyAgICB9CisKKyNpZmRlZiBFTkFCTEVfTU9ERUxfSU5GT19FWElGCisKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgicGVyc2lzdC5zeXMuZXhpZi5tYWtlIiwgdmFsdWUsICIiKSA+IDAgfHwKKyAgICAgICAgICAgIHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5tYW51ZmFjdHVyZXIiLCB2YWx1ZSwgIlFDT00tQUEiKSA+IDApIHsKKyAgICAgICAgZXhpZi0+YWRkRW50cnkoRVhJRlRBR0lEX01BS0UsCisgICAgICAgICAgICAgICAgRVhJRl9BU0NJSSwgc3RybGVuKHZhbHVlKSArIDEsICh2b2lkICopdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coImdldEV4aWZNYWtlciBmYWlsZWQiKTsKKyAgICB9CisKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJwZXJzaXN0LnN5cy5leGlmLm1vZGVsIiwgdmFsdWUsICIiKSA+IDAgfHwKKyAgICAgICAgICAgIHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5tb2RlbCIsIHZhbHVlLCAiUUNBTS1BQSIpID4gMCkgeworICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfTU9ERUwsCisgICAgICAgICAgICAgICAgRVhJRl9BU0NJSSwgc3RybGVuKHZhbHVlKSArIDEsICh2b2lkICopdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coImdldEV4aWZNb2RlbCBmYWlsZWQiKTsKKyAgICB9CisKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJyby5idWlsZC5kZXNjcmlwdGlvbiIsIHZhbHVlLCAiUUNBTS1BQSIpID4gMCkgeworICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfU09GVFdBUkUsIEVYSUZfQVNDSUksCisgICAgICAgICAgICAgICAgKHVpbnQzMl90KShzdHJsZW4odmFsdWUpICsgMSksICh2b2lkICopdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coImdldEV4aWZTb2Z0d2FyZSBmYWlsZWQiKTsKKyAgICB9CisKKyNlbmRpZgorCisgICAgaWYgKG1QYXJhbWV0ZXJzLnVzZUpwZWdFeGlmUm90YXRpb24oKSkgeworICAgICAgICBpbnQxNl90IG9yaWVudGF0aW9uOworICAgICAgICBzd2l0Y2ggKG1QYXJhbWV0ZXJzLmdldEpwZWdFeGlmUm90YXRpb24oKSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA5MDoKKyAgICAgICAgICAgIG9yaWVudGF0aW9uID0gNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICAgIG9yaWVudGF0aW9uID0gMzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgIG9yaWVudGF0aW9uID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb3JpZW50YXRpb24gPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZXhpZi0+YWRkRW50cnkoRVhJRlRBR0lEX09SSUVOVEFUSU9OLAorICAgICAgICAgICAgICAgIEVYSUZfU0hPUlQsCisgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSZvcmllbnRhdGlvbik7CisgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9UTl9PUklFTlRBVElPTiwKKyAgICAgICAgICAgICAgICBFWElGX1NIT1JULAorICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgKHZvaWQgKikmb3JpZW50YXRpb24pOworICAgIH0KKworICAgIHJldHVybiBleGlmOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEhpc3RvZ3JhbQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgaWYgaGlzdG9ncmFtIHNob3VsZCBiZSBlbmFibGVkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBoaXN0b2dyYW1fZW4gOiBib29sIGZsYWcgaWYgaGlzdG9ncmFtIHNob3VsZCBiZSBlbmFibGVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzZXRIaXN0b2dyYW0oYm9vbCBoaXN0b2dyYW1fZW4pCit7CisgICAgcmV0dXJuIG1QYXJhbWV0ZXJzLnNldEhpc3RvZ3JhbShoaXN0b2dyYW1fZW4pOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEZhY2VEZXRlY3Rpb24KKyAqCisgKiBERVNDUklQVElPTjogc2V0IGlmIGZhY2UgZGV0ZWN0aW9uIHNob3VsZCBiZSBlbmFibGVkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBlbmFibGVkIDogYm9vbCBmbGFnIGlmIGZhY2UgZGV0ZWN0aW9uIHNob3VsZCBiZSBlbmFibGVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzZXRGYWNlRGV0ZWN0aW9uKGJvb2wgZW5hYmxlZCkKK3sKKyAgICByZXR1cm4gbVBhcmFtZXRlcnMuc2V0RmFjZURldGVjdGlvbihlbmFibGVkLCB0cnVlKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc0NhcHR1cmVTaHV0dGVyRW5hYmxlZAorICoKKyAqIERFU0NSSVBUSU9OOiBDaGVjayB3aGV0aGVyIHNodXR0ZXIgc2hvdWxkIGJlIHRyaWdnZXJlZCBpbW1lZGlhdGVseSBhZnRlcgorICogICAgICAgICAgICAgIGNhcHR1cmUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZSAtIHJlZ3VsYXIgY2FwdHVyZQorICogICAgICAgICAgICAgIGZhbHNlIC0gb3RoZXIgdHlwZSBvZiBjYXB0dXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6aXNDYXB0dXJlU2h1dHRlckVuYWJsZWQoKQoreworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuZmVhdHVyZS5zaHV0dGVyIiwgcHJvcCwgIjAiKTsKKyAgICBpbnQgZW5hYmxlU2h1dHRlciA9IGF0b2kocHJvcCk7CisgICAgcmV0dXJuIGVuYWJsZVNodXR0ZXIgPT0gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBuZWVkUHJvY2Vzc1ByZXZpZXdGcmFtZQorICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm5zIHdoZXRoZXIgcHJldmlldyBmcmFtZSBuZWVkIHRvIGJlIGRpc3BsYXllZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZnJhbWVJRCA6IGZyYW1lSUQgb2YgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpuZWVkUHJvY2Vzc1ByZXZpZXdGcmFtZSh1aW50MzJfdCBmcmFtZUlEKQoreworICAgIHJldHVybiAoKChtX3N0YXRlTWFjaGluZS5pc1ByZXZpZXdSdW5uaW5nKCkpICYmCisgICAgICAgICAgICAoIWlzRGlzcGxheUZyYW1lVG9Ta2lwKGZyYW1lSUQpKSAmJgorICAgICAgICAgICAgKCFtUGFyYW1ldGVycy5pc0luc3RhbnRBRUNFbmFibGVkKCkpKSB8fAorICAgICAgICAgICAgKGlzUHJldmlld1Jlc3RhcnRFbmFibGVkKCkpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBuZWVkU2VuZFByZXZpZXdDYWxsYmFjaworICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm5zIHdoZXRoZXIgcHJldmlldyBmcmFtZSBuZWVkIHRvIGNhbGxiYWNrIHRvIEFQUAorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlIC0gbmVlZCBwcmV2aWV3IGZyYW1lIGNhbGxiY2sKKyAqICAgICAgICAgICAgICBmYWxzZSAtIG5vdCBzZW5kIHByZXZpZXcgZnJhbWUgY2FsbGJhY2sKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpuZWVkU2VuZFByZXZpZXdDYWxsYmFjaygpCit7CisgICAgcmV0dXJuIG1fc3RhdGVNYWNoaW5lLmlzUHJldmlld1J1bm5pbmcoKQorICAgICAgICAgICAgJiYgKG1EYXRhQ2IgIT0gTlVMTCkKKyAgICAgICAgICAgICYmIChtc2dUeXBlRW5hYmxlZFdpdGhMb2NrKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSkgPiAwKQorICAgICAgICAgICAgJiYgbV9zdGF0ZU1hY2hpbmUuaXNQcmV2aWV3Q2FsbGJhY2tOZWVkZWQoKTsKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0RGlzcGxheVNraXAKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHJhbmdlIG9mIGZyYW1lcyB0byBza2lwIGZvciBwcmV2aWV3CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBlbmFibGVkIDogVFJVRSB0byBzdGFydCBza2lwcGluZyBmcmFtZSB0byBkaXNwbGF5CisgICAgICAgICAgICAgICAgRkFMU0UgdG8gc3RvcCBza2lwcGluZyBmcmFtZSB0byBkaXNwbGF5CisgKiAgIEBza2lwQ250IDogTnVtYmVyIG9mIGZyYW1lIHRvIHNraXAuIDAgYnkgZGVmYXVsdAorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c2V0RGlzcGxheVNraXAoYm9vbCBlbmFibGVkLCB1aW50OF90IHNraXBDbnQpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtR3JhbGxvY0xvY2spOworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIHNldERpc3BsYXlGcmFtZVNraXAoKTsKKyAgICAgICAgc2V0RGlzcGxheUZyYW1lU2tpcChtTGFzdFByZXZpZXdGcmFtZUlEICsgc2tpcENudCArIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldERpc3BsYXlGcmFtZVNraXAobUZyYW1lU2tpcFN0YXJ0LCAobUxhc3RQcmV2aWV3RnJhbWVJRCArIHNraXBDbnQgKyAxKSk7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtR3JhbGxvY0xvY2spOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldERpc3BsYXlGcmFtZVNraXAKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHJhbmdlIG9mIGZyYW1lcyB0byBza2lwIGZvciBwcmV2aWV3CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdGFydCAgIDogZnJhbWVJZCB0byBzdGFydCBza2lwCisgKiAgIEBlbmQgICAgIDogZnJhbWVJZCB0byBzdG9wIHNraXAKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnNldERpc3BsYXlGcmFtZVNraXAodWludDMyX3Qgc3RhcnQsCisgICAgICAgIHVpbnQzMl90IGVuZCkKK3sKKyAgICBpZiAoc3RhcnQgPT0gMCkgeworICAgICAgICBtRnJhbWVTa2lwU3RhcnQgPSAwOworICAgICAgICBtRnJhbWVTa2lwRW5kID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoKG1GcmFtZVNraXBTdGFydCA9PSAwKSB8fCAobUZyYW1lU2tpcFN0YXJ0ID4gc3RhcnQpKSB7CisgICAgICAgIG1GcmFtZVNraXBTdGFydCA9IHN0YXJ0OworICAgIH0KKyAgICBpZiAoKGVuZCA9PSAwKSB8fCAoZW5kID4gbUZyYW1lU2tpcEVuZCkpIHsKKyAgICAgICAgbUZyYW1lU2tpcEVuZCA9IGVuZDsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNEaXNwbGF5RnJhbWVUb1NraXAKKyAqCisgKiBERVNDUklQVElPTjogZnVuY3Rpb24gdG8gZGV0ZXJtaW4gaWYgaW5wdXQgZnJhbWUgZmFsbHMgdW5kZXIgc2tpcCByYW5nZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZnJhbWVJZCA6IGZyYW1lSWQgdG8gdmVyaWZ5CisgKgorICogUkVUVVJOICAgICA6IHRydWUgOiBuZWVkIHRvIHNraXAKKyAqICAgICAgICAgICAgICBmYWxzZTogbm8gbmVlZCB0byBza2lwCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6aXNEaXNwbGF5RnJhbWVUb1NraXAodWludDMyX3QgZnJhbWVJZCkKK3sKKyAgICByZXR1cm4gKChtRnJhbWVTa2lwU3RhcnQgIT0gMCkgJiYgKGZyYW1lSWQgPj0gbUZyYW1lU2tpcFN0YXJ0KSAmJgorICAgICAgICAgICAgKGZyYW1lSWQgPD0gbUZyYW1lU2tpcEVuZCB8fCBtRnJhbWVTa2lwRW5kID09IDApKSA/IFRSVUUgOiBGQUxTRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcmVwYXJlSGFyZHdhcmVGb3JTbmFwc2hvdAorICoKKyAqIERFU0NSSVBUSU9OOiBwcmVwYXJlIGhhcmR3YXJlIGZvciBzbmFwc2hvdCwgc3VjaCBhcyBMRUQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGFmTmVlZGVkOiBmbGFnIGluZGljYXRpbmcgaWYgQXV0byBGb2N1cyBuZWVkcyB0byBiZSBkb25lIGR1cmluZyBwcmVwYXJhdGlvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHJlcGFyZUhhcmR3YXJlRm9yU25hcHNob3QoaW50MzJfdCBhZk5lZWRlZCkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIExPR0koIltLUEkgUGVyZl06IFNlbmQgUFJFUEFSRSBTQU5TUEhPVCBldmVudCIpOworICAgIHJldHVybiBtQ2FtZXJhSGFuZGxlLT5vcHMtPnByZXBhcmVfc25hcHNob3QobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmTmVlZGVkKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBuZWVkRkRNZXRhZGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBjaGVjayB3aGV0aGVyIHdlIG5lZWQgcHJvY2VzcyBGYWNlIERldGVjdGlvbiBtZXRhZGF0YSBpbiB0aGlzIGNoYW5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2hhbm5lbF90eXBlOiBjaGFubmVsIHR5cGUKKyAqCisgICogUkVUVVJOICAgICA6IHRydWU6IG5lZWRlZAorICogICAgICAgICAgICAgIGZhbHNlOiBubyBuZWVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6bmVlZEZETWV0YWRhdGEocWNhbWVyYV9jaF90eXBlX2VudW1fdCBjaGFubmVsX3R5cGUpCit7CisgICAgLy9Ob3RlOiBDdXJyZW50bHkgd2Ugb25seSBwcm9jZXNzIFpTTCBjaGFubmVsCisgICAgYm9vbCB2YWx1ZSA9IGZhbHNlOworICAgIGlmKGNoYW5uZWxfdHlwZSA9PSBRQ0FNRVJBX0NIX1RZUEVfWlNMKXsKKyAgICAgICAgLy9jaGVjayBpZiBGRCByZXF1aXJlbWVudCBpcyBlbmFibGVkCisgICAgICAgIGlmKG1QYXJhbWV0ZXJzLmlzU25hcHNob3RGRE5lZWRlZCgpICYmCisgICAgICAgICAgIG1QYXJhbWV0ZXJzLmlzRmFjZURldGVjdGlvbkVuYWJsZWQoKSl7CisgICAgICAgICAgICB2YWx1ZSA9IHRydWU7CisgICAgICAgICAgICBMT0dIKCJGYWNlIERldGVjdGlvbiBtZXRhZGF0YSBpcyByZXF1aXJlZCBpbiBaU0wgbW9kZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2YWx1ZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkZWZlcnJlZFdvcmtSb3V0aW5lCisgKgorICogREVTQ1JJUFRJT046IGRhdGEgcHJvY2VzcyByb3V0aW5lIHRoYXQgZXhlY3V0ZXMgZGVmZXJyZWQgdGFza3MKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRhdGEgICAgOiB1c2VyIGRhdGEgcHRyIChRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlKQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgKlFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmRlZmVycmVkV29ya1JvdXRpbmUodm9pZCAqb2JqKQoreworICAgIGludCBydW5uaW5nID0gMTsKKyAgICBpbnQgcmV0OworICAgIHVpbnQ4X3QgaXNfYWN0aXZlID0gRkFMU0U7CisgICAgaW50MzJfdCBqb2Jfc3RhdHVzID0gMDsKKworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKnBtZSA9IChRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICopb2JqOworICAgIFFDYW1lcmFDbWRUaHJlYWQgKmNtZFRocmVhZCA9ICZwbWUtPm1EZWZlcnJlZFdvcmtUaHJlYWQ7CisgICAgY21kVGhyZWFkLT5zZXROYW1lKCJDQU1fZGVmcmRXcmsiKTsKKworICAgIGRvIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcmV0ID0gY2FtX3NlbV93YWl0KCZjbWRUaHJlYWQtPmNtZF9zZW0pOworICAgICAgICAgICAgaWYgKHJldCAhPSAwICYmIGVycm5vICE9IEVJTlZBTCkgeworICAgICAgICAgICAgICAgIExPR0UoImNhbV9zZW1fd2FpdCBlcnJvciAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChyZXQgIT0gMCk7CisKKyAgICAgICAgLy8gd2UgZ290IG5vdGlmaWVkIGFib3V0IG5ldyBjbWQgYXZhaWwgaW4gY21kIHF1ZXVlCisgICAgICAgIGNhbWVyYV9jbWRfdHlwZV90IGNtZCA9IGNtZFRocmVhZC0+Z2V0Q21kKCk7CisgICAgICAgIExPR0QoImNtZDogJWQiLCBjbWQpOworICAgICAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgICBjYXNlIENBTUVSQV9DTURfVFlQRV9TVEFSVF9EQVRBX1BST0M6CisgICAgICAgICAgICBMT0dIKCJzdGFydCBkYXRhIHByb2MiKTsKKyAgICAgICAgICAgIGlzX2FjdGl2ZSA9IFRSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1RZUEVfU1RPUF9EQVRBX1BST0M6CisgICAgICAgICAgICBMT0dIKCJzdG9wIGRhdGEgcHJvYyIpOworICAgICAgICAgICAgaXNfYWN0aXZlID0gRkFMU0U7CisgICAgICAgICAgICAvLyBzaWduYWwgY21kIGlzIGNvbXBsZXRlZAorICAgICAgICAgICAgY2FtX3NlbV9wb3N0KCZjbWRUaHJlYWQtPnN5bmNfc2VtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9DTURfVFlQRV9ET19ORVhUX0pPQjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWZXb3JrICpkdyA9CisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RGVmV29yayAqPihwbWUtPm1DbWRRdWV1ZS5kZXF1ZXVlKCkpOworCisgICAgICAgICAgICAgICAgaWYgKCBOVUxMID09IGR3ICkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGRlZmVycmVkIHdvcmsiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoKCBkdy0+Y21kICkgeworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RFRl9BTExPQ0FURV9CVUZGOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhQ2hhbm5lbCAqIHBDaGFubmVsID0gZHctPmFyZ3MuYWxsb2NBcmdzLmNoOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIE5VTEwgPT0gcENoYW5uZWwgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBkZWZlcnJlZCB3b3JrIGNoYW5uZWwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2Jfc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gZHctPmFyZ3MuYWxsb2NBcmdzLnR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dIKCJEZWZlcnJlZCBidWZmZXIgYWxsb2NhdGlvbiBzdGFydGVkIGZvciBzdHJlYW0gdHlwZTogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGlOdW1PZlN0cmVhbXMgPSBwQ2hhbm5lbC0+Z2V0TnVtT2ZTdHJlYW1zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIHVpbnQzMl90IGkgPSAwOyBpIDwgaU51bU9mU3RyZWFtczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbSA9IHBDaGFubmVsLT5nZXRTdHJlYW1CeUluZGV4KGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBOVUxMID09IHBTdHJlYW0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9zdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcFN0cmVhbS0+aXNUeXBlT2Yoc3RyZWFtVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwU3RyZWFtLT5hbGxvY2F0ZUJ1ZmZlcnMoKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIGFsbG9jYXRpbmcgYnVmZmVycyAhISEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9zdGF0dXMgPSAgTk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5zZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9FUlJPUl9VTktOT1dOLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfREVGX1BQUk9DX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJldCA9IHBtZS0+Z2V0RGVmSm9iU3RhdHVzKHBtZS0+bUluaXRQUHJvY0pvYik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iX3N0YXR1cyA9IHJldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJQUFJPQyBTdGFydCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPnNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9FUlJPUl9VTktOT1dOLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmFDaGFubmVsICogcENoYW5uZWwgPSBkdy0+YXJncy5wcHJvY0FyZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQocENoYW5uZWwpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG1lLT5tX3Bvc3Rwcm9jZXNzb3Iuc3RhcnQocENoYW5uZWwpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiY2Fubm90IHN0YXJ0IHBvc3Rwcm9jZXNzb3IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2Jfc3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+c2VuZEV2dE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0VSUk9SX1VOS05PV04sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RFRl9NRVRBREFUQV9BTExPQzoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByZXQgPSBwbWUtPmdldERlZkpvYlN0YXR1cyhwbWUtPm1QYXJhbUFsbG9jSm9iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2Jfc3RhdHVzID0gcmV0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIk1ldGFkYXRhIGFsbG9jIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+c2VuZEV2dE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0VSUk9SX1VOS05PV04sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tTWV0YWRhdGFNZW0gPSBuZXcgUUNhbWVyYU1ldGFkYXRhU3RyZWFtTWVtb3J5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ0FNRVJBX0lPTl9VU0VfQ0FDSEUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG1lLT5tTWV0YWRhdGFNZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZXRhZGF0YSBidWZmZXJzIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iX3N0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPnNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9FUlJPUl9VTktOT1dOLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYyA9IHBtZS0+bU1ldGFkYXRhTWVtLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3LT5hcmdzLm1ldGFkYXRhQWxsb2NBcmdzLmJ1ZmZlckNudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3LT5hcmdzLm1ldGFkYXRhQWxsb2NBcmdzLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT05fU0VDVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwbWUtPm1NZXRhZGF0YU1lbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tTWV0YWRhdGFNZW0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RFRl9DUkVBVEVfSlBFR19TRVNTSU9OOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhQ2hhbm5lbCAqIHBDaGFubmVsID0gZHctPmFyZ3MucHByb2NBcmdzOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHBDaGFubmVsKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByZXQgPSBwbWUtPmdldERlZkpvYlN0YXR1cyhwbWUtPm1SZXByb2NKb2IpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9zdGF0dXMgPSByZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiSnBlZyBjcmVhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbWUtPm1fcG9zdHByb2Nlc3Nvci5jcmVhdGVKcGVnU2Vzc2lvbihwQ2hhbm5lbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImNhbm5vdCBjcmVhdGUgSlBFRyBzZXNzaW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iX3N0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5zZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfRVJST1JfVU5LTk9XTiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDTURfREVGX1BQUk9DX0lOSVQ6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgICAgICAgICAgICAgICAgICAgICAganBlZ19lbmNvZGVfY2FsbGJhY2tfdCBqcGVnRXZ0SGFuZGxlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHctPmFyZ3MucHByb2NJbml0QXJncy5qcGVnX2NiOworICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcl9kYXRhID0gZHctPmFyZ3MucHByb2NJbml0QXJncy51c2VyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhUG9zdFByb2Nlc3NvciAqcG9zdFByb2Nlc3NvciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocG1lLT5tX3Bvc3Rwcm9jZXNzb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2FtZXJhSWQgPSBwbWUtPm1DYW1lcmFJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9jYXBhYmlsaXR5X3QgKmNhcGFiaWxpdHkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF07CisgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgcGFkZGluZ19pbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190JiBjYW1fY2FwYWJpbGl0eV9wYWRkaW5nX2luZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5LT5wYWRkaW5nX2luZm87CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFwbWUtPm1KcGVnQ2xpZW50SGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBwbWUtPmluaXRKcGVnSGFuZGxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkVycm9yISEgY3JlYXRpbmcgSlBFRyBoYW5kbGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9zdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPnNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfRVJST1JfVU5LTk9XTiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0goIm1KcGVnQ2xpZW50SGFuZGxlIDogJWQiLCBwbWUtPm1KcGVnQ2xpZW50SGFuZGxlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBwb3N0UHJvY2Vzc29yLT5zZXRKcGVnSGFuZGxlKCZwbWUtPm1KcGVnSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG1lLT5tSnBlZ01wb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tSnBlZ0NsaWVudEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkVycm9yISEgc2V0IEpQRUcgaGFuZGxlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9zdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+c2VuZEV2dE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0VSUk9SX1VOS05PV04sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBnZXQgbWF4IHBpYyBzaXplIGZvciBqcGVnIHdvcmsgYnVmIGNhbGN1bGF0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gcG9zdFByb2Nlc3Nvci0+aW5pdChqcGVnRXZ0SGFuZGxlLCB1c2VyX2RhdGEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJjYW5ub3QgaW5pdCBwb3N0cHJvY2Vzc29yIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iX3N0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5zZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfRVJST1JfVU5LTk9XTiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwYWRkaW5nIGluZm8gZnJvbSBqcGVnCisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UHJvY2Vzc29yLT5nZXRKcGVnUGFkZGluZ1JlcShwYWRkaW5nX2luZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbV9jYXBhYmlsaXR5X3BhZGRpbmdfaW5mby53aWR0aF9wYWRkaW5nIDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ19pbmZvLndpZHRoX3BhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fY2FwYWJpbGl0eV9wYWRkaW5nX2luZm8ud2lkdGhfcGFkZGluZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nX2luZm8ud2lkdGhfcGFkZGluZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW1fY2FwYWJpbGl0eV9wYWRkaW5nX2luZm8uaGVpZ2h0X3BhZGRpbmcgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nX2luZm8uaGVpZ2h0X3BhZGRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fY2FwYWJpbGl0eV9wYWRkaW5nX2luZm8uaGVpZ2h0X3BhZGRpbmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ19pbmZvLmhlaWdodF9wYWRkaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbV9jYXBhYmlsaXR5X3BhZGRpbmdfaW5mby5wbGFuZV9wYWRkaW5nICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdfaW5mby5wbGFuZV9wYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2NhcGFiaWxpdHlfcGFkZGluZ19pbmZvLnBsYW5lX3BhZGRpbmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fc3RyZWFtX2NhbGNfbGNtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2NhcGFiaWxpdHlfcGFkZGluZ19pbmZvLnBsYW5lX3BhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nX2luZm8ucGxhbmVfcGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FtX2NhcGFiaWxpdHlfcGFkZGluZ19pbmZvLm9mZnNldF9pbmZvLm9mZnNldF94CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IHBhZGRpbmdfaW5mby5vZmZzZXRfaW5mby5vZmZzZXRfeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9jYXBhYmlsaXR5X3BhZGRpbmdfaW5mby5vZmZzZXRfaW5mby5vZmZzZXRfeCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9zdHJlYW1fY2FsY19sY20gKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2NhcGFiaWxpdHlfcGFkZGluZ19pbmZvLm9mZnNldF9pbmZvLm9mZnNldF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ19pbmZvLm9mZnNldF9pbmZvLm9mZnNldF94KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW1fY2FwYWJpbGl0eV9wYWRkaW5nX2luZm8ub2Zmc2V0X2luZm8ub2Zmc2V0X3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gcGFkZGluZ19pbmZvLm9mZnNldF9pbmZvLm9mZnNldF95KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2NhcGFiaWxpdHlfcGFkZGluZ19pbmZvLm9mZnNldF9pbmZvLm9mZnNldF95ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9zdHJlYW1fY2FsY19sY20gKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2NhcGFiaWxpdHlfcGFkZGluZ19pbmZvLm9mZnNldF9pbmZvLm9mZnNldF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZ19pbmZvLm9mZnNldF9pbmZvLm9mZnNldF95KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ERUZfUEFSQU1fQUxMT0M6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmMgPSBwbWUtPm1QYXJhbWV0ZXJzLmFsbG9jYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgcm91dGluZSB3b3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQgYnkgdGhpcyB0aW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gU28sIGp1c3QgdXBkYXRlIGVycm9yIGpvYiBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9zdGF0dXMgPSByYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJQYXJhbSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ01EX0RFRl9QQVJBTV9JTklUOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJjID0gcG1lLT5nZXREZWZKb2JTdGF0dXMocG1lLT5tUGFyYW1BbGxvY0pvYik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2Jfc3RhdHVzID0gcmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiUGFyYW0gaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPnNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9FUlJPUl9VTktOT1dOLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2FtSWQgPSBwbWUtPm1DYW1lcmFJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9jYXBhYmlsaXR5X3QgKiBjYXAgPSBnQ2FtQ2FwYWJpbGl0eVtjYW1JZF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbWUtPm1DYW1lcmFIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkNhbWVyYSBoYW5kbGUgaXMgbnVsbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9zdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5zZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfRVJST1JfVU5LTk9XTiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyBQb3N0UHJvYyBuZWVkIGNhbGlicmF0aW9uIGRhdGEgYXMgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWUgZm9yIGpwZWdfb3BlbiBhbmQgY2FsaWJyYXRpb24gZGF0YSBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgcGFyYW0gZm9yIG5vdywgc28gcGFyYW1zIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgcG9zdHByb2MgaW5pdAorICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBwbWUtPm1QYXJhbWV0ZXJzLmluaXQoY2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPm1DYW1lcmFIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9zdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIlBhcmFtZXRlciBJbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPnNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9FUlJPUl9VTktOT1dOLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHJlbGF0ZWQgY2FtIGNhbGlicmF0aW9uIG9ubHkgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1YWwgY2FtZXJhIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbWUtPmdldFJlbGF0ZWRDYW1TeW5jSW5mbygpLT5zeW5jX2NvbnRyb2wgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09OKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBwbWUtPm1QYXJhbWV0ZXJzLmdldFJlbGF0ZWRDYW1DYWxpYnJhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwbWUtPm1KcGVnTWV0YWRhdGEub3RwX2NhbGlicmF0aW9uX2RhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dEKCJEdW1waW5nIENhbGlicmF0aW9uIERhdGEgVmVyc2lvbiBJZCAlZiByYyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPm1KcGVnTWV0YWRhdGEub3RwX2NhbGlicmF0aW9uX2RhdGEuY2FsaWJyYXRpb25fZm9ybWF0X3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iX3N0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImdldFJlbGF0ZWRDYW1DYWxpYnJhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5zZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0VSUk9SX1VOS05PV04sIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tX2JSZWxDYW1DYWxpYlZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tSnBlZ01ldGFkYXRhLnNlbnNvcl9tb3VudF9hbmdsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwLT5zZW5zb3JfbW91bnRfYW5nbGU7CisgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPm1KcGVnTWV0YWRhdGEuZGVmYXVsdF9zZW5zb3JfZmxpcCA9IEZMSVBfTk9ORTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tUGFyYW1ldGVycy5zZXRNaW5QcE1hc2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwLT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW1fanBlZ19kZWJ1Z19leGlmX3BhcmFtc190ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbGxvYyhzaXplb2YobW1fanBlZ19kZWJ1Z19leGlmX3BhcmFtc190KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiT3V0IG9mIE1lbW9yeS4gQWxsb2NhdGlvbiBmYWlsZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzQSBkZWJ1ZyBleGlmIHBhcmFtcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9zdGF0dXMgPSBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5zZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfRVJST1JfVU5LTk9XTiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocG1lLT5tRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihtbV9qcGVnX2RlYnVnX2V4aWZfcGFyYW1zX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENNRF9ERUZfR0VORVJJQzoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQmFja2dyb3VuZFRhc2sgKmJnVGFzayA9IGR3LT5hcmdzLmdlbmVyaWNBcmdzOworICAgICAgICAgICAgICAgICAgICAgICAgam9iX3N0YXR1cyA9IGJnVGFzay0+YmdGdW5jdGlvbihiZ1Rhc2stPmJnQXJncyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiSW5jb3JyZWN0IGNvbW1hbmQgOiAlZCIsIGR3LT5jbWQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBtZS0+ZGVxdWV1ZURlZmVycmVkV29yayhkdywgam9iX3N0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1RZUEVfRVhJVDoKKyAgICAgICAgICAgIHJ1bm5pbmcgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHJ1bm5pbmcpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcXVldWVEZWZlcnJlZFdvcmsKKyAqCisgKiBERVNDUklQVElPTjogZnVuY3Rpb24gd2hpY2ggcXVldWVzIGRlZmVycmVkIHRhc2tzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjbWQgICAgIDogZGVmZXJyZWQgdGFzaworICogICBAYXJncyAgICA6IGRlZmVycmVkIHRhc2sgYXJndW1lbnRzCisgKgorICogUkVUVVJOICAgICA6IGpvYiBpZCBvZiBkZWZlcnJlZCBqb2IKKyAqICAgICAgICAgICAgOiAwIGluIGNhc2Ugb2YgZXJyb3IKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cXVldWVEZWZlcnJlZFdvcmsoRGVmZXJyZWRXb3JrQ21kIGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmVyV29ya0FyZ3MgYXJncykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtRGVmTG9jayk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgTUFYX09OR09JTkdfSk9CUzsgKytpKSB7CisgICAgICAgIGlmIChtRGVmT25nb2luZ0pvYnNbaV0ubURlZkpvYklkID09IDApIHsKKyAgICAgICAgICAgIERlZldvcmsgKmR3ID0gbmV3IERlZldvcmsoY21kLCBzTmV4dEpvYklkLCBhcmdzKTsKKyAgICAgICAgICAgIGlmICghZHcpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJvdXQgb2YgbWVtb3J5LiIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1DbWRRdWV1ZS5lbnF1ZXVlKGR3KSkgeworICAgICAgICAgICAgICAgIG1EZWZPbmdvaW5nSm9ic1tpXS5tRGVmSm9iSWQgPSBzTmV4dEpvYklkKys7CisgICAgICAgICAgICAgICAgbURlZk9uZ29pbmdKb2JzW2ldLm1EZWZKb2JTdGF0dXMgPSAwOworICAgICAgICAgICAgICAgIGlmIChzTmV4dEpvYklkID09IDApIHsgLy8gaGFuZGxlIG92ZXJmbG93CisgICAgICAgICAgICAgICAgICAgIHNOZXh0Sm9iSWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRXb3JrVGhyZWFkLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX0RPX05FWFRfSk9CLAorICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1EZWZPbmdvaW5nSm9ic1tpXS5tRGVmSm9iSWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0QoIkNvbW1hbmQgcXVldWUgbm90IGFjdGl2ZSEgY21kID0gJWQiLCBjbWQpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBkdzsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpbml0SnBlZ0hhbmRsZQorICoKKyAqIERFU0NSSVBUSU9OOiBPcGVucyBKUEVHIGNsaWVudCBhbmQgZ2V0cyBhIGhhbmRsZS4KKyAqICAgICAgICAgICAgICAgICAgICAgU2VuZHMgRHVhbCBjYW0gY2FsaWJyYXRpb24gaW5mbyBpZiBwcmVzZW50CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjppbml0SnBlZ0hhbmRsZSgpIHsKKyAgICAvLyBDaGVjayBpZiBKUEVHIGNsaWVudCBoYW5kbGUgaXMgcHJlc2VudAorICAgIExPR0goIkUiKTsKKyAgICBpZighbUpwZWdDbGllbnRIYW5kbGUpIHsKKyAgICAgICAgbW1fZGltZW5zaW9uIG1heF9zaXplID0gezAsIDB9OworICAgICAgICBjYW1fZGltZW5zaW9uX3Qgc2l6ZTsKKworICAgICAgICBtUGFyYW1ldGVycy5nZXRNYXhQaWNTaXplKHNpemUpOworICAgICAgICBtYXhfc2l6ZS53ID0gc2l6ZS53aWR0aDsKKyAgICAgICAgbWF4X3NpemUuaCA9IHNpemUuaGVpZ2h0OworCisgICAgICAgIGlmIChnZXRSZWxhdGVkQ2FtU3luY0luZm8oKS0+c3luY19jb250cm9sID09IENBTV9TWU5DX1JFTEFURURfU0VOU09SU19PTikgeworICAgICAgICAgICAgaWYgKG1fYlJlbENhbUNhbGliVmFsaWQpIHsKKyAgICAgICAgICAgICAgICBtSnBlZ0NsaWVudEhhbmRsZSA9IGpwZWdfb3BlbigmbUpwZWdIYW5kbGUsICZtSnBlZ01wb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zaXplLCAmbUpwZWdNZXRhZGF0YSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1KcGVnQ2xpZW50SGFuZGxlID0gIGpwZWdfb3BlbigmbUpwZWdIYW5kbGUsICZtSnBlZ01wb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9zaXplLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1KcGVnQ2xpZW50SGFuZGxlID0ganBlZ19vcGVuKCZtSnBlZ0hhbmRsZSwgTlVMTCwgbWF4X3NpemUsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGlmICghbUpwZWdDbGllbnRIYW5kbGUpIHsKKyAgICAgICAgICAgIExPR0UoIkVycm9yICEhIGpwZWdfb3BlbiBmYWlsZWQhISAiKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIC8vIFNldCBKUEVHIGluaXRpYWxpemVkIGFzIHRydWUgdG8gc2lnbmlmeSB0aGF0IHRoaXMgY2FtZXJhCisgICAgICAgIC8vIGhhcyBpbml0aWFsaXplZCB0aGUgaGFuZGxlCisgICAgICAgIG1KcGVnSGFuZGxlT3duZXIgPSB0cnVlOworICAgIH0KKyAgICBMT0dIKCJYIG1KcGVnSGFuZGxlT3duZXI6ICVkLCBtSnBlZ0NsaWVudEhhbmRsZTogJWQgY2FtZXJhIGlkOiAlZCIsCisgICAgICAgICAgICAgbUpwZWdIYW5kbGVPd25lciwgbUpwZWdDbGllbnRIYW5kbGUsIG1DYW1lcmFJZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGRlaW5pdEpwZWdIYW5kbGUKKyAqCisgKiBERVNDUklQVElPTjogQ2xvc2VzIEpQRUcgY2xpZW50IHVzaW5nIGhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6ZGVpbml0SnBlZ0hhbmRsZSgpIHsKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgTE9HSCgiRSIpOworICAgIC8vIENoZWNrIGlmIEpQRUcgY2xpZW50IGhhbmRsZSBpcyBwcmVzZW50IGFuZCBpbml0ZWQgYnkgdGhpcyBjYW1lcmEKKyAgICBpZihtSnBlZ0hhbmRsZU93bmVyICYmIG1KcGVnQ2xpZW50SGFuZGxlKSB7CisgICAgICAgIHJjID0gbUpwZWdIYW5kbGUuY2xvc2UobUpwZWdDbGllbnRIYW5kbGUpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkVycm9yISEgQ2xvc2luZyBtSnBlZ0NsaWVudEhhbmRsZTogJWQgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgIG1KcGVnQ2xpZW50SGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQoJm1KcGVnSGFuZGxlLCAwLCBzaXplb2YobUpwZWdIYW5kbGUpKTsKKyAgICAgICAgbWVtc2V0KCZtSnBlZ01wb0hhbmRsZSwgMCwgc2l6ZW9mKG1KcGVnTXBvSGFuZGxlKSk7CisgICAgICAgIG1KcGVnSGFuZGxlT3duZXIgPSBmYWxzZTsKKyAgICB9CisgICAgbUpwZWdDbGllbnRIYW5kbGUgPSAwOworICAgIExPR0goIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0SnBlZ0hhbmRsZUluZm8KKyAqCisgKiBERVNDUklQVElPTjogc2V0cyBKUEVHIGNsaWVudCBoYW5kbGUgaW5mbworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgICAgICAgICAgICAgIEBvcHMgICAgICAgICAgICAgICAgICAgIDogSlBFRyBvcHMKKyAqICAgICAgICAgICAgICAgICAgQG1wb19vcHMgICAgICAgICAgICAgOiBKcGVnIE1QTyBvcHMKKyAqICAgICAgICAgICAgICAgICAgQHBKcGVnQ2xpZW50SGFuZGxlIDogby9wIEpwZWcgQ2xpZW50IEhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c2V0SnBlZ0hhbmRsZUluZm8obW1fanBlZ19vcHNfdCAqb3BzLAorICAgICAgICBtbV9qcGVnX21wb19vcHNfdCAqbXBvX29wcywgdWludDMyX3QgcEpwZWdDbGllbnRIYW5kbGUpIHsKKworICAgIGlmIChwSnBlZ0NsaWVudEhhbmRsZSAmJiBvcHMgJiYgbXBvX29wcykgeworICAgICAgICBMT0dIKCJTZXR0aW5nIEpQRUcgY2xpZW50IGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgcEpwZWdDbGllbnRIYW5kbGUpOworICAgICAgICBtZW1jcHkoJm1KcGVnSGFuZGxlLCBvcHMsIHNpemVvZihtbV9qcGVnX29wc190KSk7CisgICAgICAgIG1lbWNweSgmbUpwZWdNcG9IYW5kbGUsIG1wb19vcHMsIHNpemVvZihtbV9qcGVnX21wb19vcHNfdCkpOworICAgICAgICBtSnBlZ0NsaWVudEhhbmRsZSA9IHBKcGVnQ2xpZW50SGFuZGxlOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBMT0dFKCJFcnJvciEhIE5vIEhhbmRsZSBmb3VuZDogJWQiLAorICAgICAgICAgICAgICAgIHBKcGVnQ2xpZW50SGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0SnBlZ0hhbmRsZUluZm8KKyAqCisgKiBERVNDUklQVElPTjogZ2V0cyBKUEVHIGNsaWVudCBoYW5kbGUgaW5mbworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgICAgICAgICAgICAgIEBvcHMgICAgICAgICAgICAgICAgICAgIDogSlBFRyBvcHMKKyAqICAgICAgICAgICAgICAgICAgQG1wb19vcHMgICAgICAgICAgICAgOiBKcGVnIE1QTyBvcHMKKyAqICAgICAgICAgICAgICAgICAgQHBKcGVnQ2xpZW50SGFuZGxlIDogby9wIEpwZWcgQ2xpZW50IEhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Z2V0SnBlZ0hhbmRsZUluZm8obW1fanBlZ19vcHNfdCAqb3BzLAorICAgICAgICBtbV9qcGVnX21wb19vcHNfdCAqbXBvX29wcywgdWludDMyX3QgKnBKcGVnQ2xpZW50SGFuZGxlKSB7CisKKyAgICBpZiAoTk9fRVJST1IgIT0gd2FpdERlZmVycmVkV29yayhtSW5pdFBQcm9jSm9iKSkgeworICAgICAgICBMT0dFKCJJbml0IFBQcm9jIERlZmVycmVkIHdvcmsgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICAvLyBDb3B5IEpQRUcgb3BzIGlmIHByZXNlbnQKKyAgICBpZiAob3BzICYmIG1wb19vcHMgJiYgcEpwZWdDbGllbnRIYW5kbGUpIHsKKyAgICAgICAgbWVtY3B5KG9wcywgJm1KcGVnSGFuZGxlLCBzaXplb2YobW1fanBlZ19vcHNfdCkpOworICAgICAgICBtZW1jcHkobXBvX29wcywgJm1KcGVnTXBvSGFuZGxlLCBzaXplb2YobW1fanBlZ19tcG9fb3BzX3QpKTsKKyAgICAgICAgKnBKcGVnQ2xpZW50SGFuZGxlID0gbUpwZWdDbGllbnRIYW5kbGU7CisgICAgICAgIExPR0goIkdldHRpbmcgSlBFRyBjbGllbnQgaGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICBwSnBlZ0NsaWVudEhhbmRsZSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkZXF1ZXVlRGVmZXJyZWRXb3JrCisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHdoaWNoIGRlcXVldWVzIGRlZmVycmVkIHRhc2tzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkdyAgICAgIDogZGVmZXJyZWQgd29yaworICogICBAam9iU3RhdHVzOiBkZWZlcnJlZCB0YXNrIGpvYiBzdGF0dXMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpkZXF1ZXVlRGVmZXJyZWRXb3JrKERlZldvcmsqIGR3LCBpbnQzMl90IGpvYlN0YXR1cykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtRGVmTG9jayk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IE1BWF9PTkdPSU5HX0pPQlM7IGkrKykgeworICAgICAgICBpZiAobURlZk9uZ29pbmdKb2JzW2ldLm1EZWZKb2JJZCA9PSBkdy0+aWQpIHsKKyAgICAgICAgICAgIGlmIChqb2JTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtRGVmT25nb2luZ0pvYnNbaV0ubURlZkpvYlN0YXR1cyA9IGpvYlN0YXR1czsKKyAgICAgICAgICAgICAgICBMT0dIKCJ1cGRhdGluZyBqb2Igc3RhdHVzICVkIGZvciBpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgam9iU3RhdHVzLCBkdy0+aWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtRGVmT25nb2luZ0pvYnNbaV0ubURlZkpvYklkID0gMDsKKyAgICAgICAgICAgICAgICBtRGVmT25nb2luZ0pvYnNbaV0ubURlZkpvYlN0YXR1cyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGUgZHc7CisgICAgICAgICAgICBtRGVmQ29uZC5icm9hZGNhc3QoKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldERlZkpvYlN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBHZXRzIGlmIGEgZGVmZXJyZWQgdGFzayBpcyBzdWNjZXNzL2ZhaWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGpvYl9pZCAgOiBkZWZlcnJlZCB0YXNrIGlkCisgKgorICogUkVUVVJOICAgICA6IE5PX0VSUk9SIGlmIHRoZSBqb2Igc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlCisgKgorICogUFJFQ09ORElUSU9OIDogbURlZkxvY2sgaXMgaGVsZCBieSBjdXJyZW50IHRocmVhZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmdldERlZkpvYlN0YXR1cyh1aW50MzJfdCAmam9iX2lkKQoreworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfT05HT0lOR19KT0JTOyBpKyspIHsKKyAgICAgICAgaWYgKG1EZWZPbmdvaW5nSm9ic1tpXS5tRGVmSm9iSWQgPT0gam9iX2lkKSB7CisgICAgICAgICAgICBpZiAoIE5PX0VSUk9SICE9IG1EZWZPbmdvaW5nSm9ic1tpXS5tRGVmSm9iU3RhdHVzICkgeworICAgICAgICAgICAgICAgIExPR0UoImpvYl9pZCAoJWQpIHdhcyBmYWlsZWQiLCBqb2JfaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBtRGVmT25nb2luZ0pvYnNbaV0ubURlZkpvYlN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2hlY2tEZWZlcnJlZFdvcmsKKyAqCisgKiBERVNDUklQVElPTjogY2hlY2tzIGlmIGEgZGVmZXJyZWQgdGFzayBpcyBpbiBwcm9ncmVzcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAam9iX2lkICA6IGRlZmVycmVkIHRhc2sgaWQKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZSBpZiB0aGUgdGFzayBleGlzdHMsIG90aGVyd2lzZSBmYWxzZQorICoKKyAqIFBSRUNPTkRJVElPTiA6IG1EZWZMb2NrIGlzIGhlbGQgYnkgY3VycmVudCB0aHJlYWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpjaGVja0RlZmVycmVkV29yayh1aW50MzJfdCAmam9iX2lkKQoreworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfT05HT0lOR19KT0JTOyBpKyspIHsKKyAgICAgICAgaWYgKG1EZWZPbmdvaW5nSm9ic1tpXS5tRGVmSm9iSWQgPT0gam9iX2lkKSB7CisgICAgICAgICAgICByZXR1cm4gKE5PX0VSUk9SID09IG1EZWZPbmdvaW5nSm9ic1tpXS5tRGVmSm9iU3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogd2FpdERlZmVycmVkV29yaworICoKKyAqIERFU0NSSVBUSU9OOiB3YWl0cyBmb3IgYSBkZWZlcnJlZCB0YXNrIHRvIGZpbmlzaAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAam9iX2lkICA6IGRlZmVycmVkIHRhc2sgaWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OndhaXREZWZlcnJlZFdvcmsodWludDMyX3QgJmpvYl9pZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtRGVmTG9jayk7CisKKyAgICBpZiAoam9iX2lkID09IDApIHsKKyAgICAgICAgTE9HRCgiSW52YWxpZCBqb2IgaWQgJWQiLCBqb2JfaWQpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgd2hpbGUgKGNoZWNrRGVmZXJyZWRXb3JrKGpvYl9pZCkgPT0gdHJ1ZSApIHsKKyAgICAgICAgbURlZkNvbmQud2FpdFJlbGF0aXZlKG1EZWZMb2NrLCBDQU1FUkFfREVGRVJSRURfVEhSRUFEX1RJTUVPVVQpOworICAgIH0KKyAgICByZXR1cm4gZ2V0RGVmSm9iU3RhdHVzKGpvYl9pZCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2NoZWR1bGVCYWNrZ3JvdW5kVGFzaworICoKKyAqIERFU0NSSVBUSU9OOiBSdW4gYSByZXF1ZXN0ZWQgdGFzayBpbiB0aGUgZGVmZXJyZWQgdGhyZWFkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBiZ1Rhc2sgIDogVGFzayB0byBwZXJmb3JtIGluIHRoZSBiYWNrZ3JvdW5kCisgKgorICogUkVUVVJOICAgICA6IGpvYiBpZCBvZiBkZWZlcnJlZCBqb2IKKyAqICAgICAgICAgICAgOiAwIGluIGNhc2Ugb2YgZXJyb3IKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c2NoZWR1bGVCYWNrZ3JvdW5kVGFzayhCYWNrZ3JvdW5kVGFzayogYmdUYXNrKQoreworICAgIERlZmVyV29ya0FyZ3MgYXJnczsKKyAgICBtZW1zZXQoJmFyZ3MsIDAsIHNpemVvZihEZWZlcldvcmtBcmdzKSk7CisgICAgYXJncy5nZW5lcmljQXJncyA9IGJnVGFzazsKKworICAgIHJldHVybiBxdWV1ZURlZmVycmVkV29yayhDTURfREVGX0dFTkVSSUMsIGFyZ3MpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHdhaXRGb3JCYWNrZ3JvdW5kVGFzaworICoKKyAqIERFU0NSSVBUSU9OOiBXYWl0IGZvciBhIGJhY2tncm91bmQgdGFzayB0byBjb21wbGV0ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAdGFza0lkICA6IFRhc2sgaWQgdG8gd2FpdCBmb3IKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OndhaXRGb3JCYWNrZ3JvdW5kVGFzayh1aW50MzJfdCYgdGFza0lkKQoreworICAgIHJldHVybiB3YWl0RGVmZXJyZWRXb3JrKHRhc2tJZCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbmVlZERlZmVyZWRBbGxvY2F0aW9uCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIHRvIGRlY2lkZSBiYWNrZ3JvdW5kIHRhc2sgZm9yIHN0cmVhbXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN0cmVhbV90eXBlICA6IHN0cmVhbSB0eXBlCisgKgorICogUkVUVVJOICAgICA6IHRydWUgLSBpZiBiYWNrZ3JvdW5kIHRhc2sgaXMgbmVlZGVkCisgKiAgICAgICAgICAgICAgZmFsc2UgLSAgaWYgYmFja2dyb3VuZCB0YXNrIGlzIE5PVCBuZWVkZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpuZWVkRGVmZXJyZWQoY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUpCit7CisgICAgaWYgKChzdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVyAmJiBtUHJldmlld1dpbmRvdyA9PSBOVUxMKQorICAgICAgICAgICAgfHwgKHN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUykpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICgoc3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX1JBVykKKyAgICAgICAgICAgICYmIChtUGFyYW1ldGVycy5nZXRvZmZsaW5lUkFXKCkpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoKHN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCkKKyAgICAgICAgICAgICYmICghbVBhcmFtZXRlcnMuZ2V0UmVjb3JkaW5nSGludFZhbHVlKCkpKXsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgaWYgKChzdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVykKKyAgICAgICAgICAgIHx8IChzdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpCisgICAgICAgICAgICB8fCAoc3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX1JBVykKKyAgICAgICAgICAgIHx8IChzdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVcpKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIGlmIChzdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfVklERU8pIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNSZWd1bGFyQ2FwdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBDaGVjayBjb25maWd1cmF0aW9uIGZvciByZWd1bGFyIGNhdHB1cmUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZSAtIHJlZ3VsYXIgY2FwdHVyZQorICogICAgICAgICAgICAgIGZhbHNlIC0gb3RoZXIgdHlwZSBvZiBjYXB0dXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6aXNSZWd1bGFyQ2FwdHVyZSgpCit7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKworICAgIGlmIChudW1PZlNuYXBzaG90c0V4cGVjdGVkKCkgPT0gMSAmJgorICAgICAgICAhaXNMb25nc2hvdEVuYWJsZWQoKSAmJgorICAgICAgICAhbVBhcmFtZXRlcnMuaXNIRFJFbmFibGVkKCkgJiYKKyAgICAgICAgIW1QYXJhbWV0ZXJzLmdldFJlY29yZGluZ0hpbnRWYWx1ZSgpICYmCisgICAgICAgICFpc1pTTE1vZGUoKSAmJiAoIW1QYXJhbWV0ZXJzLmdldG9mZmxpbmVSQVcoKXx8IG1QYXJhbWV0ZXJzLmdldFF1YWRyYUNmYSgpKSkgeworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRMb2dMZXZlbAorICoKKyAqIERFU0NSSVBUSU9OOiBSZWFkcyB0aGUgbG9nIGxldmVsIHByb3BlcnR5IGludG8gYSB2YXJpYWJsZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBOb25lCisgKgorICogUkVUVVJOICAgICA6CisgKiAgIE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpnZXRMb2dMZXZlbCgpCit7CisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmtwaS5kZWJ1ZyIsIHByb3AsICIxIik7CisgICAgZ0twaURlYnVnTGV2ZWwgPSBhdG9pKHByb3ApOworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRTZW5zb3JUeXBlCisgKgorICogREVTQ1JJUFRJT046IFJldHVybnMgdGhlIHR5cGUgb2Ygc2Vuc29yIGJlaW5nIHVzZWQgd2hldGhlciBZVVYgb3IgQmF5ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBUeXBlIG9mIHNlbnNvciAtIGJheWVyIG9yIFlVVgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY2FtX3NlbnNvcl90IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmdldFNlbnNvclR5cGUoKQoreworICAgIHJldHVybiBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5zZW5zb3JfdHlwZS5zZW5zX3R5cGU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RhcnRSQVdDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IHN0YXJ0IFJBVyBDaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwQ2hhbm5lbCAgOiBTcmMgY2hhbm5lbCB0byBsaW5rIHRoaXMgUkFXIGNoYW5uZWwuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzdGFydFJBV0NoYW5uZWwoUUNhbWVyYUNoYW5uZWwgKnBNZXRhQ2hhbm5lbCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsID0gbV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfUkFXXTsKKyAgICBpZiAoKE5VTEwgIT0gcENoYW5uZWwpICYmIChtUGFyYW1ldGVycy5nZXRvZmZsaW5lUkFXKCkpKSB7CisgICAgICAgIC8vIEZpbmQgYW5kIHRyeSB0byBsaW5rIGEgbWV0YWRhdGEgc3RyZWFtIGZyb20gcHJldmlldyBjaGFubmVsCisgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBNZXRhU3RyZWFtID0gTlVMTDsKKworICAgICAgICBpZiAocE1ldGFDaGFubmVsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbU51bSA9IHBNZXRhQ2hhbm5lbC0+Z2V0TnVtT2ZTdHJlYW1zKCk7CisgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0gTlVMTDsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDAgOyBpIDwgc3RyZWFtTnVtIDsgaSsrICkgeworICAgICAgICAgICAgICAgIHBTdHJlYW0gPSBwTWV0YUNoYW5uZWwtPmdldFN0cmVhbUJ5SW5kZXgoaSk7CisgICAgICAgICAgICAgICAgaWYgKChOVUxMICE9IHBTdHJlYW0pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBID09IHBTdHJlYW0tPmdldE15VHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBwTWV0YVN0cmVhbSA9IHBTdHJlYW07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKE5VTEwgIT0gcE1ldGFTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICByYyA9IHBDaGFubmVsLT5saW5rU3RyZWFtKHBNZXRhQ2hhbm5lbCwgcE1ldGFTdHJlYW0pOworICAgICAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJNZXRhZGF0YSBzdHJlYW0gbGluayBmYWlsZWQgJWQiLCByYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJjID0gcENoYW5uZWwtPnN0YXJ0KCk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdGFydFJlY29yZGluZworICoKKyAqIERFU0NSSVBUSU9OOiBzdGFydCByZWNvcmRpbmcgaW1wbAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzdG9wUkFXQ2hhbm5lbCgpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIHJjID0gc3RvcENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1JBVyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzTG93UG93ZXJNb2RlCisgKgorICogREVTQ1JJUFRJT046IFJldHVybnMgVFJVRSBpZiBsb3cgcG93ZXIgbW9kZSBzZXR0aW5ncyBhcmUgdG8gYmUgYXBwbGllZCBmb3IgdmlkZW8gcmVjb3JkaW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogVFJVRS9GQUxTRQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjppc0xvd1Bvd2VyTW9kZSgpCit7CisgICAgY2FtX2RpbWVuc2lvbl90IGRpbTsKKyAgICBtUGFyYW1ldGVycy5nZXRTdHJlYW1EaW1lbnNpb24oQ0FNX1NUUkVBTV9UWVBFX1ZJREVPLCBkaW0pOworCisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgcHJvcGVydHlfZ2V0KCJjYW1lcmEubG93cG93ZXIucmVjb3JkLmVuYWJsZSIsIHByb3AsICIwIik7CisgICAgaW50IGVuYWJsZSA9IGF0b2kocHJvcCk7CisKKyAgICAvL0VuYWJsZSBsb3cgcG93ZXIgbW9kZSBpZiA6CisgICAgLy8xLiBWaWRlbyByZXNvbHV0aW9uIGlzIDJrICgyMDQ4eDEwODApIG9yIGFib3ZlIGFuZAorICAgIC8vMi4gY2FtZXJhLmxvd3Bvd2VyLnJlY29yZC5lbmFibGUgaXMgc2V0CisKKyAgICBib29sIGlzTG93cG93ZXIgPSBtUGFyYW1ldGVycy5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKSAmJiBlbmFibGUKKyAgICAgICAgICAgICYmICgoZGltLndpZHRoICogZGltLmhlaWdodCkgPj0gKDIwNDggKiAxMDgwKSk7CisgICAgcmV0dXJuIGlzTG93cG93ZXI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0Qm9vdFRvTW9ub1RpbWVPZmZzZXQKKyAqCisgKiBERVNDUklQVElPTjogQ2FsY3VsYXRlIG9mZnNldCB0aGF0IGlzIHVzZWQgdG8gY29udmVydCBmcm9tCisgKiAgICAgICAgICAgICAgY2xvY2sgZG9tYWluIG9mIGJvb3QgdG8gbW9ub3RvbmljCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogY2xvY2sgb2Zmc2V0IGJldHdlZW4gYm9vdHRpbWUgYW5kIG1vbm90b25pYyB0aW1lLgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworbnNlY3NfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpnZXRCb290VG9Nb25vVGltZU9mZnNldCgpCit7CisgICAgLy8gdHJ5IHRocmVlIHRpbWVzIHRvIGdldCB0aGUgY2xvY2sgb2Zmc2V0LCBjaG9vc2UgdGhlIG9uZQorICAgIC8vIHdpdGggdGhlIG1pbmltdW0gZ2FwIGluIG1lYXN1cmVtZW50cy4KKyAgICBjb25zdCBpbnQgdHJpZXMgPSAzOworICAgIG5zZWNzX3QgYmVzdEdhcCwgbWVhc3VyZWQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cmllczsgKytpKSB7CisgICAgICAgIGNvbnN0IG5zZWNzX3QgdG1vbm8gPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgICAgIGNvbnN0IG5zZWNzX3QgdGJhc2UgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX0JPT1RUSU1FKTsKKyAgICAgICAgY29uc3QgbnNlY3NfdCB0bW9ubzIgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgICAgIGNvbnN0IG5zZWNzX3QgZ2FwID0gdG1vbm8yIC0gdG1vbm87CisgICAgICAgIGlmIChpID09IDAgfHwgZ2FwIDwgYmVzdEdhcCkgeworICAgICAgICAgICAgYmVzdEdhcCA9IGdhcDsKKyAgICAgICAgICAgIG1lYXN1cmVkID0gdGJhc2UgLSAoKHRtb25vICsgdG1vbm8yKSA+PiAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWVhc3VyZWQ7Cit9CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmEySFdJLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmEySFdJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0NTU2ZAotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYTJIV0kuaApAQCAtMCwwICsxLDgwMCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIF9fUUNBTUVSQTJIQVJEV0FSRUlOVEVSRkFDRV9IX18KKyNkZWZpbmUgX19RQ0FNRVJBMkhBUkRXQVJFSU5URVJGQUNFX0hfXworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgImNhbWVyYS5oIgorI2luY2x1ZGUgIlFDYW1lcmFBbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJRQ2FtZXJhQ2hhbm5lbC5oIgorI2luY2x1ZGUgIlFDYW1lcmFDbWRUaHJlYWQuaCIKKyNpbmNsdWRlICJRQ2FtZXJhRGlzcGxheS5oIgorI2luY2x1ZGUgIlFDYW1lcmFNZW0uaCIKKyNpbmNsdWRlICJRQ2FtZXJhUGFyYW1ldGVycy5oIgorI2luY2x1ZGUgIlFDYW1lcmFQYXJhbWV0ZXJzSW50Zi5oIgorI2luY2x1ZGUgIlFDYW1lcmFQZXJmLmgiCisjaW5jbHVkZSAiUUNhbWVyYVBvc3RQcm9jLmgiCisjaW5jbHVkZSAiUUNhbWVyYVF1ZXVlLmgiCisjaW5jbHVkZSAiUUNhbWVyYVN0cmVhbS5oIgorI2luY2x1ZGUgIlFDYW1lcmFTdGF0ZU1hY2hpbmUuaCIKKyNpbmNsdWRlICJRQ2FtZXJhVGhlcm1hbEFkYXB0ZXIuaCIKKworI2lmZGVmIFRBUkdFVF9UU19NQUtFVVAKKyNpbmNsdWRlICJ0c19tYWtldXBfZW5naW5lLmgiCisjaW5jbHVkZSAidHNfZGV0ZWN0ZmFjZV9lbmdpbmUuaCIKKyNlbmRpZgorZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAibW1fY2FtZXJhX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgIm1tX2pwZWdfaW50ZXJmYWNlLmgiCit9CisKKyNpbmNsdWRlICJRQ2FtZXJhVHJhY2UuaCIKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKyAgICBRQ0FNRVJBX0NIX1RZUEVfWlNMLAorICAgIFFDQU1FUkFfQ0hfVFlQRV9DQVBUVVJFLAorICAgIFFDQU1FUkFfQ0hfVFlQRV9QUkVWSUVXLAorICAgIFFDQU1FUkFfQ0hfVFlQRV9WSURFTywKKyAgICBRQ0FNRVJBX0NIX1RZUEVfU05BUFNIT1QsCisgICAgUUNBTUVSQV9DSF9UWVBFX1JBVywKKyAgICBRQ0FNRVJBX0NIX1RZUEVfTUVUQURBVEEsCisgICAgUUNBTUVSQV9DSF9UWVBFX0FOQUxZU0lTLAorICAgIFFDQU1FUkFfQ0hfVFlQRV9DQUxMQkFDSywKKyAgICBRQ0FNRVJBX0NIX1RZUEVfTUFYCit9IHFjYW1lcmFfY2hfdHlwZV9lbnVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQzMl90IG1zZ190eXBlOworICAgIGludDMyX3QgZXh0MTsKKyAgICBpbnQzMl90IGV4dDI7Cit9IHFjYW1lcmFfZXZ0X2FyZ21fdDsKKworI2RlZmluZSBRQ0FNRVJBX0RVTVBfRlJNX1BSRVZJRVcgICAgICAgICAgICAgMQorI2RlZmluZSBRQ0FNRVJBX0RVTVBfRlJNX1ZJREVPICAgICAgICAgICAgICAgKDE8PDEpCisjZGVmaW5lIFFDQU1FUkFfRFVNUF9GUk1fU05BUFNIT1QgICAgICAgICAgICAoMTw8MikKKyNkZWZpbmUgUUNBTUVSQV9EVU1QX0ZSTV9USFVNQk5BSUwgICAgICAgICAgICgxPDwzKQorI2RlZmluZSBRQ0FNRVJBX0RVTVBfRlJNX1JBVyAgICAgICAgICAgICAgICAgKDE8PDQpCisjZGVmaW5lIFFDQU1FUkFfRFVNUF9GUk1fSlBFRyAgICAgICAgICAgICAgICAoMTw8NSkKKyNkZWZpbmUgUUNBTUVSQV9EVU1QX0ZSTV9JTlBVVF9SRVBST0NFU1MgICAgICgxPDw2KQorCisjZGVmaW5lIFFDQU1FUkFfRFVNUF9GUk1fTUFTS19BTEwgICAgMHgwMDAwMDBmZgorCisjZGVmaW5lIFFDQU1FUkFfSU9OX1VTRV9DQUNIRSAgIHRydWUKKyNkZWZpbmUgUUNBTUVSQV9JT05fVVNFX05PQ0FDSEUgZmFsc2UKKyNkZWZpbmUgTUFYX09OR09JTkdfSk9CUyAyNQorCisjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorCisjZGVmaW5lIEVYSUZfQVNDSUlfUFJFRklYX1NJWkUgICAgICAgICAgIDggICAvLyhzaXplb2YoRXhpZkFzY2lpUHJlZml4KSkKKwordHlwZWRlZiBlbnVtIHsKKyAgICBRQ0FNRVJBX05PVElGWV9DQUxMQkFDSywKKyAgICBRQ0FNRVJBX0RBVEFfQ0FMTEJBQ0ssCisgICAgUUNBTUVSQV9EQVRBX1RJTUVTVEFNUF9DQUxMQkFDSywKKyAgICBRQ0FNRVJBX0RBVEFfU05BUFNIT1RfQ0FMTEJBQ0sKK30gcWNhbWVyYV9jYWxsYmFja190eXBlX207CisKK3R5cGVkZWYgdm9pZCAoKmNhbWVyYV9yZWxlYXNlX2NhbGxiYWNrKSh2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2Jfc3RhdHVzKTsKK3R5cGVkZWYgdm9pZCAoKmpwZWdfZGF0YV9jYWxsYmFjaykoaW50MzJfdCBtc2dfdHlwZSwKKyAgICAgICAgY29uc3QgY2FtZXJhX21lbW9yeV90ICpkYXRhLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSwgdm9pZCAqdXNlciwKKyAgICAgICAgdWludDMyX3QgZnJhbWVfaWR4LCBjYW1lcmFfcmVsZWFzZV9jYWxsYmFjayByZWxlYXNlX2NiLAorICAgICAgICB2b2lkICpyZWxlYXNlX2Nvb2tpZSwgdm9pZCAqcmVsZWFzZV9kYXRhKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHFjYW1lcmFfY2FsbGJhY2tfdHlwZV9tICBjYl90eXBlOyAgICAvLyBldmVudCB0eXBlCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1zZ190eXBlOyAgIC8vIG1zZyB0eXBlCisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIGV4dDE7ICAgICAgIC8vIGV4dGVuZGVkIHBhcmFtZXRlcgorICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBleHQyOyAgICAgICAvLyBleHRlbmRlZCBwYXJhbWV0ZXIKKyAgICBjYW1lcmFfbWVtb3J5X3QgKiAgICAgICAgZGF0YTsgICAgICAgLy8gcHRyIHRvIGRhdGEgbWVtb3J5IHN0cnVjdAorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICBpbmRleDsgICAgICAvLyBpbmRleCBvZiB0aGUgYnVmIGluIHRoZSB3aG9sZSBidWZmZXIKKyAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOyAgLy8gYnVmZmVyIHRpbWVzdGFtcAorICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YTsgICAvLyBtZXRhIGRhdGEKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqdXNlcl9kYXRhOyAgLy8gYW55IGRhdGEgbmVlZHMgdG8gYmUgcmVsZWFzZWQgYWZ0ZXIgY2FsbGJhY2sKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqY29va2llOyAgICAgLy8gcmVsZWFzZSBjYWxsYmFjayBjb29raWUKKyAgICBjYW1lcmFfcmVsZWFzZV9jYWxsYmFjayAgcmVsZWFzZV9jYjsgLy8gcmVsZWFzZSBjYWxsYmFjaworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICBmcmFtZV9pbmRleDsgIC8vIGZyYW1lIGluZGV4IGZvciB0aGUgYnVmZmVyCit9IHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90OworCitjbGFzcyBRQ2FtZXJhQ2JOb3RpZmllciB7CitwdWJsaWM6CisgICAgUUNhbWVyYUNiTm90aWZpZXIoUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqcGFyZW50KSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3RpZnlDYiAoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhQ2IgKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YUNiVGltZXN0YW1wIChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29va2llIChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUpwZWdDYihOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUpwZWdDYWxsYmFja0Nvb2tpZShOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmVudCAocGFyZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFRKHJlbGVhc2VOb3RpZmljYXRpb25zLCB0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZShmYWxzZSl7fQorCisgICAgdmlydHVhbCB+UUNhbWVyYUNiTm90aWZpZXIoKTsKKworICAgIHZpcnR1YWwgaW50MzJfdCBub3RpZnlDYWxsYmFjayhxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCAmY2JBcmdzKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q2FsbGJhY2tzKGNhbWVyYV9ub3RpZnlfY2FsbGJhY2sgbm90aWZ5Q2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZGF0YV9jYWxsYmFjayBkYXRhQ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfZGF0YV90aW1lc3RhbXBfY2FsbGJhY2sgZGF0YUNiVGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2FsbGJhY2tDb29raWUpOworICAgIHZpcnR1YWwgdm9pZCBzZXRKcGVnQ2FsbEJhY2tzKAorICAgICAgICAgICAganBlZ19kYXRhX2NhbGxiYWNrIGpwZWdDYiwgdm9pZCAqY2FsbGJhY2tDb29raWUpOworICAgIHZpcnR1YWwgaW50MzJfdCBzdGFydFNuYXBzaG90cygpOworICAgIHZpcnR1YWwgdm9pZCBzdG9wU25hcHNob3RzKCk7CisgICAgdmlydHVhbCB2b2lkIGV4aXQoKTsKKyAgICBzdGF0aWMgdm9pZCAqIGNiTm90aWZ5Um91dGluZSh2b2lkICogZGF0YSk7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZU5vdGlmaWNhdGlvbnModm9pZCAqZGF0YSwgdm9pZCAqdXNlcl9kYXRhKTsKKyAgICBzdGF0aWMgYm9vbCBtYXRjaFNuYXBzaG90Tm90aWZpY2F0aW9ucyh2b2lkICpkYXRhLCB2b2lkICp1c2VyX2RhdGEpOworICAgIHN0YXRpYyBib29sIG1hdGNoUHJldmlld05vdGlmaWNhdGlvbnModm9pZCAqZGF0YSwgdm9pZCAqdXNlcl9kYXRhKTsKKyAgICBzdGF0aWMgYm9vbCBtYXRjaFRpbWVzdGFtcE5vdGlmaWNhdGlvbnModm9pZCAqZGF0YSwgdm9pZCAqdXNlcl9kYXRhKTsKKyAgICB2aXJ0dWFsIGludDMyX3QgZmx1c2hQcmV2aWV3Tm90aWZpY2F0aW9ucygpOworICAgIHZpcnR1YWwgaW50MzJfdCBmbHVzaFZpZGVvTm90aWZpY2F0aW9ucygpOworcHJpdmF0ZToKKworICAgIGNhbWVyYV9ub3RpZnlfY2FsbGJhY2sgICAgICAgICBtTm90aWZ5Q2I7CisgICAgY2FtZXJhX2RhdGFfY2FsbGJhY2sgICAgICAgICAgIG1EYXRhQ2I7CisgICAgY2FtZXJhX2RhdGFfdGltZXN0YW1wX2NhbGxiYWNrIG1EYXRhQ2JUaW1lc3RhbXA7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgKm1DYWxsYmFja0Nvb2tpZTsKKyAgICBqcGVnX2RhdGFfY2FsbGJhY2sgICAgICAgICAgICAgbUpwZWdDYjsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAqbUpwZWdDYWxsYmFja0Nvb2tpZTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICAgICAqbVBhcmVudDsKKworICAgIFFDYW1lcmFRdWV1ZSAgICAgbURhdGFROworICAgIFFDYW1lcmFDbWRUaHJlYWQgbVByb2NUaDsKKyAgICBib29sICAgICAgICAgICAgIG1BY3RpdmU7Cit9OworY2xhc3MgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSA6IHB1YmxpYyBRQ2FtZXJhQWxsb2NhdG9yLAorICAgICAgICBwdWJsaWMgUUNhbWVyYVRoZXJtYWxDYWxsYmFjaywgcHVibGljIFFDYW1lcmFBZGp1c3RGUFMKK3sKK3B1YmxpYzoKKyAgICAvKiBzdGF0aWMgdmFyaWFibGUgYW5kIGZ1bmN0aW9ucyBhY2Nlc3NlZCBieSBjYW1lcmEgc2VydmljZSAqLworICAgIHN0YXRpYyBjYW1lcmFfZGV2aWNlX29wc190IG1DYW1lcmFPcHM7CisKKyAgICBzdGF0aWMgaW50IHNldF9wcmV2aWV3X3dpbmRvdyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLAorICAgICAgICBzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICp3aW5kb3cpOworICAgIHN0YXRpYyB2b2lkIHNldF9DYWxsQmFja3Moc3RydWN0IGNhbWVyYV9kZXZpY2UgKiwKKyAgICAgICAgY2FtZXJhX25vdGlmeV9jYWxsYmFjayBub3RpZnlfY2IsCisgICAgICAgIGNhbWVyYV9kYXRhX2NhbGxiYWNrIGRhdGFfY2IsCisgICAgICAgIGNhbWVyYV9kYXRhX3RpbWVzdGFtcF9jYWxsYmFjayBkYXRhX2NiX3RpbWVzdGFtcCwKKyAgICAgICAgY2FtZXJhX3JlcXVlc3RfbWVtb3J5IGdldF9tZW1vcnksCisgICAgICAgIHZvaWQgKnVzZXIpOworICAgIHN0YXRpYyB2b2lkIGVuYWJsZV9tc2dfdHlwZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBpbnQzMl90IG1zZ190eXBlKTsKKyAgICBzdGF0aWMgdm9pZCBkaXNhYmxlX21zZ190eXBlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICosIGludDMyX3QgbXNnX3R5cGUpOworICAgIHN0YXRpYyBpbnQgbXNnX3R5cGVfZW5hYmxlZChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBpbnQzMl90IG1zZ190eXBlKTsKKyAgICBzdGF0aWMgaW50IHN0YXJ0X3ByZXZpZXcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisgICAgc3RhdGljIHZvaWQgc3RvcF9wcmV2aWV3KHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworICAgIHN0YXRpYyBpbnQgcHJldmlld19lbmFibGVkKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworICAgIHN0YXRpYyBpbnQgc3RvcmVfbWV0YV9kYXRhX2luX2J1ZmZlcnMoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiwgaW50IGVuYWJsZSk7CisgICAgc3RhdGljIGludCByZXN0YXJ0X3N0YXJ0X3ByZXZpZXcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisgICAgc3RhdGljIGludCByZXN0YXJ0X3N0b3BfcHJldmlldyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKyAgICBzdGF0aWMgaW50IHByZV9zdGFydF9yZWNvcmRpbmcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisgICAgc3RhdGljIGludCBzdGFydF9yZWNvcmRpbmcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisgICAgc3RhdGljIHZvaWQgc3RvcF9yZWNvcmRpbmcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisgICAgc3RhdGljIGludCByZWNvcmRpbmdfZW5hYmxlZChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlX3JlY29yZGluZ19mcmFtZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBjb25zdCB2b2lkICpvcGFxdWUpOworICAgIHN0YXRpYyBpbnQgYXV0b19mb2N1cyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKyAgICBzdGF0aWMgaW50IGNhbmNlbF9hdXRvX2ZvY3VzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworICAgIHN0YXRpYyBpbnQgcHJlX3Rha2VfcGljdHVyZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKyAgICBzdGF0aWMgaW50IHRha2VfcGljdHVyZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKyAgICBpbnQgdGFrZUxpdmVTbmFwc2hvdF9pbnRlcm5hbCgpOworICAgIGludCBjYW5jZWxMaXZlU25hcHNob3RfaW50ZXJuYWwoKTsKKyAgICBpbnQgdGFrZUJhY2tlbmRQaWNfaW50ZXJuYWwoYm9vbCAqSnBlZ01lbU9wdCwgY2hhciAqcmF3X2Zvcm1hdCk7CisgICAgdm9pZCBjbGVhckludFBlbmRpbmdFdmVudHMoKTsKKyAgICB2b2lkIGNoZWNrSW50UGljUGVuZGluZyhib29sIEpwZWdNZW1PcHQsIGNoYXIgKnJhd19mb3JtYXQpOworICAgIHN0YXRpYyBpbnQgY2FuY2VsX3BpY3R1cmUoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisgICAgc3RhdGljIGludCBzZXRfcGFyYW1ldGVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBjb25zdCBjaGFyICpwYXJtcyk7CisgICAgc3RhdGljIGludCBzdG9wX2FmdGVyX3NldF9wYXJhbXMoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisgICAgc3RhdGljIGludCBjb21taXRfcGFyYW1zKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworICAgIHN0YXRpYyBpbnQgcmVzdGFydF9hZnRlcl9zZXRfcGFyYW1zKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworICAgIHN0YXRpYyBjaGFyKiBnZXRfcGFyYW1ldGVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKyAgICBzdGF0aWMgdm9pZCBwdXRfcGFyYW1ldGVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBjaGFyICopOworICAgIHN0YXRpYyBpbnQgc2VuZF9jb21tYW5kKHN0cnVjdCBjYW1lcmFfZGV2aWNlICosCisgICAgICAgICAgICAgIGludDMyX3QgY21kLCBpbnQzMl90IGFyZzEsIGludDMyX3QgYXJnMik7CisgICAgc3RhdGljIGludCBzZW5kX2NvbW1hbmRfcmVzdGFydChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLAorICAgICAgICAgICAgaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworICAgIHN0YXRpYyBpbnQgZHVtcChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBpbnQgZmQpOworICAgIHN0YXRpYyBpbnQgY2xvc2VfY2FtZXJhX2RldmljZShod19kZXZpY2VfdCAqKTsKKworICAgIHN0YXRpYyBpbnQgcmVnaXN0ZXJfZmFjZV9pbWFnZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICppbWdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcHBfb2ZmbGluZV9zcmNfY29uZmlnX3QgKmNvbmZpZyk7CisgICAgc3RhdGljIGludCBwcmVwYXJlX3ByZXZpZXcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisgICAgc3RhdGljIGludCBwcmVwYXJlX3NuYXBzaG90KHN0cnVjdCBjYW1lcmFfZGV2aWNlICpkZXZpY2UpOworCitwdWJsaWM6CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSh1aW50MzJfdCBjYW1lcmFJZCk7CisgICAgdmlydHVhbCB+UUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSgpOworICAgIGludCBvcGVuQ2FtZXJhKHN0cnVjdCBod19kZXZpY2VfdCAqKmh3X2RldmljZSk7CisKKyAgICAvLyBEdWFsIGNhbWVyYSBzcGVjaWZpYyBvcHJhdGlvbnMKKyAgICBpbnQgYnVuZGxlUmVsYXRlZENhbWVyYXMoYm9vbCBzeW5jT24sCisgICAgICAgICAgICB1aW50MzJfdCByZWxhdGVkX3NlbnNvcl9zZXNzaW9uX2lkKTsKKyAgICBpbnQgZ2V0Q2FtZXJhU2Vzc2lvbklkKHVpbnQzMl90KiBzZXNzaW9uX2lkKTsKKyAgICBjb25zdCBjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KiBnZXRSZWxhdGVkQ2FtU3luY0luZm8oCisgICAgICAgICAgICB2b2lkKTsKKyAgICBpbnQzMl90IHNldFJlbGF0ZWRDYW1TeW5jSW5mbygKKyAgICAgICAgICAgIGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QqIGluZm8pOworICAgIGJvb2wgaXNGcmFtZVN5bmNFbmFibGVkKHZvaWQpOworICAgIGludDMyX3Qgc2V0RnJhbWVTeW5jRW5hYmxlZChib29sIGVuYWJsZSk7CisgICAgaW50MzJfdCBzZXRNcG9Db21wb3NpdGlvbihib29sIGVuYWJsZSk7CisgICAgYm9vbCBnZXRNcG9Db21wb3NpdGlvbih2b2lkKTsKKyAgICBib29sIGdldFJlY29yZGluZ0hpbnRWYWx1ZSh2b2lkKTsKKyAgICBpbnQzMl90IHNldFJlY29yZGluZ0hpbnRWYWx1ZShpbnQzMl90IHZhbHVlKTsKKyAgICBib29sIGlzUHJldmlld1Jlc3RhcnROZWVkZWQodm9pZCkgeyByZXR1cm4gbVByZXZpZXdSZXN0YXJ0TmVlZGVkOyB9OworICAgIHN0YXRpYyBpbnQgZ2V0Q2FwYWJpbGl0aWVzKHVpbnQzMl90IGNhbWVyYUlkLAorICAgICAgICAgICAgc3RydWN0IGNhbWVyYV9pbmZvICppbmZvLCBjYW1fc3luY190eXBlX3QgKmNhbV90eXBlKTsKKyAgICBzdGF0aWMgaW50IGluaXRDYXBhYmlsaXRpZXModWludDMyX3QgY2FtZXJhSWQsIG1tX2NhbWVyYV92dGJsX3QgKmNhbWVyYUhhbmRsZSk7CisgICAgY2FtX2NhcGFiaWxpdHlfdCAqZ2V0Q2FtSGFsQ2FwYWJpbGl0aWVzKCk7CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBRQ2FtZXJhQWxsb2NhdG9yCisgICAgdmlydHVhbCBRQ2FtZXJhTWVtb3J5ICphbGxvY2F0ZVN0cmVhbUJ1ZihjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwKKyAgICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgc3RyaWRlLCBpbnQgc2NhbmxpbmUsIHVpbnQ4X3QgJmJ1ZmZlckNudCk7CisgICAgdmlydHVhbCBpbnQzMl90IGFsbG9jYXRlTW9yZVN0cmVhbUJ1ZihRQ2FtZXJhTWVtb3J5ICptZW1fb2JqLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsIHVpbnQ4X3QgJmJ1ZmZlckNudCk7CisKKyAgICB2aXJ0dWFsIFFDYW1lcmFIZWFwTWVtb3J5ICphbGxvY2F0ZVN0cmVhbUluZm9CdWYoY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUpOworICAgIHZpcnR1YWwgUUNhbWVyYUhlYXBNZW1vcnkgKmFsbG9jYXRlTWlzY0J1ZihjYW1fc3RyZWFtX2luZm9fdCAqc3RyZWFtSW5mbyk7CisgICAgdmlydHVhbCBRQ2FtZXJhTWVtb3J5ICphbGxvY2F0ZVN0cmVhbVVzZXJCdWYoY2FtX3N0cmVhbV9pbmZvX3QgKnN0cmVhbUluZm8pOworICAgIHZpcnR1YWwgdm9pZCB3YWl0Rm9yRGVmZXJyZWRBbGxvYyhjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSk7CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBRQ2FtZXJhVGhlcm1hbENhbGxiYWNrCisgICAgdmlydHVhbCBpbnQgdGhlcm1hbEV2dEhhbmRsZShxY2FtZXJhX3RoZXJtYWxfbGV2ZWxfZW51bV90ICpsZXZlbCwKKyAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhLCB2b2lkICpkYXRhKTsKKworICAgIHZpcnR1YWwgaW50IHJlY2FsY0ZQU1JhbmdlKGludCAmbWluRlBTLCBpbnQgJm1heEZQUywKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICZtaW5WaWRlb0ZQUywgY29uc3QgZmxvYXQgJm1heFZpZGVvRlBTLAorICAgICAgICAgICAgY2FtX2Zwc19yYW5nZV90ICZhZGp1c3RlZFJhbmdlKTsKKworICAgIGZyaWVuZCBjbGFzcyBRQ2FtZXJhU3RhdGVNYWNoaW5lOworICAgIGZyaWVuZCBjbGFzcyBRQ2FtZXJhUG9zdFByb2Nlc3NvcjsKKyAgICBmcmllbmQgY2xhc3MgUUNhbWVyYUNiTm90aWZpZXI7CisgICAgZnJpZW5kIGNsYXNzIFFDYW1lcmFNdXhlcjsKKworICAgIHZvaWQgc2V0SnBlZ0NhbGxCYWNrcyhqcGVnX2RhdGFfY2FsbGJhY2sganBlZ0NiLAorICAgICAgICAgICAgdm9pZCAqY2FsbGJhY2tDb29raWUpOworICAgIGludDMyX3QgaW5pdEpwZWdIYW5kbGUoKTsKKyAgICBpbnQzMl90IGRlaW5pdEpwZWdIYW5kbGUoKTsKKyAgICBpbnQzMl90IHNldEpwZWdIYW5kbGVJbmZvKG1tX2pwZWdfb3BzX3QgKm9wcywKKyAgICAgICAgICAgIG1tX2pwZWdfbXBvX29wc190ICptcG9fb3BzLCB1aW50MzJfdCBwSnBlZ0NsaWVudEhhbmRsZSk7CisgICAgaW50MzJfdCBnZXRKcGVnSGFuZGxlSW5mbyhtbV9qcGVnX29wc190ICpvcHMsCisgICAgICAgICAgICBtbV9qcGVnX21wb19vcHNfdCAqbXBvX29wcywgdWludDMyX3QgKnBKcGVnQ2xpZW50SGFuZGxlKTsKKyAgICB1aW50MzJfdCBnZXRDYW1lcmFJZCgpIHsgcmV0dXJuIG1DYW1lcmFJZDsgfTsKKyAgICBib29sIGJMaXZlU25hcHNob3Q7Citwcml2YXRlOgorICAgIGludCBzZXRQcmV2aWV3V2luZG93KHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKndpbmRvdyk7CisgICAgaW50IHNldENhbGxCYWNrcygKKyAgICAgICAgY2FtZXJhX25vdGlmeV9jYWxsYmFjayBub3RpZnlfY2IsCisgICAgICAgIGNhbWVyYV9kYXRhX2NhbGxiYWNrIGRhdGFfY2IsCisgICAgICAgIGNhbWVyYV9kYXRhX3RpbWVzdGFtcF9jYWxsYmFjayBkYXRhX2NiX3RpbWVzdGFtcCwKKyAgICAgICAgY2FtZXJhX3JlcXVlc3RfbWVtb3J5IGdldF9tZW1vcnksCisgICAgICAgIHZvaWQgKnVzZXIpOworICAgIGludCBlbmFibGVNc2dUeXBlKGludDMyX3QgbXNnX3R5cGUpOworICAgIGludCBkaXNhYmxlTXNnVHlwZShpbnQzMl90IG1zZ190eXBlKTsKKyAgICBpbnQgbXNnVHlwZUVuYWJsZWQoaW50MzJfdCBtc2dfdHlwZSk7CisgICAgaW50IG1zZ1R5cGVFbmFibGVkV2l0aExvY2soaW50MzJfdCBtc2dfdHlwZSk7CisgICAgaW50IHN0YXJ0UHJldmlldygpOworICAgIGludCBzdG9wUHJldmlldygpOworICAgIGludCBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzKGludCBlbmFibGUpOworICAgIGludCBwcmVTdGFydFJlY29yZGluZygpOworICAgIGludCBzdGFydFJlY29yZGluZygpOworICAgIGludCBzdG9wUmVjb3JkaW5nKCk7CisgICAgaW50IHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCB2b2lkICpvcGFxdWUpOworICAgIGludCBhdXRvRm9jdXMoKTsKKyAgICBpbnQgY2FuY2VsQXV0b0ZvY3VzKCk7CisgICAgaW50IHByZVRha2VQaWN0dXJlKCk7CisgICAgaW50IHRha2VQaWN0dXJlKCk7CisgICAgaW50IHN0b3BDYXB0dXJlQ2hhbm5lbChib29sIGRlc3Ryb3kpOworICAgIGludCBjYW5jZWxQaWN0dXJlKCk7CisgICAgaW50IHRha2VMaXZlU25hcHNob3QoKTsKKyAgICBpbnQgdGFrZVBpY3R1cmVJbnRlcm5hbCgpOworICAgIGludCBjYW5jZWxMaXZlU25hcHNob3QoKTsKKyAgICBjaGFyKiBnZXRQYXJhbWV0ZXJzKCkge3JldHVybiBtUGFyYW1ldGVycy5nZXRQYXJhbWV0ZXJzKCk7IH0KKyAgICBpbnQgcHV0UGFyYW1ldGVycyhjaGFyICopOworICAgIGludCBzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCAmYXJnMSwgaW50MzJfdCAmYXJnMik7CisgICAgaW50IHJlbGVhc2UoKTsKKyAgICBpbnQgZHVtcChpbnQgZmQpOworICAgIGludCByZWdpc3RlckZhY2VJbWFnZSh2b2lkICppbWdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcHBfb2ZmbGluZV9zcmNfY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmZmFjZUlEKTsKKyAgICBpbnQzMl90IGxvbmdTaG90KCk7CisKKyAgICB1aW50MzJfdCBkZWZlclBQSW5pdCgpOworICAgIGludCBvcGVuQ2FtZXJhKCk7CisgICAgaW50IGNsb3NlQ2FtZXJhKCk7CisKKyAgICBpbnQgcHJvY2Vzc0FQSShxY2FtZXJhX3NtX2V2dF9lbnVtX3QgYXBpLCB2b2lkICphcGlfcGF5bG9hZCk7CisgICAgaW50IHByb2Nlc3NFdnQocWNhbWVyYV9zbV9ldnRfZW51bV90IGV2dCwgdm9pZCAqZXZ0X3BheWxvYWQpOworICAgIGludCBwcm9jZXNzU3luY0V2dChxY2FtZXJhX3NtX2V2dF9lbnVtX3QgZXZ0LCB2b2lkICpldnRfcGF5bG9hZCk7CisgICAgdm9pZCBsb2NrQVBJKCk7CisgICAgdm9pZCB3YWl0QVBJUmVzdWx0KHFjYW1lcmFfc21fZXZ0X2VudW1fdCBhcGlfZXZ0LCBxY2FtZXJhX2FwaV9yZXN1bHRfdCAqYXBpUmVzdWx0KTsKKyAgICB2b2lkIHVubG9ja0FQSSgpOworICAgIHZvaWQgc2lnbmFsQVBJUmVzdWx0KHFjYW1lcmFfYXBpX3Jlc3VsdF90ICpyZXN1bHQpOworICAgIHZvaWQgc2lnbmFsRXZ0UmVzdWx0KHFjYW1lcmFfYXBpX3Jlc3VsdF90ICpyZXN1bHQpOworCisgICAgaW50IGNhbGNUaGVybWFsTGV2ZWwocWNhbWVyYV90aGVybWFsX2xldmVsX2VudW1fdCBsZXZlbCwKKyAgICAgICAgICAgIGNvbnN0IGludCBtaW5GUFNpLCBjb25zdCBpbnQgbWF4RlBTaSwKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICZtaW5WaWRlb0ZQUywgY29uc3QgZmxvYXQgJm1heFZpZGVvRlBTLAorICAgICAgICAgICAgY2FtX2Zwc19yYW5nZV90ICZhZGp1c3RlZFJhbmdlLAorICAgICAgICAgICAgZW51bSBtc21fdmZlX2ZyYW1lX3NraXBfcGF0dGVybiAmc2tpcFBhdHRlcm4pOworICAgIGludCB1cGRhdGVUaGVybWFsTGV2ZWwodm9pZCAqbGV2ZWwpOworCisgICAgLy8gdXBkYXRlIGVudHJpcyB0byBzZXQgcGFyYW1ldGVycyBhbmQgY2hlY2sgaWYgcmVzdGFydCBpcyBuZWVkZWQKKyAgICBpbnQgdXBkYXRlUGFyYW1ldGVycyhjb25zdCBjaGFyICpwYXJtcywgYm9vbCAmbmVlZFJlc3RhcnQpOworICAgIC8vIHNlbmQgcmVxdWVzdCB0byBzZXJ2ZXIgdG8gc2V0IHBhcmFtZXRlcnMKKyAgICBpbnQgY29tbWl0UGFyYW1ldGVyQ2hhbmdlcygpOworCisgICAgYm9vbCBpc0NhcHR1cmVTaHV0dGVyRW5hYmxlZCgpOworICAgIGJvb2wgbmVlZERlYnVnRnBzKCk7CisgICAgYm9vbCBpc1JlZ3VsYXJDYXB0dXJlKCk7CisgICAgYm9vbCBpc0NBQ0VuYWJsZWQoKTsKKyAgICBib29sIGlzNGsya1Jlc29sdXRpb24oY2FtX2RpbWVuc2lvbl90KiByZXNvbHV0aW9uKTsKKyAgICBib29sIGlzUHJldmlld1Jlc3RhcnRFbmFibGVkKCk7CisgICAgYm9vbCBuZWVkUmVwcm9jZXNzKCk7CisgICAgYm9vbCBuZWVkUm90YXRpb25SZXByb2Nlc3MoKTsKKyAgICB2b2lkIGRlYnVnU2hvd1ZpZGVvRlBTKCk7CisgICAgdm9pZCBkZWJ1Z1Nob3dQcmV2aWV3RlBTKCk7CisgICAgdm9pZCBkdW1wSnBlZ1RvRmlsZShjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgaW5kZXgpOworICAgIHZvaWQgZHVtcEZyYW1lVG9GaWxlKFFDYW1lcmFTdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lLCB1aW50MzJfdCBkdW1wX3R5cGUsIGNvbnN0IGNoYXIgKm1pc2MgPSBOVUxMKTsKKyAgICB2b2lkIGR1bXBNZXRhZGF0YVRvRmlsZShRQ2FtZXJhU3RyZWFtICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqZnJhbWUsY2hhciAqdHlwZSk7CisgICAgdm9pZCByZWxlYXNlU3VwZXJCdWYobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9idWYpOworICAgIHZvaWQgcGxheVNodXR0ZXIoKTsKKyAgICB2b2lkIGdldFRodW1ibmFpbFNpemUoY2FtX2RpbWVuc2lvbl90ICZkaW0pOworICAgIHVpbnQzMl90IGdldEpwZWdRdWFsaXR5KCk7CisgICAgUUNhbWVyYUV4aWYgKmdldEV4aWZEYXRhKCk7CisgICAgY2FtX3NlbnNvcl90IGdldFNlbnNvclR5cGUoKTsKKyAgICBib29sIGlzTG93UG93ZXJNb2RlKCk7CisgICAgbnNlY3NfdCBnZXRCb290VG9Nb25vVGltZU9mZnNldCgpOworCisgICAgaW50MzJfdCBwcm9jZXNzQXV0b0ZvY3VzRXZlbnQoY2FtX2F1dG9fZm9jdXNfZGF0YV90ICZmb2N1c19kYXRhKTsKKyAgICBpbnQzMl90IHByb2Nlc3Nab29tRXZlbnQoY2FtX2Nyb3BfZGF0YV90ICZjcm9wX2luZm8pOworICAgIGludDMyX3QgcHJvY2Vzc1ByZXBTbmFwc2hvdERvbmVFdmVudChjYW1fcHJlcF9zbmFwc2hvdF9zdGF0ZV90IHByZXBfc25hcHNob3Rfc3RhdGUpOworICAgIGludDMyX3QgcHJvY2Vzc0FTRFVwZGF0ZShjYW1fYXNkX2RlY2lzaW9uX3QgYXNkX2RlY2lzaW9uKTsKKyAgICBpbnQzMl90IHByb2Nlc3NKcGVnTm90aWZ5KHFjYW1lcmFfanBlZ19ldnRfcGF5bG9hZF90ICpqcGVnX2pvYik7CisgICAgaW50MzJfdCBwcm9jZXNzSERSRGF0YShjYW1fYXNkX2hkcl9zY2VuZV9kYXRhX3QgaGRyX3NjZW5lKTsKKyAgICBpbnQzMl90IHByb2Nlc3NSZXRyb0FFQ1VubG9jaygpOworICAgIGludDMyX3QgcHJvY2Vzc1pTTENhcHR1cmVEb25lKCk7CisgICAgaW50MzJfdCBwcm9jZXNzU2NlbmVEYXRhKGNhbV9zY2VuZV9tb2RlX3R5cGUgc2NlbmUpOworICAgIGludDMyX3QgdHJhbnNBd2JNZXRhVG9QYXJhbXMoY2FtX2F3Yl9wYXJhbXNfdCAmYXdiX3BhcmFtcyk7CisgICAgaW50MzJfdCBwcm9jZXNzRm9jdXNQb3NpdGlvbkluZm8oY2FtX2ZvY3VzX3Bvc19pbmZvX3QgJmN1cl9wb3NfaW5mbyk7CisgICAgaW50MzJfdCBwcm9jZXNzQUVJbmZvKGNhbV8zYV9wYXJhbXNfdCAmYWVfcGFyYW1zKTsKKworICAgIGludDMyX3Qgc2VuZEV2dE5vdGlmeShpbnQzMl90IG1zZ190eXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0Mik7CisgICAgaW50MzJfdCBzZW5kRGF0YU5vdGlmeShpbnQzMl90IG1zZ190eXBlLAorICAgICAgICAgICAgY2FtZXJhX21lbW9yeV90ICpkYXRhLAorICAgICAgICAgICAgdWludDhfdCBpbmRleCwKKyAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX2lkeCk7CisKKyAgICBpbnQzMl90IHNlbmRQcmV2aWV3Q2FsbGJhY2soUUNhbWVyYVN0cmVhbSAqc3RyZWFtLAorICAgICAgICAgICAgUUNhbWVyYU1lbW9yeSAqbWVtb3J5LCB1aW50MzJfdCBpZHgpOworICAgIGludDMyX3Qgc2VsZWN0U2NlbmUoUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsLAorICAgICAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSk7CisKKyAgICBpbnQzMl90IGFkZENoYW5uZWwocWNhbWVyYV9jaF90eXBlX2VudW1fdCBjaF90eXBlKTsKKyAgICBpbnQzMl90IHN0YXJ0Q2hhbm5lbChxY2FtZXJhX2NoX3R5cGVfZW51bV90IGNoX3R5cGUpOworICAgIGludDMyX3Qgc3RvcENoYW5uZWwocWNhbWVyYV9jaF90eXBlX2VudW1fdCBjaF90eXBlKTsKKyAgICBpbnQzMl90IGRlbENoYW5uZWwocWNhbWVyYV9jaF90eXBlX2VudW1fdCBjaF90eXBlLCBib29sIGRlc3Ryb3kgPSB0cnVlKTsKKyAgICBpbnQzMl90IGFkZFByZXZpZXdDaGFubmVsKCk7CisgICAgaW50MzJfdCBhZGRTbmFwc2hvdENoYW5uZWwoKTsKKyAgICBpbnQzMl90IGFkZFZpZGVvQ2hhbm5lbCgpOworICAgIGludDMyX3QgYWRkWlNMQ2hhbm5lbCgpOworICAgIGludDMyX3QgYWRkQ2FwdHVyZUNoYW5uZWwoKTsKKyAgICBpbnQzMl90IGFkZFJhd0NoYW5uZWwoKTsKKyAgICBpbnQzMl90IGFkZE1ldGFEYXRhQ2hhbm5lbCgpOworICAgIGludDMyX3QgYWRkQW5hbHlzaXNDaGFubmVsKCk7CisgICAgUUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWwgKmFkZFJlcHJvY0NoYW5uZWwoUUNhbWVyYUNoYW5uZWwgKnBJbnB1dENoYW5uZWwsCisgICAgICAgICAgICBpbnQ4X3QgY3VyX2NoYW5uZWxfaW5kZXggPSAwKTsKKyAgICBRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbCAqYWRkT2ZmbGluZVJlcHJvY0NoYW5uZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcHBfb2ZmbGluZV9zcmNfY29uZmlnX3QgJmltZ19jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcHBfZmVhdHVyZV9jb25maWdfdCAmcHBfZmVhdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jYl9yb3V0aW5lIHN0cmVhbV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKyAgICBpbnQzMl90IGFkZENhbGxiYWNrQ2hhbm5lbCgpOworCisgICAgaW50MzJfdCBhZGRTdHJlYW1Ub0NoYW5uZWwoUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NiX3JvdXRpbmUgc3RyZWFtQ0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEpOworICAgIGludDMyX3QgcHJlcGFyZVByZXZpZXcoKTsKKyAgICB2b2lkIHVucHJlcGFyZVByZXZpZXcoKTsKKyAgICBpbnQzMl90IHByZXBhcmVSYXdTdHJlYW0oUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsKTsKKyAgICBRQ2FtZXJhQ2hhbm5lbCAqZ2V0Q2hhbm5lbEJ5SGFuZGxlKHVpbnQzMl90IGNoYW5uZWxIYW5kbGUpOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmdldFNuYXBzaG90RnJhbWUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSk7CisgICAgaW50MzJfdCBwcm9jZXNzRmFjZURldGVjdGlvblJlc3VsdChjYW1fZmFjZXNfZGF0YV90ICpmZF9kYXRhKTsKKyAgICBib29sIG5lZWRQcmV2aWV3RkRDYWxsYmFjayh1aW50OF90IG51bV9mYWNlcyk7CisgICAgaW50MzJfdCBwcm9jZXNzSGlzdG9ncmFtU3RhdHMoY2FtX2hpc3Rfc3RhdHNfdCAmc3RhdHNfZGF0YSk7CisgICAgaW50MzJfdCBzZXRIaXN0b2dyYW0oYm9vbCBoaXN0b2dyYW1fZW4pOworICAgIGludDMyX3Qgc2V0RmFjZURldGVjdGlvbihib29sIGVuYWJsZWQpOworICAgIGludDMyX3QgcHJlcGFyZUhhcmR3YXJlRm9yU25hcHNob3QoaW50MzJfdCBhZk5lZWRlZCk7CisgICAgYm9vbCBuZWVkUHJvY2Vzc1ByZXZpZXdGcmFtZSh1aW50MzJfdCBmcmFtZUlEKTsKKyAgICBib29sIG5lZWRTZW5kUHJldmlld0NhbGxiYWNrKCk7CisgICAgYm9vbCBpc05vRGlzcGxheU1vZGUoKSB7cmV0dXJuIG1QYXJhbWV0ZXJzLmlzTm9EaXNwbGF5TW9kZSgpO307CisgICAgYm9vbCBpc1pTTE1vZGUoKSB7cmV0dXJuIG1QYXJhbWV0ZXJzLmlzWlNMTW9kZSgpO307CisgICAgYm9vbCBpc1JkaU1vZGUoKSB7cmV0dXJuIG1QYXJhbWV0ZXJzLmlzUmRpTW9kZSgpO307CisgICAgdWludDhfdCBudW1PZlNuYXBzaG90c0V4cGVjdGVkKCkgeworICAgICAgICByZXR1cm4gbVBhcmFtZXRlcnMuZ2V0TnVtT2ZTbmFwc2hvdHMoKTt9OworICAgIGJvb2wgaXNTZWN1cmVNb2RlKCkge3JldHVybiBtUGFyYW1ldGVycy5pc1NlY3VyZU1vZGUoKTt9OworICAgIGJvb2wgaXNMb25nc2hvdEVuYWJsZWQoKSB7IHJldHVybiBtTG9uZ3Nob3RFbmFibGVkOyB9OworICAgIGJvb2wgaXNIRlJNb2RlKCkge3JldHVybiBtUGFyYW1ldGVycy5pc0hmck1vZGUoKTt9OworICAgIGJvb2wgaXNMaXZlU25hcHNob3QoKSB7cmV0dXJuIG1fc3RhdGVNYWNoaW5lLmlzUmVjb3JkaW5nKCk7fTsKKyAgICB2b2lkIHNldFJldHJvUGljdHVyZShib29sIGVuYWJsZSkgeyBiUmV0cm9QaWN0dXJlID0gZW5hYmxlOyB9OworICAgIGJvb2wgaXNSZXRyb1BpY3R1cmUoKSB7cmV0dXJuIGJSZXRyb1BpY3R1cmU7IH07CisgICAgYm9vbCBpc0hEUk1vZGUoKSB7cmV0dXJuIG1QYXJhbWV0ZXJzLmlzSERSRW5hYmxlZCgpO307CisgICAgdWludDhfdCBnZXRCdWZOdW1SZXF1aXJlZChjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSk7CisgICAgYm9vbCBuZWVkRkRNZXRhZGF0YShxY2FtZXJhX2NoX3R5cGVfZW51bV90IGNoYW5uZWxfdHlwZSk7CisgICAgaW50MzJfdCBjb25maWd1cmVPbmxpbmVSb3RhdGlvbihRQ2FtZXJhQ2hhbm5lbCAmY2gpOworICAgIGludDMyX3QgZGVjbGFyZVNuYXBzaG90U3RyZWFtcygpOworICAgIGludDMyX3QgdW5jb25maWd1cmVBZHZhbmNlZENhcHR1cmUoKTsKKyAgICBpbnQzMl90IGNvbmZpZ3VyZUFkdmFuY2VkQ2FwdHVyZSgpOworICAgIGludDMyX3QgY29uZmlndXJlQUZCcmFja2V0aW5nKGJvb2wgZW5hYmxlID0gdHJ1ZSk7CisgICAgaW50MzJfdCBjb25maWd1cmVIRFJCcmFja2V0aW5nKCk7CisgICAgaW50MzJfdCBzdG9wQWR2YW5jZWRDYXB0dXJlKFFDYW1lcmFQaWNDaGFubmVsICpwQ2hhbm5lbCk7CisgICAgaW50MzJfdCBzdGFydEFkdmFuY2VkQ2FwdHVyZShRQ2FtZXJhUGljQ2hhbm5lbCAqcENoYW5uZWwpOworICAgIGludDMyX3QgY29uZmlndXJlT3B0aVpvb20oKTsKKyAgICBpbnQzMl90IGNvbmZpZ3VyZVN0aWxsTW9yZSgpOworICAgIGludDMyX3QgY29uZmlndXJlQUVCcmFja2V0aW5nKCk7CisgICAgaW50MzJfdCB1cGRhdGVQb3N0UHJldmlld1BhcmFtZXRlcnMoKTsKKyAgICBpbmxpbmUgdm9pZCBzZXRPdXRwdXRJbWFnZUNvdW50KHVpbnQzMl90IGFDb3VudCkge21PdXRwdXRDb3VudCA9IGFDb3VudDt9CisgICAgaW5saW5lIHVpbnQzMl90IGdldE91dHB1dEltYWdlQ291bnQoKSB7cmV0dXJuIG1PdXRwdXRDb3VudDt9CisgICAgYm9vbCBwcm9jZXNzVUZEdW1wcyhxY2FtZXJhX2pwZWdfZXZ0X3BheWxvYWRfdCAqZXZ0KTsKKyAgICB2b2lkIGNhcHR1cmVEb25lKCk7CisgICAgaW50MzJfdCB1cGRhdGVNZXRhZGF0YShtZXRhZGF0YV9idWZmZXJfdCAqcE1ldGFEYXRhKTsKKyAgICB2b2lkIGZpbGxGYWNlc0RhdGEoY2FtX2ZhY2VzX2RhdGFfdCAmZmFjZXNfZGF0YSwgbWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhKTsKKworICAgIGludDMyX3QgZ2V0UFBDb25maWcoY2FtX3BwX2ZlYXR1cmVfY29uZmlnX3QgJnBwX2NvbmZpZywKKyAgICAgICAgICAgIGludDhfdCBjdXJJbmRleCA9IDAsIGJvb2wgbXVsdGlwYXNzID0gRkFMU0UpOworICAgIHZpcnR1YWwgdWludDMyX3Qgc2NoZWR1bGVCYWNrZ3JvdW5kVGFzayhCYWNrZ3JvdW5kVGFzayogYmdUYXNrKTsKKyAgICB2aXJ0dWFsIGludDMyX3Qgd2FpdEZvckJhY2tncm91bmRUYXNrKHVpbnQzMl90ICZ0YXNrSWQpOworICAgIGJvb2wgbmVlZERlZmVycmVkKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlKTsKKyAgICBzdGF0aWMgdm9pZCBjYW1FdnRIYW5kbGUodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2V2ZW50X3QgKmV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKyAgICBzdGF0aWMgdm9pZCBqcGVnRXZ0SGFuZGxlKGpwZWdfam9iX3N0YXR1c190IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNsaWVudF9oZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBqb2JJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2pwZWdfb3V0cHV0X3QgKnBfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisgICAgc3RhdGljIHZvaWQgKmV2dE5vdGlmeVJvdXRpbmUodm9pZCAqZGF0YSk7CisKKyAgICAvLyBmdW5jdGlvbnMgZm9yIGRpZmZlcmVudCBkYXRhIG5vdGlmeSBjYgorICAgIHN0YXRpYyB2b2lkIHpzbF9jaGFubmVsX2NiKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVjdmRfZnJhbWUsIHZvaWQgKnVzZXJkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCBjYXB0dXJlX2NoYW5uZWxfY2Jfcm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnJlY3ZkX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCBwb3N0cHJvY19jaGFubmVsX2NiX3JvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworICAgIHN0YXRpYyB2b2lkIHJkaV9tb2RlX3N0cmVhbV9jYl9yb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCBub2Rpc3BsYXlfcHJldmlld19zdHJlYW1fY2Jfcm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisgICAgc3RhdGljIHZvaWQgcHJldmlld19zdHJlYW1fY2Jfcm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworICAgIHN0YXRpYyB2b2lkIHN5bmNocm9ub3VzX3N0cmVhbV9jYl9yb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUsCisgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpzdHJlYW0sIHZvaWQgKnVzZXJkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCBwb3N0dmlld19zdHJlYW1fY2Jfcm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisgICAgc3RhdGljIHZvaWQgdmlkZW9fc3RyZWFtX2NiX3JvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworICAgIHN0YXRpYyB2b2lkIHNuYXBzaG90X2NoYW5uZWxfY2Jfcm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lLAorICAgICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisgICAgc3RhdGljIHZvaWQgcmF3X2NoYW5uZWxfY2Jfcm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lLAorICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworICAgIHN0YXRpYyB2b2lkIHJhd19zdHJlYW1fY2Jfcm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCBwcmV2aWV3X3Jhd19zdHJlYW1fY2Jfcm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKiBzdXBlcl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiB1c2VyZGF0YSk7CisgICAgc3RhdGljIHZvaWQgc25hcHNob3RfcmF3X3N0cmVhbV9jYl9yb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqIHN1cGVyX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlcmRhdGEpOworICAgIHN0YXRpYyB2b2lkIG1ldGFkYXRhX3N0cmVhbV9jYl9yb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCBjYWxsYmFja19zdHJlYW1fY2Jfcm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lLAorICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqc3RyZWFtLCB2b2lkICp1c2VyZGF0YSk7CisgICAgc3RhdGljIHZvaWQgcmVwcm9jZXNzX3N0cmVhbV9jYl9yb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisgICAgc3RhdGljIHZvaWQgcmVsZWFzZUNhbWVyYU1lbW9yeSh2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjYlN0YXR1cyk7CisgICAgc3RhdGljIHZvaWQgcmV0dXJuU3RyZWFtQnVmZmVyKHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjYlN0YXR1cyk7CisgICAgc3RhdGljIHZvaWQgZ2V0TG9nTGV2ZWwoKTsKKworICAgIGludDMyX3Qgc3RhcnRSQVdDaGFubmVsKFFDYW1lcmFDaGFubmVsICpwQ2hhbm5lbCk7CisgICAgaW50MzJfdCBzdG9wUkFXQ2hhbm5lbCgpOworCisgICAgaW5saW5lIGJvb2wgZ2V0TmVlZFJlc3RhcnQoKSB7cmV0dXJuIG1fYk5lZWRSZXN0YXJ0O30KKyAgICBpbmxpbmUgdm9pZCBzZXROZWVkUmVzdGFydChib29sIG5lZWRSZXN0YXJ0KSB7bV9iTmVlZFJlc3RhcnQgPSBuZWVkUmVzdGFydDt9CisKKyAgICAvKlN0YXJ0IGRpc3BsYXkgc2tpcC4gU2tpcCBzdGFydHMgYWZ0ZXIKKyAgICBza2lwQ250IG51bWJlciBvZiBmcmFtZXMgZnJvbSBjdXJyZW50IGZyYW1lKi8KKyAgICB2b2lkIHNldERpc3BsYXlTa2lwKGJvb2wgZW5hYmxlZCwgdWludDhfdCBza2lwQ250ID0gMCk7CisgICAgLypDYWxsZXIgY2FuIHNwZWNpZnkgcmFuZ2UgZnJhbWVJRCB0byBza2lwLgorICAgIGlmIGVuZCBpcyAwLCBhbGwgdGhlIGZyYW1lcyBhZnRlciBzdGFydCB3aWxsIGJlIHNraXBwZWQqLworICAgIHZvaWQgc2V0RGlzcGxheUZyYW1lU2tpcCh1aW50MzJfdCBzdGFydCA9IDAsIHVpbnQzMl90IGVuZCA9IDApOworICAgIC8qVmVyaWZpZXMgaWYgZnJhbWVJZCBpcyB2YWxpZCB0byBza2lwKi8KKyAgICBib29sIGlzRGlzcGxheUZyYW1lVG9Ta2lwKHVpbnQzMl90IGZyYW1lSWQpOworCitwcml2YXRlOgorICAgIGNhbWVyYV9kZXZpY2VfdCAgIG1DYW1lcmFEZXZpY2U7CisgICAgdWludDMyX3QgICAgICAgICAgbUNhbWVyYUlkOworICAgIG1tX2NhbWVyYV92dGJsX3QgKm1DYW1lcmFIYW5kbGU7CisgICAgYm9vbCBtQ2FtZXJhT3BlbmVkOworCisgICAgY2FtX2pwZWdfbWV0YWRhdGFfdCBtSnBlZ01ldGFkYXRhOworICAgIGJvb2wgbV9iUmVsQ2FtQ2FsaWJWYWxpZDsKKworICAgIHByZXZpZXdfc3RyZWFtX29wc190ICptUHJldmlld1dpbmRvdzsKKyAgICBRQ2FtZXJhUGFyYW1ldGVyc0ludGYgbVBhcmFtZXRlcnM7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgIG1Nc2dFbmFibGVkOworICAgIGludCAgICAgICAgICAgICAgICAgICBtU3RvcmVNZXRhRGF0YUluRnJhbWU7CisKKyAgICBjYW1lcmFfbm90aWZ5X2NhbGxiYWNrICAgICAgICAgbU5vdGlmeUNiOworICAgIGNhbWVyYV9kYXRhX2NhbGxiYWNrICAgICAgICAgICBtRGF0YUNiOworICAgIGNhbWVyYV9kYXRhX3RpbWVzdGFtcF9jYWxsYmFjayBtRGF0YUNiVGltZXN0YW1wOworICAgIGNhbWVyYV9yZXF1ZXN0X21lbW9yeSAgICAgICAgICBtR2V0TWVtb3J5OworICAgIGpwZWdfZGF0YV9jYWxsYmFjayAgICAgICAgICAgICBtSnBlZ0NiOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICptQ2FsbGJhY2tDb29raWU7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgKm1KcGVnQ2FsbGJhY2tDb29raWU7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYk1wb0VuYWJsZWQ7CisKKyAgICBRQ2FtZXJhU3RhdGVNYWNoaW5lIG1fc3RhdGVNYWNoaW5lOyAgIC8vIHN0YXRlIG1hY2hpbmUKKyAgICBib29sIG1fc21UaHJlYWRBY3RpdmU7CisgICAgUUNhbWVyYVBvc3RQcm9jZXNzb3IgbV9wb3N0cHJvY2Vzc29yOyAvLyBwb3N0IHByb2Nlc3NvcgorICAgIFFDYW1lcmFUaGVybWFsQWRhcHRlciAmbV90aGVybWFsQWRhcHRlcjsKKyAgICBRQ2FtZXJhQ2JOb3RpZmllciBtX2NiTm90aWZpZXI7CisgICAgUUNhbWVyYVBlcmZMb2NrIG1fcGVyZkxvY2s7CisgICAgcHRocmVhZF9tdXRleF90IG1fbG9jazsKKyAgICBwdGhyZWFkX2NvbmRfdCBtX2NvbmQ7CisgICAgYXBpX3Jlc3VsdF9saXN0ICptX2FwaVJlc3VsdExpc3Q7CisgICAgUUNhbWVyYU1lbW9yeVBvb2wgbV9tZW1vcnlQb29sOworCisgICAgcHRocmVhZF9tdXRleF90IG1fZXZ0TG9jazsKKyAgICBwdGhyZWFkX2NvbmRfdCBtX2V2dENvbmQ7CisgICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgbV9ldnRSZXN1bHQ7CisKKworICAgIFFDYW1lcmFDaGFubmVsICptX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9NQVhdOyAvLyBhcnJheSBob2xkaW5nIGNoYW5uZWwgcHRyCisKKyAgICBib29sIG1fYlByZXZpZXdTdGFydGVkOyAgICAgICAgICAgICAvL2ZsYWcgaW5kaWNhdGVzIGZpcnN0IHByZXZpZXcgZnJhbWUgY2FsbGJhY2sgaXMgcmVjZWl2ZWQKKyAgICBib29sIG1fYlJlY29yZFN0YXJ0ZWQ7ICAgICAgICAgICAgIC8vZmxhZyBpbmRpY2F0ZXMgUmVjb3JkaW5nIGlzIHN0YXJ0ZWQgZm9yIGZpcnN0IHRpbWUKKworICAgIC8vIFNpZ25pZmllcyBpZiBaU0wgUmV0cm8gU25hcHNob3RzIGFyZSBlbmFibGVkCisgICAgYm9vbCBiUmV0cm9QaWN0dXJlOworICAgIC8vIFNpZ25pZmllcyBBRUMgbG9ja2VkIGR1cmluZyB6c2wgc25hcHNob3RzCisgICAgYm9vbCBtX2JMZWRBZkFlY0xvY2s7CisgICAgY2FtX2FmX3N0YXRlX3QgbV9jdXJyZW50Rm9jdXNTdGF0ZTsKKworICAgIHVpbnQzMl90IG1EdW1wRnJtQ250OyAgLy8gZnJhbWUgZHVtcCBjb3VudAorICAgIHVpbnQzMl90IG1EdW1wU2tpcENudDsgLy8gZnJhbWUgc2tpcCBjb3VudAorICAgIG1tX2pwZWdfZXhpZl9wYXJhbXNfdCBtRXhpZlBhcmFtczsKKyAgICBxY2FtZXJhX3RoZXJtYWxfbGV2ZWxfZW51bV90IG1UaGVybWFsTGV2ZWw7CisgICAgYm9vbCBtQWN0aXZlQUY7CisgICAgYm9vbCBtX0hEUlNjZW5lRW5hYmxlZDsKKyAgICBib29sIG1Mb25nc2hvdEVuYWJsZWQ7CisKKyAgICBwdGhyZWFkX3QgbUxpdmVTbmFwc2hvdFRocmVhZDsKKyAgICBwdGhyZWFkX3QgbUludFBpY1RocmVhZDsKKyAgICBib29sIG1GbGFzaE5lZWRlZDsKKyAgICBib29sIG1GbGFzaENvbmZpZ3VyZWQ7CisgICAgdWludDMyX3QgbURldmljZVJvdGF0aW9uOworICAgIHVpbnQzMl90IG1DYXB0dXJlUm90YXRpb247CisgICAgdWludDMyX3QgbUpwZWdFeGlmUm90YXRpb247CisgICAgYm9vbCBtVXNlSnBlZ0V4aWZSb3RhdGlvbjsKKyAgICBib29sIG1JczNBTG9ja2VkOworICAgIGJvb2wgbVByZXBTbmFwUnVuOworICAgIGludDMyX3QgbVpvb21MZXZlbDsKKyAgICAvLyBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgcHJldmlldyByZXN0YXJ0IG5lZWRlZCAoZm9yIGR1YWwgY2FtZXJhIG1vZGUpCisgICAgYm9vbCBtUHJldmlld1Jlc3RhcnROZWVkZWQ7CisKKyAgICBpbnQgbVZGcmFtZUNvdW50OworICAgIGludCBtVkxhc3RGcmFtZUNvdW50OworICAgIG5zZWNzX3QgbVZMYXN0RnBzVGltZTsKKyAgICBkb3VibGUgbVZGcHM7CisgICAgaW50IG1QRnJhbWVDb3VudDsKKyAgICBpbnQgbVBMYXN0RnJhbWVDb3VudDsKKyAgICBuc2Vjc190IG1QTGFzdEZwc1RpbWU7CisgICAgZG91YmxlIG1QRnBzOworICAgIGJvb2wgbUxvd0xpZ2h0Q29uZmlndXJlZDsKKyAgICB1aW50OF90IG1JbnN0YW50QWVjRnJhbWVDb3VudDsKKworICAgIC8vZXp0dW5lIHZhcmlhYmxlcyBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIGV6dHVuZSBzZXJ2ZXIgYXQgYmFja2VuZAorICAgIGJvb2wgbV9iSW50SnBlZ0V2dFBlbmRpbmc7CisgICAgYm9vbCBtX2JJbnRSYXdFdnRQZW5kaW5nOworICAgIGNoYXIgbV9CYWNrZW5kRmlsZU5hbWVbUUNBTUVSQV9NQVhfRklMRVBBVEhfTEVOR1RIXTsKKyAgICBzaXplX3QgbUJhY2tlbmRGaWxlU2l6ZTsKKyAgICBwdGhyZWFkX211dGV4X3QgbV9pbnRfbG9jazsKKyAgICBwdGhyZWFkX2NvbmRfdCBtX2ludF9jb25kOworCisgICAgZW51bSBEZWZlcnJlZFdvcmtDbWQgeworICAgICAgICBDTURfREVGX0FMTE9DQVRFX0JVRkYsCisgICAgICAgIENNRF9ERUZfUFBST0NfU1RBUlQsCisgICAgICAgIENNRF9ERUZfUFBST0NfSU5JVCwKKyAgICAgICAgQ01EX0RFRl9NRVRBREFUQV9BTExPQywKKyAgICAgICAgQ01EX0RFRl9DUkVBVEVfSlBFR19TRVNTSU9OLAorICAgICAgICBDTURfREVGX1BBUkFNX0FMTE9DLAorICAgICAgICBDTURfREVGX1BBUkFNX0lOSVQsCisgICAgICAgIENNRF9ERUZfR0VORVJJQywKKyAgICAgICAgQ01EX0RFRl9NQVgKKyAgICB9OworCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBRQ2FtZXJhQ2hhbm5lbCAqY2g7CisgICAgICAgIGNhbV9zdHJlYW1fdHlwZV90IHR5cGU7CisgICAgfSBEZWZlckFsbG9jQnVmZkFyZ3M7CisKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIHVpbnQ4X3QgYnVmZmVyQ250OworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICB9IERlZmVyTWV0YWRhdGFBbGxvY0FyZ3M7CisKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGpwZWdfZW5jb2RlX2NhbGxiYWNrX3QganBlZ19jYjsKKyAgICAgICAgdm9pZCAqdXNlcl9kYXRhOworICAgIH0gRGVmZXJQUHJvY0luaXRBcmdzOworCisgICAgdHlwZWRlZiB1bmlvbiB7CisgICAgICAgIERlZmVyQWxsb2NCdWZmQXJncyBhbGxvY0FyZ3M7CisgICAgICAgIFFDYW1lcmFDaGFubmVsICpwcHJvY0FyZ3M7CisgICAgICAgIERlZmVyTWV0YWRhdGFBbGxvY0FyZ3MgbWV0YWRhdGFBbGxvY0FyZ3M7CisgICAgICAgIERlZmVyUFByb2NJbml0QXJncyBwcHJvY0luaXRBcmdzOworICAgICAgICBCYWNrZ3JvdW5kVGFzayAqZ2VuZXJpY0FyZ3M7CisgICAgfSBEZWZlcldvcmtBcmdzOworCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICB1aW50MzJfdCBtRGVmSm9iSWQ7CisKKyAgICAgICAgLy9Kb2Igc3RhdHVzIGlzIG5lZWRlZCB0byBjaGVjayBqb2Igd2FzIHN1Y2Nlc3NmdWwgb3IgZmFpbGVkCisgICAgICAgIC8vRXJyb3IgY29kZSB3aGVuIGpvYiB3YXMgbm90IHN1Y2Vzc2Z1bCBhbmQgdGhlcmUgaXMgZXJyb3IKKyAgICAgICAgLy8wIHdoZW4gaXMgaW5pdGlhbGl6ZWQuCisgICAgICAgIC8vZm9yIHN1Y2Vzc2Z1bGwgam9iLCBkbyBub3QgbmVlZCB0byBtYWludGFpbiBqb2Igc3RhdHVzCisgICAgICAgIGludDMyX3QgbURlZkpvYlN0YXR1czsKKyAgICB9IERlZk9uZ29pbmdKb2I7CisKKyAgICBEZWZPbmdvaW5nSm9iIG1EZWZPbmdvaW5nSm9ic1tNQVhfT05HT0lOR19KT0JTXTsKKworICAgIHN0cnVjdCBEZWZXb3JrCisgICAgeworICAgICAgICBEZWZXb3JrKERlZmVycmVkV29ya0NtZCBjbWRfLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCBpZF8sCisgICAgICAgICAgICAgICAgIERlZmVyV29ya0FyZ3MgYXJnc18pCisgICAgICAgICAgICA6IGNtZChjbWRfKSwKKyAgICAgICAgICAgICAgaWQoaWRfKSwKKyAgICAgICAgICAgICAgYXJncyhhcmdzXyl7fTsKKworICAgICAgICBEZWZlcnJlZFdvcmtDbWQgY21kOworICAgICAgICB1aW50MzJfdCBpZDsKKyAgICAgICAgRGVmZXJXb3JrQXJncyBhcmdzOworICAgIH07CisKKyAgICBRQ2FtZXJhQ21kVGhyZWFkICAgICAgbURlZmVycmVkV29ya1RocmVhZDsKKyAgICBRQ2FtZXJhUXVldWUgICAgICAgICAgbUNtZFF1ZXVlOworCisgICAgTXV0ZXggICAgICAgICAgICAgICAgIG1EZWZMb2NrOworICAgIENvbmRpdGlvbiAgICAgICAgICAgICBtRGVmQ29uZDsKKworICAgIHVpbnQzMl90IHF1ZXVlRGVmZXJyZWRXb3JrKERlZmVycmVkV29ya0NtZCBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmZXJXb3JrQXJncyBhcmdzKTsKKyAgICB1aW50MzJfdCBkZXF1ZXVlRGVmZXJyZWRXb3JrKERlZldvcmsqIGR3LCBpbnQzMl90IGpvYlN0YXR1cyk7CisgICAgaW50MzJfdCB3YWl0RGVmZXJyZWRXb3JrKHVpbnQzMl90ICZqb2JfaWQpOworICAgIHN0YXRpYyB2b2lkICpkZWZlcnJlZFdvcmtSb3V0aW5lKHZvaWQgKm9iaik7CisgICAgYm9vbCBjaGVja0RlZmVycmVkV29yayh1aW50MzJfdCAmam9iX2lkKTsKKyAgICBpbnQzMl90IGdldERlZkpvYlN0YXR1cyh1aW50MzJfdCAmam9iX2lkKTsKKworICAgIHVpbnQzMl90IG1SZXByb2NKb2I7CisgICAgdWludDMyX3QgbUpwZWdKb2I7CisgICAgdWludDMyX3QgbU1ldGFkYXRhQWxsb2NKb2I7CisgICAgdWludDMyX3QgbUluaXRQUHJvY0pvYjsKKyAgICB1aW50MzJfdCBtUGFyYW1BbGxvY0pvYjsKKyAgICB1aW50MzJfdCBtUGFyYW1Jbml0Sm9iOworICAgIHVpbnQzMl90IG1PdXRwdXRDb3VudDsKKyAgICB1aW50MzJfdCBtSW5wdXRDb3VudDsKKyAgICBib29sIG1BZHZhbmNlZENhcHR1cmVDb25maWd1cmVkOworICAgIGJvb2wgbUhEUkJyYWNrZXRpbmdFbmFibGVkOworICAgIGludDMyX3QgbU51bVByZXZpZXdGYWNlczsKKyAgICAvLyBKcGVnIEhhbmRsZSBzaGFyZWQgYmV0d2VlbiBIV0kgaW5zdGFuY2VzCisgICAgbW1fanBlZ19vcHNfdCAgICAgICAgIG1KcGVnSGFuZGxlOworICAgIC8vIE1QTyBoYW5kbGUgc2hhcmVkIGJldHdlZW4gSFdJIGluc3RhbmNlcworICAgIC8vIHRoaXMgaXMgbmVlZGVkIGZvciBNUE8gY29tcG9zaXRpb24gb2YgcmVsYXRlZAorICAgIC8vIGNhbSBpbWFnZXMKKyAgICBtbV9qcGVnX21wb19vcHNfdCAgICAgbUpwZWdNcG9IYW5kbGU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgIG1KcGVnQ2xpZW50SGFuZGxlOworICAgIGJvb2wgICAgICAgICAgICAgICAgICBtSnBlZ0hhbmRsZU93bmVyOworICAgLy90cyBhZGQgZm9yIG1ha2V1cAorI2lmZGVmIFRBUkdFVF9UU19NQUtFVVAKKyAgICBUU1JlY3QgbUZhY2VSZWN0OworICAgIGJvb2wgVHNNYWtldXBQcm9jZXNzX1ByZXZpZXcobW1fY2FtZXJhX2J1Zl9kZWZfdCAqcEZyYW1lLFFDYW1lcmFTdHJlYW0gKiBwU3RyZWFtKTsKKyAgICBib29sIFRzTWFrZXVwUHJvY2Vzc19TbmFwc2hvdChtbV9jYW1lcmFfYnVmX2RlZl90ICpwRnJhbWUsUUNhbWVyYVN0cmVhbSAqIHBTdHJlYW0pOworICAgIGJvb2wgVHNNYWtldXBQcm9jZXNzKG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lLFFDYW1lcmFTdHJlYW0gKiBzdHJlYW0sVFNSZWN0JiBmYWNlUmVjdCk7CisjZW5kaWYKKyAgICBRQ2FtZXJhTWVtb3J5ICptTWV0YWRhdGFNZW07CisKKyAgICBzdGF0aWMgdWludDMyX3Qgc05leHRKb2JJZDsKKworICAgIC8vR3JhbGxvYyBtZW1vcnkgZGV0YWlscworICAgIHB0aHJlYWRfbXV0ZXhfdCBtR3JhbGxvY0xvY2s7CisgICAgdWludDhfdCBtRW5xdWV1ZWRCdWZmZXJzOworICAgIGJvb2wgbUNBQ0RvbmVSZWNlaXZlZDsKKworICAgIC8vR1BVIGxpYnJhcnkgdG8gcmVhZCBidWZmZXIgcGFkZGluZyBkZXRhaWxzLgorICAgIHZvaWQgKmxpYl9zdXJmYWNlX3V0aWxzOworICAgIGludCAoKkxJTktfZ2V0X3N1cmZhY2VfcGl4ZWxfYWxpZ25tZW50KSgpOworICAgIHVpbnQzMl90IG1TdXJmYWNlU3RyaWRlUGFkZGluZzsKKworICAgIC8vUUNhbWVyYSBEaXNwbGF5IE9iamVjdAorICAgIFFDYW1lcmFEaXNwbGF5IG1DYW1lcmFEaXNwbGF5OworCisgICAgYm9vbCBtX2JOZWVkUmVzdGFydDsKKyAgICBNdXRleCBtTWFwTG9jazsKKyAgICBDb25kaXRpb24gbU1hcENvbmQ7CisKKyAgICAvL1VzZWQgdG8gZGVjaWRlIHRoZSBuZXh0IGZyYW1lSUQgdG8gYmUgc2tpcHBlZAorICAgIHVpbnQzMl90IG1MYXN0UHJldmlld0ZyYW1lSUQ7CisgICAgLy9GcmFtZUlEIHRvIHN0YXJ0IGZyYW1lIHNraXAuCisgICAgdWludDMyX3QgbUZyYW1lU2tpcFN0YXJ0OworICAgIC8qRnJhbWVJRCB0byBzdG9wIGZyYW1lc2tpcC4gSWYgdGhpcyBpcyBub3Qgc2V0LAorICAgIGFsbCBmcmFtZXMgYXJlIHNraXBwZWQgdGlsbCB3ZSBzZXQgdGhpcyovCisgICAgdWludDMyX3QgbUZyYW1lU2tpcEVuZDsKKyAgICAvL1RoZSBvZmZzZXQgYmV0d2VlbiBCT09UVElNRSBhbmQgTU9OT1RPTklDIHRpbWVzdGFtcHMKKyAgICBuc2Vjc190IG1Cb290VG9Nb25vVGltZXN0YW1wT2Zmc2V0OworICAgIGJvb2wgYkRlcHRoQUZDYWxsYmFja3M7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQorCisjZW5kaWYgLyogX19RQ0FNRVJBMkhBUkRXQVJFSU5URVJGQUNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhMkhXSUNhbGxiYWNrcy5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmEySFdJQ2FsbGJhY2tzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzdkNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhMkhXSUNhbGxiYWNrcy5jcHAKQEAgLTAsMCArMSwzNTMzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYTJIV0kiCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZGVmaW5lIFNUQVRfSCA8U1lTVEVNX0hFQURFUl9QUkVGSVgvc3RhdC5oPgorI2luY2x1ZGUgU1RBVF9ICisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJRQ2FtZXJhMkhXSS5oIgorI2luY2x1ZGUgIlFDYW1lcmFUcmFjZS5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJtbV9jYW1lcmFfZGJnLmgiCit9CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB6c2xfY2hhbm5lbF9jYgorICoKKyAqIERFU0NSSVBUSU9OOiBoZWxwZXIgZnVuY3Rpb24gdG8gaGFuZGxlIFpTTCBzdXBlcmJ1ZiBjYWxsYmFjayBkaXJlY3RseSBmcm9tCisgKiAgICAgICAgICAgICAgbW0tY2FtZXJhLWludGVyZmFjZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVjdmRfZnJhbWUgOiByZWNlaXZlZCBzdXBlciBidWZmZXIKKyAqICAgQHVzZXJkYXRhICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICA6IE5vbmUKKyAqCisgKiBOT1RFICAgICAgOiByZWN2ZF9mcmFtZSB3aWxsIGJlIHJlbGVhc2VkIGFmdGVyIHRoaXMgY2FsbCBieSBjYWxsZXIsIHNvIGlmCisgKiAgICAgICAgICAgICBhc3luYyBvcGVyYXRpb24gbmVlZGVkIGZvciByZWN2ZF9mcmFtZSwgaXQncyBvdXIgcmVzcG9uc2liaWxpdHkKKyAqICAgICAgICAgICAgIHRvIHNhdmUgYSBjb3B5IGZvciB0aGlzIHZhcmlhYmxlIHRvIGJlIHVzZWQgbGF0ZXIuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6enNsX2NoYW5uZWxfY2IobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBMT0dIKCJbS1BJIFBlcmZdOiBFIik7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGJvb2wgZHVtcF9yYXcgPSBmYWxzZTsKKyAgICBib29sIGxvZ19tYXRjaGluZyA9IGZhbHNlOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKnBtZSA9IChRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICopdXNlcmRhdGE7CisgICAgaWYgKHBtZSA9PSBOVUxMIHx8CisgICAgICAgIHBtZS0+bUNhbWVyYUhhbmRsZSA9PSBOVUxMIHx8CisgICAgICAgIHBtZS0+bUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSAhPSByZWN2ZF9mcmFtZS0+Y2FtZXJhX2hhbmRsZSl7CisgICAgICAgTE9HRSgiY2FtZXJhIG9iaiBub3QgdmFsaWQiKTsKKyAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsID0gcG1lLT5tX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9aU0xdOworICAgIGlmIChwQ2hhbm5lbCA9PSBOVUxMIHx8CisgICAgICAgIHBDaGFubmVsLT5nZXRNeUhhbmRsZSgpICE9IHJlY3ZkX2ZyYW1lLT5jaF9pZCkgeworICAgICAgICBMT0dFKCJaU0wgY2hhbm5lbCBkb2Vzbid0IGV4aXN0LCByZXR1cm4gaGVyZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYocG1lLT5tUGFyYW1ldGVycy5pc1NjZW5lU2VsZWN0aW9uRW5hYmxlZCgpICYmCisgICAgICAgICAgICAhcG1lLT5tX3N0YXRlTWFjaGluZS5pc0NhcHR1cmVSdW5uaW5nKCkpIHsKKyAgICAgICAgcG1lLT5zZWxlY3RTY2VuZShwQ2hhbm5lbCwgcmVjdmRfZnJhbWUpOworICAgICAgICBwQ2hhbm5lbC0+YnVmRG9uZShyZWN2ZF9mcmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMT0dEKCJGcmFtZSBDQiBVbmxvY2sgOiAlZCwgaXMgQUVDIExvY2tlZDogJWQiLAorICAgICAgICAgICByZWN2ZF9mcmFtZS0+YlVubG9ja0FFQywgcG1lLT5tX2JMZWRBZkFlY0xvY2spOworICAgIGlmKHJlY3ZkX2ZyYW1lLT5iVW5sb2NrQUVDICYmIHBtZS0+bV9iTGVkQWZBZWNMb2NrKSB7CisgICAgICAgIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqKW1hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QpKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gcGF5bG9hZCkgeworICAgICAgICAgICAgbWVtc2V0KHBheWxvYWQsIDAsIHNpemVvZihxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QpKTsKKyAgICAgICAgICAgIHBheWxvYWQtPmV2dF90eXBlID0gUUNBTUVSQV9JTlRFUk5BTF9FVlRfUkVUUk9fQUVDX1VOTE9DSzsKKyAgICAgICAgICAgIGludDMyX3QgcmMgPSBwbWUtPnByb2Nlc3NFdnQoUUNBTUVSQV9TTV9FVlRfRVZUX0lOVEVSTkFMLCBwYXlsb2FkKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR0UoInByb2Nlc3NFdnQgZm9yIHJldHJvIEFFQyB1bmxvY2sgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgZnJlZShwYXlsb2FkKTsKKyAgICAgICAgICAgICAgICBwYXlsb2FkID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgcmV0cm8gQUVDIGV2ZW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiByZXRyby1hY3RpdmUgZnJhbWVzIGFyZSBjb21wbGV0ZWQgYW5kIGNhbWVyYSBpcworICAgIC8vIHJlYWR5IHRvIGdvIGFoZWFkIHdpdGggTEVEIGVzdGltYXRpb24gZm9yIHJlZ3VsYXIgZnJhbWVzCisgICAgaWYgKHJlY3ZkX2ZyYW1lLT5iUmVhZHlGb3JQcmVwYXJlU25hcHNob3QpIHsKKyAgICAgICAgLy8gU2VuZCBhbiBldmVudAorICAgICAgICBMT0dEKCJSZWFkeSBmb3IgUHJlcGFyZSBTbmFwc2hvdCwgc2lnbmFsICIpOworICAgICAgICBxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKnBheWxvYWQgPQorICAgICAgICAgICAgICAgICAgICAocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICopbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICBzaXplb2YocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90KSk7CisgICAgICAgIGlmIChOVUxMICE9IHBheWxvYWQpIHsKKyAgICAgICAgICAgIG1lbXNldChwYXlsb2FkLCAwLCBzaXplb2YocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90KSk7CisgICAgICAgICAgICBwYXlsb2FkLT5ldnRfdHlwZSA9IFFDQU1FUkFfSU5URVJOQUxfRVZUX1JFQURZX0ZPUl9TTkFQU0hPVDsKKyAgICAgICAgICAgIGludDMyX3QgcmMgPSBwbWUtPnByb2Nlc3NFdnQoUUNBTUVSQV9TTV9FVlRfRVZUX0lOVEVSTkFMLCBwYXlsb2FkKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR1coInByb2Nlc3NFdnQgUmVhZHkgZm9yIFNuYXBob3QgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgZnJlZShwYXlsb2FkKTsKKyAgICAgICAgICAgICAgICBwYXlsb2FkID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgcHJlcGFyZSBzaWduYWwgZXZlbnQgZGV0ZWN0IgorICAgICAgICAgICAgICAgICAgICAiIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogaW5kaWNhdGUgdGhlIHBhcmVudCB0aGF0IGNhcHR1cmUgaXMgZG9uZSAqLworICAgIHBtZS0+Y2FwdHVyZURvbmUoKTsKKworICAgIC8vIHNhdmUgYSBjb3B5IGZvciB0aGUgc3VwZXJidWYKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QqIGZyYW1lID0KKyAgICAgICAgICAgICAgIChtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKiltYWxsb2Moc2l6ZW9mKG1tX2NhbWVyYV9zdXBlcl9idWZfdCkpOworICAgIGlmIChmcmFtZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IHRvIHNhdmUgcmVjZWl2ZWRfZnJhbWUgc3RydWN0dXJlLiIpOworICAgICAgICBwQ2hhbm5lbC0+YnVmRG9uZShyZWN2ZF9mcmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgKmZyYW1lID0gKnJlY3ZkX2ZyYW1lOworCisgICAgaWYgKHJlY3ZkX2ZyYW1lLT5udW1fYnVmcyA+IDApIHsKKyAgICAgICAgTE9HSSgiW0tQSSBQZXJmXTogc3VwZXJidWYgZnJhbWVfaWR4ICVkIiwKKyAgICAgICAgICAgIHJlY3ZkX2ZyYW1lLT5idWZzWzBdLT5mcmFtZV9pZHgpOworICAgIH0KKworICAgIC8vIERVTVAgUkFXIGlmIGF2YWlsYWJsZQorICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuenNsX3JhdyIsIHZhbHVlLCAiMCIpOworICAgIGR1bXBfcmF3ID0gYXRvaSh2YWx1ZSkgPiAwID8gdHJ1ZSA6IGZhbHNlOworICAgIGlmIChkdW1wX3JhdykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVjdmRfZnJhbWUtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChyZWN2ZF9mcmFtZS0+YnVmc1tpXS0+c3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX1JBVykgeworICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKiByYXdfZnJhbWUgPSByZWN2ZF9mcmFtZS0+YnVmc1tpXTsKKyAgICAgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0gcENoYW5uZWwtPmdldFN0cmVhbUJ5SGFuZGxlKHJhd19mcmFtZS0+c3RyZWFtX2lkKTsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBwU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgIHBtZS0+ZHVtcEZyYW1lVG9GaWxlKHBTdHJlYW0sIHJhd19mcmFtZSwgUUNBTUVSQV9EVU1QX0ZSTV9SQVcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWN2ZF9mcmFtZS0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICBpZiAocmVjdmRfZnJhbWUtPmJ1ZnNbaV0tPnN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCkgeworICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqIHl1dl9mcmFtZSA9IHJlY3ZkX2ZyYW1lLT5idWZzW2ldOworICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9IHBDaGFubmVsLT5nZXRTdHJlYW1CeUhhbmRsZSh5dXZfZnJhbWUtPnN0cmVhbV9pZCk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBwU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgcG1lLT5kdW1wRnJhbWVUb0ZpbGUocFN0cmVhbSwgeXV2X2ZyYW1lLCBRQ0FNRVJBX0RVTVBfRlJNX0lOUFVUX1JFUFJPQ0VTUyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLworICAgIC8vIHdoZXRoZXIgbmVlZCBGRCBNZXRhZGF0YSBhbG9uZyB3aXRoIFNuYXBzaG90IGZyYW1lIGluIFpTTCBtb2RlCisgICAgaWYocG1lLT5uZWVkRkRNZXRhZGF0YShRQ0FNRVJBX0NIX1RZUEVfWlNMKSl7CisgICAgICAgIC8vTmVlZCBGYWNlIERldGVjdGlvbiByZXN1bHQgZm9yIHNuYXBzaG90IGZyYW1lcworICAgICAgICAvL0dldCB0aGUgTWV0YSBEYXRhIGZyYW1lcworICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpwTWV0YUZyYW1lID0gTlVMTDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGZyYW1lLT5udW1fYnVmczsgaSsrKSB7CisgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0gcENoYW5uZWwtPmdldFN0cmVhbUJ5SGFuZGxlKGZyYW1lLT5idWZzW2ldLT5zdHJlYW1faWQpOworICAgICAgICAgICAgaWYgKHBTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpKSB7CisgICAgICAgICAgICAgICAgICAgIHBNZXRhRnJhbWUgPSBmcmFtZS0+YnVmc1tpXTsgLy9maW5kIHRoZSBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihwTWV0YUZyYW1lICE9IE5VTEwpeworICAgICAgICAgICAgbWV0YWRhdGFfYnVmZmVyX3QgKnBNZXRhRGF0YSA9IChtZXRhZGF0YV9idWZmZXJfdCAqKXBNZXRhRnJhbWUtPmJ1ZmZlcjsKKyAgICAgICAgICAgIC8vc2VuZCB0aGUgZmFjZSBkZXRlY3Rpb24gaW5mbworICAgICAgICAgICAgY2FtX2ZhY2VzX2RhdGFfdCBmYWNlc19kYXRhOworICAgICAgICAgICAgcG1lLT5maWxsRmFjZXNEYXRhKGZhY2VzX2RhdGEsIHBNZXRhRGF0YSk7CisgICAgICAgICAgICAvL0hBUkQgQ09ERSBoZXJlIGJlZm9yZSBNQ1QgY2FuIHN1cHBvcnQKKyAgICAgICAgICAgIGZhY2VzX2RhdGEuZGV0ZWN0aW9uX2RhdGEuZmRfdHlwZSA9IFFDQU1FUkFfRkRfU05BUFNIT1Q7CisKKyAgICAgICAgICAgIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqKW1hbGxvYyhzaXplb2YocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90KSk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBwYXlsb2FkKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KHBheWxvYWQsIDAsIHNpemVvZihxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QpKTsKKyAgICAgICAgICAgICAgICBwYXlsb2FkLT5ldnRfdHlwZSA9IFFDQU1FUkFfSU5URVJOQUxfRVZUX0ZBQ0VfREVURUNUX1JFU1VMVDsKKyAgICAgICAgICAgICAgICBwYXlsb2FkLT5mYWNlc19kYXRhID0gZmFjZXNfZGF0YTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJjID0gcG1lLT5wcm9jZXNzRXZ0KFFDQU1FUkFfU01fRVZUX0VWVF9JTlRFUk5BTCwgcGF5bG9hZCk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1coInByb2Nlc3NFdnQgZmFjZV9kZXRlY3Rpb25fcmVzdWx0IGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBmcmVlKHBheWxvYWQpOworICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgZmFjZV9kZXRlY3Rpb25fcmVzdWx0IHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5kdW1wbWV0YWRhdGEiLCB2YWx1ZSwgIjAiKTsKKyAgICBpbnQzMl90IGVuYWJsZWQgPSBhdG9pKHZhbHVlKTsKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpwTWV0YUZyYW1lID0gTlVMTDsKKyAgICAgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9IE5VTEw7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmcmFtZS0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICAgICAgcFN0cmVhbSA9IHBDaGFubmVsLT5nZXRTdHJlYW1CeUhhbmRsZShmcmFtZS0+YnVmc1tpXS0+c3RyZWFtX2lkKTsKKyAgICAgICAgICAgIGlmIChwU3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAocFN0cmVhbS0+aXNUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBKSkgeworICAgICAgICAgICAgICAgICAgICBwTWV0YUZyYW1lID0gZnJhbWUtPmJ1ZnNbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChwTWV0YUZyYW1lICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1ldGFkYXRhX2J1ZmZlcl90ICopcE1ldGFGcmFtZS0+YnVmZmVyKS0+aXNfdHVuaW5nX3BhcmFtc192YWxpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5kdW1wTWV0YWRhdGFUb0ZpbGUocFN0cmVhbSwgcE1ldGFGcmFtZSwgKGNoYXIgKikgIlpTTF9TbmFwc2hvdCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuenNsX21hdGNoaW5nIiwgdmFsdWUsICIwIik7CisgICAgbG9nX21hdGNoaW5nID0gYXRvaSh2YWx1ZSkgPiAwID8gdHJ1ZSA6IGZhbHNlOworICAgIGlmIChsb2dfbWF0Y2hpbmcpIHsKKyAgICAgICAgTE9HSCgiWlNMIHN1cGVyIGJ1ZmZlciBjb250YWluczoiKTsKKyAgICAgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9IE5VTEw7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmcmFtZS0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICAgICAgcFN0cmVhbSA9IHBDaGFubmVsLT5nZXRTdHJlYW1CeUhhbmRsZShmcmFtZS0+YnVmc1tpXS0+c3RyZWFtX2lkKTsKKyAgICAgICAgICAgIGlmIChwU3RyZWFtICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgTE9HSCgiQnVmZmVyIHdpdGggVjRMIGluZGV4ICVkIGZyYW1lIGluZGV4ICVkIG9mIHR5cGUgJWQgVGltZXN0YW1wOiAlbGQgJWxkICIsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+YnVmc1tpXS0+YnVmX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5idWZzW2ldLT5mcmFtZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5nZXRNeVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5idWZzW2ldLT50cy50dl9zZWMsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+YnVmc1tpXS0+dHMudHZfbnNlYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXYWl0IG9uIFBvc3Rwcm9jIGluaXRpYWxpemF0aW9uIGlmIG5lZWRlZAorICAgIC8vIHRoZW4gc2VuZCB0byBwb3N0cHJvY2Vzc29yCisgICAgaWYgKChOT19FUlJPUiAhPSBwbWUtPndhaXREZWZlcnJlZFdvcmsocG1lLT5tUmVwcm9jSm9iKSkgfHwKKyAgICAgICAgICAgIChOT19FUlJPUiAhPSBwbWUtPm1fcG9zdHByb2Nlc3Nvci5wcm9jZXNzRGF0YShmcmFtZSkpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byB0cmlnZ2VyIHByb2Nlc3MgZGF0YSIpOworICAgICAgICBwQ2hhbm5lbC0+YnVmRG9uZShyZWN2ZF9mcmFtZSk7CisgICAgICAgIGZyZWUoZnJhbWUpOworICAgICAgICBmcmFtZSA9IE5VTEw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMT0dIKCJbS1BJIFBlcmZdOiBYIik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2VsZWN0U2NlbmUKKyAqCisgKiBERVNDUklQVElPTjogc2VuZCBhIHByZXZpZXcgY2FsbGJhY2sgd2hlbiBhIHNwZWNpZmljIHNlbGVjdGVkIHNjZW5lIGlzIGFwcGxpZWQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBDaGFubmVsOiBDYW1lcmEgY2hhbm5lbAorICogICBAZnJhbWUgICA6IEJ1bmRsZWQgc3VwZXIgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzZWxlY3RTY2VuZShRQ2FtZXJhQ2hhbm5lbCAqcENoYW5uZWwsCisgICAgICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUpCit7CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqcE1ldGFGcmFtZSA9IE5VTEw7CisgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9IE5VTEw7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKChOVUxMID09IGZyYW1lKSB8fCAoTlVMTCA9PSBwQ2hhbm5lbCkpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBzY2VuZSBzZWxlY3QgaW5wdXQiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjYW1fc2NlbmVfbW9kZV90eXBlIHNlbGVjdGVkU2NlbmUgPSBtUGFyYW1ldGVycy5nZXRTZWxlY3RlZFNjZW5lKCk7CisgICAgaWYgKENBTV9TQ0VORV9NT0RFX01BWCA9PSBzZWxlY3RlZFNjZW5lKSB7CisgICAgICAgIExPR0woIk5vIHNlbGVjdGVkIHNjZW5lIik7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZnJhbWUtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgcFN0cmVhbSA9IHBDaGFubmVsLT5nZXRTdHJlYW1CeUhhbmRsZShmcmFtZS0+YnVmc1tpXS0+c3RyZWFtX2lkKTsKKyAgICAgICAgaWYgKHBTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSkpIHsKKyAgICAgICAgICAgICAgICBwTWV0YUZyYW1lID0gZnJhbWUtPmJ1ZnNbaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBwTWV0YUZyYW1lKSB7CisgICAgICAgIExPR0UoIk5vIG1ldGFkYXRhIGJ1ZmZlciBmb3VuZCBpbiBzY2VuZSBzZWxlY3Qgc3VwZXIgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIG1ldGFkYXRhX2J1ZmZlcl90ICpwTWV0YURhdGEgPSAobWV0YWRhdGFfYnVmZmVyX3QgKilwTWV0YUZyYW1lLT5idWZmZXI7CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fc2NlbmVfbW9kZV90eXBlLCBzY2VuZSwgQ0FNX0lOVEZfTUVUQV9DVVJSRU5UX1NDRU5FLCBwTWV0YURhdGEpIHsKKyAgICAgICAgaWYgKCgqc2NlbmUgPT0gc2VsZWN0ZWRTY2VuZSkgJiYKKyAgICAgICAgICAgICAgICAobURhdGFDYiAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAgIChtc2dUeXBlRW5hYmxlZFdpdGhMb2NrKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSkgPiAwKSkgeworICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqcHJldmlld19mcmFtZSA9IE5VTEw7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZnJhbWUtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwU3RyZWFtID0gcENoYW5uZWwtPmdldFN0cmVhbUJ5SGFuZGxlKGZyYW1lLT5idWZzW2ldLT5zdHJlYW1faWQpOworICAgICAgICAgICAgICAgIGlmIChwU3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlld19mcmFtZSA9IGZyYW1lLT5idWZzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHJldmlld19mcmFtZSkgeworICAgICAgICAgICAgICAgIFFDYW1lcmFHcmFsbG9jTWVtb3J5ICptZW1vcnkgPSAoUUNhbWVyYUdyYWxsb2NNZW1vcnkgKilwcmV2aWV3X2ZyYW1lLT5tZW1faW5mbzsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBpZHggPSBwcmV2aWV3X2ZyYW1lLT5idWZfaWR4OworICAgICAgICAgICAgICAgIHJjID0gc2VuZFByZXZpZXdDYWxsYmFjayhwU3RyZWFtLCBtZW1vcnksIGlkeCk7CisgICAgICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIHRyaWdnZXJpbmcgc2NlbmUgc2VsZWN0IHByZXZpZXcgY2FsbGJhY2siKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5zZXRTZWxlY3RlZFNjZW5lKENBTV9TQ0VORV9NT0RFX01BWCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJObyBwcmV2aWV3IGJ1ZmZlciBmb3VuZCBpbiBzY2VuZSBzZWxlY3Qgc3VwZXIgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJObyBjdXJyZW50IHNjZW5lIG1ldGFkYXRhISIpOworICAgICAgICByYyA9IE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhcHR1cmVfY2hhbm5lbF9jYl9yb3V0aW5lCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBmdW5jdGlvbiB0byBoYW5kbGUgc25hcHNob3Qgc3VwZXJidWYgY2FsbGJhY2sgZGlyZWN0bHkgZnJvbQorICogICAgICAgICAgICAgIG1tLWNhbWVyYS1pbnRlcmZhY2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHJlY3ZkX2ZyYW1lIDogcmVjZWl2ZWQgc3VwZXIgYnVmZmVyCisgKiAgIEB1c2VyZGF0YSAgICA6IHVzZXIgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgOiBOb25lCisgKgorICogTk9URSAgICAgIDogcmVjdmRfZnJhbWUgd2lsbCBiZSByZWxlYXNlZCBhZnRlciB0aGlzIGNhbGwgYnkgY2FsbGVyLCBzbyBpZgorICogICAgICAgICAgICAgYXN5bmMgb3BlcmF0aW9uIG5lZWRlZCBmb3IgcmVjdmRfZnJhbWUsIGl0J3Mgb3VyIHJlc3BvbnNpYmlsaXR5CisgKiAgICAgICAgICAgICB0byBzYXZlIGEgY29weSBmb3IgdGhpcyB2YXJpYWJsZSB0byBiZSB1c2VkIGxhdGVyLgorKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Y2FwdHVyZV9jaGFubmVsX2NiX3JvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgS1BJX0FUUkFDRV9DQUxMKCk7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIExPR0goIltLUEkgUGVyZl06IEUgUFJPRklMRV9ZVVZfQ0JfVE9fSEFMIik7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqcG1lID0gKFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKil1c2VyZGF0YTsKKyAgICBpZiAocG1lID09IE5VTEwgfHwKKyAgICAgICAgcG1lLT5tQ2FtZXJhSGFuZGxlID09IE5VTEwgfHwKKyAgICAgICAgcG1lLT5tQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlICE9IHJlY3ZkX2ZyYW1lLT5jYW1lcmFfaGFuZGxlKXsKKyAgICAgICAgTE9HRSgiY2FtZXJhIG9iaiBub3QgdmFsaWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFFDYW1lcmFDaGFubmVsICpwQ2hhbm5lbCA9IHBtZS0+bV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfQ0FQVFVSRV07CisgICAgaWYgKHBDaGFubmVsID09IE5VTEwgfHwKKyAgICAgICAgcENoYW5uZWwtPmdldE15SGFuZGxlKCkgIT0gcmVjdmRfZnJhbWUtPmNoX2lkKSB7CisgICAgICAgIExPR0UoIkNhcHR1cmUgY2hhbm5lbCBkb2Vzbid0IGV4aXN0LCByZXR1cm4gaGVyZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gc2F2ZSBhIGNvcHkgZm9yIHRoZSBzdXBlcmJ1ZgorICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCogZnJhbWUgPQorICAgICAgICAgICAgICAgKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqKW1hbGxvYyhzaXplb2YobW1fY2FtZXJhX3N1cGVyX2J1Zl90KSk7CisgICAgaWYgKGZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgdG8gc2F2ZSByZWNlaXZlZF9mcmFtZSBzdHJ1Y3R1cmUuIik7CisgICAgICAgIHBDaGFubmVsLT5idWZEb25lKHJlY3ZkX2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAqZnJhbWUgPSAqcmVjdmRfZnJhbWU7CisKKyAgICBpZiAocmVjdmRfZnJhbWUtPm51bV9idWZzID4gMCkgeworICAgICAgICBMT0dJKCJbS1BJIFBlcmZdOiBzdXBlcmJ1ZiBmcmFtZV9pZHggJWQiLAorICAgICAgICAgICAgICAgIHJlY3ZkX2ZyYW1lLT5idWZzWzBdLT5mcmFtZV9pZHgpOworICAgIH0KKworICAgIGZvciAoIHVpbnQzMl90IGk9IDAgOyBpIDwgcmVjdmRfZnJhbWUtPm51bV9idWZzIDsgaSsrICkgeworICAgICAgICBpZiAoIHJlY3ZkX2ZyYW1lLT5idWZzW2ldLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QgKSB7CisgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICogeXV2X2ZyYW1lID0gcmVjdmRfZnJhbWUtPmJ1ZnNbaV07CisgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0gcENoYW5uZWwtPmdldFN0cmVhbUJ5SGFuZGxlKHl1dl9mcmFtZS0+c3RyZWFtX2lkKTsKKyAgICAgICAgICAgIGlmICggTlVMTCAhPSBwU3RyZWFtICkgeworICAgICAgICAgICAgICAgIHBtZS0+ZHVtcEZyYW1lVG9GaWxlKHBTdHJlYW0sIHl1dl9mcmFtZSwgUUNBTUVSQV9EVU1QX0ZSTV9JTlBVVF9SRVBST0NFU1MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmR1bXBtZXRhZGF0YSIsIHZhbHVlLCAiMCIpOworICAgIGludDMyX3QgZW5hYmxlZCA9IGF0b2kodmFsdWUpOworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKnBNZXRhRnJhbWUgPSBOVUxMOworICAgICAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0gTlVMTDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGZyYW1lLT5udW1fYnVmczsgaSsrKSB7CisgICAgICAgICAgICBwU3RyZWFtID0gcENoYW5uZWwtPmdldFN0cmVhbUJ5SGFuZGxlKGZyYW1lLT5idWZzW2ldLT5zdHJlYW1faWQpOworICAgICAgICAgICAgaWYgKHBTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmIChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpKSB7CisgICAgICAgICAgICAgICAgICAgIHBNZXRhRnJhbWUgPSBmcmFtZS0+YnVmc1tpXTsgLy9maW5kIHRoZSBtZXRhZGF0YQorICAgICAgICAgICAgICAgICAgICBpZiAocE1ldGFGcmFtZSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtZXRhZGF0YV9idWZmZXJfdCAqKXBNZXRhRnJhbWUtPmJ1ZmZlciktPmlzX3R1bmluZ19wYXJhbXNfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+ZHVtcE1ldGFkYXRhVG9GaWxlKHBTdHJlYW0sIHBNZXRhRnJhbWUsIChjaGFyICopICJTbmFwc2hvdCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdhaXQgb24gUG9zdHByb2MgaW5pdGlhbGl6YXRpb24gaWYgbmVlZGVkCisgICAgLy8gdGhlbiBzZW5kIHRvIHBvc3Rwcm9jZXNzb3IKKyAgICBpZiAoKE5PX0VSUk9SICE9IHBtZS0+d2FpdERlZmVycmVkV29yayhwbWUtPm1SZXByb2NKb2IpKSB8fAorICAgICAgICAgICAgKE5PX0VSUk9SICE9IHBtZS0+bV9wb3N0cHJvY2Vzc29yLnByb2Nlc3NEYXRhKGZyYW1lKSkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHRyaWdnZXIgcHJvY2VzcyBkYXRhIik7CisgICAgICAgIHBDaGFubmVsLT5idWZEb25lKHJlY3ZkX2ZyYW1lKTsKKyAgICAgICAgZnJlZShmcmFtZSk7CisgICAgICAgIGZyYW1lID0gTlVMTDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworLyogU1RBUlQgb2YgdGVzdCByZWdpc3RlciBmYWNlIGltYWdlIGZvciBmYWNlIGF1dGhlbnRpY2F0aW9uICovCisjaWZkZWYgUUNPTV9URVNUX0ZBQ0VfUkVHSVNURVJfRkFDRQorICAgIHN0YXRpYyB1aW50OF90IGJSdW5GYWNlUmVnID0gMTsKKworICAgIGlmIChiUnVuRmFjZVJlZyA+IDApIHsKKyAgICAgICAgLy8gZmluZCBzbmFwc2hvdCBmcmFtZQorICAgICAgICBRQ2FtZXJhU3RyZWFtICptYWluX3N0cmVhbSA9IE5VTEw7CisgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1haW5fZnJhbWUgPSBOVUxMOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlY3ZkX2ZyYW1lLT5udW1fYnVmczsgaSsrKSB7CisgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0KKyAgICAgICAgICAgICAgICBwQ2hhbm5lbC0+Z2V0U3RyZWFtQnlIYW5kbGUocmVjdmRfZnJhbWUtPmJ1ZnNbaV0tPnN0cmVhbV9pZCk7CisgICAgICAgICAgICBpZiAocFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFpbl9zdHJlYW0gPSBwU3RyZWFtOworICAgICAgICAgICAgICAgICAgICBtYWluX2ZyYW1lID0gcmVjdmRfZnJhbWUtPmJ1ZnNbaV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobWFpbl9zdHJlYW0gIT0gTlVMTCAmJiBtYWluX2ZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGludDMyX3QgZmFjZUlkID0gLTE7CisgICAgICAgICAgICBjYW1fcHBfb2ZmbGluZV9zcmNfY29uZmlnX3QgY29uZmlnOworICAgICAgICAgICAgbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjYW1fcHBfb2ZmbGluZV9zcmNfY29uZmlnX3QpKTsKKyAgICAgICAgICAgIGNvbmZpZy5udW1fb2ZfYnVmcyA9IDE7CisgICAgICAgICAgICBtYWluX3N0cmVhbS0+Z2V0Rm9ybWF0KGNvbmZpZy5pbnB1dF9mbXQpOworICAgICAgICAgICAgbWFpbl9zdHJlYW0tPmdldEZyYW1lRGltZW5zaW9uKGNvbmZpZy5pbnB1dF9kaW0pOworICAgICAgICAgICAgbWFpbl9zdHJlYW0tPmdldEZyYW1lT2Zmc2V0KGNvbmZpZy5pbnB1dF9idWZfcGxhbmVzLnBsYW5lX2luZm8pOworICAgICAgICAgICAgTE9HSCgiREVCVUc6IHJlZ2lzdGVyRmFjZUltYWdlIEUiKTsKKyAgICAgICAgICAgIGludDMyX3QgcmMgPSBwbWUtPnJlZ2lzdGVyRmFjZUltYWdlKG1haW5fZnJhbWUtPmJ1ZmZlciwgJmNvbmZpZywgZmFjZUlkKTsKKyAgICAgICAgICAgIExPR0goIkRFQlVHOiByZWdpc3RlckZhY2VJbWFnZSBYLCByZXQ9JWQsIGZhY2VJZD0lZCIsIHJjLCBmYWNlSWQpOworICAgICAgICAgICAgYlJ1bkZhY2VSZWcgPSAwOworICAgICAgICB9CisgICAgfQorCisjZW5kaWYKKy8qIEVORCBvZiB0ZXN0IHJlZ2lzdGVyIGZhY2UgaW1hZ2UgZm9yIGZhY2UgYXV0aGVudGljYXRpb24gKi8KKworICAgIExPR0goIltLUEkgUGVyZl06IFgiKTsKK30KKyNpZmRlZiBUQVJHRVRfVFNfTUFLRVVQCitib29sIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OlRzTWFrZXVwUHJvY2Vzc19QcmV2aWV3KG1tX2NhbWVyYV9idWZfZGVmX3QgKnBGcmFtZSwKKyAgICAgICAgUUNhbWVyYVN0cmVhbSAqIHBTdHJlYW0pIHsKKyAgICBMT0dEKCJiZWdpbiIpOworICAgIGJvb2wgYlJldCA9IGZhbHNlOworICAgIGlmIChwU3RyZWFtID09IE5VTEwgfHwgcEZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgYlJldCA9IGZhbHNlOworICAgICAgICBMT0dIKCJwU3RyZWFtID09IE5VTEwgfHwgcEZyYW1lID09IE5VTEwiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBiUmV0ID0gVHNNYWtldXBQcm9jZXNzKHBGcmFtZSwgcFN0cmVhbSwgbUZhY2VSZWN0KTsKKyAgICB9CisgICAgTE9HRCgiZW5kIGJSZXQgPSAlZCAiLGJSZXQpOworICAgIHJldHVybiBiUmV0OworfQorCitib29sIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OlRzTWFrZXVwUHJvY2Vzc19TbmFwc2hvdChtbV9jYW1lcmFfYnVmX2RlZl90ICpwRnJhbWUsCisgICAgICAgIFFDYW1lcmFTdHJlYW0gKiBwU3RyZWFtKSB7CisgICAgTE9HRCgiYmVnaW4iKTsKKyAgICBib29sIGJSZXQgPSBmYWxzZTsKKyAgICBpZiAocFN0cmVhbSA9PSBOVUxMIHx8IHBGcmFtZSA9PSBOVUxMKSB7CisgICAgICAgIGJSZXQgPSBmYWxzZTsKKyAgICAgICAgTE9HSCgicFN0cmVhbSA9PSBOVUxMIHx8IHBGcmFtZSA9PSBOVUxMIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCBvZmZzZXQ7CisgICAgICAgIG1lbXNldCgmb2Zmc2V0LCAwLCBzaXplb2YoY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCkpOworICAgICAgICBwU3RyZWFtLT5nZXRGcmFtZU9mZnNldChvZmZzZXQpOworCisgICAgICAgIGNhbV9kaW1lbnNpb25fdCBkaW07CisgICAgICAgIHBTdHJlYW0tPmdldEZyYW1lRGltZW5zaW9uKGRpbSk7CisKKyAgICAgICAgdW5zaWduZWQgY2hhciAqeUJ1ZiAgPSAodW5zaWduZWQgY2hhciopcEZyYW1lLT5idWZmZXI7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnV2QnVmID0geUJ1ZiArIG9mZnNldC5tcFswXS5sZW47CisgICAgICAgIFRTTWFrZXVwRGF0YUV4IGluTWFrZXVwRGF0YTsKKyAgICAgICAgaW5NYWtldXBEYXRhLmZyYW1lV2lkdGggID0gZGltLndpZHRoOworICAgICAgICBpbk1ha2V1cERhdGEuZnJhbWVIZWlnaHQgPSBkaW0uaGVpZ2h0OworICAgICAgICBpbk1ha2V1cERhdGEueUJ1ZiAgPSB5QnVmOworICAgICAgICBpbk1ha2V1cERhdGEudXZCdWYgPSB1dkJ1ZjsKKyAgICAgICAgaW5NYWtldXBEYXRhLnlTdHJpZGUgID0gb2Zmc2V0Lm1wWzBdLnN0cmlkZTsKKyAgICAgICAgaW5NYWtldXBEYXRhLnV2U3RyaWRlID0gb2Zmc2V0Lm1wWzFdLnN0cmlkZTsKKyAgICAgICAgTE9HRCgiZGV0ZWN0IGJlZ2luIik7CisgICAgICAgIFRTSGFuZGxlIGZkX2hhbmRsZSA9IHRzX2RldGVjdGZhY2VfY3JlYXRlX2NvbnRleHQoKTsKKyAgICAgICAgaWYgKGZkX2hhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjYW1fZm9ybWF0X3QgZm10OworICAgICAgICAgICAgcFN0cmVhbS0+Z2V0Rm9ybWF0KGZtdCk7CisgICAgICAgICAgICBpbnQgaXJldCA9IHRzX2RldGVjdGZhY2VfZGV0ZWN0RXgoZmRfaGFuZGxlLCAmaW5NYWtldXBEYXRhKTsKKyAgICAgICAgICAgIExPR0QoInRzX2RldGVjdGZhY2VfZGV0ZWN0IGlyZXQgPSAlZCIsaXJldCk7CisgICAgICAgICAgICBpZiAoaXJldCA8PSAwKSB7CisgICAgICAgICAgICAgICAgYlJldCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBUU1JlY3QgZmFjZVJlY3Q7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZmYWNlUmVjdCwtMSxzaXplb2YoVFNSZWN0KSk7CisgICAgICAgICAgICAgICAgaXJldCA9IHRzX2RldGVjdGZhY2VfZ2V0X2ZhY2VfaW5mbyhmZF9oYW5kbGUsIDAsICZmYWNlUmVjdCwgTlVMTCxOVUxMLE5VTEwpOworICAgICAgICAgICAgICAgIExPR0QoInRzX2RldGVjdGZhY2VfZ2V0X2ZhY2VfaW5mbyBpcmV0PSVkLGZhY2VSZWN0LmxlZnQ9JWxkLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmYWNlUmVjdC50b3A9JWxkLGZhY2VSZWN0LnJpZ2h0PSVsZCxmYWNlUmVjdC5ib3R0b209JWxkIgorICAgICAgICAgICAgICAgICAgICAgICAgLGlyZXQsZmFjZVJlY3QubGVmdCxmYWNlUmVjdC50b3AsZmFjZVJlY3QucmlnaHQsZmFjZVJlY3QuYm90dG9tKTsKKyAgICAgICAgICAgICAgICBiUmV0ID0gVHNNYWtldXBQcm9jZXNzKHBGcmFtZSxwU3RyZWFtLGZhY2VSZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRzX2RldGVjdGZhY2VfZGVzdHJveV9jb250ZXh0KCZmZF9oYW5kbGUpOworICAgICAgICAgICAgZmRfaGFuZGxlID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0goImZkX2hhbmRsZSA9PSBOVUxMIik7CisgICAgICAgIH0KKyAgICAgICAgTE9HRCgiZGV0ZWN0IGVuZCIpOworICAgIH0KKyAgICBMT0dEKCJlbmQgYlJldCA9ICVkICIsYlJldCk7CisgICAgcmV0dXJuIGJSZXQ7Cit9CisKK2Jvb2wgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6VHNNYWtldXBQcm9jZXNzKG1tX2NhbWVyYV9idWZfZGVmX3QgKnBGcmFtZSwKKyAgICAgICAgUUNhbWVyYVN0cmVhbSAqIHBTdHJlYW0sVFNSZWN0JiBmYWNlUmVjdCkgeworICAgIGJvb2wgYlJldCA9IGZhbHNlOworICAgIExPR0QoImJlZ2luIik7CisgICAgaWYgKHBTdHJlYW0gPT0gTlVMTCB8fCBwRnJhbWUgPT0gTlVMTCkgeworICAgICAgICBMT0dIKCJwU3RyZWFtID09IE5VTEwgfHwgcEZyYW1lID09IE5VTEwgIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgd2hpdGVMZXZlbCwgY2xlYW5MZXZlbDsKKyAgICBib29sIGVuYWJsZU1ha2V1cCA9IChmYWNlUmVjdC5sZWZ0ID4gLTEpICYmCisgICAgICAgICAgICAobVBhcmFtZXRlcnMuZ2V0VHNNYWtldXBJbmZvKHdoaXRlTGV2ZWwsIGNsZWFuTGV2ZWwpKTsKKyAgICBpZiAoZW5hYmxlTWFrZXVwKSB7CisgICAgICAgIGNhbV9kaW1lbnNpb25fdCBkaW07CisgICAgICAgIGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3Qgb2Zmc2V0OworICAgICAgICBwU3RyZWFtLT5nZXRGcmFtZURpbWVuc2lvbihkaW0pOworICAgICAgICBwU3RyZWFtLT5nZXRGcmFtZU9mZnNldChvZmZzZXQpOworICAgICAgICB1bnNpZ25lZCBjaGFyICp0ZW1wT3JpQnVmID0gTlVMTDsKKworICAgICAgICB0ZW1wT3JpQnVmID0gKHVuc2lnbmVkIGNoYXIqKXBGcmFtZS0+YnVmZmVyOworICAgICAgICB1bnNpZ25lZCBjaGFyICp5QnVmID0gdGVtcE9yaUJ1ZjsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqdXZCdWYgPSB0ZW1wT3JpQnVmICsgb2Zmc2V0Lm1wWzBdLmxlbjsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqdG1wQnVmID0gbmV3IHVuc2lnbmVkIGNoYXJbb2Zmc2V0LmZyYW1lX2xlbl07CisgICAgICAgIGlmICh0bXBCdWYgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HSCgidG1wQnVmID09IE5VTEwgIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgVFNNYWtldXBEYXRhRXggaW5NYWtldXBEYXRhLCBvdXRNYWtldXBEYXRhOworICAgICAgICB3aGl0ZUxldmVsID0gIHdoaXRlTGV2ZWwgPD0gMCA/IDAgOiAod2hpdGVMZXZlbCA+PSAxMDAgPyAxMDAgOiB3aGl0ZUxldmVsKTsKKyAgICAgICAgY2xlYW5MZXZlbCA9ICBjbGVhbkxldmVsIDw9IDAgPyAwIDogKGNsZWFuTGV2ZWwgPj0gMTAwID8gMTAwIDogY2xlYW5MZXZlbCk7CisgICAgICAgIGluTWFrZXVwRGF0YS5mcmFtZVdpZHRoID0gZGltLndpZHRoOyAgLy8gTlYyMSBGcmFtZSB3aWR0aCAgPiAwCisgICAgICAgIGluTWFrZXVwRGF0YS5mcmFtZUhlaWdodCA9IGRpbS5oZWlnaHQ7IC8vIE5WMjEgRnJhbWUgaGVpZ2h0ID4gMAorICAgICAgICBpbk1ha2V1cERhdGEueUJ1ZiA9ICB5QnVmOyAvLyAgWSBidWZmZXIgcG9pbnRlcgorICAgICAgICBpbk1ha2V1cERhdGEudXZCdWYgPSB1dkJ1ZjsgLy8gVlUgYnVmZmVyIHBvaW50ZXIKKyAgICAgICAgaW5NYWtldXBEYXRhLnlTdHJpZGUgID0gb2Zmc2V0Lm1wWzBdLnN0cmlkZTsKKyAgICAgICAgaW5NYWtldXBEYXRhLnV2U3RyaWRlID0gb2Zmc2V0Lm1wWzFdLnN0cmlkZTsKKyAgICAgICAgb3V0TWFrZXVwRGF0YS5mcmFtZVdpZHRoID0gZGltLndpZHRoOyAvLyBOVjIxIEZyYW1lIHdpZHRoICA+IDAKKyAgICAgICAgb3V0TWFrZXVwRGF0YS5mcmFtZUhlaWdodCA9IGRpbS5oZWlnaHQ7IC8vIE5WMjEgRnJhbWUgaGVpZ2h0ID4gMAorICAgICAgICBvdXRNYWtldXBEYXRhLnlCdWYgPSAgdG1wQnVmOyAvLyAgWSBidWZmZXIgcG9pbnRlcgorICAgICAgICBvdXRNYWtldXBEYXRhLnV2QnVmID0gdG1wQnVmICsgb2Zmc2V0Lm1wWzBdLmxlbjsgLy8gVlUgYnVmZmVyIHBvaW50ZXIKKyAgICAgICAgb3V0TWFrZXVwRGF0YS55U3RyaWRlICA9IG9mZnNldC5tcFswXS5zdHJpZGU7CisgICAgICAgIG91dE1ha2V1cERhdGEudXZTdHJpZGUgPSBvZmZzZXQubXBbMV0uc3RyaWRlOworICAgICAgICBMT0dEKCJmYWNlUmVjdDpsZWZ0IDI6JWxkLCxyaWdodDolbGQsLHRvcDolbGQsLGJvdHRvbTolbGQsLExldmVsOiVkeCVkIiwKKyAgICAgICAgICAgIGZhY2VSZWN0LmxlZnQsZmFjZVJlY3QucmlnaHQsZmFjZVJlY3QudG9wLGZhY2VSZWN0LmJvdHRvbSxjbGVhbkxldmVsLHdoaXRlTGV2ZWwpOworICAgICAgICB0c19tYWtldXBfc2tpbl9iZWF1dHlFeCgmaW5NYWtldXBEYXRhLCAmb3V0TWFrZXVwRGF0YSwgJihmYWNlUmVjdCksY2xlYW5MZXZlbCx3aGl0ZUxldmVsKTsKKyAgICAgICAgbWVtY3B5KCh1bnNpZ25lZCBjaGFyKilwRnJhbWUtPmJ1ZmZlciwgdG1wQnVmLCBvZmZzZXQuZnJhbWVfbGVuKTsKKyAgICAgICAgUUNhbWVyYU1lbW9yeSAqbWVtb3J5ID0gKFFDYW1lcmFNZW1vcnkgKilwRnJhbWUtPm1lbV9pbmZvOworICAgICAgICBtZW1vcnktPmNsZWFuQ2FjaGUocEZyYW1lLT5idWZfaWR4KTsKKyAgICAgICAgaWYgKHRtcEJ1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWxldGVbXSB0bXBCdWY7CisgICAgICAgICAgICB0bXBCdWYgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIExPR0QoImVuZCBiUmV0ID0gJWQgIixiUmV0KTsKKyAgICByZXR1cm4gYlJldDsKK30KKyNlbmRpZgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwb3N0cHJvY19jaGFubmVsX2NiX3JvdXRpbmUKKyAqCisgKiBERVNDUklQVElPTjogaGVscGVyIGZ1bmN0aW9uIHRvIGhhbmRsZSBwb3N0cHJvY2VzcyBzdXBlcmJ1ZiBjYWxsYmFjayBkaXJlY3RseSBmcm9tCisgKiAgICAgICAgICAgICAgbW0tY2FtZXJhLWludGVyZmFjZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVjdmRfZnJhbWUgOiByZWNlaXZlZCBzdXBlciBidWZmZXIKKyAqICAgQHVzZXJkYXRhICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICA6IE5vbmUKKyAqCisgKiBOT1RFICAgICAgOiByZWN2ZF9mcmFtZSB3aWxsIGJlIHJlbGVhc2VkIGFmdGVyIHRoaXMgY2FsbCBieSBjYWxsZXIsIHNvIGlmCisgKiAgICAgICAgICAgICBhc3luYyBvcGVyYXRpb24gbmVlZGVkIGZvciByZWN2ZF9mcmFtZSwgaXQncyBvdXIgcmVzcG9uc2liaWxpdHkKKyAqICAgICAgICAgICAgIHRvIHNhdmUgYSBjb3B5IGZvciB0aGlzIHZhcmlhYmxlIHRvIGJlIHVzZWQgbGF0ZXIuCisqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpwb3N0cHJvY19jaGFubmVsX2NiX3JvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTE9HSCgiW0tQSSBQZXJmXTogRSIpOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKnBtZSA9IChRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICopdXNlcmRhdGE7CisgICAgaWYgKHBtZSA9PSBOVUxMIHx8CisgICAgICAgIHBtZS0+bUNhbWVyYUhhbmRsZSA9PSBOVUxMIHx8CisgICAgICAgIHBtZS0+bUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSAhPSByZWN2ZF9mcmFtZS0+Y2FtZXJhX2hhbmRsZSl7CisgICAgICAgIExPR0UoImNhbWVyYSBvYmogbm90IHZhbGlkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBzYXZlIGEgY29weSBmb3IgdGhlIHN1cGVyYnVmCisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90KiBmcmFtZSA9CisgICAgICAgICAgICAgICAobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICopbWFsbG9jKHNpemVvZihtbV9jYW1lcmFfc3VwZXJfYnVmX3QpKTsKKyAgICBpZiAoZnJhbWUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSB0byBzYXZlIHJlY2VpdmVkX2ZyYW1lIHN0cnVjdHVyZS4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAqZnJhbWUgPSAqcmVjdmRfZnJhbWU7CisKKyAgICBpZiAocmVjdmRfZnJhbWUtPm51bV9idWZzID4gMCkgeworICAgICAgICBMT0dJKCJbS1BJIFBlcmZdOiBmcmFtZV9pZHggJWQiLCByZWN2ZF9mcmFtZS0+YnVmc1swXS0+ZnJhbWVfaWR4KTsKKyAgICB9CisgICAgLy8gV2FpdCBvbiBKUEVHIGNyZWF0ZSBzZXNzaW9uCisgICAgcG1lLT53YWl0RGVmZXJyZWRXb3JrKHBtZS0+bUpwZWdKb2IpOworCisgICAgLy8gc2VuZCB0byBwb3N0cHJvY2Vzc29yCisgICAgcG1lLT5tX3Bvc3Rwcm9jZXNzb3IucHJvY2Vzc1BQRGF0YShmcmFtZSk7CisKKyAgICBBVFJBQ0VfSU5UKCJDYW1lcmE6UmVwcm9jZXNzIiwgMCk7CisgICAgTE9HSCgiW0tQSSBQZXJmXTogWCIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN5bmNocm9ub3VzX3N0cmVhbV9jYl9yb3V0aW5lCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIHRvIGhhbmRsZSBTVFJFQU0gU1lOQyBDQUxMQkFDS1MKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN1cGVyX2ZyYW1lIDogcmVjZWl2ZWQgc3VwZXIgYnVmZmVyCisgKiAgIEBzdHJlYW0gICAgICA6IHN0cmVhbSBvYmplY3QKKyAqICAgQHVzZXJkYXRhICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICA6IE5vbmUKKyAqCisgKiBOT1RFICAgICAgOiBUaGlzIEZ1bmN0aW9uIGlzIGV4Y2VjdXRlZCBpbiBtbS1pbnRlcmZhY2UgY29udGV4dC4KKyAqICAgICAgICAgICAgIEF2b2lkIGFkZGluZyBsYXRlbmN5IG9uIHRoaXMgdGhyZWFkLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnN5bmNocm9ub3VzX3N0cmVhbV9jYl9yb3V0aW5lKAorICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2ZyYW1lLCBRQ2FtZXJhU3RyZWFtICogc3RyZWFtLAorICAgICAgICB2b2lkICp1c2VyZGF0YSkKK3sKKyAgICBuc2Vjc190IGZyYW1lVGltZSA9IDAsIG1QcmV2aWV3VGltZXN0YW1wID0gMDsKKyAgICBpbnQgZXJyID0gTk9fRVJST1I7CisKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIExPR0goIltLUEkgUGVyZl0gOiBCRUdJTiIpOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKnBtZSA9IChRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICopdXNlcmRhdGE7CisKKyAgICBpZiAocG1lID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBoYXJkd2FyZSBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoc3VwZXJfZnJhbWUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHN1cGVyIGJ1ZmZlciIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lID0gc3VwZXJfZnJhbWUtPmJ1ZnNbMF07CisgICAgaWYgKE5VTEwgPT0gZnJhbWUpIHsKKyAgICAgICAgTE9HRSgiRnJhbWUgaXMgTlVMTCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHN0cmVhbS0+Z2V0TXlUeXBlKCkgIT0gQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcpIHsKKyAgICAgICAgTE9HRSgiVGhpcyBpcyBvbmx5IGZvciBQUkVWSUVXIHN0cmVhbSBmb3Igbm93Iik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZihwbWUtPm1fYlByZXZpZXdTdGFydGVkKSB7CisgICAgICAgIExPR0koIltLUEkgUGVyZl0gOiBQUk9GSUxFX0ZJUlNUX1BSRVZJRVdfRlJBTUUiKTsKKyAgICAgICAgcG1lLT5tX2JQcmV2aWV3U3RhcnRlZCA9IGZhbHNlOworICAgIH0KKworICAgIFFDYW1lcmFHcmFsbG9jTWVtb3J5ICptZW1vcnkgPSAoUUNhbWVyYUdyYWxsb2NNZW1vcnkgKikgZnJhbWUtPm1lbV9pbmZvOworICAgIGlmICghcG1lLT5uZWVkUHJvY2Vzc1ByZXZpZXdGcmFtZShmcmFtZS0+ZnJhbWVfaWR4KSkgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnBtZS0+bUdyYWxsb2NMb2NrKTsKKyAgICAgICAgcG1lLT5tTGFzdFByZXZpZXdGcmFtZUlEID0gZnJhbWUtPmZyYW1lX2lkeDsKKyAgICAgICAgbWVtb3J5LT5zZXRCdWZmZXJTdGF0dXMoZnJhbWUtPmJ1Zl9pZHgsIFNUQVRVU19TS0lQUEVEKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBtZS0+bUdyYWxsb2NMb2NrKTsKKyAgICAgICAgTE9HSCgicHJldmlldyBpcyBub3QgcnVubmluZywgbm8gbmVlZCB0byBwcm9jZXNzIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocG1lLT5uZWVkRGVidWdGcHMoKSkgeworICAgICAgICBwbWUtPmRlYnVnU2hvd1ByZXZpZXdGUFMoKTsKKyAgICB9CisKKyAgICBmcmFtZVRpbWUgPSBuc2Vjc190KGZyYW1lLT50cy50dl9zZWMpICogMTAwMDAwMDAwMExMICsgZnJhbWUtPnRzLnR2X25zZWM7CisgICAgLy8gQ29udmVydCBCb290dGltZSBmcm9tIGNhbWVyYSB0byBNb25vdGltZSBmb3IgZGlzcGxheSBpZiBuZWVkZWQuCisgICAgLy8gT3RoZXJ3aXNlLCBtQm9vdFRvTW9ub1RpbWVzdGFtcE9mZnNldCB2YWx1ZSB3aWxsIGJlIDAuCisgICAgZnJhbWVUaW1lID0gZnJhbWVUaW1lIC0gcG1lLT5tQm9vdFRvTW9ub1RpbWVzdGFtcE9mZnNldDsKKyAgICAvLyBDYWxjdWxhdGUgdGhlIGZ1dHVyZSBwcmVzZW50YXRpb24gdGltZSBzdGFtcCBmb3IgZGlzcGxheWluZyBmcmFtZXMgYXQgcmVndWxhciBpbnRlcnZhbAorICAgIG1QcmV2aWV3VGltZXN0YW1wID0gcG1lLT5tQ2FtZXJhRGlzcGxheS5jb21wdXRlUHJlc2VudGF0aW9uVGltZVN0YW1wKGZyYW1lVGltZSk7CisgICAgc3RyZWFtLT5tU3RyZWFtVGltZXN0YW1wID0gZnJhbWVUaW1lOworCisjaWZkZWYgVEFSR0VUX1RTX01BS0VVUAorICAgIHBtZS0+VHNNYWtldXBQcm9jZXNzX1ByZXZpZXcoZnJhbWUsc3RyZWFtKTsKKyNlbmRpZgorCisgICAgLy8gRW5xdWV1ZSAgYnVmZmVyIHRvIGdyYWxsb2MuCisgICAgdWludDMyX3QgaWR4ID0gZnJhbWUtPmJ1Zl9pZHg7CisgICAgTE9HRCgiJXAgRW5xdWV1ZSBCdWZmZXIgdG8gZGlzcGxheSAlZCBmcmFtZSBUaW1lID0gJWxsZCBEaXNwbGF5IFRpbWUgPSAlbGxkIiwKKyAgICAgICAgICAgIHBtZSwgaWR4LCBmcmFtZVRpbWUsIG1QcmV2aWV3VGltZXN0YW1wKTsKKyAgICBlcnIgPSBtZW1vcnktPmVucXVldWVCdWZmZXIoaWR4LCBtUHJldmlld1RpbWVzdGFtcCk7CisKKyAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcG1lLT5tR3JhbGxvY0xvY2spOworICAgICAgICBwbWUtPm1MYXN0UHJldmlld0ZyYW1lSUQgPSBmcmFtZS0+ZnJhbWVfaWR4OworICAgICAgICBwbWUtPm1FbnF1ZXVlZEJ1ZmZlcnMrKzsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBtZS0+bUdyYWxsb2NMb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJFbnF1ZXVlIEJ1ZmZlciBmYWlsZWQiKTsKKyAgICB9CisKKyAgICBMT0dIKCJbS1BJIFBlcmZdIDogRU5EIik7CisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByZXZpZXdfc3RyZWFtX2NiX3JvdXRpbmUKKyAqCisgKiBERVNDUklQVElPTjogaGVscGVyIGZ1bmN0aW9uIHRvIGhhbmRsZSBwcmV2aWV3IGZyYW1lIGZyb20gcHJldmlldyBzdHJlYW0gaW4KKyAqICAgICAgICAgICAgICBub3JtYWwgY2FzZSB3aXRoIGRpc3BsYXkuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdXBlcl9mcmFtZSA6IHJlY2VpdmVkIHN1cGVyIGJ1ZmZlcgorICogICBAc3RyZWFtICAgICAgOiBzdHJlYW0gb2JqZWN0CisgKiAgIEB1c2VyZGF0YSAgICA6IHVzZXIgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgOiBOb25lCisgKgorICogTk9URSAgICAgIDogY2FsbGVyIHBhc3NlcyB0aGUgb3duZXJzaGlwIG9mIHN1cGVyX2ZyYW1lLCBpdCdzIG91cgorICogICAgICAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSBzdXBlcl9mcmFtZSBvbmNlIGl0J3MgZG9uZS4gVGhlIG5ldworICogICAgICAgICAgICAgcHJldmlldyBmcmFtZSB3aWxsIGJlIHNlbnQgdG8gZGlzcGxheSwgYW5kIGFuIG9sZGVyIGZyYW1lCisgKiAgICAgICAgICAgICB3aWxsIGJlIGRlcXVldWVkIGZyb20gZGlzcGxheSBhbmQgbmVlZHMgdG8gYmUgcmV0dXJuZWQgYmFjaworICogICAgICAgICAgICAgdG8ga2VybmVsIGZvciBmdXR1cmUgdXNlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnByZXZpZXdfc3RyZWFtX2NiX3JvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKQoreworICAgIEtQSV9BVFJBQ0VfQ0FMTCgpOworICAgIExPR0goIltLUEkgUGVyZl0gOiBCRUdJTiIpOworICAgIGludCBlcnIgPSBOT19FUlJPUjsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpwbWUgPSAoUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqKXVzZXJkYXRhOworICAgIFFDYW1lcmFHcmFsbG9jTWVtb3J5ICptZW1vcnkgPSAoUUNhbWVyYUdyYWxsb2NNZW1vcnkgKilzdXBlcl9mcmFtZS0+YnVmc1swXS0+bWVtX2luZm87CisgICAgdWludDhfdCBkZXF1ZXVlQ250ID0gMDsKKworICAgIGlmIChwbWUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGhhcmR3YXJlIG9iamVjdCIpOworICAgICAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobWVtb3J5ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBtZW1vcnkgb2JqZWN0Iik7CisgICAgICAgIGZyZWUoc3VwZXJfZnJhbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqZnJhbWUgPSBzdXBlcl9mcmFtZS0+YnVmc1swXTsKKyAgICBpZiAoTlVMTCA9PSBmcmFtZSkgeworICAgICAgICBMT0dFKCJwcmV2aWV3IGZyYW1lIGlzIE5MVUwiKTsKKyAgICAgICAgZnJlZShzdXBlcl9mcmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBGb3IgaW5zdGFudCBjYXB0dXJlIGFuZCBmb3IgaW5zdGFudCBBRUMsIGtlZXAgdHJhY2sgb2YgdGhlIGZyYW1lIGNvdW50ZXIuCisgICAgLy8gVGhpcyBjb3VudCB3aWxsIGJlIHVzZWQgdG8gY2hlY2sgYWdhaW5zdCB0aGUgY29ycmVzcG9uZGluZyBib3VuZCB2YWx1ZXMuCisgICAgaWYgKHBtZS0+bVBhcmFtZXRlcnMuaXNJbnN0YW50QUVDRW5hYmxlZCgpIHx8CisgICAgICAgICAgICBwbWUtPm1QYXJhbWV0ZXJzLmlzSW5zdGFudENhcHR1cmVFbmFibGVkKCkpIHsKKyAgICAgICAgcG1lLT5tSW5zdGFudEFlY0ZyYW1lQ291bnQrKzsKKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnBtZS0+bUdyYWxsb2NMb2NrKTsKKyAgICBpZiAoIXN0cmVhbS0+aXNTeW5jQ0JFbmFibGVkKCkpIHsKKyAgICAgICAgcG1lLT5tTGFzdFByZXZpZXdGcmFtZUlEID0gZnJhbWUtPmZyYW1lX2lkeDsKKyAgICB9CisgICAgYm9vbCBkaXNjYXJkRnJhbWUgPSBmYWxzZTsKKyAgICBpZiAoIXN0cmVhbS0+aXNTeW5jQ0JFbmFibGVkKCkgJiYKKyAgICAgICAgICAgICFwbWUtPm5lZWRQcm9jZXNzUHJldmlld0ZyYW1lKGZyYW1lLT5mcmFtZV9pZHgpKQorICAgIHsKKyAgICAgICAgZGlzY2FyZEZyYW1lID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHN0cmVhbS0+aXNTeW5jQ0JFbmFibGVkKCkgJiYKKyAgICAgICAgICAgIG1lbW9yeS0+aXNCdWZTa2lwcGVkKGZyYW1lLT5idWZfaWR4KSkgeworICAgICAgICBkaXNjYXJkRnJhbWUgPSB0cnVlOworICAgICAgICBtZW1vcnktPnNldEJ1ZmZlclN0YXR1cyhmcmFtZS0+YnVmX2lkeCwgU1RBVFVTX0lETEUpOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcG1lLT5tR3JhbGxvY0xvY2spOworCisgICAgaWYgKGRpc2NhcmRGcmFtZSkgeworICAgICAgICBMT0dIKCJwcmV2aWV3IGlzIG5vdCBydW5uaW5nLCBubyBuZWVkIHRvIHByb2Nlc3MiKTsKKyAgICAgICAgc3RyZWFtLT5idWZEb25lKGZyYW1lLT5idWZfaWR4KTsKKyAgICAgICAgZnJlZShzdXBlcl9mcmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBpZHggPSBmcmFtZS0+YnVmX2lkeDsKKworICAgIHBtZS0+ZHVtcEZyYW1lVG9GaWxlKHN0cmVhbSwgZnJhbWUsIFFDQU1FUkFfRFVNUF9GUk1fUFJFVklFVyk7CisKKyAgICBpZihwbWUtPm1fYlByZXZpZXdTdGFydGVkKSB7CisgICAgICAgTE9HSSgiW0tQSSBQZXJmXSA6IFBST0ZJTEVfRklSU1RfUFJFVklFV19GUkFNRSIpOworICAgICAgIHBtZS0+bV9iUHJldmlld1N0YXJ0ZWQgPSBmYWxzZSA7CisgICAgfQorCisgICAgaWYgKCFzdHJlYW0tPmlzU3luY0NCRW5hYmxlZCgpKSB7CisKKyAgICAgICAgaWYgKHBtZS0+bmVlZERlYnVnRnBzKCkpIHsKKyAgICAgICAgICAgIHBtZS0+ZGVidWdTaG93UHJldmlld0ZQUygpOworICAgICAgICB9CisKKyAgICAgICAgTE9HRCgiRW5xdWV1ZSBCdWZmZXIgdG8gZGlzcGxheSAlZCIsIGlkeCk7CisjaWZkZWYgVEFSR0VUX1RTX01BS0VVUAorICAgICAgICBwbWUtPlRzTWFrZXVwUHJvY2Vzc19QcmV2aWV3KGZyYW1lLHN0cmVhbSk7CisjZW5kaWYKKyAgICAgICAgZXJyID0gbWVtb3J5LT5lbnF1ZXVlQnVmZmVyKGlkeCk7CisKKyAgICAgICAgaWYgKGVyciA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwbWUtPm1HcmFsbG9jTG9jayk7CisgICAgICAgICAgICBwbWUtPm1FbnF1ZXVlZEJ1ZmZlcnMrKzsKKyAgICAgICAgICAgIGRlcXVldWVDbnQgPSBwbWUtPm1FbnF1ZXVlZEJ1ZmZlcnM7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcG1lLT5tR3JhbGxvY0xvY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiRW5xdWV1ZSBCdWZmZXIgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnBtZS0+bUdyYWxsb2NMb2NrKTsKKyAgICAgICAgZGVxdWV1ZUNudCA9IHBtZS0+bUVucXVldWVkQnVmZmVyczsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBtZS0+bUdyYWxsb2NMb2NrKTsKKyAgICB9CisKKyAgICAvLyBEaXNwbGF5IHRoZSBidWZmZXIuCisgICAgTE9HRCgiJXAgZGlzcGxheUJ1ZmZlciAlZCBFIiwgcG1lLCBpZHgpOworICAgIHVpbnQ4X3QgbnVtTWFwcGVkID0gbWVtb3J5LT5nZXRNYXBwYWJsZSgpOworCisgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgZGVxdWV1ZUNudDsgaSsrKSB7CisgICAgICAgIGludCBkZXF1ZXVlZElkeCA9IG1lbW9yeS0+ZGVxdWV1ZUJ1ZmZlcigpOworICAgICAgICBpZiAoZGVxdWV1ZWRJZHggPCAwIHx8IGRlcXVldWVkSWR4ID49IG1lbW9yeS0+Z2V0Q250KCkpIHsKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgZGVxdWV1ZWQgYnVmZmVyIGluZGV4ICVkIGZyb20gZGlzcGxheSIsCisgICAgICAgICAgICAgICAgICAgZGVxdWV1ZWRJZHgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnBtZS0+bUdyYWxsb2NMb2NrKTsKKyAgICAgICAgICAgIHBtZS0+bUVucXVldWVkQnVmZmVycy0tOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBtZS0+bUdyYWxsb2NMb2NrKTsKKyAgICAgICAgICAgIGlmIChkZXF1ZXVlZElkeCA+PSBudW1NYXBwZWQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGJ1ZmZlciBoYXMgbm90IHlldCBiZWVuIG1hcHBlZCB0byB0aGUgYmFja2VuZAorICAgICAgICAgICAgICAgIGVyciA9IHN0cmVhbS0+bWFwTmV3QnVmZmVyKCh1aW50MzJfdClkZXF1ZXVlZElkeCk7CisgICAgICAgICAgICAgICAgaWYgKG1lbW9yeS0+Y2hlY2tJZkFsbEJ1ZmZlcnNNYXBwZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBtYXBwaW5nIGlzIGRvbmUgZm9yIGFsbCB0aGUgYnVmZmVycworICAgICAgICAgICAgICAgICAgICAvLyBTaWduYWwgdGhlIGNvbmRpdGlvbiBmb3IgY3JlYXRlIGpwZWcgc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChwbWUtPm1NYXBMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgcG1lLT5tTWFwQ29uZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HSCgiTWFwcGluZyBkb25lIGZvciBhbGwgYnVmcyIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPR0goIkFsbCBidWZmZXJzIGFyZSBub3QgeWV0IG1hcHBlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJidWZmZXIgbWFwcGluZyBmYWlsZWQgJWQiLCBlcnIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gUmV0dXJuIGRlcXVldWVkIGJ1ZmZlciBiYWNrIHRvIGRyaXZlcgorICAgICAgICAgICAgZXJyID0gc3RyZWFtLT5idWZEb25lKCh1aW50MzJfdClkZXF1ZXVlZElkeCk7CisgICAgICAgICAgICBpZiAoIGVyciA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJzdHJlYW0gYnVmRG9uZSBmYWlsZWQgJWQiLCBlcnIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gSGFuZGxlIHByZXZpZXcgZGF0YSBjYWxsYmFjaworICAgIGlmIChwbWUtPm1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX0NBTExCQUNLXSA9PSBOVUxMKSB7CisgICAgICAgIGlmIChwbWUtPm5lZWRTZW5kUHJldmlld0NhbGxiYWNrKCkgJiYKKyAgICAgICAgICAgICAgICAoIXBtZS0+bVBhcmFtZXRlcnMuaXNTY2VuZVNlbGVjdGlvbkVuYWJsZWQoKSkpIHsKKyAgICAgICAgICAgIGludDMyX3QgcmMgPSBwbWUtPnNlbmRQcmV2aWV3Q2FsbGJhY2soc3RyZWFtLCBtZW1vcnksIGlkeCk7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJQcmV2aWV3IGNhbGxiYWNrIHdhcyBub3Qgc2VudCBzdWNjZXNmdWxseSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZnJlZShzdXBlcl9mcmFtZSk7CisgICAgTE9HSCgiW0tQSSBQZXJmXSA6IEVORCIpOworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZW5kUHJldmlld0NhbGxiYWNrCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBmdW5jdGlvbiBmb3IgdHJpZ2dlcmluZyBwcmV2aWV3IGNhbGxiYWNrcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3RyZWFtICAgIDogc3RyZWFtIG9iamVjdAorICogICBAbWVtb3J5ICAgIDogU3RyZWFtIG1lbW9yeSBhbGxvY2F0b3IKKyAqICAgQGlkeCAgICAgICA6IGJ1ZmZlciBpbmRleAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c2VuZFByZXZpZXdDYWxsYmFjayhRQ2FtZXJhU3RyZWFtICpzdHJlYW0sCisgICAgICAgIFFDYW1lcmFNZW1vcnkgKm1lbW9yeSwgdWludDMyX3QgaWR4KQoreworICAgIGNhbWVyYV9tZW1vcnlfdCAqcHJldmlld01lbSA9IE5VTEw7CisgICAgY2FtZXJhX21lbW9yeV90ICpkYXRhID0gTlVMTDsKKyAgICBjYW1lcmFfbWVtb3J5X3QgKmRhdGFUb0FwcCA9IE5VTEw7CisgICAgc2l6ZV90IHByZXZpZXdCdWZTaXplID0gMDsKKyAgICBzaXplX3QgcHJldmlld0J1ZlNpemVGcm9tQ2FsbGJhY2sgPSAwOworICAgIGNhbV9kaW1lbnNpb25fdCBwcmV2aWV3X2RpbTsKKyAgICBjYW1fZm9ybWF0X3QgcHJldmlld0ZtdDsKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgaW50MzJfdCB5U3RyaWRlID0gMDsKKyAgICBpbnQzMl90IHlTY2FubGluZSA9IDA7CisgICAgaW50MzJfdCB1dlN0cmlkZSA9IDA7CisgICAgaW50MzJfdCB1dlNjYW5saW5lID0gMDsKKyAgICBpbnQzMl90IHVTdHJpZGUgPSAwOworICAgIGludDMyX3QgdVNjYW5saW5lID0gMDsKKyAgICBpbnQzMl90IHZTdHJpZGUgPSAwOworICAgIGludDMyX3QgdlNjYW5saW5lID0gMDsKKyAgICBpbnQzMl90IHlTdHJpZGVUb0FwcCA9IDA7CisgICAgaW50MzJfdCB1dlN0cmlkZVRvQXBwID0gMDsKKyAgICBpbnQzMl90IHlTY2FubGluZVRvQXBwID0gMDsKKyAgICBpbnQzMl90IHV2U2NhbmxpbmVUb0FwcCA9IDA7CisgICAgaW50MzJfdCBzcmNPZmZzZXQgPSAwOworICAgIGludDMyX3QgZHN0T2Zmc2V0ID0gMDsKKyAgICBpbnQzMl90IHNyY0Jhc2VPZmZzZXQgPSAwOworICAgIGludDMyX3QgZHN0QmFzZU9mZnNldCA9IDA7CisgICAgaW50IGk7CisKKyAgICBpZiAoKE5VTEwgPT0gc3RyZWFtKSB8fCAoTlVMTCA9PSBtZW1vcnkpKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgcHJldmlldyBjYWxsYmFjayBpbnB1dCIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNhbV9zdHJlYW1faW5mb190ICpzdHJlYW1JbmZvID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtX3N0cmVhbV9pbmZvX3QgKj4oc3RyZWFtLT5nZXRTdHJlYW1JbmZvQnVmKCktPmdldFB0cigwKSk7CisgICAgaWYgKE5VTEwgPT0gc3RyZWFtSW5mbykgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHN0cmVhbUluZm8iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdHJlYW0tPmdldEZyYW1lRGltZW5zaW9uKHByZXZpZXdfZGltKTsKKyAgICBzdHJlYW0tPmdldEZvcm1hdChwcmV2aWV3Rm10KTsKKworICAgIHlTdHJpZGVUb0FwcCA9IHByZXZpZXdfZGltLndpZHRoOworICAgIHlTY2FubGluZVRvQXBwID0gcHJldmlld19kaW0uaGVpZ2h0OworICAgIHV2U3RyaWRlVG9BcHAgPSB5U3RyaWRlVG9BcHA7CisgICAgdXZTY2FubGluZVRvQXBwID0geVNjYW5saW5lVG9BcHAgLyAyOworCisgICAgLyogVGhlIHByZXZpZXcgYnVmZmVyIHNpemUgaW4gdGhlIGNhbGxiYWNrIHNob3VsZCBiZQorICAgICAqICh3aWR0aCpoZWlnaHQqYnl0ZXNfcGVyX3BpeGVsKS4gQXMgYWxsIHByZXZpZXcgZm9ybWF0cyB3ZSBzdXBwb3J0LAorICAgICAqIHVzZSAxMiBiaXRzIHBlciBwaXhlbCwgYnVmZmVyIHNpemUgPSBwcmV2aWV3V2lkdGggKiBwcmV2aWV3SGVpZ2h0ICogMy8yLgorICAgICAqIFdlIG5lZWQgdG8gcHV0IGEgY2hlY2sgaWYgc29tZSBvdGhlciBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgaW4gZnV0dXJlLiAqLworICAgIGlmICgocHJldmlld0ZtdCA9PSBDQU1fRk9STUFUX1lVVl80MjBfTlYyMSkgfHwKKyAgICAgICAgKHByZXZpZXdGbXQgPT0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTIpIHx8CisgICAgICAgIChwcmV2aWV3Rm10ID09IENBTV9GT1JNQVRfWVVWXzQyMF9ZVjEyKSB8fAorICAgICAgICAocHJldmlld0ZtdCA9PSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9WRU5VUykgfHwKKyAgICAgICAgKHByZXZpZXdGbXQgPT0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjFfVkVOVVMpIHx8CisgICAgICAgIChwcmV2aWV3Rm10ID09IENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxX0FEUkVOTykpIHsKKyAgICAgICAgaWYocHJldmlld0ZtdCA9PSBDQU1fRk9STUFUX1lVVl80MjBfWVYxMikgeworICAgICAgICAgICAgeVN0cmlkZSA9IHN0cmVhbUluZm8tPmJ1Zl9wbGFuZXMucGxhbmVfaW5mby5tcFswXS5zdHJpZGU7CisgICAgICAgICAgICB5U2NhbmxpbmUgPSBzdHJlYW1JbmZvLT5idWZfcGxhbmVzLnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmU7CisgICAgICAgICAgICB1U3RyaWRlID0gc3RyZWFtSW5mby0+YnVmX3BsYW5lcy5wbGFuZV9pbmZvLm1wWzFdLnN0cmlkZTsKKyAgICAgICAgICAgIHVTY2FubGluZSA9IHN0cmVhbUluZm8tPmJ1Zl9wbGFuZXMucGxhbmVfaW5mby5tcFsxXS5zY2FubGluZTsKKyAgICAgICAgICAgIHZTdHJpZGUgPSBzdHJlYW1JbmZvLT5idWZfcGxhbmVzLnBsYW5lX2luZm8ubXBbMl0uc3RyaWRlOworICAgICAgICAgICAgdlNjYW5saW5lID0gc3RyZWFtSW5mby0+YnVmX3BsYW5lcy5wbGFuZV9pbmZvLm1wWzJdLnNjYW5saW5lOworCisgICAgICAgICAgICBwcmV2aWV3QnVmU2l6ZSA9IChzaXplX3QpCisgICAgICAgICAgICAgICAgICAgICh5U3RyaWRlICogeVNjYW5saW5lICsgdVN0cmlkZSAqIHVTY2FubGluZSArIHZTdHJpZGUgKiB2U2NhbmxpbmUpOworICAgICAgICAgICAgcHJldmlld0J1ZlNpemVGcm9tQ2FsbGJhY2sgPSBwcmV2aWV3QnVmU2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHlTdHJpZGUgPSBzdHJlYW1JbmZvLT5idWZfcGxhbmVzLnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlOworICAgICAgICAgICAgeVNjYW5saW5lID0gc3RyZWFtSW5mby0+YnVmX3BsYW5lcy5wbGFuZV9pbmZvLm1wWzBdLnNjYW5saW5lOworICAgICAgICAgICAgdXZTdHJpZGUgPSBzdHJlYW1JbmZvLT5idWZfcGxhbmVzLnBsYW5lX2luZm8ubXBbMV0uc3RyaWRlOworICAgICAgICAgICAgdXZTY2FubGluZSA9IHN0cmVhbUluZm8tPmJ1Zl9wbGFuZXMucGxhbmVfaW5mby5tcFsxXS5zY2FubGluZTsKKworICAgICAgICAgICAgcHJldmlld0J1ZlNpemUgPSAoc2l6ZV90KQorICAgICAgICAgICAgICAgICAgICAoKHlTdHJpZGVUb0FwcCAqIHlTY2FubGluZVRvQXBwKSArICh1dlN0cmlkZVRvQXBwICogdXZTY2FubGluZVRvQXBwKSk7CisKKyAgICAgICAgICAgIHByZXZpZXdCdWZTaXplRnJvbUNhbGxiYWNrID0gKHNpemVfdCkKKyAgICAgICAgICAgICAgICAgICAgKCh5U3RyaWRlICogeVNjYW5saW5lKSArICh1dlN0cmlkZSAqIHV2U2NhbmxpbmUpKTsKKyAgICAgICAgfQorICAgICAgICBpZihwcmV2aWV3QnVmU2l6ZSA9PSBwcmV2aWV3QnVmU2l6ZUZyb21DYWxsYmFjaykgeworICAgICAgICAgICAgcHJldmlld01lbSA9IG1HZXRNZW1vcnkobWVtb3J5LT5nZXRGZChpZHgpLAorICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3QnVmU2l6ZSwgMSwgbUNhbGxiYWNrQ29va2llKTsKKyAgICAgICAgICAgIGlmICghcHJldmlld01lbSB8fCAhcHJldmlld01lbS0+ZGF0YSkgeworICAgICAgICAgICAgICAgIExPR0UoIm1HZXRNZW1vcnkgZmFpbGVkLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGF0YSA9IHByZXZpZXdNZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkYXRhID0gbWVtb3J5LT5nZXRNZW1vcnkoaWR4LCBmYWxzZSk7CisgICAgICAgICAgICBkYXRhVG9BcHAgPSBtR2V0TWVtb3J5KC0xLCBwcmV2aWV3QnVmU2l6ZSwgMSwgbUNhbGxiYWNrQ29va2llKTsKKyAgICAgICAgICAgIGlmICghZGF0YVRvQXBwIHx8ICFkYXRhVG9BcHAtPmRhdGEpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtR2V0TWVtb3J5IGZhaWxlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmV2aWV3X2RpbS5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgIHNyY09mZnNldCA9IGkgKiB5U3RyaWRlOworICAgICAgICAgICAgICAgIGRzdE9mZnNldCA9IGkgKiB5U3RyaWRlVG9BcHA7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikgZGF0YVRvQXBwLT5kYXRhICsgZHN0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZGF0YSArIHNyY09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpeVN0cmlkZVRvQXBwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3JjQmFzZU9mZnNldCA9IHlTdHJpZGUgKiB5U2NhbmxpbmU7CisgICAgICAgICAgICBkc3RCYXNlT2Zmc2V0ID0geVN0cmlkZVRvQXBwICogeVNjYW5saW5lVG9BcHA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcmV2aWV3X2RpbS5oZWlnaHQvMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ID0gaSAqIHV2U3RyaWRlICsgc3JjQmFzZU9mZnNldDsKKyAgICAgICAgICAgICAgICBkc3RPZmZzZXQgPSBpICogdXZTdHJpZGVUb0FwcCArIGRzdEJhc2VPZmZzZXQ7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikgZGF0YVRvQXBwLT5kYXRhICsgZHN0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikgZGF0YS0+ZGF0YSArIHNyY09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpeVN0cmlkZVRvQXBwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qSW52YWxpZCBCdWZmZXIgY29udGVudC4gQnV0IGNhbiBiZSB1c2VkIGFzIGEgZmlyc3QgcHJldmlldyBmcmFtZSB0cmlnZ2VyIGluCisgICAgICAgIGZyYW1ld29yay9hcHAgKi8KKyAgICAgICAgcHJldmlld0J1ZlNpemUgPSAoc2l6ZV90KQorICAgICAgICAgICAgICAgICAgICAoKHlTdHJpZGVUb0FwcCAqIHlTY2FubGluZVRvQXBwKSArCisgICAgICAgICAgICAgICAgICAgICh1dlN0cmlkZVRvQXBwICogdXZTY2FubGluZVRvQXBwKSk7CisgICAgICAgIHByZXZpZXdCdWZTaXplRnJvbUNhbGxiYWNrID0gMDsKKyAgICAgICAgTE9HVygiSW52YWxpZCBwcmV2aWV3IGZvcm1hdC4gQnVmZmVyIGNvbnRlbnQgY2Fubm90IGJlIHByb2Nlc3NlZCBzaXplID0gJWQiLAorICAgICAgICAgICAgICAgIHByZXZpZXdCdWZTaXplKTsKKyAgICAgICAgZGF0YVRvQXBwID0gbUdldE1lbW9yeSgtMSwgcHJldmlld0J1ZlNpemUsIDEsIG1DYWxsYmFja0Nvb2tpZSk7CisgICAgICAgIGlmICghZGF0YVRvQXBwIHx8ICFkYXRhVG9BcHAtPmRhdGEpIHsKKyAgICAgICAgICAgIExPR0UoIm1HZXRNZW1vcnkgZmFpbGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfQorICAgIHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90IGNiQXJnOworICAgIG1lbXNldCgmY2JBcmcsIDAsIHNpemVvZihxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCkpOworICAgIGNiQXJnLmNiX3R5cGUgPSBRQ0FNRVJBX0RBVEFfQ0FMTEJBQ0s7CisgICAgY2JBcmcubXNnX3R5cGUgPSBDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUU7CisgICAgaWYgKHByZXZpZXdCdWZTaXplICE9IDAgJiYgcHJldmlld0J1ZlNpemVGcm9tQ2FsbGJhY2sgIT0gMCAmJgorICAgICAgICAgICAgcHJldmlld0J1ZlNpemUgPT0gcHJldmlld0J1ZlNpemVGcm9tQ2FsbGJhY2spIHsKKyAgICAgICAgY2JBcmcuZGF0YSA9IGRhdGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2JBcmcuZGF0YSA9IGRhdGFUb0FwcDsKKyAgICB9CisgICAgaWYgKCBwcmV2aWV3TWVtICkgeworICAgICAgICBjYkFyZy51c2VyX2RhdGEgPSBwcmV2aWV3TWVtOworICAgICAgICBjYkFyZy5yZWxlYXNlX2NiID0gcmVsZWFzZUNhbWVyYU1lbW9yeTsKKyAgICB9IGVsc2UgaWYgKGRhdGFUb0FwcCkgeworICAgICAgICBjYkFyZy51c2VyX2RhdGEgPSBkYXRhVG9BcHA7CisgICAgICAgIGNiQXJnLnJlbGVhc2VfY2IgPSByZWxlYXNlQ2FtZXJhTWVtb3J5OworICAgIH0KKyAgICBjYkFyZy5jb29raWUgPSB0aGlzOworICAgIHJjID0gbV9jYk5vdGlmaWVyLm5vdGlmeUNhbGxiYWNrKGNiQXJnKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HVygiZmFpbCBzZW5kaW5nIG5vdGlmaWNhdGlvbiIpOworICAgICAgICBpZiAocHJldmlld01lbSkgeworICAgICAgICAgICAgcHJldmlld01lbS0+cmVsZWFzZShwcmV2aWV3TWVtKTsKKyAgICAgICAgfSBlbHNlIGlmIChkYXRhVG9BcHApIHsKKyAgICAgICAgICAgIGRhdGFUb0FwcC0+cmVsZWFzZShkYXRhVG9BcHApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG5vZGlzcGxheV9wcmV2aWV3X3N0cmVhbV9jYl9yb3V0aW5lCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBmdW5jdGlvbiB0byBoYW5kbGUgcHJldmlldyBmcmFtZSBmcm9tIHByZXZpZXcgc3RyZWFtIGluCisgKiAgICAgICAgICAgICAgbm8tZGlzcGxheSBjYXNlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdXBlcl9mcmFtZSA6IHJlY2VpdmVkIHN1cGVyIGJ1ZmZlcgorICogICBAc3RyZWFtICAgICAgOiBzdHJlYW0gb2JqZWN0CisgKiAgIEB1c2VyZGF0YSAgICA6IHVzZXIgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgOiBOb25lCisgKgorICogTk9URSAgICAgIDogY2FsbGVyIHBhc3NlcyB0aGUgb3duZXJzaGlwIG9mIHN1cGVyX2ZyYW1lLCBpdCdzIG91cgorICogICAgICAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSBzdXBlcl9mcmFtZSBvbmNlIGl0J3MgZG9uZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpub2Rpc3BsYXlfcHJldmlld19zdHJlYW1fY2Jfcm91dGluZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlcmRhdGEpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBMT0dIKCJbS1BJIFBlcmZdIEUiKTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpwbWUgPSAoUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqKXVzZXJkYXRhOworICAgIGlmIChwbWUgPT0gTlVMTCB8fAorICAgICAgICBwbWUtPm1DYW1lcmFIYW5kbGUgPT0gTlVMTCB8fAorICAgICAgICBwbWUtPm1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUgIT0gc3VwZXJfZnJhbWUtPmNhbWVyYV9oYW5kbGUpeworICAgICAgICBMT0dFKCJjYW1lcmEgb2JqIG5vdCB2YWxpZCIpOworICAgICAgICAvLyBzaW1wbHkgZnJlZSBzdXBlciBmcmFtZQorICAgICAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZSA9IHN1cGVyX2ZyYW1lLT5idWZzWzBdOworICAgIGlmIChOVUxMID09IGZyYW1lKSB7CisgICAgICAgIExPR0UoInByZXZpZXcgZnJhbWUgaXMgTlVMTCIpOworICAgICAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghcG1lLT5uZWVkUHJvY2Vzc1ByZXZpZXdGcmFtZShmcmFtZS0+ZnJhbWVfaWR4KSkgeworICAgICAgICBMT0dIKCJwcmV2aWV3IGlzIG5vdCBydW5uaW5nLCBubyBuZWVkIHRvIHByb2Nlc3MiKTsKKyAgICAgICAgc3RyZWFtLT5idWZEb25lKGZyYW1lLT5idWZfaWR4KTsKKyAgICAgICAgZnJlZShzdXBlcl9mcmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocG1lLT5uZWVkRGVidWdGcHMoKSkgeworICAgICAgICBwbWUtPmRlYnVnU2hvd1ByZXZpZXdGUFMoKTsKKyAgICB9CisKKyAgICBRQ2FtZXJhTWVtb3J5ICpwcmV2aWV3TWVtT2JqID0gKFFDYW1lcmFNZW1vcnkgKilmcmFtZS0+bWVtX2luZm87CisgICAgY2FtZXJhX21lbW9yeV90ICpwcmV2aWV3X21lbSA9IE5VTEw7CisgICAgaWYgKHByZXZpZXdNZW1PYmogIT0gTlVMTCkgeworICAgICAgICBwcmV2aWV3X21lbSA9IHByZXZpZXdNZW1PYmotPmdldE1lbW9yeShmcmFtZS0+YnVmX2lkeCwgZmFsc2UpOworICAgIH0KKyAgICBpZiAoTlVMTCAhPSBwcmV2aWV3TWVtT2JqICYmIE5VTEwgIT0gcHJldmlld19tZW0pIHsKKyAgICAgICAgcG1lLT5kdW1wRnJhbWVUb0ZpbGUoc3RyZWFtLCBmcmFtZSwgUUNBTUVSQV9EVU1QX0ZSTV9QUkVWSUVXKTsKKworICAgICAgICBpZiAoKHBtZS0+bmVlZFByb2Nlc3NQcmV2aWV3RnJhbWUoZnJhbWUtPmZyYW1lX2lkeCkpICYmCisgICAgICAgICAgICAgICAgcG1lLT5uZWVkU2VuZFByZXZpZXdDYWxsYmFjaygpICYmCisgICAgICAgICAgICAgICAgKHBtZS0+Z2V0UmVsYXRlZENhbVN5bmNJbmZvKCktPm1vZGUgIT0gQ0FNX01PREVfU0VDT05EQVJZKSkgeworICAgICAgICAgICAgcWNhbWVyYV9jYWxsYmFja19hcmdtX3QgY2JBcmc7CisgICAgICAgICAgICBtZW1zZXQoJmNiQXJnLCAwLCBzaXplb2YocWNhbWVyYV9jYWxsYmFja19hcmdtX3QpKTsKKyAgICAgICAgICAgIGNiQXJnLmNiX3R5cGUgPSBRQ0FNRVJBX0RBVEFfQ0FMTEJBQ0s7CisgICAgICAgICAgICBjYkFyZy5tc2dfdHlwZSA9IENBTUVSQV9NU0dfUFJFVklFV19GUkFNRTsKKyAgICAgICAgICAgIGNiQXJnLmRhdGEgPSBwcmV2aWV3X21lbTsKKyAgICAgICAgICAgIGNiQXJnLnVzZXJfZGF0YSA9ICh2b2lkICopICZmcmFtZS0+YnVmX2lkeDsKKyAgICAgICAgICAgIGNiQXJnLmNvb2tpZSA9IHN0cmVhbTsKKyAgICAgICAgICAgIGNiQXJnLnJlbGVhc2VfY2IgPSByZXR1cm5TdHJlYW1CdWZmZXI7CisgICAgICAgICAgICBpbnQzMl90IHJjID0gcG1lLT5tX2NiTm90aWZpZXIubm90aWZ5Q2FsbGJhY2soY2JBcmcpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSAoImZhaWwgc2VuZGluZyBkYXRhIG5vdGlmeSIpOworICAgICAgICAgICAgICAgIHN0cmVhbS0+YnVmRG9uZShmcmFtZS0+YnVmX2lkeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJlYW0tPmJ1ZkRvbmUoZnJhbWUtPmJ1Zl9pZHgpOworICAgICAgICB9CisgICAgfQorICAgIGZyZWUoc3VwZXJfZnJhbWUpOworICAgIExPR0goIltLUEkgUGVyZl0gWCIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJkaV9tb2RlX3N0cmVhbV9jYl9yb3V0aW5lCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBmdW5jdGlvbiB0byBoYW5kbGUgUkRJIGZyYW1lIGZyb20gcHJldmlldyBzdHJlYW0gaW4KKyAqICAgICAgICAgICAgICByZGkgbW9kZSBjYXNlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdXBlcl9mcmFtZSA6IHJlY2VpdmVkIHN1cGVyIGJ1ZmZlcgorICogICBAc3RyZWFtICAgICAgOiBzdHJlYW0gb2JqZWN0CisgKiAgIEB1c2VyZGF0YSAgICA6IHVzZXIgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgOiBOb25lCisgKgorICogTk9URSAgICAgIDogY2FsbGVyIHBhc3NlcyB0aGUgb3duZXJzaGlwIG9mIHN1cGVyX2ZyYW1lLCBpdCdzIG91cgorICogICAgICAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSBzdXBlcl9mcmFtZSBvbmNlIGl0J3MgZG9uZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpyZGlfbW9kZV9zdHJlYW1fY2Jfcm91dGluZSgKKyAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKKyAgUUNhbWVyYVN0cmVhbSAqc3RyZWFtLAorICB2b2lkICogdXNlcmRhdGEpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBMT0dIKCJSRElfREVCVUcgRW50ZXIiKTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpwbWUgPSAoUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqKXVzZXJkYXRhOworICAgIGlmIChwbWUgPT0gTlVMTCB8fAorICAgICAgICBwbWUtPm1DYW1lcmFIYW5kbGUgPT0gTlVMTCB8fAorICAgICAgICBwbWUtPm1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUgIT0gc3VwZXJfZnJhbWUtPmNhbWVyYV9oYW5kbGUpeworICAgICAgICBMT0dFKCJjYW1lcmEgb2JqIG5vdCB2YWxpZCIpOworICAgICAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZSA9IHN1cGVyX2ZyYW1lLT5idWZzWzBdOworICAgIGlmIChOVUxMID09IGZyYW1lKSB7CisgICAgICAgIExPR0UoInByZXZpZXcgZnJhbWUgaXMgTkxVTCIpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYgKCFwbWUtPm5lZWRQcm9jZXNzUHJldmlld0ZyYW1lKGZyYW1lLT5mcmFtZV9pZHgpKSB7CisgICAgICAgIExPR0UoInByZXZpZXcgaXMgbm90IHJ1bm5pbmcsIG5vIG5lZWQgdG8gcHJvY2VzcyIpOworICAgICAgICBzdHJlYW0tPmJ1ZkRvbmUoZnJhbWUtPmJ1Zl9pZHgpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYgKHBtZS0+bmVlZERlYnVnRnBzKCkpIHsKKyAgICAgICAgcG1lLT5kZWJ1Z1Nob3dQcmV2aWV3RlBTKCk7CisgICAgfQorICAgIC8vIE5vbi1zZWN1cmUgTW9kZQorICAgIGlmICghcG1lLT5pc1NlY3VyZU1vZGUoKSkgeworICAgICAgICBRQ2FtZXJhTWVtb3J5ICpwcmV2aWV3TWVtT2JqID0gKFFDYW1lcmFNZW1vcnkgKilmcmFtZS0+bWVtX2luZm87CisgICAgICAgIGlmIChOVUxMID09IHByZXZpZXdNZW1PYmopIHsKKyAgICAgICAgICAgIExPR0UoInByZXZpZXdNZW1PYmogaXMgTlVMTCIpOworICAgICAgICAgICAgc3RyZWFtLT5idWZEb25lKGZyYW1lLT5idWZfaWR4KTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhX21lbW9yeV90ICpwcmV2aWV3X21lbSA9IHByZXZpZXdNZW1PYmotPmdldE1lbW9yeShmcmFtZS0+YnVmX2lkeCwgZmFsc2UpOworICAgICAgICBpZiAoTlVMTCAhPSBwcmV2aWV3X21lbSkgeworICAgICAgICAgICAgcHJldmlld01lbU9iai0+Y2xlYW5DYWNoZShmcmFtZS0+YnVmX2lkeCk7CisgICAgICAgICAgICAvLyBEdW1wIFJBVyBmcmFtZQorICAgICAgICAgICAgcG1lLT5kdW1wRnJhbWVUb0ZpbGUoc3RyZWFtLCBmcmFtZSwgUUNBTUVSQV9EVU1QX0ZSTV9SQVcpOworICAgICAgICAgICAgLy8gTm90aWZ5IFByZXZpZXcgY2FsbGJhY2sgZnJhbWUKKyAgICAgICAgICAgIGlmIChwbWUtPm5lZWRQcm9jZXNzUHJldmlld0ZyYW1lKGZyYW1lLT5mcmFtZV9pZHgpICYmCisgICAgICAgICAgICAgICAgICAgIHBtZS0+bURhdGFDYiAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgIHBtZS0+bXNnVHlwZUVuYWJsZWRXaXRoTG9jayhDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpID4gMCkgeworICAgICAgICAgICAgICAgIHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90IGNiQXJnOworICAgICAgICAgICAgICAgIG1lbXNldCgmY2JBcmcsIDAsIHNpemVvZihxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCkpOworICAgICAgICAgICAgICAgIGNiQXJnLmNiX3R5cGUgICAgPSBRQ0FNRVJBX0RBVEFfQ0FMTEJBQ0s7CisgICAgICAgICAgICAgICAgY2JBcmcubXNnX3R5cGUgICA9IENBTUVSQV9NU0dfUFJFVklFV19GUkFNRTsKKyAgICAgICAgICAgICAgICBjYkFyZy5kYXRhICAgICAgID0gcHJldmlld19tZW07CisgICAgICAgICAgICAgICAgY2JBcmcudXNlcl9kYXRhID0gKHZvaWQgKikgJmZyYW1lLT5idWZfaWR4OworICAgICAgICAgICAgICAgIGNiQXJnLmNvb2tpZSAgICAgPSBzdHJlYW07CisgICAgICAgICAgICAgICAgY2JBcmcucmVsZWFzZV9jYiA9IHJldHVyblN0cmVhbUJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBwbWUtPm1fY2JOb3RpZmllci5ub3RpZnlDYWxsYmFjayhjYkFyZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoInByZXZpZXdfbWVtIGlzIE5VTEwiKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmJ1ZkRvbmUoZnJhbWUtPmJ1Zl9pZHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTE9HRSgicHJldmlld19tZW0gaXMgTlVMTCIpOworICAgICAgICAgICAgc3RyZWFtLT5idWZEb25lKGZyYW1lLT5idWZfaWR4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNlY3VyZSBNb2RlCisgICAgICAgIC8vIFdlIHdpbGwgZG8gUUNBTUVSQV9OT1RJRllfQ0FMTEJBQ0sgYW5kIHNoYXJlIEZEIGluIGNhc2Ugb2Ygc2VjdXJlIG1vZGUKKyAgICAgICAgUUNhbWVyYU1lbW9yeSAqcHJldmlld01lbU9iaiA9IChRQ2FtZXJhTWVtb3J5ICopZnJhbWUtPm1lbV9pbmZvOworICAgICAgICBpZiAoTlVMTCA9PSBwcmV2aWV3TWVtT2JqKSB7CisgICAgICAgICAgICBMT0dFKCJwcmV2aWV3TWVtT2JqIGlzIE5VTEwiKTsKKyAgICAgICAgICAgIHN0cmVhbS0+YnVmRG9uZShmcmFtZS0+YnVmX2lkeCk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmZCA9IHByZXZpZXdNZW1PYmotPmdldEZkKGZyYW1lLT5idWZfaWR4KTsKKyAgICAgICAgTE9HRCgiUHJldmlldyBmcmFtZSBmZCA9JWQgZm9yIGluZGV4ID0gJWQgIiwgZmQsIGZyYW1lLT5idWZfaWR4KTsKKyAgICAgICAgaWYgKHBtZS0+bmVlZFByb2Nlc3NQcmV2aWV3RnJhbWUoZnJhbWUtPmZyYW1lX2lkeCkgJiYKKyAgICAgICAgICAgICAgICBwbWUtPm1EYXRhQ2IgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIHBtZS0+bXNnVHlwZUVuYWJsZWRXaXRoTG9jayhDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpID4gMCkgeworICAgICAgICAgICAgLy8gUHJlcGFyZSBDYWxsYmFjayBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90IGNiQXJnOworICAgICAgICAgICAgbWVtc2V0KCZjYkFyZywgMCwgc2l6ZW9mKHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90KSk7CisgICAgICAgICAgICBjYkFyZy5jYl90eXBlICAgID0gUUNBTUVSQV9OT1RJRllfQ0FMTEJBQ0s7CisgICAgICAgICAgICBjYkFyZy5tc2dfdHlwZSAgID0gQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FOworI2lmbmRlZiBWQU5JTExBX0hBTAorICAgICAgICAgICAgY2JBcmcuZXh0MSAgICAgICA9IENBTUVSQV9GUkFNRV9EQVRBX0ZEOworICAgICAgICAgICAgY2JBcmcuZXh0MiAgICAgICA9IGZkOworI2VuZGlmCisgICAgICAgICAgICBjYkFyZy51c2VyX2RhdGEgID0gKHZvaWQgKikgJmZyYW1lLT5idWZfaWR4OworICAgICAgICAgICAgY2JBcmcuY29va2llICAgICA9IHN0cmVhbTsKKyAgICAgICAgICAgIGNiQXJnLnJlbGVhc2VfY2IgPSByZXR1cm5TdHJlYW1CdWZmZXI7CisgICAgICAgICAgICBwbWUtPm1fY2JOb3RpZmllci5ub3RpZnlDYWxsYmFjayhjYkFyZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dIKCJObyBuZWVkIHRvIHByb2Nlc3MgcHJldmlldyBmcmFtZSwgcmV0dXJuIGJ1ZmZlciIpOworICAgICAgICAgICAgc3RyZWFtLT5idWZEb25lKGZyYW1lLT5idWZfaWR4KTsKKyAgICAgICAgfQorICAgIH0KK2VuZDoKKyAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKKyAgICBMT0dIKCJSRElfREVCVUcgRXhpdCIpOworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwb3N0dmlld19zdHJlYW1fY2Jfcm91dGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBoZWxwZXIgZnVuY3Rpb24gdG8gaGFuZGxlIHBvc3QgZnJhbWUgZnJvbSBwb3N0dmlldyBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN1cGVyX2ZyYW1lIDogcmVjZWl2ZWQgc3VwZXIgYnVmZmVyCisgKiAgIEBzdHJlYW0gICAgICA6IHN0cmVhbSBvYmplY3QKKyAqICAgQHVzZXJkYXRhICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICA6IE5vbmUKKyAqCisgKiBOT1RFICAgICAgOiBjYWxsZXIgcGFzc2VzIHRoZSBvd25lcnNoaXAgb2Ygc3VwZXJfZnJhbWUsIGl0J3Mgb3VyCisgKiAgICAgICAgICAgICByZXNwb25zaWJpbGl0eSB0byBmcmVlIHN1cGVyX2ZyYW1lIG9uY2UgaXQncyBkb25lLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnBvc3R2aWV3X3N0cmVhbV9jYl9yb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3VwZXJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpbnQgZXJyID0gTk9fRVJST1I7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqcG1lID0gKFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKil1c2VyZGF0YTsKKyAgICBRQ2FtZXJhR3JhbGxvY01lbW9yeSAqbWVtb3J5ID0gKFFDYW1lcmFHcmFsbG9jTWVtb3J5ICopc3VwZXJfZnJhbWUtPmJ1ZnNbMF0tPm1lbV9pbmZvOworCisgICAgaWYgKHBtZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgaGFyZHdhcmUgb2JqZWN0Iik7CisgICAgICAgIGZyZWUoc3VwZXJfZnJhbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChtZW1vcnkgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIG1lbW9yeSBvYmplY3QiKTsKKyAgICAgICAgZnJlZShzdXBlcl9mcmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBMT0dIKCJbS1BJIFBlcmZdIDogQkVHSU4iKTsKKworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lID0gc3VwZXJfZnJhbWUtPmJ1ZnNbMF07CisgICAgaWYgKE5VTEwgPT0gZnJhbWUpIHsKKyAgICAgICAgTE9HRSgicHJldmlldyBmcmFtZSBpcyBOVUxMIik7CisgICAgICAgIGZyZWUoc3VwZXJfZnJhbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUUNhbWVyYU1lbW9yeSAqbWVtT2JqID0gKFFDYW1lcmFNZW1vcnkgKilmcmFtZS0+bWVtX2luZm87CisgICAgaWYgKE5VTEwgIT0gbWVtT2JqKSB7CisgICAgICAgIHBtZS0+ZHVtcEZyYW1lVG9GaWxlKHN0cmVhbSwgZnJhbWUsIFFDQU1FUkFfRFVNUF9GUk1fVEhVTUJOQUlMKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gYnVmZmVyIGJhY2sgdG8gZHJpdmVyCisgICAgZXJyID0gc3RyZWFtLT5idWZEb25lKGZyYW1lLT5idWZfaWR4KTsKKyAgICBpZiAoIGVyciA8IDApIHsKKyAgICAgICAgTE9HRSgic3RyZWFtIGJ1ZkRvbmUgZmFpbGVkICVkIiwgZXJyKTsKKyAgICB9CisKKyAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKKyAgICBMT0dIKCJbS1BJIFBlcmZdIDogRU5EIik7CisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHZpZGVvX3N0cmVhbV9jYl9yb3V0aW5lCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBmdW5jdGlvbiB0byBoYW5kbGUgdmlkZW8gZnJhbWUgZnJvbSB2aWRlbyBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN1cGVyX2ZyYW1lIDogcmVjZWl2ZWQgc3VwZXIgYnVmZmVyCisgKiAgIEBzdHJlYW0gICAgICA6IHN0cmVhbSBvYmplY3QKKyAqICAgQHVzZXJkYXRhICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICA6IE5vbmUKKyAqCisgKiBOT1RFICAgICAgOiBjYWxsZXIgcGFzc2VzIHRoZSBvd25lcnNoaXAgb2Ygc3VwZXJfZnJhbWUsIGl0J3Mgb3VyCisgKiAgICAgICAgICAgICByZXNwb25zaWJpbGl0eSB0byBmcmVlIHN1cGVyX2ZyYW1lIG9uY2UgaXQncyBkb25lLiB2aWRlbworICogICAgICAgICAgICAgZnJhbWUgd2lsbCBiZSBzZW50IHRvIHZpZGVvIGVuY29kZXIuIE9uY2UgdmlkZW8gZW5jb2RlciBpcworICogICAgICAgICAgICAgZG9uZSB3aXRoIHRoZSB2aWRlbyBmcmFtZSwgaXQgd2lsbCBjYWxsIGFub3RoZXIgQVBJCisgKiAgICAgICAgICAgICAocmVsZWFzZV9yZWNvcmRpbmdfZnJhbWUpIHRvIHJldHVybiB0aGUgZnJhbWUgYmFjaworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnZpZGVvX3N0cmVhbV9jYl9yb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3VwZXJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBRQ2FtZXJhVmlkZW9NZW1vcnkgKnZpZGVvTWVtT2JqID0gTlVMTDsKKyAgICBjYW1lcmFfbWVtb3J5X3QgKnZpZGVvX21lbSA9IE5VTEw7CisgICAgbnNlY3NfdCB0aW1lU3RhbXAgPSAwOworICAgIGJvb2wgdHJpZ2dlclRDQiA9IEZBTFNFOworCisgICAgTE9HRCgiW0tQSSBQZXJmXSA6IEJFR0lOIik7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqcG1lID0gKFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKil1c2VyZGF0YTsKKyAgICBpZiAocG1lID09IE5VTEwgfHwKKyAgICAgICAgcG1lLT5tQ2FtZXJhSGFuZGxlID09IE5VTEwgfHwKKyAgICAgICAgcG1lLT5tQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlICE9IHN1cGVyX2ZyYW1lLT5jYW1lcmFfaGFuZGxlKXsKKyAgICAgICAgTE9HRSgiY2FtZXJhIG9iaiBub3QgdmFsaWQiKTsKKyAgICAgICAgLy8gc2ltcGx5IGZyZWUgc3VwZXIgZnJhbWUKKyAgICAgICAgZnJlZShzdXBlcl9mcmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZSA9IHN1cGVyX2ZyYW1lLT5idWZzWzBdOworCisgICAgaWYgKHBtZS0+bmVlZERlYnVnRnBzKCkpIHsKKyAgICAgICAgcG1lLT5kZWJ1Z1Nob3dWaWRlb0ZQUygpOworICAgIH0KKyAgICBpZihwbWUtPm1fYlJlY29yZFN0YXJ0ZWQpIHsKKyAgICAgICBMT0dJKCJbS1BJIFBlcmZdIDogUFJPRklMRV9GSVJTVF9SRUNPUkRfRlJBTUUiKTsKKyAgICAgICBwbWUtPm1fYlJlY29yZFN0YXJ0ZWQgPSBmYWxzZSA7CisgICAgfQorICAgIExPR0QoIlN0cmVhbSglZCksIFRpbWVzdGFtcDogJWxkICVsZCIsCisgICAgICAgICAgZnJhbWUtPnN0cmVhbV9pZCwKKyAgICAgICAgICBmcmFtZS0+dHMudHZfc2VjLAorICAgICAgICAgIGZyYW1lLT50cy50dl9uc2VjKTsKKworICAgIGlmIChmcmFtZS0+YnVmX3R5cGUgPT0gQ0FNX1NUUkVBTV9CVUZfVFlQRV9NUExBTkUpIHsKKyAgICAgICAgaWYgKHBtZS0+bVBhcmFtZXRlcnMuZ2V0VmlkZW9CYXRjaFNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICB0aW1lU3RhbXAgPSBuc2Vjc190KGZyYW1lLT50cy50dl9zZWMpICogMTAwMDAwMDAwMExMCisgICAgICAgICAgICAgICAgICAgICsgZnJhbWUtPnRzLnR2X25zZWM7CisgICAgICAgICAgICBwbWUtPmR1bXBGcmFtZVRvRmlsZShzdHJlYW0sIGZyYW1lLCBRQ0FNRVJBX0RVTVBfRlJNX1ZJREVPKTsKKyAgICAgICAgICAgIHZpZGVvTWVtT2JqID0gKFFDYW1lcmFWaWRlb01lbW9yeSAqKWZyYW1lLT5tZW1faW5mbzsKKyAgICAgICAgICAgIHZpZGVvX21lbSA9IE5VTEw7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSB2aWRlb01lbU9iaikgeworICAgICAgICAgICAgICAgIHZpZGVvX21lbSA9IHZpZGVvTWVtT2JqLT5nZXRNZW1vcnkoZnJhbWUtPmJ1Zl9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAocG1lLT5tU3RvcmVNZXRhRGF0YUluRnJhbWUgPiAwKT8gdHJ1ZSA6IGZhbHNlKTsKKyAgICAgICAgICAgICAgICB0cmlnZ2VyVENCID0gVFJVRTsKKyAgICAgICAgICAgICAgICBMT0dIKCJWaWRlbyBmcmFtZSBUaW1lU3RhbXAgOiAlbGxkIGJhdGNoID0gMCBpbmRleCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTdGFtcCwgZnJhbWUtPmJ1Zl9pZHgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9IYW5kbGUgdmlkZW8gYmF0Y2ggY2FsbGJhY2sKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPSBOVUxMOworICAgICAgICAgICAgcG1lLT5kdW1wRnJhbWVUb0ZpbGUoc3RyZWFtLCBmcmFtZSwgUUNBTUVSQV9EVU1QX0ZSTV9WSURFTyk7CisgICAgICAgICAgICBRQ2FtZXJhVmlkZW9NZW1vcnkgKnZpZGVvTWVtT2JqID0gKFFDYW1lcmFWaWRlb01lbW9yeSAqKWZyYW1lLT5tZW1faW5mbzsKKyAgICAgICAgICAgIGlmICgoc3RyZWFtLT5tQ3VyTWV0YU1lbW9yeSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICB8fCAoc3RyZWFtLT5tQ3VyQnVmSW5kZXggPT0gLTEpKSB7CisgICAgICAgICAgICAgICAgLy9nZXQgRnJlZSBtZXRhZGF0YSBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENBTUVSQV9NSU5fVklERU9fQkFUQ0hfQlVGRkVSUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0tPm1TdHJlYW1NZXRhTWVtb3J5W2ldLmNvbnN1bWVyT3duZWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5tQ3VyTWV0YU1lbW9yeSA9IHZpZGVvTWVtT2JqLT5nZXRNZW1vcnkoaSx0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+bUN1ckJ1ZkluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+bUN1ck1ldGFJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPm1TdHJlYW1NZXRhTWVtb3J5W2ldLm51bUJ1ZmZlcnMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWRlb19tZW0gPSBzdHJlYW0tPm1DdXJNZXRhTWVtb3J5OworICAgICAgICAgICAgbmggPSB2aWRlb01lbU9iai0+Z2V0TmF0aXZlSGFuZGxlKHN0cmVhbS0+bUN1ck1ldGFJbmRleCk7CisgICAgICAgICAgICBpZiAodmlkZW9fbWVtID09IE5VTEwgfHwgbmggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIExPR0UoIk5vIEZyZWUgbWV0YWRhdGEuIERyb3AgdGhpcyBmcmFtZSIpOworICAgICAgICAgICAgICAgIHN0cmVhbS0+bUN1ckJ1ZkluZGV4ID0gLTE7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5idWZEb25lKGZyYW1lLT5idWZfaWR4KTsKKyAgICAgICAgICAgICAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IHN0cmVhbS0+bUN1ckJ1ZkluZGV4OworICAgICAgICAgICAgaW50IGZkX2NudCA9IHBtZS0+bVBhcmFtZXRlcnMuZ2V0VmlkZW9CYXRjaFNpemUoKTsKKyAgICAgICAgICAgIG5zZWNzX3QgZnJhbWVfdHMgPSBuc2Vjc190KGZyYW1lLT50cy50dl9zZWMpICogMTAwMDAwMDAwMExMCisgICAgICAgICAgICAgICAgICAgICsgZnJhbWUtPnRzLnR2X25zZWM7CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkgeworICAgICAgICAgICAgICAgIHN0cmVhbS0+bUZpcnN0VGltZVN0YW1wID0gZnJhbWVfdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cmVhbS0+bVN0cmVhbU1ldGFNZW1vcnlbc3RyZWFtLT5tQ3VyTWV0YUluZGV4XS5idWZfaW5kZXhbaW5kZXhdCisgICAgICAgICAgICAgICAgICAgID0gKHVpbnQ4X3QpZnJhbWUtPmJ1Zl9pZHg7CisgICAgICAgICAgICBzdHJlYW0tPm1TdHJlYW1NZXRhTWVtb3J5W3N0cmVhbS0+bUN1ck1ldGFJbmRleF0ubnVtQnVmZmVycysrOworICAgICAgICAgICAgc3RyZWFtLT5tU3RyZWFtTWV0YU1lbW9yeVtzdHJlYW0tPm1DdXJNZXRhSW5kZXhdLmNvbnN1bWVyT3duZWQKKyAgICAgICAgICAgICAgICAgICAgPSBUUlVFOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICogZGF0YVswXSA9PiBGRAorICAgICAgICAgICAgKiBkYXRhW21OdW1GRHMgKyAxXSA9PiBPRkZTRVQKKyAgICAgICAgICAgICogZGF0YVttTnVtRkRzICsgMl0gPT4gU0laRQorICAgICAgICAgICAgKiBkYXRhW21OdW1GRHMgKyAzXSA9PiBVc2FnZSBGbGFnIChDb2xvciBmb3JtYXQvQ29tcHJlc3Npb24pCisgICAgICAgICAgICAqIGRhdGFbbU51bUZEcyArIDRdID0+IFRJTUVTVEFNUAorICAgICAgICAgICAgKiBkYXRhW21OdW1GRHMgKyA1XSA9PiBGT1JNQVQKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBuaC0+ZGF0YVtpbmRleF0gPSB2aWRlb01lbU9iai0+Z2V0RmQoZnJhbWUtPmJ1Zl9pZHgpOworICAgICAgICAgICAgbmgtPmRhdGFbaW5kZXggKyBmZF9jbnRdID0gMDsKKyAgICAgICAgICAgIG5oLT5kYXRhW2luZGV4ICsgKGZkX2NudCAqIDIpXSA9IChpbnQpdmlkZW9NZW1PYmotPmdldFNpemUoZnJhbWUtPmJ1Zl9pZHgpOworICAgICAgICAgICAgbmgtPmRhdGFbaW5kZXggKyAoZmRfY250ICogMyldID0gdmlkZW9NZW1PYmotPmdldFVzYWdlKCk7CisgICAgICAgICAgICBuaC0+ZGF0YVtpbmRleCArIChmZF9jbnQgKiA0KV0gPSAoaW50KShmcmFtZV90cyAtIHN0cmVhbS0+bUZpcnN0VGltZVN0YW1wKTsKKyAgICAgICAgICAgIG5oLT5kYXRhW2luZGV4ICsgKGZkX2NudCAqIDUpXSA9IHZpZGVvTWVtT2JqLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgIHN0cmVhbS0+bUN1ckJ1ZkluZGV4Kys7CisgICAgICAgICAgICBpZiAoc3RyZWFtLT5tQ3VyQnVmSW5kZXggPT0gZmRfY250KSB7CisgICAgICAgICAgICAgICAgdGltZVN0YW1wID0gc3RyZWFtLT5tRmlyc3RUaW1lU3RhbXA7CisgICAgICAgICAgICAgICAgTE9HSCgiVmlkZW8gZnJhbWUgdG8gZW5jb2RlciBUaW1lU3RhbXAgOiAlbGxkIGJhdGNoID0gJWQgQnVmZmVyIGlkeCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTdGFtcCwgZmRfY250LAorICAgICAgICAgICAgICAgICAgICAgICAgbmgtPmRhdGFbbmgtPm51bUZkcyArIG5oLT5udW1JbnRzIC0gVklERU9fTUVUQURBVEFfTlVNX0NPTU1PTl9JTlRTXSk7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5tQ3VyQnVmSW5kZXggPSAtMTsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPm1DdXJNZXRhSW5kZXggPSAtMTsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPm1DdXJNZXRhTWVtb3J5ID0gTlVMTDsKKyAgICAgICAgICAgICAgICB0cmlnZ2VyVENCID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHZpZGVvTWVtT2JqID0gKFFDYW1lcmFWaWRlb01lbW9yeSAqKWZyYW1lLT5tZW1faW5mbzsKKyAgICAgICAgdmlkZW9fbWVtID0gTlVMTDsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IE5VTEw7CisgICAgICAgIGludCBmZF9jbnQgPSBmcmFtZS0+dXNlcl9idWYuYnVmc191c2VkOworICAgICAgICBpZiAoTlVMTCAhPSB2aWRlb01lbU9iaikgeworICAgICAgICAgICAgdmlkZW9fbWVtID0gdmlkZW9NZW1PYmotPmdldE1lbW9yeShmcmFtZS0+YnVmX2lkeCwgdHJ1ZSk7CisgICAgICAgICAgICBuaCA9IHZpZGVvTWVtT2JqLT5nZXROYXRpdmVIYW5kbGUoZnJhbWUtPmJ1Zl9pZHgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgidmlkZW9NZW1PYmogTlVMTCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5oICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRpbWVTdGFtcCA9IG5zZWNzX3QoZnJhbWUtPnRzLnR2X3NlYykgKiAxMDAwMDAwMDAwTEwKKyAgICAgICAgICAgICAgICAgICAgKyBmcmFtZS0+dHMudHZfbnNlYzsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmZF9jbnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChmcmFtZS0+dXNlcl9idWYuYnVmX2lkeFtpXSA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKnBsYW5lX2ZyYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWUtPnVzZXJfYnVmLnBsYW5lX2J1ZltmcmFtZS0+dXNlcl9idWYuYnVmX2lkeFtpXV07CisgICAgICAgICAgICAgICAgICAgIFFDYW1lcmFWaWRlb01lbW9yeSAqZnJhbWVvYmogPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChRQ2FtZXJhVmlkZW9NZW1vcnkgKilwbGFuZV9mcmFtZS0+bWVtX2luZm87CisgICAgICAgICAgICAgICAgICAgIGludCB1c2FnZSA9IGZyYW1lb2JqLT5nZXRVc2FnZSgpOworICAgICAgICAgICAgICAgICAgICBuc2Vjc190IGZyYW1lX3RzID0gbnNlY3NfdChwbGFuZV9mcmFtZS0+dHMudHZfc2VjKSAqIDEwMDAwMDAwMDBMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGxhbmVfZnJhbWUtPnRzLnR2X25zZWM7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0gPT4gRkQKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVttTnVtRkRzICsgMV0gPT4gT0ZGU0VUCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbbU51bUZEcyArIDJdID0+IFNJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVttTnVtRkRzICsgM10gPT4gVXNhZ2UgRmxhZyAoQ29sb3IgZm9ybWF0L0NvbXByZXNzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICBkYXRhW21OdW1GRHMgKyA0XSA9PiBUSU1FU1RBTVAKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YVttTnVtRkRzICsgNV0gPT4gRk9STUFUCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIG5oLT5kYXRhW2ldID0gZnJhbWVvYmotPmdldEZkKHBsYW5lX2ZyYW1lLT5idWZfaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgbmgtPmRhdGFbZmRfY250ICsgaV0gPSAwOworICAgICAgICAgICAgICAgICAgICBuaC0+ZGF0YVsoMiAqIGZkX2NudCkgKyBpXSA9IChpbnQpZnJhbWVvYmotPmdldFNpemUocGxhbmVfZnJhbWUtPmJ1Zl9pZHgpOworICAgICAgICAgICAgICAgICAgICBuaC0+ZGF0YVsoMyAqIGZkX2NudCkgKyBpXSA9IHVzYWdlOworICAgICAgICAgICAgICAgICAgICBuaC0+ZGF0YVsoNCAqIGZkX2NudCkgKyBpXSA9IChpbnQpKGZyYW1lX3RzIC0gdGltZVN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgbmgtPmRhdGFbKDUgKiBmZF9jbnQpICsgaV0gPSBmcmFtZW9iai0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgIExPR0QoIlNlbmQgVmlkZW8gZnJhbWVzIHRvIHNlcnZpY2VzL2VuY29kZXIgZGVsdGEgOiAlbGxkIEZEID0gJWQgaW5kZXggPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lX3RzIC0gdGltZVN0YW1wKSwgcGxhbmVfZnJhbWUtPmZkLCBwbGFuZV9mcmFtZS0+YnVmX2lkeCk7CisgICAgICAgICAgICAgICAgICAgIHBtZS0+ZHVtcEZyYW1lVG9GaWxlKHN0cmVhbSwgcGxhbmVfZnJhbWUsIFFDQU1FUkFfRFVNUF9GUk1fVklERU8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyaWdnZXJUQ0IgPSBUUlVFOworICAgICAgICAgICAgTE9HSCgiQmF0Y2ggYnVmZmVyIFRpbWVTdGFtcCA6ICVsbGQgRkQgPSAlZCBpbmRleCA9ICVkIGZkX2NudCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgdGltZVN0YW1wLCBmcmFtZS0+ZmQsIGZyYW1lLT5idWZfaWR4LCBmZF9jbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiTm8gVmlkZW8gTWV0YSBBdmFpbGFibGUuIFJldHVybiBCdWZmZXIiKTsKKyAgICAgICAgICAgIHN0cmVhbS0+YnVmRG9uZShzdXBlcl9mcmFtZS0+YnVmc1swXS0+YnVmX2lkeCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKE5VTEwgIT0gdmlkZW9fbWVtKSAmJiAodHJpZ2dlclRDQiA9PSBUUlVFKSkgeworICAgICAgICBpZiAoKHBtZS0+bURhdGFDYlRpbWVzdGFtcCAhPSBOVUxMKSAmJgorICAgICAgICAgICAgcG1lLT5tc2dUeXBlRW5hYmxlZFdpdGhMb2NrKENBTUVSQV9NU0dfVklERU9fRlJBTUUpID4gMCkgeworICAgICAgICAgICAgcWNhbWVyYV9jYWxsYmFja19hcmdtX3QgY2JBcmc7CisgICAgICAgICAgICBtZW1zZXQoJmNiQXJnLCAwLCBzaXplb2YocWNhbWVyYV9jYWxsYmFja19hcmdtX3QpKTsKKyAgICAgICAgICAgIGNiQXJnLmNiX3R5cGUgPSBRQ0FNRVJBX0RBVEFfVElNRVNUQU1QX0NBTExCQUNLOworICAgICAgICAgICAgY2JBcmcubXNnX3R5cGUgPSBDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FOworICAgICAgICAgICAgY2JBcmcuZGF0YSA9IHZpZGVvX21lbTsKKworICAgICAgICAgICAgLy8gQ29udmVydCBCb290dGltZSBmcm9tIGNhbWVyYSB0byBNb25vdGltZSBmb3IgdmlkZW8gaWYgbmVlZGVkLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBtQm9vdFRvTW9ub1RpbWVzdGFtcE9mZnNldCB2YWx1ZSB3aWxsIGJlIDAuCisgICAgICAgICAgICB0aW1lU3RhbXAgPSB0aW1lU3RhbXAgLSBwbWUtPm1Cb290VG9Nb25vVGltZXN0YW1wT2Zmc2V0OworICAgICAgICAgICAgTE9HRCgiRmluYWwgdmlkZW8gYnVmZmVyIFRpbWVTdGFtcCA6ICVsbGQgIiwgdGltZVN0YW1wKTsKKyAgICAgICAgICAgIGNiQXJnLnRpbWVzdGFtcCA9IHRpbWVTdGFtcDsKKyAgICAgICAgICAgIGludDMyX3QgcmMgPSBwbWUtPm1fY2JOb3RpZmllci5ub3RpZnlDYWxsYmFjayhjYkFyZyk7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJmYWlsIHNlbmRpbmcgZGF0YSBub3RpZnkiKTsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmJ1ZkRvbmUoZnJhbWUtPmJ1Zl9pZHgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZnJlZShzdXBlcl9mcmFtZSk7CisgICAgTE9HRCgiW0tQSSBQZXJmXSA6IEVORCIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNuYXBzaG90X2NoYW5uZWxfY2Jfcm91dGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBoZWxwZXIgZnVuY3Rpb24gdG8gaGFuZGxlIHNuYXBzaG90IGZyYW1lIGZyb20gc25hcHNob3QgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3VwZXJfZnJhbWUgOiByZWNlaXZlZCBzdXBlciBidWZmZXIKKyAqICAgQHVzZXJkYXRhICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICA6IE5vbmUKKyAqCisgKiBOT1RFICAgICAgOiByZWN2ZF9mcmFtZSB3aWxsIGJlIHJlbGVhc2VkIGFmdGVyIHRoaXMgY2FsbCBieSBjYWxsZXIsIHNvIGlmCisgKiAgICAgICAgICAgICBhc3luYyBvcGVyYXRpb24gbmVlZGVkIGZvciByZWN2ZF9mcmFtZSwgaXQncyBvdXIgcmVzcG9uc2liaWxpdHkKKyAqICAgICAgICAgICAgIHRvIHNhdmUgYSBjb3B5IGZvciB0aGlzIHZhcmlhYmxlIHRvIGJlIHVzZWQgbGF0ZXIuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c25hcHNob3RfY2hhbm5lbF9jYl9yb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3VwZXJfZnJhbWUsCisgICAgICAgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsID0gTlVMTDsKKworICAgIExPR0goIltLUEkgUGVyZl06IEUiKTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpwbWUgPSAoUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqKXVzZXJkYXRhOworICAgIGlmIChwbWUgPT0gTlVMTCB8fAorICAgICAgICBwbWUtPm1DYW1lcmFIYW5kbGUgPT0gTlVMTCB8fAorICAgICAgICBwbWUtPm1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUgIT0gc3VwZXJfZnJhbWUtPmNhbWVyYV9oYW5kbGUpeworICAgICAgICBMT0dFKCJjYW1lcmEgb2JqIG5vdCB2YWxpZCIpOworICAgICAgICAvLyBzaW1wbHkgZnJlZSBzdXBlciBmcmFtZQorICAgICAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChwbWUtPmlzTG93UG93ZXJNb2RlKCkpIHsKKyAgICAgICAgcENoYW5uZWwgPSBwbWUtPm1fY2hhbm5lbHNbUUNBTUVSQV9DSF9UWVBFX1ZJREVPXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwQ2hhbm5lbCA9IHBtZS0+bV9jaGFubmVsc1tRQ0FNRVJBX0NIX1RZUEVfU05BUFNIT1RdOworICAgIH0KKworICAgIGlmICgocENoYW5uZWwgPT0gTlVMTCkgfHwgKHBDaGFubmVsLT5nZXRNeUhhbmRsZSgpICE9IHN1cGVyX2ZyYW1lLT5jaF9pZCkpIHsKKyAgICAgICAgTE9HRSgiU25hcHNob3QgY2hhbm5lbCBkb2Vzbid0IGV4aXN0LCByZXR1cm4gaGVyZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5kdW1wbWV0YWRhdGEiLCB2YWx1ZSwgIjAiKTsKKyAgICBpbnQzMl90IGVuYWJsZWQgPSBhdG9pKHZhbHVlKTsKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBpZiAocENoYW5uZWwgPT0gTlVMTCB8fAorICAgICAgICAgICAgcENoYW5uZWwtPmdldE15SGFuZGxlKCkgIT0gc3VwZXJfZnJhbWUtPmNoX2lkKSB7CisgICAgICAgICAgICBMT0dFKCJDYXB0dXJlIGNoYW5uZWwgZG9lc24ndCBleGlzdCwgcmV0dXJuIGhlcmUiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpwTWV0YUZyYW1lID0gTlVMTDsKKyAgICAgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9IE5VTEw7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdXBlcl9mcmFtZS0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICAgICAgcFN0cmVhbSA9IHBDaGFubmVsLT5nZXRTdHJlYW1CeUhhbmRsZShzdXBlcl9mcmFtZS0+YnVmc1tpXS0+c3RyZWFtX2lkKTsKKyAgICAgICAgICAgIGlmIChwU3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAocFN0cmVhbS0+aXNUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBKSkgeworICAgICAgICAgICAgICAgICAgICBwTWV0YUZyYW1lID0gc3VwZXJfZnJhbWUtPmJ1ZnNbaV07IC8vZmluZCB0aGUgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBNZXRhRnJhbWUgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobWV0YWRhdGFfYnVmZmVyX3QgKilwTWV0YUZyYW1lLT5idWZmZXIpLT5pc190dW5pbmdfcGFyYW1zX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPmR1bXBNZXRhZGF0YVRvRmlsZShwU3RyZWFtLCBwTWV0YUZyYW1lLCAoY2hhciAqKSAiU25hcHNob3QiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzYXZlIGEgY29weSBmb3IgdGhlIHN1cGVyYnVmCisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90KiBmcmFtZSA9IChtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKiltYWxsb2Moc2l6ZW9mKG1tX2NhbWVyYV9zdXBlcl9idWZfdCkpOworICAgIGlmIChmcmFtZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IHRvIHNhdmUgcmVjZWl2ZWRfZnJhbWUgc3RydWN0dXJlLiIpOworICAgICAgICBwQ2hhbm5lbC0+YnVmRG9uZShzdXBlcl9mcmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgKmZyYW1lID0gKnN1cGVyX2ZyYW1lOworCisgICAgaWYgKGZyYW1lLT5udW1fYnVmcyA+IDApIHsKKyAgICAgICAgTE9HSSgiW0tQSSBQZXJmXTogc3VwZXJidWYgZnJhbWVfaWR4ICVkIiwKKyAgICAgICAgICAgICAgICBmcmFtZS0+YnVmc1swXS0+ZnJhbWVfaWR4KTsKKyAgICB9CisKKyAgICBpZiAoKE5PX0VSUk9SICE9IHBtZS0+d2FpdERlZmVycmVkV29yayhwbWUtPm1SZXByb2NKb2IpKSB8fAorICAgICAgICAgICAgKE5PX0VSUk9SICE9IHBtZS0+bV9wb3N0cHJvY2Vzc29yLnByb2Nlc3NEYXRhKGZyYW1lKSkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHRyaWdnZXIgcHJvY2VzcyBkYXRhIik7CisgICAgICAgIHBDaGFubmVsLT5idWZEb25lKHN1cGVyX2ZyYW1lKTsKKyAgICAgICAgZnJlZShmcmFtZSk7CisgICAgICAgIGZyYW1lID0gTlVMTDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExPR0goIltLUEkgUGVyZl06IFgiKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByYXdfc3RyZWFtX2NiX3JvdXRpbmUKKyAqCisgKiBERVNDUklQVElPTjogaGVscGVyIGZ1bmN0aW9uIHRvIGhhbmRsZSByYXcgZHVtcCBmcmFtZSBmcm9tIHJhdyBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN1cGVyX2ZyYW1lIDogcmVjZWl2ZWQgc3VwZXIgYnVmZmVyCisgKiAgIEBzdHJlYW0gICAgICA6IHN0cmVhbSBvYmplY3QKKyAqICAgQHVzZXJkYXRhICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICA6IE5vbmUKKyAqCisgKiBOT1RFICAgICAgOiBjYWxsZXIgcGFzc2VzIHRoZSBvd25lcnNoaXAgb2Ygc3VwZXJfZnJhbWUsIGl0J3Mgb3VyCisgKiAgICAgICAgICAgICByZXNwb25zaWJpbGl0eSB0byBmcmVlIHN1cGVyX2ZyYW1lIG9uY2UgaXQncyBkb25lLiBGb3IgcmF3CisgKiAgICAgICAgICAgICBmcmFtZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZW5kIHRvIHBvc3Rwcm9jZXNzb3IgZm9yIGpwZWcKKyAqICAgICAgICAgICAgIGVuY29kaW5nLiB0aGlzIGZ1bmN0aW9uIHdpbGwgcGxheSBzaHV0dGVyIGFuZCBzZW5kIHRoZSBkYXRhCisgKiAgICAgICAgICAgICBjYWxsYmFjayB0byB1cHBlciBsYXllci4gUmF3IGZyYW1lIGJ1ZmZlciB3aWxsIGJlIHJldHVybmVkCisgKiAgICAgICAgICAgICBiYWNrIHRvIGtlcm5lbCwgYW5kIGZyYW1lIHdpbGwgYmUgZnJlZSBhZnRlciB1c2UuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cmF3X3N0cmVhbV9jYl9yb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqIHN1cGVyX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqIC8qc3RyZWFtKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlcmRhdGEpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBMT0dIKCJbS1BJIFBlcmZdIDogQkVHSU4iKTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpwbWUgPSAoUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqKXVzZXJkYXRhOworICAgIGlmIChwbWUgPT0gTlVMTCB8fAorICAgICAgICBwbWUtPm1DYW1lcmFIYW5kbGUgPT0gTlVMTCB8fAorICAgICAgICBwbWUtPm1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUgIT0gc3VwZXJfZnJhbWUtPmNhbWVyYV9oYW5kbGUpeworICAgICAgICBMT0dFKCJjYW1lcmEgb2JqIG5vdCB2YWxpZCIpOworICAgICAgICAvLyBzaW1wbHkgZnJlZSBzdXBlciBmcmFtZQorICAgICAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBtZS0+bV9wb3N0cHJvY2Vzc29yLnByb2Nlc3NSYXdEYXRhKHN1cGVyX2ZyYW1lKTsKKyAgICBMT0dIKCJbS1BJIFBlcmZdIDogRU5EIik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmF3X2NoYW5uZWxfY2Jfcm91dGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBoZWxwZXIgZnVuY3Rpb24gdG8gaGFuZGxlIFJBVyAgc3VwZXJidWYgY2FsbGJhY2sgZGlyZWN0bHkgZnJvbQorICogICAgICAgICAgICAgIG1tLWNhbWVyYS1pbnRlcmZhY2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN1cGVyX2ZyYW1lIDogcmVjZWl2ZWQgc3VwZXIgYnVmZmVyCisgKiAgIEB1c2VyZGF0YSAgICA6IHVzZXIgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgOiBOb25lCisgKgorICogTk9URSAgICAgIDogcmVjdmRfZnJhbWUgd2lsbCBiZSByZWxlYXNlZCBhZnRlciB0aGlzIGNhbGwgYnkgY2FsbGVyLCBzbyBpZgorICogICAgICAgICAgICAgYXN5bmMgb3BlcmF0aW9uIG5lZWRlZCBmb3IgcmVjdmRfZnJhbWUsIGl0J3Mgb3VyIHJlc3BvbnNpYmlsaXR5CisgKiAgICAgICAgICAgICB0byBzYXZlIGEgY29weSBmb3IgdGhpcyB2YXJpYWJsZSB0byBiZSB1c2VkIGxhdGVyLgorKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cmF3X2NoYW5uZWxfY2Jfcm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2ZyYW1lLAorICAgICAgICB2b2lkICp1c2VyZGF0YSkKKworeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworCisgICAgTE9HSCgiW0tQSSBQZXJmXTogRSIpOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKnBtZSA9IChRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICopdXNlcmRhdGE7CisgICAgaWYgKHBtZSA9PSBOVUxMIHx8CisgICAgICAgIHBtZS0+bUNhbWVyYUhhbmRsZSA9PSBOVUxMIHx8CisgICAgICAgIHBtZS0+bUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSAhPSBzdXBlcl9mcmFtZS0+Y2FtZXJhX2hhbmRsZSl7CisgICAgICAgIExPR0UoImNhbWVyYSBvYmogbm90IHZhbGlkIik7CisgICAgICAgIC8vIHNpbXBseSBmcmVlIHN1cGVyIGZyYW1lCisgICAgICAgIGZyZWUoc3VwZXJfZnJhbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsID0gcG1lLT5tX2NoYW5uZWxzW1FDQU1FUkFfQ0hfVFlQRV9SQVddOworICAgIGlmIChwQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlJBVyBjaGFubmVsIGRvZXNuJ3QgZXhpc3QsIHJldHVybiBoZXJlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAocENoYW5uZWwtPmdldE15SGFuZGxlKCkgIT0gc3VwZXJfZnJhbWUtPmNoX2lkKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgSW5wdXQgc3VwZXIgYnVmZmVyIik7CisgICAgICAgIHBDaGFubmVsLT5idWZEb25lKHN1cGVyX2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuZHVtcG1ldGFkYXRhIiwgdmFsdWUsICIwIik7CisgICAgaW50MzJfdCBlbmFibGVkID0gYXRvaSh2YWx1ZSk7CisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqcE1ldGFGcmFtZSA9IE5VTEw7CisgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBTdHJlYW0gPSBOVUxMOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3VwZXJfZnJhbWUtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgICAgIHBTdHJlYW0gPSBwQ2hhbm5lbC0+Z2V0U3RyZWFtQnlIYW5kbGUoc3VwZXJfZnJhbWUtPmJ1ZnNbaV0tPnN0cmVhbV9pZCk7CisgICAgICAgICAgICBpZiAocFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcE1ldGFGcmFtZSA9IHN1cGVyX2ZyYW1lLT5idWZzW2ldOyAvL2ZpbmQgdGhlIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgIGlmIChwTWV0YUZyYW1lICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1ldGFkYXRhX2J1ZmZlcl90ICopcE1ldGFGcmFtZS0+YnVmZmVyKS0+aXNfdHVuaW5nX3BhcmFtc192YWxpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5kdW1wTWV0YWRhdGFUb0ZpbGUocFN0cmVhbSwgcE1ldGFGcmFtZSwgKGNoYXIgKikgInJhdyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHNhdmUgYSBjb3B5IGZvciB0aGUgc3VwZXJidWYKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QqIGZyYW1lID0gKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqKW1hbGxvYyhzaXplb2YobW1fY2FtZXJhX3N1cGVyX2J1Zl90KSk7CisgICAgaWYgKGZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgdG8gc2F2ZSByZWNlaXZlZF9mcmFtZSBzdHJ1Y3R1cmUuIik7CisgICAgICAgIHBDaGFubmVsLT5idWZEb25lKHN1cGVyX2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAqZnJhbWUgPSAqc3VwZXJfZnJhbWU7CisKKyAgICBpZiAoZnJhbWUtPm51bV9idWZzID4gMCkgeworICAgICAgICBMT0dJKCJbS1BJIFBlcmZdOiBzdXBlcmJ1ZiBmcmFtZV9pZHggJWQiLAorICAgICAgICAgICAgICAgIGZyYW1lLT5idWZzWzBdLT5mcmFtZV9pZHgpOworICAgIH0KKworICAgIC8vIFdhaXQgb24gUG9zdHByb2MgaW5pdGlhbGl6YXRpb24gaWYgbmVlZGVkCisgICAgLy8gdGhlbiBzZW5kIHRvIHBvc3Rwcm9jZXNzb3IKKyAgICBpZiAoKE5PX0VSUk9SICE9IHBtZS0+d2FpdERlZmVycmVkV29yayhwbWUtPm1SZXByb2NKb2IpKSB8fAorICAgICAgICAgICAgKE5PX0VSUk9SICE9IHBtZS0+bV9wb3N0cHJvY2Vzc29yLnByb2Nlc3NEYXRhKGZyYW1lKSkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHRyaWdnZXIgcHJvY2VzcyBkYXRhIik7CisgICAgICAgIHBDaGFubmVsLT5idWZEb25lKHN1cGVyX2ZyYW1lKTsKKyAgICAgICAgZnJlZShmcmFtZSk7CisgICAgICAgIGZyYW1lID0gTlVMTDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExPR0goIltLUEkgUGVyZl06IFgiKTsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByZXZpZXdfcmF3X3N0cmVhbV9jYl9yb3V0aW5lCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBmdW5jdGlvbiB0byBoYW5kbGUgcmF3IGZyYW1lIGR1cmluZyBzdGFuZGFyZCBwcmV2aWV3CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdXBlcl9mcmFtZSA6IHJlY2VpdmVkIHN1cGVyIGJ1ZmZlcgorICogICBAc3RyZWFtICAgICAgOiBzdHJlYW0gb2JqZWN0CisgKiAgIEB1c2VyZGF0YSAgICA6IHVzZXIgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgOiBOb25lCisgKgorICogTk9URSAgICAgIDogY2FsbGVyIHBhc3NlcyB0aGUgb3duZXJzaGlwIG9mIHN1cGVyX2ZyYW1lLCBpdCdzIG91cgorICogICAgICAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSBzdXBlcl9mcmFtZSBvbmNlIGl0J3MgZG9uZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpwcmV2aWV3X3Jhd19zdHJlYW1fY2Jfcm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKiBzdXBlcl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHVzZXJkYXRhKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTE9HSCgiW0tQSSBQZXJmXSA6IEJFR0lOIik7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGJvb2wgZHVtcF9wcmV2aWV3X3JhdyA9IGZhbHNlLCBkdW1wX3ZpZGVvX3JhdyA9IGZhbHNlOworCisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqcG1lID0gKFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKil1c2VyZGF0YTsKKyAgICBpZiAocG1lID09IE5VTEwgfHwKKyAgICAgICAgcG1lLT5tQ2FtZXJhSGFuZGxlID09IE5VTEwgfHwKKyAgICAgICAgcG1lLT5tQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlICE9IHN1cGVyX2ZyYW1lLT5jYW1lcmFfaGFuZGxlKXsKKyAgICAgICAgTE9HRSgiY2FtZXJhIG9iaiBub3QgdmFsaWQiKTsKKyAgICAgICAgLy8gc2ltcGx5IGZyZWUgc3VwZXIgZnJhbWUKKyAgICAgICAgZnJlZShzdXBlcl9mcmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpyYXdfZnJhbWUgPSBzdXBlcl9mcmFtZS0+YnVmc1swXTsKKworICAgIGlmIChyYXdfZnJhbWUgIT0gTlVMTCkgeworICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnByZXZpZXdfcmF3IiwgdmFsdWUsICIwIik7CisgICAgICAgIGR1bXBfcHJldmlld19yYXcgPSBhdG9pKHZhbHVlKSA+IDAgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEudmlkZW9fcmF3IiwgdmFsdWUsICIwIik7CisgICAgICAgIGR1bXBfdmlkZW9fcmF3ID0gYXRvaSh2YWx1ZSkgPiAwID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBpZiAoZHVtcF9wcmV2aWV3X3JhdyB8fCAocG1lLT5tUGFyYW1ldGVycy5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKQorICAgICAgICAgICAgICAgICYmIGR1bXBfdmlkZW9fcmF3KSkgeworICAgICAgICAgICAgcG1lLT5kdW1wRnJhbWVUb0ZpbGUoc3RyZWFtLCByYXdfZnJhbWUsIFFDQU1FUkFfRFVNUF9GUk1fUkFXKTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW0tPmJ1ZkRvbmUocmF3X2ZyYW1lLT5idWZfaWR4KTsKKyAgICB9CisgICAgZnJlZShzdXBlcl9mcmFtZSk7CisKKyAgICBMT0dIKCJbS1BJIFBlcmZdIDogRU5EIik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc25hcHNob3RfcmF3X3N0cmVhbV9jYl9yb3V0aW5lCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBmdW5jdGlvbiB0byBoYW5kbGUgcmF3IGZyYW1lIGR1cmluZyBzdGFuZGFyZCBjYXB0dXJlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdXBlcl9mcmFtZSA6IHJlY2VpdmVkIHN1cGVyIGJ1ZmZlcgorICogICBAc3RyZWFtICAgICAgOiBzdHJlYW0gb2JqZWN0CisgKiAgIEB1c2VyZGF0YSAgICA6IHVzZXIgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgOiBOb25lCisgKgorICogTk9URSAgICAgIDogY2FsbGVyIHBhc3NlcyB0aGUgb3duZXJzaGlwIG9mIHN1cGVyX2ZyYW1lLCBpdCdzIG91cgorICogICAgICAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSBzdXBlcl9mcmFtZSBvbmNlIGl0J3MgZG9uZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzbmFwc2hvdF9yYXdfc3RyZWFtX2NiX3JvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICogc3VwZXJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHVzZXJkYXRhKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTE9HSCgiW0tQSSBQZXJmXSA6IEJFR0lOIik7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGJvb2wgZHVtcF9yYXcgPSBmYWxzZTsKKworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKnBtZSA9IChRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICopdXNlcmRhdGE7CisgICAgaWYgKHBtZSA9PSBOVUxMIHx8CisgICAgICAgIHBtZS0+bUNhbWVyYUhhbmRsZSA9PSBOVUxMIHx8CisgICAgICAgIHBtZS0+bUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSAhPSBzdXBlcl9mcmFtZS0+Y2FtZXJhX2hhbmRsZSl7CisgICAgICAgIExPR0UoImNhbWVyYSBvYmogbm90IHZhbGlkIik7CisgICAgICAgIC8vIHNpbXBseSBmcmVlIHN1cGVyIGZyYW1lCisgICAgICAgIGZyZWUoc3VwZXJfZnJhbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5zbmFwc2hvdF9yYXciLCB2YWx1ZSwgIjAiKTsKKyAgICBkdW1wX3JhdyA9IGF0b2kodmFsdWUpID4gMCA/IHRydWUgOiBmYWxzZTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzdXBlcl9mcmFtZS0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICBpZiAoc3VwZXJfZnJhbWUtPmJ1ZnNbaV0tPnN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9SQVcpIHsKKyAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKiByYXdfZnJhbWUgPSBzdXBlcl9mcmFtZS0+YnVmc1tpXTsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IHN0cmVhbSkgeworICAgICAgICAgICAgICAgIGlmIChkdW1wX3JhdykgeworICAgICAgICAgICAgICAgICAgICBwbWUtPmR1bXBGcmFtZVRvRmlsZShzdHJlYW0sIHJhd19mcmFtZSwgUUNBTUVSQV9EVU1QX0ZSTV9SQVcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdHJlYW0tPmJ1ZkRvbmUoc3VwZXJfZnJhbWUtPmJ1ZnNbaV0tPmJ1Zl9pZHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKKworICAgIExPR0goIltLUEkgUGVyZl0gOiBFTkQiKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB1cGRhdGVNZXRhZGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBGcmFtZSByZWxhdGVkIHBhcmFtZXRlciBjYW4gYmUgdXBkYXRlZCBoZXJlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwTWV0YURhdGEgOiBwb2ludGVyIHRvIG1ldGFkYXRhIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6dXBkYXRlTWV0YWRhdGEobWV0YWRhdGFfYnVmZmVyX3QgKnBNZXRhRGF0YSkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBpZiAocE1ldGFEYXRhID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiTnVsbCBNZXRhZGF0YSBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8vIFNoYXJwbmVzcworICAgIGNhbV9lZGdlX2FwcGxpY2F0aW9uX3QgZWRnZV9hcHBsaWNhdGlvbjsKKyAgICBtZW1zZXQoJmVkZ2VfYXBwbGljYXRpb24sIDB4MDAsIHNpemVvZihjYW1fZWRnZV9hcHBsaWNhdGlvbl90KSk7CisgICAgZWRnZV9hcHBsaWNhdGlvbi5zaGFycG5lc3MgPSBtUGFyYW1ldGVycy5nZXRTaGFycG5lc3MoKTsKKyAgICBpZiAoZWRnZV9hcHBsaWNhdGlvbi5zaGFycG5lc3MgIT0gMCkgeworICAgICAgICBlZGdlX2FwcGxpY2F0aW9uLmVkZ2VfbW9kZSA9IENBTV9FREdFX01PREVfRkFTVDsKKyAgICB9IGVsc2UgeworICAgICAgICBlZGdlX2FwcGxpY2F0aW9uLmVkZ2VfbW9kZSA9IENBTV9FREdFX01PREVfT0ZGOworICAgIH0KKyAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHBNZXRhRGF0YSwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRURHRV9NT0RFLCBlZGdlX2FwcGxpY2F0aW9uKTsKKworICAgIC8vRWZmZWN0CisgICAgaW50MzJfdCBwcm1FZmZlY3QgPSBtUGFyYW1ldGVycy5nZXRFZmZlY3QoKTsKKyAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHBNZXRhRGF0YSwgQ0FNX0lOVEZfUEFSTV9FRkZFQ1QsIHBybUVmZmVjdCk7CisKKyAgICAvL2ZsaXAKKyAgICBpbnQzMl90IHBybUZsaXAgPSBtUGFyYW1ldGVycy5nZXRGbGlwTW9kZShDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QpOworICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gocE1ldGFEYXRhLCBDQU1fSU5URl9QQVJNX0ZMSVAsIHBybUZsaXApOworCisgICAgLy9kZW5vaXNlCisgICAgdWludDhfdCBwcm1EZW5vaXNlID0gKHVpbnQ4X3QpbVBhcmFtZXRlcnMuaXNXTlJFbmFibGVkKCk7CisgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChwTWV0YURhdGEsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX05PSVNFX1JFRFVDVElPTl9NT0RFLCBwcm1EZW5vaXNlKTsKKworICAgIC8vcm90YXRpb24gJiBkZXZpY2Ugcm90YXRpb24KKyAgICB1aW50MzJfdCBwcm1Sb3RhdGlvbiA9IG1QYXJhbWV0ZXJzLmdldEpwZWdSb3RhdGlvbigpOworICAgIGNhbV9yb3RhdGlvbl9pbmZvX3Qgcm90YXRpb25faW5mbzsKKyAgICBtZW1zZXQoJnJvdGF0aW9uX2luZm8sIDAsIHNpemVvZihjYW1fcm90YXRpb25faW5mb190KSk7CisgICAgaWYgKHBybVJvdGF0aW9uID09IDApIHsKKyAgICAgICByb3RhdGlvbl9pbmZvLnJvdGF0aW9uID0gUk9UQVRFXzA7CisgICAgfSBlbHNlIGlmIChwcm1Sb3RhdGlvbiA9PSA5MCkgeworICAgICAgIHJvdGF0aW9uX2luZm8ucm90YXRpb24gPSBST1RBVEVfOTA7CisgICAgfSBlbHNlIGlmIChwcm1Sb3RhdGlvbiA9PSAxODApIHsKKyAgICAgICByb3RhdGlvbl9pbmZvLnJvdGF0aW9uID0gUk9UQVRFXzE4MDsKKyAgICB9IGVsc2UgaWYgKHBybVJvdGF0aW9uID09IDI3MCkgeworICAgICAgIHJvdGF0aW9uX2luZm8ucm90YXRpb24gPSBST1RBVEVfMjcwOworICAgIH0KKworICAgIHVpbnQzMl90IGRldmljZV9yb3RhdGlvbiA9IG1QYXJhbWV0ZXJzLmdldERldmljZVJvdGF0aW9uKCk7CisgICAgaWYgKGRldmljZV9yb3RhdGlvbiA9PSAwKSB7CisgICAgICAgIHJvdGF0aW9uX2luZm8uZGV2aWNlX3JvdGF0aW9uID0gUk9UQVRFXzA7CisgICAgfSBlbHNlIGlmIChkZXZpY2Vfcm90YXRpb24gPT0gOTApIHsKKyAgICAgICAgcm90YXRpb25faW5mby5kZXZpY2Vfcm90YXRpb24gPSBST1RBVEVfOTA7CisgICAgfSBlbHNlIGlmIChkZXZpY2Vfcm90YXRpb24gPT0gMTgwKSB7CisgICAgICAgIHJvdGF0aW9uX2luZm8uZGV2aWNlX3JvdGF0aW9uID0gUk9UQVRFXzE4MDsKKyAgICB9IGVsc2UgaWYgKGRldmljZV9yb3RhdGlvbiA9PSAyNzApIHsKKyAgICAgICAgcm90YXRpb25faW5mby5kZXZpY2Vfcm90YXRpb24gPSBST1RBVEVfMjcwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJvdGF0aW9uX2luZm8uZGV2aWNlX3JvdGF0aW9uID0gUk9UQVRFXzA7CisgICAgfQorCisgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChwTWV0YURhdGEsIENBTV9JTlRGX1BBUk1fUk9UQVRJT04sIHJvdGF0aW9uX2luZm8pOworCisgICAgLy8gSW1nbGliIER5bmFtaWMgU2NlbmUgRGF0YQorICAgIGNhbV9keW5faW1nX2RhdGFfdCBkeW5faW1nX2RhdGEgPSBtUGFyYW1ldGVycy5nZXREeW5hbWljSW1nRGF0YSgpOworICAgIGlmIChtUGFyYW1ldGVycy5pc1N0aWxsTW9yZUVuYWJsZWQoKSkgeworICAgICAgICBjYW1fc3RpbGxfbW9yZV90IHN0aWxsbW9yZV9jYXAgPSBtUGFyYW1ldGVycy5nZXRTdGlsbE1vcmVTZXR0aW5ncygpOworICAgICAgICBkeW5faW1nX2RhdGEuaW5wdXRfY291bnQgPSBzdGlsbG1vcmVfY2FwLmJ1cnN0X2NvdW50OworICAgIH0KKyAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHBNZXRhRGF0YSwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfSU1HX0RZTl9GRUFULCBkeW5faW1nX2RhdGEpOworCisgICAgLy9DUFAgQ0RTCisgICAgaW50MzJfdCBwcm1DRFNNb2RlID0gbVBhcmFtZXRlcnMuZ2V0Q0RTTW9kZSgpOworICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gocE1ldGFEYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9DRFNfTU9ERSwgcHJtQ0RTTW9kZSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbWV0YWRhdGFfc3RyZWFtX2NiX3JvdXRpbmUKKyAqCisgKiBERVNDUklQVElPTjogaGVscGVyIGZ1bmN0aW9uIHRvIGhhbmRsZSBtZXRhZGF0YSBmcmFtZSBmcm9tIG1ldGFkYXRhIHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3VwZXJfZnJhbWUgOiByZWNlaXZlZCBzdXBlciBidWZmZXIKKyAqICAgQHN0cmVhbSAgICAgIDogc3RyZWFtIG9iamVjdAorICogICBAdXNlcmRhdGEgICAgOiB1c2VyIGRhdGEgcHRyCisgKgorICogUkVUVVJOICAgIDogTm9uZQorICoKKyAqIE5PVEUgICAgICA6IGNhbGxlciBwYXNzZXMgdGhlIG93bmVyc2hpcCBvZiBzdXBlcl9mcmFtZSwgaXQncyBvdXIKKyAqICAgICAgICAgICAgIHJlc3BvbnNpYmlsaXR5IHRvIGZyZWUgc3VwZXJfZnJhbWUgb25jZSBpdCdzIGRvbmUuIE1ldGFkYXRhCisgKiAgICAgICAgICAgICBjb3VsZCBoYXZlIHZhbGlkIGVudHJpZXMgZm9yIGZhY2UgZGV0ZWN0aW9uIHJlc3VsdCBvcgorICogICAgICAgICAgICAgaGlzdG9ncmFtIHN0YXRpc3RpY3MgaW5mb3JtYXRpb24uCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6bWV0YWRhdGFfc3RyZWFtX2NiX3JvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICogc3VwZXJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKiBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiB1c2VyZGF0YSkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIExPR0QoIltLUEkgUGVyZl0gOiBCRUdJTiIpOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKnBtZSA9IChRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICopdXNlcmRhdGE7CisgICAgaWYgKHBtZSA9PSBOVUxMIHx8CisgICAgICAgIHBtZS0+bUNhbWVyYUhhbmRsZSA9PSBOVUxMIHx8CisgICAgICAgIHBtZS0+bUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSAhPSBzdXBlcl9mcmFtZS0+Y2FtZXJhX2hhbmRsZSl7CisgICAgICAgIExPR0UoImNhbWVyYSBvYmogbm90IHZhbGlkIik7CisgICAgICAgIC8vIHNpbXBseSBmcmVlIHN1cGVyIGZyYW1lCisgICAgICAgIGZyZWUoc3VwZXJfZnJhbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqZnJhbWUgPSBzdXBlcl9mcmFtZS0+YnVmc1swXTsKKyAgICBtZXRhZGF0YV9idWZmZXJfdCAqcE1ldGFEYXRhID0gKG1ldGFkYXRhX2J1ZmZlcl90ICopZnJhbWUtPmJ1ZmZlcjsKKyAgICBpZihwbWUtPm1fc3RhdGVNYWNoaW5lLmlzTm9uWlNMQ2FwdHVyZVJ1bm5pbmcoKSYmCisgICAgICAgIXBtZS0+bUxvbmdzaG90RW5hYmxlZCkgeworICAgICAgIC8vTWFrZSBzaHV0dGVyIGNhbGwgYmFjayBpbiBub24gWlNMIG1vZGUgb25jZSByYXcgZnJhbWUgaXMgcmVjZWl2ZWQgZnJvbSBWRkUuCisgICAgICAgcG1lLT5wbGF5U2h1dHRlcigpOworICAgIH0KKworICAgIGlmIChwTWV0YURhdGEtPmlzX3R1bmluZ19wYXJhbXNfdmFsaWQgJiYgcG1lLT5tUGFyYW1ldGVycy5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKSA9PSB0cnVlKSB7CisgICAgICAgIC8vRHVtcCBUdW5pbmcgZGF0YSBmb3IgdmlkZW8KKyAgICAgICAgcG1lLT5kdW1wTWV0YWRhdGFUb0ZpbGUoc3RyZWFtLGZyYW1lLChjaGFyICopIlZpZGVvIik7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2hpc3Rfc3RhdHNfdCwgc3RhdHNfZGF0YSwgQ0FNX0lOVEZfTUVUQV9ISVNUT0dSQU0sIHBNZXRhRGF0YSkgeworICAgICAgICAvLyBwcm9jZXNzIGhpc3RvZ3JhbSBzdGF0aXN0aWNzIGluZm8KKyAgICAgICAgcWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICpwYXlsb2FkID0KKyAgICAgICAgICAgIChxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKikKKyAgICAgICAgICAgICAgICBtYWxsb2Moc2l6ZW9mKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCkpOworICAgICAgICBpZiAoTlVMTCAhPSBwYXlsb2FkKSB7CisgICAgICAgICAgICBtZW1zZXQocGF5bG9hZCwgMCwgc2l6ZW9mKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCkpOworICAgICAgICAgICAgcGF5bG9hZC0+ZXZ0X3R5cGUgPSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9ISVNUT0dSQU1fU1RBVFM7CisgICAgICAgICAgICBwYXlsb2FkLT5zdGF0c19kYXRhID0gKnN0YXRzX2RhdGE7CisgICAgICAgICAgICBpbnQzMl90IHJjID0gcG1lLT5wcm9jZXNzRXZ0KFFDQU1FUkFfU01fRVZUX0VWVF9JTlRFUk5BTCwgcGF5bG9hZCk7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJwcm9jZXNzRXZ0IGhpc3RvZ3JhbSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBmcmVlKHBheWxvYWQpOworICAgICAgICAgICAgICAgIHBheWxvYWQgPSBOVUxMOworCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIGhpc3RvZ3JhbSBxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9mYWNlX2RldGVjdGlvbl9kYXRhX3QsIGRldGVjdGlvbl9kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9GQUNFX0RFVEVDVElPTiwgcE1ldGFEYXRhKSB7CisKKyAgICAgICAgY2FtX2ZhY2VzX2RhdGFfdCBmYWNlc19kYXRhOworICAgICAgICBwbWUtPmZpbGxGYWNlc0RhdGEoZmFjZXNfZGF0YSwgcE1ldGFEYXRhKTsKKyAgICAgICAgZmFjZXNfZGF0YS5kZXRlY3Rpb25fZGF0YS5mZF90eXBlID0gUUNBTUVSQV9GRF9QUkVWSUVXOyAvL0hBUkQgQ09ERSBoZXJlIGJlZm9yZSBNQ1QgY2FuIHN1cHBvcnQKKworICAgICAgICBxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKnBheWxvYWQgPSAocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICopCisgICAgICAgICAgICBtYWxsb2Moc2l6ZW9mKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCkpOworICAgICAgICBpZiAoTlVMTCAhPSBwYXlsb2FkKSB7CisgICAgICAgICAgICBtZW1zZXQocGF5bG9hZCwgMCwgc2l6ZW9mKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCkpOworICAgICAgICAgICAgcGF5bG9hZC0+ZXZ0X3R5cGUgPSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9GQUNFX0RFVEVDVF9SRVNVTFQ7CisgICAgICAgICAgICBwYXlsb2FkLT5mYWNlc19kYXRhID0gZmFjZXNfZGF0YTsKKyAgICAgICAgICAgIGludDMyX3QgcmMgPSBwbWUtPnByb2Nlc3NFdnQoUUNBTUVSQV9TTV9FVlRfRVZUX0lOVEVSTkFMLCBwYXlsb2FkKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR1coInByb2Nlc3NFdnQgZmFjZSBkZXRlY3Rpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgZnJlZShwYXlsb2FkKTsKKyAgICAgICAgICAgICAgICBwYXlsb2FkID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgZmFjZSBkZXRlY3QgcWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgYWZTdGF0ZSwgQ0FNX0lOVEZfTUVUQV9BRl9TVEFURSwgcE1ldGFEYXRhKSB7CisgICAgICAgIHVpbnQ4X3QgZm9yY2VBRlVwZGF0ZSA9IEZBTFNFOworICAgICAgICAvLzEuIEVhcmxpZXIgSEFMIHVzZWQgdG8gcmVseSBvbiBBRiBkb25lIGZsYWdzIHNldCBpbiBtZXRhZGF0YSB0byBnZW5lcmF0ZSBjYWxsYmFja3MgdG8KKyAgICAgICAgLy91cHBlciBsYXllcnMuIEJ1dCBpbiBzY2VuYXJpb3Mgd2hlcmUgbWV0YWRhdGEgZHJvcHMgZXNwZWNpYWxseSB3aGljaCBjb250YWluIGltcG9ydGFudAorICAgICAgICAvL0FGIGluZm9ybWF0aW9uLCBBUFAgd2lsbCB3YWl0IGluZGVmaW5pdGVseSBmb3IgZm9jdXMgcmVzdWx0IHJlc3VsdGluZyBpbiBjYXB0dXJlIGhhbmcuCisgICAgICAgIC8vMi4gSEFMIGNhbiBjaGVjayBmb3IgQUYgc3RhdGUgdHJhbnNpdGlvbnMgdG8gZ2VuZXJhdGUgQUYgc3RhdGUgY2FsbGJhY2tzIHRvIHVwcGVyIGxheWVycy4KKyAgICAgICAgLy9UaGlzIHdpbGwgaGVscCBvdmVyY29tZSBtZXRhZGF0YSBkcm9wIGlzc3VlIHdpdGggdGhlIGVhcmxpZXIgYXBwcm9hY2guCisgICAgICAgIC8vMy4gQnV0IHNvbWV0aW1lcyBBRiBzdGF0ZSB0cmFuc2l0aW9ucyBjYW4gaGFwcGVuIHNvIGZhc3Qgd2l0aGluIHNhbWUgbWV0YWRhdGEgZHVlIHRvCisgICAgICAgIC8vd2hpY2ggSEFMIHdpbGwgcmVjZWl2ZSBvbmx5IHRoZSBmaW5hbCBBRiBzdGF0ZS4gSEFMIG1heSBwZXJjZWl2ZSB0aGlzIGFzIG5vIGNoYW5nZSBpbiBBRgorICAgICAgICAvL3N0YXRlIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgdHJhbnNpdGlvbnMgaGFwcGVuZWQgKGZvciBleGFtcGxlIHN0YXRlIEEgLT4gQiAtPiBBKS4KKyAgICAgICAgLy80LiBUbyBvdmVyY29tZSB0aGUgZHJhd2JhY2tzIG9mIGJvdGggdGhlIGFwcHJvYWNoZXMsIHdlIGdvIGZvciBhIGh5YnJpZCBtb2RlbCBpbiB3aGljaAorICAgICAgICAvL3dlIGNoZWNrIHN0YXRlIHRyYW5zaXRpb24gYXQgYm90aCBIQUwgbGV2ZWwgYW5kIEFGIG1vZHVsZSBsZXZlbC4gV2UgcmVseSBvbgorICAgICAgICAvLydzdGF0ZSB0cmFuc2l0aW9uJyBtZXRhIGZpZWxkIHNldCBieSBBRiBtb2R1bGUgZm9yIHRoZSBzdGF0ZSB0cmFuc2l0aW9uIGRldGVjdGVkIGJ5IGl0LgorICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50OF90LCBzdGF0ZUNoYW5nZSwgQ0FNX0lOVEZfQUZfU1RBVEVfVFJBTlNJVElPTiwgcE1ldGFEYXRhKSB7CisgICAgICAgICAgICBmb3JjZUFGVXBkYXRlID0gKnN0YXRlQ2hhbmdlOworICAgICAgICB9CisgICAgICAgIC8vVGhpcyBpcyBhIHNwZWNpYWwgc2NlbmFyaW8gaW4gd2hpY2ggd2hlbiBzY2VuZSBtb2RlcyBsaWtlIGxhbmRzY2FwZSBhcmUgc2VsZWN0ZWQsIEFGIG1vZGUKKyAgICAgICAgLy9nZXRzIGNoYW5nZWQgdG8gSU5GSU5JVFkgYXQgYmFja2VuZCwgYnV0IEhBTCB3aWxsIG5vdCBiZSBhd2FyZSBvZiBpdC4gQWxzbywgQUYgc3RhdGUgaW4KKyAgICAgICAgLy9zdWNoIGNhc2VzIHdpbGwgYmUgc2V0IHRvIENBTV9BRl9TVEFURV9JTkFDVElWRSBieSBiYWNrZW5kLiBTbywgZGV0ZWN0IHRoZSBBRiBtb2RlCisgICAgICAgIC8vY2hhbmdlIGhlcmUgYW5kIHRyaWdnZXIgQUYgY2FsbGJhY2sgQCBwcm9jZXNzQXV0b0ZvY3VzRXZlbnQoKS4KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIGFmRm9jdXNNb2RlLCBDQU1fSU5URl9QQVJNX0ZPQ1VTX01PREUsIHBNZXRhRGF0YSkgeworICAgICAgICAgICAgaWYgKCgoY2FtX2ZvY3VzX21vZGVfdHlwZSkoKmFmRm9jdXNNb2RlKSA9PSBDQU1fRk9DVVNfTU9ERV9JTkZJTklUWSkgJiYKKyAgICAgICAgICAgICAgICAgICAgcG1lLT5tQWN0aXZlQUYpeworICAgICAgICAgICAgICAgIGZvcmNlQUZVcGRhdGUgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgocG1lLT5tX2N1cnJlbnRGb2N1c1N0YXRlICE9ICgqYWZTdGF0ZSkpIHx8IGZvcmNlQUZVcGRhdGUpIHsKKyAgICAgICAgICAgIGNhbV9hZl9zdGF0ZV90IHByZXZGb2N1c1N0YXRlID0gcG1lLT5tX2N1cnJlbnRGb2N1c1N0YXRlOworICAgICAgICAgICAgcG1lLT5tX2N1cnJlbnRGb2N1c1N0YXRlID0gKGNhbV9hZl9zdGF0ZV90KSgqYWZTdGF0ZSk7CisgICAgICAgICAgICBxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKnBheWxvYWQgPSAocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICopCisgICAgICAgICAgICAgICAgICAgIG1hbGxvYyhzaXplb2YocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90KSk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBwYXlsb2FkKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KHBheWxvYWQsIDAsIHNpemVvZihxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QpKTsKKyAgICAgICAgICAgICAgICBwYXlsb2FkLT5ldnRfdHlwZSA9IFFDQU1FUkFfSU5URVJOQUxfRVZUX0ZPQ1VTX1VQREFURTsKKyAgICAgICAgICAgICAgICBwYXlsb2FkLT5mb2N1c19kYXRhLmZvY3VzX3N0YXRlID0gKGNhbV9hZl9zdGF0ZV90KSgqYWZTdGF0ZSk7CisgICAgICAgICAgICAgICAgLy9OZWVkIHRvIGZsdXNoIFpTTCBRIG9ubHkgaWYgd2UgYXJlIHRyYW5zaXRpb25pbmcgZnJvbSBzY2FubmluZyBzdGF0ZQorICAgICAgICAgICAgICAgIC8vdG8gZm9jdXNlZC9ub3QgZm9jdXNlZCBzdGF0ZS4KKyAgICAgICAgICAgICAgICBwYXlsb2FkLT5mb2N1c19kYXRhLmZsdXNoX2luZm8ubmVlZEZsdXNoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgocHJldkZvY3VzU3RhdGUgPT0gQ0FNX0FGX1NUQVRFX1BBU1NJVkVfU0NBTikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2Rm9jdXNTdGF0ZSA9PSBDQU1fQUZfU1RBVEVfQUNUSVZFX1NDQU4pKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChwbWUtPm1fY3VycmVudEZvY3VzU3RhdGUgPT0gQ0FNX0FGX1NUQVRFX0ZPQ1VTRURfTE9DS0VEKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHBtZS0+bV9jdXJyZW50Rm9jdXNTdGF0ZSA9PSBDQU1fQUZfU1RBVEVfTk9UX0ZPQ1VTRURfTE9DS0VEKSk7CisgICAgICAgICAgICAgICAgcGF5bG9hZC0+Zm9jdXNfZGF0YS5mbHVzaF9pbmZvLmZvY3VzZWRfZnJhbWVfaWR4ID0gZnJhbWUtPmZyYW1lX2lkeDsKKworICAgICAgICAgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGZsb2F0LCBmb2N1c0Rpc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9MRU5TX0ZPQ1VTX0RJU1RBTkNFLCBwTWV0YURhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC0+Zm9jdXNfZGF0YS5mb2N1c19kaXN0LgorICAgICAgICAgICAgICAgICAgICBmb2N1c19kaXN0YW5jZVtDQU1fRk9DVVNfRElTVEFOQ0VfT1BUSU1BTF9JTkRFWF0gPSAqZm9jdXNEaXN0YW5jZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoZmxvYXQsIGZvY3VzUmFuZ2UsIENBTV9JTlRGX01FVEFfTEVOU19GT0NVU19SQU5HRSwgcE1ldGFEYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIHBheWxvYWQtPmZvY3VzX2RhdGEuZm9jdXNfZGlzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1c19kaXN0YW5jZVtDQU1fRk9DVVNfRElTVEFOQ0VfTkVBUl9JTkRFWF0gPSBmb2N1c1JhbmdlWzBdOworICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLT5mb2N1c19kYXRhLmZvY3VzX2Rpc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNfZGlzdGFuY2VbQ0FNX0ZPQ1VTX0RJU1RBTkNFX0ZBUl9JTkRFWF0gPSBmb2N1c1JhbmdlWzFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgZm9jdXNNb2RlLCBDQU1fSU5URl9QQVJNX0ZPQ1VTX01PREUsIHBNZXRhRGF0YSkgeworICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLT5mb2N1c19kYXRhLmZvY3VzX21vZGUgPSAoY2FtX2ZvY3VzX21vZGVfdHlwZSkoKmZvY3VzTW9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQ4X3QsIGlzRGVwdGhGb2N1cywKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRk9DVVNfREVQVEhfSU5GTywgcE1ldGFEYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIHBheWxvYWQtPmZvY3VzX2RhdGEuaXNEZXB0aCA9ICppc0RlcHRoRm9jdXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludDMyX3QgcmMgPSBwbWUtPnByb2Nlc3NFdnQoUUNBTUVSQV9TTV9FVlRfRVZUX0lOVEVSTkFMLCBwYXlsb2FkKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVygicHJvY2Vzc0V2dCBmb2N1cyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShwYXlsb2FkKTsKKyAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIGZvY3VzIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2Nyb3BfZGF0YV90LCBjcm9wX2RhdGEsIENBTV9JTlRGX01FVEFfQ1JPUF9EQVRBLCBwTWV0YURhdGEpIHsKKyAgICAgICAgaWYgKGNyb3BfZGF0YS0+bnVtX29mX3N0cmVhbXMgPiBNQVhfTlVNX1NUUkVBTVMpIHsKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgbnVtX29mX3N0cmVhbXMgJWQgaW4gY3JvcF9kYXRhIiwKKyAgICAgICAgICAgICAgICBjcm9wX2RhdGEtPm51bV9vZl9zdHJlYW1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqKQorICAgICAgICAgICAgICAgICAgICBtYWxsb2Moc2l6ZW9mKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCkpOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gcGF5bG9hZCkgeworICAgICAgICAgICAgICAgIG1lbXNldChwYXlsb2FkLCAwLCBzaXplb2YocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90KSk7CisgICAgICAgICAgICAgICAgcGF5bG9hZC0+ZXZ0X3R5cGUgPSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9DUk9QX0lORk87CisgICAgICAgICAgICAgICAgcGF5bG9hZC0+Y3JvcF9kYXRhID0gKmNyb3BfZGF0YTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJjID0gcG1lLT5wcm9jZXNzRXZ0KFFDQU1FUkFfU01fRVZUX0VWVF9JTlRFUk5BTCwgcGF5bG9hZCk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoInByb2Nlc3NFdnQgY3JvcCBpbmZvIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBmcmVlKHBheWxvYWQpOworICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgcHJlcF9zbmFwc2hvdCBxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIHByZXBfc25hcHNob3RfZG9uZV9zdGF0ZSwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfUFJFUF9TTkFQU0hPVF9ET05FLCBwTWV0YURhdGEpIHsKKyAgICAgICAgcWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICpwYXlsb2FkID0KKyAgICAgICAgKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqKW1hbGxvYyhzaXplb2YocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90KSk7CisgICAgICAgIGlmIChOVUxMICE9IHBheWxvYWQpIHsKKyAgICAgICAgICAgIG1lbXNldChwYXlsb2FkLCAwLCBzaXplb2YocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90KSk7CisgICAgICAgICAgICBwYXlsb2FkLT5ldnRfdHlwZSA9IFFDQU1FUkFfSU5URVJOQUxfRVZUX1BSRVBfU05BUFNIT1RfRE9ORTsKKyAgICAgICAgICAgIHBheWxvYWQtPnByZXBfc25hcHNob3Rfc3RhdGUgPSAoY2FtX3ByZXBfc25hcHNob3Rfc3RhdGVfdCkqcHJlcF9zbmFwc2hvdF9kb25lX3N0YXRlOworICAgICAgICAgICAgaW50MzJfdCByYyA9IHBtZS0+cHJvY2Vzc0V2dChRQ0FNRVJBX1NNX0VWVF9FVlRfSU5URVJOQUwsIHBheWxvYWQpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HVygicHJvY2Vzc0V2dCBwcmVwX3NuYXBzaG90IGZhaWxlZCIpOworICAgICAgICAgICAgICAgIGZyZWUocGF5bG9hZCk7CisgICAgICAgICAgICAgICAgcGF5bG9hZCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIHByZXBfc25hcHNob3QgcWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fYXNkX2hkcl9zY2VuZV9kYXRhX3QsIGhkcl9zY2VuZV9kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9BU0RfSERSX1NDRU5FX0RBVEEsIHBNZXRhRGF0YSkgeworICAgICAgICBMT0dIKCJoZHJfc2NlbmVfZGF0YTogJWQgJWZcbiIsCisgICAgICAgICAgICAgICAgaGRyX3NjZW5lX2RhdGEtPmlzX2hkcl9zY2VuZSwgaGRyX3NjZW5lX2RhdGEtPmhkcl9jb25maWRlbmNlKTsKKyAgICAgICAgLy9IYW5kbGUgdGhpcyBIRFIgbWV0YSBkYXRhIG9ubHkgaWYgY2FwdHVyZSBpcyBub3QgaW4gcHJvY2VzcworICAgICAgICBpZiAoIXBtZS0+bV9zdGF0ZU1hY2hpbmUuaXNDYXB0dXJlUnVubmluZygpKSB7CisgICAgICAgICAgICBxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKnBheWxvYWQgPQorICAgICAgICAgICAgICAgICAgICAocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICopCisgICAgICAgICAgICAgICAgICAgIG1hbGxvYyhzaXplb2YocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90KSk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBwYXlsb2FkKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KHBheWxvYWQsIDAsIHNpemVvZihxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QpKTsKKyAgICAgICAgICAgICAgICBwYXlsb2FkLT5ldnRfdHlwZSA9IFFDQU1FUkFfSU5URVJOQUxfRVZUX0hEUl9VUERBVEU7CisgICAgICAgICAgICAgICAgcGF5bG9hZC0+aGRyX2RhdGEgPSAqaGRyX3NjZW5lX2RhdGE7CisgICAgICAgICAgICAgICAgaW50MzJfdCByYyA9IHBtZS0+cHJvY2Vzc0V2dChRQ0FNRVJBX1NNX0VWVF9FVlRfSU5URVJOQUwsIHBheWxvYWQpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBMT0dXKCJwcm9jZXNzRXZ0IGhkciB1cGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIGZyZWUocGF5bG9hZCk7CisgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBoZHIgdXBkYXRlIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2FzZF9kZWNpc2lvbl90LCBjYW1fYXNkX2luZm8sCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0FTRF9TQ0VORV9JTkZPLCBwTWV0YURhdGEpIHsKKyAgICAgICAgcWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICpwYXlsb2FkID0KKyAgICAgICAgICAgIChxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKiltYWxsb2Moc2l6ZW9mKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCkpOworICAgICAgICBpZiAoTlVMTCAhPSBwYXlsb2FkKSB7CisgICAgICAgICAgICBtZW1zZXQocGF5bG9hZCwgMCwgc2l6ZW9mKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCkpOworICAgICAgICAgICAgcGF5bG9hZC0+ZXZ0X3R5cGUgPSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9BU0RfVVBEQVRFOworICAgICAgICAgICAgcGF5bG9hZC0+YXNkX2RhdGEgPSAoY2FtX2FzZF9kZWNpc2lvbl90KSpjYW1fYXNkX2luZm87CisgICAgICAgICAgICBpbnQzMl90IHJjID0gcG1lLT5wcm9jZXNzRXZ0KFFDQU1FUkFfU01fRVZUX0VWVF9JTlRFUk5BTCwgcGF5bG9hZCk7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJwcm9jZXNzRXZ0IGFzZF91cGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgZnJlZShwYXlsb2FkKTsKKyAgICAgICAgICAgICAgICBwYXlsb2FkID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgYXNkX3VwZGF0ZSBxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9hd2JfcGFyYW1zX3QsIGF3Yl9wYXJhbXMsIENBTV9JTlRGX01FVEFfQVdCX0lORk8sIHBNZXRhRGF0YSkgeworICAgICAgICBMT0dIKCIsIG1ldGFkYXRhIGZvciBhd2IgcGFyYW1zLiIpOworICAgICAgICBxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKnBheWxvYWQgPQorICAgICAgICAgICAgICAgIChxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKikKKyAgICAgICAgICAgICAgICBtYWxsb2Moc2l6ZW9mKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCkpOworICAgICAgICBpZiAoTlVMTCAhPSBwYXlsb2FkKSB7CisgICAgICAgICAgICBtZW1zZXQocGF5bG9hZCwgMCwgc2l6ZW9mKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCkpOworICAgICAgICAgICAgcGF5bG9hZC0+ZXZ0X3R5cGUgPSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9BV0JfVVBEQVRFOworICAgICAgICAgICAgcGF5bG9hZC0+YXdiX2RhdGEgPSAqYXdiX3BhcmFtczsKKyAgICAgICAgICAgIGludDMyX3QgcmMgPSBwbWUtPnByb2Nlc3NFdnQoUUNBTUVSQV9TTV9FVlRfRVZUX0lOVEVSTkFMLCBwYXlsb2FkKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR1coInByb2Nlc3NFdnQgYXdiX3VwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBmcmVlKHBheWxvYWQpOworICAgICAgICAgICAgICAgIHBheWxvYWQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBhd2JfdXBkYXRlIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCIpOworICAgICAgICB9CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIGZsYXNoX21vZGUsIENBTV9JTlRGX01FVEFfRkxBU0hfTU9ERSwgcE1ldGFEYXRhKSB7CisgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuc2Vuc29yX3BhcmFtcy5mbGFzaF9tb2RlID0gKGNhbV9mbGFzaF9tb2RlX3QpKmZsYXNoX21vZGU7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgZmxhc2hfc3RhdGUsIENBTV9JTlRGX01FVEFfRkxBU0hfU1RBVEUsIHBNZXRhRGF0YSkgeworICAgICAgICBwbWUtPm1FeGlmUGFyYW1zLnNlbnNvcl9wYXJhbXMuZmxhc2hfc3RhdGUgPSAoY2FtX2ZsYXNoX3N0YXRlX3QpICpmbGFzaF9zdGF0ZTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShmbG9hdCwgYXBlcnR1cmVfdmFsdWUsIENBTV9JTlRGX01FVEFfTEVOU19BUEVSVFVSRSwgcE1ldGFEYXRhKSB7CisgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuc2Vuc29yX3BhcmFtcy5hcGVydHVyZV92YWx1ZSA9ICphcGVydHVyZV92YWx1ZTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fM2FfcGFyYW1zX3QsIGFlX3BhcmFtcywgQ0FNX0lOVEZfTUVUQV9BRUNfSU5GTywgcE1ldGFEYXRhKSB7CisgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuY2FtXzNhX3BhcmFtcyA9ICphZV9wYXJhbXM7CisgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuY2FtXzNhX3BhcmFtc192YWxpZCA9IFRSVUU7CisgICAgICAgIHBtZS0+bUZsYXNoTmVlZGVkID0gYWVfcGFyYW1zLT5mbGFzaF9uZWVkZWQ7CisgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuY2FtXzNhX3BhcmFtcy5icmlnaHRuZXNzID0gKGZsb2F0KSBwbWUtPm1QYXJhbWV0ZXJzLmdldEJyaWdodG5lc3MoKTsKKyAgICAgICAgcWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICpwYXlsb2FkID0KKyAgICAgICAgICAgICAgICAocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICopCisgICAgICAgICAgICAgICAgbWFsbG9jKHNpemVvZihxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QpKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gcGF5bG9hZCkgeworICAgICAgICAgICAgbWVtc2V0KHBheWxvYWQsIDAsIHNpemVvZihxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QpKTsKKyAgICAgICAgICAgIHBheWxvYWQtPmV2dF90eXBlID0gUUNBTUVSQV9JTlRFUk5BTF9FVlRfQUVfVVBEQVRFOworICAgICAgICAgICAgcGF5bG9hZC0+YWVfZGF0YSA9ICphZV9wYXJhbXM7CisgICAgICAgICAgICBpbnQzMl90IHJjID0gcG1lLT5wcm9jZXNzRXZ0KFFDQU1FUkFfU01fRVZUX0VWVF9JTlRFUk5BTCwgcGF5bG9hZCk7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJwcm9jZXNzRXZ0IGFlX3VwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBmcmVlKHBheWxvYWQpOworICAgICAgICAgICAgICAgIHBheWxvYWQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBhZV91cGRhdGUgcWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCB3Yl9tb2RlLCBDQU1fSU5URl9QQVJNX1dISVRFX0JBTEFOQ0UsIHBNZXRhRGF0YSkgeworICAgICAgICBwbWUtPm1FeGlmUGFyYW1zLmNhbV8zYV9wYXJhbXMud2JfbW9kZSA9IChjYW1fd2JfbW9kZV90eXBlKSAqd2JfbW9kZTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fc2Vuc29yX3BhcmFtc190LCBzZW5zb3JfcGFyYW1zLCBDQU1fSU5URl9NRVRBX1NFTlNPUl9JTkZPLCBwTWV0YURhdGEpIHsKKyAgICAgICAgcG1lLT5tRXhpZlBhcmFtcy5zZW5zb3JfcGFyYW1zID0gKnNlbnNvcl9wYXJhbXM7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2FlX2V4aWZfZGVidWdfdCwgYWVfZXhpZl9kZWJ1Z19wYXJhbXMsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQUUsIHBNZXRhRGF0YSkgeworICAgICAgICBpZiAocG1lLT5tRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5hZV9kZWJ1Z19wYXJhbXMgPSAqYWVfZXhpZl9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICBwbWUtPm1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+YWVfZGVidWdfcGFyYW1zX3ZhbGlkID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9hd2JfZXhpZl9kZWJ1Z190LCBhd2JfZXhpZl9kZWJ1Z19wYXJhbXMsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQVdCLCBwTWV0YURhdGEpIHsKKyAgICAgICAgaWYgKHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zKSB7CisgICAgICAgICAgICBwbWUtPm1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+YXdiX2RlYnVnX3BhcmFtcyA9ICphd2JfZXhpZl9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICBwbWUtPm1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+YXdiX2RlYnVnX3BhcmFtc192YWxpZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fYWZfZXhpZl9kZWJ1Z190LCBhZl9leGlmX2RlYnVnX3BhcmFtcywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR19BRiwgcE1ldGFEYXRhKSB7CisgICAgICAgIGlmIChwbWUtPm1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcykgeworICAgICAgICAgICAgcG1lLT5tRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMtPmFmX2RlYnVnX3BhcmFtcyA9ICphZl9leGlmX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5hZl9kZWJ1Z19wYXJhbXNfdmFsaWQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2FzZF9leGlmX2RlYnVnX3QsIGFzZF9leGlmX2RlYnVnX3BhcmFtcywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR19BU0QsIHBNZXRhRGF0YSkgeworICAgICAgICBpZiAocG1lLT5tRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5hc2RfZGVidWdfcGFyYW1zID0gKmFzZF9leGlmX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5hc2RfZGVidWdfcGFyYW1zX3ZhbGlkID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9zdGF0c19idWZmZXJfZXhpZl9kZWJ1Z190LCBzdGF0c19leGlmX2RlYnVnX3BhcmFtcywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR19TVEFUUywgcE1ldGFEYXRhKSB7CisgICAgICAgIGlmIChwbWUtPm1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcykgeworICAgICAgICAgICAgcG1lLT5tRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMtPnN0YXRzX2RlYnVnX3BhcmFtcyA9ICpzdGF0c19leGlmX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5zdGF0c19kZWJ1Z19wYXJhbXNfdmFsaWQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2Jlc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdCwgYmVzdGF0c19leGlmX2RlYnVnX3BhcmFtcywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR19CRVNUQVRTLCBwTWV0YURhdGEpIHsKKyAgICAgICAgaWYgKHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zKSB7CisgICAgICAgICAgICBwbWUtPm1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+YmVzdGF0c19kZWJ1Z19wYXJhbXMgPSAqYmVzdGF0c19leGlmX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5iZXN0YXRzX2RlYnVnX3BhcmFtc192YWxpZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fYmhpc3RfYnVmZmVyX2V4aWZfZGVidWdfdCwgYmhpc3RfZXhpZl9kZWJ1Z19wYXJhbXMsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQkhJU1QsIHBNZXRhRGF0YSkgeworICAgICAgICBpZiAocG1lLT5tRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5iaGlzdF9kZWJ1Z19wYXJhbXMgPSAqYmhpc3RfZXhpZl9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICBwbWUtPm1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+Ymhpc3RfZGVidWdfcGFyYW1zX3ZhbGlkID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9xM2FfdHVuaW5nX2luZm9fdCwgcTNhX3R1bmluZ19leGlmX2RlYnVnX3BhcmFtcywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR18zQV9UVU5JTkcsIHBNZXRhRGF0YSkgeworICAgICAgICBpZiAocG1lLT5tRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgICAgIHBtZS0+bUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5xM2FfdHVuaW5nX2RlYnVnX3BhcmFtcyA9ICpxM2FfdHVuaW5nX2V4aWZfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgcG1lLT5tRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMtPnEzYV90dW5pbmdfZGVidWdfcGFyYW1zX3ZhbGlkID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCBsZWRfbW9kZSwgQ0FNX0lOVEZfTUVUQV9MRURfTU9ERV9PVkVSUklERSwgcE1ldGFEYXRhKSB7CisgICAgICAgIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqKQorICAgICAgICAgICAgICAgIG1hbGxvYyhzaXplb2YocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90KSk7CisgICAgICAgIGlmIChOVUxMICE9IHBheWxvYWQpIHsKKyAgICAgICAgICAgIG1lbXNldChwYXlsb2FkLCAwLCBzaXplb2YocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90KSk7CisgICAgICAgICAgICBwYXlsb2FkLT5ldnRfdHlwZSA9IFFDQU1FUkFfSU5URVJOQUxfRVZUX0xFRF9NT0RFX09WRVJSSURFOworICAgICAgICAgICAgcGF5bG9hZC0+bGVkX2RhdGEgPSAoY2FtX2ZsYXNoX21vZGVfdCkqbGVkX21vZGU7CisgICAgICAgICAgICBpbnQzMl90IHJjID0gcG1lLT5wcm9jZXNzRXZ0KFFDQU1FUkFfU01fRVZUX0VWVF9JTlRFUk5BTCwgcGF5bG9hZCk7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJwcm9jZXNzRXZ0IGxlZCBtb2RlIG92ZXJyaWRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIGZyZWUocGF5bG9hZCk7CisgICAgICAgICAgICAgICAgcGF5bG9hZCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIGZvY3VzIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCIpOworICAgICAgICB9CisgICAgfQorCisgICAgY2FtX2VkZ2VfYXBwbGljYXRpb25fdCBlZGdlX2FwcGxpY2F0aW9uOworICAgIG1lbXNldCgmZWRnZV9hcHBsaWNhdGlvbiwgMHgwMCwgc2l6ZW9mKGNhbV9lZGdlX2FwcGxpY2F0aW9uX3QpKTsKKyAgICBlZGdlX2FwcGxpY2F0aW9uLnNoYXJwbmVzcyA9IHBtZS0+bVBhcmFtZXRlcnMuZ2V0U2hhcnBuZXNzKCk7CisgICAgaWYgKGVkZ2VfYXBwbGljYXRpb24uc2hhcnBuZXNzICE9IDApIHsKKyAgICAgICAgZWRnZV9hcHBsaWNhdGlvbi5lZGdlX21vZGUgPSBDQU1fRURHRV9NT0RFX0ZBU1Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZWRnZV9hcHBsaWNhdGlvbi5lZGdlX21vZGUgPSBDQU1fRURHRV9NT0RFX09GRjsKKyAgICB9CisgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChwTWV0YURhdGEsIENBTV9JTlRGX01FVEFfRURHRV9NT0RFLCBlZGdlX2FwcGxpY2F0aW9uKTsKKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9mb2N1c19wb3NfaW5mb190LCBjdXJfcG9zX2luZm8sCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0ZPQ1VTX1BPU0lUSU9OLCBwTWV0YURhdGEpIHsKKyAgICAgICAgcWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICpwYXlsb2FkID0KKyAgICAgICAgICAgIChxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKiltYWxsb2Moc2l6ZW9mKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCkpOworICAgICAgICBpZiAoTlVMTCAhPSBwYXlsb2FkKSB7CisgICAgICAgICAgICBtZW1zZXQocGF5bG9hZCwgMCwgc2l6ZW9mKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCkpOworICAgICAgICAgICAgcGF5bG9hZC0+ZXZ0X3R5cGUgPSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9GT0NVU19QT1NfVVBEQVRFOworICAgICAgICAgICAgcGF5bG9hZC0+Zm9jdXNfcG9zID0gKmN1cl9wb3NfaW5mbzsKKyAgICAgICAgICAgIGludDMyX3QgcmMgPSBwbWUtPnByb2Nlc3NFdnQoUUNBTUVSQV9TTV9FVlRfRVZUX0lOVEVSTkFMLCBwYXlsb2FkKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR1coInByb2Nlc3NFdnQgZm9jdXNfcG9zX3VwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBmcmVlKHBheWxvYWQpOworICAgICAgICAgICAgICAgIHBheWxvYWQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBmb2N1c19wb3NfdXBkYXRlIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBtZS0+bVBhcmFtZXRlcnMuZ2V0TG93TGlnaHRDYXB0dXJlKCkpIHsKKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2xvd19saWdodF9tb2RlX3QsIGxvd19saWdodF9sZXZlbCwKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0xPV19MSUdIVCwgcE1ldGFEYXRhKSB7CisgICAgICAgICAgICBwbWUtPm1QYXJhbWV0ZXJzLnNldExvd0xpZ2h0TGV2ZWwoKmxvd19saWdodF9sZXZlbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fZHluX2ltZ19kYXRhX3QsIGR5bl9pbWdfZGF0YSwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfSU1HX0RZTl9GRUFULCBwTWV0YURhdGEpIHsKKyAgICAgICAgcG1lLT5tUGFyYW1ldGVycy5zZXREeW5hbWljSW1nRGF0YSgqZHluX2ltZ19kYXRhKTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCB0b3VjaF9hZV9zdGF0dXMsIENBTV9JTlRGX01FVEFfVE9VQ0hfQUVfUkVTVUxULCBwTWV0YURhdGEpIHsKKyAgICAgIExPR0QoInRvdWNoX2FlX3N0YXR1czogJWQiLCAqdG91Y2hfYWVfc3RhdHVzKTsKKyAgICB9CisKKyAgICBzdHJlYW0tPmJ1ZkRvbmUoZnJhbWUtPmJ1Zl9pZHgpOworICAgIGZyZWUoc3VwZXJfZnJhbWUpOworCisgICAgTE9HRCgiW0tQSSBQZXJmXSA6IEVORCIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlcHJvY2Vzc19zdHJlYW1fY2Jfcm91dGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBoZWxwZXIgZnVuY3Rpb24gdG8gaGFuZGxlIHJlcHJvY2VzcyBmcmFtZSBmcm9tIHJlcHJvY2VzcyBzdHJlYW0KKyAgICAgICAgICAgICAgICAoYWZ0ZXIgcmVwcm9jZXNzLCBlLmcuLCBaU0wgc25hcHNob3QgZnJhbWUgYWZ0ZXIgV05SIGlmCisgKiAgICAgICAgICAgICAgV05SIGlzIGVuYWJsZWQpCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdXBlcl9mcmFtZSA6IHJlY2VpdmVkIHN1cGVyIGJ1ZmZlcgorICogICBAc3RyZWFtICAgICAgOiBzdHJlYW0gb2JqZWN0CisgKiAgIEB1c2VyZGF0YSAgICA6IHVzZXIgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgOiBOb25lCisgKgorICogTk9URSAgICAgIDogY2FsbGVyIHBhc3NlcyB0aGUgb3duZXJzaGlwIG9mIHN1cGVyX2ZyYW1lLCBpdCdzIG91cgorICogICAgICAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gZnJlZSBzdXBlcl9mcmFtZSBvbmNlIGl0J3MgZG9uZS4gSW4gdGhpcworICogICAgICAgICAgICAgY2FzZSwgcmVwcm9jZXNzZWQgZnJhbWUgbmVlZCB0byBiZSBwYXNzZWQgdG8gcG9zdHByb2Nlc3NvcgorICogICAgICAgICAgICAgZm9yIGpwZWcgZW5jb2RpbmcuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cmVwcm9jZXNzX3N0cmVhbV9jYl9yb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqIHN1cGVyX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqIC8qc3RyZWFtKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlcmRhdGEpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBMT0dIKCJbS1BJIFBlcmZdOiBFIik7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqcG1lID0gKFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKil1c2VyZGF0YTsKKyAgICBpZiAocG1lID09IE5VTEwgfHwKKyAgICAgICAgcG1lLT5tQ2FtZXJhSGFuZGxlID09IE5VTEwgfHwKKyAgICAgICAgcG1lLT5tQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlICE9IHN1cGVyX2ZyYW1lLT5jYW1lcmFfaGFuZGxlKXsKKyAgICAgICAgTE9HRSgiY2FtZXJhIG9iaiBub3QgdmFsaWQiKTsKKyAgICAgICAgLy8gc2ltcGx5IGZyZWUgc3VwZXIgZnJhbWUKKyAgICAgICAgZnJlZShzdXBlcl9mcmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwbWUtPm1fcG9zdHByb2Nlc3Nvci5wcm9jZXNzUFBEYXRhKHN1cGVyX2ZyYW1lKTsKKworICAgIExPR0goIltLUEkgUGVyZl06IFgiKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYWxsYmFja19zdHJlYW1fY2Jfcm91dGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byBwcm9jZXNzIENBTEJBQ0sgc3RyZWFtIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lIHdpbGwgcHJvY2Vzc2VkIGFuZCBzZW50IHRvIGZyYW1ld29yaworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3VwZXJfZnJhbWUgOiByZWNlaXZlZCBzdXBlciBidWZmZXIKKyAqICAgQHN0cmVhbSAgICAgIDogc3RyZWFtIG9iamVjdAorICogICBAdXNlcmRhdGEgICAgOiB1c2VyIGRhdGEgcHRyCisgKgorICogUkVUVVJOICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmNhbGxiYWNrX3N0cmVhbV9jYl9yb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3VwZXJfZnJhbWUsCisgICAgICAgIFFDYW1lcmFTdHJlYW0gKnN0cmVhbSwgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBMT0dIKCJbS1BJIFBlcmZdOiBFIik7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqcG1lID0gKFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKil1c2VyZGF0YTsKKworICAgIGlmIChwbWUgPT0gTlVMTCB8fAorICAgICAgICAgICAgcG1lLT5tQ2FtZXJhSGFuZGxlID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBtZS0+bUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSAhPSBzdXBlcl9mcmFtZS0+Y2FtZXJhX2hhbmRsZSkgeworICAgICAgICBMT0dFKCJjYW1lcmEgb2JqIG5vdCB2YWxpZCIpOworICAgICAgICAvLyBzaW1wbHkgZnJlZSBzdXBlciBmcmFtZQorICAgICAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lID0gc3VwZXJfZnJhbWUtPmJ1ZnNbMF07CisgICAgaWYgKE5VTEwgPT0gZnJhbWUpIHsKKyAgICAgICAgTE9HRSgicHJldmlldyBjYWxsYmFjayBmcmFtZSBpcyBOVUxMIik7CisgICAgICAgIGZyZWUoc3VwZXJfZnJhbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFwbWUtPm5lZWRQcm9jZXNzUHJldmlld0ZyYW1lKGZyYW1lLT5mcmFtZV9pZHgpKSB7CisgICAgICAgIExPR0goInByZXZpZXcgaXMgbm90IHJ1bm5pbmcsIG5vIG5lZWQgdG8gcHJvY2VzcyIpOworICAgICAgICBzdHJlYW0tPmJ1ZkRvbmUoZnJhbWUtPmJ1Zl9pZHgpOworICAgICAgICBmcmVlKHN1cGVyX2ZyYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFFDYW1lcmFNZW1vcnkgKnByZXZpZXdNZW1PYmogPSAoUUNhbWVyYU1lbW9yeSAqKWZyYW1lLT5tZW1faW5mbzsKKyAgICAvLyBIYW5kbGUgcHJldmlldyBkYXRhIGNhbGxiYWNrCisgICAgaWYgKHBtZS0+bURhdGFDYiAhPSBOVUxMICYmCisgICAgICAgICAgICAocG1lLT5tc2dUeXBlRW5hYmxlZFdpdGhMb2NrKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSkgPiAwKSAmJgorICAgICAgICAgICAgKCFwbWUtPm1QYXJhbWV0ZXJzLmlzU2NlbmVTZWxlY3Rpb25FbmFibGVkKCkpKSB7CisgICAgICAgIGludDMyX3QgcmMgPSBwbWUtPnNlbmRQcmV2aWV3Q2FsbGJhY2soc3RyZWFtLCBwcmV2aWV3TWVtT2JqLCBmcmFtZS0+YnVmX2lkeCk7CisgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgTE9HRSgiUHJldmlldyBjYWxsYmFjayB3YXMgbm90IHNlbnQgc3VjY2VzZnVsbHkiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdHJlYW0tPmJ1ZkRvbmUoZnJhbWUtPmJ1Zl9pZHgpOworICAgIGZyZWUoc3VwZXJfZnJhbWUpOworICAgIExPR0goIltLUEkgUGVyZl06IFgiKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkdW1wRnJhbWVUb0ZpbGUKKyAqCisgKiBERVNDUklQVElPTjogaGVscGVyIGZ1bmN0aW9uIHRvIGR1bXAganBlZyBpbnRvIGZpbGUgZm9yIGRlYnVnIHB1cnBvc2UuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgICBAZGF0YSA6IGRhdGEgcHRyCisgKiAgICBAc2l6ZSA6IGxlbmd0aCBvZiBkYXRhIGJ1ZmZlcgorICogICAgQGluZGV4IDogaWRlbnRpZmllciBmb3IgZGF0YQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6ZHVtcEpwZWdUb0ZpbGUoY29uc3Qgdm9pZCAqZGF0YSwKKyAgICAgICAgc2l6ZV90IHNpemUsIHVpbnQzMl90IGluZGV4KQoreworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmR1bXBpbWciLCB2YWx1ZSwgIjAiKTsKKyAgICB1aW50MzJfdCBlbmFibGVkID0gKHVpbnQzMl90KSBhdG9pKHZhbHVlKTsKKyAgICB1aW50MzJfdCBmcm1fbnVtID0gMDsKKyAgICB1aW50MzJfdCBza2lwX21vZGUgPSAwOworCisgICAgY2hhciBidWZbMzJdOworICAgIGNhbV9kaW1lbnNpb25fdCBkaW07CisgICAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworICAgIG1lbXNldCgmZGltLCAwLCBzaXplb2YoZGltKSk7CisKKyAgICBpZigoKGVuYWJsZWQgJiBRQ0FNRVJBX0RVTVBfRlJNX0pQRUcpICYmIGRhdGEpIHx8CisgICAgICAgICgodHJ1ZSA9PSBtX2JJbnRKcGVnRXZ0UGVuZGluZykgJiYgZGF0YSkpIHsKKyAgICAgICAgZnJtX251bSA9ICgoZW5hYmxlZCAmIDB4ZmZmZjAwMDApID4+IDE2KTsKKyAgICAgICAgaWYoZnJtX251bSA9PSAwKSB7CisgICAgICAgICAgICBmcm1fbnVtID0gMTA7IC8vZGVmYXVsdCAxMCBmcmFtZXMKKyAgICAgICAgfQorICAgICAgICBpZihmcm1fbnVtID4gMjU2KSB7CisgICAgICAgICAgICBmcm1fbnVtID0gMjU2OyAvLzI1NiBidWZmZXJzIGN5Y2xlIGFyb3VuZAorICAgICAgICB9CisgICAgICAgIHNraXBfbW9kZSA9ICgoZW5hYmxlZCAmIDB4MDAwMGZmMDApID4+IDgpOworICAgICAgICBpZihza2lwX21vZGUgPT0gMCkgeworICAgICAgICAgICAgc2tpcF9tb2RlID0gMTsgLy9uby1za2lwCisgICAgICAgIH0KKworICAgICAgICBpZiggbUR1bXBTa2lwQ250ICUgc2tpcF9tb2RlID09IDApIHsKKyAgICAgICAgICAgIGlmKChmcm1fbnVtID09IDI1NikgJiYgKG1EdW1wRnJtQ250ID49IGZybV9udW0pKSB7CisgICAgICAgICAgICAgICAgLy8gcmVzZXQgZnJhbWUgY291bnQgaWYgY3ljbGluZworICAgICAgICAgICAgICAgIG1EdW1wRnJtQ250ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtRHVtcEZybUNudCA8PSBmcm1fbnVtKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgUUNBTUVSQV9EVU1QX0ZSTV9MT0NBVElPTiAiJWRfJWQuanBnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wRnJtQ250LCBpbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHRydWUgPT0gbV9iSW50SnBlZ0V2dFBlbmRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybGNweShtX0JhY2tlbmRGaWxlTmFtZSwgYnVmLCBRQ0FNRVJBX01BWF9GSUxFUEFUSF9MRU5HVEgpOworICAgICAgICAgICAgICAgICAgICBtQmFja2VuZEZpbGVTaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgZmlsZV9mZCA9IG9wZW4oYnVmLCBPX1JEV1IgfCBPX0NSRUFULCAwNzc3KTsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZV9mZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3Qgd3JpdHRlbl9sZW4gPSB3cml0ZShmaWxlX2ZkLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgZmNobW9kKGZpbGVfZmQsIFNfSVJVU1IgfCBTX0lXVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgpOworICAgICAgICAgICAgICAgICAgICBMT0dIKCJ3cml0dGVuIG51bWJlciBvZiBieXRlcyAlemRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW5fbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoZmlsZV9mZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiZmFpbCB0byBvcGVuIGZpbGUgZm9yIGltYWdlIGR1bXBpbmciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZhbHNlID09IG1fYkludEpwZWdFdnRQZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1EdW1wRnJtQ250Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1EdW1wU2tpcENudCsrOworICAgIH0KK30KKworCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmR1bXBNZXRhZGF0YVRvRmlsZShRQ2FtZXJhU3RyZWFtICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZSxjaGFyICp0eXBlKQoreworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICB1aW50MzJfdCBmcm1fbnVtID0gMDsKKyAgICBtZXRhZGF0YV9idWZmZXJfdCAqbWV0YWRhdGEgPSAobWV0YWRhdGFfYnVmZmVyX3QgKilmcmFtZS0+YnVmZmVyOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuZHVtcG1ldGFkYXRhIiwgdmFsdWUsICIwIik7CisgICAgdWludDMyX3QgZW5hYmxlZCA9ICh1aW50MzJfdCkgYXRvaSh2YWx1ZSk7CisgICAgaWYgKHN0cmVhbSA9PSBOVUxMKSB7CisgICAgICAgIExPR0goIk5vIG9wIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBkdW1wRnJtQ250ID0gc3RyZWFtLT5tRHVtcE1ldGFGcmFtZTsKKyAgICBpZihlbmFibGVkKXsKKyAgICAgICAgZnJtX251bSA9ICgoZW5hYmxlZCAmIDB4ZmZmZjAwMDApID4+IDE2KTsKKyAgICAgICAgaWYgKGZybV9udW0gPT0gMCkgeworICAgICAgICAgICAgZnJtX251bSA9IDEwOyAvL2RlZmF1bHQgMTAgZnJhbWVzCisgICAgICAgIH0KKyAgICAgICAgaWYgKGZybV9udW0gPiAyNTYpIHsKKyAgICAgICAgICAgIGZybV9udW0gPSAyNTY7IC8vMjU2IGJ1ZmZlcnMgY3ljbGUgYXJvdW5kCisgICAgICAgIH0KKyAgICAgICAgaWYgKChmcm1fbnVtID09IDI1NikgJiYgKGR1bXBGcm1DbnQgPj0gZnJtX251bSkpIHsKKyAgICAgICAgICAgIC8vIHJlc2V0IGZyYW1lIGNvdW50IGlmIGN5Y2xpbmcKKyAgICAgICAgICAgIGR1bXBGcm1DbnQgPSAwOworICAgICAgICB9CisgICAgICAgIExPR0goImR1bXBGcm1DbnQ9ICV1LCBmcm1fbnVtID0gJXUiLCBkdW1wRnJtQ250LCBmcm1fbnVtKTsKKyAgICAgICAgaWYgKGR1bXBGcm1DbnQgPCBmcm1fbnVtKSB7CisgICAgICAgICAgICBjaGFyIHRpbWVCdWZbMTI4XTsKKyAgICAgICAgICAgIGNoYXIgYnVmWzMyXTsKKyAgICAgICAgICAgIG1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgIG1lbXNldCh0aW1lQnVmLCAwLCBzaXplb2YodGltZUJ1ZikpOworICAgICAgICAgICAgdGltZV90IGN1cnJlbnRfdGltZTsKKyAgICAgICAgICAgIHN0cnVjdCB0bSAqIHRpbWVpbmZvOworICAgICAgICAgICAgdGltZSAoJmN1cnJlbnRfdGltZSk7CisgICAgICAgICAgICB0aW1laW5mbyA9IGxvY2FsdGltZSAoJmN1cnJlbnRfdGltZSk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSB0aW1laW5mbykgeworICAgICAgICAgICAgICAgIHN0cmZ0aW1lKHRpbWVCdWYsIHNpemVvZih0aW1lQnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFFDQU1FUkFfRFVNUF9GUk1fTE9DQVRJT04gIiVZJW0lZCVIJU0lUyIsIHRpbWVpbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZzggZmlsZVBhdGgodGltZUJ1Zik7CisgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXVtXyVzXyVkLmJpbiIsIGR1bXBGcm1DbnQsIHR5cGUsIGZyYW1lLT5mcmFtZV9pZHgpOworICAgICAgICAgICAgZmlsZVBhdGguYXBwZW5kKGJ1Zik7CisgICAgICAgICAgICBpbnQgZmlsZV9mZCA9IG9wZW4oZmlsZVBhdGguc3RyaW5nKCksIE9fUkRXUiB8IE9fQ1JFQVQsIDA3NzcpOworICAgICAgICAgICAgaWYgKGZpbGVfZmQgPj0gMCkgeworICAgICAgICAgICAgICAgIHNzaXplX3Qgd3JpdHRlbl9sZW4gPSAwOworICAgICAgICAgICAgICAgIG1ldGFkYXRhLT50dW5pbmdfcGFyYW1zLnR1bmluZ19kYXRhX3ZlcnNpb24gPSBUVU5JTkdfREFUQV9WRVJTSU9OOworICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEgPSAodm9pZCAqKSgodWludDhfdCAqKSZtZXRhZGF0YS0+dHVuaW5nX3BhcmFtcy50dW5pbmdfZGF0YV92ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICB3cml0dGVuX2xlbiArPSB3cml0ZShmaWxlX2ZkLCBkYXRhLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgICAgICBkYXRhID0gKHZvaWQgKikoKHVpbnQ4X3QgKikmbWV0YWRhdGEtPnR1bmluZ19wYXJhbXMudHVuaW5nX3NlbnNvcl9kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIExPR0goInR1bmluZ19zZW5zb3JfZGF0YV9zaXplICVkIiwoaW50KSgqKGludCAqKWRhdGEpKTsKKyAgICAgICAgICAgICAgICB3cml0dGVuX2xlbiArPSB3cml0ZShmaWxlX2ZkLCBkYXRhLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgICAgICBkYXRhID0gKHZvaWQgKikoKHVpbnQ4X3QgKikmbWV0YWRhdGEtPnR1bmluZ19wYXJhbXMudHVuaW5nX3ZmZV9kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIExPR0goInR1bmluZ192ZmVfZGF0YV9zaXplICVkIiwoaW50KSgqKGludCAqKWRhdGEpKTsKKyAgICAgICAgICAgICAgICB3cml0dGVuX2xlbiArPSB3cml0ZShmaWxlX2ZkLCBkYXRhLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgICAgICBkYXRhID0gKHZvaWQgKikoKHVpbnQ4X3QgKikmbWV0YWRhdGEtPnR1bmluZ19wYXJhbXMudHVuaW5nX2NwcF9kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIExPR0goInR1bmluZ19jcHBfZGF0YV9zaXplICVkIiwoaW50KSgqKGludCAqKWRhdGEpKTsKKyAgICAgICAgICAgICAgICB3cml0dGVuX2xlbiArPSB3cml0ZShmaWxlX2ZkLCBkYXRhLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgICAgICBkYXRhID0gKHZvaWQgKikoKHVpbnQ4X3QgKikmbWV0YWRhdGEtPnR1bmluZ19wYXJhbXMudHVuaW5nX2NhY19kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIExPR0goInR1bmluZ19jYWNfZGF0YV9zaXplICVkIiwoaW50KSgqKGludCAqKWRhdGEpKTsKKyAgICAgICAgICAgICAgICB3cml0dGVuX2xlbiArPSB3cml0ZShmaWxlX2ZkLCBkYXRhLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgICAgICBkYXRhID0gKHZvaWQgKikoKHVpbnQ4X3QgKikmbWV0YWRhdGEtPnR1bmluZ19wYXJhbXMudHVuaW5nX2NhY19kYXRhX3NpemUyKTsKKyAgICAgICAgICAgICAgICBMT0dIKCI8IHNrcmFqYWdvID50dW5pbmdfY2FjX2RhdGFfc2l6ZSAlZCIsKGludCkoKihpbnQgKilkYXRhKSk7CisgICAgICAgICAgICAgICAgd3JpdHRlbl9sZW4gKz0gd3JpdGUoZmlsZV9mZCwgZGF0YSwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgICAgICAgICAgc2l6ZV90IHRvdGFsX3NpemUgPSBtZXRhZGF0YS0+dHVuaW5nX3BhcmFtcy50dW5pbmdfc2Vuc29yX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgICAgICBkYXRhID0gKHZvaWQgKikoKHVpbnQ4X3QgKikmbWV0YWRhdGEtPnR1bmluZ19wYXJhbXMuZGF0YSk7CisgICAgICAgICAgICAgICAgd3JpdHRlbl9sZW4gKz0gd3JpdGUoZmlsZV9mZCwgZGF0YSwgdG90YWxfc2l6ZSk7CisgICAgICAgICAgICAgICAgdG90YWxfc2l6ZSA9IG1ldGFkYXRhLT50dW5pbmdfcGFyYW1zLnR1bmluZ192ZmVfZGF0YV9zaXplOworICAgICAgICAgICAgICAgIGRhdGEgPSAodm9pZCAqKSgodWludDhfdCAqKSZtZXRhZGF0YS0+dHVuaW5nX3BhcmFtcy5kYXRhW1RVTklOR19WRkVfREFUQV9PRkZTRVRdKTsKKyAgICAgICAgICAgICAgICB3cml0dGVuX2xlbiArPSB3cml0ZShmaWxlX2ZkLCBkYXRhLCB0b3RhbF9zaXplKTsKKyAgICAgICAgICAgICAgICB0b3RhbF9zaXplID0gbWV0YWRhdGEtPnR1bmluZ19wYXJhbXMudHVuaW5nX2NwcF9kYXRhX3NpemU7CisgICAgICAgICAgICAgICAgZGF0YSA9ICh2b2lkICopKCh1aW50OF90ICopJm1ldGFkYXRhLT50dW5pbmdfcGFyYW1zLmRhdGFbVFVOSU5HX0NQUF9EQVRBX09GRlNFVF0pOworICAgICAgICAgICAgICAgIHdyaXR0ZW5fbGVuICs9IHdyaXRlKGZpbGVfZmQsIGRhdGEsIHRvdGFsX3NpemUpOworICAgICAgICAgICAgICAgIHRvdGFsX3NpemUgPSBtZXRhZGF0YS0+dHVuaW5nX3BhcmFtcy50dW5pbmdfY2FjX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgICAgICBkYXRhID0gKHZvaWQgKikoKHVpbnQ4X3QgKikmbWV0YWRhdGEtPnR1bmluZ19wYXJhbXMuZGF0YVtUVU5JTkdfQ0FDX0RBVEFfT0ZGU0VUXSk7CisgICAgICAgICAgICAgICAgd3JpdHRlbl9sZW4gKz0gd3JpdGUoZmlsZV9mZCwgZGF0YSwgdG90YWxfc2l6ZSk7CisgICAgICAgICAgICAgICAgY2xvc2UoZmlsZV9mZCk7CisgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiZmFpbCB0IG9wZW4gZmlsZSBmb3IgaW1hZ2UgZHVtcGluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVtcEZybUNudCsrOworICAgICAgICB9CisgICAgfQorICAgIHN0cmVhbS0+bUR1bXBNZXRhRnJhbWUgPSBkdW1wRnJtQ250OworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkdW1wRnJhbWVUb0ZpbGUKKyAqCisgKiBERVNDUklQVElPTjogaGVscGVyIGZ1bmN0aW9uIHRvIGR1bXAgZnJhbWUgaW50byBmaWxlIGZvciBkZWJ1ZyBwdXJwb3NlLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICAgQGRhdGEgOiBkYXRhIHB0cgorICogICAgQHNpemUgOiBsZW5ndGggb2YgZGF0YSBidWZmZXIKKyAqICAgIEBpbmRleCA6IGlkZW50aWZpZXIgZm9yIGRhdGEKKyAqICAgIEBkdW1wX3R5cGUgOiB0eXBlIG9mIHRoZSBmcmFtZSB0byBiZSBkdW1wZWQuIE9ubHkgc3VjaAorICogICAgICAgICAgICAgICAgIGR1bXAgdHlwZSBpcyBlbmFibGVkLCB0aGUgZnJhbWUgd2lsbCBiZQorICogICAgICAgICAgICAgICAgIGR1bXBlZCBpbnRvIGEgZmlsZS4KKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmR1bXBGcmFtZVRvRmlsZShRQ2FtZXJhU3RyZWFtICpzdHJlYW0sCisgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lLCB1aW50MzJfdCBkdW1wX3R5cGUsIGNvbnN0IGNoYXIgKm1pc2MpCit7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuZHVtcGltZyIsIHZhbHVlLCAiMCIpOworICAgIHVpbnQzMl90IGVuYWJsZWQgPSAodWludDMyX3QpIGF0b2kodmFsdWUpOworICAgIHVpbnQzMl90IGZybV9udW0gPSAwOworICAgIHVpbnQzMl90IHNraXBfbW9kZSA9IDA7CisKKyAgICBpZiAoTlVMTCA9PSBzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgic3RyZWFtIG9iamVjdCBpcyBudWxsIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50MzJfdCBkdW1wRnJtQ250ID0gc3RyZWFtLT5tRHVtcEZyYW1lOworCisgICAgaWYgKHRydWUgPT0gbV9iSW50UmF3RXZ0UGVuZGluZykgeworICAgICAgICBlbmFibGVkID0gUUNBTUVSQV9EVU1QX0ZSTV9SQVc7CisgICAgfQorCisgICAgaWYoKGVuYWJsZWQgJiBRQ0FNRVJBX0RVTVBfRlJNX01BU0tfQUxMKSkgeworICAgICAgICBpZigoZW5hYmxlZCAmIGR1bXBfdHlwZSkgJiYgc3RyZWFtICYmIGZyYW1lKSB7CisgICAgICAgICAgICBmcm1fbnVtID0gKChlbmFibGVkICYgMHhmZmZmMDAwMCkgPj4gMTYpOworICAgICAgICAgICAgaWYoZnJtX251bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZnJtX251bSA9IDEwOyAvL2RlZmF1bHQgMTAgZnJhbWVzCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihmcm1fbnVtID4gMjU2KSB7CisgICAgICAgICAgICAgICAgZnJtX251bSA9IDI1NjsgLy8yNTYgYnVmZmVycyBjeWNsZSBhcm91bmQKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNraXBfbW9kZSA9ICgoZW5hYmxlZCAmIDB4MDAwMGZmMDApID4+IDgpOworICAgICAgICAgICAgaWYoc2tpcF9tb2RlID09IDApIHsKKyAgICAgICAgICAgICAgICBza2lwX21vZGUgPSAxOyAvL25vLXNraXAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHN0cmVhbS0+bUR1bXBTa2lwQ250ID09IDApCisgICAgICAgICAgICAgICAgc3RyZWFtLT5tRHVtcFNraXBDbnQgPSAxOworCisgICAgICAgICAgICBpZiggc3RyZWFtLT5tRHVtcFNraXBDbnQgJSBza2lwX21vZGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmKChmcm1fbnVtID09IDI1NikgJiYgKGR1bXBGcm1DbnQgPj0gZnJtX251bSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgZnJhbWUgY291bnQgaWYgY3ljbGluZworICAgICAgICAgICAgICAgICAgICBkdW1wRnJtQ250ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGR1bXBGcm1DbnQgPD0gZnJtX251bSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGJ1ZlszMl07CisgICAgICAgICAgICAgICAgICAgIGNoYXIgdGltZUJ1ZlsxMjhdOworICAgICAgICAgICAgICAgICAgICB0aW1lX3QgY3VycmVudF90aW1lOworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdG0gKiB0aW1laW5mbzsKKworICAgICAgICAgICAgICAgICAgICBtZW1zZXQodGltZUJ1ZiwgMCwgc2l6ZW9mKHRpbWVCdWYpKTsKKworICAgICAgICAgICAgICAgICAgICB0aW1lICgmY3VycmVudF90aW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZWluZm8gPSBsb2NhbHRpbWUgKCZjdXJyZW50X3RpbWUpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisKKyAgICAgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90IGRpbTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZkaW0sIDAsIHNpemVvZihkaW0pKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXRGcmFtZURpbWVuc2lvbihkaW0pOworCisgICAgICAgICAgICAgICAgICAgIGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3Qgb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJm9mZnNldCwgMCwgc2l6ZW9mKGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXRGcmFtZU9mZnNldChvZmZzZXQpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHRpbWVpbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJmdGltZSh0aW1lQnVmLCBzaXplb2YodGltZUJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDQU1FUkFfRFVNUF9GUk1fTE9DQVRJT04gIiVZJW0lZCVIJU0lUyIsIHRpbWVpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGZpbGVQYXRoKHRpbWVCdWYpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGR1bXBfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFFDQU1FUkFfRFVNUF9GUk1fUFJFVklFVzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWRwXyVkeCVkXyVkLnl1diIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wRnJtQ250LCBkaW0ud2lkdGgsIGRpbS5oZWlnaHQsIGZyYW1lLT5mcmFtZV9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9EVU1QX0ZSTV9USFVNQk5BSUw6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkdF8lZHglZF8lZC55dXYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcEZybUNudCwgZGltLndpZHRoLCBkaW0uaGVpZ2h0LCBmcmFtZS0+ZnJhbWVfaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFFDQU1FUkFfRFVNUF9GUk1fU05BUFNIT1Q6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtUGFyYW1ldGVycy5pc1Bvc3RQcm9jU2NhbGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLmdldFN0cmVhbURpbWVuc2lvbihDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QsIGRpbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5nZXRGcmFtZURpbWVuc2lvbihkaW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWlzYyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZHNfJWR4JWRfJWRfJXMueXV2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wRnJtQ250LCBkaW0ud2lkdGgsIGRpbS5oZWlnaHQsIGZyYW1lLT5mcmFtZV9pZHgsIG1pc2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZHNfJWR4JWRfJWQueXV2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wRnJtQ250LCBkaW0ud2lkdGgsIGRpbS5oZWlnaHQsIGZyYW1lLT5mcmFtZV9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFFDQU1FUkFfRFVNUF9GUk1fSU5QVVRfUkVQUk9DRVNTOgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Z2V0RnJhbWVEaW1lbnNpb24oZGltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWlzYyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZGlyXyVkeCVkXyVkXyVzLnl1diIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcEZybUNudCwgZGltLndpZHRoLCBkaW0uaGVpZ2h0LCBmcmFtZS0+ZnJhbWVfaWR4LCBtaXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWRpcl8lZHglZF8lZC55dXYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBGcm1DbnQsIGRpbS53aWR0aCwgZGltLmhlaWdodCwgZnJhbWUtPmZyYW1lX2lkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9EVU1QX0ZSTV9WSURFTzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWR2XyVkeCVkXyVkLnl1diIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wRnJtQ250LCBkaW0ud2lkdGgsIGRpbS5oZWlnaHQsIGZyYW1lLT5mcmFtZV9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9EVU1QX0ZSTV9SQVc6CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuZ2V0U3RyZWFtRGltZW5zaW9uKENBTV9TVFJFQU1fVFlQRV9SQVcsIGRpbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVkcl8lZHglZF8lZC5yYXciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcEZybUNudCwgZGltLndpZHRoLCBkaW0uaGVpZ2h0LCBmcmFtZS0+ZnJhbWVfaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFFDQU1FUkFfRFVNUF9GUk1fSlBFRzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXRTdHJlYW1EaW1lbnNpb24oQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9ULCBkaW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZGpfJWR4JWRfJWQueXV2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBGcm1DbnQsIGRpbS53aWR0aCwgZGltLmhlaWdodCwgZnJhbWUtPmZyYW1lX2lkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIk5vdCBzdXBwb3J0ZWQgZm9yIGR1bXBpbmcgc3RyZWFtIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aC5hcHBlbmQoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVfZmQgPSBvcGVuKGZpbGVQYXRoLnN0cmluZygpLCBPX1JEV1IgfCBPX0NSRUFULCAwNzc3KTsKKyAgICAgICAgICAgICAgICAgICAgc3NpemVfdCB3cml0dGVuX2xlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2ZkID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEgPSBOVUxMOworCisgICAgICAgICAgICAgICAgICAgICAgICBmY2htb2QoZmlsZV9mZCwgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgb2Zmc2V0Lm51bV9wbGFuZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4ID0gb2Zmc2V0Lm1wW2ldLm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gb2Zmc2V0Lm1wW2ktMV0ubGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQubXBbaV0ubWV0YV9sZW4gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gKHZvaWQgKikoKHVpbnQ4X3QgKilmcmFtZS0+YnVmZmVyICsgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuX2xlbiArPSB3cml0ZShmaWxlX2ZkLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3Qpb2Zmc2V0Lm1wW2ldLm1ldGFfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gKHVpbnQzMl90KW9mZnNldC5tcFtpXS5tZXRhX2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG9mZnNldC5tcFtpXS5oZWlnaHQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gKHZvaWQgKikoKHVpbnQ4X3QgKilmcmFtZS0+YnVmZmVyICsgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuX2xlbiArPSB3cml0ZShmaWxlX2ZkLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3Qpb2Zmc2V0Lm1wW2ldLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gKHVpbnQzMl90KW9mZnNldC5tcFtpXS5zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBMT0dIKCJ3cml0dGVuIG51bWJlciBvZiBieXRlcyAlbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW5fbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGZpbGVfZmQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiZmFpbCB0byBvcGVuIGZpbGUgZm9yIGltYWdlIGR1bXBpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodHJ1ZSA9PSBtX2JJbnRSYXdFdnRQZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJsY3B5KG1fQmFja2VuZEZpbGVOYW1lLCBmaWxlUGF0aC5zdHJpbmcoKSwgUUNBTUVSQV9NQVhfRklMRVBBVEhfTEVOR1RIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CYWNrZW5kRmlsZVNpemUgPSAoc2l6ZV90KXdyaXR0ZW5fbGVuOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZHVtcEZybUNudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtLT5tRHVtcFNraXBDbnQrKzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGR1bXBGcm1DbnQgPSAwOworICAgIH0KKyAgICBzdHJlYW0tPm1EdW1wRnJhbWUgPSBkdW1wRnJtQ250OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGRlYnVnU2hvd1ZpZGVvRlBTCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBmdW5jdGlvbiB0byBsb2cgdmlkZW8gZnJhbWUgRlBTIGZvciBkZWJ1ZyBwdXJwb3NlLgorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpkZWJ1Z1Nob3dWaWRlb0ZQUygpCit7CisgICAgbVZGcmFtZUNvdW50Kys7CisgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgbnNlY3NfdCBkaWZmID0gbm93IC0gbVZMYXN0RnBzVGltZTsKKyAgICBpZiAoZGlmZiA+IG1zMm5zKDI1MCkpIHsKKyAgICAgICAgbVZGcHMgPSAoKChkb3VibGUpKG1WRnJhbWVDb3VudCAtIG1WTGFzdEZyYW1lQ291bnQpKSAqCisgICAgICAgICAgICAgICAgKGRvdWJsZSkoczJucygxKSkpIC8gKGRvdWJsZSlkaWZmOworICAgICAgICBMT0dJKCJbS1BJIFBlcmZdOiBQUk9GSUxFX1ZJREVPX0ZSQU1FU19QRVJfU0VDT05EOiAlLjRmIENhbSBJRCA9ICVkIiwKKyAgICAgICAgICAgICAgICBtVkZwcywgbUNhbWVyYUlkKTsKKyAgICAgICAgbVZMYXN0RnBzVGltZSA9IG5vdzsKKyAgICAgICAgbVZMYXN0RnJhbWVDb3VudCA9IG1WRnJhbWVDb3VudDsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGVidWdTaG93UHJldmlld0ZQUworICoKKyAqIERFU0NSSVBUSU9OOiBoZWxwZXIgZnVuY3Rpb24gdG8gbG9nIHByZXZpZXcgZnJhbWUgRlBTIGZvciBkZWJ1ZyBwdXJwb3NlLgorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpkZWJ1Z1Nob3dQcmV2aWV3RlBTKCkKK3sKKyAgICBtUEZyYW1lQ291bnQrKzsKKyAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBuc2Vjc190IGRpZmYgPSBub3cgLSBtUExhc3RGcHNUaW1lOworICAgIGlmIChkaWZmID4gbXMybnMoMjUwKSkgeworICAgICAgICBtUEZwcyA9ICgoKGRvdWJsZSkobVBGcmFtZUNvdW50IC0gbVBMYXN0RnJhbWVDb3VudCkpICoKKyAgICAgICAgICAgICAgICAoZG91YmxlKShzMm5zKDEpKSkgLyAoZG91YmxlKWRpZmY7CisgICAgICAgIExPR0koIltLUEkgUGVyZl06IFBST0ZJTEVfUFJFVklFV19GUkFNRVNfUEVSX1NFQ09ORCA6ICUuNGYgQ2FtIElEID0gJWQiLAorICAgICAgICAgICAgICAgICBtUEZwcywgbUNhbWVyYUlkKTsKKyAgICAgICAgbVBMYXN0RnBzVGltZSA9IG5vdzsKKyAgICAgICAgbVBMYXN0RnJhbWVDb3VudCA9IG1QRnJhbWVDb3VudDsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZmlsbEZhY2VzRGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBoZWxwZXIgZnVuY3Rpb24gdG8gZmlsbCBpbiBmYWNlIHJlbGF0ZWQgbWV0YWRhdGEgaW50byBhIHN0cnVjdC4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZhY2VzX2RhdGEgOiBmYWNlIGZlYXR1cmVzIGRhdGEgdG8gYmUgZmlsbGVkCisgKiAgIEBtZXRhZGF0YSAgIDogbWV0YWRhdGEgc3RydWN0dXJlIHRvIHJlYWQgZmFjZSBmZWF0dXJlcyBmcm9tCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpmaWxsRmFjZXNEYXRhKGNhbV9mYWNlc19kYXRhX3QgJmZhY2VzX2RhdGEsCisgICAgICAgIG1ldGFkYXRhX2J1ZmZlcl90ICptZXRhZGF0YSkKK3sKKyAgICBtZW1zZXQoJmZhY2VzX2RhdGEsIDAsIHNpemVvZihjYW1fZmFjZXNfZGF0YV90KSk7CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fZmFjZV9kZXRlY3Rpb25fZGF0YV90LCBwX2RldGVjdGlvbl9kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9GQUNFX0RFVEVDVElPTiwgbWV0YWRhdGEpIHsKKyAgICAgICAgZmFjZXNfZGF0YS5kZXRlY3Rpb25fZGF0YSA9ICpwX2RldGVjdGlvbl9kYXRhOworICAgICAgICBpZiAoZmFjZXNfZGF0YS5kZXRlY3Rpb25fZGF0YS5udW1fZmFjZXNfZGV0ZWN0ZWQgPiBNQVhfUk9JKSB7CisgICAgICAgICAgICBmYWNlc19kYXRhLmRldGVjdGlvbl9kYXRhLm51bV9mYWNlc19kZXRlY3RlZCA9IE1BWF9ST0k7CisgICAgICAgIH0KKworICAgICAgICBMT0dIKCJbS1BJIFBlcmZdIFBST0ZJTEVfTlVNQkVSX09GX0ZBQ0VTX0RFVEVDVEVEICVkIiwKKyAgICAgICAgICAgICAgICBmYWNlc19kYXRhLmRldGVjdGlvbl9kYXRhLm51bV9mYWNlc19kZXRlY3RlZCk7CisKKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2ZhY2VfcmVjb2dfZGF0YV90LCBwX3JlY29nX2RhdGEsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9GQUNFX1JFQ09HLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgZmFjZXNfZGF0YS5yZWNvZ192YWxpZCA9IHRydWU7CisgICAgICAgICAgICBmYWNlc19kYXRhLnJlY29nX2RhdGEgPSAqcF9yZWNvZ19kYXRhOworICAgICAgICB9CisKKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2ZhY2VfYmxpbmtfZGF0YV90LCBwX2JsaW5rX2RhdGEsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9GQUNFX0JMSU5LLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgZmFjZXNfZGF0YS5ibGlua192YWxpZCA9IHRydWU7CisgICAgICAgICAgICBmYWNlc19kYXRhLmJsaW5rX2RhdGEgPSAqcF9ibGlua19kYXRhOworICAgICAgICB9CisKKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2ZhY2VfZ2F6ZV9kYXRhX3QsIHBfZ2F6ZV9kYXRhLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRkFDRV9HQVpFLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgZmFjZXNfZGF0YS5nYXplX3ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIGZhY2VzX2RhdGEuZ2F6ZV9kYXRhID0gKnBfZ2F6ZV9kYXRhOworICAgICAgICB9CisKKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2ZhY2Vfc21pbGVfZGF0YV90LCBwX3NtaWxlX2RhdGEsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9GQUNFX1NNSUxFLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgZmFjZXNfZGF0YS5zbWlsZV92YWxpZCA9IHRydWU7CisgICAgICAgICAgICBmYWNlc19kYXRhLnNtaWxlX2RhdGEgPSAqcF9zbWlsZV9kYXRhOworICAgICAgICB9CisKKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2ZhY2VfbGFuZG1hcmtzX2RhdGFfdCwgcF9sYW5kbWFya3MsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9GQUNFX0xBTkRNQVJLLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgZmFjZXNfZGF0YS5sYW5kbWFya192YWxpZCA9IHRydWU7CisgICAgICAgICAgICBmYWNlc19kYXRhLmxhbmRtYXJrX2RhdGEgPSAqcF9sYW5kbWFya3M7CisgICAgICAgIH0KKworICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fZmFjZV9jb250b3VyX2RhdGFfdCwgcF9jb250b3VyLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRkFDRV9DT05UT1VSLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgZmFjZXNfZGF0YS5jb250b3VyX3ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgIGZhY2VzX2RhdGEuY29udG91cl9kYXRhID0gKnBfY29udG91cjsKKyAgICAgICAgfQorICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYUNiTm90aWZpZXIKKyAqCisgKiBERVNDUklQVElPTjogRGVzdHJ1Y3RvciBmb3IgZXhpdGluZyB0aGUgY2FsbGJhY2sgY29udGV4dC4KKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFDYk5vdGlmaWVyOjp+UUNhbWVyYUNiTm90aWZpZXIoKQoreworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGV4aXQKKyAqCisgKiBERVNDUklQVElPTjogZXhpdCBub3RpZnkgdGhyZWFkLgorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhQ2JOb3RpZmllcjo6ZXhpdCgpCit7CisgICAgbUFjdGl2ZSA9IGZhbHNlOworICAgIG1Qcm9jVGguZXhpdCgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbGVhc2VOb3RpZmljYXRpb25zCisgKgorICogREVTQ1JJUFRJT046IGNhbGxiYWNrIGZvciByZWxlYXNpbmcgZGF0YSBzdG9yZWQgaW4gdGhlIGNhbGxiYWNrIHF1ZXVlLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGF0YSAgICAgIDogZGF0YSB0byBiZSByZWxlYXNlZAorICogICBAdXNlcl9kYXRhIDogY29udGV4dCBkYXRhCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhQ2JOb3RpZmllcjo6cmVsZWFzZU5vdGlmaWNhdGlvbnModm9pZCAqZGF0YSwgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90ICphcmcgPSAoIHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90ICogKSBkYXRhOworCisgICAgaWYgKCAoIE5VTEwgIT0gYXJnICkgJiYgKCBOVUxMICE9IHVzZXJfZGF0YSApICkgeworICAgICAgICBpZiAoIGFyZy0+cmVsZWFzZV9jYiApIHsKKyAgICAgICAgICAgIGFyZy0+cmVsZWFzZV9jYihhcmctPnVzZXJfZGF0YSwgYXJnLT5jb29raWUsIEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbWF0Y2hTbmFwc2hvdE5vdGlmaWNhdGlvbnMKKyAqCisgKiBERVNDUklQVElPTjogbWF0Y2hlcyBzbmFwc2hvdCBkYXRhIGNhbGxiYWNrcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGF0YSAgICAgIDogZGF0YSB0byBtYXRjaAorICogICBAdXNlcl9kYXRhIDogY29udGV4dCBkYXRhCisgKgorICogUkVUVVJOICAgICA6IGJvb2wgbWF0Y2gKKyAqICAgICAgICAgICAgICB0cnVlIC0gbWF0Y2ggZm91bmQKKyAqICAgICAgICAgICAgICBmYWxzZS0gbWF0Y2ggbm90IGZvdW5kCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYUNiTm90aWZpZXI6Om1hdGNoU25hcHNob3ROb3RpZmljYXRpb25zKHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICovKnVzZXJfZGF0YSovKQoreworICAgIHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90ICphcmcgPSAoIHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90ICogKSBkYXRhOworICAgIGlmICggTlVMTCAhPSBhcmcgKSB7CisgICAgICAgIGlmICggUUNBTUVSQV9EQVRBX1NOQVBTSE9UX0NBTExCQUNLID09IGFyZy0+Y2JfdHlwZSApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1hdGNoUHJldmlld05vdGlmaWNhdGlvbnMKKyAqCisgKiBERVNDUklQVElPTjogbWF0Y2hlcyBwcmV2aWV3IGRhdGEgY2FsbGJhY2tzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkYXRhICAgICAgOiBkYXRhIHRvIG1hdGNoCisgKiAgIEB1c2VyX2RhdGEgOiBjb250ZXh0IGRhdGEKKyAqCisgKiBSRVRVUk4gICAgIDogYm9vbCBtYXRjaAorICogICAgICAgICAgICAgIHRydWUgLSBtYXRjaCBmb3VuZAorICogICAgICAgICAgICAgIGZhbHNlLSBtYXRjaCBub3QgZm91bmQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhQ2JOb3RpZmllcjo6bWF0Y2hQcmV2aWV3Tm90aWZpY2F0aW9ucyh2b2lkICpkYXRhLAorICAgICAgICB2b2lkICovKnVzZXJfZGF0YSovKQoreworICAgIHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90ICphcmcgPSAoIHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90ICogKSBkYXRhOworICAgIGlmIChOVUxMICE9IGFyZykgeworICAgICAgICBpZiAoKFFDQU1FUkFfREFUQV9DQUxMQkFDSyA9PSBhcmctPmNiX3R5cGUpICYmCisgICAgICAgICAgICAgICAgKENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSA9PSBhcmctPm1zZ190eXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbWF0Y2hUaW1lc3RhbXBOb3RpZmljYXRpb25zCisgKgorICogREVTQ1JJUFRJT046IG1hdGNoZXMgdGltZXN0YW1wIGRhdGEgY2FsbGJhY2tzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkYXRhICAgICAgOiBkYXRhIHRvIG1hdGNoCisgKiAgIEB1c2VyX2RhdGEgOiBjb250ZXh0IGRhdGEKKyAqCisgKiBSRVRVUk4gICAgIDogYm9vbCBtYXRjaAorICogICAgICAgICAgICAgIHRydWUgLSBtYXRjaCBmb3VuZAorICogICAgICAgICAgICAgIGZhbHNlLSBtYXRjaCBub3QgZm91bmQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhQ2JOb3RpZmllcjo6bWF0Y2hUaW1lc3RhbXBOb3RpZmljYXRpb25zKHZvaWQgKmRhdGEsCisgICAgICAgIHZvaWQgKi8qdXNlcl9kYXRhKi8pCit7CisgICAgcWNhbWVyYV9jYWxsYmFja19hcmdtX3QgKmFyZyA9ICggcWNhbWVyYV9jYWxsYmFja19hcmdtX3QgKiApIGRhdGE7CisgICAgaWYgKE5VTEwgIT0gYXJnKSB7CisgICAgICAgIGlmICgoUUNBTUVSQV9EQVRBX1RJTUVTVEFNUF9DQUxMQkFDSyA9PSBhcmctPmNiX3R5cGUpICYmCisgICAgICAgICAgICAgICAgKENBTUVSQV9NU0dfVklERU9fRlJBTUUgPT0gYXJnLT5tc2dfdHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNiTm90aWZ5Um91dGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBjYWxsYmFjayB0aHJlYWQgd2hpY2ggaW50ZXJmYWNlcyB3aXRoIHRoZSB1cHBlciBsYXllcnMKKyAqICAgICAgICAgICAgICBnaXZlbiBpbnB1dCBjb21tYW5kcy4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRhdGEgICAgOiBjb250ZXh0IGRhdGEKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkICogUUNhbWVyYUNiTm90aWZpZXI6OmNiTm90aWZ5Um91dGluZSh2b2lkICogZGF0YSkKK3sKKyAgICBpbnQgcnVubmluZyA9IDE7CisgICAgaW50IHJldDsKKyAgICBRQ2FtZXJhQ2JOb3RpZmllciAqcG1lID0gKFFDYW1lcmFDYk5vdGlmaWVyICopZGF0YTsKKyAgICBRQ2FtZXJhQ21kVGhyZWFkICpjbWRUaHJlYWQgPSAmcG1lLT5tUHJvY1RoOworICAgIGNtZFRocmVhZC0+c2V0TmFtZSgiQ0FNX2NiTm90aWZ5Iik7CisgICAgdWludDhfdCBpc1NuYXBzaG90QWN0aXZlID0gRkFMU0U7CisgICAgYm9vbCBsb25nU2hvdEVuYWJsZWQgPSBmYWxzZTsKKyAgICB1aW50MzJfdCBudW1PZlNuYXBzaG90RXhwZWN0ZWQgPSAwOworICAgIHVpbnQzMl90IG51bU9mU25hcHNob3RSY3ZkID0gMDsKKyAgICBpbnQzMl90IGNiU3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBMT0dEKCJFIik7CisgICAgZG8geworICAgICAgICBkbyB7CisgICAgICAgICAgICByZXQgPSBjYW1fc2VtX3dhaXQoJmNtZFRocmVhZC0+Y21kX3NlbSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDAgJiYgZXJybm8gIT0gRUlOVkFMKSB7CisgICAgICAgICAgICAgICAgTE9HRCgiY2FtX3NlbV93YWl0IGVycm9yICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHJldCAhPSAwKTsKKworICAgICAgICBjYW1lcmFfY21kX3R5cGVfdCBjbWQgPSBjbWRUaHJlYWQtPmdldENtZCgpOworICAgICAgICBMT0dEKCJnZXQgY21kICVkIiwgY21kKTsKKyAgICAgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1RZUEVfU1RBUlRfREFUQV9QUk9DOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlzU25hcHNob3RBY3RpdmUgPSBUUlVFOworICAgICAgICAgICAgICAgIG51bU9mU25hcHNob3RFeHBlY3RlZCA9IHBtZS0+bVBhcmVudC0+bnVtT2ZTbmFwc2hvdHNFeHBlY3RlZCgpOworICAgICAgICAgICAgICAgIGxvbmdTaG90RW5hYmxlZCA9IHBtZS0+bVBhcmVudC0+aXNMb25nc2hvdEVuYWJsZWQoKTsKKyAgICAgICAgICAgICAgICBMT0dEKCJOdW0gU25hcHNob3RzIEV4cGVjdGVkID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBudW1PZlNuYXBzaG90RXhwZWN0ZWQpOworICAgICAgICAgICAgICAgIG51bU9mU25hcHNob3RSY3ZkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9DTURfVFlQRV9TVE9QX0RBVEFfUFJPQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbWUtPm1EYXRhUS5mbHVzaE5vZGVzKG1hdGNoU25hcHNob3ROb3RpZmljYXRpb25zKTsKKyAgICAgICAgICAgICAgICBpc1NuYXBzaG90QWN0aXZlID0gRkFMU0U7CisKKyAgICAgICAgICAgICAgICBudW1PZlNuYXBzaG90RXhwZWN0ZWQgPSAwOworICAgICAgICAgICAgICAgIG51bU9mU25hcHNob3RSY3ZkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9DTURfVFlQRV9ET19ORVhUX0pPQjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCAqY2IgPQorICAgICAgICAgICAgICAgICAgICAocWNhbWVyYV9jYWxsYmFja19hcmdtX3QgKilwbWUtPm1EYXRhUS5kZXF1ZXVlKCk7CisgICAgICAgICAgICAgICAgY2JTdGF0dXMgPSBOT19FUlJPUjsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBjYikgeworICAgICAgICAgICAgICAgICAgICBMT0dEKCJjYiB0eXBlICVkIHJlY2VpdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLT5jYl90eXBlKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocG1lLT5tUGFyZW50LT5tc2dUeXBlRW5hYmxlZFdpdGhMb2NrKGNiLT5tc2dfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY2ItPmNiX3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9OT1RJRllfQ0FMTEJBQ0s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ItPm1zZ190eXBlID09IENBTUVSQV9NU0dfRk9DVVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtQSV9BVFJBQ0VfSU5UKCJDYW1lcmE6QXV0b0ZvY3VzIiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dIKCJbS1BJIFBlcmZdIDogUFJPRklMRV9TRU5ESU5HX0ZPQ1VTX0VWVF9UTyBBUFAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG1lLT5tTm90aWZ5Q2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+bU5vdGlmeUNiKGNiLT5tc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPmV4dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLT5leHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPm1DYWxsYmFja0Nvb2tpZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dXKCJub3RpZnkgY2FsbGJhY2sgbm90IHNldCEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ItPnJlbGVhc2VfY2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLT5yZWxlYXNlX2NiKGNiLT51c2VyX2RhdGEsIGNiLT5jb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9EQVRBX0NBTExCQUNLOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBtZS0+bURhdGFDYikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tRGF0YUNiKGNiLT5tc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi0+aW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPm1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+bUNhbGxiYWNrQ29va2llKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR1coImRhdGEgY2FsbGJhY2sgbm90IHNldCEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ItPnJlbGVhc2VfY2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLT5yZWxlYXNlX2NiKGNiLT51c2VyX2RhdGEsIGNiLT5jb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9EQVRBX1RJTUVTVEFNUF9DQUxMQkFDSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBtZS0+bURhdGFDYlRpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tRGF0YUNiVGltZXN0YW1wKGNiLT50aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPm1zZ190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLT5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPm1DYWxsYmFja0Nvb2tpZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJUaW1lc3RhbXAgZGF0YSBjYWxsYmFjayBub3Qgc2V0ISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYi0+cmVsZWFzZV9jYikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPnJlbGVhc2VfY2IoY2ItPnVzZXJfZGF0YSwgY2ItPmNvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0RBVEFfU05BUFNIT1RfQ0FMTEJBQ0s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVFJVRSA9PSBpc1NuYXBzaG90QWN0aXZlICYmIHBtZS0+bURhdGFDYiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9uZ1Nob3RFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtT2ZTbmFwc2hvdFJjdmQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dJKCJOdW0gU25hcHNob3RzIFJlY2VpdmVkID0gJWQgRXhwZWN0ZWQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1PZlNuYXBzaG90UmN2ZCwgbnVtT2ZTbmFwc2hvdEV4cGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtT2ZTbmFwc2hvdEV4cGVjdGVkID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudW1PZlNuYXBzaG90RXhwZWN0ZWQgPT0gbnVtT2ZTbmFwc2hvdFJjdmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0koIlJlY2VpdmVkIGFsbCBzbmFwc2hvdHMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IEhXSSB0aGF0IHNuYXBzaG90IGlzIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tUGFyZW50LT5wcm9jZXNzU3luY0V2dChRQ0FNRVJBX1NNX0VWVF9TTkFQU0hPVF9ET05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbWUtPm1KcGVnQ2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dJKCJDYWxsaW5nIEpQRUcgQ2FsbGJhY2shISBmb3IgY2FtZXJhICVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGVhc2VfZGF0YSAlcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVfaWR4ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPm1QYXJlbnQtPmdldENhbWVyYUlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi0+dXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPmZyYW1lX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPm1KcGVnQ2IoY2ItPm1zZ190eXBlLCBjYi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLT5pbmRleCwgY2ItPm1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tSnBlZ0NhbGxiYWNrQ29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPmZyYW1lX2luZGV4LCBjYi0+cmVsZWFzZV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLT5jb29raWUsIGNiLT51c2VyX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY2FzZSBvZiBub24tbnVsbCBKcGVnIGNiIHdlIHRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3duZXJzaGlwIG9mIGJ1ZmZlciB0byBtdXhlci4gaGVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlX2NiIHNob3VsZCBub3QgYmUgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXV4ZXIgd2lsbCByZWxlYXNlIGFmdGVyIGl0cyBkb25lIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzaW5nIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihwbWUtPm1EYXRhQ2IpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+bURhdGFDYihjYi0+bXNnX3R5cGUsIGNiLT5kYXRhLCBjYi0+aW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi0+bWV0YWRhdGEsIHBtZS0+bUNhbGxiYWNrQ29va2llKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ItPnJlbGVhc2VfY2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ItPnJlbGVhc2VfY2IoY2ItPnVzZXJfZGF0YSwgY2ItPmNvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYlN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImludmFsaWQgY2IgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi0+Y2JfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ItPnJlbGVhc2VfY2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLT5yZWxlYXNlX2NiKGNiLT51c2VyX2RhdGEsIGNiLT5jb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dXKCJjYiBtZXNzYWdlIHR5cGUgJWQgbm90IGVuYWJsZWQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYi0+bXNnX3R5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgY2JTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYi0+cmVsZWFzZV9jYikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLT5yZWxlYXNlX2NiKGNiLT51c2VyX2RhdGEsIGNiLT5jb29raWUsIGNiU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2I7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVygiaW52YWxpZCBjYiB0eXBlIHBhc3NlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9DTURfVFlQRV9FWElUOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSAwOworICAgICAgICAgICAgICAgIHBtZS0+bURhdGFRLmZsdXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAocnVubmluZyk7CisgICAgTE9HRCgiWCIpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbm90aWZ5Q2FsbGJhY2sKKyAqCisgKiBERVNDUklQVElPTjogRW5xdWV1cyBwZW5kaW5nIGNhbGxiYWNrIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSB1cHBlciBsYXllcnMuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYkFyZ3MgIDogY2FsbGJhY2sgYXJndW1lbnRzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhQ2JOb3RpZmllcjo6bm90aWZ5Q2FsbGJhY2socWNhbWVyYV9jYWxsYmFja19hcmdtX3QgJmNiQXJncykKK3sKKyAgICBpZiAoIW1BY3RpdmUpIHsKKyAgICAgICAgTE9HRSgibm90aWZ5IHRocmVhZCBpcyBub3QgYWN0aXZlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90ICpjYkFyZyA9IG5ldyBxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCgpOworICAgIGlmIChOVUxMID09IGNiQXJnKSB7CisgICAgICAgIExPR0UoIm5vIG1lbSBmb3IgcWNhbWVyYV9jYWxsYmFja19hcmdtX3QiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KGNiQXJnLCAwLCBzaXplb2YocWNhbWVyYV9jYWxsYmFja19hcmdtX3QpKTsKKyAgICAqY2JBcmcgPSBjYkFyZ3M7CisKKyAgICBpZiAobURhdGFRLmVucXVldWUoKHZvaWQgKiljYkFyZykpIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9jVGguc2VuZENtZChDQU1FUkFfQ01EX1RZUEVfRE9fTkVYVF9KT0IsIEZBTFNFLCBGQUxTRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgYWRkaW5nIGNiIGRhdGEgaW50byBxdWV1ZSIpOworICAgICAgICBkZWxldGUgY2JBcmc7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRDYWxsYmFja3MKKyAqCisgKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucywgd2hpY2ggd291bGQgYmUgdXNlZCBmb3IKKyAqICAgICAgICAgICAgICBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVwcGVyIGxheWVycyBhbmQgbGF1bmNoZXMgdGhlIGNhbGxiYWNrCisgKiAgICAgICAgICAgICAgY29udGV4dCBpbiB3aGljaCB0aGUgY2FsbGJhY2tzIHdpbGwgb2NjdXIuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBub3RpZnlDYiAgICAgICAgICA6IG5vdGlmaWNhdGlvbiBjYWxsYmFjaworICogICBAZGF0YUNiICAgICAgICAgICAgOiBkYXRhIGNhbGxiYWNrCisgKiAgIEBkYXRhQ2JUaW1lc3RhbXAgICA6IGRhdGEgd2l0aCB0aW1lc3RhbXAgY2FsbGJhY2sKKyAqICAgQGNhbGxiYWNrQ29va2llICAgIDogY2FsbGJhY2sgY29udGV4dCBkYXRhCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhQ2JOb3RpZmllcjo6c2V0Q2FsbGJhY2tzKGNhbWVyYV9ub3RpZnlfY2FsbGJhY2sgbm90aWZ5Q2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2RhdGFfY2FsbGJhY2sgZGF0YUNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9kYXRhX3RpbWVzdGFtcF9jYWxsYmFjayBkYXRhQ2JUaW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2FsbGJhY2tDb29raWUpCit7CisgICAgaWYgKCAoIE5VTEwgPT0gbU5vdGlmeUNiICkgJiYKKyAgICAgICAgICggTlVMTCA9PSBtRGF0YUNiICkgJiYKKyAgICAgICAgICggTlVMTCA9PSBtRGF0YUNiVGltZXN0YW1wICkgJiYKKyAgICAgICAgICggTlVMTCA9PSBtQ2FsbGJhY2tDb29raWUgKSApIHsKKyAgICAgICAgbU5vdGlmeUNiID0gbm90aWZ5Q2I7CisgICAgICAgIG1EYXRhQ2IgPSBkYXRhQ2I7CisgICAgICAgIG1EYXRhQ2JUaW1lc3RhbXAgPSBkYXRhQ2JUaW1lc3RhbXA7CisgICAgICAgIG1DYWxsYmFja0Nvb2tpZSA9IGNhbGxiYWNrQ29va2llOworICAgICAgICBtQWN0aXZlID0gdHJ1ZTsKKyAgICAgICAgbVByb2NUaC5sYXVuY2goY2JOb3RpZnlSb3V0aW5lLCB0aGlzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJDYW1lcmEgY2FsbGJhY2sgbm90aWZpZXIgYWxyZWFkeSBpbml0aWFsaXplZCEiKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0SnBlZ0NhbGxCYWNrcworICoKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplcyB0aGUgSlBFRyBjYWxsYmFjayBmdW5jdGlvbiwgd2hpY2ggd291bGQgYmUgdXNlZCBmb3IKKyAqICAgICAgICAgICAgICBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHVwcGVyIGxheWVycyBhbmQgbGF1bmNoZXMgdGhlIGNhbGxiYWNrCisgKiAgICAgICAgICAgICAgY29udGV4dCBpbiB3aGljaCB0aGUgY2FsbGJhY2tzIHdpbGwgb2NjdXIuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBqcGVnQ2IgICAgICAgICAgOiBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAqICAgQGNhbGxiYWNrQ29va2llICAgIDogY2FsbGJhY2sgY29udGV4dCBkYXRhCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhQ2JOb3RpZmllcjo6c2V0SnBlZ0NhbGxCYWNrcygKKyAgICAgICAganBlZ19kYXRhX2NhbGxiYWNrIGpwZWdDYiwgdm9pZCAqY2FsbGJhY2tDb29raWUpCit7CisgICAgTE9HSCgiU2V0dGluZyBKUEVHIENhbGxiYWNrIG5vdGlmaWVyIik7CisgICAgbUpwZWdDYiAgICAgICAgPSBqcGVnQ2I7CisgICAgbUpwZWdDYWxsYmFja0Nvb2tpZSAgPSBjYWxsYmFja0Nvb2tpZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBmbHVzaFByZXZpZXdOb3RpZmljYXRpb25zCisgKgorICogREVTQ1JJUFRJT046IGZsdXNoIGFsbCBwZW5kaW5nIHByZXZpZXcgbm90aWZpY2F0aW9ucworICogICAgICAgICAgICAgIGZyb20gdGhlIG5vdGlmaWVyIHF1ZXVlCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFDYk5vdGlmaWVyOjpmbHVzaFByZXZpZXdOb3RpZmljYXRpb25zKCkKK3sKKyAgICBpZiAoIW1BY3RpdmUpIHsKKyAgICAgICAgTE9HRSgibm90aWZ5IHRocmVhZCBpcyBub3QgYWN0aXZlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtRGF0YVEuZmx1c2hOb2RlcyhtYXRjaFByZXZpZXdOb3RpZmljYXRpb25zKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZmx1c2hWaWRlb05vdGlmaWNhdGlvbnMKKyAqCisgKiBERVNDUklQVElPTjogZmx1c2ggYWxsIHBlbmRpbmcgdmlkZW8gbm90aWZpY2F0aW9ucworICogICAgICAgICAgICAgIGZyb20gdGhlIG5vdGlmaWVyIHF1ZXVlCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFDYk5vdGlmaWVyOjpmbHVzaFZpZGVvTm90aWZpY2F0aW9ucygpCit7CisgICAgaWYgKCFtQWN0aXZlKSB7CisgICAgICAgIExPR0UoIm5vdGlmeSB0aHJlYWQgaXMgbm90IGFjdGl2ZSIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbURhdGFRLmZsdXNoTm9kZXMobWF0Y2hUaW1lc3RhbXBOb3RpZmljYXRpb25zKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RhcnRTbmFwc2hvdHMKKyAqCisgKiBERVNDUklQVElPTjogRW5hYmxlcyBzbmFwc2hvdCBtb2RlCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFDYk5vdGlmaWVyOjpzdGFydFNuYXBzaG90cygpCit7CisgICAgcmV0dXJuIG1Qcm9jVGguc2VuZENtZChDQU1FUkFfQ01EX1RZUEVfU1RBUlRfREFUQV9QUk9DLCBGQUxTRSwgVFJVRSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RvcFNuYXBzaG90cworICoKKyAqIERFU0NSSVBUSU9OOiBEaXNhYmxlcyBzbmFwc2hvdCBwcm9jZXNzaW5nIG1vZGUKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYUNiTm90aWZpZXI6OnN0b3BTbmFwc2hvdHMoKQoreworICAgIG1Qcm9jVGguc2VuZENtZChDQU1FUkFfQ01EX1RZUEVfU1RPUF9EQVRBX1BST0MsIEZBTFNFLCBUUlVFKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHFjYW1lcmEKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYUFsbG9jYXRvci5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhQWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExNWE2YQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYUFsbG9jYXRvci5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1FDQU1FUkFfQUxMT0NBVE9SX18KKyNkZWZpbmUgX19RQ0FNRVJBX0FMTE9DQVRPUl9fCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKK30KKworbmFtZXNwYWNlIHFjYW1lcmEgeworCitjbGFzcyBRQ2FtZXJhTWVtb3J5OworY2xhc3MgUUNhbWVyYUhlYXBNZW1vcnk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQzMl90ICgqYmdGdW5jdGlvbikgKHZvaWQgKik7CisgICAgdm9pZCogYmdBcmdzOworfSBCYWNrZ3JvdW5kVGFzazsKKworY2xhc3MgUUNhbWVyYUFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgdmlydHVhbCBRQ2FtZXJhTWVtb3J5ICphbGxvY2F0ZVN0cmVhbUJ1ZihjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwKKyAgICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgc3RyaWRlLCBpbnQgc2NhbmxpbmUsIHVpbnQ4X3QgJmJ1ZmZlckNudCkgPSAwOworICAgIHZpcnR1YWwgaW50MzJfdCBhbGxvY2F0ZU1vcmVTdHJlYW1CdWYoUUNhbWVyYU1lbW9yeSAqbWVtX29iaiwKKyAgICAgICAgICAgIHNpemVfdCBzaXplLCB1aW50OF90ICZidWZmZXJDbnQpID0gMDsKKyAgICB2aXJ0dWFsIFFDYW1lcmFIZWFwTWVtb3J5ICphbGxvY2F0ZVN0cmVhbUluZm9CdWYoY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUpID0gMDsKKyAgICB2aXJ0dWFsIFFDYW1lcmFIZWFwTWVtb3J5ICphbGxvY2F0ZU1pc2NCdWYoY2FtX3N0cmVhbV9pbmZvX3QgKnN0cmVhbUluZm8pID0gMDsKKyAgICB2aXJ0dWFsIFFDYW1lcmFNZW1vcnkgKmFsbG9jYXRlU3RyZWFtVXNlckJ1ZihjYW1fc3RyZWFtX2luZm9fdCAqc3RyZWFtSW5mbykgPSAwOworICAgIHZpcnR1YWwgdm9pZCB3YWl0Rm9yRGVmZXJyZWRBbGxvYyhjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSkgPSAwOworICAgIHZpcnR1YWwgdWludDMyX3Qgc2NoZWR1bGVCYWNrZ3JvdW5kVGFzayhCYWNrZ3JvdW5kVGFzayogYmdUYXNrKSA9IDA7CisgICAgdmlydHVhbCBpbnQzMl90IHdhaXRGb3JCYWNrZ3JvdW5kVGFzayh1aW50MzJfdCAmdGFza0lkKSA9IDA7CisgICAgdmlydHVhbCB+UUNhbWVyYUFsbG9jYXRvcigpIHt9Cit9OworCit9OyAvKiBuYW1lc3BhY2UgcWNhbWVyYSAqLworI2VuZGlmIC8qIF9fUUNBTUVSQV9BTExPQ0FUT1JfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhQ2hhbm5lbC5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFDaGFubmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzM0NzRjCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhQ2hhbm5lbC5jcHAKQEAgLTAsMCArMSwxNjExIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYUNoYW5uZWwiCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIlFDYW1lcmEySFdJLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKK30KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBjb25zdHJjdXRvciBvZiBRQ2FtZXJhQ2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtX2hhbmRsZSA6IGNhbWVyYSBoYW5kbGUKKyAqICAgQGNhbV9vcHMgICAgOiBwdHIgdG8gY2FtZXJhIG9wcyB0YWJsZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFDaGFubmVsOjpRQ2FtZXJhQ2hhbm5lbCh1aW50MzJfdCBjYW1faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtX29wcykKK3sKKyAgICBtX2NhbUhhbmRsZSA9IGNhbV9oYW5kbGU7CisgICAgbV9jYW1PcHMgPSBjYW1fb3BzOworICAgIG1fYklzQWN0aXZlID0gZmFsc2U7CisgICAgbV9iQWxsb3dEeW5CdWZBbGxvYyA9IGZhbHNlOworCisgICAgbV9oYW5kbGUgPSAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmFDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGRlZmF1bHQgY29uc3RyY3V0b3Igb2YgUUNhbWVyYUNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFDaGFubmVsOjpRQ2FtZXJhQ2hhbm5lbCgpCit7CisgICAgbV9jYW1IYW5kbGUgPSAwOworICAgIG1fY2FtT3BzID0gTlVMTDsKKyAgICBtX2JJc0FjdGl2ZSA9IGZhbHNlOworCisgICAgbV9oYW5kbGUgPSAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBkZXN0cnVjdG9yIG9mIFFDYW1lcmFDaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhQ2hhbm5lbDo6flFDYW1lcmFDaGFubmVsKCkKK3sKKyAgICBpZiAobV9iSXNBY3RpdmUpIHsKKyAgICAgICAgc3RvcCgpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtU3RyZWFtc1tpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKG1faGFuZGxlID09IG1TdHJlYW1zW2ldLT5nZXRDaGFubmVsSGFuZGxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1TdHJlYW1zW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtU3RyZWFtcy5jbGVhcigpOworICAgIG1fY2FtT3BzLT5kZWxldGVfY2hhbm5lbChtX2NhbUhhbmRsZSwgbV9oYW5kbGUpOworICAgIG1faGFuZGxlID0gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkZWxldGVDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGRlbGV0ZXMgYSBjYW1lcmEgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhQ2hhbm5lbDo6ZGVsZXRlQ2hhbm5lbCgpCit7CisgICAgaWYgKG1fYklzQWN0aXZlKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoKG1TdHJlYW1zW2ldICE9IE5VTEwpICYmIChtX2hhbmRsZSA9PSBtU3RyZWFtc1tpXS0+Z2V0Q2hhbm5lbEhhbmRsZSgpKSkgeworICAgICAgICAgICAgbVN0cmVhbXNbaV0tPmRlbGV0ZVN0cmVhbSgpOworICAgICAgICB9CisgICAgfQorICAgIG1fY2FtT3BzLT5kZWxldGVfY2hhbm5lbChtX2NhbUhhbmRsZSwgbV9oYW5kbGUpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFN0cmVhbVN5bmNDQgorICoKKyAqIERFU0NSSVBUSU9OOiByZWcgY2FsbGJhY2sgZnVuY3Rpb24gdG8gc3RyZWFtIG9mIHN0cmVhbSB0eXBlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgICBAc3RyZWFtX3R5cGUgOiBTdHJlYW0gdHlwZSBmb3Igd2hpY2ggY2FsbGJhY2sgbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZC4KKyAqICAgIEBzdHJlYW1fY2IgICA6IENhbGxiYWNrIGZ1bmN0aW9uCisKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub24temVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhQ2hhbm5lbDo6c2V0U3RyZWFtU3luY0NCIChjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwKKyAgICAgICAgc3RyZWFtX2NiX3JvdXRpbmUgc3RyZWFtX2NiKQoreworICAgIGludDMyX3QgcmMgPSBVTktOT1dOX0VSUk9SOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKChtU3RyZWFtc1tpXSAhPSBOVUxMKSAmJiAoc3RyZWFtX3R5cGUgPT0gbVN0cmVhbXNbaV0tPmdldE15VHlwZSgpKSkgeworICAgICAgICAgICAgcmMgPSBtU3RyZWFtc1tpXS0+c2V0U3luY0RhdGFDQihzdHJlYW1fY2IpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGluaXQKKyAqCisgKiBERVNDUklQVElPTjogaW5pdGlhbGl6YXRpb24gb2YgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAYXR0ciAgICA6IGNoYW5uZWwgYnVuZGxlIGF0dHJpYnV0ZSBzZXR0aW5nCisgKiAgIEBkYXRhQ0IgIDogZGF0YSBub3RpZnkgY2FsbGJhY2sKKyAqICAgQHVzZXJEYXRhOiB1c2VyIGRhdGEgcHRyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhQ2hhbm5lbDo6aW5pdChtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfbm90aWZ5X3QgZGF0YUNCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSkKK3sKKyAgICBtX2hhbmRsZSA9IG1fY2FtT3BzLT5hZGRfY2hhbm5lbChtX2NhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUNCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSk7CisgICAgaWYgKG1faGFuZGxlID09IDApIHsKKyAgICAgICAgTE9HRSgiQWRkIGNoYW5uZWwgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWRkU3RyZWFtCisgKgorICogREVTQ1JJUFRJT046IGFkZCBhIHN0cmVhbSBpbnRvIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGFsbG9jYXRvciAgICAgIDogc3RyZWFtIHJlbGF0ZWQgYnVmZmVyIGFsbG9jYXRvcgorICogICBAc3RyZWFtSW5mb0J1ZiAgOiBwdHIgdG8gYnVmIHRoYXQgY29udGFpbnMgc3RyZWFtIGluZm8KKyAqICAgQG1pc2NCdWYgICAgICAgIDogcHRyIHRvIGJ1ZiB0aGF0IGNvbnRhaW5zIG1pc2MgYnVmZmVycworICogICBAbWluU3RyZWFtQnVmTnVtOiBudW1iZXIgb2Ygc3RyZWFtIGJ1ZmZlcnMgbmVlZGVkCisgKiAgIEBwYWRkaW5nSW5mbyAgICA6IHBhZGRpbmcgaW5mb3JtYXRpb24KKyAqICAgQHN0cmVhbV9jYiAgICAgIDogc3RyZWFtIGRhdGEgbm90aWZ5IGNhbGxiYWNrCisgKiAgIEB1c2VyZGF0YSAgICAgICA6IHVzZXIgZGF0YSBwdHIKKyAqICAgQGJEeW5BbGxvY0J1ZiAgIDogZmxhZyBpbmRpY2F0aW5nIGlmIGFsbG93IGFsbG9jYXRlIGJ1ZmZlcnMgaW4gMiBzdGVwcworICogICBAb25saW5lX3JvdGF0aW9uOiByb3RhdGlvbiBhcHBsaWVkIG9ubGluZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYUNoYW5uZWw6OmFkZFN0cmVhbShRQ2FtZXJhQWxsb2NhdG9yICZhbGxvY2F0b3IsCisgICAgICAgIFFDYW1lcmFIZWFwTWVtb3J5ICpzdHJlYW1JbmZvQnVmLCBRQ2FtZXJhSGVhcE1lbW9yeSAqbWlzY0J1ZiwKKyAgICAgICAgdWludDhfdCBtaW5TdHJlYW1CdWZOdW0sIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sCisgICAgICAgIHN0cmVhbV9jYl9yb3V0aW5lIHN0cmVhbV9jYiwgdm9pZCAqdXNlcmRhdGEsIGJvb2wgYkR5bkFsbG9jQnVmLAorICAgICAgICBib29sIGJEZWZmQWxsb2MsIGNhbV9yb3RhdGlvbl90IG9ubGluZV9yb3RhdGlvbikKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgaWYgKG1TdHJlYW1zLnNpemUoKSA+PSBNQVhfU1RSRUFNX05VTV9JTl9CVU5ETEUpIHsKKyAgICAgICAgTE9HRSgic3RyZWFtIG51bWJlciAoJXp1KSBleGNlZWRzIG1heCBsaW1pdCAoJWQpIiwKKyAgICAgICAgICAgICAgIG1TdHJlYW1zLnNpemUoKSwgTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFKTsKKyAgICAgICAgaWYgKHN0cmVhbUluZm9CdWYgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RyZWFtSW5mb0J1Zi0+ZGVhbGxvY2F0ZSgpOworICAgICAgICAgICAgZGVsZXRlIHN0cmVhbUluZm9CdWY7CisgICAgICAgICAgICBzdHJlYW1JbmZvQnVmID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0gbmV3IFFDYW1lcmFTdHJlYW0oYWxsb2NhdG9yLAorICAgICAgICAgICAgbV9jYW1IYW5kbGUsIG1faGFuZGxlLCBtX2NhbU9wcywgcGFkZGluZ0luZm8sIGJEZWZmQWxsb2MsCisgICAgICAgICAgICBvbmxpbmVfcm90YXRpb24pOworICAgIGlmIChwU3RyZWFtID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtIGZvciBTdHJlYW0iKTsKKyAgICAgICAgaWYgKHN0cmVhbUluZm9CdWYgIT0gTlVMTCkgeworICAgICAgICAgICAgc3RyZWFtSW5mb0J1Zi0+ZGVhbGxvY2F0ZSgpOworICAgICAgICAgICAgZGVsZXRlIHN0cmVhbUluZm9CdWY7CisgICAgICAgICAgICBzdHJlYW1JbmZvQnVmID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHJjID0gcFN0cmVhbS0+aW5pdChzdHJlYW1JbmZvQnVmLCBtaXNjQnVmLCBtaW5TdHJlYW1CdWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jYiwgdXNlcmRhdGEsIGJEeW5BbGxvY0J1Zik7CisgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgbVN0cmVhbXMuYWRkKHBTdHJlYW0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlbGV0ZSBwU3RyZWFtOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbGlua1N0cmVhbQorICoKKyAqIERFU0NSSVBUSU9OOiBsaW5rIGEgc3RyZWFtIGludG8gY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2ggICAgICA6IENoYW5uZWwgd2hpY2ggdGhlIHN0cmVhbSBiZWxvbmdzIHRvCisgKiAgIEBzdHJlYW0gIDogU3RyZWFtIHdoaWNoIG5lZWRzIHRvIGJlIGxpbmtlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYUNoYW5uZWw6OmxpbmtTdHJlYW0oUUNhbWVyYUNoYW5uZWwgKmNoLCBRQ2FtZXJhU3RyZWFtICpzdHJlYW0pCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKCgwID09IG1faGFuZGxlKSB8fCAoTlVMTCA9PSBjaCkgfHwgKE5VTEwgPT0gc3RyZWFtKSkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpbnQzMl90IGhhbmRsZSA9IG1fY2FtT3BzLT5saW5rX3N0cmVhbShtX2NhbUhhbmRsZSwKKyAgICAgICAgICAgIGNoLT5nZXRNeUhhbmRsZSgpLAorICAgICAgICAgICAgc3RyZWFtLT5nZXRNeUhhbmRsZSgpLAorICAgICAgICAgICAgbV9oYW5kbGUpOworICAgIGlmICgwID09IGhhbmRsZSkgeworICAgICAgICBMT0dFKCJMaW5raW5nIG9mIHN0cmVhbSBmYWlsZWQiKTsKKyAgICAgICAgcmMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9IGVsc2UgeworICAgICAgICBtU3RyZWFtcy5hZGQoc3RyZWFtKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RhcnQKKyAqCisgKiBERVNDUklQVElPTjogc3RhcnQgY2hhbm5lbCwgd2hpY2ggd2lsbCBzdGFydCBhbGwgc3RyZWFtcyBiZWxvbmcgdG8gdGhpcyBjaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFDaGFubmVsOjpzdGFydCgpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgaWYobV9iSXNBY3RpdmUpIHsKKyAgICAgICAgTE9HVygiQXR0ZW1wdCB0byBzdGFydCBhY3RpdmUgY2hhbm5lbCIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIGlmIChtU3RyZWFtcy5zaXplKCkgPiAxKSB7CisgICAgICAgIC8vIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc3RyZWFtIGluIHRoZSBjaGFubmVsCisgICAgICAgIC8vIHdlIG5lZWQgdG8gbm90aWZ5IG1jdGwgdGhhdCBhbGwgc3RyZWFtcyBpbiB0aGlzIGNoYW5uZWwgbmVlZCB0byBiZSBidW5kbGVkCisgICAgICAgIGNhbV9idW5kbGVfY29uZmlnX3QgYnVuZGxlSW5mbzsKKyAgICAgICAgbWVtc2V0KCZidW5kbGVJbmZvLCAwLCBzaXplb2YoYnVuZGxlSW5mbykpOworICAgICAgICByYyA9IG1fY2FtT3BzLT5nZXRfYnVuZGxlX2luZm8obV9jYW1IYW5kbGUsIG1faGFuZGxlLCAmYnVuZGxlSW5mbyk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiZ2V0X2J1bmRsZV9pbmZvIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgICAgIGlmIChidW5kbGVJbmZvLm51bV9vZl9zdHJlYW1zID4gMSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVJbmZvLm51bV9vZl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0gZ2V0U3RyZWFtQnlTZXJ2ZXJJRChidW5kbGVJbmZvLnN0cmVhbV9pZHNbaV0pOworICAgICAgICAgICAgICAgIGlmIChwU3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgbWV0YWRhdGEgZm9yIHJlcHJvY2VzcyBub3cgYmVjYXVzZSBQUCBtb2R1bGUgY2Fubm90IGhhbmRsZSBtZXRhIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heSBuZWVkIGZ1cnRodXIgZGlzY3Vzc2lvbiBpZiBJbWFnaW5nbGliIG5lZWQgbWV0YSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCBwYXJhbTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCkpOworICAgICAgICAgICAgICAgICAgICBwYXJhbS50eXBlID0gQ0FNX1NUUkVBTV9QQVJBTV9UWVBFX1NFVF9CVU5ETEVfSU5GTzsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uYnVuZGxlSW5mbyA9IGJ1bmRsZUluZm87CisgICAgICAgICAgICAgICAgICAgIHJjID0gcFN0cmVhbS0+c2V0UGFyYW1ldGVyKHBhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJzdHJlYW0gc2V0UGFyYW1ldGVyIGZvciBzZXQgYnVuZGxlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoKG1TdHJlYW1zW2ldICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgKG1faGFuZGxlID09IG1TdHJlYW1zW2ldLT5nZXRDaGFubmVsSGFuZGxlKCkpKSB7CisgICAgICAgICAgICBtU3RyZWFtc1tpXS0+c3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByYyA9IG1fY2FtT3BzLT5zdGFydF9jaGFubmVsKG1fY2FtSGFuZGxlLCBtX2hhbmRsZSk7CisKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKChtU3RyZWFtc1tpXSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAgICAgICAobV9oYW5kbGUgPT0gbVN0cmVhbXNbaV0tPmdldENoYW5uZWxIYW5kbGUoKSkpIHsKKyAgICAgICAgICAgICAgICBtU3RyZWFtc1tpXS0+c3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9iSXNBY3RpdmUgPSB0cnVlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobVN0cmVhbXNbaV0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1TdHJlYW1zW2ldLT5jb25kX3NpZ25hbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0b3AKKyAqCisgKiBERVNDUklQVElPTjogc3RvcCBhIGNoYW5uZWwsIHdoaWNoIHdpbGwgc3RvcCBhbGwgc3RyZWFtcyBiZWxvbmcgdG8gdGhpcyBjaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFDaGFubmVsOjpzdG9wKCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgc2l6ZV90IGkgPSAwOworCisgICAgaWYgKCFtX2JJc0FjdGl2ZSkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICB3aGlsZShpIDwgbVN0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgIGlmIChtU3RyZWFtc1tpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAobV9oYW5kbGUgPT0gbVN0cmVhbXNbaV0tPmdldENoYW5uZWxIYW5kbGUoKSkgeworICAgICAgICAgICAgICAgIG1TdHJlYW1zW2ldLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBSZW1vdmUgbGlua2VkIHN0cmVhbSBmcm9tIHN0cmVhbSBsaXN0CisgICAgICAgICAgICAgICAgbVN0cmVhbXMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByYyA9IG1fY2FtT3BzLT5zdG9wX2NoYW5uZWwobV9jYW1IYW5kbGUsIG1faGFuZGxlKTsKKworICAgIG1fYklzQWN0aXZlID0gZmFsc2U7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGJ1ZkRvbmUKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIGEgc3RyZWFtIGJ1ZiBiYWNrIHRvIGtlcm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVjdmRfZnJhbWUgIDogc3RyZWFtIGJ1ZiBmcmFtZSB0byBiZSByZXR1cm5lZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYUNoYW5uZWw6OmJ1ZkRvbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHJlY3ZkX2ZyYW1lLT5udW1fYnVmczsgaSsrKSB7CisgICAgICAgIGlmIChyZWN2ZF9mcmFtZS0+YnVmc1tpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1TdHJlYW1zLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdHJlYW1zW2pdICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW2pdLT5nZXRNeUhhbmRsZSgpID09IHJlY3ZkX2ZyYW1lLT5idWZzW2ldLT5zdHJlYW1faWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBtU3RyZWFtc1tqXS0+YnVmRG9uZShyZWN2ZF9mcmFtZS0+YnVmc1tpXS0+YnVmX2lkeCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBicmVhayBsb29wIGoKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYnVmRG9uZQorICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm4gc3BlY2lmaWVkIGJ1ZmZlciBmcm9tIHN1cGVyIGJ1ZmZlciB0byBrZXJuZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHJlY3ZkX2ZyYW1lICA6IHN0cmVhbSBidWYgZnJhbWUgdG8gYmUgcmV0dXJuZWQKKyAqICAgQHN0cmVhbV9pZCAgICAgIDogc3RyZWFtIElEIG9mIHRoZSBidWZmZXIgdG8gYmUgcmVsZWFzZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFDaGFubmVsOjpidWZEb25lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVjdmRfZnJhbWUsIHVpbnQzMl90IHN0cmVhbV9pZCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgaW50MzJfdCBpbmRleDsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaW50MzJfdClyZWN2ZF9mcmFtZS0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICBpbmRleCA9IC0xOworICAgICAgICBpZiAoKHJlY3ZkX2ZyYW1lLT5idWZzW2ldICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgKHJlY3ZkX2ZyYW1lLT5idWZzW2ldLT5zdHJlYW1faWQgPT0gc3RyZWFtX2lkKSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtU3RyZWFtcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIGlmICgobVN0cmVhbXNbal0gIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtc1tqXS0+Z2V0TXlIYW5kbGUoKSA9PSBzdHJlYW1faWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gbVN0cmVhbXNbal0tPmJ1ZkRvbmUocmVjdmRfZnJhbWUtPmJ1ZnNbaV0tPmJ1Zl9pZHgpOworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBicmVhayBsb29wIGoKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IChpbnQzMl90KXJlY3ZkX2ZyYW1lLT5udW1fYnVmcykpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IGluZGV4OyBqIDwgKGludDMyX3QpKHJlY3ZkX2ZyYW1lLT5udW1fYnVmcyAtIDEpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjdmRfZnJhbWUtPmJ1ZnNbal0gPSByZWN2ZF9mcmFtZS0+YnVmc1tqICsgMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlY3ZkX2ZyYW1lLT5udW1fYnVmcy0tOworICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jZXNzWm9vbURvbmUKKyAqCisgKiBERVNDUklQVElPTjogcHJvY2VzcyB6b29tIGRvbmUgZXZlbnQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHByZXZpZXdXaW5kb2UgOiBwdHIgdG8gcHJldmlldyB3aW5kb3cgb3BzIHRhYmxlLCBuZWVkZWQgdG8gc2V0IHByZXZpZXcKKyAqICAgICAgICAgICAgICAgICAgICBjcm9wIGluZm9ybWF0aW9uCisgKiAgIEBjcm9wX2luZm8gICAgIDogY3JvcCBpbmZvIGFzIGEgcmVzdWx0IG9mIHpvb20gb3BlcmF0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhQ2hhbm5lbDo6cHJvY2Vzc1pvb21Eb25lKHByZXZpZXdfc3RyZWFtX29wc190ICpwcmV2aWV3V2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9jcm9wX2RhdGFfdCAmY3JvcF9pbmZvKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmICgobVN0cmVhbXNbaV0gIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAobV9oYW5kbGUgPT0gbVN0cmVhbXNbaV0tPmdldENoYW5uZWxIYW5kbGUoKSkpIHsKKyAgICAgICAgICAgIHJjID0gbVN0cmVhbXNbaV0tPnByb2Nlc3Nab29tRG9uZShwcmV2aWV3V2luZG93LCBjcm9wX2luZm8pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRTdHJlYW1CeUhhbmRsZQorICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm4gc3RyZWFtIG9iamVjdCBieSBzdHJlYW0gaGFuZGxlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdHJlYW1IYW5kbGUgOiBzdHJlYW0gaGFuZGxlCisgKgorICogUkVUVVJOICAgICA6IHN0cmVhbSBvYmplY3QuIE5VTEwgaWYgbm90IGZvdW5kCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFTdHJlYW0gKlFDYW1lcmFDaGFubmVsOjpnZXRTdHJlYW1CeUhhbmRsZSh1aW50MzJfdCBzdHJlYW1IYW5kbGUpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobVN0cmVhbXNbaV0gIT0gTlVMTCAmJiBtU3RyZWFtc1tpXS0+Z2V0TXlIYW5kbGUoKSA9PSBzdHJlYW1IYW5kbGUpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RyZWFtc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRTdHJlYW1CeVNlcnZlcklECisgKgorICogREVTQ1JJUFRJT046IHJldHVybiBzdHJlYW0gb2JqZWN0IGJ5IHN0cmVhbSBzZXJ2ZXIgSUQgZnJvbSBkYWVtb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHNlcnZlcklEIDogc3RyZWFtIHNlcnZlciBJRAorICoKKyAqIFJFVFVSTiAgICAgOiBzdHJlYW0gb2JqZWN0LiBOVUxMIGlmIG5vdCBmb3VuZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhU3RyZWFtICpRQ2FtZXJhQ2hhbm5lbDo6Z2V0U3RyZWFtQnlTZXJ2ZXJJRCh1aW50MzJfdCBzZXJ2ZXJJRCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtU3RyZWFtc1tpXSAhPSBOVUxMICYmIG1TdHJlYW1zW2ldLT5nZXRNeVNlcnZlcklEKCkgPT0gc2VydmVySUQpIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RyZWFtc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRTdHJlYW1CeUluZGV4CisgKgorICogREVTQ1JJUFRJT046IHJldHVybiBzdHJlYW0gb2JqZWN0IGJ5IGluZGV4IG9mIHN0cmVhbXMgaW4gdGhlIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4IDogaW5kZXggb2Ygc3RyZWFtIGluIHRoZSBjaGFubmVsCisgKgorICogUkVUVVJOICAgICA6IHN0cmVhbSBvYmplY3QuIE5VTEwgaWYgbm90IGZvdW5kCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFTdHJlYW0gKlFDYW1lcmFDaGFubmVsOjpnZXRTdHJlYW1CeUluZGV4KHVpbnQzMl90IGluZGV4KQoreworICAgIGlmIChpbmRleCA+PSBNQVhfU1RSRUFNX05VTV9JTl9CVU5ETEUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGluZGV4IDwgbVN0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBtU3RyZWFtc1tpbmRleF07CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFVwZGF0ZVN0cmVhbUJhc2VkUGFyYW1ldGVycworICoKKyAqIERFU0NSSVBUSU9OOiB1cGRhdGUgYW55IHN0cmVhbSBiYXNlZCBzZXR0aW5ncyBmcm9tIHBhcmFtZXRlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtICAgOiByZWZlcmVuY2UgdG8gcGFyYW1ldGVycyBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFDaGFubmVsOjpVcGRhdGVTdHJlYW1CYXNlZFBhcmFtZXRlcnMoUUNhbWVyYVBhcmFtZXRlcnNJbnRmICZwYXJhbSkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgaWYgKHBhcmFtLmlzUHJldmlld0ZsaXBDaGFuZ2VkKCkpIHsKKyAgICAgICAgLy8gdHJ5IHRvIGZpbmQgcHJldmlldyBzdHJlYW0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKChtU3RyZWFtc1tpXSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAgICAgICAobV9oYW5kbGUgPT0gbVN0cmVhbXNbaV0tPmdldENoYW5uZWxIYW5kbGUoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1zW2ldLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfUFJFVklFVykgfHwKKyAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1zW2ldLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcpKSkgKSB7CisgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90IHBhcmFtX2J1ZjsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnBhcmFtX2J1ZiwgMCwgc2l6ZW9mKGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCkpOworICAgICAgICAgICAgICAgIHBhcmFtX2J1Zi50eXBlID0gQ0FNX1NUUkVBTV9QQVJBTV9UWVBFX1NFVF9GTElQOworICAgICAgICAgICAgICAgIHBhcmFtX2J1Zi5mbGlwSW5mby5mbGlwX21hc2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXBhcmFtLmdldEZsaXBNb2RlKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKTsKKyAgICAgICAgICAgICAgICByYyA9IG1TdHJlYW1zW2ldLT5zZXRQYXJhbWV0ZXIocGFyYW1fYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVygic2V0IHByZXZpZXcgc3RyZWFtIGZsaXAgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwYXJhbS5pc1ZpZGVvRmxpcENoYW5nZWQoKSkgeworICAgICAgICAvLyB0cnkgdG8gZmluZCB2aWRlbyBzdHJlYW0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKChtU3RyZWFtc1tpXSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAgICAgICAobV9oYW5kbGUgPT0gbVN0cmVhbXNbaV0tPmdldENoYW5uZWxIYW5kbGUoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1zW2ldLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfVklERU8pIHx8CisgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtc1tpXS0+aXNPcmlnbmFsVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9WSURFTykpKSApIHsKKyAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgcGFyYW1fYnVmOworICAgICAgICAgICAgICAgIG1lbXNldCgmcGFyYW1fYnVmLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90KSk7CisgICAgICAgICAgICAgICAgcGFyYW1fYnVmLnR5cGUgPSBDQU1fU1RSRUFNX1BBUkFNX1RZUEVfU0VUX0ZMSVA7CisgICAgICAgICAgICAgICAgcGFyYW1fYnVmLmZsaXBJbmZvLmZsaXBfbWFzayA9CisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpcGFyYW0uZ2V0RmxpcE1vZGUoQ0FNX1NUUkVBTV9UWVBFX1ZJREVPKTsKKyAgICAgICAgICAgICAgICByYyA9IG1TdHJlYW1zW2ldLT5zZXRQYXJhbWV0ZXIocGFyYW1fYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HVygic2V0IHZpZGVvIHN0cmVhbSBmbGlwIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocGFyYW0uaXNTbmFwc2hvdEZsaXBDaGFuZ2VkKCkpIHsKKyAgICAgICAgLy8gdHJ5IHRvIGZpbmQgc25hcHNob3QvcG9zdHZpZXcgc3RyZWFtCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtU3RyZWFtc1tpXSAhPSBOVUxMICYmCisgICAgICAgICAgICAgICAgICAgIChtX2hhbmRsZSA9PSBtU3RyZWFtc1tpXS0+Z2V0Q2hhbm5lbEhhbmRsZSgpKSAmJgorICAgICAgICAgICAgICAgICAgICAobVN0cmVhbXNbaV0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW2ldLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKSB8fAorICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbaV0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVykgfHwKKyAgICAgICAgICAgICAgICAgbVN0cmVhbXNbaV0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVcpICkgKSB7CisgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90IHBhcmFtX2J1ZjsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnBhcmFtX2J1ZiwgMCwgc2l6ZW9mKGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCkpOworICAgICAgICAgICAgICAgIHBhcmFtX2J1Zi50eXBlID0gQ0FNX1NUUkVBTV9QQVJBTV9UWVBFX1NFVF9GTElQOworICAgICAgICAgICAgICAgIHBhcmFtX2J1Zi5mbGlwSW5mby5mbGlwX21hc2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXBhcmFtLmdldEZsaXBNb2RlKENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCk7CisgICAgICAgICAgICAgICAgcmMgPSBtU3RyZWFtc1tpXS0+c2V0UGFyYW1ldGVyKHBhcmFtX2J1Zik7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1coInNldCBzbmFwc2hvdCBzdHJlYW0gZmxpcCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmFQaWNDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmFQaWNDaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1faGFuZGxlIDogY2FtZXJhIGhhbmRsZQorICogICBAY2FtX29wcyAgICA6IHB0ciB0byBjYW1lcmEgb3BzIHRhYmxlCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYVBpY0NoYW5uZWw6OlFDYW1lcmFQaWNDaGFubmVsKHVpbnQzMl90IGNhbV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzKSA6CisgICAgUUNhbWVyYUNoYW5uZWwoY2FtX2hhbmRsZSwgY2FtX29wcykKK3sKKyAgICBtX2JBbGxvd0R5bkJ1ZkFsbG9jID0gdHJ1ZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhUGljQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBkZWZhdWx0IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmFQaWNDaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhUGljQ2hhbm5lbDo6UUNhbWVyYVBpY0NoYW5uZWwoKQoreworICAgIG1fYkFsbG93RHluQnVmQWxsb2MgPSB0cnVlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhUGljQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBkZXN0cnVjdG9yIG9mIFFDYW1lcmFQaWNDaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhUGljQ2hhbm5lbDo6flFDYW1lcmFQaWNDaGFubmVsKCkKK3sKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB0YWtlUGljdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZW5kIHJlcXVlc3QgZm9yIHF1ZXVlZCBzbmFwc2hvdCBmcmFtZXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJ1ZiA6IHJlcXVlc3QgYnVmIGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQaWNDaGFubmVsOjp0YWtlUGljdHVyZSAobW1fY2FtZXJhX3JlcV9idWZfdCAqYnVmKQoreworICAgIGludDMyX3QgcmMgPSBtX2NhbU9wcy0+cmVxdWVzdF9zdXBlcl9idWYobV9jYW1IYW5kbGUsIG1faGFuZGxlLCBidWYpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYW5jZWxQaWN0dXJlCisgKgorICogREVTQ1JJUFRJT046IGNhbmNlbCByZXF1ZXN0IGZvciBxdWV1ZWQgc25hcHNob3QgZnJhbWVzCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQaWNDaGFubmVsOjpjYW5jZWxQaWN0dXJlKCkKK3sKKyAgICBpbnQzMl90IHJjID0gbV9jYW1PcHMtPmNhbmNlbF9zdXBlcl9idWZfcmVxdWVzdChtX2NhbUhhbmRsZSwgbV9oYW5kbGUpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdG9wQWR2YW5jZWRDYXB0dXJlCisgKgorICogREVTQ1JJUFRJT046IHN0b3AgYWR2YW5jZWQgY2FwdHVyZSBiYXNlZCBvbiBhZHZhbmNlZCBjYXB0dXJlIHR5cGUuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB0eXBlIDogYWR2YW5jZWQgY2FwdHVyZSB0eXBlLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBpY0NoYW5uZWw6OnN0b3BBZHZhbmNlZENhcHR1cmUobW1fY2FtZXJhX2FkdmFuY2VkX2NhcHR1cmVfdCB0eXBlKQoreworICAgIGludDMyX3QgcmMgPSBtX2NhbU9wcy0+cHJvY2Vzc19hZHZhbmNlZF9jYXB0dXJlKG1fY2FtSGFuZGxlLAorICAgICAgICAgICAgbV9oYW5kbGUsIHR5cGUsIDAsIE5VTEwpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdGFydEFkdmFuY2VkQ2FwdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBzdGFydCBhZHZhbmNlZCBjYXB0dXJlIGJhc2VkIG9uIGFkdmFuY2VkIGNhcHR1cmUgdHlwZS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHR5cGUgOiBhZHZhbmNlZCBjYXB0dXJlIHR5cGUuCisgKiAgIEBjb25maWc6IGFkdmFuY2UgY2FwdHVyZSBjb25maWcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQaWNDaGFubmVsOjpzdGFydEFkdmFuY2VkQ2FwdHVyZShtbV9jYW1lcmFfYWR2YW5jZWRfY2FwdHVyZV90IHR5cGUsCisgICAgICAgIGNhbV9jYXB0dXJlX2ZyYW1lX2NvbmZpZ190ICpjb25maWcpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgcmMgPSBtX2NhbU9wcy0+cHJvY2Vzc19hZHZhbmNlZF9jYXB0dXJlKG1fY2FtSGFuZGxlLCBtX2hhbmRsZSwgdHlwZSwKKyAgICAgICAgICAgIDEsIGNvbmZpZyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBGVU5DVElPTiAgIDogZmx1c2hTdXBlcmJ1ZmZlcgorICoKKyAqIERFU0NSSVBUSU9OOiBmbHVzaCB0aGUgYWxsIHN1cGVyYnVmZmVyIGZyYW1lcy4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZyYW1lX2lkeCA6IGZyYW1lIGluZGV4IG9mIGZvY3VzZWQgZnJhbWUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQaWNDaGFubmVsOjpmbHVzaFN1cGVyYnVmZmVyKHVpbnQzMl90IGZyYW1lX2lkeCkKK3sKKyAgICBpbnQzMl90IHJjID0gbV9jYW1PcHMtPmZsdXNoX3N1cGVyX2J1Zl9xdWV1ZShtX2NhbUhhbmRsZSwgbV9oYW5kbGUsIGZyYW1lX2lkeCk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmFWaWRlb0NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogY29uc3RydWN0b3Igb2YgUUNhbWVyYVZpZGVvQ2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtX2hhbmRsZSA6IGNhbWVyYSBoYW5kbGUKKyAqICAgQGNhbV9vcHMgICAgOiBwdHIgdG8gY2FtZXJhIG9wcyB0YWJsZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFWaWRlb0NoYW5uZWw6OlFDYW1lcmFWaWRlb0NoYW5uZWwodWludDMyX3QgY2FtX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzKSA6CisgICAgUUNhbWVyYUNoYW5uZWwoY2FtX2hhbmRsZSwgY2FtX29wcykKK3sKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhVmlkZW9DaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGRlZmF1bHQgY29uc3RydWN0b3Igb2YgUUNhbWVyYVZpZGVvQ2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYVZpZGVvQ2hhbm5lbDo6UUNhbWVyYVZpZGVvQ2hhbm5lbCgpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogflFDYW1lcmFWaWRlb0NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogZGVzdHJ1Y3RvciBvZiBRQ2FtZXJhVmlkZW9DaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhVmlkZW9DaGFubmVsOjp+UUNhbWVyYVZpZGVvQ2hhbm5lbCgpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdGFrZVBpY3R1cmUKKyAqCisgKiBERVNDUklQVElPTjogc2VuZCByZXF1ZXN0IGZvciBxdWV1ZWQgc25hcHNob3QgZnJhbWVzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtbV9jYW1lcmFfcmVxX2J1Zl90IDogcmVxdWVzdCBidWYgaW5mbworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVZpZGVvQ2hhbm5lbDo6dGFrZVBpY3R1cmUobW1fY2FtZXJhX3JlcV9idWZfdCAqYnVmKQoreworICAgIGludDMyX3QgcmMgPSBtX2NhbU9wcy0+cmVxdWVzdF9zdXBlcl9idWYobV9jYW1IYW5kbGUsIG1faGFuZGxlLCBidWYpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYW5jZWxQaWN0dXJlCisgKgorICogREVTQ1JJUFRJT046IGNhbmNlbCByZXF1ZXN0IGZvciBxdWV1ZWQgc25hcHNob3QgZnJhbWVzCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFWaWRlb0NoYW5uZWw6OmNhbmNlbFBpY3R1cmUoKQoreworICAgIGludDMyX3QgcmMgPSBtX2NhbU9wcy0+Y2FuY2VsX3N1cGVyX2J1Zl9yZXF1ZXN0KG1fY2FtSGFuZGxlLCBtX2hhbmRsZSk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbGVhc2VGcmFtZQorICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm4gdmlkZW8gZnJhbWUgZnJvbSBhcHAKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG9wYXF1ZSAgICAgOiBwdHIgdG8gdmlkZW8gZnJhbWUgdG8gYmUgcmV0dXJuZWQKKyAqICAgQGlzTWV0YURhdGEgOiBpZiBmcmFtZSBpcyBhIG1ldGFkYXRhIG9yIHJlYWwgZnJhbWUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFWaWRlb0NoYW5uZWw6OnJlbGVhc2VGcmFtZShjb25zdCB2b2lkICogb3BhcXVlLCBib29sIGlzTWV0YURhdGEpCit7CisgICAgUUNhbWVyYVN0cmVhbSAqcFZpZGVvU3RyZWFtID0gTlVMTDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtU3RyZWFtc1tpXSAhPSBOVUxMICYmIG1TdHJlYW1zW2ldLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfVklERU8pKSB7CisgICAgICAgICAgICBwVmlkZW9TdHJlYW0gPSBtU3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gcFZpZGVvU3RyZWFtKSB7CisgICAgICAgIExPR0UoIk5vIHZpZGVvIHN0cmVhbSBpbiB0aGUgY2hhbm5lbCIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGludDMyX3QgcmMgPSBwVmlkZW9TdHJlYW0tPmJ1ZkRvbmUob3BhcXVlLCBpc01ldGFEYXRhKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogY29uc3RydWN0b3Igb2YgUUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbV9oYW5kbGUgOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBjYW1fb3BzICAgIDogcHRyIHRvIGNhbWVyYSBvcHMgdGFibGUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbDo6UUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWwodWludDMyX3QgY2FtX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMpIDoKKyAgICBRQ2FtZXJhQ2hhbm5lbChjYW1faGFuZGxlLCBjYW1fb3BzKSwKKyAgICBtX3BTcmNDaGFubmVsKE5VTEwpLAorICAgIG1QYXNzQ291bnQoMCkKK3sKKyAgICBtZW1zZXQobVNyY1N0cmVhbUhhbmRsZXMsIDAsIHNpemVvZihtU3JjU3RyZWFtSGFuZGxlcykpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmFSZXByb2Nlc3NDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGRlZmF1bHQgY29uc3RydWN0b3Igb2YgUUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFSZXByb2Nlc3NDaGFubmVsOjpRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbCgpIDoKKyAgICBtX3BTcmNDaGFubmVsKE5VTEwpLAorICAgIG1QYXNzQ291bnQoMCkKK3sKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogZGVzdHJ1Y3RvciBvZiBRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWw6On5RQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbCgpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWRkUmVwcm9jU3RyZWFtc0Zyb21Tb3VyY2UKKyAqCisgKiBERVNDUklQVElPTjogYWRkIHJlcHJvY2VzcyBzdHJlYW1zIGZyb20gaW5wdXQgc291cmNlIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGFsbG9jYXRvciAgICAgIDogc3RyZWFtIHJlbGF0ZWQgYnVmZmVyIGFsbG9jYXRvcgorICogICBAZmVhdHVyZUNvbmZpZyAgOiBwcCBmZWF0dXJlIGNvbmZpZ3VyYXRpb24KKyAqICAgQHBTcmNDaGFubmVsICAgIDogcHRyIHRvIGlucHV0IHNvdXJjZSBjaGFubmVsIHRoYXQgbmVlZHMgcmVwcm9jZXNzCisgKiAgIEBtaW5TdHJlYW1CdWZOdW06IG51bWJlciBvZiBzdHJlYW0gYnVmZmVycyBuZWVkZWQKKyAqICAgQGJ1cnN0TnVtICAgICAgIDogbnVtYmVyIG9mIGJ1cnN0IGNhcHR1cmVzIG5lZWRlZAorICogICBAcGFkZGluZ0luZm8gICAgOiBwYWRkaW5nIGluZm9ybWF0aW9uCisgKiAgIEBwYXJhbSAgICAgICAgICA6IHJlZmVyZW5jZSB0byBwYXJhbWV0ZXJzCisgKiAgIEBjb250U3RyZWFtICAgICA6IGNvbnRpbm91cyBzdHJlYW1pbmcgbW9kZSBvciBidXJzdAorICogICBAb2ZmbGluZSAgICAgICAgOiBjb25maWd1cmUgZm9yIG9mZmxpbmUgcmVwcm9jZXNzaW5nCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbDo6YWRkUmVwcm9jU3RyZWFtc0Zyb21Tb3VyY2UoCisgICAgICAgIFFDYW1lcmFBbGxvY2F0b3ImIGFsbG9jYXRvciwgY2FtX3BwX2ZlYXR1cmVfY29uZmlnX3QgJmZlYXR1cmVDb25maWcsCisgICAgICAgIFFDYW1lcmFDaGFubmVsICpwU3JjQ2hhbm5lbCwgdWludDhfdCBtaW5TdHJlYW1CdWZOdW0sIHVpbnQ4X3QgYnVyc3ROdW0sCisgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sIFFDYW1lcmFQYXJhbWV0ZXJzSW50ZiAmcGFyYW0sIGJvb2wgY29udFN0cmVhbSwKKyAgICAgICAgYm9vbCBvZmZsaW5lKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIFFDYW1lcmFTdHJlYW0gKnBTdHJlYW0gPSBOVUxMOworICAgIFFDYW1lcmFIZWFwTWVtb3J5ICpwU3RyZWFtSW5mb0J1ZiA9IE5VTEw7CisgICAgUUNhbWVyYUhlYXBNZW1vcnkgKnBNaXNjQnVmID0gTlVMTDsKKyAgICBjYW1fc3RyZWFtX2luZm9fdCAqc3RyZWFtSW5mbyA9IE5VTEw7CisgICAgY2FtX3BhZGRpbmdfaW5mb190IHBhZGRpbmc7CisKKyAgICBtZW1zZXQobVNyY1N0cmVhbUhhbmRsZXMsIDAsIHNpemVvZihtU3JjU3RyZWFtSGFuZGxlcykpOworICAgIGlmIChOVUxMID09IHBhZGRpbmdJbmZvKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHBhZGRpbmcgPSAqcGFkZGluZ0luZm87CisgICAgLy9Vc2UgbWF4aW11bSBwYWRkaW5nIHNvIHRoYXQgdGhlIGJ1ZmZlcgorICAgIC8vY2FuIGJlIHJvdGF0ZWQKKyAgICBwYWRkaW5nLndpZHRoX3BhZGRpbmcgPSBNQVgocGFkZGluZy53aWR0aF9wYWRkaW5nLCBwYWRkaW5nLmhlaWdodF9wYWRkaW5nKTsKKyAgICBwYWRkaW5nLmhlaWdodF9wYWRkaW5nID0gcGFkZGluZy53aWR0aF9wYWRkaW5nOworICAgIHBhZGRpbmcub2Zmc2V0X2luZm8ub2Zmc2V0X3ggPSAwOworICAgIHBhZGRpbmcub2Zmc2V0X2luZm8ub2Zmc2V0X3kgPSAwOworCisgICAgTE9HRCgibnVtIG9mIHNyYyBzdHJlYW0gPSAlZCIsIHBTcmNDaGFubmVsLT5nZXROdW1PZlN0cmVhbXMoKSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFNyY0NoYW5uZWwtPmdldE51bU9mU3RyZWFtcygpOyBpKyspIHsKKyAgICAgICAgY2FtX3BwX2ZlYXR1cmVfY29uZmlnX3QgcHBfZmVhdHVyZW1hc2sgPSBmZWF0dXJlQ29uZmlnOworICAgICAgICBwU3RyZWFtID0gcFNyY0NoYW5uZWwtPmdldFN0cmVhbUJ5SW5kZXgoaSk7CisgICAgICAgIGlmIChwU3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXRvZmZsaW5lUkFXKCkgJiYgISgocFN0cmVhbS0+aXNUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1JBVykpCisgICAgICAgICAgICAgICAgICAgIHx8IChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVcpKQorICAgICAgICAgICAgICAgICAgICB8fCAocFN0cmVhbS0+aXNUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHBTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfUkFXKSkpKSB7CisgICAgICAgICAgICAgICAgLy9Ta2lwIGFsbCB0aGUgc3RyZWFtIG90aGVyIHRoYW4gUkFXIGFuZCBQT1NUVklFVyBpbmNhc2Ugb2Ygb2ZmbGluZSBvZiBSQVcKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9SQVcpCisgICAgICAgICAgICAgICAgICAgICYmICghcGFyYW0uZ2V0b2ZmbGluZVJBVygpKSkgeworICAgICAgICAgICAgICAgIC8vIFNraXAgcmF3IGZvciByZXByb2Nlc3Mgbm93IGJlY2F1c2UgUFAgbW9kdWxlIGNhbm5vdCBoYW5kbGUKKyAgICAgICAgICAgICAgICAvLyBtZXRhIGRhdGEmcmF3LiBNYXkgbmVlZCBmdXJ0aHVyIGRpc2N1c3Npb24gaWYgSW1hZ2luZ2xpYiBuZWVkIG1ldGEgZGF0YQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpKQorICAgICAgICAgICAgICAgICAgICAmJiAhKHBhcmFtLmdldE1hbnVhbENhcHR1cmVNb2RlKCkgPj0KKyAgICAgICAgICAgICAgICAgICAgQ0FNX01BTlVBTF9DQVBUVVJFX1RZUEVfMykpCisgICAgICAgICAgICAgICAgICAgIHx8IChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfQU5BTFlTSVMpKSkgeworICAgICAgICAgICAgICAgIC8vIFNraXAgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKSB8fAorICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVcpIHx8CisgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfUFJFVklFVykgfHwKKyAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+aXNPcmlnbmFsVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVykpIHsKKyAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgZmVhdHVyZV9tYXNrID0gZmVhdHVyZUNvbmZpZy5mZWF0dXJlX21hc2s7CisKKyAgICAgICAgICAgICAgICAvLyBza2lwIHRodW1ibmFpbCByZXByb2Nlc3NpbmcgaWYgbm90IG5lZWRlZAorICAgICAgICAgICAgICAgIGlmICghcGFyYW0ubmVlZFRodW1ibmFpbFJlcHJvY2VzcygmZmVhdHVyZV9tYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQ0FDLCBTSEFSUE5FU1MsIEZMSVAgYW5kIFdOUiB3b3VsZCBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkIC0KKyAgICAgICAgICAgICAgICAvLyBvbiBwcmV2aWV3L3Bvc3R2aWV3IHN0cmVhbSBpbiByZWFsdGltZS4KKyAgICAgICAgICAgICAgICAvLyBTbywgbmVlZCBub3QgYXBwbHkgYWdhaW4uCisgICAgICAgICAgICAgICAgZmVhdHVyZV9tYXNrICY9IH4oQ0FNX1FDT01fRkVBVFVSRV9ERU5PSVNFMkQgfAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9DQUMgfAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9TSEFSUE5FU1MgfAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9GTElQIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfUkFXX1BST0NFU1NJTkcpOworICAgICAgICAgICAgICAgIGlmICghZmVhdHVyZV9tYXNrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGh1bWJuYWlsIHN0cmVhbSByZXByb2Nlc3Npbmcgc2luY2Ugbm8gb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgLy9yZXByb2Nlc3NpbmcgaXMgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocFN0cmVhbS0+aXNUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBKSkgeworICAgICAgICAgICAgICAgIHBwX2ZlYXR1cmVtYXNrLmZlYXR1cmVfbWFzayA9IDA7CisgICAgICAgICAgICAgICAgcHBfZmVhdHVyZW1hc2suZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfTUVUQURBVEFfUFJPQ0VTU0lORzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcFN0cmVhbUluZm9CdWYgPSBhbGxvY2F0b3IuYWxsb2NhdGVTdHJlYW1JbmZvQnVmKENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0MpOworICAgICAgICAgICAgaWYgKHBTdHJlYW1JbmZvQnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJubyBtZW0gZm9yIHN0cmVhbSBpbmZvIGJ1ZiIpOworICAgICAgICAgICAgICAgIHJjID0gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdHJlYW1JbmZvID0gKGNhbV9zdHJlYW1faW5mb190ICopcFN0cmVhbUluZm9CdWYtPmdldFB0cigwKTsKKyAgICAgICAgICAgIG1lbXNldChzdHJlYW1JbmZvLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9pbmZvX3QpKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8tPnN0cmVhbV90eXBlID0gQ0FNX1NUUkVBTV9UWVBFX09GRkxJTkVfUFJPQzsKKyAgICAgICAgICAgIC8vIEVuYWJsZSBDUFAgaGlnaCBwZXJmb3JtYW5jZSBtb2RlIHRvIHB1dCBpdCBpbiB0dXJibyBmcmVxdWVuY3kgbW9kZSBmb3IKKyAgICAgICAgICAgIC8vIGJ1cnN0L2xvbmdzaG90L0hEUiBzbmFwc2hvdCBjYXNlcworICAgICAgICAgICAgc3RyZWFtSW5mby0+cGVyZl9tb2RlID0gQ0FNX1BFUkZfSElHSF9QRVJGT1JNQU5DRTsKKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXRvZmZsaW5lUkFXKCkgJiYgKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9SQVcpCisgICAgICAgICAgICAgICAgICAgIHx8IHBTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfUkFXKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocHBfZmVhdHVyZW1hc2suZmVhdHVyZV9tYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9RVUFEUkFfQ0ZBKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLmdldFN0cmVhbUZvcm1hdChDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DLCBzdHJlYW1JbmZvLT5mbXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8tPmZtdCA9IENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmMgPSBwU3RyZWFtLT5nZXRGb3JtYXQoc3RyZWFtSW5mby0+Zm10KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKSB8fAorICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVcpIHx8CisgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfUFJFVklFVykgfHwKKyAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+aXNPcmlnbmFsVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVykpIHsKKyAgICAgICAgICAgICAgICBpZiAocHBfZmVhdHVyZW1hc2suZmVhdHVyZV9tYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9TQ0FMRSkgeworICAgICAgICAgICAgICAgICAgICBwYXJhbS5nZXRUaHVtYm5haWxTaXplKCYoc3RyZWFtSW5mby0+ZGltLndpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0cmVhbUluZm8tPmRpbS5oZWlnaHQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5nZXRGcmFtZURpbWVuc2lvbihzdHJlYW1JbmZvLT5kaW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKChwYXJhbS5pc1Bvc3RQcm9jU2NhbGluZygpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHBwX2ZlYXR1cmVtYXNrLmZlYXR1cmVfbWFzayAmIENBTV9RQ09NX0ZFQVRVUkVfU0NBTEUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gcGFyYW0uZ2V0U3RyZWFtRGltZW5zaW9uKENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby0+ZGltKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChwYXJhbS5nZXRvZmZsaW5lUkFXKCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9SQVcpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHBTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfUkFXKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwYXJhbS5nZXRRdWFkcmFDZmEoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBwX2ZlYXR1cmVtYXNrLmZlYXR1cmVfbWFzayAmIENBTV9RQ09NX0ZFQVRVUkVfUVVBRFJBX0NGQSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBwU3RyZWFtLT5nZXRGcmFtZURpbWVuc2lvbihzdHJlYW1JbmZvLT5kaW0pOworICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmdldFN0cmVhbURpbWVuc2lvbihDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Qsc3RyZWFtSW5mby0+ZGltKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBwU3RyZWFtLT5nZXRGcmFtZURpbWVuc2lvbihzdHJlYW1JbmZvLT5kaW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBjb250U3RyZWFtICkgeworICAgICAgICAgICAgICAgIHN0cmVhbUluZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0NPTlRJTlVPVVM7CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby0+bnVtX29mX2J1cnN0ID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby0+c3RyZWFtaW5nX21vZGUgPSBDQU1fU1RSRUFNSU5HX01PREVfQlVSU1Q7CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby0+bnVtX29mX2J1cnN0ID0gYnVyc3ROdW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJlYW1JbmZvLT5udW1fYnVmcyA9IG1pblN0cmVhbUJ1Zk51bTsKKworICAgICAgICAgICAgY2FtX3N0cmVhbV9yZXByb2NfY29uZmlnX3QgcnBfY2ZnOworICAgICAgICAgICAgbWVtc2V0KCZycF9jZmcsIDAsIHNpemVvZihjYW1fc3RyZWFtX3JlcHJvY19jb25maWdfdCkpOworICAgICAgICAgICAgaWYgKG9mZmxpbmUpIHsKKyAgICAgICAgICAgICAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90IG9mZnNldDsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJm9mZnNldCwgMCwgc2l6ZW9mKGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QpKTsKKworICAgICAgICAgICAgICAgIHJwX2NmZy5wcF90eXBlID0gQ0FNX09GRkxJTkVfUkVQUk9DRVNTX1RZUEU7CisgICAgICAgICAgICAgICAgcFN0cmVhbS0+Z2V0Rm9ybWF0KHJwX2NmZy5vZmZsaW5lLmlucHV0X2ZtdCk7CisgICAgICAgICAgICAgICAgcFN0cmVhbS0+Z2V0RnJhbWVEaW1lbnNpb24ocnBfY2ZnLm9mZmxpbmUuaW5wdXRfZGltKTsKKyAgICAgICAgICAgICAgICBwU3RyZWFtLT5nZXRGcmFtZU9mZnNldChvZmZzZXQpOworICAgICAgICAgICAgICAgIHJwX2NmZy5vZmZsaW5lLmlucHV0X2J1Zl9wbGFuZXMucGxhbmVfaW5mbyA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICBycF9jZmcub2ZmbGluZS5pbnB1dF90eXBlID0gcFN0cmVhbS0+Z2V0TXlPcmlnaW5hbFR5cGUoKTsKKyAgICAgICAgICAgICAgICAvL0ZvciBpbnB1dCBtZXRhZGF0YSArIGlucHV0IGJ1ZmZlcgorICAgICAgICAgICAgICAgIHJwX2NmZy5vZmZsaW5lLm51bV9vZl9idWZzID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnBfY2ZnLnBwX3R5cGUgPSBDQU1fT05MSU5FX1JFUFJPQ0VTU19UWVBFOworICAgICAgICAgICAgICAgIHJwX2NmZy5vbmxpbmUuaW5wdXRfc3RyZWFtX2lkID0gcFN0cmVhbS0+Z2V0TXlTZXJ2ZXJJRCgpOworICAgICAgICAgICAgICAgIHJwX2NmZy5vbmxpbmUuaW5wdXRfc3RyZWFtX3R5cGUgPSBwU3RyZWFtLT5nZXRNeU9yaWdpbmFsVHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyYW0uZ2V0U3RyZWFtUm90YXRpb24oc3RyZWFtSW5mby0+c3RyZWFtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8tPnBwX2NvbmZpZywgc3RyZWFtSW5mby0+ZGltKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8tPnJlcHJvY2Vzc19jb25maWcgPSBycF9jZmc7CisgICAgICAgICAgICBzdHJlYW1JbmZvLT5yZXByb2Nlc3NfY29uZmlnLnBwX2ZlYXR1cmVfY29uZmlnID0gcHBfZmVhdHVyZW1hc2s7CisKKyAgICAgICAgICAgIGlmICghKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCkKKyAgICAgICAgICAgICAgICB8fCBwU3RyZWFtLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKQorICAgICAgICAgICAgICAgIHx8IHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9SQVcpCisgICAgICAgICAgICAgICAgfHwgcFN0cmVhbS0+aXNPcmlnbmFsVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9SQVcpKSkgeworICAgICAgICAgICAgICAgIC8vIENBQywgU0hBUlBORVNTLCBGTElQIGFuZCBXTlIgd291bGQgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCAtCisgICAgICAgICAgICAgICAgLy8gb24gcHJldmlldy9wb3N0dmlldyBzdHJlYW0gaW4gcmVhbHRpbWUuIE5lZWQgbm90IGFwcGx5IGFnYWluLgorICAgICAgICAgICAgICAgIHN0cmVhbUluZm8tPnJlcHJvY2Vzc19jb25maWcucHBfZmVhdHVyZV9jb25maWcuZmVhdHVyZV9tYXNrICY9CisgICAgICAgICAgICAgICAgICAgICAgICB+Q0FNX1FDT01fRkVBVFVSRV9DQUM7CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby0+cmVwcm9jZXNzX2NvbmZpZy5wcF9mZWF0dXJlX2NvbmZpZy5mZWF0dXJlX21hc2sgJj0KKyAgICAgICAgICAgICAgICAgICAgICAgIH5DQU1fUUNPTV9GRUFUVVJFX1NIQVJQTkVTUzsKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLT5yZXByb2Nlc3NfY29uZmlnLnBwX2ZlYXR1cmVfY29uZmlnLmZlYXR1cmVfbWFzayAmPQorICAgICAgICAgICAgICAgICAgICAgICAgfkNBTV9RQ09NX0ZFQVRVUkVfRkxJUDsKKyAgICAgICAgICAgICAgICAvL0Rvbid0IGRvIFdOUiBmb3IgdGh1bWJuYWlsCisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby0+cmVwcm9jZXNzX2NvbmZpZy5wcF9mZWF0dXJlX2NvbmZpZy5mZWF0dXJlX21hc2sgJj0KKyAgICAgICAgICAgICAgICAgICAgICAgIH5DQU1fUUNPTV9GRUFUVVJFX0RFTk9JU0UyRDsKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLT5yZXByb2Nlc3NfY29uZmlnLnBwX2ZlYXR1cmVfY29uZmlnLmZlYXR1cmVfbWFzayAmPQorICAgICAgICAgICAgICAgICAgICAgICAgfkNBTV9RQ09NX0ZFQVRVUkVfQ0RTOworICAgICAgICAgICAgICAgIHN0cmVhbUluZm8tPnJlcHJvY2Vzc19jb25maWcucHBfZmVhdHVyZV9jb25maWcuZmVhdHVyZV9tYXNrICY9CisgICAgICAgICAgICAgICAgICAgICAgICB+Q0FNX1FDT01fRkVBVFVSRV9EU0ROOworICAgICAgICAgICAgICAgIC8vTm8gbmVlZCBvZiBSQVcgcHJvY2Vzc2luZyBmb3Igb3RoZXIgdGhhbiBSQVcgc3RyZWFtcworICAgICAgICAgICAgICAgIHN0cmVhbUluZm8tPnJlcHJvY2Vzc19jb25maWcucHBfZmVhdHVyZV9jb25maWcuZmVhdHVyZV9tYXNrICY9CisgICAgICAgICAgICAgICAgICAgICAgICB+Q0FNX1FDT01fRkVBVFVSRV9SQVdfUFJPQ0VTU0lORzsKKworICAgICAgICAgICAgICAgIGlmIChwYXJhbS5pc0hEUkVuYWJsZWQoKQorICAgICAgICAgICAgICAgICAgJiYgIXBhcmFtLmlzSERSVGh1bWJuYWlsUHJvY2Vzc05lZWRlZCgpKXsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby0+cmVwcm9jZXNzX2NvbmZpZy5wcF9mZWF0dXJlX2NvbmZpZy5mZWF0dXJlX21hc2sKKyAgICAgICAgICAgICAgICAgICAgICAmPSB+Q0FNX1FDT01fRkVBVFVSRV9IRFI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCB0eXBlID0gQ0FNX1NUUkVBTV9UWVBFX0RFRkFVTFQ7CisgICAgICAgICAgICBpZiAob2ZmbGluZSkgeworICAgICAgICAgICAgICAgIHR5cGUgPSBzdHJlYW1JbmZvLT5yZXByb2Nlc3NfY29uZmlnLm9mZmxpbmUuaW5wdXRfdHlwZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IHN0cmVhbUluZm8tPnJlcHJvY2Vzc19jb25maWcub25saW5lLmlucHV0X3N0cmVhbV90eXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKSB7CisgICAgICAgICAgICAgICAgaW50IGZsaXBNb2RlID0gcGFyYW0uZ2V0RmxpcE1vZGUodHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKGZsaXBNb2RlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLT5yZXByb2Nlc3NfY29uZmlnLnBwX2ZlYXR1cmVfY29uZmlnLmZlYXR1cmVfbWFzayB8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfRkxJUDsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby0+cmVwcm9jZXNzX2NvbmZpZy5wcF9mZWF0dXJlX2NvbmZpZy5mbGlwID0gKHVpbnQzMl90KWZsaXBNb2RlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChzdHJlYW1JbmZvLT5yZXByb2Nlc3NfY29uZmlnLnBwX2ZlYXR1cmVfY29uZmlnLmZlYXR1cmVfbWFzaworICAgICAgICAgICAgICAgICAgICAmIENBTV9RQ09NX0ZFQVRVUkVfU0NBTEUpCisgICAgICAgICAgICAgICAgICAgICYmIHBhcmFtLmlzUmVwcm9jU2NhbGVFbmFibGVkKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgcGFyYW0uaXNVbmRlclJlcHJvY1NjYWxpbmcoKSkgeworICAgICAgICAgICAgICAgIC8vd2Ugb25seSBTY2FsZSBTbmFwc2hvdCBmcmFtZQorICAgICAgICAgICAgICAgIGlmIChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8tPmRpbS53aWR0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby0+cmVwcm9jZXNzX2NvbmZpZy5wcF9mZWF0dXJlX2NvbmZpZy5zY2FsZV9wYXJhbS5vdXRwdXRfd2lkdGg7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8tPmRpbS5oZWlnaHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUluZm8tPnJlcHJvY2Vzc19jb25maWcucHBfZmVhdHVyZV9jb25maWcuc2NhbGVfcGFyYW0ub3V0cHV0X2hlaWdodDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTE9HSCgic3RyZWFtIHdpZHRoPSVkLCBoZWlnaHQ9JWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLT5kaW0ud2lkdGgsIHN0cmVhbUluZm8tPmRpbS5oZWlnaHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzYXZlIHNvdXJjZSBzdHJlYW0gaGFuZGxlcgorICAgICAgICAgICAgbVNyY1N0cmVhbUhhbmRsZXNbbVN0cmVhbXMuc2l6ZSgpXSA9IHBTdHJlYW0tPmdldE15SGFuZGxlKCk7CisKKyAgICAgICAgICAgIHBNaXNjQnVmID0gYWxsb2NhdG9yLmFsbG9jYXRlTWlzY0J1ZihzdHJlYW1JbmZvKTsKKworICAgICAgICAgICAgTE9HSCgiQ29uZmlndXJlIFJlcHJvY2Vzc2luZzogc3RyZWFtID0gJWQsIHJlcyA9ICVkWCVkLCBmbXQgPSAlZCwgdHlwZSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+Z2V0TXlPcmlnaW5hbFR5cGUoKSwgc3RyZWFtSW5mby0+ZGltLndpZHRoLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLT5kaW0uaGVpZ2h0LCBzdHJlYW1JbmZvLT5mbXQsIHR5cGUpOworCisgICAgICAgICAgICAvLyBhZGQgcmVwcm9jZXNzIHN0cmVhbQorICAgICAgICAgICAgaWYgKHN0cmVhbUluZm8tPnJlcHJvY2Vzc19jb25maWcucHBfZmVhdHVyZV9jb25maWcuZmVhdHVyZV9tYXNrCisgICAgICAgICAgICAgICAgICAgICYgQ0FNX1FDT01fRkVBVFVSRV9ST1RBVElPTikgeworICAgICAgICAgICAgICAgIHJjID0gYWRkU3RyZWFtKGFsbG9jYXRvciwgcFN0cmVhbUluZm9CdWYsIHBNaXNjQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgbWluU3RyZWFtQnVmTnVtLCAmcGFkZGluZywgTlVMTCwgTlVMTCwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby0+cmVwcm9jZXNzX2NvbmZpZy5wcF9mZWF0dXJlX2NvbmZpZy5yb3RhdGlvbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJjID0gYWRkU3RyZWFtKGFsbG9jYXRvciwgcFN0cmVhbUluZm9CdWYsIHBNaXNjQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgbWluU3RyZWFtQnVmTnVtLCAmcGFkZGluZywgTlVMTCwgTlVMTCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR0UoImFkZCByZXByb2Nlc3Mgc3RyZWFtIGZhaWxlZCwgcmV0ID0gJWQiLCByYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbV9wU3JjQ2hhbm5lbCA9IHBTcmNDaGFubmVsOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0U3RyZWFtQnlTcm91Y2VIYW5kbGUKKyAqCisgKiBERVNDUklQVElPTjogZmluZCByZXByb2Nlc3Mgc3RyZWFtIGJ5IGl0cyBzb3VyY2Ugc3RyZWFtIGhhbmRsZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3JjSGFuZGxlIDogc291cmNlIHN0cmVhbSBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogcHRyIHRvIHJlcHJvY2VzcyBzdHJlYW0gaWYgZm91bmQuIE5VTEwgaWYgbm90IGZvdW5kCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFTdHJlYW0gKiBRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbDo6Z2V0U3RyZWFtQnlTcm91Y2VIYW5kbGUodWludDMyX3Qgc3JjSGFuZGxlKQoreworICAgIFFDYW1lcmFTdHJlYW0gKnBTdHJlYW0gPSBOVUxMOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobVNyY1N0cmVhbUhhbmRsZXNbaV0gPT0gc3JjSGFuZGxlKSB7CisgICAgICAgICAgICBwU3RyZWFtID0gbVN0cmVhbXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwU3RyZWFtOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0b3AKKyAqCisgKiBERVNDUklQVElPTjogc3RvcCBjaGFubmVsIGFuZCB1bm1hcCBvZmZsaW5lIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWw6OnN0b3AoKQoreworICAgIGludDMyX3QgcmMgPSBRQ2FtZXJhQ2hhbm5lbDo6c3RvcCgpOworCisgICAgaWYgKCFtT2ZmbGluZUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBRQ2FtZXJhU3RyZWFtICpzdHJlYW0gPSBOVUxMOworICAgICAgICBMaXN0PE9mZmxpbmVCdWZmZXI+OjppdGVyYXRvciBpdCA9IG1PZmZsaW5lQnVmZmVycy5iZWdpbigpOworICAgICAgICBpbnQgZXJyb3IgPSBOT19FUlJPUjsKKyAgICAgICAgZm9yKCA7IGl0ICE9IG1PZmZsaW5lQnVmZmVycy5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgc3RyZWFtID0gKCppdCkuc3RyZWFtOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gc3RyZWFtKSB7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBzdHJlYW0tPnVubWFwQnVmKCgqaXQpLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSk7CisgICAgICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IGVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIGR1cmluZyBvZmZsaW5lIGJ1ZmZlciB1bm1hcCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1PZmZsaW5lQnVmZmVycy5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZG9SZXByb2Nlc3NPZmZsaW5lCisgKgorICogREVTQ1JJUFRJT046IHJlcXVlc3QgdG8gZG8gb2ZmbGluZSByZXByb2Nlc3Mgb24gdGhlIGZyYW1lCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmcmFtZSAgIDogZnJhbWUgdG8gYmUgcGVyZm9ybWVkIGEgcmVwcm9jZXNzCisgKiAgIEBtZXRhX2J1ZiA6IE1ldGFkYXRhIGJ1ZmZlciBmb3IgcmVwcm9jZXNzaW5nCisgKiAgIEBwU3RyZWFtICA6IEFjdHVhbCByZXByb2Nlc3Mgc3RyZWFtCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbDo6ZG9SZXByb2Nlc3NPZmZsaW5lKG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lLAorICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICptZXRhX2J1ZiwgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSkKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBPZmZsaW5lQnVmZmVyIG1hcHBlZEJ1ZmZlcjsKKyAgICB1aW50MzJfdCBidWZfaW5kZXggPSAwOworICAgIHVpbnQzMl90IG1ldGFfYnVmX2luZGV4ID0gMDsKKworICAgIGlmICgoZnJhbWUgPT0gTlVMTCkgfHwgKG1ldGFfYnVmID09IE5VTEwpKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgSW5wdXQgUGFyYW10ZXJzIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7CisgICAgICAgIHBTdHJlYW0gPSBnZXRTdHJlYW1CeVNyb3VjZUhhbmRsZShmcmFtZS0+c3RyZWFtX2lkKTsKKyAgICAgICAgaWYgKHBTdHJlYW0gPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiSW5wdXQgdmFsaWRhdGlvbiBmYWlsZWQuIik7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1PZmZsaW5lQnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIExpc3Q8T2ZmbGluZUJ1ZmZlcj46Oml0ZXJhdG9yIGl0ID0gbU9mZmxpbmVCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIGZvciggOyBpdCAhPSBtT2ZmbGluZUJ1ZmZlcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIGJ1Zl9pbmRleCA9IChidWZfaW5kZXggPCAoKCppdCkuaW5kZXgpKSA/ICgoKml0KS5pbmRleCkgOiBidWZfaW5kZXg7CisgICAgICAgIH0KKyAgICAgICAgYnVmX2luZGV4ICs9IDE7CisgICAgfQorCisgICAgbWV0YV9idWZfaW5kZXggPSBidWZfaW5kZXg7CisgICAgaWYgKG1ldGFfYnVmICE9IE5VTEwpIHsKKyAgICAgICAgcmMgPSBwU3RyZWFtLT5tYXBCdWYoQ0FNX01BUFBJTkdfQlVGX1RZUEVfT0ZGTElORV9NRVRBX0JVRiwKKyAgICAgICAgICAgICAgICBtZXRhX2J1Zl9pbmRleCwKKyAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICBtZXRhX2J1Zi0+ZmQsCisgICAgICAgICAgICAgICAgbWV0YV9idWYtPmJ1ZmZlciwKKyAgICAgICAgICAgICAgICBtZXRhX2J1Zi0+ZnJhbWVfbGVuKTsKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjICkgeworICAgICAgICAgICAgTE9HRSgiRXJyb3IgZHVyaW5nIG1ldGFkYXRhIGJ1ZmZlciBtYXBwaW5nIik7CisgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisKKyAgICAgICAgbWFwcGVkQnVmZmVyLmluZGV4ID0gbWV0YV9idWZfaW5kZXg7CisgICAgICAgIG1hcHBlZEJ1ZmZlci5zdHJlYW0gPSBwU3RyZWFtOworICAgICAgICBtYXBwZWRCdWZmZXIudHlwZSA9IENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfTUVUQV9CVUY7CisgICAgICAgIG1PZmZsaW5lQnVmZmVycy5wdXNoX2JhY2sobWFwcGVkQnVmZmVyKTsKKyAgICAgICAgYnVmX2luZGV4ICs9IDE7CisgICAgfQorCisgICAgcmMgPSBwU3RyZWFtLT5tYXBCdWYoQ0FNX01BUFBJTkdfQlVGX1RZUEVfT0ZGTElORV9JTlBVVF9CVUYsCisgICAgICAgICAgICAgYnVmX2luZGV4LAorICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgIGZyYW1lLT5mZCwKKyAgICAgICAgICAgICBmcmFtZS0+YnVmZmVyLAorICAgICAgICAgICAgIGZyYW1lLT5mcmFtZV9sZW4pOworICAgIGlmIChOT19FUlJPUiAhPSByYyApIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgZHVyaW5nIHJlcHJvY2VzcyBpbnB1dCBidWZmZXIgbWFwcGluZyIpOworICAgICAgICByYyA9IC0xOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIG1hcHBlZEJ1ZmZlci5pbmRleCA9IGJ1Zl9pbmRleDsKKyAgICBtYXBwZWRCdWZmZXIuc3RyZWFtID0gcFN0cmVhbTsKKyAgICBtYXBwZWRCdWZmZXIudHlwZSA9IENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfSU5QVVRfQlVGOworICAgIG1PZmZsaW5lQnVmZmVycy5wdXNoX2JhY2sobWFwcGVkQnVmZmVyKTsKKworICAgIGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCBwYXJhbTsKKyAgICBtZW1zZXQoJnBhcmFtLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90KSk7CisKKyAgICBwYXJhbS50eXBlID0gQ0FNX1NUUkVBTV9QQVJBTV9UWVBFX0RPX1JFUFJPQ0VTUzsKKyAgICBwYXJhbS5yZXByb2Nlc3MuYnVmX2luZGV4ID0gYnVmX2luZGV4OworICAgIHBhcmFtLnJlcHJvY2Vzcy5mcmFtZV9pZHggPSBmcmFtZS0+ZnJhbWVfaWR4OworCisgICAgaWYgKG1ldGFfYnVmICE9IE5VTEwpIHsKKyAgICAgICAgcGFyYW0ucmVwcm9jZXNzLm1ldGFfcHJlc2VudCA9IDE7CisgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5tZXRhX2J1Zl9pbmRleCA9IG1ldGFfYnVmX2luZGV4OworICAgIH0KKworICAgIExPR0koIk9mZmxpbmUgcmVwcm9jZXNzaW5nIGlkID0gJWQgYnVmIElkID0gJWQgbWV0YSBpbmRleCA9ICVkIHR5cGUgPSAlZCIsCisgICAgICAgICAgICAgcGFyYW0ucmVwcm9jZXNzLmZyYW1lX2lkeCwgcGFyYW0ucmVwcm9jZXNzLmJ1Zl9pbmRleCwKKyAgICAgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5tZXRhX2J1Zl9pbmRleCwgcFN0cmVhbS0+Z2V0TXlPcmlnaW5hbFR5cGUoKSk7CisKKyAgICByYyA9IHBTdHJlYW0tPnNldFBhcmFtZXRlcihwYXJhbSk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoInN0cmVhbSBzZXRQYXJhbWV0ZXIgZm9yIHJlcHJvY2VzcyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZG9SZXByb2Nlc3NPZmZsaW5lCisgKgorICogREVTQ1JJUFRJT046IHJlcXVlc3QgdG8gZG8gb2ZmbGluZSByZXByb2Nlc3Mgb24gdGhlIGZyYW1lCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmcmFtZSAgIDogZnJhbWUgdG8gYmUgcGVyZm9ybWVkIGEgcmVwcm9jZXNzCisgKiAgIEBtZXRhX2J1ZiA6IE1ldGFkYXRhIGJ1ZmZlciBmb3IgcmVwcm9jZXNzaW5nCisgKiAgIEBtUGFyYW1ldGVyIDogY2FtZXJhIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFSZXByb2Nlc3NDaGFubmVsOjpkb1JlcHJvY2Vzc09mZmxpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSwKKyAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqbWV0YV9idWYsIFFDYW1lcmFQYXJhbWV0ZXJzSW50ZiAmbVBhcmFtZXRlcikKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0gTlVMTDsKKworICAgIGlmIChtU3RyZWFtcy5zaXplKCkgPCAxKSB7CisgICAgICAgIExPR0UoIk5vIHJlcHJvY2VzcyBzdHJlYW1zIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG1fcFNyY0NoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJObyBzb3VyY2UgY2hhbm5lbCBmb3IgcmVwcm9jZXNzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoZnJhbWUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHNvdXJjZSBmcmFtZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmcmFtZS0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICBwU3RyZWFtID0gZ2V0U3RyZWFtQnlTcm91Y2VIYW5kbGUoZnJhbWUtPmJ1ZnNbaV0tPnN0cmVhbV9pZCk7CisgICAgICAgIGlmICgocFN0cmVhbSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAgIChtX2hhbmRsZSA9PSBwU3RyZWFtLT5nZXRDaGFubmVsSGFuZGxlKCkpKSB7CisgICAgICAgICAgICBpZiAobVBhcmFtZXRlci5nZXRvZmZsaW5lUkFXKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgISgocFN0cmVhbS0+aXNPcmlnbmFsVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9SQVcpKQorICAgICAgICAgICAgICAgICAgICB8fCAocFN0cmVhbS0+aXNPcmlnbmFsVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSkpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHBTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpCisgICAgICAgICAgICAgICAgICAgICAmJiAobVBhcmFtZXRlci5nZXRNYW51YWxDYXB0dXJlTW9kZSgpCisgICAgICAgICAgICAgICAgICAgICA8IENBTV9NQU5VQUxfQ0FQVFVSRV9UWVBFXzMpKQorICAgICAgICAgICAgICAgICAgICAgfHwgKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUykpKSB7CisgICAgICAgICAgICAgICAgLy8gU2tpcCBtZXRhZGF0YSBmb3IgcmVwcm9jZXNzIG5vdyBiZWNhdXNlIFBQIG1vZHVsZSBjYW5ub3QgaGFuZGxlIG1ldGEgZGF0YQorICAgICAgICAgICAgICAgIC8vIE1heSBuZWVkIGZ1cnRodXIgZGlzY3Vzc2lvbiBpZiBJbWFnaW5nbGliIG5lZWQgbWV0YSBkYXRhCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSBNZXRhZGF0YQorICAgICAgICAgICAgaWYgKG1ldGFfYnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQgPSBmcmFtZS0+YnVmc1tpXS0+c3RyZWFtX2lkOworICAgICAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnNyY1N0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3BTcmNDaGFubmVsLT5nZXRTdHJlYW1CeUhhbmRsZShzdHJlYW1faWQpOworICAgICAgICAgICAgICAgIG1ldGFkYXRhX2J1ZmZlcl90ICpwTWV0YURhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhX2J1ZmZlcl90ICopbWV0YV9idWYtPmJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBpZiAoKE5VTEwgIT0gcE1ldGFEYXRhKSAmJiAoTlVMTCAhPSBzcmNTdHJlYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9jcm9wX2RhdGFfdCwgY3JvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0NST1BfREFUQSwgcE1ldGFEYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTUFYX05VTV9TVFJFQU1TID4gY3JvcC0+bnVtX29mX3N0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IE1BWF9OVU1fU1RSRUFNUzsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcm9wLT5jcm9wX2luZm9bal0uc3RyZWFtX2lkID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1N0cmVhbS0+Z2V0TXlTZXJ2ZXJJRCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSBjcm9wL3JvaSBpbmZvcm1hdGlvbiBmb3Igb2ZmbGluZSByZXByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSByZXByb2Nlc3Mgc3RyZWFtIHNsb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3AtPmNyb3BfaW5mb1tjcm9wLT5udW1fb2Zfc3RyZWFtc10uY3JvcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3AtPmNyb3BfaW5mb1tqXS5jcm9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcC0+Y3JvcF9pbmZvW2Nyb3AtPm51bV9vZl9zdHJlYW1zXS5yb2lfbWFwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcC0+Y3JvcF9pbmZvW2pdLnJvaV9tYXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQ4X3QgayA9IDA7IGsgPCBtU3RyZWFtcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNTdHJlYW0tPmdldE15VHlwZSgpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1trXS0+Z2V0TXlPcmlnaW5hbFR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wLT5jcm9wX2luZm9bY3JvcC0+bnVtX29mX3N0cmVhbXNdLnN0cmVhbV9pZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNba10tPmdldE15U2VydmVySUQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcC0+bnVtX29mX3N0cmVhbXMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJObyBzcGFjZSB0byBhZGQgcmVwcm9jZXNzIHN0cmVhbSBjcm9wL3JvaSBpbmZvcm1hdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IGRvUmVwcm9jZXNzT2ZmbGluZSAoZnJhbWUtPmJ1ZnNbaV0sIG1ldGFfYnVmLCBwU3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZG9SZXByb2Nlc3MKKyAqCisgKiBERVNDUklQVElPTjogcmVxdWVzdCB0byBkbyBhIHJlcHJvY2VzcyBvbiB0aGUgZnJhbWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZyYW1lICAgOiBmcmFtZSB0byBiZSBwZXJmb3JtZWQgYSByZXByb2Nlc3MKKyAqICAgQG1QYXJhbWV0ZXIgOiBjYW1lcmEgcGFyYW1ldGVycworICogICBAcE1ldGFTdHJlYW06IE1ldGFkYXRhIHN0cmVhbSBoYW5kbGUKKyAqICAgQG1ldGFfYnVmX2luZGV4IDogTWV0YWRhdGEgYnVmZmVyIGluZGV4CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbDo6ZG9SZXByb2Nlc3MobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSwKKyAgICAgICAgUUNhbWVyYVBhcmFtZXRlcnNJbnRmICZtUGFyYW1ldGVyLCBRQ2FtZXJhU3RyZWFtICpwTWV0YVN0cmVhbSwKKyAgICAgICAgdWludDhfdCBtZXRhX2J1Zl9pbmRleCkKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBpZiAobVN0cmVhbXMuc2l6ZSgpIDwgMSkgeworICAgICAgICBMT0dFKCJObyByZXByb2Nlc3Mgc3RyZWFtcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChtX3BTcmNDaGFubmVsID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiTm8gc291cmNlIGNoYW5uZWwgZm9yIHJlcHJvY2VzcyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKHBNZXRhU3RyZWFtID09IE5VTEwpIHsKKyAgICAgICAgTE9HVygiTnVsbCBNZXRhZGF0YSBidWZmZXIgZm9yIHByb2Nlc3NpbmciKTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZnJhbWUtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9IGdldFN0cmVhbUJ5U3JvdWNlSGFuZGxlKGZyYW1lLT5idWZzW2ldLT5zdHJlYW1faWQpOworICAgICAgICBpZiAoKHBTdHJlYW0gIT0gTlVMTCkgJiYgKG1faGFuZGxlID09IHBTdHJlYW0tPmdldENoYW5uZWxIYW5kbGUoKSkpIHsKKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVyLmdldG9mZmxpbmVSQVcoKSAmJiAhKChwU3RyZWFtLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1JBVykpCisgICAgICAgICAgICAgICAgICAgIHx8IChwU3RyZWFtLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1BPU1RWSUVXKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHBTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpKSkpIHsKKyAgICAgICAgICAgICAgICAvL1NraXAgYWxsIHRoZSBzdHJlYW0gb3RoZXIgdGhhbiBSQVcgYW5kIFBPU1RWSUVXIGluY2FzZSBvZiBvZmZsaW5lIG9mIFJBVworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChwU3RyZWFtLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBKQorICAgICAgICAgICAgICAgICAgICAgJiYgKG1QYXJhbWV0ZXIuZ2V0TWFudWFsQ2FwdHVyZU1vZGUoKQorICAgICAgICAgICAgICAgICAgICAgPCBDQU1fTUFOVUFMX0NBUFRVUkVfVFlQRV8zKSkKKyAgICAgICAgICAgICAgICAgICAgIHx8IChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfQU5BTFlTSVMpKSkgeworICAgICAgICAgICAgICAgIC8vIFNraXAgbWV0YWRhdGEgZm9yIHJlcHJvY2VzcyBub3cgYmVjYXVzZSBQUCBtb2R1bGUgY2Fubm90IGhhbmRsZSBtZXRhIGRhdGEKKyAgICAgICAgICAgICAgICAvLyBNYXkgbmVlZCBmdXJ0aHVyIGRpc2N1c3Npb24gaWYgSW1hZ2luZ2xpYiBuZWVkIG1ldGEgZGF0YQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgcGFyYW07CisgICAgICAgICAgICBtZW1zZXQoJnBhcmFtLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90KSk7CisgICAgICAgICAgICBwYXJhbS50eXBlID0gQ0FNX1NUUkVBTV9QQVJBTV9UWVBFX0RPX1JFUFJPQ0VTUzsKKyAgICAgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5idWZfaW5kZXggPSBmcmFtZS0+YnVmc1tpXS0+YnVmX2lkeDsKKyAgICAgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5mcmFtZV9pZHggPSBmcmFtZS0+YnVmc1tpXS0+ZnJhbWVfaWR4OworICAgICAgICAgICAgaWYgKHBNZXRhU3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIG1ldGEgZGF0YSBmcmFtZSBidW5kbGVkLCBzZW50IHRvZ2V0aGVyIHdpdGggcmVwcm9jZXNzIGZyYW1lCisgICAgICAgICAgICAgICAgcGFyYW0ucmVwcm9jZXNzLm1ldGFfcHJlc2VudCA9IDE7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVwcm9jZXNzLm1ldGFfc3RyZWFtX2hhbmRsZSA9IHBNZXRhU3RyZWFtLT5nZXRNeVNlcnZlcklEKCk7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVwcm9jZXNzLm1ldGFfYnVmX2luZGV4ID0gbWV0YV9idWZfaW5kZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExPR0koIk9ubGluZSByZXByb2Nlc3NpbmcgaWQgPSAlZCBidWYgSWQgPSAlZCBtZXRhIGluZGV4ID0gJWQgdHlwZSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5mcmFtZV9pZHgsIHBhcmFtLnJlcHJvY2Vzcy5idWZfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5tZXRhX2J1Zl9pbmRleCwgcFN0cmVhbS0+Z2V0TXlPcmlnaW5hbFR5cGUoKSk7CisKKyAgICAgICAgICAgIHJjID0gcFN0cmVhbS0+c2V0UGFyYW1ldGVyKHBhcmFtKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR0UoInN0cmVhbSBzZXRQYXJhbWV0ZXIgZm9yIHJlcHJvY2VzcyBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZG9SZXByb2Nlc3MKKyAqCisgKiBERVNDUklQVElPTjogcmVxdWVzdCB0byBkbyBhIHJlcHJvY2VzcyBvbiB0aGUgZnJhbWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJ1Zl9mZCAgICAgOiBmZCB0byB0aGUgaW5wdXQgYnVmZmVyIHRoYXQgbmVlZHMgcmVwcm9jZXNzCisgKiAgIEBidWZmZXIgICAgIDogYnVmZmVyIHBvaW50ZXIgb2YgYWN0dWFsIGJ1ZmZlcgorICogICBAYnVmX2xlbmdodCA6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyCisgKiAgIEByZXRfdmFsICAgIDogcmVzdWx0IG9mIHJlcHJvY2Vzcy4KKyAqICAgICAgICAgICAgICAgICBFeGFtcGxlOiBDb3VsZCBiZSBmYWNlSUQgaW4gY2FzZSBvZiByZWdpc3RlciBmYWNlIGltYWdlLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWw6OmRvUmVwcm9jZXNzKGludCBidWZfZmQsIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgc2l6ZV90IGJ1Zl9sZW5ndGgsIGludDMyX3QgJnJldF92YWwpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgaWYgKG1TdHJlYW1zLnNpemUoKSA8IDEpIHsKKyAgICAgICAgTE9HRSgiTm8gcmVwcm9jZXNzIHN0cmVhbXMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHVpbnQzMl90IGJ1Zl9pZHggPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKChtU3RyZWFtc1tpXSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAgIChtX2hhbmRsZSAhPSBtU3RyZWFtc1tpXS0+Z2V0Q2hhbm5lbEhhbmRsZSgpKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBtU3RyZWFtc1tpXS0+bWFwQnVmKENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfSU5QVVRfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX2lkeCwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfZmQsIGJ1ZmZlciwgYnVmX2xlbmd0aCk7CisKKyAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgcGFyYW07CisgICAgICAgICAgICBtZW1zZXQoJnBhcmFtLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90KSk7CisgICAgICAgICAgICBwYXJhbS50eXBlID0gQ0FNX1NUUkVBTV9QQVJBTV9UWVBFX0RPX1JFUFJPQ0VTUzsKKyAgICAgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5idWZfaW5kZXggPSBidWZfaWR4OworICAgICAgICAgICAgcmMgPSBtU3RyZWFtc1tpXS0+c2V0UGFyYW1ldGVyKHBhcmFtKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldF92YWwgPSBwYXJhbS5yZXByb2Nlc3MucmV0X3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdHJlYW1zW2ldLT51bm1hcEJ1ZihDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX0lOUFVUX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfaWR4LCAtMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhQ2hhbm5lbC5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhQ2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MTEyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFDaGFubmVsLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1FDQU1FUkFfQ0hBTk5FTF9IX18KKyNkZWZpbmUgX19RQ0FNRVJBX0NIQU5ORUxfSF9fCisKKyNpbmNsdWRlICJjYW1lcmEuaCIKKyNpbmNsdWRlICJRQ2FtZXJhTWVtLmgiCisjaW5jbHVkZSAiUUNhbWVyYVBhcmFtZXRlcnMuaCIKKyNpbmNsdWRlICJRQ2FtZXJhU3RyZWFtLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKK30KKworbmFtZXNwYWNlIHFjYW1lcmEgeworCitjbGFzcyBRQ2FtZXJhQ2hhbm5lbAoreworcHVibGljOgorICAgIFFDYW1lcmFDaGFubmVsKHVpbnQzMl90IGNhbV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzKTsKKyAgICBRQ2FtZXJhQ2hhbm5lbCgpOworICAgIHZpcnR1YWwgflFDYW1lcmFDaGFubmVsKCk7CisgICAgdmlydHVhbCBpbnQzMl90IGluaXQobW1fY2FtZXJhX2NoYW5uZWxfYXR0cl90ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfbm90aWZ5X3QgZGF0YUNCLCAvLyBkYXRhIENCIGZvciBjaGFubmVsIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSk7CisgICAgLy8gT3duZXIgb2YgbWVtb3J5IGlzIHRyYW5zZmVycmVkIGZyb20gdGhlIGNhbGxlciB0byB0aGUgY2FsbGVyIHdpdGggdGhpcyBjYWxsLgorICAgIHZpcnR1YWwgaW50MzJfdCBhZGRTdHJlYW0oUUNhbWVyYUFsbG9jYXRvciYgYWxsb2NhdG9yLAorICAgICAgICAgICAgUUNhbWVyYUhlYXBNZW1vcnkgKnN0cmVhbUluZm9CdWYsIFFDYW1lcmFIZWFwTWVtb3J5ICptaXNjQnVmLAorICAgICAgICAgICAgdWludDhfdCBtaW5TdHJlYW1CdWZudW0sIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sCisgICAgICAgICAgICBzdHJlYW1fY2Jfcm91dGluZSBzdHJlYW1fY2IsIHZvaWQgKnVzZXJkYXRhLCBib29sIGJEeW5BbGxvY0J1ZiwKKyAgICAgICAgICAgIGJvb2wgYkRlZmZBbGxvYyA9IGZhbHNlLCBjYW1fcm90YXRpb25fdCBvbmxpbmVfcm90YXRpb24gPSBST1RBVEVfMCk7CisgICAgdmlydHVhbCBpbnQzMl90IGxpbmtTdHJlYW0oUUNhbWVyYUNoYW5uZWwgKmNoLCBRQ2FtZXJhU3RyZWFtICpzdHJlYW0pOworICAgIHZpcnR1YWwgaW50MzJfdCBzdGFydCgpOworICAgIHZpcnR1YWwgaW50MzJfdCBzdG9wKCk7CisgICAgdmlydHVhbCBpbnQzMl90IGJ1ZkRvbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSk7CisgICAgdmlydHVhbCBpbnQzMl90IGJ1ZkRvbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSwgdWludDMyX3Qgc3RyZWFtX2lkKTsKKyAgICB2aXJ0dWFsIGludDMyX3QgcHJvY2Vzc1pvb21Eb25lKHByZXZpZXdfc3RyZWFtX29wc190ICpwcmV2aWV3V2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2Nyb3BfZGF0YV90ICZjcm9wX2luZm8pOworICAgIFFDYW1lcmFTdHJlYW0gKmdldFN0cmVhbUJ5SGFuZGxlKHVpbnQzMl90IHN0cmVhbUhhbmRsZSk7CisgICAgdWludDMyX3QgZ2V0TXlIYW5kbGUoKSBjb25zdCB7cmV0dXJuIG1faGFuZGxlO307CisgICAgdWludDMyX3QgZ2V0TnVtT2ZTdHJlYW1zKCkgY29uc3Qge3JldHVybiAodWludDMyX3QpIG1TdHJlYW1zLnNpemUoKTt9OworICAgIFFDYW1lcmFTdHJlYW0gKmdldFN0cmVhbUJ5SW5kZXgodWludDMyX3QgaW5kZXgpOworICAgIFFDYW1lcmFTdHJlYW0gKmdldFN0cmVhbUJ5U2VydmVySUQodWludDMyX3Qgc2VydmVySUQpOworICAgIGludDMyX3QgVXBkYXRlU3RyZWFtQmFzZWRQYXJhbWV0ZXJzKFFDYW1lcmFQYXJhbWV0ZXJzSW50ZiAmcGFyYW0pOworICAgIHZvaWQgZGVsZXRlQ2hhbm5lbCgpOworICAgIGludDMyX3Qgc2V0U3RyZWFtU3luY0NCIChjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwKKyAgICAgICAgICAgIHN0cmVhbV9jYl9yb3V0aW5lIHN0cmVhbV9jYik7CisgICAgYm9vbCBpc0FjdGl2ZSgpIHsgcmV0dXJuIG1fYklzQWN0aXZlOyB9Citwcm90ZWN0ZWQ6CisgICAgdWludDMyX3QgbV9jYW1IYW5kbGU7CisgICAgbW1fY2FtZXJhX29wc190ICptX2NhbU9wczsKKyAgICBib29sIG1fYklzQWN0aXZlOworICAgIGJvb2wgbV9iQWxsb3dEeW5CdWZBbGxvYzsgLy8gaWYgYnVmIGFsbG9jYXRpb24gY2FuIGJlIGluIHR3byBzdGVwcworCisgICAgdWludDMyX3QgbV9oYW5kbGU7CisgICAgVmVjdG9yPFFDYW1lcmFTdHJlYW0gKj4gbVN0cmVhbXM7CisgICAgbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCBtRGF0YUNCOworICAgIHZvaWQgKm1Vc2VyRGF0YTsKK307CisKKy8vIGJ1cnN0IHBpYyBjaGFubmVsOiBpLmUuIHpzbCBidXJzdCBtb2RlCitjbGFzcyBRQ2FtZXJhUGljQ2hhbm5lbCA6IHB1YmxpYyBRQ2FtZXJhQ2hhbm5lbAoreworcHVibGljOgorICAgIFFDYW1lcmFQaWNDaGFubmVsKHVpbnQzMl90IGNhbV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzKTsKKyAgICBRQ2FtZXJhUGljQ2hhbm5lbCgpOworICAgIHZpcnR1YWwgflFDYW1lcmFQaWNDaGFubmVsKCk7CisgICAgaW50MzJfdCB0YWtlUGljdHVyZShtbV9jYW1lcmFfcmVxX2J1Zl90ICpidWYpOworICAgIGludDMyX3QgY2FuY2VsUGljdHVyZSgpOworICAgIGludDMyX3Qgc3RvcEFkdmFuY2VkQ2FwdHVyZShtbV9jYW1lcmFfYWR2YW5jZWRfY2FwdHVyZV90IHR5cGUpOworICAgIGludDMyX3Qgc3RhcnRBZHZhbmNlZENhcHR1cmUobW1fY2FtZXJhX2FkdmFuY2VkX2NhcHR1cmVfdCB0eXBlLAorICAgICAgICAgICAgY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QgKmNvbmZpZyA9IE5VTEwpOworICAgIGludDMyX3QgZmx1c2hTdXBlcmJ1ZmZlcih1aW50MzJfdCBmcmFtZV9pZHgpOworfTsKKworLy8gdmlkZW8gY2hhbm5lbCBjbGFzcworY2xhc3MgUUNhbWVyYVZpZGVvQ2hhbm5lbCA6IHB1YmxpYyBRQ2FtZXJhQ2hhbm5lbAoreworcHVibGljOgorICAgIFFDYW1lcmFWaWRlb0NoYW5uZWwodWludDMyX3QgY2FtX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtX29wcyk7CisgICAgUUNhbWVyYVZpZGVvQ2hhbm5lbCgpOworICAgIHZpcnR1YWwgflFDYW1lcmFWaWRlb0NoYW5uZWwoKTsKKyAgICBpbnQzMl90IHRha2VQaWN0dXJlKG1tX2NhbWVyYV9yZXFfYnVmX3QgKmJ1Zik7CisgICAgaW50MzJfdCBjYW5jZWxQaWN0dXJlKCk7CisgICAgaW50MzJfdCByZWxlYXNlRnJhbWUoY29uc3Qgdm9pZCAqb3BhcXVlLCBib29sIGlzTWV0YURhdGEpOworfTsKKworLy8gcmVwcm9jZXNzIGNoYW5uZWwgY2xhc3MKK2NsYXNzIFFDYW1lcmFSZXByb2Nlc3NDaGFubmVsIDogcHVibGljIFFDYW1lcmFDaGFubmVsCit7CitwdWJsaWM6CisgICAgUUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWwodWludDMyX3QgY2FtX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMpOworICAgIFFDYW1lcmFSZXByb2Nlc3NDaGFubmVsKCk7CisgICAgdmlydHVhbCB+UUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWwoKTsKKyAgICBpbnQzMl90IGFkZFJlcHJvY1N0cmVhbXNGcm9tU291cmNlKFFDYW1lcmFBbGxvY2F0b3ImIGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9wcF9mZWF0dXJlX2NvbmZpZ190ICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhQ2hhbm5lbCAqcFNyY0NoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1pblN0cmVhbUJ1Zk51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVyc3ROdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYVBhcmFtZXRlcnNJbnRmICZwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29udFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb2ZmbGluZSk7CisgICAgLy8gb25saW5lIHJlcHJvY2VzcworICAgIGludDMyX3QgZG9SZXByb2Nlc3MobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSwKKyAgICAgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzSW50ZiAmcGFyYW0sIFFDYW1lcmFTdHJlYW0gKnBNZXRhU3RyZWFtLAorICAgICAgICAgICAgdWludDhfdCBtZXRhX2J1Zl9pbmRleCk7CisKKyAgICAvLyBvZmZsaW5lIHJlcHJvY2VzcworICAgIGludDMyX3QgZG9SZXByb2Nlc3MoaW50IGJ1Zl9mZCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmX2xlbmd0aCwgaW50MzJfdCAmcmV0X3ZhbCk7CisKKyAgICBpbnQzMl90IGRvUmVwcm9jZXNzT2ZmbGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lLAorICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1ldGFfYnVmLCBRQ2FtZXJhUGFyYW1ldGVyc0ludGYgJnBhcmFtKTsKKworICAgIGludDMyX3QgZG9SZXByb2Nlc3NPZmZsaW5lKG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lLAorICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1ldGFfYnVmLCBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0gTlVMTCk7CisKKyAgICBpbnQzMl90IHN0b3AoKTsKKyAgICBRQ2FtZXJhQ2hhbm5lbCAqZ2V0U3JjQ2hhbm5lbCgpe3JldHVybiBtX3BTcmNDaGFubmVsO307CisgICAgaW50OF90IGdldFJlcHJvY0NvdW50KCl7cmV0dXJuIG1QYXNzQ291bnQ7fTsKKyAgICB2b2lkIHNldFJlcHJvY0NvdW50KGludDhfdCBjb3VudCkge21QYXNzQ291bnQgPSBjb3VudDt9OworCitwcml2YXRlOgorICAgIFFDYW1lcmFTdHJlYW0gKmdldFN0cmVhbUJ5U3JvdWNlSGFuZGxlKHVpbnQzMl90IHNyY0hhbmRsZSk7CisKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFFDYW1lcmFTdHJlYW0gKnN0cmVhbTsKKyAgICAgICAgY2FtX21hcHBpbmdfYnVmX3R5cGUgdHlwZTsKKyAgICAgICAgdWludDMyX3QgaW5kZXg7CisgICAgfSBPZmZsaW5lQnVmZmVyOworCisgICAgdWludDMyX3QgbVNyY1N0cmVhbUhhbmRsZXNbTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFXTsKKyAgICBRQ2FtZXJhQ2hhbm5lbCAqbV9wU3JjQ2hhbm5lbDsgLy8gcHRyIHRvIHNvdXJjZSBjaGFubmVsIGZvciByZXByb2Nlc3MKKyAgICBhbmRyb2lkOjpMaXN0PE9mZmxpbmVCdWZmZXI+IG1PZmZsaW5lQnVmZmVyczsKKyAgICBpbnQ4X3QgbVBhc3NDb3VudDsKK307CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCisKKyNlbmRpZiAvKiBfX1FDQU1FUkFfQ0hBTk5FTF9IX18gKi8KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYU1lbS5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFNZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhODA1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFNZW0uY3BwCkBAIC0wLDAgKzEsMjQ5NiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworI2RlZmluZSBMT0dfVEFHICJRQ2FtZXJhSFdJX01lbSIKKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNkZWZpbmUgTU1BTl9IIDxTWVNURU1fSEVBREVSX1BSRUZJWC9tbWFuLmg+CisjaW5jbHVkZSBNTUFOX0gKKyNpbmNsdWRlICJncmFsbG9jLmgiCisjaW5jbHVkZSAiZ3JhbGxvY19wcml2LmgiCisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJRQ2FtZXJhMkhXSS5oIgorI2luY2x1ZGUgIlFDYW1lcmFNZW0uaCIKKyNpbmNsdWRlICJRQ2FtZXJhUGFyYW1ldGVycy5oIgorI2luY2x1ZGUgIlFDYW1lcmFUcmFjZS5oIgorCisvLyBNZWRpYSBkZXBlbmRlbmNpZXMKKyNpZmRlZiBVU0VfTUVESUFfRVhURU5TSU9OUworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+Cit0eXBlZGVmIHN0cnVjdCBWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhIG1lZGlhX21ldGFkYXRhX2J1ZmZlcjsKKyNlbHNlCisjaW5jbHVkZSAiUUNvbU9NWE1ldGFkYXRhLmgiCit0eXBlZGVmIHN0cnVjdCBlbmNvZGVyX21lZGlhX2J1ZmZlcl90eXBlIG1lZGlhX21ldGFkYXRhX2J1ZmZlcjsKKyNlbmRpZgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJtbV9jYW1lcmFfZGJnLmgiCisjaW5jbHVkZSAibW1fY2FtZXJhX2ludGVyZmFjZS5oIgorfQorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisvLyBRQ2FlbXJhMk1lbW9yeSBiYXNlIGNsYXNzCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYU1lbW9yeQorICoKKyAqIERFU0NSSVBUSU9OOiBkZWZhdWx0IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmFNZW1vcnkKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhY2hlZCAgOiBmbGFnIGluZGljYXRlcyBpZiB1c2luZyBjYWNoZWQgbWVtb3J5CisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYU1lbW9yeTo6UUNhbWVyYU1lbW9yeShib29sIGNhY2hlZCwKKyAgICAgICAgUUNhbWVyYU1lbW9yeVBvb2wgKnBvb2wsCisgICAgICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIFFDYW1lcmFNZW1UeXBlIGJ1ZlR5cGUpCisgICAgOm1fYkNhY2hlZChjYWNoZWQpLAorICAgICBtTWVtb3J5UG9vbChwb29sKSwKKyAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCisgICAgIG1CdWZUeXBlKGJ1ZlR5cGUpCit7CisgICAgbUJ1ZmZlckNvdW50ID0gMDsKKyAgICByZXNldCgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhTWVtb3J5CisgKgorICogREVTQ1JJUFRJT046IGRlY29uc3RydWN0b3Igb2YgUUNhbWVyYU1lbW9yeQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYU1lbW9yeTo6flFDYW1lcmFNZW1vcnkoKQoreworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhY2hlT3BzSW50ZXJuYWwKKyAqCisgKiBERVNDUklQVElPTjogaW9uIHJlbGF0ZWQgbWVtb3J5IGNhY2hlIG9wZXJhdGlvbnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKiAgIEBjbWQgICAgIDogY2FjaGUgb3BzIGNvbW1hbmQKKyAqICAgQHZhZGRyICAgOiBwdHIgdG8gdGhlIHZpcnR1YWwgYWRkcmVzcworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhTWVtb3J5OjpjYWNoZU9wc0ludGVybmFsKHVpbnQzMl90IGluZGV4LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICp2YWRkcikKK3sKKyAgICBpZiAoIW1fYkNhY2hlZCkgeworICAgICAgICAvLyBNZW1vcnkgaXMgbm90IGNhY2hlZCwgbm8gbmVlZCBmb3IgY2FjaGUgb3BzCisgICAgICAgIExPR0QoIk5vIGNhY2hlIG9wcyBoZXJlIGZvciB1bmNhY2hlZCBtZW1vcnkiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0cnVjdCBpb25fZmx1c2hfZGF0YSBjYWNoZV9pbnZfZGF0YTsKKyAgICBzdHJ1Y3QgaW9uX2N1c3RvbV9kYXRhIGN1c3RvbV9kYXRhOworICAgIGludCByZXQgPSBPSzsKKworICAgIGlmIChpbmRleCA+PSBtQnVmZmVyQ291bnQpIHsKKyAgICAgICAgTE9HRSgiaW5kZXggJWQgb3V0IG9mIGJvdW5kIFswLCAlZCkiLCBpbmRleCwgbUJ1ZmZlckNvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBtZW1zZXQoJmNhY2hlX2ludl9kYXRhLCAwLCBzaXplb2YoY2FjaGVfaW52X2RhdGEpKTsKKyAgICBtZW1zZXQoJmN1c3RvbV9kYXRhLCAwLCBzaXplb2YoY3VzdG9tX2RhdGEpKTsKKyAgICBjYWNoZV9pbnZfZGF0YS52YWRkciA9IHZhZGRyOworICAgIGNhY2hlX2ludl9kYXRhLmZkID0gbU1lbUluZm9baW5kZXhdLmZkOworICAgIGNhY2hlX2ludl9kYXRhLmhhbmRsZSA9IG1NZW1JbmZvW2luZGV4XS5oYW5kbGU7CisgICAgY2FjaGVfaW52X2RhdGEubGVuZ3RoID0KKyAgICAgICAgICAgICggLyogRklYTUU6IFNob3VsZCByZW1vdmUgdGhpcyBhZnRlciBJT04gaW50ZXJmYWNlIGNoYW5nZXMgKi8gdW5zaWduZWQgaW50KQorICAgICAgICAgICAgbU1lbUluZm9baW5kZXhdLnNpemU7CisgICAgY3VzdG9tX2RhdGEuY21kID0gY21kOworICAgIGN1c3RvbV9kYXRhLmFyZyA9ICh1bnNpZ25lZCBsb25nKSZjYWNoZV9pbnZfZGF0YTsKKworICAgIExPR0goImFkZHIgPSAlcCwgZmQgPSAlZCwgaGFuZGxlID0gJWx4IGxlbmd0aCA9ICVkLCBJT04gRmQgPSAlZCIsCisgICAgICAgICAgY2FjaGVfaW52X2RhdGEudmFkZHIsIGNhY2hlX2ludl9kYXRhLmZkLAorICAgICAgICAgKHVuc2lnbmVkIGxvbmcpY2FjaGVfaW52X2RhdGEuaGFuZGxlLCBjYWNoZV9pbnZfZGF0YS5sZW5ndGgsCisgICAgICAgICBtTWVtSW5mb1tpbmRleF0ubWFpbl9pb25fZmQpOworICAgIHJldCA9IGlvY3RsKG1NZW1JbmZvW2luZGV4XS5tYWluX2lvbl9mZCwgSU9OX0lPQ19DVVNUT00sICZjdXN0b21fZGF0YSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgTE9HRSgiQ2FjaGUgSW52YWxpZGF0ZSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RmQKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW5kZXhlZCBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGZpbGUgZGVzY3JpcHRvcgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYU1lbW9yeTo6Z2V0RmQodWludDMyX3QgaW5kZXgpIGNvbnN0Cit7CisgICAgaWYgKGluZGV4ID49IG1CdWZmZXJDb3VudCkKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKworICAgIHJldHVybiBtTWVtSW5mb1tpbmRleF0uZmQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0U2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm4gYnVmZmVyIHNpemUgb2YgdGhlIGluZGV4ZWQgYnVmZmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBidWZmZXIgc2l6ZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzc2l6ZV90IFFDYW1lcmFNZW1vcnk6OmdldFNpemUodWludDMyX3QgaW5kZXgpIGNvbnN0Cit7CisgICAgaWYgKGluZGV4ID49IG1CdWZmZXJDb3VudCkKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKworICAgIHJldHVybiAoc3NpemVfdCltTWVtSW5mb1tpbmRleF0uc2l6ZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRDbnQKKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQ4X3QgUUNhbWVyYU1lbW9yeTo6Z2V0Q250KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUJ1ZmZlckNvdW50OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlc2V0CisgKgorICogREVTQ1JJUFRJT046IHJlc2V0IG1lbWJlciB2YXJpYWJsZXMKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYU1lbW9yeTo6cmVzZXQoKQoreworICAgIHNpemVfdCBpLCBjb3VudDsKKworICAgIG1lbXNldChtTWVtSW5mbywgMCwgc2l6ZW9mKG1NZW1JbmZvKSk7CisKKyAgICBjb3VudCA9IHNpemVvZihtTWVtSW5mbykgLyBzaXplb2YobU1lbUluZm9bMF0pOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIG1NZW1JbmZvW2ldLmZkID0gLTE7CisgICAgICAgIG1NZW1JbmZvW2ldLm1haW5faW9uX2ZkID0gLTE7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldE1hcHBhYmxlCisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IG51bWJlciBvZiBidWZmZXJzIGF2YWlsYWJsZSB0byBtYXAKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBudW1iZXIgb2YgYnVmZmVycyBhdmFpbGFibGUgdG8gbWFwCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQ4X3QgUUNhbWVyYU1lbW9yeTo6Z2V0TWFwcGFibGUoKSBjb25zdAoreworICAgIHJldHVybiBtQnVmZmVyQ291bnQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2hlY2tJZkFsbEJ1ZmZlcnNNYXBwZWQKKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgaWYgYWxsIGJ1ZmZlcnMgYXJlIG1hcHBlZAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IDEgYXMgYnVmZmVyIGNvdW50IGlzIGFsd2F5cyBlcXVhbCB0byBtYXBwYWJsZSBjb3VudAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50OF90IFFDYW1lcmFNZW1vcnk6OmNoZWNrSWZBbGxCdWZmZXJzTWFwcGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gMTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEJ1ZkRlZgorICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBkZXRhaWxlZCBidWZmZXIgaW5mb3JtYXRpb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG9mZnNldCAgOiBbaW5wdXRdIGZyYW1lIGJ1ZmZlciBvZmZzZXQKKyAqICAgQGJ1ZkRlZiAgOiBbb3V0cHV0XSByZWZlcmVuY2UgdG8gc3RydWN0IHRvIHN0b3JlIGJ1ZmZlciBkZWZpbml0aW9uCisgKiAgIEBpbmRleCAgIDogW2lucHV0XSBpbmRleCBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhTWVtb3J5OjpnZXRCdWZEZWYoY29uc3QgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCAmb2Zmc2V0LAorICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICZidWZEZWYsIHVpbnQzMl90IGluZGV4KSBjb25zdAoreworICAgIGlmICghbUJ1ZmZlckNvdW50KSB7CisgICAgICAgIExPR0UoIk1lbW9yeSBub3QgYWxsb2NhdGVkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYnVmRGVmLmZkID0gbU1lbUluZm9baW5kZXhdLmZkOworICAgIGJ1ZkRlZi5mcmFtZV9sZW4gPSBtTWVtSW5mb1tpbmRleF0uc2l6ZTsKKyAgICBidWZEZWYuYnVmX3R5cGUgPSBDQU1fU1RSRUFNX0JVRl9UWVBFX01QTEFORTsKKyAgICBidWZEZWYubWVtX2luZm8gPSAodm9pZCAqKXRoaXM7CisgICAgYnVmRGVmLnBsYW5lc19idWYubnVtX3BsYW5lcyA9IChpbnQ4X3Qpb2Zmc2V0Lm51bV9wbGFuZXM7CisgICAgYnVmRGVmLmJ1ZmZlciA9IGdldFB0cihpbmRleCk7CisgICAgYnVmRGVmLmJ1Zl9pZHggPSBpbmRleDsKKworICAgIC8qIFBsYW5lIDAgbmVlZHMgdG8gYmUgc2V0IHNlcGFyYXRlbHkuIFNldCBvdGhlciBwbGFuZXMgaW4gYSBsb29wICovCisgICAgYnVmRGVmLnBsYW5lc19idWYucGxhbmVzWzBdLmxlbmd0aCA9IG9mZnNldC5tcFswXS5sZW47CisgICAgYnVmRGVmLnBsYW5lc19idWYucGxhbmVzWzBdLm0udXNlcnB0ciA9IChsb25nIHVuc2lnbmVkIGludCltTWVtSW5mb1tpbmRleF0uZmQ7CisgICAgYnVmRGVmLnBsYW5lc19idWYucGxhbmVzWzBdLmRhdGFfb2Zmc2V0ID0gb2Zmc2V0Lm1wWzBdLm9mZnNldDsKKyAgICBidWZEZWYucGxhbmVzX2J1Zi5wbGFuZXNbMF0ucmVzZXJ2ZWRbMF0gPSAwOworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYnVmRGVmLnBsYW5lc19idWYubnVtX3BsYW5lczsgaSsrKSB7CisgICAgICAgICBidWZEZWYucGxhbmVzX2J1Zi5wbGFuZXNbaV0ubGVuZ3RoID0gb2Zmc2V0Lm1wW2ldLmxlbjsKKyAgICAgICAgIGJ1ZkRlZi5wbGFuZXNfYnVmLnBsYW5lc1tpXS5tLnVzZXJwdHIgPSAobG9uZyB1bnNpZ25lZCBpbnQpbU1lbUluZm9baV0uZmQ7CisgICAgICAgICBidWZEZWYucGxhbmVzX2J1Zi5wbGFuZXNbaV0uZGF0YV9vZmZzZXQgPSBvZmZzZXQubXBbaV0ub2Zmc2V0OworICAgICAgICAgYnVmRGVmLnBsYW5lc19idWYucGxhbmVzW2ldLnJlc2VydmVkWzBdID0KKyAgICAgICAgICAgICAgICAgYnVmRGVmLnBsYW5lc19idWYucGxhbmVzW2ktMV0ucmVzZXJ2ZWRbMF0gKworICAgICAgICAgICAgICAgICBidWZEZWYucGxhbmVzX2J1Zi5wbGFuZXNbaS0xXS5sZW5ndGg7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFVzZXJCdWZEZWYKKyAqCisgKiBERVNDUklQVElPTjogRmlsbCBCdWZmZXIgc3RydWN0dXJlIHdpdGggdXNlciBidWZmZXIgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxzbyBmaWxscyBpbmRpdmlkdWFsIHN0cmVhbSBidWZmZXJzIGluc2lkZSBiYXRjaCBiYWZmZXIgc3RyY3V0dXJlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBidWZfaW5mbyA6IHVzZXIgYnVmZmVyIGluZm9ybWF0aW9uCisgKiAgIEBidWZEZWYgIDogQnVmZmVyIHN0cmN1dHVyZSB0byBmaWxsIHVzZXIgYnVmIGluZm8KKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKiAgIEBwbGFuZV9vZmZzZXQgOiBwbGFuZSBidWZmZXIgaW5mb3JtYXRpb24KKyAqICAgQHBsYW5lQnVmRGVmICA6IFtpbnB1dF0gZnJhbWUgYnVmZmVyIG9mZnNldAorICogICBAYnVmcyAgICA6IFN0cmVhbSBCdWZmZXIgb2JqZWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhTWVtb3J5OjpnZXRVc2VyQnVmRGVmKGNvbnN0IGNhbV9zdHJlYW1fdXNlcl9idWZfaW5mb190ICZidWZfaW5mbywKKyAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAmYnVmRGVmLAorICAgICAgICB1aW50MzJfdCBpbmRleCwKKyAgICAgICAgY29uc3QgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCAmcGxhbmVfb2Zmc2V0LAorICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpwbGFuZUJ1ZkRlZiwKKyAgICAgICAgUUNhbWVyYU1lbW9yeSAqYnVmcykgY29uc3QKK3sKKyAgICBzdHJ1Y3QgbXNtX2NhbWVyYV91c2VyX2J1Zl9jb250X3QgKmNvbnRfYnVmID0gTlVMTDsKKyAgICB1aW50MzJfdCBwbGFuZV9pZHggPSAoaW5kZXggKiBidWZfaW5mby5mcmFtZV9idWZfY250KTsKKworICAgIGlmICghbUJ1ZmZlckNvdW50KSB7CisgICAgICAgIExPR0UoIk1lbW9yeSBub3QgYWxsb2NhdGVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgbUJ1ZmZlckNvdW50OyBjb3VudCsrKSB7CisgICAgICAgIGJ1ZkRlZi5mZCA9IG1NZW1JbmZvW2NvdW50XS5mZDsKKyAgICAgICAgYnVmRGVmLmJ1Zl90eXBlID0gQ0FNX1NUUkVBTV9CVUZfVFlQRV9VU0VSUFRSOworICAgICAgICBidWZEZWYuZnJhbWVfbGVuID0gYnVmX2luZm8uc2l6ZTsKKyAgICAgICAgYnVmRGVmLm1lbV9pbmZvID0gKHZvaWQgKil0aGlzOworICAgICAgICBidWZEZWYuYnVmZmVyID0gKHZvaWQgKikoKHVpbnQ4X3QgKilnZXRQdHIoY291bnQpCisgICAgICAgICAgICAgICAgKyAoaW5kZXggKiBidWZfaW5mby5zaXplKSk7CisgICAgICAgIGJ1ZkRlZi5idWZfaWR4ID0gaW5kZXg7CisgICAgICAgIGJ1ZkRlZi51c2VyX2J1Zi5udW1fYnVmZmVycyA9IChpbnQ4X3QpYnVmX2luZm8uZnJhbWVfYnVmX2NudDsKKyAgICAgICAgYnVmRGVmLnVzZXJfYnVmLmJ1ZnNfdXNlZCA9IChpbnQ4X3QpYnVmX2luZm8uZnJhbWVfYnVmX2NudDsKKworICAgICAgICAvL0luZGl2aWR1YWwgcGxhbmUgYnVmZmVyIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQKKyAgICAgICAgY29udF9idWYgPSAoc3RydWN0IG1zbV9jYW1lcmFfdXNlcl9idWZfY29udF90ICopYnVmRGVmLmJ1ZmZlcjsKKyAgICAgICAgY29udF9idWYtPmJ1Zl9jbnQgPSBidWZEZWYudXNlcl9idWYubnVtX2J1ZmZlcnM7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWZEZWYudXNlcl9idWYubnVtX2J1ZmZlcnM7IGkrKykgeworICAgICAgICAgICAgYnVmcy0+Z2V0QnVmRGVmKHBsYW5lX29mZnNldCwgcGxhbmVCdWZEZWZbcGxhbmVfaWR4XSwgcGxhbmVfaWR4KTsKKyAgICAgICAgICAgIGJ1ZkRlZi51c2VyX2J1Zi5idWZfaWR4W2ldID0gLTE7CisgICAgICAgICAgICBjb250X2J1Zi0+YnVmX2lkeFtpXSA9IHBsYW5lQnVmRGVmW3BsYW5lX2lkeF0uYnVmX2lkeDsKKyAgICAgICAgICAgIHBsYW5lX2lkeCsrOworICAgICAgICB9CisgICAgICAgIGJ1ZkRlZi51c2VyX2J1Zi5wbGFuZV9idWYgPSBwbGFuZUJ1ZkRlZjsKKworICAgICAgICBMT0dEKCJudW1fYnVmID0gJWQgaW5kZXggPSAlZCBwbGFuZV9pZHggPSAlZCIsCisgICAgICAgICAgICAgICAgIGJ1ZkRlZi51c2VyX2J1Zi5udW1fYnVmZmVycywgaW5kZXgsIHBsYW5lX2lkeCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFsbG9jCisgKgorICogREVTQ1JJUFRJT046IGFsbG9jYXRlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnVmZmVycyBvZiBjZXJ0YWluIHNpemUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNvdW50ICAgOiBudW1iZXIgb2YgYnVmZmVycyB0byBiZSBhbGxvY2F0ZWQKKyAqICAgQHNpemUgICAgOiBsZW5naHQgb2YgdGhlIGJ1ZmZlciB0byBiZSBhbGxvY2F0ZWQKKyAqICAgQGhlYXBfaWQgOiBoZWFwIGlkIHRvIGluZGljYXRlIHdoZXJlIHRoZSBidWZmZXJzIHdpbGwgYmUgYWxsb2NhdGVkIGZyb20KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYU1lbW9yeTo6YWxsb2MoaW50IGNvdW50LCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IGhlYXBfaWQsCisgICAgICAgIHVpbnQzMl90IHNlY3VyZV9tb2RlKQoreworICAgIGludCByYyA9IE9LOworCisgICAgaW50IG5ld19idWZDbnQgPSBtQnVmZmVyQ291bnQgKyBjb3VudDsKKyAgICBBVFJBQ0VfQkVHSU5fU05QUklOVEYoIiVzICV6dSAlZCIsICJNZW1zaXplIiwgc2l6ZSwgY291bnQpOworCisgICAgaWYgKG5ld19idWZDbnQgPiBNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVMpIHsKKyAgICAgICAgTE9HRSgiQnVmZmVyIGNvdW50ICVkIG91dCBvZiBib3VuZC4gTWF4IGlzICVkIiwKKyAgICAgICAgICAgICAgIG5ld19idWZDbnQsIE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUyk7CisgICAgICAgIEFUUkFDRV9FTkQoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gbUJ1ZmZlckNvdW50OyBpIDwgbmV3X2J1ZkNudDsgaSArKykgeworICAgICAgICBpZiAoIE5VTEwgPT0gbU1lbW9yeVBvb2wgKSB7CisgICAgICAgICAgICBMT0dIKCJObyBtZW1vcnkgcG9vbCBhdmFpbGFibGUsIGFsbG9jYXRpbmcgbm93Iik7CisgICAgICAgICAgICByYyA9IGFsbG9jT25lQnVmZmVyKG1NZW1JbmZvW2ldLCBoZWFwX2lkLCBzaXplLCBtX2JDYWNoZWQsCisgICAgICAgICAgICAgICAgICAgICBzZWN1cmVfbW9kZSk7CisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiQWxsb2NhdGVJb25NZW1vcnkgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGktMTsgaiA+PSAwOyBqLS0pCisgICAgICAgICAgICAgICAgICAgIGRlYWxsb2NPbmVCdWZmZXIobU1lbUluZm9bal0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmMgPSBtTWVtb3J5UG9vbC0+YWxsb2NhdGVCdWZmZXIobU1lbUluZm9baV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFwX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYkNhY2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlX21vZGUpOworICAgICAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoIk1lbW9yeSBwb29sIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGktMTsgaiA+PSAwOyBqLS0pCisgICAgICAgICAgICAgICAgICAgIG1NZW1vcnlQb29sLT5yZWxlYXNlQnVmZmVyKG1NZW1JbmZvW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyAgICBBVFJBQ0VfRU5EKCk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGRlYWxsb2MKKyAqCisgKiBERVNDUklQVElPTjogZGVhbGxvY2F0ZSBidWZmZXJzCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFNZW1vcnk6OmRlYWxsb2MoKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUJ1ZmZlckNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKCBOVUxMID09IG1NZW1vcnlQb29sICkgeworICAgICAgICAgICAgZGVhbGxvY09uZUJ1ZmZlcihtTWVtSW5mb1tpXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWVtb3J5UG9vbC0+cmVsZWFzZUJ1ZmZlcihtTWVtSW5mb1tpXSwgbVN0cmVhbVR5cGUpOworICAgICAgICB9CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFsbG9jT25lQnVmZmVyCisgKgorICogREVTQ1JJUFRJT046IGltcGwgb2YgYWxsb2NhdGluZyBvbmUgYnVmZmVycyBvZiBjZXJ0YWluIHNpemUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1lbUluZm8gOiBbb3V0cHV0XSByZWZlcmVuY2UgdG8gc3RydWN0IHRvIHN0b3JlIGFkZGl0aW9uYWwgbWVtb3J5IGFsbG9jYXRpb24gaW5mbworICogICBAaGVhcCAgICA6IFtpbnB1dF0gaGVhcCBpZCB0byBpbmRpY2F0ZSB3aGVyZSB0aGUgYnVmZmVycyB3aWxsIGJlIGFsbG9jYXRlZCBmcm9tCisgKiAgIEBzaXplICAgIDogW2lucHV0XSBsZW5naHQgb2YgdGhlIGJ1ZmZlciB0byBiZSBhbGxvY2F0ZWQKKyAqICAgQGNhY2hlZCAgOiBbaW5wdXRdIGZsYWcgd2hldGhlciBidWZmZXIgbmVlZHMgdG8gYmUgY2FjaGVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFNZW1vcnk6OmFsbG9jT25lQnVmZmVyKFFDYW1lcmFNZW1JbmZvICZtZW1JbmZvLAorICAgICAgICB1bnNpZ25lZCBpbnQgaGVhcF9pZCwgc2l6ZV90IHNpemUsIGJvb2wgY2FjaGVkLCB1aW50MzJfdCBzZWN1cmVfbW9kZSkKK3sKKyAgICBpbnQgcmMgPSBPSzsKKyAgICBzdHJ1Y3QgaW9uX2hhbmRsZV9kYXRhIGhhbmRsZV9kYXRhOworICAgIHN0cnVjdCBpb25fYWxsb2NhdGlvbl9kYXRhIGFsbG9jOworICAgIHN0cnVjdCBpb25fZmRfZGF0YSBpb25faW5mb19mZDsKKyAgICBpbnQgbWFpbl9pb25fZmQgPSAtMTsKKworICAgIG1haW5faW9uX2ZkID0gb3BlbigiL2Rldi9pb24iLCBPX1JET05MWSk7CisgICAgaWYgKG1haW5faW9uX2ZkIDwgMCkgeworICAgICAgICBMT0dFKCJJb24gZGV2IG9wZW4gZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBJT05fT1BFTl9GQUlMRUQ7CisgICAgfQorCisgICAgbWVtc2V0KCZhbGxvYywgMCwgc2l6ZW9mKGFsbG9jKSk7CisgICAgYWxsb2MubGVuID0gc2l6ZTsKKyAgICAvKiB0byBtYWtlIGl0IHBhZ2Ugc2l6ZSBhbGlnbmVkICovCisgICAgYWxsb2MubGVuID0gKGFsbG9jLmxlbiArIDQwOTVVKSAmICh+NDA5NVUpOworICAgIGFsbG9jLmFsaWduID0gNDA5NjsKKyAgICBpZiAoY2FjaGVkKSB7CisgICAgICAgIGFsbG9jLmZsYWdzID0gSU9OX0ZMQUdfQ0FDSEVEOworICAgIH0KKyAgICBhbGxvYy5oZWFwX2lkX21hc2sgPSBoZWFwX2lkOworICAgIGlmIChzZWN1cmVfbW9kZSA9PSBTRUNVUkUpIHsKKyAgICAgICAgTE9HRCgiQWxsb2NhdGUgc2VjdXJlIGJ1ZmZlclxuIik7CisgICAgICAgIGFsbG9jLmZsYWdzID0gSU9OX1NFQ1VSRTsKKyAgICAgICAgYWxsb2MuaGVhcF9pZF9tYXNrID0gSU9OX0hFQVAoSU9OX0NQX01NX0hFQVBfSUQpOworICAgICAgICBhbGxvYy5hbGlnbiA9IDEwNDg1NzY7IC8vIDEgTWlCIGFsaWdubWVudCB0byBiZSBhYmxlIHRvIHByb3RlY3QgbGF0ZXIKKyAgICAgICAgYWxsb2MubGVuID0gKGFsbG9jLmxlbiArIDEwNDg1NzVVKSAmICh+MTA0ODU3NVUpOworICAgIH0KKworICAgIHJjID0gaW9jdGwobWFpbl9pb25fZmQsIElPTl9JT0NfQUxMT0MsICZhbGxvYyk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJJT04gYWxsb2NhdGlvbiBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBnb3RvIElPTl9BTExPQ19GQUlMRUQ7CisgICAgfQorCisgICAgbWVtc2V0KCZpb25faW5mb19mZCwgMCwgc2l6ZW9mKGlvbl9pbmZvX2ZkKSk7CisgICAgaW9uX2luZm9fZmQuaGFuZGxlID0gYWxsb2MuaGFuZGxlOworICAgIHJjID0gaW9jdGwobWFpbl9pb25fZmQsIElPTl9JT0NfU0hBUkUsICZpb25faW5mb19mZCk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJJT04gbWFwIGZhaWxlZCAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBJT05fTUFQX0ZBSUxFRDsKKyAgICB9CisKKyAgICBtZW1JbmZvLm1haW5faW9uX2ZkID0gbWFpbl9pb25fZmQ7CisgICAgbWVtSW5mby5mZCA9IGlvbl9pbmZvX2ZkLmZkOworICAgIG1lbUluZm8uaGFuZGxlID0gaW9uX2luZm9fZmQuaGFuZGxlOworICAgIG1lbUluZm8uc2l6ZSA9IGFsbG9jLmxlbjsKKyAgICBtZW1JbmZvLmNhY2hlZCA9IGNhY2hlZDsKKyAgICBtZW1JbmZvLmhlYXBfaWQgPSBoZWFwX2lkOworCisgICAgTE9HRCgiSU9OIGJ1ZmZlciAlbHggd2l0aCBzaXplICVkIGFsbG9jYXRlZCIsCisgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpbWVtSW5mby5oYW5kbGUsIGFsbG9jLmxlbik7CisgICAgcmV0dXJuIE9LOworCitJT05fTUFQX0ZBSUxFRDoKKyAgICBtZW1zZXQoJmhhbmRsZV9kYXRhLCAwLCBzaXplb2YoaGFuZGxlX2RhdGEpKTsKKyAgICBoYW5kbGVfZGF0YS5oYW5kbGUgPSBpb25faW5mb19mZC5oYW5kbGU7CisgICAgaW9jdGwobWFpbl9pb25fZmQsIElPTl9JT0NfRlJFRSwgJmhhbmRsZV9kYXRhKTsKK0lPTl9BTExPQ19GQUlMRUQ6CisgICAgY2xvc2UobWFpbl9pb25fZmQpOworSU9OX09QRU5fRkFJTEVEOgorICAgIHJldHVybiBOT19NRU1PUlk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGVhbGxvY09uZUJ1ZmZlcgorICoKKyAqIERFU0NSSVBUSU9OOiBpbXBsIG9mIGRlYWxsb2NhdGluZyBvbmUgYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbWVtSW5mbyA6IHJlZmVyZW5jZSB0byBzdHJ1Y3QgdGhhdCBzdG9yZXMgYWRkaXRpb25hbCBtZW1vcnkgYWxsb2NhdGlvbiBpbmZvCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhTWVtb3J5OjpkZWFsbG9jT25lQnVmZmVyKFFDYW1lcmFNZW1JbmZvICZtZW1JbmZvKQoreworICAgIHN0cnVjdCBpb25faGFuZGxlX2RhdGEgaGFuZGxlX2RhdGE7CisKKyAgICBpZiAobWVtSW5mby5mZCA+PSAwKSB7CisgICAgICAgIGNsb3NlKG1lbUluZm8uZmQpOworICAgICAgICBtZW1JbmZvLmZkID0gLTE7CisgICAgfQorCisgICAgaWYgKG1lbUluZm8ubWFpbl9pb25fZmQgPj0gMCkgeworICAgICAgICBtZW1zZXQoJmhhbmRsZV9kYXRhLCAwLCBzaXplb2YoaGFuZGxlX2RhdGEpKTsKKyAgICAgICAgaGFuZGxlX2RhdGEuaGFuZGxlID0gbWVtSW5mby5oYW5kbGU7CisgICAgICAgIGlvY3RsKG1lbUluZm8ubWFpbl9pb25fZmQsIElPTl9JT0NfRlJFRSwgJmhhbmRsZV9kYXRhKTsKKyAgICAgICAgY2xvc2UobWVtSW5mby5tYWluX2lvbl9mZCk7CisgICAgICAgIG1lbUluZm8ubWFpbl9pb25fZmQgPSAtMTsKKyAgICB9CisgICAgbWVtSW5mby5oYW5kbGUgPSAwOworICAgIG1lbUluZm8uc2l6ZSA9IDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYU1lbW9yeVBvb2wKKyAqCisgKiBERVNDUklQVElPTjogZGVmYXVsdCBjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhTWVtb3J5UG9vbAorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYU1lbW9yeVBvb2w6OlFDYW1lcmFNZW1vcnlQb29sKCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJm1Mb2NrLCBOVUxMKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhTWVtb3J5UG9vbAorICoKKyAqIERFU0NSSVBUSU9OOiBkZWNvbnN0cnVjdG9yIG9mIFFDYW1lcmFNZW1vcnlQb29sCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhTWVtb3J5UG9vbDo6flFDYW1lcmFNZW1vcnlQb29sKCkKK3sKKyAgICBjbGVhcigpOworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbUxvY2spOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbGVhc2VCdWZmZXIKKyAqCisgKiBERVNDUklQVElPTjogcmVsZWFzZSBvbmUgY2FjaGVkIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1lbUluZm8gOiByZWZlcmVuY2UgdG8gc3RydWN0IHRoYXQgc3RvcmVzIGFkZGl0aW9uYWwgbWVtb3J5IGFsbG9jYXRpb24gaW5mbworICogICBAc3RyZWFtVHlwZTogVHlwZSBvZiBzdHJlYW0gdGhlIGJ1ZmZlcnMgYmVsb25ncyB0bworICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYU1lbW9yeVBvb2w6OnJlbGVhc2VCdWZmZXIoCisgICAgICAgIHN0cnVjdCBRQ2FtZXJhTWVtb3J5OjpRQ2FtZXJhTWVtSW5mbyAmbWVtSW5mbywKKyAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1Mb2NrKTsKKworICAgIG1Qb29sc1tzdHJlYW1UeXBlXS5wdXNoX2JhY2sobWVtSW5mbyk7CisKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUxvY2spOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNsZWFyCisgKgorICogREVTQ1JJUFRJT046IGNsZWFycyBhbGwgY2FjaGVkIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYU1lbW9yeVBvb2w6OmNsZWFyKCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1Mb2NrKTsKKworICAgIGZvciAoaW50IGkgPSBDQU1fU1RSRUFNX1RZUEVfREVGQVVMVDsgaSA8IENBTV9TVFJFQU1fVFlQRV9NQVg7IGkrKyApIHsKKyAgICAgICAgTGlzdDxzdHJ1Y3QgUUNhbWVyYU1lbW9yeTo6UUNhbWVyYU1lbUluZm8+OjppdGVyYXRvciBpdDsKKyAgICAgICAgaXQgPSBtUG9vbHNbaV0uYmVnaW4oKTsKKyAgICAgICAgZm9yKCA7IGl0ICE9IG1Qb29sc1tpXS5lbmQoKSA7IGl0KyspIHsKKyAgICAgICAgICAgIFFDYW1lcmFNZW1vcnk6OmRlYWxsb2NPbmVCdWZmZXIoKml0KTsKKyAgICAgICAgfQorCisgICAgICAgIG1Qb29sc1tpXS5jbGVhcigpOworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTG9jayk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZmluZEJ1ZmZlckxvY2tlZAorICoKKyAqIERFU0NSSVBUSU9OOiBzZWFyY2ggZm9yIGEgYXBwcm9wcmlhdGUgY2FjaGVkIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbWVtSW5mbyA6IHJlZmVyZW5jZSB0byBzdHJ1Y3QgdGhhdCBzdG9yZXMgYWRkaXRpb25hbCBtZW1vcnkgYWxsb2NhdGlvbiBpbmZvCisgKiAgIEBoZWFwX2lkIDogdHlwZSBvZiBoZWFwCisgKiAgIEBzaXplICAgIDogc2l6ZSBvZiB0aGUgYnVmZmVyCisgKiAgIEBjYWNoZWQgIDogd2hldGhlciB0aGUgYnVmZmVyIHNob3VsZCBiZSBjYWNoZWQKKyAqICAgQHN0cmVhVHlwZTogdHlwZSBvZiBzdHJlYW0gdGhpcyBidWZmZXIgYmVsb25ncyB0bworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhTWVtb3J5UG9vbDo6ZmluZEJ1ZmZlckxvY2tlZCgKKyAgICAgICAgc3RydWN0IFFDYW1lcmFNZW1vcnk6OlFDYW1lcmFNZW1JbmZvICZtZW1JbmZvLCB1bnNpZ25lZCBpbnQgaGVhcF9pZCwKKyAgICAgICAgc2l6ZV90IHNpemUsIGJvb2wgY2FjaGVkLCBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoreworICAgIGludCByYyA9IE5BTUVfTk9UX0ZPVU5EOworCisgICAgaWYgKG1Qb29sc1tzdHJlYW1UeXBlXS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBMaXN0PHN0cnVjdCBRQ2FtZXJhTWVtb3J5OjpRQ2FtZXJhTWVtSW5mbz46Oml0ZXJhdG9yIGl0ID0gbVBvb2xzW3N0cmVhbVR5cGVdLmJlZ2luKCk7CisgICAgaWYgKHN0cmVhbVR5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX09GRkxJTkVfUFJPQykgeworICAgICAgICBmb3IoIDsgaXQgIT0gbVBvb2xzW3N0cmVhbVR5cGVdLmVuZCgpIDsgaXQrKykgeworICAgICAgICAgICAgaWYoICgoKml0KS5zaXplID09IHNpemUpICYmCisgICAgICAgICAgICAgICAgICAgICgoKml0KS5oZWFwX2lkID09IGhlYXBfaWQpICYmCisgICAgICAgICAgICAgICAgICAgICgoKml0KS5jYWNoZWQgPT0gY2FjaGVkKSApIHsKKyAgICAgICAgICAgICAgICBtZW1JbmZvID0gKml0OworICAgICAgICAgICAgICAgIExPR0QoIkZvdW5kIGJ1ZmZlciAlbHggc2l6ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpbWVtSW5mby5oYW5kbGUsIG1lbUluZm8uc2l6ZSk7CisgICAgICAgICAgICAgICAgbVBvb2xzW3N0cmVhbVR5cGVdLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICByYyA9IE5PX0VSUk9SOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yKCA7IGl0ICE9IG1Qb29sc1tzdHJlYW1UeXBlXS5lbmQoKSA7IGl0KyspIHsKKyAgICAgICAgICAgIGlmKCgoKml0KS5zaXplID49IHNpemUpICYmCisgICAgICAgICAgICAgICAgICAgICgoKml0KS5oZWFwX2lkID09IGhlYXBfaWQpICYmCisgICAgICAgICAgICAgICAgICAgICgoKml0KS5jYWNoZWQgPT0gY2FjaGVkKSApIHsKKyAgICAgICAgICAgICAgICBtZW1JbmZvID0gKml0OworICAgICAgICAgICAgICAgIExPR0QoIkZvdW5kIGJ1ZmZlciAlbHggc2l6ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpbWVtSW5mby5oYW5kbGUsIG1lbUluZm8uc2l6ZSk7CisgICAgICAgICAgICAgICAgbVBvb2xzW3N0cmVhbVR5cGVdLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICByYyA9IE5PX0VSUk9SOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFsbG9jYXRlQnVmZmVyCisgKgorICogREVTQ1JJUFRJT046IGFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIHRoZSBtZW1vcnkgcG9vbCwKKyAqICAgICAgICAgICAgICBpdCB3aWxsIHJlLXVzZSBjYWNoZWQgYnVmZmVycyBpZiBwb3NzaWJsZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbWVtSW5mbyA6IHJlZmVyZW5jZSB0byBzdHJ1Y3QgdGhhdCBzdG9yZXMgYWRkaXRpb25hbCBtZW1vcnkgYWxsb2NhdGlvbiBpbmZvCisgKiAgIEBoZWFwX2lkIDogdHlwZSBvZiBoZWFwCisgKiAgIEBzaXplICAgIDogc2l6ZSBvZiB0aGUgYnVmZmVyCisgKiAgIEBjYWNoZWQgIDogd2hldGhlciB0aGUgYnVmZmVyIHNob3VsZCBiZSBjYWNoZWQKKyAqICAgQHN0cmVhVHlwZTogdHlwZSBvZiBzdHJlYW0gdGhpcyBidWZmZXIgYmVsb25ncyB0bworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhTWVtb3J5UG9vbDo6YWxsb2NhdGVCdWZmZXIoCisgICAgICAgIHN0cnVjdCBRQ2FtZXJhTWVtb3J5OjpRQ2FtZXJhTWVtSW5mbyAmbWVtSW5mbywgdW5zaWduZWQgaW50IGhlYXBfaWQsCisgICAgICAgIHNpemVfdCBzaXplLCBib29sIGNhY2hlZCwgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgdWludDMyX3Qgc2VjdXJlX21vZGUpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1Mb2NrKTsKKworICAgIHJjID0gZmluZEJ1ZmZlckxvY2tlZChtZW1JbmZvLCBoZWFwX2lkLCBzaXplLCBjYWNoZWQsIHN0cmVhbVR5cGUpOworICAgIGlmIChOQU1FX05PVF9GT1VORCA9PSByYyApIHsKKyAgICAgICAgTE9HRCgiQnVmZmVyIG5vdCBmb3VuZCEiKTsKKyAgICAgICAgcmMgPSBRQ2FtZXJhTWVtb3J5OjphbGxvY09uZUJ1ZmZlcihtZW1JbmZvLCBoZWFwX2lkLCBzaXplLCBjYWNoZWQsCisgICAgICAgICAgICAgICAgIHNlY3VyZV9tb2RlKTsKKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUxvY2spOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmFIZWFwTWVtb3J5CisgKgorICogREVTQ1JJUFRJT046IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmFIZWFwTWVtb3J5IGZvciBpb24gbWVtb3J5IHVzZWQgaW50ZXJuYWxseSBpbiBIQUwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhY2hlZCAgOiBmbGFnIGluZGljYXRlcyBpZiB1c2luZyBjYWNoZWQgbWVtb3J5CisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYUhlYXBNZW1vcnk6OlFDYW1lcmFIZWFwTWVtb3J5KGJvb2wgY2FjaGVkKQorICAgIDogUUNhbWVyYU1lbW9yeShjYWNoZWQpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVM7IGkgKyspCisgICAgICAgIG1QdHJbaV0gPSBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhSGVhcE1lbW9yeQorICoKKyAqIERFU0NSSVBUSU9OOiBkZWNvbnN0cnVjdG9yIG9mIFFDYW1lcmFIZWFwTWVtb3J5CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhSGVhcE1lbW9yeTo6flFDYW1lcmFIZWFwTWVtb3J5KCkKK3sKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRQdHIKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIGJ1ZmZlciBwb2ludGVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBidWZmZXIgcHRyCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgKlFDYW1lcmFIZWFwTWVtb3J5OjpnZXRQdHIodWludDMyX3QgaW5kZXgpIGNvbnN0Cit7CisgICAgaWYgKGluZGV4ID49IG1CdWZmZXJDb3VudCkgeworICAgICAgICBMT0dFKCJpbmRleCBvdXQgb2YgYm91bmQiKTsKKyAgICAgICAgcmV0dXJuICh2b2lkICopQkFEX0lOREVYOworICAgIH0KKyAgICByZXR1cm4gbVB0cltpbmRleF07Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWxsb2NhdGUKKyAqCisgKiBERVNDUklQVElPTjogYWxsb2NhdGUgcmVxdWVzdGVkIG51bWJlciBvZiBidWZmZXJzIG9mIGNlcnRhaW4gc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY291bnQgICA6IG51bWJlciBvZiBidWZmZXJzIHRvIGJlIGFsbG9jYXRlZAorICogICBAc2l6ZSAgICA6IGxlbmdodCBvZiB0aGUgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhSGVhcE1lbW9yeTo6YWxsb2NhdGUodWludDhfdCBjb3VudCwgc2l6ZV90IHNpemUsIHVpbnQzMl90IGlzU2VjdXJlKQoreworICAgIGludCByYyA9IC0xOworICAgIEFUUkFDRV9CRUdJTl9TTlBSSU5URigiJXMgJXp1ICVkIiwgIkhlYXBNZW1zaXplIiwgc2l6ZSwgY291bnQpOworICAgIHVpbnQzMl90IGhlYXBfaWRfbWFzayA9IDB4MSA8PCBJT05fSU9NTVVfSEVBUF9JRDsKKyAgICBpZiAoaXNTZWN1cmUgPT0gU0VDVVJFKSB7CisgICAgICAgIHJjID0gYWxsb2MoY291bnQsIHNpemUsIGhlYXBfaWRfbWFzaywgU0VDVVJFKTsKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgQVRSQUNFX0VORCgpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmMgPSBhbGxvYyhjb3VudCwgc2l6ZSwgaGVhcF9pZF9tYXNrLCBOT05fU0VDVVJFKTsKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgQVRSQUNFX0VORCgpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgeworICAgICAgICAgICAgdm9pZCAqdmFkZHIgPSBtbWFwKE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBtTWVtSW5mb1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBtTWVtSW5mb1tpXS5mZCwgMCk7CisgICAgICAgICAgICBpZiAodmFkZHIgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpLTE7IGogPj0gMDsgaiAtLSkgeworICAgICAgICAgICAgICAgICAgICBtdW5tYXAobVB0cltqXSwgbU1lbUluZm9bal0uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1QdHJbal0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBkZWFsbG9jT25lQnVmZmVyKG1NZW1JbmZvW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRGVhbGxvY2F0ZSByZW1haW5pbmcgYnVmZmVycyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZAorICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpOyBqIDwgY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBkZWFsbG9jT25lQnVmZmVyKG1NZW1JbmZvW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQVRSQUNFX0VORCgpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBtUHRyW2ldID0gdmFkZHI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgbUJ1ZmZlckNvdW50ID0gY291bnQ7CisgICAgfQorICAgIEFUUkFDRV9FTkQoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWxsb2NhdGVNb3JlCisgKgorICogREVTQ1JJUFRJT046IGFsbG9jYXRlIG1vcmUgcmVxdWVzdGVkIG51bWJlciBvZiBidWZmZXJzIG9mIGNlcnRhaW4gc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY291bnQgICA6IG51bWJlciBvZiBidWZmZXJzIHRvIGJlIGFsbG9jYXRlZAorICogICBAc2l6ZSAgICA6IGxlbmdodCBvZiB0aGUgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhSGVhcE1lbW9yeTo6YWxsb2NhdGVNb3JlKHVpbnQ4X3QgY291bnQsIHNpemVfdCBzaXplKQoreworICAgIEFUUkFDRV9CRUdJTl9TTlBSSU5URigiJXMgJXp1ICVkIiwgIkhlYXBNZW1zaXplIiwgc2l6ZSwgY291bnQpOworICAgIHVuc2lnbmVkIGludCBoZWFwX2lkX21hc2sgPSAweDEgPDwgSU9OX0lPTU1VX0hFQVBfSUQ7CisgICAgaW50IHJjID0gYWxsb2MoY291bnQsIHNpemUsIGhlYXBfaWRfbWFzaywgTk9OX1NFQ1VSRSk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBBVFJBQ0VfRU5EKCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gbUJ1ZmZlckNvdW50OyBpIDwgY291bnQgKyBtQnVmZmVyQ291bnQ7IGkgKyspIHsKKyAgICAgICAgdm9pZCAqdmFkZHIgPSBtbWFwKE5VTEwsCisgICAgICAgICAgICAgICAgICAgIG1NZW1JbmZvW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgIG1NZW1JbmZvW2ldLmZkLCAwKTsKKyAgICAgICAgaWYgKHZhZGRyID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBpLTE7IGogPj0gbUJ1ZmZlckNvdW50OyBqIC0tKSB7CisgICAgICAgICAgICAgICAgbXVubWFwKG1QdHJbal0sIG1NZW1JbmZvW2pdLnNpemUpOworICAgICAgICAgICAgICAgIG1QdHJbal0gPSBOVUxMOworICAgICAgICAgICAgICAgIGRlYWxsb2NPbmVCdWZmZXIobU1lbUluZm9bal0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVRSQUNFX0VORCgpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QdHJbaV0gPSB2YWRkcjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmZmVyQ291bnQgPSAodWludDhfdCkobUJ1ZmZlckNvdW50ICsgY291bnQpOworICAgIEFUUkFDRV9FTkQoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGVhbGxvY2F0ZQorICoKKyAqIERFU0NSSVBUSU9OOiBkZWFsbG9jYXRlIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYUhlYXBNZW1vcnk6OmRlYWxsb2NhdGUoKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUJ1ZmZlckNvdW50OyBpKyspIHsKKyAgICAgICAgbXVubWFwKG1QdHJbaV0sIG1NZW1JbmZvW2ldLnNpemUpOworICAgICAgICBtUHRyW2ldID0gTlVMTDsKKyAgICB9CisgICAgZGVhbGxvYygpOworICAgIG1CdWZmZXJDb3VudCA9IDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2FjaGVPcHMKKyAqCisgKiBERVNDUklQVElPTjogaW9uIHJlbGF0ZWQgbWVtb3J5IGNhY2hlIG9wZXJhdGlvbnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKiAgIEBjbWQgICAgIDogY2FjaGUgb3BzIGNvbW1hbmQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYUhlYXBNZW1vcnk6OmNhY2hlT3BzKHVpbnQzMl90IGluZGV4LCB1bnNpZ25lZCBpbnQgY21kKQoreworICAgIGlmIChpbmRleCA+PSBtQnVmZmVyQ291bnQpCisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgcmV0dXJuIGNhY2hlT3BzSW50ZXJuYWwoaW5kZXgsIGNtZCwgbVB0cltpbmRleF0pOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFJlZ0ZsYWdzCisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IGluaXRpYWwgcmVnIGZsYWdzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEByZWdGbGFnczogaW5pdGlhbCByZWcgZmxhZ3Mgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFIZWFwTWVtb3J5OjpnZXRSZWdGbGFncyh1aW50OF90ICogLypyZWdGbGFncyovKSBjb25zdAoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRNZW1vcnkKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IGNhbWVyYSBtZW1vcnkKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBidWZmZXIgaW5kZXgKKyAqICAgQG1ldGFkYXRhOiBmbGFnIGlmIGl0J3MgbWV0YWRhdGEKKyAqCisgKiBSRVRVUk4gICAgIDogY2FtZXJhIG1lbW9yeSBwdHIKKyAqICAgICAgICAgICAgICBOVUxMIGlmIG5vdCBzdXBwb3J0ZWQgb3IgZmFpbGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2NhbWVyYV9tZW1vcnlfdCAqUUNhbWVyYUhlYXBNZW1vcnk6OmdldE1lbW9yeSh1aW50MzJfdCAvKmluZGV4Ki8sIGJvb2wgLyptZXRhZGF0YSovKSBjb25zdAoreworICAgIHJldHVybiBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldE1hdGNoQnVmSW5kZXgKKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgYnVmZmVyIGluZGV4IGJ5IG9wYXF1ZSBwdHIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG9wYXF1ZSAgOiBvcGFxdWUgcHRyCisgKiAgIEBtZXRhZGF0YTogZmxhZyBpZiBpdCdzIG1ldGFkYXRhCisgKgorICogUkVUVVJOICAgICA6IGJ1ZmZlciBpbmRleCBpZiBtYXRjaCBmb3VuZCwKKyAqICAgICAgICAgICAgICAtMSBpZiBmYWlsZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFIZWFwTWVtb3J5OjpnZXRNYXRjaEJ1ZkluZGV4KGNvbnN0IHZvaWQgKm9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1ldGFkYXRhKSBjb25zdAoreworICAgIGludCBpbmRleCA9IC0xOworICAgIGlmIChtZXRhZGF0YSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUJ1ZmZlckNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKG1QdHJbaV0gPT0gb3BhcXVlKSB7CisgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5kZXg7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYU1ldGFkYXRhU3RyZWFtTWVtb3J5CisgKgorICogREVTQ1JJUFRJT046IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmFNZXRhZGF0YVN0cmVhbU1lbW9yeQorICogICAgICAgICAgICAgIGZvciBpb24gbWVtb3J5IHVzZWQgaW50ZXJuYWxseSBpbiBIQUwgZm9yIG1ldGFkYXRhCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYWNoZWQgIDogZmxhZyBpbmRpY2F0ZXMgaWYgdXNpbmcgY2FjaGVkIG1lbW9yeQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFNZXRhZGF0YVN0cmVhbU1lbW9yeTo6UUNhbWVyYU1ldGFkYXRhU3RyZWFtTWVtb3J5KGJvb2wgY2FjaGVkKQorICAgIDogUUNhbWVyYUhlYXBNZW1vcnkoY2FjaGVkKQoreworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhTWV0YWRhdGFTdHJlYW1NZW1vcnkKKyAqCisgKiBERVNDUklQVElPTjogZGVzdHJ1Y3RvciBvZiBRQ2FtZXJhTWV0YWRhdGFTdHJlYW1NZW1vcnkKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFNZXRhZGF0YVN0cmVhbU1lbW9yeTo6flFDYW1lcmFNZXRhZGF0YVN0cmVhbU1lbW9yeSgpCit7CisgICAgaWYgKG1CdWZmZXJDb3VudCA+IDApIHsKKyAgICAgICAgTE9HSCgiJXMsIGJ1Zl9jbnQgPiAwLCBkZWFsbG9jYXRlIGJ1ZmZlcnMgbm93LlxuIiwgX19mdW5jX18pOworICAgICAgICBkZWFsbG9jYXRlKCk7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFJlZ0ZsYWdzCisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IGluaXRpYWwgcmVnIGZsYWdzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEByZWdGbGFnczogaW5pdGlhbCByZWcgZmxhZ3Mgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFNZXRhZGF0YVN0cmVhbU1lbW9yeTo6Z2V0UmVnRmxhZ3ModWludDhfdCAqcmVnRmxhZ3MpIGNvbnN0Cit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQnVmZmVyQ291bnQ7IGkgKyspIHsKKyAgICAgICAgcmVnRmxhZ3NbaV0gPSAxOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYVN0cmVhbU1lbW9yeQorICoKKyAqIERFU0NSSVBUSU9OOiBjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhU3RyZWFtTWVtb3J5CisgKiAgICAgICAgICAgICAgSU9OIG1lbW9yeSBhbGxvY2F0ZWQgZGlyZWN0bHkgZnJvbSAvZGV2L2lvbiBhbmQgc2hhcmVkIHdpdGggZnJhbWV3b3JrCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtZW1vcnkgICAgOiBjYW1lcmEgbWVtb3J5IHJlcXVlc3Qgb3BzIHRhYmxlCisgKiAgIEBjYWNoZWQgICAgOiBmbGFnIGluZGljYXRlcyBpZiB1c2luZyBjYWNoZWQgbWVtb3J5CisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYVN0cmVhbU1lbW9yeTo6UUNhbWVyYVN0cmVhbU1lbW9yeShjYW1lcmFfcmVxdWVzdF9tZW1vcnkgbWVtb3J5LAorICAgICAgICBib29sIGNhY2hlZCwKKyAgICAgICAgUUNhbWVyYU1lbW9yeVBvb2wgKnBvb2wsCisgICAgICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIF9fdW51c2VkIGNhbV9zdHJlYW1fYnVmX3R5cGUgYnVmVHlwZSkKKyAgICA6UUNhbWVyYU1lbW9yeShjYWNoZWQsIHBvb2wsIHN0cmVhbVR5cGUpLAorICAgICBtR2V0TWVtb3J5KG1lbW9yeSkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUzsgaSArKykKKyAgICAgICAgbUNhbWVyYU1lbW9yeVtpXSA9IE5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogflFDYW1lcmFTdHJlYW1NZW1vcnkKKyAqCisgKiBERVNDUklQVElPTjogZGVjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhU3RyZWFtTWVtb3J5CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhU3RyZWFtTWVtb3J5Ojp+UUNhbWVyYVN0cmVhbU1lbW9yeSgpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWxsb2NhdGUKKyAqCisgKiBERVNDUklQVElPTjogYWxsb2NhdGUgcmVxdWVzdGVkIG51bWJlciBvZiBidWZmZXJzIG9mIGNlcnRhaW4gc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY291bnQgICA6IG51bWJlciBvZiBidWZmZXJzIHRvIGJlIGFsbG9jYXRlZAorICogICBAc2l6ZSAgICA6IGxlbmdodCBvZiB0aGUgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhU3RyZWFtTWVtb3J5OjphbGxvY2F0ZSh1aW50OF90IGNvdW50LCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgaXNTZWN1cmUpCit7CisgICAgQVRSQUNFX0JFR0lOX1NOUFJJTlRGKCIlcyAlenUgJWQiLCAiU3RyZWFtTWVtc2l6ZSIsIHNpemUsIGNvdW50KTsKKyAgICB1bnNpZ25lZCBpbnQgaGVhcF9pZF9tYXNrID0gMHgxIDw8IElPTl9JT01NVV9IRUFQX0lEOworICAgIGludCByYyA9IGFsbG9jKGNvdW50LCBzaXplLCBoZWFwX2lkX21hc2ssIGlzU2VjdXJlKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIEFUUkFDRV9FTkQoKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkgKyspIHsKKyAgICAgICAgaWYgKGlzU2VjdXJlID09IFNFQ1VSRSkgeworICAgICAgICAgICAgbUNhbWVyYU1lbW9yeVtpXSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ2FtZXJhTWVtb3J5W2ldID0gbUdldE1lbW9yeShtTWVtSW5mb1tpXS5mZCwgbU1lbUluZm9baV0uc2l6ZSwgMSwgdGhpcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUJ1ZmZlckNvdW50ID0gY291bnQ7CisgICAgQVRSQUNFX0VORCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhbGxvY2F0ZU1vcmUKKyAqCisgKiBERVNDUklQVElPTjogYWxsb2NhdGUgbW9yZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ1ZmZlcnMgb2YgY2VydGFpbiBzaXplCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjb3VudCAgIDogbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkCisgKiAgIEBzaXplICAgIDogbGVuZ2h0IG9mIHRoZSBidWZmZXIgdG8gYmUgYWxsb2NhdGVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFTdHJlYW1NZW1vcnk6OmFsbG9jYXRlTW9yZSh1aW50OF90IGNvdW50LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBBVFJBQ0VfQkVHSU5fU05QUklOVEYoIiVzICV6dSAlZCIsICJTdHJlYW1NZW1zaXplIiwgc2l6ZSwgY291bnQpOworICAgIHVuc2lnbmVkIGludCBoZWFwX2lkX21hc2sgPSAweDEgPDwgSU9OX0lPTU1VX0hFQVBfSUQ7CisgICAgaW50IHJjID0gYWxsb2MoY291bnQsIHNpemUsIGhlYXBfaWRfbWFzaywgTk9OX1NFQ1VSRSk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBBVFJBQ0VfRU5EKCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gbUJ1ZmZlckNvdW50OyBpIDwgbUJ1ZmZlckNvdW50ICsgY291bnQ7IGkrKykgeworICAgICAgICBtQ2FtZXJhTWVtb3J5W2ldID0gbUdldE1lbW9yeShtTWVtSW5mb1tpXS5mZCwgbU1lbUluZm9baV0uc2l6ZSwgMSwgdGhpcyk7CisgICAgfQorICAgIG1CdWZmZXJDb3VudCA9ICh1aW50OF90KShtQnVmZmVyQ291bnQgKyBjb3VudCk7CisgICAgQVRSQUNFX0VORCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkZWFsbG9jYXRlCisgKgorICogREVTQ1JJUFRJT046IGRlYWxsb2NhdGUgYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhU3RyZWFtTWVtb3J5OjpkZWFsbG9jYXRlKCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1CdWZmZXJDb3VudDsgaSArKykgeworICAgICAgICBpZiAobUNhbWVyYU1lbW9yeVtpXSkKKyAgICAgICAgICAgIG1DYW1lcmFNZW1vcnlbaV0tPnJlbGVhc2UobUNhbWVyYU1lbW9yeVtpXSk7CisgICAgICAgIG1DYW1lcmFNZW1vcnlbaV0gPSBOVUxMOworICAgIH0KKyAgICBkZWFsbG9jKCk7CisgICAgbUJ1ZmZlckNvdW50ID0gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYWNoZU9wcworICoKKyAqIERFU0NSSVBUSU9OOiBpb24gcmVsYXRlZCBtZW1vcnkgY2FjaGUgb3BlcmF0aW9ucworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGluZGV4IG9mIHRoZSBidWZmZXIKKyAqICAgQGNtZCAgICAgOiBjYWNoZSBvcHMgY29tbWFuZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhU3RyZWFtTWVtb3J5OjpjYWNoZU9wcyh1aW50MzJfdCBpbmRleCwgdW5zaWduZWQgaW50IGNtZCkKK3sKKyAgICBpZiAoaW5kZXggPj0gbUJ1ZmZlckNvdW50KQorICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIHJldHVybiBjYWNoZU9wc0ludGVybmFsKGluZGV4LCBjbWQsIG1DYW1lcmFNZW1vcnlbaW5kZXhdLT5kYXRhKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRSZWdGbGFncworICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBpbml0aWFsIHJlZyBmbGFncworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVnRmxhZ3M6IGluaXRpYWwgcmVnIGZsYWdzIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhU3RyZWFtTWVtb3J5OjpnZXRSZWdGbGFncyh1aW50OF90ICpyZWdGbGFncykgY29uc3QKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1CdWZmZXJDb3VudDsgaSArKykKKyAgICAgICAgcmVnRmxhZ3NbaV0gPSAxOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRNZW1vcnkKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IGNhbWVyYSBtZW1vcnkKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBidWZmZXIgaW5kZXgKKyAqICAgQG1ldGFkYXRhOiBmbGFnIGlmIGl0J3MgbWV0YWRhdGEKKyAqCisgKiBSRVRVUk4gICAgIDogY2FtZXJhIG1lbW9yeSBwdHIKKyAqICAgICAgICAgICAgICBOVUxMIGlmIG5vdCBzdXBwb3J0ZWQgb3IgZmFpbGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2NhbWVyYV9tZW1vcnlfdCAqUUNhbWVyYVN0cmVhbU1lbW9yeTo6Z2V0TWVtb3J5KHVpbnQzMl90IGluZGV4LAorICAgICAgICBib29sIG1ldGFkYXRhKSBjb25zdAoreworICAgIGlmIChpbmRleCA+PSBtQnVmZmVyQ291bnQgfHwgbWV0YWRhdGEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBtQ2FtZXJhTWVtb3J5W2luZGV4XTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRNYXRjaEJ1ZkluZGV4CisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IGJ1ZmZlciBpbmRleCBieSBvcGFxdWUgcHRyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBvcGFxdWUgIDogb3BhcXVlIHB0cgorICogICBAbWV0YWRhdGE6IGZsYWcgaWYgaXQncyBtZXRhZGF0YQorICoKKyAqIFJFVFVSTiAgICAgOiBidWZmZXIgaW5kZXggaWYgbWF0Y2ggZm91bmQsCisgKiAgICAgICAgICAgICAgLTEgaWYgZmFpbGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhU3RyZWFtTWVtb3J5OjpnZXRNYXRjaEJ1ZkluZGV4KGNvbnN0IHZvaWQgKm9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWV0YWRhdGEpIGNvbnN0Cit7CisgICAgaW50IGluZGV4ID0gLTE7CisgICAgaWYgKG1ldGFkYXRhKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQnVmZmVyQ291bnQ7IGkrKykgeworICAgICAgICBpZiAobUNhbWVyYU1lbW9yeVtpXS0+ZGF0YSA9PSBvcGFxdWUpIHsKKyAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbmRleDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRQdHIKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIGJ1ZmZlciBwb2ludGVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBidWZmZXIgcHRyCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgKlFDYW1lcmFTdHJlYW1NZW1vcnk6OmdldFB0cih1aW50MzJfdCBpbmRleCkgY29uc3QKK3sKKyAgICBpZiAoaW5kZXggPj0gbUJ1ZmZlckNvdW50KSB7CisgICAgICAgIExPR0UoImluZGV4IG91dCBvZiBib3VuZCIpOworICAgICAgICByZXR1cm4gKHZvaWQgKilCQURfSU5ERVg7CisgICAgfQorICAgIGlmIChtQ2FtZXJhTWVtb3J5W2luZGV4XSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbUNhbWVyYU1lbW9yeVtpbmRleF0tPmRhdGE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYVZpZGVvTWVtb3J5CisgKgorICogREVTQ1JJUFRJT046IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmFWaWRlb01lbW9yeQorICogICAgICAgICAgICAgIFZpZGVvU3RyZWFtIGJ1ZmZlcnMgYWxzbyBpbmNsdWRlIG1ldGFkYXRhIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1lbW9yeSAgICA6IGNhbWVyYSBtZW1vcnkgcmVxdWVzdCBvcHMgdGFibGUKKyAqICAgQGNhY2hlZCAgICA6IGZsYWcgaW5kaWNhdGVzIGlmIHVzaW5nIGNhY2hlZCBJT04gbWVtb3J5CisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYVZpZGVvTWVtb3J5OjpRQ2FtZXJhVmlkZW9NZW1vcnkoY2FtZXJhX3JlcXVlc3RfbWVtb3J5IG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FjaGVkLCBRQ2FtZXJhTWVtVHlwZSBidWZUeXBlKQorICAgIDogUUNhbWVyYVN0cmVhbU1lbW9yeShtZW1vcnksIGNhY2hlZCkKK3sKKyAgICBtZW1zZXQobU1ldGFkYXRhLCAwLCBzaXplb2YobU1ldGFkYXRhKSk7CisgICAgbWVtc2V0KG1OYXRpdmVIYW5kbGUsIDAsIHNpemVvZihtTmF0aXZlSGFuZGxlKSk7CisgICAgbU1ldGFCdWZDb3VudCA9IDA7CisgICAgbUJ1ZlR5cGUgPSBidWZUeXBlOworICAgIC8vU2V0IERlZmF1bHQgY29sb3IgY29udmVyc2lvbiBmb3JtYXQKKyAgICBtVXNhZ2UgPSBwcml2YXRlX2hhbmRsZV90OjpQUklWX0ZMQUdTX0lUVV9SXzYwMV9GUjsKKworICAgIC8vU2V0IERlZmF1bHQgZnJhbWUgZm9ybWF0CisgICAgbUZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhVmlkZW9NZW1vcnkKKyAqCisgKiBERVNDUklQVElPTjogZGVjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhVmlkZW9NZW1vcnkKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFWaWRlb01lbW9yeTo6flFDYW1lcmFWaWRlb01lbW9yeSgpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWxsb2NhdGUKKyAqCisgKiBERVNDUklQVElPTjogYWxsb2NhdGUgcmVxdWVzdGVkIG51bWJlciBvZiBidWZmZXJzIG9mIGNlcnRhaW4gc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY291bnQgICA6IG51bWJlciBvZiBidWZmZXJzIHRvIGJlIGFsbG9jYXRlZAorICogICBAc2l6ZSAgICA6IGxlbmdodCBvZiB0aGUgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhVmlkZW9NZW1vcnk6OmFsbG9jYXRlKHVpbnQ4X3QgY291bnQsIHNpemVfdCBzaXplLCB1aW50MzJfdCBpc1NlY3VyZSkKK3sKKyAgICBBVFJBQ0VfQkVHSU5fU05QUklOVEYoIiVzICV6dSAlZCIsICJWaWRlb01lbXNpemUiLCBzaXplLCBjb3VudCk7CisgICAgaW50IHJjID0gUUNhbWVyYVN0cmVhbU1lbW9yeTo6YWxsb2NhdGUoY291bnQsIHNpemUsIGlzU2VjdXJlKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIEFUUkFDRV9FTkQoKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmICghKG1CdWZUeXBlICYgUUNBTUVSQV9NRU1fVFlQRV9CQVRDSCkpIHsKKyAgICAgICAgLyoKKyAgICAgICAgKiAgICBGRHMgPSAxCisgICAgICAgICogICAgbnVtSW50cyAgPSA1IC8vb2Zmc2V0LCBzaXplLCB1c2FnZSwgdGltZXN0YW1wLCBmb3JtYXQgKyAxIGZvciBidWZmZXIgaW5kZXgKKyAgICAgICAgKi8KKyAgICAgICAgcmMgPSBhbGxvY2F0ZU1ldGEoY291bnQsIDEsIFZJREVPX01FVEFEQVRBX05VTV9JTlRTKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBVFJBQ0VfRU5EKCk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSArKykgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9ICBtTmF0aXZlSGFuZGxlW2ldOworICAgICAgICAgICAgaWYgKCFuaCkgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIGluIGdldHRpbmcgdmlkZW8gbmF0aXZlIGhhbmRsZSIpOworICAgICAgICAgICAgICAgIEFUUkFDRV9FTkQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmgtPmRhdGFbMF0gPSBtTWVtSW5mb1tpXS5mZDsKKyAgICAgICAgICAgIG5oLT5kYXRhWzFdID0gMDsKKyAgICAgICAgICAgIG5oLT5kYXRhWzJdID0gKGludCltTWVtSW5mb1tpXS5zaXplOworICAgICAgICAgICAgbmgtPmRhdGFbM10gPSBtVXNhZ2U7CisgICAgICAgICAgICBuaC0+ZGF0YVs0XSA9IDA7IC8vZHVtbXkgdmFsdWUgZm9yIHRpbWVzdGFtcCBpbiBub24tYmF0Y2ggbW9kZQorICAgICAgICAgICAgbmgtPmRhdGFbNV0gPSBtRm9ybWF0OworICAgICAgICB9CisgICAgfQorICAgIG1CdWZmZXJDb3VudCA9IGNvdW50OworICAgIEFUUkFDRV9FTkQoKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWxsb2NhdGVNb3JlCisgKgorICogREVTQ1JJUFRJT046IGFsbG9jYXRlIG1vcmUgcmVxdWVzdGVkIG51bWJlciBvZiBidWZmZXJzIG9mIGNlcnRhaW4gc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY291bnQgICA6IG51bWJlciBvZiBidWZmZXJzIHRvIGJlIGFsbG9jYXRlZAorICogICBAc2l6ZSAgICA6IGxlbmdodCBvZiB0aGUgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhVmlkZW9NZW1vcnk6OmFsbG9jYXRlTW9yZSh1aW50OF90IGNvdW50LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBBVFJBQ0VfQkVHSU5fU05QUklOVEYoIiVzICV6dSAlZCIsICJWaWRlb01lbXNpemUiLCBzaXplLCBjb3VudCk7CisgICAgaW50IHJjID0gUUNhbWVyYVN0cmVhbU1lbW9yeTo6YWxsb2NhdGVNb3JlKGNvdW50LCBzaXplKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIEFUUkFDRV9FTkQoKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmICghKG1CdWZUeXBlICYgUUNBTUVSQV9NRU1fVFlQRV9CQVRDSCkpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IG1CdWZmZXJDb3VudDsgaSA8IGNvdW50ICsgbUJ1ZmZlckNvdW50OyBpICsrKSB7CisgICAgICAgICAgICBtTWV0YWRhdGFbaV0gPSBtR2V0TWVtb3J5KC0xLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YobWVkaWFfbWV0YWRhdGFfYnVmZmVyKSwgMSwgdGhpcyk7CisgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YVtpXSkgeworICAgICAgICAgICAgICAgIExPR0UoImFsbG9jYXRpb24gb2YgdmlkZW8gbWV0YWRhdGEgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBtQnVmZmVyQ291bnQ7IGogPD0gaS0xOyBqICsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZXRhZGF0YVtqXS0+cmVsZWFzZShtTWV0YWRhdGFbal0pOworICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhTWVtb3J5W2pdLT5yZWxlYXNlKG1DYW1lcmFNZW1vcnlbal0pOworICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhTWVtb3J5W2pdID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgZGVhbGxvY09uZUJ1ZmZlcihtTWVtSW5mb1tqXSk7OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBVFJBQ0VfRU5EKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lZGlhX21ldGFkYXRhX2J1ZmZlciAqIHBhY2tldCA9CisgICAgICAgICAgICAgICAgICAgIChtZWRpYV9tZXRhZGF0YV9idWZmZXIgKiltTWV0YWRhdGFbaV0tPmRhdGE7CisgICAgICAgICAgICAvL0ZEcyA9IDEKKyAgICAgICAgICAgIC8vbnVtSW50cyAgPSA1IChvZmZzZXQsIHNpemUsIHVzYWdlLCB0aW1lc3RhbXAsIGZvcm1hdCkKKyAgICAgICAgICAgIG1OYXRpdmVIYW5kbGVbaV0gPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLAorICAgICAgICAgICAgICAgICAgICAoVklERU9fTUVUQURBVEFfTlVNX0lOVFMgKyBWSURFT19NRVRBREFUQV9OVU1fQ09NTU9OX0lOVFMpKTsKKyNpZmRlZiBVU0VfTUVESUFfRVhURU5TSU9OUworICAgICAgICAgICAgcGFja2V0LT5lVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2U7CisgICAgICAgICAgICBwYWNrZXQtPnBIYW5kbGUgPSBOVUxMOworI2Vsc2UKKyAgICAgICAgICAgIHBhY2tldC0+YnVmZmVyX3R5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlQ2FtZXJhU291cmNlOworICAgICAgICAgICAgcGFja2V0LT5tZXRhX2hhbmRsZSA9IG1OYXRpdmVIYW5kbGVbaV07CisjZW5kaWYKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPSAgbU5hdGl2ZUhhbmRsZVtpXTsKKyAgICAgICAgICAgIGlmICghbmgpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciBpbiBnZXR0aW5nIHZpZGVvIG5hdGl2ZSBoYW5kbGUiKTsKKyAgICAgICAgICAgICAgICBBVFJBQ0VfRU5EKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5oLT5kYXRhWzBdID0gbU1lbUluZm9baV0uZmQ7CisgICAgICAgICAgICBuaC0+ZGF0YVsxXSA9IDA7CisgICAgICAgICAgICBuaC0+ZGF0YVsyXSA9IChpbnQpbU1lbUluZm9baV0uc2l6ZTsKKyAgICAgICAgICAgIG5oLT5kYXRhWzNdID0gbVVzYWdlOworICAgICAgICAgICAgbmgtPmRhdGFbNF0gPSAwOyAvL2R1bW15IHZhbHVlIGZvciB0aW1lc3RhbXAgaW4gbm9uLWJhdGNoIG1vZGUKKyAgICAgICAgICAgIG5oLT5kYXRhWzVdID0gbUZvcm1hdDsKKyAgICAgICAgICAgIG5oLT5kYXRhWzZdID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmZmVyQ291bnQgPSAodWludDhfdCkobUJ1ZmZlckNvdW50ICsgY291bnQpOworICAgIG1NZXRhQnVmQ291bnQgPSBtQnVmZmVyQ291bnQ7CisgICAgQVRSQUNFX0VORCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhbGxvY2F0ZU1ldGEKKyAqCisgKiBERVNDUklQVElPTjogYWxsb2NhdGUgdmlkZW8gZW5jb2RlciBtZXRhZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZkX2NudCA6IFRvdGFsIEZEIGNvdW50CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFWaWRlb01lbW9yeTo6YWxsb2NhdGVNZXRhKHVpbnQ4X3QgYnVmX2NudCwgaW50IG51bUZEcywgaW50IG51bUludHMpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgaW50IG1Ub3RhbEludHMgPSAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWZfY250OyBpKyspIHsKKyAgICAgICAgbU1ldGFkYXRhW2ldID0gbUdldE1lbW9yeSgtMSwKKyAgICAgICAgICAgICAgICBzaXplb2YobWVkaWFfbWV0YWRhdGFfYnVmZmVyKSwgMSwgdGhpcyk7CisgICAgICAgIGlmICghbU1ldGFkYXRhW2ldKSB7CisgICAgICAgICAgICBMT0dFKCJhbGxvY2F0aW9uIG9mIHZpZGVvIG1ldGFkYXRhIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAoaSAtIDEpOyBqID49IDA7IGotLSkgeworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IG1OYXRpdmVIYW5kbGVbal0pIHsKKyAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShtTmF0aXZlSGFuZGxlW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbU1ldGFkYXRhW2pdLT5yZWxlYXNlKG1NZXRhZGF0YVtqXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG1lZGlhX21ldGFkYXRhX2J1ZmZlciAqcGFja2V0ID0KKyAgICAgICAgICAgICAgICAobWVkaWFfbWV0YWRhdGFfYnVmZmVyICopbU1ldGFkYXRhW2ldLT5kYXRhOworICAgICAgICBtVG90YWxJbnRzID0gKG51bUludHMgKiBudW1GRHMpOworICAgICAgICBtTmF0aXZlSGFuZGxlW2ldID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUobnVtRkRzLAorICAgICAgICAgICAgICAgIChtVG90YWxJbnRzICsgVklERU9fTUVUQURBVEFfTlVNX0NPTU1PTl9JTlRTKSk7CisgICAgICAgIGlmIChtTmF0aXZlSGFuZGxlW2ldID09IE5VTEwpIHsKKyAgICAgICAgICAgIExPR0UoIkVycm9yIGluIGdldHRpbmcgdmlkZW8gbmF0aXZlIGhhbmRsZSIpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IChpIC0gMSk7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICAgICAgbU1ldGFkYXRhW2ldLT5yZWxlYXNlKG1NZXRhZGF0YVtpXSk7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gbU5hdGl2ZUhhbmRsZVtqXSkgeworICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG1OYXRpdmVIYW5kbGVbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTWV0YWRhdGFbal0tPnJlbGVhc2UobU1ldGFkYXRhW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvL2Fzc2lnbiBidWZmZXIgaW5kZXggdG8gbmF0aXZlIGhhbmRsZS4KKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmggPSAgbU5hdGl2ZUhhbmRsZVtpXTsKKyAgICAgICAgICAgIG5oLT5kYXRhW251bUZEcyArIG1Ub3RhbEludHNdID0gaTsKKyAgICAgICAgfQorI2lmZGVmIFVTRV9NRURJQV9FWFRFTlNJT05TCisgICAgICAgIHBhY2tldC0+ZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlOworICAgICAgICBwYWNrZXQtPnBIYW5kbGUgPSBOVUxMOworI2Vsc2UKKyAgICAgICAgcGFja2V0LT5idWZmZXJfdHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVDYW1lcmFTb3VyY2U7CisgICAgICAgIHBhY2tldC0+bWV0YV9oYW5kbGUgPSBtTmF0aXZlSGFuZGxlW2ldOworI2VuZGlmCisgICAgfQorICAgIG1NZXRhQnVmQ291bnQgPSBidWZfY250OworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkZWFsbG9jYXRlTWV0YQorICoKKyAqIERFU0NSSVBUSU9OOiBkZWFsbG9jYXRlIHZpZGVvIG1ldGFkYXRhIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYVZpZGVvTWVtb3J5OjpkZWFsbG9jYXRlTWV0YSgpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTWV0YUJ1ZkNvdW50OyBpKyspIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IG1OYXRpdmVIYW5kbGVbaV07CisgICAgICAgIGlmIChOVUxMICE9IG5oKSB7CisgICAgICAgICAgIGlmIChuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCkpIHsKKyAgICAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBkZWxldGUgbmF0aXZlIGhhbmRsZSIpOworICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIExPR0UoIm5hdGl2ZSBoYW5kbGUgbm90IGF2YWlsYWJsZSIpOworICAgICAgICB9CisgICAgICAgIG1OYXRpdmVIYW5kbGVbaV0gPSBOVUxMOworICAgICAgICBtTWV0YWRhdGFbaV0tPnJlbGVhc2UobU1ldGFkYXRhW2ldKTsKKyAgICAgICAgbU1ldGFkYXRhW2ldID0gTlVMTDsKKyAgICB9CisgICAgbU1ldGFCdWZDb3VudCA9IDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkZWFsbG9jYXRlCisgKgorICogREVTQ1JJUFRJT046IGRlYWxsb2NhdGUgYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhVmlkZW9NZW1vcnk6OmRlYWxsb2NhdGUoKQoreworICAgIGRlYWxsb2NhdGVNZXRhKCk7CisKKyAgICBRQ2FtZXJhU3RyZWFtTWVtb3J5OjpkZWFsbG9jYXRlKCk7CisgICAgbUJ1ZmZlckNvdW50ID0gMDsKKyAgICBtTWV0YUJ1ZkNvdW50ID0gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRNZW1vcnkKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IGNhbWVyYSBtZW1vcnkKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBidWZmZXIgaW5kZXgKKyAqICAgQG1ldGFkYXRhOiBmbGFnIGlmIGl0J3MgbWV0YWRhdGEKKyAqCisgKiBSRVRVUk4gICAgIDogY2FtZXJhIG1lbW9yeSBwdHIKKyAqICAgICAgICAgICAgICBOVUxMIGlmIG5vdCBzdXBwb3J0ZWQgb3IgZmFpbGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2NhbWVyYV9tZW1vcnlfdCAqUUNhbWVyYVZpZGVvTWVtb3J5OjpnZXRNZW1vcnkodWludDMyX3QgaW5kZXgsCisgICAgICAgIGJvb2wgbWV0YWRhdGEpIGNvbnN0Cit7CisgICAgaWYgKGluZGV4ID49IG1NZXRhQnVmQ291bnQgfHwgKCFtZXRhZGF0YSAmJiBpbmRleCA+PSBtQnVmZmVyQ291bnQpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChtZXRhZGF0YSkgeworI2lmZGVmIFVTRV9NRURJQV9FWFRFTlNJT05TCisgICAgICAgIGludCBpOworICAgICAgICBtZWRpYV9tZXRhZGF0YV9idWZmZXIgKnBhY2tldCA9IE5VTEw7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1NZXRhQnVmQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcGFja2V0ID0gKG1lZGlhX21ldGFkYXRhX2J1ZmZlciAqKW1NZXRhZGF0YVtpXS0+ZGF0YTsKKyAgICAgICAgICAgIGlmIChwYWNrZXQgIT0gTlVMTCAmJiBwYWNrZXQtPnBIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHBhY2tldC0+cEhhbmRsZSA9IG1OYXRpdmVIYW5kbGVbaW5kZXhdOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpIDwgbU1ldGFCdWZDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIG1NZXRhZGF0YVtpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIk5vIGZyZWUgdmlkZW8gbWV0YSBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisjZWxzZQorICAgICAgICByZXR1cm4gbU1ldGFkYXRhW2luZGV4XTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtQ2FtZXJhTWVtb3J5W2luZGV4XTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TmF0aXZlSGFuZGxlCisgKgorICogREVTQ1JJUFRJT046IGdldE5hdGl2ZUhhbmRsZSBmcm9tIHZpZGVvIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGJ1ZmZlciBpbmRleAorICoKKyAqIFJFVFVSTiAgICAgOiBuYXRpdmVfaGFuZGxlX3QgICogdHlwZSBvZiBoYW5kbGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworbmF0aXZlX2hhbmRsZV90ICpRQ2FtZXJhVmlkZW9NZW1vcnk6OmdldE5hdGl2ZUhhbmRsZSh1aW50MzJfdCBpbmRleCwgYm9vbCBtZXRhZGF0YSkKK3sKKyAgICBpZiAoaW5kZXggPj0gbU1ldGFCdWZDb3VudCB8fCAhbWV0YWRhdGEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBtTmF0aXZlSGFuZGxlW2luZGV4XTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjbG9zZU5hdGl2ZUhhbmRsZQorICoKKyAqIERFU0NSSVBUSU9OOiBjbG9zZSB2aWRlbyBuYXRpdmUgaGFuZGxlIGFuZCB1cGRhdGUgY2FjaGVkIHB0cnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRhdGEgIDogcHRyIHRvIHZpZGVvIGZyYW1lIHRvIGJlIHJldHVybmVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFWaWRlb01lbW9yeTo6Y2xvc2VOYXRpdmVIYW5kbGUoY29uc3Qgdm9pZCAqZGF0YSwgYm9vbCBtZXRhZGF0YSkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisjaWZkZWYgVVNFX01FRElBX0VYVEVOU0lPTlMKKyAgICBpZiAobWV0YWRhdGEpIHsKKyAgICAgICAgY29uc3QgbWVkaWFfbWV0YWRhdGFfYnVmZmVyICpwYWNrZXQgPQorICAgICAgICAgICAgICAgICAgICAoY29uc3QgbWVkaWFfbWV0YWRhdGFfYnVmZmVyICopZGF0YTsKKyAgICAgICAgaWYgKChwYWNrZXQgIT0gTlVMTCkgJiYgKHBhY2tldC0+ZVR5cGUgPT0KKyAgICAgICAgICAgICAgICBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlKQorICAgICAgICAgICAgICAgICYmIChwYWNrZXQtPnBIYW5kbGUpKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NZXRhQnVmQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmKG1NZXRhZGF0YVtpXS0+ZGF0YSA9PSBkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhX21ldGFkYXRhX2J1ZmZlciAqbWVtID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVkaWFfbWV0YWRhdGFfYnVmZmVyICopbU1ldGFkYXRhW2ldLT5kYXRhOworICAgICAgICAgICAgICAgICAgICBtZW0tPnBIYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBEYXRhLiBDb3VsZCBub3QgcmVsZWFzZSIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coIldhcm5pbmc6IE5vdCBvZiB0eXBlIHZpZGVvIG1ldGEgYnVmZmVyIik7CisgICAgfQorI2Vsc2UKKyAgICAodm9pZCkgZGF0YTsKKyAgICAodm9pZCkgbWV0YWRhdGE7CisjZW5kaWYKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TWF0Y2hCdWZJbmRleAorICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBidWZmZXIgaW5kZXggYnkgb3BhcXVlIHB0cgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb3BhcXVlICA6IG9wYXF1ZSBwdHIKKyAqICAgQG1ldGFkYXRhOiBmbGFnIGlmIGl0J3MgbWV0YWRhdGEKKyAqCisgKiBSRVRVUk4gICAgIDogYnVmZmVyIGluZGV4IGlmIG1hdGNoIGZvdW5kLAorICogICAgICAgICAgICAgIC0xIGlmIGZhaWxlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYVZpZGVvTWVtb3J5OjpnZXRNYXRjaEJ1ZkluZGV4KGNvbnN0IHZvaWQgKm9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtZXRhZGF0YSkgY29uc3QKK3sKKyAgICBpbnQgaW5kZXggPSAtMTsKKworICAgIGlmIChtZXRhZGF0YSkgeworI2lmZGVmIFVTRV9NRURJQV9FWFRFTlNJT05TCisgICAgICAgIGNvbnN0IG1lZGlhX21ldGFkYXRhX2J1ZmZlciAqcGFja2V0ID0KKyAgICAgICAgICAgICAgICAoY29uc3QgbWVkaWFfbWV0YWRhdGFfYnVmZmVyICopb3BhcXVlOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKm5oID0gTlVMTDsKKyAgICAgICAgaWYgKChwYWNrZXQgIT0gTlVMTCkgJiYgKHBhY2tldC0+ZVR5cGUgPT0KKyAgICAgICAgICAgICAgICBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlKQorICAgICAgICAgICAgICAgICYmIChwYWNrZXQtPnBIYW5kbGUpKSB7CisgICAgICAgICAgICBuaCA9IChuYXRpdmVfaGFuZGxlX3QgKilwYWNrZXQtPnBIYW5kbGU7CisgICAgICAgICAgICBpbnQgbUNvbW1vbklkeCA9IChuaC0+bnVtSW50cyArIG5oLT5udW1GZHMgLQorICAgICAgICAgICAgICAgICAgICBWSURFT19NRVRBREFUQV9OVU1fQ09NTU9OX0lOVFMpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTWV0YUJ1ZkNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZihuaC0+ZGF0YVttQ29tbW9uSWR4XSA9PSBtTmF0aXZlSGFuZGxlW2ldLT5kYXRhW21Db21tb25JZHhdKSB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZWxzZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NZXRhQnVmQ291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYobU1ldGFkYXRhW2ldLT5kYXRhID09IG9wYXF1ZSkgeworICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQnVmZmVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKG1DYW1lcmFNZW1vcnlbaV0tPmRhdGEgPT0gb3BhcXVlKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbmRleDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRWaWRlb0luZm8KKyAqCisgKiBERVNDUklQVElPTjogc2V0IG5hdGl2ZSB3aW5kb3cgZ3JhbGxvYyBvcHMgdGFibGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHVzYWdlIDogdXNhZ2UgYml0IGZvciB2aWRlbworICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYVZpZGVvTWVtb3J5OjpzZXRWaWRlb0luZm8oaW50IHVzYWdlLCBjYW1fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIG1Vc2FnZSB8PSB1c2FnZTsKKyAgICBtRm9ybWF0ID0gY29udkNhbXRvT01YRm9ybWF0KGZvcm1hdCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY29udkNhbXRvT01YRm9ybWF0CisgKgorICogREVTQ1JJUFRJT046IG1hcCBjYW1fZm9ybWF0X3QgdG8gY29ycmVzcG9uZGluZyBPTVggZm9ybWF0CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmb3JtYXQgOiBmb3JtYXQgaW4gY2FtX2Zvcm1hdF90IHR5cGUKKyAqCisgKiBSRVRVUk4gICAgIDogb214IGZvcm1hdAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYVZpZGVvTWVtb3J5Ojpjb252Q2FtdG9PTVhGb3JtYXQoY2FtX2Zvcm1hdF90IGZvcm1hdCkKK3sKKyAgICBpbnQgb214Rm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYyMToKKyAgICAgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYyMV9WRU5VUzoKKyAgICAgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYyMV9BRFJFTk86CisgICAgICAgICAgICBvbXhGb3JtYXQgPSBRT01YX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMjoKKyAgICAgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9WRU5VUzoKKyAgICAgICAgICAgIG9teEZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOworICAgICAgICAgICAgYnJlYWs7CisjaWZuZGVmIFZBTklMTEFfSEFMCisgICAgICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVUJXQzoKKyAgICAgICAgICAgIG9teEZvcm1hdCA9IFFPTVhfQ09MT1JfRk9STUFUWVVWNDIwUGFja2VkU2VtaVBsYW5hcjMybUNvbXByZXNzZWQ7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb214Rm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7CisgICAgfQorICAgIHJldHVybiBvbXhGb3JtYXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYUdyYWxsb2NNZW1vcnkKKyAqCisgKiBERVNDUklQVElPTjogY29uc3RydWN0b3Igb2YgUUNhbWVyYUdyYWxsb2NNZW1vcnkKKyAqICAgICAgICAgICAgICBwcmV2aWV3IHN0cmVhbSBidWZmZXJzIGFyZSBhbGxvY2F0ZWQgZnJvbSBncmFsbG9jIG5hdGl2ZV93aW5kb2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1lbW9yeSAgICA6IGNhbWVyYSBtZW1vcnkgcmVxdWVzdCBvcHMgdGFibGUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhR3JhbGxvY01lbW9yeTo6UUNhbWVyYUdyYWxsb2NNZW1vcnkoY2FtZXJhX3JlcXVlc3RfbWVtb3J5IG1lbW9yeSkKKyAgICAgICAgOiBRQ2FtZXJhTWVtb3J5KHRydWUpLCBtQ29sb3JTcGFjZShJVFVfUl82MDFfRlIpCit7CisgICAgbU1pblVuZGVxdWV1ZWRCdWZmZXJzID0gMDsKKyAgICBtTWFwcGFibGVCdWZmZXJzID0gMDsKKyAgICBtV2luZG93ID0gTlVMTDsKKyAgICBtV2lkdGggPSBtSGVpZ2h0ID0gbVN0cmlkZSA9IG1TY2FubGluZSA9IG1Vc2FnZSA9IDA7CisgICAgbUZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOworICAgIG1HZXRNZW1vcnkgPSBtZW1vcnk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVM7IGkgKyspIHsKKyAgICAgICAgbUJ1ZmZlckhhbmRsZVtpXSA9IE5VTEw7CisgICAgICAgIG1Mb2NhbEZsYWdbaV0gPSBCVUZGRVJfTk9UX09XTkVEOworICAgICAgICBtUHJpdmF0ZUhhbmRsZVtpXSA9IE5VTEw7CisgICAgICAgIG1CdWZmZXJTdGF0dXNbaV0gPSBTVEFUVVNfSURMRTsKKyAgICAgICAgbUNhbWVyYU1lbW9yeVtpXSA9IE5VTEw7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhR3JhbGxvY01lbW9yeQorICoKKyAqIERFU0NSSVBUSU9OOiBkZWNvbnN0cnVjdG9yIG9mIFFDYW1lcmFHcmFsbG9jTWVtb3J5CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhR3JhbGxvY01lbW9yeTo6flFDYW1lcmFHcmFsbG9jTWVtb3J5KCkKK3sKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRXaW5kb3dJbmZvCisgKgorICogREVTQ1JJUFRJT046IHNldCBuYXRpdmUgd2luZG93IGdyYWxsb2Mgb3BzIHRhYmxlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB3aW5kb3cgIDogZ3JhbGxvYyBvcHMgdGFibGUgcHRyCisgKiAgIEB3aWR0aCAgIDogd2lkdGggb2YgcHJldmlldyBmcmFtZQorICogICBAaGVpZ2h0ICA6IGhlaWdodCBvZiBwcmV2aWV3IGZyYW1lCisgKiAgIEBzdHJpZGUgIDogc3RyaWRlIG9mIHByZXZpZXcgZnJhbWUKKyAqICAgQHNjYW5saW5lOiBzY2FubGluZSBvZiBwcmV2aWV3IGZyYW1lCisgKiAgIEBmb3JhbXQgIDogZm9ybWF0IG9mIHByZXZpZXcgaW1hZ2UKKyAqICAgQG1heEZQUyA6IG1heCBmcHMgb2YgcHJldmlldyBzdHJlYW0KKyAqICAgQHVzYWdlIDogdXNhZ2UgYml0IGZvciBncmFsbG9jCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhR3JhbGxvY01lbW9yeTo6c2V0V2luZG93SW5mbyhwcmV2aWV3X3N0cmVhbV9vcHNfdCAqd2luZG93LAorICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIGludCBzY2FubGluZSwgaW50IGZvcm1hdCwgaW50IG1heEZQUywgaW50IHVzYWdlKQoreworICAgIG1XaW5kb3cgPSB3aW5kb3c7CisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKKyAgICBtU3RyaWRlID0gc3RyaWRlOworICAgIG1TY2FubGluZSA9IHNjYW5saW5lOworICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgbVVzYWdlID0gdXNhZ2U7CisgICAgc2V0TWF4RlBTKG1heEZQUyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0TWF4RlBTCisgKgorICogREVTQ1JJUFRJT046IHNldCBtYXggZnBzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtYXhGUFMgOiBtYXggZnBzIG9mIHByZXZpZXcgc3RyZWFtCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhR3JhbGxvY01lbW9yeTo6c2V0TWF4RlBTKGludCBtYXhGUFMpCit7CisgICAgLyogaW5wdXQgd2lsbCBiZSBpbiBtdWx0aXBsZXMgb2YgMTAwMCAqLworICAgIG1heEZQUyA9IChtYXhGUFMgKyA1MDApLzEwMDA7CisKKyAgICAvKiBzZXQgdGhlIGxvd2VyIGNhcCB0byAzMCBhbHdheXMsIGJlY2F1c2Ugd2UgYXJlIG5vdCBzdXBwb3J0aW5nIHJ1bnRpbWUgdXBkYXRlIG9mIGZwcyBpbmZvCisgICAgICB0byBkaXNwbGF5LiBPdGhlcndpc2UgTURQIG1heSByZXN1bHQgaW4gdW5kZXJydW5zIChmb3IgZXhhbXBsZSBpZiBpbml0aWFsIGZwcyBpcyAxNW1heCBhbmQgbGF0ZXIKKyAgICAgIGNoYW5nZWQgdG8gMzApLiovCisgICAgaWYgKG1heEZQUyA8IDMwKSB7CisgICAgICAgIG1heEZQUyA9IDMwOworICAgIH0KKworICAgIC8qIHRoZSBuZXcgZnBzIHdpbGwgYmUgdXBkYXRlZCBpbiBtZXRhZGF0YSBvZiB0aGUgbmV4dCBmcmFtZSBlbnF1ZXVlZCB0byBkaXNwbGF5Ki8KKyAgICBtTWF4RlBTID0gbWF4RlBTOworICAgIExPR0goIlNldHRpbmcgbWF4IGZwcyAlZCB0byBkaXNwbGF5IiwgbWF4RlBTKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkaXNwbGF5QnVmZmVyCisgKgorICogREVTQ1JJUFRJT046IHNlbmQgcmVjZWl2ZWQgZnJhbWUgdG8gZGlzcGxheQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGluZGV4IG9mIHByZXZpZXcgZnJhbWUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYUdyYWxsb2NNZW1vcnk6OmRpc3BsYXlCdWZmZXIodWludDMyX3QgaW5kZXgpCit7CisgICAgaW50IGVyciA9IE5PX0VSUk9SOworICAgIGludCBkZXF1ZXVlZElkeCA9IEJBRF9JTkRFWDsKKworICAgIGlmIChCVUZGRVJfTk9UX09XTkVEID09IG1Mb2NhbEZsYWdbaW5kZXhdKSB7CisgICAgICAgIExPR0UoImJ1ZmZlciB0byBiZSBlbnF1ZXVlZCBpcyBub3Qgb3duZWQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGVyciA9IG1XaW5kb3ctPmVucXVldWVfYnVmZmVyKG1XaW5kb3csIChidWZmZXJfaGFuZGxlX3QgKiltQnVmZmVySGFuZGxlW2luZGV4XSk7CisgICAgaWYoZXJyICE9IDApIHsKKyAgICAgICAgTE9HRSgiZW5xdWV1ZV9idWZmZXIgZmFpbGVkLCBlcnIgPSAlZCIsIGVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiZW5xdWV1ZV9idWZmZXIgaGRsPSVwIiwgKm1CdWZmZXJIYW5kbGVbaW5kZXhdKTsKKyAgICAgICAgbUxvY2FsRmxhZ1tpbmRleF0gPSBCVUZGRVJfTk9UX09XTkVEOworICAgIH0KKworICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyX2hhbmRsZSA9IE5VTEw7CisgICAgaW50IHN0cmlkZSA9IDA7CisgICAgZXJyID0gbVdpbmRvdy0+ZGVxdWV1ZV9idWZmZXIobVdpbmRvdywgJmJ1ZmZlcl9oYW5kbGUsICZzdHJpZGUpOworICAgIGlmIChlcnIgPT0gTk9fRVJST1IgJiYgYnVmZmVyX2hhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIGludCBpOworICAgICAgICBMT0dEKCJkZXF1ZWQgYnVmIGhkbCA9JXAiLCAqYnVmZmVyX2hhbmRsZSk7CisgICAgICAgIGZvcihpID0gMDsgaSA8IG1NYXBwYWJsZUJ1ZmZlcnM7IGkrKykgeworICAgICAgICAgICAgaWYobUJ1ZmZlckhhbmRsZVtpXSA9PSBidWZmZXJfaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgTE9HRCgiRm91bmQgYnVmZmVyIGluIGlkeDolZCIsIGkpOworICAgICAgICAgICAgICAgIG1Mb2NhbEZsYWdbaV0gPSBCVUZGRVJfT1dORUQ7CisgICAgICAgICAgICAgICAgZGVxdWV1ZWRJZHggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChkZXF1ZXVlZElkeCA9PSBCQURfSU5ERVgpICYmIChtTWFwcGFibGVCdWZmZXJzIDwgbUJ1ZmZlckNvdW50KSkgeworICAgICAgICAgICAgZGVxdWV1ZWRJZHggPSBtTWFwcGFibGVCdWZmZXJzOworICAgICAgICAgICAgTE9HRCgiUGxhY2luZyBidWZmZXIgaW4gaWR4OiVkIiwgZGVxdWV1ZWRJZHgpOworICAgICAgICAgICAgbUJ1ZmZlckhhbmRsZVtkZXF1ZXVlZElkeF0gPSBidWZmZXJfaGFuZGxlOworICAgICAgICAgICAgbUxvY2FsRmxhZ1tkZXF1ZXVlZElkeF0gPSBCVUZGRVJfT1dORUQ7CisKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlW2RlcXVldWVkSWR4XSA9CisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgcHJpdmF0ZV9oYW5kbGVfdCAqKSgqbUJ1ZmZlckhhbmRsZVtkZXF1ZXVlZElkeF0pOworICAgICAgICAgICAgbU1lbUluZm9bZGVxdWV1ZWRJZHhdLm1haW5faW9uX2ZkID0gb3BlbigiL2Rldi9pb24iLCBPX1JET05MWSk7CisgICAgICAgICAgICBpZiAobU1lbUluZm9bZGVxdWV1ZWRJZHhdLm1haW5faW9uX2ZkIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoImZhaWxlZDogY291bGQgbm90IG9wZW4gaW9uIGRldmljZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cnVjdCBpb25fZmRfZGF0YSBpb25faW5mb19mZDsKKyAgICAgICAgICAgIG1lbXNldCgmaW9uX2luZm9fZmQsIDAsIHNpemVvZihpb25faW5mb19mZCkpOworICAgICAgICAgICAgaW9uX2luZm9fZmQuZmQgPSBtUHJpdmF0ZUhhbmRsZVtkZXF1ZXVlZElkeF0tPmZkOworICAgICAgICAgICAgaWYgKGlvY3RsKG1NZW1JbmZvW2RlcXVldWVkSWR4XS5tYWluX2lvbl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICBJT05fSU9DX0lNUE9SVCwgJmlvbl9pbmZvX2ZkKSA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJJT04gaW1wb3J0IGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUNhbWVyYU1lbW9yeVtkZXF1ZXVlZElkeF0gPQorICAgICAgICAgICAgICAgICAgICBtR2V0TWVtb3J5KG1Qcml2YXRlSGFuZGxlW2RlcXVldWVkSWR4XS0+ZmQsCisgICAgICAgICAgICAgICAgICAgIChzaXplX3QpbVByaXZhdGVIYW5kbGVbZGVxdWV1ZWRJZHhdLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXRoaXMpOworICAgICAgICAgICAgTE9HSCgiaWR4ID0gJWQsIGZkID0gJWQsIHNpemUgPSAlZCwgb2Zmc2V0ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgZGVxdWV1ZWRJZHgsIG1Qcml2YXRlSGFuZGxlW2RlcXVldWVkSWR4XS0+ZmQsCisgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlW2RlcXVldWVkSWR4XS0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVbZGVxdWV1ZWRJZHhdLT5vZmZzZXQpOworICAgICAgICAgICAgbU1lbUluZm9bZGVxdWV1ZWRJZHhdLmZkID0gbVByaXZhdGVIYW5kbGVbZGVxdWV1ZWRJZHhdLT5mZDsKKyAgICAgICAgICAgIG1NZW1JbmZvW2RlcXVldWVkSWR4XS5zaXplID0KKyAgICAgICAgICAgICAgICAgICAgKHNpemVfdCltUHJpdmF0ZUhhbmRsZVtkZXF1ZXVlZElkeF0tPnNpemU7CisgICAgICAgICAgICBtTWVtSW5mb1tkZXF1ZXVlZElkeF0uaGFuZGxlID0gaW9uX2luZm9fZmQuaGFuZGxlOworCisgICAgICAgICAgICBtTWFwcGFibGVCdWZmZXJzKys7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dXKCJkZXF1ZXVlX2J1ZmZlciwgbm8gZnJlZSBidWZmZXIgZnJvbSBkaXNwbGF5IG5vdyIpOworICAgIH0KKyAgICByZXR1cm4gZGVxdWV1ZWRJZHg7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZW5xdWV1ZUJ1ZmZlcgorICoKKyAqIERFU0NSSVBUSU9OOiBlbnF1ZXVlIGNhbWVyYSBmcmFtZSB0byBkaXNwbGF5CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgZnJhbWUKKyAqICAgQHRpbWVTdGFtcCA6IGZyYW1lIHByZXNlbnRhdGlvbiB0aW1lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhR3JhbGxvY01lbW9yeTo6ZW5xdWV1ZUJ1ZmZlcih1aW50MzJfdCBpbmRleCwgbnNlY3NfdCB0aW1lU3RhbXApCit7CisgICAgaW50MzJfdCBlcnIgPSBOT19FUlJPUjsKKworICAgIGlmIChCVUZGRVJfTk9UX09XTkVEID09IG1Mb2NhbEZsYWdbaW5kZXhdKSB7CisgICAgICAgIExPR0UoImJ1ZmZlciB0byBiZSBlbnF1ZXVlZCBpcyBub3Qgb3duZWQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmICh0aW1lU3RhbXAgIT0gMCkgeworICAgICAgICBlcnIgPSBtV2luZG93LT5zZXRfdGltZXN0YW1wKG1XaW5kb3csIHRpbWVTdGFtcCk7CisgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIG5hdGl2ZSB3aW5kb3cgdGltZXN0YW1wIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlcnIgPSBtV2luZG93LT5lbnF1ZXVlX2J1ZmZlcihtV2luZG93LCAoYnVmZmVyX2hhbmRsZV90ICopbUJ1ZmZlckhhbmRsZVtpbmRleF0pOworICAgIGlmKGVyciAhPSAwKSB7CisgICAgICAgIExPR0UoImVucXVldWVfYnVmZmVyIGZhaWxlZCwgZXJyID0gJWQiLCBlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoImVucXVldWVfYnVmZmVyIGhkbD0lcCIsICptQnVmZmVySGFuZGxlW2luZGV4XSk7CisgICAgICAgIG1Mb2NhbEZsYWdbaW5kZXhdID0gQlVGRkVSX05PVF9PV05FRDsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkZXF1ZXVlQnVmZmVyCisgKgorICogREVTQ1JJUFRJT046IHJlY2VpdmUgYSBidWZmZXIgZnJvbSBncmFsbG9jCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdAorICogICAgICAgICAgICAgIE5PX0VSUk9SL0J1ZmZlciBpbmRleCA6IFN1Y2Nlc3MKKyAqICAgICAgICAgICAgICA8IDAgZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYUdyYWxsb2NNZW1vcnk6OmRlcXVldWVCdWZmZXIoKQoreworICAgIGludDMyX3QgZXJyID0gTk9fRVJST1I7CisgICAgaW50MzJfdCBkZXF1ZXVlZElkeCA9IEJBRF9JTkRFWDsKKyAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcl9oYW5kbGUgPSBOVUxMOworICAgIGludDMyX3Qgc3RyaWRlID0gMDsKKworICAgIGRlcXVldWVkSWR4ID0gQkFEX0lOREVYOworICAgIGVyciA9IG1XaW5kb3ctPmRlcXVldWVfYnVmZmVyKG1XaW5kb3csICZidWZmZXJfaGFuZGxlLCAmc3RyaWRlKTsKKyAgICBpZiAoKGVyciA9PSBOT19FUlJPUikgJiYgKGJ1ZmZlcl9oYW5kbGUgIT0gTlVMTCkpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIExPR0QoImRlcXVlZCBidWYgaGRsID0lcCIsICpidWZmZXJfaGFuZGxlKTsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgbU1hcHBhYmxlQnVmZmVyczsgaSsrKSB7CisgICAgICAgICAgICBpZihtQnVmZmVySGFuZGxlW2ldID09IGJ1ZmZlcl9oYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJGb3VuZCBidWZmZXIgaW4gaWR4OiVkIiwgaSk7CisgICAgICAgICAgICAgICAgbUxvY2FsRmxhZ1tpXSA9IEJVRkZFUl9PV05FRDsKKyAgICAgICAgICAgICAgICBkZXF1ZXVlZElkeCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGRlcXVldWVkSWR4ID09IEJBRF9JTkRFWCkgJiYKKyAgICAgICAgICAgICAgICAobU1hcHBhYmxlQnVmZmVycyA8IG1CdWZmZXJDb3VudCkpIHsKKyAgICAgICAgICAgIGRlcXVldWVkSWR4ID0gbU1hcHBhYmxlQnVmZmVyczsKKyAgICAgICAgICAgIExPR0QoIlBsYWNpbmcgYnVmZmVyIGluIGlkeDolZCIsIGRlcXVldWVkSWR4KTsKKyAgICAgICAgICAgIG1CdWZmZXJIYW5kbGVbZGVxdWV1ZWRJZHhdID0gYnVmZmVyX2hhbmRsZTsKKyAgICAgICAgICAgIG1Mb2NhbEZsYWdbZGVxdWV1ZWRJZHhdID0gQlVGRkVSX09XTkVEOworCisgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZVtkZXF1ZXVlZElkeF0gPQorICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHByaXZhdGVfaGFuZGxlX3QgKikoKm1CdWZmZXJIYW5kbGVbZGVxdWV1ZWRJZHhdKTsKKyAgICAgICAgICAgIC8vdXBkYXRlIG1heCBmcHMgaW5mbworICAgICAgICAgICAgc2V0TWV0YURhdGEobVByaXZhdGVIYW5kbGVbZGVxdWV1ZWRJZHhdLCBVUERBVEVfUkVGUkVTSF9SQVRFLCAodm9pZCopJm1NYXhGUFMpOworICAgICAgICAgICAgbU1lbUluZm9bZGVxdWV1ZWRJZHhdLm1haW5faW9uX2ZkID0gb3BlbigiL2Rldi9pb24iLCBPX1JET05MWSk7CisgICAgICAgICAgICBpZiAobU1lbUluZm9bZGVxdWV1ZWRJZHhdLm1haW5faW9uX2ZkIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoImZhaWxlZDogY291bGQgbm90IG9wZW4gaW9uIGRldmljZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cnVjdCBpb25fZmRfZGF0YSBpb25faW5mb19mZDsKKyAgICAgICAgICAgIG1lbXNldCgmaW9uX2luZm9fZmQsIDAsIHNpemVvZihpb25faW5mb19mZCkpOworICAgICAgICAgICAgaW9uX2luZm9fZmQuZmQgPSBtUHJpdmF0ZUhhbmRsZVtkZXF1ZXVlZElkeF0tPmZkOworICAgICAgICAgICAgaWYgKGlvY3RsKG1NZW1JbmZvW2RlcXVldWVkSWR4XS5tYWluX2lvbl9mZCwKKyAgICAgICAgICAgICAgICAgICAgSU9OX0lPQ19JTVBPUlQsICZpb25faW5mb19mZCkgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiSU9OIGltcG9ydCBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldE1ldGFEYXRhKG1Qcml2YXRlSGFuZGxlW2RlcXVldWVkSWR4XSwgVVBEQVRFX0NPTE9SX1NQQUNFLAorICAgICAgICAgICAgICAgICAgICAmbUNvbG9yU3BhY2UpOworICAgICAgICAgICAgbUNhbWVyYU1lbW9yeVtkZXF1ZXVlZElkeF0gPQorICAgICAgICAgICAgICAgICAgICBtR2V0TWVtb3J5KG1Qcml2YXRlSGFuZGxlW2RlcXVldWVkSWR4XS0+ZmQsCisgICAgICAgICAgICAgICAgICAgIChzaXplX3QpbVByaXZhdGVIYW5kbGVbZGVxdWV1ZWRJZHhdLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXRoaXMpOworICAgICAgICAgICAgTE9HSCgiaWR4ID0gJWQsIGZkID0gJWQsIHNpemUgPSAlZCwgb2Zmc2V0ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgZGVxdWV1ZWRJZHgsIG1Qcml2YXRlSGFuZGxlW2RlcXVldWVkSWR4XS0+ZmQsCisgICAgICAgICAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlW2RlcXVldWVkSWR4XS0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVbZGVxdWV1ZWRJZHhdLT5vZmZzZXQpOworICAgICAgICAgICAgbU1lbUluZm9bZGVxdWV1ZWRJZHhdLmZkID0gbVByaXZhdGVIYW5kbGVbZGVxdWV1ZWRJZHhdLT5mZDsKKyAgICAgICAgICAgIG1NZW1JbmZvW2RlcXVldWVkSWR4XS5zaXplID0KKyAgICAgICAgICAgICAgICAgICAgKHNpemVfdCltUHJpdmF0ZUhhbmRsZVtkZXF1ZXVlZElkeF0tPnNpemU7CisgICAgICAgICAgICBtTWVtSW5mb1tkZXF1ZXVlZElkeF0uaGFuZGxlID0gaW9uX2luZm9fZmQuaGFuZGxlOworCisgICAgICAgICAgICBtTWFwcGFibGVCdWZmZXJzKys7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dXKCJkZXF1ZXVlX2J1ZmZlciwgbm8gZnJlZSBidWZmZXIgZnJvbSBkaXNwbGF5IG5vdyIpOworICAgIH0KKworICAgIHJldHVybiBkZXF1ZXVlZElkeDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFsbG9jYXRlCisgKgorICogREVTQ1JJUFRJT046IGFsbG9jYXRlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnVmZmVycyBvZiBjZXJ0YWluIHNpemUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNvdW50ICAgOiBudW1iZXIgb2YgYnVmZmVycyB0byBiZSBhbGxvY2F0ZWQKKyAqICAgQHNpemUgICAgOiBsZW5naHQgb2YgdGhlIGJ1ZmZlciB0byBiZSBhbGxvY2F0ZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYUdyYWxsb2NNZW1vcnk6OmFsbG9jYXRlKHVpbnQ4X3QgY291bnQsIHNpemVfdCAvKnNpemUqLywKKyAgICAgICAgdWludDMyX3QgLyppc1NlY3VyZSovKQoreworICAgIEFUUkFDRV9CRUdJTl9TTlBSSU5URigiJXMgJWQiLCAiR3JhbGxvY2J1ZmNudCIsIGNvdW50KTsKKyAgICBpbnQgZXJyID0gMDsKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICBpbnQgZ3JhbGxvY191c2FnZSA9IDA7CisgICAgc3RydWN0IGlvbl9mZF9kYXRhIGlvbl9pbmZvX2ZkOworICAgIG1lbXNldCgmaW9uX2luZm9fZmQsIDAsIHNpemVvZihpb25faW5mb19mZCkpOworCisgICAgTE9HRCgiRSAiKTsKKworICAgIGlmICghbVdpbmRvdykgeworICAgICAgICBMT0dFKCJJbnZhbGlkIG5hdGl2ZSB3aW5kb3ciKTsKKyAgICAgICAgQVRSQUNFX0VORCgpOworICAgICAgICByZXQgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLy8gSW5jcmVtZW50IGJ1ZmZlciBjb3VudCBieSBtaW4gdW5kZXF1ZXVlZCBidWZmZXIuCisgICAgZXJyID0gbVdpbmRvdy0+Z2V0X21pbl91bmRlcXVldWVkX2J1ZmZlcl9jb3VudChtV2luZG93LCZtTWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICBMT0dFKCJnZXRfbWluX3VuZGVxdWV1ZWRfYnVmZmVyX2NvdW50ICBmYWlsZWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgcmV0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgZXJyID0gbVdpbmRvdy0+c2V0X2J1ZmZlcl9jb3VudChtV2luZG93LCBjb3VudCk7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICBMT0dFKCJzZXRfYnVmZmVyX2NvdW50IGZhaWxlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgIHJldCA9IFVOS05PV05fRVJST1I7CisgICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBlcnIgPSBtV2luZG93LT5zZXRfYnVmZmVyc19nZW9tZXRyeShtV2luZG93LCBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgTE9HRSgic2V0X2J1ZmZlcnNfZ2VvbWV0cnkgZmFpbGVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgICByZXQgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgZ3JhbGxvY191c2FnZSA9IEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1dSSVRFOworICAgIGdyYWxsb2NfdXNhZ2UgfD0gbVVzYWdlOworICAgIGVyciA9IG1XaW5kb3ctPnNldF91c2FnZShtV2luZG93LCBncmFsbG9jX3VzYWdlKTsKKyAgICBpZihlcnIgIT0gMCkgeworICAgICAgICAvKiBzZXRfdXNhZ2UgZXJyb3Igb3V0ICovCisgICAgICAgIExPR0UoInNldF91c2FnZSByYyA9ICVkIiwgZXJyKTsKKyAgICAgICAgcmV0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIExPR0goInVzYWdlID0gJWQsIGdlb21ldHJ5OiAlcCwgJWQsICVkLCAlZCwgJWQsICVkIiwKKyAgICAgICAgICAgZ3JhbGxvY191c2FnZSwgbVdpbmRvdywgbVdpZHRoLCBtSGVpZ2h0LCBtU3RyaWRlLAorICAgICAgICAgIG1TY2FubGluZSwgbUZvcm1hdCk7CisKKyAgICBtQnVmZmVyQ291bnQgPSBjb3VudDsKKyAgICBpZiAoKGNvdW50IDwgbU1hcHBhYmxlQnVmZmVycykgfHwgKG1NYXBwYWJsZUJ1ZmZlcnMgPT0gMCkpIHsKKyAgICAgICAgbU1hcHBhYmxlQnVmZmVycyA9IGNvdW50OworICAgIH0KKworICAgIC8vQWxsb2NhdGUgY250IG51bWJlciBvZiBidWZmZXJzIGZyb20gbmF0aXZlIHdpbmRvdworICAgIGZvciAoaW50IGNudCA9IDA7IGNudCA8IG1NYXBwYWJsZUJ1ZmZlcnM7IGNudCsrKSB7CisgICAgICAgIGludCBzdHJpZGU7CisgICAgICAgIGVyciA9IG1XaW5kb3ctPmRlcXVldWVfYnVmZmVyKG1XaW5kb3csICZtQnVmZmVySGFuZGxlW2NudF0sICZzdHJpZGUpOworICAgICAgICBpZighZXJyKSB7CisgICAgICAgICAgICBMT0dEKCJkZXF1ZXVlIGJ1ZiBoZGwgPSVwIiwgbUJ1ZmZlckhhbmRsZVtjbnRdKTsKKyAgICAgICAgICAgIG1Mb2NhbEZsYWdbY250XSA9IEJVRkZFUl9PV05FRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Mb2NhbEZsYWdbY250XSA9IEJVRkZFUl9OT1RfT1dORUQ7CisgICAgICAgICAgICBMT0dFKCJkZXF1ZXVlX2J1ZmZlciBpZHggPSAlZCBlcnIgPSAlZCIsIGNudCwgZXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIExPR0QoImRlcXVldWUgYnVmOiAlcFxuIiwgbUJ1ZmZlckhhbmRsZVtjbnRdKTsKKworICAgICAgICBpZihlcnIgIT0gMCkgeworICAgICAgICAgICAgTE9HRSgiZGVxdWV1ZV9idWZmZXIgZmFpbGVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgICAgICByZXQgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gRGVhbGxvY2F0ZSBidWZmZXJzIHdoZW4gdGhlIG5hdGl2ZSB3aW5kb3cgaXMgZ29uZQorICAgICAgICAgICAgICAgIHN0cnVjdCBpb25faGFuZGxlX2RhdGEgaW9uX2hhbmRsZTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJmlvbl9oYW5kbGUsIDAsIHNpemVvZihpb25faGFuZGxlKSk7CisgICAgICAgICAgICAgICAgaW9uX2hhbmRsZS5oYW5kbGUgPSBtTWVtSW5mb1tpXS5oYW5kbGU7CisgICAgICAgICAgICAgICAgaWYgKGlvY3RsKG1NZW1JbmZvW2ldLm1haW5faW9uX2ZkLCBJT05fSU9DX0ZSRUUsICZpb25faGFuZGxlKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImlvbiBmcmVlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbG9zZShtTWVtSW5mb1tpXS5tYWluX2lvbl9mZCk7CisKKyAgICAgICAgICAgICAgICBpZihtTG9jYWxGbGFnW2ldICE9IEJVRkZFUl9OT1RfT1dORUQpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbVdpbmRvdy0+Y2FuY2VsX2J1ZmZlcihtV2luZG93LCBtQnVmZmVySGFuZGxlW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HSCgiY2FuY2VsX2J1ZmZlcjogaGRsID0lcCIsICgqbUJ1ZmZlckhhbmRsZVtpXSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTG9jYWxGbGFnW2ldID0gQlVGRkVSX05PVF9PV05FRDsKKyAgICAgICAgICAgICAgICBtQnVmZmVySGFuZGxlW2ldID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIG1Qcml2YXRlSGFuZGxlW2NudF0gPQorICAgICAgICAgICAgKHN0cnVjdCBwcml2YXRlX2hhbmRsZV90ICopKCptQnVmZmVySGFuZGxlW2NudF0pOworICAgICAgICAvL3VwZGF0ZSBtYXggZnBzIGluZm8KKyAgICAgICAgc2V0TWV0YURhdGEobVByaXZhdGVIYW5kbGVbY250XSwgVVBEQVRFX1JFRlJFU0hfUkFURSwgKHZvaWQqKSZtTWF4RlBTKTsKKyAgICAgICAgbU1lbUluZm9bY250XS5tYWluX2lvbl9mZCA9IG9wZW4oIi9kZXYvaW9uIiwgT19SRE9OTFkpOworICAgICAgICBpZiAobU1lbUluZm9bY250XS5tYWluX2lvbl9mZCA8IDApIHsKKyAgICAgICAgICAgIExPR0UoImZhaWxlZDogY291bGQgbm90IG9wZW4gaW9uIGRldmljZSIpOworICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IGlvbl9oYW5kbGVfZGF0YSBpb25faGFuZGxlOworICAgICAgICAgICAgICAgIG1lbXNldCgmaW9uX2hhbmRsZSwgMCwgc2l6ZW9mKGlvbl9oYW5kbGUpKTsKKyAgICAgICAgICAgICAgICBpb25faGFuZGxlLmhhbmRsZSA9IG1NZW1JbmZvW2ldLmhhbmRsZTsKKyAgICAgICAgICAgICAgICBpZiAoaW9jdGwobU1lbUluZm9baV0ubWFpbl9pb25fZmQsIElPTl9JT0NfRlJFRSwgJmlvbl9oYW5kbGUpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJpb24gZnJlZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2xvc2UobU1lbUluZm9baV0ubWFpbl9pb25fZmQpOworICAgICAgICAgICAgICAgIGlmKG1Mb2NhbEZsYWdbaV0gIT0gQlVGRkVSX05PVF9PV05FRCkgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtV2luZG93LT5jYW5jZWxfYnVmZmVyKG1XaW5kb3csIG1CdWZmZXJIYW5kbGVbaV0pOworICAgICAgICAgICAgICAgICAgICBMT0dIKCJjYW5jZWxfYnVmZmVyOiBoZGwgPSVwIiwgKCptQnVmZmVySGFuZGxlW2ldKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Mb2NhbEZsYWdbaV0gPSBCVUZGRVJfTk9UX09XTkVEOworICAgICAgICAgICAgICAgIG1CdWZmZXJIYW5kbGVbaV0gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzZXQoKTsKKyAgICAgICAgICAgIHJldCA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlvbl9pbmZvX2ZkLmZkID0gbVByaXZhdGVIYW5kbGVbY250XS0+ZmQ7CisgICAgICAgICAgICBpZiAoaW9jdGwobU1lbUluZm9bY250XS5tYWluX2lvbl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICBJT05fSU9DX0lNUE9SVCwgJmlvbl9pbmZvX2ZkKSA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJJT04gaW1wb3J0IGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpb25faGFuZGxlX2RhdGEgaW9uX2hhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZpb25faGFuZGxlLCAwLCBzaXplb2YoaW9uX2hhbmRsZSkpOworICAgICAgICAgICAgICAgICAgICBpb25faGFuZGxlLmhhbmRsZSA9IG1NZW1JbmZvW2ldLmhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlvY3RsKG1NZW1JbmZvW2ldLm1haW5faW9uX2ZkLCBJT05fSU9DX0ZSRUUsICZpb25faGFuZGxlKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImlvbiBmcmVlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNsb3NlKG1NZW1JbmZvW2ldLm1haW5faW9uX2ZkKTsKKworICAgICAgICAgICAgICAgICAgICBpZihtTG9jYWxGbGFnW2ldICE9IEJVRkZFUl9OT1RfT1dORUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1XaW5kb3ctPmNhbmNlbF9idWZmZXIobVdpbmRvdywgbUJ1ZmZlckhhbmRsZVtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dIKCJjYW5jZWxfYnVmZmVyOiBoZGwgPSVwIiwgKCptQnVmZmVySGFuZGxlW2ldKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2FsRmxhZ1tpXSA9IEJVRkZFUl9OT1RfT1dORUQ7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJIYW5kbGVbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbG9zZShtTWVtSW5mb1tjbnRdLm1haW5faW9uX2ZkKTsKKyAgICAgICAgICAgICAgICByZXNldCgpOworICAgICAgICAgICAgICAgIHJldCA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0TWV0YURhdGEobVByaXZhdGVIYW5kbGVbY250XSwgVVBEQVRFX0NPTE9SX1NQQUNFLCAmbUNvbG9yU3BhY2UpOworICAgICAgICBtQ2FtZXJhTWVtb3J5W2NudF0gPQorICAgICAgICAgICAgbUdldE1lbW9yeShtUHJpdmF0ZUhhbmRsZVtjbnRdLT5mZCwKKyAgICAgICAgICAgICAgICAgICAgKHNpemVfdCltUHJpdmF0ZUhhbmRsZVtjbnRdLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXRoaXMpOworICAgICAgICBMT0dIKCJpZHggPSAlZCwgZmQgPSAlZCwgc2l6ZSA9ICVkLCBvZmZzZXQgPSAlZCIsCisgICAgICAgICAgICAgICBjbnQsIG1Qcml2YXRlSGFuZGxlW2NudF0tPmZkLAorICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZVtjbnRdLT5zaXplLAorICAgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZVtjbnRdLT5vZmZzZXQpOworICAgICAgICBtTWVtSW5mb1tjbnRdLmZkID0gbVByaXZhdGVIYW5kbGVbY250XS0+ZmQ7CisgICAgICAgIG1NZW1JbmZvW2NudF0uc2l6ZSA9IChzaXplX3QpbVByaXZhdGVIYW5kbGVbY250XS0+c2l6ZTsKKyAgICAgICAgbU1lbUluZm9bY250XS5oYW5kbGUgPSBpb25faW5mb19mZC5oYW5kbGU7CisgICAgfQorCisgICAgLy9DYW5jZWwgbWluX3VuZGVxdWV1ZWRfYnVmZmVyIGJ1ZmZlcnMgYmFjayB0byB0aGUgd2luZG93CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTWluVW5kZXF1ZXVlZEJ1ZmZlcnM7IGkgKyspIHsKKyAgICAgICAgZXJyID0gbVdpbmRvdy0+Y2FuY2VsX2J1ZmZlcihtV2luZG93LCBtQnVmZmVySGFuZGxlW2ldKTsKKyAgICAgICAgbUxvY2FsRmxhZ1tpXSA9IEJVRkZFUl9OT1RfT1dORUQ7CisgICAgfQorCitlbmQ6CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBtTWFwcGFibGVCdWZmZXJzID0gMDsKKyAgICB9CisgICAgTE9HRCgiWCAiKTsKKyAgICBBVFJBQ0VfRU5EKCk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFsbG9jYXRlTW9yZQorICoKKyAqIERFU0NSSVBUSU9OOiBhbGxvY2F0ZSBtb3JlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnVmZmVycyBvZiBjZXJ0YWluIHNpemUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNvdW50ICAgOiBudW1iZXIgb2YgYnVmZmVycyB0byBiZSBhbGxvY2F0ZWQKKyAqICAgQHNpemUgICAgOiBsZW5naHQgb2YgdGhlIGJ1ZmZlciB0byBiZSBhbGxvY2F0ZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYUdyYWxsb2NNZW1vcnk6OmFsbG9jYXRlTW9yZSh1aW50OF90IC8qY291bnQqLywgc2l6ZV90IC8qc2l6ZSovKQoreworICAgIExPR0UoIk5vdCBpbXBsZW5tZW50ZWQgeWV0Iik7CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGVhbGxvY2F0ZQorICoKKyAqIERFU0NSSVBUSU9OOiBkZWFsbG9jYXRlIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYUdyYWxsb2NNZW1vcnk6OmRlYWxsb2NhdGUoKQoreworICAgIExPR0QoIkUgIiwgX19GVU5DVElPTl9fKTsKKworICAgIGZvciAoaW50IGNudCA9IDA7IGNudCA8IG1NYXBwYWJsZUJ1ZmZlcnM7IGNudCsrKSB7CisgICAgICAgIG1DYW1lcmFNZW1vcnlbY250XS0+cmVsZWFzZShtQ2FtZXJhTWVtb3J5W2NudF0pOworICAgICAgICBzdHJ1Y3QgaW9uX2hhbmRsZV9kYXRhIGlvbl9oYW5kbGU7CisgICAgICAgIG1lbXNldCgmaW9uX2hhbmRsZSwgMCwgc2l6ZW9mKGlvbl9oYW5kbGUpKTsKKyAgICAgICAgaW9uX2hhbmRsZS5oYW5kbGUgPSBtTWVtSW5mb1tjbnRdLmhhbmRsZTsKKyAgICAgICAgaWYgKGlvY3RsKG1NZW1JbmZvW2NudF0ubWFpbl9pb25fZmQsIElPTl9JT0NfRlJFRSwgJmlvbl9oYW5kbGUpIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiaW9uIGZyZWUgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UobU1lbUluZm9bY250XS5tYWluX2lvbl9mZCk7CisgICAgICAgIGlmKG1Mb2NhbEZsYWdbY250XSAhPSBCVUZGRVJfTk9UX09XTkVEKSB7CisgICAgICAgICAgICBpZiAobVdpbmRvdykgeworICAgICAgICAgICAgICAgIG1XaW5kb3ctPmNhbmNlbF9idWZmZXIobVdpbmRvdywgbUJ1ZmZlckhhbmRsZVtjbnRdKTsKKyAgICAgICAgICAgICAgICBMT0dIKCJjYW5jZWxfYnVmZmVyOiBoZGwgPSVwIiwgKCptQnVmZmVySGFuZGxlW2NudF0pKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiUHJldmlldyB3aW5kb3cgaXMgTlVMTCwgY2Fubm90IGNhbmNlbF9idWZmZXI6IGhkbCA9JXAiLAorICAgICAgICAgICAgICAgICAgICAgICgqbUJ1ZmZlckhhbmRsZVtjbnRdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUxvY2FsRmxhZ1tjbnRdID0gQlVGRkVSX05PVF9PV05FRDsKKyAgICAgICAgTE9HSCgicHV0IGJ1ZmZlciAlZCBzdWNjZXNzZnVsbHkiLCBjbnQpOworICAgIH0KKyAgICBtQnVmZmVyQ291bnQgPSAwOworICAgIG1NYXBwYWJsZUJ1ZmZlcnMgPSAwOworICAgIExPR0QoIlggIixfX0ZVTkNUSU9OX18pOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhY2hlT3BzCisgKgorICogREVTQ1JJUFRJT046IGlvbiByZWxhdGVkIG1lbW9yeSBjYWNoZSBvcGVyYXRpb25zCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgdGhlIGJ1ZmZlcgorICogICBAY21kICAgICA6IGNhY2hlIG9wcyBjb21tYW5kCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFHcmFsbG9jTWVtb3J5OjpjYWNoZU9wcyh1aW50MzJfdCBpbmRleCwgdW5zaWduZWQgaW50IGNtZCkKK3sKKyAgICBpZiAoaW5kZXggPj0gbU1hcHBhYmxlQnVmZmVycykKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICByZXR1cm4gY2FjaGVPcHNJbnRlcm5hbChpbmRleCwgY21kLCBtQ2FtZXJhTWVtb3J5W2luZGV4XS0+ZGF0YSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0UmVnRmxhZ3MKKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgaW5pdGlhbCByZWcgZmxhZ3MKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHJlZ0ZsYWdzOiBpbml0aWFsIHJlZyBmbGFncyBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYUdyYWxsb2NNZW1vcnk6OmdldFJlZ0ZsYWdzKHVpbnQ4X3QgKnJlZ0ZsYWdzKSBjb25zdAoreworICAgIGludCBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbU1pblVuZGVxdWV1ZWRCdWZmZXJzOyBpICsrKQorICAgICAgICByZWdGbGFnc1tpXSA9IDA7CisgICAgZm9yICg7IGkgPCBtTWFwcGFibGVCdWZmZXJzOyBpICsrKQorICAgICAgICByZWdGbGFnc1tpXSA9IDE7CisgICAgZm9yICg7IGkgPCBtQnVmZmVyQ291bnQ7IGkgKyspCisgICAgICAgIHJlZ0ZsYWdzW2ldID0gMDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TWVtb3J5CisgKgorICogREVTQ1JJUFRJT046IGdldCBjYW1lcmEgbWVtb3J5CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogYnVmZmVyIGluZGV4CisgKiAgIEBtZXRhZGF0YTogZmxhZyBpZiBpdCdzIG1ldGFkYXRhCisgKgorICogUkVUVVJOICAgICA6IGNhbWVyYSBtZW1vcnkgcHRyCisgKiAgICAgICAgICAgICAgTlVMTCBpZiBub3Qgc3VwcG9ydGVkIG9yIGZhaWxlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjYW1lcmFfbWVtb3J5X3QgKlFDYW1lcmFHcmFsbG9jTWVtb3J5OjpnZXRNZW1vcnkodWludDMyX3QgaW5kZXgsCisgICAgICAgIGJvb2wgbWV0YWRhdGEpIGNvbnN0Cit7CisgICAgaWYgKGluZGV4ID49IG1NYXBwYWJsZUJ1ZmZlcnMgfHwgbWV0YWRhdGEpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBtQ2FtZXJhTWVtb3J5W2luZGV4XTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRNYXRjaEJ1ZkluZGV4CisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IGJ1ZmZlciBpbmRleCBieSBvcGFxdWUgcHRyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBvcGFxdWUgIDogb3BhcXVlIHB0cgorICogICBAbWV0YWRhdGE6IGZsYWcgaWYgaXQncyBtZXRhZGF0YQorICoKKyAqIFJFVFVSTiAgICAgOiBidWZmZXIgaW5kZXggaWYgbWF0Y2ggZm91bmQsCisgKiAgICAgICAgICAgICAgLTEgaWYgZmFpbGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhR3JhbGxvY01lbW9yeTo6Z2V0TWF0Y2hCdWZJbmRleChjb25zdCB2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtZXRhZGF0YSkgY29uc3QKK3sKKyAgICBpbnQgaW5kZXggPSAtMTsKKyAgICBpZiAobWV0YWRhdGEpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NYXBwYWJsZUJ1ZmZlcnM7IGkrKykgeworICAgICAgICBpZiAobUNhbWVyYU1lbW9yeVtpXS0+ZGF0YSA9PSBvcGFxdWUpIHsKKyAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbmRleDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRQdHIKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIGJ1ZmZlciBwb2ludGVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBidWZmZXIgcHRyCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgKlFDYW1lcmFHcmFsbG9jTWVtb3J5OjpnZXRQdHIodWludDMyX3QgaW5kZXgpIGNvbnN0Cit7CisgICAgaWYgKGluZGV4ID49IG1NYXBwYWJsZUJ1ZmZlcnMpIHsKKyAgICAgICAgTE9HRSgiaW5kZXggb3V0IG9mIGJvdW5kIik7CisgICAgICAgIHJldHVybiAodm9pZCAqKUJBRF9JTkRFWDsKKyAgICB9CisgICAgcmV0dXJuIG1DYW1lcmFNZW1vcnlbaW5kZXhdLT5kYXRhOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldE1hcHBhYmxlCisgKgorICogREVTQ1JJUFRJT046IGNvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgcmVhZHkgdG8gbWFwCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtYXBwYWJsZSA6IHRoZSBudW1iZXIgb2YgZGVzaXJlZCBtYXBwYWJsZSBidWZmZXJzCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhR3JhbGxvY01lbW9yeTo6c2V0TWFwcGFibGUodWludDhfdCBtYXBwYWJsZSkKK3sKKyAgICBpZiAobU1hcHBhYmxlQnVmZmVycyA9PSAwKSB7CisgICAgICAgIG1NYXBwYWJsZUJ1ZmZlcnMgPSBtYXBwYWJsZTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TWFwcGFibGUKKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxyZWFkeSBhbGxvY2F0ZWQKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBudW1iZXIgb2YgYnVmZmVycyBhbHJlYWR5IGFsbG9jYXRlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50OF90IFFDYW1lcmFHcmFsbG9jTWVtb3J5OjpnZXRNYXBwYWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1NYXBwYWJsZUJ1ZmZlcnM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2hlY2tJZkFsbEJ1ZmZlcnNNYXBwZWQKKyAqCisgKiBERVNDUklQVElPTjogY2hlY2sgaWYgYWxsIGJ1ZmZlcnMgZm9yIHRoZSBhcmUgbWFwcGVkCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogMSBpZiBhbGwgYnVmZmVycyBtYXBwZWQKKyAqICAgICAgICAgICAgICAwIGlmIHRvdGFsIGJ1ZmZlcnMgbm90IGVxdWFsIHRvIG1hcHBlZCBidWZmZXJzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQ4X3QgUUNhbWVyYUdyYWxsb2NNZW1vcnk6OmNoZWNrSWZBbGxCdWZmZXJzTWFwcGVkKCkgY29uc3QKK3sKKyAgICBMT0dIKCJtQnVmZmVyQ291bnQ6ICVkLCBtTWFwcGFibGVCdWZmZXJzOiAlZCIsCisgICAgICAgICAgICAgbUJ1ZmZlckNvdW50LCBtTWFwcGFibGVCdWZmZXJzKTsKKyAgICByZXR1cm4gKG1CdWZmZXJDb3VudCA9PSBtTWFwcGFibGVCdWZmZXJzKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRCdWZmZXJTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogc2V0IGJ1ZmZlciBzdGF0dXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKiAgIEBzdGF0dXMgIDogc3RhdHVzIG9mIHRoZSBidWZmZXIsIHdoZXRoZXIgc2tpcHBlZCxldGMKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFHcmFsbG9jTWVtb3J5OjpzZXRCdWZmZXJTdGF0dXModWludDMyX3QgaW5kZXgsIEJ1ZmZlclN0YXR1cyBzdGF0dXMpCit7CisgICAgaWYgKGluZGV4ID49IG1CdWZmZXJDb3VudCkgeworICAgICAgICBMT0dFKCJpbmRleCBvdXQgb2YgYm91bmQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVyU3RhdHVzW2luZGV4XSA9IHN0YXR1czsKK30KKworfTsgLy9uYW1lc3BhY2UgcWNhbWVyYQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhTWVtLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFNZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDUwYmEwCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhTWVtLmgKQEAgLTAsMCArMSwzMTMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1FDQU1FUkEySFdJX01FTV9IX18KKyNkZWZpbmUgX19RQ0FNRVJBMkhXSV9NRU1fSF9fCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisKKy8vTWVkaWEgZGVwZWRhbmNpZXMKKyNpbmNsdWRlICJPTVhfUUNPTUV4dG5zLmgiCisKKy8vIERpc3BsYXkgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAicWRNZXRhRGF0YS5oIgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiY2FtZXJhLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKK30KKworbmFtZXNwYWNlIHFjYW1lcmEgeworCitjbGFzcyBRQ2FtZXJhTWVtb3J5UG9vbDsKKworLy9PRkZTRVQsIFNJWkUsIFVTQUdFLCBUSU1FU1RBTVAsIEZPUk1BVAorI2RlZmluZSBWSURFT19NRVRBREFUQV9OVU1fSU5UUyAgICAgICAgICA1CisKKy8vQnVmZmVyIGlkZW50aXR5CisvL05vdGUgdGhhdCB0aGlzIG1hY3JvIG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuCisvL2RlZmluZWQgaW4gT01YX1FDT01FeHRucy5oLCBpbiB3aGljaCBjYXNlCisvL3RoZSBsb2NhbCB2YWx1ZSBiZWxvdyB3aWxsIG5vdCBiZSB1c2VkLgorI2lmbmRlZiBWSURFT19NRVRBREFUQV9OVU1fQ09NTU9OX0lOVFMKKyNkZWZpbmUgVklERU9fTUVUQURBVEFfTlVNX0NPTU1PTl9JTlRTICAgMQorI2VuZGlmCisKK2VudW0gUUNhbWVyYU1lbVR5cGUgeworICAgIFFDQU1FUkFfTUVNX1RZUEVfREVGQVVMVCAgICAgID0gMCwKKyAgICBRQ0FNRVJBX01FTV9UWVBFX1NFQ1VSRSAgICAgICA9IDEsCisgICAgUUNBTUVSQV9NRU1fVFlQRV9CQVRDSCAgICAgICAgPSAoMSA8PCAxKSwKKyAgICBRQ0FNRVJBX01FTV9UWVBFX0NPTVBSRVNTRUQgICA9ICgxIDw8IDIpLAorfTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBTVEFUVVNfSURMRSwKKyAgICBTVEFUVVNfU0tJUFBFRAorfSBCdWZmZXJTdGF0dXM7CisKKy8vIEJhc2UgY2xhc3MgZm9yIGFsbCBtZW1vcnkgdHlwZXMuIEFic3RyYWN0LgorY2xhc3MgUUNhbWVyYU1lbW9yeSB7CisKK3B1YmxpYzoKKyAgICBpbnQgY2xlYW5DYWNoZSh1aW50MzJfdCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBjYWNoZU9wcyhpbmRleCwgSU9OX0lPQ19DTEVBTl9DQUNIRVMpOworICAgIH0KKyAgICBpbnQgaW52YWxpZGF0ZUNhY2hlKHVpbnQzMl90IGluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlT3BzKGluZGV4LCBJT05fSU9DX0lOVl9DQUNIRVMpOworICAgIH0KKyAgICBpbnQgY2xlYW5JbnZhbGlkYXRlQ2FjaGUodWludDMyX3QgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gY2FjaGVPcHMoaW5kZXgsIElPTl9JT0NfQ0xFQU5fSU5WX0NBQ0hFUyk7CisgICAgfQorICAgIGludCBnZXRGZCh1aW50MzJfdCBpbmRleCkgY29uc3Q7CisgICAgc3NpemVfdCBnZXRTaXplKHVpbnQzMl90IGluZGV4KSBjb25zdDsKKyAgICB1aW50OF90IGdldENudCgpIGNvbnN0OworICAgIHZpcnR1YWwgdWludDhfdCBnZXRNYXBwYWJsZSgpIGNvbnN0OworICAgIHZpcnR1YWwgdWludDhfdCBjaGVja0lmQWxsQnVmZmVyc01hcHBlZCgpIGNvbnN0OworCisgICAgdmlydHVhbCBpbnQgYWxsb2NhdGUodWludDhfdCBjb3VudCwgc2l6ZV90IHNpemUsIHVpbnQzMl90IGlzX3NlY3VyZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkZWFsbG9jYXRlKCkgPSAwOworICAgIHZpcnR1YWwgaW50IGFsbG9jYXRlTW9yZSh1aW50OF90IGNvdW50LCBzaXplX3Qgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwgaW50IGNhY2hlT3BzKHVpbnQzMl90IGluZGV4LCB1bnNpZ25lZCBpbnQgY21kKSA9IDA7CisgICAgdmlydHVhbCBpbnQgZ2V0UmVnRmxhZ3ModWludDhfdCAqcmVnRmxhZ3MpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGNhbWVyYV9tZW1vcnlfdCAqZ2V0TWVtb3J5KHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgYm9vbCBtZXRhZGF0YSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldE1hdGNoQnVmSW5kZXgoY29uc3Qgdm9pZCAqb3BhcXVlLCBib29sIG1ldGFkYXRhKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkICpnZXRQdHIodWludDMyX3QgaW5kZXgpIGNvbnN0PSAwOworCisgICAgUUNhbWVyYU1lbW9yeShib29sIGNhY2hlZCwKKyAgICAgICAgICAgICAgICAgIFFDYW1lcmFNZW1vcnlQb29sICpwb29sID0gTlVMTCwKKyAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBDQU1fU1RSRUFNX1RZUEVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgIFFDYW1lcmFNZW1UeXBlIGJ1Zl9UeXBlID0gUUNBTUVSQV9NRU1fVFlQRV9ERUZBVUxUKTsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhTWVtb3J5KCk7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisKKyAgICB2b2lkIGdldEJ1ZkRlZihjb25zdCBjYW1fZnJhbWVfbGVuX29mZnNldF90ICZvZmZzZXQsCisgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICZidWZEZWYsIHVpbnQzMl90IGluZGV4KSBjb25zdDsKKworICAgIGludDMyX3QgZ2V0VXNlckJ1ZkRlZihjb25zdCBjYW1fc3RyZWFtX3VzZXJfYnVmX2luZm9fdCAmYnVmX2luZm8sCisgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICZidWZEZWYsIHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgY29uc3QgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCAmcGxhbmVfb2Zmc2V0LAorICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqcGxhbmVidWZEZWYsIFFDYW1lcmFNZW1vcnkgKmJ1ZnMpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisKKyAgICBmcmllbmQgY2xhc3MgUUNhbWVyYU1lbW9yeVBvb2w7CisKKyAgICBzdHJ1Y3QgUUNhbWVyYU1lbUluZm8geworICAgICAgICBpbnQgZmQ7CisgICAgICAgIGludCBtYWluX2lvbl9mZDsKKyAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgYm9vbCBjYWNoZWQ7CisgICAgICAgIHVuc2lnbmVkIGludCBoZWFwX2lkOworICAgIH07CisKKyAgICBpbnQgYWxsb2MoaW50IGNvdW50LCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IGhlYXBfaWQsCisgICAgICAgICAgICB1aW50MzJfdCBpc19zZWN1cmUpOworICAgIHZvaWQgZGVhbGxvYygpOworICAgIHN0YXRpYyBpbnQgYWxsb2NPbmVCdWZmZXIoc3RydWN0IFFDYW1lcmFNZW1JbmZvICZtZW1JbmZvLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IGhlYXBfaWQsIHNpemVfdCBzaXplLCBib29sIGNhY2hlZCwgdWludDMyX3QgaXNfc2VjdXJlKTsKKyAgICBzdGF0aWMgdm9pZCBkZWFsbG9jT25lQnVmZmVyKHN0cnVjdCBRQ2FtZXJhTWVtSW5mbyAmbWVtSW5mbyk7CisgICAgaW50IGNhY2hlT3BzSW50ZXJuYWwodWludDMyX3QgaW5kZXgsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKnZhZGRyKTsKKworICAgIGJvb2wgbV9iQ2FjaGVkOworICAgIHVpbnQ4X3QgbUJ1ZmZlckNvdW50OworICAgIHN0cnVjdCBRQ2FtZXJhTWVtSW5mbyBtTWVtSW5mb1tNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVNdOworICAgIFFDYW1lcmFNZW1vcnlQb29sICptTWVtb3J5UG9vbDsKKyAgICBjYW1fc3RyZWFtX3R5cGVfdCBtU3RyZWFtVHlwZTsKKyAgICBRQ2FtZXJhTWVtVHlwZSBtQnVmVHlwZTsKK307CisKK2NsYXNzIFFDYW1lcmFNZW1vcnlQb29sIHsKKworcHVibGljOgorCisgICAgUUNhbWVyYU1lbW9yeVBvb2woKTsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhTWVtb3J5UG9vbCgpOworCisgICAgaW50IGFsbG9jYXRlQnVmZmVyKHN0cnVjdCBRQ2FtZXJhTWVtb3J5OjpRQ2FtZXJhTWVtSW5mbyAmbWVtSW5mbywKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBoZWFwX2lkLCBzaXplX3Qgc2l6ZSwgYm9vbCBjYWNoZWQsCisgICAgICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCB1aW50MzJfdCBpc19zZWN1cmUpOworICAgIHZvaWQgcmVsZWFzZUJ1ZmZlcihzdHJ1Y3QgUUNhbWVyYU1lbW9yeTo6UUNhbWVyYU1lbUluZm8gJm1lbUluZm8sCisgICAgICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKKyAgICB2b2lkIGNsZWFyKCk7CisKK3Byb3RlY3RlZDoKKworICAgIGludCBmaW5kQnVmZmVyTG9ja2VkKHN0cnVjdCBRQ2FtZXJhTWVtb3J5OjpRQ2FtZXJhTWVtSW5mbyAmbWVtSW5mbywKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBoZWFwX2lkLCBzaXplX3Qgc2l6ZSwgYm9vbCBjYWNoZWQsCisgICAgICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKKworICAgIGFuZHJvaWQ6Okxpc3Q8UUNhbWVyYU1lbW9yeTo6UUNhbWVyYU1lbUluZm8+IG1Qb29sc1tDQU1fU1RSRUFNX1RZUEVfTUFYXTsKKyAgICBwdGhyZWFkX211dGV4X3QgbUxvY2s7Cit9OworCisvLyBJbnRlcm5hbCBoZWFwIG1lbW9yeSBpcyB1c2VkIGZvciBtZW1vcmllcyB1c2VkIGludGVybmFsbHkKKy8vIFRoZXkgYXJlIGFsbG9jYXRlZCBmcm9tIC9kZXYvaW9uLgorY2xhc3MgUUNhbWVyYUhlYXBNZW1vcnkgOiBwdWJsaWMgUUNhbWVyYU1lbW9yeSB7CitwdWJsaWM6CisgICAgUUNhbWVyYUhlYXBNZW1vcnkoYm9vbCBjYWNoZWQpOworICAgIHZpcnR1YWwgflFDYW1lcmFIZWFwTWVtb3J5KCk7CisKKyAgICB2aXJ0dWFsIGludCBhbGxvY2F0ZSh1aW50OF90IGNvdW50LCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgaXNfc2VjdXJlKTsKKyAgICB2aXJ0dWFsIGludCBhbGxvY2F0ZU1vcmUodWludDhfdCBjb3VudCwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgdm9pZCBkZWFsbG9jYXRlKCk7CisgICAgdmlydHVhbCBpbnQgY2FjaGVPcHModWludDMyX3QgaW5kZXgsIHVuc2lnbmVkIGludCBjbWQpOworICAgIHZpcnR1YWwgaW50IGdldFJlZ0ZsYWdzKHVpbnQ4X3QgKnJlZ0ZsYWdzKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNhbWVyYV9tZW1vcnlfdCAqZ2V0TWVtb3J5KHVpbnQzMl90IGluZGV4LCBib29sIG1ldGFkYXRhKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBnZXRNYXRjaEJ1ZkluZGV4KGNvbnN0IHZvaWQgKm9wYXF1ZSwgYm9vbCBtZXRhZGF0YSkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkICpnZXRQdHIodWludDMyX3QgaW5kZXgpIGNvbnN0OworCitwcml2YXRlOgorICAgIHZvaWQgKm1QdHJbTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTXTsKK307CisKK2NsYXNzIFFDYW1lcmFNZXRhZGF0YVN0cmVhbU1lbW9yeSA6IHB1YmxpYyBRQ2FtZXJhSGVhcE1lbW9yeSB7CitwdWJsaWM6CisgICAgUUNhbWVyYU1ldGFkYXRhU3RyZWFtTWVtb3J5KGJvb2wgY2FjaGVkKTsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhTWV0YWRhdGFTdHJlYW1NZW1vcnkoKTsKKworICAgIHZpcnR1YWwgaW50IGdldFJlZ0ZsYWdzKHVpbnQ4X3QgKnJlZ0ZsYWdzKSBjb25zdDsKK307CisKKy8vIEV4dGVybmVsIGhlYXAgbWVtb3J5IGlzIHVzZWQgZm9yIG1lbW9yaWVzIHNoYXJlZCB3aXRoCisvLyBmcmFtZXdvcmsuIFRoZXkgYXJlIGFsbG9jYXRlZCBmcm9tIC9kZXYvaW9uIG9yIGdyYWxsb2MuCitjbGFzcyBRQ2FtZXJhU3RyZWFtTWVtb3J5IDogcHVibGljIFFDYW1lcmFNZW1vcnkgeworcHVibGljOgorICAgIFFDYW1lcmFTdHJlYW1NZW1vcnkoY2FtZXJhX3JlcXVlc3RfbWVtb3J5IGdldE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2FjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYU1lbW9yeVBvb2wgKnBvb2wgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IENBTV9TVFJFQU1fVFlQRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9idWZfdHlwZSBidWZfVHlwZSA9IENBTV9TVFJFQU1fQlVGX1RZUEVfTVBMQU5FKTsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhU3RyZWFtTWVtb3J5KCk7CisKKyAgICB2aXJ0dWFsIGludCBhbGxvY2F0ZSh1aW50OF90IGNvdW50LCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgaXNfc2VjdXJlKTsKKyAgICB2aXJ0dWFsIGludCBhbGxvY2F0ZU1vcmUodWludDhfdCBjb3VudCwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgdm9pZCBkZWFsbG9jYXRlKCk7CisgICAgdmlydHVhbCBpbnQgY2FjaGVPcHModWludDMyX3QgaW5kZXgsIHVuc2lnbmVkIGludCBjbWQpOworICAgIHZpcnR1YWwgaW50IGdldFJlZ0ZsYWdzKHVpbnQ4X3QgKnJlZ0ZsYWdzKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNhbWVyYV9tZW1vcnlfdCAqZ2V0TWVtb3J5KHVpbnQzMl90IGluZGV4LCBib29sIG1ldGFkYXRhKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBnZXRNYXRjaEJ1ZkluZGV4KGNvbnN0IHZvaWQgKm9wYXF1ZSwgYm9vbCBtZXRhZGF0YSkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkICpnZXRQdHIodWludDMyX3QgaW5kZXgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2FtZXJhX3JlcXVlc3RfbWVtb3J5IG1HZXRNZW1vcnk7CisgICAgY2FtZXJhX21lbW9yeV90ICptQ2FtZXJhTWVtb3J5W01NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FU107Cit9OworCisvLyBFeHRlcm5lbCBoZWFwIG1lbW9yeSBpcyB1c2VkIGZvciBtZW1vcmllcyBzaGFyZWQgd2l0aAorLy8gZnJhbWV3b3JrLiBUaGV5IGFyZSBhbGxvY2F0ZWQgZnJvbSAvZGV2L2lvbiBvciBncmFsbG9jLgorY2xhc3MgUUNhbWVyYVZpZGVvTWVtb3J5IDogcHVibGljIFFDYW1lcmFTdHJlYW1NZW1vcnkgeworcHVibGljOgorICAgIFFDYW1lcmFWaWRlb01lbW9yeShjYW1lcmFfcmVxdWVzdF9tZW1vcnkgZ2V0TWVtb3J5LCBib29sIGNhY2hlZCwKKyAgICAgICAgICAgIFFDYW1lcmFNZW1UeXBlIGJ1ZlR5cGUgPSBRQ0FNRVJBX01FTV9UWVBFX0RFRkFVTFQpOworICAgIHZpcnR1YWwgflFDYW1lcmFWaWRlb01lbW9yeSgpOworCisgICAgdmlydHVhbCBpbnQgYWxsb2NhdGUodWludDhfdCBjb3VudCwgc2l6ZV90IHNpemUsIHVpbnQzMl90IGlzX3NlY3VyZSk7CisgICAgdmlydHVhbCBpbnQgYWxsb2NhdGVNb3JlKHVpbnQ4X3QgY291bnQsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHZvaWQgZGVhbGxvY2F0ZSgpOworICAgIHZpcnR1YWwgY2FtZXJhX21lbW9yeV90ICpnZXRNZW1vcnkodWludDMyX3QgaW5kZXgsIGJvb2wgbWV0YWRhdGEpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IGdldE1hdGNoQnVmSW5kZXgoY29uc3Qgdm9pZCAqb3BhcXVlLCBib29sIG1ldGFkYXRhKSBjb25zdDsKKyAgICBpbnQgYWxsb2NhdGVNZXRhKHVpbnQ4X3QgYnVmX2NudCwgaW50IG51bUZEcywgaW50IG51bUludHMpOworICAgIHZvaWQgZGVhbGxvY2F0ZU1ldGEoKTsKKyAgICB2b2lkIHNldFZpZGVvSW5mbyhpbnQgdXNhZ2UsIGNhbV9mb3JtYXRfdCBmb3JtYXQpOworICAgIGludCBnZXRVc2FnZSgpe3JldHVybiBtVXNhZ2U7fTsKKyAgICBpbnQgZ2V0Rm9ybWF0KCl7cmV0dXJuIG1Gb3JtYXQ7fTsKKyAgICBpbnQgY29udkNhbXRvT01YRm9ybWF0KGNhbV9mb3JtYXRfdCBmb3JtYXQpOworICAgIGludCBjbG9zZU5hdGl2ZUhhbmRsZShjb25zdCB2b2lkICpkYXRhLCBib29sIG1ldGFkYXRhID0gdHJ1ZSk7CisgICAgbmF0aXZlX2hhbmRsZV90ICpnZXROYXRpdmVIYW5kbGUodWludDMyX3QgaW5kZXgsIGJvb2wgbWV0YWRhdGEgPSB0cnVlKTsKK3ByaXZhdGU6CisgICAgY2FtZXJhX21lbW9yeV90ICptTWV0YWRhdGFbTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTXTsKKyAgICB1aW50OF90IG1NZXRhQnVmQ291bnQ7CisgICAgaW50IG1Vc2FnZSwgbUZvcm1hdDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1OYXRpdmVIYW5kbGVbTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTXTsKK307CisKKworLy8gR3JhbGxvYyBNZW1vcnkgaXMgYWNxdWlyZWQgZnJvbSBwcmV2aWV3IHdpbmRvdworY2xhc3MgUUNhbWVyYUdyYWxsb2NNZW1vcnkgOiBwdWJsaWMgUUNhbWVyYU1lbW9yeSB7CisgICAgZW51bSB7CisgICAgICAgIEJVRkZFUl9OT1RfT1dORUQsCisgICAgICAgIEJVRkZFUl9PV05FRCwKKyAgICB9OworcHVibGljOgorICAgIFFDYW1lcmFHcmFsbG9jTWVtb3J5KGNhbWVyYV9yZXF1ZXN0X21lbW9yeSBnZXRNZW1vcnkpOworICAgIHZvaWQgc2V0TmF0aXZlV2luZG93KHByZXZpZXdfc3RyZWFtX29wc190ICphbncpOworICAgIHZpcnR1YWwgflFDYW1lcmFHcmFsbG9jTWVtb3J5KCk7CisKKyAgICB2aXJ0dWFsIGludCBhbGxvY2F0ZSh1aW50OF90IGNvdW50LCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgaXNfc2VjdXJlKTsKKyAgICB2aXJ0dWFsIGludCBhbGxvY2F0ZU1vcmUodWludDhfdCBjb3VudCwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgdm9pZCBkZWFsbG9jYXRlKCk7CisgICAgdmlydHVhbCBpbnQgY2FjaGVPcHModWludDMyX3QgaW5kZXgsIHVuc2lnbmVkIGludCBjbWQpOworICAgIHZpcnR1YWwgaW50IGdldFJlZ0ZsYWdzKHVpbnQ4X3QgKnJlZ0ZsYWdzKSBjb25zdDsKKyAgICB2aXJ0dWFsIGNhbWVyYV9tZW1vcnlfdCAqZ2V0TWVtb3J5KHVpbnQzMl90IGluZGV4LCBib29sIG1ldGFkYXRhKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBnZXRNYXRjaEJ1ZkluZGV4KGNvbnN0IHZvaWQgKm9wYXF1ZSwgYm9vbCBtZXRhZGF0YSkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkICpnZXRQdHIodWludDMyX3QgaW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXRNYXBwYWJsZSh1aW50OF90IG1hcHBhYmxlKTsKKyAgICB2aXJ0dWFsIHVpbnQ4X3QgZ2V0TWFwcGFibGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHVpbnQ4X3QgY2hlY2tJZkFsbEJ1ZmZlcnNNYXBwZWQoKSBjb25zdDsKKworICAgIHZvaWQgc2V0V2luZG93SW5mbyhwcmV2aWV3X3N0cmVhbV9vcHNfdCAqd2luZG93LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgIGludCBzdHJpZGUsIGludCBzY2FubGluZSwgaW50IGZvcm1hdCwgaW50IG1heEZQUywgaW50IHVzYWdlID0gMCk7CisgICAgLy8gRW5xdWV1ZS9kaXNwbGF5IGJ1ZmZlcltpbmRleF0gb250byB0aGUgbmF0aXZlIHdpbmRvdywKKyAgICAvLyBhbmQgZGVxdWV1ZSBvbmUgYnVmZmVyIGZyb20gaXQuCisgICAgLy8gUmV0dXJucyB0aGUgYnVmZmVyIGluZGV4IG9mIHRoZSBkZXF1ZXVlZCBidWZmZXIuCisgICAgaW50IGRpc3BsYXlCdWZmZXIodWludDMyX3QgaW5kZXgpOworICAgIHZvaWQgc2V0TWF4RlBTKGludCBtYXhGUFMpOworICAgIGludDMyX3QgZW5xdWV1ZUJ1ZmZlcih1aW50MzJfdCBpbmRleCwgbnNlY3NfdCB0aW1lU3RhbXAgPSAwKTsKKyAgICBpbnQzMl90IGRlcXVldWVCdWZmZXIoKTsKKyAgICBpbmxpbmUgYm9vbCBpc0J1ZlNraXBwZWQodWludDMyX3QgaW5kZXgpe3JldHVybiAobUJ1ZmZlclN0YXR1c1tpbmRleF0gPT0gU1RBVFVTX1NLSVBQRUQpO307CisgICAgdm9pZCBzZXRCdWZmZXJTdGF0dXModWludDMyX3QgaW5kZXgsIEJ1ZmZlclN0YXR1cyBzdGF0dXMpOworcHJpdmF0ZToKKyAgICBidWZmZXJfaGFuZGxlX3QgKm1CdWZmZXJIYW5kbGVbTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTXTsKKyAgICBpbnQgbUxvY2FsRmxhZ1tNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVNdOworICAgIGJvb2wgbUJ1ZmZlclN0YXR1c1tNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVNdOworICAgIHN0cnVjdCBwcml2YXRlX2hhbmRsZV90ICptUHJpdmF0ZUhhbmRsZVtNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVNdOworICAgIHByZXZpZXdfc3RyZWFtX29wc190ICptV2luZG93OworICAgIGludCBtV2lkdGgsIG1IZWlnaHQsIG1Gb3JtYXQsIG1TdHJpZGUsIG1TY2FubGluZSwgbVVzYWdlOworICAgIHR5cGVvZiAoTWV0YURhdGFfdDo6cmVmcmVzaHJhdGUpIG1NYXhGUFM7CisgICAgY2FtZXJhX3JlcXVlc3RfbWVtb3J5IG1HZXRNZW1vcnk7CisgICAgY2FtZXJhX21lbW9yeV90ICptQ2FtZXJhTWVtb3J5W01NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FU107CisgICAgaW50IG1NaW5VbmRlcXVldWVkQnVmZmVyczsKKyAgICBlbnVtIENvbG9yU3BhY2VfdCBtQ29sb3JTcGFjZTsKKyAgICB1aW50OF90IG1NYXBwYWJsZUJ1ZmZlcnM7CisgICAgcHRocmVhZF9tdXRleF90IG1Mb2NrOworICAgIHVpbnQ4X3QgbUVucXVldWVkQnVmZmVyczsKK307CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCisKKyNlbmRpZiAvKiBfX1FDQU1FUkEySFdJX01FTV9IX18gKi8KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYU11eGVyLmNwcCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYU11eGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWMwNjZmCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhTXV4ZXIuY3BwCkBAIC0wLDAgKzEsMjgyNCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjZGVmaW5lIExPR19UQUcgIlFDYW1lcmFNdXhlciIKKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNkZWZpbmUgU1RBVF9IIDxTWVNURU1fSEVBREVSX1BSRUZJWC9zdGF0Lmg+CisjaW5jbHVkZSBTVEFUX0gKKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIlFDYW1lcmFNdXhlci5oIgorI2luY2x1ZGUgIlFDYW1lcmEySFdJLmgiCisjaW5jbHVkZSAiUUNhbWVyYTNIV0kuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorfQorCisvKiBNdXhlciBpbXBsZW1lbnRhdGlvbiAqLwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CituYW1lc3BhY2UgcWNhbWVyYSB7CisKK1FDYW1lcmFNdXhlciAqZ011eGVyID0gTlVMTDsKKworLy9FcnJvciBDaGVjayBNYWNyb3MKKyNkZWZpbmUgQ0hFQ0tfTVVYRVIoKSBcCisgICAgaWYgKCFnTXV4ZXIpIHsgXAorICAgICAgICBMT0dFKCJFcnJvciBnZXR0aW5nIG11eGVyICIpOyBcCisgICAgICAgIHJldHVybjsgXAorICAgIH0gXAorCisjZGVmaW5lIENIRUNLX01VWEVSX0VSUk9SKCkgXAorICAgIGlmICghZ011eGVyKSB7IFwKKyAgICAgICAgTE9HRSgiRXJyb3IgZ2V0dGluZyBtdXhlciAiKTsgXAorICAgICAgICByZXR1cm4gLUVOT0RFVjsgXAorICAgIH0gXAorCisjZGVmaW5lIENIRUNLX0NBTUVSQShwQ2FtKSBcCisgICAgaWYgKCFwQ2FtKSB7IFwKKyAgICAgICAgTE9HRSgiRXJyb3IgZ2V0dGluZyBwaHlzaWNhbCBjYW1lcmEiKTsgXAorICAgICAgICByZXR1cm47IFwKKyAgICB9IFwKKworI2RlZmluZSBDSEVDS19DQU1FUkFfRVJST1IocENhbSkgXAorICAgIGlmICghcENhbSkgeyBcCisgICAgICAgIExPR0UoIkVycm9yIGdldHRpbmcgcGh5c2ljYWwgY2FtZXJhIik7IFwKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7IFwKKyAgICB9IFwKKworI2RlZmluZSBDSEVDS19IV0koaHdpKSBcCisgICAgaWYgKCFod2kpIHsgXAorICAgICAgICBMT0dFKCJFcnJvciAhISBIV0kgbm90IGZvdW5kISEiKTsgXAorICAgICAgICByZXR1cm47IFwKKyAgICB9IFwKKworI2RlZmluZSBDSEVDS19IV0lfRVJST1IoaHdpKSBcCisgICAgaWYgKCFod2kpIHsgXAorICAgICAgICBMT0dFKCJFcnJvciAhISBIV0kgbm90IGZvdW5kISEiKTsgXAorICAgICAgICByZXR1cm4gLUVOT0RFVjsgXAorICAgIH0gXAorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICAgICAgIDogZ2V0Q2FtZXJhTXV4ZXIKKyAqCisgKiBERVNDUklQVElPTiAgICAgOiBDcmVhdGVzIENhbWVyYSBNdXhlciBpZiBub3QgY3JlYXRlZAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgIEBwTXV4ZXIgICAgICAgICAgICAgICA6IFBvaW50ZXIgdG8gcmV0cmlldmUgQ2FtZXJhIE11eGVyCisgKiAgIEBudW1fb2ZfY2FtZXJhcyAgOiBOdW1iZXIgb2YgUGh5c2ljYWwgQ2FtZXJhcyBvbiBkZXZpY2UKKyAqCisgKiBSRVRVUk4gICAgICAgICAgICAgOiAgTk9ORQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFNdXhlcjo6Z2V0Q2FtZXJhTXV4ZXIoCisgICAgICAgIFFDYW1lcmFNdXhlcioqIHBNdXhlciwgdWludDMyX3QgbnVtX29mX2NhbWVyYXMpCit7CisgICAgKnBNdXhlciA9IE5VTEw7CisgICAgaWYgKCFnTXV4ZXIpIHsKKyAgICAgICAgZ011eGVyID0gbmV3IFFDYW1lcmFNdXhlcihudW1fb2ZfY2FtZXJhcyk7CisgICAgfQorICAgIENIRUNLX01VWEVSKCk7CisgICAgKnBNdXhlciA9IGdNdXhlcjsKKyAgICBMT0dIKCJnTXV4ZXI6ICVwICIsIGdNdXhlcik7CisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgICAgICA6IFFDYW1lcmFNdXhlcgorICoKKyAqIERFU0NSSVBUSU9OICAgICA6IFFDYW1lcmFNdXhlciBDb25zdHJ1Y3RvcgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgIEBudW1fb2ZfY2FtZXJhcyAgOiBOdW1iZXIgb2YgUGh5c2ljYWwgQ2FtZXJhcyBvbiBkZXZpY2UKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFNdXhlcjo6UUNhbWVyYU11eGVyKHVpbnQzMl90IG51bV9vZl9jYW1lcmFzKQorICAgIDogbUpwZWdDbGllbnRIYW5kbGUoMCksCisgICAgICBtX3BQaHlDYW1lcmEoTlVMTCksCisgICAgICBtX3BMb2dpY2FsQ2FtZXJhKE5VTEwpLAorICAgICAgbV9wQ2FsbGJhY2tzKE5VTEwpLAorICAgICAgbV9iQXV4Q2FtZXJhRXhwb3NlZChGQUxTRSksCisgICAgICBtX25QaHlDYW1lcmFzKG51bV9vZl9jYW1lcmFzKSwKKyAgICAgIG1fbkxvZ2ljYWxDYW1lcmFzKDApLAorICAgICAgbV9NYWluSnBlZ1EocmVsZWFzZUpwZWdJbmZvLCB0aGlzKSwKKyAgICAgIG1fQXV4SnBlZ1EocmVsZWFzZUpwZWdJbmZvLCB0aGlzKSwKKyAgICAgIG1fcFJlbENhbU1wb0pwZWcoTlVMTCksCisgICAgICBtX3BNcG9DYWxsYmFja0Nvb2tpZShOVUxMKSwKKyAgICAgIG1fcEpwZWdDYWxsYmFja0Nvb2tpZShOVUxMKSwKKyAgICAgIG1fYkR1bXBJbWFnZXMoRkFMU0UpLAorICAgICAgbV9iTXBvRW5hYmxlZChUUlVFKSwKKyAgICAgIG1fYkZyYW1lU3luY0VuYWJsZWQoRkFMU0UpLAorICAgICAgbV9iUmVjb3JkaW5nSGludEludGVybmFsbHlTZXQoRkFMU0UpCit7CisgICAgc2V0dXBMb2dpY2FsQ2FtZXJhcygpOworICAgIG1lbXNldCgmbUpwZWdPcHMsIDAsIHNpemVvZihtSnBlZ09wcykpOworICAgIG1lbXNldCgmbUpwZWdNcG9PcHMsIDAsIHNpemVvZihtSnBlZ01wb09wcykpOworICAgIG1lbXNldCgmbUdldE1lbW9yeUNiLCAwLCBzaXplb2YobUdldE1lbW9yeUNiKSk7CisgICAgbWVtc2V0KCZtRGF0YUNiLCAwLCBzaXplb2YobURhdGFDYikpOworCisgICAgLy8gaW5pdGlhbGl6ZSBtdXRleCBmb3IgTVBPIGNvbXBvc2l0aW9uCisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtX0pwZWdMb2NrLCBOVUxMKTsKKyAgICAvLyBsYXVuY2ggTVBPIGNvbXBvc2l0aW9uIHRocmVhZAorICAgIG1fQ29tcG9zZU1wb1RoLmxhdW5jaChjb21wb3NlTXBvUm91dGluZSwgdGhpcyk7CisKKyAgICAvL0NoZWNrIHdoZXRoZXIgZHVhbCBjYW1lcmEgaW1hZ2VzIG5lZWQgdG8gYmUgZHVtcGVkCisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5kdWFsLmNhbWVyYS5kdW1wIiwgcHJvcCwgIjAiKTsKKyAgICBtX2JEdW1wSW1hZ2VzID0gYXRvaShwcm9wKTsKKyAgICBMT0dIKCJkdWFsQ2FtZXJhIGR1bXAgaW1hZ2VzOiVkICIsIG1fYkR1bXBJbWFnZXMpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgICAgICA6IH5RQ2FtZXJhTXV4ZXIKKyAqCisgKiBERVNDUklQVElPTiAgICAgOiBRQ2FtZXJhTXV4ZXIgRGVzY3RydWN0b3IKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFNdXhlcjo6flFDYW1lcmFNdXhlcigpIHsKKyAgICBpZiAobV9wTG9naWNhbENhbWVyYSkgeworICAgICAgICBkZWxldGUgW10gbV9wTG9naWNhbENhbWVyYTsKKyAgICAgICAgbV9wTG9naWNhbENhbWVyYSA9IE5VTEw7CisgICAgfQorICAgIGlmIChtX3BQaHlDYW1lcmEpIHsKKyAgICAgICAgZGVsZXRlIFtdIG1fcFBoeUNhbWVyYTsKKyAgICAgICAgbV9wUGh5Q2FtZXJhID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoTlVMTCAhPSBtX3BSZWxDYW1NcG9KcGVnKSB7CisgICAgICAgIG1fcFJlbENhbU1wb0pwZWctPnJlbGVhc2UobV9wUmVsQ2FtTXBvSnBlZyk7CisgICAgICAgIG1fcFJlbENhbU1wb0pwZWcgPSBOVUxMOworICAgIH0KKyAgICAvLyBmbHVzaCBKcGVnIFF1ZXVlcworICAgIG1fTWFpbkpwZWdRLmZsdXNoKCk7CisgICAgbV9BdXhKcGVnUS5mbHVzaCgpOworCisgICAgLy8gc3RvcCBhbmQgZXhpdCBNUE8gY29tcG9zaXRpb24gdGhyZWFkCisgICAgbV9Db21wb3NlTXBvVGguc2VuZENtZChDQU1FUkFfQ01EX1RZUEVfU1RPUF9EQVRBX1BST0MsIFRSVUUsIEZBTFNFKTsKKyAgICBtX0NvbXBvc2VNcG9UaC5leGl0KCk7CisKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1fSnBlZ0xvY2spOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgICAgICA6IGdldF9udW1iZXJfb2ZfY2FtZXJhcworICoKKyAqIERFU0NSSVBUSU9OICAgICA6IFByb3ZpZGUgbnVtYmVyIG9mIExvZ2ljYWwgQ2FtZXJhcworICoKKyAqIFJFVFVSTiAgICAgICAgICAgICA6ICBOdW1iZXIgb2YgbG9naWNhbCBDYW1lcmFzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhTXV4ZXI6OmdldF9udW1iZXJfb2ZfY2FtZXJhcygpCit7CisgICAgcmV0dXJuIGdNdXhlci0+Z2V0TnVtYmVyT2ZDYW1lcmFzKCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICAgICAgIDogZ2V0X2NhbWVyYV9pbmZvCisgKgorICogREVTQ1JJUFRJT04gICAgIDogZ2V0IGxvZ2ljYWwgY2FtZXJhIGluZm8KKyAqCisgKiBQQVJBTUVURVJTOgorICogICBAY2FtZXJhX2lkICAgICA6IExvZ2ljYWwgQ2FtZXJhIElECisgKiAgIEBpbmZvICAgICAgICAgICAgICA6IExvZ2ljYWwgTWFpbiBDYW1lcmEgSW5mbworICoKKyAqIFJFVFVSTiAgICAgOgorICogICAgICAgICAgICAgIE5PX0VSUk9SICA6IHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBFTk9ERVYgOiBDYW1lcmEgbm90IGZvdW5kCisgKiAgICAgICAgICAgICAgb3RoZXI6IG5vbi16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYU11eGVyOjpnZXRfY2FtZXJhX2luZm8oaW50IGNhbWVyYV9pZCwgc3RydWN0IGNhbWVyYV9pbmZvICppbmZvKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIExPR0goIkUiKTsKKyAgICBjYW1fc3luY190eXBlX3QgdHlwZTsKKyAgICBpZiAoKGNhbWVyYV9pZCA8IDApIHx8IChjYW1lcmFfaWQgPj0gZ011eGVyLT5nZXROdW1iZXJPZkNhbWVyYXMoKSkpIHsKKyAgICAgICAgTE9HRSgiQ2FtZXJhIGlkICVkIG5vdCBmb3VuZCEiLCBjYW1lcmFfaWQpOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgaWYoaW5mbykgeworICAgICAgICByYyA9IGdNdXhlci0+Z2V0Q2FtZXJhSW5mbyhjYW1lcmFfaWQsIGluZm8sICZ0eXBlKTsKKyAgICB9CisgICAgTE9HSCgiWCwgcmM6ICVkIiwgcmMpOworICAgIHJldHVybiByYzsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgICAgICA6IHNldF9jYWxsYmFja3MKKyAqCisgKiBERVNDUklQVElPTiAgICAgOiBOb3QgSW1wbGVtZW50ZWQKKyAqCisgKiBQQVJBTUVURVJTOgorICogICBAY2FsbGJhY2tzICAgICAgOiBDYW1lcmEgTW9kdWxlIENhbGxiYWNrcworICoKKyAqIFJFVFVSTiAgICAgOgorICogICAgICAgICAgICAgIE5PX0VSUk9SICA6IHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBvdGhlcjogbm9uLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhTXV4ZXI6OnNldF9jYWxsYmFja3MoX191bnVzZWQgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCAqY2FsbGJhY2tzKQoreworICAgIC8vIE5vdCBpbXBsZW1lbnRlZAorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYW1lcmFfZGV2aWNlX29wZW4KKyAqCisgKiBERVNDUklQVElPTjogc3RhdGljIGZ1bmN0aW9uIHRvIG9wZW4gYSBjYW1lcmEgZGV2aWNlIGJ5IGl0cyBJRAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbW9kdWU6IGh3IG1vZHVsZQorICogICBAaWQgOiBjYW1lcmEgSUQKKyAqICAgQGh3X2RldmljZSA6IHB0ciB0byBzdHJ1Y3Qgc3RvcmluZyBjYW1lcmEgaGFyZHdhcmUgZGV2aWNlIGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgOiBzdWNjZXNzCisgKiAgICAgICAgICAgICAgQkFEX1ZBTFVFIDogSW52YWxpZCBDYW1lcmEgSUQKKyAqICAgICAgICAgICAgICBvdGhlcjogbm9uLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhTXV4ZXI6OmNhbWVyYV9kZXZpY2Vfb3BlbigKKyAgICAgICAgX191bnVzZWQgY29uc3Qgc3RydWN0IGh3X21vZHVsZV90ICptb2R1bGUsIGNvbnN0IGNoYXIgKmlkLAorICAgICAgICBzdHJ1Y3QgaHdfZGV2aWNlX3QgKipod19kZXZpY2UpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgTE9HSCgiaWQ9ICVkIixhdG9pKGlkKSk7CisgICAgaWYgKCFpZCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGNhbWVyYSBpZCIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJjID0gIGdNdXhlci0+Y2FtZXJhRGV2aWNlT3BlbihhdG9pKGlkKSwgaHdfZGV2aWNlKTsKKyAgICBMT0dIKCJpZD0gJWQsIHJjOiAlZCIsIGF0b2koaWQpLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG9wZW5fbGVnYWN5CisgKgorICogREVTQ1JJUFRJT046IHN0YXRpYyBmdW5jdGlvbiB0byBvcGVuIGEgY2FtZXJhIGRldmljZSBieSBpdHMgSUQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1vZHVlOiBodyBtb2R1bGUKKyAqICAgQGlkIDogY2FtZXJhIElECisgKiAgIEBoYWxWZXJzaW9uOiBoYWwgdmVyc2lvbgorICogICBAaHdfZGV2aWNlIDogcHRyIHRvIHN0cnVjdCBzdG9yaW5nIGNhbWVyYSBoYXJkd2FyZSBkZXZpY2UgaW5mbworICoKKyAqIFJFVFVSTiAgICAgOgorICogICAgICAgICAgICAgIE5PX0VSUk9SICA6IHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBCQURfVkFMVUUgOiBJbnZhbGlkIENhbWVyYSBJRAorICogICAgICAgICAgICAgIG90aGVyOiBub24temVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFNdXhlcjo6b3Blbl9sZWdhY3koX191bnVzZWQgY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsCisgICAgICAgIGNvbnN0IGNoYXIqIGlkLCBfX3VudXNlZCB1aW50MzJfdCBoYWxWZXJzaW9uLCBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBod19kZXZpY2UpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgTE9HSCgiaWQ9ICVkIiwgYXRvaShpZCkpOworICAgIGlmICghaWQpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBjYW1lcmEgaWQiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByYyA9ICBnTXV4ZXItPmNhbWVyYURldmljZU9wZW4oYXRvaShpZCksIGh3X2RldmljZSk7CisgICAgTE9HSCgiaWQ9ICVkLCByYzogJWQiLCBhdG9pKGlkKSwgcmMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRfcHJldmlld193aW5kb3cKKyAqCisgKiBERVNDUklQVElPTjogU2V0IFByZXZpZXcgd2luZG93IGZvciBtYWluIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlIDogY2FtZXJhIGhhcmR3YXJlIGRldmljZSBpbmZvCisgKiAgIEB3aW5kb3c6IFByZXZpZXcgd2luZG93IG9wcworICoKKyAqIFJFVFVSTiAgICAgOgorICogICAgICAgICAgICAgIE5PX0VSUk9SICA6IHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBvdGhlcjogbm9uLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhTXV4ZXI6OnNldF9wcmV2aWV3X3dpbmRvdyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSwKKyAgICAgICAgc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqd2luZG93KQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIENIRUNLX01VWEVSX0VSUk9SKCk7CisgICAgcWNhbWVyYV9waHlzaWNhbF9kZXNjcmlwdG9yX3QgKnBDYW0gPSBOVUxMOworICAgIHFjYW1lcmFfbG9naWNhbF9kZXNjcmlwdG9yX3QgKmNhbSA9IGdNdXhlci0+Z2V0TG9naWNhbENhbWVyYShkZXZpY2UpOworICAgIENIRUNLX0NBTUVSQV9FUlJPUihjYW0pOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIHBDYW0gPSBnTXV4ZXItPmdldFBoeXNpY2FsQ2FtZXJhKGNhbSwgaSk7CisgICAgICAgIENIRUNLX0NBTUVSQV9FUlJPUihwQ2FtKTsKKworICAgICAgICAvLyBTZXQgcHJldmlldyB3aW5kb3cgb25seSBmb3IgcHJpbWFyeSBjYW1lcmEKKyAgICAgICAgaWYgKHBDYW0tPm1vZGUgPT0gQ0FNX01PREVfUFJJTUFSWSkgeworICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICAgICAgQ0hFQ0tfSFdJX0VSUk9SKGh3aSk7CisgICAgICAgICAgICByYyA9IGh3aS0+c2V0X3ByZXZpZXdfd2luZG93KHBDYW0tPmRldiwgd2luZG93KTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yISEgc2V0dGluZyBwcmV2aWV3IHdpbmRvdyIpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRfY2FsbEJhY2tzCisgKgorICogREVTQ1JJUFRJT046IFNldCBGcmFtZXdvcmsgY2FsbGJhY2tzIHRvIG5vdGlmeSB2YXJpb3VzIGZyYW1lIGRhdGEgYXN5bmNocm9ub3VzbHkKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSA6IGNhbWVyYSBoYXJkd2FyZSBkZXZpY2UgaW5mbworICogICBAbm90aWZ5X2NiOiBOb3RpZmljYXRpb24gY2FsbGJhY2sKKyAqICAgQGRhdGFfY2I6IGRhdGEgY2FsbGJhY2sKKyAqICAgQGRhdGFfY2JfdGltZXN0YW1wOiBkYXRhIHRpbWVzdGFtcCBjYWxsYmFjaworICogICBAZ2V0X21lbW9yeTogY2FsbGJhY2sgdG8gb2J0YWluIG1lbW9yeQorICogICBAdXNlciA6IHVzZXJkYXRhCisgKgorICogUkVUVVJOIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFNdXhlcjo6c2V0X2NhbGxCYWNrcyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSwKKyAgICAgICAgY2FtZXJhX25vdGlmeV9jYWxsYmFjayBub3RpZnlfY2IsCisgICAgICAgIGNhbWVyYV9kYXRhX2NhbGxiYWNrIGRhdGFfY2IsCisgICAgICAgIGNhbWVyYV9kYXRhX3RpbWVzdGFtcF9jYWxsYmFjayBkYXRhX2NiX3RpbWVzdGFtcCwKKyAgICAgICAgY2FtZXJhX3JlcXVlc3RfbWVtb3J5IGdldF9tZW1vcnksCisgICAgICAgIHZvaWQgKnVzZXIpCit7CisgICAgTE9HSCgiRSIpOworICAgIENIRUNLX01VWEVSKCk7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgcWNhbWVyYV9waHlzaWNhbF9kZXNjcmlwdG9yX3QgKnBDYW0gPSBOVUxMOworICAgIHFjYW1lcmFfbG9naWNhbF9kZXNjcmlwdG9yX3QgKmNhbSA9IGdNdXhlci0+Z2V0TG9naWNhbENhbWVyYShkZXZpY2UpOworICAgIENIRUNLX0NBTUVSQShjYW0pOworCisgICAgLy8gU2V0IGNhbGxiYWNrcyB0byBIV0kKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY2FtLT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgQ0hFQ0tfQ0FNRVJBKHBDYW0pOworCisgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgQ0hFQ0tfSFdJKGh3aSk7CisKKyAgICAgICAgaHdpLT5zZXRfQ2FsbEJhY2tzKHBDYW0tPmRldiwgbm90aWZ5X2NiLCBkYXRhX2NiLCBkYXRhX2NiX3RpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICBnZXRfbWVtb3J5LCB1c2VyKTsKKworICAgICAgICAvLyBTZXQgSlBHIGNhbGxiYWNrcworICAgICAgICAvLyBzZW5kaW5nIHRoZSBwaHlzaWNhbCBjYW1lcmEgZGVzY3JpcHRpb24gd2l0aCB0aGUgSnBlZyBjYWxsYmFjaworICAgICAgICAvLyB0aGlzIHdpbGwgYmUgcmV0cmlldmVkIGluIGNhbGxiYWNrcyB0byBnZXQgdGhlIGNhbSBpbnN0YW5jZQorICAgICAgICAvLyBkZWxpdmVyaW5nIEpQRUdzCisgICAgICAgIGh3aS0+c2V0SnBlZ0NhbGxCYWNrcyhqcGVnX2RhdGFfY2FsbGJhY2ssICh2b2lkKilwQ2FtKTsKKworICAgICAgICBpZiAocENhbS0+bW9kZSA9PSBDQU1fTU9ERV9QUklNQVJZKSB7CisgICAgICAgICAgICByYyA9IGdNdXhlci0+c2V0TWFpbkpwZWdDYWxsYmFja0Nvb2tpZSgodm9pZCopKHBDYW0pKTsKKyAgICAgICAgICAgIGlmKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HVygiRXJyb3Igc2V0dGluZyBKcGVnIGNhbGxiYWNrIGNvb2tpZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFN0b3JlIGNhbGxiYWNrIGluIE11eGVyIHRvIHNlbmQgZGF0YSBjYWxsYmFja3MKKyAgICByYyA9IGdNdXhlci0+c2V0RGF0YUNhbGxiYWNrKGRhdGFfY2IpOworICAgIGlmKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR1coIkVycm9yIHNldHRpbmcgZGF0YSBjYWxsYmFjayIpOworICAgIH0KKyAgICAvLyBtZW1vcnkgY2FsbGJhY2sgc3RvcmVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgTVBPIGJ1ZmZlcgorICAgIHJjID0gZ011eGVyLT5zZXRNZW1vcnlDYWxsYmFjayhnZXRfbWVtb3J5KTsKKyAgICBpZihyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dXKCJFcnJvciBzZXR0aW5nIG1lbW9yeSBjYWxsYmFjayIpOworICAgIH0KKyAgICAvLyBhY3R1YWwgdXNlciBjYWxsYmFjayBjb29raWUgaXMgc2F2ZWQgaW4gTXV4ZXIKKyAgICAvLyB0aGlzIHdpbGwgYmUgdXNlZCB0byBkZWxpdmVyIGZpbmFsIE1QTyBjYWxsYmFjayB0byB0aGUgZnJhbWV3b3JrCisgICAgcmMgPSBnTXV4ZXItPnNldE1wb0NhbGxiYWNrQ29va2llKHVzZXIpOworICAgIGlmKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR1coIkVycm9yIHNldHRpbmcgbXBvIGNvb2tpZSIpOworICAgIH0KKworICAgIExPR0goIlgiKTsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGVuYWJsZV9tc2dfdHlwZQorICoKKyAqIERFU0NSSVBUSU9OOiBFbmFibGUgbXNnX3R5cGUgdG8gc2VuZCBjYWxsYmFja3MKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSA6IGNhbWVyYSBoYXJkd2FyZSBkZXZpY2UgaW5mbworICogICBAbXNnX3R5cGU6IGNhbGxiYWNrIE1lc3NhZ2UgdHlwZSB0byBiZSBlbmFibGVkCisgKgorICogUkVUVVJOIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFNdXhlcjo6ZW5hYmxlX21zZ190eXBlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlLCBpbnQzMl90IG1zZ190eXBlKQoreworICAgIExPR0goIkUiKTsKKyAgICBDSEVDS19NVVhFUigpOworICAgIHFjYW1lcmFfcGh5c2ljYWxfZGVzY3JpcHRvcl90ICpwQ2FtID0gTlVMTDsKKyAgICBxY2FtZXJhX2xvZ2ljYWxfZGVzY3JpcHRvcl90ICpjYW0gPSBnTXV4ZXItPmdldExvZ2ljYWxDYW1lcmEoZGV2aWNlKTsKKyAgICBDSEVDS19DQU1FUkEoY2FtKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICBDSEVDS19DQU1FUkEocENhbSk7CisgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgQ0hFQ0tfSFdJKGh3aSk7CisgICAgICAgIGh3aS0+ZW5hYmxlX21zZ190eXBlKHBDYW0tPmRldiwgbXNnX3R5cGUpOworICAgIH0KKyAgICBMT0dIKCJYIik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGlzYWJsZV9tc2dfdHlwZQorICoKKyAqIERFU0NSSVBUSU9OOiBkaXNhYmxlIG1zZ190eXBlIHRvIHNlbmQgY2FsbGJhY2tzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgOiBjYW1lcmEgaGFyZHdhcmUgZGV2aWNlIGluZm8KKyAqICAgQG1zZ190eXBlOiBjYWxsYmFjayBNZXNzYWdlIHR5cGUgdG8gYmUgZGlzYWJsZWQKKyAqCisgKiBSRVRVUk4gOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYU11eGVyOjpkaXNhYmxlX21zZ190eXBlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlLCBpbnQzMl90IG1zZ190eXBlKQoreworICAgIExPR0goIkUiKTsKKyAgICBDSEVDS19NVVhFUigpOworICAgIHFjYW1lcmFfcGh5c2ljYWxfZGVzY3JpcHRvcl90ICpwQ2FtID0gTlVMTDsKKyAgICBxY2FtZXJhX2xvZ2ljYWxfZGVzY3JpcHRvcl90ICpjYW0gPSBnTXV4ZXItPmdldExvZ2ljYWxDYW1lcmEoZGV2aWNlKTsKKyAgICBDSEVDS19DQU1FUkEoY2FtKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICBDSEVDS19DQU1FUkEocENhbSk7CisgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgQ0hFQ0tfSFdJKGh3aSk7CisgICAgICAgIGh3aS0+ZGlzYWJsZV9tc2dfdHlwZShwQ2FtLT5kZXYsIG1zZ190eXBlKTsKKyAgICB9CisgICAgTE9HSCgiWCIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1zZ190eXBlX2VuYWJsZWQKKyAqCisgKiBERVNDUklQVElPTjogQ2hlY2sgaWYgbWVzc2FnZSB0eXBlIGVuYWJsZWQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSA6IGNhbWVyYSBoYXJkd2FyZSBkZXZpY2UgaW5mbworICogICBAbXNnX3R5cGU6IG1lc3NhZ2UgdHlwZQorICoKKyAqIFJFVFVSTiA6IHRydWUvZmFsc2UKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFNdXhlcjo6bXNnX3R5cGVfZW5hYmxlZChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSwgaW50MzJfdCBtc2dfdHlwZSkKK3sKKyAgICBMT0dIKCJFIik7CisgICAgQ0hFQ0tfTVVYRVJfRVJST1IoKTsKKyAgICBxY2FtZXJhX3BoeXNpY2FsX2Rlc2NyaXB0b3JfdCAqcENhbSA9IE5VTEw7CisgICAgcWNhbWVyYV9sb2dpY2FsX2Rlc2NyaXB0b3JfdCAqY2FtID0gZ011eGVyLT5nZXRMb2dpY2FsQ2FtZXJhKGRldmljZSk7CisgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKGNhbSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY2FtLT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKHBDYW0pOworCisgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgQ0hFQ0tfSFdJX0VSUk9SKGh3aSk7CisKKyAgICAgICAgaWYgKHBDYW0tPm1vZGUgPT0gQ0FNX01PREVfUFJJTUFSWSkgeworICAgICAgICAgICAgcmV0dXJuIGh3aS0+bXNnX3R5cGVfZW5hYmxlZChwQ2FtLT5kZXYsIG1zZ190eXBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dIKCJYIik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0YXJ0X3ByZXZpZXcKKyAqCisgKiBERVNDUklQVElPTjogU3RhcnRzIGxvZ2ljYWwgY2FtZXJhIHByZXZpZXcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSA6IGNhbWVyYSBoYXJkd2FyZSBkZXZpY2UgaW5mbworICoKKyAqIFJFVFVSTiAgICAgOgorICogICAgICAgICAgICAgIE5PX0VSUk9SICA6IHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBvdGhlcjogbm9uLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhTXV4ZXI6OnN0YXJ0X3ByZXZpZXcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisgICAgTE9HSCgiRSIpOworICAgIENIRUNLX01VWEVSX0VSUk9SKCk7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgcWNhbWVyYV9waHlzaWNhbF9kZXNjcmlwdG9yX3QgKnBDYW0gPSBOVUxMOworICAgIHFjYW1lcmFfbG9naWNhbF9kZXNjcmlwdG9yX3QgKmNhbSA9IGdNdXhlci0+Z2V0TG9naWNhbENhbWVyYShkZXZpY2UpOworICAgIENIRUNLX0NBTUVSQV9FUlJPUihjYW0pOworCisgICAgLy8gcHJlcGFyZSBwcmV2aWV3IGZpcnN0IGZvciBhbGwgY2FtZXJhcworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICBDSEVDS19DQU1FUkFfRVJST1IocENhbSk7CisKKyAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKworICAgICAgICByYyA9IGh3aS0+cHJlcGFyZV9wcmV2aWV3KHBDYW0tPmRldik7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiRXJyb3IgcHJlcGFyaW5nIHByZXZpZXcgISEgIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY2FtLT5udW1DYW1lcmFzID4gMSkgeworICAgICAgICB1aW50IHNlc3Npb25JZCA9IDA7CisgICAgICAgIC8vIFNldCB1cCBzeW5jIGZvciBjYW1lcmEgc2Vzc2lvbnMKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICAgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKHBDYW0pOworCisgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgICAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKworICAgICAgICAgICAgaWYocENhbS0+bW9kZSA9PSBDQU1fTU9ERV9QUklNQVJZKSB7CisgICAgICAgICAgICAgICAgLy8gYnVuZGxlIHByaW1hcnkgY2FtIHdpdGggYWxsIGF1eCBjYW1lcmFzCisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IGNhbS0+bnVtQ2FtZXJhczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChqID09IGNhbS0+blByaW1hcnlQaHlDYW1JbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkID0gY2FtLT5zSWRbal07CisgICAgICAgICAgICAgICAgICAgIExPR0goIlJlbGF0ZWQgY2FtIGlkOiAlZCwgc2VydmVyIGlkOiAlZCBzeW5jIE9OIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVsYXRlZCBzZXNzaW9uX2lkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW0tPnBJZFtpXSwgY2FtLT5zSWRbaV0sIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgIHJjID0gaHdpLT5idW5kbGVSZWxhdGVkQ2FtZXJhcyh0cnVlLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIEJ1bmRsaW5nIHBoeXNpY2FsIGNhbWVyYXMgISEgIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwQ2FtLT5tb2RlID09IENBTV9NT0RFX1NFQ09OREFSWSkgeworICAgICAgICAgICAgICAgIC8vIGJ1bmRsZSBhbGwgYXV4IGNhbSB3aXRoIHByaW1hcnkgY2FtcworICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IGNhbS0+c0lkW2NhbS0+blByaW1hcnlQaHlDYW1JbmRleF07CisgICAgICAgICAgICAgICAgTE9HSCgiUmVsYXRlZCBjYW0gaWQ6ICVkLCBzZXJ2ZXIgaWQ6ICVkIHN5bmMgT04iCisgICAgICAgICAgICAgICAgICAgICAgICAiIHJlbGF0ZWQgc2Vzc2lvbl9pZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW0tPnBJZFtpXSwgY2FtLT5zSWRbaV0sIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgcmMgPSBod2ktPmJ1bmRsZVJlbGF0ZWRDYW1lcmFzKHRydWUsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIEJ1bmRsaW5nIHBoeXNpY2FsIGNhbWVyYXMgISEgIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZW1lbWJlciBTeW5jIGlzIE9OCisgICAgICAgIGNhbS0+YlN5bmNPbiA9IHRydWU7CisgICAgfQorICAgIC8vIFN0YXJ0IFByZXZpZXcgZm9yIGFsbCBjYW1lcmFzCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIHBDYW0gPSBnTXV4ZXItPmdldFBoeXNpY2FsQ2FtZXJhKGNhbSwgaSk7CisgICAgICAgIENIRUNLX0NBTUVSQV9FUlJPUihwQ2FtKTsKKworICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgIENIRUNLX0hXSV9FUlJPUihod2kpOworICAgICAgICByYyA9IGh3aS0+c3RhcnRfcHJldmlldyhwQ2FtLT5kZXYpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkVycm9yIHN0YXJ0aW5nIHByZXZpZXcgISEgIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HSCgiWCIpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdG9wX3ByZXZpZXcKKyAqCisgKiBERVNDUklQVElPTjogU3RvcHMgbG9naWNhbCBjYW1lcmEgcHJldmlldworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlIDogY2FtZXJhIGhhcmR3YXJlIGRldmljZSBpbmZvCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhTXV4ZXI6OnN0b3BfcHJldmlldyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSkKK3sKKyAgICBMT0dIKCJFIik7CisgICAgQ0hFQ0tfTVVYRVIoKTsKKyAgICBxY2FtZXJhX3BoeXNpY2FsX2Rlc2NyaXB0b3JfdCAqcENhbSA9IE5VTEw7CisgICAgcWNhbWVyYV9sb2dpY2FsX2Rlc2NyaXB0b3JfdCAqY2FtID0gZ011eGVyLT5nZXRMb2dpY2FsQ2FtZXJhKGRldmljZSk7CisgICAgQ0hFQ0tfQ0FNRVJBKGNhbSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY2FtLT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgQ0hFQ0tfQ0FNRVJBKHBDYW0pOworCisgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgQ0hFQ0tfSFdJKGh3aSk7CisKKyAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6c3RvcF9wcmV2aWV3KHBDYW0tPmRldik7CisgICAgfQorCisgICAgLy9GbHVzaCBKUEVHIFF1ZXVlcy4gTm9kZXMgaW4gTWFpbiBhbmQgQXV4IEpQRUdRIGFyZSBub3QgdmFsaWQgYWZ0ZXIgcHJldmlldyBzdG9wcGVkLgorICAgIGdNdXhlci0+bV9NYWluSnBlZ1EuZmx1c2goKTsKKyAgICBnTXV4ZXItPm1fQXV4SnBlZ1EuZmx1c2goKTsKKyAgICBMT0dIKCIgWCIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByZXZpZXdfZW5hYmxlZAorICoKKyAqIERFU0NSSVBUSU9OOiBDaGVja3MgcHJldmlldyBlbmFibGVkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgOiBjYW1lcmEgaGFyZHdhcmUgZGV2aWNlIGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZS9mYWxzZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYU11eGVyOjpwcmV2aWV3X2VuYWJsZWQoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisgICAgTE9HSCgiRSIpOworICAgIENIRUNLX01VWEVSX0VSUk9SKCk7CisgICAgcWNhbWVyYV9waHlzaWNhbF9kZXNjcmlwdG9yX3QgKnBDYW0gPSBOVUxMOworICAgIHFjYW1lcmFfbG9naWNhbF9kZXNjcmlwdG9yX3QgKmNhbSA9IGdNdXhlci0+Z2V0TG9naWNhbENhbWVyYShkZXZpY2UpOworICAgIENIRUNLX0NBTUVSQV9FUlJPUihjYW0pOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIHBDYW0gPSBnTXV4ZXItPmdldFBoeXNpY2FsQ2FtZXJhKGNhbSwgaSk7CisgICAgICAgIENIRUNLX0NBTUVSQV9FUlJPUihwQ2FtKTsKKworICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgIENIRUNLX0hXSV9FUlJPUihod2kpOworCisgICAgICAgIGlmIChwQ2FtLT5tb2RlID09IENBTV9NT0RFX1BSSU1BUlkpIHsKKyAgICAgICAgICAgIHJldHVybiBod2ktPnByZXZpZXdfZW5hYmxlZChwQ2FtLT5kZXYpOworICAgICAgICB9CisgICAgfQorICAgIExPR0goIlgiKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RvcmVfbWV0YV9kYXRhX2luX2J1ZmZlcnMKKyAqCisgKiBERVNDUklQVElPTjogU3RvcmVzIG1ldGFkYXRhIGluIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSA6IGNhbWVyYSBoYXJkd2FyZSBkZXZpY2UgaW5mbworICogICBAZW5hYmxlOiBFbmFibGUvZGlzYWJsZSBtZXRhZGF0YQorICoKKyAqIFJFVFVSTiAgICAgOgorICogICAgICAgICAgICAgIE5PX0VSUk9SICA6IHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBvdGhlcjogbm9uLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhTXV4ZXI6OnN0b3JlX21ldGFfZGF0YV9pbl9idWZmZXJzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlLCBpbnQgZW5hYmxlKQoreworICAgIExPR0goIkUiKTsKKyAgICBDSEVDS19NVVhFUl9FUlJPUigpOworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIHFjYW1lcmFfcGh5c2ljYWxfZGVzY3JpcHRvcl90ICpwQ2FtID0gTlVMTDsKKyAgICBxY2FtZXJhX2xvZ2ljYWxfZGVzY3JpcHRvcl90ICpjYW0gPSBnTXV4ZXItPmdldExvZ2ljYWxDYW1lcmEoZGV2aWNlKTsKKyAgICBDSEVDS19DQU1FUkFfRVJST1IoY2FtKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICBDSEVDS19DQU1FUkFfRVJST1IocENhbSk7CisKKyAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKworICAgICAgICByYyA9IGh3aS0+c3RvcmVfbWV0YV9kYXRhX2luX2J1ZmZlcnMocENhbS0+ZGV2LCBlbmFibGUpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkVycm9yIHN0b3JpbmcgbWV0YXQgZGF0YSAhISAiKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dIKCJYIik7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0YXJ0X3JlY29yZGluZworICoKKyAqIERFU0NSSVBUSU9OOiBTdGFydHMgcmVjb3JkaW5nIG9uIGNhbWNvcmRlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlIDogY2FtZXJhIGhhcmR3YXJlIGRldmljZSBpbmZvCisgKgorICogUkVUVVJOICAgICA6CisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIDogc3VjY2VzcworICogICAgICAgICAgICAgIG90aGVyOiBub24temVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFNdXhlcjo6c3RhcnRfcmVjb3JkaW5nKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIExPR0goIkUiKTsKKyAgICBDSEVDS19NVVhFUl9FUlJPUigpOworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIGJvb2wgcHJldmlld1Jlc3RhcnROZWVkZWQgPSBmYWxzZTsKKyAgICBxY2FtZXJhX3BoeXNpY2FsX2Rlc2NyaXB0b3JfdCAqcENhbSA9IE5VTEw7CisgICAgcWNhbWVyYV9sb2dpY2FsX2Rlc2NyaXB0b3JfdCAqY2FtID0gZ011eGVyLT5nZXRMb2dpY2FsQ2FtZXJhKGRldmljZSk7CisgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKGNhbSk7CisKKyAgICAvLyBJbiBjYXNlcyB3aGVyZSByZWNvcmRpbmcgaGludCBpcyBub3Qgc2V0LCBod2ktPnN0YXJ0X3JlY29yZGluZyB3aWxsCisgICAgLy8gaW50ZXJuYWxseSByZXN0YXJ0IHRoZSBwcmV2aWV3LgorICAgIC8vIFRvIHRha2UgdGhlIHByZXZpZXcgcmVzdGFydCBjb250cm9sIGluIG11eGVyLAorICAgIC8vIDEuIGNhbGwgcHJlX3N0YXJ0X3JlY29yZGluZyBmaXJzdAorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICBDSEVDS19DQU1FUkFfRVJST1IocENhbSk7CisKKyAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKworICAgICAgICByYyA9IGh3aS0+cHJlX3N0YXJ0X3JlY29yZGluZyhwQ2FtLT5kZXYpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkVycm9yIHByZXBhcmluZyByZWNvcmRpbmcgc3RhcnQhISAiKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIDIuIENoZWNrIGlmIHByZXZpZXcgcmVzdGFydCBpcyBuZWVkZWQuIENoZWNrIGFsbCBjYW1lcmFzLgorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICBDSEVDS19DQU1FUkFfRVJST1IocENhbSk7CisKKyAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKworICAgICAgICBpZiAoaHdpLT5pc1ByZXZpZXdSZXN0YXJ0TmVlZGVkKCkpIHsKKyAgICAgICAgICAgIHByZXZpZXdSZXN0YXJ0TmVlZGVkID0gaHdpLT5pc1ByZXZpZXdSZXN0YXJ0TmVlZGVkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcmV2aWV3UmVzdGFydE5lZWRlZCkgeworICAgICAgICAvLyAzLiBpZiBwcmV2aWV3IHJlc3RhcnQgbmVlZGVkLiBzdG9wIHRoZSBwcmV2aWV3IGZpcnN0CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgICAgIENIRUNLX0NBTUVSQV9FUlJPUihwQ2FtKTsKKworICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICAgICAgQ0hFQ0tfSFdJX0VSUk9SKGh3aSk7CisKKyAgICAgICAgICAgIHJjID0gaHdpLT5yZXN0YXJ0X3N0b3BfcHJldmlldyhwQ2FtLT5kZXYpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgaW4gcmVzdGFydCBzdG9wIHByZXZpZXchISAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLzQuIFVwZGF0ZSB0aGUgcmVjb3JkaW5nIGhpbnQgdmFsdWUgdG8gVFJVRQorICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY2FtLT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgIHBDYW0gPSBnTXV4ZXItPmdldFBoeXNpY2FsQ2FtZXJhKGNhbSwgaSk7CisgICAgICAgICAgICBDSEVDS19DQU1FUkFfRVJST1IocENhbSk7CisKKyAgICAgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgICAgIENIRUNLX0hXSV9FUlJPUihod2kpOworCisgICAgICAgICAgICByYyA9IGh3aS0+c2V0UmVjb3JkaW5nSGludFZhbHVlKFRSVUUpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgaW4gc2V0dGluZyByZWNvcmRpbmcgaGludCB2YWx1ZSEhICIpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdNdXhlci0+bV9iUmVjb3JkaW5nSGludEludGVybmFsbHlTZXQgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgICAgLy8gNS4gc3RhcnQgdGhlIHByZXZpZXcKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICAgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKHBDYW0pOworCisgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgICAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKworICAgICAgICAgICAgcmMgPSBod2ktPnJlc3RhcnRfc3RhcnRfcHJldmlldyhwQ2FtLT5kZXYpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgaW4gcmVzdGFydCBzdGFydCBwcmV2aWV3ISEgIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIHBDYW0gPSBnTXV4ZXItPmdldFBoeXNpY2FsQ2FtZXJhKGNhbSwgaSk7CisgICAgICAgIENIRUNLX0NBTUVSQV9FUlJPUihwQ2FtKTsKKworICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgIENIRUNLX0hXSV9FUlJPUihod2kpOworCisgICAgICAgIGlmIChwQ2FtLT5tb2RlID09IENBTV9NT0RFX1BSSU1BUlkpIHsKKyAgICAgICAgICAgIHJjID0gaHdpLT5zdGFydF9yZWNvcmRpbmcocENhbS0+ZGV2KTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIHN0YXJ0aW5nIHJlY29yZGluZyEhICIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HSCgiWCIpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdG9wX3JlY29yZGluZworICoKKyAqIERFU0NSSVBUSU9OOiBTdG9wcyByZWNvcmRpbmcgb24gY2FtY29yZGVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgOiBjYW1lcmEgaGFyZHdhcmUgZGV2aWNlIGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFNdXhlcjo6c3RvcF9yZWNvcmRpbmcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICBMT0dIKCJFIik7CisKKyAgICBDSEVDS19NVVhFUigpOworICAgIHFjYW1lcmFfcGh5c2ljYWxfZGVzY3JpcHRvcl90ICpwQ2FtID0gTlVMTDsKKyAgICBxY2FtZXJhX2xvZ2ljYWxfZGVzY3JpcHRvcl90ICpjYW0gPSBnTXV4ZXItPmdldExvZ2ljYWxDYW1lcmEoZGV2aWNlKTsKKyAgICBDSEVDS19DQU1FUkEoY2FtKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICBDSEVDS19DQU1FUkEocENhbSk7CisKKyAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICBDSEVDS19IV0koaHdpKTsKKworICAgICAgICBpZiAocENhbS0+bW9kZSA9PSBDQU1fTU9ERV9QUklNQVJZKSB7CisgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzdG9wX3JlY29yZGluZyhwQ2FtLT5kZXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiByZWNvcmRpbmcgaGludCBpcyBzZXQgaW50ZXJuYWxseSB0byBUUlVFLAorICAgIC8vIHdlIG5lZWQgdG8gc2V0IGl0IHRvIEZBTFNFLgorICAgIC8vIHByZXZpZXcgcmVzdGFydCBpcyBuZWVkZWQgaW4gYmV0d2VlbgorICAgIGlmIChnTXV4ZXItPm1fYlJlY29yZGluZ0hpbnRJbnRlcm5hbGx5U2V0KSB7CisgICAgICAgIC8vIHN0b3AgdGhlIHByZXZpZXcgZmlyc3QKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICAgICAgQ0hFQ0tfQ0FNRVJBKHBDYW0pOworCisgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgICAgICBDSEVDS19IV0koaHdpKTsKKworICAgICAgICAgICAgcmMgPSBod2ktPnJlc3RhcnRfc3RvcF9wcmV2aWV3KHBDYW0tPmRldik7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciBpbiByZXN0YXJ0IHN0b3AgcHJldmlldyEhICIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVjb3JkaW5nIGhpbnQgdmFsdWUgdG8gRkFMU0UKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICAgICAgQ0hFQ0tfQ0FNRVJBKHBDYW0pOworCisgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgICAgICBDSEVDS19IV0koaHdpKTsKKworICAgICAgICAgICAgcmMgPSBod2ktPnNldFJlY29yZGluZ0hpbnRWYWx1ZShGQUxTRSk7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciBpbiBzZXR0aW5nIHJlY29yZGluZyBoaW50IHZhbHVlISEgIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ011eGVyLT5tX2JSZWNvcmRpbmdIaW50SW50ZXJuYWxseVNldCA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLy8gc3RhcnQgdGhlIHByZXZpZXcKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICAgICAgQ0hFQ0tfQ0FNRVJBKHBDYW0pOworCisgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgICAgICBDSEVDS19IV0koaHdpKTsKKworICAgICAgICAgICAgcmMgPSBod2ktPnJlc3RhcnRfc3RhcnRfcHJldmlldyhwQ2FtLT5kZXYpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgaW4gcmVzdGFydCBzdGFydCBwcmV2aWV3ISEgIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIExPR0goIlgiKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWNvcmRpbmdfZW5hYmxlZAorICoKKyAqIERFU0NSSVBUSU9OOiBDaGVja3MgZm9yIHJlY29yZGluZyBlbmFibGVkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgOiBjYW1lcmEgaGFyZHdhcmUgZGV2aWNlIGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZS9mYWxzZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYU11eGVyOjpyZWNvcmRpbmdfZW5hYmxlZChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSkKK3sKKyAgICBMT0dIKCJFIik7CisgICAgQ0hFQ0tfTVVYRVJfRVJST1IoKTsKKyAgICBxY2FtZXJhX3BoeXNpY2FsX2Rlc2NyaXB0b3JfdCAqcENhbSA9IE5VTEw7CisgICAgcWNhbWVyYV9sb2dpY2FsX2Rlc2NyaXB0b3JfdCAqY2FtID0gZ011eGVyLT5nZXRMb2dpY2FsQ2FtZXJhKGRldmljZSk7CisgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKGNhbSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY2FtLT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKHBDYW0pOworCisgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgQ0hFQ0tfSFdJX0VSUk9SKGh3aSk7CisKKyAgICAgICAgaWYgKHBDYW0tPm1vZGUgPT0gQ0FNX01PREVfUFJJTUFSWSkgeworICAgICAgICAgICAgcmV0dXJuIGh3aS0+cmVjb3JkaW5nX2VuYWJsZWQocENhbS0+ZGV2KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dIKCJYIik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbGVhc2VfcmVjb3JkaW5nX2ZyYW1lCisgKgorICogREVTQ1JJUFRJT046IFJlbGVhc2UgdGhlIHJlY29yZGluZyBmcmFtZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlIDogY2FtZXJhIGhhcmR3YXJlIGRldmljZSBpbmZvCisgKiAgIEBvcGFxdWU6IEZyYW1lIHRvIGJlIHJlbGVhc2VkCisgKgorICAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYU11eGVyOjpyZWxlYXNlX3JlY29yZGluZ19mcmFtZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSwKKyAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvcGFxdWUpCit7CisgICAgTE9HSCgiRSIpOworICAgIENIRUNLX01VWEVSKCk7CisgICAgcWNhbWVyYV9waHlzaWNhbF9kZXNjcmlwdG9yX3QgKnBDYW0gPSBOVUxMOworICAgIHFjYW1lcmFfbG9naWNhbF9kZXNjcmlwdG9yX3QgKmNhbSA9IGdNdXhlci0+Z2V0TG9naWNhbENhbWVyYShkZXZpY2UpOworICAgIENIRUNLX0NBTUVSQShjYW0pOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIHBDYW0gPSBnTXV4ZXItPmdldFBoeXNpY2FsQ2FtZXJhKGNhbSwgaSk7CisgICAgICAgIENIRUNLX0NBTUVSQShwQ2FtKTsKKworICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgIENIRUNLX0hXSShod2kpOworCisgICAgICAgIGlmIChwQ2FtLT5tb2RlID09IENBTV9NT0RFX1BSSU1BUlkpIHsKKyAgICAgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnJlbGVhc2VfcmVjb3JkaW5nX2ZyYW1lKHBDYW0tPmRldiwgb3BhcXVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIExPR0goIlgiKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhdXRvX2ZvY3VzCisgKgorICogREVTQ1JJUFRJT046IFBlcmZvcm1zIGF1dG8gZm9jdXMgb24gY2FtZXJhCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgOiBjYW1lcmEgaGFyZHdhcmUgZGV2aWNlIGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgOiBzdWNjZXNzCisgKiAgICAgICAgICAgICAgb3RoZXI6IG5vbi16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYU11eGVyOjphdXRvX2ZvY3VzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIExPR0goIkUiKTsKKyAgICBDSEVDS19NVVhFUl9FUlJPUigpOworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIHFjYW1lcmFfcGh5c2ljYWxfZGVzY3JpcHRvcl90ICpwQ2FtID0gTlVMTDsKKyAgICBxY2FtZXJhX2xvZ2ljYWxfZGVzY3JpcHRvcl90ICpjYW0gPSBnTXV4ZXItPmdldExvZ2ljYWxDYW1lcmEoZGV2aWNlKTsKKyAgICBDSEVDS19DQU1FUkFfRVJST1IoY2FtKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICBDSEVDS19DQU1FUkFfRVJST1IocENhbSk7CisKKyAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKyAgICAgICAgLy8gQ2FsbCBhdXRvIGZvY3VzIG9uIG1haW4gY2FtZXJhCisgICAgICAgIGlmIChwQ2FtLT5tb2RlID09IENBTV9NT0RFX1BSSU1BUlkpIHsKKyAgICAgICAgICAgIHJjID0gUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6YXV0b19mb2N1cyhwQ2FtLT5kZXYpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgYXV0byBmb2N1c2luZyAhISAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dIKCJYIik7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhbmNlbF9hdXRvX2ZvY3VzCisgKgorICogREVTQ1JJUFRJT046IENhbmNlbHMgYXV0byBmb2N1cworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlIDogY2FtZXJhIGhhcmR3YXJlIGRldmljZSBpbmZvCisgKgorICogUkVUVVJOICAgICA6CisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIDogc3VjY2VzcworICogICAgICAgICAgICAgIG90aGVyOiBub24temVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFNdXhlcjo6Y2FuY2VsX2F1dG9fZm9jdXMoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisgICAgTE9HSCgiRSIpOworICAgIENIRUNLX01VWEVSX0VSUk9SKCk7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgcWNhbWVyYV9waHlzaWNhbF9kZXNjcmlwdG9yX3QgKnBDYW0gPSBOVUxMOworICAgIHFjYW1lcmFfbG9naWNhbF9kZXNjcmlwdG9yX3QgKmNhbSA9IGdNdXhlci0+Z2V0TG9naWNhbENhbWVyYShkZXZpY2UpOworICAgIENIRUNLX0NBTUVSQV9FUlJPUihjYW0pOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIHBDYW0gPSBnTXV4ZXItPmdldFBoeXNpY2FsQ2FtZXJhKGNhbSwgaSk7CisgICAgICAgIENIRUNLX0NBTUVSQV9FUlJPUihwQ2FtKTsKKworICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgIENIRUNLX0hXSV9FUlJPUihod2kpOworICAgICAgICAvLyBDYW5jZWwgYXV0byBmb2N1cyBvbiBwcmltYXJ5IGNhbWVyYQorICAgICAgICBpZiAocENhbS0+bW9kZSA9PSBDQU1fTU9ERV9QUklNQVJZKSB7CisgICAgICAgICAgICByYyA9IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmNhbmNlbF9hdXRvX2ZvY3VzKHBDYW0tPmRldik7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciBjYW5jZWxsaW5nIGF1dG8gZm9jdXMgISEgIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HSCgiWCIpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB0YWtlX3BpY3R1cmUKKyAqCisgKiBERVNDUklQVElPTjogVGFrZSBzbmFwc2hvdHMgb24gZGV2aWNlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgOiBjYW1lcmEgaGFyZHdhcmUgZGV2aWNlIGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgOiBzdWNjZXNzCisgKiAgICAgICAgICAgICAgb3RoZXI6IG5vbi16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYU11eGVyOjp0YWtlX3BpY3R1cmUoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisgICAgTE9HSCgiRSIpOworICAgIENIRUNLX01VWEVSX0VSUk9SKCk7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgYm9vbCBwcmV2aWV3UmVzdGFydE5lZWRlZCA9IGZhbHNlOworICAgIHFjYW1lcmFfcGh5c2ljYWxfZGVzY3JpcHRvcl90ICpwQ2FtID0gTlVMTDsKKyAgICBxY2FtZXJhX2xvZ2ljYWxfZGVzY3JpcHRvcl90ICpjYW0gPSBnTXV4ZXItPmdldExvZ2ljYWxDYW1lcmEoZGV2aWNlKTsKKyAgICBDSEVDS19DQU1FUkFfRVJST1IoY2FtKTsKKworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuZHVhbC5jYW1lcmEubXBvIiwgcHJvcCwgIjEiKTsKKyAgICBnTXV4ZXItPm1fYk1wb0VuYWJsZWQgPSBhdG9pKHByb3ApOworICAgIC8vIElmIG9ubHkgb25lIFBoeXNpY2FsIENhbWVyYSBpbmNsdWRlZCBpbiBMb2dpY2FsLCBkaXNhYmxlIE1QTworICAgIGludCBudW1PZkFjaXR2ZVBoeUNhbSA9IDA7CisgICAgZ011eGVyLT5nZXRBY3RpdmVOdW1PZlBoeUNhbShjYW0sIG51bU9mQWNpdHZlUGh5Q2FtKTsKKyAgICBpZiAoZ011eGVyLT5tX2JNcG9FbmFibGVkICYmIG51bU9mQWNpdHZlUGh5Q2FtIDw9IDEpIHsKKyAgICAgICAgZ011eGVyLT5tX2JNcG9FbmFibGVkID0gMDsKKyAgICB9CisgICAgTE9HSCgiZHVhbENhbWVyYSBNUE8gRW5hYmxlZDolZCAiLCBnTXV4ZXItPm1fYk1wb0VuYWJsZWQpOworCisgICAgaWYgKCFnTXV4ZXItPm1KcGVnQ2xpZW50SGFuZGxlKSB7CisgICAgICAgIC8vIHNldCB1cCBqcGVnIGhhbmRsZXMKKyAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCAwKTsKKyAgICAgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKHBDYW0pOworCisgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgQ0hFQ0tfSFdJX0VSUk9SKGh3aSk7CisKKyAgICAgICAgcmMgPSBod2ktPmdldEpwZWdIYW5kbGVJbmZvKCZnTXV4ZXItPm1KcGVnT3BzLCAmZ011eGVyLT5tSnBlZ01wb09wcywKKyAgICAgICAgICAgICAgICAmZ011eGVyLT5tSnBlZ0NsaWVudEhhbmRsZSk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiRXJyb3IgcmV0cmlldmluZyBqcGVnIGhhbmRsZSEiKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgICAgIENIRUNLX0NBTUVSQV9FUlJPUihwQ2FtKTsKKworICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICAgICAgQ0hFQ0tfSFdJX0VSUk9SKGh3aSk7CisKKyAgICAgICAgICAgIHJjID0gaHdpLT5zZXRKcGVnSGFuZGxlSW5mbygmZ011eGVyLT5tSnBlZ09wcywgJmdNdXhlci0+bUpwZWdNcG9PcHMsCisgICAgICAgICAgICAgICAgICAgIGdNdXhlci0+bUpwZWdDbGllbnRIYW5kbGUpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3Igc2V0dGluZyBqcGVnIGhhbmRsZSAlZCEiLCBpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBwcmVwYXJlIHNuYXBzaG90IGZvciBtYWluIGNhbWVyYQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICBDSEVDS19DQU1FUkFfRVJST1IocENhbSk7CisKKyAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKworICAgICAgICBpZiAocENhbS0+bW9kZSA9PSBDQU1fTU9ERV9QUklNQVJZKSB7CisgICAgICAgICAgICByYyA9IGh3aS0+cHJlcGFyZV9zbmFwc2hvdChwQ2FtLT5kZXYpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgcHJlcGFyaW5nIGZvciBzbmFwc2hvdCAhISAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0IE1wbyBjb21wb3NpdGlvbiBmb3IgZWFjaCBzZXNzaW9uCisgICAgICAgIHJjID0gaHdpLT5zZXRNcG9Db21wb3NpdGlvbihnTXV4ZXItPm1fYk1wb0VuYWJsZWQpOworICAgICAgICAvL2Rpc2FibGUgTVBPIGlmIEFPU1QgZmVhdHVyZXMgYXJlIGVuYWJsZWQKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBnTXV4ZXItPm1fYk1wb0VuYWJsZWQgPSAwOworICAgICAgICAgICAgcmMgPSBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgSnBlZyBRdWV1ZXMKKyAgICBnTXV4ZXItPm1fTWFpbkpwZWdRLmluaXQoKTsKKyAgICBnTXV4ZXItPm1fQXV4SnBlZ1EuaW5pdCgpOworICAgIGdNdXhlci0+bV9Db21wb3NlTXBvVGguc2VuZENtZCgKKyAgICAgICAgICAgIENBTUVSQV9DTURfVFlQRV9TVEFSVF9EQVRBX1BST0MsIEZBTFNFLCBGQUxTRSk7CisKKyAgICAvLyBJbiBjYXNlcyB3aGVyZSByZWNvcmRpbmcgaGludCBpcyBzZXQsIHByZXZpZXcgaXMgcnVubmluZywKKyAgICAvLyBod2ktPnRha2VfcGljdHVyZSB3aWxsIGludGVybmFsbHkgcmVzdGFydCB0aGUgcHJldmlldy4KKyAgICAvLyBUbyB0YWtlIHRoZSBwcmV2aWV3IHJlc3RhcnQgY29udHJvbCBpbiBtdXhlciwKKyAgICAvLyAxLiBjYWxsIHByZV90YWtlX3BpY3R1cmUgZmlyc3QKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY2FtLT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKHBDYW0pOworCisgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgQ0hFQ0tfSFdJX0VSUk9SKGh3aSk7CisKKyAgICAgICAgLy8gbm8gbmVlZCB0byBjYWxsIHByZV90YWtlX3BpYyBvbiBBdXggaWYgbm90IE1QTyAoZm9yIEFPU1QsbGl2ZXNob3QuLi5ldGMuKQorICAgICAgICBpZiAoIChnTXV4ZXItPm1fYk1wb0VuYWJsZWQgPT0gMSkgfHwgKHBDYW0tPm1vZGUgPT0gQ0FNX01PREVfUFJJTUFSWSkgKSB7CisgICAgICAgICAgICByYyA9IGh3aS0+cHJlX3Rha2VfcGljdHVyZShwQ2FtLT5kZXYpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgcHJlcGFyaW5nIHRha2VfcGljdHVyZSEhICIpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIDIuIENoZWNrIGlmIHByZXZpZXcgcmVzdGFydCBpcyBuZWVkZWQuIENoZWNrIGFsbCBjYW1lcmFzLgorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICBDSEVDS19DQU1FUkFfRVJST1IocENhbSk7CisKKyAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKworICAgICAgICBpZiAoaHdpLT5pc1ByZXZpZXdSZXN0YXJ0TmVlZGVkKCkpIHsKKyAgICAgICAgICAgIHByZXZpZXdSZXN0YXJ0TmVlZGVkID0gaHdpLT5pc1ByZXZpZXdSZXN0YXJ0TmVlZGVkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcmV2aWV3UmVzdGFydE5lZWRlZCkgeworICAgICAgICAvLyAzLiBpZiBwcmV2aWV3IHJlc3RhcnQgbmVlZGVkLiBzdG9wIHRoZSBwcmV2aWV3IGZpcnN0CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgICAgIENIRUNLX0NBTUVSQV9FUlJPUihwQ2FtKTsKKworICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICAgICAgQ0hFQ0tfSFdJX0VSUk9SKGh3aSk7CisKKyAgICAgICAgICAgIHJjID0gaHdpLT5yZXN0YXJ0X3N0b3BfcHJldmlldyhwQ2FtLT5kZXYpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgaW4gcmVzdGFydCBzdG9wIHByZXZpZXchISAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLzQuIFVwZGF0ZSB0aGUgcmVjb3JkaW5nIGhpbnQgdmFsdWUgdG8gRkFMU0UKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICAgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKHBDYW0pOworCisgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgICAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKworICAgICAgICAgICAgcmMgPSBod2ktPnNldFJlY29yZGluZ0hpbnRWYWx1ZShGQUxTRSk7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciBpbiBzZXR0aW5nIHJlY29yZGluZyBoaW50IHZhbHVlISEgIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gNS4gc3RhcnQgdGhlIHByZXZpZXcKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICAgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKHBDYW0pOworCisgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgICAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKworICAgICAgICAgICAgcmMgPSBod2ktPnJlc3RhcnRfc3RhcnRfcHJldmlldyhwQ2FtLT5kZXYpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgaW4gcmVzdGFydCBzdGFydCBwcmV2aWV3ISEgIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQXMgZnJhbWUgc3luYyBmb3IgZHVhbCBjYW1lcmFzIGlzIGVuYWJsZWQsIHRoZSB0YWtlIHBpY3R1cmUgY2FsbAorICAgIC8vIGZvciBzZWNvbmRhcnkgY2FtZXJhIGlzIGhhbmRsZWQgb25seSB0aWxsIEhBTCBsZXZlbCB0byBpbml0IGNvcnJlc3BvbmRpbmcKKyAgICAvLyBwcHJvYyBjaGFubmVsIGFuZCB1cGRhdGUgc3RhdGVtYWNoaW5lLgorICAgIC8vIFRoaXMgY2FsbCBpcyBmb3J3YXJkZWQgdG8gbW0tY2FtZXJhLWludGYgb25seSBmb3IgcHJpbWFyeSBjYW1lcmEKKyAgICAvLyBQcmltYXJ5IGNhbWVyYSBzaG91bGQgcmVjZWl2ZSB0aGUgdGFrZSBwaWN0dXJlIGNhbGwgYWZ0ZXIgYWxsIHNlY29uZGFyeQorICAgIC8vIGNhbWVyYSBzdGF0ZW1hY2hpbmVzIGFyZSB1cGRhdGVkCisgICAgZm9yIChpbnQzMl90IGkgPSBjYW0tPm51bUNhbWVyYXMtMSA7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIHBDYW0gPSBnTXV4ZXItPmdldFBoeXNpY2FsQ2FtZXJhKGNhbSwgaSk7CisgICAgICAgIENIRUNLX0NBTUVSQV9FUlJPUihwQ2FtKTsKKworICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgIENIRUNLX0hXSV9FUlJPUihod2kpOworCisgICAgICAgIC8vIG5vIG5lZWQgdG8gY2FsbCB0YWtlX3BpYyBvbiBBdXggaWYgbm90IE1QTyAoZm9yIEFPU1QpCisgICAgICAgIGlmICggKGdNdXhlci0+bV9iTXBvRW5hYmxlZCA9PSAxKSB8fCAocENhbS0+bW9kZSA9PSBDQU1fTU9ERV9QUklNQVJZKSApIHsKKyAgICAgICAgICAgIHJjID0gUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6dGFrZV9waWN0dXJlKHBDYW0tPmRldik7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciB0YWtpbmcgcGljdHVyZSAhISAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HSCgiWCIpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYW5jZWxfcGljdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBDYW5jZWwgdGhlIHRha2UgcGljdHVyZSBjYWxsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgOiBjYW1lcmEgaGFyZHdhcmUgZGV2aWNlIGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgOiBzdWNjZXNzCisgKiAgICAgICAgICAgICAgb3RoZXI6IG5vbi16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYU11eGVyOjpjYW5jZWxfcGljdHVyZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSkKK3sKKyAgICBMT0dIKCJFIik7CisgICAgQ0hFQ0tfTVVYRVJfRVJST1IoKTsKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICBxY2FtZXJhX3BoeXNpY2FsX2Rlc2NyaXB0b3JfdCAqcENhbSA9IE5VTEw7CisgICAgcWNhbWVyYV9sb2dpY2FsX2Rlc2NyaXB0b3JfdCAqY2FtID0gZ011eGVyLT5nZXRMb2dpY2FsQ2FtZXJhKGRldmljZSk7CisgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKGNhbSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY2FtLT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKHBDYW0pOworCisgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgQ0hFQ0tfSFdJX0VSUk9SKGh3aSk7CisKKyAgICAgICAgcmMgPSBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpjYW5jZWxfcGljdHVyZShwQ2FtLT5kZXYpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkVycm9yIGNhbmNlbGxpbmcgcGljdHVyZSAhISAiKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBnTXV4ZXItPm1fQ29tcG9zZU1wb1RoLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX1NUT1BfREFUQV9QUk9DLCBGQUxTRSwgRkFMU0UpOworICAgIC8vIGZsdXNoIEpwZWcgUXVldWVzCisgICAgZ011eGVyLT5tX01haW5KcGVnUS5mbHVzaCgpOworICAgIGdNdXhlci0+bV9BdXhKcGVnUS5mbHVzaCgpOworCisgICAgTE9HSCgiWCIpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRfcGFyYW1ldGVycworICoKKyAqIERFU0NSSVBUSU9OOiBTZXRzIHRoZSBwYXJhbWV0ZXJzIG9uIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlIDogY2FtZXJhIGhhcmR3YXJlIGRldmljZSBpbmZvCisgKiAgIEBwYXJtcyA6IFBhcmFtZXRlcnMgdG8gYmUgc2V0IG9uIGNhbWVyYQorICoKKyAqIFJFVFVSTiAgICAgOgorICogICAgICAgICAgICAgIE5PX0VSUk9SICA6IHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBvdGhlcjogbm9uLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhTXV4ZXI6OnNldF9wYXJhbWV0ZXJzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlLAorICAgICAgICBjb25zdCBjaGFyICpwYXJtcykKKworeworICAgIExPR0goIkUiKTsKKyAgICBDSEVDS19NVVhFUl9FUlJPUigpOworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIHFjYW1lcmFfcGh5c2ljYWxfZGVzY3JpcHRvcl90ICpwQ2FtID0gTlVMTDsKKyAgICBxY2FtZXJhX2xvZ2ljYWxfZGVzY3JpcHRvcl90ICpjYW0gPSBnTXV4ZXItPmdldExvZ2ljYWxDYW1lcmEoZGV2aWNlKTsKKyAgICBib29sIG5lZWRSZXN0YXJ0ID0gZmFsc2U7CisgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKGNhbSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY2FtLT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKHBDYW0pOworCisgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgQ0hFQ0tfSFdJX0VSUk9SKGh3aSk7CisKKyAgICAgICAgcmMgPSBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzZXRfcGFyYW1ldGVycyhwQ2FtLT5kZXYsIHBhcm1zKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciBzZXR0aW5nIHBhcmFtZXRlcnMgISEgIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKworICAgICAgICBuZWVkUmVzdGFydCB8PSBod2ktPmdldE5lZWRSZXN0YXJ0KCk7CisgICAgfQorCisgICAgaWYgKG5lZWRSZXN0YXJ0KSB7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgICAgIENIRUNLX0NBTUVSQV9FUlJPUihwQ2FtKTsKKworICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICAgICAgQ0hFQ0tfSFdJX0VSUk9SKGh3aSk7CisKKyAgICAgICAgICAgIExPR0QoInN0b3BwaW5nIHByZXZpZXcgZm9yIGNhbSAlZCIsIGkpOworICAgICAgICAgICAgcmMgPSBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzdG9wX2FmdGVyX3NldF9wYXJhbXMocENhbS0+ZGV2KTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIHN0b3BwaW5nIGNhbWVyYSByYz0lZCEhICIsIHJjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY2FtLT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKHBDYW0pOworCisgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgQ0hFQ0tfSFdJX0VSUk9SKGh3aSk7CisKKyAgICAgICAgTE9HRCgiY29tbWl0aW5nIHBhcmFtZXRlcnMgZm9yIGNhbSAlZCIsIGkpOworICAgICAgICByYyA9IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmNvbW1pdF9wYXJhbXMocENhbS0+ZGV2KTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciBjb21taXR0aW5nIHBhcmFtZXRlcnMgcmM9JWQhISAiLCByYyk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmVlZFJlc3RhcnQpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICAgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKHBDYW0pOworCisgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgICAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKworICAgICAgICAgICAgTE9HRCgicmVzdGFydGluZyBwcmV2aWV3IGZvciBjYW0gJWQiLCBpKTsKKyAgICAgICAgICAgIHJjID0gUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cmVzdGFydF9hZnRlcl9zZXRfcGFyYW1zKHBDYW0tPmRldik7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciByZXN0YXJ0aW5nIGNhbWVyYSByYz0lZCEhICIsIHJjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dIKCIgWCIpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRfcGFyYW1ldGVycworICoKKyAqIERFU0NSSVBUSU9OOiBHZXRzIHRoZSBwYXJhbWV0ZXJzIG9uIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlIDogY2FtZXJhIGhhcmR3YXJlIGRldmljZSBpbmZvCisgKgorICogUkVUVVJOICAgICA6IFBhcmFtZXRlciBzdHJpbmcgb3IgTlVMTAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjaGFyKiBRQ2FtZXJhTXV4ZXI6OmdldF9wYXJhbWV0ZXJzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIExPR0goIkUiKTsKKworICAgIGlmICghZ011eGVyKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGNoYXIqIHJldCA9IE5VTEw7CisgICAgcWNhbWVyYV9waHlzaWNhbF9kZXNjcmlwdG9yX3QgKnBDYW0gPSBOVUxMOworICAgIHFjYW1lcmFfbG9naWNhbF9kZXNjcmlwdG9yX3QgKmNhbSA9IGdNdXhlci0+Z2V0TG9naWNhbENhbWVyYShkZXZpY2UpOworICAgIGlmICghY2FtKSB7CisgICAgICAgIExPR0UoIkVycm9yIGdldHRpbmcgbG9naWNhbCBjYW1lcmEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIHBDYW0gPSBnTXV4ZXItPmdldFBoeXNpY2FsQ2FtZXJhKGNhbSwgaSk7CisgICAgICAgIGlmICghcENhbSkgeworICAgICAgICAgICAgTE9HRSgiRXJyb3IgZ2V0dGluZyBwaHlzaWNhbCBjYW1lcmEiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgaWYgKCFod2kpIHsKKyAgICAgICAgICAgIExPR0UoIkFsbG9jYXRpb24gb2YgaGFyZHdhcmUgaW50ZXJmYWNlIGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDYW0tPm1vZGUgPT0gQ0FNX01PREVfUFJJTUFSWSkgeworICAgICAgICAgICAgLy8gR2V0IG9ubHkgcHJpbWFyeSBjYW1lcmEgcGFyYW1ldGVycworICAgICAgICAgICAgcmV0ID0gUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6Z2V0X3BhcmFtZXRlcnMocENhbS0+ZGV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HSCgiWCIpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHV0X3BhcmFtZXRlcnMKKyAqCisgKiBERVNDUklQVElPTjogUHV0cyBwYXJhbWV0ZXJzIG9uIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlIDogY2FtZXJhIGhhcmR3YXJlIGRldmljZSBpbmZvCisgKiAgIEBwYXJtIDogcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYU11eGVyOjpwdXRfcGFyYW1ldGVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSwgY2hhciAqcGFybSkKK3sKKyAgICBMT0dIKCJFIik7CisgICAgQ0hFQ0tfTVVYRVIoKTsKKyAgICBxY2FtZXJhX3BoeXNpY2FsX2Rlc2NyaXB0b3JfdCAqcENhbSA9IE5VTEw7CisgICAgcWNhbWVyYV9sb2dpY2FsX2Rlc2NyaXB0b3JfdCAqY2FtID0gZ011eGVyLT5nZXRMb2dpY2FsQ2FtZXJhKGRldmljZSk7CisgICAgQ0hFQ0tfQ0FNRVJBKGNhbSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY2FtLT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgQ0hFQ0tfQ0FNRVJBKHBDYW0pOworCisgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICAgICAgQ0hFQ0tfSFdJKGh3aSk7CisKKyAgICAgICAgaWYgKHBDYW0tPm1vZGUgPT0gQ0FNX01PREVfUFJJTUFSWSkgeworICAgICAgICAgICAgLy8gUGFyYW1ldGVycyBhcmUgbm90IHVzZWQgaW4gSFdJIGFuZCBoZW5jZSBmcmVlZAorICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6cHV0X3BhcmFtZXRlcnMocENhbS0+ZGV2LCBwYXJtKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIExPR0goIlgiKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZW5kX2NvbW1hbmQKKyAqCisgKiBERVNDUklQVElPTjogU2VuZCBjb21tYW5kIHRvIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGV2aWNlIDogY2FtZXJhIGhhcmR3YXJlIGRldmljZSBpbmZvCisgKiAgIEBjbWQgOiBDb21tYW5kCisgKiAgIEBhcmcxL2FyZzIgOiBjb21tYW5kIGFyZ3VtZW50cworICoKKyAqIFJFVFVSTiAgICAgOgorICogICAgICAgICAgICAgIE5PX0VSUk9SICA6IHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBvdGhlcjogbm9uLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhTXV4ZXI6OnNlbmRfY29tbWFuZChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSwKKyAgICAgICAgaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKQoreworICAgIExPR0goIkUiKTsKKyAgICBDSEVDS19NVVhFUl9FUlJPUigpOworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIHFjYW1lcmFfcGh5c2ljYWxfZGVzY3JpcHRvcl90ICpwQ2FtID0gTlVMTDsKKyAgICBxY2FtZXJhX2xvZ2ljYWxfZGVzY3JpcHRvcl90ICpjYW0gPSBnTXV4ZXItPmdldExvZ2ljYWxDYW1lcmEoZGV2aWNlKTsKKyAgICBDSEVDS19DQU1FUkFfRVJST1IoY2FtKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICBDSEVDS19DQU1FUkFfRVJST1IocENhbSk7CisKKyAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKworICAgICAgICByYyA9IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OnNlbmRfY29tbWFuZChwQ2FtLT5kZXYsIGNtZCwgYXJnMSwgYXJnMik7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiRXJyb3Igc2VuZGluZyBjb21tYW5kICEhICIpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgICAgIHN3aXRjaCAoY21kKSB7CisjaWZuZGVmIFZBTklMTEFfSEFMCisgICAgICAgIGNhc2UgQ0FNRVJBX0NNRF9MT05HU0hPVF9PTjoKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgICAgIHBDYW0gPSBnTXV4ZXItPmdldFBoeXNpY2FsQ2FtZXJhKGNhbSwgaSk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQ0FNRVJBX0VSUk9SKHBDYW0pOworCisgICAgICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICAgICAgICAgIENIRUNLX0hXSV9FUlJPUihod2kpOworCisgICAgICAgICAgICAgICAgcmMgPSBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpzZW5kX2NvbW1hbmRfcmVzdGFydChwQ2FtLT5kZXYsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWQsIGFyZzEsIGFyZzIpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciBzZW5kaW5nIGNvbW1hbmQgcmVzdGFydCAhISAiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBX0NNRF9MT05HU0hPVF9PRkY6CisgICAgICAgICAgICBnTXV4ZXItPm1fQ29tcG9zZU1wb1RoLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX1NUT1BfREFUQV9QUk9DLAorICAgICAgICAgICAgICAgICAgICBGQUxTRSwgRkFMU0UpOworICAgICAgICAgICAgLy8gZmx1c2ggSnBlZyBRdWV1ZXMKKyAgICAgICAgICAgIGdNdXhlci0+bV9NYWluSnBlZ1EuZmx1c2goKTsKKyAgICAgICAgICAgIGdNdXhlci0+bV9BdXhKcGVnUS5mbHVzaCgpOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICAgICAgcmMgPSBOT19FUlJPUjsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIExPR0goIlgiKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVsZWFzZQorICoKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIHRoZSBjYW1lcmEKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRldmljZSA6IGNhbWVyYSBoYXJkd2FyZSBkZXZpY2UgaW5mbworICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYU11eGVyOjpyZWxlYXNlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIExPR0goIkUiKTsKKyAgICBDSEVDS19NVVhFUigpOworICAgIHFjYW1lcmFfcGh5c2ljYWxfZGVzY3JpcHRvcl90ICpwQ2FtID0gTlVMTDsKKyAgICBxY2FtZXJhX2xvZ2ljYWxfZGVzY3JpcHRvcl90ICpjYW0gPSBnTXV4ZXItPmdldExvZ2ljYWxDYW1lcmEoZGV2aWNlKTsKKyAgICBDSEVDS19DQU1FUkEoY2FtKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICBwQ2FtID0gZ011eGVyLT5nZXRQaHlzaWNhbENhbWVyYShjYW0sIGkpOworICAgICAgICBDSEVDS19DQU1FUkEocENhbSk7CisKKyAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHdpID0gcENhbS0+aHdpOworICAgICAgICBDSEVDS19IV0koaHdpKTsKKworICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpyZWxlYXNlKHBDYW0tPmRldik7CisgICAgfQorICAgIExPR0goIlgiKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkdW1wCisgKgorICogREVTQ1JJUFRJT046IER1bXAgdGhlIGNhbWVyYSBpbmZvCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgOiBjYW1lcmEgaGFyZHdhcmUgZGV2aWNlIGluZm8KKyAqICAgQGZkIDogZmQKKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgOiBzdWNjZXNzCisgKiAgICAgICAgICAgICAgb3RoZXI6IG5vbi16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYU11eGVyOjpkdW1wKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlLCBpbnQgZmQpCit7CisgICAgTE9HSCgiRSIpOworICAgIENIRUNLX01VWEVSX0VSUk9SKCk7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgcWNhbWVyYV9waHlzaWNhbF9kZXNjcmlwdG9yX3QgKnBDYW0gPSBOVUxMOworICAgIHFjYW1lcmFfbG9naWNhbF9kZXNjcmlwdG9yX3QgKmNhbSA9IGdNdXhlci0+Z2V0TG9naWNhbENhbWVyYShkZXZpY2UpOworICAgIENIRUNLX0NBTUVSQV9FUlJPUihjYW0pOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIHBDYW0gPSBnTXV4ZXItPmdldFBoeXNpY2FsQ2FtZXJhKGNhbSwgaSk7CisgICAgICAgIENIRUNLX0NBTUVSQV9FUlJPUihwQ2FtKTsKKworICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgIENIRUNLX0hXSV9FUlJPUihod2kpOworCisgICAgICAgIHJjID0gUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZTo6ZHVtcChwQ2FtLT5kZXYsIGZkKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciBkdW1waW5nIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HSCgiWCIpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjbG9zZV9jYW1lcmFfZGV2aWNlCisgKgorICogREVTQ1JJUFRJT046IENsb3NlIHRoZSBjYW1lcmEKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGh3X2RldiA6IGNhbWVyYSBoYXJkd2FyZSBkZXZpY2UgaW5mbworICoKKyAqIFJFVFVSTiAgICAgOgorICogICAgICAgICAgICAgIE5PX0VSUk9SICA6IHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBvdGhlcjogbm9uLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhTXV4ZXI6OmNsb3NlX2NhbWVyYV9kZXZpY2UoaHdfZGV2aWNlX3QgKmh3X2RldikKK3sKKyAgICBMT0dIKCJFIik7CisgICAgQ0hFQ0tfTVVYRVJfRVJST1IoKTsKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICBxY2FtZXJhX3BoeXNpY2FsX2Rlc2NyaXB0b3JfdCAqcENhbSA9IE5VTEw7CisgICAgY2FtZXJhX2RldmljZV90ICpjYW1fZGV2ID0gKGNhbWVyYV9kZXZpY2VfdCopaHdfZGV2OworICAgIHFjYW1lcmFfbG9naWNhbF9kZXNjcmlwdG9yX3QgKmNhbSA9IGdNdXhlci0+Z2V0TG9naWNhbENhbWVyYShjYW1fZGV2KTsKKyAgICBDSEVDS19DQU1FUkFfRVJST1IoY2FtKTsKKworICAgIC8vIFVubGluayBjYW1lcmEgc2Vzc2lvbnMKKyAgICBpZiAoY2FtLT5iU3luY09uKSB7CisgICAgICAgIGlmIChjYW0tPm51bUNhbWVyYXMgPiAxKSB7CisgICAgICAgICAgICB1aW50IHNlc3Npb25JZCA9IDA7CisgICAgICAgICAgICAvLyB1bmJ1bmRsZSBwcmltYXJ5IGNhbWVyYSB3aXRoIGFsbCBhdXggY2FtZXJhcworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICAgICAgcENhbSA9IGdNdXhlci0+Z2V0UGh5c2ljYWxDYW1lcmEoY2FtLCBpKTsKKyAgICAgICAgICAgICAgICBDSEVDS19DQU1FUkFfRVJST1IocENhbSk7CisKKyAgICAgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpod2kgPSBwQ2FtLT5od2k7CisgICAgICAgICAgICAgICAgQ0hFQ0tfSFdJX0VSUk9SKGh3aSk7CisKKyAgICAgICAgICAgICAgICBpZihwQ2FtLT5tb2RlID09IENBTV9NT0RFX1BSSU1BUlkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVuZGxlIHByaW1hcnkgY2FtIHdpdGggYWxsIGF1eCBjYW1lcmFzCisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBjYW0tPm51bUNhbWVyYXM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gY2FtLT5uUHJpbWFyeVBoeUNhbUluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQgPSBjYW0tPnNJZFtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0goIlJlbGF0ZWQgY2FtIGlkOiAlZCwgc2VydmVyIGlkOiAlZCBzeW5jIE9GRiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiByZWxhdGVkIHNlc3Npb25faWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW0tPnBJZFtpXSwgY2FtLT5zSWRbaV0sIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IGh3aS0+YnVuZGxlUmVsYXRlZENhbWVyYXMoZmFsc2UsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciBCdW5kbGluZyBwaHlzaWNhbCBjYW1lcmFzICEhICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBDYW0tPm1vZGUgPT0gQ0FNX01PREVfU0VDT05EQVJZKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHVuYnVuZGxlIGFsbCBhdXggY2FtIHdpdGggcHJpbWFyeSBjYW1zCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCA9IGNhbS0+c0lkW2NhbS0+blByaW1hcnlQaHlDYW1JbmRleF07CisgICAgICAgICAgICAgICAgICAgIExPR0goIlJlbGF0ZWQgY2FtIGlkOiAlZCwgc2VydmVyIGlkOiAlZCBzeW5jIE9GRiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlbGF0ZWQgc2Vzc2lvbl9pZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtLT5wSWRbaV0sIGNhbS0+c0lkW2ldLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICByYyA9IGh3aS0+YnVuZGxlUmVsYXRlZENhbWVyYXMoZmFsc2UsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgQnVuZGxpbmcgcGh5c2ljYWwgY2FtZXJhcyAhISAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhbS0+YlN5bmNPbiA9IGZhbHNlOworICAgIH0KKworICAgIC8vIEF0dGVtcHQgdG8gY2xvc2UgYWxsIGNhbWVyYXMgcmVnYXJkbGVzcyBvZiB1bmJ1bmRsZSByZXN1bHRzCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNhbS0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIHBDYW0gPSBnTXV4ZXItPmdldFBoeXNpY2FsQ2FtZXJhKGNhbSwgaSk7CisgICAgICAgIENIRUNLX0NBTUVSQV9FUlJPUihwQ2FtKTsKKworICAgICAgICBod19kZXZpY2VfdCAqZGV2ID0gKGh3X2RldmljZV90KikocENhbS0+ZGV2KTsKKyAgICAgICAgTE9HSCgiaHcgZGV2aWNlICV4LCBodyAleCIsIGRldiwgcENhbS0+aHdpKTsKKworICAgICAgICByYyA9IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmNsb3NlX2NhbWVyYV9kZXZpY2UoZGV2KTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciBjbG9zaW5nIGNhbWVyYSIpOworICAgICAgICB9CisgICAgICAgIHBDYW0tPmh3aSA9IE5VTEw7CisgICAgICAgIHBDYW0tPmRldiA9IE5VTEw7CisgICAgfQorCisgICAgLy8gUmVzZXQgSlBFRyBjbGllbnQgaGFuZGxlCisgICAgZ011eGVyLT5zZXRKcGVnSGFuZGxlKDApOworICAgIExPR0goIlgsIHJjOiAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICAgICAgIDogc2V0dXBMb2dpY2FsQ2FtZXJhcworICoKKyAqIERFU0NSSVBUSU9OICAgICA6IENyZWF0ZXMgQ2FtZXJhIE11eGVyIGlmIG5vdCBjcmVhdGVkCisgKgorICogUkVUVVJOICAgICA6CisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIDogc3VjY2VzcworICogICAgICAgICAgICAgIG90aGVyOiBub24temVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFNdXhlcjo6c2V0dXBMb2dpY2FsQ2FtZXJhcygpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaW50IGkgPSAwOworICAgIGludCBwcmltYXJ5VHlwZSA9IENBTV9UWVBFX01BSU47CisKKyAgICBMT0dIKCJbJWRdIEU6IHJjID0gJWQiLCByYyk7CisgICAgLy8gU2lnbmlmaWVzIHdoZXRoZXIgQVVYIGNhbWVyYSBoYXMgdG8gYmUgZXhwb3NlZCBhcyBwaHlzaWNhbCBjYW1lcmEKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmF1eC5jYW1lcmEiLCBwcm9wLCAiMCIpOworICAgIG1fYkF1eENhbWVyYUV4cG9zZWQgPSBhdG9pKHByb3ApOworCisgICAgLy8gU2lnbmlmaWVzIHdoZXRoZXIgQVVYIGNhbWVyYSBuZWVkcyB0byBiZSBzd2FwcGVkCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5hdXhjYW1lcmEuc3dhcCIsIHByb3AsICIwIik7CisgICAgaW50IHN3YXBBdXggPSBhdG9pKHByb3ApOworICAgIGlmIChzd2FwQXV4ICE9IDApIHsKKyAgICAgICAgcHJpbWFyeVR5cGUgPSBDQU1fVFlQRV9BVVg7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIG51bWJlciBvZiBjYW1lcmEgcHJlc2VudCBvbiBkZXZpY2UKKyAgICBpZiAoIW1fblBoeUNhbWVyYXMgfHwgKG1fblBoeUNhbWVyYXMgPiBNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTKSkgeworICAgICAgICBMT0dFKCJFcnJvciEhIEludmFsaWQgbnVtYmVyIG9mIGNhbWVyYXM6ICVkIiwKKyAgICAgICAgICAgICAgICAgbV9uUGh5Q2FtZXJhcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbV9wUGh5Q2FtZXJhID0gbmV3IHFjYW1lcmFfcGh5c2ljYWxfZGVzY3JpcHRvcl90W21fblBoeUNhbWVyYXNdOworICAgIGlmICghbV9wUGh5Q2FtZXJhKSB7CisgICAgICAgIExPR0UoIkVycm9yIGFsbG9jYXRpbmcgY2FtZXJhIGluZm8gYnVmZmVyISEiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KG1fcFBoeUNhbWVyYSwgMHgwMCwKKyAgICAgICAgICAgIChtX25QaHlDYW1lcmFzICogc2l6ZW9mKHFjYW1lcmFfcGh5c2ljYWxfZGVzY3JpcHRvcl90KSkpOworICAgIHVpbnQzMl90IGNhbWVyYUlkID0gMDsKKyAgICBtX25Mb2dpY2FsQ2FtZXJhcyA9IDA7CisKKyAgICAvLyBFbnVtZXJhdGUgcGh5c2ljYWwgY2FtZXJhcyBhbmQgbG9naWNhbAorICAgIGZvciAoaSA9IDA7IGkgPCBtX25QaHlDYW1lcmFzIDsgaSsrLCBjYW1lcmFJZCsrKSB7CisgICAgICAgIGNhbWVyYV9pbmZvICppbmZvID0gJm1fcFBoeUNhbWVyYVtpXS5jYW1faW5mbzsKKyAgICAgICAgcmMgPSBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOjpnZXRDYXBhYmlsaXRpZXMoY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgaW5mbywgJm1fcFBoeUNhbWVyYVtpXS50eXBlKTsKKyAgICAgICAgbV9wUGh5Q2FtZXJhW2ldLmlkID0gY2FtZXJhSWQ7CisgICAgICAgIG1fcFBoeUNhbWVyYVtpXS5kZXZpY2VfdmVyc2lvbiA9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOworICAgICAgICBtX3BQaHlDYW1lcmFbaV0ubW9kZSA9IENBTV9NT0RFX1BSSU1BUlk7CisKKyAgICAgICAgaWYgKCFtX2JBdXhDYW1lcmFFeHBvc2VkICYmIChtX3BQaHlDYW1lcmFbaV0udHlwZSAhPSBwcmltYXJ5VHlwZSkpIHsKKyAgICAgICAgICAgIG1fcFBoeUNhbWVyYVtpXS5tb2RlID0gQ0FNX01PREVfU0VDT05EQVJZOworICAgICAgICAgICAgTE9HSCgiQ2FtZXJhIElEOiAlZCwgQXV4IENhbWVyYSwgdHlwZTogJWQsIGZhY2luZzogJWQiLAorIGNhbWVyYUlkLCBtX3BQaHlDYW1lcmFbaV0udHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbV9wUGh5Q2FtZXJhW2ldLmNhbV9pbmZvLmZhY2luZyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtX25Mb2dpY2FsQ2FtZXJhcysrOworICAgICAgICAgICAgTE9HSCgiQ2FtZXJhIElEOiAlZCwgTWFpbiBDYW1lcmEsIHR5cGU6ICVkLCBmYWNpbmc6ICVkIiwKKyBjYW1lcmFJZCwgbV9wUGh5Q2FtZXJhW2ldLnR5cGUsCisgICAgICAgICAgICAgICAgICAgIG1fcFBoeUNhbWVyYVtpXS5jYW1faW5mby5mYWNpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFtX25Mb2dpY2FsQ2FtZXJhcykgeworICAgICAgICAvLyBObyBNYWluIGNhbWVyYSBkZXRlY3RlZCwgcmV0dXJuIGZyb20gaGVyZQorICAgICAgICBMT0dFKCJFcnJvciAhISEhIGRldGVjdGluZyBtYWluIGNhbWVyYSEhIik7CisgICAgICAgIGRlbGV0ZSBbXSBtX3BQaHlDYW1lcmE7CisgICAgICAgIG1fcFBoeUNhbWVyYSA9IE5VTEw7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICAvLyBBbGxvY2F0ZSBMb2dpY2FsIENhbWVyYSBkZXNjcmlwdG9ycworICAgIG1fcExvZ2ljYWxDYW1lcmEgPSBuZXcgcWNhbWVyYV9sb2dpY2FsX2Rlc2NyaXB0b3JfdFttX25Mb2dpY2FsQ2FtZXJhc107CisgICAgaWYgKCFtX3BMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIExPR0UoIkVycm9yICEhISEgYWxsb2NhdGluZyBjYW1lcmEgaW5mbyBidWZmZXIhISIpOworICAgICAgICBkZWxldGUgW10gbV9wUGh5Q2FtZXJhOworICAgICAgICBtX3BQaHlDYW1lcmEgPSBOVUxMOworICAgICAgICByZXR1cm4gIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KG1fcExvZ2ljYWxDYW1lcmEsIDB4MDAsCisgICAgICAgICAgICAobV9uTG9naWNhbENhbWVyYXMgKiBzaXplb2YocWNhbWVyYV9sb2dpY2FsX2Rlc2NyaXB0b3JfdCkpKTsKKyAgICAvLyBBc3NpZ24gTUFJTiBjYW1lcmFzIGZvciBlYWNoIGxvZ2ljYWwgY2FtZXJhCisgICAgaW50IGluZGV4ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbV9uUGh5Q2FtZXJhcyA7IGkrKykgeworICAgICAgICBpZiAobV9wUGh5Q2FtZXJhW2ldLm1vZGUgPT0gQ0FNX01PREVfUFJJTUFSWSkgeworICAgICAgICAgICAgbV9wTG9naWNhbENhbWVyYVtpbmRleF0ublByaW1hcnlQaHlDYW1JbmRleCA9IDA7CisgICAgICAgICAgICBtX3BMb2dpY2FsQ2FtZXJhW2luZGV4XS5pZCA9IGluZGV4OworICAgICAgICAgICAgbV9wTG9naWNhbENhbWVyYVtpbmRleF0uZGV2aWNlX3ZlcnNpb24gPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDsKKyAgICAgICAgICAgIG1fcExvZ2ljYWxDYW1lcmFbaW5kZXhdLnBJZFswXSA9IGk7CisgICAgICAgICAgICBtX3BMb2dpY2FsQ2FtZXJhW2luZGV4XS50eXBlWzBdID0gQ0FNX1RZUEVfTUFJTjsKKyAgICAgICAgICAgIG1fcExvZ2ljYWxDYW1lcmFbaW5kZXhdLm1vZGVbMF0gPSBDQU1fTU9ERV9QUklNQVJZOworICAgICAgICAgICAgbV9wTG9naWNhbENhbWVyYVtpbmRleF0uc3luY18zYVswXSA9IENBTV8zQV9TWU5DX0ZPTExPVzsKKyAgICAgICAgICAgIG1fcExvZ2ljYWxDYW1lcmFbaW5kZXhdLmZhY2luZyA9IG1fcFBoeUNhbWVyYVtpXS5jYW1faW5mby5mYWNpbmc7CisgICAgICAgICAgICBtX3BMb2dpY2FsQ2FtZXJhW2luZGV4XS5udW1DYW1lcmFzKys7CisgICAgICAgICAgICBMT0dIKCJMb2dpY2FsIE1haW4gQ2FtZXJhIElEOiAlZCwgZmFjaW5nOiAlZCwiCisgICAgICAgICAgICAgICAgICAgICJQaHkgSWQ6ICVkIHR5cGU6ICVkIG1vZGU6ICVkIiwKKyBtX3BMb2dpY2FsQ2FtZXJhW2luZGV4XS5pZCwKKyAgICAgICAgICAgICAgICAgICAgbV9wTG9naWNhbENhbWVyYVtpbmRleF0uZmFjaW5nLAorICAgICAgICAgICAgICAgICAgICBtX3BMb2dpY2FsQ2FtZXJhW2luZGV4XS5wSWRbMF0sCisgICAgICAgICAgICAgICAgICAgIG1fcExvZ2ljYWxDYW1lcmFbaW5kZXhdLnR5cGVbMF0sCisgICAgICAgICAgICAgICAgICAgIG1fcExvZ2ljYWxDYW1lcmFbaW5kZXhdLm1vZGVbMF0pOworCisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisgICAgfQorICAgIC8vTm93IGFzc2lnbiBBVVggY2FtZXJhcyB0byBsb2dpY2FsIGNhbWVyYQorICAgIGZvciAoaSA9IDA7IGkgPCBtX25QaHlDYW1lcmFzIDsgaSsrKSB7CisgICAgICAgIGlmIChtX3BQaHlDYW1lcmFbaV0ubW9kZSA9PSBDQU1fTU9ERV9TRUNPTkRBUlkpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbV9uTG9naWNhbENhbWVyYXM7IGorKykgeworICAgICAgICAgICAgICAgIGludCBuID0gbV9wTG9naWNhbENhbWVyYVtqXS5udW1DYW1lcmFzOworICAgICAgICAgICAgICAgIC8vL0Bub3RlIG4gY2FuIG9ubHkgYmUgMSBhdCB0aGlzIHBvaW50CisgICAgICAgICAgICAgICAgaWYgKChuIDwgTUFYX05VTV9DQU1FUkFfUEVSX0JVTkRMRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChtX3BMb2dpY2FsQ2FtZXJhW2pdLmZhY2luZyA9PQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wUGh5Q2FtZXJhW2ldLmNhbV9pbmZvLmZhY2luZykpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9wTG9naWNhbENhbWVyYVtqXS5wSWRbbl0gPSBpOworICAgICAgICAgICAgICAgICAgICBtX3BMb2dpY2FsQ2FtZXJhW2pdLnR5cGVbbl0gPSBDQU1fVFlQRV9BVVg7CisgICAgICAgICAgICAgICAgICAgIG1fcExvZ2ljYWxDYW1lcmFbal0ubW9kZVtuXSA9IENBTV9NT0RFX1NFQ09OREFSWTsKKyAgICAgICAgICAgICAgICAgICAgbV9wTG9naWNhbENhbWVyYVtqXS5zeW5jXzNhW25dID0gQ0FNXzNBX1NZTkNfRk9MTE9XOworICAgICAgICAgICAgICAgICAgICBtX3BMb2dpY2FsQ2FtZXJhW2pdLm51bUNhbWVyYXMrKzsKKyAgICAgICAgICAgICAgICAgICAgTE9HSCgiQXV4ICVkIGZvciBMb2dpY2FsIENhbWVyYSBJRDogJWQsIgorICAgICAgICAgICAgICAgICAgICAgICAgImF1eCBwaHkgaWQ6JWQsIHR5cGU6ICVkIG1vZGU6ICVkIiwKKyBuLCBqLCBtX3BMb2dpY2FsQ2FtZXJhW2pdLnBJZFtuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvZ2ljYWxDYW1lcmFbal0udHlwZVtuXSwgbV9wTG9naWNhbENhbWVyYVtqXS5tb2RlW25dKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy9QcmludCBsb2dpY2FsIGFuZCBwaHlzaWNhbCBjYW1lcmEgdGFibGVzCisgICAgZm9yIChpID0gMDsgaSA8IG1fbkxvZ2ljYWxDYW1lcmFzIDsgaSsrKSB7CisgICAgICAgIGZvciAodWludDhfdCBqID0gMDsgaiA8IG1fcExvZ2ljYWxDYW1lcmFbaV0ubnVtQ2FtZXJhczsgaisrKSB7CisgICAgICAgICAgICBMT0dIKCJMb2dpY2FsIENhbWVyYSBJRDogJWQsIGluZGV4OiAlZCwgIgorICAgICAgICAgICAgICAgICAgICAiZmFjaW5nOiAlZCwgUGh5IElkOiAlZCB0eXBlOiAlZCBtb2RlOiAlZCIsCisgaSwgaiwgbV9wTG9naWNhbENhbWVyYVtpXS5mYWNpbmcsCisgICAgICAgICAgICAgICAgICAgIG1fcExvZ2ljYWxDYW1lcmFbaV0ucElkW2pdLCBtX3BMb2dpY2FsQ2FtZXJhW2ldLnR5cGVbal0sCisgICAgICAgICAgICAgICAgICAgIG1fcExvZ2ljYWxDYW1lcmFbaV0ubW9kZVtqXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HSCgiWyVkXSBYOiByYyA9ICVkIiwgcmMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXROdW1iZXJPZkNhbWVyYXMKKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgbnVtYmVyIG9mIGxvZ2ljYWwgY2FtZXJhcyBkZXRlY3RlZAorICoKKyAqIFJFVFVSTiAgICAgOiBudW1iZXIgb2YgY2FtZXJhcyBkZXRlY3RlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYU11eGVyOjpnZXROdW1iZXJPZkNhbWVyYXMoKQoreworICAgIHJldHVybiBtX25Mb2dpY2FsQ2FtZXJhczsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRDYW1lcmFJbmZvCisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IGNhbWVyYSBpbmZvcm1hdGlvbiB3aXRoIGl0cyBJRAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2lkIDogY2FtZXJhIElECisgKiAgIEBpbmZvICAgICAgOiBwdHIgdG8gY2FtZXJhIGluZm8gc3RydWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFNdXhlcjo6Z2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhX2lkLAorICAgICAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gKmluZm8sIF9fdW51c2VkIGNhbV9zeW5jX3R5cGVfdCAqcF9jYW1fdHlwZSkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICBMT0dIKCJFLCBjYW1lcmFfaWQgPSAlZCIsIGNhbWVyYV9pZCk7CisKKyAgICBpZiAoIW1fbkxvZ2ljYWxDYW1lcmFzIHx8IChjYW1lcmFfaWQgPj0gbV9uTG9naWNhbENhbWVyYXMpIHx8CisgICAgICAgICAgICAhaW5mbyB8fCAoY2FtZXJhX2lkIDwgMCkpIHsKKyAgICAgICAgTE9HRSgibV9uTG9naWNhbENhbWVyYXM6ICVkLCBjYW1lcmEgaWQ6ICVkIiwKKyAgICAgICAgICAgICAgICBtX25Mb2dpY2FsQ2FtZXJhcywgY2FtZXJhX2lkKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgaWYgKCFtX3BMb2dpY2FsQ2FtZXJhIHx8ICFtX3BQaHlDYW1lcmEpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IhIENhbWVyYXMgbm90IGluaXRpYWxpemVkISIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgdWludDMyX3QgcGh5X2lkID0KKyAgICAgICAgICAgIG1fcExvZ2ljYWxDYW1lcmFbY2FtZXJhX2lkXS5wSWRbCisgICAgICAgICAgICBtX3BMb2dpY2FsQ2FtZXJhW2NhbWVyYV9pZF0ublByaW1hcnlQaHlDYW1JbmRleF07CisgICAgLy8gQ2FsbCBIQUwzIGdldENhbUluZm8gdG8gZ2V0IHRoZSBmbGFzaCBsaWdodCBpbmZvIHRocm91Z2ggc3RhdGljIG1ldGF0ZGF0YQorICAgIC8vIHJlZ2FyZGxlc3Mgb2YgSEFMIHZlcnNpb24KKyAgICByYyA9IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmdldENhbUluZm8ocGh5X2lkLCBpbmZvKTsKKyAgICBpbmZvLT5kZXZpY2VfdmVyc2lvbiA9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOyAvLyBIYXJkY29kZSB0aGUgSEFMIHRvIEhBTDEKKyAgICBMT0dIKCJYIik7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldENhbGxiYWNrcworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIHNlbmQgYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbnMgdG8KKyAqICAgICAgICAgICAgICBmcmFtZXdvcmtzLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FsbGJhY2tzIDogY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYU11eGVyOjpzZXRDYWxsYmFja3MoY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCAqY2FsbGJhY2tzKQoreworICAgIGlmKGNhbGxiYWNrcykgeworICAgICAgICBtX3BDYWxsYmFja3MgPSBjYWxsYmFja3M7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldERhdGFDYWxsYmFjaworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgZGF0YSBjYWxsYmFjayBmdW5jdGlvbiBmb3Igc25hcHNob3RzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkYXRhX2NiIDogY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYU11eGVyOjpzZXREYXRhQ2FsbGJhY2soY2FtZXJhX2RhdGFfY2FsbGJhY2sgZGF0YV9jYikKK3sKKyAgICBpZihkYXRhX2NiKSB7CisgICAgICAgIG1EYXRhQ2IgPSBkYXRhX2NiOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRNZW1vcnlDYWxsYmFjaworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgZ2V0IG1lbW9yeSBjYWxsYmFjayBmb3IgbWVtb3J5IGFsbG9jYXRpb25zCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBnZXRfbWVtb3J5IDogY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYU11eGVyOjpzZXRNZW1vcnlDYWxsYmFjayhjYW1lcmFfcmVxdWVzdF9tZW1vcnkgZ2V0X21lbW9yeSkKK3sKKyAgICBpZihnZXRfbWVtb3J5KSB7CisgICAgICAgIG1HZXRNZW1vcnlDYiA9IGdldF9tZW1vcnk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldE1wb0NhbGxiYWNrQ29va2llCisgKgorICogREVTQ1JJUFRJT046IHNldCBtcG8gY2FsbGJhY2sgY29va2llLiB3aWxsIGJlIHVzZWQgZm9yIHNlbmRpbmcgZmluYWwgTVBPIGNhbGxiYWNrcworICogICAgICAgICAgICAgICAgICAgICB0byBmcmFtZXdvcmsKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1wb0NiQ29va2llIDogY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYU11eGVyOjpzZXRNcG9DYWxsYmFja0Nvb2tpZSh2b2lkKiBtcG9DYkNvb2tpZSkKK3sKKyAgICBpZihtcG9DYkNvb2tpZSkgeworICAgICAgICBtX3BNcG9DYWxsYmFja0Nvb2tpZSA9IG1wb0NiQ29va2llOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRNcG9DYWxsYmFja0Nvb2tpZQorICoKKyAqIERFU0NSSVBUSU9OOiBnZXRzIHRoZSBtcG8gY2FsbGJhY2sgY29va2llLiB3aWxsIGJlIHVzZWQgZm9yIHNlbmRpbmcgZmluYWwgTVBPIGNhbGxiYWNrcworICogICAgICAgICAgICAgICAgICAgICB0byBmcmFtZXdvcmsKKyAqCisgKiBQQVJBTUVURVJTIDpub25lCisgKgorICogUkVUVVJOICAgICA6dm9pZCBwdHIgdG8gdGhlIG1wbyBjYWxsYmFjayBjb29raWUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCogUUNhbWVyYU11eGVyOjpnZXRNcG9DYWxsYmFja0Nvb2tpZSh2b2lkKQoreworICAgIHJldHVybiBtX3BNcG9DYWxsYmFja0Nvb2tpZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRNYWluSnBlZ0NhbGxiYWNrQ29va2llCisgKgorICogREVTQ1JJUFRJT046IHNldCBqcGVnIGNhbGxiYWNrIGNvb2tpZS4KKyAqICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIHBoeSBjYW0gaW5zdGFuY2Ugb2YgdGhlIHByaW1hcnkgcmVsYXRlZCBjYW0gaW5zdGFuY2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGpwZWdDYkNvb2tpZSA6IHB0ciB0byBqcGVnIGNvb2tpZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYU11eGVyOjpzZXRNYWluSnBlZ0NhbGxiYWNrQ29va2llKHZvaWQqIGpwZWdDYkNvb2tpZSkKK3sKKyAgICBpZihqcGVnQ2JDb29raWUpIHsKKyAgICAgICAgbV9wSnBlZ0NhbGxiYWNrQ29va2llID0ganBlZ0NiQ29va2llOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRNYWluSnBlZ0NhbGxiYWNrQ29va2llCisgKgorICogREVTQ1JJUFRJT046IGdldHMgdGhlIGpwZWcgY2FsbGJhY2sgY29va2llIGZvciBwcmltYXJ5IHJlbGF0ZWQgY2FtIGluc3RhbmNlCisgKiAgICAgICAgICAgICAgICAgICAgIHNldCB0byBwaHkgY2FtIGluc3RhbmNlIG9mIHRoZSBwcmltYXJ5IHJlbGF0ZWQgY2FtIGluc3RhbmNlCisgKgorICogUEFSQU1FVEVSUyA6bm9uZQorICoKKyAqIFJFVFVSTiAgICAgOnZvaWQgcHRyIHRvIHRoZSBqcGVnIGNhbGxiYWNrIGNvb2tpZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkKiBRQ2FtZXJhTXV4ZXI6OmdldE1haW5KcGVnQ2FsbGJhY2tDb29raWUodm9pZCkKK3sKKyAgICByZXR1cm4gbV9wSnBlZ0NhbGxiYWNrQ29va2llOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhbWVyYURldmljZU9wZW4KKyAqCisgKiBERVNDUklQVElPTjogb3BlbiBhIGNhbWVyYSBkZXZpY2Ugd2l0aCBpdHMgSUQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9pZCA6IGNhbWVyYSBJRAorICogICBAaHdfZGV2aWNlIDogcHRyIHRvIHN0cnVjdCBzdG9yaW5nIGNhbWVyYSBoYXJkd2FyZSBkZXZpY2UgaW5mbworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhTXV4ZXI6OmNhbWVyYURldmljZU9wZW4oaW50IGNhbWVyYV9pZCwKKyAgICAgICAgc3RydWN0IGh3X2RldmljZV90ICoqaHdfZGV2aWNlKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIHVpbnQzMl90IHBoeUlkID0gMDsKKyAgICBxY2FtZXJhX2xvZ2ljYWxfZGVzY3JpcHRvcl90ICpjYW0gPSBOVUxMOworCisgICAgaWYgKGNhbWVyYV9pZCA8IDAgfHwgY2FtZXJhX2lkID49IG1fbkxvZ2ljYWxDYW1lcmFzKSB7CisgICAgICAgIExPR0UoIkNhbWVyYSBpZCAlZCBub3QgZm91bmQhIiwgY2FtZXJhX2lkKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgaWYgKCBOVUxMID09IG1fcExvZ2ljYWxDYW1lcmEpIHsKKyAgICAgICAgTE9HRSgiSGFsIGRlc2NyaXB0b3IgdGFibGUgaXMgbm90IGluaXRpYWxpemVkISIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmRjLmZyYW1lLnN5bmMiLCBwcm9wLCAiMSIpOworICAgIG1fYkZyYW1lU3luY0VuYWJsZWQgPSBhdG9pKHByb3ApOworCisgICAgLy8gR2V0IGxvZ2ljYWwgY2FtZXJhCisgICAgY2FtID0gJm1fcExvZ2ljYWxDYW1lcmFbY2FtZXJhX2lkXTsKKworICAgIGlmIChtX3BMb2dpY2FsQ2FtZXJhW2NhbWVyYV9pZF0uZGV2aWNlX3ZlcnNpb24gPT0KKyAgICAgICAgICAgIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKSB7CisgICAgICAgIC8vIEhXIERldiBIb2xkZXJzCisgICAgICAgIGh3X2RldmljZV90ICpod19kZXZbY2FtLT5udW1DYW1lcmFzXTsKKworICAgICAgICBpZiAobV9wUGh5Q2FtZXJhW2NhbS0+cElkWzBdXS50eXBlICE9IENBTV9UWVBFX01BSU4pIHsKKyAgICAgICAgICAgIExPR0UoIlBoeXNpY2FsIGNhbWVyYSBhdCBpbmRleCAwIGlzIG5vdCBtYWluISIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICAvLyBPcGVuIGFsbCBwaHlzaWNhbCBjYW1lcmFzCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjYW0tPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgcGh5SWQgPSBjYW0tPnBJZFtpXTsKKyAgICAgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UoKHVpbnQzMl90KXBoeUlkKTsKKyAgICAgICAgICAgIGlmICghaHcpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJBbGxvY2F0aW9uIG9mIGhhcmR3YXJlIGludGVyZmFjZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHdfZGV2W2ldID0gTlVMTDsKKworICAgICAgICAgICAgLy8gTWFrZSBDYW1lcmEgSFdJIGF3YXJlIG9mIGl0cyBtb2RlCisgICAgICAgICAgICBjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190IGluZm87CisgICAgICAgICAgICBpbmZvLnN5bmNfY29udHJvbCA9IENBTV9TWU5DX1JFTEFURURfU0VOU09SU19PTjsKKyAgICAgICAgICAgIGluZm8ubW9kZSA9IG1fcFBoeUNhbWVyYVtwaHlJZF0ubW9kZTsKKyAgICAgICAgICAgIGluZm8udHlwZSA9IG1fcFBoeUNhbWVyYVtwaHlJZF0udHlwZTsKKyAgICAgICAgICAgIHJjID0gaHctPnNldFJlbGF0ZWRDYW1TeW5jSW5mbygmaW5mbyk7CisgICAgICAgICAgICBody0+c2V0RnJhbWVTeW5jRW5hYmxlZChtX2JGcmFtZVN5bmNFbmFibGVkKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR0UoInNldFJlbGF0ZWRDYW1TeW5jSW5mbyBmYWlsZWQgJWQiLCByYyk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGh3OworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBody0+b3BlbkNhbWVyYSgmaHdfZGV2W2ldKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBodzsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBody0+Z2V0Q2FtZXJhU2Vzc2lvbklkKCZtX3BQaHlDYW1lcmFbcGh5SWRdLmNhbWVyYV9zZXJ2ZXJfaWQpOworICAgICAgICAgICAgbV9wUGh5Q2FtZXJhW3BoeUlkXS5kZXYgPSByZWludGVycHJldF9jYXN0PGNhbWVyYV9kZXZpY2VfdCo+KGh3X2RldltpXSk7CisgICAgICAgICAgICBtX3BQaHlDYW1lcmFbcGh5SWRdLmh3aSA9IGh3OworICAgICAgICAgICAgY2FtLT5zSWRbaV0gPSBtX3BQaHlDYW1lcmFbcGh5SWRdLmNhbWVyYV9zZXJ2ZXJfaWQ7CisgICAgICAgICAgICBMT0dIKCJjYW1lcmEgaWQgJWQgc2VydmVyIGlkIDogJWQgaHcgZGV2aWNlICV4LCBodyAleCIsCisgICAgICAgICAgICAgICAgICAgICBwaHlJZCwgY2FtLT5zSWRbaV0sIGh3X2RldltpXSwgaHcpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiRGV2aWNlIHZlcnNpb24gZm9yIGNhbWVyYSBpZCAlZCBpbnZhbGlkICVkIiwKKyAgICAgICAgICAgICAgICAgY2FtZXJhX2lkLCBtX3BMb2dpY2FsQ2FtZXJhW2NhbWVyYV9pZF0uZGV2aWNlX3ZlcnNpb24pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNhbS0+ZGV2LmNvbW1vbi50YWcgPSBIQVJEV0FSRV9ERVZJQ0VfVEFHOworICAgIGNhbS0+ZGV2LmNvbW1vbi52ZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKDEsIDApOworICAgIGNhbS0+ZGV2LmNvbW1vbi5jbG9zZSA9IGNsb3NlX2NhbWVyYV9kZXZpY2U7CisgICAgY2FtLT5kZXYub3BzID0gJm1DYW1lcmFNdXhlck9wczsKKyAgICBjYW0tPmRldi5wcml2ID0gKHZvaWQqKWNhbTsKKyAgICAqaHdfZGV2aWNlID0gJmNhbS0+ZGV2LmNvbW1vbjsKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRMb2dpY2FsQ2FtZXJhCisgKgorICogREVTQ1JJUFRJT046IEdldCBsb2dpY2FsIGNhbWVyYSBkZXNjcmlwdG9yCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkZXZpY2UgOiBjYW1lcmEgaGFyZHdhcmUgZGV2aWNlIGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDogbG9naWNhbCBjYW1lcmEgZGVzY3JpcHRvciBvciBOVUxMCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3FjYW1lcmFfbG9naWNhbF9kZXNjcmlwdG9yX3QqIFFDYW1lcmFNdXhlcjo6Z2V0TG9naWNhbENhbWVyYSgKKyAgICAgICAgc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisgICAgaWYoZGV2aWNlICYmIGRldmljZS0+cHJpdil7CisgICAgICAgIHJldHVybiAocWNhbWVyYV9sb2dpY2FsX2Rlc2NyaXB0b3JfdCopKGRldmljZS0+cHJpdik7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFBoeXNpY2FsQ2FtZXJhCisgKgorICogREVTQ1JJUFRJT046IEdldCBwaHlzaWNhbCBjYW1lcmEgZGVzY3JpcHRvcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbG9nX2NhbSA6IExvZ2ljYWwgY2FtZXJhIGRlc2NyaXB0b3IKKyAqICAgQGluZGV4IDogcGh5c2ljYWwgY2FtZXJhIGluZGV4CisgKgorICogUkVUVVJOICAgICA6IHBoeXNpY2FsIGNhbWVyYSBkZXNjcmlwdG9yIG9yIE5VTEwKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworcWNhbWVyYV9waHlzaWNhbF9kZXNjcmlwdG9yX3QqIFFDYW1lcmFNdXhlcjo6Z2V0UGh5c2ljYWxDYW1lcmEoCisgICAgICAgIHFjYW1lcmFfbG9naWNhbF9kZXNjcmlwdG9yX3QqIGxvZ19jYW0sIHVpbnQzMl90IGluZGV4KQoreworICAgIGlmKCFsb2dfY2FtKXsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiAmbV9wUGh5Q2FtZXJhW2xvZ19jYW0tPnBJZFtpbmRleF1dOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEFjdGl2ZU51bU9mUGh5Q2FtCisgKgorICogREVTQ1JJUFRJT046IEdldCBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhIG51bWJlciBpbiBMb2dpY2FsIENhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbG9nX2NhbSA6ICAgTG9naWNhbCBjYW1lcmEgZGVzY3JpcHRvcgorICogICBAbnVtT2ZBY2l0dmVQaHlDYW0gOiAgbnVtYmVyIG9mIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgaW4gTG9naWNhbCBDYW1lcmEuCisgKgorICogUkVUVVJOICAgICA6CisgKiAgICAgICAgICAgICAgICBOT19FUlJPUiAgOiBzdWNjZXNzCisgKiAgICAgICAgICAgICAgICBFTk9ERVYgOiBDYW1lcmEgbm90IGZvdW5kCisgKiAgICAgICAgICAgICAgICBvdGhlcjogbm9uLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYU11eGVyOjpnZXRBY3RpdmVOdW1PZlBoeUNhbSgKKyAgICAgICAgcWNhbWVyYV9sb2dpY2FsX2Rlc2NyaXB0b3JfdCogbG9nX2NhbSwgaW50JiBudW1PZkFjaXR2ZVBoeUNhbSkKK3sKKyAgICBDSEVDS19DQU1FUkFfRVJST1IobG9nX2NhbSk7CisKKyAgICBudW1PZkFjaXR2ZVBoeUNhbSA9IGxvZ19jYW0tPm51bUNhbWVyYXM7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2VuZEV2dE5vdGlmeQorICoKKyAqIERFU0NSSVBUSU9OOiBzZW5kIGV2ZW50IG5vdGlmeSB0byBIV0kgZm9yIGVycm9yIGNhbGxiYWNrcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXNnX3R5cGU6IG1zZyB0eXBlIHRvIGJlIHNlbnQKKyAqICAgQGV4dDEgICAgOiBvcHRpb25hbCBleHRlbnNpb24xCisgKiAgIEBleHQyICAgIDogb3B0aW9uYWwgZXh0ZW5zaW9uMgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYU11eGVyOjpzZW5kRXZ0Tm90aWZ5KGludDMyX3QgbXNnX3R5cGUsIGludDMyX3QgZXh0MSwKKyAgICAgICAgaW50MzJfdCBleHQyKQoreworICAgIExPR0goIkUiKTsKKworICAgIENIRUNLX01VWEVSX0VSUk9SKCk7CisKKyAgICBxY2FtZXJhX3BoeXNpY2FsX2Rlc2NyaXB0b3JfdCAqcENhbSA9IE5VTEw7CisgICAgcENhbSA9IChxY2FtZXJhX3BoeXNpY2FsX2Rlc2NyaXB0b3JfdCopKGdNdXhlci0+Z2V0TWFpbkpwZWdDYWxsYmFja0Nvb2tpZSgpKTsKKworICAgIENIRUNLX0NBTUVSQV9FUlJPUihwQ2FtKTsKKworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aSA9IHBDYW0tPmh3aTsKKyAgICBDSEVDS19IV0lfRVJST1IoaHdpKTsKKworICAgIExPR0goIlgiKTsKKyAgICByZXR1cm4gcENhbS0+aHdpLT5zZW5kRXZ0Tm90aWZ5KG1zZ190eXBlLCBleHQxLCBleHQyKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjb21wb3NlTXBvCisgKgorICogREVTQ1JJUFRJT046IENvbXBvc2l0aW9uIG9mIHRoZSAyIE1QT3MKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICogICBAbWFpbl9KcGVnOiBwb2ludGVyIHRvIGluZm8gdG8gTWFpbiBKcGVnCisgKiAgIEBhdXhfSnBlZyA6IHBvaW50ZXIgdG8gaW5mbyB0byBBdXggSlBFRworICoKKyAgKiBSRVRVUk4gOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYU11eGVyOjpjb21wb3NlTXBvKGNhbV9jb21wb3NlX2pwZWdfaW5mb190KiBtYWluX0pwZWcsCisgICAgICAgIGNhbV9jb21wb3NlX2pwZWdfaW5mb190KiBhdXhfSnBlZykKK3sKKyAgICBMT0dIKCJFIE1haW4gSnBlZyAlcCBBdXggSnBlZyAlcCIsIG1haW5fSnBlZywgYXV4X0pwZWcpOworCisgICAgQ0hFQ0tfTVVYRVIoKTsKKyAgICBpZihtYWluX0pwZWcgPT0gTlVMTCB8fCBhdXhfSnBlZyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoImlucHV0IGJ1ZmZlcnMgaW52YWxpZCwgcmV0ID0gTk9fTUVNT1JZIik7CisgICAgICAgIGdNdXhlci0+c2VuZEV2dE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLCBVTktOT1dOX0VSUk9SLCAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9KcGVnTG9jayk7CisKKyAgICBtX3BSZWxDYW1NcG9KcGVnID0gbUdldE1lbW9yeUNiKC0xLCBtYWluX0pwZWctPmJ1ZmZlci0+c2l6ZSArCisgICAgICAgICAgICBhdXhfSnBlZy0+YnVmZmVyLT5zaXplLCAxLCBtX3BNcG9DYWxsYmFja0Nvb2tpZSk7CisgICAgaWYgKE5VTEwgPT0gbV9wUmVsQ2FtTXBvSnBlZykgeworICAgICAgICBMT0dFKCJnZXRNZW1vcnkgZm9yIG1wbywgcmV0ID0gTk9fTUVNT1JZIik7CisgICAgICAgIGdNdXhlci0+c2VuZEV2dE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLCBVTktOT1dOX0VSUk9SLCAwKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fSnBlZ0xvY2spOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gZmlsbCBhbGwgc3RydWN0dXJlcyB0byBzZW5kIGZvciBjb21wb3NpdGlvbgorICAgIG1tX2pwZWdfbXBvX2luZm9fdCBtcG9fY29tcG9zZV9pbmZvOworICAgIG1wb19jb21wb3NlX2luZm8ubnVtX29mX2ltYWdlcyA9IDI7CisgICAgbXBvX2NvbXBvc2VfaW5mby5wcmltYXJ5X2ltYWdlLmJ1Zl9maWxsZWRfbGVuID0gbWFpbl9KcGVnLT5idWZmZXItPnNpemU7CisgICAgbXBvX2NvbXBvc2VfaW5mby5wcmltYXJ5X2ltYWdlLmJ1Zl92YWRkciA9CisgICAgICAgICAgICAodWludDhfdCopKG1haW5fSnBlZy0+YnVmZmVyLT5kYXRhKTsKKyAgICBtcG9fY29tcG9zZV9pbmZvLmF1eF9pbWFnZXNbMF0uYnVmX2ZpbGxlZF9sZW4gPSBhdXhfSnBlZy0+YnVmZmVyLT5zaXplOworICAgIG1wb19jb21wb3NlX2luZm8uYXV4X2ltYWdlc1swXS5idWZfdmFkZHIgPQorICAgICAgICAgICAgKHVpbnQ4X3QqKShhdXhfSnBlZy0+YnVmZmVyLT5kYXRhKTsKKyAgICBtcG9fY29tcG9zZV9pbmZvLm91dHB1dF9idWZmLmJ1Zl92YWRkciA9CisgICAgICAgICAgICAodWludDhfdCopbV9wUmVsQ2FtTXBvSnBlZy0+ZGF0YTsKKyAgICBtcG9fY29tcG9zZV9pbmZvLm91dHB1dF9idWZmLmJ1Zl9maWxsZWRfbGVuID0gMDsKKyAgICBtcG9fY29tcG9zZV9pbmZvLm91dHB1dF9idWZmX3NpemUgPSBtYWluX0pwZWctPmJ1ZmZlci0+c2l6ZSArCisgICAgICAgICAgICBhdXhfSnBlZy0+YnVmZmVyLT5zaXplOworCisgICAgTE9HRCgiTVBPIGJ1ZmZlciBzaXplICVkXG4iCisgICAgICAgICAgICAiZXhwZWN0ZWQgc2l6ZSAlZCwgbXBvX2NvbXBvc2VfaW5mby5vdXRwdXRfYnVmZl9zaXplICVkIiwKKyAgICAgICAgICAgICBtX3BSZWxDYW1NcG9KcGVnLT5zaXplLAorICAgICAgICAgICAgbWFpbl9KcGVnLT5idWZmZXItPnNpemUgKyBhdXhfSnBlZy0+YnVmZmVyLT5zaXplLAorICAgICAgICAgICAgbXBvX2NvbXBvc2VfaW5mby5vdXRwdXRfYnVmZl9zaXplKTsKKworICAgIExPR0QoIk1QTyBwcmltYXJ5IGJ1ZmZlciBmaWxsZWQgbGVuZ3Roc1xuIgorICAgICAgICAgICAgIm1wb19jb21wb3NlX2luZm8ucHJpbWFyeV9pbWFnZS5idWZfZmlsbGVkX2xlbiAlZFxuIgorICAgICAgICAgICAgIm1wb19jb21wb3NlX2luZm8ucHJpbWFyeV9pbWFnZS5idWZfdmFkZHIgJXAiLAorICAgICAgICAgICAgbXBvX2NvbXBvc2VfaW5mby5wcmltYXJ5X2ltYWdlLmJ1Zl9maWxsZWRfbGVuLAorICAgICAgICAgICAgbXBvX2NvbXBvc2VfaW5mby5wcmltYXJ5X2ltYWdlLmJ1Zl92YWRkcik7CisKKyAgICBMT0dEKCJNUE8gYXV4IGJ1ZmZlciBmaWxsZWQgbGVuZ3Roc1xuIgorICAgICAgICAgICAgIm1wb19jb21wb3NlX2luZm8uYXV4X2ltYWdlc1swXS5idWZfZmlsbGVkX2xlbiAlZCIKKyAgICAgICAgICAgICJtcG9fY29tcG9zZV9pbmZvLmF1eF9pbWFnZXNbMF0uYnVmX3ZhZGRyICVwIiwKKyAgICAgICAgICAgIG1wb19jb21wb3NlX2luZm8uYXV4X2ltYWdlc1swXS5idWZfZmlsbGVkX2xlbiwKKyAgICAgICAgICAgIG1wb19jb21wb3NlX2luZm8uYXV4X2ltYWdlc1swXS5idWZfdmFkZHIpOworCisgICAgaWYobV9iRHVtcEltYWdlcykgeworICAgICAgICBMT0dEKCJEdW1waW5nIE1haW4gSW1hZ2UgZm9yIE1QTyIpOworICAgICAgICBjaGFyIGJ1Zl9tYWluW1FDQU1FUkFfTUFYX0ZJTEVQQVRIX0xFTkdUSF07CisgICAgICAgIG1lbXNldChidWZfbWFpbiwgMCwgc2l6ZW9mKGJ1Zl9tYWluKSk7CisgICAgICAgIHNucHJpbnRmKGJ1Zl9tYWluLCBzaXplb2YoYnVmX21haW4pLAorICAgICAgICAgICAgICAgIFFDQU1FUkFfRFVNUF9GUk1fTE9DQVRJT04gIk1haW4uanBnIik7CisKKyAgICAgICAgaW50IGZpbGVfZmRfbWFpbiA9IG9wZW4oYnVmX21haW4sIE9fUkRXUiB8IE9fQ1JFQVQsIDA3NzcpOworICAgICAgICBpZiAoZmlsZV9mZF9tYWluID49IDApIHsKKyAgICAgICAgICAgIHNzaXplX3Qgd3JpdHRlbl9sZW4gPSB3cml0ZShmaWxlX2ZkX21haW4sCisgICAgICAgICAgICAgICAgICAgIG1wb19jb21wb3NlX2luZm8ucHJpbWFyeV9pbWFnZS5idWZfdmFkZHIsCisgICAgICAgICAgICAgICAgICAgIG1wb19jb21wb3NlX2luZm8ucHJpbWFyeV9pbWFnZS5idWZfZmlsbGVkX2xlbik7CisgICAgICAgICAgICBmY2htb2QoZmlsZV9mZF9tYWluLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKKyAgICAgICAgICAgIExPR0QoIndyaXR0ZW4gbnVtYmVyIG9mIGJ5dGVzIGZvciBtYWluIEltYWdlICV6ZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW5fbGVuKTsKKyAgICAgICAgICAgIGNsb3NlKGZpbGVfZmRfbWFpbik7CisgICAgICAgIH0KKworICAgICAgICBMT0dEKCJEdW1waW5nIEF1eCBJbWFnZSBmb3IgTVBPIik7CisgICAgICAgIGNoYXIgYnVmX2F1eFtRQ0FNRVJBX01BWF9GSUxFUEFUSF9MRU5HVEhdOworICAgICAgICBtZW1zZXQoYnVmX2F1eCwgMCwgc2l6ZW9mKGJ1Zl9hdXgpKTsKKyAgICAgICAgc25wcmludGYoYnVmX2F1eCwgc2l6ZW9mKGJ1Zl9hdXgpLAorICAgICAgICAgICAgICAgIFFDQU1FUkFfRFVNUF9GUk1fTE9DQVRJT04gIkF1eC5qcGciKTsKKworICAgICAgICBpbnQgZmlsZV9mZF9hdXggPSBvcGVuKGJ1Zl9hdXgsIE9fUkRXUiB8IE9fQ1JFQVQsIDA3NzcpOworICAgICAgICBpZiAoZmlsZV9mZF9hdXggPj0gMCkgeworICAgICAgICAgICAgc3NpemVfdCB3cml0dGVuX2xlbiA9IHdyaXRlKGZpbGVfZmRfYXV4LAorICAgICAgICAgICAgICAgICAgICBtcG9fY29tcG9zZV9pbmZvLmF1eF9pbWFnZXNbMF0uYnVmX3ZhZGRyLAorICAgICAgICAgICAgICAgICAgICBtcG9fY29tcG9zZV9pbmZvLmF1eF9pbWFnZXNbMF0uYnVmX2ZpbGxlZF9sZW4pOworICAgICAgICAgICAgZmNobW9kKGZpbGVfZmRfYXV4LCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKKyAgICAgICAgICAgIExPR0QoIndyaXR0ZW4gbnVtYmVyIG9mIGJ5dGVzIGZvciBBdXggSW1hZ2UgJXpkXG4iLAorICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbl9sZW4pOworICAgICAgICAgICAgY2xvc2UoZmlsZV9mZF9hdXgpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCByYyA9IG1KcGVnTXBvT3BzLmNvbXBvc2VfbXBvKCZtcG9fY29tcG9zZV9pbmZvKTsKKyAgICBMT0dEKCJDb21wb3NlIG1wbyByZXR1cm5lZCAlZCIsIHJjKTsKKworICAgIGlmKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkNvbXBvc2VNcG8gZmFpbGVkLCByZXQgPSAlZCIsIHJjKTsKKyAgICAgICAgZ011eGVyLT5zZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsIFVOS05PV05fRVJST1IsIDApOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9KcGVnTG9jayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZihtX2JEdW1wSW1hZ2VzKSB7CisgICAgICAgIGNoYXIgYnVmX21wb1tRQ0FNRVJBX01BWF9GSUxFUEFUSF9MRU5HVEhdOworICAgICAgICBtZW1zZXQoYnVmX21wbywgMCwgc2l6ZW9mKGJ1Zl9tcG8pKTsKKyAgICAgICAgc25wcmludGYoYnVmX21wbywgc2l6ZW9mKGJ1Zl9tcG8pLAorICAgICAgICAgICAgICAgIFFDQU1FUkFfRFVNUF9GUk1fTE9DQVRJT04gIkNvbXBvc2VkLk1QTyIpOworCisgICAgICAgIGludCBmaWxlX2ZkX21wbyA9IG9wZW4oYnVmX21wbywgT19SRFdSIHwgT19DUkVBVCwgMDc3Nyk7CisgICAgICAgIGlmIChmaWxlX2ZkX21wbyA+PSAwKSB7CisgICAgICAgICAgICBzc2l6ZV90IHdyaXR0ZW5fbGVuID0gd3JpdGUoZmlsZV9mZF9tcG8sCisgICAgICAgICAgICAgICAgICAgIG1fcFJlbENhbU1wb0pwZWctPmRhdGEsCisgICAgICAgICAgICAgICAgICAgIG1fcFJlbENhbU1wb0pwZWctPnNpemUpOworICAgICAgICAgICAgZmNobW9kKGZpbGVfZmRfbXBvLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKKyAgICAgICAgICAgIExPR0QoIndyaXR0ZW4gbnVtYmVyIG9mIGJ5dGVzIGZvciBNUE8gSW1hZ2UgJXpkXG4iLAorICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbl9sZW4pOworICAgICAgICAgICAgY2xvc2UoZmlsZV9mZF9tcG8pOworICAgICAgICB9CisgICAgfQorCisgICAgbURhdGFDYihtYWluX0pwZWctPm1zZ190eXBlLAorICAgICAgICAgICAgbV9wUmVsQ2FtTXBvSnBlZywKKyAgICAgICAgICAgIG1haW5fSnBlZy0+aW5kZXgsCisgICAgICAgICAgICBtYWluX0pwZWctPm1ldGFkYXRhLAorICAgICAgICAgICAgbV9wTXBvQ2FsbGJhY2tDb29raWUpOworCisgICAgaWYgKE5VTEwgIT0gbV9wUmVsQ2FtTXBvSnBlZykgeworICAgICAgICBtX3BSZWxDYW1NcG9KcGVnLT5yZWxlYXNlKG1fcFJlbENhbU1wb0pwZWcpOworICAgICAgICBtX3BSZWxDYW1NcG9KcGVnID0gTlVMTDsKKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9KcGVnTG9jayk7CisgICAgTE9HSCgiWCIpOworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtYXRjaEZyYW1lSWQKKyAqCisgKiBERVNDUklQVElPTjogZnVuY3Rpb24gdG8gbWF0Y2ggZnJhbWUgaWRzIHdpdGhpbiBxdWV1ZSBub2RlcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGF0YTogcG9pbnRlciB0byBxdWV1ZSBub2RlIHRvIGJlIG1hdGNoZWQgZm9yIGNvbmRpdGlvbgorICogICBAdXNlcl9kYXRhOiBjYWxsZXIgY2FuIGFkZCBtb3JlIGluZm8gaGVyZQorICogICBAbWF0Y2hfZGF0YSA6IHZhbHVlIHRvIGJlIG1hdGNoZWQgYWdhaW5zdAorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIHdoZXRoZXIgbWF0Y2ggd2FzIHN1Y2Nlc3NmdWwgb3Igbm90CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYU11eGVyOjptYXRjaEZyYW1lSWQodm9pZCAqZGF0YSwgX191bnVzZWQgdm9pZCAqdXNlcl9kYXRhLAorICAgICAgICB2b2lkICptYXRjaF9kYXRhKQoreworICAgIExPR0goIkUiKTsKKworICAgIGlmICghZGF0YSB8fCAhbWF0Y2hfZGF0YSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY2FtX2NvbXBvc2VfanBlZ19pbmZvX3QgKiBub2RlID0gKGNhbV9jb21wb3NlX2pwZWdfaW5mb190ICopIGRhdGE7CisgICAgdWludDMyX3QgZnJhbWVfaWR4ID0gKigodWludDMyX3QgKikgbWF0Y2hfZGF0YSk7CisgICAgTE9HSCgiWCIpOworICAgIHJldHVybiBub2RlLT5mcmFtZV9pZHggPT0gZnJhbWVfaWR4OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGZpbmRQcmV2aW91c0pwZWdzCisgKgorICogREVTQ1JJUFRJT046IEZpbmRzIEpwZWdzIGluIHRoZSBxdWV1ZSB3aXRoIGluZGV4IGxlc3MgdGhhbiBkZWxpdmVyZWQgb25lCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkYXRhOiBwb2ludGVyIHRvIHF1ZXVlIG5vZGUgdG8gYmUgbWF0Y2hlZCBmb3IgY29uZGl0aW9uCisgKiAgIEB1c2VyX2RhdGE6IGNhbGxlciBjYW4gYWRkIG1vcmUgaW5mbyBoZXJlCisgKiAgIEBtYXRjaF9kYXRhIDogdmFsdWUgdG8gYmUgbWF0Y2hlZCBhZ2FpbnN0CisgKgorICogUkVUVVJOICAgICA6IHRydWUgb3IgZmFsc2UgYmFzZWQgb24gd2hldGhlciBtYXRjaCB3YXMgc3VjY2Vzc2Z1bCBvciBub3QKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhTXV4ZXI6OmZpbmRQcmV2aW91c0pwZWdzKHZvaWQgKmRhdGEsIF9fdW51c2VkIHZvaWQgKnVzZXJfZGF0YSwKKyAgICAgICAgdm9pZCAqbWF0Y2hfZGF0YSkKK3sKKyAgICBMT0dIKCJFIik7CisKKyAgICBpZiAoIWRhdGEgfHwgIW1hdGNoX2RhdGEpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjYW1fY29tcG9zZV9qcGVnX2luZm9fdCAqIG5vZGUgPSAoY2FtX2NvbXBvc2VfanBlZ19pbmZvX3QgKikgZGF0YTsKKyAgICB1aW50MzJfdCBmcmFtZV9pZHggPSAqKCh1aW50MzJfdCAqKSBtYXRjaF9kYXRhKTsKKyAgICBMT0dIKCJYIik7CisgICAgcmV0dXJuIG5vZGUtPmZyYW1lX2lkeCA8IGZyYW1lX2lkeDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWxlYXNlSnBlZ0luZm8KKyAqCisgKiBERVNDUklQVElPTjogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSByZWxlYXNlIG9mIGluZGl2aWR1YWwgbm9kZXMKKyAqICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIEpQRUcgcXVldWVzLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGF0YSAgICAgIDogcHRyIHRvIHRoZSBkYXRhIHRvIGJlIHJlbGVhc2VkCisgKiAgIEB1c2VyX2RhdGEgOiBjYWxsZXIgY2FuIGFkZCBtb3JlIGluZm8gaGVyZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYU11eGVyOjpyZWxlYXNlSnBlZ0luZm8odm9pZCAqZGF0YSwgX191bnVzZWQgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIExPR0goIkUiKTsKKworICAgIGNhbV9jb21wb3NlX2pwZWdfaW5mb190ICpqcGVnSW5mbyA9IChjYW1fY29tcG9zZV9qcGVnX2luZm9fdCAqKWRhdGE7CisgICAgaWYoanBlZ0luZm8gJiYganBlZ0luZm8tPnJlbGVhc2VfY2IpIHsKKyAgICAgICAgaWYgKGpwZWdJbmZvLT5yZWxlYXNlX2RhdGEgIT0gTlVMTCkgeworICAgICAgICAgICAganBlZ0luZm8tPnJlbGVhc2VfY2IoanBlZ0luZm8tPnJlbGVhc2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAganBlZ0luZm8tPnJlbGVhc2VfY29va2llLAorICAgICAgICAgICAgICAgICAgICBOT19FUlJPUik7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HSCgiWCIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbXBvc2VNcG9Sb3V0aW5lCisgKgorICogREVTQ1JJUFRJT046IHNwZWNpYWxpemVkIHRocmVhZCBmb3IgTVBPIGNvbXBvc2l0aW9uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkYXRhICAgOiBwb2ludGVyIHRvIHRoZSB0aHJlYWQgb3duZXIKKyAqCisgKiBSRVRVUk4gICAgIDogdm9pZCogdG8gdGhyZWFkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQqIFFDYW1lcmFNdXhlcjo6Y29tcG9zZU1wb1JvdXRpbmUoX191bnVzZWQgdm9pZCAqZGF0YSkKK3sKKyAgICBMT0dIKCJFIik7CisgICAgaWYgKCFnTXV4ZXIpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgZ2V0dGluZyBtdXhlciAiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaW50IHJ1bm5pbmcgPSAxOworICAgIGludCByZXQ7CisgICAgdWludDhfdCBpc19hY3RpdmUgPSBGQUxTRTsKKyAgICBRQ2FtZXJhQ21kVGhyZWFkICpjbWRUaHJlYWQgPSAmZ011eGVyLT5tX0NvbXBvc2VNcG9UaDsKKyAgICBjbWRUaHJlYWQtPnNldE5hbWUoIkNBTV9Db21wb3NlTXBvIik7CisKKyAgICBkbyB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJldCA9IGNhbV9zZW1fd2FpdCgmY21kVGhyZWFkLT5jbWRfc2VtKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMCAmJiBlcnJubyAhPSBFSU5WQUwpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJjYW1fc2VtX3dhaXQgZXJyb3IgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHJldCAhPSAwKTsKKworICAgICAgICAvLyB3ZSBnb3Qgbm90aWZpZWQgYWJvdXQgbmV3IGNtZCBhdmFpbCBpbiBjbWQgcXVldWUKKyAgICAgICAgY2FtZXJhX2NtZF90eXBlX3QgY21kID0gY21kVGhyZWFkLT5nZXRDbWQoKTsKKyAgICAgICAgc3dpdGNoIChjbWQpIHsKKyAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1RZUEVfU1RBUlRfREFUQV9QUk9DOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExPR0goInN0YXJ0IENvbXBvc2VNcG8gcHJvY2Vzc2luZyIpOworICAgICAgICAgICAgICAgIGlzX2FjdGl2ZSA9IFRSVUU7CisKKyAgICAgICAgICAgICAgICAvLyBzaWduYWwgY21kIGlzIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgIGNhbV9zZW1fcG9zdCgmY21kVGhyZWFkLT5zeW5jX3NlbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1RZUEVfU1RPUF9EQVRBX1BST0M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTE9HSCgic3RvcCBDb21wb3NlTXBvIHByb2Nlc3NpbmciKTsKKyAgICAgICAgICAgICAgICBpc19hY3RpdmUgPSBGQUxTRTsKKworICAgICAgICAgICAgICAgIC8vIHNpZ25hbCBjbWQgaXMgY29tcGxldGVkCisgICAgICAgICAgICAgICAgY2FtX3NlbV9wb3N0KCZjbWRUaHJlYWQtPnN5bmNfc2VtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9DTURfVFlQRV9ET19ORVhUX0pPQjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNfYWN0aXZlID09IFRSVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HSCgiTXBvIENvbXBvc2l0aW9uIFJlcXVlc3RlZCIpOworICAgICAgICAgICAgICAgICAgICBjYW1fY29tcG9zZV9qcGVnX2luZm9fdCAqbWFpbl9qcGVnX25vZGUgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBjYW1fY29tcG9zZV9qcGVnX2luZm9fdCAqYXV4X2pwZWdfbm9kZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgZm91bmRNYXRjaCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIWdNdXhlci0+bV9NYWluSnBlZ1EuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWdNdXhlci0+bV9BdXhKcGVnUS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fanBlZ19ub2RlID0gKGNhbV9jb21wb3NlX2pwZWdfaW5mb190ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdNdXhlci0+bV9NYWluSnBlZ1EuZGVxdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1haW5fanBlZ19ub2RlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dEKCJtYWluX2pwZWdfbm9kZSBmb3VuZCBmcmFtZSBpZHggJWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHRyICVwIGJ1ZmZlcl9wdHIgJXAgYnVmZmVyX3NpemUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fanBlZ19ub2RlLT5mcmFtZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluX2pwZWdfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fanBlZ19ub2RlLT5idWZmZXItPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluX2pwZWdfbm9kZS0+YnVmZmVyLT5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaW5kIG1hdGNoaW5nIGF1eCBub2RlIGluIEF1eCBKcGVnIFF1ZXVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV4X2pwZWdfbm9kZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FtX2NvbXBvc2VfanBlZ19pbmZvX3QgKikgZ011eGVyLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQXV4SnBlZ1EuZGVxdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXhfanBlZ19ub2RlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRCgiYXV4X2pwZWdfbm9kZSBmb3VuZCBmcmFtZSBpZHggJWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB0ciAlcCBidWZmZXJfcHRyICVwIGJ1ZmZlcl9zaXplICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV4X2pwZWdfbm9kZS0+ZnJhbWVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eF9qcGVnX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV4X2pwZWdfbm9kZS0+YnVmZmVyLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eF9qcGVnX25vZGUtPmJ1ZmZlci0+c2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kTWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydCBNUE8gY29tcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ011eGVyLT5jb21wb3NlTXBvKG1haW5fanBlZ19ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eF9qcGVnX25vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYWluX2pwZWdfbm9kZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBtYWluX2pwZWdfbm9kZS0+cmVsZWFzZV9jYiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9qcGVnX25vZGUtPnJlbGVhc2VfY2IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9qcGVnX25vZGUtPnJlbGVhc2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluX2pwZWdfbm9kZS0+cmVsZWFzZV9jb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fRVJST1IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1haW5fanBlZ19ub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluX2pwZWdfbm9kZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0goIk1wbyBNYXRjaCBub3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXhfanBlZ19ub2RlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV4X2pwZWdfbm9kZS0+cmVsZWFzZV9jYikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXhfanBlZ19ub2RlLT5yZWxlYXNlX2NiKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1eF9qcGVnX25vZGUtPnJlbGVhc2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXhfanBlZ19ub2RlLT5yZWxlYXNlX2Nvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT19FUlJPUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoYXV4X2pwZWdfbm9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV4X2pwZWdfbm9kZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0goIk1wbyBNYXRjaCBub3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBjYXNlIENBTUVSQV9DTURfVFlQRV9FWElUOgorICAgICAgICAgICAgTE9HSCgiQ29tcG9zZU1wbyB0aHJlYWQgZXhpdCIpOworICAgICAgICAgICAgcnVubmluZyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAocnVubmluZyk7CisgICAgTE9HSCgiWCIpOworICAgIHJldHVybiBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGpwZWdfZGF0YV9jYWxsYmFjaworICoKKyAqIERFU0NSSVBUSU9OOiBKUEVHIGRhdGEgY2FsbGJhY2sgZm9yIHNuYXBzaG90CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtc2dfdHlwZSA6IGNhbGxiYWNrIG1zZyB0eXBlCisgKiAgIEBkYXRhIDogZGF0YSBwdHIgb2YgdGhlIGJ1ZmZlcgorICogICBAaW5kZXggOiBpbmRleCBvZiB0aGUgZnJhbWUKKyAqICAgQG1ldGFkYXRhIDogbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXIKKyAqICAgQHVzZXIgOiBjYWxsYmFjayBjb29raWUgcmV0dXJuZWQgYmFjayB0byB0aGUgdXNlcgorICogICBAZnJhbWVfaWR4IDogZnJhbWUgaW5kZXggZm9yIG1hdGNoaW5nIGZyYW1lcworICogICBAcmVsZWFzZV9jYiA6IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciByZWxlYXNpbmcgdGhlIGRhdGEgbWVtb3J5CisgKiAgIEByZWxlYXNlX2Nvb2tpZSA6IGNvb2tpZSBmb3IgdGhlIHJlbGVhc2UgY2FsbGJhY2sgZnVuY3Rpb24KKyAqICAgQHJlbGVhc2VfZGF0YSA6cG9pbnRlciBpbmRpY2F0aW5nIHdoYXQgbmVlZHMgdG8gYmUgcmVsZWFzZWQKKyAqCisgKiBSRVRVUk4gOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYU11eGVyOjpqcGVnX2RhdGFfY2FsbGJhY2soaW50MzJfdCBtc2dfdHlwZSwKKyAgICAgICAgICAgY29uc3QgY2FtZXJhX21lbW9yeV90ICpkYXRhLCB1bnNpZ25lZCBpbnQgaW5kZXgsCisgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSwgdm9pZCAqdXNlciwKKyAgICAgICAgICAgdWludDMyX3QgZnJhbWVfaWR4LCBjYW1lcmFfcmVsZWFzZV9jYWxsYmFjayByZWxlYXNlX2NiLAorICAgICAgICAgICB2b2lkICpyZWxlYXNlX2Nvb2tpZSwgdm9pZCAqcmVsZWFzZV9kYXRhKQoreworICAgIExPR0goIkUiKTsKKyAgICBDSEVDS19NVVhFUigpOworCisgICAgaWYoZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIExPR0goImpwZWcgcmVjZWl2ZWQ6IGRhdGEgJXAgc2l6ZSAlZCBkYXRhIHB0ciAlcCBmcmFtZUlkeCAlZCIsCisgICAgICAgICAgICAgICAgIGRhdGEsIGRhdGEtPnNpemUsIGRhdGEtPmRhdGEsIGZyYW1lX2lkeCk7CisgICAgICAgIGludCByYyA9IGdNdXhlci0+c3RvcmVKcGVnKCgocWNhbWVyYV9waHlzaWNhbF9kZXNjcmlwdG9yX3QqKSh1c2VyKSktPnR5cGUsCisgICAgICAgICAgICAgICAgbXNnX3R5cGUsIGRhdGEsIGluZGV4LCBtZXRhZGF0YSwgdXNlciwgZnJhbWVfaWR4LCByZWxlYXNlX2NiLAorICAgICAgICAgICAgICAgIHJlbGVhc2VfY29va2llLCByZWxlYXNlX2RhdGEpOworICAgICAgICBpZihyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZ011eGVyLT5zZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsIFVOS05PV05fRVJST1IsIDApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ011eGVyLT5zZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsIFVOS05PV05fRVJST1IsIDApOworICAgIH0KKyAgICBMT0dIKCJYIik7CisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0b3JlSnBlZworICoKKyAqIERFU0NSSVBUSU9OOiBTdG9yZXMganBlZ3MgZnJvbSBtdWx0aXBsZSByZWxhdGVkIGNhbSBpbnN0YW5jZXMgaW50byBhIGNvbW1vbiBRdWV1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtX3R5cGUgOiBpbmRpY2F0ZXMgd2hldGhlciBtYWluIG9yIGF1eCBjYW1lcmEgc2VudCB0aGUgSnBlZyBjYWxsYmFjaworICogICBAbXNnX3R5cGUgOiBjYWxsYmFjayBtc2cgdHlwZQorICogICBAZGF0YSA6IGRhdGEgcHRyIG9mIHRoZSBidWZmZXIKKyAqICAgQGluZGV4IDogaW5kZXggb2YgdGhlIGZyYW1lCisgKiAgIEBtZXRhZGF0YSA6IG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmZmVyCisgKiAgIEB1c2VyIDogY2FsbGJhY2sgY29va2llIHJldHVybmVkIGJhY2sgdG8gdGhlIHVzZXIKKyAqICAgQGZyYW1lX2lkeCA6IGZyYW1lIGluZGV4IGZvciBtYXRjaGluZyBmcmFtZXMKKyAqICAgQHJlbGVhc2VfY2IgOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgcmVsZWFzaW5nIHRoZSBkYXRhIG1lbW9yeQorICogICBAcmVsZWFzZV9jb29raWUgOiBjb29raWUgZm9yIHRoZSByZWxlYXNlIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiAgIEByZWxlYXNlX2RhdGEgOnBvaW50ZXIgaW5kaWNhdGluZyB3aGF0IG5lZWRzIHRvIGJlIHJlbGVhc2VkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhTXV4ZXI6OnN0b3JlSnBlZyhjYW1fc3luY190eXBlX3QgY2FtX3R5cGUsCisgICAgICAgIGludDMyX3QgbXNnX3R5cGUsIGNvbnN0IGNhbWVyYV9tZW1vcnlfdCAqZGF0YSwgdW5zaWduZWQgaW50IGluZGV4LAorICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEsIHZvaWQgKnVzZXIsdWludDMyX3QgZnJhbWVfaWR4LAorICAgICAgICBjYW1lcmFfcmVsZWFzZV9jYWxsYmFjayByZWxlYXNlX2NiLCB2b2lkICpyZWxlYXNlX2Nvb2tpZSwKKyAgICAgICAgdm9pZCAqcmVsZWFzZV9kYXRhKQoreworICAgIExPR0goIkUganBlZyByZWNlaXZlZDogZGF0YSAlcCBzaXplICVkIGRhdGEgcHRyICVwIGZyYW1lSWR4ICVkIiwKKyAgICAgICAgICAgICBkYXRhLCBkYXRhLT5zaXplLCBkYXRhLT5kYXRhLCBmcmFtZV9pZHgpOworCisgICAgQ0hFQ0tfTVVYRVJfRVJST1IoKTsKKworICAgIGlmICghbV9iTXBvRW5hYmxlZCkgeworICAgICAgICBpZiAoY2FtX3R5cGUgPT0gQ0FNX1RZUEVfTUFJTikgeworICAgICAgICAgICAgLy8gc2VuZCBkYXRhIGNhbGxiYWNrIG9ubHkgaW5jYXNlIG9mIG1haW4gY2FtZXJhCisgICAgICAgICAgICAvLyBhdXggaW1hZ2UgaXMgaWdub3JlZCBhbmQgcmVsZWFzZWQgYmFjaworICAgICAgICAgICAgbURhdGFDYihtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBtX3BNcG9DYWxsYmFja0Nvb2tpZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlbGVhc2VfY2IpIHsKKyAgICAgICAgICAgIHJlbGVhc2VfY2IocmVsZWFzZV9kYXRhLCByZWxlYXNlX2Nvb2tpZSwgTk9fRVJST1IpOworICAgICAgICB9CisgICAgICAgIExPR0goIlgiKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGNhbV9jb21wb3NlX2pwZWdfaW5mb190KiBwSnBlZ0ZyYW1lID0KKyAgICAgICAgICAgIChjYW1fY29tcG9zZV9qcGVnX2luZm9fdCopbWFsbG9jKHNpemVvZihjYW1fY29tcG9zZV9qcGVnX2luZm9fdCkpOworICAgIGlmICghcEpwZWdGcmFtZSkgeworICAgICAgICBMT0dFKCJBbGxvY2F0aW9uIGZhaWxlZCBmb3IgTVBPIG5vZGVzIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChwSnBlZ0ZyYW1lLCAwLCBzaXplb2YoKnBKcGVnRnJhbWUpKTsKKworICAgIHBKcGVnRnJhbWUtPm1zZ190eXBlID0gbXNnX3R5cGU7CisgICAgcEpwZWdGcmFtZS0+YnVmZmVyID0gY29uc3RfY2FzdDxjYW1lcmFfbWVtb3J5X3QqPihkYXRhKTsKKyAgICBwSnBlZ0ZyYW1lLT5pbmRleCA9IGluZGV4OworICAgIHBKcGVnRnJhbWUtPm1ldGFkYXRhID0gbWV0YWRhdGE7CisgICAgcEpwZWdGcmFtZS0+dXNlciA9IHVzZXI7CisgICAgcEpwZWdGcmFtZS0+dmFsaWQgPSB0cnVlOworICAgIHBKcGVnRnJhbWUtPmZyYW1lX2lkeCA9IGZyYW1lX2lkeDsKKyAgICBwSnBlZ0ZyYW1lLT5yZWxlYXNlX2NiID0gcmVsZWFzZV9jYjsKKyAgICBwSnBlZ0ZyYW1lLT5yZWxlYXNlX2Nvb2tpZSA9IHJlbGVhc2VfY29va2llOworICAgIHBKcGVnRnJhbWUtPnJlbGVhc2VfZGF0YSA9IHJlbGVhc2VfZGF0YTsKKyAgICBpZihjYW1fdHlwZSA9PSBDQU1fVFlQRV9NQUlOKSB7CisgICAgICAgIGlmIChtX01haW5KcGVnUS5lbnF1ZXVlKCh2b2lkICopcEpwZWdGcmFtZSkpIHsKKyAgICAgICAgICAgIExPR0QoIk1haW4gRnJhbWVJZHggJWQiLCBwSnBlZ0ZyYW1lLT5mcmFtZV9pZHgpOworICAgICAgICAgICAgaWYgKG1fTWFpbkpwZWdRLmdldEN1cnJlbnRTaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgTE9HRCgiVHJpZ2dlciBDb21wb3NlIik7CisgICAgICAgICAgICAgICAgbV9Db21wb3NlTXBvVGguc2VuZENtZChDQU1FUkFfQ01EX1RZUEVfRE9fTkVYVF9KT0IsIEZBTFNFLCBGQUxTRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJFbnF1ZXVlIEZhaWxlZCBmb3IgTWFpbiBKcGVnIFEiKTsKKyAgICAgICAgICAgIGlmICggcEpwZWdGcmFtZS0+cmVsZWFzZV9jYiApIHsKKyAgICAgICAgICAgICAgICAvLyByZWxlYXNlIG90aGVyIGJ1ZmZlciBhbHNvIGhlcmUKKyAgICAgICAgICAgICAgICBwSnBlZ0ZyYW1lLT5yZWxlYXNlX2NiKAorICAgICAgICAgICAgICAgICAgICAgICAgcEpwZWdGcmFtZS0+cmVsZWFzZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgcEpwZWdGcmFtZS0+cmVsZWFzZV9jb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICBOT19FUlJPUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHBKcGVnRnJhbWUpOworICAgICAgICAgICAgcEpwZWdGcmFtZSA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9BdXhKcGVnUS5lbnF1ZXVlKCh2b2lkICopcEpwZWdGcmFtZSkpIHsKKyAgICAgICAgICAgIExPR0QoIkF1eCBGcmFtZUlkeCAlZCIsIHBKcGVnRnJhbWUtPmZyYW1lX2lkeCk7CisgICAgICAgICAgICBpZiAobV9BdXhKcGVnUS5nZXRDdXJyZW50U2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIExPR0QoIlRyaWdnZXIgQ29tcG9zZSIpOworICAgICAgICAgICAgICAgIG1fQ29tcG9zZU1wb1RoLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX0RPX05FWFRfSk9CLCBGQUxTRSwgRkFMU0UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiRW5xdWV1ZSBGYWlsZWQgZm9yIEF1eCBKcGVnIFEiKTsKKyAgICAgICAgICAgIGlmICggcEpwZWdGcmFtZS0+cmVsZWFzZV9jYiApIHsKKyAgICAgICAgICAgICAgICAvLyByZWxlYXNlIG90aGVyIGJ1ZmZlciBhbHNvIGhlcmUKKyAgICAgICAgICAgICAgICBwSnBlZ0ZyYW1lLT5yZWxlYXNlX2NiKAorICAgICAgICAgICAgICAgICAgICAgICAgcEpwZWdGcmFtZS0+cmVsZWFzZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgcEpwZWdGcmFtZS0+cmVsZWFzZV9jb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICBOT19FUlJPUik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHBKcGVnRnJhbWUpOworICAgICAgICAgICAgcEpwZWdGcmFtZSA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfQorICAgIExPR0goIlgiKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCisvLyBNdXhlciBPcHMKK2NhbWVyYV9kZXZpY2Vfb3BzX3QgUUNhbWVyYU11eGVyOjptQ2FtZXJhTXV4ZXJPcHMgPSB7CisgICAgLnNldF9wcmV2aWV3X3dpbmRvdyA9ICAgICAgICBRQ2FtZXJhTXV4ZXI6OnNldF9wcmV2aWV3X3dpbmRvdywKKyAgICAuc2V0X2NhbGxiYWNrcyA9ICAgICAgICAgICAgIFFDYW1lcmFNdXhlcjo6c2V0X2NhbGxCYWNrcywKKyAgICAuZW5hYmxlX21zZ190eXBlID0gICAgICAgICAgIFFDYW1lcmFNdXhlcjo6ZW5hYmxlX21zZ190eXBlLAorICAgIC5kaXNhYmxlX21zZ190eXBlID0gICAgICAgICAgUUNhbWVyYU11eGVyOjpkaXNhYmxlX21zZ190eXBlLAorICAgIC5tc2dfdHlwZV9lbmFibGVkID0gICAgICAgICAgUUNhbWVyYU11eGVyOjptc2dfdHlwZV9lbmFibGVkLAorCisgICAgLnN0YXJ0X3ByZXZpZXcgPSAgICAgICAgICAgICBRQ2FtZXJhTXV4ZXI6OnN0YXJ0X3ByZXZpZXcsCisgICAgLnN0b3BfcHJldmlldyA9ICAgICAgICAgICAgICBRQ2FtZXJhTXV4ZXI6OnN0b3BfcHJldmlldywKKyAgICAucHJldmlld19lbmFibGVkID0gICAgICAgICAgIFFDYW1lcmFNdXhlcjo6cHJldmlld19lbmFibGVkLAorICAgIC5zdG9yZV9tZXRhX2RhdGFfaW5fYnVmZmVycz0gUUNhbWVyYU11eGVyOjpzdG9yZV9tZXRhX2RhdGFfaW5fYnVmZmVycywKKworICAgIC5zdGFydF9yZWNvcmRpbmcgPSAgICAgICAgICAgUUNhbWVyYU11eGVyOjpzdGFydF9yZWNvcmRpbmcsCisgICAgLnN0b3BfcmVjb3JkaW5nID0gICAgICAgICAgICBRQ2FtZXJhTXV4ZXI6OnN0b3BfcmVjb3JkaW5nLAorICAgIC5yZWNvcmRpbmdfZW5hYmxlZCA9ICAgICAgICAgUUNhbWVyYU11eGVyOjpyZWNvcmRpbmdfZW5hYmxlZCwKKyAgICAucmVsZWFzZV9yZWNvcmRpbmdfZnJhbWUgPSAgIFFDYW1lcmFNdXhlcjo6cmVsZWFzZV9yZWNvcmRpbmdfZnJhbWUsCisKKyAgICAuYXV0b19mb2N1cyA9ICAgICAgICAgICAgICAgIFFDYW1lcmFNdXhlcjo6YXV0b19mb2N1cywKKyAgICAuY2FuY2VsX2F1dG9fZm9jdXMgPSAgICAgICAgIFFDYW1lcmFNdXhlcjo6Y2FuY2VsX2F1dG9fZm9jdXMsCisKKyAgICAudGFrZV9waWN0dXJlID0gICAgICAgICAgICAgIFFDYW1lcmFNdXhlcjo6dGFrZV9waWN0dXJlLAorICAgIC5jYW5jZWxfcGljdHVyZSA9ICAgICAgICAgICAgUUNhbWVyYU11eGVyOjpjYW5jZWxfcGljdHVyZSwKKworICAgIC5zZXRfcGFyYW1ldGVycyA9ICAgICAgICAgICAgUUNhbWVyYU11eGVyOjpzZXRfcGFyYW1ldGVycywKKyAgICAuZ2V0X3BhcmFtZXRlcnMgPSAgICAgICAgICAgIFFDYW1lcmFNdXhlcjo6Z2V0X3BhcmFtZXRlcnMsCisgICAgLnB1dF9wYXJhbWV0ZXJzID0gICAgICAgICAgICBRQ2FtZXJhTXV4ZXI6OnB1dF9wYXJhbWV0ZXJzLAorICAgIC5zZW5kX2NvbW1hbmQgPSAgICAgICAgICAgICAgUUNhbWVyYU11eGVyOjpzZW5kX2NvbW1hbmQsCisKKyAgICAucmVsZWFzZSA9ICAgICAgICAgICAgICAgICAgIFFDYW1lcmFNdXhlcjo6cmVsZWFzZSwKKyAgICAuZHVtcCA9ICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmFNdXhlcjo6ZHVtcCwKK307CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYU11eGVyLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFNdXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOWQ0YzkKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFNdXhlci5oCkBAIC0wLDAgKzEsMjg2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKyNpZm5kZWYgX19RQ0FNRVJBTVVYRVJfSF9fCisjZGVmaW5lIF9fUUNBTUVSQU1VWEVSX0hfXworCisjaW5jbHVkZSAiY2FtZXJhLmgiCisjaW5jbHVkZSAiUUNhbWVyYTJIV0kuaCIKKyNpbmNsdWRlICJRQ2FtZXJhM0hXSS5oIgorCituYW1lc3BhY2UgcWNhbWVyYSB7CisKKy8qIFN0cnVjdEAgcWNhbWVyYV9waHlzaWNhbF9kZXNjcmlwdG9yX3QKKyAqCisgKiAgRGVzY3JpcHRpb25AIFRoaXMgc3RydWN0dXJlIHNwZWNpZmllcyB2YXJpb3VzIGF0dHJpYnV0ZXMKKyAqICAgICAgcGh5c2ljYWwgY2FtZXJhcyBlbnVtZXJhdGVkIG9uIHRoZSBkZXZpY2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8vIFVzZXJzcGFjZSBQaHlzaWNhbCBDYW1lcmEgSUQKKyAgICB1aW50MzJfdCBpZDsKKyAgICAvLyBTZXJ2ZXIgQ2FtZXJhIElECisgICAgdWludDMyX3QgY2FtZXJhX3NlcnZlcl9pZDsKKyAgICAvLyBEZXZpY2UgdmVyc2lvbgorICAgIHVpbnQzMl90IGRldmljZV92ZXJzaW9uOworICAgIC8vIFNwZWNpZmllcyB0eXBlIG9mIGNhbWVyYQorICAgIGNhbV9zeW5jX3R5cGVfdCB0eXBlOworICAgIC8vIFNwZWNpZmllcyBtb2RlIG9mIENhbWVyYQorICAgIGNhbV9zeW5jX21vZGVfdCBtb2RlOworICAgIC8vIENhbWVyYSBJbmZvCisgICAgY2FtZXJhX2luZm8gY2FtX2luZm87CisgICAgLy8gUmVmZXJlbmNlIHRvIEhXSQorICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmh3aTsKKyAgICAvLyBSZWZlcmVuY2UgdG8gY2FtZXJhIGRldmljZSBzdHJ1Y3R1cmUKKyAgICBjYW1lcmFfZGV2aWNlX3QqIGRldjsKK30gcWNhbWVyYV9waHlzaWNhbF9kZXNjcmlwdG9yX3Q7CisKKy8qIFN0cnVjdEAgcWNhbWVyYV9sb2dpY2FsX2Rlc2NyaXB0b3JfdAorICoKKyAqICBEZXNjcmlwdGlvbkAgVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGxvZ2ljYWwgY2FtZXJhcworICogICAgICBhbmQgY29ycmVzcG9uZGluZyBkYXRhIG9mIHRoZSBwaHlzaWNhbCBjYW1lcmEgdGhhdCBhcmUgcGFydCBvZgorICogICAgICB0aGlzIGxvZ2ljYWwgY2FtZXJhCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvLyBDYW1lcmEgRGV2aWNlIHRvIGJlIHNoYXJlZCB0byBGcmFtZXdvcmtzCisgICAgY2FtZXJhX2RldmljZV90IGRldjsKKyAgICAvLyBEZXZpY2UgdmVyc2lvbgorICAgIHVpbnQzMl90IGRldmljZV92ZXJzaW9uOworICAgIC8vIExvZ2ljYWwgQ2FtZXJhIElECisgICAgdWludDMyX3QgaWQ7CisgICAgLy8gTG9naWNhbCBDYW1lcmEgRmFjaW5nCisgICAgaW50MzJfdCBmYWNpbmc7CisgICAgLy8gTnVtYmVyIG9mIFBoeXNpY2FsIGNhbWVyYSBwcmVzZW50IGluIHRoaXMgbG9naWNhbCBjYW1lcmEKKyAgICB1aW50MzJfdCBudW1DYW1lcmFzOworICAgIC8vIFRvIHNpZ25pZnkgaWYgdGhlIExJTksvVU5MSU5LIGVzdGFibGlzaGVkIGJldHdlZW4gcGh5c2ljYWwgY2FtZXJhcworICAgIGJvb2wgYlN5bmNPbjsKKyAgICAvLyBpbmRleCBvZiB0aGUgcHJpbWFyeSBwaHlzaWNhbCBjYW1lcmEgc2Vzc2lvbiBpbiB0aGUgYnVuZGxlCisgICAgdWludDhfdCBuUHJpbWFyeVBoeUNhbUluZGV4OworICAgIC8vIFNpZ25pZmllcyBQaHlzaWNhbCBDYW1lcmEgSUQgb2YgZWFjaCBjYW1lcmEKKyAgICB1aW50MzJfdCBwSWRbTUFYX05VTV9DQU1FUkFfUEVSX0JVTkRMRV07CisgICAgLy8gU2lnbmlmaWVzIHNlcnZlciBjYW1lcmEgSUQgb2YgZWFjaCBjYW1lcmEKKyAgICB1aW50MzJfdCBzSWRbTUFYX05VTV9DQU1FUkFfUEVSX0JVTkRMRV07CisgICAgLy8gU2lnbmlmaWVzIHR5cGUgb2YgZWFjaCBjYW1lcmEKKyAgICBjYW1fc3luY190eXBlX3QgdHlwZVtNQVhfTlVNX0NBTUVSQV9QRVJfQlVORExFXTsKKyAgICAvLyBTaWduaWZpZXMgbW9kZSBvZiBlYWNoIGNhbWVyYQorICAgIGNhbV9zeW5jX21vZGVfdCBtb2RlW01BWF9OVU1fQ0FNRVJBX1BFUl9CVU5ETEVdOworICAgIC8vIFNpZ25pZmllcyBtb2RlIG9mIGVhY2ggM2EgdXNlZCBieSB0aGUgY2FtZXJhCisgICAgY2FtXzNhX3N5bmNfbW9kZV90IHN5bmNfM2FbTUFYX05VTV9DQU1FUkFfUEVSX0JVTkRMRV07Cit9IHFjYW1lcmFfbG9naWNhbF9kZXNjcmlwdG9yX3Q7CisKKy8qIFN0cnVjdEAgY2FtX2NvbXBvc2VfanBlZ19pbmZvX3QKKyAqCisgKiAgRGVzY3JpcHRpb25AIFRoaXMgc3RydWN0dXJlIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBpbmRpdmlkdWFsIEpwZWcgaW1hZ2VzCisgKiAgcmVjZWl2ZWQgZnJvbSBtdWx0aXBsZSByZWxhdGVkIHBoeXNpY2FsIGNhbWVyYSBpbnN0YW5jZXMuIFRoZXNlIGltYWdlcyB3b3VsZCB0aGVuIGJlCisgKiAgY29tcG9zZWQgdG9nZXRoZXIgaW50byBhIHNpbmdsZSBNUE8gaW1hZ2UgbGF0ZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvLyBtc2dfdHlwZSBpcyBzYW1lIGFzIGRhdGEgY2FsbGJhY2sgbXNnX3R5cGUKKyAgICBpbnQzMl90IG1zZ190eXBlOworICAgIC8vIHB0ciB0byBhY3R1YWwgZGF0YSBidWZmZXIKKyAgICBjYW1lcmFfbWVtb3J5X3QgKmJ1ZmZlcjsKKyAgICAvLyBpbmRleCBvZiB0aGUgYnVmZmVyIHNhbWUgYXMgcmVjZWl2ZWQgaW4gZGF0YSBjYWxsYmFjaworICAgIHVuc2lnbmVkIGludCBpbmRleDsKKyAgICAvLyBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlcgorICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YTsKKyAgICAvLyB1c2VyIGNvbnRhaW5zIHRoZSBjYWxsZXIncyBpZGVudGl0eQorICAgIC8vIHRoaXMgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHBoeXNpY2FsIGNhbSBzdHJ1Y3R1cmUKKyAgICAvLyBvZiB0aGUgSFdJIGluc3RhbmNlIHdoaWNoIGhhZCByZXF1ZXN0ZWQgZm9yIHRoaXMgZGF0YSBidWZmZXIKKyAgICB2b2lkICp1c2VyOworICAgIC8vIHRoaXMgaW5kaWNhdGVzIHZhbGlkaXR5IG9mIHRoZSBidWZmZXIKKyAgICAvLyB0aGlzIGZsYWcgaXMgdXNlZCBieSBtdWx0aXBsZSB0aHJlYWRzIHRvIGNoZWNrIHZhbGlkaXR5IG9mCisgICAgLy8gSnBlZ3MgcmVjZWl2ZWQgYnkgb3RoZXIgdGhyZWFkcworICAgIGJvb2wgdmFsaWQ7CisgICAgLy8gZnJhbWUgaWQgb2YgdGhlIEpwZWcuIHRoaXMgaXMgbmVlZGVkIGZvciBmcmFtZSBzeW5jIGJldHdlZW4gYXV4CisgICAgLy8gYW5kIG1haW4gY2FtZXJhIHNlc3Npb25zCisgICAgdWludDMyX3QgZnJhbWVfaWR4OworICAgIC8vIHJlbGVhc2UgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVsZWFzZSB0aGlzIEpwZWcgbWVtb3J5IGxhdGVyIGFmdGVyCisgICAgLy8gY29tcG9zaXRpb24gaXMgY29tcGxldGVkCisgICAgY2FtZXJhX3JlbGVhc2VfY2FsbGJhY2sgcmVsZWFzZV9jYjsKKyAgICAvLyBjb29raWUgZm9yIHRoZSByZWxlYXNlIGNhbGxiYWNrIGZ1bmN0aW9uCisgICAgdm9pZCAqcmVsZWFzZV9jb29raWU7CisgICAgLy8gcmVsZWFzZSBkYXRhIGluZm8gZm9yIHdoYXQgbmVlZHMgdG8gYmUgcmVsZWFzZWQKKyAgICB2b2lkICpyZWxlYXNlX2RhdGE7Cit9Y2FtX2NvbXBvc2VfanBlZ19pbmZvX3Q7CisKKy8qIENsYXNzQCBRQ2FtZXJhTXV4ZXIKKyAqCisgKiBEZXNjcmlwdGlvbkAgTXV4ZXIgaW50ZXJmYWNlCisgKiAgICBhKSBNYW5hZ2VzIHRoZSBncm91cGluZyBvZiB0aGUgcGh5c2ljYWwgY2FtZXJhcyBpbnRvIGEgbG9naWNhbCBjYW1lcmEKKyAqICAgIGIpIE11eGVzIHRoZSBvcGVyYXRpb25hbCBjYWxscyBmcm9tIEZyYW1ld29ya3MgdG8gSFdJCisgKiAgICBjKSBDb21wb3NlcyBNUE8gZnJvbSBKUEVHCisgKi8KK2NsYXNzIFFDYW1lcmFNdXhlciB7CisKK3B1YmxpYzoKKyAgICAvKiBQdWJsaWMgTWV0aG9kcyAgICovCisgICAgUUNhbWVyYU11eGVyKHVpbnQzMl90IG51bV9vZl9jYW1lcmFzKTsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhTXV4ZXIoKTsKKyAgICBzdGF0aWMgdm9pZCBnZXRDYW1lcmFNdXhlcihRQ2FtZXJhTXV4ZXIqKiBwQ2FtTXV4ZXIsCisgICAgICAgICAgICB1aW50MzJfdCBudW1fb2ZfY2FtZXJhcyk7CisgICAgc3RhdGljIGludCBnZXRfbnVtYmVyX29mX2NhbWVyYXMoKTsKKyAgICBzdGF0aWMgaW50IGdldF9jYW1lcmFfaW5mbyhpbnQgY2FtZXJhX2lkLCBzdHJ1Y3QgY2FtZXJhX2luZm8gKmluZm8pOworICAgIHN0YXRpYyBpbnQgc2V0X2NhbGxiYWNrcyhjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190ICpjYWxsYmFja3MpOworICAgIHN0YXRpYyBpbnQgb3Blbl9sZWdhY3koY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBpZCwgdWludDMyX3QgaGFsVmVyc2lvbiwgc3RydWN0IGh3X2RldmljZV90KiogZGV2aWNlKTsKKworICAgIHN0YXRpYyBpbnQgY2FtZXJhX2RldmljZV9vcGVuKGNvbnN0IHN0cnVjdCBod19tb2R1bGVfdCogbW9kdWxlLAorICAgICAgICAgICAgY29uc3QgY2hhciogaWQsCisgICAgICAgICAgICBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBkZXZpY2UpOworICAgIHN0YXRpYyBpbnQgY2xvc2VfY2FtZXJhX2RldmljZSggaHdfZGV2aWNlX3QgKik7CisKKyAgICAvKiBPcGVyYXRpb24gbWV0aG9kcyBkaXJlY3RseSBhY2Nlc3NlZCBieSBDYW1lcmEgU2VydmljZSAqLworICAgIHN0YXRpYyBjYW1lcmFfZGV2aWNlX29wc190IG1DYW1lcmFNdXhlck9wczsKKworICAgIC8qIFN0YXJ0IG9mIG9wZXJhdGlvbmFsIG1ldGhvZHMgKi8KKyAgICBzdGF0aWMgaW50IHNldF9wcmV2aWV3X3dpbmRvdyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLAorICAgICAgICAgICAgc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqd2luZG93KTsKKyAgICBzdGF0aWMgdm9pZCBzZXRfY2FsbEJhY2tzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICosCisgICAgICAgICAgICBjYW1lcmFfbm90aWZ5X2NhbGxiYWNrIG5vdGlmeV9jYiwKKyAgICAgICAgICAgIGNhbWVyYV9kYXRhX2NhbGxiYWNrIGRhdGFfY2IsCisgICAgICAgICAgICBjYW1lcmFfZGF0YV90aW1lc3RhbXBfY2FsbGJhY2sgZGF0YV9jYl90aW1lc3RhbXAsCisgICAgICAgICAgICBjYW1lcmFfcmVxdWVzdF9tZW1vcnkgZ2V0X21lbW9yeSwKKyAgICAgICAgICAgIHZvaWQgKnVzZXIpOworICAgIHN0YXRpYyB2b2lkIGVuYWJsZV9tc2dfdHlwZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBpbnQzMl90IG1zZ190eXBlKTsKKyAgICBzdGF0aWMgdm9pZCBkaXNhYmxlX21zZ190eXBlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICosIGludDMyX3QgbXNnX3R5cGUpOworICAgIHN0YXRpYyBpbnQgbXNnX3R5cGVfZW5hYmxlZChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBpbnQzMl90IG1zZ190eXBlKTsKKyAgICBzdGF0aWMgaW50IHN0YXJ0X3ByZXZpZXcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisgICAgc3RhdGljIHZvaWQgc3RvcF9wcmV2aWV3KHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworICAgIHN0YXRpYyBpbnQgcHJldmlld19lbmFibGVkKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworICAgIHN0YXRpYyBpbnQgc3RvcmVfbWV0YV9kYXRhX2luX2J1ZmZlcnMoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiwKKyAgICAgICAgICAgIGludCBlbmFibGUpOworICAgIHN0YXRpYyBpbnQgc3RhcnRfcmVjb3JkaW5nKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworICAgIHN0YXRpYyB2b2lkIHN0b3BfcmVjb3JkaW5nKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworICAgIHN0YXRpYyBpbnQgcmVjb3JkaW5nX2VuYWJsZWQoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZV9yZWNvcmRpbmdfZnJhbWUoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiwKKyAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqb3BhcXVlKTsKKyAgICBzdGF0aWMgaW50IGF1dG9fZm9jdXMoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisgICAgc3RhdGljIGludCBjYW5jZWxfYXV0b19mb2N1cyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKyAgICBzdGF0aWMgaW50IHRha2VfcGljdHVyZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKyAgICBzdGF0aWMgaW50IGNhbmNlbF9waWN0dXJlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworICAgIHN0YXRpYyBpbnQgc2V0X3BhcmFtZXRlcnMoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiwgY29uc3QgY2hhciAqcGFybXMpOworICAgIHN0YXRpYyBjaGFyKiBnZXRfcGFyYW1ldGVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKyAgICBzdGF0aWMgdm9pZCBwdXRfcGFyYW1ldGVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBjaGFyICopOworICAgIHN0YXRpYyBpbnQgc2VuZF9jb21tYW5kKHN0cnVjdCBjYW1lcmFfZGV2aWNlICosCisgICAgICAgICAgaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworICAgIHN0YXRpYyBpbnQgZHVtcChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBpbnQgZmQpOworICAgIC8qIEVuZCBvZiBvcGVyYXRpb25hbCBtZXRob2RzICovCisKKyAgICBzdGF0aWMgdm9pZCBqcGVnX2RhdGFfY2FsbGJhY2soaW50MzJfdCBtc2dfdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZW1vcnlfdCAqZGF0YSwgdW5zaWduZWQgaW50IGluZGV4LAorICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhLCB2b2lkICp1c2VyLAorICAgICAgICAgICAgdWludDMyX3QgZnJhbWVfaWR4LCBjYW1lcmFfcmVsZWFzZV9jYWxsYmFjayByZWxlYXNlX2NiLAorICAgICAgICAgICAgdm9pZCAqcmVsZWFzZV9jb29raWUsIHZvaWQgKnJlbGVhc2VfZGF0YSk7CisgICAgLy8gYWRkIG5vdGlmeSBlcnJvciBtc2dzIHRvIHRoZSBub3RpZmVyIHF1ZXVlIG9mIHRoZSBwcmltYXJ5IHJlbGF0ZWQgY2FtIGluc3RhbmNlCisgICAgc3RhdGljIGludDMyX3Qgc2VuZEV2dE5vdGlmeShpbnQzMl90IG1zZ190eXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0Mik7CisgICAgLy8gZnVuY3Rpb24gdG8gY29tcG9zZSBhbGwgSlBFRyBpbWFnZXMgZnJvbSBhbGwgcGh5c2ljYWwgcmVsYXRlZCBjYW1lcmEgaW5zdGFuY2VzCisgICAgdm9pZCBjb21wb3NlTXBvKGNhbV9jb21wb3NlX2pwZWdfaW5mb190KiBtYWluX0pwZWcsCisgICAgICAgIGNhbV9jb21wb3NlX2pwZWdfaW5mb190KiBhdXhfSnBlZyk7CisgICAgc3RhdGljIHZvaWQqIGNvbXBvc2VNcG9Sb3V0aW5lKHZvaWQqIGRhdGEpOworICAgIHN0YXRpYyBib29sIG1hdGNoRnJhbWVJZCh2b2lkICpkYXRhLCB2b2lkICp1c2VyX2RhdGEsIHZvaWQgKm1hdGNoX2RhdGEpOworICAgIHN0YXRpYyBib29sIGZpbmRQcmV2aW91c0pwZWdzKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSwgdm9pZCAqbWF0Y2hfZGF0YSk7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZUpwZWdJbmZvKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSk7CisKK3B1YmxpYzoKKyAgICAvKiBQdWJsaWMgTWVtYmVycyAgVmFyaWFibGVzICAgKi8KKyAgICAvLyBKcGVnIGFuZCBNcG8gb3BzIG5lZWQgdG8gYmUgc2hhcmVkIGJldHdlZW4gMiBIV0kgaW5zdGFuY2VzCisgICAgLy8gaGVuY2UgdGhlc2UgYXJlIGNhY2hlZCBpbiB0aGUgbXV4ZXIgYWxvbmd3aXRoIEpwZWcgaGFuZGxlCisgICAgbW1fanBlZ19vcHNfdCBtSnBlZ09wczsKKyAgICBtbV9qcGVnX21wb19vcHNfdCBtSnBlZ01wb09wczsKKyAgICB1aW50MzJfdCBtSnBlZ0NsaWVudEhhbmRsZTsKKyAgICAvLyBTdG9yZXMgQ2FtZXJhIERhdGEgQ2FsbGJhY2sgZnVuY3Rpb24KKyAgICBjYW1lcmFfZGF0YV9jYWxsYmFjayBtRGF0YUNiOworICAgIC8vIFN0b3JlcyBDYW1lcmEgR2V0TWVtb3J5IENhbGxiYWNrIGZ1bmN0aW9uCisgICAgY2FtZXJhX3JlcXVlc3RfbWVtb3J5IG1HZXRNZW1vcnlDYjsKKworcHJpdmF0ZToKKyAgICAvKiBQcml2YXRlIE1lbWJlciBWYXJpYWJsZXMgICovCisgICAgcWNhbWVyYV9waHlzaWNhbF9kZXNjcmlwdG9yX3QgKm1fcFBoeUNhbWVyYTsKKyAgICBxY2FtZXJhX2xvZ2ljYWxfZGVzY3JpcHRvcl90ICptX3BMb2dpY2FsQ2FtZXJhOworICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QgKm1fcENhbGxiYWNrczsKKyAgICBib29sIG1fYkF1eENhbWVyYUV4cG9zZWQ7CisgICAgdWludDhfdCBtX25QaHlDYW1lcmFzOworICAgIHVpbnQ4X3QgbV9uTG9naWNhbENhbWVyYXM7CisKKyAgICAvLyBNYWluIENhbWVyYSBzZXNzaW9uIEpwZWcgUXVldWUKKyAgICBRQ2FtZXJhUXVldWUgbV9NYWluSnBlZ1E7CisgICAgLy8gQXV4IENhbWVyYSBzZXNzaW9uIEpwZWcgUXVldWUKKyAgICBRQ2FtZXJhUXVldWUgbV9BdXhKcGVnUTsKKyAgICAvLyB0aHJlYWQgZm9yIG1wbyBjb21wb3NpdGlvbgorICAgIFFDYW1lcmFDbWRUaHJlYWQgbV9Db21wb3NlTXBvVGg7CisgICAgLy8gRmluYWwgTXBvIEpwZWcgQnVmZmVyCisgICAgY2FtZXJhX21lbW9yeV90ICptX3BSZWxDYW1NcG9KcGVnOworICAgIC8vIExvY2sgbmVlZGVkIHRvIHN5bmNocm9uaXplIGJldHdlZW4gbXVsdGlwbGUgY29tcG9zaXRpb24gcmVxdWVzdHMKKyAgICBwdGhyZWFkX211dGV4X3QgbV9KcGVnTG9jazsKKyAgICAvLyB0aGlzIGNhbGxiYWNrIGNvb2tpZSB3b3VsZCBiZSB1c2VkIGZvciBzZW5kaW5nIEZpbmFsIG1wbyBKcGVnIHRvIHRoZSBmcmFtZXdvcmsKKyAgICB2b2lkICptX3BNcG9DYWxsYmFja0Nvb2tpZTsKKyAgICAvLyB0aGlzIGNhbGxiYWNrIGNvb2tpZSB3b3VsZCBiZSB1c2VkIGZvciBjYWNoaW5nIG1haW4gcmVsYXRlZCBjYW0gcGh5IGluc3RhbmNlCisgICAgLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGVycm9yIHNjZW5hcmlvcworICAgIC8vIGluY2FzZSBvZiBlcnJvciwgd2UgdXNlIHRoaXMgY29va2llIHRvIGdldCBIV0kgaW5zdGFuY2UgYW5kIHNlbmQgZXJyb3JzIGluIG5vdGlmeSBjYgorICAgIHZvaWQgKm1fcEpwZWdDYWxsYmFja0Nvb2tpZTsKKyAgICAvLyBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgd2UgbmVlZCB0byBkdW1wIGR1YWwgY2FtZXJhIHNuYXBzaG90cworICAgIGJvb2wgbV9iRHVtcEltYWdlczsKKyAgICAvLyBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgTVBPIGlzIGVuYWJsZWQgb3Igbm90CisgICAgYm9vbCBtX2JNcG9FbmFibGVkOworICAgIC8vIFNpZ25pZmllcyBpZiBmcmFtZSBzeW5jIGlzIGVuYWJsZWQKKyAgICBib29sIG1fYkZyYW1lU3luY0VuYWJsZWQ7CisgICAgLy8gZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHJlY29yZGluZyBoaW50IGlzIGludGVybmFsbHkgc2V0LgorICAgIGJvb2wgbV9iUmVjb3JkaW5nSGludEludGVybmFsbHlTZXQ7CisKKyAgICAvKiBQcml2YXRlIE1lbWJlciBNZXRob2RzICovCisgICAgaW50IHNldHVwTG9naWNhbENhbWVyYXMoKTsKKyAgICBpbnQgY2FtZXJhRGV2aWNlT3BlbihpbnQgY2FtZXJhX2lkLCBzdHJ1Y3QgaHdfZGV2aWNlX3QgKipod19kZXZpY2UpOworICAgIGludCBnZXROdW1iZXJPZkNhbWVyYXMoKTsKKyAgICBpbnQgZ2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhX2lkLCBzdHJ1Y3QgY2FtZXJhX2luZm8gKmluZm8sCisgICAgICAgICAgICBjYW1fc3luY190eXBlX3QgKnBfY2FtX3R5cGUpOworICAgIGludDMyX3Qgc2V0Q2FsbGJhY2tzKGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QgKmNhbGxiYWNrcyk7CisgICAgaW50MzJfdCBzZXREYXRhQ2FsbGJhY2soY2FtZXJhX2RhdGFfY2FsbGJhY2sgZGF0YV9jYik7CisgICAgaW50MzJfdCBzZXRNZW1vcnlDYWxsYmFjayhjYW1lcmFfcmVxdWVzdF9tZW1vcnkgZ2V0X21lbW9yeSk7CisgICAgcWNhbWVyYV9sb2dpY2FsX2Rlc2NyaXB0b3JfdCogZ2V0TG9naWNhbENhbWVyYSgKKyAgICAgICAgICAgIHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKTsKKyAgICBxY2FtZXJhX3BoeXNpY2FsX2Rlc2NyaXB0b3JfdCogZ2V0UGh5c2ljYWxDYW1lcmEoCisgICAgICAgICAgICBxY2FtZXJhX2xvZ2ljYWxfZGVzY3JpcHRvcl90KiBsb2dfY2FtLCB1aW50MzJfdCBpbmRleCk7CisgICAgaW50MzJfdCBnZXRBY3RpdmVOdW1PZlBoeUNhbSgKKyAgICAgICAgICAgIHFjYW1lcmFfbG9naWNhbF9kZXNjcmlwdG9yX3QqIGxvZ19jYW0sIGludCYgbnVtT2ZBY2l0dmVQaHlDYW0pOworICAgIGludDMyX3Qgc2V0TXBvQ2FsbGJhY2tDb29raWUodm9pZCogbXBvQ2JDb29raWUpOworICAgIHZvaWQqIGdldE1wb0NhbGxiYWNrQ29va2llKCk7CisgICAgaW50MzJfdCBzZXRNYWluSnBlZ0NhbGxiYWNrQ29va2llKHZvaWQqIGpwZWdDYkNvb2tpZSk7CisgICAgdm9pZCogZ2V0TWFpbkpwZWdDYWxsYmFja0Nvb2tpZSgpOworICAgIHZvaWQgc2V0SnBlZ0hhbmRsZSh1aW50MzJfdCBoYW5kbGUpIHsgbUpwZWdDbGllbnRIYW5kbGUgPSBoYW5kbGU7fTsKKyAgICAvLyBmdW5jdGlvbiB0byBzdG9yZSBzaW5nbGUgSlBFRyBmcm9tIDEgcmVsYXRlZCBwaHlzaWNhbCBjYW1lcmEgaW5zdGFuY2UKKyAgICBpbnQzMl90IHN0b3JlSnBlZyhjYW1fc3luY190eXBlX3QgY2FtX3R5cGUsIGludDMyX3QgbXNnX3R5cGUsCisgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWVtb3J5X3QgKmRhdGEsIHVuc2lnbmVkIGludCBpbmRleCwKKyAgICAgICAgICAgIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSwgdm9pZCAqdXNlciwKKyAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX2lkeCwgY2FtZXJhX3JlbGVhc2VfY2FsbGJhY2sgcmVsZWFzZV9jYiwKKyAgICAgICAgICAgIHZvaWQgKnJlbGVhc2VfY29va2llLCB2b2lkICpyZWxlYXNlX2RhdGEpOworCit9Oy8vIEVuZCBuYW1lc3BhY2UgcWNhbWVyYQorCit9CisjZW5kaWYgLyogX19RQ0FNRVJBTVVYRVJfSF9fICovCisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBhcmFtZXRlcnMuY3BwIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhUGFyYW1ldGVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjUwNmU3NgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBhcmFtZXRlcnMuY3BwCkBAIC0wLDAgKzEsMTQ3NzUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJRQ2FtZXJhUGFyYW1ldGVycyIKKworLy8gVG8gcmVtb3ZlCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNkZWZpbmUgU1lTSU5GT19IIDxTWVNURU1fSEVBREVSX1BSRUZJWC9zeXNpbmZvLmg+CisjaW5jbHVkZSBTWVNJTkZPX0gKKyNpbmNsdWRlICJncmFsbG9jX3ByaXYuaCIKKyNpbmNsdWRlICJncmFwaGljcy5oIgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiUUNhbWVyYUJ1ZmZlck1hcHMuaCIKKyNpbmNsdWRlICJRQ2FtZXJhMkhXSS5oIgorI2luY2x1ZGUgIlFDYW1lcmFQYXJhbWV0ZXJzLmgiCisjaW5jbHVkZSAiUUNhbWVyYVRyYWNlLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKK30KKworI2RlZmluZSBQSSAzLjE0MTU5MjY1CisjZGVmaW5lIEFTUEVDVF9UT0xFUkFOQ0UgMC4wMDEKKyNkZWZpbmUgQ0FNRVJBX0RFRkFVTFRfTE9OR1NIT1RfU1RBR0VTIDQKKyNkZWZpbmUgQ0FNRVJBX01JTl9MT05HU0hPVF9TVEFHRVMgMgorI2RlZmluZSBGT0NVU19QRVJDSVNJT04gMC4wMDAwMDAxCisKKworbmFtZXNwYWNlIHFjYW1lcmEgeworLy8gUGFyYW1ldGVyIGtleXMgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiBjYW1lcmEgYXBwbGljYXRpb24gYW5kIGRyaXZlci4KK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfSEZSX1NJWkVTW10gPSAiaGZyLXNpemUtdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19QUkVWSUVXX0ZSQU1FX1JBVEVfTU9ERVtdID0gInByZXZpZXctZnJhbWUtcmF0ZS1tb2RlIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfUFJFVklFV19GUkFNRV9SQVRFX01PREVTW10gPSAicHJldmlldy1mcmFtZS1yYXRlLW1vZGVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19QUkVWSUVXX0ZSQU1FX1JBVEVfQVVUT19NT0RFW10gPSAiZnJhbWUtcmF0ZS1hdXRvIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19QUkVWSUVXX0ZSQU1FX1JBVEVfRklYRURfTU9ERVtdID0gImZyYW1lLXJhdGUtZml4ZWQiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1RPVUNIX0FGX0FFQ1tdID0gInRvdWNoLWFmLWFlYyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU1VQUE9SVEVEX1RPVUNIX0FGX0FFQ1tdID0gInRvdWNoLWFmLWFlYy12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1RPVUNIX0lOREVYX0FFQ1tdID0gInRvdWNoLWluZGV4LWFlYyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfVE9VQ0hfSU5ERVhfQUZbXSA9ICJ0b3VjaC1pbmRleC1hZiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU0NFTkVfREVURUNUW10gPSAic2NlbmUtZGV0ZWN0IjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfU0NFTkVfREVURUNUW10gPSAic2NlbmUtZGV0ZWN0LXZhbHVlcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfSVNPX01PREVbXSA9ICJpc28iOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX0NPTlRJTlVPVVNfSVNPW10gPSAiY29udGludW91cy1pc28iOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX01JTl9JU09bXSA9ICJtaW4taXNvIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19NQVhfSVNPW10gPSAibWF4LWlzbyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU1VQUE9SVEVEX0lTT19NT0RFU1tdID0gImlzby12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX0VYUE9TVVJFX1RJTUVbXSA9ICJleHBvc3VyZS10aW1lIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19NSU5fRVhQT1NVUkVfVElNRVtdID0gIm1pbi1leHBvc3VyZS10aW1lIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19NQVhfRVhQT1NVUkVfVElNRVtdID0gIm1heC1leHBvc3VyZS10aW1lIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19DVVJSRU5UX0VYUE9TVVJFX1RJTUVbXSA9ICJjdXItZXhwb3N1cmUtdGltZSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfQ1VSUkVOVF9JU09bXSA9ICJjdXItaXNvIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19MRU5TU0hBREVbXSA9ICJsZW5zc2hhZGUiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9MRU5TU0hBREVfTU9ERVNbXSA9ICJsZW5zc2hhZGUtdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19BVVRPX0VYUE9TVVJFW10gPSAiYXV0by1leHBvc3VyZSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU1VQUE9SVEVEX0FVVE9fRVhQT1NVUkVbXSA9ICJhdXRvLWV4cG9zdXJlLXZhbHVlcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfREVOT0lTRVtdID0gImRlbm9pc2UiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9ERU5PSVNFW10gPSAiZGVub2lzZS12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX0ZPQ1VTX0FMR09bXSA9ICJzZWxlY3RhYmxlLXpvbmUtYWYiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9GT0NVU19BTEdPU1tdID0gInNlbGVjdGFibGUtem9uZS1hZi12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX01BTlVBTF9GT0NVU19QT1NJVElPTltdID0gIm1hbnVhbC1mb2N1cy1wb3NpdGlvbiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTUFOVUFMX0ZPQ1VTX1BPU19UWVBFW10gPSAibWFudWFsLWZvY3VzLXBvcy10eXBlIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19NSU5fRk9DVVNfUE9TX0lOREVYW10gPSAibWluLWZvY3VzLXBvcy1pbmRleCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTUFYX0ZPQ1VTX1BPU19JTkRFWFtdID0gIm1heC1mb2N1cy1wb3MtaW5kZXgiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX01JTl9GT0NVU19QT1NfREFDW10gPSAibWluLWZvY3VzLXBvcy1kYWMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX01BWF9GT0NVU19QT1NfREFDW10gPSAibWF4LWZvY3VzLXBvcy1kYWMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX01JTl9GT0NVU19QT1NfUkFUSU9bXSA9ICJtaW4tZm9jdXMtcG9zLXJhdGlvIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19NQVhfRk9DVVNfUE9TX1JBVElPW10gPSAibWF4LWZvY3VzLXBvcy1yYXRpbyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfRk9DVVNfUE9TSVRJT05fU0NBTEVbXSA9ICJjdXItZm9jdXMtc2NhbGUiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX01JTl9GT0NVU19QT1NfRElPUFRFUltdID0gIm1pbi1mb2N1cy1wb3MtZGlvcHRlciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTUFYX0ZPQ1VTX1BPU19ESU9QVEVSW10gPSAibWF4LWZvY3VzLXBvcy1kaW9wdGVyIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19GT0NVU19QT1NJVElPTl9ESU9QVEVSW10gPSAiY3VyLWZvY3VzLWRpb3B0ZXIiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX0ZBQ0VfREVURUNUSU9OW10gPSAiZmFjZS1kZXRlY3Rpb24iOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9GQUNFX0RFVEVDVElPTltdID0gImZhY2UtZGV0ZWN0aW9uLXZhbHVlcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfRkFDRV9SRUNPR05JVElPTltdID0gImZhY2UtcmVjb2duaXRpb24iOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9GQUNFX1JFQ09HTklUSU9OW10gPSAiZmFjZS1yZWNvZ25pdGlvbi12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX01FTU9SWV9DT0xPUl9FTkhBTkNFTUVOVFtdID0gIm1jZSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU1VQUE9SVEVEX01FTV9DT0xPUl9FTkhBTkNFX01PREVTW10gPSAibWNlLXZhbHVlcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfRElTW10gPSAiZGlzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19PSVNbXSA9ICJvaXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9ESVNfTU9ERVNbXSA9ICJkaXMtdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfT0lTX01PREVTW10gPSAib2lzLXZhbHVlcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfVklERU9fSElHSF9GUkFNRV9SQVRFW10gPSAidmlkZW8taGZyIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19WSURFT19ISUdIX1NQRUVEX1JFQ09SRElOR1tdID0gInZpZGVvLWhzciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU1VQUE9SVEVEX1ZJREVPX0hJR0hfRlJBTUVfUkFURV9NT0RFU1tdID0gInZpZGVvLWhmci12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1JFREVZRV9SRURVQ1RJT05bXSA9ICJyZWRleWUtcmVkdWN0aW9uIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfUkVERVlFX1JFRFVDVElPTltdID0gInJlZGV5ZS1yZWR1Y3Rpb24tdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19ISUdIX0RZTkFNSUNfUkFOR0VfSU1BR0lOR1tdID0gImhkciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU1VQUE9SVEVEX0hEUl9JTUFHSU5HX01PREVTW10gPSAiaGRyLXZhbHVlcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfWlNMW10gPSAienNsIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfWlNMX01PREVTW10gPSAienNsLXZhbHVlcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfWlNMX0JVUlNUX0lOVEVSVkFMW10gPSAiY2FwdHVyZS1idXJzdC1pbnRlcnZhbCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfWlNMX0JVUlNUX0xPT0tCQUNLW10gPSAiY2FwdHVyZS1idXJzdC1yZXRyb2FjdGl2ZSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfWlNMX1FVRVVFX0RFUFRIW10gPSAiY2FwdHVyZS1idXJzdC1xdWV1ZS1kZXB0aCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfQ0FNRVJBX01PREVbXSA9ICJjYW1lcmEtbW9kZSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfQUVfQlJBQ0tFVF9IRFJbXSA9ICJhZS1icmFja2V0LWhkciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU1VQUE9SVEVEX0FFX0JSQUNLRVRfTU9ERVNbXSA9ICJhZS1icmFja2V0LWhkci12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9SQVdfRk9STUFUU1tdID0gInJhdy1mb3JtYXQtdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19SQVdfRk9STUFUW10gPSAicmF3LWZvcm1hdCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfT1JJRU5UQVRJT05bXSA9ICJvcmllbnRhdGlvbiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU0VMRUNUQUJMRV9aT05FX0FGW10gPSAic2VsZWN0YWJsZS16b25lLWFmIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19DQVBUVVJFX0JVUlNUX0VYUE9TVVJFW10gPSAiY2FwdHVyZS1idXJzdC1leHBvc3VyZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX05VTV9TTkFQU0hPVF9QRVJfU0hVVFRFUltdID0gIm51bS1zbmFwcy1wZXItc2h1dHRlciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTlVNX1JFVFJPX0JVUlNUX1BFUl9TSFVUVEVSW10gPSAibnVtLXJldHJvLWJ1cnN0LXBlci1zaHV0dGVyIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TTkFQU0hPVF9CVVJTVF9MRURfT05fUEVSSU9EW10gPSAienNsLWJ1cnN0LWxlZC1vbi1wZXJpb2QiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX05PX0RJU1BMQVlfTU9ERVtdID0gIm5vLWRpc3BsYXktbW9kZSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfUkFXX1BJQ1VUUkVfU0laRVtdID0gInJhdy1zaXplIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfU0tJTl9UT05FX0VOSEFOQ0VNRU5UX01PREVTW10gPSAic2tpblRvbmVFbmhhbmNlbWVudC12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9MSVZFU05BUFNIT1RfU0laRVNbXSA9ICJzdXBwb3J0ZWQtbGl2ZS1zbmFwc2hvdC1zaXplcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU1VQUE9SVEVEX0hEUl9ORUVEXzFYW10gPSAiaGRyLW5lZWQtMXgtdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19IRFJfTkVFRF8xWFtdID0gImhkci1uZWVkLTF4IjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19QUkVWSUVXX0ZMSVBbXSA9ICJwcmV2aWV3LWZsaXAiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1ZJREVPX0ZMSVBbXSA9ICJ2aWRlby1mbGlwIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TTkFQU0hPVF9QSUNUVVJFX0ZMSVBbXSA9ICJzbmFwc2hvdC1waWN0dXJlLWZsaXAiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9GTElQX01PREVTW10gPSAiZmxpcC1tb2RlLXZhbHVlcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfVklERU9fSERSW10gPSAidmlkZW8taGRyIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TRU5TT1JfSERSW10gPSAic2Vuc29yLWhkciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfVlRfRU5BQkxFW10gPSAiYXZ0aW1lciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU1VQUE9SVEVEX1ZJREVPX0hEUl9NT0RFU1tdID0gInZpZGVvLWhkci12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9TRU5TT1JfSERSX01PREVTW10gPSAic2Vuc29yLWhkci12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX0FVVE9fSERSX0VOQUJMRSBbXSA9ICJhdXRvLWhkci1lbmFibGUiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NOQVBTSE9UX0JVUlNUX05VTVtdID0gInNuYXBzaG90LWJ1cnN0LW51bSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU05BUFNIT1RfRkRfREFUQVtdID0gInNuYXBzaG90LWZkLWRhdGEtZW5hYmxlIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19USU5UTEVTU19FTkFCTEVbXSA9ICJ0aW50bGVzcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU0NFTkVfU0VMRUNUSU9OW10gPSAic2NlbmUtc2VsZWN0aW9uIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19DRFNfTU9ERVtdID0gImNkcy1tb2RlIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19WSURFT19DRFNfTU9ERVtdID0gInZpZGVvLWNkcy1tb2RlIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfQ0RTX01PREVTW10gPSAiY2RzLW1vZGUtdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfVklERU9fQ0RTX01PREVTW10gPSAidmlkZW8tY2RzLW1vZGUtdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19UTlJfTU9ERVtdID0gInRuci1tb2RlIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19WSURFT19UTlJfTU9ERVtdID0gInZpZGVvLXRuci1tb2RlIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfVE5SX01PREVTW10gPSAidG5yLW1vZGUtdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfVklERU9fVE5SX01PREVTW10gPSAidmlkZW8tdG5yLW1vZGUtdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19WSURFT19ST1RBVElPTltdID0gInZpZGVvLXJvdGF0aW9uIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfVklERU9fUk9UQVRJT05fVkFMVUVTW10gPSAidmlkZW8tcm90YXRpb24tdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19BRl9CUkFDS0VUW10gPSAiYWYtYnJhY2tldCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU1VQUE9SVEVEX0FGX0JSQUNLRVRfTU9ERVNbXSA9ICJhZi1icmFja2V0LXZhbHVlcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfUkVfRk9DVVNbXSA9ICJyZS1mb2N1cyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU1VQUE9SVEVEX1JFX0ZPQ1VTX01PREVTW10gPSAicmUtZm9jdXMtdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19DSFJPTUFfRkxBU0hbXSA9ICJjaHJvbWEtZmxhc2giOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9DSFJPTUFfRkxBU0hfTU9ERVNbXSA9ICJjaHJvbWEtZmxhc2gtdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19PUFRJX1pPT01bXSA9ICJvcHRpLXpvb20iOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NFRV9NT1JFW10gPSAic2VlLW1vcmUiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NUSUxMX01PUkVbXSA9ICJzdGlsbC1tb3JlIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfT1BUSV9aT09NX01PREVTW10gPSAib3B0aS16b29tLXZhbHVlcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfSERSX01PREVbXSA9ICJoZHItbW9kZSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU1VQUE9SVEVEX0tFWV9RQ19IRFJfTU9ERVNbXSA9ICJoZHItbW9kZS12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1RSVUVfUE9SVFJBSVRbXSA9ICJ0cnVlLXBvcnRyYWl0IjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfVFJVRV9QT1JUUkFJVF9NT0RFU1tdID0gInRydWUtcG9ydHJhaXQtdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfU0VFX01PUkVfTU9ERVNbXSA9ICJzZWUtbW9yZS12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9TVElMTF9NT1JFX01PREVTW10gPSAic3RpbGwtbW9yZS12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0lOVEVSTkFMX1BFUlZJRVdfUkVTVEFSVFtdID0gImludGVybmFsLXJlc3RhcnQiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1JESV9NT0RFW10gPSAicmRpLW1vZGUiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9SRElfTU9ERVNbXSA9ICJyZGktbW9kZS12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NFQ1VSRV9NT0RFW10gPSAic2VjdXJlLW1vZGUiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NVUFBPUlRFRF9TRUNVUkVfTU9ERVNbXSA9ICJzZWN1cmUtbW9kZS12YWx1ZXMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6SVNPX0hKUltdID0gIklTT19ISlIiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX0FVVE9fSERSX1NVUFBPUlRFRFtdID0gImF1dG8taGRyLXN1cHBvcnRlZCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTE9OR1NIT1RfU1VQUE9SVEVEW10gPSAibG9uZ3Nob3Qtc3VwcG9ydGVkIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19aU0xfSERSX1NVUFBPUlRFRFtdID0gInpzbC1oZHItc3VwcG9ydGVkIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19XQl9NQU5VQUxfQ0NUW10gPSAid2ItbWFudWFsLWNjdCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTUlOX1dCX0NDVFtdID0gIm1pbi13Yi1jY3QiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX01BWF9XQl9DQ1RbXSA9ICJtYXgtd2ItY2N0IjsKKworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX01BTlVBTF9XQl9HQUlOU1tdID0gIm1hbnVhbC13Yi1nYWlucyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTUlOX1dCX0dBSU5bXSA9ICJtaW4td2ItZ2FpbiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTUFYX1dCX0dBSU5bXSA9ICJtYXgtd2ItZ2FpbiI7CisKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19NQU5VQUxfV0JfVFlQRVtdID0gIm1hbnVhbC13Yi10eXBlIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19NQU5VQUxfV0JfVkFMVUVbXSA9ICJtYW51YWwtd2ItdmFsdWUiOworCitjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpXSElURV9CQUxBTkNFX01BTlVBTFtdID0gIm1hbnVhbCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19NT0RFX01BTlVBTF9QT1NJVElPTltdID0gIm1hbnVhbCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfQ0FDSEVfVklERU9fQlVGRkVSU1tdID0gImNhY2hlLXZpZGVvLWJ1ZmZlcnMiOworCitjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTE9OR19TSE9UW10gPSAibG9uZy1zaG90IjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19JTklUSUFMX0VYUE9TVVJFX0lOREVYW10gPSAiaW5pdGlhbC1leHAtaW5kZXgiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX0lOU1RBTlRfQUVDW10gPSAiaW5zdGFudC1hZWMiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX0lOU1RBTlRfQ0FQVFVSRVtdID0gImluc3RhbnQtY2FwdHVyZSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfSU5TVEFOVF9BRUNfU1VQUE9SVEVEX01PREVTW10gPSAiaW5zdGFudC1hZWMtdmFsdWVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19JTlNUQU5UX0NBUFRVUkVfU1VQUE9SVEVEX01PREVTW10gPSAiaW5zdGFudC1jYXB0dXJlLXZhbHVlcyI7CisKKy8vIFZhbHVlcyBmb3IgZWZmZWN0IHNldHRpbmdzLgorY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6RUZGRUNUX0VNQk9TU1tdID0gImVtYm9zcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpFRkZFQ1RfU0tFVENIW10gPSAic2tldGNoIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OkVGRkVDVF9ORU9OW10gPSAibmVvbiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpFRkZFQ1RfQkVBVVRZW10gPSAiYmVhdXR5IjsKKworCisvLyBWYWx1ZXMgZm9yIGF1dG8gZXhwb3N1cmUgc2V0dGluZ3MuCitjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpUT1VDSF9BRl9BRUNfT0ZGW10gPSAidG91Y2gtb2ZmIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlRPVUNIX0FGX0FFQ19PTltdID0gInRvdWNoLW9uIjsKKworLy8gVmFsdWVzIGZvciBzY2VuZSBtb2RlIHNldHRpbmdzLgorY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9BU0RbXSA9ICJhc2QiOyAgIC8vIGNvcnJlc3BvbmRzIHRvIENBTUVSQV9CRVNUU0hPVF9BVVRPIGluIEhBTAorY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9CQUNLTElHSFRbXSA9ICJiYWNrbGlnaHQiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9GTE9XRVJTW10gPSAiZmxvd2VycyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpTQ0VORV9NT0RFX0FSW10gPSAiQVIiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6U0NFTkVfTU9ERV9IRFJbXSA9ICJoZHIiOworCisvLyBGb3JtYXRzIGZvciBzZXRQcmV2aWV3Rm9ybWF0IGFuZCBzZXRQaWN0dXJlRm9ybWF0LgorY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1lVVjQyMFNQX0FEUkVOT1tdID0gInl1djQyMHNwLWFkcmVubyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVYxMltdID0gInl1djQyMHAiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX05WMTJbXSA9ICJudjEyIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9OVjEyX1ZFTlVTW10gPSAibnYxMi12ZW51cyI7CisKKy8vIFZhbHVlcyBmb3IgcmF3IGltYWdlIGZvcm1hdHMKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9ZVVZfUkFXXzhCSVRfWVVZVltdID0gInl1di1yYXc4LXl1eXYiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX1lVVl9SQVdfOEJJVF9ZVllVW10gPSAieXV2LXJhdzgteXZ5dSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfWVVWX1JBV184QklUX1VZVllbXSA9ICJ5dXYtcmF3OC11eXZ5IjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9ZVVZfUkFXXzhCSVRfVllVWVtdID0gInl1di1yYXc4LXZ5dXkiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzhHQlJHW10gPSAiYmF5ZXItcWNvbS04Z2JyZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfOEdSQkdbXSA9ICJiYXllci1xY29tLThncmJnIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV184UkdHQltdID0gImJheWVyLXFjb20tOHJnZ2IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzhCR0dSW10gPSAiYmF5ZXItcWNvbS04YmdnciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBHQlJHW10gPSAiYmF5ZXItcWNvbS0xMGdicmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzEwR1JCR1tdID0gImJheWVyLXFjb20tMTBncmJnIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMFJHR0JbXSA9ICJiYXllci1xY29tLTEwcmdnYiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBCR0dSW10gPSAiYmF5ZXItcWNvbS0xMGJnZ3IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyR0JSR1tdID0gImJheWVyLXFjb20tMTJnYnJnIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMkdSQkdbXSA9ICJiYXllci1xY29tLTEyZ3JiZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTJSR0dCW10gPSAiYmF5ZXItcWNvbS0xMnJnZ2IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQkdHUltdID0gImJheWVyLXFjb20tMTJiZ2dyIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xNEdCUkdbXSA9ICJiYXllci1xY29tLTE0Z2JyZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTRHUkJHW10gPSAiYmF5ZXItcWNvbS0xNGdyYmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0UkdHQltdID0gImJheWVyLXFjb20tMTRyZ2diIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xNEJHR1JbXSA9ICJiYXllci1xY29tLTE0YmdnciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfOEdCUkdbXSA9ICJiYXllci1taXBpLThnYnJnIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV184R1JCR1tdID0gImJheWVyLW1pcGktOGdyYmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzhSR0dCW10gPSAiYmF5ZXItbWlwaS04cmdnYiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfOEJHR1JbXSA9ICJiYXllci1taXBpLThiZ2dyIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMEdCUkdbXSA9ICJiYXllci1taXBpLTEwZ2JyZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTBHUkJHW10gPSAiYmF5ZXItbWlwaS0xMGdyYmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzEwUkdHQltdID0gImJheWVyLW1pcGktMTByZ2diIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMEJHR1JbXSA9ICJiYXllci1taXBpLTEwYmdnciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJHQlJHW10gPSAiYmF5ZXItbWlwaS0xMmdicmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzEyR1JCR1tdID0gImJheWVyLW1pcGktMTJncmJnIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMlJHR0JbXSA9ICJiYXllci1taXBpLTEycmdnYiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJCR0dSW10gPSAiYmF5ZXItbWlwaS0xMmJnZ3IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzE0R0JSR1tdID0gImJheWVyLW1pcGktMTRnYnJnIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xNEdSQkdbXSA9ICJiYXllci1taXBpLTE0Z3JiZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTRSR0dCW10gPSAiYmF5ZXItbWlwaS0xNHJnZ2IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzE0QkdHUltdID0gImJheWVyLW1pcGktMTRiZ2dyIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzhHQlJHW10gPSAiYmF5ZXItaWRlYWwtcWNvbS04Z2JyZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV84R1JCR1tdID0gImJheWVyLWlkZWFsLXFjb20tOGdyYmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1FDT01fOFJHR0JbXSA9ICJiYXllci1pZGVhbC1xY29tLThyZ2diIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzhCR0dSW10gPSAiYmF5ZXItaWRlYWwtcWNvbS04YmdnciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xMEdCUkdbXSA9ICJiYXllci1pZGVhbC1xY29tLTEwZ2JyZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xMEdSQkdbXSA9ICJiYXllci1pZGVhbC1xY29tLTEwZ3JiZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xMFJHR0JbXSA9ICJiYXllci1pZGVhbC1xY29tLTEwcmdnYiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xMEJHR1JbXSA9ICJiYXllci1pZGVhbC1xY29tLTEwYmdnciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xMkdCUkdbXSA9ICJiYXllci1pZGVhbC1xY29tLTEyZ2JyZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xMkdSQkdbXSA9ICJiYXllci1pZGVhbC1xY29tLTEyZ3JiZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xMlJHR0JbXSA9ICJiYXllci1pZGVhbC1xY29tLTEycmdnYiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xMkJHR1JbXSA9ICJiYXllci1pZGVhbC1xY29tLTEyYmdnciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xNEdCUkdbXSA9ICJiYXllci1pZGVhbC1xY29tLTE0Z2JyZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xNEdSQkdbXSA9ICJiYXllci1pZGVhbC1xY29tLTE0Z3JiZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xNFJHR0JbXSA9ICJiYXllci1pZGVhbC1xY29tLTE0cmdnYiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xNEJHR1JbXSA9ICJiYXllci1pZGVhbC1xY29tLTE0YmdnciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfTUlQSV84R0JSR1tdID0gImJheWVyLWlkZWFsLW1pcGktOGdicmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfOEdSQkdbXSA9ICJiYXllci1pZGVhbC1taXBpLThncmJnIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9NSVBJXzhSR0dCW10gPSAiYmF5ZXItaWRlYWwtbWlwaS04cmdnYiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfTUlQSV84QkdHUltdID0gImJheWVyLWlkZWFsLW1pcGktOGJnZ3IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTBHQlJHW10gPSAiYmF5ZXItaWRlYWwtbWlwaS0xMGdicmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTBHUkJHW10gPSAiYmF5ZXItaWRlYWwtbWlwaS0xMGdyYmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTBSR0dCW10gPSAiYmF5ZXItaWRlYWwtbWlwaS0xMHJnZ2IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTBCR0dSW10gPSAiYmF5ZXItaWRlYWwtbWlwaS0xMGJnZ3IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTJHQlJHW10gPSAiYmF5ZXItaWRlYWwtbWlwaS0xMmdicmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTJHUkJHW10gPSAiYmF5ZXItaWRlYWwtbWlwaS0xMmdyYmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTJSR0dCW10gPSAiYmF5ZXItaWRlYWwtbWlwaS0xMnJnZ2IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTJCR0dSW10gPSAiYmF5ZXItaWRlYWwtbWlwaS0xMmJnZ3IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTRHQlJHW10gPSAiYmF5ZXItaWRlYWwtbWlwaS0xNGdicmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTRHUkJHW10gPSAiYmF5ZXItaWRlYWwtbWlwaS0xNGdyYmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTRSR0dCW10gPSAiYmF5ZXItaWRlYWwtbWlwaS0xNHJnZ2IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTRCR0dSW10gPSAiYmF5ZXItaWRlYWwtbWlwaS0xNGJnZ3IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOOF84R0JSR1tdID0gImJheWVyLWlkZWFsLXBsYWluOC04Z2JyZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUExBSU44XzhHUkJHW10gPSAiYmF5ZXItaWRlYWwtcGxhaW44LThncmJnIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjhfOFJHR0JbXSA9ICJiYXllci1pZGVhbC1wbGFpbjgtOHJnZ2IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOOF84QkdHUltdID0gImJheWVyLWlkZWFsLXBsYWluOC04YmdnciI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUExBSU4xNl84R0JSR1tdID0gImJheWVyLWlkZWFsLXBsYWluMTYtOGdicmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfOEdSQkdbXSA9ICJiYXllci1pZGVhbC1wbGFpbjE2LThncmJnIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjE2XzhSR0dCW10gPSAiYmF5ZXItaWRlYWwtcGxhaW4xNi04cmdnYiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUExBSU4xNl84QkdHUltdID0gImJheWVyLWlkZWFsLXBsYWluMTYtOGJnZ3IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTBHQlJHW10gPSAiYmF5ZXItaWRlYWwtcGxhaW4xNi0xMGdicmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTBHUkJHW10gPSAiYmF5ZXItaWRlYWwtcGxhaW4xNi0xMGdyYmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTBSR0dCW10gPSAiYmF5ZXItaWRlYWwtcGxhaW4xNi0xMHJnZ2IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTBCR0dSW10gPSAiYmF5ZXItaWRlYWwtcGxhaW4xNi0xMGJnZ3IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTJHQlJHW10gPSAiYmF5ZXItaWRlYWwtcGxhaW4xNi0xMmdicmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTJHUkJHW10gPSAiYmF5ZXItaWRlYWwtcGxhaW4xNi0xMmdyYmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTJSR0dCW10gPSAiYmF5ZXItaWRlYWwtcGxhaW4xNi0xMnJnZ2IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTJCR0dSW10gPSAiYmF5ZXItaWRlYWwtcGxhaW4xNi0xMmJnZ3IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTRHQlJHW10gPSAiYmF5ZXItaWRlYWwtcGxhaW4xNi0xNGdicmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTRHUkJHW10gPSAiYmF5ZXItaWRlYWwtcGxhaW4xNi0xNGdyYmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTRSR0dCW10gPSAiYmF5ZXItaWRlYWwtcGxhaW4xNi0xNHJnZ2IiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTRCR0dSW10gPSAiYmF5ZXItaWRlYWwtcGxhaW4xNi0xNGJnZ3IiOworCisvLyBWYWx1ZXMgZm9yIElTTyBTZXR0aW5ncworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6SVNPX0FVVE9bXSA9ICJhdXRvIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OklTT18xMDBbXSA9ICJJU08xMDAiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6SVNPXzIwMFtdID0gIklTTzIwMCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpJU09fNDAwW10gPSAiSVNPNDAwIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OklTT184MDBbXSA9ICJJU084MDAiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6SVNPXzE2MDBbXSA9ICJJU08xNjAwIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OklTT18zMjAwW10gPSAiSVNPMzIwMCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpJU09fTUFOVUFMW10gPSAibWFudWFsIjsKKworCisvLyBWYWx1ZXMgZm9yIGF1dG8gZXhwb3N1cmUgc2V0dGluZ3MuCitjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpBVVRPX0VYUE9TVVJFX0ZSQU1FX0FWR1tdID0gImZyYW1lLWF2ZXJhZ2UiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6QVVUT19FWFBPU1VSRV9DRU5URVJfV0VJR0hURURbXSA9ICJjZW50ZXItd2VpZ2h0ZWQiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6QVVUT19FWFBPU1VSRV9TUE9UX01FVEVSSU5HW10gPSAic3BvdC1tZXRlcmluZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpBVVRPX0VYUE9TVVJFX1NNQVJUX01FVEVSSU5HW10gPSAic21hcnQtbWV0ZXJpbmciOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6QVVUT19FWFBPU1VSRV9VU0VSX01FVEVSSU5HW10gPSAidXNlci1tZXRlcmluZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpBVVRPX0VYUE9TVVJFX1NQT1RfTUVURVJJTkdfQURWW10gPSAic3BvdC1tZXRlcmluZy1hZHYiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6QVVUT19FWFBPU1VSRV9DRU5URVJfV0VJR0hURURfQURWW10gPSAiY2VudGVyLXdlaWdodGVkLWFkdiI7CisKKy8vIFZhbHVlcyBmb3IgaW5zdGFudCBBRUMgbW9kZXMKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19JTlNUQU5UX0FFQ19ESVNBQkxFW10gPSAiMCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfSU5TVEFOVF9BRUNfQUdHUkVTU0lWRV9BRUNbXSA9ICIxIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19JTlNUQU5UX0FFQ19GQVNUX0FFQ1tdID0gIjIiOworCisvLyBWYWx1ZXMgZm9yIGluc3RhbnQgY2FwdHVyZSBtb2RlcworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX0lOU1RBTlRfQ0FQVFVSRV9ESVNBQkxFW10gPSAiMCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfSU5TVEFOVF9DQVBUVVJFX0FHR1JFU1NJVkVfQUVDW10gPSAiMSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfSU5TVEFOVF9DQVBUVVJFX0ZBU1RfQUVDW10gPSAiMiI7CisKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19HUFNfTEFUSVRVREVfUkVGW10gPSAiZ3BzLWxhdGl0dWRlLXJlZiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfR1BTX0xPTkdJVFVERV9SRUZbXSA9ICJncHMtbG9uZ2l0dWRlLXJlZiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfR1BTX0FMVElUVURFX1JFRltdID0gImdwcy1hbHRpdHVkZS1yZWYiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX0dQU19TVEFUVVNbXSA9ICJncHMtc3RhdHVzIjsKKworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX0hJU1RPR1JBTVtdID0gImhpc3RvZ3JhbSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU1VQUE9SVEVEX0hJU1RPR1JBTV9NT0RFU1tdID0gImhpc3RvZ3JhbS12YWx1ZXMiOworCitjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpWQUxVRV9FTkFCTEVbXSA9ICJlbmFibGUiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6VkFMVUVfRElTQUJMRVtdID0gImRpc2FibGUiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6VkFMVUVfT0ZGW10gPSAib2ZmIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlZBTFVFX09OW10gPSAib24iOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6VkFMVUVfVFJVRVtdID0gInRydWUiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6VkFMVUVfRkFMU0VbXSA9ICJmYWxzZSI7CisKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlZBTFVFX0ZBU1RbXSA9ICJmYXN0IjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlZBTFVFX0hJR0hfUVVBTElUWVtdID0gImhpZ2gtcXVhbGl0eSI7CisKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TSEFSUE5FU1NbXSA9ICJzaGFycG5lc3MiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX01JTl9TSEFSUE5FU1NbXSA9ICJtaW4tc2hhcnBuZXNzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19NQVhfU0hBUlBORVNTW10gPSAibWF4LXNoYXJwbmVzcyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU0hBUlBORVNTX1NURVBbXSA9ICJzaGFycG5lc3Mtc3RlcCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfQ09OVFJBU1RbXSA9ICJjb250cmFzdCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTUlOX0NPTlRSQVNUW10gPSAibWluLWNvbnRyYXN0IjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19NQVhfQ09OVFJBU1RbXSA9ICJtYXgtY29udHJhc3QiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX0NPTlRSQVNUX1NURVBbXSA9ICJjb250cmFzdC1zdGVwIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TQVRVUkFUSU9OW10gPSAic2F0dXJhdGlvbiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTUlOX1NBVFVSQVRJT05bXSA9ICJtaW4tc2F0dXJhdGlvbiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTUFYX1NBVFVSQVRJT05bXSA9ICJtYXgtc2F0dXJhdGlvbiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfU0FUVVJBVElPTl9TVEVQW10gPSAic2F0dXJhdGlvbi1zdGVwIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19CUklHSFRORVNTW10gPSAibHVtYS1hZGFwdGF0aW9uIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19NSU5fQlJJR0hUTkVTU1tdID0gIm1pbi1icmlnaHRuZXNzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19NQVhfQlJJR0hUTkVTU1tdID0gIm1heC1icmlnaHRuZXNzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19CUklHSFRORVNTX1NURVBbXSA9ICJicmlnaHRuZXNzLXN0ZXAiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1NDRV9GQUNUT1JbXSA9ICJza2luVG9uZUVuaGFuY2VtZW50IjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19NSU5fU0NFX0ZBQ1RPUltdID0gIm1pbi1zY2UtZmFjdG9yIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19NQVhfU0NFX0ZBQ1RPUltdID0gIm1heC1zY2UtZmFjdG9yIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TQ0VfRkFDVE9SX1NURVBbXSA9ICJzY2UtZmFjdG9yLXN0ZXAiOworCitjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTUFYX05VTV9SRVFVRVNURURfRkFDRVNbXSA9ICJxYy1tYXgtbnVtLXJlcXVlc3RlZC1mYWNlcyI7CisKKy8vVmFsdWVzIGZvciBERU5PSVNFCitjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpERU5PSVNFX09GRltdID0gImRlbm9pc2Utb2ZmIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OkRFTk9JU0VfT05bXSA9ICJkZW5vaXNlLW9uIjsKKworLy8gVmFsdWVzIGZvciBzZWxlY3RhYmxlIHpvbmUgYWYgU2V0dGluZ3MKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OkZPQ1VTX0FMR09fQVVUT1tdID0gImF1dG8iOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfQUxHT19TUE9UX01FVEVSSU5HW10gPSAic3BvdC1tZXRlcmluZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19BTEdPX0NFTlRFUl9XRUlHSFRFRFtdID0gImNlbnRlci13ZWlnaHRlZCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19BTEdPX0ZSQU1FX0FWRVJBR0VbXSA9ICJmcmFtZS1hdmVyYWdlIjsKKworLy8gVmFsdWVzIGZvciBIRlIgc2V0dGluZ3MuCitjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpWSURFT19IRlJfT0ZGW10gPSAib2ZmIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlZJREVPX0hGUl8yWFtdID0gIjYwIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlZJREVPX0hGUl8zWFtdID0gIjkwIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlZJREVPX0hGUl80WFtdID0gIjEyMCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpWSURFT19IRlJfNVhbXSA9ICIxNTAiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6VklERU9fSEZSXzZYW10gPSAiMTgwIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlZJREVPX0hGUl83WFtdID0gIjIxMCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpWSURFT19IRlJfOFhbXSA9ICIyNDAiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6VklERU9fSEZSXzlYW10gPSAiNDgwIjsKKworLy8gVmFsdWVzIGZvciBIRFIgQnJhY2tldGluZyBzZXR0aW5ncy4KK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OkFFX0JSQUNLRVRfT0ZGW10gPSAiT2ZmIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OkFFX0JSQUNLRVRbXSA9ICJBRS1CcmFja2V0IjsKKworLy8gVmFsdWVzIGZvciBBRiBCcmFja2V0aW5nIHNldHRpbmcuCitjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpBRl9CUkFDS0VUX09GRltdID0gImFmLWJyYWNrZXQtb2ZmIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OkFGX0JSQUNLRVRfT05bXSA9ICJhZi1icmFja2V0LW9uIjsKKworLy8gVmFsdWVzIGZvciBSZWZvY3VzIHNldHRpbmcuCitjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpSRV9GT0NVU19PRkZbXSA9ICJyZS1mb2N1cy1vZmYiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6UkVfRk9DVVNfT05bXSA9ICJyZS1mb2N1cy1vbiI7CisKKy8vIFZhbHVlcyBmb3IgQ2hyb21hIEZsYXNoIHNldHRpbmcuCitjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpDSFJPTUFfRkxBU0hfT0ZGW10gPSAiY2hyb21hLWZsYXNoLW9mZiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpDSFJPTUFfRkxBU0hfT05bXSA9ICJjaHJvbWEtZmxhc2gtb24iOworCisvLyBWYWx1ZXMgZm9yIE9wdGkgWm9vbSBzZXR0aW5nLgorY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6T1BUSV9aT09NX09GRltdID0gIm9wdGktem9vbS1vZmYiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6T1BUSV9aT09NX09OW10gPSAib3B0aS16b29tLW9uIjsKKworLy8gVmFsdWVzIGZvciBTdGlsbCBNb3JlIHNldHRpbmcuCitjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpTVElMTF9NT1JFX09GRltdID0gInN0aWxsLW1vcmUtb2ZmIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlNUSUxMX01PUkVfT05bXSA9ICJzdGlsbC1tb3JlLW9uIjsKKworLy8gVmFsdWVzIGZvciBIRFIgbW9kZSBzZXR0aW5nLgorY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6SERSX01PREVfU0VOU09SW10gPSAiaGRyLW1vZGUtc2Vuc29yIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OkhEUl9NT0RFX01VTFRJX0ZSQU1FW10gPSAiaGRyLW1vZGUtbXVsdGlmcmFtZSI7CisKKy8vIFZhbHVlcyBmb3IgVHJ1ZSBQb3J0cmFpdCBzZXR0aW5nLgorY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6VFJVRV9QT1JUUkFJVF9PRkZbXSA9ICJ0cnVlLXBvcnRyYWl0LW9mZiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpUUlVFX1BPUlRSQUlUX09OW10gPSAidHJ1ZS1wb3J0cmFpdC1vbiI7CisKKy8vIFZhbHVlcyBmb3IgRkxJUCBzZXR0aW5ncy4KK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OkZMSVBfTU9ERV9PRkZbXSA9ICJvZmYiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6RkxJUF9NT0RFX1ZbXSA9ICJmbGlwLXYiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6RkxJUF9NT0RFX0hbXSA9ICJmbGlwLWgiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6RkxJUF9NT0RFX1ZIW10gPSAiZmxpcC12aCI7CisKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OkNEU19NT0RFX09GRltdID0gIm9mZiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpDRFNfTU9ERV9PTltdID0gIm9uIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OkNEU19NT0RFX0FVVE9bXSA9ICJhdXRvIjsKKworLy8gVmFsdWVzIGZvciB2aWRlbyByb3RhdGlvbiBzZXR0aW5ncy4KK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlZJREVPX1JPVEFUSU9OXzBbXSA9ICIwIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlZJREVPX1JPVEFUSU9OXzkwW10gPSAiOTAiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6VklERU9fUk9UQVRJT05fMTgwW10gPSAiMTgwIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OlZJREVPX1JPVEFUSU9OXzI3MFtdID0gIjI3MCI7CisKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfTUFOVUFMX0ZPQ1VTX01PREVTW10gPSAibWFudWFsLWZvY3VzLW1vZGVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfTUFOVUFMX0VYUE9TVVJFX01PREVTW10gPSAibWFudWFsLWV4cG9zdXJlLW1vZGVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19TVVBQT1JURURfTUFOVUFMX1dCX01PREVTW10gPSAibWFudWFsLXdiLW1vZGVzIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19GT0NVU19TQ0FMRV9NT0RFW10gPSAic2NhbGUtbW9kZSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfRk9DVVNfRElPUFRFUl9NT0RFW10gPSAiZGlvcHRlci1tb2RlIjsKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19JU09fUFJJT1JJVFlbXSA9ICJpc28tcHJpb3JpdHkiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX0VYUF9USU1FX1BSSU9SSVRZW10gPSAiZXhwLXRpbWUtcHJpb3JpdHkiOworY29uc3QgY2hhciBRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1FDX1VTRVJfU0VUVElOR1tdID0gInVzZXItc2V0dGluZyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfV0JfQ0NUX01PREVbXSA9ICJjb2xvci10ZW1wZXJhdHVyZSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfV0JfR0FJTl9NT0RFW10gPSAicmJnYi1nYWlucyI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTk9JU0VfUkVEVUNUSU9OX01PREVbXSA9ICJub2lzZS1yZWR1Y3Rpb24tbW9kZSI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfTk9JU0VfUkVEVUNUSU9OX01PREVfVkFMVUVTW10gPSAibm9pc2UtcmVkdWN0aW9uLW1vZGUtdmFsdWVzIjsKKworI2lmZGVmIFRBUkdFVF9UU19NQUtFVVAKK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9UU19NQUtFVVBbXSA9ICJ0c21ha2V1cCI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfVFNfTUFLRVVQX1dISVRFTltdID0gInRzbWFrZXVwX3doaXRlbiI7Citjb25zdCBjaGFyIFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfVFNfTUFLRVVQX0NMRUFOW10gPSAidHNtYWtldXBfY2xlYW4iOworI2VuZGlmCisKKy8vS0VZIHRvIHNoYXJlIEhGUiBiYXRjaCBzaXplIHdpdGggdmlkZW8gZW5jb2Rlci4KK2NvbnN0IGNoYXIgUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19WSURFT19CQVRDSF9TSVpFW10gPSAidmlkZW8tYmF0Y2gtc2l6ZSI7CisKK3N0YXRpYyBjb25zdCBjaGFyKiBwb3J0cmFpdCA9ICJwb3J0cmFpdCI7CitzdGF0aWMgY29uc3QgY2hhciogbGFuZHNjYXBlID0gImxhbmRzY2FwZSI7CisKK2NvbnN0IGNhbV9kaW1lbnNpb25fdCBRQ2FtZXJhUGFyYW1ldGVyczo6VEhVTUJOQUlMX1NJWkVTX01BUFtdID0geworICAgIHsgMjU2LCAxNTQgfSwgLy8xLjY2MjMzCisgICAgeyAyNDAsIDE2MCB9LCAvLzEuNQorICAgIHsgMzIwLCAzMjAgfSwgLy8xLjAKKyAgICB7IDMyMCwgMjQwIH0sIC8vMS4zMzMzMworICAgIHsgMjU2LCAxNDQgfSwgLy8xLjc3Nzc3OAorICAgIHsgMjQwLCAxNDQgfSwgLy8xLjY2NjY2NworICAgIHsgMTc2LCAxNDQgfSwgLy8xLjIyMjIyMgorICAgIC8qVGh1bWJuYWlsIHNpemVzIHRvIG1hdGNoIHBvcnRyYWl0IHBpY3R1cmUgc2l6ZSBhc3BlY3QgcmF0aW8qLworICAgIHsgMjQwLCAzMjAgfSwgLy90byBtYXRjaCA0ODBYNjQwICYgMjQwWDMyMCBwaWN0dXJlIHNpemUKKyAgICB7IDE0NCwgMTc2IH0sIC8vdG8gbWF0Y2ggMTQ0WDE3NiAgcGljdHVyZSBzaXplCisgICAgeyAwLCAwIH0gICAgICAvLyByZXF1aXJlZCBieSBBbmRyb2lkIFNESworfTsKKworY29uc3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFNYXA8Y2FtX2F1dG9fZXhwb3N1cmVfbW9kZV90eXBlPgorICAgICAgICBRQ2FtZXJhUGFyYW1ldGVyczo6QVVUT19FWFBPU1VSRV9NQVBbXSA9IHsKKyAgICB7IEFVVE9fRVhQT1NVUkVfRlJBTUVfQVZHLCAgICAgICAgICAgQ0FNX0FFQ19NT0RFX0ZSQU1FX0FWRVJBR0UgfSwKKyAgICB7IEFVVE9fRVhQT1NVUkVfQ0VOVEVSX1dFSUdIVEVELCAgICAgQ0FNX0FFQ19NT0RFX0NFTlRFUl9XRUlHSFRFRCB9LAorICAgIHsgQVVUT19FWFBPU1VSRV9TUE9UX01FVEVSSU5HLCAgICAgICBDQU1fQUVDX01PREVfU1BPVF9NRVRFUklORyB9LAorICAgIHsgQVVUT19FWFBPU1VSRV9TTUFSVF9NRVRFUklORywgICAgICBDQU1fQUVDX01PREVfU01BUlRfTUVURVJJTkcgfSwKKyAgICB7IEFVVE9fRVhQT1NVUkVfVVNFUl9NRVRFUklORywgICAgICAgQ0FNX0FFQ19NT0RFX1VTRVJfTUVURVJJTkcgfSwKKyAgICB7IEFVVE9fRVhQT1NVUkVfU1BPVF9NRVRFUklOR19BRFYsICAgQ0FNX0FFQ19NT0RFX1NQT1RfTUVURVJJTkdfQURWIH0sCisgICAgeyBBVVRPX0VYUE9TVVJFX0NFTlRFUl9XRUlHSFRFRF9BRFYsIENBTV9BRUNfTU9ERV9DRU5URVJfV0VJR0hURURfQURWIH0sCit9OworCitjb25zdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYU1hcDxjYW1fYWVjX2NvbnZlcmdlbmNlX3R5cGU+CisgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpJTlNUQU5UX0FFQ19NT0RFU19NQVBbXSA9IHsKKyAgICB7IEtFWV9RQ19JTlNUQU5UX0FFQ19ESVNBQkxFLCAgICAgICAgQ0FNX0FFQ19OT1JNQUxfQ09OVkVSR0VOQ0UgfSwKKyAgICB7IEtFWV9RQ19JTlNUQU5UX0FFQ19BR0dSRVNTSVZFX0FFQywgQ0FNX0FFQ19BR0dSRVNTSVZFX0NPTlZFUkdFTkNFIH0sCisgICAgeyBLRVlfUUNfSU5TVEFOVF9BRUNfRkFTVF9BRUMsICAgICAgIENBTV9BRUNfRkFTVF9DT05WRVJHRU5DRSB9LAorfTsKKworY29uc3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFNYXA8Y2FtX2FlY19jb252ZXJnZW5jZV90eXBlPgorICAgICAgICBRQ2FtZXJhUGFyYW1ldGVyczo6SU5TVEFOVF9DQVBUVVJFX01PREVTX01BUFtdID0geworICAgIHsgS0VZX1FDX0lOU1RBTlRfQ0FQVFVSRV9ESVNBQkxFLCAgICAgICAgQ0FNX0FFQ19OT1JNQUxfQ09OVkVSR0VOQ0UgfSwKKyAgICB7IEtFWV9RQ19JTlNUQU5UX0NBUFRVUkVfQUdHUkVTU0lWRV9BRUMsIENBTV9BRUNfQUdHUkVTU0lWRV9DT05WRVJHRU5DRSB9LAorICAgIHsgS0VZX1FDX0lOU1RBTlRfQ0FQVFVSRV9GQVNUX0FFQywgICAgICAgQ0FNX0FFQ19GQVNUX0NPTlZFUkdFTkNFIH0sCit9OworCitjb25zdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYU1hcDxjYW1fZm9ybWF0X3Q+CisgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpQUkVWSUVXX0ZPUk1BVFNfTUFQW10gPSB7CisgICAge1BJWEVMX0ZPUk1BVF9ZVVY0MjBTUCwgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxfSwKKyAgICB7UElYRUxfRk9STUFUX1lVVjQyMFAsICAgICAgICAgQ0FNX0ZPUk1BVF9ZVVZfNDIwX1lWMTJ9LAorICAgIHtQSVhFTF9GT1JNQVRfWVVWNDIwU1BfQURSRU5PLCBDQU1fRk9STUFUX1lVVl80MjBfTlYyMV9BRFJFTk99LAorICAgIHtQSVhFTF9GT1JNQVRfWVYxMiwgICAgICAgICAgICBDQU1fRk9STUFUX1lVVl80MjBfWVYxMn0sCisgICAge1BJWEVMX0ZPUk1BVF9OVjEyLCAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX05WMTJfVkVOVVMsICAgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVkVOVVN9Cit9OworCitjb25zdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYU1hcDxjYW1fZm9ybWF0X3Q+CisgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpQSUNUVVJFX1RZUEVTX01BUFtdID0geworICAgIHtQSVhFTF9GT1JNQVRfSlBFRywgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfSlBFR30sCisgICAge1BJWEVMX0ZPUk1BVF9ZVVY0MjBTUCwgICAgICAgICAgICAgICAgICAgICAgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjF9LAorICAgIHtQSVhFTF9GT1JNQVRfWVVWNDIyU1AsICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMl9OVjE2fSwKKyAgICB7UUNfUElYRUxfRk9STUFUX1lVVl9SQVdfOEJJVF9ZVVlWLCAgICAgICAgICBDQU1fRk9STUFUX1lVVl9SQVdfOEJJVF9ZVVlWfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX1lVVl9SQVdfOEJJVF9ZVllVLCAgICAgICAgICBDQU1fRk9STUFUX1lVVl9SQVdfOEJJVF9ZVllVfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX1lVVl9SQVdfOEJJVF9VWVZZLCAgICAgICAgICBDQU1fRk9STUFUX1lVVl9SQVdfOEJJVF9VWVZZfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX1lVVl9SQVdfOEJJVF9WWVVZLCAgICAgICAgICBDQU1fRk9STUFUX1lVVl9SQVdfOEJJVF9WWVVZfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzhHQlJHLCAgICAgICBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzhCUFBfR0JSR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV184R1JCRywgICAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV184QlBQX0dSQkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfOFJHR0IsICAgICAgIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfOEJQUF9SR0dCfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzhCR0dSLCAgICAgICBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzhCUFBfQkdHUn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEdCUkcsICAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEJQUF9HQlJHfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzEwR1JCRywgICAgICBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEwQlBQX0dSQkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBSR0dCLCAgICAgIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBCUFBfUkdHQn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEJHR1IsICAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEJQUF9CR0dSfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyR0JSRywgICAgICBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQlBQX0dCUkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTJHUkJHLCAgICAgIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTJCUFBfR1JCR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMlJHR0IsICAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMkJQUF9SR0dCfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQkdHUiwgICAgICBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQlBQX0JHR1J9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTRHQlJHLCAgICAgIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTRCUFBfR0JSR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xNEdSQkcsICAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xNEJQUF9HUkJHfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0UkdHQiwgICAgICBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX1JHR0J9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTRCR0dSLCAgICAgIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTRCUFBfQkdHUn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV184R0JSRywgICAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV184QlBQX0dCUkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfOEdSQkcsICAgICAgIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfOEJQUF9HUkJHfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzhSR0dCLCAgICAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzhCUFBfUkdHQn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV184QkdHUiwgICAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV184QlBQX0JHR1J9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTBHQlJHLCAgICAgIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTBCUFBfR0JSR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMEdSQkcsICAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMEJQUF9HUkJHfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzEwUkdHQiwgICAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX1JHR0J9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTBCR0dSLCAgICAgIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTBCUFBfQkdHUn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMkdCUkcsICAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMkJQUF9HQlJHfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzEyR1JCRywgICAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEyQlBQX0dSQkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJSR0dCLCAgICAgIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJCUFBfUkdHQn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMkJHR1IsICAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMkJQUF9CR0dSfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzE0R0JSRywgICAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzE0QlBQX0dCUkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTRHUkJHLCAgICAgIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTRCUFBfR1JCR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xNFJHR0IsICAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xNEJQUF9SR0dCfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzE0QkdHUiwgICAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzE0QlBQX0JHR1J9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV84R0JSRywgICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fOEJQUF9HQlJHfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1FDT01fOEdSQkcsICAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzhCUFBfR1JCR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzhSR0dCLCAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV84QlBQX1JHR0J9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV84QkdHUiwgICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fOEJQUF9CR0dSfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1FDT01fMTBHQlJHLCAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzEwQlBQX0dCUkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xMEdSQkcsICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTBCUFBfR1JCR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzEwUkdHQiwgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMEJQUF9SR0dCfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1FDT01fMTBCR0dSLCAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzEwQlBQX0JHR1J9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xMkdCUkcsICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTJCUFBfR0JSR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzEyR1JCRywgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMkJQUF9HUkJHfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1FDT01fMTJSR0dCLCAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzEyQlBQX1JHR0J9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xMkJHR1IsICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTJCUFBfQkdHUn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzE0R0JSRywgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xNEJQUF9HQlJHfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1FDT01fMTRHUkJHLCAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzE0QlBQX0dSQkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV8xNFJHR0IsICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTRCUFBfUkdHQn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzE0QkdHUiwgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xNEJQUF9CR0dSfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfOEdCUkcsICAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzhCUFBfR0JSR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9NSVBJXzhHUkJHLCAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV84QlBQX0dSQkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfTUlQSV84UkdHQiwgICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfOEJQUF9SR0dCfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfOEJHR1IsICAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzhCUFBfQkdHUn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9NSVBJXzEwR0JSRywgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xMEJQUF9HQlJHfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTBHUkJHLCAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEwQlBQX0dSQkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfTUlQSV8xMFJHR0IsICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTBCUFBfUkdHQn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9NSVBJXzEwQkdHUiwgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xMEJQUF9CR0dSfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTJHQlJHLCAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEyQlBQX0dCUkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfTUlQSV8xMkdSQkcsICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTJCUFBfR1JCR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9NSVBJXzEyUkdHQiwgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xMkJQUF9SR0dCfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTJCR0dSLCAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEyQlBQX0JHR1J9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfTUlQSV8xNEdCUkcsICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTRCUFBfR0JSR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9NSVBJXzE0R1JCRywgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xNEJQUF9HUkJHfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTRSR0dCLCAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzE0QlBQX1JHR0J9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfTUlQSV8xNEJHR1IsICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTRCUFBfQkdHUn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjhfOEdCUkcsICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU44XzhCUFBfR0JSR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjhfOEdSQkcsICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU44XzhCUFBfR1JCR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjhfOFJHR0IsICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU44XzhCUFBfUkdHQn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjhfOEJHR1IsICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU44XzhCUFBfQkdHUn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjE2XzhHQlJHLCAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU4xNl84QlBQX0dCUkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUExBSU4xNl84R1JCRywgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOMTZfOEJQUF9HUkJHfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfOFJHR0IsICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzhCUFBfUkdHQn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjE2XzhCR0dSLCAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU4xNl84QlBQX0JHR1J9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUExBSU4xNl8xMEdCUkcsIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOMTZfMTBCUFBfR0JSR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjE2XzEwR1JCRywgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU4xNl8xMEJQUF9HUkJHfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTBSR0dCLCBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzEwQlBQX1JHR0J9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUExBSU4xNl8xMEJHR1IsIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOMTZfMTBCUFBfQkdHUn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjE2XzEyR0JSRywgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU4xNl8xMkJQUF9HQlJHfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTJHUkJHLCBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzEyQlBQX0dSQkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUExBSU4xNl8xMlJHR0IsIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOMTZfMTJCUFBfUkdHQn0sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjE2XzEyQkdHUiwgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU4xNl8xMkJQUF9CR0dSfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTRHQlJHLCBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzE0QlBQX0dCUkd9LAorICAgIHtRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUExBSU4xNl8xNEdSQkcsIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOMTZfMTRCUFBfR1JCR30sCisgICAge1FDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjE2XzE0UkdHQiwgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU4xNl8xNEJQUF9SR0dCfSwKKyAgICB7UUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTRCR0dSLCBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzE0QlBQX0JHR1J9Cit9OworCitjb25zdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYU1hcDxjYW1fZm9jdXNfbW9kZV90eXBlPgorICAgICAgICBRQ2FtZXJhUGFyYW1ldGVyczo6Rk9DVVNfTU9ERVNfTUFQW10gPSB7CisgICAgeyBGT0NVU19NT0RFX0FVVE8sICAgICAgICAgICAgICAgQ0FNX0ZPQ1VTX01PREVfQVVUTyB9LAorICAgIHsgRk9DVVNfTU9ERV9JTkZJTklUWSwgICAgICAgICAgIENBTV9GT0NVU19NT0RFX0lORklOSVRZIH0sCisgICAgeyBGT0NVU19NT0RFX01BQ1JPLCAgICAgICAgICAgICAgQ0FNX0ZPQ1VTX01PREVfTUFDUk8gfSwKKyAgICB7IEZPQ1VTX01PREVfRklYRUQsICAgICAgICAgICAgICBDQU1fRk9DVVNfTU9ERV9GSVhFRCB9LAorICAgIHsgRk9DVVNfTU9ERV9FRE9GLCAgICAgICAgICAgICAgIENBTV9GT0NVU19NT0RFX0VET0YgfSwKKyAgICB7IEZPQ1VTX01PREVfQ09OVElOVU9VU19QSUNUVVJFLCBDQU1fRk9DVVNfTU9ERV9DT05USU5PVVNfUElDVFVSRSB9LAorICAgIHsgRk9DVVNfTU9ERV9DT05USU5VT1VTX1ZJREVPLCAgIENBTV9GT0NVU19NT0RFX0NPTlRJTk9VU19WSURFTyB9LAorICAgIHsgRk9DVVNfTU9ERV9NQU5VQUxfUE9TSVRJT04sICAgIENBTV9GT0NVU19NT0RFX01BTlVBTH0sCit9OworCitjb25zdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYU1hcDxjYW1fZWZmZWN0X21vZGVfdHlwZT4KKyAgICAgICAgUUNhbWVyYVBhcmFtZXRlcnM6OkVGRkVDVF9NT0RFU19NQVBbXSA9IHsKKyAgICB7IEVGRkVDVF9OT05FLCAgICAgICBDQU1fRUZGRUNUX01PREVfT0ZGIH0sCisgICAgeyBFRkZFQ1RfTU9OTywgICAgICAgQ0FNX0VGRkVDVF9NT0RFX01PTk8gfSwKKyAgICB7IEVGRkVDVF9ORUdBVElWRSwgICBDQU1fRUZGRUNUX01PREVfTkVHQVRJVkUgfSwKKyAgICB7IEVGRkVDVF9TT0xBUklaRSwgICBDQU1fRUZGRUNUX01PREVfU09MQVJJWkUgfSwKKyAgICB7IEVGRkVDVF9TRVBJQSwgICAgICBDQU1fRUZGRUNUX01PREVfU0VQSUEgfSwKKyAgICB7IEVGRkVDVF9QT1NURVJJWkUsICBDQU1fRUZGRUNUX01PREVfUE9TVEVSSVpFIH0sCisgICAgeyBFRkZFQ1RfV0hJVEVCT0FSRCwgQ0FNX0VGRkVDVF9NT0RFX1dISVRFQk9BUkQgfSwKKyAgICB7IEVGRkVDVF9CTEFDS0JPQVJELCBDQU1fRUZGRUNUX01PREVfQkxBQ0tCT0FSRCB9LAorICAgIHsgRUZGRUNUX0FRVUEsICAgICAgIENBTV9FRkZFQ1RfTU9ERV9BUVVBIH0sCisgICAgeyBFRkZFQ1RfRU1CT1NTLCAgICAgQ0FNX0VGRkVDVF9NT0RFX0VNQk9TUyB9LAorICAgIHsgRUZGRUNUX1NLRVRDSCwgICAgIENBTV9FRkZFQ1RfTU9ERV9TS0VUQ0ggfSwKKyAgICB7IEVGRkVDVF9ORU9OLCAgICAgICBDQU1fRUZGRUNUX01PREVfTkVPTiB9LAorICAgIHsgRUZGRUNUX0JFQVVUWSwgICAgIENBTV9FRkZFQ1RfTU9ERV9CRUFVVFkgfQorfTsKKworY29uc3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFNYXA8Y2FtX3NjZW5lX21vZGVfdHlwZT4KKyAgICAgICAgUUNhbWVyYVBhcmFtZXRlcnM6OlNDRU5FX01PREVTX01BUFtdID0geworICAgIHsgU0NFTkVfTU9ERV9BVVRPLCAgICAgICAgICAgQ0FNX1NDRU5FX01PREVfT0ZGIH0sCisgICAgeyBTQ0VORV9NT0RFX0FDVElPTiwgICAgICAgICBDQU1fU0NFTkVfTU9ERV9BQ1RJT04gfSwKKyAgICB7IFNDRU5FX01PREVfUE9SVFJBSVQsICAgICAgIENBTV9TQ0VORV9NT0RFX1BPUlRSQUlUIH0sCisgICAgeyBTQ0VORV9NT0RFX0xBTkRTQ0FQRSwgICAgICBDQU1fU0NFTkVfTU9ERV9MQU5EU0NBUEUgfSwKKyAgICB7IFNDRU5FX01PREVfTklHSFQsICAgICAgICAgIENBTV9TQ0VORV9NT0RFX05JR0hUIH0sCisgICAgeyBTQ0VORV9NT0RFX05JR0hUX1BPUlRSQUlULCBDQU1fU0NFTkVfTU9ERV9OSUdIVF9QT1JUUkFJVCB9LAorICAgIHsgU0NFTkVfTU9ERV9USEVBVFJFLCAgICAgICAgQ0FNX1NDRU5FX01PREVfVEhFQVRSRSB9LAorICAgIHsgU0NFTkVfTU9ERV9CRUFDSCwgICAgICAgICAgQ0FNX1NDRU5FX01PREVfQkVBQ0ggfSwKKyAgICB7IFNDRU5FX01PREVfU05PVywgICAgICAgICAgIENBTV9TQ0VORV9NT0RFX1NOT1cgfSwKKyAgICB7IFNDRU5FX01PREVfU1VOU0VULCAgICAgICAgIENBTV9TQ0VORV9NT0RFX1NVTlNFVCB9LAorICAgIHsgU0NFTkVfTU9ERV9TVEVBRFlQSE9UTywgICAgQ0FNX1NDRU5FX01PREVfQU5USVNIQUtFIH0sCisgICAgeyBTQ0VORV9NT0RFX0ZJUkVXT1JLUyAsICAgICBDQU1fU0NFTkVfTU9ERV9GSVJFV09SS1MgfSwKKyAgICB7IFNDRU5FX01PREVfU1BPUlRTICwgICAgICAgIENBTV9TQ0VORV9NT0RFX1NQT1JUUyB9LAorICAgIHsgU0NFTkVfTU9ERV9QQVJUWSwgICAgICAgICAgQ0FNX1NDRU5FX01PREVfUEFSVFkgfSwKKyAgICB7IFNDRU5FX01PREVfQ0FORExFTElHSFQsICAgIENBTV9TQ0VORV9NT0RFX0NBTkRMRUxJR0hUIH0sCisgICAgeyBTQ0VORV9NT0RFX0FTRCwgICAgICAgICAgICBDQU1fU0NFTkVfTU9ERV9BVVRPIH0sCisgICAgeyBTQ0VORV9NT0RFX0JBQ0tMSUdIVCwgICAgICBDQU1fU0NFTkVfTU9ERV9CQUNLTElHSFQgfSwKKyAgICB7IFNDRU5FX01PREVfRkxPV0VSUywgICAgICAgIENBTV9TQ0VORV9NT0RFX0ZMT1dFUlMgfSwKKyAgICB7IFNDRU5FX01PREVfQVIsICAgICAgICAgICAgIENBTV9TQ0VORV9NT0RFX0FSIH0sCisgICAgeyBTQ0VORV9NT0RFX0hEUiwgICAgICAgICAgICBDQU1fU0NFTkVfTU9ERV9IRFIgfSwKK307CisKK2NvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhTWFwPGNhbV9mbGFzaF9tb2RlX3Q+CisgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFU19NQVBbXSA9IHsKKyAgICB7IEZMQVNIX01PREVfT0ZGLCAgIENBTV9GTEFTSF9NT0RFX09GRiB9LAorICAgIHsgRkxBU0hfTU9ERV9BVVRPLCAgQ0FNX0ZMQVNIX01PREVfQVVUTyB9LAorICAgIHsgRkxBU0hfTU9ERV9PTiwgICAgQ0FNX0ZMQVNIX01PREVfT04gfSwKKyAgICB7IEZMQVNIX01PREVfVE9SQ0gsIENBTV9GTEFTSF9NT0RFX1RPUkNIIH0KK307CisKK2NvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhTWFwPGNhbV9mb2N1c19hbGdvcml0aG1fdHlwZT4KKyAgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpGT0NVU19BTEdPX01BUFtdID0geworICAgIHsgRk9DVVNfQUxHT19BVVRPLCAgICAgICAgICAgIENBTV9GT0NVU19BTEdPX0FVVE8gfSwKKyAgICB7IEZPQ1VTX0FMR09fU1BPVF9NRVRFUklORywgICBDQU1fRk9DVVNfQUxHT19TUE9UIH0sCisgICAgeyBGT0NVU19BTEdPX0NFTlRFUl9XRUlHSFRFRCwgQ0FNX0ZPQ1VTX0FMR09fQ0VOVEVSX1dFSUdIVEVEIH0sCisgICAgeyBGT0NVU19BTEdPX0ZSQU1FX0FWRVJBR0UsICAgQ0FNX0ZPQ1VTX0FMR09fQVZFUkFHRSB9Cit9OworCitjb25zdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYU1hcDxjYW1fd2JfbW9kZV90eXBlPgorICAgICAgICBRQ2FtZXJhUGFyYW1ldGVyczo6V0hJVEVfQkFMQU5DRV9NT0RFU19NQVBbXSA9IHsKKyAgICB7IFdISVRFX0JBTEFOQ0VfQVVUTywgICAgICAgICAgICBDQU1fV0JfTU9ERV9BVVRPIH0sCisgICAgeyBXSElURV9CQUxBTkNFX0lOQ0FOREVTQ0VOVCwgICAgQ0FNX1dCX01PREVfSU5DQU5ERVNDRU5UIH0sCisgICAgeyBXSElURV9CQUxBTkNFX0ZMVU9SRVNDRU5ULCAgICAgQ0FNX1dCX01PREVfRkxVT1JFU0NFTlQgfSwKKyAgICB7IFdISVRFX0JBTEFOQ0VfV0FSTV9GTFVPUkVTQ0VOVCxDQU1fV0JfTU9ERV9XQVJNX0ZMVU9SRVNDRU5UfSwKKyAgICB7IFdISVRFX0JBTEFOQ0VfREFZTElHSFQsICAgICAgICBDQU1fV0JfTU9ERV9EQVlMSUdIVCB9LAorICAgIHsgV0hJVEVfQkFMQU5DRV9DTE9VRFlfREFZTElHSFQsIENBTV9XQl9NT0RFX0NMT1VEWV9EQVlMSUdIVCB9LAorICAgIHsgV0hJVEVfQkFMQU5DRV9UV0lMSUdIVCwgICAgICAgIENBTV9XQl9NT0RFX1RXSUxJR0hUIH0sCisgICAgeyBXSElURV9CQUxBTkNFX1NIQURFLCAgICAgICAgICAgQ0FNX1dCX01PREVfU0hBREUgfSwKKyAgICB7IFdISVRFX0JBTEFOQ0VfTUFOVUFMLCAgICAgICAgICBDQU1fV0JfTU9ERV9NQU5VQUx9LAorfTsKKworY29uc3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFNYXA8Y2FtX2FudGliYW5kaW5nX21vZGVfdHlwZT4KKyAgICAgICAgUUNhbWVyYVBhcmFtZXRlcnM6OkFOVElCQU5ESU5HX01PREVTX01BUFtdID0geworICAgIHsgQU5USUJBTkRJTkdfT0ZGLCAgQ0FNX0FOVElCQU5ESU5HX01PREVfT0ZGIH0sCisgICAgeyBBTlRJQkFORElOR181MEhaLCBDQU1fQU5USUJBTkRJTkdfTU9ERV81MEhaIH0sCisgICAgeyBBTlRJQkFORElOR182MEhaLCBDQU1fQU5USUJBTkRJTkdfTU9ERV82MEhaIH0sCisgICAgeyBBTlRJQkFORElOR19BVVRPLCBDQU1fQU5USUJBTkRJTkdfTU9ERV9BVVRPIH0KK307CisKK2NvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhTWFwPGNhbV9pc29fbW9kZV90eXBlPgorICAgICAgICBRQ2FtZXJhUGFyYW1ldGVyczo6SVNPX01PREVTX01BUFtdID0geworICAgIHsgSVNPX0FVVE8sICBDQU1fSVNPX01PREVfQVVUTyB9LAorICAgIHsgSVNPX0hKUiwgICBDQU1fSVNPX01PREVfREVCTFVSIH0sCisgICAgeyBJU09fMTAwLCAgIENBTV9JU09fTU9ERV8xMDAgfSwKKyAgICB7IElTT18yMDAsICAgQ0FNX0lTT19NT0RFXzIwMCB9LAorICAgIHsgSVNPXzQwMCwgICBDQU1fSVNPX01PREVfNDAwIH0sCisgICAgeyBJU09fODAwLCAgIENBTV9JU09fTU9ERV84MDAgfSwKKyAgICB7IElTT18xNjAwLCAgQ0FNX0lTT19NT0RFXzE2MDAgfSwKKyAgICB7IElTT18zMjAwLCAgQ0FNX0lTT19NT0RFXzMyMDAgfQorfTsKKworY29uc3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFNYXA8Y2FtX2hmcl9tb2RlX3Q+CisgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpIRlJfTU9ERVNfTUFQW10gPSB7CisgICAgeyBWSURFT19IRlJfT0ZGLCBDQU1fSEZSX01PREVfT0ZGIH0sCisgICAgeyBWSURFT19IRlJfMlgsIENBTV9IRlJfTU9ERV82MEZQUyB9LAorICAgIHsgVklERU9fSEZSXzNYLCBDQU1fSEZSX01PREVfOTBGUFMgfSwKKyAgICB7IFZJREVPX0hGUl80WCwgQ0FNX0hGUl9NT0RFXzEyMEZQUyB9LAorICAgIHsgVklERU9fSEZSXzVYLCBDQU1fSEZSX01PREVfMTUwRlBTIH0sCisgICAgeyBWSURFT19IRlJfNlgsIENBTV9IRlJfTU9ERV8xODBGUFMgfSwKKyAgICB7IFZJREVPX0hGUl83WCwgQ0FNX0hGUl9NT0RFXzIxMEZQUyB9LAorICAgIHsgVklERU9fSEZSXzhYLCBDQU1fSEZSX01PREVfMjQwRlBTIH0sCisgICAgeyBWSURFT19IRlJfOVgsIENBTV9IRlJfTU9ERV80ODBGUFMgfQorfTsKKworY29uc3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFNYXA8Y2FtX2JyYWNrZXRfbW9kZT4KKyAgICAgICAgUUNhbWVyYVBhcmFtZXRlcnM6OkJSQUNLRVRJTkdfTU9ERVNfTUFQW10gPSB7CisgICAgeyBBRV9CUkFDS0VUX09GRiwgQ0FNX0VYUF9CUkFDS0VUSU5HX09GRiB9LAorICAgIHsgQUVfQlJBQ0tFVCwgICAgIENBTV9FWFBfQlJBQ0tFVElOR19PTiB9Cit9OworCitjb25zdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYU1hcDxpbnQ+CisgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpPTl9PRkZfTU9ERVNfTUFQW10gPSB7CisgICAgeyBWQUxVRV9PRkYsIDAgfSwKKyAgICB7IFZBTFVFX09OLCAgMSB9Cit9OworCitjb25zdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYU1hcDxpbnQ+CisgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpUT1VDSF9BRl9BRUNfTU9ERVNfTUFQW10gPSB7CisgICAgeyBRQ2FtZXJhUGFyYW1ldGVyczo6VE9VQ0hfQUZfQUVDX09GRiwgMCB9LAorICAgIHsgUUNhbWVyYVBhcmFtZXRlcnM6OlRPVUNIX0FGX0FFQ19PTiwgMSB9Cit9OworCitjb25zdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYU1hcDxpbnQ+CisgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpFTkFCTEVfRElTQUJMRV9NT0RFU19NQVBbXSA9IHsKKyAgICB7IFZBTFVFX0VOQUJMRSwgIDEgfSwKKyAgICB7IFZBTFVFX0RJU0FCTEUsIDAgfQorfTsKKworY29uc3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFNYXA8aW50PgorICAgICAgICBRQ2FtZXJhUGFyYW1ldGVyczo6REVOT0lTRV9PTl9PRkZfTU9ERVNfTUFQW10gPSB7CisgICAgeyBERU5PSVNFX09GRiwgMCB9LAorICAgIHsgREVOT0lTRV9PTiwgIDEgfQorfTsKKworY29uc3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFNYXA8aW50PgorICAgICAgICBRQ2FtZXJhUGFyYW1ldGVyczo6VFJVRV9GQUxTRV9NT0RFU19NQVBbXSA9IHsKKyAgICB7IFZBTFVFX0ZBTFNFLCAwfSwKKyAgICB7IFZBTFVFX1RSVUUsICAxfQorfTsKKworY29uc3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFNYXA8Y2FtX2ZsaXBfdD4KKyAgICAgICAgUUNhbWVyYVBhcmFtZXRlcnM6OkZMSVBfTU9ERVNfTUFQW10gPSB7CisgICAge0ZMSVBfTU9ERV9PRkYsIEZMSVBfTk9ORX0sCisgICAge0ZMSVBfTU9ERV9WLCBGTElQX1Z9LAorICAgIHtGTElQX01PREVfSCwgRkxJUF9IfSwKKyAgICB7RkxJUF9NT0RFX1ZILCBGTElQX1ZfSH0KK307CisKK2NvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhTWFwPGludD4KKyAgICAgICAgUUNhbWVyYVBhcmFtZXRlcnM6OkFGX0JSQUNLRVRJTkdfTU9ERVNfTUFQW10gPSB7CisgICAgeyBBRl9CUkFDS0VUX09GRiwgMCB9LAorICAgIHsgQUZfQlJBQ0tFVF9PTiwgIDEgfQorfTsKKworY29uc3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFNYXA8aW50PgorICAgICAgICBRQ2FtZXJhUGFyYW1ldGVyczo6UkVfRk9DVVNfTU9ERVNfTUFQW10gPSB7CisgICAgeyBSRV9GT0NVU19PRkYsIDAgfSwKKyAgICB7IFJFX0ZPQ1VTX09OLCAgMSB9Cit9OworCitjb25zdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYU1hcDxpbnQ+CisgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpDSFJPTUFfRkxBU0hfTU9ERVNfTUFQW10gPSB7CisgICAgeyBDSFJPTUFfRkxBU0hfT0ZGLCAwIH0sCisgICAgeyBDSFJPTUFfRkxBU0hfT04sICAxIH0KK307CisKK2NvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhTWFwPGludD4KKyAgICAgICAgUUNhbWVyYVBhcmFtZXRlcnM6Ok9QVElfWk9PTV9NT0RFU19NQVBbXSA9IHsKKyAgICB7IE9QVElfWk9PTV9PRkYsIDAgfSwKKyAgICB7IE9QVElfWk9PTV9PTiwgIDEgfQorfTsKKworY29uc3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFNYXA8aW50PgorICAgICAgICBRQ2FtZXJhUGFyYW1ldGVyczo6VFJVRV9QT1JUUkFJVF9NT0RFU19NQVBbXSA9IHsKKyAgICB7IFRSVUVfUE9SVFJBSVRfT0ZGLCAwIH0sCisgICAgeyBUUlVFX1BPUlRSQUlUX09OLCAgMSB9Cit9OworCitjb25zdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYU1hcDxpbnQ+CisgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpTVElMTF9NT1JFX01PREVTX01BUFtdID0geworICAgIHsgU1RJTExfTU9SRV9PRkYsIDAgfSwKKyAgICB7IFNUSUxMX01PUkVfT04sICAxIH0KK307CisKK2NvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhTWFwPGNhbV9jZHNfbW9kZV90eXBlX3Q+CisgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpDRFNfTU9ERVNfTUFQW10gPSB7CisgICAgeyBDRFNfTU9ERV9PRkYsIENBTV9DRFNfTU9ERV9PRkYgfSwKKyAgICB7IENEU19NT0RFX09OLCBDQU1fQ0RTX01PREVfT04gfSwKKyAgICB7IENEU19NT0RFX0FVVE8sIENBTV9DRFNfTU9ERV9BVVRPfQorfTsKKworY29uc3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFNYXA8aW50PgorICAgICAgICBRQ2FtZXJhUGFyYW1ldGVyczo6SERSX01PREVTX01BUFtdID0geworICAgIHsgSERSX01PREVfU0VOU09SLCAwIH0sCisgICAgeyBIRFJfTU9ERV9NVUxUSV9GUkFNRSwgMSB9Cit9OworCitjb25zdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYU1hcDxpbnQ+CisgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpWSURFT19ST1RBVElPTl9NT0RFU19NQVBbXSA9IHsKKyAgICB7IFZJREVPX1JPVEFUSU9OXzAsIDAgfSwKKyAgICB7IFZJREVPX1JPVEFUSU9OXzkwLCA5MCB9LAorICAgIHsgVklERU9fUk9UQVRJT05fMTgwLCAxODAgfSwKKyAgICB7IFZJREVPX1JPVEFUSU9OXzI3MCwgMjcwIH0KK307CisKK2NvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhTWFwPGludD4KKyAgICAgICAgUUNhbWVyYVBhcmFtZXRlcnM6Ok5PSVNFX1JFRFVDVElPTl9NT0RFU19NQVBbXSA9IHsKKyAgICB7IFZBTFVFX09GRiwgMCB9LAorICAgIHsgVkFMVUVfRkFTVCwgIDEgfSwKKyAgICB7IFZBTFVFX0hJR0hfUVVBTElUWSwgIDIgfQorfTsKKworI2RlZmluZSBERUZBVUxUX0NBTUVSQV9BUkVBICIoMCwgMCwgMCwgMCwgMCkiCisjZGVmaW5lIERBVEFfUFRSKE1FTV9PQkosSU5ERVgpIE1FTV9PQkotPmdldFB0ciggSU5ERVggKQorI2RlZmluZSBUT1RBTF9SQU1fU0laRV81MTJNQiA1MzY4NzA5MTIKKyNkZWZpbmUgUEFSQU1fTUFQX1NJWkUoTUFQKSAoc2l6ZW9mKE1BUCkvc2l6ZW9mKE1BUFswXSkpCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNPRU1GZWF0MVByb3BFbmFibGVkCisgKgorICogREVTQ1JJUFRJT046IGlubGluZSBmdW5jdGlvbiB0byBjaGVjayBmcm9tIHByb3BlcnR5IGlmIGN1c3RvbSBmZWF0dXJlCisgKiAgICAgICAgICAgIGlzIGVuYWJsZWQKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBib29sZWFuIHRydWUvZmFsc2UKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGlubGluZSBib29sIGlzT0VNRmVhdDFQcm9wRW5hYmxlZCgpCit7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuaW1nbGliLm9lbWZlYXQxIiwgdmFsdWUsICIwIik7CisgICAgcmV0dXJuIGF0b2kodmFsdWUpID4gMCA/IHRydWUgOiBmYWxzZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhUGFyYW1ldGVycworICoKKyAqIERFU0NSSVBUSU9OOiBkZWZhdWx0IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmFQYXJhbWV0ZXJzCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYVBhcmFtZXRlcnMoKQorICAgIDogQ2FtZXJhUGFyYW1ldGVycygpLAorICAgICAgbV9yZXByb2NTY2FsZVBhcmFtKCksCisgICAgICBtQ29tbW9uKCksCisgICAgICBtX3BDYXBhYmlsaXR5KE5VTEwpLAorICAgICAgbV9wQ2FtT3BzVGJsKE5VTEwpLAorICAgICAgbV9wUGFyYW1IZWFwKE5VTEwpLAorICAgICAgbV9wUGFyYW1CdWYoTlVMTCksCisgICAgICBtX3BSZWxDYW1TeW5jSGVhcChOVUxMKSwKKyAgICAgIG1fcFJlbENhbVN5bmNCdWYoTlVMTCksCisgICAgICBtX2JGcmFtZVN5bmNFbmFibGVkKGZhbHNlKSwKKyAgICAgIG1Jc1R5cGVWaWRlbyhJU19UWVBFX05PTkUpLAorICAgICAgbUlzVHlwZVByZXZpZXcoSVNfVFlQRV9OT05FKSwKKyAgICAgIG1fYlpzbE1vZGUoZmFsc2UpLAorICAgICAgbV9iWnNsTW9kZV9uZXcoZmFsc2UpLAorICAgICAgbV9iRm9yY2Vac2xNb2RlKGZhbHNlKSwKKyAgICAgIG1fYlJlY29yZGluZ0hpbnQoZmFsc2UpLAorICAgICAgbV9iUmVjb3JkaW5nSGludF9uZXcoZmFsc2UpLAorICAgICAgbV9iSGlzdG9ncmFtRW5hYmxlZChmYWxzZSksCisgICAgICBtX2JMb25nc2hvdEVuYWJsZWQoZmFsc2UpLAorICAgICAgbV9uRmFjZVByb2NNYXNrKDApLAorICAgICAgbV9iRmFjZURldGVjdGlvbk9uKDApLAorICAgICAgbV9iRGVidWdGcHMoZmFsc2UpLAorICAgICAgbUZvY3VzTW9kZShDQU1fRk9DVVNfTU9ERV9NQVgpLAorICAgICAgbVByZXZpZXdGb3JtYXQoQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjEpLAorICAgICAgbUFwcFByZXZpZXdGb3JtYXQoQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjEpLAorICAgICAgbVBpY3R1cmVGb3JtYXQoQ0FNX0ZPUk1BVF9KUEVHKSwKKyAgICAgIG1fYk5lZWRSZXN0YXJ0KGZhbHNlKSwKKyAgICAgIG1fYk5vRGlzcGxheU1vZGUoZmFsc2UpLAorICAgICAgbV9iV05ST24oZmFsc2UpLAorICAgICAgbV9iVE5SUHJldmlld09uKGZhbHNlKSwKKyAgICAgIG1fYlROUlZpZGVvT24oZmFsc2UpLAorICAgICAgbV9iVE5SU25hcHNob3RPbihmYWxzZSksCisgICAgICBtX2JJbml0ZWQoZmFsc2UpLAorICAgICAgbV9uUmV0cm9CdXJzdE51bSgwKSwKKyAgICAgIG1fbkJ1cnN0TEVET25QZXJpb2QoMTAwKSwKKyAgICAgIG1fYlVwZGF0ZUVmZmVjdHMoZmFsc2UpLAorICAgICAgbV9iU2NlbmVUcmFuc2l0aW9uQXV0byhmYWxzZSksCisgICAgICBtX2JQcmV2aWV3RmxpcENoYW5nZWQoZmFsc2UpLAorICAgICAgbV9iVmlkZW9GbGlwQ2hhbmdlZChmYWxzZSksCisgICAgICBtX2JTbmFwc2hvdEZsaXBDaGFuZ2VkKGZhbHNlKSwKKyAgICAgIG1fYkZpeGVkRnJhbWVSYXRlU2V0KGZhbHNlKSwKKyAgICAgIG1fYkhEUkVuYWJsZWQoZmFsc2UpLAorICAgICAgbV9iTG9jYWxIRFJFbmFibGVkKGZhbHNlKSwKKyAgICAgIG1fYkFWVGltZXJFbmFibGVkKGZhbHNlKSwKKyAgICAgIG1fYkRJU0VuYWJsZWQoZmFsc2UpLAorICAgICAgbV9iTWV0YVJhd0VuYWJsZWQoZmFsc2UpLAorICAgICAgbV9Nb2JpTWFzaygwKSwKKyAgICAgIG1fQWRqdXN0RlBTKE5VTEwpLAorICAgICAgbV9iSERSMXhGcmFtZUVuYWJsZWQoZmFsc2UpLAorICAgICAgbV9IRFJTY2VuZUVuYWJsZWQoZmFsc2UpLAorICAgICAgbV9iSERSVGh1bWJuYWlsUHJvY2Vzc05lZWRlZChmYWxzZSksCisgICAgICBtX2JIRFIxeEV4dHJhQnVmZmVyTmVlZGVkKHRydWUpLAorICAgICAgbV9iSERST3V0cHV0Q3JvcEVuYWJsZWQoZmFsc2UpLAorICAgICAgbV90ZW1wTWFwKCksCisgICAgICBtX2JBRkJyYWNrZXRpbmdPbihmYWxzZSksCisgICAgICBtX2JSZUZvY3VzT24oZmFsc2UpLAorICAgICAgbV9iQ2hyb21hRmxhc2hPbihmYWxzZSksCisgICAgICBtX2JPcHRpWm9vbU9uKGZhbHNlKSwKKyAgICAgIG1fYlNjZW5lU2VsZWN0aW9uKGZhbHNlKSwKKyAgICAgIG1fU2VsZWN0ZWRTY2VuZShDQU1fU0NFTkVfTU9ERV9NQVgpLAorICAgICAgbV9iU2VlTW9yZU9uKGZhbHNlKSwKKyAgICAgIG1fYlN0aWxsTW9yZU9uKGZhbHNlKSwKKyAgICAgIG1fYkhpZ2hRdWFsaXR5Tm9pc2VSZWR1Y3Rpb25Nb2RlKGZhbHNlKSwKKyAgICAgIG1fYkhmck1vZGUoZmFsc2UpLAorICAgICAgbV9iU2Vuc29ySERSRW5hYmxlZChmYWxzZSksCisgICAgICBtX2JSZGlNb2RlKGZhbHNlKSwKKyAgICAgIG1fYlNlY3VyZU1vZGUoZmFsc2UpLAorICAgICAgbV9iQWVCcmFja2V0aW5nRW5hYmxlZChmYWxzZSksCisgICAgICBtRmxhc2hWYWx1ZShDQU1fRkxBU0hfTU9ERV9PRkYpLAorICAgICAgbUZsYXNoRGFlbW9uVmFsdWUoQ0FNX0ZMQVNIX01PREVfT0ZGKSwKKyAgICAgIG1IZnJNb2RlKENBTV9IRlJfTU9ERV9PRkYpLAorICAgICAgbV9iSERSTW9kZVNlbnNvcih0cnVlKSwKKyAgICAgIG1PZmZsaW5lUkFXKGZhbHNlKSwKKyAgICAgIG1fYlRydWVQb3J0cmFpdE9uKGZhbHNlKSwKKyAgICAgIG1fYklzTG93TWVtb3J5RGV2aWNlKGZhbHNlKSwKKyAgICAgIG1DZHNfbW9kZShDQU1fQ0RTX01PREVfT0ZGKSwKKyAgICAgIG1fTExDYXB0dXJlRW5hYmxlZChGQUxTRSksCisgICAgICBtX0xvd0xpZ2h0TGV2ZWwoQ0FNX0xPV19MSUdIVF9PRkYpLAorICAgICAgbV9iTHRtRm9yU2VlTW9yZUVuYWJsZWQoZmFsc2UpLAorICAgICAgbV9leHBUaW1lKDApLAorICAgICAgbV9pc29WYWx1ZSgwKSwKKyAgICAgIG1fTWFudWFsQ2FwdHVyZU1vZGUoQ0FNX01BTlVBTF9DQVBUVVJFX1RZUEVfT0ZGKSwKKyAgICAgIG1fZHVhbExlZENhbGlicmF0aW9uKDApLAorICAgICAgbV9iSW5zdGFudEFFQyhmYWxzZSksCisgICAgICBtX2JJbnN0YW50Q2FwdHVyZShmYWxzZSksCisgICAgICBtQWVjRnJhbWVCb3VuZCgwKSwKKyAgICAgIG1BZWNTa2lwRGlzcGxheUZyYW1lQm91bmQoMCksCisgICAgICBtX2JRdWFkcmFDZmEoZmFsc2UpCit7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIC8vIFRPRE86IG1heSBtb3ZlIHRvIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHN5c3Byb3AKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuZGVidWcuc2Yuc2hvd2ZwcyIsIHZhbHVlLCAiMCIpOworICAgIG1fYkRlYnVnRnBzID0gYXRvaSh2YWx1ZSkgPiAwID8gdHJ1ZSA6IGZhbHNlOworCisgICAgLy8gRm9yIHRoZXJtYWwgbW9kZSwgaXQgc2hvdWxkIGJlIHNldCBhcyBzeXN0ZW0gcHJvcGVydHkKKyAgICAvLyBiZWNhdXNlIHN5c3RlbSBwcm9wZXJ0eSBhcHBsaWVzIHRvIGFsbCBhcHBsaWNhdGlvbnMsIHdoaWxlCisgICAgLy8gcGFyYW1ldGVycyBvbmx5IGFwcGx5IHRvIHNwZWNpZmljIGFwcC4KKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnRoZXJtYWwubW9kZSIsIHZhbHVlLCAiZnBzIik7CisgICAgaWYgKCFzdHJjbXAodmFsdWUsICJmcmFtZXNraXAiKSkgeworICAgICAgICBtX1RoZXJtYWxNb2RlID0gUUNBTUVSQV9USEVSTUFMX0FESlVTVF9GUkFNRVNLSVA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN0cmNtcCh2YWx1ZSwgImZwcyIpKQorICAgICAgICAgICAgTE9HVygiSW52YWxpZCBjYW1lcmEgdGhlcm1hbCBtb2RlICVzIiwgdmFsdWUpOworICAgICAgICBtX1RoZXJtYWxNb2RlID0gUUNBTUVSQV9USEVSTUFMX0FESlVTVF9GUFM7CisgICAgfQorCisgICAgbWVtc2V0KHZhbHVlLCAwLCBzaXplb2YodmFsdWUpKTsKKyAgICAvLyBBcyBwZXIgUG93ZXIvUXVhbGl0eSBldmFsdWF0aW9uLCBMVE0gaXMgZW5hYmxlZCBieSBkZWZhdWx0IGluIFNlZU1vcmUvU3RpbGxNb3JlIHVzZWNhc2UKKyAgICAvLyB0byBpbXByb3ZlIHRoZSBxdWFsaXR5IGFzIHRoZXJlIGlzIG5vIG11Y2ggaW1wYWN0IHRvIHBvd2VyCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5sdG1mb3JzZWVtb3JlIiwgdmFsdWUsICIxIik7CisgICAgbV9iTHRtRm9yU2VlTW9yZUVuYWJsZWQgPSBhdG9pKHZhbHVlKTsKKworICAgIG1lbXNldCgmbV9MaXZlU25hcHNob3RTaXplLCAwLCBzaXplb2YobV9MaXZlU25hcHNob3RTaXplKSk7CisgICAgbWVtc2V0KCZtX2RlZmF1bHRfZnBzX3JhbmdlLCAwLCBzaXplb2YobV9kZWZhdWx0X2Zwc19yYW5nZSkpOworICAgIG1lbXNldCgmbV9oZnJGcHNSYW5nZSwgMCwgc2l6ZW9mKG1faGZyRnBzUmFuZ2UpKTsKKyAgICBtZW1zZXQoJm1fc3RpbGxtb3JlX2NvbmZpZywgMCwgc2l6ZW9mKGNhbV9zdGlsbF9tb3JlX3QpKTsKKyAgICBtZW1zZXQoJm1fY2FwdHVyZUZyYW1lQ29uZmlnLCAwLCBzaXplb2YoY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QpKTsKKyAgICBtZW1zZXQoJm1fcmVsQ2FtU3luY0luZm8sIDAsIHNpemVvZihjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KSk7CisgICAgbVRvdGFsUFBDb3VudCA9IDE7CisgICAgbVpvb21MZXZlbCA9IDA7CisgICAgbVBhcm1ab29tTGV2ZWwgPSAwOworICAgIG1DdXJQUENvdW50ID0gMDsKKyAgICBtQnVmQmF0Y2hDbnQgPSAwOworICAgIG1Sb3RhdGlvbiA9IDA7CisgICAgbUpwZWdSb3RhdGlvbiA9IDA7CisgICAgbVZpZGVvQmF0Y2hTaXplID0gMDsKKyAgICBtX2JPRU1GZWF0RW5hYmxlZCA9IGlzT0VNRmVhdDFQcm9wRW5hYmxlZCgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmFQYXJhbWV0ZXJzCisgKgorICogREVTQ1JJUFRJT046IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmFQYXJhbWV0ZXJzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogcGFyYW1ldGVycyBpbiBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYVBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCAmcGFyYW1zKQorICAgIDogQ2FtZXJhUGFyYW1ldGVycyhwYXJhbXMpLAorICAgIG1fcmVwcm9jU2NhbGVQYXJhbSgpLAorICAgIG1fcENhcGFiaWxpdHkoTlVMTCksCisgICAgbV9wQ2FtT3BzVGJsKE5VTEwpLAorICAgIG1fcFBhcmFtSGVhcChOVUxMKSwKKyAgICBtX3BQYXJhbUJ1ZihOVUxMKSwKKyAgICBtX3BSZWxDYW1TeW5jSGVhcChOVUxMKSwKKyAgICBtX3BSZWxDYW1TeW5jQnVmKE5VTEwpLAorICAgIG1fYkZyYW1lU3luY0VuYWJsZWQoZmFsc2UpLAorICAgIG1fYlpzbE1vZGUoZmFsc2UpLAorICAgIG1fYlpzbE1vZGVfbmV3KGZhbHNlKSwKKyAgICBtX2JGb3JjZVpzbE1vZGUoZmFsc2UpLAorICAgIG1fYlJlY29yZGluZ0hpbnQoZmFsc2UpLAorICAgIG1fYlJlY29yZGluZ0hpbnRfbmV3KGZhbHNlKSwKKyAgICBtX2JIaXN0b2dyYW1FbmFibGVkKGZhbHNlKSwKKyAgICBtX2JMb25nc2hvdEVuYWJsZWQoZmFsc2UpLAorICAgIG1fbkZhY2VQcm9jTWFzaygwKSwKKyAgICBtX2JEZWJ1Z0ZwcyhmYWxzZSksCisgICAgbUZvY3VzTW9kZShDQU1fRk9DVVNfTU9ERV9NQVgpLAorICAgIG1QcmV2aWV3Rm9ybWF0KENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxKSwKKyAgICBtQXBwUHJldmlld0Zvcm1hdChDQU1fRk9STUFUX1lVVl80MjBfTlYyMSksCisgICAgbVBpY3R1cmVGb3JtYXQoQ0FNX0ZPUk1BVF9KUEVHKSwKKyAgICBtX2JOZWVkUmVzdGFydChmYWxzZSksCisgICAgbV9iTm9EaXNwbGF5TW9kZShmYWxzZSksCisgICAgbV9iV05ST24oZmFsc2UpLAorICAgIG1fYlROUlByZXZpZXdPbihmYWxzZSksCisgICAgbV9iVE5SVmlkZW9PbihmYWxzZSksCisgICAgbV9iVE5SU25hcHNob3RPbihmYWxzZSksCisgICAgbV9iSW5pdGVkKGZhbHNlKSwKKyAgICBtX25SZXRyb0J1cnN0TnVtKDApLAorICAgIG1fbkJ1cnN0TEVET25QZXJpb2QoMTAwKSwKKyAgICBtX2JQcmV2aWV3RmxpcENoYW5nZWQoZmFsc2UpLAorICAgIG1fYlZpZGVvRmxpcENoYW5nZWQoZmFsc2UpLAorICAgIG1fYlNuYXBzaG90RmxpcENoYW5nZWQoZmFsc2UpLAorICAgIG1fYkZpeGVkRnJhbWVSYXRlU2V0KGZhbHNlKSwKKyAgICBtX2JIRFJFbmFibGVkKGZhbHNlKSwKKyAgICBtX2JMb2NhbEhEUkVuYWJsZWQoZmFsc2UpLAorICAgIG1fYkFWVGltZXJFbmFibGVkKGZhbHNlKSwKKyAgICBtX0FkanVzdEZQUyhOVUxMKSwKKyAgICBtX2JIRFIxeEZyYW1lRW5hYmxlZChmYWxzZSksCisgICAgbV9IRFJTY2VuZUVuYWJsZWQoZmFsc2UpLAorICAgIG1fYkhEUlRodW1ibmFpbFByb2Nlc3NOZWVkZWQoZmFsc2UpLAorICAgIG1fYkhEUjF4RXh0cmFCdWZmZXJOZWVkZWQodHJ1ZSksCisgICAgbV9iSERST3V0cHV0Q3JvcEVuYWJsZWQoZmFsc2UpLAorICAgIG1fdGVtcE1hcCgpLAorICAgIG1fYkFGQnJhY2tldGluZ09uKGZhbHNlKSwKKyAgICBtX2JSZUZvY3VzT24oZmFsc2UpLAorICAgIG1fYkNocm9tYUZsYXNoT24oZmFsc2UpLAorICAgIG1fYk9wdGlab29tT24oZmFsc2UpLAorICAgIG1fYlNjZW5lU2VsZWN0aW9uKGZhbHNlKSwKKyAgICBtX1NlbGVjdGVkU2NlbmUoQ0FNX1NDRU5FX01PREVfTUFYKSwKKyAgICBtX2JTZWVNb3JlT24oZmFsc2UpLAorICAgIG1fYlN0aWxsTW9yZU9uKGZhbHNlKSwKKyAgICBtX2JIaWdoUXVhbGl0eU5vaXNlUmVkdWN0aW9uTW9kZShmYWxzZSksCisgICAgbV9iSGZyTW9kZShmYWxzZSksCisgICAgbV9iU2Vuc29ySERSRW5hYmxlZChmYWxzZSksCisgICAgbV9iUmRpTW9kZShmYWxzZSksCisgICAgbV9iU2VjdXJlTW9kZShmYWxzZSksCisgICAgbV9iQWVCcmFja2V0aW5nRW5hYmxlZChmYWxzZSksCisgICAgbUZsYXNoVmFsdWUoQ0FNX0ZMQVNIX01PREVfT0ZGKSwKKyAgICBtRmxhc2hEYWVtb25WYWx1ZShDQU1fRkxBU0hfTU9ERV9PRkYpLAorICAgIG1IZnJNb2RlKENBTV9IRlJfTU9ERV9PRkYpLAorICAgIG1fYkhEUk1vZGVTZW5zb3IodHJ1ZSksCisgICAgbU9mZmxpbmVSQVcoZmFsc2UpLAorICAgIG1fYlRydWVQb3J0cmFpdE9uKGZhbHNlKSwKKyAgICBtX2JJc0xvd01lbW9yeURldmljZShmYWxzZSksCisgICAgbUNkc19tb2RlKENBTV9DRFNfTU9ERV9PRkYpLAorICAgIG1QYXJtRWZmZWN0KENBTV9FRkZFQ1RfTU9ERV9PRkYpLAorICAgIG1fTExDYXB0dXJlRW5hYmxlZChGQUxTRSksCisgICAgbV9Mb3dMaWdodExldmVsKENBTV9MT1dfTElHSFRfT0ZGKSwKKyAgICBtX2JMdG1Gb3JTZWVNb3JlRW5hYmxlZChmYWxzZSksCisgICAgbV9leHBUaW1lKDApLAorICAgIG1faXNvVmFsdWUoMCksCisgICAgbV9NYW51YWxDYXB0dXJlTW9kZShDQU1fTUFOVUFMX0NBUFRVUkVfVFlQRV9PRkYpLAorICAgIG1fZHVhbExlZENhbGlicmF0aW9uKDApLAorICAgIG1fYkluc3RhbnRBRUMoZmFsc2UpLAorICAgIG1fYkluc3RhbnRDYXB0dXJlKGZhbHNlKSwKKyAgICBtQWVjRnJhbWVCb3VuZCgwKSwKKyAgICBtQWVjU2tpcERpc3BsYXlGcmFtZUJvdW5kKDApLAorICAgIG1fYlF1YWRyYUNmYShmYWxzZSkKK3sKKyAgICBtZW1zZXQoJm1fTGl2ZVNuYXBzaG90U2l6ZSwgMCwgc2l6ZW9mKG1fTGl2ZVNuYXBzaG90U2l6ZSkpOworICAgIG1lbXNldCgmbV9kZWZhdWx0X2Zwc19yYW5nZSwgMCwgc2l6ZW9mKG1fZGVmYXVsdF9mcHNfcmFuZ2UpKTsKKyAgICBtZW1zZXQoJm1faGZyRnBzUmFuZ2UsIDAsIHNpemVvZihtX2hmckZwc1JhbmdlKSk7CisgICAgbWVtc2V0KCZtX3N0aWxsbW9yZV9jb25maWcsIDAsIHNpemVvZihjYW1fc3RpbGxfbW9yZV90KSk7CisgICAgbWVtc2V0KCZtX3JlbENhbVN5bmNJbmZvLCAwLCBzaXplb2YoY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCkpOworICAgIG1Ub3RhbFBQQ291bnQgPSAwOworICAgIG1ab29tTGV2ZWwgPSAwOworICAgIG1QYXJtWm9vbUxldmVsID0gMDsKKyAgICBtQ3VyUFBDb3VudCA9IDA7CisgICAgbVJvdGF0aW9uID0gMDsKKyAgICBtSnBlZ1JvdGF0aW9uID0gMDsKKyAgICBtQnVmQmF0Y2hDbnQgPSAwOworICAgIG1WaWRlb0JhdGNoU2l6ZSA9IDA7CisgICAgbV9iT0VNRmVhdEVuYWJsZWQgPSBpc09FTUZlYXQxUHJvcEVuYWJsZWQoKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYVBhcmFtZXRlcnMKKyAqCisgKiBERVNDUklQVElPTjogZGVjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhUGFyYW1ldGVycworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYVBhcmFtZXRlcnM6On5RQ2FtZXJhUGFyYW1ldGVycygpCit7CisgICAgZGVpbml0KCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY3JlYXRlU2l6ZXNTdHJpbmcKKyAqCisgKiBERVNDUklQVElPTjogY3JlYXRlIHN0cmluZyBvYmogY29udGFpbnMgYXJyYXkgb2YgZGltZW5zaW9ucworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc2l6ZXMgICA6IGFycmF5IG9mIGRpbWVuc2lvbnMKKyAqICAgQGxlbiAgICAgOiBzaXplIG9mIGRpbWVuc2lvbiBhcnJheQorICoKKyAqIFJFVFVSTiAgICAgOiBzdHJpbmcgb2JqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1N0cmluZzggUUNhbWVyYVBhcmFtZXRlcnM6OmNyZWF0ZVNpemVzU3RyaW5nKGNvbnN0IGNhbV9kaW1lbnNpb25fdCAqc2l6ZXMsIHNpemVfdCBsZW4pCit7CisgICAgU3RyaW5nOCBzdHI7CisgICAgY2hhciBidWZmZXJbMzJdOworCisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkeCVkIiwgc2l6ZXNbMF0ud2lkdGgsIHNpemVzWzBdLmhlaWdodCk7CisgICAgICAgIHN0ci5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBsZW47IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiLCVkeCVkIiwKKyAgICAgICAgICAgICAgICBzaXplc1tpXS53aWR0aCwgc2l6ZXNbaV0uaGVpZ2h0KTsKKyAgICAgICAgc3RyLmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNyZWF0ZVZhbHVlc1N0cmluZworICoKKyAqIERFU0NSSVBUSU9OOiBjcmVhdGUgc3RyaW5nIG9iaiBjb250YWlucyBhcnJheSBvZiB2YWx1ZXMgZnJvbSBtYXAgd2hlbiBtYXRjaGVkCisgKiAgICAgICAgICAgICAgZnJvbSBpbnB1dCB2YWx1ZXMgYXJyYXkKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHZhbHVlcyAgOiBhcnJheSBvZiB2YWx1ZXMKKyAqICAgQGxlbiAgICAgOiBzaXplIG9mIHZhbHVlcyBhcnJheQorICogICBAbWFwICAgICA6IG1hcCBjb250YWlucyB0aGUgbWFwcGluZyBiZXR3ZWVuIHZhbHVlcyBhbmQgZW51bXMKKyAqICAgQG1hcF9sZW4gOiBzaXplIG9mIHRoZSBtYXAKKyAqCisgKiBSRVRVUk4gICAgIDogc3RyaW5nIG9iagorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgdmFsdWVzVHlwZSwgY2xhc3MgbWFwVHlwZT4gU3RyaW5nOCBjcmVhdGVWYWx1ZXNTdHJpbmcoCisgICAgICAgIGNvbnN0IHZhbHVlc1R5cGUgKnZhbHVlcywgc2l6ZV90IGxlbiwgY29uc3QgbWFwVHlwZSAqbWFwLCBzaXplX3QgbWFwX2xlbikKK3sKKyAgICBTdHJpbmc4IHN0cjsKKyAgICBpbnQgY291bnQgPSAwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47IGkrKyApIHsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtYXBfbGVuOyBqICsrKQorICAgICAgICAgICAgaWYgKG1hcFtqXS52YWwgPT0gdmFsdWVzW2ldKSB7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gbWFwW2pdLmRlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQobWFwW2pdLmRlc2MpOworICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgICAgICBicmVhazsgLy9sb29wIGoKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY3JlYXRlVmFsdWVzU3RyaW5nRnJvbU1hcAorICoKKyAqIERFU0NSSVBUSU9OOiBjcmVhdGUgc3RyaW5nIG9iaiBjb250YWlucyBhcnJheSBvZiB2YWx1ZXMgZGlyZWN0bHkgZnJvbSBtYXAKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1hcCAgICAgOiBtYXAgY29udGFpbnMgdGhlIG1hcHBpbmcgYmV0d2VlbiB2YWx1ZXMgYW5kIGVudW1zCisgKiAgIEBtYXBfbGVuIDogc2l6ZSBvZiB0aGUgbWFwCisgKgorICogUkVUVVJOICAgICA6IHN0cmluZyBvYmoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordGVtcGxhdGUgPGNsYXNzIG1hcFR5cGU+IFN0cmluZzggY3JlYXRlVmFsdWVzU3RyaW5nRnJvbU1hcCgKKyAgICAgICAgY29uc3QgbWFwVHlwZSAqbWFwLCBzaXplX3QgbWFwX2xlbikKK3sKKyAgICBTdHJpbmc4IHN0cjsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWFwX2xlbjsgaSsrKSB7CisgICAgICAgIGlmIChOVUxMICE9IG1hcFtpXS5kZXNjKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCIsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHIuYXBwZW5kKG1hcFtpXS5kZXNjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNyZWF0ZVpvb21SYXRpb1ZhbHVlc1N0cmluZworICoKKyAqIERFU0NSSVBUSU9OOiBjcmVhdGUgc3RyaW5nIG9iaiBjb250YWlucyBhcnJheSBvZiB6b29tIHJhdGlvIHZhbHVlcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAem9vbVJhaW9zICA6IGFycmF5IG9mIHpvb20gcmF0aW9zCisgKiAgIEBsZW5ndGggICAgIDogc2l6ZSBvZiB0aGUgYXJyYXkKKyAqCisgKiBSRVRVUk4gICAgIDogc3RyaW5nIG9iagorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitTdHJpbmc4IFFDYW1lcmFQYXJhbWV0ZXJzOjpjcmVhdGVab29tUmF0aW9WYWx1ZXNTdHJpbmcodWludDMyX3QgKnpvb21SYXRpb3MsCisgICAgICAgIHNpemVfdCBsZW5ndGgpCit7CisgICAgU3RyaW5nOCBzdHI7CisgICAgY2hhciBidWZmZXJbMzJdID0gezB9OworCisgICAgaWYobGVuZ3RoID4gMCl7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlZCIsIHpvb21SYXRpb3NbMF0pOworICAgICAgICBzdHIuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIsJWQiLCB6b29tUmF0aW9zW2ldKTsKKyAgICAgICAgc3RyLmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNyZWF0ZUhmclZhbHVlc1N0cmluZworICoKKyAqIERFU0NSSVBUSU9OOiBjcmVhdGUgc3RyaW5nIG9iaiBjb250YWlucyBhcnJheSBvZiBoZnIgdmFsdWVzIGZyb20gbWFwIHdoZW4KKyAqICAgICAgICAgICAgICBtYXRjaGVkIGZyb20gaW5wdXQgaGZyIHZhbHVlcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAdmFsdWVzICA6IGFycmF5IG9mIGhmciBpbmZvCisgKiAgIEBsZW4gICAgIDogc2l6ZSBvZiB0aGUgYXJyYXkKKyAqICAgQG1hcCAgICAgOiBtYXAgb2YgaGZyIHN0cmluZyB2YWx1ZSBhbmQgZW51bQorICogICBtYXBfbGVuICA6IHNpemUgb2YgbWFwCisgKgorICogUkVUVVJOICAgICA6IHN0cmluZyBvYmoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworU3RyaW5nOCBRQ2FtZXJhUGFyYW1ldGVyczo6Y3JlYXRlSGZyVmFsdWVzU3RyaW5nKGNvbnN0IGNhbV9oZnJfaW5mb190ICp2YWx1ZXMsCisgICAgICAgIHNpemVfdCBsZW4sIGNvbnN0IFFDYW1lcmFNYXA8Y2FtX2hmcl9tb2RlX3Q+ICptYXAsIHNpemVfdCBtYXBfbGVuKQoreworICAgIFN0cmluZzggc3RyOworICAgIGludCBjb3VudCA9IDA7CisKKyAgICAvL0NyZWF0ZSBIRlIgc3VwcG9ydGVkIHNpemUgc3RyaW5nLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbWFwX2xlbjsgaiArKykgeworICAgICAgICAgICAgaWYgKG1hcFtqXS52YWwgPT0gKGludCl2YWx1ZXNbaV0ubW9kZSkgeworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IG1hcFtqXS5kZXNjKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgc3RyLmFwcGVuZChtYXBbal0uZGVzYyk7CisgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vbG9vcCBqCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgICAgc3RyLmFwcGVuZCgiLCIpOworICAgIH0KKyAgICBzdHIuYXBwZW5kKFZJREVPX0hGUl9PRkYpOworICAgIHJldHVybiBzdHI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY3JlYXRlSGZyU2l6ZXNTdHJpbmcKKyAqCisgKiBERVNDUklQVElPTjogY3JlYXRlIHN0cmluZyBvYmogY29udGFpbnMgYXJyYXkgb2YgaGZyIHNpemVzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB2YWx1ZXMgIDogYXJyYXkgb2YgaGZyIGluZm8KKyAqICAgQGxlbiAgICAgOiBzaXplIG9mIHRoZSBhcnJheQorICoKKyAqIFJFVFVSTiAgICAgOiBzdHJpbmcgb2JqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1N0cmluZzggUUNhbWVyYVBhcmFtZXRlcnM6OmNyZWF0ZUhmclNpemVzU3RyaW5nKGNvbnN0IGNhbV9oZnJfaW5mb190ICp2YWx1ZXMsIHNpemVfdCBsZW4pCit7CisgICAgU3RyaW5nOCBzdHI7CisgICAgY2hhciBidWZmZXJbMzJdOworCisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkeCVkIiwKKyAgICAgICAgICAgICAgICAgdmFsdWVzWzBdLmRpbVswXS53aWR0aCwgdmFsdWVzWzBdLmRpbVswXS5oZWlnaHQpOworICAgICAgICBzdHIuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiwlZHglZCIsCisgICAgICAgICAgICAgICAgIHZhbHVlc1tpXS5kaW1bMF0ud2lkdGgsIHZhbHVlc1tpXS5kaW1bMF0uaGVpZ2h0KTsKKyAgICAgICAgc3RyLmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNyZWF0ZUZwc1N0cmluZworICoKKyAqIERFU0NSSVBUSU9OOiBjcmVhdGUgc3RyaW5nIG9iaiBjb250YWlucyBhcnJheSBvZiBGUFMgcmF0ZXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZwcyAgICAgOiBkZWZhdWx0IGZwcyByYW5nZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdHJpbmcgb2JqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1N0cmluZzggUUNhbWVyYVBhcmFtZXRlcnM6OmNyZWF0ZUZwc1N0cmluZyhjYW1fZnBzX3JhbmdlX3QgJmZwcykKK3sKKyAgICBjaGFyIGJ1ZmZlclszMl07CisgICAgU3RyaW5nOCBmcHNWYWx1ZXM7CisKKyAgICBpbnQgbWluX2ZwcyA9IGludChmcHMubWluX2Zwcyk7CisgICAgaW50IG1heF9mcHMgPSBpbnQoZnBzLm1heF9mcHMpOworCisgICAgaWYgKG1pbl9mcHMgPCBmcHMubWluX2Zwcyl7CisgICAgICAgIG1pbl9mcHMrKzsKKyAgICB9CisgICAgaWYgKG1heF9mcHMgPiBmcHMubWF4X2ZwcykgeworICAgICAgICBtYXhfZnBzLS07CisgICAgfQorICAgIGlmIChtaW5fZnBzIDw9IG1heF9mcHMpIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkIiwgbWluX2Zwcyk7CisgICAgICAgIGZwc1ZhbHVlcy5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gbWluX2ZwcysxOyBpIDw9IG1heF9mcHM7IGkrKykgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiLCVkIiwgaSk7CisgICAgICAgIGZwc1ZhbHVlcy5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZnBzVmFsdWVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNyZWF0ZUZwc1JhbmdlU3RyaW5nCisgKgorICogREVTQ1JJUFRJT046IGNyZWF0ZSBzdHJpbmcgb2JqIGNvbnRhaW5zIGFycmF5IG9mIEZQUyByYW5nZXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZwcyAgICAgOiBhcnJheSBvZiBmcHMgcmFuZ2VzCisgKiAgIEBsZW4gICAgIDogc2l6ZSBvZiB0aGUgYXJyYXkKKyAqICAgQGRlZmF1bHRfZnBzX2luZGV4IDogcmVmZXJlbmNlIHRvIGluZGV4IG9mIGRlZmF1bHQgZnBzIHJhbmdlCisgKgorICogUkVUVVJOICAgICA6IHN0cmluZyBvYmoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworU3RyaW5nOCBRQ2FtZXJhUGFyYW1ldGVyczo6Y3JlYXRlRnBzUmFuZ2VTdHJpbmcoY29uc3QgY2FtX2Zwc19yYW5nZV90KiBmcHMsCisgICAgICAgIHNpemVfdCBsZW4sIGludCAmZGVmYXVsdF9mcHNfaW5kZXgpCit7CisgICAgU3RyaW5nOCBzdHI7CisgICAgY2hhciBidWZmZXJbMzJdOworICAgIGludCBtYXhfcmFuZ2UgPSAwOworICAgIGludCBtaW5fZnBzLCBtYXhfZnBzOworCisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgbWluX2ZwcyA9IGludChmcHNbMF0ubWluX2ZwcyAqIDEwMDApOworICAgICAgICBtYXhfZnBzID0gaW50KGZwc1swXS5tYXhfZnBzICogMTAwMCk7CisgICAgICAgIG1heF9yYW5nZSA9IG1heF9mcHMgLSBtaW5fZnBzOworICAgICAgICBkZWZhdWx0X2Zwc19pbmRleCA9IDA7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIoJWQsJWQpIiwgbWluX2ZwcywgbWF4X2Zwcyk7CisgICAgICAgIHN0ci5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBsZW47IGkrKykgeworICAgICAgICBtaW5fZnBzID0gaW50KGZwc1tpXS5taW5fZnBzICogMTAwMCk7CisgICAgICAgIG1heF9mcHMgPSBpbnQoZnBzW2ldLm1heF9mcHMgKiAxMDAwKTsKKyAgICAgICAgaWYgKG1heF9yYW5nZSA8IChtYXhfZnBzIC0gbWluX2ZwcykpIHsKKyAgICAgICAgICAgIG1heF9yYW5nZSA9IG1heF9mcHMgLSBtaW5fZnBzOworICAgICAgICAgICAgZGVmYXVsdF9mcHNfaW5kZXggPSAoaW50KWk7CisgICAgICAgIH0KKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiwoJWQsJWQpIiwgbWluX2ZwcywgbWF4X2Zwcyk7CisgICAgICAgIHN0ci5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIHN0cjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBsb29rdXBBdHRyCisgKgorICogREVTQ1JJUFRJT046IGxvb2t1cCBhIHZhbHVlIGJ5IGl0cyBuYW1lCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBhdHRyICAgIDogbWFwIGNvbnRhaW5zIDxuYW1lLCB2YWx1ZT4KKyAqICAgQGxlbiAgICAgOiBzaXplIG9mIHRoZSBtYXAKKyAqICAgQG5hbWUgICAgOiBuYW1lIHRvIGJlIGxvb2tlZCB1cAorICoKKyAqIFJFVFVSTiAgICAgOiB2YWxpZCB2YWx1ZSBpZiBmb3VuZAorICogICAgICAgICAgICAgIE5BTUVfTk9UX0ZPVU5EIGlmIG5vdCBmb3VuZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit0ZW1wbGF0ZSA8Y2xhc3MgbWFwVHlwZT4gaW50IGxvb2t1cEF0dHIoY29uc3QgbWFwVHlwZSAqYXJyLAorICAgICAgICBzaXplX3QgbGVuLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGlmIChuYW1lKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKGFycltpXS5kZXNjLCBuYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYXJyW2ldLnZhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbG9va3VwTmFtZUJ5VmFsdWUKKyAqCisgKiBERVNDUklQVElPTjogbG9va3VwIGEgbmFtZSBieSBpdHMgdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGF0dHIgICAgOiBtYXAgY29udGFpbnMgPG5hbWUsIHZhbHVlPgorICogICBAbGVuICAgICA6IHNpemUgb2YgdGhlIG1hcAorICogICBAdmFsdWUgICA6IHZhbHVlIHRvIGJlIGxvb2tlZCB1cAorICoKKyAqIFJFVFVSTiAgICAgOiBuYW1lIHN0ciBvciBOVUxMIGlmIG5vdCBmb3VuZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit0ZW1wbGF0ZSA8Y2xhc3MgbWFwVHlwZT4gY29uc3QgY2hhciAqbG9va3VwTmFtZUJ5VmFsdWUoY29uc3QgbWFwVHlwZSAqYXJyLAorICAgICAgICBzaXplX3QgbGVuLCBpbnQgdmFsdWUpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBpZiAoYXJyW2ldLnZhbCA9PSB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIGFycltpXS5kZXNjOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFByZXZpZXdTaXplCisgKgorICogREVTQ1JJUFRJT046IHNldCBwcmV2aWV3IHNpemUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFByZXZpZXdTaXplKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKKyAgICBpbnQgb2xkX3dpZHRoID0gMCwgb2xkX2hlaWdodCA9IDA7CisgICAgcGFyYW1zLmdldFByZXZpZXdTaXplKCZ3aWR0aCwgJmhlaWdodCk7CisgICAgQ2FtZXJhUGFyYW1ldGVyczo6Z2V0UHJldmlld1NpemUoJm9sZF93aWR0aCwgJm9sZF9oZWlnaHQpOworCisgICAgLy8gVmFsaWRhdGUgdGhlIHByZXZpZXcgc2l6ZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wQ2FwYWJpbGl0eS0+cHJldmlld19zaXplc190YmxfY250OyArK2kpIHsKKyAgICAgICAgaWYgKHdpZHRoID09ICBtX3BDYXBhYmlsaXR5LT5wcmV2aWV3X3NpemVzX3RibFtpXS53aWR0aAorICAgICAgICAgICAmJiBoZWlnaHQgPT0gIG1fcENhcGFiaWxpdHktPnByZXZpZXdfc2l6ZXNfdGJsW2ldLmhlaWdodCkgeworICAgICAgICAgICAgLy8gY2hlY2sgaWYgbmVlZCB0byByZXN0YXJ0IHByZXZpZXcgaW4gY2FzZSBvZiBwcmV2aWV3IHNpemUgY2hhbmdlCisgICAgICAgICAgICBpZiAod2lkdGggIT0gb2xkX3dpZHRoIHx8IGhlaWdodCAhPSBvbGRfaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgTE9HSSgiUmVxdWVzdGVkIHByZXZpZXcgc2l6ZSAlZCB4ICVkIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgbV9iTmVlZFJlc3RhcnQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2V0IHRoZSBuZXcgdmFsdWUKKyAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OnNldFByZXZpZXdTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtX3JlbENhbVN5bmNJbmZvLm1vZGUgPT0gQ0FNX01PREVfU0VDT05EQVJZKSB7CisgICAgICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAvLyBzZXQgcHJvcCB0byBjb25maWd1cmUgYXV4IHByZXZpZXcgc2l6ZQorICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmF1eC5wcmV2aWV3LnNpemUiLCBwcm9wLCAiMCIpOworICAgICAgICBwYXJzZV9wYWlyKHByb3AsICZ3aWR0aCwgJmhlaWdodCwgJ3gnLCBOVUxMKTsKKyAgICAgICAgYm9vbCBmb3VuZE1hdGNoID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wQ2FwYWJpbGl0eS0+cHJldmlld19zaXplc190YmxfY250OyArK2kpIHsKKyAgICAgICAgICAgIGlmICh3aWR0aCA9PSAgbV9wQ2FwYWJpbGl0eS0+cHJldmlld19zaXplc190YmxbaV0ud2lkdGggJiYKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID09ICBtX3BDYXBhYmlsaXR5LT5wcmV2aWV3X3NpemVzX3RibFtpXS5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgIGZvdW5kTWF0Y2ggPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmRNYXRjaCkgeworICAgICAgICAgICAgd2lkdGggPSBtX3BDYXBhYmlsaXR5LT5wcmV2aWV3X3NpemVzX3RibFswXS53aWR0aDsKKyAgICAgICAgICAgIGhlaWdodCA9IG1fcENhcGFiaWxpdHktPnByZXZpZXdfc2l6ZXNfdGJsWzBdLmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICAvLyBjaGVjayBpZiBuZWVkIHRvIHJlc3RhcnQgcHJldmlldyBpbiBjYXNlIG9mIHByZXZpZXcgc2l6ZSBjaGFuZ2UKKyAgICAgICAgaWYgKHdpZHRoICE9IG9sZF93aWR0aCB8fCBoZWlnaHQgIT0gb2xkX2hlaWdodCkgeworICAgICAgICAgICAgbV9iTmVlZFJlc3RhcnQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OnNldFByZXZpZXdTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICBMT0dIKCJTZWNvbmRhcnkgQ2FtZXJhOiBwcmV2aWV3IHNpemUgJWQgeCAlZCIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgTE9HRSgiSW52YWxpZCBwcmV2aWV3IHNpemUgcmVxdWVzdGVkOiAlZHglZCIsIHdpZHRoLCBoZWlnaHQpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0UGljdHVyZVNpemUKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHBpY3R1cmUgc2l6ZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0UGljdHVyZVNpemUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBwYXJhbXMuZ2V0UGljdHVyZVNpemUoJndpZHRoLCAmaGVpZ2h0KTsKKyAgICBpbnQgb2xkX3dpZHRoLCBvbGRfaGVpZ2h0OworICAgIENhbWVyYVBhcmFtZXRlcnM6OmdldFBpY3R1cmVTaXplKCZvbGRfd2lkdGgsICZvbGRfaGVpZ2h0KTsKKworICAgIC8vIFZhbGlkYXRlIHRoZSBwaWN0dXJlIHNpemUKKyAgICBpZighbV9yZXByb2NTY2FsZVBhcmFtLmlzU2NhbGVFbmFibGVkKCkpeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fcENhcGFiaWxpdHktPnBpY3R1cmVfc2l6ZXNfdGJsX2NudDsgKytpKSB7CisgICAgICAgICAgICBpZiAod2lkdGggPT0gIG1fcENhcGFiaWxpdHktPnBpY3R1cmVfc2l6ZXNfdGJsW2ldLndpZHRoCisgICAgICAgICAgICAgICAmJiBoZWlnaHQgPT0gIG1fcENhcGFiaWxpdHktPnBpY3R1cmVfc2l6ZXNfdGJsW2ldLmhlaWdodCkgeworICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIG5lZWQgdG8gcmVzdGFydCBwcmV2aWV3IGluIGNhc2Ugb2YgcGljdHVyZSBzaXplIGNoYW5nZQorICAgICAgICAgICAgICAgIGlmICgobV9iWnNsTW9kZSB8fCBtX2JSZWNvcmRpbmdIaW50KSAmJgorICAgICAgICAgICAgICAgICAgICAod2lkdGggIT0gb2xkX3dpZHRoIHx8IGhlaWdodCAhPSBvbGRfaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBMT0dJKCJSZXF1ZXN0ZWQgcGljdHVyZSBzaXplICVkIHggJWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgbV9iTmVlZFJlc3RhcnQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIG5ldyB2YWx1ZQorICAgICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OnNldFBpY3R1cmVTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBWaWV3IGFuZ2xlcyBiYXNlZCBvbiBQaWN0dXJlIEFzcGVjdCByYXRpbworICAgICAgICAgICAgICAgIHVwZGF0ZVZpZXdBbmdsZXMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgICAgLy9zaG91bGQgdXNlIHNjYWxlZCBwaWN0dXJlIHNpemUgdGFibGUgdG8gdmFsaWRhdGUKKyAgICAgICAgaWYobV9yZXByb2NTY2FsZVBhcmFtLnNldFZhbGlkYXRlUGljU2l6ZSh3aWR0aCwgaGVpZ2h0KSA9PSBOT19FUlJPUil7CisgICAgICAgICAgICAvLyBjaGVjayBpZiBuZWVkIHRvIHJlc3RhcnQgcHJldmlldyBpbiBjYXNlIG9mIHBpY3R1cmUgc2l6ZSBjaGFuZ2UKKyAgICAgICAgICAgIGlmICgobV9iWnNsTW9kZSB8fCBtX2JSZWNvcmRpbmdIaW50KSAmJgorICAgICAgICAgICAgICAgICh3aWR0aCAhPSBvbGRfd2lkdGggfHwgaGVpZ2h0ICE9IG9sZF9oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgbV9iTmVlZFJlc3RhcnQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2V0IHRoZSBuZXcgdmFsdWUKKyAgICAgICAgICAgIGNoYXIgdmFsWzMyXTsKKyAgICAgICAgICAgIHNucHJpbnRmKHZhbCwgc2l6ZW9mKHZhbCksICIlZHglZCIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUElDVFVSRV9TSVpFLCB2YWwpOworICAgICAgICAgICAgTE9HSCgiJXMiLCB2YWwpOworICAgICAgICAgICAgLy8gVXBkYXRlIFZpZXcgYW5nbGVzIGJhc2VkIG9uIFBpY3R1cmUgQXNwZWN0IHJhdGlvCisgICAgICAgICAgICB1cGRhdGVWaWV3QW5nbGVzKCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1fcmVsQ2FtU3luY0luZm8ubW9kZSA9PSBDQU1fTU9ERV9TRUNPTkRBUlkpIHsKKyAgICAgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgIC8vIHNldCBwcm9wIHRvIGNvbmZpZ3VyZSBhdXggcHJldmlldyBzaXplCisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuYXV4LnBpY3R1cmUuc2l6ZSIsIHByb3AsICIwIik7CisgICAgICAgIHBhcnNlX3BhaXIocHJvcCwgJndpZHRoLCAmaGVpZ2h0LCAneCcsIE5VTEwpOworICAgICAgICBib29sIGZvdW5kTWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3BDYXBhYmlsaXR5LT5waWN0dXJlX3NpemVzX3RibF9jbnQ7ICsraSkgeworICAgICAgICAgICAgaWYgKHdpZHRoID09ICBtX3BDYXBhYmlsaXR5LT5waWN0dXJlX3NpemVzX3RibFtpXS53aWR0aCAmJgorICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPT0gIG1fcENhcGFiaWxpdHktPnBpY3R1cmVfc2l6ZXNfdGJsW2ldLmhlaWdodCkgeworICAgICAgICAgICAgICAgZm91bmRNYXRjaCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZE1hdGNoKSB7CisgICAgICAgICAgICB3aWR0aCA9IG1fcENhcGFiaWxpdHktPnBpY3R1cmVfc2l6ZXNfdGJsWzBdLndpZHRoOworICAgICAgICAgICAgaGVpZ2h0ID0gbV9wQ2FwYWJpbGl0eS0+cGljdHVyZV9zaXplc190YmxbMF0uaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIC8vIGNoZWNrIGlmIG5lZWQgdG8gcmVzdGFydCBwcmV2aWV3IGluIGNhc2Ugb2YgcHJldmlldyBzaXplIGNoYW5nZQorICAgICAgICBpZiAod2lkdGggIT0gb2xkX3dpZHRoIHx8IGhlaWdodCAhPSBvbGRfaGVpZ2h0KSB7CisgICAgICAgICAgICBtX2JOZWVkUmVzdGFydCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgY2hhciB2YWxbMzJdOworICAgICAgICBzbnByaW50Zih2YWwsIHNpemVvZih2YWwpLCAiJWR4JWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgc2V0KEtFWV9QSUNUVVJFX1NJWkUsIHZhbCk7CisgICAgICAgIExPR0goIlNlY29uZGFyeSBDYW1lcmE6IHBpY3R1cmUgc2l6ZSAlcyIsIHZhbCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBwaWN0dXJlIHNpemUgcmVxdWVzdGVkOiAlZHglZCIsIHdpZHRoLCBoZWlnaHQpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdXBkYXRlVmlld0FuZ2xlcworICoKKyAqIERFU0NSSVBUSU9OOiBVcGRhdGUgdGhlIEhvcml6b250YWwgJiBWZXJ0aWNhbCBiYXNlZCBvbiB0aGUgQXNwZWN0IHJhdGlvIG9mIFByZXZpZXcgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgIFBpY3R1cmUgYXNwZWN0IHJhdGlvCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFQYXJhbWV0ZXJzOjp1cGRhdGVWaWV3QW5nbGVzKCkKK3sKKyAgICBkb3VibGUgc3RpbGxBc3BlY3RSYXRpbywgbWF4UGljdHVyZUFzcGVjdFJhdGlvOworICAgIGludCBzdGlsbFdpZHRoLCBzdGlsbEhlaWdodCwgbWF4V2lkdGgsIG1heEhlaWdodDsKKyAgICAvLyBUaGUgY3JvcCBmYWN0b3JzIGZyb20gdGhlIGZ1bGwgc2Vuc29yIGFycmF5IHRvIHRoZSBzdGlsbCBwaWN0dXJlIGNyb3AgcmVnaW9uCisgICAgZG91YmxlIGhvcml6Q3JvcEZhY3RvciA9IDEuZix2ZXJ0Q3JvcEZhY3RvciA9IDEuZjsKKyAgICBmbG9hdCBob3JpelZpZXdBbmdsZSwgdmVydFZpZXdBbmdsZSwgbWF4SGZvdiwgbWF4VmZvdjsKKworICAgIC8vIEdldCBjdXJyZW50IFBpY3R1cmUgJiBtYXggU25hcHNob3Qgc2l6ZXMKKyAgICBnZXRQaWN0dXJlU2l6ZSgmc3RpbGxXaWR0aCwgJnN0aWxsSGVpZ2h0KTsKKyAgICBtYXhXaWR0aCAgPSBtX3BDYXBhYmlsaXR5LT5waWN0dXJlX3NpemVzX3RibFswXS53aWR0aDsKKyAgICBtYXhIZWlnaHQgPSBtX3BDYXBhYmlsaXR5LT5waWN0dXJlX3NpemVzX3RibFswXS5oZWlnaHQ7CisKKyAgICAvLyBHZXQgZGVmYXVsdCBtYXhpbXVtIEZPViBmcm9tIGNvcnJlc3BvbmRpbmcgc2Vuc29yIGRyaXZlcgorICAgIG1heEhmb3YgPSBtX3BDYXBhYmlsaXR5LT5ob3Jfdmlld19hbmdsZTsKKyAgICBtYXhWZm92ID0gbV9wQ2FwYWJpbGl0eS0+dmVyX3ZpZXdfYW5nbGU7CisKKyAgICBzdGlsbEFzcGVjdFJhdGlvID0gKGRvdWJsZSlzdGlsbFdpZHRoL3N0aWxsSGVpZ2h0OworICAgIG1heFBpY3R1cmVBc3BlY3RSYXRpbyA9IChkb3VibGUpbWF4V2lkdGgvbWF4SGVpZ2h0OworICAgIExPR0QoIlN0aWxsd2lkdGg6ICVkLCBoZWlnaHQ6ICVkIiwgc3RpbGxXaWR0aCwgc3RpbGxIZWlnaHQpOworICAgIExPR0QoIk1heCB3aWR0aDogJWQsIGhlaWdodDogJWQiLCBtYXhXaWR0aCwgbWF4SGVpZ2h0KTsKKyAgICBMT0dEKCJzdGlsbCBhc3BlY3Q6ICVmLCBNYXggUGljIEFzcGVjdDogJWYiLAorICAgICAgICAgICAgc3RpbGxBc3BlY3RSYXRpbywgbWF4UGljdHVyZUFzcGVjdFJhdGlvKTsKKworICAgIC8vIGNyb3AgYXMgcGVyIHRoZSBNYXhpbXVtIFNuYXBzaG90IGFzcGVjdCByYXRpbworICAgIGlmIChzdGlsbEFzcGVjdFJhdGlvIDwgbWF4UGljdHVyZUFzcGVjdFJhdGlvKQorICAgICAgICBob3JpekNyb3BGYWN0b3IgPSBzdGlsbEFzcGVjdFJhdGlvL21heFBpY3R1cmVBc3BlY3RSYXRpbzsKKyAgICBlbHNlCisgICAgICAgIHZlcnRDcm9wRmFjdG9yID0gbWF4UGljdHVyZUFzcGVjdFJhdGlvL3N0aWxsQXNwZWN0UmF0aW87CisKKyAgICBMT0dEKCJob3JpekNyb3BGYWN0b3IgJWYsIHZlcnRDcm9wRmFjdG9yICVmIiwKKyAgICAgICAgICAgICBob3JpekNyb3BGYWN0b3IsIHZlcnRDcm9wRmFjdG9yKTsKKworICAgIC8vIE5vdyBkZXJpdmUgdGhlIGZpbmFsIEZPVidzIGJhc2VkIG9uIGZpZWxkIG9mIHZpZXcgZm9ybXVsYSBpcyBpLmUsCisgICAgLy8gYW5nbGUgb2YgdmlldyA9IDIgKiBhcmN0YW5nZW50ICggZCAvIDJmICkKKyAgICAvLyB3aGVyZSBkIGlzIHRoZSBwaHlzaWNhbCBzZW5zb3IgZGltZW5zaW9uIG9mIGludGVyZXN0LCBhbmQgZiBpcworICAgIC8vIHRoZSBmb2NhbCBsZW5ndGguIFRoaXMgb25seSBhcHBsaWVzIHRvIHJlY3RpbGluZWFyIHNlbnNvcnMsIGZvciBmb2N1c2luZworICAgIC8vIGF0IGRpc3RhbmNlcyA+PiBmLCBldGMuCisgICAgLy8gSGVyZSBkLzJmIGlzIG5vdGhpbmcgYnV0IHRoZSBNYXhpbXVtIEhvcml6b250YWwgb3IgVmVyaXRpY2FsIEZPVgorICAgIGhvcml6Vmlld0FuZ2xlID0gKDE4MC9QSSkqMiphdGFuKGhvcml6Q3JvcEZhY3Rvcip0YW4oKG1heEhmb3YvMikqKFBJLzE4MCkpKTsKKyAgICB2ZXJ0Vmlld0FuZ2xlID0gKDE4MC9QSSkqMiphdGFuKGhvcml6Q3JvcEZhY3Rvcip0YW4oKG1heFZmb3YvMikqKFBJLzE4MCkpKTsKKworICAgIHNldEZsb2F0KFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfSE9SSVpPTlRBTF9WSUVXX0FOR0xFLCBob3JpelZpZXdBbmdsZSk7CisgICAgc2V0RmxvYXQoUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9WRVJUSUNBTF9WSUVXX0FOR0xFLCB2ZXJ0Vmlld0FuZ2xlKTsKKyAgICBMT0dIKCJGaW5hbCBob3JpelZpZXdBbmdsZSAlZiwgdmVydFZpZXdBbmdsZSAlZiIsCisgICAgICAgICAgICBob3JpelZpZXdBbmdsZSwgdmVydFZpZXdBbmdsZSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0VmlkZW9TaXplCisgKgorICogREVTQ1JJUFRJT046IHNldCB2aWRlbyBzaXplIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRWaWRlb1NpemUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBjb25zdCBjaGFyICpzdHI9IE5VTEw7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgc3RyID0gcGFyYW1zLmdldChLRVlfVklERU9fU0laRSk7CisgICAgaW50IG9sZF93aWR0aCwgb2xkX2hlaWdodDsKKyAgICBDYW1lcmFQYXJhbWV0ZXJzOjpnZXRWaWRlb1NpemUoJm9sZF93aWR0aCwgJm9sZF9oZWlnaHQpOworICAgIGlmKCFzdHIpIHsKKyAgICAgICAgLy9JZiBhcHBsaWNhdGlvbiBkaWRuJ3Qgc2V0IHRoaXMgcGFyYW1ldGVyIHN0cmluZywgdXNlIHRoZSB2YWx1ZXMgZnJvbQorICAgICAgICAvL2dldFByZXZpZXdTaXplKCkgYXMgdmlkZW8gZGltZW5zaW9ucy4KKyAgICAgICAgcGFyYW1zLmdldFByZXZpZXdTaXplKCZ3aWR0aCwgJmhlaWdodCk7CisgICAgICAgIExPR1coIk5vIFJlY29yZCBTaXplIHJlcXVlc3RlZCwgdXNlIHRoZSBwcmV2aWV3IGRpbWVuc2lvbnMiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXJhbXMuZ2V0VmlkZW9TaXplKCZ3aWR0aCwgJmhlaWdodCk7CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgdGhlIHZpZGVvIHNpemUKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fcENhcGFiaWxpdHktPnZpZGVvX3NpemVzX3RibF9jbnQ7ICsraSkgeworICAgICAgICBpZiAod2lkdGggPT0gIG1fcENhcGFiaWxpdHktPnZpZGVvX3NpemVzX3RibFtpXS53aWR0aAorICAgICAgICAgICAgICAgICYmIGhlaWdodCA9PSAgbV9wQ2FwYWJpbGl0eS0+dmlkZW9fc2l6ZXNfdGJsW2ldLmhlaWdodCkgeworICAgICAgICAgICAgLy8gY2hlY2sgaWYgbmVlZCB0byByZXN0YXJ0IHByZXZpZXcgaW4gY2FzZSBvZiB2aWRlbyBzaXplIGNoYW5nZQorICAgICAgICAgICAgaWYgKG1fYlJlY29yZGluZ0hpbnQgJiYKKyAgICAgICAgICAgICAgICh3aWR0aCAhPSBvbGRfd2lkdGggfHwgaGVpZ2h0ICE9IG9sZF9oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgbV9iTmVlZFJlc3RhcnQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZXQgdGhlIG5ldyB2YWx1ZQorICAgICAgICAgICAgTE9HSCgiUmVxdWVzdGVkIHZpZGVvIHNpemUgJWQgeCAlZCIsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6c2V0VmlkZW9TaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtX3JlbENhbVN5bmNJbmZvLm1vZGUgPT0gQ0FNX01PREVfU0VDT05EQVJZKSB7CisgICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmV2aWV3IHNpemUgZm9yIHNlY29uZGFyeSBjYW1lcmEKKyAgICAgICAgd2lkdGggPSBtX3BDYXBhYmlsaXR5LT52aWRlb19zaXplc190YmxbMF0ud2lkdGg7CisgICAgICAgIGhlaWdodCA9IG1fcENhcGFiaWxpdHktPnZpZGVvX3NpemVzX3RibFswXS5oZWlnaHQ7CisgICAgICAgIC8vIGNoZWNrIGlmIG5lZWQgdG8gcmVzdGFydCBwcmV2aWV3IGluIGNhc2Ugb2YgcHJldmlldyBzaXplIGNoYW5nZQorICAgICAgICBpZiAod2lkdGggIT0gb2xkX3dpZHRoIHx8IGhlaWdodCAhPSBvbGRfaGVpZ2h0KSB7CisgICAgICAgICAgICBtX2JOZWVkUmVzdGFydCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpzZXRWaWRlb1NpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgIExPR0goIlNlY29uZGFyeSBDYW1lcmE6IHZpZGVvIHNpemUgJWQgeCAlZCIsCisgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgTE9HRSgiRXJyb3IgISEgSW52YWxpZCB2aWRlbyBzaXplIHJlcXVlc3RlZDogJWR4JWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldExpdmVTbmFwc2hvdFNpemUKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IGxpdmUgc25hcHNob3Qgc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgOiBkaW0gLSBVcGRhdGUgZGltIHdpdGggdGhlIGxpdmVzaG90IHNpemUKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYVBhcmFtZXRlcnM6OmdldExpdmVTbmFwc2hvdFNpemUoY2FtX2RpbWVuc2lvbl90ICZkaW0pCit7CisgICAgaWYoaXM0azJrVmlkZW9SZXNvbHV0aW9uKCkpIHsKKyAgICAgICAgLy8gV2Ugc3VwcG9ydCBtYXhpbXVtIDhNIGxpdmVzaG90IEA0SzJLIHZpZGVvIHJlc29sdXRpb24KKyAgICAgICAgY2FtX2RpbWVuc2lvbl90IHJlc29sdXRpb24gPSB7MCwgMH07CisgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OmdldFZpZGVvU2l6ZSgmcmVzb2x1dGlvbi53aWR0aCwgJnJlc29sdXRpb24uaGVpZ2h0KTsKKyAgICAgICAgaWYoKG1fTGl2ZVNuYXBzaG90U2l6ZS53aWR0aCA+IHJlc29sdXRpb24ud2lkdGgpIHx8CisgICAgICAgICAgICAgICAgKG1fTGl2ZVNuYXBzaG90U2l6ZS5oZWlnaHQgPiByZXNvbHV0aW9uLmhlaWdodCkpIHsKKyAgICAgICAgICAgIG1fTGl2ZVNuYXBzaG90U2l6ZS53aWR0aCA9IHJlc29sdXRpb24ud2lkdGg7CisgICAgICAgICAgICBtX0xpdmVTbmFwc2hvdFNpemUuaGVpZ2h0ID0gcmVzb2x1dGlvbi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZGltID0gbV9MaXZlU25hcHNob3RTaXplOworICAgIExPR0goIncgeCBoOiAlZCB4ICVkIiwgZGltLndpZHRoLCBkaW0uaGVpZ2h0KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRMaXZlU25hcHNob3RTaXplCisgKgorICogREVTQ1JJUFRJT046IHNldCBsaXZlIHNuYXBzaG90IHNpemUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldExpdmVTbmFwc2hvdFNpemUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5vcHQubGl2ZXBpYyIsIHZhbHVlLCAiMSIpOworICAgIGJvb2wgdXNlT3B0aW1hbCA9IGF0b2kodmFsdWUpID4gMCA/IHRydWUgOiBmYWxzZTsKKyAgICBib29sIHZIZHJPbjsKKyAgICBpbnQzMl90IGxpdmVTbmFwV2lkdGggPSAwLCBsaXZlU25hcEhlaWdodCA9IDA7CisgICAgLy8gdXNlIHBpY3R1cmUgc2l6ZSBmcm9tIHVzZXIgc2V0dGluZworICAgIHBhcmFtcy5nZXRQaWN0dXJlU2l6ZSgmbV9MaXZlU25hcHNob3RTaXplLndpZHRoLCAmbV9MaXZlU25hcHNob3RTaXplLmhlaWdodCk7CisKKyAgICBzaXplX3QgbGl2ZXNuYXBzaG90X3NpemVzX3RibF9jbnQgPQorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+bGl2ZXNuYXBzaG90X3NpemVzX3RibF9jbnQ7CisgICAgY2FtX2RpbWVuc2lvbl90ICpsaXZlc25hcHNob3Rfc2l6ZXNfdGJsID0KKyAgICAgICAgICAgICZtX3BDYXBhYmlsaXR5LT5saXZlc25hcHNob3Rfc2l6ZXNfdGJsWzBdOworCisgICAgaWYoaXM0azJrVmlkZW9SZXNvbHV0aW9uKCkpIHsKKyAgICAgICAgLy8gV2Ugc3VwcG9ydCBtYXhpbXVtIDhNIGxpdmVzaG90IEA0SzJLIHZpZGVvIHJlc29sdXRpb24KKyAgICAgICAgY2FtX2RpbWVuc2lvbl90IHJlc29sdXRpb24gPSB7MCwgMH07CisgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OmdldFZpZGVvU2l6ZSgmcmVzb2x1dGlvbi53aWR0aCwgJnJlc29sdXRpb24uaGVpZ2h0KTsKKyAgICAgICAgaWYoKG1fTGl2ZVNuYXBzaG90U2l6ZS53aWR0aCA+IHJlc29sdXRpb24ud2lkdGgpIHx8CisgICAgICAgICAgICAgICAgKG1fTGl2ZVNuYXBzaG90U2l6ZS5oZWlnaHQgPiByZXNvbHV0aW9uLmhlaWdodCkpIHsKKyAgICAgICAgICAgIG1fTGl2ZVNuYXBzaG90U2l6ZS53aWR0aCA9IHJlc29sdXRpb24ud2lkdGg7CisgICAgICAgICAgICBtX0xpdmVTbmFwc2hvdFNpemUuaGVpZ2h0ID0gcmVzb2x1dGlvbi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjaGVjayBpZiBIRlIgaXMgZW5hYmxlZAorICAgIGNvbnN0IGNoYXIgKmhmclN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1ZJREVPX0hJR0hfRlJBTUVfUkFURSk7CisgICAgY2FtX2hmcl9tb2RlX3QgaGZyTW9kZSA9IENBTV9IRlJfTU9ERV9PRkY7CisgICAgY29uc3QgY2hhciAqaHNyU3RyID0gcGFyYW1zLmdldChLRVlfUUNfVklERU9fSElHSF9TUEVFRF9SRUNPUkRJTkcpOworCisgICAgY29uc3QgY2hhciAqdmhkclN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1ZJREVPX0hEUik7CisgICAgdkhkck9uID0gKHZoZHJTdHIgIT0gTlVMTCAmJiAoMCA9PSBzdHJjbXAodmhkclN0ciwib24iKSkpID8gdHJ1ZSA6IGZhbHNlOworICAgIGlmICh2SGRyT24pIHsKKyAgICAgICAgbGl2ZXNuYXBzaG90X3NpemVzX3RibF9jbnQgPSBtX3BDYXBhYmlsaXR5LT52aGRyX2xpdmVzbmFwc2hvdF9zaXplc190YmxfY250OworICAgICAgICBsaXZlc25hcHNob3Rfc2l6ZXNfdGJsID0gJm1fcENhcGFiaWxpdHktPnZoZHJfbGl2ZXNuYXBzaG90X3NpemVzX3RibFswXTsKKyAgICB9CisgICAgaWYgKChoc3JTdHIgIT0gTlVMTCkgJiYgc3RyY21wKGhzclN0ciwgIm9mZiIpKSB7CisgICAgICAgIGludDMyX3QgaHNyID0gbG9va3VwQXR0cihIRlJfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShIRlJfTU9ERVNfTUFQKSwgaHNyU3RyKTsKKyAgICAgICAgaWYgKChoc3IgIT0gTkFNRV9OT1RfRk9VTkQpICYmIChoc3IgPiBDQU1fSEZSX01PREVfT0ZGKSkgeworICAgICAgICAgICAgLy8gaWYgSFNSIGlzIGVuYWJsZWQsIGNoYW5nZSBsaXZlIHNuYXBzaG90IHNpemUKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wQ2FwYWJpbGl0eS0+aGZyX3RibF9jbnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtX3BDYXBhYmlsaXR5LT5oZnJfdGJsW2ldLm1vZGUgPT0gaHNyKSB7CisgICAgICAgICAgICAgICAgICAgIGxpdmVzbmFwc2hvdF9zaXplc190YmxfY250ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5oZnJfdGJsW2ldLmxpdmVzbmFwc2hvdF9zaXplc190YmxfY250OworICAgICAgICAgICAgICAgICAgICBsaXZlc25hcHNob3Rfc2l6ZXNfdGJsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9wQ2FwYWJpbGl0eS0+aGZyX3RibFtpXS5saXZlc25hcHNob3Rfc2l6ZXNfdGJsWzBdOworICAgICAgICAgICAgICAgICAgICBoZnJNb2RlID0gbV9wQ2FwYWJpbGl0eS0+aGZyX3RibFtpXS5tb2RlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChoZnJTdHIgIT0gTlVMTCkgJiYgc3RyY21wKGhmclN0ciwgIm9mZiIpKSB7CisgICAgICAgIGludDMyX3QgaGZyID0gbG9va3VwQXR0cihIRlJfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShIRlJfTU9ERVNfTUFQKSwgaGZyU3RyKTsKKyAgICAgICAgaWYgKChoZnIgIT0gTkFNRV9OT1RfRk9VTkQpICYmIChoZnIgPiBDQU1fSEZSX01PREVfT0ZGKSkgeworICAgICAgICAgICAgLy8gaWYgSEZSIGlzIGVuYWJsZWQsIGNoYW5nZSBsaXZlIHNuYXBzaG90IHNpemUKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wQ2FwYWJpbGl0eS0+aGZyX3RibF9jbnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtX3BDYXBhYmlsaXR5LT5oZnJfdGJsW2ldLm1vZGUgPT0gaGZyKSB7CisgICAgICAgICAgICAgICAgICAgIGxpdmVzbmFwc2hvdF9zaXplc190YmxfY250ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5oZnJfdGJsW2ldLmxpdmVzbmFwc2hvdF9zaXplc190YmxfY250OworICAgICAgICAgICAgICAgICAgICBsaXZlc25hcHNob3Rfc2l6ZXNfdGJsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9wQ2FwYWJpbGl0eS0+aGZyX3RibFtpXS5saXZlc25hcHNob3Rfc2l6ZXNfdGJsWzBdOworICAgICAgICAgICAgICAgICAgICBoZnJNb2RlID0gbV9wQ2FwYWJpbGl0eS0+aGZyX3RibFtpXS5tb2RlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodXNlT3B0aW1hbCB8fCBoZnJNb2RlICE9IENBTV9IRlJfTU9ERV9PRkYgfHwgdkhkck9uKSB7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKworICAgICAgICAvLyBmaXJzdCBjaGVjayBpZiBwaWN0dXJlIHNpemUgaXMgd2l0aGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzaXplcworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpdmVzbmFwc2hvdF9zaXplc190YmxfY250OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtX0xpdmVTbmFwc2hvdFNpemUud2lkdGggPT0gbGl2ZXNuYXBzaG90X3NpemVzX3RibFtpXS53aWR0aCAmJgorICAgICAgICAgICAgICAgIG1fTGl2ZVNuYXBzaG90U2l6ZS5oZWlnaHQgPT0gbGl2ZXNuYXBzaG90X3NpemVzX3RibFtpXS5oZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAvLyB1c2Ugb3B0aW1hbCBsaXZlIHNuYXBzaG90IHNpemUgZnJvbSBzdXBwb3J0ZWQgbGlzdCwKKyAgICAgICAgICAgIC8vIHRoYXQgaGFzIHNhbWUgcHJldmlldyBhc3BlY3QgcmF0aW8KKyAgICAgICAgICAgIGludCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7CisgICAgICAgICAgICBwYXJhbXMuZ2V0UHJldmlld1NpemUoJndpZHRoLCAmaGVpZ2h0KTsKKworICAgICAgICAgICAgZG91YmxlIHByZXZpZXdBc3BlY3RSYXRpbyA9IChkb3VibGUpd2lkdGggLyBoZWlnaHQ7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpdmVzbmFwc2hvdF9zaXplc190YmxfY250OyArK2kpIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgcmF0aW8gPSAoZG91YmxlKWxpdmVzbmFwc2hvdF9zaXplc190YmxbaV0ud2lkdGggLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlc25hcHNob3Rfc2l6ZXNfdGJsW2ldLmhlaWdodDsKKyAgICAgICAgICAgICAgICBpZiAoZmFicyhwcmV2aWV3QXNwZWN0UmF0aW8gLSByYXRpbykgPD0gQVNQRUNUX1RPTEVSQU5DRSkgeworICAgICAgICAgICAgICAgICAgICBtX0xpdmVTbmFwc2hvdFNpemUgPSBsaXZlc25hcHNob3Rfc2l6ZXNfdGJsW2ldOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiAoKGhmck1vZGUgIT0gQ0FNX0hGUl9NT0RFX09GRikgfHwgdkhkck9uKSkgeworICAgICAgICAgICAgICAgIC8vIENhbm5vdCBmaW5kIG1hdGNoaW5nIGFzcGVjdCByYXRpb24gZnJvbSBzdXBwb3J0ZWQgbGl2ZSBzbmFwc2hvdCBsaXN0CisgICAgICAgICAgICAgICAgLy8gY2hvb3NlIHRoZSBtYXggZGltIGZyb20gcHJldmlldyBhbmQgdmlkZW8gc2l6ZQorICAgICAgICAgICAgICAgIExPR0QoIkNhbm5vdCBmaW5kIG1hdGNoaW5nIGFzcGVjdCByYXRpbywgY2hvb3NlIG1heCBvZiBwcmV2aWV3IG9yIHZpZGVvIHNpemUiKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMuZ2V0VmlkZW9TaXplKCZtX0xpdmVTbmFwc2hvdFNpemUud2lkdGgsICZtX0xpdmVTbmFwc2hvdFNpemUuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBpZiAobV9MaXZlU25hcHNob3RTaXplLndpZHRoIDwgd2lkdGggJiYgbV9MaXZlU25hcHNob3RTaXplLmhlaWdodCA8IGhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICBtX0xpdmVTbmFwc2hvdFNpemUud2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgbV9MaXZlU25hcHNob3RTaXplLmhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy9UbyByZWFkIGxpdmVzaG90IHJlc29sdXRpb24gZnJvbSBzZXRwcm9wIGluc3RlYWQgb2YgbWF0Y2hpbmcgYXNwZWN0IHJhdGlvLgorICAgIC8vVGhlIHNldHByb3AgcmVzb2x1dGlvbiBmb3JtYXQgc2hvdWxkIGJlIFd4SC4KKyAgICAvL2UuZzogYWRiIHNoZWxsIHNldHByb3AgcGVyc2lzdC5jYW1lcmEubGl2ZXNob3Quc2l6ZSAxMjgweDcyMAorICAgIG1lbXNldCh2YWx1ZSwgMCwgUFJPUEVSVFlfVkFMVUVfTUFYKTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmxpdmVzaG90LnNpemUiLCB2YWx1ZSwgIiIpOworICAgIGlmIChzdHJsZW4odmFsdWUpID4gMCkgeworICAgICAgICBjaGFyICpzYXZlcHRyID0gTlVMTDsKKyAgICAgICAgY2hhciAqdG9rZW4gPSBzdHJ0b2tfcih2YWx1ZSwgIngiLCAmc2F2ZXB0cik7CisgICAgICAgIGlmICh0b2tlbiAhPSBOVUxMKSB7CisgICAgICAgICAgICBsaXZlU25hcFdpZHRoID0gYXRvaSh0b2tlbik7CisgICAgICAgIH0KKyAgICAgICAgdG9rZW4gPSBzdHJ0b2tfcihOVUxMLCAieCIsICZzYXZlcHRyKTsKKyAgICAgICAgaWYgKHRva2VuICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGxpdmVTbmFwSGVpZ2h0ID0gYXRvaSh0b2tlbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChsaXZlU25hcFdpZHRoIT0wKSAmJiAobGl2ZVNuYXBIZWlnaHQhPTApKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fcENhcGFiaWxpdHktPnBpY3R1cmVfc2l6ZXNfdGJsX2NudDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpdmVTbmFwV2lkdGggPT0gIG1fcENhcGFiaWxpdHktPnBpY3R1cmVfc2l6ZXNfdGJsW2ldLndpZHRoCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBsaXZlU25hcEhlaWdodCA9PSAgbV9wQ2FwYWJpbGl0eS0+cGljdHVyZV9zaXplc190YmxbaV0uaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgbV9MaXZlU25hcHNob3RTaXplLndpZHRoID0gbGl2ZVNuYXBXaWR0aDsKKyAgICAgICAgICAgICAgICAgICBtX0xpdmVTbmFwc2hvdFNpemUuaGVpZ2h0ID0gbGl2ZVNuYXBIZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIExPR0goImxpdmUgc25hcHNob3Qgc2l6ZSAlZCB4ICVkIiwKKyAgICAgICAgICBtX0xpdmVTbmFwc2hvdFNpemUud2lkdGgsIG1fTGl2ZVNuYXBzaG90U2l6ZS5oZWlnaHQpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0UmF3U2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgbGl2ZSBzbmFwc2hvdCBzaXplCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRSYXdTaXplKGNhbV9kaW1lbnNpb25fdCAmZGltKQoreworICAgIG1fcmF3U2l6ZSA9IGRpbTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFByZXZpZXdGb3JtYXQKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHByZXZpZXcgZm9ybWF0IGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRQcmV2aWV3Rm9ybWF0KGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldFByZXZpZXdGb3JtYXQoKTsKKyAgICBpbnQzMl90IHByZXZpZXdGb3JtYXQgPSBsb29rdXBBdHRyKFBSRVZJRVdfRk9STUFUU19NQVAsCisgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShQUkVWSUVXX0ZPUk1BVFNfTUFQKSwgc3RyKTsKKyAgICBpZiAocHJldmlld0Zvcm1hdCAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBpZiAoaXNVQldDRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgICAgIGludCBwRm9ybWF0OworICAgICAgICAgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnByZXZpZXcudWJ3YyIsIHByb3AsICIxIik7CisKKyAgICAgICAgICAgIHBGb3JtYXQgPSBhdG9pKHByb3ApOworICAgICAgICAgICAgaWYgKHBGb3JtYXQgPT0gMSkgeworICAgICAgICAgICAgICAgIG1QcmV2aWV3Rm9ybWF0ID0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVUJXQzsKKyAgICAgICAgICAgICAgICBtQXBwUHJldmlld0Zvcm1hdCA9IChjYW1fZm9ybWF0X3QpcHJldmlld0Zvcm1hdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVByZXZpZXdGb3JtYXQgPSAoY2FtX2Zvcm1hdF90KXByZXZpZXdGb3JtYXQ7CisgICAgICAgICAgICAgICAgbUFwcFByZXZpZXdGb3JtYXQgPSAoY2FtX2Zvcm1hdF90KXByZXZpZXdGb3JtYXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUHJldmlld0Zvcm1hdCA9IChjYW1fZm9ybWF0X3QpcHJldmlld0Zvcm1hdDsKKyAgICAgICAgICAgIG1BcHBQcmV2aWV3Rm9ybWF0ID0gKGNhbV9mb3JtYXRfdClwcmV2aWV3Rm9ybWF0OworICAgICAgICB9CisgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OnNldFByZXZpZXdGb3JtYXQoc3RyKTsKKyAgICAgICAgTE9HSCgiZm9ybWF0ICVkXG4iLCBtUHJldmlld0Zvcm1hdCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBwcmV2aWV3IGZvcm1hdCB2YWx1ZTogJXMiLCAoc3RyID09IE5VTEwpID8gIk5VTEwiIDogc3RyKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFBpY3R1cmVGb3JtYXQKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHBpY3R1cmUgZm9ybWF0IGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRQaWN0dXJlRm9ybWF0KGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldFBpY3R1cmVGb3JtYXQoKTsKKyAgICBpbnQzMl90IHBpY3R1cmVGb3JtYXQgPSBsb29rdXBBdHRyKFBJQ1RVUkVfVFlQRVNfTUFQLCBQQVJBTV9NQVBfU0laRShQSUNUVVJFX1RZUEVTX01BUCksIHN0cik7CisgICAgaWYgKHBpY3R1cmVGb3JtYXQgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgbVBpY3R1cmVGb3JtYXQgPSBwaWN0dXJlRm9ybWF0OworCisgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OnNldFBpY3R1cmVGb3JtYXQoc3RyKTsKKyAgICAgICAgTE9HSCgiZm9ybWF0ICVkXG4iLCBtUGljdHVyZUZvcm1hdCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBwaWN0dXJlIGZvcm1hdCB2YWx1ZTogJXMiLCAoc3RyID09IE5VTEwpID8gIk5VTEwiIDogc3RyKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEpwZWdUaHVtYm5haWxTaXplCisgKgorICogREVTQ1JJUFRJT046IHNldCBqcGVnIHRodW1ibmFpbCBzaXplIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRKcGVnVGh1bWJuYWlsU2l6ZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGludCB3aWR0aCA9IHBhcmFtcy5nZXRJbnQoS0VZX0pQRUdfVEhVTUJOQUlMX1dJRFRIKTsKKyAgICBpbnQgaGVpZ2h0ID0gcGFyYW1zLmdldEludChLRVlfSlBFR19USFVNQk5BSUxfSEVJR0hUKTsKKworICAgIExPR0QoInJlcXVlc3RlZCBqcGVnIHRodW1ibmFpbCBzaXplICVkIHggJWQiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpbnQgc2l6ZXNfY250ID0gc2l6ZW9mKFRIVU1CTkFJTF9TSVpFU19NQVApIC8gc2l6ZW9mKGNhbV9kaW1lbnNpb25fdCk7CisgICAgLy8gVmFsaWRhdGUgdGh1bWJuYWlsIHNpemUKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVzX2NudDsgaSsrKSB7CisgICAgICAgIGlmICh3aWR0aCA9PSBUSFVNQk5BSUxfU0laRVNfTUFQW2ldLndpZHRoICYmCisgICAgICAgICAgICAgICAgaGVpZ2h0ID09IFRIVU1CTkFJTF9TSVpFU19NQVBbaV0uaGVpZ2h0KSB7CisgICAgICAgICAgIHNldChLRVlfSlBFR19USFVNQk5BSUxfV0lEVEgsIHdpZHRoKTsKKyAgICAgICAgICAgc2V0KEtFWV9KUEVHX1RIVU1CTkFJTF9IRUlHSFQsIGhlaWdodCk7CisgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dFKCJlcnJvcjogc2V0dGluZyBqcGVnIHRodW1ibmFpbCBzaXplICglZCwgJWQpIiwgd2lkdGgsIGhlaWdodCk7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICogRlVOQ1RJT04gICA6IHNldEJ1cnN0TEVET25QZXJpb2QKKyAqCisgKiBERVNDUklQVElPTjogc2V0IGJ1cnN0IExFRCBvbiBwZXJpb2QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEJ1cnN0TEVET25QZXJpb2QoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBpbnQgbkJ1cnN0TEVET25QZXJpb2QgPSBwYXJhbXMuZ2V0SW50KEtFWV9RQ19TTkFQU0hPVF9CVVJTVF9MRURfT05fUEVSSU9EKTsKKyAgICAvL0NoZWNrIGlmIHRoZSBMRUQgT04gcGVyaW9kIGlzIHdpdGhpbiBsaW1pdHMKKyAgICBpZiAoKG5CdXJzdExFRE9uUGVyaW9kIDw9IDApIHx8IChuQnVyc3RMRURPblBlcmlvZCA+IDgwMCkpIHsKKyAgICAgICAgLy8gaWYgYnVyc3QgbGVkIG9uIHBlcmlvZCBpcyBub3Qgc2V0IGluIHBhcmFtZXRlcnMsCisgICAgICAgIC8vIHJlYWQgZnJvbSBzeXMgcHJvcAorICAgICAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEubGVkLm9uLnBlcmlvZCIsIHByb3AsICIwIik7CisgICAgICAgIG5CdXJzdExFRE9uUGVyaW9kID0gYXRvaShwcm9wKTsKKyAgICAgICAgaWYgKG5CdXJzdExFRE9uUGVyaW9kIDw9IDApIHsKKyAgICAgICAgICAgIG5CdXJzdExFRE9uUGVyaW9kID0gMzAwOworICAgICAgICB9CisgICAgfQorCisgICAgc2V0KEtFWV9RQ19TTkFQU0hPVF9CVVJTVF9MRURfT05fUEVSSU9ELCBuQnVyc3RMRURPblBlcmlvZCk7CisgICAgbV9uQnVyc3RMRURPblBlcmlvZCA9IG5CdXJzdExFRE9uUGVyaW9kOworICAgIExPR0goIkJ1cnN0IExFRCBvbiBwZXJpb2QgICV1IiwgbV9uQnVyc3RMRURPblBlcmlvZCk7CisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fQlVSU1RfTEVEX09OX1BFUklPRCwKKyAgICAgICAgICAgICh1aW50MzJfdCluQnVyc3RMRURPblBlcmlvZCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFJldHJvQWN0aXZlQnVyc3ROdW0KKyAqCisgKiBERVNDUklQVElPTjogc2V0IHJldHJvIGFjdGl2ZSBidXJzdCBudW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFJldHJvQWN0aXZlQnVyc3ROdW0oCisgICAgICAgIGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgaW50MzJfdCBuQnVyc3ROdW0gPSBwYXJhbXMuZ2V0SW50KEtFWV9RQ19OVU1fUkVUUk9fQlVSU1RfUEVSX1NIVVRURVIpOworICAgIExPR0goIm1fblJldHJvQnVyc3ROdW0gPSAlZCIsIG1fblJldHJvQnVyc3ROdW0pOworICAgIGlmIChuQnVyc3ROdW0gPD0gMCkgeworICAgICAgICAvLyBpZiBidXJzdCBudW1iZXIgaXMgbm90IHNldCBpbiBwYXJhbWV0ZXJzLAorICAgICAgICAvLyByZWFkIGZyb20gc3lzIHByb3AKKyAgICAgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnJldHJvLm51bWJlciIsIHByb3AsICIwIik7CisgICAgICAgIG5CdXJzdE51bSA9IGF0b2kocHJvcCk7CisgICAgICAgIGlmIChuQnVyc3ROdW0gPCAwKSB7CisgICAgICAgICAgICBuQnVyc3ROdW0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgc2V0KEtFWV9RQ19OVU1fUkVUUk9fQlVSU1RfUEVSX1NIVVRURVIsIG5CdXJzdE51bSk7CisKKyAgICBtX25SZXRyb0J1cnN0TnVtID0gbkJ1cnN0TnVtOworICAgIExPR0goIm1fblJldHJvQnVyc3ROdW0gPSAlZCIsIG1fblJldHJvQnVyc3ROdW0pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRKcGVnUXVhbGl0eQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQganBlZyBlbmNwZGluZyBxdWFsaXR5IGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRKcGVnUXVhbGl0eShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpbnQgcXVhbGl0eSA9IHBhcmFtcy5nZXRJbnQoS0VZX0pQRUdfUVVBTElUWSk7CisgICAgaWYgKHF1YWxpdHkgPj0gMCAmJiBxdWFsaXR5IDw9IDEwMCkgeworICAgICAgICBzZXQoS0VZX0pQRUdfUVVBTElUWSwgcXVhbGl0eSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBqcGVnIHF1YWxpdHk9JWQiLCBxdWFsaXR5KTsKKyAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgfQorCisgICAgcXVhbGl0eSA9IHBhcmFtcy5nZXRJbnQoS0VZX0pQRUdfVEhVTUJOQUlMX1FVQUxJVFkpOworICAgIGlmIChxdWFsaXR5ID49IDAgJiYgcXVhbGl0eSA8PSAxMDApIHsKKyAgICAgICAgc2V0KEtFWV9KUEVHX1RIVU1CTkFJTF9RVUFMSVRZLCBxdWFsaXR5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGpwZWcgdGh1bWJuYWlsIHF1YWxpdHk9JWQiLCBxdWFsaXR5KTsKKyAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRPcmllbnRhaW9uCisgKgorICogREVTQ1JJUFRJT046IHNldCBvcmllbnRhaW9uIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRPcmllbnRhdGlvbihjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX09SSUVOVEFUSU9OKTsKKworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RyY21wKHN0ciwgcG9ydHJhaXQpID09IDAgfHwgc3RyY21wKHN0ciwgbGFuZHNjYXBlKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBDYW1lcmEgc2VydmljZSBuZWVkcyB0aGlzIHRvIGRlY2lkZSBpZiB0aGUgcHJldmlldyBmcmFtZXMgYW5kIHJhdworICAgICAgICAgICAgLy8gcGljdHVyZXMgc2hvdWxkIGJlIHJvdGF0ZWQuCisgICAgICAgICAgICBzZXQoS0VZX1FDX09SSUVOVEFUSU9OLCBzdHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBvcmllbnRhdGlvbiB2YWx1ZTogJXMiLCBzdHIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0QXV0b0V4cG9zdXJlCisgKgorICogREVTQ1JJUFRJT046IHNldCBhdXRvIGV4cG9zdXJlIHZhbHVlIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRBdXRvRXhwb3N1cmUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19BVVRPX0VYUE9TVVJFKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfQVVUT19FWFBPU1VSRSk7CisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwcmV2X3N0ciA9PSBOVUxMIHx8CisgICAgICAgICAgICBzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHNldEF1dG9FeHBvc3VyZShzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRQcmV2aWV3RnBzUmFuZ2UKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHByZXZpZXcgRlBTIHJhbmdlIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRQcmV2aWV3RnBzUmFuZ2UoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBpbnQgbWluRnBzLG1heEZwczsKKyAgICBpbnQgcHJldk1pbkZwcywgcHJldk1heEZwcywgdmlkTWluRnBzLCB2aWRNYXhGcHM7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlLCB1cGRhdGVOZWVkZWQgPSBmYWxzZTsKKworICAgIENhbWVyYVBhcmFtZXRlcnM6OmdldFByZXZpZXdGcHNSYW5nZSgmcHJldk1pbkZwcywgJnByZXZNYXhGcHMpOworICAgIHBhcmFtcy5nZXRQcmV2aWV3RnBzUmFuZ2UoJm1pbkZwcywgJm1heEZwcyk7CisKKyAgICBMT0dIKCJGcHNSYW5nZSBWYWx1ZXM6KCVkLCAlZCkiLCBwcmV2TWluRnBzLCBwcmV2TWF4RnBzKTsKKyAgICBMT0dIKCJSZXF1ZXN0ZWQgRnBzUmFuZ2UgVmFsdWVzOiglZCwgJWQpIiwgbWluRnBzLCBtYXhGcHMpOworCisgICAgLy9maXJzdCBjaGVjayBpZiB3ZSBuZWVkIHRvIGNoYW5nZSBmcHMgYmVjYXVzZSBvZiBIRlIgbW9kZSBjaGFuZ2UKKyAgICB1cGRhdGVOZWVkZWQgPSBVcGRhdGVIRlJGcmFtZVJhdGUocGFyYW1zKTsKKyAgICBpZiAodXBkYXRlTmVlZGVkKSB7CisgICAgICAgIG1fYk5lZWRSZXN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgcmMgPSBzZXRIaWdoRnJhbWVSYXRlKG1IZnJNb2RlKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSBnb3RvIGVuZDsKKyAgICB9CisgICAgTE9HSCgiVXBkYXRlSEZSRnJhbWVSYXRlICVkIiwgdXBkYXRlTmVlZGVkKTsKKworICAgIHZpZE1pbkZwcyA9IChpbnQpbV9oZnJGcHNSYW5nZS52aWRlb19taW5fZnBzOworICAgIHZpZE1heEZwcyA9IChpbnQpbV9oZnJGcHNSYW5nZS52aWRlb19tYXhfZnBzOworCisgICAgaWYobWluRnBzID09IHByZXZNaW5GcHMgJiYgbWF4RnBzID09IHByZXZNYXhGcHMpIHsKKyAgICAgICAgaWYgKCBtX2JGaXhlZEZyYW1lUmF0ZVNldCApIHsKKyAgICAgICAgICAgIG1pbkZwcyA9IHBhcmFtcy5nZXRQcmV2aWV3RnJhbWVSYXRlKCkgKiAxMDAwOworICAgICAgICAgICAgbWF4RnBzID0gcGFyYW1zLmdldFByZXZpZXdGcmFtZVJhdGUoKSAqIDEwMDA7CisgICAgICAgICAgICBtX2JGaXhlZEZyYW1lUmF0ZVNldCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKCF1cGRhdGVOZWVkZWQpIHsKKyAgICAgICAgICAgIExPR0goIk5vIGNoYW5nZSBpbiBGcHNSYW5nZSIpOworICAgICAgICAgICAgcmMgPSBOT19FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBtX3BDYXBhYmlsaXR5LT5mcHNfcmFuZ2VzX3RibF9jbnQ7IGkrKykgeworICAgICAgICAvLyBpZiB0aGUgdmFsdWUgaXMgaW4gdGhlIHN1cHBvcnRlZCBsaXN0CisgICAgICAgIGlmIChtaW5GcHMgPj0gbV9wQ2FwYWJpbGl0eS0+ZnBzX3Jhbmdlc190YmxbaV0ubWluX2ZwcyAqIDEwMDAgJiYKKyAgICAgICAgICAgICAgICBtYXhGcHMgPD0gbV9wQ2FwYWJpbGl0eS0+ZnBzX3Jhbmdlc190YmxbaV0ubWF4X2ZwcyAqIDEwMDApIHsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIExPR0goIkZQUyBpPSVkIDogbWluRnBzID0gJWQsIG1heEZwcyA9ICVkIgorICAgICAgICAgICAgICAgICAgICAiIHZpZE1pbkZwcyA9ICVkLCB2aWRNYXhGcHMgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICBpLCBtaW5GcHMsIG1heEZwcywKKyAgICAgICAgICAgICAgICAgICAgKGludCltX2hmckZwc1JhbmdlLnZpZGVvX21pbl9mcHMsCisgICAgICAgICAgICAgICAgICAgIChpbnQpbV9oZnJGcHNSYW5nZS52aWRlb19tYXhfZnBzKTsKKyAgICAgICAgICAgIGlmICgoMC4wZiA+PSBtX2hmckZwc1JhbmdlLnZpZGVvX21pbl9mcHMpIHx8CisgICAgICAgICAgICAgICAgICAgICgwLjBmID49IG1faGZyRnBzUmFuZ2UudmlkZW9fbWF4X2ZwcykpIHsKKyAgICAgICAgICAgICAgICB2aWRNaW5GcHMgPSBtaW5GcHM7CisgICAgICAgICAgICAgICAgdmlkTWF4RnBzID0gbWF4RnBzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdmlkTWluRnBzID0gKGludCltX2hmckZwc1JhbmdlLnZpZGVvX21pbl9mcHM7CisgICAgICAgICAgICAgICAgdmlkTWF4RnBzID0gKGludCltX2hmckZwc1JhbmdlLnZpZGVvX21heF9mcHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldFByZXZpZXdGcHNSYW5nZShtaW5GcHMsIG1heEZwcywgdmlkTWluRnBzLCB2aWRNYXhGcHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoZm91bmQgPT0gZmFsc2UpeworICAgICAgICBMT0dFKCJlcnJvcjogRlBTIHJhbmdlIHZhbHVlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgfQorZW5kOgorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBVcGRhdGVIRlJGcmFtZVJhdGUKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHByZXZpZXcgRlBTIHJhbmdlIGJhc2VkIG9uIEhGUiBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogYm9vbCB0cnVlL2ZhbHNlCisgKiAgICAgICAgICAgICAgICAgIHRydWUgLWlmIEhBTCBuZWVkcyB0byBvdmVyd3JpdGUgRlBTIHJhbmdlIHNldCBieSBhcHAsIGZhbHNlIG90aGVyd2lzZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjpVcGRhdGVIRlJGcmFtZVJhdGUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBib29sIHVwZGF0ZU5lZWRlZCA9IGZhbHNlOworICAgIGludCBtaW5fZnBzLCBtYXhfZnBzOworICAgIGludDMyX3QgaGZyTW9kZSA9IENBTV9IRlJfTU9ERV9PRkY7CisgICAgaW50MzJfdCBuZXdIZnJNb2RlID0gQ0FNX0hGUl9NT0RFX09GRjsKKworICAgIGludCBwYXJtX21pbmZwcyxwYXJtX21heGZwczsKKyAgICBpbnQgcHJldk1pbkZwcywgcHJldk1heEZwczsKKyAgICBDYW1lcmFQYXJhbWV0ZXJzOjpnZXRQcmV2aWV3RnBzUmFuZ2UoJnByZXZNaW5GcHMsICZwcmV2TWF4RnBzKTsKKyAgICBwYXJhbXMuZ2V0UHJldmlld0Zwc1JhbmdlKCZwYXJtX21pbmZwcywgJnBhcm1fbWF4ZnBzKTsKKyAgICBMT0dIKCJDYW1lcmFQYXJhbWV0ZXJzIC0gOiBtaW5GcHMgPSAlZCwgbWF4RnBzID0gJWQgIiwKKyAgICAgICAgICAgICAgICAgcHJldk1pbkZwcywgcHJldk1heEZwcyk7CisgICAgTE9HSCgiUmVxdWVzdGVkIHBhcmFtcyAtIDogbWluRnBzID0gJWQsIG1heEZwcyA9ICVkICIsCisgICAgICAgICAgICAgICAgIHBhcm1fbWluZnBzLCBwYXJtX21heGZwcyk7CisKKyAgICBjb25zdCBjaGFyICpoZnJTdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19WSURFT19ISUdIX0ZSQU1FX1JBVEUpOworICAgIGNvbnN0IGNoYXIgKmhzclN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1ZJREVPX0hJR0hfU1BFRURfUkVDT1JESU5HKTsKKworICAgIGNvbnN0IGNoYXIgKnByZXZfaGZyU3RyID0gQ2FtZXJhUGFyYW1ldGVyczo6Z2V0KEtFWV9RQ19WSURFT19ISUdIX0ZSQU1FX1JBVEUpOworICAgIGNvbnN0IGNoYXIgKnByZXZfaHNyU3RyID0gQ2FtZXJhUGFyYW1ldGVyczo6Z2V0KEtFWV9RQ19WSURFT19ISUdIX1NQRUVEX1JFQ09SRElORyk7CisKKyAgICBpZiAoKGhmclN0ciAhPSBOVUxMKSAmJiAocHJldl9oZnJTdHIgIT0gTlVMTCkgJiYgc3RyY21wKGhmclN0ciwgcHJldl9oZnJTdHIpKSB7CisgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1ZJREVPX0hJR0hfRlJBTUVfUkFURSwgaGZyU3RyKTsKKyAgICB9CisKKyAgICBpZiAoKGhzclN0ciAhPSBOVUxMKSAmJiAocHJldl9oc3JTdHIgIT0gTlVMTCkgJiYgc3RyY21wKGhzclN0ciwgcHJldl9oc3JTdHIpKSB7CisgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1ZJREVPX0hJR0hfU1BFRURfUkVDT1JESU5HLCBoc3JTdHIpOworCisgICAgfQorCisgICAgLy8gY2hlY2sgaWYgSEZSIGlzIGVuYWJsZWQKKyAgICBpZiAoKGhmclN0ciAhPSBOVUxMKSAmJiBzdHJjbXAoaGZyU3RyLCAib2ZmIikpIHsKKyAgICAgICAgaGZyTW9kZSA9IGxvb2t1cEF0dHIoSEZSX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoSEZSX01PREVTX01BUCksIGhmclN0cik7CisgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSBoZnJNb2RlKSBuZXdIZnJNb2RlID0gaGZyTW9kZTsKKyAgICB9CisgICAgLy8gY2hlY2sgaWYgSFNSIGlzIGVuYWJsZWQKKyAgICBlbHNlIGlmICgoaHNyU3RyICE9IE5VTEwpICYmIHN0cmNtcChoc3JTdHIsICJvZmYiKSkgeworICAgICAgICBoZnJNb2RlID0gbG9va3VwQXR0cihIRlJfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShIRlJfTU9ERVNfTUFQKSwgaHNyU3RyKTsKKyAgICAgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IGhmck1vZGUpIG5ld0hmck1vZGUgPSBoZnJNb2RlOworICAgIH0KKyAgICBMT0dIKCJwcmV2SGZyTW9kZSAtICVkLCBjdXJyZW50SGZyTW9kZSA9ICVkICIsCisgICAgICAgICAgICAgICAgIG1IZnJNb2RlLCBuZXdIZnJNb2RlKTsKKworICAgIGlmIChtSGZyTW9kZSAhPSBuZXdIZnJNb2RlKSB7CisgICAgICAgIHVwZGF0ZU5lZWRlZCA9IHRydWU7CisgICAgICAgIG1IZnJNb2RlID0gbmV3SGZyTW9kZTsKKyAgICAgICAgc3dpdGNoIChtSGZyTW9kZSkgeworICAgICAgICAgICAgY2FzZSBDQU1fSEZSX01PREVfNjBGUFM6CisgICAgICAgICAgICAgICAgbWluX2ZwcyA9IDYwMDAwOworICAgICAgICAgICAgICAgIG1heF9mcHMgPSA2MDAwMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FNX0hGUl9NT0RFXzkwRlBTOgorICAgICAgICAgICAgICAgIG1pbl9mcHMgPSA5MDAwMDsKKyAgICAgICAgICAgICAgICBtYXhfZnBzID0gOTAwMDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTV9IRlJfTU9ERV8xMjBGUFM6CisgICAgICAgICAgICAgICAgbWluX2ZwcyA9IDEyMDAwMDsKKyAgICAgICAgICAgICAgICBtYXhfZnBzID0gMTIwMDAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1fSEZSX01PREVfMTUwRlBTOgorICAgICAgICAgICAgICAgIG1pbl9mcHMgPSAxNTAwMDA7CisgICAgICAgICAgICAgICAgbWF4X2ZwcyA9IDE1MDAwMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FNX0hGUl9NT0RFXzE4MEZQUzoKKyAgICAgICAgICAgICAgICBtaW5fZnBzID0gMTgwMDAwOworICAgICAgICAgICAgICAgIG1heF9mcHMgPSAxODAwMDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTV9IRlJfTU9ERV8yMTBGUFM6CisgICAgICAgICAgICAgICAgbWluX2ZwcyA9IDIxMDAwMDsKKyAgICAgICAgICAgICAgICBtYXhfZnBzID0gMjEwMDAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1fSEZSX01PREVfMjQwRlBTOgorICAgICAgICAgICAgICAgIG1pbl9mcHMgPSAyNDAwMDA7CisgICAgICAgICAgICAgICAgbWF4X2ZwcyA9IDI0MDAwMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FNX0hGUl9NT0RFXzQ4MEZQUzoKKyAgICAgICAgICAgICAgICBtaW5fZnBzID0gNDgwMDAwOworICAgICAgICAgICAgICAgIG1heF9mcHMgPSA0ODAwMDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTV9IRlJfTU9ERV9PRkY6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIFNldCBWaWRlbyBGcHMgdG8gemVybworICAgICAgICAgICAgICAgIG1pbl9mcHMgPSAwOworICAgICAgICAgICAgICAgIG1heF9mcHMgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1faGZyRnBzUmFuZ2UudmlkZW9fbWluX2ZwcyA9IChmbG9hdCltaW5fZnBzOworICAgICAgICBtX2hmckZwc1JhbmdlLnZpZGVvX21heF9mcHMgPSAoZmxvYXQpbWF4X2ZwczsKKworICAgICAgICBMT0dIKCJIRlIgbW9kZSAoJWQpIFNldCB2aWRlbyBGUFMgOiBtaW5GcHMgPSAlZCwgbWF4RnBzID0gJWQgIiwKKyAgICAgICAgICAgICAgICAgbUhmck1vZGUsIG1pbl9mcHMsIG1heF9mcHMpOworICAgIH0KKworICAgIC8vIFJlbWVtYmVyIGlmIEhGUiBtb2RlIGlzIE9OCisgICAgaWYgKChtSGZyTW9kZSA+IENBTV9IRlJfTU9ERV9PRkYpICYmIChtSGZyTW9kZSA8IENBTV9IRlJfTU9ERV9NQVgpKSB7CisgICAgICAgIExPR0goIkhGUiBtb2RlIGlzIE9OIik7CisgICAgICAgIG1fYkhmck1vZGUgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1faGZyRnBzUmFuZ2UudmlkZW9fbWluX2ZwcyA9IDA7CisgICAgICAgIG1faGZyRnBzUmFuZ2UudmlkZW9fbWF4X2ZwcyA9IDA7CisgICAgICAgIG1fYkhmck1vZGUgPSBmYWxzZTsKKyAgICAgICAgTE9HSCgiSEZSIG1vZGUgaXMgT0ZGIik7CisgICAgfQorICAgIG1faGZyRnBzUmFuZ2UubWluX2ZwcyA9IChmbG9hdClwYXJtX21pbmZwczsKKyAgICBtX2hmckZwc1JhbmdlLm1heF9mcHMgPSAoZmxvYXQpcGFybV9tYXhmcHM7CisKKyAgICBpZiAobV9iSGZyTW9kZSAmJiAobUhmck1vZGUgPiBDQU1fSEZSX01PREVfMTIwRlBTKQorICAgICAgICAgICAgJiYgKHBhcm1fbWF4ZnBzICE9IDApKSB7CisgICAgICAgIC8vQ29uZmlndXJlIGJ1ZmZlciBiYXRjaCBjb3VudCB0byB1c2UgYmF0Y2ggbW9kZSBmb3IgaGlnaGVyIGZwcworICAgICAgICBzZXRCdWZCYXRjaENvdW50KChpbnQ4X3QpKG1faGZyRnBzUmFuZ2UudmlkZW9fbWF4X2ZwcyAvIHBhcm1fbWF4ZnBzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy9SZXNldCBiYXRjaCBjb3VudCBhbmQgdXBkYXRlIEtFWSBmb3IgZW5jb2RlcgorICAgICAgICBzZXRCdWZCYXRjaENvdW50KDApOworICAgIH0KKyAgICByZXR1cm4gdXBkYXRlTmVlZGVkOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFByZXZpZXdGcmFtZVJhdGUKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHByZXZpZXcgZnJhbWUgcmF0ZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0UHJldmlld0ZyYW1lUmF0ZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1BSRVZJRVdfRlJBTUVfUkFURSk7CisgICAgY29uc3QgY2hhciAqcHJldl9zdHIgPSBnZXQoS0VZX1BSRVZJRVdfRlJBTUVfUkFURSk7CisKKyAgICBpZiAoIHN0ciApIHsKKyAgICAgICAgaWYgKCBwcmV2X3N0ciAmJgorICAgICAgICAgICAgIHN0cmNtcChzdHIsIHByZXZfc3RyKSkgeworICAgICAgICAgICAgTE9HRCgiUmVxdWVzdGVkIEZpeGVkIEZyYW1lIFJhdGUgJXMiLCBzdHIpOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUFJFVklFV19GUkFNRV9SQVRFLCBzdHIpOworICAgICAgICAgICAgbV9iRml4ZWRGcmFtZVJhdGVTZXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRFZmZlY3QKKyAqCisgKiBERVNDUklQVElPTjogc2V0IGVmZmVjdCB2YWx1ZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0RWZmZWN0KGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfRUZGRUNUKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfRUZGRUNUKTsKKworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuZWZmZWN0IiwgcHJvcCwgIm5vbmUiKTsKKworICAgIGlmIChzdHJjbXAocHJvcCwgIm5vbmUiKSkgeworICAgICAgICBpZiAoKHByZXZfc3RyID09IE5VTEwpIHx8CisgICAgICAgICAgICAgICAgKHN0cmNtcChwcm9wLCBwcmV2X3N0cikgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAobV9iVXBkYXRlRWZmZWN0cyA9PSB0cnVlKSkgeworICAgICAgICAgICAgbV9iVXBkYXRlRWZmZWN0cyA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHNldEVmZmVjdChwcm9wKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKChwcmV2X3N0ciA9PSBOVUxMKSB8fAorICAgICAgICAgICAgICAgIChzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAobV9iVXBkYXRlRWZmZWN0cyA9PSB0cnVlKSkgeworICAgICAgICAgICAgbV9iVXBkYXRlRWZmZWN0cyA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHNldEVmZmVjdChzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRGb2N1c01vZGUKKyAqCisgKiBERVNDUklQVElPTjogc2V0IGZvY3VzIG1vZGUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEZvY3VzTW9kZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX0ZPQ1VTX01PREUpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9GT0NVU19NT0RFKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0Rm9jdXNNb2RlKHN0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEZvY3VzUG9zaXRpb24KKyAqCisgKiBERVNDUklQVElPTjogc2V0IGZvY3VzIHBvc2l0aW9uIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90ICBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0Rm9jdXNQb3NpdGlvbihjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKmZvY3VzX3N0ciA9IHBhcmFtcy5nZXQoS0VZX0ZPQ1VTX01PREUpOworICAgIGNvbnN0IGNoYXIgKnByZXZfZm9jdXNfc3RyID0gZ2V0KEtFWV9GT0NVU19NT0RFKTsKKworICAgIGlmIChOVUxMID09IGZvY3VzX3N0cikgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgTE9HRCgiY3VycmVudCBmb2N1cyBtb2RlOiAlcyIsIGZvY3VzX3N0cik7CisgICAgaWYgKHN0cmNtcChmb2N1c19zdHIsIEZPQ1VTX01PREVfTUFOVUFMX1BPU0lUSU9OKSkgeworICAgICAgICBMT0dIKCIsIGRvbnQgc2V0IGZvY3VzIHBvcyB0byBiYWNrLWVuZCEiKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnBvcyA9IHBhcmFtcy5nZXQoS0VZX1FDX01BTlVBTF9GT0NVU19QT1NJVElPTik7CisgICAgY29uc3QgY2hhciAqcHJldl9wb3MgPSBnZXQoS0VZX1FDX01BTlVBTF9GT0NVU19QT1NJVElPTik7CisgICAgY29uc3QgY2hhciAqdHlwZSA9IHBhcmFtcy5nZXQoS0VZX1FDX01BTlVBTF9GT0NVU19QT1NfVFlQRSk7CisgICAgY29uc3QgY2hhciAqcHJldl90eXBlID0gZ2V0KEtFWV9RQ19NQU5VQUxfRk9DVVNfUE9TX1RZUEUpOworCisgICAgaWYgKChwb3MgIT0gTlVMTCkgJiYgKHR5cGUgIT0gTlVMTCkgJiYgKGZvY3VzX3N0ciAhPSBOVUxMKSkgeworICAgICAgICBpZiAocHJldl9wb3MgID09IE5VTEwgfHwgKHN0cmNtcChwb3MsIHByZXZfcG9zKSAhPSAwKSB8fAorICAgICAgICAgICAgcHJldl90eXBlID09IE5VTEwgfHwgKHN0cmNtcCh0eXBlLCBwcmV2X3R5cGUpICE9IDApIHx8CisgICAgICAgICAgICBwcmV2X2ZvY3VzX3N0ciA9PSBOVUxMIHx8IChzdHJjbXAoZm9jdXNfc3RyLCBwcmV2X2ZvY3VzX3N0cikgIT0gMCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRGb2N1c1Bvc2l0aW9uKHR5cGUsIHBvcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0QnJpZ2h0bmVzcworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgYnJpZ2h0bmVzcyBjb250cm9sIHZhbHVlIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRCcmlnaHRuZXNzKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgaW50IGN1cnJlbnRCcmlnaHRuZXNzID0gZ2V0SW50KEtFWV9RQ19CUklHSFRORVNTKTsKKyAgICBpbnQgYnJpZ2h0bmVzcyA9IHBhcmFtcy5nZXRJbnQoS0VZX1FDX0JSSUdIVE5FU1MpOworCisgICAgaWYocGFyYW1zLmdldChLRVlfUUNfQlJJR0hUTkVTUykgPT0gTlVMTCkgeworICAgICAgIExPR0goIkJyaWd0bmVzcyBub3Qgc2V0IGJ5IEFwcCAiKTsKKyAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGlmIChjdXJyZW50QnJpZ2h0bmVzcyAhPSAgYnJpZ2h0bmVzcykgeworICAgICAgICBpZiAoYnJpZ2h0bmVzcyA+PSBtX3BDYXBhYmlsaXR5LT5icmlnaHRuZXNzX2N0cmwubWluX3ZhbHVlICYmCisgICAgICAgICAgICBicmlnaHRuZXNzIDw9IG1fcENhcGFiaWxpdHktPmJyaWdodG5lc3NfY3RybC5tYXhfdmFsdWUpIHsKKyAgICAgICAgICAgIExPR0QoIm5ldyBicmlnaHRuZXNzIHZhbHVlIDogJWQgIiwgYnJpZ2h0bmVzcyk7CisgICAgICAgICAgICByZXR1cm4gc2V0QnJpZ2h0bmVzcyhicmlnaHRuZXNzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoImludmFsaWQgdmFsdWUgJWQgb3V0IG9mICglZCwgJWQpIiwKKyAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzLAorICAgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+YnJpZ2h0bmVzc19jdHJsLm1pbl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPmJyaWdodG5lc3NfY3RybC5tYXhfdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIk5vIGJyaWdodG5lc3MgdmFsdWUgY2hhbmdlZC4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRCcmlnaHRuZXNzCisgKgorICogREVTQ1JJUFRJT046IGdldCBicmlnaHRuZXNzIGNvbnRyb2wgdmFsdWUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0QnJpZ2h0bmVzcygpCit7CisgICAgcmV0dXJuIGdldEludChLRVlfUUNfQlJJR0hUTkVTUyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U2hhcnBuZXNzCisgKgorICogREVTQ1JJUFRJT046IHNldCBzaGFycG5lc3MgY29udHJvbCB2YWx1ZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0U2hhcnBuZXNzKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgaW50IHNoYXBybmVzcyA9IHBhcmFtcy5nZXRJbnQoS0VZX1FDX1NIQVJQTkVTUyk7CisgICAgaW50IHByZXZfc2hhcnAgPSBnZXRJbnQoS0VZX1FDX1NIQVJQTkVTUyk7CisKKyAgICBpZihwYXJhbXMuZ2V0KEtFWV9RQ19TSEFSUE5FU1MpID09IE5VTEwpIHsKKyAgICAgICBMT0dIKCJTaGFycG5lc3Mgbm90IHNldCBieSBBcHAgIik7CisgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBpZiAocHJldl9zaGFycCAhPSAgc2hhcHJuZXNzKSB7CisgICAgICAgIGlmKChzaGFwcm5lc3MgPj0gbV9wQ2FwYWJpbGl0eS0+c2hhcnBuZXNzX2N0cmwubWluX3ZhbHVlKSAmJgorICAgICAgICAgICAoc2hhcHJuZXNzIDw9IG1fcENhcGFiaWxpdHktPnNoYXJwbmVzc19jdHJsLm1heF92YWx1ZSkpIHsKKyAgICAgICAgICAgIExPR0QoIm5ldyBzaGFycG5lc3MgdmFsdWUgOiAlZCAiLCBzaGFwcm5lc3MpOworICAgICAgICAgICAgcmV0dXJuIHNldFNoYXJwbmVzcyhzaGFwcm5lc3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiaW52YWxpZCB2YWx1ZSAlZCBvdXQgb2YgKCVkLCAlZCkiLAorICAgICAgICAgICAgICAgICAgIHNoYXBybmVzcywKKyAgICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnNoYXJwbmVzc19jdHJsLm1pbl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnNoYXJwbmVzc19jdHJsLm1heF92YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiTm8gdmFsdWUgY2hhbmdlIGluIHNoYXBybmVzcyIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFNraW50b25lRW5haGFuY2VtZW50CisgKgorICogREVTQ1JJUFRJT046IHNldCBza2luIHRvbmUgZW5oYW5jZW1lbnQgZmFjdG9yIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRTa2luVG9uZUVuaGFuY2VtZW50KGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgaW50IHNjZUZhY3RvciA9IHBhcmFtcy5nZXRJbnQoS0VZX1FDX1NDRV9GQUNUT1IpOworICAgIGludCBwcmV2X3NjZUZhY3RvciA9IGdldEludChLRVlfUUNfU0NFX0ZBQ1RPUik7CisKKyAgICBpZihwYXJhbXMuZ2V0KEtFWV9RQ19TQ0VfRkFDVE9SKSA9PSBOVUxMKSB7CisgICAgICAgTE9HSCgiU2tpbnRvbmUgZW5oYW5jZW1lbnQgbm90IHNldCBieSBBcHAgIik7CisgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBpZiAocHJldl9zY2VGYWN0b3IgIT0gc2NlRmFjdG9yKSB7CisgICAgICAgIGlmKChzY2VGYWN0b3IgPj0gbV9wQ2FwYWJpbGl0eS0+c2NlX2N0cmwubWluX3ZhbHVlKSAmJgorICAgICAgICAgICAoc2NlRmFjdG9yIDw9IG1fcENhcGFiaWxpdHktPnNjZV9jdHJsLm1heF92YWx1ZSkpIHsKKyAgICAgICAgICAgIExPR0QoIm5ldyBTa2ludG9uZSBFbmhhbmNlbWVudCB2YWx1ZSA6ICVkICIsIHNjZUZhY3Rvcik7CisgICAgICAgICAgICByZXR1cm4gc2V0U2tpblRvbmVFbmhhbmNlbWVudChzY2VGYWN0b3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiaW52YWxpZCB2YWx1ZSAlZCBvdXQgb2YgKCVkLCAlZCkiLAorICAgICAgICAgICAgICAgICAgIHNjZUZhY3RvciwKKyAgICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnNjZV9jdHJsLm1pbl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnNjZV9jdHJsLm1heF92YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiTm8gdmFsdWUgY2hhbmdlIGluIHNraW50b25lIGVuaGFuY2VtZW50IGZhY3RvciIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFNhdHVyYXRpb24KKyAqCisgKiBERVNDUklQVElPTjogc2V0IHNhdHVyYXRpb24gY29udHJvbCB2YWx1ZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0U2F0dXJhdGlvbihjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGludCBzYXR1cmF0aW9uID0gcGFyYW1zLmdldEludChLRVlfUUNfU0FUVVJBVElPTik7CisgICAgaW50IHByZXZfc2F0ID0gZ2V0SW50KEtFWV9RQ19TQVRVUkFUSU9OKTsKKworICAgIGlmKHBhcmFtcy5nZXQoS0VZX1FDX1NBVFVSQVRJT04pID09IE5VTEwpIHsKKyAgICAgICBMT0dIKCJTYXR1cmF0aW9uIG5vdCBzZXQgYnkgQXBwICIpOworICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgaWYgKHByZXZfc2F0ICE9ICBzYXR1cmF0aW9uKSB7CisgICAgICAgIGlmKChzYXR1cmF0aW9uID49IG1fcENhcGFiaWxpdHktPnNhdHVyYXRpb25fY3RybC5taW5fdmFsdWUpICYmCisgICAgICAgICAgIChzYXR1cmF0aW9uIDw9IG1fcENhcGFiaWxpdHktPnNhdHVyYXRpb25fY3RybC5tYXhfdmFsdWUpKSB7CisgICAgICAgICAgICBMT0dEKCJuZXcgc2F0dXJhdGlvbiB2YWx1ZSA6ICVkICIsIHNhdHVyYXRpb24pOworICAgICAgICAgICAgcmV0dXJuIHNldFNhdHVyYXRpb24oc2F0dXJhdGlvbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJpbnZhbGlkIHZhbHVlICVkIG91dCBvZiAoJWQsICVkKSIsCisgICAgICAgICAgICAgICAgICAgc2F0dXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnNhdHVyYXRpb25fY3RybC5taW5fdmFsdWUsCisgICAgICAgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5zYXR1cmF0aW9uX2N0cmwubWF4X3ZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJObyB2YWx1ZSBjaGFuZ2UgaW4gc2F0dXJhdGlvbiBmYWN0b3IiKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRDb250cmFzdAorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgY29udHJhc3QgY29udHJvbCB2YWx1ZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0Q29udHJhc3QoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBpbnQgY29udHJhc3QgPSBwYXJhbXMuZ2V0SW50KEtFWV9RQ19DT05UUkFTVCk7CisgICAgaW50IHByZXZfY29udHJhc3QgPSBnZXRJbnQoS0VZX1FDX0NPTlRSQVNUKTsKKworICAgIGlmKHBhcmFtcy5nZXQoS0VZX1FDX0NPTlRSQVNUKSA9PSBOVUxMKSB7CisgICAgICAgTE9HSCgiQ29udHJhc3Qgbm90IHNldCBieSBBcHAgIik7CisgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBpZiAocHJldl9jb250cmFzdCAhPSAgY29udHJhc3QpIHsKKyAgICAgICAgaWYoKGNvbnRyYXN0ID49IG1fcENhcGFiaWxpdHktPmNvbnRyYXN0X2N0cmwubWluX3ZhbHVlKSAmJgorICAgICAgICAgICAoY29udHJhc3QgPD0gbV9wQ2FwYWJpbGl0eS0+Y29udHJhc3RfY3RybC5tYXhfdmFsdWUpKSB7CisgICAgICAgICAgICBMT0dEKCJuZXcgY29udHJhc3QgdmFsdWUgOiAlZCAiLCBjb250cmFzdCk7CisgICAgICAgICAgICBpbnQzMl90IHJjID0gc2V0Q29udHJhc3QoY29udHJhc3QpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiaW52YWxpZCB2YWx1ZSAlZCBvdXQgb2YgKCVkLCAlZCkiLAorICAgICAgICAgICAgICAgICAgIGNvbnRyYXN0LAorICAgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+Y29udHJhc3RfY3RybC5taW5fdmFsdWUsCisgICAgICAgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5jb250cmFzdF9jdHJsLm1heF92YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiTm8gdmFsdWUgY2hhbmdlIGluIGNvbnRyYXN0Iik7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0RXhwb3N1cmVDb21wZW5zYXRpb24KKyAqCisgKiBERVNDUklQVElPTjogc2V0IGV4cG9zdXJlIGNvbXBlbnNhdGlvbiB2YWx1ZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0RXhwb3N1cmVDb21wZW5zYXRpb24oY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMgJiBwYXJhbXMpCit7CisgICAgaW50IGV4cENvbXAgPSBwYXJhbXMuZ2V0SW50KEtFWV9FWFBPU1VSRV9DT01QRU5TQVRJT04pOworICAgIGludCBwcmV2X2V4cENvbXAgPSBnZXRJbnQoS0VZX0VYUE9TVVJFX0NPTVBFTlNBVElPTik7CisKKyAgICBpZihwYXJhbXMuZ2V0KEtFWV9FWFBPU1VSRV9DT01QRU5TQVRJT04pID09IE5VTEwpIHsKKyAgICAgICBMT0dIKCJFeHBvc3VyZSBjb21wZW5zYXRpb24gbm90IHNldCBieSBBcHAgIik7CisgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBpZiAocHJldl9leHBDb21wICE9IGV4cENvbXApIHsKKyAgICAgICAgaWYoKGV4cENvbXAgPj0gbV9wQ2FwYWJpbGl0eS0+ZXhwb3N1cmVfY29tcGVuc2F0aW9uX21pbikgJiYKKyAgICAgICAgICAgKGV4cENvbXAgPD0gbV9wQ2FwYWJpbGl0eS0+ZXhwb3N1cmVfY29tcGVuc2F0aW9uX21heCkpIHsKKyAgICAgICAgICAgIExPR0QoIm5ldyBFeHBvc3VyZSBDb21wZW5zYXRpb24gdmFsdWUgOiAlZCAiLCBleHBDb21wKTsKKyAgICAgICAgICAgIHJldHVybiBzZXRFeHBvc3VyZUNvbXBlbnNhdGlvbihleHBDb21wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoImludmFsaWQgdmFsdWUgJWQgb3V0IG9mICglZCwgJWQpIiwKKyAgICAgICAgICAgICAgICAgICBleHBDb21wLAorICAgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+ZXhwb3N1cmVfY29tcGVuc2F0aW9uX21pbiwKKyAgICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPmV4cG9zdXJlX2NvbXBlbnNhdGlvbl9tYXgpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIk5vIHZhbHVlIGNoYW5nZSBpbiBFeHBvc3VyZSBDb21wZW5zYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRXaGl0ZUJhbGFuY2UKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHdoaXRlIGJhbGFuY2UgdmFsdWUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFdoaXRlQmFsYW5jZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1dISVRFX0JBTEFOQ0UpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9XSElURV9CQUxBTkNFKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0V2hpdGVCYWxhbmNlKHN0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldE1hbnVhbFdoaXRlQmFsYW5jZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgbWFudWFsIHdoaXRlIGJhbGFuY2UgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgIFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRNYW51YWxXaGl0ZUJhbGFuY2UoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgY29uc3QgY2hhciAqd2Jfc3RyID0gcGFyYW1zLmdldChLRVlfV0hJVEVfQkFMQU5DRSk7CisgICAgY29uc3QgY2hhciAqcHJldl93Yl9zdHIgPSBnZXQoS0VZX1dISVRFX0JBTEFOQ0UpOworICAgIExPR0QoImN1cnJlbnQgd2IgbW9kZTogJXMiLCB3Yl9zdHIpOworCisgICAgaWYgKHdiX3N0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzdHJjbXAod2Jfc3RyLCBXSElURV9CQUxBTkNFX01BTlVBTCkpIHsKKyAgICAgICAgICAgIExPR0QoImRvbnQgc2V0IGNjdCB0byBiYWNrLWVuZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gcGFyYW1zLmdldChLRVlfUUNfTUFOVUFMX1dCX1ZBTFVFKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3ZhbHVlID0gZ2V0KEtFWV9RQ19NQU5VQUxfV0JfVkFMVUUpOworICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBwYXJhbXMuZ2V0KEtFWV9RQ19NQU5VQUxfV0JfVFlQRSk7CisgICAgY29uc3QgY2hhciAqcHJldl90eXBlID0gZ2V0KEtFWV9RQ19NQU5VQUxfV0JfVFlQRSk7CisKKyAgICBpZiAoKHZhbHVlICE9IE5VTEwpICYmICh0eXBlICE9IE5VTEwpICYmICh3Yl9zdHIgIT0gTlVMTCkpIHsKKyAgICAgICAgaWYgKHByZXZfdmFsdWUgID09IE5VTEwgfHwgKHN0cmNtcCh2YWx1ZSwgcHJldl92YWx1ZSkgIT0gMCkgfHwKKyAgICAgICAgICAgIHByZXZfdHlwZSA9PSBOVUxMIHx8IChzdHJjbXAodHlwZSwgcHJldl90eXBlKSAhPSAwKSB8fAorICAgICAgICAgICAgcHJldl93Yl9zdHIgPT0gTlVMTCB8fCAoc3RyY21wKHdiX3N0ciwgcHJldl93Yl9zdHIpICE9IDApKSB7CisgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19NQU5VQUxfV0JfVFlQRSwgdHlwZSk7CisgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19NQU5VQUxfV0JfVkFMVUUsIHZhbHVlKTsKKyAgICAgICAgICAgIGludDMyX3Qgd2JfdHlwZSA9IGF0b2kodHlwZSk7CisgICAgICAgICAgICBpZiAod2JfdHlwZSA9PSBDQU1fTUFOVUFMX1dCX01PREVfQ0NUKSB7CisgICAgICAgICAgICAgICAgcmMgPSBzZXRXQk1hbnVhbENDVCh2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHdiX3R5cGUgPT0gQ0FNX01BTlVBTF9XQl9NT0RFX0dBSU4pIHsKKyAgICAgICAgICAgICAgICByYyA9IHNldE1hbnVhbFdCR2FpbnModmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0QW50aWJhbmRpbmcKKyAqCisgKiBERVNDUklQVElPTjogc2V0IGFudGliYW5kaW5nIHZhbHVlIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRBbnRpYmFuZGluZyhjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX0FOVElCQU5ESU5HKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfQU5USUJBTkRJTkcpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRBbnRpYmFuZGluZyhzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRTdGF0c0RlYnVnTWFzaworICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgdGhlIHZhbHVlIGZyb20gcGVyc2lzdCBmaWxlIGluIFN0YXRzIG1vZHVsZSB0aGF0IHdpbGwKKyAqICAgICAgICAgICAgICBjb250cm9sIGZ1bnRpb25hbGl0eSBpbiB0aGUgbW9kdWxlCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRTdGF0c0RlYnVnTWFzaygpCit7CisgICAgdWludDMyX3QgbWFzayA9IDA7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5zdGF0cy5kZWJ1Zy5tYXNrIiwgdmFsdWUsICIwIik7CisgICAgbWFzayA9ICh1aW50MzJfdClhdG9pKHZhbHVlKTsKKworICAgIExPR0goImN0cmwgbWFzayA6JWQiLCBtYXNrKTsKKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX1NUQVRTX0RFQlVHX01BU0ssIG1hc2spKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFBBQUYKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IHRoZSB2YWx1ZSBmcm9tIHBlcnNpc3QgZmlsZSBpbiBTdGF0cyBtb2R1bGUgdGhhdCB3aWxsCisgKiAgICAgICAgICAgICAgY29udHJvbCB0aGUgcHJldmlldyBhc3Npc3RlZCBBRiBpbiB0aGUgbW9kdWxlCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRQQUFGKCkKK3sKKyAgICB1aW50MzJfdCBwYWFmID0gMDsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnN0YXRzLmFmLnBhYWYiLCB2YWx1ZSwgIjEiKTsKKyAgICBwYWFmID0gKHVpbnQzMl90KWF0b2kodmFsdWUpOworCisgICAgTE9HSCgiUEFBRiBpczogJXMiLCBwYWFmID8gIk9OIjogIk9GRiIpOworCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fU1RBVFNfQUZfUEFBRiwgcGFhZikpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U2NlbmVEZXRlY3QKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHNjZW5lbiBkZXRlY3QgdmFsdWUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFNjZW5lRGV0ZWN0KGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfUUNfU0NFTkVfREVURUNUKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfU0NFTkVfREVURUNUKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0U2NlbmVEZXRlY3Qoc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0VmlkZW9IRFIKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHZpZGVvIEhEUiB2YWx1ZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0VmlkZW9IRFIoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19WSURFT19IRFIpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19WSURFT19IRFIpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRWaWRlb0hEUihzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRWdEVuYWJsZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgdnQgVGltZSBTdGFtcCBlbmFibGUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFZ0RW5hYmxlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfUUNfVlRfRU5BQkxFKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfVlRfRU5BQkxFKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0VnRFbmFibGUoc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0RmFjZVJlY29nbml0aW9uCisgKgorICogREVTQ1JJUFRJT046IHNldCBmYWNlIHJlY29nbml0aW9uIG1vZGUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEZhY2VSZWNvZ25pdGlvbihjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX0ZBQ0VfUkVDT0dOSVRJT04pOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19GQUNFX1JFQ09HTklUSU9OKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICB1aW50MzJfdCBtYXhGYWNlcyA9ICh1aW50MzJfdClwYXJhbXMuZ2V0SW50KEtFWV9RQ19NQVhfTlVNX1JFUVVFU1RFRF9GQUNFUyk7CisgICAgICAgICAgICByZXR1cm4gc2V0RmFjZVJlY29nbml0aW9uKHN0ciwgbWF4RmFjZXMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRab29tCisgKgorICogREVTQ1JJUFRJT046IHNldCB6b29tIHZhbHVlIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRab29tKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgaWYgKChtX3BDYXBhYmlsaXR5LT56b29tX3N1cHBvcnRlZCA9PSAwIHx8CisgICAgICAgICBtX3BDYXBhYmlsaXR5LT56b29tX3JhdGlvX3RibF9jbnQgPT0gMCkpIHsKKyAgICAgICAgTE9HSCgibm8gem9vbSBzdXBwb3J0Iik7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBpbnQgem9vbUxldmVsID0gcGFyYW1zLmdldEludChLRVlfWk9PTSk7CisgICAgbVBhcm1ab29tTGV2ZWwgPSB6b29tTGV2ZWw7CisgICAgaWYgKCh6b29tTGV2ZWwgPCAwKSB8fCAoem9vbUxldmVsID49IChpbnQpbV9wQ2FwYWJpbGl0eS0+em9vbV9yYXRpb190YmxfY250KSkgeworICAgICAgICBMT0dFKCJpbnZhbGlkIHZhbHVlICVkIG91dCBvZiAoJWQsICVkKSIsCisgICAgICAgICAgICAgICB6b29tTGV2ZWwsCisgICAgICAgICAgICAgIDAsIG1fcENhcGFiaWxpdHktPnpvb21fcmF0aW9fdGJsX2NudC0xKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbnQgcHJldlpvb21MZXZlbCA9IGdldEludChLRVlfWk9PTSk7CisgICAgaWYgKHByZXZab29tTGV2ZWwgPT0gem9vbUxldmVsKSB7CisgICAgICAgIExPR0QoIk5vIHZhbHVlIGNoYW5nZSBpbiB6b29tICVkICVkIiwgcHJldlpvb21MZXZlbCwgem9vbUxldmVsKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBzZXRab29tKHpvb21MZXZlbCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0SVNPVmFsdWUKKyAqCisgKiBERVNDUklQVElPTjogc2V0IElTTyB2YWx1ZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCAgUUNhbWVyYVBhcmFtZXRlcnM6OnNldElTT1ZhbHVlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfUUNfSVNPX01PREUpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19JU09fTU9ERSk7CisKKyAgICBpZihnZXRNYW51YWxDYXB0dXJlTW9kZSgpKSB7CisgICAgICAgIGNoYXIgaXNvX3ZhbFtQUk9QRVJUWV9WQUxVRV9NQVhdOworCisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuaXNvIiwgaXNvX3ZhbCwgIiIpOworICAgICAgICBpZiAoc3RybGVuKGlzb192YWwpID4gMCkgeworICAgICAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RyY21wKGlzb192YWwsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNldElTT1ZhbHVlKGlzb192YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRJU09WYWx1ZShzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRDb250aW51b3VzSVNPCisgKgorICogREVTQ1JJUFRJT046IHNldCBJU08gdmFsdWUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgIFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRDb250aW51b3VzSVNPKGNvbnN0IGNoYXIgKmlzb1ZhbHVlKQoreworICAgIGNoYXIgaXNvW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaW50MzJfdCBjb250aW5vdXNfaXNvID0gMDsKKworICAgIC8vIENoZWNrIGlmIGNvbnRpbnVvdXMgSVNPIGlzIHNldCB0aHJvdWdoIHNldHByb3BlcnR5CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5jb250aW51b3VzLmlzbyIsIGlzbywgIiIpOworICAgIGlmIChzdHJsZW4oaXNvKSA+IDApIHsKKyAgICAgICAgY29udGlub3VzX2lzbyA9IGF0b2koaXNvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb250aW5vdXNfaXNvID0gYXRvaShpc29WYWx1ZSk7CisgICAgfQorCisgICAgaWYgKChjb250aW5vdXNfaXNvID49IDApICYmCisgICAgICAgICAgICAoY29udGlub3VzX2lzbyA8PSBtX3BDYXBhYmlsaXR5LT5zZW5zaXRpdml0eV9yYW5nZS5tYXhfc2Vuc2l0aXZpdHkpKSB7CisgICAgICAgIExPR0goIlNldHRpbmcgY29udGludW91cyBJU08gdmFsdWUgJWQiLCBjb250aW5vdXNfaXNvKTsKKyAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfQ09OVElOVU9VU19JU08sIGlzb1ZhbHVlKTsKKworICAgICAgICBjYW1faW50Zl9wYXJtX21hbnVhbF8zYV90IGlzb19zZXR0aW5nczsKKyAgICAgICAgbWVtc2V0KCZpc29fc2V0dGluZ3MsIDAsIHNpemVvZihjYW1faW50Zl9wYXJtX21hbnVhbF8zYV90KSk7CisgICAgICAgIGlzb19zZXR0aW5ncy5wcmV2aWV3T25seSA9IEZBTFNFOworICAgICAgICBpc29fc2V0dGluZ3MudmFsdWUgPSBjb250aW5vdXNfaXNvOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9JU08sIGlzb19zZXR0aW5ncykpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBMT0dFKCJJbnZhbGlkIGlzbyB2YWx1ZTogJWQiLCBjb250aW5vdXNfaXNvKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEV4cG9zdXJlVGltZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgZXhwb3N1cmUgdGltZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCAgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEV4cG9zdXJlVGltZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX0VYUE9TVVJFX1RJTUUpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19FWFBPU1VSRV9USU1FKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICBzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHNldEV4cG9zdXJlVGltZShzdHIpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmKGdldE1hbnVhbENhcHR1cmVNb2RlKCkpIHsKKyAgICAgICAgY2hhciBleHBUaW1lW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5leHBvc3VyZS50aW1lIiwgZXhwVGltZSwgIiIpOworICAgICAgICBpZiAoc3RybGVuKGV4cFRpbWUpID4gMCkgeworICAgICAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RyY21wKGV4cFRpbWUsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNldEV4cG9zdXJlVGltZShleHBUaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRWaWRlb1JvdGF0aW9uCisgKgorICogREVTQ1JJUFRJT046IHNldCByb3RhdGlvbiB2YWx1ZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0VmlkZW9Sb3RhdGlvbihjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1ZJREVPX1JPVEFUSU9OKTsKKyAgICBpZihzdHIgIT0gTlVMTCkgeworICAgICAgICBpbnQgdmFsdWUgPSBsb29rdXBBdHRyKFZJREVPX1JPVEFUSU9OX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShWSURFT19ST1RBVElPTl9NT0RFU19NQVApLCBzdHIpOworICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1ZJREVPX1JPVEFUSU9OLCBzdHIpOworICAgICAgICAgICAgTE9HTCgic2V0VmlkZW9Sb3RhdGlvbjogICAlZDogIiwgc3RyLCB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHJvdGF0aW9uIHZhbHVlOiAlZCIsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0Um90YXRpb24KKyAqCisgKiBERVNDUklQVElPTjogc2V0IHJvdGF0aW9uIHZhbHVlIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRSb3RhdGlvbihjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGludDMyX3Qgcm90YXRpb24gPSBwYXJhbXMuZ2V0SW50KEtFWV9ST1RBVElPTik7CisgICAgaWYgKHJvdGF0aW9uICE9IC0xKSB7CisgICAgICAgIGlmIChyb3RhdGlvbiA9PSAwIHx8IHJvdGF0aW9uID09IDkwIHx8CisgICAgICAgICAgICByb3RhdGlvbiA9PSAxODAgfHwgcm90YXRpb24gPT0gMjcwKSB7CisgICAgICAgICAgICBzZXQoS0VZX1JPVEFUSU9OLCByb3RhdGlvbik7CisKKyAgICAgICAgICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX01FVEFfSlBFR19PUklFTlRBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgcm90YXRpb24pOworICAgICAgICAgICAgbVJvdGF0aW9uID0gcm90YXRpb247CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHJvdGF0aW9uIHZhbHVlOiAlZCIsIHJvdGF0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEZsYXNoCisgKgorICogREVTQ1JJUFRJT046IHNldCBmbGFzaCBtb2RlIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRGbGFzaChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX0ZMQVNIX01PREUpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9GTEFTSF9NT0RFKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0Rmxhc2goc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0QWVjTG9jaworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgQUVDIGxvY2sgdmFsdWUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEFlY0xvY2soY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9BVVRPX0VYUE9TVVJFX0xPQ0spOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9BVVRPX0VYUE9TVVJFX0xPQ0spOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRBZWNMb2NrKHN0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEF3YkxvY2sKKyAqCisgKiBERVNDUklQVElPTjogc2V0IEFXQiBsb2NrIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRBd2JMb2NrKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfQVVUT19XSElURUJBTEFOQ0VfTE9DSyk7CisgICAgY29uc3QgY2hhciAqcHJldl9zdHIgPSBnZXQoS0VZX0FVVE9fV0hJVEVCQUxBTkNFX0xPQ0spOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRBd2JMb2NrKHN0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEF1dG9IRFIKKyAqCisgKiBERVNDUklQVElPTjogRW5hYmxlL2Rpc2FibGUgYXV0byBIRFIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEF1dG9IRFIoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19BVVRPX0hEUl9FTkFCTEUpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19BVVRPX0hEUl9FTkFCTEUpOworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworCisgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5hdXRvLmhkci5lbmFibGUiLCBwcm9wLCBWQUxVRV9ESVNBQkxFKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICBzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkgeworICAgICAgICAgICBMT0dIKCJBdXRvIEhEUiBzZXQgdG86ICVzIiwgc3RyKTsKKyAgICAgICAgICAgcmV0dXJuIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX0FVVE9fSERSX0VOQUJMRSwgc3RyKTsKKyAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICBzdHJjbXAocHJldl9zdHIsIHByb3ApICE9IDAgKSB7CisgICAgICAgICAgIExPR0goIkF1dG8gSERSIHNldCB0bzogJXMiLCBwcm9wKTsKKyAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfQVVUT19IRFJfRU5BQkxFLCBwcm9wKTsKKyAgICAgICB9CisgICAgfQorCisgICAgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBGVU5DVElPTiAgIDogaXNBdXRvSERSRW5hYmxlZAorKgorKiBERVNDUklQVElPTjogUXVlcnkgYXV0byBIRFIgc3RhdHVzCisqCisqIFBBUkFNRVRFUlMgOiBOb25lCisqCisqIFJFVFVSTiAgICAgOiBib29sIHRydWUvZmFsc2UKKyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjppc0F1dG9IRFJFbmFibGVkKCkKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBnZXQoS0VZX1FDX0FVVE9fSERSX0VOQUJMRSk7CisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgdmFsdWUgPSBsb29rdXBBdHRyKEVOQUJMRV9ESVNBQkxFX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShFTkFCTEVfRElTQUJMRV9NT0RFU19NQVApLCBzdHIpOworICAgICAgICBpZiAodmFsdWUgPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgQXV0byBIRFIgdmFsdWUgJXMiLCBzdHIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgTE9HSCgiQXV0byBIRFIgc3RhdHVzIGlzOiAlZCIsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlID8gdHJ1ZSA6IGZhbHNlOworICAgIH0KKworICAgIExPR0goIkF1dG8gSERSIHN0YXR1cyBub3Qgc2V0ISIpOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRNQ0VWYWx1ZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgbWVtb3J5IGNvbG9yIGVuaGFuY2VtZW50IHZhbHVlIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRNQ0VWYWx1ZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX01FTU9SWV9DT0xPUl9FTkhBTkNFTUVOVCk7CisgICAgY29uc3QgY2hhciAqcHJldl9zdHIgPSBnZXQoS0VZX1FDX01FTU9SWV9DT0xPUl9FTkhBTkNFTUVOVCk7CisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwcmV2X3N0ciA9PSBOVUxMIHx8CisgICAgICAgICAgICBzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHNldE1DRVZhbHVlKHN0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldERJU1ZhbHVlCisgKgorICogREVTQ1JJUFRJT046IGVuYWJsZS9kaXNhYmxlIERJUyBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0RElTVmFsdWUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19ESVMpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19ESVMpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRESVNWYWx1ZShzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRMZW5zU2hhZGVWYWx1ZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgbGVucyBzaGFkZSB2YWx1ZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0TGVuc1NoYWRlVmFsdWUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19MRU5TU0hBREUpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19MRU5TU0hBREUpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRMZW5zU2hhZGVWYWx1ZShzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRGb2N1c0FyZWFzCisgKgorICogREVTQ1JJUFRJT046IHNldCBmb2N1cyBhcmVhcyBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0Rm9jdXNBcmVhcyhjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX0ZPQ1VTX0FSRUFTKTsKKworICAgIGlmIChnZXRSZWxhdGVkQ2FtU3luY0luZm8oKS0+bW9kZSA9PSBDQU1fTU9ERV9TRUNPTkRBUlkpIHsKKyAgICAgICAgLy8gSWdub3JlIGZvY3VzIGFyZWFzIGZvciBzZWNvbmRhcnkgY2FtZXJhCisgICAgICAgIExPR0goIklnbm9yZSBmb2N1cyBhcmVhcyBmb3Igc2Vjb25kYXJ5IGNhbWVyYSEhICIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpbnQgbWF4X251bV9hZl9hcmVhcyA9IGdldEludChLRVlfTUFYX05VTV9GT0NVU19BUkVBUyk7CisgICAgICAgIGlmKG1heF9udW1fYWZfYXJlYXMgPT0gMCkgeworICAgICAgICAgICAgTE9HRSgibWF4IG51bSBvZiBBRiBhcmVhIGlzIDAsIGNhbm5vdCBzZXQgZm9jdXMgYXJlYXMiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfRk9DVVNfQVJFQVMpOworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRGb2N1c0FyZWFzKHN0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldE1ldGVyaW5nQXJlYXMKKyAqCisgKiBERVNDUklQVElPTjogc2V0IG1ldGVyaW5nIGFyZWFzIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRNZXRlcmluZ0FyZWFzKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfTUVURVJJTkdfQVJFQVMpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpbnQgbWF4X251bV9tdHJfYXJlYXMgPSBnZXRJbnQoS0VZX01BWF9OVU1fTUVURVJJTkdfQVJFQVMpOworICAgICAgICBpZihtYXhfbnVtX210cl9hcmVhcyA9PSAwKSB7CisgICAgICAgICAgICBMT0dFKCJtYXggbnVtIG9mIG1ldGVyaW5nIGFyZWFzIGlzIDAsIGNhbm5vdCBzZXQgZm9jdXMgYXJlYXMiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfTUVURVJJTkdfQVJFQVMpOworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDAgfHwKKyAgICAgICAgICAgIChtX2JOZWVkUmVzdGFydCA9PSB0cnVlKSkgeworICAgICAgICAgICAgcmV0dXJuIHNldE1ldGVyaW5nQXJlYXMoc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U2NlbmVNb2RlCisgKgorICogREVTQ1JJUFRJT046IHNldCBzY2VuZW4gbW9kZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0U2NlbmVNb2RlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfU0NFTkVfTU9ERSk7CisgICAgY29uc3QgY2hhciAqcHJldl9zdHIgPSBnZXQoS0VZX1NDRU5FX01PREUpOworICAgIExPR0goInN0ciAtICVzLCBwcmV2X3N0ciAtICVzIiwgc3RyLCBwcmV2X3N0cik7CisKKyAgICAvLyBIRFIgJiBSZWNvcmRpbmcgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSBhbmQgc28gZGlzYWJsZSBIRFIgaWYgcmVjb3JkaW5nIGhpbnQgaXMgc2V0CisgICAgaWYgKG1fYlJlY29yZGluZ0hpbnRfbmV3ICYmIG1fYkhEUkVuYWJsZWQpIHsKKyAgICAgICAgTE9HSCgiRGlzYWJsZSB0aGUgSERSIGFuZCBzZXQgaXQgdG8gQXV0byIpOworICAgICAgICBzdHIgPSBTQ0VORV9NT0RFX0FVVE87CisgICAgICAgIG1fYkxvY2FsSERSRW5hYmxlZCA9IHRydWU7CisgICAgfSBlbHNlIGlmICghbV9iUmVjb3JkaW5nSGludF9uZXcgJiYgbV9iTG9jYWxIRFJFbmFibGVkKSB7CisgICAgICAgIExPR0goIlJlc3RvcmUgdGhlIEhEUiBmcm9tIEF1dG8gc2NlbmUgbW9kZSIpOworICAgICAgICBzdHIgPSBTQ0VORV9NT0RFX0hEUjsKKyAgICAgICAgbV9iTG9jYWxIRFJFbmFibGVkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwcmV2X3N0ciA9PSBOVUxMIHx8CisgICAgICAgICAgICBzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkgeworCisgICAgICAgICAgICBpZihzdHJjbXAoc3RyLCBTQ0VORV9NT0RFX0FVVE8pID09IDApIHsKKyAgICAgICAgICAgICAgICBtX2JTY2VuZVRyYW5zaXRpb25BdXRvID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJjbXAoc3RyLCBTQ0VORV9NT0RFX0hEUikgPT0gMCkgeworCisgICAgICAgICAgICAgICAgLy8gSWYgSERSIGlzIHNldCBmcm9tIGNsaWVudCAgYW5kIHRoZSBmZWF0dXJlIGlzIG5vdCBlbmFibGVkIGluIHRoZSBiYWNrZW5kLCBpZ25vcmUgaXQuCisgICAgICAgICAgICAgICAgaWYgKG1fYkhEUk1vZGVTZW5zb3IgJiYgaXNTdXBwb3J0ZWRTZW5zb3JIZHJTaXplKHBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9iU2Vuc29ySERSRW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1fYkhEUkVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgTE9HSCgiU2Vuc29yIEhEUiBtb2RlIEVuYWJsZWQiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtX2JIRFJFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgTE9HSCgiUy9XIEhEUiBFbmFibGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtX2JIRFJFbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG1fYlNlbnNvckhEUkVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9iU2Vuc29ySERSRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtX2JOZWVkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNldFNlbnNvclNuYXBzaG90SERSKCJvZmYiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtX2JTZW5zb3JIRFJFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgc2V0U2Vuc29yU25hcHNob3RIRFIoIm9uIik7CisgICAgICAgICAgICAgICAgbV9iTmVlZFJlc3RhcnQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICgobV9iSERSRW5hYmxlZCkgfHwKKyAgICAgICAgICAgICAgICAoKHByZXZfc3RyICE9IE5VTEwpICYmIChzdHJjbXAocHJldl9zdHIsIFNDRU5FX01PREVfSERSKSA9PSAwKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dIKCJzY2VuZSBtb2RlIGNoYW5nZWQgYmV0d2VlbiBIRFIgYW5kIG5vbi1IRFIsIG5lZWQgcmVzdGFydCIpOworICAgICAgICAgICAgICAgIG1fYk5lZWRSZXN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHNldFNjZW5lTW9kZShzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRTZWxlY3RhYmxlWm9uZUFmCisgKgorICogREVTQ1JJUFRJT046IHNldCBzZWxlY3RhYmxlIHpvbmUgYXV0byBmb2N1cyB2YWx1ZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0U2VsZWN0YWJsZVpvbmVBZihjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1NFTEVDVEFCTEVfWk9ORV9BRik7CisgICAgY29uc3QgY2hhciAqcHJldl9zdHIgPSBnZXQoS0VZX1FDX1NFTEVDVEFCTEVfWk9ORV9BRik7CisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwcmV2X3N0ciA9PSBOVUxMIHx8CisgICAgICAgICAgICBzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHNldFNlbGVjdGFibGVab25lQWYoc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0QUVCcmFja2V0CisgKgorICogREVTQ1JJUFRJT046IHNldCBBRSBicmFja2V0IGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRBRUJyYWNrZXQoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBpZiAoaXNIRFJFbmFibGVkKCkpIHsKKyAgICAgICAgTE9HSCgic2NlbmUgbW9kZSBpcyBIRFIsIG92ZXJ3cml0ZSBBRSBicmFja2V0IHNldHRpbmcgdG8gb2ZmIik7CisgICAgICAgIHJldHVybiBzZXRBRUJyYWNrZXQoQUVfQlJBQ0tFVF9PRkYpOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKmV4cFN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX0NBUFRVUkVfQlVSU1RfRVhQT1NVUkUpOworICAgIGlmIChOVUxMICE9IGV4cFN0ciAmJiBzdHJsZW4oZXhwU3RyKSA+IDApIHsKKyAgICAgICAgc2V0KEtFWV9RQ19DQVBUVVJFX0JVUlNUX0VYUE9TVVJFLCBleHBTdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICBtZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhcHR1cmUuYnVyc3QuZXhwb3N1cmVzIiwgcHJvcCwgIiIpOworICAgICAgICBpZiAoc3RybGVuKHByb3ApID4gMCkgeworICAgICAgICAgICAgc2V0KEtFWV9RQ19DQVBUVVJFX0JVUlNUX0VYUE9TVVJFLCBwcm9wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlbW92ZShLRVlfUUNfQ0FQVFVSRV9CVVJTVF9FWFBPU1VSRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19BRV9CUkFDS0VUX0hEUik7CisgICAgY29uc3QgY2hhciAqcHJldl9zdHIgPSBnZXQoS0VZX1FDX0FFX0JSQUNLRVRfSERSKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0QUVCcmFja2V0KHN0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEFGQnJhY2tldAorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgQUYgYnJhY2tldCBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0QUZCcmFja2V0KGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgaWYgKChtX3BDYXBhYmlsaXR5LT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgJgorICAgICAgICAgICAgKENBTV9RQ09NX0ZFQVRVUkVfUkVGT0NVUyB8IENBTV9RQ09NX0ZFQVRVUkVfVUJJRk9DVVMpKSA9PSAwKSB7CisgICAgICAgIExPR0goIkFGIEJyYWNrZXRpbmcgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX0FGX0JSQUNLRVQpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19BRl9CUkFDS0VUKTsKKyAgICBMT0dIKCJzdHIgPSVzICYgcHJldl9zdHIgPSVzIiwgc3RyLCBwcmV2X3N0cik7CisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwcmV2X3N0ciA9PSBOVUxMIHx8CisgICAgICAgICAgICBzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkgeworICAgICAgICAgICAgbV9iTmVlZFJlc3RhcnQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHNldEFGQnJhY2tldChzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRSZUZvY3VzCisgKgorICogREVTQ1JJUFRJT046IHNldCByZWZvY3VzIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRSZUZvY3VzKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgaWYgKChtX3BDYXBhYmlsaXR5LT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgJgorICAgICAgICAgICAgKENBTV9RQ09NX0ZFQVRVUkVfUkVGT0NVUyB8IENBTV9RQ09NX0ZFQVRVUkVfVUJJRk9DVVMpKSA9PSAwKSB7CisgICAgICAgIExPR0QoIkFGIEJyYWNrZXRpbmcgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1JFX0ZPQ1VTKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfUkVfRk9DVVMpOworICAgIExPR0goInN0ciA9JXMgJiBwcmV2X3N0ciA9JXMiLCBzdHIsIHByZXZfc3RyKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICBtX2JOZWVkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gc2V0UmVGb2N1cyhzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRDaHJvbWFGbGFzaAorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgY2hyb21hIGZsYXNoIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRDaHJvbWFGbGFzaChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGlmICgobV9wQ2FwYWJpbGl0eS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYKKyAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9DSFJPTUFfRkxBU0gpID09IDApIHsKKyAgICAgICAgTE9HSCgiQ2hyb21hIEZsYXNoIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19DSFJPTUFfRkxBU0gpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19DSFJPTUFfRkxBU0gpOworICAgIExPR0goInN0ciA9JXMgJiBwcmV2X3N0ciA9JXMiLCBzdHIsIHByZXZfc3RyKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICBtX2JOZWVkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gc2V0Q2hyb21hRmxhc2goc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0T3B0aVpvb20KKyAqCisgKiBERVNDUklQVElPTjogc2V0IG9wdGkgem9vbSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0T3B0aVpvb20oY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBpZiAoKG1fcENhcGFiaWxpdHktPnFjb21fc3VwcG9ydGVkX2ZlYXR1cmVfbWFzayAmCisgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfT1BUSVpPT00pID09IDApeworICAgICAgICBMT0dIKCJPcHRpIFpvb20gaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX09QVElfWk9PTSk7CisgICAgY29uc3QgY2hhciAqcHJldl9zdHIgPSBnZXQoS0VZX1FDX09QVElfWk9PTSk7CisgICAgTE9HSCgic3RyID0lcyAmIHByZXZfc3RyID0lcyIsIHN0ciwgcHJldl9zdHIpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIG1fYk5lZWRSZXN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBzZXRPcHRpWm9vbShzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRUcnVlUG9ydHJhaXQKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHRydWUgcG9ydHJhaXQgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFRydWVQb3J0cmFpdChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGlmICgobV9wQ2FwYWJpbGl0eS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYKKyAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfVFJVRVBPUlRSQUlUKSA9PSAwKSB7CisgICAgICAgIExPR0QoIlRydWUgUG9ydHJhaXQgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1RSVUVfUE9SVFJBSVQpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19UUlVFX1BPUlRSQUlUKTsKKyAgICBMT0dIKCJzdHIgPSVzICYgcHJldl9zdHIgPSVzIiwgc3RyLCBwcmV2X3N0cik7CisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwcmV2X3N0ciA9PSBOVUxMIHx8CisgICAgICAgICAgICBzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHNldFRydWVQb3J0cmFpdChzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRIRFJNb2RlCisgKgorICogREVTQ1JJUFRJT046IHNldCBIRFIgbW9kZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0SERSTW9kZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX0hEUl9NT0RFKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfSERSX01PREUpOworICAgIHVpbnQzMl90IHN1cHBvcnRlZF9oZHJfbW9kZXMgPSBtX3BDYXBhYmlsaXR5LT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgJgorICAgICAgICAgIChDQU1fUUNPTV9GRUFUVVJFX1NFTlNPUl9IRFIgfCBDQU1fUUNPTV9GRUFUVVJFX0hEUik7CisKKyAgICBMT0dIKCJzdHIgPSVzICYgcHJldl9zdHIgPSVzIiwgc3RyLCBwcmV2X3N0cik7CisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmICgoQ0FNX1FDT01fRkVBVFVSRV9TRU5TT1JfSERSID09IHN1cHBvcnRlZF9oZHJfbW9kZXMpICYmCisgICAgICAgICAgICAgICAgKHN0cm5jbXAoc3RyLCBIRFJfTU9ERV9TRU5TT1IsIHN0cmxlbihIRFJfTU9ERV9TRU5TT1IpKSkpIHsKKyAgICAgICAgICAgIExPR0goIk9ubHkgc2Vuc29yIEhEUiBpcyBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBlbHNlIGlmICAoKENBTV9RQ09NX0ZFQVRVUkVfSERSID09IHN1cHBvcnRlZF9oZHJfbW9kZXMpICYmCisgICAgICAgICAgICAgICAgKHN0cm5jbXAoc3RyLCBIRFJfTU9ERV9TRU5TT1IsIHN0cmxlbihIRFJfTU9ERV9NVUxUSV9GUkFNRSkpKSkgeworICAgICAgICAgICAgTE9HSCgiT25seSBtdWx0aSBmcmFtZSBIRFIgaXMgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gZWxzZSBpZiAoIXN1cHBvcnRlZF9oZHJfbW9kZXMpIHsKKyAgICAgICAgICAgIExPR0goIkhEUiBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgICBzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHNldEhEUk1vZGUoc3RyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRIRFJOZWVkMXgKKyAqCisgKiBERVNDUklQVElPTjogc2V0IEhEUiBuZWVkIDF4IGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRIRFJOZWVkMXgoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19IRFJfTkVFRF8xWCk7CisgICAgY29uc3QgY2hhciAqcHJldl9zdHIgPSBnZXQoS0VZX1FDX0hEUl9ORUVEXzFYKTsKKworICAgIExPR0goInN0ciA9JXMgJiBwcmV2X3N0ciA9JXMiLCBzdHIsIHByZXZfc3RyKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1fYkhEUk1vZGVTZW5zb3IpIHsKKyAgICAgICAgICAgIExPR0goIk9ubHkgbXVsdGkgZnJhbWUgSERSIHN1cHBvcnRzIDF4IGZyYW1lIik7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwcmV2X3N0ciA9PSBOVUxMKSB8fCAoc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0SERSTmVlZDF4KHN0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFF1YWRyYUNmYU1vZGUKKyAqCisgKiBERVNDUklQVElPTjogZW5hYmxlIG9yIGRpc2FibGUgUXVhZHJhIENGQSBtb2RlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBlbmFibGUgOiBlbmFibGU6IDE7IGRpc2FibGUgMAorICogICBAaW5pdENvbW1pdDogaWYgY29uZmlndXJhdGlvbiBsaXN0IG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGFuZCBjb21taXRlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFF1YWRyYUNmYU1vZGUodWludDMyX3QgZW5hYmxlLCBib29sIGluaXRDb21taXQpIHsKKworICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKGdldFF1YWRyYUNmYSgpKSB7CisgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgIHNldE9mZmxpbmVSQVcoVFJVRSk7CisgICAgICAgIH0gZWxzZSAgeworICAgICAgICAgICAgc2V0T2ZmbGluZVJBVyhGQUxTRSk7CisgICAgICAgIH0KKyAgICAgICAgIGlmIChpbml0Q29tbWl0KSB7CisgICAgICAgICAgICAgaWYgKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwKSB7CisgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGdyb3VwIHVwZGF0ZSB0YWJsZSIpOworICAgICAgICAgICAgICAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX1FVQURSQV9DRkEsIGVuYWJsZSkpIHsKKyAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gdXBkYXRlIFF1YWRyYSBDRkEgbW9kZSIpOworICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICB9CisgICAgICAgICBpZiAoaW5pdENvbW1pdCkgeworICAgICAgICAgICAgIHJjID0gY29tbWl0U2V0QmF0Y2goKTsKKyAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGNvbW1pdCBRdWFkcmEgQ0ZBIG1vZGUiKTsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICB9CisgICAgTE9HSSgiUXVhZHJhIENGQSBtb2RlICVkICIsIGVuYWJsZSk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFF1YWRyYUNGQQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgUXVhZHJhIENGQSBtb2RlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRRdWFkcmFDZmEoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKworICAgIGludDMyX3Qgd2lkdGggPSAwLGhlaWdodCA9IDA7CisgICAgYm9vbCBwcmV2X3F1YWRyYWNmYSA9IGdldFF1YWRyYUNmYSgpOworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpbnQzMl90IHZhbHVlOworCisgICAgaWYgKCFtX3BDYXBhYmlsaXR5LT5pc19yZW1vc2FpY19saWJfcHJlc2VudCkgeworICAgICAgICBMT0dEKCJRdWFkcmEgQ0ZBIG1vZGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLypDaGVja2luZyBpZiB0aGUgdXNlciBzZWxlY3RlZCBkaW0gaXMgbW9yZSB0aGFuIG1heGltdW0gZGltIHN1cHBvcnRlZCBieQorICAgIFF1YWRyYSBzZW5zb3IgaW4gbm9ybWFsIG1vZGUuIElmIG1vcmUgdGhlbiBzd2l0Y2ggdG8gUXVhZHJhIENGQSBtb2RlIGVsc2UKKyAgICByZW1haW4gaW4gbm9ybWFsIHpzbCBtb2RlICovCisgICAgcGFyYW1zLmdldFBpY3R1cmVTaXplKCZ3aWR0aCwgJmhlaWdodCk7CisgICAgaWYgKHdpZHRoID4gbV9wQ2FwYWJpbGl0eS0+cmF3X2RpbVswXS53aWR0aCAmJgorICAgICAgICBoZWlnaHQgPiBtX3BDYXBhYmlsaXR5LT5yYXdfZGltWzBdLmhlaWdodCkgeworICAgICAgICBMT0dJKCJRdWFkcmEgQ0ZBIG1vZGUgc2VsZWN0ZWQiKTsKKyAgICAgICAgbV9iUXVhZHJhQ2ZhID0gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dJKCJRdWFkcmEgQ0ZBIG1vZGUgbm90IHNlbGVjdGVkIik7CisgICAgICAgIG1fYlF1YWRyYUNmYSA9IEZBTFNFOworICAgIH0KKyAgICB2YWx1ZSA9IG1fYlF1YWRyYUNmYTsKKyAgICBpZiAocHJldl9xdWFkcmFjZmEgPT0gbV9iUXVhZHJhQ2ZhKSB7CisgICAgICAgIExPR0QoIk5vIGNoYW5nZSBpbiBRdWFkcmEgQ0ZBIG1vZGUiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9iWnNsTW9kZSAmJiBtX2JRdWFkcmFDZmEpIHsKKyAgICAgICAgICAgIG1fYk5lZWRSZXN0YXJ0ID0gVFJVRTsKKyAgICAgICAgICAgIHNldFpzbE1vZGUoRkFMU0UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyX3ZhbCAgPSBwYXJhbXMuZ2V0KEtFWV9RQ19aU0wpOworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSA9IGxvb2t1cEF0dHIoT05fT0ZGX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoT05fT0ZGX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgICAgIHN0cl92YWwpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EICYmIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmMgPSBzZXRac2xNb2RlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAvLyBaU0wgbW9kZSBjaGFuZ2VkLCBuZWVkIHJlc3RhcnQgcHJldmlldworICAgICAgICAgICAgICAgIG1fYk5lZWRSZXN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dIKCJRdWFkcmEgQ0ZBIG1vZGUgPSAlZCIsIG1fYlF1YWRyYUNmYSk7CisgICAgcmV0dXJuIHJjOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRTZWVNb3JlCisgKgorICogREVTQ1JJUFRJT046IHNldCBzZWUgbW9yZSAobGx2ZCkgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFNlZU1vcmUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBpZiAoKG1fcENhcGFiaWxpdHktPnFjb21fc3VwcG9ydGVkX2ZlYXR1cmVfbWFzayAmCisgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX0xMVkQpID09IDApIHsKKyAgICAgICAgTE9HRCgiU2VlIG1vcmUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1NFRV9NT1JFKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfU0VFX01PUkUpOworICAgIExPR0goInN0ciA9JXMgJiBwcmV2X3N0ciA9JXMiLCBzdHIsIHByZXZfc3RyKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIG1fYk5lZWRSZXN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBzZXRTZWVNb3JlKHN0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldE5vaXNlUmVkdWN0aW9uTW9kZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgbm9pc2UgcmVkdWN0aW9uIG1vZGUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldE5vaXNlUmVkdWN0aW9uTW9kZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGlmICgobV9wQ2FwYWJpbGl0eS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYgQ0FNX1FUSV9GRUFUVVJFX1NXX1ROUikgPT0gMCkgeworICAgICAgICBMT0dEKCJTVyBUTlIgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX05PSVNFX1JFRFVDVElPTl9NT0RFKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfTk9JU0VfUkVEVUNUSU9OX01PREUpOworICAgIExPR0goInN0ciA9JXMgJiBwcmV2X3N0ciA9JXMiLCBzdHIsIHByZXZfc3RyKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIG1fYk5lZWRSZXN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBzZXROb2lzZVJlZHVjdGlvbk1vZGUoc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U3RpbGxNb3JlCisgKgorICogREVTQ1JJUFRJT046IHNldCBzdGlsbG1vcmUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFN0aWxsTW9yZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGlmICgobV9wQ2FwYWJpbGl0eS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYKKyAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfU1RJTExNT1JFKSA9PSAwKSB7CisgICAgICAgIExPR0QoIlN0aWxsbW9yZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfUUNfU1RJTExfTU9SRSk7CisgICAgY29uc3QgY2hhciAqcHJldl9zdHIgPSBnZXQoS0VZX1FDX1NUSUxMX01PUkUpOworICAgIExPR0goInN0ciA9JXMgJiBwcmV2X3N0ciA9JXMiLCBzdHIsIHByZXZfc3RyKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIG1fYk5lZWRSZXN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBzZXRTdGlsbE1vcmUoc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKyNpZmRlZiBUQVJHRVRfVFNfTUFLRVVQCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0VHNNYWtldXAKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHNldFRzTWFrZXVwIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRUc01ha2V1cChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1RTX01BS0VVUCk7CisgICAgY29uc3QgY2hhciAqcHJldl9zdHIgPSBnZXQoS0VZX1RTX01BS0VVUCk7CisgICAgTE9HSCgic3RyID0lcyAmIHByZXZfc3RyID0lcyIsIHN0ciwgcHJldl9zdHIpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fCBzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkgeworICAgICAgICAgICAgbV9iTmVlZFJlc3RhcnQgPSB0cnVlOworICAgICAgICAgICAgc2V0KEtFWV9UU19NQUtFVVAsIHN0cik7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIxID0gcGFyYW1zLmdldChLRVlfVFNfTUFLRVVQX1dISVRFTik7CisgICAgICAgICAgICBpZiAoc3RyMSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc2V0KEtFWV9UU19NQUtFVVBfV0hJVEVOLCBzdHIxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0cjIgPSBwYXJhbXMuZ2V0KEtFWV9UU19NQUtFVVBfQ0xFQU4pOworICAgICAgICAgICAgaWYgKHN0cjIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNldChLRVlfVFNfTUFLRVVQX0NMRUFOLCBzdHIyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0UmVkZXllUmVkdWN0aW9uCisgKgorICogREVTQ1JJUFRJT046IHNldCByZWQgZXllIHJlZHVjdGlvbiBzZXR0aW5nIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRSZWRleWVSZWR1Y3Rpb24oY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19SRURFWUVfUkVEVUNUSU9OKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfUkVERVlFX1JFRFVDVElPTik7CisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwcmV2X3N0ciA9PSBOVUxMIHx8CisgICAgICAgICAgICBzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHNldFJlZGV5ZVJlZHVjdGlvbihzdHIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRHcHNMb2NhdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgR1BTIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRHcHNMb2NhdGlvbihjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKm1ldGhvZCA9IHBhcmFtcy5nZXQoS0VZX0dQU19QUk9DRVNTSU5HX01FVEhPRCk7CisgICAgaWYgKG1ldGhvZCkgeworICAgICAgICBzZXQoS0VZX0dQU19QUk9DRVNTSU5HX01FVEhPRCwgbWV0aG9kKTsKKyAgICB9ZWxzZSB7CisgICAgICAgIHJlbW92ZShLRVlfR1BTX1BST0NFU1NJTkdfTUVUSE9EKTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpsYXRpdHVkZSA9IHBhcmFtcy5nZXQoS0VZX0dQU19MQVRJVFVERSk7CisgICAgaWYgKGxhdGl0dWRlKSB7CisgICAgICAgIHNldChLRVlfR1BTX0xBVElUVURFLCBsYXRpdHVkZSk7CisgICAgfWVsc2UgeworICAgICAgICByZW1vdmUoS0VZX0dQU19MQVRJVFVERSk7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqbGF0aXR1ZGVSZWYgPSBwYXJhbXMuZ2V0KEtFWV9RQ19HUFNfTEFUSVRVREVfUkVGKTsKKyAgICBpZiAobGF0aXR1ZGVSZWYpIHsKKyAgICAgICAgc2V0KEtFWV9RQ19HUFNfTEFUSVRVREVfUkVGLCBsYXRpdHVkZVJlZik7CisgICAgfWVsc2UgeworICAgICAgICByZW1vdmUoS0VZX1FDX0dQU19MQVRJVFVERV9SRUYpOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKmxvbmdpdHVkZSA9IHBhcmFtcy5nZXQoS0VZX0dQU19MT05HSVRVREUpOworICAgIGlmIChsb25naXR1ZGUpIHsKKyAgICAgICAgc2V0KEtFWV9HUFNfTE9OR0lUVURFLCBsb25naXR1ZGUpOworICAgIH1lbHNlIHsKKyAgICAgICAgcmVtb3ZlKEtFWV9HUFNfTE9OR0lUVURFKTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpsb25naXR1ZGVSZWYgPSBwYXJhbXMuZ2V0KEtFWV9RQ19HUFNfTE9OR0lUVURFX1JFRik7CisgICAgaWYgKGxvbmdpdHVkZVJlZikgeworICAgICAgICBzZXQoS0VZX1FDX0dQU19MT05HSVRVREVfUkVGLCBsb25naXR1ZGVSZWYpOworICAgIH1lbHNlIHsKKyAgICAgICAgcmVtb3ZlKEtFWV9RQ19HUFNfTE9OR0lUVURFX1JFRik7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqYWx0aXR1ZGVSZWYgPSBwYXJhbXMuZ2V0KEtFWV9RQ19HUFNfQUxUSVRVREVfUkVGKTsKKyAgICBpZiAoYWx0aXR1ZGVSZWYpIHsKKyAgICAgICAgc2V0KEtFWV9RQ19HUFNfQUxUSVRVREVfUkVGLCBhbHRpdHVkZVJlZik7CisgICAgfWVsc2UgeworICAgICAgICByZW1vdmUoS0VZX1FDX0dQU19BTFRJVFVERV9SRUYpOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKmFsdGl0dWRlID0gcGFyYW1zLmdldChLRVlfR1BTX0FMVElUVURFKTsKKyAgICBpZiAoYWx0aXR1ZGUpIHsKKyAgICAgICAgc2V0KEtFWV9HUFNfQUxUSVRVREUsIGFsdGl0dWRlKTsKKyAgICB9ZWxzZSB7CisgICAgICAgIHJlbW92ZShLRVlfR1BTX0FMVElUVURFKTsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpzdGF0dXMgPSBwYXJhbXMuZ2V0KEtFWV9RQ19HUFNfU1RBVFVTKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIHNldChLRVlfUUNfR1BTX1NUQVRVUywgc3RhdHVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZW1vdmUoS0VZX1FDX0dQU19TVEFUVVMpOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnRpbWVzdGFtcCA9IHBhcmFtcy5nZXQoS0VZX0dQU19USU1FU1RBTVApOworICAgIGlmICh0aW1lc3RhbXApIHsKKyAgICAgICAgc2V0KEtFWV9HUFNfVElNRVNUQU1QLCB0aW1lc3RhbXApOworICAgIH1lbHNlIHsKKyAgICAgICAgcmVtb3ZlKEtFWV9HUFNfVElNRVNUQU1QKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldE51bU9mU25hcHNob3QKKyAqCisgKiBERVNDUklQVElPTjogc2V0IG51bWJlciBvZiBzbmFwc2hvdCBwZXIgc2h1dHRlciBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0TnVtT2ZTbmFwc2hvdCgpCit7CisgICAgaW50IG5CdXJzdE51bSA9IDE7CisgICAgaW50IG5FeHBudW0gPSAwOworCisgICAgY29uc3QgY2hhciAqYnJhY2tldF9zdHIgPSBnZXQoS0VZX1FDX0FFX0JSQUNLRVRfSERSKTsKKyAgICBpZiAoYnJhY2tldF9zdHIgIT0gTlVMTCAmJiBzdHJsZW4oYnJhY2tldF9zdHIpID4gMCkgeworICAgICAgICBpbnQgdmFsdWUgPSBsb29rdXBBdHRyKEJSQUNLRVRJTkdfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShCUkFDS0VUSU5HX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgYnJhY2tldF9zdHIpOworICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgIGNhc2UgQ0FNX0VYUF9CUkFDS0VUSU5HX09OOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5FeHBudW0gPSAwOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0cl92YWwgPSBnZXQoS0VZX1FDX0NBUFRVUkVfQlVSU1RfRVhQT1NVUkUpOworICAgICAgICAgICAgICAgIGlmICgoc3RyX3ZhbCAhPSBOVUxMKSAmJiAoc3RybGVuKHN0cl92YWwpID4gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgICAgICAgICAgICAgICAgICBzdHJsY3B5KHByb3AsIHN0cl92YWwsIFBST1BFUlRZX1ZBTFVFX01BWCk7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnNhdmVwdHIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBjaGFyICp0b2tlbiA9IHN0cnRva19yKHByb3AsICIsIiwgJnNhdmVwdHIpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodG9rZW4gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBzdHJ0b2tfcihOVUxMLCAiLCIsICZzYXZlcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5FeHBudW0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobkV4cG51bSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG5FeHBudW0gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbkV4cG51bSA9IDEgKyBnZXROdW1PZkV4dHJhSERST3V0QnVmc0lmTmVlZGVkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpc1ViaVJlZm9jdXMoKSkgeworICAgICAgICBuQnVyc3ROdW0gPSBtX3BDYXBhYmlsaXR5LT5yZWZvY3VzX2FmX2JyYWNrZXRpbmdfbmVlZC5vdXRwdXRfY291bnQgKyAxOworICAgIH0KKworICAgIExPR0goIm5CdXJzdE51bSA9ICVkLCBuRXhwbnVtID0gJWQiLCBuQnVyc3ROdW0sIG5FeHBudW0pOworICAgIHNldChLRVlfUUNfTlVNX1NOQVBTSE9UX1BFUl9TSFVUVEVSLCBuQnVyc3ROdW0gKiBuRXhwbnVtKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0UmVjb3JkaW5nSGludAorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgcmVjb3JkaW5nIGhpbnQgdmFsdWUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFJlY29yZGluZ0hpbnQoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBjb25zdCBjaGFyICogc3RyID0gcGFyYW1zLmdldChLRVlfUkVDT1JESU5HX0hJTlQpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9SRUNPUkRJTkdfSElOVCk7CisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwcmV2X3N0ciA9PSBOVUxMIHx8IHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihUUlVFX0ZBTFNFX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoVFJVRV9GQUxTRV9NT0RFU19NQVApLAorICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICAgICAgaWYodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpeworICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1JFQ09SRElOR19ISU5ULCBzdHIpOworICAgICAgICAgICAgICAgIHNldFJlY29yZGluZ0hpbnRWYWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGdldEZhY2VEZXRlY3Rpb25PcHRpb24oKSA9PSB0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZmRNb2RlSW5WaWRlbygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRGYWNlRGV0ZWN0aW9uKHZhbHVlID4gMCA/IGZhbHNlIDogdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0RmFjZURldGVjdGlvbih0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1fYkRJU0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HSCgiU2V0dGluZyBESVMgdmFsdWUgYWdhaW4iKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0RElTVmFsdWUoVkFMVUVfRU5BQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHJlY29yZGluZyBoaW50IHZhbHVlOiAlcyIsIHN0cik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0Tm9EaXNwbGF5TW9kZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgbm8gZGlzcGxheSBtb2RlIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXROb0Rpc3BsYXlNb2RlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyX3ZhbCAgPSBwYXJhbXMuZ2V0KEtFWV9RQ19OT19ESVNQTEFZX01PREUpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19OT19ESVNQTEFZX01PREUpOworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIExPR0QoInN0cl92YWw6ICVzLCBwcmV2X3N0cjogJXMiLCBzdHJfdmFsLCBwcmV2X3N0cik7CisKKyAgICAvLyBBdXggQ2FtZXJhIE1vZGUsIHNldCBubyBkaXNwbGF5IG1vZGUKKyAgICBpZiAobV9yZWxDYW1TeW5jSW5mby5tb2RlID09IENBTV9NT0RFX1NFQ09OREFSWSkgeworICAgICAgICBpZiAoIW1fYk5vRGlzcGxheU1vZGUpIHsKKyAgICAgICAgICAgIHNldChLRVlfUUNfTk9fRElTUExBWV9NT0RFLCAxKTsKKyAgICAgICAgICAgIG1fYk5vRGlzcGxheU1vZGUgPSB0cnVlOworICAgICAgICAgICAgbV9iTmVlZFJlc3RhcnQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBpZihzdHJfdmFsICYmIHN0cmxlbihzdHJfdmFsKSA+IDApIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwgc3RyY21wKHN0cl92YWwsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICBtX2JOb0Rpc3BsYXlNb2RlID0gYXRvaShzdHJfdmFsKTsKKyAgICAgICAgICAgIHNldChLRVlfUUNfTk9fRElTUExBWV9NT0RFLCBzdHJfdmFsKTsKKyAgICAgICAgICAgIG1fYk5lZWRSZXN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLm5vLWRpc3BsYXkiLCBwcm9wLCAiMCIpOworICAgICAgICBtX2JOb0Rpc3BsYXlNb2RlID0gYXRvaShwcm9wKTsKKyAgICB9CisgICAgTE9HSCgiUGFyYW0gbV9iTm9EaXNwbGF5TW9kZSA9ICVkIiwgbV9iTm9EaXNwbGF5TW9kZSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFpzbE1vZGUKKyAqCisgKiBERVNDUklQVElPTjogc2V0IFpTTCBtb2RlIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRac2xNb2RlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyX3ZhbCAgPSBwYXJhbXMuZ2V0KEtFWV9RQ19aU0wpOworICAgIGNvbnN0IGNoYXIgKnByZXZfdmFsICA9IGdldChLRVlfUUNfWlNMKTsKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBpZihtX2JGb3JjZVpzbE1vZGUpIHsKKyAgICAgICAgaWYgKCFtX2Jac2xNb2RlKSB7CisgICAgICAgICAgICAvLyBGb3JjZSBaU0wgbW9kZSB0byBPTgorICAgICAgICAgICAgc2V0KEtFWV9RQ19aU0wsIFZBTFVFX09OKTsKKyAgICAgICAgICAgIHNldFpzbE1vZGUoVFJVRSk7CisgICAgICAgICAgICBMT0dIKCJaU0wgTW9kZSBmb3JjZWQgdG8gYmUgZW5hYmxlZCIpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdHJfdmFsICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfdmFsID09IE5VTEwgfHwgc3RyY21wKHN0cl92YWwsIHByZXZfdmFsKSAhPSAwKSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihPTl9PRkZfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShPTl9PRkZfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyX3ZhbCk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBzZXQoS0VZX1FDX1pTTCwgc3RyX3ZhbCk7CisgICAgICAgICAgICAgICAgcmMgPSBzZXRac2xNb2RlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAvLyBaU0wgbW9kZSBjaGFuZ2VkLCBuZWVkIHJlc3RhcnQgcHJldmlldworICAgICAgICAgICAgICAgIG1fYk5lZWRSZXN0YXJ0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBaU0wgbW9kZSB2YWx1ZTogJXMiLCBzdHJfdmFsKTsKKyAgICAgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0WnNsTW9kZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgWlNMIG1vZGUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHZhbHVlICA6IFpTTCBtb2RlIHZhbHVlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0WnNsTW9kZShib29sIHZhbHVlKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpZihtX2JGb3JjZVpzbE1vZGUpIHsKKyAgICAgICAgaWYgKCFtX2Jac2xNb2RlKSB7CisgICAgICAgICAgICAvLyBGb3JjZSBaU0wgbW9kZSB0byBPTgorICAgICAgICAgICAgc2V0KEtFWV9RQ19aU0wsIFZBTFVFX09OKTsKKyAgICAgICAgICAgIG1fYlpzbE1vZGVfbmV3ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYlpzbE1vZGUgPSB0cnVlOworICAgICAgICAgICAgbV9iTmVlZFJlc3RhcnQgPSB0cnVlOworCisgICAgICAgICAgICBpbnQzMl90IHZhbHVlID0gbV9iRm9yY2Vac2xNb2RlOworICAgICAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fWlNMX01PREUsIHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0dJKCJaU0wgTW9kZSBmb3JjZWQgdG8gYmUgZW5hYmxlZCIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HSSgiWlNMIE1vZGUgIC0+ICVzIiwgbV9iWnNsTW9kZV9uZXcgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKyAgICAgICAgbV9iWnNsTW9kZV9uZXcgPSAodmFsdWUgPiAwKT8gdHJ1ZSA6IGZhbHNlOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9aU0xfTU9ERSwgdmFsdWUpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dIKCJlbmFibGVkOiAlZCByYyA9ICVkIiwgbV9iWnNsTW9kZV9uZXcsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdXBkYXRlWlNMTW9kZVZhbHVlCisgKgorICogREVTQ1JJUFRJT046IHVwZGF0ZSB6c2wgbW9kZSB2YWx1ZSBsb2NhbGx5IGFuZCB0byBkYWVtb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHZhbHVlICAgOiB6c2wgbW9kZSB2YWx1ZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnVwZGF0ZVpTTE1vZGVWYWx1ZShib29sIHZhbHVlKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpZihpbml0QmF0Y2hVcGRhdGUobV9wUGFyYW1CdWYpIDwgMCApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZ3JvdXAgdXBkYXRlIHRhYmxlIik7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisKKyAgICByYyA9IHNldFpzbE1vZGUodmFsdWUpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gWlNMIHZhbHVlIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByYyA9IGNvbW1pdFNldEJhdGNoKCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byB1cGRhdGUgcmVjb3JkaW5nIGhpbnQiKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRXYXZlbGV0RGVub2lzZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgd2F2ZWxldCBkZW5vaXNlIHZhbHVlIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRXYXZlbGV0RGVub2lzZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX0RFTk9JU0UpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19ERU5PSVNFKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKHByZXZfc3RyID09IE5VTEwgfHwKKyAgICAgICAgICAgIHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0V2F2ZWxldERlbm9pc2Uoc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0VGVtcG9yYWxEZW5vaXNlCisgKgorICogREVTQ1JJUFRJT046IHNldCB0ZW1wb3JhbCBkZW5vaXNlIHZhbHVlIGZyb20gcHJvcGVydGllcworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0VGVtcG9yYWxEZW5vaXNlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgaWYgKChtX3BDYXBhYmlsaXR5LT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX0NQUF9UTlIpID09IDApIHsKKyAgICAgICAgTE9HSCgiVE5SIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1ROUl9NT0RFKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfVE5SX01PREUpOworICAgIGNvbnN0IGNoYXIgKnZpZGVvX3N0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1ZJREVPX1ROUl9NT0RFKTsKKyAgICBjb25zdCBjaGFyICp2aWRlb19wcmV2X3N0ciA9IGdldChLRVlfUUNfVklERU9fVE5SX01PREUpOworICAgIGNoYXIgdmlkZW9fdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBjaGFyIHByZXZpZXdfdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBib29sIHByZXZfdmlkZW9fdG5yID0gbV9iVE5SVmlkZW9PbjsKKyAgICBib29sIHByZXZfcHJldmlld190bnIgPSBtX2JUTlJQcmV2aWV3T247CisgICAgYm9vbCBwcmV2X3NuYXBfdG5yID0gbV9iVE5SU25hcHNob3RPbjsKKworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBtZW1zZXQodmFsdWUsIDAsIHNpemVvZih2YWx1ZSkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEudG5yX2NkcyIsIHZhbHVlLCAiMCIpOworICAgIHVpbnQ4X3QgdG5yX2NkcyA9ICh1aW50OF90KWF0b2kodmFsdWUpOworCisgICAgaWYgKG1fYlJlY29yZGluZ0hpbnRfbmV3ID09IHRydWUpIHsKKyAgICAgICAgaWYgKHZpZGVvX3N0cikgeworICAgICAgICAgICAgaWYgKCh2aWRlb19wcmV2X3N0ciA9PSBOVUxMKSB8fCAoc3RyY21wKHZpZGVvX3N0ciwgdmlkZW9fcHJldl9zdHIpICE9IDApKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAodmlkZW9fc3RyLCBWQUxVRV9PTikpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9iVE5SVmlkZW9PbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1fYlROUlByZXZpZXdPbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbV9iVE5SVmlkZW9PbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBtX2JUTlJQcmV2aWV3T24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfVklERU9fVE5SX01PREUsIHZpZGVvX3N0cik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdHIpIHsKKyAgICAgICAgICAgIGlmICgocHJldl9zdHIgPT0gTlVMTCkgfHwgKHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSkgeworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHN0ciwgVkFMVUVfT04pKSB7CisgICAgICAgICAgICAgICAgICAgIG1fYlROUlByZXZpZXdPbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbV9iVE5SUHJldmlld09uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1ROUl9NT0RFLCBzdHIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL1JlYWQgc2V0cHJvcHMgb25seSBpZiBVSSBpcyBub3QgcHJlc2VudCBvciBkaXNhYmxlZC4KKyAgICBpZiAoKG1fYlJlY29yZGluZ0hpbnRfbmV3ID09IHRydWUpCisgICAgICAgICAgICAmJiAoKHZpZGVvX3N0ciA9PSBOVUxMKQorICAgICAgICAgICAgfHwgKHN0cmNtcCh2aWRlb19zdHIsIFZBTFVFX09OKSkpKSB7CisgICAgICAgIG1lbXNldCh2aWRlb192YWx1ZSwgMCwgc2l6ZW9mKHZpZGVvX3ZhbHVlKSk7CisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEudG5yLnZpZGVvIiwgdmlkZW9fdmFsdWUsIFZBTFVFX09GRik7CisgICAgICAgIGlmICghc3RyY21wKHZpZGVvX3ZhbHVlLCBWQUxVRV9PTikpIHsKKyAgICAgICAgICAgIG1fYlROUlZpZGVvT24gPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9iVE5SVmlkZW9PbiA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1ZJREVPX1ROUl9NT0RFLCB2aWRlb192YWx1ZSk7CisKKyAgICAgICAgbWVtc2V0KHByZXZpZXdfdmFsdWUsIDAsIHNpemVvZihwcmV2aWV3X3ZhbHVlKSk7CisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEudG5yLnByZXZpZXciLCBwcmV2aWV3X3ZhbHVlLCBWQUxVRV9PRkYpOworICAgICAgICBpZiAoIXN0cmNtcChwcmV2aWV3X3ZhbHVlLCBWQUxVRV9PTikpIHsKKyAgICAgICAgICAgIG1fYlROUlByZXZpZXdPbiA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2JUTlJQcmV2aWV3T24gPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19UTlJfTU9ERSwgcHJldmlld192YWx1ZSk7CisgICAgfSBlbHNlIGlmICgobV9iUmVjb3JkaW5nSGludF9uZXcgIT0gdHJ1ZSkKKyAgICAgICAgICAgICYmICgoc3RyID09IE5VTEwpIHx8IChzdHJjbXAoc3RyLCBWQUxVRV9PTikpKSkgeworICAgICAgICBtZW1zZXQocHJldmlld192YWx1ZSwgMCwgc2l6ZW9mKHByZXZpZXdfdmFsdWUpKTsKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS50bnIucHJldmlldyIsIHByZXZpZXdfdmFsdWUsIFZBTFVFX09GRik7CisgICAgICAgIGlmICghc3RyY21wKHByZXZpZXdfdmFsdWUsIFZBTFVFX09OKSkgeworICAgICAgICAgICAgbV9iVE5SUHJldmlld09uID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fYlROUlByZXZpZXdPbiA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1ROUl9NT0RFLCBwcmV2aWV3X3ZhbHVlKTsKKyAgICB9CisKKyAgICBtZW1zZXQodmFsdWUsIDAsIHNpemVvZih2YWx1ZSkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEudG5yLnNuYXBzaG90IiwgdmFsdWUsIFZBTFVFX09GRik7CisgICAgaWYgKCFzdHJjbXAodmFsdWUsIFZBTFVFX09OKSkgeworICAgICAgICBtX2JUTlJTbmFwc2hvdE9uID0gdHJ1ZTsKKyAgICAgICAgTE9HRCgiVE5SIGVuYWJsZWQgZm9yIFNOQVBTSE9UIHN0cmVhbSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fYlROUlNuYXBzaG90T24gPSBmYWxzZTsKKyAgICB9CisKKyAgICBjYW1fZGVub2lzZV9wYXJhbV90IHRlbXA7CisgICAgbWVtc2V0KCZ0ZW1wLCAwLCBzaXplb2YodGVtcCkpOworICAgIGlmIChtX2JUTlJWaWRlb09uIHx8IG1fYlROUlByZXZpZXdPbiB8fCBtX2JUTlJTbmFwc2hvdE9uKSB7CisgICAgICAgIHRlbXAuZGVub2lzZV9lbmFibGUgPSAxOworICAgICAgICB0ZW1wLnByb2Nlc3NfcGxhdGVzID0gZ2V0RGVub2lzZVByb2Nlc3NQbGF0ZSgKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9QQVJNX1RFTVBPUkFMX0RFTk9JU0UpOworCisgICAgICAgIGlmICghdG5yX2NkcykgeworICAgICAgICAgICAgaW50MzJfdCBjZHNfbW9kZSA9IGxvb2t1cEF0dHIoQ0RTX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoQ0RTX01PREVTX01BUCksIENEU19NT0RFX09GRik7CisKKyAgICAgICAgICAgIGlmIChjZHNfbW9kZSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1ZJREVPX0NEU19NT0RFLCBDRFNfTU9ERV9PRkYpOworICAgICAgICAgICAgICAgIGlmIChtX2JUTlJQcmV2aWV3T24pIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfQ0RTX01PREUsIENEU19NT0RFX09GRik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9DRFNfTU9ERSwgY2RzX21vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCBDRFMgTU9ERSB0byB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTE9HRCgiQ0RTIGlzIHNldCB0byA9ICVzIHdoZW4gVE5SIGlzIGVuYWJsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIENEU19NT0RFX09GRik7CisgICAgICAgICAgICAgICAgbUNkc19tb2RlID0gY2RzX21vZGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIkludmFsaWQgYXJndW1lbnQgZm9yIHZpZGVvIENEUyBNT0RFICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjZHNfbW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dIKCJFbmFibGVkIFROUiB3aXRoIENEUyIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChtX2JUTlJWaWRlb09uICE9IHByZXZfdmlkZW9fdG5yKQorICAgICAgICAgICAgfHwgKG1fYlROUlByZXZpZXdPbiAhPSBwcmV2X3ByZXZpZXdfdG5yKQorICAgICAgICAgICAgfHwgKHByZXZfc25hcF90bnIgIT0gbV9iVE5SU25hcHNob3RPbikpIHsKKyAgICAgICAgTE9HRCgiVE5SIGVuYWJsZWQgPSAlZCwgcGxhdGVzID0gJWQiLAorICAgICAgICAgICAgICAgIHRlbXAuZGVub2lzZV9lbmFibGUsIHRlbXAucHJvY2Vzc19wbGF0ZXMpOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9QQVJNX1RFTVBPUkFMX0RFTk9JU0UsIHRlbXApKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldENhbWVyYU1vZGUKKyAqCisgKiBERVNDUklQVElPTjogc2V0IGNhbWVyYSBtb2RlIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRDYW1lcmFNb2RlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfUUNfQ0FNRVJBX01PREUpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBzZXQoS0VZX1FDX0NBTUVSQV9NT0RFLCBzdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlbW92ZShLRVlfUUNfQ0FNRVJBX01PREUpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U2NlbmVTZWxlY3Rpb25Nb2RlCisgKgorICogREVTQ1JJUFRJT046IHNldCBzY2VuZSBzZWxlY3Rpb24gbW9kZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0U2NlbmVTZWxlY3Rpb25Nb2RlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfUUNfU0NFTkVfU0VMRUNUSU9OKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfU0NFTkVfU0VMRUNUSU9OKTsKKyAgICBpZiAoTlVMTCAhPSBzdHIpIHsKKyAgICAgICAgaWYgKChOVUxMID09IHByZXZfc3RyKSB8fCAoc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApKSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihFTkFCTEVfRElTQUJMRV9NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKEVOQUJMRV9ESVNBQkxFX01PREVTX01BUCksIHN0cik7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJTZXR0aW5nIHNlbGVjdGlvbiB2YWx1ZSAlcyIsIHN0cik7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIG1fYlpzbE1vZGVfbmV3KSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1NDRU5FX1NFTEVDVElPTiwgc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgbV9iTmVlZFJlc3RhcnQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtX2JTY2VuZVNlbGVjdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfU0NFTkVfU0VMRUNUSU9OLCBzdHIpOworICAgICAgICAgICAgICAgICAgICBtX2JOZWVkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1fYlNjZW5lU2VsZWN0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiVHJ5aW5nIHRvIGVuYWJsZSBzY2VuZSBzZWxlY3Rpb24gaW4gbm9uIFpTTCBtb2RlISEhIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJUcnlpbmcgdG8gY29uZmlndXJlIGludmFsaWQgc2NlbmUgc2VsZWN0aW9uIHZhbHVlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U2VsZWN0ZWRTY2VuZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZWxlY3Qgc3BlY2lmaWMgc2NlbmUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHNjZW5lICAgOiBzY2VuZSBtb2RlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0U2VsZWN0ZWRTY2VuZShjYW1fc2NlbmVfbW9kZV90eXBlIHNjZW5lKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsKG1fU2NlbmVTZWxlY3RMb2NrKTsKKyAgICBtX1NlbGVjdGVkU2NlbmUgPSBzY2VuZTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0U2VsZWN0ZWRTY2VuZQorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgc2VsZWN0ZWQgc2NlbmUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqCisgKiBSRVRVUk4gICAgIDogY3VycmVudGx5IHNlbGVjdGVkIHNjZW5lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2NhbV9zY2VuZV9tb2RlX3R5cGUgUUNhbWVyYVBhcmFtZXRlcnM6OmdldFNlbGVjdGVkU2NlbmUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsKG1fU2NlbmVTZWxlY3RMb2NrKTsKKyAgICByZXR1cm4gbV9TZWxlY3RlZFNjZW5lOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRSZGlNb2RlCisgKgorICogREVTQ1JJUFRJT046IHNldCBSZGkgbW9kZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0UmRpTW9kZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1JESV9NT0RFKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfUkRJX01PREUpOworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5yZGkubW9kZSIsIHByb3AsIFZBTFVFX0RJU0FCTEUpOworICAgIGlmICgoc3RyICE9IE5VTEwpICYmIChwcmV2X3N0ciA9PSBOVUxMIHx8IHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSkgeworICAgICAgICBMT0dEKCJSREkgbW9kZSBzZXQgdG8gJXMiLCBzdHIpOworICAgICAgICBzZXRSZGlNb2RlKHN0cik7CisgICAgfSBlbHNlIGlmIChwcmV2X3N0ciA9PSBOVUxMIHx8IHN0cmNtcChwcmV2X3N0ciwgcHJvcCkgIT0gMCApIHsKKyAgICAgICAgTE9HRCgiUkRJIG1vZGUgc2V0IHRvIHByb3A6ICVzIiwgcHJvcCk7CisgICAgICAgIHNldFJkaU1vZGUocHJvcCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U2VjdXJlTW9kZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgc2VjdXJlIG1vZGUgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0U2VjdXJlTW9kZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1NFQ1VSRV9NT0RFKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfU0VDVVJFX01PREUpOworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5zZWN1cmUubW9kZSIsIHByb3AsIFZBTFVFX0RJU0FCTEUpOworICAgIGlmICgoc3RyICE9IE5VTEwpICYmIChwcmV2X3N0ciA9PSBOVUxMIHx8IHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSkgeworICAgICAgICBMT0dEKCJTZWN1cmUgbW9kZSBzZXQgdG8gS0VZOiAlcyIsIHN0cik7CisgICAgICAgIHNldFNlY3VyZU1vZGUoc3RyKTsKKyAgICB9IGVsc2UgaWYgKHByZXZfc3RyID09IE5VTEwgfHwgc3RyY21wKHByZXZfc3RyLCBwcm9wKSAhPSAwICkgeworICAgICAgICBMT0dEKCJTZWN1cmUgbW9kZSBzZXQgdG8gcHJvcDogJXMiLCBwcm9wKTsKKyAgICAgICAgc2V0U2VjdXJlTW9kZShwcm9wKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFpzbEF0dHJpYnV0ZXMKKyAqCisgKiBERVNDUklQVElPTjogc2V0IFpTTCByZWxhdGVkIGF0dHJpYnV0ZXMgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFpzbEF0dHJpYnV0ZXMoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICAvLyBUT0RPOiBtYXkgc3dpdGNoIHRvIHB1cmUgcGFyYW0gaW5zdGVhZCBvZiBzeXNwcm9wCisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19aU0xfQlVSU1RfSU5URVJWQUwpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBzZXQoS0VZX1FDX1pTTF9CVVJTVF9JTlRFUlZBTCwgc3RyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS56c2wuaW50ZXJ2YWwiLCBwcm9wLCAiMSIpOworICAgICAgICBzZXQoS0VZX1FDX1pTTF9CVVJTVF9JTlRFUlZBTCwgcHJvcCk7CisgICAgICAgIExPR0goImJ1cnN0IGludGVydmFsOiAlcyIsIHByb3ApOworICAgIH0KKworICAgIHN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1pTTF9CVVJTVF9MT09LQkFDSyk7CisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIHNldChLRVlfUUNfWlNMX0JVUlNUX0xPT0tCQUNLLCBzdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnpzbC5iYWNrbG9va2NudCIsIHByb3AsICIyIik7CisgICAgICAgIHVpbnQzMl90IGxvb2tfYmFja19jbnQgPSBhdG9pKHByb3ApOworICAgICAgICBpZiAobV9iRnJhbWVTeW5jRW5hYmxlZCkgeworICAgICAgICAgICAgbG9va19iYWNrX2NudCArPSBFWFRSQV9GUkFNRV9TWU5DX0JVRkZFUlM7CisgICAgICAgIH0KKyAgICAgICAgc2V0KEtFWV9RQ19aU0xfQlVSU1RfTE9PS0JBQ0ssIGxvb2tfYmFja19jbnQpOworICAgICAgICBMT0dIKCJsb29rIGJhY2sgY291bnQ6ICVzIiwgcHJvcCk7CisgICAgfQorCisgICAgc3RyID0gcGFyYW1zLmdldChLRVlfUUNfWlNMX1FVRVVFX0RFUFRIKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgc2V0KEtFWV9RQ19aU0xfUVVFVUVfREVQVEgsIHN0cik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuenNsLnF1ZXVlZGVwdGgiLCBwcm9wLCAiMiIpOworICAgICAgICB1aW50MzJfdCBxdWV1ZV9kZXB0aCA9IGF0b2kocHJvcCk7CisgICAgICAgIGlmIChtX2JGcmFtZVN5bmNFbmFibGVkKSB7CisgICAgICAgICAgICBxdWV1ZV9kZXB0aCArPSBFWFRSQV9GUkFNRV9TWU5DX0JVRkZFUlM7CisgICAgICAgIH0KKyAgICAgICAgc2V0KEtFWV9RQ19aU0xfUVVFVUVfREVQVEgsIHF1ZXVlX2RlcHRoKTsKKyAgICAgICAgTE9HSCgicXVldWUgZGVwdGg6ICVzIiwgcHJvcCk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEZsaXAKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHByZXZpZXcvIHZpZGVvLyBwaWN0dXJlIGZsaXAgbW9kZSBmcm9tIHVzZXIgc2V0dGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0RmxpcChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGlmICgobV9wQ2FwYWJpbGl0eS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9GTElQKSA9PSAwKSB7CisgICAgICAgIExPR0goImZsaXAgaXMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIC8vY2hlY2sgcHJldmlldyBmbGlwIHNldHRpbmcKKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19QUkVWSUVXX0ZMSVApOworICAgIGNvbnN0IGNoYXIgKnByZXZfdmFsID0gZ2V0KEtFWV9RQ19QUkVWSUVXX0ZMSVApOworICAgIGlmKHN0ciAhPSBOVUxMKXsKKyAgICAgICAgaWYgKHByZXZfdmFsID09IE5VTEwgfHwgc3RyY21wKHN0ciwgcHJldl92YWwpICE9IDApIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWUgPSBsb29rdXBBdHRyKEZMSVBfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShGTElQX01PREVTX01BUCksIHN0cik7CisgICAgICAgICAgICBpZih2YWx1ZSAhPSBOQU1FX05PVF9GT1VORCl7CisgICAgICAgICAgICAgICAgc2V0KEtFWV9RQ19QUkVWSUVXX0ZMSVAsIHN0cik7CisgICAgICAgICAgICAgICAgbV9iUHJldmlld0ZsaXBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNoZWNrIHZpZGVvIGZpbHAgc2V0dGluZworICAgIHN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX1ZJREVPX0ZMSVApOworICAgIHByZXZfdmFsID0gZ2V0KEtFWV9RQ19WSURFT19GTElQKTsKKyAgICBpZihzdHIgIT0gTlVMTCl7CisgICAgICAgIGlmIChwcmV2X3ZhbCA9PSBOVUxMIHx8IHN0cmNtcChzdHIsIHByZXZfdmFsKSAhPSAwKSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihGTElQX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoRkxJUF9NT0RFU19NQVApLCBzdHIpOworICAgICAgICAgICAgaWYodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpeworICAgICAgICAgICAgICAgIHNldChLRVlfUUNfVklERU9fRkxJUCwgc3RyKTsKKyAgICAgICAgICAgICAgICBtX2JWaWRlb0ZsaXBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNoZWNrIHBpY3R1cmUgZmlscCBzZXR0aW5nCisgICAgc3RyID0gcGFyYW1zLmdldChLRVlfUUNfU05BUFNIT1RfUElDVFVSRV9GTElQKTsKKyAgICBwcmV2X3ZhbCA9IGdldChLRVlfUUNfU05BUFNIT1RfUElDVFVSRV9GTElQKTsKKyAgICBpZihzdHIgIT0gTlVMTCl7CisgICAgICAgIGlmIChwcmV2X3ZhbCA9PSBOVUxMIHx8IHN0cmNtcChzdHIsIHByZXZfdmFsKSAhPSAwKSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihGTElQX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoRkxJUF9NT0RFU19NQVApLCBzdHIpOworICAgICAgICAgICAgaWYodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpeworICAgICAgICAgICAgICAgIHNldChLRVlfUUNfU05BUFNIT1RfUElDVFVSRV9GTElQLCBzdHIpOworICAgICAgICAgICAgICAgIG1fYlNuYXBzaG90RmxpcENoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFNuYXBzaG90RkRSZXEKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHJlcXVpcmVtZW50IG9mIEZhY2UgRGV0ZWN0aW9uIE1ldGFkYXRhIGluIFNuYXBzaG90IG1vZGUuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRTbmFwc2hvdEZEUmVxKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfUUNfU05BUFNIT1RfRkRfREFUQSk7CisKKyAgICBpZihzdHIgIT0gTlVMTCl7CisgICAgICAgIHNldChLRVlfUUNfU05BUFNIT1RfRkRfREFUQSwgc3RyKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuc25hcHNob3QuZmQiLCBwcm9wLCAiMCIpOworICAgICAgICBzZXQoS0VZX1FDX1NOQVBTSE9UX0ZEX0RBVEEsIHByb3ApOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0TW9iaWNhdAorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgTW9iaWNhdCBvbi9vZmYuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRNb2JpY2F0KGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApCit7CisgICAgY2hhciB2YWx1ZSBbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLm1vYmljYXQiLCB2YWx1ZSwgIjAiKTsKKyAgICBpbnQzMl90IHJldCA9IE5PX0VSUk9SOworICAgIHVpbnQ4X3QgZW5hYmxlTW9iaSA9ICh1aW50OF90KWF0b2kodmFsdWUpOworCisgICAgaWYgKGVuYWJsZU1vYmkpIHsKKyAgICAgICAgdHVuZV9jbWRfdCB0dW5lX2NtZDsKKyAgICAgICAgdHVuZV9jbWQudHlwZSA9IDI7CisgICAgICAgIHR1bmVfY21kLm1vZHVsZSA9IDA7CisgICAgICAgIHR1bmVfY21kLnZhbHVlID0gMTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fU0VUX1ZGRV9DT01NQU5ELCB0dW5lX2NtZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fU0VUX1BQX0NPTU1BTkQsIHR1bmVfY21kKSkgeworICAgICAgICAgICAgcmV0ID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIG1fTW9iaU1hc2sgPSBlbmFibGVNb2JpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRMb25nc2hvdFBhcmFtCisgKgorICogREVTQ1JJUFRJT046IHNldCBMb25nc2hvdCBvbi9vZmYuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRMb25nc2hvdFBhcmFtKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfUUNfTE9OR19TSE9UKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfTE9OR19TSE9UKTsKKworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fCBzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkgeworICAgICAgICAgICAgc2V0KEtFWV9RQ19MT05HX1NIT1QsIHN0cik7CisgICAgICAgICAgICBpZiAocHJldl9zdHIgJiYgIXN0cmNtcChzdHIsICJvZmYiKSAmJiAhc3RyY21wKHByZXZfc3RyLCAib24iKSkgeworICAgICAgICAgICAgICAgIC8vIFdlIHJlc3RhcnQgaGVyZSwgdG8gcmVzZXQgdGhlIEZQUyBhbmQgbm8KKyAgICAgICAgICAgICAgICAvLyBvZiBidWZmZXJzIGFzIHBlciB0aGUgcmVxdWlyZW1lbnQgb2Ygc2luZ2xlIHNuYXBzaG90IHVzZWNhc2UuCisgICAgICAgICAgICAgICAgLy8gSGVyZSByZXN0YXJ0IGhhcHBlbnMgd2hlbiBjb250aW51b3VzIHNob3QgaXMgY2hhbmdlZCB0byBvZmYgZnJvbSBvbi4KKyAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIGNvbnRpbnVvdXMgc2hvdCBvbiwgcmVzdGFydCBpcyB0YWtlbiBjYXJlIHdoZW4gYWN0dWFsCisgICAgICAgICAgICAgICAgLy8gbG9uZ3Nob3QgY29tbWFuZCBpcyB0cmlnZ2VyZWQgdGhyb3VnaCBzZW5kQ29tbWFuZC4KKyAgICAgICAgICAgICAgICBtX2JOZWVkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2hlY2tGZWF0dXJlQ29uY3VycmVuY3kKKyAqCisgKiBERVNDUklQVElPTjogY2hlY2sgaWYgdGhlcmUgaXMgYSBmZWF0dXJlIGNvbmN1cnJlbmN5IGlzc3VlIHdpdGggYWR2YW5jZWQKKyAqICAgICAgICAgICAgICBjYW1lcmEgZmVhdHVyZXMKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmNoZWNrRmVhdHVyZUNvbmN1cnJlbmN5KCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgdWludDMyX3QgYWR2YW5jZWRGZWF0RW5hYmxlQml0ID0gMDsKKworICAgIGlmIChpc1N0aWxsTW9yZUVuYWJsZWQoKSkgeworICAgICAgICBhZHZhbmNlZEZlYXRFbmFibGVCaXQgfD0gQ0FNX1FDT01fRkVBVFVSRV9TVElMTE1PUkU7CisgICAgfQorICAgIGlmIChpc0hEUkVuYWJsZWQoKSkgeworICAgICAgICBhZHZhbmNlZEZlYXRFbmFibGVCaXQgfD0gQ0FNX1FDT01fRkVBVFVSRV9IRFI7CisgICAgfQorICAgIGlmIChpc0Nocm9tYUZsYXNoRW5hYmxlZCgpKSB7CisgICAgICAgIGFkdmFuY2VkRmVhdEVuYWJsZUJpdCB8PSBDQU1fUUNPTV9GRUFUVVJFX0NIUk9NQV9GTEFTSDsKKyAgICB9CisgICAgaWYgKGlzVWJpRm9jdXNFbmFibGVkKCkpIHsKKyAgICAgICAgYWR2YW5jZWRGZWF0RW5hYmxlQml0IHw9IENBTV9RQ09NX0ZFQVRVUkVfVUJJRk9DVVM7CisgICAgfQorICAgIGlmIChpc1RydWVQb3J0cmFpdEVuYWJsZWQoKSkgeworICAgICAgICBhZHZhbmNlZEZlYXRFbmFibGVCaXQgfD0gQ0FNX1FDT01fRkVBVFVSRV9UUlVFUE9SVFJBSVQ7CisgICAgfQorICAgIGlmIChpc09wdGlab29tRW5hYmxlZCgpKSB7CisgICAgICAgIGFkdmFuY2VkRmVhdEVuYWJsZUJpdCB8PSBDQU1fUUNPTV9GRUFUVVJFX09QVElaT09NOworICAgIH0KKyAgICBpZiAoaXNVYmlSZWZvY3VzKCkpIHsKKyAgICAgICAgYWR2YW5jZWRGZWF0RW5hYmxlQml0IHw9IENBTV9RQ09NX0ZFQVRVUkVfUkVGT0NVUzsKKyAgICB9CisKKyAgIGlmIChtX2JMb25nc2hvdEVuYWJsZWQgJiYgYWR2YW5jZWRGZWF0RW5hYmxlQml0KSB7CisgICAgICAgIExPR0UoIkZhaWxlZCBMb25nc2hvdCBtb2RlIGJpdCAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWRGZWF0RW5hYmxlQml0KTsKKyAgICAgICAgcmMgPSBCQURfVFlQRTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmKG1fYlJlY29yZGluZ0hpbnRfbmV3KSB7CisgICAgICAgIGFkdmFuY2VkRmVhdEVuYWJsZUJpdCAmPSB+Q0FNX1FDT01fRkVBVFVSRV9TVElMTE1PUkU7CisKKyAgICAgICAgaWYgKGFkdmFuY2VkRmVhdEVuYWJsZUJpdCkgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHJlY29yZGluZyBtb2RlIGJpdCAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgYWR2YW5jZWRGZWF0RW5hYmxlQml0KTsKKyAgICAgICAgICAgIHJjID0gQkFEX1RZUEU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1fYlpzbE1vZGVfbmV3KSB7CisgICAgICAgIC8qIFpTTCBtb2RlIGNoZWNrIGlmIDIgYml0cyBhcmUgc2V0ICovCisgICAgICAgIGlmIChhZHZhbmNlZEZlYXRFbmFibGVCaXQgJiAoYWR2YW5jZWRGZWF0RW5hYmxlQml0IC0gMSkpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCBaU0wgbW9kZSBiaXQgMHgleCIsIGFkdmFuY2VkRmVhdEVuYWJsZUJpdCk7CisgICAgICAgICAgICByYyA9IEJBRF9UWVBFOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLyogbm9uLVpTTCBtb2RlICovCisgICAgICAgIGFkdmFuY2VkRmVhdEVuYWJsZUJpdCAmPSB+Q0FNX1FDT01fRkVBVFVSRV9IRFI7CisKKyAgICAgICAgLyogbm9uLVpTTCBtb2RlIGNoZWNrIGlmIDEgYml0IGlzIHNldCAqLworICAgICAgICBpZiAoYWR2YW5jZWRGZWF0RW5hYmxlQml0KSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgbm9uLVpTTCBtb2RlIGJpdCAweCV4IiwgYWR2YW5jZWRGZWF0RW5hYmxlQml0KTsKKyAgICAgICAgICAgIHJjID0gQkFEX1RZUEU7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HSSgiQWR2YW5jZSBmZWF0dXJlIGVuYWJsZWQgMHgleCIsIGFkdmFuY2VkRmVhdEVuYWJsZUJpdCk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVwZGF0ZVBhcmFtZXRlcnMKKyAqCisgKiBERVNDUklQVElPTjogdXBkYXRlIHBhcmFtZXRlcnMgZnJvbSB1c2VyIHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICogICBAbmVlZFJlc3RhcnQgOiBbb3V0cHV0XSBpZiBwcmV2aWV3IG5lZWQgcmVzdGFydCB1cG9uIHNldHRpbmcgY2hhbmdlcworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnVwZGF0ZVBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcCwKKyAgICAgICAgYm9vbCAmbmVlZFJlc3RhcnQpCit7CisgICAgaW50MzJfdCBmaW5hbF9yYyA9IE5PX0VSUk9SOworICAgIGludDMyX3QgcmM7CisgICAgbV9iTmVlZFJlc3RhcnQgPSBmYWxzZTsKKyAgICBRQ2FtZXJhUGFyYW1ldGVycyBwYXJhbXMocCk7CisKKyAgICBpZihpbml0QmF0Y2hVcGRhdGUobV9wUGFyYW1CdWYpIDwgMCApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZ3JvdXAgdXBkYXRlIHRhYmxlIik7CisgICAgICAgIHJjID0gQkFEX1RZUEU7CisgICAgICAgIGdvdG8gVVBEQVRFX1BBUkFNX0RPTkU7CisgICAgfQorCisgICAgaWYgKChyYyA9IHNldFByZXZpZXdTaXplKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFZpZGVvU2l6ZShwYXJhbXMpKSkgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFBpY3R1cmVTaXplKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFByZXZpZXdGb3JtYXQocGFyYW1zKSkpICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFBpY3R1cmVGb3JtYXQocGFyYW1zKSkpICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEpwZWdRdWFsaXR5KHBhcmFtcykpKSAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldE9yaWVudGF0aW9uKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFJvdGF0aW9uKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFZpZGVvUm90YXRpb24ocGFyYW1zKSkpICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldE5vRGlzcGxheU1vZGUocGFyYW1zKSkpICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFpzbE1vZGUocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFpzbEF0dHJpYnV0ZXMocGFyYW1zKSkpICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldENhbWVyYU1vZGUocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFNjZW5lU2VsZWN0aW9uTW9kZShwYXJhbXMpKSkgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFJlY29yZGluZ0hpbnQocGFyYW1zKSkpICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFJkaU1vZGUocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFNlY3VyZU1vZGUocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFByZXZpZXdGcmFtZVJhdGUocGFyYW1zKSkpICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFByZXZpZXdGcHNSYW5nZShwYXJhbXMpKSkgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEF1dG9FeHBvc3VyZShwYXJhbXMpKSkgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEVmZmVjdChwYXJhbXMpKSkgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEJyaWdodG5lc3MocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFpvb20ocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFNoYXJwbmVzcyhwYXJhbXMpKSkgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFNhdHVyYXRpb24ocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldENvbnRyYXN0KHBhcmFtcykpKSAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEZvY3VzTW9kZShwYXJhbXMpKSkgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldElTT1ZhbHVlKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldENvbnRpbnVvdXNJU08ocGFyYW1zKSkpICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEV4cG9zdXJlVGltZShwYXJhbXMpKSkgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFNraW5Ub25lRW5oYW5jZW1lbnQocGFyYW1zKSkpICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEZsYXNoKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEFlY0xvY2socGFyYW1zKSkpICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEF3YkxvY2socGFyYW1zKSkpICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldExlbnNTaGFkZVZhbHVlKHBhcmFtcykpKSAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldE1DRVZhbHVlKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldERJU1ZhbHVlKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEFudGliYW5kaW5nKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEV4cG9zdXJlQ29tcGVuc2F0aW9uKHBhcmFtcykpKSAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFdoaXRlQmFsYW5jZShwYXJhbXMpKSkgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEhEUk1vZGUocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEhEUk5lZWQxeChwYXJhbXMpKSkgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldE1hbnVhbFdoaXRlQmFsYW5jZShwYXJhbXMpKSkgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFNjZW5lTW9kZShwYXJhbXMpKSkgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEZvY3VzQXJlYXMocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEZvY3VzUG9zaXRpb24ocGFyYW1zKSkpICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldE1ldGVyaW5nQXJlYXMocGFyYW1zKSkpICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFNlbGVjdGFibGVab25lQWYocGFyYW1zKSkpICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFJlZGV5ZVJlZHVjdGlvbihwYXJhbXMpKSkgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEFFQnJhY2tldChwYXJhbXMpKSkgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEF1dG9IRFIocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEdwc0xvY2F0aW9uKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFdhdmVsZXREZW5vaXNlKHBhcmFtcykpKSAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEZhY2VSZWNvZ25pdGlvbihwYXJhbXMpKSkgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEZsaXAocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFZpZGVvSERSKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFZ0RW5hYmxlKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEFGQnJhY2tldChwYXJhbXMpKSkgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFJlRm9jdXMocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldENocm9tYUZsYXNoKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFRydWVQb3J0cmFpdChwYXJhbXMpKSkgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldE9wdGlab29tKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEJ1cnN0TEVET25QZXJpb2QocGFyYW1zKSkpICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFJldHJvQWN0aXZlQnVyc3ROdW0ocGFyYW1zKSkpICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFNuYXBzaG90RkRSZXEocGFyYW1zKSkpICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFRpbnRsZXNzVmFsdWUocGFyYW1zKSkpICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldENEU01vZGUocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldFRlbXBvcmFsRGVub2lzZShwYXJhbXMpKSkgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldENhY2hlVmlkZW9CdWZmZXJzKHBhcmFtcykpKSAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEluaXRpYWxFeHBvc3VyZUluZGV4KHBhcmFtcykpKSAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEluc3RhbnRDYXB0dXJlKHBhcmFtcykpKSAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisgICAgaWYgKChyYyA9IHNldEluc3RhbnRBRUMocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgIGZpbmFsX3JjID0gcmM7CisKKyAgICAvLyB1cGRhdGUgbGl2ZSBzbmFwc2hvdCBzaXplIGFmdGVyIGFsbCBvdGhlciBwYXJhbWV0ZXJzIGFyZSBzZXQKKyAgICBpZiAoKHJjID0gc2V0TGl2ZVNuYXBzaG90U2l6ZShwYXJhbXMpKSkgICAgICAgICAgICAgZmluYWxfcmMgPSByYzsKKyAgICBpZiAoKHJjID0gc2V0SnBlZ1RodW1ibmFpbFNpemUocGFyYW1zKSkpICAgICAgICAgICAgZmluYWxfcmMgPSByYzsKKyAgICBpZiAoKHJjID0gc2V0U3RhdHNEZWJ1Z01hc2soKSkpICAgICAgICAgICAgICAgICAgICAgZmluYWxfcmMgPSByYzsKKyAgICBpZiAoKHJjID0gc2V0UEFBRigpKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfcmMgPSByYzsKKyAgICBpZiAoKHJjID0gc2V0TW9iaWNhdChwYXJhbXMpKSkgICAgICAgICAgICAgICAgICAgICAgZmluYWxfcmMgPSByYzsKKyAgICBpZiAoKHJjID0gc2V0U2VlTW9yZShwYXJhbXMpKSkgICAgICAgICAgICAgICAgICAgICAgZmluYWxfcmMgPSByYzsKKyAgICBpZiAoKHJjID0gc2V0U3RpbGxNb3JlKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgICAgZmluYWxfcmMgPSByYzsKKyAgICBpZiAoKHJjID0gc2V0Q3VzdG9tUGFyYW1zKHBhcmFtcykpKSAgICAgICAgICAgICAgICAgZmluYWxfcmMgPSByYzsKKyAgICBpZiAoKHJjID0gc2V0Tm9pc2VSZWR1Y3Rpb25Nb2RlKHBhcmFtcykpKSAgICAgICAgICAgZmluYWxfcmMgPSByYzsKKworICAgIGlmICgocmMgPSBzZXRMb25nc2hvdFBhcmFtKHBhcmFtcykpKSAgICAgICAgICAgICAgICBmaW5hbF9yYyA9IHJjOworICAgIGlmICgocmMgPSBzZXREdWFsTGVkQ2FsaWJyYXRpb24ocGFyYW1zKSkpICAgICAgICAgICBmaW5hbF9yYyA9IHJjOworCisgICAgc2V0UXVhZHJhQ2ZhKHBhcmFtcyk7CisgICAgc2V0VmlkZW9CYXRjaFNpemUoKTsKKyAgICBzZXRMb3dMaWdodENhcHR1cmUoKTsKKworICAgIGlmICgocmMgPSB1cGRhdGVGbGFzaChmYWxzZSkpKSAgICAgICAgICAgICAgICAgICAgICBmaW5hbF9yYyA9IHJjOworI2lmZGVmIFRBUkdFVF9UU19NQUtFVVAKKyAgICBpZiAoKHJjID0gc2V0VHNNYWtldXAocGFyYW1zKSkpICAgICAgICAgICAgICAgICAgICAgZmluYWxfcmMgPSByYzsKKyNlbmRpZgorICAgIGlmICgocmMgPSBzZXRBZHZhbmNlZENhcHR1cmVNb2RlKCkpKSAgICAgICAgICAgICAgICBmaW5hbF9yYyA9IHJjOworVVBEQVRFX1BBUkFNX0RPTkU6CisgICAgbmVlZFJlc3RhcnQgPSBtX2JOZWVkUmVzdGFydDsKKyAgICByZXR1cm4gZmluYWxfcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY29tbWl0UGFyYW1ldGVycworICoKKyAqIERFU0NSSVBUSU9OOiBjb21taXQgcGFyYW1ldGVyIGNoYW5nZXMgdG8gYmFja2VuZAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Y29tbWl0UGFyYW1ldGVycygpCit7CisgICAgcmV0dXJuIGNvbW1pdFNldEJhdGNoKCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW5pdERlZmF1bHRQYXJhbWV0ZXJzCisgKgorICogREVTQ1JJUFRJT046IGluaXRpYWxpemUgZGVmYXVsdCBwYXJhbWV0ZXJzIGZvciB0aGUgZmlyc3QgdGltZQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6aW5pdERlZmF1bHRQYXJhbWV0ZXJzKCkKK3sKKyAgICBpZihpbml0QmF0Y2hVcGRhdGUobV9wUGFyYW1CdWYpIDwgMCApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZ3JvdXAgdXBkYXRlIHRhYmxlIik7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisgICAgaW50MzJfdCBoYWxfdmVyc2lvbiA9IENBTV9IQUxfVjE7CisgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9IQUxfVkVSU0lPTiwgaGFsX3ZlcnNpb24pOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKipJbml0aWFsaXplIFZhbHVlcyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvLyBTZXQgcmVhZCBvbmx5IHBhcmFtZXRlcnMgZnJvbSBjYW1lcmEgY2FwYWJpbGl0eQorICAgIHNldChLRVlfU01PT1RIX1pPT01fU1VQUE9SVEVELAorICAgICAgICBtX3BDYXBhYmlsaXR5LT5zbW9vdGhfem9vbV9zdXBwb3J0ZWQ/IFZBTFVFX1RSVUUgOiBWQUxVRV9GQUxTRSk7CisgICAgc2V0KEtFWV9aT09NX1NVUFBPUlRFRCwKKyAgICAgICAgbV9wQ2FwYWJpbGl0eS0+em9vbV9zdXBwb3J0ZWQ/IFZBTFVFX1RSVUUgOiBWQUxVRV9GQUxTRSk7CisgICAgc2V0KEtFWV9WSURFT19TTkFQU0hPVF9TVVBQT1JURUQsCisgICAgICAgIG1fcENhcGFiaWxpdHktPnZpZGVvX3NuYXBzaG90X3N1cHBvcnRlZD8gVkFMVUVfVFJVRSA6IFZBTFVFX0ZBTFNFKTsKKyAgICBzZXQoS0VZX1ZJREVPX1NUQUJJTElaQVRJT05fU1VQUE9SVEVELAorICAgICAgICBtX3BDYXBhYmlsaXR5LT52aWRlb19zdGFibGl6YXRpb25fc3VwcG9ydGVkPyBWQUxVRV9UUlVFIDogVkFMVUVfRkFMU0UpOworICAgIHNldChLRVlfQVVUT19FWFBPU1VSRV9MT0NLX1NVUFBPUlRFRCwKKyAgICAgICAgbV9wQ2FwYWJpbGl0eS0+YXV0b19leHBvc3VyZV9sb2NrX3N1cHBvcnRlZD8gVkFMVUVfVFJVRSA6IFZBTFVFX0ZBTFNFKTsKKyAgICBzZXQoS0VZX0FVVE9fV0hJVEVCQUxBTkNFX0xPQ0tfU1VQUE9SVEVELAorICAgICAgICBtX3BDYXBhYmlsaXR5LT5hdXRvX3diX2xvY2tfc3VwcG9ydGVkPyBWQUxVRV9UUlVFIDogVkFMVUVfRkFMU0UpOworICAgIHNldChLRVlfTUFYX05VTV9ERVRFQ1RFRF9GQUNFU19IVywgbV9wQ2FwYWJpbGl0eS0+bWF4X251bV9yb2kpOworICAgIHNldChLRVlfTUFYX05VTV9ERVRFQ1RFRF9GQUNFU19TVywgbV9wQ2FwYWJpbGl0eS0+bWF4X251bV9yb2kpOworICAgIHNldChLRVlfUUNfTUFYX05VTV9SRVFVRVNURURfRkFDRVMsIG1fcENhcGFiaWxpdHktPm1heF9udW1fcm9pKTsKKyAgICAvLyBTZXQgZm9jYWwgbGVuZ3RoLCBob3Jpem9udGFsIHZpZXcgYW5nbGUsIGFuZCB2ZXJ0aWNhbCB2aWV3IGFuZ2xlCisgICAgc2V0RmxvYXQoS0VZX0ZPQ0FMX0xFTkdUSCwgbV9wQ2FwYWJpbGl0eS0+Zm9jYWxfbGVuZ3RoKTsKKyAgICBzZXRGbG9hdChLRVlfSE9SSVpPTlRBTF9WSUVXX0FOR0xFLCBtX3BDYXBhYmlsaXR5LT5ob3Jfdmlld19hbmdsZSk7CisgICAgc2V0RmxvYXQoS0VZX1ZFUlRJQ0FMX1ZJRVdfQU5HTEUsIG1fcENhcGFiaWxpdHktPnZlcl92aWV3X2FuZ2xlKTsKKyAgICBzZXQoUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NVU19ESVNUQU5DRVMsICJJbmZpbml0eSxJbmZpbml0eSxJbmZpbml0eSIpOworICAgIHNldChLRVlfUUNfQVVUT19IRFJfU1VQUE9SVEVELAorICAgICAgICAobV9wQ2FwYWJpbGl0eS0+YXV0b19oZHJfc3VwcG9ydGVkKT8gVkFMVUVfVFJVRSA6IFZBTFVFX0ZBTFNFKTsKKyAgICAvLyBTZXQgc3VwcG9ydGVkIHByZXZpZXcgc2l6ZXMKKyAgICBpZiAobV9wQ2FwYWJpbGl0eS0+cHJldmlld19zaXplc190YmxfY250ID4gMCAmJgorICAgICAgICBtX3BDYXBhYmlsaXR5LT5wcmV2aWV3X3NpemVzX3RibF9jbnQgPD0gTUFYX1NJWkVTX0NOVCkgeworICAgICAgICBTdHJpbmc4IHByZXZpZXdTaXplVmFsdWVzID0gY3JlYXRlU2l6ZXNTdHJpbmcoCisgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+cHJldmlld19zaXplc190YmwsIG1fcENhcGFiaWxpdHktPnByZXZpZXdfc2l6ZXNfdGJsX2NudCk7CisgICAgICAgIHNldChLRVlfU1VQUE9SVEVEX1BSRVZJRVdfU0laRVMsIHByZXZpZXdTaXplVmFsdWVzLnN0cmluZygpKTsKKyAgICAgICAgTE9HSCgic3VwcG9ydGVkIHByZXZpZXcgc2l6ZXM6ICVzIiwgcHJldmlld1NpemVWYWx1ZXMuc3RyaW5nKCkpOworICAgICAgICAvLyBTZXQgZGVmYXVsdCBwcmV2aWV3IHNpemUKKyAgICAgICAgQ2FtZXJhUGFyYW1ldGVyczo6c2V0UHJldmlld1NpemUobV9wQ2FwYWJpbGl0eS0+cHJldmlld19zaXplc190YmxbMF0ud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnByZXZpZXdfc2l6ZXNfdGJsWzBdLmhlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVygic3VwcG9ydGVkIHByZXZpZXcgc2l6ZXMgY250IGlzIDAgb3IgZXhjZWVkcyBtYXghISEiKTsKKyAgICB9CisKKyAgICAvLyBTZXQgc3VwcG9ydGVkIHZpZGVvIHNpemVzCisgICAgaWYgKG1fcENhcGFiaWxpdHktPnZpZGVvX3NpemVzX3RibF9jbnQgPiAwICYmCisgICAgICAgIG1fcENhcGFiaWxpdHktPnZpZGVvX3NpemVzX3RibF9jbnQgPD0gTUFYX1NJWkVTX0NOVCkgeworICAgICAgICBTdHJpbmc4IHZpZGVvU2l6ZVZhbHVlcyA9IGNyZWF0ZVNpemVzU3RyaW5nKAorICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnZpZGVvX3NpemVzX3RibCwgbV9wQ2FwYWJpbGl0eS0+dmlkZW9fc2l6ZXNfdGJsX2NudCk7CisgICAgICAgIHNldChLRVlfU1VQUE9SVEVEX1ZJREVPX1NJWkVTLCB2aWRlb1NpemVWYWx1ZXMuc3RyaW5nKCkpOworICAgICAgICBMT0dIKCJzdXBwb3J0ZWQgdmlkZW8gc2l6ZXM6ICVzIiwgdmlkZW9TaXplVmFsdWVzLnN0cmluZygpKTsKKyAgICAgICAgLy8gU2V0IGRlZmF1bHQgdmlkZW8gc2l6ZQorICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpzZXRWaWRlb1NpemUobV9wQ2FwYWJpbGl0eS0+dmlkZW9fc2l6ZXNfdGJsWzBdLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+dmlkZW9fc2l6ZXNfdGJsWzBdLmhlaWdodCk7CisKKyAgICAgICAgLy9TZXQgcHJlZmVycmVkIFByZXZpZXcgc2l6ZSBmb3IgdmlkZW8KKyAgICAgICAgU3RyaW5nOCB2U2l6ZSA9IGNyZWF0ZVNpemVzU3RyaW5nKCZtX3BDYXBhYmlsaXR5LT5wcmV2aWV3X3NpemVzX3RibFswXSwgMSk7CisgICAgICAgIHNldChLRVlfUFJFRkVSUkVEX1BSRVZJRVdfU0laRV9GT1JfVklERU8sIHZTaXplLnN0cmluZygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dXKCJzdXBwb3J0ZWQgdmlkZW8gc2l6ZXMgY250IGlzIDAgb3IgZXhjZWVkcyBtYXghISEiKTsKKyAgICB9CisKKyAgICAvLyBTZXQgc3VwcG9ydGVkIHBpY3R1cmUgc2l6ZXMKKyAgICBpZiAobV9wQ2FwYWJpbGl0eS0+cGljdHVyZV9zaXplc190YmxfY250ID4gMCAmJgorICAgICAgICBtX3BDYXBhYmlsaXR5LT5waWN0dXJlX3NpemVzX3RibF9jbnQgPD0gTUFYX1NJWkVTX0NOVCkgeworICAgICAgICBTdHJpbmc4IHBpY3R1cmVTaXplVmFsdWVzID0gY3JlYXRlU2l6ZXNTdHJpbmcoCisgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+cGljdHVyZV9zaXplc190YmwsIG1fcENhcGFiaWxpdHktPnBpY3R1cmVfc2l6ZXNfdGJsX2NudCk7CisgICAgICAgIHNldChLRVlfU1VQUE9SVEVEX1BJQ1RVUkVfU0laRVMsIHBpY3R1cmVTaXplVmFsdWVzLnN0cmluZygpKTsKKyAgICAgICAgTE9HSCgic3VwcG9ydGVkIHBpYyBzaXplczogJXMiLCBwaWN0dXJlU2l6ZVZhbHVlcy5zdHJpbmcoKSk7CisgICAgICAgIC8vIFNldCBkZWZhdWx0IHBpY3R1cmUgc2l6ZSB0byB0aGUgc21hbGxlc3QgcmVzb2x1dGlvbgorICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpzZXRQaWN0dXJlU2l6ZSgKKyAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+cGljdHVyZV9zaXplc190YmxbbV9wQ2FwYWJpbGl0eS0+cGljdHVyZV9zaXplc190YmxfY250LTFdLndpZHRoLAorICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5waWN0dXJlX3NpemVzX3RibFttX3BDYXBhYmlsaXR5LT5waWN0dXJlX3NpemVzX3RibF9jbnQtMV0uaGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dXKCJzdXBwb3J0ZWQgcGljdHVyZSBzaXplcyBjbnQgaXMgMCBvciBleGNlZWRzIG1heCEhISIpOworICAgIH0KKworICAgIC8vIE5lZWQgY2hlY2sgaWYgc2NhbGUgc2hvdWxkIGJlIGVuYWJsZWQKKyAgICBpZiAobV9wQ2FwYWJpbGl0eS0+c2NhbGVfcGljdHVyZV9zaXplc19jbnQgPiAwICYmCisgICAgICAgIG1fcENhcGFiaWxpdHktPnNjYWxlX3BpY3R1cmVfc2l6ZXNfY250IDw9IE1BWF9TQ0FMRV9TSVpFU19DTlQpeworICAgICAgICAvL2dldCBzY2FsZSBzaXplLCBlbmFibGUgc2NhbGluZy4gQW5kIHJlLXNldCBwaWN0dXJlIHNpemUgdGFibGUgd2l0aCBzY2FsZSBzaXplcworICAgICAgICBtX3JlcHJvY1NjYWxlUGFyYW0uc2V0U2NhbGVFbmFibGUodHJ1ZSk7CisgICAgICAgIGludCByY19zID0gbV9yZXByb2NTY2FsZVBhcmFtLnNldFNjYWxlU2l6ZVRibCgKKyAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnNjYWxlX3BpY3R1cmVfc2l6ZXNfY250LCBtX3BDYXBhYmlsaXR5LT5zY2FsZV9waWN0dXJlX3NpemVzLAorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+cGljdHVyZV9zaXplc190YmxfY250LCBtX3BDYXBhYmlsaXR5LT5waWN0dXJlX3NpemVzX3RibCk7CisgICAgICAgIGlmKHJjX3MgPT0gTk9fRVJST1IpeworICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90ICp0b3RhbFNpemVUYmwgPSBtX3JlcHJvY1NjYWxlUGFyYW0uZ2V0VG90YWxTaXplVGJsKCk7CisgICAgICAgICAgICBzaXplX3QgdG90YWxTaXplQ250ID0gbV9yZXByb2NTY2FsZVBhcmFtLmdldFRvdGFsU2l6ZVRibENudCgpOworICAgICAgICAgICAgU3RyaW5nOCBwaWN0dXJlU2l6ZVZhbHVlcyA9IGNyZWF0ZVNpemVzU3RyaW5nKHRvdGFsU2l6ZVRibCwgdG90YWxTaXplQ250KTsKKyAgICAgICAgICAgIHNldChLRVlfU1VQUE9SVEVEX1BJQ1RVUkVfU0laRVMsIHBpY3R1cmVTaXplVmFsdWVzLnN0cmluZygpKTsKKyAgICAgICAgICAgIExPR0goInNjYWxlZCBzdXBwb3J0ZWQgcGljIHNpemVzOiAlcyIsIHBpY3R1cmVTaXplVmFsdWVzLnN0cmluZygpKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBtX3JlcHJvY1NjYWxlUGFyYW0uc2V0U2NhbGVFbmFibGUoZmFsc2UpOworICAgICAgICAgICAgTE9HVygicmVzZXQgc2NhbGVkIHBpY3R1cmUgc2l6ZSB0YWJsZSBmYWlsZWQuIik7CisgICAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgICAgbV9yZXByb2NTY2FsZVBhcmFtLnNldFNjYWxlRW5hYmxlKGZhbHNlKTsKKyAgICB9CisKKyAgICAvLyBTZXQgc3VwcG9ydGVkIHRodW1ibmFpbCBzaXplcworICAgIFN0cmluZzggdGh1bWJuYWlsU2l6ZVZhbHVlcyA9IGNyZWF0ZVNpemVzU3RyaW5nKAorICAgICAgICAgICAgVEhVTUJOQUlMX1NJWkVTX01BUCwKKyAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKFRIVU1CTkFJTF9TSVpFU19NQVApKTsKKyAgICBzZXQoS0VZX1NVUFBPUlRFRF9KUEVHX1RIVU1CTkFJTF9TSVpFUywgdGh1bWJuYWlsU2l6ZVZhbHVlcy5zdHJpbmcoKSk7CisgICAgLy8gU2V0IGRlZmF1bHQgdGh1bW5haWwgc2l6ZQorICAgIHNldChLRVlfSlBFR19USFVNQk5BSUxfV0lEVEgsIFRIVU1CTkFJTF9TSVpFU19NQVBbMF0ud2lkdGgpOworICAgIHNldChLRVlfSlBFR19USFVNQk5BSUxfSEVJR0hULCBUSFVNQk5BSUxfU0laRVNfTUFQWzBdLmhlaWdodCk7CisKKyAgICAvLyBTZXQgc3VwcG9ydGVkIGxpdmVzbmFwc2hvdCBzaXplcworICAgIGlmIChtX3BDYXBhYmlsaXR5LT5saXZlc25hcHNob3Rfc2l6ZXNfdGJsX2NudCA+IDAgJiYKKyAgICAgICAgbV9wQ2FwYWJpbGl0eS0+bGl2ZXNuYXBzaG90X3NpemVzX3RibF9jbnQgPD0gTUFYX1NJWkVTX0NOVCkgeworICAgICAgICBTdHJpbmc4IGxpdmVTbnBhc2hvdFNpemVWYWx1ZXMgPSBjcmVhdGVTaXplc1N0cmluZygKKyAgICAgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5saXZlc25hcHNob3Rfc2l6ZXNfdGJsLAorICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPmxpdmVzbmFwc2hvdF9zaXplc190YmxfY250KTsKKyAgICAgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfTElWRVNOQVBTSE9UX1NJWkVTLCBsaXZlU25wYXNob3RTaXplVmFsdWVzLnN0cmluZygpKTsKKyAgICAgICAgTE9HRCgic3VwcG9ydGVkIGxpdmUgc25hcHNob3Qgc2l6ZXM6ICVzIiwgbGl2ZVNucGFzaG90U2l6ZVZhbHVlcy5zdHJpbmcoKSk7CisgICAgICAgIG1fTGl2ZVNuYXBzaG90U2l6ZSA9CisgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5saXZlc25hcHNob3Rfc2l6ZXNfdGJsW21fcENhcGFiaWxpdHktPmxpdmVzbmFwc2hvdF9zaXplc190YmxfY250LTFdOworICAgIH0KKworICAgIC8vIFNldCBzdXBwb3J0ZWQgcHJldmlldyBmb3JtYXRzCisgICAgU3RyaW5nOCBwcmV2aWV3Rm9ybWF0VmFsdWVzID0gY3JlYXRlVmFsdWVzU3RyaW5nKAorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX3ByZXZpZXdfZm10cywKKyAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnN1cHBvcnRlZF9wcmV2aWV3X2ZtdF9jbnQsCisgICAgICAgICAgICBQUkVWSUVXX0ZPUk1BVFNfTUFQLAorICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoUFJFVklFV19GT1JNQVRTX01BUCkpOworICAgIHNldChLRVlfU1VQUE9SVEVEX1BSRVZJRVdfRk9STUFUUywgcHJldmlld0Zvcm1hdFZhbHVlcy5zdHJpbmcoKSk7CisgICAgLy8gU2V0IGRlZmF1bHQgcHJldmlldyBmb3JtYXQKKyAgICBDYW1lcmFQYXJhbWV0ZXJzOjpzZXRQcmV2aWV3Rm9ybWF0KFBJWEVMX0ZPUk1BVF9ZVVY0MjBTUCk7CisKKyAgICAvLyBTZXQgZGVmYXVsdCBWaWRlbyBGb3JtYXQgYXMgT1BBUVVFCisgICAgLy8gSW50ZXJuYWxseSBib3RoIFZpZGVvIGFuZCBDYW1lcmEgc3Vic3lzdGVtcyB1c2UgTlYyMV9WRU5VUworICAgIHNldChLRVlfVklERU9fRlJBTUVfRk9STUFULCBQSVhFTF9GT1JNQVRfQU5EUk9JRF9PUEFRVUUpOworCisgICAgLy8gU2V0IHN1cHBvcnRlZCBwaWN0dXJlIGZvcm1hdHMKKyAgICBTdHJpbmc4IHBpY3R1cmVUeXBlVmFsdWVzKFBJWEVMX0ZPUk1BVF9KUEVHKTsKKyAgICBTdHJpbmc4IHN0ciA9IGNyZWF0ZVZhbHVlc1N0cmluZygKKyAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnN1cHBvcnRlZF9yYXdfZm10cywKKyAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnN1cHBvcnRlZF9yYXdfZm10X2NudCwKKyAgICAgICAgICAgIFBJQ1RVUkVfVFlQRVNfTUFQLAorICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoUElDVFVSRV9UWVBFU19NQVApKTsKKyAgICBpZiAoc3RyLnN0cmluZygpICE9IE5VTEwpIHsKKyAgICAgICAgcGljdHVyZVR5cGVWYWx1ZXMuYXBwZW5kKCIsIik7CisgICAgICAgIHBpY3R1cmVUeXBlVmFsdWVzLmFwcGVuZChzdHIpOworICAgIH0KKworICAgIHNldChLRVlfU1VQUE9SVEVEX1BJQ1RVUkVfRk9STUFUUywgcGljdHVyZVR5cGVWYWx1ZXMuc3RyaW5nKCkpOworICAgIC8vIFNldCBkZWZhdWx0IHBpY3R1cmUgRm9ybWF0CisgICAgQ2FtZXJhUGFyYW1ldGVyczo6c2V0UGljdHVyZUZvcm1hdChQSVhFTF9GT1JNQVRfSlBFRyk7CisgICAgLy8gU2V0IHJhdyBpbWFnZSBzaXplCisgICAgY2hhciByYXdfc2l6ZV9zdHJbMzJdOworICAgIHNucHJpbnRmKHJhd19zaXplX3N0ciwgc2l6ZW9mKHJhd19zaXplX3N0ciksICIlZHglZCIsCisgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+cmF3X2RpbVswXS53aWR0aCwgbV9wQ2FwYWJpbGl0eS0+cmF3X2RpbVswXS5oZWlnaHQpOworICAgIHNldChLRVlfUUNfUkFXX1BJQ1VUUkVfU0laRSwgcmF3X3NpemVfc3RyKTsKKyAgICBMT0dEKCJLRVlfUUNfUkFXX1BJQ1VUUkVfU0laRTogdzogJWQsIGg6ICVkICIsCisgICAgICAgbV9wQ2FwYWJpbGl0eS0+cmF3X2RpbVswXS53aWR0aCwgbV9wQ2FwYWJpbGl0eS0+cmF3X2RpbVswXS5oZWlnaHQpOworCisgICAgLy9zZXQgZGVmYXVsdCBqcGVnIHF1YWxpdHkgYW5kIHRodW1ibmFpbCBxdWFsaXR5CisgICAgc2V0KEtFWV9KUEVHX1FVQUxJVFksIDg1KTsKKyAgICBzZXQoS0VZX0pQRUdfVEhVTUJOQUlMX1FVQUxJVFksIDg1KTsKKworICAgIC8vIFNldCBGUFMgcmFuZ2VzCisgICAgaWYgKG1fcENhcGFiaWxpdHktPmZwc19yYW5nZXNfdGJsX2NudCA+IDAgJiYKKyAgICAgICAgbV9wQ2FwYWJpbGl0eS0+ZnBzX3Jhbmdlc190YmxfY250IDw9IE1BWF9TSVpFU19DTlQpIHsKKyAgICAgICAgaW50IGRlZmF1bHRfZnBzX2luZGV4ID0gMDsKKyAgICAgICAgU3RyaW5nOCBmcHNSYW5nZVZhbHVlcyA9IGNyZWF0ZUZwc1JhbmdlU3RyaW5nKG1fcENhcGFiaWxpdHktPmZwc19yYW5nZXNfdGJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+ZnBzX3Jhbmdlc190YmxfY250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9mcHNfaW5kZXgpOworICAgICAgICBzZXQoS0VZX1NVUFBPUlRFRF9QUkVWSUVXX0ZQU19SQU5HRSwgZnBzUmFuZ2VWYWx1ZXMuc3RyaW5nKCkpOworCisgICAgICAgIGludCBtaW5fZnBzID0KKyAgICAgICAgICAgIGludChtX3BDYXBhYmlsaXR5LT5mcHNfcmFuZ2VzX3RibFtkZWZhdWx0X2Zwc19pbmRleF0ubWluX2ZwcyAqIDEwMDApOworICAgICAgICBpbnQgbWF4X2ZwcyA9CisgICAgICAgICAgICBpbnQobV9wQ2FwYWJpbGl0eS0+ZnBzX3Jhbmdlc190YmxbZGVmYXVsdF9mcHNfaW5kZXhdLm1heF9mcHMgKiAxMDAwKTsKKyAgICAgICAgbV9kZWZhdWx0X2Zwc19yYW5nZSA9IG1fcENhcGFiaWxpdHktPmZwc19yYW5nZXNfdGJsW2RlZmF1bHRfZnBzX2luZGV4XTsKKyAgICAgICAgLy9TZXQgdmlkZW8gZnBzIHNhbWUgYXMgcHJldmlldyBmcHMKKyAgICAgICAgc2V0UHJldmlld0Zwc1JhbmdlKG1pbl9mcHMsIG1heF9mcHMsIG1pbl9mcHMsIG1heF9mcHMpOworCisgICAgICAgIC8vIFNldCBsZWdhY3kgcHJldmlldyBmcHMKKyAgICAgICAgU3RyaW5nOCBmcHNWYWx1ZXMgPSBjcmVhdGVGcHNTdHJpbmcobV9wQ2FwYWJpbGl0eS0+ZnBzX3Jhbmdlc190YmxbZGVmYXVsdF9mcHNfaW5kZXhdKTsKKyAgICAgICAgc2V0KEtFWV9TVVBQT1JURURfUFJFVklFV19GUkFNRV9SQVRFUywgZnBzVmFsdWVzLnN0cmluZygpKTsKKyAgICAgICAgTE9HSCgic3VwcG9ydGVkIGZwcyByYXRlczogJXMiLCBmcHNWYWx1ZXMuc3RyaW5nKCkpOworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpzZXRQcmV2aWV3RnJhbWVSYXRlKGludChtX3BDYXBhYmlsaXR5LT5mcHNfcmFuZ2VzX3RibFtkZWZhdWx0X2Zwc19pbmRleF0ubWF4X2ZwcykpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coInN1cHBvcnRlZCBmcHMgcmFuZ2VzIGNudCBpcyAwIG9yIGV4Y2VlZHMgbWF4ISEhIik7CisgICAgfQorCisgICAgLy8gU2V0IHN1cHBvcnRlZCBmb2N1cyBtb2RlcworICAgIGlmIChtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfZm9jdXNfbW9kZXNfY250ID4gMCkgeworICAgICAgICBTdHJpbmc4IGZvY3VzTW9kZVZhbHVlcyA9IGNyZWF0ZVZhbHVlc1N0cmluZygKKyAgICAgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfZm9jdXNfbW9kZXMsCisgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2ZvY3VzX21vZGVzX2NudCwKKyAgICAgICAgICAgICAgICBGT0NVU19NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoRk9DVVNfTU9ERVNfTUFQKSk7CisgICAgICAgIHNldChLRVlfU1VQUE9SVEVEX0ZPQ1VTX01PREVTLCBmb2N1c01vZGVWYWx1ZXMpOworCisgICAgICAgIC8vIFNldCBkZWZhdWx0IGZvY3VzIG1vZGUgYW5kIHVwZGF0ZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciBidWYKKyAgICAgICAgY29uc3QgY2hhciAqZm9jdXNNb2RlID0gbG9va3VwTmFtZUJ5VmFsdWUoRk9DVVNfTU9ERVNfTUFQLAorICAgICAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKEZPQ1VTX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2ZvY3VzX21vZGVzWzBdKTsKKyAgICAgICAgaWYgKGZvY3VzTW9kZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzZXRGb2N1c01vZGUoZm9jdXNNb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEZvY3VzTW9kZShGT0NVU19NT0RFX0ZJWEVEKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coInN1cHBvcnRlZCBmb2N1cyBtb2RlcyBjbnQgaXMgMCEhISIpOworICAgIH0KKworICAgIC8vIFNldCBmb2N1cyBhcmVhcworICAgIGlmIChtX3BDYXBhYmlsaXR5LT5tYXhfbnVtX2ZvY3VzX2FyZWFzID4gTUFYX1JPSSkgeworICAgICAgICBtX3BDYXBhYmlsaXR5LT5tYXhfbnVtX2ZvY3VzX2FyZWFzID0gTUFYX1JPSTsKKyAgICB9CisgICAgc2V0KEtFWV9NQVhfTlVNX0ZPQ1VTX0FSRUFTLCBtX3BDYXBhYmlsaXR5LT5tYXhfbnVtX2ZvY3VzX2FyZWFzKTsKKyAgICBpZiAobV9wQ2FwYWJpbGl0eS0+bWF4X251bV9mb2N1c19hcmVhcyA+IDApIHsKKyAgICAgICAgc2V0Rm9jdXNBcmVhcyhERUZBVUxUX0NBTUVSQV9BUkVBKTsKKyAgICB9CisKKyAgICAvLyBTZXQgbWV0ZXJpbmcgYXJlYXMKKyAgICBpZiAobV9wQ2FwYWJpbGl0eS0+bWF4X251bV9tZXRlcmluZ19hcmVhcyA+IE1BWF9ST0kpIHsKKyAgICAgICAgbV9wQ2FwYWJpbGl0eS0+bWF4X251bV9tZXRlcmluZ19hcmVhcyA9IE1BWF9ST0k7CisgICAgfQorICAgIHNldChLRVlfTUFYX05VTV9NRVRFUklOR19BUkVBUywgbV9wQ2FwYWJpbGl0eS0+bWF4X251bV9tZXRlcmluZ19hcmVhcyk7CisgICAgaWYgKG1fcENhcGFiaWxpdHktPm1heF9udW1fbWV0ZXJpbmdfYXJlYXMgPiAwKSB7CisgICAgICAgIHNldE1ldGVyaW5nQXJlYXMoREVGQVVMVF9DQU1FUkFfQVJFQSk7CisgICAgfQorCisgICAgLy8gc2V0IGZvY3VzIHBvc2l0aW9uLCB3ZSBzaG91bGQgZ2V0IHRoZW0gZnJvbSBtX3BDYXBhYmlsaXR5CisgICAgbV9wQ2FwYWJpbGl0eS0+bWluX2ZvY3VzX3Bvc1tDQU1fTUFOVUFMX0ZPQ1VTX01PREVfSU5ERVhdID0gMDsKKyAgICBtX3BDYXBhYmlsaXR5LT5tYXhfZm9jdXNfcG9zW0NBTV9NQU5VQUxfRk9DVVNfTU9ERV9JTkRFWF0gPSAxMDIzOworICAgIHNldChLRVlfUUNfTUlOX0ZPQ1VTX1BPU19JTkRFWCwKKyAgICAgICAgICAgIChpbnQpIG1fcENhcGFiaWxpdHktPm1pbl9mb2N1c19wb3NbQ0FNX01BTlVBTF9GT0NVU19NT0RFX0lOREVYXSk7CisgICAgc2V0KEtFWV9RQ19NQVhfRk9DVVNfUE9TX0lOREVYLAorICAgICAgICAgICAgKGludCkgbV9wQ2FwYWJpbGl0eS0+bWF4X2ZvY3VzX3Bvc1tDQU1fTUFOVUFMX0ZPQ1VTX01PREVfSU5ERVhdKTsKKworICAgIG1fcENhcGFiaWxpdHktPm1pbl9mb2N1c19wb3NbQ0FNX01BTlVBTF9GT0NVU19NT0RFX0RBQ19DT0RFXSA9IDA7CisgICAgbV9wQ2FwYWJpbGl0eS0+bWF4X2ZvY3VzX3Bvc1tDQU1fTUFOVUFMX0ZPQ1VTX01PREVfREFDX0NPREVdID0gMTAyMzsKKyAgICBzZXQoS0VZX1FDX01JTl9GT0NVU19QT1NfREFDLAorICAgICAgICAgICAgKGludCkgbV9wQ2FwYWJpbGl0eS0+bWluX2ZvY3VzX3Bvc1tDQU1fTUFOVUFMX0ZPQ1VTX01PREVfREFDX0NPREVdKTsKKyAgICBzZXQoS0VZX1FDX01BWF9GT0NVU19QT1NfREFDLAorICAgICAgICAgICAgKGludCkgbV9wQ2FwYWJpbGl0eS0+bWF4X2ZvY3VzX3Bvc1tDQU1fTUFOVUFMX0ZPQ1VTX01PREVfREFDX0NPREVdKTsKKworICAgIG1fcENhcGFiaWxpdHktPm1pbl9mb2N1c19wb3NbQ0FNX01BTlVBTF9GT0NVU19NT0RFX1JBVElPXSA9IDA7CisgICAgbV9wQ2FwYWJpbGl0eS0+bWF4X2ZvY3VzX3Bvc1tDQU1fTUFOVUFMX0ZPQ1VTX01PREVfUkFUSU9dID0gMTAwOworICAgIHNldChLRVlfUUNfTUlOX0ZPQ1VTX1BPU19SQVRJTywKKyAgICAgICAgICAgIChpbnQpIG1fcENhcGFiaWxpdHktPm1pbl9mb2N1c19wb3NbQ0FNX01BTlVBTF9GT0NVU19NT0RFX1JBVElPXSk7CisgICAgc2V0KEtFWV9RQ19NQVhfRk9DVVNfUE9TX1JBVElPLAorICAgICAgICAgICAgKGludCkgbV9wQ2FwYWJpbGl0eS0+bWF4X2ZvY3VzX3Bvc1tDQU1fTUFOVUFMX0ZPQ1VTX01PREVfUkFUSU9dKTsKKworICAgIG1fcENhcGFiaWxpdHktPm1pbl9mb2N1c19wb3NbQ0FNX01BTlVBTF9GT0NVU19NT0RFX0RJT1BURVJdID0gMDsKKyAgICBpZiAobV9wQ2FwYWJpbGl0eS0+bWluX2ZvY3VzX2Rpc3RhbmNlID4gMCkgeworICAgICAgICBtX3BDYXBhYmlsaXR5LT5tYXhfZm9jdXNfcG9zW0NBTV9NQU5VQUxfRk9DVVNfTU9ERV9ESU9QVEVSXSA9CisgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+bWluX2ZvY3VzX2Rpc3RhbmNlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fcENhcGFiaWxpdHktPm1heF9mb2N1c19wb3NbQ0FNX01BTlVBTF9GT0NVU19NT0RFX0RJT1BURVJdID0gMDsKKyAgICB9CisgICAgc2V0RmxvYXQoS0VZX1FDX01JTl9GT0NVU19QT1NfRElPUFRFUiwKKyAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPm1pbl9mb2N1c19wb3NbQ0FNX01BTlVBTF9GT0NVU19NT0RFX0RJT1BURVJdKTsKKyAgICBzZXRGbG9hdChLRVlfUUNfTUFYX0ZPQ1VTX1BPU19ESU9QVEVSLAorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+bWF4X2ZvY3VzX3Bvc1tDQU1fTUFOVUFMX0ZPQ1VTX01PREVfRElPUFRFUl0pOworCisgICAgLy9zZXQgc3VwcG9ydGVkIG1hbnVhbCBmb2N1cyBtb2RlcworICAgIFN0cmluZzggbWFudWFsRm9jdXNNb2RlcyhWQUxVRV9PRkYpOworICAgIGlmIChtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfZm9jdXNfbW9kZXNfY250ID4gMSAmJgorICAgICAgICBtX3BDYXBhYmlsaXR5LT5taW5fZm9jdXNfZGlzdGFuY2UgPiAwKSB7CisgICAgICAgIG1hbnVhbEZvY3VzTW9kZXMuYXBwZW5kKCIsIik7CisgICAgICAgIG1hbnVhbEZvY3VzTW9kZXMuYXBwZW5kKEtFWV9RQ19GT0NVU19TQ0FMRV9NT0RFKTsKKyAgICAgICAgbWFudWFsRm9jdXNNb2Rlcy5hcHBlbmQoIiwiKTsKKyAgICAgICAgbWFudWFsRm9jdXNNb2Rlcy5hcHBlbmQoS0VZX1FDX0ZPQ1VTX0RJT1BURVJfTU9ERSk7CisgICAgfQorICAgIHNldChLRVlfUUNfU1VQUE9SVEVEX01BTlVBTF9GT0NVU19NT0RFUywgbWFudWFsRm9jdXNNb2Rlcy5zdHJpbmcoKSk7CisKKyAgICAvLyBTZXQgU2F0dXJhdGlvbgorICAgIHNldChLRVlfUUNfTUlOX1NBVFVSQVRJT04sIG1fcENhcGFiaWxpdHktPnNhdHVyYXRpb25fY3RybC5taW5fdmFsdWUpOworICAgIHNldChLRVlfUUNfTUFYX1NBVFVSQVRJT04sIG1fcENhcGFiaWxpdHktPnNhdHVyYXRpb25fY3RybC5tYXhfdmFsdWUpOworICAgIHNldChLRVlfUUNfU0FUVVJBVElPTl9TVEVQLCBtX3BDYXBhYmlsaXR5LT5zYXR1cmF0aW9uX2N0cmwuc3RlcCk7CisgICAgc2V0U2F0dXJhdGlvbihtX3BDYXBhYmlsaXR5LT5zYXR1cmF0aW9uX2N0cmwuZGVmX3ZhbHVlKTsKKworICAgIC8vIFNldCBTaGFycG5lc3MKKyAgICBzZXQoS0VZX1FDX01JTl9TSEFSUE5FU1MsIG1fcENhcGFiaWxpdHktPnNoYXJwbmVzc19jdHJsLm1pbl92YWx1ZSk7CisgICAgc2V0KEtFWV9RQ19NQVhfU0hBUlBORVNTLCBtX3BDYXBhYmlsaXR5LT5zaGFycG5lc3NfY3RybC5tYXhfdmFsdWUpOworICAgIHNldChLRVlfUUNfU0hBUlBORVNTX1NURVAsIG1fcENhcGFiaWxpdHktPnNoYXJwbmVzc19jdHJsLnN0ZXApOworICAgIHNldFNoYXJwbmVzcyhtX3BDYXBhYmlsaXR5LT5zaGFycG5lc3NfY3RybC5kZWZfdmFsdWUpOworCisgICAgLy8gU2V0IENvbnRyYXN0CisgICAgc2V0KEtFWV9RQ19NSU5fQ09OVFJBU1QsIG1fcENhcGFiaWxpdHktPmNvbnRyYXN0X2N0cmwubWluX3ZhbHVlKTsKKyAgICBzZXQoS0VZX1FDX01BWF9DT05UUkFTVCwgbV9wQ2FwYWJpbGl0eS0+Y29udHJhc3RfY3RybC5tYXhfdmFsdWUpOworICAgIHNldChLRVlfUUNfQ09OVFJBU1RfU1RFUCwgbV9wQ2FwYWJpbGl0eS0+Y29udHJhc3RfY3RybC5zdGVwKTsKKyAgICBzZXRDb250cmFzdChtX3BDYXBhYmlsaXR5LT5jb250cmFzdF9jdHJsLmRlZl92YWx1ZSk7CisKKyAgICAvLyBTZXQgU0NFIGZhY3RvcgorICAgIHNldChLRVlfUUNfTUlOX1NDRV9GQUNUT1IsIG1fcENhcGFiaWxpdHktPnNjZV9jdHJsLm1pbl92YWx1ZSk7IC8vIC0xMDAKKyAgICBzZXQoS0VZX1FDX01BWF9TQ0VfRkFDVE9SLCBtX3BDYXBhYmlsaXR5LT5zY2VfY3RybC5tYXhfdmFsdWUpOyAvLyAxMDAKKyAgICBzZXQoS0VZX1FDX1NDRV9GQUNUT1JfU1RFUCwgbV9wQ2FwYWJpbGl0eS0+c2NlX2N0cmwuc3RlcCk7ICAgICAvLyAxMAorICAgIHNldFNraW5Ub25lRW5oYW5jZW1lbnQobV9wQ2FwYWJpbGl0eS0+c2NlX2N0cmwuZGVmX3ZhbHVlKTsgICAgIC8vIDAKKworICAgIC8vIFNldCBCcmlnaHRuZXNzCisgICAgc2V0KEtFWV9RQ19NSU5fQlJJR0hUTkVTUywgbV9wQ2FwYWJpbGl0eS0+YnJpZ2h0bmVzc19jdHJsLm1pbl92YWx1ZSk7IC8vIDAKKyAgICBzZXQoS0VZX1FDX01BWF9CUklHSFRORVNTLCBtX3BDYXBhYmlsaXR5LT5icmlnaHRuZXNzX2N0cmwubWF4X3ZhbHVlKTsgLy8gNgorICAgIHNldChLRVlfUUNfQlJJR0hUTkVTU19TVEVQLCBtX3BDYXBhYmlsaXR5LT5icmlnaHRuZXNzX2N0cmwuc3RlcCk7ICAgICAvLyAxCisgICAgc2V0QnJpZ2h0bmVzcyhtX3BDYXBhYmlsaXR5LT5icmlnaHRuZXNzX2N0cmwuZGVmX3ZhbHVlKTsKKworICAgIC8vIFNldCBBdXRvIGV4cG9zdXJlCisgICAgU3RyaW5nOCBhdXRvRXhwb3N1cmVWYWx1ZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmcoCisgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfYWVjX21vZGVzLAorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2FlY19tb2Rlc19jbnQsCisgICAgICAgICAgICBBVVRPX0VYUE9TVVJFX01BUCwKKyAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKEFVVE9fRVhQT1NVUkVfTUFQKSk7CisgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfQVVUT19FWFBPU1VSRSwgYXV0b0V4cG9zdXJlVmFsdWVzLnN0cmluZygpKTsKKyAgICBzZXRBdXRvRXhwb3N1cmUoQVVUT19FWFBPU1VSRV9GUkFNRV9BVkcpOworCisgICAgLy8gU2V0IEV4cG9zdXJlIENvbXBlbnNhdGlvbgorICAgIHNldChLRVlfTUFYX0VYUE9TVVJFX0NPTVBFTlNBVElPTiwgbV9wQ2FwYWJpbGl0eS0+ZXhwb3N1cmVfY29tcGVuc2F0aW9uX21heCk7IC8vIDEyCisgICAgc2V0KEtFWV9NSU5fRVhQT1NVUkVfQ09NUEVOU0FUSU9OLCBtX3BDYXBhYmlsaXR5LT5leHBvc3VyZV9jb21wZW5zYXRpb25fbWluKTsgLy8gLTEyCisgICAgc2V0RmxvYXQoS0VZX0VYUE9TVVJFX0NPTVBFTlNBVElPTl9TVEVQLCBtX3BDYXBhYmlsaXR5LT5leHBvc3VyZV9jb21wZW5zYXRpb25fc3RlcCk7IC8vIDEvNgorICAgIHNldEV4cG9zdXJlQ29tcGVuc2F0aW9uKG1fcENhcGFiaWxpdHktPmV4cG9zdXJlX2NvbXBlbnNhdGlvbl9kZWZhdWx0KTsgLy8gMAorCisgICAgLy8gU2V0IEluc3RhbnQgQUVDIG1vZGVzCisgICAgU3RyaW5nOCBpbnN0YW50QUVDTW9kZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmcoCisgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfaW5zdGFudF9hZWNfbW9kZXMsCisgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfaW5zdGFudF9hZWNfbW9kZXNfY250LAorICAgICAgICAgICAgSU5TVEFOVF9BRUNfTU9ERVNfTUFQLAorICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoSU5TVEFOVF9BRUNfTU9ERVNfTUFQKSk7CisgICAgc2V0KEtFWV9RQ19JTlNUQU5UX0FFQ19TVVBQT1JURURfTU9ERVMsIGluc3RhbnRBRUNNb2Rlcy5zdHJpbmcoKSk7CisKKyAgICAvLyBTZXQgSW5zdGFudCBDYXB0dXJlIG1vZGVzCisgICAgU3RyaW5nOCBpbnN0YW50Q2FwdHVyZU1vZGVzID0gY3JlYXRlVmFsdWVzU3RyaW5nKAorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2luc3RhbnRfYWVjX21vZGVzLAorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2luc3RhbnRfYWVjX21vZGVzX2NudCwKKyAgICAgICAgICAgIElOU1RBTlRfQ0FQVFVSRV9NT0RFU19NQVAsCisgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShJTlNUQU5UX0NBUFRVUkVfTU9ERVNfTUFQKSk7CisgICAgc2V0KEtFWV9RQ19JTlNUQU5UX0NBUFRVUkVfU1VQUE9SVEVEX01PREVTLCBpbnN0YW50Q2FwdHVyZU1vZGVzLnN0cmluZygpKTsKKworCisgICAgLy8gU2V0IEFudGliYW5kaW5nCisgICAgU3RyaW5nOCBhbnRpYmFuZGluZ1ZhbHVlcyA9IGNyZWF0ZVZhbHVlc1N0cmluZygKKyAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnN1cHBvcnRlZF9hbnRpYmFuZGluZ3MsCisgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfYW50aWJhbmRpbmdzX2NudCwKKyAgICAgICAgICAgIEFOVElCQU5ESU5HX01PREVTX01BUCwKKyAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKEFOVElCQU5ESU5HX01PREVTX01BUCkpOworICAgIHNldChLRVlfU1VQUE9SVEVEX0FOVElCQU5ESU5HLCBhbnRpYmFuZGluZ1ZhbHVlcyk7CisgICAgc2V0QW50aWJhbmRpbmcoQU5USUJBTkRJTkdfT0ZGKTsKKworICAgIC8vIFNldCBFZmZlY3QKKyAgICBTdHJpbmc4IGVmZmVjdFZhbHVlcyA9IGNyZWF0ZVZhbHVlc1N0cmluZygKKyAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnN1cHBvcnRlZF9lZmZlY3RzLAorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2VmZmVjdHNfY250LAorICAgICAgICAgICAgRUZGRUNUX01PREVTX01BUCwKKyAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKEVGRkVDVF9NT0RFU19NQVApKTsKKworICAgIGlmIChtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfZWZmZWN0c19jbnQgPiAwKSB7CisgICAgICAgIHNldChLRVlfU1VQUE9SVEVEX0VGRkVDVFMsIGVmZmVjdFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVygiQ29sb3IgZWZmZWN0cyBhcmUgbm90IGF2YWlsYWJsZSIpOworICAgICAgICBzZXQoS0VZX1NVUFBPUlRFRF9FRkZFQ1RTLCBFRkZFQ1RfTk9ORSk7CisgICAgfQorICAgIHNldEVmZmVjdChFRkZFQ1RfTk9ORSk7CisKKyAgICAvLyBTZXQgV2hpdGVCYWxhbmNlCisgICAgU3RyaW5nOCB3aGl0ZWJhbGFuY2VWYWx1ZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmcoCisgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfd2hpdGVfYmFsYW5jZXMsCisgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfd2hpdGVfYmFsYW5jZXNfY250LAorICAgICAgICAgICAgV0hJVEVfQkFMQU5DRV9NT0RFU19NQVAsCisgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShXSElURV9CQUxBTkNFX01PREVTX01BUCkpOworICAgIHNldChLRVlfU1VQUE9SVEVEX1dISVRFX0JBTEFOQ0UsIHdoaXRlYmFsYW5jZVZhbHVlcyk7CisgICAgc2V0V2hpdGVCYWxhbmNlKFdISVRFX0JBTEFOQ0VfQVVUTyk7CisKKyAgICAvLyBzZXQgc3VwcG9ydGVkIHdiIGNjdCwgd2Ugc2hvdWxkIGdldCB0aGVtIGZyb20gbV9wQ2FwYWJpbGl0eQorICAgIG1fcENhcGFiaWxpdHktPm1pbl93Yl9jY3QgPSAyMDAwOworICAgIG1fcENhcGFiaWxpdHktPm1heF93Yl9jY3QgPSA4MDAwOworICAgIHNldChLRVlfUUNfTUlOX1dCX0NDVCwgbV9wQ2FwYWJpbGl0eS0+bWluX3diX2NjdCk7CisgICAgc2V0KEtFWV9RQ19NQVhfV0JfQ0NULCBtX3BDYXBhYmlsaXR5LT5tYXhfd2JfY2N0KTsKKworICAgIC8vIHNldCBzdXBwb3J0ZWQgd2IgcmdiIGdhaW5zLCBpZGVhbGx5IHdlIHNob3VsZCBnZXQgdGhlbSBmcm9tIG1fcENhcGFiaWxpdHkKKyAgICAvL2J1dCBmb3Igbm93IGhhcmRjb2RlLgorICAgIG1fcENhcGFiaWxpdHktPm1pbl93Yl9nYWluID0gMS4wOworICAgIG1fcENhcGFiaWxpdHktPm1heF93Yl9nYWluID0gNC4wOworICAgIHNldEZsb2F0KEtFWV9RQ19NSU5fV0JfR0FJTiwgbV9wQ2FwYWJpbGl0eS0+bWluX3diX2dhaW4pOworICAgIHNldEZsb2F0KEtFWV9RQ19NQVhfV0JfR0FJTiwgbV9wQ2FwYWJpbGl0eS0+bWF4X3diX2dhaW4pOworCisgICAgLy9zZXQgc3VwcG9ydGVkIG1hbnVhbCB3YiBtb2RlcworICAgIFN0cmluZzggbWFudWFsV0JNb2RlcyhWQUxVRV9PRkYpOworICAgIGlmKG1fcENhcGFiaWxpdHktPnNlbnNvcl90eXBlLnNlbnNfdHlwZSAhPSBDQU1fU0VOU09SX1lVVikgeworICAgICAgICBtYW51YWxXQk1vZGVzLmFwcGVuZCgiLCIpOworICAgICAgICBtYW51YWxXQk1vZGVzLmFwcGVuZChLRVlfUUNfV0JfQ0NUX01PREUpOworICAgICAgICBtYW51YWxXQk1vZGVzLmFwcGVuZCgiLCIpOworICAgICAgICBtYW51YWxXQk1vZGVzLmFwcGVuZChLRVlfUUNfV0JfR0FJTl9NT0RFKTsKKyAgICB9CisgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfTUFOVUFMX1dCX01PREVTLCBtYW51YWxXQk1vZGVzLnN0cmluZygpKTsKKworICAgIC8vIFNldCBGbGFzaCBtb2RlCisgICAgaWYobV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2ZsYXNoX21vZGVzX2NudCA+IDApIHsKKyAgICAgICBTdHJpbmc4IGZsYXNoVmFsdWVzID0gY3JlYXRlVmFsdWVzU3RyaW5nKAorICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2ZsYXNoX21vZGVzLAorICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2ZsYXNoX21vZGVzX2NudCwKKyAgICAgICAgICAgICAgIEZMQVNIX01PREVTX01BUCwKKyAgICAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKEZMQVNIX01PREVTX01BUCkpOworICAgICAgIHNldChLRVlfU1VQUE9SVEVEX0ZMQVNIX01PREVTLCBmbGFzaFZhbHVlcyk7CisgICAgICAgc2V0Rmxhc2goRkxBU0hfTU9ERV9PRkYpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coInN1cHBvcnRlZCBmbGFzaCBtb2RlcyBjbnQgaXMgMCEhISIpOworICAgIH0KKworICAgIC8vIFNldCBTY2VuZSBNb2RlCisgICAgU3RyaW5nOCBzY2VuZU1vZGVWYWx1ZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmcoCisgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfc2NlbmVfbW9kZXMsCisgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfc2NlbmVfbW9kZXNfY250LAorICAgICAgICAgICAgU0NFTkVfTU9ERVNfTUFQLAorICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoU0NFTkVfTU9ERVNfTUFQKSk7CisgICAgc2V0KEtFWV9TVVBQT1JURURfU0NFTkVfTU9ERVMsIHNjZW5lTW9kZVZhbHVlcyk7CisgICAgc2V0U2NlbmVNb2RlKFNDRU5FX01PREVfQVVUTyk7CisKKyAgICAvLyBTZXQgQ0RTIE1vZGUKKyAgICBTdHJpbmc4IGNkc01vZGVWYWx1ZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmdGcm9tTWFwKAorICAgICAgICAgICAgQ0RTX01PREVTX01BUCwKKyAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKENEU19NT0RFU19NQVApKTsKKyAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9DRFNfTU9ERVMsIGNkc01vZGVWYWx1ZXMpOworCisgICAgLy8gU2V0IHZpZGVvIENEUyBNb2RlCisgICAgU3RyaW5nOCB2aWRlb0Nkc01vZGVWYWx1ZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmdGcm9tTWFwKAorICAgICAgICAgICAgQ0RTX01PREVTX01BUCwKKyAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKENEU19NT0RFU19NQVApKTsKKyAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9WSURFT19DRFNfTU9ERVMsIHZpZGVvQ2RzTW9kZVZhbHVlcyk7CisKKyAgICAvLyBTZXQgVE5SIE1vZGUKKyAgICBTdHJpbmc4IHRuck1vZGVWYWx1ZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmdGcm9tTWFwKAorICAgICAgICAgICAgT05fT0ZGX01PREVTX01BUCwKKyAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKE9OX09GRl9NT0RFU19NQVApKTsKKyAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9UTlJfTU9ERVMsIHRuck1vZGVWYWx1ZXMpOworCisgICAgLy8gU2V0IHZpZGVvIFROUiBNb2RlCisgICAgU3RyaW5nOCB2aWRlb1Ruck1vZGVWYWx1ZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmdGcm9tTWFwKAorICAgICAgICAgICAgT05fT0ZGX01PREVTX01BUCwKKyAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKE9OX09GRl9NT0RFU19NQVApKTsKKyAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9WSURFT19UTlJfTU9ERVMsIHZpZGVvVG5yTW9kZVZhbHVlcyk7CisKKyAgICAvLyBTZXQgSVNPIE1vZGUKKyAgICBTdHJpbmc4IGlzb1ZhbHVlcyA9IGNyZWF0ZVZhbHVlc1N0cmluZygKKyAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnN1cHBvcnRlZF9pc29fbW9kZXMsCisgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfaXNvX21vZGVzX2NudCwKKyAgICAgICAgICAgIElTT19NT0RFU19NQVAsCisgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShJU09fTU9ERVNfTUFQKSk7CisgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfSVNPX01PREVTLCBpc29WYWx1ZXMpOworICAgIHNldElTT1ZhbHVlKElTT19BVVRPKTsKKworICAgIC8vIFNldCBleHBvc3VyZSB0aW1lCisgICAgU3RyaW5nOCBtYW51YWxFeHBNb2RlcyhWQUxVRV9PRkYpOworICAgIGJvb2wgZXhwVGltZVN1cHBvcnRlZCA9IGZhbHNlOworICAgIGJvb2wgbWFudWFsSVNPU3VwcG9ydGVkID0gZmFsc2U7CisgICAgLy9jYXBhYmlsaXR5IHZhbHVlcyBhcmUgaW4gbmFubyBzZWMsIGNvbnZlcnQgdG8gbWlsbGkgc2VjIGZvciB1cHBlciBsYXllcnMKKyAgICBjaGFyIGV4cFRpbWVTdHJbMjBdOworICAgIGRvdWJsZSBtaW5fZXhwX3RpbWUgPSAoZG91YmxlKSBtX3BDYXBhYmlsaXR5LT5leHBvc3VyZV90aW1lX3JhbmdlWzBdIC8gMTAwMDAwMC4wOworICAgIGRvdWJsZSBtYXhfZXhwX3RpbWUgPSAoZG91YmxlKSBtX3BDYXBhYmlsaXR5LT5leHBvc3VyZV90aW1lX3JhbmdlWzFdIC8gMTAwMDAwMC4wOworICAgIHNucHJpbnRmKGV4cFRpbWVTdHIsIHNpemVvZihleHBUaW1lU3RyKSwgIiVmIiwgbWluX2V4cF90aW1lKTsKKyAgICBzZXQoS0VZX1FDX01JTl9FWFBPU1VSRV9USU1FLCBleHBUaW1lU3RyKTsKKyAgICBzbnByaW50ZihleHBUaW1lU3RyLCBzaXplb2YoZXhwVGltZVN0ciksICIlZiIsIG1heF9leHBfdGltZSk7CisgICAgc2V0KEtFWV9RQ19NQVhfRVhQT1NVUkVfVElNRSwgZXhwVGltZVN0cik7CisgICAgaWYgKChtaW5fZXhwX3RpbWUgPiAwKSAmJiAobWF4X2V4cF90aW1lID4gbWluX2V4cF90aW1lKSkgeworICAgICAgICBtYW51YWxFeHBNb2Rlcy5hcHBlbmQoIiwiKTsKKyAgICAgICAgbWFudWFsRXhwTW9kZXMuYXBwZW5kKEtFWV9RQ19FWFBfVElNRV9QUklPUklUWSk7CisgICAgICAgIGV4cFRpbWVTdXBwb3J0ZWQgPSB0cnVlOworICAgIH0KKyAgICBMT0dIKCIsIEV4cG9zdXJlIHRpbWUgbWluICVmIG1zLCBtYXggJWYgbXMiLAorICAgICAgICAgICAgbWluX2V4cF90aW1lLCBtYXhfZXhwX3RpbWUpOworCisgICAgLy8gU2V0IGlzbworICAgIHNldChLRVlfUUNfTUlOX0lTTywgbV9wQ2FwYWJpbGl0eS0+c2Vuc2l0aXZpdHlfcmFuZ2UubWluX3NlbnNpdGl2aXR5KTsKKyAgICBzZXQoS0VZX1FDX01BWF9JU08sIG1fcENhcGFiaWxpdHktPnNlbnNpdGl2aXR5X3JhbmdlLm1heF9zZW5zaXRpdml0eSk7CisgICAgTE9HSCgiLCBJU08gbWluICVkLCBtYXggJWQiLAorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c2Vuc2l0aXZpdHlfcmFuZ2UubWluX3NlbnNpdGl2aXR5LAorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c2Vuc2l0aXZpdHlfcmFuZ2UubWF4X3NlbnNpdGl2aXR5KTsKKyAgICBpZiAoKG1fcENhcGFiaWxpdHktPnNlbnNpdGl2aXR5X3JhbmdlLm1pbl9zZW5zaXRpdml0eSA+IDApICYmCisgICAgICAgICAgICAobV9wQ2FwYWJpbGl0eS0+c2Vuc2l0aXZpdHlfcmFuZ2UubWF4X3NlbnNpdGl2aXR5ID4KKyAgICAgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c2Vuc2l0aXZpdHlfcmFuZ2UubWluX3NlbnNpdGl2aXR5KSkgeworICAgICAgICBtYW51YWxFeHBNb2Rlcy5hcHBlbmQoIiwiKTsKKyAgICAgICAgbWFudWFsRXhwTW9kZXMuYXBwZW5kKEtFWV9RQ19JU09fUFJJT1JJVFkpOworICAgICAgICBtYW51YWxJU09TdXBwb3J0ZWQgPSB0cnVlOworICAgIH0KKyAgICBpZiAoZXhwVGltZVN1cHBvcnRlZCAmJiBtYW51YWxJU09TdXBwb3J0ZWQpIHsKKyAgICAgICAgbWFudWFsRXhwTW9kZXMuYXBwZW5kKCIsIik7CisgICAgICAgIG1hbnVhbEV4cE1vZGVzLmFwcGVuZChLRVlfUUNfVVNFUl9TRVRUSU5HKTsKKyAgICB9CisgICAgLy9maW5hbGx5IHNldCBzdXBwb3J0ZWQgbWFudWFsIGV4cG9zdXJlIG1vZGVzCisgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfTUFOVUFMX0VYUE9TVVJFX01PREVTLCBtYW51YWxFeHBNb2Rlcy5zdHJpbmcoKSk7CisKKyAgICAvLyBTZXQgSEZSCisgICAgU3RyaW5nOCBoZnJWYWx1ZXMgPSBjcmVhdGVIZnJWYWx1ZXNTdHJpbmcoCisgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5oZnJfdGJsLAorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+aGZyX3RibF9jbnQsCisgICAgICAgICAgICBIRlJfTU9ERVNfTUFQLAorICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoSEZSX01PREVTX01BUCkpOworICAgIHNldChLRVlfUUNfU1VQUE9SVEVEX1ZJREVPX0hJR0hfRlJBTUVfUkFURV9NT0RFUywgaGZyVmFsdWVzLnN0cmluZygpKTsKKyAgICBzZXQoS0VZX1FDX1ZJREVPX0hJR0hfU1BFRURfUkVDT1JESU5HLCAib2ZmIik7CisgICAgc2V0KEtFWV9RQ19WSURFT19ISUdIX0ZSQU1FX1JBVEUsICJvZmYiKTsKKyAgICBTdHJpbmc4IGhmclNpemVWYWx1ZXMgPSBjcmVhdGVIZnJTaXplc1N0cmluZygKKyAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPmhmcl90YmwsCisgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5oZnJfdGJsX2NudCk7CisgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfSEZSX1NJWkVTLCBoZnJTaXplVmFsdWVzLnN0cmluZygpKTsKKyAgICBMT0dEKCJIRlIgdmFsdWVzID0gJXMgSEZSIFNpemVzID0gJXMiLCBoZnJWYWx1ZXMuc3RyaW5nKCksIGhmclNpemVWYWx1ZXMuc3RyaW5nKCkpOworICAgIHNldEhpZ2hGcmFtZVJhdGUoQ0FNX0hGUl9NT0RFX09GRik7CisKKyAgICAvLyBTZXQgRm9jdXMgYWxnb3JpdGhtcworICAgIFN0cmluZzggZm9jdXNBbGdvVmFsdWVzID0gY3JlYXRlVmFsdWVzU3RyaW5nKAorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2ZvY3VzX2FsZ29zLAorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2ZvY3VzX2FsZ29zX2NudCwKKyAgICAgICAgICAgIEZPQ1VTX0FMR09fTUFQLAorICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoRk9DVVNfQUxHT19NQVApKTsKKyAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9GT0NVU19BTEdPUywgZm9jdXNBbGdvVmFsdWVzKTsKKyAgICBzZXRTZWxlY3RhYmxlWm9uZUFmKEZPQ1VTX0FMR09fQVVUTyk7CisKKyAgICAvLyBTZXQgWm9vbSBSYXRpb3MKKyAgICBpZiAobV9wQ2FwYWJpbGl0eS0+em9vbV9zdXBwb3J0ZWQgPiAwKSB7CisgICAgICAgIFN0cmluZzggem9vbVJhdGlvVmFsdWVzID0gY3JlYXRlWm9vbVJhdGlvVmFsdWVzU3RyaW5nKAorICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnpvb21fcmF0aW9fdGJsLAorICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnpvb21fcmF0aW9fdGJsX2NudCk7CisgICAgICAgIHNldChLRVlfWk9PTV9SQVRJT1MsIHpvb21SYXRpb1ZhbHVlcyk7CisgICAgICAgIHNldChLRVlfTUFYX1pPT00sIChpbnQpKG1fcENhcGFiaWxpdHktPnpvb21fcmF0aW9fdGJsX2NudCAtIDEpKTsKKyAgICAgICAgc2V0Wm9vbSgwKTsKKyAgICB9CisKKyAgICAvLyBTZXQgQnJhY2tldGluZy9IRFIKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBtZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FwdHVyZS5idXJzdC5leHBvc3VyZXMiLCBwcm9wLCAiIik7CisgICAgaWYgKHN0cmxlbihwcm9wKSA+IDApIHsKKyAgICAgICAgc2V0KEtFWV9RQ19DQVBUVVJFX0JVUlNUX0VYUE9TVVJFLCBwcm9wKTsKKyAgICB9CisgICAgU3RyaW5nOCBicmFja2V0aW5nVmFsdWVzID0gY3JlYXRlVmFsdWVzU3RyaW5nRnJvbU1hcCgKKyAgICAgICAgICAgIEJSQUNLRVRJTkdfTU9ERVNfTUFQLAorICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoQlJBQ0tFVElOR19NT0RFU19NQVApKTsKKyAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9BRV9CUkFDS0VUX01PREVTLCBicmFja2V0aW5nVmFsdWVzKTsKKyAgICBzZXRBRUJyYWNrZXQoQUVfQlJBQ0tFVF9PRkYpOworCisgICAgLy9TZXQgQUYgQnJhY2tldGluZy4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fcENhcGFiaWxpdHktPnN1cHBvcnRlZF9mb2N1c19tb2Rlc19jbnQ7IGkrKykgeworICAgICAgICBpZiAoKENBTV9GT0NVU19NT0RFX0FVVE8gPT0gbV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2ZvY3VzX21vZGVzW2ldKSAmJgorICAgICAgICAgICAgICAgICgobV9wQ2FwYWJpbGl0eS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfVUJJRk9DVVMpID4gMCkpIHsKKyAgICAgICAgICAgIFN0cmluZzggYWZCcmFja2V0aW5nVmFsdWVzID0gY3JlYXRlVmFsdWVzU3RyaW5nRnJvbU1hcCgKKyAgICAgICAgICAgICAgICAgICAgQUZfQlJBQ0tFVElOR19NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKEFGX0JSQUNLRVRJTkdfTU9ERVNfTUFQKSk7CisgICAgICAgICAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9BRl9CUkFDS0VUX01PREVTLCBhZkJyYWNrZXRpbmdWYWx1ZXMpOworICAgICAgICAgICAgc2V0QUZCcmFja2V0KEFGX0JSQUNLRVRfT0ZGKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgfQorICAgIH0KKworICAgIC8vU2V0IFJlZm9jdXMuCisgICAgLy9SZS11c2UgdWJpZm9jdXMgZmxhZyBmb3Igbm93LgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2ZvY3VzX21vZGVzX2NudDsgaSsrKSB7CisgICAgICAgIGlmICgoQ0FNX0ZPQ1VTX01PREVfQVVUTyA9PSBtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfZm9jdXNfbW9kZXNbaV0pICYmCisgICAgICAgICAgICAgICAgKG1fcENhcGFiaWxpdHktPnFjb21fc3VwcG9ydGVkX2ZlYXR1cmVfbWFzayAmCisgICAgICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfUkVGT0NVUykgPiAwKSB7CisgICAgICAgICAgICBTdHJpbmc4IHJlRm9jdXNWYWx1ZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmdGcm9tTWFwKAorICAgICAgICAgICAgICAgICAgICBSRV9GT0NVU19NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKFJFX0ZPQ1VTX01PREVTX01BUCkpOworICAgICAgICAgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfUkVfRk9DVVNfTU9ERVMsIHJlRm9jdXNWYWx1ZXMpOworICAgICAgICAgICAgc2V0UmVGb2N1cyhSRV9GT0NVU19PRkYpOworICAgICAgICB9CisgICAgfQorCisgICAgLy9TZXQgQ2hyb21hIEZsYXNoLgorICAgIGlmICgobV9wQ2FwYWJpbGl0eS0+c3VwcG9ydGVkX2ZsYXNoX21vZGVzX2NudCA+IDApICYmCisgICAgICAgICAgICAobV9wQ2FwYWJpbGl0eS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYKKyAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfQ0hST01BX0ZMQVNIKSA+IDApIHsKKyAgICAgICAgU3RyaW5nOCBjaHJvbWFGbGFzaFZhbHVlcyA9IGNyZWF0ZVZhbHVlc1N0cmluZ0Zyb21NYXAoCisgICAgICAgICAgICAgICAgQ0hST01BX0ZMQVNIX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShDSFJPTUFfRkxBU0hfTU9ERVNfTUFQKSk7CisgICAgICAgIHNldChLRVlfUUNfU1VQUE9SVEVEX0NIUk9NQV9GTEFTSF9NT0RFUywgY2hyb21hRmxhc2hWYWx1ZXMpOworICAgICAgICBzZXRDaHJvbWFGbGFzaChDSFJPTUFfRkxBU0hfT0ZGKTsKKyAgICB9CisKKyAgICAvL1NldCBPcHRpIFpvb20uCisgICAgaWYgKG1fcENhcGFiaWxpdHktPnpvb21fc3VwcG9ydGVkICYmCisgICAgICAgICAgICAobV9wQ2FwYWJpbGl0eS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYKKyAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfT1BUSVpPT00pID4gMCl7CisgICAgICAgIFN0cmluZzggb3B0aVpvb21WYWx1ZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmdGcm9tTWFwKAorICAgICAgICAgICAgICAgIE9QVElfWk9PTV9NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoT1BUSV9aT09NX01PREVTX01BUCkpOworICAgICAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9PUFRJX1pPT01fTU9ERVMsIG9wdGlab29tVmFsdWVzKTsKKyAgICAgICAgc2V0T3B0aVpvb20oT1BUSV9aT09NX09GRik7CisgICAgfQorCisgICAgLy9TZXQgSERSIFR5cGUKKyAgICB1aW50MzJfdCBzdXBwb3J0ZWRfaGRyX21vZGVzID0gbV9wQ2FwYWJpbGl0eS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYKKyAgICAgICAgICAgIChDQU1fUUNPTV9GRUFUVVJFX1NFTlNPUl9IRFIgfCBDQU1fUUNPTV9GRUFUVVJFX0hEUik7CisgICAgaWYgKHN1cHBvcnRlZF9oZHJfbW9kZXMpIHsKKyAgICAgICAgaWYgKENBTV9RQ09NX0ZFQVRVUkVfU0VOU09SX0hEUiA9PSBzdXBwb3J0ZWRfaGRyX21vZGVzKSB7CisgICAgICAgICAgICBTdHJpbmc4IGhkck1vZGVWYWx1ZXM7CisgICAgICAgICAgICBoZHJNb2RlVmFsdWVzLmFwcGVuZChIRFJfTU9ERV9TRU5TT1IpOworICAgICAgICAgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfS0VZX1FDX0hEUl9NT0RFUywgaGRyTW9kZVZhbHVlcyk7CisgICAgICAgICAgICBzZXRIRFJNb2RlKEhEUl9NT0RFX1NFTlNPUik7CisgICAgICAgIH0gZWxzZSBpZiAoQ0FNX1FDT01fRkVBVFVSRV9IRFIgPT0gc3VwcG9ydGVkX2hkcl9tb2RlcykgeworICAgICAgICAgICAgU3RyaW5nOCBoZHJNb2RlVmFsdWVzOworICAgICAgICAgICAgaGRyTW9kZVZhbHVlcy5hcHBlbmQoSERSX01PREVfTVVMVElfRlJBTUUpOworICAgICAgICAgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfS0VZX1FDX0hEUl9NT0RFUywgaGRyTW9kZVZhbHVlcyk7CisgICAgICAgICAgICBzZXRIRFJNb2RlKEhEUl9NT0RFX01VTFRJX0ZSQU1FKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZzggaGRyTW9kZVZhbHVlcyA9IGNyZWF0ZVZhbHVlc1N0cmluZ0Zyb21NYXAoCisgICAgICAgICAgICAgICAgICAgIEhEUl9NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKEhEUl9NT0RFU19NQVApKTsKKyAgICAgICAgICAgIHNldChLRVlfUUNfU1VQUE9SVEVEX0tFWV9RQ19IRFJfTU9ERVMsIGhkck1vZGVWYWx1ZXMpOworICAgICAgICAgICAgc2V0SERSTW9kZShIRFJfTU9ERV9NVUxUSV9GUkFNRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL1NldCBIRFIgbmVlZCAxeAorICAgIFN0cmluZzggaGRyTmVlZDF4VmFsdWVzOworICAgIGlmICghbV9iSERSTW9kZVNlbnNvcikgeworICAgICAgICBoZHJOZWVkMXhWYWx1ZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmdGcm9tTWFwKFRSVUVfRkFMU0VfTU9ERVNfTUFQLAorICAgICAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKFRSVUVfRkFMU0VfTU9ERVNfTUFQKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaGRyTmVlZDF4VmFsdWVzLmFwcGVuZChWQUxVRV9GQUxTRSk7CisgICAgfQorICAgIHNldEhEUk5lZWQxeChWQUxVRV9GQUxTRSk7CisgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfSERSX05FRURfMVgsIGhkck5lZWQxeFZhbHVlcyk7CisKKyAgICAvL1NldCBUcnVlIFBvcnRyYWl0CisgICAgaWYgKChtX3BDYXBhYmlsaXR5LT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX1RSVUVQT1JUUkFJVCkgPiAwKSB7CisgICAgICAgIFN0cmluZzggdHJ1ZVBvcnRyYWl0VmFsdWVzID0gY3JlYXRlVmFsdWVzU3RyaW5nRnJvbU1hcCgKKyAgICAgICAgICAgICAgICBUUlVFX1BPUlRSQUlUX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShUUlVFX1BPUlRSQUlUX01PREVTX01BUCkpOworICAgICAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9UUlVFX1BPUlRSQUlUX01PREVTLCB0cnVlUG9ydHJhaXRWYWx1ZXMpOworICAgIH0KKworICAgIC8vIFNldCBEZW5vaXNlCisgICAgaWYgKChtX3BDYXBhYmlsaXR5LT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX0RFTk9JU0UyRCkgPiAwKXsKKyAgICBTdHJpbmc4IGRlbm9pc2VWYWx1ZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmdGcm9tTWFwKAorICAgICAgICBERU5PSVNFX09OX09GRl9NT0RFU19NQVAsIFBBUkFNX01BUF9TSVpFKERFTk9JU0VfT05fT0ZGX01PREVTX01BUCkpOworICAgIHNldChLRVlfUUNfU1VQUE9SVEVEX0RFTk9JU0UsIGRlbm9pc2VWYWx1ZXMuc3RyaW5nKCkpOworI2lmZGVmIERFRkFVTFRfREVOT0lTRV9NT0RFX09OCisgICAgc2V0V2F2ZWxldERlbm9pc2UoREVOT0lTRV9PTik7CisjZWxzZQorICAgIHNldFdhdmVsZXREZW5vaXNlKERFTk9JU0VfT0ZGKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIFNldCBmZWF0dXJlIGVuYWJsZS9kaXNhYmxlCisgICAgU3RyaW5nOCBlbmFibGVEaXNhYmxlVmFsdWVzID0gY3JlYXRlVmFsdWVzU3RyaW5nRnJvbU1hcCgKKyAgICAgICAgICAgIEVOQUJMRV9ESVNBQkxFX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoRU5BQkxFX0RJU0FCTEVfTU9ERVNfTUFQKSk7CisKKyAgICAvLyBTZXQgTGVucyBTaGFkaW5nCisgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfTEVOU1NIQURFX01PREVTLCBlbmFibGVEaXNhYmxlVmFsdWVzKTsKKyAgICBzZXRMZW5zU2hhZGVWYWx1ZShWQUxVRV9FTkFCTEUpOworICAgIC8vIFNldCBNQ0UKKyAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9NRU1fQ09MT1JfRU5IQU5DRV9NT0RFUywgZW5hYmxlRGlzYWJsZVZhbHVlcyk7CisgICAgc2V0TUNFVmFsdWUoVkFMVUVfRU5BQkxFKTsKKworICAgIC8vIFNldCBESVMKKyAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9ESVNfTU9ERVMsIGVuYWJsZURpc2FibGVWYWx1ZXMpOworICAgIHNldERJU1ZhbHVlKFZBTFVFX0RJU0FCTEUpOworCisgICAgLy8gU2V0IEhpc3RvZ3JhbQorICAgIHNldChLRVlfUUNfU1VQUE9SVEVEX0hJU1RPR1JBTV9NT0RFUywKKyAgICAgICAgbV9wQ2FwYWJpbGl0eS0+aGlzdG9ncmFtX3N1cHBvcnRlZCA/IGVuYWJsZURpc2FibGVWYWx1ZXMgOiAiIik7CisgICAgc2V0KEtFWV9RQ19ISVNUT0dSQU0sIFZBTFVFX0RJU0FCTEUpOworCisgICAgLy9TZXQgUmVkIEV5ZSBSZWR1Y3Rpb24KKyAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9SRURFWUVfUkVEVUNUSU9OLCBlbmFibGVEaXNhYmxlVmFsdWVzKTsKKyAgICBzZXRSZWRleWVSZWR1Y3Rpb24oVkFMVUVfRElTQUJMRSk7CisKKyAgICAvL1NldCBTa2luVG9uZSBFbmhhbmNlbWVudAorICAgIHNldChLRVlfUUNfU1VQUE9SVEVEX1NLSU5fVE9ORV9FTkhBTkNFTUVOVF9NT0RFUywgZW5hYmxlRGlzYWJsZVZhbHVlcyk7CisKKyAgICAvLyBFbmFibGUgTFRNIGJ5IGRlZmF1bHQgYW5kIGRpc2FibGUgaXQgaW4gSERSICYgU2VlTW9yZSB1c2VjYXNlcworICAgIHNldFRvbmVNYXBNb2RlKHRydWUsIGZhbHNlKTsKKworICAgIC8vIFNldCBmZWF0dXJlIG9uL29mZgorICAgIFN0cmluZzggb25PZmZWYWx1ZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmdGcm9tTWFwKAorICAgICAgICAgICAgT05fT0ZGX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoT05fT0ZGX01PREVTX01BUCkpOworCisgICAgLy9TZXQgU2VlIG1vcmUgKExMVkQpCisgICAgaWYgKG1fcENhcGFiaWxpdHktPnFjb21fc3VwcG9ydGVkX2ZlYXR1cmVfbWFzayAmCisgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX0xMVkQpIHsKKyAgICAgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfU0VFX01PUkVfTU9ERVMsIG9uT2ZmVmFsdWVzKTsKKyAgICAgICAgc2V0U2VlTW9yZShWQUxVRV9PRkYpOworICAgIH0KKworICAgIC8vU2V0IFN0aWxsIG1vcmUKKyAgICBpZiAobV9wQ2FwYWJpbGl0eS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYKKyAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfU1RJTExNT1JFKSB7CisgICAgICAgIFN0cmluZzggc3RpbGxNb3JlVmFsdWVzID0gY3JlYXRlVmFsdWVzU3RyaW5nRnJvbU1hcCgKKyAgICAgICAgICAgICAgICBTVElMTF9NT1JFX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShTVElMTF9NT1JFX01PREVTX01BUCkpOworICAgICAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9TVElMTF9NT1JFX01PREVTLCBzdGlsbE1vcmVWYWx1ZXMpOworICAgICAgICBzZXRTdGlsbE1vcmUoU1RJTExfTU9SRV9PRkYpOworICAgIH0KKworICAgIC8vU2V0IE5vaXNlIFJlZHVjdGlvbiBtb2RlCisgICAgaWYgKG1fcENhcGFiaWxpdHktPnFjb21fc3VwcG9ydGVkX2ZlYXR1cmVfbWFzayAmCisgICAgICAgICAgICBDQU1fUVRJX0ZFQVRVUkVfU1dfVE5SKSB7CisgICAgICAgIFN0cmluZzggbm9pc2VSZWR1Y3Rpb25Nb2Rlc1ZhbHVlcyA9IGNyZWF0ZVZhbHVlc1N0cmluZ0Zyb21NYXAoCisgICAgICAgICAgICAgICAgTk9JU0VfUkVEVUNUSU9OX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoTk9JU0VfUkVEVUNUSU9OX01PREVTX01BUCkpOworICAgICAgICBzZXQoS0VZX1FDX05PSVNFX1JFRFVDVElPTl9NT0RFX1ZBTFVFUywgbm9pc2VSZWR1Y3Rpb25Nb2Rlc1ZhbHVlcyk7CisgICAgICAgIHNldE5vaXNlUmVkdWN0aW9uTW9kZShWQUxVRV9PRkYpOworICAgIH0KKworICAgIC8vU2V0IFNjZW5lIERldGVjdGlvbgorICAgIHNldChLRVlfUUNfU1VQUE9SVEVEX1NDRU5FX0RFVEVDVCwgb25PZmZWYWx1ZXMpOworICAgIHNldFNjZW5lRGV0ZWN0KFZBTFVFX09GRik7CisgICAgbV9iSERSRW5hYmxlZCA9IGZhbHNlOworICAgIG1fYkhEUjF4RnJhbWVFbmFibGVkID0gZmFsc2U7CisKKyAgICBtX2JIRFJUaHVtYm5haWxQcm9jZXNzTmVlZGVkID0gZmFsc2U7CisgICAgbV9iSERSMXhFeHRyYUJ1ZmZlck5lZWRlZCA9IHRydWU7CisgICAgZm9yICh1aW50MzJfdCBpPTA7IGk8bV9wQ2FwYWJpbGl0eS0+aGRyX2JyYWNrZXRpbmdfc2V0dGluZy5udW1fZnJhbWVzOyBpKyspIHsKKyAgICAgICAgaWYgKDAgPT0gbV9wQ2FwYWJpbGl0eS0+aGRyX2JyYWNrZXRpbmdfc2V0dGluZy5leHBfdmFsLnZhbHVlc1tpXSkgeworICAgICAgICAgICAgbV9iSERSMXhFeHRyYUJ1ZmZlck5lZWRlZCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQgSERSIG91dHB1dCBzY2FsaW5nCisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5oZHIub3V0Y3JvcCIsIHZhbHVlLCBWQUxVRV9ESVNBQkxFKTsKKyAgICBpZiAoc3RybmNtcChWQUxVRV9FTkFCTEUsIHZhbHVlLCBzaXplb2YoVkFMVUVfRU5BQkxFKSkpIHsKKyAgICAgIG1fYkhEUk91dHB1dENyb3BFbmFibGVkID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fYkhEUk91dHB1dENyb3BFbmFibGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvL1NldCBGYWNlIERldGVjdGlvbgorICAgIHNldChLRVlfUUNfU1VQUE9SVEVEX0ZBQ0VfREVURUNUSU9OLCBvbk9mZlZhbHVlcyk7CisgICAgc2V0KEtFWV9RQ19GQUNFX0RFVEVDVElPTiwgVkFMVUVfT0ZGKTsKKworICAgIC8vU2V0IEZhY2UgUmVjb2duaXRpb24KKyAgICAvL3NldChLRVlfUUNfU1VQUE9SVEVEX0ZBQ0VfUkVDT0dOSVRJT04sIG9uT2ZmVmFsdWVzKTsKKyAgICAvL3NldChLRVlfUUNfRkFDRV9SRUNPR05JVElPTiwgVkFMVUVfT0ZGKTsKKworICAgIC8vU2V0IFpTTAorICAgIHNldChLRVlfUUNfU1VQUE9SVEVEX1pTTF9NT0RFUywgb25PZmZWYWx1ZXMpOworI2lmZGVmIERFRkFVTFRfWlNMX01PREVfT04KKyAgICBzZXQoS0VZX1FDX1pTTCwgVkFMVUVfT04pOworICAgIG1fYlpzbE1vZGUgPSB0cnVlOworI2Vsc2UKKyAgICBzZXQoS0VZX1FDX1pTTCwgVkFMVUVfT0ZGKTsKKyAgICBtX2Jac2xNb2RlID0gZmFsc2U7CisjZW5kaWYKKworICAgIC8vIENoZWNrIGlmIHpzbCBtb2RlIHByb3BlcnR5IGlzIGVuYWJsZWQuCisgICAgLy8gSWYgeWVzLCBmb3JjZSB0aGUgY2FtZXJhIHRvIGJlIGluIHpzbCBtb2RlCisgICAgLy8gYW5kIGZvcmNlIHpzbCBtb2RlIHRvIGJlIGVuYWJsZWQgaW4gZHVhbCBjYW1lcmEgbW9kZS4KKyAgICBtZW1zZXQodmFsdWUsIDB4MCwgUFJPUEVSVFlfVkFMVUVfTUFYKTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnpzbC5tb2RlIiwgdmFsdWUsICIwIik7CisgICAgaW50MzJfdCB6c2xfbW9kZSA9IGF0b2kodmFsdWUpOworICAgIGlmKCh6c2xfbW9kZSA9PSAxKSB8fAorICAgICAgICAgICAgKG1fYlpzbE1vZGUgPT0gdHJ1ZSkgfHwKKyAgICAgICAgICAgIChtX3JlbENhbVN5bmNJbmZvLnN5bmNfY29udHJvbCA9PSBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT04pKSB7CisgICAgICAgIExPR0goIiVkOiBGb3JjaW5nIENhbWVyYSB0byBaU0wgbW9kZSBlbmFibGVkIik7CisgICAgICAgIHNldChLRVlfUUNfWlNMLCBWQUxVRV9PTik7CisgICAgICAgIG1fYkZvcmNlWnNsTW9kZSA9IHRydWU7CisgICAgICAgIG1fYlpzbE1vZGUgPSB0cnVlOworICAgICAgICBpbnQzMl90IHZhbHVlID0gbV9iRm9yY2Vac2xNb2RlOworICAgICAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX1pTTF9NT0RFLCB2YWx1ZSk7CisgICAgfQorICAgIG1fYlpzbE1vZGVfbmV3ID0gbV9iWnNsTW9kZTsKKworICAgIHNldChLRVlfUUNfU0NFTkVfU0VMRUNUSU9OLCBWQUxVRV9ESVNBQkxFKTsKKworICAgIC8vIFJkaSBtb2RlCisgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfUkRJX01PREVTLCBlbmFibGVEaXNhYmxlVmFsdWVzKTsKKyAgICBzZXRSZGlNb2RlKFZBTFVFX0RJU0FCTEUpOworCisgICAgLy8gU2VjdXJlIG1vZGUKKyAgICBzZXQoS0VZX1FDX1NVUFBPUlRFRF9TRUNVUkVfTU9ERVMsIGVuYWJsZURpc2FibGVWYWx1ZXMpOworICAgIHNldFNlY3VyZU1vZGUoVkFMVUVfRElTQUJMRSk7CisKKyAgICAvL1NldCB2aWRlbyBIRFIKKyAgICBpZiAoKG1fcENhcGFiaWxpdHktPnFjb21fc3VwcG9ydGVkX2ZlYXR1cmVfbWFzayAmIENBTV9RQ09NX0ZFQVRVUkVfVklERU9fSERSKSA+IDApIHsKKyAgICAgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfVklERU9fSERSX01PREVTLCBvbk9mZlZhbHVlcyk7CisgICAgICAgIHNldChLRVlfUUNfVklERU9fSERSLCBWQUxVRV9PRkYpOworICAgIH0KKworICAgIC8vU2V0IEhXIFNlbnNvciBTbmFwc2hvdCBIRFIKKyAgICBpZiAoKG1fcENhcGFiaWxpdHktPnFjb21fc3VwcG9ydGVkX2ZlYXR1cmVfbWFzayAmIENBTV9RQ09NX0ZFQVRVUkVfU0VOU09SX0hEUik+IDApIHsKKyAgICAgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfU0VOU09SX0hEUl9NT0RFUywgb25PZmZWYWx1ZXMpOworICAgICAgICBzZXQoS0VZX1FDX1NFTlNPUl9IRFIsIFZBTFVFX09GRik7CisgICAgICAgIG1fYlNlbnNvckhEUkVuYWJsZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTZXQgVlQgVGltZVN0YW1wCisgICAgc2V0KEtFWV9RQ19WVF9FTkFCTEUsIFZBTFVFX0RJU0FCTEUpOworICAgIC8vU2V0IFRvdWNoIEFGL0FFQworICAgIFN0cmluZzggdG91Y2hWYWx1ZXMgPSBjcmVhdGVWYWx1ZXNTdHJpbmdGcm9tTWFwKAorICAgICAgICAgICAgVE9VQ0hfQUZfQUVDX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoVE9VQ0hfQUZfQUVDX01PREVTX01BUCkpOworCisgICAgc2V0KEtFWV9RQ19TVVBQT1JURURfVE9VQ0hfQUZfQUVDLCB0b3VjaFZhbHVlcyk7CisgICAgc2V0KEtFWV9RQ19UT1VDSF9BRl9BRUMsIFRPVUNIX0FGX0FFQ19PRkYpOworCisgICAgLy9zZXQgZmxpcCBtb2RlCisgICAgaWYgKChtX3BDYXBhYmlsaXR5LT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX0ZMSVApID4gMCkgeworICAgICAgICBTdHJpbmc4IGZsaXBNb2RlcyA9IGNyZWF0ZVZhbHVlc1N0cmluZ0Zyb21NYXAoCisgICAgICAgICAgICAgICAgRkxJUF9NT0RFU19NQVAsIFBBUkFNX01BUF9TSVpFKEZMSVBfTU9ERVNfTUFQKSk7CisgICAgICAgIHNldChLRVlfUUNfU1VQUE9SVEVEX0ZMSVBfTU9ERVMsIGZsaXBNb2Rlcyk7CisgICAgICAgIHNldChLRVlfUUNfUFJFVklFV19GTElQLCBGTElQX01PREVfT0ZGKTsKKyAgICAgICAgc2V0KEtFWV9RQ19WSURFT19GTElQLCBGTElQX01PREVfT0ZGKTsKKyAgICAgICAgc2V0KEtFWV9RQ19TTkFQU0hPVF9QSUNUVVJFX0ZMSVAsIEZMSVBfTU9ERV9PRkYpOworICAgIH0KKworICAgIC8vIFNldCBkZWZhdWx0IEF1dG8gRXhwb3N1cmUgbG9jayB2YWx1ZQorICAgIHNldEFlY0xvY2soVkFMVUVfRkFMU0UpOworCisgICAgLy8gU2V0IGRlZmF1bHQgQVdCX0xPQ0sgbG9jayB2YWx1ZQorICAgIHNldEF3YkxvY2soVkFMVUVfRkFMU0UpOworCisgICAgLy8gU2V0IGRlZmF1bHQgQ2FtZXJhIG1vZGUKKyAgICBzZXQoS0VZX1FDX0NBTUVSQV9NT0RFLCAwKTsKKworICAgIC8vIEFkZCBzdXBwb3J0IGZvciBpbnRlcm5hbCBwcmV2aWV3IHJlc3RhcnQKKyAgICBzZXQoS0VZX0lOVEVSTkFMX1BFUlZJRVdfUkVTVEFSVCwgVkFMVUVfVFJVRSk7CisgICAgLy8gU2V0IGRlZmF1bHQgYnVyc3QgbnVtYmVyCisgICAgc2V0KEtFWV9RQ19TTkFQU0hPVF9CVVJTVF9OVU0sIDApOworICAgIHNldChLRVlfUUNfTlVNX1JFVFJPX0JVUlNUX1BFUl9TSFVUVEVSLCAwKTsKKworICAgIC8vR2V0IFJBTSBzaXplIGFuZCBkaXNhYmxlIGZlYXR1cmVzIHdoaWNoIGFyZSBtZW1vcnkgcmljaAorICAgIHN0cnVjdCBzeXNpbmZvIGluZm87CisgICAgc3lzaW5mbygmaW5mbyk7CisKKyAgICBMT0dIKCJ0b3RhbHJhbSA9ICVsZCwgZnJlZXJhbSA9ICVsZCAiLCBpbmZvLnRvdGFscmFtLAorICAgICAgICBpbmZvLmZyZWVyYW0pOworICAgIGlmIChpbmZvLnRvdGFscmFtID4gVE9UQUxfUkFNX1NJWkVfNTEyTUIpIHsKKyAgICAgICAgc2V0KEtFWV9RQ19aU0xfSERSX1NVUFBPUlRFRCwgVkFMVUVfVFJVRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9iSXNMb3dNZW1vcnlEZXZpY2UgPSB0cnVlOworICAgICAgICBzZXQoS0VZX1FDX1pTTF9IRFJfU1VQUE9SVEVELCBWQUxVRV9GQUxTRSk7CisgICAgfQorCisgICAgc2V0T2ZmbGluZVJBVygpOworICAgIG1lbXNldChtU3RyZWFtUHBNYXNrLCAwLCBzaXplb2YoY2FtX2ZlYXR1cmVfbWFza190KSpDQU1fU1RSRUFNX1RZUEVfTUFYKTsKKyAgICAvL1NldCB2aWRlbyBidWZmZXJzIGFzIHVuY2FjaGVkIGJ5IGRlZmF1bHQKKyAgICBzZXQoS0VZX1FDX0NBQ0hFX1ZJREVPX0JVRkZFUlMsIFZBTFVFX0RJU0FCTEUpOworCisgICAgLy8gU2V0IGRlZmF1bHQgbG9uZ3Nob3QgbW9kZQorICAgIHNldChLRVlfUUNfTE9OR19TSE9ULCAib2ZmIik7CisgICAgLy9FbmFibGUgbG9uZ3Nob3QgYnkgZGVmYXVsdAorICAgIHNldChLRVlfUUNfTE9OR1NIT1RfU1VQUE9SVEVELCBWQUxVRV9UUlVFKTsKKworICAgIGludDMyX3QgcmMgPSBjb21taXRQYXJhbWV0ZXJzKCk7CisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIHJjID0gc2V0TnVtT2ZTbmFwc2hvdCgpOworICAgIH0KKworICAgIC8vU2V0IFZpZGVvIFJvdGF0aW9uCisgICAgU3RyaW5nOCB2aWRlb1JvdGF0aW9uVmFsdWVzID0gY3JlYXRlVmFsdWVzU3RyaW5nRnJvbU1hcChWSURFT19ST1RBVElPTl9NT0RFU19NQVAsCisgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShWSURFT19ST1RBVElPTl9NT0RFU19NQVApKTsKKworICAgIHNldChLRVlfUUNfU1VQUE9SVEVEX1ZJREVPX1JPVEFUSU9OX1ZBTFVFUywgdmlkZW9Sb3RhdGlvblZhbHVlcy5zdHJpbmcoKSk7CisgICAgc2V0KEtFWV9RQ19WSURFT19ST1RBVElPTiwgVklERU9fUk9UQVRJT05fMCk7CisKKyAgICAvL0NoZWNrIGZvciBFWlR1bmUKKyAgICBzZXRFenR1bmUoKTsKKyAgICAvL0RlZmF1bHQgc2V0IGZvciB2aWRlbyBiYXRjaCBzaXplCisgICAgc2V0KEtFWV9RQ19WSURFT19CQVRDSF9TSVpFLCAwKTsKKworICAgIC8vU2V0dXAgZHVhbC1jYW1lcmEKKyAgICBzZXREY3JmKCk7CisKKyAgICAvLyBGb3IgQXV4IENhbWVyYSBvZiBkdWFsIGNhbWVyYSBNb2RlLAorICAgIC8vIGJ5IGRlZmF1bHQgc2V0IG5vIGRpc3BsYXkgbW9kZQorICAgIGlmIChtX3JlbENhbVN5bmNJbmZvLm1vZGUgPT0gQ0FNX01PREVfU0VDT05EQVJZKSB7CisgICAgICAgIHNldChLRVlfUUNfTk9fRElTUExBWV9NT0RFLCAxKTsKKyAgICAgICAgbV9iTm9EaXNwbGF5TW9kZSA9IHRydWU7CisgICAgfQorCisgICAgY2FtX2RpbWVuc2lvbl90IHBpY19kaW07CisgICAgcGljX2RpbS53aWR0aCA9IDA7CisgICAgcGljX2RpbS5oZWlnaHQgPSAwOworCisgICAgZm9yKHVpbnQzMl90IGkgPSAwOworICAgICAgICAgICAgaSA8IChtX3BDYXBhYmlsaXR5LT5waWN0dXJlX3NpemVzX3RibF9jbnQgLSAxKTsKKyAgICAgICAgICAgIGkrKykgeworICAgICAgICBpZiAoKHBpY19kaW0ud2lkdGggKiBwaWNfZGltLmhlaWdodCkgPAorICAgICAgICAgICAgICAgIChpbnQzMl90KShtX3BDYXBhYmlsaXR5LT5waWN0dXJlX3NpemVzX3RibFtpXS53aWR0aCAqCisgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+cGljdHVyZV9zaXplc190YmxbaV0uaGVpZ2h0KSkgeworICAgICAgICAgICAgcGljX2RpbS53aWR0aCA9CisgICAgICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnBpY3R1cmVfc2l6ZXNfdGJsW2ldLndpZHRoOworICAgICAgICAgICAgcGljX2RpbS5oZWlnaHQgPQorICAgICAgICAgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5waWN0dXJlX3NpemVzX3RibFtpXS5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRCgibWF4IHBpYyBzaXplID0gJWQgJWQiLCBwaWNfZGltLndpZHRoLAorICAgICAgICAgICAgcGljX2RpbS5oZWlnaHQpOworICAgIHNldE1heFBpY1NpemUocGljX2RpbSk7CisKKyAgICBzZXRNYW51YWxDYXB0dXJlTW9kZShDQU1fTUFOVUFMX0NBUFRVUkVfVFlQRV9PRkYpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFsbG9jYXRlCisgKgorICogREVTQ1JJUFRJT046IEFsbG9jYXRlIGJ1ZmZlciBtZW1vcnkgZm9yIHBhcmFtZXRlciBvYmogKGlmIG5lY2Vzc2FyeSkKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmFsbG9jYXRlKCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBpZiAobV9wUGFyYW1IZWFwICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8vQWxsb2NhdGUgU2V0IFBhcmFtIEJ1ZmZlcgorICAgIG1fcFBhcmFtSGVhcCA9IG5ldyBRQ2FtZXJhSGVhcE1lbW9yeShRQ0FNRVJBX0lPTl9VU0VfQ0FDSEUpOworICAgIGlmIChtX3BQYXJhbUhlYXAgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHJjID0gbV9wUGFyYW1IZWFwLT5hbGxvY2F0ZSgxLCBzaXplb2YocGFybV9idWZmZXJfdCksIE5PTl9TRUNVUkUpOworICAgIGlmKHJjICE9IE9LKSB7CisgICAgICAgIHJjID0gTk9fTUVNT1JZOworICAgICAgICBMT0dFKCJFcnJvciEhIFBhcmFtIGJ1ZmZlcnMgaGF2ZSBub3QgYmVlbiBhbGxvY2F0ZWQiKTsKKyAgICAgICAgZGVsZXRlIG1fcFBhcmFtSGVhcDsKKyAgICAgICAgbV9wUGFyYW1IZWFwID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW5pdAorICoKKyAqIERFU0NSSVBUSU9OOiBpbml0aWFsaXplIHBhcmFtZXRlciBvYmoKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhcGFiaWxpdGllcyAgOiBwdHIgdG8gY2FtZXJhIGNhcGFiaWxpdGllcworICogICBAbW1vcHMgICAgICAgICA6IHB0ciB0byBtZW1vcnkgb3BzIHRhYmxlIGZvciBtYXBwaW5nL3VubWFwcGluZworICogICBAYWRqdXN0RlBTICAgICA6IG9iamVjdCByZWZlcmVuY2UgZm9yIGFkZGl0aW9uYWwgKHBvc3NpYmx5IHRoZXJtYWwpCisgKiAgICAgICAgICAgICAgICAgICAgZnJhbWVyYXRlIGFkanVzdG1lbnQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjppbml0KGNhbV9jYXBhYmlsaXR5X3QgKmNhcGFiaWxpdGllcywKKyAgICAgICAgbW1fY2FtZXJhX3Z0YmxfdCAqbW1PcHMsIFFDYW1lcmFBZGp1c3RGUFMgKmFkanVzdEZQUykKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBtX3BDYXBhYmlsaXR5ID0gY2FwYWJpbGl0aWVzOworICAgIG1fcENhbU9wc1RibCA9IG1tT3BzOworICAgIG1fQWRqdXN0RlBTID0gYWRqdXN0RlBTOworCisgICAgaWYgKG1fcFBhcmFtSGVhcCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlBhcmFtZXRlciBidWZmZXJzIGhhdmUgbm90IGJlZW4gYWxsb2NhdGVkIik7CisgICAgICAgIHJjID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgZ290byBUUkFOU19JTklUX0VSUk9SMTsKKyAgICB9CisKKyAgICAvL01hcCBtZW1vcnkgZm9yIHBhcmFtZXRlcnMgYnVmZmVyCisgICAgY2FtX2J1Zl9tYXBfdHlwZV9saXN0IGJ1Zk1hcExpc3Q7CisgICAgcmMgPSBRQ2FtZXJhQnVmZmVyTWFwczo6bWFrZVNpbmdsZXRvbkJ1Zk1hcExpc3QoCisgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9QQVJNX0JVRiwgMCAvKnN0cmVhbSBpZCovLAorICAgICAgICAgICAgMCAvKmJ1ZmZlciBpbmRleCovLCAtMSAvKnBsYW5lIGluZGV4Ki8sIDAgLypjb29raWUqLywKKyAgICAgICAgICAgIG1fcFBhcmFtSGVhcC0+Z2V0RmQoMCksIHNpemVvZihwYXJtX2J1ZmZlcl90KSwgYnVmTWFwTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgbV9wUGFyYW1IZWFwLT5nZXRQdHIoMCkpOworCisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIHJjID0gbV9wQ2FtT3BzVGJsLT5vcHMtPm1hcF9idWZzKG1fcENhbU9wc1RibC0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAmYnVmTWFwTGlzdCk7CisgICAgfQorCisgICAgaWYocmMgPCAwKSB7CisgICAgICAgIExPR0UoImZhaWxlZCB0byBtYXAgU0VUUEFSTSBidWZmZXIiKTsKKyAgICAgICAgcmMgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIGdvdG8gVFJBTlNfSU5JVF9FUlJPUjI7CisgICAgfQorICAgIG1fcFBhcmFtQnVmID0gKHBhcm1fYnVmZmVyX3QqKSBEQVRBX1BUUihtX3BQYXJhbUhlYXAsMCk7CisKKyAgICAvLyBDaGVjayBpZiBpdCBpcyBkdWFsIGNhbWVyYSBtb2RlCisgICAgaWYobV9yZWxDYW1TeW5jSW5mby5zeW5jX2NvbnRyb2wgPT0gQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09OKSB7CisgICAgICAgIC8vQWxsb2NhdGUgcmVsYXRlZCBjYW0gc3luYyBidWZmZXIKKyAgICAgICAgLy90aGlzIGlzIG5lZWRlZCBmb3IgdGhlIHBheWxvYWQgdGhhdCBnb2VzIGFsb25nIHdpdGggYnVuZGxpbmcgY21kIGZvciByZWxhdGVkCisgICAgICAgIC8vY2FtZXJhIHVzZSBjYXNlcworICAgICAgICBtX3BSZWxDYW1TeW5jSGVhcCA9IG5ldyBRQ2FtZXJhSGVhcE1lbW9yeShRQ0FNRVJBX0lPTl9VU0VfQ0FDSEUpOworICAgICAgICByYyA9IG1fcFJlbENhbVN5bmNIZWFwLT5hbGxvY2F0ZSgxLAorICAgICAgICAgICAgICAgIHNpemVvZihjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KSwgTk9OX1NFQ1VSRSk7CisgICAgICAgIGlmKHJjICE9IE9LKSB7CisgICAgICAgICAgICByYyA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBSZWxhdGVkIGNhbSBzeW5jIEhlYXAgbWVtb3J5Iik7CisgICAgICAgICAgICBnb3RvIFRSQU5TX0lOSVRfRVJST1IzOworICAgICAgICB9CisKKyAgICAgICAgLy9NYXAgbWVtb3J5IGZvciByZWxhdGVkIGNhbSBzeW5jIGJ1ZmZlcgorICAgICAgICByYyA9IG1fcENhbU9wc1RibC0+b3BzLT5tYXBfYnVmKG1fcENhbU9wc1RibC0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TWU5DX1JFTEFURURfU0VOU09SU19CVUYsCisgICAgICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0hlYXAtPmdldEZkKDApLAorICAgICAgICAgICAgICAgIHNpemVvZihjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KSwKKyAgICAgICAgICAgICAgICAoY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCopREFUQV9QVFIobV9wUmVsQ2FtU3luY0hlYXAsMCkpOworICAgICAgICBpZihyYyA8IDApIHsKKyAgICAgICAgICAgIExPR0UoImZhaWxlZCB0byBtYXAgUmVsYXRlZCBjYW0gc3luYyBidWZmZXIiKTsKKyAgICAgICAgICAgIHJjID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgICAgICAgICAgZ290byBUUkFOU19JTklUX0VSUk9SNDsKKyAgICAgICAgfQorICAgICAgICBtX3BSZWxDYW1TeW5jQnVmID0KKyAgICAgICAgICAgICAgICAoY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCopIERBVEFfUFRSKG1fcFJlbENhbVN5bmNIZWFwLDApOworICAgIH0KKyAgICBpbml0RGVmYXVsdFBhcmFtZXRlcnMoKTsKKyAgICBtQ29tbW9uLmluaXQoY2FwYWJpbGl0aWVzKTsKKyAgICBtX2JJbml0ZWQgPSB0cnVlOworCisgICAgZ290byBUUkFOU19JTklUX0RPTkU7CisKK1RSQU5TX0lOSVRfRVJST1I0OgorICAgIG1fcFJlbENhbVN5bmNIZWFwLT5kZWFsbG9jYXRlKCk7CisKK1RSQU5TX0lOSVRfRVJST1IzOgorICAgIGRlbGV0ZSBtX3BSZWxDYW1TeW5jSGVhcDsKKyAgICBtX3BSZWxDYW1TeW5jSGVhcCA9IE5VTEw7CisKK1RSQU5TX0lOSVRfRVJST1IyOgorICAgIG1fcFBhcmFtSGVhcC0+ZGVhbGxvY2F0ZSgpOworICAgIGRlbGV0ZSBtX3BQYXJhbUhlYXA7CisgICAgbV9wUGFyYW1IZWFwID0gTlVMTDsKKworVFJBTlNfSU5JVF9FUlJPUjE6CisgICAgbV9wQ2FwYWJpbGl0eSA9IE5VTEw7CisgICAgbV9wQ2FtT3BzVGJsID0gTlVMTDsKKyAgICBtX0FkanVzdEZQUyA9IE5VTEw7CisKK1RSQU5TX0lOSVRfRE9ORToKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGVpbml0CisgKgorICogREVTQ1JJUFRJT046IGRlaW5pdGlhbGl6ZQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhUGFyYW1ldGVyczo6ZGVpbml0KCkKK3sKKyAgICBpZiAoIW1fYkluaXRlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9jbGVhciBhbGwgZW50cmllcyBpbiB0aGUgbWFwCisgICAgU3RyaW5nOCBlbXB0eVN0cjsKKyAgICBRQ2FtZXJhUGFyYW1ldGVyczo6dW5mbGF0dGVuKGVtcHR5U3RyKTsKKworICAgIGlmICgoTlVMTCAhPSBtX3BDYW1PcHNUYmwpICYmIChtX3BDYW1PcHNUYmwtPm9wcyAhPSBOVUxMKSkgeworICAgICAgICBtX3BDYW1PcHNUYmwtPm9wcy0+dW5tYXBfYnVmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDYW1PcHNUYmwtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1BBUk1fQlVGKTsKKworICAgICAgICBpZiAobV9yZWxDYW1TeW5jSW5mby5zeW5jX2NvbnRyb2wgPT0gQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09OKSB7CisgICAgICAgICAgICBtX3BDYW1PcHNUYmwtPm9wcy0+dW5tYXBfYnVmKAorICAgICAgICAgICAgICAgICAgICBtX3BDYW1PcHNUYmwtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NZTkNfUkVMQVRFRF9TRU5TT1JTX0JVRik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX3BDYXBhYmlsaXR5ID0gTlVMTDsKKyAgICBpZiAoTlVMTCAhPSBtX3BQYXJhbUhlYXApIHsKKyAgICAgICAgbV9wUGFyYW1IZWFwLT5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbGV0ZSBtX3BQYXJhbUhlYXA7CisgICAgICAgIG1fcFBhcmFtSGVhcCA9IE5VTEw7CisgICAgICAgIG1fcFBhcmFtQnVmID0gTlVMTDsKKyAgICB9CisgICAgaWYgKE5VTEwgIT0gbV9wUmVsQ2FtU3luY0hlYXApIHsKKyAgICAgICAgbV9wUmVsQ2FtU3luY0hlYXAtPmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVsZXRlIG1fcFJlbENhbVN5bmNIZWFwOworICAgICAgICBtX3BSZWxDYW1TeW5jSGVhcCA9IE5VTEw7CisgICAgICAgIG1fcFJlbENhbVN5bmNCdWYgPSBOVUxMOworICAgIH0KKworICAgIG1fQWRqdXN0RlBTID0gTlVMTDsKKyAgICBtX3RlbXBNYXAuY2xlYXIoKTsKKyAgICBtX3BDYW1PcHNUYmwgPSBOVUxMOworICAgIG1fQWRqdXN0RlBTID0gTlVMTDsKKworICAgIG1fYkluaXRlZCA9IGZhbHNlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHBhcnNlX3BhaXIKKyAqCisgKiBERVNDUklQVElPTjogaGVscGVyIGZ1bmN0aW9uIHRvIHBhcnNlIHN0cmluZyBsaWtlICI2NDB4NDgwIiBvciAiMTAwMDAsMjAwMDAiCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdHIgICAgIDogaW5wdXQgc3RyaW5nIHRvIGJlIHBhcnNlCisgKiAgIEBmaXJzdCAgIDogW291dHB1dF0gZmlyc3QgdmFsdWUgb2YgdGhlIHBhaXIKKyAqICAgQHNlY29uZCAgOiBbb3V0cHV0XSAgc2Vjb25kIHZhbHVlIG9mIHRoZSBwYWlyCisgKiAgIEBkZWxpbSAgIDogW2lucHV0XSBkZWxpbWV0ZXIgdG8gc2VwZXJhdGUgdGhlIHBhaXIKKyAqICAgQGVuZHB0ciAgOiBbb3V0cHV0XSBwdHIgdG8gdGhlIGVuZCBvZiB0aGUgcGFpciBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpwYXJzZV9wYWlyKGNvbnN0IGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZGVsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiplbmRwdHIgPSBOVUxMKQoreworICAgIC8vIEZpbmQgdGhlIGZpcnN0IGludGVnZXIuCisgICAgY2hhciAqZW5kOworICAgIGludCB3ID0gKGludClzdHJ0b2woc3RyLCAmZW5kLCAxMCk7CisgICAgLy8gSWYgYSBkZWxpbWV0ZXIgZG9lcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93LCBnaXZlIHVwLgorICAgIGlmICgqZW5kICE9IGRlbGltKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBmaW5kIGRlbGltZXRlciAoJWMpIGluIHN0cj0lcyIsIGRlbGltLCBzdHIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEZpbmQgdGhlIHNlY29uZCBpbnRlZ2VyLCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZGVsaW1ldGVyLgorICAgIGludCBoID0gKGludClzdHJ0b2woZW5kKzEsICZlbmQsIDEwKTsKKworICAgICpmaXJzdCA9IHc7CisgICAgKnNlY29uZCA9IGg7CisKKyAgICBpZiAoZW5kcHRyKSB7CisgICAgICAgICplbmRwdHIgPSBlbmQ7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHBhcnNlU2l6ZXNMaXN0CisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBmdW5jdGlvbiB0byBwYXJzZSBzdHJpbmcgY29udGFpbmluZyBzaXplcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc2l6ZXNTdHI6IFtpbnB1dF0gaW5wdXQgc3RyaW5nIHRvIGJlIHBhcnNlCisgKiAgIEBzaXplcyAgIDogW291dHB1dF0gcmVmZXJlbmNlIHRvIHN0b3JlIHBhcnNlZCBzaXplcworICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYVBhcmFtZXRlcnM6OnBhcnNlU2l6ZXNMaXN0KGNvbnN0IGNoYXIgKnNpemVzU3RyLCBWZWN0b3I8U2l6ZT4gJnNpemVzKQoreworICAgIGlmIChzaXplc1N0ciA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjaGFyICpzaXplU3RhcnRQdHIgPSAoY2hhciAqKXNpemVzU3RyOworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGludCBzdWNjZXNzID0gcGFyc2VfcGFpcihzaXplU3RhcnRQdHIsICZ3aWR0aCwgJmhlaWdodCwgJ3gnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemVTdGFydFB0cik7CisgICAgICAgIGlmIChzdWNjZXNzID09IC0xIHx8ICgqc2l6ZVN0YXJ0UHRyICE9ICcsJyAmJiAqc2l6ZVN0YXJ0UHRyICE9ICdcMCcpKSB7CisgICAgICAgICAgICBMT0dFKCJQaWN0dXJlIHNpemVzIHN0cmluZyBcIiVzXCIgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXIuIiwgc2l6ZXNTdHIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNpemVzLnB1c2goU2l6ZSh3aWR0aCwgaGVpZ2h0KSk7CisKKyAgICAgICAgaWYgKCpzaXplU3RhcnRQdHIgPT0gJ1wwJykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNpemVTdGFydFB0cisrOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhZGp1c3RQcmV2aWV3RnBzUmFuZ2UKKyAqCisgKiBERVNDUklQVElPTjogYWRqdXN0IHByZXZpZXcgRlBTIHJhbmdlcworICogICAgICAgICAgICAgIGFjY29yZGluZyB0byBleHRlcm5hbCBldmVudHMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1pbkZQUyAgOiBtaW4gRlBTIHZhbHVlCisgKiAgIEBtYXhGUFMgIDogbWF4IEZQUyB2YWx1ZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmFkanVzdFByZXZpZXdGcHNSYW5nZShjYW1fZnBzX3JhbmdlX3QgKmZwc1JhbmdlKQoreworICAgIGlmICggZnBzUmFuZ2UgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoIG1fcFBhcmFtQnVmID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGludDMyX3QgcmMgPSBpbml0QmF0Y2hVcGRhdGUobV9wUGFyYW1CdWYpOworICAgIGlmICggcmMgIT0gTk9fRVJST1IgKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGdyb3VwIHVwZGF0ZSB0YWJsZSIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fRlBTX1JBTkdFLCAqZnBzUmFuZ2UpKSB7CisgICAgICAgIExPR0UoIlBhcmFtZXRlcnMgYmF0Y2ggZmFpbGVkIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCgpOworICAgIGlmICggcmMgIT0gTk9fRVJST1IgKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBjb21taXQgYmF0Y2ggcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFByZXZpZXdGcHNSYW5nZXMKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHByZXZpZXcgRlBTIHJhbmdlcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbWluRlBTICA6IG1pbiBGUFMgdmFsdWUKKyAqICAgQG1heEZQUyAgOiBtYXggRlBTIHZhbHVlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0UHJldmlld0Zwc1JhbmdlKGludCBtaW5fZnBzLAorICAgICAgICBpbnQgbWF4X2ZwcywgaW50IHZpZF9taW5fZnBzLGludCB2aWRfbWF4X2ZwcykKK3sKKyAgICBjaGFyIHN0clszMl07CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGludCBmaXhlZEZwc1ZhbHVlOworICAgIC8qVGhpcyBwcm9wZXJ0eSBnZXQgdmFsdWUgc2hvdWxkIGJlIHRoZSBmcHMgdGhhdCB1c2VyIG5lZWRzKi8KKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuZGVidWcuc2V0LmZpeGVkZnBzIiwgdmFsdWUsICIwIik7CisgICAgZml4ZWRGcHNWYWx1ZSA9IGF0b2kodmFsdWUpOworCisgICAgTE9HRCgiRSBtaW5GcHMgPSAlZCwgbWF4RnBzID0gJWQgLCB2aWQgbWluRnBzID0gJWQsIHZpZCBtYXhGcHMgPSAlZCIsCisgICAgICAgICAgICAgICAgIG1pbl9mcHMsIG1heF9mcHMsIHZpZF9taW5fZnBzLCB2aWRfbWF4X2Zwcyk7CisKKyAgICBpZihmaXhlZEZwc1ZhbHVlICE9IDApIHsKKyAgICAgICAgbWluX2ZwcyA9IG1heF9mcHMgPSBmaXhlZEZwc1ZhbHVlKjEwMDA7CisgICAgICAgIGlmICghaXNIZnJNb2RlKCkpIHsKKyAgICAgICAgICAgICB2aWRfbWluX2ZwcyA9IHZpZF9tYXhfZnBzID0gZml4ZWRGcHNWYWx1ZSoxMDAwOworICAgICAgICB9CisgICAgfQorICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlZCwlZCIsIG1pbl9mcHMsIG1heF9mcHMpOworICAgIExPR0goIlNldHRpbmcgcHJldmlldyBmcHMgcmFuZ2UgJXMiLCBzdHIpOworICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1BSRVZJRVdfRlBTX1JBTkdFLCBzdHIpOworICAgIGNhbV9mcHNfcmFuZ2VfdCBmcHNfcmFuZ2U7CisgICAgbWVtc2V0KCZmcHNfcmFuZ2UsIDB4MDAsIHNpemVvZihjYW1fZnBzX3JhbmdlX3QpKTsKKyAgICBmcHNfcmFuZ2UubWluX2ZwcyA9IChmbG9hdCltaW5fZnBzIC8gMTAwMC4wZjsKKyAgICBmcHNfcmFuZ2UubWF4X2ZwcyA9IChmbG9hdCltYXhfZnBzIC8gMTAwMC4wZjsKKyAgICBmcHNfcmFuZ2UudmlkZW9fbWluX2ZwcyA9IChmbG9hdCl2aWRfbWluX2ZwcyAvIDEwMDAuMGY7CisgICAgZnBzX3JhbmdlLnZpZGVvX21heF9mcHMgPSAoZmxvYXQpdmlkX21heF9mcHMgLyAxMDAwLjBmOworCisgICAgTE9HSCgiVXBkYXRlZDogbWluRnBzID0gJWQsIG1heEZwcyA9ICVkICwiCisgICAgICAgICAgICAiIHZpZCBtaW5GcHMgPSAlZCwgdmlkIG1heEZwcyA9ICVkIiwKKyAgICAgICAgICAgICBtaW5fZnBzLCBtYXhfZnBzLCB2aWRfbWluX2ZwcywgdmlkX21heF9mcHMpOworCisgICAgaWYgKCBOVUxMICE9IG1fQWRqdXN0RlBTICkgeworICAgICAgICBpZiAobV9UaGVybWFsTW9kZSA9PSBRQ0FNRVJBX1RIRVJNQUxfQURKVVNUX0ZQUyAmJgorICAgICAgICAgICAgICAgICFtX2JSZWNvcmRpbmdIaW50KSB7CisgICAgICAgICAgICBmbG9hdCBtaW5WaWRlb0ZwcyA9IG1pbl9mcHMsIG1heFZpZGVvRnBzID0gbWF4X2ZwczsKKyAgICAgICAgICAgIGlmIChpc0hmck1vZGUoKSkgeworICAgICAgICAgICAgICAgIG1pblZpZGVvRnBzID0gbV9oZnJGcHNSYW5nZS52aWRlb19taW5fZnBzOworICAgICAgICAgICAgICAgIG1heFZpZGVvRnBzID0gbV9oZnJGcHNSYW5nZS52aWRlb19tYXhfZnBzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9BZGp1c3RGUFMtPnJlY2FsY0ZQU1JhbmdlKG1pbl9mcHMsIG1heF9mcHMsIG1pblZpZGVvRnBzLCBtYXhWaWRlb0ZwcywgZnBzX3JhbmdlKTsKKyAgICAgICAgICAgIExPR0goIlRoZXJtYWwgYWRqdXN0ZWQgUHJldmlldyBmcHMgcmFuZ2UgJTMuMmYsJTMuMmYsICUzLjJmLCAlMy4yZiIsCisgICAgICAgICAgICAgICAgICAgZnBzX3JhbmdlLm1pbl9mcHMsIGZwc19yYW5nZS5tYXhfZnBzLAorICAgICAgICAgICAgICAgICAgZnBzX3JhbmdlLnZpZGVvX21pbl9mcHMsIGZwc19yYW5nZS52aWRlb19tYXhfZnBzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX0ZQU19SQU5HRSwgZnBzX3JhbmdlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0QXV0b0V4cG9zdXJlCisgKgorICogREVTQ1JJUFRJT046IHNldCBhdXRvIGV4cG9zdXJlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBhdXRvRXhwIDogYXV0byBleHBvc3VyZSB2YWx1ZSBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRBdXRvRXhwb3N1cmUoY29uc3QgY2hhciAqYXV0b0V4cCkKK3sKKyAgICBpZiAoYXV0b0V4cCAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgdmFsdWUgPSBsb29rdXBBdHRyKEFVVE9fRVhQT1NVUkVfTUFQLCBQQVJBTV9NQVBfU0laRShBVVRPX0VYUE9TVVJFX01BUCksIGF1dG9FeHApOworICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIExPR0goIlNldHRpbmcgYXV0byBleHBvc3VyZSAlcyIsIGF1dG9FeHApOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfQVVUT19FWFBPU1VSRSwgYXV0b0V4cCk7CisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9BRUNfQUxHT19UWVBFLCB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIExPR0UoIkludmFsaWQgYXV0byBleHBvc3VyZSB2YWx1ZTogJXMiLCAoYXV0b0V4cCA9PSBOVUxMKSA/ICJOVUxMIiA6IGF1dG9FeHApOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0RWZmZWN0CisgKgorICogREVTQ1JJUFRJT046IHNldCBlZmZlY3QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGVmZmVjdCAgOiBlZmZlY3QgdmFsdWUgc3RyaW5nCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0RWZmZWN0KGNvbnN0IGNoYXIgKmVmZmVjdCkKK3sKKyAgICBpZiAoZWZmZWN0ICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZSA9IGxvb2t1cEF0dHIoRUZGRUNUX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoRUZGRUNUX01PREVTX01BUCksIGVmZmVjdCk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgTE9HSCgiU2V0dGluZyBlZmZlY3QgJXMiLCBlZmZlY3QpOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfRUZGRUNULCBlZmZlY3QpOworICAgICAgICAgICAgdWludDhfdCBwcm1FZmZlY3QgPSBzdGF0aWNfY2FzdDx1aW50OF90Pih2YWx1ZSk7CisgICAgICAgICAgICBtUGFybUVmZmVjdCA9IHBybUVmZmVjdDsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX0VGRkVDVCwgcHJtRWZmZWN0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBlZmZlY3QgdmFsdWU6ICVzIiwgKGVmZmVjdCA9PSBOVUxMKSA/ICJOVUxMIiA6IGVmZmVjdCk7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRCcmlnaHRuZXNzCisgKgorICogREVTQ1JJUFRJT046IHNldCBicmlnaHRuZXNzIGNvbnRyb2wgdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJyaWdodG5lc3MgIDogYnJpZ2h0bmVzcyBjb250cm9sIHZhbHVlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0QnJpZ2h0bmVzcyhpbnQgYnJpZ2h0bmVzcykKK3sKKyAgICBjaGFyIHZhbFsxNl07CisgICAgc25wcmludGYodmFsLCBzaXplb2YodmFsKSwgIiVkIiwgYnJpZ2h0bmVzcyk7CisgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfQlJJR0hUTkVTUywgdmFsKTsKKworICAgIExPR0goIlNldHRpbmcgYnJpZ2h0bmVzcyAlcyIsIHZhbCk7CisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fQlJJR0hUTkVTUywgYnJpZ2h0bmVzcykpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0Rm9jdXNNb2RlCisgKgorICogREVTQ1JJUFRJT046IHNldCBmb2N1cyBtb2RlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmb2N1c01vZGUgIDogZm9jdXMgbW9kZSB2YWx1ZSBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRGb2N1c01vZGUoY29uc3QgY2hhciAqZm9jdXNNb2RlKQoreworICAgIGlmIChmb2N1c01vZGUgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihGT0NVU19NT0RFU19NQVAsIFBBUkFNX01BUF9TSVpFKEZPQ1VTX01PREVTX01BUCksIGZvY3VzTW9kZSk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgICAgICAgICAgTE9HSCgiU2V0dGluZyBmb2N1cyBtb2RlICVzIiwgZm9jdXNNb2RlKTsKKyAgICAgICAgICAgIG1Gb2N1c01vZGUgPSAoY2FtX2ZvY3VzX21vZGVfdHlwZSl2YWx1ZTsKKworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfRk9DVVNfTU9ERSwgZm9jdXNNb2RlKTsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLAorICAgICAgICAgICAgICAgICAgICBDQU1fSU5URl9QQVJNX0ZPQ1VTX01PREUsICh1aW50OF90KXZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cmNtcChmb2N1c01vZGUsImluZmluaXR5Iik9PTApeworICAgICAgICAgICAgICAgIHNldChRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX0RJU1RBTkNFUywgIkluZmluaXR5LEluZmluaXR5LEluZmluaXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBmb2N1cyBtb2RlIHZhbHVlOiAlcyIsIChmb2N1c01vZGUgPT0gTlVMTCkgPyAiTlVMTCIgOiBmb2N1c01vZGUpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0Rm9jdXNQb3NpdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgZm9jdXMgcG9zaXRpb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHR5cGVTdHIgOiBmb2N1cyBwb3NpdGlvbiB0eXBlLCBpbmRleCBvciBkYWNfY29kZQorICogICBAcG9zU3RyIDogZm9jdXMgcG9zaXRvbi4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90ICBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0Rm9jdXNQb3NpdGlvbihjb25zdCBjaGFyICp0eXBlU3RyLCBjb25zdCBjaGFyICpwb3NTdHIpCit7CisgICAgTE9HSCgiLCB0eXBlOiVzLCBwb3M6ICVzIiwgdHlwZVN0ciwgcG9zU3RyKTsKKyAgICBpbnQzMl90IHR5cGUgPSBhdG9pKHR5cGVTdHIpOworICAgIGZsb2F0IHBvcyA9IChmbG9hdCkgYXRvZihwb3NTdHIpOworCisgICAgaWYgKCh0eXBlID49IENBTV9NQU5VQUxfRk9DVVNfTU9ERV9JTkRFWCkgJiYKKyAgICAgICAgICAgICh0eXBlIDwgQ0FNX01BTlVBTF9GT0NVU19NT0RFX01BWCkpIHsKKyAgICAgICAgLy8gZ2V0IG1heCBhbmQgbWluIGZvY3VzIHBvc2l0aW9uIGZyb20gbV9wQ2FwYWJpbGl0eQorICAgICAgICBmbG9hdCBtaW5Gb2N1c1BvcyA9IG1fcENhcGFiaWxpdHktPm1pbl9mb2N1c19wb3NbdHlwZV07CisgICAgICAgIGZsb2F0IG1heEZvY3VzUG9zID0gbV9wQ2FwYWJpbGl0eS0+bWF4X2ZvY3VzX3Bvc1t0eXBlXTsKKyAgICAgICAgTE9HSCgiLCBmb2N1c1BvcyBtaW46ICVmLCBtYXg6ICVmIiwgbWluRm9jdXNQb3MsIG1heEZvY3VzUG9zKTsKKworICAgICAgICBpZiAocG9zID49IG1pbkZvY3VzUG9zICYmIHBvcyA8PSBtYXhGb2N1c1BvcykgeworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfTUFOVUFMX0ZPQ1VTX1BPU19UWVBFLCB0eXBlU3RyKTsKKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX01BTlVBTF9GT0NVU19QT1NJVElPTiwgcG9zU3RyKTsKKworICAgICAgICAgICAgY2FtX21hbnVhbF9mb2N1c19wYXJtX3QgbWFudWFsX2ZvY3VzOworICAgICAgICAgICAgbWFudWFsX2ZvY3VzLmZsYWcgPSAoY2FtX21hbnVhbF9mb2N1c19tb2RlX3R5cGUpdHlwZTsKKyAgICAgICAgICAgIGlmIChtYW51YWxfZm9jdXMuZmxhZyA9PSBDQU1fTUFOVUFMX0ZPQ1VTX01PREVfRElPUFRFUikgeworICAgICAgICAgICAgICAgIG1hbnVhbF9mb2N1cy5hZl9tYW51YWxfZGlvcHRlciA9IHBvczsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWFudWFsX2ZvY3VzLmZsYWcgPT0gQ0FNX01BTlVBTF9GT0NVU19NT0RFX1JBVElPKSB7CisgICAgICAgICAgICAgICAgbWFudWFsX2ZvY3VzLmFmX21hbnVhbF9sZW5zX3Bvc2l0aW9uX3JhdGlvID0gKGludDMyX3QpIHBvczsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWFudWFsX2ZvY3VzLmZsYWcgPT0gQ0FNX01BTlVBTF9GT0NVU19NT0RFX0lOREVYKSB7CisgICAgICAgICAgICAgICAgbWFudWFsX2ZvY3VzLmFmX21hbnVhbF9sZW5zX3Bvc2l0aW9uX2luZGV4ID0gKGludDMyX3QpIHBvczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFudWFsX2ZvY3VzLmFmX21hbnVhbF9sZW5zX3Bvc2l0aW9uX2RhYyA9IChpbnQzMl90KSBwb3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX01BTlVBTF9GT0NVU19QT1MsCisgICAgICAgICAgICAgICAgICAgIG1hbnVhbF9mb2N1cykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HRSgiaW52YWxpZCBwYXJhbXMsIHR5cGU6JWQsIHBvczogJWYiLCB0eXBlLCBwb3MpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdXBkYXRlQUVJbmZvCisgKgorICogREVTQ1JJUFRJT046IHVwZGF0ZSBleHBvc3VyZSBpbmZvcm1hdGlvbiBmcm9tIG1ldGFkYXRhIGNhbGxiYWNrCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBhZV9wYXJhbXMgOiBhdXRvIGV4cG9zdXJlIHBhcmFtcworICoKKyAqIFJFVFVSTiAgICAgOiB2b2lkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgIFFDYW1lcmFQYXJhbWV0ZXJzOjp1cGRhdGVBRUluZm8oY2FtXzNhX3BhcmFtc190ICZhZV9wYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqcHJldkV4cFRpbWUgPSBnZXQoS0VZX1FDX0NVUlJFTlRfRVhQT1NVUkVfVElNRSk7CisgICAgY2hhciBuZXdFeHBUaW1lWzE1XTsKKyAgICBzbnByaW50ZihuZXdFeHBUaW1lLCBzaXplb2YobmV3RXhwVGltZSksICIlZiIsIGFlX3BhcmFtcy5leHBfdGltZSoxMDAwLjApOworCisgICAgaWYgKHByZXZFeHBUaW1lID09IE5VTEwgfHwgc3RyY21wKHByZXZFeHBUaW1lLCBuZXdFeHBUaW1lKSkgeworICAgICAgICBMT0dEKCJ1cGRhdGUgZXhwb3N1cmUgdGltZTogb2xkOiAlcywgbmV3OiAlcyIsIHByZXZFeHBUaW1lLCBuZXdFeHBUaW1lKTsKKyAgICAgICAgc2V0KEtFWV9RQ19DVVJSRU5UX0VYUE9TVVJFX1RJTUUsIG5ld0V4cFRpbWUpOworICAgIH0KKworICAgIGludDMyX3QgcHJldklTTyA9IGdldEludChLRVlfUUNfQ1VSUkVOVF9JU08pOworICAgIGludDMyX3QgbmV3SVNPID0gYWVfcGFyYW1zLmlzb192YWx1ZTsKKyAgICBpZiAocHJldklTTyAhPSBuZXdJU08pIHsKKyAgICAgICAgTE9HRCgidXBkYXRlIGlzbzogb2xkOiVkLCBuZXc6JWQiLCBwcmV2SVNPLCBuZXdJU08pOworICAgICAgICBzZXQoS0VZX1FDX0NVUlJFTlRfSVNPLCBuZXdJU08pOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB1cGRhdGVDdXJyZW50Rm9jdXNQb3NpdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOiB1cGRhdGUgY3VycmVudCBmb2N1cyBwb3NpdGlvbiBmcm9tIG1ldGFkYXRhIGNhbGxiYWNrCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwb3MgOiBjdXJyZW50IGZvY3VzIHBvc2l0aW9uCisgKgorICogUkVUVVJOICAgICA6IHZvaWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCAgUUNhbWVyYVBhcmFtZXRlcnM6OnVwZGF0ZUN1cnJlbnRGb2N1c1Bvc2l0aW9uKGNhbV9mb2N1c19wb3NfaW5mb190ICZjdXJfcG9zX2luZm8pCit7CisgICAgaW50IHByZXZTY2FsZVBvcyA9IGdldEludChLRVlfUUNfRk9DVVNfUE9TSVRJT05fU0NBTEUpOworICAgIGludCBuZXdTY2FsZVBvcyA9IChpbnQpIGN1cl9wb3NfaW5mby5zY2FsZTsKKyAgICBpZiAocHJldlNjYWxlUG9zICE9IG5ld1NjYWxlUG9zKSB7CisgICAgICAgIExPR0QoInVwZGF0ZSBmb2N1cyBzY2FsZTogb2xkOiVkLCBuZXc6JWQiLCBwcmV2U2NhbGVQb3MsIG5ld1NjYWxlUG9zKTsKKyAgICAgICAgc2V0KEtFWV9RQ19GT0NVU19QT1NJVElPTl9TQ0FMRSwgbmV3U2NhbGVQb3MpOworICAgIH0KKworICAgIGZsb2F0IHByZXZEaW9wdGVyUG9zID0gZ2V0RmxvYXQoS0VZX1FDX0ZPQ1VTX1BPU0lUSU9OX0RJT1BURVIpOworICAgIGZsb2F0IG5ld0Rpb3B0ZXJQb3MgPSBjdXJfcG9zX2luZm8uZGlvcHRlcjsKKyAgICBpZiAocHJldkRpb3B0ZXJQb3MgIT0gbmV3RGlvcHRlclBvcykgeworICAgICAgICBMT0dEKCJ1cGRhdGUgZm9jdXMgZGlvcHRlcjogb2xkOiVmLCBuZXc6JWYiLCBwcmV2RGlvcHRlclBvcywgbmV3RGlvcHRlclBvcyk7CisgICAgICAgIHNldEZsb2F0KEtFWV9RQ19GT0NVU19QT1NJVElPTl9ESU9QVEVSLCBuZXdEaW9wdGVyUG9zKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U2hhcnBuZXNzCisgKgorICogREVTQ1JJUFRJT046IHNldCBzaGFycG5lc3MgY29udHJvbCB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc2hhcnBuZXNzICA6IHNoYXJwbmVzcyBjb250cm9sIHZhbHVlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0U2hhcnBuZXNzKGludCBzaGFycG5lc3MpCit7CisgICAgY2hhciB2YWxbMTZdOworICAgIHNucHJpbnRmKHZhbCwgc2l6ZW9mKHZhbCksICIlZCIsIHNoYXJwbmVzcyk7CisgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfU0hBUlBORVNTLCB2YWwpOworICAgIExPR0goIlNldHRpbmcgc2hhcnBuZXNzICVzIiwgdmFsKTsKKyAgICBtX25TaGFycG5lc3MgPSBzaGFycG5lc3M7CisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fU0hBUlBORVNTLCBtX25TaGFycG5lc3MpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFNraW5Ub25lRW5oYW5jZW1lbnQKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHNraW4gdG9uZSBlbmhhbmNlbWVudCB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc2NlRmFjdG9yZSAgOiBza2luIHRvbmUgZW5oYW5jZW1lbnQgZmFjdG9yIHZhbHVlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0U2tpblRvbmVFbmhhbmNlbWVudChpbnQgc2NlRmFjdG9yKQoreworICAgIGNoYXIgdmFsWzE2XTsKKyAgICBzbnByaW50Zih2YWwsIHNpemVvZih2YWwpLCAiJWQiLCBzY2VGYWN0b3IpOworICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1NDRV9GQUNUT1IsIHZhbCk7CisgICAgTE9HSCgiU2V0dGluZyBza2ludG9uZSBlbmhhbmNlbWVudCAlcyIsIHZhbCk7CisKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9TQ0VfRkFDVE9SLCBzY2VGYWN0b3IpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFNhdHVyYXRpb24KKyAqCisgKiBERVNDUklQVElPTjogc2V0IHNhdHVyYXRpb24gY29udHJvbCB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc2F0dXJhdGlvbiA6IHNhdHVyYXRpb24gY29udHJvbCB2YWx1ZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFNhdHVyYXRpb24oaW50IHNhdHVyYXRpb24pCit7CisgICAgY2hhciB2YWxbMTZdOworICAgIHNucHJpbnRmKHZhbCwgc2l6ZW9mKHZhbCksICIlZCIsIHNhdHVyYXRpb24pOworICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1NBVFVSQVRJT04sIHZhbCk7CisgICAgTE9HSCgiU2V0dGluZyBzYXR1cmF0aW9uICVzIiwgdmFsKTsKKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX1NBVFVSQVRJT04sIHNhdHVyYXRpb24pKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldENvbnRyYXN0CisgKgorICogREVTQ1JJUFRJT046IHNldCBjb250cmFzdCBjb250cm9sIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjb250cmFzdCA6IGNvbnRyYXN0IGNvbnRyb2wgdmFsdWUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRDb250cmFzdChpbnQgY29udHJhc3QpCit7CisgICAgY2hhciB2YWxbMTZdOworICAgIHNucHJpbnRmKHZhbCwgc2l6ZW9mKHZhbCksICIlZCIsIGNvbnRyYXN0KTsKKyAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19DT05UUkFTVCwgdmFsKTsKKyAgICBMT0dIKCJTZXR0aW5nIGNvbnRyYXN0ICVzIiwgdmFsKTsKKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX0NPTlRSQVNULCBjb250cmFzdCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U2NlbmVEZXRlY3QKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHNjZW5lbiBkZXRlY3QgdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHNjZW5lRGV0ZWN0ICA6IHNjZW5lIGRldGVjdCB2YWx1ZSBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRTY2VuZURldGVjdChjb25zdCBjaGFyICpzY2VuZURldGVjdCkKK3sKKyAgICBpZiAoc2NlbmVEZXRlY3QgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihPTl9PRkZfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShPTl9PRkZfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICBzY2VuZURldGVjdCk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgTE9HSCgiU2V0dGluZyBTY2VuZSBEZXRlY3QgJXMiLCBzY2VuZURldGVjdCk7CisgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19TQ0VORV9ERVRFQ1QsIHNjZW5lRGV0ZWN0KTsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX0FTRF9FTkFCTEUsIHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBTY2VuZSBEZXRlY3QgdmFsdWU6ICVzIiwKKyAgICAgICAgICAoc2NlbmVEZXRlY3QgPT0gTlVMTCkgPyAiTlVMTCIgOiBzY2VuZURldGVjdCk7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRTZW5zb3JTbmFwc2hvdEhEUgorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgc25hcHNob3QgSERSIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzbmFwc2hvdEhEUiAgOiBzbmFwc2hvdCBIRFIgdmFsdWUgc3RyaW5nCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0U2Vuc29yU25hcHNob3RIRFIoY29uc3QgY2hhciAqc25hcHNob3RIRFIpCit7CisgICAgaWYgKHNuYXBzaG90SERSICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZSA9IChjYW1fc2Vuc29yX2hkcl90eXBlX3QpIGxvb2t1cEF0dHIoT05fT0ZGX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShPTl9PRkZfTU9ERVNfTUFQKSwgc25hcHNob3RIRFIpOworICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIExPR0goIlNldHRpbmcgU2Vuc29yIFNuYXBzaG90IEhEUiAlcyIsIHNuYXBzaG90SERSKTsKKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1NFTlNPUl9IRFIsIHNuYXBzaG90SERSKTsKKworICAgICAgICAgICAgY2hhciB6el9wcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgICAgICBtZW1zZXQoenpfcHJvcCwgMCwgc2l6ZW9mKHp6X3Byb3ApKTsKKyAgICAgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuenpoZHIuZW5hYmxlIiwgenpfcHJvcCwgIjAiKTsKKyAgICAgICAgICAgIHVpbnQ4X3QgenpoZHJfZW5hYmxlID0gKHVpbnQ4X3QpYXRvaSh6el9wcm9wKTsKKworICAgICAgICAgICAgaWYgKHp6aGRyX2VuYWJsZSAmJiAodmFsdWUgIT0gQ0FNX1NFTlNPUl9IRFJfT0ZGKSkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gQ0FNX1NFTlNPUl9IRFJfWklHWkFHOworICAgICAgICAgICAgICAgIExPR0goIiVzOiBPdmVycmlkaW5nIHRvIFpaIEhEUiBNb2RlIiwgX19mdW5jX18pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9TRU5TT1JfSERSLCAoY2FtX3NlbnNvcl9oZHJfdHlwZV90KXZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBTbmFwc2hvdCBIRFIgdmFsdWU6ICVzIiwKKyAgICAgICAgICAoc25hcHNob3RIRFIgPT0gTlVMTCkgPyAiTlVMTCIgOiBzbmFwc2hvdEhEUik7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKKworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0VmlkZW9IRFIKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHZpZGVvIEhEUiB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAdmlkZW9IRFIgIDogc3ZpZGVvIEhEUiB2YWx1ZSBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRWaWRlb0hEUihjb25zdCBjaGFyICp2aWRlb0hEUikKK3sKKyAgICBpZiAodmlkZW9IRFIgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihPTl9PRkZfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShPTl9PRkZfTU9ERVNfTUFQKSwgdmlkZW9IRFIpOworICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKworICAgICAgICAgICAgY2hhciB6el9wcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgICAgICBtZW1zZXQoenpfcHJvcCwgMCwgc2l6ZW9mKHp6X3Byb3ApKTsKKyAgICAgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuaGRyLnZpZGVvIiwgenpfcHJvcCwgIjAiKTsKKyAgICAgICAgICAgIHVpbnQ4X3QgdXNlX3p6aGRyX3ZpZGVvID0gKHVpbnQ4X3QpYXRvaSh6el9wcm9wKTsKKworICAgICAgICAgICAgaWYgKHVzZV96emhkcl92aWRlbyA9PSBDQU1fU0VOU09SX0hEUl9aSUdaQUcpIHsKKyAgICAgICAgICAgICAgICBMT0dIKCIlczogVXNpbmcgWlogSERSIGZvciB2aWRlbyBtb2RlIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBDQU1fU0VOU09SX0hEUl9aSUdaQUc7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IENBTV9TRU5TT1JfSERSX09GRjsKKyAgICAgICAgICAgICAgICBMT0dIKCIlczogT3ZlcnJpZGluZyB0byBzZW5zb3IgSERSIE1vZGUgdG86JWQiLCBfX2Z1bmNfXywgdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX1NFTlNPUl9IRFIsIChjYW1fc2Vuc29yX2hkcl90eXBlX3QpIHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCIlczogT3ZlcnJpZGUgdG8gc2Vuc29yIEhEUiBtb2RlIGZvciB2aWRlbyBIRFIgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19WSURFT19IRFIsIHZpZGVvSERSKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HSCgiJXM6IFNldHRpbmcgVmlkZW8gSERSICVzIiwgX19mdW5jX18sIHZpZGVvSERSKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19WSURFT19IRFIsIHZpZGVvSERSKTsKKyAgICAgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9WSURFT19IRFIsIHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIExPR0UoIkludmFsaWQgVmlkZW8gSERSIHZhbHVlOiAlcyIsCisgICAgICAgICAgKHZpZGVvSERSID09IE5VTEwpID8gIk5VTEwiIDogdmlkZW9IRFIpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFZ0RW5hYmxlCisgKgorICogREVTQ1JJUFRJT046IHNldCB2dCBFbmFibGUgdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHZpZGVvSERSICA6IHN2dEVuYWJsZSB2YWx1ZSBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRWdEVuYWJsZShjb25zdCBjaGFyICp2dEVuYWJsZSkKK3sKKyAgICBpZiAodnRFbmFibGUgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihFTkFCTEVfRElTQUJMRV9NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoRU5BQkxFX0RJU0FCTEVfTU9ERVNfTUFQKSwgdnRFbmFibGUpOworICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIExPR0goIlNldHRpbmcgVnQgRW5hYmxlICVzIiwgdnRFbmFibGUpOworICAgICAgICAgICAgbV9iQVZUaW1lckVuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfVlRfRU5BQkxFLCB2dEVuYWJsZSk7CisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9WVCwgdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dFKCJJbnZhbGlkIFZ0IEVuYWJsZSB2YWx1ZTogJXMiLAorICAgICAgICAgICh2dEVuYWJsZSA9PSBOVUxMKSA/ICJOVUxMIiA6IHZ0RW5hYmxlKTsKKyAgICBtX2JBVlRpbWVyRW5hYmxlZCA9IGZhbHNlOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0RmFjZVJlY29nbml0aW9uCisgKgorICogREVTQ1JJUFRJT046IHNldCBmYWNlIHJlY29nbml0aW9uIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmYWNlUmVjb2cgIDogZmFjZSByZWNvZ25pdGlvbiB2YWx1ZSBzdHJpbmcKKyAqICAgQG1heEZhY2VzICAgOiBudW1iZXIgb2YgbWF4IGZhY2VzIHRvIGJlIGRldGVjdGVkL3JlY29nbml6ZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRGYWNlUmVjb2duaXRpb24oY29uc3QgY2hhciAqZmFjZVJlY29nLAorICAgICAgICB1aW50MzJfdCBtYXhGYWNlcykKK3sKKyAgICBpZiAoZmFjZVJlY29nICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZSA9IGxvb2t1cEF0dHIoT05fT0ZGX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoT05fT0ZGX01PREVTX01BUCksIGZhY2VSZWNvZyk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgTE9HSCgiU2V0dGluZyBmYWNlIHJlY29nbml0aW9uICVzIiwgZmFjZVJlY29nKTsKKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX0ZBQ0VfUkVDT0dOSVRJT04sIGZhY2VSZWNvZyk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IGZhY2VQcm9jTWFzayA9IG1fbkZhY2VQcm9jTWFzazsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBmYWNlUHJvY01hc2sgfD0gQ0FNX0ZBQ0VfUFJPQ0VTU19NQVNLX1JFQ09HTklUSU9OOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmYWNlUHJvY01hc2sgJj0gKHVpbnQzMl90KSh+Q0FNX0ZBQ0VfUFJPQ0VTU19NQVNLX1JFQ09HTklUSU9OKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYobV9uRmFjZVByb2NNYXNrID09IGZhY2VQcm9jTWFzaykgeworICAgICAgICAgICAgICAgIExPR0goImZhY2UgcHJvY2VzcyBtYXNrIG5vdCBjaGFuZ2VkLCBubyBvcHMgaGVyZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fbkZhY2VQcm9jTWFzayA9IGZhY2VQcm9jTWFzazsKKyAgICAgICAgICAgIExPR0goIkZhY2VQcm9jTWFzayAtPiAlZCIsIG1fbkZhY2VQcm9jTWFzayk7CisKKyAgICAgICAgICAgIC8vIHNldCBwYXJtIGZvciBmYWNlIHByb2Nlc3MKKyAgICAgICAgICAgIGNhbV9mZF9zZXRfcGFybV90IGZkX3NldF9wYXJtOworICAgICAgICAgICAgbWVtc2V0KCZmZF9zZXRfcGFybSwgMCwgc2l6ZW9mKGNhbV9mZF9zZXRfcGFybV90KSk7CisgICAgICAgICAgICBmZF9zZXRfcGFybS5mZF9tb2RlID0gbV9uRmFjZVByb2NNYXNrOworICAgICAgICAgICAgZmRfc2V0X3Bhcm0ubnVtX2ZkID0gbWF4RmFjZXM7CisKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX0ZELCBmZF9zZXRfcGFybSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIExPR0UoIkludmFsaWQgZmFjZSByZWNvZ25pdGlvbiB2YWx1ZTogJXMiLCAoZmFjZVJlY29nID09IE5VTEwpID8gIk5VTEwiIDogZmFjZVJlY29nKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFpvb20KKyAqCisgKiBERVNDUklQVElPTjogc2V0IHpvb20gbGV2ZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHpvb21fbGV2ZWwgOiB6b29tIGxldmVsCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0Wm9vbShpbnQgem9vbV9sZXZlbCkKK3sKKyAgICBjaGFyIHZhbFsxNl07CisgICAgc25wcmludGYodmFsLCBzaXplb2YodmFsKSwgIiVkIiwgem9vbV9sZXZlbCk7CisgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfWk9PTSwgdmFsKTsKKyAgICBMT0dIKCJ6b29tIGxldmVsOiAlZCIsIHpvb21fbGV2ZWwpOworICAgIG1ab29tTGV2ZWwgPSB6b29tX2xldmVsOworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX1pPT00sIHpvb21fbGV2ZWwpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldElTT1ZhbHVlCisgKgorICogREVTQ1JJUFRJT046IHNldCBJU08gdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGlzb1ZhbHVlIDogSVNPIHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgIFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRJU09WYWx1ZShjb25zdCBjaGFyICppc29WYWx1ZSkKK3sKKyAgICBpZiAoaXNvVmFsdWUgIT0gTlVMTCkgeworICAgICAgICBpZiAoIXN0cmNtcChpc29WYWx1ZSwgSVNPX01BTlVBTCkpIHsKKyAgICAgICAgICAgIExPR0QoImlzbyBtYW51YWwgbW9kZSAtIHVzZSBjb250aW51b3VzIGlzbyIpOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfSVNPX01PREUsIGlzb1ZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihJU09fTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShJU09fTU9ERVNfTUFQKSwgaXNvVmFsdWUpOworICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIExPR0goIlNldHRpbmcgSVNPIHZhbHVlICVzIiwgaXNvVmFsdWUpOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfSVNPX01PREUsIGlzb1ZhbHVlKTsKKworICAgICAgICAgICAgY2FtX2ludGZfcGFybV9tYW51YWxfM2FfdCBpc29fc2V0dGluZ3M7CisgICAgICAgICAgICBtZW1zZXQoJmlzb19zZXR0aW5ncywgMCwgc2l6ZW9mKGNhbV9pbnRmX3Bhcm1fbWFudWFsXzNhX3QpKTsKKyAgICAgICAgICAgIGlzb19zZXR0aW5ncy5wcmV2aWV3T25seSA9IEZBTFNFOworICAgICAgICAgICAgaXNvX3NldHRpbmdzLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICBpZiAoZ2V0TWFudWFsQ2FwdHVyZU1vZGUoKSAhPSBDQU1fTUFOVUFMX0NBUFRVUkVfVFlQRV9PRkYpIHsKKyAgICAgICAgICAgICAgICBpc29fc2V0dGluZ3MucHJldmlld09ubHkgPSBUUlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9JU08sIGlzb19zZXR0aW5ncykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9pc29WYWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIExPR0UoIkludmFsaWQgSVNPIHZhbHVlOiAlcyIsCisgICAgICAgICAgKGlzb1ZhbHVlID09IE5VTEwpID8gIk5VTEwiIDogaXNvVmFsdWUpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRDb250aW51b3VzSVNPCisgKgorICogREVTQ1JJUFRJT046IHNldCBjb250aW51b3VzIElTTyB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zIDogSVNPIHZhbHVlIHBhcmFtZXRlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgIFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRDb250aW51b3VzSVNPKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqaXNvID0gcGFyYW1zLmdldChLRVlfUUNfSVNPX01PREUpOworICAgIExPR0QoImN1cnJlbnQgaXNvIG1vZGU6ICVzIiwgaXNvKTsKKworICAgIGlmIChpc28gIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RyY21wKGlzbywgSVNPX01BTlVBTCkpIHsKKyAgICAgICAgICAgIExPR0QoImRvbnQgc2V0IGlzbyB0byBiYWNrLWVuZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHBhcmFtcy5nZXQoS0VZX1FDX0NPTlRJTlVPVVNfSVNPKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfQ09OVElOVU9VU19JU08pOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRDb250aW51b3VzSVNPKHN0cik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEV4cG9zdXJlVGltZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgZXhwb3N1cmUgdGltZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZXhwVGltZVN0ciA6IHN0cmluZyBvZiBleHBvc3VyZSB0aW1lIGluIG1zCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCAgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEV4cG9zdXJlVGltZShjb25zdCBjaGFyICpleHBUaW1lU3RyKQoreworICAgIGlmIChleHBUaW1lU3RyICE9IE5VTEwpIHsKKyAgICAgICAgZG91YmxlIGV4cFRpbWVNcyA9IGF0b2YoZXhwVGltZVN0cik7CisgICAgICAgIC8vaW5wdXQgaXMgaW4gbWlsbGkgc2Vjb25kcy4gQ29udmVydCB0byBuYW5vIHNlYyBmb3IgYmFja2VuZAorICAgICAgICBpbnQ2NF90IGV4cFRpbWVOcyA9IChpbnQ2NF90KShleHBUaW1lTXMqMTAwMDAwMEwpOworCisgICAgICAgIC8vIGV4cFRpbWUgPT0gMCBtZWFucyBub3QgdG8gdXNlIG1hbnVhbCBleHBvc3VyZSB0aW1lLgorICAgICAgICBpZiAoKDAgPD0gZXhwVGltZU5zKSAmJgorICAgICAgICAgICAgICAgICgoZXhwVGltZU5zID09IDApIHx8CisgICAgICAgICAgICAgICAgKChleHBUaW1lTnMgPj0gbV9wQ2FwYWJpbGl0eS0+ZXhwb3N1cmVfdGltZV9yYW5nZVswXSkgJiYKKyAgICAgICAgICAgICAgICAoZXhwVGltZU5zIDw9IG1fcENhcGFiaWxpdHktPmV4cG9zdXJlX3RpbWVfcmFuZ2VbMV0pKSkpIHsKKyAgICAgICAgICAgIExPR0goIiwgZXhwb3N1cmUgdGltZTogJWYgbXMiLCBleHBUaW1lTXMpOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfRVhQT1NVUkVfVElNRSwgZXhwVGltZVN0cik7CisKKyAgICAgICAgICAgIGNhbV9pbnRmX3Bhcm1fbWFudWFsXzNhX3QgZXhwX3NldHRpbmdzOworICAgICAgICAgICAgbWVtc2V0KCZleHBfc2V0dGluZ3MsIDAsIHNpemVvZihjYW1faW50Zl9wYXJtX21hbnVhbF8zYV90KSk7CisgICAgICAgICAgICBpZiAoZ2V0TWFudWFsQ2FwdHVyZU1vZGUoKSAhPSBDQU1fTUFOVUFMX0NBUFRVUkVfVFlQRV9PRkYpIHsKKyAgICAgICAgICAgICAgICBleHBfc2V0dGluZ3MucHJldmlld09ubHkgPSBUUlVFOworICAgICAgICAgICAgICAgIGlmIChleHBUaW1lTXMgPCBRQ0FNRVJBX01BWF9FWFBfVElNRV9MRVZFTDEpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwX3NldHRpbmdzLnZhbHVlID0gZXhwVGltZU5zOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGV4cF9zZXR0aW5ncy52YWx1ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKFFDQU1FUkFfTUFYX0VYUF9USU1FX0xFVkVMMSoxMDAwMDAwTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHBfc2V0dGluZ3MucHJldmlld09ubHkgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBleHBfc2V0dGluZ3MudmFsdWUgPSBleHBUaW1lTnM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vQmFzZWQgb24gZXhwb3N1cmUgdmFsdWVzIHdlIGNhbiBkZWNpZGUgdGhlIGNhcHR1cmUgdHlwZSBoZXJlCisgICAgICAgICAgICBpZiAoZ2V0TWFudWFsQ2FwdHVyZU1vZGUoKSAhPSBDQU1fTUFOVUFMX0NBUFRVUkVfVFlQRV9PRkYpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXhwVGltZU1zIDwgUUNBTUVSQV9NQVhfRVhQX1RJTUVfTEVWRUwxKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE1hbnVhbENhcHR1cmVNb2RlKENBTV9NQU5VQUxfQ0FQVFVSRV9UWVBFXzEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwVGltZU1zIDwgUUNBTUVSQV9NQVhfRVhQX1RJTUVfTEVWRUwyKSB7CisgICAgICAgICAgICAgICAgICAgIHNldE1hbnVhbENhcHR1cmVNb2RlKENBTV9NQU5VQUxfQ0FQVFVSRV9UWVBFXzIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhwVGltZU1zIDwgUUNBTUVSQV9NQVhfRVhQX1RJTUVfTEVWRUw0KSB7CisgICAgICAgICAgICAgICAgICAgIHNldE1hbnVhbENhcHR1cmVNb2RlKENBTV9NQU5VQUxfQ0FQVFVSRV9UWVBFXzMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNldE1hbnVhbENhcHR1cmVNb2RlKENBTV9NQU5VQUxfQ0FQVFVSRV9UWVBFX09GRik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9FWFBPU1VSRV9USU1FLAorICAgICAgICAgICAgICAgICAgICBleHBfc2V0dGluZ3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fZXhwVGltZSA9IGV4cFRpbWVOczsKKworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HRSgiSW52YWxpZCBleHBvc3VyZSB0aW1lLCB2YWx1ZTogJXMiLAorICAgICAgICAgIChleHBUaW1lU3RyID09IE5VTEwpID8gIk5VTEwiIDogZXhwVGltZVN0cik7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRMb25nc2hvdEVuYWJsZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgYSBmbGFnIGluZGljYXRpbmcgbG9uZ3Nob3QgbW9kZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZW5hYmxlICA6IHRydWUgLSBMb25nc2hvdCBlbmFibGVkCisgKiAgICAgICAgICAgICAgZmFsc2UgLSBMb25nc2hvdCBkaXNhYmxlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldExvbmdzaG90RW5hYmxlKGJvb2wgZW5hYmxlKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpbnQ4X3QgdmFsdWUgPSBlbmFibGUgPyAxIDogMDsKKworICAgIGlmKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwICkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX0xPTkdTSE9UX0VOQUJMRSwgdmFsdWUpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByYyA9IGNvbW1pdFNldEJhdGNoKCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBwYXJhbWV0ZXIgY2hhbmdlcyIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgbV9iTG9uZ3Nob3RFbmFibGVkID0gZW5hYmxlOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEZsYXNoCisgKgorICogREVTQ1JJUFRJT046IHNldCBmbGFzaCBtb2RlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmbGFzaFN0ciA6IExFRCBmbGFzaCBtb2RlIHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEZsYXNoKGNvbnN0IGNoYXIgKmZsYXNoU3RyKQoreworICAgIGlmIChmbGFzaFN0ciAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgdmFsdWUgPSBsb29rdXBBdHRyKEZMQVNIX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoRkxBU0hfTU9ERVNfTUFQKSwgZmxhc2hTdHIpOworICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIExPR0goIlNldHRpbmcgRmxhc2ggdmFsdWUgJXMiLCBmbGFzaFN0cik7CisgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9GTEFTSF9NT0RFLCBmbGFzaFN0cik7CisgICAgICAgICAgICBtRmxhc2hWYWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIExPR0UoIkludmFsaWQgZmxhc2ggdmFsdWU6ICVzIiwgKGZsYXNoU3RyID09IE5VTEwpID8gIk5VTEwiIDogZmxhc2hTdHIpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdXBkYXRlRmxhc2hNb2RlCisgKgorICogREVTQ1JJUFRJT046IHVwZGF0ZSBmbGFzaCBtb2RlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmbGFzaFN0ciA6IExFRCBmbGFzaCBtb2RlIHZhbHVlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6dXBkYXRlRmxhc2hNb2RlKGNhbV9mbGFzaF9tb2RlX3QgZmxhc2hfbW9kZSkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgaWYgKGZsYXNoX21vZGUgPj0gQ0FNX0ZMQVNIX01PREVfTUFYKSB7CisgICAgICAgIExPR0goIkVycm9yISEgSW52YWxpZCBmbGFzaCBtb2RlICglZCkiLCBmbGFzaF9tb2RlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgTE9HSCgiU2V0dGluZyBGbGFzaCBtb2RlIGZyb20gRVpUdW5lICVkIiwgZmxhc2hfbW9kZSk7CisKKyAgICBjb25zdCBjaGFyICpmbGFzaF9tb2RlX3N0ciA9IGxvb2t1cE5hbWVCeVZhbHVlKEZMQVNIX01PREVTX01BUCwKKyAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKEZMQVNIX01PREVTX01BUCksIGZsYXNoX21vZGUpOworICAgIGlmKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwICkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKyAgICByYyA9IHNldEZsYXNoKGZsYXNoX21vZGVfc3RyKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHVwZGF0ZSBGbGFzaCBtb2RlIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBMT0dIKCJTZXR0aW5nIEZsYXNoIG1vZGUgJWQiLCBtRmxhc2hWYWx1ZSk7CisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fTEVEX01PREUsIG1GbGFzaFZhbHVlKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IGxlZCBtb2RlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCgpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gY29tbWl0IHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbmZpZ3VyZUZsYXNoCisgKgorICogREVTQ1JJUFRJT046IGNvbmZpZ3VyZSBGbGFzaCBCcmFja2V0aW5nLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICAgQGZyYW1lX2NvbmZpZyA6IG91dHB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSB0byBmaWxsIGluLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmNvbmZpZ3VyZUZsYXNoKGNhbV9jYXB0dXJlX2ZyYW1lX2NvbmZpZ190ICZmcmFtZV9jb25maWcpCit7CisgICAgTE9HSCgiRSIpOworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICB1aW50MzJfdCBpID0gMDsKKworICAgIGlmIChpc0Nocm9tYUZsYXNoRW5hYmxlZCgpKSB7CisKKyAgICAgICAgcmMgPSBzZXRUb25lTWFwTW9kZShmYWxzZSwgZmFsc2UpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgdG9uZSBtYXAiKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gc2V0Q0RTTW9kZShDQU1fQ0RTX01PREVfT0ZGLCBmYWxzZSk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBjc2QgbW9kZSIpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisKKyAgICAgICAgTE9HSCgiRW5hYmxlIENocm9tYSBGbGFzaCBjYXB0dXJlIik7CisgICAgICAgIGNhbV9mbGFzaF9tb2RlX3QgZmxhc2hfbW9kZSA9IENBTV9GTEFTSF9NT0RFX09GRjsKKyAgICAgICAgZnJhbWVfY29uZmlnLm51bV9iYXRjaCA9CisgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+Y2hyb21hX2ZsYXNoX3NldHRpbmdzX25lZWQuYnVyc3RfY291bnQ7CisgICAgICAgIGlmIChmcmFtZV9jb25maWcubnVtX2JhdGNoID4gQ0FNX01BWF9GTEFTSF9CUkFDS0VUSU5HKSB7CisgICAgICAgICAgICBmcmFtZV9jb25maWcubnVtX2JhdGNoID0gQ0FNX01BWF9GTEFTSF9CUkFDS0VUSU5HOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZV9jb25maWcubnVtX2JhdGNoOyBpKyspIHsKKyAgICAgICAgICAgIGZsYXNoX21vZGUgPSAobV9wQ2FwYWJpbGl0eS0+Y2hyb21hX2ZsYXNoX3NldHRpbmdzX25lZWQuZmxhc2hfYnJhY2tldGluZ1tpXSkgPworICAgICAgICAgICAgICAgICAgICBDQU1fRkxBU0hfTU9ERV9PTjpDQU1fRkxBU0hfTU9ERV9PRkY7CisgICAgICAgICAgICBmcmFtZV9jb25maWcuY29uZmlnc1tpXS5udW1fZnJhbWVzID0gMTsKKyAgICAgICAgICAgIGZyYW1lX2NvbmZpZy5jb25maWdzW2ldLnR5cGUgPSBDQU1fQ0FQVFVSRV9GTEFTSDsKKyAgICAgICAgICAgIGZyYW1lX2NvbmZpZy5jb25maWdzW2ldLmZsYXNoX21vZGUgPSBmbGFzaF9tb2RlOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtRmxhc2hWYWx1ZSAhPSBDQU1fRkxBU0hfTU9ERV9PRkYpIHsKKyAgICAgICAgZnJhbWVfY29uZmlnLm51bV9iYXRjaCA9IDE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZV9jb25maWcubnVtX2JhdGNoOyBpKyspIHsKKyAgICAgICAgICAgIGZyYW1lX2NvbmZpZy5jb25maWdzW2ldLm51bV9mcmFtZXMgPSBnZXROdW1PZlNuYXBzaG90cygpOworICAgICAgICAgICAgZnJhbWVfY29uZmlnLmNvbmZpZ3NbaV0udHlwZSA9IENBTV9DQVBUVVJFX0ZMQVNIOworICAgICAgICAgICAgZnJhbWVfY29uZmlnLmNvbmZpZ3NbaV0uZmxhc2hfbW9kZSA9KGNhbV9mbGFzaF9tb2RlX3QpbUZsYXNoVmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dEKCJGbGFzaCBmcmFtZSBiYXRjaCBjbnQgPSAlZCIsZnJhbWVfY29uZmlnLm51bV9iYXRjaCk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbmZpZ3VyZUhEUkJyYWNrZXRpbmcKKyAqCisgKiBERVNDUklQVElPTjogY29uZmlndXJlIEhEUiBCcmFja2V0aW5nLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICAgQGZyYW1lX2NvbmZpZyA6IG91dHB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSB0byBmaWxsIGluLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmNvbmZpZ3VyZUhEUkJyYWNrZXRpbmcoY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QgJmZyYW1lX2NvbmZpZykKK3sKKyAgICBMT0dIKCJFIik7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIHVpbnQzMl90IGkgPSAwOworCisgICAgdWludDMyX3QgaGRyRnJhbWVDb3VudCA9IG1fcENhcGFiaWxpdHktPmhkcl9icmFja2V0aW5nX3NldHRpbmcubnVtX2ZyYW1lczsKKyAgICBMT0dIKCJIRFIgdmFsdWVzICVkLCAlZCBmcmFtZSBjb3VudDogJXUiLAorICAgICAgICAgIChpbnQ4X3QpIG1fcENhcGFiaWxpdHktPmhkcl9icmFja2V0aW5nX3NldHRpbmcuZXhwX3ZhbC52YWx1ZXNbMF0sCisgICAgICAgICAgKGludDhfdCkgbV9wQ2FwYWJpbGl0eS0+aGRyX2JyYWNrZXRpbmdfc2V0dGluZy5leHBfdmFsLnZhbHVlc1sxXSwKKyAgICAgICAgICBoZHJGcmFtZUNvdW50KTsKKworICAgIGZyYW1lX2NvbmZpZy5udW1fYmF0Y2ggPSBoZHJGcmFtZUNvdW50OworCisgICAgY2FtX2JyYWNrZXRfbW9kZSBtb2RlID0KKyAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPmhkcl9icmFja2V0aW5nX3NldHRpbmcuZXhwX3ZhbC5tb2RlOworICAgIGlmIChtb2RlID09IENBTV9FWFBfQlJBQ0tFVElOR19PTikgeworICAgICAgICByYyA9IHNldFRvbmVNYXBNb2RlKGZhbHNlLCB0cnVlKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dXKCJGYWlsZWQgdG8gZGlzYWJsZSB0b25lIG1hcCBkdXJpbmcgSERSIik7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lX2NvbmZpZy5udW1fYmF0Y2g7IGkrKykgeworICAgICAgICBmcmFtZV9jb25maWcuY29uZmlnc1tpXS5udW1fZnJhbWVzID0gMTsKKyAgICAgICAgZnJhbWVfY29uZmlnLmNvbmZpZ3NbaV0udHlwZSA9IENBTV9DQVBUVVJFX0JSQUNLRVRJTkc7CisgICAgICAgIGZyYW1lX2NvbmZpZy5jb25maWdzW2ldLmhkcl9tb2RlLm1vZGUgPSBtb2RlOworICAgICAgICBmcmFtZV9jb25maWcuY29uZmlnc1tpXS5oZHJfbW9kZS52YWx1ZXMgPQorICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPmhkcl9icmFja2V0aW5nX3NldHRpbmcuZXhwX3ZhbC52YWx1ZXNbaV07CisgICAgICAgIExPR0QoImV4cCB2YWx1ZXMgJWQiLAorICAgICAgICAgICAgICAgIChpbnQpZnJhbWVfY29uZmlnLmNvbmZpZ3NbaV0uaGRyX21vZGUudmFsdWVzKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbmZpZ3VyZUFFQnJhY2tldGluZworICoKKyAqIERFU0NSSVBUSU9OOiBjb25maWd1cmUgQUUgQnJhY2tldGluZy4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgIEBmcmFtZV9jb25maWcgOiBvdXRwdXQgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgdG8gZmlsbCBpbi4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpjb25maWd1cmVBRUJyYWNrZXRpbmcoY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QgJmZyYW1lX2NvbmZpZykKK3sKKyAgICBMT0dIKCJFIik7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIHVpbnQzMl90IGkgPSAwOworICAgIGNoYXIgZXhwX3ZhbHVlW01BWF9FWFBfQlJBQ0tFVElOR19MRU5HVEhdOworCisgICAgcmMgPSBzZXRUb25lTWFwTW9kZShmYWxzZSwgdHJ1ZSk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0goIkZhaWxlZCB0byBkaXNhYmxlIHRvbmUgbWFwIGR1cmluZyBBRUJyYWNrZXRpbmciKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBidXJzdENvdW50ID0gMDsKKyAgICBjb25zdCBjaGFyICpzdHJfdmFsID0gbV9BRUJyYWNrZXRpbmdDbGllbnQudmFsdWVzOworICAgIGlmICgoc3RyX3ZhbCAhPSBOVUxMKSAmJiAoc3RybGVuKHN0cl92YWwpID4gMCkpIHsKKyAgICAgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgICAgICBzdHJsY3B5KHByb3AsIHN0cl92YWwsIFBST1BFUlRZX1ZBTFVFX01BWCk7CisgICAgICAgIGNoYXIgKnNhdmVwdHIgPSBOVUxMOworICAgICAgICBjaGFyICp0b2tlbiA9IHN0cnRva19yKHByb3AsICIsIiwgJnNhdmVwdHIpOworICAgICAgICBpZiAodG9rZW4gIT0gTlVMTCkgeworICAgICAgICAgICAgZXhwX3ZhbHVlW2J1cnN0Q291bnQrK10gPSAoY2hhcilhdG9pKHRva2VuKTsKKyAgICAgICAgICAgIHdoaWxlICh0b2tlbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdG9rZW4gPSBzdHJ0b2tfcihOVUxMLCAiLCIsICZzYXZlcHRyKTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBleHBfdmFsdWVbYnVyc3RDb3VudCsrXSA9IChjaGFyKWF0b2kodG9rZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZyYW1lX2NvbmZpZy5udW1fYmF0Y2ggPSBidXJzdENvdW50OworICAgIGNhbV9icmFja2V0X21vZGUgbW9kZSA9IG1fQUVCcmFja2V0aW5nQ2xpZW50Lm1vZGU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVfY29uZmlnLm51bV9iYXRjaDsgaSsrKSB7CisgICAgICAgIGZyYW1lX2NvbmZpZy5jb25maWdzW2ldLm51bV9mcmFtZXMgPSAxOworICAgICAgICBmcmFtZV9jb25maWcuY29uZmlnc1tpXS50eXBlID0gQ0FNX0NBUFRVUkVfQlJBQ0tFVElORzsKKyAgICAgICAgZnJhbWVfY29uZmlnLmNvbmZpZ3NbaV0uaGRyX21vZGUubW9kZSA9IG1vZGU7CisgICAgICAgIGZyYW1lX2NvbmZpZy5jb25maWdzW2ldLmhkcl9tb2RlLnZhbHVlcyA9CisgICAgICAgICAgICAgICAgbV9BRUJyYWNrZXRpbmdDbGllbnQudmFsdWVzW2ldOworICAgICAgICBMT0dEKCJleHAgdmFsdWVzICVkIiwgKGludCltX0FFQnJhY2tldGluZ0NsaWVudC52YWx1ZXNbaV0pOworICAgIH0KKworICAgIExPR0goIm51bV9mcmFtZSA9ICVkIFgiLCBidXJzdENvdW50KTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY29uZmlndXJlTG93TGlnaHQKKyAqCisgKiBERVNDUklQVElPTjogY29uZmlndXJlIGxvdyBsaWdodCBmcmFtZSBjYXB0dXJlIHVzZSBjYXNlLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICAgQGZyYW1lX2NvbmZpZyA6IG91dHB1dCBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSB0byBmaWxsIGluLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmNvbmZpZ3VyZUxvd0xpZ2h0KGNhbV9jYXB0dXJlX2ZyYW1lX2NvbmZpZ190ICZmcmFtZV9jb25maWcpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgZnJhbWVfY29uZmlnLm51bV9iYXRjaCA9IDE7CisgICAgZnJhbWVfY29uZmlnLmNvbmZpZ3NbMF0ubnVtX2ZyYW1lcyA9IGdldE51bU9mU25hcHNob3RzKCk7CisgICAgZnJhbWVfY29uZmlnLmNvbmZpZ3NbMF0udHlwZSA9IENBTV9DQVBUVVJFX0xPV19MSUdIVDsKKyAgICBmcmFtZV9jb25maWcuY29uZmlnc1swXS5sb3dfbGlnaHRfbW9kZSA9IENBTV9MT1dfTElHSFRfT047CisgICAgTE9HSCgiU25hcHNob3QgQ291bnQ6ICVkIiwgZnJhbWVfY29uZmlnLmNvbmZpZ3NbMF0ubnVtX2ZyYW1lcyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbmZpZ3VyZU1hbnVhbENhcHR1cmUKKyAqCisgKiBERVNDUklQVElPTjogY29uZmlndXJlIG1hbnVhbCBjYXB0dXJlLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICAgQGZyYW1lX2NvbmZpZyA6IG91dHB1dCBjb25maWdhcmF0aW9uIHN0cnVjdHVyZSB0byBmaWxsIGluLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmNvbmZpZ3VyZU1hbnVhbENhcHR1cmUoY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QgJmZyYW1lX2NvbmZpZykKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgdWludDMyX3QgaSA9IDA7CisKKyAgICBMT0dEKCJFIik7CisgICAgaWYgKGdldE1hbnVhbENhcHR1cmVNb2RlKCkpIHsKKyAgICAgICAgZnJhbWVfY29uZmlnLm51bV9iYXRjaCA9IDE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZV9jb25maWcubnVtX2JhdGNoOyBpKyspIHsKKyAgICAgICAgICAgIGZyYW1lX2NvbmZpZy5jb25maWdzW2ldLm51bV9mcmFtZXMgPSBnZXROdW1PZlNuYXBzaG90cygpOworICAgICAgICAgICAgZnJhbWVfY29uZmlnLmNvbmZpZ3NbaV0udHlwZSA9IENBTV9DQVBUVVJFX01BTlVBTF8zQTsKKyAgICAgICAgICAgIGlmIChtX2V4cFRpbWUgIT0gMCkgeworICAgICAgICAgICAgICAgIGZyYW1lX2NvbmZpZy5jb25maWdzW2ldLm1hbnVhbF8zQV9tb2RlLmV4cF9tb2RlID0gQ0FNX1NFVFRJTkdTX1RZUEVfT047CisgICAgICAgICAgICAgICAgZnJhbWVfY29uZmlnLmNvbmZpZ3NbaV0ubWFudWFsXzNBX21vZGUuZXhwX3RpbWUgPSBtX2V4cFRpbWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZyYW1lX2NvbmZpZy5jb25maWdzW2ldLm1hbnVhbF8zQV9tb2RlLmV4cF9tb2RlID0gQ0FNX1NFVFRJTkdTX1RZUEVfQVVUTzsKKyAgICAgICAgICAgICAgICBmcmFtZV9jb25maWcuY29uZmlnc1tpXS5tYW51YWxfM0FfbW9kZS5leHBfdGltZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtX2lzb1ZhbHVlICE9IDApIHsKKyAgICAgICAgICAgICAgICBmcmFtZV9jb25maWcuY29uZmlnc1tpXS5tYW51YWxfM0FfbW9kZS5pc29fbW9kZSA9IENBTV9TRVRUSU5HU19UWVBFX09OOworICAgICAgICAgICAgICAgIGZyYW1lX2NvbmZpZy5jb25maWdzW2ldLm1hbnVhbF8zQV9tb2RlLmlzb192YWx1ZSA9IG1faXNvVmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZyYW1lX2NvbmZpZy5jb25maWdzW2ldLm1hbnVhbF8zQV9tb2RlLmlzb19tb2RlID0gQ0FNX1NFVFRJTkdTX1RZUEVfQVVUTzsKKyAgICAgICAgICAgICAgICBmcmFtZV9jb25maWcuY29uZmlnc1tpXS5tYW51YWxfM0FfbW9kZS5pc29fdmFsdWUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIExPR0QoIlg6IGJhdGNoIGNudCA9ICVkIiwgZnJhbWVfY29uZmlnLm51bV9iYXRjaCk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbmZpZ0ZyYW1lQ2FwdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBjb25maWd1cmF0aW9uIGZvciBaU0wgc3BlY2lhbCBjYXB0dXJlcyAoRkxBU0gvSERSIGV0YykKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNvbW1pdFNldHRpbmdzIDogZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSBjb21taXQgdGhpcyB0aGlzIHNldHRpbmdzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Y29uZmlnRnJhbWVDYXB0dXJlKGJvb2wgY29tbWl0U2V0dGluZ3MpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGludDMyX3QgdmFsdWU7CisKKyAgICBtZW1zZXQoJm1fY2FwdHVyZUZyYW1lQ29uZmlnLCAwLCBzaXplb2YoY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QpKTsKKworICAgIGlmIChjb21taXRTZXR0aW5ncykgeworICAgICAgICBpZihpbml0QmF0Y2hVcGRhdGUobV9wUGFyYW1CdWYpIDwgMCApIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGdyb3VwIHVwZGF0ZSB0YWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzSERSRW5hYmxlZCgpIHx8IG1fYkFlQnJhY2tldGluZ0VuYWJsZWQgfHwgbV9iQUZCcmFja2V0aW5nT24gfHwKKyAgICAgICAgICBtX2JPcHRpWm9vbU9uIHx8IG1fYlJlRm9jdXNPbiB8fCBnZXRNYW51YWxDYXB0dXJlTW9kZSgpKSB7CisgICAgICAgIHZhbHVlID0gQ0FNX0ZMQVNIX01PREVfT0ZGOworICAgIH0gZWxzZSBpZiAoaXNDaHJvbWFGbGFzaEVuYWJsZWQoKSkgeworICAgICAgICB2YWx1ZSA9IENBTV9GTEFTSF9NT0RFX09OOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbHVlID0gbUZsYXNoVmFsdWU7CisgICAgfQorCisgICAgaWYgKG1fTG93TGlnaHRMZXZlbCAmJiAodmFsdWUgIT0gQ0FNX0ZMQVNIX01PREVfT04pKSB7CisgICAgICAgIGNvbmZpZ3VyZUxvd0xpZ2h0IChtX2NhcHR1cmVGcmFtZUNvbmZpZyk7CisKKyAgICAgICAgLy9BZGRlZCByZXNldCBjYXB0dXJlIHR5cGUgYXMgYSBsYXN0IGJhdGNoIGZvciBiYWNrLWVuZCB0byByZXN0b3JlIHNldHRpbmdzLgorICAgICAgICBpbnQzMl90IGJhdGNoX2NvdW50ID0gbV9jYXB0dXJlRnJhbWVDb25maWcubnVtX2JhdGNoOworICAgICAgICBtX2NhcHR1cmVGcmFtZUNvbmZpZy5jb25maWdzW2JhdGNoX2NvdW50XS50eXBlID0gQ0FNX0NBUFRVUkVfUkVTRVQ7CisgICAgICAgIG1fY2FwdHVyZUZyYW1lQ29uZmlnLmNvbmZpZ3NbYmF0Y2hfY291bnRdLm51bV9mcmFtZXMgPSAwOworICAgICAgICBtX2NhcHR1cmVGcmFtZUNvbmZpZy5udW1fYmF0Y2grKzsKKyAgICB9IGVsc2UgaWYgKHZhbHVlICE9IENBTV9GTEFTSF9NT0RFX09GRikgeworICAgICAgICBjb25maWd1cmVGbGFzaChtX2NhcHR1cmVGcmFtZUNvbmZpZyk7CisgICAgfSBlbHNlIGlmKGlzSERSRW5hYmxlZCgpKSB7CisgICAgICAgIGNvbmZpZ3VyZUhEUkJyYWNrZXRpbmcgKG1fY2FwdHVyZUZyYW1lQ29uZmlnKTsKKyAgICB9IGVsc2UgaWYoaXNBRUJyYWNrZXRFbmFibGVkKCkpIHsKKyAgICAgICAgY29uZmlndXJlQUVCcmFja2V0aW5nIChtX2NhcHR1cmVGcmFtZUNvbmZpZyk7CisgICAgfSBlbHNlIGlmIChnZXRNYW51YWxDYXB0dXJlTW9kZSgpID49IENBTV9NQU5VQUxfQ0FQVFVSRV9UWVBFXzIpeworICAgICAgICByYyA9IGNvbmZpZ3VyZU1hbnVhbENhcHR1cmUgKG1fY2FwdHVyZUZyYW1lQ29uZmlnKTsKKyAgICAgICAgLy9BZGRlZCByZXNldCBjYXB0dXJlIHR5cGUgYXMgYSBsYXN0IGJhdGNoIGZvciBiYWNrLWVuZCB0byByZXN0b3JlIHNldHRpbmdzLgorICAgICAgICBpbnQzMl90IGJhdGNoX2NvdW50ID0gbV9jYXB0dXJlRnJhbWVDb25maWcubnVtX2JhdGNoOworICAgICAgICBtX2NhcHR1cmVGcmFtZUNvbmZpZy5jb25maWdzW2JhdGNoX2NvdW50XS50eXBlID0gQ0FNX0NBUFRVUkVfUkVTRVQ7CisgICAgICAgIG1fY2FwdHVyZUZyYW1lQ29uZmlnLmNvbmZpZ3NbYmF0Y2hfY291bnRdLm51bV9mcmFtZXMgPSAwOworICAgICAgICBtX2NhcHR1cmVGcmFtZUNvbmZpZy5udW1fYmF0Y2grKzsKKyAgICB9CisKKyAgICByYyA9IEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fQ0FQVFVSRV9GUkFNRV9DT05GSUcsCisgICAgICAgICAgICAoY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QpbV9jYXB0dXJlRnJhbWVDb25maWcpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBjYXB0dXJlIHNldHRpbmdzIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAoY29tbWl0U2V0dGluZ3MpIHsKKyAgICAgICAgcmMgPSBjb21taXRTZXRCYXRjaCgpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBjb21taXQgcGFyYW1ldGVycyIpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZXNldEZyYW1lQ2FwdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiByZXNldCBzcGVjaWFsIGNhcHR1cmVzIHNldHRpbmdzKEZMQVNIL0hEUiBldGMpCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjb21taXRTZXR0aW5ncyA6IGZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgY29tbWl0IHRoaXMgdGhpcyBzZXR0aW5ncworICogICBAbG93TGlnaHRFbmFibGVkOiBmbGFnIHRvIGluZGljYXRlIGlmIGxvdyBsaWdodCBzY2VuZSBkZXRlY3RlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnJlc2V0RnJhbWVDYXB0dXJlKGJvb2wgY29tbWl0U2V0dGluZ3MsIGJvb2wgbG93TGlnaHRFbmFibGVkKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBtZW1zZXQoJm1fY2FwdHVyZUZyYW1lQ29uZmlnLCAwLCBzaXplb2YoY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QpKTsKKworICAgIGlmIChjb21taXRTZXR0aW5ncykgeworICAgICAgICBpZihpbml0QmF0Y2hVcGRhdGUobV9wUGFyYW1CdWYpIDwgMCApIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGdyb3VwIHVwZGF0ZSB0YWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzSERSRW5hYmxlZCgpIHx8IGlzQUVCcmFja2V0RW5hYmxlZCgpKSB7CisgICAgICAgIHJjID0gc2V0VG9uZU1hcE1vZGUodHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HSCgiRmFpbGVkIHRvIGVuYWJsZSB0b25lIG1hcCBkdXJpbmcgSERSL0FFQnJhY2tldGluZyIpOworICAgICAgICB9CisgICAgICAgIHJjID0gc3RvcEFFQnJhY2tldCgpOworICAgIH0gZWxzZSBpZiAoKGlzQ2hyb21hRmxhc2hFbmFibGVkKCkpIHx8IChtRmxhc2hWYWx1ZSAhPSBDQU1fRkxBU0hfTU9ERV9PRkYpCisgICAgICAgICAgICB8fCAobG93TGlnaHRFbmFibGVkID09IHRydWUpKSB7CisgICAgICAgIHJjID0gc2V0VG9uZU1hcE1vZGUodHJ1ZSwgZmFsc2UpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0goIkZhaWxlZCB0byBlbmFibGUgdG9uZSBtYXAgZHVyaW5nIGNocm9tYSBmbGFzaCIpOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBzZXRDRFNNb2RlKG1DZHNfbW9kZSwgZmFsc2UpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgY3NkIG1vZGUiKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJjID0gQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9DQVBUVVJFX0ZSQU1FX0NPTkZJRywKKyAgICAgICAgICAgIChjYW1fY2FwdHVyZV9mcmFtZV9jb25maWdfdCltX2NhcHR1cmVGcmFtZUNvbmZpZyk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IGNhcHR1cmUgc2V0dGluZ3MiKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmIChjb21taXRTZXR0aW5ncykgeworICAgICAgICByYyA9IGNvbW1pdFNldEJhdGNoKCk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGNvbW1pdCBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEFlY0xvY2sKKyAqCisgKiBERVNDUklQVElPTjogc2V0IEFFQyBsb2NrIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBhZWNMb2NrU3RyIDogQUVDIGxvY2sgdmFsdWUgc3RyaW5nCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0QWVjTG9jayhjb25zdCBjaGFyICphZWNMb2NrU3RyKQoreworICAgIGlmIChhZWNMb2NrU3RyICE9IE5VTEwpIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZSA9IGxvb2t1cEF0dHIoVFJVRV9GQUxTRV9NT0RFU19NQVAsIFBBUkFNX01BUF9TSVpFKFRSVUVfRkFMU0VfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICBhZWNMb2NrU3RyKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBMT0dIKCJTZXR0aW5nIEFFQ0xvY2sgdmFsdWUgJXMiLCBhZWNMb2NrU3RyKTsKKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX0FVVE9fRVhQT1NVUkVfTE9DSywgYWVjTG9ja1N0cik7CisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9BRUNfTE9DSywgKHVpbnQzMl90KXZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBBRUNMb2NrIHZhbHVlOiAlcyIsCisgICAgICAgIChhZWNMb2NrU3RyID09IE5VTEwpID8gIk5VTEwiIDogYWVjTG9ja1N0cik7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRBd2JMb2NrCisgKgorICogREVTQ1JJUFRJT046IHNldCBBV0IgbG9jayB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAYXdiTG9ja1N0ciA6IEFXQiBsb2NrIHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEF3YkxvY2soY29uc3QgY2hhciAqYXdiTG9ja1N0cikKK3sKKyAgICBpZiAoYXdiTG9ja1N0ciAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgdmFsdWUgPSBsb29rdXBBdHRyKFRSVUVfRkFMU0VfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShUUlVFX0ZBTFNFX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgYXdiTG9ja1N0cik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgTE9HSCgiU2V0dGluZyBBV0JMb2NrIHZhbHVlICVzIiwgYXdiTG9ja1N0cik7CisgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9BVVRPX1dISVRFQkFMQU5DRV9MT0NLLCBhd2JMb2NrU3RyKTsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLAorICAgICAgICAgICAgICAgICAgICBDQU1fSU5URl9QQVJNX0FXQl9MT0NLLCAodWludDMyX3QpdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dFKCJJbnZhbGlkIEFXQkxvY2sgdmFsdWU6ICVzIiwgKGF3YkxvY2tTdHIgPT0gTlVMTCkgPyAiTlVMTCIgOiBhd2JMb2NrU3RyKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldE1DRVZhbHVlCisgKgorICogREVTQ1JJUFRJT046IHNldCBtZW1vcnkgY29sb3IgZW5oYW5jZW1lbnQgdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1jZVN0ciA6IE1DRSB2YWx1ZSBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRNQ0VWYWx1ZShjb25zdCBjaGFyICptY2VTdHIpCit7CisgICAgaWYgKG1jZVN0ciAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgdmFsdWUgPSBsb29rdXBBdHRyKEVOQUJMRV9ESVNBQkxFX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShFTkFCTEVfRElTQUJMRV9NT0RFU19NQVApLCBtY2VTdHIpOworICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIExPR0goIlNldHRpbmcgQVdCTG9jayB2YWx1ZSAlcyIsIG1jZVN0cik7CisgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19NRU1PUllfQ09MT1JfRU5IQU5DRU1FTlQsIG1jZVN0cik7CisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9NQ0UsIHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBNQ0UgdmFsdWU6ICVzIiwgKG1jZVN0ciA9PSBOVUxMKSA/ICJOVUxMIiA6IG1jZVN0cik7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRUaW50bGVzc1ZhbHVlCisgKgorICogREVTQ1JJUFRJT046IGVuYWJsZS9kaXNhYmxlIHRpbnRsZXNzIGZyb20gdXNlciBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRUaW50bGVzc1ZhbHVlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfUUNfVElOVExFU1NfRU5BQkxFKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfVElOVExFU1NfRU5BQkxFKTsKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKworICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEudGludGxlc3MiLCBwcm9wLCBWQUxVRV9FTkFCTEUpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRUaW50bGVzc1ZhbHVlKHN0cik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgc3RyY21wKHByZXZfc3RyLCBwcm9wKSAhPSAwICkgeworICAgICAgICAgICAgc2V0VGludGxlc3NWYWx1ZShwcm9wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRUaW50bGVzcworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgdGludGxlc3MgbW9kZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZW5hYmxlIDogMSA9IGVuYWJsZSwgMCA9IGRpc2FibGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRUaW50bGVzcyhib29sIGVuYWJsZSkKK3sKKyAgICBpZiAoZW5hYmxlKSB7CisgICAgICAgIHNldFRpbnRsZXNzVmFsdWUoVkFMVUVfRU5BQkxFKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZXRUaW50bGVzc1ZhbHVlKFZBTFVFX0RJU0FCTEUpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRUaW50bGVzc1ZhbHVlCisgKgorICogREVTQ1JJUFRJT046IHNldCB0aW50bGVzcyB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAdGludFN0ciA6IFRpbnRsZXNzIHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFRpbnRsZXNzVmFsdWUoY29uc3QgY2hhciAqdGludFN0cikKK3sKKyAgICBpZiAodGludFN0ciAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgdmFsdWUgPSBsb29rdXBBdHRyKEVOQUJMRV9ESVNBQkxFX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShFTkFCTEVfRElTQUJMRV9NT0RFU19NQVApLCB0aW50U3RyKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBMT0dIKCJTZXR0aW5nIFRpbnRsZXNzIHZhbHVlICVzIiwgdGludFN0cik7CisgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19USU5UTEVTU19FTkFCTEUsIHRpbnRTdHIpOworICAgICAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fVElOVExFU1MsIHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBUaW50bGVzcyB2YWx1ZTogJXMiLCAodGludFN0ciA9PSBOVUxMKSA/ICJOVUxMIiA6IHRpbnRTdHIpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0Q0RTTW9kZQorICoKKyAqIERFU0NSSVBUSU9OOiBTZXQgQ0RTIG1vZGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldENEU01vZGUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19DRFNfTU9ERSk7CisgICAgY29uc3QgY2hhciAqcHJldl9zdHIgPSBnZXQoS0VZX1FDX0NEU19NT0RFKTsKKyAgICBjb25zdCBjaGFyICp2aWRlb19zdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19WSURFT19DRFNfTU9ERSk7CisgICAgY29uc3QgY2hhciAqdmlkZW9fcHJldl9zdHIgPSBnZXQoS0VZX1FDX1ZJREVPX0NEU19NT0RFKTsKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBpZiAobV9iUmVjb3JkaW5nSGludF9uZXcgPT0gdHJ1ZSkgeworICAgICAgICBpZiAodmlkZW9fc3RyKSB7CisgICAgICAgICAgICBpZiAoKHZpZGVvX3ByZXZfc3RyID09IE5VTEwpIHx8IChzdHJjbXAodmlkZW9fc3RyLCB2aWRlb19wcmV2X3N0cikgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNkc19tb2RlID0gbG9va3VwQXR0cihDRFNfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShDRFNfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX3N0cik7CisgICAgICAgICAgICAgICAgaWYgKGNkc19tb2RlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1ZJREVPX0NEU19NT0RFLCB2aWRlb19zdHIpOworICAgICAgICAgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9DRFNfTU9ERSwgY2RzX21vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgQ0RTIE1PREUgdG8gdXBkYXRlIHRhYmxlIik7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0QoIlNldCBDRFMgaW4gdmlkZW8gbW9kZSA9ICVkIiwgY2RzX21vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNkc19tb2RlID0gY2RzX21vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2JOZWVkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGFyZ3VtZW50IGZvciB2aWRlbyBDRFMgTU9ERSAlZCIsICBjZHNfbW9kZSk7CisgICAgICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgdmlkZW9fcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAgICAgbWVtc2V0KHZpZGVvX3Byb3AsIDAsIHNpemVvZih2aWRlb19wcm9wKSk7CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnZpZGVvLkNEUyIsIHZpZGVvX3Byb3AsIENEU19NT0RFX09OKTsKKyAgICAgICAgICAgIGludDMyX3QgY2RzX21vZGUgPSBsb29rdXBBdHRyKENEU19NT0RFU19NQVAsIFBBUkFNX01BUF9TSVpFKENEU19NT0RFU19NQVApLAorICAgICAgICAgICAgICAgICAgICB2aWRlb19wcm9wKTsKKyAgICAgICAgICAgIGlmIChjZHNfbW9kZSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1ZJREVPX0NEU19NT0RFLCB2aWRlb19wcm9wKTsKKyAgICAgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9DRFNfTU9ERSwgY2RzX21vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCBDRFMgTU9ERSB0byB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRCgiU2V0IENEUyBpbiB2aWRlbyBtb2RlIGZyb20gc2V0cHJvcCA9ICVkIiwgY2RzX21vZGUpOworICAgICAgICAgICAgICAgICAgICBtQ2RzX21vZGUgPSBjZHNfbW9kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIkludmFsaWQgcHJvcCBmb3IgdmlkZW8gQ0RTIE1PREUgJWQiLCAgY2RzX21vZGUpOworICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHN0cikgeworICAgICAgICAgICAgaWYgKChwcmV2X3N0ciA9PSBOVUxMKSB8fCAoc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjZHNfbW9kZSA9IGxvb2t1cEF0dHIoQ0RTX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoQ0RTX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICAgICAgICAgIGlmIChjZHNfbW9kZSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19DRFNfTU9ERSwgc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fQ0RTX01PREUsIGNkc19tb2RlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIENEUyBNT0RFIHRvIHVwZGF0ZSB0YWJsZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dEKCJTZXQgQ0RTIGluIGNhcHR1cmUgbW9kZSA9ICVkIiwgY2RzX21vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUNkc19tb2RlID0gY2RzX21vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2JOZWVkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBzbmFwc2hvdCBDRFMgTU9ERSAlZCIsICBjZHNfbW9kZSk7CisgICAgICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLkNEUyIsIHByb3AsIENEU19NT0RFX09OKTsKKyAgICAgICAgICAgIGludDMyX3QgY2RzX21vZGUgPSBsb29rdXBBdHRyKENEU19NT0RFU19NQVAsIFBBUkFNX01BUF9TSVpFKENEU19NT0RFU19NQVApLAorICAgICAgICAgICAgICAgICAgICBwcm9wKTsKKyAgICAgICAgICAgIGlmIChjZHNfbW9kZSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX0NEU19NT0RFLCBwcm9wKTsKKyAgICAgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9DRFNfTU9ERSwgY2RzX21vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCBDRFMgTU9ERSB0byB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRCgiU2V0IENEUyBpbiBzbmFwc2hvdCBtb2RlIGZyb20gc2V0cHJvcCA9ICVkIiwgY2RzX21vZGUpOworICAgICAgICAgICAgICAgICAgICBtQ2RzX21vZGUgPSBjZHNfbW9kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIkludmFsaWQgcHJvcCBmb3Igc25hcHNob3QgQ0RTIE1PREUgJWQiLCAgY2RzX21vZGUpOworICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEluaXRpYWxFeHBvc3VyZUluZGV4CisgKgorICogREVTQ1JJUFRJT046IFNldCBpbml0aWFsIGV4cG9zdXJlIGluZGV4IHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRJbml0aWFsRXhwb3N1cmVJbmRleChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpbnQgdmFsdWUgPSAtMTsKKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19JTklUSUFMX0VYUE9TVVJFX0lOREVYKTsKKyAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfSU5JVElBTF9FWFBPU1VSRV9JTkRFWCk7CisgICAgaWYgKHN0cikgeworICAgICAgICBpZiAoKHByZXZfc3RyID09IE5VTEwpIHx8IChzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gYXRvaShzdHIpOworICAgICAgICAgICAgTE9HRCgiU2V0IGluaXRpYWwgZXhwb3N1cmUgaW5kZXggdmFsdWUgZnJvbSBwYXJhbSA9ICVkIiwgdmFsdWUpOworICAgICAgICAgICAgaWYgKHZhbHVlID49IDApIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19JTklUSUFMX0VYUE9TVVJFX0lOREVYLCBzdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmluaXRpYWwuZXhwLnZhbCIsIHByb3AsICIiKTsKKyAgICAgICAgaWYgKChzdHJsZW4ocHJvcCkgPiAwKSAmJgorICAgICAgICAgICAgICAgICggKHByZXZfc3RyID09IE5VTEwpIHx8IChzdHJjbXAocHJvcCwgcHJldl9zdHIpICE9IDApKSkgeworICAgICAgICAgICAgdmFsdWUgPSBhdG9pKHByb3ApOworICAgICAgICAgICAgTE9HRCgiU2V0IGluaXRpYWwgZXhwb3N1cmUgaW5kZXggdmFsdWUgZnJvbSBzZXRwcm9wID0gJWQiLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgPj0gMCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX0lOSVRJQUxfRVhQT1NVUkVfSU5ERVgsIHByb3ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZhbHVlID49IDApIHsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9JTklUSUFMX0VYUE9TVVJFX0lOREVYLCAodWludDMyX3QpdmFsdWUpKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gdXBkYXRlIGluaXRpYWwgZXhwb3N1cmUgaW5kZXggdmFsdWUiKTsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiSW52YWxpZCB2YWx1ZSBmb3IgaW5pdGlhbCBleHBvc3VyZSBpbmRleCB2YWx1ZSAlZCIsIHZhbHVlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0SW5zdGFudENhcHR1cmUKKyAqCisgKiBERVNDUklQVElPTjogU2V0IEluc3RhbnQgQ2FwdHVyZSByZWxhdGVkIHBhcmFtcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IHVzZXIgc2V0dGluZyBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0SW5zdGFudENhcHR1cmUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcykKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgaW50IHZhbHVlID0gLTE7CisgICAgLy8gQ2hlY2sgZm9yIGluc3RhbnQgY2FwdHVyZSwgdGhpcyB3aWxsIGVuYWJsZSBpbnN0YW50IEFFQyBhcyB3ZWxsLgorICAgIC8vIFRoaXMgcGFyYW0gd2lsbCB0cmlnZ2VyIHRoZSBpbnN0YW50IEFFQyBwYXJhbSB0byBiYWNrZW5kCisgICAgLy8gQW5kIGFsc28gd2lsbCBiZSB1c2VmdWwgZm9yIGluc3RhbnQgY2FwdHVyZS4KKyAgICBjb25zdCBjaGFyICpzdHIgPSBwYXJhbXMuZ2V0KEtFWV9RQ19JTlNUQU5UX0NBUFRVUkUpOworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19JTlNUQU5UX0NBUFRVUkUpOworICAgIGlmIChzdHIpIHsKKyAgICAgICAgaWYgKChwcmV2X3N0ciA9PSBOVUxMKSB8fCAoc3RyY21wKHN0ciwgcHJldl9zdHIpICE9IDApKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGxvb2t1cEF0dHIoSU5TVEFOVF9DQVBUVVJFX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoSU5TVEFOVF9DQVBUVVJFX01PREVTX01BUCksIHN0cik7CisgICAgICAgICAgICBMT0dEKCJTZXQgaW5zdGFudCBDYXB0dXJlIGZyb20gcGFyYW0gPSAlZCIsIHZhbHVlKTsKKyAgICAgICAgICAgIGlmKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfSU5TVEFOVF9DQVBUVVJFLCBzdHIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHZhbHVlIGZvciBpbnN0YW50IGNhcHR1cmUgJXMiLCBzdHIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuaW5zdGFudC5jYXB0dXJlIiwgcHJvcCwgS0VZX1FDX0lOU1RBTlRfQ0FQVFVSRV9ESVNBQkxFKTsKKyAgICAgICAgaWYgKChwcmV2X3N0ciA9PSBOVUxMKSB8fCAoc3RyY21wKHByb3AsIHByZXZfc3RyKSAhPSAwKSkgeworICAgICAgICAgICAgdmFsdWUgPSBsb29rdXBBdHRyKElOU1RBTlRfQ0FQVFVSRV9NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKElOU1RBTlRfQ0FQVFVSRV9NT0RFU19NQVApLCBwcm9wKTsKKyAgICAgICAgICAgIExPR0QoIlNldCBpbnN0YW50IGNhcHR1cmUgZnJvbSBzZXRwcm9wID0gJWQiLCB2YWx1ZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19JTlNUQU5UX0NBUFRVUkUsIHByb3ApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHZhbHVlIGZvciBpbnN0YW50IGNhcHR1cmUgJXMiLCBwcm9wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IGluc3RhbnQgQUVDIHBhcmFtIHRvIHRoZSBiYWNrZW5kIGZvciBlaXRoZXIgaW5zdGFudCBjYXB0dXJlIG9yIGluc3RhbnQgQUVDCisgICAgLy8gMCAtIGRpc2JhbGUgKG5vcm1hbCBBRUMpCisgICAgLy8gMSAtIEFnZ3Jlc3NpdmUgQUVDIChhbGdvIHVzZWQgaW4gYmFja2VuZCkKKyAgICAvLyAyIC0gRmFzdCBBRUMgKGFsZ28gdXNlZCBpbiBiYWNrZW5kKQorICAgIGlmICh2YWx1ZSAhPSBOQU1FX05PVF9GT1VORCAmJiB2YWx1ZSAhPSAtMSkgeworICAgICAgICBtX2JJbnN0YW50Q2FwdHVyZSA9ICh2YWx1ZSA+IDApPyB0cnVlIDogZmFsc2U7CisgICAgICAgIHNldEluc3RhbnRBRUMoKHVpbnQ4X3QpdmFsdWUsIGZhbHNlKTsKKyAgICB9CisKKworICAgIC8vIGdldCBmcmFtZSBhZWMgYm91bmQgdmFsdWUgZnJvbSBzZXRwcm9wLgorICAgIC8vIFRoaXMgdmFsdWUgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgZnJhbWVzLCBjYW1lcmEgaW50ZXJmYWNlCisgICAgLy8gd2lsbCB3YWl0IGZvciBnZXR0aW5nIHRoZSBpbnN0YW50IGNhcHR1cmUgZnJhbWUuCisgICAgLy8gRGVmYXVsdCB2YWx1ZSBzZXQgdG8gNy4KKyAgICAvLyBUaGlzIHZhbHVlIGFsc28gaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgZnJhbWVzLCB0aGF0IEhBTAorICAgIC8vIHdpbGwgbm90IGRpc3BsYXkgYW5kIHdpbGwgbm90IHNlbmQgcHJldmlldyBmcmFtZXMgdG8gYXBwCisgICAgLy8gVGhpcyB3aWxsIGJlIGFwcGxpY2FibGUgb25seSBpZiBpbnN0YW50IGNhcHR1cmUgaXMgc2V0LgorICAgIGlmIChtX2JJbnN0YW50Q2FwdHVyZSkgeworICAgICAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuYWUuY2FwdHVyZS5ib3VuZCIsIHByb3AsICI3Iik7CisgICAgICAgIGludDMyX3QgZnJhbWVfYm91bmQgPSBhdG9pKHByb3ApOworICAgICAgICBpZiAoZnJhbWVfYm91bmQgPj0gMCkgeworICAgICAgICAgICAgbUFlY0ZyYW1lQm91bmQgPSAodWludDhfdClmcmFtZV9ib3VuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgcHJvcCBmb3IgYWVjIGZyYW1lIGJvdW5kICVkIiwgZnJhbWVfYm91bmQpOworICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEluc3RhbnRBRUMKKyAqCisgKiBERVNDUklQVElPTjogU2V0IEluc3RhbnQgQUVDIHJlbGF0ZWQgcGFyYW1zCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRJbnN0YW50QUVDKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGludCB2YWx1ZSA9IC0xOworCisgICAgLy8gQ2hlY2sgZm9yIGluc3RhbnQgQUVDIG9ubHkgd2hlbiBpbnN0YW50IGNhcHR1cmUgaXMgbm90IGVuYWJsZWQuCisgICAgLy8gSW5zdGFudCBjYXB0dXJlIGFscmVhZHkgdGFrZXMgY2FyZSBvZiB0aGUgaW5zdGFudCBBRUMgYXMgd2VsbC4KKyAgICBpZiAoIW1fYkluc3RhbnRDYXB0dXJlKSB7CisgICAgICAgIC8vIENoZWNrIGZvciBpbnN0YW50IEFFQy4gSW5zdGFudCBBRUMgd2lsbCBvbmx5IGVuYWJsZSBmYXN0IEFFQy4KKyAgICAgICAgLy8gSXQgd2lsbCBub3QgZW5hYmxlIGluc3RhbnQgY2FwdHVyZS4KKyAgICAgICAgLy8gVGhpcyBwYXJhbSB3aWxsIHRyaWdnZXIgdGhlIGluc3RhbnQgQUVDIHBhcmFtIHRvIGJhY2tlbmQKKyAgICAgICAgLy8gSW5zdGFudCBBRUMgcGFyYW0gaXMgc2Vzc2lvbiBiYXNlZCBwYXJhbSwKKyAgICAgICAgLy8gdGhlIHBhcmFtIGNoYW5nZSB3aWxsIGJlIGFwcGxpY2FibGUgZm9yIG5leHQgY2FtZXJhIG9wZW4vY2xvc2Ugc2Vzc2lvbi4KKyAgICAgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfUUNfSU5TVEFOVF9BRUMpOworICAgICAgICBjb25zdCBjaGFyICpwcmV2X3N0ciA9IGdldChLRVlfUUNfSU5TVEFOVF9BRUMpOworICAgICAgICBpZiAoc3RyKSB7CisgICAgICAgICAgICBpZiAoKHByZXZfc3RyID09IE5VTEwpIHx8IChzdHJjbXAoc3RyLCBwcmV2X3N0cikgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGxvb2t1cEF0dHIoSU5TVEFOVF9BRUNfTU9ERVNfTUFQLAorICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoSU5TVEFOVF9BRUNfTU9ERVNfTUFQKSwgc3RyKTsKKyAgICAgICAgICAgICAgICBMT0dEKCJTZXQgaW5zdGFudCBBRUMgZnJvbSBwYXJhbSA9ICVkIiwgdmFsdWUpOworICAgICAgICAgICAgICAgIGlmKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX0lOU1RBTlRfQUVDLCBzdHIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkludmFsaWQgdmFsdWUgZm9yIGluc3RhbnQgQUVDICVzIiwgc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgICAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5pbnN0YW50LmFlYyIsIHByb3AsIEtFWV9RQ19JTlNUQU5UX0FFQ19ESVNBQkxFKTsKKyAgICAgICAgICAgIGlmICgocHJldl9zdHIgPT0gTlVMTCkgfHwgKHN0cmNtcChwcm9wLCBwcmV2X3N0cikgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGxvb2t1cEF0dHIoSU5TVEFOVF9BRUNfTU9ERVNfTUFQLAorICAgICAgICAgICAgICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoSU5TVEFOVF9BRUNfTU9ERVNfTUFQKSwgcHJvcCk7CisgICAgICAgICAgICAgICAgTE9HRCgiU2V0IGluc3RhbnQgQUVDIGZyb20gc2V0cHJvcCA9ICVkIiwgdmFsdWUpOworICAgICAgICAgICAgICAgIGlmKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX0lOU1RBTlRfQUVDLCBwcm9wKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHZhbHVlIGZvciBpbnN0YW50IEFFQyAlcyIsIHByb3ApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCBpbnN0YW50IEFFQyBwYXJhbSB0byB0aGUgYmFja2VuZCBmb3IgZWl0aGVyIGluc3RhbnQgY2FwdHVyZSBvciBpbnN0YW50IEFFQworICAgICAgICAvLyAwIC0gZGlzYmFsZSAobm9ybWFsIEFFQykKKyAgICAgICAgLy8gMSAtIEFnZ3Jlc3NpdmUgQUVDIChhbGdvIHVzZWQgaW4gYmFja2VuZCkKKyAgICAgICAgLy8gMiAtIEZhc3QgQUVDIChhbGdvIHVzZWQgaW4gYmFja2VuZCkKKyAgICAgICAgaWYgKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EICYmIHZhbHVlICE9IC0xKSB7CisgICAgICAgICAgICBzZXRJbnN0YW50QUVDKCh1aW50OF90KXZhbHVlLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIGdldCBmcmFtZSBhZWMgcHJldmlldyBza2lwIGNvdW50IGZyb20gc2V0cHJvcC4KKyAgICAvLyBUaGlzIHZhbHVlIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGZyYW1lcywgdGhhdCBIQUwKKyAgICAvLyB3aWxsIG5vdCBkaXNwbGF5IGFuZCB3aWxsIG5vdCBzZW5kIHByZXZpZXcgZnJhbWVzIHRvIGFwcAorICAgIC8vIERlZmF1bHQgdmFsdWUgc2V0IHRvIDcuCisgICAgLy8gVGhpcyB3aWxsIGJlIGFwcGxpY2FibGUgb25seSBpZiBpbnN0YW50IGFlYyBpcyBzZXQuCisgICAgaWYgKG1fYkluc3RhbnRBRUMpIHsKKyAgICAgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmFlLmluc3RhbnQuYm91bmQiLCBwcm9wLCAiNyIpOworICAgICAgICBpbnQzMl90IGFlY19mcmFtZV9za2lwX2NudCA9IGF0b2kocHJvcCk7CisgICAgICAgIGlmIChhZWNfZnJhbWVfc2tpcF9jbnQgPj0gMCkgeworICAgICAgICAgICAgbUFlY1NraXBEaXNwbGF5RnJhbWVCb3VuZCA9ICh1aW50OF90KWFlY19mcmFtZV9za2lwX2NudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgcHJvcCBmb3IgYWVjIGZyYW1lIGJvdW5kICVkIiwgYWVjX2ZyYW1lX3NraXBfY250KTsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRESVNWYWx1ZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgRElTIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkaXNTdHIgOiBESVMgdmFsdWUgc3RyaW5nCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0RElTVmFsdWUoY29uc3QgY2hhciAqZGlzU3RyKQoreworICAgIGlmIChkaXNTdHIgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihFTkFCTEVfRElTQUJMRV9NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoRU5BQkxFX0RJU0FCTEVfTU9ERVNfTUFQKSwgZGlzU3RyKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAvL0ZvciBzb21lIElTIHR5cGVzIChsaWtlIEVJUyAyLjApLCB3aGVuIERJUyB2YWx1ZSBpcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHJlc3RhcnQKKyAgICAgICAgICAgIC8vcHJldmlldyBiZWNhdXNlIG9mIHRvcG9sb2d5IGNoYW5nZSBpbiBiYWNrZW5kLiBCdXQsIGZvciBub3csIHJlc3RhcnQgcHJldmlldworICAgICAgICAgICAgLy9mb3IgYWxsIElTIHR5cGVzLgorICAgICAgICAgICAgbV9iTmVlZFJlc3RhcnQgPSB0cnVlOworICAgICAgICAgICAgTE9HSCgiU2V0dGluZyBESVMgdmFsdWUgJXMiLCBkaXNTdHIpOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfRElTLCBkaXNTdHIpOworICAgICAgICAgICAgaWYgKCEoc3RyY21wKGRpc1N0ciwiZW5hYmxlIikpKSB7CisgICAgICAgICAgICAgICAgbV9iRElTRW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1fYkRJU0VuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX0RJU19FTkFCTEUsIHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBESVMgdmFsdWU6ICVzIiwgKGRpc1N0ciA9PSBOVUxMKSA/ICJOVUxMIiA6IGRpc1N0cik7CisgICAgbV9iRElTRW5hYmxlZCA9IGZhbHNlOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdXBkYXRlT2lzVmFsdWUKKyAqCisgKiBERVNDUklQVElPTjogdXBkYXRlIE9JUyB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb2lzVmFsdWUgOiBPSVMgdmFsdWUgVFJVRS9GQUxTRQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnVwZGF0ZU9pc1ZhbHVlKGJvb2wgb2lzVmFsdWUpCit7CisgICAgdWludDhfdCBlbmFibGUgPSAwOworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIC8vIENoZWNrIGZvciBPSVMgZGlzYWJsZQorICAgIGNoYXIgb2lzX3Byb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBtZW1zZXQob2lzX3Byb3AsIDAsIHNpemVvZihvaXNfcHJvcCkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEub2lzLmRpc2FibGUiLCBvaXNfcHJvcCwgIjAiKTsKKyAgICB1aW50OF90IG9pc19kaXNhYmxlID0gKHVpbnQ4X3QpYXRvaShvaXNfcHJvcCk7CisKKyAgICAvL0VuYWJsZSBPSVMgaWYgaXQgaXMgY2FtZXJhIG1vZGUgb3IgQ2FtY29kZXIgNEsgbW9kZQorICAgIGlmICghbV9iUmVjb3JkaW5nSGludCB8fCAoaXM0azJrVmlkZW9SZXNvbHV0aW9uKCkgJiYgbV9iUmVjb3JkaW5nSGludCkpIHsKKyAgICAgICAgZW5hYmxlID0gMTsKKyAgICAgICAgTE9HSCgiVmFsaWQgT0lTIG1vZGUhISAiKTsKKyAgICB9CisgICAgLy8gRGlzYWJsZSBPSVMgaWYgc2V0cHJvcCBpcyBzZXQKKyAgICBpZiAob2lzX2Rpc2FibGUgfHwgIW9pc1ZhbHVlKSB7CisgICAgICAgIC8vRGlzYWJsZSBPSVMKKyAgICAgICAgZW5hYmxlID0gMDsKKyAgICAgICAgTE9HSCgiRGlzYWJsZSBPSVMgbW9kZSEhIG9pc19kaXNhYmxlKCVkKSBvaXNWYWx1ZSglZCkiLAorICAgICAgICAgICAgICAgICBvaXNfZGlzYWJsZSwgb2lzVmFsdWUpOworCisgICAgfQorICAgIG1fYk9JU0VuYWJsZWQgPSBlbmFibGU7CisgICAgaWYgKG1fYk9JU0VuYWJsZWQpIHsKKyAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfT0lTLCBWQUxVRV9FTkFCTEUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX09JUywgVkFMVUVfRElTQUJMRSk7CisgICAgfQorCisgICAgaWYgKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwICkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKworICAgIExPR0goIlNlbmRpbmcgT0lTIG1vZGUgKCVkKSIsIGVuYWJsZSk7CisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX01FVEFfTEVOU19PUFRfU1RBQl9NT0RFLCBlbmFibGUpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByYyA9IGNvbW1pdFNldEJhdGNoKCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBwYXJhbWV0ZXIgY2hhbmdlcyIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEhpZ2hGcmFtZVJhdGUKKyAqCisgKiBERVNDUklQVElPTjogc2V0IGhpZ2ggZnJhbWUgcmF0ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaGZyTW9kZSA6IEhGUiBtb2RlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0SGlnaEZyYW1lUmF0ZShjb25zdCBpbnQzMl90IGhmck1vZGUpCit7CisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fSEZSLCBoZnJNb2RlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRMZW5zU2hhZGVWYWx1ZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgbGVucyBzaGFkZSB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbGVuc1NhaGRlU3RyIDogbGVucyBzaGFkZSB2YWx1ZSBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRMZW5zU2hhZGVWYWx1ZShjb25zdCBjaGFyICpsZW5zU2hhZGVTdHIpCit7CisgICAgaWYgKGxlbnNTaGFkZVN0ciAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgdmFsdWUgPSBsb29rdXBBdHRyKEVOQUJMRV9ESVNBQkxFX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShFTkFCTEVfRElTQUJMRV9NT0RFU19NQVApLCBsZW5zU2hhZGVTdHIpOworICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIExPR0goIlNldHRpbmcgTGVuc1NoYWRlIHZhbHVlICVzIiwgbGVuc1NoYWRlU3RyKTsKKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX0xFTlNTSEFERSwgbGVuc1NoYWRlU3RyKTsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX1JPTExPRkYsIHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBMZW5zU2hhZGUgdmFsdWU6ICVzIiwKKyAgICAgICAgICAobGVuc1NoYWRlU3RyID09IE5VTEwpID8gIk5VTEwiIDogbGVuc1NoYWRlU3RyKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEV4cG9zdXJlQ29tcGVuc2F0aW9uCisgKgorICogREVTQ1JJUFRJT046IHNldCBleHBvc3VyZSBjb21wZW5zYXRpb24gdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGV4cENvbXAgOiBleHBvc3VyZSBjb21wZW5zYXRpb24gdmFsdWUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRFeHBvc3VyZUNvbXBlbnNhdGlvbihpbnQgZXhwQ29tcCkKK3sKKyAgICBjaGFyIHZhbFsxNl07CisgICAgc25wcmludGYodmFsLCBzaXplb2YodmFsKSwgIiVkIiwgZXhwQ29tcCk7CisgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfRVhQT1NVUkVfQ09NUEVOU0FUSU9OLCB2YWwpOworCisgICAgLy8gRG9uJ3QgbmVlZCB0byBwYXNzIHN0ZXAgYXMgcGFydCBvZiBzZXRQYXJhbWV0ZXIgYmVjYXVzZQorICAgIC8vIGNhbWVyYSBkYWVtb24gaXMgYWxyZWFkeSBhd2FyZSBvZiBpdC4KKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9FWFBPU1VSRV9DT01QRU5TQVRJT04sIGV4cENvbXApKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFdoaXRlQmFsYW5jZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgd2hpdGUgYmFsYW5jZSBtb2RlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB3YlN0ciAgIDogd2hpdGUgYmFsYW5jZSBtb2RlIHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFdoaXRlQmFsYW5jZShjb25zdCBjaGFyICp3YlN0cikKK3sKKyAgICBpZiAod2JTdHIgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihXSElURV9CQUxBTkNFX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShXSElURV9CQUxBTkNFX01PREVTX01BUCksIHdiU3RyKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBMT0dIKCJTZXR0aW5nIFdoaXRlQmFsYW5jZSB2YWx1ZSAlcyIsIHdiU3RyKTsKKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1dISVRFX0JBTEFOQ0UsIHdiU3RyKTsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX1dISVRFX0JBTEFOQ0UsIHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBXaGl0ZUJhbGFuY2UgdmFsdWU6ICVzIiwgKHdiU3RyID09IE5VTEwpID8gIk5VTEwiIDogd2JTdHIpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0V0JNYW51YWxDQ1QKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHNldFdCTWFudWFsQ0NUIHRpbWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNjdFN0ciA6IHN0cmluZyBvZiB3YiBjY3QsIHJhbmdlICgyMDAwLCA4MDAwKSBpbiBLLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgIFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRXQk1hbnVhbENDVChjb25zdCBjaGFyICpjY3RTdHIpCit7CisgICAgaWYgKGNjdFN0ciAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgY2N0VmFsID0gYXRvaShjY3RTdHIpOworICAgICAgICBpbnQzMl90IG1pbkNjdCA9IG1fcENhcGFiaWxpdHktPm1pbl93Yl9jY3Q7IC8qIDIwMDBLICovCisgICAgICAgIGludDMyX3QgbWF4Q2N0ID0gbV9wQ2FwYWJpbGl0eS0+bWF4X3diX2NjdDsgLyogODAwMEsgKi8KKworICAgICAgICBpZiAoY2N0VmFsID49IG1pbkNjdCAmJiBjY3RWYWwgPD0gbWF4Q2N0KSB7CisgICAgICAgICAgICBMT0dIKCIsIGNjdCB2YWx1ZTogJWQiLCBjY3RWYWwpOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfV0JfTUFOVUFMX0NDVCwgY2N0U3RyKTsKKyAgICAgICAgICAgIGNhbV9tYW51YWxfd2JfcGFybV90IG1hbnVhbF93YjsKKyAgICAgICAgICAgIG1hbnVhbF93Yi50eXBlID0gQ0FNX01BTlVBTF9XQl9NT0RFX0NDVDsKKyAgICAgICAgICAgIG1hbnVhbF93Yi5jY3QgPSBjY3RWYWw7CisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9XQl9NQU5VQUwsIG1hbnVhbF93YikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HRSgiSW52YWxpZCBjY3QsIHZhbHVlOiAlcyIsCisgICAgICAgICAgICAoY2N0U3RyID09IE5VTEwpID8gIk5VTEwiIDogY2N0U3RyKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVwZGF0ZUFXQlBhcmFtcworICoKKyAqIERFU0NSSVBUSU9OOiB1cGRhdGUgQ0NUIHBhcmFtZXRlcnMga2V5CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBhd2JfcGFyYW1zIDogV0IgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnVwZGF0ZUFXQlBhcmFtcyhjYW1fYXdiX3BhcmFtc190ICZhd2JfcGFyYW1zKQoreworICAgIC8vY2hlY2sgYW5kIHVwZGF0ZSBDQ1QKKyAgICBpbnQzMl90IHByZXZfY2N0ID0gZ2V0SW50KEtFWV9RQ19XQl9NQU5VQUxfQ0NUKTsKKyAgICBpZiAocHJldl9jY3QgIT0gYXdiX3BhcmFtcy5jY3RfdmFsdWUpIHsKKyAgICAgICAgTE9HRCgidXBkYXRlIGN1cnJlbnQgY2N0IHZhbHVlLiBvbGQ6JWQsIG5vdzolZCIsCisgICAgICAgICAgICAgICAgcHJldl9jY3QsIGF3Yl9wYXJhbXMuY2N0X3ZhbHVlKTsKKyAgICAgICAgc2V0KEtFWV9RQ19XQl9NQU5VQUxfQ0NULCBhd2JfcGFyYW1zLmNjdF92YWx1ZSk7CisgICAgfQorCisgICAgLy9jaGVjayBhbmQgdXBkYXRlIFdCIGdhaW5zCisgICAgY29uc3QgY2hhciAqcHJldl9nYWlucyA9IGdldChLRVlfUUNfTUFOVUFMX1dCX0dBSU5TKTsKKyAgICBjaGFyIGdhaW5TdHJbMzBdOworICAgIHNucHJpbnRmKGdhaW5TdHIsIHNpemVvZihnYWluU3RyKSwgIiVmLCVmLCVmIiwgYXdiX3BhcmFtcy5yZ2JfZ2FpbnMucl9nYWluLAorICAgICAgICBhd2JfcGFyYW1zLnJnYl9nYWlucy5nX2dhaW4sIGF3Yl9wYXJhbXMucmdiX2dhaW5zLmJfZ2Fpbik7CisKKyAgICBpZiAocHJldl9nYWlucyA9PSBOVUxMIHx8IHN0cmNtcChwcmV2X2dhaW5zLCBnYWluU3RyKSkgeworICAgICAgICBzZXQoS0VZX1FDX01BTlVBTF9XQl9HQUlOUywgZ2FpblN0cik7CisgICAgICAgIExPR0QoInVwZGF0ZSBjdXJyZXJudCBSR0IgZ2FpbnM6IG9sZCAlcyBuZXcgJXMiLCBwcmV2X2dhaW5zLCBnYWluU3RyKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHBhcnNlR2FpbnMKKyAqCisgKiBERVNDUklQVElPTjogcGFyc2UgV0IgZ2FpbnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGdhaW5TdHIgOiBXQiByZXN1bHQgc3RyaW5nCisgKiAgIEByX2dhaW4gIDogV0IgcmVkIGdhaW4KKyAqICAgQGdfZ2FpbiAgOiBXQiBncmVlbiBnYWluCisgKiAgIEBiX2dhaW4gIDogV0IgYmx1ZSBnYWluCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6cGFyc2VHYWlucyhjb25zdCBjaGFyICpnYWluU3RyLCBkb3VibGUgJnJfZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAmZ19nYWluLCBkb3VibGUgJmJfZ2FpbikKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgY2hhciAqc2F2ZXB0ciA9IE5VTEw7CisgICAgc2l6ZV90IGdhaW5zX3NpemUgPSBzdHJsZW4oZ2FpblN0cikgKyAxOworICAgIGNoYXIqIGdhaW5zID0gKGNoYXIqKSBjYWxsb2MoMSwgZ2FpbnNfc2l6ZSk7CisgICAgaWYgKE5VTEwgPT0gZ2FpbnMpIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBnYWlucyIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBzdHJsY3B5KGdhaW5zLCBnYWluU3RyLCBnYWluc19zaXplKTsKKyAgICBjaGFyICp0b2tlbiA9IHN0cnRva19yKGdhaW5zLCAiLCIsICZzYXZlcHRyKTsKKworICAgIGlmIChOVUxMICE9IHRva2VuKSB7CisgICAgICAgIHJfZ2FpbiA9IChmbG9hdCkgYXRvZih0b2tlbik7CisgICAgICAgIHRva2VuID0gc3RydG9rX3IoTlVMTCwgIiwiLCAmc2F2ZXB0cik7CisgICAgfQorCisgICAgaWYgKE5VTEwgIT0gdG9rZW4pIHsKKyAgICAgICAgZ19nYWluID0gKGZsb2F0KSBhdG9mKHRva2VuKTsKKyAgICAgICAgdG9rZW4gPSBzdHJ0b2tfcihOVUxMLCAiLCIsICZzYXZlcHRyKTsKKyAgICB9CisKKyAgICBpZiAoTlVMTCAhPSB0b2tlbikgeworICAgICAgICBiX2dhaW4gPSAoZmxvYXQpIGF0b2YodG9rZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIk1hbGZvcm1lZCBzdHJpbmcgZm9yIGdhaW5zIik7CisgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGZyZWUoZ2FpbnMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRNYW51YWxXQkdhaW5zCisgKgorICogREVTQ1JJUFRJT046IHNldCBtYW51YWwgd2IgZ2FpbnMgZm9yIHIsZyxiCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjY3RTdHIgOiBzdHJpbmcgb2Ygd2IgZ2FpbnMsIHJhbmdlICgxLjAsIDQuMCkuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0TWFudWFsV0JHYWlucyhjb25zdCBjaGFyICpnYWluU3RyKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpZiAoZ2FpblN0ciAhPSBOVUxMKSB7CisgICAgICAgIGRvdWJsZSByX2dhaW4sZ19nYWluLGJfZ2FpbjsKKyAgICAgICAgcmMgPSBwYXJzZUdhaW5zKGdhaW5TdHIsIHJfZ2FpbiwgZ19nYWluLCBiX2dhaW4pOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIGRvdWJsZSBtaW5HYWluID0gbV9wQ2FwYWJpbGl0eS0+bWluX3diX2dhaW47CisgICAgICAgIGRvdWJsZSBtYXhHYWluID0gbV9wQ2FwYWJpbGl0eS0+bWF4X3diX2dhaW47CisKKyAgICAgICAgaWYgKHJfZ2FpbiA+PSBtaW5HYWluICYmIHJfZ2FpbiA8PSBtYXhHYWluICYmCisgICAgICAgICAgICBnX2dhaW4gPj0gbWluR2FpbiAmJiBnX2dhaW4gPD0gbWF4R2FpbiAmJgorICAgICAgICAgICAgYl9nYWluID49IG1pbkdhaW4gJiYgYl9nYWluIDw9IG1heEdhaW4pIHsKKyAgICAgICAgICAgIExPR0goIiwgc2V0dGluZyByZ2IgZ2FpbnM6IHIgPSAlbGYgZyA9ICVsZiBiID0gJWxmIiwKKyAgICAgICAgICAgICAgICAgICAgIHJfZ2FpbiwgZ19nYWluLCBiX2dhaW4pOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfTUFOVUFMX1dCX0dBSU5TLCBnYWluU3RyKTsKKyAgICAgICAgICAgIGNhbV9tYW51YWxfd2JfcGFybV90IG1hbnVhbF93YjsKKyAgICAgICAgICAgIG1hbnVhbF93Yi50eXBlID0gQ0FNX01BTlVBTF9XQl9NT0RFX0dBSU47CisgICAgICAgICAgICBtYW51YWxfd2IuZ2FpbnMucl9nYWluID0gcl9nYWluOworICAgICAgICAgICAgbWFudWFsX3diLmdhaW5zLmdfZ2FpbiA9IGdfZ2FpbjsKKyAgICAgICAgICAgIG1hbnVhbF93Yi5nYWlucy5iX2dhaW4gPSBiX2dhaW47CisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9XQl9NQU5VQUwsIG1hbnVhbF93YikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HSCgiSW52YWxpZCBtYW51YWwgd2IgZ2FpbnM6ICVzIiwKKyAgICAgICAgICAoZ2FpblN0ciA9PSBOVUxMKSA/ICJOVUxMIiA6IGdhaW5TdHIpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK2ludCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0QXV0b0ZsaWNrZXJNb2RlKCkKK3sKKyAgICAvKiBFbmFibGUgQWR2YW5jZWQgQXV0byBBbnRpYmFuZGluZyB3aGVyZSB3ZSBjYW4gc2V0CisgICAgICAgYW55IG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uCisgICAgICAgaWUuIENBTV9BTlRJQkFORElOR19NT0RFX0FVVE8KKyAgICAgICAgICAgQ0FNX0FOVElCQU5ESU5HX01PREVfQVVUT181MEhaCisgICAgICAgICAgIENBTV9BTlRJQkFORElOR19NT0RFX0FVVE9fNjBIWgorICAgICAgQ3VycmVudGx5IHNldHRpbmcgaXQgdG8gZGVmYXVsdCAgICAqLworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuc2V0LmFmZCIsIHByb3AsICIzIik7CisgICAgcmV0dXJuIGF0b2kocHJvcCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0QW50aWJhbmRpbmcKKyAqCisgKiBERVNDUklQVElPTjogc2V0IGFudGliYW5kaW5nIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBhbnRpQmFuZGluZ1N0ciA6IGFudGliYW5kaW5nIHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEFudGliYW5kaW5nKGNvbnN0IGNoYXIgKmFudGlCYW5kaW5nU3RyKQoreworICAgIGlmIChhbnRpQmFuZGluZ1N0ciAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgdmFsdWUgPSBsb29rdXBBdHRyKEFOVElCQU5ESU5HX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoQU5USUJBTkRJTkdfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICBhbnRpQmFuZGluZ1N0cik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgTE9HSCgiU2V0dGluZyBBbnRpQmFuZGluZyB2YWx1ZSAlcyIsIGFudGlCYW5kaW5nU3RyKTsKKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX0FOVElCQU5ESU5HLCBhbnRpQmFuZGluZ1N0cik7CisgICAgICAgICAgICBpZih2YWx1ZSA9PSBDQU1fQU5USUJBTkRJTkdfTU9ERV9BVVRPKSB7CisgICAgICAgICAgICAgICB2YWx1ZSA9IGdldEF1dG9GbGlja2VyTW9kZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsCisgICAgICAgICAgICAgICAgICAgIENBTV9JTlRGX1BBUk1fQU5USUJBTkRJTkcsICh1aW50MzJfdCl2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIExPR0UoIkludmFsaWQgQW50aUJhbmRpbmcgdmFsdWU6ICVzIiwKKyAgICAgICAgICAoYW50aUJhbmRpbmdTdHIgPT0gTlVMTCkgPyAiTlVMTCIgOiBhbnRpQmFuZGluZ1N0cik7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRGb2N1c0FyZWFzCisgKgorICogREVTQ1JJUFRJT046IHNldCBmb2N1cyBhcmVhcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZm9jdXNBcmVhc1N0ciA6IGZvY3VzIGFyZWFzIHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEZvY3VzQXJlYXMoY29uc3QgY2hhciAqZm9jdXNBcmVhc1N0cikKK3sKKyAgICBpZiAobV9wQ2FwYWJpbGl0eS0+bWF4X251bV9mb2N1c19hcmVhcyA9PSAwIHx8CisgICAgICAgIGZvY3VzQXJlYXNTdHIgPT0gTlVMTCkgeworICAgICAgICBMT0dEKCJQYXJhbWV0ZXIgc3RyaW5nIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGNhbV9hcmVhX3QgKmFyZWFzID0gKGNhbV9hcmVhX3QgKiltYWxsb2Moc2l6ZW9mKGNhbV9hcmVhX3QpICogbV9wQ2FwYWJpbGl0eS0+bWF4X251bV9mb2N1c19hcmVhcyk7CisgICAgaWYgKE5VTEwgPT0gYXJlYXMpIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBhcmVhcyIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBtZW1zZXQoYXJlYXMsIDAsIHNpemVvZihjYW1fYXJlYV90KSAqIG1fcENhcGFiaWxpdHktPm1heF9udW1fZm9jdXNfYXJlYXMpOworICAgIGludCBudW1fYXJlYXNfZm91bmQgPSAwOworICAgIGlmIChwYXJzZUNhbWVyYUFyZWFTdHJpbmcoZm9jdXNBcmVhc1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPm1heF9udW1fZm9jdXNfYXJlYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9hcmVhc19mb3VuZCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHBhcnNlIHRoZSBzdHJpbmc6ICVzIiwgZm9jdXNBcmVhc1N0cik7CisgICAgICAgIGZyZWUoYXJlYXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICh2YWxpZGF0ZUNhbWVyYUFyZWFzKGFyZWFzLCBudW1fYXJlYXNfZm91bmQpID09IGZhbHNlKSB7CisgICAgICAgIExPR0UoImludmFsaWQgYXJlYXMgc3BlY2lmaWVkIDogJXMiLCBmb2N1c0FyZWFzU3RyKTsKKyAgICAgICAgZnJlZShhcmVhcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfRk9DVVNfQVJFQVMsIGZvY3VzQXJlYXNTdHIpOworCisgICAgLy9mb3Igc3BlY2lhbCBhcmVhIHN0cmluZyAoMCwgMCwgMCwgMCwgMCksIHNldCB0aGUgbnVtX2FyZWFzX2ZvdW5kIHRvIDAsCisgICAgLy9zbyBubyBhY3Rpb24gaXMgdGFrZW5ieSB0aGUgbG93ZXIgbGF5ZXIKKyAgICBpZiAobnVtX2FyZWFzX2ZvdW5kID09IDEgJiYKKyAgICAgICAgYXJlYXNbMF0ucmVjdC5sZWZ0ID09IDAgJiYKKyAgICAgICAgYXJlYXNbMF0ucmVjdC50b3AgPT0gMCAmJgorICAgICAgICBhcmVhc1swXS5yZWN0LndpZHRoID09IDAgJiYKKyAgICAgICAgYXJlYXNbMF0ucmVjdC5oZWlnaHQgPT0gMCAmJgorICAgICAgICBhcmVhc1swXS53ZWlnaHQgPT0gMCkgeworICAgICAgICBudW1fYXJlYXNfZm91bmQgPSAwOworICAgIH0KKworICAgIGludCBwcmV2aWV3V2lkdGgsIHByZXZpZXdIZWlnaHQ7CisgICAgZ2V0UHJldmlld1NpemUoJnByZXZpZXdXaWR0aCwgJnByZXZpZXdIZWlnaHQpOworICAgIGNhbV9yb2lfaW5mb190IGFmX3JvaV92YWx1ZTsKKyAgICBtZW1zZXQoJmFmX3JvaV92YWx1ZSwgMCwgc2l6ZW9mKGNhbV9yb2lfaW5mb190KSk7CisgICAgYWZfcm9pX3ZhbHVlLm51bV9yb2kgPSAodWludDhfdCludW1fYXJlYXNfZm91bmQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fYXJlYXNfZm91bmQ7IGkrKykgeworICAgICAgICBMT0dIKCJGb2N1c0FyZWFbJWRdID0gKCVkLCAlZCwgJWQsICVkKSIsCisgICAgICAgICAgICAgICBpLCAoYXJlYXNbaV0ucmVjdC50b3ApLCAoYXJlYXNbaV0ucmVjdC5sZWZ0KSwKKyAgICAgICAgICAgICAgKGFyZWFzW2ldLnJlY3Qud2lkdGgpLCAoYXJlYXNbaV0ucmVjdC5oZWlnaHQpKTsKKworICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGNvb3JkcyBmcm9tICgtMTAwMCwgMTAwMCkKKyAgICAgICAgLy8gdG8gKDAsIHByZXZpZXdXaWR0aCBvciBwcmV2aWV3SGVpZ2h0KS4KKyAgICAgICAgYWZfcm9pX3ZhbHVlLnJvaVtpXS5sZWZ0ID0KKyAgICAgICAgICAgICAgICAoaW50MzJfdCkoKChkb3VibGUpYXJlYXNbaV0ucmVjdC5sZWZ0ICsgMTAwMC4wKSAqCisgICAgICAgICAgICAgICAgICAgICgoZG91YmxlKXByZXZpZXdXaWR0aCAvIDIwMDAuMCkpOworICAgICAgICBhZl9yb2lfdmFsdWUucm9pW2ldLnRvcCA9CisgICAgICAgICAgICAgICAgKGludDMyX3QpKCgoZG91YmxlKWFyZWFzW2ldLnJlY3QudG9wICsgMTAwMC4wKSAqCisgICAgICAgICAgICAgICAgICAgICgoZG91YmxlKXByZXZpZXdIZWlnaHQgLyAyMDAwLjApKTsKKyAgICAgICAgYWZfcm9pX3ZhbHVlLnJvaVtpXS53aWR0aCA9CisgICAgICAgICAgICAgICAgKGludDMyX3QpKChkb3VibGUpYXJlYXNbaV0ucmVjdC53aWR0aCAqCisgICAgICAgICAgICAgICAgICAgIChkb3VibGUpcHJldmlld1dpZHRoIC8gMjAwMC4wKTsKKyAgICAgICAgYWZfcm9pX3ZhbHVlLnJvaVtpXS5oZWlnaHQgPQorICAgICAgICAgICAgICAgIChpbnQzMl90KSgoZG91YmxlKWFyZWFzW2ldLnJlY3QuaGVpZ2h0ICoKKyAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwcmV2aWV3SGVpZ2h0IC8gMjAwMC4wKTsKKyAgICAgICAgYWZfcm9pX3ZhbHVlLndlaWdodFtpXSA9IGFyZWFzW2ldLndlaWdodDsKKyAgICB9CisgICAgZnJlZShhcmVhcyk7CisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fQUZfUk9JLCBhZl9yb2lfdmFsdWUpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldE1ldGVyaW5nQXJlYXMKKyAqCisgKiBERVNDUklQVElPTjogc2V0IG1ldGVyaW5nIGFyZWFzIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtZXRlcmluZ0FyZWFzU3RyIDogbWV0ZXJpbmcgYXJlYXMgdmFsdWUgc3RyaW5nCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0TWV0ZXJpbmdBcmVhcyhjb25zdCBjaGFyICptZXRlcmluZ0FyZWFzU3RyKQoreworICAgIGlmIChtX3BDYXBhYmlsaXR5LT5tYXhfbnVtX21ldGVyaW5nX2FyZWFzID09IDAgfHwKKyAgICAgICAgbWV0ZXJpbmdBcmVhc1N0ciA9PSBOVUxMKSB7CisgICAgICAgIExPR0QoIlBhcmFtZXRlciBzdHJpbmcgaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgY2FtX2FyZWFfdCAqYXJlYXMgPSAoY2FtX2FyZWFfdCAqKW1hbGxvYyhzaXplb2YoY2FtX2FyZWFfdCkgKiBtX3BDYXBhYmlsaXR5LT5tYXhfbnVtX21ldGVyaW5nX2FyZWFzKTsKKyAgICBpZiAoTlVMTCA9PSBhcmVhcykgeworICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIGFyZWFzIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChhcmVhcywgMCwgc2l6ZW9mKGNhbV9hcmVhX3QpICogbV9wQ2FwYWJpbGl0eS0+bWF4X251bV9tZXRlcmluZ19hcmVhcyk7CisgICAgaW50IG51bV9hcmVhc19mb3VuZCA9IDA7CisgICAgaWYgKHBhcnNlQ2FtZXJhQXJlYVN0cmluZyhtZXRlcmluZ0FyZWFzU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+bWF4X251bV9tZXRlcmluZ19hcmVhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2FyZWFzX2ZvdW5kKSA8IDApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHBhcnNlIHRoZSBzdHJpbmc6ICVzIiwgbWV0ZXJpbmdBcmVhc1N0cik7CisgICAgICAgIGZyZWUoYXJlYXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICh2YWxpZGF0ZUNhbWVyYUFyZWFzKGFyZWFzLCBudW1fYXJlYXNfZm91bmQpID09IGZhbHNlKSB7CisgICAgICAgIExPR0UoImludmFsaWQgYXJlYXMgc3BlY2lmaWVkIDogJXMiLCBtZXRlcmluZ0FyZWFzU3RyKTsKKyAgICAgICAgZnJlZShhcmVhcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfTUVURVJJTkdfQVJFQVMsIG1ldGVyaW5nQXJlYXNTdHIpOworCisgICAgLy9mb3Igc3BlY2lhbCBhcmVhIHN0cmluZyAoMCwgMCwgMCwgMCwgMCksIHNldCB0aGUgbnVtX2FyZWFzX2ZvdW5kIHRvIDAsCisgICAgLy9zbyBubyBhY3Rpb24gaXMgdGFrZW5ieSB0aGUgbG93ZXIgbGF5ZXIKKyAgICBpZiAobnVtX2FyZWFzX2ZvdW5kID09IDEgJiYKKyAgICAgICAgYXJlYXNbMF0ucmVjdC5sZWZ0ID09IDAgJiYKKyAgICAgICAgYXJlYXNbMF0ucmVjdC50b3AgPT0gMCAmJgorICAgICAgICBhcmVhc1swXS5yZWN0LndpZHRoID09IDAgJiYKKyAgICAgICAgYXJlYXNbMF0ucmVjdC5oZWlnaHQgPT0gMCAmJgorICAgICAgICBhcmVhc1swXS53ZWlnaHQgPT0gMCkgeworICAgICAgICBudW1fYXJlYXNfZm91bmQgPSAwOworICAgIH0KKyAgICBjYW1fc2V0X2FlY19yb2lfdCBhZWNfcm9pX3ZhbHVlOworICAgIGludCBwcmV2aWV3V2lkdGgsIHByZXZpZXdIZWlnaHQ7CisgICAgZ2V0UHJldmlld1NpemUoJnByZXZpZXdXaWR0aCwgJnByZXZpZXdIZWlnaHQpOworCisgICAgbWVtc2V0KCZhZWNfcm9pX3ZhbHVlLCAwLCBzaXplb2YoY2FtX3NldF9hZWNfcm9pX3QpKTsKKyAgICBpZiAobnVtX2FyZWFzX2ZvdW5kID4gMCkgeworICAgICAgICBhZWNfcm9pX3ZhbHVlLmFlY19yb2lfZW5hYmxlID0gQ0FNX0FFQ19ST0lfT047CisgICAgICAgIGFlY19yb2lfdmFsdWUuYWVjX3JvaV90eXBlID0gQ0FNX0FFQ19ST0lfQllfQ09PUkRJTkFURTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9hcmVhc19mb3VuZDsgaSsrKSB7CisgICAgICAgICAgICBMT0dIKCJNZXRlcmluZ0FyZWFbJWRdID0gKCVkLCAlZCwgJWQsICVkKSIsCisgICAgICAgICAgICAgICAgICAgaSwgKGFyZWFzW2ldLnJlY3QudG9wKSwgKGFyZWFzW2ldLnJlY3QubGVmdCksCisgICAgICAgICAgICAgICAgICAoYXJlYXNbaV0ucmVjdC53aWR0aCksIChhcmVhc1tpXS5yZWN0LmhlaWdodCkpOworCisgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGNvb3JkcyBmcm9tICgtMTAwMCwgMTAwMCkgdG8KKyAgICAgICAgICAgIC8vICgwLCBwcmV2aWV3V2lkdGggb3IgcHJldmlld0hlaWdodCkuCisgICAgICAgICAgICBhZWNfcm9pX3ZhbHVlLmNhbV9hZWNfcm9pX3Bvc2l0aW9uLmNvb3JkaW5hdGVbaV0ueCA9CisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoKCgoZG91YmxlKWFyZWFzW2ldLnJlY3QubGVmdCArCisgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKWFyZWFzW2ldLnJlY3Qud2lkdGggLyAyLjApICsgMTAwMC4wKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlwcmV2aWV3V2lkdGggLyAyMDAwLjApOworICAgICAgICAgICAgYWVjX3JvaV92YWx1ZS5jYW1fYWVjX3JvaV9wb3NpdGlvbi5jb29yZGluYXRlW2ldLnkgPQorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKCgoKGRvdWJsZSlhcmVhc1tpXS5yZWN0LnRvcCArCisgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKWFyZWFzW2ldLnJlY3QuaGVpZ2h0IC8gMi4wKSArIDEwMDAuMCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpcHJldmlld0hlaWdodCAvIDIwMDAuMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBhZWNfcm9pX3ZhbHVlLmFlY19yb2lfZW5hYmxlID0gQ0FNX0FFQ19ST0lfT0ZGOworICAgIH0KKyAgICBmcmVlKGFyZWFzKTsKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9BRUNfUk9JLCBhZWNfcm9pX3ZhbHVlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzU3VwcG9ydGVkU2Vuc29ySGRyU2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiBDaGVja3MgaWYgdGhlIHJlcXVlc3RlZCBzbmFwc2hvdCBzaXplIGlzIGNvbXBhdGlibGUgd2l0aCBjdXJyZW50bHkKKyAqICAgICAgICAgICAgICBjb25maWd1cmVkIEhEUiBtb2RlLCBjdXJyZW50bHkgcHJpbWFyeSB0YXJnZXQgZm9yIHZhbGlkYXRpb24gaXMKKyAqICAgICAgICAgICAgICB6emhkciBob3dldmVyIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUgdG8gdmV0CisgKiAgICAgICAgICAgICAgYWxsIHNlbnNvciBiYXNlZCBIRFIgY29uZmlncworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGFyYW1zICA6IENhbWVyYVBhcmFtZXRlcnMgb2JqZWN0CisgKgorICogUkVUVVJOICAgICA6IGJvb2xlYW4gdHlwZQorICogICAgICAgICAgICAgIFRydWUgIC0tIGluZGljYXRlcyBzdXBwb3J0ZWQgY29uZmlnCisgKiAgICAgICAgICAgICAgRmFsc2UgLS0gaW5kaWNhdGVkIHVuc3VwcG9ydGVkIGNvbmZpZyBzaG91bGQgZmFsbGJhY2sgdG8gb3RoZXIKKyAqICAgICAgICAgICAgICBhdmFpbGFibGUgSERSIG1vZGVzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnM6OmlzU3VwcG9ydGVkU2Vuc29ySGRyU2l6ZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKQoreworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBtZW1zZXQodmFsdWUsIDAsIHNpemVvZih2YWx1ZSkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuenpoZHIuZW5hYmxlIiwgdmFsdWUsICIwIik7CisgICAgdWludDhfdCB6emhkcl9lbmFibGUgPSAodWludDhfdClhdG9pKHZhbHVlKTsKKworICAgIGlmICh6emhkcl9lbmFibGUpIHsKKworICAgICAgICBpbnQgcmVxX3csIHJlcV9oOworICAgICAgICBwYXJhbXMuZ2V0UGljdHVyZVNpemUoJnJlcV93LCAmcmVxX2gpOworCisgICAgICAgIC8vIENoZWNrIGlmIHJlcXVlc3RlZCB3IHggaCBpcyBpbiB6emhkciBzdXBwb3J0ZWQgbGlzdAorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaTwgbV9wQ2FwYWJpbGl0eS0+enpoZHJfc2l6ZXNfdGJsX2NudDsgKytpKSB7CisKKyAgICAgICAgICAgIGlmIChyZXFfdyA9PSBtX3BDYXBhYmlsaXR5LT56emhkcl9zaXplc190YmxbaV0ud2lkdGggJiYKKyAgICAgICAgICAgICAgICAgICAgcmVxX2ggPT0gbV9wQ2FwYWJpbGl0eS0+enpoZHJfc2l6ZXNfdGJsW2ldLmhlaWdodCkgeworICAgICAgICAgICAgICAgIExPR0QoIiVzOiBGb3VuZCBtYXRjaCBmb3IgJWQgeCAlZCIsIF9fZnVuY19fLCByZXFfdywgcmVxX2gpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIExPR0goIiVzOiAlZCB4ICVkIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHp6aGRyIG1vZGUiLCBfX2Z1bmNfXywgcmVxX3csIHJlcV9oKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFNjZW5lTW9kZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgc2NlbmUgbW9kZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc2NlbmVNb2RlU3RyIDogc2NlbmUgbW9kZSB2YWx1ZSBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRTY2VuZU1vZGUoY29uc3QgY2hhciAqc2NlbmVNb2RlU3RyKQoreworICAgIGlmIChzY2VuZU1vZGVTdHIgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihTQ0VORV9NT0RFU19NQVAsIFBBUkFNX01BUF9TSVpFKFNDRU5FX01PREVTX01BUCksIHNjZW5lTW9kZVN0cik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgTE9HRCgiU2V0dGluZyBTY2VuZU1vZGUgJXMiLCBzY2VuZU1vZGVTdHIpOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfU0NFTkVfTU9ERSwgc2NlbmVNb2RlU3RyKTsKKyAgICAgICAgICAgIGlmIChtX2JTZW5zb3JIRFJFbmFibGVkKSB7CisgICAgICAgICAgICAgIC8vIEluY2FzZSBvZiBIVyBIRFIgbW9kZSwgd2UgZG8gbm90IHVwZGF0ZSB0aGUgc2FtZSBhcyBCZXN0IHNob3QgbW9kZS4KKyAgICAgICAgICAgICAgTE9HSCgiSC9XIEhEUiBtb2RlIGVuYWJsZWQuIERvIG5vdCBzZXQgQmVzdCBTaG90IE1vZGUiKTsKKyAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1fYlNjZW5lU2VsZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRTY2VuZSgoY2FtX3NjZW5lX21vZGVfdHlwZSkgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fQkVTVFNIT1RfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBTZWNlbmUgTW9kZTogJXMiLAorICAgICAgICAgICAoc2NlbmVNb2RlU3RyID09IE5VTEwpID8gIk5VTEwiIDogc2NlbmVNb2RlU3RyKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFNlbGVjdGFibGVab25lQWYKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHNlbGVjdGFibGUgem9uZSBBRiBhbGdvcml0aG0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHNlbFpvbmVBRlN0ciA6IHNlbGVjdGFibGUgem9uZSBBRiBhbGdvcml0aG0gdmFsdWUgc3RyaW5nCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0U2VsZWN0YWJsZVpvbmVBZihjb25zdCBjaGFyICpzZWxab25lQUZTdHIpCit7CisgICAgaWYgKHNlbFpvbmVBRlN0ciAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgdmFsdWUgPSBsb29rdXBBdHRyKEZPQ1VTX0FMR09fTUFQLCBQQVJBTV9NQVBfU0laRShGT0NVU19BTEdPX01BUCksIHNlbFpvbmVBRlN0cik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgTE9HRCgiU2V0dGluZyBTZWxlY3RhYmxlIFpvbmUgQUYgdmFsdWUgJXMiLCBzZWxab25lQUZTdHIpOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfU0VMRUNUQUJMRV9aT05FX0FGLCBzZWxab25lQUZTdHIpOworICAgICAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fRk9DVVNfQUxHT19UWVBFLCB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIExPR0UoIkludmFsaWQgc2VsZWN0YWJsZSB6b25lIGFmIHZhbHVlOiAlcyIsCisgICAgICAgICAgIChzZWxab25lQUZTdHIgPT0gTlVMTCkgPyAiTlVMTCIgOiBzZWxab25lQUZTdHIpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNBRUJyYWNrZXRFbmFibGVkCisgKgorICogREVTQ1JJUFRJT046IGNoZWNrcyBpZiBBRSBicmFja2V0aW5nIGlzIGVuYWJsZWQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqCisgKiBSRVRVUk4gICAgIDogVFJVRS9GQUxTRQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjppc0FFQnJhY2tldEVuYWJsZWQoKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IGdldChLRVlfUUNfQUVfQlJBQ0tFVF9IRFIpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RyY21wKHN0ciwgQUVfQlJBQ0tFVF9PRkYpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRBRUJyYWNrZXQKKyAqCisgKiBERVNDUklQVElPTjogc2V0IEFFIGJyYWNrZXQgdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGFlY0JyYWNrZXRTdHIgOiBBRSBicmFja2V0IHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEFFQnJhY2tldChjb25zdCBjaGFyICphZWNCcmFja2V0U3RyKQoreworICAgIGlmIChhZWNCcmFja2V0U3RyID09IE5VTEwpIHsKKyAgICAgICAgTE9HRCgic2V0QUVCcmFja2V0IHdpdGggTlVMTCB2YWx1ZSIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgY2FtX2V4cF9icmFja2V0aW5nX3QgZXhwQnJhY2tldDsKKyAgICBtZW1zZXQoJmV4cEJyYWNrZXQsIDAsIHNpemVvZihleHBCcmFja2V0KSk7CisKKyAgICBpbnQgdmFsdWUgPSBsb29rdXBBdHRyKEJSQUNLRVRJTkdfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShCUkFDS0VUSU5HX01PREVTX01BUCksCisgICAgICAgICAgICBhZWNCcmFja2V0U3RyKTsKKyAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgY2FzZSBDQU1fRVhQX0JSQUNLRVRJTkdfT046CisgICAgICAgIHsKKyAgICAgICAgICAgIExPR0QoIkVYUF9CUkFDS0VUSU5HX09OIik7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzdHJfdmFsID0gZ2V0KEtFWV9RQ19DQVBUVVJFX0JVUlNUX0VYUE9TVVJFKTsKKyAgICAgICAgICAgIGlmICgoc3RyX3ZhbCAhPSBOVUxMKSAmJiAoc3RybGVuKHN0cl92YWwpPjApKSB7CisgICAgICAgICAgICAgICAgZXhwQnJhY2tldC5tb2RlID0gQ0FNX0VYUF9CUkFDS0VUSU5HX09OOworICAgICAgICAgICAgICAgIG1fYkFlQnJhY2tldGluZ0VuYWJsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHN0cmxjcHkoZXhwQnJhY2tldC52YWx1ZXMsIHN0cl92YWwsIE1BWF9FWFBfQlJBQ0tFVElOR19MRU5HVEgpOworICAgICAgICAgICAgICAgIExPR0QoInNldHRpbmcgRXhwb3N1cmUgQnJhY2tldGluZyB2YWx1ZSBvZiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIGV4cEJyYWNrZXQudmFsdWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEFwcHMgbm90IHNldCBjYXB0dXJlLWJ1cnN0LWV4cG9zdXJlcywgZXJyb3IgY2FzZSBmYWxsIGludG8gYnJhY2tldGluZyBvZmYgbW9kZSAqLworICAgICAgICAgICAgICAgIExPR0QoImNhcHR1cmUtYnVyc3QtZXhwb3N1cmVzIG5vdCBzZXQsIGJhY2sgdG8gSERSIE9GRiBtb2RlIik7CisgICAgICAgICAgICAgICAgbV9iQWVCcmFja2V0aW5nRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGV4cEJyYWNrZXQubW9kZSA9IENBTV9FWFBfQlJBQ0tFVElOR19PRkY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgbV9iQWVCcmFja2V0aW5nRW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgTE9HSCgiLCBFWFBfQlJBQ0tFVElOR19PRkYiKTsKKyAgICAgICAgICAgIGV4cEJyYWNrZXQubW9kZSA9IENBTV9FWFBfQlJBQ0tFVElOR19PRkY7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gQ2FjaGUgY2xpZW50IEFFIGJyYWNrZXRpbmcgY29uZmlndXJhdGlvbgorICAgIG1lbWNweSgmbV9BRUJyYWNrZXRpbmdDbGllbnQsICZleHBCcmFja2V0LCBzaXplb2YoY2FtX2V4cF9icmFja2V0aW5nX3QpKTsKKworICAgIC8qIHNhdmUgdGhlIHZhbHVlKi8KKyAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19BRV9CUkFDS0VUX0hEUiwgYWVjQnJhY2tldFN0cik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldDNBTG9jaworICoKKyAqIERFU0NSSVBUSU9OOiBlbmFibGUvZGlzYWJsZSAzQSBsb2NrLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbG9jazNBICA6IGxvY2sgb3IgdW5sb2NrCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0M0FMb2NrKGJvb2wgbG9jazNBKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBMT0dIKCJTZXR0aW5nIExvY2sgJWQiLCBsb2NrM0EpOworICAgIGlmKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwICkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKyAgICB1aW50MzJfdCBmb2N1c19tb2RlID0gQ0FNX0ZPQ1VTX01PREVfQVVUTzsKKyAgICBpZiAobG9jazNBKSB7CisgICAgICAgIGlmIChpc1ViaUZvY3VzRW5hYmxlZCgpIHx8IGlzVWJpUmVmb2N1cygpKSB7CisgICAgICAgICAgICAvL0ZvciBVYmkgZm9jdXMgbW92ZSBmb2N1cyB0byBpbmZpbml0eS4KKyAgICAgICAgICAgIGZvY3VzX21vZGUgPSBDQU1fRk9DVVNfTU9ERV9JTkZJTklUWTsKKyAgICAgICAgfSBlbHNlIGlmIChpc09wdGlab29tRW5hYmxlZCgpIHx8IGlzU3RpbGxNb3JlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAvL0ZvciBvcHRpem9vbSBhbmQgc3RpbGxtb3JlLCBzZXQgZm9jdXMgYXMgZml4ZWQuCisgICAgICAgICAgICBmb2N1c19tb2RlID0gQ0FNX0ZPQ1VTX01PREVfRklYRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyByZXRyaWV2ZSBwcmV2aW91cyBmb2N1cyB2YWx1ZS4KKyAgICAgICAgY29uc3QgY2hhciAqZm9jdXMgPSBnZXQoS0VZX0ZPQ1VTX01PREUpOworICAgICAgICBpbnQgdmFsID0gbG9va3VwQXR0cihGT0NVU19NT0RFU19NQVAsIFBBUkFNX01BUF9TSVpFKEZPQ1VTX01PREVTX01BUCksIGZvY3VzKTsKKyAgICAgICAgaWYgKHZhbCAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgZm9jdXNfbW9kZSA9ICh1aW50MzJfdCkgdmFsOworICAgICAgICAgICAgTE9HRCgiZm9jdXMgbW9kZSAlcyIsIGZvY3VzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvL0xvY2sgQVdCCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fQVdCX0xPQ0ssICh1aW50MzJfdClsb2NrM0EpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIC8vTG9jayBBRUMKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9BRUNfTE9DSywgKHVpbnQzMl90KWxvY2szQSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fRk9DVVNfTU9ERSwgZm9jdXNfbW9kZSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByYyA9IGNvbW1pdFNldEJhdGNoKCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBjb21taXQgYmF0Y2giKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEFuZENvbW1pdFpvb20KKyAqCisgKiBERVNDUklQVElPTjogc2V0IHpvb20uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgICAgQHpvb21fbGV2ZWwgOiB6b29tIGxldmVsIHRvIHNldC4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRBbmRDb21taXRab29tKGludCB6b29tX2xldmVsKQoreworICAgIExPR0goIkUiKTsKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgaWYgKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwICkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX1pPT00sIHpvb21fbGV2ZWwpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByYyA9IGNvbW1pdFNldEJhdGNoKCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgRmxhc2ggdmFsdWUiKTsKKyAgICB9CisKKyAgICBtWm9vbUxldmVsID0gem9vbV9sZXZlbDsKKyAgICBMT0dIKCJYIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNPcHRpWm9vbUVuYWJsZWQKKyAqCisgKiBERVNDUklQVElPTjogY2hlY2tzIHdoZXRoZXIgb3B0aXpvb20gaXMgZW5hYmxlZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlIC0gZW5hYmxlZCwgZmFsc2UgLSBkaXNhYmxlZAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyczo6aXNPcHRpWm9vbUVuYWJsZWQoKQoreworICAgIGlmIChtX2JPcHRpWm9vbU9uICYmICgwIDw9IG1QYXJtWm9vbUxldmVsKSkgeworICAgICAgICB1aW50MzJfdCB6b29tX2xldmVsID0gKHVpbnQzMl90KSBtUGFybVpvb21MZXZlbDsKKyAgICAgICAgY2FtX29wdGlfem9vbV90ICpvcHRpX3pvb21fc2V0dGluZ3NfbmVlZCA9CisgICAgICAgICAgICAgICAgJihtX3BDYXBhYmlsaXR5LT5vcHRpX3pvb21fc2V0dGluZ3NfbmVlZCk7CisgICAgICAgIHVpbnQzMl90IHpvb21fdGhyZXNob2xkID0gKHVpbnQzMl90KSBvcHRpX3pvb21fc2V0dGluZ3NfbmVlZC0+em9vbV90aHJlc2hvbGQ7CisgICAgICAgIExPR0goImN1cnJlbnQgem9vbSBsZXZlbCA9JXUgJiB6b29tX3RocmVzaG9sZCA9JXUiLAorICAgICAgICAgICAgICAgICB6b29tX2xldmVsLCB6b29tX3RocmVzaG9sZCk7CisKKyAgICAgICAgaWYgKHpvb21fbGV2ZWwgPj0gem9vbV90aHJlc2hvbGQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldE5vaXNlUmVkdWN0aW9uTW9kZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgbm9pc2UgcmVkdWN0aW9uIG1vZGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG5vaXNlUmVkdWN0aW9uTW9kZVN0ciA6IG5vaXNlIHJlZHVjdGlvbiBtb2RlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0Tm9pc2VSZWR1Y3Rpb25Nb2RlKGNvbnN0IGNoYXIgKm5vaXNlUmVkdWN0aW9uTW9kZVN0cikKK3sKKyAgICBMT0dIKCJub2lzZVJlZHVjdGlvbk1vZGVTdHIgPSAlcyIsIG5vaXNlUmVkdWN0aW9uTW9kZVN0cik7CisgICAgaWYgKG5vaXNlUmVkdWN0aW9uTW9kZVN0ciAhPSBOVUxMKSB7CisgICAgICAgIGludCB2YWx1ZSA9IGxvb2t1cEF0dHIoTk9JU0VfUkVEVUNUSU9OX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoTk9JU0VfUkVEVUNUSU9OX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgbm9pc2VSZWR1Y3Rpb25Nb2RlU3RyKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBtX2JIaWdoUXVhbGl0eU5vaXNlUmVkdWN0aW9uTW9kZSA9CisgICAgICAgICAgICAgICAgICAgICFzdHJuY21wKFZBTFVFX0hJR0hfUVVBTElUWSwgbm9pc2VSZWR1Y3Rpb25Nb2RlU3RyLCBzdHJsZW4oVkFMVUVfSElHSF9RVUFMSVRZKSk7CisgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19OT0lTRV9SRURVQ1RJT05fTU9ERSwgbm9pc2VSZWR1Y3Rpb25Nb2RlU3RyKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dFKCJJbnZhbGlkIG5vaXNlIHJlZHVjdGlvbiBtb2RlIHZhbHVlOiAlcyIsCisgICAgICAgICAgICAobm9pc2VSZWR1Y3Rpb25Nb2RlU3RyID09IE5VTEwpID8gIk5VTEwiIDogbm9pc2VSZWR1Y3Rpb25Nb2RlU3RyKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbW1pdEFGQnJhY2tldAorICoKKyAqIERFU0NSSVBUSU9OOiBjb21taXQgQUYgQnJhY2tldC4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQEFGQnJhY2tldCA6IEFGIGJyYWNrZXRpbmcgY29uZmlndXJhdGlvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmNvbW1pdEFGQnJhY2tldChjYW1fYWZfYnJhY2tldGluZ190IGFmQnJhY2tldCkKK3sKKworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpZihpbml0QmF0Y2hVcGRhdGUobV9wUGFyYW1CdWYpIDwgMCApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZ3JvdXAgdXBkYXRlIHRhYmxlIik7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9GT0NVU19CUkFDS0VUSU5HLCBhZkJyYWNrZXQpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByYyA9IGNvbW1pdFNldEJhdGNoKCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBjb21taXQgYmF0Y2giKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRBRkJyYWNrZXQKKyAqCisgKiBERVNDUklQVElPTjogc2V0IEFGIGJyYWNrZXQgdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGFmQnJhY2tldFN0ciA6IEFGIGJyYWNrZXQgdmFsdWUgc3RyaW5nCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0QUZCcmFja2V0KGNvbnN0IGNoYXIgKmFmQnJhY2tldFN0cikKK3sKKyAgICBMT0dIKCJhZkJyYWNrZXRTdHIgPSVzIixhZkJyYWNrZXRTdHIpOworCisgICAgaWYoYWZCcmFja2V0U3RyICE9IE5VTEwpIHsKKyAgICAgICAgaW50IHZhbHVlID0gbG9va3VwQXR0cihBRl9CUkFDS0VUSU5HX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoQUZfQlJBQ0tFVElOR19NT0RFU19NQVApLAorICAgICAgICAgICAgICAgIGFmQnJhY2tldFN0cik7CisgICAgICAgIGlmICh2YWx1ZSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgbV9iQUZCcmFja2V0aW5nT24gPSAodmFsdWUgIT0gMCk7CisgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19BRl9CUkFDS0VULCBhZkJyYWNrZXRTdHIpOworCisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dFKCJJbnZhbGlkIGFmIGJyYWNrZXQgdmFsdWU6ICVzIiwKKyAgICAgICAgKGFmQnJhY2tldFN0ciA9PSBOVUxMKSA/ICJOVUxMIiA6IGFmQnJhY2tldFN0cik7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRSZUZvY3VzCisgKgorICogREVTQ1JJUFRJT046IHNldCByZWZvY3VzIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBhZkJyYWNrZXRTdHIgOiByZWZvY3VzIHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFJlRm9jdXMoY29uc3QgY2hhciAqcmVGb2N1c1N0cikKK3sKKyAgICBMT0dIKCJyZUZvY3VzU3RyID0lcyIscmVGb2N1c1N0cik7CisKKyAgICBpZiAocmVGb2N1c1N0ciAhPSBOVUxMKSB7CisgICAgICAgIGludCB2YWx1ZSA9IGxvb2t1cEF0dHIoUkVfRk9DVVNfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShSRV9GT0NVU19NT0RFU19NQVApLAorICAgICAgICAgICAgICAgIHJlRm9jdXNTdHIpOworICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIG1fYlJlRm9jdXNPbiA9ICh2YWx1ZSAhPSAwKTsKKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1JFX0ZPQ1VTLCByZUZvY3VzU3RyKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRDaHJvbWFGbGFzaAorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgY2hyb21hIGZsYXNoIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBhZWNCcmFja2V0U3RyIDogY2hyb21hIGZsYXNoIHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldENocm9tYUZsYXNoKGNvbnN0IGNoYXIgKmNocm9tYUZsYXNoU3RyKQoreworICAgIExPR0goImNocm9tYUZsYXNoU3RyID0lcyIsY2hyb21hRmxhc2hTdHIpOworICAgIGlmKGNocm9tYUZsYXNoU3RyICE9IE5VTEwpIHsKKyAgICAgICAgaW50IHZhbHVlID0gbG9va3VwQXR0cihDSFJPTUFfRkxBU0hfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShDSFJPTUFfRkxBU0hfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICBjaHJvbWFGbGFzaFN0cik7CisgICAgICAgIGlmKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBtX2JDaHJvbWFGbGFzaE9uID0gKHZhbHVlICE9IDApOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfQ0hST01BX0ZMQVNILCBjaHJvbWFGbGFzaFN0cik7CisKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR0UoIkludmFsaWQgY2hyb21hIGZsYXNoIHZhbHVlOiAlcyIsCisgICAgICAgIChjaHJvbWFGbGFzaFN0ciA9PSBOVUxMKSA/ICJOVUxMIiA6IGNocm9tYUZsYXNoU3RyKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldE9wdGlab29tCisgKgorICogREVTQ1JJUFRJT046IHNldCBvcHRpIHpvb20gdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG9wdGlab29tU3RyIDogb3B0aSB6b29tIHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldE9wdGlab29tKGNvbnN0IGNoYXIgKm9wdGlab29tU3RyKQoreworICAgIExPR0goIm9wdGlab29tU3RyID0lcyIsb3B0aVpvb21TdHIpOworICAgIGlmKG9wdGlab29tU3RyICE9IE5VTEwpIHsKKyAgICAgICAgaW50IHZhbHVlID0gbG9va3VwQXR0cihPUFRJX1pPT01fTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShPUFRJX1pPT01fTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICBvcHRpWm9vbVN0cik7CisgICAgICAgIGlmKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBtX2JPcHRpWm9vbU9uID0gKHZhbHVlICE9IDApOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfT1BUSV9aT09NLCBvcHRpWm9vbVN0cik7CisKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dFKCJJbnZhbGlkIG9wdGkgem9vbSB2YWx1ZTogJXMiLAorICAgICAgICAob3B0aVpvb21TdHIgPT0gTlVMTCkgPyAiTlVMTCIgOiBvcHRpWm9vbVN0cik7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRUcnVlUG9ydHJhaXQKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHRydWUgcG9ydHJhaXQgdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG9wdGlab29tU3RyIDogdHJ1ZSBwb3J0cmFpdCB2YWx1ZSBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRUcnVlUG9ydHJhaXQoY29uc3QgY2hhciAqdHJ1ZVBvcnRyYWl0U3RyKQoreworICAgIExPR0goInRydWVQb3J0cmFpdFN0ciA9JXMiLCB0cnVlUG9ydHJhaXRTdHIpOworICAgIGlmICh0cnVlUG9ydHJhaXRTdHIgIT0gTlVMTCkgeworICAgICAgICBpbnQgdmFsdWUgPSBsb29rdXBBdHRyKFRSVUVfUE9SVFJBSVRfTU9ERVNfTUFQLAorICAgICAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKFRSVUVfUE9SVFJBSVRfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICB0cnVlUG9ydHJhaXRTdHIpOworICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIG1fYlRydWVQb3J0cmFpdE9uID0gKHZhbHVlICE9IDApOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfVFJVRV9QT1JUUkFJVCwgdHJ1ZVBvcnRyYWl0U3RyKTsKKyAgICAgICAgICAgIHNldEZhY2VEZXRlY3Rpb24obV9iRmFjZURldGVjdGlvbk9uLCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HSCgiSW52YWxpZCB0cnVlIHBvcnRyYWl0IHZhbHVlOiAlcyIsCisgICAgICAgICAgICAodHJ1ZVBvcnRyYWl0U3RyID09IE5VTEwpID8gIk5VTEwiIDogdHJ1ZVBvcnRyYWl0U3RyKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEhEUk1vZGUKKyAqCisgKiBERVNDUklQVElPTjogc2V0IGhkciBtb2RlIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBoZHJNb2RlU3RyIDogaGRyIG1vZGUgdmFsdWUgc3RyaW5nCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0SERSTW9kZShjb25zdCBjaGFyICpoZHJNb2RlU3RyKQoreworICAgIExPR0goImhkck1vZGVTdHIgPSVzIiwgaGRyTW9kZVN0cik7CisgICAgaWYgKGhkck1vZGVTdHIgIT0gTlVMTCkgeworICAgICAgICBpbnQgdmFsdWUgPSBsb29rdXBBdHRyKEhEUl9NT0RFU19NQVAsIFBBUkFNX01BUF9TSVpFKEhEUl9NT0RFU19NQVApLCBoZHJNb2RlU3RyKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIgPSBnZXQoS0VZX1NDRU5FX01PREUpOworCisgICAgICAgICAgICBtX2JIRFJNb2RlU2Vuc29yID0gIXN0cm5jbXAoaGRyTW9kZVN0ciwgSERSX01PREVfU0VOU09SLCBzdHJsZW4oSERSX01PREVfU0VOU09SKSk7CisKKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX0hEUl9NT0RFLCBoZHJNb2RlU3RyKTsKKworICAgICAgICAgICAgLy8gSWYgaGRyIGlzIGFscmVhZHkgc2VsZWN0ZWQsIG5lZWQgdG8gZGVzZWxlY3QgaXQgaW4gbG9jYWwgY2FjaGUKKyAgICAgICAgICAgIC8vIFNvIHRoZSBuZXcgaGRyIG1vZGUgd2lsbCBiZSBhcHBsaWVkCisgICAgICAgICAgICBpZiAoc3RyICYmICFzdHJuY21wKHN0ciwgU0NFTkVfTU9ERV9IRFIsIHN0cmxlbihTQ0VORV9NT0RFX0hEUikpKSB7CisgICAgICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfU0NFTkVfTU9ERSwgU0NFTkVfTU9ERV9BVVRPKTsKKyAgICAgICAgICAgICAgICBtX2JOZWVkUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dIKCJJbnZhbGlkIGhkciBtb2RlIHZhbHVlOiAlcyIsCisgICAgICAgICAgICAoaGRyTW9kZVN0ciA9PSBOVUxMKSA/ICJOVUxMIiA6IGhkck1vZGVTdHIpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U2VlTW9yZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgc2VlIG1vcmUgdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHNlZU1vcmVTdHIgOiBzZWUgbW9yZSB2YWx1ZSBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRTZWVNb3JlKGNvbnN0IGNoYXIgKnNlZU1vcmVTdHIpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgTE9HSCgic2VlTW9yZVN0ciA9JXMiLCBzZWVNb3JlU3RyKTsKKyAgICBpZiAoc2VlTW9yZVN0ciAhPSBOVUxMKSB7CisgICAgICAgIGludCB2YWx1ZSA9IGxvb2t1cEF0dHIoT05fT0ZGX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShPTl9PRkZfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICBzZWVNb3JlU3RyKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBtX2JTZWVNb3JlT24gPSAodmFsdWUgIT0gMCk7CisKKyAgICAgICAgICAgIC8vIElmIFNlZU1vcmUgaXMgZW5hYmxlZCwgZW5hYmxlIFN0aWxsTW9yZSBmb3IgbGl2ZSBzbmFwc2hvdAorICAgICAgICAgICAgLy8gYW5kIGRpc2FibGUgdG9uZSBtYXAKKyAgICAgICAgICAgIGlmIChtX2JTZWVNb3JlT24pIHsKKyAgICAgICAgICAgICAgICBtX2JTdGlsbE1vcmVPbiA9IFRSVUU7CisgICAgICAgICAgICAgICAgaWYgKCFtX2JMdG1Gb3JTZWVNb3JlRW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICByYyA9IHNldFRvbmVNYXBNb2RlKGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBMT0dIKCJGYWlsZWQgdG8gZGlzYWJsZSB0b25lIG1hcCBkdXJpbmcgU2VlTW9yZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbV9iU3RpbGxNb3JlT24gPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBpZiAoIW1fYkx0bUZvclNlZU1vcmVFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gc2V0VG9uZU1hcE1vZGUodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HSCgiRmFpbGVkIHRvIGVuYWJsZSB0b25lIG1hcCBkdXJpbmcgU2VlTW9yZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1NFRV9NT1JFLCBzZWVNb3JlU3RyKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dFKCJJbnZhbGlkIHNlZSBtb3JlIHZhbHVlOiAlcyIsCisgICAgICAgICAgICAoc2VlTW9yZVN0ciA9PSBOVUxMKSA/ICJOVUxMIiA6IHNlZU1vcmVTdHIpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U3RpbGxNb3JlCisgKgorICogREVTQ1JJUFRJT046IHNldCBzdGlsbCBtb3JlIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzZWVNb3JlU3RyIDogc3RpbGwgbW9yZSB2YWx1ZSBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRTdGlsbE1vcmUoY29uc3QgY2hhciAqc3RpbGxNb3JlU3RyKQoreworICAgIExPR0goInN0aWxsTW9yZVN0ciA9JXMiLCBzdGlsbE1vcmVTdHIpOworICAgIGlmIChzdGlsbE1vcmVTdHIgIT0gTlVMTCkgeworICAgICAgICBpbnQgdmFsdWUgPSBsb29rdXBBdHRyKFNUSUxMX01PUkVfTU9ERVNfTUFQLCBQQVJBTV9NQVBfU0laRShTVElMTF9NT1JFX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgc3RpbGxNb3JlU3RyKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBtX2JTdGlsbE1vcmVPbiA9ICh2YWx1ZSAhPSAwKTsKKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1NUSUxMX01PUkUsIHN0aWxsTW9yZVN0cik7CisKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dFKCJJbnZhbGlkIHN0aWxsIG1vcmUgdmFsdWU6ICVzIiwKKyAgICAgICAgICAgIChzdGlsbE1vcmVTdHIgPT0gTlVMTCkgPyAiTlVMTCIgOiBzdGlsbE1vcmVTdHIpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0SERSTmVlZDF4CisgKgorICogREVTQ1JJUFRJT046IHNldCBoZHIgbmVlZCAxeCB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaGRyTW9kZVN0ciA6IGhkciBuZWVkIDF4IHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEhEUk5lZWQxeChjb25zdCBjaGFyICpoZHJOZWVkMXhTdHIpCit7CisgICAgTE9HSCgiaGRyTmVlZDF4U3RyID0lcyIsIGhkck5lZWQxeFN0cik7CisgICAgaWYgKGhkck5lZWQxeFN0ciAhPSBOVUxMKSB7CisgICAgICAgIGludCB2YWx1ZSA9IGxvb2t1cEF0dHIoVFJVRV9GQUxTRV9NT0RFU19NQVAsIFBBUkFNX01BUF9TSVpFKFRSVUVfRkFMU0VfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICBoZHJOZWVkMXhTdHIpOworICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX0hEUl9ORUVEXzFYLCBoZHJOZWVkMXhTdHIpOworICAgICAgICAgICAgbV9iSERSMXhGcmFtZUVuYWJsZWQgPSAhc3RybmNtcChoZHJOZWVkMXhTdHIsIFZBTFVFX1RSVUUsIHN0cmxlbihWQUxVRV9UUlVFKSk7CisgICAgICAgICAgICBtX2JOZWVkUmVzdGFydCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX0hEUl9ORUVEXzFYLAorICAgICAgICAgICAgICAgICAgICBtX2JIRFIxeEZyYW1lRW5hYmxlZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HSCgiSW52YWxpZCBoZHIgbmVlZCAxeCB2YWx1ZTogJXMiLAorICAgICAgICAgICAgKGhkck5lZWQxeFN0ciA9PSBOVUxMKSA/ICJOVUxMIiA6IGhkck5lZWQxeFN0cik7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRBRUJyYWNrZXRpbmcKKyAqCisgKiBERVNDUklQVElPTjogZW5hYmxlcyBBRSBicmFja2V0aW5nCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0QUVCcmFja2V0aW5nKCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgaWYoaW5pdEJhdGNoVXBkYXRlKG1fcFBhcmFtQnVmKSA8IDAgKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGdyb3VwIHVwZGF0ZSB0YWJsZSIpOworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fSERSLCBtX0FFQnJhY2tldGluZ0NsaWVudCkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHVwZGF0ZSBBRSBicmFja2V0aW5nIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCgpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIEFFIGJyYWNrZXRpbmciKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRIRFJBRUJyYWNrZXQKKyAqCisgKiBERVNDUklQVElPTjogZW5hYmxlcyBBRSBicmFja2V0aW5nIGZvciBIRFIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGhkckJyYWNrZXQgOiBIRFIgYnJhY2tldGluZyBjb25maWd1cmF0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0SERSQUVCcmFja2V0KGNhbV9leHBfYnJhY2tldGluZ190IGhkckJyYWNrZXQpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGlmKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwICkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX0hEUiwgaGRyQnJhY2tldCkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHVwZGF0ZSB0YWJsZSIpOworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCgpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIEhEUiBicmFja2V0aW5nIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0Q2FjaGVWaWRlb0J1ZmZlcnMKKyAqCisgKiBERVNDUklQVElPTjogc2V0IGNhY2hlIHZpZGVvIGJ1ZmZlcnMgdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhY2hlVmlkZW9TdHIgOiBjYWNoZSB2aWRlbyBidWZmZXIgdmFsdWUgc3RyaW5nCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0Q2FjaGVWaWRlb0J1ZmZlcnMoY29uc3QgY2hhciAqY2FjaGVWaWRlb0J1ZlN0cikKK3sKKyAgICBpZiAoY2FjaGVWaWRlb0J1ZlN0ciAhPSBOVUxMKSB7CisgICAgICAgIGludDhfdCBjYWNoZVZpZGVvQnVmID0gbG9va3VwQXR0cihFTkFCTEVfRElTQUJMRV9NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoRU5BQkxFX0RJU0FCTEVfTU9ERVNfTUFQKSwgY2FjaGVWaWRlb0J1ZlN0cik7CisgICAgICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICBtZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5tZW0udXNlY2FjaGUiLCBwcm9wLCAiIik7CisgICAgICAgIGlmIChzdHJsZW4ocHJvcCkgPiAwKSB7CisgICAgICAgICAgICBjYWNoZVZpZGVvQnVmID0gYXRvaShwcm9wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2FjaGVWaWRlb0J1ZiAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgY29uc3QgY2hhciAqY2FjaGVTdHIgPSAoc3RybGVuKHByb3ApPjApID8gcHJvcCA6IGNhY2hlVmlkZW9CdWZTdHI7CisgICAgICAgICAgICBMT0dEKCJTZXR0aW5nIHZpZGVvIGJ1ZmZlciAlcyIsCisgICAgICAgICAgICAgICAgICAgIChjYWNoZVZpZGVvQnVmID09IDApID8gIlVuQ2FjaGVkIiA6ICJDYWNoZWQiKTsKKyAgICAgICAgICAgIHJldHVybiB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19DQUNIRV9WSURFT19CVUZGRVJTLCBjYWNoZVN0cik7CisgICAgICAgIH0KKyAgICAgICAgTE9HRSgiQ2FjaGUgdmlkZW8gYnVmZmVycyBub3Qgc2V0IGNvcnJlY3RseSIpOworICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0Q2FjaGVWaWRlb0J1ZmZlcnMKKyAqCisgKiBERVNDUklQVElPTjogU2V0IGJ1ZmZlcnMgYXMgQ2FjaGUvVW5jYWNoZSBNZW1vcnkKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyAgOiB1c2VyIHNldHRpbmcgcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldENhY2hlVmlkZW9CdWZmZXJzKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gcGFyYW1zLmdldChLRVlfUUNfQ0FDSEVfVklERU9fQlVGRkVSUyk7OworICAgIGNvbnN0IGNoYXIgKnByZXZfc3RyID0gZ2V0KEtFWV9RQ19DQUNIRV9WSURFT19CVUZGRVJTKTsKKworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpZiAocHJldl9zdHIgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIHN0cmNtcChzdHIsIHByZXZfc3RyKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gc2V0Q2FjaGVWaWRlb0J1ZmZlcnMoc3RyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVzdG9yZUFFQnJhY2tldAorICoKKyAqIERFU0NSSVBUSU9OOiByZXN0b3JlcyBjbGllbnQgQUUgYnJhY2tldGluZyBjb25maWd1cmF0aW9uIGFmdGVyIEhEUiBpcyBkb25lCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c3RvcEFFQnJhY2tldCgpCit7CisgIGNhbV9leHBfYnJhY2tldGluZ190IGJyYWNrZXRpbmc7CisKKyAgYnJhY2tldGluZy5tb2RlID0gQ0FNX0VYUF9CUkFDS0VUSU5HX09GRjsKKworICByZXR1cm4gc2V0SERSQUVCcmFja2V0KGJyYWNrZXRpbmcpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVwZGF0ZUZsYXNoCisgKgorICogREVTQ1JJUFRJT046IHJlc3RvcmVzIGNsaWVudCBmbGFzaCBjb25maWd1cmF0aW9uIG9yIGRpc2FibGVzIGZsYXNoCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjb21taXRTZXR0aW5ncyA6IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHNldHRpbmdzIG5lZWQgdG8gYmUgY29tbWl0ZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjp1cGRhdGVGbGFzaChib29sIGNvbW1pdFNldHRpbmdzKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpbnQzMl90IHZhbHVlOworCisgICAgaWYgKGNvbW1pdFNldHRpbmdzKSB7CisgICAgICBpZihpbml0QmF0Y2hVcGRhdGUobV9wUGFyYW1CdWYpIDwgMCApIHsKKyAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzSERSRW5hYmxlZCgpIHx8IG1fYkFlQnJhY2tldGluZ0VuYWJsZWQgfHwgbV9iQUZCcmFja2V0aW5nT24gfHwKKyAgICAgICAgICBtX2JPcHRpWm9vbU9uIHx8IG1fYlJlRm9jdXNPbiB8fCBtX2JTdGlsbE1vcmVPbikgeworICAgICAgICB2YWx1ZSA9IENBTV9GTEFTSF9NT0RFX09GRjsKKyAgICB9IGVsc2UgaWYgKG1fYkNocm9tYUZsYXNoT24pIHsKKyAgICAgICAgdmFsdWUgPSBDQU1fRkxBU0hfTU9ERV9PTjsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZSA9IG1GbGFzaFZhbHVlOworICAgIH0KKworICAgIGlmICh2YWx1ZSAhPSBtRmxhc2hEYWVtb25WYWx1ZSkgeworICAgICAgICBMT0dEKCJTZXR0aW5nIEZsYXNoIHZhbHVlICVkIiwgdmFsdWUpOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9MRURfTU9ERSwgdmFsdWUpKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IGxlZCBtb2RlIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1GbGFzaERhZW1vblZhbHVlID0gdmFsdWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmMgPSBOT19FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoY29tbWl0U2V0dGluZ3MpIHsKKyAgICAgICAgcmMgPSBjb21taXRTZXRCYXRjaCgpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBjb25maWd1cmUgSERSIGJyYWNrZXRpbmciKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRSZWRleWVSZWR1Y3Rpb24KKyAqCisgKiBERVNDUklQVElPTjogc2V0IHJlZCBleWUgcmVkdWN0aW9uIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEByZWRleWVTdHIgOiByZWQgZXllIHJlZHVjdGlvbiB2YWx1ZSBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRSZWRleWVSZWR1Y3Rpb24oY29uc3QgY2hhciAqcmVkZXllU3RyKQoreworICAgIGlmIChyZWRleWVTdHIgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihFTkFCTEVfRElTQUJMRV9NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoRU5BQkxFX0RJU0FCTEVfTU9ERVNfTUFQKSwgcmVkZXllU3RyKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBMT0dEKCJTZXR0aW5nIFJlZEV5ZSBSZWR1Y2UgdmFsdWUgJXMiLCByZWRleWVTdHIpOworICAgICAgICAgICAgdXBkYXRlUGFyYW1FbnRyeShLRVlfUUNfUkVERVlFX1JFRFVDVElPTiwgcmVkZXllU3RyKTsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLAorICAgICAgICAgICAgICAgICAgICBDQU1fSU5URl9QQVJNX1JFREVZRV9SRURVQ1RJT04sIHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiSW52YWxpZCBSZWRFeWUgUmVkdWNlIHZhbHVlOiAlcyIsCisgICAgICAgICAgIChyZWRleWVTdHIgPT0gTlVMTCkgPyAiTlVMTCIgOiByZWRleWVTdHIpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RGVub2lzZVByb2Nlc3NQbGF0ZQorICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBkZW5vaXNlIHByb2Nlc3MgcGxhdGUKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOUiBwcm9jZXNzIHBsYXRlIHZsYXVlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2NhbV9kZW5vaXNlX3Byb2Nlc3NfdHlwZV90CisgICAgICAgIFFDYW1lcmFQYXJhbWV0ZXJzOjpnZXREZW5vaXNlUHJvY2Vzc1BsYXRlKGNhbV9pbnRmX3Bhcm1fdHlwZV90IHR5cGUpCit7CisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgY2FtX2Rlbm9pc2VfcHJvY2Vzc190eXBlX3QgcHJvY2Vzc1BsYXRlID0gQ0FNX1dBVkVMRVRfREVOT0lTRV9DQkNSX09OTFk7CisgICAgaWYgKENBTV9JTlRGX1BBUk1fV0FWRUxFVF9ERU5PSVNFID09IHR5cGUpIHsKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmRlbm9pc2UucHJvY2Vzcy5wbGF0ZXMiLCBwcm9wLCAiIik7CisgICAgfSBlbHNlIGlmIChDQU1fSU5URl9QQVJNX1RFTVBPUkFMX0RFTk9JU0UgPT0gdHlwZSkgeworICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QudG5yLnByb2Nlc3MucGxhdGVzIiwgcHJvcCwgIiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coIlR5cGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICBwcm9wWzBdID0gJ1wwJzsKKyAgICB9CisgICAgaWYgKHN0cmxlbihwcm9wKSA+IDApIHsKKyAgICAgICAgc3dpdGNoKGF0b2kocHJvcCkpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcHJvY2Vzc1BsYXRlID0gQ0FNX1dBVkVMRVRfREVOT0lTRV9ZQ0JDUl9QTEFORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBwcm9jZXNzUGxhdGUgPSBDQU1fV0FWRUxFVF9ERU5PSVNFX0NCQ1JfT05MWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwcm9jZXNzUGxhdGUgPSBDQU1fV0FWRUxFVF9ERU5PSVNFX1NUUkVBTUxJTkVfWUNCQ1I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcHJvY2Vzc1BsYXRlID0gQ0FNX1dBVkVMRVRfREVOT0lTRV9TVFJFQU1MSU5FRF9DQkNSOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcm9jZXNzUGxhdGUgPSBDQU1fV0FWRUxFVF9ERU5PSVNFX0NCQ1JfT05MWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwcm9jZXNzUGxhdGU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0V2F2ZWxldERlbm9pc2UKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHdhdmVsZXQgZGVub2lzZSB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAd25yU3RyIDogd2F2ZWxldCBkZW5vaXNlIHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFdhdmVsZXREZW5vaXNlKGNvbnN0IGNoYXIgKnduclN0cikKK3sKKyAgICBpZiAoKG1fcENhcGFiaWxpdHktPnFjb21fc3VwcG9ydGVkX2ZlYXR1cmVfbWFzayAmIENBTV9RQ09NX0ZFQVRVUkVfREVOT0lTRTJEKSA9PSAwKXsKKyAgICAgICAgTE9HSCgiV05SIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGlmICh3bnJTdHIgIT0gTlVMTCkgeworICAgICAgICBpbnQgdmFsdWUgPSBsb29rdXBBdHRyKERFTk9JU0VfT05fT0ZGX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShERU5PSVNFX09OX09GRl9NT0RFU19NQVApLCB3bnJTdHIpOworICAgICAgICBpZiAodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX0RFTk9JU0UsIHduclN0cik7CisKKyAgICAgICAgICAgIGNhbV9kZW5vaXNlX3BhcmFtX3QgdGVtcDsKKyAgICAgICAgICAgIG1lbXNldCgmdGVtcCwgMCwgc2l6ZW9mKHRlbXApKTsKKyAgICAgICAgICAgIHRlbXAuZGVub2lzZV9lbmFibGUgPSAodWludDhfdCl2YWx1ZTsKKyAgICAgICAgICAgIG1fYldOUk9uID0gKHZhbHVlICE9IDApOworICAgICAgICAgICAgaWYgKG1fYldOUk9uKSB7CisgICAgICAgICAgICAgICAgdGVtcC5wcm9jZXNzX3BsYXRlcyA9IGdldERlbm9pc2VQcm9jZXNzUGxhdGUoQ0FNX0lOVEZfUEFSTV9XQVZFTEVUX0RFTk9JU0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HRCgiRGVub2lzZSBlbmFibGU9JWQsIHBsYXRlcz0lZCIsCisgICAgICAgICAgICAgICAgICAgdGVtcC5kZW5vaXNlX2VuYWJsZSwgdGVtcC5wcm9jZXNzX3BsYXRlcyk7CisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9XQVZFTEVUX0RFTk9JU0UsIHRlbXApKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dFKCJJbnZhbGlkIERlbm9pc2UgdmFsdWU6ICVzIiwgKHduclN0ciA9PSBOVUxMKSA/ICJOVUxMIiA6IHduclN0cik7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRSZGlNb2RlCisgKgorICogREVTQ1JJUFRJT046IHNldCByZGkgbW9kZSB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3RyICAgICA6IHJkaSBtb2RlIHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFJkaU1vZGUoY29uc3QgY2hhciAqc3RyKQoreworICAgIExPR0QoIlJESV9ERUJVRyAgcmRpIG1vZGUgdmFsdWU6ICVzIiwgc3RyKTsKKworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICBpbnQzMl90IHZhbHVlID0gbG9va3VwQXR0cihFTkFCTEVfRElTQUJMRV9NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgUEFSQU1fTUFQX1NJWkUoRU5BQkxFX0RJU0FCTEVfTU9ERVNfTUFQKSwgc3RyKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICB1cGRhdGVQYXJhbUVudHJ5KEtFWV9RQ19SRElfTU9ERSwgc3RyKTsKKyAgICAgICAgICAgIG1fYlJkaU1vZGUgPSAodmFsdWUgPT0gMCkgPyBmYWxzZSA6IHRydWU7CisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9SRElfTU9ERSwgdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dFKCJJbnZhbGlkIHJkaSBtb2RlIHZhbHVlOiAlcyIsIChzdHIgPT0gTlVMTCkgPyAiTlVMTCIgOiBzdHIpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRTZWN1cmVNb2RlCisgKgorICogREVTQ1JJUFRJT046IHNldCBzZWN1cmUgbW9kZSB2YWx1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3RyICAgICA6IHNlY3VyZSBtb2RlIHZhbHVlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFNlY3VyZU1vZGUoY29uc3QgY2hhciAqc3RyKQoreworICBMT0dEKCJTZWN1cmUgbW9kZSB2YWx1ZTogJXMiLCBzdHIpOworCisgIGlmIChzdHIgIT0gTlVMTCkgeworICAgIGludDMyX3QgdmFsdWUgPSBsb29rdXBBdHRyKEVOQUJMRV9ESVNBQkxFX01PREVTX01BUCwKKyAgICAgICAgICAgIFBBUkFNX01BUF9TSVpFKEVOQUJMRV9ESVNBQkxFX01PREVTX01BUCksIHN0cik7CisgICAgaWYgKHZhbHVlICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIHVwZGF0ZVBhcmFtRW50cnkoS0VZX1FDX1NFQ1VSRV9NT0RFLCBzdHIpOworICAgICAgICBtX2JTZWN1cmVNb2RlID0gKHZhbHVlID09IDApPyBmYWxzZSA6IHRydWU7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgIH0KKyAgTE9HRSgiSW52YWxpZCBTZWN1cmUgbW9kZSB2YWx1ZTogJXMiLAorICAgICAoc3RyID09IE5VTEwpID8gIk5VTEwiIDogc3RyKTsKKyAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRTdHJlYW1Sb3RhdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgc3RyZWFtIHJvdGF0aW9uIGJ5IGl0cyB0eXBlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdHJlYW1UeXBlICAgICAgICA6IHN0cmVhbSB0eXBlCisgKiAgIEBmZWF0dXJlQ29uZmlnICAgICA6IHN0cmVhbSBmZWF0dXJlIGNvbmZpZyBzdHJ1Y3R1cmUKKyAqICAgQGRpbSAgICAgICAgICAgICAgIDogc3RyZWFtIGRpbWVuc2lvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldFN0cmVhbVJvdGF0aW9uKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9wcF9mZWF0dXJlX2NvbmZpZ190ICZmZWF0dXJlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3QgJmRpbSkKK3sKKyAgICBpbnQzMl90IHJldCA9IE5PX0VSUk9SOworICAgIGNvbnN0IGNoYXIgKnN0ciA9IGdldChLRVlfUUNfVklERU9fUk9UQVRJT04pOworICAgIGludCByb3RhdGlvblBhcmFtID0gbG9va3VwQXR0cihWSURFT19ST1RBVElPTl9NT0RFU19NQVAsCisgICAgICAgICAgICBQQVJBTV9NQVBfU0laRShWSURFT19ST1RBVElPTl9NT0RFU19NQVApLCBzdHIpOworICAgIGZlYXR1cmVDb25maWcucm90YXRpb24gPSBST1RBVEVfMDsKKyAgICBpbnQgc3dhcERpbSA9IDA7CisgICAgc3dpdGNoIChzdHJlYW1UeXBlKSB7CisgICAgICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgc3dpdGNoKHJvdGF0aW9uUGFyYW0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDkwOgorICAgICAgICAgICAgICAgICAgICBmZWF0dXJlQ29uZmlnLmZlYXR1cmVfbWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX1JPVEFUSU9OOworICAgICAgICAgICAgICAgICAgICBmZWF0dXJlQ29uZmlnLnJvdGF0aW9uID0gUk9UQVRFXzkwOworICAgICAgICAgICAgICAgICAgICBzd2FwRGltID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxODA6CisgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVDb25maWcuZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfUk9UQVRJT047CisgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVDb25maWcucm90YXRpb24gPSBST1RBVEVfMTgwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUNvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9ST1RBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUNvbmZpZy5yb3RhdGlvbiA9IFJPVEFURV8yNzA7CisgICAgICAgICAgICAgICAgICAgIHN3YXBEaW0gPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBmZWF0dXJlQ29uZmlnLnJvdGF0aW9uID0gUk9UQVRFXzA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzoKKyAgICAgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVc6CisgICAgICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UOgorICAgICAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9SQVc6CisgICAgICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBOgorICAgICAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0M6CisgICAgICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX0RFRkFVTFQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoc3dhcERpbSA+IDApIHsKKyAgICAgICAgaW50IHcgPSAwOworICAgICAgICB3ID0gZGltLndpZHRoOworICAgICAgICBkaW0ud2lkdGggPSBkaW0uaGVpZ2h0OworICAgICAgICBkaW0uaGVpZ2h0ID0gdzsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0U3RyZWFtU3ViRm9ybWF0KGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3N1Yl9mb3JtYXRfdHlwZV90ICZzdWJfZm9ybWF0KQoreworICAgIGludDMyX3QgcmV0ID0gTk9fRVJST1I7CisgICAgc3ViX2Zvcm1hdCA9IENBTV9GT1JNQVRfU1VCVFlQRV9NQVg7CisKKyAgICBzd2l0Y2ggKHN0cmVhbVR5cGUpIHsKKyAgICAgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUkFXOiB7CisgICAgICAgICAgY2hhciByYXdfc3ViX2Zvcm1hdFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAgIGludCByYXdTdWJGb3JtYXQ7CisgICAgICAgICAgbWVtc2V0KHJhd19zdWJfZm9ybWF0LCAwLCBzaXplb2YocmF3X3N1Yl9mb3JtYXQpKTsKKyAgICAgICAgICAvKkRlZmF1bHQgdmFsdWUgaXMgQ0FNX0ZPUk1BVF9TVUJUWVBFX1BEQUZfU1RBVFMqLworICAgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEucmF3LnN1YmZvcm1hdCIsIHJhd19zdWJfZm9ybWF0LCAiMSIpOworICAgICAgICAgIHJhd1N1YkZvcm1hdCA9IGF0b2kocmF3X3N1Yl9mb3JtYXQpOworICAgICAgICAgIHN1Yl9mb3JtYXQgPSAoY2FtX3N1Yl9mb3JtYXRfdHlwZV90KXJhd1N1YkZvcm1hdDsKKyAgICAgICAgICBMT0dIKCJTdWJmb3JtYXQgZm9yIHJhdyBzdHJlYW0gPSAlZCIsIHN1Yl9mb3JtYXQpOworICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRTdHJlYW1Gb3JtYXQKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IHN0cmVhbSBmb3JtYXQgYnkgaXRzIHR5cGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN0cmVhbVR5cGUgOiBbaW5wdXRdIHN0cmVhbSB0eXBlCisgKiAgIEBmb3JtYXQgICAgIDogW291dHB1dF0gc3RyZWFtIGZvcm1hdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldFN0cmVhbUZvcm1hdChjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZm9ybWF0X3QgJmZvcm1hdCkKK3sKKyAgICBpbnQzMl90IHJldCA9IE5PX0VSUk9SOworICAgIGZvcm1hdCA9IENBTV9GT1JNQVRfTUFYOworICAgIHN3aXRjaCAoc3RyZWFtVHlwZSkgeworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVc6CisgICAgICAgIGlmICghaXNVQldDRW5hYmxlZCgpKSB7CisjaWYgVkVOVVNfUFJFU0VOVAorICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90IHByZXZpZXc7CisgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3QgdmlkZW87CisgICAgICAgICAgICBnZXRTdHJlYW1EaW1lbnNpb24oQ0FNX1NUUkVBTV9UWVBFX1ZJREVPICwgdmlkZW8pOworICAgICAgICAgICAgZ2V0U3RyZWFtRGltZW5zaW9uKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXLCBwcmV2aWV3KTsKKyAgICAgICAgICAgIGlmIChnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSA9PSB0cnVlICYmCisgICAgICAgICAgICAgICAgICAgIHZpZGVvLndpZHRoID09IHByZXZpZXcud2lkdGggJiYKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8uaGVpZ2h0ID09IHByZXZpZXcuaGVpZ2h0ICYmCisgICAgICAgICAgICAgICAgICAgIG1QcmV2aWV3Rm9ybWF0ID09IENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxKSB7CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjFfVkVOVVM7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgZm9ybWF0ID0gbVByZXZpZXdGb3JtYXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3JtYXQgPSBtUHJldmlld0Zvcm1hdDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVzoKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSzoKKyAgICAgICAgZm9ybWF0ID0gbUFwcFByZXZpZXdGb3JtYXQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTOgorICAgICAgICBjYW1fYW5hbHlzaXNfaW5mb190IGFuYWx5c2lzSW5mbzsKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IGZlYXR1cmVNYXNrOworCisgICAgICAgIGZlYXR1cmVNYXNrID0gMDsKKyAgICAgICAgZ2V0U3RyZWFtUHBNYXNrKENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUywgZmVhdHVyZU1hc2spOworICAgICAgICByZXQgPSBnZXRBbmFseXNpc0luZm8oCisgICAgICAgICAgICAgICAgKChnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSA9PSB0cnVlKSAmJiBmZE1vZGVJblZpZGVvKCkpLAorICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgIGZlYXR1cmVNYXNrLAorICAgICAgICAgICAgICAgICZhbmFseXNpc0luZm8pOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJnZXRBbmFseXNpc0luZm8gZmFpbGVkLCByZXQgPSAlZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFuYWx5c2lzSW5mby5od19hbmFseXNpc19zdXBwb3J0ZWQgJiYKKyAgICAgICAgICAgICAgICBhbmFseXNpc0luZm8uYW5hbHlzaXNfZm9ybWF0ID09IENBTV9GT1JNQVRfWV9PTkxZKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBhbmFseXNpc0luZm8uYW5hbHlzaXNfZm9ybWF0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGFuYWx5c2lzSW5mby5od19hbmFseXNpc19zdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJJbnZhbGlkIGFuYWx5c2lzX2Zvcm1hdCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5c2lzSW5mby5hbmFseXNpc19mb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9ybWF0ID0gbUFwcFByZXZpZXdGb3JtYXQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q6CisgICAgICAgIGlmICggbVBpY3R1cmVGb3JtYXQgPT0gQ0FNX0ZPUk1BVF9ZVVZfNDIyX05WMTYgKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBDQU1fRk9STUFUX1lVVl80MjJfTlYxNjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAgICAgaW50IHNuYXBzaG90Rm9ybWF0OworICAgICAgICAgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnNuYXAuZm9ybWF0IiwgcHJvcCwgIjAiKTsKKyAgICAgICAgICAgIHNuYXBzaG90Rm9ybWF0ID0gYXRvaShwcm9wKTsKKyAgICAgICAgICAgIGlmKHNuYXBzaG90Rm9ybWF0ID09IDEpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBDQU1fRk9STUFUX1lVVl80MjJfTlY2MTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfVklERU86CisgICAgICAgIGlmIChpc1VCV0NFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAgICAgaW50IHBGb3JtYXQ7CisgICAgICAgICAgICBtZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKKyAgICAgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEudmlkZW8udWJ3YyIsIHByb3AsICIxIik7CisgICAgICAgICAgICBwRm9ybWF0ID0gYXRvaShwcm9wKTsKKyAgICAgICAgICAgIGlmIChwRm9ybWF0ID09IDEpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9VQldDOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBDQU1fRk9STUFUX1lVVl80MjBfTlYyMV9WRU5VUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyNpZiBWRU5VU19QUkVTRU5UCisgICAgICAgICAgICBmb3JtYXQgPSBDQU1fRk9STUFUX1lVVl80MjBfTlYyMV9WRU5VUzsKKyNlbHNlCisgICAgICAgICAgICBmb3JtYXQgPSBDQU1fRk9STUFUX1lVVl80MjBfTlYyMTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1JBVzoKKyAgICAgICAgaWYgKChpc1JkaU1vZGUoKSkgfHwgKGdldG9mZmxpbmVSQVcoKSl8fCAoZ2V0UXVhZHJhQ2ZhKCkpKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBtX3BDYXBhYmlsaXR5LT5yZGlfbW9kZV9zdHJlYW1fZm10OworICAgICAgICB9IGVsc2UgaWYgKG1QaWN0dXJlRm9ybWF0ID49IENBTV9GT1JNQVRfWVVWX1JBV184QklUX1lVWVYpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IChjYW1fZm9ybWF0X3QpbVBpY3R1cmVGb3JtYXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyIHJhd19mb3JtYXRbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgICAgIGludCByYXdGb3JtYXQ7CisgICAgICAgICAgICBtZW1zZXQocmF3X2Zvcm1hdCwgMCwgc2l6ZW9mKHJhd19mb3JtYXQpKTsKKyAgICAgICAgICAgIC8qRGVmYXVsdCB2YWx1ZSBpcyBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEwQlBQX0dCUkcqLworICAgICAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5yYXcuZm9ybWF0IiwgcmF3X2Zvcm1hdCwgIjE3Iik7CisgICAgICAgICAgICByYXdGb3JtYXQgPSBhdG9pKHJhd19mb3JtYXQpOworICAgICAgICAgICAgZm9ybWF0ID0gKGNhbV9mb3JtYXRfdClyYXdGb3JtYXQ7CisgICAgICAgICAgICBMT0dIKCJSYXcgc3RyZWFtIGZvcm1hdCAlZCBidW5kbGVkIHdpdGggc25hcHNob3QiLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX09GRkxJTkVfUFJPQzoKKyAgICAgICAgaWYgKGdldFF1YWRyYUNmYSgpKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBtX3BDYXBhYmlsaXR5LT5xdWFkcmFfY2ZhX2Zvcm1hdDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQToKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9ERUZBVUxUOgorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIExPR0QoIlN0cmVhbSB0eXBlID0gJWQgU3RyZWFtIEZvcm1hdCA9ICVkIiwgc3RyZWFtVHlwZSwgZm9ybWF0KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEZsaXBNb2RlCisgKgorICogREVTQ1JJUFRJT046IGdldCBmbGlwIG1vZGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbV9pbnRmX3Bhcm1fdHlwZV90IDogW2lucHV0XSBzdHJlYW0gdHlwZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQgdHlwZSBvZiBmbGlwIG1vZGUKKyAqICAgICAgICAgICAgICAwIC0gbm8gZmlscAorICogICAgICAgICAgICAgIDEgLSBGTElQX0gKKyAqICAgICAgICAgICAgICAyIC0gRkxJUF9WCisgKiAgICAgICAgICAgICAgMyAtIEZMSVBfSCB8IEZMSVBfVgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYVBhcmFtZXRlcnM6OmdldEZsaXBNb2RlKGNhbV9zdHJlYW1fdHlwZV90IHR5cGUpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gTlVMTDsKKyAgICBpbnQgZmxpcE1vZGUgPSAwOyAvLyBubyBmbGlwCisKKyAgICBzd2l0Y2godHlwZSl7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzoKKyAgICAgICAgaWYgKCFpc1JkaU1vZGUoKSkgeworICAgICAgICAgICAgc3RyID0gZ2V0KEtFWV9RQ19QUkVWSUVXX0ZMSVApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPOgorICAgICAgICBzdHIgPSBnZXQoS0VZX1FDX1ZJREVPX0ZMSVApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVDoKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVzoKKyAgICAgICAgc3RyID0gZ2V0KEtFWV9RQ19TTkFQU0hPVF9QSUNUVVJFX0ZMSVApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dEKCJObyBmbGlwIG1vZGUgZm9yIHN0cmVhbSB0eXBlICVkIiwgdHlwZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmKHN0ciAhPSBOVUxMKXsKKyAgICAgICAgLy9OZWVkIGdpdmUgY29ycmVzcG9uZGluZyBmaWxwIHZhbHVlIGJhc2VkIG9uIGZsaXAgbW9kZSBzdHJpbmdzCisgICAgICAgIGludCB2YWx1ZSA9IGxvb2t1cEF0dHIoRkxJUF9NT0RFU19NQVAsIFBBUkFNX01BUF9TSVpFKEZMSVBfTU9ERVNfTUFQKSwgc3RyKTsKKyAgICAgICAgaWYodmFsdWUgIT0gTkFNRV9OT1RfRk9VTkQpCisgICAgICAgICAgICBmbGlwTW9kZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICBMT0dIKCJ0aGUgZmlscCBtb2RlIG9mIHN0cmVhbSB0eXBlICVkIGlzICVkIC4iLCB0eXBlLCBmbGlwTW9kZSk7CisgICAgcmV0dXJuIGZsaXBNb2RlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzU25hcHNob3RGRE5lZWRlZAorICoKKyAqIERFU0NSSVBUSU9OOiBjaGVjayB3aGV0aGVyIEZhY2UgRGV0ZWN0aW9uIE1ldGFkYXRhIGlzIG5lZWRlZAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGJvb2wgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwIC0gbmVlZAorICogICAgICAgICAgICAgIDEgLSBub3QgbmVlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjppc1NuYXBzaG90RkROZWVkZWQoKQoreworICAgIHJldHVybiBnZXRJbnQoS0VZX1FDX1NOQVBTSE9UX0ZEX0RBVEEpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFN0cmVhbURpbWVuc2lvbgorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgc3RyZWFtIGRpbWVuc2lvbiBieSBpdHMgdHlwZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3RyZWFtVHlwZSA6IFtpbnB1dF0gc3RyZWFtIHR5cGUKKyAqICAgQGRpbSAgICAgICAgOiBbb3V0cHV0XSBzdHJlYW0gZGltZW5zaW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0U3RyZWFtRGltZW5zaW9uKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCAmZGltKQoreworICAgIGludDMyX3QgcmV0ID0gTk9fRVJST1I7CisgICAgbWVtc2V0KCZkaW0sIDAsIHNpemVvZihjYW1fZGltZW5zaW9uX3QpKTsKKworICAgIHN3aXRjaCAoc3RyZWFtVHlwZSkgeworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVc6CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfQ0FMTEJBQ0s6CisgICAgICAgIGdldFByZXZpZXdTaXplKCZkaW0ud2lkdGgsICZkaW0uaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVc6CisgICAgICAgIGdldFByZXZpZXdTaXplKCZkaW0ud2lkdGgsICZkaW0uaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q6CisgICAgICAgIGlmIChpc1Bvc3RQcm9jU2NhbGluZygpKSB7CisgICAgICAgICAgICBnZXRNYXhQaWNTaXplKGRpbSk7CisgICAgICAgIH0gZWxzZSBpZiAoZ2V0UmVjb3JkaW5nSGludFZhbHVlKCkpIHsKKyAgICAgICAgICAgIC8vIGxpdmUgc25hcHNob3QKKyAgICAgICAgICAgIGdldExpdmVTbmFwc2hvdFNpemUoZGltKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldFBpY3R1cmVTaXplKCZkaW0ud2lkdGgsICZkaW0uaGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9WSURFTzoKKyAgICAgICAgZ2V0VmlkZW9TaXplKCZkaW0ud2lkdGgsICZkaW0uaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUkFXOgorICAgICAgICAvL2RpbSA9IG1fcENhcGFiaWxpdHktPnJhd19kaW07CisgICAgICAgIGdldFJhd1NpemUoZGltKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEE6CisgICAgICAgIGRpbS53aWR0aCA9IChpbnQzMl90KXNpemVvZihtZXRhZGF0YV9idWZmZXJfdCk7CisgICAgICAgIGRpbS5oZWlnaHQgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0M6CisgICAgICAgIGlmIChpc1Bvc3RQcm9jU2NhbGluZygpKSB7CisgICAgICAgICAgICBpZiAoZ2V0UmVjb3JkaW5nSGludFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBsaXZlIHNuYXBzaG90CisgICAgICAgICAgICAgICAgZ2V0TGl2ZVNuYXBzaG90U2l6ZShkaW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZXRQaWN0dXJlU2l6ZSgmZGltLndpZHRoLCAmZGltLmhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfQU5BTFlTSVM6CisgICAgICAgIGNhbV9kaW1lbnNpb25fdCBwcnZfZGltLCBtYXhfZGltOworCisgICAgICAgIC8qIEFuYWx5c2lzIHN0cmVhbSBuZWVkIGFzcGVjdCByYXRpbyBhcyBwcmV2aWV3IHN0cmVhbSAqLworICAgICAgICBnZXRQcmV2aWV3U2l6ZSgmcHJ2X2RpbS53aWR0aCwgJnBydl9kaW0uaGVpZ2h0KTsKKworICAgICAgICBjYW1fYW5hbHlzaXNfaW5mb190IGFuYWx5c2lzSW5mbzsKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IGZlYXR1cmVNYXNrOworCisgICAgICAgIGZlYXR1cmVNYXNrID0gMDsKKyAgICAgICAgZ2V0U3RyZWFtUHBNYXNrKENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUywgZmVhdHVyZU1hc2spOworICAgICAgICByZXQgPSBnZXRBbmFseXNpc0luZm8oCisgICAgICAgICAgICAgICAgKChnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSA9PSB0cnVlKSAmJiBmZE1vZGVJblZpZGVvKCkpLAorICAgICAgICAgICAgICAgIEZBTFNFLAorICAgICAgICAgICAgICAgIGZlYXR1cmVNYXNrLAorICAgICAgICAgICAgICAgICZhbmFseXNpc0luZm8pOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJnZXRBbmFseXNpc0luZm8gZmFpbGVkLCByZXQgPSAlZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgbWF4X2RpbS53aWR0aCA9IGFuYWx5c2lzSW5mby5hbmFseXNpc19tYXhfcmVzLndpZHRoOworICAgICAgICBtYXhfZGltLmhlaWdodCA9IGFuYWx5c2lzSW5mby5hbmFseXNpc19tYXhfcmVzLmhlaWdodDsKKworICAgICAgICBpZiAocHJ2X2RpbS53aWR0aCA+IG1heF9kaW0ud2lkdGggfHwgcHJ2X2RpbS5oZWlnaHQgPiBtYXhfZGltLmhlaWdodCkgeworICAgICAgICAgICAgZG91YmxlIG1heF9yYXRpbywgcmVxdWVzdGVkX3JhdGlvOworCisgICAgICAgICAgICBtYXhfcmF0aW8gPSAoZG91YmxlKW1heF9kaW0ud2lkdGggLyAoZG91YmxlKW1heF9kaW0uaGVpZ2h0OworICAgICAgICAgICAgcmVxdWVzdGVkX3JhdGlvID0gKGRvdWJsZSlwcnZfZGltLndpZHRoIC8gKGRvdWJsZSlwcnZfZGltLmhlaWdodDsKKworICAgICAgICAgICAgaWYgKG1heF9yYXRpbyA8IHJlcXVlc3RlZF9yYXRpbykgeworICAgICAgICAgICAgICAgIGRpbS53aWR0aCA9IG1heF9kaW0ud2lkdGg7CisgICAgICAgICAgICAgICAgZGltLmhlaWdodCA9IChpbnQzMl90KSgoZG91YmxlKWRpbS53aWR0aCAvIHJlcXVlc3RlZF9yYXRpbyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpbS5oZWlnaHQgPSBtYXhfZGltLmhlaWdodDsKKyAgICAgICAgICAgICAgICBkaW0ud2lkdGggPSAoaW50MzJfdCkoKGRvdWJsZSltYXhfZGltLmhlaWdodCAqIHJlcXVlc3RlZF9yYXRpbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaW0ud2lkdGggJj0gfjB4MTsKKyAgICAgICAgICAgIGRpbS5oZWlnaHQgJj0gfjB4MTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpbS53aWR0aCA9IHBydl9kaW0ud2lkdGg7CisgICAgICAgICAgICBkaW0uaGVpZ2h0ID0gcHJ2X2RpbS5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX0RFRkFVTFQ6CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgibm8gZGltZW5zaW9uIGZvciB1bnN1cHBvcnRlZCBzdHJlYW0gdHlwZSAlZCIsCisgICAgICAgICAgICAgICBzdHJlYW1UeXBlKTsKKyAgICAgICAgcmV0ID0gQkFEX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBMT0dEKCJTdHJlYW0gdHlwZSA9ICVkIFN0cmVhbSBEaW1lbnNpb24gPSAlZCBYICVkIiwKKyAgICAgICAgICAgICBzdHJlYW1UeXBlLCBkaW0ud2lkdGgsIGRpbS5oZWlnaHQpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0UGFyYW1ldGVycworICoKKyAqIERFU0NSSVBUSU9OOiBSZXR1cm4gYSBDIHN0cmluZyBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogYSBzdHJpbmcgY29udGFpbmluZyBwYXJhbWV0ZXIgcGFpcnMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY2hhciogUUNhbWVyYVBhcmFtZXRlcnM6OmdldFBhcmFtZXRlcnMoKQoreworICAgIGNoYXIqIHN0clBhcmFtcyA9IE5VTEw7CisgICAgU3RyaW5nOCBzdHI7CisKKyAgICBpbnQgY3VyX3dpZHRoLCBjdXJfaGVpZ2h0OworICAgIC8vTmVlZCB0YWtlIGNhcmUgU2NhbGUgcGljdHVyZSBzaXplCisgICAgaWYobV9yZXByb2NTY2FsZVBhcmFtLmlzU2NhbGVFbmFibGVkKCkgJiYKKyAgICAgICAgbV9yZXByb2NTY2FsZVBhcmFtLmlzVW5kZXJTY2FsaW5nKCkpeworICAgICAgICBpbnQgc2NhbGVfd2lkdGgsIHNjYWxlX2hlaWdodDsKKworICAgICAgICBtX3JlcHJvY1NjYWxlUGFyYW0uZ2V0UGljU2l6ZUZyb21BUEsoc2NhbGVfd2lkdGgsc2NhbGVfaGVpZ2h0KTsKKyAgICAgICAgZ2V0UGljdHVyZVNpemUoJmN1cl93aWR0aCwgJmN1cl9oZWlnaHQpOworCisgICAgICAgIFN0cmluZzggcGljX3NpemU7CisgICAgICAgIGNoYXIgYnVmZmVyWzMyXTsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkeCVkIiwgc2NhbGVfd2lkdGgsIHNjYWxlX2hlaWdodCk7CisgICAgICAgIHBpY19zaXplLmFwcGVuZChidWZmZXIpOworICAgICAgICBzZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BJQ1RVUkVfU0laRSwgcGljX3NpemUpOworICAgIH0KKworICAgIHN0ciA9IGZsYXR0ZW4oKTsKKyAgICBzdHJQYXJhbXMgPSAoY2hhciAqKW1hbGxvYyhzaXplb2YoY2hhcikqKHN0ci5sZW5ndGgoKSsxKSk7CisgICAgaWYoc3RyUGFyYW1zICE9IE5VTEwpeworICAgICAgICBtZW1zZXQoc3RyUGFyYW1zLCAwLCBzaXplb2YoY2hhcikqKHN0ci5sZW5ndGgoKSsxKSk7CisgICAgICAgIHN0cmxjcHkoc3RyUGFyYW1zLCBzdHIuc3RyaW5nKCksIHN0ci5sZW5ndGgoKSsxKTsKKyAgICAgICAgc3RyUGFyYW1zW3N0ci5sZW5ndGgoKV0gPSAwOworICAgIH0KKworICAgIGlmKG1fcmVwcm9jU2NhbGVQYXJhbS5pc1NjYWxlRW5hYmxlZCgpICYmCisgICAgICAgIG1fcmVwcm9jU2NhbGVQYXJhbS5pc1VuZGVyU2NhbGluZygpKXsKKyAgICAgICAgLy9uZWVkIHNldCBiYWNrIHBpY3R1cmUgc2l6ZQorICAgICAgICBTdHJpbmc4IHBpY19zaXplOworICAgICAgICBjaGFyIGJ1ZmZlclszMl07CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlZHglZCIsIGN1cl93aWR0aCwgY3VyX2hlaWdodCk7CisgICAgICAgIHBpY19zaXplLmFwcGVuZChidWZmZXIpOworICAgICAgICBzZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1BJQ1RVUkVfU0laRSwgcGljX3NpemUpOworICAgIH0KKyAgICByZXR1cm4gc3RyUGFyYW1zOworfQorCisjaWZkZWYgVEFSR0VUX1RTX01BS0VVUAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRUc01ha2V1cEluZm8KKyAqCisgKiBERVNDUklQVElPTjogZ2V0IFRzTWFrZXVwIGluZm8KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHdoaXRlTGV2ZWwgOiBbb3V0cHV0XSB3aGl0ZSBsZXZlbAorICogICBAY2xlYW5MZXZlbCA6IFtvdXRwdXRdIGNsZWFuIGxldmVsCisKKyAqIFJFVFVSTiAgICAgOiBXaGV0aGVyIG1ha2V1cCBpcyBlbmFibGVkIG9yIG5vdAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjpnZXRUc01ha2V1cEluZm8oaW50ICZ3aGl0ZUxldmVsLCBpbnQgJmNsZWFuTGV2ZWwpIGNvbnN0Cit7CisgICAgY29uc3QgY2hhciogcGNoX21ha2V1cF9lbmFibGUgPSBnZXQoUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9UU19NQUtFVVApOworICAgIGlmIChwY2hfbWFrZXVwX2VuYWJsZSA9PSBOVUxMKSB7CisgICAgICAgIExPR0goInBjaF9tYWtldXBfZW5hYmxlID0gbnVsbCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJvb2wgZW5hYmxlTWFrZXVwID0KKyAgICAgICAgICAgIChzdHJjbXAocGNoX21ha2V1cF9lbmFibGUsIk9uIikgPT0gMCk7CisgICAgaWYgKGVuYWJsZU1ha2V1cCkgeworICAgICAgICB3aGl0ZUxldmVsID0gZ2V0SW50KFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfVFNfTUFLRVVQX1dISVRFTik7CisgICAgICAgIGNsZWFuTGV2ZWwgPSBnZXRJbnQoUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9UU19NQUtFVVBfQ0xFQU4pOworICAgIH0KKyAgICByZXR1cm4gZW5hYmxlTWFrZXVwOworfQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0UHJldmlld0hhbFBpeGVsRm9ybWF0CisgKgorICogREVTQ1JJUFRJT046IGdldCBwcmV2aWV3IEhBTCBwaXhlbCBmb3JtYXQKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBIQUwgcGl4ZWwgZm9ybWF0CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0UHJldmlld0hhbFBpeGVsRm9ybWF0KCkKK3sKKyAgICBpbnQzMl90IGhhbFBpeGVsRm9ybWF0OworICAgIGNhbV9mb3JtYXRfdCBmbXQ7CisgICAgZ2V0U3RyZWFtRm9ybWF0KENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXLGZtdCk7CisKKyAgICBzd2l0Y2ggKGZtdCkgeworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTI6CisgICAgICAgIGhhbFBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1A7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjE6CisgICAgICAgIGhhbFBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1A7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjFfQURSRU5POgorICAgICAgICBoYWxQaXhlbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQX0FEUkVOTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfWVYxMjoKKyAgICAgICAgaGFsUGl4ZWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVkVOVVM6CisgICAgICAgIGhhbFBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1BfVkVOVVM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjFfVkVOVVM6CisgICAgICAgIGhhbFBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1BfVkVOVVM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVUJXQzoKKyAgICAgICAgaGFsUGl4ZWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9TUF9WRU5VU19VQldDOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMl9OVjE2OgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIyX05WNjE6CisgICAgZGVmYXVsdDoKKyAgICAgICAgaGFsUGl4ZWxGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIExPR0goImZvcm1hdCAlZFxuIiwgaGFsUGl4ZWxGb3JtYXQpOworICAgIHJldHVybiBoYWxQaXhlbEZvcm1hdDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRRdWFkcmFDRkEKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IFF1YWRyYUNGQSBtb2RlCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0UXVhZHJhQ2ZhKCkKK3sKKyAgICByZXR1cm4gbV9iUXVhZHJhQ2ZhOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXR0aHVtYm5haWxTaXplCisgKgorICogREVTQ1JJUFRJT046IGdldCB0aHVtYm5haWwgc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAd2lkdGgsIGhlaWdodCA6IFtvdXRwdXRdIHRodW1ibmFpbCB3aWR0aCBhbmQgaGVpZ2h0CisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0VGh1bWJuYWlsU2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkgY29uc3QKK3sKKyAgICAqd2lkdGggPSBnZXRJbnQoS0VZX0pQRUdfVEhVTUJOQUlMX1dJRFRIKTsKKyAgICAqaGVpZ2h0ID0gZ2V0SW50KEtFWV9KUEVHX1RIVU1CTkFJTF9IRUlHSFQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFpTTEJ1cnN0SW50ZXJ2YWwKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IFpTTCBidXJzdCBpbnRlcnZhbCBzZXR0aW5nCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogWlNMIGJ1cnN0IGludGVydmFsIHZhbHVlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldFpTTEJ1cnN0SW50ZXJ2YWwoKQoreworICAgIGludCBpbnRlcnZhbCA9IGdldEludChLRVlfUUNfWlNMX0JVUlNUX0lOVEVSVkFMKTsKKyAgICBpZiAoaW50ZXJ2YWwgPCAwKSB7CisgICAgICAgIGludGVydmFsID0gMTsKKyAgICB9CisgICAgcmV0dXJuICh1aW50OF90KWludGVydmFsOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFpTTFF1ZXVlRGVwdGgKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IFpTTCBxdWV1ZSBkZXB0aAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IFpTTCBxdWV1ZSBkZXB0aCB2YWx1ZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50OF90IFFDYW1lcmFQYXJhbWV0ZXJzOjpnZXRaU0xRdWV1ZURlcHRoKCkKK3sKKyAgICBpbnQgcWRlcHRoID0gZ2V0SW50KEtFWV9RQ19aU0xfUVVFVUVfREVQVEgpOworICAgIGlmIChxZGVwdGggPCAwKSB7CisgICAgICAgIHFkZXB0aCA9IDI7CisgICAgfQorICAgIGlmIChpc0xvd01lbW9yeURldmljZSgpKSB7CisgICAgICAgIHFkZXB0aCA9IDE7CisgICAgfQorICAgIHJldHVybiAodWludDhfdClxZGVwdGg7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0WlNMQmFja0xvb2tDb3VudAorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgWlNMIGJhY2tsb29rIGNvdW50IHNldHRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBaU0wgYmFja2xvb2sgY291bnQgdmFsdWUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDhfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0WlNMQmFja0xvb2tDb3VudCgpCit7CisgICAgaW50IGxvb2tfYmFjayA9IGdldEludChLRVlfUUNfWlNMX0JVUlNUX0xPT0tCQUNLKTsKKyAgICBpZiAobG9va19iYWNrIDwgMCkgeworICAgICAgICBsb29rX2JhY2sgPSAyOworICAgIH0KKyAgICBpZiAoaXNMb3dNZW1vcnlEZXZpY2UoKSkgeworICAgICAgICBsb29rX2JhY2sgPSAxOworICAgIH0KKyAgICByZXR1cm4gKHVpbnQ4X3QpbG9va19iYWNrOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc1ZpZGVvQnVmZmVyc0NhY2hlZAorICoKKyAqIERFU0NSSVBUSU9OOiBRdWVyeSBidWZmZXJzIGFyZSBjYWNoZWQgL3VuIGNhY2hlZAorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IGJ1ZmZlcnMgYXJlIGNhY2hlZCAvdW4gY2FjaGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnM6OmlzVmlkZW9CdWZmZXJzQ2FjaGVkKCkKK3sKKyAgICBjb25zdCBjaGFyICpjYWNoZWRfbWVtICA9IGdldChLRVlfUUNfQ0FDSEVfVklERU9fQlVGRkVSUyk7CisgICAgaWYgKGNhY2hlZF9tZW0gIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RyY21wKGNhY2hlZF9tZW0sIFZBTFVFX0RJU0FCTEUpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0WlNMTWF4VW5tYXRjaGVkRnJhbWVzCisgKgorICogREVTQ1JJUFRJT046IGdldCBhbGxvd2VkIFpTTCBtYXggdW5tYXRjaGVkIGZyYW1lcyBudW1iZXIKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBaU0wgYmFja2xvb2sgY291bnQgdmFsdWUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDhfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0TWF4VW5tYXRjaGVkRnJhbWVzSW5RdWV1ZSgpCit7CisgICAgcmV0dXJuICh1aW50OF90KShtX3BDYXBhYmlsaXR5LT5taW5fbnVtX3BwX2J1ZnMpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFJlY29yZGluZ0hpbnRWYWx1ZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgcmVjb3JkaW5nIGhpbnQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHZhbHVlICAgOiB2aWRlbyBoaW50IHZhbHVlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRSZWNvcmRpbmdIaW50VmFsdWUoaW50MzJfdCB2YWx1ZSkKK3sKKyAgICBMT0dIKCJWaWRlb0hpbnQgPSAlZCIsIHZhbHVlKTsKKyAgICBib29sIG5ld1ZhbHVlID0gKHZhbHVlID4gMCk/IHRydWUgOiBmYWxzZTsKKworICAgIGlmICggbV9iUmVjb3JkaW5nSGludCAhPSBuZXdWYWx1ZSApIHsKKyAgICAgICAgbV9iTmVlZFJlc3RhcnQgPSB0cnVlOworICAgICAgICBtX2JSZWNvcmRpbmdIaW50X25ldyA9IG5ld1ZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fYlJlY29yZGluZ0hpbnRfbmV3ID0gbV9iUmVjb3JkaW5nSGludDsKKyAgICB9CisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fUkVDT1JESU5HX0hJTlQsIHZhbHVlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXROdW1PZlNuYXBzaG90cworICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgbnVtYmVyIG9mIHNuYXBzaG90IHBlciBzaHV0dGVyCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbnVtYmVyIG9mIHNuYXBzaG90IHBlciBzaHV0dGVyCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldE51bU9mU25hcHNob3RzKCkKK3sKKyAgICB1aW50OF90IG51bU9mU25hcHNob3QgPSAxOworICAgIGludCB2YWwgPSBnZXRJbnQoS0VZX1FDX05VTV9TTkFQU0hPVF9QRVJfU0hVVFRFUik7CisgICAgaWYgKDAgPCB2YWwpIHsKKyAgICAgICAgbnVtT2ZTbmFwc2hvdCA9ICh1aW50OF90KXZhbDsKKyAgICB9CisKKyAgICByZXR1cm4gKHVpbnQ4X3QpbnVtT2ZTbmFwc2hvdDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRCdXJzdENvdW50Rm9yQWR2YW5jZWRDYXB0dXJlCisgKgorICogREVTQ1JJUFRJT046IGdldCBidXJzdCBjb3VudCBmb3IgYWR2YW5jZWQgY2FwdHVyZS4KKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBudW1iZXIgb2Ygc25hcHNob3QgcmVxdWlyZWQgZm9yIGFkdmFuY2VkIGNhcHR1cmUuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldEJ1cnN0Q291bnRGb3JBZHZhbmNlZENhcHR1cmUoKQoreworICAgIHVpbnQzMl90IGJ1cnN0Q291bnQgPSAwOworICAgIGlmIChpc1ViaUZvY3VzRW5hYmxlZCgpKSB7CisgICAgICAgIC8vbnVtYmVyIG9mIHNuYXBzaG90cyByZXF1aXJlZCBmb3IgVWJpIEZvY3VzLgorICAgICAgICBidXJzdENvdW50ID0gbV9wQ2FwYWJpbGl0eS0+dWJpZm9jdXNfYWZfYnJhY2tldGluZ19uZWVkLmJ1cnN0X2NvdW50OworICAgIH0gZWxzZSBpZiAoaXNVYmlSZWZvY3VzKCkpIHsKKyAgICAgICAgLy9udW1iZXIgb2Ygc25hcHNob3RzIHJlcXVpcmVkIGZvciBPcHRpIFpvb20uCisgICAgICAgIGJ1cnN0Q291bnQgPSBtX3BDYXBhYmlsaXR5LT5yZWZvY3VzX2FmX2JyYWNrZXRpbmdfbmVlZC5idXJzdF9jb3VudDsKKyAgICB9IGVsc2UgaWYgKGlzT3B0aVpvb21FbmFibGVkKCkpIHsKKyAgICAgICAgLy9udW1iZXIgb2Ygc25hcHNob3RzIHJlcXVpcmVkIGZvciBPcHRpIFpvb20uCisgICAgICAgIGJ1cnN0Q291bnQgPSBtX3BDYXBhYmlsaXR5LT5vcHRpX3pvb21fc2V0dGluZ3NfbmVlZC5idXJzdF9jb3VudDsKKyAgICB9IGVsc2UgaWYgKGlzQ2hyb21hRmxhc2hFbmFibGVkKCkpIHsKKyAgICAgICAgLy9udW1iZXIgb2Ygc25hcHNob3RzIHJlcXVpcmVkIGZvciBDaHJvbWEgRmxhc2guCisgICAgICAgIGJ1cnN0Q291bnQgPSBtX3BDYXBhYmlsaXR5LT5jaHJvbWFfZmxhc2hfc2V0dGluZ3NfbmVlZC5idXJzdF9jb3VudDsKKyAgICB9IGVsc2UgaWYgKGlzU3RpbGxNb3JlRW5hYmxlZCgpKSB7CisgICAgICAgIC8vbnVtYmVyIG9mIHNuYXBzaG90cyByZXF1aXJlZCBmb3IgU3RpbGwgTW9yZS4KKyAgICAgICAgaWYgKGlzU2VlTW9yZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgYnVyc3RDb3VudCA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoKG1fc3RpbGxtb3JlX2NvbmZpZy5idXJzdF9jb3VudCA+PQorICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnN0aWxsbW9yZV9zZXR0aW5nc19uZWVkLm1pbl9idXJzdF9jb3VudCkgJiYKKyAgICAgICAgICAgICAgICAobV9zdGlsbG1vcmVfY29uZmlnLmJ1cnN0X2NvdW50IDw9CisgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c3RpbGxtb3JlX3NldHRpbmdzX25lZWQubWF4X2J1cnN0X2NvdW50KSkgeworICAgICAgICAgICAgYnVyc3RDb3VudCA9IG1fc3RpbGxtb3JlX2NvbmZpZy5idXJzdF9jb3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1cnN0Q291bnQgPSBtX3BDYXBhYmlsaXR5LT5zdGlsbG1vcmVfc2V0dGluZ3NfbmVlZC5idXJzdF9jb3VudDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNIRFJFbmFibGVkKCkpIHsKKyAgICAgICAgLy9udW1iZXIgb2Ygc25hcHNob3RzIHJlcXVpcmVkIGZvciBIRFIuCisgICAgICAgIGJ1cnN0Q291bnQgPSBtX3BDYXBhYmlsaXR5LT5oZHJfYnJhY2tldGluZ19zZXR0aW5nLm51bV9mcmFtZXM7CisgICAgfSBlbHNlIGlmIChpc0FFQnJhY2tldEVuYWJsZWQoKSkgeworICAgICAgYnVyc3RDb3VudCA9IDA7CisgICAgICBjb25zdCBjaGFyICpzdHJfdmFsID0gbV9BRUJyYWNrZXRpbmdDbGllbnQudmFsdWVzOworICAgICAgaWYgKChzdHJfdmFsICE9IE5VTEwpICYmIChzdHJsZW4oc3RyX3ZhbCkgPiAwKSkgeworICAgICAgICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgICAgICAgIHN0cmxjcHkocHJvcCwgc3RyX3ZhbCwgUFJPUEVSVFlfVkFMVUVfTUFYKTsKKyAgICAgICAgICBjaGFyICpzYXZlcHRyID0gTlVMTDsKKyAgICAgICAgICBjaGFyICp0b2tlbiA9IHN0cnRva19yKHByb3AsICIsIiwgJnNhdmVwdHIpOworICAgICAgICAgIHdoaWxlICh0b2tlbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgIHRva2VuID0gc3RydG9rX3IoTlVMTCwgIiwiLCAmc2F2ZXB0cik7CisgICAgICAgICAgICAgIGJ1cnN0Q291bnQrKzsKKyAgICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGJ1cnN0Q291bnQgPD0gMCkgeworICAgICAgICBidXJzdENvdW50ID0gZ2V0TnVtT2ZTbmFwc2hvdHMoKTsKKyAgICB9CisKKyAgICBMT0dIKCJTbmFwc2hvdCBidXJzdCBjb3VudCA9ICVkIiwgYnVyc3RDb3VudCk7CisgICAgcmV0dXJuICh1aW50OF90KWJ1cnN0Q291bnQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TnVtT2ZSZXRyb1NuYXBzaG90cworICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgbnVtYmVyIG9mIHJldHJvIGFjdGl2ZSBzbmFwc2hvdHMgcGVyIHNodXR0ZXIKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBudW1iZXIgb2YgcmV0cm8gYWN0aXZlIHNuYXBzaG90cyBwZXIgc2h1dHRlcgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50OF90IFFDYW1lcmFQYXJhbWV0ZXJzOjpnZXROdW1PZlJldHJvU25hcHNob3RzKCkKK3sKKyAgICBpbnQgbnVtT2ZSZXRyb1NuYXBzaG90cyA9IGdldEludChLRVlfUUNfTlVNX1JFVFJPX0JVUlNUX1BFUl9TSFVUVEVSKTsKKyAgICBpZiAobnVtT2ZSZXRyb1NuYXBzaG90cyA8IDApIHsKKyAgICAgICAgbnVtT2ZSZXRyb1NuYXBzaG90cyA9IDA7CisgICAgfQorICAgIExPR0goIm51bU9mUmV0cm9TbmFwcyAtICVkIiwgbnVtT2ZSZXRyb1NuYXBzaG90cyk7CisgICAgcmV0dXJuICh1aW50OF90KW51bU9mUmV0cm9TbmFwc2hvdHM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TnVtT2ZFeHRyYUhEUkluQnVmc0lmTmVlZGVkCisgKgorICogREVTQ1JJUFRJT046IGdldCBudW1iZXIgb2YgZXh0cmEgaW5wdXQgYnVmZmVycyBuZWVkZWQgYnkgSERSCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbnVtYmVyIG9mIGV4dHJhIGJ1ZmZlcnMgbmVlZGVkIGJ5IEhEUjsgMCBpZiBub3QgSERSIGVuYWJsZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDhfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0TnVtT2ZFeHRyYUhEUkluQnVmc0lmTmVlZGVkKCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbnVtT2ZCdWZzID0gMDsKKworICAgIGlmIChpc0hEUkVuYWJsZWQoKSkgeworICAgICAgICBudW1PZkJ1ZnMgKz0gbV9wQ2FwYWJpbGl0eS0+aGRyX2JyYWNrZXRpbmdfc2V0dGluZy5udW1fZnJhbWVzOworICAgICAgICBpZiAoaXNIRFIxeEZyYW1lRW5hYmxlZCgpICYmIGlzSERSMXhFeHRyYUJ1ZmZlck5lZWRlZCgpKSB7CisgICAgICAgICAgICBudW1PZkJ1ZnMrKzsKKyAgICAgICAgfQorICAgICAgICBudW1PZkJ1ZnMtLTsgLy8gT25seSBhZGRpdGlvbmFsIGJ1ZmZlcnMgbmVlZCB0byBiZSByZXR1cm5lZAorICAgIH0KKworICAgIHJldHVybiAodWludDhfdCkobnVtT2ZCdWZzKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXROdW1PZkV4dHJhSERST3V0QnVmc0lmTmVlZGVkCisgKgorICogREVTQ1JJUFRJT046IGdldCBudW1iZXIgb2YgZXh0cmEgb3V0cHV0IGJ1ZmZlcnMgbmVlZGVkIGJ5IEhEUgorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG51bWJlciBvZiBleHRyYSBidWZmZXJzIG5lZWRlZCBieSBIRFI7IDAgaWYgbm90IEhEUiBlbmFibGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldE51bU9mRXh0cmFIRFJPdXRCdWZzSWZOZWVkZWQoKQoreworICAgIGludCBudW1PZkJ1ZnMgPSAwOworCisgICAgaWYgKGlzSERSRW5hYmxlZCgpICYmIGlzSERSMXhGcmFtZUVuYWJsZWQoKSkgeworICAgICAgICBudW1PZkJ1ZnMrKzsKKyAgICB9CisKKyAgICByZXR1cm4gKHVpbnQ4X3QpKG51bU9mQnVmcyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0SnBlZ1F1YWxpdHkKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IGpwZWcgZW5jb2RpbmcgcXVhbGl0eQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGpwZWcgZW5jb2RpbmcgcXVhbGl0eQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0SnBlZ1F1YWxpdHkoKQoreworICAgIGludCBxdWFsaXR5ID0gZ2V0SW50KEtFWV9KUEVHX1FVQUxJVFkpOworICAgIGlmIChxdWFsaXR5IDwgMCkgeworICAgICAgICBxdWFsaXR5ID0gODU7IC8vIHNldCB0byBkZWZhdWx0IHF1YWxpdHkgdmFsdWUKKyAgICB9CisgICAgcmV0dXJuICh1aW50MzJfdClxdWFsaXR5OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFJvdGF0aW9uCisgKgorICogREVTQ1JJUFRJT046IGdldCBhcHBsaWNhdGlvbiBjb25maWd1cmVkIHJvdGF0aW9uCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogcm90YXRpb24gdmFsdWUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldFJvdGF0aW9uKCkgeworICAgIGludCByb3RhdGlvbiA9IDA7CisKKyAgICAvL0lmIGV4aWYgcm90YXRpb24gaXMgc2V0LCBkbyBub3Qgcm90YXRlIGNhcHR1cmVkIGltYWdlCisgICAgaWYgKCF1c2VKcGVnRXhpZlJvdGF0aW9uKCkpIHsKKyAgICAgICAgcm90YXRpb24gPSBtUm90YXRpb247CisgICAgICAgIGlmIChyb3RhdGlvbiA8IDApIHsKKyAgICAgICAgICAgIHJvdGF0aW9uID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHVpbnQzMl90KXJvdGF0aW9uOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEpwZWdSb3RhdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQganBlZyByb3RhdGlvbiB2YWx1ZSBjb25maWd1cmVkIGludGVybmFsbHkKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBqcGVnIHJvdGF0aW9uIHZhbHVlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEpwZWdSb3RhdGlvbihpbnQgcm90YXRpb24pIHsKKyAgICBpZiAocm90YXRpb24gPT0gMCB8fCByb3RhdGlvbiA9PSA5MCB8fAorICAgICAgICAgICAgcm90YXRpb24gPT0gMTgwIHx8IHJvdGF0aW9uID09IDI3MCkgeworICAgICAgICBtSnBlZ1JvdGF0aW9uID0gKHVpbnQzMl90KXJvdGF0aW9uOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXREZXZpY2VSb3RhdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgZGV2aWNlIHJvdGF0aW9uIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogZGV2aWNlIHJvdGF0aW9uIHZhbHVlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpnZXREZXZpY2VSb3RhdGlvbigpIHsKKyAgICBpbnQgcm90YXRpb24gPSAwOworCisgICAgcm90YXRpb24gPSBtUm90YXRpb247CisgICAgaWYgKHJvdGF0aW9uIDwgMCkgeworICAgICAgICByb3RhdGlvbiA9IDA7CisgICAgfQorCisgICAgcmV0dXJuICh1aW50MzJfdClyb3RhdGlvbjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRKcGVnRXhpZlJvdGF0aW9uCisgKgorICogREVTQ1JJUFRJT046IGdldCBleGlmIHJvdGF0aW9uIHZhbHVlCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogcm90YXRpb24gdmFsdWUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldEpwZWdFeGlmUm90YXRpb24oKSB7CisgICAgaW50IHJvdGF0aW9uID0gMDsKKworICAgIGlmICh1c2VKcGVnRXhpZlJvdGF0aW9uKCkpIHsKKyAgICAgICAgcm90YXRpb24gPSBtUm90YXRpb247CisgICAgICAgIGlmIChyb3RhdGlvbiA8IDApIHsKKyAgICAgICAgICAgIHJvdGF0aW9uID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHVpbnQzMl90KXJvdGF0aW9uOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVzZUpwZWdFeGlmUm90YXRpb24KKyAqCisgKiBERVNDUklQVElPTjogQ2hlY2sgaWYganBlZyBleGlmIHJvdGF0aW9uIG5lZWQgdG8gYmUgdXNlZAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IHRydWUgaWYganBlZyBleGlmIHJvdGF0aW9uIG5lZWQgdG8gYmUgdXNlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjp1c2VKcGVnRXhpZlJvdGF0aW9uKCkgeworICAgIGNoYXIgZXhpZlJvdGF0aW9uW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmV4aWYucm90YXRpb24iLCBleGlmUm90YXRpb24sICJvZmYiKTsKKworICAgIGlmICghc3RyY21wKGV4aWZSb3RhdGlvbiwgIm9uIikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKCEobV9wQ2FwYWJpbGl0eS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9ST1RBVElPTikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEVmZmVjdFZhbHVlCisgKgorICogREVTQ1JJUFRJT046IGdldCBlZmZlY3QgdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBlZmZlY3QgdmFsdWUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0RWZmZWN0VmFsdWUoKQoreworICAgIHVpbnQzMl90IGNudCA9IDA7CisgICAgY29uc3QgY2hhciAqZWZmZWN0ID0gZ2V0KEtFWV9FRkZFQ1QpOworICAgIGlmIChlZmZlY3QpIHsKKyAgICAgICAgd2hpbGUgKE5VTEwgIT0gRUZGRUNUX01PREVTX01BUFtjbnRdLmRlc2MpIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKEVGRkVDVF9NT0RFU19NQVBbY250XS5kZXNjLCBlZmZlY3QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVGRkVDVF9NT0RFU19NQVBbY250XS52YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbnQrKzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coIk1pc3NpbmcgZWZmZWN0IHZhbHVlIik7CisgICAgfQorICAgIHJldHVybiBDQU1fRUZGRUNUX01PREVfT0ZGOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHBhcnNlR1BTQ29vcmRpbmF0ZQorICoKKyAqIERFU0NSSVBUSU9OOiBwYXJzZSBHUFMgY29vcmRpbmF0ZSBzdHJpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNvb3JkX3N0ciA6IFtpbnB1dF0gY29vcmRpbmF0ZSBzdHJpbmcKKyAqICAgQGNvb3JkICAgICA6IFtvdXRwdXRdICBwdHIgdG8gc3RydWN0IHRvIHN0b3JlIGNvb3JkaW5hdGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYVBhcmFtZXRlcnM6OnBhcnNlR1BTQ29vcmRpbmF0ZShjb25zdCBjaGFyICpjb29yZF9zdHIsIHJhdF90KiBjb29yZCkKK3sKKyAgICBpZihjb29yZCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoImVycm9yLCBpbnZhbGlkIGFyZ3VtZW50IGNvb3JkID09IE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgZG91YmxlIGRlZ0YgPSBhdG9mKGNvb3JkX3N0cik7CisgICAgaWYgKGRlZ0YgPCAwKSB7CisgICAgICAgIGRlZ0YgPSAtZGVnRjsKKyAgICB9CisgICAgZG91YmxlIG1pbkYgPSAoZGVnRiAtIChkb3VibGUpKGludCkgZGVnRikgKiA2MC4wOworICAgIGRvdWJsZSBzZWNGID0gKG1pbkYgLSAoZG91YmxlKShpbnQpIG1pbkYpICogNjAuMDsKKworICAgIGdldFJhdGlvbmFsKCZjb29yZFswXSwgKGludClkZWdGLCAxKTsKKyAgICBnZXRSYXRpb25hbCgmY29vcmRbMV0sIChpbnQpbWluRiwgMSk7CisgICAgZ2V0UmF0aW9uYWwoJmNvb3JkWzJdLCAoaW50KShzZWNGICogMTAwMDAuMCksIDEwMDAwKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RXhpZkRhdGVUaW1lCisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IGV4aWYgZGF0ZSB0aW1lCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkYXRlVGltZSAgICA6IFN0cmluZyB0byBzdG9yZSBleGlmIGRhdGUgdGltZS4KKyAqICAgICAgICAgICAgICAgICAgU2hvdWxkIGJlIGxlYXZlZCB1bmNoYW5nZWQgaW4gY2FzZSBvZiBlcnJvci4KKyAqICAgQHN1YnNlY1RpbWUgIDogU3RyaW5nIHRvIHN0b3JlIGV4aWYgdGltZSBuYW5vc2Vjb25kcy4KKyAqICAgICAgICAgICAgICAgICAgU2hvdWxkIGJlIGxlYXZlZCB1bmNoYW5nZWQgaW4gY2FzZSBvZiBlcnJvci4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpnZXRFeGlmRGF0ZVRpbWUoU3RyaW5nOCAmZGF0ZVRpbWUsIFN0cmluZzggJnN1YnNlY1RpbWUpCit7CisgICAgaW50MzJfdCByZXQgPSBOT19FUlJPUjsKKworICAgIC8vZ2V0IHRpbWUgYW5kIGRhdGUgZnJvbSBzeXN0ZW0KKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBzdHJ1Y3QgdG0gdGltZWluZm9fZGF0YTsKKworICAgIGludCByZXMgPSBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKyAgICBpZiAoMCA9PSByZXMpIHsKKyAgICAgICAgc3RydWN0IHRtICp0aW1laW5mbyA9IGxvY2FsdGltZV9yKCZ0di50dl9zZWMsICZ0aW1laW5mb19kYXRhKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gdGltZWluZm8pIHsKKyAgICAgICAgICAgIC8vV3JpdGUgZGF0ZXRpbWUgYWNjb3JkaW5nIHRvIEVYSUYgU3BlYworICAgICAgICAgICAgLy8iWVlZWTpNTTpERCBISDpNTTpTUyIgKDIwIGNoYXJzIGluY2x1ZGluZyBcMCkKKyAgICAgICAgICAgIGRhdGVUaW1lID0gU3RyaW5nODo6Zm9ybWF0KCIlMDRkOiUwMmQ6JTAyZCAlMDJkOiUwMmQ6JTAyZCIsCisgICAgICAgICAgICAgICAgICAgIHRpbWVpbmZvLT50bV95ZWFyICsgMTkwMCwgdGltZWluZm8tPnRtX21vbiArIDEsCisgICAgICAgICAgICAgICAgICAgIHRpbWVpbmZvLT50bV9tZGF5LCB0aW1laW5mby0+dG1faG91ciwKKyAgICAgICAgICAgICAgICAgICAgdGltZWluZm8tPnRtX21pbiwgdGltZWluZm8tPnRtX3NlYyk7CisgICAgICAgICAgICAvL1dyaXRlIHN1YnNlYyBhY2NvcmRpbmcgdG8gRVhJRiBTZXBjCisgICAgICAgICAgICBzdWJzZWNUaW1lID0gU3RyaW5nODo6Zm9ybWF0KCIlMDZsZCIsIHR2LnR2X3VzZWMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgibG9jYWx0aW1lX3IoKSBlcnJvciIpOworICAgICAgICAgICAgcmV0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoLTEgPT0gcmVzKSB7CisgICAgICAgIExPR0UoImdldHRpbWVvZmRheSgpIGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldCA9IFVOS05PV05fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiZ2V0dGltZW9mZGF5KCkgdW5leHBlY3RlZCByZXR1cm4gY29kZTogJWQiLCByZXMpOworICAgICAgICByZXQgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0UmF0aW9uYWwKKyAqCisgKiBERVNDUklQVElPTjogY29tcG9zZSByYXRpb25hbCBzdHJ1Y3QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHJhdCAgICAgOiBwdHIgdG8gc3RydWN0IHRvIHN0b3JlIHJhdGlvbmFsIGluZm8KKyAqICAgQG51bSAgICAgOm51bSBvZiB0aGUgcmF0aW9uYWwKKyAqICAgQGRlbm9tICAgOiBkZW5vbSBvZiB0aGUgcmF0aW9uYWwKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpnZXRSYXRpb25hbChyYXRfdCAqcmF0LCBpbnQgbnVtLCBpbnQgZGVub20pCit7CisgICAgaWYgKCgwID4gbnVtKSB8fCAoMCA+IGRlbm9tKSkgeworICAgICAgICBMT0dFKCJOZWdhdGl2ZSB2YWx1ZXMiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKE5VTEwgPT0gcmF0KSB7CisgICAgICAgIExPR0UoIk5VTEwgcmF0IGlucHV0Iik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJhdC0+bnVtID0gKHVpbnQzMl90KW51bTsKKyAgICByYXQtPmRlbm9tID0gKHVpbnQzMl90KWRlbm9tOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRFeGlmRm9jYWxMZW5ndGgKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IGV4aWYgZm9jYWwgbGVuZ2h0CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmb2NhbExlbmd0aCA6IHB0ciB0byByYXRpb25hbCBzdHJjdXQgdG8gc3RvcmUgZm9jYWwgbGVuZ2h0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0RXhpZkZvY2FsTGVuZ3RoKHJhdF90ICpmb2NhbExlbmd0aCkKK3sKKyAgICBpbnQgZm9jYWxMZW5ndGhWYWx1ZSA9CisgICAgICAgIChpbnQpKGdldEZsb2F0KFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRk9DQUxfTEVOR1RIKSAqIEZPQ0FMX0xFTkdUSF9ERUNJTUFMX1BSRUNJU0lPTik7CisgICAgcmV0dXJuIGdldFJhdGlvbmFsKGZvY2FsTGVuZ3RoLCBmb2NhbExlbmd0aFZhbHVlLCBGT0NBTF9MRU5HVEhfREVDSU1BTF9QUkVDSVNJT04pOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEV4aWZJc29TcGVlZAorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgZXhpZiBJU08gc3BlZWQKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBJU08gc3BlZWQgdmFsdWUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDE2X3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldEV4aWZJc29TcGVlZCgpCit7CisgICAgdWludDE2X3QgaXNvU3BlZWQgPSAwOworICAgIGNvbnN0IGNoYXIgKmlzb19zdHIgPSBnZXQoUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9RQ19JU09fTU9ERSk7CisgICAgaW50IGlzb19pbmRleCA9IGxvb2t1cEF0dHIoSVNPX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoSVNPX01PREVTX01BUCksIGlzb19zdHIpOworICAgIHN3aXRjaCAoaXNvX2luZGV4KSB7CisgICAgY2FzZSBDQU1fSVNPX01PREVfQVVUTzoKKyAgICAgICAgaXNvU3BlZWQgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9JU09fTU9ERV9ERUJMVVI6CisgICAgICAgIGlzb1NwZWVkID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fSVNPX01PREVfMTAwOgorICAgICAgICBpc29TcGVlZCA9IDEwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fSVNPX01PREVfMjAwOgorICAgICAgICBpc29TcGVlZCA9IDIwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fSVNPX01PREVfNDAwOgorICAgICAgICBpc29TcGVlZCA9IDQwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fSVNPX01PREVfODAwOgorICAgICAgICBpc29TcGVlZCA9IDgwMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fSVNPX01PREVfMTYwMDoKKyAgICAgICAgaXNvU3BlZWQgPSAxNjAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9JU09fTU9ERV8zMjAwOgorICAgICAgICBpc29TcGVlZCA9IDMyMDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gaXNvU3BlZWQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RXhpZkdwc1Byb2Nlc3NpbmdNZXRob2QKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IEdQUyBwcm9jZXNzaW5nIG1ldGhvZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZ3BzUHJvY2Vzc2luZ01ldGhvZCA6IHN0cmluZyB0byBzdG9yZSBHUFMgcHJvY2VzcyBtZXRob2QKKyAqICAgQGNvdW50ICAgICAgICAgICAgICAgOiBsZW5naHQgb2YgdGhlIHN0cmluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldEV4aWZHcHNQcm9jZXNzaW5nTWV0aG9kKGNoYXIgKmdwc1Byb2Nlc3NpbmdNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmY291bnQpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gZ2V0KEtFWV9HUFNfUFJPQ0VTU0lOR19NRVRIT0QpOworICAgIGlmKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIG1lbWNweShncHNQcm9jZXNzaW5nTWV0aG9kLCBFeGlmQXNjaWlQcmVmaXgsIEVYSUZfQVNDSUlfUFJFRklYX1NJWkUpOworICAgICAgICBjb3VudCA9IEVYSUZfQVNDSUlfUFJFRklYX1NJWkU7CisgICAgICAgIHN0cmxjcHkoZ3BzUHJvY2Vzc2luZ01ldGhvZCArIEVYSUZfQVNDSUlfUFJFRklYX1NJWkUsIHN0ciwgR1BTX1BST0NFU1NJTkdfTUVUSE9EX1NJWkUpOworICAgICAgICBjb3VudCArPSAodWludDMyX3Qpc3RybGVuKHN0cik7CisgICAgICAgIGdwc1Byb2Nlc3NpbmdNZXRob2RbY291bnQrK10gPSAnXDAnOyAvLyBpbmNyZWFzZSAxIGZvciB0aGUgbGFzdCBOVUxMIGNoYXIKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEV4aWZMYXRpdHVkZQorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgZXhpZiBsYXRpdHVkZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbGF0aXR1ZGUgOiBwdHIgdG8gcmF0aW9uYWwgc3RydWN0IHRvIHN0b3JlIGxhdGl0dWRlIGluZm8KKyAqICAgQGxhZFJlZiAgIDogY2hhcmF0ZXIgdG8gaW5kaWNhdGUgbGF0aXR1ZGUgcmVmZXJlbmNlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0RXhpZkxhdGl0dWRlKHJhdF90ICpsYXRpdHVkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpsYXRSZWYpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gZ2V0KEtFWV9HUFNfTEFUSVRVREUpOworICAgIGlmKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIHBhcnNlR1BTQ29vcmRpbmF0ZShzdHIsIGxhdGl0dWRlKTsKKworICAgICAgICAvL3NldCBMYXRpdHVkZSBSZWYKKyAgICAgICAgZmxvYXQgbGF0aXR1ZGVWYWx1ZSA9IGdldEZsb2F0KEtFWV9HUFNfTEFUSVRVREUpOworICAgICAgICBpZihsYXRpdHVkZVZhbHVlIDwgMC4wZikgeworICAgICAgICAgICAgbGF0UmVmWzBdID0gJ1MnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGF0UmVmWzBdID0gJ04nOworICAgICAgICB9CisgICAgICAgIGxhdFJlZlsxXSA9ICdcMCc7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9ZWxzZXsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RXhpZkxvbmdpdHVkZQorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgZXhpZiBsb25naXR1ZGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGxvbmdpdHVkZSA6IHB0ciB0byByYXRpb25hbCBzdHJ1Y3QgdG8gc3RvcmUgbG9uZ2l0dWRlIGluZm8KKyAqICAgQGxvblJlZiAgICA6IGNoYXJhdGVyIHRvIGluZGljYXRlIGxvbmdpdHVkZSByZWZlcmVuY2UKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpnZXRFeGlmTG9uZ2l0dWRlKHJhdF90ICpsb25naXR1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmxvblJlZikKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBnZXQoS0VZX0dQU19MT05HSVRVREUpOworICAgIGlmKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIHBhcnNlR1BTQ29vcmRpbmF0ZShzdHIsIGxvbmdpdHVkZSk7CisKKyAgICAgICAgLy9zZXQgTG9uZ2l0dWRlIFJlZgorICAgICAgICBmbG9hdCBsb25naXR1ZGVWYWx1ZSA9IGdldEZsb2F0KEtFWV9HUFNfTE9OR0lUVURFKTsKKyAgICAgICAgaWYobG9uZ2l0dWRlVmFsdWUgPCAwLjBmKSB7CisgICAgICAgICAgICBsb25SZWZbMF0gPSAnVyc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb25SZWZbMF0gPSAnRSc7CisgICAgICAgIH0KKyAgICAgICAgbG9uUmVmWzFdID0gJ1wwJzsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH1lbHNleworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRFeGlmQWx0aXR1ZGUKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IGV4aWYgYWx0aXR1ZGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGFsdGl0dWRlIDogcHRyIHRvIHJhdGlvbmFsIHN0cnVjdCB0byBzdG9yZSBhbHRpdHVkZSBpbmZvCisgKiAgIEBhbHRSZWYgICA6IGNoYXJhdGVyIHRvIGluZGljYXRlIGFsdGl0dWRlIHJlZmVyZW5jZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldEV4aWZBbHRpdHVkZShyYXRfdCAqYWx0aXR1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYWx0UmVmKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IGdldChLRVlfR1BTX0FMVElUVURFKTsKKyAgICBpZihzdHIgIT0gTlVMTCkgeworICAgICAgICBkb3VibGUgdmFsdWUgPSBhdG9mKHN0cik7CisgICAgICAgICphbHRSZWYgPSAwOworICAgICAgICBpZih2YWx1ZSA8IDApeworICAgICAgICAgICAgKmFsdFJlZiA9IDE7CisgICAgICAgICAgICB2YWx1ZSA9IC12YWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0UmF0aW9uYWwoYWx0aXR1ZGUsIChpbnQpKHZhbHVlKjEwMDApLCAxMDAwKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RXhpZkdwc0RhdGVUaW1lU3RhbXAKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IGV4aWYgR1BTIGRhdGUgdGltZSBzdGFtcAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZ3BzRGF0ZVN0YW1wIDogR1BTIGRhdGUgdGltZSBzdGFtcCBzdHJpbmcKKyAqICAgQGJ1ZkxlbiAgICAgICA6IGxlbmd0aCBvZiB0aGUgc3RyaW5nCisgKiAgIEBncHNUaW1lU3RhbXAgOiBwdHIgdG8gcmF0aW9uYWwgc3RydWN0IHRvIHN0b3JlIHRpbWUgc3RhbXAgaW5mbworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldEV4aWZHcHNEYXRlVGltZVN0YW1wKGNoYXIgKmdwc0RhdGVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1ZkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdF90ICpncHNUaW1lU3RhbXApCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gZ2V0KEtFWV9HUFNfVElNRVNUQU1QKTsKKyAgICBpZihzdHIgIT0gTlVMTCkgeworICAgICAgICB0aW1lX3QgdW5peFRpbWUgPSAodGltZV90KWF0b2woc3RyKTsKKyAgICAgICAgc3RydWN0IHRtICpVVENUaW1lc3RhbXAgPSBnbXRpbWUoJnVuaXhUaW1lKTsKKworICAgICAgICBpZighVVRDVGltZXN0YW1wKSB7CisgICAgICAgICAgICBMT0dFKCJVVENUaW1lc3RhbXAgaXMgbnVsbFxuIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgc3RyZnRpbWUoZ3BzRGF0ZVN0YW1wLCBidWZMZW4sICIlWTolbTolZCIsIFVUQ1RpbWVzdGFtcCk7CisKKyAgICAgICAgZ2V0UmF0aW9uYWwoJmdwc1RpbWVTdGFtcFswXSwgVVRDVGltZXN0YW1wLT50bV9ob3VyLCAxKTsKKyAgICAgICAgZ2V0UmF0aW9uYWwoJmdwc1RpbWVTdGFtcFsxXSwgVVRDVGltZXN0YW1wLT50bV9taW4sIDEpOworICAgICAgICBnZXRSYXRpb25hbCgmZ3BzVGltZVN0YW1wWzJdLCBVVENUaW1lc3RhbXAtPnRtX3NlYywgMSk7CisKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVwZGF0ZUZvY3VzRGlzdGFuY2VzCisgKgorICogREVTQ1JJUFRJT046IHVwZGF0ZSBmb2N1cyBkaXN0YW5jZXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZvY3VzRGlzdGFuY2VzIDogcHRyIHRvIGZvY3VzIGRpc3RhbmNlIGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjp1cGRhdGVGb2N1c0Rpc3RhbmNlcyhjYW1fZm9jdXNfZGlzdGFuY2VzX2luZm9fdCAqZm9jdXNEaXN0YW5jZXMpCit7CisgICAgU3RyaW5nOCBzdHI7CisgICAgY2hhciBidWZmZXJbMzJdID0gezB9OworICAgIC8vc2V0IGFsbCBkaXN0YW5jZXMgdG8gaW5maW5pdHkgaWYgZm9jdXMgbW9kZSBpcyBpbmZpbml0eQorICAgIGlmKG1Gb2N1c01vZGUgPT0gQ0FNX0ZPQ1VTX01PREVfSU5GSU5JVFkpIHsKKyAgICAgICAgc3RyLmFwcGVuZCgiSW5maW5pdHksSW5maW5pdHksSW5maW5pdHkiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZm9jdXNEaXN0YW5jZXMtPmZvY3VzX2Rpc3RhbmNlWzBdIDwgRk9DVVNfUEVSQ0lTSU9OKSB7CisgICAgICAgICAgICBzdHIuYXBwZW5kKCJJbmZpbml0eSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVmIiwgMS4wL2ZvY3VzRGlzdGFuY2VzLT5mb2N1c19kaXN0YW5jZVswXSk7CisgICAgICAgICAgICBzdHIuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvY3VzRGlzdGFuY2VzLT5mb2N1c19kaXN0YW5jZVsxXSA8IEZPQ1VTX1BFUkNJU0lPTikgeworICAgICAgICAgICAgc3RyLmFwcGVuZCgiLEluZmluaXR5Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiLCVmIiwgMS4wL2ZvY3VzRGlzdGFuY2VzLT5mb2N1c19kaXN0YW5jZVsxXSk7CisgICAgICAgICAgICBzdHIuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvY3VzRGlzdGFuY2VzLT5mb2N1c19kaXN0YW5jZVsyXSA8IEZPQ1VTX1BFUkNJU0lPTikgeworICAgICAgICAgICAgc3RyLmFwcGVuZCgiLEluZmluaXR5Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiLCVmIiwgMS4wL2ZvY3VzRGlzdGFuY2VzLT5mb2N1c19kaXN0YW5jZVsyXSk7CisgICAgICAgICAgICBzdHIuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HSCgic2V0dGluZyBLRVlfRk9DVVNfRElTVEFOQ0VTIGFzICVzIiwgX19GVU5DVElPTl9fLCBzdHIuc3RyaW5nKCkpOworICAgIHNldChRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZPQ1VTX0RJU1RBTkNFUywgc3RyLnN0cmluZygpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdXBkYXRlUmVjb3JkaW5nSGludFZhbHVlCisgKgorICogREVTQ1JJUFRJT046IHVwZGF0ZSByZWNvcmRpbmcgaGludCBsb2NhbGx5IGFuZCB0byBkYWVtb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHZhbHVlICAgOiB2aWRlbyBoaW50IHZhbHVlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6dXBkYXRlUmVjb3JkaW5nSGludFZhbHVlKGludDMyX3QgdmFsdWUpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGlmKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwICkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKworICAgIHJjID0gc2V0UmVjb3JkaW5nSGludFZhbHVlKHZhbHVlKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHVwZGF0ZSB0YWJsZSIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgaWYobV9iRElTRW5hYmxlZCAmJiAodmFsdWU9PTEpKSB7CisgICAgICAgIExPR0goIiVkOiBTZXR0aW5nIERJUyB2YWx1ZSBhZ2FpbiEhIik7CisgICAgICAgIHNldERJU1ZhbHVlKFZBTFVFX0VOQUJMRSk7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCgpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gdXBkYXRlIHJlY29yZGluZyBoaW50Iik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0SGlzdG9ncmFtCisgKgorICogREVTQ1JJUFRJT046IHNldCBoaXN0b2dyYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGVuYWJsZWQgOiBpZiBoaXN0b2dyYW0gaXMgZW5hYmxlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEhpc3RvZ3JhbShib29sIGVuYWJsZWQpCit7CisgICAgaWYobV9iSGlzdG9ncmFtRW5hYmxlZCA9PSBlbmFibGVkKSB7CisgICAgICAgIExPR0goImhpc3RvZ3JhbSBmbGFnIG5vdCBjaGFuZ2VkLCBubyBvcHMgaGVyZSIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgLy8gc2V0IHBhcm0gZm9yIGhpc3RvZ3JhbQorICAgIGlmKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwICkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKworICAgIGludDMyX3QgdmFsdWUgPSBlbmFibGVkID8gMSA6IDA7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX0hJU1RPR1JBTSwgdmFsdWUpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByYyA9IGNvbW1pdFNldEJhdGNoKCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgaGlzdG9ncmFtIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBtX2JIaXN0b2dyYW1FbmFibGVkID0gZW5hYmxlZDsKKworICAgIExPR0goIkhpc3RvZ3JhbSAtPiAlcyIsIG1fYkhpc3RvZ3JhbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRJbnRFdmVudAorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgc2V0SW50RXZlbnQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtcyA6IGltYWdlIHNpemUgYW5kIGRpbWVuc2lvbnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRJbnRFdmVudChjYW1faW50X2V2dF9wYXJhbXNfdCBwYXJhbXMpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKCBtX3BQYXJhbUJ1ZiA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZihpbml0QmF0Y2hVcGRhdGUobV9wUGFyYW1CdWYpIDwgMCApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZ3JvdXAgdXBkYXRlIHRhYmxlIik7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisKKyAgICAvL1NlbmRpbmcgc25hcHNob3QgdGFrZW4gbm90aWZpY2F0aW9uIGJhY2sgdG8gRXp0dW5lIgorICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX0lOVF9FVlQsIHBhcmFtcykpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHVwZGF0ZSB0YWJsZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2goKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBmcmFtZXNraXAgaW5mbyBwYXJtIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0RmFjZURldGVjdGlvbk9wdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgaWYgZmFjZSBkZXRlY3Rpb24gaXMgZW5hYmxlZCBieSBTZW5kQ29tbWFuZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZW5hYmxlZCA6IGJvb2wgZmxhZyBpZiBmYWNlIGRldGVjdGlvbiBzaG91bGQgYmUgZW5hYmxlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyBpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRGYWNlRGV0ZWN0aW9uT3B0aW9uKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBtX2JGYWNlRGV0ZWN0aW9uT24gPSBlbmFibGVkOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRGYWNlRGV0ZWN0aW9uCisgKgorICogREVTQ1JJUFRJT046IHNldCBmYWNlIGRldGVjdGlvbgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZW5hYmxlZCA6IGlmIGZhY2UgZGV0ZWN0aW9uIGlzIGVuYWJsZWQKKyAqICAgQGluaXRDb21taXQgOiBpZiBjb25maWd1cmF0aW9uIGxpc3QgbmVlZCB0byBiZSBpbml0aWFsaXplZCBhbmQgY29tbWl0ZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRGYWNlRGV0ZWN0aW9uKGJvb2wgZW5hYmxlZCwgYm9vbCBpbml0Q29tbWl0KQoreworICAgIHVpbnQzMl90IGZhY2VQcm9jTWFzayA9IG1fbkZhY2VQcm9jTWFzazsKKyAgICAvLyBzZXQgZmFjZSBkZXRlY3Rpb24gbWFzaworICAgIGlmIChlbmFibGVkKSB7CisgICAgICAgIGlmIChtX3BDYXBhYmlsaXR5LT5tYXhfbnVtX3JvaSA9PSAwKSB7CisgICAgICAgICAgICBMT0dFKCJGYWNlIGRldGVjdGlvbiBpcyBub3Qgc3VwcG9ydCBiZWN1YXNlIG1heCBudW1iZXIgb2YgZmFjZSBpcyAwIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGZhY2VQcm9jTWFzayB8PSBDQU1fRkFDRV9QUk9DRVNTX01BU0tfREVURUNUSU9OOworICAgICAgICBpZiAoZ2V0UmVjb3JkaW5nSGludFZhbHVlKCkgPiAwKSB7CisgICAgICAgICAgICBmYWNlUHJvY01hc2sgPSAwOworICAgICAgICAgICAgZmFjZVByb2NNYXNrIHw9IENBTV9GQUNFX1BST0NFU1NfTUFTS19GT0NVUzsKKyAgICAgICAgICAgIGlmIChmZE1vZGVJblZpZGVvKCkgPT0gQ0FNX0ZBQ0VfUFJPQ0VTU19NQVNLX0RFVEVDVElPTikgeworICAgICAgICAgICAgICAgIGZhY2VQcm9jTWFzayB8PSBDQU1fRkFDRV9QUk9DRVNTX01BU0tfREVURUNUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFjZVByb2NNYXNrIHw9IENBTV9GQUNFX1BST0NFU1NfTUFTS19GT0NVUzsKKyAgICAgICAgICAgIGZhY2VQcm9jTWFzayB8PSBDQU1fRkFDRV9QUk9DRVNTX01BU0tfREVURUNUSU9OOworICAgICAgICB9CisgICAgICAgIGlmIChpc1RydWVQb3J0cmFpdEVuYWJsZWQoKSkgeworICAgICAgICAgICAgTE9HTCgiUUNhbWVyYVBhcmFtZXRlcnM6OnNldEZhY2VEZXRlY3Rpb24gdHJ1ZXBvcnRyYWl0IGVuYWJsZWQiKTsKKyAgICAgICAgICAgIGZhY2VQcm9jTWFzayB8PSBDQU1fRkFDRV9QUk9DRVNTX01BU0tfR0FaRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0woIlFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRGYWNlRGV0ZWN0aW9uIHRydWVwb3J0cmFpdCBkaXNhYmxlZCIpOworICAgICAgICAgICAgZmFjZVByb2NNYXNrICY9IH5DQU1fRkFDRV9QUk9DRVNTX01BU0tfR0FaRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZhY2VQcm9jTWFzayAmPSB+KENBTV9GQUNFX1BST0NFU1NfTUFTS19ERVRFQ1RJT04KKyAgICAgICAgICAgICAgICB8IENBTV9GQUNFX1BST0NFU1NfTUFTS19GT0NVUworICAgICAgICAgICAgICAgIHwgQ0FNX0ZBQ0VfUFJPQ0VTU19NQVNLX0dBWkUpOworICAgIH0KKworICAgIGlmKG1fbkZhY2VQcm9jTWFzayA9PSBmYWNlUHJvY01hc2spIHsKKyAgICAgICAgTE9HSCgiZmFjZSBwcm9jZXNzIG1hc2sgbm90IGNoYW5nZWQsIG5vIG9wcyBoZXJlIik7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBtX25GYWNlUHJvY01hc2sgPSBmYWNlUHJvY01hc2s7CisKKyAgICAvLyBzZXQgcGFybSBmb3IgZmFjZSBkZXRlY3Rpb24KKyAgICB1aW50MzJfdCByZXF1ZXN0ZWRfZmFjZXMgPSAodWludDMyX3QpZ2V0SW50KEtFWV9RQ19NQVhfTlVNX1JFUVVFU1RFRF9GQUNFUyk7CisgICAgY2FtX2ZkX3NldF9wYXJtX3QgZmRfc2V0X3Bhcm07CisgICAgbWVtc2V0KCZmZF9zZXRfcGFybSwgMCwgc2l6ZW9mKGNhbV9mZF9zZXRfcGFybV90KSk7CisgICAgZmRfc2V0X3Bhcm0uZmRfbW9kZSA9IGZhY2VQcm9jTWFzazsKKyAgICBmZF9zZXRfcGFybS5udW1fZmQgPSByZXF1ZXN0ZWRfZmFjZXM7CisKKyAgICBMT0dIKCJbS1BJIFBlcmZdOiBQUk9GSUxFX0ZBQ0VfREVURUNUSU9OX1ZBTFVFID0gJWQgbnVtX2ZkID0gJWQiLAorICAgICAgICAgICBmYWNlUHJvY01hc2sscmVxdWVzdGVkX2ZhY2VzKTsKKworICAgIGlmIChpbml0Q29tbWl0KSB7CisgICAgICAgIGlmKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwICkgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZ3JvdXAgdXBkYXRlIHRhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9GRCwgZmRfc2V0X3Bhcm0pKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoaW5pdENvbW1pdCkgeworICAgICAgICByYyA9IGNvbW1pdFNldEJhdGNoKCk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBmYWNlIGRldGVjdGlvbiBwYXJtIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dIKCJGYWNlUHJvY01hc2sgLT4gJWQiLCBtX25GYWNlUHJvY01hc2spOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEZyYW1lU2tpcAorICoKKyAqIERFU0NSSVBUSU9OOiBzZW5kIElTUCBmcmFtZSBza2lwIHBhdHRlcm4gdG8gY2FtZXJhIGRhZW1vbgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcGF0dGVybiA6IHNraXAgcGF0dGVybiBmb3IgSVNQCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0RnJhbWVTa2lwKGVudW0gbXNtX3ZmZV9mcmFtZV9za2lwX3BhdHRlcm4gcGF0dGVybikKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBpZiAoIG1fcFBhcmFtQnVmID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwICkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX0ZSQU1FU0tJUCwgKGludDMyX3QpcGF0dGVybikpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHVwZGF0ZSB0YWJsZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2goKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBmcmFtZXNraXAgaW5mbyBwYXJtIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdXBkYXRlUkFXCisgKgorICogREVTQ1JJUFRJT046IFF1ZXJ5IHNlbnNvciBvdXRwdXQgc2l6ZSBiYXNlZCBvbiBtYXhpbXVtIHN0cmVhbSBkaW1lbnNpb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1heF9kaW0gOiBtYXhpbXVtIHN0cmVhbSBkaW1lbnNpb24KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjp1cGRhdGVSQVcoY2FtX2RpbWVuc2lvbl90IG1heF9kaW0pCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGNhbV9kaW1lbnNpb25fdCByYXdfZGltLCBwaWNfZGltOworCisgICAgLy9ObyBuZWVkIHRvIHVwZGF0ZSBSQVcgZGltZW5zaW9ucyBpZiBtZXRhIHJhdyBpcyBlbmFibGVkLgorICAgIGlmIChtX2JNZXRhUmF3RW5hYmxlZCkgeworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIC8vIElmIG9mZmxpbmUgcmF3IGlzIGVuYWJsZWQsIGNoZWNrIHRoZSBkaW1lbnNpb25zIGZyb20gUGljdHVyZSBzaXplIHNpbmNlIHNuYXBzaG90CisgICAgLy8gc3RyZWFtIGlzIG5vdCBhZGRlZCBidXQgZmluYWwgSlBFRyBpcyByZXF1aXJlZCBvZiBzbmFwc2hvdCBzaXplCisgICAgaWYgKGdldG9mZmxpbmVSQVcoKSkgeworICAgICAgICBpZiAoZ2V0UXVhZHJhQ2ZhKCkpIHsKKyAgICAgICAgICAgIG1heF9kaW0ud2lkdGggPSBtX3BDYXBhYmlsaXR5LT5xdWFkcmFfY2ZhX2RpbVswXS53aWR0aDsKKyAgICAgICAgICAgIG1heF9kaW0uaGVpZ2h0ID0gbV9wQ2FwYWJpbGl0eS0+cXVhZHJhX2NmYV9kaW1bMF0uaGVpZ2h0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0U3RyZWFtRGltZW5zaW9uKENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCwgcGljX2RpbSk7CisgICAgICAgICAgICBpZiAocGljX2RpbS53aWR0aCA+IG1heF9kaW0ud2lkdGgpIHsKKyAgICAgICAgICAgICAgICBtYXhfZGltLndpZHRoID0gcGljX2RpbS53aWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwaWNfZGltLmhlaWdodCA+IG1heF9kaW0uaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbWF4X2RpbS5oZWlnaHQgPSBwaWNfZGltLmhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtYXhfZGltLndpZHRoID09IDAgfHwgbWF4X2RpbS5oZWlnaHQgPT0gMCkgeworICAgICAgICBtYXhfZGltID0gbV9wQ2FwYWJpbGl0eS0+cmF3X2RpbVswXTsKKyAgICB9CisKKyAgICBpZihpbml0QmF0Y2hVcGRhdGUobV9wUGFyYW1CdWYpIDwgMCApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZ3JvdXAgdXBkYXRlIHRhYmxlIik7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9NQVhfRElNRU5TSU9OLCBtYXhfZGltKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gdXBkYXRlIHRhYmxlIGZvciBDQU1fSU5URl9QQVJNX01BWF9ESU1FTlNJT04gIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCgpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IGxvY2sgQ0FNX0lOVEZfUEFSTV9NQVhfRElNRU5TSU9OIHBhcm0iKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwICkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKworICAgIEFERF9HRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fUkFXX0RJTUVOU0lPTik7CisKKyAgICByYyA9IGNvbW1pdEdldEJhdGNoKCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBnZXQgY29tbWl0IENBTV9JTlRGX1BBUk1fUkFXX0RJTUVOU0lPTiIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgUkVBRF9QQVJBTV9FTlRSWShtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9SQVdfRElNRU5TSU9OLCByYXdfZGltKTsKKworICAgIExPR0goIlJBVyBEaW1lbnNpb24gPSAlZCBYICVkIixyYXdfZGltLndpZHRoLHJhd19kaW0uaGVpZ2h0KTsKKyAgICBpZiAocmF3X2RpbS53aWR0aCA9PSAwIHx8IHJhd19kaW0uaGVpZ2h0ID09IDApIHsKKyAgICAgICAgTE9HVygiRXJyb3IgZ2V0dGluZyBSQVcgc2l6ZS4gU2V0dGluZyB0byBDYXBhYmlsaXR5IHZhbHVlIik7CisgICAgICAgIGlmIChnZXRRdWFkcmFDZmEoKSkgeworICAgICAgICAgICAgcmF3X2RpbSA9IG1fcENhcGFiaWxpdHktPnF1YWRyYV9jZmFfZGltWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmF3X2RpbSA9IG1fcENhcGFiaWxpdHktPnJhd19kaW1bMF07CisgICAgICAgIH0KKyAgICB9CisgICAgc2V0UmF3U2l6ZShyYXdfZGltKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0SERSU2NlbmVFbmFibGUKKyAqCisgKiBERVNDUklQVElPTjogc2V0cyBoZHIgc2NlbmUgZGV0ZWNlZCBmbGFnCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBiZmxhZyA6IGhkciBzY2VuZSBkZXRlY2VkCisgKgorICogUkVUVVJOICAgICA6IG5vdGhpbmcKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0SERSU2NlbmVFbmFibGUoYm9vbCBiZmxhZykKK3sKKyAgICBib29sIGJ1cGRhdGUgPSBmYWxzZTsKKyAgICBpZiAobV9IRFJTY2VuZUVuYWJsZWQgIT0gYmZsYWcpIHsKKyAgICAgICAgYnVwZGF0ZSA9IHRydWU7CisgICAgfQorICAgIG1fSERSU2NlbmVFbmFibGVkID0gYmZsYWc7CisKKyAgICBpZiAoYnVwZGF0ZSkgeworICAgICAgICB1cGRhdGVGbGFzaCh0cnVlKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0QVNEU3RhdGVTdHJpbmcKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IEFTRCByZXN1bHQgaW4gc3RyaW5nIGZvcm1hdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc2NlbmUgOiBzZWxlY3RlZCBzY2VuZSBtb2RlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworIGNvbnN0IGNoYXIgKlFDYW1lcmFQYXJhbWV0ZXJzOjpnZXRBU0RTdGF0ZVN0cmluZyhjYW1fYXV0b19zY2VuZV90IHNjZW5lKQoreworICAgIHN3aXRjaCAoc2NlbmUpIHsKKyAgICAgIGNhc2UgU19OT1JNQUwgOgorICAgICAgICByZXR1cm4gIk5vcm1hbCI7CisgICAgICBjYXNlIFNfU0NFTkVSWToKKyAgICAgICAgcmV0dXJuICJTY2VuZXJ5IjsKKyAgICAgIGNhc2UgU19QT1JUUkFJVDoKKyAgICAgICAgcmV0dXJuICJQb3J0cmFpdCI7CisgICAgICBjYXNlIFNfUE9SVFJBSVRfQkFDS0xJR0hUOgorICAgICAgICByZXR1cm4gIlBvcnRyYWl0LUJhY2tsaWdodCI7CisgICAgICBjYXNlIFNfU0NFTkVSWV9CQUNLTElHSFQ6CisgICAgICAgIHJldHVybiAiU2NlbmVyeS1CYWNrbGlnaHQiOworICAgICAgY2FzZSBTX0JBQ0tMSUdIVDoKKyAgICAgICAgcmV0dXJuICJCYWNrbGlnaHQiOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICI8VW5rbm93biE+IjsKKyAgICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwYXJzZU5EaW1WZWN0b3IKKyAqCisgKiBERVNDUklQVElPTjogaGVscGVyIGZ1bmN0aW9uIHRvIHBhcnNlIGEgc3RyaW5nIGxpa2UgIigxLCAyLCAzLCA0LCAuLi4sIE4pIgorICogICAgICAgICAgICAgIGludG8gTi1kaW1lbnNpb24gdmVjdG9yCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdHIgICAgIDogc3RyaW5nIHRvIGJlIHBhcnNlZAorICogICBAbnVtICAgICA6IG91dHB1dCBhcnJheSBvZiBzaXplIE4gdG8gc3RvcmUgdmVjdG9yIGVsZW1lbnQgdmFsdWVzCisgKiAgIEBOICAgICAgIDogbnVtYmVyIG9mIGRpbWVuc2lvbgorICogICBAZGVsaW0gICA6IGRlbGltZXRlciB0byBzZXBlcmV0ZSBzdHJpbmcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpwYXJzZU5EaW1WZWN0b3IoY29uc3QgY2hhciAqc3RyLCBpbnQgKm51bSwgaW50IE4sIGNoYXIgZGVsaW0gPSAnLCcpCit7CisgICAgY2hhciAqc3RhcnQsICplbmQ7CisgICAgaWYgKG51bSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgb3V0cHV0IGFycmF5IChudW0gPT0gTlVMTCkiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvL2NoZWNrIGlmIHN0cmluZyBzdGFydHMgYW5kIGVuZHMgd2l0aCBwYXJhbnRoZXNlcworICAgIGlmKHN0clswXSAhPSAnKCcgfHwgc3RyW3N0cmxlbihzdHIpLTFdICE9ICcpJykgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGZvcm1hdCBvZiBzdHJpbmcgJXMsIHZhbGlkIGZvcm1hdCBpcyAobjEsIG4yLCBuMywgbjQgLi4uKSIsCisgICAgICAgICAgICAgICBzdHIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGFydCA9IChjaGFyKikgc3RyOworICAgIHN0YXJ0Kys7CisgICAgZm9yKGludCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgICoobnVtK2kpID0gKGludCkgc3RydG9sKHN0YXJ0LCAmZW5kLCAxMCk7CisgICAgICAgIGlmKCplbmQgIT0gZGVsaW0gJiYgaSA8IE4tMSkgeworICAgICAgICAgICAgTE9HRSgiQ2Fubm90IGZpbmQgZGVsaW1ldGVyICclYycgaW4gc3RyaW5nIFwiJXNcIi4gZW5kID0gJWMiLAorICAgICAgICAgICAgICAgICAgIGRlbGltLCBzdHIsICplbmQpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN0YXJ0ID0gZW5kKzE7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwYXJzZUNhbWVyYUFyZWFTdHJpbmcKKyAqCisgKiBERVNDUklQVElPTjogaGVscGVyIGZ1bmN0aW9uIHRvIHBhcnNlIGEgc3RyaW5nIG9mIGNhbWVyYSBhcmVhcyBsaWtlCisgKiAgICAgICAgICAgICAgIigxLCAyLCAzLCA0LCA1KSwoMSwgMiwgMywgNCwgNSksLi4uIgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3RyICAgICAgICAgICAgIDogc3RyaW5nIHRvIGJlIHBhcnNlZAorICogICBAbWF4X251bV9hcmVhcyAgIDogbWF4IG51bWJlciBvZiBhcmVhcworICogICBAcEFyZWFzICAgICAgICAgIDogcHRyIHRvIHN0cnVjdCB0byBzdG9yZSBhcmVhcworICogICBAbnVtX2FyZWFzX2ZvdW5kIDogbnVtYmVyIG9mIGFyZWFzIGZvdW5kCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6cGFyc2VDYW1lcmFBcmVhU3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X251bV9hcmVhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fYXJlYV90ICpwQXJlYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBudW1fYXJlYXNfZm91bmQpCit7CisgICAgY2hhciBhcmVhX3N0clszMl07CisgICAgY29uc3QgY2hhciAqc3RhcnQsICplbmQsICpwOworICAgIHN0YXJ0ID0gc3RyOyBlbmQgPSBOVUxMOworICAgIGludCB2YWx1ZXNbNV0sIGluZGV4PTA7CisgICAgbnVtX2FyZWFzX2ZvdW5kID0gMDsKKworICAgIG1lbXNldCh2YWx1ZXMsIDAsIHNpemVvZih2YWx1ZXMpKTsKKyAgICB3aGlsZShzdGFydCAhPSBOVUxMKSB7CisgICAgICAgaWYoKnN0YXJ0ICE9ICcoJykgeworICAgICAgICAgICAgTE9HRSgiZXJyb3I6IElsbCBmb3JtYXR0ZWQgYXJlYSBzdHJpbmc6ICVzIiwgc3RyKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgfQorICAgICAgIGVuZCA9IHN0cmNocihzdGFydCwgJyknKTsKKyAgICAgICBpZihlbmQgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiZXJyb3I6IElsbCBmb3JtYXR0ZWQgYXJlYSBzdHJpbmc6ICVzIiwgc3RyKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgfQorICAgICAgIGludCBpOworICAgICAgIGZvciAoaT0wLHA9c3RhcnQ7IHA8PWVuZDsgcCsrLCBpKyspIHsKKyAgICAgICAgICAgYXJlYV9zdHJbaV0gPSAqcDsKKyAgICAgICB9CisgICAgICAgYXJlYV9zdHJbaV0gPSAnXDAnOworICAgICAgIGlmKHBhcnNlTkRpbVZlY3RvcihhcmVhX3N0ciwgdmFsdWVzLCA1KSA8IDApeworICAgICAgICAgICAgTE9HRSgiZXJyb3I6IEZhaWxlZCB0byBwYXJzZSB0aGUgYXJlYSBzdHJpbmc6ICVzIiwgYXJlYV9zdHIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICB9CisgICAgICAgLy8gbm8gbW9yZSBhcmVhcyB0aGFuIG1heF9udW1fYXJlYXMgYXJlIGFjY2VwdGVkLgorICAgICAgIGlmKGluZGV4ID49IG1heF9udW1fYXJlYXMpIHsKKyAgICAgICAgICAgIExPR0UoImVycm9yOiB0b28gbWFueSBhcmVhcyBzcGVjaWZpZWQgJXMiLCBzdHIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICB9CisgICAgICAgcEFyZWFzW2luZGV4XS5yZWN0LmxlZnQgPSB2YWx1ZXNbMF07CisgICAgICAgcEFyZWFzW2luZGV4XS5yZWN0LnRvcCA9IHZhbHVlc1sxXTsKKyAgICAgICBwQXJlYXNbaW5kZXhdLnJlY3Qud2lkdGggPSB2YWx1ZXNbMl0gLSB2YWx1ZXNbMF07CisgICAgICAgcEFyZWFzW2luZGV4XS5yZWN0LmhlaWdodCA9IHZhbHVlc1szXSAtIHZhbHVlc1sxXTsKKyAgICAgICBwQXJlYXNbaW5kZXhdLndlaWdodCA9IHZhbHVlc1s0XTsKKworICAgICAgIGluZGV4Kys7CisgICAgICAgc3RhcnQgPSBzdHJjaHIoZW5kLCAnKCcpOyAvLyBzZXJhY2ggZm9yIG5leHQgJygnCisgICAgfQorICAgIG51bV9hcmVhc19mb3VuZCA9IGluZGV4OworICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHZhbGlkYXRlQ2FtZXJhQXJlYXMKKyAqCisgKiBERVNDUklQVElPTjogaGVscGVyIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIGNhbWVyYSBhcmVhcyB3aXRoaW4gKC0xMDAwLCAxMDAwKQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAYXJlYXMgICAgIDogcHRyIHRvIGFycmF5IG9mIGFyZWFzCisgKiAgIEBudW1fYXJlYXMgOiBudW1iZXIgb2YgYXJlYXMKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZSAtLSAgYXJlYSBpcyBpbiB2YWxpZCByYW5nZQorICogICAgICAgICAgICAgIGZhbHNlIC0tIG5vdCB2YWxpZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjp2YWxpZGF0ZUNhbWVyYUFyZWFzKGNhbV9hcmVhX3QgKmFyZWFzLCBpbnQgbnVtX2FyZWFzKQoreworICAgIC8vIHNwZWNpYWwgY2FzZTogZGVmYXVsdCBhcmVhCisgICAgaWYgKG51bV9hcmVhcyA9PSAxICYmCisgICAgICAgIGFyZWFzWzBdLnJlY3QubGVmdCA9PSAwICYmCisgICAgICAgIGFyZWFzWzBdLnJlY3QudG9wID09IDAgJiYKKyAgICAgICAgYXJlYXNbMF0ucmVjdC53aWR0aCA9PSAwICYmCisgICAgICAgIGFyZWFzWzBdLnJlY3QuaGVpZ2h0ID09IDAgJiYKKyAgICAgICAgYXJlYXNbMF0ud2VpZ2h0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgZm9yKGludCBpID0gMDsgaSA8IG51bV9hcmVhczsgaSsrKSB7CisgICAgICAgIC8vIGxlZnQgc2hvdWxkIGJlID49IC0xMDAwCisgICAgICAgIGlmKGFyZWFzW2ldLnJlY3QubGVmdCA8IC0xMDAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB0b3AgIHNob3VsZCBiZSA+PSAtMTAwMAorICAgICAgICBpZihhcmVhc1tpXS5yZWN0LnRvcCA8IC0xMDAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB3aWR0aCBvciBoZWlnaHQgc2hvdWxkIGJlID4gMAorICAgICAgICBpZiAoYXJlYXNbaV0ucmVjdC53aWR0aCA8PSAwIHx8IGFyZWFzW2ldLnJlY3QuaGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJpZ2h0ICBzaG91bGQgYmUgPD0gMTAwMAorICAgICAgICBpZihhcmVhc1tpXS5yZWN0LmxlZnQgKyBhcmVhc1tpXS5yZWN0LndpZHRoID4gMTAwMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gYm90dG9tIHNob3VsZCBiZSA8PSAxMDAwCisgICAgICAgIGlmKGFyZWFzW2ldLnJlY3QudG9wICsgYXJlYXNbaV0ucmVjdC5oZWlnaHQgPiAxMDAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZWlnaHQgc2hvdWxkIGJlIHdpdGhpbiAoMSwgMTAwMCkKKyAgICAgICAgaWYgKGFyZWFzW2ldLndlaWdodCA8IDEgfHwgYXJlYXNbaV0ud2VpZ2h0ID4gMTAwMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzWVVWRnJhbWVJbmZvTmVlZGVkCisgKgorICogREVTQ1JJUFRJT046IEluIEFFLUJyYWNrZXQgbW9kZSwgd2UgbmVlZCBzZXQgeXV2IGJ1ZmZlciBpbmZvcm1hdGlvbiBmb3IgdXAtbGF5ZXIKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlOiBuZWVkZWQKKyAqICAgICAgICAgICAgICBmYWxzZTogbm8gbmVlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjppc1lVVkZyYW1lSW5mb05lZWRlZCgpCit7CisgICAgLy9JbiBBRS1CcmFja2V0IG1vZGUsIHdlIG5lZWQgc2V0IHJhdyBidWZmZXIgaW5mb3JtYXRpb24gZm9yIHVwLWxheWVyCisgICAgaWYoIWlzTlYyMVBpY3R1cmVGb3JtYXQoKSAmJiAhaXNOVjE2UGljdHVyZUZvcm1hdCgpKXsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBjaGFyICphZWNCcmFja2V0U3RyID0gIGdldChLRVlfUUNfQUVfQlJBQ0tFVF9IRFIpOworCisgICAgaW50IHZhbHVlID0gbG9va3VwQXR0cihCUkFDS0VUSU5HX01PREVTX01BUCwgUEFSQU1fTUFQX1NJWkUoQlJBQ0tFVElOR19NT0RFU19NQVApLAorICAgICAgICAgICAgYWVjQnJhY2tldFN0cik7CisgICAgTE9HSCgiYWVjQnJhY2tldFN0cj0lcywgdmFsdWU9JWQuIiwgYWVjQnJhY2tldFN0ciwgdmFsdWUpOworICAgIHJldHVybiAodmFsdWUgPT0gQ0FNX0VYUF9CUkFDS0VUSU5HX09OKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRGcmFtZUZtdFN0cmluZworICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgc3RyaW5nIG5hbWUgb2YgZnJhbWUgZm9ybWF0CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmcmFtZSAgIDogZnJhbWUgZm9ybWF0CisgKgorICogUkVUVVJOICAgICA6IHN0cmluZyBuYW1lIG9mIGZyYW1lIGZvcm1hdAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjb25zdCBjaGFyICpRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0RnJhbWVGbXRTdHJpbmcoY2FtX2Zvcm1hdF90IGZtdCkKK3sKKyAgICByZXR1cm4gbG9va3VwTmFtZUJ5VmFsdWUoUElDVFVSRV9UWVBFU19NQVAsIFBBUkFNX01BUF9TSVpFKFBJQ1RVUkVfVFlQRVNfTUFQKSwgZm10KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXREY3JmCisgKgorICogREVTQ1JJUFRJT046IEVuYWJsZS9EaXNhYmxlIERDUkYgKGR1YWwtY2FtZXJhLXJhbmdlLWZpbmRpbmcpCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0RGNyZigpCit7CisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisKKyAgICAvLyBTZXQgRENSRiB0byBvZmYgYnkgZGVmYXVsdCAoYXNzdW1pbmcgc2luZ2xlLWNhbWVyYSBtb2RlKQorICAgIG1fYkRjcmZFbmFibGVkID0gMDsKKworICAgIC8vIEluIGR1YWwtY2FtIG1vZGUsIGdldCBzeXNwcm9wIGFuZCBzZXQgaXQgdG8gb24gYnkgZGVmYXVsdAorICAgIGlmKG1fcmVsQ2FtU3luY0luZm8uc3luY19jb250cm9sID09IENBTV9TWU5DX1JFTEFURURfU0VOU09SU19PTikgeworICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmRjcmYuZW5hYmxlIiwgcHJvcCwgIjEiKTsKKyAgICAgICAgbV9iRGNyZkVuYWJsZWQgPSBhdG9pKHByb3ApOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRSZWxhdGVkQ2FtU3luY0luZm8KKyAqCisgKiBERVNDUklQVElPTjogc2V0IHRoZSByZWxhdGVkIGNhbSBpbmZvIHBhcmFtZXRlcnMKKyAqIHRoZSByZWxhdGVkIGNhbSBpbmZvIGlzIGNhY2hlZCBpbnRvIHBhcmFtcyB0byBtYWtlIHNvbWUgZGVjaXNpb25zIGJlZm9yZWhhbmQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZm8gIDogcHRyIHRvIHJlbGF0ZWQgY2FtIGluZm8gcGFyYW1ldGVycworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFJlbGF0ZWRDYW1TeW5jSW5mbygKKyAgICAgICAgY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCogaW5mbykKK3sKKyAgICBpZihpbmZvICE9IE5VTEwpeworICAgICAgICBtZW1jcHkoJm1fcmVsQ2FtU3luY0luZm8sIGluZm8sCisgICAgICAgICAgICAgICAgc2l6ZW9mKGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QpKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoImluZm8gYnVmZmVyIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFJlbGF0ZWRDYW1TeW5jSW5mbworICoKKyAqIERFU0NSSVBUSU9OOnJldHVybnMgdGhlIHJlbGF0ZWQgY2FtIHN5bmMgaW5mbyBmb3IgdGhpcyBIV0kgaW5zdGFuY2UKKyAqCisgKiBQQVJBTUVURVJTIDpub25lCisgKgorICogUkVUVVJOICAgICA6IGNvbnN0IHBvaW50ZXIgdG8gY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjb25zdCBjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KgorICAgICAgICBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0UmVsYXRlZENhbVN5bmNJbmZvKHZvaWQpCit7CisgICAgcmV0dXJuICZtX3JlbENhbVN5bmNJbmZvOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEZyYW1lU3luY0VuYWJsZWQKKyAqCisgKiBERVNDUklQVElPTjogc2V0cyB3aGV0aGVyIGZyYW1lIHN5bmMgaXMgZW5hYmxlZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZW5hYmxlICA6IGZsYWcgd2hldGhlciB0byBlbmFibGUgb3IgZGlzYWJsZSBmcmFtZSBzeW5jCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0RnJhbWVTeW5jRW5hYmxlZChib29sIGVuYWJsZSkKK3sKKyAgICBtX2JGcmFtZVN5bmNFbmFibGVkID0gZW5hYmxlOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc0ZyYW1lU3luY0VuYWJsZWQKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJucyB3aGV0aGVyIGZyYW1lIHN5bmMgaXMgZW5hYmxlZAorICoKKyAqIFBBUkFNRVRFUlMgOm5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogYm9vbCBpbmRpY2F0aW5nIHdoZXRoZXIgZnJhbWUgc3luYyBpcyBlbmFibGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnM6OmlzRnJhbWVTeW5jRW5hYmxlZCh2b2lkKQoreworICAgIHJldHVybiBtX2JGcmFtZVN5bmNFbmFibGVkOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGJ1bmRsZVJlbGF0ZWRDYW1lcmFzCisgKgorICogREVTQ1JJUFRJT046IHNlbmQgdHJpZ2dlciBmb3IgYnVuZGxpbmcgcmVsYXRlZCBjYW1lcmEgc2Vzc2lvbnMgaW4gdGhlIHNlcnZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3luYyAgICAgICAgOmluZGljYXRlcyB3aGV0aGVyIHN5bmNpbmcgaXMgT24gb3IgT2ZmCisgKiAgIEBzZXNzaW9uaWQgIDpzZXNzaW9uIGlkIGZvciBvdGhlciBjYW1lcmEgc2Vzc2lvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmJ1bmRsZVJlbGF0ZWRDYW1lcmFzKGJvb2wgc3luYywKKyAgICAgICAgdWludDMyX3Qgc2Vzc2lvbmlkKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIGlmIChOVUxMID09IG1fcENhbU9wc1RibCkgeworICAgICAgICBMT0dFKCJPcHMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIExPR0QoIlNlbmRpbmcgQnVuZGxpbmcgY21kIHN5bmMgJWQsIFNlc3Npb25JZCAlZCAiLAorICAgICAgICAgICAgc3luYywgc2Vzc2lvbmlkKTsKKworICAgIGlmKG1fcFJlbENhbVN5bmNCdWYpIHsKKyAgICAgICAgaWYoc3luYykgeworICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+c3luY19jb250cm9sID0gQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09OOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+c3luY19jb250cm9sID0gQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09GRjsKKyAgICAgICAgfQorICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT5tb2RlID0gbV9yZWxDYW1TeW5jSW5mby5tb2RlOworICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT50eXBlID0gbV9yZWxDYW1TeW5jSW5mby50eXBlOworICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT5yZWxhdGVkX3NlbnNvcl9zZXNzaW9uX2lkID0gc2Vzc2lvbmlkOworICAgICAgICByYyA9IG1fcENhbU9wc1RibC0+b3BzLT5zeW5jX3JlbGF0ZWRfc2Vuc29ycygKKyAgICAgICAgICAgICAgICBtX3BDYW1PcHNUYmwtPmNhbWVyYV9oYW5kbGUsIG1fcFJlbENhbVN5bmNCdWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIlJlbGF0ZWQgQ2FtIFN5bmNCdWZmZXIgbm90IGFsbG9jYXRlZCIsIHJjKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFJlbGF0ZWRDYW1DYWxpYnJhdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOiBmZXRjaCB0aGUgcmVsYXRlZCBjYW1lcmEgc3Vic3lzdGVtIGNhbGlicmF0aW9uIGRhdGEKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbGliICA6IGNhbGlicmF0aW9uIGRhdGEgZmV0Y2hlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldFJlbGF0ZWRDYW1DYWxpYnJhdGlvbigKKyAgICAgICAgY2FtX3JlbGF0ZWRfc3lzdGVtX2NhbGlicmF0aW9uX2RhdGFfdCogY2FsaWIpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgaWYoIWNhbGliKSB7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisKKyAgICBpZihpbml0QmF0Y2hVcGRhdGUobV9wUGFyYW1CdWYpIDwgMCApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZ3JvdXAgdXBkYXRlIHRhYmxlIik7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisKKyAgICBBRERfR0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9SRUxBVEVEX1NFTlNPUlNfQ0FMSUJSQVRJT04pOworCisgICAgcmMgPSBjb21taXRHZXRCYXRjaCgpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gZ2V0IHJlbGF0ZWQgY2FtIGNhbGlicmF0aW9uIGluZm8iKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIFJFQURfUEFSQU1fRU5UUlkobV9wUGFyYW1CdWYsCisgICAgICAgICAgICBDQU1fSU5URl9QQVJNX1JFTEFURURfU0VOU09SU19DQUxJQlJBVElPTiwgKmNhbGliKTsKKworICAgIExPR0QoIkNBTElCIHZlcnNpb24gJWQgIiwgY2FsaWItPmNhbGlicmF0aW9uX2Zvcm1hdF92ZXJzaW9uKTsKKyAgICBMT0dEKCJDQUxJQiBub3JtYWxpemVkX2ZvY2FsX2xlbmd0aCAlZiAiLAorICAgICAgICAgICAgY2FsaWItPm1haW5fY2FtX3NwZWNpZmljX2NhbGlicmF0aW9uLm5vcm1hbGl6ZWRfZm9jYWxfbGVuZ3RoKTsKKyAgICBMT0dEKCJDQUxJQiBuYXRpdmVfc2Vuc29yX3Jlc29sdXRpb25fd2lkdGggJWQgIiwKKyAgICAgICAgICAgIGNhbGliLT5tYWluX2NhbV9zcGVjaWZpY19jYWxpYnJhdGlvbi5uYXRpdmVfc2Vuc29yX3Jlc29sdXRpb25fd2lkdGgpOworICAgIExPR0QoIkNBTElCIG5hdGl2ZV9zZW5zb3JfcmVzb2x1dGlvbl9oZWlnaHQgJWQgIiwKKyAgICAgICAgICAgIGNhbGliLT5tYWluX2NhbV9zcGVjaWZpY19jYWxpYnJhdGlvbi5uYXRpdmVfc2Vuc29yX3Jlc29sdXRpb25faGVpZ2h0KTsKKyAgICBMT0dEKCJDQUxJQiBzZW5zb3JfcmVzb2x1dGlvbl93aWR0aCAlZCAiLAorICAgICAgICAgICAgY2FsaWItPm1haW5fY2FtX3NwZWNpZmljX2NhbGlicmF0aW9uLmNhbGlicmF0aW9uX3NlbnNvcl9yZXNvbHV0aW9uX3dpZHRoKTsKKyAgICBMT0dEKCJDQUxJQiBzZW5zb3JfcmVzb2x1dGlvbl9oZWlnaHQgJWQgIiwKKyAgICAgICAgICAgIGNhbGliLT5tYWluX2NhbV9zcGVjaWZpY19jYWxpYnJhdGlvbi5jYWxpYnJhdGlvbl9zZW5zb3JfcmVzb2x1dGlvbl9oZWlnaHQpOworICAgIExPR0QoIkNBTElCIGZvY2FsX2xlbmd0aF9yYXRpbyAlZiAiLAorICAgICAgICAgICAgY2FsaWItPm1haW5fY2FtX3NwZWNpZmljX2NhbGlicmF0aW9uLmZvY2FsX2xlbmd0aF9yYXRpbyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW5pdEJhdGNoVXBkYXRlCisgKgorICogREVTQ1JJUFRJT046IGluaXQgY2FtZXJhIHBhcmFtZXRlcnMgYnVmIGVudHJpZXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBfdGFibGUgOiBwdHIgdG8gcGFyYW1ldGVyIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmluaXRCYXRjaFVwZGF0ZShwYXJtX2J1ZmZlcl90ICpwX3RhYmxlKQoreworICAgIG1fdGVtcE1hcC5jbGVhcigpOworICAgIGNsZWFyX21ldGFkYXRhX2J1ZmZlcihwX3RhYmxlKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY29tbWl0U2V0QmF0Y2gKKyAqCisgKiBERVNDUklQVElPTjogY29tbWl0IGFsbCBzZXQgcGFyYW1ldGVycyBpbiB0aGUgYmF0Y2ggd29yayB0byBiYWNrZW5kCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpjb21taXRTZXRCYXRjaCgpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGludDMyX3QgaSA9IDA7CisKKyAgICBpZiAoTlVMTCA9PSBtX3BQYXJhbUJ1ZikgeworICAgICAgICBMT0dFKCJQYXJhbXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIC8qIExvb3AgdG8gY2hlY2sgaWYgYXRsZWFzdCBvbmUgZW50cnkgaXMgdmFsaWQgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBDQU1fSU5URl9QQVJNX01BWDsgaSsrKXsKKyAgICAgICAgaWYobV9wUGFyYW1CdWYtPmlzX3ZhbGlkW2ldKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gbV9wQ2FtT3BzVGJsKSB7CisgICAgICAgIExPR0UoIk9wcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKGkgPCBDQU1fSU5URl9QQVJNX01BWCkgeworICAgICAgICByYyA9IG1fcENhbU9wc1RibC0+b3BzLT5zZXRfcGFybXMobV9wQ2FtT3BzVGJsLT5jYW1lcmFfaGFuZGxlLCBtX3BQYXJhbUJ1Zik7CisgICAgfQorICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAvLyBjb21taXQgY2hhbmdlIGZyb20gdGVtcCBzdG9yYWdlIGludG8gcGFyYW0gbWFwCisgICAgICAgIHJjID0gY29tbWl0UGFyYW1DaGFuZ2VzKCk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjb21taXRHZXRCYXRjaAorICoKKyAqIERFU0NSSVBUSU9OOiBjb21taXQgYWxsIGdldCBwYXJhbWV0ZXJzIGluIHRoZSBiYXRjaCB3b3JrIHRvIGJhY2tlbmQKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmNvbW1pdEdldEJhdGNoKCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgaW50MzJfdCBpID0gMDsKKworICAgIGlmIChOVUxMID09IG1fcFBhcmFtQnVmKSB7CisgICAgICAgIExPR0UoIlBhcmFtcyBub3QgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgLyogTG9vcCB0byBjaGVjayBpZiBhdGxlYXN0IG9uZSBlbnRyeSBpcyB2YWxpZCAqLworICAgIGZvcihpID0gMDsgaSA8IENBTV9JTlRGX1BBUk1fTUFYOyBpKyspeworICAgICAgICBpZihtX3BQYXJhbUJ1Zi0+aXNfdmFsaWRbaV0pCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBtX3BDYW1PcHNUYmwpIHsKKyAgICAgICAgTE9HRSgiT3BzIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAoaSA8IENBTV9JTlRGX1BBUk1fTUFYKSB7CisgICAgICAgIHJldHVybiBtX3BDYW1PcHNUYmwtPm9wcy0+Z2V0X3Bhcm1zKG1fcENhbU9wc1RibC0+Y2FtZXJhX2hhbmRsZSwgbV9wUGFyYW1CdWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVwZGF0ZVBhcmFtRW50cnkKKyAqCisgKiBERVNDUklQVElPTjogdXBkYXRlIGEgcGFyYW1ldGVyIGVudHJ5IGluIHRoZSBsb2NhbCB0ZW1wIG1hcCBvYmoKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGtleSAgICAgOiBrZXkgb2YgdGhlIGVudHJ5CisgKiAgIEB2YWx1ZSAgIDogdmFsdWUgb2YgdGhlIGVudHJ5CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6dXBkYXRlUGFyYW1FbnRyeShjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIG1fdGVtcE1hcC5yZXBsYWNlVmFsdWVGb3IoU3RyaW5nOChrZXkpLCBTdHJpbmc4KHZhbHVlKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbW1pdFBhcmFtQ2hhbmdlcworICoKKyAqIERFU0NSSVBUSU9OOiBjb21taXQgYWxsIGNoYW5nZXMgaW4gbG9jYWwgdGVtcCBtYXAgb2JqIGludG8gcGFyYW1ldGVyIG9iagorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Y29tbWl0UGFyYW1DaGFuZ2VzKCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IG1fdGVtcE1hcC5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgU3RyaW5nOCBrLCB2OworICAgICAgICBrID0gbV90ZW1wTWFwLmtleUF0KGkpOworICAgICAgICB2ID0gbV90ZW1wTWFwLnZhbHVlQXQoaSk7CisgICAgICAgIHNldChrLCB2KTsKKyAgICB9CisgICAgbV90ZW1wTWFwLmNsZWFyKCk7CisKKyAgICAvLyB1cGRhdGUgbG9jYWwgY2hhbmdlcworICAgIG1fYlJlY29yZGluZ0hpbnQgPSBtX2JSZWNvcmRpbmdIaW50X25ldzsKKyAgICBtX2Jac2xNb2RlID0gbV9iWnNsTW9kZV9uZXc7CisKKyAgICAvKiBBZnRlciBhcHBseWluZyBzY2VuZSBtb2RlIGF1dG8sCisgICAgICBDYW1lcmEgZWZmZWN0cyBuZWVkIHRvIGJlIHJlYXBwbGllZCAqLworICAgIGlmICggbV9iU2NlbmVUcmFuc2l0aW9uQXV0byApIHsKKyAgICAgICAgbV9iVXBkYXRlRWZmZWN0cyA9IHRydWU7CisgICAgICAgIG1fYlNjZW5lVHJhbnNpdGlvbkF1dG8gPSBmYWxzZTsKKyAgICB9CisKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhUmVwcm9jU2NhbGVQYXJhbQorICoKKyAqIERFU0NSSVBUSU9OOiBjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhUmVwcm9jU2NhbGVQYXJhbQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFSZXByb2NTY2FsZVBhcmFtOjpRQ2FtZXJhUmVwcm9jU2NhbGVQYXJhbSgpCisgIDogbVNjYWxlRW5hYmxlZChmYWxzZSksCisgICAgbUlzVW5kZXJTY2FsaW5nKGZhbHNlKSwKKyAgICBtTmVlZFNjYWxlQ250KDApLAorICAgIG1TZW5zb3JTaXplVGJsQ250KDApLAorICAgIG1TZW5zb3JTaXplVGJsKE5VTEwpLAorICAgIG1Ub3RhbFNpemVUYmxDbnQoMCkKK3sKKyAgICBtUGljU2l6ZUZyb21BUEsud2lkdGggPSAwOworICAgIG1QaWNTaXplRnJvbUFQSy5oZWlnaHQgPSAwOworICAgIG1QaWNTaXplU2V0dGVkLndpZHRoID0gMDsKKyAgICBtUGljU2l6ZVNldHRlZC5oZWlnaHQgPSAwOworICAgIG1lbXNldChtTmVlZFNjYWxlZFNpemVUYmwsIDAsIHNpemVvZihtTmVlZFNjYWxlZFNpemVUYmwpKTsKKyAgICBtZW1zZXQobVRvdGFsU2l6ZVRibCwgMCwgc2l6ZW9mKG1Ub3RhbFNpemVUYmwpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+flFDYW1lcmFSZXByb2NTY2FsZVBhcmFtCisgKgorICogREVTQ1JJUFRJT046IGRlc3RydWN0b3Igb2YgUUNhbWVyYVJlcHJvY1NjYWxlUGFyYW0KKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhUmVwcm9jU2NhbGVQYXJhbTo6flFDYW1lcmFSZXByb2NTY2FsZVBhcmFtKCkKK3sKKyAgICAvL2RvIG5vdGhpbmcgbm93LgorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFNjYWxlZFNpemVUYmwKKyAqCisgKiBERVNDUklQVElPTjogcmUtc2V0IHBpY3R1cmUgc2l6ZSB0YWJsZSB3aXRoIGRpbWVuc2lvbnMgdGhhdCBuZWVkIHNjYWxpbmcgaWYgUmVwcm9jIFNjYWxlIGlzIGVuYWJsZWQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHNjYWxlX2NudCAgIDogY291bnQgb2YgcGljdHVyZSBzaXplcyB0aGF0IHdhbnQgc2NhbGUKKyAqICAgQHNjYWxlX3RibCAgICA6IHBpY3R1cmUgc2l6ZSB0YWJsZSB0aGF0IHdhbnQgc2NhbGUKKyAqICAgQG9yZ19jbnQgICAgIDogc2Vuc29yIHN1cHBvcnRlZCBwaWN0dXJlIHNpemUgY291bnQKKyAqICAgQG9yZ190YmwgICAgICA6IHNlbnNvciBzdXBwb3J0ZWQgcGljdHVyZSBzaXplIHRhYmxlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYVJlcHJvY1NjYWxlUGFyYW06OnNldFNjYWxlU2l6ZVRibChzaXplX3Qgc2NhbGVfY250LAorICAgICAgICBjYW1fZGltZW5zaW9uX3QgKnNjYWxlX3RibCwgc2l6ZV90IG9yZ19jbnQsIGNhbV9kaW1lbnNpb25fdCAqb3JnX3RibCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgc2l6ZV90IGk7CisgICAgbU5lZWRTY2FsZUNudCA9IDA7CisKKyAgICBpZighbVNjYWxlRW5hYmxlZCB8fCBzY2FsZV9jbnQgPD0wIHx8IHNjYWxlX3RibCA9PSBOVUxMIHx8IG9yZ19jbnQgPD0wIHx8IG9yZ190YmwgPT0gTlVMTCl7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7ICAgIC8vIERvIG5vdCBuZWVkIHNjYWxlLCBzbyBhbHNvIG5lZWQgbm90IHJlc2V0IHBpY3R1cmUgc2l6ZSB0YWJsZQorICAgIH0KKworICAgIG1TZW5zb3JTaXplVGJsQ250ID0gb3JnX2NudDsKKyAgICBtU2Vuc29yU2l6ZVRibCA9IG9yZ190Ymw7CisgICAgbU5lZWRTY2FsZUNudCA9IGNoZWNrU2NhbGVTaXplVGFibGUoc2NhbGVfY250LCBzY2FsZV90YmwsIG9yZ19jbnQsIG9yZ190YmwpOworICAgIGlmKG1OZWVkU2NhbGVDbnQgPD0gMCl7CisgICAgICAgIExPR0UoImRvIG5vdCBoYXZlIHBpY3R1cmUgc2l6ZXMgbmVlZCBzY2FsaW5nLiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmKG1OZWVkU2NhbGVDbnQgKyBvcmdfY250ID4gTUFYX1NJWkVTX0NOVCl7CisgICAgICAgIExPR0UoInBpY3R1cmUgc2l6ZSBsaXN0IGV4Y2VlZCB0aGUgbWF4IGNvdW50LiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vZ2V0IHRoZSB0b3RhbCBwaWN0dXJlIHNpemUgdGFibGUKKyAgICBtVG90YWxTaXplVGJsQ250ID0gbU5lZWRTY2FsZUNudCArIG9yZ19jbnQ7CisKKyAgICBpZiAobU5lZWRTY2FsZUNudCA+IE1BWF9TQ0FMRV9TSVpFU19DTlQpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IhISBtTmVlZFNjYWxlQ250ICglZCkgaXMgbW9yZSB0aGFuIE1BWF9TQ0FMRV9TSVpFU19DTlQiLAorICAgICAgICAgICAgICAgICBtTmVlZFNjYWxlQ250KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBtTmVlZFNjYWxlQ250OyBpKyspeworICAgICAgICBtVG90YWxTaXplVGJsW2ldLndpZHRoID0gbU5lZWRTY2FsZWRTaXplVGJsW2ldLndpZHRoOworICAgICAgICBtVG90YWxTaXplVGJsW2ldLmhlaWdodCA9IG1OZWVkU2NhbGVkU2l6ZVRibFtpXS5oZWlnaHQ7CisgICAgICAgIExPR0goInNjYWxlIHBpY3R1cmUgc2l6ZTogaSA9JWQsIHdpZHRoPSVkLCBoZWlnaHQ9JWQuIiwKKyAgICAgICAgICAgIGksIG1Ub3RhbFNpemVUYmxbaV0ud2lkdGgsIG1Ub3RhbFNpemVUYmxbaV0uaGVpZ2h0KTsKKyAgICB9CisgICAgZm9yKDsgaSA8IG1Ub3RhbFNpemVUYmxDbnQ7IGkrKyl7CisgICAgICAgIG1Ub3RhbFNpemVUYmxbaV0ud2lkdGggPSBvcmdfdGJsW2ktbU5lZWRTY2FsZUNudF0ud2lkdGg7CisgICAgICAgIG1Ub3RhbFNpemVUYmxbaV0uaGVpZ2h0ID0gb3JnX3RibFtpLW1OZWVkU2NhbGVDbnRdLmhlaWdodDsKKyAgICAgICAgTE9HSCgic2Vuc29yIHN1cHBvcnR0ZWQgcGljdHVyZSBzaXplOiBpID0lZCwgd2lkdGg9JWQsIGhlaWdodD0lZC4iLAorICAgICAgICAgICAgaSwgbVRvdGFsU2l6ZVRibFtpXS53aWR0aCwgbVRvdGFsU2l6ZVRibFtpXS5oZWlnaHQpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0U2NhbGVkU2l6ZVRibENudAorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgcGljdHVyZSBzaXplIGNudCB0aGF0IG5lZWQgc2NhbGUKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiB1aW50OF90IHR5cGUgb2YgcGljdHVyZSBzaXplIGNvdW50CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3NpemVfdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYVJlcHJvY1NjYWxlUGFyYW06OmdldFNjYWxlU2l6ZVRibENudCgpCit7CisgICAgcmV0dXJuIG1OZWVkU2NhbGVDbnQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0U2NhbGVkU2l6ZVRibAorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgcGljdHVyZSBzaXplIHRhYmxlIHRoYXQgbmVlZCBzY2FsZQorICoKKyAqIFBBUkFNRVRFUlMgOiAgbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBjYW1fZGltZW5zaW9uX3QgbGlzdCBvZiBwaWN0dXJlIHNpemUgdGFibGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY2FtX2RpbWVuc2lvbl90ICpRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYVJlcHJvY1NjYWxlUGFyYW06OmdldFNjYWxlZFNpemVUYmwoKQoreworICAgIGlmKCFtU2NhbGVFbmFibGVkKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBtTmVlZFNjYWxlZFNpemVUYmw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U2NhbGVFbmFibGUKKyAqCisgKiBERVNDUklQVElPTjogZW5hYmxlIG9yIGRpc2FibGUgUmVwcm9jIFNjYWxlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBlbmFibGVkIDogZW5hYmxlOiAxOyBkaXNhYmxlIDAKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhUmVwcm9jU2NhbGVQYXJhbTo6c2V0U2NhbGVFbmFibGUoYm9vbCBlbmFibGVkKQoreworICAgIG1TY2FsZUVuYWJsZWQgPSBlbmFibGVkOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzU2NhbGVFbmFibGVkCisgKgorICogREVTQ1JJUFRJT046IGNoZWNrIGlmIFJlcHJvYyBTY2FsZSBpcyBlbmFibGVkCisgKgorICogUEFSQU1FVEVSUyA6ICBub25lCisgKgorICogUkVUVVJOICAgICA6IGJvb2wgdHlwZSBvZiBzdGF0dXMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYVJlcHJvY1NjYWxlUGFyYW06OmlzU2NhbGVFbmFibGVkKCkKK3sKKyAgICByZXR1cm4gbVNjYWxlRW5hYmxlZDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc1NjYWxlUGljU2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiBjaGVjayBpZiBjdXJyZW50IHBpY3R1cmUgc2l6ZSBpcyBmcm9tIFNjYWxlIFRhYmxlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB3aWR0aCAgICAgOiBjdXJyZW50IHBpY3R1cmUgd2lkdGgKKyAqICAgQGhlaWdodCAgICA6IGN1cnJlbnQgcGljdHVyZSBoZWlnaHQKKyAqCisgKiBSRVRVUk4gICAgIDogYm9vbCB0eXBlIG9mIHN0YXR1cworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhUmVwcm9jU2NhbGVQYXJhbTo6aXNTY2FsZVBpY1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIC8vQ2hlY2sgaWYgdGhlIHBpY3R1cmUgc2l6ZSBpcyBpbiBzY2FsZSB0YWJsZQorICAgIGlmKG1OZWVkU2NhbGVDbnQgPD0gMCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTmVlZFNjYWxlQ250OyBpKyspIHsKKyAgICAgICAgaWYgKChtTmVlZFNjYWxlZFNpemVUYmxbaV0ud2lkdGggPT0gd2lkdGgpICYmIChtTmVlZFNjYWxlZFNpemVUYmxbaV0uaGVpZ2h0ID09IGhlaWdodCkpIHsKKyAgICAgICAgICAgIC8vZm91bmQgbWF0Y2gKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HRSgiTm90IGluIHNjYWxlIHBpY3R1cmUgc2l6ZSB0YWJsZS4iKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNWYWxpZGF0ZVBpY1NpemUKKyAqCisgKiBERVNDUklQVElPTjogY2hlY2sgaWYgY3VycmVudCBwaWN0dXJlIHNpemUgaXMgdmFsaWRhdGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHdpZHRoICAgICA6IGN1cnJlbnQgcGljdHVyZSB3aWR0aAorICogICBAaGVpZ2h0ICAgIDogY3VycmVudCBwaWN0dXJlIGhlaWdodAorICoKKyAqIFJFVFVSTiAgICAgOiBib29sIHR5cGUgb2Ygc3RhdHVzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFSZXByb2NTY2FsZVBhcmFtOjppc1ZhbGlkYXRlUGljU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgc2l6ZV90IGkgPSAwOworCisgICAgZm9yKGkgPSAwOyBpIDwgbVNlbnNvclNpemVUYmxDbnQ7IGkrKyl7CisgICAgICAgIGlmKG1TZW5zb3JTaXplVGJsW2ldLndpZHRoID09IHdpZHRoCisgICAgICAgICAgICAmJiBtU2Vuc29yU2l6ZVRibFtpXS5oZWlnaHQ9PSBoZWlnaHQpeworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoaSA9IDA7IGkgPCBtTmVlZFNjYWxlQ250OyBpKyspeworICAgICAgICBpZihtTmVlZFNjYWxlZFNpemVUYmxbaV0ud2lkdGggPT0gd2lkdGgKKyAgICAgICAgICAgICYmIG1OZWVkU2NhbGVkU2l6ZVRibFtpXS5oZWlnaHQ9PSBoZWlnaHQpeworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dFKCJJbnZhbGlkYXRlIGlucHV0IHBpY3R1cmUgc2l6ZS4iKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U2Vuc29yU3VwcG9ydGVkUGljU2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgc2Vuc29yIHN1cHBvcnRlZCBwaWN0dXJlIHNpemUuCisgKiAgICBGb3IgU25hcHNob3Qgc3RyZWFtIHNpemUgY29uZmlndXJhdGlvbiwgd2UgbmVlZCB1c2Ugc2Vuc29yIHN1cHBvcnRlZCBzaXplLgorICogICAgV2Ugd2lsbCB1c2UgQ1BQIHRvIGRvIFNjYWxpbmcgYmFzZWQgb24gb3V0cHV0IFNuYXBzaG90IHN0cmVhbS4KKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFSZXByb2NTY2FsZVBhcmFtOjpzZXRTZW5zb3JTdXBwb3J0ZWRQaWNTaXplKCkKK3sKKyAgICAvL3dpbGwgZmluZCBhIHN1aXRhYmxlIHBpY3R1cmUgc2l6ZSAoaGVyZSB3ZSBsZWF2ZSBhIHByb3NzaWJpbGl0eSB0byBhZGQgb3RoZXIgc2NhbGUgcmVxdWlyZW1lbnQpCisgICAgLy9DdXJyZW50bHkgd2Ugb25seSBmb2N1cyBvbiB1cHNjYWxpbmcsIGFuZCBjaGVja1NjYWxlU2l6ZVRhYmxlKCkgaGFzIGd1YXJhbnRlZWQgdGhlIGRpbWVuc2lvbiByYXRpby4KKworICAgIGlmKCFtSXNVbmRlclNjYWxpbmcgfHwgbVNlbnNvclNpemVUYmxDbnQgPD0gMCkKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vV2UganVzdCBnZXQgdGhlIG1heCBzZW5zb3Igc3VwcG9ydGVkIHNpemUgaGVyZS4KKyAgICBtUGljU2l6ZVNldHRlZC53aWR0aCA9IG1TZW5zb3JTaXplVGJsWzBdLndpZHRoOworICAgIG1QaWNTaXplU2V0dGVkLmhlaWdodCA9IG1TZW5zb3JTaXplVGJsWzBdLmhlaWdodDsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFZhbGlkYXRlUGljU2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgc2Vuc29yIHN1cHBvcnRlZCBzaXplIGFuZCBjaGFuZ2Ugc2NhbGUgc3RhdHVzLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAd2lkdGggICAgOiBpbnB1dCBwaWN0dXJlIHdpZHRoCisgKiAgIEBoZWlnaHQgICA6IGlucHV0IHBpY3R1cmUgaGVpZ2h0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYVJlcHJvY1NjYWxlUGFyYW06OnNldFZhbGlkYXRlUGljU2l6ZShpbnQgJndpZHRoLGludCAmaGVpZ2h0KQoreworICAgIGlmKCFtU2NhbGVFbmFibGVkKQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgbUlzVW5kZXJTY2FsaW5nID0gRkFMU0U7IC8vZGVmYXVsdDogbm90IHVuZGVyIHNjYWxlCisKKyAgICBpZihpc1NjYWxlUGljU2l6ZSh3aWR0aCwgaGVpZ2h0KSl7CisgICAgICAgIC8vIGlucHV0IHBpY3R1cmUgc2l6ZSBuZWVkIHNjYWxpbmcgb3BlcmF0aW9uLiBSZWNvcmQgc2l6ZSBmcm9tIEFQSyBhbmQgc2V0dGVkCisgICAgICAgIG1Jc1VuZGVyU2NhbGluZyA9IFRSVUU7CisgICAgICAgIG1QaWNTaXplRnJvbUFQSy53aWR0aCA9IHdpZHRoOworICAgICAgICBtUGljU2l6ZUZyb21BUEsuaGVpZ2h0ID0gaGVpZ2h0OworCisgICAgICAgIGlmKHNldFNlbnNvclN1cHBvcnRlZFBpY1NpemUoKSAhPSBOT19FUlJPUikKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAgICAgLy9yZS1zZXQgcGljdHVyZSBzaXplIHRvIHNlbnNvciBzdXBwb3J0ZWQgc2l6ZQorICAgICAgICB3aWR0aCA9IG1QaWNTaXplU2V0dGVkLndpZHRoOworICAgICAgICBoZWlnaHQgPSBtUGljU2l6ZVNldHRlZC5oZWlnaHQ7CisgICAgICAgIExPR0goIm1QaWNTaXplRnJvbUFQSy0gd2l0aD0lZCwgaGVpZ2h0PSVkLCBtUGljU2l6ZVNldHRlZC0gd2l0aCA9JWQsIGhlaWdodD0lZC4iLAorICAgICAgICAgICAgIG1QaWNTaXplRnJvbUFQSy53aWR0aCwgbVBpY1NpemVGcm9tQVBLLmhlaWdodCwgbVBpY1NpemVTZXR0ZWQud2lkdGgsIG1QaWNTaXplU2V0dGVkLmhlaWdodCk7CisgICAgfWVsc2V7CisgICAgICAgIG1Jc1VuZGVyU2NhbGluZyA9IEZBTFNFOworICAgICAgICAvL25vIHNjYWxlIGlzIG5lZWRlZCBmb3IgaW5wdXQgcGljdHVyZSBzaXplCisgICAgICAgIGlmKCFpc1ZhbGlkYXRlUGljU2l6ZSh3aWR0aCwgaGVpZ2h0KSl7CisgICAgICAgICAgICBMT0dFKCJpbnZhbGlkYXRlIGlucHV0IHBpY3R1cmUgc2l6ZS4iKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbVBpY1NpemVTZXR0ZWQud2lkdGggPSB3aWR0aDsKKyAgICAgICAgbVBpY1NpemVTZXR0ZWQuaGVpZ2h0ID0gaGVpZ2h0OworICAgIH0KKworICAgIExPR0goIlguIG1Jc1VuZGVyU2NhbGluZz0lZCwgd2lkdGg9JWQsIGhlaWdodD0lZC4iLCBtSXNVbmRlclNjYWxpbmcsIHdpZHRoLCBoZWlnaHQpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRQaWNTaXplRnJvbUFQSworICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgcGljdHVyZSBzaXplIHRoYXQgZ2V0IGZyb20gQVBLCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB3aWR0aCAgICAgOiBpbnB1dCB3aWR0aAorICogICBAaGVpZ2h0ICAgIDogaW5wdXQgaGVpZ2h0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6UUNhbWVyYVJlcHJvY1NjYWxlUGFyYW06OmdldFBpY1NpemVGcm9tQVBLKGludCAmd2lkdGgsIGludCAmaGVpZ2h0KQoreworICAgIGlmKCFtSXNVbmRlclNjYWxpbmcpCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisKKyAgICB3aWR0aCA9IG1QaWNTaXplRnJvbUFQSy53aWR0aDsKKyAgICBoZWlnaHQgPSBtUGljU2l6ZUZyb21BUEsuaGVpZ2h0OworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRQaWNTaXplU2V0dGVkCisgKgorICogREVTQ1JJUFRJT046IGdldCBwaWN0dXJlIHNpemUgdGhhdCBzZXR0ZWQgaW50byBtbS1jYW1lcmEKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHdpZHRoICAgICA6IGlucHV0IHdpZHRoCisgKiAgIEBoZWlnaHQgICAgOiBpbnB1dCBoZWlnaHQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhUmVwcm9jU2NhbGVQYXJhbTo6Z2V0UGljU2l6ZVNldHRlZChpbnQgJndpZHRoLCBpbnQgJmhlaWdodCkKK3sKKyAgICB3aWR0aCA9IG1QaWNTaXplU2V0dGVkLndpZHRoOworICAgIGhlaWdodCA9IG1QaWNTaXplU2V0dGVkLmhlaWdodDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNVbmRlclNjYWxpbmcKKyAqCisgKiBERVNDUklQVElPTjogY2hlY2sgaWYgd2UgYXJlIGluIFJlcHJvYyBTY2FsaW5nIHJlcXVpcm1lbnQKKyAqCisgKiBQQVJBTUVURVJTIDogIG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogYm9vbCB0eXBlIG9mIHN0YXR1cworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhUmVwcm9jU2NhbGVQYXJhbTo6aXNVbmRlclNjYWxpbmcoKQoreworICAgIHJldHVybiBtSXNVbmRlclNjYWxpbmc7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2hlY2tTY2FsZVNpemVUYWJsZQorICoKKyAqIERFU0NSSVBUSU9OOiBjaGVjayBQSUNUVVJFX1NJWkVfTkVFRF9TQ0FMRSB0byBjaG9vc2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHNjYWxlX2NudCAgIDogY291bnQgb2YgcGljdHVyZSBzaXplcyB0aGF0IHdhbnQgc2NhbGUKKyAqICAgQHNjYWxlX3RibCAgICA6IHBpY3R1cmUgc2l6ZSB0YWJsZSB0aGF0IHdhbnQgc2NhbGUKKyAqICAgQG9yZ19jbnQgICAgIDogc2Vuc29yIHN1cHBvcnRlZCBwaWN0dXJlIHNpemUgY291bnQKKyAqICAgQG9yZ190YmwgICAgICA6IHNlbnNvciBzdXBwb3J0ZWQgcGljdHVyZSBzaXplIHRhYmxlCisgKgorICogUkVUVVJOICAgICA6IGJvb2wgdHlwZSBvZiBzdGF0dXMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc2l6ZV90IFFDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhUmVwcm9jU2NhbGVQYXJhbTo6Y2hlY2tTY2FsZVNpemVUYWJsZShzaXplX3Qgc2NhbGVfY250LAorICAgICAgICBjYW1fZGltZW5zaW9uX3QgKnNjYWxlX3RibCwgc2l6ZV90IG9yZ19jbnQsIGNhbV9kaW1lbnNpb25fdCAqb3JnX3RibCkKK3sKKyAgICBzaXplX3Qgc3RibF9jbnQgPSAwOworICAgIHNpemVfdCB0ZW1wX2NudCA9IDA7CisgICAgc3NpemVfdCBpID0gMDsKKyAgICBpZihzY2FsZV9jbnQgPD0wIHx8IHNjYWxlX3RibCA9PSBOVUxMIHx8IG9yZ190YmwgPT0gTlVMTCB8fCBvcmdfY250IDw9IDApCisgICAgICAgIHJldHVybiBzdGJsX2NudDsKKworICAgIC8vZ2V0IHZhbGlkYXRlIHNjYWxlIHNpemUgdGFibGUuIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQ6CisgICAgLy8gMS4gdXBzY2FsZS4gVGhlIHNjYWxlIHNpemUgbXVzdCBsYXJnZXIgdGhhbiBtYXggc2Vuc29yIHN1cHBvcnRlZCBzaXplCisgICAgLy8gMi4gU2NhbGUgZGltZW5zaW9uIHJhdGlvIG11c3QgYmUgc2FtZSBhcyB0aGUgbWF4IHNlbnNvciBzdXBwb3J0ZWQgc2l6ZS4KKyAgICB0ZW1wX2NudCA9IHNjYWxlX2NudDsKKyAgICBmb3IgKGkgPSAoc3NpemVfdCkoc2NhbGVfY250IC0gMSk7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGlmIChzY2FsZV90YmxbaV0ud2lkdGggPiBvcmdfdGJsWzBdLndpZHRoIHx8CisgICAgICAgICAgICAgICAgKHNjYWxlX3RibFtpXS53aWR0aCA9PSBvcmdfdGJsWzBdLndpZHRoICYmCisgICAgICAgICAgICAgICAgICAgIHNjYWxlX3RibFtpXS5oZWlnaHQgPiBvcmdfdGJsWzBdLmhlaWdodCkpIHsKKyAgICAgICAgICAgIC8vZ2V0IHRoZSBzbWFsbGVzdCBzY2FsZSBzaXplCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0ZW1wX2NudC0tOworICAgIH0KKworICAgIC8vY2hlY2sgZGltZW5zaW9uIHJhdGlvCisgICAgZG91YmxlIHN1cHBvcnRlZF9yYXRpbyA9IChkb3VibGUpb3JnX3RibFswXS53aWR0aCAvIChkb3VibGUpb3JnX3RibFswXS5oZWlnaHQ7CisgICAgZm9yIChpID0gMDsgaSA8IChzc2l6ZV90KXRlbXBfY250OyBpKyspIHsKKyAgICAgICAgZG91YmxlIGN1cl9yYXRpbyA9IChkb3VibGUpc2NhbGVfdGJsW2ldLndpZHRoIC8gKGRvdWJsZSlzY2FsZV90YmxbaV0uaGVpZ2h0OworICAgICAgICBpZiAoZmFicyhzdXBwb3J0ZWRfcmF0aW8gLSBjdXJfcmF0aW8pID4gQVNQRUNUX1RPTEVSQU5DRSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbU5lZWRTY2FsZWRTaXplVGJsW3N0YmxfY250XS53aWR0aCA9IHNjYWxlX3RibFtpXS53aWR0aDsKKyAgICAgICAgbU5lZWRTY2FsZWRTaXplVGJsW3N0YmxfY250XS5oZWlnaHQ9IHNjYWxlX3RibFtpXS5oZWlnaHQ7CisgICAgICAgIHN0YmxfY250Kys7CisgICAgfQorCisgICAgcmV0dXJuIHN0YmxfY250OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFRvdGFsU2l6ZVRibENudAorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgdG90YWwgcGljdHVyZSBzaXplIGNvdW50IGFmdGVyIGFkZGluZyBkaW1lbnNpb25zIHRoYXQgbmVlZCBzY2FsaW5nCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdWludDhfdCB0eXBlIG9mIHBpY3R1cmUgc2l6ZSBjb3VudAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzaXplX3QgUUNhbWVyYVBhcmFtZXRlcnM6OlFDYW1lcmFSZXByb2NTY2FsZVBhcmFtOjpnZXRUb3RhbFNpemVUYmxDbnQoKQoreworICAgIHJldHVybiBtVG90YWxTaXplVGJsQ250OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFRvdGFsU2l6ZVRibAorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgcGljdHVyZSBzaXplIHRhYmxlIGFmdGVyIGFkZGluZyBkaW1lbnNpb25zIHRoYXQgbmVlZCBzY2FsaW5nCisgKgorICogUEFSQU1FVEVSUyA6ICBub25lCisgKgorICogUkVUVVJOICAgICA6IGNhbV9kaW1lbnNpb25fdCBsaXN0IG9mIHBpY3R1cmUgc2l6ZSB0YWJsZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjYW1fZGltZW5zaW9uX3QgKlFDYW1lcmFQYXJhbWV0ZXJzOjpRQ2FtZXJhUmVwcm9jU2NhbGVQYXJhbTo6Z2V0VG90YWxTaXplVGJsKCkKK3sKKyAgICBpZighbVNjYWxlRW5hYmxlZCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gbVRvdGFsU2l6ZVRibDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRFenR1bmUKKyAqCisgKiBERVNDUklQVElPTjogRW5hYmxlL0Rpc2FibGUgRVp0dW5lCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRFenR1bmUoKQoreworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuZXp0dW5lLmVuYWJsZSIsIHByb3AsICIwIik7CisgICAgbV9iRXp0dW5lRW5hYmxlZCA9IGF0b2kocHJvcCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzSERSRW5hYmxlZAorICoKKyAqIERFU0NSSVBUSU9OOiBpZiBIRFIgaXMgZW5hYmxlZAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IHRydWU6IG5lZWRlZAorICogICAgICAgICAgICAgIGZhbHNlOiBubyBuZWVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnM6OmlzSERSRW5hYmxlZCgpCit7CisgICAgcmV0dXJuICgobV9iSERSRW5hYmxlZCB8fCBtX0hEUlNjZW5lRW5hYmxlZCkpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzQVZUaW1lckVuYWJsZWQKKyAqCisgKiBERVNDUklQVElPTjogaWYgQVZUaW1lciBpcyBlbmFibGVkCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZTogbmVlZGVkCisgKiAgICAgICAgICAgICAgZmFsc2U6IG5vIG5lZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyczo6aXNBVlRpbWVyRW5hYmxlZCgpCit7CisgICAgcmV0dXJuIG1fYkFWVGltZXJFbmFibGVkOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBGVU5DVElPTiAgIDogaXNESVNFbmFibGVkCisqCisqIERFU0NSSVBUSU9OOiBpZiBESVMgaXMgZW5hYmxlZAorKgorKiBQQVJBTUVURVJTIDogbm9uZQorKgorKiBSRVRVUk4gICAgOiB0cnVlOiBuZWVkZWQKKyogICAgICAgICAgICAgICBmYWxzZTogbm8gbmVlZAorKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnM6OmlzRElTRW5hYmxlZCgpCit7CisgICAgcmV0dXJuIG1fYkRJU0VuYWJsZWQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIEZVTkNUSU9OICAgOiBzZXRJU1R5cGUKKyoKKyogREVTQ1JJUFRJT046IFNldCBib3RoIFByZXZpZXcgJiBWaWRlbyBJUyB0eXBlIGJ5IHJlYWRpbmcgdGhlIGNvcnJlc3BvZGluZyBzZXRwcm9wJ3MKKyoKKyogUEFSQU1FVEVSUyA6IG5vbmUKKyoKKyogUkVUVVJOICAgICA6IElTIHR5cGUKKyoKKyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRJU1R5cGUoKQoreworICAgIGJvb2wgZWlzU3VwcG9ydGVkID0gZmFsc2UsIGVpczNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fcENhcGFiaWxpdHktPnN1cHBvcnRlZF9pc190eXBlc19jbnQ7IGkrKykgeworICAgICAgICBpZiAoKG1fcENhcGFiaWxpdHktPnN1cHBvcnRlZF9pc190eXBlc1tpXSA9PSBJU19UWVBFX0VJU18yXzApIHx8CisgICAgICAgICAgICAgICAgKG1fcENhcGFiaWxpdHktPnN1cHBvcnRlZF9pc190eXBlc1tpXSA9PSBJU19UWVBFX0VJU18zXzApKSB7CisgICAgICAgICAgICBlaXNTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChtX3BDYXBhYmlsaXR5LT5zdXBwb3J0ZWRfaXNfdHlwZXNbaV0gPT0gSVNfVFlQRV9FSVNfM18wKSB7CisgICAgICAgICAgICBlaXMzU3VwcG9ydGVkID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobV9iRElTRW5hYmxlZCAmJiBlaXNTdXBwb3J0ZWQpIHsKKyAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAvLyBNYWtlIGRlZmF1bHQgdmFsdWUgZm9yIFZpZGVvIElTX1RZUEUgYXMgSVNfVFlQRV9FSVNfMl8wCisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuaXNfdHlwZSIsIHZhbHVlLCAiNCIpOworICAgICAgICBtSXNUeXBlVmlkZW8gPSBzdGF0aWNfY2FzdDxjYW1faXNfdHlwZV90PihhdG9pKHZhbHVlKSk7CisgICAgICAgIGlmICggKG1Jc1R5cGVWaWRlbyA9PSBJU19UWVBFX0VJU18zXzApICYmIChlaXMzU3VwcG9ydGVkID09IEZBTFNFKSApIHsKKyAgICAgICAgICAgIExPR1coIkVJU18zLjAgaXMgbm90IHN1cHBvcnRlZCBhbmQgc28gc2V0dGluZyBFSVNfMi4wIik7CisgICAgICAgICAgICBtSXNUeXBlVmlkZW8gPSBJU19UWVBFX0VJU18yXzA7CisgICAgICAgIH0KKyAgICAgICAgLy8gTWFrZSBkZWZhdWx0IHZhbHVlIGZvciBwcmV2aWV3IElTX1RZUEUgYXMgSVNfVFlQRV9FSVNfMl8wCisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuaXNfdHlwZV9wcmV2aWV3IiwgdmFsdWUsICI0Iik7CisgICAgICAgIG1Jc1R5cGVQcmV2aWV3ID0gc3RhdGljX2Nhc3Q8Y2FtX2lzX3R5cGVfdD4oYXRvaSh2YWx1ZSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc1R5cGVWaWRlbyA9IElTX1RZUEVfTk9ORTsKKyAgICAgICAgbUlzVHlwZVByZXZpZXcgPSBJU19UWVBFX05PTkU7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRlVOQ1RJT04gICA6IGdldElTVHlwZQorKgorKiBERVNDUklQVElPTjogcmV0dXJucyBJUyB0eXBlCisqCisqIFBBUkFNRVRFUlMgOiBub25lCisqCisqIFJFVFVSTiAgICAgOiBJUyB0eXBlCisqCisqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY2FtX2lzX3R5cGVfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0VmlkZW9JU1R5cGUoKQoreworICAgIHJldHVybiBtSXNUeXBlVmlkZW87Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIEZVTkNUSU9OICAgOiBnZXRQcmV2aWV3SVNUeXBlCisqCisqIERFU0NSSVBUSU9OOiByZXR1cm5zIElTIHR5cGUgZm9yIHByZXZpZXcKKyoKKyogUEFSQU1FVEVSUyA6IG5vbmUKKyoKKyogUkVUVVJOICAgICA6IElTIHR5cGUKKyoKKyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjYW1faXNfdHlwZV90IFFDYW1lcmFQYXJhbWV0ZXJzOjpnZXRQcmV2aWV3SVNUeXBlKCkKK3sKKyAgICByZXR1cm4gbUlzVHlwZVByZXZpZXc7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogTW9iaWNhdE1hc2sKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJucyBtb2JpY2F0IG1hc2sKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBtb2JpY2F0IG1hc2sKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldE1vYmljYXRNYXNrKCkKK3sKKyAgICByZXR1cm4gbV9Nb2JpTWFzazsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZW5kU3RyZWFtQ29uZmlnSW5mbworICoKKyAqIERFU0NSSVBUSU9OOiBzZW5kIFN0cmVhbSBjb25maWcgaW5mby4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN0cmVhbV9jb25maWdfaW5mbzogU3RyZWFtIGNvbmZpZyBpbmZvcm1hdGlvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnM6OnNlbmRTdHJlYW1Db25maWdJbmZvKGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QgJnN0cmVhbV9jb25maWdfaW5mbykgeworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpZihpbml0QmF0Y2hVcGRhdGUobV9wUGFyYW1CdWYpIDwgMCApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZ3JvdXAgdXBkYXRlIHRhYmxlIik7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfU1RSRUFNX0lORk8sIHN0cmVhbV9jb25maWdfaW5mbykpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHVwZGF0ZSB0YWJsZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2goKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBzdHJlYW0gaW5mbyBwYXJtIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U3RyZWFtQ29uZmlndXJlCisgKgorICogREVTQ1JJUFRJT046IHNldCBzdHJlYW0gdHlwZSwgc3RyZWFtIGRpbWVuc2lvbiBmb3IgYWxsIGNvbmZpZ3VyZWQgc3RyZWFtcy4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGlzQ2FwdHVyZTogV2hldGhlciB0aGlzIGNvbmZpZ3VyZWF0aW9uIGlzIGZvciBhbiBpbWFnZSBjYXB0dXJlCisgKiAgIEBwcmV2aWV3QXNQb3N0dmlldzogVXNlIHByZXZpZXcgYXMgcG9zdHZpZXcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRTdHJlYW1Db25maWd1cmUoYm9vbCBpc0NhcHR1cmUsCisgICAgICAgIGJvb2wgcHJldmlld0FzUG9zdHZpZXcsIGJvb2wgcmVzZXRDb25maWcpIHsKKworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBjYW1fc3RyZWFtX3NpemVfaW5mb190IHN0cmVhbV9jb25maWdfaW5mbzsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgYm9vbCByYXdfeXV2ID0gZmFsc2U7CisgICAgYm9vbCByYXdfY2FwdHVyZSA9IGZhbHNlOworCisgICAgaWYgKCBtX3BQYXJhbUJ1ZiA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBtZW1zZXQoJnN0cmVhbV9jb25maWdfaW5mbywgMCwgc2l6ZW9mKHN0cmVhbV9jb25maWdfaW5mbykpOworICAgIHN0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtcyA9IDA7CisKKyAgICBpZiAocmVzZXRDb25maWcpIHsKKyAgICAgICAgTE9HSCgiUmVzZXQgc3RyZWFtIGNvbmZpZyEhIik7CisgICAgICAgIHJjID0gc2VuZFN0cmVhbUNvbmZpZ0luZm8oc3RyZWFtX2NvbmZpZ19pbmZvKTsKKyAgICAgICAgTE9HSCgiRG9uZSBSZXNldHRpbmcgc3RyZWFtIGNvbmZpZyEhIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBzdHJlYW1fY29uZmlnX2luZm8uaGZyX21vZGUgICAgICAgPSBzdGF0aWNfY2FzdDxjYW1faGZyX21vZGVfdD4obUhmck1vZGUpOworICAgIHN0cmVhbV9jb25maWdfaW5mby5idWZfYWxpZ25tZW50ICA9IG1fcENhcGFiaWxpdHktPmJ1Zl9hbGlnbm1lbnQ7CisgICAgc3RyZWFtX2NvbmZpZ19pbmZvLm1pbl9zdHJpZGUgICAgID0gbV9wQ2FwYWJpbGl0eS0+bWluX3N0cmlkZTsKKyAgICBzdHJlYW1fY29uZmlnX2luZm8ubWluX3NjYW5saW5lICAgPSBtX3BDYXBhYmlsaXR5LT5taW5fc2NhbmxpbmU7CisgICAgc3RyZWFtX2NvbmZpZ19pbmZvLmJhdGNoX3NpemUgPSBnZXRCdWZCYXRjaENvdW50KCk7CisKKyAgICBMT0dIKCJidWZfYWxpZ25tZW50PSVkIHN0cmlkZSBYIHNjYW49JWR4JWQgYmF0Y2ggc2l6ZSA9ICVkXG4iLAorICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+YnVmX2FsaWdubWVudCwKKyAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPm1pbl9zdHJpZGUsCisgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5taW5fc2NhbmxpbmUsCisgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uYmF0Y2hfc2l6ZSk7CisKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnJhd195dXYiLCB2YWx1ZSwgIjAiKTsKKyAgICByYXdfeXV2ID0gYXRvaSh2YWx1ZSkgPiAwID8gdHJ1ZSA6IGZhbHNlOworCisgICAgaWYgKGlzWlNMTW9kZSgpICYmIGdldFJlY29yZGluZ0hpbnRWYWx1ZSgpICE9IHRydWUpIHsKKyAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnR5cGVbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzsKKyAgICAgICAgZ2V0U3RyZWFtRGltZW5zaW9uKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXLAorICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5zdHJlYW1fc2l6ZXNbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSk7CisgICAgICAgIHVwZGF0ZVBwRmVhdHVyZU1hc2soQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcpOworICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8ucG9zdHByb2Nlc3NfbWFza1tzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICBtU3RyZWFtUHBNYXNrW0NBTV9TVFJFQU1fVFlQRV9QUkVWSUVXXTsKKyAgICAgICAgZ2V0U3RyZWFtRm9ybWF0KENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXLAorICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5mb3JtYXRbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSk7CisgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtcysrOworCisgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby50eXBlW3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUzsKKyAgICAgICAgdXBkYXRlUHBGZWF0dXJlTWFzayhDQU1fU1RSRUFNX1RZUEVfQU5BTFlTSVMpOworICAgICAgICBnZXRTdHJlYW1EaW1lbnNpb24oQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTLAorICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5zdHJlYW1fc2l6ZXNbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSk7CisgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5wb3N0cHJvY2Vzc19tYXNrW3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgICAgIG1TdHJlYW1QcE1hc2tbQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTXTsKKyAgICAgICAgZ2V0U3RyZWFtRm9ybWF0KENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUywKKyAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uZm9ybWF0W3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10pOworICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXMrKzsKKworICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8udHlwZVtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q7CisgICAgICAgIGdldFN0cmVhbURpbWVuc2lvbihDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QsCisgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnN0cmVhbV9zaXplc1tzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdKTsKKyAgICAgICAgdXBkYXRlUHBGZWF0dXJlTWFzayhDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QpOworICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8ucG9zdHByb2Nlc3NfbWFza1tzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICBtU3RyZWFtUHBNYXNrW0NBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVF07CisgICAgICAgIGdldFN0cmVhbUZvcm1hdChDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QsCisgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLmZvcm1hdFtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdKTsKKyAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zKys7CisKKyAgICAgICAgaWYgKGlzVUJXQ0VuYWJsZWQoKSAmJiBnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSAhPSB0cnVlKSB7CisgICAgICAgICAgICBjYW1fZm9ybWF0X3QgZm10OworICAgICAgICAgICAgZ2V0U3RyZWFtRm9ybWF0KENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXLGZtdCk7CisgICAgICAgICAgICBpZiAoZm10ID09IENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyX1VCV0MpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8udHlwZVtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSzsKKyAgICAgICAgICAgICAgICBnZXRTdHJlYW1EaW1lbnNpb24oQ0FNX1NUUkVBTV9UWVBFX0NBTExCQUNLLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnN0cmVhbV9zaXplc1tzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVQcEZlYXR1cmVNYXNrKENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSyk7CisgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnBvc3Rwcm9jZXNzX21hc2tbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtUHBNYXNrW0NBTV9TVFJFQU1fVFlQRV9DQUxMQkFDS107CisgICAgICAgICAgICAgICAgZ2V0U3RyZWFtRm9ybWF0KENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5mb3JtYXRbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSk7CisgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0gZWxzZSBpZiAoIWlzQ2FwdHVyZSkgeworICAgICAgICBpZiAobV9iUmVjb3JkaW5nSGludCkgeworICAgICAgICAgICAgc2V0SVNUeXBlKCk7CisgICAgICAgICAgICBtSXNUeXBlVmlkZW8gPSBnZXRWaWRlb0lTVHlwZSgpOworICAgICAgICAgICAgbUlzVHlwZVByZXZpZXcgPSBnZXRQcmV2aWV3SVNUeXBlKCk7CisgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uaXNfdHlwZVtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0gSVNfVFlQRV9OT05FOworICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnR5cGVbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVDsKKyAgICAgICAgICAgIGdldFN0cmVhbURpbWVuc2lvbihDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QsCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5zdHJlYW1fc2l6ZXNbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSk7CisgICAgICAgICAgICB1cGRhdGVQcEZlYXR1cmVNYXNrKENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCk7CisgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8ucG9zdHByb2Nlc3NfbWFza1tzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVBwTWFza1tDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1RdOworICAgICAgICAgICAgZ2V0U3RyZWFtRm9ybWF0KENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5mb3JtYXRbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSk7CisgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXMrKzsKKyAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5pc190eXBlW3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10gPSBtSXNUeXBlVmlkZW87CisgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8udHlwZVtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICAgICAgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPOworICAgICAgICAgICAgZ2V0U3RyZWFtRGltZW5zaW9uKENBTV9TVFJFQU1fVFlQRV9WSURFTywKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnN0cmVhbV9zaXplc1tzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdKTsKKyAgICAgICAgICAgIHVwZGF0ZVBwRmVhdHVyZU1hc2soQ0FNX1NUUkVBTV9UWVBFX1ZJREVPKTsKKyAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5wb3N0cHJvY2Vzc19tYXNrW3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgICAgICAgICBtU3RyZWFtUHBNYXNrW0NBTV9TVFJFQU1fVFlQRV9WSURFT107CisgICAgICAgICAgICBnZXRTdHJlYW1Gb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX1ZJREVPLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uZm9ybWF0W3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10pOworICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zKys7CisgICAgICAgIH0KKworICAgICAgICAvKiBBbmFseXNpcyBzdHJlYW0gaXMgbmVlZGVkIGJ5IERDUkYgcmVnYXJkbGVzcyBvZiByZWNvcmRpbmcgaGludCAqLworICAgICAgICBpZiAoKGdldERjcmYoKSA9PSB0cnVlKSB8fAorICAgICAgICAgICAgICAgIChnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSAhPSB0cnVlKSB8fAorICAgICAgICAgICAgICAgIChmZE1vZGVJblZpZGVvKCkpKSB7CisgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8udHlwZVtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICAgICAgQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTOworICAgICAgICAgICAgdXBkYXRlUHBGZWF0dXJlTWFzayhDQU1fU1RSRUFNX1RZUEVfQU5BTFlTSVMpOworICAgICAgICAgICAgZ2V0U3RyZWFtRGltZW5zaW9uKENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUywKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnN0cmVhbV9zaXplc1tzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdKTsKKyAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5wb3N0cHJvY2Vzc19tYXNrW3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgICAgICAgICBtU3RyZWFtUHBNYXNrW0NBTV9TVFJFQU1fVFlQRV9BTkFMWVNJU107CisgICAgICAgICAgICBnZXRTdHJlYW1Gb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uZm9ybWF0W3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10pOworICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zKys7CisgICAgICAgIH0KKworICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8udHlwZVtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzsKKyAgICAgICAgZ2V0U3RyZWFtRGltZW5zaW9uKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXLAorICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5zdHJlYW1fc2l6ZXNbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSk7CisgICAgICAgIHVwZGF0ZVBwRmVhdHVyZU1hc2soQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcpOworICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8ucG9zdHByb2Nlc3NfbWFza1tzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICBtU3RyZWFtUHBNYXNrW0NBTV9TVFJFQU1fVFlQRV9QUkVWSUVXXTsKKyAgICAgICAgZ2V0U3RyZWFtRm9ybWF0KENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uZm9ybWF0W3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10pOworICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uaXNfdHlwZVtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0gbUlzVHlwZVByZXZpZXc7CisgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtcysrOworCisgICAgICAgIGlmIChpc1VCV0NFbmFibGVkKCkgJiYgZ2V0UmVjb3JkaW5nSGludFZhbHVlKCkgIT0gdHJ1ZSkgeworICAgICAgICAgICAgY2FtX2Zvcm1hdF90IGZtdDsKKyAgICAgICAgICAgIGdldFN0cmVhbUZvcm1hdChDQU1fU1RSRUFNX1RZUEVfUFJFVklFVyxmbXQpOworICAgICAgICAgICAgaWYgKGZtdCA9PSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9VQldDKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnR5cGVbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfQ0FMTEJBQ0s7CisgICAgICAgICAgICAgICAgZ2V0U3RyZWFtRGltZW5zaW9uKENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5zdHJlYW1fc2l6ZXNbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSk7CisgICAgICAgICAgICAgICAgdXBkYXRlUHBGZWF0dXJlTWFzayhDQU1fU1RSRUFNX1RZUEVfQ0FMTEJBQ0spOworICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5wb3N0cHJvY2Vzc19tYXNrW3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVBwTWFza1tDQU1fU1RSRUFNX1RZUEVfQ0FMTEJBQ0tdOworICAgICAgICAgICAgICAgIGdldFN0cmVhbUZvcm1hdChDQU1fU1RSRUFNX1RZUEVfQ0FMTEJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uZm9ybWF0W3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10pOworICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5pc190eXBlW3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10gPSBJU19UWVBFX05PTkU7CisgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpc0pwZWdQaWN0dXJlRm9ybWF0KCkgfHwgaXNOVjE2UGljdHVyZUZvcm1hdCgpIHx8IGlzTlYyMVBpY3R1cmVGb3JtYXQoKSkgeworICAgICAgICAgICAgaWYgKCFnZXRvZmZsaW5lUkFXKCkpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8udHlwZVtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVDsKKyAgICAgICAgICAgICAgICBnZXRTdHJlYW1EaW1lbnNpb24oQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9ULAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnN0cmVhbV9zaXplc1tzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVQcEZlYXR1cmVNYXNrKENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCk7CisgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnBvc3Rwcm9jZXNzX21hc2tbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtUHBNYXNrW0NBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVF07CisgICAgICAgICAgICAgICAgZ2V0U3RyZWFtRm9ybWF0KENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5mb3JtYXRbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSk7CisgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLmlzX3R5cGVbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSA9IElTX1RZUEVfTk9ORTsKKyAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHByZXZpZXdBc1Bvc3R2aWV3KSB7CisgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnR5cGVbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzsKKyAgICAgICAgICAgICAgICBnZXRTdHJlYW1EaW1lbnNpb24oQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uc3RyZWFtX3NpemVzW3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10pOworICAgICAgICAgICAgICAgIHVwZGF0ZVBwRmVhdHVyZU1hc2soQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcpOworICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5wb3N0cHJvY2Vzc19tYXNrW3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVBwTWFza1tDQU1fU1RSRUFNX1RZUEVfUFJFVklFV107CisgICAgICAgICAgICAgICAgZ2V0U3RyZWFtRm9ybWF0KENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLmZvcm1hdFtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uaXNfdHlwZVtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0gSVNfVFlQRV9OT05FOworICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtcysrOworICAgICAgICAgICAgfSBlbHNlIGlmKCFnZXRRdWFkcmFDZmEoKSkgeworICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby50eXBlW3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1NUUkVBTV9UWVBFX1BPU1RWSUVXOworICAgICAgICAgICAgICAgIGdldFN0cmVhbURpbWVuc2lvbihDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVcsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uc3RyZWFtX3NpemVzW3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10pOworICAgICAgICAgICAgICAgIHVwZGF0ZVBwRmVhdHVyZU1hc2soQ0FNX1NUUkVBTV9UWVBFX1BPU1RWSUVXKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8ucG9zdHByb2Nlc3NfbWFza1tzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1QcE1hc2tbQ0FNX1NUUkVBTV9UWVBFX1BPU1RWSUVXXTsKKyAgICAgICAgICAgICAgICBnZXRTdHJlYW1Gb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX1BPU1RWSUVXLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLmZvcm1hdFtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uaXNfdHlwZVtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0gSVNfVFlQRV9OT05FOworICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtcysrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmF3X2NhcHR1cmUgPSB0cnVlOworICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnR5cGVbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9SQVc7CisgICAgICAgICAgICBnZXRTdHJlYW1EaW1lbnNpb24oQ0FNX1NUUkVBTV9UWVBFX1JBVywKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnN0cmVhbV9zaXplc1tzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdKTsKKyAgICAgICAgICAgIHVwZGF0ZVBwRmVhdHVyZU1hc2soQ0FNX1NUUkVBTV9UWVBFX1JBVyk7CisgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8ucG9zdHByb2Nlc3NfbWFza1tzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbVBwTWFza1tDQU1fU1RSRUFNX1RZUEVfUkFXXTsKKyAgICAgICAgICAgIGdldFN0cmVhbUZvcm1hdChDQU1fU1RSRUFNX1RZUEVfUkFXLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uZm9ybWF0W3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10pOworICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLmlzX3R5cGVbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSA9IElTX1RZUEVfTk9ORTsKKyAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtcysrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCghcmF3X2NhcHR1cmUpICYmICgoZ2V0b2ZmbGluZVJBVygpICYmICFnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSkKKyAgICAgICAgICAgIHx8IChyYXdfeXV2KSkpIHsKKyAgICAgICAgY2FtX2RpbWVuc2lvbl90IG1heF9kaW0gPSB7MCwwfTsKKworICAgICAgICBpZiAoIWdldFF1YWRyYUNmYSgpKSB7CisgICAgICAgICAgICAvLyBGaW5kIHRoZSBNYXhpbXVtIGRpbWVuc2lvbiBhZG1vbmcgYWxsIHRoZSBzdHJlYW1zCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtX2NvbmZpZ19pbmZvLnN0cmVhbV9zaXplc1tqXS53aWR0aCA+IG1heF9kaW0ud2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4X2RpbS53aWR0aCA9IHN0cmVhbV9jb25maWdfaW5mby5zdHJlYW1fc2l6ZXNbal0ud2lkdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdHJlYW1fY29uZmlnX2luZm8uc3RyZWFtX3NpemVzW2pdLmhlaWdodCA+IG1heF9kaW0uaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIG1heF9kaW0uaGVpZ2h0ID0gc3RyZWFtX2NvbmZpZ19pbmZvLnN0cmVhbV9zaXplc1tqXS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWF4X2RpbS53aWR0aCA9IG1fcENhcGFiaWxpdHktPnF1YWRyYV9jZmFfZGltWzBdLndpZHRoOworICAgICAgICAgICAgbWF4X2RpbS5oZWlnaHQgPSBtX3BDYXBhYmlsaXR5LT5xdWFkcmFfY2ZhX2RpbVswXS5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgTE9HSCgiTWF4IERpbWVuc2lvbiA9ICVkIFggJWQiLCBtYXhfZGltLndpZHRoLCBtYXhfZGltLmhlaWdodCk7CisgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby50eXBlW3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgQ0FNX1NUUkVBTV9UWVBFX1JBVzsKKyAgICAgICAgZ2V0U3RyZWFtRm9ybWF0KENBTV9TVFJFQU1fVFlQRV9SQVcsCisgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLmZvcm1hdFtzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdKTsKKyAgICAgICAgaWYgKENBTV9GT1JNQVRfTUVUQV9SQVdfMTBCSVQgPT0KKyAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5mb3JtYXRbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSkgeworICAgICAgICAgICAgaW50MzJfdCBkdCA9IDA7CisgICAgICAgICAgICBpbnQzMl90IHZjID0gMDsKKyAgICAgICAgICAgIGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QgdGVtcF9zdHJlYW1fY29uZmlnX2luZm87CisgICAgICAgICAgICBnZXRTdHJlYW1TdWJGb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX1JBVywKKyAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uc3ViX2Zvcm1hdF90eXBlWworICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10pOworICAgICAgICAgICAgLyogU2VuZGluZyBzZXBhcmF0ZSBtZXRhX3N0cmVhbV9pbmZvIHNvIHRoYXQgb3RoZXIgbW9kdWxlcyBkbworICAgICAgICAgICAgICogbm90IGNvbmZ1c2Ugd2l0aCBvcmlnaW5hbCBzZW5kU3RyZWFtQ29uZmlnSW5mbygpLiBUaGlzIGlzIG9ubHkKKyAgICAgICAgICAgICAqIGZvciBzZW5zb3Igd2hlcmUgc2Vuc29yIGNhbiBydW4gcGljayByZXNvbHVzaW9uIGZvciBtZXRhIHJhdy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdXBkYXRlRHRWYygmZHQsICZ2Yyk7CisgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uZHRbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSA9IGR0OworICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnZjW3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtc10gPSB2YzsKKyAgICAgICAgICAgIG1lbWNweSgmdGVtcF9zdHJlYW1fY29uZmlnX2luZm8sICZzdHJlYW1fY29uZmlnX2luZm8sCisgICAgICAgICAgICAgICAgc2l6ZW9mKHRlbXBfc3RyZWFtX2NvbmZpZ19pbmZvKSk7CisgICAgICAgICAgICB0ZW1wX3N0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtcysrOworICAgICAgICAgICAgc2VuZFN0cmVhbUNvbmZpZ0ZvclBpY2tSZXModGVtcF9zdHJlYW1fY29uZmlnX2luZm8pOworICAgICAgICAgICAgZ2V0TWV0YVJhd0luZm8oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVwZGF0ZVJBVyhtYXhfZGltKTsKKyAgICAgICAgfQorICAgICAgICBnZXRTdHJlYW1EaW1lbnNpb24oQ0FNX1NUUkVBTV9UWVBFX1JBVywgc3RyZWFtX2NvbmZpZ19pbmZvLnN0cmVhbV9zaXplc1sKKyAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8ubnVtX3N0cmVhbXNdKTsKKyAgICAgICAgdXBkYXRlUHBGZWF0dXJlTWFzayhDQU1fU1RSRUFNX1RZUEVfUkFXKTsKKyAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLnBvc3Rwcm9jZXNzX21hc2tbc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgbVN0cmVhbVBwTWFza1tDQU1fU1RSRUFNX1RZUEVfUkFXXTsKKyAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zKys7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBrID0gMDsgayA8IHN0cmVhbV9jb25maWdfaW5mby5udW1fc3RyZWFtczsgaysrKSB7CisgICAgICAgIExPR0koIlNUUkVBTSBJTkZPIDogdHlwZSAlZCwgd3hoOiAlZCB4ICVkLCBwcF9tYXNrOiAweCVsbHggXAorICAgICAgICAgICAgICAgIEZvcm1hdCA9ICVkLCBkdCA9JWQgY2lkID0lZCBzdWJmb3JtYXQgPSVkLCBpc190eXBlICVkIiwKKyAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8udHlwZVtrXSwKKyAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uc3RyZWFtX3NpemVzW2tdLndpZHRoLAorICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5zdHJlYW1fc2l6ZXNba10uaGVpZ2h0LAorICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5wb3N0cHJvY2Vzc19tYXNrW2tdLAorICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5mb3JtYXRba10sCisgICAgICAgICAgICAgICAgc3RyZWFtX2NvbmZpZ19pbmZvLmR0W2tdLAorICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby52Y1trXSwKKyAgICAgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uc3ViX2Zvcm1hdF90eXBlW2tdLAorICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5pc190eXBlW2tdKTsKKyAgICB9CisKKyAgICByYyA9IHNlbmRTdHJlYW1Db25maWdJbmZvKHN0cmVhbV9jb25maWdfaW5mbyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFkZE9ubGluZVJvdGF0aW9uCisgKgorICogREVTQ1JJUFRJT046IHNlbmQgYWRkaXRpb25hbCByb3RhdGlvbiBpbmZvcm1hdGlvbiBmb3Igc3BlY2lmaWMgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEByb3RhdGlvbjogcm90YXRpb24KKyAqICAgQHN0cmVhbUlkOiBpbnRlcm5hbCBzdHJlYW0gaWQKKyAqICAgQGRldmljZV9yb3RhdGlvbjogZGV2aWNlIHJvdGF0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6YWRkT25saW5lUm90YXRpb24odWludDMyX3Qgcm90YXRpb24sIHVpbnQzMl90IHN0cmVhbUlkLAorICAgICAgICBpbnQzMl90IGRldmljZV9yb3RhdGlvbikKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgY2FtX3JvdGF0aW9uX2luZm9fdCByb3RhdGlvbl9pbmZvOworICAgIG1lbXNldCgmcm90YXRpb25faW5mbywgMCwgc2l6ZW9mKGNhbV9yb3RhdGlvbl9pbmZvX3QpKTsKKworICAgIC8qIEFkZCBqcGVnIHJvdGF0aW9uIGluZm9ybWF0aW9uICovCisgICAgaWYgKHJvdGF0aW9uID09IDApIHsKKyAgICAgICAgcm90YXRpb25faW5mby5yb3RhdGlvbiA9IFJPVEFURV8wOworICAgIH0gZWxzZSBpZiAocm90YXRpb24gPT0gOTApIHsKKyAgICAgICAgcm90YXRpb25faW5mby5yb3RhdGlvbiA9IFJPVEFURV85MDsKKyAgICB9IGVsc2UgaWYgKHJvdGF0aW9uID09IDE4MCkgeworICAgICAgICByb3RhdGlvbl9pbmZvLnJvdGF0aW9uID0gUk9UQVRFXzE4MDsKKyAgICB9IGVsc2UgaWYgKHJvdGF0aW9uID09IDI3MCkgeworICAgICAgICByb3RhdGlvbl9pbmZvLnJvdGF0aW9uID0gUk9UQVRFXzI3MDsKKyAgICB9IGVsc2UgeworICAgICAgICByb3RhdGlvbl9pbmZvLnJvdGF0aW9uID0gUk9UQVRFXzA7CisgICAgfQorICAgIHJvdGF0aW9uX2luZm8uc3RyZWFtSWQgPSBzdHJlYW1JZDsKKworICAgIC8qIEFkZCBkZXZpY2Ugcm90YXRpb24gaW5mb3JtYXRpb24gKi8KKyAgICBpZiAoZGV2aWNlX3JvdGF0aW9uID09IDApIHsKKyAgICAgICAgcm90YXRpb25faW5mby5kZXZpY2Vfcm90YXRpb24gPSBST1RBVEVfMDsKKyAgICB9IGVsc2UgaWYgKGRldmljZV9yb3RhdGlvbiA9PSA5MCkgeworICAgICAgICByb3RhdGlvbl9pbmZvLmRldmljZV9yb3RhdGlvbiA9IFJPVEFURV85MDsKKyAgICB9IGVsc2UgaWYgKGRldmljZV9yb3RhdGlvbiA9PSAxODApIHsKKyAgICAgICAgcm90YXRpb25faW5mby5kZXZpY2Vfcm90YXRpb24gPSBST1RBVEVfMTgwOworICAgIH0gZWxzZSBpZiAoZGV2aWNlX3JvdGF0aW9uID09IDI3MCkgeworICAgICAgICByb3RhdGlvbl9pbmZvLmRldmljZV9yb3RhdGlvbiA9IFJPVEFURV8yNzA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcm90YXRpb25faW5mby5kZXZpY2Vfcm90YXRpb24gPSBST1RBVEVfMDsKKyAgICB9CisKKyAgICBpZihpbml0QmF0Y2hVcGRhdGUobV9wUGFyYW1CdWYpIDwgMCApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZ3JvdXAgdXBkYXRlIHRhYmxlIik7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9ST1RBVElPTiwgcm90YXRpb25faW5mbykpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHVwZGF0ZSB0YWJsZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2goKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBzdHJlYW0gaW5mbyBwYXJtIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbmVlZFRodW1ibmFpbFJlcHJvY2VzcworICoKKyAqIERFU0NSSVBUSU9OOiBDaGVjayBpZiB0aHVtYm5haWwgcmVwcm9jZXNzaW5nIGlzIG5lZWRlZAorICoKKyAqIFBBUkFNRVRFUlMgOiBAcEZlYXR1cmVNYXNrIC0gZmVhdHVyZSBtYXNrCisgKgorICogUkVUVVJOICAgICA6IHRydWU6IG5lZWRlZAorICogICAgICAgICAgICAgIGZhbHNlOiBubyBuZWVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnM6Om5lZWRUaHVtYm5haWxSZXByb2Nlc3MoY2FtX2ZlYXR1cmVfbWFza190ICpwRmVhdHVyZU1hc2spCit7CisgICAgaWYgKGlzVWJpRm9jdXNFbmFibGVkKCkgfHwgaXNDaHJvbWFGbGFzaEVuYWJsZWQoKSB8fAorICAgICAgICAgICAgaXNPcHRpWm9vbUVuYWJsZWQoKSB8fCBpc1ViaVJlZm9jdXMoKSB8fAorICAgICAgICAgICAgaXNTdGlsbE1vcmVFbmFibGVkKCkgfHwKKyAgICAgICAgICAgIChpc0hEUkVuYWJsZWQoKSAmJiAhaXNIRFJUaHVtYm5haWxQcm9jZXNzTmVlZGVkKCkpCisgICAgICAgICAgICB8fCBpc1VCV0NFbmFibGVkKCl8fCBnZXRRdWFkcmFDZmEoKSkgeworICAgICAgICAqcEZlYXR1cmVNYXNrICY9IH5DQU1fUUNPTV9GRUFUVVJFX0NIUk9NQV9GTEFTSDsKKyAgICAgICAgKnBGZWF0dXJlTWFzayAmPSB+Q0FNX1FDT01fRkVBVFVSRV9VQklGT0NVUzsKKyAgICAgICAgKnBGZWF0dXJlTWFzayAmPSB+Q0FNX1FDT01fRkVBVFVSRV9SRUZPQ1VTOworICAgICAgICAqcEZlYXR1cmVNYXNrICY9IH5DQU1fUUNPTV9GRUFUVVJFX09QVElaT09NOworICAgICAgICAqcEZlYXR1cmVNYXNrICY9IH5DQU1fUUNPTV9GRUFUVVJFX1NUSUxMTU9SRTsKKyAgICAgICAgKnBGZWF0dXJlTWFzayAmPSB+Q0FNX1FDT01fRkVBVFVSRV9IRFI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYW1fZGltZW5zaW9uX3QgdGh1bWJfZGltOworICAgICAgICBnZXRUaHVtYm5haWxTaXplKCYodGh1bWJfZGltLndpZHRoKSwgJih0aHVtYl9kaW0uaGVpZ2h0KSk7CisgICAgICAgIGlmICh0aHVtYl9kaW0ud2lkdGggPT0gMCB8fCB0aHVtYl9kaW0uaGVpZ2h0ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldE51bU9mRXh0cmFCdWZmZXJzRm9ySW1hZ2VQcm9jCisgKgorICogREVTQ1JJUFRJT046IGdldCBudW1iZXIgb2YgZXh0cmEgaW5wdXQgYnVmZmVycyBuZWVkZWQgYnkgaW1hZ2UgcHJvY2Vzc2luZworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG51bWJlciBvZiBleHRyYSBidWZmZXJzIG5lZWRlZCBieSBJbWFnZVByb2M7CisgKiAgICAgICAgICAgICAgMCBpZiBub3QgSW1hZ2VQcm9jIGVuYWJsZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDhfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JJbWFnZVByb2MoKQoreworICAgIGludCBudW1PZkJ1ZnMgPSAwOworCisgICAgaWYgKGlzVWJpUmVmb2N1cygpKSB7CisgICAgICAgIHJldHVybiAodWludDhfdCkobV9wQ2FwYWJpbGl0eS0+cmVmb2N1c19hZl9icmFja2V0aW5nX25lZWQuYnVyc3RfY291bnQgLSAxKTsKKyAgICB9IGVsc2UgaWYgKGlzVWJpRm9jdXNFbmFibGVkKCkpIHsKKyAgICAgICAgbnVtT2ZCdWZzICs9IG1fcENhcGFiaWxpdHktPnViaWZvY3VzX2FmX2JyYWNrZXRpbmdfbmVlZC5idXJzdF9jb3VudCAtIDE7CisgICAgfSBlbHNlIGlmIChtX2JPcHRpWm9vbU9uKSB7CisgICAgICAgIG51bU9mQnVmcyArPSBtX3BDYXBhYmlsaXR5LT5vcHRpX3pvb21fc2V0dGluZ3NfbmVlZC5idXJzdF9jb3VudCAtIDE7CisgICAgfSBlbHNlIGlmIChpc0Nocm9tYUZsYXNoRW5hYmxlZCgpKSB7CisgICAgICAgIG51bU9mQnVmcyArPSBtX3BDYXBhYmlsaXR5LT5jaHJvbWFfZmxhc2hfc2V0dGluZ3NfbmVlZC5idXJzdF9jb3VudCAtIDE7CisgICAgfSBlbHNlIGlmIChpc1N0aWxsTW9yZUVuYWJsZWQoKSkgeworICAgICAgICBpZiAoaXNTZWVNb3JlRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBtX3N0aWxsbW9yZV9jb25maWcuYnVyc3RfY291bnQgPSAxOworICAgICAgICB9IGVsc2UgaWYgKChtX3N0aWxsbW9yZV9jb25maWcuYnVyc3RfY291bnQgPj0KKyAgICAgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5zdGlsbG1vcmVfc2V0dGluZ3NfbmVlZC5taW5fYnVyc3RfY291bnQpICYmCisgICAgICAgICAgICAgICAgKG1fc3RpbGxtb3JlX2NvbmZpZy5idXJzdF9jb3VudCA8PQorICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnN0aWxsbW9yZV9zZXR0aW5nc19uZWVkLm1heF9idXJzdF9jb3VudCkpIHsKKyAgICAgICAgICAgIG51bU9mQnVmcyArPSBtX3N0aWxsbW9yZV9jb25maWcuYnVyc3RfY291bnQgLSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtT2ZCdWZzICs9IG1fcENhcGFiaWxpdHktPnN0aWxsbW9yZV9zZXR0aW5nc19uZWVkLmJ1cnN0X2NvdW50IC0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNPRU1GZWF0RW5hYmxlZCgpKSB7CisgICAgICAgIG51bU9mQnVmcyArPSAxOworICAgIH0KKworICAgIGlmIChnZXRRdWFkcmFDZmEoKSkgeworICAgICAgICBudW1PZkJ1ZnMgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gKHVpbnQ4X3QpKG51bU9mQnVmcyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RXhpZkJ1ZkluZGV4CisgKgorICogREVTQ1JJUFRJT046IGdldCBpbmRleCBvZiBtZXRhZGF0YSB0byBiZSB1c2VkIGZvciBFWElGCisgKgorICogUEFSQU1FVEVSUyA6IEBjYXB0dXJlSW5kZXggLSBpbmRleCBvZiBjdXJyZW50IGNhcHR1cmVkIGZyYW1lCisgKgorICogUkVUVVJOICAgICA6IGluZGV4IG9mIG1ldGFkYXRhIHRvIGJlIHVzZWQgZm9yIEVYSUYKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldEV4aWZCdWZJbmRleCh1aW50MzJfdCBjYXB0dXJlSW5kZXgpCit7CisgICAgdWludDMyX3QgaW5kZXggPSBjYXB0dXJlSW5kZXg7CisKKyAgICBpZiAoaXNVYmlSZWZvY3VzKCkpIHsKKyAgICAgICAgaWYgKGNhcHR1cmVJbmRleCA8IG1fcENhcGFiaWxpdHktPnJlZm9jdXNfYWZfYnJhY2tldGluZ19uZWVkLmJ1cnN0X2NvdW50KSB7CisgICAgICAgICAgICBpbmRleCA9IGNhcHR1cmVJbmRleDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNDaHJvbWFGbGFzaEVuYWJsZWQoKSkgeworICAgICAgICBpbmRleCA9IG1fcENhcGFiaWxpdHktPmNocm9tYV9mbGFzaF9zZXR0aW5nc19uZWVkLm1ldGFkYXRhX2luZGV4OworICAgIH0gZWxzZSBpZiAoaXNIRFJFbmFibGVkKCkpIHsKKyAgICAgICAgaWYgKGlzSERSMXhGcmFtZUVuYWJsZWQoKSAmJiBpc0hEUjF4RXh0cmFCdWZmZXJOZWVkZWQoKSkgeworICAgICAgICAgICAgaW5kZXggPSBtX3BDYXBhYmlsaXR5LT5oZHJfYnJhY2tldGluZ19zZXR0aW5nLm51bV9mcmFtZXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtX3BDYXBhYmlsaXR5LT5oZHJfYnJhY2tldGluZ19zZXR0aW5nLm51bV9mcmFtZXM7IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICBpZiAoMCA9PSBtX3BDYXBhYmlsaXR5LT5oZHJfYnJhY2tldGluZ19zZXR0aW5nLmV4cF92YWwudmFsdWVzW2luZGV4XSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gbV9wQ2FwYWJpbGl0eS0+aGRyX2JyYWNrZXRpbmdfc2V0dGluZy5udW1fZnJhbWVzKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBjYXB0dXJlSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TnVtYmVySW5CdWZzRm9yU2luZ2xlU2hvdAorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgbnVtYmVyIG9mIGlucHV0IGJ1ZmZlcnMgZm9yIHNpbmdsZSBzaG90CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbnVtYmVyIG9mIGlucHV0IGJ1ZmZlcnMgZm9yIHNpbmdsZSBzaG90CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpnZXROdW1iZXJJbkJ1ZnNGb3JTaW5nbGVTaG90KCkKK3sKKyAgICB1aW50MzJfdCBudW1PZkJ1ZnMgPSAxOworCisgICAgaWYgKGlzVWJpUmVmb2N1cygpKSB7CisgICAgICAgIG51bU9mQnVmcyA9IG1fcENhcGFiaWxpdHktPnJlZm9jdXNfYWZfYnJhY2tldGluZ19uZWVkLmJ1cnN0X2NvdW50OworICAgIH0gZWxzZSBpZiAoaXNVYmlGb2N1c0VuYWJsZWQoKSkgeworICAgICAgICBudW1PZkJ1ZnMgPSBtX3BDYXBhYmlsaXR5LT51Ymlmb2N1c19hZl9icmFja2V0aW5nX25lZWQuYnVyc3RfY291bnQ7CisgICAgfSBlbHNlIGlmIChtX2JPcHRpWm9vbU9uKSB7CisgICAgICAgIG51bU9mQnVmcyA9IG1fcENhcGFiaWxpdHktPm9wdGlfem9vbV9zZXR0aW5nc19uZWVkLmJ1cnN0X2NvdW50OworICAgIH0gZWxzZSBpZiAoaXNDaHJvbWFGbGFzaEVuYWJsZWQoKSkgeworICAgICAgICBudW1PZkJ1ZnMgPSBtX3BDYXBhYmlsaXR5LT5jaHJvbWFfZmxhc2hfc2V0dGluZ3NfbmVlZC5idXJzdF9jb3VudDsKKyAgICB9IGVsc2UgaWYgKGlzSERSRW5hYmxlZCgpKSB7CisgICAgICAgIG51bU9mQnVmcyA9IG1fcENhcGFiaWxpdHktPmhkcl9icmFja2V0aW5nX3NldHRpbmcubnVtX2ZyYW1lczsKKyAgICAgICAgaWYgKGlzSERSMXhGcmFtZUVuYWJsZWQoKSAmJiBpc0hEUjF4RXh0cmFCdWZmZXJOZWVkZWQoKSkgeworICAgICAgICAgICAgbnVtT2ZCdWZzKys7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzU3RpbGxNb3JlRW5hYmxlZCgpKSB7CisgICAgICAgIGlmIChpc1NlZU1vcmVFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIG1fc3RpbGxtb3JlX2NvbmZpZy5idXJzdF9jb3VudCA9IDE7CisgICAgICAgICAgICBudW1PZkJ1ZnMgPSBtX3N0aWxsbW9yZV9jb25maWcuYnVyc3RfY291bnQ7CisgICAgICAgIH0gZWxzZSBpZiAoKG1fc3RpbGxtb3JlX2NvbmZpZy5idXJzdF9jb3VudCA+PQorICAgICAgICAgICAgICAgIG1fcENhcGFiaWxpdHktPnN0aWxsbW9yZV9zZXR0aW5nc19uZWVkLm1pbl9idXJzdF9jb3VudCkgJiYKKyAgICAgICAgICAgICAgICAobV9zdGlsbG1vcmVfY29uZmlnLmJ1cnN0X2NvdW50IDw9CisgICAgICAgICAgICAgICAgbV9wQ2FwYWJpbGl0eS0+c3RpbGxtb3JlX3NldHRpbmdzX25lZWQubWF4X2J1cnN0X2NvdW50KSkgeworICAgICAgICAgICAgbnVtT2ZCdWZzID0gbV9zdGlsbG1vcmVfY29uZmlnLmJ1cnN0X2NvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtT2ZCdWZzID0gbV9wQ2FwYWJpbGl0eS0+c3RpbGxtb3JlX3NldHRpbmdzX25lZWQuYnVyc3RfY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVtT2ZCdWZzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldE51bWJlck91dEJ1ZnNGb3JTaW5nbGVTaG90CisgKgorICogREVTQ1JJUFRJT046IGdldCBudW1iZXIgb2Ygb3V0cHV0IGJ1ZmZlcnMgZm9yIHNpbmdsZSBzaG90CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbnVtYmVyIG9mIG91dHB1dCBidWZmZXJzIGZvciBzaW5nbGUgc2hvdAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0TnVtYmVyT3V0QnVmc0ZvclNpbmdsZVNob3QoKQoreworICAgIHVpbnQzMl90IG51bU9mQnVmcyA9IDE7CisKKyAgICBpZiAoaXNVYmlSZWZvY3VzKCkpIHsKKyAgICAgICAgbnVtT2ZCdWZzID0gbV9wQ2FwYWJpbGl0eS0+cmVmb2N1c19hZl9icmFja2V0aW5nX25lZWQub3V0cHV0X2NvdW50OworICAgIH0gZWxzZSBpZiAoaXNIRFJFbmFibGVkKCkpIHsKKyAgICAgICAgaWYgKGlzSERSMXhGcmFtZUVuYWJsZWQoKSkgeworICAgICAgICAgICAgbnVtT2ZCdWZzKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVtT2ZCdWZzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzNGsya1ZpZGVvUmVzb2x1dGlvbgorICoKKyAqIERFU0NSSVBUSU9OOiBpZiByZXNvbHV0aW9uIGlzIDRrIHggMmsgb3IgdHJ1ZSA0ayB4IDJrCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZTogdmlkZW8gcmVzb2x1dGlvbiBpcyA0ayB4IDJrCisgKiAgICAgICAgICAgICAgZmFsc2U6IHZpZGVvIHJlc29sdXRpb24gaXMgbm90IDRrIHggMmsKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyczo6aXM0azJrVmlkZW9SZXNvbHV0aW9uKCkKK3sKKyAgIGJvb2wgZW5hYmxlZCA9IGZhbHNlOworICAgY2FtX2RpbWVuc2lvbl90IHJlc29sdXRpb247CisgICBnZXRWaWRlb1NpemUoJnJlc29sdXRpb24ud2lkdGgsICZyZXNvbHV0aW9uLmhlaWdodCk7CisgICBpZiAoIShyZXNvbHV0aW9uLndpZHRoIDwgMzg0MCAmJiByZXNvbHV0aW9uLmhlaWdodCA8IDIxNjApKSB7CisgICAgICBlbmFibGVkID0gdHJ1ZTsKKyAgIH0KKworICAgcmV0dXJuIGVuYWJsZWQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNQcmV2aWV3U2VlTW9yZVJlcXVpcmVkCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgU2VlTW1vcmUoU1cgVE5SKSBuZWVkcyB0byBiZSBhcHBsaWVkIGZvcgorICogICAgICAgICAgICAgIHByZXZpZXcgc3RyZWFtIGRlcGVuZGluZyBvbiB2aWRlbyByZXNvbHVpb24gYW5kIHNldHByb3AKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlOiBJZiBTZWVNb3JlIG5lZWRzIHRvIGFwcGx5CisgKiAgICAgICAgICAgICAgZmFsc2U6IE5vIG5lZWQgdG8gYXBwbHkKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyczo6aXNQcmV2aWV3U2VlTW9yZVJlcXVpcmVkKCkKK3sKKyAgIGNhbV9kaW1lbnNpb25fdCBkaW07CisgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKworICAgZ2V0VmlkZW9TaXplKCZkaW0ud2lkdGgsICZkaW0uaGVpZ2h0KTsKKyAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5wcmV2aWV3LnNlZW1vcmUiLCBwcm9wLCAiMCIpOworICAgaW50IGVuYWJsZSA9IGF0b2kocHJvcCk7CisKKyAgIC8vIEVuYWJsZSBTZWVNb3JlIGZvciBwcmV2aWV3IHN0cmVhbSBpZiA6CisgICAvLyAxLiBWaWRlbyByZXNvbHV0aW9uIDw9ICgxOTIweDEwODApICAob3IpCisgICAvLyAyLiBwZXJzaXN0LmNhbWVyYS5wcmV2aWV3LnNlZW1vcmUgaXMgc2V0CisgICBMT0dEKCJ3aWR0aD0lZCwgaGVpZ2h0PSVkLCBlbmFibGU9JWQiLCBkaW0ud2lkdGgsIGRpbS5oZWlnaHQsIGVuYWJsZSk7CisgICByZXR1cm4gKCgoZGltLndpZHRoICogZGltLmhlaWdodCkgPD0gKDE5MjAgKiAxMDgwKSkgfHwgZW5hYmxlKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB1cGRhdGVEZWJ1Z0xldmVsCisgKgorICogREVTQ1JJUFRJT046IHNlbmQgQ0FNX0lOVEZfUEFSTV9VUERBVEVfREVCVUdfTEVWRUwgdG8gYmFja2VuZAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IE5PX0VSUk9SIC0tc3VjY2VzcworICogICAgICAgICAgICAgIGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6dXBkYXRlRGVidWdMZXZlbCgpCit7CisgICAgaWYgKCBtX3BQYXJhbUJ1ZiA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpbnQzMl90IHJjID0gaW5pdEJhdGNoVXBkYXRlKG1fcFBhcmFtQnVmKTsKKyAgICBpZiAoIHJjICE9IE5PX0VSUk9SICkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHVpbnQzMl90IGR1bW15RGVidWdMZXZlbCA9IDA7CisgICAgLyogVGhlIHZhbHVlIG9mIGR1bW15RGVidWdMZXZlbCBpcyBpcnJlbGF2ZW50LiBPbgorICAgICAqIENBTV9JTlRGX1BBUk1fVVBEQVRFX0RFQlVHX0xFVkVMLCByZWFkIGRlYnVnIHByb3BlcnR5ICovCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fVVBEQVRFX0RFQlVHX0xFVkVMLCBkdW1teURlYnVnTGV2ZWwpKSB7CisgICAgICAgIExPR0UoIlBhcmFtZXRlcnMgYmF0Y2ggZmFpbGVkIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCgpOworICAgIGlmICggcmMgIT0gTk9fRVJST1IgKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBjb21taXQgYmF0Y2ggcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldE9mZmxpbmVSQVcKKyAqCisgKiBERVNDUklQVElPTjogRnVuY3Rpb24gdG8gZGVjaWRlIE9mZmxpbmUgUkFXIGZlYXR1cmUuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgQHJhd192YWx1ZTogb2ZmbGluZSByYXcgdmFsdWUgdG8gc2V0LgorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYVBhcmFtZXRlcnM6OnNldE9mZmxpbmVSQVcoYm9vbCByYXdfdmFsdWUpCit7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGJvb2wgcmF3X3l1diA9IGZhbHNlOworICAgIGJvb2wgb2ZmbGluZVJhdyA9IGZhbHNlOworCisgICAgaWYgKHJhd192YWx1ZSkgeworICAgICAgICBtT2ZmbGluZVJBVyA9IHRydWU7CisgICAgICAgIExPR0goIk9mZmxpbmUgUmF3ICAlZCIsIG1PZmZsaW5lUkFXKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEucmF3X3l1diIsIHZhbHVlLCAiMCIpOworICAgIHJhd195dXYgPSBhdG9pKHZhbHVlKSA+IDAgPyB0cnVlIDogZmFsc2U7CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5vZmZsaW5lcmF3IiwgdmFsdWUsICIwIik7CisgICAgb2ZmbGluZVJhdyA9IGF0b2kodmFsdWUpID4gMCA/IHRydWUgOiBmYWxzZTsKKyAgICBpZiAoKHJhd195dXYgfHwgaXNSZGlNb2RlKCkpICYmIG9mZmxpbmVSYXcpIHsKKyAgICAgICAgbU9mZmxpbmVSQVcgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1PZmZsaW5lUkFXID0gZmFsc2U7CisgICAgfQorICAgIExPR0goIk9mZmxpbmUgUmF3ICAlZCIsIG1PZmZsaW5lUkFXKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB1cGRhdGVQcEZlYXR1cmVNYXNrCisgKgorICogREVTQ1JJUFRJT046IFVwZGF0ZXMgdGhlIGZlYXR1cmUgbWFzayBmb3IgYSBwYXJ0aWN1bGFyIHN0cmVhbSBkZXBlbmRpbmcKKyAqICAgICAgICAgICAgICBvbiBjdXJyZW50IGNsaWVudCBjb25maWd1cmF0aW9uLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogIEBzdHJlYW1fdHlwZTogQ2FtZXJhIHN0cmVhbSB0eXBlCisgKgorICogUkVUVVJOICAgICA6IE5PX0VSUk9SIC0tc3VjY2VzcworICogICAgICAgICAgICAgIGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6dXBkYXRlUHBGZWF0dXJlTWFzayhjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSkgeworCisgICAgY2FtX2ZlYXR1cmVfbWFza190IGZlYXR1cmVfbWFzayA9IDA7CisKKyAgICBpZiAoc3RyZWFtX3R5cGUgPj0gQ0FNX1NUUkVBTV9UWVBFX01BWCkgeworICAgICAgICBMT0dFKCJFcnJvciEhIHN0cmVhbSB0eXBlOiAlZCBub3QgdmFsaWQiLCBzdHJlYW1fdHlwZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBVcGRhdGUgZmVhdHVyZSBtYXNrIGZvciBTZWVNb3JlIGluIHZpZGVvIGFuZCB2aWRlbyBwcmV2aWV3CisgICAgaWYgKGlzU2VlTW9yZUVuYWJsZWQoKSAmJiAoKHN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9WSURFTykgfHwKKyAgICAgICAgICAgIChzdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVyAmJiBnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSAmJgorICAgICAgICAgICAgaXNQcmV2aWV3U2VlTW9yZVJlcXVpcmVkKCkpKSkgeworICAgICAgIGZlYXR1cmVfbWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX0xMVkQ7CisgICAgfQorCisgICAgaWYgKGlzSGlnaFF1YWxpdHlOb2lzZVJlZHVjdGlvbk1vZGUoKSAmJgorICAgICAgICAgICAgKChzdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfVklERU8pIHx8CisgICAgICAgICAgICAoc3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcgJiYgZ2V0UmVjb3JkaW5nSGludFZhbHVlKCkgJiYKKyAgICAgICAgICAgIGlzUHJldmlld1NlZU1vcmVSZXF1aXJlZCgpKSkpIHsKKyAgICAgICAgZmVhdHVyZV9tYXNrIHw9IENBTV9RVElfRkVBVFVSRV9TV19UTlI7CisgICAgfQorCisgICAgLy8gRG8gbm90IGVuYWJsZSBmZWF0dXJlIG1hc2sgZm9yIFpTTC9ub24tWlNML2xpdmVzaG90IHNuYXBzaG90IGV4Y2VwdCBmb3IgNEsyayBjYXNlCisgICAgaWYgKChnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSAmJgorICAgICAgICAgICAgKHN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCkgJiYgaXM0azJrVmlkZW9SZXNvbHV0aW9uKCkpIHx8CisgICAgICAgICAgICAoc3RyZWFtX3R5cGUgIT0gQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKSkgeworICAgICAgICBpZiAoKG1fbk1pblJlcXVpcmVkUHBNYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9TSEFSUE5FU1MpICYmCisgICAgICAgICAgICAgICAgIWlzT3B0aVpvb21FbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGZlYXR1cmVfbWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX1NIQVJQTkVTUzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtX25NaW5SZXF1aXJlZFBwTWFzayAmIENBTV9RQ09NX0ZFQVRVUkVfRUZGRUNUKSB7CisgICAgICAgICAgICBmZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9FRkZFQ1Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzV05SRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBmZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9ERU5PSVNFMkQ7CisgICAgICAgIH0KKworICAgICAgICAvL1NldCBmbGlwIG1vZGUgYmFzZWQgb24gU3RyZWFtIHR5cGU7CisgICAgICAgIGludCBmbGlwTW9kZSA9IGdldEZsaXBNb2RlKHN0cmVhbV90eXBlKTsKKyAgICAgICAgaWYgKGZsaXBNb2RlID4gMCkgeworICAgICAgICAgICAgZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfRkxJUDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoaXNUTlJWaWRlb0VuYWJsZWQoKSAmJiAoQ0FNX1NUUkVBTV9UWVBFX1ZJREVPID09IHN0cmVhbV90eXBlKSkKKyAgICAgICAgICAgIHx8IChpc1ROUlByZXZpZXdFbmFibGVkKCkgJiYgKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXID09IHN0cmVhbV90eXBlKSkpIHsKKyAgICAgICAgZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfQ1BQX1ROUjsKKyAgICB9CisgICAgaWYgKGlzRXp0dW5lRW5hYmxlZCgpICYmCisgICAgICAgICAgICAoKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXID09IHN0cmVhbV90eXBlKSB8fAorICAgICAgICAgICAgKENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCA9PSBzdHJlYW1fdHlwZSkpKSB7CisgICAgICAgIGZlYXR1cmVfbWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX0VaVFVORTsKKyAgICB9CisKKyAgICBpZiAoKGdldENEU01vZGUoKSAhPSBDQU1fQ0RTX01PREVfT0ZGKSAmJgorICAgICAgICAgICAgKChDQU1fU1RSRUFNX1RZUEVfUFJFVklFVyA9PSBzdHJlYW1fdHlwZSkgfHwKKyAgICAgICAgICAgIChDQU1fU1RSRUFNX1RZUEVfVklERU8gPT0gc3RyZWFtX3R5cGUpIHx8CisgICAgICAgICAgICAoQ0FNX1NUUkVBTV9UWVBFX0NBTExCQUNLID09IHN0cmVhbV90eXBlKSB8fAorICAgICAgICAgICAgKChDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QgPT0gc3RyZWFtX3R5cGUpICYmCisgICAgICAgICAgICBnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSAmJiBpczRrMmtWaWRlb1Jlc29sdXRpb24oKSkpKSB7CisgICAgICAgICBpZiAobV9uTWluUmVxdWlyZWRQcE1hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX0RTRE4pIHsKKyAgICAgICAgICAgICBmZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9EU0ROOworICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICBmZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9DRFM7CisgICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzVE5SU25hcHNob3RFbmFibGVkKCkgJiYgKENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCA9PSBzdHJlYW1fdHlwZSkKKyAgICAgICAgICAgICYmIChpc1pTTE1vZGUoKSB8fCBnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSkpIHsKKyAgICAgICAgZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfQ1BQX1ROUjsKKyAgICB9CisKKyAgICAvL1JvdGF0aW9uIGNvdWxkIGFsc28gaGF2ZSBhbiBlZmZlY3Qgb24gcHAgZmVhdHVyZSBtYXNrCisgICAgY2FtX3BwX2ZlYXR1cmVfY29uZmlnX3QgY29uZmlnOworICAgIGNhbV9kaW1lbnNpb25fdCBkaW07CisgICAgbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjYW1fcHBfZmVhdHVyZV9jb25maWdfdCkpOworICAgIGdldFN0cmVhbVJvdGF0aW9uKHN0cmVhbV90eXBlLCBjb25maWcsIGRpbSk7CisgICAgZmVhdHVyZV9tYXNrIHw9IGNvbmZpZy5mZWF0dXJlX21hc2s7CisKKyAgICAvLyBEdWFsIENhbWVyYSBzY2VuYXJpb3MKKyAgICAvLyBhbGwgZmVhdHVyZSBtYXNrcyBhcmUgZGlzYWJsZWQgZm9yIHByZXZpZXcgYW5kIGFuYWx5c2lzIHN0cmVhbXMgZm9yIGF1eCBzZXNzaW9uCisgICAgLy8gYWxsIHJlcXVpcmVkIGZlYXR1cmUgbWFza3MgZm9yIGF1eCBzZXNzaW9uIHByZXZpZXcgYW5kIGFuYWx5c2lzIHN0cmVhbXMgbmVlZAorICAgIC8vIHRvIGJlIGVuYWJsZWQgZXhwbGljaXRseSBoZXJlCisgICAgLy8vQG5vdGUgV2hlbiBhdXggY2FtZXJhIGlzIG9mIGJheWVyIHR5cGUsIGtlZXAgcHAgbWFzayBhcyBpcyBvciB3ZSdkIHJ1bgorICAgIC8vLyAgICAgIGludG8gc3RyZWFtIG1hcHBpbmcgcHJvYmxlbXMuIFlVViBzZW5zb3IgaXMgbWFya2VkIGFzIGludGVybGVhdmVkIGFuZCBoYXMKKyAgICAvLy8gICAgICBwcmVmZXJyZWQgbWFwcGluZyBzZXR1cCBzbyB3ZSBkb24ndCBzZWUgYW55IG1hcHBpbmcgaXNzdWVzLgorICAgIGlmIChtX3JlbENhbVN5bmNJbmZvLnN5bmNfY29udHJvbCA9PSBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT04pIHsKKyAgICAgICAgaWYgKCgoQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTID09IHN0cmVhbV90eXBlKSB8fAorICAgICAgICAgICAgICAgIChDQU1fU1RSRUFNX1RZUEVfUFJFVklFVyA9PSBzdHJlYW1fdHlwZSkpICYmCisgICAgICAgICAgICAgICAgKG1fcmVsQ2FtU3luY0luZm8ubW9kZSA9PSBDQU1fTU9ERV9TRUNPTkRBUlkpICYmCisgICAgICAgICAgICAgICAgKG1fcENhcGFiaWxpdHktPnNlbnNvcl90eXBlLnNlbnNfdHlwZSA9PSBDQU1fU0VOU09SX1lVVikpIHsKKyAgICAgICAgICAgIExPR0goIkRpc2FibGluZyBhbGwgcHAgZmVhdHVyZSBtYXNrcyBmb3IgYXV4IHByZXZpZXcgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgImFuYWx5c2lzIHN0cmVhbXMiKTsKKyAgICAgICAgICAgIGZlYXR1cmVfbWFzayA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBhbGwgZmVhdHVyZSBtYXNrcyBuZWVkIHRvIGJlIGVuYWJsZWQgaGVyZQorICAgICAgICAvLyBlbmFibGUgRENSRiBmZWF0dXJlIG1hc2sgb24gYW5hbHlzaXMgc3RyZWFtIGluIGNhc2Ugb2YgZHVhbCBjYW1lcmEKKyAgICAgICAgaWYgKG1fYkRjcmZFbmFibGVkICYmIChDQU1fU1RSRUFNX1RZUEVfQU5BTFlTSVMgPT0gc3RyZWFtX3R5cGUpKSB7CisgICAgICAgICAgICBmZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9EQ1JGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmVhdHVyZV9tYXNrICY9IH5DQU1fUUNPTV9GRUFUVVJFX0RDUkY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQcmV2aWV3IGFzc2lzdGVkIGF1dG9mb2N1cyBuZWVkcyB0byBiZSBzdXBwb3J0ZWQgZm9yCisgICAgLy8gY2FsbGJhY2ssIHByZXZpZXcsIG9yIHZpZGVvIHN0cmVhbXMKKyAgICBjYW1fY29sb3JfZmlsdGVyX2FycmFuZ2VtZW50X3QgZmlsdGVyX2FycmFuZ2VtZW50OworICAgIGZpbHRlcl9hcnJhbmdlbWVudCA9IG1fcENhcGFiaWxpdHktPmNvbG9yX2FycmFuZ2VtZW50OworICAgIHN3aXRjaCAoZmlsdGVyX2FycmFuZ2VtZW50KSB7CisgICAgY2FzZSBDQU1fRklMVEVSX0FSUkFOR0VNRU5UX1JHR0I6CisgICAgY2FzZSBDQU1fRklMVEVSX0FSUkFOR0VNRU5UX0dSQkc6CisgICAgY2FzZSBDQU1fRklMVEVSX0FSUkFOR0VNRU5UX0dCUkc6CisgICAgY2FzZSBDQU1fRklMVEVSX0FSUkFOR0VNRU5UX0JHR1I6CisgICAgICAgIGlmICgoc3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX0NBTExCQUNLKSB8fAorICAgICAgICAgICAgKHN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKSkgeworICAgICAgICAgICAgZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfUEFBRjsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIGlmIChnZXRWaWRlb0lTVHlwZSgpICE9IElTX1RZUEVfRUlTXzNfMCkKKyAgICAgICAgICAgICAgICBmZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9QQUFGOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZJTFRFUl9BUlJBTkdFTUVOVF9ZOgorICAgICAgICBpZiAoc3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTKSB7CisgICAgICAgICAgICBmZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9QQUFGOworICAgICAgICAgICAgTE9HSCgiYWRkIFBBQUYgbWFzayB0byBmZWF0dXJlX21hc2sgZm9yIG1vbm8gZGV2aWNlIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gRW5hYmxlIFBQRUlTQ09SRSBmb3IgRUlTIDMuMAorICAgIGlmICgoc3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX1ZJREVPKSAmJgorICAgICAgICAgICAgKGdldFZpZGVvSVNUeXBlKCkgPT0gSVNfVFlQRV9FSVNfM18wKSkgeworICAgICAgICBmZWF0dXJlX21hc2sgfD0gQ0FNX1FUSV9GRUFUVVJFX1BQRUlTQ09SRTsKKyAgICB9CisKKyAgICAvLyBTdG9yZSBzdHJlYW0gZmVhdHVyZSBtYXNrCisgICAgc2V0U3RyZWFtUHBNYXNrKHN0cmVhbV90eXBlLCBmZWF0dXJlX21hc2spOworICAgIExPR0goInN0cmVhbSB0eXBlOiAlZCwgcHBfbWFzazogMHglbGx4Iiwgc3RyZWFtX3R5cGUsIGZlYXR1cmVfbWFzayk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U3RyZWFtUHBNYXNrCisgKgorICogREVTQ1JJUFRJT046IFN0b3JlcyBhIHBhcnRpY3VsYXIgZmVhdHVyZSBtYXNrIGZvciBhIGdpdmVuIGNhbWVyYSBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICBAc3RyZWFtX3R5cGU6IENhbWVyYSBzdHJlYW0gdHlwZQorICogIEBwcF9tYXNrICA6IEZlYXR1cmUgbWFzaworICoKKyAqIFJFVFVSTiAgICAgOiBOT19FUlJPUiAtLXN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFN0cmVhbVBwTWFzayhjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IHBwX21hc2spIHsKKworICAgIGlmKHN0cmVhbV90eXBlID49IENBTV9TVFJFQU1fVFlQRV9NQVgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKworICAgIG1TdHJlYW1QcE1hc2tbc3RyZWFtX3R5cGVdID0gcHBfbWFzazsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0U3RyZWFtUHBNYXNrCisgKgorICogREVTQ1JJUFRJT046IFJldHJpZXZlcyB0aGUgZmVhdHVyZSBtYXNrIGZvciBhIGdpdmVuIGNhbWVyYSBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICBAc3RyZWFtX3R5cGU6IENhbWVyYSBzdHJlYW0gdHlwZQorICogIEBwcF9tYXNrICA6IEZlYXR1cmUgbWFzaworICoKKyAqIFJFVFVSTiAgICAgOiBOT19FUlJPUiAtLXN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldFN0cmVhbVBwTWFzayhjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190ICZwcF9tYXNrKSB7CisKKyAgICBpZihzdHJlYW1fdHlwZSA+PSBDQU1fU1RSRUFNX1RZUEVfTUFYKSB7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisKKyAgICBwcF9tYXNrID0gbVN0cmVhbVBwTWFza1tzdHJlYW1fdHlwZV07CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzTXVsdGlQYXNzUmVwcm9jZXNzaW5nCisgKgorICogREVTQ1JJUFRJT046IFJlYWQgc2V0cHJvcCB0byBlbmFibGUvZGlzYWJsZSBtdWx0aXBhc3MKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBUUlVFICAtLSBJZiBlbmFibGVkCisgKiAgICAgICAgICAgICAgRkFMU0UgIC0tIGRpc2FibGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnM6OmlzTXVsdGlQYXNzUmVwcm9jZXNzaW5nKCkKK3sKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaW50IG11bHRwYXNzID0gMDsKKworICAgIGlmIChnZXRRdWFkcmFDZmEoKSkgeworICAgICAgICBtdWx0cGFzcyA9IFRSVUU7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEubXVsdGlfcGFzcyIsIHZhbHVlLCAiMCIpOworICAgIG11bHRwYXNzID0gYXRvaSh2YWx1ZSk7CisKKyAgICByZXR1cm4gKG11bHRwYXNzID09IDApPyBGQUxTRSA6IFRSVUU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0UmVwcm9jQ291bnQKKyAqCisgKiBERVNDUklQVElPTjogU2V0IHRvdGFsIHJlcHJvY2Vzc2luZyBwYXNzIGNvdW50CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRSZXByb2NDb3VudCgpCit7CisgICAgbVRvdGFsUFBDb3VudCA9IDE7IC8vRGVmYXVsdCByZXByb2Nlc3NpbmcgUGFzcyBjb3VudAorCisgICAgaWYgKGdldE1hbnVhbENhcHR1cmVNb2RlKCkgPj0KKyAgICAgICAgICAgIENBTV9NQU5VQUxfQ0FQVFVSRV9UWVBFXzMpIHsKKyAgICAgICAgTE9HRCgiQWRkaXRpb25hbCBwb3N0IHByb2Nlc3NpbmcgZW5hYmxlZCBmb3IgbWFudWFsIGNhcHR1cmUiKTsKKyAgICAgICAgbVRvdGFsUFBDb3VudCsrOworICAgIH0KKworICAgIGlmICghaXNNdWx0aVBhc3NSZXByb2Nlc3NpbmcoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKChnZXRab29tTGV2ZWwoKSAhPSAwICYmICFnZXRRdWFkcmFDZmEoKSkKKyAgICAgICAgICAgICYmIChnZXRCdXJzdENvdW50Rm9yQWR2YW5jZWRDYXB0dXJlKCkKKyAgICAgICAgICAgID09IGdldE51bU9mU25hcHNob3RzKCkpKSB7CisgICAgICAgIExPR0QoIjIgUGFzcyBwb3N0cHJvY2Vzc2luZyBlbmFibGVkIik7CisgICAgICAgIG1Ub3RhbFBQQ291bnQrKzsKKyAgICB9CisKKyAgICBpZiAoZ2V0UXVhZHJhQ2ZhKCkpIHsKKyAgICAgICAgbVRvdGFsUFBDb3VudCsrOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc1VCV0NFbmFibGVkCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIHRvIGdldCBVQldDIGhhcmR3YXJlIHN1cHBvcnQuCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogVFJVRSAtLSBVQldDIGZvcm1hdCBzdXBwb3J0ZWQKKyAqICAgICAgICAgICAgICBGQUxTRSAtLSBVQldDIGlzIG5vdCBzdXBwb3J0ZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnM6OmlzVUJXQ0VuYWJsZWQoKQoreworI2lmZGVmIFVCV0NfUFJFU0VOVAorICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpbnQgcHJvcF92YWx1ZSA9IDA7CisgICAgbWVtc2V0KHZhbHVlLCAwLCBzaXplb2YodmFsdWUpKTsKKyAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLmdyYWxsb2MuZ2Z4X3Vid2NfZGlzYWJsZSIsIHZhbHVlLCAiMCIpOworICAgIHByb3BfdmFsdWUgPSBhdG9pKHZhbHVlKTsKKyAgICBpZiAocHJvcF92YWx1ZSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy9EaXNhYmxlIFVCV0MgaWYgaXQgaXMgWVVWIHNlbnNvci4KKyAgICBpZiAoKG1fcENhcGFiaWxpdHkgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgIChtX3BDYXBhYmlsaXR5LT5zZW5zb3JfdHlwZS5zZW5zX3R5cGUgPT0gQ0FNX1NFTlNPUl9ZVVYpKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvL0Rpc2FibGUgVUJXQyBpZiBFenR1bmUgaXMgZW5hYmxlZAorICAgIC8vIEV6dHVuZSB3b3JrcyBvbiBDUFAgb3V0cHV0IGFuZCBjYW5ub3QgdW5kZXJzdGFuZCBVQldDIGJ1ZmZlci4KKyAgICBtZW1zZXQodmFsdWUsIDAsIHNpemVvZih2YWx1ZSkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuZXp0dW5lLmVuYWJsZSIsIHZhbHVlLCAiMCIpOworICAgIHByb3BfdmFsdWUgPSBhdG9pKHZhbHVlKTsKKyAgICBpZiAocHJvcF92YWx1ZSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworI2Vsc2UKKyAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc1Bvc3RQcm9jU2NhbGluZworICoKKyAqIERFU0NSSVBUSU9OOiBpcyBzY2FsaW5nIHRvIGJlIGRvbmUgYnkgQ1BQPworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IFRSVUUgIDogSWYgQ1BQIHNjYWxpbmcgZW5hYmxlZAorICogICAgICAgICAgICAgIEZBTFNFIDogSWYgVkZFIHNjYWxpbmcgZW5hYmxlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjppc1Bvc3RQcm9jU2NhbGluZygpCit7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGJvb2wgY3BwX3NjYWxpbmcgPSBGQUxTRTsKKworICAgIGlmIChnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5wcF9zY2FsaW5nIiwgdmFsdWUsICIwIik7CisgICAgY3BwX3NjYWxpbmcgPSBhdG9pKHZhbHVlKSA+IDAgPyBUUlVFIDogRkFMU0U7CisKKyAgICBMT0dIKCJQb3N0IHByb2Mgc2NhbGluZyBlbmFibGVkIDogJWQiLAorICAgICAgICAgICAgIGNwcF9zY2FsaW5nKTsKKyAgICByZXR1cm4gY3BwX3NjYWxpbmc7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNMTE5vaXNlRW5hYmxlZAorICoKKyAqIERFU0NSSVBUSU9OOiBMb3cgbGlnaHQgbm9pc2UgY2hhbmdlCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogVFJVRSAgOiBJZiBsb3cgbGlnaHQgbm9pc2UgZW5hYmxlZAorICogICAgICAgICAgICAgIEZBTFNFIDogSWYgbG93IGxpZ2h0IG5vaXNlIGRpc2FibGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnM6OmlzTExOb2lzZUVuYWJsZWQoKQoreworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBib29sIGxsbm9pc2UgPSBGQUxTRTsKKworICAgIGlmICghaXNXTlJFbmFibGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEubGxub2lzZSIsIHZhbHVlLCAiMCIpOworICAgIGxsbm9pc2UgPSBhdG9pKHZhbHVlKSA+IDAgPyBUUlVFIDogRkFMU0U7CisKKyAgICBMT0dIKCJMb3cgbGlnaHQgbm9pc2UgZW5hYmxlZCA6ICVkIiwKKyAgICAgICAgICAgICBsbG5vaXNlKTsKKyAgICByZXR1cm4gbGxub2lzZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRCdWZCYXRjaENvdW50CisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIHRvIGNvbmZpZ3VyZSBiYXRjaCBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDogaW50OF90IGJ1Zl9jbnQKKyAqICAgICAgICAgICAgICAgICAgICAgQnVmZmVyIGJhdGNoIGNvdW50CisgKgorICogUkVUVVJOICAgICA6ICBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEJ1ZkJhdGNoQ291bnQoaW50OF90IGJ1Zl9jbnQpCit7CisgICAgbUJ1ZkJhdGNoQ250ID0gMDsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaW50OF90IGNvdW50ID0gMDsKKworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuYmF0Y2hjb3VudCIsIHZhbHVlLCAiMCIpOworICAgIGNvdW50ID0gYXRvaSh2YWx1ZSk7CisKKyAgICBpZiAoIShjb3VudCAhPSAwIHx8IGJ1Zl9jbnQgPiBDQU1FUkFfTUlOX0JBVENIX0NPVU5UKSkgeworICAgICAgICBMT0dIKCJCdWZmZXIgYmF0Y2ggY291bnQgPSAlZCIsIG1CdWZCYXRjaENudCk7CisgICAgICAgIHNldChLRVlfUUNfVklERU9fQkFUQ0hfU0laRSwgbUJ1ZkJhdGNoQ250KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlKChtX3BDYXBhYmlsaXR5LT5tYXhfYmF0Y2hfYnVmc19zdXBwb3J0ZWQgIT0gMCkKKyAgICAgICAgICAgICYmIChtX3BDYXBhYmlsaXR5LT5tYXhfYmF0Y2hfYnVmc19zdXBwb3J0ZWQgPCBidWZfY250KSkgeworICAgICAgICBidWZfY250ID0gYnVmX2NudCAvIDI7CisgICAgfQorCisgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICBtQnVmQmF0Y2hDbnQgPSBjb3VudDsKKyAgICAgICAgTE9HSCgiQnVmZmVyIGJhdGNoIGNvdW50ID0gJWQiLCBtQnVmQmF0Y2hDbnQpOworICAgICAgICBzZXQoS0VZX1FDX1ZJREVPX0JBVENIX1NJWkUsIG1CdWZCYXRjaENudCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYnVmX2NudCA+IENBTUVSQV9NSU5fQkFUQ0hfQ09VTlQpIHsKKyAgICAgICAgbUJ1ZkJhdGNoQ250ID0gYnVmX2NudDsKKyAgICAgICAgTE9HSCgiQnVmZmVyIGJhdGNoIGNvdW50ID0gJWQiLCBtQnVmQmF0Y2hDbnQpOworICAgICAgICBzZXQoS0VZX1FDX1ZJREVPX0JBVENIX1NJWkUsIG1CdWZCYXRjaENudCk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0VmlkZW9CYXRjaCgpCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIHRvIGJhdGNoaW5nIGZvciB2aWRlby4KKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiAgTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRWaWRlb0JhdGNoU2l6ZSgpCit7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGludDhfdCBtaW5CYXRjaGNudCA9IDI7IC8vQmF0Y2hpbmcgZW5hYmxlZCBvbmx5IGlmIGJhdGNoIHNpemUgaWYgZ3JlYXRlciB0aGFuIDI7CisgICAgaW50MzJfdCB3aWR0aCA9IDAsIGhlaWdodCA9IDA7CisgICAgbVZpZGVvQmF0Y2hTaXplID0gMDsKKworICAgIGlmIChnZXRCdWZCYXRjaENvdW50KCkpIHsKKyAgICAgICAgLy9XZSBkb24ndCBuZWVkIEhBTCB0byBIQUwgYmF0Y2hpbmcgaWYgY2FtZXJhIGJhdGNoaW5nIGVuYWJsZWQuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBnZXRWaWRlb1NpemUoJndpZHRoLCAmaGVpZ2h0KTsKKyAgICBpZiAoKHdpZHRoID4gMTkyMCkgfHwgKGhlaWdodCA+IDEwODApKSB7CisgICAgICAgIC8vQ2Fubm90IGVuYWJsZSBiYXRjaCBtb2RlIGZvciB2aWRlbyBzaXplIGJpZ2dlciB0aGFuIDEwODBwCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL0JhdGNoIHNpemUgIjYiIGlzIHRoZSByZWNvbW1lbmRlZCBhbmQgZ2l2ZXMgb3B0aW1hbCBwb3dlciBzYXZpbmcuCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS52aWRlby5iYXRjaHNpemUiLCB2YWx1ZSwgIjAiKTsKKyAgICBtVmlkZW9CYXRjaFNpemUgPSBhdG9pKHZhbHVlKTsKKworICAgIGlmIChtVmlkZW9CYXRjaFNpemUgPiBDQU1FUkFfTUFYX0NPTlNVTUVSX0JBVENIX0JVRkZFUl9TSVpFKSB7CisgICAgICAgIG1WaWRlb0JhdGNoU2l6ZSA9IENBTUVSQV9NQVhfQ09OU1VNRVJfQkFUQ0hfQlVGRkVSX1NJWkU7CisgICAgfSBlbHNlIGlmIChtVmlkZW9CYXRjaFNpemUgPD0gbWluQmF0Y2hjbnQpIHsKKyAgICAgICAgLy9CYXRjaGluZyBlbmFibGVkIG9ubHkgaWYgYmF0Y2ggc2l6ZSBpcyBncmVhdGVyIHRoYW4gMi4KKyAgICAgICAgbVZpZGVvQmF0Y2hTaXplID0gMDsKKyAgICB9CisgICAgTE9HRCgibVZpZGVvQmF0Y2hTaXplID0gJWQiLCBtVmlkZW9CYXRjaFNpemUpOworICAgIHNldChLRVlfUUNfVklERU9fQkFUQ0hfU0laRSwgbVZpZGVvQmF0Y2hTaXplKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRDdXN0b21QYXJhbXMKKyAqCisgKiBERVNDUklQVElPTjogRnVuY3Rpb24gdG8gdXBkYXRlIE9FTSBzcGVjaWZpYyBjdXN0b20gcGFyYW1ldGVyCisgKgorICogUEFSQU1FVEVSUyA6IHBhcmFtczogSW5wdXQgUGFyYW1ldGVyIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiAgZXJyb3IgdmFsdWUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0Q3VzdG9tUGFyYW1zKF9fdW51c2VkIGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgLyogQXBwbGljYXRpb24gc3BlY2lmaWMgcGFyYW1ldGVyIGNhbiBiZSByZWFkIGZyb20gInBhcmFtcyIgYW5kIHVwZGF0ZSBtX3BQYXJhbUJ1ZgorICAgICAgIFdlIGNhbiBhbHNvIHVwZGF0ZSBpbnRlcm5hbCBPRU0gY3VzdG9tIHBhcmFtZXRlcnMgaW4gdGhpcyBmdW5jaW9uLgorICAgICAgICJDQU1fQ1VTVE9NX1BBUk1fRVhBTVBMRSIgaXMgdXNlZCBhcyBhIGV4YW1wbGUgKi8KKworICAgIC8qR2V0IHRoZSBwb2ludGVyIG9mIHNoYXJlZCBidWZmZXIgZm9yIGN1c3RvbSBwYXJhbWV0ZXIqLworICAgIGN1c3RvbV9wYXJtX2J1ZmZlcl90ICpjdXN0b21QYXJhbSA9CisgICAgICAgICAgICAoY3VzdG9tX3Bhcm1fYnVmZmVyX3QgKilQT0lOVEVSX09GX01FVEEoQ0FNX0lOVEZfUEFSTV9DVVNUT00sIG1fcFBhcmFtQnVmKTsKKworCisgICAgLypzdGFydCB1cGRhdGluZyBjdXN0b20gcGFyYW1ldGVyIHZhbHVlcyovCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goY3VzdG9tUGFyYW0sIENBTV9DVVNUT01fUEFSTV9FWEFNUExFLCAxKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gdXBkYXRlIENBTV9DVVNUT01fUEFSTV9EVU1NWSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8qc2V0IGN1c3RvbSBwYXJhbWV0ZXIgdmFsdWVzIHRvIG1haW4gcGFyYW1ldGVyIGJ1ZmZlci4gVXBkYXRlIGlzdmFsaWQgZmxhZyovCisgICAgQUREX0dFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwgQ0FNX0lOVEZfUEFSTV9DVVNUT00pOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGR1bXAKKyAqCisgKiBERVNDUklQVElPTjogQ29tcG9zZXMgYSBzdHJpbmcgYmFzZWQgb24gY3VycmVudCBjb25maWd1cmF0aW9uCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogRm9ybWF0dGVkIHN0cmluZworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitTdHJpbmc4IFFDYW1lcmFQYXJhbWV0ZXJzOjpkdW1wKCkKK3sKKyAgICBTdHJpbmc4IHN0cigiXG4iKTsKKyAgICBjaGFyIHNbMTI4XTsKKworICAgIHNucHJpbnRmKHMsIDEyOCwgIlByZXZpZXcgUGl4ZWwgRm10OiAlZFxuIiwgZ2V0UHJldmlld0hhbFBpeGVsRm9ybWF0KCkpOworICAgIHN0ciArPSBzOworCisgICAgc25wcmludGYocywgMTI4LCAiWlNMIEJ1cnN0IEludGVydmFsOiAlZFxuIiwgZ2V0WlNMQnVyc3RJbnRlcnZhbCgpKTsKKyAgICBzdHIgKz0gczsKKworICAgIHNucHJpbnRmKHMsIDEyOCwgIlpTTCBRdWV1ZSBEZXB0aDogJWRcbiIsIGdldFpTTFF1ZXVlRGVwdGgoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJaU0wgQmFjayBMb29rIENvdW50ICVkXG4iLCBnZXRaU0xCYWNrTG9va0NvdW50KCkpOworICAgIHN0ciArPSBzOworCisgICAgc25wcmludGYocywgMTI4LCAiTWF4IFVubWF0Y2hlZCBGcmFtZXMgSW4gUXVldWU6ICVkXG4iLAorICAgICAgICBnZXRNYXhVbm1hdGNoZWRGcmFtZXNJblF1ZXVlKCkpOworICAgIHN0ciArPSBzOworCisgICAgc25wcmludGYocywgMTI4LCAiSXMgWlNMIE1vZGU6ICVkXG4iLCBpc1pTTE1vZGUoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJJcyBObyBEaXNwbGF5IE1vZGU6ICVkXG4iLCBpc05vRGlzcGxheU1vZGUoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJJcyBXTlIgRW5hYmxlZDogJWRcbiIsIGlzV05SRW5hYmxlZCgpKTsKKyAgICBzdHIgKz0gczsKKworICAgIHNucHJpbnRmKHMsIDEyOCwgImlzSGZyTW9kZTogJWRcbiIsIGlzSGZyTW9kZSgpKTsKKyAgICBzdHIgKz0gczsKKworICAgIHNucHJpbnRmKHMsIDEyOCwgImdldE51bU9mU25hcHNob3RzOiAlZFxuIiwgZ2V0TnVtT2ZTbmFwc2hvdHMoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJnZXROdW1PZkV4dHJhSERSSW5CdWZzSWZOZWVkZWQ6ICVkXG4iLAorICAgICAgICBnZXROdW1PZkV4dHJhSERSSW5CdWZzSWZOZWVkZWQoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJnZXROdW1PZkV4dHJhSERST3V0QnVmc0lmTmVlZGVkOiAlZFxuIiwKKyAgICAgICAgZ2V0TnVtT2ZFeHRyYUhEUk91dEJ1ZnNJZk5lZWRlZCgpKTsKKyAgICBzdHIgKz0gczsKKworICAgIHNucHJpbnRmKHMsIDEyOCwgImdldFJlY29yZGluZ0hpbnRWYWx1ZTogJWRcbiIsIGdldFJlY29yZGluZ0hpbnRWYWx1ZSgpKTsKKyAgICBzdHIgKz0gczsKKworICAgIHNucHJpbnRmKHMsIDEyOCwgImdldEpwZWdRdWFsaXR5OiAldVxuIiwgZ2V0SnBlZ1F1YWxpdHkoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJnZXRKcGVnUm90YXRpb246ICV1XG4iLCBnZXRKcGVnUm90YXRpb24oKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJpc0hpc3RvZ3JhbUVuYWJsZWQ6ICVkXG4iLCBpc0hpc3RvZ3JhbUVuYWJsZWQoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJpc0ZhY2VEZXRlY3Rpb25FbmFibGVkOiAlZFxuIiwgaXNGYWNlRGV0ZWN0aW9uRW5hYmxlZCgpKTsKKyAgICBzdHIgKz0gczsKKworICAgIHNucHJpbnRmKHMsIDEyOCwgImlzSERSRW5hYmxlZDogJWRcbiIsIGlzSERSRW5hYmxlZCgpKTsKKyAgICBzdHIgKz0gczsKKworICAgIHNucHJpbnRmKHMsIDEyOCwgImlzQXV0b0hEUkVuYWJsZWQ6ICVkXG4iLCBpc0F1dG9IRFJFbmFibGVkKCkpOworICAgIHN0ciArPSBzOworCisgICAgc25wcmludGYocywgMTI4LCAiaXNBVlRpbWVyRW5hYmxlZDogJWRcbiIsIGlzQVZUaW1lckVuYWJsZWQoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJnZXRGb2N1c01vZGU6ICVkXG4iLCBnZXRGb2N1c01vZGUoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJpc0pwZWdQaWN0dXJlRm9ybWF0OiAlZFxuIiwgaXNKcGVnUGljdHVyZUZvcm1hdCgpKTsKKyAgICBzdHIgKz0gczsKKworICAgIHNucHJpbnRmKHMsIDEyOCwgImlzTlYxNlBpY3R1cmVGb3JtYXQ6ICVkXG4iLCBpc05WMTZQaWN0dXJlRm9ybWF0KCkpOworICAgIHN0ciArPSBzOworCisgICAgc25wcmludGYocywgMTI4LCAiaXNOVjIxUGljdHVyZUZvcm1hdDogJWRcbiIsIGlzTlYyMVBpY3R1cmVGb3JtYXQoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJpc1NuYXBzaG90RkROZWVkZWQ6ICVkXG4iLCBpc1NuYXBzaG90RkROZWVkZWQoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJpc0hEUjF4RnJhbWVFbmFibGVkOiAlZFxuIiwgaXNIRFIxeEZyYW1lRW5hYmxlZCgpKTsKKyAgICBzdHIgKz0gczsKKworICAgIHNucHJpbnRmKHMsIDEyOCwgImlzWVVWRnJhbWVJbmZvTmVlZGVkOiAlZFxuIiwgaXNZVVZGcmFtZUluZm9OZWVkZWQoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJpc0hEUjF4RXh0cmFCdWZmZXJOZWVkZWQ6ICVkXG4iLAorICAgICAgICBpc0hEUjF4RXh0cmFCdWZmZXJOZWVkZWQoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJpc0hEUk91dHB1dENyb3BFbmFibGVkOiAlZFxuIiwgaXNIRFJPdXRwdXRDcm9wRW5hYmxlZCgpKTsKKyAgICBzdHIgKz0gczsKKworICAgIHNucHJpbnRmKHMsIDEyOCwgImlzUHJldmlld0ZsaXBDaGFuZ2VkOiAlZFxuIiwgaXNQcmV2aWV3RmxpcENoYW5nZWQoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJpc1ZpZGVvRmxpcENoYW5nZWQ6ICVkXG4iLCBpc1ZpZGVvRmxpcENoYW5nZWQoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJpc1NuYXBzaG90RmxpcENoYW5nZWQ6ICVkXG4iLCBpc1NuYXBzaG90RmxpcENoYW5nZWQoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJpc0hEUlRodW1ibmFpbFByb2Nlc3NOZWVkZWQ6ICVkXG4iLAorICAgICAgICBpc0hEUlRodW1ibmFpbFByb2Nlc3NOZWVkZWQoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJnZXRBdXRvRmxpY2tlck1vZGU6ICVkXG4iLCBnZXRBdXRvRmxpY2tlck1vZGUoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJnZXROdW1PZkV4dHJhQnVmZmVyc0ZvckltYWdlUHJvYzogJWRcbiIsCisgICAgICAgIGdldE51bU9mRXh0cmFCdWZmZXJzRm9ySW1hZ2VQcm9jKCkpOworICAgIHN0ciArPSBzOworCisgICAgc25wcmludGYocywgMTI4LCAiaXNVYmlGb2N1c0VuYWJsZWQ6ICVkXG4iLCBpc1ViaUZvY3VzRW5hYmxlZCgpKTsKKyAgICBzdHIgKz0gczsKKworICAgIHNucHJpbnRmKHMsIDEyOCwgImlzQ2hyb21hRmxhc2hFbmFibGVkOiAlZFxuIiwgaXNDaHJvbWFGbGFzaEVuYWJsZWQoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJpc09wdGlab29tRW5hYmxlZDogJWRcbiIsIGlzT3B0aVpvb21FbmFibGVkKCkpOworICAgIHN0ciArPSBzOworCisgICAgc25wcmludGYocywgMTI4LCAiaXNTdGlsbE1vcmVFbmFibGVkOiAlZFxuIiwgaXNTdGlsbE1vcmVFbmFibGVkKCkpOworICAgIHN0ciArPSBzOworCisgICAgc25wcmludGYocywgMTI4LCAiZ2V0QnVyc3RDb3VudEZvckFkdmFuY2VkQ2FwdHVyZTogJWRcbiIsCisgICAgICAgIGdldEJ1cnN0Q291bnRGb3JBZHZhbmNlZENhcHR1cmUoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICByZXR1cm4gc3RyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldE51bU9mRXh0cmFCdWZmZXJzRm9yVmlkZW8KKyAqCisgKiBERVNDUklQVElPTjogZ2V0IG51bWJlciBvZiBleHRyYSBidWZmZXJzIG5lZWRlZCBieSBpbWFnZSBwcm9jZXNzaW5nCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbnVtYmVyIG9mIGV4dHJhIGJ1ZmZlcnMgbmVlZGVkIGJ5IEltYWdlUHJvYzsKKyAqICAgICAgICAgICAgICAwIGlmIG5vdCBJbWFnZVByb2MgZW5hYmxlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50OF90IFFDYW1lcmFQYXJhbWV0ZXJzOjpnZXROdW1PZkV4dHJhQnVmZmVyc0ZvclZpZGVvKCkKK3sKKyAgICB1aW50OF90IG51bU9mQnVmcyA9IDA7CisKKyAgICBpZiAoaXNTZWVNb3JlRW5hYmxlZCgpIHx8IGlzSGlnaFF1YWxpdHlOb2lzZVJlZHVjdGlvbk1vZGUoKSkgeworICAgICAgICBudW1PZkJ1ZnMgPSAxOworICAgIH0KKworICAgIHJldHVybiBudW1PZkJ1ZnM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JQcmV2aWV3CisgKgorICogREVTQ1JJUFRJT046IGdldCBudW1iZXIgb2YgZXh0cmEgYnVmZmVycyBuZWVkZWQgYnkgaW1hZ2UgcHJvY2Vzc2luZworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG51bWJlciBvZiBleHRyYSBidWZmZXJzIG5lZWRlZCBieSBJbWFnZVByb2M7CisgKiAgICAgICAgICAgICAgMCBpZiBub3QgSW1hZ2VQcm9jIGVuYWJsZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDhfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JQcmV2aWV3KCkKK3sKKyAgICB1aW50OF90IG51bU9mQnVmcyA9IDA7CisKKyAgICBpZiAoKGlzU2VlTW9yZUVuYWJsZWQoKSB8fCBpc0hpZ2hRdWFsaXR5Tm9pc2VSZWR1Y3Rpb25Nb2RlKCkpCisgICAgICAgICAgICAmJiAhaXNaU0xNb2RlKCkgJiYgZ2V0UmVjb3JkaW5nSGludFZhbHVlKCkpIHsKKyAgICAgICAgbnVtT2ZCdWZzID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gbnVtT2ZCdWZzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFRvbmVNYXBNb2RlCisgKgorICogREVTQ1JJUFRJT046IGVuYWJsZSBvciBkaXNhYmxlIHRvbmUgbWFwCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBlbmFibGUgOiBlbmFibGU6IDE7IGRpc2FibGUgMAorICogICBAaW5pdENvbW1pdDogaWYgY29uZmlndXJhdGlvbiBsaXN0IG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGFuZCBjb21taXRlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldFRvbmVNYXBNb2RlKHVpbnQzMl90IGVuYWJsZSwgYm9vbCBpbml0Q29tbWl0KQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBMT0dIKCJ0b25lIG1hcCBtb2RlICVkICIsIGVuYWJsZSk7CisKKyAgICBpZiAoaW5pdENvbW1pdCkgeworICAgICAgICBpZiAoaW5pdEJhdGNoVXBkYXRlKG1fcFBhcmFtQnVmKSA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGdyb3VwIHVwZGF0ZSB0YWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLCBDQU1fSU5URl9QQVJNX1RPTkVfTUFQX01PREUsIGVuYWJsZSkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHVwZGF0ZSB0b25lIG1hcCBtb2RlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKGluaXRDb21taXQpIHsKKyAgICAgICAgcmMgPSBjb21taXRTZXRCYXRjaCgpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBjb21taXQgdG9uZSBtYXAgbW9kZSIpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldExvbmdzaG90U3RhZ2VzCisgKgorICogREVTQ1JJUFRJT046IGdldCBudW1iZXIgb2Ygc3RhZ2VzIGZvciBsb25nc2hvdAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG51bWJlciBvZiBzdGFnZXMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDhfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0TG9uZ3Nob3RTdGFnZXMoKQoreworICAgIHVpbnQ4X3QgbnVtU3RhZ2VzID0KKyAgICAgICAgICAgIGlzTG93TWVtb3J5RGV2aWNlKCkgPyBDQU1FUkFfTUlOX0xPTkdTSE9UX1NUQUdFUyA6IENBTUVSQV9ERUZBVUxUX0xPTkdTSE9UX1NUQUdFUzsKKworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEubG9uZ3Nob3Quc3RhZ2VzIiwgcHJvcCwgIjAiKTsKKyAgICB1aW50OF90IHByb3BTdGFnZXMgPSBhdG9pKHByb3ApOworICAgIGlmIChwcm9wU3RhZ2VzID4gMCAmJiBwcm9wU3RhZ2VzIDw9IENBTUVSQV9ERUZBVUxUX0xPTkdTSE9UX1NUQUdFUykgeworICAgICAgICBudW1TdGFnZXMgPSBwcm9wU3RhZ2VzOworICAgIH0KKyAgICByZXR1cm4gbnVtU3RhZ2VzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldENEU01vZGUKKyAqCisgKiBERVNDUklQVElPTjogc2V0IENEUyBtb2RlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjZHNfbW9kZSA6IGNkcyBtb2RlCisgKiAgIEBpbml0Q29tbWl0OiBpZiBjb25maWd1cmF0aW9uIGxpc3QgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgYW5kIGNvbW1pdGVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0Q0RTTW9kZShpbnQzMl90IGNkc19tb2RlLCBib29sIGluaXRDb21taXQpCit7CisgICAgaWYgKGluaXRDb21taXQpIHsKKyAgICAgICAgaWYgKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fQ0RTX01PREUsIGNkc19tb2RlKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gdXBkYXRlIGNkcyBtb2RlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKGluaXRDb21taXQpIHsKKyAgICAgICAgcmMgPSBjb21taXRTZXRCYXRjaCgpOworICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgY2RzIG1vZGUiKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR0goImNkcyBtb2RlIC0+ICVkIiwgY2RzX21vZGUpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldExvd0xpZ2h0Q2FwdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiB0byBlbmFibGUgbG93IGxpZ2h0IGNhcHR1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0TG93TGlnaHRDYXB0dXJlKCkKK3sKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBtZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmxsYyIsIHByb3AsICIwIik7CisgICAgbV9MTENhcHR1cmVFbmFibGVkID0gKGF0b2kocHJvcCkgPiAwKSA/IFRSVUUgOiBGQUxTRTsKKworICAgIGlmICghbV9MTENhcHR1cmVFbmFibGVkKSB7CisgICAgICAgIG1fTG93TGlnaHRMZXZlbCA9IENBTV9MT1dfTElHSFRfT0ZGOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBmZE1vZGVJblZpZGVvCisgKgorICogREVTQ1JJUFRJT046IEZEIGluIFZpZGVvIGNoYW5nZQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IEZEIE1vZGUgaW4gVmlkZW8KKyAqICAgICAgICAgICAgICAwIDogSWYgRkQgaW4gVmlkZW8gZGlzYWJsZWQKKyAqICAgICAgICAgICAgICAxIDogSWYgRkQgaW4gVmlkZW8gZW5hYmxlZCBmb3IgRGV0ZWN0aW9uLCBmb2N1cworICogICAgICAgICAgICAgIDIgOiBJZiBGRCBpbiBWaWRlbyBlbmFibGVkIG9ubHkgZm9yIGZvY3VzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnM6OmZkTW9kZUluVmlkZW8oKQoreworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICB1aW50OF90IGZkdmlkZW8gPSAwOworCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5mZHZpZGVvIiwgdmFsdWUsICIwIik7CisgICAgZmR2aWRlbyA9IChhdG9pKHZhbHVlKSA+IDApID8gYXRvaSh2YWx1ZSkgOiAwOworCisgICAgTE9HRCgiRkQgbW9kZSBpbiBWaWRlbyA6ICVkIiwgZmR2aWRlbyk7CisgICAgcmV0dXJuIGZkdmlkZW87Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0TWFudWFsQ2FwdHVyZU1vZGUKKyAqCisgKiBERVNDUklQVElPTjogRnVuY3Rpb24gdG8gc2V0IE1hbnVhbCBjYXB0dXJlIG1vZGVzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtb2RlIDogQ2FwdHVyZSBtb2RlIGNvbmZpZ3VyZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXRNYW51YWxDYXB0dXJlTW9kZShRQ2FtZXJhTWFudWFsQ2FwdHVyZU1vZGVzIG1vZGUpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpbnQ4X3QgY291bnQgPSAwOworCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5tYW51YWwuY2FwdHVyZSIsIHZhbHVlLCAiMCIpOworICAgIGNvdW50ID0gYXRvaSh2YWx1ZSk7CisKKyAgICBpZiAoY291bnQpIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gQ0FNX01BTlVBTF9DQVBUVVJFX1RZUEVfT0ZGKSB7CisgICAgICAgICAgICBtX01hbnVhbENhcHR1cmVNb2RlID0gQ0FNX01BTlVBTF9DQVBUVVJFX1RZUEVfMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fTWFudWFsQ2FwdHVyZU1vZGUgPSBtb2RlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9NYW51YWxDYXB0dXJlTW9kZSA9IENBTV9NQU5VQUxfQ0FQVFVSRV9UWVBFX09GRjsKKyAgICB9CisKKyAgICBpZiAobV9NYW51YWxDYXB0dXJlTW9kZSA9PSBDQU1fTUFOVUFMX0NBUFRVUkVfVFlQRV8yKSB7CisgICAgICAgIHNldE9mZmxpbmVSQVcoRkFMU0UpOworICAgIH0gZWxzZSBpZiAobV9NYW51YWxDYXB0dXJlTW9kZSA+PSBDQU1fTUFOVUFMX0NBUFRVUkVfVFlQRV8zKSB7CisgICAgICAgIHNldE9mZmxpbmVSQVcoVFJVRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0T2ZmbGluZVJBVyhGQUxTRSk7CisgICAgfQorICAgIHNldFJlcHJvY0NvdW50KCk7CisgICAgTE9HSCgiTWFudWFsIGNhcHR1cmUgbW9kZSAtICVkIiwgbV9NYW51YWxDYXB0dXJlTW9kZSk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzUmVwcm9jU2NhbGVFbmFibGVkCisgKgorICogREVTQ1JJUFRJT046IFdoZXRoZXIgcmVwcm9jZXNzIHNjYWxlIGlzIGVuYWJsZWQgb3Igbm90CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogVFJVRSAgOiBSZXByb2Nlc3Mgc2NhbGUgaXMgZW5hYmxlZAorICogICAgICAgICAgICAgIEZBTFNFIDogUmVwcm9jZXNzIHNjYWxlIGlzIG5vdCBlbmFibGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnM6OmlzUmVwcm9jU2NhbGVFbmFibGVkKCkKK3sKKyAgICByZXR1cm4gbV9yZXByb2NTY2FsZVBhcmFtLmlzU2NhbGVFbmFibGVkKCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNVbmRlclJlcHJvY1NjYWxpbmcKKyAqCisgKiBERVNDUklQVElPTjogV2hldGhlciBpbWFnZSBpcyB1bmRlciByZXByb2Nlc3Mgc2NhbGluZworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IFRSVUUgIDogSW1hZ2UgaXMgdW5kZXIgcmVwcm9jZXNzIHNjYWxpbmcKKyAqICAgICAgICAgICAgICBGQUxTRSA6IEltYWdlIGlzIG5vdCB1bmRlciByZXByb2Nlc3Mgc2NhbGluZworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzOjppc1VuZGVyUmVwcm9jU2NhbGluZygpCit7CisgICAgcmV0dXJuIG1fcmVwcm9jU2NhbGVQYXJhbS5pc1VuZGVyU2NhbGluZygpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFBpY1NpemVGcm9tQVBLCisgKgorICogREVTQ1JJUFRJT046IEdldCBwaWN0dXJlIHNpemUgc2V0IGZyb20gYXBwbGljYXRpb24uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB3aWR0aCAgIDogd2l0aCBzZXQgYnkgYXBwbGljYXRpb24KKyAqICAgQGhlaWdodCAgOiBoZWlnaHQgc2V0IGJ5IGFwcGxpY2F0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0UGljU2l6ZUZyb21BUEsoaW50ICZ3aWR0aCwgaW50ICZoZWlnaHQpCit7CisgICAgcmV0dXJuIG1fcmVwcm9jU2NhbGVQYXJhbS5nZXRQaWNTaXplRnJvbUFQSyh3aWR0aCwgaGVpZ2h0KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXREdWFsTGVkQ2FsaWJyYXRpb24KKyAqCisgKiBERVNDUklQVElPTjogc2V0IGR1YWwgbGVkIGNhbGlicmF0aW9uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogdXNlciBzZXR0aW5nIHBhcmFtZXRlcnMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzOjpzZXREdWFsTGVkQ2FsaWJyYXRpb24oCisgICAgICAgIF9fdW51c2VkIGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpCit7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGludDMyX3QgY2FsaWJyYXRpb24gPSAwOworCisgICAgbWVtc2V0KHZhbHVlLCAwLCBzaXplb2YodmFsdWUpKTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmR1YWxfbGVkX2NhbGliIiwgdmFsdWUsICIwIik7CisgICAgY2FsaWJyYXRpb24gPSBhdG9pKHZhbHVlKTsKKyAgICBpZiAoY2FsaWJyYXRpb24gIT0gbV9kdWFsTGVkQ2FsaWJyYXRpb24pIHsKKyAgICAgIG1fZHVhbExlZENhbGlicmF0aW9uID0gY2FsaWJyYXRpb247CisgICAgICBMT0dEKCIlczp1cGRhdGluZyBjYWxpYnJhdGlvbj0lZCBtX2R1YWxMZWRDYWxpYnJhdGlvbj0lZCIsCisgICAgICAgIF9fZnVuY19fLCBjYWxpYnJhdGlvbiwgbV9kdWFsTGVkQ2FsaWJyYXRpb24pOworCisgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtX3BQYXJhbUJ1ZiwKKyAgICAgICAgICAgICAgIENBTV9JTlRGX1BBUk1fRFVBTF9MRURfQ0FMSUJSQVRJT04sCisgICAgICAgICAgICAgICBtX2R1YWxMZWRDYWxpYnJhdGlvbikpIHsKKyAgICAgICAgICBMT0dFKCIlczpGYWlsZWQgdG8gdXBkYXRlIGR1YWwgbGVkIGNhbGlicmF0aW9uIHBhcmFtIiwgX19mdW5jX18pOworICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRpbnN0YW50QUVDCisgKgorICogREVTQ1JJUFRJT046IHNldCBpbnN0YW50IEFFQyB2YWx1ZSB0byBiYWNrZW5kCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB2YWx1ZSA6IGluc3RhbnQgYWVjIGVuYWJsZWQgb3Igbm90LgorICogICAgICAgICAgICAwIC0gZGlzYWJsZQorICogICAgICAgICAgICAxIC0gRW5hYmxlIGFuZCBzZXQgYWdyZXNzaXZlIEFFQyBhbGdvIHRvIHRoZSBiYWNrZW5kCisgKiAgICAgICAgICAgIDIgLSBFbmFibGUgYW5kIHNldCBmYXN0IEFFQyBhbGdvIHRvIHRoZSBiYWNrZW5kCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6c2V0SW5zdGFudEFFQyh1aW50OF90IHZhbHVlLCBib29sIGluaXRDb21taXQpCit7CisgICAgaWYgKGluaXRDb21taXQpIHsKKyAgICAgICAgaWYgKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsIENBTV9JTlRGX1BBUk1fSU5TVEFOVF9BRUMsIHZhbHVlKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5zdGFudCBhZWMgdmFsdWUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoaW5pdENvbW1pdCkgeworICAgICAgICByYyA9IGNvbW1pdFNldEJhdGNoKCk7CisgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGluc3RhbnQgYWVjIHZhbHVlIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dEKCIgSW5zdGFudCBBRUMgdmFsdWUgc2V0IHRvIGJhY2tlbmQgJWQiLCB2YWx1ZSk7CisgICAgbV9iSW5zdGFudEFFQyA9IHZhbHVlOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRBZHZhbmNlZENhcHR1cmVNb2RlCisgKgorICogREVTQ1JJUFRJT046IHNldCBhZHZhbmNlZCBjYXB0dXJlIG1vZGUKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OnNldEFkdmFuY2VkQ2FwdHVyZU1vZGUoKQoreworICAgIHVpbnQ4X3QgdmFsdWUgPSBpc0FkdkNhbUZlYXR1cmVzRW5hYmxlZCgpOworICAgIExPR0QoInVwZGF0aW5nIGFkdmFuY2VkIGNhcHR1cmUgbW9kZSB2YWx1ZSB0byAlZCIsdmFsdWUpOworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9BRFZfQ0FQVFVSRV9NT0RFLCB2YWx1ZSkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBhZHZhbmNlZCBjYXB0dXJlIG1vZGUgcGFyYW0iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEFuYWx5c2lzSW5mbworICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgdGhlIEFuYWx5c2lzIGluZm9ybWF0aW9uIGJhc2VkIG9uCisgKiAgICAgY3VycmVudCBtb2RlIGFuZCBmZWF0dXJlIG1hc2sKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZkVmlkZW9FbmFibGVkIDogV2hldGhlciBmZFZpZGVvIGVuYWJsZWQgY3VycmVudGx5CisgKiAgIEB2aWRlb0VuYWJsZWQgICA6IFdoZXRoZXIgaGFsMyBvciBoYWwxCisgKiAgIEBmZWF0dXJlTWFzayAgICA6IEZlYXR1cmUgbWFzaworICogICBAYW5hbHlzaXNfaW5mbyAgOiBBbmFseXNpcyBpbmZvIHRvIGJlIGZpbGxlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnM6OmdldEFuYWx5c2lzSW5mbygKKyAgICAgICAgYm9vbCBmZFZpZGVvRW5hYmxlZCwKKyAgICAgICAgYm9vbCBoYWwzLAorICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgZmVhdHVyZU1hc2ssCisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3QgKnBBbmFseXNpc0luZm8pCit7CisgICAgcmV0dXJuIG1Db21tb24uZ2V0QW5hbHlzaXNJbmZvKGZkVmlkZW9FbmFibGVkLCBoYWwzLCBmZWF0dXJlTWFzaywgcEFuYWx5c2lzSW5mbyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TWV0YVJhd0luZm8KKyAqCisgKiBERVNDUklQVElPTjogZmV0Y2ggbWV0YSByYXcgZGltZW5zaW9uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkaW0gIDogZ2V0IGRpbWVuc2lvbiBmb3IgbWV0YSByYXcgc3RyZWFtCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6Z2V0TWV0YVJhd0luZm8oKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBjYW1fZGltZW5zaW9uX3QgbWV0YV9zdHJlYW1fc2l6ZTsKKworICAgIGlmKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwICkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKworICAgIEFERF9HRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobV9wUGFyYW1CdWYsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX1JBVyk7CisKKyAgICByYyA9IGNvbW1pdEdldEJhdGNoKCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBnZXQgZXh0ZW5lZCBSQVcgaW5mbyIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgUkVBRF9QQVJBTV9FTlRSWShtX3BQYXJhbUJ1ZiwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfUkFXLCBtZXRhX3N0cmVhbV9zaXplKTsKKworICAgIGlmIChtZXRhX3N0cmVhbV9zaXplLndpZHRoID09IDAgfHwgbWV0YV9zdHJlYW1fc2l6ZS5oZWlnaHQgPT0gMCkgeworICAgICAgICBMT0dFKCJFcnJvciBnZXR0aW5nIFJBVyBzaXplLiBTZXR0aW5nIHRvIENhcGFiaWxpdHkgdmFsdWUiKTsKKyAgICAgICAgbWV0YV9zdHJlYW1fc2l6ZSA9IG1fcENhcGFiaWxpdHktPnJhd19tZXRhX2RpbVswXTsKKyAgICB9CisgICAgTE9HSCgiUkFXIG1ldGEgc2l6ZS4gd2lkdGggPSVkIGhlaWdodCA9JWQiLAorICAgICAgbWV0YV9zdHJlYW1fc2l6ZS53aWR0aCwgbWV0YV9zdHJlYW1fc2l6ZS5oZWlnaHQpOworCisgICAgc2V0UmF3U2l6ZShtZXRhX3N0cmVhbV9zaXplKTsKKyAgICBtX2JNZXRhUmF3RW5hYmxlZCA9IHRydWU7CisgICAgcmV0dXJuIHJjOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZW5kU3RyZWFtQ29uZmlnRm9yUGlja1JlcworICoKKyAqIERFU0NSSVBUSU9OOiBzZW5kIFN0cmVhbSBjb25maWcgaW5mby4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN0cmVhbV9jb25maWdfaW5mbzogU3RyZWFtIGNvbmZpZyBpbmZvcm1hdGlvbgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyczo6c2VuZFN0cmVhbUNvbmZpZ0ZvclBpY2tSZXMKKyAgICAoY2FtX3N0cmVhbV9zaXplX2luZm9fdCAmc3RyZWFtX2NvbmZpZ19pbmZvKSB7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGlmKGluaXRCYXRjaFVwZGF0ZShtX3BQYXJhbUJ1ZikgPCAwICkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBncm91cCB1cGRhdGUgdGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1fcFBhcmFtQnVmLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9TVFJFQU1fSU5GT19GT1JfUElDX1JFUywgc3RyZWFtX2NvbmZpZ19pbmZvKSkgeworICAgICAgICBMT0dFKCIlczpGYWlsZWQgdG8gdXBkYXRlIHRhYmxlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCgpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IHN0cmVhbSBpbmZvIHBhcm0iKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdXBkYXRlRHRWYworICoKKyAqIERFU0NSSVBUSU9OOiBVcGRhdGUgRFQgYW5kIFZjIGZyb20gY2FwYWJpbGl0aWVzCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyczo6dXBkYXRlRHRWYyhpbnQzMl90ICpkdCwgaW50MzJfdCAqdmMpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworCisgICAgaW50IGR0X3ZhbCA9IDA7CisgICAgaW50IHZjX3ZhbCA9IDA7CisKKyAgICAvKiBTZXR0aW5nIER0IGZyb20gc2V0cHJvcCBvciBjYXBhYmlsaXR5ICovCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5kdCIsIHByb3AsICIwIik7CisgICAgZHRfdmFsID0gYXRvaShwcm9wKTsKKyAgICBpZiAoZHRfdmFsID09IDApIHsKKyAgICAgICAgZHRfdmFsID0gbV9wQ2FwYWJpbGl0eS0+ZHRbMF07CisgICAgfQorICAgICpkdCA9IGR0X3ZhbDsKKworICAgIC8qU2V0dGluZyB2YyBmcm9tIHNldHByb3Agb3IgY2FwYWJpbGl0eSAqLworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEudmMiLCBwcm9wLCAiLTEiKTsKKyAgICB2Y192YWwgPSBhdG9pKHByb3ApOworICAgIGlmICh2Y192YWw9PSAtMSkgeworICAgICAgICB2Y192YWwgPSBtX3BDYXBhYmlsaXR5LT52Y1swXTsKKyAgICB9CisgICAgKnZjID0gdmNfdmFsOworCisgICAgTE9HSCgiZHQ9JWQgdmM9JWQiLCpkdCwgKnZjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFQYXJhbWV0ZXJzLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFQYXJhbWV0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1YmUxMgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBhcmFtZXRlcnMuaApAQCAtMCwwICsxLDEyNDYgQEAKKy8qCisqKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqKiBOb3QgYSBDb250cmlidXRpb24uIEFwYWNoZSBsaWNlbnNlIG5vdGlmaWNhdGlvbnMgYW5kIGxpY2Vuc2UgYXJlCisqKiByZXRhaW5lZCBmb3IgYXR0cmlidXRpb24gcHVycG9zZXMgb25seS4KKyoqCisqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUUNBTUVSQV9QQVJBTUVURVJTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9RQ0FNRVJBX1BBUkFNRVRFUlNfSAorCisvLyBUbyByZW1vdmUKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgImNhbWVyYS5oIgorI2luY2x1ZGUgIlFDYW1lcmFNZW0uaCIKKyNpbmNsdWRlICJRQ2FtZXJhUGFyYW1ldGVyc0ludGYuaCIKKyNpbmNsdWRlICJRQ2FtZXJhVGhlcm1hbEFkYXB0ZXIuaCIKKyNpbmNsdWRlICJRQ2FtZXJhQ29tbW9uLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2pwZWdfaW50ZXJmYWNlLmgiCit9CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgcWNhbWVyYSB7CisKKy8vRVhJRiBnbG9iYWxzCitzdGF0aWMgY29uc3QgY2hhciBFeGlmQXNjaWlQcmVmaXhbXSA9IHsgMHg0MSwgMHg1MywgMHg0MywgMHg0OSwgMHg0OSwgMHgwLCAweDAsIDB4MCB9OyAgICAgICAgICAvLyAiQVNDSUlcMFwwXDAiCitzdGF0aWMgY29uc3QgY2hhciBFeGlmVW5kZWZpbmVkUHJlZml4W10gPSB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsgICAvLyAiXDBcMFwwXDBcMFwwXDBcMCIKKworI2RlZmluZSBGT0NBTF9MRU5HVEhfREVDSU1BTF9QUkVDSVNJT04gICAxMDAKKworI2RlZmluZSBDQU1FUkFfTUlOX0JBVENIX0NPVU5UICAgICAgICAgICA0CisKKyNkZWZpbmUgUUNBTUVSQV9NQVhfRVhQX1RJTUVfTEVWRUwxICAgICAgMTAwCisjZGVmaW5lIFFDQU1FUkFfTUFYX0VYUF9USU1FX0xFVkVMMiAgICAgIDUwMAorI2RlZmluZSBRQ0FNRVJBX01BWF9FWFBfVElNRV9MRVZFTDMgICAgICAxMDAwCisjZGVmaW5lIFFDQU1FUkFfTUFYX0VYUF9USU1FX0xFVkVMNCAgICAgIDEwMDAwCisKK2NsYXNzIFFDYW1lcmFQYXJhbWV0ZXJzOiBwcml2YXRlIENhbWVyYVBhcmFtZXRlcnMKK3sKKworcHJpdmF0ZToKKworICAgIGNsYXNzIFFDYW1lcmFSZXByb2NTY2FsZVBhcmFteworICAgIHB1YmxpYzoKKworICAgICAgICBRQ2FtZXJhUmVwcm9jU2NhbGVQYXJhbSgpOworICAgICAgICB+UUNhbWVyYVJlcHJvY1NjYWxlUGFyYW0oKTsKKworICAgICAgICB2b2lkIHNldFNjYWxlRW5hYmxlKGJvb2wgZW5hYmxlZCk7CisgICAgICAgIGludDMyX3Qgc2V0U2NhbGVTaXplVGJsKHNpemVfdCBzY2FsZV9jbnQsCisgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90ICpzY2FsZV90YmwsIHNpemVfdCBvcmdfY250LAorICAgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCAqb3JnX3RibCk7CisgICAgICAgIGludDMyX3Qgc2V0VmFsaWRhdGVQaWNTaXplKGludCAmd2lkdGgsIGludCAmaGVpZ2h0KTsKKworICAgICAgICBib29sIGlzU2NhbGVFbmFibGVkKCk7CisgICAgICAgIGJvb2wgaXNVbmRlclNjYWxpbmcoKTsKKworICAgICAgICBzaXplX3QgZ2V0U2NhbGVTaXplVGJsQ250KCk7CisgICAgICAgIGNhbV9kaW1lbnNpb25fdCAqZ2V0U2NhbGVkU2l6ZVRibCgpOworICAgICAgICBzaXplX3QgZ2V0VG90YWxTaXplVGJsQ250KCk7CisgICAgICAgIGNhbV9kaW1lbnNpb25fdCAqZ2V0VG90YWxTaXplVGJsKCk7CisgICAgICAgIGludDMyX3QgZ2V0UGljU2l6ZUZyb21BUEsoaW50ICZ3aWR0aCwgaW50ICZoZWlnaHQpOworICAgICAgICBpbnQzMl90IGdldFBpY1NpemVTZXR0ZWQoaW50ICZ3aWR0aCwgaW50ICZoZWlnaHQpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgYm9vbCBpc1NjYWxlUGljU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgICAgICBib29sIGlzVmFsaWRhdGVQaWNTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgICAgICAgIGludDMyX3Qgc2V0U2Vuc29yU3VwcG9ydGVkUGljU2l6ZSgpOworICAgICAgICBzaXplX3QgY2hlY2tTY2FsZVNpemVUYWJsZShzaXplX3Qgc2NhbGVfY250LCBjYW1fZGltZW5zaW9uX3QgKnNjYWxlX3RibCwKKyAgICAgICAgICAgICAgICBzaXplX3Qgb3JnX2NudCwgY2FtX2RpbWVuc2lvbl90ICpvcmdfdGJsKTsKKworICAgICAgICBib29sIG1TY2FsZUVuYWJsZWQ7CisgICAgICAgIGJvb2wgbUlzVW5kZXJTY2FsaW5nOyAgIC8vaWYgaW4gc2NhbGUgc3RhdHVzCisKKyAgICAgICAgLy8gcGljdHVyZSBzaXplIGNudCB0aGF0IG5lZWQgc2NhbGUgb3BlcmF0aW9uCisgICAgICAgIHNpemVfdCBtTmVlZFNjYWxlQ250OworICAgICAgICBjYW1fZGltZW5zaW9uX3QgbU5lZWRTY2FsZWRTaXplVGJsW01BWF9TQ0FMRV9TSVpFU19DTlRdOworCisgICAgICAgIC8vIHNlbnNvciBzdXBwb3J0ZWQgc2l6ZSBjbnQgYW5kIHRhYmxlCisgICAgICAgIHNpemVfdCBtU2Vuc29yU2l6ZVRibENudDsKKyAgICAgICAgY2FtX2RpbWVuc2lvbl90ICptU2Vuc29yU2l6ZVRibDsKKworICAgICAgICAvLyBUb3RhbCBzaXplIGNudCAoc2Vuc29yIHN1cHBvcnRlZCArIG5lZWQgc2NhbGUgY250KQorICAgICAgICBzaXplX3QgbVRvdGFsU2l6ZVRibENudDsKKyAgICAgICAgY2FtX2RpbWVuc2lvbl90IG1Ub3RhbFNpemVUYmxbTUFYX1NJWkVTX0NOVF07CisKKyAgICAgICAgY2FtX2RpbWVuc2lvbl90IG1QaWNTaXplRnJvbUFQSzsgICAvLyBkaW1lbnNpb24gdGhhdCBBUEsgaXMgZXhwZWN0ZWQKKyAgICAgICAgY2FtX2RpbWVuc2lvbl90IG1QaWNTaXplU2V0dGVkOyAgICAvLyBkaW1lbnNpb24gdGhhdCBjb25maWcgdmZlCisgICAgfTsKKworICAgIC8vIFN1cHBvcnRlZCBQUkVWSUVXL1JFQ09SRElORyBTSVpFUyBJTiBISUdIIEZSQU1FIFJBVEUgcmVjb3JkaW5nLCBzaXplcyBpbiBwaXhlbHMuCisgICAgLy8gRXhhbXBsZSB2YWx1ZTogIjgwMHg0ODAsNDMyeDMyMCIuIFJlYWQgb25seS4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX0hGUl9TSVpFU1tdOworICAgIC8vIFRoZSBtb2RlIG9mIHByZXZpZXcgZnJhbWUgcmF0ZS4KKyAgICAvLyBFeGFtcGxlIHZhbHVlOiAiZnJhbWUtcmF0ZS1hdXRvLCBmcmFtZS1yYXRlLWZpeGVkIi4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfUFJFVklFV19GUkFNRV9SQVRFX01PREVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX1BSRVZJRVdfRlJBTUVfUkFURV9NT0RFU1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19QUkVWSUVXX0ZSQU1FX1JBVEVfQVVUT19NT0RFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1BSRVZJRVdfRlJBTUVfUkFURV9GSVhFRF9NT0RFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9TS0lOX1RPTkVfRU5IQU5DRU1FTlRfTU9ERVNbXSA7CisKKyAgICAvLyBTdXBwb3J0ZWQgbGl2ZSBzbmFwc2hvdCBzaXplcworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TVVBQT1JURURfTElWRVNOQVBTSE9UX1NJWkVTW107CisKKyAgICAvLyBTdXBwb3J0ZWQgUmF3IGZvcm1hdHMKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX1JBV19GT1JNQVRTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1JBV19GT1JNQVRbXTsKKworICAgIC8vVG91Y2ggQWYvQUVDIHNldHRpbmdzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19UT1VDSF9BRl9BRUNbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX1RPVUNIX0FGX0FFQ1tdOworICAgIC8vVG91Y2ggSW5kZXggZm9yIEFFQy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfVE9VQ0hfSU5ERVhfQUVDW107CisgICAgLy9Ub3VjaCBJbmRleCBmb3IgQUYuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1RPVUNIX0lOREVYX0FGW107CisgICAgLy8gQ3VycmVudCBhdXRvIHNjZW5lIGRldGVjdGlvbiBtb2RlLgorICAgIC8vIEV4YW1wbGUgdmFsdWU6ICJvZmYiIG9yICJvbiIgY29uc3RhbnRzLiBSZWFkL3dyaXRlLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TQ0VORV9ERVRFQ1RbXTsKKyAgICAvLyBTdXBwb3J0ZWQgYXV0byBzY2VuZSBkZXRlY3Rpb24gc2V0dGluZ3MuCisgICAgLy8gRXhhbXBsZSB2YWx1ZTogIm9mZixvbiIuIFJlYWQgb25seS4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX1NDRU5FX0RFVEVDVFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TRUxFQ1RBQkxFX1pPTkVfQUZbXTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19JU09fTU9ERVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19DT05USU5VT1VTX0lTT1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19NSU5fSVNPW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01BWF9JU09bXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX0lTT19NT0RFU1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19FWFBPU1VSRV9USU1FW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01JTl9FWFBPU1VSRV9USU1FW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01BWF9FWFBPU1VSRV9USU1FW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0xFTlNTSEFERVtdIDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX0xFTlNTSEFERV9NT0RFU1tdIDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfQVVUT19FWFBPU1VSRVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TVVBQT1JURURfQVVUT19FWFBPU1VSRVtdOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0dQU19MQVRJVFVERV9SRUZbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfR1BTX0xPTkdJVFVERV9SRUZbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfR1BTX0FMVElUVURFX1JFRltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19HUFNfU1RBVFVTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01FTU9SWV9DT0xPUl9FTkhBTkNFTUVOVFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TVVBQT1JURURfTUVNX0NPTE9SX0VOSEFOQ0VfTU9ERVNbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfRElTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX09JU1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TVVBQT1JURURfRElTX01PREVTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9PSVNfTU9ERVNbXTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19aU0xbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX1pTTF9NT0RFU1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19aU0xfQlVSU1RfSU5URVJWQUxbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfWlNMX0JVUlNUX0xPT0tCQUNLW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1pTTF9RVUVVRV9ERVBUSFtdOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0NBTUVSQV9NT0RFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX09SSUVOVEFUSU9OW107CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfVklERU9fSElHSF9GUkFNRV9SQVRFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1ZJREVPX0hJR0hfU1BFRURfUkVDT1JESU5HW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9WSURFT19ISUdIX0ZSQU1FX1JBVEVfTU9ERVNbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfSElHSF9EWU5BTUlDX1JBTkdFX0lNQUdJTkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX0hEUl9JTUFHSU5HX01PREVTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0FFX0JSQUNLRVRfSERSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9BRV9CUkFDS0VUX01PREVTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0NBUFRVUkVfQlVSU1RfRVhQT1NVUkVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfTlVNX1NOQVBTSE9UX1BFUl9TSFVUVEVSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX05VTV9SRVRST19CVVJTVF9QRVJfU0hVVFRFUltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TTkFQU0hPVF9CVVJTVF9MRURfT05fUEVSSU9EW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NOQVBTSE9UX0JVUlNUX05VTVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19OT19ESVNQTEFZX01PREVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfUkFXX1BJQ1VUUkVfU0laRVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19USU5UTEVTU19FTkFCTEVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU0NFTkVfU0VMRUNUSU9OW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0NEU19NT0RFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1ZJREVPX0NEU19NT0RFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9DRFNfTU9ERVNbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX1ZJREVPX0NEU19NT0RFU1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19UTlJfTU9ERVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19WSURFT19UTlJfTU9ERVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TVVBQT1JURURfVE5SX01PREVTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9WSURFT19UTlJfTU9ERVNbXTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9JTlRFUk5BTF9QRVJWSUVXX1JFU1RBUlRbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfV0JfTUFOVUFMX0NDVFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19NSU5fV0JfQ0NUW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01BWF9XQl9DQ1RbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfTUFOVUFMX1dCX0dBSU5TW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01JTl9XQl9HQUlOW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01BWF9XQl9HQUlOW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgV0hJVEVfQkFMQU5DRV9NQU5VQUxbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19NT0RFX01BTlVBTF9QT1NJVElPTltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19MT05HX1NIT1RbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfSU5JVElBTF9FWFBPU1VSRV9JTkRFWFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19JTlNUQU5UX0FFQ1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19JTlNUQU5UX0NBUFRVUkVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfSU5TVEFOVF9BRUNfU1VQUE9SVEVEX01PREVTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0lOU1RBTlRfQ0FQVFVSRV9TVVBQT1JURURfTU9ERVNbXTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19NQU5VQUxfRk9DVVNfUE9TSVRJT05bXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfTUFOVUFMX0ZPQ1VTX1BPU19UWVBFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01JTl9GT0NVU19QT1NfSU5ERVhbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfTUFYX0ZPQ1VTX1BPU19JTkRFWFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19NSU5fRk9DVVNfUE9TX0RBQ1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19NQVhfRk9DVVNfUE9TX0RBQ1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19NSU5fRk9DVVNfUE9TX1JBVElPW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01BWF9GT0NVU19QT1NfUkFUSU9bXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfTUlOX0ZPQ1VTX1BPU19ESU9QVEVSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01BWF9GT0NVU19QT1NfRElPUFRFUltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19GT0NVU19QT1NJVElPTl9TQ0FMRVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19GT0NVU19QT1NJVElPTl9ESU9QVEVSW107CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX01BTlVBTF9GT0NVU19NT0RFU1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TVVBQT1JURURfTUFOVUFMX0VYUE9TVVJFX01PREVTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9NQU5VQUxfV0JfTU9ERVNbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfRk9DVVNfU0NBTEVfTU9ERVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19GT0NVU19ESU9QVEVSX01PREVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfSVNPX1BSSU9SSVRZW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0VYUF9USU1FX1BSSU9SSVRZW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1VTRVJfU0VUVElOR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19XQl9DQ1RfTU9ERVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19XQl9HQUlOX01PREVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfTUFOVUFMX1dCX1RZUEVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfTUFOVUFMX1dCX1ZBTFVFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0NVUlJFTlRfRVhQT1NVUkVfVElNRVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19DVVJSRU5UX0lTT1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19DQUNIRV9WSURFT19CVUZGRVJTW107CisKKyAgICAvLyBERU5PSVNFCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0RFTk9JU0VbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX0RFTk9JU0VbXTsKKworICAgIC8vU2VsZWN0YWJsZSB6b25lIEFGLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19GT0NVU19BTEdPW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9GT0NVU19BTEdPU1tdOworCisgICAgLy9GYWNlIERldGVjdGlvbgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19GQUNFX0RFVEVDVElPTltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TVVBQT1JURURfRkFDRV9ERVRFQ1RJT05bXTsKKworICAgIC8vRmFjZSBSZWNvZ25pdGlvbgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19GQUNFX1JFQ09HTklUSU9OW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9GQUNFX1JFQ09HTklUSU9OW107CisKKyAgICAvL0luZGljYXRlcyBudW1iZXIgb2YgZmFjZXMgcmVxdWVzdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAvL1RoaXMgdmFsdWUgd2lsbCBiZSByZWplY3RlZCBpZiB0aGUgcmVxdWVzdGVkIGZhY2VzCisgICAgLy9ncmVhdGVyIHRoYW4gc3VwcG9ydGVkIGJ5IGhhcmR3YXJlLgorICAgIC8vV3JpdGUgb25seS4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfTUFYX05VTV9SRVFVRVNURURfRkFDRVNbXTsKKworICAgIC8vcHJldmlldyBmbGlwCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1BSRVZJRVdfRkxJUFtdOworICAgIC8vdmlkZW8gZmxpcAorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19WSURFT19GTElQW107CisgICAgLy9zbmFwc2hvdCBwaWN0dXJlIGZsaXAKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU05BUFNIT1RfUElDVFVSRV9GTElQW107CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX0ZMSVBfTU9ERVNbXTsKKworICAgIC8vRmFjZSBEZXRlY3Rpb24sIEZhY2lhbCBwcm9jZXNzaW5nIHJlcXVpcmVtZW50CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NOQVBTSE9UX0ZEX0RBVEFbXTsKKworICAgIC8vQXV0byBIRFIgZW5hYmxlCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0FVVE9fSERSX0VOQUJMRVtdOworICAgIC8vIHZpZGVvIHJvdGF0aW9uCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1ZJREVPX1JPVEFUSU9OW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9WSURFT19ST1RBVElPTl9WQUxVRVNbXTsKKworICAgIC8vUmVkZXllIFJlZHVjdGlvbgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19SRURFWUVfUkVEVUNUSU9OW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9SRURFWUVfUkVEVUNUSU9OW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgRUZGRUNUX0VNQk9TU1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEVGRkVDVF9TS0VUQ0hbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBFRkZFQ1RfTkVPTltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEVGRkVDVF9CRUFVVFlbXTsKKworICAgIC8vQUYgQnJhY2tldGluZworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19BRl9CUkFDS0VUW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9BRl9CUkFDS0VUX01PREVTW107CisKKyAgICAvL1JlZm9jdXMKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfUkVfRk9DVVNbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX1JFX0ZPQ1VTX01PREVTW107CisKKyAgICAvL0Nocm9tYSBGbGFzaAorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19DSFJPTUFfRkxBU0hbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX0NIUk9NQV9GTEFTSF9NT0RFU1tdOworCisgICAgLy9PcHRpIFpvb20KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfT1BUSV9aT09NW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9PUFRJX1pPT01fTU9ERVNbXTsKKworICAgIC8vIEF1dG8gSERSIHN1cHBvcnRlZAorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19BVVRPX0hEUl9TVVBQT1JURURbXTsKKworICAgIC8vIEhEUiBtb2RlcworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19IRFJfTU9ERVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TVVBQT1JURURfS0VZX1FDX0hEUl9NT0RFU1tdOworCisgICAgLy9UcnVlIFBvcnRyYWl0CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1RSVUVfUE9SVFJBSVRbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX1RSVUVfUE9SVFJBSVRfTU9ERVNbXTsKKworICAgIC8vU2VlIG1vcmUKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU0VFX01PUkVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX1NFRV9NT1JFX01PREVTW107CisKKyAgICAvL1N0aWxsIG1vcmUKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1RJTExfTU9SRVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TVVBQT1JURURfU1RJTExfTU9SRV9NT0RFU1tdOworCisgICAgLy9Ob2lzZSByZWR1Y3Rpb24gbW9kZQorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19OT0lTRV9SRURVQ1RJT05fTU9ERVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19OT0lTRV9SRURVQ1RJT05fTU9ERV9WQUxVRVNbXTsKKworICAgIC8vTG9uZ3Nob3QKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfTE9OR1NIT1RfU1VQUE9SVEVEW107CisKKyAgICAvL1pTTCtIRFIKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfWlNMX0hEUl9TVVBQT1JURURbXTsKKworICAgIC8vIFZhbHVlcyBmb3IgVG91Y2ggQUYvQUVDCisgICAgc3RhdGljIGNvbnN0IGNoYXIgVE9VQ0hfQUZfQUVDX09GRltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFRPVUNIX0FGX0FFQ19PTltdOworCisgICAgLy8gVmFsdWVzIGZvciBTY2VuZSBtb2RlCisgICAgc3RhdGljIGNvbnN0IGNoYXIgU0NFTkVfTU9ERV9BU0RbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBTQ0VORV9NT0RFX0JBQ0tMSUdIVFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFNDRU5FX01PREVfRkxPV0VSU1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFNDRU5FX01PREVfQVJbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBTQ0VORV9NT0RFX0hEUltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9ZVVY0MjBTUF9BRFJFTk9bXTsgLy8gQURSRU5PCisgICAgc3RhdGljIGNvbnN0IGNoYXIgUElYRUxfRk9STUFUX1lWMTJbXTsgLy8gTlYxMgorICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9OVjEyW107IC8vTlYxMgorICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9OVjEyX1ZFTlVTW107IC8vTlYxMiBWRU5VUworCisgICAgLy8gVmFsdWVzIGZvciByYXcgcGljdHVyZSBmb3JtYXQKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfWVVWX1JBV184QklUX1lVWVZbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfWVVWX1JBV184QklUX1lWWVVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfWVVWX1JBV184QklUX1VZVllbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfWVVWX1JBV184QklUX1ZZVVlbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfOEdCUkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfOEdSQkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfOFJHR0JbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfOEJHR1JbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBHQlJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzEwR1JCR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMFJHR0JbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBCR0dSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyR0JSR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMkdSQkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTJSR0dCW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQkdHUltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xNEdCUkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTRHUkJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0UkdHQltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xNEJHR1JbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfOEdCUkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfOEdSQkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfOFJHR0JbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfOEJHR1JbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTBHQlJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzEwR1JCR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMFJHR0JbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTBCR0dSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzEyR0JSR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMkdSQkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJSR0dCW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzEyQkdHUltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xNEdCUkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTRHUkJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX01JUElfUkFXXzE0UkdHQltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xNEJHR1JbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV84R0JSR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzhHUkJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1FDT01fOFJHR0JbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUUNPTV84QkdHUltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzEwR0JSR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzEwR1JCR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzEwUkdHQltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzEwQkdHUltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzEyR0JSR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzEyR1JCR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzEyUkdHQltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzEyQkdHUltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzE0R0JSR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzE0R1JCR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzE0UkdHQltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9RQ09NXzE0QkdHUltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9NSVBJXzhHQlJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfOEdSQkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfTUlQSV84UkdHQltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9NSVBJXzhCR0dSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTBHQlJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTBHUkJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTBSR0dCW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTBCR0dSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTJHQlJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTJHUkJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTJSR0dCW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTJCR0dSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTRHQlJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTRHUkJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTRSR0dCW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX01JUElfMTRCR0dSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOOF84R0JSR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjhfOEdSQkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUExBSU44XzhSR0dCW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOOF84QkdHUltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjE2XzhHQlJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfOEdSQkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBRQ19QSVhFTF9GT1JNQVRfQkFZRVJfSURFQUxfUExBSU4xNl84UkdHQltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFFDX1BJWEVMX0ZPUk1BVF9CQVlFUl9JREVBTF9QTEFJTjE2XzhCR0dSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTBHQlJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTBHUkJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTBSR0dCW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTBCR0dSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTJHQlJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTJHUkJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTJSR0dCW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTJCR0dSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTRHQlJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTRHUkJHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTRSR0dCW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUUNfUElYRUxfRk9STUFUX0JBWUVSX0lERUFMX1BMQUlOMTZfMTRCR0dSW107CisKKyAgICAvLyBJU08gdmFsdWVzCisgICAgc3RhdGljIGNvbnN0IGNoYXIgSVNPX0FVVE9bXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBJU09fSEpSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgSVNPXzEwMFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIElTT18yMDBbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBJU09fNDAwW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgSVNPXzgwMFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIElTT18xNjAwW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgSVNPXzMyMDBbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBJU09fTUFOVUFMW107CisKKyAgICAvLyBWYWx1ZXMgZm9yIGF1dG8gZXhwb3N1cmUgc2V0dGluZ3MuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgQVVUT19FWFBPU1VSRV9GUkFNRV9BVkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBBVVRPX0VYUE9TVVJFX0NFTlRFUl9XRUlHSFRFRFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEFVVE9fRVhQT1NVUkVfU1BPVF9NRVRFUklOR1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEFVVE9fRVhQT1NVUkVfU01BUlRfTUVURVJJTkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBBVVRPX0VYUE9TVVJFX1VTRVJfTUVURVJJTkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBBVVRPX0VYUE9TVVJFX1NQT1RfTUVURVJJTkdfQURWW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgQVVUT19FWFBPU1VSRV9DRU5URVJfV0VJR0hURURfQURWW107CisKKyAgICAvLyBWYWx1ZXMgZm9yIGluc3RhbnQgQUVDIG1vZGVzCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0lOU1RBTlRfQUVDX0RJU0FCTEVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfSU5TVEFOVF9BRUNfQUdHUkVTU0lWRV9BRUNbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfSU5TVEFOVF9BRUNfRkFTVF9BRUNbXTsKKworICAgIC8vIFZhbHVlcyBmb3IgaW5zdGFudCBjYXB0dXJlIG1vZGVzCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0lOU1RBTlRfQ0FQVFVSRV9ESVNBQkxFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0lOU1RBTlRfQ0FQVFVSRV9BR0dSRVNTSVZFX0FFQ1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19JTlNUQU5UX0NBUFRVUkVfRkFTVF9BRUNbXTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TSEFSUE5FU1NbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfTUlOX1NIQVJQTkVTU1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19NQVhfU0hBUlBORVNTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NIQVJQTkVTU19TVEVQW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0NPTlRSQVNUW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01JTl9DT05UUkFTVFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19NQVhfQ09OVFJBU1RbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfQ09OVFJBU1RfU1RFUFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TQVRVUkFUSU9OW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01JTl9TQVRVUkFUSU9OW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01BWF9TQVRVUkFUSU9OW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NBVFVSQVRJT05fU1RFUFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19CUklHSFRORVNTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01JTl9CUklHSFRORVNTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01BWF9CUklHSFRORVNTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0JSSUdIVE5FU1NfU1RFUFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TQ0VfRkFDVE9SW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01JTl9TQ0VfRkFDVE9SW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX01BWF9TQ0VfRkFDVE9SW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NDRV9GQUNUT1JfU1RFUFtdOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0hJU1RPR1JBTVtdIDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX0hJU1RPR1JBTV9NT0RFU1tdIDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX0hEUl9ORUVEXzFYW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX0hEUl9ORUVEXzFYW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1ZJREVPX0hEUltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19WVF9FTkFCTEVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX1ZJREVPX0hEUl9NT0RFU1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9RQ19TRU5TT1JfSERSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9TRU5TT1JfSERSX01PREVTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1JESV9NT0RFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1NVUFBPUlRFRF9SRElfTU9ERVNbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU0VDVVJFX01PREVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUUNfU1VQUE9SVEVEX1NFQ1VSRV9NT0RFU1tdOworCisgICAgLy8gVmFsdWVzIGZvciBTS0lOIFRPTkUgRU5IQU5DRU1FTlQKKyAgICBzdGF0aWMgY29uc3QgY2hhciBTS0lOX1RPTkVfRU5IQU5DRU1FTlRfRU5BQkxFW10gOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFNLSU5fVE9ORV9FTkhBTkNFTUVOVF9ESVNBQkxFW10gOworCisgICAgLy8gVmFsdWVzIGZvciBEZW5vaXNlCisgICAgc3RhdGljIGNvbnN0IGNoYXIgREVOT0lTRV9PRkZbXSA7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgREVOT0lTRV9PTltdIDsKKworICAgIC8vIFZhbHVlcyBmb3IgYXV0byBleHBvc3VyZSBzZXR0aW5ncy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19BTEdPX0FVVE9bXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19BTEdPX1NQT1RfTUVURVJJTkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19BTEdPX0NFTlRFUl9XRUlHSFRFRFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEZPQ1VTX0FMR09fRlJBTUVfQVZFUkFHRVtdOworCisgICAgLy8gVmFsdWVzIGZvciBBRSBCcmFja2V0aW5nIHNldHRpbmdzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEFFX0JSQUNLRVRfT0ZGW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgQUVfQlJBQ0tFVFtdOworCisgICAgLy8gVmFsdWVzIGZvciBBRiBCcmFja2V0aW5nIHNldHRpbmdzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEFGX0JSQUNLRVRfT0ZGW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgQUZfQlJBQ0tFVF9PTltdOworCisgICAgLy8gVmFsdWVzIGZvciBSZWZvY3VzIHNldHRpbmdzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIFJFX0ZPQ1VTX09GRltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFJFX0ZPQ1VTX09OW107CisKKyAgICAvLyBWYWx1ZXMgZm9yIENocm9tYSBGbGFzaCBzZXR0aW5ncy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBDSFJPTUFfRkxBU0hfT0ZGW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgQ0hST01BX0ZMQVNIX09OW107CisKKyAgICAvLyBWYWx1ZXMgZm9yIE9wdGkgWm9vbSBzZXR0aW5ncy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBPUFRJX1pPT01fT0ZGW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgT1BUSV9aT09NX09OW107CisKKyAgICAvLyBWYWx1ZXMgZm9yIFN0aWxsIE1vcmUgc2V0dGluZ3MuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgU1RJTExfTU9SRV9PRkZbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBTVElMTF9NT1JFX09OW107CisKKyAgICAvLyBWYWx1ZXMgZm9yIEhEUiBtb2RlIHNldHRpbmdzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEhEUl9NT0RFX1NFTlNPUltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEhEUl9NT0RFX01VTFRJX0ZSQU1FW107CisKKyAgICAvLyBWYWx1ZXMgZm9yIFRydWUgUG9ydHJhaXQgc2V0dGluZ3MuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgVFJVRV9QT1JUUkFJVF9PRkZbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBUUlVFX1BPUlRSQUlUX09OW107CisKKyAgICAvLyBWYWx1ZXMgZm9yIEhGUiBzZXR0aW5ncy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBWSURFT19IRlJfT0ZGW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgVklERU9fSEZSXzJYW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgVklERU9fSEZSXzNYW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgVklERU9fSEZSXzRYW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgVklERU9fSEZSXzVYW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgVklERU9fSEZSXzZYW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgVklERU9fSEZSXzdYW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgVklERU9fSEZSXzhYW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgVklERU9fSEZSXzlYW107CisKKyAgICAvLyBWYWx1ZXMgZm9yIGZlYXR1cmUgb24vb2ZmIHNldHRpbmdzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIFZBTFVFX09GRltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFZBTFVFX09OW107CisKKyAgICAvLyBWYWx1ZXMgZm9yIGZlYXR1cmUgZW5hYmxlL2Rpc2FibGUgc2V0dGluZ3MuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgVkFMVUVfRU5BQkxFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgVkFMVUVfRElTQUJMRVtdOworCisgICAgLy8gVmFsdWVzIGZvciBmZWF0dXJlIHRydWUvZmFsc2Ugc2V0dGluZ3MuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgVkFMVUVfRkFMU0VbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBWQUxVRV9UUlVFW107CisKKyAgICAvL1ZhbHVlcyBmb3IgZmxpcCBzZXR0aW5ncworICAgIHN0YXRpYyBjb25zdCBjaGFyIEZMSVBfTU9ERV9PRkZbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBGTElQX01PREVfVltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEZMSVBfTU9ERV9IW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgRkxJUF9NT0RFX1ZIW107CisKKyAgICAvL1ZhbHVlcyBmb3IgQ0RTIE1vZGUKKyAgICBzdGF0aWMgY29uc3QgY2hhciBDRFNfTU9ERV9PRkZbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBDRFNfTU9ERV9PTltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIENEU19NT0RFX0FVVE9bXTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIFZBTFVFX0ZBU1RbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBWQUxVRV9ISUdIX1FVQUxJVFlbXTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TRUxFQ1RFRF9BVVRPX1NDRU5FW107CisKKyAgICAvLyBWYWx1ZXMgZm9yIFZpZGVvIHJvdGF0aW9uCisgICAgc3RhdGljIGNvbnN0IGNoYXIgVklERU9fUk9UQVRJT05fMFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFZJREVPX1JPVEFUSU9OXzkwW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgVklERU9fUk9UQVRJT05fMTgwW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgVklERU9fUk9UQVRJT05fMjcwW107CisKKyNpZmRlZiBUQVJHRVRfVFNfTUFLRVVQCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1RTX01BS0VVUFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9UU19NQUtFVVBfV0hJVEVOW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1RTX01BS0VVUF9DTEVBTltdOworI2VuZGlmCisgICAgLy9wYXJhbSBrZXkgZm9yIEhGUiBiYXRjaCBzaXplCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1FDX1ZJREVPX0JBVENIX1NJWkVbXTsKKyAgICBlbnVtIHsKKyAgICAgICAgQ0FNRVJBX09SSUVOVEFUSU9OX1VOS05PV04gPSAwLAorICAgICAgICBDQU1FUkFfT1JJRU5UQVRJT05fUE9SVFJBSVQgPSAxLAorICAgICAgICBDQU1FUkFfT1JJRU5UQVRJT05fTEFORFNDQVBFID0gMiwKKyAgICB9OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIHZhbHVlVHlwZT4gc3RydWN0IFFDYW1lcmFNYXAgeworICAgICAgICBjb25zdCBjaGFyICpjb25zdCBkZXNjOworICAgICAgICB2YWx1ZVR5cGUgdmFsOworICAgIH07CisKK3B1YmxpYzoKKyAgICBRQ2FtZXJhUGFyYW1ldGVycygpOworICAgIFFDYW1lcmFQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzggJnBhcmFtcyk7CisgICAgflFDYW1lcmFQYXJhbWV0ZXJzKCk7CisKKyAgICBpbnQzMl90IGFsbG9jYXRlKCk7CisgICAgaW50MzJfdCBpbml0KGNhbV9jYXBhYmlsaXR5X3QgKiwKKyAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3Z0YmxfdCAqLAorICAgICAgICAgICAgICAgICBRQ2FtZXJhQWRqdXN0RlBTICopOworICAgIHZvaWQgZGVpbml0KCk7CisgICAgaW50MzJfdCBpbml0RGVmYXVsdFBhcmFtZXRlcnMoKTsKKyAgICBpbnQzMl90IHVwZGF0ZVBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zLCBib29sICZuZWVkUmVzdGFydCk7CisgICAgaW50MzJfdCBjb21taXRQYXJhbWV0ZXJzKCk7CisKKyAgICBjaGFyKiBnZXRQYXJhbWV0ZXJzKCk7CisgICAgdm9pZCBnZXRQcmV2aWV3RnBzUmFuZ2UoaW50ICptaW5fZnBzLCBpbnQgKm1heF9mcHMpIGNvbnN0IHsKKyAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OmdldFByZXZpZXdGcHNSYW5nZShtaW5fZnBzLCBtYXhfZnBzKTsKKyAgICB9CisjaWZkZWYgVEFSR0VUX1RTX01BS0VVUAorICAgIGJvb2wgZ2V0VHNNYWtldXBJbmZvKGludCAmd2hpdGVMZXZlbCwgaW50ICZjbGVhbkxldmVsKSBjb25zdDsKKyNlbmRpZgorCisgICAgaW50IGdldFByZXZpZXdIYWxQaXhlbEZvcm1hdCgpOworICAgIGludDMyX3QgZ2V0U3RyZWFtUm90YXRpb24oY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcHBfZmVhdHVyZV9jb25maWdfdCAmZmVhdHVyZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3QgJmRpbSk7CisgICAgaW50MzJfdCBnZXRTdHJlYW1Gb3JtYXQoY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2Zvcm1hdF90ICZmb3JtYXQpOworICBpbnQzMl90IGdldFN0cmVhbVN1YkZvcm1hdChjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgIGNhbV9zdWJfZm9ybWF0X3R5cGVfdCAmc3ViX2Zvcm1hdCk7CisKKyAgICBpbnQzMl90IGdldFN0cmVhbURpbWVuc2lvbihjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90ICZkaW0pOworICAgIHZvaWQgZ2V0VGh1bWJuYWlsU2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkgY29uc3Q7CisKKworICAgIHVpbnQ4X3QgZ2V0WlNMQnVyc3RJbnRlcnZhbCgpOworICAgIHVpbnQ4X3QgZ2V0WlNMUXVldWVEZXB0aCgpOworICAgIHVpbnQ4X3QgZ2V0WlNMQmFja0xvb2tDb3VudCgpOworICAgIHVpbnQ4X3QgZ2V0TWF4VW5tYXRjaGVkRnJhbWVzSW5RdWV1ZSgpOworICAgIGJvb2wgaXNaU0xNb2RlKCkge3JldHVybiBtX2Jac2xNb2RlO307CisgICAgYm9vbCBpc1JkaU1vZGUoKSB7cmV0dXJuIG1fYlJkaU1vZGU7fTsKKyAgICBib29sIGlzU2VjdXJlTW9kZSgpIHtyZXR1cm4gbV9iU2VjdXJlTW9kZTt9OworICAgIGJvb2wgaXNOb0Rpc3BsYXlNb2RlKCkge3JldHVybiBtX2JOb0Rpc3BsYXlNb2RlO307CisgICAgYm9vbCBpc1dOUkVuYWJsZWQoKSB7cmV0dXJuIG1fYldOUk9uO307CisgICAgYm9vbCBpc1ROUlNuYXBzaG90RW5hYmxlZCgpIHtyZXR1cm4gbV9iVE5SU25hcHNob3RPbjt9OworICAgIGludDMyX3QgZ2V0Q0RTTW9kZSgpIHtyZXR1cm4gbUNkc19tb2RlO307CisgICAgYm9vbCBpc0xUTUZvclNlZU1vcmVFbmFibGVkKCkge3JldHVybiBtX2JMdG1Gb3JTZWVNb3JlRW5hYmxlZDt9OworICAgIGJvb2wgaXNIZnJNb2RlKCkge3JldHVybiBtX2JIZnJNb2RlO307CisgICAgdm9pZCBnZXRIZnJGcHMoY2FtX2Zwc19yYW5nZV90ICZwRnBzUmFuZ2UpIHsgcEZwc1JhbmdlID0gbV9oZnJGcHNSYW5nZTt9OworICAgIHVpbnQ4X3QgZ2V0TnVtT2ZTbmFwc2hvdHMoKTsKKyAgICB1aW50OF90IGdldE51bU9mUmV0cm9TbmFwc2hvdHMoKTsKKyAgICB1aW50OF90IGdldE51bU9mRXh0cmFIRFJJbkJ1ZnNJZk5lZWRlZCgpOworICAgIHVpbnQ4X3QgZ2V0TnVtT2ZFeHRyYUhEUk91dEJ1ZnNJZk5lZWRlZCgpOworCisgICAgYm9vbCBnZXRSZWNvcmRpbmdIaW50VmFsdWUoKSB7cmV0dXJuIG1fYlJlY29yZGluZ0hpbnQ7fTsgLy8gcmV0dXJuIGxvY2FsIGNvcHkgb2YgdmlkZW8gaGludAorICAgIHVpbnQzMl90IGdldEpwZWdRdWFsaXR5KCk7CisgICAgdWludDMyX3QgZ2V0Um90YXRpb24oKTsKKyAgICB1aW50MzJfdCBnZXREZXZpY2VSb3RhdGlvbigpOworICAgIHVpbnQzMl90IGdldEpwZWdFeGlmUm90YXRpb24oKTsKKyAgICBib29sIHVzZUpwZWdFeGlmUm90YXRpb24oKTsKKyAgICBpbnQzMl90IGdldEVmZmVjdFZhbHVlKCk7CisgICAgYm9vbCBpc0luc3RhbnRBRUNFbmFibGVkKCkge3JldHVybiBtX2JJbnN0YW50QUVDO307CisgICAgYm9vbCBpc0luc3RhbnRDYXB0dXJlRW5hYmxlZCgpIHtyZXR1cm4gbV9iSW5zdGFudENhcHR1cmU7fTsKKyAgICB1aW50OF90IGdldEFlY0ZyYW1lQm91bmRWYWx1ZSgpIHtyZXR1cm4gbUFlY0ZyYW1lQm91bmQ7fTsKKyAgICB1aW50OF90IGdldEFlY1NraXBEaXNwbGF5RnJhbWVCb3VuZCgpIHtyZXR1cm4gbUFlY1NraXBEaXNwbGF5RnJhbWVCb3VuZDt9OworCisgICAgaW50MzJfdCBnZXRFeGlmRGF0ZVRpbWUoU3RyaW5nOCAmZGF0ZVRpbWUsIFN0cmluZzggJnN1YnNlY1RpbWUpOworICAgIGludDMyX3QgZ2V0RXhpZkZvY2FsTGVuZ3RoKHJhdF90ICpmb2NhbExlbmdodCk7CisgICAgdWludDE2X3QgZ2V0RXhpZklzb1NwZWVkKCk7CisgICAgaW50MzJfdCBnZXRFeGlmR3BzUHJvY2Vzc2luZ01ldGhvZChjaGFyICpncHNQcm9jZXNzaW5nTWV0aG9kLCB1aW50MzJfdCAmY291bnQpOworICAgIGludDMyX3QgZ2V0RXhpZkxhdGl0dWRlKHJhdF90ICpsYXRpdHVkZSwgY2hhciAqbGF0UmVmKTsKKyAgICBpbnQzMl90IGdldEV4aWZMb25naXR1ZGUocmF0X3QgKmxvbmdpdHVkZSwgY2hhciAqbG9uUmVmKTsKKyAgICBpbnQzMl90IGdldEV4aWZBbHRpdHVkZShyYXRfdCAqYWx0aXR1ZGUsIGNoYXIgKmFsdFJlZik7CisgICAgaW50MzJfdCBnZXRFeGlmR3BzRGF0ZVRpbWVTdGFtcChjaGFyICpncHNEYXRlU3RhbXAsIHVpbnQzMl90IGJ1ZkxlbiwgcmF0X3QgKmdwc1RpbWVTdGFtcCk7CisgICAgYm9vbCBpc1ZpZGVvQnVmZmVyc0NhY2hlZCgpOworICAgIGludDMyX3QgdXBkYXRlRm9jdXNEaXN0YW5jZXMoY2FtX2ZvY3VzX2Rpc3RhbmNlc19pbmZvX3QgKmZvY3VzRGlzdGFuY2VzKTsKKworICAgIGJvb2wgaXNBRUJyYWNrZXRFbmFibGVkKCk7CisgICAgaW50MzJfdCBzZXRBRUJyYWNrZXRpbmcoKTsKKyAgICBib29sIGlzRnBzRGVidWdFbmFibGVkKCkge3JldHVybiBtX2JEZWJ1Z0Zwczt9OworICAgIGJvb2wgaXNIaXN0b2dyYW1FbmFibGVkKCkge3JldHVybiBtX2JIaXN0b2dyYW1FbmFibGVkO307CisgICAgYm9vbCBpc1NjZW5lU2VsZWN0aW9uRW5hYmxlZCgpIHtyZXR1cm4gbV9iU2NlbmVTZWxlY3Rpb247fTsKKyAgICBpbnQzMl90IHNldFNlbGVjdGVkU2NlbmUoY2FtX3NjZW5lX21vZGVfdHlwZSBzY2VuZSk7CisgICAgY2FtX3NjZW5lX21vZGVfdHlwZSBnZXRTZWxlY3RlZFNjZW5lKCk7CisgICAgYm9vbCBpc0ZhY2VEZXRlY3Rpb25FbmFibGVkKCkge3JldHVybiAoKG1fbkZhY2VQcm9jTWFzayAmCisgICAgICAgICAgICAoQ0FNX0ZBQ0VfUFJPQ0VTU19NQVNLX0RFVEVDVElPTiB8IENBTV9GQUNFX1BST0NFU1NfTUFTS19GT0NVUykpICE9IDApO307CisgICAgaW50MzJfdCBzZXRGYWNlRGV0ZWN0aW9uT3B0aW9uKGJvb2wgZW5hYmxlZCk7CisgICAgaW50MzJfdCBzZXRIaXN0b2dyYW0oYm9vbCBlbmFibGVkKTsKKyAgICBpbnQzMl90IHNldEZhY2VEZXRlY3Rpb24oYm9vbCBlbmFibGVkLCBib29sIGluaXRDb21taXQpOworICAgIGludDMyX3Qgc2V0RnJhbWVTa2lwKGVudW0gbXNtX3ZmZV9mcmFtZV9za2lwX3BhdHRlcm4gcGF0dGVybik7CisgICAgcWNhbWVyYV90aGVybWFsX21vZGUgZ2V0VGhlcm1hbE1vZGUoKSB7cmV0dXJuIG1fVGhlcm1hbE1vZGU7fTsKKyAgICBpbnQzMl90IHVwZGF0ZVJlY29yZGluZ0hpbnRWYWx1ZShpbnQzMl90IHZhbHVlKTsKKyAgICBpbnQzMl90IHNldEhEUkFFQnJhY2tldChjYW1fZXhwX2JyYWNrZXRpbmdfdCBoZHJCcmFja2V0KTsKKyAgICBib29sIGlzSERSRW5hYmxlZCgpOworICAgIGJvb2wgaXNBdXRvSERSRW5hYmxlZCgpOworICAgIGludDMyX3Qgc3RvcEFFQnJhY2tldCgpOworICAgIGludDMyX3QgdXBkYXRlUkFXKGNhbV9kaW1lbnNpb25fdCBtYXhfZGltKTsKKyAgICBib29sIGlzRElTRW5hYmxlZCgpOworICAgIGludDMyX3Qgc2V0SVNUeXBlKCk7CisgICAgY2FtX2lzX3R5cGVfdCBnZXRWaWRlb0lTVHlwZSgpOworICAgIGNhbV9pc190eXBlX3QgZ2V0UHJldmlld0lTVHlwZSgpOworICAgIHVpbnQ4X3QgZ2V0TW9iaWNhdE1hc2soKTsKKworICAgIGNhbV9mb2N1c19tb2RlX3R5cGUgZ2V0Rm9jdXNNb2RlKCkgY29uc3Qge3JldHVybiBtRm9jdXNNb2RlO307CisgICAgaW50MzJfdCBzZXROdW1PZlNuYXBzaG90KCk7CisgICAgaW50MzJfdCBhZGp1c3RQcmV2aWV3RnBzUmFuZ2UoY2FtX2Zwc19yYW5nZV90ICpmcHNSYW5nZSk7CisgICAgYm9vbCBpc0pwZWdQaWN0dXJlRm9ybWF0KCkge3JldHVybiAobVBpY3R1cmVGb3JtYXQgPT0gQ0FNX0ZPUk1BVF9KUEVHKTt9OworICAgIGJvb2wgaXNOVjE2UGljdHVyZUZvcm1hdCgpIHtyZXR1cm4gKG1QaWN0dXJlRm9ybWF0ID09IENBTV9GT1JNQVRfWVVWXzQyMl9OVjE2KTt9OworICAgIGJvb2wgaXNOVjIxUGljdHVyZUZvcm1hdCgpIHtyZXR1cm4gKG1QaWN0dXJlRm9ybWF0ID09IENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxKTt9OworICAgIGNhbV9kZW5vaXNlX3Byb2Nlc3NfdHlwZV90IGdldERlbm9pc2VQcm9jZXNzUGxhdGUoY2FtX2ludGZfcGFybV90eXBlX3QgdHlwZSk7CisgICAgaW50MzJfdCBnZXRNYXhQaWNTaXplKGNhbV9kaW1lbnNpb25fdCAmZGltKSB7IGRpbSA9IG1fbWF4UGljU2l6ZTsgcmV0dXJuIE5PX0VSUk9SOyB9OworICAgIGludCBnZXRGbGlwTW9kZShjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKKyAgICBib29sIGlzU25hcHNob3RGRE5lZWRlZCgpOworCisgICAgYm9vbCBpc0hEUjF4RnJhbWVFbmFibGVkKCkge3JldHVybiBtX2JIRFIxeEZyYW1lRW5hYmxlZDt9CisgICAgYm9vbCBpc1N1cHBvcnRlZFNlbnNvckhkclNpemUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcyk7CisgICAgYm9vbCBpc1lVVkZyYW1lSW5mb05lZWRlZCgpOworICAgIGNvbnN0IGNoYXIqZ2V0RnJhbWVGbXRTdHJpbmcoY2FtX2Zvcm1hdF90IGZtdCk7CisgICAgYm9vbCBpc0hEUjF4RXh0cmFCdWZmZXJOZWVkZWQoKSB7cmV0dXJuIG1fYkhEUjF4RXh0cmFCdWZmZXJOZWVkZWQ7fQorICAgIGJvb2wgaXNIRFJPdXRwdXRDcm9wRW5hYmxlZCgpIHtyZXR1cm4gbV9iSERST3V0cHV0Q3JvcEVuYWJsZWQ7fQorCisgICAgYm9vbCBpc1ByZXZpZXdGbGlwQ2hhbmdlZCgpIHsgcmV0dXJuIG1fYlByZXZpZXdGbGlwQ2hhbmdlZDsgfTsKKyAgICBib29sIGlzVmlkZW9GbGlwQ2hhbmdlZCgpIHsgcmV0dXJuIG1fYlZpZGVvRmxpcENoYW5nZWQ7IH07CisgICAgYm9vbCBpc1NuYXBzaG90RmxpcENoYW5nZWQoKSB7IHJldHVybiBtX2JTbmFwc2hvdEZsaXBDaGFuZ2VkOyB9OworICAgIHZvaWQgc2V0SERSU2NlbmVFbmFibGUoYm9vbCBiZmxhZyk7CisgICAgaW50MzJfdCB1cGRhdGVBV0JQYXJhbXMoY2FtX2F3Yl9wYXJhbXNfdCAmYXdiX3BhcmFtcyk7CisKKyAgICBjb25zdCBjaGFyICpnZXRBU0RTdGF0ZVN0cmluZyhjYW1fYXV0b19zY2VuZV90IHNjZW5lKTsKKyAgICBib29sIGlzSERSVGh1bWJuYWlsUHJvY2Vzc05lZWRlZCgpIHsgcmV0dXJuIG1fYkhEUlRodW1ibmFpbFByb2Nlc3NOZWVkZWQ7IH07CisgICAgdm9pZCBzZXRNaW5QcE1hc2soY2FtX2ZlYXR1cmVfbWFza190IG1pbl9wcF9tYXNrKSB7IG1fbk1pblJlcXVpcmVkUHBNYXNrID0gbWluX3BwX21hc2s7IH07CisgICAgYm9vbCBzZXRTdHJlYW1Db25maWd1cmUoYm9vbCBpc0NhcHR1cmUsIGJvb2wgcHJldmlld0FzUG9zdHZpZXcsIGJvb2wgcmVzZXRDb25maWcpOworICAgIGludDMyX3QgYWRkT25saW5lUm90YXRpb24odWludDMyX3Qgcm90YXRpb24sIHVpbnQzMl90IHN0cmVhbUlkLCBpbnQzMl90IGRldmljZV9yb3RhdGlvbik7CisgICAgdWludDhfdCBnZXROdW1PZkV4dHJhQnVmZmVyc0ZvckltYWdlUHJvYygpOworICAgIHVpbnQ4X3QgZ2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JWaWRlbygpOworICAgIHVpbnQ4X3QgZ2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JQcmV2aWV3KCk7CisgICAgdWludDMyX3QgZ2V0RXhpZkJ1ZkluZGV4KHVpbnQzMl90IGNhcHR1cmVJbmRleCk7CisgICAgYm9vbCBuZWVkVGh1bWJuYWlsUmVwcm9jZXNzKGNhbV9mZWF0dXJlX21hc2tfdCAqcEZlYXR1cmVNYXNrKTsKKyAgICBpbmxpbmUgYm9vbCBpc1ViaUZvY3VzRW5hYmxlZCgpIHtyZXR1cm4gbV9iQUZCcmFja2V0aW5nT24gJiYgIW1fYlJlRm9jdXNPbjt9OworICAgIGlubGluZSBib29sIGlzQ2hyb21hRmxhc2hFbmFibGVkKCkge3JldHVybiBtX2JDaHJvbWFGbGFzaE9uO307CisgICAgaW5saW5lIGJvb2wgaXNIaWdoUXVhbGl0eU5vaXNlUmVkdWN0aW9uTW9kZSgpIHtyZXR1cm4gbV9iSGlnaFF1YWxpdHlOb2lzZVJlZHVjdGlvbk1vZGU7fTsKKyAgICBpbmxpbmUgYm9vbCBpc1RydWVQb3J0cmFpdEVuYWJsZWQoKSB7cmV0dXJuIG1fYlRydWVQb3J0cmFpdE9uO307CisgICAgaW5saW5lIHNpemVfdCBnZXRUUE1heE1ldGFTaXplKCkgeworICAgICAgICByZXR1cm4gbV9wQ2FwYWJpbGl0eS0+dHJ1ZV9wb3J0cmFpdF9zZXR0aW5nc19uZWVkLm1ldGFfbWF4X3NpemU7fTsKKyAgICBpbmxpbmUgYm9vbCBpc1NlZU1vcmVFbmFibGVkKCkge3JldHVybiBtX2JTZWVNb3JlT247fTsKKyAgICBpbmxpbmUgYm9vbCBpc1N0aWxsTW9yZUVuYWJsZWQoKSB7cmV0dXJuIG1fYlN0aWxsTW9yZU9uO307CisgICAgYm9vbCBpc09wdGlab29tRW5hYmxlZCgpOworCisgICAgaW50MzJfdCBjb21taXRBRkJyYWNrZXQoY2FtX2FmX2JyYWNrZXRpbmdfdCBhZkJyYWNrZXQpOworICAgIGludDMyX3Qgc2V0M0FMb2NrKGJvb2wgbG9jazNBKTsKKyAgICBpbnQzMl90IHNldEFuZENvbW1pdFpvb20oaW50IHpvb21fbGV2ZWwpOworICAgIHVpbnQ4X3QgZ2V0QnVyc3RDb3VudEZvckFkdmFuY2VkQ2FwdHVyZSgpOworICAgIHVpbnQzMl90IGdldE51bWJlckluQnVmc0ZvclNpbmdsZVNob3QoKTsKKyAgICB1aW50MzJfdCBnZXROdW1iZXJPdXRCdWZzRm9yU2luZ2xlU2hvdCgpOworICAgIGludDMyX3Qgc2V0TG9uZ3Nob3RFbmFibGUoYm9vbCBlbmFibGUpOworICAgIFN0cmluZzggZHVtcCgpOworICAgIGlubGluZSBib29sIGlzVWJpUmVmb2N1cygpIHtyZXR1cm4gbV9iUmVGb2N1c09uICYmCisgICAgICAgICAgICAobV9wQ2FwYWJpbGl0eS0+cmVmb2N1c19hZl9icmFja2V0aW5nX25lZWQub3V0cHV0X2NvdW50ID4gMSk7fTsKKyAgICBpbmxpbmUgdWludDMyX3QgZ2V0UmVmb2N1c01heE1ldGFTaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIG1fcENhcGFiaWxpdHktPnJlZm9jdXNfYWZfYnJhY2tldGluZ19uZWVkLm1ldGFfbWF4X3NpemU7fTsKKyAgICBpbmxpbmUgdWludDhfdCBnZXRSZWZvY3VzT3V0cHV0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gbV9wQ2FwYWJpbGl0eS0+cmVmb2N1c19hZl9icmFja2V0aW5nX25lZWQub3V0cHV0X2NvdW50O307CisgICAgaW5saW5lIGJvb2wgZ2VuZXJhdGVUaHVtYkZyb21NYWluKCkge3JldHVybiBpc1ViaUZvY3VzRW5hYmxlZCgpIHx8CisgICAgICAgICAgICBpc0Nocm9tYUZsYXNoRW5hYmxlZCgpIHx8IGlzT3B0aVpvb21FbmFibGVkKCkgfHwgaXNVYmlSZWZvY3VzKCkKKyAgICAgICAgICAgIHx8IGlzSERSRW5hYmxlZCgpIHx8IGlzU3RpbGxNb3JlRW5hYmxlZCgpIHx8IGlzVHJ1ZVBvcnRyYWl0RW5hYmxlZCgpOyB9CisgICAgdm9pZCB1cGRhdGVDdXJyZW50Rm9jdXNQb3NpdGlvbihjYW1fZm9jdXNfcG9zX2luZm9fdCAmY3VyX3Bvc19pbmZvKTsKKyAgICB2b2lkIHVwZGF0ZUFFSW5mbyhjYW1fM2FfcGFyYW1zX3QgJmFlX3BhcmFtcyk7CisgICAgYm9vbCBpc0FkdkNhbUZlYXR1cmVzRW5hYmxlZCgpIHtyZXR1cm4gaXNVYmlGb2N1c0VuYWJsZWQoKSB8fAorICAgICAgICAgICAgaXNDaHJvbWFGbGFzaEVuYWJsZWQoKSB8fCBtX2JPcHRpWm9vbU9uIHx8IGlzSERSRW5hYmxlZCgpIHx8CisgICAgICAgICAgICBpc0FFQnJhY2tldEVuYWJsZWQoKSB8fCBpc1N0aWxsTW9yZUVuYWJsZWQoKSB8fCBpc1ViaVJlZm9jdXMoKTt9CisgICAgaW50MzJfdCBzZXRBZWNMb2NrKGNvbnN0IGNoYXIgKmFlY1N0cik7CisgICAgaW50MzJfdCB1cGRhdGVEZWJ1Z0xldmVsKCk7CisgICAgYm9vbCBpczRrMmtWaWRlb1Jlc29sdXRpb24oKTsKKyAgICBib29sIGlzVUJXQ0VuYWJsZWQoKTsKKworICAgIGludCBnZXRCcmlnaHRuZXNzKCk7CisgICAgaW50MzJfdCB1cGRhdGVPaXNWYWx1ZShib29sIG9pc1ZhbHVlKTsKKyAgICBpbnQzMl90IHNldEludEV2ZW50KGNhbV9pbnRfZXZ0X3BhcmFtc190IHBhcmFtcyk7CisgICAgYm9vbCBnZXRvZmZsaW5lUkFXKCkge3JldHVybiBtT2ZmbGluZVJBVzt9CisgICAgYm9vbCBnZXRRdWFkcmFDZmEoKTsKKyAgICBpbnQzMl90IHVwZGF0ZVBwRmVhdHVyZU1hc2soY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUpOworICAgIGludDMyX3QgZ2V0U3RyZWFtUHBNYXNrKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlLCBjYW1fZmVhdHVyZV9tYXNrX3QgJnBwX21hc2spOworICAgIGludDMyX3QgZ2V0U2hhcnBuZXNzKCkge3JldHVybiBtX25TaGFycG5lc3M7fTsKKyAgICBpbnQzMl90IGdldEVmZmVjdCgpIHtyZXR1cm4gbVBhcm1FZmZlY3Q7fTsKKyAgICBpbnQzMl90IHVwZGF0ZUZsYXNoTW9kZShjYW1fZmxhc2hfbW9kZV90IGZsYXNoX21vZGUpOworICAgIGludDMyX3QgY29uZmlndXJlQUVCcmFja2V0aW5nKGNhbV9jYXB0dXJlX2ZyYW1lX2NvbmZpZ190ICZmcmFtZV9jb25maWcpOworICAgIGludDMyX3QgY29uZmlndXJlSERSQnJhY2tldGluZyhjYW1fY2FwdHVyZV9mcmFtZV9jb25maWdfdCAmZnJhbWVfY29uZmlnKTsKKyAgICBpbnQzMl90IGNvbmZpZ0ZyYW1lQ2FwdHVyZShib29sIGNvbW1pdFNldHRpbmdzKTsKKyAgICBpbnQzMl90IHJlc2V0RnJhbWVDYXB0dXJlKGJvb2wgY29tbWl0U2V0dGluZ3MsIGJvb2wgbG93TGlnaHRFbmFibGVkKTsKKyAgICBjYW1fc3RpbGxfbW9yZV90IGdldFN0aWxsTW9yZVNldHRpbmdzKCkge3JldHVybiBtX3N0aWxsbW9yZV9jb25maWc7fTsKKyAgICB2b2lkIHNldFN0aWxsTW9yZVNldHRpbmdzKGNhbV9zdGlsbF9tb3JlX3Qgc3RpbGxtb3JlX2NvbmZpZykKKyAgICAgICAgICAgIHttX3N0aWxsbW9yZV9jb25maWcgPSBzdGlsbG1vcmVfY29uZmlnO307CisgICAgY2FtX3N0aWxsX21vcmVfdCBnZXRTdGlsbE1vcmVDYXBhYmlsaXR5KCkKKyAgICAgICAgICAgIHtyZXR1cm4gbV9wQ2FwYWJpbGl0eS0+c3RpbGxtb3JlX3NldHRpbmdzX25lZWQ7fTsKKyAgICBjYW1fZHluX2ltZ19kYXRhX3QgZ2V0RHluYW1pY0ltZ0RhdGEoKSB7IHJldHVybiBtX0R5bmFtaWNJbWdEYXRhOyB9CisgICAgdm9pZCBzZXREeW5hbWljSW1nRGF0YShjYW1fZHluX2ltZ19kYXRhX3QgZCkgeyBtX0R5bmFtaWNJbWdEYXRhID0gZDsgfQorCisgICAgaW50MzJfdCBnZXRQYXJtWm9vbUxldmVsKCl7cmV0dXJuIG1QYXJtWm9vbUxldmVsO307CisgICAgaW50OF90ICBnZXRSZXByb2NDb3VudCgpe3JldHVybiBtVG90YWxQUENvdW50O307CisgICAgYm9vbCBpc011bHRpUGFzc1JlcHJvY2Vzc2luZygpOworICAgIGludDhfdCAgZ2V0Q3VyUFBDb3VudCgpe3JldHVybiBtQ3VyUFBDb3VudDt9OworICAgIHZvaWQgICAgc2V0UmVwcm9jQ291bnQoKTsKKyAgICBib29sICAgIGlzUG9zdFByb2NTY2FsaW5nKCk7CisgICAgYm9vbCAgICBpc0xMTm9pc2VFbmFibGVkKCk7CisgICAgdm9pZCAgICBzZXRDdXJQUENvdW50KGludDhfdCBjb3VudCkge21DdXJQUENvdW50ID0gY291bnQ7fTsKKyAgICBpbnQzMl90IHNldFF1YWRyYUNmYU1vZGUodWludDMyX3QgdmFsdWUsIGJvb2wgaW5pdENvbW1pdCk7CisgICAgaW50MzJfdCBzZXRUb25lTWFwTW9kZSh1aW50MzJfdCB2YWx1ZSwgYm9vbCBpbml0Q29tbWl0KTsKKyAgICB2b2lkIHNldFRpbnRsZXNzKGJvb2wgZW5hYmxlKTsKKyAgICB1aW50OF90IGdldExvbmdzaG90U3RhZ2VzKCk7CisgICAgaW50OF90ICBnZXRCdWZCYXRjaENvdW50KCkge3JldHVybiBtQnVmQmF0Y2hDbnQ7fTsKKyAgICBpbnQ4X3QgIGdldFZpZGVvQmF0Y2hTaXplKCkge3JldHVybiBtVmlkZW9CYXRjaFNpemU7fTsKKworICAgIGludDMyX3Qgc2V0TWFudWFsQ2FwdHVyZU1vZGUoCisgICAgICAgICAgICBRQ2FtZXJhTWFudWFsQ2FwdHVyZU1vZGVzIHZhbHVlID0gQ0FNX01BTlVBTF9DQVBUVVJFX1RZUEVfT0ZGKTsKKyAgICBRQ2FtZXJhTWFudWFsQ2FwdHVyZU1vZGVzIGdldE1hbnVhbENhcHR1cmVNb2RlKCkKKyAgICAgICAgICAgIHtyZXR1cm4gbV9NYW51YWxDYXB0dXJlTW9kZTt9OworICAgIGludDY0X3QgZ2V0RXhwb3N1cmVUaW1lKCkge3JldHVybiBtX2V4cFRpbWU7fTsKKworICAgIGNhbV9jYXB0dXJlX2ZyYW1lX2NvbmZpZ190IGdldENhcHR1cmVGcmFtZUNvbmZpZygpCisgICAgICAgICAgICB7IHJldHVybiBtX2NhcHR1cmVGcmFtZUNvbmZpZzsgfTsKKyAgICB2b2lkIHNldEpwZWdSb3RhdGlvbihpbnQgcm90YXRpb24pOworICAgIHVpbnQzMl90IGdldEpwZWdSb3RhdGlvbigpIHsgcmV0dXJuIG1KcGVnUm90YXRpb247fTsKKworICAgIHZvaWQgc2V0TG93TGlnaHRMZXZlbChjYW1fbG93X2xpZ2h0X21vZGVfdCB2YWx1ZSkKKyAgICAgICAgICAgIHsgbV9Mb3dMaWdodExldmVsID0gdmFsdWU7IH07CisgICAgY2FtX2xvd19saWdodF9tb2RlX3QgZ2V0TG93TGlnaHRMZXZlbCgpIHtyZXR1cm4gbV9Mb3dMaWdodExldmVsO307CisgICAgYm9vbCBnZXRMb3dMaWdodENhcHR1cmUoKSB7IHJldHVybiBtX0xMQ2FwdHVyZUVuYWJsZWQ7IH07CisKKyAgICAvKiBEdWFsIGNhbWVyYSBzcGVjaWZpYyAqLworICAgIGJvb2wgZ2V0RGNyZigpIHsgcmV0dXJuIG1fYkRjcmZFbmFibGVkOyB9CisgICAgaW50MzJfdCBzZXRSZWxhdGVkQ2FtU3luY0luZm8oCisgICAgICAgICAgICBjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KiBpbmZvKTsKKyAgICBjb25zdCBjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KgorICAgICAgICAgICAgZ2V0UmVsYXRlZENhbVN5bmNJbmZvKHZvaWQpOworICAgIGludDMyX3Qgc2V0RnJhbWVTeW5jRW5hYmxlZChib29sIGVuYWJsZSk7CisgICAgYm9vbCBpc0ZyYW1lU3luY0VuYWJsZWQodm9pZCk7CisgICAgaW50MzJfdCBnZXRSZWxhdGVkQ2FtQ2FsaWJyYXRpb24oCisgICAgICAgICAgICBjYW1fcmVsYXRlZF9zeXN0ZW1fY2FsaWJyYXRpb25fZGF0YV90KiBjYWxpYik7CisgICAgaW50MzJfdCBidW5kbGVSZWxhdGVkQ2FtZXJhcyhib29sIHN5bmMsIHVpbnQzMl90IHNlc3Npb25pZCk7CisgICAgdWludDhfdCBmZE1vZGVJblZpZGVvKCk7CisgICAgYm9vbCBpc09FTUZlYXRFbmFibGVkKCkgeyByZXR1cm4gbV9iT0VNRmVhdEVuYWJsZWQ7IH0KKworICAgIGludDMyX3Qgc2V0WnNsTW9kZShib29sIHZhbHVlKTsKKyAgICBpbnQzMl90IHVwZGF0ZVpTTE1vZGVWYWx1ZShib29sIHZhbHVlKTsKKworICAgIGJvb2wgaXNSZXByb2NTY2FsZUVuYWJsZWQoKTsKKyAgICBib29sIGlzVW5kZXJSZXByb2NTY2FsaW5nKCk7CisgICAgaW50MzJfdCBnZXRQaWNTaXplRnJvbUFQSyhpbnQgJndpZHRoLCBpbnQgJmhlaWdodCk7CisKKyAgICBpbnQzMl90IGNoZWNrRmVhdHVyZUNvbmN1cnJlbmN5KCk7CisgICAgaW50MzJfdCBzZXRJbnN0YW50QUVDKHVpbnQ4X3QgZW5hYmxlLCBib29sIGluaXRDb21taXQpOworCisgICAgaW50MzJfdCBnZXRBbmFseXNpc0luZm8oCisgICAgICAgIGJvb2wgZmRWaWRlb0VuYWJsZWQsCisgICAgICAgIGJvb2wgaGFsMywKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IGZlYXR1cmVNYXNrLAorICAgICAgICBjYW1fYW5hbHlzaXNfaW5mb190ICpwQW5hbHlzaXNJbmZvKTsKKworICAgIGludDMyX3QgZ2V0TWV0YVJhd0luZm8oKTsKKyAgICBib29sIHNlbmRTdHJlYW1Db25maWdGb3JQaWNrUmVzKGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QgJnN0cmVhbV9jb25maWdfaW5mbyk7CisgICAgaW50MzJfdCB1cGRhdGVEdFZjKGludDMyX3QgKmR0LCBpbnQzMl90ICp2Yyk7CisKK3ByaXZhdGU6CisgICAgaW50MzJfdCBzZXRQcmV2aWV3U2l6ZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldFZpZGVvU2l6ZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldFBpY3R1cmVTaXplKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0TGl2ZVNuYXBzaG90U2l6ZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldFByZXZpZXdGb3JtYXQoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRQaWN0dXJlRm9ybWF0KGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0T3JpZW50YXRpb24oY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRKcGVnVGh1bWJuYWlsU2l6ZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldEpwZWdRdWFsaXR5KGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0UHJldmlld0Zwc1JhbmdlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0UHJldmlld0ZyYW1lUmF0ZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldEF1dG9FeHBvc3VyZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldEVmZmVjdChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldEJyaWdodG5lc3MoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRGb2N1c01vZGUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRGb2N1c1Bvc2l0aW9uKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0U2hhcnBuZXNzKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0U2F0dXJhdGlvbihjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldENvbnRyYXN0KGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0U2tpblRvbmVFbmhhbmNlbWVudChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldFNjZW5lRGV0ZWN0KGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0VmlkZW9IRFIoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRWdEVuYWJsZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldFpvb20oY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRJU09WYWx1ZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldENvbnRpbnVvdXNJU08oY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRFeHBvc3VyZVRpbWUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRSb3RhdGlvbihjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldFZpZGVvUm90YXRpb24oY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRGbGFzaChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldEFlY0xvY2soY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRBd2JMb2NrKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0TUNFVmFsdWUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRESVNWYWx1ZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKTsKKyAgICBpbnQzMl90IHNldExlbnNTaGFkZVZhbHVlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0RXhwb3N1cmVDb21wZW5zYXRpb24oY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRXaGl0ZUJhbGFuY2UoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRNYW51YWxXaGl0ZUJhbGFuY2UoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRBbnRpYmFuZGluZyhjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldEZvY3VzQXJlYXMoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRNZXRlcmluZ0FyZWFzKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0U2NlbmVNb2RlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0U2VsZWN0YWJsZVpvbmVBZihjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldEFFQnJhY2tldChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldEFGQnJhY2tldChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldFJlRm9jdXMoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRDaHJvbWFGbGFzaChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldE9wdGlab29tKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0SERSTW9kZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldEhEUk5lZWQxeChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldFRydWVQb3J0cmFpdChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldFNlZU1vcmUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRTdGlsbE1vcmUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisjaWZkZWYgVEFSR0VUX1RTX01BS0VVUAorICAgIGludDMyX3Qgc2V0VHNNYWtldXAoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisjZW5kaWYKKyAgICBpbnQzMl90IHNldE5vaXNlUmVkdWN0aW9uTW9kZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldFJlZGV5ZVJlZHVjdGlvbihjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldEdwc0xvY2F0aW9uKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0UmVjb3JkaW5nSGludChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldE5vRGlzcGxheU1vZGUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRXYXZlbGV0RGVub2lzZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldFRlbXBvcmFsRGVub2lzZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYpOworICAgIGludDMyX3Qgc2V0WnNsTW9kZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldFpzbEF0dHJpYnV0ZXMoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRBdXRvSERSKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpOworICAgIGludDMyX3Qgc2V0Q2FtZXJhTW9kZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldFNjZW5lU2VsZWN0aW9uTW9kZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKTsKKyAgICBpbnQzMl90IHNldEZhY2VSZWNvZ25pdGlvbihjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldEZsaXAoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRSZXRyb0FjdGl2ZUJ1cnN0TnVtKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpOworICAgIGludDMyX3Qgc2V0QnVyc3RMRURPblBlcmlvZChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKTsKKyAgICBpbnQzMl90IHNldFNuYXBzaG90RkRSZXEoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICk7CisgICAgaW50MzJfdCBzZXRTdGF0c0RlYnVnTWFzaygpOworICAgIGludDMyX3Qgc2V0UEFBRigpOworICAgIGludDMyX3Qgc2V0VGludGxlc3NWYWx1ZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKTsKKyAgICBpbnQzMl90IHNldENEU01vZGUoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcyk7CisgICAgaW50MzJfdCBzZXRJbml0aWFsRXhwb3N1cmVJbmRleChjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKTsKKyAgICBpbnQzMl90IHNldEluc3RhbnRDYXB0dXJlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpOworICAgIGludDMyX3Qgc2V0SW5zdGFudEFFQyhjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKTsKKyAgICBpbnQzMl90IHNldE1vYmljYXQoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcyk7CisgICAgaW50MzJfdCBzZXRSZGlNb2RlKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiApOworICAgIGludDMyX3Qgc2V0U2VjdXJlTW9kZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgKTsKKyAgICBpbnQzMl90IHNldENhY2hlVmlkZW9CdWZmZXJzKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpOworICAgIGludDMyX3Qgc2V0Q3VzdG9tUGFyYW1zKGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpOworICAgIGludDMyX3Qgc2V0QXV0b0V4cG9zdXJlKGNvbnN0IGNoYXIgKmF1dG9FeHApOworICAgIGludDMyX3Qgc2V0UHJldmlld0Zwc1JhbmdlKGludCBtaW5fZnBzLGludCBtYXhfZnBzLAorICAgICAgICAgICAgaW50IHZpZF9taW5fZnBzLGludCB2aWRfbWF4X2Zwcyk7CisgICAgaW50MzJfdCBzZXRFZmZlY3QoY29uc3QgY2hhciAqZWZmZWN0KTsKKyAgICBpbnQzMl90IHNldEJyaWdodG5lc3MoaW50IGJyaWdodG5lc3MpOworICAgIGludDMyX3Qgc2V0Rm9jdXNNb2RlKGNvbnN0IGNoYXIgKmZvY3VzTW9kZSk7CisgICAgaW50MzJfdCBzZXRGb2N1c1Bvc2l0aW9uKGNvbnN0IGNoYXIgKnR5cGVTdHIsIGNvbnN0IGNoYXIgKnBvc1N0cik7CisgICAgaW50MzJfdCBzZXRTaGFycG5lc3MoaW50IHNoYXJwbmVzcyk7CisgICAgaW50MzJfdCBzZXRTYXR1cmF0aW9uKGludCBzYXR1cmF0aW9uKTsKKyAgICBpbnQzMl90IHNldENvbnRyYXN0KGludCBjb250cmFzdCk7CisgICAgaW50MzJfdCBzZXRTa2luVG9uZUVuaGFuY2VtZW50KGludCBzY2VGYWN0b3IpOworICAgIGludDMyX3Qgc2V0U2NlbmVEZXRlY3QoY29uc3QgY2hhciAqc2NlbmREZXRlY3QpOworICAgIGludDMyX3Qgc2V0VmlkZW9IRFIoY29uc3QgY2hhciAqdmlkZW9IRFIpOworICAgIGludDMyX3Qgc2V0U2Vuc29yU25hcHNob3RIRFIoY29uc3QgY2hhciAqc25hcHNob3RIRFIpOworICAgIGludDMyX3Qgc2V0VnRFbmFibGUoY29uc3QgY2hhciAqdnRFbmFibGUpOworICAgIGludDMyX3Qgc2V0Wm9vbShpbnQgem9vbV9sZXZlbCk7CisgICAgaW50MzJfdCBzZXRJU09WYWx1ZShjb25zdCBjaGFyICppc29WYWx1ZSk7CisgICAgaW50MzJfdCBzZXRDb250aW51b3VzSVNPKGNvbnN0IGNoYXIgKmlzb1ZhbHVlKTsKKyAgICBpbnQzMl90IHNldEV4cG9zdXJlVGltZShjb25zdCBjaGFyICpleHBUaW1lU3RyKTsKKyAgICBpbnQzMl90IHNldEZsYXNoKGNvbnN0IGNoYXIgKmZsYXNoU3RyKTsKKyAgICBpbnQzMl90IHNldEF3YkxvY2soY29uc3QgY2hhciAqYXdiU3RyKTsKKyAgICBpbnQzMl90IHNldE1DRVZhbHVlKGNvbnN0IGNoYXIgKm1jZVN0cik7CisgICAgaW50MzJfdCBzZXRESVNWYWx1ZShjb25zdCBjaGFyICpkaXNTdHIpOworICAgIGludDMyX3Qgc2V0SGlnaEZyYW1lUmF0ZShjb25zdCBpbnQzMl90IGhmck1vZGUpOworICAgIGludDMyX3Qgc2V0TGVuc1NoYWRlVmFsdWUoY29uc3QgY2hhciAqbGVuc1NoYWRlU3RyKTsKKyAgICBpbnQzMl90IHNldEV4cG9zdXJlQ29tcGVuc2F0aW9uKGludCBleHBDb21wKTsKKyAgICBpbnQzMl90IHNldFdoaXRlQmFsYW5jZShjb25zdCBjaGFyICp3YlN0cik7CisgICAgaW50MzJfdCBzZXRXQk1hbnVhbENDVChjb25zdCBjaGFyICpjY3RTdHIpOworICAgIGludDMyX3Qgc2V0TWFudWFsV0JHYWlucyhjb25zdCBjaGFyICpnYWluU3RyKTsKKyAgICBpbnQzMl90IHNldEFudGliYW5kaW5nKGNvbnN0IGNoYXIgKmFudGlCYW5kaW5nU3RyKTsKKyAgICBpbnQzMl90IHNldEZvY3VzQXJlYXMoY29uc3QgY2hhciAqZm9jdXNBcmVhc1N0cik7CisgICAgaW50MzJfdCBzZXRNZXRlcmluZ0FyZWFzKGNvbnN0IGNoYXIgKm1ldGVyaW5nQXJlYXNTdHIpOworICAgIGludDMyX3Qgc2V0U2NlbmVNb2RlKGNvbnN0IGNoYXIgKnNjZW5lTW9kZVN0cik7CisgICAgaW50MzJfdCBzZXRTZWxlY3RhYmxlWm9uZUFmKGNvbnN0IGNoYXIgKnNlbFpvbmVBRlN0cik7CisgICAgaW50MzJfdCBzZXRBRUJyYWNrZXQoY29uc3QgY2hhciAqYWVjQnJhY2tldFN0cik7CisgICAgaW50MzJfdCBzZXRBRkJyYWNrZXQoY29uc3QgY2hhciAqYWZCcmFja2V0U3RyKTsKKyAgICBpbnQzMl90IHNldFJlRm9jdXMoY29uc3QgY2hhciAqcmVGb2N1c1N0cik7CisgICAgaW50MzJfdCBzZXRDaHJvbWFGbGFzaChjb25zdCBjaGFyICpjaHJvbWFGbGFzaFN0cik7CisgICAgaW50MzJfdCBzZXRPcHRpWm9vbShjb25zdCBjaGFyICpvcHRpWm9vbVN0cik7CisgICAgaW50MzJfdCBzZXRIRFJNb2RlKGNvbnN0IGNoYXIgKm9wdGlab29tU3RyKTsKKyAgICBpbnQzMl90IHNldEhEUk5lZWQxeChjb25zdCBjaGFyICpvcHRpWm9vbVN0cik7CisgICAgaW50MzJfdCBzZXRUcnVlUG9ydHJhaXQoY29uc3QgY2hhciAqdHJ1ZVBvcnRyYWl0U3RyKTsKKyAgICBpbnQzMl90IHNldFNlZU1vcmUoY29uc3QgY2hhciAqU2VlTW9yZVN0cik7CisgICAgaW50MzJfdCBzZXRTdGlsbE1vcmUoY29uc3QgY2hhciAqU3RpbGxNb3JlU3RyKTsKKyAgICBpbnQzMl90IHNldE5vaXNlUmVkdWN0aW9uTW9kZShjb25zdCBjaGFyICpub2lzZVJlZHVjdGlvbk1vZGVTdHIpOworICAgIGludDMyX3Qgc2V0UmVkZXllUmVkdWN0aW9uKGNvbnN0IGNoYXIgKnJlZGV5ZVN0cik7CisgICAgaW50MzJfdCBzZXRXYXZlbGV0RGVub2lzZShjb25zdCBjaGFyICp3bnJTdHIpOworICAgIGludDMyX3Qgc2V0RmFjZVJlY29nbml0aW9uKGNvbnN0IGNoYXIgKmZhY2VSZWNvZywgdWludDMyX3QgbWF4RmFjZXMpOworICAgIGludDMyX3Qgc2V0VGludGxlc3NWYWx1ZShjb25zdCBjaGFyICp0aW50U3RyKTsKKyAgICBib29sIFVwZGF0ZUhGUkZyYW1lUmF0ZShjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgcGFyYW1zKTsKKyAgICBpbnQzMl90IHNldFJkaU1vZGUoY29uc3QgY2hhciAqc3RyKTsKKyAgICBpbnQzMl90IHNldFNlY3VyZU1vZGUoY29uc3QgY2hhciAqc3RyKTsKKyAgICBpbnQzMl90IHNldExvbmdzaG90UGFyYW0oY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcyk7CisgICAgaW50MzJfdCBwYXJzZUdhaW5zKGNvbnN0IGNoYXIgKmdhaW5TdHIsIGRvdWJsZSAmcl9nYWluLAorICAgICAgICAgICAgZG91YmxlICZnX2dhaW4sIGRvdWJsZSAmYl9nYWluKTsKKyAgICBpbnQzMl90IHNldENhY2hlVmlkZW9CdWZmZXJzKGNvbnN0IGNoYXIgKmNhY2hlVmlkZW9CdWZTdHIpOworICAgIGludDMyX3Qgc2V0Q0RTTW9kZShpbnQzMl90IGNkc19tb2RlLCBib29sIGluaXRDb21taXQpOworICAgIGludDMyX3Qgc2V0RXp0dW5lKCk7CisgICAgdm9pZCBzZXRMb3dMaWdodENhcHR1cmUoKTsKKyAgICBpbnQgc2V0UmVjb3JkaW5nSGludFZhbHVlKGludDMyX3QgdmFsdWUpOyAvLyBzZXQgbG9jYWwgY29weSBvZiB2aWRlbyBoaW50IGFuZCBzZW5kIHRvIHNlcnZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZSBpbiBwYXJhbWV0ZXJzIHZhbHVlCisgICAgaW50MzJfdCB1cGRhdGVGbGFzaChib29sIGNvbW1pdFNldHRpbmdzKTsKKyAgICBpbnQzMl90IHNldFJhd1NpemUoY2FtX2RpbWVuc2lvbl90ICZkaW0pOworICAgIGludDMyX3Qgc2V0TWF4UGljU2l6ZShjYW1fZGltZW5zaW9uX3QgJmRpbSkgeyBtX21heFBpY1NpemUgPSBkaW07IHJldHVybiBOT19FUlJPUjsgfTsKKyAgICB2b2lkIHNldEJ1ZkJhdGNoQ291bnQoaW50OF90IGJ1Zl9jbnQpOworICAgIHZvaWQgc2V0VmlkZW9CYXRjaFNpemUoKTsKKyAgICB2b2lkIHNldERjcmYoKTsKKyAgICBpbnQzMl90IHNldFN0cmVhbVBwTWFzayhjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwgY2FtX2ZlYXR1cmVfbWFza190IHBwX21hc2spOworICAgIHZvaWQgc2V0T2ZmbGluZVJBVyhib29sIHZhbHVlID0gMCk7CisgICAgaW50MzJfdCBzZXRRdWFkcmFDZmEoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcyk7CisgICAgaW50MzJfdCBjb25maWd1cmVGbGFzaChjYW1fY2FwdHVyZV9mcmFtZV9jb25maWdfdCAmZnJhbWVfY29uZmlnKTsKKyAgICBpbnQzMl90IGNvbmZpZ3VyZUxvd0xpZ2h0KGNhbV9jYXB0dXJlX2ZyYW1lX2NvbmZpZ190ICZmcmFtZV9jb25maWcpOworICAgIGludDMyX3QgY29uZmlndXJlTWFudWFsQ2FwdHVyZShjYW1fY2FwdHVyZV9mcmFtZV9jb25maWdfdCAmZnJhbWVfY29uZmlnKTsKKworICAgIGJvb2wgaXNUTlJQcmV2aWV3RW5hYmxlZCgpIHtyZXR1cm4gbV9iVE5SUHJldmlld09uO307CisgICAgYm9vbCBpc1ROUlZpZGVvRW5hYmxlZCgpIHtyZXR1cm4gbV9iVE5SVmlkZW9Pbjt9OworICAgIGJvb2wgZ2V0RmFjZURldGVjdGlvbk9wdGlvbigpIHsgcmV0dXJuICBtX2JGYWNlRGV0ZWN0aW9uT247fQorICAgIGJvb2wgaXNBVlRpbWVyRW5hYmxlZCgpOworICAgIHZvaWQgZ2V0TGl2ZVNuYXBzaG90U2l6ZShjYW1fZGltZW5zaW9uX3QgJmRpbSk7CisgICAgaW50MzJfdCBnZXRSYXdTaXplKGNhbV9kaW1lbnNpb25fdCAmZGltKSB7ZGltID0gbV9yYXdTaXplOyByZXR1cm4gTk9fRVJST1I7fTsKKyAgICBpbnQgZ2V0QXV0b0ZsaWNrZXJNb2RlKCk7CisgICAgYm9vbCBzZW5kU3RyZWFtQ29uZmlnSW5mbyhjYW1fc3RyZWFtX3NpemVfaW5mb190ICZzdHJlYW1fY29uZmlnX2luZm8pOworICAgIGlubGluZSBib29sIGlzTG93TWVtb3J5RGV2aWNlKCkge3JldHVybiBtX2JJc0xvd01lbW9yeURldmljZTt9OworICAgIGJvb2wgaXNQcmV2aWV3U2VlTW9yZVJlcXVpcmVkKCk7CisgICAgYm9vbCBpc0V6dHVuZUVuYWJsZWQoKSB7IHJldHVybiBtX2JFenR1bmVFbmFibGVkOyB9OworICAgIGludDMyX3QgZ2V0Wm9vbUxldmVsKCl7cmV0dXJuIG1ab29tTGV2ZWw7fTsKKyAgICBpbnQzMl90IHBhcnNlX3BhaXIoY29uc3QgY2hhciAqc3RyLCBpbnQgKmZpcnN0LCBpbnQgKnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hhciBkZWxpbSwgY2hhciAqKmVuZHB0cik7CisgICAgdm9pZCBwYXJzZVNpemVzTGlzdChjb25zdCBjaGFyICpzaXplc1N0ciwgVmVjdG9yPFNpemU+ICZzaXplcyk7CisgICAgaW50MzJfdCBwYXJzZU5EaW1WZWN0b3IoY29uc3QgY2hhciAqc3RyLCBpbnQgKm51bSwgaW50IE4sIGNoYXIgZGVsaW0pOworICAgIGludDMyX3QgcGFyc2VDYW1lcmFBcmVhU3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IG1heF9udW1fYXJlYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2FyZWFfdCAqcEFyZWFzLCBpbnQmIG51bV9hcmVhc19mb3VuZCk7CisgICAgYm9vbCB2YWxpZGF0ZUNhbWVyYUFyZWFzKGNhbV9hcmVhX3QgKmFyZWFzLCBpbnQgbnVtX2FyZWFzKTsKKyAgICBpbnQgcGFyc2VHUFNDb29yZGluYXRlKGNvbnN0IGNoYXIgKmNvb3JkX3N0ciwgcmF0X3QgKmNvb3JkKTsKKyAgICBpbnQzMl90IGdldFJhdGlvbmFsKHJhdF90ICpyYXQsIGludCBudW0sIGludCBkZW5vbSk7CisgICAgU3RyaW5nOCBjcmVhdGVTaXplc1N0cmluZyhjb25zdCBjYW1fZGltZW5zaW9uX3QgKnNpemVzLCBzaXplX3QgbGVuKTsKKyAgICBTdHJpbmc4IGNyZWF0ZUhmclZhbHVlc1N0cmluZyhjb25zdCBjYW1faGZyX2luZm9fdCAqdmFsdWVzLCBzaXplX3QgbGVuLAorICAgICAgICAgICAgY29uc3QgUUNhbWVyYU1hcDxjYW1faGZyX21vZGVfdD4gKm1hcCwgc2l6ZV90IG1hcF9sZW4pOworICAgIFN0cmluZzggY3JlYXRlSGZyU2l6ZXNTdHJpbmcoY29uc3QgY2FtX2hmcl9pbmZvX3QgKnZhbHVlcywgc2l6ZV90IGxlbik7CisgICAgU3RyaW5nOCBjcmVhdGVGcHNSYW5nZVN0cmluZyhjb25zdCBjYW1fZnBzX3JhbmdlX3QgKmZwcywKKyAgICAgICAgICAgIHNpemVfdCBsZW4sIGludCAmZGVmYXVsdF9mcHNfaW5kZXgpOworICAgIFN0cmluZzggY3JlYXRlRnBzU3RyaW5nKGNhbV9mcHNfcmFuZ2VfdCAmZnBzKTsKKyAgICBTdHJpbmc4IGNyZWF0ZVpvb21SYXRpb1ZhbHVlc1N0cmluZyh1aW50MzJfdCAqem9vbVJhdGlvcywgc2l6ZV90IGxlbmd0aCk7CisgICAgaW50MzJfdCBzZXREdWFsTGVkQ2FsaWJyYXRpb24oY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcyk7CisgICAgaW50MzJfdCBzZXRBZHZhbmNlZENhcHR1cmVNb2RlKCk7CisKKyAgICAvLyBvcHMgZm9yIGJhdGNoIHNldC9nZXQgcGFyYW1zIHdpdGggc2VydmVyCisgICAgaW50MzJfdCBpbml0QmF0Y2hVcGRhdGUocGFybV9idWZmZXJfdCAqcF90YWJsZSk7CisgICAgaW50MzJfdCBjb21taXRTZXRCYXRjaCgpOworICAgIGludDMyX3QgY29tbWl0R2V0QmF0Y2goKTsKKworICAgIC8vIG9wcyB0byB0ZW1wb3JvcmlseSB1cGRhdGUgcGFyYW1ldGVyIGVudHJpZXMgYW5kIGNvbW1pdAorICAgIGludDMyX3QgdXBkYXRlUGFyYW1FbnRyeShjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKTsKKyAgICBpbnQzMl90IGNvbW1pdFBhcmFtQ2hhbmdlcygpOworICAgIHZvaWQgdXBkYXRlVmlld0FuZ2xlcygpOworCisgICAgLy8gTWFwIGZyb20gc3RyaW5ncyB0byB2YWx1ZXMKKyAgICBzdGF0aWMgY29uc3QgY2FtX2RpbWVuc2lvbl90IFRIVU1CTkFJTF9TSVpFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxjYW1fYXV0b19leHBvc3VyZV9tb2RlX3R5cGU+IEFVVE9fRVhQT1NVUkVfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8Y2FtX2FlY19jb252ZXJnZW5jZV90eXBlPiBJTlNUQU5UX0NBUFRVUkVfTU9ERVNfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8Y2FtX2FlY19jb252ZXJnZW5jZV90eXBlPiBJTlNUQU5UX0FFQ19NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxjYW1fZm9ybWF0X3Q+IFBSRVZJRVdfRk9STUFUU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxjYW1fZm9ybWF0X3Q+IFBJQ1RVUkVfVFlQRVNfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8Y2FtX2ZvY3VzX21vZGVfdHlwZT4gRk9DVVNfTU9ERVNfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8Y2FtX2VmZmVjdF9tb2RlX3R5cGU+IEVGRkVDVF9NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxjYW1fc2NlbmVfbW9kZV90eXBlPiBTQ0VORV9NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxjYW1fZmxhc2hfbW9kZV90PiBGTEFTSF9NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxjYW1fZm9jdXNfYWxnb3JpdGhtX3R5cGU+IEZPQ1VTX0FMR09fTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8Y2FtX3diX21vZGVfdHlwZT4gV0hJVEVfQkFMQU5DRV9NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxjYW1fYW50aWJhbmRpbmdfbW9kZV90eXBlPiBBTlRJQkFORElOR19NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxjYW1faXNvX21vZGVfdHlwZT4gSVNPX01PREVTX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGNhbV9oZnJfbW9kZV90PiBIRlJfTU9ERVNfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8Y2FtX2JyYWNrZXRfbW9kZT4gQlJBQ0tFVElOR19NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxpbnQ+IE9OX09GRl9NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxpbnQ+IEVOQUJMRV9ESVNBQkxFX01PREVTX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGludD4gREVOT0lTRV9PTl9PRkZfTU9ERVNfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8aW50PiBUUlVFX0ZBTFNFX01PREVTX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGludD4gVE9VQ0hfQUZfQUVDX01PREVTX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGNhbV9mbGlwX3Q+IEZMSVBfTU9ERVNfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8aW50PiBBRl9CUkFDS0VUSU5HX01PREVTX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGludD4gUkVfRk9DVVNfTU9ERVNfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8aW50PiBDSFJPTUFfRkxBU0hfTU9ERVNfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8aW50PiBPUFRJX1pPT01fTU9ERVNfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8aW50PiBUUlVFX1BPUlRSQUlUX01PREVTX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGNhbV9jZHNfbW9kZV90eXBlX3Q+IENEU19NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxpbnQ+IEhEUl9NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxpbnQ+IFZJREVPX1JPVEFUSU9OX01PREVTX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGludD4gU0VFX01PUkVfTU9ERVNfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8aW50PiBTVElMTF9NT1JFX01PREVTX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGludD4gTk9JU0VfUkVEVUNUSU9OX01PREVTX01BUFtdOworCisgICAgUUNhbWVyYVJlcHJvY1NjYWxlUGFyYW0gbV9yZXByb2NTY2FsZVBhcmFtOworICAgIFFDYW1lcmFDb21tb24gICAgICAgICAgIG1Db21tb247CisKKyAgICBjYW1fY2FwYWJpbGl0eV90ICptX3BDYXBhYmlsaXR5OworICAgIG1tX2NhbWVyYV92dGJsX3QgKm1fcENhbU9wc1RibDsKKyAgICBRQ2FtZXJhSGVhcE1lbW9yeSAqbV9wUGFyYW1IZWFwOworICAgIHBhcm1fYnVmZmVyX3QgICAgICptX3BQYXJhbUJ1ZjsgIC8vIHB0ciB0byBwYXJhbSBidWYgaW4gbV9wUGFyYW1IZWFwCisgICAgLyogaGVhcCBmb3IgbWFwcGluZyBkdWFsIGNhbSBldmVudCBpbmZvICovCisgICAgUUNhbWVyYUhlYXBNZW1vcnkgKm1fcFJlbENhbVN5bmNIZWFwOworICAgIC8qIHB0ciB0byBzeW5jIGJ1ZmZlciBpbiBtX3BSZWxDYW1TeW5jSGVhcCAqLworICAgIGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QgKm1fcFJlbENhbVN5bmNCdWY7CisgICAgY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCBtX3JlbENhbVN5bmNJbmZvOworICAgIGJvb2wgbV9iRnJhbWVTeW5jRW5hYmxlZDsKKyAgICBjYW1faXNfdHlwZV90IG1Jc1R5cGVWaWRlbzsKKyAgICBjYW1faXNfdHlwZV90IG1Jc1R5cGVQcmV2aWV3OworCisgICAgYm9vbCBtX2Jac2xNb2RlOyAgICAgICAgICAgICAgICAvLyBpZiBaU0wgaXMgZW5hYmxlZAorICAgIGJvb2wgbV9iWnNsTW9kZV9uZXc7CisgICAgYm9vbCBtX2JGb3JjZVpzbE1vZGU7CisgICAgYm9vbCBtX2JSZWNvcmRpbmdIaW50OyAgICAgICAgICAvLyBsb2NhbCBjb3B5IG9mIHJlY29yZGluZyBoaW50CisgICAgYm9vbCBtX2JSZWNvcmRpbmdIaW50X25ldzsKKyAgICBib29sIG1fYkhpc3RvZ3JhbUVuYWJsZWQ7ICAgICAgIC8vIGlmIGhpc3RvZ3JhbSBpcyBlbmFibGVkCisgICAgYm9vbCBtX2JMb25nc2hvdEVuYWJsZWQ7ICAgICAgIC8vIGlmIGxvbmdzaG90IGlzIGVuYWJsZWQKKyAgICB1aW50MzJfdCBtX25GYWNlUHJvY01hc2s7ICAgICAgIC8vIGZhY2UgcHJvY2VzcyBtYXNrCisgICAgYm9vbCBtX2JGYWNlRGV0ZWN0aW9uT247ICAgICAgICAvLyAgaWYgZmFjZSBEZXRlY3Rpb24gdHVybmVkIG9uIGJ5IHVzZXIKKyAgICBib29sIG1fYkRlYnVnRnBzOyAgICAgICAgICAgICAgIC8vIGlmIEZQUyBuZWVkIHRvIGJlIGxvZ2dlZAorICAgIGNhbV9mb2N1c19tb2RlX3R5cGUgbUZvY3VzTW9kZTsKKyAgICBjYW1fZm9ybWF0X3QgbVByZXZpZXdGb3JtYXQ7CisgICAgY2FtX2Zvcm1hdF90IG1BcHBQcmV2aWV3Rm9ybWF0OworICAgIGludDMyX3QgbVBpY3R1cmVGb3JtYXQ7ICAgICAgICAgLy8gY291bGQgYmUgQ0FNRVJBX1BJQ1RVUkVfVFlQRV9KUEVHIG9yIGNhbV9mb3JtYXRfdAorICAgIGJvb2wgbV9iTmVlZFJlc3RhcnQ7ICAgICAgICAgICAgLy8gaWYgcHJldmlldyBuZWVkcyByZXN0YXJ0IGFmdGVyIHBhcmFtZXRlcnMgdXBkYXRlZAorICAgIGJvb2wgbV9iTm9EaXNwbGF5TW9kZTsKKyAgICBib29sIG1fYldOUk9uOworICAgIGJvb2wgbV9iVE5SUHJldmlld09uOworICAgIGJvb2wgbV9iVE5SVmlkZW9PbjsKKyAgICBib29sIG1fYlROUlNuYXBzaG90T247CisgICAgYm9vbCBtX2JJbml0ZWQ7CisgICAgaW50IG1fblJldHJvQnVyc3ROdW07CisgICAgaW50IG1fbkJ1cnN0TEVET25QZXJpb2Q7CisgICAgY2FtX2V4cF9icmFja2V0aW5nX3QgbV9BRUJyYWNrZXRpbmdDbGllbnQ7CisgICAgYm9vbCBtX2JVcGRhdGVFZmZlY3RzOyAgICAgICAgICAvLyBDYXVzZSByZWFwcGx5aW5nIG9mIGVmZmVjdHMKKyAgICBib29sIG1fYlNjZW5lVHJhbnNpdGlvbkF1dG87ICAgIC8vIEluZGljYXRlIHRoYXQgc2NlbmUgaGFzIGNoYW5nZWQgdG8gQXV0bworICAgIGJvb2wgbV9iUHJldmlld0ZsaXBDaGFuZ2VkOyAgICAgICAgLy8gaWYgZmxpcCBzZXR0aW5nIGZvciBwcmV2aWV3IGNoYW5nZWQKKyAgICBib29sIG1fYlZpZGVvRmxpcENoYW5nZWQ7ICAgICAgICAgIC8vIGlmIGZsaXAgc2V0dGluZyBmb3IgdmlkZW8gY2hhbmdlZAorICAgIGJvb2wgbV9iU25hcHNob3RGbGlwQ2hhbmdlZDsgICAgICAgLy8gaWYgZmxpcCBzZXR0aW5nIGZvciBzbmFwc2hvdCBjaGFuZ2VkCisgICAgYm9vbCBtX2JGaXhlZEZyYW1lUmF0ZVNldDsgICAgICAvLyBJbmRpY2F0ZXMgdGhhdCBhIGZpeGVkIGZyYW1lIHJhdGUgaXMgc2V0CisgICAgcWNhbWVyYV90aGVybWFsX21vZGUgbV9UaGVybWFsTW9kZTsgLy8gYWRqdXN0IGZwcyB2cyBhZGp1c3QgZnJhbWVza2lwCisgICAgY2FtX2RpbWVuc2lvbl90IG1fTGl2ZVNuYXBzaG90U2l6ZTsgLy8gbGl2ZSBzbmFwc2hvdCBzaXplCisgICAgY2FtX2RpbWVuc2lvbl90IG1fcmF3U2l6ZTsgLy8gUmF3IHNpemUKKyAgICBjYW1fZGltZW5zaW9uX3QgbV9tYXhQaWNTaXplOworICAgIGJvb2wgbV9iSERSRW5hYmxlZDsgICAgICAgICAgICAgLy8gaWYgSERSIGlzIGVuYWJsZWQKKyAgICBib29sIG1fYkxvY2FsSERSRW5hYmxlZDsgICAvLyBUaGlzIGZsYWcgdGVsbHMgd2hldGhlciBIRFIgZW5hYmxlZCBvciBub3QgcmVnYXJsZXNzIG9mIEFQUCBtb2RlCisgICAgYm9vbCBtX2JBVlRpbWVyRW5hYmxlZDsgICAgLy9pZiBBVlRpbWVyIGlzIGVuYWJsZWQKKyAgICBib29sIG1fYkRJU0VuYWJsZWQ7CisgICAgYm9vbCBtX2JPSVNFbmFibGVkOworICAgIGNhbV9zdGlsbF9tb3JlX3QgbV9zdGlsbG1vcmVfY29uZmlnOworICAgIGJvb2wgbV9iTWV0YVJhd0VuYWJsZWQ7CisKKyAgICB1aW50OF90IG1fTW9iaU1hc2s7CisgICAgUUNhbWVyYUFkanVzdEZQUyAqbV9BZGp1c3RGUFM7CisgICAgYm9vbCBtX2JIRFIxeEZyYW1lRW5hYmxlZDsgICAgICAgICAgLy8gaWYgZnJhbWUgd2l0aCBleHBvc3VyZSBjb21wZW5zYXRpb24gMCBkdXJpbmcgSERSIGlzIGVuYWJsZWQKKyAgICBib29sIG1fSERSU2NlbmVFbmFibGVkOyAvLyBBdXRvIEhEUiBpbmRpY2F0aW9uCisgICAgYm9vbCBtX2JIRFJUaHVtYm5haWxQcm9jZXNzTmVlZGVkOyAgICAgICAgLy8gaWYgdGh1bWJuYWlsIG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGZvciBIRFIKKyAgICBib29sIG1fYkhEUjF4RXh0cmFCdWZmZXJOZWVkZWQ7ICAgICAvLyBpZiBleHRyYSBmcmFtZSB3aXRoIGV4cG9zdXJlIGNvbXBlbnNhdGlvbiAwIGR1cmluZyBIRFIgaXMgbmVlZGVkCisgICAgYm9vbCBtX2JIRFJPdXRwdXRDcm9wRW5hYmxlZDsgICAgIC8vIGlmIEhEUiBvdXRwdXQgZnJhbWUgbmVlZCB0byBiZSBzY2FsZWQgdG8gdXNlciByZXNvbHV0aW9uCisgICAgRGVmYXVsdEtleWVkVmVjdG9yPFN0cmluZzgsU3RyaW5nOD4gbV90ZW1wTWFwOyAvLyBtYXAgZm9yIHRlbW9yb3JpbHkgc3RvcmUgcGFyYW1ldGVycyB0byBiZSBzZXQKKyAgICBjYW1fZnBzX3JhbmdlX3QgbV9kZWZhdWx0X2Zwc19yYW5nZTsKKyAgICBib29sIG1fYkFGQnJhY2tldGluZ09uOworICAgIGJvb2wgbV9iUmVGb2N1c09uOworICAgIGJvb2wgbV9iQ2hyb21hRmxhc2hPbjsKKyAgICBib29sIG1fYk9wdGlab29tT247CisgICAgYm9vbCBtX2JTY2VuZVNlbGVjdGlvbjsKKyAgICBNdXRleCBtX1NjZW5lU2VsZWN0TG9jazsKKyAgICBjYW1fc2NlbmVfbW9kZV90eXBlIG1fU2VsZWN0ZWRTY2VuZTsKKyAgICBib29sIG1fYlNlZU1vcmVPbjsKKyAgICBib29sIG1fYlN0aWxsTW9yZU9uOworICAgIGJvb2wgbV9iSGlnaFF1YWxpdHlOb2lzZVJlZHVjdGlvbk1vZGU7CisgICAgY2FtX2Zwc19yYW5nZV90IG1faGZyRnBzUmFuZ2U7CisgICAgYm9vbCBtX2JIZnJNb2RlOworICAgIGJvb2wgbV9iU2Vuc29ySERSRW5hYmxlZDsgICAgICAgICAgICAgLy8gaWYgSERSIGlzIGVuYWJsZWQKKyAgICBib29sIG1fYlJkaU1vZGU7ICAgICAgICAgICAgICAgIC8vIGlmIFJESSBtb2RlCisgICAgYm9vbCBtX2JTZWN1cmVNb2RlOworICAgIGJvb2wgbV9iQWVCcmFja2V0aW5nRW5hYmxlZDsKKyAgICBpbnQzMl90IG1GbGFzaFZhbHVlOworICAgIGludDMyX3QgbUZsYXNoRGFlbW9uVmFsdWU7CisgICAgaW50MzJfdCBtSGZyTW9kZTsKKyAgICBib29sIG1fYkhEUk1vZGVTZW5zb3I7CisgICAgYm9vbCBtT2ZmbGluZVJBVzsKKyAgICBib29sIG1fYlRydWVQb3J0cmFpdE9uOworICAgIGNhbV9mZWF0dXJlX21hc2tfdCBtX25NaW5SZXF1aXJlZFBwTWFzazsKKyAgICBjYW1fZmVhdHVyZV9tYXNrX3QgbVN0cmVhbVBwTWFza1tDQU1fU1RSRUFNX1RZUEVfTUFYXTsKKyAgICBpbnQzMl90IG1fblNoYXJwbmVzczsKKyAgICBpbnQ4X3QgbVRvdGFsUFBDb3VudDsKKyAgICBpbnQ4X3QgbUN1clBQQ291bnQ7CisgICAgaW50MzJfdCBtWm9vbUxldmVsOworICAgIGludDMyX3QgbVBhcm1ab29tTGV2ZWw7CisgICAgYm9vbCBtX2JJc0xvd01lbW9yeURldmljZTsKKyAgICBpbnQzMl90IG1DZHNfbW9kZTsKKyAgICBpbnQzMl90IG1QYXJtRWZmZWN0OworICAgIGNhbV9jYXB0dXJlX2ZyYW1lX2NvbmZpZ190IG1fY2FwdHVyZUZyYW1lQ29uZmlnOworICAgIGludDhfdCBtQnVmQmF0Y2hDbnQ7CisgICAgYm9vbCBtX2JFenR1bmVFbmFibGVkOworICAgIGJvb2wgbV9iRGNyZkVuYWJsZWQ7CisgICAgdWludDMyX3QgbVJvdGF0aW9uOworICAgIHVpbnQzMl90IG1KcGVnUm90YXRpb247CisgICAgaW50OF90IG1WaWRlb0JhdGNoU2l6ZTsKKyAgICBib29sIG1fTExDYXB0dXJlRW5hYmxlZDsKKyAgICBjYW1fbG93X2xpZ2h0X21vZGVfdCBtX0xvd0xpZ2h0TGV2ZWw7CisgICAgYm9vbCBtX2JMdG1Gb3JTZWVNb3JlRW5hYmxlZDsKKyAgICBpbnQ2NF90IG1fZXhwVGltZTsKKyAgICBib29sIG1fYk9FTUZlYXRFbmFibGVkOworICAgIGludDMyX3QgbV9pc29WYWx1ZTsKKyAgICBRQ2FtZXJhTWFudWFsQ2FwdHVyZU1vZGVzIG1fTWFudWFsQ2FwdHVyZU1vZGU7CisgICAgY2FtX2R5bl9pbWdfZGF0YV90IG1fRHluYW1pY0ltZ0RhdGE7CisgICAgaW50MzJfdCBtX2R1YWxMZWRDYWxpYnJhdGlvbjsKKyAgICAvLyBQYXJhbSB0byB0cmlnZ2VyIGluc3RhbnQgQUVDLgorICAgIGJvb2wgbV9iSW5zdGFudEFFQzsKKyAgICAvLyBQYXJhbSB0byB0cmlnZ2VyIGluc3RhbnQgY2FwdHVyZS4KKyAgICBib29sIG1fYkluc3RhbnRDYXB0dXJlOworICAgIC8vIE51bWJlciBvZiBmcmFtZXMsIGNhbWVyYSBpbnRlcmZhY2Ugd2lsbCB3YWl0IGZvciBnZXR0aW5nIHRoZSBpbnN0YW50IGNhcHR1cmUgZnJhbWUuCisgICAgdWludDhfdCBtQWVjRnJhbWVCb3VuZDsKKyAgICAvLyBOdW1iZXIgb2YgcHJldmlldyBmcmFtZXMsIHRoYXQgSEFMIHdpbGwgaG9sZCB3aXRob3V0IGRpc3BsYXlpbmcsIGZvciBpbnN0YW50IEFFQyBtb2RlLgorICAgIHVpbnQ4X3QgbUFlY1NraXBEaXNwbGF5RnJhbWVCb3VuZDsKKyAgICBib29sIG1fYlF1YWRyYUNmYTsKK307CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhUGFyYW1ldGVyc0ludGYuY3BwIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhUGFyYW1ldGVyc0ludGYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYjJjZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFQYXJhbWV0ZXJzSW50Zi5jcHAKQEAgLTAsMCArMSwxNDQ0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYVBhcmFtZXRlcnNJbnRmIgorCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIlFDYW1lcmFQYXJhbWV0ZXJzLmgiCisjaW5jbHVkZSAiUUNhbWVyYVBhcmFtZXRlcnNJbnRmLmgiCisjaW5jbHVkZSAiUUNhbWVyYVRyYWNlLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKK30KKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisjZGVmaW5lIENIRUNLX1BBUkFNX0lOVEYoaW1wbCkgTE9HX0FMV0FZU19GQVRBTF9JRigoKGltcGwpID09IE5VTEwpLCAiaW1wbCBpcyBOVUxMISIpCisKK1FDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6UUNhbWVyYVBhcmFtZXRlcnNJbnRmKCkgOgorICAgICAgICBtSW1wbChOVUxMKQoreworfQorCitRQ2FtZXJhUGFyYW1ldGVyc0ludGY6On5RQ2FtZXJhUGFyYW1ldGVyc0ludGYoKQoreworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgICAgICBpZiAobUltcGwpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtSW1wbDsKKyAgICAgICAgICAgIG1JbXBsID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6YWxsb2NhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtSW1wbCA9IG5ldyBRQ2FtZXJhUGFyYW1ldGVycygpOworICAgIGlmICghbUltcGwpIHsKKyAgICAgICAgTE9HRSgiT3V0IG9mIG1lbW9yeSIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUoKTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmluaXQoY2FtX2NhcGFiaWxpdHlfdCAqY2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfdnRibF90ICptbU9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYUFkanVzdEZQUyAqYWRqdXN0RlBTKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmluaXQoY2FwYWJpbGl0aWVzLCBtbU9wcywgYWRqdXN0RlBTKTsKK30KKwordm9pZCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmRlaW5pdCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIG1JbXBsLT5kZWluaXQoKTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OnVwZGF0ZVBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zLCBib29sICZuZWVkUmVzdGFydCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT51cGRhdGVQYXJhbWV0ZXJzKHBhcmFtcywgbmVlZFJlc3RhcnQpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Y29tbWl0UGFyYW1ldGVycygpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Y29tbWl0UGFyYW1ldGVycygpOworfQorCitjaGFyKiBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OlFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0UGFyYW1ldGVycygpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0UGFyYW1ldGVycygpOworfQorCit2b2lkIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0UHJldmlld0Zwc1JhbmdlKGludCAqbWluX2ZwcywgaW50ICptYXhfZnBzKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICBtSW1wbC0+Z2V0UHJldmlld0Zwc1JhbmdlKG1pbl9mcHMsIG1heF9mcHMpOworfQorCisjaWZkZWYgVEFSR0VUX1RTX01BS0VVUAorYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldFRzTWFrZXVwSW5mbyhpbnQgJndoaXRlTGV2ZWwsIGludCAmY2xlYW5MZXZlbCkgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRUc01ha2V1cEluZm8od2hpdGVMZXZlbCwgY2xlYW5MZXZlbCk7Cit9CisjZW5kaWYKKworaW50IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0UHJldmlld0hhbFBpeGVsRm9ybWF0KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRQcmV2aWV3SGFsUGl4ZWxGb3JtYXQoKTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldFN0cmVhbVJvdGF0aW9uKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9wcF9mZWF0dXJlX2NvbmZpZ190ICZmZWF0dXJlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3QgJmRpbSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRTdHJlYW1Sb3RhdGlvbihzdHJlYW1UeXBlLCBmZWF0dXJlQ29uZmlnLCBkaW0pOworCit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRTdHJlYW1TdWJGb3JtYXQoY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3N1Yl9mb3JtYXRfdHlwZV90ICZzdWJfZm9ybWF0KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldFN0cmVhbVN1YkZvcm1hdChzdHJlYW1UeXBlLCBzdWJfZm9ybWF0KTsKK30KKworCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0U3RyZWFtRm9ybWF0KGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9mb3JtYXRfdCAmZm9ybWF0KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldFN0cmVhbUZvcm1hdChzdHJlYW1UeXBlLCBmb3JtYXQpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0U3RyZWFtRGltZW5zaW9uKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCAmZGltKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldFN0cmVhbURpbWVuc2lvbihzdHJlYW1UeXBlLCBkaW0pOworfQorCit2b2lkIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0VGh1bWJuYWlsU2l6ZShpbnQgKndpZHRoLCBpbnQgKmhlaWdodCkgY29uc3QKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgbUltcGwtPmdldFRodW1ibmFpbFNpemUod2lkdGgsIGhlaWdodCk7Cit9CisKK3VpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRaU0xCdXJzdEludGVydmFsKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRaU0xCdXJzdEludGVydmFsKCk7Cit9CisKK3VpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRaU0xRdWV1ZURlcHRoKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRaU0xRdWV1ZURlcHRoKCk7Cit9CisKK3VpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRaU0xCYWNrTG9va0NvdW50KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRaU0xCYWNrTG9va0NvdW50KCk7Cit9CisKK3VpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRNYXhVbm1hdGNoZWRGcmFtZXNJblF1ZXVlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRNYXhVbm1hdGNoZWRGcmFtZXNJblF1ZXVlKCk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjppc1pTTE1vZGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzWlNMTW9kZSgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNSZGlNb2RlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc1JkaU1vZGUoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzU2VjdXJlTW9kZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNTZWN1cmVNb2RlKCk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjppc05vRGlzcGxheU1vZGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzTm9EaXNwbGF5TW9kZSgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNXTlJFbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc1dOUkVuYWJsZWQoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzVE5SU25hcHNob3RFbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc1ROUlNuYXBzaG90RW5hYmxlZCgpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0Q0RTTW9kZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0Q0RTTW9kZSgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNMVE1Gb3JTZWVNb3JlRW5hYmxlZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNMVE1Gb3JTZWVNb3JlRW5hYmxlZCgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNIZnJNb2RlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc0hmck1vZGUoKTsKK30KKwordm9pZCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldEhmckZwcyhjYW1fZnBzX3JhbmdlX3QgJnBGcHNSYW5nZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgbUltcGwtPmdldEhmckZwcyhwRnBzUmFuZ2UpOworfQorCit1aW50OF90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0TnVtT2ZTbmFwc2hvdHMoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldE51bU9mU25hcHNob3RzKCk7Cit9CisKK3VpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXROdW1PZlJldHJvU25hcHNob3RzKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXROdW1PZlJldHJvU25hcHNob3RzKCk7Cit9CisKK3VpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXROdW1PZkV4dHJhSERSSW5CdWZzSWZOZWVkZWQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldE51bU9mRXh0cmFIRFJJbkJ1ZnNJZk5lZWRlZCgpOworfQorCit1aW50OF90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0TnVtT2ZFeHRyYUhEUk91dEJ1ZnNJZk5lZWRlZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0TnVtT2ZFeHRyYUhEUk91dEJ1ZnNJZk5lZWRlZCgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0UmVjb3JkaW5nSGludFZhbHVlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRSZWNvcmRpbmdIaW50VmFsdWUoKTsKK30KKwordWludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRKcGVnUXVhbGl0eSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0SnBlZ1F1YWxpdHkoKTsKK30KKwordWludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRSb3RhdGlvbigpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0Um90YXRpb24oKTsKK30KKwordWludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXREZXZpY2VSb3RhdGlvbigpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0RGV2aWNlUm90YXRpb24oKTsKK30KKwordWludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRKcGVnRXhpZlJvdGF0aW9uKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRKcGVnRXhpZlJvdGF0aW9uKCk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjp1c2VKcGVnRXhpZlJvdGF0aW9uKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT51c2VKcGVnRXhpZlJvdGF0aW9uKCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRFZmZlY3RWYWx1ZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0RWZmZWN0VmFsdWUoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzSW5zdGFudEFFQ0VuYWJsZWQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzSW5zdGFudEFFQ0VuYWJsZWQoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzSW5zdGFudENhcHR1cmVFbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc0luc3RhbnRDYXB0dXJlRW5hYmxlZCgpOworfQorCit1aW50OF90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0QWVjRnJhbWVCb3VuZFZhbHVlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRBZWNGcmFtZUJvdW5kVmFsdWUoKTsKK30KKwordWludDhfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldEFlY1NraXBEaXNwbGF5RnJhbWVCb3VuZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0QWVjU2tpcERpc3BsYXlGcmFtZUJvdW5kKCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRFeGlmRGF0ZVRpbWUoCisgICAgICAgIFN0cmluZzggJmRhdGVUaW1lLCBTdHJpbmc4ICZzdWJzZWNUaW1lKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldEV4aWZEYXRlVGltZShkYXRlVGltZSwgc3Vic2VjVGltZSk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRFeGlmRm9jYWxMZW5ndGgocmF0X3QgKmZvY2FsTGVuZ3RoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldEV4aWZGb2NhbExlbmd0aChmb2NhbExlbmd0aCk7Cit9CisKK3VpbnQxNl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0RXhpZklzb1NwZWVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRFeGlmSXNvU3BlZWQoKTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldEV4aWZHcHNQcm9jZXNzaW5nTWV0aG9kKGNoYXIgKmdwc1Byb2Nlc3NpbmdNZXRob2QsIHVpbnQzMl90ICZjb3VudCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRFeGlmR3BzUHJvY2Vzc2luZ01ldGhvZChncHNQcm9jZXNzaW5nTWV0aG9kLCBjb3VudCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRFeGlmTGF0aXR1ZGUocmF0X3QgKmxhdGl0dWRlLCBjaGFyICpsYXRSZWYpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0RXhpZkxhdGl0dWRlKGxhdGl0dWRlLCBsYXRSZWYpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0RXhpZkxvbmdpdHVkZShyYXRfdCAqbG9uZ2l0dWRlLCBjaGFyICpsb25SZWYpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0RXhpZkxvbmdpdHVkZShsb25naXR1ZGUsIGxvblJlZik7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRFeGlmQWx0aXR1ZGUocmF0X3QgKmFsdGl0dWRlLCBjaGFyICphbHRSZWYpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0RXhpZkFsdGl0dWRlKGFsdGl0dWRlLCBhbHRSZWYpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0RXhpZkdwc0RhdGVUaW1lU3RhbXAoY2hhciAqZ3BzRGF0ZVN0YW1wLCB1aW50MzJfdCBidWZMZW4sIHJhdF90ICpncHNUaW1lU3RhbXApCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0RXhpZkdwc0RhdGVUaW1lU3RhbXAoZ3BzRGF0ZVN0YW1wLCBidWZMZW4sIGdwc1RpbWVTdGFtcCk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjppc1ZpZGVvQnVmZmVyc0NhY2hlZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNWaWRlb0J1ZmZlcnNDYWNoZWQoKTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OnVwZGF0ZUZvY3VzRGlzdGFuY2VzKGNhbV9mb2N1c19kaXN0YW5jZXNfaW5mb190ICpmb2N1c0Rpc3RhbmNlcykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT51cGRhdGVGb2N1c0Rpc3RhbmNlcyhmb2N1c0Rpc3RhbmNlcyk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjppc0FFQnJhY2tldEVuYWJsZWQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzQUVCcmFja2V0RW5hYmxlZCgpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0QUVCcmFja2V0aW5nKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5zZXRBRUJyYWNrZXRpbmcoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzRnBzRGVidWdFbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc0Zwc0RlYnVnRW5hYmxlZCgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNIaXN0b2dyYW1FbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc0hpc3RvZ3JhbUVuYWJsZWQoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzU2NlbmVTZWxlY3Rpb25FbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc1NjZW5lU2VsZWN0aW9uRW5hYmxlZCgpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0U2VsZWN0ZWRTY2VuZShjYW1fc2NlbmVfbW9kZV90eXBlIHNjZW5lKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPnNldFNlbGVjdGVkU2NlbmUoc2NlbmUpOworfQorCitjYW1fc2NlbmVfbW9kZV90eXBlIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0U2VsZWN0ZWRTY2VuZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0U2VsZWN0ZWRTY2VuZSgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNGYWNlRGV0ZWN0aW9uRW5hYmxlZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNGYWNlRGV0ZWN0aW9uRW5hYmxlZCgpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0RmFjZURldGVjdGlvbk9wdGlvbihib29sIGVuYWJsZWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+c2V0RmFjZURldGVjdGlvbk9wdGlvbihlbmFibGVkKTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OnNldEhpc3RvZ3JhbShib29sIGVuYWJsZWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+c2V0SGlzdG9ncmFtKGVuYWJsZWQpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0RmFjZURldGVjdGlvbihib29sIGVuYWJsZWQsIGJvb2wgaW5pdENvbW1pdCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5zZXRGYWNlRGV0ZWN0aW9uKGVuYWJsZWQsIGluaXRDb21taXQpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0RnJhbWVTa2lwKGVudW0gbXNtX3ZmZV9mcmFtZV9za2lwX3BhdHRlcm4gcGF0dGVybikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5zZXRGcmFtZVNraXAocGF0dGVybik7Cit9CisKK3FjYW1lcmFfdGhlcm1hbF9tb2RlIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0VGhlcm1hbE1vZGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldFRoZXJtYWxNb2RlKCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjp1cGRhdGVSZWNvcmRpbmdIaW50VmFsdWUoaW50MzJfdCB2YWx1ZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT51cGRhdGVSZWNvcmRpbmdIaW50VmFsdWUodmFsdWUpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0SERSQUVCcmFja2V0KGNhbV9leHBfYnJhY2tldGluZ190IGhkckJyYWNrZXQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+c2V0SERSQUVCcmFja2V0KGhkckJyYWNrZXQpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNIRFJFbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc0hEUkVuYWJsZWQoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzQXV0b0hEUkVuYWJsZWQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzQXV0b0hEUkVuYWJsZWQoKTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OnN0b3BBRUJyYWNrZXQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPnN0b3BBRUJyYWNrZXQoKTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OnVwZGF0ZVJBVyhjYW1fZGltZW5zaW9uX3QgbWF4X2RpbSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT51cGRhdGVSQVcobWF4X2RpbSk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjppc0RJU0VuYWJsZWQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzRElTRW5hYmxlZCgpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0SVNUeXBlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5zZXRJU1R5cGUoKTsKK30KKworCitjYW1faXNfdHlwZV90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0VmlkZW9JU1R5cGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldFZpZGVvSVNUeXBlKCk7Cit9CisKK2NhbV9pc190eXBlX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRQcmV2aWV3SVNUeXBlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRQcmV2aWV3SVNUeXBlKCk7Cit9CisKK3VpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRNb2JpY2F0TWFzaygpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0TW9iaWNhdE1hc2soKTsKK30KKworY2FtX2ZvY3VzX21vZGVfdHlwZSBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldEZvY3VzTW9kZSgpIGNvbnN0Cit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0Rm9jdXNNb2RlKCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpzZXROdW1PZlNuYXBzaG90KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5zZXROdW1PZlNuYXBzaG90KCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjphZGp1c3RQcmV2aWV3RnBzUmFuZ2UoY2FtX2Zwc19yYW5nZV90ICpmcHNSYW5nZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5hZGp1c3RQcmV2aWV3RnBzUmFuZ2UoZnBzUmFuZ2UpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNKcGVnUGljdHVyZUZvcm1hdCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNKcGVnUGljdHVyZUZvcm1hdCgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNOVjE2UGljdHVyZUZvcm1hdCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNOVjE2UGljdHVyZUZvcm1hdCgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNOVjIxUGljdHVyZUZvcm1hdCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNOVjIxUGljdHVyZUZvcm1hdCgpOworfQorCitjYW1fZGVub2lzZV9wcm9jZXNzX3R5cGVfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldERlbm9pc2VQcm9jZXNzUGxhdGUoCisgICAgICAgIGNhbV9pbnRmX3Bhcm1fdHlwZV90IHR5cGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0RGVub2lzZVByb2Nlc3NQbGF0ZSh0eXBlKTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldE1heFBpY1NpemUoY2FtX2RpbWVuc2lvbl90ICZkaW0pCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0TWF4UGljU2l6ZShkaW0pOworfQorCitpbnQgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRGbGlwTW9kZShjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldEZsaXBNb2RlKHN0cmVhbVR5cGUpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNTbmFwc2hvdEZETmVlZGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc1NuYXBzaG90RkROZWVkZWQoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzSERSMXhGcmFtZUVuYWJsZWQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzSERSMXhGcmFtZUVuYWJsZWQoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzWVVWRnJhbWVJbmZvTmVlZGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc1lVVkZyYW1lSW5mb05lZWRlZCgpOworfQorCitjb25zdCBjaGFyKiBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldEZyYW1lRm10U3RyaW5nKGNhbV9mb3JtYXRfdCBmbXQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0RnJhbWVGbXRTdHJpbmcoZm10KTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzSERSMXhFeHRyYUJ1ZmZlck5lZWRlZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNIRFIxeEV4dHJhQnVmZmVyTmVlZGVkKCk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjppc0hEUk91dHB1dENyb3BFbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc0hEUk91dHB1dENyb3BFbmFibGVkKCk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjppc1ByZXZpZXdGbGlwQ2hhbmdlZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNQcmV2aWV3RmxpcENoYW5nZWQoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzVmlkZW9GbGlwQ2hhbmdlZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNWaWRlb0ZsaXBDaGFuZ2VkKCk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjppc1NuYXBzaG90RmxpcENoYW5nZWQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzU25hcHNob3RGbGlwQ2hhbmdlZCgpOworfQorCit2b2lkIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0SERSU2NlbmVFbmFibGUoYm9vbCBiZmxhZykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgbUltcGwtPnNldEhEUlNjZW5lRW5hYmxlKGJmbGFnKTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OnVwZGF0ZUFXQlBhcmFtcyhjYW1fYXdiX3BhcmFtc190ICZhd2JfcGFyYW1zKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPnVwZGF0ZUFXQlBhcmFtcyhhd2JfcGFyYW1zKTsKK30KKworY29uc3QgY2hhciAqIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0QVNEU3RhdGVTdHJpbmcoY2FtX2F1dG9fc2NlbmVfdCBzY2VuZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRBU0RTdGF0ZVN0cmluZyhzY2VuZSk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjppc0hEUlRodW1ibmFpbFByb2Nlc3NOZWVkZWQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzSERSVGh1bWJuYWlsUHJvY2Vzc05lZWRlZCgpOworfQorCit2b2lkIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0TWluUHBNYXNrKGNhbV9mZWF0dXJlX21hc2tfdCBtaW5fcHBfbWFzaykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgbUltcGwtPnNldE1pblBwTWFzayhtaW5fcHBfbWFzayk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpzZXRTdHJlYW1Db25maWd1cmUoYm9vbCBpc0NhcHR1cmUsCisgICAgICAgIGJvb2wgcHJldmlld0FzUG9zdHZpZXcsIGJvb2wgcmVzZXRDb25maWcpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+c2V0U3RyZWFtQ29uZmlndXJlKGlzQ2FwdHVyZSwKKyAgICAgICAgICAgIHByZXZpZXdBc1Bvc3R2aWV3LCByZXNldENvbmZpZyk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjphZGRPbmxpbmVSb3RhdGlvbih1aW50MzJfdCByb3RhdGlvbiwKKyAgICAgICAgdWludDMyX3Qgc3RyZWFtSWQsIGludDMyX3QgZGV2aWNlX3JvdGF0aW9uKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmFkZE9ubGluZVJvdGF0aW9uKHJvdGF0aW9uLCBzdHJlYW1JZCwgZGV2aWNlX3JvdGF0aW9uKTsKK30KKwordWludDhfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldE51bU9mRXh0cmFCdWZmZXJzRm9ySW1hZ2VQcm9jKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXROdW1PZkV4dHJhQnVmZmVyc0ZvckltYWdlUHJvYygpOworfQorCit1aW50OF90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JWaWRlbygpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JWaWRlbygpOworfQorCit1aW50OF90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0TnVtT2ZFeHRyYUJ1ZmZlcnNGb3JQcmV2aWV3KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXROdW1PZkV4dHJhQnVmZmVyc0ZvclByZXZpZXcoKTsKK30KKwordWludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRFeGlmQnVmSW5kZXgodWludDMyX3QgY2FwdHVyZUluZGV4KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldEV4aWZCdWZJbmRleChjYXB0dXJlSW5kZXgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6bmVlZFRodW1ibmFpbFJlcHJvY2VzcyhjYW1fZmVhdHVyZV9tYXNrX3QgKnBGZWF0dXJlTWFzaykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5uZWVkVGh1bWJuYWlsUmVwcm9jZXNzKHBGZWF0dXJlTWFzayk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjppc1ViaUZvY3VzRW5hYmxlZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNVYmlGb2N1c0VuYWJsZWQoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzQ2hyb21hRmxhc2hFbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc0Nocm9tYUZsYXNoRW5hYmxlZCgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNIaWdoUXVhbGl0eU5vaXNlUmVkdWN0aW9uTW9kZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNIaWdoUXVhbGl0eU5vaXNlUmVkdWN0aW9uTW9kZSgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNUcnVlUG9ydHJhaXRFbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc1RydWVQb3J0cmFpdEVuYWJsZWQoKTsKK30KKworc2l6ZV90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0VFBNYXhNZXRhU2l6ZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0VFBNYXhNZXRhU2l6ZSgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNTZWVNb3JlRW5hYmxlZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNTZWVNb3JlRW5hYmxlZCgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNTdGlsbE1vcmVFbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc1N0aWxsTW9yZUVuYWJsZWQoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzT3B0aVpvb21FbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc09wdGlab29tRW5hYmxlZCgpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Y29tbWl0QUZCcmFja2V0KGNhbV9hZl9icmFja2V0aW5nX3QgYWZCcmFja2V0KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmNvbW1pdEFGQnJhY2tldChhZkJyYWNrZXQpOworfQorCisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpzZXQzQUxvY2soYm9vbCBsb2NrM0EpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+c2V0M0FMb2NrKGxvY2szQSk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpzZXRBbmRDb21taXRab29tKGludCB6b29tX2xldmVsKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPnNldEFuZENvbW1pdFpvb20oem9vbV9sZXZlbCk7Cit9Cit1aW50OF90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0QnVyc3RDb3VudEZvckFkdmFuY2VkQ2FwdHVyZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0QnVyc3RDb3VudEZvckFkdmFuY2VkQ2FwdHVyZSgpOworfQordWludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXROdW1iZXJJbkJ1ZnNGb3JTaW5nbGVTaG90KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXROdW1iZXJJbkJ1ZnNGb3JTaW5nbGVTaG90KCk7Cit9Cit1aW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldE51bWJlck91dEJ1ZnNGb3JTaW5nbGVTaG90KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXROdW1iZXJPdXRCdWZzRm9yU2luZ2xlU2hvdCgpOworfQoraW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OnNldExvbmdzaG90RW5hYmxlKGJvb2wgZW5hYmxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPnNldExvbmdzaG90RW5hYmxlKGVuYWJsZSk7Cit9CitTdHJpbmc4IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6ZHVtcCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+ZHVtcCgpOworfQorYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzVWJpUmVmb2N1cygpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNVYmlSZWZvY3VzKCk7Cit9Cit1aW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldFJlZm9jdXNNYXhNZXRhU2l6ZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0UmVmb2N1c01heE1ldGFTaXplKCk7Cit9Cit1aW50OF90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0UmVmb2N1c091dHB1dENvdW50KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRSZWZvY3VzT3V0cHV0Q291bnQoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdlbmVyYXRlVGh1bWJGcm9tTWFpbigpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2VuZXJhdGVUaHVtYkZyb21NYWluKCk7Cit9CisKK3ZvaWQgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjp1cGRhdGVDdXJyZW50Rm9jdXNQb3NpdGlvbihjYW1fZm9jdXNfcG9zX2luZm9fdCAmY3VyX3Bvc19pbmZvKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICBtSW1wbC0+dXBkYXRlQ3VycmVudEZvY3VzUG9zaXRpb24oY3VyX3Bvc19pbmZvKTsKK30KKwordm9pZCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OnVwZGF0ZUFFSW5mbyhjYW1fM2FfcGFyYW1zX3QgJmFlX3BhcmFtcykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgbUltcGwtPnVwZGF0ZUFFSW5mbyhhZV9wYXJhbXMpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNBZHZDYW1GZWF0dXJlc0VuYWJsZWQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzQWR2Q2FtRmVhdHVyZXNFbmFibGVkKCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpzZXRBZWNMb2NrKGNvbnN0IGNoYXIgKmFlY1N0cikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5zZXRBZWNMb2NrKGFlY1N0cik7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjp1cGRhdGVEZWJ1Z0xldmVsKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT51cGRhdGVEZWJ1Z0xldmVsKCk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjppczRrMmtWaWRlb1Jlc29sdXRpb24oKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzNGsya1ZpZGVvUmVzb2x1dGlvbigpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNVQldDRW5hYmxlZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNVQldDRW5hYmxlZCgpOworfQoraW50IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0QnJpZ2h0bmVzcygpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0QnJpZ2h0bmVzcygpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6dXBkYXRlT2lzVmFsdWUoYm9vbCBvaXNWYWx1ZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT51cGRhdGVPaXNWYWx1ZShvaXNWYWx1ZSk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpzZXRJbnRFdmVudChjYW1faW50X2V2dF9wYXJhbXNfdCBwYXJhbXMpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+c2V0SW50RXZlbnQocGFyYW1zKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldG9mZmxpbmVSQVcoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldG9mZmxpbmVSQVcoKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldFF1YWRyYUNmYSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0UXVhZHJhQ2ZhKCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjp1cGRhdGVQcEZlYXR1cmVNYXNrKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPnVwZGF0ZVBwRmVhdHVyZU1hc2soc3RyZWFtX3R5cGUpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0U3RyZWFtUHBNYXNrKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlLAorICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgJnBwX21hc2spCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0U3RyZWFtUHBNYXNrKHN0cmVhbV90eXBlLCBwcF9tYXNrKTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldFNoYXJwbmVzcygpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0U2hhcnBuZXNzKCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRFZmZlY3QoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldEVmZmVjdCgpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6dXBkYXRlRmxhc2hNb2RlKGNhbV9mbGFzaF9tb2RlX3QgZmxhc2hfbW9kZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT51cGRhdGVGbGFzaE1vZGUoZmxhc2hfbW9kZSk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpjb25maWd1cmVBRUJyYWNrZXRpbmcoY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QgJmZyYW1lX2NvbmZpZykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5jb25maWd1cmVBRUJyYWNrZXRpbmcoZnJhbWVfY29uZmlnKTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmNvbmZpZ3VyZUhEUkJyYWNrZXRpbmcoY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QgJmZyYW1lX2NvbmZpZykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5jb25maWd1cmVIRFJCcmFja2V0aW5nKGZyYW1lX2NvbmZpZyk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpjb25maWdGcmFtZUNhcHR1cmUoYm9vbCBjb21taXRTZXR0aW5ncykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5jb25maWdGcmFtZUNhcHR1cmUoY29tbWl0U2V0dGluZ3MpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6cmVzZXRGcmFtZUNhcHR1cmUoYm9vbCBjb21taXRTZXR0aW5ncywgYm9vbCBsb3dMaWdodEVuYWJsZWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+cmVzZXRGcmFtZUNhcHR1cmUoY29tbWl0U2V0dGluZ3MsbG93TGlnaHRFbmFibGVkKTsKK30KKworY2FtX3N0aWxsX21vcmVfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldFN0aWxsTW9yZVNldHRpbmdzKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRTdGlsbE1vcmVTZXR0aW5ncygpOworfQorCit2b2lkIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0U3RpbGxNb3JlU2V0dGluZ3MoY2FtX3N0aWxsX21vcmVfdCBzdGlsbG1vcmVfY29uZmlnKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICBtSW1wbC0+c2V0U3RpbGxNb3JlU2V0dGluZ3Moc3RpbGxtb3JlX2NvbmZpZyk7Cit9CisKK2NhbV9zdGlsbF9tb3JlX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRTdGlsbE1vcmVDYXBhYmlsaXR5KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRTdGlsbE1vcmVDYXBhYmlsaXR5KCk7Cit9CisKK2NhbV9keW5faW1nX2RhdGFfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldER5bmFtaWNJbWdEYXRhKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXREeW5hbWljSW1nRGF0YSgpOworfQorCit2b2lkIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0RHluYW1pY0ltZ0RhdGEoY2FtX2R5bl9pbWdfZGF0YV90IGQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIG1JbXBsLT5zZXREeW5hbWljSW1nRGF0YShkKTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldFBhcm1ab29tTGV2ZWwoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldFBhcm1ab29tTGV2ZWwoKTsKK30KKworCitpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRSZXByb2NDb3VudCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0UmVwcm9jQ291bnQoKTsKK30KKworCitpbnQ4X3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRDdXJQUENvdW50KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRDdXJQUENvdW50KCk7Cit9CisKKwordm9pZCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OnNldFJlcHJvY0NvdW50KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgbUltcGwtPnNldFJlcHJvY0NvdW50KCk7Cit9CisKKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzUG9zdFByb2NTY2FsaW5nKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc1Bvc3RQcm9jU2NhbGluZygpOworfQorCisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjppc0xMTm9pc2VFbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc0xMTm9pc2VFbmFibGVkKCk7Cit9CisKKwordm9pZCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OnNldEN1clBQQ291bnQoaW50OF90IGNvdW50KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICBtSW1wbC0+c2V0Q3VyUFBDb3VudChjb3VudCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpzZXRRdWFkcmFDZmFNb2RlKHVpbnQzMl90IHZhbHVlLCBib29sIGluaXRDb21taXQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+c2V0UXVhZHJhQ2ZhTW9kZSh2YWx1ZSwgaW5pdENvbW1pdCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpzZXRUb25lTWFwTW9kZSh1aW50MzJfdCB2YWx1ZSwgYm9vbCBpbml0Q29tbWl0KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPnNldFRvbmVNYXBNb2RlKHZhbHVlLCBpbml0Q29tbWl0KTsKK30KKwordm9pZCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OnNldFRpbnRsZXNzKGJvb2wgZW5hYmxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICBtSW1wbC0+c2V0VGludGxlc3MoZW5hYmxlKTsKK30KKwordWludDhfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldExvbmdzaG90U3RhZ2VzKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRMb25nc2hvdFN0YWdlcygpOworfQorCitpbnQ4X3QgIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0QnVmQmF0Y2hDb3VudCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0QnVmQmF0Y2hDb3VudCgpOworfQorCitpbnQ4X3QgIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0VmlkZW9CYXRjaFNpemUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldFZpZGVvQmF0Y2hTaXplKCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpzZXRNYW51YWxDYXB0dXJlTW9kZSgKKyAgICAgICAgUUNhbWVyYU1hbnVhbENhcHR1cmVNb2RlcyB2YWx1ZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5zZXRNYW51YWxDYXB0dXJlTW9kZSh2YWx1ZSk7Cit9CisKK1FDYW1lcmFNYW51YWxDYXB0dXJlTW9kZXMgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRNYW51YWxDYXB0dXJlTW9kZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0TWFudWFsQ2FwdHVyZU1vZGUoKTsKK30KKworaW50NjRfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldEV4cG9zdXJlVGltZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0RXhwb3N1cmVUaW1lKCk7Cit9CisKK2NhbV9jYXB0dXJlX2ZyYW1lX2NvbmZpZ190IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0Q2FwdHVyZUZyYW1lQ29uZmlnKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRDYXB0dXJlRnJhbWVDb25maWcoKTsKK30KKwordm9pZCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OnNldEpwZWdSb3RhdGlvbihpbnQgcm90YXRpb24pCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIG1JbXBsLT5zZXRKcGVnUm90YXRpb24ocm90YXRpb24pOworfQorCit1aW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldEpwZWdSb3RhdGlvbigpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0SnBlZ1JvdGF0aW9uKCk7Cit9CisKK3ZvaWQgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpzZXRMb3dMaWdodExldmVsKGNhbV9sb3dfbGlnaHRfbW9kZV90IHZhbHVlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICBtSW1wbC0+c2V0TG93TGlnaHRMZXZlbCh2YWx1ZSk7Cit9CisKK2NhbV9sb3dfbGlnaHRfbW9kZV90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0TG93TGlnaHRMZXZlbCgpCit7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRMb3dMaWdodExldmVsKCk7Cit9CisKK2Jvb2wgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRMb3dMaWdodENhcHR1cmUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldExvd0xpZ2h0Q2FwdHVyZSgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0RGNyZigpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0RGNyZigpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0UmVsYXRlZENhbVN5bmNJbmZvKAorCWNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QqIGluZm8pCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+c2V0UmVsYXRlZENhbVN5bmNJbmZvKGluZm8pOworfQorCitjb25zdCBjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KgorCVFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0UmVsYXRlZENhbVN5bmNJbmZvKHZvaWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0UmVsYXRlZENhbVN5bmNJbmZvKCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpzZXRGcmFtZVN5bmNFbmFibGVkKAorCWJvb2wgZW5hYmxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPnNldEZyYW1lU3luY0VuYWJsZWQoZW5hYmxlKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzRnJhbWVTeW5jRW5hYmxlZCh2b2lkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzRnJhbWVTeW5jRW5hYmxlZCgpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6Z2V0UmVsYXRlZENhbUNhbGlicmF0aW9uKAorCWNhbV9yZWxhdGVkX3N5c3RlbV9jYWxpYnJhdGlvbl9kYXRhX3QqIGNhbGliKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmdldFJlbGF0ZWRDYW1DYWxpYnJhdGlvbihjYWxpYik7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpidW5kbGVSZWxhdGVkQ2FtZXJhcyhib29sIHN5bmMsIHVpbnQzMl90IHNlc3Npb25pZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5idW5kbGVSZWxhdGVkQ2FtZXJhcyhzeW5jLCBzZXNzaW9uaWQpOworfQorCit1aW50OF90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6ZmRNb2RlSW5WaWRlbygpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+ZmRNb2RlSW5WaWRlbygpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNPRU1GZWF0RW5hYmxlZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+aXNPRU1GZWF0RW5hYmxlZCgpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0WnNsTW9kZShib29sIHZhbHVlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPnNldFpzbE1vZGUodmFsdWUpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6dXBkYXRlWlNMTW9kZVZhbHVlKGJvb2wgdmFsdWUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+dXBkYXRlWlNMTW9kZVZhbHVlKHZhbHVlKTsKK30KKworYm9vbCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmlzUmVwcm9jU2NhbGVFbmFibGVkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5pc1JlcHJvY1NjYWxlRW5hYmxlZCgpOworfQorCitib29sIFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6aXNVbmRlclJlcHJvY1NjYWxpbmcoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPmlzVW5kZXJSZXByb2NTY2FsaW5nKCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYVBhcmFtZXRlcnNJbnRmOjpnZXRQaWNTaXplRnJvbUFQSyhpbnQgJndpZHRoLCBpbnQgJmhlaWdodCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRQaWNTaXplRnJvbUFQSyh3aWR0aCwgaGVpZ2h0KTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmNoZWNrRmVhdHVyZUNvbmN1cnJlbmN5KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQ0hFQ0tfUEFSQU1fSU5URihtSW1wbCk7CisgICAgcmV0dXJuIG1JbXBsLT5jaGVja0ZlYXR1cmVDb25jdXJyZW5jeSgpOworfQorCitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6c2V0SW5zdGFudEFFQyh1aW50OF90IGVuYWJsZSwgYm9vbCBpbml0Q29tbWl0KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBDSEVDS19QQVJBTV9JTlRGKG1JbXBsKTsKKyAgICByZXR1cm4gbUltcGwtPnNldEluc3RhbnRBRUMoZW5hYmxlLCBpbml0Q29tbWl0KTsKK30KKworaW50MzJfdCBRQ2FtZXJhUGFyYW1ldGVyc0ludGY6OmdldEFuYWx5c2lzSW5mbygKKyAgICAgICAgYm9vbCBmZFZpZGVvRW5hYmxlZCwKKyAgICAgICAgYm9vbCBoYWwzLAorICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgZmVhdHVyZU1hc2ssCisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3QgKnBBbmFseXNpc0luZm8pCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+Z2V0QW5hbHlzaXNJbmZvKGZkVmlkZW9FbmFibGVkLCBoYWwzLCBmZWF0dXJlTWFzaywgcEFuYWx5c2lzSW5mbyk7Cit9CitpbnQzMl90IFFDYW1lcmFQYXJhbWV0ZXJzSW50Zjo6dXBkYXRlRHRWYyhpbnQzMl90ICpkdCwgaW50MzJfdCAqdmMpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIENIRUNLX1BBUkFNX0lOVEYobUltcGwpOworICAgIHJldHVybiBtSW1wbC0+dXBkYXRlRHRWYyhkdCwgdmMpOworfQorCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhUGFyYW1ldGVyc0ludGYuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBhcmFtZXRlcnNJbnRmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1NzZlMwotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBhcmFtZXRlcnNJbnRmLmgKQEAgLTAsMCArMSwzMTggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1FDQU1FUkFfUEFSQU1FVEVSU19JTlRGX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9RQ0FNRVJBX1BBUkFNRVRFUlNfSU5URl9ICisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlICJjYW1faW50Zi5oIgorI2luY2x1ZGUgImNhbV90eXBlcy5oIgorI2luY2x1ZGUgIlFDYW1lcmFUaGVybWFsQWRhcHRlci5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlIDxtbV9jYW1lcmFfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bW1fanBlZ19pbnRlcmZhY2UuaD4KK30KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKwordHlwZWRlZiBjYW1fbWFudWFsX2NhcHR1cmVfdHlwZSBRQ2FtZXJhTWFudWFsQ2FwdHVyZU1vZGVzOworCitjbGFzcyBRQ2FtZXJhQWRqdXN0RlBTCit7CitwdWJsaWM6CisgICAgdmlydHVhbCBpbnQgcmVjYWxjRlBTUmFuZ2UoaW50ICZtaW5GUFMsIGludCAmbWF4RlBTLAorICAgICAgICAgICAgY29uc3QgZmxvYXQgJm1pblZpZGVvRlBTLCBjb25zdCBmbG9hdCAmbWF4VmlkZW9GUHMsCisgICAgICAgICAgICBjYW1fZnBzX3JhbmdlX3QgJmFkanVzdGVkUmFuZ2UpID0gMDsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhQWRqdXN0RlBTKCkge30KK307CisKK2NsYXNzIFFDYW1lcmFQYXJhbWV0ZXJzOworCitjbGFzcyBRQ2FtZXJhUGFyYW1ldGVyc0ludGYKK3sKK3B1YmxpYzoKKworICAgIC8vIG1lbWJlciB2YXJpYWJsZXMKKyAgICBRQ2FtZXJhUGFyYW1ldGVyc0ludGYoKTsKKyAgICB+UUNhbWVyYVBhcmFtZXRlcnNJbnRmKCk7CisKKyAgICBpbnQzMl90IGFsbG9jYXRlKCk7CisgICAgaW50MzJfdCBpbml0KGNhbV9jYXBhYmlsaXR5X3QgKmNhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3Z0YmxfdCAqbW1PcHMsCisgICAgICAgICAgICAgICAgIFFDYW1lcmFBZGp1c3RGUFMgKmFkanVzdEZQUyk7CisKKyAgICB2b2lkIGRlaW5pdCgpOworICAgIGludDMyX3QgdXBkYXRlUGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMsIGJvb2wgJm5lZWRSZXN0YXJ0KTsKKyAgICBpbnQzMl90IGNvbW1pdFBhcmFtZXRlcnMoKTsKKworICAgIGNoYXIqIGdldFBhcmFtZXRlcnMoKTsKKyAgICB2b2lkIGdldFByZXZpZXdGcHNSYW5nZShpbnQgKm1pbl9mcHMsIGludCAqbWF4X2ZwcykgY29uc3Q7CisjaWZkZWYgVEFSR0VUX1RTX01BS0VVUAorICAgIGJvb2wgZ2V0VHNNYWtldXBJbmZvKGludCAmd2hpdGVMZXZlbCwgaW50ICZjbGVhbkxldmVsKSBjb25zdDsKKyNlbmRpZgorCisgICAgaW50IGdldFByZXZpZXdIYWxQaXhlbEZvcm1hdCgpOworICAgIGludDMyX3QgZ2V0U3RyZWFtUm90YXRpb24oY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgIGNhbV9wcF9mZWF0dXJlX2NvbmZpZ190ICZmZWF0dXJlQ29uZmlnLAorICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90ICZkaW0pOworICAgIGludDMyX3QgZ2V0U3RyZWFtRm9ybWF0KGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICBjYW1fZm9ybWF0X3QgJmZvcm1hdCk7CisKKyAgICBpbnQzMl90IGdldFN0cmVhbVN1YkZvcm1hdCgKKyAgICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGNhbV9zdWJfZm9ybWF0X3R5cGVfdCAmc3ViX2Zvcm1hdCk7CisKKworICAgIGludDMyX3QgZ2V0U3RyZWFtRGltZW5zaW9uKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3QgJmRpbSk7CisKKyAgICB2b2lkIGdldFRodW1ibmFpbFNpemUoaW50ICp3aWR0aCwgaW50ICpoZWlnaHQpIGNvbnN0OworICAgIHVpbnQ4X3QgZ2V0WlNMQnVyc3RJbnRlcnZhbCgpOworICAgIHVpbnQ4X3QgZ2V0WlNMUXVldWVEZXB0aCgpOworICAgIHVpbnQ4X3QgZ2V0WlNMQmFja0xvb2tDb3VudCgpOworICAgIHVpbnQ4X3QgZ2V0TWF4VW5tYXRjaGVkRnJhbWVzSW5RdWV1ZSgpOworICAgIGJvb2wgaXNaU0xNb2RlKCk7CisgICAgYm9vbCBpc1JkaU1vZGUoKTsKKyAgICBib29sIGlzU2VjdXJlTW9kZSgpOworICAgIGJvb2wgaXNOb0Rpc3BsYXlNb2RlKCk7CisgICAgYm9vbCBpc1dOUkVuYWJsZWQoKTsKKyAgICBib29sIGlzVE5SU25hcHNob3RFbmFibGVkKCk7CisgICAgaW50MzJfdCBnZXRDRFNNb2RlKCk7CisgICAgYm9vbCBpc0xUTUZvclNlZU1vcmVFbmFibGVkKCk7CisgICAgYm9vbCBpc0hmck1vZGUoKTsKKyAgICB2b2lkIGdldEhmckZwcyhjYW1fZnBzX3JhbmdlX3QgJnBGcHNSYW5nZSk7CisgICAgdWludDhfdCBnZXROdW1PZlNuYXBzaG90cygpOworICAgIHVpbnQ4X3QgZ2V0TnVtT2ZSZXRyb1NuYXBzaG90cygpOworICAgIHVpbnQ4X3QgZ2V0TnVtT2ZFeHRyYUhEUkluQnVmc0lmTmVlZGVkKCk7CisgICAgdWludDhfdCBnZXROdW1PZkV4dHJhSERST3V0QnVmc0lmTmVlZGVkKCk7CisKKyAgICBib29sIGdldFJlY29yZGluZ0hpbnRWYWx1ZSgpOworICAgIHVpbnQzMl90IGdldEpwZWdRdWFsaXR5KCk7CisgICAgdWludDMyX3QgZ2V0Um90YXRpb24oKTsKKyAgICB1aW50MzJfdCBnZXREZXZpY2VSb3RhdGlvbigpOworICAgIHVpbnQzMl90IGdldEpwZWdFeGlmUm90YXRpb24oKTsKKyAgICBib29sIHVzZUpwZWdFeGlmUm90YXRpb24oKTsKKyAgICBpbnQzMl90IGdldEVmZmVjdFZhbHVlKCk7CisgICAgYm9vbCBpc0luc3RhbnRBRUNFbmFibGVkKCk7CisgICAgYm9vbCBpc0luc3RhbnRDYXB0dXJlRW5hYmxlZCgpOworICAgIHVpbnQ4X3QgZ2V0QWVjRnJhbWVCb3VuZFZhbHVlKCk7CisgICAgdWludDhfdCBnZXRBZWNTa2lwRGlzcGxheUZyYW1lQm91bmQoKTsKKworICAgIGludDMyX3QgZ2V0RXhpZkRhdGVUaW1lKFN0cmluZzggJmRhdGVUaW1lLCBTdHJpbmc4ICZzdWJzZWNUaW1lKTsKKyAgICBpbnQzMl90IGdldEV4aWZGb2NhbExlbmd0aChyYXRfdCAqZm9jYWxMZW5naHQpOworICAgIHVpbnQxNl90IGdldEV4aWZJc29TcGVlZCgpOworICAgIGludDMyX3QgZ2V0RXhpZkdwc1Byb2Nlc3NpbmdNZXRob2QoY2hhciAqZ3BzUHJvY2Vzc2luZ01ldGhvZCwKKyAgICAgICAgICAgIHVpbnQzMl90ICZjb3VudCk7CisgICAgaW50MzJfdCBnZXRFeGlmTGF0aXR1ZGUocmF0X3QgKmxhdGl0dWRlLCBjaGFyICpsYXRSZWYpOworICAgIGludDMyX3QgZ2V0RXhpZkxvbmdpdHVkZShyYXRfdCAqbG9uZ2l0dWRlLCBjaGFyICpsb25SZWYpOworICAgIGludDMyX3QgZ2V0RXhpZkFsdGl0dWRlKHJhdF90ICphbHRpdHVkZSwgY2hhciAqYWx0UmVmKTsKKyAgICBpbnQzMl90IGdldEV4aWZHcHNEYXRlVGltZVN0YW1wKGNoYXIgKmdwc0RhdGVTdGFtcCwKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1ZkxlbiwgcmF0X3QgKmdwc1RpbWVTdGFtcCk7CisgICAgYm9vbCBpc1ZpZGVvQnVmZmVyc0NhY2hlZCgpOworICAgIGludDMyX3QgdXBkYXRlRm9jdXNEaXN0YW5jZXMoY2FtX2ZvY3VzX2Rpc3RhbmNlc19pbmZvX3QgKmZvY3VzRGlzdGFuY2VzKTsKKworICAgIGJvb2wgaXNBRUJyYWNrZXRFbmFibGVkKCk7CisgICAgaW50MzJfdCBzZXRBRUJyYWNrZXRpbmcoKTsKKyAgICBib29sIGlzRnBzRGVidWdFbmFibGVkKCk7CisgICAgYm9vbCBpc0hpc3RvZ3JhbUVuYWJsZWQoKTsKKyAgICBib29sIGlzU2NlbmVTZWxlY3Rpb25FbmFibGVkKCk7CisgICAgaW50MzJfdCBzZXRTZWxlY3RlZFNjZW5lKGNhbV9zY2VuZV9tb2RlX3R5cGUgc2NlbmUpOworICAgIGNhbV9zY2VuZV9tb2RlX3R5cGUgZ2V0U2VsZWN0ZWRTY2VuZSgpOworICAgIGJvb2wgaXNGYWNlRGV0ZWN0aW9uRW5hYmxlZCgpOworICAgIGludDMyX3Qgc2V0RmFjZURldGVjdGlvbk9wdGlvbihib29sIGVuYWJsZWQpOworICAgIGludDMyX3Qgc2V0SGlzdG9ncmFtKGJvb2wgZW5hYmxlZCk7CisgICAgaW50MzJfdCBzZXRGYWNlRGV0ZWN0aW9uKGJvb2wgZW5hYmxlZCwgYm9vbCBpbml0Q29tbWl0KTsKKyAgICBpbnQzMl90IHNldEZyYW1lU2tpcChlbnVtIG1zbV92ZmVfZnJhbWVfc2tpcF9wYXR0ZXJuIHBhdHRlcm4pOworICAgIHFjYW1lcmFfdGhlcm1hbF9tb2RlIGdldFRoZXJtYWxNb2RlKCk7CisgICAgaW50MzJfdCB1cGRhdGVSZWNvcmRpbmdIaW50VmFsdWUoaW50MzJfdCB2YWx1ZSk7CisgICAgaW50MzJfdCBzZXRIRFJBRUJyYWNrZXQoY2FtX2V4cF9icmFja2V0aW5nX3QgaGRyQnJhY2tldCk7CisgICAgYm9vbCBpc0hEUkVuYWJsZWQoKTsKKyAgICBib29sIGlzQXV0b0hEUkVuYWJsZWQoKTsKKyAgICBpbnQzMl90IHN0b3BBRUJyYWNrZXQoKTsKKyAgICBpbnQzMl90IHVwZGF0ZVJBVyhjYW1fZGltZW5zaW9uX3QgbWF4X2RpbSk7CisgICAgYm9vbCBpc0RJU0VuYWJsZWQoKTsKKyAgICBpbnQzMl90IHNldElTVHlwZSgpOworICAgIGNhbV9pc190eXBlX3QgZ2V0VmlkZW9JU1R5cGUoKTsKKyAgICBjYW1faXNfdHlwZV90IGdldFByZXZpZXdJU1R5cGUoKTsKKyAgICB1aW50OF90IGdldE1vYmljYXRNYXNrKCk7CisKKyAgICBjYW1fZm9jdXNfbW9kZV90eXBlIGdldEZvY3VzTW9kZSgpIGNvbnN0OworICAgIGludDMyX3Qgc2V0TnVtT2ZTbmFwc2hvdCgpOworICAgIGludDMyX3QgYWRqdXN0UHJldmlld0Zwc1JhbmdlKGNhbV9mcHNfcmFuZ2VfdCAqZnBzUmFuZ2UpOworICAgIGJvb2wgaXNKcGVnUGljdHVyZUZvcm1hdCgpOworICAgIGJvb2wgaXNOVjE2UGljdHVyZUZvcm1hdCgpOworICAgIGJvb2wgaXNOVjIxUGljdHVyZUZvcm1hdCgpOworICAgIGNhbV9kZW5vaXNlX3Byb2Nlc3NfdHlwZV90IGdldERlbm9pc2VQcm9jZXNzUGxhdGUoY2FtX2ludGZfcGFybV90eXBlX3QgdHlwZSk7CisgICAgaW50MzJfdCBnZXRNYXhQaWNTaXplKGNhbV9kaW1lbnNpb25fdCAmZGltKTsKKyAgICBpbnQgZ2V0RmxpcE1vZGUoY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7CisgICAgYm9vbCBpc1NuYXBzaG90RkROZWVkZWQoKTsKKworICAgIGJvb2wgaXNIRFIxeEZyYW1lRW5hYmxlZCgpOworICAgIGJvb2wgaXNZVVZGcmFtZUluZm9OZWVkZWQoKTsKKyAgICBjb25zdCBjaGFyKmdldEZyYW1lRm10U3RyaW5nKGNhbV9mb3JtYXRfdCBmbXQpOworICAgIGJvb2wgaXNIRFIxeEV4dHJhQnVmZmVyTmVlZGVkKCk7CisgICAgYm9vbCBpc0hEUk91dHB1dENyb3BFbmFibGVkKCk7CisKKyAgICBib29sIGlzUHJldmlld0ZsaXBDaGFuZ2VkKCk7CisgICAgYm9vbCBpc1ZpZGVvRmxpcENoYW5nZWQoKTsKKyAgICBib29sIGlzU25hcHNob3RGbGlwQ2hhbmdlZCgpOworICAgIHZvaWQgc2V0SERSU2NlbmVFbmFibGUoYm9vbCBiZmxhZyk7CisgICAgaW50MzJfdCB1cGRhdGVBV0JQYXJhbXMoY2FtX2F3Yl9wYXJhbXNfdCAmYXdiX3BhcmFtcyk7CisKKyAgICBjb25zdCBjaGFyICpnZXRBU0RTdGF0ZVN0cmluZyhjYW1fYXV0b19zY2VuZV90IHNjZW5lKTsKKyAgICBib29sIGlzSERSVGh1bWJuYWlsUHJvY2Vzc05lZWRlZCgpOworICAgIHZvaWQgc2V0TWluUHBNYXNrKGNhbV9mZWF0dXJlX21hc2tfdCBtaW5fcHBfbWFzayk7CisgICAgYm9vbCBzZXRTdHJlYW1Db25maWd1cmUoYm9vbCBpc0NhcHR1cmUsCisgICAgICAgICAgICBib29sIHByZXZpZXdBc1Bvc3R2aWV3LCBib29sIHJlc2V0Q29uZmlnKTsKKyAgICBpbnQzMl90IGFkZE9ubGluZVJvdGF0aW9uKHVpbnQzMl90IHJvdGF0aW9uLCB1aW50MzJfdCBzdHJlYW1JZCwKKyAgICAgICAgICAgIGludDMyX3QgZGV2aWNlX3JvdGF0aW9uKTsKKyAgICB1aW50OF90IGdldE51bU9mRXh0cmFCdWZmZXJzRm9ySW1hZ2VQcm9jKCk7CisgICAgdWludDhfdCBnZXROdW1PZkV4dHJhQnVmZmVyc0ZvclZpZGVvKCk7CisgICAgdWludDhfdCBnZXROdW1PZkV4dHJhQnVmZmVyc0ZvclByZXZpZXcoKTsKKyAgICB1aW50MzJfdCBnZXRFeGlmQnVmSW5kZXgodWludDMyX3QgY2FwdHVyZUluZGV4KTsKKyAgICBib29sIG5lZWRUaHVtYm5haWxSZXByb2Nlc3MoY2FtX2ZlYXR1cmVfbWFza190ICpwRmVhdHVyZU1hc2spOworICAgIGJvb2wgaXNVYmlGb2N1c0VuYWJsZWQoKTsKKyAgICBib29sIGlzQ2hyb21hRmxhc2hFbmFibGVkKCk7CisgICAgYm9vbCBpc0hpZ2hRdWFsaXR5Tm9pc2VSZWR1Y3Rpb25Nb2RlKCk7CisgICAgYm9vbCBpc1RydWVQb3J0cmFpdEVuYWJsZWQoKTsKKyAgICBzaXplX3QgZ2V0VFBNYXhNZXRhU2l6ZSgpOworICAgIGJvb2wgaXNTZWVNb3JlRW5hYmxlZCgpOworICAgIGJvb2wgaXNTdGlsbE1vcmVFbmFibGVkKCk7CisgICAgYm9vbCBpc09wdGlab29tRW5hYmxlZCgpOworCisgICAgaW50MzJfdCBjb21taXRBRkJyYWNrZXQoY2FtX2FmX2JyYWNrZXRpbmdfdCBhZkJyYWNrZXQpOworICAgIGludDMyX3Qgc2V0M0FMb2NrKGJvb2wgbG9jazNBKTsKKyAgICBpbnQzMl90IHNldEFuZENvbW1pdFpvb20oaW50IHpvb21fbGV2ZWwpOworICAgIHVpbnQ4X3QgZ2V0QnVyc3RDb3VudEZvckFkdmFuY2VkQ2FwdHVyZSgpOworICAgIHVpbnQzMl90IGdldE51bWJlckluQnVmc0ZvclNpbmdsZVNob3QoKTsKKyAgICB1aW50MzJfdCBnZXROdW1iZXJPdXRCdWZzRm9yU2luZ2xlU2hvdCgpOworICAgIGludDMyX3Qgc2V0TG9uZ3Nob3RFbmFibGUoYm9vbCBlbmFibGUpOworICAgIFN0cmluZzggZHVtcCgpOworICAgIGJvb2wgaXNVYmlSZWZvY3VzKCk7CisgICAgdWludDMyX3QgZ2V0UmVmb2N1c01heE1ldGFTaXplKCk7CisgICAgdWludDhfdCBnZXRSZWZvY3VzT3V0cHV0Q291bnQoKTsKKyAgICBib29sIGdlbmVyYXRlVGh1bWJGcm9tTWFpbigpOworICAgIHZvaWQgdXBkYXRlQ3VycmVudEZvY3VzUG9zaXRpb24oY2FtX2ZvY3VzX3Bvc19pbmZvX3QgJmN1cl9wb3NfaW5mbyk7CisgICAgdm9pZCB1cGRhdGVBRUluZm8oY2FtXzNhX3BhcmFtc190ICZhZV9wYXJhbXMpOworICAgIGJvb2wgaXNEaXNwbGF5RnJhbWVOZWVkZWQoKTsKKyAgICBib29sIGlzQWR2Q2FtRmVhdHVyZXNFbmFibGVkKCk7CisgICAgaW50MzJfdCBzZXRBZWNMb2NrKGNvbnN0IGNoYXIgKmFlY1N0cik7CisgICAgaW50MzJfdCB1cGRhdGVEZWJ1Z0xldmVsKCk7CisgICAgYm9vbCBpczRrMmtWaWRlb1Jlc29sdXRpb24oKTsKKyAgICBib29sIGlzVUJXQ0VuYWJsZWQoKTsKKworICAgIGludCBnZXRCcmlnaHRuZXNzKCk7CisgICAgaW50MzJfdCB1cGRhdGVPaXNWYWx1ZShib29sIG9pc1ZhbHVlKTsKKyAgICBpbnQzMl90IHNldEludEV2ZW50KGNhbV9pbnRfZXZ0X3BhcmFtc190IHBhcmFtcyk7CisgICAgYm9vbCBnZXRvZmZsaW5lUkFXKCk7CisgICAgYm9vbCBnZXRRdWFkcmFDZmEoKTsKKyAgICBpbnQzMl90IHVwZGF0ZVBwRmVhdHVyZU1hc2soY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUpOworICAgIGludDMyX3QgZ2V0U3RyZWFtUHBNYXNrKGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlLCBjYW1fZmVhdHVyZV9tYXNrX3QgJnBwX21hc2spOworICAgIGludDMyX3QgZ2V0U2hhcnBuZXNzKCk7CisgICAgaW50MzJfdCBnZXRFZmZlY3QoKTsKKyAgICBpbnQzMl90IHVwZGF0ZUZsYXNoTW9kZShjYW1fZmxhc2hfbW9kZV90IGZsYXNoX21vZGUpOworICAgIGludDMyX3QgY29uZmlndXJlQUVCcmFja2V0aW5nKGNhbV9jYXB0dXJlX2ZyYW1lX2NvbmZpZ190ICZmcmFtZV9jb25maWcpOworICAgIGludDMyX3QgY29uZmlndXJlSERSQnJhY2tldGluZyhjYW1fY2FwdHVyZV9mcmFtZV9jb25maWdfdCAmZnJhbWVfY29uZmlnKTsKKyAgICBpbnQzMl90IGNvbmZpZ0ZyYW1lQ2FwdHVyZShib29sIGNvbW1pdFNldHRpbmdzKTsKKyAgICBpbnQzMl90IHJlc2V0RnJhbWVDYXB0dXJlKGJvb2wgY29tbWl0U2V0dGluZ3MsIGJvb2wgbG93TGlnaHRFbmFibGVkKTsKKyAgICBjYW1fc3RpbGxfbW9yZV90IGdldFN0aWxsTW9yZVNldHRpbmdzKCk7CisgICAgdm9pZCBzZXRTdGlsbE1vcmVTZXR0aW5ncyhjYW1fc3RpbGxfbW9yZV90IHN0aWxsbW9yZV9jb25maWcpOworICAgIGNhbV9zdGlsbF9tb3JlX3QgZ2V0U3RpbGxNb3JlQ2FwYWJpbGl0eSgpOworICAgIGNhbV9keW5faW1nX2RhdGFfdCBnZXREeW5hbWljSW1nRGF0YSgpOworICAgIHZvaWQgc2V0RHluYW1pY0ltZ0RhdGEoY2FtX2R5bl9pbWdfZGF0YV90IGQpOworCisgICAgaW50MzJfdCBnZXRQYXJtWm9vbUxldmVsKCk7CisgICAgaW50OF90IGdldFJlcHJvY0NvdW50KCk7CisgICAgaW50OF90IGdldEN1clBQQ291bnQoKTsKKyAgICB2b2lkIHNldFJlcHJvY0NvdW50KCk7CisgICAgYm9vbCBpc1Bvc3RQcm9jU2NhbGluZygpOworICAgIGJvb2wgaXNMTE5vaXNlRW5hYmxlZCgpOworICAgIHZvaWQgc2V0Q3VyUFBDb3VudChpbnQ4X3QgY291bnQpOworICAgIGludDMyX3Qgc2V0UXVhZHJhQ2ZhTW9kZSh1aW50MzJfdCB2YWx1ZSwgYm9vbCBpbml0Q29tbWl0KTsKKyAgICBpbnQzMl90IHNldFRvbmVNYXBNb2RlKHVpbnQzMl90IHZhbHVlLCBib29sIGluaXRDb21taXQpOworICAgIHZvaWQgc2V0VGludGxlc3MoYm9vbCBlbmFibGUpOworICAgIHVpbnQ4X3QgZ2V0TG9uZ3Nob3RTdGFnZXMoKTsKKyAgICBpbnQ4X3QgZ2V0QnVmQmF0Y2hDb3VudCgpOworICAgIGludDhfdCBnZXRWaWRlb0JhdGNoU2l6ZSgpOworCisgICAgaW50MzJfdCBzZXRNYW51YWxDYXB0dXJlTW9kZSgKKyAgICAgICAgICAgIFFDYW1lcmFNYW51YWxDYXB0dXJlTW9kZXMgdmFsdWUgPSBDQU1fTUFOVUFMX0NBUFRVUkVfVFlQRV9PRkYpOworICAgIFFDYW1lcmFNYW51YWxDYXB0dXJlTW9kZXMgZ2V0TWFudWFsQ2FwdHVyZU1vZGUoKTsKKyAgICBpbnQ2NF90IGdldEV4cG9zdXJlVGltZSgpOworCisgICAgY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QgZ2V0Q2FwdHVyZUZyYW1lQ29uZmlnKCk7CisgICAgdm9pZCBzZXRKcGVnUm90YXRpb24oaW50IHJvdGF0aW9uKTsKKyAgICB1aW50MzJfdCBnZXRKcGVnUm90YXRpb24oKTsKKworICAgIHZvaWQgc2V0TG93TGlnaHRMZXZlbChjYW1fbG93X2xpZ2h0X21vZGVfdCB2YWx1ZSk7CisgICAgY2FtX2xvd19saWdodF9tb2RlX3QgZ2V0TG93TGlnaHRMZXZlbCgpOworICAgIGJvb2wgZ2V0TG93TGlnaHRDYXB0dXJlKCk7CisKKyAgICAvKiBEdWFsIGNhbWVyYSBzcGVjaWZpYyAqLworICAgIGJvb2wgZ2V0RGNyZigpOworICAgIGludDMyX3Qgc2V0UmVsYXRlZENhbVN5bmNJbmZvKAorICAgICAgICAgICAgY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCogaW5mbyk7CisgICAgY29uc3QgY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCoKKyAgICAgICAgICAgIGdldFJlbGF0ZWRDYW1TeW5jSW5mbyh2b2lkKTsKKyAgICBpbnQzMl90IHNldEZyYW1lU3luY0VuYWJsZWQoYm9vbCBlbmFibGUpOworICAgIGJvb2wgaXNGcmFtZVN5bmNFbmFibGVkKHZvaWQpOworICAgIGludDMyX3QgZ2V0UmVsYXRlZENhbUNhbGlicmF0aW9uKAorICAgICAgICAgICAgY2FtX3JlbGF0ZWRfc3lzdGVtX2NhbGlicmF0aW9uX2RhdGFfdCogY2FsaWIpOworICAgIGludDMyX3QgYnVuZGxlUmVsYXRlZENhbWVyYXMoYm9vbCBzeW5jLCB1aW50MzJfdCBzZXNzaW9uaWQpOworICAgIHVpbnQ4X3QgZmRNb2RlSW5WaWRlbygpOworICAgIGJvb2wgaXNPRU1GZWF0RW5hYmxlZCgpOworCisgICAgaW50MzJfdCBzZXRac2xNb2RlKGJvb2wgdmFsdWUpOworICAgIGludDMyX3QgdXBkYXRlWlNMTW9kZVZhbHVlKGJvb2wgdmFsdWUpOworCisgICAgYm9vbCBpc1JlcHJvY1NjYWxlRW5hYmxlZCgpOworICAgIGJvb2wgaXNVbmRlclJlcHJvY1NjYWxpbmcoKTsKKyAgICBpbnQzMl90IGdldFBpY1NpemVGcm9tQVBLKGludCAmd2lkdGgsIGludCAmaGVpZ2h0KTsKKworICAgIGludDMyX3QgY2hlY2tGZWF0dXJlQ29uY3VycmVuY3koKTsKKyAgICBpbnQzMl90IHNldEluc3RhbnRBRUModWludDhfdCBlbmFibGUsIGJvb2wgaW5pdENvbW1pdCk7CisKKyAgICBpbnQzMl90IGdldEFuYWx5c2lzSW5mbygKKyAgICAgICAgYm9vbCBmZFZpZGVvRW5hYmxlZCwKKyAgICAgICAgYm9vbCBoYWwzLAorICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgZmVhdHVyZU1hc2ssCisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3QgKnBBbmFseXNpc0luZm8pOworICAgIGludDMyX3QgdXBkYXRlRHRWYyhpbnQzMl90ICpkdCwgaW50MzJfdCAqdmMpOworCitwcml2YXRlOgorICAgIFFDYW1lcmFQYXJhbWV0ZXJzICptSW1wbDsKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworfTsKKworfTsgLy8gbmFtZXNwYWNlIHFjYW1lcmEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFQb3N0UHJvYy5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFQb3N0UHJvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4Y2VmNAotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBvc3RQcm9jLmNwcApAQCAtMCwwICsxLDM2NjQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyogbWV0OgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKi8KKworI2RlZmluZSBMT0dfVEFHICJRQ2FtZXJhUG9zdFByb2MiCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJRQ2FtZXJhMkhXSS5oIgorI2luY2x1ZGUgIlFDYW1lcmFQb3N0UHJvYy5oIgorI2luY2x1ZGUgIlFDYW1lcmFUcmFjZS5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJtbV9jYW1lcmFfZGJnLmgiCit9CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworY29uc3QgY2hhciAqUUNhbWVyYVBvc3RQcm9jZXNzb3I6OlNUT1JFX0xPQ0FUSU9OID0gIi9zZGNhcmQvaW1nXyVkLmpwZyI7CisKKyNkZWZpbmUgRlJFRV9KUEVHX09VVFBVVF9CVUZGRVIocHRyLGNudCkgICAgIFwKKyAgICBpbnQganBlZ19idWZzOyBcCisgICAgZm9yIChqcGVnX2J1ZnMgPSAwOyBqcGVnX2J1ZnMgPCAoaW50KWNudDsganBlZ19idWZzKyspICB7IFwKKyAgICAgIGlmIChwdHJbanBlZ19idWZzXSAhPSBOVUxMKSB7IFwKKyAgICAgICAgICBmcmVlKHB0cltqcGVnX2J1ZnNdKTsgXAorICAgICAgICAgIHB0cltqcGVnX2J1ZnNdID0gTlVMTDsgXAorICAgICAgfSBcCisgICAgfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmFQb3N0UHJvY2Vzc29yCisgKgorICogREVTQ1JJUFRJT046IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmFQb3N0UHJvY2Vzc29yLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtX2N0cmwgOiBwdHIgdG8gSFdJIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFQb3N0UHJvY2Vzc29yOjpRQ2FtZXJhUG9zdFByb2Nlc3NvcihRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpjYW1fY3RybCkKKyAgICA6IG1fcGFyZW50KGNhbV9jdHJsKSwKKyAgICAgIG1KcGVnQ0IoTlVMTCksCisgICAgICBtSnBlZ1VzZXJEYXRhKE5VTEwpLAorICAgICAgbUpwZWdDbGllbnRIYW5kbGUoMCksCisgICAgICBtSnBlZ1Nlc3Npb25JZCgwKSwKKyAgICAgIG1fcEpwZWdFeGlmT2JqKE5VTEwpLAorICAgICAgbV9iVGh1bWJuYWlsTmVlZGVkKFRSVUUpLAorICAgICAgbVBQQ2hhbm5lbENvdW50KDApLAorICAgICAgbV9iSW5pdGVkKEZBTFNFKSwKKyAgICAgIG1faW5wdXRQUFEocmVsZWFzZU9uZ29pbmdQUERhdGEsIHRoaXMpLAorICAgICAgbV9vbmdvaW5nUFBRKHJlbGVhc2VPbmdvaW5nUFBEYXRhLCB0aGlzKSwKKyAgICAgIG1faW5wdXRKcGVnUShyZWxlYXNlSnBlZ0RhdGEsIHRoaXMpLAorICAgICAgbV9vbmdvaW5nSnBlZ1EocmVsZWFzZUpwZWdEYXRhLCB0aGlzKSwKKyAgICAgIG1faW5wdXRSYXdRKHJlbGVhc2VSYXdEYXRhLCB0aGlzKSwKKyAgICAgIG1TYXZlRnJtQ250KDApLAorICAgICAgbVVzZVNhdmVQcm9jKGZhbHNlKSwKKyAgICAgIG1Vc2VKcGVnQnVyc3QoZmFsc2UpLAorICAgICAgbUpwZWdNZW1PcHQodHJ1ZSksCisgICAgICBtX0pwZWdPdXRwdXRNZW1Db3VudCgwKSwKKyAgICAgIG1OZXdKcGVnU2Vzc2lvbk5lZWRlZCh0cnVlKSwKKyAgICAgIG1fYnVmQ291bnRQUFEoMCksCisgICAgICBtX1BQaW5kZXgoMCkKK3sKKyAgICBtZW1zZXQoJm1KcGVnSGFuZGxlLCAwLCBzaXplb2YobUpwZWdIYW5kbGUpKTsKKyAgICBtZW1zZXQoJm1KcGVnTXBvSGFuZGxlLCAwLCBzaXplb2YobUpwZWdNcG9IYW5kbGUpKTsKKyAgICBtZW1zZXQoJm1fcEpwZWdPdXRwdXRNZW0sIDAsIHNpemVvZihtX3BKcGVnT3V0cHV0TWVtKSk7CisgICAgbWVtc2V0KG1QUENoYW5uZWxzLCAwLCBzaXplb2YobVBQQ2hhbm5lbHMpKTsKKyAgICBtX0RhdGFNZW0gPSBOVUxMOworICAgIG1PZmZsaW5lRGF0YUJ1ZnMgPSBOVUxMOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbV9yZXByb2Nlc3NfbG9jayxOVUxMKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYVBvc3RQcm9jZXNzb3IKKyAqCisgKiBERVNDUklQVElPTjogZGVjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhUG9zdFByb2Nlc3Nvci4KKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFQb3N0UHJvY2Vzc29yOjp+UUNhbWVyYVBvc3RQcm9jZXNzb3IoKQoreworICAgIEZSRUVfSlBFR19PVVRQVVRfQlVGRkVSKG1fcEpwZWdPdXRwdXRNZW0sbV9KcGVnT3V0cHV0TWVtQ291bnQpOworICAgIGlmIChtX3BKcGVnRXhpZk9iaiAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtX3BKcGVnRXhpZk9iajsKKyAgICAgICAgbV9wSnBlZ0V4aWZPYmogPSBOVUxMOworICAgIH0KKyAgICBmb3IgKGludDhfdCBpID0gMDsgaSA8IG1QUENoYW5uZWxDb3VudDsgaSsrKSB7CisgICAgICAgIFFDYW1lcmFDaGFubmVsICpwQ2hhbm5lbCA9IG1QUENoYW5uZWxzW2ldOworICAgICAgICBpZiAoIHBDaGFubmVsICE9IE5VTEwgKSB7CisgICAgICAgICAgICBwQ2hhbm5lbC0+c3RvcCgpOworICAgICAgICAgICAgZGVsZXRlIHBDaGFubmVsOworICAgICAgICAgICAgcENoYW5uZWwgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIG1QUENoYW5uZWxDb3VudCA9IDA7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtX3JlcHJvY2Vzc19sb2NrKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRKcGVnSGFuZGxlCisgKgorICogREVTQ1JJUFRJT046IHNldCBKUEVHIGNsaWVudCBoYW5kbGVzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwSnBlZ0hhbmRsZSAgICA6IEpQRUcgb3BzIGhhbmRsZQorICogICBAcEpwZWdNcG9IYW5kbGUgICAgOiBNUE8gSlBFRyBvcHMgaGFuZGxlCisgKiAgIEBjbGllbnRIYW5kbGUgICAgOiBKUEVHIGNsaWVudCBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQb3N0UHJvY2Vzc29yOjpzZXRKcGVnSGFuZGxlKG1tX2pwZWdfb3BzX3QgKnBKcGVnSGFuZGxlLAorICAgIG1tX2pwZWdfbXBvX29wc190ICpwSnBlZ01wb0hhbmRsZSwgdWludDMyX3QgY2xpZW50SGFuZGxlKQoreworICAgIExPR0goIkUgbUpwZWdDbGllbnRIYW5kbGU6ICVkLCBjbGllbnRIYW5kbGU6ICVkIiwKKyAgICAgICAgICAgICBtSnBlZ0NsaWVudEhhbmRsZSwgY2xpZW50SGFuZGxlKTsKKworICAgIGlmKHBKcGVnSGFuZGxlKSB7CisgICAgICAgIG1lbWNweSgmbUpwZWdIYW5kbGUsIHBKcGVnSGFuZGxlLCBzaXplb2YobW1fanBlZ19vcHNfdCkpOworICAgIH0KKworICAgIGlmKHBKcGVnTXBvSGFuZGxlKSB7CisgICAgICAgIG1lbWNweSgmbUpwZWdNcG9IYW5kbGUsIHBKcGVnTXBvSGFuZGxlLCBzaXplb2YobW1fanBlZ19tcG9fb3BzX3QpKTsKKyAgICB9CisgICAgbUpwZWdDbGllbnRIYW5kbGUgPSBjbGllbnRIYW5kbGU7CisgICAgTE9HSCgiWCBtSnBlZ0NsaWVudEhhbmRsZTogJWQsIGNsaWVudEhhbmRsZTogJWQiLAorICAgICAgICAgICAgIG1KcGVnQ2xpZW50SGFuZGxlLCBjbGllbnRIYW5kbGUpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpbml0CisgKgorICogREVTQ1JJUFRJT046IGluaXRpYWxpemF0aW9uIG9mIHBvc3Rwcm9jZXNzb3IKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGpwZWdfY2IgICAgICA6IGNhbGxiYWNrIHRvIGhhbmRsZSBqcGVnIGV2ZW50IGZyb20gbW0tY2FtZXJhLWludGVyZmFjZQorICogICBAdXNlcl9kYXRhICAgIDogdXNlciBkYXRhIHB0ciBmb3IganBlZyBjYWxsYmFjaworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBvc3RQcm9jZXNzb3I6OmluaXQoanBlZ19lbmNvZGVfY2FsbGJhY2tfdCBqcGVnX2NiLCB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgbUpwZWdDQiA9IGpwZWdfY2I7CisgICAgbUpwZWdVc2VyRGF0YSA9IHVzZXJfZGF0YTsKKyAgICBtX2RhdGFQcm9jVGgubGF1bmNoKGRhdGFQcm9jZXNzUm91dGluZSwgdGhpcyk7CisgICAgbV9zYXZlUHJvY1RoLmxhdW5jaChkYXRhU2F2ZVJvdXRpbmUsIHRoaXMpOworICAgIG1fcGFyZW50LT5tUGFyYW1ldGVycy5zZXRSZXByb2NDb3VudCgpOworICAgIG1fYkluaXRlZCA9IFRSVUU7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGRlaW5pdAorICoKKyAqIERFU0NSSVBUSU9OOiBkZS1pbml0aWFsaXphdGlvbiBvZiBwb3N0cHJvY2Vzc29yCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQb3N0UHJvY2Vzc29yOjpkZWluaXQoKQoreworICAgIGlmIChtX2JJbml0ZWQgPT0gVFJVRSkgeworICAgICAgICBtX2RhdGFQcm9jVGguZXhpdCgpOworICAgICAgICBtX3NhdmVQcm9jVGguZXhpdCgpOworICAgICAgICBtX2JJbml0ZWQgPSBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0YXJ0CisgKgorICogREVTQ1JJUFRJT046IHN0YXJ0IHBvc3Rwcm9jZXNzb3IuIERhdGEgcHJvY2VzcyB0aHJlYWQgYW5kIGRhdGEgbm90aWZ5IHRocmVhZAorICogICAgICAgICAgICAgIHdpbGwgYmUgbGF1bmNoZWQuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwU3JjQ2hhbm5lbCA6IHNvdXJjZSBjaGFubmVsIG9iaiBwdHIgdGhhdCBwb3NzaWJseSBuZWVkcyByZXByb2Nlc3MKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICoKKyAqIE5PVEUgICAgICAgOiBpZiBhbnkgcmVwcm9jZXNzIGlzIG5lZWRlZCwgYSByZXByb2Nlc3MgY2hhbm5lbC9zdHJlYW0KKyAqICAgICAgICAgICAgICB3aWxsIGJlIHN0YXJ0ZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBvc3RQcm9jZXNzb3I6OnN0YXJ0KFFDYW1lcmFDaGFubmVsICpwU3JjQ2hhbm5lbCkKK3sKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgUUNhbWVyYUNoYW5uZWwgKnBJbnB1dENoYW5uZWwgPSBwU3JjQ2hhbm5lbDsKKworICAgIExPR0goIkUgIik7CisgICAgaWYgKG1fYkluaXRlZCA9PSBGQUxTRSkgeworICAgICAgICBMT0dFKCJwb3N0cHJvYyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChtX0RhdGFNZW0gIT0gTlVMTCkgeworICAgICAgICBtX0RhdGFNZW0tPnJlbGVhc2UobV9EYXRhTWVtKTsKKyAgICAgICAgbV9EYXRhTWVtID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocElucHV0Q2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIklucHV0IENoYW5uZWwgZm9yIHBwcm9jIGlzIE5VTEwuIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmICggbV9wYXJlbnQtPm5lZWRSZXByb2Nlc3MoKSApIHsKKyAgICAgICAgZm9yIChpbnQ4X3QgaSA9IDA7IGkgPCBtUFBDaGFubmVsQ291bnQ7IGkrKykgeworICAgICAgICAgICAgLy8gRGVsZXRlIHByZXZpb3VzIHJlcHJvYyBjaGFubmVsCisgICAgICAgICAgICBRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbCAqcENoYW5uZWwgPSBtUFBDaGFubmVsc1tpXTsKKyAgICAgICAgICAgIGlmIChwQ2hhbm5lbCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcENoYW5uZWwtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgcENoYW5uZWw7CisgICAgICAgICAgICAgICAgcENoYW5uZWwgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1QUENoYW5uZWxDb3VudCA9IDA7CisKKyAgICAgICAgbV9idWZDb3VudFBQUSA9IDA7CisgICAgICAgIGlmICghbV9wYXJlbnQtPmlzTG9uZ3Nob3RFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIG1fcGFyZW50LT5tUGFyYW1ldGVycy5zZXRSZXByb2NDb3VudCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fcGFyZW50LT5tUGFyYW1ldGVycy5nZXRNYW51YWxDYXB0dXJlTW9kZSgpID49CisgICAgICAgICAgICAgICAgQ0FNX01BTlVBTF9DQVBUVVJFX1RZUEVfMykgeworICAgICAgICAgICAgbVBQQ2hhbm5lbENvdW50ID0gbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdldFJlcHJvY0NvdW50KCkgLSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBQQ2hhbm5lbENvdW50ID0gbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdldFJlcHJvY0NvdW50KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgYWxsIHJlcHJvYyBjaGFubmVscyBhbmQgc3RhcnQgY2hhbm5lbAorICAgICAgICBmb3IgKGludDhfdCBpID0gMDsgaSA8IG1QUENoYW5uZWxDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBtUFBDaGFubmVsc1tpXSA9IG1fcGFyZW50LT5hZGRSZXByb2NDaGFubmVsKHBJbnB1dENoYW5uZWwsIGkpOworICAgICAgICAgICAgaWYgKG1QUENoYW5uZWxzW2ldID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJjYW5ub3QgYWRkIG11bHRpIHJlcHJvY2VzcyBjaGFubmVsIGkgPSAlZCIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmMgPSBtUFBDaGFubmVsc1tpXS0+c3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiY2Fubm90IHN0YXJ0IG11bHRpIHJlcHJvY2VzcyBjaGFubmVsIGkgPSAlZCIsIGkpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBtUFBDaGFubmVsc1tpXTsKKyAgICAgICAgICAgICAgICBtUFBDaGFubmVsc1tpXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwSW5wdXRDaGFubmVsID0gc3RhdGljX2Nhc3Q8UUNhbWVyYUNoYW5uZWwgKj4obVBQQ2hhbm5lbHNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5sb25nc2hvdC5zYXZlIiwgcHJvcCwgIjAiKTsKKyAgICBtVXNlU2F2ZVByb2MgPSBhdG9pKHByb3ApID4gMCA/IHRydWUgOiBmYWxzZTsKKworICAgIG1fUFBpbmRleCA9IDA7CisgICAgbV9JbnB1dE1ldGFkYXRhLmNsZWFyKCk7CisgICAgbV9kYXRhUHJvY1RoLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX1NUQVJUX0RBVEFfUFJPQywgVFJVRSwgRkFMU0UpOworICAgIG1fcGFyZW50LT5tX2NiTm90aWZpZXIuc3RhcnRTbmFwc2hvdHMoKTsKKyAgICBMT0dIKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0b3AKKyAqCisgKiBERVNDUklQVElPTjogc3RvcCBwb3N0cHJvY2Vzc29yLiBEYXRhIHByb2Nlc3MgYW5kIG5vdGlmeSB0aHJlYWQgd2lsbCBiZSBzdG9wcGVkLgorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqCisgKiBOT1RFICAgICAgIDogcmVwcm9jZXNzIGNoYW5uZWwgd2lsbCBiZSBzdG9wcGVkIGFuZCBkZWxldGVkIGlmIHRoZXJlIGlzIGFueQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQb3N0UHJvY2Vzc29yOjpzdG9wKCkKK3sKKyAgICBpZiAobV9iSW5pdGVkID09IFRSVUUpIHsKKyAgICAgICAgbV9wYXJlbnQtPm1fY2JOb3RpZmllci5zdG9wU25hcHNob3RzKCk7CisKKyAgICAgICAgaWYgKG1fRGF0YU1lbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtX0RhdGFNZW0tPnJlbGVhc2UobV9EYXRhTWVtKTsKKyAgICAgICAgICAgIG1fRGF0YU1lbSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAvLyBkYXRhUHJvYyBUaHJlYWQgbmVlZCB0byBwcm9jZXNzICJzdG9wIiBhcyBzeW5jIGNhbGwgYmVjYXVzZSBhYm9ydCBqcGVnIGpvYiBzaG91bGQgYmUgYSBzeW5jIGNhbGwKKyAgICAgICAgbV9kYXRhUHJvY1RoLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX1NUT1BfREFUQV9QUk9DLCBUUlVFLCBUUlVFKTsKKyAgICB9CisgICAgLy8gc3RvcCByZXByb2MgY2hhbm5lbCBpZiBleGlzdHMKKyAgICBmb3IgKGludDhfdCBpID0gMDsgaSA8IG1QUENoYW5uZWxDb3VudDsgaSsrKSB7CisgICAgICAgIFFDYW1lcmFSZXByb2Nlc3NDaGFubmVsICpwQ2hhbm5lbCA9IG1QUENoYW5uZWxzW2ldOworICAgICAgICBpZiAocENoYW5uZWwgIT0gTlVMTCkgeworICAgICAgICAgICAgcENoYW5uZWwtPnN0b3AoKTsKKyAgICAgICAgICAgIGRlbGV0ZSBwQ2hhbm5lbDsKKyAgICAgICAgICAgIHBDaGFubmVsID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtUFBDaGFubmVsQ291bnQgPSAwOworICAgIG1fUFBpbmRleCA9IDA7CisgICAgbV9JbnB1dE1ldGFkYXRhLmNsZWFyKCk7CisKKyAgICBpZiAobU9mZmxpbmVEYXRhQnVmcyAhPSBOVUxMKSB7CisgICAgICAgIG1PZmZsaW5lRGF0YUJ1ZnMtPmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVsZXRlIG1PZmZsaW5lRGF0YUJ1ZnM7CisgICAgICAgIG1PZmZsaW5lRGF0YUJ1ZnMgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY3JlYXRlSnBlZ1Nlc3Npb24KKyAqCisgKiBERVNDUklQVElPTjogc3RhcnQgSlBFRyBzZXNzaW9uIGluIHBhcmFsbGVsIHRvIHJlcHJvY2VzIHRvIHJlZHVjZSB0aGUgS1BJCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwU3JjQ2hhbm5lbCA6IHNvdXJjZSBjaGFubmVsIG9iaiBwdHIgdGhhdCBwb3NzaWJseSBuZWVkcyByZXByb2Nlc3MKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQb3N0UHJvY2Vzc29yOjpjcmVhdGVKcGVnU2Vzc2lvbihRQ2FtZXJhQ2hhbm5lbCAqcFNyY0NoYW5uZWwpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgTE9HSCgiRSAiKTsKKyAgICBpZiAobV9iSW5pdGVkID09IEZBTFNFKSB7CisgICAgICAgIExPR0UoInBvc3Rwcm9jIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKHBTcmNDaGFubmVsID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiSW5wdXQgQ2hhbm5lbCBmb3IgcHByb2MgaXMgTlVMTC4iKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1QUENoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsID0gTlVMTDsKKyAgICAgICAgaW50IHBwQ2hhbm5lbF9pZHggPSBtUFBDaGFubmVsQ291bnQgLSAxOworICAgICAgICBwQ2hhbm5lbCA9IG1fcGFyZW50LT5uZWVkUmVwcm9jZXNzKCkgPyBtUFBDaGFubmVsc1twcENoYW5uZWxfaWR4XSA6CisgICAgICAgICAgICAgICAgcFNyY0NoYW5uZWw7CisgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBTbmFwc2hvdFN0cmVhbSA9IE5VTEw7CisgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBUaHVtYlN0cmVhbSA9IE5VTEw7CisgICAgICAgIGJvb2wgdGh1bWJfc3RyZWFtX25lZWRlZCA9ICgoIW1fcGFyZW50LT5pc1pTTE1vZGUoKSB8fAorICAgICAgICAgICAgKG1fcGFyZW50LT5tUGFyYW1ldGVycy5nZXRGbGlwTW9kZShDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QpID09CisgICAgICAgICAgICAgbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdldEZsaXBNb2RlKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKSkpICYmCisgICAgICAgICAgICAhbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdlbmVyYXRlVGh1bWJGcm9tTWFpbigpKTsKKworICAgICAgICBpZiAocENoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiSW5wdXQgQ2hhbm5lbCBmb3IgcHByb2MgaXMgTlVMTCBmb3IgaW5kZXggJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgIHBwQ2hhbm5lbF9pZHgpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcENoYW5uZWwtPmdldE51bU9mU3RyZWFtcygpOyArK2kpIHsKKyAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBTdHJlYW0gPSBwQ2hhbm5lbC0+Z2V0U3RyZWFtQnlJbmRleChpKTsKKworICAgICAgICAgICAgaWYgKCBOVUxMID09IHBTdHJlYW0gKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QpIHx8CisgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QpKSB7CisgICAgICAgICAgICAgICAgcFNuYXBzaG90U3RyZWFtID0gcFN0cmVhbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCh0aHVtYl9zdHJlYW1fbmVlZGVkKSAmJgorICAgICAgICAgICAgICAgICAgIChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfUFJFVklFVykgfHwKKyAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+aXNUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1BPU1RWSUVXKSB8fAorICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcpIHx8CisgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVcpKSkgeworICAgICAgICAgICAgICAgIHBUaHVtYlN0cmVhbSA9IHBTdHJlYW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aHVtYm5haWwgaXMgbm90IHBhcnQgb2YgdGhlIHJlcHJvY2VzcyBjaGFubmVsLCB0aGVuCisgICAgICAgIC8vIHRyeSB0byBnZXQgaXQgZnJvbSB0aGUgc291cmNlIGNoYW5uZWwKKyAgICAgICAgaWYgKCh0aHVtYl9zdHJlYW1fbmVlZGVkKSAmJiAoTlVMTCA9PSBwVGh1bWJTdHJlYW0pICYmCisgICAgICAgICAgICAgICAgKHBDaGFubmVsID09IG1QUENoYW5uZWxzW3BwQ2hhbm5lbF9pZHhdKSkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBTcmNDaGFubmVsLT5nZXROdW1PZlN0cmVhbXMoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9IHBTcmNDaGFubmVsLT5nZXRTdHJlYW1CeUluZGV4KGkpOworCisgICAgICAgICAgICAgICAgaWYgKCBOVUxMID09IHBTdHJlYW0gKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVcpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1BPU1RWSUVXKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+aXNUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcpKSB7CisgICAgICAgICAgICAgICAgICAgIHBUaHVtYlN0cmVhbSA9IHBTdHJlYW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBOVUxMICE9IHBTbmFwc2hvdFN0cmVhbSApIHsKKyAgICAgICAgICAgIG1tX2pwZWdfZW5jb2RlX3BhcmFtc190IGVuY29kZVBhcmFtOworICAgICAgICAgICAgbWVtc2V0KCZlbmNvZGVQYXJhbSwgMCwgc2l6ZW9mKG1tX2pwZWdfZW5jb2RlX3BhcmFtc190KSk7CisgICAgICAgICAgICByYyA9IGdldEpwZWdFbmNvZGluZ0NvbmZpZyhlbmNvZGVQYXJhbSwgcFNuYXBzaG90U3RyZWFtLCBwVGh1bWJTdHJlYW0pOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiZXJyb3IgZ2V0dGluZyBlbmNvZGluZyBjb25maWciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0dIKCJbS1BJIFBlcmZdIDogY2FsbCBqcGVnIGNyZWF0ZV9zZXNzaW9uIik7CisKKyAgICAgICAgICAgIHJjID0gbUpwZWdIYW5kbGUuY3JlYXRlX3Nlc3Npb24obUpwZWdDbGllbnRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICZlbmNvZGVQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgJm1KcGVnU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR0UoImVycm9yIGNyZWF0aW5nIGEgbmV3IGpwZWcgZW5jb2Rpbmcgc2Vzc2lvbiIpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1OZXdKcGVnU2Vzc2lvbk5lZWRlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIExPR0goIlggIik7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEpwZWdFbmNvZGluZ0NvbmZpZworICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byBwcmVwYXJlIGVuY29kaW5nIGpvYiBpbmZvcm1hdGlvbgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZW5jb2RlX3Bhcm0gICA6IHBhcmFtIHRvIGJlIGZpbGxlZCB3aXRoIGVuY29kaW5nIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQb3N0UHJvY2Vzc29yOjpnZXRKcGVnRW5jb2RpbmdDb25maWcobW1fanBlZ19lbmNvZGVfcGFyYW1zX3QmIGVuY29kZV9wYXJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKm1haW5fc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmFTdHJlYW0gKnRodW1iX3N0cmVhbSkKK3sKKyAgICBMT0dEKCJFIik7CisgICAgaW50MzJfdCByZXQgPSBOT19FUlJPUjsKKyAgICBzaXplX3Qgb3V0X3NpemU7CisKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmpwZWdfYnVyc3QiLCBwcm9wLCAiMCIpOworICAgIG1Vc2VKcGVnQnVyc3QgPSAoYXRvaShwcm9wKSA+IDApICYmICFtVXNlU2F2ZVByb2M7CisgICAgZW5jb2RlX3Bhcm0uYnVyc3RfbW9kZSA9IG1Vc2VKcGVnQnVyc3Q7CisKKyAgICBjYW1fcmVjdF90IGNyb3A7CisgICAgbWVtc2V0KCZjcm9wLCAwLCBzaXplb2YoY2FtX3JlY3RfdCkpOworICAgIG1haW5fc3RyZWFtLT5nZXRDcm9wSW5mbyhjcm9wKTsKKworICAgIGNhbV9kaW1lbnNpb25fdCBzcmNfZGltLCBkc3RfZGltOworICAgIG1lbXNldCgmc3JjX2RpbSwgMCwgc2l6ZW9mKGNhbV9kaW1lbnNpb25fdCkpOworICAgIG1lbXNldCgmZHN0X2RpbSwgMCwgc2l6ZW9mKGNhbV9kaW1lbnNpb25fdCkpOworICAgIG1haW5fc3RyZWFtLT5nZXRGcmFtZURpbWVuc2lvbihzcmNfZGltKTsKKworICAgIGJvb2wgaGRyX291dHB1dF9jcm9wID0gbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmlzSERST3V0cHV0Q3JvcEVuYWJsZWQoKTsKKyAgICBpZiAoaGRyX291dHB1dF9jcm9wICYmIGNyb3AuaGVpZ2h0KSB7CisgICAgICAgIGRzdF9kaW0uaGVpZ2h0ID0gY3JvcC5oZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0X2RpbS5oZWlnaHQgPSBzcmNfZGltLmhlaWdodDsKKyAgICB9CisgICAgaWYgKGhkcl9vdXRwdXRfY3JvcCAmJiBjcm9wLndpZHRoKSB7CisgICAgICAgIGRzdF9kaW0ud2lkdGggPSBjcm9wLndpZHRoOworICAgIH0gZWxzZSB7CisgICAgICAgIGRzdF9kaW0ud2lkdGggPSBzcmNfZGltLndpZHRoOworICAgIH0KKworICAgIC8vIHNldCByb3RhdGlvbiBvbmx5IHdoZW4gbm8gb25saW5lIHJvdGF0aW9uIG9yIG9mZmxpbmUgcHAgcm90YXRpb24gaXMgZG9uZSBiZWZvcmUKKyAgICBpZiAoIW1fcGFyZW50LT5uZWVkUm90YXRpb25SZXByb2Nlc3MoKSkgeworICAgICAgICBlbmNvZGVfcGFybS5yb3RhdGlvbiA9IG1fcGFyZW50LT5tUGFyYW1ldGVycy5nZXRKcGVnUm90YXRpb24oKTsKKyAgICB9CisKKyAgICBlbmNvZGVfcGFybS5tYWluX2RpbS5zcmNfZGltID0gc3JjX2RpbTsKKyAgICBlbmNvZGVfcGFybS5tYWluX2RpbS5kc3RfZGltID0gZHN0X2RpbTsKKworICAgIG1fZHN0X2RpbSA9IGRzdF9kaW07CisKKyAgICBlbmNvZGVfcGFybS5qcGVnX2NiID0gbUpwZWdDQjsKKyAgICBlbmNvZGVfcGFybS51c2VyZGF0YSA9IG1KcGVnVXNlckRhdGE7CisKKyAgICBtX2JUaHVtYm5haWxOZWVkZWQgPSBUUlVFOyAvLyBuZWVkIGVuY29kZSB0aHVtYm5haWwgYnkgZGVmYXVsdAorICAgIC8vIHN5c3RlbSBwcm9wZXJ0eSB0byBkaXNhYmxlIHRoZSB0aHVtYm5haWwgZW5jb2RpbmcgaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBwb3dlcgorICAgIC8vIGJ5IGRlZmF1bHQgdGh1bWJuYWlsIGVuY29kaW5nIGlzIHNldCB0byBUUlVFIGFuZCBleHBsaWNpdGx5IHNldCB0aGlzIHByb3BlcnR5IHRvCisgICAgLy8gZGlzYWJsZSB0aGUgdGh1bWJuYWlsIGVuY29kaW5nCisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS50bi5kaXNhYmxlIiwgcHJvcCwgIjAiKTsKKyAgICBpZiAoYXRvaShwcm9wKSA9PSAxKSB7CisgICAgICAgIG1fYlRodW1ibmFpbE5lZWRlZCA9IEZBTFNFOworICAgICAgICBMT0dIKCJtX2JUaHVtYm5haWxOZWVkZWQgaXMgJWQiLCBtX2JUaHVtYm5haWxOZWVkZWQpOworICAgIH0KKyAgICBjYW1fZGltZW5zaW9uX3QgdGh1bWJuYWlsU2l6ZTsKKyAgICBtZW1zZXQoJnRodW1ibmFpbFNpemUsIDAsIHNpemVvZihjYW1fZGltZW5zaW9uX3QpKTsKKyAgICBtX3BhcmVudC0+Z2V0VGh1bWJuYWlsU2l6ZSh0aHVtYm5haWxTaXplKTsKKyAgICBpZiAodGh1bWJuYWlsU2l6ZS53aWR0aCA9PSAwIHx8IHRodW1ibmFpbFNpemUuaGVpZ2h0ID09IDApIHsKKyAgICAgICAgLy8gKDAsMCkgbWVhbnMgbm8gdGh1bWJuYWlsCisgICAgICAgIG1fYlRodW1ibmFpbE5lZWRlZCA9IEZBTFNFOworICAgIH0KKyAgICBlbmNvZGVfcGFybS5lbmNvZGVfdGh1bWJuYWlsID0gbV9iVGh1bWJuYWlsTmVlZGVkOworCisgICAgLy8gZ2V0IGNvbG9yIGZvcm1hdAorICAgIGNhbV9mb3JtYXRfdCBpbWdfZm10ID0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTI7CisgICAgbWFpbl9zdHJlYW0tPmdldEZvcm1hdChpbWdfZm10KTsKKyAgICBlbmNvZGVfcGFybS5jb2xvcl9mb3JtYXQgPSBnZXRDb2xvcmZtdEZyb21JbWdGbXQoaW1nX2ZtdCk7CisKKyAgICAvLyBnZXQganBlZyBxdWFsaXR5CisgICAgdWludDMyX3QgdmFsID0gbV9wYXJlbnQtPmdldEpwZWdRdWFsaXR5KCk7CisgICAgaWYgKDBVIDwgdmFsKSB7CisgICAgICAgIGVuY29kZV9wYXJtLnF1YWxpdHkgPSB2YWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HSCgiVXNpbmcgZGVmYXVsdCBKUEVHIHF1YWxpdHkiKTsKKyAgICAgICAgZW5jb2RlX3Bhcm0ucXVhbGl0eSA9IDg1OworICAgIH0KKyAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90IG1haW5fb2Zmc2V0OworICAgIG1lbXNldCgmbWFpbl9vZmZzZXQsIDAsIHNpemVvZihjYW1fZnJhbWVfbGVuX29mZnNldF90KSk7CisgICAgbWFpbl9zdHJlYW0tPmdldEZyYW1lT2Zmc2V0KG1haW5fb2Zmc2V0KTsKKworICAgIC8vIHNyYyBidWYgY29uZmlnCisgICAgUUNhbWVyYU1lbW9yeSAqcFN0cmVhbU1lbSA9IG1haW5fc3RyZWFtLT5nZXRTdHJlYW1CdWZzKCk7CisgICAgaWYgKHBTdHJlYW1NZW0gPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJjYW5ub3QgZ2V0IHN0cmVhbSBidWZzIGZyb20gbWFpbiBzdHJlYW0iKTsKKyAgICAgICAgcmV0ID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgIH0KKyAgICBlbmNvZGVfcGFybS5udW1fc3JjX2J1ZnMgPSBwU3RyZWFtTWVtLT5nZXRDbnQoKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW5jb2RlX3Bhcm0ubnVtX3NyY19idWZzOyBpKyspIHsKKyAgICAgICAgY2FtZXJhX21lbW9yeV90ICpzdHJlYW1fbWVtID0gcFN0cmVhbU1lbS0+Z2V0TWVtb3J5KGksIGZhbHNlKTsKKyAgICAgICAgaWYgKHN0cmVhbV9tZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgZW5jb2RlX3Bhcm0uc3JjX21haW5fYnVmW2ldLmluZGV4ID0gaTsKKyAgICAgICAgICAgIGVuY29kZV9wYXJtLnNyY19tYWluX2J1ZltpXS5idWZfc2l6ZSA9IHN0cmVhbV9tZW0tPnNpemU7CisgICAgICAgICAgICBlbmNvZGVfcGFybS5zcmNfbWFpbl9idWZbaV0uYnVmX3ZhZGRyID0gKHVpbnQ4X3QgKilzdHJlYW1fbWVtLT5kYXRhOworICAgICAgICAgICAgZW5jb2RlX3Bhcm0uc3JjX21haW5fYnVmW2ldLmZkID0gcFN0cmVhbU1lbS0+Z2V0RmQoaSk7CisgICAgICAgICAgICBlbmNvZGVfcGFybS5zcmNfbWFpbl9idWZbaV0uZm9ybWF0ID0gTU1fSlBFR19GTVRfWVVWOworICAgICAgICAgICAgZW5jb2RlX3Bhcm0uc3JjX21haW5fYnVmW2ldLm9mZnNldCA9IG1haW5fb2Zmc2V0OworICAgICAgICB9CisgICAgfQorICAgIExPR0koIlNyYyBCdWZmZXIgY250ID0gJWQsIHJlcyA9ICVkWCVkIGxlbiA9ICVkIHJvdCA9ICVkICIKKyAgICAgICAgICAgICJzcmNfZGltID0gJWRYJWQgZHN0X2RpbSA9ICVkWCVkIiwKKyAgICAgICAgICAgIGVuY29kZV9wYXJtLm51bV9zcmNfYnVmcywKKyAgICAgICAgICAgIG1haW5fb2Zmc2V0Lm1wWzBdLndpZHRoLCBtYWluX29mZnNldC5tcFswXS5oZWlnaHQsCisgICAgICAgICAgICBtYWluX29mZnNldC5mcmFtZV9sZW4sIGVuY29kZV9wYXJtLnJvdGF0aW9uLAorICAgICAgICAgICAgc3JjX2RpbS53aWR0aCwgc3JjX2RpbS5oZWlnaHQsCisgICAgICAgICAgICBkc3RfZGltLndpZHRoLCBkc3RfZGltLmhlaWdodCk7CisKKyAgICBpZiAobV9iVGh1bWJuYWlsTmVlZGVkID09IFRSVUUpIHsKKyAgICAgICAgbV9wYXJlbnQtPmdldFRodW1ibmFpbFNpemUoZW5jb2RlX3Bhcm0udGh1bWJfZGltLmRzdF9kaW0pOworCisgICAgICAgIGlmICh0aHVtYl9zdHJlYW0gPT0gTlVMTCkgeworICAgICAgICAgICAgdGh1bWJfc3RyZWFtID0gbWFpbl9zdHJlYW07CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgoOTAgPT0gbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdldEpwZWdSb3RhdGlvbigpKQorICAgICAgICAgICAgICAgIHx8ICgyNzAgPT0gbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdldEpwZWdSb3RhdGlvbigpKSkKKyAgICAgICAgICAgICAgICAmJiAobV9wYXJlbnQtPm5lZWRSb3RhdGlvblJlcHJvY2VzcygpKSkgeworICAgICAgICAgICAgLy8gc3dhcCB0aHVtYm5haWwgZGltZW5zaW9ucworICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90IHRtcF9kaW0gPSBlbmNvZGVfcGFybS50aHVtYl9kaW0uZHN0X2RpbTsKKyAgICAgICAgICAgIGVuY29kZV9wYXJtLnRodW1iX2RpbS5kc3RfZGltLndpZHRoID0gdG1wX2RpbS5oZWlnaHQ7CisgICAgICAgICAgICBlbmNvZGVfcGFybS50aHVtYl9kaW0uZHN0X2RpbS5oZWlnaHQgPSB0bXBfZGltLndpZHRoOworICAgICAgICB9CisgICAgICAgIHBTdHJlYW1NZW0gPSB0aHVtYl9zdHJlYW0tPmdldFN0cmVhbUJ1ZnMoKTsKKyAgICAgICAgaWYgKHBTdHJlYW1NZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiY2Fubm90IGdldCBzdHJlYW0gYnVmcyBmcm9tIHRodW1iIHN0cmVhbSIpOworICAgICAgICAgICAgcmV0ID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgfQorICAgICAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90IHRodW1iX29mZnNldDsKKyAgICAgICAgbWVtc2V0KCZ0aHVtYl9vZmZzZXQsIDAsIHNpemVvZihjYW1fZnJhbWVfbGVuX29mZnNldF90KSk7CisgICAgICAgIHRodW1iX3N0cmVhbS0+Z2V0RnJhbWVPZmZzZXQodGh1bWJfb2Zmc2V0KTsKKyAgICAgICAgZW5jb2RlX3Bhcm0ubnVtX3RtYl9idWZzID0gIHBTdHJlYW1NZW0tPmdldENudCgpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcFN0cmVhbU1lbS0+Z2V0Q250KCk7IGkrKykgeworICAgICAgICAgICAgY2FtZXJhX21lbW9yeV90ICpzdHJlYW1fbWVtID0gcFN0cmVhbU1lbS0+Z2V0TWVtb3J5KGksIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW1fbWVtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlbmNvZGVfcGFybS5zcmNfdGh1bWJfYnVmW2ldLmluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBlbmNvZGVfcGFybS5zcmNfdGh1bWJfYnVmW2ldLmJ1Zl9zaXplID0gc3RyZWFtX21lbS0+c2l6ZTsKKyAgICAgICAgICAgICAgICBlbmNvZGVfcGFybS5zcmNfdGh1bWJfYnVmW2ldLmJ1Zl92YWRkciA9ICh1aW50OF90ICopc3RyZWFtX21lbS0+ZGF0YTsKKyAgICAgICAgICAgICAgICBlbmNvZGVfcGFybS5zcmNfdGh1bWJfYnVmW2ldLmZkID0gcFN0cmVhbU1lbS0+Z2V0RmQoaSk7CisgICAgICAgICAgICAgICAgZW5jb2RlX3Bhcm0uc3JjX3RodW1iX2J1ZltpXS5mb3JtYXQgPSBNTV9KUEVHX0ZNVF9ZVVY7CisgICAgICAgICAgICAgICAgZW5jb2RlX3Bhcm0uc3JjX3RodW1iX2J1ZltpXS5vZmZzZXQgPSB0aHVtYl9vZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2FtX2Zvcm1hdF90IGltZ19mbXRfdGh1bWIgPSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMjsKKyAgICAgICAgdGh1bWJfc3RyZWFtLT5nZXRGb3JtYXQoaW1nX2ZtdF90aHVtYik7CisgICAgICAgIGVuY29kZV9wYXJtLnRodW1iX2NvbG9yX2Zvcm1hdCA9IGdldENvbG9yZm10RnJvbUltZ0ZtdChpbWdfZm10X3RodW1iKTsKKworICAgICAgICAvLyBjcm9wIGlzIHRoZSBzYW1lIGlmIGZyYW1lIGlzIHRoZSBzYW1lCisgICAgICAgIGlmICh0aHVtYl9zdHJlYW0gIT0gbWFpbl9zdHJlYW0pIHsKKyAgICAgICAgICAgIG1lbXNldCgmY3JvcCwgMCwgc2l6ZW9mKGNhbV9yZWN0X3QpKTsKKyAgICAgICAgICAgIHRodW1iX3N0cmVhbS0+Z2V0Q3JvcEluZm8oY3JvcCk7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJnNyY19kaW0sIDAsIHNpemVvZihjYW1fZGltZW5zaW9uX3QpKTsKKyAgICAgICAgdGh1bWJfc3RyZWFtLT5nZXRGcmFtZURpbWVuc2lvbihzcmNfZGltKTsKKyAgICAgICAgZW5jb2RlX3Bhcm0udGh1bWJfZGltLnNyY19kaW0gPSBzcmNfZGltOworCisgICAgICAgIGlmICghbV9wYXJlbnQtPm5lZWRSb3RhdGlvblJlcHJvY2VzcygpKSB7CisgICAgICAgICAgICBlbmNvZGVfcGFybS50aHVtYl9yb3RhdGlvbiA9IG1fcGFyZW50LT5tUGFyYW1ldGVycy5nZXRKcGVnUm90YXRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBlbmNvZGVfcGFybS50aHVtYl9kaW0uY3JvcCA9IGNyb3A7CisgICAgICAgIGVuY29kZV9wYXJtLnRodW1iX2Zyb21fcG9zdHZpZXcgPQorICAgICAgICAgICAgIW1fcGFyZW50LT5tUGFyYW1ldGVycy5nZW5lcmF0ZVRodW1iRnJvbU1haW4oKSAmJgorICAgICAgICAgICAgKGltZ19mbXRfdGh1bWIgIT0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVUJXQykgJiYKKyAgICAgICAgICAgIChtX3BhcmVudC0+bVBhcmFtZXRlcnMudXNlSnBlZ0V4aWZSb3RhdGlvbigpIHx8CisgICAgICAgICAgICBtX3BhcmVudC0+bVBhcmFtZXRlcnMuZ2V0SnBlZ1JvdGF0aW9uKCkgPT0gMCk7CisKKyAgICAgICAgaWYgKGVuY29kZV9wYXJtLnRodW1iX2Zyb21fcG9zdHZpZXcgJiYKKyAgICAgICAgICBtX3BhcmVudC0+bVBhcmFtZXRlcnMudXNlSnBlZ0V4aWZSb3RhdGlvbigpKXsKKyAgICAgICAgICBlbmNvZGVfcGFybS50aHVtYl9yb3RhdGlvbiA9CisgICAgICAgICAgICBtX3BhcmVudC0+bVBhcmFtZXRlcnMuZ2V0SnBlZ0V4aWZSb3RhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgTE9HSSgiU3JjIFRIVU1CIGJ1Zl9jbnQgPSAlZCwgcmVzID0gJWRYJWQgbGVuID0gJWQgcm90ID0gJWQgIgorICAgICAgICAgICAgInNyY19kaW0gPSAlZFglZCwgZHN0X2RpbSA9ICVkWCVkIiwKKyAgICAgICAgICAgIGVuY29kZV9wYXJtLm51bV90bWJfYnVmcywKKyAgICAgICAgICAgIHRodW1iX29mZnNldC5tcFswXS53aWR0aCwgdGh1bWJfb2Zmc2V0Lm1wWzBdLmhlaWdodCwKKyAgICAgICAgICAgIHRodW1iX29mZnNldC5mcmFtZV9sZW4sIGVuY29kZV9wYXJtLnRodW1iX3JvdGF0aW9uLAorICAgICAgICAgICAgZW5jb2RlX3Bhcm0udGh1bWJfZGltLnNyY19kaW0ud2lkdGgsCisgICAgICAgICAgICBlbmNvZGVfcGFybS50aHVtYl9kaW0uc3JjX2RpbS5oZWlnaHQsCisgICAgICAgICAgICBlbmNvZGVfcGFybS50aHVtYl9kaW0uZHN0X2RpbS53aWR0aCwKKyAgICAgICAgICAgIGVuY29kZV9wYXJtLnRodW1iX2RpbS5kc3RfZGltLmhlaWdodCk7CisgICAgfQorCisgICAgZW5jb2RlX3Bhcm0ubnVtX2RzdF9idWZzID0gMTsKKyAgICBpZiAobVVzZUpwZWdCdXJzdCkgeworICAgICAgICBlbmNvZGVfcGFybS5udW1fZHN0X2J1ZnMgPSBNQVhfSlBFR19CVVJTVDsKKyAgICB9CisgICAgZW5jb2RlX3Bhcm0uZ2V0X21lbW9yeSA9IE5VTEw7CisgICAgb3V0X3NpemUgPSBtYWluX29mZnNldC5mcmFtZV9sZW47CisgICAgaWYgKG1KcGVnTWVtT3B0KSB7CisgICAgICAgIGVuY29kZV9wYXJtLmdldF9tZW1vcnkgPSBnZXRKcGVnTWVtb3J5OworICAgICAgICBlbmNvZGVfcGFybS5wdXRfbWVtb3J5ID0gcmVsZWFzZUpwZWdNZW1vcnk7CisgICAgICAgIG91dF9zaXplID0gc2l6ZW9mKG9teF9qcGVnX291cHV0X2J1Zl90KTsKKyAgICAgICAgZW5jb2RlX3Bhcm0ubnVtX2RzdF9idWZzID0gZW5jb2RlX3Bhcm0ubnVtX3NyY19idWZzOworICAgIH0KKyAgICBtX0pwZWdPdXRwdXRNZW1Db3VudCA9ICh1aW50MzJfdCllbmNvZGVfcGFybS5udW1fZHN0X2J1ZnM7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fSnBlZ091dHB1dE1lbUNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKG1fcEpwZWdPdXRwdXRNZW1baV0gIT0gTlVMTCkKKyAgICAgICAgICBmcmVlKG1fcEpwZWdPdXRwdXRNZW1baV0pOworICAgICAgICBvbXhfanBlZ19vdXB1dF9idWZfdCBvbXhfb3V0X2J1ZjsKKyAgICAgICAgbWVtc2V0KCZvbXhfb3V0X2J1ZiwgMCwgc2l6ZW9mKG9teF9qcGVnX291cHV0X2J1Zl90KSk7CisgICAgICAgIG9teF9vdXRfYnVmLmhhbmRsZSA9IHRoaXM7CisgICAgICAgIC8vIGFsbG9jYXRlIG91dHB1dCBidWYgZm9yIGpwZWcgZW5jb2RpbmcKKyAgICAgICAgbV9wSnBlZ091dHB1dE1lbVtpXSA9IG1hbGxvYyhvdXRfc2l6ZSk7CisKKyAgICAgICAgaWYgKE5VTEwgPT0gbV9wSnBlZ091dHB1dE1lbVtpXSkgeworICAgICAgICAgIHJldCA9IE5PX01FTU9SWTsKKyAgICAgICAgICBMT0dFKCJpbml0SGVhcE1lbSBmb3IganBlZywgcmV0ID0gTk9fTUVNT1JZIik7CisgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSnBlZ01lbU9wdCkgeworICAgICAgICAgICAgbWVtY3B5KG1fcEpwZWdPdXRwdXRNZW1baV0sICZvbXhfb3V0X2J1Ziwgc2l6ZW9mKG9teF9vdXRfYnVmKSk7CisgICAgICAgIH0KKworICAgICAgICBlbmNvZGVfcGFybS5kZXN0X2J1ZltpXS5pbmRleCA9IGk7CisgICAgICAgIGVuY29kZV9wYXJtLmRlc3RfYnVmW2ldLmJ1Zl9zaXplID0gbWFpbl9vZmZzZXQuZnJhbWVfbGVuOworICAgICAgICBlbmNvZGVfcGFybS5kZXN0X2J1ZltpXS5idWZfdmFkZHIgPSAodWludDhfdCAqKW1fcEpwZWdPdXRwdXRNZW1baV07CisgICAgICAgIGVuY29kZV9wYXJtLmRlc3RfYnVmW2ldLmZkID0gLTE7CisgICAgICAgIGVuY29kZV9wYXJtLmRlc3RfYnVmW2ldLmZvcm1hdCA9IE1NX0pQRUdfRk1UX1lVVjsKKyAgICAgICAgZW5jb2RlX3Bhcm0uZGVzdF9idWZbaV0ub2Zmc2V0ID0gbWFpbl9vZmZzZXQ7CisgICAgfQorCisgICAgTE9HRCgiWCIpOworICAgIHJldHVybiBOT19FUlJPUjsKKworb25fZXJyb3I6CisgICAgRlJFRV9KUEVHX09VVFBVVF9CVUZGRVIobV9wSnBlZ091dHB1dE1lbSwgbV9KcGVnT3V0cHV0TWVtQ291bnQpOworCisgICAgTE9HRCgiWCB3aXRoIGVycm9yICVkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNlbmRFdnROb3RpZnkKKyAqCisgKiBERVNDUklQVElPTjogc2VuZCBldmVudCBub3RpZnkgdGhyb3VnaCBub3RpZnkgY2FsbGJhY2sgcmVnaXN0ZXJlZCBieSB1cHBlciBsYXllcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXNnX3R5cGU6IG1zZyB0eXBlIG9mIG5vdGlmeQorICogICBAZXh0MSAgICA6IGV4dGVuc2lvbgorICogICBAZXh0MiAgICA6IGV4dGVuc2lvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBvc3RQcm9jZXNzb3I6OnNlbmRFdnROb3RpZnkoaW50MzJfdCBtc2dfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBleHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGV4dDIpCit7CisgICAgcmV0dXJuIG1fcGFyZW50LT5zZW5kRXZ0Tm90aWZ5KG1zZ190eXBlLCBleHQxLCBleHQyKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZW5kRGF0YU5vdGlmeQorICoKKyAqIERFU0NSSVBUSU9OOiBlbnF1ZXVlIGRhdGEgaW50byBkYXRhTm90aWZ5IHRocmVhZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXNnX3R5cGU6IGRhdGEgY2FsbGJhY2sgbXNnIHR5cGUKKyAqICAgQGRhdGEgICAgOiBwdHIgdG8gZGF0YSBtZW1vcnkgc3RydWN0CisgKiAgIEBpbmRleCAgIDogaW5kZXggdG8gZGF0YSBidWZmZXIKKyAqICAgQG1ldGFkYXRhOiBwdHIgdG8gbWV0YSBkYXRhIGJ1ZmZlciBpZiB0aGVyZSBpcyBhbnkKKyAqICAgQHJlbGVhc2VfZGF0YSA6IHB0ciB0byBzdHJ1Y3QgaW5kaWNhdGluZyBpZiBkYXRhIG5lZWQgdG8gYmUgcmVsZWFzZWQKKyAqICAgICAgICAgICAgICAgICAgIGFmdGVyIG5vdGlmeQorICogICBAc3VwZXJfYnVmX2ZyYW1lX2lkeCA6IHN1cGVyIGJ1ZmZlciBmcmFtZSBpbmRleAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBvc3RQcm9jZXNzb3I6OnNlbmREYXRhTm90aWZ5KGludDMyX3QgbXNnX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWVtb3J5X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNhbWVyYV9yZWxlYXNlX2RhdGFfdCAqcmVsZWFzZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VwZXJfYnVmX2ZyYW1lX2lkeCkKK3sKKyAgICBxY2FtZXJhX2RhdGFfYXJnbV90ICpkYXRhX2NiID0gKHFjYW1lcmFfZGF0YV9hcmdtX3QgKiltYWxsb2Moc2l6ZW9mKHFjYW1lcmFfZGF0YV9hcmdtX3QpKTsKKyAgICBpZiAoTlVMTCA9PSBkYXRhX2NiKSB7CisgICAgICAgIExPR0UoIm5vIG1lbSBmb3IgYWNhbWVyYV9kYXRhX2FyZ21fdCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBtZW1zZXQoZGF0YV9jYiwgMCwgc2l6ZW9mKHFjYW1lcmFfZGF0YV9hcmdtX3QpKTsKKyAgICBkYXRhX2NiLT5tc2dfdHlwZSA9IG1zZ190eXBlOworICAgIGRhdGFfY2ItPmRhdGEgPSBkYXRhOworICAgIGRhdGFfY2ItPmluZGV4ID0gaW5kZXg7CisgICAgZGF0YV9jYi0+bWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICBpZiAocmVsZWFzZV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgZGF0YV9jYi0+cmVsZWFzZV9kYXRhID0gKnJlbGVhc2VfZGF0YTsKKyAgICB9CisKKyAgICBxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCBjYkFyZzsKKyAgICBtZW1zZXQoJmNiQXJnLCAwLCBzaXplb2YocWNhbWVyYV9jYWxsYmFja19hcmdtX3QpKTsKKyAgICBjYkFyZy5jYl90eXBlID0gUUNBTUVSQV9EQVRBX1NOQVBTSE9UX0NBTExCQUNLOworICAgIGNiQXJnLm1zZ190eXBlID0gbXNnX3R5cGU7CisgICAgY2JBcmcuZGF0YSA9IGRhdGE7CisgICAgY2JBcmcubWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICBjYkFyZy51c2VyX2RhdGEgPSBkYXRhX2NiOworICAgIGNiQXJnLmNvb2tpZSA9IHRoaXM7CisgICAgY2JBcmcucmVsZWFzZV9jYiA9IHJlbGVhc2VOb3RpZnlEYXRhOworICAgIGNiQXJnLmZyYW1lX2luZGV4ID0gc3VwZXJfYnVmX2ZyYW1lX2lkeDsKKyAgICBpbnQgcmMgPSBtX3BhcmVudC0+bV9jYk5vdGlmaWVyLm5vdGlmeUNhbGxiYWNrKGNiQXJnKTsKKyAgICBpZiAoIE5PX0VSUk9SICE9IHJjICkgeworICAgICAgICBMT0dFKCJFcnJvciBlbnF1ZXVpbmcganBlZyBkYXRhIGludG8gbm90aWZ5IHF1ZXVlIik7CisgICAgICAgIHJlbGVhc2VOb3RpZnlEYXRhKGRhdGFfY2IsIHRoaXMsIFVOS05PV05fRVJST1IpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdmFsaWRhdGVQb3N0UHJvY2VzcworICoKKyAqIERFU0NSSVBUSU9OOiBWZXJpZnkgb3V0cHV0IGJ1ZmZlciBjb3VudCBvZiBwcCBtb2R1bGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZyYW1lICAgOiBwcm9jZXNzIGZyYW1lIHJlY2VpdmVkIGZyb20gbW0tY2FtZXJhLWludGVyZmFjZQorICoKKyAqIFJFVFVSTiAgICAgOiBib29sIHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgVFJVRSAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIEZBTFNFICAgICBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBvc3RQcm9jZXNzb3I6OnZhbGlkYXRlUG9zdFByb2Nlc3MobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSkKK3sKKyAgICBib29sIHN0YXR1cyA9IFRSVUU7CisgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsID0gTlVMTDsKKyAgICBRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbCAqbV9wUmVwcm9jQ2hhbm5lbCA9IE5VTEw7CisKKyAgICBpZiAoZnJhbWUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHBDaGFubmVsID0gbV9wYXJlbnQtPmdldENoYW5uZWxCeUhhbmRsZShmcmFtZS0+Y2hfaWQpOworICAgIGZvciAoaW50OF90IGkgPSAwOyBpIDwgbVBQQ2hhbm5lbENvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHBDaGFubmVsID09IG1QUENoYW5uZWxzW2ldLT5nZXRTcmNDaGFubmVsKCkpIHsKKyAgICAgICAgICAgIG1fcFJlcHJvY0NoYW5uZWwgPSBtUFBDaGFubmVsc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChtX3BSZXByb2NDaGFubmVsICE9IE5VTEwpICYmIChwQ2hhbm5lbCA9PSBtX3BSZXByb2NDaGFubmVsLT5nZXRTcmNDaGFubmVsKCkpKSB7CisgICAgICAgIFFDYW1lcmFTdHJlYW0gKnBTdHJlYW0gPSBOVUxMOworICAgICAgICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBtX3BSZXByb2NDaGFubmVsLT5nZXROdW1PZlN0cmVhbXMoKTsgaSsrKSB7CisgICAgICAgICAgICBwU3RyZWFtID0gbV9wUmVwcm9jQ2hhbm5lbC0+Z2V0U3RyZWFtQnlJbmRleChpKTsKKyAgICAgICAgICAgIGlmIChwU3RyZWFtICYmIChtX2lucHV0UFBRLmdldEN1cnJlbnRTaXplKCkgPiAwKSAmJgorICAgICAgICAgICAgICAgICAgICAobV9vbmdvaW5nUFBRLmdldEN1cnJlbnRTaXplKCkgPj0gIHBTdHJlYW0tPmdldE51bVF1ZXVlZEJ1ZigpKSkgeworICAgICAgICAgICAgICAgIExPR1coIk91dCBvZiBQUCBCdWZmZXIgUFBRID0gJWQgb25nb2luZ1EgPSAlZCBKcGVnID0gJWQgb25KcGVnID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbV9pbnB1dFBQUS5nZXRDdXJyZW50U2l6ZSgpLCBtX29uZ29pbmdQUFEuZ2V0Q3VycmVudFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW5wdXRKcGVnUS5nZXRDdXJyZW50U2l6ZSgpLCBtX29uZ29pbmdKcGVnUS5nZXRDdXJyZW50U2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldE9mZmxpbmVQUElucHV0QnVmZmVyCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIHRvIGdlbmVyYXRlIG9mZmxpbmUgcG9zdCBwcm9jIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogQHNyY19mcmFtZSA6IHByb2Nlc3MgZnJhbWUgcmVjZWl2ZWQgZnJvbSBtbS1jYW1lcmEtaW50ZXJmYWNlCisgKgorICogUkVUVVJOICAgICA6IEJ1ZmZlciBwb2ludGVyIGlmIHN1Y2Nlc3NmdWxsCisgKiAgICAgICAgICAgIDogTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmVzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK21tX2NhbWVyYV9idWZfZGVmX3QgKlFDYW1lcmFQb3N0UHJvY2Vzc29yOjpnZXRPZmZsaW5lUFBJbnB1dEJ1ZmZlcigKKyAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzcmNfZnJhbWUpCit7CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqbUJ1ZkRlZnMgPSBOVUxMOworICAgIFFDYW1lcmFDaGFubmVsICpwQ2hhbm5lbCA9IE5VTEw7CisgICAgUUNhbWVyYVN0cmVhbSAqc3JjX3BTdHJlYW0gPSBOVUxMOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmRhdGFfZnJhbWUgPSBOVUxMOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1ldGFfZnJhbWUgPSBOVUxMOworCisgICAgaWYgKG1PZmZsaW5lRGF0YUJ1ZnMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJPZmZsaW5lIEJ1ZmZlciBub3QgYWxsb2NhdGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHVpbnQzMl90IG51bV9idWZzID0gbU9mZmxpbmVEYXRhQnVmcy0+Z2V0Q250KCk7CisgICAgc2l6ZV90IGJ1ZkRlZnNTaXplID0gbnVtX2J1ZnMgKiBzaXplb2YobW1fY2FtZXJhX2J1Zl9kZWZfdCk7CisgICAgbUJ1ZkRlZnMgPSAobW1fY2FtZXJhX2J1Zl9kZWZfdCAqKW1hbGxvYyhidWZEZWZzU2l6ZSk7CisgICAgaWYgKG1CdWZEZWZzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtZW1zZXQobUJ1ZkRlZnMsIDAsIGJ1ZkRlZnNTaXplKTsKKworICAgIHBDaGFubmVsID0gbV9wYXJlbnQtPmdldENoYW5uZWxCeUhhbmRsZShzcmNfZnJhbWUtPmNoX2lkKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3JjX2ZyYW1lLT5udW1fYnVmczsgaSsrKSB7CisgICAgICAgIHNyY19wU3RyZWFtID0gcENoYW5uZWwtPmdldFN0cmVhbUJ5SGFuZGxlKAorICAgICAgICAgICAgICAgIHNyY19mcmFtZS0+YnVmc1tpXS0+c3RyZWFtX2lkKTsKKyAgICAgICAgaWYgKHNyY19wU3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChzcmNfcFN0cmVhbS0+Z2V0TXlUeXBlKCkgPT0gQ0FNX1NUUkVBTV9UWVBFX1JBVykgeworICAgICAgICAgICAgICAgIExPR0goIkZvdW5kIFJBVyBpbnB1dCBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgICBkYXRhX2ZyYW1lID0gc3JjX2ZyYW1lLT5idWZzW2ldOworICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNfcFN0cmVhbS0+Z2V0TXlUeXBlKCkgPT0gQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBKXsKKyAgICAgICAgICAgICAgICBMT0dIKCJGb3VuZCBNZXRhZGEgaW5wdXQgc3RyZWFtIik7CisgICAgICAgICAgICAgICAgbWV0YV9mcmFtZSA9IHNyY19mcmFtZS0+YnVmc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoc3JjX3BTdHJlYW0gIT0gTlVMTCkgJiYgKGRhdGFfZnJhbWUgIT0gTlVMTCkpIHsKKyAgICAgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCBvZmZzZXQ7CisgICAgICAgIG1lbXNldCgmb2Zmc2V0LCAwLCBzaXplb2YoY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCkpOworICAgICAgICBzcmNfcFN0cmVhbS0+Z2V0RnJhbWVPZmZzZXQob2Zmc2V0KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bV9idWZzOyBpKyspIHsKKyAgICAgICAgICAgIG1CdWZEZWZzW2ldID0gKmRhdGFfZnJhbWU7CisgICAgICAgICAgICBtT2ZmbGluZURhdGFCdWZzLT5nZXRCdWZEZWYob2Zmc2V0LCBtQnVmRGVmc1tpXSwgaSk7CisKKyAgICAgICAgICAgIExPR0QoIkR1bXBpbmcgUkFXIGRhdGEgb24gb2ZmbGluZSBidWZmZXIiKTsKKyAgICAgICAgICAgIC8qQWN0dWFsIGRhdGEgbWVtY3B5IGp1c3QgZm9yIHZlcmlmaWNhdGlvbiovCisgICAgICAgICAgICBtZW1jcHkobUJ1ZkRlZnNbaV0uYnVmZmVyLCBkYXRhX2ZyYW1lLT5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgIG1CdWZEZWZzW2ldLmZyYW1lX2xlbik7CisgICAgICAgIH0KKyAgICAgICAgcmVsZWFzZVN1cGVyQnVmKHNyY19mcmFtZSwgQ0FNX1NUUkVBTV9UWVBFX1JBVyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnJlZShtQnVmRGVmcyk7CisgICAgICAgIG1CdWZEZWZzID0gTlVMTDsKKyAgICB9CisKKyAgICBMT0dIKCJtQnVmRGVmcyA9ICVwIiwgbUJ1ZkRlZnMpOworICAgIHJldHVybiBtQnVmRGVmczsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jZXNzRGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBlbnF1ZXVlIGRhdGEgaW50byBkYXRhUHJvYyB0aHJlYWQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZyYW1lICAgOiBwcm9jZXNzIGZyYW1lIHJlY2VpdmVkIGZyb20gbW0tY2FtZXJhLWludGVyZmFjZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKgorICogTk9URSAgICAgICA6IGRlcGVuZHMgb24gaWYgb2ZmbGluZSByZXByb2Nlc3MgaXMgbmVlZGVkLCByZWNlaXZlZCBmcmFtZSB3aWxsCisgKiAgICAgICAgICAgICAgYmUgc2VudCB0byBlaXRoZXIgaW5wdXQgcXVldWUgb2YgcG9zdHByb2Nlc3Mgb3IganBlZyBlbmNvZGluZworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQb3N0UHJvY2Vzc29yOjpwcm9jZXNzRGF0YShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lKQoreworICAgIGlmIChtX2JJbml0ZWQgPT0gRkFMU0UpIHsKKyAgICAgICAgTE9HRSgicG9zdHByb2Mgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoZnJhbWUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHBhcmFtZXRlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICptZXRhX2ZyYW1lID0gTlVMTDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZnJhbWUtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgLy8gbG9vayB0aHJvdWdoIGlucHV0IHN1cGVyYnVmCisgICAgICAgIGlmIChmcmFtZS0+YnVmc1tpXS0+c3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBKSB7CisgICAgICAgICAgICBtZXRhX2ZyYW1lID0gZnJhbWUtPmJ1ZnNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobWV0YV9mcmFtZSAhPSBOVUxMKSB7CisgICAgICAgIC8vRnVuY3Rpb24gdG8gdXBhZHRlIG1ldGFkYXRhIGZvciBmcmFtZSBiYXNlZCBwYXJhbWV0ZXIKKyAgICAgICAgbV9wYXJlbnQtPnVwZGF0ZU1ldGFkYXRhKChtZXRhZGF0YV9idWZmZXJfdCAqKW1ldGFfZnJhbWUtPmJ1ZmZlcik7CisgICAgfQorCisgICAgaWYgKG1fcGFyZW50LT5uZWVkUmVwcm9jZXNzKCkpIHsKKyAgICAgICAgaWYgKCghbV9wYXJlbnQtPmlzTG9uZ3Nob3RFbmFibGVkKCkgJiYKKyAgICAgICAgICAgICAhbV9wYXJlbnQtPm1fc3RhdGVNYWNoaW5lLmlzTm9uWlNMQ2FwdHVyZVJ1bm5pbmcoKSkgfHwKKyAgICAgICAgICAgIChtX3BhcmVudC0+aXNMb25nc2hvdEVuYWJsZWQoKSAmJgorICAgICAgICAgICAgIG1fcGFyZW50LT5pc0NhcHR1cmVTaHV0dGVyRW5hYmxlZCgpKSkgeworICAgICAgICAgICAgLy9wbGF5IHNodXR0ZXIgc291bmQKKyAgICAgICAgICAgIG1fcGFyZW50LT5wbGF5U2h1dHRlcigpOworICAgICAgICB9CisKKyAgICAgICAgQVRSQUNFX0lOVCgiQ2FtZXJhOlJlcHJvY2VzcyIsIDEpOworICAgICAgICBMT0dIKCJuZWVkIHJlcHJvY2VzcyIpOworCisgICAgICAgIC8vIGVucXVldSB0byBwb3N0IHByb2MgaW5wdXQgcXVldWUKKyAgICAgICAgcWNhbWVyYV9wcF9kYXRhX3QgKnBwX3JlcXVlc3Rfam9iID0KKyAgICAgICAgICAgICAgICAocWNhbWVyYV9wcF9kYXRhX3QgKiltYWxsb2Moc2l6ZW9mKHFjYW1lcmFfcHBfZGF0YV90KSk7CisgICAgICAgIGlmIChwcF9yZXF1ZXN0X2pvYiA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIHBwcm9jIGpvYiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQocHBfcmVxdWVzdF9qb2IsIDAsIHNpemVvZihxY2FtZXJhX3BwX2RhdGFfdCkpOworICAgICAgICBwcF9yZXF1ZXN0X2pvYi0+c3JjX2ZyYW1lID0gZnJhbWU7CisgICAgICAgIHBwX3JlcXVlc3Rfam9iLT5zcmNfcmVwcm9jX2ZyYW1lID0gZnJhbWU7CisgICAgICAgIHBwX3JlcXVlc3Rfam9iLT5yZXByb2NDb3VudCA9IDA7CisgICAgICAgIHBwX3JlcXVlc3Rfam9iLT5wcENoYW5uZWxJbmRleCA9IDA7CisKKyAgICAgICAgaWYgKChOVUxMICE9IGZyYW1lKSAmJgorICAgICAgICAgICAgICAgICgwIDwgZnJhbWUtPm51bV9idWZzKQorICAgICAgICAgICAgICAgICYmIChtX3BhcmVudC0+aXNSZWd1bGFyQ2FwdHVyZSgpKSkgeworICAgICAgICAgICAgLypSZWd1bGFyIGNhcHR1cmUuIFNvdXJjZSBzdHJlYW0gd2lsbCBiZSBkZWxldGVkKi8KKyAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmJ1ZnMgPSBOVUxMOworICAgICAgICAgICAgdWludDMyX3QgbnVtX2J1ZnMgPSBmcmFtZS0+bnVtX2J1ZnM7CisgICAgICAgICAgICBidWZzID0gbmV3IG1tX2NhbWVyYV9idWZfZGVmX3RbbnVtX2J1ZnNdOworICAgICAgICAgICAgaWYgKE5VTEwgPT0gYnVmcykgeworICAgICAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBjYWNoZWQgYnVmZmVycyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1fYnVmczsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnVmc1tpXSA9ICpmcmFtZS0+YnVmc1tpXTsKKyAgICAgICAgICAgICAgICBmcmFtZS0+YnVmc1tpXSA9ICZidWZzW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHBfcmVxdWVzdF9qb2ItPnNyY19yZXByb2NfYnVmcyA9IGJ1ZnM7CisKKyAgICAgICAgICAgIC8vIERvbid0IHJlbGVhc2Ugc291cmNlIGZyYW1lIGFmdGVyIGVuY29kaW5nCisgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHRoZSBzb3VyY2UgY2hhbm5lbCB3aWxsIG5vdCBleGlzdC4KKyAgICAgICAgICAgIHBwX3JlcXVlc3Rfam9iLT5yZXByb2NfZnJhbWVfcmVsZWFzZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobU9mZmxpbmVEYXRhQnVmcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBwcF9yZXF1ZXN0X2pvYi0+b2ZmbGluZV9yZXByb2NfYnVmID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0T2ZmbGluZVBQSW5wdXRCdWZmZXIoZnJhbWUpOworICAgICAgICAgICAgaWYgKHBwX3JlcXVlc3Rfam9iLT5vZmZsaW5lX3JlcHJvY19idWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHBwX3JlcXVlc3Rfam9iLT5vZmZsaW5lX2J1ZmZlciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmFsc2UgPT0gbV9pbnB1dFBQUS5lbnF1ZXVlKCh2b2lkICopcHBfcmVxdWVzdF9qb2IpKSB7CisgICAgICAgICAgICBMT0dXKCJJbnB1dCBQUCBRIGlzIG5vdCBhY3RpdmUhISEiKTsKKyAgICAgICAgICAgIHJlbGVhc2VTdXBlckJ1ZihmcmFtZSk7CisgICAgICAgICAgICBmcmVlKGZyYW1lKTsKKyAgICAgICAgICAgIGZyZWUocHBfcmVxdWVzdF9qb2IpOworICAgICAgICAgICAgZnJhbWUgPSBOVUxMOworICAgICAgICAgICAgcHBfcmVxdWVzdF9qb2IgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmIChtX3BhcmVudC0+bVBhcmFtZXRlcnMuaXNBZHZDYW1GZWF0dXJlc0VuYWJsZWQoKQorICAgICAgICAgICAgICAgICYmIChtZXRhX2ZyYW1lICE9IE5VTEwpKSB7CisgICAgICAgICAgICBtX0lucHV0TWV0YWRhdGEuYWRkKG1ldGFfZnJhbWUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtX3BhcmVudC0+bVBhcmFtZXRlcnMuaXNOVjE2UGljdHVyZUZvcm1hdCgpIHx8CisgICAgICAgIG1fcGFyZW50LT5tUGFyYW1ldGVycy5pc05WMjFQaWN0dXJlRm9ybWF0KCkpIHsKKyAgICAgICAgLy9jaGVjayBpZiByYXcgZnJhbWUgaW5mb3JtYXRpb24gaXMgbmVlZGVkLgorICAgICAgICBpZihtX3BhcmVudC0+bVBhcmFtZXRlcnMuaXNZVVZGcmFtZUluZm9OZWVkZWQoKSkKKyAgICAgICAgICAgIHNldFlVVkZyYW1lSW5mbyhmcmFtZSk7CisKKyAgICAgICAgcHJvY2Vzc1Jhd0RhdGEoZnJhbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vcGxheSBzaHV0dGVyIHNvdW5kCisgICAgICAgIGlmKCFtX3BhcmVudC0+bV9zdGF0ZU1hY2hpbmUuaXNOb25aU0xDYXB0dXJlUnVubmluZygpICYmCisgICAgICAgICAgICFtX3BhcmVudC0+bUxvbmdzaG90RW5hYmxlZCkKKyAgICAgICAgICAgbV9wYXJlbnQtPnBsYXlTaHV0dGVyKCk7CisKKyAgICAgICAgTE9HSCgibm8gbmVlZCBvZmZsaW5lIHJlcHJvY2Vzcywgc2VuZGluZyB0byBqcGVnIGVuY29kaW5nIik7CisgICAgICAgIHFjYW1lcmFfanBlZ19kYXRhX3QgKmpwZWdfam9iID0KKyAgICAgICAgICAgIChxY2FtZXJhX2pwZWdfZGF0YV90ICopbWFsbG9jKHNpemVvZihxY2FtZXJhX2pwZWdfZGF0YV90KSk7CisgICAgICAgIGlmIChqcGVnX2pvYiA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIGpwZWcgam9iIik7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KGpwZWdfam9iLCAwLCBzaXplb2YocWNhbWVyYV9qcGVnX2RhdGFfdCkpOworICAgICAgICBqcGVnX2pvYi0+c3JjX2ZyYW1lID0gZnJhbWU7CisKKyAgICAgICAgaWYgKG1ldGFfZnJhbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gZmlsbCBpbiBtZXRhIGRhdGEgZnJhbWUgcHRyCisgICAgICAgICAgICBqcGVnX2pvYi0+bWV0YWRhdGEgPSAobWV0YWRhdGFfYnVmZmVyX3QgKiltZXRhX2ZyYW1lLT5idWZmZXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBlbnF1ZXUgdG8ganBlZyBpbnB1dCBxdWV1ZQorICAgICAgICBpZiAoIW1faW5wdXRKcGVnUS5lbnF1ZXVlKCh2b2lkICopanBlZ19qb2IpKSB7CisgICAgICAgICAgICBMT0dXKCJJbnB1dCBKcGVnIFEgaXMgbm90IGFjdGl2ZSEhISIpOworICAgICAgICAgICAgcmVsZWFzZUpwZWdKb2JEYXRhKGpwZWdfam9iKTsKKyAgICAgICAgICAgIGZyZWUoanBlZ19qb2IpOworICAgICAgICAgICAganBlZ19qb2IgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgbV9kYXRhUHJvY1RoLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX0RPX05FWFRfSk9CLCBGQUxTRSwgRkFMU0UpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jZXNzUmF3RGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBlbnF1ZXVlIHJhdyBkYXRhIGludG8gZGF0YVByb2MgdGhyZWFkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmcmFtZSAgIDogcHJvY2VzcyBmcmFtZSByZWNlaXZlZCBmcm9tIG1tLWNhbWVyYS1pbnRlcmZhY2UKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQb3N0UHJvY2Vzc29yOjpwcm9jZXNzUmF3RGF0YShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lKQoreworICAgIGlmIChtX2JJbml0ZWQgPT0gRkFMU0UpIHsKKyAgICAgICAgTE9HRSgicG9zdHByb2Mgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBlbnF1ZXUgdG8gcmF3IGlucHV0IHF1ZXVlCisgICAgaWYgKG1faW5wdXRSYXdRLmVucXVldWUoKHZvaWQgKilmcmFtZSkpIHsKKyAgICAgICAgbV9kYXRhUHJvY1RoLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX0RPX05FWFRfSk9CLCBGQUxTRSwgRkFMU0UpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coIm1faW5wdXRSYXdRIGlzIG5vdCBhY3RpdmUhISEiKTsKKyAgICAgICAgcmVsZWFzZVN1cGVyQnVmKGZyYW1lKTsKKyAgICAgICAgZnJlZShmcmFtZSk7CisgICAgICAgIGZyYW1lID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2Nlc3NKcGVnRXZ0CisgKgorICogREVTQ1JJUFRJT046IHByb2Nlc3MganBlZyBldmVudCBmcm9tIG1tLWpwZWctaW50ZXJmYWNlLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZXZ0ICAgICA6IHBheWxvYWQgb2YganBlZyBldmVudCwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IGpwZWcgZW5jb2RpbmcKKyAqICAgICAgICAgICAgICBzdGF0dXMsIGpwZWcgc2l6ZSBhbmQgc28gb24uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqCisgKiBOT1RFICAgICAgIDogVGhpcyBldmVudCB3aWxsIGFsc28gdHJpZ2dlciBEYXRhUHJvYyB0aHJlYWQgdG8gbW92ZSB0byBuZXh0IGpvYgorICogICAgICAgICAgICAgIHByb2Nlc3NpbmcgKGkuZS4sIHNlbmQgYSBuZXcganBlZyBlbmNvZGluZyBqb2IgdG8gbW0tanBlZy1pbnRlcmZhY2UKKyAqICAgICAgICAgICAgICBpZiB0aGVyZSBpcyBhbnkgcGVuZGluZyBqb2IgaW4ganBlZyBpbnB1dCBxdWV1ZSkKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUG9zdFByb2Nlc3Nvcjo6cHJvY2Vzc0pwZWdFdnQocWNhbWVyYV9qcGVnX2V2dF9wYXlsb2FkX3QgKmV2dCkKK3sKKyAgICBpZiAobV9iSW5pdGVkID09IEZBTFNFKSB7CisgICAgICAgIExPR0UoInBvc3Rwcm9jIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGNhbWVyYV9tZW1vcnlfdCAqanBlZ19tZW0gPSBOVUxMOworICAgIG9teF9qcGVnX291cHV0X2J1Zl90ICpqcGVnX291dCA9IE5VTEw7CisgICAgdm9pZCAqanBlZ0RhdGEgPSBOVUxMOworICAgIGlmIChtVXNlU2F2ZVByb2MgJiYgbV9wYXJlbnQtPmlzTG9uZ3Nob3RFbmFibGVkKCkpIHsKKyAgICAgICAgcWNhbWVyYV9qcGVnX2V2dF9wYXlsb2FkX3QgKnNhdmVEYXRhID0gKCBxY2FtZXJhX2pwZWdfZXZ0X3BheWxvYWRfdCAqICkgbWFsbG9jKHNpemVvZihxY2FtZXJhX2pwZWdfZXZ0X3BheWxvYWRfdCkpOworICAgICAgICBpZiAoIE5VTEwgPT0gc2F2ZURhdGEgKSB7CisgICAgICAgICAgICBMT0dFKCJDYW4gbm90IGFsbG9jYXRlIHNhdmUgZGF0YSBtZXNzYWdlISIpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICAqc2F2ZURhdGEgPSAqZXZ0OworICAgICAgICBpZiAobV9pbnB1dFNhdmVRLmVucXVldWUoKHZvaWQgKikgc2F2ZURhdGEpKSB7CisgICAgICAgICAgICBtX3NhdmVQcm9jVGguc2VuZENtZChDQU1FUkFfQ01EX1RZUEVfRE9fTkVYVF9KT0IsIEZBTFNFLCBGQUxTRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dEKCJtX2lucHV0U2F2ZVEgUFAgUSBpcyBub3QgYWN0aXZlISEhIik7CisgICAgICAgICAgICBmcmVlKHNhdmVEYXRhKTsKKyAgICAgICAgICAgIHNhdmVEYXRhID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRvIGJlIHJlbW92ZWQgbGF0ZXIgd2hlbiBJU1AgRnJhbWUgc3luYyBmZWF0dXJlIGlzIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIHFjYW1lcmFfanBlZ19kYXRhX3QgKmpwZWdfam9iID0KKyAgICAgICAgICAgICAgICAgICAgKHFjYW1lcmFfanBlZ19kYXRhX3QgKiltX29uZ29pbmdKcGVnUS5kZXF1ZXVlKG1hdGNoSm9iSWQsCisgICAgICAgICAgICAgICAgICAgICh2b2lkKikmZXZ0LT5qb2JJZCk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX2lkeCA9IGpwZWdfam9iLT5zcmNfZnJhbWUtPmJ1ZnNbMF0tPmZyYW1lX2lkeDsqLworICAgICAgICB1aW50MzJfdCBmcmFtZV9pZHggPSA3NTsKKyAgICAgICAgTE9HSCgiRlJBTUUgSU5ERVggJWQiLCBmcmFtZV9pZHgpOworICAgICAgICAvLyBSZWxlYXNlIGpwZWcgam9iIGRhdGEKKyAgICAgICAgbV9vbmdvaW5nSnBlZ1EuZmx1c2hOb2RlcyhtYXRjaEpvYklkLCAodm9pZCopJmV2dC0+am9iSWQpOworCisgICAgICAgIGlmIChtX2lucHV0UFBRLmdldEN1cnJlbnRTaXplKCkgPiAwKSB7CisgICAgICAgICAgICBtX2RhdGFQcm9jVGguc2VuZENtZChDQU1FUkFfQ01EX1RZUEVfRE9fTkVYVF9KT0IsIEZBTFNFLCBGQUxTRSk7CisgICAgICAgIH0KKyAgICAgICAgTE9HSCgiW0tQSSBQZXJmXSA6IGpwZWcgam9iICVkIiwgZXZ0LT5qb2JJZCk7CisKKyAgICAgICAgaWYgKChmYWxzZSA9PSBtX3BhcmVudC0+bV9iSW50SnBlZ0V2dFBlbmRpbmcpICYmCisgICAgICAgICAgICAgKG1fcGFyZW50LT5tRGF0YUNiID09IE5VTEwgfHwKKyAgICAgICAgICAgICAgbV9wYXJlbnQtPm1zZ1R5cGVFbmFibGVkV2l0aExvY2soQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFKSA9PSAwICkpIHsKKyAgICAgICAgICAgIExPR1coIk5vIGRhdGFDQiBvciBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0Ugbm90IGVuYWJsZWQiKTsKKyAgICAgICAgICAgIHJjID0gTk9fRVJST1I7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGV2dC0+c3RhdHVzID09IEpQRUdfSk9CX1NUQVRVU19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiRXJyb3IgZXZlbnQgaGFuZGxlZCBmcm9tIGpwZWcsIHN0YXR1cyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICBldnQtPnN0YXR1cyk7CisgICAgICAgICAgICByYyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIGlmICghbUpwZWdNZW1PcHQpIHsKKyAgICAgICAgICAgIGpwZWdEYXRhID0gZXZ0LT5vdXRfZGF0YS5idWZfdmFkZHI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBqcGVnX291dCAgPSAob214X2pwZWdfb3VwdXRfYnVmX3QqKSBldnQtPm91dF9kYXRhLmJ1Zl92YWRkcjsKKyAgICAgICAgICAgIGlmIChqcGVnX291dCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAganBlZ19tZW0gPSAoY2FtZXJhX21lbW9yeV90ICopanBlZ19vdXQtPm1lbV9oZGw7CisgICAgICAgICAgICAgICAgaWYgKGpwZWdfbWVtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAganBlZ0RhdGEgPSBqcGVnX21lbS0+ZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9wYXJlbnQtPmR1bXBKcGVnVG9GaWxlKGpwZWdEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dC0+b3V0X2RhdGEuYnVmX2ZpbGxlZF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5qb2JJZCk7CisgICAgICAgIExPR0goIkR1bXAganBlZ19zaXplPSVkIiwgZXZ0LT5vdXRfZGF0YS5idWZfZmlsbGVkX2xlbik7CisgICAgICAgIGlmKHRydWUgPT0gbV9wYXJlbnQtPm1fYkludEpwZWdFdnRQZW5kaW5nKSB7CisgICAgICAgICAgICAgIC8vU2VuZGluZyBKUEVHIHNuYXBzaG90IHRha2VuIG5vdGlmaWNhdGlvbiB0byBIQUwKKyAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX3BhcmVudC0+bV9pbnRfbG9jayk7CisgICAgICAgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJm1fcGFyZW50LT5tX2ludF9jb25kKTsKKyAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fcGFyZW50LT5tX2ludF9sb2NrKTsKKyAgICAgICAgICAgICAgbV9kYXRhUHJvY1RoLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX0RPX05FWFRfSk9CLCBGQUxTRSwgRkFMU0UpOworICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtSnBlZ01lbU9wdCkgeworICAgICAgICAgICAgLy8gYWxsb2MganBlZyBtZW1vcnkgdG8gcGFzcyB0byB1cHBlciBsYXllcgorICAgICAgICAgICAganBlZ19tZW0gPSBtX3BhcmVudC0+bUdldE1lbW9yeSgtMSwgZXZ0LT5vdXRfZGF0YS5idWZfZmlsbGVkX2xlbiwKKyAgICAgICAgICAgICAgICAxLCBtX3BhcmVudC0+bUNhbGxiYWNrQ29va2llKTsKKyAgICAgICAgICAgIGlmIChOVUxMID09IGpwZWdfbWVtKSB7CisgICAgICAgICAgICAgICAgcmMgPSBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgTE9HRSgiZ2V0TWVtb3J5IGZvciBqcGVnLCByZXQgPSBOT19NRU1PUlkiKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShqcGVnX21lbS0+ZGF0YSwgZXZ0LT5vdXRfZGF0YS5idWZfdmFkZHIsIGV2dC0+b3V0X2RhdGEuYnVmX2ZpbGxlZF9sZW4pOworICAgICAgICB9CisgICAgICAgIExPR0goIkNhbGxpbmcgdXBwZXJsYXllciBjYWxsYmFjayB0byBzdG9yZSBKUEVHIGltYWdlIik7CisgICAgICAgIHFjYW1lcmFfcmVsZWFzZV9kYXRhX3QgcmVsZWFzZV9kYXRhOworICAgICAgICBtZW1zZXQoJnJlbGVhc2VfZGF0YSwgMCwgc2l6ZW9mKHFjYW1lcmFfcmVsZWFzZV9kYXRhX3QpKTsKKyAgICAgICAgcmVsZWFzZV9kYXRhLmRhdGEgPSBqcGVnX21lbTsKKyAgICAgICAgTE9HSSgiW0tQSSBQZXJmXTogUFJPRklMRV9KUEVHX0NCICIpOworICAgICAgICByYyA9IHNlbmREYXRhTm90aWZ5KENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSwKKyAgICAgICAgICAgICAgICBqcGVnX21lbSwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgJnJlbGVhc2VfZGF0YSwKKyAgICAgICAgICAgICAgICBmcmFtZV9pZHgpOworICAgICAgICBtX3BhcmVudC0+c2V0T3V0cHV0SW1hZ2VDb3VudChtX3BhcmVudC0+Z2V0T3V0cHV0SW1hZ2VDb3VudCgpICsgMSk7CisKK2VuZDoKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvLyBzZW5kIGVycm9yIG1zZyB0byB1cHBlciBsYXllcgorICAgICAgICAgICAgTE9HRSgiSnBlZyBFbmNvZGluZyBmYWlsZWQuIE5vdGlmeSBBcHBsaWNhdGlvbiIpOworICAgICAgICAgICAgc2VuZEV2dE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICBVTktOT1dOX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgICAgICAgICAgaWYgKE5VTEwgIT0ganBlZ19tZW0pIHsKKyAgICAgICAgICAgICAgICBqcGVnX21lbS0+cmVsZWFzZShqcGVnX21lbSk7CisgICAgICAgICAgICAgICAganBlZ19tZW0gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgd2hldGhlciB0byBzZW5kIGNhbGxiYWNrIGZvciBkZXB0aCBtYXAgKi8KKyAgICAgICAgaWYgKG1fcGFyZW50LT5tUGFyYW1ldGVycy5pc1ViaVJlZm9jdXMoKSAmJgorICAgICAgICAgICAgICAgIChtX3BhcmVudC0+Z2V0T3V0cHV0SW1hZ2VDb3VudCgpICsgMSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdldFJlZm9jdXNPdXRwdXRDb3VudCgpKSkgeworICAgICAgICAgICAgbV9wYXJlbnQtPnNldE91dHB1dEltYWdlQ291bnQobV9wYXJlbnQtPmdldE91dHB1dEltYWdlQ291bnQoKSArIDEpOworCisgICAgICAgICAgICBqcGVnX21lbSA9IG1fRGF0YU1lbTsKKyAgICAgICAgICAgIHJlbGVhc2VfZGF0YS5kYXRhID0ganBlZ19tZW07CisgICAgICAgICAgICBtX0RhdGFNZW0gPSBOVUxMOworICAgICAgICAgICAgTE9HSCgiW0tQSSBQZXJmXTogc2VuZCBqcGVnIGNhbGxiYWNrIGZvciBkZXB0aG1hcCAiKTsKKyAgICAgICAgICAgIHJjID0gc2VuZERhdGFOb3RpZnkoQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFLAorICAgICAgICAgICAgICAgICAgICBqcGVnX21lbSwKKyAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgJnJlbGVhc2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVfaWR4KTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIC8vIHNlbmQgZXJyb3IgbXNnIHRvIHVwcGVyIGxheWVyCisgICAgICAgICAgICAgICAgc2VuZEV2dE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgVU5LTk9XTl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGpwZWdfbWVtKSB7CisgICAgICAgICAgICAgICAgICAgIGpwZWdfbWVtLT5yZWxlYXNlKGpwZWdfbWVtKTsKKyAgICAgICAgICAgICAgICAgICAganBlZ19tZW0gPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fRGF0YU1lbSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB3YWl0IHVwIGRhdGEgcHJvYyB0aHJlYWQgdG8gZG8gbmV4dCBqb2IsCisgICAgLy8gaWYgcHJldmlvdXMgcmVxdWVzdCBpcyBibG9ja2VkIGR1ZSB0byBvbmdvaW5nIGpwZWcgam9iCisgICAgbV9kYXRhUHJvY1RoLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX0RPX05FWFRfSk9CLCBGQUxTRSwgRkFMU0UpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2Nlc3NQUERhdGEKKyAqCisgKiBERVNDUklQVElPTjogcHJvY2VzcyByZWNlaXZlZCBmcmFtZSBhZnRlciByZXByb2Nlc3MuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmcmFtZSAgIDogcmVjZWl2ZWQgZnJhbWUgZnJvbSByZXByb2Nlc3MgY2hhbm5lbC4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICoKKyAqIE5PVEUgICAgICAgOiBUaGUgZnJhbWUgYWZ0ZXIgcmVwcm9jZXNzIG5lZWQgdG8gc2VuZCB0byBqcGVnIGVuY29kaW5nLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQb3N0UHJvY2Vzc29yOjpwcm9jZXNzUFBEYXRhKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUpCit7CisgICAgYm9vbCB0cmlnZ2VyRXZlbnQgPSBUUlVFOworCisgICAgTE9HRCgiUUNhbWVyYVBvc3RQcm9jZXNzb3I6OnByb2Nlc3NQUERhdGEiKTsKKyAgICBib29sIG5lZWRTdXBlckJ1Zk1hdGNoID0gbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdlbmVyYXRlVGh1bWJGcm9tTWFpbigpOworICAgIGlmIChtX2JJbml0ZWQgPT0gRkFMU0UpIHsKKyAgICAgICAgTE9HRSgicG9zdHByb2Mgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBxY2FtZXJhX3BwX2RhdGFfdCAqam9iID0gKHFjYW1lcmFfcHBfZGF0YV90ICopbV9vbmdvaW5nUFBRLmRlcXVldWUoKTsKKyAgICBpZiAoTlVMTCA9PSBqb2IpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGZpbmQgcmVwcm9jZXNzIGpvYiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICghbmVlZFN1cGVyQnVmTWF0Y2ggJiYgKGpvYi0+c3JjX2ZyYW1lID09IE5VTEwKKyAgICAgICAgICAgIHx8IGpvYi0+c3JjX3JlcHJvY19mcmFtZSA9PSBOVUxMKSApIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCByZXByb2Nlc3Mgam9iIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKCFuZWVkU3VwZXJCdWZNYXRjaCAmJiAobV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmlzTlYxNlBpY3R1cmVGb3JtYXQoKSB8fAorICAgICAgICBtX3BhcmVudC0+bVBhcmFtZXRlcnMuaXNOVjIxUGljdHVyZUZvcm1hdCgpKSkgeworICAgICAgICByZWxlYXNlT25nb2luZ1BQRGF0YShqb2IsIHRoaXMpOworICAgICAgICBmcmVlKGpvYik7CisKKyAgICAgICAgaWYobV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmlzWVVWRnJhbWVJbmZvTmVlZGVkKCkpCisgICAgICAgICAgICBzZXRZVVZGcmFtZUluZm8oZnJhbWUpOworICAgICAgICByZXR1cm4gcHJvY2Vzc1Jhd0RhdGEoZnJhbWUpOworICAgIH0KKyNpZmRlZiBUQVJHRVRfVFNfTUFLRVVQCisgICAgLy8gZmluZCBzbmFwc2hvdCBmcmFtZSBmcmFtZQorICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKnBSZXByb2NGcmFtZSA9IE5VTEw7CisgICAgUUNhbWVyYVN0cmVhbSAqIHBTbmFwc2hvdFN0cmVhbSA9IE5VTEw7CisgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsID0gbV9wYXJlbnQtPmdldENoYW5uZWxCeUhhbmRsZShmcmFtZS0+Y2hfaWQpOworICAgIGlmIChwQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgIGZvciAoaW50OF90IGkgPSAwOyBpIDwgbVBQQ2hhbm5lbENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmICgobVBQQ2hhbm5lbHNbaV0gIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1QUENoYW5uZWxzW2ldLT5nZXRNeUhhbmRsZSgpID09IGZyYW1lLT5jaF9pZCkpIHsKKyAgICAgICAgICAgICAgICBwQ2hhbm5lbCA9IG1QUENoYW5uZWxzW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5vIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCAoY2hfaWQgPSAlZCkgZXhpc3QsIHJldHVybiBoZXJlIiwKKyAgICAgICAgICAgICAgICBmcmFtZS0+Y2hfaWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmcmFtZS0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICBwU25hcHNob3RTdHJlYW0gPSBwQ2hhbm5lbC0+Z2V0U3RyZWFtQnlIYW5kbGUoZnJhbWUtPmJ1ZnNbaV0tPnN0cmVhbV9pZCk7CisgICAgICAgIGlmIChwU25hcHNob3RTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHBTbmFwc2hvdFN0cmVhbS0+aXNPcmlnbmFsVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCkpIHsKKyAgICAgICAgICAgICAgICBwUmVwcm9jRnJhbWUgPSBmcmFtZS0+YnVmc1tpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocFJlcHJvY0ZyYW1lICE9IE5VTEwgJiYgbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmlzRmFjZURldGVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICBtX3BhcmVudC0+VHNNYWtldXBQcm9jZXNzX1NuYXBzaG90KHBSZXByb2NGcmFtZSxwU25hcHNob3RTdHJlYW0pOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0goInBSZXByb2NGcmFtZSA9PSBOVUxMIHx8IGlzRmFjZURldGVjdGlvbkVuYWJsZWQgPSAlZCIsCisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmlzRmFjZURldGVjdGlvbkVuYWJsZWQoKSk7CisgICAgfQorI2VuZGlmCisgICAgaWYgKChtX3BhcmVudC0+aXNMb25nc2hvdEVuYWJsZWQoKSkKKyAgICAgICAgICAgICYmICghbV9wYXJlbnQtPmlzQ2FwdHVyZVNodXR0ZXJFbmFibGVkKCkpCisgICAgICAgICAgICAmJiAoIW1fcGFyZW50LT5tQ0FDRG9uZVJlY2VpdmVkKSkgeworICAgICAgICAvLyBwbGF5IHNodXR0ZXIgc291bmQgZm9yIGxvbmdzaG90CisgICAgICAgIC8vIGFmdGVyIHJlcHJvY2VzcyBpcyBkb25lCisgICAgICAgIG1fcGFyZW50LT5wbGF5U2h1dHRlcigpOworICAgIH0KKyAgICBtX3BhcmVudC0+bUNBQ0RvbmVSZWNlaXZlZCA9IEZBTFNFOworCisgICAgaW50OF90IG1DdXJSZXByb2NDb3VudCA9IGpvYi0+cmVwcm9jQ291bnQ7CisgICAgaW50OF90IG1DdXJDaGFubmVsSW5kZXggPSBqb2ItPnBwQ2hhbm5lbEluZGV4OworICAgIGlmICggbUN1clJlcHJvY0NvdW50ID4gMSApIHsKKyAgICAgICAgLy9JbiBjYXNlIG9mIHBwIDJuZCBwYXNzLCB3ZSBjYW4gcmVsZWFzZSBpbnB1dCBvZiAybmQgcGFzcworICAgICAgICByZWxlYXNlU3VwZXJCdWYoam9iLT5zcmNfZnJhbWUpOworICAgICAgICBmcmVlKGpvYi0+c3JjX2ZyYW1lKTsKKyAgICAgICAgam9iLT5zcmNfZnJhbWUgPSBOVUxMOworICAgIH0KKworICAgIExPR0QoIm1DdXJSZXByb2NDb3VudCA9ICVkIG1DdXJDaGFubmVsSW5kZXggPSAlZCBtVG90YWxOdW1SZXByb2MgPSAlZCIsCisgICAgICAgICAgICAgbUN1clJlcHJvY0NvdW50LCBtQ3VyQ2hhbm5lbEluZGV4LAorICAgICAgICAgICAgbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdldFJlcHJvY0NvdW50KCkpOworICAgIGlmIChtQ3VyUmVwcm9jQ291bnQgPCBtX3BhcmVudC0+bVBhcmFtZXRlcnMuZ2V0UmVwcm9jQ291bnQoKSkgeworICAgICAgICAvL01vcmUgcHAgcGFzcyBuZWVkZWQuIFB1c2ggZnJhbWUgYmFjayB0byBwcCBxdWV1ZS4KKyAgICAgICAgcWNhbWVyYV9wcF9kYXRhX3QgKnBwX3JlcXVlc3Rfam9iID0gam9iOworICAgICAgICBwcF9yZXF1ZXN0X2pvYi0+c3JjX2ZyYW1lID0gZnJhbWU7CisKKyAgICAgICAgaWYgKChtUFBDaGFubmVsc1ttQ3VyQ2hhbm5lbEluZGV4XS0+Z2V0UmVwcm9jQ291bnQoKQorICAgICAgICAgICAgICAgID09IG1DdXJSZXByb2NDb3VudCkgJiYKKyAgICAgICAgICAgICAgICAobVBQQ2hhbm5lbHNbbUN1ckNoYW5uZWxJbmRleCArIDFdICE9IE5VTEwpKSB7CisgICAgICAgICAgICBwcF9yZXF1ZXN0X2pvYi0+cHBDaGFubmVsSW5kZXgrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGVucXVldSB0byBwb3N0IHByb2MgaW5wdXQgcXVldWUKKyAgICAgICAgaWYgKGZhbHNlID09IG1faW5wdXRQUFEuZW5xdWV1ZSgodm9pZCAqKXBwX3JlcXVlc3Rfam9iKSkgeworICAgICAgICAgICAgTE9HVygibV9pbnB1dCBQUCBRIGlzIG5vdCBhY3RpdmUhISEiKTsKKyAgICAgICAgICAgIHJlbGVhc2VPbmdvaW5nUFBEYXRhKHBwX3JlcXVlc3Rfam9iLHRoaXMpOworICAgICAgICAgICAgZnJlZShwcF9yZXF1ZXN0X2pvYik7CisgICAgICAgICAgICBwcF9yZXF1ZXN0X2pvYiA9IE5VTEw7CisgICAgICAgICAgICB0cmlnZ2VyRXZlbnQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vRG9uZSB3aXRoIHBvc3QgcHJvY2Vzc2luZy4gU2VuZCBmcmFtZSB0byBKcGVnCisgICAgICAgIHFjYW1lcmFfanBlZ19kYXRhX3QgKmpwZWdfam9iID0KKyAgICAgICAgICAgICAgICAocWNhbWVyYV9qcGVnX2RhdGFfdCAqKW1hbGxvYyhzaXplb2YocWNhbWVyYV9qcGVnX2RhdGFfdCkpOworICAgICAgICBpZiAoanBlZ19qb2IgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBqcGVnIGpvYiIpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldChqcGVnX2pvYiwgMCwgc2l6ZW9mKHFjYW1lcmFfanBlZ19kYXRhX3QpKTsKKyAgICAgICAganBlZ19qb2ItPnNyY19mcmFtZSA9IGZyYW1lOworICAgICAgICBqcGVnX2pvYi0+c3JjX3JlcHJvY19mcmFtZSA9IGpvYiA/IGpvYi0+c3JjX3JlcHJvY19mcmFtZSA6IE5VTEw7CisgICAgICAgIGpwZWdfam9iLT5zcmNfcmVwcm9jX2J1ZnMgPSBqb2IgPyBqb2ItPnNyY19yZXByb2NfYnVmcyA6IE5VTEw7CisgICAgICAgIGpwZWdfam9iLT5yZXByb2NfZnJhbWVfcmVsZWFzZSA9IGpvYiA/IGpvYi0+cmVwcm9jX2ZyYW1lX3JlbGVhc2UgOiBmYWxzZTsKKyAgICAgICAganBlZ19qb2ItPm9mZmxpbmVfcmVwcm9jX2J1ZiA9IGpvYiA/IGpvYi0+b2ZmbGluZV9yZXByb2NfYnVmIDogTlVMTDsKKyAgICAgICAganBlZ19qb2ItPm9mZmxpbmVfYnVmZmVyID0gam9iID8gam9iLT5vZmZsaW5lX2J1ZmZlciA6IGZhbHNlOworCisgICAgICAgIC8vIGZpbmQgbWV0YSBkYXRhIGZyYW1lCisgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1ldGFfZnJhbWUgPSBOVUxMOworICAgICAgICBpZiAobV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmlzQWR2Q2FtRmVhdHVyZXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIHNpemVfdCBtZXRhX2lkeCA9IG1fcGFyZW50LT5tUGFyYW1ldGVycy5nZXRFeGlmQnVmSW5kZXgobV9QUGluZGV4KTsKKyAgICAgICAgICAgIGlmIChtX0lucHV0TWV0YWRhdGEuc2l6ZSgpID49IChtZXRhX2lkeCArIDEpKSB7CisgICAgICAgICAgICAgICAgbWV0YV9mcmFtZSA9IG1fSW5wdXRNZXRhZGF0YS5pdGVtQXQobWV0YV9pZHgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJJbnB1dCBtZXRhZGF0YSB2ZWN0b3IgY29udGFpbnMgJWQgZW50cmllcywgaW5kZXggcmVxdWlyZWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fSW5wdXRNZXRhZGF0YS5zaXplKCksIG1ldGFfaWR4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fUFBpbmRleCsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgam9iICYmIGpvYi0+c3JjX3JlcHJvY19mcmFtZSAmJgorICAgICAgICAgICAgICAgICAgICAoaSA8IGpvYi0+c3JjX3JlcHJvY19mcmFtZS0+bnVtX2J1ZnMpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBsb29rIHRocm91Z2ggaW5wdXQgc3VwZXJidWYKKyAgICAgICAgICAgICAgICBpZiAoam9iLT5zcmNfcmVwcm9jX2ZyYW1lLT5idWZzW2ldLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YV9mcmFtZSA9IGpvYi0+c3JjX3JlcHJvY19mcmFtZS0+YnVmc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWV0YV9mcmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gbG9vayB0aHJvdWdoIHJlcHJvY2VzcyBzdXBlcmJ1ZgorICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmcmFtZS0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWUtPmJ1ZnNbaV0tPnN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0YV9mcmFtZSA9IGZyYW1lLT5idWZzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGFfZnJhbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gZmlsbCBpbiBtZXRhIGRhdGEgZnJhbWUgcHRyCisgICAgICAgICAgICBqcGVnX2pvYi0+bWV0YWRhdGEgPSAobWV0YWRhdGFfYnVmZmVyX3QgKiltZXRhX2ZyYW1lLT5idWZmZXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBlbnF1ZXUgcmVwcm9jZXNzZWQgZnJhbWUgdG8ganBlZyBpbnB1dCBxdWV1ZQorICAgICAgICBpZiAoZmFsc2UgPT0gbV9pbnB1dEpwZWdRLmVucXVldWUoKHZvaWQgKilqcGVnX2pvYikpIHsKKyAgICAgICAgICAgIExPR1coIklucHV0IEpwZWcgUSBpcyBub3QgYWN0aXZlISEhIik7CisgICAgICAgICAgICByZWxlYXNlSnBlZ0pvYkRhdGEoanBlZ19qb2IpOworICAgICAgICAgICAgZnJlZShqcGVnX2pvYik7CisgICAgICAgICAgICBqcGVnX2pvYiA9IE5VTEw7CisgICAgICAgICAgICB0cmlnZ2VyRXZlbnQgPSBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZyZWUgcHAgam9iIGJ1ZgorICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fcmVwcm9jZXNzX2xvY2spOworICAgICAgICBpZiAoam9iKSB7CisgICAgICAgICAgICBmcmVlKGpvYik7CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fcmVwcm9jZXNzX2xvY2spOworICAgIH0KKworICAgIExPR0QoIiIpOworICAgIC8vIHdhaXQgdXAgZGF0YSBwcm9jIHRocmVhZAorCisgICAgaWYgKHRyaWdnZXJFdmVudCkgeworICAgICAgICBtX2RhdGFQcm9jVGguc2VuZENtZChDQU1FUkFfQ01EX1RZUEVfRE9fTkVYVF9KT0IsIEZBTFNFLCBGQUxTRSk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGZpbmRKcGVnSm9iQnlKb2JJZAorICoKKyAqIERFU0NSSVBUSU9OOiBmaW5kIGEganBlZyBqb2IgZnJvbSBvbmdvaW5nIEpwZWcgcXVldWUgYnkgaXRzIGpvYiBJRAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAam9iSWQgICA6IGpvYiBJZCBvZiB0aGUgam9iCisgKgorICogUkVUVVJOICAgICA6IHB0ciB0byBhIGpwZWcgam9iIHN0cnVjdC4gTlVMTCBpZiBub3QgZm91bmQuCisgKgorICogTk9URSAgICAgICA6IEN1cnJlbnRseSBvbmx5IG9uZSBqb2IgaXMgc2VuZGluZyB0byBtbS1qcGVnLWludGVyZmFjZSBmb3IganBlZworICogICAgICAgICAgICAgIGVuY29kaW5nLiBUaGVyZWZvcmUgc2ltcGx5IGRlcXVldWUgZnJvbSB0aGUgb25nb2luZyBKcGVnIFF1ZXVlCisgKiAgICAgICAgICAgICAgd2lsbCBzZXJ2ZSB0aGUgcHVycG9zZSB0byBmaW5kIHRoZSBqcGVnIGpvYi4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworcWNhbWVyYV9qcGVnX2RhdGFfdCAqUUNhbWVyYVBvc3RQcm9jZXNzb3I6OmZpbmRKcGVnSm9iQnlKb2JJZCh1aW50MzJfdCBqb2JJZCkKK3sKKyAgICBxY2FtZXJhX2pwZWdfZGF0YV90ICogam9iID0gTlVMTDsKKyAgICBpZiAoam9iSWQgPT0gMCkgeworICAgICAgICBMT0dFKCJub3QgYSB2YWxpZCBqcGVnIGpvYklkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIGN1cnJlbHkgb25seSBvbmUganBlZyBqb2Igb25nb2luZywgc28gc2ltcGx5IGRlcXVldWUgdGhlIGhlYWQKKyAgICBqb2IgPSAocWNhbWVyYV9qcGVnX2RhdGFfdCAqKW1fb25nb2luZ0pwZWdRLmRlcXVldWUoKTsKKyAgICByZXR1cm4gam9iOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbGVhc2VQUElucHV0RGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBjYWxsYmFjayBmdW5jdGlvbiB0byByZWxlYXNlIHBvc3QgcHJvY2VzcyBpbnB1dCBkYXRhIG5vZGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRhdGEgICAgICA6IHB0ciB0byBwb3N0IHByb2Nlc3MgaW5wdXQgZGF0YQorICogICBAdXNlcl9kYXRhIDogdXNlciBkYXRhIHB0ciAoUUNhbWVyYVJlcHJvY2Vzc29yKQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYVBvc3RQcm9jZXNzb3I6OnJlbGVhc2VQUElucHV0RGF0YSh2b2lkICpkYXRhLCB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgUUNhbWVyYVBvc3RQcm9jZXNzb3IgKnBtZSA9IChRQ2FtZXJhUG9zdFByb2Nlc3NvciAqKXVzZXJfZGF0YTsKKyAgICBpZiAoTlVMTCAhPSBwbWUpIHsKKyAgICAgICAgcWNhbWVyYV9wcF9yZXF1ZXN0X3QgKnBwX2pvYiA9IChxY2FtZXJhX3BwX3JlcXVlc3RfdCAqKWRhdGE7CisgICAgICAgIGlmIChOVUxMICE9IHBwX2pvYi0+c3JjX2ZyYW1lKSB7CisgICAgICAgICAgICBwbWUtPnJlbGVhc2VTdXBlckJ1ZihwcF9qb2ItPnNyY19mcmFtZSk7CisgICAgICAgICAgICBpZiAocHBfam9iLT5zcmNfZnJhbWUgPT0gcHBfam9iLT5zcmNfcmVwcm9jX2ZyYW1lKQorICAgICAgICAgICAgICAgIHBwX2pvYi0+c3JjX3JlcHJvY19mcmFtZSA9IE5VTEw7CisgICAgICAgICAgICBmcmVlKHBwX2pvYi0+c3JjX2ZyYW1lKTsKKyAgICAgICAgICAgIHBwX2pvYi0+c3JjX2ZyYW1lID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoTlVMTCAhPSBwcF9qb2ItPnNyY19yZXByb2NfZnJhbWUpIHsKKyAgICAgICAgICAgIHBtZS0+cmVsZWFzZVN1cGVyQnVmKHBwX2pvYi0+c3JjX3JlcHJvY19mcmFtZSk7CisgICAgICAgICAgICBmcmVlKHBwX2pvYi0+c3JjX3JlcHJvY19mcmFtZSk7CisgICAgICAgICAgICBwcF9qb2ItPnNyY19yZXByb2NfZnJhbWUgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHBwX2pvYi0+cmVwcm9jQ291bnQgPSAwOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWxlYXNlSnBlZ0RhdGEKKyAqCisgKiBERVNDUklQVElPTjogY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVsZWFzZSBqcGVnIGpvYiBub2RlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkYXRhICAgICAgOiBwdHIgdG8gb25nb2luZyBqcGVnIGpvYiBkYXRhCisgKiAgIEB1c2VyX2RhdGEgOiB1c2VyIGRhdGEgcHRyIChRQ2FtZXJhUmVwcm9jZXNzb3IpCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhUG9zdFByb2Nlc3Nvcjo6cmVsZWFzZUpwZWdEYXRhKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBRQ2FtZXJhUG9zdFByb2Nlc3NvciAqcG1lID0gKFFDYW1lcmFQb3N0UHJvY2Vzc29yICopdXNlcl9kYXRhOworICAgIGlmIChOVUxMICE9IHBtZSkgeworICAgICAgICBwbWUtPnJlbGVhc2VKcGVnSm9iRGF0YSgocWNhbWVyYV9qcGVnX2RhdGFfdCAqKWRhdGEpOworICAgICAgICBMT0dIKCJSbGVhc2VkIGpvYiBJRCAldSIsCisgICAgICAgICAgICAoKHFjYW1lcmFfanBlZ19kYXRhX3QgKilkYXRhKS0+am9iSWQpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWxlYXNlT25nb2luZ1BQRGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBjYWxsYmFjayBmdW5jdGlvbiB0byByZWxlYXNlIG9uZ29pbmcgcG9zdHByb2Nlc3Mgam9iIG5vZGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRhdGEgICAgICA6IHB0ciB0byBvbmdpbmcgcG9zdHByb2Nlc3Mgam9iCisgKiAgIEB1c2VyX2RhdGEgOiB1c2VyIGRhdGEgcHRyIChRQ2FtZXJhUmVwcm9jZXNzb3IpCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhUG9zdFByb2Nlc3Nvcjo6cmVsZWFzZU9uZ29pbmdQUERhdGEodm9pZCAqZGF0YSwgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIFFDYW1lcmFQb3N0UHJvY2Vzc29yICpwbWUgPSAoUUNhbWVyYVBvc3RQcm9jZXNzb3IgKil1c2VyX2RhdGE7CisgICAgaWYgKE5VTEwgIT0gcG1lKSB7CisgICAgICAgIHFjYW1lcmFfcHBfZGF0YV90ICpwcF9qb2IgPSAocWNhbWVyYV9wcF9kYXRhX3QgKilkYXRhOworICAgICAgICBpZiAoTlVMTCAhPSBwcF9qb2ItPnNyY19mcmFtZSkgeworICAgICAgICAgICAgaWYgKCFwcF9qb2ItPnJlcHJvY19mcmFtZV9yZWxlYXNlKSB7CisgICAgICAgICAgICAgICAgcG1lLT5yZWxlYXNlU3VwZXJCdWYocHBfam9iLT5zcmNfZnJhbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBwX2pvYi0+c3JjX2ZyYW1lID09IHBwX2pvYi0+c3JjX3JlcHJvY19mcmFtZSkKKyAgICAgICAgICAgICAgICBwcF9qb2ItPnNyY19yZXByb2NfZnJhbWUgPSBOVUxMOworCisgICAgICAgICAgICBmcmVlKHBwX2pvYi0+c3JjX2ZyYW1lKTsKKyAgICAgICAgICAgIHBwX2pvYi0+c3JjX2ZyYW1lID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoTlVMTCAhPSBwcF9qb2ItPnNyY19yZXByb2NfZnJhbWUpIHsKKyAgICAgICAgICAgIHBtZS0+cmVsZWFzZVN1cGVyQnVmKHBwX2pvYi0+c3JjX3JlcHJvY19mcmFtZSk7CisgICAgICAgICAgICBmcmVlKHBwX2pvYi0+c3JjX3JlcHJvY19mcmFtZSk7CisgICAgICAgICAgICBwcF9qb2ItPnNyY19yZXByb2NfZnJhbWUgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICgocHBfam9iLT5vZmZsaW5lX3JlcHJvY19idWYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAmJiAocHBfam9iLT5vZmZsaW5lX2J1ZmZlcikpIHsKKyAgICAgICAgICAgIGZyZWUocHBfam9iLT5vZmZsaW5lX3JlcHJvY19idWYpOworICAgICAgICAgICAgcHBfam9iLT5vZmZsaW5lX2J1ZmZlciA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBwX2pvYi0+cmVwcm9jQ291bnQgPSAwOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWxlYXNlTm90aWZ5RGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byByZWxlYXNlIGludGVybmFsIHJlc291cmNlcyBpbiBub3RpZnkgZGF0YSBzdHJ1Y3QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHVzZXJfZGF0YSAgOiBwdHIgdXNlciBkYXRhCisgKiAgIEBjb29raWUgICAgIDogY2FsbGJhY2sgY29va2llCisgKiAgIEBjYl9zdGF0dXMgIDogY2FsbGJhY2sgc3RhdHVzCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqCisgKiBOT1RFICAgICAgIDogZGVhbGxvY2F0ZSBqcGVnIGhlYXAgbWVtb3J5IGlmIGl0J3Mgbm90IE5VTEwKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhUG9zdFByb2Nlc3Nvcjo6cmVsZWFzZU5vdGlmeURhdGEodm9pZCAqdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjYl9zdGF0dXMpCit7CisgICAgTE9HRCgicmVsZWFzZU5vdGlmeURhdGEgcmVsZWFzZV9kYXRhICVwIiwgdXNlcl9kYXRhKTsKKworICAgIHFjYW1lcmFfZGF0YV9hcmdtX3QgKmFwcF9jYiA9ICggcWNhbWVyYV9kYXRhX2FyZ21fdCAqICkgdXNlcl9kYXRhOworICAgIFFDYW1lcmFQb3N0UHJvY2Vzc29yICpwb3N0UHJvYyA9ICggUUNhbWVyYVBvc3RQcm9jZXNzb3IgKiApIGNvb2tpZTsKKyAgICBpZiAoICggTlVMTCAhPSBhcHBfY2IgKSAmJiAoIE5VTEwgIT0gcG9zdFByb2MgKSApIHsKKworICAgICAgICBpZiAoIHBvc3RQcm9jLT5tVXNlU2F2ZVByb2MgJiYKKyAgICAgICAgICAgICBhcHBfY2ItPnJlbGVhc2VfZGF0YS51bmxpbmtGaWxlICYmCisgICAgICAgICAgICAgKCBOT19FUlJPUiAhPSBjYl9zdGF0dXMgKSApIHsKKworICAgICAgICAgICAgU3RyaW5nOCB1bmxpbmtQYXRoKChjb25zdCBjaGFyICopIGFwcF9jYi0+cmVsZWFzZV9kYXRhLmRhdGEtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcF9jYi0+cmVsZWFzZV9kYXRhLmRhdGEtPnNpemUpOworICAgICAgICAgICAgaW50IHJjID0gdW5saW5rKHVubGlua1BhdGguc3RyaW5nKCkpOworICAgICAgICAgICAgTE9HSCgiVW5saW5raW5nIHN0b3JlZCBmaWxlIHJjID0gJWQiLAorICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFwcF9jYiAmJiBOVUxMICE9IGFwcF9jYi0+cmVsZWFzZV9kYXRhLmRhdGEpIHsKKyAgICAgICAgICAgIGFwcF9jYi0+cmVsZWFzZV9kYXRhLmRhdGEtPnJlbGVhc2UoYXBwX2NiLT5yZWxlYXNlX2RhdGEuZGF0YSk7CisgICAgICAgICAgICBhcHBfY2ItPnJlbGVhc2VfZGF0YS5kYXRhID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXBwX2NiICYmIE5VTEwgIT0gYXBwX2NiLT5yZWxlYXNlX2RhdGEuZnJhbWUpIHsKKyAgICAgICAgICAgIHBvc3RQcm9jLT5yZWxlYXNlU3VwZXJCdWYoYXBwX2NiLT5yZWxlYXNlX2RhdGEuZnJhbWUpOworICAgICAgICAgICAgZnJlZShhcHBfY2ItPnJlbGVhc2VfZGF0YS5mcmFtZSk7CisgICAgICAgICAgICBhcHBfY2ItPnJlbGVhc2VfZGF0YS5mcmFtZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcF9jYiAmJiBOVUxMICE9IGFwcF9jYi0+cmVsZWFzZV9kYXRhLnN0cmVhbUJ1ZnMpIHsKKyAgICAgICAgICAgIGFwcF9jYi0+cmVsZWFzZV9kYXRhLnN0cmVhbUJ1ZnMtPmRlYWxsb2NhdGUoKTsKKyAgICAgICAgICAgIGRlbGV0ZSBhcHBfY2ItPnJlbGVhc2VfZGF0YS5zdHJlYW1CdWZzOworICAgICAgICAgICAgYXBwX2NiLT5yZWxlYXNlX2RhdGEuc3RyZWFtQnVmcyA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShhcHBfY2IpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWxlYXNlU3VwZXJCdWYKKyAqCisgKiBERVNDUklQVElPTjogZnVuY3Rpb24gdG8gcmVsZWFzZSBhIHN1cGVyYnVmIGZyYW1lIGJ5IHJldHVybmluZyBiYWNrIHRvIGtlcm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogQHN1cGVyX2J1ZiA6IHB0ciB0byB0aGUgc3VwZXJidWYgZnJhbWUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFQb3N0UHJvY2Vzc29yOjpyZWxlYXNlU3VwZXJCdWYobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9idWYpCit7CisgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsID0gTlVMTDsKKworICAgIGlmIChOVUxMICE9IHN1cGVyX2J1ZikgeworICAgICAgICBwQ2hhbm5lbCA9IG1fcGFyZW50LT5nZXRDaGFubmVsQnlIYW5kbGUoc3VwZXJfYnVmLT5jaF9pZCk7CisKKyAgICAgICAgaWYgKCBOVUxMID09IHBDaGFubmVsICkgeworICAgICAgICAgICAgZm9yIChpbnQ4X3QgaSA9IDA7IGkgPCBtUFBDaGFubmVsQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgobVBQQ2hhbm5lbHNbaV0gIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChtUFBDaGFubmVsc1tpXS0+Z2V0TXlIYW5kbGUoKSA9PSBzdXBlcl9idWYtPmNoX2lkKSkgeworICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbCA9IG1QUENoYW5uZWxzW2ldOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocENoYW5uZWwgIT0gTlVMTCkgeworICAgICAgICAgICAgcENoYW5uZWwtPmJ1ZkRvbmUoc3VwZXJfYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIkNoYW5uZWwgaWQgJWQgbm90IGZvdW5kISEiLAorICAgICAgICAgICAgICAgICAgc3VwZXJfYnVmLT5jaF9pZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICA6IHJlbGVhc2VTdXBlckJ1ZgorICoKKyAqIERFU0NSSVBUSU9OIDogZnVuY3Rpb24gdG8gcmVsZWFzZSBhIHN1cGVyYnVmIGZyYW1lIGJ5IHJldHVybmluZyBiYWNrIHRvIGtlcm5lbAorICoKKyAqIFBBUkFNRVRFUlMgIDoKKyAqIEBzdXBlcl9idWYgIDogcHRyIHRvIHRoZSBzdXBlcmJ1ZiBmcmFtZQorICogQHN0cmVhbV90eXBlOiBUeXBlIG9mIHN0cmVhbSB0byBiZSByZWxlYXNlZAorICoKKyAqIFJFVFVSTiAgICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFQb3N0UHJvY2Vzc29yOjpyZWxlYXNlU3VwZXJCdWYobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9idWYsCisgICAgICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlKQoreworICAgIFFDYW1lcmFDaGFubmVsICpwQ2hhbm5lbCA9IE5VTEw7CisKKyAgICBpZiAoTlVMTCAhPSBzdXBlcl9idWYpIHsKKyAgICAgICAgcENoYW5uZWwgPSBtX3BhcmVudC0+Z2V0Q2hhbm5lbEJ5SGFuZGxlKHN1cGVyX2J1Zi0+Y2hfaWQpOworICAgICAgICBpZiAocENoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgZm9yIChpbnQ4X3QgaSA9IDA7IGkgPCBtUFBDaGFubmVsQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgobVBQQ2hhbm5lbHNbaV0gIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChtUFBDaGFubmVsc1tpXS0+Z2V0TXlIYW5kbGUoKSA9PSBzdXBlcl9idWYtPmNoX2lkKSkgeworICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbCA9IG1QUENoYW5uZWxzW2ldOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocENoYW5uZWwgIT0gTlVMTCkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHN1cGVyX2J1Zi0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzdXBlcl9idWYtPmJ1ZnNbaV0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbC0+Z2V0U3RyZWFtQnlIYW5kbGUoc3VwZXJfYnVmLT5idWZzW2ldLT5zdHJlYW1faWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHBTdHJlYW0gIT0gTlVMTCkgJiYgKChwU3RyZWFtLT5nZXRNeVR5cGUoKSA9PSBzdHJlYW1fdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocFN0cmVhbS0+Z2V0TXlPcmlnaW5hbFR5cGUoKSA9PSBzdHJlYW1fdHlwZSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwQ2hhbm5lbC0+YnVmRG9uZShzdXBlcl9idWYsIHN1cGVyX2J1Zi0+YnVmc1tpXS0+c3RyZWFtX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiQ2hhbm5lbCBpZCAlZCBub3QgZm91bmQhISIsCisgICAgICAgICAgICAgICAgICAgc3VwZXJfYnVmLT5jaF9pZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVsZWFzZUpwZWdKb2JEYXRhCisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIHJlbGVhc2UgaW50ZXJuYWwgcmVzb3VyY2VzIGluIGpwZWcgam9iIHN0cnVjdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAam9iICAgICA6IHB0ciB0byBqcGVnIGpvYiBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICoKKyAqIE5PVEUgICAgICAgOiBvcmlnaW5hbCBzb3VyY2UgZnJhbWUgbmVlZCB0byBiZSBxdWV1ZWQgYmFjayB0byBrZXJuZWwgZm9yCisgKiAgICAgICAgICAgICAgZnV0dXJlIHVzZS4gT3V0cHV0IGJ1ZiBvZiBqcGVnIGpvYiBuZWVkIHRvIGJlIHJlbGVhc2VkIHNpbmNlCisgKiAgICAgICAgICAgICAgaXQncyBhbGxvY2F0ZWQgZm9yIGVhY2ggam9iLiBFeGlmIG9iamVjdCBuZWVkIHRvIGJlIGRlbGV0ZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYVBvc3RQcm9jZXNzb3I6OnJlbGVhc2VKcGVnSm9iRGF0YShxY2FtZXJhX2pwZWdfZGF0YV90ICpqb2IpCit7CisgICAgTE9HRCgiRSIpOworICAgIGlmIChOVUxMICE9IGpvYikgeworICAgICAgICBpZiAoTlVMTCAhPSBqb2ItPnNyY19yZXByb2NfZnJhbWUpIHsKKyAgICAgICAgICAgIGlmICgham9iLT5yZXByb2NfZnJhbWVfcmVsZWFzZSkgeworICAgICAgICAgICAgICAgIHJlbGVhc2VTdXBlckJ1Zihqb2ItPnNyY19yZXByb2NfZnJhbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShqb2ItPnNyY19yZXByb2NfZnJhbWUpOworICAgICAgICAgICAgam9iLT5zcmNfcmVwcm9jX2ZyYW1lID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChOVUxMICE9IGpvYi0+c3JjX2ZyYW1lKSB7CisgICAgICAgICAgICByZWxlYXNlU3VwZXJCdWYoam9iLT5zcmNfZnJhbWUpOworICAgICAgICAgICAgZnJlZShqb2ItPnNyY19mcmFtZSk7CisgICAgICAgICAgICBqb2ItPnNyY19mcmFtZSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTlVMTCAhPSBqb2ItPnBKcGVnRXhpZk9iaikgeworICAgICAgICAgICAgZGVsZXRlIGpvYi0+cEpwZWdFeGlmT2JqOworICAgICAgICAgICAgam9iLT5wSnBlZ0V4aWZPYmogPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE5VTEwgIT0gam9iLT5zcmNfcmVwcm9jX2J1ZnMpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBqb2ItPnNyY19yZXByb2NfYnVmczsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoam9iLT5vZmZsaW5lX3JlcHJvY19idWYgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAmJiAoam9iLT5vZmZsaW5lX2J1ZmZlcikpIHsKKyAgICAgICAgICAgIGZyZWUoam9iLT5vZmZsaW5lX3JlcHJvY19idWYpOworICAgICAgICAgICAgam9iLT5vZmZsaW5lX2J1ZmZlciA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIExPR0QoIlgiKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWxlYXNlU2F2ZUpvYkRhdGEKKyAqCisgKiBERVNDUklQVElPTjogZnVuY3Rpb24gdG8gcmVsZWFzZSBpbnRlcm5hbCByZXNvdXJjZXMgaW4gc3RvcmUgam9icworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAam9iICAgICA6IHB0ciB0byBzYXZlIGpvYiBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhUG9zdFByb2Nlc3Nvcjo6cmVsZWFzZVNhdmVKb2JEYXRhKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBMT0dEKCJFIik7CisKKyAgICBRQ2FtZXJhUG9zdFByb2Nlc3NvciAqcG1lID0gKFFDYW1lcmFQb3N0UHJvY2Vzc29yICopIHVzZXJfZGF0YTsKKyAgICBpZiAoTlVMTCA9PSBwbWUpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBwb3N0cHJvYyBoYW5kbGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHFjYW1lcmFfanBlZ19ldnRfcGF5bG9hZF90ICpqb2JfZGF0YSA9IChxY2FtZXJhX2pwZWdfZXZ0X3BheWxvYWRfdCAqKSBkYXRhOworICAgIGlmIChqb2JfZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkludmFsaWQganBlZyBldmVudCBkYXRhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBmaW5kIGpvYiBieSBqb2JJZAorICAgIHFjYW1lcmFfanBlZ19kYXRhX3QgKmpvYiA9IHBtZS0+ZmluZEpwZWdKb2JCeUpvYklkKGpvYl9kYXRhLT5qb2JJZCk7CisKKyAgICBpZiAoTlVMTCAhPSBqb2IpIHsKKyAgICAgICAgcG1lLT5yZWxlYXNlSnBlZ0pvYkRhdGEoam9iKTsKKyAgICAgICAgZnJlZShqb2IpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkludmFsaWQganBlZyBqb2IiKTsKKyAgICB9CisKKyAgICBMT0dEKCJYIik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVsZWFzZVJhd0RhdGEKKyAqCisgKiBERVNDUklQVElPTjogZnVuY3Rpb24gdG8gcmVsZWFzZSBpbnRlcm5hbCByZXNvdXJjZXMgaW4gc3RvcmUgam9icworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAam9iICAgICA6IHB0ciB0byBzYXZlIGpvYiBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhUG9zdFByb2Nlc3Nvcjo6cmVsZWFzZVJhd0RhdGEodm9pZCAqZGF0YSwgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIExPR0QoIkUiKTsKKworICAgIFFDYW1lcmFQb3N0UHJvY2Vzc29yICpwbWUgPSAoUUNhbWVyYVBvc3RQcm9jZXNzb3IgKikgdXNlcl9kYXRhOworICAgIGlmIChOVUxMID09IHBtZSkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHBvc3Rwcm9jIGhhbmRsZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3VwZXJfYnVmID0gKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqKSBkYXRhOworICAgIHBtZS0+cmVsZWFzZVN1cGVyQnVmKHN1cGVyX2J1Zik7CisKKyAgICBMT0dEKCJYIik7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRDb2xvcmZtdEZyb21JbWdGbXQKKyAqCisgKiBERVNDUklQVElPTjogZnVuY3Rpb24gdG8gcmV0dXJuIGpwZWcgY29sb3IgZm9ybWF0IGJhc2VkIG9uIGl0cyBpbWFnZSBmb3JtYXQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGltZ19mbXQgOiBpbWFnZSBmb3JtYXQKKyAqCisgKiBSRVRVUk4gICAgIDoganBlZyBjb2xvciBmb3JtYXQgdGhhdCBjYW4gYmUgdW5kZXJzdGFuZGFibGUgYnkgb214IGxpYgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCittbV9qcGVnX2NvbG9yX2Zvcm1hdCBRQ2FtZXJhUG9zdFByb2Nlc3Nvcjo6Z2V0Q29sb3JmbXRGcm9tSW1nRm10KGNhbV9mb3JtYXRfdCBpbWdfZm10KQoreworICAgIHN3aXRjaCAoaW1nX2ZtdCkgeworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjE6CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYyMV9WRU5VUzoKKyAgICAgICAgcmV0dXJuIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDUkNCTFBfSDJWMjsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxX0FEUkVOTzoKKyAgICAgICAgcmV0dXJuIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDUkNCTFBfSDJWMjsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVkVOVVM6CisgICAgICAgIHJldHVybiBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gyVjI7CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfWVYxMjoKKyAgICAgICAgcmV0dXJuIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDQkNSTFBfSDJWMjsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMl9OVjYxOgorICAgICAgICByZXR1cm4gTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNSQ0JMUF9IMlYxOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIyX05WMTY6CisgICAgICAgIHJldHVybiBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gyVjE7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDUkNCTFBfSDJWMjsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0SnBlZ0ltZ1R5cGVGcm9tSW1nRm10CisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIHJldHVybiBqcGVnIGVuY29kZSBpbWFnZSB0eXBlIGJhc2VkIG9uIGl0cyBpbWFnZSBmb3JtYXQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGltZ19mbXQgOiBpbWFnZSBmb3JtYXQKKyAqCisgKiBSRVRVUk4gICAgIDogcmV0dXJuIGpwZWcgc291cmNlIGltYWdlIGZvcm1hdCAoWVVWIG9yIEJpdHN0cmVhbSkKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworbW1fanBlZ19mb3JtYXRfdCBRQ2FtZXJhUG9zdFByb2Nlc3Nvcjo6Z2V0SnBlZ0ltZ1R5cGVGcm9tSW1nRm10KGNhbV9mb3JtYXRfdCBpbWdfZm10KQoreworICAgIHN3aXRjaCAoaW1nX2ZtdCkgeworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjE6CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYyMV9BRFJFTk86CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMjoKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyX1ZFTlVTOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjFfVkVOVVM6CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfWVYxMjoKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMl9OVjYxOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIyX05WMTY6CisgICAgICAgIHJldHVybiBNTV9KUEVHX0ZNVF9ZVVY7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1NX0pQRUdfRk1UX1lVVjsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcXVlcnlTdHJlYW1zCisgKgorICogREVTQ1JJUFRJT046IHV0aWxpdHkgbWV0aG9kIGZvciByZXRyaWV2aW5nIG1haW4sIHRodW1ibmFpbCBhbmQgcmVwcm9jZXNzCisgKiAgICAgICAgICAgICAgc3RyZWFtcyBhbmQgZnJhbWUgZnJvbSBidW5kbGVkIHN1cGVyIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbWFpbiAgICA6IHB0ciB0byBtYWluIHN0cmVhbSBpZiBwcmVzZW50CisgKiAgIEB0aHVtYiAgIDogcHRyIHRvIHRodW1ibmFpbCBzdHJlYW0gaWYgcHJlc2VudAorICogICBAcmVwcm9jICA6IHB0ciB0byByZXByb2Nlc3Mgc3RyZWFtIGlmIHByZXNlbnQKKyAqICAgQG1haW5faW1hZ2UgOiBwdHIgdG8gbWFpbiBpbWFnZSBpZiBwcmVzZW50CisgKiAgIEB0aHVtYl9pbWFnZTogcHRyIHRvIHRodW1ibmFpbCBpbWFnZSBpZiBwcmVzZW50CisgKiAgIEBmcmFtZSAgIDogYnVuZGxlZCBzdXBlciBidWZmZXIKKyAqICAgQHJlcHJvY19mcmFtZSA6IGJ1bmRsZWQgc291cmNlIGZyYW1lIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBvc3RQcm9jZXNzb3I6OnF1ZXJ5U3RyZWFtcyhRQ2FtZXJhU3RyZWFtICoqbWFpbiwKKyAgICAgICAgUUNhbWVyYVN0cmVhbSAqKnRodW1iLAorICAgICAgICBRQ2FtZXJhU3RyZWFtICoqcmVwcm9jLAorICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICoqbWFpbl9pbWFnZSwKKyAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqKnRodW1iX2ltYWdlLAorICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lLAorICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnJlcHJvY19mcmFtZSkKK3sKKyAgICBpZiAoTlVMTCA9PSBmcmFtZSkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBRQ2FtZXJhQ2hhbm5lbCAqcENoYW5uZWwgPSBtX3BhcmVudC0+Z2V0Q2hhbm5lbEJ5SGFuZGxlKGZyYW1lLT5jaF9pZCk7CisgICAgLy8gY2hlY2sgcmVwcm9jZXNzIGNoYW5uZWwgaWYgbm90IGZvdW5kCisgICAgaWYgKHBDaGFubmVsID09IE5VTEwpIHsKKyAgICAgICAgZm9yIChpbnQ4X3QgaSA9IDA7IGkgPCBtUFBDaGFubmVsQ291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKChtUFBDaGFubmVsc1tpXSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgICAgICAgICAobVBQQ2hhbm5lbHNbaV0tPmdldE15SGFuZGxlKCkgPT0gZnJhbWUtPmNoX2lkKSkgeworICAgICAgICAgICAgICAgIHBDaGFubmVsID0gbVBQQ2hhbm5lbHNbaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBDaGFubmVsID09IE5VTEwpIHsKKyAgICAgICAgTE9HRCgiTm8gY29ycmVzcG9uZGluZyBjaGFubmVsIChjaF9pZCA9ICVkKSBleGlzdCwgcmV0dXJuIGhlcmUiLAorICAgICAgICAgICAgICAgZnJhbWUtPmNoX2lkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBVc2Ugc25hcHNob3Qgc3RyZWFtIHRvIGNyZWF0ZSB0aHVtYm5haWwgaWYgc25hcHNob3QgYW5kIHByZXZpZXcKKyAgICAvLyBmbGlwIHNldHRpbmdzIGRvZXNuJ3QgbWF0Y2ggaW4gWlNMIG1vZGUuCisgICAgYm9vbCB0aHVtYl9zdHJlYW1fbmVlZGVkID0gKCghbV9wYXJlbnQtPmlzWlNMTW9kZSgpIHx8CisgICAgICAgIChtX3BhcmVudC0+bVBhcmFtZXRlcnMuZ2V0RmxpcE1vZGUoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKSA9PQorICAgICAgICAgbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdldEZsaXBNb2RlKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKSkpICYmCisgICAgICAgICFtX3BhcmVudC0+bVBhcmFtZXRlcnMuZ2VuZXJhdGVUaHVtYkZyb21NYWluKCkpOworCisgICAgKm1haW4gPSAqdGh1bWIgPSAqcmVwcm9jID0gTlVMTDsKKyAgICAqbWFpbl9pbWFnZSA9ICp0aHVtYl9pbWFnZSA9IE5VTEw7CisgICAgLy8gZmluZCBzbmFwc2hvdCBmcmFtZSBhbmQgdGh1bW5haWwgZnJhbWUKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZnJhbWUtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9CisgICAgICAgICAgICAgICAgcENoYW5uZWwtPmdldFN0cmVhbUJ5SGFuZGxlKGZyYW1lLT5idWZzW2ldLT5zdHJlYW1faWQpOworICAgICAgICBpZiAocFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAocFN0cmVhbS0+aXNUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKSB8fAorICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKSB8fAorICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfVklERU8pIHx8CisgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfVklERU8pIHx8CisgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfUkFXKSkgeworICAgICAgICAgICAgICAgICptYWluPSBwU3RyZWFtOworICAgICAgICAgICAgICAgICptYWluX2ltYWdlID0gZnJhbWUtPmJ1ZnNbaV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRodW1iX3N0cmVhbV9uZWVkZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+aXNUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1BPU1RWSUVXKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+aXNPcmlnbmFsVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+aXNPcmlnbmFsVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVykpKSB7CisgICAgICAgICAgICAgICAgKnRodW1iID0gcFN0cmVhbTsKKyAgICAgICAgICAgICAgICAqdGh1bWJfaW1hZ2UgPSBmcmFtZS0+YnVmc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DKSApIHsKKyAgICAgICAgICAgICAgICAqcmVwcm9jID0gcFN0cmVhbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0aHVtYl9zdHJlYW1fbmVlZGVkICYmICp0aHVtYl9pbWFnZSA9PSBOVUxMICYmIHJlcHJvY19mcmFtZSAhPSBOVUxMKSB7CisgICAgICAgIFFDYW1lcmFDaGFubmVsICpwU3JjUmVwcm9jQ2hhbm5lbCA9IE5VTEw7CisgICAgICAgIHBTcmNSZXByb2NDaGFubmVsID0gbV9wYXJlbnQtPmdldENoYW5uZWxCeUhhbmRsZShyZXByb2NfZnJhbWUtPmNoX2lkKTsKKyAgICAgICAgaWYgKHBTcmNSZXByb2NDaGFubmVsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGZpbmQgdGh1bWJuYWlsIGZyYW1lCisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVwcm9jX2ZyYW1lLT5udW1fYnVmczsgaSsrKSB7CisgICAgICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVwcm9jQ2hhbm5lbC0+Z2V0U3RyZWFtQnlIYW5kbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJvY19mcmFtZS0+YnVmc1tpXS0+c3RyZWFtX2lkKTsKKyAgICAgICAgICAgICAgICBpZiAocFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfUFJFVklFVykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICp0aHVtYiA9IHBTdHJlYW07CisgICAgICAgICAgICAgICAgICAgICAgICAqdGh1bWJfaW1hZ2UgPSByZXByb2NfZnJhbWUtPmJ1ZnNbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIEZVTkNUSU9OICAgOiBzeW5jU3RyZWFtUGFyYW1zCisqCisqIERFU0NSSVBUSU9OOiBRdWVyeSB0aGUgcnVudGltZSBwYXJhbWV0ZXJzIG9mIGFsbCBzdHJlYW1zIGluY2x1ZGVkCisqICAgICAgICAgICAgICBpbiB0aGUgbWFpbiBhbmQgcmVwcm9jZXNzZWQgZnJhbWVzCisqCisqIFBBUkFNRVRFUlMgOgorKiAgIEBmcmFtZSA6IE1haW4gaW1hZ2Ugc3VwZXIgYnVmZmVyCisqICAgQHJlcHJvY19mcmFtZSA6IEltYWdlIHN1cHBlciBidWZmZXIgdGhhdCBnb3QgcHJvY2Vzc2VkCisqCisqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBvc3RQcm9jZXNzb3I6OnN5bmNTdHJlYW1QYXJhbXMobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSwKKyAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZXByb2NfZnJhbWUpCit7CisgICAgUUNhbWVyYVN0cmVhbSAqcmVwcm9jX3N0cmVhbSA9IE5VTEw7CisgICAgUUNhbWVyYVN0cmVhbSAqbWFpbl9zdHJlYW0gPSBOVUxMOworICAgIFFDYW1lcmFTdHJlYW0gKnRodW1iX3N0cmVhbSA9IE5VTEw7CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqbWFpbl9mcmFtZSA9IE5VTEw7CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqdGh1bWJfZnJhbWUgPSBOVUxMOworICAgIGludDMyX3QgcmV0ID0gTk9fRVJST1I7CisKKyAgICByZXQgPSBxdWVyeVN0cmVhbXMoJm1haW5fc3RyZWFtLAorICAgICAgICAgICAgJnRodW1iX3N0cmVhbSwKKyAgICAgICAgICAgICZyZXByb2Nfc3RyZWFtLAorICAgICAgICAgICAgJm1haW5fZnJhbWUsCisgICAgICAgICAgICAmdGh1bWJfZnJhbWUsCisgICAgICAgICAgICBmcmFtZSwKKyAgICAgICAgICAgIHJlcHJvY19mcmFtZSk7CisgICAgaWYgKE5PX0VSUk9SICE9IHJldCkgeworICAgICAgICBMT0dFKCJDYW1lcmEgc3RyZWFtcyBxdWVyeSBmcm9tIGlucHV0IGZyYW1lcyBmYWlsZWQgJWQiLAorICAgICAgICAgICAgICAgIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKE5VTEwgIT0gbWFpbl9zdHJlYW0pIHsKKyAgICAgICAgcmV0ID0gbWFpbl9zdHJlYW0tPnN5bmNSdW50aW1lUGFyYW1zKCk7CisgICAgICAgIGlmIChOT19FUlJPUiAhPSByZXQpIHsKKyAgICAgICAgICAgIExPR0UoIlN5bmNpbmcgb2YgbWFpbiBzdHJlYW0gcnVudGltZSBwYXJhbWV0ZXJzIGZhaWxlZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKE5VTEwgIT0gdGh1bWJfc3RyZWFtKSB7CisgICAgICAgIHJldCA9IHRodW1iX3N0cmVhbS0+c3luY1J1bnRpbWVQYXJhbXMoKTsKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJldCkgeworICAgICAgICAgICAgTE9HRSgiU3luY2luZyBvZiB0aHVtYiBzdHJlYW0gcnVudGltZSBwYXJhbWV0ZXJzIGZhaWxlZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChOVUxMICE9IHJlcHJvY19zdHJlYW0pICYmIChyZXByb2Nfc3RyZWFtICE9IG1haW5fc3RyZWFtKSkgeworICAgICAgICByZXQgPSByZXByb2Nfc3RyZWFtLT5zeW5jUnVudGltZVBhcmFtcygpOworICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmV0KSB7CisgICAgICAgICAgICBMT0dFKCJTeW5jaW5nIG9mIHJlcHJvYyBzdHJlYW0gcnVudGltZSBwYXJhbWV0ZXJzIGZhaWxlZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBlbmNvZGVEYXRhCisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIHByZXBhcmUgZW5jb2Rpbmcgam9iIGluZm9ybWF0aW9uIGFuZCBzZW5kIHRvCisgKiAgICAgICAgICAgICAgbW0tanBlZy1pbnRlcmZhY2UgdG8gZG8gdGhlIGVuY29kaW5nIGpvYgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAanBlZ19qb2JfZGF0YSA6IHB0ciB0byBhIHN0cnVjdCBzYXZpbmcgam9iIHJlbGF0ZWQgaW5mb3JtYXRpb24KKyAqICAgQG5lZWROZXdTZXNzICAgOiBmbGFnIHRvIGluZGljYXRlIGlmIGEgbmV3IGpwZWcgZW5jb2Rpbmcgc2Vzc2lvbiBuZWVkCisgKiAgICAgICAgICAgICAgICAgICAgdG8gYmUgY3JlYXRlZC4gQWZ0ZXIgY3JlYXRpb24sIHRoaXMgZmxhZyB3aWxsIGJlIHRvZ2dsZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQb3N0UHJvY2Vzc29yOjplbmNvZGVEYXRhKHFjYW1lcmFfanBlZ19kYXRhX3QgKmpwZWdfam9iX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgJm5lZWROZXdTZXNzKQoreworICAgIExPR0QoIkUiKTsKKyAgICBpbnQzMl90IHJldCA9IE5PX0VSUk9SOworICAgIG1tX2pwZWdfam9iX3QganBnX2pvYjsKKyAgICB1aW50MzJfdCBqb2JJZCA9IDA7CisgICAgUUNhbWVyYVN0cmVhbSAqcmVwcm9jX3N0cmVhbSA9IE5VTEw7CisgICAgUUNhbWVyYVN0cmVhbSAqbWFpbl9zdHJlYW0gPSBOVUxMOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1haW5fZnJhbWUgPSBOVUxMOworICAgIFFDYW1lcmFTdHJlYW0gKnRodW1iX3N0cmVhbSA9IE5VTEw7CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqdGh1bWJfZnJhbWUgPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVjdmRfZnJhbWUgPSBqcGVnX2pvYl9kYXRhLT5zcmNfZnJhbWU7CisgICAgY2FtX3JlY3RfdCBjcm9wOworICAgIGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCBwYXJhbTsKKyAgICBjYW1fc3RyZWFtX2ltZ19wcm9wX3QgaW1nUHJvcDsKKworICAgIC8vIGZpbmQgY2hhbm5lbAorICAgIFFDYW1lcmFDaGFubmVsICpwQ2hhbm5lbCA9IG1fcGFyZW50LT5nZXRDaGFubmVsQnlIYW5kbGUocmVjdmRfZnJhbWUtPmNoX2lkKTsKKyAgICAvLyBjaGVjayByZXByb2Nlc3MgY2hhbm5lbCBpZiBub3QgZm91bmQKKyAgICBpZiAocENoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICBmb3IgKGludDhfdCBpID0gMDsgaSA8IG1QUENoYW5uZWxDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKG1QUENoYW5uZWxzW2ldICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgICAgIChtUFBDaGFubmVsc1tpXS0+Z2V0TXlIYW5kbGUoKSA9PSByZWN2ZF9mcmFtZS0+Y2hfaWQpKSB7CisgICAgICAgICAgICAgICAgcENoYW5uZWwgPSBtUFBDaGFubmVsc1tpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5vIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCAoY2hfaWQgPSAlZCkgZXhpc3QsIHJldHVybiBoZXJlIiwKKyAgICAgICAgICAgICAgICByZWN2ZF9mcmFtZS0+Y2hfaWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNvbnN0IHVpbnQzMl90IGpwZWdfcm90YXRpb24gPSBtX3BhcmVudC0+bVBhcmFtZXRlcnMuZ2V0SnBlZ1JvdGF0aW9uKCk7CisKKyAgICByZXQgPSBxdWVyeVN0cmVhbXMoJm1haW5fc3RyZWFtLAorICAgICAgICAgICAgJnRodW1iX3N0cmVhbSwKKyAgICAgICAgICAgICZyZXByb2Nfc3RyZWFtLAorICAgICAgICAgICAgJm1haW5fZnJhbWUsCisgICAgICAgICAgICAmdGh1bWJfZnJhbWUsCisgICAgICAgICAgICByZWN2ZF9mcmFtZSwKKyAgICAgICAgICAgIGpwZWdfam9iX2RhdGEtPnNyY19yZXByb2NfZnJhbWUpOworICAgIGlmIChOT19FUlJPUiAhPSByZXQpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZihOVUxMID09IG1haW5fZnJhbWUpeworICAgICAgIExPR0UoIk1haW4gZnJhbWUgaXMgTlVMTCIpOworICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYoTlVMTCA9PSB0aHVtYl9mcmFtZSl7CisgICAgICAgTE9HRCgiVGh1bWJuYWlsIGZyYW1lIGRvZXMgbm90IGV4aXN0Iik7CisgICAgfQorCisgICAgUUNhbWVyYU1lbW9yeSAqbWVtT2JqID0gKFFDYW1lcmFNZW1vcnkgKiltYWluX2ZyYW1lLT5tZW1faW5mbzsKKyAgICBpZiAoTlVMTCA9PSBtZW1PYmopIHsKKyAgICAgICAgTE9HRSgiTWVtZW9yeSBPYmogb2YgbWFpbiBmcmFtZSBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgLy8gZHVtcCBzbmFwc2hvdCBmcmFtZSBpZiBlbmFibGVkCisgICAgbV9wYXJlbnQtPmR1bXBGcmFtZVRvRmlsZShtYWluX3N0cmVhbSwgbWFpbl9mcmFtZSwKKyAgICAgICAgICAgIFFDQU1FUkFfRFVNUF9GUk1fU05BUFNIT1QsIChjaGFyICopIkNQUCIpOworCisgICAgLy8gc2VuZCB1cHBlcmxheWVyIGNhbGxiYWNrIGZvciByYXcgaW1hZ2UKKyAgICBjYW1lcmFfbWVtb3J5X3QgKm1lbSA9IG1lbU9iai0+Z2V0TWVtb3J5KG1haW5fZnJhbWUtPmJ1Zl9pZHgsIGZhbHNlKTsKKyAgICBpZiAoTlVMTCAhPSBtX3BhcmVudC0+bURhdGFDYiAmJgorICAgICAgICBtX3BhcmVudC0+bXNnVHlwZUVuYWJsZWRXaXRoTG9jayhDQU1FUkFfTVNHX1JBV19JTUFHRSkgPiAwKSB7CisgICAgICAgIHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90IGNiQXJnOworICAgICAgICBtZW1zZXQoJmNiQXJnLCAwLCBzaXplb2YocWNhbWVyYV9jYWxsYmFja19hcmdtX3QpKTsKKyAgICAgICAgY2JBcmcuY2JfdHlwZSA9IFFDQU1FUkFfREFUQV9DQUxMQkFDSzsKKyAgICAgICAgY2JBcmcubXNnX3R5cGUgPSBDQU1FUkFfTVNHX1JBV19JTUFHRTsKKyAgICAgICAgY2JBcmcuZGF0YSA9IG1lbTsKKyAgICAgICAgY2JBcmcuaW5kZXggPSAwOworICAgICAgICBtX3BhcmVudC0+bV9jYk5vdGlmaWVyLm5vdGlmeUNhbGxiYWNrKGNiQXJnKTsKKyAgICB9CisgICAgaWYgKE5VTEwgIT0gbV9wYXJlbnQtPm1Ob3RpZnlDYiAmJgorICAgICAgICBtX3BhcmVudC0+bXNnVHlwZUVuYWJsZWRXaXRoTG9jayhDQU1FUkFfTVNHX1JBV19JTUFHRV9OT1RJRlkpID4gMCkgeworICAgICAgICBxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCBjYkFyZzsKKyAgICAgICAgbWVtc2V0KCZjYkFyZywgMCwgc2l6ZW9mKHFjYW1lcmFfY2FsbGJhY2tfYXJnbV90KSk7CisgICAgICAgIGNiQXJnLmNiX3R5cGUgPSBRQ0FNRVJBX05PVElGWV9DQUxMQkFDSzsKKyAgICAgICAgY2JBcmcubXNnX3R5cGUgPSBDQU1FUkFfTVNHX1JBV19JTUFHRV9OT1RJRlk7CisgICAgICAgIGNiQXJnLmV4dDEgPSAwOworICAgICAgICBjYkFyZy5leHQyID0gMDsKKyAgICAgICAgbV9wYXJlbnQtPm1fY2JOb3RpZmllci5ub3RpZnlDYWxsYmFjayhjYkFyZyk7CisgICAgfQorCisgICAgaWYgKG1KcGVnQ2xpZW50SGFuZGxlIDw9IDApIHsKKyAgICAgICAgTE9HRSgiRXJyb3I6IGJ1ZyBoZXJlLCBtSnBlZ0NsaWVudEhhbmRsZSBpcyAwIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChuZWVkTmV3U2VzcykgeworICAgICAgICAvLyBjcmVhdGUganBlZyBlbmNvZGluZyBzZXNzaW9uCisgICAgICAgIG1tX2pwZWdfZW5jb2RlX3BhcmFtc190IGVuY29kZVBhcmFtOworICAgICAgICBtZW1zZXQoJmVuY29kZVBhcmFtLCAwLCBzaXplb2YobW1fanBlZ19lbmNvZGVfcGFyYW1zX3QpKTsKKyAgICAgICAgcmV0ID0gZ2V0SnBlZ0VuY29kaW5nQ29uZmlnKGVuY29kZVBhcmFtLCBtYWluX3N0cmVhbSwgdGh1bWJfc3RyZWFtKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiZXJyb3IgZ2V0dGluZyBlbmNvZGluZyBjb25maWciKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgTE9HSCgiW0tQSSBQZXJmXSA6IGNhbGwganBlZyBjcmVhdGVfc2Vzc2lvbiIpOworICAgICAgICByZXQgPSBtSnBlZ0hhbmRsZS5jcmVhdGVfc2Vzc2lvbihtSnBlZ0NsaWVudEhhbmRsZSwgJmVuY29kZVBhcmFtLCAmbUpwZWdTZXNzaW9uSWQpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJlcnJvciBjcmVhdGluZyBhIG5ldyBqcGVnIGVuY29kaW5nIHNlc3Npb24iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgbmVlZE5ld1Nlc3MgPSBGQUxTRTsKKyAgICB9CisgICAgLy8gRmlsbCBpbiBuZXcgam9iCisgICAgbWVtc2V0KCZqcGdfam9iLCAwLCBzaXplb2YobW1fanBlZ19qb2JfdCkpOworICAgIGpwZ19qb2Iuam9iX3R5cGUgPSBKUEVHX0pPQl9UWVBFX0VOQ09ERTsKKyAgICBqcGdfam9iLmVuY29kZV9qb2Iuc2Vzc2lvbl9pZCA9IG1KcGVnU2Vzc2lvbklkOworICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5zcmNfaW5kZXggPSAoaW50MzJfdCltYWluX2ZyYW1lLT5idWZfaWR4OworICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5kc3RfaW5kZXggPSAwOworCisgICAgaWYgKG1KcGVnTWVtT3B0KSB7CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5kc3RfaW5kZXggPSBqcGdfam9iLmVuY29kZV9qb2Iuc3JjX2luZGV4OworICAgIH0gZWxzZSBpZiAobVVzZUpwZWdCdXJzdCkgeworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuZHN0X2luZGV4ID0gLTE7CisgICAgfQorCisgICAgLy8gdXNlIHNyYyB0byByZXByb2MgZnJhbWUgYXMgd29yayBidWZmZXI7IGlmIHNyYyBidWYgaXMgbm90IGF2YWlsYWJsZQorICAgIC8vIGpwZWcgaW50ZXJmYWNlIHdpbGwgYWxsb2NhdGUgd29yayBidWZmZXIKKyAgICBpZiAoanBlZ19qb2JfZGF0YS0+c3JjX3JlcHJvY19mcmFtZSAhPSBOVUxMKSB7CisgICAgICAgIGludDMyX3QgcmV0ID0gTk9fRVJST1I7CisgICAgICAgIFFDYW1lcmFTdHJlYW0gKm1haW5fc3RyZWFtID0gTlVMTDsKKyAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqbWFpbl9mcmFtZSA9IE5VTEw7CisgICAgICAgIFFDYW1lcmFTdHJlYW0gKnRodW1iX3N0cmVhbSA9IE5VTEw7CisgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKnRodW1iX2ZyYW1lID0gTlVMTDsKKyAgICAgICAgUUNhbWVyYVN0cmVhbSAqcmVwcm9jX3N0cmVhbSA9IE5VTEw7CisgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKndvcmtCdWYgPSBOVUxMOworICAgICAgICAvLyBDYWxsIHF1ZXJ5U3RyZWFtcyB0byBmZXRjaCBzb3VyY2Ugb2YgcmVwcm9jIGZyYW1lCisgICAgICAgIHJldCA9IHF1ZXJ5U3RyZWFtcygmbWFpbl9zdHJlYW0sCisgICAgICAgICAgICAgICAgJnRodW1iX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAmcmVwcm9jX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAmbWFpbl9mcmFtZSwKKyAgICAgICAgICAgICAgICAmdGh1bWJfZnJhbWUsCisgICAgICAgICAgICAgICAganBlZ19qb2JfZGF0YS0+c3JjX3JlcHJvY19mcmFtZSwKKyAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICBpZiAoKE5PX0VSUk9SID09IHJldCkgJiYgKCh3b3JrQnVmID0gbWFpbl9mcmFtZSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAmJiAhbV9wYXJlbnQtPmlzTG93UG93ZXJNb2RlKCkpIHsKKyAgICAgICAgICAgIGNhbWVyYV9tZW1vcnlfdCAqY2FtV29ya01lbSA9IE5VTEw7CisgICAgICAgICAgICBpbnQgd29ya0J1ZkluZGV4ID0gd29ya0J1Zi0+YnVmX2lkeDsKKyAgICAgICAgICAgIFFDYW1lcmFNZW1vcnkgKndvcmtNZW0gPSAoUUNhbWVyYU1lbW9yeSAqKXdvcmtCdWYtPm1lbV9pbmZvOworICAgICAgICAgICAgaWYgKHdvcmtNZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNhbVdvcmtNZW0gPSB3b3JrTWVtLT5nZXRNZW1vcnkod29ya0J1ZkluZGV4LCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FtV29ya01lbSAhPSBOVUxMICYmIHdvcmtNZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi53b3JrX2J1Zi5idWZfc2l6ZSA9IGNhbVdvcmtNZW0tPnNpemU7CisgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLndvcmtfYnVmLmJ1Zl92YWRkciA9ICh1aW50OF90ICopY2FtV29ya01lbS0+ZGF0YTsKKyAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2Iud29ya19idWYuZmQgPSB3b3JrTWVtLT5nZXRGZCh3b3JrQnVmSW5kZXgpOworICAgICAgICAgICAgICAgIHdvcmtNZW0tPmludmFsaWRhdGVDYWNoZSh3b3JrQnVmSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY2FtX2RpbWVuc2lvbl90IHNyY19kaW07CisgICAgbWVtc2V0KCZzcmNfZGltLCAwLCBzaXplb2YoY2FtX2RpbWVuc2lvbl90KSk7CisgICAgbWFpbl9zdHJlYW0tPmdldEZyYW1lRGltZW5zaW9uKHNyY19kaW0pOworCisgICAgYm9vbCBoZHJfb3V0cHV0X2Nyb3AgPSBtX3BhcmVudC0+bVBhcmFtZXRlcnMuaXNIRFJPdXRwdXRDcm9wRW5hYmxlZCgpOworICAgIGJvb2wgaW1nX2ZlYXR1cmVfZW5hYmxlZCA9CisgICAgICAgICAgICBtX3BhcmVudC0+bVBhcmFtZXRlcnMuaXNVYmlGb2N1c0VuYWJsZWQoKSB8fAorICAgICAgICAgICAgbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmlzVWJpUmVmb2N1cygpIHx8CisgICAgICAgICAgICBtX3BhcmVudC0+bVBhcmFtZXRlcnMuaXNDaHJvbWFGbGFzaEVuYWJsZWQoKSB8fAorICAgICAgICAgICAgbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmlzT3B0aVpvb21FbmFibGVkKCkgfHwKKyAgICAgICAgICAgIG1fcGFyZW50LT5tUGFyYW1ldGVycy5pc1N0aWxsTW9yZUVuYWJsZWQoKTsKKworICAgIExPR0goIkNyb3AgbmVlZGVkICVkIiwgaW1nX2ZlYXR1cmVfZW5hYmxlZCk7CisgICAgY3JvcC5sZWZ0ID0gMDsKKyAgICBjcm9wLnRvcCA9IDA7CisgICAgY3JvcC5oZWlnaHQgPSBzcmNfZGltLmhlaWdodDsKKyAgICBjcm9wLndpZHRoID0gc3JjX2RpbS53aWR0aDsKKworICAgIHBhcmFtID0gbWFpbl9zdHJlYW0tPmdldE91dHB1dENyb3AoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtLm91dHB1dENyb3AubnVtX29mX3N0cmVhbXM7IGkrKykgeworICAgICAgIGlmIChwYXJhbS5vdXRwdXRDcm9wLmNyb3BfaW5mb1tpXS5zdHJlYW1faWQKKyAgICAgICAgICAgPT0gbWFpbl9zdHJlYW0tPmdldE15U2VydmVySUQoKSkgeworICAgICAgICAgICAgICAgY3JvcCA9IHBhcmFtLm91dHB1dENyb3AuY3JvcF9pbmZvW2ldLmNyb3A7CisgICAgICAgICAgICAgICBtYWluX3N0cmVhbS0+c2V0Q3JvcEluZm8oY3JvcCk7CisgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW1nX2ZlYXR1cmVfZW5hYmxlZCkgeworICAgICAgICBtZW1zZXQoJnBhcmFtLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90KSk7CisKKyAgICAgICAgcGFyYW0gPSBtYWluX3N0cmVhbS0+Z2V0SW1nUHJvcCgpOworICAgICAgICBpbWdQcm9wID0gcGFyYW0uaW1nUHJvcDsKKyAgICAgICAgbWFpbl9zdHJlYW0tPnNldENyb3BJbmZvKGltZ1Byb3AuY3JvcCk7CisgICAgICAgIGNyb3AgPSBpbWdQcm9wLmNyb3A7CisgICAgICAgIHRodW1iX3N0cmVhbSA9IE5VTEw7IC8qIHVzZSB0aHVtYm5haWwgZnJvbSBtYWluIGltYWdlICovCisKKyAgICAgICAgaWYgKChyZXByb2Nfc3RyZWFtICE9IE5VTEwpICYmIChtX0RhdGFNZW0gPT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+bVBhcmFtZXRlcnMuaXNVYmlSZWZvY3VzKCkpIHsKKworICAgICAgICAgICAgUUNhbWVyYUhlYXBNZW1vcnkqIG1pc2NCdWZIYW5kbGVyID0gcmVwcm9jX3N0cmVhbS0+Z2V0TWlzY0J1ZigpOworICAgICAgICAgICAgY2FtX21pc2NfYnVmX3QqIHJlZm9jdXNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNhbV9taXNjX2J1Zl90ICo+KG1pc2NCdWZIYW5kbGVyLT5nZXRQdHIoMCkpOworICAgICAgICAgICAgdWludDMyX3QgcmVzdWx0U2l6ZSA9IHJlZm9jdXNSZXN1bHQtPmhlYWRlcl9zaXplICsKKyAgICAgICAgICAgICAgICAgICAgcmVmb2N1c1Jlc3VsdC0+d2lkdGggKiByZWZvY3VzUmVzdWx0LT5oZWlnaHQ7CisgICAgICAgICAgICBjYW1lcmFfbWVtb3J5X3QgKmRhdGFNZW0gPSBtX3BhcmVudC0+bUdldE1lbW9yeSgtMSwgcmVzdWx0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgMSwgbV9wYXJlbnQtPm1DYWxsYmFja0Nvb2tpZSk7CisKKyAgICAgICAgICAgIExPR0goIlJlZm9jdXMgcmVzdWx0IGhlYWRlciAldSBkaW1zICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0U2l6ZSwgcmVmb2N1c1Jlc3VsdC0+d2lkdGgsIHJlZm9jdXNSZXN1bHQtPmhlaWdodCk7CisKKyAgICAgICAgICAgIGlmIChkYXRhTWVtICYmIGRhdGFNZW0tPmRhdGEpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZGF0YU1lbS0+ZGF0YSwgcmVmb2N1c1Jlc3VsdC0+ZGF0YSwgcmVzdWx0U2l6ZSk7CisgICAgICAgICAgICAgICAgLy9zYXZlIG1lbSBwb2ludGVyIGZvciBkZXB0aCBtYXAKKyAgICAgICAgICAgICAgICBtX0RhdGFNZW0gPSBkYXRhTWVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmICgocmVwcm9jX3N0cmVhbSAhPSBOVUxMKSAmJiAobV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmlzVHJ1ZVBvcnRyYWl0RW5hYmxlZCgpKSkgeworCisgICAgICAgIFFDYW1lcmFIZWFwTWVtb3J5KiBtaXNjQnVmSGFuZGxlciA9IHJlcHJvY19zdHJlYW0tPmdldE1pc2NCdWYoKTsKKyAgICAgICAgY2FtX21pc2NfYnVmX3QqIHRwUmVzdWx0ID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNhbV9taXNjX2J1Zl90ICo+KG1pc2NCdWZIYW5kbGVyLT5nZXRQdHIoMCkpOworICAgICAgICB1aW50MzJfdCB0cE1ldGFTaXplID0gdHBSZXN1bHQtPmhlYWRlcl9zaXplICsgdHBSZXN1bHQtPndpZHRoICogdHBSZXN1bHQtPmhlaWdodDsKKworICAgICAgICBMT0dIKCJUcnVlIHBvcnRyYWl0IHJlc3VsdCBoZWFkZXIgJWQlIGRpbXMgZHglZCIsCisgICAgICAgICAgICAgICAgdHBNZXRhU2l6ZSwgdHBSZXN1bHQtPndpZHRoLCB0cFJlc3VsdC0+aGVpZ2h0KTsKKworICAgICAgICBDQU1fRFVNUF9UT19GSUxFKFFDQU1FUkFfRFVNUF9GUk1fTE9DQVRJT04idHAiLCAiYm0iLCAtMSwgInkiLAorICAgICAgICAgICAgICAgICZ0cFJlc3VsdC0+ZGF0YSwgdHBNZXRhU2l6ZSk7CisgICAgfQorCisgICAgY2FtX2RpbWVuc2lvbl90IGRzdF9kaW07CisKKyAgICBpZiAoaGRyX291dHB1dF9jcm9wICYmIGNyb3AuaGVpZ2h0KSB7CisgICAgICAgIGRzdF9kaW0uaGVpZ2h0ID0gY3JvcC5oZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0X2RpbS5oZWlnaHQgPSBzcmNfZGltLmhlaWdodDsKKyAgICB9CisgICAgaWYgKGhkcl9vdXRwdXRfY3JvcCAmJiBjcm9wLndpZHRoKSB7CisgICAgICAgIGRzdF9kaW0ud2lkdGggPSBjcm9wLndpZHRoOworICAgIH0gZWxzZSB7CisgICAgICAgIGRzdF9kaW0ud2lkdGggPSBzcmNfZGltLndpZHRoOworICAgIH0KKworICAgIC8vIG1haW4gZGltCisgICAganBnX2pvYi5lbmNvZGVfam9iLm1haW5fZGltLnNyY19kaW0gPSBzcmNfZGltOworICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tYWluX2RpbS5kc3RfZGltID0gZHN0X2RpbTsKKyAgICBqcGdfam9iLmVuY29kZV9qb2IubWFpbl9kaW0uY3JvcCA9IGNyb3A7CisKKyAgICAvLyBnZXQgM2Egc3cgdmVyc2lvbiBpbmZvCisgICAgY2FtX3EzYV92ZXJzaW9uX3Qgc3dfdmVyc2lvbiA9CisgICAgICAgIG1fcGFyZW50LT5nZXRDYW1IYWxDYXBhYmlsaXRpZXMoKS0+cTNhX3ZlcnNpb247CisKKyAgICAvLyBnZXQgZXhpZiBkYXRhCisgICAgUUNhbWVyYUV4aWYgKnBKcGVnRXhpZk9iaiA9IG1fcGFyZW50LT5nZXRFeGlmRGF0YSgpOworICAgIGpwZWdfam9iX2RhdGEtPnBKcGVnRXhpZk9iaiA9IHBKcGVnRXhpZk9iajsKKyAgICBpZiAocEpwZWdFeGlmT2JqICE9IE5VTEwpIHsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmV4aWZfaW5mby5leGlmX2RhdGEgPSBwSnBlZ0V4aWZPYmotPmdldEVudHJpZXMoKTsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmV4aWZfaW5mby5udW1PZkVudHJpZXMgPQorICAgICAgICAgICAgcEpwZWdFeGlmT2JqLT5nZXROdW1PZkVudHJpZXMoKTsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmV4aWZfaW5mby5kZWJ1Z19kYXRhLnN3XzNhX3ZlcnNpb25bMF0gPQorICAgICAgICAgICAgc3dfdmVyc2lvbi5tYWpvcl92ZXJzaW9uOworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuZXhpZl9pbmZvLmRlYnVnX2RhdGEuc3dfM2FfdmVyc2lvblsxXSA9CisgICAgICAgICAgICBzd192ZXJzaW9uLm1pbm9yX3ZlcnNpb247CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5leGlmX2luZm8uZGVidWdfZGF0YS5zd18zYV92ZXJzaW9uWzJdID0KKyAgICAgICAgICAgIHN3X3ZlcnNpb24ucGF0Y2hfdmVyc2lvbjsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmV4aWZfaW5mby5kZWJ1Z19kYXRhLnN3XzNhX3ZlcnNpb25bM10gPQorICAgICAgICAgICAgc3dfdmVyc2lvbi5uZXdfZmVhdHVyZV9kZXM7CisgICAgfQorCisgICAgLy8gc2V0IHJvdGF0aW9uIG9ubHkgd2hlbiBubyBvbmxpbmUgcm90YXRpb24gb3Igb2ZmbGluZSBwcCByb3RhdGlvbiBpcyBkb25lIGJlZm9yZQorICAgIGlmICghbV9wYXJlbnQtPm5lZWRSb3RhdGlvblJlcHJvY2VzcygpKSB7CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5yb3RhdGlvbiA9IGpwZWdfcm90YXRpb247CisgICAgfQorICAgIExPR0goImpwZWcgcm90YXRpb24gaXMgc2V0IHRvICVkIiwganBnX2pvYi5lbmNvZGVfam9iLnJvdGF0aW9uKTsKKworICAgIC8vIHRodW1ibmFpbCBkaW0KKyAgICBpZiAobV9iVGh1bWJuYWlsTmVlZGVkID09IFRSVUUpIHsKKyAgICAgICAgbV9wYXJlbnQtPmdldFRodW1ibmFpbFNpemUoanBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2RpbS5kc3RfZGltKTsKKworICAgICAgICBpZiAodGh1bWJfc3RyZWFtID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIG5lZWQganBlZyB0aHVtYm5haWwsIGJ1dCBubyBwb3N0dmlldy9wcmV2aWV3IHN0cmVhbSBleGlzdHMKKyAgICAgICAgICAgIC8vIHdlIHVzZSB0aGUgbWFpbiBzdHJlYW0vZnJhbWUgdG8gZW5jb2RlIHRodW1ibmFpbAorICAgICAgICAgICAgdGh1bWJfc3RyZWFtID0gbWFpbl9zdHJlYW07CisgICAgICAgICAgICB0aHVtYl9mcmFtZSA9IG1haW5fZnJhbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fcGFyZW50LT5uZWVkUm90YXRpb25SZXByb2Nlc3MoKSAmJgorICAgICAgICAgICAgICAgICgoOTAgPT0ganBlZ19yb3RhdGlvbikgfHwgKDI3MCA9PSBqcGVnX3JvdGF0aW9uKSkpIHsKKyAgICAgICAgICAgIC8vIHN3YXAgdGh1bWJuYWlsIGRpbWVuc2lvbnMKKyAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCB0bXBfZGltID0ganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2RpbS5kc3RfZGltOworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2RpbS5kc3RfZGltLndpZHRoID0gdG1wX2RpbS5oZWlnaHQ7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IudGh1bWJfZGltLmRzdF9kaW0uaGVpZ2h0ID0gdG1wX2RpbS53aWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmc3JjX2RpbSwgMCwgc2l6ZW9mKGNhbV9kaW1lbnNpb25fdCkpOworICAgICAgICB0aHVtYl9zdHJlYW0tPmdldEZyYW1lRGltZW5zaW9uKHNyY19kaW0pOworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IudGh1bWJfZGltLnNyY19kaW0gPSBzcmNfZGltOworCisgICAgICAgIC8vIGNyb3AgaXMgdGhlIHNhbWUgaWYgZnJhbWUgaXMgdGhlIHNhbWUKKyAgICAgICAgaWYgKHRodW1iX2ZyYW1lICE9IG1haW5fZnJhbWUpIHsKKyAgICAgICAgICAgIGNyb3AubGVmdCA9IDA7CisgICAgICAgICAgICBjcm9wLnRvcCA9IDA7CisgICAgICAgICAgICBjcm9wLmhlaWdodCA9IHNyY19kaW0uaGVpZ2h0OworICAgICAgICAgICAgY3JvcC53aWR0aCA9IHNyY19kaW0ud2lkdGg7CisKKyAgICAgICAgICAgIHBhcmFtID0gdGh1bWJfc3RyZWFtLT5nZXRPdXRwdXRDcm9wKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtLm91dHB1dENyb3AubnVtX29mX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgICAgaWYgKHBhcmFtLm91dHB1dENyb3AuY3JvcF9pbmZvW2ldLnN0cmVhbV9pZAorICAgICAgICAgICAgICAgICAgID09IHRodW1iX3N0cmVhbS0+Z2V0TXlTZXJ2ZXJJRCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGNyb3AgPSBwYXJhbS5vdXRwdXRDcm9wLmNyb3BfaW5mb1tpXS5jcm9wOworICAgICAgICAgICAgICAgICAgICAgICB0aHVtYl9zdHJlYW0tPnNldENyb3BJbmZvKGNyb3ApOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uY3JvcCA9IGNyb3A7CisgICAgICAgIGlmICh0aHVtYl9mcmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IudGh1bWJfaW5kZXggPSB0aHVtYl9mcmFtZS0+YnVmX2lkeDsKKyAgICAgICAgfQorICAgICAgICBMT0dJKCJUaHVtYm5haWwgaWR4ID0gJWQgc3JjIHcvaCAoJWR4JWQpLCBkc3Qgdy9oICglZHglZCkiLAorICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2luZGV4LAorICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2RpbS5zcmNfZGltLndpZHRoLAorICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2RpbS5zcmNfZGltLmhlaWdodCwKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uZHN0X2RpbS53aWR0aCwKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uZHN0X2RpbS5oZWlnaHQpOworICAgIH0KKworICAgIExPR0koIk1haW4gaW1hZ2UgaWR4ID0gJWQgc3JjIHcvaCAoJWR4JWQpLCBkc3Qgdy9oICglZHglZCkiLAorICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnNyY19pbmRleCwKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tYWluX2RpbS5zcmNfZGltLndpZHRoLAorICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm1haW5fZGltLnNyY19kaW0uaGVpZ2h0LAorICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm1haW5fZGltLmRzdF9kaW0ud2lkdGgsCisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubWFpbl9kaW0uZHN0X2RpbS5oZWlnaHQpOworCisgICAgaWYgKHRodW1iX2ZyYW1lICE9IE5VTEwpIHsKKyAgICAgICAgLy8gZHVtcCB0aHVtYm5haWwgZnJhbWUgaWYgZW5hYmxlZAorICAgICAgICBtX3BhcmVudC0+ZHVtcEZyYW1lVG9GaWxlKHRodW1iX3N0cmVhbSwgdGh1bWJfZnJhbWUsIFFDQU1FUkFfRFVNUF9GUk1fVEhVTUJOQUlMKTsKKyAgICB9CisKKyAgICBpZiAoanBlZ19qb2JfZGF0YS0+bWV0YWRhdGEgIT0gTlVMTCkgeworICAgICAgICAvLyBmaWxsIGluIG1ldGEgZGF0YSBmcmFtZSBwdHIKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEgPSBqcGVnX2pvYl9kYXRhLT5tZXRhZGF0YTsKKyAgICB9CisKKyAgICBqcGdfam9iLmVuY29kZV9qb2IuaGFsX3ZlcnNpb24gPSBDQU1fSEFMX1YxOworICAgIG1fcGFyZW50LT5tRXhpZlBhcmFtcy5zZW5zb3JfcGFyYW1zLnNlbnNfdHlwZSA9IG1fcGFyZW50LT5nZXRTZW5zb3JUeXBlKCk7CisgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcyA9IG1fcGFyZW50LT5tRXhpZlBhcmFtczsKKyAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcyA9CisgICAgICAgICAgICAobW1fanBlZ19kZWJ1Z19leGlmX3BhcmFtc190ICopIG1hbGxvYyAoc2l6ZW9mKG1tX2pwZWdfZGVidWdfZXhpZl9wYXJhbXNfdCkpOworICAgIGlmICghanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgTE9HRSgiT3V0IG9mIE1lbW9yeS4gQWxsb2NhdGlvbiBmYWlsZWQgZm9yIDNBIGRlYnVnIGV4aWYgcGFyYW1zIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAganBnX2pvYi5lbmNvZGVfam9iLm1vYmljYXRfbWFzayA9IG1fcGFyZW50LT5tUGFyYW1ldGVycy5nZXRNb2JpY2F0TWFzaygpOworCisKKyAgICBpZiAoTlVMTCAhPSBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YSAmJiAoanBnX2pvYi5lbmNvZGVfam9iLm1vYmljYXRfbWFzayA+IDApKSB7CisKKyAgICAgICBpZiAobV9wYXJlbnQtPm1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcykgeworICAgICAgICAgICBtZW1jcHkoanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcywgKHNpemVvZihtbV9qcGVnX2RlYnVnX2V4aWZfcGFyYW1zX3QpKSk7CisKKyAgICAgICAgICAgLyogU2F2ZSBhIGNvcHkgb2YgbW9iaWNhdCBwYXJhbXMgKi8KKyAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPmlzX21vYmljYXRfYWVjX3BhcmFtc192YWxpZCA9CisgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuY2FtXzNhX3BhcmFtc192YWxpZDsKKworICAgICAgICAgICBpZiAoanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5jYW1fM2FfcGFyYW1zX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5tb2JpY2F0X2FlY19wYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmNhbV8zYV9wYXJhbXM7CisgICAgICAgICAgIH0KKworICAgICAgICAgICAvKiBTYXZlIGEgY29weSBvZiAzQSBkZWJ1ZyBwYXJhbXMgKi8KKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19zdGF0c2RlYnVnX2FlX3BhcmFtc192YWxpZCA9CisgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5hZV9kZWJ1Z19wYXJhbXNfdmFsaWQ7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+aXNfc3RhdHNkZWJ1Z19hd2JfcGFyYW1zX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmF3Yl9kZWJ1Z19wYXJhbXNfdmFsaWQ7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+aXNfc3RhdHNkZWJ1Z19hZl9wYXJhbXNfdmFsaWQgPQorICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YWZfZGVidWdfcGFyYW1zX3ZhbGlkOworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPmlzX3N0YXRzZGVidWdfYXNkX3BhcmFtc192YWxpZCA9CisgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5hc2RfZGVidWdfcGFyYW1zX3ZhbGlkOworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPmlzX3N0YXRzZGVidWdfc3RhdHNfcGFyYW1zX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPnN0YXRzX2RlYnVnX3BhcmFtc192YWxpZDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19zdGF0c2RlYnVnX2Jlc3RhdHNfcGFyYW1zX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmJlc3RhdHNfZGVidWdfcGFyYW1zX3ZhbGlkOworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPmlzX3N0YXRzZGVidWdfYmhpc3RfcGFyYW1zX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmJoaXN0X2RlYnVnX3BhcmFtc192YWxpZDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19zdGF0c2RlYnVnXzNhX3R1bmluZ19wYXJhbXNfdmFsaWQgPQorICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+cTNhX3R1bmluZ19kZWJ1Z19wYXJhbXNfdmFsaWQ7CisKKyAgICAgICAgICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YWVfZGVidWdfcGFyYW1zX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPnN0YXRzZGVidWdfYWVfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YWVfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5hd2JfZGVidWdfcGFyYW1zX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPnN0YXRzZGVidWdfYXdiX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmF3Yl9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmFmX2RlYnVnX3BhcmFtc192YWxpZCkgeworICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5zdGF0c2RlYnVnX2FmX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmFmX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YXNkX2RlYnVnX3BhcmFtc192YWxpZCkgeworICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5zdGF0c2RlYnVnX2FzZF9kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5hc2RfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5zdGF0c19kZWJ1Z19wYXJhbXNfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+c3RhdHNkZWJ1Z19zdGF0c19idWZmZXJfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+c3RhdHNfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iZXN0YXRzX2RlYnVnX3BhcmFtc192YWxpZCkgeworICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5zdGF0c2RlYnVnX2Jlc3RhdHNfYnVmZmVyX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmJlc3RhdHNfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iaGlzdF9kZWJ1Z19wYXJhbXNfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+c3RhdHNkZWJ1Z19iaGlzdF9kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iaGlzdF9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPnEzYV90dW5pbmdfZGVidWdfcGFyYW1zX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPnN0YXRzZGVidWdfM2FfdHVuaW5nX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPnEzYV90dW5pbmdfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKiBJbml0IHRoZSBRVGFibGUgKi8KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFFUQUJMRV9NQVg7IGkrKykgeworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucXRhYmxlX3NldFtpXSA9IDA7CisgICAgfQorCisgICAgY29uc3QgY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCogcmVsYXRlZF9jYW1faW5mbyA9CisgICAgICAgICAgICBtX3BhcmVudC0+Z2V0UmVsYXRlZENhbVN5bmNJbmZvKCk7CisgICAgaWYgKHJlbGF0ZWRfY2FtX2luZm8tPnN5bmNfY29udHJvbCA9PSBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT04gJiYKKyAgICAgICAgICAgIG1fcGFyZW50LT5nZXRNcG9Db21wb3NpdGlvbigpKSB7CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tdWx0aV9pbWFnZV9pbmZvLnR5cGUgPSBNTV9KUEVHX1RZUEVfTVBPOworICAgICAgICBpZiAocmVsYXRlZF9jYW1faW5mby0+dHlwZSA9PSBDQU1fVFlQRV9NQUlOICkgeworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm11bHRpX2ltYWdlX2luZm8uaXNfcHJpbWFyeSA9IFRSVUU7CisgICAgICAgICAgICBMT0dEKCJFbmNvZGluZyBNUE8gUHJpbWFyeSBKUEVHIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubXVsdGlfaW1hZ2VfaW5mby5pc19wcmltYXJ5ID0gRkFMU0U7CisgICAgICAgICAgICBMT0dEKCJFbmNvZGluZyBNUE8gQXV4IEpQRUciKTsKKyAgICAgICAgfQorICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubXVsdGlfaW1hZ2VfaW5mby5udW1fb2ZfaW1hZ2VzID0gMjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJFbmNvZGluZyBTaW5nbGUgSlBFRyIpOworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubXVsdGlfaW1hZ2VfaW5mby50eXBlID0gTU1fSlBFR19UWVBFX0pQRUc7CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tdWx0aV9pbWFnZV9pbmZvLmlzX3ByaW1hcnkgPSBGQUxTRTsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm11bHRpX2ltYWdlX2luZm8ubnVtX29mX2ltYWdlcyA9IDE7CisgICAgfQorCisgICAgTE9HSSgiW0tQSSBQZXJmXSA6IFBST0ZJTEVfSlBFR19KT0JfU1RBUlQiKTsKKyAgICByZXQgPSBtSnBlZ0hhbmRsZS5zdGFydF9qb2IoJmpwZ19qb2IsICZqb2JJZCk7CisgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zKSB7CisgICAgICAgIGZyZWUoanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMpOworICAgIH0KKyAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIHJlbWVtYmVyIGpvYiBpbmZvCisgICAgICAgIGpwZWdfam9iX2RhdGEtPmpvYklkID0gam9iSWQ7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jZXNzUmF3SW1hZ2VJbXBsCisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIHNlbmQgcmF3IGltYWdlIHRvIHVwcGVyIGxheWVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEByZWN2ZF9mcmFtZSAgIDogZnJhbWUgdG8gYmUgZW5jb2RlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVBvc3RQcm9jZXNzb3I6OnByb2Nlc3NSYXdJbWFnZUltcGwobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBRQ2FtZXJhQ2hhbm5lbCAqcENoYW5uZWwgPSBtX3BhcmVudC0+Z2V0Q2hhbm5lbEJ5SGFuZGxlKHJlY3ZkX2ZyYW1lLT5jaF9pZCk7CisgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9IE5VTEw7CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqZnJhbWUgPSBOVUxMOworICAgIC8vIGNoZWNrIHJlcHJvY2VzcyBjaGFubmVsIGlmIG5vdCBmb3VuZAorICAgIGlmIChwQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgIGZvciAoaW50OF90IGkgPSAwOyBpIDwgbVBQQ2hhbm5lbENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmICgobVBQQ2hhbm5lbHNbaV0gIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1QUENoYW5uZWxzW2ldLT5nZXRNeUhhbmRsZSgpID09IHJlY3ZkX2ZyYW1lLT5jaF9pZCkpIHsKKyAgICAgICAgICAgICAgICBwQ2hhbm5lbCA9IG1QUENoYW5uZWxzW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5vIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCAoY2hfaWQgPSAlZCkgZXhpc3QsIHJldHVybiBoZXJlIiwKKyAgICAgICAgICAgICAgICByZWN2ZF9mcmFtZS0+Y2hfaWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIGZpbmQgc25hcHNob3QgZnJhbWUKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVjdmRfZnJhbWUtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgUUNhbWVyYVN0cmVhbSAqcEN1clN0cmVhbSA9CisgICAgICAgICAgICBwQ2hhbm5lbC0+Z2V0U3RyZWFtQnlIYW5kbGUocmVjdmRfZnJhbWUtPmJ1ZnNbaV0tPnN0cmVhbV9pZCk7CisgICAgICAgIGlmIChwQ3VyU3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChwQ3VyU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QpIHx8CisgICAgICAgICAgICAgICAgcEN1clN0cmVhbS0+aXNUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1JBVykgfHwKKyAgICAgICAgICAgICAgICBwQ3VyU3RyZWFtLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKSB8fAorICAgICAgICAgICAgICAgIHBDdXJTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfUkFXKSkgeworICAgICAgICAgICAgICAgIHBTdHJlYW0gPSBwQ3VyU3RyZWFtOworICAgICAgICAgICAgICAgIGZyYW1lID0gcmVjdmRfZnJhbWUtPmJ1ZnNbaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIE5VTEwgPT0gZnJhbWUgKSB7CisgICAgICAgIExPR0UoIk5vIHZhbGlkIHJhdyBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBRQ2FtZXJhTWVtb3J5ICpyYXdNZW1PYmogPSAoUUNhbWVyYU1lbW9yeSAqKWZyYW1lLT5tZW1faW5mbzsKKyAgICBib29sIHpzbENoYW5uZWxVc2VkID0gbV9wYXJlbnQtPmlzWlNMTW9kZSgpICYmCisgICAgICAgICAgICAoIHBDaGFubmVsICE9IG1QUENoYW5uZWxzWzBdICk7CisgICAgY2FtZXJhX21lbW9yeV90ICpyYXdfbWVtID0gTlVMTDsKKworICAgIGlmIChyYXdNZW1PYmogIT0gTlVMTCkgeworICAgICAgICBpZiAoenNsQ2hhbm5lbFVzZWQpIHsKKyAgICAgICAgICAgIHJhd19tZW0gPSByYXdNZW1PYmotPmdldE1lbW9yeShmcmFtZS0+YnVmX2lkeCwgZmFsc2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmF3X21lbSA9IG1fcGFyZW50LT5tR2V0TWVtb3J5KC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5mcmFtZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+bUNhbGxiYWNrQ29va2llKTsKKyAgICAgICAgICAgIGlmIChOVUxMID09IHJhd19tZW0pIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgUkFXIGNiICIpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkocmF3X21lbS0+ZGF0YSwgZnJhbWUtPmJ1ZmZlciwgZnJhbWUtPmZyYW1lX2xlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoTlVMTCAhPSByYXdNZW1PYmogJiYgTlVMTCAhPSByYXdfbWVtKSB7CisgICAgICAgIC8vIGR1bXAgZnJhbWUgaW50byBmaWxlCisgICAgICAgIGlmIChmcmFtZS0+c3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UIHx8CisgICAgICAgICAgICBwU3RyZWFtLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKSkgeworICAgICAgICAgICAgLy8gZm9yIFlVVjQyMiBOVjE2IGNhc2UKKyAgICAgICAgICAgIG1fcGFyZW50LT5kdW1wRnJhbWVUb0ZpbGUocFN0cmVhbSwgZnJhbWUsIFFDQU1FUkFfRFVNUF9GUk1fU05BUFNIT1QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9SZWNlaXZlZCBSQVcgc25hcHNob3QgdGFrZW4gbm90aWZpY2F0aW9uCisgICAgICAgICAgICBtX3BhcmVudC0+ZHVtcEZyYW1lVG9GaWxlKHBTdHJlYW0sIGZyYW1lLCBRQ0FNRVJBX0RVTVBfRlJNX1JBVyk7CisKKyAgICAgICAgICAgIGlmKHRydWUgPT0gbV9wYXJlbnQtPm1fYkludFJhd0V2dFBlbmRpbmcpIHsKKyAgICAgICAgICAgICAgLy9TZW5kaW5nIFJBVyBzbmFwc2hvdCB0YWtlbiBub3RpZmljYXRpb24gdG8gSEFMCisgICAgICAgICAgICAgIG1lbXNldCgmbV9kc3RfZGltLCAwLCBzaXplb2YobV9kc3RfZGltKSk7CisgICAgICAgICAgICAgIHBTdHJlYW0tPmdldEZyYW1lRGltZW5zaW9uKG1fZHN0X2RpbSk7CisgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9wYXJlbnQtPm1faW50X2xvY2spOworICAgICAgICAgICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZtX3BhcmVudC0+bV9pbnRfY29uZCk7CisgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX3BhcmVudC0+bV9pbnRfbG9jayk7CisgICAgICAgICAgICAgIHJhd19tZW0tPnJlbGVhc2UocmF3X21lbSk7CisgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNlbmQgZGF0YSBjYWxsYmFjayAvIG5vdGlmeSBmb3IgUkFXX0lNQUdFCisgICAgICAgIGlmIChOVUxMICE9IG1fcGFyZW50LT5tRGF0YUNiICYmCisgICAgICAgICAgICBtX3BhcmVudC0+bXNnVHlwZUVuYWJsZWRXaXRoTG9jayhDQU1FUkFfTVNHX1JBV19JTUFHRSkgPiAwKSB7CisgICAgICAgICAgICBxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCBjYkFyZzsKKyAgICAgICAgICAgIG1lbXNldCgmY2JBcmcsIDAsIHNpemVvZihxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCkpOworICAgICAgICAgICAgY2JBcmcuY2JfdHlwZSA9IFFDQU1FUkFfREFUQV9DQUxMQkFDSzsKKyAgICAgICAgICAgIGNiQXJnLm1zZ190eXBlID0gQ0FNRVJBX01TR19SQVdfSU1BR0U7CisgICAgICAgICAgICBjYkFyZy5kYXRhID0gcmF3X21lbTsKKyAgICAgICAgICAgIGNiQXJnLmluZGV4ID0gMDsKKyAgICAgICAgICAgIG1fcGFyZW50LT5tX2NiTm90aWZpZXIubm90aWZ5Q2FsbGJhY2soY2JBcmcpOworICAgICAgICB9CisgICAgICAgIGlmIChOVUxMICE9IG1fcGFyZW50LT5tTm90aWZ5Q2IgJiYKKyAgICAgICAgICAgIG1fcGFyZW50LT5tc2dUeXBlRW5hYmxlZFdpdGhMb2NrKENBTUVSQV9NU0dfUkFXX0lNQUdFX05PVElGWSkgPiAwKSB7CisgICAgICAgICAgICBxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCBjYkFyZzsKKyAgICAgICAgICAgIG1lbXNldCgmY2JBcmcsIDAsIHNpemVvZihxY2FtZXJhX2NhbGxiYWNrX2FyZ21fdCkpOworICAgICAgICAgICAgY2JBcmcuY2JfdHlwZSA9IFFDQU1FUkFfTk9USUZZX0NBTExCQUNLOworICAgICAgICAgICAgY2JBcmcubXNnX3R5cGUgPSBDQU1FUkFfTVNHX1JBV19JTUFHRV9OT1RJRlk7CisgICAgICAgICAgICBjYkFyZy5leHQxID0gMDsKKyAgICAgICAgICAgIGNiQXJnLmV4dDIgPSAwOworICAgICAgICAgICAgbV9wYXJlbnQtPm1fY2JOb3RpZmllci5ub3RpZnlDYWxsYmFjayhjYkFyZyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1fcGFyZW50LT5tRGF0YUNiICE9IE5VTEwpICYmCisgICAgICAgICAgICBtX3BhcmVudC0+bXNnVHlwZUVuYWJsZWRXaXRoTG9jayhDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UpID4gMCkgeworICAgICAgICAgICAgcWNhbWVyYV9yZWxlYXNlX2RhdGFfdCByZWxlYXNlX2RhdGE7CisgICAgICAgICAgICBtZW1zZXQoJnJlbGVhc2VfZGF0YSwgMCwgc2l6ZW9mKHFjYW1lcmFfcmVsZWFzZV9kYXRhX3QpKTsKKyAgICAgICAgICAgIGlmICggenNsQ2hhbm5lbFVzZWQgKSB7CisgICAgICAgICAgICAgICAgcmVsZWFzZV9kYXRhLmZyYW1lID0gcmVjdmRfZnJhbWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlbGVhc2VfZGF0YS5kYXRhID0gcmF3X21lbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJjID0gc2VuZERhdGFOb3RpZnkoQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVsZWFzZV9kYXRhKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJhd19tZW0tPnJlbGVhc2UocmF3X21lbSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJDYW5ub3QgZ2V0IHJhdyBtZW0iKTsKKyAgICAgICAgcmMgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkYXRhU2F2ZVJvdXRpbmUKKyAqCisgKiBERVNDUklQVElPTjogZGF0YSBzYXZpbmcgcm91dGluZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGF0YSAgICA6IHVzZXIgZGF0YSBwdHIgKFFDYW1lcmFQb3N0UHJvY2Vzc29yKQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgKlFDYW1lcmFQb3N0UHJvY2Vzc29yOjpkYXRhU2F2ZVJvdXRpbmUodm9pZCAqZGF0YSkKK3sKKyAgICBpbnQgcnVubmluZyA9IDE7CisgICAgaW50IHJldDsKKyAgICB1aW50OF90IGlzX2FjdGl2ZSA9IEZBTFNFOworICAgIFFDYW1lcmFQb3N0UHJvY2Vzc29yICpwbWUgPSAoUUNhbWVyYVBvc3RQcm9jZXNzb3IgKilkYXRhOworICAgIFFDYW1lcmFDbWRUaHJlYWQgKmNtZFRocmVhZCA9ICZwbWUtPm1fc2F2ZVByb2NUaDsKKyAgICBjbWRUaHJlYWQtPnNldE5hbWUoIkNBTV9KcGVnU2F2ZSIpOworICAgIGNoYXIgc2F2ZU5hbWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKworICAgIExPR0goIkUiKTsKKyAgICBkbyB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJldCA9IGNhbV9zZW1fd2FpdCgmY21kVGhyZWFkLT5jbWRfc2VtKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMCAmJiBlcnJubyAhPSBFSU5WQUwpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJjYW1fc2VtX3dhaXQgZXJyb3IgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAocmV0ICE9IDApOworCisgICAgICAgIC8vIHdlIGdvdCBub3RpZmllZCBhYm91dCBuZXcgY21kIGF2YWlsIGluIGNtZCBxdWV1ZQorICAgICAgICBjYW1lcmFfY21kX3R5cGVfdCBjbWQgPSBjbWRUaHJlYWQtPmdldENtZCgpOworICAgICAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgICBjYXNlIENBTUVSQV9DTURfVFlQRV9TVEFSVF9EQVRBX1BST0M6CisgICAgICAgICAgICBMT0dIKCJzdGFydCBkYXRhIHByb2MiKTsKKyAgICAgICAgICAgIGlzX2FjdGl2ZSA9IFRSVUU7CisgICAgICAgICAgICBwbWUtPm1faW5wdXRTYXZlUS5pbml0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1RZUEVfU1RPUF9EQVRBX1BST0M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTE9HSCgic3RvcCBkYXRhIHByb2MiKTsKKyAgICAgICAgICAgICAgICBpc19hY3RpdmUgPSBGQUxTRTsKKworICAgICAgICAgICAgICAgIC8vIGZsdXNoIGlucHV0IHNhdmUgUXVldWUKKyAgICAgICAgICAgICAgICBwbWUtPm1faW5wdXRTYXZlUS5mbHVzaCgpOworCisgICAgICAgICAgICAgICAgLy8gc2lnbmFsIGNtZCBpcyBjb21wbGV0ZWQKKyAgICAgICAgICAgICAgICBjYW1fc2VtX3Bvc3QoJmNtZFRocmVhZC0+c3luY19zZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBX0NNRF9UWVBFX0RPX05FWFRfSk9COgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExPR0goIkRvIG5leHQgam9iLCBhY3RpdmUgaXMgJWQiLCBpc19hY3RpdmUpOworCisgICAgICAgICAgICAgICAgcWNhbWVyYV9qcGVnX2V2dF9wYXlsb2FkX3QgKmpvYl9kYXRhID0gKHFjYW1lcmFfanBlZ19ldnRfcGF5bG9hZF90ICopIHBtZS0+bV9pbnB1dFNhdmVRLmRlcXVldWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoam9iX2RhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGpwZWcgZXZlbnQgZGF0YSIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9xY2FtZXJhX2pwZWdfZGF0YV90ICpqcGVnX2pvYiA9CisgICAgICAgICAgICAgICAgLy8gICAgICAgIChxY2FtZXJhX2pwZWdfZGF0YV90ICopcG1lLT5tX29uZ29pbmdKcGVnUS5kZXF1ZXVlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAvL3VpbnQzMl90IGZyYW1lX2lkeCA9IGpwZWdfam9iLT5zcmNfZnJhbWUtPmJ1ZnNbMF0tPmZyYW1lX2lkeDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBmcmFtZV9pZHggPSA3NTsKKworICAgICAgICAgICAgICAgIHBtZS0+bV9vbmdvaW5nSnBlZ1EuZmx1c2hOb2RlcyhtYXRjaEpvYklkLCAodm9pZCopJmpvYl9kYXRhLT5qb2JJZCk7CisKKyAgICAgICAgICAgICAgICBMT0dIKCJbS1BJIFBlcmZdIDoganBlZyBqb2IgJWQiLCBqb2JfZGF0YS0+am9iSWQpOworCisgICAgICAgICAgICAgICAgaWYgKGlzX2FjdGl2ZSA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChzYXZlTmFtZSwgJ1wwJywgc2l6ZW9mKHNhdmVOYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHNhdmVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2F2ZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhUG9zdFByb2Nlc3Nvcjo6U1RPUkVfTE9DQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+bVNhdmVGcm1DbnQpOworCisgICAgICAgICAgICAgICAgICAgIGludCBmaWxlX2ZkID0gb3BlbihzYXZlTmFtZSwgT19SRFdSIHwgT19DUkVBVCwgMDY1NSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlX2ZkID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3Qgd3JpdHRlbl9sZW4gPSB3cml0ZShmaWxlX2ZkLCBqb2JfZGF0YS0+b3V0X2RhdGEuYnVmX3ZhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JfZGF0YS0+b3V0X2RhdGEuYnVmX2ZpbGxlZF9sZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzc2l6ZV90KWpvYl9kYXRhLT5vdXRfZGF0YS5idWZfZmlsbGVkX2xlbiAhPSB3cml0dGVuX2xlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCBzYXZlIGNvbXBsZXRlIGRhdGEgJWQgYnl0ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0dGVuIGluc3RlYWQgb2YgJWQgYnl0ZXMhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iX2RhdGEtPm91dF9kYXRhLmJ1Zl9maWxsZWRfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HSCgid3JpdHRlbiBudW1iZXIgb2YgYnl0ZXMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGZpbGVfZmQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiZmFpbCB0IG9wZW4gZmlsZSBmb3Igc2F2aW5nIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcG1lLT5tU2F2ZUZybUNudCsrOworCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZW1vcnlfdCoganBlZ19tZW0gPSBwbWUtPm1fcGFyZW50LT5tR2V0TWVtb3J5KC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHNhdmVOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPm1fcGFyZW50LT5tQ2FsbGJhY2tDb29raWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCA9PSBqcGVnX21lbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiZ2V0TWVtb3J5IGZvciBqcGVnLCByZXQgPSBOT19NRU1PUlkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShqcGVnX21lbS0+ZGF0YSwgc2F2ZU5hbWUsIHN0cmxlbihzYXZlTmFtZSkpOworCisgICAgICAgICAgICAgICAgICAgIExPR0goIkNhbGxpbmcgdXBwZXJsYXllciBjYWxsYmFjayB0byBzdG9yZSBKUEVHIGltYWdlIik7CisgICAgICAgICAgICAgICAgICAgIHFjYW1lcmFfcmVsZWFzZV9kYXRhX3QgcmVsZWFzZV9kYXRhOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJnJlbGVhc2VfZGF0YSwgMCwgc2l6ZW9mKHFjYW1lcmFfcmVsZWFzZV9kYXRhX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9kYXRhLmRhdGEgPSBqcGVnX21lbTsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZV9kYXRhLnVubGlua0ZpbGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBMT0dJKCJbS1BJIFBlcmZdOiBQUk9GSUxFX0pQRUdfQ0IgIik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHBtZS0+c2VuZERhdGFOb3RpZnkoQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVsZWFzZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2lkeCk7CisgICAgICAgICAgICAgICAgfQorCitlbmQ6CisgICAgICAgICAgICAgICAgZnJlZShqb2JfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1RZUEVfRVhJVDoKKyAgICAgICAgICAgIExPR0goInNhdmUgdGhyZWFkIGV4aXQiKTsKKyAgICAgICAgICAgIHJ1bm5pbmcgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHJ1bm5pbmcpOworICAgIExPR0goIlgiKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkYXRhUHJvY2Vzc1JvdXRpbmUKKyAqCisgKiBERVNDUklQVElPTjogZGF0YSBwcm9jZXNzIHJvdXRpbmUgdGhhdCBoYW5kbGVzIGlucHV0IGRhdGEgZWl0aGVyIGZyb20gaW5wdXQKKyAqICAgICAgICAgICAgICBKcGVnIFF1ZXVlIHRvIGRvIGpwZWcgZW5jb2RpbmcsIG9yIGZyb20gaW5wdXQgUFAgUXVldWUgdG8gZG8KKyAqICAgICAgICAgICAgICByZXByb2Nlc3MuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkYXRhICAgIDogdXNlciBkYXRhIHB0ciAoUUNhbWVyYVBvc3RQcm9jZXNzb3IpCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCAqUUNhbWVyYVBvc3RQcm9jZXNzb3I6OmRhdGFQcm9jZXNzUm91dGluZSh2b2lkICpkYXRhKQoreworICAgIGludCBydW5uaW5nID0gMTsKKyAgICBpbnQgcmV0OworICAgIHVpbnQ4X3QgaXNfYWN0aXZlID0gRkFMU0U7CisgICAgUUNhbWVyYVBvc3RQcm9jZXNzb3IgKnBtZSA9IChRQ2FtZXJhUG9zdFByb2Nlc3NvciAqKWRhdGE7CisgICAgUUNhbWVyYUNtZFRocmVhZCAqY21kVGhyZWFkID0gJnBtZS0+bV9kYXRhUHJvY1RoOworICAgIGNtZFRocmVhZC0+c2V0TmFtZSgiQ0FNX0RhdGFQcm9jIik7CisKKyAgICBMT0dIKCJFIik7CisgICAgZG8geworICAgICAgICBkbyB7CisgICAgICAgICAgICByZXQgPSBjYW1fc2VtX3dhaXQoJmNtZFRocmVhZC0+Y21kX3NlbSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDAgJiYgZXJybm8gIT0gRUlOVkFMKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiY2FtX3NlbV93YWl0IGVycm9yICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAocmV0ICE9IDApOworCisgICAgICAgIC8vIHdlIGdvdCBub3RpZmllZCBhYm91dCBuZXcgY21kIGF2YWlsIGluIGNtZCBxdWV1ZQorICAgICAgICBjYW1lcmFfY21kX3R5cGVfdCBjbWQgPSBjbWRUaHJlYWQtPmdldENtZCgpOworICAgICAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgICBjYXNlIENBTUVSQV9DTURfVFlQRV9TVEFSVF9EQVRBX1BST0M6CisgICAgICAgICAgICBMT0dIKCJzdGFydCBkYXRhIHByb2MiKTsKKyAgICAgICAgICAgIGlzX2FjdGl2ZSA9IFRSVUU7CisKKyAgICAgICAgICAgIHBtZS0+bV9vbmdvaW5nUFBRLmluaXQoKTsKKyAgICAgICAgICAgIHBtZS0+bV9pbnB1dEpwZWdRLmluaXQoKTsKKyAgICAgICAgICAgIHBtZS0+bV9pbnB1dFBQUS5pbml0KCk7CisgICAgICAgICAgICBwbWUtPm1faW5wdXRSYXdRLmluaXQoKTsKKworICAgICAgICAgICAgcG1lLT5tX3NhdmVQcm9jVGguc2VuZENtZChDQU1FUkFfQ01EX1RZUEVfU1RBUlRfREFUQV9QUk9DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UpOworCisgICAgICAgICAgICAvLyBzaWduYWwgY21kIGlzIGNvbXBsZXRlZAorICAgICAgICAgICAgY2FtX3NlbV9wb3N0KCZjbWRUaHJlYWQtPnN5bmNfc2VtKTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNRVJBX0NNRF9UWVBFX1NUT1BfREFUQV9QUk9DOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExPR0goInN0b3AgZGF0YSBwcm9jIik7CisgICAgICAgICAgICAgICAgaXNfYWN0aXZlID0gRkFMU0U7CisKKyAgICAgICAgICAgICAgICBwbWUtPm1fc2F2ZVByb2NUaC5zZW5kQ21kKENBTUVSQV9DTURfVFlQRV9TVE9QX0RBVEFfUFJPQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUpOworICAgICAgICAgICAgICAgIC8vIGNhbmNlbCBhbGwgb25nb2luZyBqcGVnIGpvYnMKKyAgICAgICAgICAgICAgICBxY2FtZXJhX2pwZWdfZGF0YV90ICpqcGVnX2pvYiA9CisgICAgICAgICAgICAgICAgICAgIChxY2FtZXJhX2pwZWdfZGF0YV90ICopcG1lLT5tX29uZ29pbmdKcGVnUS5kZXF1ZXVlKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGpwZWdfam9iICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcG1lLT5tSnBlZ0hhbmRsZS5hYm9ydF9qb2IoanBlZ19qb2ItPmpvYklkKTsKKworICAgICAgICAgICAgICAgICAgICBwbWUtPnJlbGVhc2VKcGVnSm9iRGF0YShqcGVnX2pvYik7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoanBlZ19qb2IpOworCisgICAgICAgICAgICAgICAgICAgIGpwZWdfam9iID0gKHFjYW1lcmFfanBlZ19kYXRhX3QgKilwbWUtPm1fb25nb2luZ0pwZWdRLmRlcXVldWUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBkZXN0cm95IGpwZWcgZW5jb2Rpbmcgc2Vzc2lvbgorICAgICAgICAgICAgICAgIGlmICggMCA8IHBtZS0+bUpwZWdTZXNzaW9uSWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHBtZS0+bUpwZWdIYW5kbGUuZGVzdHJveV9zZXNzaW9uKHBtZS0+bUpwZWdTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBwbWUtPm1KcGVnU2Vzc2lvbklkID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmcmVlIGpwZWcgb3V0IGJ1ZiBhbmQgZXhpZiBvYmoKKyAgICAgICAgICAgICAgICBGUkVFX0pQRUdfT1VUUFVUX0JVRkZFUihwbWUtPm1fcEpwZWdPdXRwdXRNZW0sCisgICAgICAgICAgICAgICAgICAgIHBtZS0+bV9KcGVnT3V0cHV0TWVtQ291bnQpOworCisgICAgICAgICAgICAgICAgaWYgKHBtZS0+bV9wSnBlZ0V4aWZPYmogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgcG1lLT5tX3BKcGVnRXhpZk9iajsKKyAgICAgICAgICAgICAgICAgICAgcG1lLT5tX3BKcGVnRXhpZk9iaiA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZmx1c2ggb25nb2luZyBwb3N0cHJvYyBRdWV1ZQorICAgICAgICAgICAgICAgIHBtZS0+bV9vbmdvaW5nUFBRLmZsdXNoKCk7CisKKyAgICAgICAgICAgICAgICAvLyBmbHVzaCBpbnB1dCBqcGVnIFF1ZXVlCisgICAgICAgICAgICAgICAgcG1lLT5tX2lucHV0SnBlZ1EuZmx1c2goKTsKKworICAgICAgICAgICAgICAgIC8vIGZsdXNoIGlucHV0IFBvc3Rwcm9jIFF1ZXVlCisgICAgICAgICAgICAgICAgcG1lLT5tX2lucHV0UFBRLmZsdXNoKCk7CisKKyAgICAgICAgICAgICAgICAvLyBmbHVzaCBpbnB1dCByYXcgUXVldWUKKyAgICAgICAgICAgICAgICBwbWUtPm1faW5wdXRSYXdRLmZsdXNoKCk7CisKKyAgICAgICAgICAgICAgICAvLyBzaWduYWwgY21kIGlzIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgIGNhbV9zZW1fcG9zdCgmY21kVGhyZWFkLT5zeW5jX3NlbSk7CisKKyAgICAgICAgICAgICAgICBwbWUtPm1OZXdKcGVnU2Vzc2lvbk5lZWRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1RZUEVfRE9fTkVYVF9KT0I6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTE9HSCgiRG8gbmV4dCBqb2IsIGFjdGl2ZSBpcyAlZCIsIGlzX2FjdGl2ZSk7CisgICAgICAgICAgICAgICAgaWYgKGlzX2FjdGl2ZSA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgICAgIHFjYW1lcmFfanBlZ19kYXRhX3QgKmpwZWdfam9iID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChxY2FtZXJhX2pwZWdfZGF0YV90ICopcG1lLT5tX2lucHV0SnBlZ1EuZGVxdWV1ZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGpwZWdfam9iKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCBhbnkgcmFjZSBjb25kaXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3luYyBhbnkgc3RyZWFtIHNwZWNpZmljIHBhcmFtZXRlcnMgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbWUtPm1fcGFyZW50LT5tUGFyYW1ldGVycy5pc0FkdkNhbUZlYXR1cmVzRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3luYyBzdHJlYW0gcGFyYW1zLCBvbmx5IGlmIGFkdmFuY2VkIGZlYXR1cmVzIGNvbmZpZ3VyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWR1Y2VzIHRoZSBsYXRlbmN5IGZvciBub3JtYWwgc25hcHNob3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5zeW5jU3RyZWFtUGFyYW1zKGpwZWdfam9iLT5zcmNfZnJhbWUsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgaW50byBvbmdvaW5nIGpwZWcgam9iIFEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbWUtPm1fb25nb2luZ0pwZWdRLmVucXVldWUoKHZvaWQgKilqcGVnX2pvYikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBwbWUtPmVuY29kZURhdGEoanBlZ19qb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+bU5ld0pwZWdTZXNzaW9uTmVlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcXVldWUgdGhlIGxhc3Qgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+bV9vbmdvaW5nSnBlZ1EuZGVxdWV1ZShmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+cmVsZWFzZUpwZWdKb2JEYXRhKGpwZWdfam9iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShqcGVnX2pvYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfam9iID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5zZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsIFVOS05PV05fRVJST1IsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HVygibV9vbmdvaW5nSnBlZ1EgaXMgbm90IGFjdGl2ZSEhISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+cmVsZWFzZUpwZWdKb2JEYXRhKGpwZWdfam9iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGpwZWdfam9iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnX2pvYiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgcmF3IGRhdGEgaWYgYW55CisgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3VwZXJfYnVmID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKilwbWUtPm1faW5wdXRSYXdRLmRlcXVldWUoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBzdXBlcl9idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcGxheSBzaHV0dGVyIHNvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPm1fcGFyZW50LT5wbGF5U2h1dHRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcG1lLT5wcm9jZXNzUmF3SW1hZ2VJbXBsKHN1cGVyX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5yZWxlYXNlU3VwZXJCdWYoc3VwZXJfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHN1cGVyX2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5zZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsIFVOS05PV05fRVJST1IsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gcG1lLT5kb1JlcHJvY2VzcygpOworICAgICAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPnNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwgVU5LTk9XTl9FUlJPUiwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBwbWUtPnN0b3BDYXB0dXJlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhY3RpdmUsIHNpbXBseSByZXR1cm4gYnVmIGFuZCBkbyBubyBvcAorICAgICAgICAgICAgICAgICAgICBxY2FtZXJhX2pwZWdfZGF0YV90ICpqcGVnX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHFjYW1lcmFfanBlZ19kYXRhX3QgKilwbWUtPm1faW5wdXRKcGVnUS5kZXF1ZXVlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGpwZWdfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5yZWxlYXNlSnBlZ0pvYkRhdGEoanBlZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoanBlZ19kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2J1ZiA9CisgICAgICAgICAgICAgICAgICAgICAgICAobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICopcG1lLT5tX2lucHV0UmF3US5kZXF1ZXVlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IHN1cGVyX2J1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5yZWxlYXNlU3VwZXJCdWYoc3VwZXJfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoc3VwZXJfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGZsdXNoIGlucHV0IFBvc3Rwcm9jIFF1ZXVlCisgICAgICAgICAgICAgICAgICAgIHBtZS0+bV9pbnB1dFBQUS5mbHVzaCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9DTURfVFlQRV9FWElUOgorICAgICAgICAgICAgcnVubmluZyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAocnVubmluZyk7CisgICAgTE9HSCgiWCIpOworICAgIHJldHVybiBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGRvUmVwcm9jZXNzCisgKgorICogREVTQ1JJUFRJT046IFRyaWdnZXIgY2hhbm5lbCByZXByb2Nlc3NpbmcKKyAqCisgKiBQQVJBTUVURVJTIDpOb25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUG9zdFByb2Nlc3Nvcjo6ZG9SZXByb2Nlc3MoKQoreworICAgIGludDMyX3QgcmV0ID0gTk9fRVJST1I7CisgICAgUUNhbWVyYUNoYW5uZWwgKm1fcFNyY0NoYW5uZWwgPSBOVUxMOworICAgIFFDYW1lcmFTdHJlYW0gKnBNZXRhU3RyZWFtID0gTlVMTDsKKyAgICB1aW50OF90IG1ldGFfYnVmX2luZGV4ID0gMDsKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICptZXRhX2J1ZiA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpwcElucHV0RnJhbWUgPSBOVUxMOworCisgICAgcWNhbWVyYV9wcF9kYXRhX3QgKnBwcmVxX2pvYiA9IChxY2FtZXJhX3BwX2RhdGFfdCAqKW1faW5wdXRQUFEucGVlaygpOworICAgIGlmICgocHByZXFfam9iID09IE5VTEwpIHx8IChwcHJlcV9qb2ItPnNyY19mcmFtZSA9PSBOVUxMKSkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICghdmFsaWRhdGVQb3N0UHJvY2VzcyhwcHJlcV9qb2ItPnNyY19mcmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwcHJlcV9qb2IgPSAocWNhbWVyYV9wcF9kYXRhX3QgKiltX2lucHV0UFBRLmRlcXVldWUoKTsKKyAgICBpZiAocHByZXFfam9iID09IE5VTEwgfHwgcHByZXFfam9iLT5zcmNfZnJhbWUgPT0gTlVMTCB8fAorICAgICAgICAgICAgcHByZXFfam9iLT5zcmNfcmVwcm9jX2ZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnNyY19mcmFtZSA9IHBwcmVxX2pvYi0+c3JjX2ZyYW1lOworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3JjX3JlcHJvY19mcmFtZSA9IHBwcmVxX2pvYi0+c3JjX3JlcHJvY19mcmFtZTsKKyAgICBpbnQ4X3QgbUN1clJlcHJvY0NvdW50ID0gcHByZXFfam9iLT5yZXByb2NDb3VudDsKKyAgICBpbnQ4X3QgbUN1ckNoYW5uZWxJZHggPSBwcHJlcV9qb2ItPnBwQ2hhbm5lbEluZGV4OworCisgICAgTE9HRCgiZnJhbWUgPSAlcCBzcmNfZnJhbWUgPSAlcCBtQ3VyUmVwcm9jQ291bnQgPSAlZCBtQ3VyQ2hhbm5lbElkeCA9ICVkIiwKKyAgICAgICAgICAgIHNyY19mcmFtZSxzcmNfcmVwcm9jX2ZyYW1lLG1DdXJSZXByb2NDb3VudCwgbUN1ckNoYW5uZWxJZHgpOworCisgICAgaWYgKChtX3BhcmVudC0+bVBhcmFtZXRlcnMuZ2V0TWFudWFsQ2FwdHVyZU1vZGUoKSA+PQorICAgICAgICAgICAgQ0FNX01BTlVBTF9DQVBUVVJFX1RZUEVfMykgICYmIChtQ3VyQ2hhbm5lbElkeCA9PSAwKSkgeworICAgICAgICBwcElucHV0RnJhbWUgPSBzcmNfcmVwcm9jX2ZyYW1lOworICAgIH0gZWxzZSB7CisgICAgICAgIHBwSW5wdXRGcmFtZSA9IHNyY19mcmFtZTsKKyAgICB9CisKKyAgICBpZiAobVBQQ2hhbm5lbENvdW50ID49IENBTV9QUF9DSEFOTkVMX01BWCkgeworICAgICAgICBMT0dFKCJpbnZhbGlkIGNoYW5uZWwgY291bnQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gZmluZCBtZXRhIGRhdGEgc3RyZWFtIGFuZCBpbmRleCBvZiBtZXRhIGRhdGEgZnJhbWUgaW4gdGhlIHN1cGVyYnVmCisgICAgZm9yIChpbnQ4X3QgaiA9IDA7IGogPCBtUFBDaGFubmVsQ291bnQ7IGorKykgeworICAgICAgICAvKkZpcnN0IHNlYXJjaCBpbiBzcmMgYnVmZmVyIGZvciBhbnkgb2ZmbGluZSBtZXRhZGF0YSAqLworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3JjX2ZyYW1lLT5udW1fYnVmczsgaSsrKSB7CisgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0gbVBQQ2hhbm5lbHNbal0tPmdldFN0cmVhbUJ5SGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBzcmNfZnJhbWUtPmJ1ZnNbaV0tPnN0cmVhbV9pZCk7CisgICAgICAgICAgICBpZiAocFN0cmVhbSAhPSBOVUxMICYmIHBTdHJlYW0tPmlzT3JpZ25hbFR5cGVPZihDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpKSB7CisgICAgICAgICAgICAgICAgbWV0YV9idWZfaW5kZXggPSAodWludDhfdCkgc3JjX2ZyYW1lLT5idWZzW2ldLT5idWZfaWR4OworICAgICAgICAgICAgICAgIHBNZXRhU3RyZWFtID0gcFN0cmVhbTsKKyAgICAgICAgICAgICAgICBtZXRhX2J1ZiA9IHNyY19mcmFtZS0+YnVmc1tpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICgocE1ldGFTdHJlYW0gIT0gTlVMTCkgJiYgKG1ldGFfYnVmICE9IE5VTEwpKSB7CisgICAgICAgICAgICBMT0dEKCJGb3VuZCBPZmZsaW5lIHN0cmVhbSBtZXRhZGF0YSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgKGludCltZXRhX2J1Zl9pbmRleCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocE1ldGFTdHJlYW0gPT0gTlVMTCkgJiYgKG1ldGFfYnVmID09IE5VTEwpKSB7CisgICAgICAgIGZvciAoaW50OF90IGogPSAwOyBqIDwgbVBQQ2hhbm5lbENvdW50OyBqKyspIHsKKyAgICAgICAgICAgIG1fcFNyY0NoYW5uZWwgPSBtUFBDaGFubmVsc1tqXS0+Z2V0U3JjQ2hhbm5lbCgpOworICAgICAgICAgICAgaWYgKG1fcFNyY0NoYW5uZWwgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzcmNfcmVwcm9jX2ZyYW1lLT5udW1fYnVmczsgaSsrKSB7CisgICAgICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqcFN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3BTcmNDaGFubmVsLT5nZXRTdHJlYW1CeUhhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY19yZXByb2NfZnJhbWUtPmJ1ZnNbaV0tPnN0cmVhbV9pZCk7CisgICAgICAgICAgICAgICAgaWYgKHBTdHJlYW0gIT0gTlVMTCAmJiBwU3RyZWFtLT5pc1R5cGVPZihDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpKSB7CisgICAgICAgICAgICAgICAgICAgIG1ldGFfYnVmX2luZGV4ID0gKHVpbnQ4X3QpIHNyY19yZXByb2NfZnJhbWUtPmJ1ZnNbaV0tPmJ1Zl9pZHg7CisgICAgICAgICAgICAgICAgICAgIHBNZXRhU3RyZWFtID0gcFN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgbWV0YV9idWYgPSBzcmNfcmVwcm9jX2ZyYW1lLT5idWZzW2ldOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHBNZXRhU3RyZWFtICE9IE5VTEwpICYmIChtZXRhX2J1ZiAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgIExPR0QoIkZvdW5kIE1ldGEgZGF0YSBpbmZvIGZvciByZXByb2Nlc3NpbmcgaW5kZXggPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1ldGFfYnVmX2luZGV4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtX3BhcmVudC0+bVBhcmFtZXRlcnMuaXNBZHZDYW1GZWF0dXJlc0VuYWJsZWQoKSkgeworICAgICAgICAvLyBObyBuZWVkIHRvIHN5bmMgc3RyZWFtIHBhcmFtcywgaWYgbm9uZSBvZiB0aGUgYWR2YW5jZWQgZmVhdHVyZXMgY29uZmlndXJlZAorICAgICAgICAvLyBSZWR1Y2VzIHRoZSBsYXRlbmN5IGZvciBub3JtYWwgc25hcHNob3QuCisgICAgICAgIHN5bmNTdHJlYW1QYXJhbXMoc3JjX2ZyYW1lLCBzcmNfcmVwcm9jX2ZyYW1lKTsKKyAgICB9CisgICAgaWYgKG1QUENoYW5uZWxzW21DdXJDaGFubmVsSWR4XSAhPSBOVUxMKSB7CisgICAgICAgIC8vIGFkZCBpbnRvIG9uZ29pbmcgUFAgam9iIFEKKyAgICAgICAgcHByZXFfam9iLT5yZXByb2NDb3VudCA9IChpbnQ4X3QpIChtQ3VyUmVwcm9jQ291bnQgKyAxKTsKKworICAgICAgICBpZiAoKG1fcGFyZW50LT5pc1JlZ3VsYXJDYXB0dXJlKCkpIHx8IChwcHJlcV9qb2ItPm9mZmxpbmVfYnVmZmVyKSkgeworICAgICAgICAgICAgbV9idWZDb3VudFBQUSsrOworICAgICAgICAgICAgaWYgKG1fb25nb2luZ1BQUS5lbnF1ZXVlKCh2b2lkICopcHByZXFfam9iKSkgeworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9yZXByb2Nlc3NfbG9jayk7CisgICAgICAgICAgICAgICAgcmV0ID0gbVBQQ2hhbm5lbHNbbUN1ckNoYW5uZWxJZHhdLT5kb1JlcHJvY2Vzc09mZmxpbmUocHBJbnB1dEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YV9idWYsIG1fcGFyZW50LT5tUGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9yZXByb2Nlc3NfbG9jayk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgocHByZXFfam9iLT5vZmZsaW5lX2J1ZmZlcikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChwcHJlcV9qb2ItPm9mZmxpbmVfcmVwcm9jX2J1ZikpIHsKKyAgICAgICAgICAgICAgICAgICAgbVBQQ2hhbm5lbHNbbUN1ckNoYW5uZWxJZHhdLT5kb1JlcHJvY2Vzc09mZmxpbmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHByZXFfam9iLT5vZmZsaW5lX3JlcHJvY19idWYsIG1ldGFfYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fcmVwcm9jZXNzX2xvY2spOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJtX29uZ29pbmdQUFEgaXMgbm90IGFjdGl2ZSEhISIpOworICAgICAgICAgICAgICAgIHJldCA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2J1ZkNvdW50UFBRKys7CisgICAgICAgICAgICBpZiAoIW1fb25nb2luZ1BQUS5lbnF1ZXVlKCh2b2lkICopcHByZXFfam9iKSkgeworICAgICAgICAgICAgICAgIExPR1coIm1fb25nb2luZ0pwZWdRIGlzIG5vdCBhY3RpdmUhISEiKTsKKyAgICAgICAgICAgICAgICByZXQgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IG51bVJlcXVpcmVkUFBRQnVmc0ZvclNpbmdsZU91dHB1dCA9IChpbnQzMl90KQorICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+bVBhcmFtZXRlcnMuZ2V0TnVtYmVySW5CdWZzRm9yU2luZ2xlU2hvdCgpOworCisgICAgICAgICAgICBpZiAobV9idWZDb3VudFBQUSAlIG51bVJlcXVpcmVkUFBRQnVmc0ZvclNpbmdsZU91dHB1dCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBleHRyYV9wcF9qb2JfY291bnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdldE51bWJlck91dEJ1ZnNGb3JTaW5nbGVTaG90KCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdldE51bWJlckluQnVmc0ZvclNpbmdsZVNob3QoKTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGV4dHJhX3BwX2pvYl9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHFjYW1lcmFfcHBfZGF0YV90ICpleHRyYV9wcF9qb2IgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxY2FtZXJhX3BwX2RhdGFfdCAqKWNhbGxvYygxLCBzaXplb2YocWNhbWVyYV9wcF9kYXRhX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFleHRyYV9wcF9qb2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIm5vIG1lbSBmb3IgcWNhbWVyYV9wcF9kYXRhX3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGV4dHJhX3BwX2pvYi0+cmVwcm9jQ291bnQgPSBwcHJlcV9qb2ItPnJlcHJvY0NvdW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIW1fb25nb2luZ1BQUS5lbnF1ZXVlKCh2b2lkICopZXh0cmFfcHBfam9iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HVygibV9vbmdvaW5nSnBlZ1EgaXMgbm90IGFjdGl2ZSEhISIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZU9uZ29pbmdQUERhdGEoZXh0cmFfcHBfam9iLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZXh0cmFfcHBfam9iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3BwX2pvYiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gbVBQQ2hhbm5lbHNbbUN1ckNoYW5uZWxJZHhdLT5kb1JlcHJvY2VzcyhwcElucHV0RnJhbWUsCisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5tUGFyYW1ldGVycywgcE1ldGFTdHJlYW0sIG1ldGFfYnVmX2luZGV4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIlJlcHJvY2VzcyBjaGFubmVsIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKK2VuZDoKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJlbGVhc2VPbmdvaW5nUFBEYXRhKHBwcmVxX2pvYiwgdGhpcyk7CisgICAgICAgIGlmIChwcHJlcV9qb2IgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZShwcHJlcV9qb2IpOworICAgICAgICAgICAgcHByZXFfam9iID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFJlcHJvY0NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogIFJldHVybnMgcmVwcm9jZXNzaW5nIGNoYW5uZWwgaGFuZGxlCisgKgorICogUEFSQU1FVEVSUyA6IGluZGV4IGZvciByZXByb2Nlc3NpbmcgYXJyYXkKKyAqCisgKiBSRVRVUk4gICAgIDogUUNhbWVyYVJlcHJvY2Vzc0NoYW5uZWwgKiB0eXBlIG9mIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBubyByZXByb2Nlc3NpbmcgY2hhbm5lbAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbCAqIFFDYW1lcmFQb3N0UHJvY2Vzc29yOjpnZXRSZXByb2NDaGFubmVsKHVpbnQ4X3QgaW5kZXgpCit7CisgICAgaWYgKGluZGV4ID49IG1QUENoYW5uZWxDb3VudCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGluZGV4IHZhbHVlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbVBQQ2hhbm5lbHNbaW5kZXhdOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0b3BDYXB0dXJlCisgKgorICogREVTQ1JJUFRJT046IFRyaWdnZXIgaW1hZ2UgY2FwdHVyZSBzdG9wCisgKgorICogUEFSQU1FVEVSUyA6CisgKiBOb25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUG9zdFByb2Nlc3Nvcjo6c3RvcENhcHR1cmUoKQoreworICAgICBpbnQgcmMgPSBOT19FUlJPUjsKKworICAgICBpZiAobV9wYXJlbnQtPmlzUmVndWxhckNhcHR1cmUoKSkgeworICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzQVBJKAorICAgICAgICAgICAgICAgICAgICAgICAgUUNBTUVSQV9TTV9FVlRfU1RPUF9DQVBUVVJFX0NIQU5ORUwsCisgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgfQorCisgICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRKcGVnUGFkZGluZ1JlcQorICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byBhZGQgYW4gZW50cnkgdG8gZXhpZiBkYXRhCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYWRkaW5nX2luZm8gOiBqcGVnIHNwZWNpZmljIHBhZGRpbmcgcmVxdWlyZW1lbnQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQb3N0UHJvY2Vzc29yOjpnZXRKcGVnUGFkZGluZ1JlcShjYW1fcGFkZGluZ19pbmZvX3QgJnBhZGRpbmdfaW5mbykKK3sKKyAgICAvLyBUT0RPOiBoYXJkY29kZSBmb3Igbm93LCBuZWVkcyB0byBxdWVyeSBmcm9tIG1tLWpwZWctaW50ZXJmYWNlCisgICAgcGFkZGluZ19pbmZvLndpZHRoX3BhZGRpbmcgID0gQ0FNX1BBRF9OT05FOworICAgIHBhZGRpbmdfaW5mby5oZWlnaHRfcGFkZGluZyAgPSBDQU1fUEFEX1RPXzE2OworICAgIHBhZGRpbmdfaW5mby5wbGFuZV9wYWRkaW5nICA9IENBTV9QQURfVE9fV09SRDsKKyAgICBwYWRkaW5nX2luZm8ub2Zmc2V0X2luZm8ub2Zmc2V0X3ggPSAwOworICAgIHBhZGRpbmdfaW5mby5vZmZzZXRfaW5mby5vZmZzZXRfeSA9IDA7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFlVVkZyYW1lSW5mbworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgUmF3IFlVViBmcmFtZSBkYXRhIGluZm8gZm9yIHVwLWxheWVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmcmFtZSAgIDogcHJvY2VzcyBmcmFtZSByZWNlaXZlZCBmcm9tIG1tLWNhbWVyYS1pbnRlcmZhY2UKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICoKKyAqIE5PVEUgICAgICAgOiBjdXJyZW50bHkgd2UgcmV0dXJuIGZyYW1lIGxlbiwgeSBvZmZzZXQsIGNiY3Igb2Zmc2V0IGFuZCBmcmFtZSBmb3JtYXQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUG9zdFByb2Nlc3Nvcjo6c2V0WVVWRnJhbWVJbmZvKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVjdmRfZnJhbWUpCit7CisgICAgUUNhbWVyYUNoYW5uZWwgKnBDaGFubmVsID0gbV9wYXJlbnQtPmdldENoYW5uZWxCeUhhbmRsZShyZWN2ZF9mcmFtZS0+Y2hfaWQpOworICAgIC8vIGNoZWNrIHJlcHJvY2VzcyBjaGFubmVsIGlmIG5vdCBmb3VuZAorICAgIGlmIChwQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgIGZvciAoaW50OF90IGkgPSAwOyBpIDwgbVBQQ2hhbm5lbENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmICgobVBQQ2hhbm5lbHNbaV0gIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1QUENoYW5uZWxzW2ldLT5nZXRNeUhhbmRsZSgpID09IHJlY3ZkX2ZyYW1lLT5jaF9pZCkpIHsKKyAgICAgICAgICAgICAgICBwQ2hhbm5lbCA9IG1QUENoYW5uZWxzW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBDaGFubmVsID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiTm8gY29ycmVzcG9uZGluZyBjaGFubmVsIChjaF9pZCA9ICVkKSBleGlzdCwgcmV0dXJuIGhlcmUiLAorICAgICAgICAgICAgICAgIHJlY3ZkX2ZyYW1lLT5jaF9pZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gZmluZCBzbmFwc2hvdCBmcmFtZQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWN2ZF9mcmFtZS0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICBRQ2FtZXJhU3RyZWFtICpwU3RyZWFtID0KKyAgICAgICAgICAgIHBDaGFubmVsLT5nZXRTdHJlYW1CeUhhbmRsZShyZWN2ZF9mcmFtZS0+YnVmc1tpXS0+c3RyZWFtX2lkKTsKKyAgICAgICAgaWYgKHBTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKHBTdHJlYW0tPmlzVHlwZU9mKENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCkgfHwKKyAgICAgICAgICAgICAgICBwU3RyZWFtLT5pc09yaWduYWxUeXBlT2YoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKSkgeworICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBtYWluIGZyYW1lLCB1c2Ugc3RyZWFtIGluZm8KKyAgICAgICAgICAgICAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90IGZyYW1lX29mZnNldDsKKyAgICAgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3QgZnJhbWVfZGltOworICAgICAgICAgICAgICAgIGNhbV9mb3JtYXRfdCBmcmFtZV9mbXQ7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm10X3N0cmluZzsKKyAgICAgICAgICAgICAgICBwU3RyZWFtLT5nZXRGcmFtZURpbWVuc2lvbihmcmFtZV9kaW0pOworICAgICAgICAgICAgICAgIHBTdHJlYW0tPmdldEZyYW1lT2Zmc2V0KGZyYW1lX29mZnNldCk7CisgICAgICAgICAgICAgICAgcFN0cmVhbS0+Z2V0Rm9ybWF0KGZyYW1lX2ZtdCk7CisgICAgICAgICAgICAgICAgZm10X3N0cmluZyA9IG1fcGFyZW50LT5tUGFyYW1ldGVycy5nZXRGcmFtZUZtdFN0cmluZyhmcmFtZV9mbXQpOworCisgICAgICAgICAgICAgICAgaW50IGNiY3Jfb2Zmc2V0ID0gKGludDMyX3QpZnJhbWVfb2Zmc2V0Lm1wWzBdLmxlbiAtCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9kaW0ud2lkdGggKiBmcmFtZV9kaW0uaGVpZ2h0OworCisgICAgICAgICAgICAgICAgTE9HSCgiZnJhbWUgd2lkdGg9JWQsIGhlaWdodD0lZCwgeW9mZj0lZCwgY2Jjcm9mZj0lZCwgZm10X3N0cmluZz0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9kaW0ud2lkdGgsIGZyYW1lX2RpbS5oZWlnaHQsIGZyYW1lX29mZnNldC5tcFswXS5vZmZzZXQsIGNiY3Jfb2Zmc2V0LCBmbXRfc3RyaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitib29sIFFDYW1lcmFQb3N0UHJvY2Vzc29yOjptYXRjaEpvYklkKHZvaWQgKmRhdGEsIHZvaWQgKiwgdm9pZCAqbWF0Y2hfZGF0YSkKK3sKKyAgcWNhbWVyYV9qcGVnX2RhdGFfdCAqIGpvYiA9IChxY2FtZXJhX2pwZWdfZGF0YV90ICopIGRhdGE7CisgIHVpbnQzMl90IGpvYl9pZCA9ICooKHVpbnQzMl90ICopIG1hdGNoX2RhdGEpOworICByZXR1cm4gam9iLT5qb2JJZCA9PSBqb2JfaWQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0SnBlZ01lbW9yeQorICoKKyAqIERFU0NSSVBUSU9OOiBidWZmZXIgYWxsb2NhdGlvbiBmdW5jdGlvbgorICogICB0byBwYXNzIHRvIGpwZWcgaW50ZXJmYWNlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBvdXRfYnVmIDogYnVmZmVyIGRlc2NyaXB0b3Igc3RydWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmFQb3N0UHJvY2Vzc29yOjpnZXRKcGVnTWVtb3J5KG9teF9qcGVnX291cHV0X2J1Zl90ICpvdXRfYnVmKQoreworICAgIExPR0goIkFsbG9jYXRpbmcganBlZyBvdXQgYnVmZmVyIG9mIHNpemU6ICVkIiwgb3V0X2J1Zi0+c2l6ZSk7CisgICAgUUNhbWVyYVBvc3RQcm9jZXNzb3IgKnByb2NJbnN0ID0gKFFDYW1lcmFQb3N0UHJvY2Vzc29yICopIG91dF9idWYtPmhhbmRsZTsKKyAgICBjYW1lcmFfbWVtb3J5X3QgKmNhbV9tZW0gPSBwcm9jSW5zdC0+bV9wYXJlbnQtPm1HZXRNZW1vcnkob3V0X2J1Zi0+ZmQsIG91dF9idWYtPnNpemUsIDFVLAorICAgICAgICAgICAgcHJvY0luc3QtPm1fcGFyZW50LT5tQ2FsbGJhY2tDb29raWUpOworICAgIG91dF9idWYtPm1lbV9oZGwgPSBjYW1fbWVtOworICAgIG91dF9idWYtPnZhZGRyID0gY2FtX21lbS0+ZGF0YTsKKworICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbGVhc2VKcGVnTWVtb3J5CisgKgorICogREVTQ1JJUFRJT046IHJlbGVhc2UganBlZyBtZW1vcnkgZnVuY3Rpb24KKyAqICAgdG8gcGFzcyB0byBqcGVnIGludGVyZmFjZSwgaW4gY2FzZSBvZiBhYm9ydAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb3V0X2J1ZiA6IGJ1ZmZlciBkZXNjcmlwdG9yIHN0cnVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhUG9zdFByb2Nlc3Nvcjo6cmVsZWFzZUpwZWdNZW1vcnkob214X2pwZWdfb3VwdXRfYnVmX3QgKm91dF9idWYpCit7CisgICAgaWYgKG91dF9idWYgJiYgb3V0X2J1Zi0+bWVtX2hkbCkgeworICAgICAgTE9HRCgicmVsZWFzaW5nIGpwZWcgb3V0IGJ1ZmZlciBvZiBzaXplOiAlZCIsIG91dF9idWYtPnNpemUpOworICAgICAgY2FtZXJhX21lbW9yeV90ICpjYW1fbWVtID0gKGNhbWVyYV9tZW1vcnlfdCopb3V0X2J1Zi0+bWVtX2hkbDsKKyAgICAgIGNhbV9tZW0tPnJlbGVhc2UoY2FtX21lbSk7CisgICAgICBvdXRfYnVmLT5tZW1faGRsID0gTlVMTDsKKyAgICAgIG91dF9idWYtPnZhZGRyID0gTlVMTDsKKyAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmFFeGlmCisgKgorICogREVTQ1JJUFRJT046IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmFFeGlmCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhRXhpZjo6UUNhbWVyYUV4aWYoKQorICAgIDogbV9uTnVtRW50cmllcygwKQoreworICAgIG1lbXNldChtX0VudHJpZXMsIDAsIHNpemVvZihtX0VudHJpZXMpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYUV4aWYKKyAqCisgKiBERVNDUklQVElPTjogZGVjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhRXhpZi4gV2lsbCByZWxlYXNlIGludGVybmFsIG1lbW9yeSBwdHIuCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhRXhpZjo6flFDYW1lcmFFeGlmKCkKK3sKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uTnVtRW50cmllczsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobV9FbnRyaWVzW2ldLnRhZ19lbnRyeS50eXBlKSB7CisgICAgICAgIGNhc2UgRVhJRl9CWVRFOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtX0VudHJpZXNbaV0udGFnX2VudHJ5LmNvdW50ID4gMSAmJgorICAgICAgICAgICAgICAgICAgICBtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX2J5dGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX2J5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgbV9FbnRyaWVzW2ldLnRhZ19lbnRyeS5kYXRhLl9ieXRlcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVhJRl9BU0NJSToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobV9FbnRyaWVzW2ldLnRhZ19lbnRyeS5kYXRhLl9hc2NpaSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGZyZWUobV9FbnRyaWVzW2ldLnRhZ19lbnRyeS5kYXRhLl9hc2NpaSk7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fYXNjaWkgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVYSUZfU0hPUlQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1fRW50cmllc1tpXS50YWdfZW50cnkuY291bnQgPiAxICYmCisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fc2hvcnRzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX3Nob3J0cyk7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fc2hvcnRzID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFWElGX0xPTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1fRW50cmllc1tpXS50YWdfZW50cnkuY291bnQgPiAxICYmCisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fbG9uZ3MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmcmVlKG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fbG9uZ3MpOworICAgICAgICAgICAgICAgICAgICBtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX2xvbmdzID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFWElGX1JBVElPTkFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtX0VudHJpZXNbaV0udGFnX2VudHJ5LmNvdW50ID4gMSAmJgorICAgICAgICAgICAgICAgICAgICBtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX3JhdHMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmcmVlKG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fcmF0cyk7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fcmF0cyA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVhJRl9VTkRFRklORUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fdW5kZWZpbmVkICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX3VuZGVmaW5lZCk7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fdW5kZWZpbmVkID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFWElGX1NMT05HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtX0VudHJpZXNbaV0udGFnX2VudHJ5LmNvdW50ID4gMSAmJgorICAgICAgICAgICAgICAgICAgICBtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX3Nsb25ncyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGZyZWUobV9FbnRyaWVzW2ldLnRhZ19lbnRyeS5kYXRhLl9zbG9uZ3MpOworICAgICAgICAgICAgICAgICAgICBtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX3Nsb25ncyA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVhJRl9TUkFUSU9OQUw6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1fRW50cmllc1tpXS50YWdfZW50cnkuY291bnQgPiAxICYmCisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fc3JhdHMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBmcmVlKG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fc3JhdHMpOworICAgICAgICAgICAgICAgICAgICBtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX3NyYXRzID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhZGRFbnRyeQorICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byBhZGQgYW4gZW50cnkgdG8gZXhpZiBkYXRhCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB0YWdpZCAgIDogZXhpZiB0YWcgSUQKKyAqICAgQHR5cGUgICAgOiBkYXRhIHR5cGUKKyAqICAgQGNvdW50ICAgOiBudW1iZXIgb2YgZGF0YSBpbiB1aW50IG9mIGl0cyB0eXBlCisgKiAgIEBkYXRhICAgIDogaW5wdXQgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFFeGlmOjphZGRFbnRyeShleGlmX3RhZ19pZF90IHRhZ2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpZl90YWdfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGlmKG1fbk51bUVudHJpZXMgPj0gTUFYX0VYSUZfVEFCTEVfRU5UUklFUykgeworICAgICAgICBMT0dFKCJOdW1iZXIgb2YgZW50cmllcyBleGNlZWRlZCBsaW1pdCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfaWQgPSB0YWdpZDsKKyAgICBtX0VudHJpZXNbbV9uTnVtRW50cmllc10udGFnX2VudHJ5LnR5cGUgPSB0eXBlOworICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuY291bnQgPSBjb3VudDsKKyAgICBtX0VudHJpZXNbbV9uTnVtRW50cmllc10udGFnX2VudHJ5LmNvcHkgPSAxOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRVhJRl9CWVRFOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqdmFsdWVzID0gKHVpbnQ4X3QgKiltYWxsb2MoY291bnQpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIGJ5dGUgYXJyYXkiKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHZhbHVlcywgZGF0YSwgY291bnQpOworICAgICAgICAgICAgICAgICAgICBtX0VudHJpZXNbbV9uTnVtRW50cmllc10udGFnX2VudHJ5LmRhdGEuX2J5dGVzID0gdmFsdWVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbV9FbnRyaWVzW21fbk51bUVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9ieXRlID0gKih1aW50OF90ICopZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYSUZfQVNDSUk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKnN0ciA9IE5VTEw7CisgICAgICAgICAgICBzdHIgPSAoY2hhciAqKW1hbGxvYyhjb3VudCArIDEpOworICAgICAgICAgICAgaWYgKHN0ciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBhc2NpaSBzdHJpbmciKTsKKyAgICAgICAgICAgICAgICByYyA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KHN0ciwgMCwgY291bnQgKyAxKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoc3RyLCBkYXRhLCBjb3VudCk7CisgICAgICAgICAgICAgICAgbV9FbnRyaWVzW21fbk51bUVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9hc2NpaSA9IHN0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYSUZfU0hPUlQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICpleGlmX2RhdGEgPSAodWludDE2X3QgKilkYXRhOworICAgICAgICAgICAgaWYgKGNvdW50ID4gMSkgeworICAgICAgICAgICAgICAgIHVpbnQxNl90ICp2YWx1ZXMgPSAodWludDE2X3QgKiltYWxsb2MoY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBzaG9ydCBhcnJheSIpOworICAgICAgICAgICAgICAgICAgICByYyA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkodmFsdWVzLCBleGlmX2RhdGEsIGNvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fc2hvcnRzID0gdmFsdWVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbV9FbnRyaWVzW21fbk51bUVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9zaG9ydCA9ICoodWludDE2X3QgKilkYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRVhJRl9MT05HOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCAqZXhpZl9kYXRhID0gKHVpbnQzMl90ICopZGF0YTsKKyAgICAgICAgICAgIGlmIChjb3VudCA+IDEpIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAqdmFsdWVzID0gKHVpbnQzMl90ICopbWFsbG9jKGNvdW50ICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgbG9uZyBhcnJheSIpOworICAgICAgICAgICAgICAgICAgICByYyA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkodmFsdWVzLCBleGlmX2RhdGEsIGNvdW50ICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fbG9uZ3MgPSB2YWx1ZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtX0VudHJpZXNbbV9uTnVtRW50cmllc10udGFnX2VudHJ5LmRhdGEuX2xvbmcgPSAqKHVpbnQzMl90ICopZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEVYSUZfUkFUSU9OQUw6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJhdF90ICpleGlmX2RhdGEgPSAocmF0X3QgKilkYXRhOworICAgICAgICAgICAgaWYgKGNvdW50ID4gMSkgeworICAgICAgICAgICAgICAgIHJhdF90ICp2YWx1ZXMgPSAocmF0X3QgKiltYWxsb2MoY291bnQgKiBzaXplb2YocmF0X3QpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciByYXRpb25hbCBhcnJheSIpOworICAgICAgICAgICAgICAgICAgICByYyA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkodmFsdWVzLCBleGlmX2RhdGEsIGNvdW50ICogc2l6ZW9mKHJhdF90KSk7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fcmF0cyA9IHZhbHVlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fcmF0ID0gKihyYXRfdCAqKWRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBFWElGX1VOREVGSU5FRDoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDhfdCAqdmFsdWVzID0gKHVpbnQ4X3QgKiltYWxsb2MoY291bnQpOworICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciB1bmRlZmluZWQgYXJyYXkiKTsKKyAgICAgICAgICAgICAgICByYyA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHZhbHVlcywgZGF0YSwgY291bnQpOworICAgICAgICAgICAgICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fdW5kZWZpbmVkID0gdmFsdWVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRVhJRl9TTE9ORzoKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3QgKmV4aWZfZGF0YSA9ICh1aW50MzJfdCAqKWRhdGE7CisgICAgICAgICAgICBpZiAoY291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCAqdmFsdWVzID0gKGludDMyX3QgKiltYWxsb2MoY291bnQgKiBzaXplb2YoaW50MzJfdCkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIHNpZ25lZCBsb25nIGFycmF5Iik7CisgICAgICAgICAgICAgICAgICAgIHJjID0gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSh2YWx1ZXMsIGV4aWZfZGF0YSwgY291bnQgKiBzaXplb2YoaW50MzJfdCkpOworICAgICAgICAgICAgICAgICAgICBtX0VudHJpZXNbbV9uTnVtRW50cmllc10udGFnX2VudHJ5LmRhdGEuX3Nsb25ncyA9IHZhbHVlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fc2xvbmcgPSAqKGludDMyX3QgKilkYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRVhJRl9TUkFUSU9OQUw6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNyYXRfdCAqZXhpZl9kYXRhID0gKHNyYXRfdCAqKWRhdGE7CisgICAgICAgICAgICBpZiAoY291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgc3JhdF90ICp2YWx1ZXMgPSAoc3JhdF90ICopbWFsbG9jKGNvdW50ICogc2l6ZW9mKHNyYXRfdCkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIHNpZ25lZCByYXRpb25hbCBhcnJheSIpOworICAgICAgICAgICAgICAgICAgICByYyA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkodmFsdWVzLCBleGlmX2RhdGEsIGNvdW50ICogc2l6ZW9mKHNyYXRfdCkpOworICAgICAgICAgICAgICAgICAgICBtX0VudHJpZXNbbV9uTnVtRW50cmllc10udGFnX2VudHJ5LmRhdGEuX3NyYXRzID0gdmFsdWVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbV9FbnRyaWVzW21fbk51bUVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9zcmF0ID0gKihzcmF0X3QgKilkYXRhOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEluY3JlYXNlIG51bWJlciBvZiBlbnRyaWVzCisgICAgbV9uTnVtRW50cmllcysrOworICAgIHJldHVybiByYzsKK30KKworfTsgLy8gbmFtZXNwYWNlIHFjYW1lcmEKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYVBvc3RQcm9jLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFQb3N0UHJvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNTYyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFQb3N0UHJvYy5oCkBAIC0wLDAgKzEsMjUwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19RQ0FNRVJBX1BPU1RQUk9DX0hfXworI2RlZmluZSBfX1FDQU1FUkFfUE9TVFBST0NfSF9fCisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJRQ2FtZXJhMkhXSS5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJtbV9jYW1lcmFfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibW1fanBlZ19pbnRlcmZhY2UuaCIKK30KKworI2RlZmluZSBNQVhfSlBFR19CVVJTVCAyCisjZGVmaW5lIENBTV9QUF9DSEFOTkVMX01BWCA4CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworY2xhc3MgUUNhbWVyYUV4aWY7CitjbGFzcyBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgam9iSWQ7ICAgICAgICAgICAgICAgICAgLy8gam9iIElECisgICAgdWludDMyX3QgY2xpZW50X2hkbDsgICAgICAgICAgICAgLy8gaGFuZGxlIG9mIGpwZWcgY2xpZW50IChvYnRhaW5lZCB3aGVuIG9wZW4ganBlZykKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnNyY19mcmFtZTsvLyBzb3VyY2UgZnJhbWUgKG5lZWQgdG8gYmUgcmV0dXJuZWQgYmFjayB0byBrZXJuZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2FmdGVyIGRvbmUpCisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzcmNfcmVwcm9jX2ZyYW1lOyAvLyBvcmlnaW5hbCBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZnJhbWUgZm9yIHJlcHJvYyBpZiBub3QgTlVMTAorICAgIG1ldGFkYXRhX2J1ZmZlcl90ICptZXRhZGF0YTsgICAgIC8vIHNvdXJjZSBmcmFtZSBtZXRhZGF0YQorICAgIGJvb2wgcmVwcm9jX2ZyYW1lX3JlbGVhc2U7ICAgICAgIC8vIGZhbHNlIHJlbGVhc2Ugb3JpZ2luYWwgYnVmZmVyLCB0cnVlIGRvbid0IHJlbGVhc2UgaXQKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpzcmNfcmVwcm9jX2J1ZnM7CisgICAgUUNhbWVyYUV4aWYgKnBKcGVnRXhpZk9iajsKKyAgICB1aW50OF90IG9mZmxpbmVfYnVmZmVyOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm9mZmxpbmVfcmVwcm9jX2J1ZjsgLy9IQUwgcHJvY2Vzc2VkIGJ1ZmZlcgorfSBxY2FtZXJhX2pwZWdfZGF0YV90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQ4X3QgcmVwcm9jQ291bnQ7CisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzcmNfZnJhbWU7ICAgIC8vIHNvdXJjZSBmcmFtZSB0aGF0IG5lZWRzIHBvc3QgcHJvY2VzcworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3JjX3JlcHJvY19mcmFtZTsvLyBzb3VyY2UgZnJhbWUgKG5lZWQgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm5lZCBiYWNrIHRvIGtlcm5lbCBhZnRlciBkb25lKQorfXFjYW1lcmFfcHBfcmVxdWVzdF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgam9iSWQ7ICAgICAgICAgICAgICAgICAgLy8gam9iIElECisgICAgaW50OF90IHJlcHJvY0NvdW50OyAgICAgICAgICAgICAgLy9DdXJyZW50IHBhc3MgY291bnQKKyAgICBpbnQ4X3QgcHBDaGFubmVsSW5kZXg7ICAgICAgICAgICAvL1JlcHJvY2VzcyBjaGFubmVsIG9iamVjdCBpbmRleAorICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3JjX2ZyYW1lOy8vIHNvdXJjZSBmcmFtZQorICAgIGJvb2wgcmVwcm9jX2ZyYW1lX3JlbGVhc2U7ICAgICAgIC8vIGZhbHNlIHJlbGVhc2Ugb3JpZ2luYWwgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSBkb24ndCByZWxlYXNlIGl0CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqc3JjX3JlcHJvY19idWZzOworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3JjX3JlcHJvY19mcmFtZTsvLyBzb3VyY2UgZnJhbWUgKG5lZWQgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXR1cm5lZCBiYWNrIHRvIGtlcm5lbCBhZnRlciBkb25lKQorICAgIHVpbnQ4X3Qgb2ZmbGluZV9idWZmZXI7CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqb2ZmbGluZV9yZXByb2NfYnVmOyAvL0hBTCBwcm9jZXNzZWQgYnVmZmVyCit9IHFjYW1lcmFfcHBfZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgam9iSWQ7ICAgICAgICAgICAgICAgICAgLy8gam9iIElEIChvYnRhaW5lZCB3aGVuIHN0YXJ0X2pwZWdfam9iKQorICAgIGpwZWdfam9iX3N0YXR1c190IHN0YXR1czsgICAgICAgIC8vIGpwZWcgZW5jb2Rpbmcgc3RhdHVzCisgICAgbW1fanBlZ19vdXRwdXRfdCBvdXRfZGF0YTsgICAgICAgICAvLyBwdHIgdG8ganBlZyBvdXRwdXQgYnVmCit9IHFjYW1lcmFfanBlZ19ldnRfcGF5bG9hZF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtZXJhX21lbW9yeV90ICogICAgICAgIGRhdGE7ICAgICAvLyBwdHIgdG8gZGF0YSBtZW1vcnkgc3RydWN0CisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICogIGZyYW1lOyAgICAvLyBwdHIgdG8gZnJhbWUKKyAgICBRQ2FtZXJhTWVtb3J5ICogICAgICAgICAgc3RyZWFtQnVmczsgLy9wdHIgdG8gc3RyZWFtIGJ1ZmZlcnMKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgdW5saW5rRmlsZTsgLy8gdW5saW5rIGFueSBzdG9yZWQgYnVmZmVycyBvbiBlcnJvcgorfSBxY2FtZXJhX3JlbGVhc2VfZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgIG1zZ190eXBlOyAvLyBtc2cgdHlwZSBvZiBkYXRhIG5vdGlmeQorICAgIGNhbWVyYV9tZW1vcnlfdCAqICAgICAgICBkYXRhOyAgICAgLy8gcHRyIHRvIGRhdGEgbWVtb3J5IHN0cnVjdAorICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICBpbmRleDsgICAgLy8gaW5kZXggb2YgdGhlIGJ1ZiBpbiB0aGUgd2hvbGUgYnVmZmVyCisgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhOyAvLyBwdHIgdG8gbWV0YSBkYXRhCisgICAgcWNhbWVyYV9yZWxlYXNlX2RhdGFfdCAgIHJlbGVhc2VfZGF0YTsgLy8gYW55IGRhdGEgbmVlZHMgdG8gYmUgcmVsZWFzZSBhZnRlciBub3RpZnkKK30gcWNhbWVyYV9kYXRhX2FyZ21fdDsKKworI2RlZmluZSBNQVhfRVhJRl9UQUJMRV9FTlRSSUVTIDE3CitjbGFzcyBRQ2FtZXJhRXhpZgoreworcHVibGljOgorICAgIFFDYW1lcmFFeGlmKCk7CisgICAgdmlydHVhbCB+UUNhbWVyYUV4aWYoKTsKKworICAgIGludDMyX3QgYWRkRW50cnkoZXhpZl90YWdfaWRfdCB0YWdpZCwKKyAgICAgICAgICAgICAgICAgICAgIGV4aWZfdGFnX3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKTsKKyAgICB1aW50MzJfdCBnZXROdW1PZkVudHJpZXMoKSB7cmV0dXJuIG1fbk51bUVudHJpZXM7fTsKKyAgICBRRVhJRl9JTkZPX0RBVEEgKmdldEVudHJpZXMoKSB7cmV0dXJuIG1fRW50cmllczt9OworCitwcml2YXRlOgorICAgIFFFWElGX0lORk9fREFUQSBtX0VudHJpZXNbTUFYX0VYSUZfVEFCTEVfRU5UUklFU107ICAvLyBleGlmIHRhZ3MgZm9yIEpQRUcgZW5jb2RlcgorICAgIHVpbnQzMl90ICBtX25OdW1FbnRyaWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgdmFsaWQgZW50cmllcworfTsKKworY2xhc3MgUUNhbWVyYVBvc3RQcm9jZXNzb3IKK3sKK3B1YmxpYzoKKyAgICBRQ2FtZXJhUG9zdFByb2Nlc3NvcihRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpjYW1fY3RybCk7CisgICAgdmlydHVhbCB+UUNhbWVyYVBvc3RQcm9jZXNzb3IoKTsKKworICAgIGludDMyX3QgaW5pdChqcGVnX2VuY29kZV9jYWxsYmFja190IGpwZWdfY2IsIHZvaWQgKnVzZXJfZGF0YSk7CisgICAgaW50MzJfdCBkZWluaXQoKTsKKyAgICBpbnQzMl90IHN0YXJ0KFFDYW1lcmFDaGFubmVsICpwU3JjQ2hhbm5lbCk7CisgICAgaW50MzJfdCBzdG9wKCk7CisgICAgYm9vbCB2YWxpZGF0ZVBvc3RQcm9jZXNzKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUpOworICAgIGludDMyX3QgcHJvY2Vzc0RhdGEobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSk7CisgICAgaW50MzJfdCBwcm9jZXNzUmF3RGF0YShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lKTsKKyAgICBpbnQzMl90IHByb2Nlc3NQUERhdGEobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSk7CisgICAgaW50MzJfdCBwcm9jZXNzSnBlZ0V2dChxY2FtZXJhX2pwZWdfZXZ0X3BheWxvYWRfdCAqZXZ0KTsKKyAgICBpbnQzMl90IGdldEpwZWdQYWRkaW5nUmVxKGNhbV9wYWRkaW5nX2luZm9fdCAmcGFkZGluZ19pbmZvKTsKKyAgICBRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbCAqIGdldFJlcHJvY0NoYW5uZWwodWludDhfdCBpbmRleCk7CisgICAgaW5saW5lIGJvb2wgZ2V0SnBlZ01lbU9wdCgpIHtyZXR1cm4gbUpwZWdNZW1PcHQ7fQorICAgIGlubGluZSB2b2lkIHNldEpwZWdNZW1PcHQoYm9vbCB2YWwpIHttSnBlZ01lbU9wdCA9IHZhbDt9CisgICAgaW50MzJfdCBzZXRKcGVnSGFuZGxlKG1tX2pwZWdfb3BzX3QgKnBKcGVnSGFuZGxlLAorICAgICAgICAgICAgbW1fanBlZ19tcG9fb3BzX3QqIHBKcGVnTXBvSGFuZGxlLCB1aW50MzJfdCBjbGllbnRIYW5kbGUpOworICAgIGludDMyX3QgY3JlYXRlSnBlZ1Nlc3Npb24oUUNhbWVyYUNoYW5uZWwgKnBTcmNDaGFubmVsKTsKKworICAgIGludDhfdCBnZXRQUENoYW5uZWxDb3VudCgpIHtyZXR1cm4gbVBQQ2hhbm5lbENvdW50O307CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqZ2V0T2ZmbGluZVBQSW5wdXRCdWZmZXIoCisgICAgICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnNyY19mcmFtZSk7CisgICAgUUNhbWVyYU1lbW9yeSAqbU9mZmxpbmVEYXRhQnVmczsKKworcHJpdmF0ZToKKyAgICBpbnQzMl90IHNlbmREYXRhTm90aWZ5KGludDMyX3QgbXNnX3R5cGUsCisgICAgICAgICAgICBjYW1lcmFfbWVtb3J5X3QgKmRhdGEsCisgICAgICAgICAgICB1aW50OF90IGluZGV4LAorICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhLAorICAgICAgICAgICAgcWNhbWVyYV9yZWxlYXNlX2RhdGFfdCAqcmVsZWFzZV9kYXRhLAorICAgICAgICAgICAgdWludDMyX3Qgc3VwZXJfYnVmX2ZyYW1lX2lkeCA9IDApOworICAgIGludDMyX3Qgc2VuZEV2dE5vdGlmeShpbnQzMl90IG1zZ190eXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0Mik7CisgICAgcWNhbWVyYV9qcGVnX2RhdGFfdCAqZmluZEpwZWdKb2JCeUpvYklkKHVpbnQzMl90IGpvYklkKTsKKyAgICBtbV9qcGVnX2NvbG9yX2Zvcm1hdCBnZXRDb2xvcmZtdEZyb21JbWdGbXQoY2FtX2Zvcm1hdF90IGltZ19mbXQpOworICAgIG1tX2pwZWdfZm9ybWF0X3QgZ2V0SnBlZ0ltZ1R5cGVGcm9tSW1nRm10KGNhbV9mb3JtYXRfdCBpbWdfZm10KTsKKyAgICBpbnQzMl90IGdldEpwZWdFbmNvZGluZ0NvbmZpZyhtbV9qcGVnX2VuY29kZV9wYXJhbXNfdCYgZW5jb2RlX3Bhcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqbWFpbl9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqdGh1bWJfc3RyZWFtKTsKKyAgICBpbnQzMl90IGVuY29kZURhdGEocWNhbWVyYV9qcGVnX2RhdGFfdCAqanBlZ19qb2JfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAmbmVlZE5ld1Nlc3MpOworICAgIGludDMyX3QgcXVlcnlTdHJlYW1zKFFDYW1lcmFTdHJlYW0gKiptYWluLAorICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqKnRodW1iLAorICAgICAgICAgICAgUUNhbWVyYVN0cmVhbSAqKnJlcHJvYywKKyAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKiptYWluX2ltYWdlLAorICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqKnRodW1iX2ltYWdlLAorICAgICAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICptYWluX2ZyYW1lLAorICAgICAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZXByb2NfZnJhbWUpOworICAgIGludDMyX3Qgc3luY1N0cmVhbVBhcmFtcyhtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lLAorICAgICAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZXByb2NfZnJhbWUpOworICAgIHZvaWQgcmVsZWFzZVN1cGVyQnVmKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3VwZXJfYnVmKTsKKyAgICB2b2lkIHJlbGVhc2VTdXBlckJ1ZihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2J1ZiwKKyAgICAgICAgICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlTm90aWZ5RGF0YSh2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2Jfc3RhdHVzKTsKKyAgICB2b2lkIHJlbGVhc2VKcGVnSm9iRGF0YShxY2FtZXJhX2pwZWdfZGF0YV90ICpqb2IpOworICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VTYXZlSm9iRGF0YSh2b2lkICpkYXRhLCB2b2lkICp1c2VyX2RhdGEpOworICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VSYXdEYXRhKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSk7CisgICAgaW50MzJfdCBwcm9jZXNzUmF3SW1hZ2VJbXBsKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVjdmRfZnJhbWUpOworCisgICAgc3RhdGljIHZvaWQgcmVsZWFzZUpwZWdEYXRhKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSk7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZVBQSW5wdXREYXRhKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSk7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZU9uZ29pbmdQUERhdGEodm9pZCAqZGF0YSwgdm9pZCAqdXNlcl9kYXRhKTsKKworICAgIHN0YXRpYyB2b2lkICpkYXRhUHJvY2Vzc1JvdXRpbmUodm9pZCAqZGF0YSk7CisgICAgc3RhdGljIHZvaWQgKmRhdGFTYXZlUm91dGluZSh2b2lkICpkYXRhKTsKKworICAgIGludDMyX3Qgc2V0WVVWRnJhbWVJbmZvKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVjdmRfZnJhbWUpOworICAgIHN0YXRpYyBib29sIG1hdGNoSm9iSWQodm9pZCAqZGF0YSwgdm9pZCAqdXNlcl9kYXRhLCB2b2lkICptYXRjaF9kYXRhKTsKKyAgICBzdGF0aWMgaW50IGdldEpwZWdNZW1vcnkob214X2pwZWdfb3VwdXRfYnVmX3QgKm91dF9idWYpOworICAgIHN0YXRpYyBpbnQgcmVsZWFzZUpwZWdNZW1vcnkob214X2pwZWdfb3VwdXRfYnVmX3QgKm91dF9idWYpOworCisgICAgaW50MzJfdCBkb1JlcHJvY2VzcygpOworICAgIGludDMyX3Qgc3RvcENhcHR1cmUoKTsKK3ByaXZhdGU6CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqbV9wYXJlbnQ7CisgICAganBlZ19lbmNvZGVfY2FsbGJhY2tfdCAgICAgbUpwZWdDQjsKKyAgICB2b2lkICogICAgICAgICAgICAgICAgICAgICBtSnBlZ1VzZXJEYXRhOworICAgIG1tX2pwZWdfb3BzX3QgICAgICAgICAgICAgIG1KcGVnSGFuZGxlOworICAgIG1tX2pwZWdfbXBvX29wc190ICAgICAgICAgIG1KcGVnTXBvSGFuZGxlOyAvLyBoYW5kbGUgZm9yIG1wbyBjb21wb3NpdGlvbiBmb3IgZHVhbGNhbQorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1KcGVnQ2xpZW50SGFuZGxlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1KcGVnU2Vzc2lvbklkOworCisgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgICAgbV9wSnBlZ091dHB1dE1lbVtNTV9KUEVHX01BWF9CVUZdOworICAgIFFDYW1lcmFFeGlmICogICAgICAgICAgICAgIG1fcEpwZWdFeGlmT2JqOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1fYlRodW1ibmFpbE5lZWRlZDsKKworICAgIGludDhfdCAgICAgICAgICAgICAgICAgICAgIG1QUENoYW5uZWxDb3VudDsKKyAgICBRQ2FtZXJhUmVwcm9jZXNzQ2hhbm5lbCAgICAqbVBQQ2hhbm5lbHNbQ0FNX1BQX0NIQU5ORUxfTUFYXTsKKworICAgIGNhbWVyYV9tZW1vcnlfdCAqICAgICAgICAgIG1fRGF0YU1lbTsgLy8gc2F2ZSBmcmFtZSBtZW0gcG9pbnRlcgorCisgICAgaW50OF90ICAgICAgICAgICAgICAgICAgICAgbV9iSW5pdGVkOyAvLyBpZiBwb3N0cHJvYyBpcyBpbml0ZWQKKworICAgIFFDYW1lcmFRdWV1ZSBtX2lucHV0UFBROyAgICAgICAgICAgIC8vIGlucHV0IHF1ZXVlIGZvciBwb3N0cHJvYworICAgIFFDYW1lcmFRdWV1ZSBtX29uZ29pbmdQUFE7ICAgICAgICAgIC8vIG9uZ29pbmcgcG9zdHByb2MgcXVldWUKKyAgICBRQ2FtZXJhUXVldWUgbV9pbnB1dEpwZWdROyAgICAgICAgICAvLyBpbnB1dCBqcGVnIGpvYiBxdWV1ZQorICAgIFFDYW1lcmFRdWV1ZSBtX29uZ29pbmdKcGVnUTsgICAgICAgIC8vIG9uZ29pbmcganBlZyBqb2IgcXVldWUKKyAgICBRQ2FtZXJhUXVldWUgbV9pbnB1dFJhd1E7ICAgICAgICAgICAvLyBpbnB1dCByYXcgam9iIHF1ZXVlCisgICAgUUNhbWVyYVF1ZXVlIG1faW5wdXRTYXZlUTsgICAgICAgICAgLy8gaW5wdXQgc2F2ZSBqb2IgcXVldWUKKyAgICBRQ2FtZXJhQ21kVGhyZWFkIG1fZGF0YVByb2NUaDsgICAgICAvLyB0aHJlYWQgZm9yIGRhdGEgcHJvY2Vzc2luZworICAgIFFDYW1lcmFDbWRUaHJlYWQgbV9zYXZlUHJvY1RoOyAgICAgIC8vIHRocmVhZCBmb3Igc3RvcmluZyBidWZmZXJzCisgICAgdWludDMyX3QgbVNhdmVGcm1DbnQ7ICAgICAgICAgICAgICAgLy8gc2F2ZSBmcmFtZSBjb3VudGVyCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKlNUT1JFX0xPQ0FUSU9OOyAgLy8gcGF0aCBmb3Igc3RvcmluZyBidWZmZXJzCisgICAgYm9vbCBtVXNlU2F2ZVByb2M7ICAgICAgICAgICAgICAgICAgLy8gdXNlIHN0b3JlIHRocmVhZAorICAgIGJvb2wgbVVzZUpwZWdCdXJzdDsgICAgICAgICAgICAgICAgIC8vIHVzZSBqcGVnIGJ1cnN0IGVuY29kaW5nIG1vZGUKKyAgICBib29sIG1KcGVnTWVtT3B0OworICAgIHVpbnQzMl90ICAgbV9KcGVnT3V0cHV0TWVtQ291bnQ7CisgICAgdWludDhfdCBtTmV3SnBlZ1Nlc3Npb25OZWVkZWQ7CisgICAgaW50MzJfdCBtX2J1ZkNvdW50UFBROworICAgIFZlY3RvcjxtbV9jYW1lcmFfYnVmX2RlZl90ICo+IG1fSW5wdXRNZXRhZGF0YTsgLy8gc3RvcmUgaW5wdXQgbWV0YWRhdGEgYnVmZmVycyBmb3IgQU9TVCBjYXNlcworICAgIHNpemVfdCBtX1BQaW5kZXg7ICAgICAgICAgICAgICAgICAgIC8vIGNvdW50ZXIgZm9yIGVhY2ggaW5jb21pbmcgQU9TVCBidWZmZXIKKyAgICBwdGhyZWFkX211dGV4X3QgbV9yZXByb2Nlc3NfbG9jazsgICAvLyBsb2NrIHRvIGVuc3VyZSByZXByb2Nlc3Mgam9iIGlzIG5vdCBmcmVlZCBlYXJseS4KKworcHVibGljOgorICAgIGNhbV9kaW1lbnNpb25fdCBtX2RzdF9kaW07Cit9OworCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQorCisjZW5kaWYgLyogX19RQ0FNRVJBX1BPU1RQUk9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhU3RhdGVNYWNoaW5lLmNwcCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYVN0YXRlTWFjaGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0MzA3YgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYVN0YXRlTWFjaGluZS5jcHAKQEAgLTAsMCArMSwzODY4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYVN0YXRlTWFjaGluZSIKKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJRQ2FtZXJhMkhXSS5oIgorI2luY2x1ZGUgIlFDYW1lcmFTdGF0ZU1hY2hpbmUuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorfQorCituYW1lc3BhY2UgcWNhbWVyYSB7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc21FdnRQcm9jUm91dGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBTdGF0ZW1hY2hpbmUgcHJvY2VzcyB0aHJlYWQgcm91dGluZSB0byBoYW5kbGUgZXZlbnRzCisgKiAgICAgICAgICAgICAgaW4gZGlmZmVyZW50IHN0YXRlLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGF0YSAgICA6IHB0ciB0byBRQ2FtZXJhU3RhdGVNYWNoaW5lIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgKlFDYW1lcmFTdGF0ZU1hY2hpbmU6OnNtRXZ0UHJvY1JvdXRpbmUodm9pZCAqZGF0YSkKK3sKKyAgICBpbnQgcnVubmluZyA9IDEsIHJldDsKKyAgICBRQ2FtZXJhU3RhdGVNYWNoaW5lICpwbWUgPSAoUUNhbWVyYVN0YXRlTWFjaGluZSAqKWRhdGE7CisKKyAgICBMT0dIKCJFIik7CisgICAgZG8geworICAgICAgICBkbyB7CisgICAgICAgICAgICByZXQgPSBjYW1fc2VtX3dhaXQoJnBtZS0+Y21kX3NlbSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDAgJiYgZXJybm8gIT0gRUlOVkFMKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiY2FtX3NlbV93YWl0IGVycm9yICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHJldCAhPSAwKTsKKworICAgICAgICAvLyB3ZSBnb3Qgbm90aWZpZWQgYWJvdXQgbmV3IGNtZCBhdmFpbCBpbiBjbWQgcXVldWUKKyAgICAgICAgLy8gZmlyc3QgY2hlY2sgQVBJIGNtZCBxdWV1ZQorICAgICAgICBxY2FtZXJhX3NtX2NtZF90ICpub2RlID0gKHFjYW1lcmFfc21fY21kX3QgKilwbWUtPmFwaV9xdWV1ZS5kZXF1ZXVlKCk7CisgICAgICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIG5vIEFQSSBjbWQsIHRoZW4gY2hlY2sgZXZ0IGNtZCBxdWV1ZQorICAgICAgICAgICAgbm9kZSA9IChxY2FtZXJhX3NtX2NtZF90ICopcG1lLT5ldnRfcXVldWUuZGVxdWV1ZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChub2RlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN3aXRjaCAobm9kZS0+Y21kKSB7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfU01fQ01EX1RZUEVfQVBJOgorICAgICAgICAgICAgICAgIHBtZS0+c3RhdGVNYWNoaW5lKG5vZGUtPmV2dCwgbm9kZS0+ZXZ0X3BheWxvYWQpOworICAgICAgICAgICAgICAgIC8vIEFQSSBpcyBpbiBhIHdheSBzeW5jIGNhbGwsIHNvIGV2dF9wYXlsb2FkIGlzIG1hbmFnZWQgYnkgSFdJCisgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBmcmVlIHBheWxvYWQgZm9yIEFQSQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX1NNX0NNRF9UWVBFX0VWVDoKKyAgICAgICAgICAgICAgICBwbWUtPnN0YXRlTWFjaGluZShub2RlLT5ldnQsIG5vZGUtPmV2dF9wYXlsb2FkKTsKKworICAgICAgICAgICAgICAgIC8vIEVWVCBpcyBhc3luYyBjYWxsLCBzbyBwYXlsb2FkIG5lZWQgdG8gYmUgZnJlZSBhZnRlciB1c2UKKyAgICAgICAgICAgICAgICBmcmVlKG5vZGUtPmV2dF9wYXlsb2FkKTsKKyAgICAgICAgICAgICAgICBub2RlLT5ldnRfcGF5bG9hZCA9IE5VTEw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfU01fQ01EX1RZUEVfRVhJVDoKKyAgICAgICAgICAgICAgICBydW5uaW5nID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKG5vZGUpOworICAgICAgICAgICAgbm9kZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChydW5uaW5nKTsKKyAgICBMT0dIKCJYIik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYVN0YXRlTWFjaGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhU3RhdGVNYWNoaW5lLiBXaWxsIHN0YXJ0IHByb2Nlc3MgdGhyZWFkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjdHJsICAgIDogcHRyIHRvIEhXSSBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhU3RhdGVNYWNoaW5lOjpRQ2FtZXJhU3RhdGVNYWNoaW5lKFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmN0cmwpIDoKKyAgICBhcGlfcXVldWUoKSwKKyAgICBldnRfcXVldWUoKQoreworICAgIG1fcGFyZW50ID0gY3RybDsKKyAgICBtX3N0YXRlID0gUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXX1NUT1BQRUQ7CisgICAgY21kX3BpZCA9IDA7CisgICAgY2FtX3NlbV9pbml0KCZjbWRfc2VtLCAwKTsKKyAgICBwdGhyZWFkX2NyZWF0ZSgmY21kX3BpZCwKKyAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgIHNtRXZ0UHJvY1JvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgdGhpcyk7CisgICAgcHRocmVhZF9zZXRuYW1lX25wKGNtZF9waWQsICJDQU1fc3RNYWNoaW5lIik7CisgICAgbV9iRGVsYXlQcmV2aWV3TXNncyA9IGZhbHNlOworICAgIG1fRGVsYXllZE1zZ3MgPSAwOworICAgIG1fUmVzdG9yZVpTTCA9IFRSVUU7CisgICAgbV9iUHJldmlld0NhbGxiYWNrTmVlZGVkID0gVFJVRTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYVN0YXRlTWFjaGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBkZXNjdHJ1Y3RvciBvZiBRQ2FtZXJhU3RhdGVNYWNoaW5lLiBXaWxsIHN0b3AgcHJvY2VzcyB0aHJlYWQuCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhU3RhdGVNYWNoaW5lOjp+UUNhbWVyYVN0YXRlTWFjaGluZSgpCit7CisgICAgY2FtX3NlbV9kZXN0cm95KCZjbWRfc2VtKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWxlYXNlVGhyZWFkCisgKgorICogREVTQ1JJUFRJT046IFNlbmRzIGFuIGV4aXQgY29tbWFuZCBhbmQgdGVybWluYXRlcyB0aGUgc3RhdGUgbWFjaGluZSB0aHJlYWQKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYVN0YXRlTWFjaGluZTo6cmVsZWFzZVRocmVhZCgpCit7CisgICAgaWYgKGNtZF9waWQgIT0gMCkgeworICAgICAgICBxY2FtZXJhX3NtX2NtZF90ICpub2RlID0KKyAgICAgICAgICAgIChxY2FtZXJhX3NtX2NtZF90ICopbWFsbG9jKHNpemVvZihxY2FtZXJhX3NtX2NtZF90KSk7CisgICAgICAgIGlmIChOVUxMICE9IG5vZGUpIHsKKyAgICAgICAgICAgIG1lbXNldChub2RlLCAwLCBzaXplb2YocWNhbWVyYV9zbV9jbWRfdCkpOworICAgICAgICAgICAgbm9kZS0+Y21kID0gUUNBTUVSQV9TTV9DTURfVFlQRV9FWElUOworCisgICAgICAgICAgICBpZiAoYXBpX3F1ZXVlLmVucXVldWUoKHZvaWQgKilub2RlKSkgeworICAgICAgICAgICAgICAgIGNhbV9zZW1fcG9zdCgmY21kX3NlbSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZyZWUobm9kZSk7CisgICAgICAgICAgICAgICAgbm9kZSA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHdhaXQgdW50aWwgY21kIHRocmVhZCBleGl0cyAqLworICAgICAgICAgICAgaWYgKHB0aHJlYWRfam9pbihjbWRfcGlkLCBOVUxMKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgTE9HVygicHRocmVhZCBkZWFkIGFscmVhZHlcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNtZF9waWQgPSAwOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhcHBseURlbGF5ZWRNc2dzCisgKgorICogREVTQ1JJUFRJT046IEVuYWJsZSBpZiBuZWVkZWQgYW55IGRlbGF5ZWQgbWVzc2FnZSB0eXBlcworICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdGF0ZU1hY2hpbmU6OmFwcGx5RGVsYXllZE1zZ3MoKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIGlmIChtX2JEZWxheVByZXZpZXdNc2dzICYmIG1fRGVsYXllZE1zZ3MpIHsKKyAgICAgICAgcmMgPSBtX3BhcmVudC0+ZW5hYmxlTXNnVHlwZShtX0RlbGF5ZWRNc2dzKTsKKyAgICAgICAgbV9iRGVsYXlQcmV2aWV3TXNncyA9IGZhbHNlOworICAgICAgICBtX0RlbGF5ZWRNc2dzID0gMDsKKyAgICB9IGVsc2UgaWYgKG1fYkRlbGF5UHJldmlld01zZ3MpIHsKKyAgICAgICAgbV9iRGVsYXlQcmV2aWV3TXNncyA9IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jQVBJCisgKgorICogREVTQ1JJUFRJT046IHByb2Nlc3MgaW5jb21pbmcgQVBJIHJlcXVlc3QgZnJvbSBmcmFtZXdvcmsgbGF5ZXIuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBldnQgICAgICAgICAgOiBldmVudCB0byBiZSBwcm9jZXNzZWQKKyAqICAgQGFwaV9wYXlsb2FkICA6IEFQSSBwYXlsb2FkLiBDYW4gYmUgTlVMTCBpZiBub3QgbmVlZGVkLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVN0YXRlTWFjaGluZTo6cHJvY0FQSShxY2FtZXJhX3NtX2V2dF9lbnVtX3QgZXZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFwaV9wYXlsb2FkKQoreworICAgIHFjYW1lcmFfc21fY21kX3QgKm5vZGUgPQorICAgICAgICAocWNhbWVyYV9zbV9jbWRfdCAqKW1hbGxvYyhzaXplb2YocWNhbWVyYV9zbV9jbWRfdCkpOworICAgIGlmIChOVUxMID09IG5vZGUpIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBxY2FtZXJhX3NtX2NtZF90Iik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbWVtc2V0KG5vZGUsIDAsIHNpemVvZihxY2FtZXJhX3NtX2NtZF90KSk7CisgICAgbm9kZS0+Y21kID0gUUNBTUVSQV9TTV9DTURfVFlQRV9BUEk7CisgICAgbm9kZS0+ZXZ0ID0gZXZ0OworICAgIG5vZGUtPmV2dF9wYXlsb2FkID0gYXBpX3BheWxvYWQ7CisgICAgaWYgKGFwaV9xdWV1ZS5lbnF1ZXVlKCh2b2lkICopbm9kZSkpIHsKKyAgICAgICAgY2FtX3NlbV9wb3N0KCZjbWRfc2VtKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkFQSSBlbnF1ZXVlIGZhaWxlZCBBUEkgPSAlZCIsIGV2dCk7CisgICAgICAgIGZyZWUobm9kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jRXZ0CisgKgorICogREVTQ1JJUFRJT046IHByb2Nlc3MgaW5jb21pbmcgZW52ZW50IGZyb20gbW0tY2FtZXJhLWludGVyZmFjZSBhbmQKKyAqICAgICAgICAgICAgICBtbS1qcGVnLWludGVyZmFjZS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGV2dCAgICAgICAgICA6IGV2ZW50IHRvIGJlIHByb2Nlc3NlZAorICogICBAZXZ0X3BheWxvYWQgIDogZXZlbnQgcGF5bG9hZC4gQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdGF0ZU1hY2hpbmU6OnByb2NFdnQocWNhbWVyYV9zbV9ldnRfZW51bV90IGV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpldnRfcGF5bG9hZCkKK3sKKyAgICBxY2FtZXJhX3NtX2NtZF90ICpub2RlID0KKyAgICAgICAgKHFjYW1lcmFfc21fY21kX3QgKiltYWxsb2Moc2l6ZW9mKHFjYW1lcmFfc21fY21kX3QpKTsKKyAgICBpZiAoTlVMTCA9PSBub2RlKSB7CisgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgcWNhbWVyYV9zbV9jbWRfdCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1lbXNldChub2RlLCAwLCBzaXplb2YocWNhbWVyYV9zbV9jbWRfdCkpOworICAgIG5vZGUtPmNtZCA9IFFDQU1FUkFfU01fQ01EX1RZUEVfRVZUOworICAgIG5vZGUtPmV2dCA9IGV2dDsKKyAgICBub2RlLT5ldnRfcGF5bG9hZCA9IGV2dF9wYXlsb2FkOworICAgIGlmIChldnRfcXVldWUuZW5xdWV1ZSgodm9pZCAqKW5vZGUpKSB7CisgICAgICAgIGNhbV9zZW1fcG9zdCgmY21kX3NlbSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJFVkVOVCBlbnF1ZXVlIGZhaWxlZCBFdmVudCA9ICVkIiwgZXZ0KTsKKyAgICAgICAgZnJlZShub2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0YXRlTWFjaGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBmaW5pdGUgc3RhdGUgbWFjaGluZSBlbnRyeSBmdW5jdGlvbi4gRGVwZW5kcyBvbiBzdGF0ZSwKKyAqICAgICAgICAgICAgICBpbmNvbWluZyBldmVudCB3aWxsIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBldnQgICAgICA6IGV2ZW50IHRvIGJlIHByb2Nlc3NlZAorICogICBAcGF5bG9hZCAgOiBldmVudCBwYXlsb2FkLiBDYW4gYmUgTlVMTCBpZiBub3QgbmVlZGVkLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVN0YXRlTWFjaGluZTo6c3RhdGVNYWNoaW5lKHFjYW1lcmFfc21fZXZ0X2VudW1fdCBldnQsIHZvaWQgKnBheWxvYWQpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIExPR0woIm1fc3RhdGUgJWQsIGV2ZW50ICglZCkiLCBtX3N0YXRlLCBldnQpOworICAgIHN3aXRjaCAobV9zdGF0ZSkgeworICAgIGNhc2UgUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXX1NUT1BQRUQ6CisgICAgICAgIHJjID0gcHJvY0V2dFByZXZpZXdTdG9wcGVkU3RhdGUoZXZ0LCBwYXlsb2FkKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfUkVBRFk6CisgICAgICAgIHJjID0gcHJvY0V2dFByZXZpZXdSZWFkeVN0YXRlKGV2dCwgcGF5bG9hZCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXSU5HOgorICAgICAgICByYyA9IHByb2NFdnRQcmV2aWV3aW5nU3RhdGUoZXZ0LCBwYXlsb2FkKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVBBUkVfU05BUFNIT1Q6CisgICAgICAgIHJjID0gcHJvY0V2dFByZXBhcmVTbmFwc2hvdFN0YXRlKGV2dCwgcGF5bG9hZCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9TVEFURV9QSUNfVEFLSU5HOgorICAgICAgICByYyA9IHByb2NFdnRQaWNUYWtpbmdTdGF0ZShldnQsIHBheWxvYWQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fU1RBVEVfUkVDT1JESU5HOgorICAgICAgICByYyA9IHByb2NFdnRSZWNvcmRpbmdTdGF0ZShldnQsIHBheWxvYWQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fU1RBVEVfVklERU9fUElDX1RBS0lORzoKKyAgICAgICAgcmMgPSBwcm9jRXZ0VmlkZW9QaWNUYWtpbmdTdGF0ZShldnQsIHBheWxvYWQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV19QSUNfVEFLSU5HOgorICAgICAgICByYyA9IHByb2NFdnRQcmV2aWV3UGljVGFraW5nU3RhdGUoZXZ0LCBwYXlsb2FkKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2NFdnRQcmV2aWV3U3RvcHBlZFN0YXRlCisgKgorICogREVTQ1JJUFRJT046IGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uIHRvIGhhbmRsZSBldmVudCBpbiBzdGF0ZSBvZgorICogICAgICAgICAgICAgIFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV19TVE9QUEVELgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZXZ0ICAgICAgOiBldmVudCB0byBiZSBwcm9jZXNzZWQKKyAqICAgQHBheWxvYWQgIDogZXZlbnQgcGF5bG9hZC4gQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdGF0ZU1hY2hpbmU6OnByb2NFdnRQcmV2aWV3U3RvcHBlZFN0YXRlKHFjYW1lcmFfc21fZXZ0X2VudW1fdCBldnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBheWxvYWQpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IHJlc3VsdDsKKyAgICBtZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKHFjYW1lcmFfYXBpX3Jlc3VsdF90KSk7CisKKyAgICBMT0dMKCJldmVudCAoJWQpIiwgZXZ0KTsKKyAgICBzd2l0Y2ggKGV2dCkgeworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BSRVZJRVdfV0lORE9XOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zZXRQcmV2aWV3V2luZG93KChzdHJ1Y3QgcHJldmlld19zdHJlYW1fb3BzICopcGF5bG9hZCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX0NBTExCQUNLUzoKKyAgICAgICAgeworICAgICAgICAgICAgcWNhbWVyYV9zbV9ldnRfc2V0Y2JfcGF5bG9hZF90ICpzZXRjYnMgPQorICAgICAgICAgICAgICAgIChxY2FtZXJhX3NtX2V2dF9zZXRjYl9wYXlsb2FkX3QgKilwYXlsb2FkOworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c2V0Q2FsbEJhY2tzKHNldGNicy0+bm90aWZ5X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+ZGF0YV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRjYnMtPmRhdGFfY2JfdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+Z2V0X21lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRjYnMtPnVzZXIpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0VOQUJMRV9NU0dfVFlQRToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+d2FpdERlZmVycmVkV29yayhtX3BhcmVudC0+bVBhcmFtSW5pdEpvYik7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJQYXJhbSBpbml0IGRlZmVycmVkIHdvcmsgZmFpbGVkIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmVuYWJsZU1zZ1R5cGUoKigoaW50MzJfdCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9ESVNBQkxFX01TR19UWVBFOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT53YWl0RGVmZXJyZWRXb3JrKG1fcGFyZW50LT5tUGFyYW1Jbml0Sm9iKTsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgIExPR0UoIlBhcmFtIGluaXQgZGVmZXJyZWQgd29yayBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+ZGlzYWJsZU1zZ1R5cGUoKigoaW50MzJfdCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9NU0dfVFlQRV9FTkFCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IG1fcGFyZW50LT5tc2dUeXBlRW5hYmxlZCgqKChpbnQzMl90ICopcGF5bG9hZCkpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfRU5BQkxFX0ZMQUc7CisgICAgICAgICAgICByZXN1bHQuZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNUzoKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBuZWVkUmVzdGFydCA9IGZhbHNlOworCisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT53YWl0RGVmZXJyZWRXb3JrKG1fcGFyZW50LT5tUGFyYW1Jbml0Sm9iKTsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgIExPR0UoIlBhcmFtIGluaXQgZGVmZXJyZWQgd29yayBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+dXBkYXRlUGFyYW1ldGVycygoY2hhciopcGF5bG9hZCwgbmVlZFJlc3RhcnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVNfU1RPUDoKKyAgICAgICAgeworICAgICAgICAgICAgbV9wYXJlbnQtPm1fbWVtb3J5UG9vbC5jbGVhcigpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVNfQ09NTUlUOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5jb21taXRQYXJhbWV0ZXJDaGFuZ2VzKCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19SRVNUQVJUOgorICAgICAgICB7CisgICAgICAgICAgICBtX3BhcmVudC0+c2V0TmVlZFJlc3RhcnQoZmFsc2UpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyAgICAgICAgICAgID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgICAgICAgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgICAgICAgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfR0VUX1BBUkFNUzoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+d2FpdERlZmVycmVkV29yayhtX3BhcmVudC0+bVBhcmFtSW5pdEpvYik7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJQYXJhbSBpbml0IGRlZmVycmVkIHdvcmsgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgY2hhciogbnVsbFBhcmFtcyA9IChjaGFyICopbWFsbG9jKDEpOworICAgICAgICAgICAgICAgIGlmIChudWxsUGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChudWxsUGFyYW1zLCAwLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0LnBhcmFtcyA9IG51bGxQYXJhbXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJhbXMgPSBtX3BhcmVudC0+Z2V0UGFyYW1ldGVycygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmMgPSByZXN1bHQucGFyYW1zID8gTk9fRVJST1IgOiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfUEFSQU1TOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BVVF9QQVJBTVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnB1dFBhcmFtZXRlcnMoKGNoYXIqKXBheWxvYWQpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRVBBUkVfUFJFVklFVzoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+d2FpdERlZmVycmVkV29yayhtX3BhcmVudC0+bVBhcmFtSW5pdEpvYik7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJQYXJhbSBpbml0IGRlZmVycmVkIHdvcmsgZmFpbGVkIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByZXBhcmVQcmV2aWV3KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAvL3ByZXBhcmUgcHJldmlldyBzdWNjZXNzLCBtb3ZlIHRvIHJlYWR5IHN0YXRlCisgICAgICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV19SRUFEWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9QUkVWSUVXOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT53YWl0RGVmZXJyZWRXb3JrKG1fcGFyZW50LT5tUGFyYW1Jbml0Sm9iKTsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgIExPR0UoIlBhcmFtIGluaXQgZGVmZXJyZWQgd29yayBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobV9wYXJlbnQtPm1QcmV2aWV3V2luZG93ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgICAgIGlmKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHByZXZpZXcgd2luZG93IGlzIG5vdCBzZXQgeWV0LCBtb3ZlIHRvIHByZXZpZXdSZWFkeSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICBtX3N0YXRlID0gUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXX1JFQURZOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoInByZXBhcmVQcmV2aWV3IGZhaWxlZCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJlcGFyZVByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwbHlEZWxheWVkTXNncygpOworICAgICAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zdGFydFByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+dW5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgcHJldmlldyBzdWNjZXNzLCBtb3ZlIHRvIHByZXZpZXdpbmcgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdJTkc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RBUlRfTk9ESVNQTEFZX1BSRVZJRVc6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPndhaXREZWZlcnJlZFdvcmsobV9wYXJlbnQtPm1QYXJhbUluaXRKb2IpOworICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiUGFyYW0gaW5pdCBkZWZlcnJlZCB3b3JrIGZhaWxlZCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgYXBwbHlEZWxheWVkTXNncygpOworICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+dW5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdJTkc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RPUF9QUkVWSUVXOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBubyBvcCBuZWVkZWQgaGVyZQorICAgICAgICAgICAgTE9HVygiYWxyZWFkeSBpbiBwcmV2aWV3IHN0b3BwZWQgc3RhdGUsIGRvIG5vdGhpbmciKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSBOT19FUlJPUjsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QUkVWSUVXX0VOQUJMRUQ6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUNPUkRJTkdfRU5BQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfRU5BQkxFX0ZMQUc7CisgICAgICAgICAgICByZXN1bHQuZW5hYmxlZCA9IDA7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVMRUFTRToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUT1JFX01FVEFEQVRBX0lOX0JVRlM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoKigoaW50ICopcGF5bG9hZCkpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0RVTVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPndhaXREZWZlcnJlZFdvcmsobV9wYXJlbnQtPm1QYXJhbUluaXRKb2IpOworICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiUGFyYW0gaW5pdCBkZWZlcnJlZCB3b3JrIGZhaWxlZCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5kdW1wKCooKGludCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRU5EX0NPTU1BTkQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPndhaXREZWZlcnJlZFdvcmsobV9wYXJlbnQtPm1QYXJhbUluaXRKb2IpOworICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiUGFyYW0gaW5pdCBkZWZlcnJlZCB3b3JrIGZhaWxlZCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxY2FtZXJhX3NtX2V2dF9jb21tYW5kX3BheWxvYWRfdCAqY21kX3BheWxvYWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21fZXZ0X2NvbW1hbmRfcGF5bG9hZF90ICopcGF5bG9hZDsKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zZW5kQ29tbWFuZChjbWRfcGF5bG9hZC0+Y21kLAorICAgICAgICAgICAgICAgICAgICAgICAgY21kX3BheWxvYWQtPmFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWRfcGF5bG9hZC0+YXJnMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFJFX1NUQVJUX1JFQ09SRElORzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1JFU1RBUlRfU1RPUF9QUkVWSUVXOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVTVEFSVF9TVEFSVF9QUkVWSUVXOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RBUlRfUkVDT1JESU5HOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RPUF9SRUNPUkRJTkc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUxFQVNFX1JFQ09SSUROR19GUkFNRToKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRVBBUkVfU05BUFNIT1Q6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QUkVfVEFLRV9QSUNUVVJFOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfVEFLRV9QSUNUVVJFOgorICAgICAgICB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciEhIGNhbm5vdCBoYW5kbGUgZXZ0KCVkKSBpbiBzdGF0ZSglZCkiLCBldnQsIG1fc3RhdGUpOworICAgICAgICAgICAgcmMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9BVVRPX0ZPQ1VTOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfQ0FOQ0VMX1BJQ1RVUkU6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vIG9wIG5lZWRlZCBoZXJlCisgICAgICAgICAgICBMT0dXKCJObyBvcHMgZm9yIGV2dCglZCkgaW4gc3RhdGUoJWQpIiwgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSBOT19FUlJPUjsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVE9QX0FVVE9fRk9DVVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPndhaXREZWZlcnJlZFdvcmsobV9wYXJlbnQtPm1QYXJhbUluaXRKb2IpOworICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiUGFyYW0gaW5pdCBkZWZlcnJlZCB3b3JrIGZhaWxlZCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5jYW5jZWxBdXRvRm9jdXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUdfRkFDRV9JTUFHRToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBmYWNlSUQgPSAwOworICAgICAgICAgICAgcWNhbWVyYV9zbV9ldnRfcmVnX2ZhY2VfcGF5bG9hZF90ICpyZWdfcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21fZXZ0X3JlZ19mYWNlX3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5yZWdpc3RlckZhY2VJbWFnZShyZWdfcGF5bG9hZC0+aW1nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ19wYXlsb2FkLT5jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlSUQpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfSEFORExFOworICAgICAgICAgICAgcmVzdWx0LmhhbmRsZSA9IGZhY2VJRDsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9USEVSTUFMX05PVElGWToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+d2FpdERlZmVycmVkV29yayhtX3BhcmVudC0+bVBhcmFtSW5pdEpvYik7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJQYXJhbSBpbml0IGRlZmVycmVkIHdvcmsgZmFpbGVkIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnVwZGF0ZVRoZXJtYWxMZXZlbChwYXlsb2FkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0VWVF9OT1RJRlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2NhbWVyYV9ldmVudF90ICpjYW1fZXZ0ID0gKG1tX2NhbWVyYV9ldmVudF90ICopcGF5bG9hZDsKKyAgICAgICAgICAgIHN3aXRjaCAoY2FtX2V2dC0+c2VydmVyX2V2ZW50X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0FNX0VWRU5UX1RZUEVfREFFTU9OX0RJRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+c2VuZEV2dE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfRVJST1JfU0VSVkVSX0RJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBpbnRlcm5hbCBldmVudCAlZCBpbiBzdGF0ZSglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZXZ0LT5zZXJ2ZXJfZXZlbnRfdHlwZSwgbV9zdGF0ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TTkFQU0hPVF9ET05FOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyBvcHMsIGJ1dCBuZWVkIHRvIG5vdGlmeQorICAgICAgICAgICAgTE9HVygiQ2Fubm90IGhhbmRsZSBldnQoJWQpIGluIHN0YXRlKCVkKSIsIGV2dCwgbV9zdGF0ZSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsRXZ0UmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9FVlRfSU5URVJOQUw6CisgICAgICAgeworICAgICAgICAgICBxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKmludGVybmFsX2V2dCA9CisgICAgICAgICAgICAgICAocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICopcGF5bG9hZDsKKyAgICAgICAgICAgc3dpdGNoIChpbnRlcm5hbF9ldnQtPmV2dF90eXBlKSB7CisgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfTEVEX01PREVfT1ZFUlJJREU6CisgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT53YWl0RGVmZXJyZWRXb3JrKG1fcGFyZW50LT5tUGFyYW1Jbml0Sm9iKTsKKyAgICAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgICAgIExPR0UoIlBhcmFtIGluaXQgZGVmZXJyZWQgd29yayBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+bVBhcmFtZXRlcnMudXBkYXRlRmxhc2hNb2RlKGludGVybmFsX2V2dC0+bGVkX2RhdGEpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBMT0dXKCJDYW5ub3QgaGFuZGxlIGV2dCglZCkgaW4gc3RhdGUoJWQpIiwgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfSlBFR19FVlRfTk9USUZZOgorICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1coIkNhbm5vdCBoYW5kbGUgZXZ0KCVkKSBpbiBzdGF0ZSglZCkiLCBldnQsIG1fc3RhdGUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJvY0V2dFByZXZpZXdSZWFkeVN0YXRlCisgKgorICogREVTQ1JJUFRJT046IGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uIHRvIGhhbmRsZSBldmVudCBpbiBzdGF0ZSBvZgorICogICAgICAgICAgICAgIFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV19SRUFEWS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGV2dCAgICAgIDogZXZlbnQgdG8gYmUgcHJvY2Vzc2VkCisgKiAgIEBwYXlsb2FkICA6IGV2ZW50IHBheWxvYWQuIENhbiBiZSBOVUxMIGlmIG5vdCBuZWVkZWQuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RhdGVNYWNoaW5lOjpwcm9jRXZ0UHJldmlld1JlYWR5U3RhdGUocWNhbWVyYV9zbV9ldnRfZW51bV90IGV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBheWxvYWQpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IHJlc3VsdDsKKyAgICBtZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKHFjYW1lcmFfYXBpX3Jlc3VsdF90KSk7CisKKyAgICBMT0dMKCJldmVudCAoJWQpIiwgZXZ0KTsKKyAgICBzd2l0Y2ggKGV2dCkgeworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BSRVZJRVdfV0lORE9XOgorICAgICAgICB7CisgICAgICAgICAgICBtX3BhcmVudC0+c2V0UHJldmlld1dpbmRvdygoc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqKXBheWxvYWQpOworICAgICAgICAgICAgaWYgKG1fcGFyZW50LT5tUHJldmlld1dpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYXBwbHlEZWxheWVkTXNncygpOworICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+dW5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgICAgICAgICBtX3N0YXRlID0gUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXX1NUT1BQRUQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV0lORzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfQ0FMTEJBQ0tTOgorICAgICAgICB7CisgICAgICAgICAgICBxY2FtZXJhX3NtX2V2dF9zZXRjYl9wYXlsb2FkX3QgKnNldGNicyA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21fZXZ0X3NldGNiX3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zZXRDYWxsQmFja3Moc2V0Y2JzLT5ub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Y2JzLT5kYXRhX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+ZGF0YV9jYl90aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Y2JzLT5nZXRfbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+dXNlcik7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRU5BQkxFX01TR19UWVBFOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5lbmFibGVNc2dUeXBlKCooKGludDMyX3QgKilwYXlsb2FkKSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRElTQUJMRV9NU0dfVFlQRToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+ZGlzYWJsZU1zZ1R5cGUoKigoaW50MzJfdCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9NU0dfVFlQRV9FTkFCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IG1fcGFyZW50LT5tc2dUeXBlRW5hYmxlZCgqKChpbnQzMl90ICopcGF5bG9hZCkpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfRU5BQkxFX0ZMQUc7CisgICAgICAgICAgICByZXN1bHQuZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNUzoKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBuZWVkUmVzdGFydCA9IGZhbHNlOworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+dXBkYXRlUGFyYW1ldGVycygoY2hhciopcGF5bG9hZCwgbmVlZFJlc3RhcnQpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVNfU1RPUDoKKyAgICAgICAgeworICAgICAgICAgICAgTE9HRCgiU3RvcHBpbmcgcHJldmlldy4uLiIpOworICAgICAgICAgICAgLy8gbmVlZCByZXN0YXJ0IHByZXZpZXcgZm9yIHBhcmFtZXRlcnMgdG8gdGFrZSBlZmZlY3QKKyAgICAgICAgICAgIG1fcGFyZW50LT51bnByZXBhcmVQcmV2aWV3KCk7CisgICAgICAgICAgICAvLyBDbGVhciBtZW1vcnkgcG9vbHMKKyAgICAgICAgICAgIG1fcGFyZW50LT5tX21lbW9yeVBvb2wuY2xlYXIoKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TX0NPTU1JVDoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+Y29tbWl0UGFyYW1ldGVyQ2hhbmdlcygpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVNfUkVTVEFSVDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcHJlcGFyZSBwcmV2aWV3IGFnYWluCisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV19TVE9QUEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9wYXJlbnQtPnNldE5lZWRSZXN0YXJ0KGZhbHNlKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9HRVRfUEFSQU1TOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQucGFyYW1zID0gbV9wYXJlbnQtPmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIHJjID0gcmVzdWx0LnBhcmFtcyA/IE5PX0VSUk9SIDogVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX1BBUkFNUzsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QVVRfUEFSQU1TOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wdXRQYXJhbWV0ZXJzKChjaGFyKilwYXlsb2FkKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QUkVQQVJFX1BSRVZJRVc6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vIG9wcyBoZXJlCisgICAgICAgICAgICByYyA9IE5PX0VSUk9SOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUQVJUX05PRElTUExBWV9QUkVWSUVXOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zdGFydFByZXZpZXcoKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1fcGFyZW50LT51bnByZXBhcmVQcmV2aWV3KCk7CisgICAgICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV19TVE9QUEVEOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtX3N0YXRlID0gUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXSU5HOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbm8gb3BzIGhlcmUKKyAgICAgICAgICAgIHJjID0gTk9fRVJST1I7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RBUlRfUFJFVklFVzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1fcGFyZW50LT5tUHJldmlld1dpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c3RhcnRQcmV2aWV3KCk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT51bnByZXBhcmVQcmV2aWV3KCk7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfU1RPUFBFRDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXRlID0gUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXSU5HOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5vIG9wcyBoZXJlCisgICAgICAgICAgICByYyA9IE5PX0VSUk9SOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUT1BfUFJFVklFVzoKKyAgICAgICAgeworICAgICAgICAgICAgbV9wYXJlbnQtPnVucHJlcGFyZVByZXZpZXcoKTsKKyAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfU1RPUFBFRDsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QUkVWSUVXX0VOQUJMRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gTk9fRVJST1I7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9FTkFCTEVfRkxBRzsKKyAgICAgICAgICAgIHJlc3VsdC5lbmFibGVkID0gMTsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUNPUkRJTkdfRU5BQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfRU5BQkxFX0ZMQUc7CisgICAgICAgICAgICByZXN1bHQuZW5hYmxlZCA9IDA7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RPUkVfTUVUQURBVEFfSU5fQlVGUzoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c3RvcmVNZXRhRGF0YUluQnVmZmVycygqKChpbnQgKilwYXlsb2FkKSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRFVNUDoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+ZHVtcCgqKChpbnQgKilwYXlsb2FkKSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RBUlRfQVVUT19GT0NVUzoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+YXV0b0ZvY3VzKCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RPUF9BVVRPX0ZPQ1VTOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5jYW5jZWxBdXRvRm9jdXMoKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRU5EX0NPTU1BTkQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHFjYW1lcmFfc21fZXZ0X2NvbW1hbmRfcGF5bG9hZF90ICpjbWRfcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21fZXZ0X2NvbW1hbmRfcGF5bG9hZF90ICopcGF5bG9hZDsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnNlbmRDb21tYW5kKGNtZF9wYXlsb2FkLT5jbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRfcGF5bG9hZC0+YXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZF9wYXlsb2FkLT5hcmcyKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUdfRkFDRV9JTUFHRToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBmYWNlSUQgPSAwOworICAgICAgICAgICAgcWNhbWVyYV9zbV9ldnRfcmVnX2ZhY2VfcGF5bG9hZF90ICpyZWdfcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21fZXZ0X3JlZ19mYWNlX3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5yZWdpc3RlckZhY2VJbWFnZShyZWdfcGF5bG9hZC0+aW1nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ19wYXlsb2FkLT5jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlSUQpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfSEFORExFOworICAgICAgICAgICAgcmVzdWx0LmhhbmRsZSA9IGZhY2VJRDsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QUkVfU1RBUlRfUkVDT1JESU5HOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVTVEFSVF9TVE9QX1BSRVZJRVc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRVNUQVJUX1NUQVJUX1BSRVZJRVc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9SRUNPUkRJTkc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVE9QX1JFQ09SRElORzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRVBBUkVfU05BUFNIT1Q6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QUkVfVEFLRV9QSUNUVVJFOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfVEFLRV9QSUNUVVJFOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfQ0FOQ0VMX1BJQ1RVUkU6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUxFQVNFX1JFQ09SSUROR19GUkFNRToKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1JFTEVBU0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIExPR0UoIkVycm9yISEgY2Fubm90IGhhbmRsZSBldnQoJWQpIGluIHN0YXRlKCVkKSIsIGV2dCwgbV9zdGF0ZSk7CisgICAgICAgICAgICByYyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0VWVF9OT1RJRlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2NhbWVyYV9ldmVudF90ICpjYW1fZXZ0ID0gKG1tX2NhbWVyYV9ldmVudF90ICopcGF5bG9hZDsKKyAgICAgICAgICAgIHN3aXRjaCAoY2FtX2V2dC0+c2VydmVyX2V2ZW50X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0FNX0VWRU5UX1RZUEVfREFFTU9OX0RJRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+c2VuZEV2dE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfRVJST1JfU0VSVkVSX0RJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBpbnRlcm5hbCBldmVudCAlZCBpbiBzdGF0ZSglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZXZ0LT5zZXJ2ZXJfZXZlbnRfdHlwZSwgbV9zdGF0ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TTkFQU0hPVF9ET05FOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyBvcHMsIGJ1dCBuZWVkIHRvIG5vdGlmeQorICAgICAgICAgICAgTE9HVygiQ2Fubm90IGhhbmRsZSBldnQoJWQpIGluIHN0YXRlKCVkKSIsIGV2dCwgbV9zdGF0ZSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsRXZ0UmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9FVlRfSU5URVJOQUw6CisgICAgICAgeworICAgICAgICAgICBxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKmludGVybmFsX2V2dCA9CisgICAgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZXZ0LT5ldnRfdHlwZSkgeworICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0xFRF9NT0RFX09WRVJSSURFOgorICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+bVBhcmFtZXRlcnMudXBkYXRlRmxhc2hNb2RlKGludGVybmFsX2V2dC0+bGVkX2RhdGEpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBMT0dXKCJDYW5ub3QgaGFuZGxlIGV2dCglZCkgaW4gc3RhdGUoJWQpIiwgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgfQorICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfSlBFR19FVlRfTk9USUZZOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfVEhFUk1BTF9OT1RJRlk6CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HVygiQ2Fubm90IGhhbmRsZSBldnQoJWQpIGluIHN0YXRlKCVkKSIsIGV2dCwgbV9zdGF0ZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jRXZ0UHJldmlld2luZ1N0YXRlCisgKgorICogREVTQ1JJUFRJT046IGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uIHRvIGhhbmRsZSBldmVudCBpbiBzdGF0ZSBvZgorICogICAgICAgICAgICAgIFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV0lORy4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGV2dCAgICAgIDogZXZlbnQgdG8gYmUgcHJvY2Vzc2VkCisgKiAgIEBwYXlsb2FkICA6IGV2ZW50IHBheWxvYWQuIENhbiBiZSBOVUxMIGlmIG5vdCBuZWVkZWQuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RhdGVNYWNoaW5lOjpwcm9jRXZ0UHJldmlld2luZ1N0YXRlKHFjYW1lcmFfc21fZXZ0X2VudW1fdCBldnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGF5bG9hZCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgcmVzdWx0OworICAgIG1lbXNldCgmcmVzdWx0LCAwLCBzaXplb2YocWNhbWVyYV9hcGlfcmVzdWx0X3QpKTsKKworICAgIExPR0woImV2ZW50ICglZCkiLCBldnQpOworICAgIHN3aXRjaCAoZXZ0KSB7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfUFJFVklFV19XSU5ET1c6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEVycm9yIHNldHRpbmcgcHJldmlldyB3aW5kb3cgZHVyaW5nIHByZXZpZXdpbmcKKyAgICAgICAgICAgIExPR0UoIkVycm9yISEgY2Fubm90IHNldCBwcmV2aWV3IHdpbmRvdyB3aGVuIHByZXZpZXcgaXMgcnVubmluZyIpOworICAgICAgICAgICAgcmMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfQ0FMTEJBQ0tTOgorICAgICAgICB7CisgICAgICAgICAgICBxY2FtZXJhX3NtX2V2dF9zZXRjYl9wYXlsb2FkX3QgKnNldGNicyA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21fZXZ0X3NldGNiX3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zZXRDYWxsQmFja3Moc2V0Y2JzLT5ub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Y2JzLT5kYXRhX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+ZGF0YV9jYl90aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Y2JzLT5nZXRfbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+dXNlcik7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRU5BQkxFX01TR19UWVBFOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGVuYWJsZV9tc2dzID0gKigoaW50MzJfdCAqKXBheWxvYWQpOworICAgICAgICAgICAgaWYgKG1fYkRlbGF5UHJldmlld01zZ3MgJiYKKyAgICAgICAgICAgICAgICAgICAgKGVuYWJsZV9tc2dzICYgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FKSkgeworICAgICAgICAgICAgICAgIGVuYWJsZV9tc2dzICY9IH5DQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUU7CisgICAgICAgICAgICAgICAgbV9EZWxheWVkTXNncyA9IENBTUVSQV9NU0dfUFJFVklFV19GUkFNRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmVuYWJsZU1zZ1R5cGUoZW5hYmxlX21zZ3MpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0RJU0FCTEVfTVNHX1RZUEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZGlzYWJsZV9tc2dzID0gKigoaW50MzJfdCAqKXBheWxvYWQpOworICAgICAgICAgICAgaWYgKG1fYkRlbGF5UHJldmlld01zZ3MgJiYgbV9EZWxheWVkTXNncykgeworICAgICAgICAgICAgICAgIG1fRGVsYXllZE1zZ3MgJj0gfmRpc2FibGVfbXNnczsKKyAgICAgICAgICAgICAgICBpZiAoMCA9PSBtX0RlbGF5ZWRNc2dzKSB7CisgICAgICAgICAgICAgICAgICAgIG1fYkRlbGF5UHJldmlld01zZ3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5kaXNhYmxlTXNnVHlwZShkaXNhYmxlX21zZ3MpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX01TR19UWVBFX0VOQUJMRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgbXNncyA9ICooKGludDMyX3QgKilwYXlsb2FkKTsKKyAgICAgICAgICAgIGludCBlbmFibGVkID0gbV9wYXJlbnQtPm1zZ1R5cGVFbmFibGVkKG1zZ3MpOworICAgICAgICAgICAgaWYgKG1fYkRlbGF5UHJldmlld01zZ3MgJiYgbV9EZWxheWVkTXNncykgeworICAgICAgICAgICAgICAgIGVuYWJsZWQgfD0gKG1zZ3MgJiBtX0RlbGF5ZWRNc2dzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0VOQUJMRV9GTEFHOworICAgICAgICAgICAgcmVzdWx0LmVuYWJsZWQgPSBlbmFibGVkOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgbmVlZFJlc3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnVwZGF0ZVBhcmFtZXRlcnMoKGNoYXIqKXBheWxvYWQsIG5lZWRSZXN0YXJ0KTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TX1NUT1A6CisgICAgICAgIHsKKyAgICAgICAgICAgIExPR0QoIlN0b3BwaW5nIHByZXZpZXcuLi4iKTsKKyAgICAgICAgICAgIC8vIHN0b3AgcHJldmlldworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgICAgIC8vIENsZWFyIG1lbW9yeSBwb29scworICAgICAgICAgICAgbV9wYXJlbnQtPm1fbWVtb3J5UG9vbC5jbGVhcigpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVNfQ09NTUlUOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5jb21taXRQYXJhbWV0ZXJDaGFuZ2VzKCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19SRVNUQVJUOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBzdGFydCBwcmV2aWV3IGFnYWluCisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgYXBwbHlEZWxheWVkTXNncygpOworICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+dW5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV19TVE9QUEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1fcGFyZW50LT5zZXROZWVkUmVzdGFydChmYWxzZSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzICAgICAgICAgICAgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSAgICAgICA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSAgICAgICA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9HRVRfUEFSQU1TOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQucGFyYW1zID0gbV9wYXJlbnQtPmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIHJjID0gcmVzdWx0LnBhcmFtcyA/IE5PX0VSUk9SIDogVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX1BBUkFNUzsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QVVRfUEFSQU1TOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wdXRQYXJhbWV0ZXJzKChjaGFyKilwYXlsb2FkKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QUkVQQVJFX1BSRVZJRVc6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vIG9wcyBoZXJlCisgICAgICAgICAgICBMT0dXKCJBbHJlYWR5IGluIHByZXZpZXcgcmVhZHkgc3RhdGUsIG5vIG9wcyBoZXJlIik7CisgICAgICAgICAgICByYyA9IE5PX0VSUk9SOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUQVJUX1BSRVZJRVc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9OT0RJU1BMQVlfUFJFVklFVzoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm8gb3BzIGhlcmUKKyAgICAgICAgICAgIExPR1coIkFscmVhZHkgaW4gcHJldmlld2luZywgbm8gb3BzIGhlcmUgdG8gc3RhcnQgcHJldmlldyIpOworICAgICAgICAgICAgYXBwbHlEZWxheWVkTXNncygpOworICAgICAgICAgICAgcmMgPSBOT19FUlJPUjsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVE9QX1BSRVZJRVc6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnN0b3BQcmV2aWV3KCk7CisgICAgICAgICAgICBhcHBseURlbGF5ZWRNc2dzKCk7CisgICAgICAgICAgICBtX3N0YXRlID0gUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXX1NUT1BQRUQ7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFJFVklFV19FTkFCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBhcHBseURlbGF5ZWRNc2dzKCk7CisgICAgICAgICAgICByYyA9IE5PX0VSUk9SOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfRU5BQkxFX0ZMQUc7CisgICAgICAgICAgICByZXN1bHQuZW5hYmxlZCA9IDE7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVDT1JESU5HX0VOQUJMRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gTk9fRVJST1I7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9FTkFCTEVfRkxBRzsKKyAgICAgICAgICAgIHJlc3VsdC5lbmFibGVkID0gMDsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVE9SRV9NRVRBREFUQV9JTl9CVUZTOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKCooKGludCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9EVU1QOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5kdW1wKCooKGludCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9BVVRPX0ZPQ1VTOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5hdXRvRm9jdXMoKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVE9QX0FVVE9fRk9DVVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmNhbmNlbEF1dG9Gb2N1cygpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRV9TVEFSVF9SRUNPUkRJTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByZVN0YXJ0UmVjb3JkaW5nKCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RBUlRfUkVDT1JESU5HOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zdGFydFJlY29yZGluZygpOworICAgICAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgLy8gbW92ZSBzdGF0ZSB0byByZWNvcmRpbmcgc3RhdGUKKyAgICAgICAgICAgICAgICBtX3N0YXRlID0gUUNBTUVSQV9TTV9TVEFURV9SRUNPUkRJTkc7CisgICAgICAgICAgICAgICAgYXBwbHlEZWxheWVkTXNncygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRVBBUkVfU05BUFNIT1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByZXBhcmVIYXJkd2FyZUZvclNuYXBzaG90KEZBTFNFKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzaWduYWwgQVBJIHJlc3VsdCBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgLy8gTmVlZCB0byB3YWl0IGZvciBzbmFwc2hvdCBkb25lIGluIG1ldGFkdGEuCisgICAgICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFUEFSRV9TTkFQU0hPVDsKKyAgICAgICAgICAgICAgICBhcHBseURlbGF5ZWRNc2dzKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjaGFuZ2Ugc3RhdGUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgIExPR0UoInByZXBhcmVIYXJkd2FyZUZvclNuYXBzaG90IGZhaWxlZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICByYyk7CisKKyAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFJFX1RBS0VfUElDVFVSRToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJlVGFrZVBpY3R1cmUoKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9UQUtFX1BJQ1RVUkU6CisgICAgICAgeworICAgICAgICAgICBMT0dMKCJRQ0FNRVJBX1NNX0VWVF9UQUtFX1BJQ1RVUkUgIik7CisgICAgICAgICAgIGlmICggbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdldFJlY29yZGluZ0hpbnRWYWx1ZSgpID09IHRydWUpIHsKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+bVBhcmFtZXRlcnMudXBkYXRlUmVjb3JkaW5nSGludFZhbHVlKEZBTFNFKTsKKyAgICAgICAgICAgICAgICAvLyBzdGFydCBwcmV2aWV3IGFnYWluCisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJlcGFyZVByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c3RhcnRQcmV2aWV3KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnVucHJlcGFyZVByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAobV9wYXJlbnQtPmlzWlNMTW9kZSgpIHx8IG1fcGFyZW50LT5pc0xvbmdzaG90RW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICBib29sIHJlc3RhcnRQcmV2aWV3ID0gbV9wYXJlbnQtPmlzUHJldmlld1Jlc3RhcnRFbmFibGVkKCk7CisgICAgICAgICAgICAgICBpZiAoKHJlc3RhcnRQcmV2aWV3KSAmJiAobV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdldE1hbnVhbENhcHR1cmVNb2RlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgPj0gQ0FNX01BTlVBTF9DQVBUVVJFX1RZUEVfMykpIHsKKyAgICAgICAgICAgICAgICAgICAvKiBzdG9wIHByZXZpZXcgYW5kIGRpc2FibGUgWlNMIG5vdyAqLworICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5zdG9wUHJldmlldygpOworICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5tUGFyYW1ldGVycy51cGRhdGVaU0xNb2RlVmFsdWUoRkFMU0UpOworICAgICAgICAgICAgICAgICAgIG1fUmVzdG9yZVpTTCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgbV9iRGVsYXlQcmV2aWV3TXNncyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUElDX1RBS0lORzsKKyAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV19QSUNfVEFLSU5HOworICAgICAgICAgICAgICAgICAgIG1fYkRlbGF5UHJldmlld01zZ3MgPSB0cnVlOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT50YWtlUGljdHVyZSgpOworICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBzdGF0ZSB0byBwcmV2aWV3aW5nIHN0YXRlCisgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnVuY29uZmlndXJlQWR2YW5jZWRDYXB0dXJlKCk7CisgICAgICAgICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV0lORzsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGlmICghKG1fcGFyZW50LT5pc1JldHJvUGljdHVyZSgpKSB8fCAocmMgIT0gTk9fRVJST1IpKSB7CisgICAgICAgICAgICAgICAgICAgTE9HRCgic2lnbmFsIEFQSSByZXN1bHQsIG1fc3RhdGUgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUpOworICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICBtX3N0YXRlID0gUUNBTUVSQV9TTV9TVEFURV9QSUNfVEFLSU5HOworICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+dGFrZVBpY3R1cmUoKTsKKyAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGVtcF9yYyA9IE5PX0VSUk9SOworICAgICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RhdGUgdG8gcHJldmlldyBzdG9wcGVkIHN0YXRlCisgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnVuY29uZmlndXJlQWR2YW5jZWRDYXB0dXJlKCk7CisgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnN0b3BQcmV2aWV3KCk7CisgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgcHJldmlldyBhZ2FpbgorICAgICAgICAgICAgICAgICAgIHRlbXBfcmMgPSBtX3BhcmVudC0+cHJlcGFyZVByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICBpZiAodGVtcF9yYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX3JjID0gbV9wYXJlbnQtPnN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcF9yYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnVucHJlcGFyZVByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfU1RPUFBFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdJTkc7CisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXRlID0gUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXX1NUT1BQRUQ7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VORF9DT01NQU5EOgorICAgICAgICB7CisgICAgICAgICAgICBxY2FtZXJhX3NtX2V2dF9jb21tYW5kX3BheWxvYWRfdCAqY21kX3BheWxvYWQgPQorICAgICAgICAgICAgICAgICAgICAocWNhbWVyYV9zbV9ldnRfY29tbWFuZF9wYXlsb2FkX3QgKilwYXlsb2FkOworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c2VuZENvbW1hbmQoY21kX3BheWxvYWQtPmNtZCwKKyAgICAgICAgICAgICAgICAgICAgY21kX3BheWxvYWQtPmFyZzEsCisgICAgICAgICAgICAgICAgICAgIGNtZF9wYXlsb2FkLT5hcmcyKTsKKyAgICAgICAgICAgIG1fYlByZXZpZXdOZWVkc1Jlc3RhcnQgPQorICAgICAgICAgICAgICAgICAgICAoUUNBTUVSQV9TTV9FVlRfUkVTVEFSVF9QRVJWSUVXID09IGNtZF9wYXlsb2FkLT5hcmcxKTsKKyAgICAgICAgICAgIG1fYlByZXZpZXdEZWxheWVkUmVzdGFydCA9CisgICAgICAgICAgICAgICAgICAgIChRQ0FNRVJBX1NNX0VWVF9ERUxBWUVEX1JFU1RBUlQgPT0gY21kX3BheWxvYWQtPmFyZzIpOworCisjaWZuZGVmIFZBTklMTEFfSEFMCisgICAgICAgICAgICBpZiAoKENBTUVSQV9DTURfTE9OR1NIT1RfT04gPT0gY21kX3BheWxvYWQtPmNtZCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1fYlByZXZpZXdOZWVkc1Jlc3RhcnQpKSB7CisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnN0b3BQcmV2aWV3KCk7CisgICAgICAgICAgICAgICAgLy8gQ2xlYXIgbWVtb3J5IHBvb2xzCisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm1fbWVtb3J5UG9vbC5jbGVhcigpOworCisgICAgICAgICAgICAgICAgaWYgKCFtX2JQcmV2aWV3RGVsYXllZFJlc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnQgcHJldmlldyBhZ2FpbgorICAgICAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgICAgICAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5RGVsYXllZE1zZ3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnVucHJlcGFyZVByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFTkRfQ09NTUFORF9SRVNUQVJUOgorICAgICAgICB7CisjaWZuZGVmIFZBTklMTEFfSEFMCisgICAgICAgICAgICBxY2FtZXJhX3NtX2V2dF9jb21tYW5kX3BheWxvYWRfdCAqY21kX3BheWxvYWQgPQorICAgICAgICAgICAgICAgICAgICAocWNhbWVyYV9zbV9ldnRfY29tbWFuZF9wYXlsb2FkX3QgKilwYXlsb2FkOworICAgICAgICAgICAgaWYgKChDQU1FUkFfQ01EX0xPTkdTSE9UX09OID09IGNtZF9wYXlsb2FkLT5jbWQpICYmCisgICAgICAgICAgICAgICAgICAgIChtX2JQcmV2aWV3TmVlZHNSZXN0YXJ0KSAmJgorICAgICAgICAgICAgICAgICAgICAobV9iUHJldmlld0RlbGF5ZWRSZXN0YXJ0KSkgeworICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHByZXZpZXcgYWdhaW4KKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zdGFydFByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+dW5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVHX0ZBQ0VfSU1BR0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZmFjZUlEID0gMDsKKyAgICAgICAgICAgIHFjYW1lcmFfc21fZXZ0X3JlZ19mYWNlX3BheWxvYWRfdCAqcmVnX3BheWxvYWQgPQorICAgICAgICAgICAgICAgIChxY2FtZXJhX3NtX2V2dF9yZWdfZmFjZV9wYXlsb2FkX3QgKilwYXlsb2FkOworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cmVnaXN0ZXJGYWNlSW1hZ2UocmVnX3BheWxvYWQtPmltZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdfcGF5bG9hZC0+Y29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZUlEKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0hBTkRMRTsKKyAgICAgICAgICAgIHJlc3VsdC5oYW5kbGUgPSBmYWNlSUQ7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfQ0FOQ0VMX1BJQ1RVUkU6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVE9QX1JFQ09SRElORzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1JFTEVBU0VfUkVDT1JJRE5HX0ZSQU1FOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVMRUFTRToKKyAgICAgICAgeworICAgICAgICAgICAgTE9HRSgiRXJyb3IhISBjYW5ub3QgaGFuZGxlIGV2dCglZCkgaW4gc3RhdGUoJWQpIiwgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgICAgIHJjID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRVZUX0lOVEVSTkFMOgorICAgICAgICB7CisgICAgICAgICAgICBxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKmludGVybmFsX2V2dCA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICBzd2l0Y2ggKGludGVybmFsX2V2dC0+ZXZ0X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfRk9DVVNfVVBEQVRFOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NBdXRvRm9jdXNFdmVudChpbnRlcm5hbF9ldnQtPmZvY3VzX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9QUkVQX1NOQVBTSE9UX0RPTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0ZBQ0VfREVURUNUX1JFU1VMVDoKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzRmFjZURldGVjdGlvblJlc3VsdCgmaW50ZXJuYWxfZXZ0LT5mYWNlc19kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfSElTVE9HUkFNX1NUQVRTOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NIaXN0b2dyYW1TdGF0cyhpbnRlcm5hbF9ldnQtPnN0YXRzX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9DUk9QX0lORk86CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc1pvb21FdmVudChpbnRlcm5hbF9ldnQtPmNyb3BfZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0FTRF9VUERBVEU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc0FTRFVwZGF0ZShpbnRlcm5hbF9ldnQtPmFzZF9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfTEVEX01PREVfT1ZFUlJJREU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+bVBhcmFtZXRlcnMudXBkYXRlRmxhc2hNb2RlKGludGVybmFsX2V2dC0+bGVkX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9BV0JfVVBEQVRFOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnRyYW5zQXdiTWV0YVRvUGFyYW1zKGludGVybmFsX2V2dC0+YXdiX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9BRV9VUERBVEU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc0FFSW5mbyhpbnRlcm5hbF9ldnQtPmFlX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9GT0NVU19QT1NfVVBEQVRFOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NGb2N1c1Bvc2l0aW9uSW5mbyhpbnRlcm5hbF9ldnQtPmZvY3VzX3Bvcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0hEUl9VUERBVEU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc0hEUkRhdGEoaW50ZXJuYWxfZXZ0LT5oZHJfZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX1JFVFJPX0FFQ19VTkxPQ0s6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc1JldHJvQUVDVW5sb2NrKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX1pTTF9DQVBUVVJFX0RPTkU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc1pTTENhcHR1cmVEb25lKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR0UoIkludmFsaWQgaW50ZXJuYWwgZXZlbnQgJWQgaW4gc3RhdGUoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfZXZ0LT5ldnRfdHlwZSwgbV9zdGF0ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9FVlRfTk9USUZZOgorICAgICAgICB7CisgICAgICAgICAgICBtbV9jYW1lcmFfZXZlbnRfdCAqY2FtX2V2dCA9IChtbV9jYW1lcmFfZXZlbnRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICBzd2l0Y2ggKGNhbV9ldnQtPnNlcnZlcl9ldmVudF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIENBTV9FVkVOVF9UWVBFX0RBRU1PTl9ESUVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0VSUk9SX1NFUlZFUl9ESUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR1coIm5vIGhhbmRsaW5nIGZvciBzZXJ2ZXIgZXZ0ICglZCkgYXQgdGhpcyBzdGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgIGNhbV9ldnQtPnNlcnZlcl9ldmVudF90eXBlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1RIRVJNQUxfTk9USUZZOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT51cGRhdGVUaGVybWFsTGV2ZWwocGF5bG9hZCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TTkFQU0hPVF9ET05FOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyBvcHMsIGJ1dCBuZWVkIHRvIG5vdGlmeQorICAgICAgICAgICAgTE9HVygiQ2Fubm90IGhhbmRsZSBldnQoJWQpIGluIHN0YXRlKCVkKSIsIGV2dCwgbV9zdGF0ZSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsRXZ0UmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRVNUQVJUX1NUT1BfUFJFVklFVzoKKyAgICAgICAgeworICAgICAgICAgICAgbV9wYXJlbnQtPnN0b3BQcmV2aWV3KCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRVNUQVJUX1NUQVJUX1BSRVZJRVc6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByZXBhcmVQcmV2aWV3KCk7CisgICAgICAgICAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zdGFydFByZXZpZXcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0pQRUdfRVZUX05PVElGWToKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dXKCJDYW5ub3QgaGFuZGxlIGV2dCglZCkgaW4gc3RhdGUoJWQpIiwgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2NFdnRQcmVwYXJlU25hcHNob3RTdGF0ZQorICoKKyAqIERFU0NSSVBUSU9OOiBmaW5pdGUgc3RhdGUgbWFjaGluZSBmdW5jdGlvbiB0byBoYW5kbGUgZXZlbnQgaW4gc3RhdGUgb2YKKyAqICAgICAgICAgICAgICBRQ0FNRVJBX1NNX1NUQVRFX1BSRVBBUkVfU05BUFNIT1QuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBldnQgICAgICA6IGV2ZW50IHRvIGJlIHByb2Nlc3NlZAorICogICBAcGF5bG9hZCAgOiBldmVudCBwYXlsb2FkLiBDYW4gYmUgTlVMTCBpZiBub3QgbmVlZGVkLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVN0YXRlTWFjaGluZTo6cHJvY0V2dFByZXBhcmVTbmFwc2hvdFN0YXRlKHFjYW1lcmFfc21fZXZ0X2VudW1fdCBldnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGF5bG9hZCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgcmVzdWx0OworICAgIG1lbXNldCgmcmVzdWx0LCAwLCBzaXplb2YocWNhbWVyYV9hcGlfcmVzdWx0X3QpKTsKKworICAgIExPR0woImV2ZW50ICglZCkiLCBldnQpOworICAgIHN3aXRjaCAoZXZ0KSB7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfUFJFVklFV19XSU5ET1c6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfQ0FMTEJBQ0tTOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRU5BQkxFX01TR19UWVBFOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRElTQUJMRV9NU0dfVFlQRToKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX01TR19UWVBFX0VOQUJMRUQ6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19TVE9QOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19DT01NSVQ6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TX1JFU1RBUlQ6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9HRVRfUEFSQU1TOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFVUX1BBUkFNUzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRVBBUkVfUFJFVklFVzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUQVJUX1BSRVZJRVc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9OT0RJU1BMQVlfUFJFVklFVzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUT1BfUFJFVklFVzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRVZJRVdfRU5BQkxFRDoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1JFQ09SRElOR19FTkFCTEVEOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RPUkVfTUVUQURBVEFfSU5fQlVGUzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0RVTVA6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9BVVRPX0ZPQ1VTOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RPUF9BVVRPX0ZPQ1VTOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFJFX1NUQVJUX1JFQ09SRElORzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1JFU1RBUlRfU1RPUF9QUkVWSUVXOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVTVEFSVF9TVEFSVF9QUkVWSUVXOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RBUlRfUkVDT1JESU5HOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFJFX1RBS0VfUElDVFVSRToKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1RBS0VfUElDVFVSRToKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRVBBUkVfU05BUFNIT1Q6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRU5EX0NPTU1BTkQ6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9DQU5DRUxfUElDVFVSRToKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUT1BfUkVDT1JESU5HOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVMRUFTRV9SRUNPUklETkdfRlJBTUU6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUxFQVNFOgorICAgICAgICB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciEhIGNhbm5vdCBoYW5kbGUgZXZ0KCVkKSBpbiBzdGF0ZSglZCkiLCBldnQsIG1fc3RhdGUpOworICAgICAgICAgICAgcmMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9FVlRfSU5URVJOQUw6CisgICAgICAgIHsKKyAgICAgICAgICAgIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqaW50ZXJuYWxfZXZ0ID0KKyAgICAgICAgICAgICAgICAocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICopcGF5bG9hZDsKKyAgICAgICAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZXZ0LT5ldnRfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9GT0NVU19VUERBVEU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc0F1dG9Gb2N1c0V2ZW50KGludGVybmFsX2V2dC0+Zm9jdXNfZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX1BSRVBfU05BUFNIT1RfRE9ORToKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+cHJvY2Vzc1ByZXBTbmFwc2hvdERvbmVFdmVudChpbnRlcm5hbF9ldnQtPnByZXBfc25hcHNob3Rfc3RhdGUpOworICAgICAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdJTkc7CisKKyAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gTk9fRVJST1I7CisgICAgICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gUUNBTUVSQV9TTV9FVlRfUFJFUEFSRV9TTkFQU0hPVDsKKyAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfRkFDRV9ERVRFQ1RfUkVTVUxUOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NGYWNlRGV0ZWN0aW9uUmVzdWx0KCZpbnRlcm5hbF9ldnQtPmZhY2VzX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9ISVNUT0dSQU1fU1RBVFM6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc0hpc3RvZ3JhbVN0YXRzKGludGVybmFsX2V2dC0+c3RhdHNfZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0NST1BfSU5GTzoKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzWm9vbUV2ZW50KGludGVybmFsX2V2dC0+Y3JvcF9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfQVNEX1VQREFURToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzQVNEVXBkYXRlKGludGVybmFsX2V2dC0+YXNkX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9MRURfTU9ERV9PVkVSUklERToKKyAgICAgICAgICAgICAgICBMT0dXKCJDYW5ub3QgaGFuZGxlIGV2dCglZCkgaW4gc3RhdGUoJWQpIiwgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfQVdCX1VQREFURToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT50cmFuc0F3Yk1ldGFUb1BhcmFtcyhpbnRlcm5hbF9ldnQtPmF3Yl9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfQUVfVVBEQVRFOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NBRUluZm8oaW50ZXJuYWxfZXZ0LT5hZV9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfRk9DVVNfUE9TX1VQREFURToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzRm9jdXNQb3NpdGlvbkluZm8oaW50ZXJuYWxfZXZ0LT5mb2N1c19wb3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9IRFJfVVBEQVRFOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NIRFJEYXRhKGludGVybmFsX2V2dC0+aGRyX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9SRVRST19BRUNfVU5MT0NLOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NSZXRyb0FFQ1VubG9jaygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9aU0xfQ0FQVFVSRV9ET05FOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NaU0xDYXB0dXJlRG9uZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGludGVybmFsIGV2ZW50ICVkIGluIHN0YXRlKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsX2V2dC0+ZXZ0X3R5cGUsIG1fc3RhdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRVZUX05PVElGWToKKyAgICAgICAgeworICAgICAgICAgICAgbW1fY2FtZXJhX2V2ZW50X3QgKmNhbV9ldnQgPSAobW1fY2FtZXJhX2V2ZW50X3QgKilwYXlsb2FkOworICAgICAgICAgICAgc3dpdGNoIChjYW1fZXZ0LT5zZXJ2ZXJfZXZlbnRfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBDQU1fRVZFTlRfVFlQRV9EQUVNT05fRElFRDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgaW50ZXJuYWwgZXZlbnRzIHRvIHN0b3AgaW5kZWZpbml0ZSB3YWl0IG9uIHByZXBhcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gc25hcHNob3QgZG9uZSBldmVudC4KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBRQ0FNRVJBX1NNX0VWVF9QUkVQQVJFX1NOQVBTSE9UOworICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBRQ0FNRVJBX1NNX0VWVF9UQUtFX1BJQ1RVUkU7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKworICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+c2VuZEV2dE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfRVJST1JfU0VSVkVSX0RJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBpbnRlcm5hbCBldmVudCAlZCBpbiBzdGF0ZSglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZXZ0LT5zZXJ2ZXJfZXZlbnRfdHlwZSwgbV9zdGF0ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TTkFQU0hPVF9ET05FOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyBvcHMsIGJ1dCBuZWVkIHRvIG5vdGlmeQorICAgICAgICAgICAgTE9HVygiQ2Fubm90IGhhbmRsZSBldnQoJWQpIGluIHN0YXRlKCVkKSIsIGV2dCwgbV9zdGF0ZSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsRXZ0UmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9USEVSTUFMX05PVElGWToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+dXBkYXRlVGhlcm1hbExldmVsKHBheWxvYWQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfSlBFR19FVlRfTk9USUZZOgorICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1coIkNhbm5vdCBoYW5kbGUgZXZ0KCVkKSBpbiBzdGF0ZSglZCkiLCBldnQsIG1fc3RhdGUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJvY0V2dFBpY1Rha2luZ1N0YXRlCisgKgorICogREVTQ1JJUFRJT046IGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uIHRvIGhhbmRsZSBldmVudCBpbiBzdGF0ZSBvZgorICogICAgICAgICAgICAgIFFDQU1FUkFfU01fU1RBVEVfUElDX1RBS0lORy4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGV2dCAgICAgIDogZXZlbnQgdG8gYmUgcHJvY2Vzc2VkCisgKiAgIEBwYXlsb2FkICA6IGV2ZW50IHBheWxvYWQuIENhbiBiZSBOVUxMIGlmIG5vdCBuZWVkZWQuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RhdGVNYWNoaW5lOjpwcm9jRXZ0UGljVGFraW5nU3RhdGUocWNhbWVyYV9zbV9ldnRfZW51bV90IGV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBheWxvYWQpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IHJlc3VsdDsKKyAgICBtZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKHFjYW1lcmFfYXBpX3Jlc3VsdF90KSk7CisKKyAgICBMT0dMKCJldmVudCAoJWQpIiwgZXZ0KTsKKyAgICBzd2l0Y2ggKGV2dCkgeworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BSRVZJRVdfV0lORE9XOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBFcnJvciBzZXR0aW5nIHByZXZpZXcgd2luZG93IGR1cmluZyBwcmV2aWV3aW5nCisgICAgICAgICAgICBMT0dFKCJFcnJvciEhIGNhbm5vdCBzZXQgcHJldmlldyB3aW5kb3cgd2hlbiBwcmV2aWV3IGlzIHJ1bm5pbmciKTsKKyAgICAgICAgICAgIHJjID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX0NBTExCQUNLUzoKKyAgICAgICAgeworICAgICAgICAgICAgcWNhbWVyYV9zbV9ldnRfc2V0Y2JfcGF5bG9hZF90ICpzZXRjYnMgPQorICAgICAgICAgICAgICAgIChxY2FtZXJhX3NtX2V2dF9zZXRjYl9wYXlsb2FkX3QgKilwYXlsb2FkOworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c2V0Q2FsbEJhY2tzKHNldGNicy0+bm90aWZ5X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+ZGF0YV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRjYnMtPmRhdGFfY2JfdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+Z2V0X21lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRjYnMtPnVzZXIpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0VOQUJMRV9NU0dfVFlQRToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+ZW5hYmxlTXNnVHlwZSgqKChpbnQzMl90ICopcGF5bG9hZCkpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0RJU0FCTEVfTVNHX1RZUEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmRpc2FibGVNc2dUeXBlKCooKGludDMyX3QgKilwYXlsb2FkKSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfTVNHX1RZUEVfRU5BQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGVuYWJsZWQgPSBtX3BhcmVudC0+bXNnVHlwZUVuYWJsZWQoKigoaW50MzJfdCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0VOQUJMRV9GTEFHOworICAgICAgICAgICAgcmVzdWx0LmVuYWJsZWQgPSBlbmFibGVkOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgbmVlZFJlc3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnVwZGF0ZVBhcmFtZXRlcnMoKGNoYXIqKXBheWxvYWQsIG5lZWRSZXN0YXJ0KTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TX1NUT1A6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TX0NPTU1JVDoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+Y29tbWl0UGFyYW1ldGVyQ2hhbmdlcygpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVNfUkVTVEFSVDoKKyAgICAgICAgeworICAgICAgICAgICAgbV9wYXJlbnQtPnNldE5lZWRSZXN0YXJ0KGZhbHNlKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgICAgICAgICAgID0gIHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpICAgICAgPSAgZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlICAgICAgPSAgUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0dFVF9QQVJBTVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdC5wYXJhbXMgPSBtX3BhcmVudC0+Z2V0UGFyYW1ldGVycygpOworICAgICAgICAgICAgcmMgPSByZXN1bHQucGFyYW1zID8gTk9fRVJST1IgOiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfUEFSQU1TOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BVVF9QQVJBTVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnB1dFBhcmFtZXRlcnMoKGNoYXIqKXBheWxvYWQpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUT1BfUFJFVklFVzoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY2FuY2VsIHBpY3R1cmUgZmlyc3QKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmNhbmNlbFBpY3R1cmUoKTsKKyAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfU1RPUFBFRDsKKworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRVZJRVdfRU5BQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBOT19FUlJPUjsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0VOQUJMRV9GTEFHOworICAgICAgICAgICAgcmVzdWx0LmVuYWJsZWQgPSAwOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1JFQ09SRElOR19FTkFCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IE5PX0VSUk9SOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfRU5BQkxFX0ZMQUc7CisgICAgICAgICAgICByZXN1bHQuZW5hYmxlZCA9IDA7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RPUkVfTUVUQURBVEFfSU5fQlVGUzoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c3RvcmVNZXRhRGF0YUluQnVmZmVycygqKChpbnQgKilwYXlsb2FkKSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRFVNUDoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+ZHVtcCgqKChpbnQgKilwYXlsb2FkKSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RBUlRfQVVUT19GT0NVUzoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+YXV0b0ZvY3VzKCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RPUF9BVVRPX0ZPQ1VTOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5jYW5jZWxBdXRvRm9jdXMoKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRU5EX0NPTU1BTkQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHFjYW1lcmFfc21fZXZ0X2NvbW1hbmRfcGF5bG9hZF90ICpjbWRfcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21fZXZ0X2NvbW1hbmRfcGF5bG9hZF90ICopcGF5bG9hZDsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnNlbmRDb21tYW5kKGNtZF9wYXlsb2FkLT5jbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRfcGF5bG9hZC0+YXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZF9wYXlsb2FkLT5hcmcyKTsKKyNpZm5kZWYgVkFOSUxMQV9IQUwKKyAgICAgICAgICAgIGlmICggQ0FNRVJBX0NNRF9MT05HU0hPVF9PRkYgPT0gY21kX3BheWxvYWQtPmNtZCApIHsKKyAgICAgICAgICAgICAgICAvLyBtb3ZlIHN0YXRlIHRvIHByZXZpZXdpbmcgc3RhdGUKKyAgICAgICAgICAgICAgICBtX3N0YXRlID0gUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXSU5HOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfQ0FOQ0VMX1BJQ1RVUkU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmNhbmNlbFBpY3R1cmUoKTsKKyAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfU1RPUFBFRDsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUdfRkFDRV9JTUFHRToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBmYWNlSUQgPSAwOworICAgICAgICAgICAgcWNhbWVyYV9zbV9ldnRfcmVnX2ZhY2VfcGF5bG9hZF90ICpyZWdfcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21fZXZ0X3JlZ19mYWNlX3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5yZWdpc3RlckZhY2VJbWFnZShyZWdfcGF5bG9hZC0+aW1nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ19wYXlsb2FkLT5jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlSUQpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfSEFORExFOworICAgICAgICAgICAgcmVzdWx0LmhhbmRsZSA9IGZhY2VJRDsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QUkVfVEFLRV9QSUNUVVJFOgorICAgICAgICB7CisgICAgICAgICAgIGlmICggbV9wYXJlbnQtPmlzTG9uZ3Nob3RFbmFibGVkKCkgKSB7CisgICAgICAgICAgICAgICAvLyBubyBvcHMgaGVyZSwgbmVlZCB0byBzaW5nYWwgTk9fRVJST1IKKyAgICAgICAgICAgICAgIHJjID0gTk9fRVJST1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yISEgY2Fubm90IGhhbmRsZSBldnQoJWQpIGluIHN0YXRlKCVkKSIsIGV2dCwgbV9zdGF0ZSk7CisgICAgICAgICAgICAgICAgcmMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1RBS0VfUElDVFVSRToKKyAgICAgICAgeworICAgICAgICAgICBpZiAoIG1fcGFyZW50LT5pc0xvbmdzaG90RW5hYmxlZCgpICkgeworICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+bG9uZ1Nob3QoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IhISBjYW5ub3QgaGFuZGxlIGV2dCglZCkgaW4gc3RhdGUoJWQpIiwgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgICAgICAgICByYyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFJFUEFSRV9TTkFQU0hPVDoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRV9TVEFSVF9SRUNPUkRJTkc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRVNUQVJUX1NUT1BfUFJFVklFVzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1JFU1RBUlRfU1RBUlRfUFJFVklFVzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUQVJUX1JFQ09SRElORzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUT1BfUkVDT1JESU5HOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVMRUFTRV9SRUNPUklETkdfRlJBTUU6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QUkVQQVJFX1BSRVZJRVc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9QUkVWSUVXOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RBUlRfTk9ESVNQTEFZX1BSRVZJRVc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUxFQVNFOgorICAgICAgICB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciEhIGNhbm5vdCBoYW5kbGUgZXZ0KCVkKSBpbiBzdGF0ZSglZCkiLCBldnQsIG1fc3RhdGUpOworICAgICAgICAgICAgcmMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9FVlRfSU5URVJOQUw6CisgICAgICAgIHsKKyAgICAgICAgICAgIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqaW50ZXJuYWxfZXZ0ID0KKyAgICAgICAgICAgICAgICAocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICopcGF5bG9hZDsKKyAgICAgICAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZXZ0LT5ldnRfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9GT0NVU19VUERBVEU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc0F1dG9Gb2N1c0V2ZW50KGludGVybmFsX2V2dC0+Zm9jdXNfZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX1BSRVBfU05BUFNIT1RfRE9ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfRkFDRV9ERVRFQ1RfUkVTVUxUOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9ISVNUT0dSQU1fU1RBVFM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0NST1BfSU5GTzoKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzWm9vbUV2ZW50KGludGVybmFsX2V2dC0+Y3JvcF9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfQVNEX1VQREFURToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzQVNEVXBkYXRlKGludGVybmFsX2V2dC0+YXNkX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9MRURfTU9ERV9PVkVSUklERToKKyAgICAgICAgICAgICAgICBMT0dXKCJDYW5ub3QgaGFuZGxlIGV2dCglZCkgaW4gc3RhdGUoJWQpIiwgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfQVdCX1VQREFURToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT50cmFuc0F3Yk1ldGFUb1BhcmFtcyhpbnRlcm5hbF9ldnQtPmF3Yl9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfQUVfVVBEQVRFOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NBRUluZm8oaW50ZXJuYWxfZXZ0LT5hZV9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfRk9DVVNfUE9TX1VQREFURToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzRm9jdXNQb3NpdGlvbkluZm8oaW50ZXJuYWxfZXZ0LT5mb2N1c19wb3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9IRFJfVVBEQVRFOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NIRFJEYXRhKGludGVybmFsX2V2dC0+aGRyX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9SRVRST19BRUNfVU5MT0NLOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NSZXRyb0FFQ1VubG9jaygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9aU0xfQ0FQVFVSRV9ET05FOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NaU0xDYXB0dXJlRG9uZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0VWVF9OT1RJRlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2NhbWVyYV9ldmVudF90ICpjYW1fZXZ0ID0gKG1tX2NhbWVyYV9ldmVudF90ICopcGF5bG9hZDsKKyAgICAgICAgICAgIHN3aXRjaCAoY2FtX2V2dC0+c2VydmVyX2V2ZW50X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0FNX0VWRU5UX1RZUEVfREFFTU9OX0RJRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGludGVybmFsIGV2ZW50cyB0byBzdG9wIGluZGVmaW5pdGUgd2FpdCBvbiBwcmVwYXJlCisgICAgICAgICAgICAgICAgICAgIC8vIHNuYXBzaG90IGRvbmUgZXZlbnQuCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gUUNBTUVSQV9TTV9FVlRfUFJFUEFSRV9TTkFQU0hPVDsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gUUNBTUVSQV9TTV9FVlRfVEFLRV9QSUNUVVJFOworICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisKKyAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0VSUk9SX1NFUlZFUl9ESUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTV9FVkVOVF9UWVBFX0NBQ19ET05FOgorICAgICAgICAgICAgICAgIGlmIChtX3BhcmVudC0+aXNDQUNFbmFibGVkKCkgfHwgbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmlzT0VNRmVhdEVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dEKCJbTE9OR19TSE9UX0RCR10gOiBSZWNlaXZlZCBDQUMgRG9uZSIpOworICAgICAgICAgICAgICAgICAgICBpZiAobV9wYXJlbnQtPmlzTG9uZ3Nob3RFbmFibGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbV9wYXJlbnQtPmlzQ2FwdHVyZVNodXR0ZXJFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBsYXkgc2h1dHRlciBzb3VuZCBmb3IgbG9uZ3Nob3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFmdGVyIENBQyBzdGFnZSBpcyBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+cGxheVNodXR0ZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+bUNBQ0RvbmVSZWNlaXZlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dIKCJubyBoYW5kbGluZyBmb3Igc2VydmVyIGV2dCAoJWQpIGF0IHRoaXMgc3RhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICBjYW1fZXZ0LT5zZXJ2ZXJfZXZlbnRfdHlwZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9KUEVHX0VWVF9OT1RJRlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHFjYW1lcmFfanBlZ19ldnRfcGF5bG9hZF90ICpqcGVnX2pvYiA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfanBlZ19ldnRfcGF5bG9hZF90ICopcGF5bG9hZDsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NKcGVnTm90aWZ5KGpwZWdfam9iKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUT1BfQ0FQVFVSRV9DSEFOTkVMOgorICAgICAgICB7CisgICAgICAgICAgICBib29sIHJlc3RhcnRQcmV2aWV3ID0gbV9wYXJlbnQtPmlzUHJldmlld1Jlc3RhcnRFbmFibGVkKCk7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zdG9wQ2FwdHVyZUNoYW5uZWwocmVzdGFydFByZXZpZXcpOworCisgICAgICAgICAgICBpZiAocmVzdGFydFByZXZpZXcgJiYgKE5PX0VSUk9SID09IHJjKSkgeworICAgICAgICAgICAgICAgIG1fcGFyZW50LT51bmNvbmZpZ3VyZUFkdmFuY2VkQ2FwdHVyZSgpOworICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByZXBhcmVQcmV2aWV3KCk7CisgICAgICAgICAgICAgICAgaWYgKE5PX0VSUk9SID09IHJjKSB7CisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5tX2JQcmV2aWV3U3RhcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGFwcGx5RGVsYXllZE1zZ3MoKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c3RhcnRQcmV2aWV3KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU05BUFNIT1RfRE9ORToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+Y2FuY2VsUGljdHVyZSgpOworCisgICAgICAgICAgICBib29sIHJlc3RhcnRQcmV2aWV3ID0gbV9wYXJlbnQtPmlzUHJldmlld1Jlc3RhcnRFbmFibGVkKCk7CisgICAgICAgICAgICBpZiAocmVzdGFydFByZXZpZXcpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9wYXJlbnQtPm1QYXJhbWV0ZXJzLmdldE1hbnVhbENhcHR1cmVNb2RlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgID49IENBTV9NQU5VQUxfQ0FQVFVSRV9UWVBFXzMpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPm1QYXJhbWV0ZXJzLnVwZGF0ZVpTTE1vZGVWYWx1ZShtX1Jlc3RvcmVaU0wpOworICAgICAgICAgICAgICAgICAgICBtX1Jlc3RvcmVaU0wgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJlcGFyZVByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5PX0VSUk9SID09IHJjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+bV9iUHJldmlld1N0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlEZWxheWVkTXNncygpOworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c3RhcnRQcmV2aWV3KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV0lORzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV19TVE9QUEVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsRXZ0UmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfVEhFUk1BTF9OT1RJRlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnVwZGF0ZVRoZXJtYWxMZXZlbChwYXlsb2FkKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dXKCJDYW5ub3QgaGFuZGxlIGV2dCglZCkgaW4gc3RhdGUoJWQpIiwgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2NFdnRSZWNvcmRpbmdTdGF0ZQorICoKKyAqIERFU0NSSVBUSU9OOiBmaW5pdGUgc3RhdGUgbWFjaGluZSBmdW5jdGlvbiB0byBoYW5kbGUgZXZlbnQgaW4gc3RhdGUgb2YKKyAqICAgICAgICAgICAgICBRQ0FNRVJBX1NNX1NUQVRFX1JFQ09SRElORy4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGV2dCAgICAgIDogZXZlbnQgdG8gYmUgcHJvY2Vzc2VkCisgKiAgIEBwYXlsb2FkICA6IGV2ZW50IHBheWxvYWQuIENhbiBiZSBOVUxMIGlmIG5vdCBuZWVkZWQuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RhdGVNYWNoaW5lOjpwcm9jRXZ0UmVjb3JkaW5nU3RhdGUocWNhbWVyYV9zbV9ldnRfZW51bV90IGV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBheWxvYWQpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IHJlc3VsdDsKKyAgICBtZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKHFjYW1lcmFfYXBpX3Jlc3VsdF90KSk7CisKKyAgICBMT0dMKCJldmVudCAoJWQpIiwgZXZ0KTsKKyAgICBzd2l0Y2ggKGV2dCkgeworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFJFUEFSRV9QUkVWSUVXOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RBUlRfUFJFVklFVzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QUkVWSUVXX1dJTkRPVzoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV0E6IENUUyB0ZXN0IFZpZGVvU25hcHNob3Qgd2lsbCB0cnkgdG8KKyAgICAgICAgICAgIC8vICAgICBzdGFydCBwcmV2aWV3IGR1cmluZyB2aWRlbyByZWNvcmRpbmcuCisgICAgICAgICAgICBMT0dIKCJDVFMgdmlkZW8gcmVzdGFydCBvcCIpOworICAgICAgICAgICAgcmMgPSBOT19FUlJPUjsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfQ0FMTEJBQ0tTOgorICAgICAgICB7CisgICAgICAgICAgICBxY2FtZXJhX3NtX2V2dF9zZXRjYl9wYXlsb2FkX3QgKnNldGNicyA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21fZXZ0X3NldGNiX3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zZXRDYWxsQmFja3Moc2V0Y2JzLT5ub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Y2JzLT5kYXRhX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+ZGF0YV9jYl90aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Y2JzLT5nZXRfbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+dXNlcik7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRU5BQkxFX01TR19UWVBFOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5lbmFibGVNc2dUeXBlKCooKGludDMyX3QgKilwYXlsb2FkKSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRElTQUJMRV9NU0dfVFlQRToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+ZGlzYWJsZU1zZ1R5cGUoKigoaW50MzJfdCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9NU0dfVFlQRV9FTkFCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IG1fcGFyZW50LT5tc2dUeXBlRW5hYmxlZCgqKChpbnQzMl90ICopcGF5bG9hZCkpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfRU5BQkxFX0ZMQUc7CisgICAgICAgICAgICByZXN1bHQuZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNUzoKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBuZWVkUmVzdGFydCA9IGZhbHNlOworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+dXBkYXRlUGFyYW1ldGVycygoY2hhciopcGF5bG9hZCwgbmVlZFJlc3RhcnQpOworICAgICAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKG5lZWRSZXN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBzZXQgcGFyYW1ldGVycyB0aGF0IHJlcXVpcmVzIHJlc3RhcnQgZHVyaW5nIHJlY29yZGluZworICAgICAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciEhIGNhbm5vdCBzZXQgcGFyYW1ldGVycyB0aGF0IHJlcXVpcmVzIHJlc3RhcnQgZHVyaW5nIHJlY29yZGluZyIpOworICAgICAgICAgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+c2V0TmVlZFJlc3RhcnQoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVNfQ09NTUlUOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5jb21taXRQYXJhbWV0ZXJDaGFuZ2VzKCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19TVE9QOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19SRVNUQVJUOgorICAgICAgICB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yISEgY2Fubm90IGhhbmRsZSBldnQoJWQpIGluIHN0YXRlKCVkKSIsIF9fZnVuY19fLCBldnQsIG1fc3RhdGUpOworICAgICAgICAgICAgcmMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9HRVRfUEFSQU1TOgorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQucGFyYW1zID0gbV9wYXJlbnQtPmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIHJjID0gcmVzdWx0LnBhcmFtcyA/IE5PX0VSUk9SIDogVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX1BBUkFNUzsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QVVRfUEFSQU1TOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wdXRQYXJhbWV0ZXJzKChjaGFyKilwYXlsb2FkKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QUkVWSUVXX0VOQUJMRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gTk9fRVJST1I7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9FTkFCTEVfRkxBRzsKKyAgICAgICAgICAgIHJlc3VsdC5lbmFibGVkID0gMDsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUNPUkRJTkdfRU5BQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBOT19FUlJPUjsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0VOQUJMRV9GTEFHOworICAgICAgICAgICAgcmVzdWx0LmVuYWJsZWQgPSAxOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUT1JFX01FVEFEQVRBX0lOX0JVRlM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoKigoaW50ICopcGF5bG9hZCkpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0RVTVA6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmR1bXAoKigoaW50ICopcGF5bG9hZCkpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUQVJUX0FVVE9fRk9DVVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmF1dG9Gb2N1cygpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUT1BfQVVUT19GT0NVUzoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+Y2FuY2VsQXV0b0ZvY3VzKCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VORF9DT01NQU5EOgorICAgICAgICB7CisgICAgICAgICAgICBxY2FtZXJhX3NtX2V2dF9jb21tYW5kX3BheWxvYWRfdCAqY21kX3BheWxvYWQgPQorICAgICAgICAgICAgICAgIChxY2FtZXJhX3NtX2V2dF9jb21tYW5kX3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zZW5kQ29tbWFuZChjbWRfcGF5bG9hZC0+Y21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kX3BheWxvYWQtPmFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRfcGF5bG9hZC0+YXJnMik7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFJFX1RBS0VfUElDVFVSRToKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8gb3BzIGhlcmUsIHNlbmQgTk9fRVJST1IuCisgICAgICAgICAgICByYyA9IE5PX0VSUk9SOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1RBS0VfUElDVFVSRToKKyAgICAgICAgeworICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfVklERU9fUElDX1RBS0lORzsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnRha2VMaXZlU25hcHNob3QoKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1fcGFyZW50LT51bmNvbmZpZ3VyZUFkdmFuY2VkQ2FwdHVyZSgpOworICAgICAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1JFQ09SRElORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QUkVfU1RBUlRfUkVDT1JESU5HOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVTVEFSVF9TVE9QX1BSRVZJRVc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRVNUQVJUX1NUQVJUX1BSRVZJRVc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9SRUNPUkRJTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vIG9wcyBoZXJlCisgICAgICAgICAgICBMT0dXKCJhbHJlYWR5IGluIHJlY29yZGluZyBzdGF0ZSwgbm8gb3BzIGZvciBzdGFydF9yZWNvcmRpbmciKTsKKyAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVE9QX1JFQ09SRElORzoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c3RvcFJlY29yZGluZygpOworICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV0lORzsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVE9QX1BSRVZJRVc6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnN0b3BSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdJTkc7CisKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnN0b3BQcmV2aWV3KCk7CisgICAgICAgICAgICBtX3N0YXRlID0gUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXX1NUT1BQRUQ7CisKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUxFQVNFX1JFQ09SSUROR19GUkFNRToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKChjb25zdCB2b2lkICopcGF5bG9hZCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVHX0ZBQ0VfSU1BR0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZmFjZUlEID0gMDsKKyAgICAgICAgICAgIHFjYW1lcmFfc21fZXZ0X3JlZ19mYWNlX3BheWxvYWRfdCAqcmVnX3BheWxvYWQgPQorICAgICAgICAgICAgICAgIChxY2FtZXJhX3NtX2V2dF9yZWdfZmFjZV9wYXlsb2FkX3QgKilwYXlsb2FkOworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cmVnaXN0ZXJGYWNlSW1hZ2UocmVnX3BheWxvYWQtPmltZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdfcGF5bG9hZC0+Y29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZUlEKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0hBTkRMRTsKKyAgICAgICAgICAgIHJlc3VsdC5oYW5kbGUgPSBmYWNlSUQ7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFJFUEFSRV9TTkFQU0hPVDoKKyAgICAgICAgeworICAgICAgICAgICAgLy9JbiBWaWRlbyBzbmFwc2hvdCwgcHJlcGFyZSBoYXJkd2FyZSBpcyBhIG5vLW9wLgorICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0NBTkNFTF9QSUNUVVJFOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RBUlRfTk9ESVNQTEFZX1BSRVZJRVc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUxFQVNFOgorICAgICAgICB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciEhIGNhbm5vdCBoYW5kbGUgZXZ0KCVkKSBpbiBzdGF0ZSglZCkiLCBldnQsIG1fc3RhdGUpOworICAgICAgICAgICAgcmMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9FVlRfSU5URVJOQUw6CisgICAgICAgIHsKKyAgICAgICAgICAgIHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqaW50ZXJuYWxfZXZ0ID0KKyAgICAgICAgICAgICAgICAocWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90ICopcGF5bG9hZDsKKyAgICAgICAgICAgIHN3aXRjaCAoaW50ZXJuYWxfZXZ0LT5ldnRfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9GT0NVU19VUERBVEU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc0F1dG9Gb2N1c0V2ZW50KGludGVybmFsX2V2dC0+Zm9jdXNfZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX1BSRVBfU05BUFNIT1RfRE9ORToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfRkFDRV9ERVRFQ1RfUkVTVUxUOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NGYWNlRGV0ZWN0aW9uUmVzdWx0KCZpbnRlcm5hbF9ldnQtPmZhY2VzX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9ISVNUT0dSQU1fU1RBVFM6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc0hpc3RvZ3JhbVN0YXRzKGludGVybmFsX2V2dC0+c3RhdHNfZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0NST1BfSU5GTzoKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzWm9vbUV2ZW50KGludGVybmFsX2V2dC0+Y3JvcF9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfQVNEX1VQREFURToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzQVNEVXBkYXRlKGludGVybmFsX2V2dC0+YXNkX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9MRURfTU9ERV9PVkVSUklERToKKyAgICAgICAgICAgICAgICBMT0dXKCJDYW5ub3QgaGFuZGxlIGV2dCglZCkgaW4gc3RhdGUoJWQpIiwgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfQVdCX1VQREFURToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT50cmFuc0F3Yk1ldGFUb1BhcmFtcyhpbnRlcm5hbF9ldnQtPmF3Yl9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfQUVfVVBEQVRFOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NBRUluZm8oaW50ZXJuYWxfZXZ0LT5hZV9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfRk9DVVNfUE9TX1VQREFURToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzRm9jdXNQb3NpdGlvbkluZm8oaW50ZXJuYWxfZXZ0LT5mb2N1c19wb3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9IRFJfVVBEQVRFOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NIRFJEYXRhKGludGVybmFsX2V2dC0+aGRyX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9SRVRST19BRUNfVU5MT0NLOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NSZXRyb0FFQ1VubG9jaygpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9aU0xfQ0FQVFVSRV9ET05FOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NaU0xDYXB0dXJlRG9uZSgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0VWVF9OT1RJRlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2NhbWVyYV9ldmVudF90ICpjYW1fZXZ0ID0gKG1tX2NhbWVyYV9ldmVudF90ICopcGF5bG9hZDsKKyAgICAgICAgICAgIHN3aXRjaCAoY2FtX2V2dC0+c2VydmVyX2V2ZW50X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0FNX0VWRU5UX1RZUEVfREFFTU9OX0RJRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+c2VuZEV2dE5vdGlmeShDQU1FUkFfTVNHX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfRVJST1JfU0VSVkVSX0RJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBpbnRlcm5hbCBldmVudCAlZCBpbiBzdGF0ZSglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZXZ0LT5zZXJ2ZXJfZXZlbnRfdHlwZSwgbV9zdGF0ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9USEVSTUFMX05PVElGWToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+dXBkYXRlVGhlcm1hbExldmVsKHBheWxvYWQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU05BUFNIT1RfRE9ORToKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm8gb3BzLCBidXQgbmVlZCB0byBub3RpZnkKKyAgICAgICAgICAgIExPR1coIkNhbm5vdCBoYW5kbGUgZXZ0KCVkKSBpbiBzdGF0ZSglZCkiLCBldnQsIG1fc3RhdGUpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEV2dFJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfSlBFR19FVlRfTk9USUZZOgorICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1coIkNhbm5vdCBoYW5kbGUgZXZ0KCVkKSBpbiBzdGF0ZSglZCkiLCBldnQsIG1fc3RhdGUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJvY0V2dFZpZGVvUGljVGFraW5nU3RhdGUKKyAqCisgKiBERVNDUklQVElPTjogZmluaXRlIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb24gdG8gaGFuZGxlIGV2ZW50IGluIHN0YXRlIG9mCisgKiAgICAgICAgICAgICAgUUNBTUVSQV9TTV9TVEFURV9WSURFT19QSUNfVEFLSU5HLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZXZ0ICAgICAgOiBldmVudCB0byBiZSBwcm9jZXNzZWQKKyAqICAgQHBheWxvYWQgIDogZXZlbnQgcGF5bG9hZC4gQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdGF0ZU1hY2hpbmU6OnByb2NFdnRWaWRlb1BpY1Rha2luZ1N0YXRlKHFjYW1lcmFfc21fZXZ0X2VudW1fdCBldnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBheWxvYWQpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90IHJlc3VsdDsKKyAgICBtZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKHFjYW1lcmFfYXBpX3Jlc3VsdF90KSk7CisKKyAgICBMT0dMKCJldmVudCAoJWQpIiwgZXZ0KTsKKyAgICBzd2l0Y2ggKGV2dCkgeworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BSRVZJRVdfV0lORE9XOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBFcnJvciBzZXR0aW5nIHByZXZpZXcgd2luZG93IGR1cmluZyBwcmV2aWV3aW5nCisgICAgICAgICAgICBMT0dFKCJFcnJvciEhIGNhbm5vdCBzZXQgcHJldmlldyB3aW5kb3cgd2hlbiBwcmV2aWV3IGlzIHJ1bm5pbmciKTsKKyAgICAgICAgICAgIHJjID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX0NBTExCQUNLUzoKKyAgICAgICAgeworICAgICAgICAgICAgcWNhbWVyYV9zbV9ldnRfc2V0Y2JfcGF5bG9hZF90ICpzZXRjYnMgPQorICAgICAgICAgICAgICAgIChxY2FtZXJhX3NtX2V2dF9zZXRjYl9wYXlsb2FkX3QgKilwYXlsb2FkOworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c2V0Q2FsbEJhY2tzKHNldGNicy0+bm90aWZ5X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+ZGF0YV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRjYnMtPmRhdGFfY2JfdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+Z2V0X21lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRjYnMtPnVzZXIpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0VOQUJMRV9NU0dfVFlQRToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+ZW5hYmxlTXNnVHlwZSgqKChpbnQzMl90ICopcGF5bG9hZCkpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX0RJU0FCTEVfTVNHX1RZUEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmRpc2FibGVNc2dUeXBlKCooKGludDMyX3QgKilwYXlsb2FkKSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfTVNHX1RZUEVfRU5BQkxFRDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGVuYWJsZWQgPSBtX3BhcmVudC0+bXNnVHlwZUVuYWJsZWQoKigoaW50MzJfdCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0VOQUJMRV9GTEFHOworICAgICAgICAgICAgcmVzdWx0LmVuYWJsZWQgPSBlbmFibGVkOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2wgbmVlZFJlc3RhcnQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnVwZGF0ZVBhcmFtZXRlcnMoKGNoYXIqKXBheWxvYWQsIG5lZWRSZXN0YXJ0KTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChuZWVkUmVzdGFydCkgeworICAgICAgICAgICAgICAgICAgICAvLyBjYW5ub3Qgc2V0IHBhcmFtZXRlcnMgdGhhdCByZXF1aXJlcyByZXN0YXJ0IGR1cmluZyByZWNvcmRpbmcKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IhISBjYW5ub3Qgc2V0IHBhcmFtZXRlcnMgdGhhdCByZXF1aXJlcyByZXN0YXJ0IGR1cmluZyByZWNvcmRpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnNldE5lZWRSZXN0YXJ0KGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TX0NPTU1JVDoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+Y29tbWl0UGFyYW1ldGVyQ2hhbmdlcygpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVNfU1RPUDoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVNfUkVTVEFSVDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciEhIGNhbm5vdCBoYW5kbGUgZXZ0KCVkKSBpbiBzdGF0ZSglZCkiLCBfX2Z1bmNfXywgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgICAgIHJjID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfR0VUX1BBUkFNUzoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0LnBhcmFtcyA9IG1fcGFyZW50LT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICByYyA9IHJlc3VsdC5wYXJhbXMgPyBOT19FUlJPUiA6IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9QQVJBTVM7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFVUX1BBUkFNUzoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHV0UGFyYW1ldGVycygoY2hhciopcGF5bG9hZCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFJFVklFV19FTkFCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IE5PX0VSUk9SOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfRU5BQkxFX0ZMQUc7CisgICAgICAgICAgICByZXN1bHQuZW5hYmxlZCA9IDE7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVDT1JESU5HX0VOQUJMRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gTk9fRVJST1I7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9FTkFCTEVfRkxBRzsKKyAgICAgICAgICAgIHJlc3VsdC5lbmFibGVkID0gMTsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVE9SRV9NRVRBREFUQV9JTl9CVUZTOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKCooKGludCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9EVU1QOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5kdW1wKCooKGludCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9BVVRPX0ZPQ1VTOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5hdXRvRm9jdXMoKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVE9QX0FVVE9fRk9DVVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmNhbmNlbEF1dG9Gb2N1cygpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFTkRfQ09NTUFORDoKKyAgICAgICAgeworICAgICAgICAgICAgcWNhbWVyYV9zbV9ldnRfY29tbWFuZF9wYXlsb2FkX3QgKmNtZF9wYXlsb2FkID0KKyAgICAgICAgICAgICAgICAocWNhbWVyYV9zbV9ldnRfY29tbWFuZF9wYXlsb2FkX3QgKilwYXlsb2FkOworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c2VuZENvbW1hbmQoY21kX3BheWxvYWQtPmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZF9wYXlsb2FkLT5hcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kX3BheWxvYWQtPmFyZzIpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUT1BfUkVDT1JESU5HOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5jYW5jZWxMaXZlU25hcHNob3QoKTsKKyAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1JFQ09SRElORzsKKworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c3RvcFJlY29yZGluZygpOworICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV0lORzsKKworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1JFTEVBU0VfUkVDT1JJRE5HX0ZSQU1FOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5yZWxlYXNlUmVjb3JkaW5nRnJhbWUoKGNvbnN0IHZvaWQgKilwYXlsb2FkKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9DQU5DRUxfUElDVFVSRToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+Y2FuY2VsTGl2ZVNuYXBzaG90KCk7CisgICAgICAgICAgICBtX3N0YXRlID0gUUNBTUVSQV9TTV9TVEFURV9SRUNPUkRJTkc7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVHX0ZBQ0VfSU1BR0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZmFjZUlEID0gMDsKKyAgICAgICAgICAgIHFjYW1lcmFfc21fZXZ0X3JlZ19mYWNlX3BheWxvYWRfdCAqcmVnX3BheWxvYWQgPQorICAgICAgICAgICAgICAgIChxY2FtZXJhX3NtX2V2dF9yZWdfZmFjZV9wYXlsb2FkX3QgKilwYXlsb2FkOworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cmVnaXN0ZXJGYWNlSW1hZ2UocmVnX3BheWxvYWQtPmltZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdfcGF5bG9hZC0+Y29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZUlEKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0hBTkRMRTsKKyAgICAgICAgICAgIHJlc3VsdC5oYW5kbGUgPSBmYWNlSUQ7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RPUF9QUkVWSUVXOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5jYW5jZWxMaXZlU25hcHNob3QoKTsKKyAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1JFQ09SRElORzsKKworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c3RvcFJlY29yZGluZygpOworICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV0lORzsKKworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfU1RPUFBFRDsKKworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRV9TVEFSVF9SRUNPUkRJTkc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRVNUQVJUX1NUT1BfUFJFVklFVzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1JFU1RBUlRfU1RBUlRfUFJFVklFVzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUQVJUX1JFQ09SRElORzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRVBBUkVfUFJFVklFVzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUQVJUX1BSRVZJRVc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9OT0RJU1BMQVlfUFJFVklFVzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRVBBUkVfU05BUFNIT1Q6CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QUkVfVEFLRV9QSUNUVVJFOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfVEFLRV9QSUNUVVJFOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVMRUFTRToKKyAgICAgICAgeworICAgICAgICAgICAgTE9HRSgiRXJyb3IhISBjYW5ub3QgaGFuZGxlIGV2dCglZCkgaW4gc3RhdGUoJWQpIiwgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgICAgIHJjID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRVZUX0lOVEVSTkFMOgorICAgICAgICB7CisgICAgICAgICAgICBxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKmludGVybmFsX2V2dCA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICBzd2l0Y2ggKGludGVybmFsX2V2dC0+ZXZ0X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfRk9DVVNfVVBEQVRFOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NBdXRvRm9jdXNFdmVudChpbnRlcm5hbF9ldnQtPmZvY3VzX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9QUkVQX1NOQVBTSE9UX0RPTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0ZBQ0VfREVURUNUX1JFU1VMVDoKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzRmFjZURldGVjdGlvblJlc3VsdCgmaW50ZXJuYWxfZXZ0LT5mYWNlc19kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfSElTVE9HUkFNX1NUQVRTOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NIaXN0b2dyYW1TdGF0cyhpbnRlcm5hbF9ldnQtPnN0YXRzX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9DUk9QX0lORk86CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc1pvb21FdmVudChpbnRlcm5hbF9ldnQtPmNyb3BfZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0FTRF9VUERBVEU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc0FTRFVwZGF0ZShpbnRlcm5hbF9ldnQtPmFzZF9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfTEVEX01PREVfT1ZFUlJJREU6CisgICAgICAgICAgICAgICAgTE9HVygiQ2Fubm90IGhhbmRsZSBldnQoJWQpIGluIHN0YXRlKCVkKSIsIGV2dCwgbV9zdGF0ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0FXQl9VUERBVEU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+dHJhbnNBd2JNZXRhVG9QYXJhbXMoaW50ZXJuYWxfZXZ0LT5hd2JfZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0FFX1VQREFURToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzQUVJbmZvKGludGVybmFsX2V2dC0+YWVfZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0ZPQ1VTX1BPU19VUERBVEU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc0ZvY3VzUG9zaXRpb25JbmZvKGludGVybmFsX2V2dC0+Zm9jdXNfcG9zKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfSERSX1VQREFURToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzSERSRGF0YShpbnRlcm5hbF9ldnQtPmhkcl9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfUkVUUk9fQUVDX1VOTE9DSzoKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzUmV0cm9BRUNVbmxvY2soKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfWlNMX0NBUFRVUkVfRE9ORToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzWlNMQ2FwdHVyZURvbmUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9FVlRfTk9USUZZOgorICAgICAgICB7CisgICAgICAgICAgICBtbV9jYW1lcmFfZXZlbnRfdCAqY2FtX2V2dCA9IChtbV9jYW1lcmFfZXZlbnRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICBzd2l0Y2ggKGNhbV9ldnQtPnNlcnZlcl9ldmVudF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIENBTV9FVkVOVF9UWVBFX0RBRU1PTl9ESUVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnNlbmRFdnROb3RpZnkoQ0FNRVJBX01TR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0VSUk9SX1NFUlZFUl9ESUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR0UoIkludmFsaWQgaW50ZXJuYWwgZXZlbnQgJWQgaW4gc3RhdGUoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2V2dC0+c2VydmVyX2V2ZW50X3R5cGUsIG1fc3RhdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfSlBFR19FVlRfTk9USUZZOgorICAgICAgICB7CisgICAgICAgICAgICBxY2FtZXJhX2pwZWdfZXZ0X3BheWxvYWRfdCAqanBlZ19qb2IgPQorICAgICAgICAgICAgICAgIChxY2FtZXJhX2pwZWdfZXZ0X3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzSnBlZ05vdGlmeShqcGVnX2pvYik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TTkFQU0hPVF9ET05FOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5jYW5jZWxMaXZlU25hcHNob3QoKTsKKyAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1JFQ09SRElORzsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxFdnRSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9USEVSTUFMX05PVElGWToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+dXBkYXRlVGhlcm1hbExldmVsKHBheWxvYWQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1coIkNhbm5vdCBoYW5kbGUgZXZ0KCVkKSBpbiBzdGF0ZSglZCkiLCBldnQsIG1fc3RhdGUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJvY0V2dFByZXZpZXdQaWNUYWtpbmdTdGF0ZQorICoKKyAqIERFU0NSSVBUSU9OOiBmaW5pdGUgc3RhdGUgbWFjaGluZSBmdW5jdGlvbiB0byBoYW5kbGUgZXZlbnQgaW4gc3RhdGUgb2YKKyAqICAgICAgICAgICAgICBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfUElDX1RBS0lORy4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGV2dCAgICAgIDogZXZlbnQgdG8gYmUgcHJvY2Vzc2VkCisgKiAgIEBwYXlsb2FkICA6IGV2ZW50IHBheWxvYWQuIENhbiBiZSBOVUxMIGlmIG5vdCBuZWVkZWQuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RhdGVNYWNoaW5lOjpwcm9jRXZ0UHJldmlld1BpY1Rha2luZ1N0YXRlKHFjYW1lcmFfc21fZXZ0X2VudW1fdCBldnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGF5bG9hZCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgcmVzdWx0OworICAgIG1lbXNldCgmcmVzdWx0LCAwLCBzaXplb2YocWNhbWVyYV9hcGlfcmVzdWx0X3QpKTsKKworICAgIExPR0woImV2ZW50ICglZCkiLCBldnQpOworICAgIHN3aXRjaCAoZXZ0KSB7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TRVRfQ0FMTEJBQ0tTOgorICAgICAgICB7CisgICAgICAgICAgICBxY2FtZXJhX3NtX2V2dF9zZXRjYl9wYXlsb2FkX3QgKnNldGNicyA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21fZXZ0X3NldGNiX3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zZXRDYWxsQmFja3Moc2V0Y2JzLT5ub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Y2JzLT5kYXRhX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+ZGF0YV9jYl90aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Y2JzLT5nZXRfbWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldGNicy0+dXNlcik7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRU5BQkxFX01TR19UWVBFOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5lbmFibGVNc2dUeXBlKCooKGludDMyX3QgKilwYXlsb2FkKSk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRElTQUJMRV9NU0dfVFlQRToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+ZGlzYWJsZU1zZ1R5cGUoKigoaW50MzJfdCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9NU0dfVFlQRV9FTkFCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IG1fcGFyZW50LT5tc2dUeXBlRW5hYmxlZCgqKChpbnQzMl90ICopcGF5bG9hZCkpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfRU5BQkxFX0ZMQUc7CisgICAgICAgICAgICByZXN1bHQuZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNUzoKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBuZWVkUmVzdGFydCA9IGZhbHNlOworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+dXBkYXRlUGFyYW1ldGVycygoY2hhciopcGF5bG9hZCwgbmVlZFJlc3RhcnQpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVNfU1RPUDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbmVlZCByZXN0YXJ0IHByZXZpZXcgZm9yIHBhcmFtZXRlcnMgdG8gdGFrZSBlZmZlY3QKKyAgICAgICAgICAgIExPR0QoIlN0b3BwaW5nIHByZXZpZXcuLi4iKTsKKyAgICAgICAgICAgIC8vIHN0b3AgcHJldmlldworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgICAgIC8vIENsZWFyIG1lbW9yeSBwb29scworICAgICAgICAgICAgbV9wYXJlbnQtPm1fbWVtb3J5UG9vbC5jbGVhcigpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFVF9QQVJBTVNfQ09NTUlUOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBjb21taXQgcGFyYW1ldGVyIGNoYW5nZXMgdG8gc2VydmVyCisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5jb21taXRQYXJhbWV0ZXJDaGFuZ2VzKCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19SRVNUQVJUOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBzdGFydCBwcmV2aWV3IGFnYWluCisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgYXBwbHlEZWxheWVkTXNncygpOworICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+dW5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1BJQ19UQUtJTkc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3BhcmVudC0+c2V0TmVlZFJlc3RhcnQoZmFsc2UpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyAgICAgICAgICAgPSAgcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgICAgICA9ICBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgICAgICA9ICBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfR0VUX1BBUkFNUzoKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0LnBhcmFtcyA9IG1fcGFyZW50LT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICByYyA9IHJlc3VsdC5wYXJhbXMgPyBOT19FUlJPUiA6IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9QQVJBTVM7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFVUX1BBUkFNUzoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHV0UGFyYW1ldGVycygoY2hhciopcGF5bG9hZCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFJFVklFV19FTkFCTEVEOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IE5PX0VSUk9SOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfRU5BQkxFX0ZMQUc7CisgICAgICAgICAgICByZXN1bHQuZW5hYmxlZCA9IDE7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVDT1JESU5HX0VOQUJMRUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gTk9fRVJST1I7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9FTkFCTEVfRkxBRzsKKyAgICAgICAgICAgIHJlc3VsdC5lbmFibGVkID0gMDsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVE9SRV9NRVRBREFUQV9JTl9CVUZTOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKCooKGludCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9EVU1QOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5kdW1wKCooKGludCAqKXBheWxvYWQpKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9BVVRPX0ZPQ1VTOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5hdXRvRm9jdXMoKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVE9QX0FVVE9fRk9DVVM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmNhbmNlbEF1dG9Gb2N1cygpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NFTkRfQ09NTUFORDoKKyAgICAgICAgeworICAgICAgICAgICAgcWNhbWVyYV9zbV9ldnRfY29tbWFuZF9wYXlsb2FkX3QgKmNtZF9wYXlsb2FkID0KKyAgICAgICAgICAgICAgICAocWNhbWVyYV9zbV9ldnRfY29tbWFuZF9wYXlsb2FkX3QgKilwYXlsb2FkOworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+c2VuZENvbW1hbmQoY21kX3BheWxvYWQtPmNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZF9wYXlsb2FkLT5hcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kX3BheWxvYWQtPmFyZzIpOworI2lmbmRlZiBWQU5JTExBX0hBTAorICAgICAgICAgICAgaWYgKCBDQU1FUkFfQ01EX0xPTkdTSE9UX09GRiA9PSBjbWRfcGF5bG9hZC0+Y21kICkgeworICAgICAgICAgICAgICAgIC8vIG1vdmUgc3RhdGUgdG8gcHJldmlld2luZyBzdGF0ZQorICAgICAgICAgICAgICAgIG1fc3RhdGUgPSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdJTkc7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUxFQVNFX1JFQ09SSUROR19GUkFNRToKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKChjb25zdCB2b2lkICopcGF5bG9hZCk7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfQ0FOQ0VMX1BJQ1RVUkU6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtX3BhcmVudC0+aXNaU0xNb2RlKCkgfHwgbV9wYXJlbnQtPmlzTG9uZ3Nob3RFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5jYW5jZWxQaWN0dXJlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmNhbmNlbExpdmVTbmFwc2hvdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV0lORzsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9TVE9QX1BSRVZJRVc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtX3BhcmVudC0+aXNaU0xNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjYW5jZWwgcGljdHVyZSBmaXJzdAorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmNhbmNlbFBpY3R1cmUoKTsKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+c3RvcENoYW5uZWwoUUNBTUVSQV9DSF9UWVBFX1pTTCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1fcGFyZW50LT5pc0xvbmdzaG90RW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgLy8ganVzdCBjYW5jZWwgcGljdHVyZQorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmNhbmNlbFBpY3R1cmUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+Y2FuY2VsTGl2ZVNuYXBzaG90KCk7CisgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnN0b3BDaGFubmVsKFFDQU1FUkFfQ0hfVFlQRV9QUkVWSUVXKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHVucHJlcGFyZSBwcmV2aWV3CisgICAgICAgICAgICBtX3BhcmVudC0+dW5wcmVwYXJlUHJldmlldygpOworICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV19TVE9QUEVEOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1BSRV9TVEFSVF9SRUNPUkRJTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtX3BhcmVudC0+aXNaU0xNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciEhIGNhbm5vdCBoYW5kbGUgZXZ0KCVkKSBpbiBzdGF0ZSglZCkgaW4gWlNMIG1vZGUiLCBldnQsIG1fc3RhdGUpOworICAgICAgICAgICAgICAgIHJjID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1fcGFyZW50LT5pc0xvbmdzaG90RW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IhISBjYW5ub3QgaGFuZGxlIGV2dCglZCkgaW4gc3RhdGUoJWQpIGluIExvbmdzaG90IG1vZGUiLCBldnQsIG1fc3RhdGUpOworICAgICAgICAgICAgICAgIHJjID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByZVN0YXJ0UmVjb3JkaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RBUlRfUkVDT1JESU5HOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobV9wYXJlbnQtPmlzWlNMTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IhISBjYW5ub3QgaGFuZGxlIGV2dCglZCkgaW4gc3RhdGUoJWQpIGluIFpTTCBtb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgICAgICAgICByYyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfSBlbHNlIGlmIChtX3BhcmVudC0+aXNMb25nc2hvdEVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yISEgY2Fubm90IGhhbmRsZSBldnQoJWQpIGluIHN0YXRlKCVkKSBpbiBMb25nc2hvdCBtb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgICAgICAgICByYyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5zdGFydFJlY29yZGluZygpOworICAgICAgICAgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXRlID0gUUNBTUVSQV9TTV9TVEFURV9WSURFT19QSUNfVEFLSU5HOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9SRUdfRkFDRV9JTUFHRToKKyAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCBmYWNlSUQgPSAwOworICAgICAgICAgICAgcWNhbWVyYV9zbV9ldnRfcmVnX2ZhY2VfcGF5bG9hZF90ICpyZWdfcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21fZXZ0X3JlZ19mYWNlX3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5yZWdpc3RlckZhY2VJbWFnZShyZWdfcGF5bG9hZC0+aW1nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ19wYXlsb2FkLT5jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlSUQpOworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfSEFORExFOworICAgICAgICAgICAgcmVzdWx0LmhhbmRsZSA9IGZhY2VJRDsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9QUkVfVEFLRV9QSUNUVVJFOgorICAgICAgICB7CisgICAgICAgICAgIGlmICggbV9wYXJlbnQtPmlzTG9uZ3Nob3RFbmFibGVkKCkgKSB7CisgICAgICAgICAgICAgICAvLyBubyBvcHMgaGVyZSwgbmVlZCB0byBzaW5nYWwgTk9fRVJST1IKKyAgICAgICAgICAgICAgIHJjID0gTk9fRVJST1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yISEgY2Fubm90IGhhbmRsZSBldnQoJWQpIGluIHN0YXRlKCVkKSIsIGV2dCwgbV9zdGF0ZSk7CisgICAgICAgICAgICAgICAgcmMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1RBS0VfUElDVFVSRToKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBtX3BhcmVudC0+aXNMb25nc2hvdEVuYWJsZWQoKSApIHsKKyAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmxvbmdTaG90KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yISEgY2Fubm90IGhhbmRsZSBldnQoJWQpIGluIHN0YXRlKCVkKSIsIGV2dCwgbV9zdGF0ZSk7CisgICAgICAgICAgICAgICAgcmMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFJFUEFSRV9TTkFQU0hPVDoKKyAgICAgICAgeworICAgICAgICAgIExPR0QoIlByZXBhcmUgU25hcHNob3QiKTsKKyAgICAgICAgICBpZiAobV9wYXJlbnQtPmlzUmV0cm9QaWN0dXJlKCkpIHsKKyAgICAgICAgICAgICAgTE9HRCgiUHJlcGFyZSBTbmFwc2hvdCBpbiBSZXRybyBNb2RlIik7CisgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByZXBhcmVIYXJkd2FyZUZvclNuYXBzaG90KEZBTFNFKTsKKyAgICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICBMT0dFKCJwcmVwYXJlSGFyZHdhcmVGb3JTbmFwc2hvdCBmYWlsZWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBMT0dFKCJFcnJvciEhIGNhbm5vdCBoYW5kbGUgZXZ0KCVkKSBpbiBzdGF0ZSglZCkiLAorICAgICAgICAgICAgICAgICBldnQsIG1fc3RhdGUpOworICAgICAgICAgICAgICByYyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUT1BfUkVDT1JESU5HOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUFJFUEFSRV9QUkVWSUVXOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU1RBUlRfUFJFVklFVzoKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NUQVJUX05PRElTUExBWV9QUkVWSUVXOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfU0VUX1BSRVZJRVdfV0lORE9XOgorICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfUkVMRUFTRToKKyAgICAgICAgeworICAgICAgICAgICAgTE9HRSgiRXJyb3IhISBjYW5ub3QgaGFuZGxlIGV2dCglZCkgaW4gc3RhdGUoJWQpIiwgZXZ0LCBtX3N0YXRlKTsKKyAgICAgICAgICAgIHJjID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfRVZUX0lOVEVSTkFMOgorICAgICAgICB7CisgICAgICAgICAgICBxY2FtZXJhX3NtX2ludGVybmFsX2V2dF9wYXlsb2FkX3QgKmludGVybmFsX2V2dCA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfc21faW50ZXJuYWxfZXZ0X3BheWxvYWRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICBzd2l0Y2ggKGludGVybmFsX2V2dC0+ZXZ0X3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfRk9DVVNfVVBEQVRFOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NBdXRvRm9jdXNFdmVudChpbnRlcm5hbF9ldnQtPmZvY3VzX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9QUkVQX1NOQVBTSE9UX0RPTkU6CisgICAgICAgICAgICAgICAgTE9HRCgiUmVjZWl2ZWQgUUNBTUVSQV9JTlRFUk5BTF9FVlRfUFJFUF9TTkFQU0hPVF9ET05FIGV2ZW50Iik7CisgICAgICAgICAgICAgICAgaWYgKG1fcGFyZW50LT5pc1JldHJvUGljdHVyZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5wcm9jZXNzUHJlcFNuYXBzaG90RG9uZUV2ZW50KGludGVybmFsX2V2dC0+cHJlcF9zbmFwc2hvdF9zdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIExPR0QoIlJldHJvIHBpY3R1cmUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBRQ0FNRVJBX1NNX0VWVF9QUkVQQVJFX1NOQVBTSE9UOworICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIENhc2UgZm9yICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlFDQU1FUkFfSU5URVJOQUxfRVZUX1JFQURZX0ZPUl9TTkFQU0hPVCBldmVudCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfRkFDRV9ERVRFQ1RfUkVTVUxUOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NGYWNlRGV0ZWN0aW9uUmVzdWx0KCZpbnRlcm5hbF9ldnQtPmZhY2VzX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9SRUFEWV9GT1JfU05BUFNIT1Q6CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB2YWxpZCBvbmx5IGluIFJldHJvIHBpY3R1cmUgTW9kZQorICAgICAgICAgICAgICAgIGlmIChtX3BhcmVudC0+aXNSZXRyb1BpY3R1cmUoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dEKCJSZWNlaXZlZCBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9SRUFEWV9GT1JfU05BUFNIT1QgZXZlbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBRQ0FNRVJBX1NNX0VWVF9UQUtFX1BJQ1RVUkU7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPR0QoIldyb25nIENhc2UgZm9yIFFDQU1FUkFfSU5URVJOQUxfRVZUX1JFQURZX0ZPUl9TTkFQU0hPVCBldmVudCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfSElTVE9HUkFNX1NUQVRTOgorICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NIaXN0b2dyYW1TdGF0cyhpbnRlcm5hbF9ldnQtPnN0YXRzX2RhdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9DUk9QX0lORk86CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc1pvb21FdmVudChpbnRlcm5hbF9ldnQtPmNyb3BfZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0FTRF9VUERBVEU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc0FTRFVwZGF0ZShpbnRlcm5hbF9ldnQtPmFzZF9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfTEVEX01PREVfT1ZFUlJJREU6CisgICAgICAgICAgICAgICAgTE9HVygiQ2Fubm90IGhhbmRsZSBldnQoJWQpIGluIHN0YXRlKCVkKSIsIGV2dCwgbV9zdGF0ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0FXQl9VUERBVEU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+dHJhbnNBd2JNZXRhVG9QYXJhbXMoaW50ZXJuYWxfZXZ0LT5hd2JfZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0FFX1VQREFURToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzQUVJbmZvKGludGVybmFsX2V2dC0+YWVfZGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFFDQU1FUkFfSU5URVJOQUxfRVZUX0ZPQ1VTX1BPU19VUERBVEU6CisgICAgICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJvY2Vzc0ZvY3VzUG9zaXRpb25JbmZvKGludGVybmFsX2V2dC0+Zm9jdXNfcG9zKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfSERSX1VQREFURToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzSERSRGF0YShpbnRlcm5hbF9ldnQtPmhkcl9kYXRhKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfUkVUUk9fQUVDX1VOTE9DSzoKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzUmV0cm9BRUNVbmxvY2soKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9JTlRFUk5BTF9FVlRfWlNMX0NBUFRVUkVfRE9ORToKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5wcm9jZXNzWlNMQ2FwdHVyZURvbmUoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX1NNX0VWVF9FVlRfTk9USUZZOgorICAgICAgICB7CisgICAgICAgICAgICBtbV9jYW1lcmFfZXZlbnRfdCAqY2FtX2V2dCA9IChtbV9jYW1lcmFfZXZlbnRfdCAqKXBheWxvYWQ7CisgICAgICAgICAgICBzd2l0Y2ggKGNhbV9ldnQtPnNlcnZlcl9ldmVudF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIENBTV9FVkVOVF9UWVBFX0RBRU1PTl9ESUVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBpbnRlcm5hbCBldmVudHMgdG8gc3RvcCBpbmRlZmluaXRlIHdhaXQgb24gcHJlcGFyZQorICAgICAgICAgICAgICAgICAgICAvLyBzbmFwc2hvdCBkb25lIGV2ZW50LgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IFFDQU1FUkFfU01fRVZUX1BSRVBBUkVfU05BUFNIT1Q7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKworICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IFFDQU1FUkFfU01fRVZUX1RBS0VfUElDVFVSRTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworCisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5zZW5kRXZ0Tm90aWZ5KENBTUVSQV9NU0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9FUlJPUl9TRVJWRVJfRElFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1fRVZFTlRfVFlQRV9DQUNfRE9ORToKKyAgICAgICAgICAgICAgICBpZiAobV9wYXJlbnQtPmlzQ0FDRW5hYmxlZCgpIHx8IG1fcGFyZW50LT5tUGFyYW1ldGVycy5pc09FTUZlYXRFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRCgiW0xPTkdfU0hPVF9EQkddIDogUmVjZWl2ZWQgQ0FDIERvbmUiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChtX3BhcmVudC0+aXNMb25nc2hvdEVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIW1fcGFyZW50LT5pc0NhcHR1cmVTaHV0dGVyRW5hYmxlZCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGxheSBzaHV0dGVyIHNvdW5kIGZvciBsb25nc2hvdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgQ0FDIHN0YWdlIGlzIGRvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5wbGF5U2h1dHRlcigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1fcGFyZW50LT5tQ0FDRG9uZVJlY2VpdmVkID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR0UoIkludmFsaWQgaW50ZXJuYWwgZXZlbnQgJWQgaW4gc3RhdGUoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2V2dC0+c2VydmVyX2V2ZW50X3R5cGUsIG1fc3RhdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfSlBFR19FVlRfTk9USUZZOgorICAgICAgICB7CisgICAgICAgICAgICBMT0dMKCJDYWxsaW5nIFByb2Nlc3MgSnBlZyBOb3RpZnkiKTsKKyAgICAgICAgICAgIHFjYW1lcmFfanBlZ19ldnRfcGF5bG9hZF90ICpqcGVnX2pvYiA9CisgICAgICAgICAgICAgICAgKHFjYW1lcmFfanBlZ19ldnRfcGF5bG9hZF90ICopcGF5bG9hZDsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnByb2Nlc3NKcGVnTm90aWZ5KGpwZWdfam9iKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1NOQVBTSE9UX0RPTkU6CisgICAgICAgIHsKKyAgICAgICAgICAgIExPR0woIlNuYXBzaG90IERvbmUiKTsKKyAgICAgICAgICAgIGlmIChtX3BhcmVudC0+aXNaU0xNb2RlKCkgfHwgbV9wYXJlbnQtPmlzTG9uZ3Nob3RFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICByYyA9IG1fcGFyZW50LT5jYW5jZWxQaWN0dXJlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPmNhbmNlbExpdmVTbmFwc2hvdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9zdGF0ZSA9IFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV0lORzsKKyAgICAgICAgICAgIGlmIChtX3BhcmVudC0+aXNSZXRyb1BpY3R1cmUoKSl7CisgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICAgICAgTE9HTCgiXG4gU2lnbmFsbGluZyBmb3IgSlBFRyBzbmFwc2hvdCBkb25lISEiKTsKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsQVBJUmVzdWx0KCZyZXN1bHQpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmM7CisgICAgICAgICAgICByZXN1bHQucmVxdWVzdF9hcGkgPSBldnQ7CisgICAgICAgICAgICByZXN1bHQucmVzdWx0X3R5cGUgPSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUY7CisgICAgICAgICAgICBtX3BhcmVudC0+c2lnbmFsRXZ0UmVzdWx0KCZyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9TTV9FVlRfVEhFUk1BTF9OT1RJRlk6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnVwZGF0ZVRoZXJtYWxMZXZlbChwYXlsb2FkKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1JFU1RBUlRfU1RPUF9QUkVWSUVXOgorICAgICAgICB7CisgICAgICAgICAgICBtX3BhcmVudC0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSByYzsKKyAgICAgICAgICAgIHJlc3VsdC5yZXF1ZXN0X2FwaSA9IGV2dDsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHRfdHlwZSA9IFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0RFRjsKKyAgICAgICAgICAgIG1fcGFyZW50LT5zaWduYWxBUElSZXN1bHQoJnJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfU01fRVZUX1JFU1RBUlRfU1RBUlRfUFJFVklFVzoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtX3BhcmVudC0+cHJlcGFyZVByZXZpZXcoKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJjID0gbV9wYXJlbnQtPnN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IHJjOworICAgICAgICAgICAgcmVzdWx0LnJlcXVlc3RfYXBpID0gZXZ0OworICAgICAgICAgICAgcmVzdWx0LnJlc3VsdF90eXBlID0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfREVGOworICAgICAgICAgICAgbV9wYXJlbnQtPnNpZ25hbEFQSVJlc3VsdCgmcmVzdWx0KTsKKyAgICAgICAgfQorICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1coIkNhbm5vdCBoYW5kbGUgZXZ0KCVkKSBpbiBzdGF0ZSglZCkiLCBldnQsIG1fc3RhdGUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNSZWNvcmRpbmcKKyAqCisgKiBERVNDUklQVElPTjogY2hlY2sgaWYgcmVjb3JkaW5nIGlzIGluIHByb2Nlc3MuCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZSAtLSByZWNvcmRpbmcKKyAqICAgICAgICAgICAgICBmYWxzZSAtLSBub3QgaW4gcmVjb3JkaW5nIG1vZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhU3RhdGVNYWNoaW5lOjppc1JlY29yZGluZygpCit7CisgICAgc3dpdGNoIChtX3N0YXRlKSB7CisgICAgY2FzZSBRQ0FNRVJBX1NNX1NUQVRFX1JFQ09SRElORzoKKyAgICBjYXNlIFFDQU1FUkFfU01fU1RBVEVfVklERU9fUElDX1RBS0lORzoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc1ByZXZpZXdSdW5uaW5nCisgKgorICogREVTQ1JJUFRJT046IGNoZWNrIGlmIHByZXZpZXcgaXMgaW4gcHJvY2Vzcy4KKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlIC0tIHByZXZpZXcgcnVubmluZworICogICAgICAgICAgICAgIGZhbHNlIC0tIHByZXZpZXcgc3RvcHBlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFTdGF0ZU1hY2hpbmU6OmlzUHJldmlld1J1bm5pbmcoKQoreworICAgIHN3aXRjaCAobV9zdGF0ZSkgeworICAgIGNhc2UgUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXSU5HOgorICAgIGNhc2UgUUNBTUVSQV9TTV9TVEFURV9SRUNPUkRJTkc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX1NUQVRFX1ZJREVPX1BJQ19UQUtJTkc6CisgICAgY2FzZSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfUElDX1RBS0lORzoKKyAgICBjYXNlIFFDQU1FUkFfU01fU1RBVEVfUFJFUEFSRV9TTkFQU0hPVDoKKyAgICBjYXNlIFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV19SRUFEWToKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc1ByZXZpZXdSZWFkeQorICoKKyAqIERFU0NSSVBUSU9OOiBjaGVjayBpZiBwcmV2aWV3IGlzIGluIHJlYWR5IHN0YXRlLgorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IHRydWUgLS0gcHJldmlldyBpcyBpbiByZWFkeSBzdGF0ZQorICogICAgICAgICAgICAgIGZhbHNlIC0tIHByZXZpZXcgaXMgc3RvcHBlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFTdGF0ZU1hY2hpbmU6OmlzUHJldmlld1JlYWR5KCkKK3sKKyAgICBzd2l0Y2ggKG1fc3RhdGUpIHsKKyAgICBjYXNlIFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV19SRUFEWToKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc0NhcHR1cmVSdW5uaW5nCisgKgorICogREVTQ1JJUFRJT046IGNoZWNrIGlmIGltYWdlIGNhcHR1cmUgaXMgaW4gcHJvY2Vzcy4KKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlIC0tIGNhcHR1cmUgcnVubmluZworICogICAgICAgICAgICAgIGZhbHNlIC0tIGNhcHR1cmUgc3RvcHBlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFTdGF0ZU1hY2hpbmU6OmlzQ2FwdHVyZVJ1bm5pbmcoKQoreworICAgIHN3aXRjaCAobV9zdGF0ZSkgeworICAgIGNhc2UgUUNBTUVSQV9TTV9TVEFURV9QSUNfVEFLSU5HOgorICAgIGNhc2UgUUNBTUVSQV9TTV9TVEFURV9WSURFT19QSUNfVEFLSU5HOgorICAgIGNhc2UgUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXX1BJQ19UQUtJTkc6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzTm9uWlNMQ2FwdHVyZVJ1bm5pbmcKKyAqCisgKiBERVNDUklQVElPTjogY2hlY2sgaWYgaW1hZ2UgY2FwdHVyZSBpcyBpbiBwcm9jZXNzIGluIG5vbiBaU0wgbW9kZS4KKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlIC0tIGNhcHR1cmUgcnVubmluZyBpbiBub24gWlNMIG1vZGUKKyAqICAgICAgICAgICAgICBmYWxzZSAtLSBFaXRoZXIgaW4gbm90IGNhcHR1cmUgbW9kZSBvciBjYXB0dXIgaXMgbm90IGluIG5vbiBaU0wgbW9kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFTdGF0ZU1hY2hpbmU6OmlzTm9uWlNMQ2FwdHVyZVJ1bm5pbmcoKQoreworICAgIHN3aXRjaCAobV9zdGF0ZSkgeworICAgIGNhc2UgUUNBTUVSQV9TTV9TVEFURV9QSUNfVEFLSU5HOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGR1bXAKKyAqCisgKiBERVNDUklQVElPTjogQ29tcG9zZXMgYSBzdHJpbmcgYmFzZWQgb24gY3VycmVudCBjb25maWd1cmF0aW9uCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogRm9ybWF0dGVkIHN0cmluZworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitTdHJpbmc4IFFDYW1lcmFTdGF0ZU1hY2hpbmU6OmR1bXAoKQoreworICAgIFN0cmluZzggc3RyKCJcbiIpOworICAgIGNoYXIgc1sxMjhdOworCisgICAgc25wcmludGYocywgMTI4LCAiSXMgUHJldmlldyBSdW5uaW5nOiAlZFxuIiwgaXNQcmV2aWV3UnVubmluZygpKTsKKyAgICBzdHIgKz0gczsKKworICAgIHNucHJpbnRmKHMsIDEyOCwgIklzIENhcHR1cmUgUnVubmluZzogJWRcbiIsIGlzQ2FwdHVyZVJ1bm5pbmcoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJJcyBOb24gWlNMIENhcHR1cmUgUnVubmluZzogJWRcbiIsCisgICAgICAgIGlzTm9uWlNMQ2FwdHVyZVJ1bm5pbmcoKSk7CisgICAgc3RyICs9IHM7CisKKyAgICBzbnByaW50ZihzLCAxMjgsICJDdXJyZW50IFN0YXRlOiAlZCBcbiIsIG1fc3RhdGUpOworICAgIHN0ciArPSBzOworCisgICAgc3dpdGNoKG1fc3RhdGUpeworICAgICAgICBjYXNlIFFDQU1FUkFfU01fU1RBVEVfUFJFVklFV19TVE9QUEVEOgorICAgICAgICBzbnByaW50ZihzLCAxMjgsICIgUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXX1NUT1BQRUQgXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfUkVBRFk6CisgICAgICAgIHNucHJpbnRmKHMsIDEyOCwgIiBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfUkVBRFkgXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdJTkc6CisgICAgICAgIHNucHJpbnRmKHMsIDEyOCwgIiBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdJTkcgXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBRQ0FNRVJBX1NNX1NUQVRFX1BSRVBBUkVfU05BUFNIT1Q6CisgICAgICAgIHNucHJpbnRmKHMsIDEyOCwgIiBRQ0FNRVJBX1NNX1NUQVRFX1BSRVBBUkVfU05BUFNIT1QgXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBRQ0FNRVJBX1NNX1NUQVRFX1BJQ19UQUtJTkc6CisgICAgICAgIHNucHJpbnRmKHMsIDEyOCwgIiBRQ0FNRVJBX1NNX1NUQVRFX1BJQ19UQUtJTkcgXG4iKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBRQ0FNRVJBX1NNX1NUQVRFX1JFQ09SRElORzoKKyAgICAgICAgc25wcmludGYocywgMTI4LCAiIFFDQU1FUkFfU01fU1RBVEVfUkVDT1JESU5HIFxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUUNBTUVSQV9TTV9TVEFURV9WSURFT19QSUNfVEFLSU5HOgorICAgICAgICBzbnByaW50ZihzLCAxMjgsICIgUUNBTUVSQV9TTV9TVEFURV9WSURFT19QSUNfVEFLSU5HIFxuIik7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXX1BJQ19UQUtJTkc6CisgICAgICAgIHNucHJpbnRmKHMsIDEyOCwgIiBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfUElDX1RBS0lORyBcbiIpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgc3RyICs9IHM7CisKKyAgICByZXR1cm4gc3RyOworfQorCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhU3RhdGVNYWNoaW5lLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFTdGF0ZU1hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDJiYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhU3RhdGVNYWNoaW5lLmgKQEAgLTAsMCArMSwyNjMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1FDQU1FUkFfU1RBVEVNQUNISU5FX0hfXworI2RlZmluZSBfX1FDQU1FUkFfU1RBVEVNQUNISU5FX0hfXworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiUUNhbWVyYVF1ZXVlLmgiCisjaW5jbHVkZSAiUUNhbWVyYUNoYW5uZWwuaCIKKyNpbmNsdWRlICJjYW1fc2VtYXBob3JlLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKK30KKworbmFtZXNwYWNlIHFjYW1lcmEgeworCitjbGFzcyBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlOworCit0eXBlZGVmIGVudW0geworICAgIC8qKioqKioqQkVHSU4gT0Y6IEFQSSBFVlQqKioqKioqKiovCisgICAgUUNBTUVSQV9TTV9FVlRfU0VUX1BSRVZJRVdfV0lORE9XID0gMSwgICAvLyBzZXQgcHJldmlldyB3aW5kb3cKKyAgICBRQ0FNRVJBX1NNX0VWVF9TRVRfQ0FMTEJBQ0tTLCAgICAgICAgICAgIC8vIHNldCBjYWxsYmFja3MKKyAgICBRQ0FNRVJBX1NNX0VWVF9FTkFCTEVfTVNHX1RZUEUsICAgICAgICAgIC8vIGVuYWJsZSBtc2cgdHlwZQorICAgIFFDQU1FUkFfU01fRVZUX0RJU0FCTEVfTVNHX1RZUEUsICAgICAgICAgLy8gZGlzYWJsZSBtc2cgdHlwZQorICAgIFFDQU1FUkFfU01fRVZUX01TR19UWVBFX0VOQUJMRUQsICAgICAgICAgLy8gcXVlcnkgY2VydGFpbiBtc2cgdHlwZSBpcyBlbmFibGVkCisKKyAgICBRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TLCAgICAgICAgICAgICAgIC8vIHNldCBwYXJhbWV0ZXJzCisgICAgUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19TVE9QLCAgICAgICAgICAvLyBzdG9wIGNhbWVyYSBhZnRlciBzZXQgcGFyYW1zLCBpZiBuZWNlc3NhcnkKKyAgICBRQ0FNRVJBX1NNX0VWVF9TRVRfUEFSQU1TX0NPTU1JVCwgICAgICAgIC8vIGNvbW1pdCBzZXQgcGFyYW1zCisgICAgUUNBTUVSQV9TTV9FVlRfU0VUX1BBUkFNU19SRVNUQVJULCAgICAgICAvLyByZXN0YXJ0IGFmdGVyIHNldCBwYXJhbXMsIGlmIG5lY2Vzc2FyeQorICAgIFFDQU1FUkFfU01fRVZUX0dFVF9QQVJBTVMsICAgICAgICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKKyAgICBRQ0FNRVJBX1NNX0VWVF9QVVRfUEFSQU1TLCAgICAgICAgICAgICAgIC8vIHB1dCBwYXJhbWV0ZXJzLCByZWxlYXNlIHBhcmFtIGJ1ZgorCisgICAgUUNBTUVSQV9TTV9FVlRfUFJFUEFSRV9QUkVWSUVXLCAgICAgICAgICAvLyBwcmVwYXJlIHByZXZpZXcgKHpzbCwgY2FtZXJhIG1vZGUsIGNhbWNvcmRlciBtb2RlKQorICAgIFFDQU1FUkFfU01fRVZUX1NUQVJUX1BSRVZJRVcsICAgICAgICAgICAgLy8gc3RhcnQgcHJldmlldyAoenNsLCBjYW1lcmEgbW9kZSwgY2FtY29yZGVyIG1vZGUpCisgICAgUUNBTUVSQV9TTV9FVlRfU1RBUlRfTk9ESVNQTEFZX1BSRVZJRVcsICAvLyBzdGFydCBubyBkaXNwbGF5IHByZXZpZXcgKHpzbCwgY2FtZXJhIG1vZGUsIGNhbWNvcmRlciBtb2RlKQorICAgIFFDQU1FUkFfU01fRVZUX1NUT1BfUFJFVklFVywgICAgICAgICAgICAgLy8gc3RvcCBwcmV2aWV3ICh6c2wsIGNhbWVyYSBtb2RlLCBjYW1jb3JkZXIgbW9kZSkKKyAgICBRQ0FNRVJBX1NNX0VWVF9QUkVWSUVXX0VOQUJMRUQsICAgICAgICAgIC8vIHF1ZXJ5IGlmIHByZXZpZXcgaXMgcnVubmluZworCisgICAgUUNBTUVSQV9TTV9FVlRfU1RPUkVfTUVUQURBVEFfSU5fQlVGUywgICAvLyByZXF1ZXN0IHRvIHN0b3JlIG1ldGEgZGF0YSBpbiB2aWRlbyBidWZmZXJzCisgICAgUUNBTUVSQV9TTV9FVlRfUFJFX1NUQVJUX1JFQ09SRElORywgICAgICAvLyBwcmUgc3RhcnQgcmVjb3JkaW5nLCB0byBwcmVwYXJlIGZvciByZWNvcmRpbmcKKyAgICBRQ0FNRVJBX1NNX0VWVF9TVEFSVF9SRUNPUkRJTkcsICAgICAgICAgIC8vIHN0YXJ0IHJlY29yZGluZworICAgIFFDQU1FUkFfU01fRVZUX1NUT1BfUkVDT1JESU5HLCAgICAgICAgICAgLy8gc3RvcCByZWNvcmRpbmcKKyAgICBRQ0FNRVJBX1NNX0VWVF9SRUNPUkRJTkdfRU5BQkxFRCwgICAgICAgIC8vIHF1ZXJ5IGlmIHJlY29yZGluZyBpcyBydW5uaW5nCisgICAgUUNBTUVSQV9TTV9FVlRfUkVMRUFTRV9SRUNPUklETkdfRlJBTUUsICAvLyByZWxlYXNlIHJlY29yZGluZyBmcmFtZQorCisgICAgUUNBTUVSQV9TTV9FVlRfUFJFUEFSRV9TTkFQU0hPVCwgICAgICAgICAvLyBwcmVwYXJlIHNuYXBzaG90IGluIGNhc2UgTEVEIG5lZWRzIHRvIGJlIGZsYXNoZWQKKyAgICBRQ0FNRVJBX1NNX0VWVF9QUkVfVEFLRV9QSUNUVVJFLCAgICAgICAgIC8vIHByZSB0YWtlIHBpY3V0cmUgKHRvIHJlc3RhcnQgcHJldmlldyBpZiBuZWNlc3NhcnkpCisgICAgUUNBTUVSQV9TTV9FVlRfVEFLRV9QSUNUVVJFLCAgICAgICAgICAgICAvLyB0YWtlIHBpY3V0cmUgKHpzbCwgcmVndWFsciBjYXB0dXJlLCBsaXZlIHNuYXBzaG90CisgICAgUUNBTUVSQV9TTV9FVlRfQ0FOQ0VMX1BJQ1RVUkUsICAgICAgICAgICAvLyBjYW5jZWwgcGljdHVyZQorCisgICAgUUNBTUVSQV9TTV9FVlRfU1RBUlRfQVVUT19GT0NVUywgICAgICAgICAvLyBzdGFydCBhdXRvIGZvY3VzCisgICAgUUNBTUVSQV9TTV9FVlRfU1RPUF9BVVRPX0ZPQ1VTLCAgICAgICAgICAvLyBzdG9wIGF1dG8gZm9jdXMKKyAgICBRQ0FNRVJBX1NNX0VWVF9TRU5EX0NPTU1BTkQsICAgICAgICAgICAgIC8vIHNlbmQgY29tbWFuZAorCisgICAgUUNBTUVSQV9TTV9FVlRfUkVMRUFTRSwgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlIGNhbWVyYSByZXNvdXJjZQorICAgIFFDQU1FUkFfU01fRVZUX0RVTVAsICAgICAgICAgICAgICAgICAgICAgLy8gZHVtcAorICAgIFFDQU1FUkFfU01fRVZUX1JFR19GQUNFX0lNQUdFLCAgICAgICAgICAgLy8gcmVnaXN0ZXIgYSBmYWNlIGltYWdlIGluIGltYWdpbmcgbGliCisgICAgLyoqKioqKipFTkQgT0Y6IEFQSSBFVlQqKioqKioqKiovCisKKyAgICBRQ0FNRVJBX1NNX0VWVF9FVlRfSU5URVJOQUwsICAgICAgICAgICAgIC8vIGludGVybmFsIGV2dCBub3RpZnkKKyAgICBRQ0FNRVJBX1NNX0VWVF9FVlRfTk9USUZZLCAgICAgICAgICAgICAgIC8vIGV2dCBub3RpZnkgZnJvbSBzZXJ2ZXIKKyAgICBRQ0FNRVJBX1NNX0VWVF9KUEVHX0VWVF9OT1RJRlksICAgICAgICAgIC8vIGV2dCBub3RpZnkgZnJvbSBqcGVnCisgICAgUUNBTUVSQV9TTV9FVlRfU05BUFNIT1RfRE9ORSwgICAgICAgICAgICAvLyBpbnRlcm5hbCBldnQgdGhhdCBzbmFwc2hvdCBpcyBkb25lCisgICAgUUNBTUVSQV9TTV9FVlRfVEhFUk1BTF9OT1RJRlksICAgICAgICAgICAvLyBldnQgbm90aWZ5IGZyb20gdGhlcm1hbCBkYWVtb24KKyAgICBRQ0FNRVJBX1NNX0VWVF9TVE9QX0NBUFRVUkVfQ0hBTk5FTCwgICAgIC8vIHN0b3AgY2FwdHVyZSBjaGFubmVsCisgICAgUUNBTUVSQV9TTV9FVlRfUkVTVEFSVF9QRVJWSUVXLCAgICAgICAgICAvLyBpbnRlcm5hbCBwcmV2aWV3IHJlc3RhcnQKKyAgICBRQ0FNRVJBX1NNX0VWVF9ERUxBWUVEX1JFU1RBUlQsICAgICAgICAgIC8vIHByZXZpZXcgcmVzdGFydCBuZWVkcyBkZWxheSAoZHVhbCBjYW1lcmEgbW9kZSkKKyAgICBRQ0FNRVJBX1NNX0VWVF9TRU5EX0NPTU1BTkRfUkVTVEFSVCwgICAgIC8vIHJlc3RhcnQgYWZ0ZXIgc2VuZCBjb21tYW5kIChpZiBuZWNlc3NhcnkpCisgICAgUUNBTUVSQV9TTV9FVlRfUkVTVEFSVF9TVEFSVF9QUkVWSUVXLCAgICAvLyBwcmV2aWV3IHN0YXJ0IGFzIHBhcnQgb2YgcmVzdGFydCAoZHVhbCBjYW1lcmEgbW9kZSkKKyAgICBRQ0FNRVJBX1NNX0VWVF9SRVNUQVJUX1NUT1BfUFJFVklFVywgICAgIC8vIHByZXZpZXcgc3RvcCBhcyBwYXJ0IG9mIHJlc3RhcnQgKGR1YWwgY2FtZXJhIG1vZGUpCisgICAgUUNBTUVSQV9TTV9FVlRfTUFYCit9IHFjYW1lcmFfc21fZXZ0X2VudW1fdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9ERUYsICAgICAgICAgICAgIC8vIGRlZmF1bHQgdHlwZSwgbm8gYWRkaXRpb25hbCBpbmZvCisgICAgUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfRU5BQkxFX0ZMQUcsICAgICAvLyBtc2dfZW5hYmxlZCwgcHJldmlld19lbmFibGVkLCByZWNvcmRpbmdfZW5hYmxlZAorICAgIFFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX1BBUkFNUywgICAgICAgICAgLy8gcmV0dXJuZWQgcGFyYW1ldGVycyBpbiBzdHJpbmcKKyAgICBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9IQU5ETEUsICAgICAgICAgIC8vIHJldHVybmVkIGhhbmRsZSBpbiBpbnQKKyAgICBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9NQVgKK30gcWNhbWVyYV9hcGlfcmVzdWx0X3R5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3Qgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBpIGNhbGwgc3RhdHVzCisgICAgcWNhbWVyYV9zbV9ldnRfZW51bV90IHJlcXVlc3RfYXBpOyAgICAgICAvLyBhcGkgZXZ0IHJlcXVlc3RlZAorICAgIHFjYW1lcmFfYXBpX3Jlc3VsdF90eXBlX3QgcmVzdWx0X3R5cGU7ICAgLy8gcmVzdWx0IHR5cGUKKyAgICB1bmlvbiB7CisgICAgICAgIGludCBlbmFibGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0X3R5cGUgPT0gUUNBTUVSQV9BUElfUkVTVUxUX1RZUEVfRU5BQkxFX0ZMQUcKKyAgICAgICAgY2hhciAqcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bHRfdHlwZSA9PSBRQ0FNRVJBX0FQSV9SRVNVTFRfVFlQRV9QQVJBTVMKKyAgICAgICAgaW50IGhhbmRsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN1bHRfdHlwZSA9PVFDQU1FUkFfQVBJX1JFU1VMVF9UWVBFX0hBTkRMRQorICAgIH07Cit9IHFjYW1lcmFfYXBpX3Jlc3VsdF90OworCit0eXBlZGVmIHN0cnVjdCBhcGlfcmVzdWx0X2xpc3QgeworICAgcWNhbWVyYV9hcGlfcmVzdWx0X3QgcmVzdWx0OworICAgc3RydWN0IGFwaV9yZXN1bHRfbGlzdCAqbmV4dDsKK31hcGlfcmVzdWx0X2xpc3Q7CisKKy8vIGRlZmluaXRpb24gZm9yIHBheWxvYWQgdHlwZSBvZiBzZXR0aW5nIGNhbGxiYWNrCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtZXJhX25vdGlmeV9jYWxsYmFjayBub3RpZnlfY2I7CisgICAgY2FtZXJhX2RhdGFfY2FsbGJhY2sgZGF0YV9jYjsKKyAgICBjYW1lcmFfZGF0YV90aW1lc3RhbXBfY2FsbGJhY2sgZGF0YV9jYl90aW1lc3RhbXA7CisgICAgY2FtZXJhX3JlcXVlc3RfbWVtb3J5IGdldF9tZW1vcnk7CisgICAgdm9pZCAqdXNlcjsKK30gcWNhbWVyYV9zbV9ldnRfc2V0Y2JfcGF5bG9hZF90OworCisvLyBkZWZpbml0aW9uIGZvciBwYXlsb2FkIHR5cGUgb2Ygc2VuZGluZyBjb21tYW5kCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MzJfdCBjbWQ7CisgICAgaW50MzJfdCBhcmcxOworICAgIGludDMyX3QgYXJnMjsKK30gcWNhbWVyYV9zbV9ldnRfY29tbWFuZF9wYXlsb2FkX3Q7CisKKy8vIGRlZmluaXRpb24gZm9yIHBheWxvYWQgdHlwZSBvZiBzZW5kaW5nIGNvbW1hbmQKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB2b2lkICppbWdfcHRyOworICAgIGNhbV9wcF9vZmZsaW5lX3NyY19jb25maWdfdCAqY29uZmlnOworfSBxY2FtZXJhX3NtX2V2dF9yZWdfZmFjZV9wYXlsb2FkX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUUNBTUVSQV9JTlRFUk5BTF9FVlRfRk9DVVNfVVBEQVRFLCAgICAgICAvLyBmb2N1cyB1cGRhdGluZyByZXN1bHQKKyAgICBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9QUkVQX1NOQVBTSE9UX0RPTkUsIC8vIHByZXBhcmUgc25hcHNob3QgZG9uZQorICAgIFFDQU1FUkFfSU5URVJOQUxfRVZUX0ZBQ0VfREVURUNUX1JFU1VMVCwgLy8gZmFjZSBkZXRlY3Rpb24gcmVzdWx0CisgICAgUUNBTUVSQV9JTlRFUk5BTF9FVlRfSElTVE9HUkFNX1NUQVRTLCAgICAvLyBoaXN0b2dyYW0KKyAgICBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9DUk9QX0lORk8sICAgICAgICAgIC8vIGNyb3AgaW5mbworICAgIFFDQU1FUkFfSU5URVJOQUxfRVZUX0FTRF9VUERBVEUsICAgICAgICAgLy8gYXNkIHVwZGF0ZSByZXN1bHQKKyAgICBRQ0FNRVJBX0lOVEVSTkFMX0VWVF9SRUFEWV9GT1JfU05BUFNIT1QsIC8vIFJlYWR5IGZvciBQcmVwYXJlIFNuYXBzaG90CisgICAgUUNBTUVSQV9JTlRFUk5BTF9FVlRfTEVEX01PREVfT1ZFUlJJREUsIC8vIExlZCBtb2RlIG92ZXJyaWRlCisgICAgUUNBTUVSQV9JTlRFUk5BTF9FVlRfQVdCX1VQREFURSwgICAgICAgICAvLyBhd2IgdXBkYXRlIHJlc3VsdAorICAgIFFDQU1FUkFfSU5URVJOQUxfRVZUX0FFX1VQREFURSwgICAgICAgICAgLy8gYWUgdXBkYXRlIHJlc3VsdAorICAgIFFDQU1FUkFfSU5URVJOQUxfRVZUX0ZPQ1VTX1BPU19VUERBVEUsICAgLy8gZm9jdXMgcG9zaXRpb24gdXBkYXRlIHJlc3VsdAorICAgIFFDQU1FUkFfSU5URVJOQUxfRVZUX0hEUl9VUERBVEUsICAgICAgICAgLy8gSERSIHNjZW5lIHVwZGF0ZQorICAgIFFDQU1FUkFfSU5URVJOQUxfRVZUX1JFVFJPX0FFQ19VTkxPQ0ssICAgLy8gcmV0cm8gYnVyc3QgQUVDIHVubG9jayBldmVudAorICAgIFFDQU1FUkFfSU5URVJOQUxfRVZUX1pTTF9DQVBUVVJFX0RPTkUsICAgLy8gWlNMIGNhcHR1cmUgZG9uZSBldmVudAorICAgIFFDQU1FUkFfSU5URVJOQUxfRVZUX01BWAorfSBxY2FtZXJhX2ludGVybmFsX2V2dF90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBxY2FtZXJhX2ludGVybmFsX2V2dF90eXBlX3QgZXZ0X3R5cGU7CisgICAgdW5pb24geworICAgICAgICBjYW1fYXV0b19mb2N1c19kYXRhX3QgZm9jdXNfZGF0YTsKKyAgICAgICAgY2FtX3ByZXBfc25hcHNob3Rfc3RhdGVfdCBwcmVwX3NuYXBzaG90X3N0YXRlOworICAgICAgICBjYW1fZmFjZXNfZGF0YV90IGZhY2VzX2RhdGE7CisgICAgICAgIGNhbV9oaXN0X3N0YXRzX3Qgc3RhdHNfZGF0YTsKKyAgICAgICAgY2FtX2Nyb3BfZGF0YV90IGNyb3BfZGF0YTsKKyAgICAgICAgY2FtX2FzZF9kZWNpc2lvbl90IGFzZF9kYXRhOworICAgICAgICBjYW1fZmxhc2hfbW9kZV90IGxlZF9kYXRhOworICAgICAgICBjYW1fYXdiX3BhcmFtc190IGF3Yl9kYXRhOworICAgICAgICBjYW1fM2FfcGFyYW1zX3QgYWVfZGF0YTsKKyAgICAgICAgY2FtX2ZvY3VzX3Bvc19pbmZvX3QgZm9jdXNfcG9zOworICAgICAgICBjYW1fYXNkX2hkcl9zY2VuZV9kYXRhX3QgaGRyX2RhdGE7CisgICAgfTsKK30gcWNhbWVyYV9zbV9pbnRlcm5hbF9ldnRfcGF5bG9hZF90OworCitjbGFzcyBRQ2FtZXJhU3RhdGVNYWNoaW5lCit7CitwdWJsaWM6CisgICAgUUNhbWVyYVN0YXRlTWFjaGluZShRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpjdHJsKTsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhU3RhdGVNYWNoaW5lKCk7CisgICAgaW50MzJfdCBwcm9jQVBJKHFjYW1lcmFfc21fZXZ0X2VudW1fdCBldnQsIHZvaWQgKmFwaV9wYXlsb2FkKTsKKyAgICBpbnQzMl90IHByb2NFdnQocWNhbWVyYV9zbV9ldnRfZW51bV90IGV2dCwgdm9pZCAqZXZ0X3BheWxvYWQpOworCisgICAgYm9vbCBpc1ByZXZpZXdSdW5uaW5nKCk7IC8vIGNoZWNrIGlmIHByZXZpZXcgaXMgcnVubmluZworICAgIGJvb2wgaXNQcmV2aWV3UmVhZHkoKTsgLy8gY2hlY2sgaWYgcHJldmlldyBpcyByZWFkeQorICAgIGJvb2wgaXNDYXB0dXJlUnVubmluZygpOyAvLyBjaGVjayBpZiBpbWFnZSBjYXB0dXJlIGlzIHJ1bm5pbmcKKyAgICBib29sIGlzTm9uWlNMQ2FwdHVyZVJ1bm5pbmcoKTsgLy8gY2hlY2sgaWYgaW1hZ2UgY2FwdHVyZSBpcyBydW5uaW5nIGluIG5vbiBaU0wgbW9kZQorICAgIFN0cmluZzggZHVtcCgpOyAvL3JldHVybnMgdGhlIHN0YXRlIGluZm9ybWF0aW9uIGluIGEgc3RyaW5nCisgICAgYm9vbCBpc1ByZXBTbmFwU3RhdGVSdW5uaW5nKCk7CisgICAgYm9vbCBpc1JlY29yZGluZygpOworICAgIHZvaWQgcmVsZWFzZVRocmVhZCgpOworCisgICAgYm9vbCBpc1ByZXZpZXdDYWxsYmFja05lZWRlZCgpIHsgcmV0dXJuIG1fYlByZXZpZXdDYWxsYmFja05lZWRlZDsgfTsKKyAgICBpbnQzMl90IHNldFByZXZpZXdDYWxsYmFja05lZWRlZChib29sIGVuYWJsZWQpIHttX2JQcmV2aWV3Q2FsbGJhY2tOZWVkZWQ9ZW5hYmxlZDsgcmV0dXJuIDA7fTsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAgUUNBTUVSQV9TTV9TVEFURV9QUkVWSUVXX1NUT1BQRUQsICAgICAgICAgIC8vIHByZXZpZXcgaXMgc3RvcHBlZAorICAgICAgICBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfUkVBRFksICAgICAgICAgICAgLy8gcHJldmlldyBzdGFydGVkIGJ1dCBwcmV2aWV3IHdpbmRvdyBpcyBub3Qgc2V0IHlldAorICAgICAgICBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdJTkcsICAgICAgICAgICAgICAgLy8gcHJldmlld2luZworICAgICAgICBRQ0FNRVJBX1NNX1NUQVRFX1BSRVBBUkVfU05BUFNIT1QsICAgICAgICAgLy8gcHJlcGFyZSBzbmFwc2hvdCBpbiBjYXNlIGFlYyBlc3RpbWF0aW9uIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkZWQgZm9yIExFRCBmbGFzaAorICAgICAgICBRQ0FNRVJBX1NNX1NUQVRFX1BJQ19UQUtJTkcsICAgICAgICAgICAgICAgLy8gdGFraW5nIHBpY3R1cmUgKHByZXZpZXcgc3RvcHBlZCkKKyAgICAgICAgUUNBTUVSQV9TTV9TVEFURV9SRUNPUkRJTkcsICAgICAgICAgICAgICAgIC8vIHJlY29yZGluZyAocHJldmlldyBydW5uaW5nKQorICAgICAgICBRQ0FNRVJBX1NNX1NUQVRFX1ZJREVPX1BJQ19UQUtJTkcsICAgICAgICAgLy8gdGFraW5nIGxpdmUgc25hcHNob3QgZHVyaW5nIHJlY29yZGluZyAocHJldmlldyBydW5uaW5nKQorICAgICAgICBRQ0FNRVJBX1NNX1NUQVRFX1BSRVZJRVdfUElDX1RBS0lORyAgICAgICAgLy8gdGFraW5nIFpTTC9saXZlIHNuYXBzaG90IChyZWNvcmRpbmcgc3RvcHBlZCBidXQgcHJldmlldyBydW5uaW5nKQorICAgIH0gcWNhbWVyYV9zdGF0ZV9lbnVtX3Q7CisKKyAgICB0eXBlZGVmIGVudW0KKyAgICB7CisgICAgICAgIFFDQU1FUkFfU01fQ01EX1RZUEVfQVBJLCAgICAgICAgICAgICAgICAgICAvLyBjbWQgZnJvbSBBUEkKKyAgICAgICAgUUNBTUVSQV9TTV9DTURfVFlQRV9FVlQsICAgICAgICAgICAgICAgICAgIC8vIGNtZCBmcm9tIG1tLWNhbWVyYS1pbnRlcmZhY2UvbW0tanBlZy1pbnRlcmZhY2UgZXZlbnQKKyAgICAgICAgUUNBTUVSQV9TTV9DTURfVFlQRV9FWElULCAgICAgICAgICAgICAgICAgIC8vIGNtZCBmb3IgZXhpdGluZyBzdGF0ZW1hY2hpbmUgY21kVGhyZWFkCisgICAgICAgIFFDQU1FUkFfU01fQ01EX1RZUEVfTUFYCisgICAgfSBxY2FtZXJhX3NtX2NtZF90eXBlX3Q7CisKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIHFjYW1lcmFfc21fY21kX3R5cGVfdCBjbWQ7ICAgICAgICAgICAgICAgICAgLy8gY21kIHR5cGUgKHdoZXJlIGl0IGNvbWVzIGZyb20pCisgICAgICAgIHFjYW1lcmFfc21fZXZ0X2VudW1fdCBldnQ7ICAgICAgICAgICAgICAgICAgLy8gZXZlbnQgdHlwZQorICAgICAgICB2b2lkICpldnRfcGF5bG9hZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB0ciB0byBwYXlsb2FkCisgICAgfSBxY2FtZXJhX3NtX2NtZF90OworCisgICAgaW50MzJfdCBzdGF0ZU1hY2hpbmUocWNhbWVyYV9zbV9ldnRfZW51bV90IGV2dCwgdm9pZCAqcGF5bG9hZCk7CisgICAgaW50MzJfdCBwcm9jRXZ0UHJldmlld1N0b3BwZWRTdGF0ZShxY2FtZXJhX3NtX2V2dF9lbnVtX3QgZXZ0LCB2b2lkICpwYXlsb2FkKTsKKyAgICBpbnQzMl90IHByb2NFdnRQcmV2aWV3UmVhZHlTdGF0ZShxY2FtZXJhX3NtX2V2dF9lbnVtX3QgZXZ0LCB2b2lkICpwYXlsb2FkKTsKKyAgICBpbnQzMl90IHByb2NFdnRQcmV2aWV3aW5nU3RhdGUocWNhbWVyYV9zbV9ldnRfZW51bV90IGV2dCwgdm9pZCAqcGF5bG9hZCk7CisgICAgaW50MzJfdCBwcm9jRXZ0UHJlcGFyZVNuYXBzaG90U3RhdGUocWNhbWVyYV9zbV9ldnRfZW51bV90IGV2dCwgdm9pZCAqcGF5bG9hZCk7CisgICAgaW50MzJfdCBwcm9jRXZ0UGljVGFraW5nU3RhdGUocWNhbWVyYV9zbV9ldnRfZW51bV90IGV2dCwgdm9pZCAqcGF5bG9hZCk7CisgICAgaW50MzJfdCBwcm9jRXZ0UmVjb3JkaW5nU3RhdGUocWNhbWVyYV9zbV9ldnRfZW51bV90IGV2dCwgdm9pZCAqcGF5bG9hZCk7CisgICAgaW50MzJfdCBwcm9jRXZ0VmlkZW9QaWNUYWtpbmdTdGF0ZShxY2FtZXJhX3NtX2V2dF9lbnVtX3QgZXZ0LCB2b2lkICpwYXlsb2FkKTsKKyAgICBpbnQzMl90IHByb2NFdnRQcmV2aWV3UGljVGFraW5nU3RhdGUocWNhbWVyYV9zbV9ldnRfZW51bV90IGV2dCwgdm9pZCAqcGF5bG9hZCk7CisKKyAgICAvLyBtYWluIHN0YXRlbWFjaGluZSBwcm9jZXNzIHJvdXRpbmUKKyAgICBzdGF0aWMgdm9pZCAqc21FdnRQcm9jUm91dGluZSh2b2lkICpkYXRhKTsKKworICAgIGludDMyX3QgYXBwbHlEZWxheWVkTXNncygpOworCisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqbV9wYXJlbnQ7ICAvLyBwdHIgdG8gSFdJCisgICAgcWNhbWVyYV9zdGF0ZV9lbnVtX3QgbV9zdGF0ZTsgICAgICAgICAvLyBzdGF0ZW1hY2hpbmUgc3RhdGUKKyAgICBRQ2FtZXJhUXVldWUgYXBpX3F1ZXVlOyAgICAgICAgICAgICAgIC8vIGNtZCBxdWV1ZSBmb3IgQVBJcworICAgIFFDYW1lcmFRdWV1ZSBldnRfcXVldWU7ICAgICAgICAgICAgICAgLy8gY21kIHF1ZXVlIGZvciBldnQgZnJvbSBtbS1jYW1lcmEtaW50Zi9tbS1qcGVnLWludGYKKyAgICBwdGhyZWFkX3QgY21kX3BpZDsgICAgICAgICAgICAgICAgICAgIC8vIGNtZCB0aHJlYWQgSUQKKyAgICBjYW1fc2VtYXBob3JlX3QgY21kX3NlbTsgICAgICAgICAgICAgIC8vIHNlbWFwaG9yZSBmb3IgY21kIHRocmVhZAorICAgIGJvb2wgbV9iRGVsYXlQcmV2aWV3TXNnczsgICAgICAgICAgICAgLy8gRGVsYXkgcHJldmlldyBjYWxsYmFjayBlbmFibGUgZHVyaW5nIFpTTCBzbmFwc2hvdAorICAgIGJvb2wgbV9iUHJldmlld05lZWRzUmVzdGFydDsgICAgICAgICAgLy8gUHJldmlldyBuZWVkcyByZXN0YXJ0CisgICAgYm9vbCBtX2JQcmV2aWV3RGVsYXllZFJlc3RhcnQ7ICAgICAgICAvLyBQcmV2aWV3IGRlbGF5ZWQgcmVzdGFydAorICAgIGludDMyX3QgbV9EZWxheWVkTXNnczsKKyAgICBib29sIG1fUmVzdG9yZVpTTDsKKyAgICBib29sIG1fYlByZXZpZXdDYWxsYmFja05lZWRlZDsKK307CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCisKKyNlbmRpZiAvKiBfX1FDQU1FUkFfU1RBVEVNQUNISU5FX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhU3RyZWFtLmNwcCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYVN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjMDJiOQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYVN0cmVhbS5jcHAKQEAgLTAsMCArMSwyNjg0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYVN0cmVhbSIKKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiUUNhbWVyYUJ1ZmZlck1hcHMuaCIKKyNpbmNsdWRlICJRQ2FtZXJhMkhXSS5oIgorI2luY2x1ZGUgIlFDYW1lcmFTdHJlYW0uaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorfQorCisjZGVmaW5lIENBTUVSQV9NSU5fQUxMT0NBVEVEX0JVRkZFUlMgICAgIDMKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldF9idWZzCisgKgorICogREVTQ1JJUFRJT046IHN0YXRpYyBmdW5jdGlvbiBlbnRyeSB0byBhbGxvY2F0ZSBzdHJlYW0gYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb2Zmc2V0ICAgICA6IG9mZnNldCBpbmZvIG9mIHN0cmVhbSBidWZmZXJzCisgKiAgIEBudW1fYnVmcyAgIDogbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkCisgKiAgIEBpbml0aWFsX3JlZ19mbGFnOiBmbGFnIHRvIGluZGljYXRlIGlmIGJ1ZmZlciBuZWVkcyB0byBiZSByZWdpc3RlcmVkCisgKiAgICAgICAgICAgICAgICAgICAgICBhdCBrZXJuZWwgaW5pdGlhbGx5CisgKiAgIEBidWZzICAgICAgIDogb3V0cHV0IG9mIGFsbG9jYXRlZCBidWZmZXJzCisgKiAgIEBvcHNfdGJsICAgIDogcHRyIHRvIGJ1ZiBtYXBwaW5nL3VubWFwcGluZyBvcHMKKyAqICAgQHVzZXJfZGF0YSAgOiB1c2VyIGRhdGEgcHRyIG9mIG9wc190YmwKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OmdldF9idWZzKAorICAgICAgICAgICAgICAgICAgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCAqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbnVtX2J1ZnMsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqaW5pdGlhbF9yZWdfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKipidWZzLAorICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKm9wc190YmwsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgUUNhbWVyYVN0cmVhbSAqc3RyZWFtID0gcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhU3RyZWFtICo+KHVzZXJfZGF0YSk7CisgICAgaWYgKCFzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiZ2V0QnVmcyBpbnZhbGlkIHN0cmVhbSBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgaWYgKHN0cmVhbS0+bVN0cmVhbUluZm8gIT0gTlVMTAorICAgICAgICAgICAgJiYgc3RyZWFtLT5tU3RyZWFtSW5mby0+c3RyZWFtaW5nX21vZGUgPT0gQ0FNX1NUUkVBTUlOR19NT0RFX0JBVENIKSB7CisgICAgICAgIC8vQmF0Y2ggTW9kZS4gQWxsb2NhdGUgQnV0Y2ggYnVmZmVycworICAgICAgICByZXR1cm4gc3RyZWFtLT5hbGxvY2F0ZUJhdGNoQnVmcyhvZmZzZXQsIG51bV9idWZzLAorICAgICAgICAgICAgICAgIGluaXRpYWxfcmVnX2ZsYWcsIGJ1ZnMsIG9wc190YmwpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFBsYW5lIEJ1ZmZlci4gQWxsb2NhdGUgcGxhbmUgYnVmZmVyCisgICAgICAgIHJldHVybiBzdHJlYW0tPmdldEJ1ZnMob2Zmc2V0LCBudW1fYnVmcywKKyAgICAgICAgICAgICAgICBpbml0aWFsX3JlZ19mbGFnLCBidWZzLCBvcHNfdGJsKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0X2J1ZnNfZGVmZmVyZWQKKyAqCisgKiBERVNDUklQVElPTjogc3RhdGljIGZ1bmN0aW9uIGVudHJ5IHRvIGFsbG9jYXRlIGRlZmZlcmVkIHN0cmVhbSBidWZmZXJzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBvZmZzZXQgICAgIDogb2Zmc2V0IGluZm8gb2Ygc3RyZWFtIGJ1ZmZlcnMKKyAqICAgQG51bV9idWZzICAgOiBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQKKyAqICAgQGluaXRpYWxfcmVnX2ZsYWc6IGZsYWcgdG8gaW5kaWNhdGUgaWYgYnVmZmVyIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIGF0IGtlcm5lbCBpbml0aWFsbHkKKyAqICAgQGJ1ZnMgICAgICAgOiBvdXRwdXQgb2YgYWxsb2NhdGVkIGJ1ZmZlcnMKKyAqICAgQG9wc190YmwgICAgOiBwdHIgdG8gYnVmIG1hcHBpbmcvdW5tYXBwaW5nIG9wcworICogICBAdXNlcl9kYXRhICA6IHVzZXIgZGF0YSBwdHIgb2Ygb3BzX3RibAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVN0cmVhbTo6Z2V0X2J1ZnNfZGVmZmVyZWQoCisgICAgICAgIGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QgKiAvKiBvZmZzZXQgKi8sCisgICAgICAgIHVpbnQ4X3QgKm51bV9idWZzLAorICAgICAgICB1aW50OF90ICoqaW5pdGlhbF9yZWdfZmxhZywKKyAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqKmJ1ZnMsCisgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICogb3BzX3RibCwKKyAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIFFDYW1lcmFTdHJlYW0gKnN0cmVhbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYVN0cmVhbSAqPih1c2VyX2RhdGEpOworCisgICAgaWYgKCFzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiZ2V0QnVmcyBpbnZhbGlkIHN0cmVhbSBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgcmV0dXJuIHN0cmVhbS0+Z2V0QnVmc0RlZmVycmVkKE5VTEwgLypvZmZzZXQqLywgbnVtX2J1ZnMsIGluaXRpYWxfcmVnX2ZsYWcsIGJ1ZnMsCisgICAgICAgICAgICBvcHNfdGJsKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwdXRfYnVmcworICoKKyAqIERFU0NSSVBUSU9OOiBzdGF0aWMgZnVuY3Rpb24gZW50cnkgdG8gZGVhbGxvY2F0ZSBzdHJlYW0gYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb3BzX3RibCAgICA6IHB0ciB0byBidWYgbWFwcGluZy91bm1hcHBpbmcgb3BzCisgKiAgIEB1c2VyX2RhdGEgIDogdXNlciBkYXRhIHB0ciBvZiBvcHNfdGJsCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpwdXRfYnVmcygKKyAgICAgICAgbW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKm9wc190YmwsCisgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBRQ2FtZXJhU3RyZWFtICpzdHJlYW0gPSByZWludGVycHJldF9jYXN0PFFDYW1lcmFTdHJlYW0gKj4odXNlcl9kYXRhKTsKKyAgICBpZiAoIXN0cmVhbSkgeworICAgICAgICBMT0dFKCJwdXRCdWZzIGludmFsaWQgc3RyZWFtIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtLT5tU3RyZWFtSW5mbyAhPSBOVUxMCisgICAgICAgICAgICAmJiBzdHJlYW0tPm1TdHJlYW1JbmZvLT5zdHJlYW1pbmdfbW9kZSA9PSBDQU1fU1RSRUFNSU5HX01PREVfQkFUQ0gpIHsKKyAgICAgICAgLy9CYXRjaCBNb2RlLiByZWxlYXNlICBCdXRjaCBidWZmZXJzCisgICAgICAgIHJldHVybiBzdHJlYW0tPnJlbGVhc2VCYXRjaEJ1ZnMob3BzX3RibCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUGxhbmUgQnVmZmVyLiByZWxlYXNlICBwbGFuZSBidWZmZXIKKyAgICAgICAgcmV0dXJuIHN0cmVhbS0+cHV0QnVmcyhvcHNfdGJsKTsKKyAgICB9CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwdXRfYnVmc19kZWZmZXJlZAorICoKKyAqIERFU0NSSVBUSU9OOiBzdGF0aWMgZnVuY3Rpb24gZW50cnkgdG8gZGVhbGxvY2F0ZSBkZWZmZXJlZCBzdHJlYW0gYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb3BzX3RibCAgICA6IHB0ciB0byBidWYgbWFwcGluZy91bm1hcHBpbmcgb3BzCisgKiAgIEB1c2VyX2RhdGEgIDogdXNlciBkYXRhIHB0ciBvZiBvcHNfdGJsCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpwdXRfYnVmc19kZWZmZXJlZCgKKyAgICAgICAgbW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKiAvKm9wc190YmwgKi8sCisgICAgICAgIHZvaWQgKiB1c2VyX2RhdGEgKQoreworICAgIFFDYW1lcmFTdHJlYW0gKnN0cmVhbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYVN0cmVhbSAqPih1c2VyX2RhdGEpOworCisgICAgaWYgKCFzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgicHV0X2J1ZnNfZGVmZmVyZWQgaW52YWxpZCBzdHJlYW0gcG9pbnRlciIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHJldHVybiBzdHJlYW0tPnB1dEJ1ZnNEZWZmZXJlZCgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGludmFsaWRhdGVfYnVmCisgKgorICogREVTQ1JJUFRJT046IHN0YXRpYyBmdW5jdGlvbiBlbnRyeSB0byBpbnZhbGlkYXRlIGEgc3BlY2lmaWMgc3RyZWFtIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICAgICA6IGluZGV4IG9mIHRoZSBzdHJlYW0gYnVmZmVyIHRvIGludmFsaWRhdGUKKyAqICAgQHVzZXJfZGF0YSAgOiB1c2VyIGRhdGEgcHRyIG9mIG9wc190YmwKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OmludmFsaWRhdGVfYnVmKHVpbnQzMl90IGluZGV4LCB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgUUNhbWVyYVN0cmVhbSAqc3RyZWFtID0gcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhU3RyZWFtICo+KHVzZXJfZGF0YSk7CisgICAgaWYgKCFzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiaW52YWxpZCBzdHJlYW0gcG9pbnRlciIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGlmIChzdHJlYW0tPm1TdHJlYW1JbmZvLT5pc19zZWN1cmUgPT0gU0VDVVJFKXsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHN0cmVhbS0+bVN0cmVhbUluZm8tPnN0cmVhbWluZ19tb2RlID09IENBTV9TVFJFQU1JTkdfTU9ERV9CQVRDSCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmVhbS0+bUJ1ZkRlZnNbaW5kZXhdLnVzZXJfYnVmLmJ1ZnNfdXNlZDsgaSsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBidWZfaWR4ID0gc3RyZWFtLT5tQnVmRGVmc1tpbmRleF0udXNlcl9idWYuYnVmX2lkeFtpXTsKKyAgICAgICAgICAgIHN0cmVhbS0+aW52YWxpZGF0ZUJ1ZihidWZfaWR4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBzdHJlYW0tPmludmFsaWRhdGVCdWYoaW5kZXgpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNsZWFuX2ludmFsaWRhdGVfYnVmCisgKgorICogREVTQ1JJUFRJT046IHN0YXRpYyBmdW5jdGlvbiBlbnRyeSB0byBjbGVhbiBpbnZhbGlkYXRlIGEgc3BlY2lmaWMgc3RyZWFtIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICAgICA6IGluZGV4IG9mIHRoZSBzdHJlYW0gYnVmZmVyIHRvIGNsZWFuIGludmFsaWRhdGUKKyAqICAgQHVzZXJfZGF0YSAgOiB1c2VyIGRhdGEgcHRyIG9mIG9wc190YmwKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OmNsZWFuX2ludmFsaWRhdGVfYnVmKHVpbnQzMl90IGluZGV4LCB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgUUNhbWVyYVN0cmVhbSAqc3RyZWFtID0gcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhU3RyZWFtICo+KHVzZXJfZGF0YSk7CisgICAgaWYgKCFzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiaW52YWxpZCBzdHJlYW0gcG9pbnRlciIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGlmIChzdHJlYW0tPm1TdHJlYW1JbmZvLT5pc19zZWN1cmUgPT0gU0VDVVJFKXsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHN0cmVhbS0+bVN0cmVhbUluZm8tPnN0cmVhbWluZ19tb2RlID09IENBTV9TVFJFQU1JTkdfTU9ERV9CQVRDSCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0cmVhbS0+bUJ1ZkRlZnNbaW5kZXhdLnVzZXJfYnVmLmJ1ZnNfdXNlZDsgaSsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCBidWZfaWR4ID0gc3RyZWFtLT5tQnVmRGVmc1tpbmRleF0udXNlcl9idWYuYnVmX2lkeFtpXTsKKyAgICAgICAgICAgIHN0cmVhbS0+Y2xlYW5JbnZhbGlkYXRlQnVmKGJ1Zl9pZHgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHN0cmVhbS0+Y2xlYW5JbnZhbGlkYXRlQnVmKGluZGV4KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRfY29uZmlnX29wcworICoKKyAqIERFU0NSSVBUSU9OOiBzdGF0aWMgZnVuY3Rpb24gdXBkYXRlIG1tLWludGVyZmFjZSBvcHMgZnVuY3Rpb25zCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBvcHNfdGJsICAgIDogcHRyIHRvIGJ1ZiBtYXBwaW5nL3VubWFwcGluZyBvcHMKKyAqICAgQHVzZXJfZGF0YSAgOiB1c2VyIGRhdGEgcHRyIG9mIG9wc190YmwKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OnNldF9jb25maWdfb3BzKG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsLAorICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgUUNhbWVyYVN0cmVhbSAqc3RyZWFtID0gcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhU3RyZWFtICo+KHVzZXJfZGF0YSk7CisgICAgaWYgKCFzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiU3RyZWFtIGludmFsaWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBzdHJlYW0tPm1fTWVtT3BzVGJsID0gKm9wc190Ymw7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYVN0cmVhbQorICoKKyAqIERFU0NSSVBUSU9OOiBjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhU3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBhbGxvY2F0b3IgIDogbWVtb3J5IGFsbG9jYXRvciBvYmoKKyAqICAgQGNhbUhhbmRsZSAgOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBjaElkICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqICAgQGNhbU9wcyAgICAgOiBwdHIgdG8gY2FtZXJhIG9wcyB0YWJsZQorICogICBAcGFkZGluZ0luZm86IHB0ciB0byBwYWRkaW5nIGluZm8KKyAqICAgQGRlZmZlcmVkICAgOiBkZWZlcnJlZCBzdHJlYW0KKyAqICAgQG9ubGluZV9yb3RhdGlvbjogcm90YXRpb24gYXBwbGllZCBvbmxpbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhU3RyZWFtOjpRQ2FtZXJhU3RyZWFtKFFDYW1lcmFBbGxvY2F0b3IgJmFsbG9jYXRvciwKKyAgICAgICAgdWludDMyX3QgY2FtSGFuZGxlLCB1aW50MzJfdCBjaElkLAorICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbU9wcywgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKKyAgICAgICAgYm9vbCBkZWZmZXJlZCwgY2FtX3JvdGF0aW9uX3Qgb25saW5lX3JvdGF0aW9uKToKKyAgICAgICAgbUR1bXBGcmFtZSgwKSwKKyAgICAgICAgbUR1bXBNZXRhRnJhbWUoMCksCisgICAgICAgIG1EdW1wU2tpcENudCgwKSwKKyAgICAgICAgbVN0cmVhbVRpbWVzdGFtcCgwKSwKKyAgICAgICAgbUNhbUhhbmRsZShjYW1IYW5kbGUpLAorICAgICAgICBtQ2hhbm5lbEhhbmRsZShjaElkKSwKKyAgICAgICAgbUhhbmRsZSgwKSwKKyAgICAgICAgbUNhbU9wcyhjYW1PcHMpLAorICAgICAgICBtU3RyZWFtSW5mbyhOVUxMKSwKKyAgICAgICAgbU51bUJ1ZnMoMCksCisgICAgICAgIG1OdW1QbGFuZUJ1ZnMoMCksCisgICAgICAgIG1OdW1CdWZzTmVlZEFsbG9jKDApLAorICAgICAgICBtUmVnRmxhZ3MoTlVMTCksCisgICAgICAgIG1EYXRhQ0IoTlVMTCksCisgICAgICAgIG1TWU5DRGF0YUNCKE5VTEwpLAorICAgICAgICBtVXNlckRhdGEoTlVMTCksCisgICAgICAgIG1EYXRhUShyZWxlYXNlRnJhbWVEYXRhLCB0aGlzKSwKKyAgICAgICAgbVN0cmVhbUluZm9CdWYoTlVMTCksCisgICAgICAgIG1NaXNjQnVmKE5VTEwpLAorICAgICAgICBtU3RyZWFtQnVmcyhOVUxMKSwKKyAgICAgICAgbVN0cmVhbUJhdGNoQnVmcyhOVUxMKSwKKyAgICAgICAgbUFsbG9jYXRvcihhbGxvY2F0b3IpLAorICAgICAgICBtQnVmRGVmcyhOVUxMKSwKKyAgICAgICAgbVBsYW5lQnVmRGVmcyhOVUxMKSwKKyAgICAgICAgbU9ubGluZVJvdGF0aW9uKG9ubGluZV9yb3RhdGlvbiksCisgICAgICAgIG1TdHJlYW1CdWZzQWNxdWlyZWQoZmFsc2UpLAorICAgICAgICBtX2JBY3RpdmUoZmFsc2UpLAorICAgICAgICBtRHluQnVmQWxsb2MoZmFsc2UpLAorICAgICAgICBtQnVmQWxsb2NQaWQoMCksCisgICAgICAgIG1EZWZmZXJlZEFsbG9jYXRpb24oZGVmZmVyZWQpLAorICAgICAgICB3YWl0X2Zvcl9jb25kKGZhbHNlKSwKKyAgICAgICAgbUFsbG9jVGFza0lkKDApLAorICAgICAgICBtTWFwVGFza0lkKDApLAorICAgICAgICBtU3luY0NCRW5hYmxlZChmYWxzZSkKK3sKKyAgICBtTWVtVnRibC51c2VyX2RhdGEgPSB0aGlzOworICAgIGlmICggIWRlZmZlcmVkICkgeworICAgICAgICBtTWVtVnRibC5nZXRfYnVmcyA9IGdldF9idWZzOworICAgICAgICBtTWVtVnRibC5wdXRfYnVmcyA9IHB1dF9idWZzOworICAgIH0gZWxzZSB7CisgICAgICAgIG1NZW1WdGJsLmdldF9idWZzID0gZ2V0X2J1ZnNfZGVmZmVyZWQ7CisgICAgICAgIG1NZW1WdGJsLnB1dF9idWZzID0gcHV0X2J1ZnNfZGVmZmVyZWQ7CisgICAgfQorICAgIG1NZW1WdGJsLmludmFsaWRhdGVfYnVmID0gaW52YWxpZGF0ZV9idWY7CisgICAgbU1lbVZ0YmwuY2xlYW5faW52YWxpZGF0ZV9idWYgPSBjbGVhbl9pbnZhbGlkYXRlX2J1ZjsKKyAgICBtTWVtVnRibC5zZXRfY29uZmlnX29wcyA9IHNldF9jb25maWdfb3BzOworICAgIG1lbXNldCgmbUZyYW1lTGVuT2Zmc2V0LCAwLCBzaXplb2YobUZyYW1lTGVuT2Zmc2V0KSk7CisgICAgbWVtY3B5KCZtUGFkZGluZ0luZm8sIHBhZGRpbmdJbmZvLCBzaXplb2YoY2FtX3BhZGRpbmdfaW5mb190KSk7CisgICAgbWVtc2V0KCZtQ3JvcEluZm8sIDAsIHNpemVvZihjYW1fcmVjdF90KSk7CisgICAgbWVtc2V0KCZtX01lbU9wc1RibCwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90KSk7CisgICAgbWVtc2V0KCZtX091dHB1dENyb3AsIDAsIHNpemVvZihjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QpKTsKKyAgICBtZW1zZXQoJm1fSW1nUHJvcCwgMCwgc2l6ZW9mKGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCkpOworICAgIG1lbXNldCgmbUFsbG9jVGFzaywgMCwgc2l6ZW9mKG1BbGxvY1Rhc2spKTsKKyAgICBtZW1zZXQoJm1NYXBUYXNrLCAwLCBzaXplb2YobU1hcFRhc2spKTsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJm1Dcm9wTG9jaywgTlVMTCk7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtUGFyYW1ldGVyTG9jaywgTlVMTCk7CisgICAgbUN1ck1ldGFNZW1vcnkgPSBOVUxMOworICAgIG1DdXJCdWZJbmRleCA9IC0xOworICAgIG1DdXJNZXRhSW5kZXggPSAtMTsKKyAgICBtRmlyc3RUaW1lU3RhbXAgPSAwOworICAgIG1lbXNldCAoJm1TdHJlYW1NZXRhTWVtb3J5LCAwLAorICAgICAgICAgICAgKHNpemVvZihNZXRhTWVtb3J5KSAqIENBTUVSQV9NSU5fVklERU9fQkFUQ0hfQlVGRkVSUykpOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbV9sb2NrLCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbV9jb25kLCBOVUxMKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYVN0cmVhbQorICoKKyAqIERFU0NSSVBUSU9OOiBkZWNvbnN0cnVjdG9yIG9mIFFDYW1lcmFTdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFTdHJlYW06On5RQ2FtZXJhU3RyZWFtKCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1Dcm9wTG9jayk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtUGFyYW1ldGVyTG9jayk7CisKKyAgICBtQWxsb2NhdG9yLndhaXRGb3JCYWNrZ3JvdW5kVGFzayhtQWxsb2NUYXNrSWQpOworICAgIG1BbGxvY2F0b3Iud2FpdEZvckJhY2tncm91bmRUYXNrKG1NYXBUYXNrSWQpOworICAgIGlmIChtQnVmQWxsb2NQaWQgIT0gMCkgeworICAgICAgICBjb25kX3NpZ25hbCh0cnVlKTsKKyAgICAgICAgTE9HTCgiV2FpdCBmb3IgYnVmIGFsbG9jYXRpb24gdGhyZWFkIGRlYWQiKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFsbG9jYXRpb24gb2YgYWRkaXRpb25hbCBzdHJlYW0gYnVmZmVycworICAgICAgICBwdGhyZWFkX2pvaW4obUJ1ZkFsbG9jUGlkLCBOVUxMKTsKKyAgICAgICAgbUJ1ZkFsbG9jUGlkID0gMDsKKyAgICB9CisKKyAgICBpZiAobURlZmZlcmVkQWxsb2NhdGlvbikgeworICAgICAgICBtU3RyZWFtQnVmc0FjcXVpcmVkID0gZmFsc2U7CisgICAgICAgIHJlbGVhc2VCdWZmcygpOworICAgIH0KKworICAgIHVubWFwU3RyZWFtSW5mb0J1ZigpOworICAgIHJlbGVhc2VTdHJlYW1JbmZvQnVmKCk7CisKKyAgICBpZiAobU1pc2NCdWYpIHsKKyAgICAgICAgdW5NYXBCdWYobU1pc2NCdWYsIENBTV9NQVBQSU5HX0JVRl9UWVBFX01JU0NfQlVGLCBOVUxMKTsKKyAgICAgICAgcmVsZWFzZU1pc2NCdWYoKTsKKyAgICB9CisKKyAgICAvLyBkZWxldGUgc3RyZWFtCisgICAgaWYgKG1IYW5kbGUgPiAwKSB7CisgICAgICAgIG1DYW1PcHMtPmRlbGV0ZV9zdHJlYW0obUNhbUhhbmRsZSwgbUNoYW5uZWxIYW5kbGUsIG1IYW5kbGUpOworICAgICAgICBtSGFuZGxlID0gMDsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtX2xvY2spOworICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZtX2NvbmQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVubWFwU3RyZWFtSW5mb0J1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBVbm1hcCBzdHJlYW0gaW5mbyBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OnVubWFwU3RyZWFtSW5mb0J1ZigpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisKKyAgICBpZiAobVN0cmVhbUluZm9CdWYgIT0gTlVMTCkgeworICAgICAgICByYyA9IG1DYW1PcHMtPnVubWFwX3N0cmVhbV9idWYobUNhbUhhbmRsZSwKKyAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLAorICAgICAgICAgICAgbUhhbmRsZSwKKyAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9JTkZPLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIC0xKTsKKworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gdW5tYXAgc3RyZWFtIGluZm8gYnVmZmVyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVsZWFzZU1pc2NCdWYKKyAqCisgKiBERVNDUklQVElPTjogUmVsZWFzZSBtaXNjIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OnJlbGVhc2VNaXNjQnVmKCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKworICAgIGlmIChtTWlzY0J1ZiAhPSBOVUxMKSB7CisgICAgICAgIG1NaXNjQnVmLT5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbGV0ZSBtTWlzY0J1ZjsKKyAgICAgICAgbU1pc2NCdWYgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWxlYXNlU3RyZWFtSW5mb0J1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIHN0cmVhbSBpbmZvIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVN0cmVhbTo6cmVsZWFzZVN0cmVhbUluZm9CdWYoKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKG1TdHJlYW1JbmZvQnVmICE9IE5VTEwpIHsKKyAgICAgICAgbVN0cmVhbUluZm9CdWYtPmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVsZXRlIG1TdHJlYW1JbmZvQnVmOworICAgICAgICBtU3RyZWFtSW5mb0J1ZiA9IE5VTEw7CisgICAgICAgIG1TdHJlYW1JbmZvID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGVsZXRlU3RyZWFtCisgKgorICogREVTQ1JJUFRJT046IERlbGV0ZXMgYSBjYW1lcmEgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFTdHJlYW06OmRlbGV0ZVN0cmVhbSgpCit7CisgICAgaWYgKG1IYW5kbGUgPiAwKSB7CisgICAgICAgIGFjcXVpcmVTdHJlYW1CdWZzKCk7CisgICAgICAgIHJlbGVhc2VCdWZmcygpOworICAgICAgICB1bm1hcFN0cmVhbUluZm9CdWYoKTsKKyAgICAgICAgbUNhbU9wcy0+ZGVsZXRlX3N0cmVhbShtQ2FtSGFuZGxlLCBtQ2hhbm5lbEhhbmRsZSwgbUhhbmRsZSk7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVuTWFwQnVmCisgKgorICogREVTQ1JJUFRJT046IHVubWFwcyBidWZmZXJzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBoZWFwQnVmICAgICAgOiBoZWFwIGJ1ZmZlciBoYW5kbGVyCisgKiAgIEBidWZUeXBlICAgICAgOiBidWZmZXIgdHlwZQorICogICBAb3BzX3RibCAgICA6IHB0ciB0byBidWYgbWFwcGluZy91bm1hcHBpbmcgb3BzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjp1bk1hcEJ1ZihRQ2FtZXJhTWVtb3J5ICpCdWYsCisgICAgICAgIGNhbV9tYXBwaW5nX2J1Zl90eXBlIGJ1ZlR5cGUsIF9fdW51c2VkIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICB1aW50OF90IGNudDsKKyAgICBzc2l6ZV90IGJ1ZlNpemUgPSBCQURfSU5ERVg7CisgICAgdWludDMyX3QgaTsKKworICAgIGNudCA9IEJ1Zi0+Z2V0Q250KCk7CisgICAgZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgIGJ1ZlNpemUgPSBCdWYtPmdldFNpemUoaSk7CisgICAgICAgIGlmIChCQURfSU5ERVggIT0gYnVmU2l6ZSkgeworICAgICAgICAgICAgaWYgKG1fTWVtT3BzVGJsLnVubWFwX29wcyA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIHJjID0gbUNhbU9wcy0+dW5tYXBfc3RyZWFtX2J1ZihtQ2FtSGFuZGxlLCBtQ2hhbm5lbEhhbmRsZSwgbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlR5cGUsIGksIC0xKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmMgPSBtX01lbU9wc1RibC51bm1hcF9vcHMoaSwgLTEsIGJ1ZlR5cGUsIG1fTWVtT3BzVGJsLnVzZXJkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gdW5tYXAgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYnVmZmVyIHNpemUgKGJhZCBpbmRleCkiKTsKKyAgICAgICAgICAgIHJjID0gQkFEX0lOREVYOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbWFwQnVmcworICoKKyAqIERFU0NSSVBUSU9OOiBtYXBzIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGhlYXBCdWYgICAgICA6IGhlYXAgYnVmZmVyIGhhbmRsZXIKKyAqICAgQGJ1ZlR5cGUgICAgICA6IGJ1ZmZlciB0eXBlCisgKiAgIEBvcHNfdGJsICAgIDogcHRyIHRvIGJ1ZiBtYXBwaW5nL3VubWFwcGluZyBvcHMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06Om1hcEJ1ZnMoUUNhbWVyYU1lbW9yeSAqQnVmLAorICAgICAgICBjYW1fbWFwcGluZ19idWZfdHlwZSBidWZUeXBlLCBfX3VudXNlZCBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgdWludDMyX3QgaSA9IDA7CisKKyAgICBRQ2FtZXJhQnVmZmVyTWFwcyBidWZmZXJNYXBzOworICAgIGZvciAoaSA9IDA7IGkgPCBCdWYtPmdldENudCgpOyBpKyspIHsKKyAgICAgICAgc3NpemVfdCBidWZTaXplID0gQnVmLT5nZXRTaXplKGkpOworICAgICAgICBpZiAoQkFEX0lOREVYID09IGJ1ZlNpemUpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBidWZmZXIgc2l6ZSAoYmFkIGluZGV4KSIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gYnVmZmVyTWFwcy5lbnF1ZXVlKGJ1ZlR5cGUsIG1IYW5kbGUsIGkgLypidWYgaW5kZXgqLywgLTEgLypwbGFuZSBpbmRleCovLAorICAgICAgICAgICAgICAgIDAgLypjb29raWUqLywgQnVmLT5nZXRGZChpKSwgYnVmU2l6ZSwgQnVmLT5nZXRQdHIoaSkpOworCisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBtYXAgYnVmZmVycyIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNhbV9idWZfbWFwX3R5cGVfbGlzdCBidWZNYXBMaXN0OworICAgIHJjID0gYnVmZmVyTWFwcy5nZXRDYW1CdWZNYXBMaXN0KGJ1Zk1hcExpc3QpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIG1hcCBidWZmZXJzIik7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgaWYgKG1fTWVtT3BzVGJsLmJ1bmRsZWRfbWFwX29wcyA9PSBOVUxMKSB7CisgICAgICAgIHJjID0gbUNhbU9wcy0+bWFwX3N0cmVhbV9idWZzKG1DYW1IYW5kbGUsIG1DaGFubmVsSGFuZGxlLCAmYnVmTWFwTGlzdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmMgPSBtX01lbU9wc1RibC5idW5kbGVkX21hcF9vcHMoJmJ1Zk1hcExpc3QsIG1fTWVtT3BzVGJsLnVzZXJkYXRhKTsKKyAgICB9CisKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBtYXAgYnVmZmVyIik7CisgICAgICAgIHJjID0gQkFEX0lOREVYOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYmFja2dyb3VuZEFsbG9jYXRlCisgKgorICogREVTQ1JJUFRJT046IHNjaGVkdWxlIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkIGluIHRoZSBiYWNrZ3JvdW5kCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpiYWNrZ3JvdW5kQWxsb2NhdGUodm9pZCAqZGF0YSkgeworICAgIFFDYW1lcmFTdHJlYW0gKnN0cmVhbSA9IChRQ2FtZXJhU3RyZWFtKilkYXRhOworICAgIGludDMyX3QgcmMgPSBzdHJlYW0tPmFsbG9jYXRlQnVmZmVycygpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJFcnJvciBhbGxvY2F0aW5nIGJ1ZmZlcnMgISEhIik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBiYWNrZ3JvdW5kTWFwCisgKgorICogREVTQ1JJUFRJT046IG1hcCBidWZmZXJzIGluIHRoZSBiYWNrZ3JvdW5kCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpiYWNrZ3JvdW5kTWFwKHZvaWQgKmRhdGEpIHsKKyAgICBRQ2FtZXJhU3RyZWFtICpzdHJlYW0gPSAoUUNhbWVyYVN0cmVhbSopZGF0YTsKKyAgICBpbnQzMl90IHJjID0gc3RyZWFtLT5tYXBCdWZmZXJzKCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkVycm9yIG1hcHBpbmcgYnVmZmVycyAhISEiKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGluaXQKKyAqCisgKiBERVNDUklQVElPTjogaW5pdGlhbGl6ZSBzdHJlYW0gb2JqCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdHJlYW1JbmZvQnVmOiBwdHIgdG8gYnVmIHRoYXQgY29udGFpbnMgc3RyZWFtIGluZm8KKyAqICAgQG1pc2NCdWYgICAgICA6IHB0ciB0byBidWYgdGhhdCBjb250YWlucyBtaXNjIGJ1ZnMKKyAqICAgQHN0cmVhbV9jYiAgICA6IHN0cmVhbSBkYXRhIG5vdGlmeSBjYWxsYmFjay4gQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZAorICogICBAdXNlcmRhdGEgICAgIDogdXNlciBkYXRhIHB0cgorICogICBAYkR5bmFsbG9jQnVmIDogZmxhZyB0byBpbmRpY2F0ZSBpZiBidWZmZXIgYWxsb2NhdGlvbiBjYW4gYmUgaW4gMiBzdGVwcworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVN0cmVhbTo6aW5pdChRQ2FtZXJhSGVhcE1lbW9yeSAqc3RyZWFtSW5mb0J1ZiwKKyAgICAgICAgUUNhbWVyYUhlYXBNZW1vcnkgKm1pc2NCdWYsCisgICAgICAgIHVpbnQ4X3QgbWluTnVtQnVmZmVycywKKyAgICAgICAgc3RyZWFtX2NiX3JvdXRpbmUgc3RyZWFtX2NiLAorICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgYm9vbCBiRHluYWxsb2NCdWYpCit7CisgICAgaW50MzJfdCByYyA9IE9LOworCisgICAgLy8gYXNzaWduIGFuZCBtYXAgc3RyZWFtIGluZm8gbWVtb3J5CisgICAgbVN0cmVhbUluZm9CdWYgPSBzdHJlYW1JbmZvQnVmOworICAgIG1TdHJlYW1JbmZvID0gcmVpbnRlcnByZXRfY2FzdDxjYW1fc3RyZWFtX2luZm9fdCAqPihtU3RyZWFtSW5mb0J1Zi0+Z2V0UHRyKDApKTsKKyAgICBtTnVtQnVmcyA9IG1pbk51bUJ1ZmZlcnM7CisgICAgbUR5bkJ1ZkFsbG9jID0gYkR5bmFsbG9jQnVmOworCisgICAgLy8gQ2FsY3VsYXRlIGJ1ZmZlciBzaXplIGZvciBkZWZmZXJlZCBhbGxvY2F0aW9uCisgICAgaWYgKG1EZWZmZXJlZEFsbG9jYXRpb24pIHsKKyAgICAgICAgcmMgPSBjYWxjT2Zmc2V0KG1TdHJlYW1JbmZvKTsKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGNhbGN1bGF0ZSBzdHJlYW0gb2Zmc2V0Iik7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBtQWxsb2NUYXNrLmJnRnVuY3Rpb24gPSBiYWNrZ3JvdW5kQWxsb2NhdGU7CisgICAgICAgIG1BbGxvY1Rhc2suYmdBcmdzID0gdGhpczsKKyAgICAgICAgbUFsbG9jVGFza0lkID0gbUFsbG9jYXRvci5zY2hlZHVsZUJhY2tncm91bmRUYXNrKCZtQWxsb2NUYXNrKTsKKyAgICAgICAgaWYgKG1BbGxvY1Rhc2tJZCA9PSAwKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2NoZWR1bGUgYnVmZmVyIGFsbG9jdGlvbiIpOworICAgICAgICAgICAgcmMgPSAtRU5PTUVNOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgfQorCisgICAgbUhhbmRsZSA9IG1DYW1PcHMtPmFkZF9zdHJlYW0obUNhbUhhbmRsZSwgbUNoYW5uZWxIYW5kbGUpOworICAgIGlmICghbUhhbmRsZSkgeworICAgICAgICBMT0dFKCJhZGRfc3RyZWFtIGZhaWxlZCIpOworICAgICAgICByYyA9IFVOS05PV05fRVJST1I7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICByYyA9IG1hcEJ1ZnMobVN0cmVhbUluZm9CdWYsIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9JTkZPLCBOVUxMKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBtYXAgc3RyZWFtIGluZm8gYnVmZmVyIik7CisgICAgICAgIGdvdG8gZXJyMTsKKyAgICB9CisKKyAgICBtTWlzY0J1ZiA9IG1pc2NCdWY7CisgICAgaWYgKG1pc2NCdWYpIHsKKyAgICAgICAgcmMgPSBtYXBCdWZzKG1NaXNjQnVmLCBDQU1fTUFQUElOR19CVUZfVFlQRV9NSVNDX0JVRiwgTlVMTCk7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBtYXAgbWlzY2VsbGFuZW91cyBidWZmZXIiKTsKKyAgICAgICAgICAgIHJlbGVhc2VNaXNjQnVmKCk7CisgICAgICAgICAgICBnb3RvIGVycjE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByYyA9IGNvbmZpZ1N0cmVhbSgpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGNvbmZpZyBzdHJlYW0gIik7CisgICAgICAgIGdvdG8gZXJyMTsKKyAgICB9CisKKyAgICBpZiAobURlZmZlcmVkQWxsb2NhdGlvbikgeworICAgICAgICBtTWFwVGFzay5iZ0Z1bmN0aW9uID0gYmFja2dyb3VuZE1hcDsKKyAgICAgICAgbU1hcFRhc2suYmdBcmdzID0gdGhpczsKKyAgICAgICAgbU1hcFRhc2tJZCA9IG1BbGxvY2F0b3Iuc2NoZWR1bGVCYWNrZ3JvdW5kVGFzaygmbU1hcFRhc2spOworICAgICAgICBpZiAobU1hcFRhc2tJZCA9PSAwKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2NoZWR1bGUgYnVmZmVyIGFsbG9jdGlvbiIpOworICAgICAgICAgICAgcmMgPSAtRU5PTUVNOworICAgICAgICAgICAgZ290byBlcnIxOworICAgICAgICB9CisgICAgfQorCisgICAgbURhdGFDQiA9IHN0cmVhbV9jYjsKKyAgICBtVXNlckRhdGEgPSB1c2VyZGF0YTsKKyAgICByZXR1cm4gMDsKKworZXJyMToKKyAgICBtQ2FtT3BzLT5kZWxldGVfc3RyZWFtKG1DYW1IYW5kbGUsIG1DaGFubmVsSGFuZGxlLCBtSGFuZGxlKTsKKyAgICBtSGFuZGxlID0gMDsKK2RvbmU6CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhbGNPZmZzZXQKKyAqCisgKiBERVNDUklQVElPTjogY2FsY3VsYXRlIGZyYW1lIG9mZnNldCBiYXNlZCBvbiBmb3JtYXQgYW5kIHBhZGRpbmcgaW5mb3JtYXRpb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN0cmVhbUluZm8gIDogc3RyZWFtIGluZm9ybWF0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OmNhbGNPZmZzZXQoY2FtX3N0cmVhbV9pbmZvX3QgKnN0cmVhbUluZm8pCit7CisgICAgaW50MzJfdCByYyA9IDA7CisKKyAgICBjYW1fZGltZW5zaW9uX3QgZGltID0gc3RyZWFtSW5mby0+ZGltOworICAgIGlmIChzdHJlYW1JbmZvLT5wcF9jb25maWcuZmVhdHVyZV9tYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9ST1RBVElPTiAmJgorICAgICAgICAgICAgc3RyZWFtSW5mby0+c3RyZWFtX3R5cGUgIT0gQ0FNX1NUUkVBTV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGlmIChzdHJlYW1JbmZvLT5wcF9jb25maWcucm90YXRpb24gPT0gUk9UQVRFXzkwIHx8CisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby0+cHBfY29uZmlnLnJvdGF0aW9uID09IFJPVEFURV8yNzApIHsKKyAgICAgICAgICAgIC8vIHJvdGF0ZWQgYnkgOTAgb3IgMjcwLCBuZWVkIHRvIHN3aXRjaCB3aWR0aCBhbmQgaGVpZ2h0CisgICAgICAgICAgICBkaW0ud2lkdGggPSBzdHJlYW1JbmZvLT5kaW0uaGVpZ2h0OworICAgICAgICAgICAgZGltLmhlaWdodCA9IHN0cmVhbUluZm8tPmRpbS53aWR0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoc3RyZWFtSW5mby0+c3RyZWFtX3R5cGUpIHsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXOgorICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX0NBTExCQUNLOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9jYWxjX29mZnNldF9wcmV2aWV3KHN0cmVhbUluZm8sCisgICAgICAgICAgICAgICAgJmRpbSwKKyAgICAgICAgICAgICAgICAmbVBhZGRpbmdJbmZvLAorICAgICAgICAgICAgICAgICZzdHJlYW1JbmZvLT5idWZfcGxhbmVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVc6CisgICAgICAgIHJjID0gbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3Bvc3RfdmlldyhzdHJlYW1JbmZvLT5mbXQsCisgICAgICAgICAgICAgICAgJmRpbSwKKyAgICAgICAgICAgICAgICAmc3RyZWFtSW5mby0+YnVmX3BsYW5lcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9jYWxjX29mZnNldF9zbmFwc2hvdChzdHJlYW1JbmZvLT5mbXQsCisgICAgICAgICAgICAgICAgJmRpbSwKKyAgICAgICAgICAgICAgICAmbVBhZGRpbmdJbmZvLAorICAgICAgICAgICAgICAgICZzdHJlYW1JbmZvLT5idWZfcGxhbmVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9jYWxjX29mZnNldF9wb3N0cHJvYyhzdHJlYW1JbmZvLAorICAgICAgICAgICAgICAgICZtUGFkZGluZ0luZm8sCisgICAgICAgICAgICAgICAgJnN0cmVhbUluZm8tPmJ1Zl9wbGFuZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9WSURFTzoKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fY2FsY19vZmZzZXRfdmlkZW8oc3RyZWFtSW5mby0+Zm10LAorICAgICAgICAgICAgICAgICZkaW0sICZzdHJlYW1JbmZvLT5idWZfcGxhbmVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUkFXOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9jYWxjX29mZnNldF9yYXcoc3RyZWFtSW5mby0+Zm10LAorICAgICAgICAgICAgICAgICZkaW0sCisgICAgICAgICAgICAgICAgJm1QYWRkaW5nSW5mbywKKyAgICAgICAgICAgICAgICAmc3RyZWFtSW5mby0+YnVmX3BsYW5lcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9jYWxjX29mZnNldF9hbmFseXNpcyhzdHJlYW1JbmZvLT5mbXQsCisgICAgICAgICAgICAgICAgJmRpbSwKKyAgICAgICAgICAgICAgICAmbVBhZGRpbmdJbmZvLAorICAgICAgICAgICAgICAgICZzdHJlYW1JbmZvLT5idWZfcGxhbmVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEE6CisgICAgICAgIHJjID0gbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X21ldGFkYXRhKCZkaW0sCisgICAgICAgICAgICAgICAgJm1QYWRkaW5nSW5mbywKKyAgICAgICAgICAgICAgICAmc3RyZWFtSW5mby0+YnVmX3BsYW5lcyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoIm5vdCBzdXBwb3J0ZWQgZm9yIHN0cmVhbSB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICAgc3RyZWFtSW5mby0+c3RyZWFtX3R5cGUpOworICAgICAgICByYyA9IC0xOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0YXJ0CisgKgorICogREVTQ1JJUFRJT046IHN0YXJ0IHN0cmVhbS4gV2lsbCBzdGFydCBtYWluIHN0cmVhbSB0aHJlYWQgdG8gaGFuZGxlIHN0cmVhbQorICogICAgICAgICAgICAgIHJlbGF0ZWQgb3BzLgorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpzdGFydCgpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgbURhdGFRLmluaXQoKTsKKyAgICByYyA9IG1Qcm9jVGgubGF1bmNoKGRhdGFQcm9jUm91dGluZSwgdGhpcyk7CisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1fYkFjdGl2ZSA9IHRydWU7CisgICAgfQorCisgICAgbUN1ck1ldGFNZW1vcnkgPSBOVUxMOworICAgIG1DdXJCdWZJbmRleCA9IC0xOworICAgIG1DdXJNZXRhSW5kZXggPSAtMTsKKyAgICBtRmlyc3RUaW1lU3RhbXAgPSAwOworICAgIG1lbXNldCAoJm1TdHJlYW1NZXRhTWVtb3J5LCAwLAorICAgICAgICAgICAgKHNpemVvZihNZXRhTWVtb3J5KSAqIENBTUVSQV9NSU5fVklERU9fQkFUQ0hfQlVGRkVSUykpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdG9wCisgKgorICogREVTQ1JJUFRJT046IHN0b3Agc3RyZWFtLiBXaWxsIHN0b3AgbWFpbiBzdHJlYW0gdGhyZWFkCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OnN0b3AoKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIG1fYkFjdGl2ZSA9IGZhbHNlOworICAgIG1BbGxvY2F0b3Iud2FpdEZvckJhY2tncm91bmRUYXNrKG1BbGxvY1Rhc2tJZCk7CisgICAgbUFsbG9jYXRvci53YWl0Rm9yQmFja2dyb3VuZFRhc2sobU1hcFRhc2tJZCk7CisgICAgcmMgPSBtUHJvY1RoLmV4aXQoKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3luY1J1bnRpbWVQYXJhbXMKKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgYW5kIHN5bmMgcnVudGltZSBwYXJhbWV0ZXJzIGxpa2Ugb3V0cHV0IGNyb3AKKyAqICAgICAgICAgICAgICBidWZmZXIgaW5mbyBldGMuCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OnN5bmNSdW50aW1lUGFyYW1zKCkKK3sKKyAgICBpbnQzMl90IHJldCA9IE5PX0VSUk9SOworCisgICAgbWVtc2V0KCZtX091dHB1dENyb3AsIDAsIHNpemVvZihjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QpKTsKKyAgICBtX091dHB1dENyb3AudHlwZSA9IENBTV9TVFJFQU1fUEFSQU1fVFlQRV9HRVRfT1VUUFVUX0NST1A7CisKKyAgICByZXQgPSBnZXRQYXJhbWV0ZXIobV9PdXRwdXRDcm9wKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoInN0cmVhbSBnZXRQYXJhbWV0ZXIgZm9yIG91dHB1dCBjcm9wIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG1lbXNldCgmbV9JbWdQcm9wLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90KSk7CisgICAgbV9JbWdQcm9wLnR5cGUgPSBDQU1fU1RSRUFNX1BBUkFNX1RZUEVfR0VUX0lNR19QUk9QOworCisgICAgcmV0ID0gZ2V0UGFyYW1ldGVyKG1fSW1nUHJvcCk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJzdHJlYW0gZ2V0UGFyYW1ldGVyIGZvciBpbWFnZSBwcm9wIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJvY2Vzc1pvb21Eb25lCisgKgorICogREVTQ1JJUFRJT046IHByb2Nlc3Mgem9vbSBkb25lIGV2ZW50CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwcmV2aWV3V2luZG9lIDogcHJldmlldyB3aW5kb3cgb3BzIHRhYmxlIHRvIHNldCBwcmV2aWV3IGNyb3Agd2luZG93CisgKiAgIEBjcm9wX2luZm8gICAgIDogY3JvcCBpbmZvCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpwcm9jZXNzWm9vbURvbmUocHJldmlld19zdHJlYW1fb3BzX3QgKnByZXZpZXdXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fY3JvcF9kYXRhX3QgJmNyb3BfaW5mbykKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKworICAgIGlmICghbV9iQWN0aXZlKSB7CisgICAgICAgIExPR0woIlN0cmVhbSBub3QgYWN0aXZlIik7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICAvLyBnZXQgc3RyZWFtIHBhcmFtIGZvciBjcm9wIGluZm8KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNyb3BfaW5mby5udW1fb2Zfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChjcm9wX2luZm8uY3JvcF9pbmZvW2ldLnN0cmVhbV9pZCA9PSBtU3RyZWFtSW5mby0+c3RyZWFtX3N2cl9pZCkgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtQ3JvcExvY2spOworICAgICAgICAgICAgbUNyb3BJbmZvID0gY3JvcF9pbmZvLmNyb3BfaW5mb1tpXS5jcm9wOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1Dcm9wTG9jayk7CisKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBwcmV2aWV3IHdpbmRvdyBjcm9wIGlmIGl0J3MgcHJldmlldy9wb3N0dmlldyBzdHJlYW0KKyAgICAgICAgICAgIGlmICggKHByZXZpZXdXaW5kb3cgIT0gTlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgKG1TdHJlYW1JbmZvLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVyB8fAorICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPnN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVykgKSB7CisgICAgICAgICAgICAgICAgcmMgPSBwcmV2aWV3V2luZG93LT5zZXRfY3JvcChwcmV2aWV3V2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNyb3BJbmZvLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3JvcEluZm8udG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNyb3BJbmZvLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNyb3BJbmZvLmhlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJvY2Vzc0RhdGFOb3RpZnkKKyAqCisgKiBERVNDUklQVElPTjogcHJvY2VzcyBzdHJlYW0gZGF0YSBub3RpZnkKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZyYW1lICAgOiBzdHJlYW0gZnJhbWUgcmVjZWl2ZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OnByb2Nlc3NEYXRhTm90aWZ5KG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUpCit7CisgICAgTE9HRCgiXG4iKTsKKworICAgIGlmIChtRGF0YVEuZW5xdWV1ZSgodm9pZCAqKWZyYW1lKSkgeworICAgICAgICByZXR1cm4gbVByb2NUaC5zZW5kQ21kKENBTUVSQV9DTURfVFlQRV9ET19ORVhUX0pPQiwgRkFMU0UsIEZBTFNFKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW1fYkFjdGl2ZSkgeworICAgICAgICAgICAgTE9HVygiU3RyZWFtIHRocmVhZCBpcyBub3QgYWN0aXZlLCBubyBvcHMgaGVyZSAlZCIsIGdldE15VHlwZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZkRvbmUoZnJhbWUtPmJ1ZnNbMF0tPmJ1Zl9pZHgpOworICAgICAgICB9CisgICAgICAgIGZyZWUoZnJhbWUpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGRhdGFOb3RpZnlTWU5DQ0IKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiByZWdpc3RlcmVkIHdpdGggaW50ZXJmYWNlIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgICBTWU5DIGNhbGxiYWNrIGlmIFNZTkMgY2FsbGJhY2sgcmVnaXN0ZXJlZC4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHJlY3ZkX2ZyYW1lICAgOiBzdHJlYW0gZnJhbWUgcmVjZWl2ZWQKKyAqICAgQHVzZXJkYXRhICAgICAgOiB1c2VyIGRhdGEgcHRyCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhU3RyZWFtOjpkYXRhTm90aWZ5U1lOQ0NCKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVjdmRfZnJhbWUsCisgICAgICAgIHZvaWQgKnVzZXJkYXRhKQoreworICAgIExPR0QoIlxuIik7CisgICAgUUNhbWVyYVN0cmVhbSogc3RyZWFtID0gKFFDYW1lcmFTdHJlYW0gKil1c2VyZGF0YTsKKyAgICBpZiAoc3RyZWFtID09IE5VTEwgfHwKKyAgICAgICAgcmVjdmRfZnJhbWUgPT0gTlVMTCB8fAorICAgICAgICByZWN2ZF9mcmFtZS0+YnVmc1swXSA9PSBOVUxMIHx8CisgICAgICAgIHJlY3ZkX2ZyYW1lLT5idWZzWzBdLT5zdHJlYW1faWQgIT0gc3RyZWFtLT5nZXRNeUhhbmRsZSgpKSB7CisgICAgICAgIExPR0UoIk5vdCBhIHZhbGlkIHN0cmVhbSB0byBoYW5kbGUgYnVmIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKChzdHJlYW0tPm1TeW5jQ0JFbmFibGVkKSAmJiAoc3RyZWFtLT5tU1lOQ0RhdGFDQiAhPSBOVUxMKSkKKyAgICAgICAgc3RyZWFtLT5tU1lOQ0RhdGFDQihyZWN2ZF9mcmFtZSwgc3RyZWFtLCBzdHJlYW0tPm1Vc2VyRGF0YSk7CisgICAgcmV0dXJuOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGF0YU5vdGlmeUNCCisgKgorICogREVTQ1JJUFRJT046IGNhbGxiYWNrIGZvciBkYXRhIG5vdGlmeS4gVGhpcyBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHdpdGgKKyAqICAgICAgICAgICAgICBtbS1jYW1lcmEtaW50ZXJmYWNlIHRvIGhhbmRsZSBkYXRhIG5vdGlmeQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVjdmRfZnJhbWUgICA6IHN0cmVhbSBmcmFtZSByZWNlaXZlZAorICogICB1c2VyZGF0YSAgICAgICA6IHVzZXIgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFTdHJlYW06OmRhdGFOb3RpZnlDQihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnJlY3ZkX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgTE9HRCgiXG4iKTsKKyAgICBRQ2FtZXJhU3RyZWFtKiBzdHJlYW0gPSAoUUNhbWVyYVN0cmVhbSAqKXVzZXJkYXRhOworICAgIGlmIChzdHJlYW0gPT0gTlVMTCB8fAorICAgICAgICByZWN2ZF9mcmFtZSA9PSBOVUxMIHx8CisgICAgICAgIHJlY3ZkX2ZyYW1lLT5idWZzWzBdID09IE5VTEwgfHwKKyAgICAgICAgcmVjdmRfZnJhbWUtPmJ1ZnNbMF0tPnN0cmVhbV9pZCAhPSBzdHJlYW0tPmdldE15SGFuZGxlKCkpIHsKKyAgICAgICAgTE9HRSgiTm90IGEgdmFsaWQgc3RyZWFtIHRvIGhhbmRsZSBidWYiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUgPQorICAgICAgICAobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICopbWFsbG9jKHNpemVvZihtbV9jYW1lcmFfc3VwZXJfYnVmX3QpKTsKKyAgICBpZiAoZnJhbWUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJObyBtZW0gZm9yIG1tX2NhbWVyYV9idWZfZGVmX3QiKTsKKyAgICAgICAgc3RyZWFtLT5idWZEb25lKHJlY3ZkX2ZyYW1lLT5idWZzWzBdLT5idWZfaWR4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAqZnJhbWUgPSAqcmVjdmRfZnJhbWU7CisgICAgc3RyZWFtLT5wcm9jZXNzRGF0YU5vdGlmeShmcmFtZSk7CisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGRhdGFQcm9jUm91dGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byBwcm9jZXNzIGRhdGEgaW4gdGhlIG1haW4gc3RyZWFtIHRocmVhZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGF0YSAgICA6IHVzZXIgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkICpRQ2FtZXJhU3RyZWFtOjpkYXRhUHJvY1JvdXRpbmUodm9pZCAqZGF0YSkKK3sKKyAgICBpbnQgcnVubmluZyA9IDE7CisgICAgaW50IHJldDsKKyAgICBRQ2FtZXJhU3RyZWFtICpwbWUgPSAoUUNhbWVyYVN0cmVhbSAqKWRhdGE7CisgICAgUUNhbWVyYUNtZFRocmVhZCAqY21kVGhyZWFkID0gJnBtZS0+bVByb2NUaDsKKyAgICBjbWRUaHJlYWQtPnNldE5hbWUoIkNBTV9zdHJtRGF0UHJvYyIpOworCisgICAgTE9HRCgiRSIpOworICAgIGRvIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcmV0ID0gY2FtX3NlbV93YWl0KCZjbWRUaHJlYWQtPmNtZF9zZW0pOworICAgICAgICAgICAgaWYgKHJldCAhPSAwICYmIGVycm5vICE9IEVJTlZBTCkgeworICAgICAgICAgICAgICAgIExPR0UoImNhbV9zZW1fd2FpdCBlcnJvciAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAocmV0ICE9IDApOworCisgICAgICAgIC8vIHdlIGdvdCBub3RpZmllZCBhYm91dCBuZXcgY21kIGF2YWlsIGluIGNtZCBxdWV1ZQorICAgICAgICBjYW1lcmFfY21kX3R5cGVfdCBjbWQgPSBjbWRUaHJlYWQtPmdldENtZCgpOworICAgICAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgICBjYXNlIENBTUVSQV9DTURfVFlQRV9ET19ORVhUX0pPQjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMT0dIKCJEbyBuZXh0IGpvYiIpOworICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUgPQorICAgICAgICAgICAgICAgICAgICAobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICopcG1lLT5tRGF0YVEuZGVxdWV1ZSgpOworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwbWUtPm1EYXRhQ0IgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tRGF0YUNCKGZyYW1lLCBwbWUsIHBtZS0+bVVzZXJEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGRhdGEgY2Igcm91dGluZSwgcmV0dXJuIGJ1ZiBoZXJlCisgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPmJ1ZkRvbmUoZnJhbWUtPmJ1ZnNbMF0tPmJ1Zl9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmcmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1RZUEVfRVhJVDoKKyAgICAgICAgICAgIExPR0goIkV4aXQiKTsKKyAgICAgICAgICAgIC8qIGZsdXNoIGRhdGEgYnVmIHF1ZXVlICovCisgICAgICAgICAgICBwbWUtPm1EYXRhUS5mbHVzaCgpOworICAgICAgICAgICAgcnVubmluZyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAocnVubmluZyk7CisgICAgTE9HSCgiWCIpOworICAgIHJldHVybiBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGJ1ZkRvbmUKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIHN0cmVhbSBidWZmZXIgdG8ga2VybmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgYnVmZmVyIHRvIGJlIHJldHVybmVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpidWZEb25lKHVpbnQzMl90IGluZGV4KQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIGlmIChpbmRleCA+PSBtTnVtQnVmcyB8fCBtQnVmRGVmcyA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQkFEX0lOREVYOworCisgICAgcmMgPSBtQ2FtT3BzLT5xYnVmKG1DYW1IYW5kbGUsIG1DaGFubmVsSGFuZGxlLCAmbUJ1ZkRlZnNbaW5kZXhdKTsKKworICAgIGlmIChyYyA8IDApCisgICAgICAgIHJldHVybiByYzsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBidWZEb25lCisgKgorICogREVTQ1JJUFRJT046IHJldHVybiBzdHJlYW0gYnVmZmVyIHRvIGtlcm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb3BhcXVlICAgIDogc3RyZWFtIGZyYW1lL21ldGFkYXRhIGJ1ZiB0byBiZSByZXR1cm5lZAorICogICBAaXNNZXRhRGF0YTogZmxhZyBpZiByZXR1cm5lZCBvcGFxdWUgaXMgYSBtZXRhZGF0YWJ1ZiBvciB0aGUgcmVhbCBmcmFtZSBwdHIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OmJ1ZkRvbmUoY29uc3Qgdm9pZCAqb3BhcXVlLCBib29sIGlzTWV0YURhdGEpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGludCBpbmRleCA9IC0xOworICAgIFFDYW1lcmFWaWRlb01lbW9yeSAqbVZpZGVvTWVtID0gTlVMTDsKKworICAgIGlmICgobVN0cmVhbUluZm8gIT0gTlVMTCkKKyAgICAgICAgICAgICYmIChtU3RyZWFtSW5mby0+c3RyZWFtaW5nX21vZGUgPT0gQ0FNX1NUUkVBTUlOR19NT0RFX0JBVENIKQorICAgICAgICAgICAgJiYgKG1TdHJlYW1CYXRjaEJ1ZnMgIT0gTlVMTCkpIHsKKyAgICAgICAgaW5kZXggPSBtU3RyZWFtQmF0Y2hCdWZzLT5nZXRNYXRjaEJ1ZkluZGV4KG9wYXF1ZSwgaXNNZXRhRGF0YSk7CisgICAgICAgIG1WaWRlb01lbSA9IChRQ2FtZXJhVmlkZW9NZW1vcnkgKiltU3RyZWFtQmF0Y2hCdWZzOworICAgIH0gZWxzZSBpZiAobVN0cmVhbUJ1ZnMgIT0gTlVMTCl7CisgICAgICAgIGluZGV4ID0gbVN0cmVhbUJ1ZnMtPmdldE1hdGNoQnVmSW5kZXgob3BhcXVlLCBpc01ldGFEYXRhKTsKKyAgICAgICAgbVZpZGVvTWVtID0gKFFDYW1lcmFWaWRlb01lbW9yeSAqKW1TdHJlYW1CdWZzOworICAgIH0KKworICAgIC8vQ2xvc2UgYW5kIGRlbGV0ZSBkdXBsaWNhdGVkIG5hdGl2ZSBoYW5kbGUgYW5kIEZEJ3MuCisgICAgaWYgKG1WaWRlb01lbSAhPSBOVUxMKSB7CisgICAgICAgIHJjID0gbVZpZGVvTWVtLT5jbG9zZU5hdGl2ZUhhbmRsZShvcGFxdWUsIGlzTWV0YURhdGEpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgdmlkZW8gbWV0YWRhdGEiKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIlBvc3NpYmxlIEZEIGxlYWsuIFJlbGVhc2UgcmVjb3JkaW5nIGNhbGxlZCBhZnRlciBzdG9wIik7CisgICAgfQorCisgICAgaWYgKGluZGV4ID09IC0xIHx8IGluZGV4ID49IG1OdW1CdWZzIHx8IG1CdWZEZWZzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2Fubm90IGZpbmQgYnVmIGZvciBvcGFxdWUgZGF0YSA9ICVwIiwgb3BhcXVlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBpZiAoKENBTUVSQV9NSU5fVklERU9fQkFUQ0hfQlVGRkVSUyA+IGluZGV4KQorICAgICAgICAgICAgJiYgbVN0cmVhbU1ldGFNZW1vcnlbaW5kZXhdLm51bUJ1ZmZlcnMgPiAwKSB7CisgICAgICAgIGZvciAoaW50IGk9IDA7IGkgPCBtU3RyZWFtTWV0YU1lbW9yeVtpbmRleF0ubnVtQnVmZmVyczsgaSsrKSB7CisgICAgICAgICAgICB1aW50OF90IGJ1Zl9pZHggPSBtU3RyZWFtTWV0YU1lbW9yeVtpbmRleF0uYnVmX2luZGV4W2ldOworICAgICAgICAgICAgYnVmRG9uZSgodWludDMyX3QpYnVmX2lkeCk7CisgICAgICAgIH0KKyAgICAgICAgbVN0cmVhbU1ldGFNZW1vcnlbaW5kZXhdLmNvbnN1bWVyT3duZWQgPSBGQUxTRTsKKyAgICAgICAgbVN0cmVhbU1ldGFNZW1vcnlbaW5kZXhdLm51bUJ1ZmZlcnMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0goIkJ1ZmZlciBJbmRleCA9ICVkLCBGcmFtZSBJZHggPSAlZCIsIGluZGV4LAorICAgICAgICAgICAgICAgIG1CdWZEZWZzW2luZGV4XS5mcmFtZV9pZHgpOworICAgICAgICByYyA9IGJ1ZkRvbmUoKHVpbnQzMl90KWluZGV4KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TnVtUXVldWVkQnVmCisgKgorICogREVTQ1JJUFRJT046IHJldHVybiBxdWV1ZWQgYnVmZmVyIGNvdW50CisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogcXVldWVkIGJ1ZmZlciBjb3VudAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OmdldE51bVF1ZXVlZEJ1ZigpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIGlmIChtSGFuZGxlID4gMCkgeworICAgICAgICByYyA9IG1DYW1PcHMtPmdldF9xdWV1ZWRfYnVmX2NvdW50KG1DYW1IYW5kbGUsIG1DaGFubmVsSGFuZGxlLCBtSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKHJjID09IC0xKSB7CisgICAgICAgIExPR0UoInN0cmVhbSBpcyBub3QgaW4gYWN0aXZlIHN0YXRlLiBJbnZhbGlkIG9wZXJhdGlvbiIpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0QnVmcworICoKKyAqIERFU0NSSVBUSU9OOiBhbGxvY2F0ZSBzdHJlYW0gYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb2Zmc2V0ICAgICA6IG9mZnNldCBpbmZvIG9mIHN0cmVhbSBidWZmZXJzCisgKiAgIEBudW1fYnVmcyAgIDogbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkCisgKiAgIEBpbml0aWFsX3JlZ19mbGFnOiBmbGFnIHRvIGluZGljYXRlIGlmIGJ1ZmZlciBuZWVkcyB0byBiZSByZWdpc3RlcmVkCisgKiAgICAgICAgICAgICAgICAgICAgICBhdCBrZXJuZWwgaW5pdGlhbGx5CisgKiAgIEBidWZzICAgICAgIDogb3V0cHV0IG9mIGFsbG9jYXRlZCBidWZmZXJzCisgKiAgIEBvcHNfdGJsICAgIDogcHRyIHRvIGJ1ZiBtYXBwaW5nL3VubWFwcGluZyBvcHMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OmdldEJ1ZnMoY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCAqb2Zmc2V0LAorICAgICAgICB1aW50OF90ICpudW1fYnVmcywKKyAgICAgICAgdWludDhfdCAqKmluaXRpYWxfcmVnX2ZsYWcsCisgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKipidWZzLAorICAgICAgICBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICB1aW50OF90ICpyZWdGbGFnczsKKworICAgIGlmICghb3BzX3RibCkgeworICAgICAgICBMT0dFKCJvcHNfdGJsIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1GcmFtZUxlbk9mZnNldCA9ICpvZmZzZXQ7CisKKyAgICB1aW50OF90IG51bUJ1ZkFsbG9jID0gbU51bUJ1ZnM7CisgICAgbU51bUJ1ZnNOZWVkQWxsb2MgPSAwOworICAgIGlmIChtRHluQnVmQWxsb2MpIHsKKyAgICAgICAgbnVtQnVmQWxsb2MgPSBDQU1FUkFfTUlOX0FMTE9DQVRFRF9CVUZGRVJTOworICAgICAgICBpZiAobnVtQnVmQWxsb2MgPiBtTnVtQnVmcykgeworICAgICAgICAgICAgbUR5bkJ1ZkFsbG9jID0gZmFsc2U7CisgICAgICAgICAgICBudW1CdWZBbGxvYyA9IG1OdW1CdWZzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU51bUJ1ZnNOZWVkQWxsb2MgPSAodWludDhfdCkobU51bUJ1ZnMgLSBudW1CdWZBbGxvYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGb3Igc29tZSBzdHJlYW0gdHlwZXMsIGJ1ZmZlciBhbGxvY2F0aW9uIG1heSBoYXZlIGFscmVhZHkgYmVndW4KKyAgICAgKiBwcmVlbXB0aXZlbHkuIElmIHRoaXMgaXMgdGhlIGNhc2UsIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlCisgICAgICogcHJlZW1wdGl2ZSBhbGxvY2F0aW9uIHRvIGNvbXBsZXRlIGJlZm9yZSBwcm9jZWVkaW5nLiAqLworICAgIG1BbGxvY2F0b3Iud2FpdEZvckRlZmVycmVkQWxsb2MobVN0cmVhbUluZm8tPnN0cmVhbV90eXBlKTsKKworICAgIC8vQWxsb2NhdGUgc3RyZWFtIGJ1ZmZlcgorICAgIG1TdHJlYW1CdWZzID0gbUFsbG9jYXRvci5hbGxvY2F0ZVN0cmVhbUJ1ZihtU3RyZWFtSW5mby0+c3RyZWFtX3R5cGUsCisgICAgICAgICAgICBtRnJhbWVMZW5PZmZzZXQuZnJhbWVfbGVuLCBtRnJhbWVMZW5PZmZzZXQubXBbMF0uc3RyaWRlLAorICAgICAgICAgICAgbUZyYW1lTGVuT2Zmc2V0Lm1wWzBdLnNjYW5saW5lLCBudW1CdWZBbGxvYyk7CisgICAgaWYgKCFtU3RyZWFtQnVmcykgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgc3RyZWFtIGJ1ZmZlcnMiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBtTnVtQnVmcyA9ICh1aW50OF90KShudW1CdWZBbGxvYyArIG1OdW1CdWZzTmVlZEFsbG9jKTsKKyAgICB1aW50OF90IG51bUJ1ZnNUb01hcCA9IG1TdHJlYW1CdWZzLT5nZXRNYXBwYWJsZSgpOworCisgICAgUUNhbWVyYUJ1ZmZlck1hcHMgYnVmZmVyTWFwczsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtQnVmc1RvTWFwOyBpKyspIHsKKyAgICAgICAgc3NpemVfdCBidWZTaXplID0gbVN0cmVhbUJ1ZnMtPmdldFNpemUoaSk7CisgICAgICAgIGlmIChCQURfSU5ERVggPT0gYnVmU2l6ZSkgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGJ1ZmZlciBzaXplIChiYWQgaW5kZXgpIik7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworICAgICAgICByYyA9IGJ1ZmZlck1hcHMuZW5xdWV1ZShDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGLAorICAgICAgICAgICAgICAgIDAgLypzdHJlYW0gaWQqLywgaSAvKmJ1ZiBpbmRleCovLCAtMSAvKnBsYW5lIGluZGV4Ki8sCisgICAgICAgICAgICAgICAgMCAvKmNvb2tpZSovLCBtU3RyZWFtQnVmcy0+Z2V0RmQoaSksIGJ1ZlNpemUsCisgICAgICAgICAgICAgICAgbVN0cmVhbUJ1ZnMtPmdldFB0cihpKSk7CisKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIG1hcCBidWZmZXJzIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgICAgICB9CisgICAgfQorCisgICAgY2FtX2J1Zl9tYXBfdHlwZV9saXN0IGJ1Zk1hcExpc3Q7CisgICAgcmMgPSBidWZmZXJNYXBzLmdldENhbUJ1Zk1hcExpc3QoYnVmTWFwTGlzdCk7CisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIHJjID0gb3BzX3RibC0+YnVuZGxlZF9tYXBfb3BzKCZidWZNYXBMaXN0LCBvcHNfdGJsLT51c2VyZGF0YSk7CisgICAgfQorICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgibWFwX3N0cmVhbV9idWYgZmFpbGVkOiAlZCIsIHJjKTsKKyAgICAgICAgbVN0cmVhbUJ1ZnMtPmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVsZXRlIG1TdHJlYW1CdWZzOworICAgICAgICBtU3RyZWFtQnVmcyA9IE5VTEw7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAvL3JlZ0ZsYWdzIGFycmF5IGlzIGFsbG9jYXRlZCBieSB1cywgYnV0IGNvbnN1bWVkIGFuZCBmcmVlZCBieSBtbS1jYW1lcmEtaW50ZXJmYWNlCisgICAgcmVnRmxhZ3MgPSAodWludDhfdCAqKW1hbGxvYyhzaXplb2YodWludDhfdCkgKiBtTnVtQnVmcyk7CisgICAgaWYgKCFyZWdGbGFncykgeworICAgICAgICBMT0dFKCJPdXQgb2YgbWVtb3J5Iik7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1CdWZzVG9NYXA7IGkrKykgeworICAgICAgICAgICAgb3BzX3RibC0+dW5tYXBfb3BzKGksIC0xLCBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGLCBvcHNfdGJsLT51c2VyZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgbVN0cmVhbUJ1ZnMtPmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVsZXRlIG1TdHJlYW1CdWZzOworICAgICAgICBtU3RyZWFtQnVmcyA9IE5VTEw7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChyZWdGbGFncywgMCwgc2l6ZW9mKHVpbnQ4X3QpICogbU51bUJ1ZnMpOworCisgICAgbUJ1ZkRlZnMgPSAobW1fY2FtZXJhX2J1Zl9kZWZfdCAqKW1hbGxvYyhtTnVtQnVmcyAqIHNpemVvZihtbV9jYW1lcmFfYnVmX2RlZl90KSk7CisgICAgaWYgKG1CdWZEZWZzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiZ2V0UmVnRmxhZ3MgZmFpbGVkICVkIiwgcmMpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtQnVmc1RvTWFwOyBpKyspIHsKKyAgICAgICAgICAgIG9wc190YmwtPnVubWFwX29wcyhpLCAtMSwgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiwgb3BzX3RibC0+dXNlcmRhdGEpOworICAgICAgICB9CisgICAgICAgIG1TdHJlYW1CdWZzLT5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbGV0ZSBtU3RyZWFtQnVmczsKKyAgICAgICAgbVN0cmVhbUJ1ZnMgPSBOVUxMOworICAgICAgICBmcmVlKHJlZ0ZsYWdzKTsKKyAgICAgICAgcmVnRmxhZ3MgPSBOVUxMOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1lbXNldChtQnVmRGVmcywgMCwgbU51bUJ1ZnMgKiBzaXplb2YobW1fY2FtZXJhX2J1Zl9kZWZfdCkpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1CdWZzVG9NYXA7IGkrKykgeworICAgICAgICBtU3RyZWFtQnVmcy0+Z2V0QnVmRGVmKG1GcmFtZUxlbk9mZnNldCwgbUJ1ZkRlZnNbaV0sIGkpOworICAgIH0KKworICAgIHJjID0gbVN0cmVhbUJ1ZnMtPmdldFJlZ0ZsYWdzKHJlZ0ZsYWdzKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoImdldFJlZ0ZsYWdzIGZhaWxlZCAlZCIsIHJjKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUJ1ZnNUb01hcDsgaSsrKSB7CisgICAgICAgICAgICBvcHNfdGJsLT51bm1hcF9vcHMoaSwgLTEsIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsIG9wc190YmwtPnVzZXJkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBtU3RyZWFtQnVmcy0+ZGVhbGxvY2F0ZSgpOworICAgICAgICBkZWxldGUgbVN0cmVhbUJ1ZnM7CisgICAgICAgIG1TdHJlYW1CdWZzID0gTlVMTDsKKyAgICAgICAgZnJlZShtQnVmRGVmcyk7CisgICAgICAgIG1CdWZEZWZzID0gTlVMTDsKKyAgICAgICAgZnJlZShyZWdGbGFncyk7CisgICAgICAgIHJlZ0ZsYWdzID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgICpudW1fYnVmcyA9IG1OdW1CdWZzOworICAgICppbml0aWFsX3JlZ19mbGFnID0gcmVnRmxhZ3M7CisgICAgKmJ1ZnMgPSBtQnVmRGVmczsKKyAgICBMT0dIKCJzdHJlYW0gdHlwZTogJWQsIG1SZWdGbGFnczogMHgleCwgbnVtQnVmczogJWQiLAorICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5zdHJlYW1fdHlwZSwgcmVnRmxhZ3MsIG1OdW1CdWZzKTsKKworICAgIGlmIChtTnVtQnVmc05lZWRBbGxvYyA+IDApIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOworICAgICAgICB3YWl0X2Zvcl9jb25kID0gVFJVRTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbG9jayk7CisgICAgICAgIExPR0goIlN0aWxsIG5lZWQgdG8gYWxsb2NhdGUgJWQgYnVmZmVycyIsCisgICAgICAgICAgICAgICBtTnVtQnVmc05lZWRBbGxvYyk7CisgICAgICAgIC8vIHN0YXJ0IGFub3RoZXIgdGhyZWFkIHRvIGFsbG9jYXRlIHRoZSByZXN0IG9mIGJ1ZmZlcnMKKyAgICAgICAgcHRocmVhZF9jcmVhdGUoJm1CdWZBbGxvY1BpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgQnVmQWxsb2NSb3V0aW5lLAorICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgcHRocmVhZF9zZXRuYW1lX25wKG1CdWZBbGxvY1BpZCwgIkNBTV9zdHJtQnVmIik7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEJ1ZnNEZWZlcnJlZAorICoKKyAqIERFU0NSSVBUSU9OOiBhbGxvY2F0ZSBkZWZlcnJlZCBzdHJlYW0gYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb2Zmc2V0ICAgICA6IG9mZnNldCBpbmZvIG9mIHN0cmVhbSBidWZmZXJzCisgKiAgIEBudW1fYnVmcyAgIDogbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkCisgKiAgIEBpbml0aWFsX3JlZ19mbGFnOiBmbGFnIHRvIGluZGljYXRlIGlmIGJ1ZmZlciBuZWVkcyB0byBiZSByZWdpc3RlcmVkCisgKiAgICAgICAgICAgICAgICAgICAgICBhdCBrZXJuZWwgaW5pdGlhbGx5CisgKiAgIEBidWZzICAgICAgIDogb3V0cHV0IG9mIGFsbG9jYXRlZCBidWZmZXJzCisgKiAgIEBvcHNfdGJsICAgIDogcHRyIHRvIGJ1ZiBtYXBwaW5nL3VubWFwcGluZyBvcHMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OmdldEJ1ZnNEZWZlcnJlZChfX3VudXNlZCBjYW1fZnJhbWVfbGVuX29mZnNldF90ICpvZmZzZXQsCisgICAgICAgIHVpbnQ4X3QgKm51bV9idWZzLAorICAgICAgICB1aW50OF90ICoqaW5pdGlhbF9yZWdfZmxhZywKKyAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqKmJ1ZnMsCisgICAgICAgIF9fdW51c2VkIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICAvLyB3YWl0IGZvciBhbGxvY2F0aW9uCisgICAgcmMgPSBtQWxsb2NhdG9yLndhaXRGb3JCYWNrZ3JvdW5kVGFzayhtQWxsb2NUYXNrSWQpOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJBbGxvY2F0aW9uIEZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGlmICghbVJlZ0ZsYWdzIHx8ICFtQnVmRGVmcykgeworICAgICAgICBMT0dFKCJyZWcgZmxhZ3Mgb3IgYnVmIGRlZnMgdW5pbml0aWFsaXplZCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgICppbml0aWFsX3JlZ19mbGFnICAgPSBtUmVnRmxhZ3M7CisgICAgKm51bV9idWZzICAgICAgICAgICA9IG1OdW1CdWZzOworICAgICpidWZzICAgICAgICAgICAgICAgPSBtQnVmRGVmczsKKworICAgIExPR0goInN0cmVhbSB0eXBlOiAlZCwgbVJlZ0ZsYWdzOiAweCV4LCBudW1CdWZzOiAlZCIsCisgICAgICAgICAgICAgZ2V0TXlUeXBlKCksIG1SZWdGbGFncywgbU51bUJ1ZnMpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtYXBOZXdCdWZmZXIKKyAqCisgKiBERVNDUklQVElPTjogbWFwIGEgbmV3IHN0cmVhbSBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06Om1hcE5ld0J1ZmZlcih1aW50MzJfdCBpbmRleCkKK3sKKyAgICBMT0dIKCJFIC0gaW5kZXggPSAlZCIsIGluZGV4KTsKKworICAgIGludCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKG1TdHJlYW1CdWZzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBPcGVyYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNzaXplX3QgYnVmU2l6ZSA9IG1TdHJlYW1CdWZzLT5nZXRTaXplKGluZGV4KTsKKyAgICBpZiAoQkFEX0lOREVYID09IGJ1ZlNpemUpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGJ1ZmZlciBzaXplIChiYWQgaW5kZXgpIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBjYW1fYnVmX21hcF90eXBlX2xpc3QgYnVmTWFwTGlzdDsKKyAgICByYyA9IFFDYW1lcmFCdWZmZXJNYXBzOjptYWtlU2luZ2xldG9uQnVmTWFwTGlzdCgKKyAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsIDAgLypzdHJlYW0gaWQqLywgaW5kZXgsCisgICAgICAgICAgICAtMSAvKnBsYW5lIGluZGV4Ki8sIDAgLypjb29raWUqLywgbVN0cmVhbUJ1ZnMtPmdldEZkKGluZGV4KSwKKyAgICAgICAgICAgIGJ1ZlNpemUsIGJ1Zk1hcExpc3QsIG1TdHJlYW1CdWZzLT5nZXRQdHIoaW5kZXgpKTsKKworICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICByYyA9IG1fTWVtT3BzVGJsLmJ1bmRsZWRfbWFwX29wcygmYnVmTWFwTGlzdCwgbV9NZW1PcHNUYmwudXNlcmRhdGEpOworICAgIH0KKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoIm1hcF9zdHJlYW1fYnVmIGZhaWxlZDogJWQiLCByYyk7CisgICAgICAgIHJjID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVN0cmVhbUJ1ZnMtPmdldEJ1ZkRlZihtRnJhbWVMZW5PZmZzZXQsIG1CdWZEZWZzW2luZGV4XSwgaW5kZXgpOworICAgIH0KKworICAgIExPR0goIlggLSByYyA9ICVkIiwgcmMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhbGxvY2F0ZUJ1ZmZlcnMKKyAqCisgKiBERVNDUklQVElPTjogYWxsb2NhdGUgc3RyZWFtIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OmFsbG9jYXRlQnVmZmVycygpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgbUZyYW1lTGVuT2Zmc2V0ID0gbVN0cmVhbUluZm8tPmJ1Zl9wbGFuZXMucGxhbmVfaW5mbzsKKworICAgIGlmIChtU3RyZWFtSW5mby0+c3RyZWFtaW5nX21vZGUgPT0gQ0FNX1NUUkVBTUlOR19NT0RFX0JBVENIKSB7CisgICAgICAgIHJldHVybiBhbGxvY2F0ZUJhdGNoQnVmcygmbUZyYW1lTGVuT2Zmc2V0LAorICAgICAgICAgICAgICAgICZtTnVtQnVmcywgJm1SZWdGbGFncywKKyAgICAgICAgICAgICAgICAmbUJ1ZkRlZnMsIE5VTEwpOworICAgIH0KKworICAgIC8qIFRoaXMgYWxsb2NhdGlvbiBpcyBydW5uaW5nIGluIHRoZSBkZWZlcnJlZCBjb250ZXh0LCBzbyBpdAorICAgICAqIGlzIHNhZmUgKGFuZCBuZWNlc3NhcnkpIHRvIGFzc3VtZSBhbnkgcHJlZW1wdGl2ZSBhbGxvY2F0aW9uCisgICAgICogaXMgYWxyZWFkeSBjb21wbGV0ZS4gVGhlcmVmb3JlLCBubyBuZWVkIHRvIHdhaXQgaGVyZS4gKi8KKworICAgIHVpbnQ4X3QgbnVtQnVmQWxsb2MgPSBtTnVtQnVmczsKKyAgICBtTnVtQnVmc05lZWRBbGxvYyA9IDA7CisgICAgaWYgKG1EeW5CdWZBbGxvYykgeworICAgICAgICBudW1CdWZBbGxvYyA9IENBTUVSQV9NSU5fQUxMT0NBVEVEX0JVRkZFUlM7CisgICAgICAgIGlmIChudW1CdWZBbGxvYyA+IG1OdW1CdWZzKSB7CisgICAgICAgICAgICBtRHluQnVmQWxsb2MgPSBmYWxzZTsKKyAgICAgICAgICAgIG51bUJ1ZkFsbG9jID0gbU51bUJ1ZnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTnVtQnVmc05lZWRBbGxvYyA9ICh1aW50OF90KShtTnVtQnVmcyAtIG51bUJ1ZkFsbG9jKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vQWxsb2NhdGUgYW5kIG1hcCBzdHJlYW0gaW5mbyBidWZmZXIKKyAgICBtU3RyZWFtQnVmcyA9IG1BbGxvY2F0b3IuYWxsb2NhdGVTdHJlYW1CdWYobVN0cmVhbUluZm8tPnN0cmVhbV90eXBlLAorICAgICAgICAgICAgbUZyYW1lTGVuT2Zmc2V0LmZyYW1lX2xlbiwKKyAgICAgICAgICAgIG1GcmFtZUxlbk9mZnNldC5tcFswXS5zdHJpZGUsCisgICAgICAgICAgICBtRnJhbWVMZW5PZmZzZXQubXBbMF0uc2NhbmxpbmUsCisgICAgICAgICAgICBudW1CdWZBbGxvYyk7CisKKyAgICBpZiAoIW1TdHJlYW1CdWZzKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBzdHJlYW0gYnVmZmVycyIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1OdW1CdWZzID0gKHVpbnQ4X3QpKG51bUJ1ZkFsbG9jICsgbU51bUJ1ZnNOZWVkQWxsb2MpOworICAgIHVpbnQ4X3QgbnVtQnVmc1RvTWFwID0gbVN0cmVhbUJ1ZnMtPmdldE1hcHBhYmxlKCk7CisKKyAgICAvL3JlZ0ZsYWdzIGFycmF5IGlzIGFsbG9jYXRlZCBieSB1cywKKyAgICAvLyBidXQgY29uc3VtZWQgYW5kIGZyZWVkIGJ5IG1tLWNhbWVyYS1pbnRlcmZhY2UKKyAgICBtUmVnRmxhZ3MgPSAodWludDhfdCAqKW1hbGxvYyhzaXplb2YodWludDhfdCkgKiBtTnVtQnVmcyk7CisgICAgaWYgKCFtUmVnRmxhZ3MpIHsKKyAgICAgICAgTE9HRSgiT3V0IG9mIG1lbW9yeSIpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtQnVmc1RvTWFwOyBpKyspIHsKKyAgICAgICAgICAgIHVubWFwQnVmKENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsIGksIC0xLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBtU3RyZWFtQnVmcy0+ZGVhbGxvY2F0ZSgpOworICAgICAgICBkZWxldGUgbVN0cmVhbUJ1ZnM7CisgICAgICAgIG1TdHJlYW1CdWZzID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KG1SZWdGbGFncywgMCwgc2l6ZW9mKHVpbnQ4X3QpICogbU51bUJ1ZnMpOworCisgICAgc2l6ZV90IGJ1ZkRlZnNTaXplID0gbU51bUJ1ZnMgKiBzaXplb2YobW1fY2FtZXJhX2J1Zl9kZWZfdCk7CisgICAgbUJ1ZkRlZnMgPSAobW1fY2FtZXJhX2J1Zl9kZWZfdCAqKW1hbGxvYyhidWZEZWZzU2l6ZSk7CisgICAgaWYgKG1CdWZEZWZzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiZ2V0UmVnRmxhZ3MgZmFpbGVkICVkIiwgcmMpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtQnVmc1RvTWFwOyBpKyspIHsKKyAgICAgICAgICAgIHVubWFwQnVmKENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsIGksIC0xLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBtU3RyZWFtQnVmcy0+ZGVhbGxvY2F0ZSgpOworICAgICAgICBkZWxldGUgbVN0cmVhbUJ1ZnM7CisgICAgICAgIG1TdHJlYW1CdWZzID0gTlVMTDsKKyAgICAgICAgZnJlZShtUmVnRmxhZ3MpOworICAgICAgICBtUmVnRmxhZ3MgPSBOVUxMOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1lbXNldChtQnVmRGVmcywgMCwgYnVmRGVmc1NpemUpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1CdWZzVG9NYXA7IGkrKykgeworICAgICAgICBtU3RyZWFtQnVmcy0+Z2V0QnVmRGVmKG1GcmFtZUxlbk9mZnNldCwgbUJ1ZkRlZnNbaV0sIGkpOworICAgIH0KKworICAgIHJjID0gbVN0cmVhbUJ1ZnMtPmdldFJlZ0ZsYWdzKG1SZWdGbGFncyk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJnZXRSZWdGbGFncyBmYWlsZWQgJWQiLCByYyk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1CdWZzVG9NYXA7IGkrKykgeworICAgICAgICAgICAgdW5tYXBCdWYoQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiwgaSwgLTEsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIG1TdHJlYW1CdWZzLT5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbGV0ZSBtU3RyZWFtQnVmczsKKyAgICAgICAgbVN0cmVhbUJ1ZnMgPSBOVUxMOworICAgICAgICBmcmVlKG1CdWZEZWZzKTsKKyAgICAgICAgbUJ1ZkRlZnMgPSBOVUxMOworICAgICAgICBmcmVlKG1SZWdGbGFncyk7CisgICAgICAgIG1SZWdGbGFncyA9IE5VTEw7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobU51bUJ1ZnNOZWVkQWxsb2MgPiAwKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9sb2NrKTsKKyAgICAgICAgd2FpdF9mb3JfY29uZCA9IFRSVUU7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOworICAgICAgICBMT0dIKCJTdGlsbCBuZWVkIHRvIGFsbG9jYXRlICVkIGJ1ZmZlcnMiLAorICAgICAgICAgICAgICAgbU51bUJ1ZnNOZWVkQWxsb2MpOworICAgICAgICAvLyBzdGFydCBhbm90aGVyIHRocmVhZCB0byBhbGxvY2F0ZSB0aGUgcmVzdCBvZiBidWZmZXJzCisgICAgICAgIHB0aHJlYWRfY3JlYXRlKCZtQnVmQWxsb2NQaWQsCisgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIEJ1ZkFsbG9jUm91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7CisgICAgICAgIHB0aHJlYWRfc2V0bmFtZV9ucChtQnVmQWxsb2NQaWQsICJDQU1fc3RybUJ1ZkFsbG9jIik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtYXBCdWZmZXJzCisgKgorICogREVTQ1JJUFRJT046IG1hcCBzdHJlYW0gYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVN0cmVhbTo6bWFwQnVmZmVycygpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIFFDYW1lcmFCdWZmZXJNYXBzIGJ1ZmZlck1hcHM7CisKKyAgICByYyA9IG1BbGxvY2F0b3Iud2FpdEZvckJhY2tncm91bmRUYXNrKG1BbGxvY1Rhc2tJZCk7CisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR0UoIkFsbG9jYXRpb24gRmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgaWYgKG1TdHJlYW1CdWZzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiU3RyZWFtIGJ1ZmZlcnMgbm90IGFsbG9jYXRlZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICB1aW50OF90IG51bUJ1ZnNUb01hcCA9IG1TdHJlYW1CdWZzLT5nZXRNYXBwYWJsZSgpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1CdWZzVG9NYXA7IGkrKykgeworICAgICAgICBzc2l6ZV90IGJ1ZlNpemUgPSBtU3RyZWFtQnVmcy0+Z2V0U2l6ZShpKTsKKyAgICAgICAgaWYgKEJBRF9JTkRFWCAhPSBidWZTaXplKSB7CisgICAgICAgICAgICByYyA9IGJ1ZmZlck1hcHMuZW5xdWV1ZShDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGLCBtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBpIC8qYnVmIGluZGV4Ki8sIC0xIC8qcGxhbmUgaW5kZXgqLywgMCAvKmNvb2tpZSovLAorICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQnVmcy0+Z2V0RmQoaSksIGJ1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1CdWZzLT5nZXRQdHIoaSkpOworCisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIG1hcCBidWZmZXJzIik7CisgICAgICAgICAgICAgICAgcmMgPSBCQURfSU5ERVg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJCYWQgaW5kZXggJXUiLCBpKTsKKyAgICAgICAgICAgIHJjID0gQkFEX0lOREVYOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjYW1fYnVmX21hcF90eXBlX2xpc3QgYnVmTWFwTGlzdDsKKyAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmMgPSBidWZmZXJNYXBzLmdldENhbUJ1Zk1hcExpc3QoYnVmTWFwTGlzdCk7CisgICAgfQorICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICByYyA9IG1hcEJ1ZnMoYnVmTWFwTGlzdCwgTlVMTCk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhbGxvY2F0ZUJhdGNoQnVmcworICoKKyAqIERFU0NSSVBUSU9OOiBhbGxvY2F0ZSBzdHJlYW0gYmF0Y2ggYnVmZmVycyBhbmQgc3RyZWFtIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG9mZnNldCAgICAgOiBvZmZzZXQgaW5mbyBvZiBzdHJlYW0gYnVmZmVycworICogICBAbnVtX2J1ZnMgICA6IG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZAorICogICBAaW5pdGlhbF9yZWdfZmxhZzogZmxhZyB0byBpbmRpY2F0ZSBpZiBidWZmZXIgbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZAorICogICAgICAgICAgICAgICAgICAgICAgYXQga2VybmVsIGluaXRpYWxseQorICogICBAYnVmcyAgICAgICA6IG91dHB1dCBvZiBhbGxvY2F0ZWQgYnVmZmVycworICogICBAcGxhbmVfYnVmcyAgICA6IG91dHB1dCBvZiBhbGxvY2F0ZWQgcGxhbmUgYnVmZmVycworICAqICAgQG9wc190YmwgICAgOiBwdHIgdG8gYnVmIG1hcHBpbmcvdW5tYXBwaW5nIG9wcworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVN0cmVhbTo6YWxsb2NhdGVCYXRjaEJ1ZnMoY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCAqb2Zmc2V0LAorICAgICAgICB1aW50OF90ICpudW1fYnVmcywgdWludDhfdCAqKmluaXRpYWxfcmVnX2ZsYWcsCisgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKipidWZzLCBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICB1aW50OF90ICpyZWdGbGFnczsKKyAgICBRQ2FtZXJhQnVmZmVyTWFwcyBidWZmZXJNYXBzOworICAgIFFDYW1lcmFCdWZmZXJNYXBzIHBsYW5lQnVmZmVyTWFwczsKKworICAgIG1GcmFtZUxlbk9mZnNldCA9ICpvZmZzZXQ7CisKKyAgICBMT0dIKCJCYXRjaCBCdWZmZXIgYWxsb2NhdGlvbiBzdHJlYW0gdHlwZSA9ICVkIiwgZ2V0TXlUeXBlKCkpOworCisgICAgLy9BbGxvY2F0ZSBzdHJlYW0gYmF0Y2ggYnVmZmVyCisgICAgbVN0cmVhbUJhdGNoQnVmcyA9IG1BbGxvY2F0b3IuYWxsb2NhdGVTdHJlYW1Vc2VyQnVmIChtU3RyZWFtSW5mbyk7CisgICAgaWYgKCFtU3RyZWFtQmF0Y2hCdWZzKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBzdHJlYW0gYmF0Y2ggYnVmZmVycyIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHVpbnQ4X3QgbnVtQnVmc1RvTWFwID0gbVN0cmVhbUJhdGNoQnVmcy0+Z2V0TWFwcGFibGUoKTsKKworICAgIC8vbWFwIGJhdGNoIGJ1ZmZlcnMKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtQnVmc1RvTWFwOyBpKyspIHsKKyAgICAgICAgcmMgPSBidWZmZXJNYXBzLmVucXVldWUoQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX1VTRVJfQlVGLAorICAgICAgICAgICAgICAgIDAgLypzdHJlYW0gaWQqLywgaSAvKmJ1ZiBpbmRleCovLCAtMSAvKnBsYW5lIGluZGV4Ki8sCisgICAgICAgICAgICAgICAgMCAvKmNvb2tpZSovLCBtU3RyZWFtQmF0Y2hCdWZzLT5nZXRGZChpKSwKKyAgICAgICAgICAgICAgICBtTnVtQnVmcywgbVN0cmVhbUJhdGNoQnVmcy0+Z2V0UHRyKGkpKTsKKworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gbWFwIGJ1ZmZlcnMiKTsKKyAgICAgICAgICAgIHJjID0gQkFEX0lOREVYOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjYW1fYnVmX21hcF90eXBlX2xpc3QgYnVmTWFwTGlzdDsKKyAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmMgPSBidWZmZXJNYXBzLmdldENhbUJ1Zk1hcExpc3QoYnVmTWFwTGlzdCk7CisgICAgfQorICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICByYyA9IG1hcEJ1ZnMoYnVmTWFwTGlzdCwgb3BzX3RibCk7CisgICAgfQorICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIG1hcCBzdHJlYW0gYmF0Y2ggYnVmZmVycyIpOworICAgICAgICBtU3RyZWFtQmF0Y2hCdWZzLT5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbGV0ZSBtU3RyZWFtQmF0Y2hCdWZzOworICAgICAgICBtU3RyZWFtQmF0Y2hCdWZzID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICAvKmNhbGN1bGF0ZSBzdHJlYW0gQnVmZmVyIGNvdW50Ki8KKyAgICBtTnVtUGxhbmVCdWZzID0KKyAgICAgICAgICAgIChtTnVtQnVmcyAqIG1TdHJlYW1JbmZvLT51c2VyX2J1Zl9pbmZvLmZyYW1lX2J1Zl9jbnQpOworCisgICAgLyogRm9yIHNvbWUgc3RyZWFtIHR5cGVzLCBidWZmZXIgYWxsb2NhdGlvbiBtYXkgaGF2ZSBhbHJlYWR5IGJlZ3VuCisgICAgICogcHJlZW1wdGl2ZWx5LiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZQorICAgICAqIHByZWVtcHRpdmUgYWxsb2NhdGlvbiB0byBjb21wbGV0ZSBiZWZvcmUgcHJvY2VlZGluZy4gKi8KKyAgICBtQWxsb2NhdG9yLndhaXRGb3JEZWZlcnJlZEFsbG9jKG1TdHJlYW1JbmZvLT5zdHJlYW1fdHlwZSk7CisKKyAgICAvL0FsbG9jYXRlIHN0cmVhbSBidWZmZXIKKyAgICBtU3RyZWFtQnVmcyA9IG1BbGxvY2F0b3IuYWxsb2NhdGVTdHJlYW1CdWYobVN0cmVhbUluZm8tPnN0cmVhbV90eXBlLAorICAgICAgICAgICAgbUZyYW1lTGVuT2Zmc2V0LmZyYW1lX2xlbixtRnJhbWVMZW5PZmZzZXQubXBbMF0uc3RyaWRlLAorICAgICAgICAgICAgbUZyYW1lTGVuT2Zmc2V0Lm1wWzBdLnNjYW5saW5lLG1OdW1QbGFuZUJ1ZnMpOworICAgIGlmICghbVN0cmVhbUJ1ZnMpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIHN0cmVhbSBidWZmZXJzIik7CisgICAgICAgIHJjID0gTk9fTUVNT1JZOworICAgICAgICBnb3RvIGVycjE7CisgICAgfQorCisgICAgLy9NYXAgcGxhbmUgc3RyZWFtIGJ1ZmZlcnMKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbU51bVBsYW5lQnVmczsgaSsrKSB7CisgICAgICAgIHNzaXplX3QgYnVmU2l6ZSA9IG1TdHJlYW1CdWZzLT5nZXRTaXplKGkpOworICAgICAgICBpZiAoQkFEX0lOREVYICE9IGJ1ZlNpemUpIHsKKyAgICAgICAgICAgIHJjID0gcGxhbmVCdWZmZXJNYXBzLmVucXVldWUoQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgMCAvKnN0cmVhbSBpZCovLCBpIC8qYnVmIGluZGV4Ki8sIC0xIC8qcGxhbmUgaW5kZXgqLywKKyAgICAgICAgICAgICAgICAgICAgMCAvKmNvb2tpZSovLCBtU3RyZWFtQnVmcy0+Z2V0RmQoaSksIGJ1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1CdWZzLT5nZXRQdHIoaSkpOworCisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIG1hcCBidWZmZXJzIik7CisgICAgICAgICAgICAgICAgbVN0cmVhbUJ1ZnMtPmRlYWxsb2NhdGUoKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgbVN0cmVhbUJ1ZnM7CisgICAgICAgICAgICAgICAgbVN0cmVhbUJ1ZnMgPSBOVUxMOworICAgICAgICAgICAgICAgIHJjID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgZ290byBlcnIxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGJ1ZmZlciBzaXplIChiYWQgaW5kZXgpIik7CisgICAgICAgICAgICBtU3RyZWFtQnVmcy0+ZGVhbGxvY2F0ZSgpOworICAgICAgICAgICAgZGVsZXRlIG1TdHJlYW1CdWZzOworICAgICAgICAgICAgbVN0cmVhbUJ1ZnMgPSBOVUxMOworICAgICAgICAgICAgcmMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGdvdG8gZXJyMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNhbV9idWZfbWFwX3R5cGVfbGlzdCBwbGFuZUJ1Zk1hcExpc3Q7CisgICAgcmMgPSBwbGFuZUJ1ZmZlck1hcHMuZ2V0Q2FtQnVmTWFwTGlzdChwbGFuZUJ1Zk1hcExpc3QpOworICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICByYyA9IG1hcEJ1ZnMocGxhbmVCdWZNYXBMaXN0LCBvcHNfdGJsKTsKKyAgICB9CisKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoIm1hcF9zdHJlYW1fYnVmIGZhaWxlZDogJWQiLCByYyk7CisgICAgICAgIG1TdHJlYW1CdWZzLT5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbGV0ZSBtU3RyZWFtQnVmczsKKyAgICAgICAgbVN0cmVhbUJ1ZnMgPSBOVUxMOworICAgICAgICByYyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBnb3RvIGVycjE7CisgICAgfQorCisgICAgTE9HRCgiQkFUQ0ggQnVmIENvdW50ID0gJWQsIFBsYW5lIEJ1ZiBDbnQgPSAlZCIsCisgICAgICAgICAgICBtTnVtQnVmcywgbU51bVBsYW5lQnVmcyk7CisKKyAgICAvL3JlZ0ZsYWdzIGFycmF5IGlzIGFsbG9jYXRlZCBieSB1cywgYnV0IGNvbnN1bWVkIGFuZCBmcmVlZCBieSBtbS1jYW1lcmEtaW50ZXJmYWNlCisgICAgcmVnRmxhZ3MgPSAodWludDhfdCAqKW1hbGxvYyhzaXplb2YodWludDhfdCkgKiBtTnVtQnVmcyk7CisgICAgaWYgKCFyZWdGbGFncykgeworICAgICAgICBMT0dFKCJPdXQgb2YgbWVtb3J5Iik7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtTnVtUGxhbmVCdWZzOyBpKyspIHsKKyAgICAgICAgICAgIHVubWFwQnVmKENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsIGksIC0xLCBvcHNfdGJsKTsKKyAgICAgICAgfQorICAgICAgICBtU3RyZWFtQnVmcy0+ZGVhbGxvY2F0ZSgpOworICAgICAgICBkZWxldGUgbVN0cmVhbUJ1ZnM7CisgICAgICAgIG1TdHJlYW1CdWZzID0gTlVMTDsKKyAgICAgICAgcmMgPSBOT19NRU1PUlk7CisgICAgICAgIGdvdG8gZXJyMTsKKyAgICB9CisgICAgbWVtc2V0KHJlZ0ZsYWdzLCAwLCBzaXplb2YodWludDhfdCkgKiBtTnVtQnVmcyk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1OdW1CdWZzOyBpKyspIHsKKyAgICAgICAgcmVnRmxhZ3NbaV0gPSAxOworICAgIH0KKworICAgIG1CdWZEZWZzID0gKG1tX2NhbWVyYV9idWZfZGVmX3QgKiltYWxsb2MobU51bUJ1ZnMgKiBzaXplb2YobW1fY2FtZXJhX2J1Zl9kZWZfdCkpOworICAgIGlmIChtQnVmRGVmcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoImdldFJlZ0ZsYWdzIGZhaWxlZCAlZCIsIHJjKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1OdW1QbGFuZUJ1ZnM7IGkrKykgeworICAgICAgICAgICAgdW5tYXBCdWYoQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiwgaSwgLTEsIG9wc190YmwpOworICAgICAgICB9CisgICAgICAgIG1TdHJlYW1CdWZzLT5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbGV0ZSBtU3RyZWFtQnVmczsKKyAgICAgICAgbVN0cmVhbUJ1ZnMgPSBOVUxMOworICAgICAgICBmcmVlKHJlZ0ZsYWdzKTsKKyAgICAgICAgcmVnRmxhZ3MgPSBOVUxMOworICAgICAgICByYyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBnb3RvIGVycjE7CisgICAgfQorICAgIG1lbXNldChtQnVmRGVmcywgMCwgbU51bUJ1ZnMgKiBzaXplb2YobW1fY2FtZXJhX2J1Zl9kZWZfdCkpOworCisgICAgbVBsYW5lQnVmRGVmcyA9IChtbV9jYW1lcmFfYnVmX2RlZl90ICopCisgICAgICAgICAgICBtYWxsb2MobU51bVBsYW5lQnVmcyAqIChzaXplb2YobW1fY2FtZXJhX2J1Zl9kZWZfdCkpKTsKKyAgICBpZiAobVBsYW5lQnVmRGVmcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5vIE1lbW9yeSIpOworICAgICAgICBmcmVlKHJlZ0ZsYWdzKTsKKyAgICAgICAgcmVnRmxhZ3MgPSBOVUxMOworICAgICAgICBmcmVlKG1CdWZEZWZzKTsKKyAgICAgICAgbUJ1ZkRlZnMgPSBOVUxMOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbU51bVBsYW5lQnVmczsgaSsrKSB7CisgICAgICAgICAgICB1bm1hcEJ1ZihDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGLCBpLCAtMSwgb3BzX3RibCk7CisgICAgICAgIH0KKyAgICAgICAgbVN0cmVhbUJ1ZnMtPmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVsZXRlIG1TdHJlYW1CdWZzOworICAgICAgICBtU3RyZWFtQnVmcyA9IE5VTEw7CisgICAgICAgIGZyZWUocmVnRmxhZ3MpOworICAgICAgICByZWdGbGFncyA9IE5VTEw7CisgICAgICAgIHJjID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGdvdG8gZXJyMTsKKyAgICB9CisgICAgbWVtc2V0KG1QbGFuZUJ1ZkRlZnMsIDAsCisgICAgICAgICAgICAgbU51bVBsYW5lQnVmcyAqIChzaXplb2YobW1fY2FtZXJhX2J1Zl9kZWZfdCkpKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtU3RyZWFtSW5mby0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICBtU3RyZWFtQmF0Y2hCdWZzLT5nZXRVc2VyQnVmRGVmKG1TdHJlYW1JbmZvLT51c2VyX2J1Zl9pbmZvLAorICAgICAgICAgICAgICAgIG1CdWZEZWZzW2ldLCBpLCBtRnJhbWVMZW5PZmZzZXQsIG1QbGFuZUJ1ZkRlZnMsCisgICAgICAgICAgICAgICAgbVN0cmVhbUJ1ZnMpOworICAgIH0KKworICAgICpudW1fYnVmcyA9IG1OdW1CdWZzOworICAgICppbml0aWFsX3JlZ19mbGFnID0gcmVnRmxhZ3M7CisgICAgKmJ1ZnMgPSBtQnVmRGVmczsKKyAgICBMT0dIKCJzdHJlYW0gdHlwZTogJWQsIG51bUJ1ZnM6ICVkIG1OdW1QbGFuZUJ1ZnM6ICVkIiwKKyAgICAgICAgICAgICBtU3RyZWFtSW5mby0+c3RyZWFtX3R5cGUsIG1OdW1CdWZzLCBtTnVtUGxhbmVCdWZzKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKKworZXJyMToKKyAgICBtU3RyZWFtQmF0Y2hCdWZzLT5kZWFsbG9jYXRlKCk7CisgICAgZGVsZXRlIG1TdHJlYW1CYXRjaEJ1ZnM7CisgICAgbVN0cmVhbUJhdGNoQnVmcyA9IE5VTEw7CisgICAgcmV0dXJuIHJjOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVsZWFzZUJ1ZmZzCisgKgorICogREVTQ1JJUFRJT046IG1ldGhvZCB0byBkZWFsbG9jYXRlIHN0cmVhbSBidWZmZXJzCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpyZWxlYXNlQnVmZnMoKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKG1CdWZBbGxvY1BpZCAhPSAwKSB7CisgICAgICAgIGNvbmRfc2lnbmFsKHRydWUpOworICAgICAgICBMT0dEKCJ3YWl0IGZvciBidWYgYWxsb2NhdGlvbiB0aHJlYWQgZGVhZCIpOworICAgICAgICBwdGhyZWFkX2pvaW4obUJ1ZkFsbG9jUGlkLCBOVUxMKTsKKyAgICAgICAgbUJ1ZkFsbG9jUGlkID0gMDsKKyAgICAgICAgTE9HRCgicmV0dXJuIGZyb20gYnVmIGFsbG9jYXRpb24gdGhyZWFkIik7CisgICAgfQorCisgICAgaWYgKG1TdHJlYW1JbmZvLT5zdHJlYW1pbmdfbW9kZSA9PSBDQU1fU1RSRUFNSU5HX01PREVfQkFUQ0gpIHsKKyAgICAgICAgcmV0dXJuIHJlbGVhc2VCYXRjaEJ1ZnMoTlVMTCk7CisgICAgfQorCisgICAgaWYgKChOVUxMICE9IG1CdWZEZWZzKSAmJiAobVN0cmVhbUJ1ZnMgIT0gTlVMTCkpIHsKKyAgICAgICAgdWludDhfdCBudW1CdWZzVG9Vbm1hcCA9IG1TdHJlYW1CdWZzLT5nZXRNYXBwYWJsZSgpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtQnVmc1RvVW5tYXA7IGkrKykgeworICAgICAgICAgICAgcmMgPSB1bm1hcEJ1ZihDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGLCBpLCAtMSwgTlVMTCk7CisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibWFwX3N0cmVhbV9idWYgZmFpbGVkOiAlZCIsIHJjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1CdWZEZWZzIGp1c3Qga2VlcCBhIHB0ciB0byB0aGUgYnVmZmVyCisgICAgICAgIC8vIG1tLWNhbWVyYS1pbnRlcmZhY2Ugb3duIHRoZSBidWZmZXIsIHNvIG5vIG5lZWQgdG8gZnJlZQorICAgICAgICBtQnVmRGVmcyA9IE5VTEw7CisgICAgICAgIG1lbXNldCgmbUZyYW1lTGVuT2Zmc2V0LCAwLCBzaXplb2YobUZyYW1lTGVuT2Zmc2V0KSk7CisgICAgfQorICAgIGlmICghbVN0cmVhbUJ1ZnNBY3F1aXJlZCAmJiAobVN0cmVhbUJ1ZnMgIT0gTlVMTCkpIHsKKyAgICAgICAgbVN0cmVhbUJ1ZnMtPmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVsZXRlIG1TdHJlYW1CdWZzOworICAgICAgICBtU3RyZWFtQnVmcyA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWxlYXNlQmF0Y2hCdWZzCisgKgorICogREVTQ1JJUFRJT046IG1ldGhvZCB0byBkZWFsbG9jYXRlIHN0cmVhbSBidWZmZXJzIGFuZCBiYXRjaCBidWZmZXJzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBvcHNfdGJsICAgIDogcHRyIHRvIGJ1ZiBtYXBwaW5nL3VubWFwcGluZyBvcHMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVN0cmVhbTo6cmVsZWFzZUJhdGNoQnVmcyhtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKworICAgIGlmIChOVUxMICE9IG1QbGFuZUJ1ZkRlZnMpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1OdW1QbGFuZUJ1ZnM7IGkrKykgeworICAgICAgICAgICAgcmMgPSB1bm1hcEJ1ZihDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGLCBpLCAtMSwgb3BzX3RibCk7CisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibWFwX3N0cmVhbV9idWYgZmFpbGVkOiAlZCIsIHJjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1CdWZEZWZzIGp1c3Qga2VlcCBhIHB0ciB0byB0aGUgYnVmZmVyCisgICAgICAgIC8vIG1tLWNhbWVyYS1pbnRlcmZhY2Ugb3duIHRoZSBidWZmZXIsIHNvIG5vIG5lZWQgdG8gZnJlZQorICAgICAgICBtUGxhbmVCdWZEZWZzID0gTlVMTDsKKyAgICAgICAgbWVtc2V0KCZtRnJhbWVMZW5PZmZzZXQsIDAsIHNpemVvZihtRnJhbWVMZW5PZmZzZXQpKTsKKyAgICAgICAgbU51bVBsYW5lQnVmcyA9IDA7CisgICAgfQorCisgICAgaWYgKG1TdHJlYW1CdWZzICE9IE5VTEwpIHsKKyAgICAgICAgbVN0cmVhbUJ1ZnMtPmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVsZXRlIG1TdHJlYW1CdWZzOworICAgIH0KKworICAgIG1CdWZEZWZzID0gTlVMTDsKKworICAgIGlmIChtU3RyZWFtQmF0Y2hCdWZzICE9IE5VTEwpIHsKKyAgICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgbVN0cmVhbUJhdGNoQnVmcy0+Z2V0Q250KCk7IGkrKykgeworICAgICAgICAgICAgdW5tYXBCdWYoQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX1VTRVJfQlVGLCBpLCAtMSwgb3BzX3RibCk7CisgICAgICAgIH0KKyAgICAgICAgbVN0cmVhbUJhdGNoQnVmcy0+ZGVhbGxvY2F0ZSgpOworICAgICAgICBkZWxldGUgbVN0cmVhbUJhdGNoQnVmczsKKyAgICAgICAgbVN0cmVhbUJhdGNoQnVmcyA9IE5VTEw7CisgICAgfQorICAgIHJldHVybiByYzsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IEJ1ZkFsbG9jUm91dGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byBhbGxvY2F0ZSBhZGRpdGlvbmFsIHN0cmVhbSBidWZmZXJzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkYXRhICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgKlFDYW1lcmFTdHJlYW06OkJ1ZkFsbG9jUm91dGluZSh2b2lkICpkYXRhKQoreworICAgIFFDYW1lcmFTdHJlYW0gKnBtZSA9IChRQ2FtZXJhU3RyZWFtICopZGF0YTsKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBMT0dIKCJFIik7CisgICAgcG1lLT5jb25kX3dhaXQoKTsKKyAgICBpZiAocG1lLT5tTnVtQnVmc05lZWRBbGxvYyA+IDApIHsKKyAgICAgICAgdWludDhfdCBudW1CdWZBbGxvYyA9ICh1aW50OF90KShwbWUtPm1OdW1CdWZzIC0gcG1lLT5tTnVtQnVmc05lZWRBbGxvYyk7CisgICAgICAgIHJjID0gcG1lLT5tQWxsb2NhdG9yLmFsbG9jYXRlTW9yZVN0cmVhbUJ1ZihwbWUtPm1TdHJlYW1CdWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tRnJhbWVMZW5PZmZzZXQuZnJhbWVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tTnVtQnVmc05lZWRBbGxvYyk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlcnMiKTsKKyAgICAgICAgICAgIHBtZS0+bU51bUJ1ZnNOZWVkQWxsb2MgPSAwOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBwbWUtPm1OdW1CdWZzTmVlZEFsbG9jID0gMDsKKyAgICAgICAgUUNhbWVyYUJ1ZmZlck1hcHMgYnVmZmVyTWFwczsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gbnVtQnVmQWxsb2M7IGkgPCBwbWUtPm1OdW1CdWZzOyBpKyspIHsKKyAgICAgICAgICAgIHNzaXplX3QgYnVmU2l6ZSA9IHBtZS0+bVN0cmVhbUJ1ZnMtPmdldFNpemUoaSk7CisgICAgICAgICAgICBpZiAoQkFEX0lOREVYID09IGJ1ZlNpemUpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYnVmZmVyIHNpemUgKGJhZCBpbmRleCkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBidWZmZXJNYXBzLmVucXVldWUoQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgcG1lLT5tSGFuZGxlLCBpIC8qYnVmIGluZGV4Ki8sIC0xIC8qcGxhbmUgaW5kZXgqLywKKyAgICAgICAgICAgICAgICAgICAgMCAvKmNvb2tpZSovLCBwbWUtPm1TdHJlYW1CdWZzLT5nZXRGZChpKSwgYnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgcG1lLT5tU3RyZWFtQnVmcy0+Z2V0UHRyKGkpKTsKKworICAgICAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBtYXAgYnVmZmVycyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2FtX2J1Zl9tYXBfdHlwZV9saXN0IGJ1Zk1hcExpc3Q7CisgICAgICAgIHJjID0gYnVmZmVyTWFwcy5nZXRDYW1CdWZNYXBMaXN0KGJ1Zk1hcExpc3QpOworICAgICAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJjID0gcG1lLT5tX01lbU9wc1RibC5idW5kbGVkX21hcF9vcHMoJmJ1Zk1hcExpc3QsIHBtZS0+bV9NZW1PcHNUYmwudXNlcmRhdGEpOworICAgICAgICB9CisgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gbWFwIGJ1ZmZlcnMgd2l0aCByZXR1cm4gY29kZSAlZCIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gbnVtQnVmQWxsb2M7IGkgPCBwbWUtPm1OdW1CdWZzOyBpKyspIHsKKyAgICAgICAgICAgIHBtZS0+bVN0cmVhbUJ1ZnMtPmdldEJ1ZkRlZihwbWUtPm1GcmFtZUxlbk9mZnNldCwgcG1lLT5tQnVmRGVmc1tpXSwgaSk7CisgICAgICAgICAgICBwbWUtPm1DYW1PcHMtPnFidWYocG1lLT5tQ2FtSGFuZGxlLCBwbWUtPm1DaGFubmVsSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAmcG1lLT5tQnVmRGVmc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HSCgiWCIpOworICAgIHJldHVybiBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbmRfc2lnbmFsCisgKgorICogREVTQ1JJUFRJT046IHNpZ25hbCBpZiBmbGFnICJ3YWl0X2Zvcl9jb25kIiBpcyBzZXQKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYVN0cmVhbTo6Y29uZF9zaWduYWwoYm9vbCBmb3JjZUV4aXQpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOworICAgIGlmKHdhaXRfZm9yX2NvbmQgPT0gVFJVRSl7CisgICAgICAgIHdhaXRfZm9yX2NvbmQgPSBGQUxTRTsKKyAgICAgICAgaWYgKGZvcmNlRXhpdCkgeworICAgICAgICAgICAgbU51bUJ1ZnNOZWVkQWxsb2MgPSAwOworICAgICAgICB9CisgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJm1fY29uZCk7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY29uZF93YWl0CisgKgorICogREVTQ1JJUFRJT046IHdhaXQgb24gaWYgZmxhZyAid2FpdF9mb3JfY29uZCIgaXMgc2V0CisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFTdHJlYW06OmNvbmRfd2FpdCgpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOworICAgIHdoaWxlICh3YWl0X2Zvcl9jb25kID09IFRSVUUpIHsKKyAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJm1fY29uZCwgJm1fbG9jayk7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHB1dEJ1ZnMKKyAqCisgKiBERVNDUklQVElPTjogZGVhbGxvY2F0ZSBzdHJlYW0gYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb3BzX3RibCAgICA6IHB0ciB0byBidWYgbWFwcGluZy91bm1hcHBpbmcgb3BzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpwdXRCdWZzKG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKG1CdWZBbGxvY1BpZCAhPSAwKSB7CisgICAgICAgIGNvbmRfc2lnbmFsKHRydWUpOworICAgICAgICBMT0dMKCJ3YWl0IGZvciBidWYgYWxsb2NhdGlvbiB0aHJlYWQgZGVhZCIpOworICAgICAgICBwdGhyZWFkX2pvaW4obUJ1ZkFsbG9jUGlkLCBOVUxMKTsKKyAgICAgICAgbUJ1ZkFsbG9jUGlkID0gMDsKKyAgICAgICAgTE9HTCgicmV0dXJuIGZyb20gYnVmIGFsbG9jYXRpb24gdGhyZWFkIik7CisgICAgfQorCisgICAgdWludDhfdCBudW1CdWZzVG9Vbm1hcCA9IG1TdHJlYW1CdWZzLT5nZXRNYXBwYWJsZSgpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1CdWZzVG9Vbm1hcDsgaSsrKSB7CisgICAgICAgIHJjID0gb3BzX3RibC0+dW5tYXBfb3BzKGksIC0xLCBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGLCBvcHNfdGJsLT51c2VyZGF0YSk7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIm1hcF9zdHJlYW1fYnVmIGZhaWxlZDogJWQiLCByYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUJ1ZkRlZnMgPSBOVUxMOyAvLyBtQnVmRGVmcyBqdXN0IGtlZXAgYSBwdHIgdG8gdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgLy8gbW0tY2FtZXJhLWludGVyZmFjZSBvd24gdGhlIGJ1ZmZlciwgc28gbm8gbmVlZCB0byBmcmVlCisgICAgbWVtc2V0KCZtRnJhbWVMZW5PZmZzZXQsIDAsIHNpemVvZihtRnJhbWVMZW5PZmZzZXQpKTsKKyAgICBpZiAoICFtU3RyZWFtQnVmc0FjcXVpcmVkICkgeworICAgICAgICBtU3RyZWFtQnVmcy0+ZGVhbGxvY2F0ZSgpOworICAgICAgICBkZWxldGUgbVN0cmVhbUJ1ZnM7CisgICAgICAgIG1TdHJlYW1CdWZzID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHV0QnVmc0RlZmZlcmVkCisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIGRlYWxsb2NhdGUgZGVmZmVyZWQgc3RyZWFtIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVN0cmVhbTo6cHV0QnVmc0RlZmZlcmVkKCkKK3sKKyAgICBpZiAobUJ1ZkFsbG9jUGlkICE9IDApIHsKKyAgICAgICAgY29uZF9zaWduYWwodHJ1ZSk7CisgICAgICAgIExPR0goIiVzOiB3YWl0IGZvciBidWYgYWxsb2NhdGlvbiB0aHJlYWQgZGVhZCIsIF9fZnVuY19fKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGFsbG9jYXRpb24gb2YgYWRkaXRpb25hbCBzdHJlYW0gYnVmZmVycworICAgICAgICBwdGhyZWFkX2pvaW4obUJ1ZkFsbG9jUGlkLCBOVUxMKTsKKyAgICAgICAgbUJ1ZkFsbG9jUGlkID0gMDsKKyAgICAgICAgTE9HSCgiJXM6IHJldHVybiBmcm9tIGJ1ZiBhbGxvY2F0aW9uIHRocmVhZCIsIF9fZnVuY19fKTsKKyAgICB9CisgICAgLy8gRGVhbGxvY2F0aW9uIG9mIHRoZSBkZWZmZXJlZCBzdHJlYW0gYnVmZmVycyBoYW5kbGVkIHNlcGFyYXRlbHkKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW52YWxpZGF0ZUJ1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBpbnZhbGlkYXRlIGEgc3BlY2lmaWMgc3RyZWFtIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGluZGV4IG9mIHRoZSBidWZmZXIgdG8gaW52YWxpZGF0ZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVN0cmVhbTo6aW52YWxpZGF0ZUJ1Zih1aW50MzJfdCBpbmRleCkKK3sKKyAgICBpZiAobVN0cmVhbUJ1ZnMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIE9wZXJhdGlvbiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtU3RyZWFtQnVmcy0+aW52YWxpZGF0ZUNhY2hlKGluZGV4KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjbGVhbkludmFsaWRhdGVCdWYKKyAqCisgKiBERVNDUklQVElPTjogY2xlYW4gaW52YWxpZGF0ZSBhIHNwZWNpZmljIHN0cmVhbSBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyIHRvIGNsZWFuIGludmFsaWRhdGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OmNsZWFuSW52YWxpZGF0ZUJ1Zih1aW50MzJfdCBpbmRleCkKK3sKKyAgICBpZiAobVN0cmVhbUJ1ZnMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIE9wZXJhdGlvbiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtU3RyZWFtQnVmcy0+Y2xlYW5JbnZhbGlkYXRlQ2FjaGUoaW5kZXgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzVHlwZU9mCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIHN0cmVhbSBpcyBvZiB0aGUgcXVlcmllZCB0eXBlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB0eXBlICAgIDogc3RyZWFtIHR5cGUgYXMgb2YgcXVlcmllZAorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlL2ZhbHNlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVN0cmVhbTo6aXNUeXBlT2YoY2FtX3N0cmVhbV90eXBlX3QgdHlwZSkKK3sKKyAgICBpZiAobVN0cmVhbUluZm8gIT0gTlVMTCAmJiAobVN0cmVhbUluZm8tPnN0cmVhbV90eXBlID09IHR5cGUpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNPcmlnbmFsVHlwZU9mCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIG9yaWdpbmFsIHN0cmVhbSBpcyBvZiB0aGUKKyAqICAgICAgICAgICAgICBxdWVyaWVkIHR5cGUgaWYgaXQncyByZXByb2Mgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB0eXBlICAgIDogc3RyZWFtIHR5cGUgYXMgb2YgcXVlcmllZAorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlL2ZhbHNlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVN0cmVhbTo6aXNPcmlnbmFsVHlwZU9mKGNhbV9zdHJlYW1fdHlwZV90IHR5cGUpCit7CisgICAgaWYgKG1TdHJlYW1JbmZvICE9IE5VTEwgJiYKKyAgICAgICAgbVN0cmVhbUluZm8tPnN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0MgJiYKKyAgICAgICAgbVN0cmVhbUluZm8tPnJlcHJvY2Vzc19jb25maWcucHBfdHlwZSA9PSBDQU1fT05MSU5FX1JFUFJPQ0VTU19UWVBFICYmCisgICAgICAgIG1TdHJlYW1JbmZvLT5yZXByb2Nlc3NfY29uZmlnLm9ubGluZS5pbnB1dF9zdHJlYW1fdHlwZSA9PSB0eXBlKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoCisgICAgICAgIG1TdHJlYW1JbmZvICE9IE5VTEwgJiYKKyAgICAgICAgbVN0cmVhbUluZm8tPnN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0MgJiYKKyAgICAgICAgbVN0cmVhbUluZm8tPnJlcHJvY2Vzc19jb25maWcucHBfdHlwZSA9PSBDQU1fT0ZGTElORV9SRVBST0NFU1NfVFlQRSAmJgorICAgICAgICBtU3RyZWFtSW5mby0+cmVwcm9jZXNzX2NvbmZpZy5vZmZsaW5lLmlucHV0X3R5cGUgPT0gdHlwZSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldE15VHlwZQorICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm4gc3RyZWFtIHR5cGUKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdHJlYW0gdHlwZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjYW1fc3RyZWFtX3R5cGVfdCBRQ2FtZXJhU3RyZWFtOjpnZXRNeVR5cGUoKQoreworICAgIGlmIChtU3RyZWFtSW5mbyAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtU3RyZWFtSW5mby0+c3RyZWFtX3R5cGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIENBTV9TVFJFQU1fVFlQRV9ERUZBVUxUOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRNeU9yaWdpbmFsVHlwZQorICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm4gc3RyZWFtIHR5cGUKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdHJlYW0gdHlwZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjYW1fc3RyZWFtX3R5cGVfdCBRQ2FtZXJhU3RyZWFtOjpnZXRNeU9yaWdpbmFsVHlwZSgpCit7CisgICAgaWYgKG1TdHJlYW1JbmZvICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1TdHJlYW1JbmZvLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DICYmCisgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPnJlcHJvY2Vzc19jb25maWcucHBfdHlwZSA9PSBDQU1fT05MSU5FX1JFUFJPQ0VTU19UWVBFKSB7CisgICAgICAgICAgICByZXR1cm4gbVN0cmVhbUluZm8tPnJlcHJvY2Vzc19jb25maWcub25saW5lLmlucHV0X3N0cmVhbV90eXBlOworICAgICAgICB9IGVsc2UgaWYgKG1TdHJlYW1JbmZvLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DICYmCisgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPnJlcHJvY2Vzc19jb25maWcucHBfdHlwZSA9PSBDQU1fT0ZGTElORV9SRVBST0NFU1NfVFlQRSkgeworICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW1JbmZvLT5yZXByb2Nlc3NfY29uZmlnLm9mZmxpbmUuaW5wdXRfdHlwZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBtU3RyZWFtSW5mby0+c3RyZWFtX3R5cGU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQ0FNX1NUUkVBTV9UWVBFX0RFRkFVTFQ7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEZyYW1lT2Zmc2V0CisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IHN0cmVhbSBidWZmZXIgZnJhbWUgb2Zmc2V0IGluZm8KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG9mZnNldCAgOiByZWZlcmVuY2UgdG8gc3RydWN0IHRvIHN0b3JlIHRoZSBxdWVyaWVkIGZyYW1lIG9mZnNldCBpbmZvCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpnZXRGcmFtZU9mZnNldChjYW1fZnJhbWVfbGVuX29mZnNldF90ICZvZmZzZXQpCit7CisgICAgaWYgKE5VTEwgPT0gbVN0cmVhbUluZm8pIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgb2Zmc2V0ID0gbUZyYW1lTGVuT2Zmc2V0OworICAgIGlmICgoUk9UQVRFXzkwID09IG1PbmxpbmVSb3RhdGlvbikgfHwgKFJPVEFURV8yNzAgPT0gbU9ubGluZVJvdGF0aW9uKQorICAgICAgICAgICAgfHwgKG9mZnNldC5mcmFtZV9sZW4gPT0gMCkgfHwgKG9mZnNldC5udW1fcGxhbmVzID09IDApKSB7CisgICAgICAgIC8vIFJlLWNhbGN1bGF0ZSBmcmFtZSBvZmZzZXQgaW4gY2FzZSBvZiBvbmxpbmUgcm90YXRpb24KKyAgICAgICAgY2FtX3N0cmVhbV9pbmZvX3Qgc3RyZWFtSW5mbyA9ICptU3RyZWFtSW5mbzsKKyAgICAgICAgZ2V0RnJhbWVEaW1lbnNpb24oc3RyZWFtSW5mby5kaW0pOworICAgICAgICBjYWxjT2Zmc2V0KCZzdHJlYW1JbmZvKTsKKyAgICAgICAgb2Zmc2V0ID0gc3RyZWFtSW5mby5idWZfcGxhbmVzLnBsYW5lX2luZm87CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0Q3JvcEluZm8KKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgY3JvcCBpbmZvIG9mIHRoZSBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNyb3AgICAgOiByZWZlcmVuY2UgdG8gc3RydWN0IHRvIHN0b3JlIHRoZSBxdWVyaWVkIGNyb3AgaW5mbworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYVN0cmVhbTo6Z2V0Q3JvcEluZm8oY2FtX3JlY3RfdCAmY3JvcCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1Dcm9wTG9jayk7CisgICAgY3JvcCA9IG1Dcm9wSW5mbzsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUNyb3BMb2NrKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0Q3JvcEluZm8KKyAqCisgKiBERVNDUklQVElPTjogc2V0IGNyb3AgaW5mbyBvZiB0aGUgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjcm9wICAgIDogc3RydWN0IHRvIHN0b3JlIG5ldyBjcm9wIGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OnNldENyb3BJbmZvKGNhbV9yZWN0X3QgY3JvcCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1Dcm9wTG9jayk7CisgICAgbUNyb3BJbmZvID0gY3JvcDsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUNyb3BMb2NrKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RnJhbWVEaW1lbnNpb24KKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgc3RyZWFtIGZyYW1lIGRpbWVuc2lvbiBpbmZvCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkaW0gICAgIDogcmVmZXJlbmNlIHRvIHN0cnVjdCB0byBzdG9yZSB0aGUgcXVlcmllZCBmcmFtZSBkaW1lbnNpb24KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OmdldEZyYW1lRGltZW5zaW9uKGNhbV9kaW1lbnNpb25fdCAmZGltKQoreworICAgIGlmIChtU3RyZWFtSW5mbyAhPSBOVUxMKSB7CisgICAgICAgIGlmICgoUk9UQVRFXzkwID09IG1PbmxpbmVSb3RhdGlvbikgfHwgKFJPVEFURV8yNzAgPT0gbU9ubGluZVJvdGF0aW9uKSkgeworICAgICAgICAgICAgZGltLndpZHRoID0gbVN0cmVhbUluZm8tPmRpbS5oZWlnaHQ7CisgICAgICAgICAgICBkaW0uaGVpZ2h0ID0gbVN0cmVhbUluZm8tPmRpbS53aWR0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpbSA9IG1TdHJlYW1JbmZvLT5kaW07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRGb3JtYXQKKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgc3RyZWFtIGZvcm1hdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZm10ICAgICA6IHJlZmVyZW5jZSB0byBzdHJlYW0gZm9ybWF0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpnZXRGb3JtYXQoY2FtX2Zvcm1hdF90ICZmbXQpCit7CisgICAgaWYgKG1TdHJlYW1JbmZvICE9IE5VTEwpIHsKKyAgICAgICAgZm10ID0gbVN0cmVhbUluZm8tPmZtdDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRNeVNlcnZlcklECisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IHNlcnZlciBzdHJlYW0gSUQKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdHJlYW0gSUQgZnJvbSBzZXJ2ZXIKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgUUNhbWVyYVN0cmVhbTo6Z2V0TXlTZXJ2ZXJJRCgpIHsKKyAgICBpZiAobVN0cmVhbUluZm8gIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVN0cmVhbUluZm8tPnN0cmVhbV9zdnJfaWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFjcXVpcmVTdHJlYW1CdWZzCisgKgorICogREVTQ1JJUFRJT046IGFjcXVpcmUgc3RyZWFtIGJ1ZmZlcnMgYW5kIHBvc3Rwb25lIHRoZWlyIHJlbGVhc2UuCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OmFjcXVpcmVTdHJlYW1CdWZzKCkKK3sKKyAgICBtU3RyZWFtQnVmc0FjcXVpcmVkID0gdHJ1ZTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtYXBCdWYKKyAqCisgKiBERVNDUklQVElPTjogbWFwIHN0cmVhbSByZWxhdGVkIGJ1ZmZlciB0byBiYWNrZW5kIHNlcnZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAYnVmX3R5cGUgOiBtYXBwaW5nIHR5cGUgb2YgYnVmZmVyCisgKiAgIEBidWZfaWR4ICA6IGluZGV4IG9mIGJ1ZmZlcgorICogICBAcGxhbmVfaWR4OiBwbGFuZSBpbmRleAorICogICBAZmQgICAgICAgOiBmZCBvZiB0aGUgYnVmZmVyCisgKiAgIEBidWZmZXIgICA6IGJ1ZmZlciBhZGRyZXNzCisgKiAgIEBzaXplICAgICA6IGxlbmdodCBvZiB0aGUgYnVmZmVyCisgKiAgIEBvcHNfdGJsICA6IHB0ciB0byBidWYgbWFwcGluZy91bm1hcHBpbmcgb3BzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjptYXBCdWYodWludDhfdCBidWZfdHlwZSwgdWludDMyX3QgYnVmX2lkeCwKKyAgICAgICAgaW50MzJfdCBwbGFuZV9pZHgsIGludCBmZCwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgbW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKm9wc190YmwpCit7CisgICAgY2FtX2J1Zl9tYXBfdHlwZV9saXN0IGJ1Zk1hcExpc3Q7CisgICAgaW50MzJfdCByYyA9IFFDYW1lcmFCdWZmZXJNYXBzOjptYWtlU2luZ2xldG9uQnVmTWFwTGlzdCgKKyAgICAgICAgICAgKGNhbV9tYXBwaW5nX2J1Zl90eXBlKWJ1Zl90eXBlLCBtSGFuZGxlLCBidWZfaWR4LCBwbGFuZV9pZHgsCisgICAgICAgICAgIDAgLypjb29raWUqLywgZmQsIHNpemUsIGJ1Zk1hcExpc3QsIGJ1ZmZlcik7CisKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiBtYXBCdWZzKGJ1Zk1hcExpc3QsIG9wc190YmwpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1hcEJ1ZnMKKyAqCisgKiBERVNDUklQVElPTjogbWFwIHN0cmVhbSByZWxhdGVkIGJ1ZmZlcnMgdG8gYmFja2VuZCBzZXJ2ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJ1Zk1hcExpc3QgOiBidWZmZXIgbWFwcGluZyBpbmZvcm1hdGlvbgorICogICBAb3BzX3RibCAgICA6IHB0ciB0byBidWYgbWFwcGluZy91bm1hcHBpbmcgb3BzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitpbnQzMl90IFFDYW1lcmFTdHJlYW06Om1hcEJ1ZnMoY2FtX2J1Zl9tYXBfdHlwZV9saXN0IGJ1Zk1hcExpc3QsCisgICAgICAgIF9fdW51c2VkIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsKQoreworICAgIGlmIChtX01lbU9wc1RibC5idW5kbGVkX21hcF9vcHMgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbV9NZW1PcHNUYmwuYnVuZGxlZF9tYXBfb3BzKCZidWZNYXBMaXN0LCBtX01lbU9wc1RibC51c2VyZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1DYW1PcHMtPm1hcF9zdHJlYW1fYnVmcyhtQ2FtSGFuZGxlLCBtQ2hhbm5lbEhhbmRsZSwKKyAgICAgICAgICAgICAgICAmYnVmTWFwTGlzdCk7CisgICAgfQorCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdW5tYXBCdWYKKyAqCisgKiBERVNDUklQVElPTjogdW5tYXAgc3RyZWFtIHJlbGF0ZWQgYnVmZmVyIHRvIGJhY2tlbmQgc2VydmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBidWZfdHlwZSA6IG1hcHBpbmcgdHlwZSBvZiBidWZmZXIKKyAqICAgQGJ1Zl9pZHggIDogaW5kZXggb2YgYnVmZmVyCisgKiAgIEBwbGFuZV9pZHg6IHBsYW5lIGluZGV4CisgKiAgIEBvcHNfdGJsICAgIDogcHRyIHRvIGJ1ZiBtYXBwaW5nL3VubWFwcGluZyBvcHMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OnVubWFwQnVmKHVpbnQ4X3QgYnVmX3R5cGUsIHVpbnQzMl90IGJ1Zl9pZHgsIGludDMyX3QgcGxhbmVfaWR4LAorICAgICAgICBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCkKK3sKKyAgICBpZiAob3BzX3RibCAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBvcHNfdGJsLT51bm1hcF9vcHMoYnVmX2lkeCwgcGxhbmVfaWR4LAorICAgICAgICAgICAgICAgIChjYW1fbWFwcGluZ19idWZfdHlwZSlidWZfdHlwZSwgb3BzX3RibC0+dXNlcmRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtQ2FtT3BzLT51bm1hcF9zdHJlYW1fYnVmKG1DYW1IYW5kbGUsIG1DaGFubmVsSGFuZGxlLAorICAgICAgICAgICAgICAgIG1IYW5kbGUsIGJ1Zl90eXBlLCBidWZfaWR4LCBwbGFuZV9pZHgpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRQYXJhbWV0ZXIKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHN0cmVhbSBiYXNlZCBwYXJhbWV0ZXJzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbSAgIDogcHRyIHRvIHBhcmFtZXRlcnMgdG8gYmUgc2V0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpzZXRQYXJhbWV0ZXIoY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90ICZwYXJhbSkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtUGFyYW1ldGVyTG9jayk7CisgICAgbVN0cmVhbUluZm8tPnBhcm1fYnVmID0gcGFyYW07CisgICAgcmMgPSBtQ2FtT3BzLT5zZXRfc3RyZWFtX3Bhcm1zKG1DYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVN0cmVhbUluZm8tPnBhcm1fYnVmKTsKKyAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgcGFyYW0gPSBtU3RyZWFtSW5mby0+cGFybV9idWY7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtUGFyYW1ldGVyTG9jayk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFBhcmFtZXRlcgorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgc3RyZWFtIGJhc2VkIHBhcmFtZXRlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtICAgOiBwdHIgdG8gcGFyYW1ldGVycyB0byBiZSByZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFTdHJlYW06OmdldFBhcmFtZXRlcihjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgJnBhcmFtKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1QYXJhbWV0ZXJMb2NrKTsKKyAgICBtU3RyZWFtSW5mby0+cGFybV9idWYgPSBwYXJhbTsKKyAgICByYyA9IG1DYW1PcHMtPmdldF9zdHJlYW1fcGFybXMobUNhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU3RyZWFtSW5mby0+cGFybV9idWYpOworICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICBwYXJhbSA9IG1TdHJlYW1JbmZvLT5wYXJtX2J1ZjsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1QYXJhbWV0ZXJMb2NrKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVsZWFzZUZyYW1lRGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBjYWxsYmFjayBmdW5jdGlvbiB0byByZWxlYXNlIGZyYW1lIGRhdGEgbm9kZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGF0YSAgICAgIDogcHRyIHRvIHBvc3QgcHJvY2VzcyBpbnB1dCBkYXRhCisgKiAgIEB1c2VyX2RhdGEgOiB1c2VyIGRhdGEgcHRyIChRQ2FtZXJhUmVwcm9jZXNzb3IpCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhU3RyZWFtOjpyZWxlYXNlRnJhbWVEYXRhKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBRQ2FtZXJhU3RyZWFtICpwbWUgPSAoUUNhbWVyYVN0cmVhbSAqKXVzZXJfZGF0YTsKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lID0gKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqKWRhdGE7CisgICAgaWYgKE5VTEwgIT0gcG1lKSB7CisgICAgICAgIHBtZS0+YnVmRG9uZShmcmFtZS0+YnVmc1swXS0+YnVmX2lkeCk7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbmZpZ1N0cmVhbQorICoKKyAqIERFU0NSSVBUSU9OOiBzZW5kIHN0cmVhbSBjb25maWd1cmF0aW9uIHRvIGJhY2sgZW5kCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpjb25maWdTdHJlYW0oKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworCisgICAgLy8gQ29uZmlndXJlIHRoZSBzdHJlYW0KKyAgICBtbV9jYW1lcmFfc3RyZWFtX2NvbmZpZ190IHN0cmVhbV9jb25maWc7CisgICAgc3RyZWFtX2NvbmZpZy5zdHJlYW1faW5mbyA9IG1TdHJlYW1JbmZvOworICAgIHN0cmVhbV9jb25maWcubWVtX3Z0YmwgPSBtTWVtVnRibDsKKyAgICBzdHJlYW1fY29uZmlnLnN0cmVhbV9jYl9zeW5jID0gTlVMTDsKKyAgICBzdHJlYW1fY29uZmlnLnN0cmVhbV9jYiA9IGRhdGFOb3RpZnlDQjsKKyAgICBzdHJlYW1fY29uZmlnLnBhZGRpbmdfaW5mbyA9IG1QYWRkaW5nSW5mbzsKKyAgICBzdHJlYW1fY29uZmlnLnVzZXJkYXRhID0gdGhpczsKKyAgICByYyA9IG1DYW1PcHMtPmNvbmZpZ19zdHJlYW0obUNhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbEhhbmRsZSwgbUhhbmRsZSwgJnN0cmVhbV9jb25maWcpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGNvbmZpZyBzdHJlYW0sIHJjID0gJWQiLCByYyk7CisgICAgICAgIG1DYW1PcHMtPnVubWFwX3N0cmVhbV9idWYobUNhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbEhhbmRsZSwKKyAgICAgICAgICAgICAgICBtSGFuZGxlLAorICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9JTkZPLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgLTEpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0U3luY0RhdGFDQgorICoKKyAqIERFU0NSSVBUSU9OOiByZWdpc3RlciBjYWxsYmFjayB3aXRoIG1tLWludGVyZmFjZSBmb3IgdGhpcyBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAgICAgICBAc3RyZWFtX2NiICAgOiBDYWxsYmFjayBmdW5jdGlvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub24temVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhU3RyZWFtOjpzZXRTeW5jRGF0YUNCKHN0cmVhbV9jYl9yb3V0aW5lIGRhdGFfY2IpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKG1DYW1PcHMgIT0gTlVMTCkgeworICAgICAgICBtU1lOQ0RhdGFDQiA9IGRhdGFfY2I7CisgICAgICAgIHJjID0gbUNhbU9wcy0+cmVnaXN0ZXJfc3RyZWFtX2J1Zl9jYihtQ2FtSGFuZGxlLAorICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLCBtSGFuZGxlLCBkYXRhTm90aWZ5U1lOQ0NCLCBNTV9DQU1FUkFfU1RSRUFNX0NCX1RZUEVfU1lOQywKKyAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtU3luY0NCRW5hYmxlZCA9IFRSVUU7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRSgiSW50ZXJmYWNlIGhhbmRsZSBpcyBOVUxMIik7CisgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Cit9CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFTdHJlYW0uaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMDBmNWQKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFTdHJlYW0uaApAQCAtMCwwICsxLDI3MiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIF9fUUNBTUVSQV9TVFJFQU1fSF9fCisjZGVmaW5lIF9fUUNBTUVSQV9TVFJFQU1fSF9fCisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJjYW1lcmEuaCIKKyNpbmNsdWRlICJRQ2FtZXJhQ21kVGhyZWFkLmgiCisjaW5jbHVkZSAiUUNhbWVyYU1lbS5oIgorI2luY2x1ZGUgIlFDYW1lcmFBbGxvY2F0b3IuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAibW1fY2FtZXJhX2ludGVyZmFjZS5oIgorfQorCituYW1lc3BhY2UgcWNhbWVyYSB7CisKK2NsYXNzIFFDYW1lcmFTdHJlYW07Cit0eXBlZGVmIHZvaWQgKCpzdHJlYW1fY2Jfcm91dGluZSkobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhU3RyZWFtICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCisjZGVmaW5lIENBTUVSQV9NQVhfQ09OU1VNRVJfQkFUQ0hfQlVGRkVSX1NJWkUgICAxNgorI2RlZmluZSBDQU1FUkFfTUlOX1ZJREVPX0JBVENIX0JVRkZFUlMgICAgICAgICAgMworCisKK2NsYXNzIFFDYW1lcmFTdHJlYW0KK3sKK3B1YmxpYzoKKyAgICBRQ2FtZXJhU3RyZWFtKFFDYW1lcmFBbGxvY2F0b3IgJmFsbG9jYXRvciwKKyAgICAgICAgICAgIHVpbnQzMl90IGNhbUhhbmRsZSwgdWludDMyX3QgY2hJZCwKKyAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtT3BzLCBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAorICAgICAgICAgICAgYm9vbCBkZWZmZXJlZCA9IGZhbHNlLCBjYW1fcm90YXRpb25fdCBvbmxpbmVfcm90YXRpb24gPSBST1RBVEVfMCk7CisgICAgdmlydHVhbCB+UUNhbWVyYVN0cmVhbSgpOworICAgIHZpcnR1YWwgaW50MzJfdCBpbml0KFFDYW1lcmFIZWFwTWVtb3J5ICpzdHJlYW1JbmZvQnVmLAorICAgICAgICAgICAgUUNhbWVyYUhlYXBNZW1vcnkgKm1pc2NCdWYsCisgICAgICAgICAgICB1aW50OF90IG1pblN0cmVhbUJ1Zk51bSwKKyAgICAgICAgICAgIHN0cmVhbV9jYl9yb3V0aW5lIHN0cmVhbV9jYiwKKyAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICAgICAgYm9vbCBiRHluYWxsb2NCdWYpOworICAgIHZpcnR1YWwgaW50MzJfdCBwcm9jZXNzWm9vbURvbmUocHJldmlld19zdHJlYW1fb3BzX3QgKnByZXZpZXdXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fY3JvcF9kYXRhX3QgJmNyb3BfaW5mbyk7CisgICAgdmlydHVhbCBpbnQzMl90IGJ1ZkRvbmUodWludDMyX3QgaW5kZXgpOworICAgIHZpcnR1YWwgaW50MzJfdCBidWZEb25lKGNvbnN0IHZvaWQgKm9wYXF1ZSwgYm9vbCBpc01ldGFEYXRhKTsKKyAgICB2aXJ0dWFsIGludDMyX3QgcHJvY2Vzc0RhdGFOb3RpZnkobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpidWZzKTsKKyAgICB2aXJ0dWFsIGludDMyX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIGludDMyX3Qgc3RvcCgpOworCisgICAgLyogVXNlZCBmb3IgZGVmZmVyZWQgYWxsb2NhdGlvbiBvZiBidWZmZXJzICovCisgICAgdmlydHVhbCBpbnQzMl90IGFsbG9jYXRlQnVmZmVycygpOworICAgIHZpcnR1YWwgaW50MzJfdCBtYXBCdWZmZXJzKCk7CisgICAgdmlydHVhbCBpbnQzMl90IHJlbGVhc2VCdWZmcygpOworCisgICAgc3RhdGljIHZvaWQgZGF0YU5vdGlmeUNCKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVjdmRfZnJhbWUsIHZvaWQgKnVzZXJkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCBkYXRhTm90aWZ5U1lOQ0NCKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVjdmRfZnJhbWUsCisgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisgICAgc3RhdGljIHZvaWQgKmRhdGFQcm9jUm91dGluZSh2b2lkICpkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCAqQnVmQWxsb2NSb3V0aW5lKHZvaWQgKmRhdGEpOworICAgIHVpbnQzMl90IGdldE15SGFuZGxlKCkgY29uc3Qge3JldHVybiBtSGFuZGxlO30KKyAgICBib29sIGlzVHlwZU9mKGNhbV9zdHJlYW1fdHlwZV90IHR5cGUpOworICAgIGJvb2wgaXNPcmlnbmFsVHlwZU9mKGNhbV9zdHJlYW1fdHlwZV90IHR5cGUpOworICAgIGludDMyX3QgZ2V0RnJhbWVPZmZzZXQoY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCAmb2Zmc2V0KTsKKyAgICBpbnQzMl90IGdldENyb3BJbmZvKGNhbV9yZWN0X3QgJmNyb3ApOworICAgIGludDMyX3Qgc2V0Q3JvcEluZm8oY2FtX3JlY3RfdCBjcm9wKTsKKyAgICBpbnQzMl90IGdldEZyYW1lRGltZW5zaW9uKGNhbV9kaW1lbnNpb25fdCAmZGltKTsKKyAgICBpbnQzMl90IGdldEZvcm1hdChjYW1fZm9ybWF0X3QgJmZtdCk7CisgICAgUUNhbWVyYU1lbW9yeSAqZ2V0U3RyZWFtQnVmcygpIHtyZXR1cm4gbVN0cmVhbUJ1ZnM7fTsKKyAgICBRQ2FtZXJhSGVhcE1lbW9yeSAqZ2V0U3RyZWFtSW5mb0J1ZigpIHtyZXR1cm4gbVN0cmVhbUluZm9CdWY7fTsKKyAgICBRQ2FtZXJhSGVhcE1lbW9yeSAqZ2V0TWlzY0J1ZigpIHtyZXR1cm4gbU1pc2NCdWY7fTsKKyAgICB1aW50MzJfdCBnZXRNeVNlcnZlcklEKCk7CisgICAgY2FtX3N0cmVhbV90eXBlX3QgZ2V0TXlUeXBlKCk7CisgICAgY2FtX3N0cmVhbV90eXBlX3QgZ2V0TXlPcmlnaW5hbFR5cGUoKTsKKyAgICBpbnQzMl90IGFjcXVpcmVTdHJlYW1CdWZzKCk7CisKKyAgICBpbnQzMl90IG1hcEJ1Zih1aW50OF90IGJ1Zl90eXBlLCB1aW50MzJfdCBidWZfaWR4LAorICAgICAgICAgICAgaW50MzJfdCBwbGFuZV9pZHgsIGludCBmZCwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsID0gTlVMTCk7CisgICAgaW50MzJfdCBtYXBCdWZzKGNhbV9idWZfbWFwX3R5cGVfbGlzdCBidWZNYXBMaXN0LAorICAgICAgICAgICAgbW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKm9wc190YmwgPSBOVUxMKTsKKyAgICBpbnQzMl90IG1hcE5ld0J1ZmZlcih1aW50MzJfdCBpbmRleCk7CisgICAgaW50MzJfdCB1bm1hcEJ1Zih1aW50OF90IGJ1Zl90eXBlLCB1aW50MzJfdCBidWZfaWR4LCBpbnQzMl90IHBsYW5lX2lkeCwKKyAgICAgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsID0gTlVMTCk7CisgICAgaW50MzJfdCBzZXRQYXJhbWV0ZXIoY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90ICZwYXJhbSk7CisgICAgaW50MzJfdCBnZXRQYXJhbWV0ZXIoY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90ICZwYXJhbSk7CisgICAgaW50MzJfdCBzeW5jUnVudGltZVBhcmFtcygpOworICAgIGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCBnZXRPdXRwdXRDcm9wKCkgeyByZXR1cm4gbV9PdXRwdXRDcm9wO307CisgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90IGdldEltZ1Byb3AoKSB7IHJldHVybiBtX0ltZ1Byb3A7fTsKKworICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VGcmFtZURhdGEodm9pZCAqZGF0YSwgdm9pZCAqdXNlcl9kYXRhKTsKKyAgICBpbnQzMl90IGNvbmZpZ1N0cmVhbSgpOworICAgIGJvb2wgaXNEZWZmZXJlZCgpIGNvbnN0IHsgcmV0dXJuIG1EZWZmZXJlZEFsbG9jYXRpb247IH0KKyAgICBib29sIGlzU3luY0NCRW5hYmxlZCgpIHtyZXR1cm4gbVN5bmNDQkVuYWJsZWQ7fTsKKyAgICB2b2lkIGRlbGV0ZVN0cmVhbSgpOworCisgICAgdWludDhfdCBnZXRCdWZmZXJDb3VudCgpIHsgcmV0dXJuIG1OdW1CdWZzOyB9CisgICAgdWludDMyX3QgZ2V0Q2hhbm5lbEhhbmRsZSgpIHsgcmV0dXJuIG1DaGFubmVsSGFuZGxlOyB9CisgICAgaW50MzJfdCBnZXROdW1RdWV1ZWRCdWYoKTsKKworICAgIHVpbnQzMl90IG1EdW1wRnJhbWU7CisgICAgdWludDMyX3QgbUR1bXBNZXRhRnJhbWU7CisgICAgdWludDMyX3QgbUR1bXBTa2lwQ250OworCisgICAgdm9pZCBjb25kX3dhaXQoKTsKKyAgICB2b2lkIGNvbmRfc2lnbmFsKGJvb2wgZm9yY2VFeGl0ID0gZmFsc2UpOworCisgICAgaW50MzJfdCBzZXRTeW5jRGF0YUNCKHN0cmVhbV9jYl9yb3V0aW5lIGRhdGFfY2IpOworICAgIC8vU3RyZWFtIHRpbWUgc3RhbXAuIFdlIG5lZWQgdGhpcyBmb3IgcHJldmlldyBzdHJlYW0gdG8gdXBkYXRlIGRpc3BsYXkKKyAgICBuc2Vjc190IG1TdHJlYW1UaW1lc3RhbXA7CisKKyAgICAvL0ZyYW1lIEJ1ZmZlciB3aWxsIGJlIHN0b3JlZCBoZXJlIGluIGNhc2UgZnJhbWV3b3JrIGJhdGNoIG1vZGUuCisgICAgY2FtZXJhX21lbW9yeV90ICptQ3VyTWV0YU1lbW9yeTsgLy8gQ3VycmVudCBtZXRhZGF0YSBidWZmZXIgcHRyCisgICAgaW50OF90IG1DdXJCdWZJbmRleDsgICAgICAgICAgICAgLy8gQnVmZmVyIGNvdW50IGZpbGxlZCBpbiBjdXJyZW50IG1ldGFkYXRhCisgICAgaW50OF90IG1DdXJNZXRhSW5kZXg7ICAgICAgICAgICAgLy8gQWN0aXZlIG1ldGFkYXRhIGJ1ZmZlciBpbmRleAorCisgICAgbnNlY3NfdCBtRmlyc3RUaW1lU3RhbXA7ICAgICAgICAgLy8gVGltZXN0YW1wIG9mIGZpcnN0IGZyYW1lIGluIE1ldGFkYXRhLgorCisgICAgLy8gQnVmZmVyIHN0b3JhZ2Ugc3RydWN0dXJlLgorICAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgYm9vbCBjb25zdW1lck93bmVkOyAvLyBNZXRhZGF0YSBpcyB3aXRoIENvbnN1bWVyIGlmIFRSVUUKKyAgICAgICAgdWludDhfdCBudW1CdWZmZXJzOyAvLyBOdW0gb2YgYnVmZmVyIG5lZWQgdG8gcmVsZWFzZWQKKyAgICAgICAgdWludDhfdCBidWZfaW5kZXhbQ0FNRVJBX01BWF9DT05TVU1FUl9CQVRDSF9CVUZGRVJfU0laRV07CisgICAgfSBNZXRhTWVtb3J5OworICAgIE1ldGFNZW1vcnkgbVN0cmVhbU1ldGFNZW1vcnlbQ0FNRVJBX01JTl9WSURFT19CQVRDSF9CVUZGRVJTXTsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtQ2FtSGFuZGxlOworICAgIHVpbnQzMl90IG1DaGFubmVsSGFuZGxlOworICAgIHVpbnQzMl90IG1IYW5kbGU7IC8vIHN0cmVhbSBoYW5kbGUgZnJvbSBtbS1jYW1lcmEtaW50ZXJmYWNlCisgICAgbW1fY2FtZXJhX29wc190ICptQ2FtT3BzOworICAgIGNhbV9zdHJlYW1faW5mb190ICptU3RyZWFtSW5mbzsgLy8gcHRyIHRvIHN0cmVhbSBpbmZvIGJ1ZgorICAgIG1tX2NhbWVyYV9zdHJlYW1fbWVtX3Z0YmxfdCBtTWVtVnRibDsKKyAgICB1aW50OF90IG1OdW1CdWZzOworICAgIHVpbnQ4X3QgbU51bVBsYW5lQnVmczsKKyAgICB1aW50OF90IG1OdW1CdWZzTmVlZEFsbG9jOworICAgIHVpbnQ4X3QgKm1SZWdGbGFnczsKKyAgICBzdHJlYW1fY2Jfcm91dGluZSBtRGF0YUNCOworICAgIHN0cmVhbV9jYl9yb3V0aW5lIG1TWU5DRGF0YUNCOworICAgIHZvaWQgKm1Vc2VyRGF0YTsKKworICAgIFFDYW1lcmFRdWV1ZSAgICAgbURhdGFROworICAgIFFDYW1lcmFDbWRUaHJlYWQgbVByb2NUaDsgLy8gdGhyZWFkIGZvciBkYXRhQ0IKKworICAgIFFDYW1lcmFIZWFwTWVtb3J5ICptU3RyZWFtSW5mb0J1ZjsKKyAgICBRQ2FtZXJhSGVhcE1lbW9yeSAqbU1pc2NCdWY7CisgICAgUUNhbWVyYU1lbW9yeSAqbVN0cmVhbUJ1ZnM7CisgICAgUUNhbWVyYU1lbW9yeSAqbVN0cmVhbUJhdGNoQnVmczsKKyAgICBRQ2FtZXJhQWxsb2NhdG9yICZtQWxsb2NhdG9yOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1CdWZEZWZzOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1QbGFuZUJ1ZkRlZnM7CisgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCBtRnJhbWVMZW5PZmZzZXQ7CisgICAgY2FtX3BhZGRpbmdfaW5mb190IG1QYWRkaW5nSW5mbzsKKyAgICBjYW1fcmVjdF90IG1Dcm9wSW5mbzsKKyAgICBjYW1fcm90YXRpb25fdCBtT25saW5lUm90YXRpb247CisgICAgcHRocmVhZF9tdXRleF90IG1Dcm9wTG9jazsgLy8gbG9jayB0byBwcm90ZWN0IGNyb3AgaW5mbworICAgIHB0aHJlYWRfbXV0ZXhfdCBtUGFyYW1ldGVyTG9jazsgLy8gbG9jayB0byBzeW5jIGFjY2VzcyB0byBwYXJhbWV0ZXJzCisgICAgYm9vbCBtU3RyZWFtQnVmc0FjcXVpcmVkOworICAgIGJvb2wgbV9iQWN0aXZlOyAvLyBpZiBzdHJlYW0gbVByb2NUaCBpcyBhY3RpdmUKKyAgICBib29sIG1EeW5CdWZBbGxvYzsgLy8gYWxsb3cgYnVmIGFsbG9jYXRpb24gaW4gMiBzdGVwcworICAgIHB0aHJlYWRfdCBtQnVmQWxsb2NQaWQ7CisgICAgbW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgbV9NZW1PcHNUYmw7CisgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90IG1fT3V0cHV0Q3JvcDsKKyAgICBjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgbV9JbWdQcm9wOworCisgICAgc3RhdGljIGludDMyX3QgZ2V0X2J1ZnMoCisgICAgICAgICAgICAgICAgICAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90ICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpudW1fYnVmcywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKippbml0aWFsX3JlZ19mbGFnLAorICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqKmJ1ZnMsCisgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisKKyAgICBzdGF0aWMgaW50MzJfdCBnZXRfYnVmc19kZWZmZXJlZCgKKyAgICAgICAgICAgIGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QgKm9mZnNldCwKKyAgICAgICAgICAgIHVpbnQ4X3QgKm51bV9idWZzLAorICAgICAgICAgICAgdWludDhfdCAqKmluaXRpYWxfcmVnX2ZsYWcsCisgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICoqYnVmcywKKyAgICAgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsLAorICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKworICAgIHN0YXRpYyBpbnQzMl90IHB1dF9idWZzKAorICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKm9wc190YmwsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworCisgICAgc3RhdGljIGludDMyX3QgcHV0X2J1ZnNfZGVmZmVyZWQoCisgICAgICAgICAgICBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCwKKyAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisKKyAgICBzdGF0aWMgaW50MzJfdCBzZXRfY29uZmlnX29wcygKKyAgICAgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsLAorICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKworICAgIHN0YXRpYyBpbnQzMl90IGludmFsaWRhdGVfYnVmKHVpbnQzMl90IGluZGV4LCB2b2lkICp1c2VyX2RhdGEpOworICAgIHN0YXRpYyBpbnQzMl90IGNsZWFuX2ludmFsaWRhdGVfYnVmKHVpbnQzMl90IGluZGV4LCB2b2lkICp1c2VyX2RhdGEpOworCisgICAgc3RhdGljIGludDMyX3QgYmFja2dyb3VuZEFsbG9jYXRlKHZvaWQqIGRhdGEpOworICAgIHN0YXRpYyBpbnQzMl90IGJhY2tncm91bmRNYXAodm9pZCogZGF0YSk7CisKKyAgICBpbnQzMl90IGdldEJ1ZnMoY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCAqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbnVtX2J1ZnMsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqaW5pdGlhbF9yZWdfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKipidWZzLAorICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKm9wc190YmwpOworICAgIGludDMyX3QgZ2V0QnVmc0RlZmVycmVkKGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QgKm9mZnNldCwKKyAgICAgICAgICAgIHVpbnQ4X3QgKm51bV9idWZzLAorICAgICAgICAgICAgdWludDhfdCAqKmluaXRpYWxfcmVnX2ZsYWcsCisgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICoqYnVmcywKKyAgICAgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsKTsKKyAgICBpbnQzMl90IHB1dEJ1ZnMobW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKm9wc190YmwpOworICAgIGludDMyX3QgcHV0QnVmc0RlZmZlcmVkKCk7CisKKyAgICAvKiBVc2VkIGZvciBkZWZmZXJlZCBhbGxvY2F0aW9uIG9mIGJ1ZmZlcnMgKi8KKyAgICBpbnQzMl90IGFsbG9jYXRlQmF0Y2hCdWZzKGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QgKm9mZnNldCwKKyAgICAgICAgICAgIHVpbnQ4X3QgKm51bV9idWZzLCB1aW50OF90ICoqaW5pdGlhbF9yZWdfZmxhZywKKyAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKipidWZzLCBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCk7CisKKyAgICBpbnQzMl90IHJlbGVhc2VCYXRjaEJ1ZnMobW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKm9wc190YmwpOworCisgICAgaW50MzJfdCBpbnZhbGlkYXRlQnVmKHVpbnQzMl90IGluZGV4KTsKKyAgICBpbnQzMl90IGNsZWFuSW52YWxpZGF0ZUJ1Zih1aW50MzJfdCBpbmRleCk7CisgICAgaW50MzJfdCBjYWxjT2Zmc2V0KGNhbV9zdHJlYW1faW5mb190ICpzdHJlYW1JbmZvKTsKKyAgICBpbnQzMl90IHVubWFwU3RyZWFtSW5mb0J1ZigpOworICAgIGludDMyX3QgcmVsZWFzZVN0cmVhbUluZm9CdWYoKTsKKyAgICBpbnQzMl90IHJlbGVhc2VNaXNjQnVmKCk7CisgICAgaW50MzJfdCBtYXBCdWZzKFFDYW1lcmFNZW1vcnkgKmhlYXBCdWYsIGNhbV9tYXBwaW5nX2J1Zl90eXBlIGJ1ZlR5cGUsCisgICAgICAgICAgICBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCA9IE5VTEwpOworICAgIGludDMyX3QgdW5NYXBCdWYoUUNhbWVyYU1lbW9yeSAqaGVhcEJ1ZiwgY2FtX21hcHBpbmdfYnVmX3R5cGUgYnVmVHlwZSwKKyAgICAgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsID0gTlVMTCk7CisKKyAgICBib29sIG1EZWZmZXJlZEFsbG9jYXRpb247CisKKyAgICBib29sIHdhaXRfZm9yX2NvbmQ7CisgICAgcHRocmVhZF9tdXRleF90IG1fbG9jazsKKyAgICBwdGhyZWFkX2NvbmRfdCBtX2NvbmQ7CisKKyAgICBCYWNrZ3JvdW5kVGFzayBtQWxsb2NUYXNrOworICAgIHVpbnQzMl90IG1BbGxvY1Rhc2tJZDsKKyAgICBCYWNrZ3JvdW5kVGFzayBtTWFwVGFzazsKKyAgICB1aW50MzJfdCBtTWFwVGFza0lkOworCisgICAgYm9vbCBtU3luY0NCRW5hYmxlZDsKK307CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCisKKyNlbmRpZiAvKiBfX1FDQU1FUkFfU1RSRUFNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhVGhlcm1hbEFkYXB0ZXIuY3BwIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9RQ2FtZXJhVGhlcm1hbEFkYXB0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NzlmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFUaGVybWFsQWRhcHRlci5jcHAKQEAgLTAsMCArMSwxNzcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJRQ2FtZXJhVGhlcm1hbEFkYXB0ZXIiCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiUUNhbWVyYTJIV0kuaCIKKyNpbmNsdWRlICJRQ2FtZXJhVGhlcm1hbEFkYXB0ZXIuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorfQorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisKK1FDYW1lcmFUaGVybWFsQWRhcHRlciYgUUNhbWVyYVRoZXJtYWxBZGFwdGVyOjpnZXRJbnN0YW5jZSgpCit7CisgICAgc3RhdGljIFFDYW1lcmFUaGVybWFsQWRhcHRlciBpbnN0YW5jZTsKKyAgICByZXR1cm4gaW5zdGFuY2U7Cit9CisKK1FDYW1lcmFUaGVybWFsQWRhcHRlcjo6UUNhbWVyYVRoZXJtYWxBZGFwdGVyKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjayhOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWdpc3RlcihOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVW5yZWdpc3RlcihOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSGFuZGxlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1jb3JkZXJIYW5kbGUoMCkKK3sKK30KKworaW50IFFDYW1lcmFUaGVybWFsQWRhcHRlcjo6aW5pdChRQ2FtZXJhVGhlcm1hbENhbGxiYWNrICp0aGVybWFsQ2IpCit7CisgICAgY29uc3QgY2hhciAqZXJyb3IgPSBOVUxMOworICAgIGludCByYyA9IE5PX0VSUk9SOworCisgICAgTE9HRCgiRSIpOworICAgIG1IYW5kbGUgPSBkbG9wZW4oIi92ZW5kb3IvbGliL2xpYnRoZXJtYWxjbGllbnQuc28iLCBSVExEX05PVyk7CisgICAgaWYgKCFtSGFuZGxlKSB7CisgICAgICAgIGVycm9yID0gZGxlcnJvcigpOworICAgICAgICBMT0dFKCJkbG9wZW4gZmFpbGVkIHdpdGggZXJyb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPyBlcnJvciA6ICIiKTsKKyAgICAgICAgcmMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICAqKHZvaWQgKiopJm1SZWdpc3RlciA9IGRsc3ltKG1IYW5kbGUsICJ0aGVybWFsX2NsaWVudF9yZWdpc3Rlcl9jYWxsYmFjayIpOworICAgIGlmICghbVJlZ2lzdGVyKSB7CisgICAgICAgIGVycm9yID0gZGxlcnJvcigpOworICAgICAgICBMT0dFKCJkbHN5bSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yID8gZXJyb3I6ICIiKTsKKyAgICAgICAgcmMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICBnb3RvIGVycm9yMjsKKyAgICB9CisgICAgKih2b2lkICoqKSZtVW5yZWdpc3RlciA9IGRsc3ltKG1IYW5kbGUsICJ0aGVybWFsX2NsaWVudF91bnJlZ2lzdGVyX2NhbGxiYWNrIik7CisgICAgaWYgKCFtVW5yZWdpc3RlcikgeworICAgICAgICBlcnJvciA9IGRsZXJyb3IoKTsKKyAgICAgICAgTE9HRSgiZGxzeW0gZmFpbGVkIHdpdGggZXJyb3IgY29kZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICBlcnJvciA/IGVycm9yOiAiIik7CisgICAgICAgIHJjID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgZ290byBlcnJvcjI7CisgICAgfQorCisgICAgbUNhbGxiYWNrID0gdGhlcm1hbENiOworCisgICAgLy8gUmVnaXN0ZXIgY2FtZXJhIGFuZCBjYW1jb3JkZXIgY2FsbGJhY2tzCisgICAgbUNhbWVyYUhhbmRsZSA9IG1SZWdpc3RlcihtU3RyQ2FtZXJhLCB0aGVybWFsQ2FsbGJhY2ssIE5VTEwpOworICAgIGlmIChtQ2FtZXJhSGFuZGxlIDwgMCkgeworICAgICAgICBMT0dFKCJ0aGVybWFsX2NsaWVudF9yZWdpc3Rlcl9jYWxsYmFjayBmYWlsZWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUpOworICAgICAgICByYyA9IFVOS05PV05fRVJST1I7CisgICAgICAgIGdvdG8gZXJyb3IyOworICAgIH0KKyAgICBtQ2FtY29yZGVySGFuZGxlID0gbVJlZ2lzdGVyKG1TdHJDYW1jb3JkZXIsIHRoZXJtYWxDYWxsYmFjaywgTlVMTCk7CisgICAgaWYgKG1DYW1jb3JkZXJIYW5kbGUgPCAwKSB7CisgICAgICAgIExPR0UoInRoZXJtYWxfY2xpZW50X3JlZ2lzdGVyX2NhbGxiYWNrIGZhaWxlZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWNvcmRlckhhbmRsZSk7CisgICAgICAgIHJjID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgZ290byBlcnJvcjM7CisgICAgfQorCisgICAgTE9HRCgiWCIpOworICAgIHJldHVybiByYzsKKworZXJyb3IzOgorICAgIG1DYW1jb3JkZXJIYW5kbGUgPSAwOworICAgIG1VbnJlZ2lzdGVyKG1DYW1lcmFIYW5kbGUpOworZXJyb3IyOgorICAgIG1DYW1lcmFIYW5kbGUgPSAwOworICAgIGRsY2xvc2UobUhhbmRsZSk7CisgICAgbUhhbmRsZSA9IE5VTEw7CitlcnJvcjoKKyAgICBMT0dEKCJYIik7CisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIFFDYW1lcmFUaGVybWFsQWRhcHRlcjo6ZGVpbml0KCkKK3sKKyAgICBMT0dEKCJFIik7CisgICAgaWYgKG1VbnJlZ2lzdGVyKSB7CisgICAgICAgIGlmIChtQ2FtZXJhSGFuZGxlKSB7CisgICAgICAgICAgICBtVW5yZWdpc3RlcihtQ2FtZXJhSGFuZGxlKTsKKyAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2FtY29yZGVySGFuZGxlKSB7CisgICAgICAgICAgICBtVW5yZWdpc3RlcihtQ2FtY29yZGVySGFuZGxlKTsKKyAgICAgICAgICAgIG1DYW1jb3JkZXJIYW5kbGUgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtSGFuZGxlKQorICAgICAgICBkbGNsb3NlKG1IYW5kbGUpOworCisgICAgbUhhbmRsZSA9IE5VTEw7CisgICAgbVJlZ2lzdGVyID0gTlVMTDsKKyAgICBtVW5yZWdpc3RlciA9IE5VTEw7CisgICAgbUNhbGxiYWNrID0gTlVMTDsKKyAgICBMT0dEKCJYIik7Cit9CisKK2NoYXIgUUNhbWVyYVRoZXJtYWxBZGFwdGVyOjptU3RyQ2FtZXJhW10gPSAiY2FtZXJhIjsKK2NoYXIgUUNhbWVyYVRoZXJtYWxBZGFwdGVyOjptU3RyQ2FtY29yZGVyW10gPSAiY2FtY29yZGVyIjsKKworaW50IFFDYW1lcmFUaGVybWFsQWRhcHRlcjo6dGhlcm1hbENhbGxiYWNrKGludCBsZXZlbCwKKyAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSwgdm9pZCAqZGF0YSkKK3sKKyAgICBpbnQgcmMgPSAwOworICAgIExPR0QoIkUiKTsKKyAgICBRQ2FtZXJhVGhlcm1hbENhbGxiYWNrICptY2IgPSBnZXRJbnN0YW5jZSgpLm1DYWxsYmFjazsKKworICAgIGlmIChtY2IpIHsKKyAgICAgICAgbWNiLT5zZXRUaGVybWFsTGV2ZWwoKHFjYW1lcmFfdGhlcm1hbF9sZXZlbF9lbnVtX3QpIGxldmVsKTsKKyAgICAgICAgcmMgPSBtY2ItPnRoZXJtYWxFdnRIYW5kbGUobWNiLT5nZXRUaGVybWFsTGV2ZWwoKSwgdXNlcmRhdGEsIGRhdGEpOworICAgIH0KKyAgICBMT0dEKCJYIik7CisgICAgcmV0dXJuIHJjOworfQorCitxY2FtZXJhX3RoZXJtYWxfbGV2ZWxfZW51bV90ICpRQ2FtZXJhVGhlcm1hbENhbGxiYWNrOjpnZXRUaGVybWFsTGV2ZWwoKSB7CisgICAgcmV0dXJuICZtTGV2ZWw7Cit9CisKK3ZvaWQgUUNhbWVyYVRoZXJtYWxDYWxsYmFjazo6c2V0VGhlcm1hbExldmVsKHFjYW1lcmFfdGhlcm1hbF9sZXZlbF9lbnVtX3QgbGV2ZWwpIHsKKyAgICBtTGV2ZWwgPSBsZXZlbDsKK30KK307IC8vbmFtZXNwYWNlIHFjYW1lcmEKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvUUNhbWVyYVRoZXJtYWxBZGFwdGVyLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFUaGVybWFsQWRhcHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZmM5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML1FDYW1lcmFUaGVybWFsQWRhcHRlci5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMywgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19RQ0FNRVJBX1RIRVJNQUxfQURBUFRFUl9fCisjZGVmaW5lIF9fUUNBTUVSQV9USEVSTUFMX0FEQVBURVJfXworCituYW1lc3BhY2UgcWNhbWVyYSB7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUUNBTUVSQV9USEVSTUFMX05PX0FESlVTVE1FTlQgPSAwLAorICAgIFFDQU1FUkFfVEhFUk1BTF9TTElHSFRfQURKVVNUTUVOVCwKKyAgICBRQ0FNRVJBX1RIRVJNQUxfQklHX0FESlVTVE1FTlQsCisgICAgUUNBTUVSQV9USEVSTUFMX01BWF9BREpVU1RNRU5ULAorICAgIFFDQU1FUkFfVEhFUk1BTF9TSFVURE9XTiA9IDEwCit9IHFjYW1lcmFfdGhlcm1hbF9sZXZlbF9lbnVtX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUUNBTUVSQV9USEVSTUFMX0FESlVTVF9GUFMsCisgICAgUUNBTUVSQV9USEVSTUFMX0FESlVTVF9GUkFNRVNLSVAsCit9IHFjYW1lcmFfdGhlcm1hbF9tb2RlOworCitjbGFzcyBRQ2FtZXJhVGhlcm1hbENhbGxiYWNrCit7CitwdWJsaWM6CisgICAgdmlydHVhbCBpbnQgdGhlcm1hbEV2dEhhbmRsZShxY2FtZXJhX3RoZXJtYWxfbGV2ZWxfZW51bV90ICpsZXZlbCwKKyAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhLCB2b2lkICpkYXRhKSA9IDA7CisgICAgdmlydHVhbCB+UUNhbWVyYVRoZXJtYWxDYWxsYmFjaygpIHt9CisgICAgcWNhbWVyYV90aGVybWFsX2xldmVsX2VudW1fdCAqZ2V0VGhlcm1hbExldmVsKCk7CisgICAgdm9pZCBzZXRUaGVybWFsTGV2ZWwocWNhbWVyYV90aGVybWFsX2xldmVsX2VudW1fdCBsZXZlbCk7CisKK3ByaXZhdGU6CisgICAgcWNhbWVyYV90aGVybWFsX2xldmVsX2VudW1fdCBtTGV2ZWw7Cit9OworCitjbGFzcyBRQ2FtZXJhVGhlcm1hbEFkYXB0ZXIKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgUUNhbWVyYVRoZXJtYWxBZGFwdGVyJiBnZXRJbnN0YW5jZSgpOworCisgICAgaW50IGluaXQoUUNhbWVyYVRoZXJtYWxDYWxsYmFjayAqdGhlcm1hbENiKTsKKyAgICB2b2lkIGRlaW5pdCgpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBjaGFyIG1TdHJDYW1lcmFbXTsKKyAgICBzdGF0aWMgY2hhciBtU3RyQ2FtY29yZGVyW107CisKKyAgICBzdGF0aWMgaW50IHRoZXJtYWxDYWxsYmFjayhpbnQgbGV2ZWwsIHZvaWQgKnVzZXJkYXRhLCB2b2lkICpkYXRhKTsKKworICAgIFFDYW1lcmFUaGVybWFsQ2FsbGJhY2sgKm1DYWxsYmFjazsKKyAgICB2b2lkICptSGFuZGxlOworICAgIGludCAoKm1SZWdpc3RlcikoY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGludCAoKmNhbGxiYWNrKShpbnQsIHZvaWQgKnVzZXJkYXRhLCB2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSk7CisgICAgaW50ICgqbVVucmVnaXN0ZXIpKGludCBoYW5kbGUpOworICAgIGludCBtQ2FtZXJhSGFuZGxlOworICAgIGludCBtQ2FtY29yZGVySGFuZGxlOworCisgICAgUUNhbWVyYVRoZXJtYWxBZGFwdGVyKCk7CisgICAgUUNhbWVyYVRoZXJtYWxBZGFwdGVyKFFDYW1lcmFUaGVybWFsQWRhcHRlciBjb25zdCYgY29weSk7IC8vIG5vdCBpbXBsZW1lbnRlZAorICAgIFFDYW1lcmFUaGVybWFsQWRhcHRlciYgb3BlcmF0b3I9KFFDYW1lcmFUaGVybWFsQWRhcHRlciBjb25zdCYgY29weSk7IC8vIG5vdCBpbXBsZW1lbnRlZAorCit9OworCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQorCisjZW5kaWYgLyogX19RQ0FNRVJBX1RIRVJNQUxfQURBUFRFUl9fICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFML2FuZHJvaWQvUUNhbWVyYTJFeHRlcm5hbC5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9hbmRyb2lkL1FDYW1lcmEyRXh0ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2U4ZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC9hbmRyb2lkL1FDYW1lcmEyRXh0ZXJuYWwuaApAQCAtMCwwICsxLDQ3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorKiBtZXQ6CisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisjaWZuZGVmIF9fUUNBTUVSQTJFWFRFUk5BTF9IX18KKyNkZWZpbmUgX19RQ0FNRVJBMkVYVEVSTkFMX0hfXworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKy8vIERpc3BsYXkgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiUVNlcnZpY2VVdGlscy5oIgorCituYW1lc3BhY2UgcWNhbWVyYSB7CisKK2lubGluZSBhbmRyb2lkOjpzdGF0dXNfdCBzZXRDYW1lcmFMYXVuY2hTdGF0dXModWludDMyX3Qgb24pIHsKKyAgICByZXR1cm4gOjpzZXRDYW1lcmFMYXVuY2hTdGF0dXMob24pOworfQorCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQorCisjZW5kaWYgLyogX19RQ0FNRVJBMkVYVEVSTkFMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC90ZXN0L0FuZHJvaWQubWsgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML3Rlc3QvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGExODZlCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC90ZXN0L0FuZHJvaWQubWsKQEAgLTAsMCArMSw2NCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgcWNhbWVyYV90ZXN0LmNwcCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCisgICAgbGliZGwgXAorICAgIGxpYnVpIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJiaW5kZXIgXAorICAgIGxpYm1lZGlhIFwKKyAgICBsaWJ1aSBcCisgICAgbGliZ3VpIFwKKyAgICBsaWJjYW1lcmFfY2xpZW50IFwKKyAgICBsaWJza2lhIFwKKyAgICBsaWJzdGFnZWZyaWdodCBcCisgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCisKK2lmbmVxICgxLCQoZmlsdGVyIDEsJChzaGVsbCBlY2hvICIkJCgoICQoUExBVEZPUk1fU0RLX1ZFUlNJT04pID49IDE4ICkpIiApKSkKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBcCisgICAgbGlibWVkaWFfbmF0aXZlIFwKKworTE9DQUxfMzJfQklUX09OTFkgOj0gJChCT0FSRF9RVElfQ0FNRVJBXzMyQklUX09OTFkpCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfSkJfTVIxCisKK2VuZGlmCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgIGZyYW1ld29ya3MvYmFzZS9pbmNsdWRlL3VpIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9zdXJmYWNlZmxpbmdlciBcCisgICAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvY2FtZXJhIFwKKyAgICBmcmFtZXdvcmtzL2Jhc2UvaW5jbHVkZS9tZWRpYSBcCisgICAgZXh0ZXJuYWwvc2tpYS9pbmNsdWRlL2NvcmUgXAorICAgIGV4dGVybmFsL3NraWEvaW5jbHVkZS9pbWFnZXMgXAorICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9xY29tL2Rpc3BsYXkgXAorICAgIGhhcmR3YXJlL3Fjb20vY2FtZXJhL1FDYW1lcmEyL3N0YWNrL2NvbW1vbiBcCisgICAgaGFyZHdhcmUvcWNvbS9jYW1lcmEvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9pbmMgXAorICAgIGZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodCBcCisgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKyAgICAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvS0VSTkVMX09CSi91c3IvaW5jbHVkZQorCitMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvS0VSTkVMX09CSi91c3IKKworTE9DQUxfTU9EVUxFOj0gY2FtZXJhX3Rlc3QKK0xPQ0FMX01PRFVMRV9UQUdTOj0gdGVzdHMKKworTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyArPSAtTzAKKworaWZlcSAoMSwkKGZpbHRlciAxLCQoc2hlbGwgZWNobyAiJCQoKCAkKFBMQVRGT1JNX1NES19WRVJTSU9OKSA+PSAyMCApKSIgKSkpCisKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9TREtfMjBfT1JfSElHSEVSCisKK2lmZXEgKCQoVEFSR0VUX1VTRVNfQU9TUCksdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFZBTklMTEFfSEFMCitlbmRpZgorCitlbmRpZgorCisjaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFML3Rlc3QvcWNhbWVyYV90ZXN0LmNwcCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvdGVzdC9xY2FtZXJhX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDZjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML3Rlc3QvcWNhbWVyYV90ZXN0LmNwcApAQCAtMCwwICsxLDM3MTAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKworI2luY2x1ZGUgPHVpL0Rpc3BsYXlJbmZvLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50Lmg+CisjaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmEuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGN1dGlscy9tZW1vcnkuaD4KKyNpbmNsdWRlIDxTa0ltYWdlRGVjb2Rlci5oPgorI2luY2x1ZGUgPFNrSW1hZ2VFbmNvZGVyLmg+CisjaW5jbHVkZSA8TWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPE9NWF9JVkNvbW1vbi5oPgorI2luY2x1ZGUgPGZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8TWVkaWFNdXhlci5oPgorI2luY2x1ZGUgPGZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPE1lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8Z3JhbGxvY19wcml2Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAicWNhbWVyYV90ZXN0LmgiCisjaW5jbHVkZSAiY2FtX3R5cGVzLmgiCisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorCisjZGVmaW5lIFZJREVPX0JVRl9BTExJR04oc2l6ZSwgYWxsaWduKSBcCisgICgoKHNpemUpICsgKGFsbGlnbi0xKSkgJiAodHlwZW9mKHNpemUpKSh+KGFsbGlnbi0xKSkpCisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2ludCBDYW1lcmFDb250ZXh0OjpKcGVnSWR4ID0gMDsKK2ludCBDYW1lcmFDb250ZXh0OjptUGlQSWR4ID0gMDsKK2NvbnN0IGNoYXIgQ2FtZXJhQ29udGV4dDo6S0VZX1pTTFtdID0gInpzbCI7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJldmlld0NhbGxiYWNrCisgKgorICogREVTQ1JJUFRJT046IHByZXZpZXcgY2FsbGJhY2sgcHJldmlldyBtZXNhZ2VzIGFyZSBlbmFibGVkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtZW0gOiBwcmV2aWV3IGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgQ2FtZXJhQ29udGV4dDo6cHJldmlld0NhbGxiYWNrKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0pCit7CisgICAgcHJpbnRmKCJQUkVWSUVXIENhbGxiYWNrICVwIiwgbWVtLT5wb2ludGVyKCkpOworICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90KikgbWVtLT5wb2ludGVyKCk7CisgICAgaWYgKE5VTEwgIT0gcHRyKSB7CisgICAgICAgIHByaW50ZigiUFJWX0NCOiAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IDB4JXggMHgleCAweCV4IiwKKyAgICAgICAgICAgICAgICBwdHJbMF0sCisgICAgICAgICAgICAgICAgcHRyWzFdLAorICAgICAgICAgICAgICAgIHB0clsyXSwKKyAgICAgICAgICAgICAgICBwdHJbM10sCisgICAgICAgICAgICAgICAgcHRyWzRdLAorICAgICAgICAgICAgICAgIHB0cls1XSwKKyAgICAgICAgICAgICAgICBwdHJbNl0sCisgICAgICAgICAgICAgICAgcHRyWzddLAorICAgICAgICAgICAgICAgIHB0cls4XSwKKyAgICAgICAgICAgICAgICBwdHJbOV0pOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIgbm8gcHJldmlldyBmb3IgTlVMTCBDQlxuIik7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVzZUxvY2sKKyAqCisgKiBERVNDUklQVElPTjogTXV0ZXggbG9jayBmb3IgQ2FtZXJhQ29udGV4dAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBDYW1lcmFDb250ZXh0Ojp1c2VMb2NrKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgd2hpbGUgKG1JblVzZSkgeworICAgICAgICBtQ29uZC53YWl0KG1Mb2NrKTsKKyAgICB9CisgICAgbUluVXNlID0gdHJ1ZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzaWduYWxGaW5pc2hlZAorICoKKyAqIERFU0NSSVBUSU9OOiBNdXRleCB1bmxvY2sgQ2FtZXJhQ29udGV4dAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBDYW1lcmFDb250ZXh0OjpzaWduYWxGaW5pc2hlZCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIG1JblVzZSA9IGZhbHNlOworICAgIG1Db25kLnNpZ25hbCgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNhdmVGaWxlCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBmdW5jdGlvbiBmb3Igc2F2aW5nIGJ1ZmZlcnMgb24gZmlsZXN5c3RlbQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbWVtIDogYnVmZmVyIHRvIHNhdmUgdG8gZmlsZXN5c3RlbQorICogICBAcGF0aDogRmlsZSBwYXRoCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IENhbWVyYUNvbnRleHQ6OnNhdmVGaWxlKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0sIFN0cmluZzggcGF0aCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyICpidWZmID0gTlVMTDsKKyAgICBzc2l6ZV90IHNpemU7CisgICAgaW50IGZkID0gLTE7CisKKyAgICBpZiAobWVtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBmZCA9IG9wZW4ocGF0aCwgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQywgMDY1NSk7CisgICAgaWYoZmQgPCAwKSB7CisgICAgICAgIHByaW50ZigiVW5hYmxlIHRvIG9wZW4gZmlsZSAlcyAlc1xuIiwgcGF0aC5zdHJpbmcoKSwgc3RyZXJyb3IoZmQpKTsKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9CisKKyAgICBzaXplID0gKHNzaXplX3QpbWVtLT5zaXplKCk7CisgICAgaWYgKHNpemUgPD0gMCkgeworICAgICAgICBwcmludGYoIklNZW1vcnkgb2JqZWN0IGlzIG9mIHplcm8gc2l6ZVxuIik7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBidWZmID0gKHVuc2lnbmVkIGNoYXIgKiltZW0tPnBvaW50ZXIoKTsKKyAgICBpZiAoIWJ1ZmYpIHsKKyAgICAgICAgcHJpbnRmKCJCdWZmZXIgcG9pbnRlciBpcyBpbnZhbGlkXG4iKTsKKyAgICAgICAgY2xvc2UoZmQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChzaXplICE9IHdyaXRlKGZkLCBidWZmLCAoc2l6ZV90KXNpemUpKSB7CisgICAgICAgIHByaW50ZigiQmFkIFdyaXRlIGVycm9yICglZCklc1xuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHByaW50ZigiJXM6IGJ1ZmZlcj0lcCwgc2l6ZT0lbGxkIHN0b3JlZCBhdCAlc1xuIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZiwgKGxvbmcgbG9uZyBpbnQpIHNpemUsIHBhdGguc3RyaW5nKCkpOworCisgICAgaWYgKGZkID49IDApCisgICAgICAgIGNsb3NlKGZkKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBQaVBDb3B5VG9PbmVGaWxlCisgKgorICogREVTQ1JJUFRJT046IENvcHkgdGhlIHNtYWxsZXIgcGljdHVyZSB0byB0aGUgYmlnZ2VyIG9uZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAYml0bWFwMCA6IERlY29kZWQgaW1hZ2UgYnVmZmVyIDAKKyAqICAgQGJpdG1hcDEgOiBEZWNvZGVkIGltYWdlIGJ1ZmZlciAxCisgKgorICogUkVUVVJOICAgICA6IGRlY29kZWQgcGljdHVyZSBpbiBwaWN0dXJlIGluIFNrQml0bWFwCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1NrQml0bWFwICogQ2FtZXJhQ29udGV4dDo6UGlQQ29weVRvT25lRmlsZSgKKyAgICBTa0JpdG1hcCAqYml0bWFwMCwgU2tCaXRtYXAgKmJpdG1hcDEpCit7CisgICAgc2l6ZV90IHNpemUwOworICAgIHNpemVfdCBzaXplMTsKKyAgICBTa0JpdG1hcCAqc3JjOworICAgIFNrQml0bWFwICpkc3Q7CisgICAgdW5zaWduZWQgaW50IGRzdE9mZnNldDsKKyAgICB1bnNpZ25lZCBpbnQgc3JjT2Zmc2V0OworCisgICAgaWYgKGJpdG1hcDAgPT0gTlVMTCB8fCBiaXRtYXAxID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiBiaXRtYXAwIDogJXAsIGJpdG1hcDEgOiAlcFxuIiwgIGJpdG1hcDAsIGJpdG1hcDEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzaXplMCA9IGJpdG1hcDAtPmdldFNpemUoKTsKKyAgICBpZiAoc2l6ZTAgPD0gMCkgeworICAgICAgICBwcmludGYoIkRlY29kZWQgaW1hZ2UgMCBpcyBvZiB6ZXJvIHNpemVcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzaXplMSA9IGJpdG1hcDEtPmdldFNpemUoKTsKKyAgICAgICAgaWYgKHNpemUxIDw9IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiRGVjb2RlZCBpbWFnZSAxIGlzIG9mIHplcm8gc2l6ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgaWYgKHNpemUwID4gc2l6ZTEpIHsKKyAgICAgICAgZHN0ID0gYml0bWFwMDsKKyAgICAgICAgc3JjID0gYml0bWFwMTsKKyAgICB9IGVsc2UgaWYgKHNpemUxID4gc2l6ZTApeworICAgICAgICBkc3QgPSBiaXRtYXAxOworICAgICAgICBzcmMgPSBiaXRtYXAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiUGljdHVyZSBzaXplIHNob3VsZCBiZSB3aXRoIGRpZmZlcmVudCBzaXplIVxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludClzcmMtPmhlaWdodCgpOyBpKyspIHsKKyAgICAgICAgZHN0T2Zmc2V0ID0gaSAqICh1bnNpZ25lZCBpbnQpZHN0LT53aWR0aCgpICogbWZtdE11bHRpcGxpZXI7CisgICAgICAgIHNyY09mZnNldCA9IGkgKiAodW5zaWduZWQgaW50KXNyYy0+d2lkdGgoKSAqIG1mbXRNdWx0aXBsaWVyOworICAgICAgICBtZW1jcHkoKCh1bnNpZ25lZCBjaGFyICopZHN0LT5nZXRQaXhlbHMoKSkgKyBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyICopc3JjLT5nZXRQaXhlbHMoKSkgKyBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludClzcmMtPndpZHRoKCkgKiBtZm10TXVsdGlwbGllcik7CisgICAgfQorCisgICAgcmV0dXJuIGRzdDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkZWNvZGVKUEVHCisgKgorICogREVTQ1JJUFRJT046IGRlY29kZSBqcGVnIGlucHV0IGJ1ZmZlci4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1lbSAgICAgOiBidWZmZXIgdG8gZGVjb2RlCisgKiAgIEBza0JNICAgIDogZGVjb2RlZCBidWZmZXIKKyAqCisgKiBSRVRVUk4gICAgIDogc3RhdHVzX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0dXNfdCBDYW1lcmFDb250ZXh0OjpkZWNvZGVKUEVHKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0sIFNrQml0bWFwICpza0JNKQoreworI2lmbmRlZiBVU0VfU0RLXzIwX09SX0hJR0hFUgorICAgIFNrQml0bWFwOjpDb25maWcgcHJlZkNvbmZpZyA9IFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZzsKKyAgICBjb25zdCB2b2lkICpidWZmID0gTlVMTDsKKyAgICBzaXplX3Qgc2l6ZTsKKworICAgIGJ1ZmYgPSAoY29uc3Qgdm9pZCAqKW1lbS0+cG9pbnRlcigpOworICAgIHNpemU9IG1lbS0+c2l6ZSgpOworCisgICAgc3dpdGNoKHByZWZDb25maWcpIHsKKyAgICAgICAgY2FzZSBTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWc6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1mbXRNdWx0aXBsaWVyID0gNDsKKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTa0JpdG1hcDo6a0FSR0JfNDQ0NF9Db25maWc6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1mbXRNdWx0aXBsaWVyID0gMjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNrQml0bWFwOjprUkdCXzU2NV9Db25maWc6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1mbXRNdWx0aXBsaWVyID0gMjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNrQml0bWFwOjprSW5kZXg4X0NvbmZpZzoKKyAgICAgICAgeworICAgICAgICAgICAgbWZtdE11bHRpcGxpZXIgPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU2tCaXRtYXA6OmtBOF9Db25maWc6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1mbXRNdWx0aXBsaWVyID0gNDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBtZm10TXVsdGlwbGllciA9IDA7CisgICAgICAgICAgICBwcmludGYoIkRlY29kZSBmb3JtYXQgaXMgbm90IGNvcnJlY3QhXG4iKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoU2tJbWFnZURlY29kZXI6OkRlY29kZU1lbW9yeShidWZmLCBzaXplLCBza0JNLCBwcmVmQ29uZmlnLAorICAgICAgICAgICAgU2tJbWFnZURlY29kZXI6OmtEZWNvZGVQaXhlbHNfTW9kZSkgPT0gZmFsc2UpIHsKKyAgICAgICAgcHJpbnRmKCIlcygpOiVkOjogRmFpbGVkIGR1cmluZyBqcGVnIGRlY29kZVxuIixfX0ZVTkNUSU9OX18sX19MSU5FX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyNlbHNlCisgICAgU2tDb2xvclR5cGUgcHJlZkNvbmZpZyA9IGtSR0JBXzg4ODhfU2tDb2xvclR5cGU7CisgICAgY29uc3Qgdm9pZCAqYnVmZiA9IE5VTEw7CisgICAgc2l6ZV90IHNpemU7CisKKyAgICBidWZmID0gKGNvbnN0IHZvaWQgKiltZW0tPnBvaW50ZXIoKTsKKyAgICBzaXplPSBtZW0tPnNpemUoKTsKKworICAgIHN3aXRjaChwcmVmQ29uZmlnKSB7CisgICAgICAgIGNhc2Uga1JHQkFfODg4OF9Ta0NvbG9yVHlwZToKKyAgICAgICAgeworICAgICAgICAgICAgbWZtdE11bHRpcGxpZXIgPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga0JHUkFfODg4OF9Ta0NvbG9yVHlwZToKKyAgICAgICAgeworICAgICAgICAgICAgbWZtdE11bHRpcGxpZXIgPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga0FSR0JfNDQ0NF9Ta0NvbG9yVHlwZToKKyAgICAgICAgeworICAgICAgICAgICAgbWZtdE11bHRpcGxpZXIgPSAyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2Uga1JHQl81NjVfU2tDb2xvclR5cGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1mbXRNdWx0aXBsaWVyID0gMjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGtJbmRleF84X1NrQ29sb3JUeXBlOgorICAgICAgICB7CisgICAgICAgICAgICBtZm10TXVsdGlwbGllciA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBrQWxwaGFfOF9Ta0NvbG9yVHlwZToKKyAgICAgICAgeworICAgICAgICAgICAgbWZtdE11bHRpcGxpZXIgPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1mbXRNdWx0aXBsaWVyID0gMDsKKyAgICAgICAgICAgIHByaW50ZigiRGVjb2RlIGZvcm1hdCBpcyBub3QgY29ycmVjdCFcbiIpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChTa0ltYWdlRGVjb2Rlcjo6RGVjb2RlTWVtb3J5KGJ1ZmYsIHNpemUsIHNrQk0sIHByZWZDb25maWcsCisgICAgICAgICAgICBTa0ltYWdlRGVjb2Rlcjo6a0RlY29kZVBpeGVsc19Nb2RlKSA9PSBmYWxzZSkgeworICAgICAgICBwcmludGYoIiVzKCk6JWQ6OiBGYWlsZWQgZHVyaW5nIGpwZWcgZGVjb2RlXG4iLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisjZW5kaWYKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZW5jb2RlSlBFRworICoKKyAqIERFU0NSSVBUSU9OOiBlbmNvZGUgdGhlIGRlY29kZWQgaW5wdXQgYnVmZmVyLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3RyZWFtICA6IFNrV1N0cmVhbQorICogICBAYml0bWFwICA6IFNrQml0bWFwIGRlY29kZWQgaW1hZ2UgdG8gZW5jb2RlCisgKiAgIEBwYXRoICAgIDogRmlsZSBwYXRoCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdHVzX3QgQ2FtZXJhQ29udGV4dDo6ZW5jb2RlSlBFRyhTa1dTdHJlYW0gKiBzdHJlYW0sCisgICAgY29uc3QgU2tCaXRtYXAgKmJpdG1hcCwgU3RyaW5nOCBwYXRoKQoreworICAgIGludCBxRmFjdG9yID0gMTAwOworCisgICAgc2tKcGVnRW5jID0gU2tJbWFnZUVuY29kZXI6OkNyZWF0ZShTa0ltYWdlRW5jb2Rlcjo6a0pQRUdfVHlwZSk7CisgICAgaWYgKCFza0pwZWdFbmMpIHsKKyAgICAgICAgQUxPR0UoIiBza0pwZWdFbmMgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHNrSnBlZ0VuYy0+ZW5jb2RlU3RyZWFtKHN0cmVhbSwgKmJpdG1hcCwgcUZhY3RvcikgPT0gZmFsc2UpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBGSUxFICpmaCA9IGZvcGVuKHBhdGguc3RyaW5nKCksICJyKyIpOworICAgIGlmICggIWZoICkgeworICAgICAgICBwcmludGYoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXNcbiIsIHBhdGguc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGZzZWVrKGZoLCAwLCBTRUVLX0VORCk7CisgICAgc2l6ZV90IGxlbiA9IChzaXplX3QpZnRlbGwoZmgpOworICAgIHJld2luZChmaCk7CisKKyAgICBpZiggIWxlbiApIHsKKyAgICAgICAgcHJpbnRmKCJGaWxlICVzIGlzIGVtcHR5ICFcbiIsIHBhdGguc3RyaW5nKCkpOworICAgICAgICBmY2xvc2UoZmgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmYgPSAodW5zaWduZWQgY2hhciopbWFsbG9jKGxlbik7CisgICAgaWYgKCFidWZmKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgYnVmZmVyIHJlYWRpbmchXG4iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgcmVhZFNpemUgPSBmcmVhZChidWZmLCAxLCBsZW4sIGZoKTsKKyAgICBpZiAocmVhZFNpemUgIT0gbGVuKSB7CisgICAgICAgIHByaW50ZigiUmVhZGluZyBlcnJvclxuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RhdHVzX3QgcmV0ID0gUmVhZFNlY3Rpb25zRnJvbUJ1ZmZlcihidWZmLCBsZW4sIFJFQURfQUxMKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IHJlYWQgc2VjdGlvbnMgZnJvbSBidWZmZXJcbiIpOworICAgICAgICBEaXNjYXJkRGF0YSgpOworICAgICAgICBEaXNjYXJkU2VjdGlvbnMoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgZnJlZShidWZmKTsKKyAgICByZXdpbmQoZmgpOworCisgICAgdW5zaWduZWQgY2hhciB0ZW1wID0gMHhmZjsKKyAgICBzaXplX3Qgd3JpdGVTaXplID0gZndyaXRlKCZ0ZW1wLCBzaXplb2YodW5zaWduZWQgY2hhciksIDEsIGZoKTsKKyAgICBpZiAoMSAhPSB3cml0ZVNpemUpIHsKKyAgICAgICAgcHJpbnRmKCJXcml0aW5nIGVycm9yXG4iKTsKKyAgICB9CisgICAgdGVtcCA9IDB4ZDg7CisgICAgZndyaXRlKCZ0ZW1wLCBzaXplb2YodW5zaWduZWQgY2hhciksIDEsIGZoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlY3Rpb25zUmVhZDsgaSsrKSB7CisgICAgICAgIHN3aXRjaCgobVNlY3Rpb25zW2ldLlR5cGUpKSB7CisKKyAgICAgICAgY2FzZSAweDEyMzoKKyAgICAgICAgICAgIGZ3cml0ZShtU2VjdGlvbnNbaV0uRGF0YSwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLAorICAgICAgICAgICAgICAgIG1TZWN0aW9uc1tpXS5TaXplLCBmaCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4ZTA6CisgICAgICAgICAgICB0ZW1wID0gMHhmZjsKKyAgICAgICAgICAgIGZ3cml0ZSgmdGVtcCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAxLCBmaCk7CisgICAgICAgICAgICB0ZW1wID0gMHhlMTsKKyAgICAgICAgICAgIGZ3cml0ZSgmdGVtcCwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAxLCBmaCk7CisgICAgICAgICAgICBmd3JpdGUobUpFWElGU2VjdGlvbi5EYXRhLCBzaXplb2YodW5zaWduZWQgY2hhciksCisgICAgICAgICAgICAgICAgbUpFWElGU2VjdGlvbi5TaXplLCBmaCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGVtcCA9IDB4ZmY7CisgICAgICAgICAgICBmd3JpdGUoJnRlbXAsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwgMSwgZmgpOworICAgICAgICAgICAgZndyaXRlKCZtU2VjdGlvbnNbaV0uVHlwZSwgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpLCAxLCBmaCk7CisgICAgICAgICAgICBmd3JpdGUobVNlY3Rpb25zW2ldLkRhdGEsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwKKyAgICAgICAgICAgICAgICBtU2VjdGlvbnNbaV0uU2l6ZSwgZmgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgZnNlZWsoZmgsIDAsIFNFRUtfRU5EKTsKKyAgICBsZW4gPSAoc2l6ZV90KWZ0ZWxsKGZoKTsKKyAgICByZXdpbmQoZmgpOworICAgIHByaW50ZigiJXM6IGJ1ZmZlcj0lcCwgc2l6ZT0lenUgc3RvcmVkIGF0ICVzXG4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBiaXRtYXAtPmdldFBpeGVscygpLCBsZW4sIHBhdGguc3RyaW5nKCkpOworCisgICAgZnJlZShtSkVYSUZTZWN0aW9uLkRhdGEpOworICAgIERpc2NhcmREYXRhKCk7CisgICAgRGlzY2FyZFNlY3Rpb25zKCk7CisgICAgZmNsb3NlKGZoKTsKKyAgICByZXQgPSBOT19FUlJPUjsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVhZFNlY3Rpb25zRnJvbUJ1ZmZlcgorICoKKyAqIERFU0NSSVBUSU9OOiByZWFkIGFsbCBqcGVnIHNlY3Rpb25zIG9mIGlucHV0IGJ1ZmZlci4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1lbSA6IGJ1ZmZlciB0byByZWFkIGZyb20gTWV0YWRhdGEgU2VjdGlvbnMKKyAqICAgQGJ1ZmZlcl9zaXplOiBidWZmZXIgc2l6ZQorICogICBAUmVhZE1vZGU6IFJlYWQgbW9kZSAtIGFsbCwganBlZyBvciBleGlmCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IENhbWVyYUNvbnRleHQ6OlJlYWRTZWN0aW9uc0Zyb21CdWZmZXIgKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplLCBSZWFkTW9kZV90IFJlYWRNb2RlKQoreworICAgIGludCBhOworICAgIHNpemVfdCBwb3MgPSAwOworICAgIGludCBIYXZlQ29tID0gMDsKKyAgICBtU2VjdGlvbnNBbGxvY2F0ZWQgPSAxMDsKKworICAgIG1TZWN0aW9ucyA9IChTZWN0aW9uc190ICopbWFsbG9jKHNpemVvZihTZWN0aW9uc190KSAqIG1TZWN0aW9uc0FsbG9jYXRlZCk7CisgICAgaWYgKCFtU2VjdGlvbnMpIHsKKyAgICAgICAgcHJpbnRmKCIgbm90IGVub3VnaCBtZW1vcnlcbiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIHByaW50ZigiSW5wdXQgYnVmZmVyIGlzIG51bGxcbiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChidWZmZXJfc2l6ZSA8IDEpIHsKKyAgICAgICAgcHJpbnRmKCJJbnB1dCBzaXplIGlzIDBcbiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGEgPSAoaW50KSBidWZmZXJbcG9zKytdOworCisgICAgaWYgKGEgIT0gMHhmZiB8fCBidWZmZXJbcG9zKytdICE9IE1fU09JKXsKKyAgICAgICAgcHJpbnRmKCJObyB2YWxpZCBpbWFnZVxuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZm9yKDs7KXsKKyAgICAgICAgc2l6ZV90IGl0ZW1sZW47CisgICAgICAgIGludCBtYXJrZXIgPSAwOworICAgICAgICBzaXplX3QgbGwsbGg7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKiBEYXRhOworCisgICAgICAgIENoZWNrU2VjdGlvbnNBbGxvY2F0ZWQoKTsKKworICAgICAgICAvLyBUaGUgY2FsbCB0byBDaGVja1NlY3Rpb25zQWxsb2NhdGVkKCkgbWF5IHJlYWxsb2NhdGUgbVNlY3Rpb25zCisgICAgICAgIC8vIHNvIG5lZWQgdG8gY2hlY2sgZm9yIE5VTEwgYWdhaW4uCisgICAgICAgIGlmIChtU2VjdGlvbnMgPT0gTlVMTCkgeworICAgICAgICAgICAgcHJpbnRmKCIgbm90IGVub3VnaCBtZW1vcnlcbiIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYSA9IDA7IGEgPD0gMTY7IGErKyl7CisgICAgICAgICAgICBtYXJrZXIgPSBidWZmZXJbcG9zKytdOworICAgICAgICAgICAgaWYgKG1hcmtlciAhPSAweGZmKSBicmVhazsKKworICAgICAgICAgICAgaWYgKGEgPj0gMTYpeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJ0b28gbWFueSBwYWRkaW5nIGJ5dGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbVNlY3Rpb25zW21TZWN0aW9uc1JlYWRdLlR5cGUgPSBtYXJrZXI7CisKKyAgICAgICAgLy8gUmVhZCB0aGUgbGVuZ3RoIG9mIHRoZSBzZWN0aW9uLgorICAgICAgICBsaCA9IGJ1ZmZlcltwb3MrK107CisgICAgICAgIGxsID0gYnVmZmVyW3BvcysrXTsKKworICAgICAgICBpdGVtbGVuID0gKGxoIDw8IDgpIHwgbGw7CisKKyAgICAgICAgaWYgKGl0ZW1sZW4gPCAyKSB7CisgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBtYXJrZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBtU2VjdGlvbnNbbVNlY3Rpb25zUmVhZF0uU2l6ZSA9IGl0ZW1sZW47CisKKyAgICAgICAgRGF0YSA9ICh1bnNpZ25lZCBjaGFyICopbWFsbG9jKGl0ZW1sZW4pOworICAgICAgICBpZiAoRGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSIpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBtU2VjdGlvbnNbbVNlY3Rpb25zUmVhZF0uRGF0YSA9IERhdGE7CisKKyAgICAgICAgLy8gU3RvcmUgZmlyc3QgdHdvIHByZS1yZWFkIGJ5dGVzLgorICAgICAgICBEYXRhWzBdID0gKHVuc2lnbmVkIGNoYXIpbGg7CisgICAgICAgIERhdGFbMV0gPSAodW5zaWduZWQgY2hhcilsbDsKKworICAgICAgICBpZiAocG9zK2l0ZW1sZW4tMiA+IGJ1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICBBTE9HRSgiUHJlbWF0dXJlIGVuZCBvZiBmaWxlPyIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweShEYXRhKzIsIGJ1ZmZlcitwb3MsIGl0ZW1sZW4tMik7IC8vIFJlYWQgdGhlIHdob2xlIHNlY3Rpb24uCisgICAgICAgIHBvcyArPSBpdGVtbGVuLTI7CisKKyAgICAgICAgbVNlY3Rpb25zUmVhZCArPSAxOworCisgICAgICAgIHN3aXRjaChtYXJrZXIpeworCisgICAgICAgICAgICBjYXNlIE1fU09TOiAgIC8vIHN0b3AgYmVmb3JlIGhpdHRpbmcgY29tcHJlc3NlZCBkYXRhCisgICAgICAgICAgICAgICAgLy8gSWYgcmVhZGluZyBlbnRpcmUgaW1hZ2UgaXMgcmVxdWVzdGVkLCByZWFkIHRoZSByZXN0IG9mIHRoZQorICAgICAgICAgICAgICAgIC8vIGRhdGEuCisgICAgICAgICAgICAgICAgaWYgKFJlYWRNb2RlICYgUkVBRF9JTUFHRSl7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgaG93IG11Y2ggZmlsZSBpcyBsZWZ0LgorICAgICAgICAgICAgICAgICAgICBzaXplID0gYnVmZmVyX3NpemUgLSBwb3M7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY291bGQgbm90IHJlYWQgdGhlIHJlc3Qgb2YgdGhlIGltYWdlIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIERhdGEgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVkOiBjb3VsZCBub3QgYWxsb2NhdGUgZGF0YSBmb3IgZW50aXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltYWdlIHNpemU6ICVkIiwgX19MSU5FX18sIHNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShEYXRhLCBidWZmZXIrcG9zLCBzaXplKTsKKworICAgICAgICAgICAgICAgICAgICBDaGVja1NlY3Rpb25zQWxsb2NhdGVkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGwgdG8gQ2hlY2tTZWN0aW9uc0FsbG9jYXRlZCgpCisgICAgICAgICAgICAgICAgICAgIC8vIG1heSByZWFsbG9jYXRlIG1TZWN0aW9ucworICAgICAgICAgICAgICAgICAgICAvLyBzbyBuZWVkIHRvIGNoZWNrIGZvciBOVUxMIGFnYWluLgorICAgICAgICAgICAgICAgICAgICBpZiAobVNlY3Rpb25zID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIG5vdCBlbm91Z2ggbWVtb3J5XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtU2VjdGlvbnNbbVNlY3Rpb25zUmVhZF0uRGF0YSA9IERhdGE7CisgICAgICAgICAgICAgICAgICAgIG1TZWN0aW9uc1ttU2VjdGlvbnNSZWFkXS5TaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgbVNlY3Rpb25zW21TZWN0aW9uc1JlYWRdLlR5cGUgPSBQU0VVRE9fSU1BR0VfTUFSS0VSOworICAgICAgICAgICAgICAgICAgICBtU2VjdGlvbnNSZWFkICsrOworICAgICAgICAgICAgICAgICAgICBtSGF2ZUFsbCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKworICAgICAgICAgICAgY2FzZSBNX0VPSTogICAvLyBpbiBjYXNlIGl0J3MgYSB0YWJsZXMtb25seSBKUEVHIHN0cmVhbQorICAgICAgICAgICAgICAgIEFMT0dFKCJObyBpbWFnZSBpbiBqcGVnIVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgICAgICAgICAgY2FzZSBNX0NPTTogLy8gQ29tbWVudCBzZWN0aW9uCisgICAgICAgICAgICAgICAgaWYgKEhhdmVDb20gfHwgKChSZWFkTW9kZSAmIFJFQURfTUVUQURBVEEpID09IDApKXsKKyAgICAgICAgICAgICAgICAgICAgLy8gRGlzY2FyZCB0aGlzIHNlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgIGZyZWUobVNlY3Rpb25zWy0tbVNlY3Rpb25zUmVhZF0uRGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE1fSkZJRjoKKyAgICAgICAgICAgICAgICAvLyBSZWd1bGFyIGpwZWdzIGFsd2F5cyBoYXZlIHRoaXMgdGFnLCBleGlmIGltYWdlcyBoYXZlIHRoZQorICAgICAgICAgICAgICAgIC8vIGV4aWYgbWFya2VyIGluc3RlYWQsIGFsdGhvZ2ggQUNEc2VlIHdpbGwgd3JpdGUgaW1hZ2VzCisgICAgICAgICAgICAgICAgLy8gd2l0aCBib3RoIG1hcmtlcnMuCisgICAgICAgICAgICAgICAgLy8gdGhpcyBwcm9ncmFtIHdpbGwgcmUtY3JlYXRlIHRoaXMgbWFya2VyIG9uIGFic2VuY2Ugb2YgZXhpZgorICAgICAgICAgICAgICAgIC8vIG1hcmtlci4KKyAgICAgICAgICAgICAgICAvLyBoZW5jZSBubyBuZWVkIHRvIGtlZXAgdGhlIGNvcHkgZnJvbSB0aGUgZmlsZS4KKyAgICAgICAgICAgICAgICBpZiAoUmVhZE1vZGUgJiBSRUFEX01FVEFEQVRBKXsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChEYXRhKzIsICJKRklGIiwgNCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZnJlZShtU2VjdGlvbnNbLS1tU2VjdGlvbnNSZWFkXS5EYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTV9FWElGOgorICAgICAgICAgICAgICAgIC8vIFRoZXJlIGNhbiBiZSBkaWZmZXJlbnQgc2VjdGlvbiB1c2luZyB0aGUgc2FtZSBtYXJrZXIuCisgICAgICAgICAgICAgICAgaWYgKFJlYWRNb2RlICYgUkVBRF9NRVRBREFUQSl7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZW1jbXAoRGF0YSsyLCAiRXhpZiIsIDQpID09IDApeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChtZW1jbXAoRGF0YSsyLCAiaHR0cDoiLCA1KSA9PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoYW5nZSB0YWcgZm9yIGludGVybmFsIHB1cnBvc2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgbVNlY3Rpb25zW21TZWN0aW9uc1JlYWQtMV0uVHlwZSA9IE1fWE1QOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gT3Rlcndpc2UsIGRpc2NhcmQgdGhpcyBzZWN0aW9uLgorICAgICAgICAgICAgICAgIGZyZWUobVNlY3Rpb25zWy0tbVNlY3Rpb25zUmVhZF0uRGF0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTV9JUFRDOgorICAgICAgICAgICAgICAgIGlmIChSZWFkTW9kZSAmIFJFQURfTUVUQURBVEEpeworICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBXZSBqdXN0IHN0b3JlIHRoZSBJUFRDIHNlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgIC8vIEl0cyByZWxhdGl2ZWx5IHN0cmFpZ2h0Zm9yd2FyZAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2UgZG9uJ3QgYWN0IG9uIGFueSBwYXJ0IG9mIGl0LAorICAgICAgICAgICAgICAgICAgICAvLyBzbyBqdXN0IGRpc3BsYXkgaXQgYXQgcGFyc2UgdGltZS4KKyAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShtU2VjdGlvbnNbLS1tU2VjdGlvbnNSZWFkXS5EYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTV9TT0YwOgorICAgICAgICAgICAgY2FzZSBNX1NPRjE6CisgICAgICAgICAgICBjYXNlIE1fU09GMjoKKyAgICAgICAgICAgIGNhc2UgTV9TT0YzOgorICAgICAgICAgICAgY2FzZSBNX1NPRjU6CisgICAgICAgICAgICBjYXNlIE1fU09GNjoKKyAgICAgICAgICAgIGNhc2UgTV9TT0Y3OgorICAgICAgICAgICAgY2FzZSBNX1NPRjk6CisgICAgICAgICAgICBjYXNlIE1fU09GMTA6CisgICAgICAgICAgICBjYXNlIE1fU09GMTE6CisgICAgICAgICAgICBjYXNlIE1fU09GMTM6CisgICAgICAgICAgICBjYXNlIE1fU09GMTQ6CisgICAgICAgICAgICBjYXNlIE1fU09GMTU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIFNraXAgYW55IG90aGVyIHNlY3Rpb25zLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBDaGVja1NlY3Rpb25zQWxsb2NhdGVkCisgKgorICogREVTQ1JJUFRJT046IENoZWNrIGFsbG9jYXRlZCBqcGVnIHNlY3Rpb25zLgorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIENhbWVyYUNvbnRleHQ6OkNoZWNrU2VjdGlvbnNBbGxvY2F0ZWQodm9pZCkKK3sKKyAgICBpZiAobVNlY3Rpb25zUmVhZCA+IG1TZWN0aW9uc0FsbG9jYXRlZCl7CisgICAgICAgIEFMT0dFKCJhbGxvY2F0aW9uIHNjcmV3IHVwIik7CisgICAgfQorICAgIGlmIChtU2VjdGlvbnNSZWFkID49IG1TZWN0aW9uc0FsbG9jYXRlZCl7CisgICAgICAgIG1TZWN0aW9uc0FsbG9jYXRlZCArPSBtU2VjdGlvbnNBbGxvY2F0ZWQgKzE7CisgICAgICAgIG1TZWN0aW9ucyA9IChTZWN0aW9uc190ICopcmVhbGxvYyhtU2VjdGlvbnMsCisgICAgICAgICAgICBzaXplb2YoU2VjdGlvbnNfdCkgKiBtU2VjdGlvbnNBbGxvY2F0ZWQpOworICAgICAgICBpZiAobVNlY3Rpb25zID09IE5VTEwpeworICAgICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBhbGxvY2F0ZSBkYXRhIGZvciBlbnRpcmUgaW1hZ2UiKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBmaW5kU2VjdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOiBmaW5kIHRoZSBkZXNpcmVkIFNlY3Rpb24gb2YgdGhlIEpQRUcgYnVmZmVyLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogIEBTZWN0aW9uVHlwZTogU2VjdGlvbiB0eXBlCisgKgorICogUkVUVVJOICAgICA6IHJldHVybiB0aGUgZm91bmQgc2VjdGlvbgorCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0NhbWVyYUNvbnRleHQ6OlNlY3Rpb25zX3QgKkNhbWVyYUNvbnRleHQ6OkZpbmRTZWN0aW9uKGludCBTZWN0aW9uVHlwZSkKK3sKKyAgICBmb3IgKHVuc2lnbmVkIGludCBhID0gMDsgYSA8IG1TZWN0aW9uc1JlYWQ7IGErKykgeworICAgICAgICBpZiAobVNlY3Rpb25zW2FdLlR5cGUgPT0gU2VjdGlvblR5cGUpeworICAgICAgICAgICAgcmV0dXJuICZtU2VjdGlvbnNbYV07CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gQ291bGQgbm90IGJlIGZvdW5kLgorICAgIHJldHVybiBOVUxMOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogRGlzY2FyZERhdGEKKyAqCisgKiBERVNDUklQVElPTjogRGlzY2FyZERhdGEKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBDYW1lcmFDb250ZXh0OjpEaXNjYXJkRGF0YSgpCit7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgYSA9IDA7IGEgPCBtU2VjdGlvbnNSZWFkOyBhKyspIHsKKyAgICAgICAgZnJlZShtU2VjdGlvbnNbYV0uRGF0YSk7CisgICAgfQorCisgICAgbVNlY3Rpb25zUmVhZCA9IDA7CisgICAgbUhhdmVBbGwgPSAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IERpc2NhcmRTZWN0aW9ucworICoKKyAqIERFU0NSSVBUSU9OOiBEaXNjYXJkIGFsbG9jYXRlZCBzZWN0aW9ucworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIENhbWVyYUNvbnRleHQ6OkRpc2NhcmRTZWN0aW9ucygpCit7CisgICAgZnJlZShtU2VjdGlvbnMpOworICAgIG1TZWN0aW9uc0FsbG9jYXRlZCA9IDA7CisgICAgbUhhdmVBbGwgPSAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG5vdGlmeQorICoKKyAqIERFU0NSSVBUSU9OOiBub3RpZnkgY2FsbGJhY2sKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1zZ1R5cGUgOiB0eXBlIG9mIGNhbGxiYWNrCisgKiAgIEBleHQxOiBleHRlbmRlZCBwYXJhbWV0ZXJzCisgKiAgIEBleHQyOiBleHRlbmRlZCBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBDYW1lcmFDb250ZXh0Ojpub3RpZnkoaW50MzJfdCBtc2dUeXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0MikKK3sKKyAgICBwcmludGYoIk5vdGlmeSBjYjogJWQgJWQgJWRcbiIsIG1zZ1R5cGUsIGV4dDEsIGV4dDIpOworCisgICAgaWYgKCggbXNnVHlwZSAmIENBTUVSQV9NU0dfUFJFVklFV19GUkFNRSkKKyNpZm5kZWYgVkFOSUxMQV9IQUwKKyAgICAgICAgICAgICYmIChleHQxID09IENBTUVSQV9GUkFNRV9EQVRBX0ZEKQorI2VuZGlmCisgICAgICAgKQorICAgIHsKKyAgICAgICAgaW50IGZkID0gZHVwKGV4dDIpOworICAgICAgICBwcmludGYoIm5vdGlmeSBQcmV2aWV3IEZyYW1lIGZkOiAlZCBkdXAgZmQ6ICVkXG4iLCBleHQyLCBmZCk7CisgICAgICAgIGNsb3NlKGZkKTsKKyAgICB9CisKKyAgICBpZiAoIG1zZ1R5cGUgJiBDQU1FUkFfTVNHX0ZPQ1VTICkgeworICAgICAgICBwcmludGYoIkF1dG9Gb2N1cyAlcyBcbiIsCisgICAgICAgICAgICAgICAoZXh0MSkgPyAiT0siIDogIkZBSUwiKTsKKyAgICB9CisKKyAgICBpZiAoIG1zZ1R5cGUgJiBDQU1FUkFfTVNHX1NIVVRURVIgKSB7CisgICAgICAgIHByaW50ZigiU2h1dHRlciBkb25lIFxuIik7CisgICAgfQorCisgICAgaWYgKCBtc2dUeXBlICYgQ0FNRVJBX01TR19FUlJPUikgeworICAgICAgICBwcmludGYoIkNhbWVyYSBUZXN0IENBTUVSQV9NU0dfRVJST1JcbiIpOworICAgICAgICBzdG9wUHJldmlldygpOworICAgICAgICBjbG9zZUNhbWVyYSgpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwb3N0RGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBoYW5kbGVzIGRhdGEgY2FsbGJhY2tzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtc2dUeXBlIDogdHlwZSBvZiBjYWxsYmFjaworICogICBAZGF0YVB0cjogYnVmZmVyIGRhdGEKKyAqICAgQG1ldGFkYXRhOiBhZGRpdGlvbmFsIG1ldGFkYXRhIHdoZXJlIGF2YWlsYWJsZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgQ2FtZXJhQ29udGV4dDo6cG9zdERhdGEoaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhKQoreworICAgIG1JbnRlcnByLT5QaVBMb2NrKCk7CisgICAgU2l6ZSBjdXJyZW50UGljdHVyZVNpemUgPSBtU3VwcG9ydGVkUGljdHVyZVNpemVzLml0ZW1BdCgKKyAgICAgICAgbUN1cnJlbnRQaWN0dXJlU2l6ZUlkeCk7CisgICAgdW5zaWduZWQgY2hhciAqYnVmZiA9IE5VTEw7CisgICAgc2l6ZV90IHNpemU7CisgICAgc3RhdHVzX3QgcmV0ID0gMDsKKworICAgIG1lbXNldCgmbUpFWElGU2VjdGlvbiwgMCwgc2l6ZW9mKG1KRVhJRlNlY3Rpb24pKSwKKworICAgIHByaW50ZigiRGF0YSBjYjogJWRcbiIsIG1zZ1R5cGUpOworCisgICAgaWYgKCBtc2dUeXBlICYgQ0FNRVJBX01TR19QUkVWSUVXX0ZSQU1FICkgeworICAgICAgICBwcmV2aWV3Q2FsbGJhY2soZGF0YVB0cik7CisgICAgfQorCisgICAgaWYgKCBtc2dUeXBlICYgQ0FNRVJBX01TR19SQVdfSU1BR0UgKSB7CisgICAgICAgIHByaW50ZigiUkFXIGRvbmUgXG4iKTsKKyAgICB9CisKKyAgICBpZiAobXNnVHlwZSAmIENBTUVSQV9NU0dfUE9TVFZJRVdfRlJBTUUpIHsKKyAgICAgICAgcHJpbnRmKCJQb3N0dmlldyBmcmFtZSBcbiIpOworICAgIH0KKworICAgIGlmIChtc2dUeXBlICYgQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFICkgeworICAgICAgICBTdHJpbmc4IGpwZWdQYXRoOworICAgICAgICBqcGVnUGF0aCA9IGpwZWdQYXRoLmZvcm1hdChRQ0FNRVJBX0RVTVBfRlJNX0xPQ0FUSU9OImltZ18lZC5qcGciLAorICAgICAgICAgICAgICAgIEpwZWdJZHgpOworICAgICAgICBpZiAoIW1QaVBDYXB0dXJlKSB7CisgICAgICAgICAgICAvLyBOb3JtYWwgY2FwdHVyZSBjYXNlCisgICAgICAgICAgICBwcmludGYoIkpQRUcgZG9uZVxuIik7CisgICAgICAgICAgICBzYXZlRmlsZShkYXRhUHRyLCBqcGVnUGF0aCk7CisgICAgICAgICAgICBKcGVnSWR4Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBQaVAgY2FwdHVyZSBjYXNlCisgICAgICAgICAgICBTa0ZJTEVXU3RyZWFtICp3U3RyZWFtOworICAgICAgICAgICAgcmV0ID0gZGVjb2RlSlBFRyhkYXRhUHRyLCAmc2tCTXRtcCk7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmV0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvciBpbiBkZWNvZGluZyBKUEVHIVxuIik7CisgICAgICAgICAgICAgICAgbUludGVycHItPlBpUFVubG9jaygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVdpZHRoVG1wID0gY3VycmVudFBpY3R1cmVTaXplLndpZHRoOworICAgICAgICAgICAgbUhlaWdodFRtcCA9IGN1cnJlbnRQaWN0dXJlU2l6ZS5oZWlnaHQ7CisgICAgICAgICAgICBQaVBQdHJUbXAgPSBkYXRhUHRyOworICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIHR3byBqcGVnIGJ1ZmZlcnMKKyAgICAgICAgICAgIGlmIChtUGlQSWR4ID09IDEpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlBpUCBkb25lXG4iKTsKKworICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIHRoZSBjYXB0dXJlIHdpdGggaGlnaGVyIHdpZHRoIGFuZCBoZWlnaHQgYW5kIHJlYWQKKyAgICAgICAgICAgICAgICAvLyBpdHMganBlZyBzZWN0aW9ucworICAgICAgICAgICAgICAgIGlmICgobUludGVycHItPmNhbWVyYVswXS0+bVdpZHRoVG1wICogbUludGVycHItPmNhbWVyYVswXS0+bUhlaWdodFRtcCkgPgorICAgICAgICAgICAgICAgICAgICAgICAgKG1JbnRlcnByLT5jYW1lcmFbMV0tPm1XaWR0aFRtcCAqIG1JbnRlcnByLT5jYW1lcmFbMV0tPm1IZWlnaHRUbXApKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSAodW5zaWduZWQgY2hhciAqKVBpUFB0clRtcC0+cG9pbnRlcigpOworICAgICAgICAgICAgICAgICAgICBzaXplPSBQaVBQdHJUbXAtPnNpemUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChtSW50ZXJwci0+Y2FtZXJhWzBdLT5tV2lkdGhUbXAgKiBtSW50ZXJwci0+Y2FtZXJhWzBdLT5tSGVpZ2h0VG1wKSA8CisgICAgICAgICAgICAgICAgICAgICAgICAobUludGVycHItPmNhbWVyYVsxXS0+bVdpZHRoVG1wICogbUludGVycHItPmNhbWVyYVsxXS0+bUhlaWdodFRtcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZiA9ICh1bnNpZ25lZCBjaGFyICopUGlQUHRyVG1wLT5wb2ludGVyKCk7CisgICAgICAgICAgICAgICAgICAgIHNpemU9IFBpUFB0clRtcC0+c2l6ZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQ2Fubm90IHRha2UgUGlQLiBJbWFnZXMgYXJlIHdpdGggdGhlIHNhbWUgd2lkdGgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgaGVpZ2h0IHNpemUhISFcbiIpOworICAgICAgICAgICAgICAgICAgICBtSW50ZXJwci0+UGlQVW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYnVmZiAhPSBOVUxMICYmIHNpemUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBSZWFkU2VjdGlvbnNGcm9tQnVmZmVyKGJ1ZmYsIHNpemUsIFJFQURfQUxMKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJDYW5ub3QgcmVhZCBzZWN0aW9ucyBmcm9tIGJ1ZmZlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBEaXNjYXJkRGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgRGlzY2FyZFNlY3Rpb25zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW50ZXJwci0+UGlQVW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtSkVYSUZUbXAgPSBGaW5kU2VjdGlvbihNX0VYSUYpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW1KRVhJRlRtcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInNrQk1EZWMgaXMgbnVsbFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBEaXNjYXJkRGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgRGlzY2FyZFNlY3Rpb25zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUpFWElGU2VjdGlvbiA9ICptSkVYSUZUbXA7CisgICAgICAgICAgICAgICAgICAgIG1KRVhJRlNlY3Rpb24uRGF0YSA9ICh1bnNpZ25lZCBjaGFyKiltYWxsb2MobUpFWElGVG1wLT5TaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtSkVYSUZTZWN0aW9uLkRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIgTm90IGVub3VnaCBtZW1vcnlcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgRGlzY2FyZERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERpc2NhcmRTZWN0aW9ucygpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShtSkVYSUZTZWN0aW9uLkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBtSkVYSUZUbXAtPkRhdGEsIG1KRVhJRlRtcC0+U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIERpc2NhcmREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIERpc2NhcmRTZWN0aW9ucygpOworCisgICAgICAgICAgICAgICAgICAgIHdTdHJlYW0gPSBuZXcgU2tGSUxFV1N0cmVhbShqcGVnUGF0aC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHNrQk1EZWMgPSBQaVBDb3B5VG9PbmVGaWxlKCZtSW50ZXJwci0+Y2FtZXJhWzBdLT5za0JNdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtSW50ZXJwci0+Y2FtZXJhWzFdLT5za0JNdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFza0JNRGVjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgic2tCTURlYyBpcyBudWxsXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3U3RyZWFtOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZUpQRUcod1N0cmVhbSwgc2tCTURlYywganBlZ1BhdGgpICE9IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzKCk6JWQ6OiBGYWlsZWQgZHVyaW5nIGpwZWcgZW5jb2RlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sX19MSU5FX18pOworICAgICAgICAgICAgICAgICAgICAgICAgbUludGVycHItPlBpUFVubG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1QaVBJZHggPSAwOworICAgICAgICAgICAgICAgICAgICBKcGVnSWR4Kys7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB3U3RyZWFtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVBpUElkeCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGlzYWJsZVBpUENhcHR1cmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgobXNnVHlwZSAmIENBTUVSQV9NU0dfUFJFVklFV19NRVRBREFUQSkgJiYgKE5VTEwgIT0gbWV0YWRhdGEpKSB7CisgICAgICAgIHByaW50ZigiRmFjZSBkZXRlY3RlZCAlZCBcbiIsIG1ldGFkYXRhLT5udW1iZXJfb2ZfZmFjZXMpOworICAgIH0KKyAgICBtSW50ZXJwci0+UGlQVW5sb2NrKCk7CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwb3N0RGF0YVRpbWVzdGFtcAorICoKKyAqIERFU0NSSVBUSU9OOiBoYW5kbGVzIHJlY29yZGluZyBjYWxsYmFja3MKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHRpbWVzdGFtcCA6IHRpbWVzdGFtcCBvZiBidWZmZXIKKyAqICAgQG1zZ1R5cGUgOiB0eXBlIG9mIGJ1ZmZlcgorICogICBAZGF0YVB0ciA6IGJ1ZmZlciBkYXRhCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBDYW1lcmFDb250ZXh0Ojpwb3N0RGF0YVRpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cikKK3sKKyAgICBwcmludGYoIlJlY29yZGluZyBjYjogJWQgJWxsZCAlcFxuIiwKKyAgICAgICAgICAgIG1zZ1R5cGUsIChsb25nIGxvbmcgaW50KXRpbWVzdGFtcCwgZGF0YVB0ci5nZXQoKSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGF0YUNhbGxiYWNrVGltZXN0YW1wCisgKgorICogREVTQ1JJUFRJT046IGhhbmRsZXMgcmVjb3JkaW5nIGNhbGxiYWNrcy4gVXNlZCBmb3IgVmlWIHJlY29yZGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAdGltZXN0YW1wIDogdGltZXN0YW1wIG9mIGJ1ZmZlcgorICogICBAbXNnVHlwZSA6IHR5cGUgb2YgYnVmZmVyCisgKiAgIEBkYXRhUHRyIDogYnVmZmVyIGRhdGEKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIENhbWVyYUNvbnRleHQ6OmRhdGFDYWxsYmFja1RpbWVzdGFtcChuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cikKK3sKKyAgICBtSW50ZXJwci0+VmlWTG9jaygpOworICAgIC8vIE5vdCBuZWVkZWQgY2hlY2suIEp1c3QgYXZvaWRpbmcgd2FybmluZ3Mgb2Ygbm90IHVzZWQgdmFyaWFibGVzLgorICAgIGlmICh0aW1lc3RhbXAgPiAwKQorICAgICAgICB0aW1lc3RhbXAgPSAwOworICAgIC8vIE5vdCBuZWVkZWQgY2hlY2suIEp1c3QgYXZvaWRpbmcgd2FybmluZ3Mgb2Ygbm90IHVzZWQgdmFyaWFibGVzLgorICAgIGlmIChtc2dUeXBlID4gMCkKKyAgICAgICAgbXNnVHlwZSA9IDA7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHZvaWQgKiBzcmNCdWZmID0gTlVMTDsKKyAgICB2b2lkICogZHN0QnVmZiA9IE5VTEw7CisKKyAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IDAsIGRzdFlTdHJpZGUgPSAwOworICAgIHNpemVfdCBzcmNVVlN0cmlkZSA9IDAsIGRzdFVWU3RyaWRlID0gMDsKKyAgICBzaXplX3Qgc3JjWVNjYW5MaW5lcyA9IDAsIGRzdFlTY2FuTGluZXMgPSAwOworICAgIHNpemVfdCBzcmNVVlNjYW5MaW5lcyA9IDAsIGRzdFVWU2NhbkxpbmVzID0gMDsKKyAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMCwgZHN0T2Zmc2V0ID0gMDsKKyAgICBzaXplX3Qgc3JjQmFzZU9mZnNldCA9IDA7CisgICAgc2l6ZV90IGRzdEJhc2VPZmZzZXQgPSAwOworICAgIFNpemUgY3VycmVudFZpZGVvU2l6ZSA9IG1TdXBwb3J0ZWRWaWRlb1NpemVzLml0ZW1BdChtQ3VycmVudFZpZGVvU2l6ZUlkeCk7CisgICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7CisgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iID0gTlVMTDsKKworICAgIGRzdEJ1ZmYgPSAodm9pZCAqKSBkYXRhUHRyLT5wb2ludGVyKCk7CisgICAgaWYgKE5VTEwgPT0gZHN0QnVmZikgeworICAgICAgICBwcmludGYoIkNhbm5vdCBhY2Nlc3MgZGVzdGluYXRpb24gYnVmZmVyISEhXG4iKTsKKyAgICAgICAgbUludGVycHItPlZpVlVubG9jaygpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1DYW1lcmFJbmRleCA9PSBtSW50ZXJwci0+bVZpVlZpZC5zb3VyY2VDYW1lcmFJRCkgeworICAgICAgICBzcmNZU3RyaWRlID0gY2FsY1N0cmlkZShjdXJyZW50VmlkZW9TaXplLndpZHRoKTsKKyAgICAgICAgc3JjVVZTdHJpZGUgPSBjYWxjU3RyaWRlKGN1cnJlbnRWaWRlb1NpemUud2lkdGgpOworICAgICAgICBzcmNZU2NhbkxpbmVzID0gY2FsY1lTY2FuTGluZXMoY3VycmVudFZpZGVvU2l6ZS5oZWlnaHQpOworICAgICAgICBzcmNVVlNjYW5MaW5lcyA9IGNhbGNVVlNjYW5MaW5lcyhjdXJyZW50VmlkZW9TaXplLmhlaWdodCk7CisgICAgICAgIG1JbnRlcnByLT5tVmlWQnVmZi5zcmNXaWR0aCA9IChzaXplX3QpY3VycmVudFZpZGVvU2l6ZS53aWR0aDsKKyAgICAgICAgbUludGVycHItPm1WaVZCdWZmLnNyY0hlaWdodCA9IChzaXplX3QpY3VycmVudFZpZGVvU2l6ZS5oZWlnaHQ7CisKKworICAgICAgICBtSW50ZXJwci0+bVZpVkJ1ZmYuWVN0cmlkZSA9IHNyY1lTdHJpZGU7CisgICAgICAgIG1JbnRlcnByLT5tVmlWQnVmZi5VVlN0cmlkZSA9IHNyY1VWU3RyaWRlOworICAgICAgICBtSW50ZXJwci0+bVZpVkJ1ZmYuWVNjYW5MaW5lcyA9IHNyY1lTY2FuTGluZXM7CisgICAgICAgIG1JbnRlcnByLT5tVmlWQnVmZi5VVlNjYW5MaW5lcyA9IHNyY1VWU2NhbkxpbmVzOworCisgICAgICAgIG1lbWNweSggbUludGVycHItPm1WaVZCdWZmLmJ1ZmYsIGRzdEJ1ZmYsCisgICAgICAgICAgICBtSW50ZXJwci0+bVZpVkJ1ZmYuYnVmZlNpemUpOworCisgICAgICAgIG1JbnRlcnByLT5tVmlWVmlkLmlzQnVmZlZhbGlkID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG1DYW1lcmFJbmRleCA9PSBtSW50ZXJwci0+bVZpVlZpZC5kZXN0aW5hdGlvbkNhbWVyYUlEKSB7CisgICAgICAgIGlmKG1JbnRlcnByLT5tVmlWVmlkLmlzQnVmZlZhbGlkID09IHRydWUpIHsKKyAgICAgICAgICAgIGRzdFlTdHJpZGUgPSBjYWxjU3RyaWRlKGN1cnJlbnRWaWRlb1NpemUud2lkdGgpOworICAgICAgICAgICAgZHN0VVZTdHJpZGUgPSBjYWxjU3RyaWRlKGN1cnJlbnRWaWRlb1NpemUud2lkdGgpOworICAgICAgICAgICAgZHN0WVNjYW5MaW5lcyA9IGNhbGNZU2NhbkxpbmVzKGN1cnJlbnRWaWRlb1NpemUuaGVpZ2h0KTsKKyAgICAgICAgICAgIGRzdFVWU2NhbkxpbmVzID0gY2FsY1VWU2NhbkxpbmVzKGN1cnJlbnRWaWRlb1NpemUuaGVpZ2h0KTsKKworICAgICAgICAgICAgc3JjWVN0cmlkZSA9IG1JbnRlcnByLT5tVmlWQnVmZi5ZU3RyaWRlOworICAgICAgICAgICAgc3JjVVZTdHJpZGUgPSBtSW50ZXJwci0+bVZpVkJ1ZmYuVVZTdHJpZGU7CisgICAgICAgICAgICBzcmNZU2NhbkxpbmVzID0gbUludGVycHItPm1WaVZCdWZmLllTY2FuTGluZXM7CisgICAgICAgICAgICBzcmNVVlNjYW5MaW5lcyA9IG1JbnRlcnByLT5tVmlWQnVmZi5VVlNjYW5MaW5lczsKKworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbUludGVycHItPm1WaVZCdWZmLnNyY0hlaWdodDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ID0gaSpzcmNZU3RyaWRlOworICAgICAgICAgICAgICAgIGRzdE9mZnNldCA9IGkqZHN0WVN0cmlkZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikgZHN0QnVmZiArIGRzdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikgbUludGVycHItPm1WaVZCdWZmLmJ1ZmYgKworICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQsIG1JbnRlcnByLT5tVmlWQnVmZi5zcmNXaWR0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmNCYXNlT2Zmc2V0ID0gc3JjWVN0cmlkZSAqIHNyY1lTY2FuTGluZXM7CisgICAgICAgICAgICBkc3RCYXNlT2Zmc2V0ID0gZHN0WVN0cmlkZSAqIGRzdFlTY2FuTGluZXM7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbUludGVycHItPm1WaVZCdWZmLnNyY0hlaWdodCAvIDI7IGkrKykgeworICAgICAgICAgICAgICAgIHNyY09mZnNldCA9IGkqc3JjVVZTdHJpZGUgKyBzcmNCYXNlT2Zmc2V0OworICAgICAgICAgICAgICAgIGRzdE9mZnNldCA9IGkqZHN0VVZTdHJpZGUgKyBkc3RCYXNlT2Zmc2V0OworICAgICAgICAgICAgICAgIG1lbWNweSgodW5zaWduZWQgY2hhciAqKSBkc3RCdWZmICsgZHN0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKSBtSW50ZXJwci0+bVZpVkJ1ZmYuYnVmZiArCisgICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCwgbUludGVycHItPm1WaVZCdWZmLnNyY1dpZHRoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19kZXF1ZXVlX2J1ZmZlcl9hbmRfd2FpdCgKKyAgICAgICAgICAgICAgICBtSW50ZXJwci0+bVZpVlZpZC5BTlcuZ2V0KCksJmFuYik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJDYW5ub3QgZGVxdWV1ZSBhbmIgZm9yIHNlbnNvciAlZCEhIVxuIiwgbUNhbWVyYUluZGV4KTsKKyAgICAgICAgICAgICAgICBtSW50ZXJwci0+VmlWVW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUludGVycHItPm1WaVZWaWQuZ3JhcGhCdWYgPSBuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmKE5VTEwgPT0gbUludGVycHItPm1WaVZWaWQuZ3JhcGhCdWYuZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkludmFsaWQgR3JhcGhpYyBidWZmZXJcbiIpOworICAgICAgICAgICAgICAgIG1JbnRlcnByLT5WaVZVbmxvY2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBtSW50ZXJwci0+bVZpVlZpZC5ncmFwaEJ1Zi0+bG9jaygKKyAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAorICAgICAgICAgICAgICAgICh2b2lkKiopKCZtSW50ZXJwci0+bVZpVlZpZC5tYXBwZWRCdWZmKSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJHcmFwaGljIGJ1ZmZlciBjb3VsZCBub3QgYmUgbG9ja2VkICVkISEhXG4iLCBlcnIpOworICAgICAgICAgICAgICAgIG1JbnRlcnByLT5WaVZVbmxvY2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNyY1lTdHJpZGUgPSBkc3RZU3RyaWRlOworICAgICAgICAgICAgc3JjVVZTdHJpZGUgPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgICAgIHNyY1lTY2FuTGluZXMgPSBkc3RZU2NhbkxpbmVzOworICAgICAgICAgICAgc3JjVVZTY2FuTGluZXMgPSBkc3RVVlNjYW5MaW5lczsKKyAgICAgICAgICAgIHNyY0J1ZmYgPSBkc3RCdWZmOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVfdCljdXJyZW50VmlkZW9TaXplLmhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ID0gaSpzcmNZU3RyaWRlOworICAgICAgICAgICAgICAgIGRzdE9mZnNldCA9IGkqZHN0WVN0cmlkZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikgbUludGVycHItPm1WaVZWaWQubWFwcGVkQnVmZiArCisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwgKHVuc2lnbmVkIGNoYXIgKikgc3JjQnVmZiArCisgICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCwgKHNpemVfdCljdXJyZW50VmlkZW9TaXplLndpZHRoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3JjQmFzZU9mZnNldCA9IHNyY1lTdHJpZGUgKiBzcmNZU2NhbkxpbmVzOworICAgICAgICAgICAgZHN0QmFzZU9mZnNldCA9IGRzdFVWU3RyaWRlICogKHNpemVfdCljdXJyZW50VmlkZW9TaXplLmhlaWdodDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChzaXplX3QpY3VycmVudFZpZGVvU2l6ZS5oZWlnaHQgLyAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgPSBpKnNyY1VWU3RyaWRlICsgc3JjQmFzZU9mZnNldDsKKyAgICAgICAgICAgICAgICBkc3RPZmZzZXQgPSBpKmRzdFVWU3RyaWRlICsgZHN0QmFzZU9mZnNldDsKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikgbUludGVycHItPm1WaVZWaWQubWFwcGVkQnVmZiArCisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCwgKHVuc2lnbmVkIGNoYXIgKikgc3JjQnVmZiArCisgICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCwgKHNpemVfdCljdXJyZW50VmlkZW9TaXplLndpZHRoKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBtSW50ZXJwci0+bVZpVlZpZC5ncmFwaEJ1Zi0+dW5sb2NrKCk7CisKKyAgICAgICAgICAgIGVyciA9IG1JbnRlcnByLT5tVmlWVmlkLkFOVy0+cXVldWVCdWZmZXIoCisgICAgICAgICAgICAgICAgbUludGVycHItPm1WaVZWaWQuQU5XLmdldCgpLCBhbmIsIC0xKTsKKyAgICAgICAgICAgIGlmKGVycikKKyAgICAgICAgICAgICAgICBwcmludGYoIkZhaWxlZCB0byBlbnF1ZXVlIGJ1ZmZlciB0byByZWNvcmRlciEhIVxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNhbWVyYS0+cmVsZWFzZVJlY29yZGluZ0ZyYW1lKGRhdGFQdHIpOworCisgICAgbUludGVycHItPlZpVlVubG9jaygpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFZpVkVuY29kZXJUaHJlYWQKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlcyBhIHNlcGFyYXRlIHRocmVhZCBmb3IgVmlWIHJlY29yZGluZworICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdHVzX3QgSW50ZXJwcmV0ZXI6OlZpVkVuY29kZXJUaHJlYWQoKQoreworICAgIGludCByZXQgPSBOT19FUlJPUjsKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKworICAgIHJldCA9IHB0aHJlYWRfY3JlYXRlKCZtVmlWRW5jVGhyZWFkLCAmYXR0ciwgVGhyZWFkV3JhcHBlciwgdGhpcyk7CisgICAgcmV0ID0gcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBUaHJlYWRXcmFwcGVyCisgKgorICogREVTQ1JJUFRJT046IEhlbHBlciBmdW5jdGlvbiBmb3IgZm9yIFZpViByZWNvcmRpbmcgdGhyZWFkCisgKgorICogUEFSQU1FVEVSUyA6IEludGVycHJldGVyIGNvbnRleHQKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkICpJbnRlcnByZXRlcjo6VGhyZWFkV3JhcHBlcih2b2lkICpjb250ZXh0KSB7CisgICAgSW50ZXJwcmV0ZXIgKndyaXRlciA9IHN0YXRpY19jYXN0PEludGVycHJldGVyICo+KGNvbnRleHQpOworICAgIHdyaXRlci0+VmlWRW5jb2RlKCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogVmlWRW5jb2RlCisgKgorICogREVTQ1JJUFRJT046IFRocmVhZCBmb3IgVmlWIGVuY29kZS4gQnVmZmVycyBmcm9tIHZpZGVvIGNvZGVjIGFyZSBzZW50IHRvCisgKiAgICAgICAgICAgICAgbXV4ZXIgYW5kIHNhdmVkIGluIGEgZmlsZS4KKyAqCisgKiBQQVJBTUVURVJTIDogSW50ZXJwcmV0ZXIgY29udGV4dAorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgSW50ZXJwcmV0ZXI6OlZpVkVuY29kZSgpCit7CisgICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7CisgICAgc3NpemVfdCB0cmFja0lkeCA9IC0xOworICAgIHVpbnQzMl90IGRlYnVnTnVtRnJhbWVzID0gMDsKKworICAgIHNpemVfdCBidWZJbmRleCwgb2Zmc2V0LCBzaXplOworICAgIGludDY0X3QgcHRzVXNlYzsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBib29sIERvUmVjb3JkaW5nID0gdHJ1ZTsKKworCisgICAgZXJyID0gbVRlc3RDb250ZXh0LT5tVmlWVmlkLmNvZGVjLT5nZXRPdXRwdXRCdWZmZXJzKAorICAgICAgICAmbVRlc3RDb250ZXh0LT5tVmlWVmlkLmJ1ZmZlcnMpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcHJpbnRmKCJVbmFibGUgdG8gZ2V0IG91dHB1dCBidWZmZXJzIChlcnI9JWQpXG4iLCBlcnIpOworICAgIH0KKworICAgIHdoaWxlIChEb1JlY29yZGluZykgeworICAgICAgICBlcnIgPSBtVGVzdENvbnRleHQtPm1WaVZWaWQuY29kZWMtPmRlcXVldWVPdXRwdXRCdWZmZXIoCisgICAgICAgICAgICAmYnVmSW5kZXgsCisgICAgICAgICAgICAmb2Zmc2V0LAorICAgICAgICAgICAgJnNpemUsCisgICAgICAgICAgICAmcHRzVXNlYywKKyAgICAgICAgICAgICZmbGFncywgLTEpOworCisgICAgICAgIHN3aXRjaCAoZXJyKSB7CisKKyAgICAgICAgY2FzZSBOT19FUlJPUjoKKyAgICAgICAgICAgIC8vIGdvdCBhIGJ1ZmZlcgorICAgICAgICAgICAgaWYgKChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgLS0gd2UgcGFzc2VkIHRoZSBDU0QgaW50byBNZWRpYU11eGVyIHdoZW4KKyAgICAgICAgICAgICAgICAvLyB3ZSBnb3QgdGhlIGZvcm1hdCBjaGFuZ2Ugbm90aWZpY2F0aW9uCisgICAgICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZpcnR1YWwgZGlzcGxheSBpc24ndCBwcm92aWRpbmcgdXMgd2l0aCB0aW1lc3RhbXBzLAorICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgY3VycmVudCB0aW1lLgorICAgICAgICAgICAgICAgIGlmIChwdHNVc2VjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHRzVXNlYyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKSAvIDEwMDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVGhlIE1lZGlhTXV4ZXIgZG9jcyBhcmUgdW5jbGVhciwgYnV0IGl0IGFwcGVhcnMgdGhhdCB3ZQorICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gcGFzcyBlaXRoZXIgdGhlIGZ1bGwgc2V0IG9mIEJ1ZmZlckluZm8gZmxhZ3MsIG9yCisgICAgICAgICAgICAgICAgLy8gKGZsYWdzICYgQlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FKS4KKyAgICAgICAgICAgICAgICBlcnIgPSBtVGVzdENvbnRleHQtPm1WaVZWaWQubXV4ZXItPndyaXRlU2FtcGxlRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgbVRlc3RDb250ZXh0LT5tVmlWVmlkLmJ1ZmZlcnNbYnVmSW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KXRyYWNrSWR4LAorICAgICAgICAgICAgICAgICAgICBwdHNVc2VjLAorICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB3cml0aW5nIGRhdGEgdG8gbXV4ZXIgKGVycj0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVidWdOdW1GcmFtZXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IG1UZXN0Q29udGV4dC0+bVZpVlZpZC5jb2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihidWZJbmRleCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gcmVsZWFzZSBvdXRwdXQgYnVmZmVyIChlcnI9JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBOb3QgZXhwZWN0aW5nIEVPUyBmcm9tIFN1cmZhY2VGbGluZ2VyLiAgR28gd2l0aCBpdC4KKyAgICAgICAgICAgICAgICBwcmludGYoIlJlY2VpdmVkIGVuZC1vZi1zdHJlYW1cbiIpOworICAgICAgICAgICAgICAgIC8vRG9SZWNvcmRpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIC1FQUdBSU46ICAgICAgICAgICAgICAgICAgICAgICAvLyBJTkZPX1RSWV9BR0FJTl9MQVRFUgorICAgICAgICAgICAgQUxPR1YoIkdvdCAtRUFHQUlOLCBsb29waW5nIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTkZPX0ZPUk1BVF9DSEFOR0VEOiAgICAgICAgICAgLy8gSU5GT19PVVRQVVRfRk9STUFUX0NIQU5HRUQKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZm9ybWF0IGluY2x1ZGVzIENTRCwgd2hpY2ggd2UgbXVzdCBwcm92aWRlIHRvIG11eGVyCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbmV3Rm9ybWF0OworICAgICAgICAgICAgbVRlc3RDb250ZXh0LT5tVmlWVmlkLmNvZGVjLT5nZXRPdXRwdXRGb3JtYXQoJm5ld0Zvcm1hdCk7CisgICAgICAgICAgICB0cmFja0lkeCA9IG1UZXN0Q29udGV4dC0+bVZpVlZpZC5tdXhlci0+YWRkVHJhY2sobmV3Rm9ybWF0KTsKKyAgICAgICAgICAgIGVyciA9IG1UZXN0Q29udGV4dC0+bVZpVlZpZC5tdXhlci0+c3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlVuYWJsZSB0byBzdGFydCBtdXhlciAoZXJyPSVkKVxuIiwgZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQ6ICAgLy8gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VECisgICAgICAgICAgICAvLyBub3QgZXhwZWN0ZWQgZm9yIGFuIGVuY29kZXI7IGhhbmRsZSBpdCBhbnl3YXkKKyAgICAgICAgICAgIEFMT0dWKCJFbmNvZGVyIGJ1ZmZlcnMgY2hhbmdlZCIpOworICAgICAgICAgICAgZXJyID0gbVRlc3RDb250ZXh0LT5tVmlWVmlkLmNvZGVjLT5nZXRPdXRwdXRCdWZmZXJzKAorICAgICAgICAgICAgICAgICZtVGVzdENvbnRleHQtPm1WaVZWaWQuYnVmZmVycyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJVbmFibGUgdG8gZ2V0IG5ldyBvdXRwdXQgYnVmZmVycyAoZXJyPSVkKVxuIiwgZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICAgICBEb1JlY29yZGluZyA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHByaW50ZigiR290IHdlaXJkIHJlc3VsdCAlZCBmcm9tIGRlcXVldWVPdXRwdXRCdWZmZXJcbiIsIGVycik7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhbGNCdWZmZXJTaXplCisgKgorICogREVTQ1JJUFRJT046IFRlbXAgYnVmZmVyIHNpemUgY2FsY3VsYXRpb24uIFRlbXAgYnVmZmVyIGlzIHVzZWQgdG8gc3RvcmUKKyAqICAgICAgICAgICAgICB0aGUgYnVmZmVyIGZyb20gdGhlIGNhbWVyYSB3aXRoIHNtYWxsZXIgcmVzb2x1dGlvbi4gSXQgaXMKKyAqICAgICAgICAgICAgICBjb3BpZWQgdG8gdGhlIGJ1ZmZlciBmcm9tIGNhbWVyYSB3aXRoIGhpZ2hlciByZXNvbHV0aW9uLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAd2lkdGggICA6IHZpZGVvIHNpemUgd2lkdGgKKyAqICAgQGhlaWdodCAgOiB2aWRlbyBzaXplIGhlaWdodAorICoKKyAqIFJFVFVSTiAgICAgOiBzaXplX3QKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc2l6ZV90IENhbWVyYUNvbnRleHQ6OmNhbGNCdWZmZXJTaXplKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgc2l6ZV90IFVWQWxpZ25tZW50OworICAgIHNpemVfdCBZUGxhbmUsIFVWUGxhbmUsIFlTdHJpZGUsIFVWU3RyaWRlLCBZU2NhbmxpbmVzLCBVVlNjYW5saW5lczsKKyAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorICAgIFVWQWxpZ25tZW50ID0gNDA5NjsKKyAgICBZU3RyaWRlID0gY2FsY1N0cmlkZSh3aWR0aCk7CisgICAgVVZTdHJpZGUgPSBjYWxjU3RyaWRlKHdpZHRoKTsKKyAgICBZU2NhbmxpbmVzID0gY2FsY1lTY2FuTGluZXMoaGVpZ2h0KTsKKyAgICBVVlNjYW5saW5lcyA9IGNhbGNVVlNjYW5MaW5lcyhoZWlnaHQpOworICAgIFlQbGFuZSA9IFlTdHJpZGUgKiBZU2NhbmxpbmVzOworICAgIFVWUGxhbmUgPSBVVlN0cmlkZSAqIFVWU2NhbmxpbmVzICsgVVZBbGlnbm1lbnQ7CisgICAgc2l6ZSA9IFlQbGFuZSArIFVWUGxhbmU7CisgICAgc2l6ZSA9IFZJREVPX0JVRl9BTExJR04oc2l6ZSwgNDA5Nik7CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYWxjU3RyaWRlCisgKgorICogREVTQ1JJUFRJT046IFRlbXAgYnVmZmVyIHN0cmlkZSBjYWxjdWxhdGlvbi4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHdpZHRoICAgOiB2aWRlbyBzaXplIHdpZHRoCisgKgorICogUkVUVVJOICAgICA6IHNpemVfdAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzaXplX3QgQ2FtZXJhQ29udGV4dDo6Y2FsY1N0cmlkZShpbnQgd2lkdGgpCit7CisgICAgc2l6ZV90IGFsaWdubWVudCwgc3RyaWRlID0gMDsKKyAgICBpZiAoIXdpZHRoKSB7CisgICAgICAgIHJldHVybiBzdHJpZGU7CisgICAgfQorICAgIGFsaWdubWVudCA9IDEyODsKKyAgICBzdHJpZGUgPSBWSURFT19CVUZfQUxMSUdOKChzaXplX3Qpd2lkdGgsIGFsaWdubWVudCk7CisKKyAgICByZXR1cm4gc3RyaWRlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhbGNZU2NhbkxpbmVzCisgKgorICogREVTQ1JJUFRJT046IFRlbXAgYnVmZmVyIHNjYW5saW5lcyBjYWxjdWxhdGlvbiBmb3IgWSBwbGFuZS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHdpZHRoICAgOiB2aWRlbyBzaXplIGhlaWdodAorICoKKyAqIFJFVFVSTiAgICAgOiBzaXplX3QKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc2l6ZV90IENhbWVyYUNvbnRleHQ6OmNhbGNZU2NhbkxpbmVzKGludCBoZWlnaHQpCit7CisgICAgc2l6ZV90IGFsaWdubWVudCwgc2NhbmxpbmVzID0gMDsKKyAgICAgICAgaWYgKCFoZWlnaHQpIHsKKyAgICAgICAgICAgIHJldHVybiBzY2FubGluZXM7CisgICAgICAgIH0KKyAgICBhbGlnbm1lbnQgPSAzMjsKKyAgICBzY2FubGluZXMgPSBWSURFT19CVUZfQUxMSUdOKChzaXplX3QpaGVpZ2h0LCBhbGlnbm1lbnQpOworCisgICAgcmV0dXJuIHNjYW5saW5lczsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYWxjVVZTY2FuTGluZXMKKyAqCisgKiBERVNDUklQVElPTjogVGVtcCBidWZmZXIgc2NhbmxpbmVzIGNhbGN1bGF0aW9uIGZvciBVViBwbGFuZS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHdpZHRoICAgOiB2aWRlbyBzaXplIGhlaWdodAorICoKKyAqIFJFVFVSTiAgICAgOiBzaXplX3QKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc2l6ZV90IENhbWVyYUNvbnRleHQ6OmNhbGNVVlNjYW5MaW5lcyhpbnQgaGVpZ2h0KQoreworICAgIHNpemVfdCBhbGlnbm1lbnQsIHNjYW5saW5lcyA9IDA7CisgICAgaWYgKCFoZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIHNjYW5saW5lczsKKyAgICB9CisgICAgYWxpZ25tZW50ID0gMTY7CisgICAgc2NhbmxpbmVzID0gVklERU9fQlVGX0FMTElHTigoc2l6ZV90KSgoaGVpZ2h0ICsgMSkgPj4gMSksIGFsaWdubWVudCk7CisKKyAgICByZXR1cm4gc2NhbmxpbmVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByaW50U3VwcG9ydGVkUGFyYW1zCisgKgorICogREVTQ1JJUFRJT046IGR1bXAgY29tbW9uIHN1cHBvcnRlZCBwYXJhbWV0ZXJzCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIENhbWVyYUNvbnRleHQ6OnByaW50U3VwcG9ydGVkUGFyYW1zKCkKK3sKKyAgICBjb25zdCBjaGFyICpjYW1lcmFfaWRzID0gbVBhcmFtcy5nZXQoImNhbWVyYS1pbmRleGVzIik7CisgICAgY29uc3QgY2hhciAqcGljX3NpemVzID0gbVBhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QSUNUVVJFX1NJWkVTKTsKKyAgICBjb25zdCBjaGFyICpwaWNfZm9ybWF0cyA9IG1QYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfUElDVFVSRV9GT1JNQVRTKTsKKyAgICBjb25zdCBjaGFyICpwcmV2aWV3X3NpemVzID0gbVBhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QUkVWSUVXX1NJWkVTKTsKKyAgICBjb25zdCBjaGFyICp2aWRlb19zaXplcyA9IG1QYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfVklERU9fU0laRVMpOworICAgIGNvbnN0IGNoYXIgKnByZXZpZXdfZm9ybWF0cyA9IG1QYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfUFJFVklFV19GT1JNQVRTKTsKKyAgICBjb25zdCBjaGFyICpmcmFtZV9yYXRlcyA9IG1QYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfUFJFVklFV19GUkFNRV9SQVRFUyk7CisgICAgY29uc3QgY2hhciAqdGh1bWJfc2l6ZXMgPSBtUGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0pQRUdfVEhVTUJOQUlMX1NJWkVTKTsKKyAgICBjb25zdCBjaGFyICp3Yl9tb2RlcyA9IG1QYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfV0hJVEVfQkFMQU5DRSk7CisgICAgY29uc3QgY2hhciAqZWZmZWN0cyA9IG1QYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfRUZGRUNUUyk7CisgICAgY29uc3QgY2hhciAqc2NlbmVfbW9kZXMgPSBtUGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1NDRU5FX01PREVTKTsKKyAgICBjb25zdCBjaGFyICpmb2N1c19tb2RlcyA9IG1QYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfRk9DVVNfTU9ERVMpOworICAgIGNvbnN0IGNoYXIgKmFudGliYW5kaW5nX21vZGVzID0gbVBhcmFtcy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9BTlRJQkFORElORyk7CisgICAgY29uc3QgY2hhciAqZmxhc2hfbW9kZXMgPSBtUGFyYW1zLmdldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0ZMQVNIX01PREVTKTsKKyAgICBpbnQgZm9jdXNfYXJlYXMgPSBtUGFyYW1zLmdldEludChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfTUFYX05VTV9GT0NVU19BUkVBUyk7CisgICAgY29uc3QgY2hhciAqZnBzX3JhbmdlcyA9IG1QYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfUFJFVklFV19GUFNfUkFOR0UpOworICAgIGNvbnN0IGNoYXIgKmZvY3VzX2Rpc3RhbmNlcyA9IG1QYXJhbXMuZ2V0KENhbWVyYVBhcmFtZXRlcnM6OktFWV9GT0NVU19ESVNUQU5DRVMpOworCisgICAgcHJpbnRmKCJcblxyXHRTdXBwb3J0ZWQgQ2FtZXJhczogJXMiLAorICAgICAgICAgICAoY2FtZXJhX2lkcyAhPSBOVUxMKT8gY2FtZXJhX2lkcyA6ICJOVUxMIik7CisgICAgcHJpbnRmKCJcblxyXHRTdXBwb3J0ZWQgUGljdHVyZSBTaXplczogJXMiLAorICAgICAgICAgICAocGljX3NpemVzICE9IE5VTEwpPyBwaWNfc2l6ZXMgOiAiTlVMTCIpOworICAgIHByaW50ZigiXG5cclx0U3VwcG9ydGVkIFBpY3R1cmUgRm9ybWF0czogJXMiLAorICAgICAgICAgICAocGljX2Zvcm1hdHMgIT0gTlVMTCk/IHBpY19mb3JtYXRzIDogIk5VTEwiKTsKKyAgICBwcmludGYoIlxuXHJcdFN1cHBvcnRlZCBQcmV2aWV3IFNpemVzOiAlcyIsCisgICAgICAgICAgIChwcmV2aWV3X3NpemVzICE9IE5VTEwpPyBwcmV2aWV3X3NpemVzIDogIk5VTEwiKTsKKyAgICBwcmludGYoIlxuXHJcdFN1cHBvcnRlZCBWaWRlbyBTaXplczogJXMiLAorICAgICAgICAgICAgKHZpZGVvX3NpemVzICE9IE5VTEwpPyB2aWRlb19zaXplcyA6ICJOVUxMIik7CisgICAgcHJpbnRmKCJcblxyXHRTdXBwb3J0ZWQgUHJldmlldyBGb3JtYXRzOiAlcyIsCisgICAgICAgICAgIChwcmV2aWV3X2Zvcm1hdHMgIT0gTlVMTCk/IHByZXZpZXdfZm9ybWF0cyA6ICJOVUxMIik7CisgICAgcHJpbnRmKCJcblxyXHRTdXBwb3J0ZWQgUHJldmlldyBGcmFtZSBSYXRlczogJXMiLAorICAgICAgICAgICAoZnJhbWVfcmF0ZXMgIT0gTlVMTCk/IGZyYW1lX3JhdGVzIDogIk5VTEwiKTsKKyAgICBwcmludGYoIlxuXHJcdFN1cHBvcnRlZCBUaHVtYm5haWwgU2l6ZXM6ICVzIiwKKyAgICAgICAgICAgKHRodW1iX3NpemVzICE9IE5VTEwpPyB0aHVtYl9zaXplcyA6ICJOVUxMIik7CisgICAgcHJpbnRmKCJcblxyXHRTdXBwb3J0ZWQgV2hpdGViYWxhbmNlIE1vZGVzOiAlcyIsCisgICAgICAgICAgICh3Yl9tb2RlcyAhPSBOVUxMKT8gd2JfbW9kZXMgOiAiTlVMTCIpOworICAgIHByaW50ZigiXG5cclx0U3VwcG9ydGVkIEVmZmVjdHM6ICVzIiwKKyAgICAgICAgICAgKGVmZmVjdHMgIT0gTlVMTCk/IGVmZmVjdHMgOiAiTlVMTCIpOworICAgIHByaW50ZigiXG5cclx0U3VwcG9ydGVkIFNjZW5lIE1vZGVzOiAlcyIsCisgICAgICAgICAgIChzY2VuZV9tb2RlcyAhPSBOVUxMKT8gc2NlbmVfbW9kZXMgOiAiTlVMTCIpOworICAgIHByaW50ZigiXG5cclx0U3VwcG9ydGVkIEZvY3VzIE1vZGVzOiAlcyIsCisgICAgICAgICAgIChmb2N1c19tb2RlcyAhPSBOVUxMKT8gZm9jdXNfbW9kZXMgOiAiTlVMTCIpOworICAgIHByaW50ZigiXG5cclx0U3VwcG9ydGVkIEFudGliYW5kaW5nIE9wdGlvbnM6ICVzIiwKKyAgICAgICAgICAgKGFudGliYW5kaW5nX21vZGVzICE9IE5VTEwpPyBhbnRpYmFuZGluZ19tb2RlcyA6ICJOVUxMIik7CisgICAgcHJpbnRmKCJcblxyXHRTdXBwb3J0ZWQgRmxhc2ggTW9kZXM6ICVzIiwKKyAgICAgICAgICAgKGZsYXNoX21vZGVzICE9IE5VTEwpPyBmbGFzaF9tb2RlcyA6ICJOVUxMIik7CisgICAgcHJpbnRmKCJcblxyXHRTdXBwb3J0ZWQgRm9jdXMgQXJlYXM6ICVkIiwgZm9jdXNfYXJlYXMpOworICAgIHByaW50ZigiXG5cclx0U3VwcG9ydGVkIEZQUyByYW5nZXMgOiAlcyIsCisgICAgICAgICAgIChmcHNfcmFuZ2VzICE9IE5VTEwpPyBmcHNfcmFuZ2VzIDogIk5VTEwiKTsKKyAgICBwcmludGYoIlxuXHJcdEZvY3VzIERpc3RhbmNlczogJXMgXG4iLAorICAgICAgICAgICAoZm9jdXNfZGlzdGFuY2VzICE9IE5VTEwpPyBmb2N1c19kaXN0YW5jZXMgOiAiTlVMTCIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNyZWF0ZVByZXZpZXdTdXJmYWNlCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgcHJldmlldyBzdXJmYWNlcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAd2lkdGggOiBwcmV2aWV3IHdpZHRoCisgKiAgIEBoZWlnaHQ6IHByZXZpZXcgaGVpZ2h0CisgKiAgIEBwaXhGb3JtYXQgOiBzdXJmYWNlIHBpeGVsZm9ybWF0CisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IENhbWVyYUNvbnRleHQ6OmNyZWF0ZVByZXZpZXdTdXJmYWNlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50MzJfdCBwaXhGb3JtYXQpCit7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIERpc3BsYXlJbmZvIGRpbmZvOworICAgIHNwPElCaW5kZXI+IGRpc3BsYXkoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRCdWlsdEluRGlzcGxheSgKKyAgICAgICAgICAgICAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKSk7CisgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmZGluZm8pOworICAgIHVpbnQzMl90IHByZXZpZXdXaWR0aCwgcHJldmlld0hlaWdodDsKKworICAgIGlmICgoMCA+PSB3aWR0aCkgfHwgKDAgPj0gaGVpZ2h0KSkgeworICAgICAgICBwcmludGYoIkJhZCBwcmV2aWV3IHN1cmZhY2Ugc2l6ZSAlZHglZFxuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKChpbnQpZGluZm8udyA8IHdpZHRoKSB7CisgICAgICAgIHByZXZpZXdXaWR0aCA9IGRpbmZvLnc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJldmlld1dpZHRoID0gKHVuc2lnbmVkIGludCl3aWR0aDsKKyAgICB9CisKKyAgICBpZiAoKGludClkaW5mby5oIDwgaGVpZ2h0KSB7CisgICAgICAgIHByZXZpZXdIZWlnaHQgPSBkaW5mby5oOworICAgIH0gZWxzZSB7CisgICAgICAgIHByZXZpZXdIZWlnaHQgPSAodW5zaWduZWQgaW50KWhlaWdodDsKKyAgICB9CisKKyAgICBtQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudCgpOworCisgICAgaWYgKCBOVUxMID09IG1DbGllbnQuZ2V0KCkgKSB7CisgICAgICAgIHByaW50ZigiVW5hYmxlIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIFN1cmZhY2UgQ29tcG9zZXIgXG4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgbVN1cmZhY2VDb250cm9sID0gbUNsaWVudC0+Y3JlYXRlU3VyZmFjZShTdHJpbmc4KCJRQ2FtZXJhX1Rlc3QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoIE5VTEwgPT0gbVN1cmZhY2VDb250cm9sLmdldCgpICkgeworICAgICAgICBwcmludGYoIlVuYWJsZSB0byBjcmVhdGUgcHJldmlldyBzdXJmYWNlIFxuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIG1QcmV2aWV3U3VyZmFjZSA9IG1TdXJmYWNlQ29udHJvbC0+Z2V0U3VyZmFjZSgpOworICAgIGlmICggTlVMTCAhPSBtUHJldmlld1N1cmZhY2UuZ2V0KCkgKSB7CisgICAgICAgIG1DbGllbnQtPm9wZW5HbG9iYWxUcmFuc2FjdGlvbigpOworICAgICAgICByZXQgfD0gbVN1cmZhY2VDb250cm9sLT5zZXRMYXllcigweDdmZmZmZmZmKTsKKyAgICAgICAgaWYgKCBtQ2FtZXJhSW5kZXggPT0gMCApCisgICAgICAgICAgICByZXQgfD0gbVN1cmZhY2VDb250cm9sLT5zZXRQb3NpdGlvbigwLCAwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0IHw9IG1TdXJmYWNlQ29udHJvbC0+c2V0UG9zaXRpb24oKGZsb2F0KShkaW5mby53IC0gcHJldmlld1dpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0KShkaW5mby5oIC0gcHJldmlld0hlaWdodCkpOworCisgICAgICAgIHJldCB8PSBtU3VyZmFjZUNvbnRyb2wtPnNldFNpemUocHJldmlld1dpZHRoLCBwcmV2aWV3SGVpZ2h0KTsKKyAgICAgICAgcmV0IHw9IG1TdXJmYWNlQ29udHJvbC0+c2hvdygpOworICAgICAgICBtQ2xpZW50LT5jbG9zZUdsb2JhbFRyYW5zYWN0aW9uKCk7CisKKyAgICAgICAgaWYgKCBOT19FUlJPUiAhPSByZXQgKSB7CisgICAgICAgICAgICBwcmludGYoIlByZXZpZXcgc3VyZmFjZSBjb25maWd1cmF0aW9uIGZhaWxlZCEgXG4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE5PX0lOSVQ7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkZXN0cm95UHJldmlld1N1cmZhY2UKKyAqCisgKiBERVNDUklQVElPTjogY2xvc2VzIHByZXZpb3VzbHkgb3BlbiBwcmV2aWV3IHN1cmZhY2UKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdGF0dXNfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0dXNfdCBDYW1lcmFDb250ZXh0OjpkZXN0cm95UHJldmlld1N1cmZhY2UoKQoreworICAgIGlmICggTlVMTCAhPSBtUHJldmlld1N1cmZhY2UuZ2V0KCkgKSB7CisgICAgICAgIG1QcmV2aWV3U3VyZmFjZS5jbGVhcigpOworICAgIH0KKworICAgIGlmICggTlVMTCAhPSBtU3VyZmFjZUNvbnRyb2wuZ2V0KCkgKSB7CisgICAgICAgIG1TdXJmYWNlQ29udHJvbC0+Y2xlYXIoKTsKKyAgICAgICAgbVN1cmZhY2VDb250cm9sLmNsZWFyKCk7CisgICAgfQorCisgICAgaWYgKCBOVUxMICE9IG1DbGllbnQuZ2V0KCkgKSB7CisgICAgICAgIG1DbGllbnQtPmRpc3Bvc2UoKTsKKyAgICAgICAgbUNsaWVudC5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBDYW1lcmFDb250ZXh0CisgKgorICogREVTQ1JJUFRJT046IGNhbWVyYSBjb250ZXh0IGNvbnN0cnVjdG9yCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitDYW1lcmFDb250ZXh0OjpDYW1lcmFDb250ZXh0KGludCBjYW1lcmFJbmRleCkgOgorICAgIG1DYW1lcmFJbmRleChjYW1lcmFJbmRleCksCisgICAgbVJlc2l6ZVByZXZpZXcodHJ1ZSksCisgICAgbUhhcmR3YXJlQWN0aXZlKGZhbHNlKSwKKyAgICBtUHJldmlld1J1bm5pbmcoZmFsc2UpLAorICAgIG1SZWNvcmRSdW5uaW5nKGZhbHNlKSwKKyAgICBtVmlkZW9GZCgtMSksCisgICAgbVZpZGVvSWR4KDApLAorICAgIG1SZWNvcmRpbmdIaW50KGZhbHNlKSwKKyAgICBtRG9QcmludE1lbnUodHJ1ZSksCisgICAgbVBpUENhcHR1cmUoZmFsc2UpLAorICAgIG1mbXRNdWx0aXBsaWVyKDEpLAorICAgIG1TZWN0aW9uc1JlYWQoZmFsc2UpLAorICAgIG1TZWN0aW9uc0FsbG9jYXRlZCgwKSwKKyAgICBtU2VjdGlvbnMoTlVMTCksCisgICAgbUpFWElGVG1wKE5VTEwpLAorICAgIG1IYXZlQWxsKGZhbHNlKSwKKyAgICBtQ2FtZXJhKE5VTEwpLAorICAgIG1DbGllbnQoTlVMTCksCisgICAgbVN1cmZhY2VDb250cm9sKE5VTEwpLAorICAgIG1QcmV2aWV3U3VyZmFjZShOVUxMKSwKKyAgICBtSW5Vc2UoZmFsc2UpCit7CisgICAgbVJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoU3RyaW5nMTYoImNhbWVyYSIpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgICA6IHNldFRlc3RDdHhJbnN0YW5jZQorICoKKyAqIERFU0NSSVBUSU9OICA6IFNlbmRzIFRlc3RDb250ZXh0IGluc3RhbmNlIHRvIENhbWVyYUNvbnRleHQKKyAqCisgKiBQQVJBTUVURVJTICAgOgorICogICAgQGluc3RhbmNlIDogVGVzdENvbnRleHQgaW5zdGFuY2UKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIENhbWVyYUNvbnRleHQ6OnNldFRlc3RDdHhJbnN0YW5jZShUZXN0Q29udGV4dCAgKmluc3RhbmNlKQoreworICAgIG1JbnRlcnByID0gaW5zdGFuY2U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICAgOiBzZXRUZXN0Q3R4SW5zdAorICoKKyAqIERFU0NSSVBUSU9OICA6IFNlbmRzIFRlc3RDb250ZXh0IGluc3RhbmNlIHRvIEludGVycHJldGVyCisgKgorICogUEFSQU1FVEVSUyAgIDoKKyAqICAgIEBpbnN0YW5jZSA6IFRlc3RDb250ZXh0IGluc3RhbmNlCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBJbnRlcnByZXRlcjo6c2V0VGVzdEN0eEluc3QoVGVzdENvbnRleHQgICppbnN0YW5jZSkKK3sKKyAgICBtVGVzdENvbnRleHQgPSBpbnN0YW5jZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+Q2FtZXJhQ29udGV4dAorICoKKyAqIERFU0NSSVBUSU9OOiBjYW1lcmEgY29udGV4dCBkZXN0cnVjdG9yCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitDYW1lcmFDb250ZXh0Ojp+Q2FtZXJhQ29udGV4dCgpCit7CisgICAgc3RvcFByZXZpZXcoKTsKKyAgICBjbG9zZUNhbWVyYSgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG9wZW5DYW1lcmEKKyAqCisgKiBERVNDUklQVElPTjogY29ubmVjdHMgdG8gYW5kIGluaXRpYWxpemVzIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190ICBDYW1lcmFDb250ZXh0OjpvcGVuQ2FtZXJhKCkKK3sKKyAgICB1c2VMb2NrKCk7CisgICAgY29uc3QgY2hhciAqWlNMU3RyID0gTlVMTDsKKyAgICBzaXplX3QgWlNMU3RyU2l6ZSA9IDA7CisKKyAgICBpZiAoIE5VTEwgIT0gbUNhbWVyYS5nZXQoKSApIHsKKyAgICAgICAgcHJpbnRmKCJDYW1lcmEgYWxyZWFkeSBvcGVuISBcbiIpOworICAgICAgICBzaWduYWxGaW5pc2hlZCgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgcHJpbnRmKCJvcGVuQ2FtZXJhKGNhbWVyYV9pbmRleD0lZClcbiIsIG1DYW1lcmFJbmRleCk7CisKKyNpZm5kZWYgVVNFX0pCX01SMQorCisgICAgU3RyaW5nMTYgcGFja2FnZU5hbWUoIkNhbWVyYVRlc3QiKTsKKworICAgIG1DYW1lcmEgPSBDYW1lcmE6OmNvbm5lY3QobUNhbWVyYUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmE6OlVTRV9DQUxMSU5HX1VJRCk7CisKKyNlbHNlCisKKyAgICBtQ2FtZXJhID0gQ2FtZXJhOjpjb25uZWN0KG1DYW1lcmFJbmRleCk7CisKKyNlbmRpZgorCisgICAgaWYgKCBOVUxMID09IG1DYW1lcmEuZ2V0KCkgKSB7CisgICAgICAgIHByaW50ZigiVW5hYmxlIHRvIGNvbm5lY3QgdG8gQ2FtZXJhU2VydmljZVxuIik7CisgICAgICAgIHNpZ25hbEZpbmlzaGVkKCk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIG1QYXJhbXMgPSBtQ2FtZXJhLT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgbVBhcmFtcy5nZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMobVN1cHBvcnRlZFByZXZpZXdTaXplcyk7CisgICAgbVBhcmFtcy5nZXRTdXBwb3J0ZWRQaWN0dXJlU2l6ZXMobVN1cHBvcnRlZFBpY3R1cmVTaXplcyk7CisgICAgbVBhcmFtcy5nZXRTdXBwb3J0ZWRWaWRlb1NpemVzKG1TdXBwb3J0ZWRWaWRlb1NpemVzKTsKKworICAgIG1DdXJyZW50UGljdHVyZVNpemVJZHggPSBtU3VwcG9ydGVkUGljdHVyZVNpemVzLnNpemUoKSAvIDI7CisgICAgbUN1cnJlbnRQcmV2aWV3U2l6ZUlkeCA9IG1TdXBwb3J0ZWRQcmV2aWV3U2l6ZXMuc2l6ZSgpIC8gMjsKKyAgICBtQ3VycmVudFZpZGVvU2l6ZUlkeCAgID0gbVN1cHBvcnRlZFZpZGVvU2l6ZXMuc2l6ZSgpIC8gMjsKKworICAgIG1DYW1lcmEtPnNldExpc3RlbmVyKHRoaXMpOworICAgIG1IYXJkd2FyZUFjdGl2ZSA9IHRydWU7CisKKyAgICBtSW50ZXJwci0+c2V0VmlWU2l6ZSgoU2l6ZSkgbVN1cHBvcnRlZFZpZGVvU2l6ZXMuaXRlbUF0KAorICAgICAgICBtQ3VycmVudFZpZGVvU2l6ZUlkeCksCisgICAgICAgIG1DYW1lcmFJbmRleCk7CisKKyAgICBaU0xTdHIgPSBtUGFyYW1zLmdldChDYW1lcmFDb250ZXh0OjpLRVlfWlNMKTsKKyAgICBpZiAoTlVMTCAhPSBaU0xTdHIpIHsKKyAgICAgICAgWlNMU3RyU2l6ZSA9IHN0cmxlbihaU0xTdHIpOworICAgICAgICBpZiAoIXN0cm5jbXAoWlNMU3RyLCAib24iLCBaU0xTdHJTaXplKSkgeworICAgICAgICAgICAgbUludGVycHItPm1Jc1pTTE9uID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChaU0xTdHIsICJvZmYiLCBaU0xTdHJTaXplKSkgeworICAgICAgICAgICAgbUludGVycHItPm1Jc1pTTE9uID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoInpzbCB2YWx1ZSBpcyBub3QgdmFsaWQhXG4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigienNsIGlzIE5VTExcbiIpOworICAgIH0KKworICAgIHNpZ25hbEZpbmlzaGVkKCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogb25Bc0JpbmRlcgorICoKKyAqIERFU0NSSVBUSU9OOiBvbkFzQmluZGVyCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogUG9pbnRlciB0byBJQmluZGVyCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0lCaW5kZXIqIENhbWVyYUNvbnRleHQ6Om9uQXNCaW5kZXIoKSB7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TnVtYmVyT2ZDYW1lcmFzCisgKgorICogREVTQ1JJUFRJT046IHJldHVybnMgdGhlIG51bWJlciBvZiBzdXBwb3J0ZWQgY2FtZXJhIGJ5IHRoZSBzeXN0ZW0KKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdXBwb3J0ZWQgY2FtZXJhIGNvdW50CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBDYW1lcmFDb250ZXh0OjpnZXROdW1iZXJPZkNhbWVyYXMoKQoreworICAgIGludCByZXQgPSAtMTsKKworICAgIGlmICggTlVMTCAhPSBtQ2FtZXJhLmdldCgpICkgeworICAgICAgICByZXQgPSBtQ2FtZXJhLT5nZXROdW1iZXJPZkNhbWVyYXMoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNsb3NlQ2FtZXJhCisgKgorICogREVTQ1JJUFRJT046IGNsb3NlcyBhIHByZXZpb3VzbHkgdGhlIGluaXRpYWxpemVkIGNhbWVyYSByZWZlcmVuY2UKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdGF0dXNfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0dXNfdCBDYW1lcmFDb250ZXh0OjpjbG9zZUNhbWVyYSgpCit7CisgICAgdXNlTG9jaygpOworICAgIGlmICggTlVMTCA9PSBtQ2FtZXJhLmdldCgpICkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBtQ2FtZXJhLT5kaXNjb25uZWN0KCk7CisgICAgbUNhbWVyYS5jbGVhcigpOworCisgICAgbVJlY29yZGVyLT5pbml0KCk7CisgICAgbVJlY29yZGVyLT5jbG9zZSgpOworICAgIG1SZWNvcmRlci0+cmVsZWFzZSgpOworICAgIG1SZWNvcmRlci5jbGVhcigpOworCisgICAgbUhhcmR3YXJlQWN0aXZlID0gZmFsc2U7CisgICAgbVByZXZpZXdSdW5uaW5nID0gZmFsc2U7CisgICAgbVJlY29yZFJ1bm5pbmcgPSBmYWxzZTsKKworICAgIHNpZ25hbEZpbmlzaGVkKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0YXJ0UHJldmlldworICoKKyAqIERFU0NSSVBUSU9OOiBzdGFydHMgY2FtZXJhIHByZXZpZXcKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdGF0dXNfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0dXNfdCBDYW1lcmFDb250ZXh0OjpzdGFydFByZXZpZXcoKQoreworICAgIHVzZUxvY2soKTsKKworICAgIGludCByZXQgPSBOT19FUlJPUjsKKyAgICBpbnQgcHJldmlld1dpZHRoLCBwcmV2aWV3SGVpZ2h0OworICAgIFNpemUgY2FsY3VsYXRlZFByZXZpZXdTaXplOworICAgIFNpemUgY3VycmVudFByZXZpZXdTaXplID0gbVN1cHBvcnRlZFByZXZpZXdTaXplcy5pdGVtQXQoCisgICAgICAgIG1DdXJyZW50UHJldmlld1NpemVJZHgpOworICAgIFNpemUgY3VycmVudFBpY3R1cmVTaXplID0gbVN1cHBvcnRlZFBpY3R1cmVTaXplcy5pdGVtQXQoCisgICAgICAgIG1DdXJyZW50UGljdHVyZVNpemVJZHgpOworICAgIFNpemUgY3VycmVudFZpZGVvU2l6ZSAgID0gbVN1cHBvcnRlZFZpZGVvU2l6ZXMuaXRlbUF0KAorICAgICAgICBtQ3VycmVudFZpZGVvU2l6ZUlkeCk7CisKKyNpZm5kZWYgVVNFX0pCX01SMQorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwOworCisjZW5kaWYKKworICAgIGlmICghbUhhcmR3YXJlQWN0aXZlICkgeworICAgICAgICBwcmludGYoIkNhbWVyYSBub3QgYWN0aXZlISBcbiIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAobVByZXZpZXdSdW5uaW5nKSB7CisgICAgICAgIHByaW50ZigiUHJldmlldyBpcyBhbHJlYWR5IHJ1bm5pbmchIFxuIik7CisgICAgICAgIHNpZ25hbEZpbmlzaGVkKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobVJlc2l6ZVByZXZpZXcpIHsKKyAgICAgICAgbVByZXZpZXdSdW5uaW5nID0gZmFsc2U7CisKKyAgICAgICAgaWYgKCBtUmVjb3JkaW5nSGludCApIHsKKyAgICAgICAgICAgIGNhbGN1bGF0ZWRQcmV2aWV3U2l6ZSA9CisgICAgICAgICAgICAgICAgZ2V0UHJldmlld1NpemVGcm9tVmlkZW9TaXplcyhjdXJyZW50VmlkZW9TaXplKTsKKyAgICAgICAgICAgIHByZXZpZXdXaWR0aCA9IGNhbGN1bGF0ZWRQcmV2aWV3U2l6ZS53aWR0aDsKKyAgICAgICAgICAgIHByZXZpZXdIZWlnaHQgPSBjYWxjdWxhdGVkUHJldmlld1NpemUuaGVpZ2h0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJldmlld1dpZHRoID0gY3VycmVudFByZXZpZXdTaXplLndpZHRoOworICAgICAgICAgICAgcHJldmlld0hlaWdodCA9IGN1cnJlbnRQcmV2aWV3U2l6ZS5oZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBjcmVhdGVQcmV2aWV3U3VyZmFjZShwcmV2aWV3V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpZXdIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQKTsKKyAgICAgICAgaWYgKCAgTk9fRVJST1IgIT0gcmV0ICkgeworICAgICAgICAgICAgcHJpbnRmKCJFcnJvciB3aGlsZSBjcmVhdGluZyBwcmV2aWV3IHN1cmZhY2VcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCByZGkgbW9kZSBpZiBzeXN0ZW0gcHJvcCBpcyBzZXQgZm9yIGZyb250IGNhbWVyYQorICAgICAgICBpZiAobUNhbWVyYUluZGV4ID09IDEpIHsKKyAgICAgICAgICAgIGNoYXIgdmFsdWVbMzJdOworICAgICAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5yZGltb2RlIiwgdmFsdWUsICIwIik7CisgICAgICAgICAgICBpbnQgcmRpbW9kZSA9IGF0b2kodmFsdWUpOworICAgICAgICAgICAgcHJpbnRmKCJyZGkgbW9kZSA9ICVkXG4iLCByZGltb2RlKTsKKyAgICAgICAgICAgIGlmIChyZGltb2RlID09IDEpIHsKKyAgICAgICAgICAgICAgICBtUGFyYW1zLnNldCgicmRpLW1vZGUiLCAiZW5hYmxlIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QYXJhbXMuc2V0KCJyZGktbW9kZSIsICJkaXNhYmxlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUGFyYW1zLnNldCgicmRpLW1vZGUiLCAiZGlzYWJsZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy9tUGFyYW1zLnNldCgicmRpLW1vZGUiLCAiZW5hYmxlIik7CisgICAgICAgIG1QYXJhbXMuc2V0KCJyZWNvcmRpbmctaGludCIsICJ0cnVlIik7CisgICAgICAgIG1QYXJhbXMuc2V0UHJldmlld1NpemUocHJldmlld1dpZHRoLCBwcmV2aWV3SGVpZ2h0KTsKKyAgICAgICAgbVBhcmFtcy5zZXRQaWN0dXJlU2l6ZShjdXJyZW50UGljdHVyZVNpemUud2lkdGgsCisgICAgICAgICAgICBjdXJyZW50UGljdHVyZVNpemUuaGVpZ2h0KTsKKyAgICAgICAgbVBhcmFtcy5zZXRWaWRlb1NpemUoCisgICAgICAgICAgICBjdXJyZW50VmlkZW9TaXplLndpZHRoLCBjdXJyZW50VmlkZW9TaXplLmhlaWdodCk7CisKKyAgICAgICAgcmV0IHw9IG1DYW1lcmEtPnNldFBhcmFtZXRlcnMobVBhcmFtcy5mbGF0dGVuKCkpOworCisjaWZuZGVmIFVTRV9KQl9NUjEKKworICAgICAgICBnYnAgPSBtUHJldmlld1N1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICAgICAgcmV0IHw9IG1DYW1lcmEtPnNldFByZXZpZXdUYXJnZXQoZ2JwKTsKKworI2Vsc2UKKworICAgICAgICByZXQgfD0gbUNhbWVyYS0+c2V0UHJldmlld0Rpc3BsYXkobVByZXZpZXdTdXJmYWNlKTsKKworI2VuZGlmCisgICAgICAgIG1SZXNpemVQcmV2aWV3ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCAhbVByZXZpZXdSdW5uaW5nICkgeworICAgICAgICByZXQgfD0gbUNhbWVyYS0+c3RhcnRQcmV2aWV3KCk7CisgICAgICAgIGlmICggTk9fRVJST1IgIT0gcmV0ICkgeworICAgICAgICAgICAgcHJpbnRmKCJQcmV2aWV3IHN0YXJ0IGZhaWxlZCEgXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBtUHJldmlld1J1bm5pbmcgPSB0cnVlOworICAgIH0KKworICAgIHNpZ25hbEZpbmlzaGVkKCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFByZXZpZXdTaXplRnJvbVZpZGVvU2l6ZXMKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSBwcmV2aWV3IHNpemUgZnJvbSB2aWRlbyBzaXplLiBGaW5kIGFsbCByZXNvbHV0aW9ucyB3aXRoCisgKiAgICAgICAgICAgICAgdGhlIHNhbWUgYXNwZWN0IHJhdGlvIGFuZCBjaG9vc2UgdGhlIHNhbWUgb3IgdGhlIGNsb3Nlc3QKKyAqICAgICAgICAgICAgICBmcm9tIHRoZW0uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjdXJyZW50VmlkZW9TaXplOiBjdXJyZW50IHZpZGVvIHNpemUKKworICoKKyAqIFJFVFVSTiAgICAgOiBQcmV2aWV3U2l6ZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitTaXplIENhbWVyYUNvbnRleHQ6OmdldFByZXZpZXdTaXplRnJvbVZpZGVvU2l6ZXMoU2l6ZSBjdXJyZW50VmlkZW9TaXplKQoreworCisgICAgU2l6ZSB0bXBQcmV2aWV3U2l6ZTsKKyAgICBTaXplIFByZXZpZXdTaXplOworICAgIFNpemUgUHJldmlld1NpemVzW21TdXBwb3J0ZWRQcmV2aWV3U2l6ZXMuc2l6ZSgpXTsKKyAgICBkb3VibGUgdG9sZXJhbmNlID0gMC4wMDAwMTsKKyAgICBkb3VibGUgdmlkZW9SYXRpbzsKKyAgICBkb3VibGUgcHJldmlld1JhdGlvOworICAgIHNpemVfdCBpID0gMDsKKyAgICBzaXplX3QgaiA9IDA7CisgICAgaW50IGRlbHRhOworCisgICAgLy8gRmluZCBhbGwgdGhlIHJlc29sdXRpb25zIHdpdGggdGhlIHNhbWUgYXNwZWN0IHJhdGlvIGFuZCBjaG9vc2UgdGhlCisgICAgLy8gc2FtZSBvciB0aGUgY2xvc2VzdCByZXNvbHV0aW9uIGZyb20gdGhlbS4gQ2hvb3NlIHRoZSBjbG9zZXN0IHJlc29sdXRpb24KKyAgICAvLyBpbiBjYXNlIHNhbWUgYXNwZWN0IHJhdGlvIGlzIG5vdCBmb3VuZAorICAgIGlmIChjdXJyZW50VmlkZW9TaXplLndpZHRoICogY3VycmVudFZpZGVvU2l6ZS5oZWlnaHQgPiAwICYmCisgICAgICAgICAgICBtU3VwcG9ydGVkUHJldmlld1NpemVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgdmlkZW9SYXRpbyA9IChmbG9hdCljdXJyZW50VmlkZW9TaXplLndpZHRoIC8KKyAgICAgICAgICAgIChmbG9hdCljdXJyZW50VmlkZW9TaXplLmhlaWdodDsKKyAgICAgICAgZm9yIChpPTA7IGk8bVN1cHBvcnRlZFByZXZpZXdTaXplcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgdG1wUHJldmlld1NpemUgPSBtU3VwcG9ydGVkUHJldmlld1NpemVzLml0ZW1BdChpKTsKKyAgICAgICAgICAgIHByZXZpZXdSYXRpbyA9IChmbG9hdCl0bXBQcmV2aWV3U2l6ZS53aWR0aCAvCisgICAgICAgICAgICAgICAgKGZsb2F0KXRtcFByZXZpZXdTaXplLmhlaWdodDsKKyAgICAgICAgICAgIGlmIChmYWJzKHZpZGVvUmF0aW8gLSBwcmV2aWV3UmF0aW8pIDwgdG9sZXJhbmNlKSB7CisgICAgICAgICAgICAgICAgUHJldmlld1NpemVzW2pdID0gdG1wUHJldmlld1NpemU7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCBqID4gMCApIHsKKyAgICAgICAgICAgIGRlbHRhID0gYWJzKChjdXJyZW50VmlkZW9TaXplLndpZHRoICpjdXJyZW50VmlkZW9TaXplLmhlaWdodCktCisgICAgICAgICAgICAgICAgKFByZXZpZXdTaXplc1swXS53aWR0aCAqIFByZXZpZXdTaXplc1swXS5oZWlnaHQpKTsKKyAgICAgICAgICAgIFByZXZpZXdTaXplID0gUHJldmlld1NpemVzWzBdOworICAgICAgICAgICAgZm9yIChpPTA7IGk8ajsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYoYWJzKGN1cnJlbnRWaWRlb1NpemUud2lkdGggKiBjdXJyZW50VmlkZW9TaXplLmhlaWdodCkgLQorICAgICAgICAgICAgICAgICAgICAoUHJldmlld1NpemVzW2ldLndpZHRoICogUHJldmlld1NpemVzW2ldLmhlaWdodCkgPAorICAgICAgICAgICAgICAgICAgICBkZWx0YSkgeworICAgICAgICAgICAgICAgICAgICBQcmV2aWV3U2l6ZSA9IFByZXZpZXdTaXplc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBhYnMoKGN1cnJlbnRWaWRlb1NpemUud2lkdGggKgorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFZpZGVvU2l6ZS5oZWlnaHQpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIChQcmV2aWV3U2l6ZXNbaV0ud2lkdGggKiBQcmV2aWV3U2l6ZXNbaV0uaGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ2hvb3NlIHRoZSBjbG9zZXN0IHJlc29sdXRpb24gaW4gY2FzZSBzYW1lIGFzcGVjdCByYXRpbyBpcworICAgICAgICAgICAgLy8gbm90IGZvdW5kCisgICAgICAgICAgICB0bXBQcmV2aWV3U2l6ZSA9IG1TdXBwb3J0ZWRQcmV2aWV3U2l6ZXMuaXRlbUF0KGopOworICAgICAgICAgICAgUHJldmlld1NpemUgPSB0bXBQcmV2aWV3U2l6ZTsKKyAgICAgICAgICAgIGRlbHRhID0gYWJzKAorICAgICAgICAgICAgICAgICAgICAoY3VycmVudFZpZGVvU2l6ZS53aWR0aCAqIGN1cnJlbnRWaWRlb1NpemUuaGVpZ2h0KS0KKyAgICAgICAgICAgICAgICAgICAgKHRtcFByZXZpZXdTaXplLndpZHRoICogdG1wUHJldmlld1NpemUuaGVpZ2h0KSk7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxtU3VwcG9ydGVkUHJldmlld1NpemVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgdG1wUHJldmlld1NpemUgPSBtU3VwcG9ydGVkUHJldmlld1NpemVzLml0ZW1BdChpKTsKKyAgICAgICAgICAgICAgICBpZihhYnMoCisgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudFZpZGVvU2l6ZS53aWR0aCAqIGN1cnJlbnRWaWRlb1NpemUuaGVpZ2h0KS0KKyAgICAgICAgICAgICAgICAgICAgICAgICh0bXBQcmV2aWV3U2l6ZS53aWR0aCAqIHRtcFByZXZpZXdTaXplLmhlaWdodCkpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhKSB7CisgICAgICAgICAgICAgICAgICAgIFByZXZpZXdTaXplID0gdG1wUHJldmlld1NpemU7CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gYWJzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdXJyZW50VmlkZW9TaXplLndpZHRoICogY3VycmVudFZpZGVvU2l6ZS5oZWlnaHQpLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0bXBQcmV2aWV3U2l6ZS53aWR0aCAqIHRtcFByZXZpZXdTaXplLmhlaWdodCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldCgmUHJldmlld1NpemUsIDAsIHNpemVvZihQcmV2aWV3U2l6ZSkpOworICAgIH0KKyAgICByZXR1cm4gUHJldmlld1NpemU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYXV0b0ZvY3VzCisgKgorICogREVTQ1JJUFRJT046IFRyaWdnZXJzIGF1dG9mb2N1cworICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IENhbWVyYUNvbnRleHQ6OmF1dG9Gb2N1cygpCit7CisgICAgdXNlTG9jaygpOworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworCisgICAgaWYgKCBtUHJldmlld1J1bm5pbmcgKSB7CisgICAgICAgIHJldCA9IG1DYW1lcmEtPmF1dG9Gb2N1cygpOworICAgIH0KKworICAgIHNpZ25hbEZpbmlzaGVkKCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBlbmFibGVQcmV2aWV3Q2FsbGJhY2tzCisgKgorICogREVTQ1JJUFRJT046IEVuYWJsZXMgcHJldmlldyBjYWxsYmFjayBtZXNzYWdlcworICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IENhbWVyYUNvbnRleHQ6OmVuYWJsZVByZXZpZXdDYWxsYmFja3MoKQoreworICAgIHVzZUxvY2soKTsKKyAgICBpZiAoIG1IYXJkd2FyZUFjdGl2ZSApIHsKKyAgICAgICAgbUNhbWVyYS0+c2V0UHJldmlld0NhbGxiYWNrRmxhZ3MoCisgICAgICAgICAgICBDQU1FUkFfRlJBTUVfQ0FMTEJBQ0tfRkxBR19FTkFCTEVfTUFTSyk7CisgICAgfQorCisgICAgc2lnbmFsRmluaXNoZWQoKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdGFrZVBpY3R1cmUKKyAqCisgKiBERVNDUklQVElPTjogdHJpZ2dlcnMgaW1hZ2UgY2FwdHVyZQorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IENhbWVyYUNvbnRleHQ6OnRha2VQaWN0dXJlKCkKK3sKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICB1c2VMb2NrKCk7CisgICAgaWYgKCBtUHJldmlld1J1bm5pbmcgKSB7CisgICAgICAgIHJldCA9IG1DYW1lcmEtPnRha2VQaWN0dXJlKAorICAgICAgICAgICAgQ0FNRVJBX01TR19DT01QUkVTU0VEX0lNQUdFfAorICAgICAgICAgICAgQ0FNRVJBX01TR19SQVdfSU1BR0UpOworICAgICAgICBpZiAoIW1SZWNvcmRpbmdIaW50ICYmICFtSW50ZXJwci0+bUlzWlNMT24pIHsKKyAgICAgICAgICAgIG1QcmV2aWV3UnVubmluZyA9IGZhbHNlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJQbGVhc2UgcmVzdW1lL3N0YXJ0IHRoZSBwcmV2aWV3IGJlZm9yZSB0YWtpbmcgYSBwaWN0dXJlIVxuIik7CisgICAgfQorICAgIHNpZ25hbEZpbmlzaGVkKCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjb25maWd1cmVSZWNvcmRlcgorICoKKyAqIERFU0NSSVBUSU9OOiBDb25maWd1cmUgdmlkZW8gcmVjb3JkZXIKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdGF0dXNfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0dXNfdCBDYW1lcmFDb250ZXh0Ojpjb25maWd1cmVSZWNvcmRlcigpCit7CisgICAgdXNlTG9jaygpOworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworCisgICAgbVJlc2l6ZVByZXZpZXcgPSB0cnVlOworICAgIG1QYXJhbXMuc2V0KCJyZWNvcmRpbmctaGludCIsICJ0cnVlIik7CisgICAgbVJlY29yZGluZ0hpbnQgPSB0cnVlOworICAgIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMobVBhcmFtcy5mbGF0dGVuKCkpOworCisgICAgU2l6ZSB2aWRlb1NpemUgPSBtU3VwcG9ydGVkVmlkZW9TaXplcy5pdGVtQXQobUN1cnJlbnRWaWRlb1NpemVJZHgpOworICAgIHJldCA9IG1SZWNvcmRlci0+c2V0UGFyYW1ldGVycygKKyAgICAgICAgU3RyaW5nOCgidmlkZW8tcGFyYW0tZW5jb2RpbmctYml0cmF0ZT02NDAwMCIpKTsKKyAgICBpZiAoIHJldCAhPSBOT19FUlJPUiApIHsKKyAgICAgICAgTE9HRSgiQ291bGQgbm90IGNvbmZpZ3VyZSByZWNvcmRlciAoJWQpIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSBtUmVjb3JkZXItPnNldENhbWVyYSgKKyAgICAgICAgbUNhbWVyYS0+cmVtb3RlKCksIG1DYW1lcmEtPmdldFJlY29yZGluZ1Byb3h5KCkpOworICAgIGlmICggcmV0ICE9IE5PX0VSUk9SICkgeworICAgICAgICBMT0dFKCJDb3VsZCBub3Qgc2V0IGNhbWVyYSAoJWQpIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0ID0gbVJlY29yZGVyLT5zZXRWaWRlb1NvdXJjZShWSURFT19TT1VSQ0VfQ0FNRVJBKTsKKyAgICBpZiAoIHJldCAhPSBOT19FUlJPUiApIHsKKyAgICAgICAgTE9HRSgiQ291bGQgbm90IHNldCB2aWRlbyBzb3J1Y2UgKCVkKSIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldCA9IG1SZWNvcmRlci0+c2V0QXVkaW9Tb3VyY2UoQVVESU9fU09VUkNFX0RFRkFVTFQpOworICAgIGlmICggcmV0ICE9IE5PX0VSUk9SICkgeworICAgICAgICBMT0dFKCJDb3VsZCBub3Qgc2V0IGF1ZGlvIHNvdXJjZSAoJWQpIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0ID0gbVJlY29yZGVyLT5zZXRPdXRwdXRGb3JtYXQoT1VUUFVUX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICBpZiAoIHJldCAhPSBOT19FUlJPUiApIHsKKyAgICAgICAgTE9HRSgiQ291bGQgbm90IHNldCBvdXRwdXQgZm9ybWF0ICglZCkiLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IG1SZWNvcmRlci0+c2V0VmlkZW9FbmNvZGVyKFZJREVPX0VOQ09ERVJfREVGQVVMVCk7CisgICAgaWYgKCByZXQgIT0gTk9fRVJST1IgKSB7CisgICAgICAgIExPR0UoIkNvdWxkIG5vdCBzZXQgdmlkZW8gZW5jb2RlciAoJWQpIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBjaGFyIGZpbGVOYW1lWzEwMF07CisKKyAgICBzbnByaW50ZihmaWxlTmFtZSwgc2l6ZW9mKGZpbGVOYW1lKSAvIHNpemVvZihjaGFyKSwKKyAgICAgICAgICAgICIvc2RjYXJkL3ZpZF9jYW0lZF8lZHglZF8lZC5tcGVnIiwgbUNhbWVyYUluZGV4LAorICAgICAgICAgICAgdmlkZW9TaXplLndpZHRoLCB2aWRlb1NpemUuaGVpZ2h0LCBtVmlkZW9JZHgrKyk7CisKKyAgICBpZiAoIG1WaWRlb0ZkIDwgMCApIHsKKyAgICAgICAgbVZpZGVvRmQgPSBvcGVuKGZpbGVOYW1lLCBPX0NSRUFUIHwgT19SRFdSICk7CisgICAgfQorCisgICAgaWYgKCBtVmlkZW9GZCA8IDAgKSB7CisgICAgICAgIExPR0UoIkNvdWxkIG5vdCBvcGVuIHZpZGVvIGZpbGUgZm9yIHdyaXRpbmcgJXMhIiwgZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXQgPSBtUmVjb3JkZXItPnNldE91dHB1dEZpbGUobVZpZGVvRmQsIDAsIDApOworICAgIGlmICggcmV0ICE9IE5PX0VSUk9SICkgeworICAgICAgICBMT0dFKCJDb3VsZCBub3Qgc2V0IG91dHB1dCBmaWxlICglZCkiLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IG1SZWNvcmRlci0+c2V0VmlkZW9TaXplKHZpZGVvU2l6ZS53aWR0aCwgdmlkZW9TaXplLmhlaWdodCk7CisgICAgaWYgKCByZXQgICE9IE5PX0VSUk9SICkgeworICAgICAgICBMT0dFKCJDb3VsZCBub3Qgc2V0IHZpZGVvIHNpemUgJWR4JWQiLCB2aWRlb1NpemUud2lkdGgsCisgICAgICAgICAgICB2aWRlb1NpemUuaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSBtUmVjb3JkZXItPnNldFZpZGVvRnJhbWVSYXRlKDMwKTsKKyAgICBpZiAoIHJldCAhPSBOT19FUlJPUiApIHsKKyAgICAgICAgTE9HRSgiQ291bGQgbm90IHNldCB2aWRlbyBmcmFtZSByYXRlICglZCkiLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IG1SZWNvcmRlci0+c2V0QXVkaW9FbmNvZGVyKEFVRElPX0VOQ09ERVJfREVGQVVMVCk7CisgICAgaWYgKCByZXQgIT0gTk9fRVJST1IgKSB7CisgICAgICAgIExPR0UoIkNvdWxkIG5vdCBzZXQgYXVkaW8gZW5jb2RlciAoJWQpIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzaWduYWxGaW5pc2hlZCgpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdW5jb25maWd1cmVWaVZSZWNvcmRpbmcKKyAqCisgKiBERVNDUklQVElPTjogVW5jb25maWd1cmVzIHZpZGVvIGluIHZpZGVvIHJlY29yZGluZworICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IENhbWVyYUNvbnRleHQ6OnVuY29uZmlndXJlUmVjb3JkZXIoKQoreworICAgIHVzZUxvY2soKTsKKworICAgIGlmICggIW1SZWNvcmRSdW5uaW5nICkgeworICAgICAgICBtUmVzaXplUHJldmlldyA9IHRydWU7CisgICAgICAgIG1QYXJhbXMuc2V0KCJyZWNvcmRpbmctaGludCIsICJmYWxzZSIpOworICAgICAgICBtUmVjb3JkaW5nSGludCA9IGZhbHNlOworICAgICAgICBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKG1QYXJhbXMuZmxhdHRlbigpKTsKKyAgICB9CisKKyAgICBzaWduYWxGaW5pc2hlZCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjb25maWd1cmVWaVZSZWNvcmRpbmcKKyAqCisgKiBERVNDUklQVElPTjogQ29uZmlndXJlcyB2aWRlbyBpbiB2aWRlbyByZWNvcmRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdGF0dXNfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0dXNfdCBDYW1lcmFDb250ZXh0Ojpjb25maWd1cmVWaVZSZWNvcmRpbmcoKQoreworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworCisgICAgbVJlc2l6ZVByZXZpZXcgPSB0cnVlOworICAgIG1QYXJhbXMuc2V0KCJyZWNvcmRpbmctaGludCIsICJ0cnVlIik7CisgICAgbVJlY29yZGluZ0hpbnQgPSB0cnVlOworICAgIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMobVBhcmFtcy5mbGF0dGVuKCkpOworICAgIG1DYW1lcmEtPnNldFJlY29yZGluZ1Byb3h5TGlzdGVuZXIodGhpcyk7CisKKyAgICBzaWduYWxGaW5pc2hlZCgpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RhcnRSZWNvcmRpbmcKKyAqCisgKiBERVNDUklQVElPTjogdHJpZ2dlcnMgc3RhcnQgcmVjb3JkaW5nCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogc3RhdHVzX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdHVzX3QgQ2FtZXJhQ29udGV4dDo6c3RhcnRSZWNvcmRpbmcoKQoreworICAgIHVzZUxvY2soKTsKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKworCisgICAgaWYgKCBtUHJldmlld1J1bm5pbmcgKSB7CisKKyAgICAgICAgbUNhbWVyYS0+dW5sb2NrKCk7CisKKyAgICAgICAgcmV0ID0gbVJlY29yZGVyLT5wcmVwYXJlKCk7CisgICAgICAgIGlmICggcmV0ICE9IE5PX0VSUk9SICkgeworICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IHByZXBhcmUgcmVjb3JkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBtUmVjb3JkZXItPnN0YXJ0KCk7CisgICAgICAgIGlmICggcmV0ICE9IE5PX0VSUk9SICkgeworICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IHN0YXJ0IHJlY29yZGVyIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgbVJlY29yZFJ1bm5pbmcgPSB0cnVlOworICAgIH0KKyAgICBzaWduYWxGaW5pc2hlZCgpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RvcFJlY29yZGluZworICoKKyAqIERFU0NSSVBUSU9OOiB0cmlnZ2VycyBzdGFydCByZWNvcmRpbmcKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdGF0dXNfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0dXNfdCBDYW1lcmFDb250ZXh0OjpzdG9wUmVjb3JkaW5nKCkKK3sKKyAgICB1c2VMb2NrKCk7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisKKyAgICBpZiAoIG1SZWNvcmRSdW5uaW5nICkgeworICAgICAgICAgICAgbVJlY29yZGVyLT5zdG9wKCk7CisgICAgICAgICAgICBjbG9zZShtVmlkZW9GZCk7CisgICAgICAgICAgICBtVmlkZW9GZCA9IC0xOworCisgICAgICAgIG1SZWNvcmRSdW5uaW5nID0gZmFsc2U7CisgICAgfQorCisgICAgc2lnbmFsRmluaXNoZWQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RhcnRWaVZSZWNvcmRpbmcKKyAqCisgKiBERVNDUklQVElPTjogU3RhcnRzIHZpZGVvIGluIHZpZGVvIHJlY29yZGluZworICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IENhbWVyYUNvbnRleHQ6OnN0YXJ0VmlWUmVjb3JkaW5nKCkKK3sKKyAgICB1c2VMb2NrKCk7CisgICAgc3RhdHVzX3QgcmV0OworCisgICAgaWYgKG1JbnRlcnByLT5tVmlWVmlkLlZpZGVvU2l6ZXNbMF0ud2lkdGggKgorICAgICAgICAgICAgbUludGVycHItPm1WaVZWaWQuVmlkZW9TaXplc1swXS5oZWlnaHQgPj0KKyAgICAgICAgICAgIG1JbnRlcnByLT5tVmlWVmlkLlZpZGVvU2l6ZXNbMV0ud2lkdGggKgorICAgICAgICAgICAgbUludGVycHItPm1WaVZWaWQuVmlkZW9TaXplc1sxXS5oZWlnaHQpIHsKKyAgICAgICAgbUludGVycHItPm1WaVZCdWZmLmJ1ZmZTaXplID0gY2FsY0J1ZmZlclNpemUoCisgICAgICAgICAgICBtSW50ZXJwci0+bVZpVlZpZC5WaWRlb1NpemVzWzFdLndpZHRoLAorICAgICAgICAgICAgbUludGVycHItPm1WaVZWaWQuVmlkZW9TaXplc1sxXS5oZWlnaHQpOworICAgICAgICBpZiAobUludGVycHItPm1WaVZCdWZmLmJ1ZmYgPT0gTlVMTCkgeworICAgICAgICAgICAgbUludGVycHItPm1WaVZCdWZmLmJ1ZmYgPQorICAgICAgICAgICAgICAgICh2b2lkICopbWFsbG9jKG1JbnRlcnByLT5tVmlWQnVmZi5idWZmU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgbUludGVycHItPm1WaVZWaWQuc291cmNlQ2FtZXJhSUQgPSAxOworICAgICAgICBtSW50ZXJwci0+bVZpVlZpZC5kZXN0aW5hdGlvbkNhbWVyYUlEID0gMDsKKworICAgIH0gZWxzZSB7CisgICAgICAgIG1JbnRlcnByLT5tVmlWQnVmZi5idWZmU2l6ZSA9IGNhbGNCdWZmZXJTaXplKAorICAgICAgICAgICAgbUludGVycHItPm1WaVZWaWQuVmlkZW9TaXplc1swXS53aWR0aCwKKyAgICAgICAgICAgIG1JbnRlcnByLT5tVmlWVmlkLlZpZGVvU2l6ZXNbMF0uaGVpZ2h0KTsKKyAgICAgICAgaWYgKG1JbnRlcnByLT5tVmlWQnVmZi5idWZmID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1JbnRlcnByLT5tVmlWQnVmZi5idWZmID0KKyAgICAgICAgICAgICAgICAodm9pZCAqKW1hbGxvYyhtSW50ZXJwci0+bVZpVkJ1ZmYuYnVmZlNpemUpOworICAgICAgICB9CisgICAgICAgIG1JbnRlcnByLT5tVmlWVmlkLnNvdXJjZUNhbWVyYUlEID0gMDsKKyAgICAgICAgbUludGVycHItPm1WaVZWaWQuZGVzdGluYXRpb25DYW1lcmFJRCA9IDE7CisgICAgfQorCisgICAgcmV0ID0gbUNhbWVyYS0+c3RhcnRSZWNvcmRpbmcoKTsKKworICAgIHNpZ25hbEZpbmlzaGVkKCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdG9wVmlWUmVjb3JkaW5nCisgKgorICogREVTQ1JJUFRJT046IFN0b3BzIHZpZGVvIGluIHZpZGVvIHJlY29yZGluZworICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IENhbWVyYUNvbnRleHQ6OnN0b3BWaVZSZWNvcmRpbmcoKQoreworICAgIHVzZUxvY2soKTsKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKworICAgIG1DYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKKworICAgIHNpZ25hbEZpbmlzaGVkKCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdG9wUHJldmlldworICoKKyAqIERFU0NSSVBUSU9OOiBzdG9wcyBjYW1lcmEgcHJldmlldworICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IENhbWVyYUNvbnRleHQ6OnN0b3BQcmV2aWV3KCkKK3sKKyAgICB1c2VMb2NrKCk7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisKKyAgICBpZiAoIG1IYXJkd2FyZUFjdGl2ZSApIHsKKyAgICAgICAgbUNhbWVyYS0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgcmV0ID0gZGVzdHJveVByZXZpZXdTdXJmYWNlKCk7CisgICAgfQorCisgICAgbVByZXZpZXdSdW5uaW5nICA9IGZhbHNlOworICAgIG1SZXNpemVQcmV2aWV3ID0gdHJ1ZTsKKworICAgIHNpZ25hbEZpbmlzaGVkKCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlc3VtZVByZXZpZXcKKyAqCisgKiBERVNDUklQVElPTjogcmVzdW1lcyBjYW1lcmEgcHJldmlldyBhZnRlciBpbWFnZSBjYXB0dXJlCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogc3RhdHVzX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdHVzX3QgQ2FtZXJhQ29udGV4dDo6cmVzdW1lUHJldmlldygpCit7CisgICAgdXNlTG9jaygpOworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworCisgICAgaWYgKCBtSGFyZHdhcmVBY3RpdmUgKSB7CisgICAgICAgIHJldCA9IG1DYW1lcmEtPnN0YXJ0UHJldmlldygpOworICAgICAgICBtUHJldmlld1J1bm5pbmcgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE5PX0lOSVQ7CisgICAgfQorCisgICAgc2lnbmFsRmluaXNoZWQoKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG5leHRQcmV2aWV3U2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiBJdGVyYXRlcyB0aHJvdWdoIGFsbCBzdXBwb3J0ZWQgcHJldmlldyBzaXplcy4KKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdGF0dXNfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0dXNfdCBDYW1lcmFDb250ZXh0OjpuZXh0UHJldmlld1NpemUoKQoreworICAgIHVzZUxvY2soKTsKKyAgICBpZiAoIG1IYXJkd2FyZUFjdGl2ZSApIHsKKyAgICAgICAgbUN1cnJlbnRQcmV2aWV3U2l6ZUlkeCArPSAxOworICAgICAgICBtQ3VycmVudFByZXZpZXdTaXplSWR4ICU9IG1TdXBwb3J0ZWRQcmV2aWV3U2l6ZXMuc2l6ZSgpOworICAgICAgICBTaXplIHByZXZpZXdTaXplID0gbVN1cHBvcnRlZFByZXZpZXdTaXplcy5pdGVtQXQoCisgICAgICAgICAgICBtQ3VycmVudFByZXZpZXdTaXplSWR4KTsKKyAgICAgICAgbVBhcmFtcy5zZXRQcmV2aWV3U2l6ZShwcmV2aWV3U2l6ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3U2l6ZS5oZWlnaHQpOworICAgICAgICBtUmVzaXplUHJldmlldyA9IHRydWU7CisKKyAgICAgICAgaWYgKCBtUHJldmlld1J1bm5pbmcgKSB7CisgICAgICAgICAgICBtQ2FtZXJhLT5zdG9wUHJldmlldygpOworICAgICAgICAgICAgbUNhbWVyYS0+c2V0UGFyYW1ldGVycyhtUGFyYW1zLmZsYXR0ZW4oKSk7CisgICAgICAgICAgICBtQ2FtZXJhLT5zdGFydFByZXZpZXcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMobVBhcmFtcy5mbGF0dGVuKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgc2lnbmFsRmluaXNoZWQoKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRQcmV2aWV3U2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiBTZXRzIGV4YWN0IHByZXZpZXcgc2l6ZSBpZiBzdXBwb3J0ZWQKKyAqCisgKiBQQVJBTUVURVJTIDogZm9ybWF0IHNpemUgaW4gdGhlIGZvcm0gb2YgV0lEVEh4SEVJR0hUCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IENhbWVyYUNvbnRleHQ6OnNldFByZXZpZXdTaXplKGNvbnN0IGNoYXIgKmZvcm1hdCkKK3sKKyAgICB1c2VMb2NrKCk7CisgICAgaWYgKCBtSGFyZHdhcmVBY3RpdmUgKSB7CisgICAgICAgIGludCBuZXdIZWlnaHQ7CisgICAgICAgIGludCBuZXdXaWR0aDsKKyAgICAgICAgc3NjYW5mKGZvcm1hdCwgIiVkeCVkIiwgJm5ld1dpZHRoLCAmbmV3SGVpZ2h0KTsKKworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1TdXBwb3J0ZWRQcmV2aWV3U2l6ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIFNpemUgcHJldmlld1NpemUgPSBtU3VwcG9ydGVkUHJldmlld1NpemVzLml0ZW1BdChpKTsKKyAgICAgICAgICAgIGlmICggbmV3V2lkdGggPT0gcHJldmlld1NpemUud2lkdGggJiYKKyAgICAgICAgICAgICAgICAgbmV3SGVpZ2h0ID09IHByZXZpZXdTaXplLmhlaWdodCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBpZiAoIGkgPT0gbVN1cHBvcnRlZFByZXZpZXdTaXplcy5zaXplKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiUHJldmlldyBzaXplICVkeCVkIG5vdCBzdXBwb3J0ZWQgIVxuIiwKKyAgICAgICAgICAgICAgICBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIG1QYXJhbXMuc2V0UHJldmlld1NpemUobmV3V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVpZ2h0KTsKKyAgICAgICAgbVJlc2l6ZVByZXZpZXcgPSB0cnVlOworCisgICAgICAgIGlmICggbVByZXZpZXdSdW5uaW5nICkgeworICAgICAgICAgICAgbUNhbWVyYS0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgICAgIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMobVBhcmFtcy5mbGF0dGVuKCkpOworICAgICAgICAgICAgbUNhbWVyYS0+c3RhcnRQcmV2aWV3KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKG1QYXJhbXMuZmxhdHRlbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpZ25hbEZpbmlzaGVkKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEN1cnJlbnRQcmV2aWV3U2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyaWVzIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBwcmV2aWV3IHNpemUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICBAcHJldmlld1NpemUgOiBwcmV2aWV3IHNpemUgY3VycmVudGx5IGNvbmZpZ3VyZWQKKyAqCisgKiBSRVRVUk4gICAgIDogc3RhdHVzX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdHVzX3QgQ2FtZXJhQ29udGV4dDo6Z2V0Q3VycmVudFByZXZpZXdTaXplKFNpemUgJnByZXZpZXdTaXplKQoreworICAgIHVzZUxvY2soKTsKKyAgICBpZiAoIG1IYXJkd2FyZUFjdGl2ZSApIHsKKyAgICAgICAgcHJldmlld1NpemUgPSBtU3VwcG9ydGVkUHJldmlld1NpemVzLml0ZW1BdChtQ3VycmVudFByZXZpZXdTaXplSWR4KTsKKyAgICB9CisgICAgc2lnbmFsRmluaXNoZWQoKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbmV4dFBpY3R1cmVTaXplCisgKgorICogREVTQ1JJUFRJT046IEl0ZXJhdGVzIHRocm91Z2ggYWxsIHN1cHBvcnRlZCBwaWN0dXJlIHNpemVzLgorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IENhbWVyYUNvbnRleHQ6Om5leHRQaWN0dXJlU2l6ZSgpCit7CisgICAgdXNlTG9jaygpOworICAgIGlmICggbUhhcmR3YXJlQWN0aXZlICkgeworICAgICAgICBtQ3VycmVudFBpY3R1cmVTaXplSWR4ICs9IDE7CisgICAgICAgIG1DdXJyZW50UGljdHVyZVNpemVJZHggJT0gbVN1cHBvcnRlZFBpY3R1cmVTaXplcy5zaXplKCk7CisgICAgICAgIFNpemUgcGljdHVyZVNpemUgPSBtU3VwcG9ydGVkUGljdHVyZVNpemVzLml0ZW1BdCgKKyAgICAgICAgICAgIG1DdXJyZW50UGljdHVyZVNpemVJZHgpOworICAgICAgICBtUGFyYW1zLnNldFBpY3R1cmVTaXplKHBpY3R1cmVTaXplLndpZHRoLAorICAgICAgICAgICAgcGljdHVyZVNpemUuaGVpZ2h0KTsKKyAgICAgICAgbUNhbWVyYS0+c2V0UGFyYW1ldGVycyhtUGFyYW1zLmZsYXR0ZW4oKSk7CisgICAgfQorICAgIHNpZ25hbEZpbmlzaGVkKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFBpY3R1cmVTaXplCisgKgorICogREVTQ1JJUFRJT046IFNldHMgZXhhY3QgcHJldmlldyBzaXplIGlmIHN1cHBvcnRlZAorICoKKyAqIFBBUkFNRVRFUlMgOiBmb3JtYXQgc2l6ZSBpbiB0aGUgZm9ybSBvZiBXSURUSHhIRUlHSFQKKyAqCisgKiBSRVRVUk4gICAgIDogc3RhdHVzX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdHVzX3QgQ2FtZXJhQ29udGV4dDo6c2V0UGljdHVyZVNpemUoY29uc3QgY2hhciAqZm9ybWF0KQoreworICAgIHVzZUxvY2soKTsKKyAgICBpZiAoIG1IYXJkd2FyZUFjdGl2ZSApIHsKKyAgICAgICAgaW50IG5ld0hlaWdodDsKKyAgICAgICAgaW50IG5ld1dpZHRoOworICAgICAgICBzc2NhbmYoZm9ybWF0LCAiJWR4JWQiLCAmbmV3V2lkdGgsICZuZXdIZWlnaHQpOworCisgICAgICAgIHVuc2lnbmVkIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbVN1cHBvcnRlZFBpY3R1cmVTaXplcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgU2l6ZSBQaWN0dXJlU2l6ZSA9IG1TdXBwb3J0ZWRQaWN0dXJlU2l6ZXMuaXRlbUF0KGkpOworICAgICAgICAgICAgaWYgKCBuZXdXaWR0aCA9PSBQaWN0dXJlU2l6ZS53aWR0aCAmJgorICAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPT0gUGljdHVyZVNpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGlmICggaSA9PSBtU3VwcG9ydGVkUGljdHVyZVNpemVzLnNpemUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRmKCJQcmV2aWV3IHNpemUgJWR4JWQgbm90IHN1cHBvcnRlZCAhXG4iLAorICAgICAgICAgICAgICAgIG5ld1dpZHRoLCBuZXdIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgbVBhcmFtcy5zZXRQaWN0dXJlU2l6ZShuZXdXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWlnaHQpOworICAgICAgICBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKG1QYXJhbXMuZmxhdHRlbigpKTsKKyAgICB9CisKKyAgICBzaWduYWxGaW5pc2hlZCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBuZXh0VmlkZW9TaXplCisgKgorICogREVTQ1JJUFRJT046IFNlbGVjdCB0aGUgbmV4dCBhdmFpbGFibGUgdmlkZW8gc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IHN0YXR1c190IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IENhbWVyYUNvbnRleHQ6Om5leHRWaWRlb1NpemUoKQoreworICAgIHVzZUxvY2soKTsKKyAgICBpZiAoIG1IYXJkd2FyZUFjdGl2ZSApIHsKKyAgICAgICAgbUN1cnJlbnRWaWRlb1NpemVJZHggKz0gMTsKKyAgICAgICAgbUN1cnJlbnRWaWRlb1NpemVJZHggJT0gbVN1cHBvcnRlZFZpZGVvU2l6ZXMuc2l6ZSgpOworICAgICAgICBTaXplIHZpZGVvU2l6ZSA9IG1TdXBwb3J0ZWRWaWRlb1NpemVzLml0ZW1BdChtQ3VycmVudFZpZGVvU2l6ZUlkeCk7CisgICAgICAgIG1QYXJhbXMuc2V0VmlkZW9TaXplKHZpZGVvU2l6ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9TaXplLmhlaWdodCk7CisgICAgICAgIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMobVBhcmFtcy5mbGF0dGVuKCkpOworICAgICAgICBtSW50ZXJwci0+c2V0VmlWU2l6ZSgoU2l6ZSkgbVN1cHBvcnRlZFZpZGVvU2l6ZXMuaXRlbUF0KAorICAgICAgICAgICAgbUN1cnJlbnRWaWRlb1NpemVJZHgpLCBtQ2FtZXJhSW5kZXgpOworICAgIH0KKyAgICBzaWduYWxGaW5pc2hlZCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRWaWRlb1NpemUKKyAqCisgKiBERVNDUklQVElPTjogU2V0IHZpZGVvIHNpemUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZvcm1hdCAgOiBmb3JtYXQKKyAqCisgKiBSRVRVUk4gICAgIDogc3RhdHVzX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdHVzX3QgQ2FtZXJhQ29udGV4dDo6c2V0VmlkZW9TaXplKGNvbnN0IGNoYXIgKmZvcm1hdCkKK3sKKyAgICB1c2VMb2NrKCk7CisgICAgaWYgKCBtSGFyZHdhcmVBY3RpdmUgKSB7CisgICAgICAgIGludCBuZXdIZWlnaHQ7CisgICAgICAgIGludCBuZXdXaWR0aDsKKyAgICAgICAgc3NjYW5mKGZvcm1hdCwgIiVkeCVkIiwgJm5ld1dpZHRoLCAmbmV3SGVpZ2h0KTsKKworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1TdXBwb3J0ZWRWaWRlb1NpemVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBTaXplIFBpY3R1cmVTaXplID0gbVN1cHBvcnRlZFZpZGVvU2l6ZXMuaXRlbUF0KGkpOworICAgICAgICAgICAgaWYgKCBuZXdXaWR0aCA9PSBQaWN0dXJlU2l6ZS53aWR0aCAmJgorICAgICAgICAgICAgICAgICBuZXdIZWlnaHQgPT0gUGljdHVyZVNpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGlmICggaSA9PSBtU3VwcG9ydGVkVmlkZW9TaXplcy5zaXplKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiUHJldmlldyBzaXplICVkeCVkIG5vdCBzdXBwb3J0ZWQgIVxuIiwKKyAgICAgICAgICAgICAgICBuZXdXaWR0aCwgbmV3SGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIG1QYXJhbXMuc2V0VmlkZW9TaXplKG5ld1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdIZWlnaHQpOworICAgICAgICBtQ2FtZXJhLT5zZXRQYXJhbWV0ZXJzKG1QYXJhbXMuZmxhdHRlbigpKTsKKyAgICB9CisKKyAgICBzaWduYWxGaW5pc2hlZCgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgIDogZ2V0Q3VycmVudFZpZGVvU2l6ZQorICoKKyAqIERFU0NSSVBUSU9OIDogR2V0IGN1cnJlbnQgdmlkZW8gc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgIDoKKyAqICAgQHZpZGVvU2l6ZTogdmlkZW8gU2l6ZQorICoKKyAqIFJFVFVSTiAgICAgIDogc3RhdHVzX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0dXNfdCBDYW1lcmFDb250ZXh0OjpnZXRDdXJyZW50VmlkZW9TaXplKFNpemUgJnZpZGVvU2l6ZSkKK3sKKyAgICB1c2VMb2NrKCk7CisgICAgaWYgKCBtSGFyZHdhcmVBY3RpdmUgKSB7CisgICAgICAgIHZpZGVvU2l6ZSA9IG1TdXBwb3J0ZWRWaWRlb1NpemVzLml0ZW1BdChtQ3VycmVudFZpZGVvU2l6ZUlkeCk7CisgICAgfQorICAgIHNpZ25hbEZpbmlzaGVkKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEN1cnJlbnRQaWN0dXJlU2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyaWVzIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBwaWN0dXJlIHNpemUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICBAcGljdHVyZVNpemUgOiBwaWN0dXJlIHNpemUgY3VycmVudGx5IGNvbmZpZ3VyZWQKKyAqCisgKiBSRVRVUk4gICAgIDogc3RhdHVzX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdHVzX3QgQ2FtZXJhQ29udGV4dDo6Z2V0Q3VycmVudFBpY3R1cmVTaXplKFNpemUgJnBpY3R1cmVTaXplKQoreworICAgIHVzZUxvY2soKTsKKyAgICBpZiAoIG1IYXJkd2FyZUFjdGl2ZSApIHsKKyAgICAgICAgcGljdHVyZVNpemUgPSBtU3VwcG9ydGVkUGljdHVyZVNpemVzLml0ZW1BdChtQ3VycmVudFBpY3R1cmVTaXplSWR4KTsKKyAgICB9CisgICAgc2lnbmFsRmluaXNoZWQoKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vbmFtZXNwYWNlIHFjYW1lcmEgZW5kcyBoZXJlCisKK3VzaW5nIG5hbWVzcGFjZSBxY2FtZXJhOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByaW50TWVudQorICoKKyAqIERFU0NSSVBUSU9OOiBwcmludHMgdGhlIGF2YWlsYWJsZSBjYW1lcmEgb3B0aW9ucworICoKKyAqIFBBUkFNRVRFUlMgOgorICogIEBjdXJyZW50Q2FtZXJhIDogY2FtZXJhIGNvbnRleHQgY3VycmVudGx5IGJlaW5nIHVzZWQKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIENhbWVyYUNvbnRleHQ6OnByaW50TWVudShzcDxDYW1lcmFDb250ZXh0PiBjdXJyZW50Q2FtZXJhKQoreworICAgIGlmICggIW1Eb1ByaW50TWVudSApIHJldHVybjsKKyAgICBTaXplIGN1cnJlbnRQaWN0dXJlU2l6ZSwgY3VycmVudFByZXZpZXdTaXplLCBjdXJyZW50VmlkZW9TaXplOworICAgIGNvbnN0IGNoYXIgKnpzbF9tb2RlID0gbVBhcmFtcy5nZXQoQ2FtZXJhQ29udGV4dDo6S0VZX1pTTCk7CisKKyAgICBhc3NlcnQoY3VycmVudENhbWVyYS5nZXQoKSk7CisKKyAgICBjdXJyZW50Q2FtZXJhLT5nZXRDdXJyZW50UGljdHVyZVNpemUoY3VycmVudFBpY3R1cmVTaXplKTsKKyAgICBjdXJyZW50Q2FtZXJhLT5nZXRDdXJyZW50UHJldmlld1NpemUoY3VycmVudFByZXZpZXdTaXplKTsKKyAgICBjdXJyZW50Q2FtZXJhLT5nZXRDdXJyZW50VmlkZW9TaXplKGN1cnJlbnRWaWRlb1NpemUpOworCisgICAgcHJpbnRmKCJcblxuPT09PT09PT09PT0gRlVOQ1RJT05BTCBURVNUIE1FTlUgPT09PT09PT09PT09PT09PT09PVxuXG4iKTsKKworICAgIHByaW50ZigiIFxuXG5TVEFSVCAvIFNUT1AgLyBHRU5FUkFMIFNFUlZJQ0VTIFxuIik7CisgICAgcHJpbnRmKCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIHByaW50ZigiICAgJWMuIFN3aXRjaCBjYW1lcmEgLSBDdXJyZW50IEluZGV4OiAlZFxuIiwKKyAgICAgICAgICAgIEludGVycHJldGVyOjpTV0lUQ0hfQ0FNRVJBX0NNRCwKKyAgICAgICAgICAgIGN1cnJlbnRDYW1lcmEtPmdldENhbWVyYUluZGV4KCkpOworICAgIHByaW50ZigiICAgJWMuIFJlc3VtZSBQcmV2aWV3IGFmdGVyIGNhcHR1cmUgXG4iLAorICAgICAgICAgICAgSW50ZXJwcmV0ZXI6OlJFU1VNRV9QUkVWSUVXX0NNRCk7CisgICAgcHJpbnRmKCIgICAlYy4gUXVpdCBcbiIsCisgICAgICAgICAgICBJbnRlcnByZXRlcjo6RVhJVF9DTUQpOworICAgIHByaW50ZigiICAgJWMuIENhbWVyYSBDYXBhYmlsaXR5IER1bXAiLAorICAgICAgICAgICAgSW50ZXJwcmV0ZXI6OkRVTVBfQ0FQU19DTUQpOworCisgICAgcHJpbnRmKCIgXG5cbiBQUkVWSUVXIFNVQiBNRU5VIFxuIik7CisgICAgcHJpbnRmKCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIHByaW50ZigiICAgJWMuIFN0YXJ0IFByZXZpZXdcbiIsCisgICAgICAgICAgICBJbnRlcnByZXRlcjo6U1RBUlRfUFJFVklFV19DTUQpOworICAgIHByaW50ZigiICAgJWMuIFN0b3AgUHJldmlld1xuIiwKKyAgICAgICAgICAgIEludGVycHJldGVyOjpTVE9QX1BSRVZJRVdfQ01EKTsKKyAgICBwcmludGYoIiAgICVjLiBQcmV2aWV3IHNpemU6ICAlZHglZFxuIiwKKyAgICAgICAgICAgIEludGVycHJldGVyOjpDSEFOR0VfUFJFVklFV19TSVpFX0NNRCwKKyAgICAgICAgICAgIGN1cnJlbnRQcmV2aWV3U2l6ZS53aWR0aCwKKyAgICAgICAgICAgIGN1cnJlbnRQcmV2aWV3U2l6ZS5oZWlnaHQpOworICAgIHByaW50ZigiICAgJWMuIFZpZGVvIHNpemU6ICAlZHglZFxuIiwKKyAgICAgICAgICAgIEludGVycHJldGVyOjpDSEFOR0VfVklERU9fU0laRV9DTUQsCisgICAgICAgICAgICBjdXJyZW50VmlkZW9TaXplLndpZHRoLAorICAgICAgICAgICAgY3VycmVudFZpZGVvU2l6ZS5oZWlnaHQpOworICAgIHByaW50ZigiICAgJWMuIFN0YXJ0IFJlY29yZGluZ1xuIiwKKyAgICAgICAgICAgIEludGVycHJldGVyOjpTVEFSVF9SRUNPUkRfQ01EKTsKKyAgICBwcmludGYoIiAgICVjLiBTdG9wIFJlY29yZGluZ1xuIiwKKyAgICAgICAgICAgIEludGVycHJldGVyOjpTVE9QX1JFQ09SRF9DTUQpOworICAgIHByaW50ZigiICAgJWMuIFN0YXJ0IFZpViBSZWNvcmRpbmdcbiIsCisgICAgICAgICAgICBJbnRlcnByZXRlcjo6U1RBUlRfVklWX1JFQ09SRF9DTUQpOworICAgIHByaW50ZigiICAgJWMuIFN0b3AgVmlWIFJlY29yZGluZ1xuIiwKKyAgICAgICAgICAgIEludGVycHJldGVyOjpTVE9QX1ZJVl9SRUNPUkRfQ01EKTsKKyAgICBwcmludGYoIiAgICVjLiBFbmFibGUgcHJldmlldyBmcmFtZXNcbiIsCisgICAgICAgICAgICBJbnRlcnByZXRlcjo6RU5BQkxFX1BSVl9DQUxMQkFDS1NfQ01EKTsKKyAgICBwcmludGYoIiAgICVjLiBUcmlnZ2VyIGF1dG9mb2N1cyBcbiIsCisgICAgICAgICAgICBJbnRlcnByZXRlcjo6QVVUT0ZPQ1VTX0NNRCk7CisKKyAgICBwcmludGYoIiBcblxuIElNQUdFIENBUFRVUkUgU1VCIE1FTlUgXG4iKTsKKyAgICBwcmludGYoIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgcHJpbnRmKCIgICAlYy4gVGFrZSBwaWN0dXJlL0Z1bGwgUHJlc3NcbiIsCisgICAgICAgICAgICBJbnRlcnByZXRlcjo6VEFLRVBJQ1RVUkVfQ01EKTsKKyAgICBwcmludGYoIiAgICVjLiBUYWtlIHBpY3R1cmUgaW4gcGljdHVyZVxuIiwKKyAgICAgICAgICAgIEludGVycHJldGVyOjpUQUtFUElDVFVSRV9JTl9QSUNUVVJFX0NNRCk7CisgICAgcHJpbnRmKCIgICAlYy4gUGljdHVyZSBzaXplOiAgJWR4JWRcbiIsCisgICAgICAgICAgICBJbnRlcnByZXRlcjo6Q0hBTkdFX1BJQ1RVUkVfU0laRV9DTUQsCisgICAgICAgICAgICBjdXJyZW50UGljdHVyZVNpemUud2lkdGgsCisgICAgICAgICAgICBjdXJyZW50UGljdHVyZVNpemUuaGVpZ2h0KTsKKyAgICBwcmludGYoIiAgICVjLiB6c2w6ICAlc1xuIiwgSW50ZXJwcmV0ZXI6OlpTTF9DTUQsCisgICAgICAgICh6c2xfbW9kZSAhPSBOVUxMKSA/IHpzbF9tb2RlIDogIk5VTEwiKTsKKworICAgIHByaW50ZigiXG4gICBDaG9pY2U6ICIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGVuYWJsZVByaW50UHJldmlldworICoKKyAqIERFU0NSSVBUSU9OOiBFbmFibGVzIHByaW50aW5nIHRoZSBwcmV2aWV3CisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIENhbWVyYUNvbnRleHQ6OmVuYWJsZVByaW50UHJldmlldygpCit7CisgICAgbURvUHJpbnRNZW51ID0gdHJ1ZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkaXNhYmxlUHJpbnRQcmV2aWV3CisgKgorICogREVTQ1JJUFRJT046IERpc2FibGVzIHByaW50aW5nIHRoZSBwcmV2aWV3CisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIENhbWVyYUNvbnRleHQ6OmRpc2FibGVQcmludFByZXZpZXcoKQoreworICAgIG1Eb1ByaW50TWVudSA9IGZhbHNlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGVuYWJsZVBpUENhcHR1cmUKKyAqCisgKiBERVNDUklQVElPTjogRW5hYmxlcyBwaWN0dXJlIGluIHBpY3R1cmUgY2FwdHVyZQorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBDYW1lcmFDb250ZXh0OjplbmFibGVQaVBDYXB0dXJlKCkKK3sKKyAgICBtUGlQQ2FwdHVyZSA9IHRydWU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGlzYWJsZVBpUENhcHR1cmUKKyAqCisgKiBERVNDUklQVElPTjogRGlzYWJsZXMgcGljdHVyZSBpbiBwaWN0dXJlIGNhcHR1cmUKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgQ2FtZXJhQ29udGV4dDo6ZGlzYWJsZVBpUENhcHR1cmUoKQoreworICAgIG1QaVBDYXB0dXJlID0gZmFsc2U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0WlNMCisgKgorICogREVTQ1JJUFRJT046IGdldCBaU0wgdmFsdWUgb2YgY3VycmVudCBjYW1lcmEKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBjdXJyZW50IHpzbCB2YWx1ZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjb25zdCBjaGFyICpDYW1lcmFDb250ZXh0OjpnZXRaU0woKQoreworICAgIHJldHVybiBtUGFyYW1zLmdldChDYW1lcmFDb250ZXh0OjpLRVlfWlNMKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRaU0wKKyAqCisgKiBERVNDUklQVElPTjogc2V0IFpTTCB2YWx1ZSBvZiBjdXJyZW50IGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOiB6c2wgdmFsdWUgdG8gYmUgc2V0CisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBDYW1lcmFDb250ZXh0OjpzZXRaU0woY29uc3QgY2hhciAqdmFsdWUpCit7CisgICAgbVBhcmFtcy5zZXQoQ2FtZXJhQ29udGV4dDo6S0VZX1pTTCwgdmFsdWUpOworICAgIG1DYW1lcmEtPnNldFBhcmFtZXRlcnMobVBhcmFtcy5mbGF0dGVuKCkpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbmZpZ3VyZVZpVkNvZGVjCisgKgorICogREVTQ1JJUFRJT046IENvbmZpZ3VyZXMgdmlkZW8gaW4gdmlkZW8gY29kZWMKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdGF0dXNfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0dXNfdCBJbnRlcnByZXRlcjo6Y29uZmlndXJlVmlWQ29kZWMoKQoreworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIGNoYXIgZmlsZU5hbWVbMTAwXTsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOworICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworCisgICAgaWYgKG1UZXN0Q29udGV4dC0+bVZpVlZpZC5WaWRlb1NpemVzWzBdLndpZHRoICoKKyAgICAgICAgICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5WaWRlb1NpemVzWzBdLmhlaWdodCA+PQorICAgICAgICAgICAgbVRlc3RDb250ZXh0LT5tVmlWVmlkLlZpZGVvU2l6ZXNbMV0ud2lkdGggKgorICAgICAgICAgICAgbVRlc3RDb250ZXh0LT5tVmlWVmlkLlZpZGVvU2l6ZXNbMV0uaGVpZ2h0KSB7CisgICAgICAgIHNucHJpbnRmKGZpbGVOYW1lLCBzaXplb2YoZmlsZU5hbWUpIC8gc2l6ZW9mKGNoYXIpLCAiL3NkY2FyZC9WaVZfdmlkXyVkeCVkXyVkLm1wNCIsCisgICAgICAgICAgICBtVGVzdENvbnRleHQtPm1WaVZWaWQuVmlkZW9TaXplc1swXS53aWR0aCwKKyAgICAgICAgICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5WaWRlb1NpemVzWzBdLmhlaWdodCwKKyAgICAgICAgICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5WaVZJZHgrKyk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgbVRlc3RDb250ZXh0LT5tVmlWVmlkLlZpZGVvU2l6ZXNbMF0ud2lkdGgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCBtVGVzdENvbnRleHQtPm1WaVZWaWQuVmlkZW9TaXplc1swXS5oZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNucHJpbnRmKGZpbGVOYW1lLCBzaXplb2YoZmlsZU5hbWUpIC8gc2l6ZW9mKGNoYXIpLCAiL3NkY2FyZC9WaVZfdmlkXyVkeCVkXyVkLm1wNCIsCisgICAgICAgICAgICBtVGVzdENvbnRleHQtPm1WaVZWaWQuVmlkZW9TaXplc1sxXS53aWR0aCwKKyAgICAgICAgICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5WaWRlb1NpemVzWzFdLmhlaWdodCwKKyAgICAgICAgICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5WaVZJZHgrKyk7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgbVRlc3RDb250ZXh0LT5tVmlWVmlkLlZpZGVvU2l6ZXNbMV0ud2lkdGgpOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCBtVGVzdENvbnRleHQtPm1WaVZWaWQuVmlkZW9TaXplc1sxXS5oZWlnaHQpOworICAgIH0KKyAgICBpbnQgZmQgPSBvcGVuKGZpbGVOYW1lLCBPX0NSRUFUIHwgT19SRFdSICk7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICBMT0dFKCJFcnJvciBvcGVuaW5nIGZpbGUiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5tdXhlciA9IG5ldyBNZWRpYU11eGVyKAorICAgICAgICBmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQpOworCisgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCAidmlkZW8vYXZjIik7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUpOworCisgICAgZm9ybWF0LT5zZXRJbnQzMigiYml0cmF0ZSIsIDEwMDAwMDApOworICAgIGZvcm1hdC0+c2V0RmxvYXQoImZyYW1lLXJhdGUiLCAzMCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMigiaS1mcmFtZS1pbnRlcnZhbCIsIDEwKTsKKworICAgIGxvb3Blci0+c2V0TmFtZSgiVmlWX3JlY29yZGluZ19sb29wZXIiKTsKKyAgICBsb29wZXItPnN0YXJ0KCk7CisgICAgQUxPR1YoIkNyZWF0aW5nIGNvZGVjIik7CisgICAgbVRlc3RDb250ZXh0LT5tVmlWVmlkLmNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKAorICAgICAgICBsb29wZXIsICJ2aWRlby9hdmMiLCB0cnVlKTsKKyAgICBpZiAobVRlc3RDb250ZXh0LT5tVmlWVmlkLmNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5hYmxlIHRvIGNyZWF0ZSB2aWRlby9hdmMgY29kZWMgaW5zdGFuY2VcbiIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0ID0gbVRlc3RDb250ZXh0LT5tVmlWVmlkLmNvZGVjLT5jb25maWd1cmUoZm9ybWF0LCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgTWVkaWFDb2RlYzo6Q09ORklHVVJFX0ZMQUdfRU5DT0RFKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5jb2RlYy0+cmVsZWFzZSgpOworICAgICAgICBtVGVzdENvbnRleHQtPm1WaVZWaWQuY29kZWMuY2xlYXIoKTsKKworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gY29uZmlndXJlIGNvZGVjIChlcnI9JWQpXG4iLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIEFMT0dWKCJDcmVhdGluZyBidWZmZXIgcHJvZHVjZXIiKTsKKyAgICByZXQgPSBtVGVzdENvbnRleHQtPm1WaVZWaWQuY29kZWMtPmNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgJm1UZXN0Q29udGV4dC0+bVZpVlZpZC5idWZmZXJQcm9kdWNlcik7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBtVGVzdENvbnRleHQtPm1WaVZWaWQuY29kZWMtPnJlbGVhc2UoKTsKKyAgICAgICAgbVRlc3RDb250ZXh0LT5tVmlWVmlkLmNvZGVjLmNsZWFyKCk7CisKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiRVJST1I6IHVuYWJsZSB0byBjcmVhdGUgZW5jb2RlciBpbnB1dCBzdXJmYWNlIChlcnI9JWQpXG4iLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IG1UZXN0Q29udGV4dC0+bVZpVlZpZC5jb2RlYy0+c3RhcnQoKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5jb2RlYy0+cmVsZWFzZSgpOworICAgICAgICBtVGVzdENvbnRleHQtPm1WaVZWaWQuY29kZWMuY2xlYXIoKTsKKworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gc3RhcnQgY29kZWMgKGVycj0lZClcbiIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIEFMT0dWKCJDb2RlYyBwcmVwYXJlZCIpOworCisgICAgbVRlc3RDb250ZXh0LT5tVmlWVmlkLnN1cmZhY2UgPSBuZXcgU3VyZmFjZSgKKyAgICAgICAgbVRlc3RDb250ZXh0LT5tVmlWVmlkLmJ1ZmZlclByb2R1Y2VyKTsKKyAgICBtVGVzdENvbnRleHQtPm1WaVZWaWQuQU5XID0gbVRlc3RDb250ZXh0LT5tVmlWVmlkLnN1cmZhY2U7CisgICAgcmV0ID0gbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChtVGVzdENvbnRleHQtPm1WaVZWaWQuQU5XLmdldCgpLAorICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9DUFUpOworICAgIGlmIChtVGVzdENvbnRleHQtPm1WaVZWaWQuVmlkZW9TaXplc1swXS53aWR0aCAqCisgICAgICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5WaWRlb1NpemVzWzBdLmhlaWdodCA+PQorICAgICAgICBtVGVzdENvbnRleHQtPm1WaVZWaWQuVmlkZW9TaXplc1sxXS53aWR0aCAqCisgICAgICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5WaWRlb1NpemVzWzFdLmhlaWdodCkgeworICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtVGVzdENvbnRleHQtPm1WaVZWaWQuQU5XLmdldCgpLAorICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfTlYxMl9FTkNPREVBQkxFKTsKKyAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1UZXN0Q29udGV4dC0+bVZpVlZpZC5BTlcuZ2V0KCksCisgICAgICAgICAgICAgICAgbVRlc3RDb250ZXh0LT5tVmlWVmlkLlZpZGVvU2l6ZXNbMF0ud2lkdGgsCisgICAgICAgICAgICAgICAgbVRlc3RDb250ZXh0LT5tVmlWVmlkLlZpZGVvU2l6ZXNbMF0uaGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtVGVzdENvbnRleHQtPm1WaVZWaWQuQU5XLmdldCgpLAorICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfTlYxMl9FTkNPREVBQkxFKTsKKyAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1UZXN0Q29udGV4dC0+bVZpVlZpZC5BTlcuZ2V0KCksCisgICAgICAgICAgICAgICAgbVRlc3RDb250ZXh0LT5tVmlWVmlkLlZpZGVvU2l6ZXNbMV0ud2lkdGgsCisgICAgICAgICAgICAgICAgbVRlc3RDb250ZXh0LT5tVmlWVmlkLlZpZGVvU2l6ZXNbMV0uaGVpZ2h0KTsKKyAgICB9CisgICAgbmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UobVRlc3RDb250ZXh0LT5tVmlWVmlkLkFOVy5nZXQoKSwKKyAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIHwgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTik7CisgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG1UZXN0Q29udGV4dC0+bVZpVlZpZC5BTlcuZ2V0KCksCisgICAgICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5idWZmX2NudCk7CisKKyAgICBWaVZFbmNvZGVyVGhyZWFkKCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVuY29uZmlndXJlVmlWQ29kZWMKKyAqCisgKiBERVNDUklQVElPTjogVW5jb25maWd1cmVzIHZpZGVvIGluIHZpZGVvIGNvZGVjCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogc3RhdHVzX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdHVzX3QgSW50ZXJwcmV0ZXI6OnVuY29uZmlndXJlVmlWQ29kZWMoKQoreworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworCisgICAgcmV0ID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtVGVzdENvbnRleHQtPm1WaVZWaWQuQU5XLmdldCgpLAorICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9DUFUpOworICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5idWZmZXJQcm9kdWNlciA9IE5VTEw7CisgICAgbVRlc3RDb250ZXh0LT5tVmlWVmlkLmNvZGVjLT5zdG9wKCk7CisgICAgcHRocmVhZF9qb2luKG1WaVZFbmNUaHJlYWQsIE5VTEwpOworICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5tdXhlci0+c3RvcCgpOworICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5jb2RlYy0+cmVsZWFzZSgpOworICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5jb2RlYy5jbGVhcigpOworICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5tdXhlci5jbGVhcigpOworICAgIG1UZXN0Q29udGV4dC0+bVZpVlZpZC5zdXJmYWNlLmNsZWFyKCk7CisgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogSW50ZXJwcmV0ZXIKKyAqCisgKiBERVNDUklQVElPTjogSW50ZXJwcmV0ZXIgY29uc3RydWN0b3IKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0ludGVycHJldGVyOjpJbnRlcnByZXRlcihjb25zdCBjaGFyICpmaWxlKQorICAgIDogbUNtZEluZGV4KDApCisgICAgLCBtU2NyaXB0KE5VTEwpCit7CisgICAgaWYgKCFmaWxlKXsKKyAgICAgICAgcHJpbnRmKCJubyBGaWxlIEdpdmVuXG4iKTsKKyAgICAgICAgbVVzZVNjcmlwdCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRklMRSAqZmggPSBmb3BlbihmaWxlLCAiciIpOworICAgIGlmICggIWZoICkgeworICAgICAgICBwcmludGYoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXNcbiIsIGZpbGUpOworICAgICAgICBtVXNlU2NyaXB0ID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmc2VlayhmaCwgMCwgU0VFS19FTkQpOworICAgIHNpemVfdCBsZW4gPSAoc2l6ZV90KWZ0ZWxsKGZoKTsKKyAgICByZXdpbmQoZmgpOworCisgICAgaWYoICFsZW4gKSB7CisgICAgICAgIHByaW50ZigiU2NyaXB0IGZpbGUgJXMgaXMgZW1wdHkgIVxuIiwgZmlsZSk7CisgICAgICAgIGZjbG9zZShmaCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtU2NyaXB0ID0gbmV3IGNoYXJbbGVuICsgMV07CisgICAgaWYgKCAhbVNjcmlwdCApIHsKKyAgICAgICAgZmNsb3NlKGZoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZyZWFkKG1TY3JpcHQsIHNpemVvZihjaGFyKSwgbGVuLCBmaCk7CisgICAgbVNjcmlwdFtsZW5dID0gJ1wwJzsgLy8gZW5zdXJlIG51bGwgdGVybWluYXRlZDsKKyAgICBmY2xvc2UoZmgpOworCisKKyAgICBjaGFyICpwMTsKKyAgICBjaGFyICpwMjsKKyAgICBwMSA9IHAyID0gbVNjcmlwdDsKKworICAgIGRvIHsKKyAgICAgICAgc3dpdGNoICgqcDEpIHsKKyAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICBjYXNlICd8JzoKKyAgICAgICAgICAgIHAxKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTV0lUQ0hfQ0FNRVJBX0NNRDoKKyAgICAgICAgY2FzZSBSRVNVTUVfUFJFVklFV19DTUQ6CisgICAgICAgIGNhc2UgU1RBUlRfUFJFVklFV19DTUQ6CisgICAgICAgIGNhc2UgU1RPUF9QUkVWSUVXX0NNRDoKKyAgICAgICAgY2FzZSBDSEFOR0VfUFJFVklFV19TSVpFX0NNRDoKKyAgICAgICAgY2FzZSBDSEFOR0VfUElDVFVSRV9TSVpFX0NNRDoKKyAgICAgICAgY2FzZSBTVEFSVF9SRUNPUkRfQ01EOgorICAgICAgICBjYXNlIFNUT1BfUkVDT1JEX0NNRDoKKyAgICAgICAgY2FzZSBTVEFSVF9WSVZfUkVDT1JEX0NNRDoKKyAgICAgICAgY2FzZSBTVE9QX1ZJVl9SRUNPUkRfQ01EOgorICAgICAgICBjYXNlIERVTVBfQ0FQU19DTUQ6CisgICAgICAgIGNhc2UgQVVUT0ZPQ1VTX0NNRDoKKyAgICAgICAgY2FzZSBUQUtFUElDVFVSRV9DTUQ6CisgICAgICAgIGNhc2UgVEFLRVBJQ1RVUkVfSU5fUElDVFVSRV9DTUQ6CisgICAgICAgIGNhc2UgRU5BQkxFX1BSVl9DQUxMQkFDS1NfQ01EOgorICAgICAgICBjYXNlIEVYSVRfQ01EOgorICAgICAgICBjYXNlIFpTTF9DTUQ6CisgICAgICAgIGNhc2UgREVMQVk6CisgICAgICAgICAgICBwMiA9IHAxOworICAgICAgICAgICAgd2hpbGUoIChwMiAhPSAobVNjcmlwdCArIGxlbikpICYmICgqcDIgIT0gJ3wnKSkgeworICAgICAgICAgICAgICAgIHAyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcDIgPSAnXDAnOworICAgICAgICAgICAgaWYgKHAyID09IChwMSArIDEpKQorICAgICAgICAgICAgICAgIG1Db21tYW5kcy5wdXNoX2JhY2soQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SW50ZXJwcmV0ZXI6OkNvbW1hbmRzX2U+KCpwMSkpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtQ29tbWFuZHMucHVzaF9iYWNrKENvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEludGVycHJldGVyOjpDb21tYW5kc19lPigqcDEpLCAocDEgKyAxKSkpOworICAgICAgICAgICAgcDEgPSBwMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcHJpbnRmKCJJbnZhbGlkIGNtZCAlYyBcbiIsICpwMSk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgcDErKzsKKworICAgICAgICAgICAgfSB3aGlsZSgqcDEgIT0gJ3wnICYmIHAxICE9IChtU2NyaXB0ICsgbGVuKSk7CisKKyAgICAgICAgfQorICAgIH0gd2hpbGUocDEgIT0gKG1TY3JpcHQgKyBsZW4pKTsKKyAgICBtVXNlU2NyaXB0ID0gdHJ1ZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+SW50ZXJwcmV0ZXIKKyAqCisgKiBERVNDUklQVElPTjogSW50ZXJwcmV0ZXIgZGVzdHJ1Y3RvcgorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworSW50ZXJwcmV0ZXI6On5JbnRlcnByZXRlcigpCit7CisgICAgaWYgKCBtU2NyaXB0ICkKKyAgICAgICAgZGVsZXRlW10gbVNjcmlwdDsKKworICAgIG1Db21tYW5kcy5jbGVhcigpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgICAgIDogZ2V0Q29tbWFuZAorICoKKyAqIERFU0NSSVBUSU9OICAgICA6IEdldCBhIGNvbW1hbmQgZnJvbSBpbnRlcnByZXRlcgorICoKKyAqIFBBUkFNRVRFUlMgICAgICA6CisgKiAgIEBjdXJyZW50Q2FtZXJhOiBDdXJyZW50IGNhbWVyYSBjb250ZXh0CisgKgorICogUkVUVVJOICAgICAgICAgIDogY29tbWFuZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitJbnRlcnByZXRlcjo6Q29tbWFuZCBJbnRlcnByZXRlcjo6Z2V0Q29tbWFuZCgKKyAgICBzcDxDYW1lcmFDb250ZXh0PiBjdXJyZW50Q2FtZXJhKQoreworICAgIGlmKCBtVXNlU2NyaXB0ICkgeworICAgICAgICByZXR1cm4gbUNvbW1hbmRzW21DbWRJbmRleCsrXTsKKyAgICB9IGVsc2UgeworICAgICAgICBjdXJyZW50Q2FtZXJhLT5wcmludE1lbnUoY3VycmVudENhbWVyYSk7CisgICAgICAgIHJldHVybiBJbnRlcnByZXRlcjo6Q29tbWFuZCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEludGVycHJldGVyOjpDb21tYW5kc19lPihnZXRjaGFyKCkpKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICAgICAgOiBUZXN0Q29udGV4dAorICoKKyAqIERFU0NSSVBUSU9OICAgICA6IFRlc3RDb250ZXh0IGNvbnN0cnVjdG9yCisgKgorICogUEFSQU1FVEVSUyAgICAgIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworVGVzdENvbnRleHQ6OlRlc3RDb250ZXh0KCkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgbVRlc3RSdW5uaW5nID0gZmFsc2U7CisgICAgbUludGVycHJldGVyID0gTlVMTDsKKyAgICBtVmlWVmlkLlZpVklkeCA9IDA7CisgICAgbVZpVlZpZC5idWZmX2NudCA9IDk7CisgICAgbVZpVlZpZC5ncmFwaEJ1ZiA9IDA7CisgICAgbVZpVlZpZC5tYXBwZWRCdWZmID0gTlVMTDsKKyAgICBtVmlWVmlkLmlzQnVmZlZhbGlkID0gZmFsc2U7CisgICAgbVZpVlZpZC5zb3VyY2VDYW1lcmFJRCA9IC0xOworICAgIG1WaVZWaWQuZGVzdGluYXRpb25DYW1lcmFJRCA9IC0xOworICAgIG1QaVBpblVzZSA9IGZhbHNlOworICAgIG1WaVZpblVzZSA9IGZhbHNlOworICAgIG1Jc1pTTE9uID0gZmFsc2U7CisgICAgbWVtc2V0KCZtVmlWQnVmZiwgMCwgc2l6ZW9mKFZpVkJ1ZmZfdCkpOworCisgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworCisgICAgZG8geworICAgICAgICBjYW1lcmFbaV0gPSBuZXcgQ2FtZXJhQ29udGV4dChpKTsKKyAgICAgICAgaWYgKCBOVUxMID09IGNhbWVyYVtpXS5nZXQoKSApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhbWVyYVtpXS0+c2V0VGVzdEN0eEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIC8vYnkgZGVmYXVsdCBvcGVuIG9ubHkgYmFjayBjYW1lcmEKKyAgICAgICAgaWYgKGk9PTApIHsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXQgPSBjYW1lcmFbaV0tPm9wZW5DYW1lcmEoKTsKKyAgICAgICAgICAgIGlmICggTk9fRVJST1IgIT0gc3RhdCApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVycm9yIGVuY291bnRlcmVkIE9wZW5naW5nIGNhbWVyYSBpZCA6ICVkXG4iLCBpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQXZhaWxhYmxlQ2FtZXJhcy5hZGQoY2FtZXJhW2ldKTsKKyAgICAgICAgaSsrOworICAgIH0gd2hpbGUgKCBpIDwgY2FtZXJhWzBdLT5nZXROdW1iZXJPZkNhbWVyYXMoKSApIDsKKworICAgIGlmIChpIDwgY2FtZXJhWzBdLT5nZXROdW1iZXJPZkNhbWVyYXMoKSApIHsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtQXZhaWxhYmxlQ2FtZXJhcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgY2FtZXJhW2pdID0gbUF2YWlsYWJsZUNhbWVyYXMuaXRlbUF0KGopOworICAgICAgICAgICAgY2FtZXJhW2pdLT5jbG9zZUNhbWVyYSgpOworICAgICAgICAgICAgY2FtZXJhW2pdLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBtQXZhaWxhYmxlQ2FtZXJhcy5jbGVhcigpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgICAgICA6IH5UZXN0Q29udGV4dAorICoKKyAqIERFU0NSSVBUSU9OICAgICA6IFRlc3RDb250ZXh0IGRlc3RydWN0b3IKKyAqCisgKiBQQVJBTUVURVJTICAgICAgOiBOb25lCisgKgorICogUkVUVVJOICAgICAgICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitUZXN0Q29udGV4dDo6flRlc3RDb250ZXh0KCkKK3sKKyAgICBkZWxldGUgbUludGVycHJldGVyOworCisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtQXZhaWxhYmxlQ2FtZXJhcy5zaXplKCk7IGorKykgeworICAgICAgICBjYW1lcmFbal0gPSBtQXZhaWxhYmxlQ2FtZXJhcy5pdGVtQXQoaik7CisgICAgICAgIGNhbWVyYVtqXS0+Y2xvc2VDYW1lcmEoKTsKKyAgICAgICAgY2FtZXJhW2pdLmNsZWFyKCk7CisgICAgfQorCisgICAgbUF2YWlsYWJsZUNhbWVyYXMuY2xlYXIoKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgICAgICA6IEdldENhbWVyYXNOdW0KKyAqCisgKiBERVNDUklQVElPTiAgICAgOiBHZXQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgY2FtZXJhcworICoKKyAqIFBBUkFNRVRFUlMgICAgICA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgICAgICAgOiBOdW1iZXIgb2YgY2FtZXJhcworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzaXplX3QgVGVzdENvbnRleHQ6OkdldENhbWVyYXNOdW0oKQoreworICAgIHJldHVybiBtQXZhaWxhYmxlQ2FtZXJhcy5zaXplKCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICAgICAgOiBBZGRTY3JpcHRGcm9tRmlsZQorICoKKyAqIERFU0NSSVBUSU9OICAgICA6IEFkZCBzY3JpcHQgZnJvbSBmaWxlCisgKgorICogUEFSQU1FVEVSUyAgICAgIDoKKyAqICAgQHNjcmlwdEZpbGUgICA6IFNjcmlwdCBmaWxlCisgKgorICogUkVUVVJOICAgICAgICAgIDogc3RhdHVzX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXR1c190IFRlc3RDb250ZXh0OjpBZGRTY3JpcHRGcm9tRmlsZShjb25zdCBjaGFyICpzY3JpcHRGaWxlKQoreworICAgIG1JbnRlcnByZXRlciA9IG5ldyBJbnRlcnByZXRlcihzY3JpcHRGaWxlKTsKKyAgICBtSW50ZXJwcmV0ZXItPnNldFRlc3RDdHhJbnN0KHRoaXMpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgICAgIDogcmVsZWFzZVBpUEJ1ZmYKKyAqCisgKiBERVNDUklQVElPTiAgICAgOiBSZWxlYXNlIHZpZGVvIGluIHZpZGVvIHRlbXAgYnVmZmVyCisgKgorICogUEFSQU1FVEVSUyAgICAgIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBJbnRlcnByZXRlcjo6cmVsZWFzZVBpUEJ1ZmYoKSB7CisgICAgZnJlZShtVGVzdENvbnRleHQtPm1WaVZCdWZmLmJ1ZmYpOworICAgIG1UZXN0Q29udGV4dC0+bVZpVkJ1ZmYuYnVmZiA9IE5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZnVuY3Rpb25hbFRlc3QKKyAqCisgKiBERVNDUklQVElPTjogcXVlcmllcyBhbmQgZXhlY3V0ZXMgY2xpZW50IHN1cHBsaWVkIGNvbW1hbmRzIGZvciB0ZXN0aW5nIGEKKyAqICAgICAgICAgICAgICBwYXJ0aWN1bGFyIGNhbWVyYS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICBAYXZhaWxhYmxlQ2FtZXJhcyA6IExpc3Qgd2l0aCBhbGwgY2FtZXJhcyBzdXBwb3J0ZWQKKyAqCisgKiBSRVRVUk4gICAgIDogc3RhdHVzX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gY29udGludWUgdGVzdGluZworICogICAgICAgICAgICAgIG5vbmUtemVybyAtLSBxdWl0IHRlc3QKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdHVzX3QgVGVzdENvbnRleHQ6OkZ1bmN0aW9uYWxUZXN0KCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0ID0gTk9fRVJST1I7CisgICAgY29uc3QgY2hhciAqWlNMU3RyID0gTlVMTDsKKyAgICBzaXplX3QgWlNMU3RyU2l6ZSA9IDA7CisKKyAgICBhc3NlcnQobUF2YWlsYWJsZUNhbWVyYXMuc2l6ZSgpKTsKKworICAgIGlmICggIW1JbnRlcnByZXRlciApIHsKKyAgICAgICAgbUludGVycHJldGVyID0gbmV3IEludGVycHJldGVyKCk7CisgICAgICAgIG1JbnRlcnByZXRlci0+c2V0VGVzdEN0eEluc3QodGhpcyk7CisgICAgfQorCisgICAgaWYgKG1BdmFpbGFibGVDYW1lcmFzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHByaW50Zigibm8gY2FtZXJhcyBzdXBwb3J0ZWQuLi4gZXhpdGluZyB0ZXN0IGFwcFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVRlc3RSdW5uaW5nID0gdHJ1ZTsKKyAgICB9CisKKyAgICB3aGlsZSAobVRlc3RSdW5uaW5nKSB7CisgICAgICAgIHNwPENhbWVyYUNvbnRleHQ+IGN1cnJlbnRDYW1lcmEgPQorICAgICAgICAgICAgbUF2YWlsYWJsZUNhbWVyYXMuaXRlbUF0KG1DdXJyZW50Q2FtZXJhSW5kZXgpOworICAgICAgICBJbnRlcnByZXRlcjo6Q29tbWFuZCBjb21tYW5kID0KKyAgICAgICAgICAgIG1JbnRlcnByZXRlci0+Z2V0Q29tbWFuZChjdXJyZW50Q2FtZXJhKTsKKyAgICAgICAgY3VycmVudENhbWVyYS0+ZW5hYmxlUHJpbnRQcmV2aWV3KCk7CisKKyAgICAgICAgc3dpdGNoIChjb21tYW5kLmNtZCkgeworICAgICAgICBjYXNlIEludGVycHJldGVyOjpTV0lUQ0hfQ0FNRVJBX0NNRDoKKyAgICAgICAgeworICAgICAgICAgICAgbUN1cnJlbnRDYW1lcmFJbmRleCsrOworICAgICAgICAgICAgbUN1cnJlbnRDYW1lcmFJbmRleCAlPSBtQXZhaWxhYmxlQ2FtZXJhcy5zaXplKCk7CisgICAgICAgICAgICBjdXJyZW50Q2FtZXJhID0gbUF2YWlsYWJsZUNhbWVyYXMuaXRlbUF0KG1DdXJyZW50Q2FtZXJhSW5kZXgpOworICAgICAgICAgICAgc3RhdCA9IGN1cnJlbnRDYW1lcmEtPm9wZW5DYW1lcmEoKTsKKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJbnRlcnByZXRlcjo6UkVTVU1FX1BSRVZJRVdfQ01EOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ID0gY3VycmVudENhbWVyYS0+cmVzdW1lUHJldmlldygpOworICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEludGVycHJldGVyOjpTVEFSVF9QUkVWSUVXX0NNRDoKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdCA9IGN1cnJlbnRDYW1lcmEtPnN0YXJ0UHJldmlldygpOworICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEludGVycHJldGVyOjpTVE9QX1BSRVZJRVdfQ01EOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ID0gY3VycmVudENhbWVyYS0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJbnRlcnByZXRlcjo6Q0hBTkdFX1ZJREVPX1NJWkVfQ01EOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGNvbW1hbmQuYXJnICkKKyAgICAgICAgICAgICAgICBzdGF0ID0gY3VycmVudENhbWVyYS0+c2V0VmlkZW9TaXplKGNvbW1hbmQuYXJnKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdGF0ID0gY3VycmVudENhbWVyYS0+bmV4dFZpZGVvU2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSW50ZXJwcmV0ZXI6OkNIQU5HRV9QUkVWSUVXX1NJWkVfQ01EOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGNvbW1hbmQuYXJnICkKKyAgICAgICAgICAgICAgICBzdGF0ID0gY3VycmVudENhbWVyYS0+c2V0UHJldmlld1NpemUoY29tbWFuZC5hcmcpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0YXQgPSBjdXJyZW50Q2FtZXJhLT5uZXh0UHJldmlld1NpemUoKTsKKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJbnRlcnByZXRlcjo6Q0hBTkdFX1BJQ1RVUkVfU0laRV9DTUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggY29tbWFuZC5hcmcgKQorICAgICAgICAgICAgICAgIHN0YXQgPSBjdXJyZW50Q2FtZXJhLT5zZXRQaWN0dXJlU2l6ZShjb21tYW5kLmFyZyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3RhdCA9IGN1cnJlbnRDYW1lcmEtPm5leHRQaWN0dXJlU2l6ZSgpOworICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEludGVycHJldGVyOjpEVU1QX0NBUFNfQ01EOgorICAgICAgICB7CisgICAgICAgICAgICBjdXJyZW50Q2FtZXJhLT5wcmludFN1cHBvcnRlZFBhcmFtcygpOworICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEludGVycHJldGVyOjpBVVRPRk9DVVNfQ01EOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ID0gY3VycmVudENhbWVyYS0+YXV0b0ZvY3VzKCk7CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSW50ZXJwcmV0ZXI6OlRBS0VQSUNUVVJFX0NNRDoKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdCA9IGN1cnJlbnRDYW1lcmEtPnRha2VQaWN0dXJlKCk7CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSW50ZXJwcmV0ZXI6OlRBS0VQSUNUVVJFX0lOX1BJQ1RVUkVfQ01EOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobUF2YWlsYWJsZUNhbWVyYXMuc2l6ZSgpID09IDIpIHsKKyAgICAgICAgICAgICAgICBtU2F2ZUN1cnJlbnRDYW1lcmFJbmRleCA9IG1DdXJyZW50Q2FtZXJhSW5kZXg7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlQ2FtZXJhcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudENhbWVyYUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudENhbWVyYSA9IG1BdmFpbGFibGVDYW1lcmFzLml0ZW1BdChtQ3VycmVudENhbWVyYUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudENhbWVyYS0+ZW5hYmxlUGlQQ2FwdHVyZSgpOworICAgICAgICAgICAgICAgICAgICBzdGF0ID0gY3VycmVudENhbWVyYS0+dGFrZVBpY3R1cmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUN1cnJlbnRDYW1lcmFJbmRleCA9IG1TYXZlQ3VycmVudENhbWVyYUluZGV4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIk51bWJlciBvZiBhdmFpbGFibGUgc2Vuc29ycyBzaG91bGQgYmUgMlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJbnRlcnByZXRlcjo6RU5BQkxFX1BSVl9DQUxMQkFDS1NfQ01EOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ID0gY3VycmVudENhbWVyYS0+ZW5hYmxlUHJldmlld0NhbGxiYWNrcygpOworICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEludGVycHJldGVyOjpTVEFSVF9SRUNPUkRfQ01EOgorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ID0gY3VycmVudENhbWVyYS0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgICAgIHN0YXQgPSBjdXJyZW50Q2FtZXJhLT5jb25maWd1cmVSZWNvcmRlcigpOworICAgICAgICAgICAgc3RhdCA9IGN1cnJlbnRDYW1lcmEtPnN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgc3RhdCA9IGN1cnJlbnRDYW1lcmEtPnN0YXJ0UmVjb3JkaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSW50ZXJwcmV0ZXI6OlNUT1BfUkVDT1JEX0NNRDoKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdCA9IGN1cnJlbnRDYW1lcmEtPnN0b3BSZWNvcmRpbmcoKTsKKworICAgICAgICAgICAgc3RhdCA9IGN1cnJlbnRDYW1lcmEtPnN0b3BQcmV2aWV3KCk7CisgICAgICAgICAgICBzdGF0ID0gY3VycmVudENhbWVyYS0+dW5jb25maWd1cmVSZWNvcmRlcigpOworICAgICAgICAgICAgc3RhdCA9IGN1cnJlbnRDYW1lcmEtPnN0YXJ0UHJldmlldygpOworICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEludGVycHJldGVyOjpTVEFSVF9WSVZfUkVDT1JEX0NNRDoKKyAgICAgICAgeworCisgICAgICAgICAgICBpZiAobUF2YWlsYWJsZUNhbWVyYXMuc2l6ZSgpID09IDIpIHsKKyAgICAgICAgICAgICAgICBtU2F2ZUN1cnJlbnRDYW1lcmFJbmRleCA9IG1DdXJyZW50Q2FtZXJhSW5kZXg7CisgICAgICAgICAgICAgICAgc3RhdCA9IG1JbnRlcnByZXRlci0+Y29uZmlndXJlVmlWQ29kZWMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKCBzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlQ2FtZXJhcy5zaXplKCk7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRDYW1lcmFJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDYW1lcmEgPSBtQXZhaWxhYmxlQ2FtZXJhcy5pdGVtQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudENhbWVyYUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdCA9IGN1cnJlbnRDYW1lcmEtPnN0b3BQcmV2aWV3KCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXQgPSBjdXJyZW50Q2FtZXJhLT5jb25maWd1cmVWaVZSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdCA9IGN1cnJlbnRDYW1lcmEtPnN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgICAgICAgICBzdGF0ID0gY3VycmVudENhbWVyYS0+c3RhcnRWaVZSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUN1cnJlbnRDYW1lcmFJbmRleCA9IG1TYXZlQ3VycmVudENhbWVyYUluZGV4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIk51bWJlciBvZiBhdmFpbGFibGUgc2Vuc29ycyBzaG91bGQgYmUgMlxuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJbnRlcnByZXRlcjo6U1RPUF9WSVZfUkVDT1JEX0NNRDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1BdmFpbGFibGVDYW1lcmFzLnNpemUoKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgbVNhdmVDdXJyZW50Q2FtZXJhSW5kZXggPSBtQ3VycmVudENhbWVyYUluZGV4OworICAgICAgICAgICAgICAgIGZvciAoIHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVDYW1lcmFzLnNpemUoKTsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudENhbWVyYUluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudENhbWVyYSA9IG1BdmFpbGFibGVDYW1lcmFzLml0ZW1BdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q2FtZXJhSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBzdGF0ID0gY3VycmVudENhbWVyYS0+c3RvcFZpVlJlY29yZGluZygpOworICAgICAgICAgICAgICAgICAgICBzdGF0ID0gY3VycmVudENhbWVyYS0+c3RvcFByZXZpZXcoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdCA9IGN1cnJlbnRDYW1lcmEtPnVuY29uZmlndXJlUmVjb3JkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdCA9IGN1cnJlbnRDYW1lcmEtPnN0YXJ0UHJldmlldygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0ID0gbUludGVycHJldGVyLT51bmNvbmZpZ3VyZVZpVkNvZGVjKCk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRDYW1lcmFJbmRleCA9IG1TYXZlQ3VycmVudENhbWVyYUluZGV4OworCisgICAgICAgICAgICAgICAgbUludGVycHJldGVyLT5yZWxlYXNlUGlQQnVmZigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIk51bWJlciBvZiBhdmFpbGFibGUgc2Vuc29ycyBzaG91bGQgYmUgMlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJbnRlcnByZXRlcjo6RVhJVF9DTUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnRDYW1lcmEtPnN0b3BQcmV2aWV3KCk7CisgICAgICAgICAgICBtVGVzdFJ1bm5pbmcgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJbnRlcnByZXRlcjo6REVMQVk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggY29tbWFuZC5hcmcgKSB7CisgICAgICAgICAgICAgICAgaW50IGRlbGF5ID0gYXRvaShjb21tYW5kLmFyZyk7CisgICAgICAgICAgICAgICAgaWYgKDAgPCBkZWxheSkgeworICAgICAgICAgICAgICAgICAgICB1c2xlZXAoMTAwMFUgKiAodW5zaWduZWQgaW50KWRlbGF5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSW50ZXJwcmV0ZXI6OlpTTF9DTUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnRDYW1lcmEgPSBtQXZhaWxhYmxlQ2FtZXJhcy5pdGVtQXQoCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q2FtZXJhSW5kZXgpOworICAgICAgICAgICAgWlNMU3RyID0gY3VycmVudENhbWVyYS0+Z2V0WlNMKCk7CisKKyAgICAgICAgICAgIGlmIChOVUxMICE9IFpTTFN0cikgeworICAgICAgICAgICAgICAgIFpTTFN0clNpemUgPSBzdHJsZW4oWlNMU3RyKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoWlNMU3RyLCAib2ZmIiwgWlNMU3RyU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudENhbWVyYS0+c2V0WlNMKCJvbiIpOworICAgICAgICAgICAgICAgICAgICBtSXNaU0xPbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChaU0xTdHIsICJvbiIsIFpTTFN0clNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDYW1lcmEtPnNldFpTTCgib2ZmIik7CisgICAgICAgICAgICAgICAgICAgIG1Jc1pTTE9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJTZXQgenNsIGZhaWxlZCFcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJ6c2wgaXMgTlVMTFxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnRDYW1lcmEtPmRpc2FibGVQcmludFByZXZpZXcoKTsKKyAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJDb21tYW5kIHN0YXR1cyAweCV4IFxuIiwgc3RhdCk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFBpUExvY2sKKyAqCisgKiBERVNDUklQVElPTjogTXV0ZXggbG9jayBmb3IgUGlQIGNhcHR1cmUKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgVGVzdENvbnRleHQ6OlBpUExvY2soKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsKG1QaVBMb2NrKTsKKyAgICB3aGlsZSAobVBpUGluVXNlKSB7CisgICAgICAgIG1QaVBDb25kLndhaXQobVBpUExvY2spOworICAgIH0KKyAgICBtUGlQaW5Vc2UgPSB0cnVlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFBpUFVuTG9jaworICoKKyAqIERFU0NSSVBUSU9OOiBNdXRleCB1bmxvY2sgZm9yIFBpUCBjYXB0dXJlCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFRlc3RDb250ZXh0OjpQaVBVbmxvY2soKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsKG1QaVBMb2NrKTsKKyAgICBtUGlQaW5Vc2UgPSBmYWxzZTsKKyAgICBtUGlQQ29uZC5zaWduYWwoKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBWaVZMb2NrCisgKgorICogREVTQ1JJUFRJT046IE11dGV4IGxvY2sgZm9yIFZpViBWaWRlbworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBUZXN0Q29udGV4dDo6VmlWTG9jaygpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVZpVkxvY2spOworICAgIHdoaWxlIChtVmlWaW5Vc2UpIHsKKyAgICAgICAgbVZpVkNvbmQud2FpdChtVmlWTG9jayk7CisgICAgfQorICAgIG1WaVZpblVzZSA9IHRydWU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogVmlWVW5sb2NrCisgKgorICogREVTQ1JJUFRJT046IE11dGV4IHVubG9jayBmb3IgVmlWIFZpZGVvCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFRlc3RDb250ZXh0OjpWaVZVbmxvY2soKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsKG1WaVZMb2NrKTsKKyAgICBtVmlWaW5Vc2UgPSBmYWxzZTsKKyAgICBtVmlWQ29uZC5zaWduYWwoKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgICA6IHNldFZpVlNpemUKKyAqCisgKiBERVNDUklQVElPTiAgOiBTZXQgdmlkZW8gaW4gdmlkZW8gc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgICA6CisgKiAgIEBWaWRlb1NpemUgOiB2aWRlbyBzaXplCisgKiAgIEBjYW1JbmRleCAgOiBjYW1lcmEgaW5kZXgKKyAqCisgKiBSRVRVUk4gICAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgVGVzdENvbnRleHQ6OnNldFZpVlNpemUoU2l6ZSBWaWRlb1NpemUsIGludCBjYW1JbmRleCkKK3sKKyAgICBtVmlWVmlkLlZpZGVvU2l6ZXNbY2FtSW5kZXhdID0gVmlkZW9TaXplOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgIDogbWFpbgorICoKKyAqIERFU0NSSVBUSU9OICA6IG1haW4gZnVuY3Rpb24KKyAqCisgKiBQQVJBTUVURVJTICAgOgorICogICBAYXJnYyAgICAgIDogYXJnYworICogICBAYXJndiAgICAgIDogYXJndgorICoKKyAqIFJFVFVSTiAgICAgICA6IGludCBzdGF0dXMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBUZXN0Q29udGV4dCBjdHg7CisKKyAgICBpZiAoYXJnYyA+IDEpIHsKKyAgICAgICAgaWYgKCBjdHguQWRkU2NyaXB0RnJvbUZpbGUoKGNvbnN0IGNoYXIgKilhcmd2WzFdKSApIHsKKyAgICAgICAgICAgIHByaW50ZigiQ291bGQgbm90IGFkZCBzY3JpcHQgZmlsZS4uLiAiCisgICAgICAgICAgICAgICAgImNvbnRpbnVpbmcgaW4gbm9ybWFsIG1lbnUgbW9kZSEgXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGN0eC5GdW5jdGlvbmFsVGVzdCgpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFML3Rlc3QvcWNhbWVyYV90ZXN0LmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML3Rlc3QvcWNhbWVyYV90ZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhjNTk5OAotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvdGVzdC9xY2FtZXJhX3Rlc3QuaApAQCAtMCwwICsxLDM2MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIFFDQU1FUkFfVEVTVF9ICisjZGVmaW5lIFFDQU1FUkFfVEVTVF9ICisKKyNpbmNsdWRlIDxTa0RhdGEuaD4KKyNpbmNsdWRlIDxTa0JpdG1hcC5oPgorI2luY2x1ZGUgPFNrU3RyZWFtLmg+CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKyNkZWZpbmUgTUFYX0NBTV9JTlNUQU5DRVMgMworCitjbGFzcyBUZXN0Q29udGV4dDsKKworY2xhc3MgQ2FtZXJhQ29udGV4dCA6IHB1YmxpYyBDYW1lcmFMaXN0ZW5lciwKKyAgICBwdWJsaWMgSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXJ7CitwdWJsaWM6CisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAgUkVBRF9NRVRBREFUQSA9IDEsCisgICAgICAgIFJFQURfSU1BR0UgPSAyLAorICAgICAgICBSRUFEX0FMTCA9IDMKKyAgICB9IFJlYWRNb2RlX3Q7CisKKyAgICAvLyBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIGpwZWcgZmlsZSBzZWN0aW9ucyBpbiBtZW1vcnkuCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICB1bnNpZ25lZCBjaGFyICogIERhdGE7CisgICAgICAgIGludCAgICAgIFR5cGU7CisgICAgICAgIHNpemVfdCAgIFNpemU7CisgICAgfSBTZWN0aW9uc190OworCitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1pTTFtdOworCisgICAgQ2FtZXJhQ29udGV4dChpbnQgY2FtZXJhSW5kZXgpOworICAgIHZpcnR1YWwgfkNhbWVyYUNvbnRleHQoKTsKKworCisKKyAgICBzdGF0dXNfdCBvcGVuQ2FtZXJhKCk7CisgICAgc3RhdHVzX3QgY2xvc2VDYW1lcmEoKTsKKworICAgIHN0YXR1c190IHN0YXJ0UHJldmlldygpOworICAgIHN0YXR1c190IHN0b3BQcmV2aWV3KCk7CisgICAgc3RhdHVzX3QgcmVzdW1lUHJldmlldygpOworICAgIHN0YXR1c190IGF1dG9Gb2N1cygpOworICAgIHN0YXR1c190IGVuYWJsZVByZXZpZXdDYWxsYmFja3MoKTsKKyAgICBzdGF0dXNfdCB0YWtlUGljdHVyZSgpOworICAgIHN0YXR1c190IHN0YXJ0UmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3Qgc3RvcFJlY29yZGluZygpOworICAgIHN0YXR1c190IHN0YXJ0VmlWUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3Qgc3RvcFZpVlJlY29yZGluZygpOworICAgIHN0YXR1c190IGNvbmZpZ3VyZVZpVlJlY29yZGluZygpOworCisgICAgc3RhdHVzX3QgbmV4dFByZXZpZXdTaXplKCk7CisgICAgc3RhdHVzX3Qgc2V0UHJldmlld1NpemUoY29uc3QgY2hhciAqZm9ybWF0KTsKKyAgICBzdGF0dXNfdCBnZXRDdXJyZW50UHJldmlld1NpemUoU2l6ZSAmcHJldmlld1NpemUpOworCisgICAgc3RhdHVzX3QgbmV4dFBpY3R1cmVTaXplKCk7CisgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBpY3R1cmVTaXplKFNpemUgJnBpY3R1cmVTaXplKTsKKyAgICBzdGF0dXNfdCBzZXRQaWN0dXJlU2l6ZShjb25zdCBjaGFyICpmb3JtYXQpOworCisgICAgc3RhdHVzX3QgbmV4dFZpZGVvU2l6ZSgpOworICAgIHN0YXR1c190IHNldFZpZGVvU2l6ZShjb25zdCBjaGFyICpmb3JtYXQpOworICAgIHN0YXR1c190IGdldEN1cnJlbnRWaWRlb1NpemUoU2l6ZSAmdmlkZW9TaXplKTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVSZWNvcmRlcigpOworICAgIHN0YXR1c190IHVuY29uZmlndXJlUmVjb3JkZXIoKTsKKyAgICBTZWN0aW9uc190ICpGaW5kU2VjdGlvbihpbnQgU2VjdGlvblR5cGUpOworICAgIHN0YXR1c190IFJlYWRTZWN0aW9uc0Zyb21CdWZmZXIgKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJfc2l6ZSwgUmVhZE1vZGVfdCBSZWFkTW9kZSk7CisgICAgdmlydHVhbCBJQmluZGVyKiBvbkFzQmluZGVyKCk7CisgICAgdm9pZCBzZXRUZXN0Q3R4SW5zdGFuY2UoVGVzdENvbnRleHQgKmluc3RhbmNlKTsKKworICAgIHZvaWQgcHJpbnRNZW51KHNwPENhbWVyYUNvbnRleHQ+IGN1cnJlbnRDYW1lcmEpOworICAgIHZvaWQgcHJpbnRTdXBwb3J0ZWRQYXJhbXMoKTsKKyAgICBjb25zdCBjaGFyICpnZXRaU0woKTsKKyAgICB2b2lkIHNldFpTTChjb25zdCBjaGFyICp2YWx1ZSk7CisKKworICAgIGludCBnZXRDYW1lcmFJbmRleCgpIHsgcmV0dXJuIG1DYW1lcmFJbmRleDsgfQorICAgIGludCBnZXROdW1iZXJPZkNhbWVyYXMoKTsKKyAgICB2b2lkIGVuYWJsZVByaW50UHJldmlldygpOworICAgIHZvaWQgZGlzYWJsZVByaW50UHJldmlldygpOworICAgIHZvaWQgZW5hYmxlUGlQQ2FwdHVyZSgpOworICAgIHZvaWQgZGlzYWJsZVBpUENhcHR1cmUoKTsKKyAgICB2b2lkIENoZWNrU2VjdGlvbnNBbGxvY2F0ZWQoKTsKKyAgICB2b2lkIERpc2NhcmREYXRhKCk7CisgICAgdm9pZCBEaXNjYXJkU2VjdGlvbnMoKTsKKyAgICBzaXplX3QgY2FsY0J1ZmZlclNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICBzaXplX3QgY2FsY1N0cmlkZShpbnQgd2lkdGgpOworICAgIHNpemVfdCBjYWxjWVNjYW5MaW5lcyhpbnQgaGVpZ2h0KTsKKyAgICBzaXplX3QgY2FsY1VWU2NhbkxpbmVzKGludCBoZWlnaHQpOworCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwgaW50MzJfdCBleHQyKTsKKyAgICB2aXJ0dWFsIHZvaWQgcG9zdERhdGEoaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsCisgICAgICAgICAgICBjYW1lcmFfZnJhbWVfbWV0YWRhdGFfdCAqbWV0YWRhdGEpOworCisgICAgdmlydHVhbCB2b2lkIHBvc3REYXRhVGltZXN0YW1wKG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICAgICAgaW50MzJfdCBtc2dUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIpOworICAgIHZpcnR1YWwgdm9pZCBkYXRhQ2FsbGJhY2tUaW1lc3RhbXAobnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBpbnQzMl90IG1zZ1R5cGUsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0cik7CisKK3ByaXZhdGU6CisKKyAgICBzdGF0dXNfdCBjcmVhdGVQcmV2aWV3U3VyZmFjZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludDMyX3QgcGl4Rm9ybWF0KTsKKyAgICBzdGF0dXNfdCBkZXN0cm95UHJldmlld1N1cmZhY2UoKTsKKworICAgIHN0YXR1c190IHNhdmVGaWxlKGNvbnN0IHNwPElNZW1vcnk+JiBtZW0sIFN0cmluZzggcGF0aCk7CisgICAgU2tCaXRtYXAgKiBQaVBDb3B5VG9PbmVGaWxlKFNrQml0bWFwICpiaXRtYXAwLCBTa0JpdG1hcCAqYml0bWFwMSk7CisgICAgc3RhdHVzX3QgZGVjb2RlSlBFRyhjb25zdCBzcDxJTWVtb3J5PiYgbWVtLCBTa0JpdG1hcCAqc2tCTSk7CisgICAgc3RhdHVzX3QgZW5jb2RlSlBFRyhTa1dTdHJlYW0gKiBzdHJlYW0sIGNvbnN0IFNrQml0bWFwICpiaXRtYXAsCisgICAgICAgIFN0cmluZzggcGF0aCk7CisgICAgdm9pZCBwcmV2aWV3Q2FsbGJhY2soY29uc3Qgc3A8SU1lbW9yeT4mIG1lbSk7CisKKyAgICBzdGF0aWMgaW50IEpwZWdJZHg7CisgICAgaW50IG1DYW1lcmFJbmRleDsKKyAgICBib29sIG1SZXNpemVQcmV2aWV3OworICAgIGJvb2wgbUhhcmR3YXJlQWN0aXZlOworICAgIGJvb2wgbVByZXZpZXdSdW5uaW5nOworICAgIGJvb2wgbVJlY29yZFJ1bm5pbmc7CisgICAgaW50ICBtVmlkZW9GZDsKKyAgICBpbnQgIG1WaWRlb0lkeDsKKyAgICBib29sIG1SZWNvcmRpbmdIaW50OworICAgIGJvb2wgbURvUHJpbnRNZW51OworICAgIGJvb2wgbVBpUENhcHR1cmU7CisgICAgc3RhdGljIGludCBtUGlQSWR4OworICAgIHVuc2lnbmVkIGludCBtZm10TXVsdGlwbGllcjsKKyAgICBpbnQgbVdpZHRoVG1wOworICAgIGludCBtSGVpZ2h0VG1wOworICAgIHNpemVfdCBtU2VjdGlvbnNSZWFkOworICAgIHNpemVfdCBtU2VjdGlvbnNBbGxvY2F0ZWQ7CisgICAgU2VjdGlvbnNfdCAqIG1TZWN0aW9uczsKKyAgICBTZWN0aW9uc190ICogbUpFWElGVG1wOworICAgIFNlY3Rpb25zX3QgbUpFWElGU2VjdGlvbjsKKyAgICBpbnQgbUhhdmVBbGw7CisgICAgVGVzdENvbnRleHQgKm1JbnRlcnByOworCisgICAgc3A8Q2FtZXJhPiBtQ2FtZXJhOworICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gbUNsaWVudDsKKyAgICBzcDxTdXJmYWNlQ29udHJvbD4gbVN1cmZhY2VDb250cm9sOworICAgIHNwPFN1cmZhY2U+IG1QcmV2aWV3U3VyZmFjZTsKKyAgICBzcDxNZWRpYVJlY29yZGVyPiBtUmVjb3JkZXI7CisgICAgQ2FtZXJhUGFyYW1ldGVycyBtUGFyYW1zOworICAgIFNrQml0bWFwICpza0JNRGVjOworICAgIFNrSW1hZ2VFbmNvZGVyKiBza0pwZWdFbmM7CisgICAgU2tCaXRtYXAgc2tCTXRtcDsKKyAgICBzcDxJTWVtb3J5PiBQaVBQdHJUbXA7CisKKyAgICBzaXplX3QgbUN1cnJlbnRQcmV2aWV3U2l6ZUlkeDsKKyAgICBTaXplIGdldFByZXZpZXdTaXplRnJvbVZpZGVvU2l6ZXMoU2l6ZSBjdXJyZW50VmlkZW9TaXplKTsKKyAgICBzaXplX3QgbUN1cnJlbnRQaWN0dXJlU2l6ZUlkeDsKKyAgICBzaXplX3QgbUN1cnJlbnRWaWRlb1NpemVJZHg7CisgICAgVmVjdG9yPFNpemU+IG1TdXBwb3J0ZWRQcmV2aWV3U2l6ZXM7CisgICAgVmVjdG9yPFNpemU+IG1TdXBwb3J0ZWRQaWN0dXJlU2l6ZXM7CisgICAgVmVjdG9yPFNpemU+IG1TdXBwb3J0ZWRWaWRlb1NpemVzOworCisgICAgYm9vbCBtSW5Vc2U7CisgICAgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kOworCisgICAgdm9pZCB1c2VMb2NrKCk7CisgICAgdm9pZCBzaWduYWxGaW5pc2hlZCgpOworCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBKUEVHIG1hcmtlcnMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSAweEZGIGJ5dGVzLCBmb2xsb3dlZCBieSBhIG1hcmtlcgorICAgIC8vIGNvZGUgYnl0ZSAod2hpY2ggaXMgbm90IGFuIEZGKS4gIEhlcmUgYXJlIHRoZSBtYXJrZXIgY29kZXMgb2YgaW50ZXJlc3QKKyAgICAvLyBpbiB0aGlzIHByb2dyYW0uICAoU2VlIGpkbWFya2VyLmMgZm9yIGEgbW9yZSBjb21wbGV0ZSBsaXN0LikKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICNkZWZpbmUgTV9TT0YwICAweEMwICAgICAgICAgIC8vIFN0YXJ0IE9mIEZyYW1lIE4KKyAgICAjZGVmaW5lIE1fU09GMSAgMHhDMSAgICAgICAgICAvLyBOIGluZGljYXRlcyB3aGljaCBjb21wcmVzc2lvbiBwcm9jZXNzCisgICAgI2RlZmluZSBNX1NPRjIgIDB4QzIgICAgICAgICAgLy8gT25seSBTT0YwLVNPRjIgYXJlIG5vdyBpbiBjb21tb24gdXNlCisgICAgI2RlZmluZSBNX1NPRjMgIDB4QzMKKyAgICAjZGVmaW5lIE1fU09GNSAgMHhDNSAgICAgICAgICAvLyBOQjogY29kZXMgQzQgYW5kIENDIGFyZSBOT1QgU09GIG1hcmtlcnMKKyAgICAjZGVmaW5lIE1fU09GNiAgMHhDNgorICAgICNkZWZpbmUgTV9TT0Y3ICAweEM3CisgICAgI2RlZmluZSBNX1NPRjkgIDB4QzkKKyAgICAjZGVmaW5lIE1fU09GMTAgMHhDQQorICAgICNkZWZpbmUgTV9TT0YxMSAweENCCisgICAgI2RlZmluZSBNX1NPRjEzIDB4Q0QKKyAgICAjZGVmaW5lIE1fU09GMTQgMHhDRQorICAgICNkZWZpbmUgTV9TT0YxNSAweENGCisgICAgI2RlZmluZSBNX1NPSSAgIDB4RDggICAgICAgICAgLy8gU3RhcnQgT2YgSW1hZ2UgKGJlZ2lubmluZyBvZiBkYXRhc3RyZWFtKQorICAgICNkZWZpbmUgTV9FT0kgICAweEQ5ICAgICAgICAgIC8vIEVuZCBPZiBJbWFnZSAoZW5kIG9mIGRhdGFzdHJlYW0pCisgICAgI2RlZmluZSBNX1NPUyAgIDB4REEgICAgICAgICAgLy8gU3RhcnQgT2YgU2NhbiAoYmVnaW5zIGNvbXByZXNzZWQgZGF0YSkKKyAgICAjZGVmaW5lIE1fSkZJRiAgMHhFMCAgICAgICAgICAvLyBKZmlmIG1hcmtlcgorICAgICNkZWZpbmUgTV9FWElGICAweEUxICAgICAgICAgIC8vIEV4aWYgbWFya2VyLiAgQWxzbyB1c2VkIGZvciBYTVAgZGF0YSEKKyAgICAjZGVmaW5lIE1fWE1QICAgMHgxMEUxICAgICAgICAvLyBOb3QgYSByZWFsIHRhZyBzYW1lIHZhbHVlIGFzIEV4aWYhCisgICAgI2RlZmluZSBNX0NPTSAgIDB4RkUgICAgICAgICAgLy8gQ09NbWVudAorICAgICNkZWZpbmUgTV9EUVQgICAweERCCisgICAgI2RlZmluZSBNX0RIVCAgIDB4QzQKKyAgICAjZGVmaW5lIE1fRFJJICAgMHhERAorICAgICNkZWZpbmUgTV9JUFRDICAweEVEICAgICAgICAgIC8vIElQVEMgbWFya2VyCisgICAgI2RlZmluZSBQU0VVRE9fSU1BR0VfTUFSS0VSIDB4MTIzOyAvLyBFeHRyYSB2YWx1ZS4KK307CisKK2NsYXNzIEludGVycHJldGVyCit7CitwdWJsaWM6CisgICAgZW51bSBDb21tYW5kc19lIHsKKyAgICAgICAgU1dJVENIX0NBTUVSQV9DTUQgPSAnQScsCisgICAgICAgIFJFU1VNRV9QUkVWSUVXX0NNRCA9ICdbJywKKyAgICAgICAgU1RBUlRfUFJFVklFV19DTUQgPSAnMScsCisgICAgICAgIFNUT1BfUFJFVklFV19DTUQgPSAnMicsCisgICAgICAgIENIQU5HRV9WSURFT19TSVpFX0NNRCA9ICczJywKKyAgICAgICAgQ0hBTkdFX1BSRVZJRVdfU0laRV9DTUQgPSAnNCcsCisgICAgICAgIENIQU5HRV9QSUNUVVJFX1NJWkVfQ01EID0gJzUnLAorICAgICAgICBTVEFSVF9SRUNPUkRfQ01EID0gJzYnLAorICAgICAgICBTVE9QX1JFQ09SRF9DTUQgPSAnNycsCisgICAgICAgIFNUQVJUX1ZJVl9SRUNPUkRfQ01EID0gJzgnLAorICAgICAgICBTVE9QX1ZJVl9SRUNPUkRfQ01EID0gJzknLAorICAgICAgICBEVU1QX0NBUFNfQ01EID0gJ0UnLAorICAgICAgICBBVVRPRk9DVVNfQ01EID0gJ2YnLAorICAgICAgICBUQUtFUElDVFVSRV9DTUQgPSAncCcsCisgICAgICAgIFRBS0VQSUNUVVJFX0lOX1BJQ1RVUkVfQ01EID0gJ1AnLAorICAgICAgICBFTkFCTEVfUFJWX0NBTExCQUNLU19DTUQgPSAnJicsCisgICAgICAgIEVYSVRfQ01EID0gJ3EnLAorICAgICAgICBERUxBWSA9ICdkJywKKyAgICAgICAgWlNMX0NNRCA9ICd6JywKKyAgICAgICAgSU5WQUxJRF9DTUQgPSAnMCcKKyAgICB9OworCisgICAgc3RydWN0IENvbW1hbmQgeworICAgICAgICBDb21tYW5kKCBDb21tYW5kc19lIGNtZF8sIGNoYXIgKmFyZ18gPSBOVUxMKQorICAgICAgICA6IGNtZChjbWRfKQorICAgICAgICAsIGFyZyhhcmdfKSB7fQorICAgICAgICBDb21tYW5kKCkKKyAgICAgICAgOiBjbWQoSU5WQUxJRF9DTUQpCisgICAgICAgICwgYXJnKE5VTEwpIHt9CisgICAgICAgIENvbW1hbmRzX2UgY21kOworICAgICAgICBjaGFyICphcmc7CisgICAgfTsKKworICAgIC8qIEFQSSAqLworICAgIEludGVycHJldGVyKCkKKyAgICA6IG1Vc2VTY3JpcHQoZmFsc2UpCisgICAgLCBtU2NyaXB0KE5VTEwpIHt9CisKKyAgICBJbnRlcnByZXRlcihjb25zdCBjaGFyICpmaWxlKTsKKyAgICB+SW50ZXJwcmV0ZXIoKTsKKworICAgIENvbW1hbmQgZ2V0Q29tbWFuZChzcDxDYW1lcmFDb250ZXh0PiBjdXJyZW50Q2FtZXJhKTsKKyAgICB2b2lkIHJlbGVhc2VQaVBCdWZmKCk7CisgICAgc3RhdHVzX3QgY29uZmlndXJlVmlWQ29kZWMoKTsKKyAgICB2b2lkIHNldFZpVlNpemUoU2l6ZSBWaWRlb1NpemUsIGludCBjYW1JbmRleCk7CisgICAgdm9pZCBzZXRUZXN0Q3R4SW5zdChUZXN0Q29udGV4dCAqaW5zdGFuY2UpOworICAgIHN0YXR1c190IHVuY29uZmlndXJlVmlWQ29kZWMoKTsKKyAgICBzdGF0dXNfdCBWaVZFbmNvZGVyVGhyZWFkKCk7CisgICAgdm9pZCBWaVZFbmNvZGUoKTsKKyAgICBzdGF0aWMgdm9pZCAqVGhyZWFkV3JhcHBlcih2b2lkICpjb250ZXh0KTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3QgaW50IG51bWJlck9mQ29tbWFuZHM7CisKKyAgICBib29sIG1Vc2VTY3JpcHQ7CisgICAgc2l6ZV90IG1DbWRJbmRleDsKKyAgICBjaGFyICptU2NyaXB0OworICAgIFZlY3RvcjxDb21tYW5kPiBtQ29tbWFuZHM7CisgICAgVGVzdENvbnRleHQgKm1UZXN0Q29udGV4dDsKKyAgICBwdGhyZWFkX3QgbVZpVkVuY1RocmVhZDsKK307CisKK2NsYXNzIFRlc3RDb250ZXh0Cit7CisgICAgZnJpZW5kIGNsYXNzIENhbWVyYUNvbnRleHQ7CisgICAgZnJpZW5kIGNsYXNzIEludGVycHJldGVyOworcHVibGljOgorICAgIFRlc3RDb250ZXh0KCk7CisgICAgflRlc3RDb250ZXh0KCk7CisKKyAgICBzaXplX3QgR2V0Q2FtZXJhc051bSgpOworICAgIHN0YXR1c190IEZ1bmN0aW9uYWxUZXN0KCk7CisgICAgc3RhdHVzX3QgQWRkU2NyaXB0RnJvbUZpbGUoY29uc3QgY2hhciAqc2NyaXB0RmlsZSk7CisgICAgdm9pZCBzZXRWaVZTaXplKFNpemUgVmlkZW9TaXplLCBpbnQgY2FtSW5kZXgpOworICAgIHZvaWQgUGlQTG9jaygpOworICAgIHZvaWQgUGlQVW5sb2NrKCk7CisgICAgdm9pZCBWaVZMb2NrKCk7CisgICAgdm9pZCBWaVZVbmxvY2soKTsKKworcHJpdmF0ZToKKyAgICBzcDxDYW1lcmFDb250ZXh0PiBjYW1lcmFbTUFYX0NBTV9JTlNUQU5DRVNdOworICAgIGNoYXIgR2V0TmV4dENtZChzcDxxY2FtZXJhOjpDYW1lcmFDb250ZXh0PiBjdXJyZW50Q2FtZXJhKTsKKyAgICBzaXplX3QgbUN1cnJlbnRDYW1lcmFJbmRleDsKKyAgICBzaXplX3QgbVNhdmVDdXJyZW50Q2FtZXJhSW5kZXg7CisgICAgVmVjdG9yPCBzcDxxY2FtZXJhOjpDYW1lcmFDb250ZXh0PiA+IG1BdmFpbGFibGVDYW1lcmFzOworICAgIGJvb2wgbVRlc3RSdW5uaW5nOworICAgIEludGVycHJldGVyICptSW50ZXJwcmV0ZXI7CisgICAgTXV0ZXggbVBpUExvY2s7CisgICAgQ29uZGl0aW9uIG1QaVBDb25kOworICAgIGJvb2wgbVBpUGluVXNlOworICAgIE11dGV4IG1WaVZMb2NrOworICAgIENvbmRpdGlvbiBtVmlWQ29uZDsKKyAgICBib29sIG1WaVZpblVzZTsKKyAgICBib29sIG1Jc1pTTE9uOworCisgICAgdHlwZWRlZiBzdHJ1Y3QgVmlWQnVmZl90eworICAgICAgICB2b2lkICpidWZmOworICAgICAgICBzaXplX3QgYnVmZlNpemU7CisgICAgICAgIHNpemVfdCBZU3RyaWRlOworICAgICAgICBzaXplX3QgVVZTdHJpZGU7CisgICAgICAgIHNpemVfdCBZU2NhbkxpbmVzOworICAgICAgICBzaXplX3QgVVZTY2FuTGluZXM7CisgICAgICAgIHNpemVfdCBzcmNXaWR0aDsKKyAgICAgICAgc2l6ZV90IHNyY0hlaWdodDsKKyAgICB9IFZpVkJ1ZmZfdDsKKworICAgIHR5cGVkZWYgc3RydWN0IFZpVlZpZF90eworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgc3A8TWVkaWFDb2RlYz4gY29kZWM7CisgICAgICAgIHNwPE1lZGlhTXV4ZXI+IG11eGVyOworICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBBTlc7CisgICAgICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IGJ1ZmZlcnM7CisgICAgICAgIFNpemUgVmlkZW9TaXplc1syXTsKKyAgICAgICAgaW50IFZpVklkeDsKKyAgICAgICAgc2l6ZV90IGJ1ZmZfY250OworICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaEJ1ZjsKKyAgICAgICAgdm9pZCAqIG1hcHBlZEJ1ZmY7CisgICAgICAgIGJvb2wgaXNCdWZmVmFsaWQ7CisgICAgICAgIGludCBzb3VyY2VDYW1lcmFJRDsKKyAgICAgICAgaW50IGRlc3RpbmF0aW9uQ2FtZXJhSUQ7CisgICAgfSB2aWRQaVBfdDsKKworICAgIFZpVlZpZF90IG1WaVZWaWQ7CisgICAgVmlWQnVmZl90IG1WaVZCdWZmOworfTsKKworfTsgLy9uYW1lc3BhY2UgcWNhbWVyYQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvdHNNYWtldXBsaWIvaW5jbHVkZS90c19kZXRlY3RmYWNlX2VuZ2luZS5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC90c01ha2V1cGxpYi9pbmNsdWRlL3RzX2RldGVjdGZhY2VfZW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5NzQ0NwotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvdHNNYWtldXBsaWIvaW5jbHVkZS90c19kZXRlY3RmYWNlX2VuZ2luZS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LDIwMTUgVGh1bmRlcnNvZnQgQ29ycG9yYXRpb24KKyAqIEFsbCByaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1RTX0RFVEVDVEZBQ0VfRU5HSU5FX0hfXworI2RlZmluZSBfX1RTX0RFVEVDVEZBQ0VfRU5HSU5FX0hfXworI2luY2x1ZGUgInRzX21ha2V1cF9kYXRhLmgiCisjaW5jbHVkZSAidHNfbWFrZXVwX2ltYWdlLmgiCisKKyAgICB0eXBlZGVmIHZvaWQqICAgICAgICAgICAgICAgICAgICBUU0hhbmRsZTsKKworICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICogRlVOQ1RJT04gICA6IHRzX2RldGVjdGZhY2VfY3JlYXRlX2NvbnRleHQKKyAgICAgKgorICAgICAqIERFU0NSSVBUSU9OOiBjcmVhdGUgY29udGV4dC5UaGUgbWV0aG9kIE1VU1QgY2FsbCBhdCBmaXJzdCB0aW1lLgorICAgICAqCisgICAgICoKKyAgICAgKiBSRVRVUk4gICAgOiBUU0hhbmRsZSBhcyB0aGUgY29udGV4dCBoYW5kbGUKKyAgICAgKgorICAgICAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworICAgIFRTSGFuZGxlIHRzX2RldGVjdGZhY2VfY3JlYXRlX2NvbnRleHQoKTsKKworCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBGVU5DVElPTiAgIDogdHNfZGV0ZWN0ZmFjZV9kZXN0cm95X2NvbnRleHQKKyAgICAgKgorICAgICAqIERFU0NSSVBUSU9OOiBkZXN0cm95IGNvbnRleHQuIFRoZSBtZXRob2QgTVVTVCBjYWxsIGF0IGxhc3QgdGltZS4KKyAgICAgKiBCZWZvcmUgeW91IE1VU1QgY2FsbCB0c19kZXRlY3RmYWNlX2NyZWF0ZV9jb250ZXh0IG1ldGhvZAorICAgICAqIHRvIGNyZWF0ZSBjb250ZXh0IGFuZCBnZXQgY29udGV4dCBoYW5kbGUuCisgICAgICoKKyAgICAgKiBQQVJBTUVURVJTIDoKKyAgICAgKiAgIEBwYXJhbVtpbl0gY29udGV4VFNIYW5kbGUgOiBUaGUgY29udGV4dCBoYW5kbGUgcG9pbnRlci4KKyAgICAgKgorICAgICAqCisgICAgICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisgICAgdm9pZCB0c19kZXRlY3RmYWNlX2Rlc3Ryb3lfY29udGV4dChUU0hhbmRsZSogY29udGV4VFNIYW5kbGUpOworCisKKyAgICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqIEZVTkNUSU9OICAgOiB0c19kZXRlY3RmYWNlX2RldGVjdAorICAgICAqCisgICAgICogREVTQ1JJUFRJT046IHN0YXJ0IGRldGVjdC5CZWZvcmUgeW91IE1VU1QgY2FsbCB0c19kZXRlY3RmYWNlX2NyZWF0ZV9jb250ZXh0IG1ldGhvZAorICAgICAqIHRvIGNyZWF0ZSBjb250ZXh0IGFuZCBnZXQgY29udGV4dCBoYW5kbGUuCisgICAgICoKKyAgICAgKiBQQVJBTUVURVJTIDoKKyAgICAgKiAgIEBwYXJhbVtpbl0gY29udGV4VFNIYW5kbGUgOiBUaGUgY29udGV4dCBoYW5kbGUuCisgICAgICogICBAcGFyYW1baW5dIHBJbkRhdGEgOiBUaGUgVFNNYWtldXBEYXRhIHBvaW50ZXIuTVVTVCBub3QgTlVMTC4KKyAgICAgKgorICAgICAqIFJFVFVSTiAgICA6IGludCBJZiBsZXNzIHRoYW4gemVybyBmYWlsZWQsIG90aGVyd2lzZSB0aGUgbnVtYmVyIG9mIHRoZSBkZXRlY3RlZCBmYWNlcy4KKyAgICAgKgorICAgICAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworICAgIGludCB0c19kZXRlY3RmYWNlX2RldGVjdChUU0hhbmRsZSBjb250ZXhUU0hhbmRsZSwgVFNNYWtldXBEYXRhICpwSW5EYXRhKTsKKworICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICogRlVOQ1RJT04gICA6IHRzX2RldGVjdGZhY2VfZGV0ZWN0RXgKKyAgICAgKgorICAgICAqIERFU0NSSVBUSU9OOiBzdGFydCBkZXRlY3QuQmVmb3JlIHlvdSBNVVNUIGNhbGwgdHNfZGV0ZWN0ZmFjZV9jcmVhdGVfY29udGV4dCBtZXRob2QKKyAgICAgKiB0byBjcmVhdGUgY29udGV4dCBhbmQgZ2V0IGNvbnRleHQgaGFuZGxlLgorICAgICAqCisgICAgICogUEFSQU1FVEVSUyA6CisgICAgICogICBAcGFyYW1baW5dIGNvbnRleFRTSGFuZGxlIDogVGhlIGNvbnRleHQgaGFuZGxlLgorICAgICAqICAgQHBhcmFtW2luXSBwSW5EYXRhIDogVGhlIFRTTWFrZXVwRGF0YUV4IHBvaW50ZXIuTVVTVCBub3QgTlVMTC4KKyAgICAgKgorICAgICAqIFJFVFVSTiAgICA6IGludCBJZiBsZXNzIHRoYW4gemVybyBmYWlsZWQsIG90aGVyd2lzZSB0aGUgbnVtYmVyIG9mIHRoZSBkZXRlY3RlZCBmYWNlcy4KKyAgICAgKgorICAgICAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworICAgIGludCB0c19kZXRlY3RmYWNlX2RldGVjdEV4KFRTSGFuZGxlIGNvbnRleFRTSGFuZGxlLCBUU01ha2V1cERhdGFFeCAqcEluRGF0YSk7CisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKiBGVU5DVElPTiAgIDogdHNfZGV0ZWN0ZmFjZV9nZXRfZmFjZV9pbmZvCisgICAgICoKKyAgICAgKiBERVNDUklQVElPTjogZ2V0IGRldGVjdGVkIGZhY2UgaW5mb3JtYXRpb24uQmVmb3JlIHlvdSBNVVNUIGNhbGwgdHNfZGV0ZWN0ZmFjZV9kZXRlY3QgbWV0aG9kCisgICAgICogdG8gZGV0ZWN0IGZhY2UuCisgICAgICoKKyAgICAgKiBQQVJBTUVURVJTIDoKKyAgICAgKiAgIEBwYXJhbVtpbl0gY29udGV4VFNIYW5kbGUgOiBUaGUgY29udGV4dCBoYW5kbGUuCisgICAgICogICBAcGFyYW1baW5dIGluZGV4IDogVGhlIGZhY2UgaW5kZXguTVVTVCA+IDAuCisgICAgICogICBAcGFyYW1bb3V0XSBwRmFjZVJlY3QgOiBUaGUgZmFjZSByZWN0cy5NVVNUIG5vdCBOVUxMLgorICAgICAqICAgQHBhcmFtW291dF0gbGVmdEV5ZSA6IFRoZSBsZWZ0IGV5ZSByZWN0LgorICAgICAqICAgQHBhcmFtW291dF0gcmlnaHRFeWUgOiBUaGUgcmlnaHQgZXllIHJlY3QuCisgICAgICogICBAcGFyYW1bb3V0XSBwTW91dGggOiBUaGUgbW91bnQgcmVjdC4KKyAgICAgKgorICAgICAqIFJFVFVSTiAgICA6IFRTX09LIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWlsZWQuCisgICAgICoKKyAgICAgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgICBpbnQgdHNfZGV0ZWN0ZmFjZV9nZXRfZmFjZV9pbmZvKFRTSGFuZGxlIGNvbnRleFRTSGFuZGxlLCBpbnQgaW5kZXgsIFRTUmVjdCAqcEZhY2VSZWN0LCBUU1JlY3QgKmxlZnRFeWUsIFRTUmVjdCAqcmlnaHRFeWUsIFRTUmVjdCAqcE1vdXRoKTsKKworI2VuZGlmIC8vIF9fVFNfREVURUNURkFDRV9FTkdJTkVfSF9fCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFML3RzTWFrZXVwbGliL2luY2x1ZGUvdHNfbWFrZXVwX2RhdGEuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvdHNNYWtldXBsaWIvaW5jbHVkZS90c19tYWtldXBfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDM3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML3RzTWFrZXVwbGliL2luY2x1ZGUvdHNfbWFrZXVwX2RhdGEuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LDIwMTUgVGh1bmRlcnNvZnQgQ29ycG9yYXRpb24KKyAqIEFsbCByaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1RTX01BS0VVUF9EQVRBX0hfXworI2RlZmluZSBfX1RTX01BS0VVUF9EQVRBX0hfXworCisgICAgI2RlZmluZSBUU19PSyAgICAgICAgICAgICAgICAoMHgwMDAwMDAwMCkgICAgLy9TdWNjZXNzZnVsCisgICAgI2RlZmluZSBUU19FUlJPUl9QQVJBTSAgICAgICAoMHgwMDAwMDAwMSkgICAgLy9QYXJhbWV0ZXJzIGVycm9yCisgICAgI2RlZmluZSBUU19FUlJPUl9JTyAgICAgICAgICAoMHgwMDAwMDAwMikgICAgLy9JbnB1dCBvciBvdXRwdXQgZXJyb3IKKyAgICAjZGVmaW5lIFRTX0VSUk9SX0lOVEVSTkFMICAgICgweDAwMDAwMDAzKSAgICAvL0ludGVybmFsIGVycm9yCisgICAgI2RlZmluZSBUU19OT19NRU1PUlkgICAgICAgICAoMHgwMDAwMDAwNCkgICAgLy9ObyBtZW1vcnkgZXJyb3IKKworCisgICAgLyoKKyAgICAgKiBEYXRhIHN0cnVjdCA6IHJlY3RhbmdsZQorICAgICAqLworICAgIHR5cGVkZWYgc3RydWN0IF9fdGFnX3RzcmVjdAorICAgIHsKKyAgICAgICAgbG9uZyBsZWZ0OworICAgICAgICBsb25nIHRvcDsKKyAgICAgICAgbG9uZyByaWdodDsKKyAgICAgICAgbG9uZyBib3R0b207CisgICAgfSBUU1JlY3Q7CisKKyAgICAvKgorICAgICAqIERhdGEgc3RydWN0IDogcG9pbnQKKyAgICAgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCBfX3RhZ190c21ha2V1cHBvaW50CisgICAgeworICAgICAgICBsb25nIHg7CisgICAgICAgIGxvbmcgeTsKKyAgICB9IFRTUG9pbnQ7CisKKworI2VuZGlmIC8vIF9fVFNfTUFLRVVQX0RBVEFfSF9fCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFML3RzTWFrZXVwbGliL2luY2x1ZGUvdHNfbWFrZXVwX2VuZ2luZS5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC90c01ha2V1cGxpYi9pbmNsdWRlL3RzX21ha2V1cF9lbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzUxMzBkCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC90c01ha2V1cGxpYi9pbmNsdWRlL3RzX21ha2V1cF9lbmdpbmUuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LDIwMTUgVGh1bmRlcnNvZnQgQ29ycG9yYXRpb24KKyAqIEFsbCByaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1RTX01BS0VVUF9FTkdJTklfSF9fCisjZGVmaW5lIF9fVFNfTUFLRVVQX0VOR0lOSV9IX18KKyNpbmNsdWRlICJ0c19tYWtldXBfZGF0YS5oIgorI2luY2x1ZGUgInRzX21ha2V1cF9pbWFnZS5oIgorCisKKyAgICAvKgorICAgICAqIEZVTkNUSU9OICAgOiB0c19tYWtldXBfZ2V0X3N1cHBvcnRlZF9mYWNlX251bQorICAgICAqCisgICAgICogREVTQ1JJUFRJT046IGdldCBzdXBwb3J0ZWQgZmFjZSBudW1iZXIKKyAgICAgKgorICAgICAqIFJFVFVSTiAgICA6IFRoZSBzdXBwb3J0ZWQgZmFjZSBudW1iZXIKKyAgICAgKgorICAgICAqLworICAgIGludCB0c19tYWtldXBfZ2V0X3N1cHBvcnRlZF9mYWNlX251bSgpOworCisKKyAgICAvKgorICAgICAqIEZVTkNUSU9OICAgOiB0c19tYWtldXBfc2tpbl9iZWF1dHkKKyAgICAgKgorICAgICAqIERFU0NSSVBUSU9OOiBza2luIGJlYXV0eSBtZXRob2QuCisgICAgICoKKyAgICAgKiBQQVJBTUVURVJTIDoKKyAgICAgKiAgIEBwYXJhbVtpbl0gcEluRGF0YSA6IFRoZSBUU01ha2V1cERhdGEgcG9pbnRlci5NVVNUIG5vdCBOVUxMLgorICAgICAqICAgQHBhcmFtW291dF0gcE91dERhdGEgOiBUaGUgVFNNYWtldXBEYXRhIHBvaW50ZXIuTVVTVCBub3QgTlVMTC4KKyAgICAgKiAgIEBwYXJhbVtpbl0gcEZhY2VSZWN0IDogVGhlIGZhY2UgcmVjdC5NVVNUIG5vdCBOVUxMLgorICAgICAqICAgQHBhcmFtW2luXSBjbGVhbkxldmVsIDogU2tpbiBjbGVhbiBsZXZlbCwgdmFsdWUgcmFuZ2UgWzAsMTAwXS4KKyAgICAgKiAgIEBwYXJhbVtpbl0gd2hpdGVMZXZlbCA6IFNraW4gd2hpdGUgbGV2ZWwsIHZhbHVlIHJhbmdlIFswLDEwMF0uCisgICAgICogUkVUVVJOICAgIDogVFNfT0sgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWxlZC4KKyAgICAgKgorICAgICAqLworICAgIGludCB0c19tYWtldXBfc2tpbl9iZWF1dHkoVFNNYWtldXBEYXRhICpwSW5EYXRhLCBUU01ha2V1cERhdGEgKnBPdXREYXRhLCBjb25zdCBUU1JlY3QgKnBGYWNlUmVjdCwgaW50IGNsZWFuTGV2ZWwsaW50IHdoaXRlTGV2ZWwpOworICAgIC8qCisgICAgICogRlVOQ1RJT04gICA6IHRzX21ha2V1cF9za2luX2JlYXV0eUV4CisgICAgICoKKyAgICAgKiBERVNDUklQVElPTjogc2tpbiBiZWF1dHkgbWV0aG9kLgorICAgICAqCisgICAgICogUEFSQU1FVEVSUyA6CisgICAgICogICBAcGFyYW1baW5dIHBJbkRhdGEgOiBUaGUgVFNNYWtldXBEYXRhRXggcG9pbnRlci5NVVNUIG5vdCBOVUxMLgorICAgICAqICAgQHBhcmFtW291dF0gcE91dERhdGEgOiBUaGUgVFNNYWtldXBEYXRhRXggcG9pbnRlci5NVVNUIG5vdCBOVUxMLgorICAgICAqICAgQHBhcmFtW2luXSBwRmFjZVJlY3QgOiBUaGUgZmFjZSByZWN0Lk1VU1Qgbm90IE5VTEwuCisgICAgICogICBAcGFyYW1baW5dIGNsZWFuTGV2ZWwgOiBTa2luIGNsZWFuIGxldmVsLCB2YWx1ZSByYW5nZSBbMCwxMDBdLgorICAgICAqICAgQHBhcmFtW2luXSB3aGl0ZUxldmVsIDogU2tpbiB3aGl0ZSBsZXZlbCwgdmFsdWUgcmFuZ2UgWzAsMTAwXS4KKyAgICAgKiBSRVRVUk4gICAgOiBUU19PSyBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZmFpbGVkLgorICAgICAqCisgICAgICovCisgICAgaW50IHRzX21ha2V1cF9za2luX2JlYXV0eUV4KFRTTWFrZXVwRGF0YUV4ICpwSW5EYXRhLCBUU01ha2V1cERhdGFFeCAqcE91dERhdGEsIGNvbnN0IFRTUmVjdCAqcEZhY2VSZWN0LCBpbnQgY2xlYW5MZXZlbCwgaW50IHdoaXRlTGV2ZWwpOworICAgIC8qCisgICAgICogRlVOQ1RJT04gICA6IHRzX21ha2V1cF9maW5pc2gKKyAgICAgKgorICAgICAqIERFU0NSSVBUSU9OOiBGaW5pc2ggbWFrZXVwLGNhbGwgdGhpcyBtZXRob2QgYXQgbGFzdCB0aW1lLgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgY2FsbGVkIEFmdGVyIHRzX21ha2V1cF9za2luX2NsZWFuIGFuZCB0c19tYWtldXBfc2tpbl93aGl0ZW4KKyAgICAgKgorICAgICAqLworICAgIHZvaWQgdHNfbWFrZXVwX2ZpbmlzaCgpOworCisKKyAgICAvKgorICAgICAqIEZVTkNUSU9OICAgOiB0c19tYWtldXBfd2FycF9mYWNlCisgICAgICoKKyAgICAgKiBERVNDUklQVElPTjogZG8gd2FycCBmYWNlLgorICAgICAqCisgICAgICogUEFSQU1FVEVSUyA6CisgICAgICogICBAcGFyYW1baW5dIHBJbkRhdGEgOiBUaGUgVFNNYWtldXBEYXRhIHBvaW50ZXIuTVVTVCBub3QgTlVMTC4KKyAgICAgKiAgIEBwYXJhbVtvdXRdIHBPdXREYXRhIDogVGhlIFRTTWFrZXVwRGF0YSBwb2ludGVyLk1VU1Qgbm90IE5VTEwuCisgICAgICogICBAcGFyYW1baW5dIHBMZWZ0RXllIDogVGhlIGxlZnQgZXllIHJlY3QgcG9pbnRlci5NVVNUIG5vdCBOVUxMLgorICAgICAqICAgQHBhcmFtW2luXSBwUmlnaHRFeWUgOiBUaGUgcmlnaHQgZXllIHJlY3QgcG9pbnRlci5NVVNUIG5vdCBOVUxMLgorICAgICAqICAgQHBhcmFtW2luXSBwTW91dGggOiBUaGUgbW91dGggcmVjdCBwb2ludGVyLk1VU1Qgbm90IE5VTEwuCisgICAgICogICBAcGFyYW1baW5dIGJpZ0V5ZUxldmVsIDogVGhlIGJpZyBleWUgbGV2ZWwsIHZhbHVlIHJhbmdlIFswLDEwMF0uCisgICAgICogICBAcGFyYW1baW5dIHRyaW1GYWNlTGV2ZWwgOiBUaGUgdHJpbSBmYWNlIGxldmVsLCB2YWx1ZSByYW5nZSBbMCwxMDBdLgorICAgICAqCisgICAgICogUkVUVVJOICAgIDogVFNfT0sgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGZhaWxlZC4KKyAgICAgKgorICAgICAqLworICAgIGludCB0c19tYWtldXBfd2FycF9mYWNlKFRTTWFrZXVwRGF0YSAqcEluRGF0YSwgVFNNYWtldXBEYXRhICpwT3V0RGF0YSwKKyAgICAgICAgICAgIGNvbnN0IFRTUmVjdCAqcExlZnRFeWUsIGNvbnN0IFRTUmVjdCAqcFJpZ2h0RXllLCBjb25zdCBUU1JlY3QgKnBNb3V0aCwgaW50IGJpZ0V5ZUxldmVsLCBpbnQgdHJpbUZhY2VMZXZlbCk7CisKKyNlbmRpZiAvLyBfX1RTX01BS0VVUF9FTkdJTklfSF9fCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFML3RzTWFrZXVwbGliL2luY2x1ZGUvdHNfbWFrZXVwX2ltYWdlLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML3RzTWFrZXVwbGliL2luY2x1ZGUvdHNfbWFrZXVwX2ltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyMWQzZgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwvdHNNYWtldXBsaWIvaW5jbHVkZS90c19tYWtldXBfaW1hZ2UuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LDIwMTUgVGh1bmRlcnNvZnQgQ29ycG9yYXRpb24KKyAqIEFsbCByaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1RTX01BS0VVUF9JTUdBR0VfSF9fCisjZGVmaW5lIF9fVFNfTUFLRVVQX0lNR0FHRV9IX18KKworICAgIC8qCisgICAgICogRGF0YSBzdHJ1Y3QgOiBUU01ha2V1cERhdGEKKyAgICAgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCAgX190YWdfdHNtYWtldXBkYXRhCisgICAgeworICAgICAgICBpbnQgZnJhbWVXaWR0aDsgICAgICAgICAgICAgICAgIC8vTlYyMSBGcmFtZSB3aWR0aC5NVVNUID4gMC4KKyAgICAgICAgaW50IGZyYW1lSGVpZ2h0OyAgICAgICAgICAgICAgICAvL05WMjEgRnJhbWUgaGVpZ2h0LiBNVVNUID4gMC4KKyAgICAgICAgdW5zaWduZWQgY2hhciAqeUJ1ZjsgICAgICAgICAgICAvL05WMjEgWSBidWZmZXIgcG9pbnRlci5NVVNUIG5vdCBudWxsLgorICAgICAgICB1bnNpZ25lZCBjaGFyICp1dkJ1ZjsgICAgICAgICAgIC8vTlYyMSBVViBidWZmZXIgcG9pbnRlci5NVVNUIG5vdCBudWxsLgorICAgIH1UU01ha2V1cERhdGE7CisKKyAgICAgLyoKKyAgICAgKiBEYXRhIHN0cnVjdCA6IFRTTWFrZXVwRGF0YUV4CisgICAgICovCisgICAgdHlwZWRlZiBzdHJ1Y3QgIF9fdGFnX3RzbWFrZXVwZGF0YUV4CisgICAgeworICAgICAgICBpbnQgZnJhbWVXaWR0aDsgICAgICAgICAgICAgICAgIC8vTlYyMSBGcmFtZSB3aWR0aC5NVVNUID4gMC4KKyAgICAgICAgaW50IGZyYW1lSGVpZ2h0OyAgICAgICAgICAgICAgICAvL05WMjEgRnJhbWUgaGVpZ2h0LiBNVVNUID4gMC4KKyAgICAgICAgdW5zaWduZWQgY2hhciAqeUJ1ZjsgICAgICAgICAgICAvL05WMjEgWSBidWZmZXIgcG9pbnRlci5NVVNUIG5vdCBudWxsLgorICAgICAgICB1bnNpZ25lZCBjaGFyICp1dkJ1ZjsgICAgICAgICAgIC8vTlYyMSBVViBidWZmZXIgcG9pbnRlci5NVVNUIG5vdCBudWxsLgorICAgICAgICBpbnQgeVN0cmlkZTsgICAgICAgICAgICAgICAgICAgIC8vTlYyMSBZIGJ1ZmZlciBzdHJpZGUgbGVuCisgICAgICAgIGludCB1dlN0cmlkZTsgICAgICAgICAgICAgICAgICAgLy9OVjIxIHV2IGJ1ZmZlciBzdHJpZGUgbGVuCisgICAgfVRTTWFrZXVwRGF0YUV4OworCisKKyNlbmRpZiAvLyBfX1RTX01BS0VVUF9JTUdBR0VfSF9fCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFML3dyYXBwZXIvUXVhbGNvbW1DYW1lcmEuY3BwIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC93cmFwcGVyL1F1YWxjb21tQ2FtZXJhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTY0Y2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC93cmFwcGVyL1F1YWxjb21tQ2FtZXJhLmNwcApAQCAtMCwwICsxLDQ1MCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTQsIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjZGVmaW5lIEFMT0dfTklERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlF1YWxjb21tQ2FtZXJhIgorCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK2V4dGVybiAiQyIgeworI2RlZmluZSBUSU1FX0ggPFNZU1RFTV9IRUFERVJfUFJFRklYL3RpbWUuaD4KKyNpbmNsdWRlIFRJTUVfSAorfQorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiUXVhbGNvbW1DYW1lcmEuaCIKKyNpbmNsdWRlICJRQ2FtZXJhMkZhY3RvcnkuaCIKKyNpbmNsdWRlICJRQ2FtZXJhMkhXSS5oIgorCisvKiBIQUwgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gZ29lcyBoZXJlKi8KKworLyoqCisgKiBUaGUgZnVuY3Rpb25zIG5lZWQgdG8gYmUgcHJvdmlkZWQgYnkgdGhlIGNhbWVyYSBIQUwuCisgKgorICogSWYgZ2V0TnVtYmVyT2ZDYW1lcmFzKCkgcmV0dXJucyBOLCB0aGUgdmFsaWQgY2FtZXJhSWQgZm9yIGdldENhbWVyYUluZm8oKQorICogYW5kIG9wZW5DYW1lcmFIYXJkd2FyZSgpIGlzIDAgdG8gTi0xLgorICovCisKKworc3RhdGljIGh3X21vZHVsZV9tZXRob2RzX3QgY2FtZXJhX21vZHVsZV9tZXRob2RzID0geworICAgIG9wZW46IGNhbWVyYV9kZXZpY2Vfb3BlbiwKK307CisKK3N0YXRpYyBod19tb2R1bGVfdCBjYW1lcmFfY29tbW9uID0geworICAgIHRhZzogSEFSRFdBUkVfTU9EVUxFX1RBRywKKyAgICBtb2R1bGVfYXBpX3ZlcnNpb246IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMV8wLAorICAgIGhhbF9hcGlfdmVyc2lvbjogSEFSRFdBUkVfSEFMX0FQSV9WRVJTSU9OLAorICAgIGlkOiBDQU1FUkFfSEFSRFdBUkVfTU9EVUxFX0lELAorICAgIG5hbWU6ICJRQ2FtZXJhIE1vZHVsZSIsCisgICAgYXV0aG9yOiAiUXVpYyBvbiBiZWhhbGYgb2YgQ0FGIiwKKyAgICBtZXRob2RzOiAmY2FtZXJhX21vZHVsZV9tZXRob2RzLAorICAgIGRzbzogTlVMTCwKKyAgICByZXNlcnZlZDogIHswfSwKK307CisKK3VzaW5nIG5hbWVzcGFjZSBxY2FtZXJhOworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtZXJhX2RldmljZSBod19kZXY7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaGFyZHdhcmU7CisgICAgaW50IGNhbWVyYV9yZWxlYXNlZDsKKyAgICBpbnQgY2FtZXJhSWQ7Cit9IGNhbWVyYV9oYXJkd2FyZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNhbWVyYV9tZW1vcnlfdCBtZW07CisgIGludDMyX3QgbXNnVHlwZTsKKyAgc3A8SU1lbW9yeT4gZGF0YVB0cjsKKyAgdm9pZCogdXNlcjsKKyAgdW5zaWduZWQgaW50IGluZGV4OworfSBxX2NhbV9tZW1vcnlfdDsKKworUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqdXRpbF9nZXRfSGFsX29iaiggc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaGFyZHdhcmUgPSBOVUxMOworICAgIGlmKGRldmljZSAmJiBkZXZpY2UtPnByaXYpeworICAgICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsID0gKGNhbWVyYV9oYXJkd2FyZV90ICopZGV2aWNlLT5wcml2OworICAgICAgICBoYXJkd2FyZSA9IGNhbUhhbC0+aGFyZHdhcmU7CisgICAgfQorICAgIHJldHVybiBoYXJkd2FyZTsKK30KKworZXh0ZXJuICJDIiBpbnQgZ2V0X251bWJlcl9vZl9jYW1lcmFzKCkKK3sKKyAgICAvKiB0cnkgdG8gcXVlcnkgZXZlcnkgdGltZSB3ZSBnZXQgdGhlIGNhbGwhKi8KKworICAgIEFMT0dFKCJRJXM6IEUiKTsKKyAgICByZXR1cm4gUUNhbWVyYTJGYWN0b3J5OjpnZXRfbnVtYmVyX29mX2NhbWVyYXMoKTsKK30KKworZXh0ZXJuICJDIiBpbnQgZ2V0X2NhbWVyYV9pbmZvKGludCBjYW1lcmFfaWQsIHN0cnVjdCBjYW1lcmFfaW5mbyAqaW5mbykKK3sKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBBTE9HRSgiUSVzOiBFIik7CisKKyAgICBpZihpbmZvKSB7CisgICAgICAgIFFDYW1lcmEyRmFjdG9yeTo6Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYV9pZCwgaW5mbyk7CisgICAgfQorICAgIExPR0QoIlElczogWCIpOworICAgIHJldHVybiByYzsKK30KKworCisvKiBIQUwgc2hvdWxkIHJldHVybiBOVUxMIGlmIGl0IGZhaWxzIHRvIG9wZW4gY2FtZXJhIGhhcmR3YXJlLiAqLworZXh0ZXJuICJDIiBpbnQgIGNhbWVyYV9kZXZpY2Vfb3BlbigKKyAgY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsIGNvbnN0IGNoYXIqIGlkLAorICAgICAgICAgIHN0cnVjdCBod19kZXZpY2VfdCoqIGh3X2RldmljZSkKK3sKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBjYW1lcmFfZGV2aWNlICpkZXZpY2UgPSBOVUxMOworCisgICAgaWYobW9kdWxlICYmIGlkICYmIGh3X2RldmljZSkgeworICAgICAgICBpZiAoIXN0cmNtcChtb2R1bGUtPm5hbWUsIGNhbWVyYV9jb21tb24ubmFtZSkpIHsKKyAgICAgICAgICAgIGludCBjYW1lcmFJZCA9IGF0b2koaWQpOworCisgICAgICAgICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsID0KKyAgICAgICAgICAgICAgICAoY2FtZXJhX2hhcmR3YXJlX3QgKikgbWFsbG9jKHNpemVvZiAoY2FtZXJhX2hhcmR3YXJlX3QpKTsKKyAgICAgICAgICAgIGlmKCFjYW1IYWwpIHsKKyAgICAgICAgICAgICAgICAqaHdfZGV2aWNlID0gTlVMTDsKKyAgICAgICAgICAgICAgICBBTE9HRSgiICBlbmQgaW4gbm8gbWVtIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogd2UgaGF2ZSB0aGUgY2FtZXJhX2hhcmR3YXJlIG9iaiBtYWxsb2NlZCAqLworICAgICAgICAgICAgbWVtc2V0KGNhbUhhbCwgMCwgc2l6ZW9mIChjYW1lcmFfaGFyZHdhcmVfdCkpOworICAgICAgICAgICAgY2FtSGFsLT5oYXJkd2FyZSA9IG5ldyBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlKCh1aW50MzJfdCljYW1lcmFJZCk7CisgICAgICAgICAgICBpZiAoY2FtSGFsLT5oYXJkd2FyZSkgeworICAgICAgICAgICAgICAgIGNhbUhhbC0+Y2FtZXJhSWQgPSBjYW1lcmFJZDsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSAmY2FtSGFsLT5od19kZXY7CisgICAgICAgICAgICAgICAgZGV2aWNlLT5jb21tb24uY2xvc2UgPSBjbG9zZV9jYW1lcmFfZGV2aWNlOworICAgICAgICAgICAgICAgIGRldmljZS0+b3BzID0gJlFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6Om1DYW1lcmFPcHM7CisgICAgICAgICAgICAgICAgZGV2aWNlLT5wcml2ID0gKHZvaWQgKiljYW1IYWw7CisgICAgICAgICAgICAgICAgcmMgPSAgMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNhbUhhbC0+aGFyZHdhcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhbUhhbC0+aGFyZHdhcmU7CisgICAgICAgICAgICAgICAgICAgIGNhbUhhbC0+aGFyZHdhcmUgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmcmVlKGNhbUhhbCk7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gTlVMTDsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLyogcGFzcyBhY3R1YWwgaHdfZGV2aWNlIHB0ciB0byBmcmFtZXdvcmsuIFRoaXMgYW1rZXMgdGhhdCB3ZSBhY3RhbGx5IGJlIHVzZSBtZW1iZXJvZigpIG1hY3JvICovCisgICAgKmh3X2RldmljZSA9IChod19kZXZpY2VfdCopJmRldmljZS0+Y29tbW9uOworCitFWElUOgorCisgICAgQUxPR0UoIiAgZW5kIHJjICVkIiwgIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2V4dGVybiAiQyIgIGludCBjbG9zZV9jYW1lcmFfZGV2aWNlKCBod19kZXZpY2VfdCAqaHdfZGV2KQoreworICAgIEFMT0dFKCJRJXM6IGRldmljZSA9JXAgRSIsICBod19kZXYpOworICAgIGludCByYyA9ICAtMTsKKyAgICBjYW1lcmFfZGV2aWNlX3QgKmRldmljZSA9IChjYW1lcmFfZGV2aWNlX3QgKilod19kZXY7CisKKyAgICBpZihkZXZpY2UpIHsKKyAgICAgICAgY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbCA9IChjYW1lcmFfaGFyZHdhcmVfdCAqKWRldmljZS0+cHJpdjsKKyAgICAgICAgaWYoY2FtSGFsICkgeworICAgICAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaGFyZHdhcmUgPSB1dGlsX2dldF9IYWxfb2JqKCBkZXZpY2UpOworICAgICAgICAgICAgaWYoIWNhbUhhbC0+Y2FtZXJhX3JlbGVhc2VkKSB7CisgICAgICAgICAgICAgICAgaWYoaGFyZHdhcmUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZS0+cmVsZWFzZShkZXZpY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGhhcmR3YXJlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgZGVsZXRlIGhhcmR3YXJlOworICAgICAgICAgICAgZnJlZShjYW1IYWwpOworICAgICAgICB9CisgICAgICAgIHJjID0gMDsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisKK2ludCBzZXRfcHJldmlld193aW5kb3coc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UsCisgICAgICAgIHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKndpbmRvdykKK3sKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpoYXJkd2FyZSA9IHV0aWxfZ2V0X0hhbF9vYmooZGV2aWNlKTsKKworICAgIGlmKGhhcmR3YXJlICE9IE5VTEwpIHsKKyAgICAgICAgcmMgPSBoYXJkd2FyZS0+c2V0X3ByZXZpZXdfd2luZG93KGRldmljZSwgd2luZG93KTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIHNldF9DYWxsQmFja3Moc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UsCisgICAgICAgIGNhbWVyYV9ub3RpZnlfY2FsbGJhY2sgbm90aWZ5X2NiLAorICAgICAgICBjYW1lcmFfZGF0YV9jYWxsYmFjayBkYXRhX2NiLAorICAgICAgICBjYW1lcmFfZGF0YV90aW1lc3RhbXBfY2FsbGJhY2sgZGF0YV9jYl90aW1lc3RhbXAsCisgICAgICAgIGNhbWVyYV9yZXF1ZXN0X21lbW9yeSBnZXRfbWVtb3J5LAorICAgICAgICB2b2lkICp1c2VyKQoreworICAgIEFMT0dFKCJRJXM6IEUiKTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpoYXJkd2FyZSA9IHV0aWxfZ2V0X0hhbF9vYmooZGV2aWNlKTsKKyAgICBpZihoYXJkd2FyZSAhPSBOVUxMKXsKKyAgICAgICAgaGFyZHdhcmUtPnNldF9DYWxsQmFja3MoZGV2aWNlLCBub3RpZnlfY2IsZGF0YV9jYiwgZGF0YV9jYl90aW1lc3RhbXAsIGdldF9tZW1vcnksIHVzZXIpOworICAgIH0KK30KKwordm9pZCBlbmFibGVfbXNnX3R5cGUoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UsIGludDMyX3QgbXNnX3R5cGUpCit7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaGFyZHdhcmUgPSB1dGlsX2dldF9IYWxfb2JqKGRldmljZSk7CisgICAgaWYoaGFyZHdhcmUgIT0gTlVMTCl7CisgICAgICAgIGhhcmR3YXJlLT5lbmFibGVfbXNnX3R5cGUoZGV2aWNlLCBtc2dfdHlwZSk7CisgICAgfQorfQorCit2b2lkIGRpc2FibGVfbXNnX3R5cGUoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UsIGludDMyX3QgbXNnX3R5cGUpCit7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaGFyZHdhcmUgPSB1dGlsX2dldF9IYWxfb2JqKGRldmljZSk7CisgICAgQUxPR0UoIlElczogRSIpOworICAgIGlmKGhhcmR3YXJlICE9IE5VTEwpeworICAgICAgICBoYXJkd2FyZS0+ZGlzYWJsZV9tc2dfdHlwZShkZXZpY2UsIG1zZ190eXBlKTsKKyAgICB9Cit9CisKK2ludCBtc2dfdHlwZV9lbmFibGVkKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlLCBpbnQzMl90IG1zZ190eXBlKQoreworICAgIEFMT0dFKCJRJXM6IEUiKTsKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpoYXJkd2FyZSA9IHV0aWxfZ2V0X0hhbF9vYmooZGV2aWNlKTsKKyAgICBpZihoYXJkd2FyZSAhPSBOVUxMKXsKKyAgICAgICAgcmMgPSBoYXJkd2FyZS0+bXNnX3R5cGVfZW5hYmxlZChkZXZpY2UsIG1zZ190eXBlKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgc3RhcnRfcHJldmlldyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSkKK3sKKyAgICBBTE9HRSgiUSVzOiBFIik7CisgICAgaW50IHJjID0gLTE7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaGFyZHdhcmUgPSB1dGlsX2dldF9IYWxfb2JqKGRldmljZSk7CisgICAgaWYoaGFyZHdhcmUgIT0gTlVMTCl7CisgICAgICAgIHJjID0gaGFyZHdhcmUtPnN0YXJ0X3ByZXZpZXcoZGV2aWNlKTsKKyAgICB9CisgICAgQUxPR0UoIlElczogWCIpOworICAgIHJldHVybiByYzsKK30KKwordm9pZCBzdG9wX3ByZXZpZXcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisgICAgQUxPR0UoIlElczogRSIpOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmhhcmR3YXJlID0gdXRpbF9nZXRfSGFsX29iaihkZXZpY2UpOworICAgIGlmKGhhcmR3YXJlICE9IE5VTEwpeworICAgICAgICBoYXJkd2FyZS0+c3RvcF9wcmV2aWV3KGRldmljZSk7CisgICAgfQorfQorCitpbnQgcHJldmlld19lbmFibGVkKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIEFMT0dFKCJRJXM6IEUiKTsKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpoYXJkd2FyZSA9IHV0aWxfZ2V0X0hhbF9vYmooZGV2aWNlKTsKKyAgICBpZihoYXJkd2FyZSAhPSBOVUxMKXsKKyAgICAgICAgcmMgPSBoYXJkd2FyZS0+cHJldmlld19lbmFibGVkKGRldmljZSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworaW50IHN0b3JlX21ldGFfZGF0YV9pbl9idWZmZXJzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlLCBpbnQgZW5hYmxlKQoreworICAgIEFMT0dFKCJRJXM6IEUiKTsKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpoYXJkd2FyZSA9IHV0aWxfZ2V0X0hhbF9vYmooZGV2aWNlKTsKKyAgICBpZihoYXJkd2FyZSAhPSBOVUxMKXsKKyAgICAgIHJjID0gaGFyZHdhcmUtPnN0b3JlX21ldGFfZGF0YV9pbl9idWZmZXJzKGRldmljZSwgZW5hYmxlKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgc3RhcnRfcmVjb3JkaW5nKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIEFMT0dFKCJRJXM6IEUiKTsKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpoYXJkd2FyZSA9IHV0aWxfZ2V0X0hhbF9vYmooZGV2aWNlKTsKKyAgICBpZihoYXJkd2FyZSAhPSBOVUxMKXsKKyAgICAgICAgcmMgPSBoYXJkd2FyZS0+c3RhcnRfcmVjb3JkaW5nKGRldmljZSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKwordm9pZCBzdG9wX3JlY29yZGluZyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSkKK3sKKyAgICBBTE9HRSgiUSVzOiBFIik7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaGFyZHdhcmUgPSB1dGlsX2dldF9IYWxfb2JqKGRldmljZSk7CisgICAgaWYoaGFyZHdhcmUgIT0gTlVMTCl7CisgICAgICAgIGhhcmR3YXJlLT5zdG9wX3JlY29yZGluZyhkZXZpY2UpOworICAgIH0KK30KKworaW50IHJlY29yZGluZ19lbmFibGVkKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIEFMT0dFKCJRJXM6IEUiKTsKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpoYXJkd2FyZSA9IHV0aWxfZ2V0X0hhbF9vYmooZGV2aWNlKTsKKyAgICBpZihoYXJkd2FyZSAhPSBOVUxMKXsKKyAgICAgICAgcmMgPSBoYXJkd2FyZS0+cmVjb3JkaW5nX2VuYWJsZWQoZGV2aWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIHJlbGVhc2VfcmVjb3JkaW5nX2ZyYW1lKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBMT0dEKCJRJXM6IEUiKTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpoYXJkd2FyZSA9IHV0aWxfZ2V0X0hhbF9vYmooZGV2aWNlKTsKKyAgICBpZihoYXJkd2FyZSAhPSBOVUxMKXsKKyAgICAgICAgaGFyZHdhcmUtPnJlbGVhc2VfcmVjb3JkaW5nX2ZyYW1lKGRldmljZSwgb3BhcXVlKTsKKyAgICB9Cit9CisKK2ludCBhdXRvX2ZvY3VzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIEFMT0dFKCJRJXM6IEUiKTsKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpoYXJkd2FyZSA9IHV0aWxfZ2V0X0hhbF9vYmooZGV2aWNlKTsKKyAgICBpZihoYXJkd2FyZSAhPSBOVUxMKXsKKyAgICAgICAgcmMgPSBoYXJkd2FyZS0+YXV0b19mb2N1cyhkZXZpY2UpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBjYW5jZWxfYXV0b19mb2N1cyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSkKK3sKKyAgICBBTE9HRSgiUSVzOiBFIik7CisgICAgaW50IHJjID0gLTE7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaGFyZHdhcmUgPSB1dGlsX2dldF9IYWxfb2JqKGRldmljZSk7CisgICAgaWYoaGFyZHdhcmUgIT0gTlVMTCl7CisgICAgICAgIHJjID0gaGFyZHdhcmUtPmNhbmNlbF9hdXRvX2ZvY3VzKGRldmljZSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworaW50IHRha2VfcGljdHVyZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSkKK3sKKyAgICBBTE9HRSgiUSVzOiBFIik7CisgICAgaW50IHJjID0gLTE7CisgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaGFyZHdhcmUgPSB1dGlsX2dldF9IYWxfb2JqKGRldmljZSk7CisgICAgaWYoaGFyZHdhcmUgIT0gTlVMTCl7CisgICAgICAgIHJjID0gaGFyZHdhcmUtPnRha2VfcGljdHVyZShkZXZpY2UpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBjYW5jZWxfcGljdHVyZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSkKKworeworICAgIEFMT0dFKCJRJXM6IEUiKTsKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpoYXJkd2FyZSA9IHV0aWxfZ2V0X0hhbF9vYmooZGV2aWNlKTsKKyAgICBpZihoYXJkd2FyZSAhPSBOVUxMKXsKKyAgICAgICAgcmMgPSBoYXJkd2FyZS0+Y2FuY2VsX3BpY3R1cmUoZGV2aWNlKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgc2V0X3BhcmFtZXRlcnMoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UsIGNvbnN0IGNoYXIgKnBhcm1zKQorCit7CisgICAgQUxPR0UoIlElczogRSIpOworICAgIGludCByYyA9IC0xOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmhhcmR3YXJlID0gdXRpbF9nZXRfSGFsX29iaihkZXZpY2UpOworICAgIGlmKGhhcmR3YXJlICE9IE5VTEwgJiYgcGFybXMpeworICAgICAgICByYyA9IGhhcmR3YXJlLT5zZXRfcGFyYW1ldGVycyhkZXZpY2UsIHBhcm1zKTsKKyAgfQorICByZXR1cm4gcmM7Cit9CisKK2NoYXIqIGdldF9wYXJhbWV0ZXJzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIEFMT0dFKCJRJXM6IEUiKTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpoYXJkd2FyZSA9IHV0aWxfZ2V0X0hhbF9vYmooZGV2aWNlKTsKKyAgICBpZihoYXJkd2FyZSAhPSBOVUxMKXsKKyAgICAgICAgY2hhciAqcGFybXMgPSBOVUxMOworICAgICAgICBwYXJtcyA9IGhhcmR3YXJlLT5nZXRfcGFyYW1ldGVycyhkZXZpY2UpOworICAgICAgICByZXR1cm4gcGFybXM7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIHB1dF9wYXJhbWV0ZXJzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlLCBjaGFyICpwYXJtKQorCit7CisgICAgQUxPR0UoIlElczogRSIpOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmhhcmR3YXJlID0gdXRpbF9nZXRfSGFsX29iaihkZXZpY2UpOworICAgIGlmKGhhcmR3YXJlICE9IE5VTEwpeworICAgICAgaGFyZHdhcmUtPnB1dF9wYXJhbWV0ZXJzKGRldmljZSwgcGFybSk7CisgICAgfQorfQorCitpbnQgc2VuZF9jb21tYW5kKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlLAorICAgICAgICAgICAgaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKQoreworICAgIEFMT0dFKCJRJXM6IEUiKTsKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpoYXJkd2FyZSA9IHV0aWxfZ2V0X0hhbF9vYmooZGV2aWNlKTsKKyAgICBpZihoYXJkd2FyZSAhPSBOVUxMKXsKKyAgICAgICAgcmMgPSBoYXJkd2FyZS0+c2VuZF9jb21tYW5kKGRldmljZSwgY21kLCBhcmcxLCBhcmcyKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIHJlbGVhc2Uoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisgICAgQUxPR0UoIlElczogRSIpOworICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UgKmhhcmR3YXJlID0gdXRpbF9nZXRfSGFsX29iaihkZXZpY2UpOworICAgIGlmKGhhcmR3YXJlICE9IE5VTEwpeworICAgICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsID0gKGNhbWVyYV9oYXJkd2FyZV90ICopZGV2aWNlLT5wcml2OworICAgICAgICBoYXJkd2FyZS0+cmVsZWFzZShkZXZpY2UpOworICAgICAgICBjYW1IYWwtPmNhbWVyYV9yZWxlYXNlZCA9IHRydWU7CisgICAgfQorfQorCitpbnQgZHVtcChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSwgaW50IGZkKQoreworICAgIEFMT0dFKCJRJXM6IEUiKTsKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpoYXJkd2FyZSA9IHV0aWxfZ2V0X0hhbF9vYmooZGV2aWNlKTsKKyAgICBpZihoYXJkd2FyZSAhPSBOVUxMKXsKKyAgICAgICAgcmMgPSBoYXJkd2FyZS0+ZHVtcChkZXZpY2UsIGZkKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC93cmFwcGVyL1F1YWxjb21tQ2FtZXJhLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFML3dyYXBwZXIvUXVhbGNvbW1DYW1lcmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2FhM2NhCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTC93cmFwcGVyL1F1YWxjb21tQ2FtZXJhLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEzLCAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1FVQUxDT01NX0NBTUVSQV9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUVVBTENPTU1fQ0FNRVJBX0gKKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIlFDYW1lcmEySFdJLmgiCisKK2V4dGVybiAiQyIgeworCisgIGludCBnZXRfbnVtYmVyX29mX2NhbWVyYXMoKTsKKyAgaW50IGdldF9jYW1lcmFfaW5mbyhpbnQgY2FtZXJhX2lkLCBzdHJ1Y3QgY2FtZXJhX2luZm8gKmluZm8pOworCisgIGludCBjYW1lcmFfZGV2aWNlX29wZW4oY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsIGNvbnN0IGNoYXIqIGlkLAorICAgICAgICAgIHN0cnVjdCBod19kZXZpY2VfdCoqIGRldmljZSk7CisKKyAgaHdfZGV2aWNlX3QgKiBvcGVuX2NhbWVyYV9kZXZpY2UoaW50IGNhbWVyYUlkKTsKKworICBpbnQgY2xvc2VfY2FtZXJhX2RldmljZSggaHdfZGV2aWNlX3QgKik7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKyAgaW50IHNldF9wcmV2aWV3X3dpbmRvdyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLAorICAgICAgICAgIHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKndpbmRvdyk7CisgIHZvaWQgc2V0X0NhbGxCYWNrcyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLAorICAgICAgICAgIGNhbWVyYV9ub3RpZnlfY2FsbGJhY2sgbm90aWZ5X2NiLAorICAgICAgICAgIGNhbWVyYV9kYXRhX2NhbGxiYWNrIGRhdGFfY2IsCisgICAgICAgICAgY2FtZXJhX2RhdGFfdGltZXN0YW1wX2NhbGxiYWNrIGRhdGFfY2JfdGltZXN0YW1wLAorICAgICAgICAgIGNhbWVyYV9yZXF1ZXN0X21lbW9yeSBnZXRfbWVtb3J5LAorICAgICAgICAgIHZvaWQgKnVzZXIpOworCisgIHZvaWQgZW5hYmxlX21zZ190eXBlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICosIGludDMyX3QgbXNnX3R5cGUpOworCisgIHZvaWQgZGlzYWJsZV9tc2dfdHlwZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBpbnQzMl90IG1zZ190eXBlKTsKKyAgaW50IG1zZ190eXBlX2VuYWJsZWQoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiwgaW50MzJfdCBtc2dfdHlwZSk7CisKKyAgaW50IHN0YXJ0X3ByZXZpZXcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisKKyAgdm9pZCBzdG9wX3ByZXZpZXcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisKKyAgaW50IHByZXZpZXdfZW5hYmxlZChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKyAgaW50IHN0b3JlX21ldGFfZGF0YV9pbl9idWZmZXJzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICosIGludCBlbmFibGUpOworCisgIGludCBzdGFydF9yZWNvcmRpbmcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisKKyAgdm9pZCBzdG9wX3JlY29yZGluZyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKworICBpbnQgcmVjb3JkaW5nX2VuYWJsZWQoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisKKyAgdm9pZCByZWxlYXNlX3JlY29yZGluZ19mcmFtZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLAorICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqb3BhcXVlKTsKKworICBpbnQgYXV0b19mb2N1cyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKworICBpbnQgY2FuY2VsX2F1dG9fZm9jdXMoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisKKyAgaW50IHRha2VfcGljdHVyZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKworICBpbnQgY2FuY2VsX3BpY3R1cmUoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisKKyAgaW50IHNldF9wYXJhbWV0ZXJzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICosIGNvbnN0IGNoYXIgKnBhcm1zKTsKKworICBjaGFyKiBnZXRfcGFyYW1ldGVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKworICB2b2lkIHB1dF9wYXJhbWV0ZXJzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICosIGNoYXIgKik7CisKKyAgaW50IHNlbmRfY29tbWFuZChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLAorICAgICAgICAgICAgICBpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpOworCisgIHZvaWQgcmVsZWFzZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKworICBpbnQgZHVtcChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBpbnQgZmQpOworCisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworfSAvL2V4dGVybiAiQyIKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzQ2hhbm5lbC5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM0NoYW5uZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTcyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM0NoYW5uZWwuY3BwCkBAIC0wLDAgKzEsNDc4MyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorKiBtZXQ6CisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisjZGVmaW5lIExPR19UQUcgIlFDYW1lcmEzQ2hhbm5lbCIKKworLy8gVG8gcmVtb3ZlCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJoYXJkd2FyZS9ncmFsbG9jLmgiCisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJRQ2FtZXJhM0NoYW5uZWwuaCIKKyNpbmNsdWRlICJRQ2FtZXJhM0hXSS5oIgorI2luY2x1ZGUgIlFDYW1lcmFUcmFjZS5oIgorI2luY2x1ZGUgIlFDYW1lcmFGb3JtYXQuaCIKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKK30KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKyNkZWZpbmUgSVNfQlVGRkVSX0VSUk9SKHgpICgoKHgpICYgVjRMMl9CVUZfRkxBR19FUlJPUikgPT0gVjRMMl9CVUZfRkxBR19FUlJPUikKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhM0NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogY29uc3RyY3V0b3Igb2YgUUNhbWVyYTNDaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1faGFuZGxlIDogY2FtZXJhIGhhbmRsZQorICogICBAY2FtX29wcyAgICA6IHB0ciB0byBjYW1lcmEgb3BzIHRhYmxlCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNDaGFubmVsOjpRQ2FtZXJhM0NoYW5uZWwodWludDMyX3QgY2FtX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jYl9yb3V0aW5lIGNiX3JvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwgdWludDMyX3QgbnVtQnVmZmVycykKK3sKKyAgICBtX2NhbUhhbmRsZSA9IGNhbV9oYW5kbGU7CisgICAgbV9oYW5kbGUgPSBjaGFubmVsX2hhbmRsZTsKKyAgICBtX2NhbU9wcyA9IGNhbV9vcHM7CisgICAgbV9iSXNBY3RpdmUgPSBmYWxzZTsKKworICAgIG1fbnVtU3RyZWFtcyA9IDA7CisgICAgbWVtc2V0KG1TdHJlYW1zLCAwLCBzaXplb2YobVN0cmVhbXMpKTsKKyAgICBtVXNlckRhdGEgPSB1c2VyRGF0YTsKKworICAgIG1TdHJlYW1JbmZvQnVmID0gTlVMTDsKKyAgICBtQ2hhbm5lbENCID0gY2Jfcm91dGluZTsKKyAgICBtUGFkZGluZ0luZm8gPSAqcGFkZGluZ0luZm87CisgICAgbVBhZGRpbmdJbmZvLm9mZnNldF9pbmZvLm9mZnNldF94ID0gMDsKKyAgICBtUGFkZGluZ0luZm8ub2Zmc2V0X2luZm8ub2Zmc2V0X3kgPSAwOworCisgICAgbVBvc3RQcm9jTWFzayA9IHBvc3Rwcm9jZXNzX21hc2s7CisKKyAgICBtSXNUeXBlID0gSVNfVFlQRV9OT05FOworICAgIG1OdW1CdWZmZXJzID0gbnVtQnVmZmVyczsKKyAgICBtUGVyRnJhbWVNYXBVbm1hcEVuYWJsZSA9IHRydWU7CisgICAgbUR1bXBGcm1DbnQgPSAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhM0NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogZGVzdHJ1Y3RvciBvZiBRQ2FtZXJhM0NoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEzQ2hhbm5lbDo6flFDYW1lcmEzQ2hhbm5lbCgpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGVzdHJveQorICoKKyAqIERFU0NSSVBUSU9OOiBpbnRlcm5hbCBkZXN0cnVjdG9yIG9mIFFDYW1lcmEzQ2hhbm5lbCBjYWxsZWQgYnkgdGhlIHN1YmNsYXNzZXMKKyAqICAgICAgICAgICAgICB0aGlzIGRlc3RydWN0b3Igd2lsbCBjYWxsIHB1cmUgdmlydHVhbCBmdW5jdGlvbnMuICBzdG9wIHdpbGwgZXZlbnR1YWxsIGNhbGwKKyAqICAgICAgICAgICAgICBRQ2FtZXJhM1N0cmVhbTo6cHV0QnVmcy4gIFRoZSBwdXRCdWZzIGZ1bmN0aW9uIHdpbGwKKyAqICAgICAgICAgICAgICBjYWxsIFFDYW1lcmEzQ2hhbm5lbDo6cHV0U3RyZWFtQnVmcyB3aGljaCBpcyBwdXJlIHZpcnR1YWwKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNDaGFubmVsOjpkZXN0cm95KCkKK3sKKyAgICBpZiAobV9iSXNBY3RpdmUpCisgICAgICAgIHN0b3AoKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX251bVN0cmVhbXM7IGkrKykgeworICAgICAgICBpZiAobVN0cmVhbXNbaV0gIT0gTlVMTCkgeworICAgICAgICAgICAgZGVsZXRlIG1TdHJlYW1zW2ldOworICAgICAgICAgICAgbVN0cmVhbXNbaV0gPSAwOworICAgICAgICB9CisgICAgfQorICAgIG1fbnVtU3RyZWFtcyA9IDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWRkU3RyZWFtCisgKgorICogREVTQ1JJUFRJT046IGFkZCBhIHN0cmVhbSBpbnRvIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN0cmVhbVR5cGUgICAgIDogc3RyZWFtIHR5cGUKKyAqICAgQHN0cmVhbUZvcm1hdCAgIDogc3RyZWFtIGZvcm1hdAorICogICBAc3RyZWFtRGltICAgICAgOiBzdHJlYW0gZGltZW5zaW9uCisgKiAgIEBzdHJlYW1Sb3RhdGlvbiA6IHJvdGF0aW9uIG9mIHRoZSBzdHJlYW0KKyAqICAgQG1pblN0cmVhbUJ1Zk51bSA6IG1pbmltYWwgYnVmZmVyIGNvdW50IGZvciBwYXJ0aWN1bGFyIHN0cmVhbSB0eXBlCisgKiAgIEBwb3N0cHJvY2Vzc01hc2sgOiBwb3N0LXByb2NjZXNzIGZlYXR1cmUgbWFzaworICogICBAaXNUeXBlICAgICAgICAgOiB0eXBlIG9mIGltYWdlIHN0YWJpbGl6YXRpb24gcmVxdWlyZWQgb24gdGhlIHN0cmVhbQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNDaGFubmVsOjphZGRTdHJlYW0oY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZm9ybWF0X3Qgc3RyZWFtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCBzdHJlYW1EaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3JvdGF0aW9uX3Qgc3RyZWFtUm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtaW5TdHJlYW1CdWZOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IHBvc3Rwcm9jZXNzTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1faXNfdHlwZV90IGlzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiYXRjaFNpemUpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKG1fbnVtU3RyZWFtcyA+PSAxKSB7CisgICAgICAgIExPR0UoIk9ubHkgb25lIHN0cmVhbSBwZXIgY2hhbm5lbCBzdXBwb3J0ZWQgaW4gdjMgSGFsIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1fbnVtU3RyZWFtcyA+PSBNQVhfU1RSRUFNX05VTV9JTl9CVU5ETEUpIHsKKyAgICAgICAgTE9HRSgic3RyZWFtIG51bWJlciAoJWQpIGV4Y2VlZHMgbWF4IGxpbWl0ICglZCkiLAorICAgICAgICAgICAgICAgbV9udW1TdHJlYW1zLCBNQVhfU1RSRUFNX05VTV9JTl9CVU5ETEUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBRQ2FtZXJhM1N0cmVhbSAqcFN0cmVhbSA9IG5ldyBRQ2FtZXJhM1N0cmVhbShtX2NhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY2FtT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVBhZGRpbmdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICBpZiAocFN0cmVhbSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5vIG1lbSBmb3IgU3RyZWFtIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIExPR0QoImJhdGNoIHNpemUgaXMgJWQiLCBiYXRjaFNpemUpOworCisgICAgcmMgPSBwU3RyZWFtLT5pbml0KHN0cmVhbVR5cGUsIHN0cmVhbUZvcm1hdCwgc3RyZWFtRGltLCBzdHJlYW1Sb3RhdGlvbiwKKyAgICAgICAgICAgIE5VTEwsIG1pblN0cmVhbUJ1Zk51bSwgcG9zdHByb2Nlc3NNYXNrLCBpc1R5cGUsIGJhdGNoU2l6ZSwKKyAgICAgICAgICAgIHN0cmVhbUNiUm91dGluZSwgdGhpcyk7CisgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgbVN0cmVhbXNbbV9udW1TdHJlYW1zXSA9IHBTdHJlYW07CisgICAgICAgIG1fbnVtU3RyZWFtcysrOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlbGV0ZSBwU3RyZWFtOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RhcnQKKyAqCisgKiBERVNDUklQVElPTjogc3RhcnQgY2hhbm5lbCwgd2hpY2ggd2lsbCBzdGFydCBhbGwgc3RyZWFtcyBiZWxvbmcgdG8gdGhpcyBjaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM0NoYW5uZWw6OnN0YXJ0KCkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIGlmIChtX251bVN0cmVhbXMgPiAxKSB7CisgICAgICAgIExPR1coImJ1bmRsZSBub3Qgc3VwcG9ydGVkIik7CisgICAgfSBlbHNlIGlmIChtX251bVN0cmVhbXMgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZihtX2JJc0FjdGl2ZSkgeworICAgICAgICBMT0dXKCJBdHRlbXB0IHRvIHN0YXJ0IGFjdGl2ZSBjaGFubmVsIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9udW1TdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1TdHJlYW1zW2ldLT5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgbV9iSXNBY3RpdmUgPSB0cnVlOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0b3AKKyAqCisgKiBERVNDUklQVElPTjogc3RvcCBhIGNoYW5uZWwsIHdoaWNoIHdpbGwgc3RvcCBhbGwgc3RyZWFtcyBiZWxvbmcgdG8gdGhpcyBjaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzQ2hhbm5lbDo6c3RvcCgpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgaWYoIW1fYklzQWN0aXZlKSB7CisgICAgICAgIExPR0UoIkF0dGVtcHQgdG8gc3RvcCBpbmFjdGl2ZSBjaGFubmVsIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9udW1TdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKG1TdHJlYW1zW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1TdHJlYW1zW2ldLT5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2JJc0FjdGl2ZSA9IGZhbHNlOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRCYXRjaFNpemUKKyAqCisgKiBERVNDUklQVElPTjogU2V0IGJhdGNoIHNpemUgZm9yIHRoZSBjaGFubmVsLiBUaGlzIGlzIGEgZHVtbXkgaW1wbGVtZW50YXRpb24KKyAqICAgICAgICAgICAgICBmb3IgdGhlIGJhc2UgY2xhc3MKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJhdGNoU2l6ZSAgOiBOdW1iZXIgb2YgaW1hZ2UgYnVmZmVycyBpbiBhIGJhdGNoCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcyBhbHdheXMKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNDaGFubmVsOjpzZXRCYXRjaFNpemUodWludDMyX3QgYmF0Y2hTaXplKQoreworICAgIExPR0QoIkR1bW15IG1ldGhvZC4gYmF0Y2hTaXplOiAlZCB1bnVzZWQgIiwgYmF0Y2hTaXplKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcXVldWVCYXRjaEJ1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGlzIGEgZHVtbXkgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBiYXNlIGNsYXNzCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcyBhbHdheXMKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNDaGFubmVsOjpxdWV1ZUJhdGNoQnVmKCkKK3sKKyAgICBMT0dEKCJEdW1teSBtZXRob2QuIFVudXNlZCAiKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0UGVyRnJhbWVNYXBVbm1hcAorICoKKyAqIERFU0NSSVBUSU9OOiBTZXRzIGludGVybmFsIGVuYWJsZSBmbGFnCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgQGVuYWJsZSA6IEJvb2wgdmFsdWUgZm9yIHRoZSBlbmFibGUgZmxhZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MgYWx3YXlzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzQ2hhbm5lbDo6c2V0UGVyRnJhbWVNYXBVbm1hcChib29sIGVuYWJsZSkKK3sKKyAgICBtUGVyRnJhbWVNYXBVbm1hcEVuYWJsZSA9IGVuYWJsZTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZmx1c2gKKyAqCisgKiBERVNDUklQVElPTjogZmx1c2ggYSBjaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzQ2hhbm5lbDo6Zmx1c2goKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGJ1ZkRvbmUKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIGEgc3RyZWFtIGJ1ZiBiYWNrIHRvIGtlcm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVjdmRfZnJhbWUgIDogc3RyZWFtIGJ1ZiBmcmFtZSB0byBiZSByZXR1cm5lZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNDaGFubmVsOjpidWZEb25lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVjdmRfZnJhbWUpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCByZWN2ZF9mcmFtZS0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICAgaWYgKHJlY3ZkX2ZyYW1lLT5idWZzW2ldICE9IE5VTEwpIHsKKyAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbV9udW1TdHJlYW1zOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgaWYgKG1TdHJlYW1zW2pdICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW2pdLT5nZXRNeUhhbmRsZSgpID09IHJlY3ZkX2ZyYW1lLT5idWZzW2ldLT5zdHJlYW1faWQpIHsKKyAgICAgICAgICAgICAgICAgICAgIHJjID0gbVN0cmVhbXNbal0tPmJ1ZkRvbmUocmVjdmRfZnJhbWUtPmJ1ZnNbaV0tPmJ1Zl9pZHgpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGJyZWFrIGxvb3AgagorICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworaW50MzJfdCBRQ2FtZXJhM0NoYW5uZWw6OnNldEJ1bmRsZUluZm8oY29uc3QgY2FtX2J1bmRsZV9jb25maWdfdCAmYnVuZGxlSW5mbykKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90IHBhcmFtOworICAgIG1lbXNldCgmcGFyYW0sIDAsIHNpemVvZihjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QpKTsKKyAgICBwYXJhbS50eXBlID0gQ0FNX1NUUkVBTV9QQVJBTV9UWVBFX1NFVF9CVU5ETEVfSU5GTzsKKyAgICBwYXJhbS5idW5kbGVJbmZvID0gYnVuZGxlSW5mbzsKKyAgICByYyA9IG1TdHJlYW1zWzBdLT5zZXRQYXJhbWV0ZXIocGFyYW0pOworICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJzdHJlYW0gc2V0UGFyYW1ldGVyIGZvciBzZXQgYnVuZGxlIGZhaWxlZCIpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRTdHJlYW1UeXBlTWFzaworICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgYml0IG1hc2sgb2YgYWxsIHN0cmVhbSB0eXBlcyBpbiB0aGlzIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBCaXQgbWFzayBvZiBhbGwgc3RyZWFtIHR5cGVzIGluIHRoaXMgY2hhbm5lbAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50MzJfdCBRQ2FtZXJhM0NoYW5uZWw6OmdldFN0cmVhbVR5cGVNYXNrKCkKK3sKKyAgICB1aW50MzJfdCBtYXNrID0gMDsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9udW1TdHJlYW1zOyBpKyspIHsKKyAgICAgICBtYXNrIHw9ICgxVSA8PCBtU3RyZWFtc1tpXS0+Z2V0TXlUeXBlKCkpOworICAgIH0KKyAgICByZXR1cm4gbWFzazsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRTdHJlYW1JRAorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgU3RyZWFtSUQgb2YgcmVxdWVzdGVkIHN0cmVhbSB0eXBlCisgKgorICogUEFSQU1FVEVSUyA6IHN0cmVhbU1hc2sKKyAqCisgKiBSRVRVUk4gICAgIDogU3RyZWFtIElECisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQzMl90IFFDYW1lcmEzQ2hhbm5lbDo6Z2V0U3RyZWFtSUQodWludDMyX3Qgc3RyZWFtTWFzaykKK3sKKyAgICB1aW50MzJfdCBzdHJlYW1JRCA9IDA7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbnVtU3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChzdHJlYW1NYXNrID09ICh1aW50MzJfdCApKDB4MSA8PCBtU3RyZWFtc1tpXS0+Z2V0TXlUeXBlKCkpKSB7CisgICAgICAgICAgICBzdHJlYW1JRCA9IG1TdHJlYW1zW2ldLT5nZXRNeVNlcnZlcklEKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RyZWFtSUQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0U3RyZWFtQnlIYW5kbGUKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIHN0cmVhbSBvYmplY3QgYnkgc3RyZWFtIGhhbmRsZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3RyZWFtSGFuZGxlIDogc3RyZWFtIGhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdHJlYW0gb2JqZWN0LiBOVUxMIGlmIG5vdCBmb3VuZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhM1N0cmVhbSAqUUNhbWVyYTNDaGFubmVsOjpnZXRTdHJlYW1CeUhhbmRsZSh1aW50MzJfdCBzdHJlYW1IYW5kbGUpCit7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbnVtU3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChtU3RyZWFtc1tpXSAhPSBOVUxMICYmIG1TdHJlYW1zW2ldLT5nZXRNeUhhbmRsZSgpID09IHN0cmVhbUhhbmRsZSkgeworICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW1zW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFN0cmVhbUJ5SW5kZXgKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIHN0cmVhbSBvYmplY3QgYnkgaW5kZXgKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN0cmVhbUhhbmRsZSA6IHN0cmVhbSBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogc3RyZWFtIG9iamVjdC4gTlVMTCBpZiBub3QgZm91bmQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNTdHJlYW0gKlFDYW1lcmEzQ2hhbm5lbDo6Z2V0U3RyZWFtQnlJbmRleCh1aW50MzJfdCBpbmRleCkKK3sKKyAgICBpZiAoaW5kZXggPCBtX251bVN0cmVhbXMpIHsKKyAgICAgICAgcmV0dXJuIG1TdHJlYW1zW2luZGV4XTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RyZWFtQ2JSb3V0aW5lCisgKgorICogREVTQ1JJUFRJT046IGNhbGxiYWNrIHJvdXRpbmUgZm9yIHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3RyZWFtSGFuZGxlIDogc3RyZWFtIGhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiBzdHJlYW0gb2JqZWN0LiBOVUxMIGlmIG5vdCBmb3VuZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzQ2hhbm5lbDo6c3RyZWFtQ2JSb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3VwZXJfZnJhbWUsCisgICAgICAgICAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSwgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgUUNhbWVyYTNDaGFubmVsICpjaGFubmVsID0gKFFDYW1lcmEzQ2hhbm5lbCAqKXVzZXJkYXRhOworICAgIGlmIChjaGFubmVsID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiaW52YWxpZCBjaGFubmVsIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjaGFubmVsLT5zdHJlYW1DYlJvdXRpbmUoc3VwZXJfZnJhbWUsIHN0cmVhbSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZHVtcFlVVgorICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byBkdW1wIHRoZSBZVVYgZGF0YSBmcm9tIElTUC9wcHJvYworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZnJhbWUgICA6IGZyYW1lIHRvIGJlIGR1bXBlZAorICogICBAZGltICAgICA6IGRpbWVuc2lvbiBvZiB0aGUgc3RyZWFtCisgKiAgIEBvZmZzZXQgIDogb2Zmc2V0IG9mIHRoZSBkYXRhCisgKiAgIEBuYW1lICAgIDogMSBpZiBpdCBpcyBJU1Agb3V0cHV0L3Bwcm9jIGlucHV0LCAyIGlmIGl0IGlzIHBwcm9jIG91dHB1dAorICoKKyAqIFJFVFVSTiAgOgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzQ2hhbm5lbDo6ZHVtcFlVVihtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZSwgY2FtX2RpbWVuc2lvbl90IGRpbSwKKyAgICAgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCBvZmZzZXQsIHVpbnQ4X3QgZHVtcF90eXBlKQoreworICAgIGNoYXIgYnVmW0ZJTEVOQU1FX01BWF07CisgICAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworICAgIHN0YXRpYyBpbnQgY291bnRlciA9IDA7CisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5kdW1waW1nIiwgcHJvcCwgIjAiKTsKKyAgICBtWVVWRHVtcCA9ICh1aW50MzJfdClhdG9pKHByb3ApOworICAgIGlmIChtWVVWRHVtcCAmIGR1bXBfdHlwZSkgeworICAgICAgICBtRnJtTnVtID0gKChtWVVWRHVtcCAmIDB4ZmZmZjAwMDApID4+IDE2KTsKKyAgICAgICAgaWYgKG1Gcm1OdW0gPT0gMCkgeworICAgICAgICAgICAgbUZybU51bSA9IDEwOworICAgICAgICB9CisgICAgICAgIGlmIChtRnJtTnVtID4gMjU2KSB7CisgICAgICAgICAgICBtRnJtTnVtID0gMjU2OworICAgICAgICB9CisgICAgICAgIG1Ta2lwTW9kZSA9ICgobVlVVkR1bXAgJiAweDAwMDBmZjAwKSA+PiA4KTsKKyAgICAgICAgaWYgKG1Ta2lwTW9kZSA9PSAwKSB7CisgICAgICAgICAgICBtU2tpcE1vZGUgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChtRHVtcFNraXBDbnQgPT0gMCkgeworICAgICAgICAgICAgbUR1bXBTa2lwQ250ID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUR1bXBTa2lwQ250ICUgbVNraXBNb2RlID09IDApIHsKKyAgICAgICAgICAgIGlmIChtRHVtcEZybUNudCA8PSBtRnJtTnVtKSB7CisgICAgICAgICAgICAgICAgLyogTm90ZSB0aGF0IHRoZSBpbWFnZSBkaW1lbnNpb24gd2lsbCBiZSB0aGUgdW5yb3RhdGVkIHN0cmVhbSBkaW1lbnNpb24uCisgICAgICAgICAgICAgICAgKiBJZiB5b3UgZmVlbCB0aGF0IHRoZSBpbWFnZSB3b3VsZCBoYXZlIGJlZW4gcm90YXRlZCBkdXJpbmcgcmVwcm9jZXNzCisgICAgICAgICAgICAgICAgKiB0aGVuIHN3YXAgdGhlIGRpbWVuc2lvbnMgd2hpbGUgb3BlbmluZyB0aGUgZmlsZQorICAgICAgICAgICAgICAgICogKi8KKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGR1bXBfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFFDQU1FUkFfRFVNUF9GUk1fUFJFVklFVzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFFDQU1FUkFfRFVNUF9GUk1fTE9DQVRJT04icF8lZF8lZF8lZHglZC55dXYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIsIGZyYW1lLT5mcmFtZV9pZHgsIGRpbS53aWR0aCwgZGltLmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFFDQU1FUkFfRFVNUF9GUk1fVklERU86CisgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBRQ0FNRVJBX0RVTVBfRlJNX0xPQ0FUSU9OInZfJWRfJWRfJWR4JWQueXV2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyLCBmcmFtZS0+ZnJhbWVfaWR4LCBkaW0ud2lkdGgsIGRpbS5oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBRQ0FNRVJBX0RVTVBfRlJNX1NOQVBTSE9UOgorICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgUUNBTUVSQV9EVU1QX0ZSTV9MT0NBVElPTiJzXyVkXyVkXyVkeCVkLnl1diIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlciwgZnJhbWUtPmZyYW1lX2lkeCwgZGltLndpZHRoLCBkaW0uaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9EVU1QX0ZSTV9JTlBVVF9SRVBST0NFU1M6CisgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBRQ0FNRVJBX0RVTVBfRlJNX0xPQ0FUSU9OImlyXyVkXyVkXyVkeCVkLnl1diIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlciwgZnJhbWUtPmZyYW1lX2lkeCwgZGltLndpZHRoLCBkaW0uaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgUUNBTUVSQV9EVU1QX0ZSTV9DQUxMQkFDSzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIFFDQU1FUkFfRFVNUF9GUk1fTE9DQVRJT04iY18lZF8lZF8lZHglZC55dXYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXIsIGZyYW1lLT5mcmFtZV9pZHgsIGRpbS53aWR0aCwgZGltLmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImR1bXBpbmcgbm90IGVuYWJsZWQgZm9yIHN0cmVhbSB0eXBlICVkIixkdW1wX3R5cGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICAgICAgICAgIGludCBmaWxlX2ZkID0gb3BlbihidWYsIE9fUkRXUiB8IE9fQ1JFQVQsIDA3NzcpOworICAgICAgICAgICAgICAgIHNzaXplX3Qgd3JpdHRlbl9sZW4gPSAwOworICAgICAgICAgICAgICAgIGlmIChmaWxlX2ZkID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGZjaG1vZChmaWxlX2ZkLCBTX0lSVVNSIHwgU19JV1VTUiB8IFNfSVJHUlAgfCBTX0lST1RIKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG9mZnNldC5udW1fcGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4ID0gb2Zmc2V0Lm1wW2ldLm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IG9mZnNldC5tcFtpLTFdLmxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgb2Zmc2V0Lm1wW2ldLmhlaWdodDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICh2b2lkICopKCh1aW50OF90ICopZnJhbWUtPmJ1ZmZlciArIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuX2xlbiArPSB3cml0ZShmaWxlX2ZkLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdClvZmZzZXQubXBbaV0ud2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9ICh1aW50MzJfdClvZmZzZXQubXBbaV0uc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExPR0goIndyaXR0ZW4gbnVtYmVyIG9mIGJ5dGVzICVsZFxuIiwgd3JpdHRlbl9sZW4pOworICAgICAgICAgICAgICAgICAgICBtRHVtcEZybUNudCsrOworICAgICAgICAgICAgICAgICAgICBjbG9zZShmaWxlX2ZkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJmYWlsZWQgdG8gb3BlbiBmaWxlIHRvIGR1bXAgaW1hZ2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRHVtcFNraXBDbnQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc1VCV0NFbmFibGVkCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIHRvIGdldCBVQldDIGhhcmR3YXJlIHN1cHBvcnQuCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogVFJVRSAtLSBVQldDIGZvcm1hdCBzdXBwb3J0ZWQKKyAqICAgICAgICAgICAgICBGQUxTRSAtLSBVQldDIGlzIG5vdCBzdXBwb3J0ZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTNDaGFubmVsOjppc1VCV0NFbmFibGVkKCkKK3sKKyNpZmRlZiBVQldDX1BSRVNFTlQKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaW50IHByb3BfdmFsdWUgPSAwOworICAgIG1lbXNldCh2YWx1ZSwgMCwgc2l6ZW9mKHZhbHVlKSk7CisgICAgcHJvcGVydHlfZ2V0KCJkZWJ1Zy5ncmFsbG9jLmdmeF91YndjX2Rpc2FibGUiLCB2YWx1ZSwgIjAiKTsKKyAgICBwcm9wX3ZhbHVlID0gYXRvaSh2YWx1ZSk7CisgICAgaWYgKHByb3BfdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vRGlzYWJsZSBVQldDIGlmIEV6dHVuZSBpcyBlbmFibGVkCisgICAgLy9FelR1bmUgcHJvY2VzcyBDUFAgb3V0cHV0IGZyYW1lIGFuZCBjYW5ub3QgdW5kZXJzdGFuZCBVQldDLgorICAgIG1lbXNldCh2YWx1ZSwgMCwgc2l6ZW9mKHZhbHVlKSk7CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5lenR1bmUuZW5hYmxlIiwgdmFsdWUsICIwIik7CisgICAgcHJvcF92YWx1ZSA9IGF0b2kodmFsdWUpOworICAgIGlmIChwcm9wX3ZhbHVlKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisjZWxzZQorICAgIHJldHVybiBGQUxTRTsKKyNlbmRpZgorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFN0cmVhbURlZmF1bHRGb3JtYXQKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIGRlZmF1bHQgYnVmZmVyIGZvcm1hdCBmb3IgdGhlIHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOiB0eXBlIDogU3RyZWFtIHR5cGUKKyAqCisgKiogUkVUVVJOICAgIDogZm9ybWF0IGZvciBzdHJlYW0gdHlwZQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY2FtX2Zvcm1hdF90IFFDYW1lcmEzQ2hhbm5lbDo6Z2V0U3RyZWFtRGVmYXVsdEZvcm1hdChjYW1fc3RyZWFtX3R5cGVfdCB0eXBlKQoreworICAgIGNhbV9mb3JtYXRfdCBzdHJlYW1Gb3JtYXQ7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXOgorICAgICAgICBpZiAoaXNVQldDRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgICAgIGludCBwRm9ybWF0OworICAgICAgICAgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnByZXZpZXcudWJ3YyIsIHByb3AsICIxIik7CisgICAgICAgICAgICBwRm9ybWF0ID0gYXRvaShwcm9wKTsKKyAgICAgICAgICAgIGlmIChwRm9ybWF0ID09IDEpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1Gb3JtYXQgPSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9VQldDOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBDaGFuZ2VkIHRvIG1hY3JvIHRvIGVuc3VyZSBmb3JtYXQgc2VudCB0byBncmFsbG9jIGZvciBwcmV2aWV3CisgICAgICAgICAgICAgICAgaXMgYWxzbyBjaGFuZ2VkIGlmIHRoZSBwcmV2aWV3IGZvcm1hdCBpcyBjaGFuZ2VkIGF0IGNhbWVyYSBIQUwgKi8KKyAgICAgICAgICAgICAgICBzdHJlYW1Gb3JtYXQgPSBQUkVWSUVXX1NUUkVBTV9GT1JNQVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDaGFuZ2VkIHRvIG1hY3JvIHRvIGVuc3VyZSBmb3JtYXQgc2VudCB0byBncmFsbG9jIGZvciBwcmV2aWV3CisgICAgICAgICAgICBpcyBhbHNvIGNoYW5nZWQgaWYgdGhlIHByZXZpZXcgZm9ybWF0IGlzIGNoYW5nZWQgYXQgY2FtZXJhIEhBTCAqLworICAgICAgICAgICAgc3RyZWFtRm9ybWF0ID0gUFJFVklFV19TVFJFQU1fRk9STUFUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPOgorICAgICAgICBpZiAoaXNVQldDRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgICAgIGludCBwRm9ybWF0OworICAgICAgICAgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnZpZGVvLnVid2MiLCBwcm9wLCAiMSIpOworICAgICAgICAgICAgcEZvcm1hdCA9IGF0b2kocHJvcCk7CisgICAgICAgICAgICBpZiAocEZvcm1hdCA9PSAxKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtRm9ybWF0ID0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVUJXQzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyZWFtRm9ybWF0ID0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVkVOVVM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisjaWYgVkVOVVNfUFJFU0VOVAorICAgICAgICBzdHJlYW1Gb3JtYXQgPSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9WRU5VUzsKKyNlbHNlCisgICAgICAgIHN0cmVhbUZvcm1hdCA9IENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q6CisgICAgICAgIHN0cmVhbUZvcm1hdCA9IENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSzoKKyAgICAgICAgLyogQ2hhbmdlZCB0byBtYWNybyB0byBlbnN1cmUgZm9ybWF0IHNlbnQgdG8gZ3JhbGxvYyBmb3IgY2FsbGJhY2sKKyAgICAgICAgaXMgYWxzbyBjaGFuZ2VkIGlmIHRoZSBwcmV2aWV3IGZvcm1hdCBpcyBjaGFuZ2VkIGF0IGNhbWVyYSBIQUwgKi8KKyAgICAgICAgc3RyZWFtRm9ybWF0ID0gQ0FMTEJBQ0tfU1RSRUFNX0ZPUk1BVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUkFXOgorICAgICAgICBzdHJlYW1Gb3JtYXQgPSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX0dCUkc7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN0cmVhbUZvcm1hdCA9IENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHN0cmVhbUZvcm1hdDsKK30KKworCisvKiBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsIG1ldGhvZHMgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbV9oYW5kbGUgOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBjYW1fb3BzICAgIDogcHRyIHRvIGNhbWVyYSBvcHMgdGFibGUKKyAqICAgQGNiX3JvdXRpbmUgOiBjYWxsYmFjayByb3V0aW5lIHRvIGZyYW1lIGFnZ3JlZ2F0b3IKKyAqICAgQHBhZGRpbmdJbmZvOiBzdHJlYW0gcGFkZGluZyBpbmZvCisgKiAgIEB1c2VyRGF0YSAgIDogSFdJIGhhbmRsZQorICogICBAc3RyZWFtICAgICA6IGNhbWVyYTNfc3RyZWFtX3Qgc3RydWN0dXJlCisgKiAgIEBzdHJlYW1fdHlwZTogQ2hhbm5lbCBzdHJlYW0gdHlwZQorICogICBAcG9zdHByb2Nlc3NfbWFzazogdGhlIHBvc3Rwcm9jZXNzIG1hc2sgZm9yIHN0cmVhbXMgb2YgdGhpcyBjaGFubmVsCisgKiAgIEBtZXRhZGF0YUNoYW5uZWw6IGhhbmRsZSB0byB0aGUgbWV0YWRhdGFDaGFubmVsCisgKiAgIEBudW1CdWZmZXJzIDogbnVtYmVyIG9mIG1heCBkZXF1ZXVlZCBidWZmZXJzCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsOjpRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsKHVpbnQzMl90IGNhbV9oYW5kbGUsCisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxfaGFuZGxlLAorICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCisgICAgICAgIGNoYW5uZWxfY2Jfcm91dGluZSBjYl9yb3V0aW5lLAorICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAorICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fdCAqc3RyZWFtLAorICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IHBvc3Rwcm9jZXNzX21hc2ssCisgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqbWV0YWRhdGFDaGFubmVsLAorICAgICAgICB1aW50MzJfdCBudW1CdWZmZXJzKSA6CisgICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwoY2FtX2hhbmRsZSwgY2hhbm5lbF9oYW5kbGUsIGNhbV9vcHMsIGNiX3JvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdJbmZvLCBwb3N0cHJvY2Vzc19tYXNrLCB1c2VyRGF0YSwgbnVtQnVmZmVycyksCisgICAgICAgICAgICBtX3Bvc3Rwcm9jZXNzb3IodGhpcyksCisgICAgICAgICAgICBtRnJhbWVDb3VudCgwKSwKKyAgICAgICAgICAgIG1MYXN0RnJhbWVDb3VudCgwKSwKKyAgICAgICAgICAgIG1MYXN0RnBzVGltZSgwKSwKKyAgICAgICAgICAgIG1NZW1vcnkobnVtQnVmZmVycyksCisgICAgICAgICAgICBtQ2FtZXJhM1N0cmVhbShzdHJlYW0pLAorICAgICAgICAgICAgbU51bUJ1ZnMoQ0FNX01BWF9OVU1fQlVGU19QRVJfU1RSRUFNKSwKKyAgICAgICAgICAgIG1TdHJlYW1UeXBlKHN0cmVhbV90eXBlKSwKKyAgICAgICAgICAgIG1Qb3N0UHJvY1N0YXJ0ZWQoZmFsc2UpLAorICAgICAgICAgICAgbUlucHV0QnVmZmVyQ29uZmlnKGZhbHNlKSwKKyAgICAgICAgICAgIG1fcE1ldGFDaGFubmVsKG1ldGFkYXRhQ2hhbm5lbCksCisgICAgICAgICAgICBtTWV0YUZyYW1lKE5VTEwpLAorICAgICAgICAgICAgbU9mZmxpbmVNZW1vcnkoMCksCisgICAgICAgICAgICBtT2ZmbGluZU1ldGFNZW1vcnkobnVtQnVmZmVycyArIChNQVhfUkVQUk9DRVNTX1BJUEVMSU5FX1NUQUdFUyAtIDEpLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSkKK3sKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuZGVidWcuc2Yuc2hvd2ZwcyIsIHByb3AsICIwIik7CisgICAgbURlYnVnRlBTID0gKHVpbnQ4X3QpIGF0b2kocHJvcCk7CisKKyAgICBpbnQzMl90IHJjID0gbV9wb3N0cHJvY2Vzc29yLmluaXQoJm1NZW1vcnkpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIExPR0UoIkluaXQgUG9zdHByb2Nlc3NvciBmYWlsZWQiKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogflFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogZGVzdHJ1Y3RvciBvZiBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsOjp+UUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCgpCit7CisgICAgZGVzdHJveSgpOworCisgICAgaW50MzJfdCByYyA9IG1fcG9zdHByb2Nlc3Nvci5kZWluaXQoKTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICBMT0dFKCJEZS1pbml0IFBvc3Rwcm9jZXNzb3IgZmFpbGVkIik7CisgICAgfQorCisgICAgaWYgKDAgPCBtT2ZmbGluZU1ldGFNZW1vcnkuZ2V0Q250KCkpIHsKKyAgICAgICAgbU9mZmxpbmVNZXRhTWVtb3J5LmRlYWxsb2NhdGUoKTsKKyAgICB9CisgICAgaWYgKDAgPCBtT2ZmbGluZU1lbW9yeS5nZXRDbnQoKSkgeworICAgICAgICBtT2ZmbGluZU1lbW9yeS51bnJlZ2lzdGVyQnVmZmVycygpOworICAgIH0KKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0cmVhbUNiUm91dGluZQorICoKKyAqIERFU0NSSVBUSU9OOgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogQHN1cGVyX2ZyYW1lIDogdGhlIHN1cGVyIGZyYW1lIHdpdGggZmlsbGVkIGJ1ZmZlcgorICogQHN0cmVhbSAgICAgIDogc3RyZWFtIG9uIHdoaWNoIHRoZSBidWZmZXIgd2FzIHJlcXVlc3RlZCBhbmQgZmlsbGVkCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsOjpzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKKyAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICAgQVRSQUNFX0NBTEwoKTsKKyAgICAvL0ZJWE1FIFEgQnVmIGJhY2sgaW4gY2FzZSBvZiBlcnJvcj8KKyAgICB1aW50OF90IGZyYW1lSW5kZXg7CisgICAgYnVmZmVyX2hhbmRsZV90ICpyZXN1bHRCdWZmZXI7CisgICAgaW50MzJfdCByZXN1bHRGcmFtZU51bWJlcjsKKyAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCByZXN1bHQ7CisgICAgY2FtX2RpbWVuc2lvbl90IGRpbTsKKyAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90IG9mZnNldDsKKworICAgIG1lbXNldCgmZGltLCAwLCBzaXplb2YoZGltKSk7CisgICAgbWVtc2V0KCZvZmZzZXQsIDAsIHNpemVvZihjYW1fZnJhbWVfbGVuX29mZnNldF90KSk7CisgICAgaWYgKGNoZWNrU3RyZWFtQ2JFcnJvcnMoc3VwZXJfZnJhbWUsIHN0cmVhbSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRXJyb3Igd2l0aCB0aGUgc3RyZWFtIGNhbGxiYWNrIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmcmFtZUluZGV4ID0gKHVpbnQ4X3Qpc3VwZXJfZnJhbWUtPmJ1ZnNbMF0tPmJ1Zl9pZHg7CisgICAgaWYoZnJhbWVJbmRleCA+PSBtTnVtQnVmcykgeworICAgICAgICAgTE9HRSgiRXJyb3IsIEludmFsaWQgaW5kZXggZm9yIGJ1ZmZlciIpOworICAgICAgICAgc3RyZWFtLT5idWZEb25lKGZyYW1lSW5kZXgpOworICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtRGVidWdGUFMpIHsKKyAgICAgICAgc2hvd0RlYnVnRlBTKHN0cmVhbS0+Z2V0TXlUeXBlKCkpOworICAgIH0KKyAgICBzdHJlYW0tPmdldEZyYW1lRGltZW5zaW9uKGRpbSk7CisgICAgc3RyZWFtLT5nZXRGcmFtZU9mZnNldChvZmZzZXQpOworICAgIGlmIChzdHJlYW0tPmdldE15VHlwZSgpID09IENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKSB7CisgICAgICAgIGR1bXBZVVYoc3VwZXJfZnJhbWUtPmJ1ZnNbMF0sIGRpbSwgb2Zmc2V0LCBRQ0FNRVJBX0RVTVBfRlJNX1BSRVZJRVcpOworICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5nZXRNeVR5cGUoKSA9PSBDQU1fU1RSRUFNX1RZUEVfVklERU8pIHsKKyAgICAgICAgZHVtcFlVVihzdXBlcl9mcmFtZS0+YnVmc1swXSwgZGltLCBvZmZzZXQsIFFDQU1FUkFfRFVNUF9GUk1fVklERU8pOworICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5nZXRNeVR5cGUoKSA9PSBDQU1fU1RSRUFNX1RZUEVfQ0FMTEJBQ0spIHsKKyAgICAgICAgZHVtcFlVVihzdXBlcl9mcmFtZS0+YnVmc1swXSwgZGltLCBvZmZzZXQsIFFDQU1FUkFfRFVNUF9GUk1fQ0FMTEJBQ0spOworICAgIH0KKyAgICAvLy8vVXNlIGJlbG93IGRhdGEgdG8gaXNzdWUgZnJhbWV3b3JrIGNhbGxiYWNrCisgICAgcmVzdWx0QnVmZmVyID0gKGJ1ZmZlcl9oYW5kbGVfdCAqKW1NZW1vcnkuZ2V0QnVmZmVySGFuZGxlKGZyYW1lSW5kZXgpOworICAgIHJlc3VsdEZyYW1lTnVtYmVyID0gbU1lbW9yeS5nZXRGcmFtZU51bWJlcihmcmFtZUluZGV4KTsKKworICAgIHJlc3VsdC5zdHJlYW0gPSBtQ2FtZXJhM1N0cmVhbTsKKyAgICByZXN1bHQuYnVmZmVyID0gcmVzdWx0QnVmZmVyOworICAgIGlmIChJU19CVUZGRVJfRVJST1Ioc3VwZXJfZnJhbWUtPmJ1ZnNbMF0tPmZsYWdzKSkgeworICAgICAgICByZXN1bHQuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICBMT0dXKCJDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IgZm9yIHN0cmVhbV90eXBlOiAlZCIsCisgICAgICAgICAgICAgICAgbVN0cmVhbXNbMF0tPmdldE15VHlwZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LOworICAgIH0KKyAgICByZXN1bHQuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgIHJlc3VsdC5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgaWYobVBlckZyYW1lTWFwVW5tYXBFbmFibGUpIHsKKyAgICAgICAgaW50MzJfdCByYyA9IHN0cmVhbS0+YnVmUmVsZWFzZShmcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciAlZCByZWxlYXNpbmcgc3RyZWFtIGJ1ZmZlciAlZCIsCisgICAgICAgICAgICAgICAgICAgICByYywgZnJhbWVJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICByYyA9IG1NZW1vcnkudW5yZWdpc3RlckJ1ZmZlcihmcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciAlZCB1bnJlZ2lzdGVyaW5nIHN0cmVhbSBidWZmZXIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgcmMsIGZyYW1lSW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKDAgPD0gcmVzdWx0RnJhbWVOdW1iZXIpIHsKKyAgICAgICAgaWYgKG1DaGFubmVsQ0IpIHsKKyAgICAgICAgICAgIG1DaGFubmVsQ0IoTlVMTCwgJnJlc3VsdCwgKHVpbnQzMl90KXJlc3VsdEZyYW1lTnVtYmVyLCBmYWxzZSwgbVVzZXJEYXRhKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkJhZCBmcmFtZSBudW1iZXIiKTsKKyAgICB9CisgICAgZnJlZShzdXBlcl9mcmFtZSk7CisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHB1dFN0cmVhbUJ1ZnMKKyAqCisgKiBERVNDUklQVElPTjogcmVsZWFzZSB0aGUgYnVmZmVycyBhbGxvY2F0ZWQgdG8gdGhlIHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOiBOT05FCisgKgorICogUkVUVVJOICAgICA6IE5PTkUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1lVVkNoYW5uZWw6OnB1dFN0cmVhbUJ1ZnMoKQoreworICAgIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OnB1dFN0cmVhbUJ1ZnMoKTsKKworICAgIC8vIEZyZWUgYWxsb2NhdGVkIGhlYXAgYnVmZmVyLgorICAgIG1NZW1vcnkuZGVhbGxvY2F0ZSgpOworICAgIC8vIENsZWFyIGZyZWUgaGVhcCBidWZmZXIgbGlzdC4KKyAgICBtRnJlZUhlYXBCdWZmZXJMaXN0LmNsZWFyKCk7CisgICAgLy8gQ2xlYXIgb2ZmbGluZVBwSW5mb0xpc3QKKyAgICBtT2ZmbGluZVBwSW5mb0xpc3QuY2xlYXIoKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZXF1ZXN0CisgKgorICogREVTQ1JJUFRJT046IGhhbmRsZSB0aGUgcmVxdWVzdCAtIGVpdGhlciB3aXRoIGFuIGlucHV0IGJ1ZmZlciBvciBhIGRpcmVjdAorICogICAgICAgICAgICAgIG91dHB1dCByZXF1ZXN0CisgKgorICogUEFSQU1FVEVSUyA6CisgKiBAYnVmZmVyICAgICAgICAgIDogcG9pbnRlciB0byB0aGUgb3V0cHV0IGJ1ZmZlcgorICogQGZyYW1lTnVtYmVyICAgICA6IGZyYW1lIG51bWJlciBvZiB0aGUgcmVxdWVzdAorICogQHBJbnB1dEJ1ZmZlciAgICA6IHBvaW50ZXIgdG8gaW5wdXQgYnVmZmVyIGlmIGFuIGlucHV0IHJlcXVlc3QKKyAqIEBtZXRhZGF0YSAgICAgICAgOiBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdAorICoKKyAqIFJFVFVSTiAgICAgOiAwIG9uIGEgc3VjY2VzcyBzdGFydCBvZiBjYXB0dXJlCisgKiAgICAgICAgICAgICAgLUVJTlZBTCBvbiBpbnZhbGlkIGlucHV0CisgKiAgICAgICAgICAgICAgLUVOT0RFViBvbiBzZXJpb3VzIGVycm9yCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbDo6cmVxdWVzdChidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwKKyAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KiBwSW5wdXRCdWZmZXIsCisgICAgICAgIG1ldGFkYXRhX2J1ZmZlcl90KiBtZXRhZGF0YSkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgaW50IGluZGV4OworCisgICAgaWYgKE5VTEwgPT0gYnVmZmVyIHx8IE5VTEwgPT0gbWV0YWRhdGEpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBidWZmZXIvbWV0YWRhdGEgaW4gY2hhbm5lbCByZXF1ZXN0Iik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHBJbnB1dEJ1ZmZlcikgeworICAgICAgICAvL25lZWQgdG8gc2VuZCB0byByZXByb2Nlc3NpbmcKKyAgICAgICAgTE9HRCgiR290IGEgcmVxdWVzdCB3aXRoIGlucHV0IGJ1ZmZlciwgb3V0cHV0IHN0cmVhbVR5cGUgPSAlZCIsIG1TdHJlYW1UeXBlKTsKKyAgICAgICAgcmVwcm9jZXNzX2NvbmZpZ190IHJlcHJvY19jZmc7CisgICAgICAgIGNhbV9kaW1lbnNpb25fdCBkaW07CisgICAgICAgIG1lbXNldCgmcmVwcm9jX2NmZywgMCwgc2l6ZW9mKHJlcHJvY2Vzc19jb25maWdfdCkpOworICAgICAgICBtZW1zZXQoJmRpbSwgMCwgc2l6ZW9mKGRpbSkpOworICAgICAgICBzZXRSZXByb2NDb25maWcocmVwcm9jX2NmZywgcElucHV0QnVmZmVyLCBtZXRhZGF0YSwgbVN0cmVhbUZvcm1hdCwgZGltKTsKKyAgICAgICAgc3RhcnRQb3N0UHJvYyhyZXByb2NfY2ZnKTsKKworICAgICAgICBxY2FtZXJhX2Z3a19pbnB1dF9wcF9kYXRhX3QgKnNyY19mcmFtZSA9IE5VTEw7CisgICAgICAgIHNyY19mcmFtZSA9IChxY2FtZXJhX2Z3a19pbnB1dF9wcF9kYXRhX3QgKiljYWxsb2MoMSwKKyAgICAgICAgICAgICAgICBzaXplb2YocWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90KSk7CisgICAgICAgIGlmIChzcmNfZnJhbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBzcmMgZnJhbWUiKTsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBzZXRGd2tJbnB1dFBQRGF0YShzcmNfZnJhbWUsIHBJbnB1dEJ1ZmZlciwgJnJlcHJvY19jZmcsIG1ldGFkYXRhLCBidWZmZXIsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciAlZCB3aGlsZSBzZXR0aW5nIGZyYW1ld29yayBpbnB1dCBQUCBkYXRhIiwgcmMpOworICAgICAgICAgICAgZnJlZShzcmNfZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgICAgIExPR0goIlBvc3QtcHJvY2VzcyBzdGFydGVkIik7CisgICAgICAgIG1fcG9zdHByb2Nlc3Nvci5wcm9jZXNzRGF0YShzcmNfZnJhbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vbmVlZCB0byBmaWxsIG91dHB1dCBidWZmZXIgd2l0aCBuZXcgZGF0YSBhbmQgcmV0dXJuCisgICAgICAgIGlmKCFtX2JJc0FjdGl2ZSkgeworICAgICAgICAgICAgcmMgPSByZWdpc3RlckJ1ZmZlcihidWZmZXIsIG1Jc1R5cGUpOworICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiT24tdGhlLWZseSBidWZmZXIgcmVnaXN0cmF0aW9uIGZhaWxlZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBzdGFydCgpOworICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKQorICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIlJlcXVlc3Qgb24gYW4gZXhpc3Rpbmcgc3RyZWFtIik7CisgICAgICAgIH0KKworICAgICAgICBpbmRleCA9IG1NZW1vcnkuZ2V0TWF0Y2hCdWZJbmRleCgodm9pZCopYnVmZmVyKTsKKyAgICAgICAgaWYoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByYyA9IHJlZ2lzdGVyQnVmZmVyKGJ1ZmZlciwgbUlzVHlwZSk7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJPbi10aGUtZmx5IGJ1ZmZlciByZWdpc3RyYXRpb24gZmFpbGVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmRleCA9IG1NZW1vcnkuZ2V0TWF0Y2hCdWZJbmRleCgodm9pZCopYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJDb3VsZCBub3QgZmluZCBvYmplY3QgYW1vbmcgcmVnaXN0ZXJlZCBidWZmZXJzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJjID0gbVN0cmVhbXNbMF0tPmJ1ZkRvbmUoaW5kZXgpOworICAgICAgICBpZihyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIFEgbmV3IGJ1ZmZlciB0byBzdHJlYW0iKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgICAgICByYyA9IG1NZW1vcnkubWFya0ZyYW1lTnVtYmVyKGluZGV4LCBmcmFtZU51bWJlcik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpbml0aWFsaXplCisgKgorICogREVTQ1JJUFRJT046CisgKgorICogUEFSQU1FVEVSUyA6IGlzVHlwZSA6IHR5cGUgb2YgaW1hZ2Ugc3RhYmlsaXphdGlvbiBvbiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsOjppbml0aWFsaXplKF9fdW51c2VkIGNhbV9pc190eXBlX3QgaXNUeXBlKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICByYyA9IG1PZmZsaW5lTWV0YU1lbW9yeS5hbGxvY2F0ZUFsbChzaXplb2YobWV0YWRhdGFfYnVmZmVyX3QpKTsKKyAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUZyZWVPZmZsaW5lTWV0YUJ1ZmZlcnNMb2NrKTsKKyAgICAgICAgbUZyZWVPZmZsaW5lTWV0YUJ1ZmZlcnNMaXN0LmNsZWFyKCk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtTnVtQnVmZmVycyArIChNQVhfUkVQUk9DRVNTX1BJUEVMSU5FX1NUQUdFUyAtIDEpOworICAgICAgICAgICAgICAgIGkrKykgeworICAgICAgICAgICAgbUZyZWVPZmZsaW5lTWV0YUJ1ZmZlcnNMaXN0LnB1c2hfYmFjayhpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkNvdWxkIG5vdCBhbGxvY2F0ZSBvZmZsaW5lIG1ldGEgYnVmZmVycyBmb3IgaW5wdXQgcmVwcm9jZXNzIik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWdpc3RlckJ1ZmZlcgorICoKKyAqIERFU0NSSVBUSU9OOiByZWdpc3RlciBzdHJlYW1pbmcgYnVmZmVyIHRvIHRoZSBjaGFubmVsIG9iamVjdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAYnVmZmVyICAgICA6IGJ1ZmZlciB0byBiZSByZWdpc3RlcmVkCisgKiAgIEBpc1R5cGUgICAgIDogaW1hZ2Ugc3RhYmlsaXphdGlvbiB0eXBlIG9uIHRoZSBzdHJlYW0KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OnJlZ2lzdGVyQnVmZmVyKGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLAorICAgICAgICBjYW1faXNfdHlwZV90IGlzVHlwZSkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludCByYyA9IDA7CisgICAgbUlzVHlwZSA9IGlzVHlwZTsKKyAgICBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOworCisgICAgaWYgKCh1aW50MzJfdCltTWVtb3J5LmdldENudCgpID4gKG1OdW1CdWZzIC0gMSkpIHsKKyAgICAgICAgTE9HRSgiVHJ5aW5nIHRvIHJlZ2lzdGVyIG1vcmUgYnVmZmVycyB0aGFuIGluaXRpYWxseSByZXF1ZXN0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoMCA9PSBtX251bVN0cmVhbXMpIHsKKyAgICAgICAgcmMgPSBpbml0aWFsaXplKG1Jc1R5cGUpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkNvdWxkbid0IGluaXRpYWxpemUgY2FtZXJhIHN0cmVhbSAlZCIsIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0cmVhbVR5cGUgPSBtU3RyZWFtc1swXS0+Z2V0TXlUeXBlKCk7CisgICAgcmMgPSBtTWVtb3J5LnJlZ2lzdGVyQnVmZmVyKGJ1ZmZlciwgc3RyZWFtVHlwZSk7CisgICAgaWYgKEFMUkVBRFlfRVhJU1RTID09IHJjKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgIExPR0UoIkJ1ZmZlciAlcCBjb3VsZG4ndCBiZSByZWdpc3RlcmVkICVkIiwgYnVmZmVyLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0RndrSW5wdXRQUERhdGEKKyAqCisgKiBERVNDUklQVElPTjogZmlsbCBvdXQgdGhlIGZyYW1ld29yayBzcmMgZnJhbWUgaW5mb3JtYXRpb24gZm9yIHJlcHJvY2Vzc2luZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3JjX2ZyYW1lICAgICAgICAgOiBpbnB1dCBwcCBkYXRhIHRvIGJlIGZpbGxlZCBvdXQKKyAqICAgQHBJbnB1dEJ1ZmZlciAgICAgIDogaW5wdXQgYnVmZmVyIGZvciByZXByb2Nlc3NpbmcKKyAqICAgQHJlcHJvY19jZmcgICAgICAgIDogcG9pbnRlciB0byB0aGUgcmVwcm9jZXNzIGNvbmZpZworICogICBAbWV0YWRhdGEgICAgICAgICAgOiBwb2ludGVyIHRvIHRoZSBtZXRhZGF0YSBidWZmZXIKKyAqICAgQG91dHB1dF9idWZmZXIgICAgIDogb3V0cHV0IGJ1ZmZlciBmb3IgcmVwcm9jZXNzaW5nOyBjb3VsZCBiZSBOVUxMIGlmIG5vdAorICogICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXdvcmsgYWxsb2NhdGVkCisgKiAgIEBmcmFtZU51bWJlciAgICAgICA6IGZyYW1lIG51bWJlciBvZiB0aGUgcmVxdWVzdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbDo6c2V0RndrSW5wdXRQUERhdGEocWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICpzcmNfZnJhbWUsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpwSW5wdXRCdWZmZXIsIHJlcHJvY2Vzc19jb25maWdfdCAqcmVwcm9jX2NmZywKKyAgICAgICAgbWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhLCBidWZmZXJfaGFuZGxlX3QgKm91dHB1dF9idWZmZXIsCisgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpbnQgaW5wdXRfaW5kZXggPSBtT2ZmbGluZU1lbW9yeS5nZXRNYXRjaEJ1ZkluZGV4KCh2b2lkKilwSW5wdXRCdWZmZXItPmJ1ZmZlcik7CisgICAgaWYoaW5wdXRfaW5kZXggPCAwKSB7CisgICAgICAgIHJjID0gbU9mZmxpbmVNZW1vcnkucmVnaXN0ZXJCdWZmZXIocElucHV0QnVmZmVyLT5idWZmZXIsIG1TdHJlYW1UeXBlKTsKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICBMT0dFKCJPbi10aGUtZmx5IGlucHV0IGJ1ZmZlciByZWdpc3RyYXRpb24gZmFpbGVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgICAgICBpbnB1dF9pbmRleCA9IG1PZmZsaW5lTWVtb3J5LmdldE1hdGNoQnVmSW5kZXgoKHZvaWQqKXBJbnB1dEJ1ZmZlci0+YnVmZmVyKTsKKyAgICAgICAgaWYgKGlucHV0X2luZGV4IDwgMCkgeworICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IGZpbmQgb2JqZWN0IGFtb25nIHJlZ2lzdGVyZWQgYnVmZmVycyIpOworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfQorICAgIG1PZmZsaW5lTWVtb3J5Lm1hcmtGcmFtZU51bWJlcihpbnB1dF9pbmRleCwgZnJhbWVOdW1iZXIpOworCisgICAgc3JjX2ZyYW1lLT5zcmNfZnJhbWUgPSAqcElucHV0QnVmZmVyOworICAgIHJjID0gbU9mZmxpbmVNZW1vcnkuZ2V0QnVmRGVmKHJlcHJvY19jZmctPmlucHV0X3N0cmVhbV9wbGFuZV9pbmZvLnBsYW5lX2luZm8sCisgICAgICAgICAgICBzcmNfZnJhbWUtPmlucHV0X2J1ZmZlciwgaW5wdXRfaW5kZXgpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgZHVtcFlVVigmc3JjX2ZyYW1lLT5pbnB1dF9idWZmZXIsIHJlcHJvY19jZmctPmlucHV0X3N0cmVhbV9kaW0sCisgICAgICAgICAgICByZXByb2NfY2ZnLT5pbnB1dF9zdHJlYW1fcGxhbmVfaW5mby5wbGFuZV9pbmZvLCBRQ0FNRVJBX0RVTVBfRlJNX0lOUFVUX1JFUFJPQ0VTUyk7CisgICAgY2FtX2RpbWVuc2lvbl90IGRpbSA9IHtzaXplb2YobWV0YWRhdGFfYnVmZmVyX3QpLCAxfTsKKyAgICBjYW1fc3RyZWFtX2J1Zl9wbGFuZV9pbmZvX3QgbWV0YV9wbGFuZXM7CisgICAgcmMgPSBtbV9zdHJlYW1fY2FsY19vZmZzZXRfbWV0YWRhdGEoJmRpbSwgJm1QYWRkaW5nSW5mbywgJm1ldGFfcGxhbmVzKTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICBMT0dFKCJNZXRhZGF0YSBzdHJlYW0gcGxhbmUgaW5mbyBjYWxjdWxhdGlvbiBmYWlsZWQhIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgdWludDMyX3QgbWV0YUJ1ZklkeDsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GcmVlT2ZmbGluZU1ldGFCdWZmZXJzTG9jayk7CisgICAgICAgIGlmIChtRnJlZU9mZmxpbmVNZXRhQnVmZmVyc0xpc3QuZW1wdHkoKSkgeworICAgICAgICAgICAgTE9HRSgibUZyZWVPZmZsaW5lTWV0YUJ1ZmZlcnNMaXN0IGlzIG51bGwuIEZhdGFsIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgbWV0YUJ1ZklkeCA9ICoobUZyZWVPZmZsaW5lTWV0YUJ1ZmZlcnNMaXN0LmJlZ2luKCkpOworICAgICAgICBtRnJlZU9mZmxpbmVNZXRhQnVmZmVyc0xpc3QuZXJhc2UobUZyZWVPZmZsaW5lTWV0YUJ1ZmZlcnNMaXN0LmJlZ2luKCkpOworICAgICAgICBMT0dEKCJlcmFzaW5nICVkLCBtRnJlZU9mZmxpbmVNZXRhQnVmZmVyc0xpc3Quc2l6ZSAlZCIsIG1ldGFCdWZJZHgsCisgICAgICAgICAgICAgICAgbUZyZWVPZmZsaW5lTWV0YUJ1ZmZlcnNMaXN0LnNpemUoKSk7CisgICAgfQorCisgICAgbU9mZmxpbmVNZXRhTWVtb3J5Lm1hcmtGcmFtZU51bWJlcihtZXRhQnVmSWR4LCBmcmFtZU51bWJlcik7CisKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90IG1ldGFfYnVmOworICAgIGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3Qgb2Zmc2V0ID0gbWV0YV9wbGFuZXMucGxhbmVfaW5mbzsKKyAgICByYyA9IG1PZmZsaW5lTWV0YU1lbW9yeS5nZXRCdWZEZWYob2Zmc2V0LCBtZXRhX2J1ZiwgbWV0YUJ1ZklkeCk7CisgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgbWVtY3B5KG1ldGFfYnVmLmJ1ZmZlciwgbWV0YWRhdGEsIHNpemVvZihtZXRhZGF0YV9idWZmZXJfdCkpOworICAgIHNyY19mcmFtZS0+bWV0YWRhdGFfYnVmZmVyID0gbWV0YV9idWY7CisgICAgc3JjX2ZyYW1lLT5yZXByb2NfY29uZmlnID0gKnJlcHJvY19jZmc7CisgICAgc3JjX2ZyYW1lLT5vdXRwdXRfYnVmZmVyID0gb3V0cHV0X2J1ZmZlcjsKKyAgICBzcmNfZnJhbWUtPmZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNoZWNrU3RyZWFtQ2JFcnJvcnMKKyAqCisgKiBERVNDUklQVElPTjogY2hlY2sgdGhlIHN0cmVhbSBjYWxsYmFjayBmb3IgZXJyb3JzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdXBlcl9mcmFtZSA6IHRoZSBzdXBlciBmcmFtZSB3aXRoIGZpbGxlZCBidWZmZXIKKyAqICAgQHN0cmVhbSAgICAgIDogc3RyZWFtIG9uIHdoaWNoIHRoZSBidWZmZXIgd2FzIHJlcXVlc3RlZCBhbmQgZmlsbGVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsOjpjaGVja1N0cmVhbUNiRXJyb3JzKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3VwZXJfZnJhbWUsCisgICAgICAgIFFDYW1lcmEzU3RyZWFtICpzdHJlYW0pCit7CisgICAgaWYgKE5VTEwgPT0gc3RyZWFtKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgc3RyZWFtIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYoTlVMTCA9PSBzdXBlcl9mcmFtZSkgeworICAgICAgICAgTE9HRSgiSW52YWxpZCBTdXBlciBidWZmZXIiKTsKKyAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYoc3VwZXJfZnJhbWUtPm51bV9idWZzICE9IDEpIHsKKyAgICAgICAgIExPR0UoIk11bHRpcGxlIHN0cmVhbXMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmKE5VTEwgPT0gc3VwZXJfZnJhbWUtPmJ1ZnNbMF0pIHsKKyAgICAgICAgIExPR0UoIkVycm9yLCBTdXBlciBidWZmZXIgZnJhbWUgZG9lcyBub3QgY29udGFpbiB2YWxpZCBidWZmZXIiKTsKKyAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRTdHJlYW1TaXplCisgKgorICogREVTQ1JJUFRJT046IGdldCB0aGUgc2l6ZSBmcm9tIHRoZSBjYW1lcmEzX3N0cmVhbV90IGZvciB0aGUgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGltICAgICA6IFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3RyZWFtCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsOjpnZXRTdHJlYW1TaXplKGNhbV9kaW1lbnNpb25fdCAmZGltKQoreworICAgIGlmIChtQ2FtZXJhM1N0cmVhbSkgeworICAgICAgICBkaW0ud2lkdGggPSBtQ2FtZXJhM1N0cmVhbS0+d2lkdGg7CisgICAgICAgIGRpbS5oZWlnaHQgPSBtQ2FtZXJhM1N0cmVhbS0+aGVpZ2h0OworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0U3RyZWFtQnVmcworICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgdGhlIGJ1ZmZlcnMgYWxsb2NhdGVkIHRvIHRoZSBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqIEBsZW4gICAgICAgOiBidWZmZXIgbGVuZ3RoCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNTdHJlYW1NZW0qIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OmdldFN0cmVhbUJ1ZnModWludDMyX3QgLypsZW4qLykKK3sKKyAgICBLUElfQVRSQUNFX0NBTEwoKTsKKyAgICByZXR1cm4gJm1NZW1vcnk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHV0U3RyZWFtQnVmcworICoKKyAqIERFU0NSSVBUSU9OOiByZWxlYXNlIHRoZSBidWZmZXJzIGFsbG9jYXRlZCB0byB0aGUgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6IE5PTkUKKyAqCisgKiBSRVRVUk4gICAgIDogTk9ORQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OnB1dFN0cmVhbUJ1ZnMoKQoreworICAgIG1NZW1vcnkudW5yZWdpc3RlckJ1ZmZlcnMoKTsKKworICAgIC8qIFJlY2xhaW0gYWxsIHRoZSBvZmZsaW5lIG1ldGFidWZmZXJzIGFuZCBwdXNoIHRoZW0gdG8gZnJlZSBsaXN0ICovCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRnJlZU9mZmxpbmVNZXRhQnVmZmVyc0xvY2spOworICAgICAgICBtRnJlZU9mZmxpbmVNZXRhQnVmZmVyc0xpc3QuY2xlYXIoKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1PZmZsaW5lTWV0YU1lbW9yeS5nZXRDbnQoKTsgaSsrKSB7CisgICAgICAgICAgICBtRnJlZU9mZmxpbmVNZXRhQnVmZmVyc0xpc3QucHVzaF9iYWNrKGkpOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RvcAorICoKKyAqIERFU0NSSVBUSU9OOiBzdG9wIHByb2Nlc3NpbmcgY2hhbm5lbCwgd2hpY2ggd2lsbCBzdG9wIGFsbCBzdHJlYW1zIHdpdGhpbiwKKyAqICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIHJlcHJvY2Vzc2luZyBjaGFubmVsIGluIHBvc3Rwcm9jZXNzb3IuCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OnN0b3AoKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpZighbV9iSXNBY3RpdmUpIHsKKyAgICAgICAgTE9HRSgiQXR0ZW1wdCB0byBzdG9wIGluYWN0aXZlIGNoYW5uZWwiKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIG1fcG9zdHByb2Nlc3Nvci5zdG9wKCk7CisgICAgbVBvc3RQcm9jU3RhcnRlZCA9IGZhbHNlOworICAgIHJjIHw9IFFDYW1lcmEzQ2hhbm5lbDo6c3RvcCgpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdGFydFBvc3RQcm9jCisgKgorICogREVTQ1JJUFRJT046IGZpZ3VyZSBvdXQgaWYgdGhlIHBvc3Rwcm9jZXNzb3IgbmVlZHMgdG8gYmUgcmVzdGFydGVkIGFuZCBpZiB5ZXMKKyAqICAgICAgICAgICAgICBzdGFydCBpdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogQGlucHV0QnVmRXhpc3RzIDogd2hldGhlciB0aGVyZSBpcyBhbiBpbnB1dCBidWZmZXIgZm9yIHBvc3QgcHJvY2Vzc2luZworICogQGNvbmZpZyAgICAgICAgIDogcmVwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24KKyAqIEBtZXRhZGF0YSAgICAgICA6IG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVwcm9jZXNzaW5nIHJlcXVlc3QKKyAqCisgKiBSRVRVUk4gICAgIDogTk9ORQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OnN0YXJ0UG9zdFByb2MoY29uc3QgcmVwcm9jZXNzX2NvbmZpZ190ICZjb25maWcpCit7CisgICAgaWYoIW1Qb3N0UHJvY1N0YXJ0ZWQpIHsKKyAgICAgICAgbV9wb3N0cHJvY2Vzc29yLnN0YXJ0KGNvbmZpZyk7CisgICAgICAgIG1Qb3N0UHJvY1N0YXJ0ZWQgPSB0cnVlOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBxdWV1ZVJlcHJvY01ldGFkYXRhCisgKgorICogREVTQ1JJUFRJT046IHF1ZXVlIHRoZSByZXByb2Nlc3MgbWV0YWRhdGEgdG8gdGhlIHBvc3Rwcm9jZXNzb3IKKyAqCisgKiBQQVJBTUVURVJTIDogbWV0YWRhdGEgOiB0aGUgbWV0YWRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUgcHAgZnJhbWUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OnF1ZXVlUmVwcm9jTWV0YWRhdGEobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICptZXRhZGF0YSkKK3sKKyAgICByZXR1cm4gbV9wb3N0cHJvY2Vzc29yLnByb2Nlc3NQUE1ldGFkYXRhKG1ldGFkYXRhKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OIDogbWV0YWRhdGFCdWZEb25lCisgKgorICogREVTQ1JJUFRJT046IEJ1ZmZlciBkb25lIG1ldGhvZCBmb3IgYSBtZXRhZGF0YSBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqIEByZWN2ZF9mcmFtZSA6IHJlY2VpdmVkIG1ldGFkYXRhIGZyYW1lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsOjptZXRhZGF0YUJ1ZkRvbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7OworICAgIGlmICgoTlVMTCA9PSBtX3BNZXRhQ2hhbm5lbCkgfHwgKE5VTEwgPT0gcmVjdmRfZnJhbWUpKSB7CisgICAgICAgIExPR0UoIk1ldGFkYXRhIGNoYW5uZWwgb3IgbWV0YWRhdGEgYnVmZmVyIGludmFsaWQiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByYyA9ICgoUUNhbWVyYTNNZXRhZGF0YUNoYW5uZWwqKW1fcE1ldGFDaGFubmVsKS0+YnVmRG9uZShyZWN2ZF9mcmFtZSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiA6IHRyYW5zbGF0ZVN0cmVhbVR5cGVBbmRGb3JtYXQKKyAqCisgKiBERVNDUklQVElPTjogdHJhbnNsYXRlcyB0aGUgZnJhbWV3b3JrIHN0cmVhbSBmb3JtYXQgaW50byBIQUwgc3RyZWFtIHR5cGUKKyAqICAgICAgICAgICAgICBhbmQgZm9ybWF0CisgKgorICogUEFSQU1FVEVSUyA6CisgKiBAc3RyZWFtVHlwZSAgIDogdHJhbnNsYXRlZCBzdHJlYW0gdHlwZQorICogQHN0cmVhbUZvcm1hdCA6IHRyYW5zbGF0ZWQgc3RyZWFtIGZvcm1hdAorICogQHN0cmVhbSAgICAgICA6IGZ3ayBzdHJlYW0KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OnRyYW5zbGF0ZVN0cmVhbVR5cGVBbmRGb3JtYXQoY2FtZXJhM19zdHJlYW1fdCAqc3RyZWFtLAorICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCAmc3RyZWFtVHlwZSwgY2FtX2Zvcm1hdF90ICZzdHJlYW1Gb3JtYXQpCit7CisgICAgc3dpdGNoIChzdHJlYW0tPmZvcm1hdCkgeworICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4ODoKKyAgICAgICAgICAgIGlmKHN0cmVhbS0+c3RyZWFtX3R5cGUgPT0gQ0FNRVJBM19TVFJFQU1fSU5QVVQpeworICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q7CisgICAgICAgICAgICAgICAgc3RyZWFtRm9ybWF0ID0gZ2V0U3RyZWFtRGVmYXVsdEZvcm1hdChDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gQ0FNX1NUUkVBTV9UWVBFX0NBTExCQUNLOworICAgICAgICAgICAgICAgIHN0cmVhbUZvcm1hdCA9IGdldFN0cmVhbURlZmF1bHRGb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX0NBTExCQUNLKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDoKKyAgICAgICAgICAgIGlmIChzdHJlYW0tPnVzYWdlICYgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IENBTV9TVFJFQU1fVFlQRV9WSURFTzsKKyAgICAgICAgICAgICAgICBzdHJlYW1Gb3JtYXQgPSBnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KENBTV9TVFJFQU1fVFlQRV9WSURFTyk7CisgICAgICAgICAgICB9IGVsc2UgaWYoc3RyZWFtLT5zdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9JTlBVVCB8fAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX0JJRElSRUNUSU9OQUwgfHwKKyAgICAgICAgICAgICAgICAgICAgSVNfVVNBR0VfWlNMKHN0cmVhbS0+dXNhZ2UpKXsKKyAgICAgICAgICAgICAgICBzdHJlYW1UeXBlID0gQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UOworICAgICAgICAgICAgICAgIHN0cmVhbUZvcm1hdCA9IGdldFN0cmVhbURlZmF1bHRGb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXOworICAgICAgICAgICAgICAgIHN0cmVhbUZvcm1hdCA9IGdldFN0cmVhbURlZmF1bHRGb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVdfT1BBUVVFOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTY6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxMDoKKyAgICAgICAgICAgIHN0cmVhbVR5cGUgPSBDQU1fU1RSRUFNX1RZUEVfUkFXOworICAgICAgICAgICAgc3RyZWFtRm9ybWF0ID0gQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMEJQUF9HQlJHOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgTE9HRCgiZndrX2Zvcm1hdCA9ICVkLCBzdHJlYW1UeXBlID0gJWQsIHN0cmVhbUZvcm1hdCA9ICVkIiwKKyAgICAgICAgICAgIHN0cmVhbS0+Zm9ybWF0LCBzdHJlYW1UeXBlLCBzdHJlYW1Gb3JtYXQpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OIDogc2V0UmVwcm9jQ29uZmlnCisgKgorICogREVTQ1JJUFRJT046IHNldHMgdGhlIHJlcHJvY2Vzc2luZyBwYXJhbWV0ZXJzIGZvciB0aGUgaW5wdXQgYnVmZmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiBAcmVwcm9jX2NmZyA6IHRoZSBjb25maWd1cmF0aW9uIHRvIGJlIHNldAorICogQHBJbnB1dEJ1ZmZlciA6IHBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlcgorICogQG1ldGFkYXRhIDogcG9pbnRlciB0byB0aGUgcmVwcm9jZXNzaW5nIG1ldGFkYXRhIGJ1ZmZlcgorICogQHN0cmVhbUZvcm1hdCA6IGZvcm1hdCBvZiB0aGUgaW5wdXQgc3RyZWFtCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsOjpzZXRSZXByb2NDb25maWcocmVwcm9jZXNzX2NvbmZpZ190ICZyZXByb2NfY2ZnLAorICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqcElucHV0QnVmZmVyLAorICAgICAgICBfX3VudXNlZCBtZXRhZGF0YV9idWZmZXJfdCAqbWV0YWRhdGEsCisgICAgICAgIGNhbV9mb3JtYXRfdCBzdHJlYW1Gb3JtYXQsIGNhbV9kaW1lbnNpb25fdCBkaW0pCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgcmVwcm9jX2NmZy5wYWRkaW5nID0gJm1QYWRkaW5nSW5mbzsKKyAgICAvL3RvIGVuc3VyZSBhIGJpZyBlbm91Z2ggYnVmZmVyIHNpemUgc2V0IHRoZSBoZWlnaHQgYW5kIHdpZHRoCisgICAgLy9wYWRkaW5nIHRvIG1heChoZWlnaHQgcGFkZGluZywgd2lkdGggcGFkZGluZykKKyAgICBpZiAocmVwcm9jX2NmZy5wYWRkaW5nLT5oZWlnaHRfcGFkZGluZyA+IHJlcHJvY19jZmcucGFkZGluZy0+d2lkdGhfcGFkZGluZykgeworICAgICAgIHJlcHJvY19jZmcucGFkZGluZy0+d2lkdGhfcGFkZGluZyA9IHJlcHJvY19jZmcucGFkZGluZy0+aGVpZ2h0X3BhZGRpbmc7CisgICAgfSBlbHNlIHsKKyAgICAgICByZXByb2NfY2ZnLnBhZGRpbmctPmhlaWdodF9wYWRkaW5nID0gcmVwcm9jX2NmZy5wYWRkaW5nLT53aWR0aF9wYWRkaW5nOworICAgIH0KKyAgICBpZiAoTlVMTCAhPSBwSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgcmVwcm9jX2NmZy5pbnB1dF9zdHJlYW1fZGltLndpZHRoID0gKGludDMyX3QpcElucHV0QnVmZmVyLT5zdHJlYW0tPndpZHRoOworICAgICAgICByZXByb2NfY2ZnLmlucHV0X3N0cmVhbV9kaW0uaGVpZ2h0ID0gKGludDMyX3QpcElucHV0QnVmZmVyLT5zdHJlYW0tPmhlaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXByb2NfY2ZnLmlucHV0X3N0cmVhbV9kaW0ud2lkdGggPSAoaW50MzJfdClkaW0ud2lkdGg7CisgICAgICAgIHJlcHJvY19jZmcuaW5wdXRfc3RyZWFtX2RpbS5oZWlnaHQgPSAoaW50MzJfdClkaW0uaGVpZ2h0OworICAgIH0KKyAgICByZXByb2NfY2ZnLnNyY19jaGFubmVsID0gdGhpczsKKyAgICByZXByb2NfY2ZnLm91dHB1dF9zdHJlYW1fZGltLndpZHRoID0gbUNhbWVyYTNTdHJlYW0tPndpZHRoOworICAgIHJlcHJvY19jZmcub3V0cHV0X3N0cmVhbV9kaW0uaGVpZ2h0ID0gbUNhbWVyYTNTdHJlYW0tPmhlaWdodDsKKyAgICByZXByb2NfY2ZnLnJlcHJvY2Vzc190eXBlID0gZ2V0UmVwcm9jZXNzVHlwZSgpOworCisgICAgLy9vZmZzZXQgY2FsY3VsYXRpb24KKyAgICBpZiAoTlVMTCAhPSBwSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgcmMgPSB0cmFuc2xhdGVTdHJlYW1UeXBlQW5kRm9ybWF0KHBJbnB1dEJ1ZmZlci0+c3RyZWFtLAorICAgICAgICAgICAgICAgIHJlcHJvY19jZmcuc3RyZWFtX3R5cGUsIHJlcHJvY19jZmcuc3RyZWFtX2Zvcm1hdCk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiU3RyZWFtIGZvcm1hdCAlZCBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgcElucHV0QnVmZmVyLT5zdHJlYW0tPmZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXByb2NfY2ZnLnN0cmVhbV90eXBlID0gbVN0cmVhbVR5cGU7CisgICAgICAgIHJlcHJvY19jZmcuc3RyZWFtX2Zvcm1hdCA9IHN0cmVhbUZvcm1hdDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlcHJvY19jZmcuc3RyZWFtX3R5cGUpIHsKKyAgICAgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzoKKyAgICAgICAgICAgIGlmIChnZXRTdHJlYW1CeUluZGV4KDApID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJDb3VsZCBub3QgZmluZCBzdHJlYW0iKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmMgPSBtbV9zdHJlYW1fY2FsY19vZmZzZXRfcHJldmlldygKKyAgICAgICAgICAgICAgICAgICAgZ2V0U3RyZWFtQnlJbmRleCgwKS0+Z2V0U3RyZWFtSW5mbygpLAorICAgICAgICAgICAgICAgICAgICAmcmVwcm9jX2NmZy5pbnB1dF9zdHJlYW1fZGltLAorICAgICAgICAgICAgICAgICAgICByZXByb2NfY2ZnLnBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICZyZXByb2NfY2ZnLmlucHV0X3N0cmVhbV9wbGFuZV9pbmZvKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9WSURFTzoKKyAgICAgICAgICAgIHJjID0gbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3ZpZGVvKHJlcHJvY19jZmcuc3RyZWFtX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgJnJlcHJvY19jZmcuaW5wdXRfc3RyZWFtX2RpbSwKKyAgICAgICAgICAgICAgICAgICAgJnJlcHJvY19jZmcuaW5wdXRfc3RyZWFtX3BsYW5lX2luZm8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1JBVzoKKyAgICAgICAgICAgIHJjID0gbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3JhdyhyZXByb2NfY2ZnLnN0cmVhbV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICZyZXByb2NfY2ZnLmlucHV0X3N0cmVhbV9kaW0sCisgICAgICAgICAgICAgICAgICAgIHJlcHJvY19jZmcucGFkZGluZywgJnJlcHJvY19jZmcuaW5wdXRfc3RyZWFtX3BsYW5lX2luZm8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UOgorICAgICAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJjID0gbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3NuYXBzaG90KHN0cmVhbUZvcm1hdCwgJnJlcHJvY19jZmcuaW5wdXRfc3RyZWFtX2RpbSwKKyAgICAgICAgICAgICAgICAgICAgcmVwcm9jX2NmZy5wYWRkaW5nLCAmcmVwcm9jX2NmZy5pbnB1dF9zdHJlYW1fcGxhbmVfaW5mbyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgTE9HRSgiU3RyZWFtICVkIHBsYW5lIGluZm8gY2FsY3VsYXRpb24gZmFpbGVkISIsIG1TdHJlYW1UeXBlKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVwcm9jZXNzQ2JSb3V0aW5lCisgKgorICogREVTQ1JJUFRJT046IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgcmVwcm9jZXNzZWQgZnJhbWUuIFRoaXMgZnJhbWUgbm93CisgKiAgICAgICAgICAgICAgc2hvdWxkIGJlIHJldHVybmVkIHRvIHRoZSBmcmFtZXdvcmsKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqIEByZXN1bHRCdWZmZXIgICAgICA6IGJ1ZmZlciBjb250YWluaW5nIHRoZSByZXByb2Nlc3NlZCBkYXRhCisgKiBAcmVzdWx0RnJhbWVOdW1iZXIgOiBmcmFtZSBudW1iZXIgb24gd2hpY2ggdGhlIGJ1ZmZlciB3YXMgcmVxdWVzdGVkCisgKgorICogUkVUVVJOICAgICA6IE5PTkUKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbDo6cmVwcm9jZXNzQ2JSb3V0aW5lKGJ1ZmZlcl9oYW5kbGVfdCAqcmVzdWx0QnVmZmVyLAorICAgICAgICB1aW50MzJfdCByZXN1bHRGcmFtZU51bWJlcikKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludCByYyA9IE5PX0VSUk9SOworCisgICAgcmMgPSByZWxlYXNlT2ZmbGluZU1lbW9yeShyZXN1bHRGcmFtZU51bWJlcik7CisgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgIExPR0UoIkVycm9yIHJlbGVhc2luZyBvZmZsaW5lIG1lbW9yeSAlZCIsIHJjKTsKKyAgICB9CisgICAgLyogU2luY2UgcmVwcm9jZXNzaW5nIGlzIGRvbmUsIHNlbmQgdGhlIGNhbGxiYWNrIHRvIHJlbGVhc2UgdGhlIGlucHV0IGJ1ZmZlciAqLworICAgIGlmIChtQ2hhbm5lbENCKSB7CisgICAgICAgIG1DaGFubmVsQ0IoTlVMTCwgTlVMTCwgcmVzdWx0RnJhbWVOdW1iZXIsIHRydWUsIG1Vc2VyRGF0YSk7CisgICAgfQorICAgIGlzc3VlQ2hhbm5lbENiKHJlc3VsdEJ1ZmZlciwgcmVzdWx0RnJhbWVOdW1iZXIpOworCisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGlzc3VlQ2hhbm5lbENiCisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIHNldCB0aGUgcmVzdWx0IGFuZCBpc3N1ZSBjaGFubmVsIGNhbGxiYWNrCisgKgorICogUEFSQU1FVEVSUyA6CisgKiBAcmVzdWx0QnVmZmVyICAgICAgOiBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YQorICogQHJlc3VsdEZyYW1lTnVtYmVyIDogZnJhbWUgbnVtYmVyIG9uIHdoaWNoIHRoZSBidWZmZXIgd2FzIHJlcXVlc3RlZAorICoKKyAqIFJFVFVSTiAgICAgOiBOT05FCisgKgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsOjppc3N1ZUNoYW5uZWxDYihidWZmZXJfaGFuZGxlX3QgKnJlc3VsdEJ1ZmZlciwKKyAgICAgICAgdWludDMyX3QgcmVzdWx0RnJhbWVOdW1iZXIpCit7CisgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgcmVzdWx0OworICAgIC8vVXNlIGJlbG93IGRhdGEgdG8gaXNzdWUgZnJhbWV3b3JrIGNhbGxiYWNrCisgICAgcmVzdWx0LnN0cmVhbSA9IG1DYW1lcmEzU3RyZWFtOworICAgIHJlc3VsdC5idWZmZXIgPSByZXN1bHRCdWZmZXI7CisgICAgcmVzdWx0LnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSzsKKyAgICByZXN1bHQuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgIHJlc3VsdC5yZWxlYXNlX2ZlbmNlID0gLTE7CisKKyAgICBpZiAobUNoYW5uZWxDQikgeworICAgICAgICBtQ2hhbm5lbENCKE5VTEwsICZyZXN1bHQsIHJlc3VsdEZyYW1lTnVtYmVyLCBmYWxzZSwgbVVzZXJEYXRhKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2hvd0RlYnVnRlBTCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIHRvIGxvZyB0aGUgZnBzIGZvciBwcmV2aWV3LCB2aWRlbywgY2FsbGJhY2sgYW5kIHJhdworICogICAgICAgICAgICAgIHN0cmVhbXMKKyAqCisgKiBQQVJBTUVURVJTIDogU3RyZWFtIHR5cGUKKyAqCisgKiBSRVRVUk4gIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OnNob3dEZWJ1Z0ZQUyhpbnQzMl90IHN0cmVhbVR5cGUpCit7CisgICAgZG91YmxlIGZwcyA9IDA7CisgICAgbUZyYW1lQ291bnQrKzsKKyAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBuc2Vjc190IGRpZmYgPSBub3cgLSBtTGFzdEZwc1RpbWU7CisgICAgaWYgKGRpZmYgPiBtczJucygyNTApKSB7CisgICAgICAgIGZwcyA9ICgoKGRvdWJsZSkobUZyYW1lQ291bnQgLSBtTGFzdEZyYW1lQ291bnQpKSAqCisgICAgICAgICAgICAgICAgKGRvdWJsZSkoczJucygxKSkpIC8gKGRvdWJsZSlkaWZmOworICAgICAgICBzd2l0Y2goc3RyZWFtVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzoKKyAgICAgICAgICAgICAgICBMT0dIKCJQUk9GSUxFX1BSRVZJRVdfRlJBTUVTX1BFUl9TRUNPTkQgOiAlLjRmOiBtRnJhbWVDb3VudD0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZnBzLCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9WSURFTzoKKyAgICAgICAgICAgICAgICBMT0dIKCJQUk9GSUxFX1ZJREVPX0ZSQU1FU19QRVJfU0VDT05EIDogJS40ZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZnBzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX0NBTExCQUNLOgorICAgICAgICAgICAgICAgIExPR0goIlBST0ZJTEVfQ0FMTEJBQ0tfRlJBTUVTX1BFUl9TRUNPTkQgOiAlLjRmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmcHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUkFXOgorICAgICAgICAgICAgICAgIExPR0goIlBST0ZJTEVfUkFXX0ZSQU1FU19QRVJfU0VDT05EIDogJS40ZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZnBzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HSCgibG9nZ2luZyBub3Qgc3VwcG9ydGVkIGZvciB0aGUgc3RyZWFtIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RGcHNUaW1lID0gbm93OworICAgICAgICBtTGFzdEZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVsZWFzZU9mZmxpbmVNZW1vcnkKKyAqCisgKiBERVNDUklQVElPTjogZnVuY3Rpb24gdG8gY2xlYW4gdXAgdGhlIG9mZmxpbmUgbWVtb3J5IHVzZWQgZm9yIGlucHV0IHJlcHJvY2VzcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogQHJlc3VsdEZyYW1lTnVtYmVyIDogZnJhbWUgbnVtYmVyIG9uIHdoaWNoIHRoZSBidWZmZXIgd2FzIHJlcXVlc3RlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub24temVybyBmYWlsdXJlIGNvZGUKKyAqCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OnJlbGVhc2VPZmZsaW5lTWVtb3J5KHVpbnQzMl90IHJlc3VsdEZyYW1lTnVtYmVyKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpbnQzMl90IGlucHV0QnVmSW5kZXggPQorICAgICAgICAgICAgbU9mZmxpbmVNZW1vcnkuZ2V0R3JhbGxvY0J1ZmZlckluZGV4KHJlc3VsdEZyYW1lTnVtYmVyKTsKKyAgICBpZiAoMCA8PSBpbnB1dEJ1ZkluZGV4KSB7CisgICAgICAgIHJjID0gbU9mZmxpbmVNZW1vcnkudW5yZWdpc3RlckJ1ZmZlcihpbnB1dEJ1ZkluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dXKCJDb3VsZCBub3QgZmluZCBvZmZsaW5lIGlucHV0IGJ1ZmZlciwgcmVzdWx0RnJhbWVOdW1iZXIgJWQiLAorICAgICAgICAgICAgICAgICByZXN1bHRGcmFtZU51bWJlcik7CisgICAgfQorICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gdW5yZWdpc3RlciBvZmZsaW5lIGlucHV0IGJ1ZmZlciIpOworICAgIH0KKworICAgIGludDMyX3QgbWV0YUJ1ZkluZGV4ID0KKyAgICAgICAgICAgIG1PZmZsaW5lTWV0YU1lbW9yeS5nZXRIZWFwQnVmZmVySW5kZXgocmVzdWx0RnJhbWVOdW1iZXIpOworICAgIGlmICgwIDw9IG1ldGFCdWZJbmRleCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRnJlZU9mZmxpbmVNZXRhQnVmZmVyc0xvY2spOworICAgICAgICBtRnJlZU9mZmxpbmVNZXRhQnVmZmVyc0xpc3QucHVzaF9iYWNrKCh1aW50MzJfdCltZXRhQnVmSW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coIkNvdWxkIG5vdCBmaW5kIG9mZmxpbmUgbWV0YSBidWZmZXIsIHJlc3VsdEZyYW1lTnVtYmVyICVkIiwKKyAgICAgICAgICAgICAgICByZXN1bHRGcmFtZU51bWJlcik7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKiBSZWd1bGFyIENoYW5uZWwgbWV0aG9kcyAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhM1JlZ3VsYXJDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmEzUmVndWxhckNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbV9oYW5kbGUgOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBjYW1fb3BzICAgIDogcHRyIHRvIGNhbWVyYSBvcHMgdGFibGUKKyAqICAgQGNiX3JvdXRpbmUgOiBjYWxsYmFjayByb3V0aW5lIHRvIGZyYW1lIGFnZ3JlZ2F0b3IKKyAqICAgQHN0cmVhbSAgICAgOiBjYW1lcmEzX3N0cmVhbV90IHN0cnVjdHVyZQorICogICBAc3RyZWFtX3R5cGU6IENoYW5uZWwgc3RyZWFtIHR5cGUKKyAqICAgQHBvc3Rwcm9jZXNzX21hc2s6IGZlYXR1cmUgbWFzayBmb3IgcG9zdHByb2Nlc3NpbmcKKyAqICAgQG1ldGFkYXRhQ2hhbm5lbCA6IG1ldGFkYXRhIGNoYW5uZWwgZm9yIHRoZSBzZXNzaW9uCisgKiAgIEBudW1CdWZmZXJzIDogbnVtYmVyIG9mIG1heCBkZXF1ZXVlZCBidWZmZXJzCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNSZWd1bGFyQ2hhbm5lbDo6UUNhbWVyYTNSZWd1bGFyQ2hhbm5lbCh1aW50MzJfdCBjYW1faGFuZGxlLAorICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKKyAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAorICAgICAgICBjaGFubmVsX2NiX3JvdXRpbmUgY2Jfcm91dGluZSwKKyAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbSwKKyAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUsCisgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKm1ldGFkYXRhQ2hhbm5lbCwKKyAgICAgICAgdWludDMyX3QgbnVtQnVmZmVycykgOgorICAgICAgICAgICAgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbChjYW1faGFuZGxlLCBjaGFubmVsX2hhbmRsZSwgY2FtX29wcywKKyAgICAgICAgICAgICAgICAgICAgY2Jfcm91dGluZSwgcGFkZGluZ0luZm8sIHVzZXJEYXRhLCBzdHJlYW0sIHN0cmVhbV90eXBlLAorICAgICAgICAgICAgICAgICAgICBwb3N0cHJvY2Vzc19tYXNrLCBtZXRhZGF0YUNoYW5uZWwsIG51bUJ1ZmZlcnMpLAorICAgICAgICAgICAgbUJhdGNoU2l6ZSgwKSwKKyAgICAgICAgICAgIG1Sb3RhdGlvbihST1RBVEVfMCkKK3sKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYTNSZWd1bGFyQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBkZXN0cnVjdG9yIG9mIFFDYW1lcmEzUmVndWxhckNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEzUmVndWxhckNoYW5uZWw6On5RQ2FtZXJhM1JlZ3VsYXJDaGFubmVsKCkKK3sKKyAgICBkZXN0cm95KCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW5pdGlhbGl6ZQorICoKKyAqIERFU0NSSVBUSU9OOiBJbml0aWFsaXplIGFuZCBhZGQgY2FtZXJhIGNoYW5uZWwgJiBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgIEBpc1R5cGUgOiB0eXBlIG9mIGltYWdlIHN0YWJpbGl6YXRpb24gcmVxdWlyZWQgb24gdGhpcyBzdHJlYW0KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK2ludDMyX3QgUUNhbWVyYTNSZWd1bGFyQ2hhbm5lbDo6aW5pdGlhbGl6ZShjYW1faXNfdHlwZV90IGlzVHlwZSkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIGNhbV9kaW1lbnNpb25fdCBzdHJlYW1EaW07CisKKyAgICBpZiAoTlVMTCA9PSBtQ2FtZXJhM1N0cmVhbSkgeworICAgICAgICBMT0dFKCJDYW1lcmEgc3RyZWFtIHVuaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKDEgPD0gbV9udW1TdHJlYW1zKSB7CisgICAgICAgIC8vIE9ubHkgb25lIHN0cmVhbSBwZXIgY2hhbm5lbCBzdXBwb3J0ZWQgaW4gdjMgSGFsCisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBtSXNUeXBlICA9IGlzVHlwZTsKKworICAgIHJjID0gdHJhbnNsYXRlU3RyZWFtVHlwZUFuZEZvcm1hdChtQ2FtZXJhM1N0cmVhbSwgbVN0cmVhbVR5cGUsCisgICAgICAgICAgICBtU3RyZWFtRm9ybWF0KTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisKKyAgICBpZiAoKG1TdHJlYW1UeXBlID09IENBTV9TVFJFQU1fVFlQRV9WSURFTykgfHwKKyAgICAgICAgICAgIChtU3RyZWFtVHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVykpIHsKKyAgICAgICAgaWYgKChtQ2FtZXJhM1N0cmVhbS0+cm90YXRpb24gIT0gQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCkgJiYKKyAgICAgICAgICAgICAgICAoKG1Qb3N0UHJvY01hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX1JPVEFUSU9OKSA9PSAwKSkgeworICAgICAgICAgICAgTE9HRSgiYXR0ZW1wdGluZyByb3RhdGlvbiAlZCB3aGVuIHJvdGF0aW9uIGlzIGRpc2FibGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYTNTdHJlYW0tPnJvdGF0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChtQ2FtZXJhM1N0cmVhbS0+cm90YXRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMDoKKyAgICAgICAgICAgICAgICBtUm90YXRpb24gPSBST1RBVEVfMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fOTA6IHsKKyAgICAgICAgICAgICAgICBtUm90YXRpb24gPSBST1RBVEVfOTA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgICAgICAgICBtUm90YXRpb24gPSBST1RBVEVfMTgwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8yNzA6IHsKKyAgICAgICAgICAgICAgICBtUm90YXRpb24gPSBST1RBVEVfMjcwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJVbmtub3duIHJvdGF0aW9uOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYTNTdHJlYW0tPnJvdGF0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtQ2FtZXJhM1N0cmVhbS0+cm90YXRpb24gIT0gQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCkgeworICAgICAgICBMT0dFKCJSb3RhdGlvbiAlZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHN0cmVhbSB0eXBlICVkIiwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhM1N0cmVhbS0+cm90YXRpb24sCisgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBzdHJlYW1EaW0ud2lkdGggPSBtQ2FtZXJhM1N0cmVhbS0+d2lkdGg7CisgICAgc3RyZWFtRGltLmhlaWdodCA9IG1DYW1lcmEzU3RyZWFtLT5oZWlnaHQ7CisKKyAgICBMT0dEKCJiYXRjaCBzaXplIGlzICVkIiwgbUJhdGNoU2l6ZSk7CisgICAgcmMgPSBRQ2FtZXJhM0NoYW5uZWw6OmFkZFN0cmVhbShtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgIG1TdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICBzdHJlYW1EaW0sCisgICAgICAgICAgICBtUm90YXRpb24sCisgICAgICAgICAgICBtTnVtQnVmcywKKyAgICAgICAgICAgIG1Qb3N0UHJvY01hc2ssCisgICAgICAgICAgICBtSXNUeXBlLAorICAgICAgICAgICAgbUJhdGNoU2l6ZSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0QmF0Y2hTaXplCisgKgorICogREVTQ1JJUFRJT046IFNldCBiYXRjaCBzaXplIGZvciB0aGUgY2hhbm5lbC4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJhdGNoU2l6ZSAgOiBOdW1iZXIgb2YgaW1hZ2UgYnVmZmVycyBpbiBhIGJhdGNoCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcyBhbHdheXMKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNSZWd1bGFyQ2hhbm5lbDo6c2V0QmF0Y2hTaXplKHVpbnQzMl90IGJhdGNoU2l6ZSkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBtQmF0Y2hTaXplID0gYmF0Y2hTaXplOworICAgIExPR0QoIkJhdGNoIHNpemUgc2V0OiAlZCIsIG1CYXRjaFNpemUpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRTdHJlYW1UeXBlTWFzaworICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgYml0IG1hc2sgb2YgYWxsIHN0cmVhbSB0eXBlcyBpbiB0aGlzIGNoYW5uZWwuCisgKiAgICAgICAgICAgICAgSWYgc3RyZWFtIGlzIG5vdCBpbml0aWFsaXplZCwgdGhlbiBnZW5lcmF0ZSBtYXNrIGJhc2VkIG9uCisgKiAgICAgICAgICAgICAgbG9jYWwgc3RyZWFtVHlwZQorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IEJpdCBtYXNrIG9mIGFsbCBzdHJlYW0gdHlwZXMgaW4gdGhpcyBjaGFubmVsCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQzMl90IFFDYW1lcmEzUmVndWxhckNoYW5uZWw6OmdldFN0cmVhbVR5cGVNYXNrKCkKK3sKKyAgICBpZiAobVN0cmVhbXNbMF0pIHsKKyAgICAgICAgcmV0dXJuIFFDYW1lcmEzQ2hhbm5lbDo6Z2V0U3RyZWFtVHlwZU1hc2soKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKDFVIDw8IG1TdHJlYW1UeXBlKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcXVldWVCYXRjaEJ1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBxdWV1ZSBiYXRjaCBjb250YWluZXIgdG8gZG93bnN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MgYWx3YXlzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUmVndWxhckNoYW5uZWw6OnF1ZXVlQmF0Y2hCdWYoKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIGlmIChtU3RyZWFtc1swXSkgeworICAgICAgICByYyA9IG1TdHJlYW1zWzBdLT5xdWV1ZUJhdGNoQnVmKCk7CisgICAgfQorICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJzdHJlYW0tPnF1ZXVlQmF0Y2hDb250YWluZXIgZmFpbGVkIik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZXF1ZXN0CisgKgorICogREVTQ1JJUFRJT046IHByb2Nlc3MgYSByZXF1ZXN0IGZyb20gY2FtZXJhIHNlcnZpY2UuIFN0cmVhbSBvbiBpZiBuY2Vzc2FyeS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJ1ZmZlciAgOiBidWZmZXIgdG8gYmUgZmlsbGVkIGZvciB0aGlzIHJlcXVlc3QKKyAqCisgKiBSRVRVUk4gICAgIDogMCBvbiBhIHN1Y2Nlc3Mgc3RhcnQgb2YgY2FwdHVyZQorICogICAgICAgICAgICAgIC1FSU5WQUwgb24gaW52YWxpZCBpbnB1dAorICogICAgICAgICAgICAgIC1FTk9ERVYgb24gc2VyaW91cyBlcnJvcgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUmVndWxhckNoYW5uZWw6OnJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIHVpbnQzMl90IGZyYW1lTnVtYmVyKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgLy9GSVggTUU6IFJldHVybiBidWZmZXIgYmFjayBpbiBjYXNlIG9mIGZhaWx1cmVzIGJlbG93LgorCisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGludCBpbmRleDsKKworICAgIGlmIChOVUxMID09IGJ1ZmZlcikgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGJ1ZmZlciBpbiBjaGFubmVsIHJlcXVlc3QiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZighbV9iSXNBY3RpdmUpIHsKKyAgICAgICAgcmMgPSByZWdpc3RlckJ1ZmZlcihidWZmZXIsIG1Jc1R5cGUpOworICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgIExPR0UoIk9uLXRoZS1mbHkgYnVmZmVyIHJlZ2lzdHJhdGlvbiBmYWlsZWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBzdGFydCgpOworICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIlJlcXVlc3Qgb24gYW4gZXhpc3Rpbmcgc3RyZWFtIik7CisgICAgfQorCisgICAgaW5kZXggPSBtTWVtb3J5LmdldE1hdGNoQnVmSW5kZXgoKHZvaWQqKWJ1ZmZlcik7CisgICAgaWYoaW5kZXggPCAwKSB7CisgICAgICAgIHJjID0gcmVnaXN0ZXJCdWZmZXIoYnVmZmVyLCBtSXNUeXBlKTsKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICBMT0dFKCJPbi10aGUtZmx5IGJ1ZmZlciByZWdpc3RyYXRpb24gZmFpbGVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIGluZGV4ID0gbU1lbW9yeS5nZXRNYXRjaEJ1ZkluZGV4KCh2b2lkKilidWZmZXIpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJDb3VsZCBub3QgZmluZCBvYmplY3QgYW1vbmcgcmVnaXN0ZXJlZCBidWZmZXJzIik7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByYyA9IG1TdHJlYW1zWzBdLT5idWZEb25lKCh1aW50MzJfdClpbmRleCk7CisgICAgaWYocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIFEgbmV3IGJ1ZmZlciB0byBzdHJlYW0iKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJjID0gbU1lbW9yeS5tYXJrRnJhbWVOdW1iZXIoKHVpbnQzMl90KWluZGV4LCBmcmFtZU51bWJlcik7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFJlcHJvY2Vzc1R5cGUKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IHRoZSB0eXBlIG9mIHJlcHJvY2VzcyBvdXRwdXQgc3VwcG9ydGVkIGJ5IHRoaXMgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOiBOT05FCisgKgorICogUkVUVVJOICAgICA6IHJlcHJvY2Vzc190eXBlX3QgOiB0eXBlIG9mIHJlcHJvY2VzcworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCityZXByb2Nlc3NfdHlwZV90IFFDYW1lcmEzUmVndWxhckNoYW5uZWw6OmdldFJlcHJvY2Vzc1R5cGUoKQoreworICAgIHJldHVybiBSRVBST0NFU1NfVFlQRV9QUklWQVRFOworfQorCisKK1FDYW1lcmEzTWV0YWRhdGFDaGFubmVsOjpRQ2FtZXJhM01ldGFkYXRhQ2hhbm5lbCh1aW50MzJfdCBjYW1faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2NiX3JvdXRpbmUgY2Jfcm91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IHBvc3Rwcm9jZXNzX21hc2ssCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLCB1aW50MzJfdCBudW1CdWZmZXJzKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwoY2FtX2hhbmRsZSwgY2hhbm5lbF9oYW5kbGUsIGNhbV9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX3JvdXRpbmUsIHBhZGRpbmdJbmZvLCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSwgbnVtQnVmZmVycyksCisgICAgICAgICAgICAgICAgICAgICAgICBtTWVtb3J5KE5VTEwpCit7Cit9CisKK1FDYW1lcmEzTWV0YWRhdGFDaGFubmVsOjp+UUNhbWVyYTNNZXRhZGF0YUNoYW5uZWwoKQoreworICAgIGRlc3Ryb3koKTsKKworICAgIGlmIChtTWVtb3J5KSB7CisgICAgICAgIG1NZW1vcnktPmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVsZXRlIG1NZW1vcnk7CisgICAgICAgIG1NZW1vcnkgPSBOVUxMOworICAgIH0KK30KKworaW50MzJfdCBRQ2FtZXJhM01ldGFkYXRhQ2hhbm5lbDo6aW5pdGlhbGl6ZShjYW1faXNfdHlwZV90IGlzVHlwZSkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludDMyX3QgcmM7CisgICAgY2FtX2RpbWVuc2lvbl90IHN0cmVhbURpbTsKKworICAgIGlmIChtTWVtb3J5IHx8IG1fbnVtU3RyZWFtcyA+IDApIHsKKyAgICAgICAgTE9HRSgibWV0YWRhdGEgY2hhbm5lbCBhbHJlYWR5IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHN0cmVhbURpbS53aWR0aCA9IChpbnQzMl90KXNpemVvZihtZXRhZGF0YV9idWZmZXJfdCksCisgICAgc3RyZWFtRGltLmhlaWdodCA9IDE7CisKKyAgICBtSXNUeXBlID0gaXNUeXBlOworICAgIHJjID0gUUNhbWVyYTNDaGFubmVsOjphZGRTdHJlYW0oQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBLCBDQU1fRk9STUFUX01BWCwKKyAgICAgICAgICAgIHN0cmVhbURpbSwgUk9UQVRFXzAsICh1aW50OF90KW1OdW1CdWZmZXJzLCBtUG9zdFByb2NNYXNrLCBtSXNUeXBlKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoImFkZFN0cmVhbSBmYWlsZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCitpbnQzMl90IFFDYW1lcmEzTWV0YWRhdGFDaGFubmVsOjpyZXF1ZXN0KGJ1ZmZlcl9oYW5kbGVfdCAqIC8qYnVmZmVyKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAvKmZyYW1lTnVtYmVyKi8pCit7CisgICAgaWYgKCFtX2JJc0FjdGl2ZSkgeworICAgICAgICByZXR1cm4gc3RhcnQoKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKwordm9pZCBRQ2FtZXJhM01ldGFkYXRhQ2hhbm5lbDo6c3RyZWFtQ2JSb3V0aW5lKAorICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmEzU3RyZWFtICogLypzdHJlYW0qLykKK3sKKyAgICBBVFJBQ0VfTkFNRSgibWV0YWRhdGFfc3RyZWFtX2NiX3JvdXRpbmUiKTsKKyAgICB1aW50MzJfdCByZXF1ZXN0TnVtYmVyID0gMDsKKyAgICBpZiAoc3VwZXJfZnJhbWUgPT0gTlVMTCB8fCBzdXBlcl9mcmFtZS0+bnVtX2J1ZnMgIT0gMSkgeworICAgICAgICBMT0dFKCJzdXBlcl9mcmFtZSBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobUNoYW5uZWxDQikgeworICAgICAgICBtQ2hhbm5lbENCKHN1cGVyX2ZyYW1lLCBOVUxMLCByZXF1ZXN0TnVtYmVyLCBmYWxzZSwgbVVzZXJEYXRhKTsKKyAgICB9Cit9CisKK1FDYW1lcmEzU3RyZWFtTWVtKiBRQ2FtZXJhM01ldGFkYXRhQ2hhbm5lbDo6Z2V0U3RyZWFtQnVmcyh1aW50MzJfdCBsZW4pCit7CisgICAgaW50IHJjOworICAgIGlmIChsZW4gPCBzaXplb2YobWV0YWRhdGFfYnVmZmVyX3QpKSB7CisgICAgICAgIExPR0UoIk1ldGFkYXRhIGJ1ZmZlciBzaXplIGxlc3MgdGhhbiBzdHJ1Y3R1cmUgJWQgdnMgJWQiLAorICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICBzaXplb2YobWV0YWRhdGFfYnVmZmVyX3QpKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1NZW1vcnkgPSBuZXcgUUNhbWVyYTNTdHJlYW1NZW0oTUlOX1NUUkVBTUlOR19CVUZGRVJfTlVNKTsKKyAgICBpZiAoIW1NZW1vcnkpIHsKKyAgICAgICAgTE9HRSgidW5hYmxlIHRvIGNyZWF0ZSBtZXRhZGF0YSBtZW1vcnkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJjID0gbU1lbW9yeS0+YWxsb2NhdGVBbGwobGVuKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoInVuYWJsZSB0byBhbGxvY2F0ZSBtZXRhZGF0YSBtZW1vcnkiKTsKKyAgICAgICAgZGVsZXRlIG1NZW1vcnk7CisgICAgICAgIG1NZW1vcnkgPSBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY2xlYXJfbWV0YWRhdGFfYnVmZmVyKChtZXRhZGF0YV9idWZmZXJfdCopbU1lbW9yeS0+Z2V0UHRyKDApKTsKKyAgICByZXR1cm4gbU1lbW9yeTsKK30KKwordm9pZCBRQ2FtZXJhM01ldGFkYXRhQ2hhbm5lbDo6cHV0U3RyZWFtQnVmcygpCit7CisgICAgbU1lbW9yeS0+ZGVhbGxvY2F0ZSgpOworICAgIGRlbGV0ZSBtTWVtb3J5OworICAgIG1NZW1vcnkgPSBOVUxMOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBSQVcgQ2hhbm5lbCByZWxhdGVkIGZ1bmN0aW9ucworUUNhbWVyYTNSYXdDaGFubmVsOjpRQ2FtZXJhM1Jhd0NoYW5uZWwodWludDMyX3QgY2FtX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtX29wcywKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jYl9yb3V0aW5lIGNiX3JvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKm1ldGFkYXRhQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCByYXdfMTYsIHVpbnQzMl90IG51bUJ1ZmZlcnMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmEzUmVndWxhckNoYW5uZWwoY2FtX2hhbmRsZSwgY2hhbm5lbF9oYW5kbGUsIGNhbV9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX3JvdXRpbmUsIHBhZGRpbmdJbmZvLCB1c2VyRGF0YSwgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfUkFXLCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUNoYW5uZWwsIG51bUJ1ZmZlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUlzUmF3MTYocmF3XzE2KQoreworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEucmF3LmRlYnVnLmR1bXAiLCBwcm9wLCAiMCIpOworICAgIG1SYXdEdW1wID0gYXRvaShwcm9wKTsKK30KKworUUNhbWVyYTNSYXdDaGFubmVsOjp+UUNhbWVyYTNSYXdDaGFubmVsKCkKK3sKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpbml0aWFsaXplCisgKgorICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgYW5kIGFkZCBjYW1lcmEgY2hhbm5lbCAmIHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogQGlzVHlwZSAgICA6IGltYWdlIHN0YWJpbGl6YXRpb24gdHlwZSBvbiB0aGUgc3RyZWFtCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitpbnQzMl90IFFDYW1lcmEzUmF3Q2hhbm5lbDo6aW5pdGlhbGl6ZShjYW1faXNfdHlwZV90IGlzVHlwZSkKK3sKKyAgICByZXR1cm4gUUNhbWVyYTNSZWd1bGFyQ2hhbm5lbDo6aW5pdGlhbGl6ZShpc1R5cGUpOworfQorCit2b2lkIFFDYW1lcmEzUmF3Q2hhbm5lbDo6c3RyZWFtQ2JSb3V0aW5lKAorICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmEzU3RyZWFtICogc3RyZWFtKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgLyogTW92ZSB0aGlzIGJhY2sgZG93biBvbmNlIHZlcmlmaWVkICovCisgICAgaWYgKG1SYXdEdW1wKQorICAgICAgICBkdW1wUmF3U25hcHNob3Qoc3VwZXJfZnJhbWUtPmJ1ZnNbMF0pOworCisgICAgaWYgKG1Jc1JhdzE2KSB7CisgICAgICAgIGlmIChnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KENBTV9TVFJFQU1fVFlQRV9SQVcpID09CisgICAgICAgICAgICAgICAgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMEJQUF9HQlJHKQorICAgICAgICAgICAgY29udmVydE1pcGlUb1JhdzE2KHN1cGVyX2ZyYW1lLT5idWZzWzBdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29udmVydExlZ2FjeVRvUmF3MTYoc3VwZXJfZnJhbWUtPmJ1ZnNbMF0pOworICAgIH0KKworICAgIC8vTWFrZSBzdXJlIGNhY2hlIGNvaGVyZW5jZSBiZWNhdXNlIGV4dHJhIHByb2Nlc3NpbmcgaXMgZG9uZQorICAgIG1NZW1vcnkuY2xlYW5JbnZhbGlkYXRlQ2FjaGUoc3VwZXJfZnJhbWUtPmJ1ZnNbMF0tPmJ1Zl9pZHgpOworCisgICAgUUNhbWVyYTNSZWd1bGFyQ2hhbm5lbDo6c3RyZWFtQ2JSb3V0aW5lKHN1cGVyX2ZyYW1lLCBzdHJlYW0pOworICAgIHJldHVybjsKK30KKwordm9pZCBRQ2FtZXJhM1Jhd0NoYW5uZWw6OmR1bXBSYXdTbmFwc2hvdChtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZSkKK3sKKyAgIFFDYW1lcmEzU3RyZWFtICpzdHJlYW0gPSBnZXRTdHJlYW1CeUluZGV4KDApOworICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgY2hhciBidWZbRklMRU5BTUVfTUFYXTsKKyAgICAgICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisgICAgICAgY2FtX2RpbWVuc2lvbl90IGRpbTsKKyAgICAgICBtZW1zZXQoJmRpbSwgMCwgc2l6ZW9mKGRpbSkpOworICAgICAgIHN0cmVhbS0+Z2V0RnJhbWVEaW1lbnNpb24oZGltKTsKKworICAgICAgIGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3Qgb2Zmc2V0OworICAgICAgIG1lbXNldCgmb2Zmc2V0LCAwLCBzaXplb2YoY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCkpOworICAgICAgIHN0cmVhbS0+Z2V0RnJhbWVPZmZzZXQob2Zmc2V0KTsKKyAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBRQ0FNRVJBX0RVTVBfRlJNX0xPQ0FUSU9OInJfJWRfJWR4JWQucmF3IiwKKyAgICAgICAgICAgICAgICBmcmFtZS0+ZnJhbWVfaWR4LCBvZmZzZXQubXBbMF0uc3RyaWRlLCBvZmZzZXQubXBbMF0uc2NhbmxpbmUpOworCisgICAgICAgaW50IGZpbGVfZmQgPSBvcGVuKGJ1ZiwgT19SRFdSfCBPX0NSRUFULCAwNjQ0KTsKKyAgICAgICBpZiAoZmlsZV9mZCA+PSAwKSB7CisgICAgICAgICAgc3NpemVfdCB3cml0dGVuX2xlbiA9IHdyaXRlKGZpbGVfZmQsIGZyYW1lLT5idWZmZXIsIGZyYW1lLT5mcmFtZV9sZW4pOworICAgICAgICAgIExPR0QoIndyaXR0ZW4gbnVtYmVyIG9mIGJ5dGVzICV6ZCIsIHdyaXR0ZW5fbGVuKTsKKyAgICAgICAgICBjbG9zZShmaWxlX2ZkKTsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgIExPR0UoImZhaWxlZCB0byBvcGVuIGZpbGUgdG8gZHVtcCBpbWFnZSIpOworICAgICAgIH0KKyAgIH0gZWxzZSB7CisgICAgICAgTE9HRSgiQ291bGQgbm90IGZpbmQgc3RyZWFtIik7CisgICB9CisKK30KKwordm9pZCBRQ2FtZXJhM1Jhd0NoYW5uZWw6OmNvbnZlcnRMZWdhY3lUb1JhdzE2KG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lKQoreworICAgIC8vIENvbnZlcnQgaW1hZ2UgYnVmZmVyIGZyb20gT3BhcXVlIHJhdyBmb3JtYXQgdG8gUkFXMTYgZm9ybWF0CisgICAgLy8gMTBiaXQgT3BhcXVlIHJhdyBpcyBzdG9yZWQgaW4gdGhlIGZvcm1hdCBvZjoKKyAgICAvLyAwMDAwIC0gcDUgLSBwNCAtIHAzIC0gcDIgLSBwMSAtIHAwCisgICAgLy8gd2hlcmUgcDAgdG8gcDUgYXJlIDYgcGl4ZWxzIChlYWNoIGlzIDEwYml0KV9hbmQgbW9zdCBzaWduaWZpY2FudAorICAgIC8vIDQgYml0cyBhcmUgMHMuIEVhY2ggNjRiaXQgd29yZCBjb250YWlucyA2IHBpeGVscy4KKworICBRQ2FtZXJhM1N0cmVhbSAqc3RyZWFtID0gZ2V0U3RyZWFtQnlJbmRleCgwKTsKKyAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CisgICAgICBjYW1fZGltZW5zaW9uX3QgZGltOworICAgICAgbWVtc2V0KCZkaW0sIDAsIHNpemVvZihkaW0pKTsKKyAgICAgIHN0cmVhbS0+Z2V0RnJhbWVEaW1lbnNpb24oZGltKTsKKworICAgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCBvZmZzZXQ7CisgICAgICBtZW1zZXQoJm9mZnNldCwgMCwgc2l6ZW9mKGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QpKTsKKyAgICAgIHN0cmVhbS0+Z2V0RnJhbWVPZmZzZXQob2Zmc2V0KTsKKworICAgICAgdWludDMyX3QgcmF3MTZfc3RyaWRlID0gKCh1aW50MzJfdClkaW0ud2lkdGggKyAxNVUpICYgfjE1VTsKKyAgICAgIHVpbnQxNl90KiByYXcxNl9idWZmZXIgPSAodWludDE2X3QgKilmcmFtZS0+YnVmZmVyOworCisgICAgICAvLyBJbi1wbGFjZSBmb3JtYXQgY29udmVyc2lvbi4KKyAgICAgIC8vIFJhdzE2IGZvcm1hdCBhbHdheXMgb2NjdXB5IG1vcmUgbWVtb3J5IHRoYW4gb3BhcXVlIHJhdzEwLgorICAgICAgLy8gQ29udmVydCB0byBSYXcxNiBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgcGl4ZWxzIGZyb20gYm90dG9tLXJpZ2h0CisgICAgICAvLyB0byB0b3AtbGVmdCBvZiB0aGUgaW1hZ2UuCisgICAgICAvLyBPbmUgc3BlY2lhbCBub3RlczoKKyAgICAgIC8vIDEuIENyb3NzLXBsYXRmb3JtIHJhdzE2J3Mgc3RyaWRlIGlzIDE2IHBpeGVscy4KKyAgICAgIC8vIDIuIE9wYXF1ZSByYXcxMCdzIHN0cmlkZSBpcyA2IHBpeGVscywgYW5kIGFsaWduZWQgdG8gMTYgYnl0ZXMuCisgICAgICBmb3IgKGludDMyX3QgeXMgPSBkaW0uaGVpZ2h0IC0gMTsgeXMgPj0gMDsgeXMtLSkgeworICAgICAgICAgIHVpbnQzMl90IHkgPSAodWludDMyX3QpeXM7CisgICAgICAgICAgdWludDY0X3QqIHJvd19zdGFydCA9ICh1aW50NjRfdCAqKWZyYW1lLT5idWZmZXIgKworICAgICAgICAgICAgICAgICAgeSAqICh1aW50MzJfdClvZmZzZXQubXBbMF0uc3RyaWRlX2luX2J5dGVzIC8gODsKKyAgICAgICAgICBmb3IgKGludDMyX3QgeHMgPSBkaW0ud2lkdGggLSAxOyB4cyA+PSAwOyB4cy0tKSB7CisgICAgICAgICAgICAgIHVpbnQzMl90IHggPSAodWludDMyX3QpeHM7CisgICAgICAgICAgICAgIHVpbnQxNl90IHJhdzE2X3BpeGVsID0gMHgzRkYgJiAocm93X3N0YXJ0W3gvNl0gPj4gKDEwKih4JTYpKSk7CisgICAgICAgICAgICAgIHJhdzE2X2J1ZmZlclt5KnJhdzE2X3N0cmlkZSt4XSA9IHJhdzE2X3BpeGVsOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgfSBlbHNlIHsKKyAgICAgIExPR0UoIkNvdWxkIG5vdCBmaW5kIHN0cmVhbSIpOworICB9CisKK30KKwordm9pZCBRQ2FtZXJhM1Jhd0NoYW5uZWw6OmNvbnZlcnRNaXBpVG9SYXcxNihtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZSkKK3sKKyAgICAvLyBDb252ZXJ0IGltYWdlIGJ1ZmZlciBmcm9tIG1pcGkxMCByYXcgZm9ybWF0IHRvIFJBVzE2IGZvcm1hdAorICAgIC8vIG1pcGkxMCBvcGFxdWUgcmF3IGlzIHN0b3JlZCBpbiB0aGUgZm9ybWF0IG9mOgorICAgIC8vIFAzKDE6MCkgUDIoMTowKSBQMSgxOjApIFAwKDE6MCkgUDMoOToyKSBQMig5OjIpIFAxKDk6MikgUDAoOToyKQorICAgIC8vIDQgcGl4ZWxzIG9jY3VweSA1IGJ5dGVzLCBubyBwYWRkaW5nIG5lZWRlZAorCisgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSA9IGdldFN0cmVhbUJ5SW5kZXgoMCk7CisgICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgIGNhbV9kaW1lbnNpb25fdCBkaW07CisgICAgICAgIG1lbXNldCgmZGltLCAwLCBzaXplb2YoZGltKSk7CisgICAgICAgIHN0cmVhbS0+Z2V0RnJhbWVEaW1lbnNpb24oZGltKTsKKworICAgICAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90IG9mZnNldDsKKyAgICAgICAgbWVtc2V0KCZvZmZzZXQsIDAsIHNpemVvZihjYW1fZnJhbWVfbGVuX29mZnNldF90KSk7CisgICAgICAgIHN0cmVhbS0+Z2V0RnJhbWVPZmZzZXQob2Zmc2V0KTsKKworICAgICAgICB1aW50MzJfdCByYXcxNl9zdHJpZGUgPSAoKHVpbnQzMl90KWRpbS53aWR0aCArIDE1VSkgJiB+MTVVOworICAgICAgICB1aW50MTZfdCogcmF3MTZfYnVmZmVyID0gKHVpbnQxNl90ICopZnJhbWUtPmJ1ZmZlcjsKKworICAgICAgICAvLyBJbi1wbGFjZSBmb3JtYXQgY29udmVyc2lvbi4KKyAgICAgICAgLy8gUmF3MTYgZm9ybWF0IGFsd2F5cyBvY2N1cHkgbW9yZSBtZW1vcnkgdGhhbiBvcGFxdWUgcmF3MTAuCisgICAgICAgIC8vIENvbnZlcnQgdG8gUmF3MTYgYnkgaXRlcmF0aW5nIHRocm91Z2ggYWxsIHBpeGVscyBmcm9tIGJvdHRvbS1yaWdodAorICAgICAgICAvLyB0byB0b3AtbGVmdCBvZiB0aGUgaW1hZ2UuCisgICAgICAgIC8vIE9uZSBzcGVjaWFsIG5vdGVzOgorICAgICAgICAvLyAxLiBDcm9zcy1wbGF0Zm9ybSByYXcxNidzIHN0cmlkZSBpcyAxNiBwaXhlbHMuCisgICAgICAgIC8vIDIuIG1pcGkgcmF3MTAncyBzdHJpZGUgaXMgNCBwaXhlbHMsIGFuZCBhbGlnbmVkIHRvIDE2IGJ5dGVzLgorICAgICAgICBmb3IgKGludDMyX3QgeXMgPSBkaW0uaGVpZ2h0IC0gMTsgeXMgPj0gMDsgeXMtLSkgeworICAgICAgICAgICAgdWludDMyX3QgeSA9ICh1aW50MzJfdCl5czsKKyAgICAgICAgICAgIHVpbnQ4X3QqIHJvd19zdGFydCA9ICh1aW50OF90ICopZnJhbWUtPmJ1ZmZlciArCisgICAgICAgICAgICAgICAgICAgIHkgKiAodWludDMyX3Qpb2Zmc2V0Lm1wWzBdLnN0cmlkZV9pbl9ieXRlczsKKyAgICAgICAgICAgIGZvciAoaW50MzJfdCB4cyA9IGRpbS53aWR0aCAtIDE7IHhzID49IDA7IHhzLS0pIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB4ID0gKHVpbnQzMl90KXhzOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXBwZXJfOGJpdCA9IHJvd19zdGFydFs1Kih4LzQpK3glNF07CisgICAgICAgICAgICAgICAgdWludDhfdCBsb3dlcl8yYml0ID0gKChyb3dfc3RhcnRbNSooeC80KSs0XSA+PiAoeCU0KSkgJiAweDMpOworICAgICAgICAgICAgICAgIHVpbnQxNl90IHJhdzE2X3BpeGVsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCkoKCh1aW50MTZfdCl1cHBlcl84Yml0KTw8MiB8CisgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QpbG93ZXJfMmJpdCk7CisgICAgICAgICAgICAgICAgcmF3MTZfYnVmZmVyW3kqcmF3MTZfc3RyaWRlK3hdID0gcmF3MTZfcGl4ZWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJDb3VsZCBub3QgZmluZCBzdHJlYW0iKTsKKyAgICB9CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRSZXByb2Nlc3NUeXBlCisgKgorICogREVTQ1JJUFRJT046IGdldCB0aGUgdHlwZSBvZiByZXByb2Nlc3Mgb3V0cHV0IHN1cHBvcnRlZCBieSB0aGlzIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDogTk9ORQorICoKKyAqIFJFVFVSTiAgICAgOiByZXByb2Nlc3NfdHlwZV90IDogdHlwZSBvZiByZXByb2Nlc3MKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworcmVwcm9jZXNzX3R5cGVfdCBRQ2FtZXJhM1Jhd0NoYW5uZWw6OmdldFJlcHJvY2Vzc1R5cGUoKQoreworICAgIHJldHVybiBSRVBST0NFU1NfVFlQRV9SQVc7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBSQVcgRHVtcCBDaGFubmVsIHJlbGF0ZWQgZnVuY3Rpb25zCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYTNSYXdEdW1wQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBDb25zdHJ1Y3RvciBmb3IgUmF3RHVtcENoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbV9oYW5kbGUgICAgOiBIYW5kbGUgZm9yIENhbWVyYQorICogICBAY2FtX29wcyAgICAgICA6IEZ1bmN0aW9uIHBvaW50ZXIgdGFibGUKKyAqICAgQHJhd0R1bXBTaXplICAgOiBEaW1lbnNpb25zIGZvciB0aGUgUmF3IHN0cmVhbQorICogICBAcGFkZGluZ2luZm8gICA6IFBhZGRpbmcgaW5mb3JtYXRpb24gZm9yIHN0cmVhbQorICogICBAdXNlckRhdGEgICAgICA6IENvb2tpZSBmb3IgcGFyZW50CisgKiAgIEBwcCBtYXNrICAgICAgIDogUFAgZmVhdHVyZSBtYXNrIGZvciB0aGlzIHN0cmVhbQorICogICBAbnVtQnVmZmVycyAgICA6IG51bWJlciBvZiBtYXggZGVxdWV1ZWQgYnVmZmVycworICoKKyAqIFJFVFVSTiAgICAgICAgICAgOiBOQQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhM1Jhd0R1bXBDaGFubmVsOjpRQ2FtZXJhM1Jhd0R1bXBDaGFubmVsKHVpbnQzMl90IGNhbV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCisgICAgICAgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCByYXdEdW1wU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLCB1aW50MzJfdCBudW1CdWZmZXJzKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwoY2FtX2hhbmRsZSwgY2hhbm5lbF9oYW5kbGUsIGNhbV9vcHMsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdJbmZvLCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSwgbnVtQnVmZmVycyksCisgICAgICAgICAgICAgICAgICAgICAgICBtRGltKHJhd0R1bXBTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZW1vcnkoTlVMTCkKK3sKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLnJhdy5kdW1wIiwgcHJvcCwgIjAiKTsKKyAgICBtUmF3RHVtcCA9IGF0b2kocHJvcCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYTNSYXdEdW1wQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBEZXN0cnVjdG9yIGZvciBSYXdEdW1wQ2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgICAgICAgOiBOQQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK1FDYW1lcmEzUmF3RHVtcENoYW5uZWw6On5RQ2FtZXJhM1Jhd0R1bXBDaGFubmVsKCkKK3sKKyAgICBkZXN0cm95KCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZHVtcFJhd1NuYXBzaG90CisgKgorICogREVTQ1JJUFRJT046IEhlbHBlciBmdW5jdGlvbiB0byBkdW1wIFJhdyBmcmFtZXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICBAZnJhbWUgICAgICA6IHN0cmVhbSBidWYgZnJhbWUgdG8gYmUgZHVtcGVkCisgKgorICogIFJFVFVSTiAgICAgIDogTkEKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1Jhd0R1bXBDaGFubmVsOjpkdW1wUmF3U25hcHNob3QobW1fY2FtZXJhX2J1Zl9kZWZfdCAqZnJhbWUpCit7CisgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSA9IGdldFN0cmVhbUJ5SW5kZXgoMCk7CisgICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgIGNoYXIgYnVmW0ZJTEVOQU1FX01BWF07CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICBzdHJ1Y3QgdG0gdGltZWluZm9fZGF0YTsKKyAgICAgICAgc3RydWN0IHRtICp0aW1laW5mbzsKKworICAgICAgICBjYW1fZGltZW5zaW9uX3QgZGltOworICAgICAgICBtZW1zZXQoJmRpbSwgMCwgc2l6ZW9mKGRpbSkpOworICAgICAgICBzdHJlYW0tPmdldEZyYW1lRGltZW5zaW9uKGRpbSk7CisKKyAgICAgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCBvZmZzZXQ7CisgICAgICAgIG1lbXNldCgmb2Zmc2V0LCAwLCBzaXplb2YoY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCkpOworICAgICAgICBzdHJlYW0tPmdldEZyYW1lT2Zmc2V0KG9mZnNldCk7CisKKyAgICAgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisgICAgICAgIHRpbWVpbmZvID0gbG9jYWx0aW1lX3IoJnR2LnR2X3NlYywgJnRpbWVpbmZvX2RhdGEpOworCisgICAgICAgIGlmIChOVUxMICE9IHRpbWVpbmZvKSB7CisgICAgICAgICAgICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICBRQ0FNRVJBX0RVTVBfRlJNX0xPQ0FUSU9OCisgICAgICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZC0lMDJkLSUwMmQtJTAyZC0lMDZsZF8lZF8lZHglZC5yYXciLAorICAgICAgICAgICAgICAgICAgICB0aW1laW5mby0+dG1feWVhciArIDE5MDAsIHRpbWVpbmZvLT50bV9tb24gKyAxLAorICAgICAgICAgICAgICAgICAgICB0aW1laW5mby0+dG1fbWRheSwgdGltZWluZm8tPnRtX2hvdXIsCisgICAgICAgICAgICAgICAgICAgIHRpbWVpbmZvLT50bV9taW4sIHRpbWVpbmZvLT50bV9zZWMsdHYudHZfdXNlYywKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmZyYW1lX2lkeCwgZGltLndpZHRoLCBkaW0uaGVpZ2h0KTsKKworICAgICAgICAgICAgaW50IGZpbGVfZmQgPSBvcGVuKGJ1ZiwgT19SRFdSfCBPX0NSRUFULCAwNzc3KTsKKyAgICAgICAgICAgIGlmIChmaWxlX2ZkID49IDApIHsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IHdyaXR0ZW5fbGVuID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlKGZpbGVfZmQsIGZyYW1lLT5idWZmZXIsIG9mZnNldC5mcmFtZV9sZW4pOworICAgICAgICAgICAgICAgIExPR0QoIndyaXR0ZW4gbnVtYmVyIG9mIGJ5dGVzICV6ZCIsIHdyaXR0ZW5fbGVuKTsKKyAgICAgICAgICAgICAgICBjbG9zZShmaWxlX2ZkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIG9wZW4gZmlsZSB0byBkdW1wIGltYWdlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJsb2NhbHRpbWVfcigpIGVycm9yIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJDb3VsZCBub3QgZmluZCBzdHJlYW0iKTsKKyAgICB9CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdHJlYW1DYlJvdXRpbmUKKyAqCisgKiBERVNDUklQVElPTjogQ2FsbGJhY2sgcm91dGluZSBpbnZva2VkIGZvciBlYWNoIGZyYW1lIGdlbmVyYXRlZCBmb3IKKyAqICAgICAgICAgICAgICBSYXdkdW1wIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN1cGVyX2ZyYW1lICA6IHN0cmVhbSBidWYgZnJhbWUgZ2VuZXJhdGVkCisgKiAgIEBzdHJlYW0gICAgICAgOiBVbmRlcmx5aW5nIFN0cmVhbSBvYmplY3QgY29va2llCisgKgorICogUkVUVVJOICAgICAgICAgIDogTkEKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1Jhd0R1bXBDaGFubmVsOjpzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fdW51c2VkIFFDYW1lcmEzU3RyZWFtICpzdHJlYW0pCit7CisgICAgTE9HRCgiRSIpOworICAgIGlmIChzdXBlcl9mcmFtZSA9PSBOVUxMIHx8IHN1cGVyX2ZyYW1lLT5udW1fYnVmcyAhPSAxKSB7CisgICAgICAgIExPR0UoInN1cGVyX2ZyYW1lIGlzIG5vdCB2YWxpZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1SYXdEdW1wKQorICAgICAgICBkdW1wUmF3U25hcHNob3Qoc3VwZXJfZnJhbWUtPmJ1ZnNbMF0pOworCisgICAgYnVmRG9uZShzdXBlcl9mcmFtZSk7CisgICAgZnJlZShzdXBlcl9mcmFtZSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0U3RyZWFtQnVmcworICoKKyAqIERFU0NSSVBUSU9OOiBDYWxsYmFjayBmdW5jdGlvbiBwcm92aWRlZCB0byBpbnRlcmZhY2UgdG8gZ2V0IGJ1ZmZlcnMuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBsZW4gICAgICAgOiBMZW5ndGggb2YgZWFjaCBidWZmZXIgdG8gYmUgYWxsb2NhdGVkCisgKgorICogUkVUVVJOICAgICA6IE5VTEwgb24gYnVmZmVyIGFsbG9jYXRpb24gZmFpbHVyZQorICogICAgICAgICAgICAgIFFDYW1lcmEzU3RyZWFtTWVtIG9iamVjdCBvbiBzdWNlc3MKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNTdHJlYW1NZW0qIFFDYW1lcmEzUmF3RHVtcENoYW5uZWw6OmdldFN0cmVhbUJ1ZnModWludDMyX3QgbGVuKQoreworICAgIGludCByYzsKKyAgICBtTWVtb3J5ID0gbmV3IFFDYW1lcmEzU3RyZWFtTWVtKG1OdW1CdWZmZXJzKTsKKworICAgIGlmICghbU1lbW9yeSkgeworICAgICAgICBMT0dFKCJ1bmFibGUgdG8gY3JlYXRlIGhlYXAgbWVtb3J5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByYyA9IG1NZW1vcnktPmFsbG9jYXRlQWxsKChzaXplX3QpbGVuKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoInVuYWJsZSB0byBhbGxvY2F0ZSBoZWFwIG1lbW9yeSIpOworICAgICAgICBkZWxldGUgbU1lbW9yeTsKKyAgICAgICAgbU1lbW9yeSA9IE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbU1lbW9yeTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwdXRTdHJlYW1CdWZzCisgKgorICogREVTQ1JJUFRJT046IENhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGVkIHRvIGludGVyZmFjZSB0byByZXR1cm4gYnVmZmVycy4KKyAqICAgICAgICAgICAgICBBbHRob3VnaCBubyBoYW5kbGVzIGFyZSBhY3R1YWxseSByZXR1cm5lZCwgaW1wbGljaXRsIGFzc3VtcHRpb24KKyAqICAgICAgICAgICAgICB0aGF0IGludGVyZmFjZSB3aWxsIG5vIGxvbmdlciB1c2UgYnVmZmVycyBhbmQgY2hhbm5lbCBjYW4KKyAqICAgICAgICAgICAgICBkZWFsbG9jYXRlZCBpZiBuZWNlc3NhcnkuCisgKgorICogUEFSQU1FVEVSUyA6IE5BCisgKgorICogUkVUVVJOICAgICA6IE5BCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNSYXdEdW1wQ2hhbm5lbDo6cHV0U3RyZWFtQnVmcygpCit7CisgICAgbU1lbW9yeS0+ZGVhbGxvY2F0ZSgpOworICAgIGRlbGV0ZSBtTWVtb3J5OworICAgIG1NZW1vcnkgPSBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gOiByZXF1ZXN0CisgKgorICogREVTQ1JJUFRJT046IFJlcXVlc3QgZnVuY3Rpb24gdXNlZCBhcyB0cmlnZ2VyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiBAcmVjdmRfZnJhbWUgOiBidWZmZXItIHRoaXMgd2lsbCBiZSBOVUxMIHNpbmNlIHRoaXMgaXMgaW50ZXJuYWwgY2hhbm5lbAorICogQGZyYW1lTnVtYmVyIDogVW5kZWZpbmVkIGFnYWluIHNpbmNlIHRoaXMgaXMgaW50ZXJuYWwgc3RyZWFtCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1Jhd0R1bXBDaGFubmVsOjpyZXF1ZXN0KGJ1ZmZlcl9oYW5kbGVfdCAqIC8qYnVmZmVyKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAvKmZyYW1lTnVtYmVyKi8pCit7CisgICAgaWYgKCFtX2JJc0FjdGl2ZSkgeworICAgICAgICByZXR1cm4gUUNhbWVyYTNDaGFubmVsOjpzdGFydCgpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gOiBpbnRpYWxpemUKKyAqCisgKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZXMgY2hhbm5lbCBwYXJhbXMgYW5kIGNyZWF0ZXMgdW5kZXJseWluZyBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgIEBpc1R5cGUgOiB0eXBlIG9mIGltYWdlIHN0YWJpbGl6YXRpb24gcmVxdWlyZWQgb24gdGhpcyBzdHJlYW0KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUmF3RHVtcENoYW5uZWw6OmluaXRpYWxpemUoY2FtX2lzX3R5cGVfdCBpc1R5cGUpCit7CisgICAgaW50MzJfdCByYzsKKworICAgIG1Jc1R5cGUgPSBpc1R5cGU7CisgICAgcmMgPSBRQ2FtZXJhM0NoYW5uZWw6OmFkZFN0cmVhbShDQU1fU1RSRUFNX1RZUEVfUkFXLAorICAgICAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX0dCUkcsIG1EaW0sIFJPVEFURV8wLCAodWludDhfdCltTnVtQnVmZmVycywKKyAgICAgICAgbVBvc3RQcm9jTWFzaywgbUlzVHlwZSk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJhZGRTdHJlYW0gZmFpbGVkIik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBRQ2FtZXJhM1lVVkNoYW5uZWwgbWV0aG9kcyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmEzWVVWQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhM1lVVkNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbV9oYW5kbGUgOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBjYW1fb3BzICAgIDogcHRyIHRvIGNhbWVyYSBvcHMgdGFibGUKKyAqICAgQGNiX3JvdXRpbmUgOiBjYWxsYmFjayByb3V0aW5lIHRvIGZyYW1lIGFnZ3JlZ2F0b3IKKyAqICAgQHBhZGRpbmdJbmZvIDogcGFkZGluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIHN0cmVhbQorICogICBAc3RyZWFtICAgICA6IGNhbWVyYTNfc3RyZWFtX3Qgc3RydWN0dXJlCisgKiAgIEBzdHJlYW1fdHlwZTogQ2hhbm5lbCBzdHJlYW0gdHlwZQorICogICBAcG9zdHByb2Nlc3NfbWFzazogdGhlIHBvc3Rwcm9jZXNzIG1hc2sgZm9yIHN0cmVhbXMgb2YgdGhpcyBjaGFubmVsCisgKiAgIEBtZXRhZGF0YUNoYW5uZWw6IGhhbmRsZSB0byB0aGUgbWV0YWRhdGFDaGFubmVsCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhM1lVVkNoYW5uZWw6OlFDYW1lcmEzWVVWQ2hhbm5lbCh1aW50MzJfdCBjYW1faGFuZGxlLAorICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKKyAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAorICAgICAgICBjaGFubmVsX2NiX3JvdXRpbmUgY2Jfcm91dGluZSwKKyAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbSwKKyAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUsCisgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKm1ldGFkYXRhQ2hhbm5lbCkgOgorICAgICAgICAgICAgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbChjYW1faGFuZGxlLCBjaGFubmVsX2hhbmRsZSwgY2FtX29wcywKKyAgICAgICAgICAgICAgICAgICAgY2Jfcm91dGluZSwgcGFkZGluZ0luZm8sIHVzZXJEYXRhLCBzdHJlYW0sIHN0cmVhbV90eXBlLAorICAgICAgICAgICAgICAgICAgICBwb3N0cHJvY2Vzc19tYXNrLCBtZXRhZGF0YUNoYW5uZWwpCit7CisKKyAgICBtQnlwYXNzID0gKHBvc3Rwcm9jZXNzX21hc2sgPT0gQ0FNX1FDT01fRkVBVFVSRV9OT05FKTsKKyAgICBtRnJhbWVMZW4gPSAwOworICAgIG1FZGdlTW9kZS5lZGdlX21vZGUgPSBDQU1fRURHRV9NT0RFX09GRjsKKyAgICBtRWRnZU1vZGUuc2hhcnBuZXNzID0gMDsKKyAgICBtTm9pc2VSZWRNb2RlID0gQ0FNX05PSVNFX1JFRFVDVElPTl9NT0RFX09GRjsKKyAgICBtZW1zZXQoJm1Dcm9wUmVnaW9uLCAwLCBzaXplb2YobUNyb3BSZWdpb24pKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYTNZVVZDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGRlc3RydWN0b3Igb2YgUUNhbWVyYTNZVVZDaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNZVVZDaGFubmVsOjp+UUNhbWVyYTNZVVZDaGFubmVsKCkKK3sKKyAgIC8vIERlYWxsb2NhdGlvbiBvZiBoZWFwIGJ1ZmZlcnMgYWxsb2NhdGVkIGluIG1NZW1vcnkgaXMgZnJlZWQKKyAgIC8vIGF1dG9tYXRpY2FsbHkgYnkgaXRzIGRlc3RydWN0b3IKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpbml0aWFsaXplCisgKgorICogREVTQ1JJUFRJT046IEluaXRpYWxpemUgYW5kIGFkZCBjYW1lcmEgY2hhbm5lbCAmIHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogQGlzVHlwZSAgICA6IHRoZSBpbWFnZSBzdGFiaWxpemF0aW9uIHR5cGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzWVVWQ2hhbm5lbDo6aW5pdGlhbGl6ZShjYW1faXNfdHlwZV90IGlzVHlwZSkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBjYW1fZGltZW5zaW9uX3Qgc3RyZWFtRGltOworCisgICAgaWYgKE5VTEwgPT0gbUNhbWVyYTNTdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiQ2FtZXJhIHN0cmVhbSB1bmluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmICgxIDw9IG1fbnVtU3RyZWFtcykgeworICAgICAgICAvLyBPbmx5IG9uZSBzdHJlYW0gcGVyIGNoYW5uZWwgc3VwcG9ydGVkIGluIHYzIEhhbAorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgbUlzVHlwZSAgPSBpc1R5cGU7CisgICAgbVN0cmVhbUZvcm1hdCA9IGdldFN0cmVhbURlZmF1bHRGb3JtYXQoQ0FNX1NUUkVBTV9UWVBFX0NBTExCQUNLKTsKKyAgICBzdHJlYW1EaW0ud2lkdGggPSBtQ2FtZXJhM1N0cmVhbS0+d2lkdGg7CisgICAgc3RyZWFtRGltLmhlaWdodCA9IG1DYW1lcmEzU3RyZWFtLT5oZWlnaHQ7CisKKyAgICByYyA9IFFDYW1lcmEzQ2hhbm5lbDo6YWRkU3RyZWFtKG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgbVN0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgIHN0cmVhbURpbSwKKyAgICAgICAgICAgIFJPVEFURV8wLAorICAgICAgICAgICAgbU51bUJ1ZnMsCisgICAgICAgICAgICBtUG9zdFByb2NNYXNrLAorICAgICAgICAgICAgbUlzVHlwZSk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJhZGRTdHJlYW0gZmFpbGVkIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBjYW1fc3RyZWFtX2J1Zl9wbGFuZV9pbmZvX3QgYnVmX3BsYW5lczsKKyAgICBjYW1fcGFkZGluZ19pbmZvX3QgcGFkZGluZ0luZm8gPSBtUGFkZGluZ0luZm87CisKKyAgICBtZW1zZXQoJmJ1Zl9wbGFuZXMsIDAsIHNpemVvZihidWZfcGxhbmVzKSk7CisgICAgLy90byBlbnN1cmUgYSBiaWcgZW5vdWdoIGJ1ZmZlciBzaXplIHNldCB0aGUgaGVpZ2h0IGFuZCB3aWR0aAorICAgIC8vcGFkZGluZyB0byBtYXgoaGVpZ2h0IHBhZGRpbmcsIHdpZHRoIHBhZGRpbmcpCisgICAgcGFkZGluZ0luZm8ud2lkdGhfcGFkZGluZyA9IE1BWChwYWRkaW5nSW5mby53aWR0aF9wYWRkaW5nLCBwYWRkaW5nSW5mby5oZWlnaHRfcGFkZGluZyk7CisgICAgcGFkZGluZ0luZm8uaGVpZ2h0X3BhZGRpbmcgPSBwYWRkaW5nSW5mby53aWR0aF9wYWRkaW5nOworCisgICAgcmMgPSBtbV9zdHJlYW1fY2FsY19vZmZzZXRfc25hcHNob3QobVN0cmVhbUZvcm1hdCwgJnN0cmVhbURpbSwgJnBhZGRpbmdJbmZvLAorICAgICAgICAgICAgJmJ1Zl9wbGFuZXMpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgibW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3ByZXZpZXcgZmFpbGVkIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBtRnJhbWVMZW4gPSBidWZfcGxhbmVzLnBsYW5lX2luZm8uZnJhbWVfbGVuOworCisgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgIExPR0UoIkluaXRpYWxpemUgZmFpbGVkLCByYyA9ICVkIiwgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBvZmZsaW5lIG1ldGEgbWVtb3J5IGZvciBpbnB1dCByZXByb2Nlc3MgKi8KKyAgICByYyA9IFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OmluaXRpYWxpemUoaXNUeXBlKTsKKyAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgiUHJvY2Vzc2luZyBDaGFubmVsIGluaXRpYWxpemUgZmFpbGVkLCByYyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgcmMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZXF1ZXN0CisgKgorICogREVTQ1JJUFRJT046IGVudHJ5IGZ1bmN0aW9uIGZvciBhIHJlcXVlc3Qgb24gYSBZVVYgc3RyZWFtLiBUaGlzIGZ1bmN0aW9uCisgKiAgICAgICAgICAgICAgaGFzIHRoZSBsb2dpYyB0byBzZXJ2aWNlIGEgcmVxdWVzdCBiYXNlZCBvbiBpdHMgdHlwZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogQGJ1ZmZlciAgICAgICAgICA6IHBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIKKyAqIEBmcmFtZU51bWJlciAgICAgOiBmcmFtZSBudW1iZXIgb2YgdGhlIHJlcXVlc3QKKyAqIEBwSW5wdXRCdWZmZXIgICAgOiBwb2ludGVyIHRvIGlucHV0IGJ1ZmZlciBpZiBhbiBpbnB1dCByZXF1ZXN0CisgKiBAbWV0YWRhdGEgICAgICAgIDogcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QKKyAqCisgKiBSRVRVUk4gICAgIDogMCBvbiBhIHN1Y2Nlc3Mgc3RhcnQgb2YgY2FwdHVyZQorICogICAgICAgICAgICAgIC1FSU5WQUwgb24gaW52YWxpZCBpbnB1dAorICogICAgICAgICAgICAgIC1FTk9ERVYgb24gc2VyaW91cyBlcnJvcgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzWVVWQ2hhbm5lbDo6cmVxdWVzdChidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwKKyAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KiBwSW5wdXRCdWZmZXIsCisgICAgICAgIG1ldGFkYXRhX2J1ZmZlcl90KiBtZXRhZGF0YSwgYm9vbCAmbmVlZE1ldGFkYXRhKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtT2ZmbGluZVBwTG9jayk7CisKKyAgICBMT0dEKCJwSW5wdXRCdWZmZXIgaXMgJXAgZnJhbWUgbnVtYmVyICVkIiwgcElucHV0QnVmZmVyLCBmcmFtZU51bWJlcik7CisgICAgaWYgKE5VTEwgPT0gYnVmZmVyIHx8IE5VTEwgPT0gbWV0YWRhdGEpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBidWZmZXIvbWV0YWRhdGEgaW4gY2hhbm5lbCByZXF1ZXN0Iik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgUHBJbmZvIHBwSW5mbzsKKyAgICBtZW1zZXQoJnBwSW5mbywgMCwgc2l6ZW9mKHBwSW5mbykpOworICAgIHBwSW5mby5mcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgIHBwSW5mby5vZmZsaW5lUHBGbGFnID0gZmFsc2U7CisgICAgaWYgKG1CeXBhc3MgJiYgIXBJbnB1dEJ1ZmZlciApIHsKKyAgICAgICAgcHBJbmZvLm9mZmxpbmVQcEZsYWcgPSBuZWVkc0ZyYW1lUG9zdHByb2Nlc3NpbmcobWV0YWRhdGEpOworICAgICAgICBwcEluZm8ub3V0cHV0ID0gYnVmZmVyOworICAgICAgICBtT2ZmbGluZVBwSW5mb0xpc3QucHVzaF9iYWNrKHBwSW5mbyk7CisgICAgfQorCisgICAgTE9HRCgib2ZmbGluZVBwRmxhZyBpcyAlZCIsIHBwSW5mby5vZmZsaW5lUHBGbGFnKTsKKyAgICBuZWVkTWV0YWRhdGEgPSBwcEluZm8ub2ZmbGluZVBwRmxhZzsKKyAgICBpZiAoIXBwSW5mby5vZmZsaW5lUHBGbGFnKSB7CisgICAgICAgIC8vIHJlZ3VsYXIgcmVxdWVzdAorICAgICAgICByZXR1cm4gUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbDo6cmVxdWVzdChidWZmZXIsIGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmZlciwgbWV0YWRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCFtX2JJc0FjdGl2ZSkgeworICAgICAgICAgICAgcmMgPSBzdGFydCgpOworICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKQorICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIlJlcXVlc3Qgb24gYW4gZXhpc3Rpbmcgc3RyZWFtIik7CisgICAgICAgIH0KKworICAgICAgICAvL3dlIG5lZWQgdG8gc2VuZCB0aGlzIGZyYW1lIHRocm91Z2ggdGhlIENQUAorICAgICAgICAvL0FsbG9jYXRlIGhlYXAgbWVtb3J5LCB0aGVuIGJ1ZiBkb25lIG9uIHRoZSBidWZmZXIKKyAgICAgICAgdWludDMyX3QgYnVmSWR4OworICAgICAgICBpZiAobUZyZWVIZWFwQnVmZmVyTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICByYyA9IG1NZW1vcnkuYWxsb2NhdGVPbmUobUZyYW1lTGVuKTsKKyAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgYWxsb2NhdGluZyBoZWFwIGJ1ZmZlci4gRmF0YWwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZJZHggPSAodWludDMyX3QpcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZJZHggPSAqKG1GcmVlSGVhcEJ1ZmZlckxpc3QuYmVnaW4oKSk7CisgICAgICAgICAgICBtRnJlZUhlYXBCdWZmZXJMaXN0LmVyYXNlKG1GcmVlSGVhcEJ1ZmZlckxpc3QuYmVnaW4oKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb25maWd1cmUgYW5kIHN0YXJ0IHBvc3Rwcm9jIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICByZXByb2Nlc3NfY29uZmlnX3QgcmVwcm9jX2NmZzsKKyAgICAgICAgY2FtX2RpbWVuc2lvbl90IGRpbTsKKyAgICAgICAgbWVtc2V0KCZyZXByb2NfY2ZnLCAwLCBzaXplb2YocmVwcm9jZXNzX2NvbmZpZ190KSk7CisgICAgICAgIG1lbXNldCgmZGltLCAwLCBzaXplb2YoZGltKSk7CisgICAgICAgIG1TdHJlYW1zWzBdLT5nZXRGcmFtZURpbWVuc2lvbihkaW0pOworICAgICAgICBzZXRSZXByb2NDb25maWcocmVwcm9jX2NmZywgTlVMTCwgbWV0YWRhdGEsIG1TdHJlYW1Gb3JtYXQsIGRpbSk7CisKKyAgICAgICAgLy8gU3RhcnQgcG9zdHByb2Nlc3NvciB3aXRob3V0IGlucHV0IGJ1ZmZlcgorICAgICAgICBzdGFydFBvc3RQcm9jKHJlcHJvY19jZmcpOworCisgICAgICAgIExPR0QoImVyYXNpbmcgJWQiLCBidWZJZHgpOworCisgICAgICAgIG1NZW1vcnkubWFya0ZyYW1lTnVtYmVyKGJ1ZklkeCwgZnJhbWVOdW1iZXIpOworICAgICAgICBtU3RyZWFtc1swXS0+YnVmRG9uZShidWZJZHgpOworCisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdHJlYW1DYlJvdXRpbmUKKyAqCisgKiBERVNDUklQVElPTjoKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqIEBzdXBlcl9mcmFtZSA6IHRoZSBzdXBlciBmcmFtZSB3aXRoIGZpbGxlZCBidWZmZXIKKyAqIEBzdHJlYW0gICAgICA6IHN0cmVhbSBvbiB3aGljaCB0aGUgYnVmZmVyIHdhcyByZXF1ZXN0ZWQgYW5kIGZpbGxlZAorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNZVVZDaGFubmVsOjpzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKKyAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIHVpbnQ4X3QgZnJhbWVJbmRleDsKKyAgICBpbnQzMl90IHJlc3VsdEZyYW1lTnVtYmVyOworCisgICAgaWYgKGNoZWNrU3RyZWFtQ2JFcnJvcnMoc3VwZXJfZnJhbWUsIHN0cmVhbSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRXJyb3Igd2l0aCB0aGUgc3RyZWFtIGNhbGxiYWNrIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmcmFtZUluZGV4ID0gKHVpbnQ4X3Qpc3VwZXJfZnJhbWUtPmJ1ZnNbMF0tPmJ1Zl9pZHg7CisgICAgaWYoZnJhbWVJbmRleCA+PSBtTnVtQnVmcykgeworICAgICAgICAgTE9HRSgiRXJyb3IsIEludmFsaWQgaW5kZXggZm9yIGJ1ZmZlciIpOworICAgICAgICAgc3RyZWFtLT5idWZEb25lKGZyYW1lSW5kZXgpOworICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQnlwYXNzKSB7CisgICAgICAgIExpc3Q8UHBJbmZvPjo6aXRlcmF0b3IgcHBJbmZvOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1PZmZsaW5lUHBMb2NrKTsKKyAgICAgICAgcmVzdWx0RnJhbWVOdW1iZXIgPSBtTWVtb3J5LmdldEZyYW1lTnVtYmVyKGZyYW1lSW5kZXgpOworICAgICAgICBmb3IgKHBwSW5mbyA9IG1PZmZsaW5lUHBJbmZvTGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgIHBwSW5mbyAhPSBtT2ZmbGluZVBwSW5mb0xpc3QuZW5kKCk7IHBwSW5mbysrKSB7CisgICAgICAgICAgICBpZiAocHBJbmZvLT5mcmFtZU51bWJlciA9PSAodWludDMyX3QpcmVzdWx0RnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMT0dEKCJmcmFtZSBpbmRleCAlZCwgZnJhbWUgbnVtYmVyICVkIiwgZnJhbWVJbmRleCwgcmVzdWx0RnJhbWVOdW1iZXIpOworICAgICAgICAvL2NoZWNrIHRoZSByZXByb2Nlc3NpbmcgcmVxdWlyZWQgZmxhZyBhZ2FpbnN0IHRoZSBmcmFtZSBudW1iZXIKKyAgICAgICAgaWYgKHBwSW5mbyA9PSBtT2ZmbGluZVBwSW5mb0xpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgIExPR0UoIkVycm9yLCByZXF1ZXN0IGZvciBmcmFtZSBudW1iZXIgaXMgYSByZXByb2Nlc3MuIik7CisgICAgICAgICAgICBzdHJlYW0tPmJ1ZkRvbmUoZnJhbWVJbmRleCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAocHBJbmZvLT5vZmZsaW5lUHBGbGFnKSB7CisgICAgICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lID0KKyAgICAgICAgICAgICAgICAgICAgKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqKW1hbGxvYyhzaXplb2YobW1fY2FtZXJhX3N1cGVyX2J1Zl90KSk7CisgICAgICAgICAgICBpZiAoZnJhbWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IHRvIHNhdmUgcmVjZWl2ZWRfZnJhbWUgc3RydWN0dXJlLiIpOworICAgICAgICAgICAgICAgIGlmKHN0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmJ1ZkRvbmUoZnJhbWVJbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKmZyYW1lID0gKnN1cGVyX2ZyYW1lOworICAgICAgICAgICAgbV9wb3N0cHJvY2Vzc29yLnByb2Nlc3NEYXRhKGZyYW1lLCBwcEluZm8tPm91dHB1dCwgcmVzdWx0RnJhbWVOdW1iZXIpOworICAgICAgICAgICAgZnJlZShzdXBlcl9mcmFtZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocHBJbmZvICE9IG1PZmZsaW5lUHBJbmZvTGlzdC5iZWdpbigpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgcGVuZGluZyByZXByb2Nlc3MgYnVmZmVyLCBjYWNoZSBjdXJyZW50IGJ1ZmZlcgorICAgICAgICAgICAgICAgIGlmIChwcEluZm8tPmNhbGxiYWNrX2J1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkZhdGFsOiBjYWNoZWQgY2FsbGJhY2tfYnVmZmVyIGlzIGFscmVhZHkgcHJlc2VudCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcEluZm8tPmNhbGxiYWNrX2J1ZmZlciA9IHN1cGVyX2ZyYW1lOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU9mZmxpbmVQcEluZm9MaXN0LmVyYXNlKHBwSW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsOjpzdHJlYW1DYlJvdXRpbmUoc3VwZXJfZnJhbWUsIHN0cmVhbSk7CisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlcHJvY2Vzc0NiUm91dGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIHJlcHJvY2Vzc2VkIGZyYW1lLiBUaGlzIGZyYW1lIG5vdworICogICAgICAgICAgICAgIHNob3VsZCBiZSByZXR1cm5lZCB0byB0aGUgZnJhbWV3b3JrLiBUaGlzIHNhbWUgY2FsbGJhY2sgaXMKKyAqICAgICAgICAgICAgICB1c2VkIGR1cmluZyBpbnB1dCByZXByb2Nlc3Npbmcgb3Igb2ZmbGluZSBwb3N0cHJvY2Vzc2luZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogQHJlc3VsdEJ1ZmZlciAgICAgIDogYnVmZmVyIGNvbnRhaW5pbmcgdGhlIHJlcHJvY2Vzc2VkIGRhdGEKKyAqIEByZXN1bHRGcmFtZU51bWJlciA6IGZyYW1lIG51bWJlciBvbiB3aGljaCB0aGUgYnVmZmVyIHdhcyByZXF1ZXN0ZWQKKyAqCisgKiBSRVRVUk4gICAgIDogTk9ORQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1lVVkNoYW5uZWw6OnJlcHJvY2Vzc0NiUm91dGluZShidWZmZXJfaGFuZGxlX3QgKnJlc3VsdEJ1ZmZlciwKKyAgICAgICAgdWludDMyX3QgcmVzdWx0RnJhbWVOdW1iZXIpCit7CisgICAgTE9HRCgiRTogZnJhbWUgbnVtYmVyICVkIiwgcmVzdWx0RnJhbWVOdW1iZXIpOworICAgIFZlY3RvcjxtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKj4gcGVuZGluZ0NiczsKKworICAgIC8qIHJlbGVhc2UgdGhlIGlucHV0IGJ1ZmZlciBhbmQgaW5wdXQgbWV0YWRhdGEgYnVmZmVyIGlmIHVzZWQgKi8KKyAgICBpZiAoMCA+IG1NZW1vcnkuZ2V0SGVhcEJ1ZmZlckluZGV4KHJlc3VsdEZyYW1lTnVtYmVyKSkgeworICAgICAgICAvKiBtT2ZmbGluZU1lbW9yeSBhbmQgbU9mZmxpbmVNZXRhTWVtb3J5IHVzZWQgb25seSBmb3IgaW5wdXQgcmVwcm9jZXNzaW5nICovCisgICAgICAgIGludDMyX3QgcmMgPSByZWxlYXNlT2ZmbGluZU1lbW9yeShyZXN1bHRGcmFtZU51bWJlcik7CisgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgTE9HRSgiRXJyb3IgcmVsZWFzaW5nIG9mZmxpbmUgbWVtb3J5IHJjID0gJWQiLCByYyk7CisgICAgICAgIH0KKyAgICAgICAgLyogU2luY2UgcmVwcm9jZXNzaW5nIGlzIGRvbmUsIHNlbmQgdGhlIGNhbGxiYWNrIHRvIHJlbGVhc2UgdGhlIGlucHV0IGJ1ZmZlciAqLworICAgICAgICBpZiAobUNoYW5uZWxDQikgeworICAgICAgICAgICAgbUNoYW5uZWxDQihOVUxMLCBOVUxMLCByZXN1bHRGcmFtZU51bWJlciwgdHJ1ZSwgbVVzZXJEYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtQnlwYXNzKSB7CisgICAgICAgIGludDMyX3QgcmMgPSBoYW5kbGVPZmZsaW5lUHBDYWxsYmFjayhyZXN1bHRGcmFtZU51bWJlciwgcGVuZGluZ0Nicyk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaXNzdWVDaGFubmVsQ2IocmVzdWx0QnVmZmVyLCByZXN1bHRGcmFtZU51bWJlcik7CisKKyAgICAvLyBDYWxsIGFsbCBwZW5kaW5nIGNhbGxiYWNrcyB0byByZXR1cm4gYnVmZmVycworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGVuZGluZ0Nicy5zaXplKCk7IGkrKykgeworICAgICAgICBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsOjpzdHJlYW1DYlJvdXRpbmUoCisgICAgICAgICAgICAgICAgcGVuZGluZ0Nic1tpXSwgbVN0cmVhbXNbMF0pOworICAgIH0KKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG5lZWRzRnJhbWVQb3N0cHJvY2Vzc2luZworICoKKyAqIERFU0NSSVBUSU9OOgorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOgorICogIFRSVUUgaWYgZnJhbWUgbmVlZHMgdG8gYmUgcG9zdHByb2Nlc3NlZAorICogIEZBTFNFIGlzIGZyYW1lIGRvZXMgbm90IG5lZWQgdG8gYmUgcG9zdHByb2Nlc3NlZAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhM1lVVkNoYW5uZWw6Om5lZWRzRnJhbWVQb3N0cHJvY2Vzc2luZyhtZXRhZGF0YV9idWZmZXJfdCAqbWV0YSkKK3sKKyAgICBib29sIHBwTmVlZGVkID0gZmFsc2U7CisKKyAgICAvL3NoYXJwbmVzcworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9lZGdlX2FwcGxpY2F0aW9uX3QsIGVkZ2VNb2RlLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9FREdFX01PREUsIG1ldGEpIHsKKyAgICAgICAgbUVkZ2VNb2RlID0gKmVkZ2VNb2RlOworICAgIH0KKworICAgIC8vd25yCisgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIG5vaXNlUmVkTW9kZSwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfTk9JU0VfUkVEVUNUSU9OX01PREUsIG1ldGEpIHsKKyAgICAgICAgbU5vaXNlUmVkTW9kZSA9ICpub2lzZVJlZE1vZGU7CisgICAgfQorCisgICAgLy9jcm9wIHJlZ2lvbgorICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9jcm9wX3JlZ2lvbl90LCBzY2FsZXJDcm9wUmVnaW9uLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9TQ0FMRVJfQ1JPUF9SRUdJT04sIG1ldGEpIHsKKyAgICAgICAgbUNyb3BSZWdpb24gPSAqc2NhbGVyQ3JvcFJlZ2lvbjsKKyAgICB9CisKKyAgICBpZiAoKENBTV9FREdFX01PREVfT0ZGICE9IG1FZGdlTW9kZS5lZGdlX21vZGUpICYmCisgICAgICAgICAgICAoQ0FNX0VER0VfTU9ERV9aRVJPX1NIVVRURVJfTEFHICE9IG1FZGdlTW9kZS5lZGdlX21vZGUpKSB7CisgICAgICAgIHBwTmVlZGVkID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKChDQU1fTk9JU0VfUkVEVUNUSU9OX01PREVfWkVST19TSFVUVEVSX0xBRyAhPSBtTm9pc2VSZWRNb2RlKSAmJgorICAgICAgICAgICAgKENBTV9OT0lTRV9SRURVQ1RJT05fTU9ERV9PRkYgIT0gbU5vaXNlUmVkTW9kZSkgJiYKKyAgICAgICAgICAgIChDQU1fTk9JU0VfUkVEVUNUSU9OX01PREVfTUlOSU1BTCAhPSBtTm9pc2VSZWRNb2RlKSkgeworICAgICAgICBwcE5lZWRlZCA9IHRydWU7CisgICAgfQorICAgIGlmICgobUNyb3BSZWdpb24ud2lkdGggPCAoaW50MzJfdCltQ2FtZXJhM1N0cmVhbS0+d2lkdGgpIHx8CisgICAgICAgICAgICAobUNyb3BSZWdpb24uaGVpZ2h0IDwgKGludDMyX3QpbUNhbWVyYTNTdHJlYW0tPmhlaWdodCkpIHsKKyAgICAgICAgcHBOZWVkZWQgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiBwcE5lZWRlZDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBoYW5kbGVPZmZsaW5lUHBDYWxsYmFjaworICoKKyAqIERFU0NSSVBUSU9OOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIHJlcHJvY2Vzc2VkIGZyYW1lIGZyb20gb2ZmbGluZQorICogICAgICAgICAgICAgIHBvc3Rwcm9jZXNzaW5nLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogQHJlc3VsdEZyYW1lTnVtYmVyIDogZnJhbWUgbnVtYmVyIG9uIHdoaWNoIHRoZSBidWZmZXIgd2FzIHJlcXVlc3RlZAorICogQHBlbmRpbmdDYnMgICAgICAgIDogcGVuZGluZyBidWZmZXJzIHRvIGJlIHJldHVybmVkIGZpcnN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1lVVkNoYW5uZWw6OmhhbmRsZU9mZmxpbmVQcENhbGxiYWNrKHVpbnQzMl90IHJlc3VsdEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgVmVjdG9yPG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqPiYgcGVuZGluZ0NicykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtT2ZmbGluZVBwTG9jayk7CisgICAgTGlzdDxQcEluZm8+OjppdGVyYXRvciBwcEluZm87CisKKyAgICBmb3IgKHBwSW5mbyA9IG1PZmZsaW5lUHBJbmZvTGlzdC5iZWdpbigpOworICAgICAgICAgICAgcHBJbmZvICE9IG1PZmZsaW5lUHBJbmZvTGlzdC5lbmQoKTsgcHBJbmZvKyspIHsKKyAgICAgICAgaWYgKHBwSW5mby0+ZnJhbWVOdW1iZXIgPT0gcmVzdWx0RnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBwSW5mbyA9PSBtT2ZmbGluZVBwSW5mb0xpc3QuZW5kKCkpIHsKKyAgICAgICAgTE9HSSgiUmVxdWVzdCBvZiBmcmFtZSBudW1iZXIgJWQgaXMgcmVwcm9jZXNzaW5nIiwKKyAgICAgICAgICAgICAgICAgcmVzdWx0RnJhbWVOdW1iZXIpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIGlmIChwcEluZm8gIT0gbU9mZmxpbmVQcEluZm9MaXN0LmJlZ2luKCkpIHsKKyAgICAgICAgTE9HRSgiY2FsbGJhY2sgZm9yIGZyYW1lIG51bWJlciAlZCBzaG91bGQgYmUgaGVhZCBvZiBsaXN0IiwKKyAgICAgICAgICAgICAgICAgcmVzdWx0RnJhbWVOdW1iZXIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChwcEluZm8tPm9mZmxpbmVQcEZsYWcpIHsKKyAgICAgICAgLy8gTmVlZCB0byBnZXQgdGhlIGlucHV0IGJ1ZmZlciBmcmFtZSBpbmRleCBmcm9tIHRoZQorICAgICAgICAvLyBtTWVtb3J5IG9iamVjdCBhbmQgYWRkIHRoYXQgdG8gdGhlIGZyZWUgaGVhcCBidWZmZXJzIGxpc3QuCisgICAgICAgIGludDMyX3QgYnVmZmVySW5kZXggPQorICAgICAgICAgICAgICAgIG1NZW1vcnkuZ2V0SGVhcEJ1ZmZlckluZGV4KHJlc3VsdEZyYW1lTnVtYmVyKTsKKyAgICAgICAgaWYgKGJ1ZmZlckluZGV4IDwgMCkgeworICAgICAgICAgICAgTE9HRSgiRmF0YWwgJWQ6IG5vIGJ1ZmZlciBpbmRleCBmb3IgZnJhbWUgbnVtYmVyICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckluZGV4LCByZXN1bHRGcmFtZU51bWJlcik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1GcmVlSGVhcEJ1ZmZlckxpc3QucHVzaF9iYWNrKGJ1ZmZlckluZGV4KTsKKyAgICAgICAgbU1lbW9yeS5tYXJrRnJhbWVOdW1iZXIoYnVmZmVySW5kZXgsIC0xKTsKKyAgICAgICAgLy9Nb3ZlIGhlYXAgYnVmZmVyIGludG8gZnJlZSBwb29sIGFuZCBpbnZhbGlkYXRlIHRoZSBmcmFtZSBudW1iZXIKKyAgICAgICAgcHBJbmZvID0gbU9mZmxpbmVQcEluZm9MaXN0LmVyYXNlKHBwSW5mbyk7CisKKyAgICAgICAgLy8gUmV0dXJuIHBlbmRpbmcgYnVmZmVyIGNhbGxiYWNrcworICAgICAgICB3aGlsZSAocHBJbmZvICE9IG1PZmZsaW5lUHBJbmZvTGlzdC5lbmQoKSAmJgorICAgICAgICAgICAgICAgICFwcEluZm8tPm9mZmxpbmVQcEZsYWcgJiYgcHBJbmZvLT5jYWxsYmFja19idWZmZXIpIHsKKworICAgICAgICAgICAgLy8gQ2FsbCBzdHJlYW0gY2FsbGJhY2tzIGZvciBjYWNoZWQgYnVmZmVycworICAgICAgICAgICAgcGVuZGluZ0Nicy5wdXNoX2JhY2socHBJbmZvLT5jYWxsYmFja19idWZmZXIpOworCisgICAgICAgICAgICBwcEluZm8gPSBtT2ZmbGluZVBwSW5mb0xpc3QuZXJhc2UocHBJbmZvKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiRmF0YWw6IHJlcXVlc3Qgb2YgZnJhbWUgbnVtYmVyICVkIGRvZXNuJ3QgbmVlZCIKKyAgICAgICAgICAgICAgICAiIG9mZmxpbmUgcG9zdHByb2Nlc3NpbmcuIEhvd2V2ZXIgdGhlcmUgaXMiCisgICAgICAgICAgICAgICAgIiByZXByb2Nlc3NpbmcgY2FsbGJhY2suIiwKKyAgICAgICAgICAgICAgICByZXN1bHRGcmFtZU51bWJlcik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFJlcHJvY2Vzc1R5cGUKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IHRoZSB0eXBlIG9mIHJlcHJvY2VzcyBvdXRwdXQgc3VwcG9ydGVkIGJ5IHRoaXMgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOiBOT05FCisgKgorICogUkVUVVJOICAgICA6IHJlcHJvY2Vzc190eXBlX3QgOiB0eXBlIG9mIHJlcHJvY2VzcworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCityZXByb2Nlc3NfdHlwZV90IFFDYW1lcmEzWVVWQ2hhbm5lbDo6Z2V0UmVwcm9jZXNzVHlwZSgpCit7CisgICAgcmV0dXJuIFJFUFJPQ0VTU19UWVBFX1lVVjsKK30KKworLyogUUNhbWVyYTNQaWNDaGFubmVsIG1ldGhvZHMgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBqcGVnRXZ0SGFuZGxlCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIHJlZ2lzdGVyZCB0byBtbS1qcGVnLWludGVyZmFjZSB0byBoYW5kbGUganBlZyBldmVudHMuCisgICAgICAgICAgICAgICAgQ29uc3RydWN0IHJlc3VsdCBwYXlsb2FkIGFuZCBjYWxsIG1DaGFubmVsQ2IgdG8gZGVsaXZlciBidWZmZXIKKyAgICAgICAgICAgICAgICB0byBmcmFtZXdvcmsuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdGF0dXMgICAgOiBzdGF0dXMgb2YganBlZyBqb2IKKyAqICAgQGNsaWVudF9oZGw6IGpwZWcgY2xpZW50IGhhbmRsZQorICogICBAam9iSWQgICAgIDoganBlZyBqb2IgSWQKKyAqICAgQHBfb3VwdXQgICA6IHB0ciB0byBqcGVnIG91dHB1dCByZXN1bHQgc3RydWN0CisgKiAgIEB1c2VyZGF0YSAgOiB1c2VyIGRhdGEgcHRyCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1BpY0NoYW5uZWw6OmpwZWdFdnRIYW5kbGUoanBlZ19qb2Jfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IC8qY2xpZW50X2hkbCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGpvYklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2pwZWdfb3V0cHV0X3QgKnBfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgYnVmZmVyX2hhbmRsZV90ICpyZXN1bHRCdWZmZXIgPSBOVUxMOworICAgIGJ1ZmZlcl9oYW5kbGVfdCAqanBlZ0J1ZmZlckhhbmRsZSA9IE5VTEw7CisgICAgaW50IHJlc3VsdFN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSzsKKyAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCByZXN1bHQ7CisgICAgY2FtZXJhM19qcGVnX2Jsb2JfdCBqcGVnSGVhZGVyOworCisgICAgS1BJX0FUUkFDRV9JTlQoIlNOQVBTSE9UIiwgMCk7CisgICAgUUNhbWVyYTNQaWNDaGFubmVsICpvYmogPSAoUUNhbWVyYTNQaWNDaGFubmVsICopdXNlcmRhdGE7CisgICAgaWYgKG9iaikgeworICAgICAgICAvL0NvbnN0cnVjdCBwYXlsb2FkIGZvciBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0LiBDYWxsIG1DaGFubmVsQ2IKKworICAgICAgICBxY2FtZXJhX2hhbDNfanBlZ19kYXRhX3QgKmpvYiA9IG9iai0+bV9wb3N0cHJvY2Vzc29yLmZpbmRKcGVnSm9iQnlKb2JJZChqb2JJZCk7CisKKyAgICAgICAgaWYgKChqb2IgPT0gTlVMTCkgfHwgKHN0YXR1cyA9PSBKUEVHX0pPQl9TVEFUVVNfRVJST1IpKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciBpbiBqb2JJZDogKCVkKSB3aXRoIHN0YXR1czogJWQiLCBqb2JJZCwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJlc3VsdFN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChOVUxMICE9IGpvYikgeworICAgICAgICAgICAgdWludDMyX3QgYnVmSWR4ID0gKHVpbnQzMl90KWpvYi0+anBlZ19zZXR0aW5ncy0+b3V0X2J1Zl9pbmRleDsKKyAgICAgICAgICAgIExPR0QoImpwZWcgb3V0X2J1Zl9pbmRleDogJWQiLCBidWZJZHgpOworCisgICAgICAgICAgICAvL0NvbnN0cnVjdCBqcGVnIHRyYW5zaWVudCBoZWFkZXIgb2YgdHlwZSBjYW1lcmEzX2pwZWdfYmxvYl90CisgICAgICAgICAgICAvL0FwcGVuZCBhdCB0aGUgZW5kIG9mIGpwZWcgaW1hZ2Ugb2YgYnVmX2ZpbGxlZF9sZW4gc2l6ZQorCisgICAgICAgICAgICBqcGVnSGVhZGVyLmpwZWdfYmxvYl9pZCA9IENBTUVSQTNfSlBFR19CTE9CX0lEOworICAgICAgICAgICAgaWYgKEpQRUdfSk9CX1NUQVRVU19ET05FID09IHN0YXR1cykgeworICAgICAgICAgICAgICAgIGpwZWdIZWFkZXIuanBlZ19zaXplID0gKHVpbnQzMl90KXBfb3V0cHV0LT5idWZfZmlsbGVkX2xlbjsKKyAgICAgICAgICAgICAgICBjaGFyKiBqcGVnX2J1ZiA9IChjaGFyICopcF9vdXRwdXQtPmJ1Zl92YWRkcjsKKworICAgICAgICAgICAgICAgIHNzaXplX3QgbWF4SnBlZ1NpemUgPSAtMTsKKworICAgICAgICAgICAgICAgIC8vIEdyYWxsb2MgYnVmZmVyIG1heSBoYXZlIGFkZGl0aW9uYWwgcGFkZGluZyBmb3IgNEsgcGFnZSBzaXplCisgICAgICAgICAgICAgICAgLy8gRm9sbG93IHNpemUgZ3VpZGVsaW5lcyBiYXNlZCBvbiBzcGVjIHNpbmNlIGZyYW1ld29yayByZWxpZXMKKyAgICAgICAgICAgICAgICAvLyBvbiB0aGF0IHRvIHJlYWNoIGVuZCBvZiBidWZmZXIgYW5kIHdpdGggaXQgdGhlIGhlYWRlcgorCisgICAgICAgICAgICAgICAgLy9IYW5kbGUgc2FtZSBhcyByZXN1bHRCdWZmZXIsIGJ1dCBmb3IgcmVhZGFibGl0eQorICAgICAgICAgICAgICAgIGpwZWdCdWZmZXJIYW5kbGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlcl9oYW5kbGVfdCAqKW9iai0+bU1lbW9yeS5nZXRCdWZmZXJIYW5kbGUoYnVmSWR4KTsKKworICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IGpwZWdCdWZmZXJIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4SnBlZ1NpemUgPSAoKHByaXZhdGVfaGFuZGxlX3QqKSgqanBlZ0J1ZmZlckhhbmRsZSkpLT53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heEpwZWdTaXplID4gb2JqLT5tTWVtb3J5LmdldFNpemUoYnVmSWR4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4SnBlZ1NpemUgPSBvYmotPm1NZW1vcnkuZ2V0U2l6ZShidWZJZHgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGpwZWdfZW9mX29mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkobWF4SnBlZ1NpemUgLSAoc3NpemVfdClzaXplb2YoanBlZ0hlYWRlcikpOworICAgICAgICAgICAgICAgICAgICBjaGFyICpqcGVnX2VvZiA9ICZqcGVnX2J1ZltqcGVnX2VvZl9vZmZzZXRdOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoanBlZ19lb2YsICZqcGVnSGVhZGVyLCBzaXplb2YoanBlZ0hlYWRlcikpOworICAgICAgICAgICAgICAgICAgICBvYmotPm1NZW1vcnkuY2xlYW5JbnZhbGlkYXRlQ2FjaGUoYnVmSWR4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJKUEVHIGJ1ZmZlciBub3QgZm91bmQgYW5kIGluZGV4OiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmSWR4KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0U3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vL1VzZSBiZWxvdyBkYXRhIHRvIGlzc3VlIGZyYW1ld29yayBjYWxsYmFjaworICAgICAgICAgICAgcmVzdWx0QnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgKGJ1ZmZlcl9oYW5kbGVfdCAqKW9iai0+bU1lbW9yeS5nZXRCdWZmZXJIYW5kbGUoYnVmSWR4KTsKKyAgICAgICAgICAgIGludDMyX3QgcmVzdWx0RnJhbWVOdW1iZXIgPSBvYmotPm1NZW1vcnkuZ2V0RnJhbWVOdW1iZXIoYnVmSWR4KTsKKyAgICAgICAgICAgIGludDMyX3QgcmMgPSBvYmotPm1NZW1vcnkudW5yZWdpc3RlckJ1ZmZlcihidWZJZHgpOworICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgJWQgdW5yZWdpc3RlcmluZyBzdHJlYW0gYnVmZmVyICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHJjLCBidWZJZHgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQuc3RyZWFtID0gb2JqLT5tQ2FtZXJhM1N0cmVhbTsKKyAgICAgICAgICAgIHJlc3VsdC5idWZmZXIgPSByZXN1bHRCdWZmZXI7CisgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gcmVzdWx0U3RhdHVzOworICAgICAgICAgICAgcmVzdWx0LmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgIHJlc3VsdC5yZWxlYXNlX2ZlbmNlID0gLTE7CisKKyAgICAgICAgICAgIC8vIFJlbGVhc2UgYW55IHNuYXBzaG90IGJ1ZmZlcnMgYmVmb3JlIGNhbGxpbmcKKyAgICAgICAgICAgIC8vIHRoZSB1c2VyIGNhbGxiYWNrLiBUaGUgY2FsbGJhY2sgY2FuIHBvdGVudGlhbGx5CisgICAgICAgICAgICAvLyB1bmJsb2NrIHBlbmRpbmcgcmVxdWVzdHMgdG8gc25hcHNob3Qgc3RyZWFtLgorICAgICAgICAgICAgaW50MzJfdCBzbmFwc2hvdElkeCA9IC0xOworICAgICAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90KiBzcmNfZnJhbWUgPSBOVUxMOworCisgICAgICAgICAgICBpZiAoam9iLT5zcmNfcmVwcm9jX2ZyYW1lKQorICAgICAgICAgICAgICAgIHNyY19mcmFtZSA9IGpvYi0+c3JjX3JlcHJvY19mcmFtZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzcmNfZnJhbWUgPSBqb2ItPnNyY19mcmFtZTsKKworICAgICAgICAgICAgaWYgKHNyY19mcmFtZSkgeworICAgICAgICAgICAgICAgIGlmIChvYmotPm1TdHJlYW1zWzBdLT5nZXRNeUhhbmRsZSgpID09CisgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZnJhbWUtPmJ1ZnNbMF0tPnN0cmVhbV9pZCkgeworICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdElkeCA9IChpbnQzMl90KXNyY19mcmFtZS0+YnVmc1swXS0+YnVmX2lkeDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJTbmFwc2hvdCBzdHJlYW0gaWQgJWQgYW5kIHNvdXJjZSBmcmFtZSAlZCBkb24ndCBtYXRjaCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmotPm1TdHJlYW1zWzBdLT5nZXRNeUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19mcmFtZS0+YnVmc1swXS0+c3RyZWFtX2lkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoMCA8PSBzbmFwc2hvdElkeCkgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG9iai0+bUZyZWVCdWZmZXJzTG9jayk7CisgICAgICAgICAgICAgICAgb2JqLT5tRnJlZUJ1ZmZlckxpc3QucHVzaF9iYWNrKCh1aW50MzJfdClzbmFwc2hvdElkeCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIlNuYXBzaG90IGJ1ZmZlciBub3QgZm91bmQhIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExPR0koIklzc3VlIEpwZWcgQ2FsbGJhY2sgZnJhbWVOdW1iZXIgPSAlZCBzdGF0dXMgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZyYW1lTnVtYmVyLCByZXN1bHRTdGF0dXMpOworICAgICAgICAgICAgaWYgKG9iai0+bUNoYW5uZWxDQikgeworICAgICAgICAgICAgICAgIG9iai0+bUNoYW5uZWxDQihOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClyZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgb2JqLT5tVXNlckRhdGEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZWxlYXNlIGludGVybmFsIGRhdGEgZm9yIGpwZWcgam9iCisgICAgICAgICAgICBpZiAoKE5VTEwgIT0gam9iLT5md2tfZnJhbWUpIHx8IChOVUxMICE9IGpvYi0+ZndrX3NyY19idWZmZXIpKSB7CisgICAgICAgICAgICAgICAgLyogdW5yZWdpc3RlciBvZmZsaW5lIGlucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIGludDMyX3QgaW5wdXRCdWZJbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICBvYmotPm1PZmZsaW5lTWVtb3J5LmdldEdyYWxsb2NCdWZmZXJJbmRleCgodWludDMyX3QpcmVzdWx0RnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgIGlmICgwIDw9IGlucHV0QnVmSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBvYmotPm1PZmZsaW5lTWVtb3J5LnVucmVnaXN0ZXJCdWZmZXIoaW5wdXRCdWZJbmRleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiY291bGQgbm90IGZpbmQgdGhlIGlucHV0IGJ1ZiBpbmRleCwgZnJhbWUgbnVtYmVyICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgJWQgdW5yZWdpc3RlcmluZyBpbnB1dCBidWZmZXIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYywgYnVmSWR4KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiB1bnJlZ2lzdGVyIG9mZmxpbmUgbWV0YSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBpbnQzMl90IG1ldGFCdWZJbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICBvYmotPm1PZmZsaW5lTWV0YU1lbW9yeS5nZXRIZWFwQnVmZmVySW5kZXgoKHVpbnQzMl90KXJlc3VsdEZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBtZXRhQnVmSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sob2JqLT5tRnJlZU9mZmxpbmVNZXRhQnVmZmVyc0xvY2spOworICAgICAgICAgICAgICAgICAgICBvYmotPm1GcmVlT2ZmbGluZU1ldGFCdWZmZXJzTGlzdC5wdXNoX2JhY2soKHVpbnQzMl90KW1ldGFCdWZJbmRleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiY291bGQgbm90IGZpbmQgdGhlIGlucHV0IG1ldGEgYnVmIGluZGV4LCBmcmFtZSBudW1iZXIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRGcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb2JqLT5tX3Bvc3Rwcm9jZXNzb3IucmVsZWFzZU9mZmxpbmVCdWZmZXJzKGZhbHNlKTsKKyAgICAgICAgICAgIG9iai0+bV9wb3N0cHJvY2Vzc29yLnJlbGVhc2VKcGVnSm9iRGF0YShqb2IpOworICAgICAgICAgICAgZnJlZShqb2IpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuOworICAgICAgICAvLyB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiTnVsbCB1c2VyZGF0YSBpbiBqcGVnIGNhbGxiYWNrIik7CisgICAgfQorfQorCitRQ2FtZXJhM1BpY0NoYW5uZWw6OlFDYW1lcmEzUGljQ2hhbm5lbCh1aW50MzJfdCBjYW1faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2NiX3JvdXRpbmUgY2Jfcm91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IHBvc3Rwcm9jZXNzX21hc2ssCisgICAgICAgICAgICAgICAgICAgIF9fdW51c2VkIGJvb2wgaXM0S1ZpZGVvLAorICAgICAgICAgICAgICAgICAgICBib29sIGlzSW5wdXRTdHJlYW1Db25maWd1cmVkLAorICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKm1ldGFkYXRhQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtQnVmZmVycykgOgorICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbChjYW1faGFuZGxlLCBjaGFubmVsX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX29wcywgY2Jfcm91dGluZSwgcGFkZGluZ0luZm8sIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHByb2Nlc3NfbWFzaywgbWV0YWRhdGFDaGFubmVsLCBudW1CdWZmZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1TbmFwc2hvdEJ1ZnMoMCksCisgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJIaW50KGlzSW5wdXRTdHJlYW1Db25maWd1cmVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ZdXZNZW1vcnkoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVMZW4oMCkKK3sKKyAgICBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlKiBoYWxfb2JqID0gKFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UqKW1Vc2VyRGF0YTsKKyAgICBtX21heF9waWNfZGltID0gaGFsX29iai0+Y2FsY01heEpwZWdEaW0oKTsKKyAgICBtWXV2V2lkdGggPSBzdHJlYW0tPndpZHRoOworICAgIG1ZdXZIZWlnaHQgPSBzdHJlYW0tPmhlaWdodDsKKyAgICBtU3RyZWFtVHlwZSA9IENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVDsKKyAgICAvLyBVc2Ugc2FtZSBwaXhlbGZvcm1hdCBmb3IgNEsgdmlkZW8gY2FzZQorICAgIG1TdHJlYW1Gb3JtYXQgPSBnZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCk7CisgICAgaW50MzJfdCByYyA9IG1fcG9zdHByb2Nlc3Nvci5pbml0SnBlZyhqcGVnRXZ0SGFuZGxlLCAmbV9tYXhfcGljX2RpbSwgdGhpcyk7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgTE9HRSgiSW5pdCBQb3N0cHJvY2Vzc29yIGZhaWxlZCIpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBmbHVzaAorICoKKyAqIERFU0NSSVBUSU9OOiBmbHVzaCBwaWMgY2hhbm5lbCwgd2hpY2ggd2lsbCBzdG9wIGFsbCBwcm9jZXNzaW5nIHdpdGhpbiwgaW5jbHVkaW5nCisgKiAgICAgICAgICAgICAgdGhlIHJlcHJvY2Vzc2luZyBjaGFubmVsIGluIHBvc3Rwcm9jZXNzb3IgYW5kIFlVViBzdHJlYW0uCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUGljQ2hhbm5lbDo6Zmx1c2goKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpZighbV9iSXNBY3RpdmUpIHsKKyAgICAgICAgTE9HRSgiQXR0ZW1wdCB0byBmbHVzaCBpbmFjdGl2ZSBjaGFubmVsIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJjID0gbV9wb3N0cHJvY2Vzc29yLmZsdXNoKCk7CisgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgTE9HRSgiUG9zdHByb2Nlc3NvciBmbHVzaCBmYWlsZWQsIHJjID0gJWQiLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAoMCA8IG1PZmZsaW5lTWV0YU1lbW9yeS5nZXRDbnQoKSkgeworICAgICAgICBtT2ZmbGluZU1ldGFNZW1vcnkuZGVhbGxvY2F0ZSgpOworICAgIH0KKyAgICBpZiAoMCA8IG1PZmZsaW5lTWVtb3J5LmdldENudCgpKSB7CisgICAgICAgIG1PZmZsaW5lTWVtb3J5LnVucmVnaXN0ZXJCdWZmZXJzKCk7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GcmVlQnVmZmVyc0xvY2spOworICAgIG1GcmVlQnVmZmVyTGlzdC5jbGVhcigpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FtZXJhM1N0cmVhbS0+bWF4X2J1ZmZlcnM7IGkrKykgeworICAgICAgICBtRnJlZUJ1ZmZlckxpc3QucHVzaF9iYWNrKGkpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKworUUNhbWVyYTNQaWNDaGFubmVsOjp+UUNhbWVyYTNQaWNDaGFubmVsKCkKK3sKK30KKworaW50MzJfdCBRQ2FtZXJhM1BpY0NoYW5uZWw6OmluaXRpYWxpemUoY2FtX2lzX3R5cGVfdCBpc1R5cGUpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGNhbV9kaW1lbnNpb25fdCBzdHJlYW1EaW07CisgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZTsKKyAgICBjYW1fZm9ybWF0X3Qgc3RyZWFtRm9ybWF0OworCisgICAgaWYgKE5VTEwgPT0gbUNhbWVyYTNTdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiQ2FtZXJhIHN0cmVhbSB1bmluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmICgxIDw9IG1fbnVtU3RyZWFtcykgeworICAgICAgICAvLyBPbmx5IG9uZSBzdHJlYW0gcGVyIGNoYW5uZWwgc3VwcG9ydGVkIGluIHYzIEhhbAorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgbUlzVHlwZSA9IGlzVHlwZTsKKyAgICBzdHJlYW1UeXBlID0gbVN0cmVhbVR5cGU7CisgICAgc3RyZWFtRm9ybWF0ID0gbVN0cmVhbUZvcm1hdDsKKyAgICBzdHJlYW1EaW0ud2lkdGggPSAoaW50MzJfdCltWXV2V2lkdGg7CisgICAgc3RyZWFtRGltLmhlaWdodCA9IChpbnQzMl90KW1ZdXZIZWlnaHQ7CisKKyAgICBtTnVtU25hcHNob3RCdWZzID0gbUNhbWVyYTNTdHJlYW0tPm1heF9idWZmZXJzOworICAgIHJjID0gUUNhbWVyYTNDaGFubmVsOjphZGRTdHJlYW0oc3RyZWFtVHlwZSwgc3RyZWFtRm9ybWF0LCBzdHJlYW1EaW0sCisgICAgICAgICAgICBST1RBVEVfMCwgKHVpbnQ4X3QpbUNhbWVyYTNTdHJlYW0tPm1heF9idWZmZXJzLCBtUG9zdFByb2NNYXNrLAorICAgICAgICAgICAgbUlzVHlwZSk7CisKKyAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgiSW5pdGlhbGl6ZSBmYWlsZWQsIHJjID0gJWQiLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIG9mZmxpbmUgbWV0YSBtZW1vcnkgZm9yIGlucHV0IHJlcHJvY2VzcyAqLworICAgIHJjID0gUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbDo6aW5pdGlhbGl6ZShpc1R5cGUpOworICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICBMT0dFKCJQcm9jZXNzaW5nIENoYW5uZWwgaW5pdGlhbGl6ZSBmYWlsZWQsIHJjID0gJWQiLAorICAgICAgICAgICAgICAgICByYyk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlcXVlc3QKKyAqCisgKiBERVNDUklQVElPTjogaGFuZGxlIHRoZSByZXF1ZXN0IC0gZWl0aGVyIHdpdGggYW4gaW5wdXQgYnVmZmVyIG9yIGEgZGlyZWN0CisgKiAgICAgICAgICAgICAgb3V0cHV0IHJlcXVlc3QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqIEBidWZmZXIgICAgICAgOiBwb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyCisgKiBAZnJhbWVOdW1iZXIgIDogZnJhbWUgbnVtYmVyIG9mIHRoZSByZXF1ZXN0CisgKiBAcElucHV0QnVmZmVyIDogcG9pbnRlciB0byBpbnB1dCBidWZmZXIgaWYgYW4gaW5wdXQgcmVxdWVzdAorICogQG1ldGFkYXRhICAgICA6IHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0CisgKgorICogUkVUVVJOICAgICA6IDAgb24gYSBzdWNjZXNzIHN0YXJ0IG9mIGNhcHR1cmUKKyAqICAgICAgICAgICAgICAtRUlOVkFMIG9uIGludmFsaWQgaW5wdXQKKyAqICAgICAgICAgICAgICAtRU5PREVWIG9uIHNlcmlvdXMgZXJyb3IKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1BpY0NoYW5uZWw6OnJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsCisgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyLAorICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqcElucHV0QnVmZmVyLAorICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCAqbWV0YWRhdGEpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICAvL0ZJWCBNRTogUmV0dXJuIGJ1ZmZlciBiYWNrIGluIGNhc2Ugb2YgZmFpbHVyZXMgYmVsb3cuCisKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICByZXByb2Nlc3NfY29uZmlnX3QgcmVwcm9jX2NmZzsKKyAgICBjYW1fZGltZW5zaW9uX3QgZGltOworICAgIG1lbXNldCgmcmVwcm9jX2NmZywgMCwgc2l6ZW9mKHJlcHJvY2Vzc19jb25maWdfdCkpOworICAgIC8vbWFrZSBzdXJlIHRvIHNldCB0aGUgY29ycmVjdCBpbnB1dCBzdHJlYW0gZGltIGluIGNhc2Ugb2YgWVVWIHNpemUgb3ZlcnJpZGUKKyAgICAvL2FuZCByZWNhbGN1bGF0ZSB0aGUgcGxhbmUgaW5mbworICAgIGRpbS53aWR0aCA9IChpbnQzMl90KW1ZdXZXaWR0aDsKKyAgICBkaW0uaGVpZ2h0ID0gKGludDMyX3QpbVl1dkhlaWdodDsKKyAgICBzZXRSZXByb2NDb25maWcocmVwcm9jX2NmZywgcElucHV0QnVmZmVyLCBtZXRhZGF0YSwgbVN0cmVhbUZvcm1hdCwgZGltKTsKKworICAgIC8vIFBpY3R1cmUgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZCBiZWZvcmUgYW55IHJlcXVlc3QgY29tZXMgaW4KKyAgICBpZiAoIW1fYklzQWN0aXZlKSB7CisgICAgICAgIExPR0UoIkNoYW5uZWwgbm90IHN0YXJ0ZWQhISIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpbnQgaW5kZXggPSBtTWVtb3J5LmdldE1hdGNoQnVmSW5kZXgoKHZvaWQqKWJ1ZmZlcik7CisKKyAgICBpZihpbmRleCA8IDApIHsKKyAgICAgICAgcmMgPSByZWdpc3RlckJ1ZmZlcihidWZmZXIsIG1Jc1R5cGUpOworICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgIExPR0UoIk9uLXRoZS1mbHkgYnVmZmVyIHJlZ2lzdHJhdGlvbiBmYWlsZWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisKKyAgICAgICAgaW5kZXggPSBtTWVtb3J5LmdldE1hdGNoQnVmSW5kZXgoKHZvaWQqKWJ1ZmZlcik7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIkNvdWxkIG5vdCBmaW5kIG9iamVjdCBhbW9uZyByZWdpc3RlcmVkIGJ1ZmZlcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dEKCJidWZmZXIgaW5kZXggJWQsIGZyYW1lTnVtYmVyOiAldSIsIGluZGV4LCBmcmFtZU51bWJlcik7CisKKyAgICByYyA9IG1NZW1vcnkubWFya0ZyYW1lTnVtYmVyKCh1aW50MzJfdClpbmRleCwgZnJhbWVOdW1iZXIpOworCisgICAgLy8gU3RhcnQgcG9zdHByb2Nlc3NvcgorICAgIHN0YXJ0UG9zdFByb2MocmVwcm9jX2NmZyk7CisKKyAgICAvLyBRdWV1ZSBqcGVnIHNldHRpbmdzCisgICAgcmMgPSBxdWV1ZUpwZWdTZXR0aW5nKCh1aW50MzJfdClpbmRleCwgbWV0YWRhdGEpOworCisgICAgaWYgKHBJbnB1dEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GcmVlQnVmZmVyc0xvY2spOworICAgICAgICB1aW50MzJfdCBidWZJZHg7CisgICAgICAgIGlmIChtRnJlZUJ1ZmZlckxpc3QuZW1wdHkoKSkgeworICAgICAgICAgICAgcmMgPSBtWXV2TWVtb3J5LT5hbGxvY2F0ZU9uZShtRnJhbWVMZW4pOworICAgICAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBoZWFwIGJ1ZmZlci4gRmF0YWwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZklkeCA9ICh1aW50MzJfdClyYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExpc3Q8dWludDMyX3Q+OjppdGVyYXRvciBpdCA9IG1GcmVlQnVmZmVyTGlzdC5iZWdpbigpOworICAgICAgICAgICAgYnVmSWR4ID0gKml0OworICAgICAgICAgICAgbUZyZWVCdWZmZXJMaXN0LmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgICAgICBtWXV2TWVtb3J5LT5tYXJrRnJhbWVOdW1iZXIoYnVmSWR4LCBmcmFtZU51bWJlcik7CisgICAgICAgIG1TdHJlYW1zWzBdLT5idWZEb25lKGJ1ZklkeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICpzcmNfZnJhbWUgPSBOVUxMOworICAgICAgICBzcmNfZnJhbWUgPSAocWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICopY2FsbG9jKDEsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHFjYW1lcmFfZndrX2lucHV0X3BwX2RhdGFfdCkpOworICAgICAgICBpZiAoc3JjX2ZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3Igc3JjIGZyYW1lIik7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIHJjID0gc2V0RndrSW5wdXRQUERhdGEoc3JjX2ZyYW1lLCBwSW5wdXRCdWZmZXIsICZyZXByb2NfY2ZnLCBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICBOVUxMIC8qZndrIG91dHB1dCBidWZmZXIqLywgZnJhbWVOdW1iZXIpOworICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgIExPR0UoIkVycm9yICVkIHdoaWxlIHNldHRpbmcgZnJhbWV3b3JrIGlucHV0IFBQIGRhdGEiLCByYyk7CisgICAgICAgICAgICBmcmVlKHNyY19mcmFtZSk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICAgICAgTE9HSCgiUG9zdC1wcm9jZXNzIHN0YXJ0ZWQiKTsKKyAgICAgICAgbV9wb3N0cHJvY2Vzc29yLnByb2Nlc3NEYXRhKHNyY19mcmFtZSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGF0YU5vdGlmeUNCCisgKgorICogREVTQ1JJUFRJT046IENoYW5uZWwgTGV2ZWwgY2FsbGJhY2sgdXNlZCBmb3Igc3VwZXIgYnVmZmVyIGRhdGEgbm90aWZ5LgorICogICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCB3aXRoIG1tLWNhbWVyYS1pbnRlcmZhY2UgdG8gaGFuZGxlCisgKiAgICAgICAgICAgICAgZGF0YSBub3RpZnkKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHJlY3ZkX2ZyYW1lICAgOiBzdHJlYW0gZnJhbWUgcmVjZWl2ZWQKKyAqICAgdXNlcmRhdGEgICAgICAgOiB1c2VyIGRhdGEgcHRyCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1BpY0NoYW5uZWw6OmRhdGFOb3RpZnlDQihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnJlY3ZkX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBMT0dEKCJFXG4iKTsKKyAgICBRQ2FtZXJhM1BpY0NoYW5uZWwgKmNoYW5uZWwgPSAoUUNhbWVyYTNQaWNDaGFubmVsICopdXNlcmRhdGE7CisKKyAgICBpZiAoY2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoImludmFsaWQgY2hhbm5lbCBwb2ludGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZihjaGFubmVsLT5tX251bVN0cmVhbXMgIT0gMSkgeworICAgICAgICBMT0dFKCJFcnJvcjogQnVnOiBUaGlzIGNhbGxiYWNrIGFzc3VtZXMgb25lIHN0cmVhbSBwZXIgY2hhbm5lbCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisKKyAgICBpZihjaGFubmVsLT5tU3RyZWFtc1swXSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkVycm9yOiBJbnZhbGlkIFN0cmVhbSBvYmplY3QiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNoYW5uZWwtPlFDYW1lcmEzUGljQ2hhbm5lbDo6c3RyZWFtQ2JSb3V0aW5lKHJlY3ZkX2ZyYW1lLCBjaGFubmVsLT5tU3RyZWFtc1swXSk7CisKKyAgICBMT0dEKCJYXG4iKTsKKyAgICByZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RyZWFtQ2JSb3V0aW5lCisgKgorICogREVTQ1JJUFRJT046CisgKgorICogUEFSQU1FVEVSUyA6CisgKiBAc3VwZXJfZnJhbWUgOiB0aGUgc3VwZXIgZnJhbWUgd2l0aCBmaWxsZWQgYnVmZmVyCisgKiBAc3RyZWFtICAgICAgOiBzdHJlYW0gb24gd2hpY2ggdGhlIGJ1ZmZlciB3YXMgcmVxdWVzdGVkIGFuZCBmaWxsZWQKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzUGljQ2hhbm5lbDo6c3RyZWFtQ2JSb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3VwZXJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIC8vVE9ETworICAgIC8vVXNlZCBvbmx5IGZvciBnZXR0aW5nIFlVVi4gSnBlZyBjYWxsYmFjayB3aWxsIGJlIHNlbnQgYmFjayBmcm9tIGNoYW5uZWwKKyAgICAvL2RpcmVjdGx5IHRvIEhXSS4gUmVmZXIgdG8gZnVuYyBqcGVnRXZ0SGFuZGxlCisKKyAgICAvL0dvdCB0aGUgeXV2IGNhbGxiYWNrLiBDYWxsaW5nIHl1diBjYWxsYmFjayBoYW5kbGVyIGluIFBvc3RQcm9jCisgICAgdWludDhfdCBmcmFtZUluZGV4OworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCogZnJhbWUgPSBOVUxMOworICAgIGNhbV9kaW1lbnNpb25fdCBkaW07CisgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCBvZmZzZXQ7CisKKyAgICBtZW1zZXQoJmRpbSwgMCwgc2l6ZW9mKGRpbSkpOworICAgIG1lbXNldCgmb2Zmc2V0LCAwLCBzaXplb2YoY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCkpOworCisgICAgaWYgKGNoZWNrU3RyZWFtQ2JFcnJvcnMoc3VwZXJfZnJhbWUsIHN0cmVhbSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRXJyb3Igd2l0aCB0aGUgc3RyZWFtIGNhbGxiYWNrIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmcmFtZUluZGV4ID0gKHVpbnQ4X3Qpc3VwZXJfZnJhbWUtPmJ1ZnNbMF0tPmJ1Zl9pZHg7CisgICAgTE9HRCgicmVjdmQgYnVmX2lkeDogJXUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyIsCisgICAgICAgICAodWludDMyX3QpZnJhbWVJbmRleCk7CisgICAgaWYoZnJhbWVJbmRleCA+PSBtTnVtU25hcHNob3RCdWZzKSB7CisgICAgICAgICBMT0dFKCJFcnJvciwgSW52YWxpZCBpbmRleCBmb3IgYnVmZmVyIik7CisgICAgICAgICBpZihzdHJlYW0pIHsKKyAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtRnJlZUJ1ZmZlcnNMb2NrKTsKKyAgICAgICAgICAgICBtRnJlZUJ1ZmZlckxpc3QucHVzaF9iYWNrKGZyYW1lSW5kZXgpOworICAgICAgICAgICAgIHN0cmVhbS0+YnVmRG9uZShmcmFtZUluZGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmcmFtZSA9IChtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKiltYWxsb2Moc2l6ZW9mKG1tX2NhbWVyYV9zdXBlcl9idWZfdCkpOworICAgIGlmIChmcmFtZSA9PSBOVUxMKSB7CisgICAgICAgTE9HRSgiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgdG8gc2F2ZSByZWNlaXZlZF9mcmFtZSBzdHJ1Y3R1cmUuIik7CisgICAgICAgaWYoc3RyZWFtKSB7CisgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GcmVlQnVmZmVyc0xvY2spOworICAgICAgICAgICBtRnJlZUJ1ZmZlckxpc3QucHVzaF9iYWNrKGZyYW1lSW5kZXgpOworICAgICAgICAgICBzdHJlYW0tPmJ1ZkRvbmUoZnJhbWVJbmRleCk7CisgICAgICAgfQorICAgICAgIHJldHVybjsKKyAgICB9CisgICAgKmZyYW1lID0gKnN1cGVyX2ZyYW1lOworICAgIHN0cmVhbS0+Z2V0RnJhbWVEaW1lbnNpb24oZGltKTsKKyAgICBzdHJlYW0tPmdldEZyYW1lT2Zmc2V0KG9mZnNldCk7CisgICAgZHVtcFlVVihmcmFtZS0+YnVmc1swXSwgZGltLCBvZmZzZXQsIFFDQU1FUkFfRFVNUF9GUk1fSU5QVVRfUkVQUk9DRVNTKTsKKworICAgIG1fcG9zdHByb2Nlc3Nvci5wcm9jZXNzRGF0YShmcmFtZSk7CisgICAgZnJlZShzdXBlcl9mcmFtZSk7CisgICAgcmV0dXJuOworfQorCitRQ2FtZXJhM1N0cmVhbU1lbSogUUNhbWVyYTNQaWNDaGFubmVsOjpnZXRTdHJlYW1CdWZzKHVpbnQzMl90IGxlbikKK3sKKyAgICBtWXV2TWVtb3J5ID0gbmV3IFFDYW1lcmEzU3RyZWFtTWVtKG1DYW1lcmEzU3RyZWFtLT5tYXhfYnVmZmVycywgZmFsc2UpOworICAgIGlmICghbVl1dk1lbW9yeSkgeworICAgICAgICBMT0dFKCJ1bmFibGUgdG8gY3JlYXRlIG1ldGFkYXRhIG1lbW9yeSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbUZyYW1lTGVuID0gbGVuOworCisgICAgcmV0dXJuIG1ZdXZNZW1vcnk7Cit9CisKK3ZvaWQgUUNhbWVyYTNQaWNDaGFubmVsOjpwdXRTdHJlYW1CdWZzKCkKK3sKKyAgICBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsOjpwdXRTdHJlYW1CdWZzKCk7CisKKyAgICBtWXV2TWVtb3J5LT5kZWFsbG9jYXRlKCk7CisgICAgZGVsZXRlIG1ZdXZNZW1vcnk7CisgICAgbVl1dk1lbW9yeSA9IE5VTEw7CisgICAgbUZyZWVCdWZmZXJMaXN0LmNsZWFyKCk7Cit9CisKK2ludDMyX3QgUUNhbWVyYTNQaWNDaGFubmVsOjpxdWV1ZUpwZWdTZXR0aW5nKHVpbnQzMl90IGluZGV4LCBtZXRhZGF0YV9idWZmZXJfdCAqbWV0YWRhdGEpCit7CisgICAgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSogaGFsX29iaiA9IChRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlKiltVXNlckRhdGE7CisgICAganBlZ19zZXR0aW5nc190ICpzZXR0aW5ncyA9CisgICAgICAgICAgICAoanBlZ19zZXR0aW5nc190ICopbWFsbG9jKHNpemVvZihqcGVnX3NldHRpbmdzX3QpKTsKKworICAgIGlmICghc2V0dGluZ3MpIHsKKyAgICAgICAgTE9HRSgib3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGpwZWdfc2V0dGluZ3MiKTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorCisgICAgbWVtc2V0KHNldHRpbmdzLCAwLCBzaXplb2YoanBlZ19zZXR0aW5nc190KSk7CisKKyAgICBzZXR0aW5ncy0+b3V0X2J1Zl9pbmRleCA9IGluZGV4OworCisgICAgc2V0dGluZ3MtPmpwZWdfb3JpZW50YXRpb24gPSAwOworICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIG9yaWVudGF0aW9uLCBDQU1fSU5URl9NRVRBX0pQRUdfT1JJRU5UQVRJT04sIG1ldGFkYXRhKSB7CisgICAgICAgIHNldHRpbmdzLT5qcGVnX29yaWVudGF0aW9uID0gKm9yaWVudGF0aW9uOworICAgIH0KKworICAgIHNldHRpbmdzLT5qcGVnX3F1YWxpdHkgPSA4NTsKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgcXVhbGl0eTEsIENBTV9JTlRGX01FVEFfSlBFR19RVUFMSVRZLCBtZXRhZGF0YSkgeworICAgICAgICBzZXR0aW5ncy0+anBlZ19xdWFsaXR5ID0gKHVpbnQ4X3QpICpxdWFsaXR5MTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgcXVhbGl0eTIsIENBTV9JTlRGX01FVEFfSlBFR19USFVNQl9RVUFMSVRZLCBtZXRhZGF0YSkgeworICAgICAgICBzZXR0aW5ncy0+anBlZ190aHVtYl9xdWFsaXR5ID0gKHVpbnQ4X3QpICpxdWFsaXR5MjsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fZGltZW5zaW9uX3QsIGRpbWVuc2lvbiwgQ0FNX0lOVEZfTUVUQV9KUEVHX1RIVU1CX1NJWkUsIG1ldGFkYXRhKSB7CisgICAgICAgIHNldHRpbmdzLT50aHVtYm5haWxfc2l6ZSA9ICpkaW1lbnNpb247CisgICAgfQorCisgICAgc2V0dGluZ3MtPmdwc190aW1lc3RhbXBfdmFsaWQgPSAwOworICAgIElGX01FVEFfQVZBSUxBQkxFKGludDY0X3QsIHRpbWVzdGFtcCwgQ0FNX0lOVEZfTUVUQV9KUEVHX0dQU19USU1FU1RBTVAsIG1ldGFkYXRhKSB7CisgICAgICAgIHNldHRpbmdzLT5ncHNfdGltZXN0YW1wID0gKnRpbWVzdGFtcDsKKyAgICAgICAgc2V0dGluZ3MtPmdwc190aW1lc3RhbXBfdmFsaWQgPSAxOworICAgIH0KKworICAgIHNldHRpbmdzLT5ncHNfY29vcmRpbmF0ZXNfdmFsaWQgPSAwOworICAgIElGX01FVEFfQVZBSUxBQkxFKGRvdWJsZSwgY29vcmRpbmF0ZXMsIENBTV9JTlRGX01FVEFfSlBFR19HUFNfQ09PUkRJTkFURVMsIG1ldGFkYXRhKSB7CisgICAgICAgIG1lbWNweShzZXR0aW5ncy0+Z3BzX2Nvb3JkaW5hdGVzLCBjb29yZGluYXRlcywgMypzaXplb2YoZG91YmxlKSk7CisgICAgICAgIHNldHRpbmdzLT5ncHNfY29vcmRpbmF0ZXNfdmFsaWQgPSAxOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQ4X3QsIHByb2NfbWV0aG9kcywgQ0FNX0lOVEZfTUVUQV9KUEVHX0dQU19QUk9DX01FVEhPRFMsIG1ldGFkYXRhKSB7CisgICAgICAgIG1lbXNldChzZXR0aW5ncy0+Z3BzX3Byb2Nlc3NpbmdfbWV0aG9kLCAwLAorICAgICAgICAgICAgICAgIHNpemVvZihzZXR0aW5ncy0+Z3BzX3Byb2Nlc3NpbmdfbWV0aG9kKSk7CisgICAgICAgIHN0cmxjcHkoc2V0dGluZ3MtPmdwc19wcm9jZXNzaW5nX21ldGhvZCwgKGNvbnN0IGNoYXIgKilwcm9jX21ldGhvZHMsCisgICAgICAgICAgICAgICAgc2l6ZW9mKHNldHRpbmdzLT5ncHNfcHJvY2Vzc2luZ19tZXRob2QpKTsKKyAgICB9CisKKyAgICAvLyBJbWFnZSBkZXNjcmlwdGlvbgorICAgIGNvbnN0IGNoYXIgKmVlcHJvbVZlcnNpb24gPSBoYWxfb2JqLT5nZXRFZXByb21WZXJzaW9uSW5mbygpOworICAgIGNvbnN0IHVpbnQzMl90ICpsZGFmQ2FsaWIgPSBoYWxfb2JqLT5nZXRMZGFmQ2FsaWIoKTsKKyAgICBpZiAoKGVlcHJvbVZlcnNpb24gJiYgc3RybGVuKGVlcHJvbVZlcnNpb24pKSB8fAorICAgICAgICAgICAgbGRhZkNhbGliKSB7CisgICAgICAgIGludCBsZW4gPSAwOworICAgICAgICBzZXR0aW5ncy0+aW1hZ2VfZGVzY192YWxpZCA9IHRydWU7CisgICAgICAgIGlmIChlZXByb21WZXJzaW9uICYmIHN0cmxlbihlZXByb21WZXJzaW9uKSkgeworICAgICAgICAgICAgbGVuID0gc25wcmludGYoc2V0dGluZ3MtPmltYWdlX2Rlc2MsIHNpemVvZihzZXR0aW5ncy0+aW1hZ2VfZGVzYyksCisgICAgICAgICAgICAgICAgICAgICJNOiVzICIsIGVlcHJvbVZlcnNpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChsZGFmQ2FsaWIpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHNldHRpbmdzLT5pbWFnZV9kZXNjICsgbGVuLAorICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2V0dGluZ3MtPmltYWdlX2Rlc2MpIC0gbGVuLCAiTDoldS0ldSIsCisgICAgICAgICAgICAgICAgICAgIGxkYWZDYWxpYlswXSwgbGRhZkNhbGliWzFdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtX3Bvc3Rwcm9jZXNzb3IucHJvY2Vzc0pwZWdTZXR0aW5nRGF0YShzZXR0aW5ncyk7Cit9CisKKwordm9pZCBRQ2FtZXJhM1BpY0NoYW5uZWw6Om92ZXJyaWRlWXV2U2l6ZSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KQoreworICAgbVl1dldpZHRoID0gd2lkdGg7CisgICBtWXV2SGVpZ2h0ID0gaGVpZ2h0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFJlcHJvY2Vzc1R5cGUKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IHRoZSB0eXBlIG9mIHJlcHJvY2VzcyBvdXRwdXQgc3VwcG9ydGVkIGJ5IHRoaXMgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOiBOT05FCisgKgorICogUkVUVVJOICAgICA6IHJlcHJvY2Vzc190eXBlX3QgOiB0eXBlIG9mIHJlcHJvY2VzcworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCityZXByb2Nlc3NfdHlwZV90IFFDYW1lcmEzUGljQ2hhbm5lbDo6Z2V0UmVwcm9jZXNzVHlwZSgpCit7CisgICAgLyogYSBwaWN0dXJlIGNoYW5uZWwgY291bGQgZWl0aGVyIHVzZSB0aGUgcG9zdHByb2Nlc3NvciBmb3IgcmVwcm9jZXNzK2pwZWcKKyAgICAgICBvciBvbmx5IGZvciByZXByb2Nlc3MgKi8KKyAgICByZXByb2Nlc3NfdHlwZV90IGV4cGVjdGVkUmVwcm9jZXNzOworICAgIGlmIChtUG9zdFByb2NNYXNrID09IENBTV9RQ09NX0ZFQVRVUkVfTk9ORSB8fCBtSW5wdXRCdWZmZXJIaW50KSB7CisgICAgICAgIGV4cGVjdGVkUmVwcm9jZXNzID0gUkVQUk9DRVNTX1RZUEVfSlBFRzsKKyAgICB9IGVsc2UgeworICAgICAgICBleHBlY3RlZFJlcHJvY2VzcyA9IFJFUFJPQ0VTU19UWVBFX05PTkU7CisgICAgfQorICAgIExPR0goImV4cGVjdGVkUmVwcm9jZXNzIGZyb20gUGljIENoYW5uZWwgaXMgJWQiLCBleHBlY3RlZFJlcHJvY2Vzcyk7CisgICAgcmV0dXJuIGV4cGVjdGVkUmVwcm9jZXNzOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtX2hhbmRsZSA6IGNhbWVyYSBoYW5kbGUKKyAqICAgQGNhbV9vcHMgICAgOiBwdHIgdG8gY2FtZXJhIG9wcyB0YWJsZQorICogICBAcHBfbWFzayAgICA6IHBvc3QtcHJvY2Nlc3MgZmVhdHVyZSBtYXNrCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsOjpRQ2FtZXJhM1JlcHJvY2Vzc0NoYW5uZWwodWludDMyX3QgY2FtX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jYl9yb3V0aW5lIGNiX3JvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwgdm9pZCAqY2hfaGRsKSA6CisgICAgLyogSW4gY2FzZSBvZiBmcmFtZXdvcmsgcmVwcm9jZXNzaW5nLCBwcHJvYyBhbmQganBlZyBvcGVyYXRpb25zIGNvdWxkIGJlCisgICAgICogcGFyYWxsZWxpemVkIGJ5IGFsbG93aW5nIDEgZXh0cmEgYnVmZmVyIGZvciByZXByb2Nlc3Npbmcgb3V0cHV0OgorICAgICAqIGNoX2hkbC0+Z2V0TnVtQnVmZmVycygpICsgMSAqLworICAgIFFDYW1lcmEzQ2hhbm5lbChjYW1faGFuZGxlLCBjaGFubmVsX2hhbmRsZSwgY2FtX29wcywgY2Jfcm91dGluZSwgcGFkZGluZ0luZm8sCisgICAgICAgICAgICAgICAgICAgIHBvc3Rwcm9jZXNzX21hc2ssIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAoKFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwgKiljaF9oZGwpLT5nZXROdW1CdWZmZXJzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKE1BWF9SRVBST0NFU1NfUElQRUxJTkVfU1RBR0VTIC0gMSkpLAorICAgIGlucHV0Q2hIYW5kbGUoY2hfaGRsKSwKKyAgICBtT2ZmbGluZUJ1ZmZlcnNJbmRleCgtMSksCisgICAgbUZyYW1lTGVuKDApLAorICAgIG1SZXByb2Nlc3NUeXBlKFJFUFJPQ0VTU19UWVBFX05PTkUpLAorICAgIG1fcFNyY0NoYW5uZWwoTlVMTCksCisgICAgbV9wTWV0YUNoYW5uZWwoTlVMTCksCisgICAgbU1lbW9yeShOVUxMKSwKKyAgICBtR3JhbGxvY01lbW9yeSgwKSwKKyAgICBtUmVwcm9jZXNzUGVyZk1vZGUoZmFsc2UpCit7CisgICAgbWVtc2V0KG1TcmNTdHJlYW1IYW5kbGVzLCAwLCBzaXplb2YobVNyY1N0cmVhbUhhbmRsZXMpKTsKKyAgICBtT2ZmbGluZUJ1ZmZlcnNJbmRleCA9IG1OdW1CdWZmZXJzIC0xOworICAgIG1PZmZsaW5lTWV0YUluZGV4ID0gKGludDMyX3QpICgyKm1OdW1CdWZmZXJzIC0xKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhM1JlcHJvY2Vzc0NoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbV9oYW5kbGUgOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBjYW1fb3BzICAgIDogcHRyIHRvIGNhbWVyYSBvcHMgdGFibGUKKyAqICAgQHBwX21hc2sgICAgOiBwb3N0LXByb2NjZXNzIGZlYXR1cmUgbWFzaworICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsOjppbml0aWFsaXplKGNhbV9pc190eXBlX3QgaXNUeXBlKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3QgYXR0cjsKKworICAgIG1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCkpOworICAgIGF0dHIubm90aWZ5X21vZGUgPSBNTV9DQU1FUkFfU1VQRVJfQlVGX05PVElGWV9DT05USU5VT1VTOworICAgIGF0dHIubWF4X3VubWF0Y2hlZF9mcmFtZXMgPSAxOworCisgICAgbV9oYW5kbGUgPSBtX2NhbU9wcy0+YWRkX2NoYW5uZWwobV9jYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICBpZiAobV9oYW5kbGUgPT0gMCkgeworICAgICAgICBMT0dFKCJBZGQgY2hhbm5lbCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUlzVHlwZSA9IGlzVHlwZTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVnaXN0ZXJCdWZmZXIKKyAqCisgKiBERVNDUklQVElPTjogcmVnaXN0ZXIgc3RyZWFtaW5nIGJ1ZmZlciB0byB0aGUgY2hhbm5lbCBvYmplY3QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJ1ZmZlciAgICAgOiBidWZmZXIgdG8gYmUgcmVnaXN0ZXJlZAorICogICBAaXNUeXBlICAgICA6IHRoZSBpbWFnZSBzdGFiaWxpemF0aW9uIHR5cGUgZm9yIHRoZSBidWZmZXIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbDo6cmVnaXN0ZXJCdWZmZXIoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsCisgICAgICAgIGNhbV9pc190eXBlX3QgaXNUeXBlKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJjID0gMDsKKyAgICBtSXNUeXBlID0gaXNUeXBlOworICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGU7CisKKyAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiRXJyb3I6IENhbm5vdCByZWdpc3RlciBhIE5VTEwgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKCh1aW50MzJfdCltR3JhbGxvY01lbW9yeS5nZXRDbnQoKSA+IChtTnVtQnVmZmVycyAtIDEpKSB7CisgICAgICAgIExPR0UoIlRyeWluZyB0byByZWdpc3RlciBtb3JlIGJ1ZmZlcnMgdGhhbiBpbml0aWFsbHkgcmVxdWVzdGVkIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKDAgPT0gbV9udW1TdHJlYW1zKSB7CisgICAgICAgIHJjID0gaW5pdGlhbGl6ZShtSXNUeXBlKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJDb3VsZG4ndCBpbml0aWFsaXplIGNhbWVyYSBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgc3RyZWFtVHlwZSA9IG1TdHJlYW1zWzBdLT5nZXRNeVR5cGUoKTsKKyAgICByYyA9IG1HcmFsbG9jTWVtb3J5LnJlZ2lzdGVyQnVmZmVyKGJ1ZmZlciwgc3RyZWFtVHlwZSk7CisgICAgaWYgKEFMUkVBRFlfRVhJU1RTID09IHJjKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgIExPR0UoIkJ1ZmZlciAlcCBjb3VsZG4ndCBiZSByZWdpc3RlcmVkICVkIiwgYnVmZmVyLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtX2hhbmRsZSA6IGNhbWVyYSBoYW5kbGUKKyAqICAgQGNhbV9vcHMgICAgOiBwdHIgdG8gY2FtZXJhIG9wcyB0YWJsZQorICogICBAcHBfbWFzayAgICA6IHBvc3QtcHJvY2Nlc3MgZmVhdHVyZSBtYXNrCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1JlcHJvY2Vzc0NoYW5uZWw6OnN0cmVhbUNiUm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmEzU3RyZWFtICpzdHJlYW0pCit7CisgICAgLy9Hb3QgdGhlIHBwcm9jIGRhdGEgY2FsbGJhY2suIE5vdyBzZW5kIHRvIGpwZWcgZW5jb2RpbmcKKyAgICB1aW50OF90IGZyYW1lSW5kZXg7CisgICAgdWludDMyX3QgcmVzdWx0RnJhbWVOdW1iZXI7CisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90KiBmcmFtZSA9IE5VTEw7CisgICAgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCAqb2JqID0gKFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwgKilpbnB1dENoSGFuZGxlOworICAgIGNhbV9kaW1lbnNpb25fdCBkaW07CisgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCBvZmZzZXQ7CisKKyAgICBtZW1zZXQoJmRpbSwgMCwgc2l6ZW9mKGRpbSkpOworICAgIG1lbXNldCgmb2Zmc2V0LCAwLCBzaXplb2YoY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCkpOworICAgIGlmKCFzdXBlcl9mcmFtZSkgeworICAgICAgICAgTE9HRSgiSW52YWxpZCBTdXBlciBidWZmZXIiKTsKKyAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZihzdXBlcl9mcmFtZS0+bnVtX2J1ZnMgIT0gMSkgeworICAgICAgICAgTE9HRSgiTXVsdGlwbGUgc3RyZWFtcyBhcmUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZihzdXBlcl9mcmFtZS0+YnVmc1swXSA9PSBOVUxMICkgeworICAgICAgICAgTE9HRSgiRXJyb3IsIFN1cGVyIGJ1ZmZlciBmcmFtZSBkb2VzIG5vdCBjb250YWluIHZhbGlkIGJ1ZmZlciIpOworICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmcmFtZUluZGV4ID0gKHVpbnQ4X3Qpc3VwZXJfZnJhbWUtPmJ1ZnNbMF0tPmJ1Zl9pZHg7CisKKworICAgIGlmIChtUmVwcm9jZXNzVHlwZSA9PSBSRVBST0NFU1NfVFlQRV9KUEVHKSB7CisgICAgICAgIHJlc3VsdEZyYW1lTnVtYmVyID0gIG1NZW1vcnktPmdldEZyYW1lTnVtYmVyKGZyYW1lSW5kZXgpOworICAgICAgICBmcmFtZSA9IChtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKiltYWxsb2Moc2l6ZW9mKG1tX2NhbWVyYV9zdXBlcl9idWZfdCkpOworICAgICAgICBpZiAoZnJhbWUgPT0gTlVMTCkgeworICAgICAgICAgICBMT0dFKCJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeSB0byBzYXZlIHJlY2VpdmVkX2ZyYW1lIHN0cnVjdHVyZS4iKTsKKyAgICAgICAgICAgaWYoc3RyZWFtKSB7CisgICAgICAgICAgICAgICBzdHJlYW0tPmJ1ZkRvbmUoZnJhbWVJbmRleCk7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIExPR0koImJ1ZkluZGV4OiAldSByZWN2ZCBmcm9tIHBvc3QgcHJvYyIsCisgICAgICAgICAgICAgICAgICh1aW50MzJfdClmcmFtZUluZGV4KTsKKyAgICAgICAgKmZyYW1lID0gKnN1cGVyX2ZyYW1lOworCisgICAgICAgIHN0cmVhbS0+Z2V0RnJhbWVEaW1lbnNpb24oZGltKTsKKyAgICAgICAgc3RyZWFtLT5nZXRGcmFtZU9mZnNldChvZmZzZXQpOworICAgICAgICBkdW1wWVVWKGZyYW1lLT5idWZzWzBdLCBkaW0sIG9mZnNldCwgUUNBTUVSQV9EVU1QX0ZSTV9TTkFQU0hPVCk7CisgICAgICAgIC8qIFNpbmNlIHJlcHJvY2Vzc2luZyBpcyBkb25lLCBzZW5kIHRoZSBjYWxsYmFjayB0byByZWxlYXNlIHRoZSBpbnB1dCBidWZmZXIgKi8KKyAgICAgICAgaWYgKG1DaGFubmVsQ0IpIHsKKyAgICAgICAgICAgIG1DaGFubmVsQ0IoTlVMTCwgTlVMTCwgcmVzdWx0RnJhbWVOdW1iZXIsIHRydWUsIG1Vc2VyRGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgb2JqLT5tX3Bvc3Rwcm9jZXNzb3IucHJvY2Vzc1BQRGF0YShmcmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpyZXN1bHRCdWZmZXI7CisgICAgICAgIGZyYW1lSW5kZXggPSAodWludDhfdClzdXBlcl9mcmFtZS0+YnVmc1swXS0+YnVmX2lkeDsKKyAgICAgICAgcmVzdWx0QnVmZmVyID0gKGJ1ZmZlcl9oYW5kbGVfdCAqKW1HcmFsbG9jTWVtb3J5LmdldEJ1ZmZlckhhbmRsZShmcmFtZUluZGV4KTsKKyAgICAgICAgcmVzdWx0RnJhbWVOdW1iZXIgPSBtR3JhbGxvY01lbW9yeS5nZXRGcmFtZU51bWJlcihmcmFtZUluZGV4KTsKKyAgICAgICAgaW50MzJfdCByYyA9IHN0cmVhbS0+YnVmUmVsZWFzZShmcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciAlZCByZWxlYXNpbmcgc3RyZWFtIGJ1ZmZlciAlZCIsCisgICAgICAgICAgICAgICAgICAgICByYywgZnJhbWVJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBtR3JhbGxvY01lbW9yeS51bnJlZ2lzdGVyQnVmZmVyKGZyYW1lSW5kZXgpOworICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgIExPR0UoIkVycm9yICVkIHVucmVnaXN0ZXJpbmcgc3RyZWFtIGJ1ZmZlciAlZCIsCisgICAgICAgICAgICAgICAgICAgICByYywgZnJhbWVJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgb2JqLT5yZXByb2Nlc3NDYlJvdXRpbmUocmVzdWx0QnVmZmVyLCByZXN1bHRGcmFtZU51bWJlcik7CisKKyAgICAgICAgb2JqLT5tX3Bvc3Rwcm9jZXNzb3IucmVsZWFzZU9mZmxpbmVCdWZmZXJzKGZhbHNlKTsKKyAgICAgICAgcWNhbWVyYV9oYWwzX3BwX2RhdGFfdCAqcHBfam9iID0gb2JqLT5tX3Bvc3Rwcm9jZXNzb3IuZGVxdWV1ZVBQSm9iKHJlc3VsdEZyYW1lTnVtYmVyKTsKKyAgICAgICAgaWYgKHBwX2pvYiAhPSBOVUxMKSB7CisgICAgICAgICAgICBvYmotPm1fcG9zdHByb2Nlc3Nvci5yZWxlYXNlUFBKb2JEYXRhKHBwX2pvYik7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShwcF9qb2IpOworICAgICAgICByZXNldFRvQ2FtUGVyZk5vcm1hbChyZXN1bHRGcmFtZU51bWJlcik7CisgICAgfQorICAgIGZyZWUoc3VwZXJfZnJhbWUpOworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZXNldFRvQ2FtUGVyZk5vcm1hbAorICoKKyAqIERFU0NSSVBUSU9OOiBTZXQgdGhlIHBlcmYgbW9kZSB0byBub3JtYWwgaWYgYWxsIHRoZSBwcmlvcml0eSBmcmFtZXMKKyAqICAgICAgICAgICAgICBoYXZlIGJlZW4gcmVwcm9jZXNzZWQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgICAgQGZyYW1lTnVtYmVyOiBGcmFtZSBudW1iZXIgb2YgdGhlIHJlcHJvY2VzcyBjb21wbGV0ZWQgZnJhbWUKKyAqCisgKiBSRVRVUk4gICAgIDogUUNhbWVyYTNTdHJlYW1NZW0gKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbDo6cmVzZXRUb0NhbVBlcmZOb3JtYWwodWludDMyX3QgZnJhbWVOdW1iZXIpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIGJvb2wgcmVzZXRUb1BlcmZOb3JtYWwgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Qcmlvcml0eUZyYW1lc0xvY2spOworICAgICAgICAvKiByZW1vdmUgdGhlIHByaW9yaXR5IGZyYW1lIG51bWJlciBmcm9tIHRoZSBsaXN0ICovCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVByaW9yaXR5RnJhbWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobVByaW9yaXR5RnJhbWVzW2ldID09IGZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgbVByaW9yaXR5RnJhbWVzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIHJlc2V0IHRoZSBwZXJmIG1vZGUgaWYgcGVuZGluZyBwcmlvcml0eSBmcmFtZSBsaXN0IGlzIGVtcHR5ICovCisgICAgICAgIGlmIChtUmVwcm9jZXNzUGVyZk1vZGUgJiYgbVByaW9yaXR5RnJhbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJlc2V0VG9QZXJmTm9ybWFsID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzZXRUb1BlcmZOb3JtYWwpIHsKKyAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnBTdHJlYW0gPSBtU3RyZWFtc1swXTsKKyAgICAgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90IHBhcmFtOworICAgICAgICBtZW1zZXQoJnBhcmFtLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90KSk7CisKKyAgICAgICAgcGFyYW0udHlwZSA9IENBTV9TVFJFQU1fUEFSQU1fVFlQRV9SRVFVRVNUX09QU19NT0RFOworICAgICAgICBwYXJhbS5wZXJmX21vZGUgPSBDQU1fUEVSRl9OT1JNQUw7CisgICAgICAgIHJjID0gcFN0cmVhbS0+c2V0UGFyYW1ldGVyKHBhcmFtKTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVByaW9yaXR5RnJhbWVzTG9jayk7CisgICAgICAgICAgICBtUmVwcm9jZXNzUGVyZk1vZGUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0U3RyZWFtQnVmcworICoKKyAqIERFU0NSSVBUSU9OOiByZWdpc3RlciB0aGUgYnVmZmVycyBvZiB0aGUgcmVwcm9jZXNzIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBRQ2FtZXJhM1N0cmVhbU1lbSAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEzU3RyZWFtTWVtKiBRQ2FtZXJhM1JlcHJvY2Vzc0NoYW5uZWw6OmdldFN0cmVhbUJ1ZnModWludDMyX3QgbGVuKQoreworICAgIGlmIChtUmVwcm9jZXNzVHlwZSA9PSBSRVBST0NFU1NfVFlQRV9KUEVHKSB7CisgICAgICAgIG1NZW1vcnkgPSBuZXcgUUNhbWVyYTNTdHJlYW1NZW0obU51bUJ1ZmZlcnMsIGZhbHNlKTsKKyAgICAgICAgaWYgKCFtTWVtb3J5KSB7CisgICAgICAgICAgICBMT0dFKCJ1bmFibGUgdG8gY3JlYXRlIHJlcHJvYyBtZW1vcnkiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIG1GcmFtZUxlbiA9IGxlbjsKKyAgICAgICAgcmV0dXJuIG1NZW1vcnk7CisgICAgfQorICAgIHJldHVybiAmbUdyYWxsb2NNZW1vcnk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHV0U3RyZWFtQnVmcworICoKKyAqIERFU0NSSVBUSU9OOiByZWxlYXNlIHRoZSByZXByb2Nlc3MgY2hhbm5lbCBidWZmZXJzCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1JlcHJvY2Vzc0NoYW5uZWw6OnB1dFN0cmVhbUJ1ZnMoKQoreworICAgaWYgKG1SZXByb2Nlc3NUeXBlID09IFJFUFJPQ0VTU19UWVBFX0pQRUcpIHsKKyAgICAgICBtTWVtb3J5LT5kZWFsbG9jYXRlKCk7CisgICAgICAgZGVsZXRlIG1NZW1vcnk7CisgICAgICAgbU1lbW9yeSA9IE5VTEw7CisgICAgICAgbUZyZWVCdWZmZXJMaXN0LmNsZWFyKCk7CisgICB9IGVsc2UgeworICAgICAgIG1HcmFsbG9jTWVtb3J5LnVucmVnaXN0ZXJCdWZmZXJzKCk7CisgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogflFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBkZXN0cnVjdG9yIG9mIFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsOjp+UUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsKCkKK3sKKyAgICBkZXN0cm95KCk7CisKKyAgICBpZiAobV9oYW5kbGUpIHsKKyAgICAgICAgbV9jYW1PcHMtPmRlbGV0ZV9jaGFubmVsKG1fY2FtSGFuZGxlLCBtX2hhbmRsZSk7CisgICAgICAgIExPR0QoImRlbGV0aW5nIGNoYW5uZWwgJWQiLCBtX2hhbmRsZSk7CisgICAgICAgIG1faGFuZGxlID0gMDsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RhcnQKKyAqCisgKiBERVNDUklQVElPTjogc3RhcnQgcmVwcm9jZXNzIGNoYW5uZWwuCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1JlcHJvY2Vzc0NoYW5uZWw6OnN0YXJ0KCkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIHJjID0gUUNhbWVyYTNDaGFubmVsOjpzdGFydCgpOworCisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgcmMgPSBtX2NhbU9wcy0+c3RhcnRfY2hhbm5lbChtX2NhbUhhbmRsZSwgbV9oYW5kbGUpOworCisgICAgICAgLy8gQ2hlY2sgZmFpbHVyZQorICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICBMT0dFKCJzdGFydF9jaGFubmVsIGZhaWxlZCAlZCIsIHJjKTsKKyAgICAgICAgICAgUUNhbWVyYTNDaGFubmVsOjpzdG9wKCk7CisgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RvcAorICoKKyAqIERFU0NSSVBUSU9OOiBzdG9wIHJlcHJvY2VzcyBjaGFubmVsLgorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1JlcHJvY2Vzc0NoYW5uZWw6OnN0b3AoKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgcmMgPSBRQ2FtZXJhM0NoYW5uZWw6OnN0b3AoKTsKKyAgICByYyB8PSBtX2NhbU9wcy0+c3RvcF9jaGFubmVsKG1fY2FtSGFuZGxlLCBtX2hhbmRsZSk7CisgICAgLy8gVW5tYXBwaW5nIHRoZSBidWZmZXJzCisgICAgdW5tYXBPZmZsaW5lQnVmZmVycyh0cnVlKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0U3RyZWFtQnlTcmNIYW5kbGUKKyAqCisgKiBERVNDUklQVElPTjogZmluZCByZXByb2Nlc3Mgc3RyZWFtIGJ5IGl0cyBzb3VyY2Ugc3RyZWFtIGhhbmRsZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3JjSGFuZGxlIDogc291cmNlIHN0cmVhbSBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogcHRyIHRvIHJlcHJvY2VzcyBzdHJlYW0gaWYgZm91bmQuIE5VTEwgaWYgbm90IGZvdW5kCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEzU3RyZWFtICogUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsOjpnZXRTdHJlYW1CeVNyY0hhbmRsZSh1aW50MzJfdCBzcmNIYW5kbGUpCit7CisgICAgUUNhbWVyYTNTdHJlYW0gKnBTdHJlYW0gPSBOVUxMOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbnVtU3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChtU3JjU3RyZWFtSGFuZGxlc1tpXSA9PSBzcmNIYW5kbGUpIHsKKyAgICAgICAgICAgIHBTdHJlYW0gPSBtU3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwU3RyZWFtOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFNyY1N0cmVhbUJ5U3JjSGFuZGxlCisgKgorICogREVTQ1JJUFRJT046IGZpbmQgc291cmNlIHN0cmVhbSBieSBzb3VyY2Ugc3RyZWFtIGhhbmRsZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3JjSGFuZGxlIDogc291cmNlIHN0cmVhbSBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogcHRyIHRvIHJlcHJvY2VzcyBzdHJlYW0gaWYgZm91bmQuIE5VTEwgaWYgbm90IGZvdW5kCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEzU3RyZWFtICogUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsOjpnZXRTcmNTdHJlYW1CeVNyY0hhbmRsZSh1aW50MzJfdCBzcmNIYW5kbGUpCit7CisgICAgUUNhbWVyYTNTdHJlYW0gKnBTdHJlYW0gPSBOVUxMOworCisgICAgaWYgKE5VTEwgPT0gbV9wU3JjQ2hhbm5lbCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9udW1TdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKG1TcmNTdHJlYW1IYW5kbGVzW2ldID09IHNyY0hhbmRsZSkgeworICAgICAgICAgICAgcFN0cmVhbSA9IG1fcFNyY0NoYW5uZWwtPmdldFN0cmVhbUJ5SW5kZXgoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcFN0cmVhbTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB1bm1hcE9mZmxpbmVCdWZmZXJzCisgKgorICogREVTQ1JJUFRJT046IFVubWFwcyBvZmZsaW5lIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsOjp1bm1hcE9mZmxpbmVCdWZmZXJzKGJvb2wgYWxsKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIGlmICghbU9mZmxpbmVCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgICAgICAgIExpc3Q8T2ZmbGluZUJ1ZmZlcj46Oml0ZXJhdG9yIGl0ID0gbU9mZmxpbmVCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIGZvciAoOyBpdCAhPSBtT2ZmbGluZUJ1ZmZlcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgc3RyZWFtID0gKCppdCkuc3RyZWFtOworICAgICAgICAgICBpZiAoTlVMTCAhPSBzdHJlYW0pIHsKKyAgICAgICAgICAgICAgIHJjID0gc3RyZWFtLT51bm1hcEJ1ZigoKml0KS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xKTsKKyAgICAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIGR1cmluZyBvZmZsaW5lIGJ1ZmZlciB1bm1hcCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIExPR0QoIlVubWFwcGVkIGJ1ZmZlciB3aXRoIGluZGV4ICVkIiwgKCppdCkuaW5kZXgpOworICAgICAgICAgICB9CisgICAgICAgICAgIGlmICghYWxsKSB7CisgICAgICAgICAgICAgICBtT2ZmbGluZUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYWxsKSB7CisgICAgICAgICAgIG1PZmZsaW5lQnVmZmVycy5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFtT2ZmbGluZU1ldGFCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSA9IE5VTEw7CisgICAgICAgIExpc3Q8T2ZmbGluZUJ1ZmZlcj46Oml0ZXJhdG9yIGl0ID0gbU9mZmxpbmVNZXRhQnVmZmVycy5iZWdpbigpOworICAgICAgICBmb3IgKDsgaXQgIT0gbU9mZmxpbmVNZXRhQnVmZmVycy5lbmQoKTsgaXQrKykgeworICAgICAgICAgICBzdHJlYW0gPSAoKml0KS5zdHJlYW07CisgICAgICAgICAgIGlmIChOVUxMICE9IHN0cmVhbSkgeworICAgICAgICAgICAgICAgcmMgPSBzdHJlYW0tPnVubWFwQnVmKCgqaXQpLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCppdCkuaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpOworICAgICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgZHVyaW5nIG9mZmxpbmUgYnVmZmVyIHVubWFwICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgTE9HRCgiVW5tYXBwZWQgbWV0YSBidWZmZXIgd2l0aCBpbmRleCAlZCIsICgqaXQpLmluZGV4KTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBpZiAoIWFsbCkgeworICAgICAgICAgICAgICAgbU9mZmxpbmVNZXRhQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhbGwpIHsKKyAgICAgICAgICAgbU9mZmxpbmVNZXRhQnVmZmVycy5jbGVhcigpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBidWZEb25lCisgKgorICogREVTQ1JJUFRJT046IFJldHVybiByZXByb2Nlc3Mgc3RyZWFtIGJ1ZmZlciB0byBmcmVlIGJ1ZmZlciBsaXN0LgorICogICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcXVldWUgYnVmZmVyIGJhY2sgdG8ga2VybmVsLgorICogICAgICAgICAgICAgIEl0J3MgdXAgdG8gZG9SZXByb2Nlc3NPZmZsaW5lIHRvIGRvIHRoYXQgaW5zdGVhZC4KKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVjdmRfZnJhbWUgIDogc3RyZWFtIGJ1ZiBmcmFtZSB0byBiZSByZXR1cm5lZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsOjpidWZEb25lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVjdmRfZnJhbWUpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgaWYgKHJlY3ZkX2ZyYW1lICYmIHJlY3ZkX2ZyYW1lLT5udW1fYnVmcyA9PSAxKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1GcmVlQnVmZmVyc0xvY2spOworICAgICAgICB1aW50MzJfdCBidWZfaWR4ID0gcmVjdmRfZnJhbWUtPmJ1ZnNbMF0tPmJ1Zl9pZHg7CisgICAgICAgIG1GcmVlQnVmZmVyTGlzdC5wdXNoX2JhY2soYnVmX2lkeCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJGYXRhbC4gTm90IHN1cHBvc2VkIHRvIGJlIGhlcmUiKTsKKyAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG92ZXJyaWRlTWV0YWRhdGEKKyAqCisgKiBERVNDUklQVElPTjogT3ZlcnJpZGUgbWV0YWRhdGEgZW50cnkgc3VjaCBhcyByb3RhdGlvbiwgY3JvcCwgYW5kIENEUyBpbmZvLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZnJhbWUgICAgIDogaW5wdXQgZnJhbWUgZnJvbSBzb3VyY2Ugc3RyZWFtCisgKiAgIG1ldGFfYnVmZmVyOiBtZXRhZGF0YSBidWZmZXIKKyAqICAgQG1ldGFkYXRhICA6IGNvcnJlc3BvbmRpbmcgbWV0YWRhdGEKKyAqICAgQGZ3a19mcmFtZSA6CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1JlcHJvY2Vzc0NoYW5uZWw6Om92ZXJyaWRlTWV0YWRhdGEocWNhbWVyYV9oYWwzX3BwX2J1ZmZlcl90ICpwcF9idWZmZXIsCisgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1ldGFfYnVmZmVyLCBqcGVnX3NldHRpbmdzX3QgKmpwZWdfc2V0dGluZ3MsCisgICAgICAgIHFjYW1lcmFfZndrX2lucHV0X3BwX2RhdGFfdCAmZndrX2ZyYW1lKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlKiBoYWxfb2JqID0gKFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UqKW1Vc2VyRGF0YTsKKyAgICBpZiAoKE5VTEwgPT0gbWV0YV9idWZmZXIpIHx8IChOVUxMID09IHBwX2J1ZmZlcikgfHwgKE5VTEwgPT0gcHBfYnVmZmVyLT5pbnB1dCkgfHwKKyAgICAgICAgICAgIChOVUxMID09IGhhbF9vYmopKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbWV0YWRhdGFfYnVmZmVyX3QgKm1ldGEgPSAobWV0YWRhdGFfYnVmZmVyX3QgKiltZXRhX2J1ZmZlci0+YnVmZmVyOworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUgPSBwcF9idWZmZXItPmlucHV0OworICAgIGlmIChOVUxMID09IG1ldGEpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZnJhbWUtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnBTdHJlYW0gPSBnZXRTdHJlYW1CeVNyY0hhbmRsZShmcmFtZS0+YnVmc1tpXS0+c3RyZWFtX2lkKTsKKyAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnBTcmNTdHJlYW0gPSBnZXRTcmNTdHJlYW1CeVNyY0hhbmRsZShmcmFtZS0+YnVmc1tpXS0+c3RyZWFtX2lkKTsKKworICAgICAgICBpZiAocFN0cmVhbSAhPSBOVUxMICYmIHBTcmNTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGpwZWdfc2V0dGluZ3MpIHsKKyAgICAgICAgICAgICAgICAvLyBGaW5kIHJvdGF0aW9uIGluZm8gZm9yIHJlcHJvY2VzcyBzdHJlYW0KKyAgICAgICAgICAgICAgICBjYW1fcm90YXRpb25faW5mb190IHJvdGF0aW9uX2luZm87CisgICAgICAgICAgICAgICAgbWVtc2V0KCZyb3RhdGlvbl9pbmZvLCAwLCBzaXplb2Yocm90YXRpb25faW5mbykpOworICAgICAgICAgICAgICAgIGlmIChqcGVnX3NldHRpbmdzLT5qcGVnX29yaWVudGF0aW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICByb3RhdGlvbl9pbmZvLnJvdGF0aW9uID0gUk9UQVRFXzA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqcGVnX3NldHRpbmdzLT5qcGVnX29yaWVudGF0aW9uID09IDkwKSB7CisgICAgICAgICAgICAgICAgICAgcm90YXRpb25faW5mby5yb3RhdGlvbiA9IFJPVEFURV85MDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGpwZWdfc2V0dGluZ3MtPmpwZWdfb3JpZW50YXRpb24gPT0gMTgwKSB7CisgICAgICAgICAgICAgICAgICAgcm90YXRpb25faW5mby5yb3RhdGlvbiA9IFJPVEFURV8xODA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqcGVnX3NldHRpbmdzLT5qcGVnX29yaWVudGF0aW9uID09IDI3MCkgeworICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uX2luZm8ucm90YXRpb24gPSBST1RBVEVfMjcwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb3RhdGlvbl9pbmZvLnN0cmVhbUlkID0gbVN0cmVhbXNbMF0tPmdldE15U2VydmVySUQoKTsKKyAgICAgICAgICAgICAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1ldGEsIENBTV9JTlRGX1BBUk1fUk9UQVRJT04sIHJvdGF0aW9uX2luZm8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaW5kIGFuZCBpbnNlcnQgY3JvcCBpbmZvIGZvciByZXByb2Nlc3Mgc3RyZWFtCisgICAgICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fY3JvcF9kYXRhX3QsIGNyb3BfZGF0YSwgQ0FNX0lOVEZfTUVUQV9DUk9QX0RBVEEsIG1ldGEpIHsKKyAgICAgICAgICAgICAgICBpZiAoTUFYX05VTV9TVFJFQU1TID4gY3JvcF9kYXRhLT5udW1fb2Zfc3RyZWFtcykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNyb3BfZGF0YS0+bnVtX29mX3N0cmVhbXM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyb3BfZGF0YS0+Y3JvcF9pbmZvW2pdLnN0cmVhbV9pZCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjU3RyZWFtLT5nZXRNeVNlcnZlcklEKCkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0b3JlIGNyb3Avcm9pIGluZm9ybWF0aW9uIGZvciBvZmZsaW5lIHJlcHJvY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSByZXByb2Nlc3Mgc3RyZWFtIHNsb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2RhdGEtPmNyb3BfaW5mb1tjcm9wX2RhdGEtPm51bV9vZl9zdHJlYW1zXS5jcm9wID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfZGF0YS0+Y3JvcF9pbmZvW2pdLmNyb3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9kYXRhLT5jcm9wX2luZm9bY3JvcF9kYXRhLT5udW1fb2Zfc3RyZWFtc10ucm9pX21hcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2RhdGEtPmNyb3BfaW5mb1tqXS5yb2lfbWFwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfZGF0YS0+Y3JvcF9pbmZvW2Nyb3BfZGF0YS0+bnVtX29mX3N0cmVhbXNdLnN0cmVhbV9pZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1swXS0+Z2V0TXlTZXJ2ZXJJRCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfZGF0YS0+bnVtX29mX3N0cmVhbXMrKzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0QoIlJlcHJvY2VzcyBzdHJlYW0gc2VydmVyIGlkOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbMF0tPmdldE15U2VydmVySUQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRCgiRm91bmQgb2ZmbGluZSByZXByb2Nlc3MgY3JvcCAlZHglZCAlZHglZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2RhdGEtPmNyb3BfaW5mb1tqXS5jcm9wLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2RhdGEtPmNyb3BfaW5mb1tqXS5jcm9wLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfZGF0YS0+Y3JvcF9pbmZvW2pdLmNyb3Aud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2RhdGEtPmNyb3BfaW5mb1tqXS5jcm9wLmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRCgiRm91bmQgb2ZmbGluZSByZXByb2Nlc3Mgcm9pbWFwICVkeCVkICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfZGF0YS0+Y3JvcF9pbmZvW2pdLnJvaV9tYXAubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfZGF0YS0+Y3JvcF9pbmZvW2pdLnJvaV9tYXAudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcF9kYXRhLT5jcm9wX2luZm9bal0ucm9pX21hcC53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfZGF0YS0+Y3JvcF9pbmZvW2pdLnJvaV9tYXAuaGVpZ2h0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiTm8gc3BhY2UgdG8gYWRkIHJlcHJvY2VzcyBzdHJlYW0gY3JvcC9yb2kgaW5mb3JtYXRpb24iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9jZHNfZGF0YV90LCBjZHNJbmZvLCBDQU1fSU5URl9NRVRBX0NEU19EQVRBLCBtZXRhKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBjbnQgPSBjZHNJbmZvLT5udW1fb2Zfc3RyZWFtczsKKyAgICAgICAgICAgICAgICBpZiAoY250IDw9IE1BWF9OVU1fU1RSRUFNUykgeworICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX2Nkc19pbmZvX3QgcmVwcm9fY2RzX2luZm87CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmcmVwcm9fY2RzX2luZm8sIDAsIHNpemVvZihyZXByb19jZHNfaW5mbykpOworICAgICAgICAgICAgICAgICAgICByZXByb19jZHNfaW5mby5zdHJlYW1faWQgPSBtU3RyZWFtc1swXS0+Z2V0TXlTZXJ2ZXJJRCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2RzSW5mby0+Y2RzX2luZm9baV0uc3RyZWFtX2lkID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNTdHJlYW0tPmdldE15U2VydmVySUQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJvX2Nkc19pbmZvLmNkc19lbmFibGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2RzSW5mby0+Y2RzX2luZm9baV0uY2RzX2VuYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjZHNJbmZvLT5udW1fb2Zfc3RyZWFtcyA9IDE7CisgICAgICAgICAgICAgICAgICAgIGNkc0luZm8tPmNkc19pbmZvWzBdID0gcmVwcm9fY2RzX2luZm87CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiTm8gc3BhY2UgdG8gYWRkIHJlcHJvY2VzcyBzdHJlYW0gY2RzIGluZm9ybWF0aW9uIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmd2tfZnJhbWUuaW5wdXRfYnVmZmVyID0gKmZyYW1lLT5idWZzW2ldOworICAgICAgICAgICAgZndrX2ZyYW1lLm1ldGFkYXRhX2J1ZmZlciA9ICptZXRhX2J1ZmZlcjsKKyAgICAgICAgICAgIGZ3a19mcmFtZS5vdXRwdXRfYnVmZmVyID0gcHBfYnVmZmVyLT5vdXRwdXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIlNvdXJjZS9SZS1wcm9jZXNzIHN0cmVhbXMgYXJlIGludmFsaWQiKTsKKyAgICAgICAgICAgIHJjIHw9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRlVOQ1RJT04gOiBvdmVycmlkZUZ3a01ldGFkYXRhCisqCisqIERFU0NSSVBUSU9OOiBPdmVycmlkZSBmcmFtZXdvcmtzIG1ldGFkYXRhIHN1Y2ggYXMgcm90YXRpb24sIGNyb3AsIGFuZCBDRFMgZGF0YS4KKyoKKyogUEFSQU1FVEVSUyA6CisqIEBmcmFtZSA6IGlucHV0IGZyYW1lIGZvciByZXByb2Nlc3NpbmcKKyoKKyogUkVUVVJOIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworKiBOT19FUlJPUiAtLSBzdWNjZXNzCisqIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbDo6b3ZlcnJpZGVGd2tNZXRhZGF0YSgKKyAgICAgICAgcWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICpmcmFtZSkKK3sKKyAgICBpZiAoTlVMTCA9PSBmcmFtZSkgeworICAgICAgICBMT0dFKCJJbmNvcnJlY3QgaW5wdXQgZnJhbWUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBmcmFtZS0+bWV0YWRhdGFfYnVmZmVyLmJ1ZmZlcikgeworICAgICAgICBMT0dFKCJObyBtZXRhZGF0YSBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbWV0YWRhdGFfYnVmZmVyX3QgKm1ldGEgPSAobWV0YWRhdGFfYnVmZmVyX3QgKikgZnJhbWUtPm1ldGFkYXRhX2J1ZmZlci5idWZmZXI7CisKKyAgICAvLyBOb3QgZG9pbmcgcm90YXRpb24gYXQgYWxsIGZvciBZVVYgdG8gWVVWIHJlcHJvY2VzcworICAgIGlmIChtUmVwcm9jZXNzVHlwZSAhPSBSRVBST0NFU1NfVFlQRV9KUEVHKSB7CisgICAgICAgIExPR0QoIk92ZXJyaWRlIHJvdGF0aW9uIHRvIDAgZm9yIGNoYW5uZWwgcmVwcm9jZXNzIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgIG1SZXByb2Nlc3NUeXBlKTsKKyAgICAgICAgY2FtX3JvdGF0aW9uX2luZm9fdCByb3RhdGlvbl9pbmZvOworICAgICAgICBtZW1zZXQoJnJvdGF0aW9uX2luZm8sIDAsIHNpemVvZihyb3RhdGlvbl9pbmZvKSk7CisgICAgICAgIHJvdGF0aW9uX2luZm8ucm90YXRpb24gPSBST1RBVEVfMDsKKyAgICAgICAgcm90YXRpb25faW5mby5zdHJlYW1JZCA9IG1TdHJlYW1zWzBdLT5nZXRNeVNlcnZlcklEKCk7CisgICAgICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobWV0YSwgQ0FNX0lOVEZfUEFSTV9ST1RBVElPTiwgcm90YXRpb25faW5mbyk7CisgICAgfQorCisgICAgLy8gRmluZCBhbmQgaW5zZXJ0IGNyb3AgaW5mbyBmb3IgcmVwcm9jZXNzIHN0cmVhbQorICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9jcm9wX2RhdGFfdCwgY3JvcF9kYXRhLCBDQU1fSU5URl9NRVRBX0NST1BfREFUQSwgbWV0YSkgeworICAgICAgICBpZiAoMSA9PSBjcm9wX2RhdGEtPm51bV9vZl9zdHJlYW1zKSB7CisgICAgICAgICAgICAvLyBTdG9yZSBjcm9wL3JvaSBpbmZvcm1hdGlvbiBmb3Igb2ZmbGluZSByZXByb2Nlc3MKKyAgICAgICAgICAgIC8vIGluIHRoZSByZXByb2Nlc3Mgc3RyZWFtIHNsb3QKKyAgICAgICAgICAgIGNyb3BfZGF0YS0+Y3JvcF9pbmZvW2Nyb3BfZGF0YS0+bnVtX29mX3N0cmVhbXNdLmNyb3AgPQorICAgICAgICAgICAgICAgICAgICBjcm9wX2RhdGEtPmNyb3BfaW5mb1swXS5jcm9wOworICAgICAgICAgICAgY3JvcF9kYXRhLT5jcm9wX2luZm9bY3JvcF9kYXRhLT5udW1fb2Zfc3RyZWFtc10ucm9pX21hcCA9CisgICAgICAgICAgICAgICAgICAgIGNyb3BfZGF0YS0+Y3JvcF9pbmZvWzBdLnJvaV9tYXA7CisgICAgICAgICAgICBjcm9wX2RhdGEtPmNyb3BfaW5mb1tjcm9wX2RhdGEtPm51bV9vZl9zdHJlYW1zXS5zdHJlYW1faWQgPQorICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1swXS0+Z2V0TXlTZXJ2ZXJJRCgpOworICAgICAgICAgICAgY3JvcF9kYXRhLT5udW1fb2Zfc3RyZWFtcysrOworCisgICAgICAgICAgICBMT0dEKCJSZXByb2Nlc3Mgc3RyZWFtIHNlcnZlciBpZDogJWQiLAorICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbMF0tPmdldE15U2VydmVySUQoKSk7CisgICAgICAgICAgICBMT0dEKCJGb3VuZCBvZmZsaW5lIHJlcHJvY2VzcyBjcm9wICVkeCVkICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9kYXRhLT5jcm9wX2luZm9bMF0uY3JvcC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICBjcm9wX2RhdGEtPmNyb3BfaW5mb1swXS5jcm9wLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9kYXRhLT5jcm9wX2luZm9bMF0uY3JvcC53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9kYXRhLT5jcm9wX2luZm9bMF0uY3JvcC5oZWlnaHQpOworICAgICAgICAgICAgTE9HRCgiRm91bmQgb2ZmbGluZSByZXByb2Nlc3Mgcm9pIG1hcCAlZHglZCAlZHglZCIsCisgICAgICAgICAgICAgICAgICAgIGNyb3BfZGF0YS0+Y3JvcF9pbmZvWzBdLnJvaV9tYXAubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9kYXRhLT5jcm9wX2luZm9bMF0ucm9pX21hcC50b3AsCisgICAgICAgICAgICAgICAgICAgIGNyb3BfZGF0YS0+Y3JvcF9pbmZvWzBdLnJvaV9tYXAud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGNyb3BfZGF0YS0+Y3JvcF9pbmZvWzBdLnJvaV9tYXAuaGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIkluY29ycmVjdCBudW1iZXIgb2Ygb2ZmbGluZSBjcm9wIGRhdGEgZW50cmllcyAlZCIsCisgICAgICAgICAgICAgICAgICAgIGNyb3BfZGF0YS0+bnVtX29mX3N0cmVhbXMpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coIkNyb3AgZGF0YSBub3QgcHJlc2VudCIpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9jZHNfZGF0YV90LCBjZHNJbmZvLCBDQU1fSU5URl9NRVRBX0NEU19EQVRBLCBtZXRhKSB7CisgICAgICAgIGlmICgxID09IGNkc0luZm8tPm51bV9vZl9zdHJlYW1zKSB7CisgICAgICAgICAgICBjZHNJbmZvLT5jZHNfaW5mb1swXS5zdHJlYW1faWQgPSBtU3RyZWFtc1swXS0+Z2V0TXlTZXJ2ZXJJRCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiSW5jb3JyZWN0IG51bWJlciBvZiBvZmZsaW5lIGNkcyBpbmZvIGVudHJpZXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgY2RzSW5mby0+bnVtX29mX3N0cmVhbXMpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkb1JlcHJvY2Vzc09mZmxpbmUKKyAqCisgKiBERVNDUklQVElPTjogcmVxdWVzdCB0byBkbyBhIHJlcHJvY2VzcyBvbiB0aGUgZnJhbWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZyYW1lICAgICA6IGlucHV0IGZyYW1lIGZvciByZXByb2Nlc3NpbmcKKyAqICAgQGlzUHJpb3JpdHlGcmFtZTogSGludCB0aGF0IHRoaXMgZnJhbWUgaXMgb2YgcHJpb3JpdHksIGVxdWl2YWxlbnQgdG8KKyAqICAgICAgICAgICAgICByZWFsIHRpbWUsIGV2ZW4gdGhvdWdoIGl0IGlzIHByb2Nlc3NlZCBpbiBvZmZsaW5lIG1lY2hhbmlzbQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyBpbnQzMl90ICBRQ2FtZXJhM1JlcHJvY2Vzc0NoYW5uZWw6OmRvUmVwcm9jZXNzT2ZmbGluZSgKKyAgICAgICAgcWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICpmcmFtZSwgYm9vbCBpc1ByaW9yaXR5RnJhbWUpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgaW50IGluZGV4OworICAgIE9mZmxpbmVCdWZmZXIgbWFwcGVkQnVmZmVyOworCisgICAgaWYgKG1fbnVtU3RyZWFtcyA8IDEpIHsKKyAgICAgICAgTE9HRSgiTm8gcmVwcm9jZXNzIHN0cmVhbSBpcyBjcmVhdGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBmcmFtZSkgeworICAgICAgICBMT0dFKCJJbmNvcnJlY3QgaW5wdXQgZnJhbWUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBmcmFtZS0+bWV0YWRhdGFfYnVmZmVyLmJ1ZmZlcikgeworICAgICAgICBMT0dFKCJObyBtZXRhZGF0YSBhdmFpbGFibGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSBmcmFtZS0+aW5wdXRfYnVmZmVyLmJ1ZmZlcikgeworICAgICAgICBMT0dFKCJObyBpbnB1dCBidWZmZXIgYXZhaWxhYmxlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKCgwID09IG1fbnVtU3RyZWFtcykgfHwgKE5VTEwgPT0gbVN0cmVhbXNbMF0pKSB7CisgICAgICAgIExPR0UoIlJlcHJvY2VzcyBzdHJlYW0gbm90IGluaXRpYWxpemVkISIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBRQ2FtZXJhM1N0cmVhbSAqcFN0cmVhbSA9IG1TdHJlYW1zWzBdOworCisgICAgLy9xYnVmIHRoZSBvdXRwdXQgYnVmZmVyIGlmIGl0IHdhcyBhbGxvY2F0ZWQgYnkgdGhlIGZyYW1ld29yaworICAgIGlmIChtUmVwcm9jZXNzVHlwZSAhPSBSRVBST0NFU1NfVFlQRV9KUEVHICYmIGZyYW1lLT5vdXRwdXRfYnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYoIW1fYklzQWN0aXZlKSB7CisgICAgICAgICAgICByYyA9IHJlZ2lzdGVyQnVmZmVyKGZyYW1lLT5vdXRwdXRfYnVmZmVyLCBtSXNUeXBlKTsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgIExPR0UoIk9uLXRoZS1mbHkgYnVmZmVyIHJlZ2lzdHJhdGlvbiBmYWlsZWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gc3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IG1HcmFsbG9jTWVtb3J5LmdldE1hdGNoQnVmSW5kZXgoKHZvaWQqKWZyYW1lLT5vdXRwdXRfYnVmZmVyKTsKKyAgICAgICAgaWYoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByYyA9IHJlZ2lzdGVyQnVmZmVyKGZyYW1lLT5vdXRwdXRfYnVmZmVyLCBtSXNUeXBlKTsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgIExPR0UoIk9uLXRoZS1mbHkgYnVmZmVyIHJlZ2lzdHJhdGlvbiBmYWlsZWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluZGV4ID0gbUdyYWxsb2NNZW1vcnkuZ2V0TWF0Y2hCdWZJbmRleCgodm9pZCopZnJhbWUtPm91dHB1dF9idWZmZXIpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoIkNvdWxkIG5vdCBmaW5kIG9iamVjdCBhbW9uZyByZWdpc3RlcmVkIGJ1ZmZlcnMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBwU3RyZWFtLT5idWZEb25lKGluZGV4KTsKKyAgICAgICAgaWYocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBRIG5ldyBidWZmZXIgdG8gc3RyZWFtIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBtR3JhbGxvY01lbW9yeS5tYXJrRnJhbWVOdW1iZXIoaW5kZXgsIGZyYW1lLT5mcmFtZU51bWJlcik7CisKKyAgICB9IGVsc2UgaWYgKG1SZXByb2Nlc3NUeXBlID09IFJFUFJPQ0VTU19UWVBFX0pQRUcpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUZyZWVCdWZmZXJzTG9jayk7CisgICAgICAgIHVpbnQzMl90IGJ1ZklkeDsKKyAgICAgICAgaWYgKG1GcmVlQnVmZmVyTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICByYyA9IG1NZW1vcnktPmFsbG9jYXRlT25lKG1GcmFtZUxlbik7CisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIGFsbG9jYXRpbmcgaGVhcCBidWZmZXIuIEZhdGFsIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmSWR4ID0gKHVpbnQzMl90KXJjOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmSWR4ID0gKihtRnJlZUJ1ZmZlckxpc3QuYmVnaW4oKSk7CisgICAgICAgICAgICBtRnJlZUJ1ZmZlckxpc3QuZXJhc2UobUZyZWVCdWZmZXJMaXN0LmJlZ2luKCkpOworICAgICAgICB9CisKKyAgICAgICAgbU1lbW9yeS0+bWFya0ZyYW1lTnVtYmVyKGJ1ZklkeCwgZnJhbWUtPmZyYW1lTnVtYmVyKTsKKyAgICAgICAgcmMgPSBwU3RyZWFtLT5idWZEb25lKGJ1ZklkeCk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHF1ZXVlIG5ldyBidWZmZXIgdG8gc3RyZWFtIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IG1heF9pZHggPSAoaW50MzJfdCkgKG1OdW1CdWZmZXJzIC0gMSk7CisgICAgLy9sb29wIGJhY2sgdGhlIGluZGljZXMgaWYgbWF4IGJ1cnN0IGNvdW50IHJlYWNoZWQKKyAgICBpZiAobU9mZmxpbmVCdWZmZXJzSW5kZXggPT0gbWF4X2lkeCkgeworICAgICAgIG1PZmZsaW5lQnVmZmVyc0luZGV4ID0gLTE7CisgICAgfQorICAgIHVpbnQzMl90IGJ1Zl9pZHggPSAodWludDMyX3QpKG1PZmZsaW5lQnVmZmVyc0luZGV4ICsgMSk7CisgICAgcmMgPSBwU3RyZWFtLT5tYXBCdWYoCisgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX0lOUFVUX0JVRiwKKyAgICAgICAgICAgIGJ1Zl9pZHgsIC0xLAorICAgICAgICAgICAgZnJhbWUtPmlucHV0X2J1ZmZlci5mZCwgZnJhbWUtPmlucHV0X2J1ZmZlci5idWZmZXIsCisgICAgICAgICAgICBmcmFtZS0+aW5wdXRfYnVmZmVyLmZyYW1lX2xlbik7CisgICAgaWYgKE5PX0VSUk9SID09IHJjKSB7CisgICAgICAgIG1hcHBlZEJ1ZmZlci5pbmRleCA9IGJ1Zl9pZHg7CisgICAgICAgIG1hcHBlZEJ1ZmZlci5zdHJlYW0gPSBwU3RyZWFtOworICAgICAgICBtYXBwZWRCdWZmZXIudHlwZSA9IENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfSU5QVVRfQlVGOworICAgICAgICBtT2ZmbGluZUJ1ZmZlcnMucHVzaF9iYWNrKG1hcHBlZEJ1ZmZlcik7CisgICAgICAgIG1PZmZsaW5lQnVmZmVyc0luZGV4ID0gKGludDMyX3QpYnVmX2lkeDsKKyAgICAgICAgTE9HRCgiTWFwcGVkIGJ1ZmZlciB3aXRoIGluZGV4ICVkIiwgbU9mZmxpbmVCdWZmZXJzSW5kZXgpOworICAgIH0KKworICAgIG1heF9pZHggPSAoaW50MzJfdCkgKChtTnVtQnVmZmVycyAqIDIpIC0gMSk7CisgICAgLy9sb29wIGJhY2sgdGhlIGluZGljZXMgaWYgbWF4IGJ1cnN0IGNvdW50IHJlYWNoZWQKKyAgICBpZiAobU9mZmxpbmVNZXRhSW5kZXggPT0gbWF4X2lkeCkgeworICAgICAgIG1PZmZsaW5lTWV0YUluZGV4ID0gKGludDMyX3QpIChtTnVtQnVmZmVycyAtIDEpOworICAgIH0KKyAgICB1aW50MzJfdCBtZXRhX2J1Zl9pZHggPSAodWludDMyX3QpKG1PZmZsaW5lTWV0YUluZGV4ICsgMSk7CisgICAgcmMgfD0gcFN0cmVhbS0+bWFwQnVmKAorICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfT0ZGTElORV9NRVRBX0JVRiwKKyAgICAgICAgICAgIG1ldGFfYnVmX2lkeCwgLTEsCisgICAgICAgICAgICBmcmFtZS0+bWV0YWRhdGFfYnVmZmVyLmZkLCBmcmFtZS0+bWV0YWRhdGFfYnVmZmVyLmJ1ZmZlciwKKyAgICAgICAgICAgIGZyYW1lLT5tZXRhZGF0YV9idWZmZXIuZnJhbWVfbGVuKTsKKyAgICBpZiAoTk9fRVJST1IgPT0gcmMpIHsKKyAgICAgICAgbWFwcGVkQnVmZmVyLmluZGV4ID0gbWV0YV9idWZfaWR4OworICAgICAgICBtYXBwZWRCdWZmZXIuc3RyZWFtID0gcFN0cmVhbTsKKyAgICAgICAgbWFwcGVkQnVmZmVyLnR5cGUgPSBDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX01FVEFfQlVGOworICAgICAgICBtT2ZmbGluZU1ldGFCdWZmZXJzLnB1c2hfYmFjayhtYXBwZWRCdWZmZXIpOworICAgICAgICBtT2ZmbGluZU1ldGFJbmRleCA9IChpbnQzMl90KW1ldGFfYnVmX2lkeDsKKyAgICAgICAgTE9HRCgiTWFwcGVkIG1ldGEgYnVmZmVyIHdpdGggaW5kZXggJWQiLCBtT2ZmbGluZU1ldGFJbmRleCk7CisgICAgfQorCisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCBwYXJhbTsKKyAgICAgICAgdWludDMyX3QgbnVtUGVuZGluZ1ByaW9yaXR5RnJhbWVzID0gMDsKKworICAgICAgICBpZihpc1ByaW9yaXR5RnJhbWUgJiYgKG1SZXByb2Nlc3NUeXBlICE9IFJFUFJPQ0VTU19UWVBFX0pQRUcpKSB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtUHJpb3JpdHlGcmFtZXNMb2NrKTsKKyAgICAgICAgICAgIC8qIHJlYWQgdGhlIGxlbmd0aCBiZWZvcmUgcHVzaGluZyB0aGUgZnJhbWUgbnVtYmVyIHRvIGNoZWNrIGlmCisgICAgICAgICAgICAgKiB2ZWN0b3IgaXMgZW1wdHkgKi8KKyAgICAgICAgICAgIG51bVBlbmRpbmdQcmlvcml0eUZyYW1lcyA9IG1Qcmlvcml0eUZyYW1lcy5zaXplKCk7CisgICAgICAgICAgICBtUHJpb3JpdHlGcmFtZXMucHVzaChmcmFtZS0+ZnJhbWVOdW1iZXIpOworICAgICAgICB9CisKKyAgICAgICAgaWYoaXNQcmlvcml0eUZyYW1lICYmICFudW1QZW5kaW5nUHJpb3JpdHlGcmFtZXMgJiYKKyAgICAgICAgICAgIChtUmVwcm9jZXNzVHlwZSAhPSBSRVBST0NFU1NfVFlQRV9KUEVHKSkgeworICAgICAgICAgICAgbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCkpOworICAgICAgICAgICAgcGFyYW0udHlwZSA9IENBTV9TVFJFQU1fUEFSQU1fVFlQRV9SRVFVRVNUX09QU19NT0RFOworICAgICAgICAgICAgcGFyYW0ucGVyZl9tb2RlID0gQ0FNX1BFUkZfSElHSF9QRVJGT1JNQU5DRTsKKyAgICAgICAgICAgIHJjID0gcFN0cmVhbS0+c2V0UGFyYW1ldGVyKHBhcmFtKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogc2V0UGFyYW1ldGVyIGZvciBDQU1fUEVSRl9ISUdIX1BFUkZPUk1BTkNFIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtUHJpb3JpdHlGcmFtZXNMb2NrKTsKKyAgICAgICAgICAgICAgICBtUmVwcm9jZXNzUGVyZk1vZGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCkpOworICAgICAgICBwYXJhbS50eXBlID0gQ0FNX1NUUkVBTV9QQVJBTV9UWVBFX0RPX1JFUFJPQ0VTUzsKKyAgICAgICAgcGFyYW0ucmVwcm9jZXNzLmJ1Zl9pbmRleCA9IGJ1Zl9pZHg7CisgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5mcmFtZV9pZHggPSBmcmFtZS0+aW5wdXRfYnVmZmVyLmZyYW1lX2lkeDsKKyAgICAgICAgcGFyYW0ucmVwcm9jZXNzLm1ldGFfcHJlc2VudCA9IDE7CisgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5tZXRhX2J1Zl9pbmRleCA9IG1ldGFfYnVmX2lkeDsKKworICAgICAgICBMT0dJKCJPZmZsaW5lIHJlcHJvY2Vzc2luZyBpZCA9ICVkIGJ1ZiBJZCA9ICVkIG1ldGEgaW5kZXggPSAlZCIsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5mcmFtZV9pZHgsIHBhcmFtLnJlcHJvY2Vzcy5idWZfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5tZXRhX2J1Zl9pbmRleCk7CisgICAgICAgIHJjID0gcFN0cmVhbS0+c2V0UGFyYW1ldGVyKHBhcmFtKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJzdHJlYW0gc2V0UGFyYW1ldGVyIGZvciByZXByb2Nlc3MgZmFpbGVkIik7CisgICAgICAgICAgICByZXNldFRvQ2FtUGVyZk5vcm1hbChmcmFtZS0+ZnJhbWVOdW1iZXIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiSW5wdXQgYnVmZmVyIG1lbW9yeSBtYXAgZmFpbGVkOiAlZCIsIHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZG9SZXByb2Nlc3MKKyAqCisgKiBERVNDUklQVElPTjogcmVxdWVzdCB0byBkbyBhIHJlcHJvY2VzcyBvbiB0aGUgZnJhbWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJ1Zl9mZCAgICAgOiBmZCB0byB0aGUgaW5wdXQgYnVmZmVyIHRoYXQgbmVlZHMgcmVwcm9jZXNzCisgKiAgIEBidWZmZXIgICAgIDogQnVmZmVyIHB0cgorICogICBAYnVmX2xlbmdodCA6IGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyCisgKiAgIEByZXRfdmFsICAgIDogcmVzdWx0IG9mIHJlcHJvY2Vzcy4KKyAqICAgICAgICAgICAgICAgICBFeGFtcGxlOiBDb3VsZCBiZSBmYWNlSUQgaW4gY2FzZSBvZiByZWdpc3RlciBmYWNlIGltYWdlLgorICogICBAbWV0YV9mcmFtZSA6IG1ldGFkYXRhIGZyYW1lLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsOjpkb1JlcHJvY2VzcyhpbnQgYnVmX2ZkLCB2b2lkICpidWZmZXIsIHNpemVfdCBidWZfbGVuZ3RoLAorICAgICAgICBpbnQzMl90ICZyZXRfdmFsLCBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKm1ldGFfZnJhbWUpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgaWYgKG1fbnVtU3RyZWFtcyA8IDEpIHsKKyAgICAgICAgTE9HRSgiTm8gcmVwcm9jZXNzIHN0cmVhbSBpcyBjcmVhdGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG1ldGFfZnJhbWUgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJEaWQgbm90IGdldCBjb3JyZXNwb25kaW5nIG1ldGFkYXRhIGluIHRpbWUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHVpbnQ4X3QgYnVmX2lkeCA9IDA7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbnVtU3RyZWFtczsgaSsrKSB7CisgICAgICAgIHJjID0gbVN0cmVhbXNbaV0tPm1hcEJ1ZihDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX0lOUFVUX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9pZHgsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX2ZkLCBidWZmZXIsIGJ1Zl9sZW5ndGgpOworCisgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90IHBhcmFtOworICAgICAgICAgICAgbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCkpOworICAgICAgICAgICAgcGFyYW0udHlwZSA9IENBTV9TVFJFQU1fUEFSQU1fVFlQRV9ET19SRVBST0NFU1M7CisgICAgICAgICAgICBwYXJhbS5yZXByb2Nlc3MuYnVmX2luZGV4ID0gYnVmX2lkeDsKKyAgICAgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5tZXRhX3ByZXNlbnQgPSAxOworICAgICAgICAgICAgcGFyYW0ucmVwcm9jZXNzLm1ldGFfc3RyZWFtX2hhbmRsZSA9IG1fcE1ldGFDaGFubmVsLT5tU3RyZWFtc1swXS0+Z2V0TXlTZXJ2ZXJJRCgpOworICAgICAgICAgICAgcGFyYW0ucmVwcm9jZXNzLm1ldGFfYnVmX2luZGV4ID0gbWV0YV9mcmFtZS0+YnVmc1swXS0+YnVmX2lkeDsKKworICAgICAgICAgICAgTE9HSSgiT25saW5lIHJlcHJvY2Vzc2luZyBpZCA9ICVkIGJ1ZiBJZCA9ICVkIG1ldGEgaW5kZXggPSAlZCIsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5mcmFtZV9pZHgsIHBhcmFtLnJlcHJvY2Vzcy5idWZfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5tZXRhX2J1Zl9pbmRleCk7CisgICAgICAgICAgICByYyA9IG1TdHJlYW1zW2ldLT5zZXRQYXJhbWV0ZXIocGFyYW0pOworICAgICAgICAgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IHBhcmFtLnJlcHJvY2Vzcy5yZXRfdmFsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0cmVhbXNbaV0tPnVubWFwQnVmKENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfSU5QVVRfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9pZHgsIC0xKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWRkUmVwcm9jU3RyZWFtc0Zyb21Tb3VyY2UKKyAqCisgKiBERVNDUklQVElPTjogYWRkIHJlcHJvY2VzcyBzdHJlYW1zIGZyb20gaW5wdXQgc291cmNlIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNvbmZpZyAgICAgICAgIDogcHAgZmVhdHVyZSBjb25maWd1cmF0aW9uCisgKiAgIEBzcmNfY29uZmlnICAgICA6IHNvdXJjZSByZXByb2Nlc3MgY29uZmlndXJhdGlvbgorICogICBAaXNUeXBlICAgICAgICAgOiB0eXBlIG9mIGltYWdlIHN0YWJpbGl6YXRpb24gcmVxdWlyZWQgb24gdGhpcyBzdHJlYW0KKyAqICAgQHBNZXRhQ2hhbm5lbCAgIDogcHRyIHRvIG1ldGFkYXRhIGNoYW5uZWwgdG8gZ2V0IGNvcnJlc3AuIG1ldGFkYXRhCisgKgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsOjphZGRSZXByb2NTdHJlYW1zRnJvbVNvdXJjZShjYW1fcHBfZmVhdHVyZV9jb25maWdfdCAmcHBfY29uZmlnLAorICAgICAgICBjb25zdCByZXByb2Nlc3NfY29uZmlnX3QgJnNyY19jb25maWcgLCBjYW1faXNfdHlwZV90IGlzX3R5cGUsCisgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqcE1ldGFDaGFubmVsKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIGNhbV9zdHJlYW1fcmVwcm9jX2NvbmZpZ190IHJlcHJvY2Vzc19jb25maWc7CisgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZTsKKworICAgIGNhbV9kaW1lbnNpb25fdCBzdHJlYW1EaW0gPSBzcmNfY29uZmlnLm91dHB1dF9zdHJlYW1fZGltOworCisgICAgaWYgKE5VTEwgIT0gc3JjX2NvbmZpZy5zcmNfY2hhbm5lbCkgeworICAgICAgICBRQ2FtZXJhM1N0cmVhbSAqcFNyY1N0cmVhbSA9IHNyY19jb25maWcuc3JjX2NoYW5uZWwtPmdldFN0cmVhbUJ5SW5kZXgoMCk7CisgICAgICAgIGlmIChwU3JjU3RyZWFtID09IE5VTEwpIHsKKyAgICAgICAgICAgTE9HRSgic291cmNlIGNoYW5uZWwgZG9lc24ndCBoYXZlIGEgc3RyZWFtIik7CisgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbVNyY1N0cmVhbUhhbmRsZXNbbV9udW1TdHJlYW1zXSA9IHBTcmNTdHJlYW0tPmdldE15SGFuZGxlKCk7CisgICAgfQorCisgICAgc3RyZWFtVHlwZSA9IENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0M7CisgICAgcmVwcm9jZXNzX2NvbmZpZy5wcF90eXBlID0gQ0FNX09GRkxJTkVfUkVQUk9DRVNTX1RZUEU7CisKKyAgICByZXByb2Nlc3NfY29uZmlnLm9mZmxpbmUuaW5wdXRfZm10ID0gc3JjX2NvbmZpZy5zdHJlYW1fZm9ybWF0OworICAgIHJlcHJvY2Vzc19jb25maWcub2ZmbGluZS5pbnB1dF9kaW0gPSBzcmNfY29uZmlnLmlucHV0X3N0cmVhbV9kaW07CisgICAgcmVwcm9jZXNzX2NvbmZpZy5vZmZsaW5lLmlucHV0X2J1Zl9wbGFuZXMucGxhbmVfaW5mbyA9CisgICAgICAgICAgICBzcmNfY29uZmlnLmlucHV0X3N0cmVhbV9wbGFuZV9pbmZvLnBsYW5lX2luZm87CisgICAgcmVwcm9jZXNzX2NvbmZpZy5vZmZsaW5lLm51bV9vZl9idWZzID0gKHVpbnQ4X3QpbU51bUJ1ZmZlcnM7CisgICAgcmVwcm9jZXNzX2NvbmZpZy5vZmZsaW5lLmlucHV0X3R5cGUgPSBzcmNfY29uZmlnLnN0cmVhbV90eXBlOworCisgICAgcmVwcm9jZXNzX2NvbmZpZy5wcF9mZWF0dXJlX2NvbmZpZyA9IHBwX2NvbmZpZzsKKyAgICBRQ2FtZXJhM1N0cmVhbSAqcFN0cmVhbSA9IG5ldyBRQ2FtZXJhM1N0cmVhbShtX2NhbUhhbmRsZSwKKyAgICAgICAgICAgIG1faGFuZGxlLAorICAgICAgICAgICAgbV9jYW1PcHMsCisgICAgICAgICAgICAmbVBhZGRpbmdJbmZvLAorICAgICAgICAgICAgKFFDYW1lcmEzQ2hhbm5lbCopdGhpcyk7CisgICAgaWYgKHBTdHJlYW0gPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJObyBtZW0gZm9yIFN0cmVhbSIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHJjID0gcFN0cmVhbS0+aW5pdChzdHJlYW1UeXBlLCBzcmNfY29uZmlnLnN0cmVhbV9mb3JtYXQsCisgICAgICAgICAgICBzdHJlYW1EaW0sIFJPVEFURV8wLCAmcmVwcm9jZXNzX2NvbmZpZywKKyAgICAgICAgICAgICh1aW50OF90KW1OdW1CdWZmZXJzLAorICAgICAgICAgICAgcmVwcm9jZXNzX2NvbmZpZy5wcF9mZWF0dXJlX2NvbmZpZy5mZWF0dXJlX21hc2ssCisgICAgICAgICAgICBpc190eXBlLAorICAgICAgICAgICAgMCwvKiBiYXRjaFNpemUgKi8KKyAgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbDo6c3RyZWFtQ2JSb3V0aW5lLCB0aGlzKTsKKworICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgIG1TdHJlYW1zW21fbnVtU3RyZWFtc10gPSBwU3RyZWFtOworICAgICAgICBtX251bVN0cmVhbXMrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gY3JlYXRlIHJlcHJvY2VzcyBzdHJlYW0iKTsKKyAgICAgICAgZGVsZXRlIHBTdHJlYW07CisgICAgfQorCisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1fcFNyY0NoYW5uZWwgPSBzcmNfY29uZmlnLnNyY19jaGFubmVsOworICAgICAgICBtX3BNZXRhQ2hhbm5lbCA9IHBNZXRhQ2hhbm5lbDsKKyAgICAgICAgbVJlcHJvY2Vzc1R5cGUgPSBzcmNfY29uZmlnLnJlcHJvY2Vzc190eXBlOworICAgICAgICBMT0dEKCJtUmVwcm9jZXNzVHlwZSBpcyAlZCIsIG1SZXByb2Nlc3NUeXBlKTsKKyAgICB9CisgICAgbW1fY2FtZXJhX3JlcV9idWZfdCBidWY7CisgICAgbWVtc2V0KCZidWYsIDB4MCwgc2l6ZW9mKGJ1ZikpOworICAgIGJ1Zi50eXBlID0gTU1fQ0FNRVJBX1JFUV9TVVBFUl9CVUY7CisgICAgYnVmLm51bV9idWZfcmVxdWVzdGVkID0gMTsKKyAgICBpZihtX2NhbU9wcy0+cmVxdWVzdF9zdXBlcl9idWYobV9jYW1IYW5kbGUsbV9oYW5kbGUsICZidWYpIDwgMCkgeworICAgICAgICBMT0dFKCJSZXF1ZXN0IGZvciBzdXBlciBidWZmZXIgZmFpbGVkIik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyogUUNhbWVyYTNTdXBwb3J0Q2hhbm5lbCBtZXRob2RzICovCisKK2NhbV9kaW1lbnNpb25fdCBRQ2FtZXJhM1N1cHBvcnRDaGFubmVsOjprRGltID0gezY0MCwgNDgwfTsKKworUUNhbWVyYTNTdXBwb3J0Q2hhbm5lbDo6UUNhbWVyYTNTdXBwb3J0Q2hhbm5lbCh1aW50MzJfdCBjYW1faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAorICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAorICAgICAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90ICpkaW0sCisgICAgICAgICAgICAgICAgICAgIGNhbV9mb3JtYXRfdCBzdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaHdfYW5hbHlzaXNfc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICBjYW1fY29sb3JfZmlsdGVyX2FycmFuZ2VtZW50X3QgY29sb3JfYXJyYW5nZW1lbnQsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLCB1aW50MzJfdCBudW1CdWZmZXJzKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwoY2FtX2hhbmRsZSwgY2hhbm5lbF9oYW5kbGUsIGNhbV9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIHBhZGRpbmdJbmZvLCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSwgbnVtQnVmZmVycyksCisgICAgICAgICAgICAgICAgICAgICAgICBtTWVtb3J5KE5VTEwpCit7CisgICAgbWVtY3B5KCZtRGltLCBkaW0sIHNpemVvZihjYW1fZGltZW5zaW9uX3QpKTsKKyAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CisgICAgbVN0cmVhbUZvcm1hdCA9IHN0cmVhbUZvcm1hdDsKKyAgIC8vIE1ha2UgQW5hbHlzaXMgc2FtZSBhcyBQcmV2aWV3IGZvcm1hdAorICAgaWYgKCFod19hbmFseXNpc19zdXBwb3J0ZWQgJiYgbVN0cmVhbVR5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTICYmCisgICAgICAgICAgIGNvbG9yX2FycmFuZ2VtZW50ICE9IENBTV9GSUxURVJfQVJSQU5HRU1FTlRfWSkgeworICAgICAgICBtU3RyZWFtRm9ybWF0ID0gZ2V0U3RyZWFtRGVmYXVsdEZvcm1hdChDQU1fU1RSRUFNX1RZUEVfUFJFVklFVyk7CisgICB9Cit9CisKK1FDYW1lcmEzU3VwcG9ydENoYW5uZWw6On5RQ2FtZXJhM1N1cHBvcnRDaGFubmVsKCkKK3sKKyAgICBkZXN0cm95KCk7CisKKyAgICBpZiAobU1lbW9yeSkgeworICAgICAgICBtTWVtb3J5LT5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbGV0ZSBtTWVtb3J5OworICAgICAgICBtTWVtb3J5ID0gTlVMTDsKKyAgICB9Cit9CisKK2ludDMyX3QgUUNhbWVyYTNTdXBwb3J0Q2hhbm5lbDo6aW5pdGlhbGl6ZShjYW1faXNfdHlwZV90IGlzVHlwZSkKK3sKKyAgICBpbnQzMl90IHJjOworCisgICAgaWYgKG1NZW1vcnkgfHwgbV9udW1TdHJlYW1zID4gMCkgeworICAgICAgICBMT0dFKCJtZXRhZGF0YSBjaGFubmVsIGFscmVhZHkgaW5pdGlhbGl6ZWQiKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgbUlzVHlwZSA9IGlzVHlwZTsKKyAgICByYyA9IFFDYW1lcmEzQ2hhbm5lbDo6YWRkU3RyZWFtKG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgbVN0cmVhbUZvcm1hdCwgbURpbSwgUk9UQVRFXzAsIE1JTl9TVFJFQU1JTkdfQlVGRkVSX05VTSwKKyAgICAgICAgICAgIG1Qb3N0UHJvY01hc2ssIG1Jc1R5cGUpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiYWRkU3RyZWFtIGZhaWxlZCIpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKK2ludDMyX3QgUUNhbWVyYTNTdXBwb3J0Q2hhbm5lbDo6cmVxdWVzdChidWZmZXJfaGFuZGxlX3QgKiAvKmJ1ZmZlciovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgLypmcmFtZU51bWJlciovKQoreworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBRQ2FtZXJhM1N1cHBvcnRDaGFubmVsOjpzdHJlYW1DYlJvdXRpbmUoCisgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYTNTdHJlYW0gKiAvKnN0cmVhbSovKQoreworICAgIGlmIChzdXBlcl9mcmFtZSA9PSBOVUxMIHx8IHN1cGVyX2ZyYW1lLT5udW1fYnVmcyAhPSAxKSB7CisgICAgICAgIExPR0UoInN1cGVyX2ZyYW1lIGlzIG5vdCB2YWxpZCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJ1ZkRvbmUoc3VwZXJfZnJhbWUpOworICAgIGZyZWUoc3VwZXJfZnJhbWUpOworfQorCitRQ2FtZXJhM1N0cmVhbU1lbSogUUNhbWVyYTNTdXBwb3J0Q2hhbm5lbDo6Z2V0U3RyZWFtQnVmcyh1aW50MzJfdCBsZW4pCit7CisgICAgaW50IHJjOworICAgIG1NZW1vcnkgPSBuZXcgUUNhbWVyYTNTdHJlYW1NZW0obU51bUJ1ZmZlcnMpOworICAgIGlmICghbU1lbW9yeSkgeworICAgICAgICBMT0dFKCJ1bmFibGUgdG8gY3JlYXRlIGhlYXAgbWVtb3J5Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByYyA9IG1NZW1vcnktPmFsbG9jYXRlQWxsKGxlbik7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJ1bmFibGUgdG8gYWxsb2NhdGUgaGVhcCBtZW1vcnkiKTsKKyAgICAgICAgZGVsZXRlIG1NZW1vcnk7CisgICAgICAgIG1NZW1vcnkgPSBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG1NZW1vcnk7Cit9CisKK3ZvaWQgUUNhbWVyYTNTdXBwb3J0Q2hhbm5lbDo6cHV0U3RyZWFtQnVmcygpCit7CisgICAgbU1lbW9yeS0+ZGVhbGxvY2F0ZSgpOworICAgIGRlbGV0ZSBtTWVtb3J5OworICAgIG1NZW1vcnkgPSBOVUxMOworfQorCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNDaGFubmVsLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM0NoYW5uZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGMxNjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNDaGFubmVsLmgKQEAgLTAsMCArMSw2MjggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1FDQU1FUkEzX0NIQU5ORUxfSF9fCisjZGVmaW5lIF9fUUNBTUVSQTNfQ0hBTk5FTF9IX18KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgImdyYWxsb2NfcHJpdi5oIgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiY2FtX2ludGYuaCIKKyNpbmNsdWRlICJjYW1fdHlwZXMuaCIKKyNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmEzLmgiCisjaW5jbHVkZSAiUUNhbWVyYTNIQUxIZWFkZXIuaCIKKyNpbmNsdWRlICJRQ2FtZXJhM01lbS5oIgorI2luY2x1ZGUgIlFDYW1lcmEzUG9zdFByb2MuaCIKKyNpbmNsdWRlICJRQ2FtZXJhM1N0cmVhbS5oIgorI2luY2x1ZGUgIlFDYW1lcmEzU3RyZWFtTWVtLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJtbV9qcGVnX2ludGVyZmFjZS5oIgorfQorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworI2RlZmluZSBNSU5fU1RSRUFNSU5HX0JVRkZFUl9OVU0gNysxMQorCisjZGVmaW5lIFFDQU1FUkFfRFVNUF9GUk1fUFJFVklFVyAgICAgICAgICAxCisjZGVmaW5lIFFDQU1FUkFfRFVNUF9GUk1fVklERU8gICAgICAgICAgICAoMTw8MSkKKyNkZWZpbmUgUUNBTUVSQV9EVU1QX0ZSTV9TTkFQU0hPVCAgICAgICAgICgxPDwyKQorI2RlZmluZSBRQ0FNRVJBX0RVTVBfRlJNX0NBTExCQUNLICAgICAgICAgKDE8PDMpCisjZGVmaW5lIFFDQU1FUkFfRFVNUF9GUk1fSU5QVVRfUkVQUk9DRVNTICAoMTw8NikKKwordHlwZWRlZiBpbnQ2NF90IG5zZWNzX3Q7CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKwordHlwZWRlZiB2b2lkICgqY2hhbm5lbF9jYl9yb3V0aW5lKShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKm1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmcmFtZV9udW1iZXIsIGJvb2wgaXNJbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworY2xhc3MgUUNhbWVyYTNDaGFubmVsCit7CitwdWJsaWM6CisgICAgUUNhbWVyYTNDaGFubmVsKHVpbnQzMl90IGNhbV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAorICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY2Jfcm91dGluZSBjYl9yb3V0aW5lLAorICAgICAgICAgICAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sCisgICAgICAgICAgICAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IHBvc3Rwcm9jZXNzX21hc2ssCisgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsIHVpbnQzMl90IG51bUJ1ZmZlcnMpOworICAgIHZpcnR1YWwgflFDYW1lcmEzQ2hhbm5lbCgpOworCisgICAgdmlydHVhbCBpbnQzMl90IHN0YXJ0KCk7CisgICAgdmlydHVhbCBpbnQzMl90IHN0b3AoKTsKKyAgICB2aXJ0dWFsIGludDMyX3Qgc2V0QmF0Y2hTaXplKHVpbnQzMl90KTsKKyAgICB2aXJ0dWFsIGludDMyX3QgcXVldWVCYXRjaEJ1ZigpOworICAgIHZpcnR1YWwgaW50MzJfdCBzZXRQZXJGcmFtZU1hcFVubWFwKGJvb2wgZW5hYmxlKTsKKyAgICBpbnQzMl90IGJ1ZkRvbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSk7CisgICAgaW50MzJfdCBzZXRCdW5kbGVJbmZvKGNvbnN0IGNhbV9idW5kbGVfY29uZmlnX3QgJmJ1bmRsZUluZm8pOworCisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJlYW1UeXBlTWFzaygpOworICAgIHVpbnQzMl90IGdldFN0cmVhbUlEKHVpbnQzMl90IHN0cmVhbU1hc2spOworICAgIHZvaWQgZGVzdHJveSgpOworICAgIHZpcnR1YWwgaW50MzJfdCBpbml0aWFsaXplKGNhbV9pc190eXBlX3QgaXNUeXBlKSA9IDA7CisgICAgdmlydHVhbCBpbnQzMl90IHJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICogLypidWZmZXIqLywKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAvKmZyYW1lTnVtYmVyKi8peyByZXR1cm4gMDt9OworICAgIHZpcnR1YWwgaW50MzJfdCByZXF1ZXN0KGJ1ZmZlcl9oYW5kbGVfdCAqIC8qYnVmZmVyKi8sCisgICAgICAgICAgICAgICAgdWludDMyX3QgLypmcmFtZU51bWJlciovLAorICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KiAvKnBJbnB1dEJ1ZmZlciovLAorICAgICAgICAgICAgICAgIG1ldGFkYXRhX2J1ZmZlcl90KiAvKm1ldGFkYXRhKi8peyByZXR1cm4gMDt9OworICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM1N0cmVhbSAqc3RyZWFtKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludDMyX3QgcmVnaXN0ZXJCdWZmZXIoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIGNhbV9pc190eXBlX3QgaXNUeXBlKSA9IDA7CisgICAgdmlydHVhbCBRQ2FtZXJhM1N0cmVhbU1lbSAqZ2V0U3RyZWFtQnVmcyh1aW50MzJfdCBsZW4pID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcHV0U3RyZWFtQnVmcygpID0gMDsKKyAgICB2aXJ0dWFsIGludDMyX3QgZmx1c2goKTsKKworICAgIFFDYW1lcmEzU3RyZWFtICpnZXRTdHJlYW1CeUhhbmRsZSh1aW50MzJfdCBzdHJlYW1IYW5kbGUpOworICAgIHVpbnQzMl90IGdldE15SGFuZGxlKCkgY29uc3Qge3JldHVybiBtX2hhbmRsZTt9OworICAgIHVpbnQzMl90IGdldE51bU9mU3RyZWFtcygpIGNvbnN0IHtyZXR1cm4gbV9udW1TdHJlYW1zO307CisgICAgdWludDMyX3QgZ2V0TnVtQnVmZmVycygpIGNvbnN0IHtyZXR1cm4gbU51bUJ1ZmZlcnM7fTsKKyAgICBRQ2FtZXJhM1N0cmVhbSAqZ2V0U3RyZWFtQnlJbmRleCh1aW50MzJfdCBpbmRleCk7CisKKyAgICBzdGF0aWMgdm9pZCBzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKKyAgICAgICAgICAgICAgICBRQ2FtZXJhM1N0cmVhbSAqc3RyZWFtLCB2b2lkICp1c2VyZGF0YSk7CisgICAgdm9pZCBkdW1wWVVWKG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lLCBjYW1fZGltZW5zaW9uX3QgZGltLAorICAgICAgICAgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCBvZmZzZXQsIHVpbnQ4X3QgbmFtZSk7CisgICAgYm9vbCBpc1VCV0NFbmFibGVkKCk7CisgICAgY2FtX2Zvcm1hdF90IGdldFN0cmVhbURlZmF1bHRGb3JtYXQoY2FtX3N0cmVhbV90eXBlX3QgdHlwZSk7CisKKyAgICB2b2lkICptVXNlckRhdGE7CisgICAgY2FtX3BhZGRpbmdfaW5mb190IG1QYWRkaW5nSW5mbzsKKyAgICBRQ2FtZXJhM1N0cmVhbSAqbVN0cmVhbXNbTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFXTsKKyAgICB1aW50MzJfdCBtX251bVN0cmVhbXM7Citwcm90ZWN0ZWQ6CisKKyAgICBpbnQzMl90IGFkZFN0cmVhbShjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgIGNhbV9mb3JtYXRfdCBzdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90IHN0cmVhbURpbSwKKyAgICAgICAgICAgICAgICAgICAgICBjYW1fcm90YXRpb25fdCBzdHJlYW1Sb3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG1pblN0cmVhbUJ1Zm51bSwKKyAgICAgICAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NNYXNrLAorICAgICAgICAgICAgICAgICAgICAgIGNhbV9pc190eXBlX3QgaXNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJhdGNoU2l6ZSA9IDApOworCisgICAgaW50MzJfdCBhbGxvY2F0ZVN0cmVhbUluZm9CdWYoY2FtZXJhM19zdHJlYW1fdCAqc3RyZWFtKTsKKworICAgIHVpbnQzMl90IG1fY2FtSGFuZGxlOworICAgIG1tX2NhbWVyYV9vcHNfdCAqbV9jYW1PcHM7CisgICAgYm9vbCBtX2JJc0FjdGl2ZTsKKworICAgIHVpbnQzMl90IG1faGFuZGxlOworCisKKyAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IG1EYXRhQ0I7CisKKworICAgIFFDYW1lcmEzSGVhcE1lbW9yeSAqbVN0cmVhbUluZm9CdWY7CisgICAgY2hhbm5lbF9jYl9yb3V0aW5lIG1DaGFubmVsQ0I7CisgICAgLy9jYW1fcGFkZGluZ19pbmZvX3QgKm1QYWRkaW5nSW5mbzsKKyAgICBjYW1fZmVhdHVyZV9tYXNrX3QgbVBvc3RQcm9jTWFzazsKKyAgICB1aW50MzJfdCBtWVVWRHVtcDsKKyAgICBjYW1faXNfdHlwZV90IG1Jc1R5cGU7CisgICAgdWludDMyX3QgbU51bUJ1ZmZlcnM7CisgICAgLyogRW5hYmxlIHVubWFwcGluZyBvZiBidWZmZXIgYmVmb3JlIGlzc3VpbmcgYnVmZmVyIGNhbGxiYWNrLiBEZWZhdWx0IHZhbHVlCisgICAgICogZm9yIHRoaXMgZmxhZyBpcyB0cnVlIGFuZCBpcyBzZWxlY3RpdmVseSBzZXQgdG8gZmFsc2UgZm9yIHRoZSB1c2VjYXNlcworICAgICAqIHN1Y2ggYXMgSEZSIHRvIGF2b2lkIGFueSBwZXJmb3JtYW5jZSBoaXQgZHVlIHRvIG1hcHBpbmcvdW5tYXBwaW5nICovCisgICAgYm9vbCAgICBtUGVyRnJhbWVNYXBVbm1hcEVuYWJsZTsKKyAgICB1aW50MzJfdCBtRnJtTnVtOworICAgIHVpbnQzMl90IG1EdW1wRnJtQ250OworICAgIHVpbnQzMl90IG1Ta2lwTW9kZTsKKyAgICB1aW50MzJfdCBtRHVtcFNraXBDbnQ7Cit9OworCisvKiBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsIGlzIHVzZWQgdG8gaGFuZGxlIGFsbCBzdHJlYW1zIHRoYXQgYXJlIGRpcmVjdGx5CisgKiBnZW5lcmF0ZWQgYnkgaGFyZHdhcmUgYW5kIGdpdmVuIHRvIGZyYW1ld29ya3Mgd2l0aG91dCBhbnkgcG9zdHByb2Nlc3NpbmcgYXQgSEFMLgorICogSXQgYWxzbyBoYW5kbGVzIGlucHV0IHN0cmVhbXMgdGhhdCByZXF1aXJlIHJlcHJvY2Vzc2luZyBieSBoYXJkd2FyZSBhbmQgdGhlbgorICogcmV0dXJuZWQgdG8gZnJhbWV3b3Jrcy4gKi8KK2NsYXNzIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwgOiBwdWJsaWMgUUNhbWVyYTNDaGFubmVsCit7CitwdWJsaWM6CisgICBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsKHVpbnQzMl90IGNhbV9oYW5kbGUsCisgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxfaGFuZGxlLAorICAgICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCisgICAgICAgICAgIGNoYW5uZWxfY2Jfcm91dGluZSBjYl9yb3V0aW5lLAorICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAorICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fdCAqc3RyZWFtLAorICAgICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSwKKyAgICAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IHBvc3Rwcm9jZXNzX21hc2ssCisgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqbWV0YWRhdGFDaGFubmVsLAorICAgICAgICAgICB1aW50MzJfdCBudW1CdWZmZXJzID0gTUFYX0lORkxJR0hUX1JFUVVFU1RTKTsKKworICAgIH5RQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsKCk7CisKKyAgICB2aXJ0dWFsIGludDMyX3QgaW5pdGlhbGl6ZShjYW1faXNfdHlwZV90IGlzVHlwZSk7CisgICAgdmlydHVhbCBpbnQzMl90IHJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsCisgICAgICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KiBwSW5wdXRCdWZmZXIsCisgICAgICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCogbWV0YWRhdGEpOworICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKKyAgICAgICAgICAgIFFDYW1lcmEzU3RyZWFtICpzdHJlYW0pOworICAgIHZpcnR1YWwgUUNhbWVyYTNTdHJlYW1NZW0gKmdldFN0cmVhbUJ1ZnModWludDMyX3QgbGVuKTsKKyAgICB2aXJ0dWFsIHZvaWQgcHV0U3RyZWFtQnVmcygpOworICAgIHZpcnR1YWwgaW50MzJfdCByZWdpc3RlckJ1ZmZlcihidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgY2FtX2lzX3R5cGVfdCBpc1R5cGUpOworCisgICAgdmlydHVhbCBpbnQzMl90IHN0b3AoKTsKKworICAgIHZpcnR1YWwgcmVwcm9jZXNzX3R5cGVfdCBnZXRSZXByb2Nlc3NUeXBlKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHJlcHJvY2Vzc0NiUm91dGluZShidWZmZXJfaGFuZGxlX3QgKnJlc3VsdEJ1ZmZlciwKKyAgICAgICAgICAgIHVpbnQzMl90IHJlc3VsdEZyYW1lTnVtYmVyKTsKKworICAgIGludDMyX3QgcXVldWVSZXByb2NNZXRhZGF0YShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKm1ldGFkYXRhKTsKKyAgICBpbnQzMl90IG1ldGFkYXRhQnVmRG9uZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnJlY3ZkX2ZyYW1lKTsKKyAgICBpbnQzMl90IHRyYW5zbGF0ZVN0cmVhbVR5cGVBbmRGb3JtYXQoY2FtZXJhM19zdHJlYW1fdCAqc3RyZWFtLAorICAgICAgICAgICAgY2FtX3N0cmVhbV90eXBlX3QgJnN0cmVhbVR5cGUsCisgICAgICAgICAgICBjYW1fZm9ybWF0X3QgJnN0cmVhbUZvcm1hdCk7CisgICAgaW50MzJfdCBzZXRSZXByb2NDb25maWcocmVwcm9jZXNzX2NvbmZpZ190ICZyZXByb2NfY2ZnLAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKnBJbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgIG1ldGFkYXRhX2J1ZmZlcl90ICptZXRhZGF0YSwKKyAgICAgICAgICAgIGNhbV9mb3JtYXRfdCBzdHJlYW1Gb3JtYXQsIGNhbV9kaW1lbnNpb25fdCBkaW0pOworICAgIGludDMyX3Qgc2V0RndrSW5wdXRQUERhdGEocWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICpzcmNfZnJhbWUsCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqcElucHV0QnVmZmVyLAorICAgICAgICAgICAgcmVwcm9jZXNzX2NvbmZpZ190ICpyZXByb2NfY2ZnLAorICAgICAgICAgICAgbWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhLAorICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpvdXRwdXRfYnVmZmVyLAorICAgICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIpOworICAgIGludDMyX3QgY2hlY2tTdHJlYW1DYkVycm9ycyhtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2ZyYW1lLAorICAgICAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSk7CisgICAgaW50MzJfdCBnZXRTdHJlYW1TaXplKGNhbV9kaW1lbnNpb25fdCAmZGltKTsKKworICAgIFFDYW1lcmEzUG9zdFByb2Nlc3NvciBtX3Bvc3Rwcm9jZXNzb3I7IC8vIHBvc3QgcHJvY2Vzc29yCisgICAgdm9pZCBzaG93RGVidWdGUFMoaW50MzJfdCBzdHJlYW1UeXBlKTsKKworcHJvdGVjdGVkOgorICAgIHVpbnQ4X3QgbURlYnVnRlBTOworICAgIGludCBtRnJhbWVDb3VudDsKKyAgICBpbnQgbUxhc3RGcmFtZUNvdW50OworICAgIG5zZWNzX3QgbUxhc3RGcHNUaW1lOworICAgIGJvb2wgaXNXTlJFbmFibGVkKCkge3JldHVybiBtX2JXTlJPbjt9OworICAgIHZvaWQgc3RhcnRQb3N0UHJvYyhjb25zdCByZXByb2Nlc3NfY29uZmlnX3QgJnJlcHJvY19jZmcpOworICAgIHZvaWQgaXNzdWVDaGFubmVsQ2IoYnVmZmVyX2hhbmRsZV90ICpyZXN1bHRCdWZmZXIsCisgICAgICAgICAgICB1aW50MzJfdCByZXN1bHRGcmFtZU51bWJlcik7CisgICAgaW50MzJfdCByZWxlYXNlT2ZmbGluZU1lbW9yeSh1aW50MzJfdCByZXN1bHRGcmFtZU51bWJlcik7CisKKyAgICBRQ2FtZXJhM1N0cmVhbU1lbSBtTWVtb3J5OyAvL291dHB1dCBidWZmZXIgYWxsb2NhdGVkIGJ5IGZ3aworICAgIGNhbWVyYTNfc3RyZWFtX3QgKm1DYW1lcmEzU3RyZWFtOworICAgIHVpbnQzMl90IG1OdW1CdWZzOworICAgIGNhbV9zdHJlYW1fdHlwZV90IG1TdHJlYW1UeXBlOworICAgIGNhbV9mb3JtYXRfdCBtU3RyZWFtRm9ybWF0OworICAgIHVpbnQ4X3QgbUludGVudDsKKworICAgIGJvb2wgbVBvc3RQcm9jU3RhcnRlZDsKKyAgICBib29sIG1JbnB1dEJ1ZmZlckNvbmZpZzsgICAvLyBTZXQgd2hlbiB0aGUgcHJvY2Vzc2luZyBjaGFubmVsIGlzIGNvbmZpZ3VyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcHJvY2Vzc2luZyBpbnB1dChmcmFtZXdvcmspIGJ1ZmZlcnMKKworICAgIFFDYW1lcmEzQ2hhbm5lbCAqbV9wTWV0YUNoYW5uZWw7CisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICptTWV0YUZyYW1lOworICAgIFFDYW1lcmEzU3RyZWFtTWVtIG1PZmZsaW5lTWVtb3J5OyAgICAgIC8vcmVwcm9jZXNzaW5nIGlucHV0IGJ1ZmZlcgorICAgIFFDYW1lcmEzU3RyZWFtTWVtIG1PZmZsaW5lTWV0YU1lbW9yeTsgLy9yZXByb2Nlc3NpbmcgbWV0YWRhdGEgYnVmZmVyCisgICAgTGlzdDx1aW50MzJfdD4gbUZyZWVPZmZsaW5lTWV0YUJ1ZmZlcnNMaXN0OworICAgIE11dGV4IG1GcmVlT2ZmbGluZU1ldGFCdWZmZXJzTG9jazsKKworcHJpdmF0ZToKKworICAgIGJvb2wgbV9iV05ST247Cit9OworCisvKiBRQ2FtZXJhM1JlZ3VsYXJDaGFubmVsIGlzIHVzZWQgdG8gaGFuZGxlIGFsbCBzdHJlYW1zIHRoYXQgYXJlIGRpcmVjdGx5CisgKiBnZW5lcmF0ZWQgYnkgaGFyZHdhcmUgYW5kIGdpdmVuIHRvIGZyYW1ld29ya3Mgd2l0aG91dCBhbnkgcG9zdHByb2Nlc3NpbmcgYXQgSEFMLgorICogRXhhbXBsZXMgYXJlOiBhbGwgSU1QTEVNRU5UQVRJT05fREVGSU5FRCBzdHJlYW1zLCBDUFVfUkVBRCBzdHJlYW1zLiAqLworY2xhc3MgUUNhbWVyYTNSZWd1bGFyQ2hhbm5lbCA6IHB1YmxpYyBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsCit7CitwdWJsaWM6CisgICAgUUNhbWVyYTNSZWd1bGFyQ2hhbm5lbCh1aW50MzJfdCBjYW1faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2NiX3JvdXRpbmUgY2Jfcm91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKm1ldGFkYXRhQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtQnVmZmVycyA9IE1BWF9JTkZMSUdIVF9SRVFVRVNUUyk7CisKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhM1JlZ3VsYXJDaGFubmVsKCk7CisKKyAgICB2aXJ0dWFsIGludDMyX3Qgc2V0QmF0Y2hTaXplKHVpbnQzMl90IGJhdGNoU2l6ZSk7CisgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJlYW1UeXBlTWFzaygpOworICAgIHZpcnR1YWwgaW50MzJfdCBxdWV1ZUJhdGNoQnVmKCk7CisgICAgdmlydHVhbCBpbnQzMl90IGluaXRpYWxpemUoY2FtX2lzX3R5cGVfdCBpc1R5cGUpOworICAgIHVzaW5nIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OnJlcXVlc3Q7CisgICAgdmlydHVhbCBpbnQzMl90IHJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKKyAgICB2aXJ0dWFsIHJlcHJvY2Vzc190eXBlX3QgZ2V0UmVwcm9jZXNzVHlwZSgpOworCitwcml2YXRlOgorICAgIGludDMyX3QgaW5pdGlhbGl6ZShzdHJ1Y3QgcHJpdmF0ZV9oYW5kbGVfdCAqcHJpdl9oYW5kbGUpOworCisgICAgdWludDMyX3QgbUJhdGNoU2l6ZTsKKyAgICBjYW1fcm90YXRpb25fdCBtUm90YXRpb247Cit9OworCisvKiBRQ2FtZXJhM01ldGFkYXRhQ2hhbm5lbCBpcyBmb3IgbWV0YWRhdGEgc3RyZWFtIGdlbmVyYXRlZCBieSBjYW1lcmEgZGFlbW9uLiAqLworY2xhc3MgUUNhbWVyYTNNZXRhZGF0YUNoYW5uZWwgOiBwdWJsaWMgUUNhbWVyYTNDaGFubmVsCit7CitwdWJsaWM6CisgICAgUUNhbWVyYTNNZXRhZGF0YUNoYW5uZWwodWludDMyX3QgY2FtX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtX29wcywKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jYl9yb3V0aW5lIGNiX3JvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sCisgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtQnVmZmVycyA9IE1JTl9TVFJFQU1JTkdfQlVGRkVSX05VTSk7CisgICAgdmlydHVhbCB+UUNhbWVyYTNNZXRhZGF0YUNoYW5uZWwoKTsKKworICAgIHZpcnR1YWwgaW50MzJfdCBpbml0aWFsaXplKGNhbV9pc190eXBlX3QgaXNUeXBlKTsKKworICAgIHZpcnR1YWwgaW50MzJfdCByZXF1ZXN0KGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLCB1aW50MzJfdCBmcmFtZU51bWJlcik7CisgICAgdmlydHVhbCB2b2lkIHN0cmVhbUNiUm91dGluZShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmEzU3RyZWFtICpzdHJlYW0pOworCisgICAgdmlydHVhbCBRQ2FtZXJhM1N0cmVhbU1lbSAqZ2V0U3RyZWFtQnVmcyh1aW50MzJfdCBsZSk7CisgICAgdmlydHVhbCB2b2lkIHB1dFN0cmVhbUJ1ZnMoKTsKKyAgICB2aXJ0dWFsIGludDMyX3QgcmVnaXN0ZXJCdWZmZXIoYnVmZmVyX2hhbmRsZV90ICogLypidWZmZXIqLywgY2FtX2lzX3R5cGVfdCAvKmlzVHlwZSovKQorICAgICAgICAgICAgeyByZXR1cm4gTk9fRVJST1I7IH07CisKK3ByaXZhdGU6CisgICAgUUNhbWVyYTNTdHJlYW1NZW0gKm1NZW1vcnk7Cit9OworCisvKiBRQ2FtZXJhM1Jhd0NoYW5uZWwgaXMgZm9yIG9wYXF1ZXUvY3Jvc3MtcGxhdGZvcm0gcmF3IHN0cmVhbSBjb250YWluaW5nCisgKiB2ZW5kb3Igc3BlY2lmaWMgYmF5ZXIgZGF0YSBvciAxNi1iaXQgdW5wYWNrZWQgYmF5ZXIgZGF0YSAqLworY2xhc3MgUUNhbWVyYTNSYXdDaGFubmVsIDogcHVibGljIFFDYW1lcmEzUmVndWxhckNoYW5uZWwKK3sKK3B1YmxpYzoKKyAgICBRQ2FtZXJhM1Jhd0NoYW5uZWwodWludDMyX3QgY2FtX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtX29wcywKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9jYl9yb3V0aW5lIGNiX3JvdXRpbmUsCisgICAgICAgICAgICAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKm1ldGFkYXRhQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCByYXdfMTYgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnVtQnVmZmVycyA9IE1BWF9JTkZMSUdIVF9SRVFVRVNUUyk7CisKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhM1Jhd0NoYW5uZWwoKTsKKworICAgIHZpcnR1YWwgaW50MzJfdCBpbml0aWFsaXplKGNhbV9pc190eXBlX3QgaXNUeXBlKTsKKworICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM1N0cmVhbSAqc3RyZWFtKTsKKworICAgIHZpcnR1YWwgcmVwcm9jZXNzX3R5cGVfdCBnZXRSZXByb2Nlc3NUeXBlKCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBtUmF3RHVtcDsKKyAgICBib29sIG1Jc1JhdzE2OworCisgICAgdm9pZCBkdW1wUmF3U25hcHNob3QobW1fY2FtZXJhX2J1Zl9kZWZfdCAqZnJhbWUpOworICAgIHZvaWQgY29udmVydExlZ2FjeVRvUmF3MTYobW1fY2FtZXJhX2J1Zl9kZWZfdCAqZnJhbWUpOworICAgIHZvaWQgY29udmVydE1pcGlUb1JhdzE2KG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lKTsKK307CisKKy8qCisgKiBRQ2FtZXJhM1Jhd0R1bXBDaGFubmVsIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seSBmb3IgUmF3IGR1bXAKKyAqLworCitjbGFzcyBRQ2FtZXJhM1Jhd0R1bXBDaGFubmVsIDogcHVibGljIFFDYW1lcmEzQ2hhbm5lbAoreworcHVibGljOgorICAgIFFDYW1lcmEzUmF3RHVtcENoYW5uZWwodWludDMyX3QgY2FtX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtX29wcywKKyAgICAgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90IHJhd0R1bXBTaXplLAorICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAorICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IHBvc3Rwcm9jZXNzX21hc2ssIHVpbnQzMl90IG51bUJ1ZmZlcnMgPSAzVSk7CisgICAgdmlydHVhbCB+UUNhbWVyYTNSYXdEdW1wQ2hhbm5lbCgpOworICAgIHZpcnR1YWwgaW50MzJfdCBpbml0aWFsaXplKGNhbV9pc190eXBlX3QgaXNUeXBlKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtQ2JSb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3VwZXJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSk7CisgICAgdmlydHVhbCBRQ2FtZXJhM1N0cmVhbU1lbSAqZ2V0U3RyZWFtQnVmcyh1aW50MzJfdCBsZSk7CisgICAgdmlydHVhbCB2b2lkIHB1dFN0cmVhbUJ1ZnMoKTsKKyAgICB2aXJ0dWFsIGludDMyX3QgcmVnaXN0ZXJCdWZmZXIoYnVmZmVyX2hhbmRsZV90ICogLypidWZmZXIqLywgY2FtX2lzX3R5cGVfdCAvKmlzVHlwZSovKQorICAgICAgICAgICAgeyByZXR1cm4gTk9fRVJST1I7IH07CisgICAgdmlydHVhbCBpbnQzMl90IHJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKKyAgICB2b2lkIGR1bXBSYXdTbmFwc2hvdChtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZSk7CisKK3B1YmxpYzoKKyAgICBjYW1fZGltZW5zaW9uX3QgbURpbTsKKworcHJpdmF0ZToKKyAgICBib29sIG1SYXdEdW1wOworICAgIFFDYW1lcmEzU3RyZWFtTWVtICptTWVtb3J5OworfTsKKworLyogUUNhbWVyYTNZVVZDaGFubmVsIGlzIHVzZWQgdG8gaGFuZGxlIGZsZXhpYmxlIFlVViBzdHJlYW1zIHRoYXQgYXJlIGRpcmVjdGx5CisgKiBnZW5lcmF0ZWQgYnkgaGFyZHdhcmUgYW5kIGdpdmVuIHRvIGZyYW1ld29ya3Mgd2l0aG91dCBhbnkgcG9zdHByb2Nlc3NpbmcgYXQgSEFMLgorICogSXQgaXMgYWxzbyB1c2VkIHRvIGhhbmRsZSBpbnB1dCBidWZmZXJzIHRoYXQgZ2VuZXJhdGUgWVVWIG91dHB1dHMgKi8KK2NsYXNzIFFDYW1lcmEzWVVWQ2hhbm5lbCA6IHB1YmxpYyBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsCit7CitwdWJsaWM6CisgICAgUUNhbWVyYTNZVVZDaGFubmVsKHVpbnQzMl90IGNhbV9oYW5kbGUsCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKKyAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtX29wcywKKyAgICAgICAgICAgIGNoYW5uZWxfY2Jfcm91dGluZSBjYl9yb3V0aW5lLAorICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nSW5mbywKKyAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fdCAqc3RyZWFtLAorICAgICAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUsCisgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKKyAgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqbWV0YWRhdGFDaGFubmVsKTsKKyAgICB+UUNhbWVyYTNZVVZDaGFubmVsKCk7CisgICAgdmlydHVhbCBpbnQzMl90IGluaXRpYWxpemUoY2FtX2lzX3R5cGVfdCBpc1R5cGUpOworICAgIHVzaW5nIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw6OnJlcXVlc3Q7CisgICAgdmlydHVhbCBpbnQzMl90IHJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsCisgICAgICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KiBwSW5wdXRCdWZmZXIsCisgICAgICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCogbWV0YWRhdGEsIGJvb2wgJm5lZWRNZXRhZGF0YSk7CisgICAgdmlydHVhbCByZXByb2Nlc3NfdHlwZV90IGdldFJlcHJvY2Vzc1R5cGUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtQ2JSb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3VwZXJfZnJhbWUsCisgICAgICAgICAgICBRQ2FtZXJhM1N0cmVhbSAqc3RyZWFtKTsKKyAgICB2aXJ0dWFsIHZvaWQgcHV0U3RyZWFtQnVmcygpOworICAgIHZpcnR1YWwgdm9pZCByZXByb2Nlc3NDYlJvdXRpbmUoYnVmZmVyX2hhbmRsZV90ICpyZXN1bHRCdWZmZXIsCisgICAgICAgIHVpbnQzMl90IHJlc3VsdEZyYW1lTnVtYmVyKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyOworICAgICAgICBib29sIG9mZmxpbmVQcEZsYWc7CisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqb3V0cHV0OworICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmNhbGxiYWNrX2J1ZmZlcjsKKyAgICB9IFBwSW5mbzsKKworICAgIC8vIFdoZXRoZXIgb2ZmbGluZSBwb3N0cHJvY2Vzc2luZyBpcyByZXF1aXJlZCBmb3IgdGhpcyBjaGFubmVsCisgICAgYm9vbCBtQnlwYXNzOworICAgIHVpbnQzMl90IG1GcmFtZUxlbjsKKworICAgIC8vIEN1cnJlbnQgZWRnZSwgbm9pc2UsIGFuZCBjcm9wIHJlZ2lvbiBzZXR0aW5nCisgICAgY2FtX2VkZ2VfYXBwbGljYXRpb25fdCBtRWRnZU1vZGU7CisgICAgdWludDMyX3QgbU5vaXNlUmVkTW9kZTsKKyAgICBjYW1fY3JvcF9yZWdpb25fdCBtQ3JvcFJlZ2lvbjsKKworICAgIC8vIE11dGV4IHRvIHByb3RlY3QgbU9mZmxpbmVQcEZsYWdNYXAgYW5kIG1GcmVlSGVhcEJ1ZmZlckxpc3QKKyAgICBNdXRleCBtT2ZmbGluZVBwTG9jazsKKyAgICAvLyBNYXAgYmV0d2VlbiBmcmVlIG51bWJlciBhbmQgd2hldGhlciB0aGUgcmVxdWVzdCBuZWVkcyB0byBiZQorICAgIC8vIHBvc3Rwcm9jZXNzZWQuCisgICAgTGlzdDxQcEluZm8+IG1PZmZsaW5lUHBJbmZvTGlzdDsKKyAgICAvLyBIZWFwIGJ1ZmZlciBpbmRleCBsaXN0CisgICAgTGlzdDx1aW50MzJfdD4gbUZyZWVIZWFwQnVmZmVyTGlzdDsKKworcHJpdmF0ZToKKyAgICBib29sIG5lZWRzRnJhbWVQb3N0cHJvY2Vzc2luZyhtZXRhZGF0YV9idWZmZXJfdCogbWV0YSk7CisgICAgaW50MzJfdCBoYW5kbGVPZmZsaW5lUHBDYWxsYmFjayh1aW50MzJfdCByZXN1bHRGcmFtZU51bWJlciwKKyAgICAgICAgICAgIFZlY3RvcjxtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKj4mIHBlbmRpbmdDYnMpOworfTsKKworLyogUUNhbWVyYTNQaWNDaGFubmVsIGlzIGZvciBKUEVHIHN0cmVhbSwgd2hpY2ggY29udGFpbnMgYSBZVVYgc3RyZWFtIGdlbmVyYXRlZAorICogYnkgdGhlIGhhcmR3YXJlLCBhbmQgZW5jb2RlZCB0byBhIEpQRUcgc3RyZWFtICovCitjbGFzcyBRQ2FtZXJhM1BpY0NoYW5uZWwgOiBwdWJsaWMgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbAoreworcHVibGljOgorICAgIFFDYW1lcmEzUGljQ2hhbm5lbCh1aW50MzJfdCBjYW1faGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbF9oYW5kbGUsCisgICAgICAgICAgICBtbV9jYW1lcmFfb3BzX3QgKmNhbV9vcHMsCisgICAgICAgICAgICBjaGFubmVsX2NiX3JvdXRpbmUgY2Jfcm91dGluZSwKKyAgICAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZ0luZm8sCisgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbSwKKyAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgYm9vbCBpczRLVmlkZW8sCisgICAgICAgICAgICBib29sIGlzSW5wdXRTdHJlYW1Db25maWd1cmVkLAorICAgICAgICAgICAgUUNhbWVyYTNDaGFubmVsICptZXRhZGF0YUNoYW5uZWwsCisgICAgICAgICAgICB1aW50MzJfdCBudW1CdWZmZXJzID0gTUFYX0lORkxJR0hUX1JFUVVFU1RTKTsKKyAgICB+UUNhbWVyYTNQaWNDaGFubmVsKCk7CisKKyAgICB2aXJ0dWFsIGludDMyX3QgaW5pdGlhbGl6ZShjYW1faXNfdHlwZV90IGlzVHlwZSk7CisgICAgdmlydHVhbCBpbnQzMl90IGZsdXNoKCk7CisgICAgdmlydHVhbCBpbnQzMl90IHJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsCisgICAgICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KiBwSW5wdXRCdWZmZXIsCisgICAgICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCogbWV0YWRhdGEpOworICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKKyAgICAgICAgICAgIFFDYW1lcmEzU3RyZWFtICpzdHJlYW0pOworCisgICAgdmlydHVhbCBRQ2FtZXJhM1N0cmVhbU1lbSAqZ2V0U3RyZWFtQnVmcyh1aW50MzJfdCBsZSk7CisgICAgdmlydHVhbCB2b2lkIHB1dFN0cmVhbUJ1ZnMoKTsKKyAgICB2aXJ0dWFsIHJlcHJvY2Vzc190eXBlX3QgZ2V0UmVwcm9jZXNzVHlwZSgpOworCisgICAgUUNhbWVyYTNFeGlmICpnZXRFeGlmRGF0YShtZXRhZGF0YV9idWZmZXJfdCAqbWV0YWRhdGEsCisgICAgICAgICAgICBqcGVnX3NldHRpbmdzX3QgKmpwZWdfc2V0dGluZ3MpOworICAgIHZvaWQgb3ZlcnJpZGVZdXZTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOworICAgIHN0YXRpYyB2b2lkIGpwZWdFdnRIYW5kbGUoanBlZ19qb2Jfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgdWludDMyX3QgLypjbGllbnRfaGRsKi8sCisgICAgICAgICAgICB1aW50MzJfdCBqb2JJZCwKKyAgICAgICAgICAgIG1tX2pwZWdfb3V0cHV0X3QgKnBfb3V0cHV0LAorICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworICAgIHN0YXRpYyB2b2lkIGRhdGFOb3RpZnlDQihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnJlY3ZkX2ZyYW1lLAorICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworCitwcml2YXRlOgorICAgIGludDMyX3QgcXVldWVKcGVnU2V0dGluZyh1aW50MzJfdCBvdXRfYnVmX2luZGV4LCBtZXRhZGF0YV9idWZmZXJfdCAqbWV0YWRhdGEpOworCitwdWJsaWM6CisgICAgY2FtX2RpbWVuc2lvbl90IG1fbWF4X3BpY19kaW07CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbU51bVNuYXBzaG90QnVmczsKKyAgICB1aW50MzJfdCBtWXV2V2lkdGgsIG1ZdXZIZWlnaHQ7CisgICAgaW50MzJfdCBtQ3VycmVudEJ1ZkluZGV4OworICAgIGJvb2wgbUlucHV0QnVmZmVySGludDsKKyAgICBRQ2FtZXJhM1N0cmVhbU1lbSAqbVl1dk1lbW9yeTsKKyAgICAvLyBLZWVwIGEgbGlzdCBvZiBmcmVlIGJ1ZmZlcnMKKyAgICBNdXRleCBtRnJlZUJ1ZmZlcnNMb2NrOworICAgIExpc3Q8dWludDMyX3Q+IG1GcmVlQnVmZmVyTGlzdDsKKyAgICB1aW50MzJfdCBtRnJhbWVMZW47Cit9OworCisvLyByZXByb2Nlc3MgY2hhbm5lbCBjbGFzcworY2xhc3MgUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsIDogcHVibGljIFFDYW1lcmEzQ2hhbm5lbAoreworcHVibGljOgorICAgIFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbCh1aW50MzJfdCBjYW1faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtX29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2NiX3JvdXRpbmUgY2Jfcm91dGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLCB2b2lkICpjaF9oZGwpOworICAgIFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbCgpOworICAgIHZpcnR1YWwgflFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbCgpOworICAgIC8vIG9mZmxpbmUgcmVwcm9jZXNzCisgICAgdmlydHVhbCBpbnQzMl90IHN0YXJ0KCk7CisgICAgdmlydHVhbCBpbnQzMl90IHN0b3AoKTsKKyAgICBpbnQzMl90IGRvUmVwcm9jZXNzT2ZmbGluZShxY2FtZXJhX2Z3a19pbnB1dF9wcF9kYXRhX3QgKmZyYW1lLAorICAgICAgICAgICAgYm9vbCBpc1ByaW9yaXR5RnJhbWUgPSBmYWxzZSk7CisgICAgaW50MzJfdCBkb1JlcHJvY2VzcyhpbnQgYnVmX2ZkLHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1Zl9sZW5ndGgsIGludDMyX3QgJnJldF92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKm1ldGFfYnVmKTsKKyAgICBpbnQzMl90IG92ZXJyaWRlTWV0YWRhdGEocWNhbWVyYV9oYWwzX3BwX2J1ZmZlcl90ICpwcF9idWZmZXIsCisgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICptZXRhX2J1ZmZlciwKKyAgICAgICAgICAgIGpwZWdfc2V0dGluZ3NfdCAqanBlZ19zZXR0aW5ncywKKyAgICAgICAgICAgIHFjYW1lcmFfZndrX2lucHV0X3BwX2RhdGFfdCAmZndrX2ZyYW1lKTsKKyAgICBpbnQzMl90IG92ZXJyaWRlRndrTWV0YWRhdGEocWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICpmcmFtZSk7CisgICAgdmlydHVhbCBRQ2FtZXJhM1N0cmVhbU1lbSAqZ2V0U3RyZWFtQnVmcyh1aW50MzJfdCBsZW4pOworICAgIHZpcnR1YWwgdm9pZCBwdXRTdHJlYW1CdWZzKCk7CisgICAgdmlydHVhbCBpbnQzMl90IGluaXRpYWxpemUoY2FtX2lzX3R5cGVfdCBpc1R5cGUpOworICAgIGludDMyX3QgdW5tYXBPZmZsaW5lQnVmZmVycyhib29sIGFsbCk7CisgICAgaW50MzJfdCBidWZEb25lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVjdmRfZnJhbWUpOworICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1DYlJvdXRpbmUobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlcl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM1N0cmVhbSAqc3RyZWFtKTsKKyAgICBzdGF0aWMgdm9pZCBkYXRhTm90aWZ5Q0IobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJkYXRhKTsKKyAgICBpbnQzMl90IGFkZFJlcHJvY1N0cmVhbXNGcm9tU291cmNlKGNhbV9wcF9mZWF0dXJlX2NvbmZpZ190ICZwcF9jb25maWcsCisgICAgICAgICAgIGNvbnN0IHJlcHJvY2Vzc19jb25maWdfdCAmc3JjX2NvbmZpZywKKyAgICAgICAgICAgY2FtX2lzX3R5cGVfdCBpc190eXBlLAorICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKnBNZXRhQ2hhbm5lbCk7CisgICAgUUNhbWVyYTNTdHJlYW0gKmdldFN0cmVhbUJ5U3JjSGFuZGxlKHVpbnQzMl90IHNyY0hhbmRsZSk7CisgICAgUUNhbWVyYTNTdHJlYW0gKmdldFNyY1N0cmVhbUJ5U3JjSGFuZGxlKHVpbnQzMl90IHNyY0hhbmRsZSk7CisgICAgdmlydHVhbCBpbnQzMl90IHJlZ2lzdGVyQnVmZmVyKGJ1ZmZlcl9oYW5kbGVfdCAqIGJ1ZmZlciwgY2FtX2lzX3R5cGVfdCBpc1R5cGUpOworCitwdWJsaWM6CisgICAgdm9pZCAqaW5wdXRDaEhhbmRsZTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIFFDYW1lcmEzU3RyZWFtICpzdHJlYW07CisgICAgICAgIGNhbV9tYXBwaW5nX2J1Zl90eXBlIHR5cGU7CisgICAgICAgIHVpbnQzMl90IGluZGV4OworICAgIH0gT2ZmbGluZUJ1ZmZlcjsKKworICAgIGludDMyX3QgcmVzZXRUb0NhbVBlcmZOb3JtYWwodWludDMyX3QgZnJhbWVOdW1iZXIpOworICAgIGFuZHJvaWQ6Okxpc3Q8T2ZmbGluZUJ1ZmZlcj4gbU9mZmxpbmVCdWZmZXJzOworICAgIGFuZHJvaWQ6Okxpc3Q8T2ZmbGluZUJ1ZmZlcj4gbU9mZmxpbmVNZXRhQnVmZmVyczsKKyAgICBpbnQzMl90IG1PZmZsaW5lQnVmZmVyc0luZGV4OworICAgIGludDMyX3QgbU9mZmxpbmVNZXRhSW5kZXg7CisgICAgdWludDMyX3QgbUZyYW1lTGVuOworICAgIE11dGV4IG1GcmVlQnVmZmVyc0xvY2s7IC8vIExvY2sgZm9yIGZyZWUgaGVhcCBidWZmZXJzCisgICAgTGlzdDxpbnQzMl90PiBtRnJlZUJ1ZmZlckxpc3Q7IC8vIEZyZWUgaGVhcCBidWZmZXJzIGxpc3QKKyAgICByZXByb2Nlc3NfdHlwZV90IG1SZXByb2Nlc3NUeXBlOworICAgIHVpbnQzMl90IG1TcmNTdHJlYW1IYW5kbGVzW01BWF9TVFJFQU1fTlVNX0lOX0JVTkRMRV07CisgICAgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCAqbV9wU3JjQ2hhbm5lbDsgLy8gcHRyIHRvIHNvdXJjZSBjaGFubmVsIGZvciByZXByb2Nlc3MKKyAgICBRQ2FtZXJhM0NoYW5uZWwgKm1fcE1ldGFDaGFubmVsOworICAgIFFDYW1lcmEzU3RyZWFtTWVtICptTWVtb3J5OworICAgIFFDYW1lcmEzU3RyZWFtTWVtIG1HcmFsbG9jTWVtb3J5OworICAgIFZlY3Rvcjx1aW50MzJfdD4gbVByaW9yaXR5RnJhbWVzOworICAgIE11dGV4ICAgICAgICAgICAgbVByaW9yaXR5RnJhbWVzTG9jazsKKyAgICBib29sICAgICAgICAgICAgIG1SZXByb2Nlc3NQZXJmTW9kZTsKK307CisKKworLyogUUNhbWVyYTNTdXBwb3J0Q2hhbm5lbCBpcyBmb3IgSEFMIGludGVybmFsIGNvbnN1bXB0aW9uIG9ubHkgKi8KK2NsYXNzIFFDYW1lcmEzU3VwcG9ydENoYW5uZWwgOiBwdWJsaWMgUUNhbWVyYTNDaGFubmVsCit7CitwdWJsaWM6CisgICAgUUNhbWVyYTNTdXBwb3J0Q2hhbm5lbCh1aW50MzJfdCBjYW1faGFuZGxlLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1fb3BzLAorICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAorICAgICAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90ICpkaW0sCisgICAgICAgICAgICAgICAgICAgIGNhbV9mb3JtYXRfdCBzdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaHdfYW5hbHlzaXNfc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICBjYW1fY29sb3JfZmlsdGVyX2FycmFuZ2VtZW50X3QgY29sb3JfYXJyYW5nZW1lbnQsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1CdWZmZXJzID0gTUlOX1NUUkVBTUlOR19CVUZGRVJfTlVNCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgdmlydHVhbCB+UUNhbWVyYTNTdXBwb3J0Q2hhbm5lbCgpOworCisgICAgdmlydHVhbCBpbnQzMl90IGluaXRpYWxpemUoY2FtX2lzX3R5cGVfdCBpc1R5cGUpOworCisgICAgdmlydHVhbCBpbnQzMl90IHJlcXVlc3QoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtQ2JSb3V0aW5lKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3VwZXJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIFFDYW1lcmEzU3RyZWFtTWVtICpnZXRTdHJlYW1CdWZzKHVpbnQzMl90IGxlKTsKKyAgICB2aXJ0dWFsIHZvaWQgcHV0U3RyZWFtQnVmcygpOworICAgIHZpcnR1YWwgaW50MzJfdCByZWdpc3RlckJ1ZmZlcihidWZmZXJfaGFuZGxlX3QgKiAvKmJ1ZmZlciovLCBjYW1faXNfdHlwZV90IC8qaXNUeXBlKi8pCisgICAgICAgICAgICB7IHJldHVybiBOT19FUlJPUjsgfTsKKworICAgIHN0YXRpYyBjYW1fZGltZW5zaW9uX3Qga0RpbTsKK3ByaXZhdGU6CisgICAgUUNhbWVyYTNTdHJlYW1NZW0gKm1NZW1vcnk7CisgICAgY2FtX2RpbWVuc2lvbl90IG1EaW07CisgICAgY2FtX3N0cmVhbV90eXBlX3QgbVN0cmVhbVR5cGU7CisgICAgY2FtX2Zvcm1hdF90IG1TdHJlYW1Gb3JtYXQ7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQorCisjZW5kaWYgLyogX19RQ0FNRVJBX0NIQU5ORUxfSF9fICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM0Nyb3BSZWdpb25NYXBwZXIuY3BwIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNDcm9wUmVnaW9uTWFwcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGEzOThiCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNDcm9wUmVnaW9uTWFwcGVyLmNwcApAQCAtMCwwICsxLDI3MiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorKiBtZXQ6CisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorI2RlZmluZSBMT0dfVEFHICJRQ2FtZXJhM0Nyb3BSZWdpb25NYXBwZXIiCisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJRQ2FtZXJhM0Nyb3BSZWdpb25NYXBwZXIuaCIKKyNpbmNsdWRlICJRQ2FtZXJhM0hXSS5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJtbV9jYW1lcmFfZGJnLmgiCit9CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgcWNhbWVyYSB7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYTNDcm9wUmVnaW9uTWFwcGVyCisgKgorICogREVTQ1JJUFRJT046IENvbnN0cnVjdG9yCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhM0Nyb3BSZWdpb25NYXBwZXI6OlFDYW1lcmEzQ3JvcFJlZ2lvbk1hcHBlcigpCisgICAgICAgIDogbVNlbnNvclcoMCksCisgICAgICAgICAgbVNlbnNvckgoMCksCisgICAgICAgICAgbUFjdGl2ZUFycmF5VygwKSwKKyAgICAgICAgICBtQWN0aXZlQXJyYXlIKDApCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogflFDYW1lcmEzQ3JvcFJlZ2lvbk1hcHBlcgorICoKKyAqIERFU0NSSVBUSU9OOiBkZXN0cnVjdG9yCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK1FDYW1lcmEzQ3JvcFJlZ2lvbk1hcHBlcjo6flFDYW1lcmEzQ3JvcFJlZ2lvbk1hcHBlcigpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdXBkYXRlCisgKgorICogREVTQ1JJUFRJT046IHVwZGF0ZSBzZW5zb3IgYWN0aXZlIGFycmF5IHNpemUgYW5kIHNlbnNvciBvdXRwdXQgc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAYWN0aXZlX2FycmF5X3cgOiBhY3RpdmUgYXJyYXkgd2lkdGgKKyAqICAgQGFjdGl2ZV9hcnJheV9oIDogYWN0aXZlIGFycmF5IGhlaWdodAorICogICBAc2Vuc29yX3cgICAgICAgOiBzZW5zb3Igb3V0cHV0IHdpZHRoCisgKiAgIEBzZW5zb3JfaCAgICAgICA6IHNlbnNvciBvdXRwdXQgaGVpZ2h0CisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0Nyb3BSZWdpb25NYXBwZXI6OnVwZGF0ZSh1aW50MzJfdCBhY3RpdmVfYXJyYXlfdywKKyAgICAgICAgdWludDMyX3QgYWN0aXZlX2FycmF5X2gsIHVpbnQzMl90IHNlbnNvcl93LAorICAgICAgICB1aW50MzJfdCBzZW5zb3JfaCkKK3sKKyAgICAvLyBTYW5pdHkgY2hlY2sKKyAgICBpZiAoYWN0aXZlX2FycmF5X3cgPT0gMCB8fCBhY3RpdmVfYXJyYXlfaCA9PSAwIHx8CisgICAgICAgICAgICBzZW5zb3JfdyA9PSAwIHx8IHNlbnNvcl9oID09IDApIHsKKyAgICAgICAgTE9HRSgiYWN0aXZlX2FycmF5IHNpemUgYW5kIHNlbnNvciBvdXRwdXQgc2l6ZSBtdXN0IGJlIG5vbiB6ZXJvIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGFjdGl2ZV9hcnJheV93IDwgc2Vuc29yX3cgfHwgYWN0aXZlX2FycmF5X2ggPCBzZW5zb3JfaCkgeworICAgICAgICBMT0dFKCJpbnZhbGlkIGlucHV0OiBhY3RpdmVfYXJyYXkgWyVkLCAlZF0sIHNlbnNvciBzaXplIFslZCwgJWRdIiwKKyAgICAgICAgICAgICAgICAgYWN0aXZlX2FycmF5X3csIGFjdGl2ZV9hcnJheV9oLCBzZW5zb3Jfdywgc2Vuc29yX2gpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1TZW5zb3JXID0gc2Vuc29yX3c7CisgICAgbVNlbnNvckggPSBzZW5zb3JfaDsKKyAgICBtQWN0aXZlQXJyYXlXID0gYWN0aXZlX2FycmF5X3c7CisgICAgbUFjdGl2ZUFycmF5SCA9IGFjdGl2ZV9hcnJheV9oOworCisgICAgTE9HSCgiYWN0aXZlX2FycmF5OiAlZCB4ICVkLCBzZW5zb3Igc2l6ZSAlZCB4ICVkIiwKKyAgICAgICAgICAgIG1BY3RpdmVBcnJheVcsIG1BY3RpdmVBcnJheUgsIG1TZW5zb3JXLCBtU2Vuc29ySCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdG9BY3RpdmVBcnJheQorICoKKyAqIERFU0NSSVBUSU9OOiBNYXAgY3JvcCByZWN0YW5nbGUgZnJvbSBzZW5zb3Igb3V0cHV0IHNwYWNlIHRvIGFjdGl2ZSBhcnJheSBzcGFjZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY3JvcF9sZWZ0ICAgOiB4IGNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZQorICogICBAY3JvcF90b3AgICAgOiB5IGNvb3JkaW5hdGUgb2YgdG9wIGxlZnQgY29ybmVyIG9mIHJlY3RhbmdsZQorICogICBAY3JvcF93aWR0aCAgOiB3aWR0aCBvZiByZWN0YW5nbGUKKyAqICAgQGNyb3BfaGVpZ2h0IDogaGVpZ2h0IG9mIHJlY3RhbmdsZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNDcm9wUmVnaW9uTWFwcGVyOjp0b0FjdGl2ZUFycmF5KGludDMyX3QmIGNyb3BfbGVmdCwgaW50MzJfdCYgY3JvcF90b3AsCisgICAgICAgIGludDMyX3QmIGNyb3Bfd2lkdGgsIGludDMyX3QmIGNyb3BfaGVpZ2h0KQoreworICAgIGlmIChtU2Vuc29yVyA9PSAwIHx8IG1TZW5zb3JIID09IDAgfHwKKyAgICAgICAgICAgIG1BY3RpdmVBcnJheVcgPT0gMCB8fCBtQWN0aXZlQXJyYXlIID09IDApIHsKKyAgICAgICAgTE9HRSgic2Vuc29yL2FjdGl2ZSBhcnJheSBzaXplcyBhcmUgbm90IGluaXRpYWxpemVkISIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY3JvcF9sZWZ0ID0gY3JvcF9sZWZ0ICogbUFjdGl2ZUFycmF5VyAvIG1TZW5zb3JXOworICAgIGNyb3BfdG9wID0gY3JvcF90b3AgKiBtQWN0aXZlQXJyYXlIIC8gbVNlbnNvckg7CisgICAgY3JvcF93aWR0aCA9IGNyb3Bfd2lkdGggKiBtQWN0aXZlQXJyYXlXIC8gbVNlbnNvclc7CisgICAgY3JvcF9oZWlnaHQgPSBjcm9wX2hlaWdodCAqIG1BY3RpdmVBcnJheUggLyBtU2Vuc29ySDsKKworICAgIGJvdW5kVG9TaXplKGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3Bfd2lkdGgsIGNyb3BfaGVpZ2h0LAorICAgICAgICAgICAgbUFjdGl2ZUFycmF5VywgbUFjdGl2ZUFycmF5SCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdG9TZW5zb3IKKyAqCisgKiBERVNDUklQVElPTjogTWFwIGNyb3AgcmVjdGFuZ2xlIGZyb20gYWN0aXZlIGFycmF5IHNwYWNlIHRvIHNlbnNvciBvdXRwdXQgc3BhY2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNyb3BfbGVmdCAgIDogeCBjb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUKKyAqICAgQGNyb3BfdG9wICAgIDogeSBjb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUKKyAqICAgQGNyb3Bfd2lkdGggIDogd2lkdGggb2YgcmVjdGFuZ2xlCisgKiAgIEBjcm9wX2hlaWdodCA6IGhlaWdodCBvZiByZWN0YW5nbGUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgUUNhbWVyYTNDcm9wUmVnaW9uTWFwcGVyOjp0b1NlbnNvcihpbnQzMl90JiBjcm9wX2xlZnQsIGludDMyX3QmIGNyb3BfdG9wLAorICAgICAgICBpbnQzMl90JiBjcm9wX3dpZHRoLCBpbnQzMl90JiBjcm9wX2hlaWdodCkKK3sKKyAgICBpZiAobVNlbnNvclcgPT0gMCB8fCBtU2Vuc29ySCA9PSAwIHx8CisgICAgICAgICAgICBtQWN0aXZlQXJyYXlXID09IDAgfHwgbUFjdGl2ZUFycmF5SCA9PSAwKSB7CisgICAgICAgIExPR0UoInNlbnNvci9hY3RpdmUgYXJyYXkgc2l6ZXMgYXJlIG5vdCBpbml0aWFsaXplZCEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNyb3BfbGVmdCA9IGNyb3BfbGVmdCAqIG1TZW5zb3JXIC8gbUFjdGl2ZUFycmF5VzsKKyAgICBjcm9wX3RvcCA9IGNyb3BfdG9wICogbVNlbnNvckggLyBtQWN0aXZlQXJyYXlIOworICAgIGNyb3Bfd2lkdGggPSBjcm9wX3dpZHRoICogbVNlbnNvclcgLyBtQWN0aXZlQXJyYXlXOworICAgIGNyb3BfaGVpZ2h0ID0gY3JvcF9oZWlnaHQgKiBtU2Vuc29ySCAvIG1BY3RpdmVBcnJheUg7CisKKyAgICBMT0dEKCJiZWZvcmUgYm91bmRpbmcgbGVmdCAlZCwgdG9wICVkLCB3aWR0aCAlZCwgaGVpZ2h0ICVkIiwKKyAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3Bfd2lkdGgsIGNyb3BfaGVpZ2h0KTsKKyAgICBib3VuZFRvU2l6ZShjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3dpZHRoLCBjcm9wX2hlaWdodCwKKyAgICAgICAgICAgIG1TZW5zb3JXLCBtU2Vuc29ySCk7CisgICAgTE9HRCgiYWZ0ZXIgYm91bmRpbmcgbGVmdCAlZCwgdG9wICVkLCB3aWR0aCAlZCwgaGVpZ2h0ICVkIiwKKyAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3Bfd2lkdGgsIGNyb3BfaGVpZ2h0KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBib3VuZFRvU2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiBCb3VuZCBhIHBhcnRpY3VsYXIgcmVjdGFuZ2xlIGluc2lkZSBhIGJvdW5kaW5nIGJveAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbGVmdCAgICA6IHggY29vcmRpbmF0ZSBvZiB0b3AgbGVmdCBjb3JuZXIgb2YgcmVjdGFuZ2xlCisgKiAgIEB0b3AgICAgIDogeSBjb29yZGluYXRlIG9mIHRvcCBsZWZ0IGNvcm5lciBvZiByZWN0YW5nbGUKKyAqICAgQHdpZHRoICAgOiB3aWR0aCBvZiByZWN0YW5nbGUKKyAqICAgQGhlaWdodCAgOiBoZWlnaHQgb2YgcmVjdGFuZ2xlCisgKiAgIEBib3VuZF93IDogd2lkdGggb2YgYm91bmRpbmcgYm94CisgKiAgIEBib3VuZF95IDogaGVpZ2h0IG9mIGJvdW5kaW5nIGJveAorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNDcm9wUmVnaW9uTWFwcGVyOjpib3VuZFRvU2l6ZShpbnQzMl90JiBsZWZ0LCBpbnQzMl90JiB0b3AsCisgICAgICAgICAgICBpbnQzMl90JiB3aWR0aCwgaW50MzJfdCYgaGVpZ2h0LCBpbnQzMl90IGJvdW5kX3csIGludDMyX3QgYm91bmRfaCkKK3sKKyAgICBpZiAobGVmdCA8IDApIHsKKyAgICAgICAgbGVmdCA9IDA7CisgICAgfQorICAgIGlmICh0b3AgPCAwKSB7CisgICAgICAgIHRvcCA9IDA7CisgICAgfQorCisgICAgaWYgKChsZWZ0ICsgd2lkdGgpID4gYm91bmRfdykgeworICAgICAgICB3aWR0aCA9IGJvdW5kX3cgLSBsZWZ0OworICAgIH0KKyAgICBpZiAoKHRvcCArIGhlaWdodCkgPiBib3VuZF9oKSB7CisgICAgICAgIGhlaWdodCA9IGJvdW5kX2ggLSB0b3A7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHRvQWN0aXZlQXJyYXkKKyAqCisgKiBERVNDUklQVElPTjogTWFwIGNvLW9yZGluYXRlIGZyb20gc2Vuc29yIG91dHB1dCBzcGFjZSB0byBhY3RpdmUgYXJyYXkgc3BhY2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHggICA6IHggY29vcmRpbmF0ZQorICogICBAeSAgIDogeSBjb29yZGluYXRlCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0Nyb3BSZWdpb25NYXBwZXI6OnRvQWN0aXZlQXJyYXkodWludDMyX3QmIHgsIHVpbnQzMl90JiB5KQoreworICAgIGlmIChtU2Vuc29yVyA9PSAwIHx8IG1TZW5zb3JIID09IDAgfHwKKyAgICAgICAgICAgIG1BY3RpdmVBcnJheVcgPT0gMCB8fCBtQWN0aXZlQXJyYXlIID09IDApIHsKKyAgICAgICAgTE9HRSgic2Vuc29yL2FjdGl2ZSBhcnJheSBzaXplcyBhcmUgbm90IGluaXRpYWxpemVkISIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICgoeCA+IHN0YXRpY19jYXN0PHVpbnQzMl90PihtU2Vuc29yVykpIHx8CisgICAgICAgICAgICAoeSA+IHN0YXRpY19jYXN0PHVpbnQzMl90PihtU2Vuc29ySCkpKSB7CisgICAgICAgIExPR0UoImludmFsaWQgY28tb3JkaW5hdGUgKCVkLCAlZCkgaW4gKDAsIDAsICVkLCAlZCkgc3BhY2UiLAorICAgICAgICAgICAgICAgICB4LCB5LCBtU2Vuc29yVywgbVNlbnNvckgpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHggPSB4ICogbUFjdGl2ZUFycmF5VyAvIG1TZW5zb3JXOworICAgIHkgPSB5ICogbUFjdGl2ZUFycmF5SCAvIG1TZW5zb3JIOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHRvU2Vuc29yCisgKgorICogREVTQ1JJUFRJT046IE1hcCBjby1vcmRpbmF0ZSBmcm9tIGFjdGl2ZSBhcnJheSBzcGFjZSB0byBzZW5zb3Igb3V0cHV0IHNwYWNlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB4ICAgOiB4IGNvb3JkaW5hdGUKKyAqICAgQHkgICA6IHkgY29vcmRpbmF0ZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordm9pZCBRQ2FtZXJhM0Nyb3BSZWdpb25NYXBwZXI6OnRvU2Vuc29yKHVpbnQzMl90JiB4LCB1aW50MzJfdCYgeSkKK3sKKyAgICBpZiAobVNlbnNvclcgPT0gMCB8fCBtU2Vuc29ySCA9PSAwIHx8CisgICAgICAgICAgICBtQWN0aXZlQXJyYXlXID09IDAgfHwgbUFjdGl2ZUFycmF5SCA9PSAwKSB7CisgICAgICAgIExPR0UoInNlbnNvci9hY3RpdmUgYXJyYXkgc2l6ZXMgYXJlIG5vdCBpbml0aWFsaXplZCEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICgoeCA+IHN0YXRpY19jYXN0PHVpbnQzMl90PihtQWN0aXZlQXJyYXlXKSkgfHwKKyAgICAgICAgICAgICh5ID4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1BY3RpdmVBcnJheUgpKSkgeworICAgICAgICBMT0dFKCJpbnZhbGlkIGNvLW9yZGluYXRlICglZCwgJWQpIGluICgwLCAwLCAlZCwgJWQpIHNwYWNlIiwKKyAgICAgICAgICAgICAgICAgeCwgeSwgbVNlbnNvclcsIG1TZW5zb3JIKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB4ID0geCAqIG1TZW5zb3JXIC8gbUFjdGl2ZUFycmF5VzsKKyAgICB5ID0geSAqIG1TZW5zb3JIIC8gbUFjdGl2ZUFycmF5SDsKK30KKworfTsgLy9lbmQgbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzQ3JvcFJlZ2lvbk1hcHBlci5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNDcm9wUmVnaW9uTWFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjODU3OAotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzQ3JvcFJlZ2lvbk1hcHBlci5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyogbWV0OgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKi8KKworI2lmbmRlZiBfX1FDQU1FUkEzQ1JPUFJFR0lPTk1BUFBFUl9IX18KKyNkZWZpbmUgX19RQ0FNRVJBM0NST1BSRUdJT05NQVBQRVJfSF9fCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworY2xhc3MgUUNhbWVyYTNDcm9wUmVnaW9uTWFwcGVyIHsKK3B1YmxpYzoKKyAgICBRQ2FtZXJhM0Nyb3BSZWdpb25NYXBwZXIoKTsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhM0Nyb3BSZWdpb25NYXBwZXIoKTsKKworICAgIHZvaWQgdXBkYXRlKHVpbnQzMl90IGFjdGl2ZV9hcnJheV93LCB1aW50MzJfdCBhY3RpdmVfYXJyYXlfaCwKKyAgICAgICAgICAgIHVpbnQzMl90IHNlbnNvcl93LCB1aW50MzJfdCBzZW5zb3JfaCk7CisgICAgdm9pZCB0b0FjdGl2ZUFycmF5KGludDMyX3QmIGNyb3BfbGVmdCwgaW50MzJfdCYgY3JvcF90b3AsCisgICAgICAgICAgICBpbnQzMl90JiBjcm9wX3dpZHRoLCBpbnQzMl90JiBjcm9wX2hlaWdodCk7CisgICAgdm9pZCB0b1NlbnNvcihpbnQzMl90JiBjcm9wX2xlZnQsIGludDMyX3QmIGNyb3BfdG9wLAorICAgICAgICAgICAgaW50MzJfdCYgY3JvcF93aWR0aCwgaW50MzJfdCYgY3JvcF9oZWlnaHQpOworICAgIHZvaWQgdG9BY3RpdmVBcnJheSh1aW50MzJfdCYgeCwgdWludDMyX3QmIHkpOworICAgIHZvaWQgdG9TZW5zb3IodWludDMyX3QmIHgsIHVpbnQzMl90JiB5KTsKKworcHJpdmF0ZToKKyAgICAvKiBzZW5zb3Igb3V0cHV0IHNpemUgKi8KKyAgICBpbnQzMl90IG1TZW5zb3JXLCBtU2Vuc29ySDsKKyAgICBpbnQzMl90IG1BY3RpdmVBcnJheVcsIG1BY3RpdmVBcnJheUg7CisKKyAgICB2b2lkIGJvdW5kVG9TaXplKGludDMyX3QmIGxlZnQsIGludDMyX3QmIHRvcCwgaW50MzJfdCYgd2lkdGgsCisgICAgICAgICAgICBpbnQzMl90JiBoZWlnaHQsIGludDMyX3QgYm91bmRfdywgaW50MzJfdCBib3VuZF9oKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCisKKyNlbmRpZiAvKiBfX1FDQU1FUkEzQ1JPUFJFR0lPTk1BUFBFUl9IX18gKi8KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzSEFMSGVhZGVyLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM0hBTEhlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MmIxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM0hBTEhlYWRlci5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyogbWV0OgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKglub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyoJY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyoJZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisqCXdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworKgljb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyoJZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKi8KKyNpZm5kZWYgX19RQ0FNRVJBX0hBTEhFQURFUl9IX18KKyNkZWZpbmUgX19RQ0FNRVJBX0hBTEhFQURFUl9IX18KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgImhhcmR3YXJlL2dyYWxsb2MuaCIKKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgImNhbV90eXBlcy5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKworI2RlZmluZSBJU19VU0FHRV9aU0wodXNhZ2UpICAoKCh1c2FnZSkgJiAoR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMKSkgXAorICAgICAgICA9PSAoR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMKSkKKworY2xhc3MgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbDsKKworICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgIElOVkFMSUQsCisgICAgICAgIFZBTElELAorICAgIH0gc3RyZWFtX3N0YXR1c190OworCisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICBSRVBST0NFU1NfVFlQRV9OT05FLAorICAgICAgIFJFUFJPQ0VTU19UWVBFX0pQRUcsCisgICAgICAgUkVQUk9DRVNTX1RZUEVfWVVWLAorICAgICAgIFJFUFJPQ0VTU19UWVBFX1BSSVZBVEUsCisgICAgICAgUkVQUk9DRVNTX1RZUEVfUkFXCisgICAgfSByZXByb2Nlc3NfdHlwZV90OworCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICB1aW50MzJfdCBvdXRfYnVmX2luZGV4OworICAgICAgICBpbnQzMl90IGpwZWdfb3JpZW50YXRpb247CisgICAgICAgIHVpbnQ4X3QganBlZ19xdWFsaXR5OworICAgICAgICB1aW50OF90IGpwZWdfdGh1bWJfcXVhbGl0eTsKKyAgICAgICAgY2FtX2RpbWVuc2lvbl90IHRodW1ibmFpbF9zaXplOworICAgICAgICB1aW50OF90IGdwc190aW1lc3RhbXBfdmFsaWQ7CisgICAgICAgIGludDY0X3QgZ3BzX3RpbWVzdGFtcDsKKyAgICAgICAgdWludDhfdCBncHNfY29vcmRpbmF0ZXNfdmFsaWQ7CisgICAgICAgIGRvdWJsZSBncHNfY29vcmRpbmF0ZXNbM107CisgICAgICAgIGNoYXIgZ3BzX3Byb2Nlc3NpbmdfbWV0aG9kW0dQU19QUk9DRVNTSU5HX01FVEhPRF9TSVpFXTsKKyAgICAgICAgdWludDhfdCBpbWFnZV9kZXNjX3ZhbGlkOworICAgICAgICBjaGFyIGltYWdlX2Rlc2NbRVhJRl9JTUFHRV9ERVNDUklQVElPTl9TSVpFXTsKKyAgICB9IGpwZWdfc2V0dGluZ3NfdDsKKworICAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50MzJfdCBpc29fc3BlZWQ7CisgICAgICAgIGludDY0X3QgZXhwb3N1cmVfdGltZTsKKyAgICB9IG1ldGFkYXRhX3Jlc3BvbnNlX3Q7CisKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlOworICAgICAgICBjYW1fZm9ybWF0X3Qgc3RyZWFtX2Zvcm1hdDsKKyAgICAgICAgY2FtX2RpbWVuc2lvbl90IGlucHV0X3N0cmVhbV9kaW07CisgICAgICAgIGNhbV9zdHJlYW1fYnVmX3BsYW5lX2luZm9fdCBpbnB1dF9zdHJlYW1fcGxhbmVfaW5mbzsKKyAgICAgICAgY2FtX2RpbWVuc2lvbl90IG91dHB1dF9zdHJlYW1fZGltOworICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmc7CisgICAgICAgIHJlcHJvY2Vzc190eXBlX3QgcmVwcm9jZXNzX3R5cGU7CisgICAgICAgIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwgKnNyY19jaGFubmVsOworICAgIH0gcmVwcm9jZXNzX2NvbmZpZ190OworCit9Oy8vbmFtZXNwYWNlIHFjYW1lcmEKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM0hXSS5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM0hXSS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjMjY1ZAotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzSFdJLmNwcApAQCAtMCwwICsxLDExMTQzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYTNIV0kiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworCisvLyBUbyByZW1vdmUKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAidXRpbHMvVGltZXJzLmgiCisjaW5jbHVkZSAic3lzL2lvY3RsLmgiCisjaW5jbHVkZSA8c3luYy9zeW5jLmg+CisjaW5jbHVkZSAiZ3JhbGxvY19wcml2LmgiCisKKy8vIERpc3BsYXkgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAicWRNZXRhRGF0YS5oIgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiYW5kcm9pZC9RQ2FtZXJhM0V4dGVybmFsLmgiCisjaW5jbHVkZSAidXRpbC9RQ2FtZXJhRmxhc2guaCIKKyNpbmNsdWRlICJRQ2FtZXJhM0hXSS5oIgorI2luY2x1ZGUgIlFDYW1lcmEzVmVuZG9yVGFncy5oIgorI2luY2x1ZGUgIlFDYW1lcmFUcmFjZS5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJtbV9jYW1lcmFfZGJnLmgiCit9CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgcWNhbWVyYSB7CisKKyNkZWZpbmUgREFUQV9QVFIoTUVNX09CSixJTkRFWCkgTUVNX09CSi0+Z2V0UHRyKCBJTkRFWCApCisKKyNkZWZpbmUgRU1QVFlfUElQRUxJTkVfREVMQVkgMgorI2RlZmluZSBQQVJUSUFMX1JFU1VMVF9DT1VOVCAyCisjZGVmaW5lIEZSQU1FX1NLSVBfREVMQVkgICAgIDAKKworI2RlZmluZSBNQVhfVkFMVUVfOEJJVCAoKDE8PDgpLTEpCisjZGVmaW5lIE1BWF9WQUxVRV8xMEJJVCAoKDE8PDEwKS0xKQorI2RlZmluZSBNQVhfVkFMVUVfMTJCSVQgKCgxPDwxMiktMSkKKworI2RlZmluZSBWSURFT180S19XSURUSCAgMzg0MAorI2RlZmluZSBWSURFT180S19IRUlHSFQgMjE2MAorCisjZGVmaW5lIE1BWF9FSVNfV0lEVEggMTkyMAorI2RlZmluZSBNQVhfRUlTX0hFSUdIVCAxMDgwCisKKyNkZWZpbmUgTUFYX1JBV19TVFJFQU1TICAgICAgICAxCisjZGVmaW5lIE1BWF9TVEFMTElOR19TVFJFQU1TICAgMQorI2RlZmluZSBNQVhfUFJPQ0VTU0VEX1NUUkVBTVMgIDMKKy8qIEJhdGNoIG1vZGUgaXMgZW5hYmxlZCBvbmx5IGlmIEZQUyBzZXQgaXMgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHRoaXMgKi8KKyNkZWZpbmUgTUlOX0ZQU19GT1JfQkFUQ0hfTU9ERSAoMTIwKQorI2RlZmluZSBQUkVWSUVXX0ZQU19GT1JfSEZSICAgICgzMCkKKyNkZWZpbmUgREVGQVVMVF9WSURFT19GUFMgICAgICAoMzAuMCkKKyNkZWZpbmUgTUFYX0hGUl9CQVRDSF9TSVpFICAgICAoOCkKKyNkZWZpbmUgUkVHSU9OU19UVVBMRV9DT1VOVCAgICA1CisjZGVmaW5lIEhEUl9QTFVTX1BFUkZfVElNRV9PVVQgICg3MDAwKSAvLyBtaWxsaXNlY29uZHMKKy8vIFNldCBhIHRocmVzaG9sZCBmb3IgZGV0ZWN0aW9uIG9mIG1pc3NpbmcgYnVmZmVycyAvL3NlY29uZHMKKyNkZWZpbmUgTUlTU0lOR19SRVFVRVNUX0JVRl9USU1FT1VUIDMKKyNkZWZpbmUgRkxVU0hfVElNRU9VVCAzCisjZGVmaW5lIE1FVEFEQVRBX01BUF9TSVpFKE1BUCkgKHNpemVvZihNQVApL3NpemVvZihNQVBbMF0pKQorCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfUFBfU1VQRVJTRVRfSEFMMyAgICggQ0FNX1FDT01fRkVBVFVSRV9ERU5PSVNFMkQgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX0NST1AgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX1JPVEFUSU9OIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9TSEFSUE5FU1MgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX1NDQUxFIHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9DQUMgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX0NEUyApCisvKiBQZXIgY29uZmlndXJhdGlvbiBzaXplIGZvciBzdGF0aWMgbWV0YWRhdGEgbGVuZ3RoKi8KKyNkZWZpbmUgUEVSX0NPTkZJR1VSQVRJT05fU0laRV8zICgzKQorCisjZGVmaW5lIFRJTUVPVVRfTkVWRVIgLTEKKworLyogRmFjZSBsYW5kbWFya3MgaW5kaWNlcyAqLworI2RlZmluZSBMRUZUX0VZRV9YICAgICAgICAgICAgIDAKKyNkZWZpbmUgTEVGVF9FWUVfWSAgICAgICAgICAgICAxCisjZGVmaW5lIFJJR0hUX0VZRV9YICAgICAgICAgICAgMgorI2RlZmluZSBSSUdIVF9FWUVfWSAgICAgICAgICAgIDMKKyNkZWZpbmUgTU9VVEhfWCAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1PVVRIX1kgICAgICAgICAgICAgICAgNQorI2RlZmluZSBUT1RBTF9MQU5ETUFSS19JTkRJQ0VTIDYKKworY2FtX2NhcGFiaWxpdHlfdCAqZ0NhbUNhcGFiaWxpdHlbTU1fQ0FNRVJBX01BWF9OVU1fU0VOU09SU107Citjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqZ1N0YXRpY01ldGFkYXRhW01NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlNdOworZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCBnQ2FtTG9jazsKK3ZvbGF0aWxlIHVpbnQzMl90IGdDYW1IYWwzTG9nTGV2ZWwgPSAxOworZXh0ZXJuIHVpbnQ4X3QgZ051bUNhbWVyYVNlc3Npb25zOworCitjb25zdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpRQ2FtZXJhUHJvcE1hcCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpDRFNfTUFQIFtdID0geworICAgIHsiT24iLCAgQ0FNX0NEU19NT0RFX09OfSwKKyAgICB7Ik9mZiIsIENBTV9DRFNfTU9ERV9PRkZ9LAorICAgIHsiQXV0byIsQ0FNX0NEU19NT0RFX0FVVE99Cit9OworY29uc3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6UUNhbWVyYU1hcDwKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF92aWRlb19oZHJfbW9kZV90LAorICAgICAgICBjYW1fdmlkZW9faGRyX21vZGVfdD4gUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6VklERU9fSERSX01PREVTX01BUFtdID0geworICAgIHsgUUNBTUVSQTNfVklERU9fSERSX01PREVfT0ZGLCAgQ0FNX1ZJREVPX0hEUl9NT0RFX09GRiB9LAorICAgIHsgUUNBTUVSQTNfVklERU9fSERSX01PREVfT04sICAgQ0FNX1ZJREVPX0hEUl9NT0RFX09OIH0KK307CisKKworY29uc3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6UUNhbWVyYU1hcDwKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9pcl9tb2RlX3QsCisgICAgICAgIGNhbV9pcl9tb2RlX3R5cGVfdD4gUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6SVJfTU9ERVNfTUFQIFtdID0geworICAgIHtRQ0FNRVJBM19JUl9NT0RFX09GRiwgIENBTV9JUl9NT0RFX09GRn0sCisgICAge1FDQU1FUkEzX0lSX01PREVfT04sIENBTV9JUl9NT0RFX09OfSwKKyAgICB7UUNBTUVSQTNfSVJfTU9ERV9BVVRPLCBDQU1fSVJfTU9ERV9BVVRPfQorfTsKKworY29uc3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6UUNhbWVyYU1hcDwKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9jb250cm9sX2VmZmVjdF9tb2RlX3QsCisgICAgICAgIGNhbV9lZmZlY3RfbW9kZV90eXBlPiBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpFRkZFQ1RfTU9ERVNfTUFQW10gPSB7CisgICAgeyBBTkRST0lEX0NPTlRST0xfRUZGRUNUX01PREVfT0ZGLCAgICAgICBDQU1fRUZGRUNUX01PREVfT0ZGIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfRUZGRUNUX01PREVfTU9OTywgICAgICAgQ0FNX0VGRkVDVF9NT0RFX01PTk8gfSwKKyAgICB7IEFORFJPSURfQ09OVFJPTF9FRkZFQ1RfTU9ERV9ORUdBVElWRSwgICBDQU1fRUZGRUNUX01PREVfTkVHQVRJVkUgfSwKKyAgICB7IEFORFJPSURfQ09OVFJPTF9FRkZFQ1RfTU9ERV9TT0xBUklaRSwgICBDQU1fRUZGRUNUX01PREVfU09MQVJJWkUgfSwKKyAgICB7IEFORFJPSURfQ09OVFJPTF9FRkZFQ1RfTU9ERV9TRVBJQSwgICAgICBDQU1fRUZGRUNUX01PREVfU0VQSUEgfSwKKyAgICB7IEFORFJPSURfQ09OVFJPTF9FRkZFQ1RfTU9ERV9QT1NURVJJWkUsICBDQU1fRUZGRUNUX01PREVfUE9TVEVSSVpFIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfRUZGRUNUX01PREVfV0hJVEVCT0FSRCwgQ0FNX0VGRkVDVF9NT0RFX1dISVRFQk9BUkQgfSwKKyAgICB7IEFORFJPSURfQ09OVFJPTF9FRkZFQ1RfTU9ERV9CTEFDS0JPQVJELCBDQU1fRUZGRUNUX01PREVfQkxBQ0tCT0FSRCB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX0VGRkVDVF9NT0RFX0FRVUEsICAgICAgIENBTV9FRkZFQ1RfTU9ERV9BUVVBIH0KK307CisKK2NvbnN0IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OlFDYW1lcmFNYXA8CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfY29udHJvbF9hd2JfbW9kZV90LAorICAgICAgICBjYW1fd2JfbW9kZV90eXBlPiBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpXSElURV9CQUxBTkNFX01PREVTX01BUFtdID0geworICAgIHsgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFX09GRiwgICAgICAgICAgICAgQ0FNX1dCX01PREVfT0ZGIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfQVdCX01PREVfQVVUTywgICAgICAgICAgICBDQU1fV0JfTU9ERV9BVVRPIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfQVdCX01PREVfSU5DQU5ERVNDRU5ULCAgICBDQU1fV0JfTU9ERV9JTkNBTkRFU0NFTlQgfSwKKyAgICB7IEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERV9GTFVPUkVTQ0VOVCwgICAgIENBTV9XQl9NT0RFX0ZMVU9SRVNDRU5UIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfQVdCX01PREVfV0FSTV9GTFVPUkVTQ0VOVCxDQU1fV0JfTU9ERV9XQVJNX0ZMVU9SRVNDRU5UfSwKKyAgICB7IEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERV9EQVlMSUdIVCwgICAgICAgIENBTV9XQl9NT0RFX0RBWUxJR0hUIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfQVdCX01PREVfQ0xPVURZX0RBWUxJR0hULCBDQU1fV0JfTU9ERV9DTE9VRFlfREFZTElHSFQgfSwKKyAgICB7IEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERV9UV0lMSUdIVCwgICAgICAgIENBTV9XQl9NT0RFX1RXSUxJR0hUIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfQVdCX01PREVfU0hBREUsICAgICAgICAgICBDQU1fV0JfTU9ERV9TSEFERSB9Cit9OworCitjb25zdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpRQ2FtZXJhTWFwPAorICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2NvbnRyb2xfc2NlbmVfbW9kZV90LAorICAgICAgICBjYW1fc2NlbmVfbW9kZV90eXBlPiBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpTQ0VORV9NT0RFU19NQVBbXSA9IHsKKyAgICB7IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0ZBQ0VfUFJJT1JJVFksICBDQU1fU0NFTkVfTU9ERV9GQUNFX1BSSU9SSVRZIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9BQ1RJT04sICAgICAgICAgQ0FNX1NDRU5FX01PREVfQUNUSU9OIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9QT1JUUkFJVCwgICAgICAgQ0FNX1NDRU5FX01PREVfUE9SVFJBSVQgfSwKKyAgICB7IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0xBTkRTQ0FQRSwgICAgICBDQU1fU0NFTkVfTU9ERV9MQU5EU0NBUEUgfSwKKyAgICB7IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX05JR0hULCAgICAgICAgICBDQU1fU0NFTkVfTU9ERV9OSUdIVCB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfTklHSFRfUE9SVFJBSVQsIENBTV9TQ0VORV9NT0RFX05JR0hUX1BPUlRSQUlUIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9USEVBVFJFLCAgICAgICAgQ0FNX1NDRU5FX01PREVfVEhFQVRSRSB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfQkVBQ0gsICAgICAgICAgIENBTV9TQ0VORV9NT0RFX0JFQUNIIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9TTk9XLCAgICAgICAgICAgQ0FNX1NDRU5FX01PREVfU05PVyB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfU1VOU0VULCAgICAgICAgIENBTV9TQ0VORV9NT0RFX1NVTlNFVCB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfU1RFQURZUEhPVE8sICAgIENBTV9TQ0VORV9NT0RFX0FOVElTSEFLRSB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRklSRVdPUktTICwgICAgIENBTV9TQ0VORV9NT0RFX0ZJUkVXT1JLUyB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfU1BPUlRTICwgICAgICAgIENBTV9TQ0VORV9NT0RFX1NQT1JUUyB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfUEFSVFksICAgICAgICAgIENBTV9TQ0VORV9NT0RFX1BBUlRZIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9DQU5ETEVMSUdIVCwgICAgQ0FNX1NDRU5FX01PREVfQ0FORExFTElHSFQgfSwKKyAgICB7IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX0JBUkNPREUsICAgICAgICBDQU1fU0NFTkVfTU9ERV9CQVJDT0RFfQorfTsKKworY29uc3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6UUNhbWVyYU1hcDwKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9jb250cm9sX2FmX21vZGVfdCwKKyAgICAgICAgY2FtX2ZvY3VzX21vZGVfdHlwZT4gUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Rk9DVVNfTU9ERVNfTUFQW10gPSB7CisgICAgeyBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9PRkYsICAgICAgICAgICAgICAgIENBTV9GT0NVU19NT0RFX09GRiB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX0FGX01PREVfT0ZGLCAgICAgICAgICAgICAgICBDQU1fRk9DVVNfTU9ERV9GSVhFRCB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX0FGX01PREVfQVVUTywgICAgICAgICAgICAgICBDQU1fRk9DVVNfTU9ERV9BVVRPIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9NQUNSTywgICAgICAgICAgICAgIENBTV9GT0NVU19NT0RFX01BQ1JPIH0sCisgICAgeyBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9FRE9GLCAgICAgICAgICAgICAgIENBTV9GT0NVU19NT0RFX0VET0YgfSwKKyAgICB7IEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX0NPTlRJTlVPVVNfUElDVFVSRSwgQ0FNX0ZPQ1VTX01PREVfQ09OVElOT1VTX1BJQ1RVUkUgfSwKKyAgICB7IEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX0NPTlRJTlVPVVNfVklERU8sICAgQ0FNX0ZPQ1VTX01PREVfQ09OVElOT1VTX1ZJREVPIH0KK307CisKK2NvbnN0IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OlFDYW1lcmFNYXA8CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfY29sb3JfY29ycmVjdGlvbl9hYmVycmF0aW9uX21vZGVfdCwKKyAgICAgICAgY2FtX2FiZXJyYXRpb25fbW9kZV90PiBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpDT0xPUl9BQkVSUkFUSU9OX01BUFtdID0geworICAgIHsgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERV9PRkYsCisgICAgICAgICAgICBDQU1fQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX09GRiB9LAorICAgIHsgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERV9GQVNULAorICAgICAgICAgICAgQ0FNX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9GQVNUIH0sCisgICAgeyBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFX0hJR0hfUVVBTElUWSwKKyAgICAgICAgICAgIENBTV9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fSElHSF9RVUFMSVRZIH0sCit9OworCitjb25zdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpRQ2FtZXJhTWFwPAorICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2NvbnRyb2xfYWVfYW50aWJhbmRpbmdfbW9kZV90LAorICAgICAgICBjYW1fYW50aWJhbmRpbmdfbW9kZV90eXBlPiBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpBTlRJQkFORElOR19NT0RFU19NQVBbXSA9IHsKKyAgICB7IEFORFJPSURfQ09OVFJPTF9BRV9BTlRJQkFORElOR19NT0RFX09GRiwgIENBTV9BTlRJQkFORElOR19NT0RFX09GRiB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX0FFX0FOVElCQU5ESU5HX01PREVfNTBIWiwgQ0FNX0FOVElCQU5ESU5HX01PREVfNTBIWiB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX0FFX0FOVElCQU5ESU5HX01PREVfNjBIWiwgQ0FNX0FOVElCQU5ESU5HX01PREVfNjBIWiB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX0FFX0FOVElCQU5ESU5HX01PREVfQVVUTywgQ0FNX0FOVElCQU5ESU5HX01PREVfQVVUTyB9Cit9OworCitjb25zdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpRQ2FtZXJhTWFwPAorICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2NvbnRyb2xfYWVfbW9kZV90LAorICAgICAgICBjYW1fZmxhc2hfbW9kZV90PiBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpBRV9GTEFTSF9NT0RFX01BUFtdID0geworICAgIHsgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT0ZGLCAgICAgICAgICAgICAgICAgIENBTV9GTEFTSF9NT0RFX09GRiB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT04sICAgICAgICAgICAgICAgICAgIENBTV9GTEFTSF9NT0RFX09GRiB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT05fQVVUT19GTEFTSCwgICAgICAgIENBTV9GTEFTSF9NT0RFX0FVVE99LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT05fQUxXQVlTX0ZMQVNILCAgICAgIENBTV9GTEFTSF9NT0RFX09OICB9LAorICAgIHsgQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT05fQVVUT19GTEFTSF9SRURFWUUsIENBTV9GTEFTSF9NT0RFX0FVVE99Cit9OworCitjb25zdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpRQ2FtZXJhTWFwPAorICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2ZsYXNoX21vZGVfdCwKKyAgICAgICAgY2FtX2ZsYXNoX21vZGVfdD4gUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6RkxBU0hfTU9ERVNfTUFQW10gPSB7CisgICAgeyBBTkRST0lEX0ZMQVNIX01PREVfT0ZGLCAgICBDQU1fRkxBU0hfTU9ERV9PRkYgIH0sCisgICAgeyBBTkRST0lEX0ZMQVNIX01PREVfU0lOR0xFLCBDQU1fRkxBU0hfTU9ERV9TSU5HTEUgfSwKKyAgICB7IEFORFJPSURfRkxBU0hfTU9ERV9UT1JDSCwgIENBTV9GTEFTSF9NT0RFX1RPUkNIIH0KK307CisKK2NvbnN0IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OlFDYW1lcmFNYXA8CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc3RhdGlzdGljc19mYWNlX2RldGVjdF9tb2RlX3QsCisgICAgICAgIGNhbV9mYWNlX2RldGVjdF9tb2RlX3Q+IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OkZBQ0VERVRFQ1RfTU9ERVNfTUFQW10gPSB7CisgICAgeyBBTkRST0lEX1NUQVRJU1RJQ1NfRkFDRV9ERVRFQ1RfTU9ERV9PRkYsICAgIENBTV9GQUNFX0RFVEVDVF9NT0RFX09GRiAgICAgfSwKKyAgICB7IEFORFJPSURfU1RBVElTVElDU19GQUNFX0RFVEVDVF9NT0RFX1NJTVBMRSwgQ0FNX0ZBQ0VfREVURUNUX01PREVfU0lNUExFICB9LAorICAgIHsgQU5EUk9JRF9TVEFUSVNUSUNTX0ZBQ0VfREVURUNUX01PREVfRlVMTCwgICBDQU1fRkFDRV9ERVRFQ1RfTU9ERV9GVUxMICAgIH0KK307CisKK2NvbnN0IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OlFDYW1lcmFNYXA8CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfbGVuc19pbmZvX2ZvY3VzX2Rpc3RhbmNlX2NhbGlicmF0aW9uX3QsCisgICAgICAgIGNhbV9mb2N1c19jYWxpYnJhdGlvbl90PiBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpGT0NVU19DQUxJQlJBVElPTl9NQVBbXSA9IHsKKyAgICB7IEFORFJPSURfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OX1VOQ0FMSUJSQVRFRCwKKyAgICAgIENBTV9GT0NVU19VTkNBTElCUkFURUQgfSwKKyAgICB7IEFORFJPSURfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OX0FQUFJPWElNQVRFLAorICAgICAgQ0FNX0ZPQ1VTX0FQUFJPWElNQVRFIH0sCisgICAgeyBBTkRST0lEX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTl9DQUxJQlJBVEVELAorICAgICAgQ0FNX0ZPQ1VTX0NBTElCUkFURUQgfQorfTsKKworY29uc3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6UUNhbWVyYU1hcDwKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9sZW5zX3N0YXRlX3QsCisgICAgICAgIGNhbV9hZl9sZW5zX3N0YXRlX3Q+IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OkxFTlNfU1RBVEVfTUFQW10gPSB7CisgICAgeyBBTkRST0lEX0xFTlNfU1RBVEVfU1RBVElPTkFSWSwgICAgQ0FNX0FGX0xFTlNfU1RBVEVfU1RBVElPTkFSWX0sCisgICAgeyBBTkRST0lEX0xFTlNfU1RBVEVfTU9WSU5HLCAgICAgICAgQ0FNX0FGX0xFTlNfU1RBVEVfTU9WSU5HfQorfTsKKworY29uc3QgaW50MzJfdCBhdmFpbGFibGVfdGh1bWJuYWlsX3NpemVzW10gPSB7MCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NiwgMTQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwLCAxNDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTYsIDE0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MCwgMTYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU2LCAxNTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAsIDI0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMCwgMjQwfTsKKworY29uc3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6UUNhbWVyYU1hcDwKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zZW5zb3JfdGVzdF9wYXR0ZXJuX21vZGVfdCwKKyAgICAgICAgY2FtX3Rlc3RfcGF0dGVybl9tb2RlX3Q+IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OlRFU1RfUEFUVEVSTl9NQVBbXSA9IHsKKyAgICB7IEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFX09GRiwgICAgICAgICAgQ0FNX1RFU1RfUEFUVEVSTl9PRkYgICB9LAorICAgIHsgQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREVfU09MSURfQ09MT1IsICBDQU1fVEVTVF9QQVRURVJOX1NPTElEX0NPTE9SIH0sCisgICAgeyBBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fTU9ERV9DT0xPUl9CQVJTLCAgIENBTV9URVNUX1BBVFRFUk5fQ09MT1JfQkFSUyB9LAorICAgIHsgQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREVfQ09MT1JfQkFSU19GQURFX1RPX0dSQVksIENBTV9URVNUX1BBVFRFUk5fQ09MT1JfQkFSU19GQURFX1RPX0dSQVkgfSwKKyAgICB7IEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFX1BOOSwgICAgICAgICAgQ0FNX1RFU1RfUEFUVEVSTl9QTjkgfSwKKyAgICB7IEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFX0NVU1RPTTEsICAgICAgQ0FNX1RFU1RfUEFUVEVSTl9DVVNUT00xfSwKK307CisKKy8qIFNpbmNlIHRoZXJlIGlzIG5vIG1hcHBpbmcgZm9yIGFsbCB0aGUgb3B0aW9ucyBzb21lIEFuZHJvaWQgZW51bSBhcmUgbm90IGxpc3RlZC4KKyAqIEFsc28sIHRoZSBvcmRlciBpbiB0aGlzIGxpc3QgaXMgaW1wb3J0YW50IGJlY2F1c2Ugd2hpbGUgbWFwcGluZyBmcm9tIEhBTCB0byBBbmRyb2lkIGl0IHdpbGwKKyAqIHRyYXZlcnNlIGZyb20gbG93ZXIgdG8gaGlnaGVyIGluZGV4IHdoaWNoIG1lYW5zIHRoYXQgZm9yIEhBTCB2YWx1ZXMgdGhhdCBhcmUgbWFwIHRvIGRpZmZlcmVudAorICogQW5kcm9pZCB2YWx1ZXMsIHRoZSB0cmF2ZXJzZSBsb2dpYyB3aWxsIHNlbGVjdCB0aGUgZmlyc3Qgb25lIGZvdW5kLgorICovCitjb25zdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpRQ2FtZXJhTWFwPAorICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NlbnNvcl9yZWZlcmVuY2VfaWxsdW1pbmFudDFfdCwKKyAgICAgICAgY2FtX2lsbHVtaW5hdF90PiBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpSRUZFUkVOQ0VfSUxMVU1JTkFOVF9NQVBbXSA9IHsKKyAgICB7IEFORFJPSURfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMV9GTFVPUkVTQ0VOVCwgQ0FNX0FXQl9XQVJNX0ZMT30sCisgICAgeyBBTkRST0lEX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDFfREFZTElHSFRfRkxVT1JFU0NFTlQsIENBTV9BV0JfQ1VTVE9NX0RBWUxJR0hUIH0sCisgICAgeyBBTkRST0lEX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDFfQ09PTF9XSElURV9GTFVPUkVTQ0VOVCwgQ0FNX0FXQl9DT0xEX0ZMTyB9LAorICAgIHsgQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxX1NUQU5EQVJEX0EsIENBTV9BV0JfQSB9LAorICAgIHsgQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxX0Q1NSwgQ0FNX0FXQl9OT09OIH0sCisgICAgeyBBTkRST0lEX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDFfRDY1LCBDQU1fQVdCX0Q2NSB9LAorICAgIHsgQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxX0Q3NSwgQ0FNX0FXQl9ENzUgfSwKKyAgICB7IEFORFJPSURfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMV9ENTAsIENBTV9BV0JfRDUwIH0sCisgICAgeyBBTkRST0lEX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDFfSVNPX1NUVURJT19UVU5HU1RFTiwgQ0FNX0FXQl9DVVNUT01fQX0sCisgICAgeyBBTkRST0lEX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDFfREFZTElHSFQsIENBTV9BV0JfRDUwIH0sCisgICAgeyBBTkRST0lEX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDFfVFVOR1NURU4sIENBTV9BV0JfQSB9LAorICAgIHsgQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxX0ZJTkVfV0VBVEhFUiwgQ0FNX0FXQl9ENTAgfSwKKyAgICB7IEFORFJPSURfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMV9DTE9VRFlfV0VBVEhFUiwgQ0FNX0FXQl9ENjUgfSwKKyAgICB7IEFORFJPSURfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMV9TSEFERSwgQ0FNX0FXQl9ENzUgfSwKKyAgICB7IEFORFJPSURfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMV9EQVlfV0hJVEVfRkxVT1JFU0NFTlQsIENBTV9BV0JfQ1VTVE9NX0RBWUxJR0hUIH0sCisgICAgeyBBTkRST0lEX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDFfV0hJVEVfRkxVT1JFU0NFTlQsIENBTV9BV0JfQ09MRF9GTE99LAorfTsKKworY29uc3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6UUNhbWVyYU1hcDwKKyAgICAgICAgaW50MzJfdCwgY2FtX2hmcl9tb2RlX3Q+IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OkhGUl9NT0RFX01BUFtdID0geworICAgIHsgNjAsIENBTV9IRlJfTU9ERV82MEZQU30sCisgICAgeyA5MCwgQ0FNX0hGUl9NT0RFXzkwRlBTfSwKKyAgICB7IDEyMCwgQ0FNX0hGUl9NT0RFXzEyMEZQU30sCisgICAgeyAxNTAsIENBTV9IRlJfTU9ERV8xNTBGUFN9LAorICAgIHsgMTgwLCBDQU1fSEZSX01PREVfMTgwRlBTfSwKKyAgICB7IDIxMCwgQ0FNX0hGUl9NT0RFXzIxMEZQU30sCisgICAgeyAyNDAsIENBTV9IRlJfTU9ERV8yNDBGUFN9LAorICAgIHsgNDgwLCBDQU1fSEZSX01PREVfNDgwRlBTfSwKK307CisKK2NhbWVyYTNfZGV2aWNlX29wc190IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6Om1DYW1lcmFPcHMgPSB7CisgICAgLmluaXRpYWxpemUgICAgICAgICAgICAgICAgICAgICAgICAgPSBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjppbml0aWFsaXplLAorICAgIC5jb25maWd1cmVfc3RyZWFtcyAgICAgICAgICAgICAgICAgID0gUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Y29uZmlndXJlX3N0cmVhbXMsCisgICAgLnJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzICAgICAgICAgICAgPSBOVUxMLAorICAgIC5jb25zdHJ1Y3RfZGVmYXVsdF9yZXF1ZXN0X3NldHRpbmdzID0gUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Y29uc3RydWN0X2RlZmF1bHRfcmVxdWVzdF9zZXR0aW5ncywKKyAgICAucHJvY2Vzc19jYXB0dXJlX3JlcXVlc3QgICAgICAgICAgICA9IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OnByb2Nlc3NfY2FwdHVyZV9yZXF1ZXN0LAorICAgIC5nZXRfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMgICAgICAgID0gTlVMTCwKKyAgICAuZHVtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmR1bXAsCisgICAgLmZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpmbHVzaCwKKyAgICAucmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHswfSwKK307CisKKy8vIGluaXRpYWxpc2UgdG8gc29tZSBkZWZhdWx0IHZhbHVlCit1aW50MzJfdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpzZXNzaW9uSWRbXSA9IHsweERFQURCRUVGLCAweERFQURCRUVGLCAweERFQURCRUVGfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlCisgKgorICogREVTQ1JJUFRJT046IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYUlkICA6IGNhbWVyYSBJRAorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OlFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UodWludDMyX3QgY2FtZXJhSWQsCisgICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QgKmNhbGxiYWNrcykKKyAgICA6IG1DYW1lcmFJZChjYW1lcmFJZCksCisgICAgICBtQ2FtZXJhSGFuZGxlKE5VTEwpLAorICAgICAgbUNhbWVyYUluaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgIG1DYWxsYmFja09wcyhOVUxMKSwKKyAgICAgIG1NZXRhZGF0YUNoYW5uZWwoTlVMTCksCisgICAgICBtUGljdHVyZUNoYW5uZWwoTlVMTCksCisgICAgICBtUmF3Q2hhbm5lbChOVUxMKSwKKyAgICAgIG1TdXBwb3J0Q2hhbm5lbChOVUxMKSwKKyAgICAgIG1BbmFseXNpc0NoYW5uZWwoTlVMTCksCisgICAgICBtUmF3RHVtcENoYW5uZWwoTlVMTCksCisgICAgICBtRHVtbXlCYXRjaENoYW5uZWwoTlVMTCksCisgICAgICBtX3BlcmZMb2NrKCksCisgICAgICBtQ29tbW9uKCksCisgICAgICBtQ2hhbm5lbEhhbmRsZSgwKSwKKyAgICAgIG1GaXJzdENvbmZpZ3VyYXRpb24odHJ1ZSksCisgICAgICBtRmx1c2goZmFsc2UpLAorICAgICAgbUZsdXNoUGVyZihmYWxzZSksCisgICAgICBtUGFyYW1IZWFwKE5VTEwpLAorICAgICAgbVBhcmFtZXRlcnMoTlVMTCksCisgICAgICBtUHJldlBhcmFtZXRlcnMoTlVMTCksCisgICAgICBtX2JJc1ZpZGVvKGZhbHNlKSwKKyAgICAgIG1fYklzNEtWaWRlbyhmYWxzZSksCisgICAgICBtX2JFaXNTdXBwb3J0ZWRTaXplKGZhbHNlKSwKKyAgICAgIG1fYkVpc0VuYWJsZShmYWxzZSksCisgICAgICBtX01vYmljYXRNYXNrKDApLAorICAgICAgbU1pblByb2Nlc3NlZEZyYW1lRHVyYXRpb24oMCksCisgICAgICBtTWluSnBlZ0ZyYW1lRHVyYXRpb24oMCksCisgICAgICBtTWluUmF3RnJhbWVEdXJhdGlvbigwKSwKKyAgICAgIG1NZXRhRnJhbWVDb3VudCgwVSksCisgICAgICBtVXBkYXRlRGVidWdMZXZlbChmYWxzZSksCisgICAgICBtQ2FsbGJhY2tzKGNhbGxiYWNrcyksCisgICAgICBtQ2FwdHVyZUludGVudCgwKSwKKyAgICAgIG1DYWNNb2RlKDApLAorICAgICAgbUJhdGNoU2l6ZSgwKSwKKyAgICAgIG1Ub0JlUXVldWVkVmlkQnVmcygwKSwKKyAgICAgIG1IRlJWaWRlb0ZwcyhERUZBVUxUX1ZJREVPX0ZQUyksCisgICAgICBtT3BNb2RlKENBTUVSQTNfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREUpLAorICAgICAgbUZpcnN0RnJhbWVOdW1iZXJJbkJhdGNoKDApLAorICAgICAgbU5lZWRTZW5zb3JSZXN0YXJ0KGZhbHNlKSwKKyAgICAgIG1NaW5JbkZsaWdodFJlcXVlc3RzKE1JTl9JTkZMSUdIVF9SRVFVRVNUUyksCisgICAgICBtTWF4SW5GbGlnaHRSZXF1ZXN0cyhNQVhfSU5GTElHSFRfUkVRVUVTVFMpLAorICAgICAgbUxkYWZDYWxpYkV4aXN0KGZhbHNlKSwKKyAgICAgIG1Qb3dlckhpbnRFbmFibGVkKGZhbHNlKSwKKyAgICAgIG1MYXN0Q3VzdEludGVudEZybU51bSgtMSksCisgICAgICBtU3RhdGUoQ0xPU0VEKSwKKyAgICAgIG1Jc0RldmljZUxpbmtlZChmYWxzZSksCisgICAgICBtSXNNYWluQ2FtZXJhKHRydWUpLAorICAgICAgbUxpbmtlZENhbWVyYUlkKDApLAorICAgICAgbV9wUmVsQ2FtU3luY0hlYXAoTlVMTCksCisgICAgICBtX3BSZWxDYW1TeW5jQnVmKE5VTEwpCit7CisgICAgZ2V0TG9nTGV2ZWwoKTsKKyAgICBtX3BlcmZMb2NrLmxvY2tfaW5pdCgpOworICAgIG1Db21tb24uaW5pdChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0pOworICAgIG1DYW1lcmFEZXZpY2UuY29tbW9uLnRhZyA9IEhBUkRXQVJFX0RFVklDRV9UQUc7CisjaWZuZGVmIFVTRV9IQUxfM18zCisgICAgbUNhbWVyYURldmljZS5jb21tb24udmVyc2lvbiA9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OworI2Vsc2UKKyAgICBtQ2FtZXJhRGV2aWNlLmNvbW1vbi52ZXJzaW9uID0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM7CisjZW5kaWYKKyAgICBtQ2FtZXJhRGV2aWNlLmNvbW1vbi5jbG9zZSA9IGNsb3NlX2NhbWVyYV9kZXZpY2U7CisgICAgbUNhbWVyYURldmljZS5vcHMgPSAmbUNhbWVyYU9wczsKKyAgICBtQ2FtZXJhRGV2aWNlLnByaXYgPSB0aGlzOworICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+dmVyc2lvbiA9IENBTV9IQUxfVjM7CisgICAgLy8gVE9ETzogaGFyZGNvZGUgZm9yIG5vdyB1bnRpbCBtY3RsIGFkZCBzdXBwb3J0IGZvciBtaW5fbnVtX3BwX2J1ZnMKKyAgICAvL1RCRCAtIFRvIHNlZSBpZiB0aGlzIGhhcmRjb2RpbmcgaXMgbmVlZGVkLiBDaGVjayBieSBwcmludGluZyBpZiB0aGlzIGlzIGZpbGxlZCBieSBtY3RsIHRvIDMKKyAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPm1pbl9udW1fcHBfYnVmcyA9IDM7CisKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbUJ1ZmZlcnNDb25kLCBOVUxMKTsKKworICAgIHB0aHJlYWRfY29uZF9pbml0KCZtUmVxdWVzdENvbmQsIE5VTEwpOworICAgIG1QZW5kaW5nTGl2ZVJlcXVlc3QgPSAwOworICAgIG1DdXJyZW50UmVxdWVzdElkID0gLTE7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtTXV0ZXgsIE5VTEwpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBDQU1FUkEzX1RFTVBMQVRFX0NPVU5UOyBpKyspCisgICAgICAgIG1EZWZhdWx0TWV0YWRhdGFbaV0gPSBOVUxMOworCisgICAgLy8gR2V0dGluZyBzeXN0ZW0gcHJvcHMgb2YgZGlmZmVyZW50IGtpbmRzCisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5yYXcuZHVtcCIsIHByb3AsICIwIik7CisgICAgbUVuYWJsZVJhd0R1bXAgPSBhdG9pKHByb3ApOworICAgIGlmIChtRW5hYmxlUmF3RHVtcCkKKyAgICAgICAgTE9HRCgiUmF3IGR1bXAgZnJvbSBDYW1lcmEgSEFMIGVuYWJsZWQiKTsKKworICAgIG1lbXNldCgmbUlucHV0U3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1JbnB1dFN0cmVhbUluZm8pKTsKKyAgICBtZW1zZXQobUxkYWZDYWxpYiwgMCwgc2l6ZW9mKG1MZGFmQ2FsaWIpKTsKKworICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEudG5yLnByZXZpZXciLCBwcm9wLCAiMCIpOworICAgIG1fYlRuclByZXZpZXcgPSAodWludDhfdClhdG9pKHByb3ApOworCisgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS50bnIudmlkZW8iLCBwcm9wLCAiMCIpOworICAgIG1fYlRuclZpZGVvID0gKHVpbnQ4X3QpYXRvaShwcm9wKTsKKworICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuYXZ0aW1lci5kZWJ1ZyIsIHByb3AsICIwIik7CisgICAgbV9kZWJ1Z19hdnRpbWVyID0gKHVpbnQ4X3QpYXRvaShwcm9wKTsKKworICAgIC8vTG9hZCBhbmQgcmVhZCBHUFUgbGlicmFyeS4KKyAgICBsaWJfc3VyZmFjZV91dGlscyA9IE5VTEw7CisgICAgTElOS19nZXRfc3VyZmFjZV9waXhlbF9hbGlnbm1lbnQgPSBOVUxMOworICAgIG1TdXJmYWNlU3RyaWRlUGFkZGluZyA9IENBTV9QQURfVE9fMzI7CisgICAgbGliX3N1cmZhY2VfdXRpbHMgPSBkbG9wZW4oImxpYmFkcmVub191dGlscy5zbyIsIFJUTERfTk9XKTsKKyAgICBpZiAobGliX3N1cmZhY2VfdXRpbHMpIHsKKyAgICAgICAgKih2b2lkICoqKSZMSU5LX2dldF9zdXJmYWNlX3BpeGVsX2FsaWdubWVudCA9CisgICAgICAgICAgICAgICAgZGxzeW0obGliX3N1cmZhY2VfdXRpbHMsICJnZXRfZ3B1X3BpeGVsX2FsaWdubWVudCIpOworICAgICAgICAgaWYgKExJTktfZ2V0X3N1cmZhY2VfcGl4ZWxfYWxpZ25tZW50KSB7CisgICAgICAgICAgICAgbVN1cmZhY2VTdHJpZGVQYWRkaW5nID0gTElOS19nZXRfc3VyZmFjZV9waXhlbF9hbGlnbm1lbnQoKTsKKyAgICAgICAgIH0KKyAgICAgICAgIGRsY2xvc2UobGliX3N1cmZhY2VfdXRpbHMpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZQorICoKKyAqIERFU0NSSVBUSU9OOiBkZXN0cnVjdG9yIG9mIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6On5RQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlKCkKK3sKKyAgICBMT0dEKCJFIik7CisKKyAgICAvKiBUdXJuIG9mZiBjdXJyZW50IHBvd2VyIGhpbnQgYmVmb3JlIGFjcXVpcmluZyBwZXJmTG9jayBpbiBjYXNlIHRoZXkKKyAgICAgKiBjb25mbGljdCB3aXRoIGVhY2ggb3RoZXIgKi8KKyAgICBkaXNhYmxlUG93ZXJIaW50KCk7CisKKyAgICBtX3BlcmZMb2NrLmxvY2tfYWNxKCk7CisKKyAgICAvKiBXZSBuZWVkIHRvIHN0b3AgYWxsIHN0cmVhbXMgYmVmb3JlIGRlbGV0aW5nIGFueSBzdHJlYW0gKi8KKyAgICBpZiAobVJhd0R1bXBDaGFubmVsKSB7CisgICAgICAgIG1SYXdEdW1wQ2hhbm5lbC0+c3RvcCgpOworICAgIH0KKworICAgIC8vIE5PVEU6ICdjYW1lcmEzX3N0cmVhbV90IConIG9iamVjdHMgYXJlIGFscmVhZHkgZnJlZWQgYXQKKyAgICAvLyAgICAgICAgdGhpcyBzdGFnZSBieSB0aGUgZnJhbWV3b3JrCisgICAgZm9yIChMaXN0PHN0cmVhbV9pbmZvX3QgKj46Oml0ZXJhdG9yIGl0ID0gbVN0cmVhbUluZm8uYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gbVN0cmVhbUluZm8uZW5kKCk7IGl0KyspIHsKKyAgICAgICAgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCAqY2hhbm5lbCA9ICgqaXQpLT5jaGFubmVsOworICAgICAgICBpZiAoY2hhbm5lbCkgeworICAgICAgICAgICAgY2hhbm5lbC0+c3RvcCgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtU3VwcG9ydENoYW5uZWwpCisgICAgICAgIG1TdXBwb3J0Q2hhbm5lbC0+c3RvcCgpOworCisgICAgaWYgKG1BbmFseXNpc0NoYW5uZWwpIHsKKyAgICAgICAgbUFuYWx5c2lzQ2hhbm5lbC0+c3RvcCgpOworICAgIH0KKyAgICBpZiAobU1ldGFkYXRhQ2hhbm5lbCkgeworICAgICAgICBtTWV0YWRhdGFDaGFubmVsLT5zdG9wKCk7CisgICAgfQorICAgIGlmIChtQ2hhbm5lbEhhbmRsZSkgeworICAgICAgICBtQ2FtZXJhSGFuZGxlLT5vcHMtPnN0b3BfY2hhbm5lbChtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlKTsKKyAgICAgICAgTE9HRCgic3RvcHBpbmcgY2hhbm5lbCAlZCIsIG1DaGFubmVsSGFuZGxlKTsKKyAgICB9CisKKyAgICBmb3IgKExpc3Q8c3RyZWFtX2luZm9fdCAqPjo6aXRlcmF0b3IgaXQgPSBtU3RyZWFtSW5mby5iZWdpbigpOworICAgICAgICBpdCAhPSBtU3RyZWFtSW5mby5lbmQoKTsgaXQrKykgeworICAgICAgICBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsICpjaGFubmVsID0gKCppdCktPmNoYW5uZWw7CisgICAgICAgIGlmIChjaGFubmVsKQorICAgICAgICAgICAgZGVsZXRlIGNoYW5uZWw7CisgICAgICAgIGZyZWUgKCppdCk7CisgICAgfQorICAgIGlmIChtU3VwcG9ydENoYW5uZWwpIHsKKyAgICAgICAgZGVsZXRlIG1TdXBwb3J0Q2hhbm5lbDsKKyAgICAgICAgbVN1cHBvcnRDaGFubmVsID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUFuYWx5c2lzQ2hhbm5lbCkgeworICAgICAgICBkZWxldGUgbUFuYWx5c2lzQ2hhbm5lbDsKKyAgICAgICAgbUFuYWx5c2lzQ2hhbm5lbCA9IE5VTEw7CisgICAgfQorICAgIGlmIChtUmF3RHVtcENoYW5uZWwpIHsKKyAgICAgICAgZGVsZXRlIG1SYXdEdW1wQ2hhbm5lbDsKKyAgICAgICAgbVJhd0R1bXBDaGFubmVsID0gTlVMTDsKKyAgICB9CisgICAgaWYgKG1EdW1teUJhdGNoQ2hhbm5lbCkgeworICAgICAgICBkZWxldGUgbUR1bW15QmF0Y2hDaGFubmVsOworICAgICAgICBtRHVtbXlCYXRjaENoYW5uZWwgPSBOVUxMOworICAgIH0KKworICAgIG1QaWN0dXJlQ2hhbm5lbCA9IE5VTEw7CisKKyAgICBpZiAobU1ldGFkYXRhQ2hhbm5lbCkgeworICAgICAgICBkZWxldGUgbU1ldGFkYXRhQ2hhbm5lbDsKKyAgICAgICAgbU1ldGFkYXRhQ2hhbm5lbCA9IE5VTEw7CisgICAgfQorCisgICAgLyogQ2xlYW4gdXAgYWxsIGNoYW5uZWxzICovCisgICAgaWYgKG1DYW1lcmFJbml0aWFsaXplZCkgeworICAgICAgICBpZighbUZpcnN0Q29uZmlndXJhdGlvbil7CisgICAgICAgICAgICAvL3NlbmQgdGhlIGxhc3QgdW5jb25maWd1cmUKKyAgICAgICAgICAgIGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3Qgc3RyZWFtX2NvbmZpZ19pbmZvOworICAgICAgICAgICAgbWVtc2V0KCZzdHJlYW1fY29uZmlnX2luZm8sIDAsIHNpemVvZihjYW1fc3RyZWFtX3NpemVfaW5mb190KSk7CisgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uYnVmZmVyX2luZm8ubWluX2J1ZmZlcnMgPSBNSU5fSU5GTElHSFRfUkVRVUVTVFM7CisgICAgICAgICAgICBzdHJlYW1fY29uZmlnX2luZm8uYnVmZmVyX2luZm8ubWF4X2J1ZmZlcnMgPQorICAgICAgICAgICAgICAgICAgICBtX2JJczRLVmlkZW8gPyAwIDogTUFYX0lORkxJR0hUX1JFUVVFU1RTOworICAgICAgICAgICAgY2xlYXJfbWV0YWRhdGFfYnVmZmVyKG1QYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobVBhcmFtZXRlcnMsIENBTV9JTlRGX01FVEFfU1RSRUFNX0lORk8sCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mbyk7CisgICAgICAgICAgICBpbnQgcmMgPSBtQ2FtZXJhSGFuZGxlLT5vcHMtPnNldF9wYXJtcyhtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLCBtUGFyYW1ldGVycyk7CisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgic2V0X3Bhcm1zIGZhaWxlZCBmb3IgdW5jb25maWd1cmUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkZWluaXRQYXJhbWV0ZXJzKCk7CisgICAgfQorCisgICAgaWYgKG1DaGFubmVsSGFuZGxlKSB7CisgICAgICAgIG1DYW1lcmFIYW5kbGUtPm9wcy0+ZGVsZXRlX2NoYW5uZWwobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbEhhbmRsZSk7CisgICAgICAgIExPR0goImRlbGV0aW5nIGNoYW5uZWwgJWQiLCBtQ2hhbm5lbEhhbmRsZSk7CisgICAgICAgIG1DaGFubmVsSGFuZGxlID0gMDsKKyAgICB9CisKKyAgICBpZiAobVN0YXRlICE9IENMT1NFRCkKKyAgICAgICAgY2xvc2VDYW1lcmEoKTsKKworICAgIGZvciAoYXV0byAmcmVxIDogbVBlbmRpbmdCdWZmZXJzTWFwLm1QZW5kaW5nQnVmZmVyc0luUmVxdWVzdCkgeworICAgICAgICByZXEubVBlbmRpbmdCdWZmZXJMaXN0LmNsZWFyKCk7CisgICAgfQorICAgIG1QZW5kaW5nQnVmZmVyc01hcC5tUGVuZGluZ0J1ZmZlcnNJblJlcXVlc3QuY2xlYXIoKTsKKyAgICBtUGVuZGluZ1JlcHJvY2Vzc1Jlc3VsdExpc3QuY2xlYXIoKTsKKyAgICBmb3IgKHBlbmRpbmdSZXF1ZXN0SXRlcmF0b3IgaSA9IG1QZW5kaW5nUmVxdWVzdHNMaXN0LmJlZ2luKCk7CisgICAgICAgICAgICBpICE9IG1QZW5kaW5nUmVxdWVzdHNMaXN0LmVuZCgpOykgeworICAgICAgICBpID0gZXJhc2VQZW5kaW5nUmVxdWVzdChpKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBDQU1FUkEzX1RFTVBMQVRFX0NPVU5UOyBpKyspCisgICAgICAgIGlmIChtRGVmYXVsdE1ldGFkYXRhW2ldKQorICAgICAgICAgICAgZnJlZV9jYW1lcmFfbWV0YWRhdGEobURlZmF1bHRNZXRhZGF0YVtpXSk7CisKKyAgICBtX3BlcmZMb2NrLmxvY2tfcmVsKCk7CisgICAgbV9wZXJmTG9jay5sb2NrX2RlaW5pdCgpOworCisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJm1SZXF1ZXN0Q29uZCk7CisKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbUJ1ZmZlcnNDb25kKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbU11dGV4KTsKKyAgICBMT0dEKCJYIik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZXJhc2VQZW5kaW5nUmVxdWVzdAorICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byBlcmFzZSBhIGRlc2lyZWQgcGVuZGluZyByZXF1ZXN0IGFmdGVyIGZyZWVpbmcgYW55CisgKiAgICAgICAgICAgICAgYWxsb2NhdGVkIG1lbW9yeQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaSAgICAgICA6IGl0ZXJhdG9yIHBvaW50aW5nIHRvIHBlbmRpbmcgcmVxdWVzdCB0byBiZSBlcmFzZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIG5leHQgcmVxdWVzdAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpwZW5kaW5nUmVxdWVzdEl0ZXJhdG9yCisgICAgICAgIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmVyYXNlUGVuZGluZ1JlcXVlc3QgKHBlbmRpbmdSZXF1ZXN0SXRlcmF0b3IgaSkKK3sKKyAgICBpZiAoaS0+aW5wdXRfYnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgZnJlZShpLT5pbnB1dF9idWZmZXIpOworICAgICAgICBpLT5pbnB1dF9idWZmZXIgPSBOVUxMOworICAgIH0KKyAgICBpZiAoaS0+c2V0dGluZ3MgIT0gTlVMTCkKKyAgICAgICAgZnJlZV9jYW1lcmFfbWV0YWRhdGEoKGNhbWVyYV9tZXRhZGF0YV90KilpLT5zZXR0aW5ncyk7CisgICAgcmV0dXJuIG1QZW5kaW5nUmVxdWVzdHNMaXN0LmVyYXNlKGkpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhbUV2dEhhbmRsZQorICoKKyAqIERFU0NSSVBUSU9OOiBGdW5jdGlvbiByZWdpc3RlcmVkIHRvIG1tLWNhbWVyYS1pbnRlcmZhY2UgdG8gaGFuZGxlIGV2ZW50cworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZSA6IGludGVyZmFjZSBsYXllciBjYW1lcmEgaGFuZGxlCisgKiAgIEBldnQgICAgICAgICAgIDogcHRyIHRvIGV2ZW50CisgKiAgIEB1c2VyX2RhdGEgICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Y2FtRXZ0SGFuZGxlKHVpbnQzMl90IC8qY2FtZXJhX2hhbmRsZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2V2ZW50X3QgKmV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlICpvYmogPSAoUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSAqKXVzZXJfZGF0YTsKKyAgICBpZiAob2JqICYmIGV2dCkgeworICAgICAgICBzd2l0Y2goZXZ0LT5zZXJ2ZXJfZXZlbnRfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBDQU1fRVZFTlRfVFlQRV9EQUVNT05fRElFRDoKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm9iai0+bU11dGV4KTsKKyAgICAgICAgICAgICAgICBvYmotPm1TdGF0ZSA9IEVSUk9SOworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZvYmotPm1NdXRleCk7CisgICAgICAgICAgICAgICAgTE9HRSgiRmF0YWwsIGNhbWVyYSBkYWVtb24gZGllZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIENBTV9FVkVOVF9UWVBFX0RBRU1PTl9QVUxMX1JFUToKKyAgICAgICAgICAgICAgICBMT0dEKCJIQUwgZ290IHJlcXVlc3QgcHVsbCBmcm9tIERhZW1vbiIpOworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmb2JqLT5tTXV0ZXgpOworICAgICAgICAgICAgICAgIG9iai0+bVdva2VuVXBCeURhZW1vbiA9IHRydWU7CisgICAgICAgICAgICAgICAgb2JqLT51bmJsb2NrUmVxdWVzdElmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm9iai0+bU11dGV4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dXKCJXYXJuaW5nOiBVbmhhbmRsZWQgZXZlbnQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgZXZ0LT5zZXJ2ZXJfZXZlbnRfdHlwZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJOVUxMIHVzZXJfZGF0YS9ldnQiKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogb3BlbkNhbWVyYQorICoKKyAqIERFU0NSSVBUSU9OOiBvcGVuIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaHdfZGV2aWNlICA6IGRvdWJsZSBwdHIgZm9yIGNhbWVyYSBkZXZpY2Ugc3RydWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6Om9wZW5DYW1lcmEoc3RydWN0IGh3X2RldmljZV90ICoqaHdfZGV2aWNlKQoreworICAgIGludCByYyA9IDA7CisgICAgaWYgKG1TdGF0ZSAhPSBDTE9TRUQpIHsKKyAgICAgICAgKmh3X2RldmljZSA9IE5VTEw7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBtX3BlcmZMb2NrLmxvY2tfYWNxKCk7CisgICAgTE9HSSgiW0tQSSBQZXJmXTogRSBQUk9GSUxFX09QRU5fQ0FNRVJBIGNhbWVyYSBpZCAlZCIsCisgICAgICAgICAgICAgbUNhbWVyYUlkKTsKKworICAgIHJjID0gb3BlbkNhbWVyYSgpOworICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgICpod19kZXZpY2UgPSAmbUNhbWVyYURldmljZS5jb21tb247CisgICAgfSBlbHNlCisgICAgICAgICpod19kZXZpY2UgPSBOVUxMOworCisgICAgbV9wZXJmTG9jay5sb2NrX3JlbCgpOworICAgIExPR0koIltLUEkgUGVyZl06IFggUFJPRklMRV9PUEVOX0NBTUVSQSBjYW1lcmEgaWQgJWQsIHJjOiAlZCIsCisgICAgICAgICAgICAgbUNhbWVyYUlkLCByYyk7CisKKyAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbVN0YXRlID0gT1BFTkVEOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogb3BlbkNhbWVyYQorICoKKyAqIERFU0NSSVBUSU9OOiBvcGVuIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6Om9wZW5DYW1lcmEoKQoreworICAgIGludCByYyA9IDA7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworCisgICAgS1BJX0FUUkFDRV9DQUxMKCk7CisgICAgaWYgKG1DYW1lcmFIYW5kbGUpIHsKKyAgICAgICAgTE9HRSgiRmFpbHVyZTogQ2FtZXJhIGFscmVhZHkgb3BlbmVkIik7CisgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICB9CisKKyAgICByYyA9IFFDYW1lcmFGbGFzaDo6Z2V0SW5zdGFuY2UoKS5yZXNlcnZlRmxhc2hGb3JDYW1lcmEobUNhbWVyYUlkKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byByZXNlcnZlIGZsYXNoIGZvciBjYW1lcmEgaWQ6ICVkIiwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSWQpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByYyA9IGNhbWVyYV9vcGVuKCh1aW50OF90KW1DYW1lcmFJZCwgJm1DYW1lcmFIYW5kbGUpOworICAgIGlmIChyYykgeworICAgICAgICBMT0dFKCJjYW1lcmFfb3BlbiBmYWlsZWQuIHJjID0gJWQsIG1DYW1lcmFIYW5kbGUgPSAlcCIsIHJjLCBtQ2FtZXJhSGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmICghbUNhbWVyYUhhbmRsZSkgeworICAgICAgICBMT0dFKCJjYW1lcmFfb3BlbiBmYWlsZWQuIG1DYW1lcmFIYW5kbGUgPSAlcCIsIG1DYW1lcmFIYW5kbGUpOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICByYyA9IG1DYW1lcmFIYW5kbGUtPm9wcy0+cmVnaXN0ZXJfZXZlbnRfbm90aWZ5KG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICBjYW1FdnRIYW5kbGUsICh2b2lkICopdGhpcyk7CisKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoIkVycm9yLCBmYWlsZWQgdG8gcmVnaXN0ZXIgZXZlbnQgY2FsbGJhY2siKTsKKyAgICAgICAgLyogTm90IGNsb3NpbmcgY2FtZXJhIGhlcmUgc2luY2UgaXQgaXMgYWxyZWFkeSBoYW5kbGVkIGluIGRlc3RydWN0b3IgKi8KKyAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisKKyAgICBtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMgPQorICAgICAgICAgICAgKG1tX2pwZWdfZGVidWdfZXhpZl9wYXJhbXNfdCAqKSBtYWxsb2MgKHNpemVvZihtbV9qcGVnX2RlYnVnX2V4aWZfcGFyYW1zX3QpKTsKKyAgICBpZiAobUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zKSB7CisgICAgICAgIG1lbXNldChtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMsIDAsIHNpemVvZihtbV9qcGVnX2RlYnVnX2V4aWZfcGFyYW1zX3QpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJPdXQgb2YgTWVtb3J5LiBBbGxvY2F0aW9uIGZhaWxlZCBmb3IgM0EgZGVidWcgZXhpZiBwYXJhbXMiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbUZpcnN0Q29uZmlndXJhdGlvbiA9IHRydWU7CisKKyAgICAvL05vdGlmeSBkaXNwbGF5IEhBTCB0aGF0IGEgY2FtZXJhIHNlc3Npb24gaXMgYWN0aXZlLgorICAgIC8vQnV0IGF2b2lkIGNhbGxpbmcgdGhlIHNhbWUgZHVyaW5nIGJvb3R1cCBiZWNhdXNlIGNhbWVyYSBzZXJ2aWNlIG1pZ2h0IG9wZW4vY2xvc2UKKyAgICAvL2NhbWVyYXMgYXQgYm9vdCB0aW1lIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24gYW5kIGRpc3BsYXkgc2VydmljZSB3aWxsIGFsc28gaW50ZXJuYWxseQorICAgIC8vd2FpdCBmb3IgY2FtZXJhIHNlcnZpY2UgdG8gaW5pdGlhbGl6ZSBmaXJzdCB3aGlsZSBjYWxsaW5nIHRoaXMgZGlzcGxheSBBUEksIHJlc3VsdGluZyBpbiBhCisgICAgLy9kZWFkbG9jayBzaXR1YXRpb24uIFNpbmNlIGJvb3QgdGltZSBjYW1lcmEgb3Blbi9jbG9zZSBjYWxscyBhcmUgbWFkZSBvbmx5IHRvIGZldGNoCisgICAgLy9jYXBhYmlsaXRpZXMsIG5vIG5lZWQgb2YgdGhpcyBkaXNwbGF5IGJ3IG9wdGltaXphdGlvbi4KKyAgICAvL1VzZSAic2VydmljZS5ib290YW5pbS5leGl0IiBwcm9wZXJ0eSB0byBrbm93IGJvb3Qgc3RhdHVzLgorICAgIHByb3BlcnR5X2dldCgic2VydmljZS5ib290YW5pbS5leGl0IiwgdmFsdWUsICIwIik7CisgICAgaWYgKGF0b2kodmFsdWUpID09IDEpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnQ2FtTG9jayk7CisgICAgICAgIGlmIChnTnVtQ2FtZXJhU2Vzc2lvbnMrKyA9PSAwKSB7CisgICAgICAgICAgICBzZXRDYW1lcmFMYXVuY2hTdGF0dXModHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdDYW1Mb2NrKTsKKyAgICB9CisKKyAgICAvL2ZpbGwgdGhlIHNlc3Npb24gaWQgbmVlZGVkIHdoaWxlIGxpbmtpbmcgZHVhbCBjYW0KKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdDYW1Mb2NrKTsKKyAgICByYyA9IG1DYW1lcmFIYW5kbGUtPm9wcy0+Z2V0X3Nlc3Npb25faWQobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgJnNlc3Npb25JZFttQ2FtZXJhSWRdKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0NhbUxvY2spOworCisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJFcnJvciwgZmFpbGVkIHRvIGdldCBzZXNzaWlvbiBpZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICAvL0FsbG9jYXRlIHJlbGF0ZWQgY2FtIHN5bmMgYnVmZmVyCisgICAgICAgIC8vdGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBwYXlsb2FkIHRoYXQgZ29lcyBhbG9uZyB3aXRoIGJ1bmRsaW5nIGNtZCBmb3IgcmVsYXRlZAorICAgICAgICAvL2NhbWVyYSB1c2UgY2FzZXMKKyAgICAgICAgbV9wUmVsQ2FtU3luY0hlYXAgPSBuZXcgUUNhbWVyYTNIZWFwTWVtb3J5KDEpOworICAgICAgICByYyA9IG1fcFJlbENhbVN5bmNIZWFwLT5hbGxvY2F0ZShzaXplb2YoY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCkpOworICAgICAgICBpZihyYyAhPSBPSykgeworICAgICAgICAgICAgcmMgPSBOT19NRU1PUlk7CisgICAgICAgICAgICBMT0dFKCJEdWFsY2FtOiBGYWlsZWQgdG8gYWxsb2NhdGUgUmVsYXRlZCBjYW0gc3luYyBIZWFwIG1lbW9yeSIpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorCisgICAgICAgIC8vTWFwIG1lbW9yeSBmb3IgcmVsYXRlZCBjYW0gc3luYyBidWZmZXIKKyAgICAgICAgcmMgPSBtQ2FtZXJhSGFuZGxlLT5vcHMtPm1hcF9idWYobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TWU5DX1JFTEFURURfU0VOU09SU19CVUYsCisgICAgICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0hlYXAtPmdldEZkKDApLAorICAgICAgICAgICAgICAgIHNpemVvZihjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfZXZlbnRfaW5mb190KSwKKyAgICAgICAgICAgICAgICBtX3BSZWxDYW1TeW5jSGVhcC0+Z2V0UHRyKDApKTsKKyAgICAgICAgaWYocmMgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJEdWFsY2FtOiBmYWlsZWQgdG8gbWFwIFJlbGF0ZWQgY2FtIHN5bmMgYnVmZmVyIik7CisgICAgICAgICAgICByYyA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgbV9wUmVsQ2FtU3luY0J1ZiA9CisgICAgICAgICAgICAgICAgKGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QqKSBEQVRBX1BUUihtX3BSZWxDYW1TeW5jSGVhcCwwKTsKKyAgICB9CisKKyAgICBMT0dIKCJtQ2FtZXJhSWQ9JWQiLG1DYW1lcmFJZCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2xvc2VDYW1lcmEKKyAqCisgKiBERVNDUklQVElPTjogY2xvc2UgY2FtZXJhCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Y2xvc2VDYW1lcmEoKQoreworICAgIEtQSV9BVFJBQ0VfQ0FMTCgpOworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKworICAgIExPR0koIltLUEkgUGVyZl06IEUgUFJPRklMRV9DTE9TRV9DQU1FUkEgY2FtZXJhIGlkICVkIiwKKyAgICAgICAgICAgICBtQ2FtZXJhSWQpOworICAgIHJjID0gbUNhbWVyYUhhbmRsZS0+b3BzLT5jbG9zZV9jYW1lcmEobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSk7CisgICAgbUNhbWVyYUhhbmRsZSA9IE5VTEw7CisKKyAgICAvL3Jlc2V0IHNlc3Npb24gaWQgdG8gc29tZSBpbnZhbGlkIGlkCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnQ2FtTG9jayk7CisgICAgc2Vzc2lvbklkW21DYW1lcmFJZF0gPSAweERFQURCRUVGOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnQ2FtTG9jayk7CisKKyAgICAvL05vdGlmeSBkaXNwbGF5IEhBTCB0aGF0IHRoZXJlIGlzIG5vIGFjdGl2ZSBjYW1lcmEgc2Vzc2lvbgorICAgIC8vYnV0IGF2b2lkIGNhbGxpbmcgdGhlIHNhbWUgZHVyaW5nIGJvb3R1cC4gUmVmZXIgdG8gb3BlbkNhbWVyYQorICAgIC8vZm9yIG1vcmUgZGV0YWlscy4KKyAgICBwcm9wZXJ0eV9nZXQoInNlcnZpY2UuYm9vdGFuaW0uZXhpdCIsIHZhbHVlLCAiMCIpOworICAgIGlmIChhdG9pKHZhbHVlKSA9PSAxKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0NhbUxvY2spOworICAgICAgICBpZiAoLS1nTnVtQ2FtZXJhU2Vzc2lvbnMgPT0gMCkgeworICAgICAgICAgICAgc2V0Q2FtZXJhTGF1bmNoU3RhdHVzKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0NhbUxvY2spOworICAgIH0KKworICAgIGlmIChOVUxMICE9IG1fcFJlbENhbVN5bmNIZWFwKSB7CisgICAgICAgIG1fcFJlbENhbVN5bmNIZWFwLT5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbGV0ZSBtX3BSZWxDYW1TeW5jSGVhcDsKKyAgICAgICAgbV9wUmVsQ2FtU3luY0hlYXAgPSBOVUxMOworICAgICAgICBtX3BSZWxDYW1TeW5jQnVmID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zKSB7CisgICAgICAgIGZyZWUobUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zKTsKKyAgICAgICAgbUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zID0gTlVMTDsKKyAgICB9CisgICAgaWYgKFFDYW1lcmFGbGFzaDo6Z2V0SW5zdGFuY2UoKS5yZWxlYXNlRmxhc2hGcm9tQ2FtZXJhKG1DYW1lcmFJZCkgIT0gMCkgeworICAgICAgICBMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBmbGFzaCBmb3IgY2FtZXJhIGlkOiAlZCIsCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkKTsKKyAgICB9CisgICAgbVN0YXRlID0gQ0xPU0VEOworICAgIExPR0koIltLUEkgUGVyZl06IFggUFJPRklMRV9DTE9TRV9DQU1FUkEgY2FtZXJhIGlkICVkLCByYzogJWQiLAorICAgICAgICAgbUNhbWVyYUlkLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGluaXRpYWxpemUKKyAqCisgKiBERVNDUklQVElPTjogSW5pdGlhbGl6ZSBmcmFtZXdvcmtzIGNhbGxiYWNrIGZ1bmN0aW9ucworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FsbGJhY2tfb3BzIDogY2FsbGJhY2sgZnVuY3Rpb24gdG8gZnJhbWV3b3JrcworICoKKyAqIFJFVFVSTiAgICAgOgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IHN0cnVjdCBjYW1lcmEzX2NhbGxiYWNrX29wcyAqY2FsbGJhY2tfb3BzKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJjOworCisgICAgTE9HSSgiRSA6bUNhbWVyYUlkID0gJWQgbVN0YXRlID0gJWQiLCBtQ2FtZXJhSWQsIG1TdGF0ZSk7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworCisgICAgLy8gVmFsaWRhdGUgY3VycmVudCBzdGF0ZQorICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgT1BFTkVEOgorICAgICAgICAgICAgLyogdmFsaWQgc3RhdGUgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7CisgICAgICAgICAgICByYyA9IC1FTk9ERVY7CisgICAgICAgICAgICBnb3RvIGVycjE7CisgICAgfQorCisgICAgcmMgPSBpbml0UGFyYW1ldGVycygpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiaW5pdFBhcmFtdGVycyBmYWlsZWQgJWQiLCByYyk7CisgICAgICAgIGdvdG8gZXJyMTsKKyAgICB9CisgICAgbUNhbGxiYWNrT3BzID0gY2FsbGJhY2tfb3BzOworCisgICAgbUNoYW5uZWxIYW5kbGUgPSBtQ2FtZXJhSGFuZGxlLT5vcHMtPmFkZF9jaGFubmVsKAorICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwgTlVMTCwgTlVMTCwgdGhpcyk7CisgICAgaWYgKG1DaGFubmVsSGFuZGxlID09IDApIHsKKyAgICAgICAgTE9HRSgiYWRkX2NoYW5uZWwgZmFpbGVkIik7CisgICAgICAgIHJjID0gLUVOT01FTTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICBtQ2FtZXJhSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIG1TdGF0ZSA9IElOSVRJQUxJWkVEOworICAgIExPR0koIlgiKTsKKyAgICByZXR1cm4gMDsKKworZXJyMToKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdmFsaWRhdGVTdHJlYW1EaW1lbnNpb25zCisgKgorICogREVTQ1JJUFRJT046IENoZWNrIGlmIHRoZSBjb25maWd1cmF0aW9uIHJlcXVlc3RlZCBhcmUgdGhvc2UgYWR2ZXJ0aXNlZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc3RyZWFtX2xpc3QgOiBzdHJlYW1zIHRvIGJlIGNvbmZpZ3VyZWQKKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjp2YWxpZGF0ZVN0cmVhbURpbWVuc2lvbnMoCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCAqc3RyZWFtTGlzdCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICBzaXplX3QgY291bnQgPSAwOworCisgICAgY2FtZXJhM19zdHJlYW1fdCAqaW5wdXRTdHJlYW0gPSBOVUxMOworICAgIC8qCisgICAgKiBMb29wIHRocm91Z2ggYWxsIHN0cmVhbXMgdG8gZmluZCBpbnB1dCBzdHJlYW0gaWYgaXQgZXhpc3RzKgorICAgICovCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGk8IHN0cmVhbUxpc3QtPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmVhbUxpc3QtPnN0cmVhbXNbaV0tPnN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX0lOUFVUKSB7CisgICAgICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yLCBNdWx0aXBsZSBpbnB1dCBzdHJlYW1zIHJlcXVlc3RlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBzdHJlYW1MaXN0LT5zdHJlYW1zW2ldOworICAgICAgICB9CisgICAgfQorICAgIC8qCisgICAgKiBMb29wIHRocm91Z2ggYWxsIHN0cmVhbXMgcmVxdWVzdGVkIGluIGNvbmZpZ3VyYXRpb24KKyAgICAqIENoZWNrIGlmIHVuc3VwcG9ydGVkIHNpemVzIGhhdmUgYmVlbiByZXF1ZXN0ZWQgb24gYW55IG9mIHRoZW0KKyAgICAqLworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc3RyZWFtTGlzdC0+bnVtX3N0cmVhbXM7IGorKykgeworICAgICAgICBib29sIHNpemVGb3VuZCA9IGZhbHNlOworICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpuZXdTdHJlYW0gPSBzdHJlYW1MaXN0LT5zdHJlYW1zW2pdOworCisgICAgICAgIHVpbnQzMl90IHJvdGF0ZWRIZWlnaHQgPSBuZXdTdHJlYW0tPmhlaWdodDsKKyAgICAgICAgdWludDMyX3Qgcm90YXRlZFdpZHRoID0gbmV3U3RyZWFtLT53aWR0aDsKKyAgICAgICAgaWYgKChuZXdTdHJlYW0tPnJvdGF0aW9uID09IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzkwKSB8fAorICAgICAgICAgICAgICAgIChuZXdTdHJlYW0tPnJvdGF0aW9uID09IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzI3MCkpIHsKKyAgICAgICAgICAgIHJvdGF0ZWRIZWlnaHQgPSBuZXdTdHJlYW0tPndpZHRoOworICAgICAgICAgICAgcm90YXRlZFdpZHRoID0gbmV3U3RyZWFtLT5oZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAqIFNpemVzIGFyZSBkaWZmZXJlbnQgZm9yIGVhY2ggdHlwZSBvZiBzdHJlYW0gZm9ybWF0IGNoZWNrIGFnYWluc3QKKyAgICAgICAgKiBhcHByb3ByaWF0ZSB0YWJsZS4KKyAgICAgICAgKi8KKyAgICAgICAgc3dpdGNoIChuZXdTdHJlYW0tPmZvcm1hdCkgeworICAgICAgICBjYXNlIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTX1JBVzE2OgorICAgICAgICBjYXNlIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTX1JBV19PUEFRVUU6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxMDoKKyAgICAgICAgICAgIGNvdW50ID0gTUlOKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnN1cHBvcnRlZF9yYXdfZGltX2NudCwgTUFYX1NJWkVTX0NOVCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnJhd19kaW1baV0ud2lkdGggPT0gKGludDMyX3Qpcm90YXRlZFdpZHRoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnJhd19kaW1baV0uaGVpZ2h0ID09IChpbnQzMl90KXJvdGF0ZWRIZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkxPQjoKKyAgICAgICAgICAgIGNvdW50ID0gTUlOKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnBpY3R1cmVfc2l6ZXNfdGJsX2NudCwgTUFYX1NJWkVTX0NOVCk7CisgICAgICAgICAgICAvKiBWZXJpZnkgc2V0IHNpemUgYWdhaW5zdCBnZW5lcmF0ZWQgc2l6ZXMgdGFibGUgKi8KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoKGludDMyX3Qpcm90YXRlZFdpZHRoID09CisgICAgICAgICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5waWN0dXJlX3NpemVzX3RibFtpXS53aWR0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgoaW50MzJfdClyb3RhdGVkSGVpZ2h0ID09CisgICAgICAgICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5waWN0dXJlX3NpemVzX3RibFtpXS5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4ODoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAobmV3U3RyZWFtLT5zdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9CSURJUkVDVElPTkFMCisgICAgICAgICAgICAgICAgICAgIHx8IG5ld1N0cmVhbS0+c3RyZWFtX3R5cGUgPT0gQ0FNRVJBM19TVFJFQU1fSU5QVVQKKyAgICAgICAgICAgICAgICAgICAgfHwgSVNfVVNBR0VfWlNMKG5ld1N0cmVhbS0+dXNhZ2UpKSB7CisgICAgICAgICAgICAgICAgaWYgKCgoaW50MzJfdClyb3RhdGVkV2lkdGggPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWN0aXZlX2FycmF5X3NpemUud2lkdGgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50MzJfdClyb3RhdGVkSGVpZ2h0ID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmFjdGl2ZV9hcnJheV9zaXplLmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZUZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIFdlIGNvdWxkIHBvdGVudGlhbGx5IGJyZWFrIGhlcmUgdG8gZW5mb3JjZSBaU0wgc3RyZWFtCisgICAgICAgICAgICAgICAgICogc2V0IGZyb20gZnJhbWV3b3JrcyBhbHdheXMgaXMgZnVsbCBhY3RpdmUgYXJyYXkgc2l6ZQorICAgICAgICAgICAgICAgICAqIGJ1dCBpdCBpcyBub3QgY2xlYXIgZnJvbSB0aGUgc3BjIGlmIGZyYW1ld29yayB3aWxsIGFsd2F5cworICAgICAgICAgICAgICAgICAqIGZvbGxvdyB0aGF0LCBhbHNvIHdlIGhhdmUgbG9naWMgdG8gb3ZlcnJpZGUgdG8gZnVsbCBhcnJheQorICAgICAgICAgICAgICAgICAqIHNpemUsIHNvIGtlZXBpbmcgdGhlIGxvZ2ljIGxlbmllbnQgYXQgdGhlIG1vbWVudAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgY291bnQgPSBNSU4oZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cGljdHVyZV9zaXplc190YmxfY250LAorICAgICAgICAgICAgICAgICAgICBNQVhfU0laRVNfQ05UKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoKGludDMyX3Qpcm90YXRlZFdpZHRoID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cGljdHVyZV9zaXplc190YmxbaV0ud2lkdGgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQzMl90KXJvdGF0ZWRIZWlnaHQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5waWN0dXJlX3NpemVzX3RibFtpXS5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IC8qIEVuZCBvZiBzd2l0Y2gobmV3U3RyZWFtLT5mb3JtYXQpICovCisKKyAgICAgICAgLyogV2UgZXJyb3Igb3V0IGV2ZW4gaWYgYSBzaW5nbGUgc3RyZWFtIGhhcyB1bnN1cHBvcnRlZCBzaXplIHNldCAqLworICAgICAgICBpZiAoIXNpemVGb3VuZCkgeworICAgICAgICAgICAgTE9HRSgiRXJyb3I6IFVuc3VwcG9ydGVkIHNpemU6ICVkIHggJWQgdHlwZTogJWQgYXJyYXkgc2l6ZTogJWQgeCAlZCIsCisgICAgICAgICAgICAgICAgICAgIHJvdGF0ZWRXaWR0aCwgcm90YXRlZEhlaWdodCwgbmV3U3RyZWFtLT5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmFjdGl2ZV9hcnJheV9zaXplLndpZHRoLAorICAgICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5hY3RpdmVfYXJyYXlfc2l6ZS5oZWlnaHQpOworICAgICAgICAgICAgcmMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IC8qIEVuZCBvZiBmb3IgZWFjaCBzdHJlYW0gKi8KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNTdXBwb3J0Q2hhbm5lbE5lZWRlZAorICoKKyAqIERFU0NSSVBUSU9OOiBTaW1wbGUgaGV1cmlzdGljIGZ1bmMgdG8gZGV0ZXJtaW5lIGlmIHN1cHBvcnQgY2hhbm5lbHMgaXMgbmVlZGVkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdHJlYW1fbGlzdCA6IHN0cmVhbXMgdG8gYmUgY29uZmlndXJlZAorICogICBAc3RyZWFtX2NvbmZpZ19pbmZvIDogdGhlIGNvbmZpZyBpbmZvIGZvciBzdHJlYW1zIHRvIGJlIGNvbmZpZ3VyZWQKKyAqCisgKiBSRVRVUk4gICAgIDogQm9vbGVuIHRydWUvZmFsc2UgZGVjaXNpb24KKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6aXNTdXBwb3J0Q2hhbm5lbE5lZWRlZCgKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl90ICpzdHJlYW1MaXN0LAorICAgICAgICBjYW1fc3RyZWFtX3NpemVfaW5mb190IHN0cmVhbV9jb25maWdfaW5mbykKK3sKKyAgICB1aW50MzJfdCBpOworICAgIGJvb2wgcHByb2NSZXF1ZXN0ZWQgPSBmYWxzZTsKKyAgICAvKiBDaGVjayBmb3IgY29uZGl0aW9ucyB3aGVyZSBQUHJvYyBwaXBlbGluZSBkb2VzIG5vdCBoYXZlIGFueSBzdHJlYW1zKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc3RyZWFtX2NvbmZpZ19pbmZvLm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmVhbV9jb25maWdfaW5mby50eXBlW2ldICE9IENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUyAmJgorICAgICAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5wb3N0cHJvY2Vzc19tYXNrW2ldICE9IENBTV9RQ09NX0ZFQVRVUkVfTk9ORSkgeworICAgICAgICAgICAgcHByb2NSZXF1ZXN0ZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHByb2NSZXF1ZXN0ZWQgPT0gZmFsc2UgKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8qIER1bW15IHN0cmVhbSBuZWVkZWQgaWYgb25seSByYXcgb3IganBlZyBzdHJlYW1zIHByZXNlbnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc3RyZWFtTGlzdC0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBzd2l0Y2goc3RyZWFtTGlzdC0+c3RyZWFtc1tpXS0+Zm9ybWF0KSB7CisgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXX09QQVFVRToKKyAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxMDoKKyAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxNjoKKyAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CTE9COgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0U2Vuc29yT3V0cHV0U2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgc2Vuc29yIG91dHB1dCBzaXplIGJhc2VkIG9uIGN1cnJlbnQgc3RyZWFtIGNvbmZpZ3VyYXRvaW4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHNlbnNvcl9kaW0gOiBzZW5zb3Igb3V0cHV0IGRpbWVuc2lvbiAob3V0cHV0KQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmdldFNlbnNvck91dHB1dFNpemUoY2FtX2RpbWVuc2lvbl90ICZzZW5zb3JfZGltKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIGNhbV9kaW1lbnNpb25fdCBtYXhfZGltID0gezAsIDB9OworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChtU3RyZWFtQ29uZmlnSW5mby5zdHJlYW1fc2l6ZXNbaV0ud2lkdGggPiBtYXhfZGltLndpZHRoKQorICAgICAgICAgICAgbWF4X2RpbS53aWR0aCA9IG1TdHJlYW1Db25maWdJbmZvLnN0cmVhbV9zaXplc1tpXS53aWR0aDsKKyAgICAgICAgaWYgKG1TdHJlYW1Db25maWdJbmZvLnN0cmVhbV9zaXplc1tpXS5oZWlnaHQgPiBtYXhfZGltLmhlaWdodCkKKyAgICAgICAgICAgIG1heF9kaW0uaGVpZ2h0ID0gbVN0cmVhbUNvbmZpZ0luZm8uc3RyZWFtX3NpemVzW2ldLmhlaWdodDsKKyAgICB9CisKKyAgICBjbGVhcl9tZXRhZGF0YV9idWZmZXIobVBhcmFtZXRlcnMpOworCisgICAgcmMgPSBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1QYXJhbWV0ZXJzLCBDQU1fSU5URl9QQVJNX01BWF9ESU1FTlNJT04sCisgICAgICAgICAgICBtYXhfZGltKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHVwZGF0ZSB0YWJsZSBmb3IgQ0FNX0lOVEZfUEFSTV9NQVhfRElNRU5TSU9OIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByYyA9IG1DYW1lcmFIYW5kbGUtPm9wcy0+c2V0X3Bhcm1zKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsIG1QYXJhbWV0ZXJzKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBDQU1fSU5URl9QQVJNX01BWF9ESU1FTlNJT04iKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGNsZWFyX21ldGFkYXRhX2J1ZmZlcihtUGFyYW1ldGVycyk7CisgICAgQUREX0dFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtUGFyYW1ldGVycywgQ0FNX0lOVEZfUEFSTV9SQVdfRElNRU5TSU9OKTsKKworICAgIHJjID0gbUNhbWVyYUhhbmRsZS0+b3BzLT5nZXRfcGFybXMobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgIG1QYXJhbWV0ZXJzKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGdldCBDQU1fSU5URl9QQVJNX1JBV19ESU1FTlNJT04iKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIFJFQURfUEFSQU1fRU5UUlkobVBhcmFtZXRlcnMsIENBTV9JTlRGX1BBUk1fUkFXX0RJTUVOU0lPTiwgc2Vuc29yX2RpbSk7CisgICAgTE9HSCgic2Vuc29yIG91dHB1dCBkaW1lbnNpb24gPSAlZCB4ICVkIiwgc2Vuc29yX2RpbS53aWR0aCwgc2Vuc29yX2RpbS5oZWlnaHQpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGVuYWJsZVBvd2VySGludAorICoKKyAqIERFU0NSSVBUSU9OOiBlbmFibGUgc2luZ2xlIHBvd2VyaGludCBmb3IgcHJldmlldyBhbmQgZGlmZmVyZW50IHZpZGVvIG1vZGVzLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOiBOVUxMCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmVuYWJsZVBvd2VySGludCgpCit7CisgICAgaWYgKCFtUG93ZXJIaW50RW5hYmxlZCkgeworICAgICAgICBtX3BlcmZMb2NrLnBvd2VySGludChQT1dFUl9ISU5UX1ZJREVPX0VOQ09ERSwgdHJ1ZSk7CisgICAgICAgIG1Qb3dlckhpbnRFbmFibGVkID0gdHJ1ZTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGlzYWJsZVBvd2VySGludAorICoKKyAqIERFU0NSSVBUSU9OOiBkaXNhYmxlIGN1cnJlbnQgcG93ZXJoaW50LgorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOiBOVUxMCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmRpc2FibGVQb3dlckhpbnQoKQoreworICAgIGlmIChtUG93ZXJIaW50RW5hYmxlZCkgeworICAgICAgICBtX3BlcmZMb2NrLnBvd2VySGludChQT1dFUl9ISU5UX1ZJREVPX0VOQ09ERSwgZmFsc2UpOworICAgICAgICBtUG93ZXJIaW50RW5hYmxlZCA9IGZhbHNlOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhZGRUb1BQRmVhdHVyZU1hc2sKKyAqCisgKiBERVNDUklQVElPTjogYWRkIGFkZGl0aW9uYWwgZmVhdHVyZXMgdG8gcHAgZmVhdHVyZSBtYXNrIGJhc2VkIG9uCisgKiAgICAgICAgICAgICAgc3RyZWFtIHR5cGUgYW5kIHVzZWNhc2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN0cmVhbV9mb3JtYXQgOiBzdHJlYW0gdHlwZSBmb3IgZmVhdHVyZSBtYXNrCisgKiAgIEBzdHJlYW1faWR4IDogc3RyZWFtIGlkeCB3aXRoaW4gcG9zdHByb2Nlc3NfbWFzayBsaXN0IHRvIGNoYW5nZQorICoKKyAqIFJFVFVSTiAgICAgOiBOVUxMCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmFkZFRvUFBGZWF0dXJlTWFzayhpbnQgc3RyZWFtX2Zvcm1hdCwKKyAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkeCkKK3sKKyAgICBjaGFyIGZlYXR1cmVfbWFza192YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGNhbV9mZWF0dXJlX21hc2tfdCBmZWF0dXJlX21hc2s7CisgICAgaW50IGFyZ3NfY29udmVydGVkOworICAgIGludCBwcm9wZXJ0eV9sZW47CisKKyAgICAvKiBHZXQgZmVhdHVyZSBtYXNrIGZyb20gcHJvcGVydHkgKi8KKyNpZmRlZiBfTEVfQ0FNRVJBXworICAgIGNoYXIgc3d0bnJfZmVhdHVyZV9tYXNrX3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgc25wcmludGYoc3d0bnJfZmVhdHVyZV9tYXNrX3ZhbHVlLCBQUk9QRVJUWV9WQUxVRV9NQVgsICIlbGxkIiwgQ0FNX1FUSV9GRUFUVVJFX1NXX1ROUik7CisgICAgcHJvcGVydHlfbGVuID0gcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5oYWwzLmZlYXR1cmUiLAorICAgICAgICAgICAgZmVhdHVyZV9tYXNrX3ZhbHVlLCBzd3Rucl9mZWF0dXJlX21hc2tfdmFsdWUpOworI2Vsc2UKKyAgICBwcm9wZXJ0eV9sZW4gPSBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmhhbDMuZmVhdHVyZSIsCisgICAgICAgICAgICBmZWF0dXJlX21hc2tfdmFsdWUsICIwIik7CisjZW5kaWYKKyAgICBpZiAoKHByb3BlcnR5X2xlbiA+IDIpICYmIChmZWF0dXJlX21hc2tfdmFsdWVbMF0gPT0gJzAnKSAmJgorICAgICAgICAgICAgKGZlYXR1cmVfbWFza192YWx1ZVsxXSA9PSAneCcpKSB7CisgICAgICAgIGFyZ3NfY29udmVydGVkID0gc3NjYW5mKGZlYXR1cmVfbWFza192YWx1ZSwgIjB4JWxseCIsICZmZWF0dXJlX21hc2spOworICAgIH0gZWxzZSB7CisgICAgICAgIGFyZ3NfY29udmVydGVkID0gc3NjYW5mKGZlYXR1cmVfbWFza192YWx1ZSwgIiVsbGQiLCAmZmVhdHVyZV9tYXNrKTsKKyAgICB9CisgICAgaWYgKDEgIT0gYXJnc19jb252ZXJ0ZWQpIHsKKyAgICAgICAgZmVhdHVyZV9tYXNrID0gMDsKKyAgICAgICAgTE9HRSgiV3JvbmcgZmVhdHVyZSBtYXNrICVzIiwgZmVhdHVyZV9tYXNrX3ZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAoc3RyZWFtX2Zvcm1hdCkgeworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOiB7CisgICAgICAgIC8qIEFkZCBMTFZEIHRvIHBwIGZlYXR1cmUgbWFzayBvbmx5IGlmIHZpZGVvIGhpbnQgaXMgZW5hYmxlZCAqLworICAgICAgICBpZiAoKG1fYklzVmlkZW8pICYmIChmZWF0dXJlX21hc2sgJiBDQU1fUVRJX0ZFQVRVUkVfU1dfVE5SKSkgeworICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1tzdHJlYW1faWR4XQorICAgICAgICAgICAgICAgICAgICB8PSBDQU1fUVRJX0ZFQVRVUkVfU1dfVE5SOworICAgICAgICAgICAgTE9HSCgiQWRkZWQgU1cgVE5SIHRvIHBwIGZlYXR1cmUgbWFzayIpOworICAgICAgICB9IGVsc2UgaWYgKChtX2JJc1ZpZGVvKSAmJiAoZmVhdHVyZV9tYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9MTFZEKSkgeworICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1tzdHJlYW1faWR4XQorICAgICAgICAgICAgICAgICAgICB8PSBDQU1fUUNPTV9GRUFUVVJFX0xMVkQ7CisgICAgICAgICAgICBMT0dIKCJBZGRlZCBMTFZEIFNlZU1vcmUgdG8gcHAgZmVhdHVyZSBtYXNrIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBMT0dEKCJQUCBmZWF0dXJlIG1hc2sgJWxseCIsCisgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW3N0cmVhbV9pZHhdKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB1cGRhdGVGcHNJblByZXZpZXdCdWZmZXIKKyAqCisgKiBERVNDUklQVElPTjogdXBkYXRlIEZQUyBpbmZvcm1hdGlvbiBpbiBwcmV2aWV3IGJ1ZmZlci4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1ldGFkYXRhICAgIDogcG9pbnRlciB0byBtZXRhZGF0YSBidWZmZXIKKyAqICAgQGZyYW1lX251bWJlcjogZnJhbWVfbnVtYmVyIHRvIGxvb2sgZm9yIGluIHBlbmRpbmcgYnVmZmVyIGxpc3QKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjp1cGRhdGVGcHNJblByZXZpZXdCdWZmZXIobWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhLAorICAgICAgICB1aW50MzJfdCBmcmFtZV9udW1iZXIpCit7CisgICAgLy8gTWFyayBhbGwgcGVuZGluZyBidWZmZXJzIGZvciB0aGlzIHBhcnRpY3VsYXIgcmVxdWVzdAorICAgIC8vIHdpdGggY29ycmVzcG9uZGluZyBmcmFtZXJhdGUgaW5mb3JtYXRpb24KKyAgICBmb3IgKExpc3Q8UGVuZGluZ0J1ZmZlcnNJblJlcXVlc3Q+OjppdGVyYXRvciByZXEgPQorICAgICAgICAgICAgbVBlbmRpbmdCdWZmZXJzTWFwLm1QZW5kaW5nQnVmZmVyc0luUmVxdWVzdC5iZWdpbigpOworICAgICAgICAgICAgcmVxICE9IG1QZW5kaW5nQnVmZmVyc01hcC5tUGVuZGluZ0J1ZmZlcnNJblJlcXVlc3QuZW5kKCk7IHJlcSsrKSB7CisgICAgICAgIGZvcihMaXN0PFBlbmRpbmdCdWZmZXJJbmZvPjo6aXRlcmF0b3IgaiA9CisgICAgICAgICAgICAgICAgcmVxLT5tUGVuZGluZ0J1ZmZlckxpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBqICE9IHJlcS0+bVBlbmRpbmdCdWZmZXJMaXN0LmVuZCgpOyBqKyspIHsKKyAgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqY2hhbm5lbCA9IChRQ2FtZXJhM0NoYW5uZWwgKilqLT5zdHJlYW0tPnByaXY7CisgICAgICAgICAgICBpZiAoKHJlcS0+ZnJhbWVfbnVtYmVyID09IGZyYW1lX251bWJlcikgJiYKKyAgICAgICAgICAgICAgICAoY2hhbm5lbC0+Z2V0U3RyZWFtVHlwZU1hc2soKSAmCisgICAgICAgICAgICAgICAgKDFVIDw8IENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKSkpIHsKKyAgICAgICAgICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fZnBzX3JhbmdlX3QsIGZsb2F0X3JhbmdlLAorICAgICAgICAgICAgICAgICAgICBDQU1fSU5URl9QQVJNX0ZQU19SQU5HRSwgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZW9mIChNZXRhRGF0YV90OjpyZWZyZXNocmF0ZSkgY2FtZXJhRnBzID0gZmxvYXRfcmFuZ2UtPm1heF9mcHM7CisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwcml2YXRlX2hhbmRsZV90ICpwcml2X2hhbmRsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHByaXZhdGVfaGFuZGxlX3QgKikoKihqLT5idWZmZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0TWV0YURhdGEocHJpdl9oYW5kbGUsIFVQREFURV9SRUZSRVNIX1JBVEUsICZjYW1lcmFGcHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjb25maWd1cmVTdHJlYW1zCisgKgorICogREVTQ1JJUFRJT046IFJlc2V0IEhBTCBjYW1lcmEgZGV2aWNlIHByb2Nlc3NpbmcgcGlwZWxpbmUgYW5kIHNldCB1cCBuZXcgaW5wdXQKKyAqICAgICAgICAgICAgICBhbmQgb3V0cHV0IHN0cmVhbXMuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdHJlYW1fbGlzdCA6IHN0cmVhbXMgdG8gYmUgY29uZmlndXJlZAorICoKKyAqIFJFVFVSTiAgICAgOgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmNvbmZpZ3VyZVN0cmVhbXMoCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCAqc3RyZWFtTGlzdCkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGludCByYyA9IDA7CisKKyAgICAvLyBBY3F1aXJlIHBlcmZMb2NrIGJlZm9yZSBjb25maWd1cmUgc3RyZWFtcworICAgIG1fcGVyZkxvY2subG9ja19hY3EoKTsKKyAgICByYyA9IGNvbmZpZ3VyZVN0cmVhbXNQZXJmTG9ja2VkKHN0cmVhbUxpc3QpOworICAgIG1fcGVyZkxvY2subG9ja19yZWwoKTsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjb25maWd1cmVTdHJlYW1zUGVyZkxvY2tlZAorICoKKyAqIERFU0NSSVBUSU9OOiBjb25maWd1cmVTdHJlYW1zIHdoaWxlIHBlcmZMb2NrIGlzIGhlbGQuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdHJlYW1fbGlzdCA6IHN0cmVhbXMgdG8gYmUgY29uZmlndXJlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpjb25maWd1cmVTdHJlYW1zUGVyZkxvY2tlZCgKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl90ICpzdHJlYW1MaXN0KQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJjID0gMDsKKworICAgIC8vIFNhbml0eSBjaGVjayBzdHJlYW1fbGlzdAorICAgIGlmIChzdHJlYW1MaXN0ID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiTlVMTCBzdHJlYW0gY29uZmlndXJhdGlvbiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoc3RyZWFtTGlzdC0+c3RyZWFtcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5VTEwgc3RyZWFtIGxpc3QiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtTGlzdC0+bnVtX3N0cmVhbXMgPCAxKSB7CisgICAgICAgIExPR0UoIkJhZCBudW1iZXIgb2Ygc3RyZWFtcyByZXF1ZXN0ZWQ6ICVkIiwKKyAgICAgICAgICAgICAgICBzdHJlYW1MaXN0LT5udW1fc3RyZWFtcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHN0cmVhbUxpc3QtPm51bV9zdHJlYW1zID49IE1BWF9OVU1fU1RSRUFNUykgeworICAgICAgICBMT0dFKCJNYXhpbXVtIG51bWJlciBvZiBzdHJlYW1zICVkIGV4Y2VlZGVkOiAlZCIsCisgICAgICAgICAgICAgICAgTUFYX05VTV9TVFJFQU1TLCBzdHJlYW1MaXN0LT5udW1fc3RyZWFtcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbU9wTW9kZSA9IHN0cmVhbUxpc3QtPm9wZXJhdGlvbl9tb2RlOworICAgIExPR0QoIm1PcE1vZGU6ICVkIiwgbU9wTW9kZSk7CisKKyAgICAvKiBmaXJzdCBpbnZhbGlkYXRlIGFsbCB0aGUgc3RlYW1zIGluIHRoZSBtU3RyZWFtTGlzdAorICAgICAqIGlmIHRoZXkgYXBwZWFyIGFnYWluLCB0aGV5IHdpbGwgYmUgdmFsaWRhdGVkICovCisgICAgZm9yIChMaXN0PHN0cmVhbV9pbmZvX3QqPjo6aXRlcmF0b3IgaXQgPSBtU3RyZWFtSW5mby5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gbVN0cmVhbUluZm8uZW5kKCk7IGl0KyspIHsKKyAgICAgICAgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCAqY2hhbm5lbCA9IChRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsKikoKml0KS0+c3RyZWFtLT5wcml2OworICAgICAgICBpZiAoY2hhbm5lbCkgeworICAgICAgICAgIGNoYW5uZWwtPnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICAoKml0KS0+c3RhdHVzID0gSU5WQUxJRDsKKyAgICB9CisKKyAgICBpZiAobVJhd0R1bXBDaGFubmVsKSB7CisgICAgICAgIG1SYXdEdW1wQ2hhbm5lbC0+c3RvcCgpOworICAgICAgICBkZWxldGUgbVJhd0R1bXBDaGFubmVsOworICAgICAgICBtUmF3RHVtcENoYW5uZWwgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtU3VwcG9ydENoYW5uZWwpCisgICAgICAgIG1TdXBwb3J0Q2hhbm5lbC0+c3RvcCgpOworCisgICAgaWYgKG1BbmFseXNpc0NoYW5uZWwpIHsKKyAgICAgICAgbUFuYWx5c2lzQ2hhbm5lbC0+c3RvcCgpOworICAgIH0KKyAgICBpZiAobU1ldGFkYXRhQ2hhbm5lbCkgeworICAgICAgICAvKiBJZiBjb250ZW50IG9mIG1TdHJlYW1JbmZvIGlzIG5vdCAwLCB0aGVyZSBpcyBtZXRhZGF0YSBzdHJlYW0gKi8KKyAgICAgICAgbU1ldGFkYXRhQ2hhbm5lbC0+c3RvcCgpOworICAgIH0KKyAgICBpZiAobUNoYW5uZWxIYW5kbGUpIHsKKyAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzLT5zdG9wX2NoYW5uZWwobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbEhhbmRsZSk7CisgICAgICAgIExPR0QoInN0b3BwaW5nIGNoYW5uZWwgJWQiLCBtQ2hhbm5lbEhhbmRsZSk7CisgICAgfQorCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworCisgICAgLy8gQ2hlY2sgc3RhdGUKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICBjYXNlIElOSVRJQUxJWkVEOgorICAgICAgICBjYXNlIENPTkZJR1VSRUQ6CisgICAgICAgIGNhc2UgU1RBUlRFRDoKKyAgICAgICAgICAgIC8qIHZhbGlkIHN0YXRlICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgc3RhdGUgJWQiLCBtU3RhdGUpOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICAvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdmlkZW8gc3RyZWFtICovCisgICAgbV9iSXM0S1ZpZGVvID0gZmFsc2U7CisgICAgbV9iSXNWaWRlbyA9IGZhbHNlOworICAgIG1fYkVpc1N1cHBvcnRlZFNpemUgPSBmYWxzZTsKKyAgICBtX2JUbnJFbmFibGVkID0gZmFsc2U7CisgICAgYm9vbCBpc1pzbCA9IGZhbHNlOworICAgIHVpbnQzMl90IHZpZGVvV2lkdGggPSAwVTsKKyAgICB1aW50MzJfdCB2aWRlb0hlaWdodCA9IDBVOworICAgIHNpemVfdCByYXdTdHJlYW1DbnQgPSAwOworICAgIHNpemVfdCBzdGFsbFN0cmVhbUNudCA9IDA7CisgICAgc2l6ZV90IHByb2Nlc3NlZFN0cmVhbUNudCA9IDA7CisgICAgLy8gTnVtYmVyIG9mIHN0cmVhbXMgb24gSVNQIGVuY29kZXIgcGF0aAorICAgIHNpemVfdCBudW1TdHJlYW1zT25FbmNvZGVyID0gMDsKKyAgICBzaXplX3QgbnVtWXV2ODg4T25FbmNvZGVyID0gMDsKKyAgICBib29sIGJZdXY4ODhPdmVycmlkZUpwZWcgPSBmYWxzZTsKKyAgICBjYW1fZGltZW5zaW9uX3QgbGFyZ2VZdXY4ODhTaXplID0gezAsIDB9OworICAgIGNhbV9kaW1lbnNpb25fdCBtYXhWaWV3ZmluZGVyU2l6ZSA9IHswLCAwfTsKKyAgICBib29sIGJKcGVnRXhjZWVkczRLID0gZmFsc2U7CisgICAgYm9vbCBiSnBlZ09uRW5jb2RlciA9IGZhbHNlOworICAgIGJvb2wgYlVzZUNvbW1vbkZlYXR1cmVNYXNrID0gZmFsc2U7CisgICAgY2FtX2ZlYXR1cmVfbWFza190IGNvbW1vbkZlYXR1cmVNYXNrID0gMDsKKyAgICBib29sIGJTbWFsbEpwZWdTaXplID0gZmFsc2U7CisgICAgdWludDMyX3Qgd2lkdGhfcmF0aW87CisgICAgdWludDMyX3QgaGVpZ2h0X3JhdGlvOworICAgIG1heFZpZXdmaW5kZXJTaXplID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+bWF4X3ZpZXdmaW5kZXJfc2l6ZTsKKyAgICBjYW1lcmEzX3N0cmVhbV90ICppbnB1dFN0cmVhbSA9IE5VTEw7CisgICAgYm9vbCBpc0pwZWcgPSBmYWxzZTsKKyAgICBjYW1fZGltZW5zaW9uX3QganBlZ1NpemUgPSB7MCwgMH07CisKKyAgICBjYW1fcGFkZGluZ19pbmZvX3QgcGFkZGluZ19pbmZvID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cGFkZGluZ19pbmZvOworCisgICAgLypFSVMgY29uZmlndXJhdGlvbiovCisgICAgYm9vbCBvaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICB1aW50OF90IGVpc19wcm9wX3NldDsKKyAgICB1aW50MzJfdCBtYXhFaXNXaWR0aCA9IDA7CisgICAgdWludDMyX3QgbWF4RWlzSGVpZ2h0ID0gMDsKKworICAgIG1lbXNldCgmbUlucHV0U3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1JbnB1dFN0cmVhbUluZm8pKTsKKworICAgIHNpemVfdCBjb3VudCA9IElTX1RZUEVfTUFYOworICAgIGNvdW50ID0gTUlOKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnN1cHBvcnRlZF9pc190eXBlc19jbnQsIGNvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5zdXBwb3J0ZWRfaXNfdHlwZXNbaV0gPT0gSVNfVFlQRV9FSVNfMl8wKSB8fAorICAgICAgICAgICAgKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnN1cHBvcnRlZF9pc190eXBlc1tpXSA9PSBJU19UWVBFX0VJU18zXzApKSB7CisgICAgICAgICAgICBtX2JFaXNTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgY291bnQgPSBDQU1fT1BUX1NUQUJfTUFYOworICAgIGNvdW50ID0gTUlOKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPm9wdGljYWxfc3RhYl9tb2Rlc19jb3VudCwgY291bnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBpZiAoZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+b3B0aWNhbF9zdGFiX21vZGVzW2ldID09ICBDQU1fT1BUX1NUQUJfT04pIHsKKyAgICAgICAgICAgIG9pc1N1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtX2JFaXNTdXBwb3J0ZWQpIHsKKyAgICAgICAgbWF4RWlzV2lkdGggPSBNQVhfRUlTX1dJRFRIOworICAgICAgICBtYXhFaXNIZWlnaHQgPSBNQVhfRUlTX0hFSUdIVDsKKyAgICB9CisKKyAgICAvKiBFSVMgc2V0cHJvcCBjb250cm9sICovCisgICAgY2hhciBlaXNfcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldChlaXNfcHJvcCwgMCwgc2l6ZW9mKGVpc19wcm9wKSk7CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5laXMuZW5hYmxlIiwgZWlzX3Byb3AsICIxIik7CisgICAgZWlzX3Byb3Bfc2V0ID0gKHVpbnQ4X3QpYXRvaShlaXNfcHJvcCk7CisKKyAgICBtX2JFaXNFbmFibGUgPSBlaXNfcHJvcF9zZXQgJiYgKCFvaXNTdXBwb3J0ZWQgJiYgbV9iRWlzU3VwcG9ydGVkKSAmJgorICAgICAgICAgICAgKG1PcE1vZGUgIT0gQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpOworCisgICAgTE9HRCgibV9iRWlzRW5hYmxlOiAlZCwgZWlzX3Byb3Bfc2V0OiAlZCwgbV9iRWlzU3VwcG9ydGVkOiAlZCwgb2lzU3VwcG9ydGVkOiVkICIsCisgICAgICAgICAgICBtX2JFaXNFbmFibGUsIGVpc19wcm9wX3NldCwgbV9iRWlzU3VwcG9ydGVkLCBvaXNTdXBwb3J0ZWQpOworCisgICAgLyogc3RyZWFtIGNvbmZpZ3VyYXRpb25zICovCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJlYW1MaXN0LT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKm5ld1N0cmVhbSA9IHN0cmVhbUxpc3QtPnN0cmVhbXNbaV07CisgICAgICAgIExPR0koInN0cmVhbVslZF0gdHlwZSA9ICVkLCBmb3JtYXQgPSAlZCwgd2lkdGggPSAlZCwgIgorICAgICAgICAgICAgICAgICJoZWlnaHQgPSAlZCwgcm90YXRpb24gPSAlZCwgdXNhZ2UgPSAweCV4IiwKKyAgICAgICAgICAgICAgICAgaSwgbmV3U3RyZWFtLT5zdHJlYW1fdHlwZSwgbmV3U3RyZWFtLT5mb3JtYXQsCisgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT53aWR0aCwgbmV3U3RyZWFtLT5oZWlnaHQsIG5ld1N0cmVhbS0+cm90YXRpb24sCisgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT51c2FnZSk7CisgICAgICAgIGlmIChuZXdTdHJlYW0tPnN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX0JJRElSRUNUSU9OQUwgfHwKKyAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPnN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX0lOUFVUKXsKKyAgICAgICAgICAgIGlzWnNsID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmV3U3RyZWFtLT5zdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9JTlBVVCl7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ld1N0cmVhbTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdTdHJlYW0tPmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgICAgIGlzSnBlZyA9IHRydWU7CisgICAgICAgICAgICBqcGVnU2l6ZS53aWR0aCA9IG5ld1N0cmVhbS0+d2lkdGg7CisgICAgICAgICAgICBqcGVnU2l6ZS5oZWlnaHQgPSBuZXdTdHJlYW0tPmhlaWdodDsKKyAgICAgICAgICAgIGlmIChuZXdTdHJlYW0tPndpZHRoID4gVklERU9fNEtfV0lEVEggfHwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT5oZWlnaHQgPiBWSURFT180S19IRUlHSFQpCisgICAgICAgICAgICAgICAgYkpwZWdFeGNlZWRzNEsgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgPT0gbmV3U3RyZWFtLT5mb3JtYXQpICYmCisgICAgICAgICAgICAgICAgKG5ld1N0cmVhbS0+dXNhZ2UgJiBwcml2YXRlX2hhbmRsZV90OjpQUklWX0ZMQUdTX1ZJREVPX0VOQ09ERVIpKSB7CisgICAgICAgICAgICBtX2JJc1ZpZGVvID0gdHJ1ZTsKKyAgICAgICAgICAgIHZpZGVvV2lkdGggPSBuZXdTdHJlYW0tPndpZHRoOworICAgICAgICAgICAgdmlkZW9IZWlnaHQgPSBuZXdTdHJlYW0tPmhlaWdodDsKKyAgICAgICAgICAgIGlmICgoVklERU9fNEtfV0lEVEggPD0gbmV3U3RyZWFtLT53aWR0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKFZJREVPXzRLX0hFSUdIVCA8PSBuZXdTdHJlYW0tPmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBtX2JJczRLVmlkZW8gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9iRWlzU3VwcG9ydGVkU2l6ZSA9IChuZXdTdHJlYW0tPndpZHRoIDw9IG1heEVpc1dpZHRoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdTdHJlYW0tPmhlaWdodCA8PSBtYXhFaXNIZWlnaHQpOworICAgICAgICB9CisgICAgICAgIGlmIChuZXdTdHJlYW0tPnN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX0JJRElSRUNUSU9OQUwgfHwKKyAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPnN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX09VVFBVVCkgeworICAgICAgICAgICAgc3dpdGNoIChuZXdTdHJlYW0tPmZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0JMT0I6CisgICAgICAgICAgICAgICAgc3RhbGxTdHJlYW1DbnQrKzsKKyAgICAgICAgICAgICAgICBpZiAoaXNPbkVuY29kZXIobWF4Vmlld2ZpbmRlclNpemUsIG5ld1N0cmVhbS0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtU3RyZWFtc09uRW5jb2RlcisrOworICAgICAgICAgICAgICAgICAgICBiSnBlZ09uRW5jb2RlciA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdpZHRoX3JhdGlvID0gQ0VJTF9ESVZJU0lPTihnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5hY3RpdmVfYXJyYXlfc2l6ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbS0+d2lkdGgpOworICAgICAgICAgICAgICAgIGhlaWdodF9yYXRpbyA9IENFSUxfRElWSVNJT04oZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWN0aXZlX2FycmF5X3NpemUuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT5oZWlnaHQpOzsKKyAgICAgICAgICAgICAgICBGQVRBTF9JRihnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5tYXhfZG93bnNjYWxlX2ZhY3RvciA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIkZBVEFMOiBtYXhfZG93bnNjYWxlX2ZhY3RvciBjYW5ub3QgYmUgemVybyBhbmQgc28gYXNzZXJ0Iik7CisgICAgICAgICAgICAgICAgaWYgKCAod2lkdGhfcmF0aW8gPiBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5tYXhfZG93bnNjYWxlX2ZhY3RvcikgfHwKKyAgICAgICAgICAgICAgICAgICAgKGhlaWdodF9yYXRpbyA+IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPm1heF9kb3duc2NhbGVfZmFjdG9yKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dIKCJTZXR0aW5nIHNtYWxsIGpwZWcgc2l6ZSBmbGFnIHRvIHRydWUiKTsKKyAgICAgICAgICAgICAgICAgICAgYlNtYWxsSnBlZ1NpemUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxMDoKKyAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVdfT1BBUVVFOgorICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBVzE2OgorICAgICAgICAgICAgICAgIHJhd1N0cmVhbUNudCsrOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6CisgICAgICAgICAgICAgICAgcHJvY2Vzc2VkU3RyZWFtQ250Kys7CisgICAgICAgICAgICAgICAgaWYgKGlzT25FbmNvZGVyKG1heFZpZXdmaW5kZXJTaXplLCBuZXdTdHJlYW0tPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdHJlYW0tPnN0cmVhbV90eXBlICE9IENBTUVSQTNfU1RSRUFNX0JJRElSRUNUSU9OQUwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhSVNfVVNBR0VfWlNMKG5ld1N0cmVhbS0+dXNhZ2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25GZWF0dXJlTWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX1BQX1NVUEVSU0VUX0hBTDM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbnVtU3RyZWFtc09uRW5jb2RlcisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4OgorICAgICAgICAgICAgICAgIHByb2Nlc3NlZFN0cmVhbUNudCsrOworICAgICAgICAgICAgICAgIGlmIChpc09uRW5jb2RlcihtYXhWaWV3ZmluZGVyU2l6ZSwgbmV3U3RyZWFtLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbS0+aGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBZdXY4ODggc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDRLLCBzZXQgZmVhdHVyZSBtYXNrCisgICAgICAgICAgICAgICAgICAgIC8vIHRvIFNVUEVSU0VUIHNvIHRoYXQgaXQgc3VwcG9ydCBjb25jdXJyZW50IHJlcXVlc3Qgb24KKyAgICAgICAgICAgICAgICAgICAgLy8gWVVWIGFuZCBKUEVHLgorICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RyZWFtLT53aWR0aCA8PSBWSURFT180S19XSURUSCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbS0+aGVpZ2h0IDw9IFZJREVPXzRLX0hFSUdIVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uRmVhdHVyZU1hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9QUF9TVVBFUlNFVF9IQUwzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG51bVN0cmVhbXNPbkVuY29kZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgbnVtWXV2ODg4T25FbmNvZGVyKys7CisgICAgICAgICAgICAgICAgICAgIGxhcmdlWXV2ODg4U2l6ZS53aWR0aCA9IG5ld1N0cmVhbS0+d2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGxhcmdlWXV2ODg4U2l6ZS5oZWlnaHQgPSBuZXdTdHJlYW0tPmhlaWdodDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHByb2Nlc3NlZFN0cmVhbUNudCsrOworICAgICAgICAgICAgICAgIGlmIChpc09uRW5jb2RlcihtYXhWaWV3ZmluZGVyU2l6ZSwgbmV3U3RyZWFtLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbS0+aGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBjb21tb25GZWF0dXJlTWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX1BQX1NVUEVSU0VUX0hBTDM7CisgICAgICAgICAgICAgICAgICAgIG51bVN0cmVhbXNPbkVuY29kZXIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5wb3NpdGlvbiA9PSBDQU1fUE9TSVRJT05fRlJPTlQgfHwKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnBvc2l0aW9uID09IENBTV9QT1NJVElPTl9GUk9OVF9BVVggfHwKKyAgICAgICAgICAgICFtX2JJc1ZpZGVvKSB7CisgICAgICAgIG1fYkVpc0VuYWJsZSA9IGZhbHNlOworICAgIH0KKworICAgIC8qIExvZ2ljIHRvIGVuYWJsZS9kaXNhYmxlIFROUiBiYXNlZCBvbiBzcGVjaWZpYyBjb25maWcgc2l6ZS9ldGMuKi8KKyAgICBpZiAoKG1fYlRuclByZXZpZXcgfHwgbV9iVG5yVmlkZW8pICYmIG1fYklzVmlkZW8gJiYKKyAgICAgICAgICAgICgodmlkZW9XaWR0aCA9PSAxOTIwICYmIHZpZGVvSGVpZ2h0ID09IDEwODApIHx8CisgICAgICAgICAgICAodmlkZW9XaWR0aCA9PSAxMjgwICYmIHZpZGVvSGVpZ2h0ID09IDcyMCkpICYmCisgICAgICAgICAgICAobU9wTW9kZSAhPSBDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSkpCisgICAgICAgIG1fYlRuckVuYWJsZWQgPSB0cnVlOworCisgICAgLyogQ2hlY2sgaWYgbnVtX3N0cmVhbXMgaXMgc2FuZSAqLworICAgIGlmIChzdGFsbFN0cmVhbUNudCA+IE1BWF9TVEFMTElOR19TVFJFQU1TIHx8CisgICAgICAgICAgICByYXdTdHJlYW1DbnQgPiBNQVhfUkFXX1NUUkVBTVMgfHwKKyAgICAgICAgICAgIHByb2Nlc3NlZFN0cmVhbUNudCA+IE1BWF9QUk9DRVNTRURfU1RSRUFNUykgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHN0cmVhbSBjb25maWd1OiBzdGFsbDogJWQsIHJhdzogJWQsIHByb2Nlc3NlZCAlZCIsCisgICAgICAgICAgICAgICAgIHN0YWxsU3RyZWFtQ250LCByYXdTdHJlYW1DbnQsIHByb2Nlc3NlZFN0cmVhbUNudCk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgLyogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIHpzbCBzdHJlYW0gb3IgNGsgdmlkZW8gY2FzZSAqLworICAgIGlmIChpc1pzbCAmJiBtX2JJc1ZpZGVvKSB7CisgICAgICAgIExPR0UoIkN1cnJlbnRseSBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gWlNMJlZpZGVvISIpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIC8qIENoZWNrIGlmIHN0cmVhbSBzaXplcyBhcmUgc2FuZSAqLworICAgIGlmIChudW1TdHJlYW1zT25FbmNvZGVyID4gMikgeworICAgICAgICBMT0dFKCJOdW1iZXIgb2Ygc3RyZWFtcyBvbiBJU1AgZW5jb2RlciBwYXRoIGV4Y2VlZHMgbGltaXRzIG9mIDIiKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0gZWxzZSBpZiAoMSA8IG51bVN0cmVhbXNPbkVuY29kZXIpeworICAgICAgICBiVXNlQ29tbW9uRmVhdHVyZU1hc2sgPSB0cnVlOworICAgICAgICBMT0dIKCJNdWx0aXBsZSBzdHJlYW1zIGFib3ZlIG1heCB2aWV3ZmluZGVyIHNpemUsIGNvbW1vbiBtYXNrIG5lZWRlZCIpOworICAgIH0KKworICAgIC8qIENoZWNrIGlmIEJMT0Igc2l6ZSBpcyBncmVhdGVyIHRoYW4gNGsgaW4gNGsgcmVjb3JkaW5nIGNhc2UgKi8KKyAgICBpZiAobV9iSXM0S1ZpZGVvICYmIGJKcGVnRXhjZWVkczRLKSB7CisgICAgICAgIExPR0UoIkhBTCBkb2Vzbid0IHN1cHBvcnQgQmxvYiBzaXplIGdyZWF0ZXIgdGhhbiA0ayBpbiA0ayByZWNvcmRpbmciKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vIFdoZW4gSlBFRyBhbmQgcHJldmlldyBzdHJlYW1zIHNoYXJlIFZGRSBvdXRwdXQsIENQUCB3aWxsIG5vdCBhcHBseSBDQUMyCisgICAgLy8gb24gSlBFRyBzdHJlYW0uIFNvIGRpc2FibGUgc3VjaCBjb25maWd1cmF0aW9ucyB0byBlbnN1cmUgQ0FDMiBpcyBhcHBsaWVkLgorICAgIC8vIERvbid0IGZhaWwgZm9yIHJlcHJvY2VzcyBjb25maWd1cmF0aW9ucy4gQWxzbyBkb24ndCBmYWlsIGlmIGJKcGVnRXhjZWVkczRLCisgICAgLy8gaXMgbm90IHRydWUuIE90aGVyd2lzZSB0ZXN0TWFuZGF0b3J5T3V0cHV0Q29tYmluYXRpb25zIHdpbGwgZmFpbCB3aXRoIGZvbGxvd2luZworICAgIC8vIGNvbmZpZ3VyYXRpb25zOgorICAgIC8vICAgIHtbUFJJViwgUFJFVklFV10gW1BSSVYsIFJFQ09SRF0gW0pQRUcsIFJFQ09SRF19CisgICAgLy8gICAge1tQUklWLCBQUkVWSUVXXSBbWVVWLCBSRUNPUkRdIFtKUEVHLCBSRUNPUkRdfQorICAgIC8vICAgIChUaGVzZSB0d28gY29uZmlndXJhdGlvbnMgd2lsbCBub3QgaGF2ZSBDQUMyIGVuYWJsZWQgZXZlbiBpbiBIUSBtb2Rlcy4pCisgICAgaWYgKCFpc1pzbCAmJiBiSnBlZ09uRW5jb2RlciAmJiBiSnBlZ0V4Y2VlZHM0SyAmJiBiVXNlQ29tbW9uRmVhdHVyZU1hc2spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBCbG9iIHNpemUgZ3JlYXRlciB0aGFuIDRrIGFuZCBtdWx0aXBsZSBzdHJlYW1zIGFyZSBvbiBlbmNvZGVyIG91dHB1dCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLy8gSWYganBlZyBzdHJlYW0gaXMgYXZhaWxhYmxlLCBhbmQgYSBZVVYgODg4IHN0cmVhbSBpcyBvbiBFbmNvZGVyIHBhdGgsIGFuZAorICAgIC8vIHRoZSBZVVYgc3RyZWFtJ3Mgc2l6ZSBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBKUEVHIHNpemUsIHNldCBjb21tb24KKyAgICAvLyBwb3N0cHJvY2VzcyBtYXNrIHRvIE5PTkUsIHNvIHRoYXQgd2UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHBvc3Rwcm9jIGJ5cGFzcy4KKyAgICBpZiAobnVtWXV2ODg4T25FbmNvZGVyICYmIGlzT25FbmNvZGVyKG1heFZpZXdmaW5kZXJTaXplLAorICAgICAgICAgICAganBlZ1NpemUud2lkdGgsIGpwZWdTaXplLmhlaWdodCkgJiYKKyAgICAgICAgICAgIGxhcmdlWXV2ODg4U2l6ZS53aWR0aCA+IGpwZWdTaXplLndpZHRoICYmCisgICAgICAgICAgICBsYXJnZVl1djg4OFNpemUuaGVpZ2h0ID4ganBlZ1NpemUuaGVpZ2h0KSB7CisgICAgICAgIGJZdXY4ODhPdmVycmlkZUpwZWcgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWlzSnBlZyAmJiBudW1TdHJlYW1zT25FbmNvZGVyID4gMSkgeworICAgICAgICBjb21tb25GZWF0dXJlTWFzayA9IENBTV9RQ09NX0ZFQVRVUkVfUFBfU1VQRVJTRVRfSEFMMzsKKyAgICB9CisKKyAgICBMT0dIKCJtYXggdmlld2ZpbmRlciB3aWR0aCAlZCBoZWlnaHQgJWQgaXNac2wgJWQgYlVzZUNvbW1vbkZlYXR1cmUgJXggY29tbW9uRmVhdHVyZU1hc2sgJWxseCIsCisgICAgICAgICAgICBtYXhWaWV3ZmluZGVyU2l6ZS53aWR0aCwgbWF4Vmlld2ZpbmRlclNpemUuaGVpZ2h0LCBpc1pzbCwgYlVzZUNvbW1vbkZlYXR1cmVNYXNrLAorICAgICAgICAgICAgY29tbW9uRmVhdHVyZU1hc2spOworICAgIExPR0goIm51bVN0cmVhbXNPbkVuY29kZXIgJWQsIHByb2Nlc3NlZFN0cmVhbUNudCAlZCwgc3RhbGxjbnQgJWQgYlNtYWxsSnBlZ1NpemUgJWQiLAorICAgICAgICAgICAgbnVtU3RyZWFtc09uRW5jb2RlciwgcHJvY2Vzc2VkU3RyZWFtQ250LCBzdGFsbFN0cmVhbUNudCwgYlNtYWxsSnBlZ1NpemUpOworCisgICAgcmMgPSB2YWxpZGF0ZVN0cmVhbURpbWVuc2lvbnMoc3RyZWFtTGlzdCk7CisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIHJjID0gdmFsaWRhdGVTdHJlYW1Sb3RhdGlvbnMoc3RyZWFtTGlzdCk7CisgICAgfQorICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHN0cmVhbSBjb25maWd1cmF0aW9uIHJlcXVlc3RlZCEiKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBjYW1lcmEzX3N0cmVhbV90ICp6c2xTdHJlYW0gPSBOVUxMOyAvL09ubHkgdXNlIHRoaXMgZm9yIHNpemUgYW5kIG5vdCBhY3R1YWwgaGFuZGxlIQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyZWFtTGlzdC0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpuZXdTdHJlYW0gPSBzdHJlYW1MaXN0LT5zdHJlYW1zW2ldOworICAgICAgICBMT0dIKCJuZXdTdHJlYW0gdHlwZSA9ICVkLCBzdHJlYW0gZm9ybWF0ID0gJWQgIgorICAgICAgICAgICAgICAgICJzdHJlYW0gc2l6ZSA6ICVkIHggJWQsIHN0cmVhbSByb3RhdGlvbiA9ICVkIiwKKyAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT5zdHJlYW1fdHlwZSwgbmV3U3RyZWFtLT5mb3JtYXQsCisgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT53aWR0aCwgbmV3U3RyZWFtLT5oZWlnaHQsIG5ld1N0cmVhbS0+cm90YXRpb24pOworICAgICAgICAvL2lmIHRoZSBzdHJlYW0gaXMgaW4gdGhlIG1TdHJlYW1MaXN0IHZhbGlkYXRlIGl0CisgICAgICAgIGJvb2wgc3RyZWFtX2V4aXN0cyA9IGZhbHNlOworICAgICAgICBmb3IgKExpc3Q8c3RyZWFtX2luZm9fdCo+OjppdGVyYXRvciBpdD1tU3RyZWFtSW5mby5iZWdpbigpOworICAgICAgICAgICAgICAgIGl0ICE9IG1TdHJlYW1JbmZvLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICBpZiAoKCppdCktPnN0cmVhbSA9PSBuZXdTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsICpjaGFubmVsID0KKyAgICAgICAgICAgICAgICAgICAgKFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwqKSgqaXQpLT5zdHJlYW0tPnByaXY7CisgICAgICAgICAgICAgICAgc3RyZWFtX2V4aXN0cyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwpCisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjaGFubmVsOworICAgICAgICAgICAgICAgICgqaXQpLT5zdGF0dXMgPSBWQUxJRDsKKyAgICAgICAgICAgICAgICAoKml0KS0+c3RyZWFtLT5wcml2ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAoKml0KS0+Y2hhbm5lbCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJlYW1fZXhpc3RzICYmIG5ld1N0cmVhbS0+c3RyZWFtX3R5cGUgIT0gQ0FNRVJBM19TVFJFQU1fSU5QVVQpIHsKKyAgICAgICAgICAgIC8vbmV3IHN0cmVhbQorICAgICAgICAgICAgc3RyZWFtX2luZm9fdCogc3RyZWFtX2luZm87CisgICAgICAgICAgICBzdHJlYW1faW5mbyA9IChzdHJlYW1faW5mb190KiApbWFsbG9jKHNpemVvZihzdHJlYW1faW5mb190KSk7CisgICAgICAgICAgICBpZiAoIXN0cmVhbV9pbmZvKSB7CisgICAgICAgICAgICAgICBMT0dFKCJDb3VsZCBub3QgYWxsb2NhdGUgc3RyZWFtIGluZm8iKTsKKyAgICAgICAgICAgICAgIHJjID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtX2luZm8tPnN0cmVhbSA9IG5ld1N0cmVhbTsKKyAgICAgICAgICAgIHN0cmVhbV9pbmZvLT5zdGF0dXMgPSBWQUxJRDsKKyAgICAgICAgICAgIHN0cmVhbV9pbmZvLT5jaGFubmVsID0gTlVMTDsKKyAgICAgICAgICAgIG1TdHJlYW1JbmZvLnB1c2hfYmFjayhzdHJlYW1faW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgLyogQ292ZXJzIE9wYXF1ZSBaU0wgYW5kIEFQSTEgRi9XIFpTTCAqLworICAgICAgICBpZiAoSVNfVVNBR0VfWlNMKG5ld1N0cmVhbS0+dXNhZ2UpCisgICAgICAgICAgICAgICAgfHwgbmV3U3RyZWFtLT5zdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9CSURJUkVDVElPTkFMICkgeworICAgICAgICAgICAgaWYgKHpzbFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiTXVsdGlwbGUgaW5wdXQvcmVwcm9jZXNzIHN0cmVhbXMgcmVxdWVzdGVkISIpOworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB6c2xTdHJlYW0gPSBuZXdTdHJlYW07CisgICAgICAgIH0KKyAgICAgICAgLyogQ292ZXJzIFlVViByZXByb2Nlc3MgKi8KKyAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChuZXdTdHJlYW0tPnN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX09VVFBVVAorICAgICAgICAgICAgICAgICAgICAmJiBuZXdTdHJlYW0tPmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgKKyAgICAgICAgICAgICAgICAgICAgJiYgaW5wdXRTdHJlYW0tPmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgKKyAgICAgICAgICAgICAgICAgICAgJiYgaW5wdXRTdHJlYW0tPndpZHRoID09IG5ld1N0cmVhbS0+d2lkdGgKKyAgICAgICAgICAgICAgICAgICAgJiYgaW5wdXRTdHJlYW0tPmhlaWdodCA9PSBuZXdTdHJlYW0tPmhlaWdodCkgeworICAgICAgICAgICAgICAgIGlmICh6c2xTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIHNjZW5hcmlvIGluZGljYXRlcyBtdWx0aXBsZSBZVVYgc3RyZWFtcyB3aXRoIHNhbWUgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgKiBhcyBpbnB1dCBzdHJlYW0gaGF2ZSBiZWVuIHJlcXVlc3RlZCwgc2luY2UgenNsIHN0cmVhbSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICogaXMgc29sZWx5IHVzZSBmb3IgdGhlIHB1cnBvc2Ugb2Ygb3ZlcnJpZGluZyB0aGUgc2l6ZSBvZiBzdHJlYW1zCisgICAgICAgICAgICAgICAgICAgICAqIHdoaWNoIHNoYXJlIGgvdyBzdHJlYW1zIHdlIHdpbGwganVzdCBtYWtlIGEgZ3Vlc3MgaGVyZSBhcyB0bworICAgICAgICAgICAgICAgICAgICAgKiB3aGljaCBvZiB0aGUgc3RyZWFtIGlzIGEgWlNMIHN0cmVhbSwgdGhpcyB3aWxsIGJlIHJlZmFjdG9yZWQKKyAgICAgICAgICAgICAgICAgICAgICogb25jZSB3ZSBtYWtlIGdlbmVyaWMgbG9naWMgZm9yIHN0cmVhbXMgc2hhcmluZyBlbmNvZGVyIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgTE9HSCgiV2FybmluZywgTXVsdGlwbGUgaXAvcmVwcm9jZXNzIHN0cmVhbXMgcmVxdWVzdGVkISIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB6c2xTdHJlYW0gPSBuZXdTdHJlYW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJZiBhIHpzbCBzdHJlYW0gaXMgc2V0LCB3ZSBrbm93IHRoYXQgd2UgaGF2ZSBjb25maWd1cmVkIGF0IGxlYXN0IG9uZSBpbnB1dCBvcgorICAgICAgIGJpZGlyZWN0aW9uYWwgc3RyZWFtICovCisgICAgaWYgKE5VTEwgIT0genNsU3RyZWFtKSB7CisgICAgICAgIG1JbnB1dFN0cmVhbUluZm8uZGltLndpZHRoID0gKGludDMyX3QpenNsU3RyZWFtLT53aWR0aDsKKyAgICAgICAgbUlucHV0U3RyZWFtSW5mby5kaW0uaGVpZ2h0ID0gKGludDMyX3QpenNsU3RyZWFtLT5oZWlnaHQ7CisgICAgICAgIG1JbnB1dFN0cmVhbUluZm8uZm9ybWF0ID0genNsU3RyZWFtLT5mb3JtYXQ7CisgICAgICAgIG1JbnB1dFN0cmVhbUluZm8udXNhZ2UgPSB6c2xTdHJlYW0tPnVzYWdlOworICAgICAgICBMT0dEKCJJbnB1dCBzdHJlYW0gY29uZmlndXJlZCEgJWQgeCAlZCwgZm9ybWF0ICVkLCB1c2FnZSAlZCIsCisgICAgICAgICAgICAgICAgIG1JbnB1dFN0cmVhbUluZm8uZGltLndpZHRoLAorICAgICAgICAgICAgICAgIG1JbnB1dFN0cmVhbUluZm8uZGltLmhlaWdodCwKKyAgICAgICAgICAgICAgICBtSW5wdXRTdHJlYW1JbmZvLmZvcm1hdCwgbUlucHV0U3RyZWFtSW5mby51c2FnZSk7CisgICAgfQorCisgICAgY2xlYW5BbmRTb3J0U3RyZWFtSW5mbygpOworICAgIGlmIChtTWV0YWRhdGFDaGFubmVsKSB7CisgICAgICAgIGRlbGV0ZSBtTWV0YWRhdGFDaGFubmVsOworICAgICAgICBtTWV0YWRhdGFDaGFubmVsID0gTlVMTDsKKyAgICB9CisgICAgaWYgKG1TdXBwb3J0Q2hhbm5lbCkgeworICAgICAgICBkZWxldGUgbVN1cHBvcnRDaGFubmVsOworICAgICAgICBtU3VwcG9ydENoYW5uZWwgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtQW5hbHlzaXNDaGFubmVsKSB7CisgICAgICAgIGRlbGV0ZSBtQW5hbHlzaXNDaGFubmVsOworICAgICAgICBtQW5hbHlzaXNDaGFubmVsID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUR1bW15QmF0Y2hDaGFubmVsKSB7CisgICAgICAgIGRlbGV0ZSBtRHVtbXlCYXRjaENoYW5uZWw7CisgICAgICAgIG1EdW1teUJhdGNoQ2hhbm5lbCA9IE5VTEw7CisgICAgfQorCisgICAgLy9DcmVhdGUgbWV0YWRhdGEgY2hhbm5lbCBhbmQgaW5pdGlhbGl6ZSBpdAorICAgIGNhbV9mZWF0dXJlX21hc2tfdCBtZXRhZGF0YUZlYXR1cmVNYXNrID0gQ0FNX1FDT01fRkVBVFVSRV9OT05FOworICAgIHNldFBBQUZTdXBwb3J0KG1ldGFkYXRhRmVhdHVyZU1hc2ssIENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSwKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmNvbG9yX2FycmFuZ2VtZW50KTsKKyAgICBtTWV0YWRhdGFDaGFubmVsID0gbmV3IFFDYW1lcmEzTWV0YWRhdGFDaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLCBtQ2FtZXJhSGFuZGxlLT5vcHMsIGNhcHR1cmVSZXN1bHRDYiwKKyAgICAgICAgICAgICAgICAgICAgJnBhZGRpbmdfaW5mbywgbWV0YWRhdGFGZWF0dXJlTWFzaywgdGhpcyk7CisgICAgaWYgKG1NZXRhZGF0YUNoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gYWxsb2NhdGUgbWV0YWRhdGEgY2hhbm5lbCIpOworICAgICAgICByYyA9IC1FTk9NRU07CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIHJjID0gbU1ldGFkYXRhQ2hhbm5lbC0+aW5pdGlhbGl6ZShJU19UWVBFX05PTkUpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgibWV0YWRhdGEgY2hhbm5lbCBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgZGVsZXRlIG1NZXRhZGF0YUNoYW5uZWw7CisgICAgICAgIG1NZXRhZGF0YUNoYW5uZWwgPSBOVUxMOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhbmFseXNpcyBzdHJlYW0gYWxsIHRoZSB0aW1lLCBldmVuIHdoZW4gaC93IHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZQorICAgIHsKKyAgICAgICAgY2FtX2ZlYXR1cmVfbWFza190IGFuYWx5c2lzRmVhdHVyZU1hc2sgPSBDQU1fUUNPTV9GRUFUVVJFX1BQX1NVUEVSU0VUX0hBTDM7CisgICAgICAgIHNldFBBQUZTdXBwb3J0KGFuYWx5c2lzRmVhdHVyZU1hc2ssIENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUywKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCk7CisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3QgYW5hbHlzaXNJbmZvOworICAgICAgICBpbnQzMl90IHJldCA9IE5PX0VSUk9SOworICAgICAgICByZXQgPSBtQ29tbW9uLmdldEFuYWx5c2lzSW5mbygKKyAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICBUUlVFLAorICAgICAgICAgICAgICAgIGFuYWx5c2lzRmVhdHVyZU1hc2ssCisgICAgICAgICAgICAgICAgJmFuYWx5c2lzSW5mbyk7CisgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1BbmFseXNpc0NoYW5uZWwgPSBuZXcgUUNhbWVyYTNTdXBwb3J0Q2hhbm5lbCgKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPm9wcywKKyAgICAgICAgICAgICAgICAgICAgJmFuYWx5c2lzSW5mby5hbmFseXNpc19wYWRkaW5nX2luZm8sCisgICAgICAgICAgICAgICAgICAgIGFuYWx5c2lzRmVhdHVyZU1hc2ssCisgICAgICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUywKKyAgICAgICAgICAgICAgICAgICAgJmFuYWx5c2lzSW5mby5hbmFseXNpc19tYXhfcmVzLAorICAgICAgICAgICAgICAgICAgICAoYW5hbHlzaXNJbmZvLmFuYWx5c2lzX2Zvcm1hdAorICAgICAgICAgICAgICAgICAgICA9PSBDQU1fRk9STUFUX1lfT05MWSA/IENBTV9GT1JNQVRfWV9PTkxZCisgICAgICAgICAgICAgICAgICAgIDogQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjEpLAorICAgICAgICAgICAgICAgICAgICBhbmFseXNpc0luZm8uaHdfYW5hbHlzaXNfc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgMCk7IC8vIGZvcmNlIGJ1ZmZlciBjb3VudCB0byAwCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dXKCJnZXRBbmFseXNpc0luZm8gZmFpbGVkLCByZXQgPSAlZCIsIHJldCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtQW5hbHlzaXNDaGFubmVsKSB7CisgICAgICAgICAgICBMT0dXKCJBbmFseXNpcyBjaGFubmVsIGNhbm5vdCBiZSBjcmVhdGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlzUmF3U3RyZWFtUmVxdWVzdGVkID0gZmFsc2U7CisgICAgbWVtc2V0KCZtU3RyZWFtQ29uZmlnSW5mbywgMCwgc2l6ZW9mKGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QpKTsKKyAgICAvKiBBbGxvY2F0ZSBjaGFubmVsIG9iamVjdHMgZm9yIHRoZSByZXF1ZXN0ZWQgc3RyZWFtcyAqLworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyZWFtTGlzdC0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpuZXdTdHJlYW0gPSBzdHJlYW1MaXN0LT5zdHJlYW1zW2ldOworICAgICAgICB1aW50MzJfdCBzdHJlYW1fdXNhZ2UgPSBuZXdTdHJlYW0tPnVzYWdlOworICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5zdHJlYW1fc2l6ZXNbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdLndpZHRoID0gKGludDMyX3QpbmV3U3RyZWFtLT53aWR0aDsKKyAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8uc3RyZWFtX3NpemVzW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXS5oZWlnaHQgPSAoaW50MzJfdCluZXdTdHJlYW0tPmhlaWdodDsKKyAgICAgICAgc3RydWN0IGNhbWVyYV9pbmZvICpwX2luZm8gPSBOVUxMOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdDYW1Mb2NrKTsKKyAgICAgICAgcF9pbmZvID0gZ2V0X2NhbV9pbmZvKG1DYW1lcmFJZCwgJm1TdHJlYW1Db25maWdJbmZvLnN5bmNfdHlwZSk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnQ2FtTG9jayk7CisgICAgICAgIGlmICgobmV3U3RyZWFtLT5zdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9CSURJUkVDVElPTkFMCisgICAgICAgICAgICAgICAgfHwgSVNfVVNBR0VfWlNMKG5ld1N0cmVhbS0+dXNhZ2UpKSAmJgorICAgICAgICAgICAgbmV3U3RyZWFtLT5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKXsKKyAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnR5cGVbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdID0gQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UOworICAgICAgICAgICAgaWYgKGJVc2VDb21tb25GZWF0dXJlTWFzaykgeworICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnBvc3Rwcm9jZXNzX21hc2tbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbkZlYXR1cmVNYXNrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX05PTkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIGlmKG5ld1N0cmVhbS0+c3RyZWFtX3R5cGUgPT0gQ0FNRVJBM19TVFJFQU1fSU5QVVQpIHsKKyAgICAgICAgICAgICAgICBMT0dIKCJJbnB1dCBzdHJlYW0gY29uZmlndXJlZCwgcmVwcm9jZXNzIGNvbmZpZyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9mb3Igbm9uIHpzbCBzdHJlYW1zIGZpbmQgb3V0IHRoZSBmb3JtYXQKKyAgICAgICAgICAgIHN3aXRjaCAobmV3U3RyZWFtLT5mb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEIDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX1BQX1NVUEVSU0VUX0hBTDM7CisgICAgICAgICAgICAgICAgLyogYWRkIGFkZGl0aW9uYWwgZmVhdHVyZXMgdG8gcHAgZmVhdHVyZSBtYXNrICovCisgICAgICAgICAgICAgICAgYWRkVG9QUEZlYXR1cmVNYXNrKEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zKTsKKworICAgICAgICAgICAgICAgIGlmIChzdHJlYW1fdXNhZ2UgJiBwcml2YXRlX2hhbmRsZV90OjpQUklWX0ZMQUdTX1ZJREVPX0VOQ09ERVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnR5cGVbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPOworICAgICAgICAgICAgICAgICAgICBpZiAobV9iVG5yRW5hYmxlZCAmJiBtX2JUbnJWaWRlbykgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX0NQUF9UTlI7CisgICAgICAgICAgICAgICAgICAgICAgICAvL1ROUiBhbmQgQ0RTIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuIFNvIHJlc2V0IENEUyBmcm9tIGZlYXR1cmUgbWFzaworICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gJj0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkNBTV9RQ09NX0ZFQVRVUkVfQ0RTOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnR5cGVbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fYlRuckVuYWJsZWQgJiYgbV9iVG5yUHJldmlldykgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gfD0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9DUFBfVE5SOworICAgICAgICAgICAgICAgICAgICAgICAgLy9UTlIgYW5kIENEUyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBTbyByZXNldCBDRFMgZnJvbSBmZWF0dXJlIG1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnBvc3Rwcm9jZXNzX21hc2tbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdICY9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5DQU1fUUNPTV9GRUFUVVJFX0NEUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYWRkaW5nX2luZm8ud2lkdGhfcGFkZGluZyA9IG1TdXJmYWNlU3RyaWRlUGFkZGluZzsKKyAgICAgICAgICAgICAgICAgICAgcGFkZGluZ19pbmZvLmhlaWdodF9wYWRkaW5nID0gQ0FNX1BBRF9UT18yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKG5ld1N0cmVhbS0+cm90YXRpb24gPT0gQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fOTApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAobmV3U3RyZWFtLT5yb3RhdGlvbiA9PSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8yNzApKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnN0cmVhbV9zaXplc1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10ud2lkdGggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbS0+aGVpZ2h0OworICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5zdHJlYW1fc2l6ZXNbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdLmhlaWdodCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT53aWR0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4OgorICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnR5cGVbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdID0gQ0FNX1NUUkVBTV9UWVBFX0NBTExCQUNLOworICAgICAgICAgICAgICAgIGlmIChpc09uRW5jb2RlcihtYXhWaWV3ZmluZGVyU2l6ZSwgbmV3U3RyZWFtLT53aWR0aCwgbmV3U3RyZWFtLT5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiVXNlQ29tbW9uRmVhdHVyZU1hc2spCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbkZlYXR1cmVNYXNrOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfTk9ORTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9QUF9TVVBFUlNFVF9IQUwzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0JMT0I6CisgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8udHlwZVttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gPSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q7CisgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBjaGVjayBiU21hbGxKcGVnU2l6ZSBpZiBaU0wgaXMgcHJlc2VudCBzaW5jZSBKUEVHIHVzZXMgWlNMIHN0cmVhbQorICAgICAgICAgICAgICAgIGlmICgobV9iSXM0S1ZpZGVvICYmICFpc1pzbCkgfHwgKGJTbWFsbEpwZWdTaXplICYmICFpc1pzbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnBvc3Rwcm9jZXNzX21hc2tbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9QUF9TVVBFUlNFVF9IQUwzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiVXNlQ29tbW9uRmVhdHVyZU1hc2sgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09uRW5jb2RlcihtYXhWaWV3ZmluZGVyU2l6ZSwgbmV3U3RyZWFtLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnBvc3Rwcm9jZXNzX21hc2tbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdID0gY29tbW9uRmVhdHVyZU1hc2s7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9IENBTV9RQ09NX0ZFQVRVUkVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXNac2wpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHpzbFN0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8uc3RyZWFtX3NpemVzW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXS53aWR0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXpzbFN0cmVhbS0+d2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5zdHJlYW1fc2l6ZXNbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdLmhlaWdodCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXpzbFN0cmVhbS0+aGVpZ2h0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IsIE5vIFpTTCBzdHJlYW0gaWRlbnRpZmllZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9iSXM0S1ZpZGVvKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnN0cmVhbV9zaXplc1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10ud2lkdGggPSAoaW50MzJfdCl2aWRlb1dpZHRoOworICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5zdHJlYW1fc2l6ZXNbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdLmhlaWdodCA9IChpbnQzMl90KXZpZGVvSGVpZ2h0OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYll1djg4OE92ZXJyaWRlSnBlZykgeworICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5zdHJlYW1fc2l6ZXNbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdLndpZHRoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClsYXJnZVl1djg4OFNpemUud2lkdGg7CisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnN0cmVhbV9zaXplc1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10uaGVpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClsYXJnZVl1djg4OFNpemUuaGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVdfT1BBUVVFOgorICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBVzE2OgorICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBVzEwOgorICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnR5cGVbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdID0gQ0FNX1NUUkVBTV9UWVBFX1JBVzsKKyAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9IENBTV9RQ09NX0ZFQVRVUkVfTk9ORTsKKyAgICAgICAgICAgICAgICBpc1Jhd1N0cmVhbVJlcXVlc3RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnR5cGVbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdID0gQ0FNX1NUUkVBTV9UWVBFX0RFRkFVTFQ7CisgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gPSBDQU1fUUNPTV9GRUFUVVJFX05PTkU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzZXRQQUFGU3VwcG9ydChtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICAoY2FtX3N0cmVhbV90eXBlX3QpIG1TdHJlYW1Db25maWdJbmZvLnR5cGVbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdLAorICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmNvbG9yX2FycmFuZ2VtZW50KTsKKworICAgICAgICBpZiAobmV3U3RyZWFtLT5wcml2ID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8vTmV3IHN0cmVhbSwgY29uc3RydWN0IGNoYW5uZWwKKyAgICAgICAgICAgIHN3aXRjaCAobmV3U3RyZWFtLT5zdHJlYW1fdHlwZSkgeworICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9JTlBVVDoKKyAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPnVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1JFQUQ7CisgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT51c2FnZSB8PSBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9XUklURTsvL1dSIGZvciBpbnBsYWNlIGFsZ28ncworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9CSURJUkVDVElPTkFMOgorICAgICAgICAgICAgICAgIG5ld1N0cmVhbS0+dXNhZ2UgfD0gR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfUkVBRCB8CisgICAgICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1dSSVRFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9PVVRQVVQ6CisgICAgICAgICAgICAgICAgLyogRm9yIHZpZGVvIGVuY29kaW5nIHN0cmVhbSwgc2V0IHJlYWQvd3JpdGUgcmFyZWx5CisgICAgICAgICAgICAgICAgICogZmxhZyBzbyB0aGF0IHRoZXkgbWF5IGJlIHNldCB0byB1bi1jYWNoZWQgKi8KKyAgICAgICAgICAgICAgICBpZiAobmV3U3RyZWFtLT51c2FnZSAmIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUikKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT51c2FnZSB8PQorICAgICAgICAgICAgICAgICAgICAgICAgIChHUkFMTE9DX1VTQUdFX1NXX1JFQURfUkFSRUxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX1JBUkVMWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfV1JJVEUpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTX1VTQUdFX1pTTChuZXdTdHJlYW0tPnVzYWdlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExPR0QoIlpTTCB1c2FnZSBmbGFnIHNraXBwaW5nIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5ld1N0cmVhbSA9PSB6c2xTdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG5ld1N0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCkgeworICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPnVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT51c2FnZSB8PSBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9XUklURTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBzdHJlYW1fdHlwZSAlZCIsIG5ld1N0cmVhbS0+c3RyZWFtX3R5cGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmV3U3RyZWFtLT5zdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9PVVRQVVQgfHwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT5zdHJlYW1fdHlwZSA9PSBDQU1FUkEzX1NUUkVBTV9CSURJUkVDVElPTkFMKSB7CisgICAgICAgICAgICAgICAgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgc3dpdGNoIChuZXdTdHJlYW0tPmZvcm1hdCkgeworICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOgorICAgICAgICAgICAgICAgICAgICBpZiAoKG5ld1N0cmVhbS0+dXNhZ2UgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGVfaGFuZGxlX3Q6OlBSSVZfRkxBR1NfVklERU9fRU5DT0RFUikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyZWFtTGlzdC0+b3BlcmF0aW9uX21vZGUgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSkKKyAgICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsID0gbmV3IFFDYW1lcmEzUmVndWxhckNoYW5uZWwobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxIYW5kbGUsIG1DYW1lcmFIYW5kbGUtPm9wcywgY2FwdHVyZVJlc3VsdENiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cGFkZGluZ19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYW1fc3RyZWFtX3R5cGVfdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby50eXBlW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZXRhZGF0YUNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAvL2hlYXAgYnVmZmVycyBhcmUgbm90IHJlcXVpcmVkIGZvciBIRlIgdmlkZW8gY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImFsbG9jYXRpb24gb2YgY2hhbm5lbCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vY2hhbm5lbC0+Z2V0TnVtQnVmZmVycygpIHdpbGwgcmV0dXJuIDAgaGVyZSBzbyB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vTUFYX0lORkxJR0hfSEZSX1JFUVVFU1RTCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPm1heF9idWZmZXJzID0gTUFYX0lORkxJR0hUX0hGUl9SRVFVRVNUUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbS0+cHJpdiA9IGNoYW5uZWw7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dJKCJudW0gdmlkZW8gYnVmZmVycyBpbiBIRlIgbW9kZTogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0lORkxJR0hUX0hGUl9SRVFVRVNUUyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IHN0cmVhbSBjb250ZW50cyBpbiBIRlIgcHJldmlldyBvbmx5IGNhc2UgdG8gY3JlYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBkdW1teSBiYXRjaCBjaGFubmVsIHNvIHRoYXQgc2Vuc29yIHN0cmVhbWluZyBpcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICogSEZSIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbV9iSXNWaWRlbyAmJiAoc3RyZWFtTGlzdC0+b3BlcmF0aW9uX21vZGUgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUR1bW15QmF0Y2hTdHJlYW0gPSAqbmV3U3RyZWFtOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IG5ldyBRQ2FtZXJhM1JlZ3VsYXJDaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLCBtQ2FtZXJhSGFuZGxlLT5vcHMsIGNhcHR1cmVSZXN1bHRDYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnBhZGRpbmdfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FtX3N0cmVhbV90eXBlX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8udHlwZVttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnBvc3Rwcm9jZXNzX21hc2tbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWV0YWRhdGFDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5GTElHSFRfUkVRVUVTVFMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImFsbG9jYXRpb24gb2YgY2hhbm5lbCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbS0+bWF4X2J1ZmZlcnMgPSBjaGFubmVsLT5nZXROdW1CdWZmZXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPnByaXYgPSBjaGFubmVsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4OiB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBuZXcgUUNhbWVyYTNZVVZDaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzLCBjYXB0dXJlUmVzdWx0Q2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhZGRpbmdfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FtX3N0cmVhbV90eXBlX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby50eXBlW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWV0YWRhdGFDaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiYWxsb2NhdGlvbiBvZiBZVVYgY2hhbm5lbCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT5tYXhfYnVmZmVycyA9IGNoYW5uZWwtPmdldE51bUJ1ZmZlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT5wcml2ID0gY2hhbm5lbDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVdfT1BBUVVFOgorICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxNjoKKyAgICAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTA6CisgICAgICAgICAgICAgICAgICAgIG1SYXdDaGFubmVsID0gbmV3IFFDYW1lcmEzUmF3Q2hhbm5lbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLCBtQ2hhbm5lbEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSGFuZGxlLT5vcHMsIGNhcHR1cmVSZXN1bHRDYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFkZGluZ19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG5ld1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWV0YWRhdGFDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXdTdHJlYW0tPmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JBVzE2KSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUmF3Q2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJhbGxvY2F0aW9uIG9mIHJhdyBjaGFubmVsIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPm1heF9idWZmZXJzID0gbVJhd0NoYW5uZWwtPmdldE51bUJ1ZmZlcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT5wcml2ID0gKFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwqKW1SYXdDaGFubmVsOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkxPQjoKKyAgICAgICAgICAgICAgICAgICAgLy8gTWF4IGxpdmUgc25hcHNob3QgaW5mbGlnaHQgYnVmZmVyIGlzIDEuIFRoaXMgaXMgdG8gbWl0aWdhdGUKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWUgZHJvcCBpc3N1ZXMgZm9yIHZpZGVvIHNuYXBzaG90LiBUaGUgbW9yZSBidWZmZXJzIGJlaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZCwgdGhlIG1vcmUgZnJhbWUgZHJvcHMgdGhlcmUgYXJlLgorICAgICAgICAgICAgICAgICAgICBtUGljdHVyZUNoYW5uZWwgPSBuZXcgUUNhbWVyYTNQaWNDaGFubmVsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsIG1DaGFubmVsSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPm9wcywgY2FwdHVyZVJlc3VsdENiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYWRkaW5nX2luZm8sIHRoaXMsIG5ld1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JJczRLVmlkZW8sIGlzWnNsLCBtTWV0YWRhdGFDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX2JJc1ZpZGVvID8gMSA6IE1BWF9JTkZMSUdIVF9CTE9CKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUGljdHVyZUNoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiYWxsb2NhdGlvbiBvZiBjaGFubmVsIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPnByaXYgPSAoUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCopbVBpY3R1cmVDaGFubmVsOworICAgICAgICAgICAgICAgICAgICBuZXdTdHJlYW0tPm1heF9idWZmZXJzID0gbVBpY3R1cmVDaGFubmVsLT5nZXROdW1CdWZmZXJzKCk7CisgICAgICAgICAgICAgICAgICAgIG1QaWN0dXJlQ2hhbm5lbC0+b3ZlcnJpZGVZdXZTaXplKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnN0cmVhbV9zaXplc1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10ud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8uc3RyZWFtX3NpemVzW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXS5oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExPR0UoIm5vdCBhIHN1cHBvcnRlZCBmb3JtYXQgMHgleCIsIG5ld1N0cmVhbS0+Zm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdTdHJlYW0tPnN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX0lOUFVUKSB7CisgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT5tYXhfYnVmZmVycyA9IE1BWF9JTkZMSUdIVF9SRVBST0NFU1NfUkVRVUVTVFM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yLCBVbmtub3duIHN0cmVhbSB0eXBlIik7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqY2hhbm5lbCA9IChRQ2FtZXJhM0NoYW5uZWwqKSBuZXdTdHJlYW0tPnByaXY7CisgICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSBOVUxMICYmIGNoYW5uZWwtPmlzVUJXQ0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIGNhbV9mb3JtYXRfdCBmbXQgPSBjaGFubmVsLT5nZXRTdHJlYW1EZWZhdWx0Rm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8udHlwZVttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10pOworICAgICAgICAgICAgICAgIGlmKGZtdCA9PSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9VQldDKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbS0+dXNhZ2UgfD0gR1JBTExPQ19VU0FHRV9QUklWQVRFX0FMTE9DX1VCV0M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKExpc3Q8c3RyZWFtX2luZm9fdCo+OjppdGVyYXRvciBpdD1tU3RyZWFtSW5mby5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICBpdCAhPSBtU3RyZWFtSW5mby5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgICAgIGlmICgoKml0KS0+c3RyZWFtID09IG5ld1N0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICAoKml0KS0+Y2hhbm5lbCA9IChRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsKikgbmV3U3RyZWFtLT5wcml2OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBDaGFubmVsIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHN0cmVhbQorICAgICAgICAgICAgLy8gRG8gbm90aGluZyBmb3Igbm93CisgICAgICAgIH0KKyAgICAgICAgcGFkZGluZ19pbmZvID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cGFkZGluZ19pbmZvOworCisgICAgICAgIC8qIERvIG5vdCBhZGQgZW50cmllcyBmb3IgaW5wdXQgc3RyZWFtIGluIG1ldGFzdHJlYW0gaW5mbworICAgICAgICAgKiBzaW5jZSB0aGVyZSBpcyBubyByZWFsIHN0cmVhbSBhc3NvY2lhdGVkIHdpdGggaXQKKyAgICAgICAgICovCisgICAgICAgIGlmIChuZXdTdHJlYW0tPnN0cmVhbV90eXBlICE9IENBTUVSQTNfU1RSRUFNX0lOUFVUKQorICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXMrKzsKKyAgICB9CisKKyAgICAvL1JBVyBEVU1QIGNoYW5uZWwKKyAgICBpZiAobUVuYWJsZVJhd0R1bXAgJiYgaXNSYXdTdHJlYW1SZXF1ZXN0ZWQgPT0gZmFsc2UpeworICAgICAgICBjYW1fZGltZW5zaW9uX3QgcmF3RHVtcFNpemU7CisgICAgICAgIHJhd0R1bXBTaXplID0gZ2V0TWF4UmF3U2l6ZShtQ2FtZXJhSWQpOworICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcmF3RHVtcEZlYXR1cmVNYXNrID0gQ0FNX1FDT01fRkVBVFVSRV9OT05FOworICAgICAgICBzZXRQQUFGU3VwcG9ydChyYXdEdW1wRmVhdHVyZU1hc2ssCisgICAgICAgICAgICAgICAgQ0FNX1NUUkVBTV9UWVBFX1JBVywKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCk7CisgICAgICAgIG1SYXdEdW1wQ2hhbm5lbCA9IG5ldyBRQ2FtZXJhM1Jhd0R1bXBDaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd0R1bXBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYWRkaW5nX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgcmF3RHVtcEZlYXR1cmVNYXNrKTsKKyAgICAgICAgaWYgKCFtUmF3RHVtcENoYW5uZWwpIHsKKyAgICAgICAgICAgIExPR0UoIlJhdyBEdW1wIGNoYW5uZWwgY2Fubm90IGJlIGNyZWF0ZWQiKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGlmIChtQW5hbHlzaXNDaGFubmVsKSB7CisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3QgYW5hbHlzaXNJbmZvOworICAgICAgICBtZW1zZXQoJmFuYWx5c2lzSW5mbywgMCwgc2l6ZW9mKGNhbV9hbmFseXNpc19pbmZvX3QpKTsKKyAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8udHlwZVttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUzsKKyAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfUFBfU1VQRVJTRVRfSEFMMzsKKyAgICAgICAgc2V0UEFBRlN1cHBvcnQobVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10sCisgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8udHlwZVttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10sCisgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+Y29sb3JfYXJyYW5nZW1lbnQpOworICAgICAgICByYyA9IG1Db21tb24uZ2V0QW5hbHlzaXNJbmZvKEZBTFNFLCBUUlVFLAorICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnBvc3Rwcm9jZXNzX21hc2tbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdLAorICAgICAgICAgICAgICAgICZhbmFseXNpc0luZm8pOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoImdldEFuYWx5c2lzSW5mbyBmYWlsZWQsIHJldCA9ICVkIiwgcmMpOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8uc3RyZWFtX3NpemVzW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgYW5hbHlzaXNJbmZvLmFuYWx5c2lzX21heF9yZXM7CisgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zKys7CisgICAgfQorCisgICAgaWYgKGlzU3VwcG9ydENoYW5uZWxOZWVkZWQoc3RyZWFtTGlzdCwgbVN0cmVhbUNvbmZpZ0luZm8pKSB7CisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3Qgc3VwcG9ydEluZm87CisgICAgICAgIG1lbXNldCgmc3VwcG9ydEluZm8sIDAsIHNpemVvZihjYW1fYW5hbHlzaXNfaW5mb190KSk7CisgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBjYWxsYmFja0ZlYXR1cmVNYXNrID0gQ0FNX1FDT01fRkVBVFVSRV9QUF9TVVBFUlNFVF9IQUwzOworICAgICAgICBzZXRQQUFGU3VwcG9ydChjYWxsYmFja0ZlYXR1cmVNYXNrLAorICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSywKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCk7CisgICAgICAgIGludDMyX3QgcmV0ID0gTk9fRVJST1I7CisgICAgICAgIHJldCA9IG1Db21tb24uZ2V0QW5hbHlzaXNJbmZvKEZBTFNFLCBUUlVFLCBjYWxsYmFja0ZlYXR1cmVNYXNrLCAmc3VwcG9ydEluZm8pOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvKiBJZ25vcmUgdGhlIGVycm9yIGZvciBNb25vIGNhbWVyYQorICAgICAgICAgICAgICogYmVjYXVzZSB0aGUgUEFBRiBiaXQgbWFzayBpcyBvbmx5IHNldAorICAgICAgICAgICAgICogZm9yIENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUyBzdHJlYW0gdHlwZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+Y29sb3JfYXJyYW5nZW1lbnQgIT0gQ0FNX0ZJTFRFUl9BUlJBTkdFTUVOVF9ZKSB7CisgICAgICAgICAgICAgICAgTE9HVygiZ2V0QW5hbHlzaXNJbmZvIGZhaWxlZCwgcmV0ID0gJWQiLCByZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1TdXBwb3J0Q2hhbm5lbCA9IG5ldyBRQ2FtZXJhM1N1cHBvcnRDaGFubmVsKAorICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgbUNoYW5uZWxIYW5kbGUsCisgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzLAorICAgICAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5wYWRkaW5nX2luZm8sCisgICAgICAgICAgICAgICAgY2FsbGJhY2tGZWF0dXJlTWFzaywKKyAgICAgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfQ0FMTEJBQ0ssCisgICAgICAgICAgICAgICAgJlFDYW1lcmEzU3VwcG9ydENoYW5uZWw6OmtEaW0sCisgICAgICAgICAgICAgICAgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjEsCisgICAgICAgICAgICAgICAgc3VwcG9ydEluZm8uaHdfYW5hbHlzaXNfc3VwcG9ydGVkLAorICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmNvbG9yX2FycmFuZ2VtZW50LAorICAgICAgICAgICAgICAgIHRoaXMpOworICAgICAgICBpZiAoIW1TdXBwb3J0Q2hhbm5lbCkgeworICAgICAgICAgICAgTE9HRSgiZHVtbXkgY2hhbm5lbCBjYW5ub3QgYmUgY3JlYXRlZCIpOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU3VwcG9ydENoYW5uZWwpIHsKKyAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8uc3RyZWFtX3NpemVzW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgUUNhbWVyYTNTdXBwb3J0Q2hhbm5lbDo6a0RpbTsKKyAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8udHlwZVttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSzsKKyAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfUFBfU1VQRVJTRVRfSEFMMzsKKyAgICAgICAgc2V0UEFBRlN1cHBvcnQobVN0cmVhbUNvbmZpZ0luZm8ucG9zdHByb2Nlc3NfbWFza1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10sCisgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8udHlwZVttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10sCisgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+Y29sb3JfYXJyYW5nZW1lbnQpOworICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtcysrOworICAgIH0KKworICAgIGlmIChtUmF3RHVtcENoYW5uZWwpIHsKKyAgICAgICAgY2FtX2RpbWVuc2lvbl90IHJhd1NpemU7CisgICAgICAgIHJhd1NpemUgPSBnZXRNYXhSYXdTaXplKG1DYW1lcmFJZCk7CisgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnN0cmVhbV9zaXplc1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgICAgIHJhd1NpemU7CisgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnR5cGVbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfUkFXOworICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9OT05FOworICAgICAgICBzZXRQQUFGU3VwcG9ydChtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby50eXBlW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCk7CisgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zKys7CisgICAgfQorICAgIC8qIEluIEhGUiBtb2RlLCBpZiB2aWRlbyBzdHJlYW0gaXMgbm90IGFkZGVkLCBjcmVhdGUgYSBkdW1teSBjaGFubmVsIHNvIHRoYXQKKyAgICAgKiBJU1AgY2FuIGNyZWF0ZSBhIGJhdGNoIG1vZGUgZXZlbiBmb3IgcHJldmlldyBvbmx5IGNhc2UuIFRoaXMgY2hhbm5lbCBpcworICAgICAqIG5ldmVyICdzdGFydCdlZCAobm8gc3RyZWFtLW9uKSwgaXQgaXMgb25seSAnaW5pdGlhbGl6ZWQnICAqLworICAgIGlmICgobU9wTW9kZSA9PSBDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERSkgJiYKKyAgICAgICAgICAgICFtX2JJc1ZpZGVvKSB7CisgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBkdW1teUZlYXR1cmVNYXNrID0gQ0FNX1FDT01fRkVBVFVSRV9QUF9TVVBFUlNFVF9IQUwzOworICAgICAgICBzZXRQQUFGU3VwcG9ydChkdW1teUZlYXR1cmVNYXNrLAorICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fVFlQRV9WSURFTywKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCk7CisgICAgICAgIG1EdW1teUJhdGNoQ2hhbm5lbCA9IG5ldyBRQ2FtZXJhM1JlZ3VsYXJDaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgbUNoYW5uZWxIYW5kbGUsCisgICAgICAgICAgICAgICAgbUNhbWVyYUhhbmRsZS0+b3BzLCBjYXB0dXJlUmVzdWx0Q2IsCisgICAgICAgICAgICAgICAgJmdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnBhZGRpbmdfaW5mbywKKyAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICZtRHVtbXlCYXRjaFN0cmVhbSwKKyAgICAgICAgICAgICAgICBDQU1fU1RSRUFNX1RZUEVfVklERU8sCisgICAgICAgICAgICAgICAgZHVtbXlGZWF0dXJlTWFzaywKKyAgICAgICAgICAgICAgICBtTWV0YWRhdGFDaGFubmVsKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gbUR1bW15QmF0Y2hDaGFubmVsKSB7CisgICAgICAgICAgICBMT0dFKCJjcmVhdGlvbiBvZiBtRHVtbXlCYXRjaENoYW5uZWwgZmFpbGVkLiIKKyAgICAgICAgICAgICAgICAgICAgIlByZXZpZXcgd2lsbCB1c2Ugbm9uLWhmciBzZW5zb3IgbW9kZSAiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobUR1bW15QmF0Y2hDaGFubmVsKSB7CisgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnN0cmVhbV9zaXplc1ttU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtc10ud2lkdGggPQorICAgICAgICAgICAgICAgIG1EdW1teUJhdGNoU3RyZWFtLndpZHRoOworICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5zdHJlYW1fc2l6ZXNbbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXNdLmhlaWdodCA9CisgICAgICAgICAgICAgICAgbUR1bW15QmF0Y2hTdHJlYW0uaGVpZ2h0OworICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby50eXBlW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPOworICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSA9CisgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9QUF9TVVBFUlNFVF9IQUwzOworICAgICAgICBzZXRQQUFGU3VwcG9ydChtU3RyZWFtQ29uZmlnSW5mby5wb3N0cHJvY2Vzc19tYXNrW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby50eXBlW21TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zXSwKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCk7CisgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLm51bV9zdHJlYW1zKys7CisgICAgfQorCisgICAgbVN0cmVhbUNvbmZpZ0luZm8uYnVmZmVyX2luZm8ubWluX2J1ZmZlcnMgPSBNSU5fSU5GTElHSFRfUkVRVUVTVFM7CisgICAgbVN0cmVhbUNvbmZpZ0luZm8uYnVmZmVyX2luZm8ubWF4X2J1ZmZlcnMgPQorICAgICAgICAgICAgbV9iSXM0S1ZpZGVvID8gMCA6IE1BWF9JTkZMSUdIVF9SRVFVRVNUUzsKKworICAgIC8qIEluaXRpYWxpemUgbVBlbmRpbmdSZXF1ZXN0SW5mbyBhbmQgbVBlbmRpbmdCdWZmZXJzTWFwICovCisgICAgZm9yIChwZW5kaW5nUmVxdWVzdEl0ZXJhdG9yIGkgPSBtUGVuZGluZ1JlcXVlc3RzTGlzdC5iZWdpbigpOworICAgICAgICAgICAgaSAhPSBtUGVuZGluZ1JlcXVlc3RzTGlzdC5lbmQoKTspIHsKKyAgICAgICAgaSA9IGVyYXNlUGVuZGluZ1JlcXVlc3QoaSk7CisgICAgfQorICAgIG1QZW5kaW5nRnJhbWVEcm9wTGlzdC5jbGVhcigpOworICAgIC8vIEluaXRpYWxpemUvUmVzZXQgdGhlIHBlbmRpbmcgYnVmZmVycyBsaXN0CisgICAgZm9yIChhdXRvICZyZXEgOiBtUGVuZGluZ0J1ZmZlcnNNYXAubVBlbmRpbmdCdWZmZXJzSW5SZXF1ZXN0KSB7CisgICAgICAgIHJlcS5tUGVuZGluZ0J1ZmZlckxpc3QuY2xlYXIoKTsKKyAgICB9CisgICAgbVBlbmRpbmdCdWZmZXJzTWFwLm1QZW5kaW5nQnVmZmVyc0luUmVxdWVzdC5jbGVhcigpOworCisgICAgbVBlbmRpbmdSZXByb2Nlc3NSZXN1bHRMaXN0LmNsZWFyKCk7CisKKyAgICBtQ3VySnBlZ01ldGEuY2xlYXIoKTsKKyAgICAvL0dldCBtaW4gZnJhbWUgZHVyYXRpb24gZm9yIHRoaXMgc3RyZWFtcyBjb25maWd1cmF0aW9uCisgICAgZGVyaXZlTWluRnJhbWVEdXJhdGlvbigpOworCisgICAgLy8gVXBkYXRlIHN0YXRlCisgICAgbVN0YXRlID0gQ09ORklHVVJFRDsKKworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHZhbGlkYXRlQ2FwdHVyZVJlcXVlc3QKKyAqCisgKiBERVNDUklQVElPTjogdmFsaWRhdGUgYSBjYXB0dXJlIHJlcXVlc3QgZnJvbSBjYW1lcmEgc2VydmljZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVxdWVzdCA6IHJlcXVlc3QgZnJvbSBmcmFtZXdvcmsgdG8gcHJvY2VzcworICoKKyAqIFJFVFVSTiAgICAgOgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OnZhbGlkYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgKnJlcXVlc3QpCit7CisgICAgc3NpemVfdCBpZHggPSAwOworICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpiOworICAgIENhbWVyYU1ldGFkYXRhIG1ldGE7CisKKyAgICAvKiBTYW5pdHkgY2hlY2sgdGhlIHJlcXVlc3QgKi8KKyAgICBpZiAocmVxdWVzdCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FwdHVyZSByZXF1ZXN0Iik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKChyZXF1ZXN0LT5zZXR0aW5ncyA9PSBOVUxMKSAmJiAobVN0YXRlID09IENPTkZJR1VSRUQpKSB7CisgICAgICAgIC8qc2V0dGluZ3MgY2Fubm90IGJlIG51bGwgZm9yIHRoZSBmaXJzdCByZXF1ZXN0Ki8KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBmcmFtZU51bWJlciA9IHJlcXVlc3QtPmZyYW1lX251bWJlcjsKKyAgICBpZiAocmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzIDwgMSB8fCByZXF1ZXN0LT5vdXRwdXRfYnVmZmVycyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIlJlcXVlc3QgJWQ6IE5vIG91dHB1dCBidWZmZXJzIHByb3ZpZGVkISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBmcmFtZU51bWJlcik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChyZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnMgPj0gTUFYX05VTV9TVFJFQU1TKSB7CisgICAgICAgIExPR0UoIk51bWJlciBvZiBidWZmZXJzICVkIGVxdWFscyBvciBpcyBncmVhdGVyIHRoYW4gbWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtcyEiLAorICAgICAgICAgICAgICAgICByZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnMsIE1BWF9OVU1fU1RSRUFNUyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmIChyZXF1ZXN0LT5pbnB1dF9idWZmZXIgIT0gTlVMTCkgeworICAgICAgICBiID0gcmVxdWVzdC0+aW5wdXRfYnVmZmVyOworICAgICAgICBpZiAoYi0+c3RhdHVzICE9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSykgeworICAgICAgICAgICAgTE9HRSgiUmVxdWVzdCAlZDogQnVmZmVyICVsZDogU3RhdHVzIG5vdCBPSyEiLAorICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIChsb25nKWlkeCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChiLT5yZWxlYXNlX2ZlbmNlICE9IC0xKSB7CisgICAgICAgICAgICBMT0dFKCJSZXF1ZXN0ICVkOiBCdWZmZXIgJWxkOiBIYXMgYSByZWxlYXNlIGZlbmNlISIsCisgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgKGxvbmcpaWR4KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGItPmJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJSZXF1ZXN0ICVkOiBCdWZmZXIgJWxkOiBOVUxMIGJ1ZmZlciBoYW5kbGUhIiwKKyAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCAobG9uZylpZHgpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlIGFsbCBidWZmZXJzCisgICAgYiA9IHJlcXVlc3QtPm91dHB1dF9idWZmZXJzOworICAgIGRvIHsKKyAgICAgICAgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCAqY2hhbm5lbCA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCo+KGItPnN0cmVhbS0+cHJpdik7CisgICAgICAgIGlmIChjaGFubmVsID09IE5VTEwpIHsKKyAgICAgICAgICAgIExPR0UoIlJlcXVlc3QgJWQ6IEJ1ZmZlciAlbGQ6IFVuY29uZmlndXJlZCBzdHJlYW0hIiwKKyAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCAobG9uZylpZHgpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYi0+c3RhdHVzICE9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19PSykgeworICAgICAgICAgICAgTE9HRSgiUmVxdWVzdCAlZDogQnVmZmVyICVsZDogU3RhdHVzIG5vdCBPSyEiLAorICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIChsb25nKWlkeCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChiLT5yZWxlYXNlX2ZlbmNlICE9IC0xKSB7CisgICAgICAgICAgICBMT0dFKCJSZXF1ZXN0ICVkOiBCdWZmZXIgJWxkOiBIYXMgYSByZWxlYXNlIGZlbmNlISIsCisgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgKGxvbmcpaWR4KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGItPmJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJSZXF1ZXN0ICVkOiBCdWZmZXIgJWxkOiBOVUxMIGJ1ZmZlciBoYW5kbGUhIiwKKyAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCAobG9uZylpZHgpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKihiLT5idWZmZXIpID09IE5VTEwpIHsKKyAgICAgICAgICAgIExPR0UoIlJlcXVlc3QgJWQ6IEJ1ZmZlciAlbGQ6IE5VTEwgcHJpdmF0ZSBoYW5kbGUhIiwKKyAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyLCAobG9uZylpZHgpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZHgrKzsKKyAgICAgICAgYiA9IHJlcXVlc3QtPm91dHB1dF9idWZmZXJzICsgaWR4OworICAgIH0gd2hpbGUgKGlkeCA8IChzc2l6ZV90KXJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVycyk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGVyaXZlTWluRnJhbWVEdXJhdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOiBkZXJpdmUgbWluaW51bSBwcm9jZXNzZWQsIGpwZWcsIGFuZCByYXcgZnJhbWUgZHVyYXRpb25zIGJhc2VkCisgKiAgICAgICAgICAgICAgb24gY3VycmVudGx5IGNvbmZpZ3VyZWQgc3RyZWFtcy4KKyAqCisgKiBQQVJBTUVURVJTIDogTk9ORQorICoKKyAqIFJFVFVSTiAgICAgOiBOT05FCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmRlcml2ZU1pbkZyYW1lRHVyYXRpb24oKQoreworICAgIGludDMyX3QgbWF4SnBlZ0RpbSwgbWF4UHJvY2Vzc2VkRGltLCBtYXhSYXdEaW07CisKKyAgICBtYXhKcGVnRGltID0gMDsKKyAgICBtYXhQcm9jZXNzZWREaW0gPSAwOworICAgIG1heFJhd0RpbSA9IDA7CisKKyAgICAvLyBGaWd1cmUgb3V0IG1heGltdW0ganBlZywgcHJvY2Vzc2VkLCBhbmQgcmF3IGRpbWVuc2lvbnMKKyAgICBmb3IgKExpc3Q8c3RyZWFtX2luZm9fdCo+OjppdGVyYXRvciBpdCA9IG1TdHJlYW1JbmZvLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IG1TdHJlYW1JbmZvLmVuZCgpOyBpdCsrKSB7CisKKyAgICAgICAgLy8gSW5wdXQgc3RyZWFtIGRvZXNuJ3QgaGF2ZSB2YWxpZCBzdHJlYW1fdHlwZQorICAgICAgICBpZiAoKCppdCktPnN0cmVhbS0+c3RyZWFtX3R5cGUgPT0gQ0FNRVJBM19TVFJFQU1fSU5QVVQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpbnQzMl90IGRpbWVuc2lvbiA9IChpbnQzMl90KSgoKml0KS0+c3RyZWFtLT53aWR0aCAqICgqaXQpLT5zdHJlYW0tPmhlaWdodCk7CisgICAgICAgIGlmICgoKml0KS0+c3RyZWFtLT5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICBpZiAoZGltZW5zaW9uID4gbWF4SnBlZ0RpbSkKKyAgICAgICAgICAgICAgICBtYXhKcGVnRGltID0gZGltZW5zaW9uOworICAgICAgICB9IGVsc2UgaWYgKCgqaXQpLT5zdHJlYW0tPmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JBV19PUEFRVUUgfHwKKyAgICAgICAgICAgICAgICAoKml0KS0+c3RyZWFtLT5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SQVcxMCB8fAorICAgICAgICAgICAgICAgICgqaXQpLT5zdHJlYW0tPmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JBVzE2KSB7CisgICAgICAgICAgICBpZiAoZGltZW5zaW9uID4gbWF4UmF3RGltKQorICAgICAgICAgICAgICAgIG1heFJhd0RpbSA9IGRpbWVuc2lvbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChkaW1lbnNpb24gPiBtYXhQcm9jZXNzZWREaW0pCisgICAgICAgICAgICAgICAgbWF4UHJvY2Vzc2VkRGltID0gZGltZW5zaW9uOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IGNvdW50ID0gTUlOKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnN1cHBvcnRlZF9yYXdfZGltX2NudCwKKyAgICAgICAgICAgIE1BWF9TSVpFU19DTlQpOworCisgICAgLy9Bc3N1bWUgYWxsIGpwZWcgZGltZW5zaW9ucyBhcmUgaW4gcHJvY2Vzc2VkIGRpbWVuc2lvbnMuCisgICAgaWYgKG1heEpwZWdEaW0gPiBtYXhQcm9jZXNzZWREaW0pCisgICAgICAgIG1heFByb2Nlc3NlZERpbSA9IG1heEpwZWdEaW07CisgICAgLy9GaW5kIHRoZSBzbWFsbGVzdCByYXcgZGltZW5zaW9uIHRoYXQgaXMgZ3JlYXRlciBvciBlcXVhbCB0byBqcGVnIGRpbWVuc2lvbgorICAgIGlmIChtYXhQcm9jZXNzZWREaW0gPiBtYXhSYXdEaW0pIHsKKyAgICAgICAgbWF4UmF3RGltID0gSU5UMzJfTUFYOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBkaW1lbnNpb24gPSBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5yYXdfZGltW2ldLndpZHRoICoKKyAgICAgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cmF3X2RpbVtpXS5oZWlnaHQ7CisgICAgICAgICAgICBpZiAoZGltZW5zaW9uID49IG1heFByb2Nlc3NlZERpbSAmJiBkaW1lbnNpb24gPCBtYXhSYXdEaW0pCisgICAgICAgICAgICAgICAgbWF4UmF3RGltID0gZGltZW5zaW9uOworICAgICAgICB9CisgICAgfQorCisgICAgLy9GaW5kIG1pbmltdW0gZHVyYXRpb25zIGZvciBwcm9jZXNzZWQsIGpwZWcsIGFuZCByYXcKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKG1heFJhd0RpbSA9PSBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5yYXdfZGltW2ldLndpZHRoICoKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5yYXdfZGltW2ldLmhlaWdodCkgeworICAgICAgICAgICAgbU1pblJhd0ZyYW1lRHVyYXRpb24gPSBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5yYXdfbWluX2R1cmF0aW9uW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgY291bnQgPSBNSU4oZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cGljdHVyZV9zaXplc190YmxfY250LCBNQVhfU0laRVNfQ05UKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKG1heFByb2Nlc3NlZERpbSA9PQorICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnBpY3R1cmVfc2l6ZXNfdGJsW2ldLndpZHRoICoKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5waWN0dXJlX3NpemVzX3RibFtpXS5oZWlnaHQpIHsKKyAgICAgICAgICAgIG1NaW5Qcm9jZXNzZWRGcmFtZUR1cmF0aW9uID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cGljdHVyZV9taW5fZHVyYXRpb25baV07CisgICAgICAgICAgICBtTWluSnBlZ0ZyYW1lRHVyYXRpb24gPSBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5waWN0dXJlX21pbl9kdXJhdGlvbltpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldE1pbkZyYW1lRHVyYXRpb24KKyAqCisgKiBERVNDUklQVElPTjogZ2V0IG1pbmltdW0gZnJhbWUgZHJhdXRpb24gYmFzZWQgb24gdGhlIGN1cnJlbnQgbWF4aW11bSBmcmFtZSBkdXJhdGlvbnMKKyAqICAgICAgICAgICAgICBhbmQgY3VycmVudCByZXF1ZXN0IGNvbmZpZ3VyYXRpb24uCisgKgorICogUEFSQU1FVEVSUyA6IEByZXF1ZXN0OiByZXF1c2V0IHNlbnQgYnkgdGhlIGZyYW1ld29ya3MKKyAqCisgKiBSRVRVUk4gICAgIDogbWluIGZhcm1lIGR1cmF0aW9uIGZvciBhIHBhcnRpY3VsYXIgcmVxdWVzdAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50NjRfdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpnZXRNaW5GcmFtZUR1cmF0aW9uKGNvbnN0IGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgKnJlcXVlc3QpCit7CisgICAgYm9vbCBoYXNKcGVnU3RyZWFtID0gZmFsc2U7CisgICAgYm9vbCBoYXNSYXdTdHJlYW0gPSBmYWxzZTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzOyBpICsrKSB7CisgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbSA9IHJlcXVlc3QtPm91dHB1dF9idWZmZXJzW2ldLnN0cmVhbTsKKyAgICAgICAgaWYgKHN0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikKKyAgICAgICAgICAgIGhhc0pwZWdTdHJlYW0gPSB0cnVlOworICAgICAgICBlbHNlIGlmIChzdHJlYW0tPmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JBV19PUEFRVUUgfHwKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JBVzEwIHx8CisgICAgICAgICAgICAgICAgc3RyZWFtLT5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SQVcxNikKKyAgICAgICAgICAgIGhhc1Jhd1N0cmVhbSA9IHRydWU7CisgICAgfQorCisgICAgaWYgKCFoYXNKcGVnU3RyZWFtKQorICAgICAgICByZXR1cm4gTUFYKG1NaW5SYXdGcmFtZUR1cmF0aW9uLCBtTWluUHJvY2Vzc2VkRnJhbWVEdXJhdGlvbik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTUFYKE1BWChtTWluUmF3RnJhbWVEdXJhdGlvbiwgbU1pblByb2Nlc3NlZEZyYW1lRHVyYXRpb24pLCBtTWluSnBlZ0ZyYW1lRHVyYXRpb24pOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGhhbmRsZUJ1ZmZlcnNEdXJpbmdGbHVzaExvY2sKKyAqCisgKiBERVNDUklQVElPTjogQWNjb3VudCBmb3IgYnVmZmVycyByZXR1cm5lZCBmcm9tIGJhY2stZW5kIGR1cmluZyBmbHVzaAorICogICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgd2hpbGUgbU11dGV4IGlzIGhlbGQgYnkgdGhlIGNhbGxlci4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJ1ZmZlcjogaW1hZ2UgYnVmZmVyIGZvciB0aGUgY2FsbGJhY2sKKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpoYW5kbGVCdWZmZXJzRHVyaW5nRmx1c2hMb2NrKGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpidWZmZXIpCit7CisgICAgYm9vbCBidWZmZXJfZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKExpc3Q8UGVuZGluZ0J1ZmZlcnNJblJlcXVlc3Q+OjppdGVyYXRvciByZXEgPQorICAgICAgICAgICAgbVBlbmRpbmdCdWZmZXJzTWFwLm1QZW5kaW5nQnVmZmVyc0luUmVxdWVzdC5iZWdpbigpOworICAgICAgICAgICAgcmVxICE9IG1QZW5kaW5nQnVmZmVyc01hcC5tUGVuZGluZ0J1ZmZlcnNJblJlcXVlc3QuZW5kKCk7IHJlcSsrKSB7CisgICAgICAgIGZvciAoTGlzdDxQZW5kaW5nQnVmZmVySW5mbz46Oml0ZXJhdG9yIGkgPQorICAgICAgICAgICAgICAgIHJlcS0+bVBlbmRpbmdCdWZmZXJMaXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaSAhPSByZXEtPm1QZW5kaW5nQnVmZmVyTGlzdC5lbmQoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaS0+YnVmZmVyID09IGJ1ZmZlci0+YnVmZmVyKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdCdWZmZXJzTWFwLm51bVBlbmRpbmdCdWZzQXRGbHVzaC0tOworICAgICAgICAgICAgICAgIExPR0QoIkZvdW5kIGJ1ZmZlciAlcCBmb3IgRnJhbWUgJWQsIG51bVBlbmRpbmdCdWZzQXRGbHVzaCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5idWZmZXIsIHJlcS0+ZnJhbWVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0J1ZmZlcnNNYXAubnVtUGVuZGluZ0J1ZnNBdEZsdXNoKTsKKyAgICAgICAgICAgICAgICBidWZmZXJfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXJfZm91bmQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtUGVuZGluZ0J1ZmZlcnNNYXAubnVtUGVuZGluZ0J1ZnNBdEZsdXNoID09IDApIHsKKyAgICAgICAgLy9zaWduYWwgdGhlIGZsdXNoKCkKKyAgICAgICAgTE9HRCgiQWxsIGJ1ZmZlcnMgcmV0dXJuZWQgdG8gSEFMLiBDb250aW51ZSBmbHVzaCIpOworICAgICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZtQnVmZmVyc0NvbmQpOworICAgIH0KK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGhhbmRsZVBlbmRpbmdSZXByb2NSZXN1bHRzCisgKgorICogREVTQ1JJUFRJT046IGNoZWNrIGFuZCBub3RpZnkgb24gYW55IHBlbmRpbmcgcmVwcm9jZXNzIHJlc3VsdHMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZyYW1lX251bWJlciAgIDogUGVuZGluZyByZXF1ZXN0IGZyYW1lIG51bWJlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6aGFuZGxlUGVuZGluZ1JlcHJvY1Jlc3VsdHModWludDMyX3QgZnJhbWVfbnVtYmVyKQoreworICAgIGZvciAoTGlzdDxQZW5kaW5nUmVwcm9jZXNzUmVzdWx0Pjo6aXRlcmF0b3IgaiA9IG1QZW5kaW5nUmVwcm9jZXNzUmVzdWx0TGlzdC5iZWdpbigpOworICAgICAgICAgICAgaiAhPSBtUGVuZGluZ1JlcHJvY2Vzc1Jlc3VsdExpc3QuZW5kKCk7IGorKykgeworICAgICAgICBpZiAoai0+ZnJhbWVfbnVtYmVyID09IGZyYW1lX251bWJlcikgeworICAgICAgICAgICAgbUNhbGxiYWNrT3BzLT5ub3RpZnkobUNhbGxiYWNrT3BzLCAmai0+bm90aWZ5X21zZyk7CisKKyAgICAgICAgICAgIExPR0QoIkRlbGF5ZWQgcmVwcm9jZXNzIG5vdGlmeSAlZCIsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lX251bWJlcik7CisKKyAgICAgICAgICAgIGZvciAocGVuZGluZ1JlcXVlc3RJdGVyYXRvciBrID0gbVBlbmRpbmdSZXF1ZXN0c0xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgayAhPSBtUGVuZGluZ1JlcXVlc3RzTGlzdC5lbmQoKTsgaysrKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoay0+ZnJhbWVfbnVtYmVyID09IGotPmZyYW1lX251bWJlcikgeworICAgICAgICAgICAgICAgICAgICBMT0dEKCJGb3VuZCByZXByb2Nlc3MgZnJhbWUgbnVtYmVyICVkIGluIHBlbmRpbmcgcmVwcm9jZXNzIExpc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUYWtlIGl0IG91dCEhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLT5mcmFtZV9udW1iZXIpOworCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfY2FwdHVyZV9yZXN1bHQgcmVzdWx0OworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKGNhbWVyYTNfY2FwdHVyZV9yZXN1bHQpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZyYW1lX251bWJlciA9IGZyYW1lX251bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lm51bV9vdXRwdXRfYnVmZmVycyA9IDE7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5vdXRwdXRfYnVmZmVycyA9ICAmai0+YnVmZmVyOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuaW5wdXRfYnVmZmVyID0gay0+aW5wdXRfYnVmZmVyOworICAgICAgICAgICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gay0+c2V0dGluZ3M7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJ0aWFsX3Jlc3VsdCA9IFBBUlRJQUxfUkVTVUxUX0NPVU5UOworICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tPcHMtPnByb2Nlc3NfY2FwdHVyZV9yZXN1bHQobUNhbGxiYWNrT3BzLCAmcmVzdWx0KTsKKworICAgICAgICAgICAgICAgICAgICBlcmFzZVBlbmRpbmdSZXF1ZXN0KGspOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVuZGluZ1JlcHJvY2Vzc1Jlc3VsdExpc3QuZXJhc2Uoaik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaGFuZGxlQmF0Y2hNZXRhZGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBIYW5kbGVzIG1ldGFkYXRhIGJ1ZmZlciBjYWxsYmFjayBpbiBiYXRjaCBtb2RlCisgKgorICogUEFSQU1FVEVSUyA6IEBtZXRhZGF0YV9idWY6IG1ldGFkYXRhIGJ1ZmZlcgorICogICAgICAgICAgICAgIEBmcmVlX2FuZF9idWZkb25lX21ldGFfYnVmOiBCdWYgZG9uZSBvbiB0aGUgbWV0YSBidWYgYW5kIGZyZWUKKyAqICAgICAgICAgICAgICAgICB0aGUgbWV0YSBidWYgaW4gdGhpcyBtZXRob2QKKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6aGFuZGxlQmF0Y2hNZXRhZGF0YSgKKyAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICptZXRhZGF0YV9idWYsIGJvb2wgZnJlZV9hbmRfYnVmZG9uZV9tZXRhX2J1ZikKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgaWYgKE5VTEwgPT0gbWV0YWRhdGFfYnVmKSB7CisgICAgICAgIExPR0UoIm1ldGFkYXRhX2J1ZiBpcyBOVUxMIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogSW4gYmF0Y2ggbW9kZSwgdGhlIG1ldGRhdGEgd2lsbCBjb250YWluIHRoZSBmcmFtZSBudW1iZXIgYW5kIHRpbWVzdGFtcCBvZgorICAgICAqIHRoZSBsYXN0IGZyYW1lIGluIHRoZSBiYXRjaC4gRWc6IGEgYmF0Y2ggY29udGFpbmluZyBidWZmZXJzIGZyb20gcmVxdWVzdAorICAgICAqIDUsNiw3IGFuZCA4IHdpbGwgaGF2ZSBmcmFtZSBudW1iZXIgYW5kIHRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIDguCisgICAgICogbXVsdGlwbGUgcHJvY2Vzc19jYXB0dXJlX3JlcXVlc3RzID0+IDEgc2V0X3BhcmFtID0+IDEgaGFuZGxlQmF0Y2hNZXRhdGEgPT4KKyAgICAgKiBtdWx0aXBsZSBwcm9jZXNzX2NhcHR1cmVfcmVzdWx0cyAqLworICAgIG1ldGFkYXRhX2J1ZmZlcl90ICptZXRhZGF0YSA9CisgICAgICAgICAgICAobWV0YWRhdGFfYnVmZmVyX3QgKiltZXRhZGF0YV9idWYtPmJ1ZnNbMF0tPmJ1ZmZlcjsKKyAgICBpbnQzMl90IGZyYW1lX251bWJlcl92YWxpZCA9IDAsIHVyZ2VudF9mcmFtZV9udW1iZXJfdmFsaWQgPSAwOworICAgIHVpbnQzMl90IGxhc3RfZnJhbWVfbnVtYmVyID0gMCwgbGFzdF91cmdlbnRfZnJhbWVfbnVtYmVyID0gMDsKKyAgICB1aW50MzJfdCBmaXJzdF9mcmFtZV9udW1iZXIgPSAwLCBmaXJzdF91cmdlbnRfZnJhbWVfbnVtYmVyID0gMDsKKyAgICB1aW50MzJfdCBmcmFtZV9udW1iZXIgPSAwLCB1cmdlbnRfZnJhbWVfbnVtYmVyID0gMDsKKyAgICBpbnQ2NF90IGxhc3RfZnJhbWVfY2FwdHVyZV90aW1lID0gMCwgZmlyc3RfZnJhbWVfY2FwdHVyZV90aW1lLCBjYXB0dXJlX3RpbWU7CisgICAgYm9vbCBpbnZhbGlkX21ldGFkYXRhID0gZmFsc2U7CisgICAgc2l6ZV90IHVyZ2VudEZyYW1lTnVtRGlmZiA9IDAsIGZyYW1lTnVtRGlmZiA9IDA7CisgICAgc2l6ZV90IGxvb3BDb3VudCA9IDE7CisKKyAgICBpbnQzMl90ICpwX2ZyYW1lX251bWJlcl92YWxpZCA9CisgICAgICAgICAgICBQT0lOVEVSX09GX01FVEEoQ0FNX0lOVEZfTUVUQV9GUkFNRV9OVU1CRVJfVkFMSUQsIG1ldGFkYXRhKTsKKyAgICB1aW50MzJfdCAqcF9mcmFtZV9udW1iZXIgPQorICAgICAgICAgICAgUE9JTlRFUl9PRl9NRVRBKENBTV9JTlRGX01FVEFfRlJBTUVfTlVNQkVSLCBtZXRhZGF0YSk7CisgICAgaW50NjRfdCAqcF9jYXB0dXJlX3RpbWUgPQorICAgICAgICAgICAgUE9JTlRFUl9PRl9NRVRBKENBTV9JTlRGX01FVEFfU0VOU09SX1RJTUVTVEFNUCwgbWV0YWRhdGEpOworICAgIGludDMyX3QgKnBfdXJnZW50X2ZyYW1lX251bWJlcl92YWxpZCA9CisgICAgICAgICAgICBQT0lOVEVSX09GX01FVEEoQ0FNX0lOVEZfTUVUQV9VUkdFTlRfRlJBTUVfTlVNQkVSX1ZBTElELCBtZXRhZGF0YSk7CisgICAgdWludDMyX3QgKnBfdXJnZW50X2ZyYW1lX251bWJlciA9CisgICAgICAgICAgICBQT0lOVEVSX09GX01FVEEoQ0FNX0lOVEZfTUVUQV9VUkdFTlRfRlJBTUVfTlVNQkVSLCBtZXRhZGF0YSk7CisKKyAgICBpZiAoKE5VTEwgPT0gcF9mcmFtZV9udW1iZXJfdmFsaWQpIHx8IChOVUxMID09IHBfZnJhbWVfbnVtYmVyKSB8fAorICAgICAgICAgICAgKE5VTEwgPT0gcF9jYXB0dXJlX3RpbWUpIHx8IChOVUxMID09IHBfdXJnZW50X2ZyYW1lX251bWJlcl92YWxpZCkgfHwKKyAgICAgICAgICAgIChOVUxMID09IHBfdXJnZW50X2ZyYW1lX251bWJlcikpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBtZXRhZGF0YSIpOworICAgICAgICBpbnZhbGlkX21ldGFkYXRhID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBmcmFtZV9udW1iZXJfdmFsaWQgPSAqcF9mcmFtZV9udW1iZXJfdmFsaWQ7CisgICAgICAgIGxhc3RfZnJhbWVfbnVtYmVyID0gKnBfZnJhbWVfbnVtYmVyOworICAgICAgICBsYXN0X2ZyYW1lX2NhcHR1cmVfdGltZSA9ICpwX2NhcHR1cmVfdGltZTsKKyAgICAgICAgdXJnZW50X2ZyYW1lX251bWJlcl92YWxpZCA9ICpwX3VyZ2VudF9mcmFtZV9udW1iZXJfdmFsaWQ7CisgICAgICAgIGxhc3RfdXJnZW50X2ZyYW1lX251bWJlciA9ICpwX3VyZ2VudF9mcmFtZV9udW1iZXI7CisgICAgfQorCisgICAgLyogSW4gYmF0Y2htb2RlLCB3aGVuIG5vIHZpZGVvIGJ1ZmZlcnMgYXJlIHJlcXVlc3RlZCwgc2V0X3Bhcm1zIGFyZSBzZW50CisgICAgICogZm9yIGV2ZXJ5IGNhcHR1cmVfcmVxdWVzdC4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjb25zZWN1dGl2ZSB1cmdlbnQKKyAgICAgKiBmcmFtZSBudW1iZXJzIGFuZCBmcmFtZSBudW1iZXJzIHNob3VsZCBiZSB1c2VkIHRvIGludGVycG9sYXRlIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgZnJhbWUgbnVtYmVycyBhbmQgdGltZSBzdGFtcHMgKi8KKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgaWYgKHVyZ2VudF9mcmFtZV9udW1iZXJfdmFsaWQpIHsKKyAgICAgICAgZmlyc3RfdXJnZW50X2ZyYW1lX251bWJlciA9CisgICAgICAgICAgICAgICAgbVBlbmRpbmdCYXRjaE1hcC52YWx1ZUZvcihsYXN0X3VyZ2VudF9mcmFtZV9udW1iZXIpOworICAgICAgICB1cmdlbnRGcmFtZU51bURpZmYgPSBsYXN0X3VyZ2VudF9mcmFtZV9udW1iZXIgKyAxIC0KKyAgICAgICAgICAgICAgICBmaXJzdF91cmdlbnRfZnJhbWVfbnVtYmVyOworCisgICAgICAgIExPR0QoInVyZ2VudF9mcm06IHZhbGlkOiAlZCBmcm1fbnVtOiAlZCAtICVkIiwKKyAgICAgICAgICAgICAgICAgdXJnZW50X2ZyYW1lX251bWJlcl92YWxpZCwKKyAgICAgICAgICAgICAgICBmaXJzdF91cmdlbnRfZnJhbWVfbnVtYmVyLCBsYXN0X3VyZ2VudF9mcmFtZV9udW1iZXIpOworICAgIH0KKworICAgIGlmIChmcmFtZV9udW1iZXJfdmFsaWQpIHsKKyAgICAgICAgZmlyc3RfZnJhbWVfbnVtYmVyID0gbVBlbmRpbmdCYXRjaE1hcC52YWx1ZUZvcihsYXN0X2ZyYW1lX251bWJlcik7CisgICAgICAgIGZyYW1lTnVtRGlmZiA9IGxhc3RfZnJhbWVfbnVtYmVyICsgMSAtCisgICAgICAgICAgICAgICAgZmlyc3RfZnJhbWVfbnVtYmVyOworICAgICAgICBtUGVuZGluZ0JhdGNoTWFwLnJlbW92ZUl0ZW0obGFzdF9mcmFtZV9udW1iZXIpOworCisgICAgICAgIExPR0QoImZybTogdmFsaWQ6ICVkIGZybV9udW06ICVkIC0gJWQiLAorICAgICAgICAgICAgICAgICBmcmFtZV9udW1iZXJfdmFsaWQsCisgICAgICAgICAgICAgICAgZmlyc3RfZnJhbWVfbnVtYmVyLCBsYXN0X2ZyYW1lX251bWJlcik7CisKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisKKyAgICBpZiAodXJnZW50X2ZyYW1lX251bWJlcl92YWxpZCB8fCBmcmFtZV9udW1iZXJfdmFsaWQpIHsKKyAgICAgICAgbG9vcENvdW50ID0gTUFYKHVyZ2VudEZyYW1lTnVtRGlmZiwgZnJhbWVOdW1EaWZmKTsKKyAgICAgICAgaWYgKHVyZ2VudEZyYW1lTnVtRGlmZiA+IE1BWF9IRlJfQkFUQ0hfU0laRSkKKyAgICAgICAgICAgIExPR0UoInVyZ2VudEZyYW1lTnVtRGlmZjogJWQgdXJnZW50RnJhbWVOdW06ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHVyZ2VudEZyYW1lTnVtRGlmZiwgbGFzdF91cmdlbnRfZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgaWYgKGZyYW1lTnVtRGlmZiA+IE1BWF9IRlJfQkFUQ0hfU0laRSkKKyAgICAgICAgICAgIExPR0UoImZyYW1lTnVtRGlmZjogJWQgZnJhbWVOdW06ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtRGlmZiwgbGFzdF9mcmFtZV9udW1iZXIpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbG9vcENvdW50OyBpKyspIHsKKyAgICAgICAgLyogaGFuZGxlTWV0YWRhdGFXaXRoTG9jayBpcyBjYWxsZWQgZXZlbiBmb3IgaW52YWxpZF9tZXRhZGF0YSBmb3IKKyAgICAgICAgICogcGlwZWxpbmUgZGVwdGggY2FsY3VsYXRpb24gKi8KKyAgICAgICAgaWYgKCFpbnZhbGlkX21ldGFkYXRhKSB7CisgICAgICAgICAgICAvKiBJbmZlciBmcmFtZSBudW1iZXIuIEJhdGNoIG1ldGFkYXRhIGNvbnRhaW5zIGZyYW1lIG51bWJlciBvZiB0aGUKKyAgICAgICAgICAgICAqIGxhc3QgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmICh1cmdlbnRfZnJhbWVfbnVtYmVyX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPCB1cmdlbnRGcmFtZU51bURpZmYpIHsKKyAgICAgICAgICAgICAgICAgICAgdXJnZW50X2ZyYW1lX251bWJlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdXJnZW50X2ZyYW1lX251bWJlciArIGk7CisgICAgICAgICAgICAgICAgICAgIExPR0QoImluZmVycmVkIHVyZ2VudCBmcmFtZV9udW1iZXI6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJnZW50X2ZyYW1lX251bWJlcik7CisgICAgICAgICAgICAgICAgICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9VUkdFTlRfRlJBTUVfTlVNQkVSLCB1cmdlbnRfZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRvIGhhbmRsZSB3aGVuIHVyZ2VudEZyYW1lTnVtRGlmZiA8IGZyYW1lTnVtRGlmZiAqLworICAgICAgICAgICAgICAgICAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfVVJHRU5UX0ZSQU1FX05VTUJFUl9WQUxJRCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJbmZlciBmcmFtZSBudW1iZXIuIEJhdGNoIG1ldGFkYXRhIGNvbnRhaW5zIGZyYW1lIG51bWJlciBvZiB0aGUKKyAgICAgICAgICAgICAqIGxhc3QgZnJhbWUgKi8KKyAgICAgICAgICAgIGlmIChmcmFtZV9udW1iZXJfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA8IGZyYW1lTnVtRGlmZikgeworICAgICAgICAgICAgICAgICAgICBmcmFtZV9udW1iZXIgPSBmaXJzdF9mcmFtZV9udW1iZXIgKyBpOworICAgICAgICAgICAgICAgICAgICBMT0dEKCJpbmZlcnJlZCBmcmFtZV9udW1iZXI6ICVkIiwgZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0ZSQU1FX05VTUJFUiwgZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIHRvIGhhbmRsZSB3aGVuIHVyZ2VudEZyYW1lTnVtRGlmZiA+IGZyYW1lTnVtRGlmZiAqLworICAgICAgICAgICAgICAgICAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0ZSQU1FX05VTUJFUl9WQUxJRCwgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGFzdF9mcmFtZV9jYXB0dXJlX3RpbWUpIHsKKyAgICAgICAgICAgICAgICAvL0luZmVyIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIGZpcnN0X2ZyYW1lX2NhcHR1cmVfdGltZSA9IGxhc3RfZnJhbWVfY2FwdHVyZV90aW1lIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoKGxvb3BDb3VudCAtIDEpICogTlNFQ19QRVJfU0VDKSAvIChkb3VibGUpIG1IRlJWaWRlb0Zwcyk7CisgICAgICAgICAgICAgICAgY2FwdHVyZV90aW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2ZyYW1lX2NhcHR1cmVfdGltZSArIChpICogTlNFQ19QRVJfU0VDIC8gKGRvdWJsZSkgbUhGUlZpZGVvRnBzKTsKKyAgICAgICAgICAgICAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9TRU5TT1JfVElNRVNUQU1QLCBjYXB0dXJlX3RpbWUpOworICAgICAgICAgICAgICAgIExPR0QoImJhdGNoIGNhcHR1cmVfdGltZTogJWxsZCwgY2FwdHVyZV90aW1lOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2ZyYW1lX2NhcHR1cmVfdGltZSwgY2FwdHVyZV90aW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgICAgIGhhbmRsZU1ldGFkYXRhV2l0aExvY2sobWV0YWRhdGFfYnVmLAorICAgICAgICAgICAgICAgIGZhbHNlIC8qIGZyZWVfYW5kX2J1ZmRvbmVfbWV0YV9idWYgKi8sCisgICAgICAgICAgICAgICAgKGkgPT0gMCkgLyogZmlyc3QgbWV0YWRhdGEgaW4gdGhlIGJhdGNoIG1ldGFkYXRhICovKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgfQorCisgICAgLyogQnVmRG9uZSBtZXRhZGF0YSBidWZmZXIgKi8KKyAgICBpZiAoZnJlZV9hbmRfYnVmZG9uZV9tZXRhX2J1ZikgeworICAgICAgICBtTWV0YWRhdGFDaGFubmVsLT5idWZEb25lKG1ldGFkYXRhX2J1Zik7CisgICAgICAgIGZyZWUobWV0YWRhdGFfYnVmKTsKKyAgICB9Cit9CisKK3ZvaWQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6bm90aWZ5RXJyb3IodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGNhbWVyYTNfZXJyb3JfbXNnX2NvZGVfdCBlcnJvckNvZGUpCit7CisgICAgY2FtZXJhM19ub3RpZnlfbXNnX3Qgbm90aWZ5X21zZzsKKyAgICBtZW1zZXQoJm5vdGlmeV9tc2csIDAsIHNpemVvZihjYW1lcmEzX25vdGlmeV9tc2dfdCkpOworICAgIG5vdGlmeV9tc2cudHlwZSA9IENBTUVSQTNfTVNHX0VSUk9SOworICAgIG5vdGlmeV9tc2cubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gZXJyb3JDb2RlOworICAgIG5vdGlmeV9tc2cubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBOVUxMOworICAgIG5vdGlmeV9tc2cubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICBtQ2FsbGJhY2tPcHMtPm5vdGlmeShtQ2FsbGJhY2tPcHMsICZub3RpZnlfbXNnKTsKKworICAgIHJldHVybjsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaGFuZGxlTWV0YWRhdGFXaXRoTG9jaworICoKKyAqIERFU0NSSVBUSU9OOiBIYW5kbGVzIG1ldGFkYXRhIGJ1ZmZlciBjYWxsYmFjayB3aXRoIG1NdXRleCBsb2NrIGhlbGQuCisgKgorICogUEFSQU1FVEVSUyA6IEBtZXRhZGF0YV9idWY6IG1ldGFkYXRhIGJ1ZmZlcgorICogICAgICAgICAgICAgIEBmcmVlX2FuZF9idWZkb25lX21ldGFfYnVmOiBCdWYgZG9uZSBvbiB0aGUgbWV0YSBidWYgYW5kIGZyZWUKKyAqICAgICAgICAgICAgICAgICB0aGUgbWV0YSBidWYgaW4gdGhpcyBtZXRob2QKKyAqICAgICAgICAgICAgICBAZmlyc3RNZXRhZGF0YUluQmF0Y2g6IEJvb2xlYW4gdG8gaW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIHRoZQorICogICAgICAgICAgICAgICAgICBmaXJzdCBtZXRhZGF0YSBpbiBhIGJhdGNoLiBWYWxpZCBvbmx5IGZvciBiYXRjaCBtb2RlCisgKgorICogUkVUVVJOICAgICA6CisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmhhbmRsZU1ldGFkYXRhV2l0aExvY2soCisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICptZXRhZGF0YV9idWYsIGJvb2wgZnJlZV9hbmRfYnVmZG9uZV9tZXRhX2J1ZiwKKyAgICBib29sIGZpcnN0TWV0YWRhdGFJbkJhdGNoKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKChtRmx1c2hQZXJmKSB8fCAoRVJST1IgPT0gbVN0YXRlKSB8fCAoREVJTklUID09IG1TdGF0ZSkpIHsKKyAgICAgICAgLy9kdXJpbmcgZmx1c2ggZG8gbm90IHNlbmQgbWV0YWRhdGEgZnJvbSB0aGlzIHRocmVhZAorICAgICAgICBMT0dEKCJub3Qgc2VuZGluZyBtZXRhZGF0YSBkdXJpbmcgZmx1c2ggb3Igd2hlbiBtU3RhdGUgaXMgZXJyb3IiKTsKKyAgICAgICAgaWYgKGZyZWVfYW5kX2J1ZmRvbmVfbWV0YV9idWYpIHsKKyAgICAgICAgICAgIG1NZXRhZGF0YUNoYW5uZWwtPmJ1ZkRvbmUobWV0YWRhdGFfYnVmKTsKKyAgICAgICAgICAgIGZyZWUobWV0YWRhdGFfYnVmKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy9ub3QgaW4gZmx1c2gKKyAgICBtZXRhZGF0YV9idWZmZXJfdCAqbWV0YWRhdGEgPSAobWV0YWRhdGFfYnVmZmVyX3QgKiltZXRhZGF0YV9idWYtPmJ1ZnNbMF0tPmJ1ZmZlcjsKKyAgICBpbnQzMl90IGZyYW1lX251bWJlcl92YWxpZCwgdXJnZW50X2ZyYW1lX251bWJlcl92YWxpZDsKKyAgICB1aW50MzJfdCBmcmFtZV9udW1iZXIsIHVyZ2VudF9mcmFtZV9udW1iZXI7CisgICAgaW50NjRfdCBjYXB0dXJlX3RpbWU7CisgICAgbnNlY3NfdCBjdXJyZW50U3lzVGltZTsKKworICAgIGludDMyX3QgKnBfZnJhbWVfbnVtYmVyX3ZhbGlkID0KKyAgICAgICAgICAgIFBPSU5URVJfT0ZfTUVUQShDQU1fSU5URl9NRVRBX0ZSQU1FX05VTUJFUl9WQUxJRCwgbWV0YWRhdGEpOworICAgIHVpbnQzMl90ICpwX2ZyYW1lX251bWJlciA9IFBPSU5URVJfT0ZfTUVUQShDQU1fSU5URl9NRVRBX0ZSQU1FX05VTUJFUiwgbWV0YWRhdGEpOworICAgIGludDY0X3QgKnBfY2FwdHVyZV90aW1lID0gUE9JTlRFUl9PRl9NRVRBKENBTV9JTlRGX01FVEFfU0VOU09SX1RJTUVTVEFNUCwgbWV0YWRhdGEpOworICAgIGludDMyX3QgKnBfdXJnZW50X2ZyYW1lX251bWJlcl92YWxpZCA9CisgICAgICAgICAgICBQT0lOVEVSX09GX01FVEEoQ0FNX0lOVEZfTUVUQV9VUkdFTlRfRlJBTUVfTlVNQkVSX1ZBTElELCBtZXRhZGF0YSk7CisgICAgdWludDMyX3QgKnBfdXJnZW50X2ZyYW1lX251bWJlciA9CisgICAgICAgICAgICBQT0lOVEVSX09GX01FVEEoQ0FNX0lOVEZfTUVUQV9VUkdFTlRfRlJBTUVfTlVNQkVSLCBtZXRhZGF0YSk7CisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3N0cmVhbV9JRF90LCBwX2NhbV9mcmFtZV9kcm9wLCBDQU1fSU5URl9NRVRBX0ZSQU1FX0RST1BQRUQsCisgICAgICAgICAgICBtZXRhZGF0YSkgeworICAgICAgICBMT0dEKCJEcm9wcGVkIGZyYW1lIGluZm8gZm9yIGZyYW1lX251bWJlcl92YWxpZCAlZCwgZnJhbWVfbnVtYmVyICVkIiwKKyAgICAgICAgICAgICAgICAgKnBfZnJhbWVfbnVtYmVyX3ZhbGlkLCAqcF9mcmFtZV9udW1iZXIpOworICAgIH0KKworICAgIGlmICgoTlVMTCA9PSBwX2ZyYW1lX251bWJlcl92YWxpZCkgfHwgKE5VTEwgPT0gcF9mcmFtZV9udW1iZXIpIHx8IChOVUxMID09IHBfY2FwdHVyZV90aW1lKSB8fAorICAgICAgICAgICAgKE5VTEwgPT0gcF91cmdlbnRfZnJhbWVfbnVtYmVyX3ZhbGlkKSB8fCAoTlVMTCA9PSBwX3VyZ2VudF9mcmFtZV9udW1iZXIpKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgbWV0YWRhdGEiKTsKKyAgICAgICAgaWYgKGZyZWVfYW5kX2J1ZmRvbmVfbWV0YV9idWYpIHsKKyAgICAgICAgICAgIG1NZXRhZGF0YUNoYW5uZWwtPmJ1ZkRvbmUobWV0YWRhdGFfYnVmKTsKKyAgICAgICAgICAgIGZyZWUobWV0YWRhdGFfYnVmKTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGRvbmVfbWV0YWRhdGE7CisgICAgfQorICAgIGZyYW1lX251bWJlcl92YWxpZCA9ICAgICAgICAqcF9mcmFtZV9udW1iZXJfdmFsaWQ7CisgICAgZnJhbWVfbnVtYmVyID0gICAgICAgICAgICAgICpwX2ZyYW1lX251bWJlcjsKKyAgICBjYXB0dXJlX3RpbWUgPSAgICAgICAgICAgICAgKnBfY2FwdHVyZV90aW1lOworICAgIHVyZ2VudF9mcmFtZV9udW1iZXJfdmFsaWQgPSAqcF91cmdlbnRfZnJhbWVfbnVtYmVyX3ZhbGlkOworICAgIHVyZ2VudF9mcmFtZV9udW1iZXIgPSAgICAgICAqcF91cmdlbnRfZnJhbWVfbnVtYmVyOworICAgIGN1cnJlbnRTeXNUaW1lID0gICAgICAgICAgICBzeXN0ZW1UaW1lKENMT0NLX01PTk9UT05JQyk7CisKKyAgICAvLyBEZXRlY3QgaWYgYnVmZmVycyBmcm9tIGFueSByZXF1ZXN0cyBhcmUgb3ZlcmR1ZQorICAgIGZvciAoYXV0byAmcmVxIDogbVBlbmRpbmdCdWZmZXJzTWFwLm1QZW5kaW5nQnVmZmVyc0luUmVxdWVzdCkgeworICAgICAgICBpZiAoIChjdXJyZW50U3lzVGltZSAtIHJlcS50aW1lc3RhbXApID4KKyAgICAgICAgICAgIHMybnMoTUlTU0lOR19SRVFVRVNUX0JVRl9USU1FT1VUKSApIHsKKyAgICAgICAgICAgIGZvciAoYXV0byAmbWlzc2VkIDogcmVxLm1QZW5kaW5nQnVmZmVyTGlzdCkgeworICAgICAgICAgICAgICAgIExPR0UoIkN1cnJlbnQgZnJhbWU6ICVkLiBNaXNzaW5nOiBmcmFtZSA9ICVkLCBidWZmZXIgPSAlcCwiCisgICAgICAgICAgICAgICAgICAgICJzdHJlYW0gdHlwZSA9ICVkLCBzdHJlYW0gZm9ybWF0ID0gJWQiLAorICAgICAgICAgICAgICAgICAgICBmcmFtZV9udW1iZXIsIHJlcS5mcmFtZV9udW1iZXIsIG1pc3NlZC5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgIG1pc3NlZC5zdHJlYW0tPnN0cmVhbV90eXBlLCBtaXNzZWQuc3RyZWFtLT5mb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vUGFydGlhbCByZXN1bHQgb24gcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdCBmb3IgdGltZXN0YW1wCisgICAgaWYgKHVyZ2VudF9mcmFtZV9udW1iZXJfdmFsaWQpIHsKKyAgICAgICAgTE9HRCgidmFsaWQgdXJnZW50IGZyYW1lX251bWJlciA9ICV1LCBjYXB0dXJlX3RpbWUgPSAlbGxkIiwKKyAgICAgICAgICAgdXJnZW50X2ZyYW1lX251bWJlciwgY2FwdHVyZV90aW1lKTsKKworICAgICAgICAvL1JlY2lldmVkIGFuIHVyZ2VudCBGcmFtZSBOdW1iZXIsIGhhbmRsZSBpdAorICAgICAgICAvL3VzaW5nIHBhcnRpYWwgcmVzdWx0cworICAgICAgICBmb3IgKHBlbmRpbmdSZXF1ZXN0SXRlcmF0b3IgaSA9CisgICAgICAgICAgICAgICAgbVBlbmRpbmdSZXF1ZXN0c0xpc3QuYmVnaW4oKTsgaSAhPSBtUGVuZGluZ1JlcXVlc3RzTGlzdC5lbmQoKTsgaSsrKSB7CisgICAgICAgICAgICBMT0dEKCJJdGVyYXRvciBGcmFtZSA9ICVkIHVyZ2VudCBmcmFtZSA9ICVkIiwKKyAgICAgICAgICAgICAgICAgaS0+ZnJhbWVfbnVtYmVyLCB1cmdlbnRfZnJhbWVfbnVtYmVyKTsKKworICAgICAgICAgICAgaWYgKCghaS0+aW5wdXRfYnVmZmVyKSAmJiAoaS0+ZnJhbWVfbnVtYmVyIDwgdXJnZW50X2ZyYW1lX251bWJlcikgJiYKKyAgICAgICAgICAgICAgICAoaS0+cGFydGlhbF9yZXN1bHRfY250ID09IDApKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3I6IEhBTCBtaXNzZWQgdXJnZW50IG1ldGFkYXRhIGZvciBmcmFtZSBudW1iZXIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGktPmZyYW1lX251bWJlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpLT5mcmFtZV9udW1iZXIgPT0gdXJnZW50X2ZyYW1lX251bWJlciAmJgorICAgICAgICAgICAgICAgICAgICAgaS0+YlVyZ2VudFJlY2VpdmVkID09IDApIHsKKworICAgICAgICAgICAgICAgIGNhbWVyYTNfY2FwdHVyZV9yZXN1bHRfdCByZXN1bHQ7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZihjYW1lcmEzX2NhcHR1cmVfcmVzdWx0X3QpKTsKKworICAgICAgICAgICAgICAgIGktPnBhcnRpYWxfcmVzdWx0X2NudCsrOworICAgICAgICAgICAgICAgIGktPmJVcmdlbnRSZWNlaXZlZCA9IDE7CisgICAgICAgICAgICAgICAgLy8gRXh0cmFjdCAzQSBtZXRhZGF0YQorICAgICAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVDYlVyZ2VudE1ldGFkYXRhVG9SZXN1bHRNZXRhZGF0YShtZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgLy8gUG9wdWxhdGUgbWV0YWRhdGEgcmVzdWx0CisgICAgICAgICAgICAgICAgcmVzdWx0LmZyYW1lX251bWJlciA9IHVyZ2VudF9mcmFtZV9udW1iZXI7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm51bV9vdXRwdXRfYnVmZmVycyA9IDA7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm91dHB1dF9idWZmZXJzID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXN1bHQucGFydGlhbF9yZXN1bHQgPSBpLT5wYXJ0aWFsX3Jlc3VsdF9jbnQ7CisKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tPcHMtPnByb2Nlc3NfY2FwdHVyZV9yZXN1bHQobUNhbGxiYWNrT3BzLCAmcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBMT0dEKCJ1cmdlbnQgZnJhbWVfbnVtYmVyID0gJXUsIGNhcHR1cmVfdGltZSA9ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5mcmFtZV9udW1iZXIsIGNhcHR1cmVfdGltZSk7CisgICAgICAgICAgICAgICAgZnJlZV9jYW1lcmFfbWV0YWRhdGEoKGNhbWVyYV9tZXRhZGF0YV90ICopcmVzdWx0LnJlc3VsdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZyYW1lX251bWJlcl92YWxpZCkgeworICAgICAgICBMT0dEKCJOb3QgYSB2YWxpZCBub3JtYWwgZnJhbWUgbnVtYmVyLCB1c2VkIGFzIFNPRiBvbmx5Iik7CisgICAgICAgIGlmIChmcmVlX2FuZF9idWZkb25lX21ldGFfYnVmKSB7CisgICAgICAgICAgICBtTWV0YWRhdGFDaGFubmVsLT5idWZEb25lKG1ldGFkYXRhX2J1Zik7CisgICAgICAgICAgICBmcmVlKG1ldGFkYXRhX2J1Zik7CisgICAgICAgIH0KKyAgICAgICAgZ290byBkb25lX21ldGFkYXRhOworICAgIH0KKyAgICBMT0dIKCJ2YWxpZCBmcmFtZV9udW1iZXIgPSAldSwgY2FwdHVyZV90aW1lID0gJWxsZCIsCisgICAgICAgICAgICBmcmFtZV9udW1iZXIsIGNhcHR1cmVfdGltZSk7CisKKyAgICBmb3IgKHBlbmRpbmdSZXF1ZXN0SXRlcmF0b3IgaSA9IG1QZW5kaW5nUmVxdWVzdHNMaXN0LmJlZ2luKCk7CisgICAgICAgICAgICBpICE9IG1QZW5kaW5nUmVxdWVzdHNMaXN0LmVuZCgpICYmIGktPmZyYW1lX251bWJlciA8PSBmcmFtZV9udW1iZXI7KSB7CisgICAgICAgIC8vIEZsdXNoIG91dCBhbGwgZW50cmllcyB3aXRoIGxlc3Mgb3IgZXF1YWwgZnJhbWUgbnVtYmVycy4KKworICAgICAgICBjYW1lcmEzX2NhcHR1cmVfcmVzdWx0X3QgcmVzdWx0OworICAgICAgICBtZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKGNhbWVyYTNfY2FwdHVyZV9yZXN1bHRfdCkpOworCisgICAgICAgIExPR0QoImZyYW1lX251bWJlciBpbiB0aGUgbGlzdCBpcyAldSIsIGktPmZyYW1lX251bWJlcik7CisgICAgICAgIGktPnBhcnRpYWxfcmVzdWx0X2NudCsrOworICAgICAgICByZXN1bHQucGFydGlhbF9yZXN1bHQgPSBpLT5wYXJ0aWFsX3Jlc3VsdF9jbnQ7CisKKyAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhbnkgc3RyZWFtIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaXMgZHJvcHBlZCBvciBub3QKKyAgICAgICAgLy8gSWYgZHJvcHBlZCwgdGhlbiBzZW5kIHRoZSBFUlJPUl9CVUZGRVIgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHN0cmVhbQorICAgICAgICBpZiAocF9jYW1fZnJhbWVfZHJvcCkgeworICAgICAgICAgICAgLyogQ2xlYXIgbm90aWZ5X21zZyBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIGNhbWVyYTNfbm90aWZ5X21zZ190IG5vdGlmeV9tc2c7CisgICAgICAgICAgICBtZW1zZXQoJm5vdGlmeV9tc2csIDAsIHNpemVvZihjYW1lcmEzX25vdGlmeV9tc2dfdCkpOworICAgICAgICAgICAgZm9yIChMaXN0PFJlcXVlc3RlZEJ1ZmZlckluZm8+OjppdGVyYXRvciBqID0gaS0+YnVmZmVycy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICBqICE9IGktPmJ1ZmZlcnMuZW5kKCk7IGorKykgeworICAgICAgICAgICAgICAgIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwgKmNoYW5uZWwgPSAoUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCAqKWotPnN0cmVhbS0+cHJpdjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1JRCA9IGNoYW5uZWwtPmdldFN0cmVhbUlEKGNoYW5uZWwtPmdldFN0cmVhbVR5cGVNYXNrKCkpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgayA9IDA7IGsgPCBwX2NhbV9mcmFtZV9kcm9wLT5udW1fc3RyZWFtczsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1JRCA9PSBwX2NhbV9mcmFtZV9kcm9wLT5zdHJlYW1JRFtrXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBFcnJvciBub3RpZnkgdG8gZnJhbWV3b3JrcyB3aXRoIENBTUVSQTNfTVNHX0VSUk9SX0JVRkZFUgorICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiU3RhcnQgb2YgcmVwb3J0aW5nIGVycm9yIGZyYW1lIz0ldSwgc3RyZWFtSUQ9JXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0+ZnJhbWVfbnVtYmVyLCBzdHJlYW1JRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfbXNnLnR5cGUgPSBDQU1FUkEzX01TR19FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeV9tc2cubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIgPSBpLT5mcmFtZV9udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfbXNnLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQTNfTVNHX0VSUk9SX0JVRkZFUiA7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfbXNnLm1lc3NhZ2UuZXJyb3IuZXJyb3Jfc3RyZWFtID0gai0+c3RyZWFtOworICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrT3BzLT5ub3RpZnkobUNhbGxiYWNrT3BzLCAmbm90aWZ5X21zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJFbmQgb2YgcmVwb3J0aW5nIGVycm9yIGZyYW1lIz0ldSwgc3RyZWFtSUQ9JXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLT5mcmFtZV9udW1iZXIsIHN0cmVhbUlEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBlbmRpbmdGcmFtZURyb3BJbmZvIFBlbmRpbmdGcmFtZURyb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nRnJhbWVEcm9wLmZyYW1lX251bWJlcj1pLT5mcmFtZV9udW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBQZW5kaW5nRnJhbWVEcm9wLnN0cmVhbV9JRCA9IHN0cmVhbUlEOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBGcmFtZSBkcm9wIGluZm8gdG8gbVBlbmRpbmdGcmFtZURyb3BMaXN0CisgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0ZyYW1lRHJvcExpc3QucHVzaF9iYWNrKFBlbmRpbmdGcmFtZURyb3ApOworICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTZW5kIGVtcHR5IG1ldGFkYXRhIHdpdGggYWxyZWFkeSBmaWxsZWQgYnVmZmVycyBmb3IgZHJvcHBlZCBtZXRhZGF0YQorICAgICAgICAvLyBhbmQgc2VuZCB2YWxpZCBtZXRhZGF0YSB3aXRoIGFscmVhZHkgZmlsbGVkIGJ1ZmZlcnMgZm9yIGN1cnJlbnQgbWV0YWRhdGEKKyAgICAgICAgLyogd2UgY291bGQgaGl0IHRoaXMgY2FzZSB3aGVuIHdlIGVpdGhlcgorICAgICAgICAgKiAxLiBoYXZlIGEgcGVuZGluZyByZXByb2Nlc3MgcmVxdWVzdCBvcgorICAgICAgICAgKiAyLiBtaXNzIGEgbWV0YWRhdGEgYnVmZmVyIGNhbGxiYWNrICovCisgICAgICAgIGlmIChpLT5mcmFtZV9udW1iZXIgPCBmcmFtZV9udW1iZXIpIHsKKyAgICAgICAgICAgIGlmIChpLT5pbnB1dF9idWZmZXIpIHsKKyAgICAgICAgICAgICAgICAvKiB0aGlzIHdpbGwgYmUgaGFuZGxlZCBpbiBoYW5kbGVJbnB1dEJ1ZmZlcldpdGhMb2NrICovCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChtQmF0Y2hTaXplKSB7CisKKyAgICAgICAgICAgICAgICBtUGVuZGluZ0xpdmVSZXF1ZXN0LS07CisKKyAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBkdW1teU1ldGFkYXRhOworICAgICAgICAgICAgICAgIGR1bW15TWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwgJihpLT5yZXF1ZXN0X2lkKSwgMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LnJlc3VsdCA9IGR1bW15TWV0YWRhdGEucmVsZWFzZSgpOworCisgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoaS0+ZnJhbWVfbnVtYmVyLCBDQU1FUkEzX01TR19FUlJPUl9SRVNVTFQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJGYXRhbDogTWlzc2luZyBtZXRhZGF0YSBidWZmZXIgZm9yIGZyYW1lIG51bWJlciAlZCIsIGktPmZyYW1lX251bWJlcik7CisgICAgICAgICAgICAgICAgaWYgKGZyZWVfYW5kX2J1ZmRvbmVfbWV0YV9idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1ldGFkYXRhQ2hhbm5lbC0+YnVmRG9uZShtZXRhZGF0YV9idWYpOworICAgICAgICAgICAgICAgICAgICBmcmVlKG1ldGFkYXRhX2J1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEVSUk9SOworICAgICAgICAgICAgICAgIGdvdG8gZG9uZV9tZXRhZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QZW5kaW5nTGl2ZVJlcXVlc3QtLTsKKyAgICAgICAgICAgIC8qIENsZWFyIG5vdGlmeV9tc2cgc3RydWN0dXJlICovCisgICAgICAgICAgICBjYW1lcmEzX25vdGlmeV9tc2dfdCBub3RpZnlfbXNnOworICAgICAgICAgICAgbWVtc2V0KCZub3RpZnlfbXNnLCAwLCBzaXplb2YoY2FtZXJhM19ub3RpZnlfbXNnX3QpKTsKKworICAgICAgICAgICAgLy8gU2VuZCBzaHV0dGVyIG5vdGlmeSB0byBmcmFtZXdvcmtzCisgICAgICAgICAgICBub3RpZnlfbXNnLnR5cGUgPSBDQU1FUkEzX01TR19TSFVUVEVSOworICAgICAgICAgICAgbm90aWZ5X21zZy5tZXNzYWdlLnNodXR0ZXIuZnJhbWVfbnVtYmVyID0gaS0+ZnJhbWVfbnVtYmVyOworICAgICAgICAgICAgbm90aWZ5X21zZy5tZXNzYWdlLnNodXR0ZXIudGltZXN0YW1wID0gKHVpbnQ2NF90KWNhcHR1cmVfdGltZTsKKyAgICAgICAgICAgIG1DYWxsYmFja09wcy0+bm90aWZ5KG1DYWxsYmFja09wcywgJm5vdGlmeV9tc2cpOworCisgICAgICAgICAgICBpLT50aW1lc3RhbXAgPSBjYXB0dXJlX3RpbWU7CisKKyAgICAgICAgICAgIC8vIEZpbmQgY2hhbm5lbCByZXF1aXJpbmcgbWV0YWRhdGEsIG1lYW5pbmcgaW50ZXJuYWwgb2ZmbGluZSBwb3N0cHJvY2VzcworICAgICAgICAgICAgLy8gaXMgbmVlZGVkLgorICAgICAgICAgICAgLy9UT0RPOiBmb3Igbm93LCB3ZSBkb24ndCBzdXBwb3J0IHR3byBzdHJlYW1zIHJlcXVpcmluZyBtZXRhZGF0YSBhdCB0aGUgc2FtZSB0aW1lLgorICAgICAgICAgICAgLy8gKGJlY2F1c2Ugd2UgYXJlIG5vdCBtYWtpbmcgY29waWVzLCBhbmQgbWV0YWRhdGEgYnVmZmVyIGlzIG5vdCByZWZlcmVuY2UgY291bnRlZC4KKyAgICAgICAgICAgIGJvb2wgaW50ZXJuYWxQcHJvYyA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChwZW5kaW5nQnVmZmVySXRlcmF0b3IgaXRlciA9IGktPmJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlciAhPSBpLT5idWZmZXJzLmVuZCgpOyBpdGVyKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaXRlci0+bmVlZF9tZXRhZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbFBwcm9jID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCAqY2hhbm5lbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwgKilpdGVyLT5zdHJlYW0tPnByaXY7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwtPnF1ZXVlUmVwcm9jTWV0YWRhdGEobWV0YWRhdGFfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gdHJhbnNsYXRlRnJvbUhhbE1ldGFkYXRhKG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBpLT50aW1lc3RhbXAsIGktPnJlcXVlc3RfaWQsIGktPmpwZWdNZXRhZGF0YSwgaS0+cGlwZWxpbmVfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgIGktPmNhcHR1cmVfaW50ZW50LCBpbnRlcm5hbFBwcm9jLCBpLT5md2tDYWNNb2RlLAorICAgICAgICAgICAgICAgICAgICBmaXJzdE1ldGFkYXRhSW5CYXRjaCk7CisKKyAgICAgICAgICAgIHNhdmVFeGlmUGFyYW1zKG1ldGFkYXRhKTsKKworICAgICAgICAgICAgaWYgKGktPmJsb2JfcmVxdWVzdCkgeworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9EdW1wIHR1bmluZyBtZXRhZGF0YSBpZiBlbmFibGVkIGFuZCBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmR1bXBtZXRhZGF0YSIsIHByb3AsICIwIik7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZW5hYmxlZCA9IGF0b2kocHJvcCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGVkICYmIG1ldGFkYXRhLT5pc190dW5pbmdfcGFyYW1zX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkdW1wTWV0YWRhdGFUb0ZpbGUobWV0YWRhdGEtPnR1bmluZ19wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1ldGFGcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNuYXBzaG90IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9udW1iZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWludGVybmFsUHByb2MpIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJjb3VsZG4ndCBmaW5kIG5lZWRfbWV0YWRhdGEgZm9yIHRoaXMgbWV0YWRhdGEiKTsKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm4gbWV0YWRhdGEgYnVmZmVyCisgICAgICAgICAgICAgICAgaWYgKGZyZWVfYW5kX2J1ZmRvbmVfbWV0YV9idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1ldGFkYXRhQ2hhbm5lbC0+YnVmRG9uZShtZXRhZGF0YV9idWYpOworICAgICAgICAgICAgICAgICAgICBmcmVlKG1ldGFkYXRhX2J1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghcmVzdWx0LnJlc3VsdCkgeworICAgICAgICAgICAgTE9HRSgibWV0YWRhdGEgaXMgTlVMTCIpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5mcmFtZV9udW1iZXIgPSBpLT5mcmFtZV9udW1iZXI7CisgICAgICAgIHJlc3VsdC5pbnB1dF9idWZmZXIgPSBpLT5pbnB1dF9idWZmZXI7CisgICAgICAgIHJlc3VsdC5udW1fb3V0cHV0X2J1ZmZlcnMgPSAwOworICAgICAgICByZXN1bHQub3V0cHV0X2J1ZmZlcnMgPSBOVUxMOworICAgICAgICBmb3IgKExpc3Q8UmVxdWVzdGVkQnVmZmVySW5mbz46Oml0ZXJhdG9yIGogPSBpLT5idWZmZXJzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGogIT0gaS0+YnVmZmVycy5lbmQoKTsgaisrKSB7CisgICAgICAgICAgICBpZiAoai0+YnVmZmVyKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm51bV9vdXRwdXRfYnVmZmVycysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdXBkYXRlRnBzSW5QcmV2aWV3QnVmZmVyKG1ldGFkYXRhLCBpLT5mcmFtZV9udW1iZXIpOworCisgICAgICAgIGlmIChyZXN1bHQubnVtX291dHB1dF9idWZmZXJzID4gMCkgeworICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKnJlc3VsdF9idWZmZXJzID0KKyAgICAgICAgICAgICAgICBuZXcgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3RbcmVzdWx0Lm51bV9vdXRwdXRfYnVmZmVyc107CisgICAgICAgICAgICBpZiAocmVzdWx0X2J1ZmZlcnMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNpemVfdCByZXN1bHRfYnVmZmVyc19pZHggPSAwOworICAgICAgICAgICAgICAgIGZvciAoTGlzdDxSZXF1ZXN0ZWRCdWZmZXJJbmZvPjo6aXRlcmF0b3IgaiA9IGktPmJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGogIT0gaS0+YnVmZmVycy5lbmQoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChqLT5idWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTGlzdDxQZW5kaW5nRnJhbWVEcm9wSW5mbz46Oml0ZXJhdG9yIG0gPSBtUGVuZGluZ0ZyYW1lRHJvcExpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSAhPSBtUGVuZGluZ0ZyYW1lRHJvcExpc3QuZW5kKCk7IG0rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqY2hhbm5lbCA9IChRQ2FtZXJhM0NoYW5uZWwgKilqLT5idWZmZXItPnN0cmVhbS0+cHJpdjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1JRCA9IGNoYW5uZWwtPmdldFN0cmVhbUlEKGNoYW5uZWwtPmdldFN0cmVhbVR5cGVNYXNrKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKChtLT5zdHJlYW1fSUQgPT0gc3RyZWFtSUQpICYmIChtLT5mcmFtZV9udW1iZXI9PWZyYW1lX251bWJlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgai0+YnVmZmVyLT5zdGF0dXM9Q0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJTdHJlYW0gU1RBVFVTX0VSUk9SIGZyYW1lX251bWJlcj0ldSwgc3RyZWFtSUQ9JXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX251bWJlciwgc3RyZWFtSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtID0gbVBlbmRpbmdGcmFtZURyb3BMaXN0LmVyYXNlKG0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0J1ZmZlcnNNYXAucmVtb3ZlQnVmKGotPmJ1ZmZlci0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9idWZmZXJzW3Jlc3VsdF9idWZmZXJzX2lkeCsrXSA9ICooai0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoai0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGotPmJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0Lm91dHB1dF9idWZmZXJzID0gcmVzdWx0X2J1ZmZlcnM7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrT3BzLT5wcm9jZXNzX2NhcHR1cmVfcmVzdWx0KG1DYWxsYmFja09wcywgJnJlc3VsdCk7CisgICAgICAgICAgICAgICAgTE9HRCgibWV0YSBmcmFtZV9udW1iZXIgPSAldSwgY2FwdHVyZV90aW1lID0gJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZnJhbWVfbnVtYmVyLCBpLT50aW1lc3RhbXApOworICAgICAgICAgICAgICAgIGZyZWVfY2FtZXJhX21ldGFkYXRhKChjYW1lcmFfbWV0YWRhdGFfdCAqKXJlc3VsdC5yZXN1bHQpOworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIHJlc3VsdF9idWZmZXJzOworICAgICAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgIExPR0UoIkZhdGFsIGVycm9yOiBvdXQgb2YgbWVtb3J5Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ2FsbGJhY2tPcHMtPnByb2Nlc3NfY2FwdHVyZV9yZXN1bHQobUNhbGxiYWNrT3BzLCAmcmVzdWx0KTsKKyAgICAgICAgICAgIExPR0QoIm1ldGEgZnJhbWVfbnVtYmVyID0gJXUsIGNhcHR1cmVfdGltZSA9ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZnJhbWVfbnVtYmVyLCBpLT50aW1lc3RhbXApOworICAgICAgICAgICAgZnJlZV9jYW1lcmFfbWV0YWRhdGEoKGNhbWVyYV9tZXRhZGF0YV90ICopcmVzdWx0LnJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAgICBpID0gZXJhc2VQZW5kaW5nUmVxdWVzdChpKTsKKworICAgICAgICBpZiAoIW1QZW5kaW5nUmVwcm9jZXNzUmVzdWx0TGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICBoYW5kbGVQZW5kaW5nUmVwcm9jUmVzdWx0cyhmcmFtZV9udW1iZXIgKyAxKTsKKyAgICAgICAgfQorICAgIH0KKworZG9uZV9tZXRhZGF0YToKKyAgICBmb3IgKHBlbmRpbmdSZXF1ZXN0SXRlcmF0b3IgaSA9IG1QZW5kaW5nUmVxdWVzdHNMaXN0LmJlZ2luKCk7CisgICAgICAgICAgICBpICE9IG1QZW5kaW5nUmVxdWVzdHNMaXN0LmVuZCgpIDtpKyspIHsKKyAgICAgICAgaS0+cGlwZWxpbmVfZGVwdGgrKzsKKyAgICB9CisgICAgTE9HRCgibVBlbmRpbmdMaXZlUmVxdWVzdCA9ICVkIiwgbVBlbmRpbmdMaXZlUmVxdWVzdCk7CisgICAgdW5ibG9ja1JlcXVlc3RJZk5lY2Vzc2FyeSgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGhkclBsdXNQZXJmTG9jaworICoKKyAqIERFU0NSSVBUSU9OOiBwZXJmIGxvY2sgZm9yIEhEUisgdXNpbmcgY3VzdG9tIGludGVudAorICoKKyAqIFBBUkFNRVRFUlMgOiBAbWV0YWRhdGFfYnVmOiBNZXRhZGF0YSBzdXBlcl9idWYgcG9pbnRlcgorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmhkclBsdXNQZXJmTG9jaygKKyAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICptZXRhZGF0YV9idWYpCit7CisgICAgaWYgKE5VTEwgPT0gbWV0YWRhdGFfYnVmKSB7CisgICAgICAgIExPR0UoIm1ldGFkYXRhX2J1ZiBpcyBOVUxMIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhID0KKyAgICAgICAgICAgIChtZXRhZGF0YV9idWZmZXJfdCAqKW1ldGFkYXRhX2J1Zi0+YnVmc1swXS0+YnVmZmVyOworICAgIGludDMyX3QgKnBfZnJhbWVfbnVtYmVyX3ZhbGlkID0KKyAgICAgICAgICAgIFBPSU5URVJfT0ZfTUVUQShDQU1fSU5URl9NRVRBX0ZSQU1FX05VTUJFUl9WQUxJRCwgbWV0YWRhdGEpOworICAgIHVpbnQzMl90ICpwX2ZyYW1lX251bWJlciA9CisgICAgICAgICAgICBQT0lOVEVSX09GX01FVEEoQ0FNX0lOVEZfTUVUQV9GUkFNRV9OVU1CRVIsIG1ldGFkYXRhKTsKKworICAgIGlmIChwX2ZyYW1lX251bWJlcl92YWxpZCA9PSBOVUxMIHx8IHBfZnJhbWVfbnVtYmVyID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiJXM6IEludmFsaWQgbWV0YWRhdGEiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvL2FjcXVpcmUgcGVyZiBsb2NrIGZvciA1IHNlYyBhZnRlciB0aGUgbGFzdCBIRFIgZnJhbWUgaXMgY2FwdHVyZWQKKyAgICBpZiAoKHBfZnJhbWVfbnVtYmVyX3ZhbGlkICE9IE5VTEwpICYmICpwX2ZyYW1lX251bWJlcl92YWxpZCkgeworICAgICAgICBpZiAoKHBfZnJhbWVfbnVtYmVyICE9IE5VTEwpICYmCisgICAgICAgICAgICAgICAgKG1MYXN0Q3VzdEludGVudEZybU51bSA9PSAoaW50MzJfdCkqcF9mcmFtZV9udW1iZXIpKSB7CisgICAgICAgICAgICBtX3BlcmZMb2NrLmxvY2tfYWNxX3RpbWVkKEhEUl9QTFVTX1BFUkZfVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy9yZWxlYXNlIGxvY2sgYWZ0ZXIgcGVyZiBsb2NrIHRpbWVyIGlzIGV4cGlyZWQuIElmIGxvY2sgaXMgYWxyZWFkeSByZWxlYXNlZCwKKyAgICAvL2lzVGltZXJSZXNldCByZXR1cm5zIGZhbHNlCisgICAgaWYgKG1fcGVyZkxvY2suaXNUaW1lclJlc2V0KCkpIHsKKyAgICAgICAgbUxhc3RDdXN0SW50ZW50RnJtTnVtID0gLTE7CisgICAgICAgIG1fcGVyZkxvY2subG9ja19yZWxfdGltZWQoKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaGFuZGxlSW5wdXRCdWZmZXJXaXRoTG9jaworICoKKyAqIERFU0NSSVBUSU9OOiBIYW5kbGVzIGlucHV0IGJ1ZmZlciBhbmQgc2h1dHRlciBjYWxsYmFjayB3aXRoIG1NdXRleCBsb2NrIGhlbGQuCisgKgorICogUEFSQU1FVEVSUyA6IEBmcmFtZV9udW1iZXI6IGZyYW1lIG51bWJlciBvZiB0aGUgaW5wdXQgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6CisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmhhbmRsZUlucHV0QnVmZmVyV2l0aExvY2sodWludDMyX3QgZnJhbWVfbnVtYmVyKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgcGVuZGluZ1JlcXVlc3RJdGVyYXRvciBpID0gbVBlbmRpbmdSZXF1ZXN0c0xpc3QuYmVnaW4oKTsKKyAgICB3aGlsZSAoaSAhPSBtUGVuZGluZ1JlcXVlc3RzTGlzdC5lbmQoKSAmJiBpLT5mcmFtZV9udW1iZXIgIT0gZnJhbWVfbnVtYmVyKXsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICBpZiAoaSAhPSBtUGVuZGluZ1JlcXVlc3RzTGlzdC5lbmQoKSAmJiBpLT5pbnB1dF9idWZmZXIpIHsKKyAgICAgICAgLy9mb3VuZCB0aGUgcmlnaHQgcmVxdWVzdAorICAgICAgICBpZiAoIWktPnNodXR0ZXJfbm90aWZpZWQpIHsKKyAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIHNldHRpbmdzOworICAgICAgICAgICAgY2FtZXJhM19ub3RpZnlfbXNnX3Qgbm90aWZ5X21zZzsKKyAgICAgICAgICAgIG1lbXNldCgmbm90aWZ5X21zZywgMCwgc2l6ZW9mKGNhbWVyYTNfbm90aWZ5X21zZ190KSk7CisgICAgICAgICAgICBuc2Vjc190IGNhcHR1cmVfdGltZSA9IHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKTsKKyAgICAgICAgICAgIGlmKGktPnNldHRpbmdzKSB7CisgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSBpLT5zZXR0aW5nczsKKyAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZV90aW1lID0gc2V0dGluZ3MuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApLmRhdGEuaTY0WzBdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIk5vIHRpbWVzdGFtcCBpbiBpbnB1dCBzZXR0aW5ncyEgVXNpbmcgY3VycmVudCBvbmUuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJJbnB1dCBzZXR0aW5ncyBtaXNzaW5nISIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBub3RpZnlfbXNnLnR5cGUgPSBDQU1FUkEzX01TR19TSFVUVEVSOworICAgICAgICAgICAgbm90aWZ5X21zZy5tZXNzYWdlLnNodXR0ZXIuZnJhbWVfbnVtYmVyID0gZnJhbWVfbnVtYmVyOworICAgICAgICAgICAgbm90aWZ5X21zZy5tZXNzYWdlLnNodXR0ZXIudGltZXN0YW1wID0gKHVpbnQ2NF90KWNhcHR1cmVfdGltZTsKKyAgICAgICAgICAgIG1DYWxsYmFja09wcy0+bm90aWZ5KG1DYWxsYmFja09wcywgJm5vdGlmeV9tc2cpOworICAgICAgICAgICAgaS0+c2h1dHRlcl9ub3RpZmllZCA9IHRydWU7CisgICAgICAgICAgICBMT0dEKCJJbnB1dCByZXF1ZXN0IG1ldGFkYXRhIG5vdGlmeSBmcmFtZV9udW1iZXIgPSAldSwgY2FwdHVyZV90aW1lID0gJWxsdSIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLT5mcmFtZV9udW1iZXIsIG5vdGlmeV9tc2cubWVzc2FnZS5zaHV0dGVyLnRpbWVzdGFtcCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaS0+aW5wdXRfYnVmZmVyLT5yZWxlYXNlX2ZlbmNlICE9IC0xKSB7CisgICAgICAgICAgIGludDMyX3QgcmMgPSBzeW5jX3dhaXQoaS0+aW5wdXRfYnVmZmVyLT5yZWxlYXNlX2ZlbmNlLCBUSU1FT1VUX05FVkVSKTsKKyAgICAgICAgICAgY2xvc2UoaS0+aW5wdXRfYnVmZmVyLT5yZWxlYXNlX2ZlbmNlKTsKKyAgICAgICAgICAgaWYgKHJjICE9IE9LKSB7CisgICAgICAgICAgICAgICBMT0dFKCJpbnB1dCBidWZmZXIgc3luYyB3YWl0IGZhaWxlZCAlZCIsIHJjKTsKKyAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdCByZXN1bHQ7CisgICAgICAgIG1lbXNldCgmcmVzdWx0LCAwLCBzaXplb2YoY2FtZXJhM19jYXB0dXJlX3Jlc3VsdCkpOworICAgICAgICByZXN1bHQuZnJhbWVfbnVtYmVyID0gZnJhbWVfbnVtYmVyOworICAgICAgICByZXN1bHQucmVzdWx0ID0gaS0+c2V0dGluZ3M7CisgICAgICAgIHJlc3VsdC5pbnB1dF9idWZmZXIgPSBpLT5pbnB1dF9idWZmZXI7CisgICAgICAgIHJlc3VsdC5wYXJ0aWFsX3Jlc3VsdCA9IFBBUlRJQUxfUkVTVUxUX0NPVU5UOworCisgICAgICAgIG1DYWxsYmFja09wcy0+cHJvY2Vzc19jYXB0dXJlX3Jlc3VsdChtQ2FsbGJhY2tPcHMsICZyZXN1bHQpOworICAgICAgICBMT0dEKCJJbnB1dCByZXF1ZXN0IG1ldGFkYXRhIGFuZCBpbnB1dCBidWZmZXIgZnJhbWVfbnVtYmVyID0gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgaS0+ZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgaSA9IGVyYXNlUGVuZGluZ1JlcXVlc3QoaSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiQ291bGQgbm90IGZpbmQgaW5wdXQgcmVxdWVzdCBmb3IgZnJhbWUgbnVtYmVyICVkIiwgZnJhbWVfbnVtYmVyKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaGFuZGxlQnVmZmVyV2l0aExvY2sKKyAqCisgKiBERVNDUklQVElPTjogSGFuZGxlcyBpbWFnZSBidWZmZXIgY2FsbGJhY2sgd2l0aCBtTXV0ZXggbG9jayBoZWxkLgorICoKKyAqIFBBUkFNRVRFUlMgOiBAYnVmZmVyOiBpbWFnZSBidWZmZXIgZm9yIHRoZSBjYWxsYmFjaworICogICAgICAgICAgICAgIEBmcmFtZV9udW1iZXI6IGZyYW1lIG51bWJlciBvZiB0aGUgaW1hZ2UgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6CisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmhhbmRsZUJ1ZmZlcldpdGhMb2NrKAorICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpidWZmZXIsIHVpbnQzMl90IGZyYW1lX251bWJlcikKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIC8qIE5vdGhpbmcgdG8gYmUgZG9uZSBkdXJpbmcgZXJyb3Igc3RhdGUgKi8KKyAgICBpZiAoKEVSUk9SID09IG1TdGF0ZSkgfHwgKERFSU5JVCA9PSBtU3RhdGUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKG1GbHVzaFBlcmYpIHsKKyAgICAgICAgaGFuZGxlQnVmZmVyc0R1cmluZ0ZsdXNoTG9jayhidWZmZXIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vbm90IGluIGZsdXNoCisgICAgLy8gSWYgdGhlIGZyYW1lIG51bWJlciBkb2Vzbid0IGV4aXN0IGluIHRoZSBwZW5kaW5nIHJlcXVlc3QgbGlzdCwKKyAgICAvLyBkaXJlY3RseSBzZW5kIHRoZSBidWZmZXIgdG8gdGhlIGZyYW1ld29ya3MsIGFuZCB1cGRhdGUgcGVuZGluZyBidWZmZXJzIG1hcAorICAgIC8vIE90aGVyd2lzZSwgYm9vay1rZWVwIHRoZSBidWZmZXIuCisgICAgcGVuZGluZ1JlcXVlc3RJdGVyYXRvciBpID0gbVBlbmRpbmdSZXF1ZXN0c0xpc3QuYmVnaW4oKTsKKyAgICB3aGlsZSAoaSAhPSBtUGVuZGluZ1JlcXVlc3RzTGlzdC5lbmQoKSAmJiBpLT5mcmFtZV9udW1iZXIgIT0gZnJhbWVfbnVtYmVyKXsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICBpZiAoaSA9PSBtUGVuZGluZ1JlcXVlc3RzTGlzdC5lbmQoKSkgeworICAgICAgICAvLyBWZXJpZnkgYWxsIHBlbmRpbmcgcmVxdWVzdHMgZnJhbWVfbnVtYmVycyBhcmUgZ3JlYXRlcgorICAgICAgICBmb3IgKHBlbmRpbmdSZXF1ZXN0SXRlcmF0b3IgaiA9IG1QZW5kaW5nUmVxdWVzdHNMaXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaiAhPSBtUGVuZGluZ1JlcXVlc3RzTGlzdC5lbmQoKTsgaisrKSB7CisgICAgICAgICAgICBpZiAoKGotPmZyYW1lX251bWJlciA8IGZyYW1lX251bWJlcikgJiYgIShqLT5pbnB1dF9idWZmZXIpKSB7CisgICAgICAgICAgICAgICAgTE9HVygiRXJyb3I6IHBlbmRpbmcgbGl2ZSBmcmFtZSBudW1iZXIgJWQgaXMgc21hbGxlciB0aGFuICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBqLT5mcmFtZV9udW1iZXIsIGZyYW1lX251bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdF90IHJlc3VsdDsKKyAgICAgICAgbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZihjYW1lcmEzX2NhcHR1cmVfcmVzdWx0X3QpKTsKKyAgICAgICAgcmVzdWx0LnJlc3VsdCA9IE5VTEw7CisgICAgICAgIHJlc3VsdC5mcmFtZV9udW1iZXIgPSBmcmFtZV9udW1iZXI7CisgICAgICAgIHJlc3VsdC5udW1fb3V0cHV0X2J1ZmZlcnMgPSAxOworICAgICAgICByZXN1bHQucGFydGlhbF9yZXN1bHQgPSAwOworICAgICAgICBmb3IgKExpc3Q8UGVuZGluZ0ZyYW1lRHJvcEluZm8+OjppdGVyYXRvciBtID0gbVBlbmRpbmdGcmFtZURyb3BMaXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgbSAhPSBtUGVuZGluZ0ZyYW1lRHJvcExpc3QuZW5kKCk7IG0rKykgeworICAgICAgICAgICAgUUNhbWVyYTNDaGFubmVsICpjaGFubmVsID0gKFFDYW1lcmEzQ2hhbm5lbCAqKWJ1ZmZlci0+c3RyZWFtLT5wcml2OworICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtSUQgPSBjaGFubmVsLT5nZXRTdHJlYW1JRChjaGFubmVsLT5nZXRTdHJlYW1UeXBlTWFzaygpKTsKKyAgICAgICAgICAgIGlmKChtLT5zdHJlYW1fSUQgPT0gc3RyZWFtSUQpICYmIChtLT5mcmFtZV9udW1iZXI9PWZyYW1lX251bWJlcikgKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zdGF0dXM9Q0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgICAgIExPR0QoIlN0cmVhbSBTVEFUVVNfRVJST1IgZnJhbWVfbnVtYmVyPSVkLCBzdHJlYW1JRD0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfbnVtYmVyLCBzdHJlYW1JRCk7CisgICAgICAgICAgICAgICAgbSA9IG1QZW5kaW5nRnJhbWVEcm9wTGlzdC5lcmFzZShtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXN1bHQub3V0cHV0X2J1ZmZlcnMgPSBidWZmZXI7CisgICAgICAgIExPR0goInJlc3VsdCBmcmFtZV9udW1iZXIgPSAlZCwgYnVmZmVyID0gJXAiLAorICAgICAgICAgICAgICAgICBmcmFtZV9udW1iZXIsIGJ1ZmZlci0+YnVmZmVyKTsKKworICAgICAgICBtUGVuZGluZ0J1ZmZlcnNNYXAucmVtb3ZlQnVmKGJ1ZmZlci0+YnVmZmVyKTsKKworICAgICAgICBtQ2FsbGJhY2tPcHMtPnByb2Nlc3NfY2FwdHVyZV9yZXN1bHQobUNhbGxiYWNrT3BzLCAmcmVzdWx0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaS0+aW5wdXRfYnVmZmVyKSB7CisgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBzZXR0aW5nczsKKyAgICAgICAgICAgIGNhbWVyYTNfbm90aWZ5X21zZ190IG5vdGlmeV9tc2c7CisgICAgICAgICAgICBtZW1zZXQoJm5vdGlmeV9tc2csIDAsIHNpemVvZihjYW1lcmEzX25vdGlmeV9tc2dfdCkpOworICAgICAgICAgICAgbnNlY3NfdCBjYXB0dXJlX3RpbWUgPSBzeXN0ZW1UaW1lKENMT0NLX01PTk9UT05JQyk7CisgICAgICAgICAgICBpZihpLT5zZXR0aW5ncykgeworICAgICAgICAgICAgICAgIHNldHRpbmdzID0gaS0+c2V0dGluZ3M7CisgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmV4aXN0cyhBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApKSB7CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVfdGltZSA9IHNldHRpbmdzLmZpbmQoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QKS5kYXRhLmk2NFswXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dXKCJObyB0aW1lc3RhbXAgaW4gaW5wdXQgc2V0dGluZ3MhIFVzaW5nIGN1cnJlbnQgb25lLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiSW5wdXQgc2V0dGluZ3MgbWlzc2luZyEiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbm90aWZ5X21zZy50eXBlID0gQ0FNRVJBM19NU0dfU0hVVFRFUjsKKyAgICAgICAgICAgIG5vdGlmeV9tc2cubWVzc2FnZS5zaHV0dGVyLmZyYW1lX251bWJlciA9IGZyYW1lX251bWJlcjsKKyAgICAgICAgICAgIG5vdGlmeV9tc2cubWVzc2FnZS5zaHV0dGVyLnRpbWVzdGFtcCA9ICh1aW50NjRfdCljYXB0dXJlX3RpbWU7CisKKyAgICAgICAgICAgIGlmIChpLT5pbnB1dF9idWZmZXItPnJlbGVhc2VfZmVuY2UgIT0gLTEpIHsKKyAgICAgICAgICAgICAgIGludDMyX3QgcmMgPSBzeW5jX3dhaXQoaS0+aW5wdXRfYnVmZmVyLT5yZWxlYXNlX2ZlbmNlLCBUSU1FT1VUX05FVkVSKTsKKyAgICAgICAgICAgICAgIGNsb3NlKGktPmlucHV0X2J1ZmZlci0+cmVsZWFzZV9mZW5jZSk7CisgICAgICAgICAgICAgICBpZiAocmMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICBMT0dFKCJpbnB1dCBidWZmZXIgc3luYyB3YWl0IGZhaWxlZCAlZCIsIHJjKTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZW5kaW5nQnVmZmVyc01hcC5yZW1vdmVCdWYoYnVmZmVyLT5idWZmZXIpOworCisgICAgICAgICAgICBjYW1lcmEzX2NhcHR1cmVfcmVzdWx0IHJlc3VsdDsKKyAgICAgICAgICAgIG1lbXNldCgmcmVzdWx0LCAwLCBzaXplb2YoY2FtZXJhM19jYXB0dXJlX3Jlc3VsdCkpOworICAgICAgICAgICAgcmVzdWx0LmZyYW1lX251bWJlciA9IGZyYW1lX251bWJlcjsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPSBpLT5zZXR0aW5nczsKKyAgICAgICAgICAgIHJlc3VsdC5pbnB1dF9idWZmZXIgPSBpLT5pbnB1dF9idWZmZXI7CisgICAgICAgICAgICByZXN1bHQubnVtX291dHB1dF9idWZmZXJzID0gMTsKKyAgICAgICAgICAgIHJlc3VsdC5vdXRwdXRfYnVmZmVycyA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIHJlc3VsdC5wYXJ0aWFsX3Jlc3VsdCA9IFBBUlRJQUxfUkVTVUxUX0NPVU5UOworCisgICAgICAgICAgICBtQ2FsbGJhY2tPcHMtPm5vdGlmeShtQ2FsbGJhY2tPcHMsICZub3RpZnlfbXNnKTsKKyAgICAgICAgICAgIG1DYWxsYmFja09wcy0+cHJvY2Vzc19jYXB0dXJlX3Jlc3VsdChtQ2FsbGJhY2tPcHMsICZyZXN1bHQpOworICAgICAgICAgICAgTE9HRCgiTm90aWZ5IHJlcHJvY2VzcyBub3cgJWQhIiwgZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgIGkgPSBlcmFzZVBlbmRpbmdSZXF1ZXN0KGkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChMaXN0PFJlcXVlc3RlZEJ1ZmZlckluZm8+OjppdGVyYXRvciBqID0gaS0+YnVmZmVycy5iZWdpbigpOworICAgICAgICAgICAgICAgIGogIT0gaS0+YnVmZmVycy5lbmQoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGotPnN0cmVhbSA9PSBidWZmZXItPnN0cmVhbSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoai0+YnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIkVycm9yOiBidWZmZXIgaXMgYWxyZWFkeSBzZXQiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGotPmJ1ZmZlciA9IChjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqKW1hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooai0+YnVmZmVyKSA9ICpidWZmZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dIKCJjYWNoZSBidWZmZXIgJXAgYXQgcmVzdWx0IGZyYW1lX251bWJlciAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+YnVmZmVyLCBmcmFtZV9udW1iZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVuYmxvY2tSZXF1ZXN0SWZOZWNlc3NhcnkKKyAqCisgKiBERVNDUklQVElPTjogVW5ibG9jayBjYXB0dXJlX3JlcXVlc3QgaWYgbWF4X2J1ZmZlciBoYXNuJ3QgYmVlbiByZWFjaGVkLiBOb3RlCisgKiAgICAgICAgICAgICAgdGhhdCBtTXV0ZXggaXMgaGVsZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjp1bmJsb2NrUmVxdWVzdElmTmVjZXNzYXJ5KCkKK3sKKyAgIC8vIFVuYmxvY2sgcHJvY2Vzc19jYXB0dXJlX3JlcXVlc3QKKyAgIHB0aHJlYWRfY29uZF9zaWduYWwoJm1SZXF1ZXN0Q29uZCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QKKyAqCisgKiBERVNDUklQVElPTjogcHJvY2VzcyBhIGNhcHR1cmUgcmVxdWVzdCBmcm9tIGNhbWVyYSBzZXJ2aWNlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEByZXF1ZXN0IDogcmVxdWVzdCBmcm9tIGZyYW1ld29yayB0byBwcm9jZXNzCisgKgorICogUkVUVVJOICAgICA6CisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICpyZXF1ZXN0KQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgaW50MzJfdCByZXF1ZXN0X2lkOworICAgIENhbWVyYU1ldGFkYXRhIG1ldGE7CisgICAgYm9vbCBpc1ZpZEJ1ZlJlcXVlc3RlZCA9IGZhbHNlOworICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpwSW5wdXRCdWZmZXIgPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworCisgICAgLy8gVmFsaWRhdGUgY3VycmVudCBzdGF0ZQorICAgIHN3aXRjaCAobVN0YXRlKSB7CisgICAgICAgIGNhc2UgQ09ORklHVVJFRDoKKyAgICAgICAgY2FzZSBTVEFSVEVEOgorICAgICAgICAgICAgLyogdmFsaWQgc3RhdGUgKi8KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRVJST1I6CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgIGhhbmRsZUNhbWVyYURldmljZUVycm9yKCk7CisgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBzdGF0ZSAlZCIsIG1TdGF0ZSk7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIHJjID0gdmFsaWRhdGVDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiaW5jb21pbmcgcmVxdWVzdCBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBtZXRhID0gcmVxdWVzdC0+c2V0dGluZ3M7CisKKyAgICAvLyBGb3IgZmlyc3QgY2FwdHVyZSByZXF1ZXN0LCBzZW5kIGNhcHR1cmUgaW50ZW50LCBhbmQKKyAgICAvLyBzdHJlYW0gb24gYWxsIHN0cmVhbXMKKyAgICBpZiAobVN0YXRlID09IENPTkZJR1VSRUQpIHsKKyAgICAgICAgLy8gc2VuZCBhbiB1bmNvbmZpZ3VyZSB0byB0aGUgYmFja2VuZCBzbyB0aGF0IHRoZSBpc3AKKyAgICAgICAgLy8gcmVzb3VyY2VzIGFyZSBkZWFsbG9jYXRlZAorICAgICAgICBpZiAoIW1GaXJzdENvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgIGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3Qgc3RyZWFtX2NvbmZpZ19pbmZvOworICAgICAgICAgICAgaW50MzJfdCBoYWxfdmVyc2lvbiA9IENBTV9IQUxfVjM7CisgICAgICAgICAgICBtZW1zZXQoJnN0cmVhbV9jb25maWdfaW5mbywgMCwgc2l6ZW9mKGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QpKTsKKyAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5idWZmZXJfaW5mby5taW5fYnVmZmVycyA9CisgICAgICAgICAgICAgICAgICAgIE1JTl9JTkZMSUdIVF9SRVFVRVNUUzsKKyAgICAgICAgICAgIHN0cmVhbV9jb25maWdfaW5mby5idWZmZXJfaW5mby5tYXhfYnVmZmVycyA9CisgICAgICAgICAgICAgICAgICAgIG1fYklzNEtWaWRlbyA/IDAgOiBNQVhfSU5GTElHSFRfUkVRVUVTVFM7CisgICAgICAgICAgICBjbGVhcl9tZXRhZGF0YV9idWZmZXIobVBhcmFtZXRlcnMpOworICAgICAgICAgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9IQUxfVkVSU0lPTiwgaGFsX3ZlcnNpb24pOworICAgICAgICAgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9TVFJFQU1fSU5GTywgc3RyZWFtX2NvbmZpZ19pbmZvKTsKKyAgICAgICAgICAgIHJjID0gbUNhbWVyYUhhbmRsZS0+b3BzLT5zZXRfcGFybXMobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMpOworICAgICAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoInNldF9wYXJtcyBmb3IgdW5jb25maWd1cmUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1fcGVyZkxvY2subG9ja19hY3EoKTsKKyAgICAgICAgLyogZ2V0IGVpcyBpbmZvcm1hdGlvbiBmb3Igc3RyZWFtIGNvbmZpZ3VyYXRpb24gKi8KKyAgICAgICAgY2FtX2lzX3R5cGVfdCBpc1R5cGVWaWRlbywgaXNUeXBlUHJldmlldywgaXNfdHlwZT1JU19UWVBFX05PTkU7CisgICAgICAgIGNoYXIgaXNfdHlwZV92YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmlzX3R5cGUiLCBpc190eXBlX3ZhbHVlLCAiNCIpOworICAgICAgICBpc1R5cGVWaWRlbyA9IHN0YXRpY19jYXN0PGNhbV9pc190eXBlX3Q+KGF0b2koaXNfdHlwZV92YWx1ZSkpOworICAgICAgICAvLyBNYWtlIGRlZmF1bHQgdmFsdWUgZm9yIHByZXZpZXcgSVNfVFlQRSBhcyBJU19UWVBFX0VJU18yXzAKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5pc190eXBlX3ByZXZpZXciLCBpc190eXBlX3ZhbHVlLCAiNCIpOworICAgICAgICBpc1R5cGVQcmV2aWV3ID0gc3RhdGljX2Nhc3Q8Y2FtX2lzX3R5cGVfdD4oYXRvaShpc190eXBlX3ZhbHVlKSk7CisgICAgICAgIExPR0QoImlzVHlwZVZpZGVvOiAlZCBpc1R5cGVQcmV2aWV3OiAlZCIsIGlzVHlwZVZpZGVvLCBpc1R5cGVQcmV2aWV3KTsKKworICAgICAgICBpZiAobWV0YS5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UKSkgeworICAgICAgICAgICAgaW50MzJfdCBoYWxfdmVyc2lvbiA9IENBTV9IQUxfVjM7CisgICAgICAgICAgICB1aW50OF90IGNhcHR1cmVJbnRlbnQgPQorICAgICAgICAgICAgICAgIG1ldGEuZmluZChBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQpLmRhdGEudThbMF07CisgICAgICAgICAgICBtQ2FwdHVyZUludGVudCA9IGNhcHR1cmVJbnRlbnQ7CisgICAgICAgICAgICBjbGVhcl9tZXRhZGF0YV9idWZmZXIobVBhcmFtZXRlcnMpOworICAgICAgICAgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtUGFyYW1ldGVycywgQ0FNX0lOVEZfUEFSTV9IQUxfVkVSU0lPTiwgaGFsX3ZlcnNpb24pOworICAgICAgICAgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtUGFyYW1ldGVycywgQ0FNX0lOVEZfTUVUQV9DQVBUVVJFX0lOVEVOVCwgY2FwdHVyZUludGVudCk7CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90IGZ3a1ZpZGVvU3RhYk1vZGU9MDsKKyAgICAgICAgaWYgKG1ldGEuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9WSURFT19TVEFCSUxJWkFUSU9OX01PREUpKSB7CisgICAgICAgICAgICBmd2tWaWRlb1N0YWJNb2RlID0gbWV0YS5maW5kKEFORFJPSURfQ09OVFJPTF9WSURFT19TVEFCSUxJWkFUSU9OX01PREUpLmRhdGEudThbMF07CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBFSVMgc2V0cHJvcCBpcyBlbmFibGVkICYgaWYgZmlyc3QgY2FwdHVyZSBzZXR0aW5nIGhhcyBFSVMgZW5hYmxlZCB0aGVuIG9ubHkKKyAgICAgICAgLy8gdHVybiBpdCBvbiBmb3IgdmlkZW8vcHJldmlldworICAgICAgICBib29sIHNldEVpcyA9IG1fYkVpc0VuYWJsZSAmJiBmd2tWaWRlb1N0YWJNb2RlICYmIG1fYkVpc1N1cHBvcnRlZFNpemUgJiYKKyAgICAgICAgICAgICAgICAoaXNUeXBlVmlkZW8gPj0gSVNfVFlQRV9FSVNfMl8wKTsKKyAgICAgICAgaW50MzJfdCB2c01vZGU7CisgICAgICAgIHZzTW9kZSA9IChzZXRFaXMpPyBESVNfRU5BQkxFOiBESVNfRElTQUJMRTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobVBhcmFtZXRlcnMsIENBTV9JTlRGX1BBUk1fRElTX0VOQUJMRSwgdnNNb2RlKSkgeworICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgTE9HRCgic2V0RWlzICVkIiwgc2V0RWlzKTsKKyAgICAgICAgYm9vbCBlaXMzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIHNpemVfdCBjb3VudCA9IElTX1RZUEVfTUFYOworICAgICAgICBjb3VudCA9IE1JTihnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5zdXBwb3J0ZWRfaXNfdHlwZXNfY250LCBjb3VudCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnN1cHBvcnRlZF9pc190eXBlc1tpXSA9PSBJU19UWVBFX0VJU18zXzApIHsKKyAgICAgICAgICAgICAgICBlaXMzU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vSVMgdHlwZSB3aWxsIGJlIDAgdW5sZXNzIEVJUyBpcyBzdXBwb3J0ZWQuIElmIEVJUyBpcyBzdXBwb3J0ZWQKKyAgICAgICAgLy9pdCBjb3VsZCBlaXRoZXIgYmUgNCBvciA1IGRlcGVuZGluZyBvbiB0aGUgc3RyZWFtIGFuZCB2aWRlbyBzaXplCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2V0RWlzKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TdHJlYW1Db25maWdJbmZvLnR5cGVbaV0gPT0gQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNfdHlwZSA9IGlzVHlwZVByZXZpZXc7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RyZWFtQ29uZmlnSW5mby50eXBlW2ldID09IENBTV9TVFJFQU1fVFlQRV9WSURFTyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoaXNUeXBlVmlkZW8gPT0gSVNfVFlQRV9FSVNfM18wKSAmJiAoZWlzM1N1cHBvcnRlZCA9PSBGQUxTRSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dXKCIgRUlTXzMuMCBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzbyBzZXR0aW5nIEVJU18yLjAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX3R5cGUgPSBJU19UWVBFX0VJU18yXzA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc190eXBlID0gaXNUeXBlVmlkZW87CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpc190eXBlID0gSVNfVFlQRV9OT05FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8uaXNfdHlwZVtpXSA9IGlzX3R5cGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5pc190eXBlW2ldID0gSVNfVFlQRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX1NUUkVBTV9JTkZPLCBtU3RyZWFtQ29uZmlnSW5mbyk7CisKKyAgICAgICAgaW50MzJfdCB0aW50bGVzc192YWx1ZSA9IDE7CisgICAgICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobVBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9USU5UTEVTUywgdGludGxlc3NfdmFsdWUpOworICAgICAgICAvL0Rpc2FibGUgQ0RTIGZvciBIRlIgbW9kZSBvciBpZiBESVMvRUlTIGlzIG9uLgorICAgICAgICAvL0NEUyBpcyBhIHNlc3Npb24gcGFyYW1ldGVyIGluIHRoZSBiYWNrZW5kL0lTUCwgc28gbmVlZCB0byBiZSBzZXQvcmVzZXQKKyAgICAgICAgLy9hZnRlciBldmVyeSBjb25maWd1cmVfc3RyZWFtCisgICAgICAgIGlmICgoQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUgPT0gbU9wTW9kZSkgfHwKKyAgICAgICAgICAgICAgICAobV9iSXNWaWRlbykpIHsKKyAgICAgICAgICAgIGludDMyX3QgY2RzID0gQ0FNX0NEU19NT0RFX09GRjsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1QYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICBDQU1fSU5URl9QQVJNX0NEU19NT0RFLCBjZHMpKQorICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBkaXNhYmxlIENEUyBmb3IgSEZSIG1vZGUiKTsKKworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fZGVidWdfYXZ0aW1lciB8fCBtZXRhLmV4aXN0cyhRQ0FNRVJBM19VU0VfQVZfVElNRVIpKSB7CisgICAgICAgICAgICB1aW50OF90KiB1c2VfYXZfdGltZXIgPSBOVUxMOworCisgICAgICAgICAgICBpZiAobV9kZWJ1Z19hdnRpbWVyKXsKKyAgICAgICAgICAgICAgICB1c2VfYXZfdGltZXIgPSAmbV9kZWJ1Z19hdnRpbWVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICB1c2VfYXZfdGltZXIgPQorICAgICAgICAgICAgICAgICAgICBtZXRhLmZpbmQoUUNBTUVSQTNfVVNFX0FWX1RJTUVSKS5kYXRhLnU4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtUGFyYW1ldGVycywgQ0FNX0lOVEZfTUVUQV9VU0VfQVZfVElNRVIsICp1c2VfYXZfdGltZXIpKSB7CisgICAgICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzZXRNb2JpY2F0KCk7CisKKyAgICAgICAgLyogU2V0IGZwcyBhbmQgaGZyIG1vZGUgd2hpbGUgc2VuZGluZyBtZXRhIHN0cmVhbSBpbmZvIHNvIHRoYXQgc2Vuc29yCisgICAgICAgICAqIGNhbiBjb25maWd1cmUgYXBwcm9wcmlhdGUgc3RyZWFtaW5nIG1vZGUgKi8KKyAgICAgICAgbUhGUlZpZGVvRnBzID0gREVGQVVMVF9WSURFT19GUFM7CisgICAgICAgIG1NaW5JbkZsaWdodFJlcXVlc3RzID0gTUlOX0lORkxJR0hUX1JFUVVFU1RTOworICAgICAgICBtTWF4SW5GbGlnaHRSZXF1ZXN0cyA9IE1BWF9JTkZMSUdIVF9SRVFVRVNUUzsKKyAgICAgICAgaWYgKG1ldGEuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BRV9UQVJHRVRfRlBTX1JBTkdFKSkgeworICAgICAgICAgICAgcmMgPSBzZXRIYWxGcHNSYW5nZShtZXRhLCBtUGFyYW1ldGVycyk7CisgICAgICAgICAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG1heF9mcHMgPQorICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCkgbWV0YS5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9UQVJHRVRfRlBTX1JBTkdFKS5kYXRhLmkzMlsxXTsKKyAgICAgICAgICAgICAgICBpZiAobWF4X2ZwcyA9PSA2MCkgeworICAgICAgICAgICAgICAgICAgICBtTWluSW5GbGlnaHRSZXF1ZXN0cyA9IE1JTl9JTkZMSUdIVF82MEZQU19SRVFVRVNUUzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogRm9yIEhGUiwgbW9yZSBidWZmZXJzIGFyZSBkZXF1ZXVlZCB1cGZyb250IHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlICovCisgICAgICAgICAgICAgICAgaWYgKG1CYXRjaFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1pbkluRmxpZ2h0UmVxdWVzdHMgPSBNSU5fSU5GTElHSFRfSEZSX1JFUVVFU1RTOworICAgICAgICAgICAgICAgICAgICBtTWF4SW5GbGlnaHRSZXF1ZXN0cyA9IE1BWF9JTkZMSUdIVF9IRlJfUkVRVUVTVFM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgic2V0SGFsRnBzUmFuZ2UgZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGEuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9NT0RFKSkgeworICAgICAgICAgICAgdWludDhfdCBtZXRhTW9kZSA9IG1ldGEuZmluZChBTkRST0lEX0NPTlRST0xfTU9ERSkuZGF0YS51OFswXTsKKyAgICAgICAgICAgIHJjID0gZXh0cmFjdFNjZW5lTW9kZShtZXRhLCBtZXRhTW9kZSwgbVBhcmFtZXRlcnMpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiZXh0cmFjdFNjZW5lTW9kZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZXRhLmV4aXN0cyhRQ0FNRVJBM19WSURFT19IRFJfTU9ERSkpIHsKKyAgICAgICAgICAgIGNhbV92aWRlb19oZHJfbW9kZV90IHZoZHIgPSAoY2FtX3ZpZGVvX2hkcl9tb2RlX3QpCisgICAgICAgICAgICAgICAgICAgIG1ldGEuZmluZChRQ0FNRVJBM19WSURFT19IRFJfTU9ERSkuZGF0YS5pMzJbMF07CisgICAgICAgICAgICByYyA9IHNldFZpZGVvSGRyTW9kZShtUGFyYW1ldGVycywgdmhkcik7CisgICAgICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJzZXRWaWRlb0hEUiBpcyBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vVE9ETzogdmFsaWRhdGUgdGhlIGFyZ3VtZW50cywgSFNWIHNjZW5lbW9kZSBzaG91bGQgaGF2ZSBvbmx5IHRoZQorICAgICAgICAvL2FkdmVydGlzZWQgZnBzIHJhbmdlcworCisgICAgICAgIC8qc2V0IHRoZSBjYXB0dXJlIGludGVudCwgaGFsIHZlcnNpb24sIHRpbnRsZXNzLCBzdHJlYW0gaW5mbywKKyAgICAgICAgICphbmQgZGlzZW5hYmxlIHBhcmFtZXRlcnMgdG8gdGhlIGJhY2tlbmQqLworICAgICAgICBMT0dEKCJzZXRfcGFybXMgTUVUQV9TVFJFQU1fSU5GTyAiICk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBMT0dJKCJTVFJFQU0gSU5GTyA6IHR5cGUgJWQsIHd4aDogJWQgeCAlZCwgcHBfbWFzazogMHgleCAiCisgICAgICAgICAgICAgICAgICAgICJGb3JtYXQ6JWQgaXNfdHlwZTogJWQiLAorICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby50eXBlW2ldLAorICAgICAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5zdHJlYW1fc2l6ZXNbaV0ud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnN0cmVhbV9zaXplc1tpXS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnBvc3Rwcm9jZXNzX21hc2tbaV0sCisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLmZvcm1hdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8uaXNfdHlwZVtpXSk7CisgICAgICAgIH0KKworICAgICAgICByYyA9IG1DYW1lcmFIYW5kbGUtPm9wcy0+c2V0X3Bhcm1zKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzKTsKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgTE9HRSgic2V0X3Bhcm1zIGZhaWxlZCBmb3IgaGFsIHZlcnNpb24sIHN0cmVhbSBpbmZvIik7CisgICAgICAgIH0KKworICAgICAgICBjYW1fZGltZW5zaW9uX3Qgc2Vuc29yX2RpbTsKKyAgICAgICAgbWVtc2V0KCZzZW5zb3JfZGltLCAwLCBzaXplb2Yoc2Vuc29yX2RpbSkpOworICAgICAgICByYyA9IGdldFNlbnNvck91dHB1dFNpemUoc2Vuc29yX2RpbSk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGdldCBzZW5zb3Igb3V0cHV0IHNpemUiKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICB9CisKKyAgICAgICAgbUNyb3BSZWdpb25NYXBwZXIudXBkYXRlKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmFjdGl2ZV9hcnJheV9zaXplLndpZHRoLAorICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmFjdGl2ZV9hcnJheV9zaXplLmhlaWdodCwKKyAgICAgICAgICAgICAgICBzZW5zb3JfZGltLndpZHRoLCBzZW5zb3JfZGltLmhlaWdodCk7CisKKyAgICAgICAgLyogU2V0IGJhdGNobW9kZSBiZWZvcmUgaW5pdGlhbGl6aW5nIGNoYW5uZWwuIFNpbmNlIHJlZ2lzdGVyQnVmZmVyCisgICAgICAgICAqIGludGVybmFsbHkgaW5pdGlhbGl6ZXMgc29tZSBvZiB0aGUgY2hhbm5lbHMsIGJldHRlciBzZXQgYmF0Y2htb2RlCisgICAgICAgICAqIGV2ZW4gYmVmb3JlIGZpcnN0IHJlZ2lzdGVyIGJ1ZmZlciAqLworICAgICAgICBmb3IgKExpc3Q8c3RyZWFtX2luZm9fdCAqPjo6aXRlcmF0b3IgaXQgPSBtU3RyZWFtSW5mby5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gbVN0cmVhbUluZm8uZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqY2hhbm5lbCA9IChRQ2FtZXJhM0NoYW5uZWwgKikoKml0KS0+c3RyZWFtLT5wcml2OworICAgICAgICAgICAgaWYgKCgoMVUgPDwgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPKSA9PSBjaGFubmVsLT5nZXRTdHJlYW1UeXBlTWFzaygpKQorICAgICAgICAgICAgICAgICAgICAmJiBtQmF0Y2hTaXplKSB7CisgICAgICAgICAgICAgICAgcmMgPSBjaGFubmVsLT5zZXRCYXRjaFNpemUobUJhdGNoU2l6ZSk7CisgICAgICAgICAgICAgICAgLy9EaXNhYmxlIHBlciBmcmFtZSBtYXAgdW5tYXAgZm9yIEhGUi9iYXRjaG1vZGUgY2FzZQorICAgICAgICAgICAgICAgIHJjIHw9IGNoYW5uZWwtPnNldFBlckZyYW1lTWFwVW5tYXAoZmFsc2UpOworICAgICAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJDaGFubmVsIGluaXQgZmFpbGVkICVkIiwgcmMpOworICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vRmlyc3QgaW5pdGlhbGl6ZSBhbGwgc3RyZWFtcworICAgICAgICBmb3IgKExpc3Q8c3RyZWFtX2luZm9fdCAqPjo6aXRlcmF0b3IgaXQgPSBtU3RyZWFtSW5mby5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gbVN0cmVhbUluZm8uZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqY2hhbm5lbCA9IChRQ2FtZXJhM0NoYW5uZWwgKikoKml0KS0+c3RyZWFtLT5wcml2OworICAgICAgICAgICAgaWYgKCgoKDFVIDw8IENBTV9TVFJFQU1fVFlQRV9WSURFTykgPT0gY2hhbm5lbC0+Z2V0U3RyZWFtVHlwZU1hc2soKSkgfHwKKyAgICAgICAgICAgICAgICgoMVUgPDwgQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcpID09IGNoYW5uZWwtPmdldFN0cmVhbVR5cGVNYXNrKCkpKSAmJgorICAgICAgICAgICAgICAgc2V0RWlzKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtQ29uZmlnSW5mby5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggKDFVIDw8IG1TdHJlYW1Db25maWdJbmZvLnR5cGVbaV0pID09IGNoYW5uZWwtPmdldFN0cmVhbVR5cGVNYXNrKCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc190eXBlID0gbVN0cmVhbUNvbmZpZ0luZm8uaXNfdHlwZVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJjID0gY2hhbm5lbC0+aW5pdGlhbGl6ZShpc190eXBlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmMgPSBjaGFubmVsLT5pbml0aWFsaXplKElTX1RZUEVfTk9ORSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJDaGFubmVsIGluaXRpYWxpemF0aW9uIGZhaWxlZCAlZCIsIHJjKTsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobVJhd0R1bXBDaGFubmVsKSB7CisgICAgICAgICAgICByYyA9IG1SYXdEdW1wQ2hhbm5lbC0+aW5pdGlhbGl6ZShJU19UWVBFX05PTkUpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3I6IFJhdyBEdW1wIENoYW5uZWwgaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TdXBwb3J0Q2hhbm5lbCkgeworICAgICAgICAgICAgcmMgPSBtU3VwcG9ydENoYW5uZWwtPmluaXRpYWxpemUoSVNfVFlQRV9OT05FKTsKKyAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJTdXBwb3J0IGNoYW5uZWwgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtQW5hbHlzaXNDaGFubmVsKSB7CisgICAgICAgICAgICByYyA9IG1BbmFseXNpc0NoYW5uZWwtPmluaXRpYWxpemUoSVNfVFlQRV9OT05FKTsKKyAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJBbmFseXNpcyBjaGFubmVsIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUR1bW15QmF0Y2hDaGFubmVsKSB7CisgICAgICAgICAgICByYyA9IG1EdW1teUJhdGNoQ2hhbm5lbC0+c2V0QmF0Y2hTaXplKG1CYXRjaFNpemUpOworICAgICAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoIm1EdW1teUJhdGNoQ2hhbm5lbCBzZXRCYXRjaFNpemUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmMgPSBtRHVtbXlCYXRjaENoYW5uZWwtPmluaXRpYWxpemUoSVNfVFlQRV9OT05FKTsKKyAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtRHVtbXlCYXRjaENoYW5uZWwgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IGJ1bmRsZSBpbmZvCisgICAgICAgIHJjID0gc2V0QnVuZGxlSW5mbygpOworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJzZXRCdW5kbGVJbmZvIGZhaWxlZCAlZCIsIHJjKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICB9CisKKyAgICAgICAgLy91cGRhdGUgc2V0dGluZ3MgZnJvbSBhcHAgaGVyZQorICAgICAgICBpZiAobWV0YS5leGlzdHMoUUNBTUVSQTNfRFVBTENBTV9MSU5LX0VOQUJMRSkpIHsKKyAgICAgICAgICAgIG1Jc0RldmljZUxpbmtlZCA9IG1ldGEuZmluZChRQ0FNRVJBM19EVUFMQ0FNX0xJTktfRU5BQkxFKS5kYXRhLnU4WzBdOworICAgICAgICAgICAgTE9HSCgiRHVhbGNhbTogc2V0dGluZyBPbj0lZCBpZCA9JWQiLCBtSXNEZXZpY2VMaW5rZWQsIG1DYW1lcmFJZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGEuZXhpc3RzKFFDQU1FUkEzX0RVQUxDQU1fTElOS19JU19NQUlOKSkgeworICAgICAgICAgICAgbUlzTWFpbkNhbWVyYSA9IG1ldGEuZmluZChRQ0FNRVJBM19EVUFMQ0FNX0xJTktfSVNfTUFJTikuZGF0YS51OFswXTsKKyAgICAgICAgICAgIExPR0goIkR1YWxjYW06IElzIHRoaXMgbWFpbiBjYW1lcmEgPSAlZCBpZCA9JWQiLCBtSXNNYWluQ2FtZXJhLCBtQ2FtZXJhSWQpOworICAgICAgICB9CisgICAgICAgIGlmIChtZXRhLmV4aXN0cyhRQ0FNRVJBM19EVUFMQ0FNX0xJTktfUkVMQVRFRF9DQU1FUkFfSUQpKSB7CisgICAgICAgICAgICBtTGlua2VkQ2FtZXJhSWQgPSBtZXRhLmZpbmQoUUNBTUVSQTNfRFVBTENBTV9MSU5LX1JFTEFURURfQ0FNRVJBX0lEKS5kYXRhLnU4WzBdOworICAgICAgICAgICAgTE9HSCgiRHVhbGNhbTogTGlua2VkIGNhbWVyYSBJZCAlZCBpZCA9JWQiLCBtTGlua2VkQ2FtZXJhSWQsIG1DYW1lcmFJZCk7CisKKyAgICAgICAgICAgIGlmICggKG1MaW5rZWRDYW1lcmFJZCA+PSBNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTKSAmJgorICAgICAgICAgICAgICAgIChtTGlua2VkQ2FtZXJhSWQgIT0gbUNhbWVyYUlkKSApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJEdWFsY2FtOiBtTGlua2VkQ2FtZXJhSWQgJWQgaXMgaW52YWxpZCwgY3VycmVudCBjYW0gaWQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgIG1MaW5rZWRDYW1lcmFJZCwgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgYnVuZGxlIHJlbGF0ZWQgY2FtZXJhcworICAgICAgICBMT0dIKCIlczogRHVhbGNhbTogaWQgPSVkLCBtSXNEZXZpY2VMaW5rZWQ9JWQiLCBfX2Z1bmNfXyxtQ2FtZXJhSWQsIG1Jc0RldmljZUxpbmtlZCk7CisgICAgICAgIGlmIChtZXRhLmV4aXN0cyhRQ0FNRVJBM19EVUFMQ0FNX0xJTktfRU5BQkxFKSkgeworICAgICAgICAgICAgaWYgKG1Jc0RldmljZUxpbmtlZCkKKyAgICAgICAgICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT5zeW5jX2NvbnRyb2wgPSBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT047CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+c3luY19jb250cm9sID0gQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09GRjsKKworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnQ2FtTG9jayk7CisKKyAgICAgICAgICAgIGlmIChzZXNzaW9uSWRbbUxpbmtlZENhbWVyYUlkXSA9PSAweERFQURCRUVGKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRHVhbGNhbTogSW52YWxpZCBTZXNzaW9uIElkICIpOworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnQ2FtTG9jayk7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobUlzTWFpbkNhbWVyYSA9PSAxKSB7CisgICAgICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+bW9kZSA9IENBTV9NT0RFX1BSSU1BUlk7CisgICAgICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+dHlwZSA9IENBTV9UWVBFX01BSU47CisgICAgICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+c3luY18zYV9tb2RlID0gQ0FNXzNBX1NZTkNfRk9MTE9XOworICAgICAgICAgICAgICAgIC8vIHJlbGF0ZWQgc2Vzc2lvbiBpZCBzaG91bGQgYmUgc2Vzc2lvbiBpZCBvZiBsaW5rZWQgc2Vzc2lvbgorICAgICAgICAgICAgICAgIG1fcFJlbENhbVN5bmNCdWYtPnJlbGF0ZWRfc2Vuc29yX3Nlc3Npb25faWQgPSBzZXNzaW9uSWRbbUxpbmtlZENhbWVyYUlkXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+bW9kZSA9IENBTV9NT0RFX1NFQ09OREFSWTsKKyAgICAgICAgICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT50eXBlID0gQ0FNX1RZUEVfQVVYOworICAgICAgICAgICAgICAgIG1fcFJlbENhbVN5bmNCdWYtPnN5bmNfM2FfbW9kZSA9IENBTV8zQV9TWU5DX0ZPTExPVzsKKyAgICAgICAgICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT5yZWxhdGVkX3NlbnNvcl9zZXNzaW9uX2lkID0gc2Vzc2lvbklkW21MaW5rZWRDYW1lcmFJZF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0NhbUxvY2spOworCisgICAgICAgICAgICByYyA9IG1DYW1lcmFIYW5kbGUtPm9wcy0+c3luY19yZWxhdGVkX3NlbnNvcnMoCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsIG1fcFJlbENhbVN5bmNCdWYpOworICAgICAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoIkR1YWxjYW06IGxpbmsgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9UaGVuIHN0YXJ0IHRoZW0uCisgICAgICAgIExPR0goIlN0YXJ0IE1FVEEgQ2hhbm5lbCIpOworICAgICAgICByYyA9IG1NZXRhZGF0YUNoYW5uZWwtPnN0YXJ0KCk7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIk1FVEEgY2hhbm5lbCBzdGFydCBmYWlsZWQiKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1BbmFseXNpc0NoYW5uZWwpIHsKKyAgICAgICAgICAgIHJjID0gbUFuYWx5c2lzQ2hhbm5lbC0+c3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJBbmFseXNpcyBjaGFubmVsIHN0YXJ0IGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1NZXRhZGF0YUNoYW5uZWwtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobVN1cHBvcnRDaGFubmVsKSB7CisgICAgICAgICAgICByYyA9IG1TdXBwb3J0Q2hhbm5lbC0+c3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJTdXBwb3J0IGNoYW5uZWwgc3RhcnQgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbU1ldGFkYXRhQ2hhbm5lbC0+c3RvcCgpOworICAgICAgICAgICAgICAgIC8qIEFsdGhvdWdoIHN1cHBvcnQgYW5kIGFuYWx5c2lzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgdG9kYXkKKyAgICAgICAgICAgICAgICAgICBhZGRpbmcgaXQgaW4gYW55Y2FzZSBmb3IgZnV0dXJlIHByb29maW5nICovCisgICAgICAgICAgICAgICAgaWYgKG1BbmFseXNpc0NoYW5uZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuYWx5c2lzQ2hhbm5lbC0+c3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yX2V4aXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChMaXN0PHN0cmVhbV9pbmZvX3QgKj46Oml0ZXJhdG9yIGl0ID0gbVN0cmVhbUluZm8uYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IG1TdHJlYW1JbmZvLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKmNoYW5uZWwgPSAoUUNhbWVyYTNDaGFubmVsICopKCppdCktPnN0cmVhbS0+cHJpdjsKKyAgICAgICAgICAgIExPR0goIlN0YXJ0IFByb2Nlc3NpbmcgQ2hhbm5lbCBtYXNrPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwtPmdldFN0cmVhbVR5cGVNYXNrKCkpOworICAgICAgICAgICAgcmMgPSBjaGFubmVsLT5zdGFydCgpOworICAgICAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoImNoYW5uZWwgc3RhcnQgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1SYXdEdW1wQ2hhbm5lbCkgeworICAgICAgICAgICAgTE9HRCgiU3RhcnRpbmcgcmF3IGR1bXAgc3RyZWFtIik7CisgICAgICAgICAgICByYyA9IG1SYXdEdW1wQ2hhbm5lbC0+c3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yIFN0YXJ0aW5nIFJhdyBEdW1wIENoYW5uZWwiKTsKKyAgICAgICAgICAgICAgICBmb3IgKExpc3Q8c3RyZWFtX2luZm9fdCAqPjo6aXRlcmF0b3IgaXQgPSBtU3RyZWFtSW5mby5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IG1TdHJlYW1JbmZvLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqY2hhbm5lbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoUUNhbWVyYTNDaGFubmVsICopKCppdCktPnN0cmVhbS0+cHJpdjsKKyAgICAgICAgICAgICAgICAgICAgTE9HSCgiU3RvcHBpbmcgUHJvY2Vzc2luZyBDaGFubmVsIG1hc2s9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC0+Z2V0U3RyZWFtVHlwZU1hc2soKSk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1TdXBwb3J0Q2hhbm5lbCkKKyAgICAgICAgICAgICAgICAgICAgbVN1cHBvcnRDaGFubmVsLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgaWYgKG1BbmFseXNpc0NoYW5uZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuYWx5c2lzQ2hhbm5lbC0+c3RvcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTWV0YWRhdGFDaGFubmVsLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1DaGFubmVsSGFuZGxlKSB7CisKKyAgICAgICAgICAgIHJjID0gbUNhbWVyYUhhbmRsZS0+b3BzLT5zdGFydF9jaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR0UoInN0YXJ0X2NoYW5uZWwgZmFpbGVkICVkIiwgcmMpOworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdvdG8gbm9fZXJyb3I7CitlcnJvcl9leGl0OgorICAgICAgICBtX3BlcmZMb2NrLmxvY2tfcmVsKCk7CisgICAgICAgIHJldHVybiByYzsKK25vX2Vycm9yOgorICAgICAgICBtX3BlcmZMb2NrLmxvY2tfcmVsKCk7CisKKyAgICAgICAgbVdva2VuVXBCeURhZW1vbiA9IGZhbHNlOworICAgICAgICBtUGVuZGluZ0xpdmVSZXF1ZXN0ID0gMDsKKyAgICAgICAgbUZpcnN0Q29uZmlndXJhdGlvbiA9IGZhbHNlOworICAgICAgICBlbmFibGVQb3dlckhpbnQoKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBmcmFtZU51bWJlciA9IHJlcXVlc3QtPmZyYW1lX251bWJlcjsKKyAgICBjYW1fc3RyZWFtX0lEX3Qgc3RyZWFtSUQ7CisKKyAgICBpZiAobUZsdXNoUGVyZikgeworICAgICAgICAvL3dlIGNhbm5vdCBhY2NlcHQgYW55IHJlcXVlc3RzIGR1cmluZyBmbHVzaAorICAgICAgICBMT0dFKCJwcm9jZXNzX2NhcHR1cmVfcmVxdWVzdCBjYW5ub3QgcHJvY2VlZCBkdXJpbmcgZmx1c2giKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsgLy9zaG91bGQgcmV0dXJuIGFuIGVycm9yCisgICAgfQorCisgICAgaWYgKG1ldGEuZXhpc3RzKEFORFJPSURfUkVRVUVTVF9JRCkpIHsKKyAgICAgICAgcmVxdWVzdF9pZCA9IG1ldGEuZmluZChBTkRST0lEX1JFUVVFU1RfSUQpLmRhdGEuaTMyWzBdOworICAgICAgICBtQ3VycmVudFJlcXVlc3RJZCA9IHJlcXVlc3RfaWQ7CisgICAgICAgIExPR0QoIlJlY2VpdmVkIHJlcXVlc3Qgd2l0aCBpZDogJWQiLCByZXF1ZXN0X2lkKTsKKyAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBDT05GSUdVUkVEIHx8IG1DdXJyZW50UmVxdWVzdElkID09IC0xKXsKKyAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGZpbmQgcmVxdWVzdCBpZCBmaWVsZCwgXAorICAgICAgICAgICAgICAgICYgbm8gcHJldmlvdXMgaWQgYXZhaWxhYmxlIik7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiUmUtdXNpbmcgb2xkIHJlcXVlc3QgaWQiKTsKKyAgICAgICAgcmVxdWVzdF9pZCA9IG1DdXJyZW50UmVxdWVzdElkOworICAgIH0KKworICAgIExPR0goIm51bV9vdXRwdXRfYnVmZmVycyA9ICVkIGlucHV0X2J1ZmZlciA9ICVwIGZyYW1lX251bWJlciA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPmlucHV0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTnVtYmVyKTsKKyAgICAvLyBBY3F1aXJlIGFsbCByZXF1ZXN0IGJ1ZmZlcnMgZmlyc3QKKyAgICBzdHJlYW1JRC5udW1fc3RyZWFtcyA9IDA7CisgICAgaW50IGJsb2JfcmVxdWVzdCA9IDA7CisgICAgdWludDMyX3Qgc25hcHNob3RTdHJlYW1JZCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnM7IGkrKykgeworICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCYgb3V0cHV0ID0gcmVxdWVzdC0+b3V0cHV0X2J1ZmZlcnNbaV07CisgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqY2hhbm5lbCA9IChRQ2FtZXJhM0NoYW5uZWwgKilvdXRwdXQuc3RyZWFtLT5wcml2OworCisgICAgICAgIGlmIChvdXRwdXQuc3RyZWFtLT5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICAvL0NhbGwgZnVuY3Rpb24gdG8gc3RvcmUgbG9jYWwgY29weSBvZiBqcGVnIGRhdGEgZm9yIGVuY29kZSBwYXJhbXMuCisgICAgICAgICAgICBibG9iX3JlcXVlc3QgPSAxOworICAgICAgICAgICAgc25hcHNob3RTdHJlYW1JZCA9IGNoYW5uZWwtPmdldFN0cmVhbUlEKGNoYW5uZWwtPmdldFN0cmVhbVR5cGVNYXNrKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dC5hY3F1aXJlX2ZlbmNlICE9IC0xKSB7CisgICAgICAgICAgIHJjID0gc3luY193YWl0KG91dHB1dC5hY3F1aXJlX2ZlbmNlLCBUSU1FT1VUX05FVkVSKTsKKyAgICAgICAgICAgY2xvc2Uob3V0cHV0LmFjcXVpcmVfZmVuY2UpOworICAgICAgICAgICBpZiAocmMgIT0gT0spIHsKKyAgICAgICAgICAgICAgTE9HRSgic3luYyB3YWl0IGZhaWxlZCAlZCIsIHJjKTsKKyAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RyZWFtSUQuc3RyZWFtSURbc3RyZWFtSUQubnVtX3N0cmVhbXNdID0KKyAgICAgICAgICAgIGNoYW5uZWwtPmdldFN0cmVhbUlEKGNoYW5uZWwtPmdldFN0cmVhbVR5cGVNYXNrKCkpOworICAgICAgICBzdHJlYW1JRC5udW1fc3RyZWFtcysrOworCisgICAgICAgIGlmICgoMVUgPDwgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPKSA9PSBjaGFubmVsLT5nZXRTdHJlYW1UeXBlTWFzaygpKSB7CisgICAgICAgICAgICBpc1ZpZEJ1ZlJlcXVlc3RlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYmxvYl9yZXF1ZXN0KSB7CisgICAgICAgIEtQSV9BVFJBQ0VfSU5UKCJTTkFQU0hPVCIsIDEpOworICAgIH0KKyAgICBpZiAoYmxvYl9yZXF1ZXN0ICYmIG1SYXdEdW1wQ2hhbm5lbCkgeworICAgICAgICBMT0dEKCJUcmlnZ2VyIFJhdyBiYXNlZCBvbiBibG9iIHJlcXVlc3QgaWYgUmF3IGR1bXAgaXMgZW5hYmxlZCIpOworICAgICAgICBzdHJlYW1JRC5zdHJlYW1JRFtzdHJlYW1JRC5udW1fc3RyZWFtc10gPQorICAgICAgICAgICAgbVJhd0R1bXBDaGFubmVsLT5nZXRTdHJlYW1JRChtUmF3RHVtcENoYW5uZWwtPmdldFN0cmVhbVR5cGVNYXNrKCkpOworICAgICAgICBzdHJlYW1JRC5udW1fc3RyZWFtcysrOworICAgIH0KKworICAgIGlmKHJlcXVlc3QtPmlucHV0X2J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIC8qIFBhcnNlIHRoZSBzZXR0aW5nczoKKyAgICAgICAgICogLSBGb3IgZXZlcnkgcmVxdWVzdCBpbiBOT1JNQUwgTU9ERQorICAgICAgICAgKiAtIEZvciBldmVyeSByZXF1ZXN0IGluIEhGUiBtb2RlIGR1cmluZyBwcmV2aWV3IG9ubHkgY2FzZQorICAgICAgICAgKiAtIEZvciBmaXJzdCByZXF1ZXN0IG9mIGV2ZXJ5IGJhdGNoIGluIEhGUiBtb2RlIGR1cmluZyB2aWRlbworICAgICAgICAgKiByZWNvcmRpbmcuIEluIGJhdGNobW9kZSB0aGUgc2FtZSBzZXR0aW5ncyBleGNlcHQgZnJhbWUgbnVtYmVyIGlzCisgICAgICAgICAqIHJlcGVhdGVkIGluIGVhY2ggcmVxdWVzdCBvZiB0aGUgYmF0Y2guCisgICAgICAgICAqLworICAgICAgICBpZiAoIW1CYXRjaFNpemUgfHwKKyAgICAgICAgICAgKG1CYXRjaFNpemUgJiYgIWlzVmlkQnVmUmVxdWVzdGVkKSB8fAorICAgICAgICAgICAobUJhdGNoU2l6ZSAmJiBpc1ZpZEJ1ZlJlcXVlc3RlZCAmJiAhbVRvQmVRdWV1ZWRWaWRCdWZzKSkgeworICAgICAgICAgICAgcmMgPSBzZXRGcmFtZVBhcmFtZXRlcnMocmVxdWVzdCwgc3RyZWFtSUQsIGJsb2JfcmVxdWVzdCwgc25hcHNob3RTdHJlYW1JZCk7CisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiZmFpbCB0byBzZXQgZnJhbWUgcGFyYW1ldGVycyIpOworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBGb3IgYmF0Y2hNb2RlIEhGUiwgc2V0RnJhbWVQYXJhbWV0ZXJzIGlzIG5vdCBjYWxsZWQgZm9yIGV2ZXJ5CisgICAgICAgICAqIHJlcXVlc3QuIEJ1dCBvbmx5IGZyYW1lIG51bWJlciBvZiB0aGUgbGF0ZXN0IHJlcXVlc3QgaXMgcGFyc2VkLgorICAgICAgICAgKiBLZWVwIHRyYWNrIG9mIGZpcnN0IGFuZCBsYXN0IGZyYW1lIG51bWJlcnMgaW4gYSBiYXRjaCBzbyB0aGF0CisgICAgICAgICAqIG1ldGFkYXRhIGZvciB0aGUgZnJhbWUgbnVtYmVycyBvZiBiYXRjaCBjYW4gYmUgZHVwbGljYXRlZCBpbgorICAgICAgICAgKiBoYW5kbGVCYXRjaE1ldGFkdGEgKi8KKyAgICAgICAgaWYgKG1CYXRjaFNpemUpIHsKKyAgICAgICAgICAgIGlmICghbVRvQmVRdWV1ZWRWaWRCdWZzKSB7CisgICAgICAgICAgICAgICAgLy9zdGFydCBvZiB0aGUgYmF0Y2gKKyAgICAgICAgICAgICAgICBtRmlyc3RGcmFtZU51bWJlckluQmF0Y2ggPSByZXF1ZXN0LT5mcmFtZV9udW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1QYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRlJBTUVfTlVNQkVSLCByZXF1ZXN0LT5mcmFtZV9udW1iZXIpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCB0aGUgZnJhbWUgbnVtYmVyIGluIHRoZSBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobU5lZWRTZW5zb3JSZXN0YXJ0KSB7CisgICAgICAgICAgICAvKiBVbmxvY2sgdGhlIG11dGV4IGFzIHJlc3RhcnRTZW5zb3Igd2FpdHMgb24gdGhlIGNoYW5uZWxzIHRvIGJlCisgICAgICAgICAgICAgKiBzdG9wcGVkLCB3aGljaCBpbiB0dXJuIGNhbGxzIHN0cmVhbSBjYWxsYmFjayBmdW5jdGlvbnMgLQorICAgICAgICAgICAgICogaGFuZGxlQnVmZmVyV2l0aExvY2sgYW5kIGhhbmRsZU1ldGFkYXRhV2l0aExvY2sgKi8KKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgcmMgPSBkeW5hbWljVXBkYXRlTWV0YVN0cmVhbUluZm8oKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIExPR0UoIlJlc3RhcnRpbmcgdGhlIHNlbnNvciBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU5lZWRTZW5zb3JSZXN0YXJ0ID0gZmFsc2U7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworCisgICAgICAgIGlmIChyZXF1ZXN0LT5pbnB1dF9idWZmZXItPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKKyAgICAgICAgICAgcmMgPSBzeW5jX3dhaXQocmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5hY3F1aXJlX2ZlbmNlLCBUSU1FT1VUX05FVkVSKTsKKyAgICAgICAgICAgY2xvc2UocmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5hY3F1aXJlX2ZlbmNlKTsKKyAgICAgICAgICAgaWYgKHJjICE9IE9LKSB7CisgICAgICAgICAgICAgIExPR0UoImlucHV0IGJ1ZmZlciBzeW5jIHdhaXQgZmFpbGVkICVkIiwgcmMpOworICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUNhcHR1cmVJbnRlbnQgPT0gQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX0NVU1RPTSkgeworICAgICAgICBtTGFzdEN1c3RJbnRlbnRGcm1OdW0gPSBmcmFtZU51bWJlcjsKKyAgICB9CisgICAgLyogVXBkYXRlIHBlbmRpbmcgcmVxdWVzdCBsaXN0IGFuZCBwZW5kaW5nIGJ1ZmZlcnMgbWFwICovCisgICAgUGVuZGluZ1JlcXVlc3RJbmZvIHBlbmRpbmdSZXF1ZXN0OworICAgIHBlbmRpbmdSZXF1ZXN0SXRlcmF0b3IgbGF0ZXN0UmVxdWVzdDsKKyAgICBwZW5kaW5nUmVxdWVzdC5mcmFtZV9udW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICBwZW5kaW5nUmVxdWVzdC5udW1fYnVmZmVycyA9IHJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVyczsKKyAgICBwZW5kaW5nUmVxdWVzdC5yZXF1ZXN0X2lkID0gcmVxdWVzdF9pZDsKKyAgICBwZW5kaW5nUmVxdWVzdC5ibG9iX3JlcXVlc3QgPSBibG9iX3JlcXVlc3Q7CisgICAgcGVuZGluZ1JlcXVlc3QudGltZXN0YW1wID0gMDsKKyAgICBwZW5kaW5nUmVxdWVzdC5iVXJnZW50UmVjZWl2ZWQgPSAwOworICAgIGlmIChyZXF1ZXN0LT5pbnB1dF9idWZmZXIpIHsKKyAgICAgICAgcGVuZGluZ1JlcXVlc3QuaW5wdXRfYnVmZmVyID0KKyAgICAgICAgICAgICAgICAoY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QqKW1hbGxvYyhzaXplb2YoY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QpKTsKKyAgICAgICAgKihwZW5kaW5nUmVxdWVzdC5pbnB1dF9idWZmZXIpID0gKihyZXF1ZXN0LT5pbnB1dF9idWZmZXIpOworICAgICAgICBwSW5wdXRCdWZmZXIgPSBwZW5kaW5nUmVxdWVzdC5pbnB1dF9idWZmZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICBwZW5kaW5nUmVxdWVzdC5pbnB1dF9idWZmZXIgPSBOVUxMOworICAgICAgIHBJbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgcGVuZGluZ1JlcXVlc3QucGlwZWxpbmVfZGVwdGggPSAwOworICAgIHBlbmRpbmdSZXF1ZXN0LnBhcnRpYWxfcmVzdWx0X2NudCA9IDA7CisgICAgZXh0cmFjdEpwZWdNZXRhZGF0YShtQ3VySnBlZ01ldGEsIHJlcXVlc3QpOworICAgIHBlbmRpbmdSZXF1ZXN0LmpwZWdNZXRhZGF0YSA9IG1DdXJKcGVnTWV0YTsKKyAgICBwZW5kaW5nUmVxdWVzdC5zZXR0aW5ncyA9IHNhdmVSZXF1ZXN0U2V0dGluZ3MobUN1ckpwZWdNZXRhLCByZXF1ZXN0KTsKKyAgICBwZW5kaW5nUmVxdWVzdC5zaHV0dGVyX25vdGlmaWVkID0gZmFsc2U7CisKKyAgICAvL2V4dHJhY3QgY2FwdHVyZSBpbnRlbnQKKyAgICBpZiAobWV0YS5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UKSkgeworICAgICAgICBtQ2FwdHVyZUludGVudCA9CisgICAgICAgICAgICAgICAgbWV0YS5maW5kKEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCkuZGF0YS51OFswXTsKKyAgICB9CisgICAgcGVuZGluZ1JlcXVlc3QuY2FwdHVyZV9pbnRlbnQgPSBtQ2FwdHVyZUludGVudDsKKworICAgIC8vZXh0cmFjdCBDQUMgaW5mbworICAgIGlmIChtZXRhLmV4aXN0cyhBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFKSkgeworICAgICAgICBtQ2FjTW9kZSA9CisgICAgICAgICAgICAgICAgbWV0YS5maW5kKEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX01PREUpLmRhdGEudThbMF07CisgICAgfQorICAgIHBlbmRpbmdSZXF1ZXN0LmZ3a0NhY01vZGUgPSBtQ2FjTW9kZTsKKworICAgIFBlbmRpbmdCdWZmZXJzSW5SZXF1ZXN0IGJ1ZnNGb3JDdXJSZXF1ZXN0OworICAgIGJ1ZnNGb3JDdXJSZXF1ZXN0LmZyYW1lX251bWJlciA9IGZyYW1lTnVtYmVyOworICAgIC8vIE1hcmsgY3VycmVudCB0aW1lc3RhbXAgZm9yIHRoZSBuZXcgcmVxdWVzdAorICAgIGJ1ZnNGb3JDdXJSZXF1ZXN0LnRpbWVzdGFtcCA9IHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzOyBpKyspIHsKKyAgICAgICAgUmVxdWVzdGVkQnVmZmVySW5mbyByZXF1ZXN0ZWRCdWY7CisgICAgICAgIG1lbXNldCgmcmVxdWVzdGVkQnVmLCAwLCBzaXplb2YocmVxdWVzdGVkQnVmKSk7CisgICAgICAgIHJlcXVlc3RlZEJ1Zi5zdHJlYW0gPSByZXF1ZXN0LT5vdXRwdXRfYnVmZmVyc1tpXS5zdHJlYW07CisgICAgICAgIHJlcXVlc3RlZEJ1Zi5idWZmZXIgPSBOVUxMOworICAgICAgICBwZW5kaW5nUmVxdWVzdC5idWZmZXJzLnB1c2hfYmFjayhyZXF1ZXN0ZWRCdWYpOworCisgICAgICAgIC8vIEFkZCB0byBidWZmZXIgaGFuZGxlIHRoZSBwZW5kaW5nIGJ1ZmZlcnMgbGlzdAorICAgICAgICBQZW5kaW5nQnVmZmVySW5mbyBidWZmZXJJbmZvOworICAgICAgICBidWZmZXJJbmZvLmJ1ZmZlciA9IHJlcXVlc3QtPm91dHB1dF9idWZmZXJzW2ldLmJ1ZmZlcjsKKyAgICAgICAgYnVmZmVySW5mby5zdHJlYW0gPSByZXF1ZXN0LT5vdXRwdXRfYnVmZmVyc1tpXS5zdHJlYW07CisgICAgICAgIGJ1ZnNGb3JDdXJSZXF1ZXN0Lm1QZW5kaW5nQnVmZmVyTGlzdC5wdXNoX2JhY2soYnVmZmVySW5mbyk7CisgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqY2hhbm5lbCA9IChRQ2FtZXJhM0NoYW5uZWwgKilidWZmZXJJbmZvLnN0cmVhbS0+cHJpdjsKKyAgICAgICAgTE9HRCgiZnJhbWUgPSAlZCwgYnVmZmVyID0gJXAsIHN0cmVhbVR5cGVNYXNrID0gJWQsIHN0cmVhbSBmb3JtYXQgPSAlZCIsCisgICAgICAgICAgICBmcmFtZU51bWJlciwgYnVmZmVySW5mby5idWZmZXIsCisgICAgICAgICAgICBjaGFubmVsLT5nZXRTdHJlYW1UeXBlTWFzaygpLCBidWZmZXJJbmZvLnN0cmVhbS0+Zm9ybWF0KTsKKyAgICB9CisgICAgLy8gQWRkIHRoaXMgcmVxdWVzdCBwYWNrZXQgaW50byBtUGVuZGluZ0J1ZmZlcnNNYXAKKyAgICBtUGVuZGluZ0J1ZmZlcnNNYXAubVBlbmRpbmdCdWZmZXJzSW5SZXF1ZXN0LnB1c2hfYmFjayhidWZzRm9yQ3VyUmVxdWVzdCk7CisgICAgTE9HRCgibVBlbmRpbmdCdWZmZXJzTWFwLm51bV9vdmVyYWxsX2J1ZmZlcnMgPSAlZCIsCisgICAgICAgIG1QZW5kaW5nQnVmZmVyc01hcC5nZXRfbnVtX292ZXJhbGxfYnVmZmVycygpKTsKKworICAgIGxhdGVzdFJlcXVlc3QgPSBtUGVuZGluZ1JlcXVlc3RzTGlzdC5pbnNlcnQoCisgICAgICAgICAgICBtUGVuZGluZ1JlcXVlc3RzTGlzdC5lbmQoKSwgcGVuZGluZ1JlcXVlc3QpOworICAgIGlmKG1GbHVzaCkgeworICAgICAgICBMT0dJKCJtRmx1c2ggaXMgdHJ1ZSIpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIC8vIE5vdGlmeSBtZXRhZGF0YSBjaGFubmVsIHdlIHJlY2VpdmUgYSByZXF1ZXN0CisgICAgbU1ldGFkYXRhQ2hhbm5lbC0+cmVxdWVzdChOVUxMLCBmcmFtZU51bWJlcik7CisKKyAgICBpZihyZXF1ZXN0LT5pbnB1dF9idWZmZXIgIT0gTlVMTCl7CisgICAgICAgIExPR0QoIklucHV0IHJlcXVlc3QsIGZyYW1lX251bWJlciAlZCIsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgcmMgPSBzZXRSZXByb2NQYXJhbWV0ZXJzKHJlcXVlc3QsICZtUmVwcm9jTWV0YSwgc25hcHNob3RTdHJlYW1JZCk7CisgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgTE9HRSgiZmFpbCB0byBzZXQgcmVwcm9jIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2FsbCByZXF1ZXN0IG9uIG90aGVyIHN0cmVhbXMKKyAgICB1aW50MzJfdCBzdHJlYW1zX25lZWRfbWV0YWRhdGEgPSAwOworICAgIHBlbmRpbmdCdWZmZXJJdGVyYXRvciBwZW5kaW5nQnVmZmVySXRlciA9IGxhdGVzdFJlcXVlc3QtPmJ1ZmZlcnMuYmVnaW4oKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVyczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90JiBvdXRwdXQgPSByZXF1ZXN0LT5vdXRwdXRfYnVmZmVyc1tpXTsKKyAgICAgICAgUUNhbWVyYTNDaGFubmVsICpjaGFubmVsID0gKFFDYW1lcmEzQ2hhbm5lbCAqKW91dHB1dC5zdHJlYW0tPnByaXY7CisKKyAgICAgICAgaWYgKGNoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HVygiaW52YWxpZCBjaGFubmVsIHBvaW50ZXIgZm9yIHN0cmVhbSIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0cHV0LnN0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgTE9HRCgic25hcHNob3QgcmVxdWVzdCB3aXRoIG91dHB1dCBidWZmZXIgJXAsIGlucHV0IGJ1ZmZlciAlcCwgZnJhbWVfbnVtYmVyICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYnVmZmVyLCByZXF1ZXN0LT5pbnB1dF9idWZmZXIsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIGlmKHJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBOVUxMKXsKKyAgICAgICAgICAgICAgICByYyA9IGNoYW5uZWwtPnJlcXVlc3Qob3V0cHV0LmJ1ZmZlciwgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmZXIsICZtUmVwcm9jTWV0YSk7CisgICAgICAgICAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsIHRvIHJlcXVlc3Qgb24gcGljdHVyZSBjaGFubmVsIik7CisgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJzbmFwc2hvdCByZXF1ZXN0IHdpdGggYnVmZmVyICVwLCBmcmFtZV9udW1iZXIgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5idWZmZXIsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3QtPnNldHRpbmdzKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gY2hhbm5lbC0+cmVxdWVzdChvdXRwdXQuYnVmZmVyLCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBtUHJldlBhcmFtZXRlcnMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gY2hhbm5lbC0+cmVxdWVzdChvdXRwdXQuYnVmZmVyLCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBtUGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiRmFpbCB0byByZXF1ZXN0IG9uIHBpY3R1cmUgY2hhbm5lbCIpOworICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZW5kaW5nQnVmZmVySXRlci0+bmVlZF9tZXRhZGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RyZWFtc19uZWVkX21ldGFkYXRhKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0LnN0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCkgeworICAgICAgICAgICAgYm9vbCBuZWVkTWV0YWRhdGEgPSBmYWxzZTsKKyAgICAgICAgICAgIFFDYW1lcmEzWVVWQ2hhbm5lbCAqeXV2Q2hhbm5lbCA9IChRQ2FtZXJhM1lVVkNoYW5uZWwgKiljaGFubmVsOworICAgICAgICAgICAgcmMgPSB5dXZDaGFubmVsLT5yZXF1ZXN0KG91dHB1dC5idWZmZXIsIGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBwSW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIChwSW5wdXRCdWZmZXIgPyAmbVJlcHJvY01ldGEgOiBtUGFyYW1ldGVycyksIG5lZWRNZXRhZGF0YSk7CisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRmFpbCB0byByZXF1ZXN0IG9uIFlVViBjaGFubmVsIik7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGVuZGluZ0J1ZmZlckl0ZXItPm5lZWRfbWV0YWRhdGEgPSBuZWVkTWV0YWRhdGE7CisgICAgICAgICAgICBpZiAobmVlZE1ldGFkYXRhKQorICAgICAgICAgICAgICAgIHN0cmVhbXNfbmVlZF9tZXRhZGF0YSArPSAxOworICAgICAgICAgICAgTE9HRCgiY2FsbGluZyBZVVYgY2hhbm5lbCByZXF1ZXN0LCBuZWVkX21ldGFkYXRhIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIG5lZWRNZXRhZGF0YSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dEKCJyZXF1ZXN0IHdpdGggYnVmZmVyICVwLCBmcmFtZV9udW1iZXIgJWQiLAorICAgICAgICAgICAgICAgICAgb3V0cHV0LmJ1ZmZlciwgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgcmMgPSBjaGFubmVsLT5yZXF1ZXN0KG91dHB1dC5idWZmZXIsIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIGlmICgoKDFVIDw8IENBTV9TVFJFQU1fVFlQRV9WSURFTykgPT0gY2hhbm5lbC0+Z2V0U3RyZWFtVHlwZU1hc2soKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUJhdGNoU2l6ZSkgeworICAgICAgICAgICAgICAgIG1Ub0JlUXVldWVkVmlkQnVmcysrOworICAgICAgICAgICAgICAgIGlmIChtVG9CZVF1ZXVlZFZpZEJ1ZnMgPT0gbUJhdGNoU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBjaGFubmVsLT5xdWV1ZUJhdGNoQnVmKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoInJlcXVlc3QgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHBlbmRpbmdCdWZmZXJJdGVyKys7CisgICAgfQorCisgICAgLy9JZiAyIHN0cmVhbXMgaGF2ZSBuZWVkX21ldGFkYXRhIHNldCB0byB0cnVlLCBmYWlsIHRoZSByZXF1ZXN0LCB1bmxlc3MKKyAgICAvL3dlIGNvcHkvcmVmZXJlbmNlIGNvdW50IHRoZSBtZXRhZGF0YSBidWZmZXIKKyAgICBpZiAoc3RyZWFtc19uZWVkX21ldGFkYXRhID4gMSkgeworICAgICAgICBMT0dFKCJub3Qgc3VwcG9ydGluZyByZXF1ZXN0IGluIHdoaWNoIHR3byBzdHJlYW1zIHJlcXVpcmVzIgorICAgICAgICAgICAgICAgICIgMiBIQUwgbWV0YWRhdGEgZm9yIHJlcHJvY2Vzc2luZyIpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYocmVxdWVzdC0+aW5wdXRfYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgLyogU2V0IHRoZSBwYXJhbWV0ZXJzIHRvIGJhY2tlbmQ6CisgICAgICAgICAqIC0gRm9yIGV2ZXJ5IHJlcXVlc3QgaW4gTk9STUFMIE1PREUKKyAgICAgICAgICogLSBGb3IgZXZlcnkgcmVxdWVzdCBpbiBIRlIgbW9kZSBkdXJpbmcgcHJldmlldyBvbmx5IGNhc2UKKyAgICAgICAgICogLSBPbmNlIGV2ZXJ5IGJhdGNoIGluIEhGUiBtb2RlIGR1cmluZyB2aWRlbyByZWNvcmRpbmcKKyAgICAgICAgICovCisgICAgICAgIGlmICghbUJhdGNoU2l6ZSB8fAorICAgICAgICAgICAobUJhdGNoU2l6ZSAmJiAhaXNWaWRCdWZSZXF1ZXN0ZWQpIHx8CisgICAgICAgICAgIChtQmF0Y2hTaXplICYmIGlzVmlkQnVmUmVxdWVzdGVkICYmIChtVG9CZVF1ZXVlZFZpZEJ1ZnMgPT0gbUJhdGNoU2l6ZSkpKSB7CisgICAgICAgICAgICBMT0dEKCJzZXRfcGFybXMgIGJhdGNoU3o6ICVkIElzVmlkQnVmUmVxOiAlZCB2aWRCdWZUb2JlUWQ6ICVkICIsCisgICAgICAgICAgICAgICAgICAgICBtQmF0Y2hTaXplLCBpc1ZpZEJ1ZlJlcXVlc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgbVRvQmVRdWV1ZWRWaWRCdWZzKTsKKyAgICAgICAgICAgIHJjID0gbUNhbWVyYUhhbmRsZS0+b3BzLT5zZXRfcGFybXMobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMpOworICAgICAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoInNldF9wYXJtcyBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHJlc2V0IHRvIHplcm8gY296LCB0aGUgYmF0Y2ggaXMgcXVldWVkICovCisgICAgICAgICAgICBtVG9CZVF1ZXVlZFZpZEJ1ZnMgPSAwOworICAgICAgICAgICAgbVBlbmRpbmdCYXRjaE1hcC5hZGQoZnJhbWVOdW1iZXIsIG1GaXJzdEZyYW1lTnVtYmVySW5CYXRjaCk7CisgICAgICAgIH0KKyAgICAgICAgbVBlbmRpbmdMaXZlUmVxdWVzdCsrOworICAgIH0KKworICAgIExPR0QoIm1QZW5kaW5nTGl2ZVJlcXVlc3QgPSAlZCIsIG1QZW5kaW5nTGl2ZVJlcXVlc3QpOworCisgICAgbVN0YXRlID0gU1RBUlRFRDsKKyAgICAvLyBBZGRlZCBhIHRpbWVkIGNvbmRpdGlvbiB3YWl0CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIHVpbnQ4X3QgaXNWYWxpZFRpbWVvdXQgPSAxOworICAgIHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICBpc1ZhbGlkVGltZW91dCA9IDA7CisgICAgICBMT0dFKCJFcnJvciByZWFkaW5nIHRoZSByZWFsIHRpbWUgY2xvY2shISIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8vIE1ha2UgdGltZW91dCBhcyA1IHNlYyBmb3IgcmVxdWVzdCB0byBiZSBob25vcmVkCisgICAgICB0cy50dl9zZWMgKz0gNTsKKyAgICB9CisgICAgLy9CbG9jayBvbiBjb25kaXRpb25hbCB2YXJpYWJsZQorICAgIHdoaWxlICgobVBlbmRpbmdMaXZlUmVxdWVzdCA+PSBtTWluSW5GbGlnaHRSZXF1ZXN0cykgJiYgIXBJbnB1dEJ1ZmZlciAmJgorICAgICAgICAgICAgKG1TdGF0ZSAhPSBFUlJPUikgJiYgKG1TdGF0ZSAhPSBERUlOSVQpKSB7CisgICAgICAgIGlmICghaXNWYWxpZFRpbWVvdXQpIHsKKyAgICAgICAgICAgIExPR0QoIkJsb2NraW5nIG9uIGNvbmRpdGlvbmFsIHdhaXQiKTsKKyAgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZtUmVxdWVzdENvbmQsICZtTXV0ZXgpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTE9HRCgiQmxvY2tpbmcgb24gdGltZWQgY29uZGl0aW9uYWwgd2FpdCIpOworICAgICAgICAgICAgcmMgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZtUmVxdWVzdENvbmQsICZtTXV0ZXgsICZ0cyk7CisgICAgICAgICAgICBpZiAocmMgPT0gRVRJTUVET1VUKSB7CisgICAgICAgICAgICAgICAgcmMgPSAtRU5PREVWOworICAgICAgICAgICAgICAgIExPR0UoIlVuYmxvY2tlZCBvbiB0aW1lb3V0ISEhISIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIExPR0QoIlVuYmxvY2tlZCIpOworICAgICAgICBpZiAobVdva2VuVXBCeURhZW1vbikgeworICAgICAgICAgICAgbVdva2VuVXBCeURhZW1vbiA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1QZW5kaW5nTGl2ZVJlcXVlc3QgPCBtTWF4SW5GbGlnaHRSZXF1ZXN0cykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkdW1wCisgKgorICogREVTQ1JJUFRJT046CisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICoKKyAqIFJFVFVSTiAgICAgOgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmR1bXAoaW50IGZkKQoreworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKKyAgICBkcHJpbnRmKGZkLCAiXG4gQ2FtZXJhIEhBTDMgaW5mb3JtYXRpb24gQmVnaW4gXG4iKTsKKworICAgIGRwcmludGYoZmQsICJcbk51bWJlciBvZiBwZW5kaW5nIHJlcXVlc3RzOiAlenUgXG4iLAorICAgICAgICBtUGVuZGluZ1JlcXVlc3RzTGlzdC5zaXplKCkpOworICAgIGRwcmludGYoZmQsICItLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgZHByaW50ZihmZCwgIiBGcmFtZSB8IE51bWJlciBvZiBCdWZmZXJzIHwgICBSZXEgSWQ6ICAgfCBCbG9iIFJlcSB8IElucHV0IGJ1ZmZlciBwcmVzZW50XG4iKTsKKyAgICBkcHJpbnRmKGZkLCAiLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIGZvcihwZW5kaW5nUmVxdWVzdEl0ZXJhdG9yIGkgPSBtUGVuZGluZ1JlcXVlc3RzTGlzdC5iZWdpbigpOworICAgICAgICAgICAgaSAhPSBtUGVuZGluZ1JlcXVlc3RzTGlzdC5lbmQoKTsgaSsrKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgJTVkIHwgJTE3ZCB8ICUxMWQgfCAlOGQgfCAlcCBcbiIsCisgICAgICAgIGktPmZyYW1lX251bWJlciwgaS0+bnVtX2J1ZmZlcnMsIGktPnJlcXVlc3RfaWQsIGktPmJsb2JfcmVxdWVzdCwKKyAgICAgICAgaS0+aW5wdXRfYnVmZmVyKTsKKyAgICB9CisgICAgZHByaW50ZihmZCwgIlxuUGVuZGluZyBidWZmZXIgbWFwOiBOdW1iZXIgb2YgYnVmZmVyczogJXVcbiIsCisgICAgICAgICAgICAgICAgbVBlbmRpbmdCdWZmZXJzTWFwLmdldF9udW1fb3ZlcmFsbF9idWZmZXJzKCkpOworICAgIGRwcmludGYoZmQsICItLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgZHByaW50ZihmZCwgIiBGcmFtZSB8IFN0cmVhbSB0eXBlIG1hc2sgXG4iKTsKKyAgICBkcHJpbnRmKGZkLCAiLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICAgIGZvcihhdXRvICZyZXEgOiBtUGVuZGluZ0J1ZmZlcnNNYXAubVBlbmRpbmdCdWZmZXJzSW5SZXF1ZXN0KSB7CisgICAgICAgIGZvcihhdXRvICZqIDogcmVxLm1QZW5kaW5nQnVmZmVyTGlzdCkgeworICAgICAgICAgICAgUUNhbWVyYTNDaGFubmVsICpjaGFubmVsID0gKFFDYW1lcmEzQ2hhbm5lbCAqKShqLnN0cmVhbS0+cHJpdik7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiICU1ZCB8ICUxMWQgXG4iLAorICAgICAgICAgICAgICAgICAgICByZXEuZnJhbWVfbnVtYmVyLCBjaGFubmVsLT5nZXRTdHJlYW1UeXBlTWFzaygpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBkcHJpbnRmKGZkLCAiLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisgICAgZHByaW50ZihmZCwgIlxuUGVuZGluZyBmcmFtZSBkcm9wIGxpc3Q6ICV6dVxuIiwKKyAgICAgICAgbVBlbmRpbmdGcmFtZURyb3BMaXN0LnNpemUoKSk7CisgICAgZHByaW50ZihmZCwgIi0tLS0tLS0rLS0tLS0tLS0tLS1cbiIpOworICAgIGRwcmludGYoZmQsICIgRnJhbWUgfCBTdHJlYW0gSUQgXG4iKTsKKyAgICBkcHJpbnRmKGZkLCAiLS0tLS0tLSstLS0tLS0tLS0tLVxuIik7CisgICAgZm9yKExpc3Q8UGVuZGluZ0ZyYW1lRHJvcEluZm8+OjppdGVyYXRvciBpID0gbVBlbmRpbmdGcmFtZURyb3BMaXN0LmJlZ2luKCk7CisgICAgICAgIGkgIT0gbVBlbmRpbmdGcmFtZURyb3BMaXN0LmVuZCgpOyBpKyspIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAlNWQgfCAlOWQgXG4iLAorICAgICAgICAgICAgaS0+ZnJhbWVfbnVtYmVyLCBpLT5zdHJlYW1fSUQpOworICAgIH0KKyAgICBkcHJpbnRmKGZkLCAiLS0tLS0tLSstLS0tLS0tLS0tLVxuIik7CisKKyAgICBkcHJpbnRmKGZkLCAiXG4gQ2FtZXJhIEhBTDMgaW5mb3JtYXRpb24gRW5kIFxuIik7CisKKyAgICAvKiB1c2UgZHVtcHN5cyBtZWRpYS5jYW1lcmEgYXMgdHJpZ2dlciB0byBzZW5kIHVwZGF0ZSBkZWJ1ZyBsZXZlbCBldmVudCAqLworICAgIG1VcGRhdGVEZWJ1Z0xldmVsID0gdHJ1ZTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICByZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZmx1c2gKKyAqCisgKiBERVNDUklQVElPTjogQ2FsbHMgc3RvcEFsbENoYW5uZWxzLCBub3RpZnlFcnJvckZvclBlbmRpbmdSZXF1ZXN0cyBhbmQKKyAqICAgICAgICAgICAgICBjb25kaXRpb25hbGx5IHJlc3RhcnRzIGNoYW5uZWxzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgQCByZXN0YXJ0Q2hhbm5lbHM6IHJlLXN0YXJ0IGFsbCBjaGFubmVscworICoKKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqICAgICAgICAgIDAgb24gc3VjY2VzcworICogICAgICAgICAgRXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpmbHVzaChib29sIHJlc3RhcnRDaGFubmVscykKK3sKKyAgICBLUElfQVRSQUNFX0NBTEwoKTsKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBMT0dEKCJVbmJsb2NraW5nIFByb2Nlc3MgQ2FwdHVyZSBSZXF1ZXN0Iik7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworICAgIG1GbHVzaCA9IHRydWU7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisKKyAgICByYyA9IHN0b3BBbGxDaGFubmVscygpOworICAgIC8vIHVubGluayBvZiBkdWFsY2FtCisgICAgaWYgKG1Jc0RldmljZUxpbmtlZCkgeworICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT5zeW5jX2NvbnRyb2wgPSBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT0ZGOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdDYW1Mb2NrKTsKKworICAgICAgICBpZiAobUlzTWFpbkNhbWVyYSA9PSAxKSB7CisgICAgICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT5tb2RlID0gQ0FNX01PREVfUFJJTUFSWTsKKyAgICAgICAgICAgIG1fcFJlbENhbVN5bmNCdWYtPnR5cGUgPSBDQU1fVFlQRV9NQUlOOworICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+c3luY18zYV9tb2RlID0gQ0FNXzNBX1NZTkNfRk9MTE9XOworICAgICAgICAgICAgLy8gcmVsYXRlZCBzZXNzaW9uIGlkIHNob3VsZCBiZSBzZXNzaW9uIGlkIG9mIGxpbmtlZCBzZXNzaW9uCisgICAgICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT5yZWxhdGVkX3NlbnNvcl9zZXNzaW9uX2lkID0gc2Vzc2lvbklkW21MaW5rZWRDYW1lcmFJZF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX3BSZWxDYW1TeW5jQnVmLT5tb2RlID0gQ0FNX01PREVfU0VDT05EQVJZOworICAgICAgICAgICAgbV9wUmVsQ2FtU3luY0J1Zi0+dHlwZSA9IENBTV9UWVBFX0FVWDsKKyAgICAgICAgICAgIG1fcFJlbENhbVN5bmNCdWYtPnN5bmNfM2FfbW9kZSA9IENBTV8zQV9TWU5DX0ZPTExPVzsKKyAgICAgICAgICAgIG1fcFJlbENhbVN5bmNCdWYtPnJlbGF0ZWRfc2Vuc29yX3Nlc3Npb25faWQgPSBzZXNzaW9uSWRbbUxpbmtlZENhbWVyYUlkXTsKKyAgICAgICAgfQorICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0NhbUxvY2spOworCisgICAgICAgIHJjID0gbUNhbWVyYUhhbmRsZS0+b3BzLT5zeW5jX3JlbGF0ZWRfc2Vuc29ycygKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLCBtX3BSZWxDYW1TeW5jQnVmKTsKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiRHVhbGNhbTogVW5saW5rIGZhaWxlZCwgYnV0IHN0aWxsIHByb2NlZWQgdG8gY2xvc2UiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgic3RvcEFsbENoYW5uZWxzIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIGlmIChtQ2hhbm5lbEhhbmRsZSkgeworICAgICAgICBtQ2FtZXJhSGFuZGxlLT5vcHMtPnN0b3BfY2hhbm5lbChtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlKTsKKyAgICB9CisKKyAgICAvLyBSZXNldCBidW5kbGUgaW5mbworICAgIHJjID0gc2V0QnVuZGxlSW5mbygpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgic2V0QnVuZGxlSW5mbyBmYWlsZWQgJWQiLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvLyBNdXRleCBMb2NrCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworCisgICAgLy8gVW5ibG9jayBwcm9jZXNzX2NhcHR1cmVfcmVxdWVzdAorICAgIG1QZW5kaW5nTGl2ZVJlcXVlc3QgPSAwOworICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJm1SZXF1ZXN0Q29uZCk7CisKKyAgICByYyA9IG5vdGlmeUVycm9yRm9yUGVuZGluZ1JlcXVlc3RzKCk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJub3RpZnlFcnJvckZvclBlbmRpbmdSZXF1ZXN0cyBmYWlsZWQiKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBtRmx1c2ggPSBmYWxzZTsKKworICAgIC8vIFN0YXJ0IHRoZSBTdHJlYW1zL0NoYW5uZWxzCisgICAgaWYgKHJlc3RhcnRDaGFubmVscykgeworICAgICAgICByYyA9IHN0YXJ0QWxsQ2hhbm5lbHMoKTsKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgTE9HRSgic3RhcnRBbGxDaGFubmVscyBmYWlsZWQiKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1DaGFubmVsSGFuZGxlKSB7CisgICAgICAgIG1DYW1lcmFIYW5kbGUtPm9wcy0+c3RhcnRfY2hhbm5lbChtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbEhhbmRsZSk7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIExPR0UoInN0YXJ0X2NoYW5uZWwgZmFpbGVkIik7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZmx1c2hQZXJmCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgaXMgdGhlIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiB2ZXJzaW9uIG9mIGZsdXNoIHRoYXQgZG9lcworICogICAgICAgICAgICAgIG5vdCB1c2Ugc3RyZWFtIG9mZiwgcmF0aGVyIGZsdXNoZXMgdGhlIHN5c3RlbQorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqCisgKiBSRVRVUk4gICAgIDogMCA6IHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtRUlOVkFMOiBpbnB1dCBpcyBtYWxmb3JtZWQgKGRldmljZSBpcyBub3QgdmFsaWQpCisgKiAgICAgICAgICAgICAgLUVOT0RFVjogaWYgdGhlIGRldmljZSBoYXMgZW5jb3VudGVyZWQgYSBzZXJpb3VzIGVycm9yCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpmbHVzaFBlcmYoKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgc3RydWN0IHRpbWVzcGVjIHRpbWVvdXQ7CisgICAgYm9vbCB0aW1lZF93YWl0ID0gZmFsc2U7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgbUZsdXNoUGVyZiA9IHRydWU7CisgICAgbVBlbmRpbmdCdWZmZXJzTWFwLm51bVBlbmRpbmdCdWZzQXRGbHVzaCA9CisgICAgICAgIG1QZW5kaW5nQnVmZmVyc01hcC5nZXRfbnVtX292ZXJhbGxfYnVmZmVycygpOworICAgIExPR0QoIkNhbGxpbmcgZmx1c2guIFdhaXQgZm9yICVkIGJ1ZmZlcnMgdG8gcmV0dXJuIiwKKyAgICAgICAgbVBlbmRpbmdCdWZmZXJzTWFwLm51bVBlbmRpbmdCdWZzQXRGbHVzaCk7CisKKyAgICAvKiBzZW5kIHRoZSBmbHVzaCBldmVudCB0byB0aGUgYmFja2VuZCAqLworICAgIHJjID0gbUNhbWVyYUhhbmRsZS0+b3BzLT5mbHVzaChtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoIkVycm9yIGluIGZsdXNoOiBJT0NUTCBmYWlsdXJlIik7CisgICAgICAgIG1GbHVzaFBlcmYgPSBmYWxzZTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIGlmIChtUGVuZGluZ0J1ZmZlcnNNYXAubnVtUGVuZGluZ0J1ZnNBdEZsdXNoID09IDApIHsKKyAgICAgICAgTE9HRCgiTm8gcGVuZGluZyBidWZmZXJzIGluIEhBTCwgcmV0dXJuIGZsdXNoIik7CisgICAgICAgIG1GbHVzaFBlcmYgPSBmYWxzZTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiB3YWl0IG9uIGEgc2lnbmFsIHRoYXQgYnVmZmVycyB3ZXJlIHJlY2VpdmVkICovCisgICAgcmMgPSBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdGltZW91dCk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJFcnJvciByZWFkaW5nIHRoZSByZWFsIHRpbWUgY2xvY2ssIGNhbm5vdCB1c2UgdGltZWQgd2FpdCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRpbWVvdXQudHZfc2VjICs9IEZMVVNIX1RJTUVPVVQ7CisgICAgICAgIHRpbWVkX3dhaXQgPSB0cnVlOworICAgIH0KKworICAgIC8vQmxvY2sgb24gY29uZGl0aW9uYWwgdmFyaWFibGUKKyAgICB3aGlsZSAobVBlbmRpbmdCdWZmZXJzTWFwLm51bVBlbmRpbmdCdWZzQXRGbHVzaCAhPSAwKSB7CisgICAgICAgIExPR0QoIldhaXRpbmcgb24gbUJ1ZmZlcnNDb25kIik7CisgICAgICAgIGlmICghdGltZWRfd2FpdCkgeworICAgICAgICAgICAgcmMgPSBwdGhyZWFkX2NvbmRfd2FpdCgmbUJ1ZmZlcnNDb25kLCAmbU11dGV4KTsKKyAgICAgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgIExPR0UoInB0aHJlYWRfY29uZF93YWl0IGZhaWxlZCBkdWUgdG8gcmMgPSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihyYykpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJjID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmbUJ1ZmZlcnNDb25kLCAmbU11dGV4LCAmdGltZW91dCk7CisgICAgICAgICAgICBpZiAocmMgIT0gMCkgeworICAgICAgICAgICAgICAgIExPR0UoInB0aHJlYWRfY29uZF90aW1lZHdhaXQgZmFpbGVkIGR1ZSB0byByYyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihyYykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIG1GbHVzaFBlcmYgPSBmYWxzZTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKworICAgIExPR0QoIlJlY2VpdmVkIGJ1ZmZlcnMsIG5vdyBzYWZlIHRvIHJldHVybiB0aGVtIik7CisKKyAgICAvL21ha2Ugc3VyZSB0aGUgY2hhbm5lbHMgaGFuZGxlIGZsdXNoCisgICAgLy9jdXJyZW50bHkgb25seSByZXF1aXJlZCBmb3IgdGhlIHBpY3R1cmUgY2hhbm5lbCB0byByZWxlYXNlIHNuYXBzaG90IHJlc291cmNlcworICAgIGZvciAoTGlzdDxzdHJlYW1faW5mb190ICo+OjppdGVyYXRvciBpdCA9IG1TdHJlYW1JbmZvLmJlZ2luKCk7CisgICAgICAgICAgICBpdCAhPSBtU3RyZWFtSW5mby5lbmQoKTsgaXQrKykgeworICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKmNoYW5uZWwgPSAoKml0KS0+Y2hhbm5lbDsKKyAgICAgICAgaWYgKGNoYW5uZWwpIHsKKyAgICAgICAgICAgIHJjID0gY2hhbm5lbC0+Zmx1c2goKTsKKyAgICAgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgICAgTE9HRSgiRmx1c2hpbmcgdGhlIGNoYW5uZWxzIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgcmMpOworICAgICAgICAgICAgICAgLy8gZXZlbiB0aG91Z2ggdGhlIGNoYW5uZWwgZmx1c2ggZmFpbGVkIHdlIG5lZWQgdG8gY29udGludWUgYW5kCisgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIGJ1ZmZlcnMgd2UgaGF2ZSB0byB0aGUgZnJhbWV3b3JrLCBob3dldmVyIHRoZSByZXR1cm4KKyAgICAgICAgICAgICAgIC8vIHZhbHVlIHdpbGwgYmUgYW4gZXJyb3IKKyAgICAgICAgICAgICAgIHJjID0gLUVOT0RFVjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG5vdGlmeSB0aGUgZnJhbWV3b3JrcyBhbmQgc2VuZCBlcnJvcmVkIHJlc3VsdHMgKi8KKyAgICByYyA9IG5vdGlmeUVycm9yRm9yUGVuZGluZ1JlcXVlc3RzKCk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJub3RpZnlFcnJvckZvclBlbmRpbmdSZXF1ZXN0cyBmYWlsZWQiKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvL3VuYmxvY2sgcHJvY2Vzc19jYXB0dXJlX3JlcXVlc3QKKyAgICBtUGVuZGluZ0xpdmVSZXF1ZXN0ID0gMDsKKyAgICB1bmJsb2NrUmVxdWVzdElmTmVjZXNzYXJ5KCk7CisKKyAgICBtRmx1c2hQZXJmID0gZmFsc2U7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgTE9HRCAoIkZsdXNoIE9wZXJhdGlvbiBjb21wbGV0ZS4gcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaGFuZGxlQ2FtZXJhRGV2aWNlRXJyb3IKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBjYWxscyBpbnRlcm5hbCBmbHVzaCBhbmQgbm90aWZpZXMgdGhlIGVycm9yIHRvCisgKiAgICAgICAgICAgICAgZnJhbWV3b3JrIGFuZCB1cGRhdGVzIHRoZSBzdGF0ZSB2YXJpYWJsZS4KKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOT19FUlJPUiBvbiBTdWNjZXNzCisgKiAgICAgICAgICAgICAgRXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6aGFuZGxlQ2FtZXJhRGV2aWNlRXJyb3IoKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKKyAgICBpZiAobVN0YXRlICE9IEVSUk9SKSB7CisgICAgICAgIC8vaWYgbVN0YXRlICE9IEVSUk9SLCBub3RoaW5nIHRvIGJlIGRvbmUKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisKKyAgICByYyA9IGZsdXNoKGZhbHNlIC8qIHJlc3RhcnQgY2hhbm5lbHMgKi8pOworICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICBMT0dFKCJpbnRlcm5hbCBmbHVzaCB0byBoYW5kbGUgbVN0YXRlID0gRVJST1IgZmFpbGVkIik7CisgICAgfQorCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworICAgIG1TdGF0ZSA9IERFSU5JVDsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKworICAgIGNhbWVyYTNfbm90aWZ5X21zZ190IG5vdGlmeV9tc2c7CisgICAgbWVtc2V0KCZub3RpZnlfbXNnLCAwLCBzaXplb2YoY2FtZXJhM19ub3RpZnlfbXNnX3QpKTsKKyAgICBub3RpZnlfbXNnLnR5cGUgPSBDQU1FUkEzX01TR19FUlJPUjsKKyAgICBub3RpZnlfbXNnLm1lc3NhZ2UuZXJyb3IuZXJyb3JfY29kZSA9IENBTUVSQTNfTVNHX0VSUk9SX0RFVklDRTsKKyAgICBub3RpZnlfbXNnLm1lc3NhZ2UuZXJyb3IuZXJyb3Jfc3RyZWFtID0gTlVMTDsKKyAgICBub3RpZnlfbXNnLm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyID0gMDsKKyAgICBtQ2FsbGJhY2tPcHMtPm5vdGlmeShtQ2FsbGJhY2tPcHMsICZub3RpZnlfbXNnKTsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYXB0dXJlUmVzdWx0Q2IKKyAqCisgKiBERVNDUklQVElPTjogQ2FsbGJhY2sgaGFuZGxlciBmb3IgYWxsIGNhcHR1cmUgcmVzdWx0CisgKiAgICAgICAgICAgICAgKHN0cmVhbXMsIGFzIHdlbGwgYXMgbWV0YWRhdGEpCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtZXRhZGF0YSA6IG1ldGFkYXRhIGluZm9ybWF0aW9uCisgKiAgIEBidWZmZXIgICA6IGFjdHVhbCBncmFsbG9jIGJ1ZmZlciB0byBiZSByZXR1cm5lZCB0byBmcmFtZXdvcmtzLgorICogICAgICAgICAgICAgICBOVUxMIGlmIG1ldGFkYXRhLgorICoKKyAqIFJFVFVSTiAgICAgOiBOT05FCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Y2FwdHVyZVJlc3VsdENiKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqbWV0YWRhdGFfYnVmLAorICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpidWZmZXIsIHVpbnQzMl90IGZyYW1lX251bWJlciwgYm9vbCBpc0lucHV0QnVmZmVyKQoreworICAgIGlmIChtZXRhZGF0YV9idWYpIHsKKyAgICAgICAgaWYgKG1CYXRjaFNpemUpIHsKKyAgICAgICAgICAgIGhhbmRsZUJhdGNoTWV0YWRhdGEobWV0YWRhdGFfYnVmLAorICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGZyZWVfYW5kX2J1ZmRvbmVfbWV0YV9idWYgKi8pOworICAgICAgICB9IGVsc2UgeyAvKiBtQmF0Y2hTaXplID0gMCAqLworICAgICAgICAgICAgaGRyUGx1c1BlcmZMb2NrKG1ldGFkYXRhX2J1Zik7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1NdXRleCk7CisgICAgICAgICAgICBoYW5kbGVNZXRhZGF0YVdpdGhMb2NrKG1ldGFkYXRhX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBmcmVlX2FuZF9idWZkb25lX21ldGFfYnVmICovLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBmaXJzdCBmcmFtZSBvZiBiYXRjaCBtZXRhZGF0YSAqLyApOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1NdXRleCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtTXV0ZXgpOworICAgICAgICBoYW5kbGVJbnB1dEJ1ZmZlcldpdGhMb2NrKGZyYW1lX251bWJlcik7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtTXV0ZXgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbU11dGV4KTsKKyAgICAgICAgaGFuZGxlQnVmZmVyV2l0aExvY2soYnVmZmVyLCBmcmFtZV9udW1iZXIpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbU11dGV4KTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFJlcHJvY2Vzc2libGVPdXRwdXRTdHJlYW1JZAorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgc291cmNlIG91dHB1dCBzdHJlYW0gaWQgZm9yIHRoZSBpbnB1dCByZXByb2Nlc3Mgc3RyZWFtCisgKiAgICAgICAgICAgICAgYmFzZWQgb24gc2l6ZSBhbmQgZm9ybWF0LCB3aGljaCB3b3VsZCBiZSB0aGUgbGFyZ2VzdAorICogICAgICAgICAgICAgIG91dHB1dCBzdHJlYW0gaWYgYW4gaW5wdXQgc3RyZWFtIGV4aXN0cy4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGlkICAgICAgOiByZXR1cm4gdGhlIHN0cmVhbSBpZCBpZiBmb3VuZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Z2V0UmVwcm9jZXNzaWJsZU91dHB1dFN0cmVhbUlkKHVpbnQzMl90ICZpZCkKK3sKKyAgICAvKiBjaGVjayBpZiBhbnkgb3V0cHV0IG9yIGJpZGlyZWN0aW9uYWwgc3RyZWFtIHdpdGggdGhlIHNhbWUgc2l6ZSBhbmQgZm9ybWF0CisgICAgICAgYW5kIHJldHVybiB0aGF0IHN0cmVhbSAqLworICAgIGlmICgobUlucHV0U3RyZWFtSW5mby5kaW0ud2lkdGggPiAwKSAmJgorICAgICAgICAgICAgKG1JbnB1dFN0cmVhbUluZm8uZGltLmhlaWdodCA+IDApKSB7CisgICAgICAgIGZvciAoTGlzdDxzdHJlYW1faW5mb190ICo+OjppdGVyYXRvciBpdCA9IG1TdHJlYW1JbmZvLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gbVN0cmVhbUluZm8uZW5kKCk7IGl0KyspIHsKKworICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fdCAqc3RyZWFtID0gKCppdCktPnN0cmVhbTsKKyAgICAgICAgICAgIGlmICgoc3RyZWFtLT53aWR0aCA9PSAodWludDMyX3QpbUlucHV0U3RyZWFtSW5mby5kaW0ud2lkdGgpICYmCisgICAgICAgICAgICAgICAgICAgIChzdHJlYW0tPmhlaWdodCA9PSAodWludDMyX3QpbUlucHV0U3RyZWFtSW5mby5kaW0uaGVpZ2h0KSAmJgorICAgICAgICAgICAgICAgICAgICAoc3RyZWFtLT5mb3JtYXQgPT0gbUlucHV0U3RyZWFtSW5mby5mb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgLy8gVXNhZ2UgZmxhZyBmb3IgYW4gaW5wdXQgc3RyZWFtIGFuZCB0aGUgc291cmNlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgICAgICAvLyBtYXkgYmUgZGlmZmVyZW50LgorICAgICAgICAgICAgICAgIExPR0QoIkZvdW5kIHJlcHJvY2Vzc2libGUgb3V0cHV0IHN0cmVhbSEgJXAiLCAqaXQpOworICAgICAgICAgICAgICAgIExPR0QoImlucHV0IHN0cmVhbSB1c2FnZSAweCV4LCBjdXJyZW50IHN0cmVhbSB1c2FnZSAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnVzYWdlLCBtSW5wdXRTdHJlYW1JbmZvLnVzYWdlKTsKKworICAgICAgICAgICAgICAgIFFDYW1lcmEzQ2hhbm5lbCAqY2hhbm5lbCA9IChRQ2FtZXJhM0NoYW5uZWwgKilzdHJlYW0tPnByaXY7CisgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgIT0gTlVMTCAmJiBjaGFubmVsLT5tU3RyZWFtc1swXSkgeworICAgICAgICAgICAgICAgICAgICBpZCA9IGNoYW5uZWwtPm1TdHJlYW1zWzBdLT5nZXRNeVNlcnZlcklEKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJObyBpbnB1dCBzdHJlYW0sIHNvIG5vIHJlcHJvY2Vzc2libGUgb3V0cHV0IHN0cmVhbSIpOworICAgIH0KKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbG9va3VwRndrTmFtZQorICoKKyAqIERFU0NSSVBUSU9OOiBJbiBjYXNlIHRoZSBlbnVtIGlzIG5vdCBzYW1lIGluIGZ3ayBhbmQgYmFja2VuZAorICogICAgICAgICAgICAgIG1ha2Ugc3VyZSB0aGUgcGFyYW1ldGVyIGlzIGNvcnJlY3RseSBwcm9wb2dhdGVkCisgKgorICogUEFSQU1FVEVSUyAgOgorICogICBAYXJyICAgICAgOiBtYXAgYmV0d2VlbiB0aGUgdHdvIGVudW1zCisgKiAgIEBsZW4gICAgICA6IGxlbiBvZiB0aGUgbWFwCisgKiAgIEBoYWxfbmFtZSA6IG5hbWUgb2YgdGhlIGhhbF9wYXJtIHRvIG1hcAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBmd2tfbmFtZSAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordGVtcGxhdGUgPHR5cGVuYW1lIGhhbFR5cGUsIGNsYXNzIG1hcFR5cGU+IGludCBsb29rdXBGd2tOYW1lKGNvbnN0IG1hcFR5cGUgKmFyciwKKyAgICAgICAgc2l6ZV90IGxlbiwgaGFsVHlwZSBoYWxfbmFtZSkKK3sKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKGFycltpXS5oYWxfbmFtZSA9PSBoYWxfbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGFycltpXS5md2tfbmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE5vdCBhYmxlIHRvIGZpbmQgbWF0Y2hpbmcgZnJhbWV3b3JrIHR5cGUgaXMgbm90IG5lY2Vzc2FyaWx5CisgICAgICogYW4gZXJyb3IgY2FzZS4gVGhpcyBoYXBwZW5zIHdoZW4gbW0tY2FtZXJhIHN1cHBvcnRzIG1vcmUgYXR0cmlidXRlcworICAgICAqIHRoYW4gdGhlIGZyYW1ld29ya3MgZG8gKi8KKyAgICBMT0dIKCJDYW5ub3QgZmluZCBtYXRjaGluZyBmcmFtZXdvcmsgdHlwZSIpOworICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBsb29rdXBIYWxOYW1lCisgKgorICogREVTQ1JJUFRJT046IEluIGNhc2UgdGhlIGVudW0gaXMgbm90IHNhbWUgaW4gZndrIGFuZCBiYWNrZW5kCisgKiAgICAgICAgICAgICAgbWFrZSBzdXJlIHRoZSBwYXJhbWV0ZXIgaXMgY29ycmVjdGx5IHByb3BvZ2F0ZWQKKyAqCisgKiBQQVJBTUVURVJTICA6CisgKiAgIEBhcnIgICAgICA6IG1hcCBiZXR3ZWVuIHRoZSB0d28gZW51bXMKKyAqICAgQGxlbiAgICAgIDogbGVuIG9mIHRoZSBtYXAKKyAqICAgQGZ3a19uYW1lIDogbmFtZSBvZiB0aGUgaGFsX3Bhcm0gdG8gbWFwCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBoYWxfbmFtZSAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordGVtcGxhdGUgPHR5cGVuYW1lIGZ3a1R5cGUsIGNsYXNzIG1hcFR5cGU+IGludCBsb29rdXBIYWxOYW1lKGNvbnN0IG1hcFR5cGUgKmFyciwKKyAgICAgICAgc2l6ZV90IGxlbiwgZndrVHlwZSBmd2tfbmFtZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGlmIChhcnJbaV0uZndrX25hbWUgPT0gZndrX25hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBhcnJbaV0uaGFsX25hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dFKCJDYW5ub3QgZmluZCBtYXRjaGluZyBoYWwgdHlwZSBmd2tfbmFtZT0lZCIsIGZ3a19uYW1lKTsKKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbG9va3VwUHJvcAorICoKKyAqIERFU0NSSVBUSU9OOiBsb29rdXAgYSB2YWx1ZSBieSBpdHMgbmFtZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAYXJyICAgICA6IG1hcCBiZXR3ZWVuIHRoZSB0d28gZW51bXMKKyAqICAgQGxlbiAgICAgOiBzaXplIG9mIHRoZSBtYXAKKyAqICAgQG5hbWUgICAgOiBuYW1lIHRvIGJlIGxvb2tlZCB1cAorICoKKyAqIFJFVFVSTiAgICAgOiBWYWx1ZSBpZiBmb3VuZAorICogICAgICAgICAgICAgIENBTV9DRFNfTU9ERV9NQVggaWYgbm90IGZvdW5kCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3RlbXBsYXRlIDxjbGFzcyBtYXBUeXBlPiBjYW1fY2RzX21vZGVfdHlwZV90IGxvb2t1cFByb3AoY29uc3QgbWFwVHlwZSAqYXJyLAorICAgICAgICBzaXplX3QgbGVuLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGlmIChuYW1lKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKGFycltpXS5kZXNjLCBuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBhcnJbaV0udmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDQU1fQ0RTX01PREVfTUFYOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIERFU0NSSVBUSU9OOgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbWV0YWRhdGEgOiBtZXRhZGF0YSBpbmZvcm1hdGlvbiBmcm9tIGNhbGxiYWNrCisgKiAgIEB0aW1lc3RhbXA6IG1ldGFkYXRhIGJ1ZmZlciB0aW1lc3RhbXAKKyAqICAgQHJlcXVlc3RfaWQ6IHJlcXVlc3QgaWQKKyAqICAgQGpwZWdNZXRhZGF0YTogYWRkaXRpb25hbCBqcGVnIG1ldGFkYXRhCisgKiAgIEBwcHJvY0RvbmU6IHdoZXRoZXIgaW50ZXJuYWwgb2ZmbGluZSBwb3N0cHJvY3Nlc2luZyBpcyBkb25lCisgKgorICogUkVUVVJOICAgICA6IGNhbWVyYV9tZXRhZGF0YV90KgorICogICAgICAgICAgICAgIG1ldGFkYXRhIGluIGEgZm9ybWF0IHNwZWNpZmllZCBieSBmd2sKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY2FtZXJhX21ldGFkYXRhX3QqCitRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjp0cmFuc2xhdGVGcm9tSGFsTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCAqbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBqcGVnTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBpcGVsaW5lX2RlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjYXB0dXJlX2ludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHByb2NEb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBmd2tfY2FjTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmlyc3RNZXRhZGF0YUluQmF0Y2gpCit7CisgICAgQ2FtZXJhTWV0YWRhdGEgY2FtTWV0YWRhdGE7CisgICAgY2FtZXJhX21ldGFkYXRhX3QgKnJlc3VsdE1ldGFkYXRhOworCisgICAgaWYgKG1CYXRjaFNpemUgJiYgIWZpcnN0TWV0YWRhdGFJbkJhdGNoKSB7CisgICAgICAgIC8qIEluIGJhdGNoIG1vZGUsIHVzZSBjYWNoZWQgbWV0YWRhdGEgZnJvbSB0aGUgZmlyc3QgbWV0YWRhdGEKKyAgICAgICAgICAgIGluIHRoZSBiYXRjaCAqLworICAgICAgICBjYW1NZXRhZGF0YS5jbGVhcigpOworICAgICAgICBjYW1NZXRhZGF0YSA9IG1DYWNoZWRNZXRhZGF0YTsKKyAgICB9CisKKyAgICBpZiAoanBlZ01ldGFkYXRhLmVudHJ5Q291bnQoKSkKKyAgICAgICAgY2FtTWV0YWRhdGEuYXBwZW5kKGpwZWdNZXRhZGF0YSk7CisKKyAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfVElNRVNUQU1QLCAmdGltZXN0YW1wLCAxKTsKKyAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lELCAmcmVxdWVzdF9pZCwgMSk7CisgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9QSVBFTElORV9ERVBUSCwgJnBpcGVsaW5lX2RlcHRoLCAxKTsKKyAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5ULCAmY2FwdHVyZV9pbnRlbnQsIDEpOworCisgICAgaWYgKG1CYXRjaFNpemUgJiYgIWZpcnN0TWV0YWRhdGFJbkJhdGNoKSB7CisgICAgICAgIC8qIEluIGJhdGNoIG1vZGUsIHVzZSBjYWNoZWQgbWV0YWRhdGEgaW5zdGVhZCBvZiBwYXJzaW5nIG1ldGFkYXRhIGJ1ZmZlciBhZ2FpbiAqLworICAgICAgICByZXN1bHRNZXRhZGF0YSA9IGNhbU1ldGFkYXRhLnJlbGVhc2UoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdE1ldGFkYXRhOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCBmcmFtZV9udW1iZXIsIENBTV9JTlRGX01FVEFfRlJBTUVfTlVNQkVSLCBtZXRhZGF0YSkgeworICAgICAgICBpbnQ2NF90IGZ3a19mcmFtZV9udW1iZXIgPSAqZnJhbWVfbnVtYmVyOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TWU5DX0ZSQU1FX05VTUJFUiwgJmZ3a19mcmFtZV9udW1iZXIsIDEpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9mcHNfcmFuZ2VfdCwgZmxvYXRfcmFuZ2UsIENBTV9JTlRGX1BBUk1fRlBTX1JBTkdFLCBtZXRhZGF0YSkgeworICAgICAgICBpbnQzMl90IGZwc19yYW5nZVsyXTsKKyAgICAgICAgZnBzX3JhbmdlWzBdID0gKGludDMyX3QpZmxvYXRfcmFuZ2UtPm1pbl9mcHM7CisgICAgICAgIGZwc19yYW5nZVsxXSA9IChpbnQzMl90KWZsb2F0X3JhbmdlLT5tYXhfZnBzOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX1RBUkdFVF9GUFNfUkFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwc19yYW5nZSwgMik7CisgICAgICAgIExPR0QoInVyZ2VudCBNZXRhZGF0YSA6IEFORFJPSURfQ09OVFJPTF9BRV9UQVJHRVRfRlBTX1JBTkdFIFslZCwgJWRdIiwKKyAgICAgICAgICAgICBmcHNfcmFuZ2VbMF0sIGZwc19yYW5nZVsxXSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgZXhwQ29tcGVuc2F0aW9uLCBDQU1fSU5URl9QQVJNX0VYUE9TVVJFX0NPTVBFTlNBVElPTiwgbWV0YWRhdGEpIHsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9FWFBPU1VSRV9DT01QRU5TQVRJT04sIGV4cENvbXBlbnNhdGlvbiwgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIHNjZW5lTW9kZSwgQ0FNX0lOVEZfUEFSTV9CRVNUU0hPVF9NT0RFLCBtZXRhZGF0YSkgeworICAgICAgICBpbnQgdmFsID0gKHVpbnQ4X3QpbG9va3VwRndrTmFtZShTQ0VORV9NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgTUVUQURBVEFfTUFQX1NJWkUoU0NFTkVfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICAqc2NlbmVNb2RlKTsKKyAgICAgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IHZhbCkgeworICAgICAgICAgICAgdWludDhfdCBmd2tTY2VuZU1vZGUgPSAodWludDhfdCl2YWw7CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREUsICZmd2tTY2VuZU1vZGUsIDEpOworICAgICAgICAgICAgTE9HRCgidXJnZW50IE1ldGFkYXRhIDogQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIGZ3a1NjZW5lTW9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgYWVfbG9jaywgQ0FNX0lOVEZfUEFSTV9BRUNfTE9DSywgbWV0YWRhdGEpIHsKKyAgICAgICAgdWludDhfdCBmd2tfYWVfbG9jayA9ICh1aW50OF90KSAqYWVfbG9jazsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9MT0NLLCAmZndrX2FlX2xvY2ssIDEpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCBhd2JfbG9jaywgQ0FNX0lOVEZfUEFSTV9BV0JfTE9DSywgbWV0YWRhdGEpIHsKKyAgICAgICAgdWludDhfdCBmd2tfYXdiX2xvY2sgPSAodWludDhfdCkgKmF3Yl9sb2NrOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FXQl9MT0NLLCAmZndrX2F3Yl9sb2NrLCAxKTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgY29sb3JfY29ycmVjdF9tb2RlLCBDQU1fSU5URl9NRVRBX0NPTE9SX0NPUlJFQ1RfTU9ERSwgbWV0YWRhdGEpIHsKKyAgICAgICAgdWludDhfdCBmd2tfY29sb3JfY29ycmVjdF9tb2RlID0gKHVpbnQ4X3QpICpjb2xvcl9jb3JyZWN0X21vZGU7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSwgJmZ3a19jb2xvcl9jb3JyZWN0X21vZGUsIDEpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9lZGdlX2FwcGxpY2F0aW9uX3QsIGVkZ2VBcHBsaWNhdGlvbiwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRURHRV9NT0RFLCBtZXRhZGF0YSkgeworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9FREdFX01PREUsICYoZWRnZUFwcGxpY2F0aW9uLT5lZGdlX21vZGUpLCAxKTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgZmxhc2hQb3dlciwgQ0FNX0lOVEZfTUVUQV9GTEFTSF9QT1dFUiwgbWV0YWRhdGEpIHsKKyAgICAgICAgdWludDhfdCBmd2tfZmxhc2hQb3dlciA9ICh1aW50OF90KSAqZmxhc2hQb3dlcjsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfRkxBU0hfRklSSU5HX1BPV0VSLCAmZndrX2ZsYXNoUG93ZXIsIDEpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGludDY0X3QsIGZsYXNoRmlyaW5nVGltZSwgQ0FNX0lOVEZfTUVUQV9GTEFTSF9GSVJJTkdfVElNRSwgbWV0YWRhdGEpIHsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfRkxBU0hfRklSSU5HX1RJTUUsIGZsYXNoRmlyaW5nVGltZSwgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgZmxhc2hTdGF0ZSwgQ0FNX0lOVEZfTUVUQV9GTEFTSF9TVEFURSwgbWV0YWRhdGEpIHsKKyAgICAgICAgaWYgKDAgPD0gKmZsYXNoU3RhdGUpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZndrX2ZsYXNoU3RhdGUgPSAodWludDhfdCkgKmZsYXNoU3RhdGU7CisgICAgICAgICAgICBpZiAoIWdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmZsYXNoX2F2YWlsYWJsZSkgeworICAgICAgICAgICAgICAgIGZ3a19mbGFzaFN0YXRlID0gQU5EUk9JRF9GTEFTSF9TVEFURV9VTkFWQUlMQUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0ZMQVNIX1NUQVRFLCAmZndrX2ZsYXNoU3RhdGUsIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIGZsYXNoTW9kZSwgQ0FNX0lOVEZfTUVUQV9GTEFTSF9NT0RFLCBtZXRhZGF0YSkgeworICAgICAgICBpbnQgdmFsID0gbG9va3VwRndrTmFtZShGTEFTSF9NT0RFU19NQVAsIE1FVEFEQVRBX01BUF9TSVpFKEZMQVNIX01PREVTX01BUCksICpmbGFzaE1vZGUpOworICAgICAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gdmFsKSB7CisgICAgICAgICAgICB1aW50OF90IGZ3a19mbGFzaE1vZGUgPSAodWludDhfdCl2YWw7CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9GTEFTSF9NT0RFLCAmZndrX2ZsYXNoTW9kZSwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgaG90UGl4ZWxNb2RlLCBDQU1fSU5URl9NRVRBX0hPVFBJWEVMX01PREUsIG1ldGFkYXRhKSB7CisgICAgICAgIHVpbnQ4X3QgZndrX2hvdFBpeGVsTW9kZSA9ICh1aW50OF90KSAqaG90UGl4ZWxNb2RlOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9IT1RfUElYRUxfTU9ERSwgJmZ3a19ob3RQaXhlbE1vZGUsIDEpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGZsb2F0LCBsZW5zQXBlcnR1cmUsIENBTV9JTlRGX01FVEFfTEVOU19BUEVSVFVSRSwgbWV0YWRhdGEpIHsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfTEVOU19BUEVSVFVSRSAsIGxlbnNBcGVydHVyZSwgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoZmxvYXQsIGZpbHRlckRlbnNpdHksIENBTV9JTlRGX01FVEFfTEVOU19GSUxURVJERU5TSVRZLCBtZXRhZGF0YSkgeworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9MRU5TX0ZJTFRFUl9ERU5TSVRZICwgZmlsdGVyRGVuc2l0eSwgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoZmxvYXQsIGZvY2FsTGVuZ3RoLCBDQU1fSU5URl9NRVRBX0xFTlNfRk9DQUxfTEVOR1RILCBtZXRhZGF0YSkgeworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9MRU5TX0ZPQ0FMX0xFTkdUSCwgZm9jYWxMZW5ndGgsIDEpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCBvcHRpY2FsU3RhYiwgQ0FNX0lOVEZfTUVUQV9MRU5TX09QVF9TVEFCX01PREUsIG1ldGFkYXRhKSB7CisgICAgICAgIHVpbnQ4X3QgZndrX29wdGljYWxTdGFiID0gKHVpbnQ4X3QpICpvcHRpY2FsU3RhYjsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERSwgJmZ3a19vcHRpY2FsU3RhYiwgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIHZpZGVvU3RhYiwgQ0FNX0lOVEZfTUVUQV9WSURFT19TVEFCX01PREUsIG1ldGFkYXRhKSB7CisgICAgICAgIHVpbnQ4X3QgZndrX3ZpZGVvU3RhYiA9ICh1aW50OF90KSAqdmlkZW9TdGFiOworICAgICAgICBMT0dEKCJmd2tfdmlkZW9TdGFiID0gJWQiLCBmd2tfdmlkZW9TdGFiKTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9WSURFT19TVEFCSUxJWkFUSU9OX01PREUsICZmd2tfdmlkZW9TdGFiLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBSZWdhcmRsZXNzIG9mIFZpZGVvIHN0YWIgc3VwcG9ydHMgb3Igbm90LCBDVFMgaXMgZXhwZWN0aW5nIHRoZSBFSVMgcmVzdWx0IHRvIGJlIG5vbiBOVUxMCisgICAgICAgIC8vIGFuZCBzbyBoYXJkY29kaW5nIHRoZSBWaWRlbyBTdGFiIHJlc3VsdCB0byBPRkYgbW9kZS4KKyAgICAgICAgdWludDhfdCBmd2tWaWRlb1N0YWJNb2RlID0gQU5EUk9JRF9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERV9PRkY7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfVklERU9fU1RBQklMSVpBVElPTl9NT0RFLCAmZndrVmlkZW9TdGFiTW9kZSwgMSk7CisgICAgICAgIExPR0QoIkVJUyByZXN1bHQgZGVmYXVsdCB0byBPRkYgbW9kZSIpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCBub2lzZVJlZE1vZGUsIENBTV9JTlRGX01FVEFfTk9JU0VfUkVEVUNUSU9OX01PREUsIG1ldGFkYXRhKSB7CisgICAgICAgIHVpbnQ4X3QgZndrX25vaXNlUmVkTW9kZSA9ICh1aW50OF90KSAqbm9pc2VSZWRNb2RlOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9OT0lTRV9SRURVQ1RJT05fTU9ERSwgJmZ3a19ub2lzZVJlZE1vZGUsIDEpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGZsb2F0LCBlZmZlY3RpdmVFeHBvc3VyZUZhY3RvciwgQ0FNX0lOVEZfTUVUQV9FRkZFQ1RJVkVfRVhQT1NVUkVfRkFDVE9SLCBtZXRhZGF0YSkgeworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVBST0NFU1NfRUZGRUNUSVZFX0VYUE9TVVJFX0ZBQ1RPUiwgZWZmZWN0aXZlRXhwb3N1cmVGYWN0b3IsIDEpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9ibGFja19sZXZlbF9tZXRhZGF0YV90LCBibGFja0xldmVsU291cmNlUGF0dGVybiwKKyAgICAgICAgQ0FNX0lOVEZfTUVUQV9CTEFDS19MRVZFTF9TT1VSQ0VfUEFUVEVSTiwgbWV0YWRhdGEpIHsKKworICAgICAgICBMT0dEKCJkeW5hbWljYmxhY2tMZXZlbCA9ICVmICVmICVmICVmIiwKKyAgICAgICAgICBibGFja0xldmVsU291cmNlUGF0dGVybi0+Y2FtX2JsYWNrX2xldmVsWzBdLAorICAgICAgICAgIGJsYWNrTGV2ZWxTb3VyY2VQYXR0ZXJuLT5jYW1fYmxhY2tfbGV2ZWxbMV0sCisgICAgICAgICAgYmxhY2tMZXZlbFNvdXJjZVBhdHRlcm4tPmNhbV9ibGFja19sZXZlbFsyXSwKKyAgICAgICAgICBibGFja0xldmVsU291cmNlUGF0dGVybi0+Y2FtX2JsYWNrX2xldmVsWzNdKTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fYmxhY2tfbGV2ZWxfbWV0YWRhdGFfdCwgYmxhY2tMZXZlbEFwcGxpZWRQYXR0ZXJuLAorICAgICAgICBDQU1fSU5URl9NRVRBX0JMQUNLX0xFVkVMX0FQUExJRURfUEFUVEVSTiwgbWV0YWRhdGEpIHsKKyAgICAgICAgZmxvYXQgZndrX2JsYWNrTGV2ZWxJbmRbNF07CisKKyAgICAgICAgZndrX2JsYWNrTGV2ZWxJbmRbMF0gPSBibGFja0xldmVsQXBwbGllZFBhdHRlcm4tPmNhbV9ibGFja19sZXZlbFswXTsKKyAgICAgICAgZndrX2JsYWNrTGV2ZWxJbmRbMV0gPSBibGFja0xldmVsQXBwbGllZFBhdHRlcm4tPmNhbV9ibGFja19sZXZlbFsxXTsKKyAgICAgICAgZndrX2JsYWNrTGV2ZWxJbmRbMl0gPSBibGFja0xldmVsQXBwbGllZFBhdHRlcm4tPmNhbV9ibGFja19sZXZlbFsyXTsKKyAgICAgICAgZndrX2JsYWNrTGV2ZWxJbmRbM10gPSBibGFja0xldmVsQXBwbGllZFBhdHRlcm4tPmNhbV9ibGFja19sZXZlbFszXTsKKworICAgICAgICBMT0dEKCJhcHBsaWVkIGR5bmFtaWNibGFja0xldmVsID0gJWYgJWYgJWYgJWYiLAorICAgICAgICAgIGJsYWNrTGV2ZWxBcHBsaWVkUGF0dGVybi0+Y2FtX2JsYWNrX2xldmVsWzBdLAorICAgICAgICAgIGJsYWNrTGV2ZWxBcHBsaWVkUGF0dGVybi0+Y2FtX2JsYWNrX2xldmVsWzFdLAorICAgICAgICAgIGJsYWNrTGV2ZWxBcHBsaWVkUGF0dGVybi0+Y2FtX2JsYWNrX2xldmVsWzJdLAorICAgICAgICAgIGJsYWNrTGV2ZWxBcHBsaWVkUGF0dGVybi0+Y2FtX2JsYWNrX2xldmVsWzNdKTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKFFDQU1FUkEzX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMX1BBVFRFUk4sIGZ3a19ibGFja0xldmVsSW5kLCA0KTsKKworI2lmbmRlZiBVU0VfSEFMXzNfMworICAgICAgICAvLyBVcGRhdGUgdGhlIEFORFJPSURfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwKKyAgICAgICAgLy8gTmVlZCBjb252ZXJ0IHRoZSBpbnRlcm5hbCAxNiBiaXQgZGVwdGggdG8gc2Vuc29yIDEwIGJpdCBzZW5zb3IgcmF3CisgICAgICAgIC8vIGRlcHRoIHNwYWNlLgorICAgICAgICBmd2tfYmxhY2tMZXZlbEluZFswXSAvPSA2NC4wOworICAgICAgICBmd2tfYmxhY2tMZXZlbEluZFsxXSAvPSA2NC4wOworICAgICAgICBmd2tfYmxhY2tMZXZlbEluZFsyXSAvPSA2NC4wOworICAgICAgICBmd2tfYmxhY2tMZXZlbEluZFszXSAvPSA2NC4wOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfRFlOQU1JQ19CTEFDS19MRVZFTCwgZndrX2JsYWNrTGV2ZWxJbmQsIDQpOworI2VuZGlmCisgICAgfQorCisjaWZuZGVmIFVTRV9IQUxfM18zCisgICAgLy8gRml4ZWQgd2hpdGVsZXZlbCBpcyB1c2VkIGJ5IElTUC9TZW5zb3IKKyAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfRFlOQU1JQ19XSElURV9MRVZFTCwKKyAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT53aGl0ZV9sZXZlbCwgMSk7CisjZW5kaWYKKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9jcm9wX3JlZ2lvbl90LCBoU2NhbGVyQ3JvcFJlZ2lvbiwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfU0NBTEVSX0NST1BfUkVHSU9OLCBtZXRhZGF0YSkgeworICAgICAgICBpbnQzMl90IHNjYWxlckNyb3BSZWdpb25bNF07CisgICAgICAgIHNjYWxlckNyb3BSZWdpb25bMF0gPSBoU2NhbGVyQ3JvcFJlZ2lvbi0+bGVmdDsKKyAgICAgICAgc2NhbGVyQ3JvcFJlZ2lvblsxXSA9IGhTY2FsZXJDcm9wUmVnaW9uLT50b3A7CisgICAgICAgIHNjYWxlckNyb3BSZWdpb25bMl0gPSBoU2NhbGVyQ3JvcFJlZ2lvbi0+d2lkdGg7CisgICAgICAgIHNjYWxlckNyb3BSZWdpb25bM10gPSBoU2NhbGVyQ3JvcFJlZ2lvbi0+aGVpZ2h0OworCisgICAgICAgIC8vIEFkanVzdCBjcm9wIHJlZ2lvbiBmcm9tIHNlbnNvciBvdXRwdXQgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gYWN0aXZlCisgICAgICAgIC8vIGFycmF5IGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAgICBtQ3JvcFJlZ2lvbk1hcHBlci50b0FjdGl2ZUFycmF5KHNjYWxlckNyb3BSZWdpb25bMF0sIHNjYWxlckNyb3BSZWdpb25bMV0sCisgICAgICAgICAgICAgICAgc2NhbGVyQ3JvcFJlZ2lvblsyXSwgc2NhbGVyQ3JvcFJlZ2lvblszXSk7CisKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfU0NBTEVSX0NST1BfUkVHSU9OLCBzY2FsZXJDcm9wUmVnaW9uLCA0KTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQ2NF90LCBzZW5zb3JFeHBUaW1lLCBDQU1fSU5URl9NRVRBX1NFTlNPUl9FWFBPU1VSRV9USU1FLCBtZXRhZGF0YSkgeworICAgICAgICBMT0dEKCJzZW5zb3JFeHBUaW1lID0gJWxsZCIsICpzZW5zb3JFeHBUaW1lKTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfU0VOU09SX0VYUE9TVVJFX1RJTUUgLCBzZW5zb3JFeHBUaW1lLCAxKTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQ2NF90LCBzZW5zb3JGYW1lRHVyYXRpb24sCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX1NFTlNPUl9GUkFNRV9EVVJBVElPTiwgbWV0YWRhdGEpIHsKKyAgICAgICAgTE9HRCgic2Vuc29yRmFtZUR1cmF0aW9uID0gJWxsZCIsICpzZW5zb3JGYW1lRHVyYXRpb24pOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfRlJBTUVfRFVSQVRJT04sIHNlbnNvckZhbWVEdXJhdGlvbiwgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50NjRfdCwgc2Vuc29yUm9sbGluZ1NodXR0ZXJTa2V3LAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9TRU5TT1JfUk9MTElOR19TSFVUVEVSX1NLRVcsIG1ldGFkYXRhKSB7CisgICAgICAgIExPR0QoInNlbnNvclJvbGxpbmdTaHV0dGVyU2tldyA9ICVsbGQiLCAqc2Vuc29yUm9sbGluZ1NodXR0ZXJTa2V3KTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfU0VOU09SX1JPTExJTkdfU0hVVFRFUl9TS0VXLAorICAgICAgICAgICAgICAgIHNlbnNvclJvbGxpbmdTaHV0dGVyU2tldywgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgc2Vuc29yU2Vuc2l0aXZpdHksIENBTV9JTlRGX01FVEFfU0VOU09SX1NFTlNJVElWSVRZLCBtZXRhZGF0YSkgeworICAgICAgICBMT0dEKCJzZW5zb3JTZW5zaXRpdml0eSA9ICVkIiwgKnNlbnNvclNlbnNpdGl2aXR5KTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfU0VOU09SX1NFTlNJVElWSVRZLCBzZW5zb3JTZW5zaXRpdml0eSwgMSk7CisKKyAgICAgICAgLy9jYWxjdWxhdGUgdGhlIG5vaXNlIHByb2ZpbGUgYmFzZWQgb24gc2Vuc2l0aXZpdHkKKyAgICAgICAgZG91YmxlIG5vaXNlX3Byb2ZpbGVfUyA9IGNvbXB1dGVOb2lzZU1vZGVsRW50cnlTKCpzZW5zb3JTZW5zaXRpdml0eSk7CisgICAgICAgIGRvdWJsZSBub2lzZV9wcm9maWxlX08gPSBjb21wdXRlTm9pc2VNb2RlbEVudHJ5Tygqc2Vuc29yU2Vuc2l0aXZpdHkpOworICAgICAgICBkb3VibGUgbm9pc2VfcHJvZmlsZVsyICogZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+bnVtX2NvbG9yX2NoYW5uZWxzXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyICogZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+bnVtX2NvbG9yX2NoYW5uZWxzOyBpICs9IDIpIHsKKyAgICAgICAgICAgIG5vaXNlX3Byb2ZpbGVbaV0gICA9IG5vaXNlX3Byb2ZpbGVfUzsKKyAgICAgICAgICAgIG5vaXNlX3Byb2ZpbGVbaSsxXSA9IG5vaXNlX3Byb2ZpbGVfTzsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJub2lzZSBtb2RlbCBlbnRyeSAoUywgTykgaXMgKCVmLCAlZikiLAorICAgICAgICAgICAgICAgIG5vaXNlX3Byb2ZpbGVfUywgbm9pc2VfcHJvZmlsZV9PKTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfU0VOU09SX05PSVNFX1BST0ZJTEUsIG5vaXNlX3Byb2ZpbGUsCisgICAgICAgICAgICAgICAgKHNpemVfdCkgKDIgKiBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5udW1fY29sb3JfY2hhbm5lbHMpKTsKKyAgICB9CisKKyNpZm5kZWYgVVNFX0hBTF8zXzMKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCBpc3BTZW5zaXRpdml0eSwgQ0FNX0lOVEZfTUVUQV9JU1BfU0VOU0lUSVZJVFksIG1ldGFkYXRhKSB7CisgICAgICAgIGludDMyX3QgZndrX2lzcFNlbnNpdGl2aXR5ID0gKGludDMyX3QpICppc3BTZW5zaXRpdml0eTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9QT1NUX1JBV19TRU5TSVRJVklUWV9CT09TVCwgJmZ3a19pc3BTZW5zaXRpdml0eSwgMSk7CisgICAgfQorI2VuZGlmCisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgc2hhZGluZ01vZGUsIENBTV9JTlRGX01FVEFfU0hBRElOR19NT0RFLCBtZXRhZGF0YSkgeworICAgICAgICB1aW50OF90IGZ3a19zaGFkaW5nTW9kZSA9ICh1aW50OF90KSAqc2hhZGluZ01vZGU7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NIQURJTkdfTU9ERSwgJmZ3a19zaGFkaW5nTW9kZSwgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIGZhY2VEZXRlY3RNb2RlLCBDQU1fSU5URl9NRVRBX1NUQVRTX0ZBQ0VERVRFQ1RfTU9ERSwgbWV0YWRhdGEpIHsKKyAgICAgICAgaW50IHZhbCA9IGxvb2t1cEZ3a05hbWUoRkFDRURFVEVDVF9NT0RFU19NQVAsIE1FVEFEQVRBX01BUF9TSVpFKEZBQ0VERVRFQ1RfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICAqZmFjZURldGVjdE1vZGUpOworICAgICAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gdmFsKSB7CisgICAgICAgICAgICB1aW50OF90IGZ3a19mYWNlRGV0ZWN0TW9kZSA9ICh1aW50OF90KXZhbDsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NUQVRJU1RJQ1NfRkFDRV9ERVRFQ1RfTU9ERSwgJmZ3a19mYWNlRGV0ZWN0TW9kZSwgMSk7CisKKyAgICAgICAgICAgIGlmIChmd2tfZmFjZURldGVjdE1vZGUgIT0gQU5EUk9JRF9TVEFUSVNUSUNTX0ZBQ0VfREVURUNUX01PREVfT0ZGKSB7CisgICAgICAgICAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2ZhY2VfZGV0ZWN0aW9uX2RhdGFfdCwgZmFjZURldGVjdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0ZBQ0VfREVURUNUSU9OLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bUZhY2VzID0gTUlOKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VEZXRlY3Rpb25JbmZvLT5udW1fZmFjZXNfZGV0ZWN0ZWQsIE1BWF9ST0kpOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZhY2VJZHNbTUFYX1JPSV07CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmFjZVNjb3Jlc1tNQVhfUk9JXTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmYWNlUmVjdGFuZ2xlc1tNQVhfUk9JICogNF07CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmFjZUxhbmRtYXJrc1tNQVhfUk9JICogNl07CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBqID0gMCwgayA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1GYWNlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWNlU2NvcmVzW2ldID0gKHVpbnQ4X3QpZmFjZURldGVjdGlvbkluZm8tPmZhY2VzW2ldLnNjb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRqdXN0IGNyb3AgcmVnaW9uIGZyb20gc2Vuc29yIG91dHB1dCBjb29yZGluYXRlIHN5c3RlbSB0byBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3JlY3RfdCYgcmVjdCA9IGZhY2VEZXRlY3Rpb25JbmZvLT5mYWNlc1tpXS5mYWNlX2JvdW5kYXJ5OworICAgICAgICAgICAgICAgICAgICAgICAgbUNyb3BSZWdpb25NYXBwZXIudG9BY3RpdmVBcnJheShyZWN0LmxlZnQsIHJlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUb1JlZ2lvbnMoZmFjZURldGVjdGlvbkluZm8tPmZhY2VzW2ldLmZhY2VfYm91bmRhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VSZWN0YW5nbGVzK2osIC0xKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgais9IDQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bUZhY2VzIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChmYWNlSWRzLCAwLCBzaXplb2YoaW50MzJfdCkgKiBNQVhfUk9JKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChmYWNlU2NvcmVzLCAwLCBzaXplb2YodWludDhfdCkgKiBNQVhfUk9JKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChmYWNlUmVjdGFuZ2xlcywgMCwgc2l6ZW9mKGludDMyX3QpICogTUFYX1JPSSAqIDQpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGZhY2VMYW5kbWFya3MsIDAsIHNpemVvZihpbnQzMl90KSAqIE1BWF9ST0kgKiA2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NUQVRJU1RJQ1NfRkFDRV9TQ09SRVMsIGZhY2VTY29yZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRmFjZXMpOworICAgICAgICAgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX0ZBQ0VfUkVDVEFOR0xFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlUmVjdGFuZ2xlcywgbnVtRmFjZXMgKiA0VSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmd2tfZmFjZURldGVjdE1vZGUgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfRkFDRV9ERVRFQ1RfTU9ERV9GVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fZmFjZV9sYW5kbWFya3NfZGF0YV90LCBsYW5kbWFya3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRkFDRV9MQU5ETUFSSywgbWV0YWRhdGEpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRmFjZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXAgdGhlIGNvLW9yZGluYXRlIHNlbnNvciBvdXRwdXQgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gYWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3JvcFJlZ2lvbk1hcHBlci50b0FjdGl2ZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmRtYXJrcy0+ZmFjZV9sYW5kbWFya3NbaV0ubGVmdF9leWVfY2VudGVyLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZG1hcmtzLT5mYWNlX2xhbmRtYXJrc1tpXS5sZWZ0X2V5ZV9jZW50ZXIueSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Dcm9wUmVnaW9uTWFwcGVyLnRvQWN0aXZlQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZG1hcmtzLT5mYWNlX2xhbmRtYXJrc1tpXS5yaWdodF9leWVfY2VudGVyLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZG1hcmtzLT5mYWNlX2xhbmRtYXJrc1tpXS5yaWdodF9leWVfY2VudGVyLnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3JvcFJlZ2lvbk1hcHBlci50b0FjdGl2ZUFycmF5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmRtYXJrcy0+ZmFjZV9sYW5kbWFya3NbaV0ubW91dGhfY2VudGVyLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZG1hcmtzLT5mYWNlX2xhbmRtYXJrc1tpXS5tb3V0aF9jZW50ZXIueSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydExhbmRtYXJrcyhsYW5kbWFya3MtPmZhY2VfbGFuZG1hcmtzW2ldLCBmYWNlTGFuZG1hcmtzK2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrKz0gVE9UQUxfTEFORE1BUktfSU5ESUNFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRmFjZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJbnZhbGlkTGFuZG1hcmtzKGZhY2VMYW5kbWFya3Mrayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsrPSBUT1RBTF9MQU5ETUFSS19JTkRJQ0VTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfU1RBVElTVElDU19GQUNFX0lEUywgZmFjZUlkcywgbnVtRmFjZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfU1RBVElTVElDU19GQUNFX0xBTkRNQVJLUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZUxhbmRtYXJrcywgbnVtRmFjZXMgKiA2VSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCBoaXN0b2dyYW1Nb2RlLCBDQU1fSU5URl9NRVRBX1NUQVRTX0hJU1RPR1JBTV9NT0RFLCBtZXRhZGF0YSkgeworICAgICAgICB1aW50OF90IGZ3a19oaXN0b2dyYW1Nb2RlID0gKHVpbnQ4X3QpICpoaXN0b2dyYW1Nb2RlOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX0hJU1RPR1JBTV9NT0RFLCAmZndrX2hpc3RvZ3JhbU1vZGUsIDEpOworCisgICAgICAgIGlmIChmd2tfaGlzdG9ncmFtTW9kZSA9PSBBTkRST0lEX1NUQVRJU1RJQ1NfSElTVE9HUkFNX01PREVfT04pIHsKKyAgICAgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9oaXN0X3N0YXRzX3QsIHN0YXRzX2RhdGEsIENBTV9JTlRGX01FVEFfSElTVE9HUkFNLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgaGlzdG9ncmFtIHN0YXRpc3RpY3MgaW5mbworICAgICAgICAgICAgICAgIHVpbnQzMl90IGhpc3RfYnVmWzNdW0NBTV9ISVNUT0dSQU1fU1RBVFNfU0laRV07CisgICAgICAgICAgICAgICAgdWludDMyX3QgaGlzdF9zaXplID0gc2l6ZW9mKGNhbV9oaXN0b2dyYW1fZGF0YV90OjpoaXN0X2J1Zik7CisgICAgICAgICAgICAgICAgY2FtX2hpc3RvZ3JhbV9kYXRhX3Qgckhpc3REYXRhLCBnSGlzdERhdGEsIGJIaXN0RGF0YTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnJIaXN0RGF0YSwgMCwgc2l6ZW9mKHJIaXN0RGF0YSkpOworICAgICAgICAgICAgICAgIG1lbXNldCgmZ0hpc3REYXRhLCAwLCBzaXplb2YoZ0hpc3REYXRhKSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZiSGlzdERhdGEsIDAsIHNpemVvZihiSGlzdERhdGEpKTsKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdHNfZGF0YS0+dHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQ0FNX0hJU1RPR1JBTV9UWVBFX0JBWUVSOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRzX2RhdGEtPmJheWVyX3N0YXRzLmRhdGFfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDQU1fU1RBVFNfQ0hBTk5FTF9HUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBySGlzdERhdGEgPSBnSGlzdERhdGEgPSBiSGlzdERhdGEgPSBzdGF0c19kYXRhLT5iYXllcl9zdGF0cy5ncl9zdGF0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0FNX1NUQVRTX0NIQU5ORUxfR0I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgckhpc3REYXRhID0gZ0hpc3REYXRhID0gYkhpc3REYXRhID0gc3RhdHNfZGF0YS0+YmF5ZXJfc3RhdHMuZ2Jfc3RhdHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENBTV9TVEFUU19DSEFOTkVMX0I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgckhpc3REYXRhID0gZ0hpc3REYXRhID0gYkhpc3REYXRhID0gc3RhdHNfZGF0YS0+YmF5ZXJfc3RhdHMuYl9zdGF0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0FNX1NUQVRTX0NIQU5ORUxfQUxMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJIaXN0RGF0YSA9IHN0YXRzX2RhdGEtPmJheWVyX3N0YXRzLnJfc3RhdHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GcmFtZXdvcmsgZXhwZWN0cyBvbmx5IDMgY2hhbm5lbHMuIFNvLCBmb3Igbm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXNlIGdiIHN0YXRzIGZvciBHIGNoYW5uZWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0hpc3REYXRhID0gc3RhdHNfZGF0YS0+YmF5ZXJfc3RhdHMuZ2Jfc3RhdHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkhpc3REYXRhID0gc3RhdHNfZGF0YS0+YmF5ZXJfc3RhdHMuYl9zdGF0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0FNX1NUQVRTX0NIQU5ORUxfWToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0FNX1NUQVRTX0NIQU5ORUxfUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgckhpc3REYXRhID0gZ0hpc3REYXRhID0gYkhpc3REYXRhID0gc3RhdHNfZGF0YS0+YmF5ZXJfc3RhdHMucl9zdGF0czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENBTV9ISVNUT0dSQU1fVFlQRV9ZVVY6CisgICAgICAgICAgICAgICAgICAgIHJIaXN0RGF0YSA9IGdIaXN0RGF0YSA9IGJIaXN0RGF0YSA9IHN0YXRzX2RhdGEtPnl1dl9zdGF0czsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWVtY3B5KGhpc3RfYnVmLCBySGlzdERhdGEuaGlzdF9idWYsIGhpc3Rfc2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGhpc3RfYnVmWzFdLCBnSGlzdERhdGEuaGlzdF9idWYsIGhpc3Rfc2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGhpc3RfYnVmWzJdLCBiSGlzdERhdGEuaGlzdF9idWYsIGhpc3Rfc2l6ZSk7CisKKyAgICAgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX0hJU1RPR1JBTSwgKGludDMyX3QqKWhpc3RfYnVmLCBoaXN0X3NpemUqMyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgc2hhcnBuZXNzTWFwTW9kZSwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfU1RBVFNfU0hBUlBORVNTX01BUF9NT0RFLCBtZXRhZGF0YSkgeworICAgICAgICB1aW50OF90IGZ3a19zaGFycG5lc3NNYXBNb2RlID0gKHVpbnQ4X3QpICpzaGFycG5lc3NNYXBNb2RlOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX1NIQVJQTkVTU19NQVBfTU9ERSwgJmZ3a19zaGFycG5lc3NNYXBNb2RlLCAxKTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fc2hhcnBuZXNzX21hcF90LCBzaGFycG5lc3NNYXAsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX1NUQVRTX1NIQVJQTkVTU19NQVAsIG1ldGFkYXRhKSB7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NUQVRJU1RJQ1NfU0hBUlBORVNTX01BUCwgKGludDMyX3QgKilzaGFycG5lc3NNYXAtPnNoYXJwbmVzcywKKyAgICAgICAgICAgICAgICBDQU1fTUFYX01BUF9XSURUSCAqIENBTV9NQVhfTUFQX0hFSUdIVCAqIDMpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9sZW5zX3NoYWRpbmdfbWFwX3QsIGxlbnNTaGFkaW5nTWFwLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9MRU5TX1NIQURJTkdfTUFQLCBtZXRhZGF0YSkgeworICAgICAgICBzaXplX3QgbWFwX2hlaWdodCA9IE1JTigoc2l6ZV90KWdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmxlbnNfc2hhZGluZ19tYXBfc2l6ZS5oZWlnaHQsCisgICAgICAgICAgICAgICAgQ0FNX01BWF9TSEFESU5HX01BUF9IRUlHSFQpOworICAgICAgICBzaXplX3QgbWFwX3dpZHRoID0gTUlOKChzaXplX3QpZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+bGVuc19zaGFkaW5nX21hcF9zaXplLndpZHRoLAorICAgICAgICAgICAgICAgIENBTV9NQVhfU0hBRElOR19NQVBfV0lEVEgpOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVAsCisgICAgICAgICAgICAgICAgbGVuc1NoYWRpbmdNYXAtPmxlbnNfc2hhZGluZywgNFUgKiBtYXBfd2lkdGggKiBtYXBfaGVpZ2h0KTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgdG9uZU1hcE1vZGUsIENBTV9JTlRGX01FVEFfVE9ORU1BUF9NT0RFLCBtZXRhZGF0YSkgeworICAgICAgICB1aW50OF90IGZ3a190b25lTWFwTW9kZSA9ICh1aW50OF90KSAqdG9uZU1hcE1vZGU7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1RPTkVNQVBfTU9ERSwgJmZ3a190b25lTWFwTW9kZSwgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3JnYl90b25lbWFwX2N1cnZlcywgdG9uZW1hcCwgQ0FNX0lOVEZfTUVUQV9UT05FTUFQX0NVUlZFUywgbWV0YWRhdGEpIHsKKyAgICAgICAgLy9Qb3B1bGF0ZSBDQU1fSU5URl9NRVRBX1RPTkVNQVBfQ1VSVkVTCisgICAgICAgIC8qIGNoMCA9IEcsIGNoIDEgPSBCLCBjaCAyID0gUiovCisgICAgICAgIGlmICh0b25lbWFwLT50b25lbWFwX3BvaW50c19jbnQgPiBDQU1fTUFYX1RPTkVNQVBfQ1VSVkVfU0laRSkgeworICAgICAgICAgICAgTE9HRSgiRmF0YWw6IHRvbmVtYXBfcG9pbnRzX2NudCAlZCBleGNlZWRzIG1heCB2YWx1ZSBvZiAlZCIsCisgICAgICAgICAgICAgICAgICAgICB0b25lbWFwLT50b25lbWFwX3BvaW50c19jbnQsCisgICAgICAgICAgICAgICAgICAgIENBTV9NQVhfVE9ORU1BUF9DVVJWRV9TSVpFKTsKKyAgICAgICAgICAgIHRvbmVtYXAtPnRvbmVtYXBfcG9pbnRzX2NudCA9IENBTV9NQVhfVE9ORU1BUF9DVVJWRV9TSVpFOworICAgICAgICB9CisKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfVE9ORU1BUF9DVVJWRV9HUkVFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0b25lbWFwLT5jdXJ2ZXNbMF0udG9uZW1hcF9wb2ludHNbMF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICB0b25lbWFwLT50b25lbWFwX3BvaW50c19jbnQgKiAyKTsKKworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9UT05FTUFQX0NVUlZFX0JMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAmdG9uZW1hcC0+Y3VydmVzWzFdLnRvbmVtYXBfcG9pbnRzWzBdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgdG9uZW1hcC0+dG9uZW1hcF9wb2ludHNfY250ICogMik7CisKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfVE9ORU1BUF9DVVJWRV9SRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAmdG9uZW1hcC0+Y3VydmVzWzJdLnRvbmVtYXBfcG9pbnRzWzBdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgdG9uZW1hcC0+dG9uZW1hcF9wb2ludHNfY250ICogMik7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2NvbG9yX2NvcnJlY3RfZ2FpbnNfdCwgY29sb3JDb3JyZWN0aW9uR2FpbnMsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0NPTE9SX0NPUlJFQ1RfR0FJTlMsIG1ldGFkYXRhKSB7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fR0FJTlMsIGNvbG9yQ29ycmVjdGlvbkdhaW5zLT5nYWlucywKKyAgICAgICAgICAgICAgICBDQ19HQUlOX01BWCk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2NvbG9yX2NvcnJlY3RfbWF0cml4X3QsIGNvbG9yQ29ycmVjdGlvbk1hdHJpeCwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfQ09MT1JfQ09SUkVDVF9UUkFOU0ZPUk0sIG1ldGFkYXRhKSB7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNLAorICAgICAgICAgICAgICAgIChjYW1lcmFfbWV0YWRhdGFfcmF0aW9uYWxfdCAqKSh2b2lkICopY29sb3JDb3JyZWN0aW9uTWF0cml4LT50cmFuc2Zvcm1fbWF0cml4LAorICAgICAgICAgICAgICAgIENDX01BVFJJWF9DT0xTICogQ0NfTUFUUklYX1JPV1MpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9wcm9maWxlX3RvbmVfY3VydmUsIHRvbmVDdXJ2ZSwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfUFJPRklMRV9UT05FX0NVUlZFLCBtZXRhZGF0YSkgeworICAgICAgICBpZiAodG9uZUN1cnZlLT50b25lbWFwX3BvaW50c19jbnQgPiBDQU1fTUFYX1RPTkVNQVBfQ1VSVkVfU0laRSkgeworICAgICAgICAgICAgTE9HRSgiRmF0YWw6IHRvbmVtYXBfcG9pbnRzX2NudCAlZCBleGNlZWRzIG1heCB2YWx1ZSBvZiAlZCIsCisgICAgICAgICAgICAgICAgICAgICB0b25lQ3VydmUtPnRvbmVtYXBfcG9pbnRzX2NudCwKKyAgICAgICAgICAgICAgICAgICAgQ0FNX01BWF9UT05FTUFQX0NVUlZFX1NJWkUpOworICAgICAgICAgICAgdG9uZUN1cnZlLT50b25lbWFwX3BvaW50c19jbnQgPSBDQU1fTUFYX1RPTkVNQVBfQ1VSVkVfU0laRTsKKyAgICAgICAgfQorICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfUFJPRklMRV9UT05FX0NVUlZFLAorICAgICAgICAgICAgICAgIChmbG9hdCopdG9uZUN1cnZlLT5jdXJ2ZS50b25lbWFwX3BvaW50cywKKyAgICAgICAgICAgICAgICB0b25lQ3VydmUtPnRvbmVtYXBfcG9pbnRzX2NudCAqIDIpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9jb2xvcl9jb3JyZWN0X2dhaW5zX3QsIHByZWRDb2xvckNvcnJlY3Rpb25HYWlucywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfUFJFRF9DT0xPUl9DT1JSRUNUX0dBSU5TLCBtZXRhZGF0YSkgeworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX1BSRURJQ1RFRF9DT0xPUl9HQUlOUywKKyAgICAgICAgICAgICAgICBwcmVkQ29sb3JDb3JyZWN0aW9uR2FpbnMtPmdhaW5zLCA0KTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fY29sb3JfY29ycmVjdF9tYXRyaXhfdCwgcHJlZENvbG9yQ29ycmVjdGlvbk1hdHJpeCwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfUFJFRF9DT0xPUl9DT1JSRUNUX1RSQU5TRk9STSwgbWV0YWRhdGEpIHsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfU1RBVElTVElDU19QUkVESUNURURfQ09MT1JfVFJBTlNGT1JNLAorICAgICAgICAgICAgICAgIChjYW1lcmFfbWV0YWRhdGFfcmF0aW9uYWxfdCAqKSh2b2lkICopcHJlZENvbG9yQ29ycmVjdGlvbk1hdHJpeC0+dHJhbnNmb3JtX21hdHJpeCwKKyAgICAgICAgICAgICAgICBDQ19NQVRSSVhfUk9XUyAqIENDX01BVFJJWF9DT0xTKTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShmbG9hdCwgb3RwV2JHckdiLCBDQU1fSU5URl9NRVRBX09UUF9XQl9HUkdCLCBtZXRhZGF0YSkgeworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfR1JFRU5fU1BMSVQsIG90cFdiR3JHYiwgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIGJsYWNrTGV2ZWxMb2NrLCBDQU1fSU5URl9NRVRBX0JMQUNLX0xFVkVMX0xPQ0ssIG1ldGFkYXRhKSB7CisgICAgICAgIHVpbnQ4X3QgZndrX2JsYWNrTGV2ZWxMb2NrID0gKHVpbnQ4X3QpICpibGFja0xldmVsTG9jazsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfQkxBQ0tfTEVWRUxfTE9DSywgJmZ3a19ibGFja0xldmVsTG9jaywgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIHNjZW5lRmxpY2tlciwgQ0FNX0lOVEZfTUVUQV9TQ0VORV9GTElDS0VSLCBtZXRhZGF0YSkgeworICAgICAgICB1aW50OF90IGZ3a19zY2VuZUZsaWNrZXIgPSAodWludDhfdCkgKnNjZW5lRmxpY2tlcjsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfU1RBVElTVElDU19TQ0VORV9GTElDS0VSLCAmZndrX3NjZW5lRmxpY2tlciwgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIGVmZmVjdE1vZGUsIENBTV9JTlRGX1BBUk1fRUZGRUNULCBtZXRhZGF0YSkgeworICAgICAgICBpbnQgdmFsID0gbG9va3VwRndrTmFtZShFRkZFQ1RfTU9ERVNfTUFQLCBNRVRBREFUQV9NQVBfU0laRShFRkZFQ1RfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICAqZWZmZWN0TW9kZSk7CisgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZndrX2VmZmVjdE1vZGUgPSAodWludDhfdCl2YWw7CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0VGRkVDVF9NT0RFLCAmZndrX2VmZmVjdE1vZGUsIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3Rlc3RfcGF0dGVybl9kYXRhX3QsIHRlc3RQYXR0ZXJuRGF0YSwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfVEVTVF9QQVRURVJOX0RBVEEsIG1ldGFkYXRhKSB7CisgICAgICAgIGludDMyX3QgZndrX3Rlc3RQYXR0ZXJuTW9kZSA9IGxvb2t1cEZ3a05hbWUoVEVTVF9QQVRURVJOX01BUCwKKyAgICAgICAgICAgICAgICBNRVRBREFUQV9NQVBfU0laRShURVNUX1BBVFRFUk5fTUFQKSwgdGVzdFBhdHRlcm5EYXRhLT5tb2RlKTsKKyAgICAgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IGZ3a190ZXN0UGF0dGVybk1vZGUpIHsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fTU9ERSwgJmZ3a190ZXN0UGF0dGVybk1vZGUsIDEpOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgZndrX3Rlc3RQYXR0ZXJuRGF0YVs0XTsKKyAgICAgICAgZndrX3Rlc3RQYXR0ZXJuRGF0YVswXSA9IHRlc3RQYXR0ZXJuRGF0YS0+cjsKKyAgICAgICAgZndrX3Rlc3RQYXR0ZXJuRGF0YVszXSA9IHRlc3RQYXR0ZXJuRGF0YS0+YjsKKyAgICAgICAgc3dpdGNoIChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCkgeworICAgICAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfUkdHQjoKKyAgICAgICAgY2FzZSBDQU1fRklMVEVSX0FSUkFOR0VNRU5UX0dSQkc6CisgICAgICAgICAgICBmd2tfdGVzdFBhdHRlcm5EYXRhWzFdID0gdGVzdFBhdHRlcm5EYXRhLT5ncjsKKyAgICAgICAgICAgIGZ3a190ZXN0UGF0dGVybkRhdGFbMl0gPSB0ZXN0UGF0dGVybkRhdGEtPmdiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNX0ZJTFRFUl9BUlJBTkdFTUVOVF9HQlJHOgorICAgICAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfQkdHUjoKKyAgICAgICAgICAgIGZ3a190ZXN0UGF0dGVybkRhdGFbMl0gPSB0ZXN0UGF0dGVybkRhdGEtPmdyOworICAgICAgICAgICAgZndrX3Rlc3RQYXR0ZXJuRGF0YVsxXSA9IHRlc3RQYXR0ZXJuRGF0YS0+Z2I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0UoImNvbG9yIGFycmFuZ2VtZW50ICVkIGlzIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmNvbG9yX2FycmFuZ2VtZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fREFUQSwgZndrX3Rlc3RQYXR0ZXJuRGF0YSwgNCk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoZG91YmxlLCBncHNfY29vcmRzLCBDQU1fSU5URl9NRVRBX0pQRUdfR1BTX0NPT1JESU5BVEVTLCBtZXRhZGF0YSkgeworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9KUEVHX0dQU19DT09SRElOQVRFUywgZ3BzX2Nvb3JkcywgMyk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDhfdCwgZ3BzX21ldGhvZHMsIENBTV9JTlRGX01FVEFfSlBFR19HUFNfUFJPQ19NRVRIT0RTLCBtZXRhZGF0YSkgeworICAgICAgICBTdHJpbmc4IHN0cigoY29uc3QgY2hhciAqKWdwc19tZXRob2RzKTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfSlBFR19HUFNfUFJPQ0VTU0lOR19NRVRIT0QsIHN0cik7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50NjRfdCwgZ3BzX3RpbWVzdGFtcCwgQ0FNX0lOVEZfTUVUQV9KUEVHX0dQU19USU1FU1RBTVAsIG1ldGFkYXRhKSB7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0pQRUdfR1BTX1RJTUVTVEFNUCwgZ3BzX3RpbWVzdGFtcCwgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwganBlZ19vcmllbnRhdGlvbiwgQ0FNX0lOVEZfTUVUQV9KUEVHX09SSUVOVEFUSU9OLCBtZXRhZGF0YSkgeworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9KUEVHX09SSUVOVEFUSU9OLCBqcGVnX29yaWVudGF0aW9uLCAxKTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwganBlZ19xdWFsaXR5LCBDQU1fSU5URl9NRVRBX0pQRUdfUVVBTElUWSwgbWV0YWRhdGEpIHsKKyAgICAgICAgdWludDhfdCBmd2tfanBlZ19xdWFsaXR5ID0gKHVpbnQ4X3QpICpqcGVnX3F1YWxpdHk7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0pQRUdfUVVBTElUWSwgJmZ3a19qcGVnX3F1YWxpdHksIDEpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCB0aHVtYl9xdWFsaXR5LCBDQU1fSU5URl9NRVRBX0pQRUdfVEhVTUJfUVVBTElUWSwgbWV0YWRhdGEpIHsKKyAgICAgICAgdWludDhfdCBmd2tfdGh1bWJfcXVhbGl0eSA9ICh1aW50OF90KSAqdGh1bWJfcXVhbGl0eTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfSlBFR19USFVNQk5BSUxfUVVBTElUWSwgJmZ3a190aHVtYl9xdWFsaXR5LCAxKTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fZGltZW5zaW9uX3QsIHRodW1iX3NpemUsIENBTV9JTlRGX01FVEFfSlBFR19USFVNQl9TSVpFLCBtZXRhZGF0YSkgeworICAgICAgICBpbnQzMl90IGZ3a190aHVtYl9zaXplWzJdOworICAgICAgICBmd2tfdGh1bWJfc2l6ZVswXSA9IHRodW1iX3NpemUtPndpZHRoOworICAgICAgICBmd2tfdGh1bWJfc2l6ZVsxXSA9IHRodW1iX3NpemUtPmhlaWdodDsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfSlBFR19USFVNQk5BSUxfU0laRSwgZndrX3RodW1iX3NpemUsIDIpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIHByaXZhdGVEYXRhLCBDQU1fSU5URl9NRVRBX1BSSVZBVEVfREFUQSwgbWV0YWRhdGEpIHsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKFFDQU1FUkEzX1BSSVZBVEVEQVRBX1JFUFJPQ0VTUywKKyAgICAgICAgICAgICAgICBwcml2YXRlRGF0YSwKKyAgICAgICAgICAgICAgICBNQVhfTUVUQURBVEFfUFJJVkFURV9QQVlMT0FEX1NJWkVfSU5fQllURVMgLyBzaXplb2YoaW50MzJfdCkpOworICAgIH0KKworICAgIGlmIChtZXRhZGF0YS0+aXNfdHVuaW5nX3BhcmFtc192YWxpZCkgeworICAgICAgICB1aW50OF90IHR1bmluZ19tZXRhX2RhdGFfYmxvYltzaXplb2YodHVuaW5nX3BhcmFtc190KV07CisgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSAodWludDhfdCAqKSZ0dW5pbmdfbWV0YV9kYXRhX2Jsb2JbMF07CisgICAgICAgIG1ldGFkYXRhLT50dW5pbmdfcGFyYW1zLnR1bmluZ19kYXRhX3ZlcnNpb24gPSBUVU5JTkdfREFUQV9WRVJTSU9OOworCisKKyAgICAgICAgbWVtY3B5KGRhdGEsICgodWludDhfdCAqKSZtZXRhZGF0YS0+dHVuaW5nX3BhcmFtcy50dW5pbmdfZGF0YV92ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgZGF0YSArPSBzaXplb2YodWludDMyX3QpOworCisgICAgICAgIG1lbWNweShkYXRhLCAoKHVpbnQ4X3QgKikmbWV0YWRhdGEtPnR1bmluZ19wYXJhbXMudHVuaW5nX3NlbnNvcl9kYXRhX3NpemUpLAorICAgICAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICBMT0dEKCJ0dW5pbmdfc2Vuc29yX2RhdGFfc2l6ZSAlZCIsKGludCkoKihpbnQgKilkYXRhKSk7CisgICAgICAgIGRhdGEgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKworICAgICAgICBtZW1jcHkoZGF0YSwgKCh1aW50OF90ICopJm1ldGFkYXRhLT50dW5pbmdfcGFyYW1zLnR1bmluZ192ZmVfZGF0YV9zaXplKSwKKyAgICAgICAgICAgICAgICBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgTE9HRCgidHVuaW5nX3ZmZV9kYXRhX3NpemUgJWQiLChpbnQpKCooaW50ICopZGF0YSkpOworICAgICAgICBkYXRhICs9IHNpemVvZih1aW50MzJfdCk7CisKKyAgICAgICAgbWVtY3B5KGRhdGEsICgodWludDhfdCAqKSZtZXRhZGF0YS0+dHVuaW5nX3BhcmFtcy50dW5pbmdfY3BwX2RhdGFfc2l6ZSksCisgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIExPR0QoInR1bmluZ19jcHBfZGF0YV9zaXplICVkIiwoaW50KSgqKGludCAqKWRhdGEpKTsKKyAgICAgICAgZGF0YSArPSBzaXplb2YodWludDMyX3QpOworCisgICAgICAgIG1lbWNweShkYXRhLCAoKHVpbnQ4X3QgKikmbWV0YWRhdGEtPnR1bmluZ19wYXJhbXMudHVuaW5nX2NhY19kYXRhX3NpemUpLAorICAgICAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICBMT0dEKCJ0dW5pbmdfY2FjX2RhdGFfc2l6ZSAlZCIsKGludCkoKihpbnQgKilkYXRhKSk7CisgICAgICAgIGRhdGEgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKworICAgICAgICBtZXRhZGF0YS0+dHVuaW5nX3BhcmFtcy50dW5pbmdfbW9kM19kYXRhX3NpemUgPSAwOworICAgICAgICBtZW1jcHkoZGF0YSwgKCh1aW50OF90ICopJm1ldGFkYXRhLT50dW5pbmdfcGFyYW1zLnR1bmluZ19tb2QzX2RhdGFfc2l6ZSksCisgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIExPR0QoInR1bmluZ19tb2QzX2RhdGFfc2l6ZSAlZCIsKGludCkoKihpbnQgKilkYXRhKSk7CisgICAgICAgIGRhdGEgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKworICAgICAgICBzaXplX3QgY291bnQgPSBNSU4obWV0YWRhdGEtPnR1bmluZ19wYXJhbXMudHVuaW5nX3NlbnNvcl9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgVFVOSU5HX1NFTlNPUl9EQVRBX01BWCk7CisgICAgICAgIG1lbWNweShkYXRhLCAoKHVpbnQ4X3QgKikmbWV0YWRhdGEtPnR1bmluZ19wYXJhbXMuZGF0YSksCisgICAgICAgICAgICAgICAgY291bnQpOworICAgICAgICBkYXRhICs9IGNvdW50OworCisgICAgICAgIGNvdW50ID0gTUlOKG1ldGFkYXRhLT50dW5pbmdfcGFyYW1zLnR1bmluZ192ZmVfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgIFRVTklOR19WRkVfREFUQV9NQVgpOworICAgICAgICBtZW1jcHkoZGF0YSwgKCh1aW50OF90ICopJm1ldGFkYXRhLT50dW5pbmdfcGFyYW1zLmRhdGFbVFVOSU5HX1ZGRV9EQVRBX09GRlNFVF0pLAorICAgICAgICAgICAgICAgIGNvdW50KTsKKyAgICAgICAgZGF0YSArPSBjb3VudDsKKworICAgICAgICBjb3VudCA9IE1JTihtZXRhZGF0YS0+dHVuaW5nX3BhcmFtcy50dW5pbmdfY3BwX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICBUVU5JTkdfQ1BQX0RBVEFfTUFYKTsKKyAgICAgICAgbWVtY3B5KGRhdGEsICgodWludDhfdCAqKSZtZXRhZGF0YS0+dHVuaW5nX3BhcmFtcy5kYXRhW1RVTklOR19DUFBfREFUQV9PRkZTRVRdKSwKKyAgICAgICAgICAgICAgICBjb3VudCk7CisgICAgICAgIGRhdGEgKz0gY291bnQ7CisKKyAgICAgICAgY291bnQgPSBNSU4obWV0YWRhdGEtPnR1bmluZ19wYXJhbXMudHVuaW5nX2NhY19kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgVFVOSU5HX0NBQ19EQVRBX01BWCk7CisgICAgICAgIG1lbWNweShkYXRhLCAoKHVpbnQ4X3QgKikmbWV0YWRhdGEtPnR1bmluZ19wYXJhbXMuZGF0YVtUVU5JTkdfQ0FDX0RBVEFfT0ZGU0VUXSksCisgICAgICAgICAgICAgICAgY291bnQpOworICAgICAgICBkYXRhICs9IGNvdW50OworCisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShRQ0FNRVJBM19UVU5JTkdfTUVUQV9EQVRBX0JMT0IsCisgICAgICAgICAgICAgICAgKGludDMyX3QgKikodm9pZCAqKXR1bmluZ19tZXRhX2RhdGFfYmxvYiwKKyAgICAgICAgICAgICAgICAoc2l6ZV90KShkYXRhLXR1bmluZ19tZXRhX2RhdGFfYmxvYikgLyBzaXplb2YodWludDMyX3QpKTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fbmV1dHJhbF9jb2xfcG9pbnRfdCwgbmV1Q29sUG9pbnQsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX05FVVRSQUxfQ09MX1BPSU5ULCBtZXRhZGF0YSkgeworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfTkVVVFJBTF9DT0xPUl9QT0lOVCwKKyAgICAgICAgICAgICAgICAoY2FtZXJhX21ldGFkYXRhX3JhdGlvbmFsX3QgKikodm9pZCAqKW5ldUNvbFBvaW50LT5uZXV0cmFsX2NvbF9wb2ludCwKKyAgICAgICAgICAgICAgICBORVVUUkFMX0NPTF9QT0lOVFMpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCBzaGFkaW5nTWFwTW9kZSwgQ0FNX0lOVEZfTUVUQV9MRU5TX1NIQURJTkdfTUFQX01PREUsIG1ldGFkYXRhKSB7CisgICAgICAgIHVpbnQ4X3QgZndrX3NoYWRpbmdNYXBNb2RlID0gKHVpbnQ4X3QpICpzaGFkaW5nTWFwTW9kZTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREUsICZmd2tfc2hhZGluZ01hcE1vZGUsIDEpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9hcmVhX3QsIGhBZVJlZ2lvbnMsIENBTV9JTlRGX01FVEFfQUVDX1JPSSwgbWV0YWRhdGEpIHsKKyAgICAgICAgaW50MzJfdCBhZVJlZ2lvbnNbUkVHSU9OU19UVVBMRV9DT1VOVF07CisgICAgICAgIC8vIEFkanVzdCBjcm9wIHJlZ2lvbiBmcm9tIHNlbnNvciBvdXRwdXQgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gYWN0aXZlCisgICAgICAgIC8vIGFycmF5IGNvb3JkaW5hdGUgc3lzdGVtLgorICAgICAgICBtQ3JvcFJlZ2lvbk1hcHBlci50b0FjdGl2ZUFycmF5KGhBZVJlZ2lvbnMtPnJlY3QubGVmdCwgaEFlUmVnaW9ucy0+cmVjdC50b3AsCisgICAgICAgICAgICAgICAgaEFlUmVnaW9ucy0+cmVjdC53aWR0aCwgaEFlUmVnaW9ucy0+cmVjdC5oZWlnaHQpOworCisgICAgICAgIGNvbnZlcnRUb1JlZ2lvbnMoaEFlUmVnaW9ucy0+cmVjdCwgYWVSZWdpb25zLCBoQWVSZWdpb25zLT53ZWlnaHQpOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX1JFR0lPTlMsIGFlUmVnaW9ucywKKyAgICAgICAgICAgICAgICBSRUdJT05TX1RVUExFX0NPVU5UKTsKKyAgICAgICAgTE9HRCgiTWV0YWRhdGEgOiBBTkRST0lEX0NPTlRST0xfQUVfUkVHSU9OUzogRldLOiBbJWQsJWQsJWQsJWRdIEhBTDogWyVkLCVkLCVkLCVkXSIsCisgICAgICAgICAgICAgICAgIGFlUmVnaW9uc1swXSwgYWVSZWdpb25zWzFdLCBhZVJlZ2lvbnNbMl0sIGFlUmVnaW9uc1szXSwKKyAgICAgICAgICAgICAgICBoQWVSZWdpb25zLT5yZWN0LmxlZnQsIGhBZVJlZ2lvbnMtPnJlY3QudG9wLCBoQWVSZWdpb25zLT5yZWN0LndpZHRoLAorICAgICAgICAgICAgICAgIGhBZVJlZ2lvbnMtPnJlY3QuaGVpZ2h0KTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgYWZTdGF0ZSwgQ0FNX0lOVEZfTUVUQV9BRl9TVEFURSwgbWV0YWRhdGEpIHsKKyAgICAgICAgdWludDhfdCBmd2tfYWZTdGF0ZSA9ICh1aW50OF90KSAqYWZTdGF0ZTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwgJmZ3a19hZlN0YXRlLCAxKTsKKyAgICAgICAgTE9HRCgidXJnZW50IE1ldGFkYXRhIDogQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFICV1IiwgKmFmU3RhdGUpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGZsb2F0LCBmb2N1c0Rpc3RhbmNlLCBDQU1fSU5URl9NRVRBX0xFTlNfRk9DVVNfRElTVEFOQ0UsIG1ldGFkYXRhKSB7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0xFTlNfRk9DVVNfRElTVEFOQ0UgLCBmb2N1c0Rpc3RhbmNlLCAxKTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShmbG9hdCwgZm9jdXNSYW5nZSwgQ0FNX0lOVEZfTUVUQV9MRU5TX0ZPQ1VTX1JBTkdFLCBtZXRhZGF0YSkgeworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9MRU5TX0ZPQ1VTX1JBTkdFICwgZm9jdXNSYW5nZSwgMik7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2FmX2xlbnNfc3RhdGVfdCwgbGVuc1N0YXRlLCBDQU1fSU5URl9NRVRBX0xFTlNfU1RBVEUsIG1ldGFkYXRhKSB7CisgICAgICAgIHVpbnQ4X3QgZndrX2xlbnNTdGF0ZSA9ICpsZW5zU3RhdGU7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0xFTlNfU1RBVEUgLCAmZndrX2xlbnNTdGF0ZSwgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2FyZWFfdCwgaEFmUmVnaW9ucywgQ0FNX0lOVEZfTUVUQV9BRl9ST0ksIG1ldGFkYXRhKSB7CisgICAgICAgIC8qYWYgcmVnaW9ucyovCisgICAgICAgIGludDMyX3QgYWZSZWdpb25zW1JFR0lPTlNfVFVQTEVfQ09VTlRdOworICAgICAgICAvLyBBZGp1c3QgY3JvcCByZWdpb24gZnJvbSBzZW5zb3Igb3V0cHV0IGNvb3JkaW5hdGUgc3lzdGVtIHRvIGFjdGl2ZQorICAgICAgICAvLyBhcnJheSBjb29yZGluYXRlIHN5c3RlbS4KKyAgICAgICAgbUNyb3BSZWdpb25NYXBwZXIudG9BY3RpdmVBcnJheShoQWZSZWdpb25zLT5yZWN0LmxlZnQsIGhBZlJlZ2lvbnMtPnJlY3QudG9wLAorICAgICAgICAgICAgICAgIGhBZlJlZ2lvbnMtPnJlY3Qud2lkdGgsIGhBZlJlZ2lvbnMtPnJlY3QuaGVpZ2h0KTsKKworICAgICAgICBjb252ZXJ0VG9SZWdpb25zKGhBZlJlZ2lvbnMtPnJlY3QsIGFmUmVnaW9ucywgaEFmUmVnaW9ucy0+d2VpZ2h0KTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRl9SRUdJT05TLCBhZlJlZ2lvbnMsCisgICAgICAgICAgICAgICAgUkVHSU9OU19UVVBMRV9DT1VOVCk7CisgICAgICAgIExPR0QoIk1ldGFkYXRhIDogQU5EUk9JRF9DT05UUk9MX0FGX1JFR0lPTlM6IEZXSzogWyVkLCVkLCVkLCVkXSBIQUw6IFslZCwlZCwlZCwlZF0iLAorICAgICAgICAgICAgICAgICBhZlJlZ2lvbnNbMF0sIGFmUmVnaW9uc1sxXSwgYWZSZWdpb25zWzJdLCBhZlJlZ2lvbnNbM10sCisgICAgICAgICAgICAgICAgaEFmUmVnaW9ucy0+cmVjdC5sZWZ0LCBoQWZSZWdpb25zLT5yZWN0LnRvcCwgaEFmUmVnaW9ucy0+cmVjdC53aWR0aCwKKyAgICAgICAgICAgICAgICBoQWZSZWdpb25zLT5yZWN0LmhlaWdodCk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIGhhbF9hYl9tb2RlLCBDQU1fSU5URl9QQVJNX0FOVElCQU5ESU5HLCBtZXRhZGF0YSkgeworICAgICAgICBpbnQgdmFsID0gbG9va3VwRndrTmFtZShBTlRJQkFORElOR19NT0RFU19NQVAsIE1FVEFEQVRBX01BUF9TSVpFKEFOVElCQU5ESU5HX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgKmhhbF9hYl9tb2RlKTsKKyAgICAgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IHZhbCkgeworICAgICAgICAgICAgdWludDhfdCBmd2tfYWJfbW9kZSA9ICh1aW50OF90KXZhbDsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfQU5USUJBTkRJTkdfTU9ERSwgJmZ3a19hYl9tb2RlLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCBiZXN0c2hvdE1vZGUsIENBTV9JTlRGX1BBUk1fQkVTVFNIT1RfTU9ERSwgbWV0YWRhdGEpIHsKKyAgICAgICAgaW50IHZhbCA9IGxvb2t1cEZ3a05hbWUoU0NFTkVfTU9ERVNfTUFQLAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX01BUF9TSVpFKFNDRU5FX01PREVTX01BUCksICpiZXN0c2hvdE1vZGUpOworICAgICAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gdmFsKSB7CisgICAgICAgICAgICB1aW50OF90IGZ3a0Jlc3RzaG90TW9kZSA9ICh1aW50OF90KXZhbDsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERSwgJmZ3a0Jlc3RzaG90TW9kZSwgMSk7CisgICAgICAgICAgICBMT0dEKCJNZXRhZGF0YSA6IEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dIKCJNZXRhZGF0YSBub3QgZm91bmQgOiBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERSIpOworICAgICAgICB9CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUodWludDMyX3QsIG1vZGUsIENBTV9JTlRGX01FVEFfTU9ERSwgbWV0YWRhdGEpIHsKKyAgICAgICAgIHVpbnQ4X3QgZndrX21vZGUgPSAodWludDhfdCkgKm1vZGU7CisgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX01PREUsICZmd2tfbW9kZSwgMSk7CisgICAgfQorCisgICAgLyogQ29uc3RhbnQgbWV0YWRhdGEgdmFsdWVzIHRvIGJlIHVwZGF0ZSovCisgICAgdWludDhfdCBob3RQaXhlbE1vZGVGYXN0ID0gQU5EUk9JRF9IT1RfUElYRUxfTU9ERV9GQVNUOworICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0hPVF9QSVhFTF9NT0RFLCAmaG90UGl4ZWxNb2RlRmFzdCwgMSk7CisKKyAgICB1aW50OF90IGhvdFBpeGVsTWFwTW9kZSA9IEFORFJPSURfU1RBVElTVElDU19IT1RfUElYRUxfTUFQX01PREVfT0ZGOworICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1NUQVRJU1RJQ1NfSE9UX1BJWEVMX01BUF9NT0RFLCAmaG90UGl4ZWxNYXBNb2RlLCAxKTsKKworICAgIGludDMyX3QgaG90UGl4ZWxNYXBbMl07CisgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfU1RBVElTVElDU19IT1RfUElYRUxfTUFQLCAmaG90UGl4ZWxNYXBbMF0sIDApOworCisgICAgLy8gQ0RTCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgY2RzLCBDQU1fSU5URl9QQVJNX0NEU19NT0RFLCBtZXRhZGF0YSkgeworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoUUNBTUVSQTNfQ0RTX01PREUsIGNkcywgMSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3NlbnNvcl9oZHJfdHlwZV90LCB2aGRyLCBDQU1fSU5URl9QQVJNX1NFTlNPUl9IRFIsIG1ldGFkYXRhKSB7CisgICAgICAgIGludDMyX3QgZndrX2hkcjsKKyAgICAgICAgaWYoKnZoZHIgPT0gQ0FNX1NFTlNPUl9IRFJfT0ZGKSB7CisgICAgICAgICAgICBmd2tfaGRyID0gUUNBTUVSQTNfVklERU9fSERSX01PREVfT0ZGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZndrX2hkciA9IFFDQU1FUkEzX1ZJREVPX0hEUl9NT0RFX09OOworICAgICAgICB9CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShRQ0FNRVJBM19WSURFT19IRFJfTU9ERSwgJmZ3a19oZHIsIDEpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9pcl9tb2RlX3R5cGVfdCwgaXIsIENBTV9JTlRGX01FVEFfSVJfTU9ERSwgbWV0YWRhdGEpIHsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKFFDQU1FUkEzX0lSX01PREUsKGludDMyX3QgKikgJmlyLCAxKTsKKyAgICB9CisKKyAgICAvLyBBRUMgU1BFRUQKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShmbG9hdCwgYWVjLCBDQU1fSU5URl9NRVRBX0FFQ19DT05WRVJHRU5DRV9TUEVFRCwgbWV0YWRhdGEpIHsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKFFDQU1FUkEzX0FFQ19DT05WRVJHRU5DRV9TUEVFRCwgYWVjLCAxKTsKKyAgICB9CisKKyAgICAvLyBBV0IgU1BFRUQKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShmbG9hdCwgYXdiLCBDQU1fSU5URl9NRVRBX0FXQl9DT05WRVJHRU5DRV9TUEVFRCwgbWV0YWRhdGEpIHsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKFFDQU1FUkEzX0FXQl9DT05WRVJHRU5DRV9TUEVFRCwgYXdiLCAxKTsKKyAgICB9CisKKyAgICAvLyBUTlIKKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fZGVub2lzZV9wYXJhbV90LCB0bnIsIENBTV9JTlRGX1BBUk1fVEVNUE9SQUxfREVOT0lTRSwgbWV0YWRhdGEpIHsKKyAgICAgICAgdWludDhfdCB0bnJfZW5hYmxlICAgICAgID0gdG5yLT5kZW5vaXNlX2VuYWJsZTsKKyAgICAgICAgaW50MzJfdCB0bnJfcHJvY2Vzc190eXBlID0gKGludDMyX3QpdG5yLT5wcm9jZXNzX3BsYXRlczsKKworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoUUNBTUVSQTNfVEVNUE9SQUxfREVOT0lTRV9FTkFCTEUsICZ0bnJfZW5hYmxlLCAxKTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKFFDQU1FUkEzX1RFTVBPUkFMX0RFTk9JU0VfUFJPQ0VTU19UWVBFLCAmdG5yX3Byb2Nlc3NfdHlwZSwgMSk7CisgICAgfQorCisgICAgLy8gUmVwcm9jZXNzIGNyb3AgZGF0YQorICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9jcm9wX2RhdGFfdCwgY3JvcF9kYXRhLCBDQU1fSU5URl9NRVRBX0NST1BfREFUQSwgbWV0YWRhdGEpIHsKKyAgICAgICAgdWludDhfdCBjbnQgPSBjcm9wX2RhdGEtPm51bV9vZl9zdHJlYW1zOworICAgICAgICBpZiAoICgwID49IGNudCkgfHwgKGNudCA+IE1BWF9OVU1fU1RSRUFNUykpIHsKKyAgICAgICAgICAgIC8vIG1tLXFjYW1lcmEtZGFlbW9uIG9ubHkgcG9zdHMgY3JvcF9kYXRhIGZvciBzdHJlYW1zCisgICAgICAgICAgICAvLyBub3QgbGlua2VkIHRvIHBwcm9jLiBTbyBubyB2YWxpZCBjcm9wIG1ldGFkYXRhIGlzIG5vdAorICAgICAgICAgICAgLy8gbmVjZXNzYXJpbHkgYW4gZXJyb3IgY2FzZS4KKyAgICAgICAgICAgIExPR0QoIk5vIHZhbGlkIGNyb3AgbWV0YWRhdGEgZW50cmllcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDMyX3QgcmVwcm9jX3N0cmVhbV9pZDsKKyAgICAgICAgICAgIGlmICggTk9fRVJST1IgIT0gZ2V0UmVwcm9jZXNzaWJsZU91dHB1dFN0cmVhbUlkKHJlcHJvY19zdHJlYW1faWQpKSB7CisgICAgICAgICAgICAgICAgTE9HRCgiTm8gcmVwcm9jZXNzaWJsZSBzdHJlYW0gZm91bmQsIGlnbm9yZSBjcm9wIGRhdGEiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgICAgICAgICAgICAgVmVjdG9yPGludDMyX3Q+IHJvaV9tYXA7CisgICAgICAgICAgICAgICAgaW50MzJfdCAqY3JvcCA9IG5ldyBpbnQzMl90W2NudCo0XTsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCA9PSBjcm9wKSB7CisgICAgICAgICAgICAgICAgICAgcmMgPSBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChOT19FUlJPUiA9PSByYykgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmVhbXNfZm91bmQgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JvcF9kYXRhLT5jcm9wX2luZm9baV0uc3RyZWFtX2lkID09IHJlcHJvY19zdHJlYW1faWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHByb2NEb25lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhBTCBhbHJlYWR5IGRvZXMgaW50ZXJuYWwgcmVwcm9jZXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlaXRoZXIgdmlhIHJlcHJvY2Vzc2luZyBiZWZvcmUgSlBFRyBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igb2ZmbGluZSBwb3N0cHJvY2Vzc2luZyBmb3IgcHByb2MgYnlwYXNzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BbMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wWzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcFsyXSA9IG1JbnB1dFN0cmVhbUluZm8uZGltLndpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wWzNdID0gbUlucHV0U3RyZWFtSW5mby5kaW0uaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BbMF0gPSBjcm9wX2RhdGEtPmNyb3BfaW5mb1tpXS5jcm9wLmxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BbMV0gPSBjcm9wX2RhdGEtPmNyb3BfaW5mb1tpXS5jcm9wLnRvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcFsyXSA9IGNyb3BfZGF0YS0+Y3JvcF9pbmZvW2ldLmNyb3Aud2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BbM10gPSBjcm9wX2RhdGEtPmNyb3BfaW5mb1tpXS5jcm9wLmhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9pX21hcC5hZGQoY3JvcF9kYXRhLT5jcm9wX2luZm9baV0ucm9pX21hcC5sZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2lfbWFwLmFkZChjcm9wX2RhdGEtPmNyb3BfaW5mb1tpXS5yb2lfbWFwLnRvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9pX21hcC5hZGQoY3JvcF9kYXRhLT5jcm9wX2luZm9baV0ucm9pX21hcC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9pX21hcC5hZGQoY3JvcF9kYXRhLT5jcm9wX2luZm9baV0ucm9pX21hcC5oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbXNfZm91bmQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dEKCJBZGRpbmcgcmVwcm9jZXNzIGNyb3AgZGF0YSBmb3Igc3RyZWFtICVkeCVkLCAlZHglZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wWzBdLCBjcm9wWzFdLCBjcm9wWzJdLCBjcm9wWzNdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dEKCJBZGRpbmcgcmVwcm9jZXNzIGNyb3Agcm9pIG1hcCBmb3Igc3RyZWFtICVkeCVkLCAlZHglZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2RhdGEtPmNyb3BfaW5mb1tpXS5yb2lfbWFwLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2RhdGEtPmNyb3BfaW5mb1tpXS5yb2lfbWFwLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb3BfZGF0YS0+Y3JvcF9pbmZvW2ldLnJvaV9tYXAud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2RhdGEtPmNyb3BfaW5mb1tpXS5yb2lfbWFwLmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShRQ0FNRVJBM19DUk9QX0NPVU5UX1JFUFJPQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtc19mb3VuZCwgMSk7CisgICAgICAgICAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShRQ0FNRVJBM19DUk9QX1JFUFJPQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wLCAoc2l6ZV90KShzdHJlYW1zX2ZvdW5kICogNCkpOworICAgICAgICAgICAgICAgICAgICBpZiAocm9pX21hcC5hcnJheSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoUUNBTUVSQTNfQ1JPUF9ST0lfTUFQX1JFUFJPQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9pX21hcC5hcnJheSgpLCByb2lfbWFwLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGlmIChjcm9wKSB7CisgICAgICAgICAgICAgICAgICAgZGVsZXRlIFtdIGNyb3A7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWJlcnJhdGlvbl9tb2Rlc19jb3VudCA9PSAwKSB7CisgICAgICAgIC8vIFJlZ2FyZGxlc3Mgb2YgQ0FDIHN1cHBvcnRzIG9yIG5vdCwgQ1RTIGlzIGV4cGVjdGluZyB0aGUgQ0FDIHJlc3VsdCB0byBiZSBub24gTlVMTCBhbmQKKyAgICAgICAgLy8gc28gaGFyZGNvZGluZyB0aGUgQ0FDIHJlc3VsdCB0byBPRkYgbW9kZS4KKyAgICAgICAgdWludDhfdCBmd2tDYWNNb2RlID0gQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERV9PRkY7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFLCAmZndrQ2FjTW9kZSwgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2FiZXJyYXRpb25fbW9kZV90LCBjYWNNb2RlLCBDQU1fSU5URl9QQVJNX0NBQywgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGludCB2YWwgPSBsb29rdXBGd2tOYW1lKENPTE9SX0FCRVJSQVRJT05fTUFQLCBNRVRBREFUQV9NQVBfU0laRShDT0xPUl9BQkVSUkFUSU9OX01BUCksCisgICAgICAgICAgICAgICAgICAgICpjYWNNb2RlKTsKKyAgICAgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHJlc3VsdENhY01vZGUgPSAodWludDhfdCl2YWw7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBDQUMgcmVzdWx0IGZyb20gQ0IgaXMgZXF1YWwgdG8gRnJhbWV3b3JrIHNldCBDQUMgbW9kZQorICAgICAgICAgICAgICAgIC8vIElmIG5vdCBlcXVhbCB0aGVuIHNldCB0aGUgQ0FDIG1vZGUgY2FtZSBpbiBjb3JyZXNwb25kaW5nIHJlcXVlc3QKKyAgICAgICAgICAgICAgICBpZiAoZndrX2NhY01vZGUgIT0gcmVzdWx0Q2FjTW9kZSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWNNb2RlID0gZndrX2NhY01vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExPR0QoImZ3a19jYWNNb2RlPSVkIHJlc3VsdENhY01vZGU9JWQiLCBmd2tfY2FjTW9kZSwgcmVzdWx0Q2FjTW9kZSk7CisgICAgICAgICAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX01PREUsICZyZXN1bHRDYWNNb2RlLCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBDQUMgY2FtZXJhIHBhcmFtZXRlcjogJWQiLCAqY2FjTW9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQb3N0IGJsb2Igb2YgY2FtX2Nkc19kYXRhIHRocm91Z2ggdmVuZG9yIHRhZy4KKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fY2RzX2RhdGFfdCwgY2RzSW5mbywgQ0FNX0lOVEZfTUVUQV9DRFNfREFUQSwgbWV0YWRhdGEpIHsKKyAgICAgICAgdWludDhfdCBjbnQgPSBjZHNJbmZvLT5udW1fb2Zfc3RyZWFtczsKKyAgICAgICAgY2FtX2Nkc19kYXRhX3QgY2RzRGF0YU92ZXJyaWRlOworICAgICAgICBtZW1zZXQoJmNkc0RhdGFPdmVycmlkZSwgMCwgc2l6ZW9mKGNkc0RhdGFPdmVycmlkZSkpOworICAgICAgICBjZHNEYXRhT3ZlcnJpZGUuc2Vzc2lvbl9jZHNfZW5hYmxlID0gY2RzSW5mby0+c2Vzc2lvbl9jZHNfZW5hYmxlOworICAgICAgICBjZHNEYXRhT3ZlcnJpZGUubnVtX29mX3N0cmVhbXMgPSAxOworICAgICAgICBpZiAoKDAgPCBjbnQpICYmIChjbnQgPD0gTUFYX05VTV9TVFJFQU1TKSkgeworICAgICAgICAgICAgdWludDMyX3QgcmVwcm9jX3N0cmVhbV9pZDsKKyAgICAgICAgICAgIGlmICggTk9fRVJST1IgIT0gZ2V0UmVwcm9jZXNzaWJsZU91dHB1dFN0cmVhbUlkKHJlcHJvY19zdHJlYW1faWQpKSB7CisgICAgICAgICAgICAgICAgTE9HRCgiTm8gcmVwcm9jZXNzaWJsZSBzdHJlYW0gZm91bmQsIGlnbm9yZSBjZHMgZGF0YSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjZHNJbmZvLT5jZHNfaW5mb1tpXS5zdHJlYW1faWQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByb2Nfc3RyZWFtX2lkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjZHNEYXRhT3ZlcnJpZGUuY2RzX2luZm9bMF0uY2RzX2VuYWJsZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkc0luZm8tPmNkc19pbmZvW2ldLmNkc19lbmFibGU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0QoIkludmFsaWQgc3RyZWFtIGNvdW50ICVkIGluIENEU19EQVRBIiwgY250KTsKKyAgICAgICAgfQorICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoUUNBTUVSQTNfQ0RTX0lORk8sCisgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKikmY2RzRGF0YU92ZXJyaWRlLAorICAgICAgICAgICAgICAgIHNpemVvZihjYW1fY2RzX2RhdGFfdCkpOworICAgIH0KKworICAgIC8vIExkYWYgY2FsaWJyYXRpb24gZGF0YQorICAgIGlmICghbUxkYWZDYWxpYkV4aXN0KSB7CisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCBsZGFmQ2FsaWIsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9MREFGX0VYSUYsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBtTGRhZkNhbGliRXhpc3QgPSB0cnVlOworICAgICAgICAgICAgbUxkYWZDYWxpYlswXSA9IGxkYWZDYWxpYlswXTsKKyAgICAgICAgICAgIG1MZGFmQ2FsaWJbMV0gPSBsZGFmQ2FsaWJbMV07CisgICAgICAgICAgICBMT0dEKCJsZGFmQ2FsaWJbMF0gaXMgJWQsIGxkYWZDYWxpYlsxXSBpcyAlZCIsCisgICAgICAgICAgICAgICAgICAgIGxkYWZDYWxpYlswXSwgbGRhZkNhbGliWzFdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERETSBkZWJ1ZyBkYXRhIHRocm91Z2ggdmVuZG9yIHRhZworICAgIGNhbV9kZG1faW5mb190IGRkbV9pbmZvOworICAgIG1lbXNldCgmZGRtX2luZm8sIDAsIHNpemVvZihjYW1fZGRtX2luZm9fdCkpOworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9zdHJlYW1fY3JvcF9pbmZvX3QsIHNlbnNvckNyb3BJbmZvLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9TTkFQX0NST1BfSU5GT19TRU5TT1IsIG1ldGFkYXRhKSB7CisgICAgICAgIG1lbWNweSgmKGRkbV9pbmZvLnNlbnNvcl9jcm9wX2luZm8pLCBzZW5zb3JDcm9wSW5mbywgc2l6ZW9mKGNhbV9zdHJlYW1fY3JvcF9pbmZvX3QpKTsKKyAgICB9CisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3N0cmVhbV9jcm9wX2luZm9fdCwgY2FtaWZDcm9wSW5mbywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfU05BUF9DUk9QX0lORk9fQ0FNSUYsIG1ldGFkYXRhKSB7CisgICAgICAgIG1lbWNweSgmKGRkbV9pbmZvLmNhbWlmX2Nyb3BfaW5mbyksIGNhbWlmQ3JvcEluZm8sIHNpemVvZihjYW1fc3RyZWFtX2Nyb3BfaW5mb190KSk7CisgICAgfQorICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9zdHJlYW1fY3JvcF9pbmZvX3QsIGlzcENyb3BJbmZvLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9TTkFQX0NST1BfSU5GT19JU1AsIG1ldGFkYXRhKSB7CisgICAgICAgIG1lbWNweSgmKGRkbV9pbmZvLmlzcF9jcm9wX2luZm8pLCBpc3BDcm9wSW5mbywgc2l6ZW9mKGNhbV9zdHJlYW1fY3JvcF9pbmZvX3QpKTsKKyAgICB9CisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3N0cmVhbV9jcm9wX2luZm9fdCwgY3BwQ3JvcEluZm8sCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX1NOQVBfQ1JPUF9JTkZPX0NQUCwgbWV0YWRhdGEpIHsKKyAgICAgICAgbWVtY3B5KCYoZGRtX2luZm8uY3BwX2Nyb3BfaW5mbyksIGNwcENyb3BJbmZvLCBzaXplb2YoY2FtX3N0cmVhbV9jcm9wX2luZm9fdCkpOworICAgIH0KKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fZm9jYWxfbGVuZ3RoX3JhdGlvX3QsIHJhdGlvLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9BRl9GT0NBTF9MRU5HVEhfUkFUSU8sIG1ldGFkYXRhKSB7CisgICAgICAgIG1lbWNweSgmKGRkbV9pbmZvLmFmX2ZvY2FsX2xlbmd0aF9yYXRpbyksIHJhdGlvLCBzaXplb2YoY2FtX2ZvY2FsX2xlbmd0aF9yYXRpb190KSk7CisgICAgfQorICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIGZsaXAsIENBTV9JTlRGX1BBUk1fRkxJUCwgbWV0YWRhdGEpIHsKKyAgICAgICAgbWVtY3B5KCYoZGRtX2luZm8ucGlwZWxpbmVfZmxpcCksIGZsaXAsIHNpemVvZihpbnQzMl90KSk7CisgICAgfQorICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9yb3RhdGlvbl9pbmZvX3QsIHJvdGF0aW9uSW5mbywKKyAgICAgICAgICAgIENBTV9JTlRGX1BBUk1fUk9UQVRJT04sIG1ldGFkYXRhKSB7CisgICAgICAgIG1lbWNweSgmKGRkbV9pbmZvLnJvdGF0aW9uX2luZm8pLCByb3RhdGlvbkluZm8sIHNpemVvZihjYW1fcm90YXRpb25faW5mb190KSk7CisgICAgfQorICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShRQ0FNRVJBM19IQUxfUFJJVkFURURBVEFfRERNX0RBVEFfQkxPQiwKKyAgICAgICAgICAgICh1aW50OF90ICopJmRkbV9pbmZvLCBzaXplb2YoY2FtX2RkbV9pbmZvX3QpKTsKKworICAgIC8qIEluIGJhdGNoIG1vZGUsIGNhY2hlIHRoZSBmaXJzdCBtZXRhZGF0YSBpbiB0aGUgYmF0Y2ggKi8KKyAgICBpZiAobUJhdGNoU2l6ZSAmJiBmaXJzdE1ldGFkYXRhSW5CYXRjaCkgeworICAgICAgICBtQ2FjaGVkTWV0YWRhdGEuY2xlYXIoKTsKKyAgICAgICAgbUNhY2hlZE1ldGFkYXRhID0gY2FtTWV0YWRhdGE7CisgICAgfQorCisgICAgcmVzdWx0TWV0YWRhdGEgPSBjYW1NZXRhZGF0YS5yZWxlYXNlKCk7CisgICAgcmV0dXJuIHJlc3VsdE1ldGFkYXRhOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNhdmVFeGlmUGFyYW1zCisgKgorICogREVTQ1JJUFRJT046CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtZXRhZGF0YSA6IG1ldGFkYXRhIGluZm9ybWF0aW9uIGZyb20gY2FsbGJhY2sKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpzYXZlRXhpZlBhcmFtcyhtZXRhZGF0YV9idWZmZXJfdCAqbWV0YWRhdGEpCit7CisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2FlX2V4aWZfZGVidWdfdCwgYWVfZXhpZl9kZWJ1Z19wYXJhbXMsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQUUsIG1ldGFkYXRhKSB7CisgICAgICAgIGlmIChtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgICAgIG1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+YWVfZGVidWdfcGFyYW1zID0gKmFlX2V4aWZfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgbUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5hZV9kZWJ1Z19wYXJhbXNfdmFsaWQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9hd2JfZXhpZl9kZWJ1Z190LGF3Yl9leGlmX2RlYnVnX3BhcmFtcywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR19BV0IsIG1ldGFkYXRhKSB7CisgICAgICAgIGlmIChtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgICAgIG1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+YXdiX2RlYnVnX3BhcmFtcyA9ICphd2JfZXhpZl9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICBtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMtPmF3Yl9kZWJ1Z19wYXJhbXNfdmFsaWQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9hZl9leGlmX2RlYnVnX3QsYWZfZXhpZl9kZWJ1Z19wYXJhbXMsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQUYsIG1ldGFkYXRhKSB7CisgICAgICAgIGlmIChtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgICAgIG1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+YWZfZGVidWdfcGFyYW1zID0gKmFmX2V4aWZfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgbUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5hZl9kZWJ1Z19wYXJhbXNfdmFsaWQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9hc2RfZXhpZl9kZWJ1Z190LCBhc2RfZXhpZl9kZWJ1Z19wYXJhbXMsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQVNELCBtZXRhZGF0YSkgeworICAgICAgICBpZiAobUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zKSB7CisgICAgICAgICAgICBtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMtPmFzZF9kZWJ1Z19wYXJhbXMgPSAqYXNkX2V4aWZfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgbUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5hc2RfZGVidWdfcGFyYW1zX3ZhbGlkID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdCxzdGF0c19leGlmX2RlYnVnX3BhcmFtcywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR19TVEFUUywgbWV0YWRhdGEpIHsKKyAgICAgICAgaWYgKG1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcykgeworICAgICAgICAgICAgbUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5zdGF0c19kZWJ1Z19wYXJhbXMgPSAqc3RhdHNfZXhpZl9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICBtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMtPnN0YXRzX2RlYnVnX3BhcmFtc192YWxpZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2Jlc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdCxiZXN0YXRzX2V4aWZfZGVidWdfcGFyYW1zLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX0JFU1RBVFMsIG1ldGFkYXRhKSB7CisgICAgICAgIGlmIChtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgICAgIG1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+YmVzdGF0c19kZWJ1Z19wYXJhbXMgPSAqYmVzdGF0c19leGlmX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIG1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcy0+YmVzdGF0c19kZWJ1Z19wYXJhbXNfdmFsaWQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9iaGlzdF9idWZmZXJfZXhpZl9kZWJ1Z190LCBiaGlzdF9leGlmX2RlYnVnX3BhcmFtcywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR19CSElTVCwgbWV0YWRhdGEpIHsKKyAgICAgICAgaWYgKG1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcykgeworICAgICAgICAgICAgbUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5iaGlzdF9kZWJ1Z19wYXJhbXMgPSAqYmhpc3RfZXhpZl9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICBtRXhpZlBhcmFtcy5kZWJ1Z19wYXJhbXMtPmJoaXN0X2RlYnVnX3BhcmFtc192YWxpZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3EzYV90dW5pbmdfaW5mb190LCBxM2FfdHVuaW5nX2V4aWZfZGVidWdfcGFyYW1zLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHXzNBX1RVTklORywgbWV0YWRhdGEpIHsKKyAgICAgICAgaWYgKG1FeGlmUGFyYW1zLmRlYnVnX3BhcmFtcykgeworICAgICAgICAgICAgbUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5xM2FfdHVuaW5nX2RlYnVnX3BhcmFtcyA9ICpxM2FfdHVuaW5nX2V4aWZfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgbUV4aWZQYXJhbXMuZGVidWdfcGFyYW1zLT5xM2FfdHVuaW5nX2RlYnVnX3BhcmFtc192YWxpZCA9IFRSVUU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0M0FFeGlmUGFyYW1zCisgKgorICogREVTQ1JJUFRJT046CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKgorICogUkVUVVJOICAgICA6IG1tX2pwZWdfZXhpZl9wYXJhbXNfdAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworbW1fanBlZ19leGlmX3BhcmFtc190IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmdldDNBRXhpZlBhcmFtcygpCit7CisgICAgcmV0dXJuIG1FeGlmUGFyYW1zOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHRyYW5zbGF0ZUNiVXJnZW50TWV0YWRhdGFUb1Jlc3VsdE1ldGFkYXRhCisgKgorICogREVTQ1JJUFRJT046CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtZXRhZGF0YSA6IG1ldGFkYXRhIGluZm9ybWF0aW9uIGZyb20gY2FsbGJhY2sKKyAqCisgKiBSRVRVUk4gICAgIDogY2FtZXJhX21ldGFkYXRhX3QqCisgKiAgICAgICAgICAgICAgbWV0YWRhdGEgaW4gYSBmb3JtYXQgc3BlY2lmaWVkIGJ5IGZ3aworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjYW1lcmFfbWV0YWRhdGFfdCoKK1FDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OnRyYW5zbGF0ZUNiVXJnZW50TWV0YWRhdGFUb1Jlc3VsdE1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXRhZGF0YV9idWZmZXJfdCAqbWV0YWRhdGEpCit7CisgICAgQ2FtZXJhTWV0YWRhdGEgY2FtTWV0YWRhdGE7CisgICAgY2FtZXJhX21ldGFkYXRhX3QgKnJlc3VsdE1ldGFkYXRhOworCisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgd2hpdGVCYWxhbmNlU3RhdGUsIENBTV9JTlRGX01FVEFfQVdCX1NUQVRFLCBtZXRhZGF0YSkgeworICAgICAgICB1aW50OF90IGZ3a193aGl0ZUJhbGFuY2VTdGF0ZSA9ICh1aW50OF90KSAqd2hpdGVCYWxhbmNlU3RhdGU7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQVdCX1NUQVRFLCAmZndrX3doaXRlQmFsYW5jZVN0YXRlLCAxKTsKKyAgICAgICAgTE9HRCgidXJnZW50IE1ldGFkYXRhIDogQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSAldSIsICp3aGl0ZUJhbGFuY2VTdGF0ZSk7CisgICAgfQorCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3RyaWdnZXJfdCwgYWVjVHJpZ2dlciwgQ0FNX0lOVEZfTUVUQV9BRUNfUFJFQ0FQVFVSRV9UUklHR0VSLCBtZXRhZGF0YSkgeworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUiwKKyAgICAgICAgICAgICAgICAmYWVjVHJpZ2dlci0+dHJpZ2dlciwgMSk7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCwKKyAgICAgICAgICAgICAgICAmYWVjVHJpZ2dlci0+dHJpZ2dlcl9pZCwgMSk7CisgICAgICAgIExPR0QoInVyZ2VudCBNZXRhZGF0YSA6IENBTV9JTlRGX01FVEFfQUVDX1BSRUNBUFRVUkVfVFJJR0dFUjogJWQiLAorICAgICAgICAgICAgICAgICBhZWNUcmlnZ2VyLT50cmlnZ2VyKTsKKyAgICAgICAgTE9HRCgidXJnZW50IE1ldGFkYXRhIDogQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfSUQ6ICVkIiwKKyAgICAgICAgICAgICAgICBhZWNUcmlnZ2VyLT50cmlnZ2VyX2lkKTsKKyAgICB9CisKKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgYWVfc3RhdGUsIENBTV9JTlRGX01FVEFfQUVDX1NUQVRFLCBtZXRhZGF0YSkgeworICAgICAgICB1aW50OF90IGZ3a19hZV9zdGF0ZSA9ICh1aW50OF90KSAqYWVfc3RhdGU7CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsICZmd2tfYWVfc3RhdGUsIDEpOworICAgICAgICBMT0dEKCJ1cmdlbnQgTWV0YWRhdGEgOiBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUgJXUiLCAqYWVfc3RhdGUpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCBmb2N1c01vZGUsIENBTV9JTlRGX1BBUk1fRk9DVVNfTU9ERSwgbWV0YWRhdGEpIHsKKyAgICAgICAgaW50IHZhbCA9IGxvb2t1cEZ3a05hbWUoRk9DVVNfTU9ERVNfTUFQLCBNRVRBREFUQV9NQVBfU0laRShGT0NVU19NT0RFU19NQVApLCAqZm9jdXNNb2RlKTsKKyAgICAgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IHZhbCkgeworICAgICAgICAgICAgdWludDhfdCBmd2tBZk1vZGUgPSAodWludDhfdCl2YWw7CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FGX01PREUsICZmd2tBZk1vZGUsIDEpOworICAgICAgICAgICAgTE9HRCgidXJnZW50IE1ldGFkYXRhIDogQU5EUk9JRF9DT05UUk9MX0FGX01PREUgJWQiLCB2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HSCgidXJnZW50IE1ldGFkYXRhIG5vdCBmb3VuZCA6IEFORFJPSURfQ09OVFJPTF9BRl9NT0RFICVkIiwKKyAgICAgICAgICAgICAgICAgICAgdmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV90cmlnZ2VyX3QsIGFmX3RyaWdnZXIsIENBTV9JTlRGX01FVEFfQUZfVFJJR0dFUiwgbWV0YWRhdGEpIHsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSLAorICAgICAgICAgICAgICAgICZhZl90cmlnZ2VyLT50cmlnZ2VyLCAxKTsKKyAgICAgICAgTE9HRCgidXJnZW50IE1ldGFkYXRhIDogQ0FNX0lOVEZfTUVUQV9BRl9UUklHR0VSID0gJWQiLAorICAgICAgICAgICAgICAgICBhZl90cmlnZ2VyLT50cmlnZ2VyKTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lELCAmYWZfdHJpZ2dlci0+dHJpZ2dlcl9pZCwgMSk7CisgICAgICAgIExPR0QoInVyZ2VudCBNZXRhZGF0YSA6IEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lEID0gJWQiLAorICAgICAgICAgICAgICAgIGFmX3RyaWdnZXItPnRyaWdnZXJfaWQpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIHdoaXRlQmFsYW5jZSwgQ0FNX0lOVEZfUEFSTV9XSElURV9CQUxBTkNFLCBtZXRhZGF0YSkgeworICAgICAgICBpbnQgdmFsID0gbG9va3VwRndrTmFtZShXSElURV9CQUxBTkNFX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBNRVRBREFUQV9NQVBfU0laRShXSElURV9CQUxBTkNFX01PREVTX01BUCksICp3aGl0ZUJhbGFuY2UpOworICAgICAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gdmFsKSB7CisgICAgICAgICAgICB1aW50OF90IGZ3a1doaXRlQmFsYW5jZU1vZGUgPSAodWludDhfdCl2YWw7CisgICAgICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLCAmZndrV2hpdGVCYWxhbmNlTW9kZSwgMSk7CisgICAgICAgICAgICBMT0dEKCJ1cmdlbnQgTWV0YWRhdGEgOiBBTkRST0lEX0NPTlRST0xfQVdCX01PREUgJWQiLCB2YWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HSCgidXJnZW50IE1ldGFkYXRhIG5vdCBmb3VuZCA6IEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSIpOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDhfdCBmd2tfYWVNb2RlID0gQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT0ZGOworICAgIHVpbnQzMl90IGFlTW9kZSA9IENBTV9BRV9NT0RFX01BWDsKKyAgICBpbnQzMl90IGZsYXNoTW9kZSA9IENBTV9GTEFTSF9NT0RFX01BWDsKKyAgICBpbnQzMl90IHJlZGV5ZSA9IC0xOworICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQzMl90LCBwQWVNb2RlLCBDQU1fSU5URl9NRVRBX0FFQ19NT0RFLCBtZXRhZGF0YSkgeworICAgICAgICBhZU1vZGUgPSAqcEFlTW9kZTsKKyAgICB9CisgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgcEZsYXNoTW9kZSwgQ0FNX0lOVEZfUEFSTV9MRURfTU9ERSwgbWV0YWRhdGEpIHsKKyAgICAgICAgZmxhc2hNb2RlID0gKnBGbGFzaE1vZGU7CisgICAgfQorICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIHBSZWRleWUsIENBTV9JTlRGX1BBUk1fUkVERVlFX1JFRFVDVElPTiwgbWV0YWRhdGEpIHsKKyAgICAgICAgcmVkZXllID0gKnBSZWRleWU7CisgICAgfQorCisgICAgaWYgKDEgPT0gcmVkZXllKSB7CisgICAgICAgIGZ3a19hZU1vZGUgPSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTl9BVVRPX0ZMQVNIX1JFREVZRTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9NT0RFLCAmZndrX2FlTW9kZSwgMSk7CisgICAgfSBlbHNlIGlmICgoQ0FNX0ZMQVNIX01PREVfQVVUTyA9PSBmbGFzaE1vZGUpIHx8IChDQU1fRkxBU0hfTU9ERV9PTiA9PSBmbGFzaE1vZGUpKSB7CisgICAgICAgIGludCB2YWwgPSBsb29rdXBGd2tOYW1lKEFFX0ZMQVNIX01PREVfTUFQLCBNRVRBREFUQV9NQVBfU0laRShBRV9GTEFTSF9NT0RFX01BUCksCisgICAgICAgICAgICAgICAgZmxhc2hNb2RlKTsKKyAgICAgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IHZhbCkgeworICAgICAgICAgICAgZndrX2FlTW9kZSA9ICh1aW50OF90KXZhbDsKKyAgICAgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfTU9ERSwgJmZ3a19hZU1vZGUsIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiVW5zdXBwb3J0ZWQgZmxhc2ggbW9kZSAlZCIsIGZsYXNoTW9kZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGFlTW9kZSA9PSBDQU1fQUVfTU9ERV9PTikgeworICAgICAgICBmd2tfYWVNb2RlID0gQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT047CisgICAgICAgIGNhbU1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfTU9ERSwgJmZ3a19hZU1vZGUsIDEpOworICAgIH0gZWxzZSBpZiAoYWVNb2RlID09IENBTV9BRV9NT0RFX09GRikgeworICAgICAgICBmd2tfYWVNb2RlID0gQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT0ZGOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX01PREUsICZmd2tfYWVNb2RlLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJOb3QgZW5vdWdoIGluZm8gdG8gZGVkdWNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFIHJlZGV5ZTolZCwgIgorICAgICAgICAgICAgICAiZmxhc2hNb2RlOiVkLCBhZU1vZGU6JXUhISEiLAorICAgICAgICAgICAgICAgICByZWRleWUsIGZsYXNoTW9kZSwgYWVNb2RlKTsKKyAgICB9CisKKyAgICByZXN1bHRNZXRhZGF0YSA9IGNhbU1ldGFkYXRhLnJlbGVhc2UoKTsKKyAgICByZXR1cm4gcmVzdWx0TWV0YWRhdGE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZHVtcE1ldGFkYXRhVG9GaWxlCisgKgorICogREVTQ1JJUFRJT046IER1bXBzIHR1bmluZyBtZXRhZGF0YSB0byBmaWxlIHN5c3RlbQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbWV0YSAgICAgICAgICAgOiB0dW5pbmcgbWV0YWRhdGEKKyAqICAgQGR1bXBGcmFtZUNvdW50IDogY3VycmVudCBkdW1wIGZyYW1lIGNvdW50CisgKiAgIEBlbmFibGVkICAgICAgICA6IEVuYWJsZSBtYXNrCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmR1bXBNZXRhZGF0YVRvRmlsZSh0dW5pbmdfcGFyYW1zX3QgJm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmZHVtcEZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIpCit7CisgICAgLy9Tb21lIHNhbml0eSBjaGVja3MKKyAgICBpZiAobWV0YS50dW5pbmdfc2Vuc29yX2RhdGFfc2l6ZSA+IFRVTklOR19TRU5TT1JfREFUQV9NQVgpIHsKKyAgICAgICAgTE9HRSgiVHVuaW5nIHNlbnNvciBkYXRhIHNpemUgYmlnZ2VyIHRoYW4gZXhwZWN0ZWQgJWQ6ICVkIiwKKyAgICAgICAgICAgICAgbWV0YS50dW5pbmdfc2Vuc29yX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgVFVOSU5HX1NFTlNPUl9EQVRBX01BWCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobWV0YS50dW5pbmdfdmZlX2RhdGFfc2l6ZSA+IFRVTklOR19WRkVfREFUQV9NQVgpIHsKKyAgICAgICAgTE9HRSgiVHVuaW5nIFZGRSBkYXRhIHNpemUgYmlnZ2VyIHRoYW4gZXhwZWN0ZWQgJWQ6ICVkIiwKKyAgICAgICAgICAgICAgbWV0YS50dW5pbmdfdmZlX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgVFVOSU5HX1ZGRV9EQVRBX01BWCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobWV0YS50dW5pbmdfY3BwX2RhdGFfc2l6ZSA+IFRVTklOR19DUFBfREFUQV9NQVgpIHsKKyAgICAgICAgTE9HRSgiVHVuaW5nIENQUCBkYXRhIHNpemUgYmlnZ2VyIHRoYW4gZXhwZWN0ZWQgJWQ6ICVkIiwKKyAgICAgICAgICAgICAgbWV0YS50dW5pbmdfY3BwX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgVFVOSU5HX0NQUF9EQVRBX01BWCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobWV0YS50dW5pbmdfY2FjX2RhdGFfc2l6ZSA+IFRVTklOR19DQUNfREFUQV9NQVgpIHsKKyAgICAgICAgTE9HRSgiVHVuaW5nIENBQyBkYXRhIHNpemUgYmlnZ2VyIHRoYW4gZXhwZWN0ZWQgJWQ6ICVkIiwKKyAgICAgICAgICAgICAgbWV0YS50dW5pbmdfY2FjX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgVFVOSU5HX0NBQ19EQVRBX01BWCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8KKworICAgIGlmKGVuYWJsZWQpeworICAgICAgICBjaGFyIHRpbWVCdWZbRklMRU5BTUVfTUFYXTsKKyAgICAgICAgY2hhciBidWZbRklMRU5BTUVfTUFYXTsKKyAgICAgICAgbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworICAgICAgICBtZW1zZXQodGltZUJ1ZiwgMCwgc2l6ZW9mKHRpbWVCdWYpKTsKKyAgICAgICAgdGltZV90IGN1cnJlbnRfdGltZTsKKyAgICAgICAgc3RydWN0IHRtICogdGltZWluZm87CisgICAgICAgIHRpbWUgKCZjdXJyZW50X3RpbWUpOworICAgICAgICB0aW1laW5mbyA9IGxvY2FsdGltZSAoJmN1cnJlbnRfdGltZSk7CisgICAgICAgIGlmICh0aW1laW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICBzdHJmdGltZSAodGltZUJ1Ziwgc2l6ZW9mKHRpbWVCdWYpLAorICAgICAgICAgICAgICAgICAgICBRQ0FNRVJBX0RVTVBfRlJNX0xPQ0FUSU9OIiVZJW0lZCVIJU0lUyIsIHRpbWVpbmZvKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmc4IGZpbGVQYXRoKHRpbWVCdWYpOworICAgICAgICBzbnByaW50ZihidWYsCisgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZiksCisgICAgICAgICAgICAgICAgIiVkbV8lc18lZC5iaW4iLAorICAgICAgICAgICAgICAgIGR1bXBGcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIpOworICAgICAgICBmaWxlUGF0aC5hcHBlbmQoYnVmKTsKKyAgICAgICAgaW50IGZpbGVfZmQgPSBvcGVuKGZpbGVQYXRoLnN0cmluZygpLCBPX1JEV1IgfCBPX0NSRUFULCAwNzc3KTsKKyAgICAgICAgaWYgKGZpbGVfZmQgPj0gMCkgeworICAgICAgICAgICAgc3NpemVfdCB3cml0dGVuX2xlbiA9IDA7CisgICAgICAgICAgICBtZXRhLnR1bmluZ19kYXRhX3ZlcnNpb24gPSBUVU5JTkdfREFUQV9WRVJTSU9OOworICAgICAgICAgICAgdm9pZCAqZGF0YSA9ICh2b2lkICopKCh1aW50OF90ICopJm1ldGEudHVuaW5nX2RhdGFfdmVyc2lvbik7CisgICAgICAgICAgICB3cml0dGVuX2xlbiArPSB3cml0ZShmaWxlX2ZkLCBkYXRhLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgIGRhdGEgPSAodm9pZCAqKSgodWludDhfdCAqKSZtZXRhLnR1bmluZ19zZW5zb3JfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIExPR0QoInR1bmluZ19zZW5zb3JfZGF0YV9zaXplICVkIiwoaW50KSgqKGludCAqKWRhdGEpKTsKKyAgICAgICAgICAgIHdyaXR0ZW5fbGVuICs9IHdyaXRlKGZpbGVfZmQsIGRhdGEsIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICAgICAgZGF0YSA9ICh2b2lkICopKCh1aW50OF90ICopJm1ldGEudHVuaW5nX3ZmZV9kYXRhX3NpemUpOworICAgICAgICAgICAgTE9HRCgidHVuaW5nX3ZmZV9kYXRhX3NpemUgJWQiLChpbnQpKCooaW50ICopZGF0YSkpOworICAgICAgICAgICAgd3JpdHRlbl9sZW4gKz0gd3JpdGUoZmlsZV9mZCwgZGF0YSwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgICAgICBkYXRhID0gKHZvaWQgKikoKHVpbnQ4X3QgKikmbWV0YS50dW5pbmdfY3BwX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBMT0dEKCJ0dW5pbmdfY3BwX2RhdGFfc2l6ZSAlZCIsKGludCkoKihpbnQgKilkYXRhKSk7CisgICAgICAgICAgICB3cml0dGVuX2xlbiArPSB3cml0ZShmaWxlX2ZkLCBkYXRhLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgIGRhdGEgPSAodm9pZCAqKSgodWludDhfdCAqKSZtZXRhLnR1bmluZ19jYWNfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIExPR0QoInR1bmluZ19jYWNfZGF0YV9zaXplICVkIiwoaW50KSgqKGludCAqKWRhdGEpKTsKKyAgICAgICAgICAgIHdyaXR0ZW5fbGVuICs9IHdyaXRlKGZpbGVfZmQsIGRhdGEsIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICAgICAgbWV0YS50dW5pbmdfbW9kM19kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgZGF0YSA9ICh2b2lkICopKCh1aW50OF90ICopJm1ldGEudHVuaW5nX21vZDNfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIExPR0QoInR1bmluZ19tb2QzX2RhdGFfc2l6ZSAlZCIsKGludCkoKihpbnQgKilkYXRhKSk7CisgICAgICAgICAgICB3cml0dGVuX2xlbiArPSB3cml0ZShmaWxlX2ZkLCBkYXRhLCBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgIHNpemVfdCB0b3RhbF9zaXplID0gbWV0YS50dW5pbmdfc2Vuc29yX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgIGRhdGEgPSAodm9pZCAqKSgodWludDhfdCAqKSZtZXRhLmRhdGEpOworICAgICAgICAgICAgd3JpdHRlbl9sZW4gKz0gd3JpdGUoZmlsZV9mZCwgZGF0YSwgdG90YWxfc2l6ZSk7CisgICAgICAgICAgICB0b3RhbF9zaXplID0gbWV0YS50dW5pbmdfdmZlX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgIGRhdGEgPSAodm9pZCAqKSgodWludDhfdCAqKSZtZXRhLmRhdGFbVFVOSU5HX1ZGRV9EQVRBX09GRlNFVF0pOworICAgICAgICAgICAgd3JpdHRlbl9sZW4gKz0gd3JpdGUoZmlsZV9mZCwgZGF0YSwgdG90YWxfc2l6ZSk7CisgICAgICAgICAgICB0b3RhbF9zaXplID0gbWV0YS50dW5pbmdfY3BwX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgIGRhdGEgPSAodm9pZCAqKSgodWludDhfdCAqKSZtZXRhLmRhdGFbVFVOSU5HX0NQUF9EQVRBX09GRlNFVF0pOworICAgICAgICAgICAgd3JpdHRlbl9sZW4gKz0gd3JpdGUoZmlsZV9mZCwgZGF0YSwgdG90YWxfc2l6ZSk7CisgICAgICAgICAgICB0b3RhbF9zaXplID0gbWV0YS50dW5pbmdfY2FjX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgIGRhdGEgPSAodm9pZCAqKSgodWludDhfdCAqKSZtZXRhLmRhdGFbVFVOSU5HX0NBQ19EQVRBX09GRlNFVF0pOworICAgICAgICAgICAgd3JpdHRlbl9sZW4gKz0gd3JpdGUoZmlsZV9mZCwgZGF0YSwgdG90YWxfc2l6ZSk7CisgICAgICAgICAgICBjbG9zZShmaWxlX2ZkKTsKKyAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgTE9HRSgiZmFpbCB0byBvcGVuIGZpbGUgZm9yIG1ldGFkYXRhIGR1bXBpbmciKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjbGVhbkFuZFNvcnRTdHJlYW1JbmZvCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBtZXRob2QgdG8gY2xlYW4gdXAgaW52YWxpZCBzdHJlYW1zIGluIHN0cmVhbV9pbmZvLAorICogICAgICAgICAgICAgIGFuZCBzb3J0IHRoZW0gc3VjaCB0aGF0IHJhdyBzdHJlYW0gaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAorICogICAgICAgICAgICAgIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBjYW1lcmEgZGFlbW9uIGNvbnN0cmFpbnQuCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Y2xlYW5BbmRTb3J0U3RyZWFtSW5mbygpCit7CisgICAgTGlzdDxzdHJlYW1faW5mb190ICo+IG5ld1N0cmVhbUluZm87CisKKyAgICAvKmNsZWFuIHVwIGludmFsaWQgc3RyZWFtcyovCisgICAgZm9yIChMaXN0PHN0cmVhbV9pbmZvX3QqPjo6aXRlcmF0b3IgaXQ9bVN0cmVhbUluZm8uYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IG1TdHJlYW1JbmZvLmVuZCgpOykgeworICAgICAgICBpZigoKCppdCktPnN0YXR1cykgPT0gSU5WQUxJRCl7CisgICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKmNoYW5uZWwgPSAoUUNhbWVyYTNDaGFubmVsKikoKml0KS0+c3RyZWFtLT5wcml2OworICAgICAgICAgICAgZGVsZXRlIGNoYW5uZWw7CisgICAgICAgICAgICBmcmVlKCppdCk7CisgICAgICAgICAgICBpdCA9IG1TdHJlYW1JbmZvLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNb3ZlIHByZXZpZXcvdmlkZW8vY2FsbGJhY2svc25hcHNob3Qgc3RyZWFtcyBpbnRvIG5ld0xpc3QKKyAgICBmb3IgKExpc3Q8c3RyZWFtX2luZm9fdCAqPjo6aXRlcmF0b3IgaXQgPSBtU3RyZWFtSW5mby5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gbVN0cmVhbUluZm8uZW5kKCk7KSB7CisgICAgICAgIGlmICgoKml0KS0+c3RyZWFtLT5mb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9SQVdfT1BBUVVFICYmCisgICAgICAgICAgICAgICAgKCppdCktPnN0cmVhbS0+Zm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfUkFXMTAgJiYKKyAgICAgICAgICAgICAgICAoKml0KS0+c3RyZWFtLT5mb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9SQVcxNikgeworICAgICAgICAgICAgbmV3U3RyZWFtSW5mby5wdXNoX2JhY2soKml0KTsKKyAgICAgICAgICAgIGl0ID0gbVN0cmVhbUluZm8uZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGl0Kys7CisgICAgfQorICAgIC8vIE1vdmUgcmF3IHN0cmVhbXMgaW50byBuZXdMaXN0CisgICAgZm9yIChMaXN0PHN0cmVhbV9pbmZvX3QgKj46Oml0ZXJhdG9yIGl0ID0gbVN0cmVhbUluZm8uYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IG1TdHJlYW1JbmZvLmVuZCgpOykgeworICAgICAgICBuZXdTdHJlYW1JbmZvLnB1c2hfYmFjaygqaXQpOworICAgICAgICBpdCA9IG1TdHJlYW1JbmZvLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICBtU3RyZWFtSW5mbyA9IG5ld1N0cmVhbUluZm87Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZXh0cmFjdEpwZWdNZXRhZGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBoZWxwZXIgbWV0aG9kIHRvIGV4dHJhY3QgSnBlZyBtZXRhZGF0YSBmcm9tIGNhcHR1cmUgcmVxdWVzdC4KKyAqICAgICAgICAgICAgICBKUEVHIG1ldGFkYXRhIGlzIGNhY2hlZCBpbiBIQUwsIGFuZCByZXR1cm4gYXMgcGFydCBvZiBjYXB0dXJlCisgKiAgICAgICAgICAgICAgcmVzdWx0IHdoZW4gbWV0YWRhdGEgaXMgcmV0dXJuZWQgZnJvbSBjYW1lcmEgZGFlbW9uLgorICoKKyAqIFBBUkFNRVRFUlMgOiBAanBlZ01ldGFkYXRhOiBqcGVnIG1ldGFkYXRhIHRvIGJlIGV4dHJhY3RlZAorICogICAgICAgICAgICAgIEByZXF1ZXN0OiAgICAgIGNhcHR1cmUgcmVxdWVzdAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpleHRyYWN0SnBlZ01ldGFkYXRhKAorICAgICAgICBDYW1lcmFNZXRhZGF0YSYganBlZ01ldGFkYXRhLAorICAgICAgICBjb25zdCBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICpyZXF1ZXN0KQoreworICAgIENhbWVyYU1ldGFkYXRhIGZyYW1lX3NldHRpbmdzOworICAgIGZyYW1lX3NldHRpbmdzID0gcmVxdWVzdC0+c2V0dGluZ3M7CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfSlBFR19HUFNfQ09PUkRJTkFURVMpKQorICAgICAgICBqcGVnTWV0YWRhdGEudXBkYXRlKEFORFJPSURfSlBFR19HUFNfQ09PUkRJTkFURVMsCisgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfR1BTX0NPT1JESU5BVEVTKS5kYXRhLmQsCisgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfR1BTX0NPT1JESU5BVEVTKS5jb3VudCk7CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfSlBFR19HUFNfUFJPQ0VTU0lOR19NRVRIT0QpKQorICAgICAgICBqcGVnTWV0YWRhdGEudXBkYXRlKEFORFJPSURfSlBFR19HUFNfUFJPQ0VTU0lOR19NRVRIT0QsCisgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfR1BTX1BST0NFU1NJTkdfTUVUSE9EKS5kYXRhLnU4LAorICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9KUEVHX0dQU19QUk9DRVNTSU5HX01FVEhPRCkuY291bnQpOworCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0pQRUdfR1BTX1RJTUVTVEFNUCkpCisgICAgICAgIGpwZWdNZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9KUEVHX0dQU19USU1FU1RBTVAsCisgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfR1BTX1RJTUVTVEFNUCkuZGF0YS5pNjQsCisgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfR1BTX1RJTUVTVEFNUCkuY291bnQpOworCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04pKQorICAgICAgICBqcGVnTWV0YWRhdGEudXBkYXRlKEFORFJPSURfSlBFR19PUklFTlRBVElPTiwKKyAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfSlBFR19PUklFTlRBVElPTikuZGF0YS5pMzIsCisgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04pLmNvdW50KTsKKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9KUEVHX1FVQUxJVFkpKQorICAgICAgICBqcGVnTWV0YWRhdGEudXBkYXRlKEFORFJPSURfSlBFR19RVUFMSVRZLAorICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9KUEVHX1FVQUxJVFkpLmRhdGEudTgsCisgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfUVVBTElUWSkuY291bnQpOworCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0pQRUdfVEhVTUJOQUlMX1FVQUxJVFkpKQorICAgICAgICBqcGVnTWV0YWRhdGEudXBkYXRlKEFORFJPSURfSlBFR19USFVNQk5BSUxfUVVBTElUWSwKKyAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfSlBFR19USFVNQk5BSUxfUVVBTElUWSkuZGF0YS51OCwKKyAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfSlBFR19USFVNQk5BSUxfUVVBTElUWSkuY291bnQpOworCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0pQRUdfVEhVTUJOQUlMX1NJWkUpKSB7CisgICAgICAgIGludDMyX3QgdGh1bWJuYWlsX3NpemVbMl07CisgICAgICAgIHRodW1ibmFpbF9zaXplWzBdID0gZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfVEhVTUJOQUlMX1NJWkUpLmRhdGEuaTMyWzBdOworICAgICAgICB0aHVtYm5haWxfc2l6ZVsxXSA9IGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9KUEVHX1RIVU1CTkFJTF9TSVpFKS5kYXRhLmkzMlsxXTsKKyAgICAgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04pKSB7CisgICAgICAgICAgICBpbnQzMl90IG9yaWVudGF0aW9uID0KKyAgICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9KUEVHX09SSUVOVEFUSU9OKS5kYXRhLmkzMlswXTsKKyAgICAgICAgICAgIGlmICgoIW5lZWRKcGVnRXhpZlJvdGF0aW9uKCkpICYmICgob3JpZW50YXRpb24gPT0gOTApIHx8IChvcmllbnRhdGlvbiA9PSAyNzApKSkgeworICAgICAgICAgICAgICAgLy9zd2FwIHRodW1ibmFpbCBkaW1lbnNpb25zIGZvciByb3RhdGlvbnMgOTAgYW5kIDI3MCBpbiBqcGVnIG1ldGFkYXRhLgorICAgICAgICAgICAgICAgaW50MzJfdCB0ZW1wOworICAgICAgICAgICAgICAgdGVtcCA9IHRodW1ibmFpbF9zaXplWzBdOworICAgICAgICAgICAgICAgdGh1bWJuYWlsX3NpemVbMF0gPSB0aHVtYm5haWxfc2l6ZVsxXTsKKyAgICAgICAgICAgICAgIHRodW1ibmFpbF9zaXplWzFdID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgICAgIGpwZWdNZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9KUEVHX1RIVU1CTkFJTF9TSVpFLAorICAgICAgICAgICAgICAgIHRodW1ibmFpbF9zaXplLAorICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9KUEVHX1RIVU1CTkFJTF9TSVpFKS5jb3VudCk7CisgICAgfQorCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY29udmVydFRvUmVnaW9ucworICoKKyAqIERFU0NSSVBUSU9OOiBoZWxwZXIgbWV0aG9kIHRvIGNvbnZlcnQgZnJvbSBjYW1fcmVjdF90IGludG8gaW50MzJfdCBhcnJheQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVjdCAgIDogY2FtX3JlY3RfdCBzdHJ1Y3QgdG8gY29udmVydAorICogICBAcmVnaW9uIDogaW50MzJfdCBkZXN0aW5hdGlvbiBhcnJheQorICogICBAd2VpZ2h0IDogaWYgd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSBjYW1fYXJlYV90LCB3ZWlnaHQgaXMgdmFsaWQKKyAqICAgICAgICAgICAgIGVsc2Ugd2VpZ2h0ID0gLTEKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Y29udmVydFRvUmVnaW9ucyhjYW1fcmVjdF90IHJlY3QsCisgICAgICAgIGludDMyX3QgKnJlZ2lvbiwgaW50IHdlaWdodCkKK3sKKyAgICByZWdpb25bMF0gPSByZWN0LmxlZnQ7CisgICAgcmVnaW9uWzFdID0gcmVjdC50b3A7CisgICAgcmVnaW9uWzJdID0gcmVjdC5sZWZ0ICsgcmVjdC53aWR0aDsKKyAgICByZWdpb25bM10gPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0OworICAgIGlmICh3ZWlnaHQgPiAtMSkgeworICAgICAgICByZWdpb25bNF0gPSB3ZWlnaHQ7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbnZlcnRGcm9tUmVnaW9ucworICoKKyAqIERFU0NSSVBUSU9OOiBoZWxwZXIgbWV0aG9kIHRvIGNvbnZlcnQgZnJvbSBhcnJheSB0byBjYW1fcmVjdF90CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEByZWN0ICAgOiBjYW1fcmVjdF90IHN0cnVjdCB0byBjb252ZXJ0CisgKiAgIEByZWdpb24gOiBpbnQzMl90IGRlc3RpbmF0aW9uIGFycmF5CisgKiAgIEB3ZWlnaHQgOiBpZiB3ZSBhcmUgY29udmVydGluZyBmcm9tIGNhbV9hcmVhX3QsIHdlaWdodCBpcyB2YWxpZAorICogICAgICAgICAgICAgZWxzZSB3ZWlnaHQgPSAtMQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpjb252ZXJ0RnJvbVJlZ2lvbnMoY2FtX2FyZWFfdCAmcm9pLAorICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2V0dGluZ3MsIHVpbnQzMl90IHRhZykKK3sKKyAgICBDYW1lcmFNZXRhZGF0YSBmcmFtZV9zZXR0aW5nczsKKyAgICBmcmFtZV9zZXR0aW5ncyA9IHNldHRpbmdzOworICAgIGludDMyX3QgeF9taW4gPSBmcmFtZV9zZXR0aW5ncy5maW5kKHRhZykuZGF0YS5pMzJbMF07CisgICAgaW50MzJfdCB5X21pbiA9IGZyYW1lX3NldHRpbmdzLmZpbmQodGFnKS5kYXRhLmkzMlsxXTsKKyAgICBpbnQzMl90IHhfbWF4ID0gZnJhbWVfc2V0dGluZ3MuZmluZCh0YWcpLmRhdGEuaTMyWzJdOworICAgIGludDMyX3QgeV9tYXggPSBmcmFtZV9zZXR0aW5ncy5maW5kKHRhZykuZGF0YS5pMzJbM107CisgICAgcm9pLndlaWdodCA9IGZyYW1lX3NldHRpbmdzLmZpbmQodGFnKS5kYXRhLmkzMls0XTsKKyAgICByb2kucmVjdC5sZWZ0ID0geF9taW47CisgICAgcm9pLnJlY3QudG9wID0geV9taW47CisgICAgcm9pLnJlY3Qud2lkdGggPSB4X21heCAtIHhfbWluOworICAgIHJvaS5yZWN0LmhlaWdodCA9IHlfbWF4IC0geV9taW47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVzZXRJZk5lZWRlZFJPSQorICoKKyAqIERFU0NSSVBUSU9OOiBoZWxwZXIgbWV0aG9kIHRvIHJlc2V0IHRoZSByb2kgaWYgaXQgaXMgZ3JlYXRlciB0aGFuIHNjYWxlcgorICogICAgICAgICAgICAgIGNyb3AgcmVnaW9uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEByb2kgICAgICAgOiBjYW1fYXJlYV90IHN0cnVjdCB0byByZXNpemUKKyAqICAgQHNjYWxlckNyb3BSZWdpb24gOiBjYW1fY3JvcF9yZWdpb25fdCByZWdpb24gdG8gY29tcGFyZSBhZ2FpbnN0CisgKgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpyZXNldElmTmVlZGVkUk9JKGNhbV9hcmVhX3QqIHJvaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1fY3JvcF9yZWdpb25fdCogc2NhbGVyQ3JvcFJlZ2lvbikKK3sKKyAgICBpbnQzMl90IHJvaV94X21heCA9IHJvaS0+cmVjdC53aWR0aCArIHJvaS0+cmVjdC5sZWZ0OworICAgIGludDMyX3Qgcm9pX3lfbWF4ID0gcm9pLT5yZWN0LmhlaWdodCArIHJvaS0+cmVjdC50b3A7CisgICAgaW50MzJfdCBjcm9wX3hfbWF4ID0gc2NhbGVyQ3JvcFJlZ2lvbi0+d2lkdGggKyBzY2FsZXJDcm9wUmVnaW9uLT5sZWZ0OworICAgIGludDMyX3QgY3JvcF95X21heCA9IHNjYWxlckNyb3BSZWdpb24tPmhlaWdodCArIHNjYWxlckNyb3BSZWdpb24tPnRvcDsKKworICAgIC8qIEFjY29yZGluZyB0byBzcGVjIHdlaWdodCA9IDAgaXMgdXNlZCB0byBpbmRpY2F0ZSByb2kgbmVlZHMgdG8gYmUgZGlzYWJsZWQKKyAgICAgKiB3aXRob3V0IGhhdmluZyB0aGlzIGNoZWNrIHRoZSBjYWxjdWxhdGlvbnMgYmVsb3cgdG8gdmFsaWRhdGUgaWYgdGhlIHJvaQorICAgICAqIGlzIGluc2lkZSBzY2FsYXIgY3JvcCByZWdpb24gd2lsbCBmYWlsIHJlc3VsdGluZyBpbiB0aGUgcm9pIG5vdCBiZWluZworICAgICAqIHJlc2V0IGNhdXNpbmcgYWxnb3JpdGhtIHRvIGNvbnRpbnVlIHRvIHVzZSBzdGFsZSByb2kgd2luZG93CisgICAgICovCisgICAgaWYgKHJvaS0+d2VpZ2h0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKChyb2lfeF9tYXggPCBzY2FsZXJDcm9wUmVnaW9uLT5sZWZ0KSB8fAorICAgICAgICAvLyByaWdodCBlZGdlIG9mIHJvaSB3aW5kb3cgaXMgbGVmdCBvZiBzY2FsYXIgY3JvcCdzIGxlZnQgZWRnZQorICAgICAgICAocm9pX3lfbWF4IDwgc2NhbGVyQ3JvcFJlZ2lvbi0+dG9wKSAgfHwKKyAgICAgICAgLy8gYm90dG9tIGVkZ2Ugb2Ygcm9pIHdpbmRvdyBpcyBhYm92ZSBzY2FsYXIgY3JvcCdzIHRvcCBlZGdlCisgICAgICAgIChyb2ktPnJlY3QubGVmdCA+IGNyb3BfeF9tYXgpIHx8CisgICAgICAgIC8vIGxlZnQgZWRnZSBvZiByb2kgd2luZG93IGlzIGJleW9uZChyaWdodCkgb2Ygc2NhbGFyIGNyb3AncyByaWdodCBlZGdlCisgICAgICAgIChyb2ktPnJlY3QudG9wID4gY3JvcF95X21heCkpeworICAgICAgICAvLyB0b3AgZWRnZSBvZiByb2kgd2luZG8gaXMgYWJvdmUgc2NhbGFyIGNyb3AncyB0b3AgZWRnZQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChyb2ktPnJlY3QubGVmdCA8IHNjYWxlckNyb3BSZWdpb24tPmxlZnQpIHsKKyAgICAgICAgcm9pLT5yZWN0LmxlZnQgPSBzY2FsZXJDcm9wUmVnaW9uLT5sZWZ0OworICAgIH0KKyAgICBpZiAocm9pLT5yZWN0LnRvcCA8IHNjYWxlckNyb3BSZWdpb24tPnRvcCkgeworICAgICAgICByb2ktPnJlY3QudG9wID0gc2NhbGVyQ3JvcFJlZ2lvbi0+dG9wOworICAgIH0KKyAgICBpZiAocm9pX3hfbWF4ID4gY3JvcF94X21heCkgeworICAgICAgICByb2lfeF9tYXggPSBjcm9wX3hfbWF4OworICAgIH0KKyAgICBpZiAocm9pX3lfbWF4ID4gY3JvcF95X21heCkgeworICAgICAgICByb2lfeV9tYXggPSBjcm9wX3lfbWF4OworICAgIH0KKyAgICByb2ktPnJlY3Qud2lkdGggPSByb2lfeF9tYXggLSByb2ktPnJlY3QubGVmdDsKKyAgICByb2ktPnJlY3QuaGVpZ2h0ID0gcm9pX3lfbWF4IC0gcm9pLT5yZWN0LnRvcDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjb252ZXJ0TGFuZG1hcmtzCisgKgorICogREVTQ1JJUFRJT046IGhlbHBlciBtZXRob2QgdG8gZXh0cmFjdCB0aGUgbGFuZG1hcmtzIGZyb20gZmFjZSBkZXRlY3Rpb24gaW5mbworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbGFuZG1hcmtfZGF0YSA6IGlucHV0IGxhbmRtYXJrIGRhdGEgdG8gYmUgY29udmVydGVkCisgKiAgIEBsYW5kbWFya3MgOiBpbnQzMl90IGRlc3RpbmF0aW9uIGFycmF5CisgKgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpjb252ZXJ0TGFuZG1hcmtzKAorICAgICAgICBjYW1fZmFjZV9sYW5kbWFya3NfaW5mb190IGxhbmRtYXJrX2RhdGEsCisgICAgICAgIGludDMyX3QgKmxhbmRtYXJrcykKK3sKKyAgICBpZiAobGFuZG1hcmtfZGF0YS5pc19sZWZ0X2V5ZV92YWxpZCkgeworICAgICAgICBsYW5kbWFya3NbTEVGVF9FWUVfWF0gPSAoaW50MzJfdClsYW5kbWFya19kYXRhLmxlZnRfZXllX2NlbnRlci54OworICAgICAgICBsYW5kbWFya3NbTEVGVF9FWUVfWV0gPSAoaW50MzJfdClsYW5kbWFya19kYXRhLmxlZnRfZXllX2NlbnRlci55OworICAgIH0gZWxzZSB7CisgICAgICAgIGxhbmRtYXJrc1tMRUZUX0VZRV9YXSA9IEZBQ0VfSU5WQUxJRF9QT0lOVDsKKyAgICAgICAgbGFuZG1hcmtzW0xFRlRfRVlFX1ldID0gRkFDRV9JTlZBTElEX1BPSU5UOworICAgIH0KKworICAgIGlmIChsYW5kbWFya19kYXRhLmlzX3JpZ2h0X2V5ZV92YWxpZCkgeworICAgICAgICBsYW5kbWFya3NbUklHSFRfRVlFX1hdID0gKGludDMyX3QpbGFuZG1hcmtfZGF0YS5yaWdodF9leWVfY2VudGVyLng7CisgICAgICAgIGxhbmRtYXJrc1tSSUdIVF9FWUVfWV0gPSAoaW50MzJfdClsYW5kbWFya19kYXRhLnJpZ2h0X2V5ZV9jZW50ZXIueTsKKyAgICB9IGVsc2UgeworICAgICAgICBsYW5kbWFya3NbUklHSFRfRVlFX1hdID0gRkFDRV9JTlZBTElEX1BPSU5UOworICAgICAgICBsYW5kbWFya3NbUklHSFRfRVlFX1ldID0gRkFDRV9JTlZBTElEX1BPSU5UOworICAgIH0KKworICAgIGlmIChsYW5kbWFya19kYXRhLmlzX21vdXRoX3ZhbGlkKSB7CisgICAgICAgIGxhbmRtYXJrc1tNT1VUSF9YXSA9IChpbnQzMl90KWxhbmRtYXJrX2RhdGEubW91dGhfY2VudGVyLng7CisgICAgICAgIGxhbmRtYXJrc1tNT1VUSF9ZXSA9IChpbnQzMl90KWxhbmRtYXJrX2RhdGEubW91dGhfY2VudGVyLnk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGFuZG1hcmtzW01PVVRIX1hdID0gRkFDRV9JTlZBTElEX1BPSU5UOworICAgICAgICBsYW5kbWFya3NbTU9VVEhfWV0gPSBGQUNFX0lOVkFMSURfUE9JTlQ7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldEludmFsaWRMYW5kbWFya3MKKyAqCisgKiBERVNDUklQVElPTjogaGVscGVyIG1ldGhvZCB0byBzZXQgaW52YWxpZCBsYW5kbWFya3MKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGxhbmRtYXJrcyA6IGludDMyX3QgZGVzdGluYXRpb24gYXJyYXkKKyAqCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OnNldEludmFsaWRMYW5kbWFya3MoCisgICAgICAgIGludDMyX3QgKmxhbmRtYXJrcykKK3sKKyAgICBsYW5kbWFya3NbTEVGVF9FWUVfWF0gPSBGQUNFX0lOVkFMSURfUE9JTlQ7CisgICAgbGFuZG1hcmtzW0xFRlRfRVlFX1ldID0gRkFDRV9JTlZBTElEX1BPSU5UOworICAgIGxhbmRtYXJrc1tSSUdIVF9FWUVfWF0gPSBGQUNFX0lOVkFMSURfUE9JTlQ7CisgICAgbGFuZG1hcmtzW1JJR0hUX0VZRV9ZXSA9IEZBQ0VfSU5WQUxJRF9QT0lOVDsKKyAgICBsYW5kbWFya3NbTU9VVEhfWF0gPSBGQUNFX0lOVkFMSURfUE9JTlQ7CisgICAgbGFuZG1hcmtzW01PVVRIX1ldID0gRkFDRV9JTlZBTElEX1BPSU5UOworfQorCisjZGVmaW5lIERBVEFfUFRSKE1FTV9PQkosSU5ERVgpIE1FTV9PQkotPmdldFB0ciggSU5ERVggKQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpbml0Q2FwYWJpbGl0aWVzCisgKgorICogREVTQ1JJUFRJT046IGluaXRpYWxpemUgY2FtZXJhIGNhcGFiaWxpdGllcyBpbiBzdGF0aWMgZGF0YSBzdHJ1Y3QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYUlkICA6IGNhbWVyYSBJZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjppbml0Q2FwYWJpbGl0aWVzKHVpbnQzMl90IGNhbWVyYUlkKQoreworICAgIGludCByYyA9IDA7CisgICAgbW1fY2FtZXJhX3Z0YmxfdCAqY2FtZXJhSGFuZGxlID0gTlVMTDsKKyAgICBRQ2FtZXJhM0hlYXBNZW1vcnkgKmNhcGFiaWxpdHlIZWFwID0gTlVMTDsKKworICAgIHJjID0gY2FtZXJhX29wZW4oKHVpbnQ4X3QpY2FtZXJhSWQsICZjYW1lcmFIYW5kbGUpOworICAgIGlmIChyYykgeworICAgICAgICBMT0dFKCJjYW1lcmFfb3BlbiBmYWlsZWQuIHJjID0gJWQiLCByYyk7CisgICAgICAgIGdvdG8gb3Blbl9mYWlsZWQ7CisgICAgfQorICAgIGlmICghY2FtZXJhSGFuZGxlKSB7CisgICAgICAgIExPR0UoImNhbWVyYV9vcGVuIGZhaWxlZC4gY2FtZXJhSGFuZGxlID0gJXAiLCBjYW1lcmFIYW5kbGUpOworICAgICAgICBnb3RvIG9wZW5fZmFpbGVkOworICAgIH0KKworICAgIGNhcGFiaWxpdHlIZWFwID0gbmV3IFFDYW1lcmEzSGVhcE1lbW9yeSgxKTsKKyAgICBpZiAoY2FwYWJpbGl0eUhlYXAgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJjcmVhdGlvbiBvZiBjYXBhYmlsaXR5SGVhcCBmYWlsZWQiKTsKKyAgICAgICAgZ290byBoZWFwX2NyZWF0aW9uX2ZhaWxlZDsKKyAgICB9CisgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBjYXBhYmlsaXR5IGJ1ZmZlciAqLworICAgIHJjID0gY2FwYWJpbGl0eUhlYXAtPmFsbG9jYXRlKHNpemVvZihjYW1fY2FwYWJpbGl0eV90KSk7CisgICAgaWYocmMgIT0gT0spIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBjYXBwYWJpbGl0eSIpOworICAgICAgICBnb3RvIGFsbG9jYXRlX2ZhaWxlZDsKKyAgICB9CisKKyAgICAvKiBNYXAgbWVtb3J5IGZvciBjYXBhYmlsaXR5IGJ1ZmZlciAqLworICAgIG1lbXNldChEQVRBX1BUUihjYXBhYmlsaXR5SGVhcCwwKSwgMCwgc2l6ZW9mKGNhbV9jYXBhYmlsaXR5X3QpKTsKKyAgICByYyA9IGNhbWVyYUhhbmRsZS0+b3BzLT5tYXBfYnVmKGNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfQ0FQQUJJTElUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWJpbGl0eUhlYXAtPmdldEZkKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FtX2NhcGFiaWxpdHlfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHlIZWFwLT5nZXRQdHIoMCkpOworICAgIGlmKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gbWFwIGNhcGFiaWxpdHkgYnVmZmVyIik7CisgICAgICAgIGdvdG8gbWFwX2ZhaWxlZDsKKyAgICB9CisKKyAgICAvKiBRdWVyeSBDYXBhYmlsaXR5ICovCisgICAgcmMgPSBjYW1lcmFIYW5kbGUtPm9wcy0+cXVlcnlfY2FwYWJpbGl0eShjYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUpOworICAgIGlmKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJmYWlsZWQgdG8gcXVlcnkgY2FwYWJpbGl0eSIpOworICAgICAgICBnb3RvIHF1ZXJ5X2ZhaWxlZDsKKyAgICB9CisgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdID0gKGNhbV9jYXBhYmlsaXR5X3QgKiltYWxsb2Moc2l6ZW9mKGNhbV9jYXBhYmlsaXR5X3QpKTsKKyAgICBpZiAoIWdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXSkgeworICAgICAgICBMT0dFKCJvdXQgb2YgbWVtb3J5Iik7CisgICAgICAgIGdvdG8gcXVlcnlfZmFpbGVkOworICAgIH0KKyAgICBtZW1jcHkoZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLCBEQVRBX1BUUihjYXBhYmlsaXR5SGVhcCwwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FtX2NhcGFiaWxpdHlfdCkpOworCisgICAgaW50IGluZGV4OworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IENBTV9BTkFMWVNJU19JTkZPX01BWDsgaW5kZXgrKykgeworICAgICAgICBjYW1fYW5hbHlzaXNfaW5mb190ICpwX2FuYWx5c2lzX2luZm8gPQorICAgICAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmFuYWx5c2lzX2luZm9baW5kZXhdOworICAgICAgICBwX2FuYWx5c2lzX2luZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5vZmZzZXRfaW5mby5vZmZzZXRfeCA9IDA7CisgICAgICAgIHBfYW5hbHlzaXNfaW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLm9mZnNldF9pbmZvLm9mZnNldF95ID0gMDsKKyAgICB9CisgICAgcmMgPSAwOworCitxdWVyeV9mYWlsZWQ6CisgICAgY2FtZXJhSGFuZGxlLT5vcHMtPnVubWFwX2J1ZihjYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfQ0FQQUJJTElUWSk7CittYXBfZmFpbGVkOgorICAgIGNhcGFiaWxpdHlIZWFwLT5kZWFsbG9jYXRlKCk7CithbGxvY2F0ZV9mYWlsZWQ6CisgICAgZGVsZXRlIGNhcGFiaWxpdHlIZWFwOworaGVhcF9jcmVhdGlvbl9mYWlsZWQ6CisgICAgY2FtZXJhSGFuZGxlLT5vcHMtPmNsb3NlX2NhbWVyYShjYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUpOworICAgIGNhbWVyYUhhbmRsZSA9IE5VTEw7CitvcGVuX2ZhaWxlZDoKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXQzQXZlcnNpb24KKyAqCisgKiBERVNDUklQVElPTjogZ2V0IHRoZSBRM0EgUy9XIHZlcnNpb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICBAc3dfdmVyc2lvbjogUmVmZXJlbmNlIG9mIFEzQSBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBob2xkIHZlcnNpb24gaW5mbyB1cG9uCisgKiAgICAgICAgICAgICAgIHJldHVybgorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmdldDNBVmVyc2lvbihjYW1fcTNhX3ZlcnNpb25fdCAmc3dfdmVyc2lvbikKK3sKKyAgICBpZihnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdKQorICAgICAgICBzd192ZXJzaW9uID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cTNhX3ZlcnNpb247CisgICAgZWxzZQorICAgICAgICBMT0dFKCJDYXBhYmlsaXR5IHN0cnVjdHVyZSBOVUxMISIpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW5pdFBhcmFtZXRlcnMKKyAqCisgKiBERVNDUklQVElPTjogaW5pdGlhbGl6ZSBjYW1lcmEgcGFyYW1ldGVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjppbml0UGFyYW1ldGVycygpCit7CisgICAgaW50IHJjID0gMDsKKworICAgIC8vQWxsb2NhdGUgU2V0IFBhcmFtIEJ1ZmZlcgorICAgIG1QYXJhbUhlYXAgPSBuZXcgUUNhbWVyYTNIZWFwTWVtb3J5KDEpOworICAgIHJjID0gbVBhcmFtSGVhcC0+YWxsb2NhdGUoc2l6ZW9mKG1ldGFkYXRhX2J1ZmZlcl90KSk7CisgICAgaWYocmMgIT0gT0spIHsKKyAgICAgICAgcmMgPSBOT19NRU1PUlk7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBTRVRQQVJNIEhlYXAgbWVtb3J5Iik7CisgICAgICAgIGRlbGV0ZSBtUGFyYW1IZWFwOworICAgICAgICBtUGFyYW1IZWFwID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8vTWFwIG1lbW9yeSBmb3IgcGFyYW1ldGVycyBidWZmZXIKKyAgICByYyA9IG1DYW1lcmFIYW5kbGUtPm9wcy0+bWFwX2J1ZihtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfUEFSTV9CVUYsCisgICAgICAgICAgICBtUGFyYW1IZWFwLT5nZXRGZCgwKSwKKyAgICAgICAgICAgIHNpemVvZihtZXRhZGF0YV9idWZmZXJfdCksCisgICAgICAgICAgICAobWV0YWRhdGFfYnVmZmVyX3QgKikgREFUQV9QVFIobVBhcmFtSGVhcCwwKSk7CisgICAgaWYocmMgPCAwKSB7CisgICAgICAgIExPR0UoImZhaWxlZCB0byBtYXAgU0VUUEFSTSBidWZmZXIiKTsKKyAgICAgICAgcmMgPSBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIG1QYXJhbUhlYXAtPmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVsZXRlIG1QYXJhbUhlYXA7CisgICAgICAgIG1QYXJhbUhlYXAgPSBOVUxMOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgbVBhcmFtZXRlcnMgPSAobWV0YWRhdGFfYnVmZmVyX3QgKikgREFUQV9QVFIobVBhcmFtSGVhcCwwKTsKKworICAgIG1QcmV2UGFyYW1ldGVycyA9IChtZXRhZGF0YV9idWZmZXJfdCAqKW1hbGxvYyhzaXplb2YobWV0YWRhdGFfYnVmZmVyX3QpKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGVpbml0UGFyYW1ldGVycworICoKKyAqIERFU0NSSVBUSU9OOiBkZS1pbml0aWFsaXplIGNhbWVyYSBwYXJhbWV0ZXJzCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IE5PTkUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpkZWluaXRQYXJhbWV0ZXJzKCkKK3sKKyAgICBtQ2FtZXJhSGFuZGxlLT5vcHMtPnVubWFwX2J1ZihtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfUEFSTV9CVUYpOworCisgICAgbVBhcmFtSGVhcC0+ZGVhbGxvY2F0ZSgpOworICAgIGRlbGV0ZSBtUGFyYW1IZWFwOworICAgIG1QYXJhbUhlYXAgPSBOVUxMOworCisgICAgbVBhcmFtZXRlcnMgPSBOVUxMOworCisgICAgZnJlZShtUHJldlBhcmFtZXRlcnMpOworICAgIG1QcmV2UGFyYW1ldGVycyA9IE5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2FsY01heEpwZWdTaXplCisgKgorICogREVTQ1JJUFRJT046IENhbGN1bGF0ZXMgbWF4aW11bSBqcGVnIHNpemUgc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmFJZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOiBtYXhfanBlZ19zaXplCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3NpemVfdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpjYWxjTWF4SnBlZ1NpemUodWludDMyX3QgY2FtZXJhX2lkKQoreworICAgIHNpemVfdCBtYXhfanBlZ19zaXplID0gMDsKKyAgICBzaXplX3QgdGVtcF93aWR0aCwgdGVtcF9oZWlnaHQ7CisgICAgc2l6ZV90IGNvdW50ID0gTUlOKGdDYW1DYXBhYmlsaXR5W2NhbWVyYV9pZF0tPnBpY3R1cmVfc2l6ZXNfdGJsX2NudCwKKyAgICAgICAgICAgIE1BWF9TSVpFU19DTlQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICB0ZW1wX3dpZHRoID0gKHNpemVfdClnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFfaWRdLT5waWN0dXJlX3NpemVzX3RibFtpXS53aWR0aDsKKyAgICAgICAgdGVtcF9oZWlnaHQgPSAoc2l6ZV90KWdDYW1DYXBhYmlsaXR5W2NhbWVyYV9pZF0tPnBpY3R1cmVfc2l6ZXNfdGJsW2ldLmhlaWdodDsKKyAgICAgICAgaWYgKHRlbXBfd2lkdGggKiB0ZW1wX2hlaWdodCA+IG1heF9qcGVnX3NpemUgKSB7CisgICAgICAgICAgICBtYXhfanBlZ19zaXplID0gdGVtcF93aWR0aCAqIHRlbXBfaGVpZ2h0OworICAgICAgICB9CisgICAgfQorICAgIG1heF9qcGVnX3NpemUgPSBtYXhfanBlZ19zaXplICogMy8yICsgc2l6ZW9mKGNhbWVyYTNfanBlZ19ibG9iX3QpOworICAgIHJldHVybiBtYXhfanBlZ19zaXplOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldE1heFJhd1NpemUKKyAqCisgKiBERVNDUklQVElPTjogRmV0Y2hlcyBtYXhpbXVtIHJhdyBzaXplIHN1cHBvcnRlZCBieSB0aGUgY2FtZXJhSWQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqCisgKiBSRVRVUk4gICAgIDogTGFyZ2VzdCBzdXBwb3J0ZWQgUmF3IERpbWVuc2lvbgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjYW1fZGltZW5zaW9uX3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Z2V0TWF4UmF3U2l6ZSh1aW50MzJfdCBjYW1lcmFfaWQpCit7CisgICAgaW50IG1heF93aWR0aCA9IDA7CisgICAgY2FtX2RpbWVuc2lvbl90IG1heFJhd1NpemU7CisKKyAgICBtZW1zZXQoJm1heFJhd1NpemUsIDAsIHNpemVvZihjYW1fZGltZW5zaW9uX3QpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGdDYW1DYXBhYmlsaXR5W2NhbWVyYV9pZF0tPnN1cHBvcnRlZF9yYXdfZGltX2NudDsgaSsrKSB7CisgICAgICAgIGlmIChtYXhfd2lkdGggPCBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFfaWRdLT5yYXdfZGltW2ldLndpZHRoKSB7CisgICAgICAgICAgICBtYXhfd2lkdGggPSBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFfaWRdLT5yYXdfZGltW2ldLndpZHRoOworICAgICAgICAgICAgbWF4UmF3U2l6ZSA9IGdDYW1DYXBhYmlsaXR5W2NhbWVyYV9pZF0tPnJhd19kaW1baV07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1heFJhd1NpemU7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYWxjTWF4SnBlZ0RpbQorICoKKyAqIERFU0NSSVBUSU9OOiBDYWxjdWxhdGVzIG1heGltdW0ganBlZyBkaW1lbnNpb24gc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmFJZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOiBtYXhfanBlZ19kaW0KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY2FtX2RpbWVuc2lvbl90IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmNhbGNNYXhKcGVnRGltKCkKK3sKKyAgICBjYW1fZGltZW5zaW9uX3QgbWF4X2pwZWdfZGltOworICAgIGNhbV9kaW1lbnNpb25fdCBjdXJyX2pwZWdfZGltOworICAgIG1heF9qcGVnX2RpbS53aWR0aCA9IDA7CisgICAgbWF4X2pwZWdfZGltLmhlaWdodCA9IDA7CisgICAgY3Vycl9qcGVnX2RpbS53aWR0aCA9IDA7CisgICAgY3Vycl9qcGVnX2RpbS5oZWlnaHQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cGljdHVyZV9zaXplc190YmxfY250OyBpKyspIHsKKyAgICAgICAgY3Vycl9qcGVnX2RpbS53aWR0aCA9IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnBpY3R1cmVfc2l6ZXNfdGJsW2ldLndpZHRoOworICAgICAgICBjdXJyX2pwZWdfZGltLmhlaWdodCA9IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnBpY3R1cmVfc2l6ZXNfdGJsW2ldLmhlaWdodDsKKyAgICAgICAgaWYgKGN1cnJfanBlZ19kaW0ud2lkdGggKiBjdXJyX2pwZWdfZGltLmhlaWdodCA+CisgICAgICAgICAgICBtYXhfanBlZ19kaW0ud2lkdGggKiBtYXhfanBlZ19kaW0uaGVpZ2h0ICkgeworICAgICAgICAgICAgbWF4X2pwZWdfZGltLndpZHRoID0gY3Vycl9qcGVnX2RpbS53aWR0aDsKKyAgICAgICAgICAgIG1heF9qcGVnX2RpbS5oZWlnaHQgPSBjdXJyX2pwZWdfZGltLmhlaWdodDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWF4X2pwZWdfZGltOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFkZFN0cmVhbUNvbmZpZworICoKKyAqIERFU0NSSVBUSU9OOiBhZGRzIHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbiB0byB0aGUgYXJyYXkKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqIEBhdmFpbGFibGVfc3RyZWFtX2NvbmZpZ3MgOiBwb2ludGVyIHRvIHN0cmVhbSBjb25maWd1cmF0aW9uIGFycmF5CisgKiBAc2NhbGFyX2Zvcm1hdCAgICAgICAgICAgIDogc2NhbGFyIGZvcm1hdAorICogQGRpbSAgICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZ3VyYXRpb24gZGltZW5zaW9uCisgKiBAY29uZmlnX3R5cGUgICAgICAgICAgICAgIDogaW5wdXQgb3Igb3V0cHV0IGNvbmZpZ3VyYXRpb24gdHlwZQorICoKKyAqIFJFVFVSTiAgICAgOiBOT05FCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6YWRkU3RyZWFtQ29uZmlnKFZlY3RvcjxpbnQzMl90PiAmYXZhaWxhYmxlX3N0cmVhbV9jb25maWdzLAorICAgICAgICBpbnQzMl90IHNjYWxhcl9mb3JtYXQsIGNvbnN0IGNhbV9kaW1lbnNpb25fdCAmZGltLCBpbnQzMl90IGNvbmZpZ190eXBlKQoreworICAgIGF2YWlsYWJsZV9zdHJlYW1fY29uZmlncy5hZGQoc2NhbGFyX2Zvcm1hdCk7CisgICAgYXZhaWxhYmxlX3N0cmVhbV9jb25maWdzLmFkZChkaW0ud2lkdGgpOworICAgIGF2YWlsYWJsZV9zdHJlYW1fY29uZmlncy5hZGQoZGltLmhlaWdodCk7CisgICAgYXZhaWxhYmxlX3N0cmVhbV9jb25maWdzLmFkZChjb25maWdfdHlwZSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3VwcHBvcnRCdXJzdENhcHR1cmUKKyAqCisgKiBERVNDUklQVElPTjogV2hldGhlciBhIHBhcnRpY3VsYXIgY2FtZXJhIHN1cHBvcnRzIEJVUlNUX0NBUFRVUkUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYUlkICA6IGNhbWVyYSBJZAorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlIGlmIGNhbWVyYSBzdXBwb3J0cyBCVVJTVF9DQVBUVVJFCisgKiAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6c3VwcG9ydEJ1cnN0Q2FwdHVyZSh1aW50MzJfdCBjYW1lcmFJZCkKK3sKKyAgICBjb25zdCBpbnQ2NF90IGhpZ2hSZXNEdXJhdGlvbkJvdW5kID0gNTAwMDAwMDA7IC8vIDUwIG1zLCAyMCBmcHMKKyAgICBjb25zdCBpbnQ2NF90IGZ1bGxSZXNEdXJhdGlvbkJvdW5kID0gMTAwMDAwMDAwOyAvLyAxMDAgbXMsIDEwIGZwcworICAgIGNvbnN0IGludDMyX3QgaGlnaFJlc1dpZHRoID0gMzI2NDsKKyAgICBjb25zdCBpbnQzMl90IGhpZ2hSZXNIZWlnaHQgPSAyNDQ4OworCisgICAgaWYgKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cGljdHVyZV9taW5fZHVyYXRpb25bMF0gPiBmdWxsUmVzRHVyYXRpb25Cb3VuZCkgeworICAgICAgICAvLyBNYXhpbXVtIHJlc29sdXRpb24gaW1hZ2VzIGNhbm5vdCBiZSBjYXB0dXJlZCBhdCA+PSAxMGZwcworICAgICAgICAvLyAtPiBub3Qgc3VwcG9ydGluZyBCVVJTVF9DQVBUVVJFCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5waWN0dXJlX21pbl9kdXJhdGlvblswXSA8PSBoaWdoUmVzRHVyYXRpb25Cb3VuZCkgeworICAgICAgICAvLyBNYXhpbXVtIHJlc29sdXRpb24gaW1hZ2VzIGNhbiBiZSBjYXB0dXJlZCBhdCA+PSAyMGZwcworICAgICAgICAvLyAtLT4gc3VwcG9ydGluZyBCVVJTVF9DQVBUVVJFCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZpbmQgdGhlIHNtYWxsZXN0IGhpZ2hSZXMgcmVzb2x1dGlvbiwgb3IgbGFyZ2VzdCByZXNvbHV0aW9uIGlmIHRoZXJlIGlzIG5vbmUKKyAgICBzaXplX3QgdG90YWxDbnQgPSBNSU4oZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5waWN0dXJlX3NpemVzX3RibF9jbnQsCisgICAgICAgICAgICBNQVhfU0laRVNfQ05UKTsKKyAgICBzaXplX3QgaGlnaFJlcyA9IDA7CisgICAgd2hpbGUgKChoaWdoUmVzICsgMSA8IHRvdGFsQ250KSAmJgorICAgICAgICAgICAgKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cGljdHVyZV9zaXplc190YmxbaGlnaFJlcysxXS53aWR0aCAqCisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnBpY3R1cmVfc2l6ZXNfdGJsW2hpZ2hSZXMrMV0uaGVpZ2h0ID49CisgICAgICAgICAgICBoaWdoUmVzV2lkdGggKiBoaWdoUmVzSGVpZ2h0KSkgeworICAgICAgICBoaWdoUmVzKys7CisgICAgfQorICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnBpY3R1cmVfbWluX2R1cmF0aW9uW2hpZ2hSZXNdIDw9IGhpZ2hSZXNEdXJhdGlvbkJvdW5kKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW5pdFN0YXRpY01ldGFkYXRhCisgKgorICogREVTQ1JJUFRJT046IGluaXRpYWxpemUgdGhlIHN0YXRpYyBtZXRhZGF0YQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhSWQgIDogY2FtZXJhIElkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjppbml0U3RhdGljTWV0YWRhdGEodWludDMyX3QgY2FtZXJhSWQpCit7CisgICAgaW50IHJjID0gMDsKKyAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvOworICAgIHNpemVfdCBjb3VudCA9IDA7CisgICAgYm9vbCBsaW1pdGVkRGV2aWNlID0gZmFsc2U7CisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgYm9vbCBzdXBwb3J0QnVyc3QgPSBmYWxzZTsKKworICAgIHN1cHBvcnRCdXJzdCA9IHN1cHBvcnRCdXJzdENhcHR1cmUoY2FtZXJhSWQpOworCisgICAgLyogSWYgc2Vuc29yIGlzIFlVViBzZW5zb3IgKG5vIHJhdyBzdXBwb3J0KSBvciBpZiBwZXItZnJhbWUgY29udHJvbCBpcyBub3QKKyAgICAgKiBndWFyYW50ZWVkIG9yIGlmIG1pbiBmcHMgb2YgbWF4IHJlc29sdXRpb24gaXMgbGVzcyB0aGFuIDIwIGZwcywgaXRzCisgICAgICogYWR2ZXJ0aXNlZCBhcyBsaW1pdGVkIGRldmljZSovCisgICAgbGltaXRlZERldmljZSA9IGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+bm9fcGVyX2ZyYW1lX2NvbnRyb2xfc3VwcG9ydCB8fAorICAgICAgICAgICAgKENBTV9TRU5TT1JfWVVWID09IGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c2Vuc29yX3R5cGUuc2Vuc190eXBlKSB8fAorICAgICAgICAgICAgKENBTV9TRU5TT1JfTU9OTyA9PSBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnNlbnNvcl90eXBlLnNlbnNfdHlwZSkgfHwKKyAgICAgICAgICAgICFzdXBwb3J0QnVyc3Q7CisKKyAgICB1aW50OF90IHN1cHBvcnRlZEh3THZsID0gbGltaXRlZERldmljZSA/CisgICAgICAgICAgICBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMX0xJTUlURUQgOgorI2lmbmRlZiBVU0VfSEFMXzNfMworICAgICAgICAgICAgLy8gTEVWRUxfMyAtIFRoaXMgZGV2aWNlIHdpbGwgc3VwcG9ydCBsZXZlbCAzLgorICAgICAgICAgICAgQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTF8zOworI2Vsc2UKKyAgICAgICAgICAgIEFORFJPSURfSU5GT19TVVBQT1JURURfSEFSRFdBUkVfTEVWRUxfRlVMTDsKKyNlbmRpZgorCisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTCwKKyAgICAgICAgICAgICZzdXBwb3J0ZWRId0x2bCwgMSk7CisKKyAgICBib29sIGZhY2luZ0JhY2sgPSBmYWxzZTsKKyAgICBpZiAoKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cG9zaXRpb24gPT0gQ0FNX1BPU0lUSU9OX0JBQ0spIHx8CisgICAgICAgICAgICAoZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5wb3NpdGlvbiA9PSBDQU1fUE9TSVRJT05fQkFDS19BVVgpKSB7CisgICAgICAgIGZhY2luZ0JhY2sgPSB0cnVlOworICAgIH0KKyAgICAvKkhBTCAzIG9ubHkqLworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfTEVOU19JTkZPX01JTklNVU1fRk9DVVNfRElTVEFOQ0UsCisgICAgICAgICAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPm1pbl9mb2N1c19kaXN0YW5jZSwgMSk7CisKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX0xFTlNfSU5GT19IWVBFUkZPQ0FMX0RJU1RBTkNFLAorICAgICAgICAgICAgICAgICAgICAmZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5oeXBlcl9mb2NhbF9kaXN0YW5jZSwgMSk7CisKKyAgICAvKnNob3VsZCBiZSB1c2luZyBmb2NhbCBsZW5ndGhzIGJ1dCBzZW5zb3IgZG9lc24ndCBwcm92aWRlIHRoYXQgaW5mbyBub3cqLworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfTEVOU19JTkZPX0FWQUlMQUJMRV9GT0NBTF9MRU5HVEhTLAorICAgICAgICAgICAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmZvY2FsX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfTEVOU19JTkZPX0FWQUlMQUJMRV9BUEVSVFVSRVMsCisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmFwZXJ0dXJlcywKKyAgICAgICAgICAgIE1JTihDQU1fQVBFUlRVUkVTX01BWCwgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5hcGVydHVyZXNfY291bnQpKTsKKworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfTEVOU19JTkZPX0FWQUlMQUJMRV9GSUxURVJfREVOU0lUSUVTLAorICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5maWx0ZXJfZGVuc2l0aWVzLAorICAgICAgICAgICAgTUlOKENBTV9GSUxURVJfREVOU0lUSUVTX01BWCwgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5maWx0ZXJfZGVuc2l0aWVzX2NvdW50KSk7CisKKworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfTEVOU19JTkZPX0FWQUlMQUJMRV9PUFRJQ0FMX1NUQUJJTElaQVRJT04sCisgICAgICAgICAgICAodWludDhfdCAqKWdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+b3B0aWNhbF9zdGFiX21vZGVzLAorICAgICAgICAgICAgTUlOKChzaXplX3QpQ0FNX09QVF9TVEFCX01BWCwgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5vcHRpY2FsX3N0YWJfbW9kZXNfY291bnQpKTsKKworICAgIGludDMyX3QgbGVuc19zaGFkaW5nX21hcF9zaXplW10gPSB7CisgICAgICAgICAgICBNSU4oQ0FNX01BWF9TSEFESU5HX01BUF9XSURUSCwgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5sZW5zX3NoYWRpbmdfbWFwX3NpemUud2lkdGgpLAorICAgICAgICAgICAgTUlOKENBTV9NQVhfU0hBRElOR19NQVBfSEVJR0hULCBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmxlbnNfc2hhZGluZ19tYXBfc2l6ZS5oZWlnaHQpfTsKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgIGxlbnNfc2hhZGluZ19tYXBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobGVuc19zaGFkaW5nX21hcF9zaXplKS9zaXplb2YoaW50MzJfdCkpOworCisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfSU5GT19QSFlTSUNBTF9TSVpFLAorICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zZW5zb3JfcGh5c2ljYWxfc2l6ZSwgU0VOU09SX1BIWVNJQ0FMX1NJWkVfQ05UKTsKKworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0VOU09SX0lORk9fRVhQT1NVUkVfVElNRV9SQU5HRSwKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+ZXhwb3N1cmVfdGltZV9yYW5nZSwgRVhQT1NVUkVfVElNRV9SQU5HRV9DTlQpOworCisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfSU5GT19NQVhfRlJBTUVfRFVSQVRJT04sCisgICAgICAgICAgICAmZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5tYXhfZnJhbWVfZHVyYXRpb24sIDEpOworCisgICAgY2FtZXJhX21ldGFkYXRhX3JhdGlvbmFsIGJhc2VHYWluRmFjdG9yID0geworICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5iYXNlX2dhaW5fZmFjdG9yLm51bWVyYXRvciwKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+YmFzZV9nYWluX2ZhY3Rvci5kZW5vbWluYXRvcn07CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfQkFTRV9HQUlOX0ZBQ1RPUiwKKyAgICAgICAgICAgICAgICAgICAgICAmYmFzZUdhaW5GYWN0b3IsIDEpOworCisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKSZnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmNvbG9yX2FycmFuZ2VtZW50LCAxKTsKKworICAgIGludDMyX3QgcGl4ZWxfYXJyYXlfc2l6ZVtdID0ge2dDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cGl4ZWxfYXJyYXlfc2l6ZS53aWR0aCwKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cGl4ZWxfYXJyYXlfc2l6ZS5oZWlnaHR9OworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0VOU09SX0lORk9fUElYRUxfQVJSQVlfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9hcnJheV9zaXplLCBzaXplb2YocGl4ZWxfYXJyYXlfc2l6ZSkvc2l6ZW9mKHBpeGVsX2FycmF5X3NpemVbMF0pKTsKKworICAgIGludDMyX3QgYWN0aXZlX2FycmF5X3NpemVbXSA9IHtnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmFjdGl2ZV9hcnJheV9zaXplLmxlZnQsCisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmFjdGl2ZV9hcnJheV9zaXplLnRvcCwKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+YWN0aXZlX2FycmF5X3NpemUud2lkdGgsCisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmFjdGl2ZV9hcnJheV9zaXplLmhlaWdodH07CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSwKKyAgICAgICAgICAgIGFjdGl2ZV9hcnJheV9zaXplLCBzaXplb2YoYWN0aXZlX2FycmF5X3NpemUpL3NpemVvZihhY3RpdmVfYXJyYXlfc2l6ZVswXSkpOworCisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfSU5GT19XSElURV9MRVZFTCwKKyAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPndoaXRlX2xldmVsLCAxKTsKKworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4sCisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmJsYWNrX2xldmVsX3BhdHRlcm4sIEJMQUNLX0xFVkVMX1BBVFRFUk5fQ05UKTsKKworI2lmbmRlZiBVU0VfSEFMXzNfMworICAgIGJvb2wgaGFzQmxhY2tSZWdpb25zID0gZmFsc2U7CisgICAgaWYgKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+b3B0aWNhbF9ibGFja19yZWdpb25fY291bnQgPiBNQVhfT1BUSUNBTF9CTEFDS19SRUdJT05TKSB7CisgICAgICAgIExPR1coImJsYWNrX3JlZ2lvbl9jb3VudDogJWQgaXMgYm91bmRlZCB0byAlZCIsCisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPm9wdGljYWxfYmxhY2tfcmVnaW9uX2NvdW50LCBNQVhfT1BUSUNBTF9CTEFDS19SRUdJT05TKTsKKyAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5vcHRpY2FsX2JsYWNrX3JlZ2lvbl9jb3VudCA9IE1BWF9PUFRJQ0FMX0JMQUNLX1JFR0lPTlM7CisgICAgfQorICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPm9wdGljYWxfYmxhY2tfcmVnaW9uX2NvdW50ICE9IDApIHsKKyAgICAgICAgaW50MzJfdCBvcHRpY2FsQmxhY2tSZWdpb25zW01BWF9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMgKiA0XTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPm9wdGljYWxfYmxhY2tfcmVnaW9uX2NvdW50ICogNDsgaSsrKSB7CisgICAgICAgICAgICBvcHRpY2FsQmxhY2tSZWdpb25zW2ldID0gZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5vcHRpY2FsX2JsYWNrX3JlZ2lvbnNbaV07CisgICAgICAgIH0KKyAgICAgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfT1BUSUNBTF9CTEFDS19SRUdJT05TLAorICAgICAgICAgICAgICAgIG9wdGljYWxCbGFja1JlZ2lvbnMsIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+b3B0aWNhbF9ibGFja19yZWdpb25fY291bnQgKiA0KTsKKyAgICAgICAgaGFzQmxhY2tSZWdpb25zID0gdHJ1ZTsKKyAgICB9CisjZW5kaWYKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX0ZMQVNIX0lORk9fQ0hBUkdFX0RVUkFUSU9OLAorICAgICAgICAgICAgJmdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+Zmxhc2hfY2hhcmdlX2R1cmF0aW9uLCAxKTsKKworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfVE9ORU1BUF9NQVhfQ1VSVkVfUE9JTlRTLAorICAgICAgICAgICAgJmdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+bWF4X3RvbmVfbWFwX2N1cnZlX3BvaW50cywgMSk7CisKKyAgICB1aW50OF90IHRpbWVzdGFtcFNvdXJjZSA9IEFORFJPSURfU0VOU09SX0lORk9fVElNRVNUQU1QX1NPVVJDRV9VTktOT1dOOworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0VOU09SX0lORk9fVElNRVNUQU1QX1NPVVJDRSwKKyAgICAgICAgICAgICZ0aW1lc3RhbXBTb3VyY2UsIDEpOworCisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fSElTVE9HUkFNX0JVQ0tFVF9DT1VOVCwKKyAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmhpc3RvZ3JhbV9zaXplLCAxKTsKKworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU1RBVElTVElDU19JTkZPX01BWF9ISVNUT0dSQU1fQ09VTlQsCisgICAgICAgICAgICAmZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5tYXhfaGlzdG9ncmFtX2NvdW50LCAxKTsKKworICAgIGludDMyX3Qgc2hhcnBuZXNzX21hcF9zaXplW10gPSB7CisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnNoYXJwbmVzc19tYXBfc2l6ZS53aWR0aCwKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c2hhcnBuZXNzX21hcF9zaXplLmhlaWdodH07CisKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19TSEFSUE5FU1NfTUFQX1NJWkUsCisgICAgICAgICAgICBzaGFycG5lc3NfbWFwX3NpemUsIHNpemVvZihzaGFycG5lc3NfbWFwX3NpemUpL3NpemVvZihpbnQzMl90KSk7CisKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19NQVhfU0hBUlBORVNTX01BUF9WQUxVRSwKKyAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPm1heF9zaGFycG5lc3NfbWFwX3ZhbHVlLCAxKTsKKworICAgIGludDMyX3Qgc2NhbGFyX2Zvcm1hdHNbXSA9IHsKKyAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTX1JBV19PUEFRVUUsCisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUU19SQVcxNiwKKyAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTX1lDYkNyXzQyMF84ODgsCisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUU19CTE9CLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxMCwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRH07CisgICAgc2l6ZV90IHNjYWxhcl9mb3JtYXRzX2NvdW50ID0gc2l6ZW9mKHNjYWxhcl9mb3JtYXRzKSAvIHNpemVvZihpbnQzMl90KTsKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUUywKKyAgICAgICAgICAgICAgICAgICAgICBzY2FsYXJfZm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICBzY2FsYXJfZm9ybWF0c19jb3VudCk7CisKKyAgICBpbnQzMl90IGF2YWlsYWJsZV9wcm9jZXNzZWRfc2l6ZXNbTUFYX1NJWkVTX0NOVCAqIDJdOworICAgIGNvdW50ID0gTUlOKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cGljdHVyZV9zaXplc190YmxfY250LCBNQVhfU0laRVNfQ05UKTsKKyAgICBtYWtlVGFibGUoZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5waWN0dXJlX3NpemVzX3RibCwKKyAgICAgICAgICAgIGNvdW50LCBNQVhfU0laRVNfQ05ULCBhdmFpbGFibGVfcHJvY2Vzc2VkX3NpemVzKTsKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUFJPQ0VTU0VEX1NJWkVTLAorICAgICAgICAgICAgYXZhaWxhYmxlX3Byb2Nlc3NlZF9zaXplcywgY291bnQgKiAyKTsKKworICAgIGludDMyX3QgYXZhaWxhYmxlX3Jhd19zaXplc1tNQVhfU0laRVNfQ05UICogMl07CisgICAgY291bnQgPSBNSU4oZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zdXBwb3J0ZWRfcmF3X2RpbV9jbnQsIE1BWF9TSVpFU19DTlQpOworICAgIG1ha2VUYWJsZShnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnJhd19kaW0sCisgICAgICAgICAgICBjb3VudCwgTUFYX1NJWkVTX0NOVCwgYXZhaWxhYmxlX3Jhd19zaXplcyk7CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JBV19TSVpFUywKKyAgICAgICAgICAgIGF2YWlsYWJsZV9yYXdfc2l6ZXMsIGNvdW50ICogMik7CisKKyAgICBpbnQzMl90IGF2YWlsYWJsZV9mcHNfcmFuZ2VzW01BWF9TSVpFU19DTlQgKiAyXTsKKyAgICBjb3VudCA9IE1JTihnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmZwc19yYW5nZXNfdGJsX2NudCwgTUFYX1NJWkVTX0NOVCk7CisgICAgbWFrZUZQU1RhYmxlKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+ZnBzX3Jhbmdlc190YmwsCisgICAgICAgICAgICBjb3VudCwgTUFYX1NJWkVTX0NOVCwgYXZhaWxhYmxlX2Zwc19yYW5nZXMpOworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9BVkFJTEFCTEVfVEFSR0VUX0ZQU19SQU5HRVMsCisgICAgICAgICAgICBhdmFpbGFibGVfZnBzX3JhbmdlcywgY291bnQgKiAyKTsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9yYXRpb25hbCBleHBvc3VyZUNvbXBlbnNhdGlvblN0ZXAgPSB7CisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmV4cF9jb21wZW5zYXRpb25fc3RlcC5udW1lcmF0b3IsCisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmV4cF9jb21wZW5zYXRpb25fc3RlcC5kZW5vbWluYXRvcn07CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX0NPTVBFTlNBVElPTl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICZleHBvc3VyZUNvbXBlbnNhdGlvblN0ZXAsIDEpOworCisgICAgVmVjdG9yPHVpbnQ4X3Q+IGF2YWlsYWJsZVZzdGFiTW9kZXM7CisgICAgYXZhaWxhYmxlVnN0YWJNb2Rlcy5hZGQoQU5EUk9JRF9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERV9PRkYpOworICAgIGNoYXIgZWlzX3Byb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBib29sIGVpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgIG1lbXNldChlaXNfcHJvcCwgMCwgc2l6ZW9mKGVpc19wcm9wKSk7CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5laXMuZW5hYmxlIiwgZWlzX3Byb3AsICIxIik7CisgICAgdWludDhfdCBlaXNfcHJvcF9zZXQgPSAodWludDhfdClhdG9pKGVpc19wcm9wKTsKKyAgICBjb3VudCA9IElTX1RZUEVfTUFYOworICAgIGNvdW50ID0gTUlOKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c3VwcG9ydGVkX2lzX3R5cGVzX2NudCwgY291bnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBpZiAoKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c3VwcG9ydGVkX2lzX3R5cGVzW2ldID09IElTX1RZUEVfRUlTXzJfMCkgfHwKKyAgICAgICAgICAgIChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnN1cHBvcnRlZF9pc190eXBlc1tpXSA9PSBJU19UWVBFX0VJU18zXzApKSB7CisgICAgICAgICAgICBlaXNTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZhY2luZ0JhY2sgJiYgZWlzX3Byb3Bfc2V0ICYmIGVpc1N1cHBvcnRlZCkgeworICAgICAgICBhdmFpbGFibGVWc3RhYk1vZGVzLmFkZChBTkRST0lEX0NPTlRST0xfVklERU9fU1RBQklMSVpBVElPTl9NT0RFX09OKTsKKyAgICB9CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9WSURFT19TVEFCSUxJWkFUSU9OX01PREVTLAorICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZVZzdGFiTW9kZXMuYXJyYXkoKSwgYXZhaWxhYmxlVnN0YWJNb2Rlcy5zaXplKCkpOworCisgICAgLypIQUwgMSBhbmQgSEFMIDMgY29tbW9uKi8KKyAgICB1aW50MzJfdCB6b29tU3RlcHMgPSBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnpvb21fcmF0aW9fdGJsX2NudDsKKyAgICB1aW50MzJfdCBtYXhab29tU3RlcCA9IGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+em9vbV9yYXRpb190Ymxbem9vbVN0ZXBzIC0gMV07CisgICAgdWludDMyX3QgbWluWm9vbVN0ZXAgPSAxMDA7IC8vYXMgcGVyIEhBTDEvQVBJMSBzcGVjCisgICAgZmxvYXQgbWF4Wm9vbSA9IG1heFpvb21TdGVwL21pblpvb21TdGVwOworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NQVhfRElHSVRBTF9aT09NLAorICAgICAgICAgICAgJm1heFpvb20sIDEpOworCisgICAgdWludDhfdCBjcm9wcGluZ1R5cGUgPSBBTkRST0lEX1NDQUxFUl9DUk9QUElOR19UWVBFX0NFTlRFUl9PTkxZOworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0NBTEVSX0NST1BQSU5HX1RZUEUsICZjcm9wcGluZ1R5cGUsIDEpOworCisgICAgaW50MzJfdCBtYXgzYVJlZ2lvbnNbM10gPSB7LypBRSovMSwvKkFXQiovIDAsLypBRiovIDF9OworICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnN1cHBvcnRlZF9mb2N1c19tb2Rlc19jbnQgPT0gMSkKKyAgICAgICAgbWF4M2FSZWdpb25zWzJdID0gMDsgLyogQUYgbm90IHN1cHBvcnRlZCAqLworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKKyAgICAgICAgICAgIG1heDNhUmVnaW9ucywgMyk7CisKKyAgICAvKiAwOiBPRkYsIDE6IE9GRitTSU1QTEUsIDI6IE9GRitGVUxMLCAzOiBPRkYrU0lNUExFK0ZVTEwgKi8KKyAgICBtZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmZhY2VkZXRlY3QiLCBwcm9wLCAiMSIpOworICAgIHVpbnQ4X3Qgc3VwcG9ydGVkRmFjZURldGVjdE1vZGUgPSAodWludDhfdClhdG9pKHByb3ApOworICAgIExPR0QoIlN1cHBvcnQgZmFjZSBkZXRlY3Rpb24gbW9kZTogJWQiLAorICAgICAgICAgICAgIHN1cHBvcnRlZEZhY2VEZXRlY3RNb2RlKTsKKworICAgIGludDMyX3QgbWF4RmFjZXMgPSBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPm1heF9udW1fcm9pOworICAgIC8qIHN1cHBvcnQgbW9kZSBzaG91bGQgYmUgT0ZGIGlmIG1heCBudW1iZXIgb2YgZmFjZSBpcyAwICovCisgICAgaWYgKG1heEZhY2VzIDw9IDApIHsKKyAgICAgICAgc3VwcG9ydGVkRmFjZURldGVjdE1vZGUgPSAwOworICAgIH0KKyAgICBWZWN0b3I8dWludDhfdD4gYXZhaWxhYmxlRmFjZURldGVjdE1vZGVzOworICAgIGF2YWlsYWJsZUZhY2VEZXRlY3RNb2Rlcy5hZGQoQU5EUk9JRF9TVEFUSVNUSUNTX0ZBQ0VfREVURUNUX01PREVfT0ZGKTsKKyAgICBpZiAoc3VwcG9ydGVkRmFjZURldGVjdE1vZGUgPT0gMSkgeworICAgICAgICBhdmFpbGFibGVGYWNlRGV0ZWN0TW9kZXMuYWRkKEFORFJPSURfU1RBVElTVElDU19GQUNFX0RFVEVDVF9NT0RFX1NJTVBMRSk7CisgICAgfSBlbHNlIGlmIChzdXBwb3J0ZWRGYWNlRGV0ZWN0TW9kZSA9PSAyKSB7CisgICAgICAgIGF2YWlsYWJsZUZhY2VEZXRlY3RNb2Rlcy5hZGQoQU5EUk9JRF9TVEFUSVNUSUNTX0ZBQ0VfREVURUNUX01PREVfRlVMTCk7CisgICAgfSBlbHNlIGlmIChzdXBwb3J0ZWRGYWNlRGV0ZWN0TW9kZSA9PSAzKSB7CisgICAgICAgIGF2YWlsYWJsZUZhY2VEZXRlY3RNb2Rlcy5hZGQoQU5EUk9JRF9TVEFUSVNUSUNTX0ZBQ0VfREVURUNUX01PREVfU0lNUExFKTsKKyAgICAgICAgYXZhaWxhYmxlRmFjZURldGVjdE1vZGVzLmFkZChBTkRST0lEX1NUQVRJU1RJQ1NfRkFDRV9ERVRFQ1RfTU9ERV9GVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtYXhGYWNlcyA9IDA7CisgICAgfQorICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU1RBVElTVElDU19JTkZPX0FWQUlMQUJMRV9GQUNFX0RFVEVDVF9NT0RFUywKKyAgICAgICAgICAgIGF2YWlsYWJsZUZhY2VEZXRlY3RNb2Rlcy5hcnJheSgpLAorICAgICAgICAgICAgYXZhaWxhYmxlRmFjZURldGVjdE1vZGVzLnNpemUoKSk7CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fTUFYX0ZBQ0VfQ09VTlQsCisgICAgICAgICAgICAoaW50MzJfdCAqKSZtYXhGYWNlcywgMSk7CisKKyAgICBpbnQzMl90IGV4cG9zdXJlQ29tcGVuc2F0aW9uUmFuZ2VbXSA9IHsKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+ZXhwb3N1cmVfY29tcGVuc2F0aW9uX21pbiwKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+ZXhwb3N1cmVfY29tcGVuc2F0aW9uX21heH07CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX0NPTVBFTlNBVElPTl9SQU5HRSwKKyAgICAgICAgICAgIGV4cG9zdXJlQ29tcGVuc2F0aW9uUmFuZ2UsCisgICAgICAgICAgICBzaXplb2YoZXhwb3N1cmVDb21wZW5zYXRpb25SYW5nZSkvc2l6ZW9mKGludDMyX3QpKTsKKworICAgIHVpbnQ4X3QgbGVuc0ZhY2luZyA9IChmYWNpbmdCYWNrKSA/CisgICAgICAgICAgICBBTkRST0lEX0xFTlNfRkFDSU5HX0JBQ0sgOiBBTkRST0lEX0xFTlNfRkFDSU5HX0ZST05UOworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfTEVOU19GQUNJTkcsICZsZW5zRmFjaW5nLCAxKTsKKworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfSlBFR19BVkFJTEFCTEVfVEhVTUJOQUlMX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZV90aHVtYm5haWxfc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGF2YWlsYWJsZV90aHVtYm5haWxfc2l6ZXMpL3NpemVvZihpbnQzMl90KSk7CisKKyAgICAvKmFsbCBzaXplcyB3aWxsIGJlIGNsdWJiZWQgaW50byB0aGlzIHRhZyovCisgICAgY291bnQgPSBNSU4oZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5waWN0dXJlX3NpemVzX3RibF9jbnQsIE1BWF9TSVpFU19DTlQpOworICAgIC8qYW5kcm9pZC5zY2FsZXIuYXZhaWxhYmxlU3RyZWFtQ29uZmlndXJhdGlvbnMqLworICAgIFZlY3RvcjxpbnQzMl90PiBhdmFpbGFibGVfc3RyZWFtX2NvbmZpZ3M7CisgICAgY2FtX2RpbWVuc2lvbl90IGFjdGl2ZV9hcnJheV9kaW07CisgICAgYWN0aXZlX2FycmF5X2RpbS53aWR0aCA9IGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+YWN0aXZlX2FycmF5X3NpemUud2lkdGg7CisgICAgYWN0aXZlX2FycmF5X2RpbS5oZWlnaHQgPSBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmFjdGl2ZV9hcnJheV9zaXplLmhlaWdodDsKKyAgICAvKiBBZGQgaW5wdXQvb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9ucyBmb3IgZWFjaCBzY2FsYXIgZm9ybWF0cyovCisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzY2FsYXJfZm9ybWF0c19jb3VudDsgaisrKSB7CisgICAgICAgIHN3aXRjaCAoc2NhbGFyX2Zvcm1hdHNbal0pIHsKKyAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUU19SQVcxNjoKKyAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUU19SQVdfT1BBUVVFOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTA6CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1JTihNQVhfU0laRVNfQ05ULAorICAgICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnN1cHBvcnRlZF9yYXdfZGltX2NudCk7IGkrKykgeworICAgICAgICAgICAgICAgIGFkZFN0cmVhbUNvbmZpZyhhdmFpbGFibGVfc3RyZWFtX2NvbmZpZ3MsIHNjYWxhcl9mb3JtYXRzW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5yYXdfZGltW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CTE9COgorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNSU4oTUFYX1NJWkVTX0NOVCwKKyAgICAgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5waWN0dXJlX3NpemVzX3RibF9jbnQpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZGRTdHJlYW1Db25maWcoYXZhaWxhYmxlX3N0cmVhbV9jb25maWdzLCBzY2FsYXJfZm9ybWF0c1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cGljdHVyZV9zaXplc190YmxbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODg6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90IGxhcmdlc3RfcGljdHVyZV9zaXplOworICAgICAgICAgICAgbWVtc2V0KCZsYXJnZXN0X3BpY3R1cmVfc2l6ZSwgMCwgc2l6ZW9mKGNhbV9kaW1lbnNpb25fdCkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNSU4oTUFYX1NJWkVTX0NOVCwKKyAgICAgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5waWN0dXJlX3NpemVzX3RibF9jbnQpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhZGRTdHJlYW1Db25maWcoYXZhaWxhYmxlX3N0cmVhbV9jb25maWdzLCBzY2FsYXJfZm9ybWF0c1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cGljdHVyZV9zaXplc190YmxbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCk7CisgICAgICAgICAgICAgICAgLyogQm9vayBrZWVwIGxhcmdlc3QgKi8KKyAgICAgICAgICAgICAgICBpZiAoZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5waWN0dXJlX3NpemVzX3RibFtpXS53aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgPj0gbGFyZ2VzdF9waWN0dXJlX3NpemUud2lkdGggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cGljdHVyZV9zaXplc190YmxbaV0uaGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICA+PSBsYXJnZXN0X3BpY3R1cmVfc2l6ZS5oZWlnaHQpCisgICAgICAgICAgICAgICAgICAgIGxhcmdlc3RfcGljdHVyZV9zaXplID0gZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5waWN0dXJlX3NpemVzX3RibFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qRm9yIGJlbG93IDIgZm9ybWF0cyB3ZSBhbHNvIHN1cHBvcnQgaS9wIHN0cmVhbXMgZm9yIHJlcHJvY2Vzc2luZyBhZHZlcnRpc2UgdGhvc2UqLworICAgICAgICAgICAgaWYgKHNjYWxhcl9mb3JtYXRzW2pdID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCB8fAorICAgICAgICAgICAgICAgICAgICBzY2FsYXJfZm9ybWF0c1tqXSA9PSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgpIHsKKyAgICAgICAgICAgICAgICAgYWRkU3RyZWFtQ29uZmlnKGF2YWlsYWJsZV9zdHJlYW1fY29uZmlncywgc2NhbGFyX2Zvcm1hdHNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgbGFyZ2VzdF9waWN0dXJlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMsCisgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX3N0cmVhbV9jb25maWdzLmFycmF5KCksIGF2YWlsYWJsZV9zdHJlYW1fY29uZmlncy5zaXplKCkpOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGhvdHBpeGVsTW9kZSA9IEFORFJPSURfSE9UX1BJWEVMX01PREVfRkFTVDsKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX0hPVF9QSVhFTF9NT0RFLCAmaG90cGl4ZWxNb2RlLCAxKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGhvdFBpeGVsTWFwTW9kZSA9IEFORFJPSURfU1RBVElTVElDU19IT1RfUElYRUxfTUFQX01PREVfT0ZGOworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU1RBVElTVElDU19IT1RfUElYRUxfTUFQX01PREUsICZob3RQaXhlbE1hcE1vZGUsIDEpOworCisgICAgLyogYW5kcm9pZC5zY2FsZXIuYXZhaWxhYmxlTWluRnJhbWVEdXJhdGlvbnMgKi8KKyAgICBWZWN0b3I8aW50NjRfdD4gYXZhaWxhYmxlX21pbl9kdXJhdGlvbnM7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzY2FsYXJfZm9ybWF0c19jb3VudDsgaisrKSB7CisgICAgICAgIHN3aXRjaCAoc2NhbGFyX2Zvcm1hdHNbal0pIHsKKyAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUU19SQVcxNjoKKyAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfRk9STUFUU19SQVdfT1BBUVVFOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTA6CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1JTihNQVhfU0laRVNfQ05ULAorICAgICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnN1cHBvcnRlZF9yYXdfZGltX2NudCk7IGkrKykgeworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9taW5fZHVyYXRpb25zLmFkZChzY2FsYXJfZm9ybWF0c1tqXSk7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlX21pbl9kdXJhdGlvbnMuYWRkKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cmF3X2RpbVtpXS53aWR0aCk7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlX21pbl9kdXJhdGlvbnMuYWRkKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cmF3X2RpbVtpXS5oZWlnaHQpOworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9taW5fZHVyYXRpb25zLmFkZChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnJhd19taW5fZHVyYXRpb25baV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1JTihNQVhfU0laRVNfQ05ULAorICAgICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnBpY3R1cmVfc2l6ZXNfdGJsX2NudCk7IGkrKykgeworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9taW5fZHVyYXRpb25zLmFkZChzY2FsYXJfZm9ybWF0c1tqXSk7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlX21pbl9kdXJhdGlvbnMuYWRkKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cGljdHVyZV9zaXplc190YmxbaV0ud2lkdGgpOworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9taW5fZHVyYXRpb25zLmFkZChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnBpY3R1cmVfc2l6ZXNfdGJsW2ldLmhlaWdodCk7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlX21pbl9kdXJhdGlvbnMuYWRkKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cGljdHVyZV9taW5fZHVyYXRpb25baV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMsCisgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX21pbl9kdXJhdGlvbnMuYXJyYXkoKSwgYXZhaWxhYmxlX21pbl9kdXJhdGlvbnMuc2l6ZSgpKTsKKworICAgIFZlY3RvcjxpbnQzMl90PiBhdmFpbGFibGVfaGZyX2NvbmZpZ3M7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmhmcl90YmxfY250OyBpKyspIHsKKyAgICAgICAgaW50MzJfdCBmcHMgPSAwOworICAgICAgICBzd2l0Y2ggKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+aGZyX3RibFtpXS5tb2RlKSB7CisgICAgICAgIGNhc2UgQ0FNX0hGUl9NT0RFXzYwRlBTOgorICAgICAgICAgICAgZnBzID0gNjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1fSEZSX01PREVfOTBGUFM6CisgICAgICAgICAgICBmcHMgPSA5MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTV9IRlJfTU9ERV8xMjBGUFM6CisgICAgICAgICAgICBmcHMgPSAxMjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1fSEZSX01PREVfMTUwRlBTOgorICAgICAgICAgICAgZnBzID0gMTUwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNX0hGUl9NT0RFXzE4MEZQUzoKKyAgICAgICAgICAgIGZwcyA9IDE4MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTV9IRlJfTU9ERV8yMTBGUFM6CisgICAgICAgICAgICBmcHMgPSAyMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1fSEZSX01PREVfMjQwRlBTOgorICAgICAgICAgICAgZnBzID0gMjQwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNX0hGUl9NT0RFXzQ4MEZQUzoKKyAgICAgICAgICAgIGZwcyA9IDQ4MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTV9IRlJfTU9ERV9PRkY6CisgICAgICAgIGNhc2UgQ0FNX0hGUl9NT0RFX01BWDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogQWR2ZXJ0aXNlIG9ubHkgTUlOX0ZQU19GT1JfQkFUQ0hfTU9ERSBvciBhYm92ZSBhcyBISUdIX1NQRUVEX0NPTkZJR1MgKi8KKyAgICAgICAgaWYgKGZwcyA+PSBNSU5fRlBTX0ZPUl9CQVRDSF9NT0RFKSB7CisgICAgICAgICAgICAvKiBGb3IgZWFjaCBIRlIgZnJhbWUgcmF0ZSwgbmVlZCB0byBhZHZlcnRpc2Ugb25lIHZhcmlhYmxlIGZwcyByYW5nZQorICAgICAgICAgICAgICogYW5kIG9uZSBmaXhlZCBmcHMgcmFuZ2UgcGVyIGRpbWVuc2lvbi4gRWc6IGZvciAxMjAgRlBTLCBhZHZlcnRpc2UgWzMwLCAxMjBdCisgICAgICAgICAgICAgKiBhbmQgWzEyMCwgMTIwXS4gV2hpbGUgY2FtY29yZGVyIHByZXZpZXcgYWxvbmUgaXMgcnVubmluZyBbMzAsIDEyMF0gaXMKKyAgICAgICAgICAgICAqIHNldCBieSB0aGUgYXBwLiBXaGVuIHZpZGVvIHJlY29yZGluZyBpcyBzdGFydGVkLCBbMTIwLCAxMjBdIGlzCisgICAgICAgICAgICAgKiBzZXQuIFRoaXMgd2F5IHNlbnNvciBjb25maWd1cmF0aW9uIGRvZXMgbm90IGNoYW5nZSB3aGVuIHJlY29yZGluZworICAgICAgICAgICAgICogaXMgc3RhcnRlZCAqLworCisgICAgICAgICAgICAvKiAod2lkdGgsIGhlaWdodCwgZnBzX21pbiwgZnBzX21heCwgYmF0Y2hfc2l6ZV9tYXgpICovCisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+aGZyX3RibFtpXS5kaW1fY250ICYmCisgICAgICAgICAgICAgICAgaiA8IE1BWF9TSVpFU19DTlQ7IGorKykgeworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9oZnJfY29uZmlncy5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmhmcl90YmxbaV0uZGltW2pdLndpZHRoKTsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVfaGZyX2NvbmZpZ3MuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5oZnJfdGJsW2ldLmRpbVtqXS5oZWlnaHQpOworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9oZnJfY29uZmlncy5hZGQoUFJFVklFV19GUFNfRk9SX0hGUik7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2hmcl9jb25maWdzLmFkZChmcHMpOworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9oZnJfY29uZmlncy5hZGQoZnBzIC8gUFJFVklFV19GUFNfRk9SX0hGUik7CisKKyAgICAgICAgICAgICAgICAvKiAod2lkdGgsIGhlaWdodCwgZnBzX21pbiwgZnBzX21heCwgYmF0Y2hfc2l6ZV9tYXgpICovCisgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2hmcl9jb25maWdzLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+aGZyX3RibFtpXS5kaW1bal0ud2lkdGgpOworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9oZnJfY29uZmlncy5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmhmcl90YmxbaV0uZGltW2pdLmhlaWdodCk7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2hmcl9jb25maWdzLmFkZChmcHMpOworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9oZnJfY29uZmlncy5hZGQoZnBzKTsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVfaGZyX2NvbmZpZ3MuYWRkKGZwcyAvIFBSRVZJRVdfRlBTX0ZPUl9IRlIpOworICAgICAgICAgICAgfQorICAgICAgIH0KKyAgICB9CisgICAgLy9BZHZlcnRpc2UgSEZSIGNhcGFiaWxpdHkgb25seSBpZiB0aGUgcHJvcGVydHkgaXMgc2V0CisgICAgbWVtc2V0KHByb3AsIDAsIHNpemVvZihwcm9wKSk7CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5oYWwzaGZyLmVuYWJsZSIsIHByb3AsICIxIik7CisgICAgdWludDhfdCBoZnJFbmFibGUgPSAodWludDhfdClhdG9pKHByb3ApOworCisgICAgaWYoaGZyRW5hYmxlICYmIGF2YWlsYWJsZV9oZnJfY29uZmlncy5hcnJheSgpKSB7CisgICAgICAgIHN0YXRpY0luZm8udXBkYXRlKAorICAgICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9BVkFJTEFCTEVfSElHSF9TUEVFRF9WSURFT19DT05GSUdVUkFUSU9OUywKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVfaGZyX2NvbmZpZ3MuYXJyYXkoKSwgYXZhaWxhYmxlX2hmcl9jb25maWdzLnNpemUoKSk7CisgICAgfQorCisgICAgaW50MzJfdCBtYXhfanBlZ19zaXplID0gKGludDMyX3QpY2FsY01heEpwZWdTaXplKGNhbWVyYUlkKTsKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX0pQRUdfTUFYX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgJm1heF9qcGVnX3NpemUsIDEpOworCisgICAgdWludDhfdCBhdmFpbF9lZmZlY3RzW0NBTV9FRkZFQ1RfTU9ERV9NQVhdOworICAgIHNpemVfdCBzaXplID0gMDsKKyAgICBjb3VudCA9IENBTV9FRkZFQ1RfTU9ERV9NQVg7CisgICAgY291bnQgPSBNSU4oZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zdXBwb3J0ZWRfZWZmZWN0c19jbnQsIGNvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaW50IHZhbCA9IGxvb2t1cEZ3a05hbWUoRUZGRUNUX01PREVTX01BUCwgTUVUQURBVEFfTUFQX1NJWkUoRUZGRUNUX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zdXBwb3J0ZWRfZWZmZWN0c1tpXSk7CisgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKKyAgICAgICAgICAgIGF2YWlsX2VmZmVjdHNbc2l6ZV0gPSAodWludDhfdCl2YWw7CisgICAgICAgICAgICBzaXplKys7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9FRkZFQ1RTLAorICAgICAgICAgICAgICAgICAgICAgIGF2YWlsX2VmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICB1aW50OF90IGF2YWlsX3NjZW5lX21vZGVzW0NBTV9TQ0VORV9NT0RFX01BWF07CisgICAgdWludDhfdCBzdXBwb3J0ZWRfaW5kZXhlc1tDQU1fU0NFTkVfTU9ERV9NQVhdOworICAgIHNpemVfdCBzdXBwb3J0ZWRfc2NlbmVfbW9kZXNfY250ID0gMDsKKyAgICBjb3VudCA9IENBTV9TQ0VORV9NT0RFX01BWDsKKyAgICBjb3VudCA9IE1JTihnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnN1cHBvcnRlZF9zY2VuZV9tb2Rlc19jbnQsIGNvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c3VwcG9ydGVkX3NjZW5lX21vZGVzW2ldICE9CisgICAgICAgICAgICAgICAgQ0FNX1NDRU5FX01PREVfT0ZGKSB7CisgICAgICAgICAgICBpbnQgdmFsID0gbG9va3VwRndrTmFtZShTQ0VORV9NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgICAgIE1FVEFEQVRBX01BUF9TSVpFKFNDRU5FX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c3VwcG9ydGVkX3NjZW5lX21vZGVzW2ldKTsKKyAgICAgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKKyAgICAgICAgICAgICAgICBhdmFpbF9zY2VuZV9tb2Rlc1tzdXBwb3J0ZWRfc2NlbmVfbW9kZXNfY250XSA9ICh1aW50OF90KXZhbDsKKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWRfaW5kZXhlc1tzdXBwb3J0ZWRfc2NlbmVfbW9kZXNfY250XSA9ICh1aW50OF90KWk7CisgICAgICAgICAgICAgICAgc3VwcG9ydGVkX3NjZW5lX21vZGVzX2NudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfQ09OVFJPTF9BVkFJTEFCTEVfU0NFTkVfTU9ERVMsCisgICAgICAgICAgICAgICAgICAgICAgYXZhaWxfc2NlbmVfbW9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkX3NjZW5lX21vZGVzX2NudCk7CisKKyAgICB1aW50OF90IHNjZW5lX21vZGVfb3ZlcnJpZGVzW0NBTV9TQ0VORV9NT0RFX01BWCAgKiAzXTsKKyAgICBtYWtlT3ZlcnJpZGVzTGlzdChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnNjZW5lX21vZGVfb3ZlcnJpZGVzLAorICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZF9zY2VuZV9tb2Rlc19jbnQsCisgICAgICAgICAgICAgICAgICAgICAgQ0FNX1NDRU5FX01PREVfTUFYLAorICAgICAgICAgICAgICAgICAgICAgIHNjZW5lX21vZGVfb3ZlcnJpZGVzLAorICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZF9pbmRleGVzLAorICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkKTsKKworICAgIGlmIChzdXBwb3J0ZWRfc2NlbmVfbW9kZXNfY250ID09IDApIHsKKyAgICAgICAgc3VwcG9ydGVkX3NjZW5lX21vZGVzX2NudCA9IDE7CisgICAgICAgIGF2YWlsX3NjZW5lX21vZGVzWzBdID0gQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRElTQUJMRUQ7CisgICAgfQorCisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfT1ZFUlJJREVTLAorICAgICAgICAgICAgc2NlbmVfbW9kZV9vdmVycmlkZXMsIHN1cHBvcnRlZF9zY2VuZV9tb2Rlc19jbnQgKiAzKTsKKworICAgIHVpbnQ4X3QgYXZhaWxhYmxlX2NvbnRyb2xfbW9kZXNbXSA9IHtBTkRST0lEX0NPTlRST0xfTU9ERV9PRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9NT0RFX0FVVE8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09OVFJPTF9NT0RFX1VTRV9TQ0VORV9NT0RFfTsKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX01PREVTLAorICAgICAgICAgICAgYXZhaWxhYmxlX2NvbnRyb2xfbW9kZXMsCisgICAgICAgICAgICAzKTsKKworICAgIHVpbnQ4X3QgYXZhaWxfYW50aWJhbmRpbmdfbW9kZXNbQ0FNX0FOVElCQU5ESU5HX01PREVfTUFYXTsKKyAgICBzaXplID0gMDsKKyAgICBjb3VudCA9IENBTV9BTlRJQkFORElOR19NT0RFX01BWDsKKyAgICBjb3VudCA9IE1JTihnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnN1cHBvcnRlZF9hbnRpYmFuZGluZ3NfY250LCBjb3VudCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGludCB2YWwgPSBsb29rdXBGd2tOYW1lKEFOVElCQU5ESU5HX01PREVTX01BUCwgTUVUQURBVEFfTUFQX1NJWkUoQU5USUJBTkRJTkdfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnN1cHBvcnRlZF9hbnRpYmFuZGluZ3NbaV0pOworICAgICAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gdmFsKSB7CisgICAgICAgICAgICBhdmFpbF9hbnRpYmFuZGluZ19tb2Rlc1tzaXplXSA9ICh1aW50OF90KXZhbDsKKyAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgfQorCisgICAgfQorICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9BVkFJTEFCTEVfQU5USUJBTkRJTkdfTU9ERVMsCisgICAgICAgICAgICAgICAgICAgICAgYXZhaWxfYW50aWJhbmRpbmdfbW9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICB1aW50OF90IGF2YWlsX2FiYmVyYXRpb25fbW9kZXNbXSA9IHsKKyAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX01PREVfT0ZGLAorICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERV9GQVNULAorICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERV9ISUdIX1FVQUxJVFl9OworICAgIGNvdW50ID0gQ0FNX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NQVg7CisgICAgY291bnQgPSBNSU4oZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5hYmVycmF0aW9uX21vZGVzX2NvdW50LCBjb3VudCk7CisgICAgaWYgKDAgPT0gY291bnQpIHsKKyAgICAgICAgLy8gIElmIG5vIGFiZXJyYXRpb24gY29ycmVjdGlvbiBtb2RlcyBhcmUgYXZhaWxhYmxlIGZvciBhIGRldmljZSwgdGhpcyBhZHZlcnRpc2UgT0ZGIG1vZGUKKyAgICAgICAgc2l6ZSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgY291bnQgaXMgbm90IHplcm8gdGhlbiBhdGxlYXN0IG9uZSBhbW9uZyB0aGUgRkFTVCBvciBISUdIIHF1YWxpdHkgaXMgc3VwcG9ydGVkCisgICAgICAgIC8vIFNvLCBhZHZlcnRpemUgYWxsIDMgbW9kZXMgaWYgYXRsZWFzdCBhbnkgb25lIG1vZGUgaXMgc3VwcG9ydGVkIGFzIHBlciB0aGUKKyAgICAgICAgLy8gbmV3IE0gcmVxdWlyZW1lbnQKKyAgICAgICAgc2l6ZSA9IDM7CisgICAgfQorICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9BVkFJTEFCTEVfQUJFUlJBVElPTl9NT0RFUywKKyAgICAgICAgICAgIGF2YWlsX2FiYmVyYXRpb25fbW9kZXMsCisgICAgICAgICAgICBzaXplKTsKKworICAgIHVpbnQ4X3QgYXZhaWxfYWZfbW9kZXNbQ0FNX0ZPQ1VTX01PREVfTUFYXTsKKyAgICBzaXplID0gMDsKKyAgICBjb3VudCA9IENBTV9GT0NVU19NT0RFX01BWDsKKyAgICBjb3VudCA9IE1JTihnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnN1cHBvcnRlZF9mb2N1c19tb2Rlc19jbnQsIGNvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaW50IHZhbCA9IGxvb2t1cEZ3a05hbWUoRk9DVVNfTU9ERVNfTUFQLCBNRVRBREFUQV9NQVBfU0laRShGT0NVU19NT0RFU19NQVApLAorICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c3VwcG9ydGVkX2ZvY3VzX21vZGVzW2ldKTsKKyAgICAgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IHZhbCkgeworICAgICAgICAgICAgYXZhaWxfYWZfbW9kZXNbc2l6ZV0gPSAodWludDhfdCl2YWw7CisgICAgICAgICAgICBzaXplKys7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FGX0FWQUlMQUJMRV9NT0RFUywKKyAgICAgICAgICAgICAgICAgICAgICBhdmFpbF9hZl9tb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKworICAgIHVpbnQ4X3QgYXZhaWxfYXdiX21vZGVzW0NBTV9XQl9NT0RFX01BWF07CisgICAgc2l6ZSA9IDA7CisgICAgY291bnQgPSBDQU1fV0JfTU9ERV9NQVg7CisgICAgY291bnQgPSBNSU4oZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zdXBwb3J0ZWRfd2hpdGVfYmFsYW5jZXNfY250LCBjb3VudCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGludCB2YWwgPSBsb29rdXBGd2tOYW1lKFdISVRFX0JBTEFOQ0VfTU9ERVNfTUFQLAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX01BUF9TSVpFKFdISVRFX0JBTEFOQ0VfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnN1cHBvcnRlZF93aGl0ZV9iYWxhbmNlc1tpXSk7CisgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKKyAgICAgICAgICAgIGF2YWlsX2F3Yl9tb2Rlc1tzaXplXSA9ICh1aW50OF90KXZhbDsKKyAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQVdCX0FWQUlMQUJMRV9NT0RFUywKKyAgICAgICAgICAgICAgICAgICAgICBhdmFpbF9hd2JfbW9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICB1aW50OF90IGF2YWlsYWJsZV9mbGFzaF9sZXZlbHNbQ0FNX0ZMQVNIX0ZJUklOR19MRVZFTF9NQVhdOworICAgIGNvdW50ID0gQ0FNX0ZMQVNIX0ZJUklOR19MRVZFTF9NQVg7CisgICAgY291bnQgPSBNSU4oZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zdXBwb3J0ZWRfZmxhc2hfZmlyaW5nX2xldmVsX2NudCwKKyAgICAgICAgICAgIGNvdW50KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgYXZhaWxhYmxlX2ZsYXNoX2xldmVsc1tpXSA9CisgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zdXBwb3J0ZWRfZmlyaW5nX2xldmVsc1tpXTsKKyAgICB9CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9GTEFTSF9GSVJJTkdfUE9XRVIsCisgICAgICAgICAgICBhdmFpbGFibGVfZmxhc2hfbGV2ZWxzLCBjb3VudCk7CisKKyAgICB1aW50OF90IGZsYXNoQXZhaWxhYmxlOworICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmZsYXNoX2F2YWlsYWJsZSkKKyAgICAgICAgZmxhc2hBdmFpbGFibGUgPSBBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFX1RSVUU7CisgICAgZWxzZQorICAgICAgICBmbGFzaEF2YWlsYWJsZSA9IEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEVfRkFMU0U7CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICZmbGFzaEF2YWlsYWJsZSwgMSk7CisKKyAgICBWZWN0b3I8dWludDhfdD4gYXZhaWxfYWVfbW9kZXM7CisgICAgY291bnQgPSBDQU1fQUVfTU9ERV9NQVg7CisgICAgY291bnQgPSBNSU4oZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zdXBwb3J0ZWRfYWVfbW9kZXNfY250LCBjb3VudCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGF2YWlsX2FlX21vZGVzLmFkZChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnN1cHBvcnRlZF9hZV9tb2Rlc1tpXSk7CisgICAgfQorICAgIGlmIChmbGFzaEF2YWlsYWJsZSkgeworICAgICAgICBhdmFpbF9hZV9tb2Rlcy5hZGQoQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT05fQVVUT19GTEFTSCk7CisgICAgICAgIGF2YWlsX2FlX21vZGVzLmFkZChBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTl9BTFdBWVNfRkxBU0gpOworICAgIH0KKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfQVZBSUxBQkxFX01PREVTLAorICAgICAgICAgICAgICAgICAgICAgIGF2YWlsX2FlX21vZGVzLmFycmF5KCksCisgICAgICAgICAgICAgICAgICAgICAgYXZhaWxfYWVfbW9kZXMuc2l6ZSgpKTsKKworICAgIGludDMyX3Qgc2Vuc2l0aXZpdHlfcmFuZ2VbMl07CisgICAgc2Vuc2l0aXZpdHlfcmFuZ2VbMF0gPSBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnNlbnNpdGl2aXR5X3JhbmdlLm1pbl9zZW5zaXRpdml0eTsKKyAgICBzZW5zaXRpdml0eV9yYW5nZVsxXSA9IGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c2Vuc2l0aXZpdHlfcmFuZ2UubWF4X3NlbnNpdGl2aXR5OworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0VOU09SX0lORk9fU0VOU0lUSVZJVFlfUkFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgc2Vuc2l0aXZpdHlfcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNlbnNpdGl2aXR5X3JhbmdlKSAvIHNpemVvZihpbnQzMl90KSk7CisKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9NQVhfQU5BTE9HX1NFTlNJVElWSVRZLAorICAgICAgICAgICAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPm1heF9hbmFsb2dfc2Vuc2l0aXZpdHksCisgICAgICAgICAgICAgICAgICAgICAgMSk7CisKKyAgICBpbnQzMl90IHNlbnNvcl9vcmllbnRhdGlvbiA9IChpbnQzMl90KWdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c2Vuc29yX21vdW50X2FuZ2xlOworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0VOU09SX09SSUVOVEFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICZzZW5zb3Jfb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgMSk7CisKKyAgICBpbnQzMl90IG1heF9vdXRwdXRfc3RyZWFtc1tdID0geworICAgICAgICAgICAgTUFYX1NUQUxMSU5HX1NUUkVBTVMsCisgICAgICAgICAgICBNQVhfUFJPQ0VTU0VEX1NUUkVBTVMsCisgICAgICAgICAgICBNQVhfUkFXX1NUUkVBTVN9OworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfUkVRVUVTVF9NQVhfTlVNX09VVFBVVF9TVFJFQU1TLAorICAgICAgICAgICAgbWF4X291dHB1dF9zdHJlYW1zLAorICAgICAgICAgICAgc2l6ZW9mKG1heF9vdXRwdXRfc3RyZWFtcykvc2l6ZW9mKG1heF9vdXRwdXRfc3RyZWFtc1swXSkpOworCisgICAgdWludDhfdCBhdmFpbF9sZWRzID0gMDsKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX0xFRF9BVkFJTEFCTEVfTEVEUywKKyAgICAgICAgICAgICAgICAgICAgICAmYXZhaWxfbGVkcywgMCk7CisKKyAgICB1aW50OF90IGZvY3VzX2Rpc3RfY2FsaWJyYXRlZDsKKyAgICBpbnQgdmFsID0gbG9va3VwRndrTmFtZShGT0NVU19DQUxJQlJBVElPTl9NQVAsIE1FVEFEQVRBX01BUF9TSVpFKEZPQ1VTX0NBTElCUkFUSU9OX01BUCksCisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmZvY3VzX2Rpc3RfY2FsaWJyYXRlZCk7CisgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IHZhbCkgeworICAgICAgICBmb2N1c19kaXN0X2NhbGlicmF0ZWQgPSAodWludDhfdCl2YWw7CisgICAgICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfTEVOU19JTkZPX0ZPQ1VTX0RJU1RBTkNFX0NBTElCUkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgJmZvY3VzX2Rpc3RfY2FsaWJyYXRlZCwgMSk7CisgICAgfQorCisgICAgaW50MzJfdCBhdmFpbF90ZXN0cGF0dGVybl9tb2Rlc1tNQVhfVEVTVF9QQVRURVJOX0NOVF07CisgICAgc2l6ZSA9IDA7CisgICAgY291bnQgPSBNSU4oZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zdXBwb3J0ZWRfdGVzdF9wYXR0ZXJuX21vZGVzX2NudCwKKyAgICAgICAgICAgIE1BWF9URVNUX1BBVFRFUk5fQ05UKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaW50IHRlc3RwYXR0ZXJuTW9kZSA9IGxvb2t1cEZ3a05hbWUoVEVTVF9QQVRURVJOX01BUCwgTUVUQURBVEFfTUFQX1NJWkUoVEVTVF9QQVRURVJOX01BUCksCisgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zdXBwb3J0ZWRfdGVzdF9wYXR0ZXJuX21vZGVzW2ldKTsKKyAgICAgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IHRlc3RwYXR0ZXJuTW9kZSkgeworICAgICAgICAgICAgYXZhaWxfdGVzdHBhdHRlcm5fbW9kZXNbc2l6ZV0gPSB0ZXN0cGF0dGVybk1vZGU7CisgICAgICAgICAgICBzaXplKys7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfQVZBSUxBQkxFX1RFU1RfUEFUVEVSTl9NT0RFUywKKyAgICAgICAgICAgICAgICAgICAgICBhdmFpbF90ZXN0cGF0dGVybl9tb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKworICAgIHVpbnQ4X3QgbWF4X3BpcGVsaW5lX2RlcHRoID0gKHVpbnQ4X3QpKE1BWF9JTkZMSUdIVF9SRVFVRVNUUyArIEVNUFRZX1BJUEVMSU5FX0RFTEFZICsgRlJBTUVfU0tJUF9ERUxBWSk7CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX1BJUEVMSU5FX01BWF9ERVBUSCwKKyAgICAgICAgICAgICAgICAgICAgICAmbWF4X3BpcGVsaW5lX2RlcHRoLAorICAgICAgICAgICAgICAgICAgICAgIDEpOworCisgICAgaW50MzJfdCBwYXJ0aWFsX3Jlc3VsdF9jb3VudCA9IFBBUlRJQUxfUkVTVUxUX0NPVU5UOworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfUkVRVUVTVF9QQVJUSUFMX1JFU1VMVF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAmcGFydGlhbF9yZXN1bHRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgIDEpOworCisgICAgaW50MzJfdCBtYXhfc3RhbGxfZHVyYXRpb24gPSBNQVhfUkVQUk9DRVNTX1NUQUxMOworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfUkVQUk9DRVNTX01BWF9DQVBUVVJFX1NUQUxMLCAmbWF4X3N0YWxsX2R1cmF0aW9uLCAxKTsKKworICAgIFZlY3Rvcjx1aW50OF90PiBhdmFpbGFibGVfY2FwYWJpbGl0aWVzOworICAgIGF2YWlsYWJsZV9jYXBhYmlsaXRpZXMuYWRkKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0JBQ0tXQVJEX0NPTVBBVElCTEUpOworICAgIGF2YWlsYWJsZV9jYXBhYmlsaXRpZXMuYWRkKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01BTlVBTF9TRU5TT1IpOworICAgIGF2YWlsYWJsZV9jYXBhYmlsaXRpZXMuYWRkKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01BTlVBTF9QT1NUX1BST0NFU1NJTkcpOworICAgIGF2YWlsYWJsZV9jYXBhYmlsaXRpZXMuYWRkKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1JFQURfU0VOU09SX1NFVFRJTkdTKTsKKyAgICBpZiAoc3VwcG9ydEJ1cnN0KSB7CisgICAgICAgIGF2YWlsYWJsZV9jYXBhYmlsaXRpZXMuYWRkKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0JVUlNUX0NBUFRVUkUpOworICAgIH0KKyAgICBhdmFpbGFibGVfY2FwYWJpbGl0aWVzLmFkZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19QUklWQVRFX1JFUFJPQ0VTU0lORyk7CisgICAgYXZhaWxhYmxlX2NhcGFiaWxpdGllcy5hZGQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfWVVWX1JFUFJPQ0VTU0lORyk7CisgICAgaWYgKGhmckVuYWJsZSAmJiBhdmFpbGFibGVfaGZyX2NvbmZpZ3MuYXJyYXkoKSkgeworICAgICAgICBhdmFpbGFibGVfY2FwYWJpbGl0aWVzLmFkZCgKKyAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19DT05TVFJBSU5FRF9ISUdIX1NQRUVEX1ZJREVPKTsKKyAgICB9CisKKyAgICBpZiAoQ0FNX1NFTlNPUl9ZVVYgIT0gZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zZW5zb3JfdHlwZS5zZW5zX3R5cGUpIHsKKyAgICAgICAgYXZhaWxhYmxlX2NhcGFiaWxpdGllcy5hZGQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfUkFXKTsKKyAgICB9CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMsCisgICAgICAgICAgICBhdmFpbGFibGVfY2FwYWJpbGl0aWVzLmFycmF5KCksCisgICAgICAgICAgICBhdmFpbGFibGVfY2FwYWJpbGl0aWVzLnNpemUoKSk7CisKKyAgICAvL2FlTG9ja0F2YWlsYWJsZSB0byBiZSBzZXQgdG8gdHJ1ZSBpZiBjYXBhYmlsaXRpZXMgaGFzIE1BTlVBTF9TRU5TT1Igb3IgQlVSU1RfQ0FQVFVSRQorICAgIC8vQXNzdW1wdGlvbiBpcyB0aGF0IGFsbCBiYXllciBjYW1lcmFzIHN1cHBvcnQgTUFOVUFMX1NFTlNPUi4KKyAgICB1aW50OF90IGFlTG9ja0F2YWlsYWJsZSA9IChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnNlbnNvcl90eXBlLnNlbnNfdHlwZSA9PSBDQU1fU0VOU09SX1JBVykgPworICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX0FFX0xPQ0tfQVZBSUxBQkxFX1RSVUUgOiBBTkRST0lEX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEVfRkFMU0U7CisKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEUsCisgICAgICAgICAgICAmYWVMb2NrQXZhaWxhYmxlLCAxKTsKKworICAgIC8vYXdiTG9ja0F2YWlsYWJsZSB0byBiZSBzZXQgdG8gdHJ1ZSBpZiBjYXBhYmlsaXRpZXMgaGFzIE1BTlVBTF9QT1NUX1BST0NFU1NJTkcgb3IKKyAgICAvL0JVUlNUX0NBUFRVUkUuIEFzc3VtcHRpb24gaXMgdGhhdCBhbGwgYmF5ZXIgY2FtZXJhcyBzdXBwb3J0IE1BTlVBTF9QT1NUX1BST0NFU1NJTkcuCisgICAgdWludDhfdCBhd2JMb2NrQXZhaWxhYmxlID0gKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c2Vuc29yX3R5cGUuc2Vuc190eXBlID09IENBTV9TRU5TT1JfUkFXKSA/CisgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQVdCX0xPQ0tfQVZBSUxBQkxFX1RSVUUgOiBBTkRST0lEX0NPTlRST0xfQVdCX0xPQ0tfQVZBSUxBQkxFX0ZBTFNFOworCisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FXQl9MT0NLX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICZhd2JMb2NrQXZhaWxhYmxlLCAxKTsKKworICAgIGludDMyX3QgbWF4X2lucHV0X3N0cmVhbXMgPSAxOworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfUkVRVUVTVF9NQVhfTlVNX0lOUFVUX1NUUkVBTVMsCisgICAgICAgICAgICAgICAgICAgICAgJm1heF9pbnB1dF9zdHJlYW1zLAorICAgICAgICAgICAgICAgICAgICAgIDEpOworCisgICAgLyogZm9ybWF0IG9mIHRoZSBtYXAgaXMgOiBpbnB1dCBmb3JtYXQsIG51bV9vdXRwdXRfZm9ybWF0cywgb3V0cHV0Rm9ybWF0MSwuLixvdXRwdXRGb3JtYXROICovCisgICAgaW50MzJfdCBpb19mb3JtYXRfbWFwW10gPSB7SEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELCAyLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgsIDIsIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OH07CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0lOUFVUX09VVFBVVF9GT1JNQVRTX01BUCwKKyAgICAgICAgICAgICAgICAgICAgICBpb19mb3JtYXRfbWFwLCBzaXplb2YoaW9fZm9ybWF0X21hcCkvc2l6ZW9mKGlvX2Zvcm1hdF9tYXBbMF0pKTsKKworICAgIGludDMyX3QgbWF4X2xhdGVuY3kgPSBBTkRST0lEX1NZTkNfTUFYX0xBVEVOQ1lfUEVSX0ZSQU1FX0NPTlRST0w7CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TWU5DX01BWF9MQVRFTkNZLAorICAgICAgICAgICAgICAgICAgICAgICZtYXhfbGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAxKTsKKworI2lmbmRlZiBVU0VfSEFMXzNfMworICAgIGludDMyX3QgaXNwX3NlbnNpdGl2aXR5X3JhbmdlWzJdOworICAgIGlzcF9zZW5zaXRpdml0eV9yYW5nZVswXSA9CisgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+aXNwX3NlbnNpdGl2aXR5X3JhbmdlLm1pbl9zZW5zaXRpdml0eTsKKyAgICBpc3Bfc2Vuc2l0aXZpdHlfcmFuZ2VbMV0gPQorICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmlzcF9zZW5zaXRpdml0eV9yYW5nZS5tYXhfc2Vuc2l0aXZpdHk7CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NUX1JBTkdFLAorICAgICAgICAgICAgICAgICAgICAgIGlzcF9zZW5zaXRpdml0eV9yYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaXNwX3NlbnNpdGl2aXR5X3JhbmdlKSAvIHNpemVvZihpc3Bfc2Vuc2l0aXZpdHlfcmFuZ2VbMF0pKTsKKyNlbmRpZgorCisgICAgdWludDhfdCBhdmFpbGFibGVfaG90X3BpeGVsX21vZGVzW10gPSB7QU5EUk9JRF9IT1RfUElYRUxfTU9ERV9GQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfSE9UX1BJWEVMX01PREVfSElHSF9RVUFMSVRZfTsKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX0hPVF9QSVhFTF9BVkFJTEFCTEVfSE9UX1BJWEVMX01PREVTLAorICAgICAgICAgICAgYXZhaWxhYmxlX2hvdF9waXhlbF9tb2RlcywKKyAgICAgICAgICAgIHNpemVvZihhdmFpbGFibGVfaG90X3BpeGVsX21vZGVzKS9zaXplb2YoYXZhaWxhYmxlX2hvdF9waXhlbF9tb2Rlc1swXSkpOworCisgICAgdWludDhfdCBhdmFpbGFibGVfc2hhZGluZ19tb2Rlc1tdID0ge0FORFJPSURfU0hBRElOR19NT0RFX09GRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TSEFESU5HX01PREVfRkFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TSEFESU5HX01PREVfSElHSF9RVUFMSVRZfTsKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX1NIQURJTkdfQVZBSUxBQkxFX01PREVTLAorICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9zaGFkaW5nX21vZGVzLAorICAgICAgICAgICAgICAgICAgICAgIDMpOworCisgICAgdWludDhfdCBhdmFpbGFibGVfbGVuc19zaGFkaW5nX21hcF9tb2Rlc1tdID0ge0FORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREVfT0ZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUF9NT0RFX09OfTsKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19BVkFJTEFCTEVfTEVOU19TSEFESU5HX01BUF9NT0RFUywKKyAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVfbGVuc19zaGFkaW5nX21hcF9tb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAyKTsKKworICAgIHVpbnQ4X3QgYXZhaWxhYmxlX2VkZ2VfbW9kZXNbXSA9IHtBTkRST0lEX0VER0VfTU9ERV9PRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfRURHRV9NT0RFX0ZBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfRURHRV9NT0RFX0hJR0hfUVVBTElUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9FREdFX01PREVfWkVST19TSFVUVEVSX0xBR307CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9FREdFX0FWQUlMQUJMRV9FREdFX01PREVTLAorICAgICAgICAgICAgYXZhaWxhYmxlX2VkZ2VfbW9kZXMsCisgICAgICAgICAgICBzaXplb2YoYXZhaWxhYmxlX2VkZ2VfbW9kZXMpL3NpemVvZihhdmFpbGFibGVfZWRnZV9tb2Rlc1swXSkpOworCisgICAgdWludDhfdCBhdmFpbGFibGVfbm9pc2VfcmVkX21vZGVzW10gPSB7QU5EUk9JRF9OT0lTRV9SRURVQ1RJT05fTU9ERV9PRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9OT0lTRV9SRURVQ1RJT05fTU9ERV9GQVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfTk9JU0VfUkVEVUNUSU9OX01PREVfSElHSF9RVUFMSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfTk9JU0VfUkVEVUNUSU9OX01PREVfTUlOSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX05PSVNFX1JFRFVDVElPTl9NT0RFX1pFUk9fU0hVVFRFUl9MQUd9OworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfTk9JU0VfUkVEVUNUSU9OX0FWQUlMQUJMRV9OT0lTRV9SRURVQ1RJT05fTU9ERVMsCisgICAgICAgICAgICBhdmFpbGFibGVfbm9pc2VfcmVkX21vZGVzLAorICAgICAgICAgICAgc2l6ZW9mKGF2YWlsYWJsZV9ub2lzZV9yZWRfbW9kZXMpL3NpemVvZihhdmFpbGFibGVfbm9pc2VfcmVkX21vZGVzWzBdKSk7CisKKyAgICB1aW50OF90IGF2YWlsYWJsZV90b25lbWFwX21vZGVzW10gPSB7QU5EUk9JRF9UT05FTUFQX01PREVfQ09OVFJBU1RfQ1VSVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfVE9ORU1BUF9NT0RFX0ZBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfVE9ORU1BUF9NT0RFX0hJR0hfUVVBTElUWX07CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9UT05FTUFQX0FWQUlMQUJMRV9UT05FX01BUF9NT0RFUywKKyAgICAgICAgICAgIGF2YWlsYWJsZV90b25lbWFwX21vZGVzLAorICAgICAgICAgICAgc2l6ZW9mKGF2YWlsYWJsZV90b25lbWFwX21vZGVzKS9zaXplb2YoYXZhaWxhYmxlX3RvbmVtYXBfbW9kZXNbMF0pKTsKKworICAgIHVpbnQ4X3QgYXZhaWxhYmxlX2hvdF9waXhlbF9tYXBfbW9kZXNbXSA9IHtBTkRST0lEX1NUQVRJU1RJQ1NfSE9UX1BJWEVMX01BUF9NT0RFX09GRn07CisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fQVZBSUxBQkxFX0hPVF9QSVhFTF9NQVBfTU9ERVMsCisgICAgICAgICAgICBhdmFpbGFibGVfaG90X3BpeGVsX21hcF9tb2RlcywKKyAgICAgICAgICAgIHNpemVvZihhdmFpbGFibGVfaG90X3BpeGVsX21hcF9tb2Rlcykvc2l6ZW9mKGF2YWlsYWJsZV9ob3RfcGl4ZWxfbWFwX21vZGVzWzBdKSk7CisKKyAgICB2YWwgPSBsb29rdXBGd2tOYW1lKFJFRkVSRU5DRV9JTExVTUlOQU5UX01BUCwgTUVUQURBVEFfTUFQX1NJWkUoUkVGRVJFTkNFX0lMTFVNSU5BTlRfTUFQKSwKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cmVmZXJlbmNlX2lsbHVtaW5hbnQxKTsKKyAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gdmFsKSB7CisgICAgICAgIHVpbnQ4X3QgZndrUmVmZXJlbmNlSWxsdW1pbmFudCA9ICh1aW50OF90KXZhbDsKKyAgICAgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxLCAmZndrUmVmZXJlbmNlSWxsdW1pbmFudCwgMSk7CisgICAgfQorCisgICAgdmFsID0gbG9va3VwRndrTmFtZShSRUZFUkVOQ0VfSUxMVU1JTkFOVF9NQVAsIE1FVEFEQVRBX01BUF9TSVpFKFJFRkVSRU5DRV9JTExVTUlOQU5UX01BUCksCisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnJlZmVyZW5jZV9pbGx1bWluYW50Mik7CisgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IHZhbCkgeworICAgICAgICB1aW50OF90IGZ3a1JlZmVyZW5jZUlsbHVtaW5hbnQgPSAodWludDhfdCl2YWw7CisgICAgICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMiwgJmZ3a1JlZmVyZW5jZUlsbHVtaW5hbnQsIDEpOworICAgIH0KKworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0VOU09SX0ZPUldBUkRfTUFUUklYMSwgKGNhbWVyYV9tZXRhZGF0YV9yYXRpb25hbF90ICopCisgICAgICAgICAgICAodm9pZCAqKWdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+Zm9yd2FyZF9tYXRyaXgxLAorICAgICAgICAgICAgRk9SV0FSRF9NQVRSSVhfQ09MUyAqIEZPUldBUkRfTUFUUklYX1JPV1MpOworCisgICAgc3RhdGljSW5mby51cGRhdGUoQU5EUk9JRF9TRU5TT1JfRk9SV0FSRF9NQVRSSVgyLCAoY2FtZXJhX21ldGFkYXRhX3JhdGlvbmFsX3QgKikKKyAgICAgICAgICAgICh2b2lkICopZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5mb3J3YXJkX21hdHJpeDIsCisgICAgICAgICAgICBGT1JXQVJEX01BVFJJWF9DT0xTICogRk9SV0FSRF9NQVRSSVhfUk9XUyk7CisKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xLCAoY2FtZXJhX21ldGFkYXRhX3JhdGlvbmFsX3QgKikKKyAgICAgICAgICAgICh2b2lkICopZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5jb2xvcl90cmFuc2Zvcm0xLAorICAgICAgICAgICAgQ09MT1JfVFJBTlNGT1JNX0NPTFMgKiBDT0xPUl9UUkFOU0ZPUk1fUk9XUyk7CisKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0yLCAoY2FtZXJhX21ldGFkYXRhX3JhdGlvbmFsX3QgKikKKyAgICAgICAgICAgICh2b2lkICopZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5jb2xvcl90cmFuc2Zvcm0yLAorICAgICAgICAgICAgQ09MT1JfVFJBTlNGT1JNX0NPTFMgKiBDT0xPUl9UUkFOU0ZPUk1fUk9XUyk7CisKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0xLCAoY2FtZXJhX21ldGFkYXRhX3JhdGlvbmFsX3QgKikKKyAgICAgICAgICAgICh2b2lkICopZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5jYWxpYnJhdGlvbl90cmFuc2Zvcm0xLAorICAgICAgICAgICAgQ0FMX1RSQU5TRk9STV9DT0xTICogQ0FMX1RSQU5TRk9STV9ST1dTKTsKKworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTIsIChjYW1lcmFfbWV0YWRhdGFfcmF0aW9uYWxfdCAqKQorICAgICAgICAgICAgKHZvaWQgKilnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmNhbGlicmF0aW9uX3RyYW5zZm9ybTIsCisgICAgICAgICAgICBDQUxfVFJBTlNGT1JNX0NPTFMgKiBDQUxfVFJBTlNGT1JNX1JPV1MpOworCisgICAgaW50MzJfdCByZXF1ZXN0X2tleXNfYmFzaWNbXSA9IHtBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSwKKyAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNLCBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fR0FJTlMsCisgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERSwKKyAgICAgICBBTkRST0lEX0NPTlRST0xfQUVfQU5USUJBTkRJTkdfTU9ERSwgQU5EUk9JRF9DT05UUk9MX0FFX0VYUE9TVVJFX0NPTVBFTlNBVElPTiwKKyAgICAgICBBTkRST0lEX0NPTlRST0xfQUVfTE9DSywgQU5EUk9JRF9DT05UUk9MX0FFX01PREUsCisgICAgICAgQU5EUk9JRF9DT05UUk9MX0FFX1JFR0lPTlMsIEFORFJPSURfQ09OVFJPTF9BRV9UQVJHRVRfRlBTX1JBTkdFLAorICAgICAgIEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAorICAgICAgIEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSLCBBTkRST0lEX0NPTlRST0xfQVdCX0xPQ0ssCisgICAgICAgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLCBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQsCisgICAgICAgQU5EUk9JRF9DT05UUk9MX0VGRkVDVF9NT0RFLCBBTkRST0lEX0NPTlRST0xfTU9ERSwKKyAgICAgICBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERSwgQU5EUk9JRF9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERSwKKyAgICAgICBBTkRST0lEX0RFTU9TQUlDX01PREUsIEFORFJPSURfRURHRV9NT0RFLAorICAgICAgIEFORFJPSURfRkxBU0hfRklSSU5HX1BPV0VSLCBBTkRST0lEX0ZMQVNIX0ZJUklOR19USU1FLCBBTkRST0lEX0ZMQVNIX01PREUsCisgICAgICAgQU5EUk9JRF9KUEVHX0dQU19DT09SRElOQVRFUywKKyAgICAgICBBTkRST0lEX0pQRUdfR1BTX1BST0NFU1NJTkdfTUVUSE9ELCBBTkRST0lEX0pQRUdfR1BTX1RJTUVTVEFNUCwKKyAgICAgICBBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04sIEFORFJPSURfSlBFR19RVUFMSVRZLCBBTkRST0lEX0pQRUdfVEhVTUJOQUlMX1FVQUxJVFksCisgICAgICAgQU5EUk9JRF9KUEVHX1RIVU1CTkFJTF9TSVpFLCBBTkRST0lEX0xFTlNfQVBFUlRVUkUsIEFORFJPSURfTEVOU19GSUxURVJfREVOU0lUWSwKKyAgICAgICBBTkRST0lEX0xFTlNfRk9DQUxfTEVOR1RILCBBTkRST0lEX0xFTlNfRk9DVVNfRElTVEFOQ0UsCisgICAgICAgQU5EUk9JRF9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFLCBBTkRST0lEX05PSVNFX1JFRFVDVElPTl9NT0RFLAorICAgICAgIEFORFJPSURfUkVRVUVTVF9JRCwgQU5EUk9JRF9SRVFVRVNUX1RZUEUsCisgICAgICAgQU5EUk9JRF9TQ0FMRVJfQ1JPUF9SRUdJT04sIEFORFJPSURfU0VOU09SX0VYUE9TVVJFX1RJTUUsCisgICAgICAgQU5EUk9JRF9TRU5TT1JfRlJBTUVfRFVSQVRJT04sIEFORFJPSURfSE9UX1BJWEVMX01PREUsCisgICAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0hPVF9QSVhFTF9NQVBfTU9ERSwKKyAgICAgICBBTkRST0lEX1NFTlNPUl9TRU5TSVRJVklUWSwgQU5EUk9JRF9TSEFESU5HX01PREUsCisjaWZuZGVmIFVTRV9IQUxfM18zCisgICAgICAgQU5EUk9JRF9DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NULAorI2VuZGlmCisgICAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0ZBQ0VfREVURUNUX01PREUsCisgICAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0hJU1RPR1JBTV9NT0RFLCBBTkRST0lEX1NUQVRJU1RJQ1NfU0hBUlBORVNTX01BUF9NT0RFLAorICAgICAgIEFORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREUsIEFORFJPSURfVE9ORU1BUF9DVVJWRV9CTFVFLAorICAgICAgIEFORFJPSURfVE9ORU1BUF9DVVJWRV9HUkVFTiwgQU5EUk9JRF9UT05FTUFQX0NVUlZFX1JFRCwgQU5EUk9JRF9UT05FTUFQX01PREUsCisgICAgICAgQU5EUk9JRF9CTEFDS19MRVZFTF9MT0NLIH07CisKKyAgICBzaXplX3QgcmVxdWVzdF9rZXlzX2NudCA9CisgICAgICAgICAgICBzaXplb2YocmVxdWVzdF9rZXlzX2Jhc2ljKS9zaXplb2YocmVxdWVzdF9rZXlzX2Jhc2ljWzBdKTsKKyAgICBWZWN0b3I8aW50MzJfdD4gYXZhaWxhYmxlX3JlcXVlc3Rfa2V5czsKKyAgICBhdmFpbGFibGVfcmVxdWVzdF9rZXlzLmFwcGVuZEFycmF5KHJlcXVlc3Rfa2V5c19iYXNpYywgcmVxdWVzdF9rZXlzX2NudCk7CisgICAgaWYgKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c3VwcG9ydGVkX2ZvY3VzX21vZGVzX2NudCA+IDEpIHsKKyAgICAgICAgYXZhaWxhYmxlX3JlcXVlc3Rfa2V5cy5hZGQoQU5EUk9JRF9DT05UUk9MX0FGX1JFR0lPTlMpOworICAgIH0KKworICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTLAorICAgICAgICAgICAgYXZhaWxhYmxlX3JlcXVlc3Rfa2V5cy5hcnJheSgpLCBhdmFpbGFibGVfcmVxdWVzdF9rZXlzLnNpemUoKSk7CisKKyAgICBpbnQzMl90IHJlc3VsdF9rZXlzX2Jhc2ljW10gPSB7QU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSwKKyAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fR0FJTlMsIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFLCBBTkRST0lEX0NPTlRST0xfQUVfUkVHSU9OUywKKyAgICAgICBBTkRST0lEX0NPTlRST0xfQUVfU1RBVEUsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAorICAgICAgIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAorICAgICAgIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsIEFORFJPSURfQ09OVFJPTF9NT0RFLCBBTkRST0lEX0VER0VfTU9ERSwKKyAgICAgICBBTkRST0lEX0ZMQVNIX0ZJUklOR19QT1dFUiwgQU5EUk9JRF9GTEFTSF9GSVJJTkdfVElNRSwgQU5EUk9JRF9GTEFTSF9NT0RFLAorICAgICAgIEFORFJPSURfRkxBU0hfU1RBVEUsIEFORFJPSURfSlBFR19HUFNfQ09PUkRJTkFURVMsIEFORFJPSURfSlBFR19HUFNfUFJPQ0VTU0lOR19NRVRIT0QsCisgICAgICAgQU5EUk9JRF9KUEVHX0dQU19USU1FU1RBTVAsIEFORFJPSURfSlBFR19PUklFTlRBVElPTiwgQU5EUk9JRF9KUEVHX1FVQUxJVFksCisgICAgICAgQU5EUk9JRF9KUEVHX1RIVU1CTkFJTF9RVUFMSVRZLCBBTkRST0lEX0pQRUdfVEhVTUJOQUlMX1NJWkUsIEFORFJPSURfTEVOU19BUEVSVFVSRSwKKyAgICAgICBBTkRST0lEX0xFTlNfRklMVEVSX0RFTlNJVFksIEFORFJPSURfTEVOU19GT0NBTF9MRU5HVEgsIEFORFJPSURfTEVOU19GT0NVU19ESVNUQU5DRSwKKyAgICAgICBBTkRST0lEX0xFTlNfRk9DVVNfUkFOR0UsIEFORFJPSURfTEVOU19TVEFURSwgQU5EUk9JRF9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFLAorICAgICAgIEFORFJPSURfTk9JU0VfUkVEVUNUSU9OX01PREUsIEFORFJPSURfUkVRVUVTVF9JRCwKKyAgICAgICBBTkRST0lEX1NDQUxFUl9DUk9QX1JFR0lPTiwgQU5EUk9JRF9TSEFESU5HX01PREUsIEFORFJPSURfU0VOU09SX0VYUE9TVVJFX1RJTUUsCisgICAgICAgQU5EUk9JRF9TRU5TT1JfRlJBTUVfRFVSQVRJT04sIEFORFJPSURfU0VOU09SX1NFTlNJVElWSVRZLAorICAgICAgIEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCwgQU5EUk9JRF9TRU5TT1JfTkVVVFJBTF9DT0xPUl9QT0lOVCwKKyAgICAgICBBTkRST0lEX1NFTlNPUl9QUk9GSUxFX1RPTkVfQ1VSVkUsIEFORFJPSURfQkxBQ0tfTEVWRUxfTE9DSywgQU5EUk9JRF9UT05FTUFQX0NVUlZFX0JMVUUsCisgICAgICAgQU5EUk9JRF9UT05FTUFQX0NVUlZFX0dSRUVOLCBBTkRST0lEX1RPTkVNQVBfQ1VSVkVfUkVELCBBTkRST0lEX1RPTkVNQVBfTU9ERSwKKyAgICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfRkFDRV9ERVRFQ1RfTU9ERSwgQU5EUk9JRF9TVEFUSVNUSUNTX0hJU1RPR1JBTV9NT0RFLAorICAgICAgIEFORFJPSURfU1RBVElTVElDU19TSEFSUE5FU1NfTUFQLCBBTkRST0lEX1NUQVRJU1RJQ1NfU0hBUlBORVNTX01BUF9NT0RFLAorICAgICAgIEFORFJPSURfU1RBVElTVElDU19QUkVESUNURURfQ09MT1JfR0FJTlMsIEFORFJPSURfU1RBVElTVElDU19QUkVESUNURURfQ09MT1JfVFJBTlNGT1JNLAorICAgICAgIEFORFJPSURfU1RBVElTVElDU19TQ0VORV9GTElDS0VSLCBBTkRST0lEX1NUQVRJU1RJQ1NfRkFDRV9SRUNUQU5HTEVTLAorICAgICAgIEFORFJPSURfU1RBVElTVElDU19GQUNFX1NDT1JFUywKKyNpZm5kZWYgVVNFX0hBTF8zXzMKKyAgICAgICBBTkRST0lEX0NPTlRST0xfUE9TVF9SQVdfU0VOU0lUSVZJVFlfQk9PU1QsCisjZW5kaWYKKyAgICAgICB9OworCisgICAgc2l6ZV90IHJlc3VsdF9rZXlzX2NudCA9CisgICAgICAgICAgICBzaXplb2YocmVzdWx0X2tleXNfYmFzaWMpL3NpemVvZihyZXN1bHRfa2V5c19iYXNpY1swXSk7CisKKyAgICBWZWN0b3I8aW50MzJfdD4gYXZhaWxhYmxlX3Jlc3VsdF9rZXlzOworICAgIGF2YWlsYWJsZV9yZXN1bHRfa2V5cy5hcHBlbmRBcnJheShyZXN1bHRfa2V5c19iYXNpYywgcmVzdWx0X2tleXNfY250KTsKKyAgICBpZiAoZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zdXBwb3J0ZWRfZm9jdXNfbW9kZXNfY250ID4gMSkgeworICAgICAgICBhdmFpbGFibGVfcmVzdWx0X2tleXMuYWRkKEFORFJPSURfQ09OVFJPTF9BRl9SRUdJT05TKTsKKyAgICB9CisgICAgaWYgKENBTV9TRU5TT1JfUkFXID09IGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c2Vuc29yX3R5cGUuc2Vuc190eXBlKSB7CisgICAgICAgIGF2YWlsYWJsZV9yZXN1bHRfa2V5cy5hZGQoQU5EUk9JRF9TRU5TT1JfTk9JU0VfUFJPRklMRSk7CisgICAgICAgIGF2YWlsYWJsZV9yZXN1bHRfa2V5cy5hZGQoQU5EUk9JRF9TRU5TT1JfR1JFRU5fU1BMSVQpOworICAgIH0KKyAgICBpZiAoc3VwcG9ydGVkRmFjZURldGVjdE1vZGUgPT0gMSkgeworICAgICAgICBhdmFpbGFibGVfcmVzdWx0X2tleXMuYWRkKEFORFJPSURfU1RBVElTVElDU19GQUNFX1JFQ1RBTkdMRVMpOworICAgICAgICBhdmFpbGFibGVfcmVzdWx0X2tleXMuYWRkKEFORFJPSURfU1RBVElTVElDU19GQUNFX1NDT1JFUyk7CisgICAgfSBlbHNlIGlmICgoc3VwcG9ydGVkRmFjZURldGVjdE1vZGUgPT0gMikgfHwKKyAgICAgICAgICAgIChzdXBwb3J0ZWRGYWNlRGV0ZWN0TW9kZSA9PSAzKSkgeworICAgICAgICBhdmFpbGFibGVfcmVzdWx0X2tleXMuYWRkKEFORFJPSURfU1RBVElTVElDU19GQUNFX0lEUyk7CisgICAgICAgIGF2YWlsYWJsZV9yZXN1bHRfa2V5cy5hZGQoQU5EUk9JRF9TVEFUSVNUSUNTX0ZBQ0VfTEFORE1BUktTKTsKKyAgICB9CisjaWZuZGVmIFVTRV9IQUxfM18zCisgICAgaWYgKGhhc0JsYWNrUmVnaW9ucykgeworICAgICAgICBhdmFpbGFibGVfcmVzdWx0X2tleXMuYWRkKEFORFJPSURfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwpOworICAgICAgICBhdmFpbGFibGVfcmVzdWx0X2tleXMuYWRkKEFORFJPSURfU0VOU09SX0RZTkFNSUNfV0hJVEVfTEVWRUwpOworICAgIH0KKyNlbmRpZgorICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMsCisgICAgICAgICAgICBhdmFpbGFibGVfcmVzdWx0X2tleXMuYXJyYXkoKSwgYXZhaWxhYmxlX3Jlc3VsdF9rZXlzLnNpemUoKSk7CisKKyAgICBpbnQzMl90IGNoYXJhY3RlcmlzdGljc19rZXlzX2Jhc2ljW10gPSB7QU5EUk9JRF9DT05UUk9MX0FFX0FWQUlMQUJMRV9BTlRJQkFORElOR19NT0RFUywKKyAgICAgICBBTkRST0lEX0NPTlRST0xfQUVfQVZBSUxBQkxFX01PREVTLCBBTkRST0lEX0NPTlRST0xfQUVfQVZBSUxBQkxFX1RBUkdFVF9GUFNfUkFOR0VTLAorICAgICAgIEFORFJPSURfQ09OVFJPTF9BRV9DT01QRU5TQVRJT05fUkFOR0UsIEFORFJPSURfQ09OVFJPTF9BRV9DT01QRU5TQVRJT05fU1RFUCwKKyAgICAgICBBTkRST0lEX0NPTlRST0xfQUZfQVZBSUxBQkxFX01PREVTLCBBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX0VGRkVDVFMsCisgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FWQUlMQUJMRV9BQkVSUkFUSU9OX01PREVTLAorICAgICAgIEFORFJPSURfU0NBTEVSX0NST1BQSU5HX1RZUEUsCisgICAgICAgQU5EUk9JRF9TWU5DX01BWF9MQVRFTkNZLAorICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fVElNRVNUQU1QX1NPVVJDRSwKKyAgICAgICBBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX1NDRU5FX01PREVTLAorICAgICAgIEFORFJPSURfQ09OVFJPTF9BVkFJTEFCTEVfVklERU9fU1RBQklMSVpBVElPTl9NT0RFUywKKyAgICAgICBBTkRST0lEX0NPTlRST0xfQVdCX0FWQUlMQUJMRV9NT0RFUywgQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLAorICAgICAgIEFORFJPSURfQ09OVFJPTF9TQ0VORV9NT0RFX09WRVJSSURFUyxBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFLAorICAgICAgIEFORFJPSURfRkxBU0hfSU5GT19DSEFSR0VfRFVSQVRJT04sIEFORFJPSURfSlBFR19BVkFJTEFCTEVfVEhVTUJOQUlMX1NJWkVTLAorICAgICAgIEFORFJPSURfSlBFR19NQVhfU0laRSwgQU5EUk9JRF9MRU5TX0lORk9fQVZBSUxBQkxFX0FQRVJUVVJFUywKKyAgICAgICBBTkRST0lEX0xFTlNfSU5GT19BVkFJTEFCTEVfRklMVEVSX0RFTlNJVElFUywKKyAgICAgICBBTkRST0lEX0xFTlNfSU5GT19BVkFJTEFCTEVfRk9DQUxfTEVOR1RIUywKKyAgICAgICBBTkRST0lEX0xFTlNfSU5GT19BVkFJTEFCTEVfT1BUSUNBTF9TVEFCSUxJWkFUSU9OLAorICAgICAgIEFORFJPSURfTEVOU19JTkZPX0hZUEVSRk9DQUxfRElTVEFOQ0UsIEFORFJPSURfTEVOU19JTkZPX01JTklNVU1fRk9DVVNfRElTVEFOQ0UsCisgICAgICAgQU5EUk9JRF9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSwgQU5EUk9JRF9MRU5TX0lORk9fRk9DVVNfRElTVEFOQ0VfQ0FMSUJSQVRJT04sCisgICAgICAgQU5EUk9JRF9MRU5TX0ZBQ0lORywKKyAgICAgICBBTkRST0lEX1JFUVVFU1RfTUFYX05VTV9PVVRQVVRfU1RSRUFNUywgQU5EUk9JRF9SRVFVRVNUX01BWF9OVU1fSU5QVVRfU1RSRUFNUywKKyAgICAgICBBTkRST0lEX1JFUVVFU1RfUElQRUxJTkVfTUFYX0RFUFRILCBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUywKKyAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUywgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUywKKyAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTLCBBTkRST0lEX1JFUVVFU1RfUEFSVElBTF9SRVNVTFRfQ09VTlQsCisgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01BWF9ESUdJVEFMX1pPT00sCisgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0lOUFVUX09VVFBVVF9GT1JNQVRTX01BUCwKKyAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgIC8qQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUywqLworICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TLCBBTkRST0lEX1NFTlNPUl9GT1JXQVJEX01BVFJJWDEsCisgICAgICAgQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxLCBBTkRST0lEX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDIsCisgICAgICAgQU5EUk9JRF9TRU5TT1JfRk9SV0FSRF9NQVRSSVgyLCBBTkRST0lEX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xLAorICAgICAgIEFORFJPSURfU0VOU09SX0NPTE9SX1RSQU5TRk9STTIsIEFORFJPSURfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTEsCisgICAgICAgQU5EUk9JRF9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMiwgQU5EUk9JRF9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSwKKyAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX1NFTlNJVElWSVRZX1JBTkdFLCBBTkRST0lEX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVCwKKyAgICAgICBBTkRST0lEX1NFTlNPUl9JTkZPX0VYUE9TVVJFX1RJTUVfUkFOR0UsIEFORFJPSURfU0VOU09SX0lORk9fTUFYX0ZSQU1FX0RVUkFUSU9OLAorICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fUEhZU0lDQUxfU0laRSwgQU5EUk9JRF9TRU5TT1JfSU5GT19QSVhFTF9BUlJBWV9TSVpFLAorICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fV0hJVEVfTEVWRUwsIEFORFJPSURfU0VOU09SX0JBU0VfR0FJTl9GQUNUT1IsCisgICAgICAgQU5EUk9JRF9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTiwgQU5EUk9JRF9TRU5TT1JfTUFYX0FOQUxPR19TRU5TSVRJVklUWSwKKyAgICAgICBBTkRST0lEX1NFTlNPUl9PUklFTlRBVElPTiwgQU5EUk9JRF9TRU5TT1JfQVZBSUxBQkxFX1RFU1RfUEFUVEVSTl9NT0RFUywKKyAgICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19BVkFJTEFCTEVfRkFDRV9ERVRFQ1RfTU9ERVMsCisgICAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fSElTVE9HUkFNX0JVQ0tFVF9DT1VOVCwKKyAgICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19NQVhfRkFDRV9DT1VOVCwgQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fTUFYX0hJU1RPR1JBTV9DT1VOVCwKKyAgICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19NQVhfU0hBUlBORVNTX01BUF9WQUxVRSwKKyAgICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19TSEFSUE5FU1NfTUFQX1NJWkUsIEFORFJPSURfSE9UX1BJWEVMX0FWQUlMQUJMRV9IT1RfUElYRUxfTU9ERVMsCisgICAgICAgQU5EUk9JRF9FREdFX0FWQUlMQUJMRV9FREdFX01PREVTLAorICAgICAgIEFORFJPSURfTk9JU0VfUkVEVUNUSU9OX0FWQUlMQUJMRV9OT0lTRV9SRURVQ1RJT05fTU9ERVMsCisgICAgICAgQU5EUk9JRF9UT05FTUFQX0FWQUlMQUJMRV9UT05FX01BUF9NT0RFUywKKyAgICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19BVkFJTEFCTEVfSE9UX1BJWEVMX01BUF9NT0RFUywKKyAgICAgICBBTkRST0lEX1RPTkVNQVBfTUFYX0NVUlZFX1BPSU5UUywKKyAgICAgICBBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX01PREVTLAorICAgICAgIEFORFJPSURfQ09OVFJPTF9BRV9MT0NLX0FWQUlMQUJMRSwKKyAgICAgICBBTkRST0lEX0NPTlRST0xfQVdCX0xPQ0tfQVZBSUxBQkxFLAorICAgICAgIEFORFJPSURfU1RBVElTVElDU19JTkZPX0FWQUlMQUJMRV9MRU5TX1NIQURJTkdfTUFQX01PREVTLAorICAgICAgIEFORFJPSURfU0hBRElOR19BVkFJTEFCTEVfTU9ERVMsCisgICAgICAgQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9IQVJEV0FSRV9MRVZFTCwKKyNpZm5kZWYgVVNFX0hBTF8zXzMKKyAgICAgICBBTkRST0lEX1NFTlNPUl9PUEFRVUVfUkFXX1NJWkUsCisgICAgICAgQU5EUk9JRF9DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NUX1JBTkdFLAorI2VuZGlmCisgICAgICAgfTsKKworICAgIFZlY3RvcjxpbnQzMl90PiBhdmFpbGFibGVfY2hhcmFjdGVyaXN0aWNzX2tleXM7CisgICAgYXZhaWxhYmxlX2NoYXJhY3RlcmlzdGljc19rZXlzLmFwcGVuZEFycmF5KGNoYXJhY3RlcmlzdGljc19rZXlzX2Jhc2ljLAorICAgICAgICAgICAgc2l6ZW9mKGNoYXJhY3RlcmlzdGljc19rZXlzX2Jhc2ljKS9zaXplb2YoaW50MzJfdCkpOworI2lmbmRlZiBVU0VfSEFMXzNfMworICAgIGlmIChoYXNCbGFja1JlZ2lvbnMpIHsKKyAgICAgICAgYXZhaWxhYmxlX2NoYXJhY3RlcmlzdGljc19rZXlzLmFkZChBTkRST0lEX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMpOworICAgIH0KKyNlbmRpZgorICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMsCisgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2NoYXJhY3RlcmlzdGljc19rZXlzLmFycmF5KCksCisgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlX2NoYXJhY3RlcmlzdGljc19rZXlzLnNpemUoKSk7CisKKyAgICAvKmF2YWlsYWJsZSBzdGFsbCBkdXJhdGlvbnMgZGVwZW5kIG9uIHRoZSBodyArIHN3IGFuZCB3aWxsIGJlIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IGRldmljZXMgKi8KKyAgICAvKmhhdmUgdG8gYWRkIGZvciByYXcgYWZ0ZXIgaW1wbGVtZW50YXRpb24qLworICAgIGludDMyX3Qgc3RhbGxfZm9ybWF0c1tdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFNfUkFXMTZ9OworICAgIHNpemVfdCBzdGFsbF9mb3JtYXRzX2NvdW50ID0gc2l6ZW9mKHN0YWxsX2Zvcm1hdHMpL3NpemVvZihpbnQzMl90KTsKKworICAgIFZlY3RvcjxpbnQ2NF90PiBhdmFpbGFibGVfc3RhbGxfZHVyYXRpb25zOworICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBzdGFsbF9mb3JtYXRzX2NvdW50OyBqKyspIHsKKyAgICAgICAgaWYgKHN0YWxsX2Zvcm1hdHNbal0gPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgTUlOKE1BWF9TSVpFU19DTlQsCisgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cGljdHVyZV9zaXplc190YmxfY250KTsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlX3N0YWxsX2R1cmF0aW9ucy5hZGQoc3RhbGxfZm9ybWF0c1tqXSk7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlX3N0YWxsX2R1cmF0aW9ucy5hZGQoZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5waWN0dXJlX3NpemVzX3RibFtpXS53aWR0aCk7CisgICAgICAgICAgICAgICAgYXZhaWxhYmxlX3N0YWxsX2R1cmF0aW9ucy5hZGQoZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5waWN0dXJlX3NpemVzX3RibFtpXS5oZWlnaHQpOworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9zdGFsbF9kdXJhdGlvbnMuYWRkKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+anBlZ19zdGFsbF9kdXJhdGlvbnNbaV0pOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNSU4oTUFYX1NJWkVTX0NOVCwKKyAgICAgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zdXBwb3J0ZWRfcmF3X2RpbV9jbnQpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVfc3RhbGxfZHVyYXRpb25zLmFkZChzdGFsbF9mb3JtYXRzW2pdKTsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVfc3RhbGxfZHVyYXRpb25zLmFkZChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnJhd19kaW1baV0ud2lkdGgpOworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9zdGFsbF9kdXJhdGlvbnMuYWRkKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cmF3X2RpbVtpXS5oZWlnaHQpOworICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9zdGFsbF9kdXJhdGlvbnMuYWRkKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cmF3MTZfc3RhbGxfZHVyYXRpb25zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TLAorICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZV9zdGFsbF9kdXJhdGlvbnMuYXJyYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVfc3RhbGxfZHVyYXRpb25zLnNpemUoKSk7CisKKyAgICAvL1FDQU1FUkEzX09QQVFVRV9SQVcKKyAgICB1aW50OF90IHJhd19mb3JtYXQgPSBRQ0FNRVJBM19PUEFRVUVfUkFXX0ZPUk1BVF9MRUdBQ1k7CisgICAgY2FtX2Zvcm1hdF90IGZtdCA9IENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBCUFBfR0JSRzsKKyAgICBzd2l0Y2ggKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+b3BhcXVlX3Jhd19mbXQpIHsKKyAgICBjYXNlIExFR0FDWV9SQVc6CisgICAgICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPndoaXRlX2xldmVsID09IE1BWF9WQUxVRV84QklUKQorICAgICAgICAgICAgZm10ID0gQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV184QlBQX0dCUkc7CisgICAgICAgIGVsc2UgaWYgKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+d2hpdGVfbGV2ZWwgPT0gTUFYX1ZBTFVFXzEwQklUKQorICAgICAgICAgICAgZm10ID0gQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEJQUF9HQlJHOworICAgICAgICBlbHNlIGlmIChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPndoaXRlX2xldmVsID09IE1BWF9WQUxVRV8xMkJJVCkKKyAgICAgICAgICAgIGZtdCA9IENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTJCUFBfR0JSRzsKKyAgICAgICAgcmF3X2Zvcm1hdCA9IFFDQU1FUkEzX09QQVFVRV9SQVdfRk9STUFUX0xFR0FDWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNSVBJX1JBVzoKKyAgICAgICAgaWYgKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+d2hpdGVfbGV2ZWwgPT0gTUFYX1ZBTFVFXzhCSVQpCisgICAgICAgICAgICBmbXQgPSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzhCUFBfR0JSRzsKKyAgICAgICAgZWxzZSBpZiAoZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT53aGl0ZV9sZXZlbCA9PSBNQVhfVkFMVUVfMTBCSVQpCisgICAgICAgICAgICBmbXQgPSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX0dCUkc7CisgICAgICAgIGVsc2UgaWYgKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+d2hpdGVfbGV2ZWwgPT0gTUFYX1ZBTFVFXzEyQklUKQorICAgICAgICAgICAgZm10ID0gQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMkJQUF9HQlJHOworICAgICAgICByYXdfZm9ybWF0ID0gUUNBTUVSQTNfT1BBUVVFX1JBV19GT1JNQVRfTUlQSTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgidW5rbm93biBvcGFxdWVfcmF3X2Zvcm1hdCAlZCIsCisgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5vcGFxdWVfcmF3X2ZtdCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShRQ0FNRVJBM19PUEFRVUVfUkFXX0ZPUk1BVCwgJnJhd19mb3JtYXQsIDEpOworCisgICAgVmVjdG9yPGludDMyX3Q+IHN0cmlkZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNSU4oTUFYX1NJWkVTX0NOVCwKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c3VwcG9ydGVkX3Jhd19kaW1fY250KTsgaSsrKSB7CisgICAgICAgIGNhbV9zdHJlYW1fYnVmX3BsYW5lX2luZm9fdCBidWZfcGxhbmVzOworICAgICAgICBzdHJpZGVzLmFkZChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnJhd19kaW1baV0ud2lkdGgpOworICAgICAgICBzdHJpZGVzLmFkZChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnJhd19kaW1baV0uaGVpZ2h0KTsKKyAgICAgICAgbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3JhdyhmbXQsICZnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnJhd19kaW1baV0sCisgICAgICAgICAgICAmZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5wYWRkaW5nX2luZm8sICZidWZfcGxhbmVzKTsKKyAgICAgICAgc3RyaWRlcy5hZGQoYnVmX3BsYW5lcy5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSk7CisgICAgfQorICAgIHN0YXRpY0luZm8udXBkYXRlKFFDQU1FUkEzX09QQVFVRV9SQVdfU1RSSURFUywgc3RyaWRlcy5hcnJheSgpLAorICAgICAgICAgICAgc3RyaWRlcy5zaXplKCkpOworCisgICAgLy9WaWRlbyBIRFIgZGVmYXVsdAorICAgIGlmICgoZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2spICYKKyAgICAgICAgICAgIChDQU1fUUNPTV9GRUFUVVJFX1NUQUdHRVJFRF9WSURFT19IRFIgfAorICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9aSUdaQUdfVklERU9fSERSIHwgQ0FNX1FDT01fRkVBVFVSRV9TRU5TT1JfSERSKSkgeworICAgICAgICBpbnQzMl90IHZoZHJfbW9kZVtdID0geworICAgICAgICAgICAgICAgIFFDQU1FUkEzX1ZJREVPX0hEUl9NT0RFX09GRiwKKyAgICAgICAgICAgICAgICBRQ0FNRVJBM19WSURFT19IRFJfTU9ERV9PTn07CisKKyAgICAgICAgc2l6ZV90IHZoZHJfbW9kZV9jb3VudCA9IHNpemVvZih2aGRyX21vZGUpIC8gc2l6ZW9mKGludDMyX3QpOworICAgICAgICBzdGF0aWNJbmZvLnVwZGF0ZShRQ0FNRVJBM19BVkFJTEFCTEVfVklERU9fSERSX01PREVTLAorICAgICAgICAgICAgICAgICAgICB2aGRyX21vZGUsIHZoZHJfbW9kZV9jb3VudCk7CisgICAgfQorCisgICAgc3RhdGljSW5mby51cGRhdGUoUUNBTUVSQTNfRFVBTENBTV9DQUxJQl9NRVRBX0RBVEFfQkxPQiwKKyAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5yZWxhdGVkX2NhbV9jYWxpYnJhdGlvbiwKKyAgICAgICAgICAgIHNpemVvZihnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnJlbGF0ZWRfY2FtX2NhbGlicmF0aW9uKSk7CisKKyAgICB1aW50OF90IGlzTW9ub09ubHkgPQorICAgICAgICAgICAgKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+Y29sb3JfYXJyYW5nZW1lbnQgPT0gQ0FNX0ZJTFRFUl9BUlJBTkdFTUVOVF9ZKTsKKyAgICBzdGF0aWNJbmZvLnVwZGF0ZShRQ0FNRVJBM19TRU5TT1JfSVNfTU9OT19PTkxZLAorICAgICAgICAgICAgJmlzTW9ub09ubHksIDEpOworCisjaWZuZGVmIFVTRV9IQUxfM18zCisgICAgVmVjdG9yPGludDMyX3Q+IG9wYXF1ZV9zaXplOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2NhbGFyX2Zvcm1hdHNfY291bnQ7IGorKykgeworICAgICAgICBpZiAoc2NhbGFyX2Zvcm1hdHNbal0gPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFNfUkFXX09QQVFVRSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNSU4oTUFYX1NJWkVTX0NOVCwKKyAgICAgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zdXBwb3J0ZWRfcmF3X2RpbV9jbnQpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX2J1Zl9wbGFuZV9pbmZvX3QgYnVmX3BsYW5lczsKKworICAgICAgICAgICAgICAgIHJjID0gbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3JhdyhmbXQsICZnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnJhd19kaW1baV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJmdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cGFkZGluZ19pbmZvLCAmYnVmX3BsYW5lcyk7CisKKyAgICAgICAgICAgICAgICBpZiAocmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBvcGFxdWVfc2l6ZS5hZGQoZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5yYXdfZGltW2ldLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgb3BhcXVlX3NpemUuYWRkKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cmF3X2RpbVtpXS5oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBvcGFxdWVfc2l6ZS5hZGQoYnVmX3BsYW5lcy5wbGFuZV9pbmZvLmZyYW1lX2xlbik7CisgICAgICAgICAgICAgICAgfWVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJyYXcgZnJhbWUgY2FsY3VsYXRpb24gZmFpbGVkISIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgob3BhcXVlX3NpemUuc2l6ZSgpID4gMCkgJiYKKyAgICAgICAgICAgIChvcGFxdWVfc2l6ZS5zaXplKCkgJSBQRVJfQ09ORklHVVJBVElPTl9TSVpFXzMgPT0gMCkpCisgICAgICAgIHN0YXRpY0luZm8udXBkYXRlKEFORFJPSURfU0VOU09SX09QQVFVRV9SQVdfU0laRSwgb3BhcXVlX3NpemUuYXJyYXkoKSwgb3BhcXVlX3NpemUuc2l6ZSgpKTsKKyAgICBlbHNlCisgICAgICAgIExPR1coIldhcm5pbmc6IEFORFJPSURfU0VOU09SX09QQVFVRV9SQVdfU0laRSBpcyB1c2luZyByb3VnaCBlc3RpbWF0aW9uKDIgYnl0ZXMvcGl4ZWwpIik7CisjZW5kaWYKKworICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnN1cHBvcnRlZF9pcl9tb2RlX2NudCA+IDApIHsKKyAgICAgICAgaW50MzJfdCBhdmFpbF9pcl9tb2Rlc1tDQU1fSVJfTU9ERV9NQVhdOworICAgICAgICBzaXplID0gMDsKKyAgICAgICAgY291bnQgPSBDQU1fSVJfTU9ERV9NQVg7CisgICAgICAgIGNvdW50ID0gTUlOKGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+c3VwcG9ydGVkX2lyX21vZGVfY250LCBjb3VudCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaW50IHZhbCA9IGxvb2t1cEZ3a05hbWUoSVJfTU9ERVNfTUFQLCBNRVRBREFUQV9NQVBfU0laRShJUl9NT0RFU19NQVApLAorICAgICAgICAgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPnN1cHBvcnRlZF9pcl9tb2Rlc1tpXSk7CisgICAgICAgICAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gdmFsKSB7CisgICAgICAgICAgICAgICAgYXZhaWxfaXJfbW9kZXNbc2l6ZV0gPSAoaW50MzJfdCl2YWw7CisgICAgICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXRpY0luZm8udXBkYXRlKFFDQU1FUkEzX0lSX0FWQUlMQUJMRV9NT0RFUywKKyAgICAgICAgICAgICAgICBhdmFpbF9pcl9tb2Rlcywgc2l6ZSk7CisgICAgfQorCisgICAgZ1N0YXRpY01ldGFkYXRhW2NhbWVyYUlkXSA9IHN0YXRpY0luZm8ucmVsZWFzZSgpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtYWtlVGFibGUKKyAqCisgKiBERVNDUklQVElPTjogbWFrZSBhIHRhYmxlIG9mIHNpemVzCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjptYWtlVGFibGUoY2FtX2RpbWVuc2lvbl90KiBkaW1UYWJsZSwgc2l6ZV90IHNpemUsCisgICAgICAgIHNpemVfdCBtYXhfc2l6ZSwgaW50MzJfdCAqc2l6ZVRhYmxlKQoreworICAgIHNpemVfdCBqID0gMDsKKyAgICBpZiAoc2l6ZSA+IG1heF9zaXplKSB7CisgICAgICAgc2l6ZSA9IG1heF9zaXplOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBzaXplVGFibGVbal0gPSBkaW1UYWJsZVtpXS53aWR0aDsKKyAgICAgICAgc2l6ZVRhYmxlW2orMV0gPSBkaW1UYWJsZVtpXS5oZWlnaHQ7CisgICAgICAgIGorPTI7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1ha2VGUFNUYWJsZQorICoKKyAqIERFU0NSSVBUSU9OOiBtYWtlIGEgdGFibGUgb2YgZnBzIHJhbmdlcworICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjptYWtlRlBTVGFibGUoY2FtX2Zwc19yYW5nZV90KiBmcHNUYWJsZSwgc2l6ZV90IHNpemUsCisgICAgICAgIHNpemVfdCBtYXhfc2l6ZSwgaW50MzJfdCAqZnBzUmFuZ2VzVGFibGUpCit7CisgICAgc2l6ZV90IGogPSAwOworICAgIGlmIChzaXplID4gbWF4X3NpemUpIHsKKyAgICAgICBzaXplID0gbWF4X3NpemU7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGZwc1Jhbmdlc1RhYmxlW2pdID0gKGludDMyX3QpZnBzVGFibGVbaV0ubWluX2ZwczsKKyAgICAgICAgZnBzUmFuZ2VzVGFibGVbaisxXSA9IChpbnQzMl90KWZwc1RhYmxlW2ldLm1heF9mcHM7CisgICAgICAgIGorPTI7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1ha2VPdmVycmlkZXNMaXN0CisgKgorICogREVTQ1JJUFRJT046IG1ha2UgYSBsaXN0IG9mIHNjZW5lIG1vZGUgb3ZlcnJpZGVzCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjptYWtlT3ZlcnJpZGVzTGlzdCgKKyAgICAgICAgY2FtX3NjZW5lX21vZGVfb3ZlcnJpZGVzX3QqIG92ZXJyaWRlc1RhYmxlLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG1heF9zaXplLAorICAgICAgICB1aW50OF90ICpvdmVycmlkZXNMaXN0LCB1aW50OF90ICpzdXBwb3J0ZWRfaW5kZXhlcywgdWludDMyX3QgY2FtZXJhX2lkKQoreworICAgIC8qZGFlbW9uIHdpbGwgZ2l2ZSBhIGxpc3Qgb2Ygb3ZlcnJpZGVzIGZvciBhbGwgc2NlbmUgbW9kZXMuCisgICAgICBIb3dldmVyIHdlIHNob3VsZCBzZW5kIHRoZSBmd2sgb25seSB0aGUgb3ZlcnJpZGVzIGZvciB0aGUgc2NlbmUgbW9kZXMKKyAgICAgIHN1cHBvcnRlZCBieSB0aGUgZnJhbWV3b3JrKi8KKyAgICBzaXplX3QgaiA9IDA7CisgICAgaWYgKHNpemUgPiBtYXhfc2l6ZSkgeworICAgICAgIHNpemUgPSBtYXhfc2l6ZTsKKyAgICB9CisgICAgc2l6ZV90IGZvY3VzX2NvdW50ID0gQ0FNX0ZPQ1VTX01PREVfTUFYOworICAgIGZvY3VzX2NvdW50ID0gTUlOKGdDYW1DYXBhYmlsaXR5W2NhbWVyYV9pZF0tPnN1cHBvcnRlZF9mb2N1c19tb2Rlc19jbnQsCisgICAgICAgICAgICBmb2N1c19jb3VudCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgYm9vbCBzdXB0ID0gZmFsc2U7CisgICAgICAgIHNpemVfdCBpbmRleCA9IHN1cHBvcnRlZF9pbmRleGVzW2ldOworICAgICAgICBvdmVycmlkZXNMaXN0W2pdID0gZ0NhbUNhcGFiaWxpdHlbY2FtZXJhX2lkXS0+Zmxhc2hfYXZhaWxhYmxlID8KKyAgICAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTl9BVVRPX0ZMQVNIIDogQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT047CisgICAgICAgIGludCB2YWwgPSBsb29rdXBGd2tOYW1lKFdISVRFX0JBTEFOQ0VfTU9ERVNfTUFQLAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX01BUF9TSVpFKFdISVRFX0JBTEFOQ0VfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICBvdmVycmlkZXNUYWJsZVtpbmRleF0uYXdiX21vZGUpOworICAgICAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gdmFsKSB7CisgICAgICAgICAgICBvdmVycmlkZXNMaXN0W2orMV0gPSAodWludDhfdCl2YWw7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCBmb2N1c19vdmVycmlkZSA9IG92ZXJyaWRlc1RhYmxlW2luZGV4XS5hZl9tb2RlOworICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IGZvY3VzX2NvdW50OyBrKyspIHsKKyAgICAgICAgICAgaWYgKGdDYW1DYXBhYmlsaXR5W2NhbWVyYV9pZF0tPnN1cHBvcnRlZF9mb2N1c19tb2Rlc1trXSA9PSBmb2N1c19vdmVycmlkZSkgeworICAgICAgICAgICAgICBzdXB0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3VwdCkgeworICAgICAgICAgICAgdmFsID0gbG9va3VwRndrTmFtZShGT0NVU19NT0RFU19NQVAsIE1FVEFEQVRBX01BUF9TSVpFKEZPQ1VTX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgICAgIGZvY3VzX292ZXJyaWRlKTsKKyAgICAgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKKyAgICAgICAgICAgICAgICBvdmVycmlkZXNMaXN0W2orMl0gPSAodWludDhfdCl2YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIG92ZXJyaWRlc0xpc3RbaisyXSA9IEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX09GRjsKKyAgICAgICAgfQorICAgICAgICBqKz0zOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBmaWx0ZXJKcGVnU2l6ZXMKKyAqCisgKiBERVNDUklQVElPTjogUmV0dXJucyB0aGUgc3VwcG9ydGVkIGpwZWcgc2l6ZXMgYmFzZWQgb24gdGhlIG1heCBkaW1lbnNpb24gdGhhdAorICogICAgICAgICAgICAgIGNvdWxkIGJlIGRvd25zY2FsZWQgdG8KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqCisgKiBSRVRVUk4gICAgIDogbGVuZ3RoIG9mIGpwZWdTaXplcyBhcnJheQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3NpemVfdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpmaWx0ZXJKcGVnU2l6ZXMoaW50MzJfdCAqanBlZ1NpemVzLCBpbnQzMl90ICpwcm9jZXNzZWRTaXplcywKKyAgICAgICAgc2l6ZV90IHByb2Nlc3NlZFNpemVzQ250LCBzaXplX3QgbWF4Q291bnQsIGNhbV9yZWN0X3QgYWN0aXZlX2FycmF5X3NpemUsCisgICAgICAgIHVpbnQ4X3QgZG93bnNjYWxlX2ZhY3RvcikKK3sKKyAgICBpZiAoMCA9PSBkb3duc2NhbGVfZmFjdG9yKSB7CisgICAgICAgIGRvd25zY2FsZV9mYWN0b3IgPSAxOworICAgIH0KKworICAgIGludDMyX3QgbWluX3dpZHRoID0gYWN0aXZlX2FycmF5X3NpemUud2lkdGggLyBkb3duc2NhbGVfZmFjdG9yOworICAgIGludDMyX3QgbWluX2hlaWdodCA9IGFjdGl2ZV9hcnJheV9zaXplLmhlaWdodCAvIGRvd25zY2FsZV9mYWN0b3I7CisgICAgc2l6ZV90IGpwZWdTaXplc0NudCA9IDA7CisgICAgaWYgKHByb2Nlc3NlZFNpemVzQ250ID4gbWF4Q291bnQpIHsKKyAgICAgICAgcHJvY2Vzc2VkU2l6ZXNDbnQgPSBtYXhDb3VudDsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcm9jZXNzZWRTaXplc0NudDsgaSs9MikgeworICAgICAgICBpZiAocHJvY2Vzc2VkU2l6ZXNbaV0gPj0gbWluX3dpZHRoICYmIHByb2Nlc3NlZFNpemVzW2krMV0gPj0gbWluX2hlaWdodCkgeworICAgICAgICAgICAganBlZ1NpemVzW2pwZWdTaXplc0NudF0gPSBwcm9jZXNzZWRTaXplc1tpXTsKKyAgICAgICAgICAgIGpwZWdTaXplc1tqcGVnU2l6ZXNDbnQrMV0gPSBwcm9jZXNzZWRTaXplc1tpKzFdOworICAgICAgICAgICAganBlZ1NpemVzQ250ICs9IDI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGpwZWdTaXplc0NudDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjb21wdXRlTm9pc2VNb2RlbEVudHJ5UworICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byBtYXAgYSBnaXZlbiBzZW5zaXRpdml0eSB0byB0aGUgUyBub2lzZQorICogICAgICAgICAgICAgIG1vZGVsIHBhcmFtZXRlcnMgaW4gdGhlIERORyBub2lzZSBtb2RlbC4KKyAqCisgKiBQQVJBTUVURVJTIDogc2VucyA6IHRoZSBzZW5zb3Igc2Vuc2l0aXZpdHkKKyAqCisgKiogUkVUVVJOICAgIDogUyAoc2Vuc29yIGFtcGxpZmljYXRpb24pIG5vaXNlCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitkb3VibGUgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Y29tcHV0ZU5vaXNlTW9kZWxFbnRyeVMoaW50MzJfdCBzZW5zKSB7CisgICAgZG91YmxlIHMgPSBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5ncmFkaWVudF9TICogc2VucyArCisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5vZmZzZXRfUzsKKyAgICByZXR1cm4gKChzIDwgMC4wKSA/IDAuMCA6IHMpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbXB1dGVOb2lzZU1vZGVsRW50cnlPCisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIG1hcCBhIGdpdmVuIHNlbnNpdGl2aXR5IHRvIHRoZSBPIG5vaXNlCisgKiAgICAgICAgICAgICAgbW9kZWwgcGFyYW1ldGVycyBpbiB0aGUgRE5HIG5vaXNlIG1vZGVsLgorICoKKyAqIFBBUkFNRVRFUlMgOiBzZW5zIDogdGhlIHNlbnNvciBzZW5zaXRpdml0eQorICoKKyAqKiBSRVRVUk4gICAgOiBPIChzZW5zb3IgcmVhZG91dCkgbm9pc2UKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2RvdWJsZSBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpjb21wdXRlTm9pc2VNb2RlbEVudHJ5TyhpbnQzMl90IHNlbnMpIHsKKyAgICBpbnQzMl90IG1heF9hbmFsb2dfc2VucyA9IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPm1heF9hbmFsb2dfc2Vuc2l0aXZpdHk7CisgICAgZG91YmxlIGRpZ2l0YWxfZ2FpbiA9ICgxLjAgKiBzZW5zIC8gbWF4X2FuYWxvZ19zZW5zKSA8IDEuMCA/CisgICAgICAgICAgICAxLjAgOiAoMS4wICogc2VucyAvIG1heF9hbmFsb2dfc2Vucyk7CisgICAgZG91YmxlIG8gPSBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5ncmFkaWVudF9PICogc2VucyAqIHNlbnMgKworICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+b2Zmc2V0X08gKiBkaWdpdGFsX2dhaW4gKiBkaWdpdGFsX2dhaW47CisgICAgcmV0dXJuICgobyA8IDAuMCkgPyAwLjAgOiBvKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRTZW5zb3JTZW5zaXRpdml0eQorICoKKyAqIERFU0NSSVBUSU9OOiBjb252ZXJ0IGlzb19tb2RlIHRvIGFuIGludGVnZXIgdmFsdWUKKyAqCisgKiBQQVJBTUVURVJTIDogaXNvX21vZGUgOiB0aGUgaXNvX21vZGUgc3VwcG9ydGVkIGJ5IHNlbnNvcgorICoKKyAqKiBSRVRVUk4gICAgOiBzZW5zaXRpdml0eSBzdXBwb3J0ZWQgYnkgc2Vuc29yCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmdldFNlbnNvclNlbnNpdGl2aXR5KGludDMyX3QgaXNvX21vZGUpCit7CisgICAgaW50MzJfdCBzZW5zaXRpdml0eTsKKworICAgIHN3aXRjaCAoaXNvX21vZGUpIHsKKyAgICBjYXNlIENBTV9JU09fTU9ERV8xMDA6CisgICAgICAgIHNlbnNpdGl2aXR5ID0gMTAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9JU09fTU9ERV8yMDA6CisgICAgICAgIHNlbnNpdGl2aXR5ID0gMjAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9JU09fTU9ERV80MDA6CisgICAgICAgIHNlbnNpdGl2aXR5ID0gNDAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9JU09fTU9ERV84MDA6CisgICAgICAgIHNlbnNpdGl2aXR5ID0gODAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9JU09fTU9ERV8xNjAwOgorICAgICAgICBzZW5zaXRpdml0eSA9IDE2MDA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHNlbnNpdGl2aXR5ID0gLTE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gc2Vuc2l0aXZpdHk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0Q2FtSW5mbworICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBjYW1lcmEgY2FwYWJpbGl0aWVzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFJZCAgOiBjYW1lcmEgSWQKKyAqICAgQGluZm8gICAgICA6IGNhbWVyYSBpbmZvIHN0cnVjdCB0byBiZSBmaWxsZWQgaW4gd2l0aCBjYW1lcmEgY2FwYWJpbGl0aWVzCisgKgorICogUkVUVVJOICAgICA6IGludCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Z2V0Q2FtSW5mbyh1aW50MzJfdCBjYW1lcmFJZCwKKyAgICAgICAgc3RydWN0IGNhbWVyYV9pbmZvICppbmZvKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJjID0gMDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ0NhbUxvY2spOworICAgIGlmIChOVUxMID09IGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXSkgeworICAgICAgICByYyA9IGluaXRDYXBhYmlsaXRpZXMoY2FtZXJhSWQpOworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0NhbUxvY2spOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gZ1N0YXRpY01ldGFkYXRhW2NhbWVyYUlkXSkgeworICAgICAgICByYyA9IGluaXRTdGF0aWNNZXRhZGF0YShjYW1lcmFJZCk7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnQ2FtTG9jayk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2goZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5wb3NpdGlvbikgeworICAgIGNhc2UgQ0FNX1BPU0lUSU9OX0JBQ0s6CisgICAgY2FzZSBDQU1fUE9TSVRJT05fQkFDS19BVVg6CisgICAgICAgIGluZm8tPmZhY2luZyA9IENBTUVSQV9GQUNJTkdfQkFDSzsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENBTV9QT1NJVElPTl9GUk9OVDoKKyAgICBjYXNlIENBTV9QT1NJVElPTl9GUk9OVF9BVVg6CisgICAgICAgIGluZm8tPmZhY2luZyA9IENBTUVSQV9GQUNJTkdfRlJPTlQ7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiVW5rbm93biBwb3NpdGlvbiB0eXBlICVkIGZvciBjYW1lcmEgaWQ6JWQiLAorICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+cG9zaXRpb24sIGNhbWVyYUlkKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICBpbmZvLT5vcmllbnRhdGlvbiA9IChpbnQpZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5zZW5zb3JfbW91bnRfYW5nbGU7CisjaWZuZGVmIFVTRV9IQUxfM18zCisgICAgaW5mby0+ZGV2aWNlX3ZlcnNpb24gPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDsKKyNlbHNlCisgICAgaW5mby0+ZGV2aWNlX3ZlcnNpb24gPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMzsKKyNlbmRpZgorICAgIGluZm8tPnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzID0gZ1N0YXRpY01ldGFkYXRhW2NhbWVyYUlkXTsKKworICAgIC8vRm9yIG5vdyBhc3N1bWUgYm90aCBjYW1lcmFzIGNhbiBvcGVyYXRlIGluZGVwZW5kZW50bHkuCisgICAgaW5mby0+Y29uZmxpY3RpbmdfZGV2aWNlcyA9IE5VTEw7CisgICAgaW5mby0+Y29uZmxpY3RpbmdfZGV2aWNlc19sZW5ndGggPSAwOworCisgICAgLy9yZXNvdXJjZSBjb3N0IGlzIDEwMCAqIE1JTigxLjAsIG0vTSksCisgICAgLy93aGVyZSBtIGlzIHRocm91Z2hwdXQgcmVxdWlyZW1lbnQgd2l0aCBtYXhpbXVtIHN0cmVhbSBjb25maWd1cmF0aW9uCisgICAgLy9hbmQgTSBpcyBDUFAgbWF4aW11bSB0aHJvdWdocHV0LgorICAgIGZsb2F0IG1heF9mcHMgPSAwLjA7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsKKyAgICAgICAgICAgIGkgPCBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmZwc19yYW5nZXNfdGJsX2NudDsgaSsrKSB7CisgICAgICAgIGlmIChtYXhfZnBzIDwgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5mcHNfcmFuZ2VzX3RibFtpXS5tYXhfZnBzKQorICAgICAgICAgICAgbWF4X2ZwcyA9IGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXS0+ZnBzX3Jhbmdlc190YmxbaV0ubWF4X2ZwczsKKyAgICB9CisgICAgZmxvYXQgcmF0aW8gPSAxLjAgKiBNQVhfUFJPQ0VTU0VEX1NUUkVBTVMgKgorICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5hY3RpdmVfYXJyYXlfc2l6ZS53aWR0aCAqCisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVtjYW1lcmFJZF0tPmFjdGl2ZV9hcnJheV9zaXplLmhlaWdodCAqIG1heF9mcHMgLworICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbY2FtZXJhSWRdLT5tYXhfcGl4ZWxfYmFuZHdpZHRoOworICAgIGluZm8tPnJlc291cmNlX2Nvc3QgPSAxMDAgKiBNSU4oMS4wLCByYXRpbyk7CisgICAgTE9HSSgiY2FtZXJhICVkIHJlc291cmNlIGNvc3QgaXMgJWQiLCBjYW1lcmFJZCwKKyAgICAgICAgICAgIGluZm8tPnJlc291cmNlX2Nvc3QpOworCisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdDYW1Mb2NrKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdHJhbnNsYXRlQ2FwYWJpbGl0eVRvTWV0YWRhdGEKKyAqCisgKiBERVNDUklQVElPTjogdHJhbnNsYXRlIHRoZSBjYXBhYmlsaXR5IGludG8gY2FtZXJhX21ldGFkYXRhX3QKKyAqCisgKiBQQVJBTUVURVJTIDogdHlwZSBvZiB0aGUgcmVxdWVzdAorICoKKyAqCisgKiBSRVRVUk4gICAgIDogc3VjY2VzczogY2FtZXJhX21ldGFkYXRhX3QqCisgKiAgICAgICAgICAgICAgZmFpbHVyZTogTlVMTAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY2FtZXJhX21ldGFkYXRhX3QqIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OnRyYW5zbGF0ZUNhcGFiaWxpdHlUb01ldGFkYXRhKGludCB0eXBlKQoreworICAgIGlmIChtRGVmYXVsdE1ldGFkYXRhW3R5cGVdICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0TWV0YWRhdGFbdHlwZV07CisgICAgfQorICAgIC8vZmlyc3QgdGltZSB3ZSBhcmUgaGFuZGxpbmcgdGhpcyByZXF1ZXN0CisgICAgLy9maWxsIHVwIHRoZSBtZXRhZGF0YSBzdHJ1Y3R1cmUgdXNpbmcgdGhlIHdyYXBwZXIgY2xhc3MKKyAgICBDYW1lcmFNZXRhZGF0YSBzZXR0aW5nczsKKyAgICAvL3RyYW5zbGF0ZSBmcm9tIGNhbV9jYXBhYmlsaXR5X3QgdG8gY2FtZXJhX21ldGFkYXRhX3RhZ190CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcmVxdWVzdFR5cGUgPSBBTkRST0lEX1JFUVVFU1RfVFlQRV9DQVBUVVJFOworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfVFlQRSwgJnJlcXVlc3RUeXBlLCAxKTsKKyAgICBpbnQzMl90IGRlZmF1bHRSZXF1ZXN0SUQgPSAwOworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfSUQsICZkZWZhdWx0UmVxdWVzdElELCAxKTsKKworICAgIC8qIE9JUyBkaXNhYmxlICovCisgICAgY2hhciBvaXNfcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldChvaXNfcHJvcCwgMCwgc2l6ZW9mKG9pc19wcm9wKSk7CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5vaXMuZGlzYWJsZSIsIG9pc19wcm9wLCAiMCIpOworICAgIHVpbnQ4X3Qgb2lzX2Rpc2FibGUgPSAodWludDhfdClhdG9pKG9pc19wcm9wKTsKKworICAgIC8qIEZvcmNlIHZpZGVvIHRvIHVzZSBPSVMgKi8KKyAgICBjaGFyIHZpZGVvT2lzUHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldCh2aWRlb09pc1Byb3AsIDAsIHNpemVvZih2aWRlb09pc1Byb3ApKTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLm9pcy52aWRlbyIsIHZpZGVvT2lzUHJvcCwgIjEiKTsKKyAgICB1aW50OF90IGZvcmNlVmlkZW9PaXMgPSAodWludDhfdClhdG9pKHZpZGVvT2lzUHJvcCk7CisgICAgdWludDhfdCBjb250cm9sSW50ZW50ID0gMDsKKyAgICB1aW50OF90IGZvY3VzTW9kZTsKKyAgICB1aW50OF90IHZzTW9kZTsKKyAgICB1aW50OF90IG9wdFN0YWJNb2RlOworICAgIHVpbnQ4X3QgY2FjTW9kZTsKKyAgICB1aW50OF90IGVkZ2VfbW9kZTsKKyAgICB1aW50OF90IG5vaXNlX3JlZF9tb2RlOworICAgIHVpbnQ4X3QgdG9uZW1hcF9tb2RlOworICAgIGJvb2wgaGlnaFF1YWxpdHlNb2RlRW50cnlBdmFpbGFibGUgPSBGQUxTRTsKKyAgICBib29sIGZhc3RNb2RlRW50cnlBdmFpbGFibGUgPSBGQUxTRTsKKyAgICB2c01vZGUgPSBBTkRST0lEX0NPTlRST0xfVklERU9fU1RBQklMSVpBVElPTl9NT0RFX09GRjsKKyAgICBvcHRTdGFiTW9kZSA9IEFORFJPSURfTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERV9PRkY7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfUFJFVklFVzoKKyAgICAgICAgY29udHJvbEludGVudCA9IEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9QUkVWSUVXOworICAgICAgICBmb2N1c01vZGUgPSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9DT05USU5VT1VTX1BJQ1RVUkU7CisgICAgICAgIG9wdFN0YWJNb2RlID0gQU5EUk9JRF9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFX09OOworICAgICAgICBjYWNNb2RlID0gQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERV9GQVNUOworICAgICAgICBlZGdlX21vZGUgPSBBTkRST0lEX0VER0VfTU9ERV9GQVNUOworICAgICAgICBub2lzZV9yZWRfbW9kZSA9IEFORFJPSURfTk9JU0VfUkVEVUNUSU9OX01PREVfRkFTVDsKKyAgICAgICAgdG9uZW1hcF9tb2RlID0gQU5EUk9JRF9UT05FTUFQX01PREVfRkFTVDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENBTUVSQTNfVEVNUExBVEVfU1RJTExfQ0FQVFVSRToKKyAgICAgICAgY29udHJvbEludGVudCA9IEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9TVElMTF9DQVBUVVJFOworICAgICAgICBmb2N1c01vZGUgPSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9DT05USU5VT1VTX1BJQ1RVUkU7CisgICAgICAgIG9wdFN0YWJNb2RlID0gQU5EUk9JRF9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFX09OOworICAgICAgICBlZGdlX21vZGUgPSBBTkRST0lEX0VER0VfTU9ERV9ISUdIX1FVQUxJVFk7CisgICAgICAgIG5vaXNlX3JlZF9tb2RlID0gQU5EUk9JRF9OT0lTRV9SRURVQ1RJT05fTU9ERV9ISUdIX1FVQUxJVFk7CisgICAgICAgIHRvbmVtYXBfbW9kZSA9IEFORFJPSURfVE9ORU1BUF9NT0RFX0hJR0hfUVVBTElUWTsKKyAgICAgICAgY2FjTW9kZSA9IEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX01PREVfT0ZGOworICAgICAgICAvLyBPcmRlciBvZiBwcmlvcml0eSBmb3IgZGVmYXVsdCBDQUMgaXMgSElHSCBRdWFsaXR5IC0+IEZBU1QgLT4gT0ZGCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWJlcnJhdGlvbl9tb2Rlc19jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWJlcnJhdGlvbl9tb2Rlc1tpXSA9PQorICAgICAgICAgICAgICAgICAgICBDQU1fQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX0hJR0hfUVVBTElUWSkgeworICAgICAgICAgICAgICAgIGhpZ2hRdWFsaXR5TW9kZUVudHJ5QXZhaWxhYmxlID0gVFJVRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWJlcnJhdGlvbl9tb2Rlc1tpXSA9PQorICAgICAgICAgICAgICAgICAgICBDQU1fQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX0ZBU1QpIHsKKyAgICAgICAgICAgICAgICBmYXN0TW9kZUVudHJ5QXZhaWxhYmxlID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaGlnaFF1YWxpdHlNb2RlRW50cnlBdmFpbGFibGUpIHsKKyAgICAgICAgICAgIGNhY01vZGUgPSBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFX0hJR0hfUVVBTElUWTsKKyAgICAgICAgfSBlbHNlIGlmIChmYXN0TW9kZUVudHJ5QXZhaWxhYmxlKSB7CisgICAgICAgICAgICBjYWNNb2RlID0gQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERV9GQVNUOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1ZJREVPX1JFQ09SRDoKKyAgICAgICAgY29udHJvbEludGVudCA9IEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9WSURFT19SRUNPUkQ7CisgICAgICAgIGZvY3VzTW9kZSA9IEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX0NPTlRJTlVPVVNfVklERU87CisgICAgICAgIG9wdFN0YWJNb2RlID0gQU5EUk9JRF9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFX09GRjsKKyAgICAgICAgY2FjTW9kZSA9IEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX01PREVfRkFTVDsKKyAgICAgICAgZWRnZV9tb2RlID0gQU5EUk9JRF9FREdFX01PREVfRkFTVDsKKyAgICAgICAgbm9pc2VfcmVkX21vZGUgPSBBTkRST0lEX05PSVNFX1JFRFVDVElPTl9NT0RFX0ZBU1Q7CisgICAgICAgIHRvbmVtYXBfbW9kZSA9IEFORFJPSURfVE9ORU1BUF9NT0RFX0ZBU1Q7CisgICAgICAgIGlmIChmb3JjZVZpZGVvT2lzKQorICAgICAgICAgICAgb3B0U3RhYk1vZGUgPSBBTkRST0lEX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREVfT047CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDQU1FUkEzX1RFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOgorICAgICAgICBjb250cm9sSW50ZW50ID0gQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX1ZJREVPX1NOQVBTSE9UOworICAgICAgICBmb2N1c01vZGUgPSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9DT05USU5VT1VTX1ZJREVPOworICAgICAgICBvcHRTdGFiTW9kZSA9IEFORFJPSURfTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERV9PRkY7CisgICAgICAgIGNhY01vZGUgPSBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFX0ZBU1Q7CisgICAgICAgIGVkZ2VfbW9kZSA9IEFORFJPSURfRURHRV9NT0RFX0ZBU1Q7CisgICAgICAgIG5vaXNlX3JlZF9tb2RlID0gQU5EUk9JRF9OT0lTRV9SRURVQ1RJT05fTU9ERV9GQVNUOworICAgICAgICB0b25lbWFwX21vZGUgPSBBTkRST0lEX1RPTkVNQVBfTU9ERV9GQVNUOworICAgICAgICBpZiAoZm9yY2VWaWRlb09pcykKKyAgICAgICAgICAgIG9wdFN0YWJNb2RlID0gQU5EUk9JRF9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFX09OOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgorICAgICAgICBjb250cm9sSW50ZW50ID0gQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX1pFUk9fU0hVVFRFUl9MQUc7CisgICAgICAgIGZvY3VzTW9kZSA9IEFORFJPSURfQ09OVFJPTF9BRl9NT0RFX0NPTlRJTlVPVVNfUElDVFVSRTsKKyAgICAgICAgb3B0U3RhYk1vZGUgPSBBTkRST0lEX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREVfT047CisgICAgICAgIGNhY01vZGUgPSBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFX0ZBU1Q7CisgICAgICAgIGVkZ2VfbW9kZSA9IEFORFJPSURfRURHRV9NT0RFX1pFUk9fU0hVVFRFUl9MQUc7CisgICAgICAgIG5vaXNlX3JlZF9tb2RlID0gQU5EUk9JRF9OT0lTRV9SRURVQ1RJT05fTU9ERV9aRVJPX1NIVVRURVJfTEFHOworICAgICAgICB0b25lbWFwX21vZGUgPSBBTkRST0lEX1RPTkVNQVBfTU9ERV9GQVNUOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9NQU5VQUw6CisgICAgICAgIGVkZ2VfbW9kZSA9IEFORFJPSURfRURHRV9NT0RFX0ZBU1Q7CisgICAgICAgIG5vaXNlX3JlZF9tb2RlID0gQU5EUk9JRF9OT0lTRV9SRURVQ1RJT05fTU9ERV9GQVNUOworICAgICAgICB0b25lbWFwX21vZGUgPSBBTkRST0lEX1RPTkVNQVBfTU9ERV9GQVNUOworICAgICAgICBjYWNNb2RlID0gQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERV9GQVNUOworICAgICAgICBjb250cm9sSW50ZW50ID0gQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX01BTlVBTDsKKyAgICAgICAgZm9jdXNNb2RlID0gQU5EUk9JRF9DT05UUk9MX0FGX01PREVfT0ZGOworICAgICAgICBvcHRTdGFiTW9kZSA9IEFORFJPSURfTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERV9PRkY7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZWRnZV9tb2RlID0gQU5EUk9JRF9FREdFX01PREVfRkFTVDsKKyAgICAgICAgbm9pc2VfcmVkX21vZGUgPSBBTkRST0lEX05PSVNFX1JFRFVDVElPTl9NT0RFX0ZBU1Q7CisgICAgICAgIHRvbmVtYXBfbW9kZSA9IEFORFJPSURfVE9ORU1BUF9NT0RFX0ZBU1Q7CisgICAgICAgIGNhY01vZGUgPSBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFX0ZBU1Q7CisgICAgICAgIGNvbnRyb2xJbnRlbnQgPSBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfQ1VTVE9NOworICAgICAgICBmb2N1c01vZGUgPSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9DT05USU5VT1VTX1BJQ1RVUkU7CisgICAgICAgIG9wdFN0YWJNb2RlID0gQU5EUk9JRF9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFX09GRjsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIFNldCBDQUMgdG8gT0ZGIGlmIHVuZGVybHlpbmcgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydAorICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5hYmVycmF0aW9uX21vZGVzX2NvdW50ID09IDApIHsKKyAgICAgICAgY2FjTW9kZSA9IEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX01PREVfT0ZGOworICAgIH0KKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERSwgJmNhY01vZGUsIDEpOworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQsICZjb250cm9sSW50ZW50LCAxKTsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERSwgJnZzTW9kZSwgMSk7CisgICAgaWYgKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnN1cHBvcnRlZF9mb2N1c19tb2Rlc19jbnQgPT0gMSkgeworICAgICAgICBmb2N1c01vZGUgPSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9PRkY7CisgICAgfQorICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwgJmZvY3VzTW9kZSwgMSk7CisKKyAgICBpZiAoZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+b3B0aWNhbF9zdGFiX21vZGVzX2NvdW50ID09IDEgJiYKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPm9wdGljYWxfc3RhYl9tb2Rlc1swXSA9PSBDQU1fT1BUX1NUQUJfT04pCisgICAgICAgIG9wdFN0YWJNb2RlID0gQU5EUk9JRF9MRU5TX09QVElDQUxfU1RBQklMSVpBVElPTl9NT0RFX09OOworICAgIGVsc2UgaWYgKChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5vcHRpY2FsX3N0YWJfbW9kZXNfY291bnQgPT0gMSAmJgorICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+b3B0aWNhbF9zdGFiX21vZGVzWzBdID09IENBTV9PUFRfU1RBQl9PRkYpCisgICAgICAgICAgICB8fCBvaXNfZGlzYWJsZSkKKyAgICAgICAgb3B0U3RhYk1vZGUgPSBBTkRST0lEX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREVfT0ZGOworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREUsICZvcHRTdGFiTW9kZSwgMSk7CisKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX0VYUE9TVVJFX0NPTVBFTlNBVElPTiwKKyAgICAgICAgICAgICZnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5leHBvc3VyZV9jb21wZW5zYXRpb25fZGVmYXVsdCwgMSk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBhZUxvY2sgPSBBTkRST0lEX0NPTlRST0xfQUVfTE9DS19PRkY7CisgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9MT0NLLCAmYWVMb2NrLCAxKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGF3YkxvY2sgPSBBTkRST0lEX0NPTlRST0xfQVdCX0xPQ0tfT0ZGOworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQVdCX0xPQ0ssICZhd2JMb2NrLCAxKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGF3Yk1vZGUgPSBBTkRST0lEX0NPTlRST0xfQVdCX01PREVfQVVUTzsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLCAmYXdiTW9kZSwgMSk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBjb250cm9sTW9kZSA9IEFORFJPSURfQ09OVFJPTF9NT0RFX0FVVE87CisgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfQ09OVFJPTF9NT0RFLCAmY29udHJvbE1vZGUsIDEpOworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgZWZmZWN0TW9kZSA9IEFORFJPSURfQ09OVFJPTF9FRkZFQ1RfTU9ERV9PRkY7CisgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfQ09OVFJPTF9FRkZFQ1RfTU9ERSwgJmVmZmVjdE1vZGUsIDEpOworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2NlbmVNb2RlID0gQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREVfRkFDRV9QUklPUklUWTsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREUsICZzY2VuZU1vZGUsIDEpOworCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWVNb2RlID0gQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT047CisgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9NT0RFLCAmYWVNb2RlLCAxKTsKKworICAgIC8qZmxhc2gqLworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGZsYXNoTW9kZSA9IEFORFJPSURfRkxBU0hfTU9ERV9PRkY7CisgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfRkxBU0hfTU9ERSwgJmZsYXNoTW9kZSwgMSk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBmbGFzaEZpcmluZ0xldmVsID0gQ0FNX0ZMQVNIX0ZJUklOR19MRVZFTF80OworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0ZMQVNIX0ZJUklOR19QT1dFUiwKKyAgICAgICAgICAgICZmbGFzaEZpcmluZ0xldmVsLCAxKTsKKworICAgIC8qIGxlbnMgKi8KKyAgICBmbG9hdCBkZWZhdWx0X2FwZXJ0dXJlID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YXBlcnR1cmVzWzBdOworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0xFTlNfQVBFUlRVUkUsICZkZWZhdWx0X2FwZXJ0dXJlLCAxKTsKKworICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5maWx0ZXJfZGVuc2l0aWVzX2NvdW50KSB7CisgICAgICAgIGZsb2F0IGRlZmF1bHRfZmlsdGVyX2RlbnNpdHkgPSBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5maWx0ZXJfZGVuc2l0aWVzWzBdOworICAgICAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9MRU5TX0ZJTFRFUl9ERU5TSVRZLCAmZGVmYXVsdF9maWx0ZXJfZGVuc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmZpbHRlcl9kZW5zaXRpZXNfY291bnQpOworICAgIH0KKworICAgIGZsb2F0IGRlZmF1bHRfZm9jYWxfbGVuZ3RoID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+Zm9jYWxfbGVuZ3RoOworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0xFTlNfRk9DQUxfTEVOR1RILCAmZGVmYXVsdF9mb2NhbF9sZW5ndGgsIDEpOworCisgICAgaWYgKGZvY3VzTW9kZSA9PSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9PRkYpIHsKKyAgICAgICAgZmxvYXQgZGVmYXVsdF9mb2N1c19kaXN0YW5jZSA9IDA7CisgICAgICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0xFTlNfRk9DVVNfRElTVEFOQ0UsICZkZWZhdWx0X2ZvY3VzX2Rpc3RhbmNlLCAxKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBkZW1vc2FpY01vZGUgPSBBTkRST0lEX0RFTU9TQUlDX01PREVfRkFTVDsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9ERU1PU0FJQ19NT0RFLCAmZGVtb3NhaWNNb2RlLCAxKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGhvdHBpeGVsTW9kZSA9IEFORFJPSURfSE9UX1BJWEVMX01PREVfRkFTVDsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9IT1RfUElYRUxfTU9ERSwgJmhvdHBpeGVsTW9kZSwgMSk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCB0ZXN0cGF0dGVybk1vZGUgPSBBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fTU9ERV9PRkY7CisgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFLCAmdGVzdHBhdHRlcm5Nb2RlLCAxKTsKKworICAgIC8qIGZhY2UgZGV0ZWN0aW9uIChkZWZhdWx0IHRvIE9GRikgKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBmYWNlRGV0ZWN0TW9kZSA9IEFORFJPSURfU1RBVElTVElDU19GQUNFX0RFVEVDVF9NT0RFX09GRjsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX0ZBQ0VfREVURUNUX01PREUsICZmYWNlRGV0ZWN0TW9kZSwgMSk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBoaXN0b2dyYW1Nb2RlID0gQU5EUk9JRF9TVEFUSVNUSUNTX0hJU1RPR1JBTV9NT0RFX09GRjsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX0hJU1RPR1JBTV9NT0RFLCAmaGlzdG9ncmFtTW9kZSwgMSk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBzaGFycG5lc3NNYXBNb2RlID0gQU5EUk9JRF9TVEFUSVNUSUNTX1NIQVJQTkVTU19NQVBfTU9ERV9PRkY7CisgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfU1RBVElTVElDU19TSEFSUE5FU1NfTUFQX01PREUsICZzaGFycG5lc3NNYXBNb2RlLCAxKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGhvdFBpeGVsTWFwTW9kZSA9IEFORFJPSURfU1RBVElTVElDU19IT1RfUElYRUxfTUFQX01PREVfT0ZGOworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX1NUQVRJU1RJQ1NfSE9UX1BJWEVMX01BUF9NT0RFLCAmaG90UGl4ZWxNYXBNb2RlLCAxKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGxlbnNTaGFkaW5nTW9kZSA9IEFORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQX01PREVfT0ZGOworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUF9NT0RFLCAmbGVuc1NoYWRpbmdNb2RlLCAxKTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGJsYWNrTGV2ZWxMb2NrID0gQU5EUk9JRF9CTEFDS19MRVZFTF9MT0NLX09GRjsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9CTEFDS19MRVZFTF9MT0NLLCAmYmxhY2tMZXZlbExvY2ssIDEpOworCisgICAgLyogRXhwb3N1cmUgdGltZShVcGRhdGUgdGhlIE1pbiBFeHBvc3VyZSBUaW1lKSovCisgICAgaW50NjRfdCBkZWZhdWx0X2V4cG9zdXJlX3RpbWUgPSBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5leHBvc3VyZV90aW1lX3JhbmdlWzBdOworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9FWFBPU1VSRV9USU1FLCAmZGVmYXVsdF9leHBvc3VyZV90aW1lLCAxKTsKKworICAgIC8qIGZyYW1lIGR1cmF0aW9uICovCisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgZGVmYXVsdF9mcmFtZV9kdXJhdGlvbiA9IE5TRUNfUEVSXzMzTVNFQzsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9TRU5TT1JfRlJBTUVfRFVSQVRJT04sICZkZWZhdWx0X2ZyYW1lX2R1cmF0aW9uLCAxKTsKKworICAgIC8qIHNlbnNpdGl2aXR5ICovCisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgZGVmYXVsdF9zZW5zaXRpdml0eSA9IDEwMDsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9TRU5TT1JfU0VOU0lUSVZJVFksICZkZWZhdWx0X3NlbnNpdGl2aXR5LCAxKTsKKyNpZm5kZWYgVVNFX0hBTF8zXzMKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBkZWZhdWx0X2lzcF9zZW5zaXRpdml0eSA9CisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5pc3Bfc2Vuc2l0aXZpdHlfcmFuZ2UubWluX3NlbnNpdGl2aXR5OworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfUE9TVF9SQVdfU0VOU0lUSVZJVFlfQk9PU1QsICZkZWZhdWx0X2lzcF9zZW5zaXRpdml0eSwgMSk7CisjZW5kaWYKKworICAgIC8qZWRnZSBtb2RlKi8KKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9FREdFX01PREUsICZlZGdlX21vZGUsIDEpOworCisgICAgLypub2lzZSByZWR1Y3Rpb24gbW9kZSovCisgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfTk9JU0VfUkVEVUNUSU9OX01PREUsICZub2lzZV9yZWRfbW9kZSwgMSk7CisKKyAgICAvKmNvbG9yIGNvcnJlY3Rpb24gbW9kZSovCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29sb3JfY29ycmVjdF9tb2RlID0gQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX01PREVfRkFTVDsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX01PREUsICZjb2xvcl9jb3JyZWN0X21vZGUsIDEpOworCisgICAgLyp0cmFuc2Zvcm0gbWF0cml4IG1vZGUqLworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX1RPTkVNQVBfTU9ERSwgJnRvbmVtYXBfbW9kZSwgMSk7CisKKyAgICBpbnQzMl90IHNjYWxlcl9jcm9wX3JlZ2lvbls0XTsKKyAgICBzY2FsZXJfY3JvcF9yZWdpb25bMF0gPSAwOworICAgIHNjYWxlcl9jcm9wX3JlZ2lvblsxXSA9IDA7CisgICAgc2NhbGVyX2Nyb3BfcmVnaW9uWzJdID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWN0aXZlX2FycmF5X3NpemUud2lkdGg7CisgICAgc2NhbGVyX2Nyb3BfcmVnaW9uWzNdID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWN0aXZlX2FycmF5X3NpemUuaGVpZ2h0OworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9DUk9QX1JFR0lPTiwgc2NhbGVyX2Nyb3BfcmVnaW9uLCA0KTsKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGFudGliYW5kaW5nX21vZGUgPSBBTkRST0lEX0NPTlRST0xfQUVfQU5USUJBTkRJTkdfTU9ERV9BVVRPOworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfQU5USUJBTkRJTkdfTU9ERSwgJmFudGliYW5kaW5nX21vZGUsIDEpOworCisgICAgLypmb2N1cyBkaXN0YW5jZSovCisgICAgZmxvYXQgZm9jdXNfZGlzdGFuY2UgPSAwLjA7CisgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfTEVOU19GT0NVU19ESVNUQU5DRSwgJmZvY3VzX2Rpc3RhbmNlLCAxKTsKKworICAgIC8qdGFyZ2V0IGZwcyByYW5nZTogdXNlIG1heGltdW0gcmFuZ2UgZm9yIHBpY3R1cmUsIGFuZCBtYXhpbXVtIGZpeGVkIHJhbmdlIGZvciB2aWRlbyovCisgICAgZmxvYXQgbWF4X3JhbmdlID0gMC4wOworICAgIGZsb2F0IG1heF9maXhlZF9mcHMgPSAwLjA7CisgICAgaW50MzJfdCBmcHNfcmFuZ2VbMl0gPSB7MCwgMH07CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmZwc19yYW5nZXNfdGJsX2NudDsKKyAgICAgICAgICAgIGkrKykgeworICAgICAgICBmbG9hdCByYW5nZSA9IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmZwc19yYW5nZXNfdGJsW2ldLm1heF9mcHMgLQorICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+ZnBzX3Jhbmdlc190YmxbaV0ubWluX2ZwczsKKyAgICAgICAgaWYgKHR5cGUgPT0gQ0FNRVJBM19URU1QTEFURV9QUkVWSUVXIHx8CisgICAgICAgICAgICAgICAgdHlwZSA9PSBDQU1FUkEzX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkUgfHwKKyAgICAgICAgICAgICAgICB0eXBlID09IENBTUVSQTNfVEVNUExBVEVfWkVST19TSFVUVEVSX0xBRykgeworICAgICAgICAgICAgaWYgKHJhbmdlID4gbWF4X3JhbmdlKSB7CisgICAgICAgICAgICAgICAgZnBzX3JhbmdlWzBdID0KKyAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+ZnBzX3Jhbmdlc190YmxbaV0ubWluX2ZwczsKKyAgICAgICAgICAgICAgICBmcHNfcmFuZ2VbMV0gPQorICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5mcHNfcmFuZ2VzX3RibFtpXS5tYXhfZnBzOworICAgICAgICAgICAgICAgIG1heF9yYW5nZSA9IHJhbmdlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJhbmdlIDwgMC4wMSAmJiBtYXhfZml4ZWRfZnBzIDwKKyAgICAgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+ZnBzX3Jhbmdlc190YmxbaV0ubWF4X2ZwcykgeworICAgICAgICAgICAgICAgIGZwc19yYW5nZVswXSA9CisgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmZwc19yYW5nZXNfdGJsW2ldLm1pbl9mcHM7CisgICAgICAgICAgICAgICAgZnBzX3JhbmdlWzFdID0KKyAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+ZnBzX3Jhbmdlc190YmxbaV0ubWF4X2ZwczsKKyAgICAgICAgICAgICAgICBtYXhfZml4ZWRfZnBzID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+ZnBzX3Jhbmdlc190YmxbaV0ubWF4X2ZwczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FFX1RBUkdFVF9GUFNfUkFOR0UsIGZwc19yYW5nZSwgMik7CisKKyAgICAvKnByZWNhcHR1cmUgdHJpZ2dlciovCisgICAgdWludDhfdCBwcmVjYXB0dXJlX3RyaWdnZXIgPSBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSX0lETEU7CisgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIsICZwcmVjYXB0dXJlX3RyaWdnZXIsIDEpOworCisgICAgLyphZiB0cmlnZ2VyKi8KKyAgICB1aW50OF90IGFmX3RyaWdnZXIgPSBBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUl9JRExFOworICAgIHNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUZfVFJJR0dFUiwgJmFmX3RyaWdnZXIsIDEpOworCisgICAgLyogYWUgJiBhZiByZWdpb25zICovCisgICAgaW50MzJfdCBhY3RpdmVfcmVnaW9uW10gPSB7CisgICAgICAgICAgICBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5hY3RpdmVfYXJyYXlfc2l6ZS5sZWZ0LAorICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWN0aXZlX2FycmF5X3NpemUudG9wLAorICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWN0aXZlX2FycmF5X3NpemUubGVmdCArCisgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmFjdGl2ZV9hcnJheV9zaXplLndpZHRoLAorICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWN0aXZlX2FycmF5X3NpemUudG9wICsKKyAgICAgICAgICAgICAgICAgICAgZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWN0aXZlX2FycmF5X3NpemUuaGVpZ2h0LAorICAgICAgICAgICAgMH07CisgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9SRUdJT05TLCBhY3RpdmVfcmVnaW9uLAorICAgICAgICAgICAgc2l6ZW9mKGFjdGl2ZV9yZWdpb24pIC8gc2l6ZW9mKGFjdGl2ZV9yZWdpb25bMF0pKTsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FGX1JFR0lPTlMsIGFjdGl2ZV9yZWdpb24sCisgICAgICAgICAgICBzaXplb2YoYWN0aXZlX3JlZ2lvbikgLyBzaXplb2YoYWN0aXZlX3JlZ2lvblswXSkpOworCisgICAgLyogYmxhY2sgbGV2ZWwgbG9jayAqLworICAgIHVpbnQ4X3QgYmxhY2tsZXZlbF9sb2NrID0gQU5EUk9JRF9CTEFDS19MRVZFTF9MT0NLX09GRjsKKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9CTEFDS19MRVZFTF9MT0NLLCAmYmxhY2tsZXZlbF9sb2NrLCAxKTsKKworICAgIC8qIGxlbnMgc2hhZGluZyBtYXAgbW9kZSAqLworICAgIHVpbnQ4X3Qgc2hhZGluZ21hcF9tb2RlID0gQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVBfTU9ERV9PRkY7CisgICAgaWYgKENBTV9TRU5TT1JfUkFXID09IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnNlbnNvcl90eXBlLnNlbnNfdHlwZSkgeworICAgICAgICBzaGFkaW5nbWFwX21vZGUgPSBBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUF9NT0RFX09OOworICAgIH0KKyAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVBfTU9ERSwgJnNoYWRpbmdtYXBfbW9kZSwgMSk7CisKKyAgICAvL3NwZWNpYWwgZGVmYXVsdHMgZm9yIG1hbnVhbCB0ZW1wbGF0ZQorICAgIGlmICh0eXBlID09IENBTUVSQTNfVEVNUExBVEVfTUFOVUFMKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG1hbnVhbENvbnRyb2xNb2RlID0gQU5EUk9JRF9DT05UUk9MX01PREVfT0ZGOworICAgICAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX01PREUsICZtYW51YWxDb250cm9sTW9kZSwgMSk7CisKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgbWFudWFsRm9jdXNNb2RlID0gQU5EUk9JRF9DT05UUk9MX0FGX01PREVfT0ZGOworICAgICAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FGX01PREUsICZtYW51YWxGb2N1c01vZGUsIDEpOworCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG1hbnVhbEFlTW9kZSA9IEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09GRjsKKyAgICAgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9NT0RFLCAmbWFudWFsQWVNb2RlLCAxKTsKKworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBtYW51YWxBd2JNb2RlID0gQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFX09GRjsKKyAgICAgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSwgJm1hbnVhbEF3Yk1vZGUsIDEpOworCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG1hbnVhbFRvbmVtYXBNb2RlID0gQU5EUk9JRF9UT05FTUFQX01PREVfRkFTVDsKKyAgICAgICAgc2V0dGluZ3MudXBkYXRlKEFORFJPSURfVE9ORU1BUF9NT0RFLCAmbWFudWFsVG9uZW1hcE1vZGUsIDEpOworCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG1hbnVhbENvbG9yQ29ycmVjdE1vZGUgPSBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERV9UUkFOU0ZPUk1fTUFUUklYOworICAgICAgICBzZXR0aW5ncy51cGRhdGUoQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX01PREUsICZtYW51YWxDb2xvckNvcnJlY3RNb2RlLCAxKTsKKyAgICB9CisKKworICAgIC8qIFROUgorICAgICAqIFdlJ2xsIHVzZSB0aGlzIGxvY2F0aW9uIHRvIGRldGVybWluZSB3aGljaCBtb2RlcyBUTlIgd2lsbCBiZSBzZXQuCisgICAgICogV2Ugd2lsbCBlbmFibGUgVE5SIHRvIGJlIG9uIGlmIGVpdGhlciBvZiB0aGUgUHJldmlldy9WaWRlbyBzdHJlYW0gcmVxdWlyZXMgVE5SCisgICAgICogVGhpcyBpcyBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBsaW5raW5nIG9uIGEgcGVyIHN0cmVhbSBiYXNpcyB0aGF0IGRlY2lzaW9uCisgICAgICogaXMgc3RpbGwgb24gcGVyLXNlc3Npb24gYmFzaXMgYW5kIHdpbGwgYmUgaGFuZGxlZCBhcyBwYXJ0IG9mIGNvbmZpZyBzdHJlYW0KKyAgICAgKi8KKyAgICB1aW50OF90IHRucl9lbmFibGUgPSAwOworCisgICAgaWYgKG1fYlRuclByZXZpZXcgfHwgbV9iVG5yVmlkZW8pIHsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19URU1QTEFURV9WSURFT19SRUNPUkQ6CisgICAgICAgICAgICAgICAgICAgIHRucl9lbmFibGUgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdG5yX2VuYWJsZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB0bnJfcHJvY2Vzc190eXBlID0gKGludDMyX3QpZ2V0VGVtcG9yYWxEZW5vaXNlUHJvY2Vzc1BsYXRlKCk7CisgICAgICAgIHNldHRpbmdzLnVwZGF0ZShRQ0FNRVJBM19URU1QT1JBTF9ERU5PSVNFX0VOQUJMRSwgJnRucl9lbmFibGUsIDEpOworICAgICAgICBzZXR0aW5ncy51cGRhdGUoUUNBTUVSQTNfVEVNUE9SQUxfREVOT0lTRV9QUk9DRVNTX1RZUEUsICZ0bnJfcHJvY2Vzc190eXBlLCAxKTsKKworICAgICAgICBMT0dEKCJUTlI6JWQgd2l0aCBwcm9jZXNzIHBsYXRlICVkIGZvciB0ZW1wbGF0ZTolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRucl9lbmFibGUsIHRucl9wcm9jZXNzX3R5cGUsIHR5cGUpOworICAgIH0KKworICAgIC8vVXBkYXRlIExpbmsgdGFncyB0byBkZWZhdWx0CisgICAgaW50MzJfdCBzeW5jX3R5cGUgPSBDQU1fVFlQRV9TVEFOREFMT05FOworICAgIHNldHRpbmdzLnVwZGF0ZShRQ0FNRVJBM19EVUFMQ0FNX0xJTktfRU5BQkxFLCAmc3luY190eXBlLCAxKTsKKworICAgIGludDMyX3QgaXNfbWFpbiA9IDA7IC8vdGhpcyBkb2Vzbid0IG1hdHRlciBhcyBhcHAgc2hvdWxkIG92ZXJ3cml0ZQorICAgIHNldHRpbmdzLnVwZGF0ZShRQ0FNRVJBM19EVUFMQ0FNX0xJTktfSVNfTUFJTiwgJmlzX21haW4sIDEpOworCisgICAgc2V0dGluZ3MudXBkYXRlKFFDQU1FUkEzX0RVQUxDQU1fTElOS19SRUxBVEVEX0NBTUVSQV9JRCwgJmlzX21haW4sIDEpOworCisgICAgLyogQ0RTIGRlZmF1bHQgKi8KKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBtZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLkNEUyIsIHByb3AsICJBdXRvIik7CisgICAgY2FtX2Nkc19tb2RlX3R5cGVfdCBjZHNfbW9kZSA9IENBTV9DRFNfTU9ERV9BVVRPOworICAgIGNkc19tb2RlID0gbG9va3VwUHJvcChDRFNfTUFQLCBNRVRBREFUQV9NQVBfU0laRShDRFNfTUFQKSwgcHJvcCk7CisgICAgaWYgKENBTV9DRFNfTU9ERV9NQVggPT0gY2RzX21vZGUpIHsKKyAgICAgICAgY2RzX21vZGUgPSBDQU1fQ0RTX01PREVfQVVUTzsKKyAgICB9CisKKyAgICAvKiBEaXNhYmxpbmcgQ0RTIGluIHRlbXBsYXRlcyB3aGljaCBoYXZlIFROUiBlbmFibGVkKi8KKyAgICBpZiAodG5yX2VuYWJsZSkKKyAgICAgICAgY2RzX21vZGUgPSBDQU1fQ0RTX01PREVfT0ZGOworCisgICAgaW50MzJfdCBtb2RlID0gY2RzX21vZGU7CisgICAgc2V0dGluZ3MudXBkYXRlKFFDQU1FUkEzX0NEU19NT0RFLCAmbW9kZSwgMSk7CisKKyAgICBpbnQzMl90IGhkcl9tb2RlID0gKGludDMyX3QpUUNBTUVSQTNfVklERU9fSERSX01PREVfT0ZGOworICAgIHNldHRpbmdzLnVwZGF0ZShRQ0FNRVJBM19WSURFT19IRFJfTU9ERSwgJmhkcl9tb2RlLCAxKTsKKworICAgIC8qIElSIE1vZGUgRGVmYXVsdCBPZmYgKi8KKyAgICBpbnQzMl90IGlyX21vZGUgPSAoaW50MzJfdClRQ0FNRVJBM19JUl9NT0RFX09GRjsKKyAgICBzZXR0aW5ncy51cGRhdGUoUUNBTUVSQTNfSVJfTU9ERSwgJmlyX21vZGUsIDEpOworCisgICAgLyogTWFudWFsIENvbnZlcmdlbmNlIEFFQyBTcGVlZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Ki8KKyAgICBmbG9hdCBkZWZhdWx0X2FlY19zcGVlZCA9IDA7CisgICAgc2V0dGluZ3MudXBkYXRlKFFDQU1FUkEzX0FFQ19DT05WRVJHRU5DRV9TUEVFRCwgJmRlZmF1bHRfYWVjX3NwZWVkLCAxKTsKKworICAgIC8qIE1hbnVhbCBDb252ZXJnZW5jZSBBV0IgU3BlZWQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCovCisgICAgZmxvYXQgZGVmYXVsdF9hd2Jfc3BlZWQgPSAwOworICAgIHNldHRpbmdzLnVwZGF0ZShRQ0FNRVJBM19BV0JfQ09OVkVSR0VOQ0VfU1BFRUQsICZkZWZhdWx0X2F3Yl9zcGVlZCwgMSk7CisKKyAgICBtRGVmYXVsdE1ldGFkYXRhW3R5cGVdID0gc2V0dGluZ3MucmVsZWFzZSgpOworCisgICAgcmV0dXJuIG1EZWZhdWx0TWV0YWRhdGFbdHlwZV07Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0RnJhbWVQYXJhbWV0ZXJzCisgKgorICogREVTQ1JJUFRJT046IHNldCBwYXJhbWV0ZXJzIHBlciBmcmFtZSBhcyByZXF1ZXN0ZWQgaW4gdGhlIG1ldGFkYXRhIGZyb20KKyAqICAgICAgICAgICAgICBmcmFtZXdvcmsKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHJlcXVlc3QgICA6IHJlcXVlc3QgdGhhdCBuZWVkcyB0byBiZSBzZXJ2aWNlZAorICogICBAc3RyZWFtSUQgOiBTdHJlYW0gSUQgb2YgYWxsIHRoZSByZXF1ZXN0ZWQgc3RyZWFtcworICogICBAYmxvYl9yZXF1ZXN0OiBXaGV0aGVyIHRoaXMgcmVxdWVzdCBpcyBhIGJsb2IgcmVxdWVzdCBvciBub3QKKyAqCisgKiBSRVRVUk4gICAgIDogc3VjY2VzczogTk9fRVJST1IKKyAqICAgICAgICAgICAgICBmYWlsdXJlOgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6c2V0RnJhbWVQYXJhbWV0ZXJzKAorICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICpyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX0lEX3Qgc3RyZWFtSUQsCisgICAgICAgICAgICAgICAgICAgIGludCBibG9iX3JlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNuYXBzaG90U3RyZWFtSWQpCit7CisgICAgLyp0cmFuc2xhdGUgZnJvbSBjYW1lcmFfbWV0YWRhdGFfdCB0eXBlIHRvIHBhcm1fdHlwZV90Ki8KKyAgICBpbnQgcmMgPSAwOworICAgIGludDMyX3QgaGFsX3ZlcnNpb24gPSBDQU1fSEFMX1YzOworCisgICAgY2xlYXJfbWV0YWRhdGFfYnVmZmVyKG1QYXJhbWV0ZXJzKTsKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtUGFyYW1ldGVycywgQ0FNX0lOVEZfUEFSTV9IQUxfVkVSU0lPTiwgaGFsX3ZlcnNpb24pKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgaGFsIHZlcnNpb24gaW4gdGhlIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvKndlIG5lZWQgdG8gdXBkYXRlIHRoZSBmcmFtZSBudW1iZXIgaW4gdGhlIHBhcmFtZXRlcnMqLworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1QYXJhbWV0ZXJzLCBDQU1fSU5URl9NRVRBX0ZSQU1FX05VTUJFUiwKKyAgICAgICAgICAgIHJlcXVlc3QtPmZyYW1lX251bWJlcikpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCB0aGUgZnJhbWUgbnVtYmVyIGluIHRoZSBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLyogVXBkYXRlIHN0cmVhbSBpZCBvZiBhbGwgdGhlIHJlcXVlc3RlZCBidWZmZXJzICovCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobVBhcmFtZXRlcnMsIENBTV9JTlRGX01FVEFfU1RSRUFNX0lELCBzdHJlYW1JRCkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBzdHJlYW0gdHlwZSBtYXNrIGluIHRoZSBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1VcGRhdGVEZWJ1Z0xldmVsKSB7CisgICAgICAgIHVpbnQzMl90IGR1bW15RGVidWdMZXZlbCA9IDA7CisgICAgICAgIC8qIFRoZSB2YWx1ZSBvZiBkdW1teURlYnVnTGV2ZWwgaXMgaXJyZWxhdmVudC4gT24KKyAgICAgICAgICogQ0FNX0lOVEZfUEFSTV9VUERBVEVfREVCVUdfTEVWRUwsIHJlYWQgZGVidWcgcHJvcGVydHkgKi8KKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobVBhcmFtZXRlcnMsIENBTV9JTlRGX1BBUk1fVVBEQVRFX0RFQlVHX0xFVkVMLAorICAgICAgICAgICAgICAgIGR1bW15RGVidWdMZXZlbCkpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byBzZXQgVVBEQVRFX0RFQlVHX0xFVkVMIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1VcGRhdGVEZWJ1Z0xldmVsID0gZmFsc2U7CisgICAgfQorCisgICAgaWYocmVxdWVzdC0+c2V0dGluZ3MgIT0gTlVMTCl7CisgICAgICAgIHJjID0gdHJhbnNsYXRlVG9IYWxNZXRhZGF0YShyZXF1ZXN0LCBtUGFyYW1ldGVycywgc25hcHNob3RTdHJlYW1JZCk7CisgICAgICAgIGlmIChibG9iX3JlcXVlc3QpCisgICAgICAgICAgICBtZW1jcHkobVByZXZQYXJhbWV0ZXJzLCBtUGFyYW1ldGVycywgc2l6ZW9mKG1ldGFkYXRhX2J1ZmZlcl90KSk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFJlcHJvY1BhcmFtZXRlcnMKKyAqCisgKiBERVNDUklQVElPTjogVHJhbnNsYXRlIGZyYW1ld29ya3MgbWV0YWRhdGEgdG8gSEFMIG1ldGFkYXRhIHN0cnVjdHVyZSwgYW5kCisgKiAgICAgICAgICAgICAgcmV0dXJuIGl0LgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVxdWVzdCAgIDogcmVxdWVzdCB0aGF0IG5lZWRzIHRvIGJlIHNlcnZpY2VkCisgKgorICogUkVUVVJOICAgICA6IHN1Y2Nlc3M6IE5PX0VSUk9SCisgKiAgICAgICAgICAgICAgZmFpbHVyZToKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpzZXRSZXByb2NQYXJhbWV0ZXJzKAorICAgICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICpyZXF1ZXN0LCBtZXRhZGF0YV9idWZmZXJfdCAqcmVwcm9jUGFyYW0sCisgICAgICAgIHVpbnQzMl90IHNuYXBzaG90U3RyZWFtSWQpCit7CisgICAgLyp0cmFuc2xhdGUgZnJvbSBjYW1lcmFfbWV0YWRhdGFfdCB0eXBlIHRvIHBhcm1fdHlwZV90Ki8KKyAgICBpbnQgcmMgPSAwOworCisgICAgaWYgKE5VTEwgPT0gcmVxdWVzdC0+c2V0dGluZ3MpeworICAgICAgICBMT0dFKCJSZXByb2Nlc3Mgc2V0dGluZ3MgY2Fubm90IGJlIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoTlVMTCA9PSByZXByb2NQYXJhbSkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIHJlcHJvY2Vzc2luZyBtZXRhZGF0YSBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY2xlYXJfbWV0YWRhdGFfYnVmZmVyKHJlcHJvY1BhcmFtKTsKKworICAgIC8qd2UgbmVlZCB0byB1cGRhdGUgdGhlIGZyYW1lIG51bWJlciBpbiB0aGUgcGFyYW1ldGVycyovCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gocmVwcm9jUGFyYW0sIENBTV9JTlRGX01FVEFfRlJBTUVfTlVNQkVSLAorICAgICAgICAgICAgcmVxdWVzdC0+ZnJhbWVfbnVtYmVyKSkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gc2V0IHRoZSBmcmFtZSBudW1iZXIgaW4gdGhlIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByYyA9IHRyYW5zbGF0ZVRvSGFsTWV0YWRhdGEocmVxdWVzdCwgcmVwcm9jUGFyYW0sIHNuYXBzaG90U3RyZWFtSWQpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHRyYW5zbGF0ZSByZXByb2MgcmVxdWVzdCIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgZnJhbWVfc2V0dGluZ3M7CisgICAgZnJhbWVfc2V0dGluZ3MgPSByZXF1ZXN0LT5zZXR0aW5nczsKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKFFDQU1FUkEzX0NST1BfQ09VTlRfUkVQUk9DRVNTKSAmJgorICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZXhpc3RzKFFDQU1FUkEzX0NST1BfUkVQUk9DRVNTKSkgeworICAgICAgICBpbnQzMl90ICpjcm9wX2NvdW50ID0KKyAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKFFDQU1FUkEzX0NST1BfQ09VTlRfUkVQUk9DRVNTKS5kYXRhLmkzMjsKKyAgICAgICAgaW50MzJfdCAqY3JvcF9kYXRhID0KKyAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKFFDQU1FUkEzX0NST1BfUkVQUk9DRVNTKS5kYXRhLmkzMjsKKyAgICAgICAgaW50MzJfdCAqcm9pX21hcCA9CisgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChRQ0FNRVJBM19DUk9QX1JPSV9NQVBfUkVQUk9DRVNTKS5kYXRhLmkzMjsKKyAgICAgICAgaWYgKCgwIDwgKmNyb3BfY291bnQpICYmICgqY3JvcF9jb3VudCA8IE1BWF9OVU1fU1RSRUFNUykpIHsKKyAgICAgICAgICAgIGNhbV9jcm9wX2RhdGFfdCBjcm9wX21ldGE7CisgICAgICAgICAgICBtZW1zZXQoJmNyb3BfbWV0YSwgMCwgc2l6ZW9mKGNhbV9jcm9wX2RhdGFfdCkpOworICAgICAgICAgICAgY3JvcF9tZXRhLm51bV9vZl9zdHJlYW1zID0gMTsKKyAgICAgICAgICAgIGNyb3BfbWV0YS5jcm9wX2luZm9bMF0uY3JvcC5sZWZ0ICAgPSBjcm9wX2RhdGFbMF07CisgICAgICAgICAgICBjcm9wX21ldGEuY3JvcF9pbmZvWzBdLmNyb3AudG9wICAgID0gY3JvcF9kYXRhWzFdOworICAgICAgICAgICAgY3JvcF9tZXRhLmNyb3BfaW5mb1swXS5jcm9wLndpZHRoICA9IGNyb3BfZGF0YVsyXTsKKyAgICAgICAgICAgIGNyb3BfbWV0YS5jcm9wX2luZm9bMF0uY3JvcC5oZWlnaHQgPSBjcm9wX2RhdGFbM107CisKKyAgICAgICAgICAgIGNyb3BfbWV0YS5jcm9wX2luZm9bMF0ucm9pX21hcC5sZWZ0ID0KKyAgICAgICAgICAgICAgICAgICAgcm9pX21hcFswXTsKKyAgICAgICAgICAgIGNyb3BfbWV0YS5jcm9wX2luZm9bMF0ucm9pX21hcC50b3AgPQorICAgICAgICAgICAgICAgICAgICByb2lfbWFwWzFdOworICAgICAgICAgICAgY3JvcF9tZXRhLmNyb3BfaW5mb1swXS5yb2lfbWFwLndpZHRoID0KKyAgICAgICAgICAgICAgICAgICAgcm9pX21hcFsyXTsKKyAgICAgICAgICAgIGNyb3BfbWV0YS5jcm9wX2luZm9bMF0ucm9pX21hcC5oZWlnaHQgPQorICAgICAgICAgICAgICAgICAgICByb2lfbWFwWzNdOworCisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChyZXByb2NQYXJhbSwgQ0FNX0lOVEZfTUVUQV9DUk9QX0RBVEEsIGNyb3BfbWV0YSkpIHsKKyAgICAgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR0QoIkZvdW5kIHJlcHJvY2VzcyBjcm9wIGRhdGEgZm9yIHN0cmVhbSAlcCAlZHglZCwgJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5pbnB1dF9idWZmZXItPnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9tZXRhLmNyb3BfaW5mb1swXS5jcm9wLmxlZnQsCisgICAgICAgICAgICAgICAgICAgIGNyb3BfbWV0YS5jcm9wX2luZm9bMF0uY3JvcC50b3AsCisgICAgICAgICAgICAgICAgICAgIGNyb3BfbWV0YS5jcm9wX2luZm9bMF0uY3JvcC53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9tZXRhLmNyb3BfaW5mb1swXS5jcm9wLmhlaWdodCk7CisgICAgICAgICAgICBMT0dEKCJGb3VuZCByZXByb2Nlc3Mgcm9pIG1hcCBkYXRhIGZvciBzdHJlYW0gJXAgJWR4JWQsICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC0+aW5wdXRfYnVmZmVyLT5zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIGNyb3BfbWV0YS5jcm9wX2luZm9bMF0ucm9pX21hcC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICBjcm9wX21ldGEuY3JvcF9pbmZvWzBdLnJvaV9tYXAudG9wLAorICAgICAgICAgICAgICAgICAgICBjcm9wX21ldGEuY3JvcF9pbmZvWzBdLnJvaV9tYXAud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGNyb3BfbWV0YS5jcm9wX2luZm9bMF0ucm9pX21hcC5oZWlnaHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIHJlcHJvY2VzcyBjcm9wIGNvdW50ICVkISIsICpjcm9wX2NvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJObyBjcm9wIGRhdGEgZnJvbSBtYXRjaGluZyBvdXRwdXQgc3RyZWFtIik7CisgICAgfQorCisgICAgLyogVGhlc2Ugc2V0dGluZ3MgYXJlIG5vdCBuZWVkZWQgZm9yIHJlZ3VsYXIgcmVxdWVzdHMgc28gaGFuZGxlIHRoZW0gc3BlY2lhbGx5IGZvcgorICAgICAgIHJlcHJvY2VzcyByZXF1ZXN0czsgaW5mb3JtYXRpb24gbmVlZGVkIGZvciBFWElGIHRhZ3MgKi8KKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfRkxBU0hfTU9ERSkpIHsKKyAgICAgICAgaW50IHZhbCA9IGxvb2t1cEhhbE5hbWUoRkxBU0hfTU9ERVNfTUFQLCBNRVRBREFUQV9NQVBfU0laRShGTEFTSF9NT0RFU19NQVApLAorICAgICAgICAgICAgICAgICAgICAoaW50KWZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9GTEFTSF9NT0RFKS5kYXRhLnU4WzBdKTsKKyAgICAgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IHZhbCkgeworICAgICAgICAgICAgdWludDMyX3QgZmxhc2hNb2RlID0gKHVpbnQzMl90KXZhbDsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHJlcHJvY1BhcmFtLCBDQU1fSU5URl9NRVRBX0ZMQVNIX01PREUsIGZsYXNoTW9kZSkpIHsKKyAgICAgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIkNvdWxkIG5vdCBtYXAgZndrIGZsYXNoIG1vZGUgJWQgdG8gY29ycmVjdCBoYWwgZmxhc2ggbW9kZSIsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9GTEFTSF9NT0RFKS5kYXRhLnU4WzBdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0goIk5vIGZsYXNoIG1vZGUgaW4gcmVwcm9jZXNzIHNldHRpbmdzIik7CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0ZMQVNIX1NUQVRFKSkgeworICAgICAgICBpbnQzMl90IGZsYXNoU3RhdGUgPSAoaW50MzJfdClmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfRkxBU0hfU1RBVEUpLmRhdGEudThbMF07CisgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHJlcHJvY1BhcmFtLCBDQU1fSU5URl9NRVRBX0ZMQVNIX1NUQVRFLCBmbGFzaFN0YXRlKSkgeworICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dIKCJObyBmbGFzaCBzdGF0ZSBpbiByZXByb2Nlc3Mgc2V0dGluZ3MiKTsKKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKFFDQU1FUkEzX0hBTF9QUklWQVRFREFUQV9SRVBST0NFU1NfRkxBR1MpKSB7CisgICAgICAgIHVpbnQ4X3QgKnJlcHJvY2Vzc0ZsYWdzID0KKyAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoUUNBTUVSQTNfSEFMX1BSSVZBVEVEQVRBX1JFUFJPQ0VTU19GTEFHUykuZGF0YS51ODsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gocmVwcm9jUGFyYW0sIENBTV9JTlRGX01FVEFfUkVQUk9DRVNTX0ZMQUdTLAorICAgICAgICAgICAgICAgICpyZXByb2Nlc3NGbGFncykpIHsKKyAgICAgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFkZCBtZXRhZGF0YSB3aGljaCBERE0gbmVlZHMKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKFFDQU1FUkEzX0hBTF9QUklWQVRFREFUQV9ERE1fREFUQV9CTE9CKSkgeworICAgICAgICBjYW1fZGRtX2luZm9fdCAqZGRtX2luZm8gPQorICAgICAgICAgICAgICAgIChjYW1fZGRtX2luZm9fdCAqKWZyYW1lX3NldHRpbmdzLmZpbmQKKyAgICAgICAgICAgICAgICAoUUNBTUVSQTNfSEFMX1BSSVZBVEVEQVRBX0RETV9EQVRBX0JMT0IpLmRhdGEudTg7CisgICAgICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gocmVwcm9jUGFyYW0sIENBTV9JTlRGX01FVEFfU05BUF9DUk9QX0lORk9fU0VOU09SLAorICAgICAgICAgICAgICAgIGRkbV9pbmZvLT5zZW5zb3JfY3JvcF9pbmZvKTsKKyAgICAgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChyZXByb2NQYXJhbSwgQ0FNX0lOVEZfTUVUQV9TTkFQX0NST1BfSU5GT19DQU1JRiwKKyAgICAgICAgICAgICAgICBkZG1faW5mby0+Y2FtaWZfY3JvcF9pbmZvKTsKKyAgICAgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChyZXByb2NQYXJhbSwgQ0FNX0lOVEZfTUVUQV9TTkFQX0NST1BfSU5GT19JU1AsCisgICAgICAgICAgICAgICAgZGRtX2luZm8tPmlzcF9jcm9wX2luZm8pOworICAgICAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHJlcHJvY1BhcmFtLCBDQU1fSU5URl9NRVRBX1NOQVBfQ1JPUF9JTkZPX0NQUCwKKyAgICAgICAgICAgICAgICBkZG1faW5mby0+Y3BwX2Nyb3BfaW5mbyk7CisgICAgICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gocmVwcm9jUGFyYW0sIENBTV9JTlRGX01FVEFfQUZfRk9DQUxfTEVOR1RIX1JBVElPLAorICAgICAgICAgICAgICAgIGRkbV9pbmZvLT5hZl9mb2NhbF9sZW5ndGhfcmF0aW8pOworICAgICAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHJlcHJvY1BhcmFtLCBDQU1fSU5URl9QQVJNX0ZMSVAsCisgICAgICAgICAgICAgICAgZGRtX2luZm8tPnBpcGVsaW5lX2ZsaXApOworICAgICAgICAvKiBJZiB0aGVyZSBpcyBBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04gaW4gZnJhbWUgc2V0dGluZywKKyAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9ST1RBVElPTiBtZXRhZGF0YSB0aGVuIGhhcyBiZWVuIGFkZGVkIGluCisgICAgICAgICAgIHRyYW5zbGF0ZVRvSGFsTWV0YWRhdGEuIEhBTCBuZWVkIHRvIGtlZXAgdGhpcyBuZXcgcm90YXRpb24KKyAgICAgICAgICAgbWV0YWRhdGEuIE90aGVyd2lzZSwgdGhlIG9sZCByb3RhdGlvbiBpbmZvIHNhdmVkIGluIHRoZSB2ZW5kb3IgdGFnCisgICAgICAgICAgIHdvdWxkIGJlIHVzZWQgKi8KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3JvdGF0aW9uX2luZm9fdCwgcm90YXRpb25JbmZvLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX1BBUk1fUk9UQVRJT04sIHJlcHJvY1BhcmFtKSB7CisgICAgICAgICAgICBMT0dEKCJDQU1fSU5URl9QQVJNX1JPVEFUSU9OIG1ldGFkYXRhIGlzIGFkZGVkIGluIHRyYW5zbGF0ZVRvSGFsTWV0YWRhdGEiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gocmVwcm9jUGFyYW0sIENBTV9JTlRGX1BBUk1fUk9UQVRJT04sCisgICAgICAgICAgICAgICAgICAgIGRkbV9pbmZvLT5yb3RhdGlvbl9pbmZvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFkZCBhZGRpdGlvbmFsIEpQRUcgY3JvcHBpbmcgaW5mb3JtYXRpb24uIEFwcCBhZGQgUUNBTUVSQTNfSlBFR19FTkNPREVfQ1JPUF9SRUNUCisgICAgICAgdG8gYXNrIGZvciBjcm9wcGluZyBhbmQgdXNlIFJPSSBmb3IgZG93bnNjYWxlL3Vwc2NhbGUgZHVyaW5nIEhXIEpQRUcgZW5jb2RpbmcuCisgICAgICAgcm9pLndpZHRoIGFuZCByb2kuaGVpZ2h0IHdvdWxkIGJlIHRoZSBmaW5hbCBKUEVHIHNpemUuCisgICAgICAgRm9yIG5vdywgSEFMIG9ubHkgY2hlY2tzIHRoaXMgZm9yIHJlcHJvY2VzcyByZXF1ZXN0ICovCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhRQ0FNRVJBM19KUEVHX0VOQ09ERV9DUk9QX0VOQUJMRSkgJiYKKyAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmV4aXN0cyhRQ0FNRVJBM19KUEVHX0VOQ09ERV9DUk9QX1JFQ1QpKSB7CisgICAgICAgIHVpbnQ4X3QgKmVuYWJsZSA9CisgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKFFDQU1FUkEzX0pQRUdfRU5DT0RFX0NST1BfRU5BQkxFKS5kYXRhLnU4OworICAgICAgICBpZiAoKmVuYWJsZSA9PSBUUlVFKSB7CisgICAgICAgICAgICBpbnQzMl90ICpjcm9wX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKFFDQU1FUkEzX0pQRUdfRU5DT0RFX0NST1BfUkVDVCkuZGF0YS5pMzI7CisgICAgICAgICAgICBjYW1fc3RyZWFtX2Nyb3BfaW5mb190IGNyb3BfbWV0YTsKKyAgICAgICAgICAgIG1lbXNldCgmY3JvcF9tZXRhLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9jcm9wX2luZm9fdCkpOworICAgICAgICAgICAgY3JvcF9tZXRhLnN0cmVhbV9pZCA9IDA7CisgICAgICAgICAgICBjcm9wX21ldGEuY3JvcC5sZWZ0ICAgPSBjcm9wX2RhdGFbMF07CisgICAgICAgICAgICBjcm9wX21ldGEuY3JvcC50b3AgICAgPSBjcm9wX2RhdGFbMV07CisgICAgICAgICAgICBjcm9wX21ldGEuY3JvcC53aWR0aCAgPSBjcm9wX2RhdGFbMl07CisgICAgICAgICAgICBjcm9wX21ldGEuY3JvcC5oZWlnaHQgPSBjcm9wX2RhdGFbM107CisgICAgICAgICAgICAvLyBUaGUgSlBFRyBjcm9wIHJvaSBzaG91bGQgbWF0Y2ggY3BwIG91dHB1dCBzaXplCisgICAgICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fc3RyZWFtX2Nyb3BfaW5mb190LCBjcHBfY3JvcCwKKyAgICAgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9TTkFQX0NST1BfSU5GT19DUFAsIHJlcHJvY1BhcmFtKSB7CisgICAgICAgICAgICAgICAgY3JvcF9tZXRhLnJvaV9tYXAubGVmdCA9IDA7CisgICAgICAgICAgICAgICAgY3JvcF9tZXRhLnJvaV9tYXAudG9wID0gMDsKKyAgICAgICAgICAgICAgICBjcm9wX21ldGEucm9pX21hcC53aWR0aCA9IGNwcF9jcm9wLT5jcm9wLndpZHRoOworICAgICAgICAgICAgICAgIGNyb3BfbWV0YS5yb2lfbWFwLmhlaWdodCA9IGNwcF9jcm9wLT5jcm9wLmhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gocmVwcm9jUGFyYW0sIENBTV9JTlRGX1BBUk1fSlBFR19FTkNPREVfQ1JPUCwKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9tZXRhKTsKKyAgICAgICAgICAgIExPR0goIkFkZCBKUEVHIGVuY29kZSBjcm9wIGxlZnQgJWQsIHRvcCAlZCwgd2lkdGggJWQsIGhlaWdodCAlZCwgbUNhbWVyYUlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9tZXRhLmNyb3AubGVmdCwgY3JvcF9tZXRhLmNyb3AudG9wLAorICAgICAgICAgICAgICAgICAgICBjcm9wX21ldGEuY3JvcC53aWR0aCwgY3JvcF9tZXRhLmNyb3AuaGVpZ2h0LCBtQ2FtZXJhSWQpOworICAgICAgICAgICAgTE9HSCgiQWRkIEpQRUcgZW5jb2RlIGNyb3AgUk9JIGxlZnQgJWQsIHRvcCAlZCwgd2lkdGggJWQsIGhlaWdodCAlZCwgbUNhbWVyYUlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgY3JvcF9tZXRhLnJvaV9tYXAubGVmdCwgY3JvcF9tZXRhLnJvaV9tYXAudG9wLAorICAgICAgICAgICAgICAgICAgICBjcm9wX21ldGEucm9pX21hcC53aWR0aCwgY3JvcF9tZXRhLnJvaV9tYXAuaGVpZ2h0LCBtQ2FtZXJhSWQpOworCisgICAgICAgICAgICAvLyBBZGQgSlBFRyBzY2FsZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90IHNjYWxlX2RpbTsKKyAgICAgICAgICAgIG1lbXNldCgmc2NhbGVfZGltLCAwLCBzaXplb2YoY2FtX2RpbWVuc2lvbl90KSk7CisgICAgICAgICAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKFFDQU1FUkEzX0pQRUdfRU5DT0RFX0NST1BfUk9JKSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgKnJvaSA9CisgICAgICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoUUNBTUVSQTNfSlBFR19FTkNPREVfQ1JPUF9ST0kpLmRhdGEuaTMyOworICAgICAgICAgICAgICAgIHNjYWxlX2RpbS53aWR0aCA9IHJvaVsyXTsKKyAgICAgICAgICAgICAgICBzY2FsZV9kaW0uaGVpZ2h0ID0gcm9pWzNdOworICAgICAgICAgICAgICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gocmVwcm9jUGFyYW0sIENBTV9JTlRGX1BBUk1fSlBFR19TQ0FMRV9ESU1FTlNJT04sCisgICAgICAgICAgICAgICAgICAgIHNjYWxlX2RpbSk7CisgICAgICAgICAgICAgICAgTE9HSCgiQWRkIEpQRUcgZW5jb2RlIHNjYWxlIHdpZHRoICVkLCBoZWlnaHQgJWQsIG1DYW1lcmFJZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIHNjYWxlX2RpbS53aWR0aCwgc2NhbGVfZGltLmhlaWdodCwgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzYXZlUmVxdWVzdFNldHRpbmdzCisgKgorICogREVTQ1JJUFRJT046IEFkZCBhbnkgc2V0dGluZ3MgdGhhdCBtaWdodCBoYXZlIGNoYW5nZWQgdG8gdGhlIHJlcXVlc3Qgc2V0dGluZ3MKKyAqICAgICAgICAgICAgICBhbmQgc2F2ZSB0aGUgc2V0dGluZ3MgdG8gYmUgYXBwbGllZCBvbiB0aGUgZnJhbWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGpwZWdNZXRhZGF0YSA6IHRoZSBleHRyYWN0ZWQgYW5kL29yIG1vZGlmaWVkIGpwZWcgbWV0YWRhdGEKKyAqICAgQHJlcXVlc3QgICAgICA6IHJlcXVlc3Qgd2l0aCBpbml0aWFsIHNldHRpbmdzCisgKgorICogUkVUVVJOICAgICA6CisgKiBjYW1lcmFfbWV0YWRhdGFfdCogOiBwb2ludGVyIHRvIHRoZSBzYXZlZCByZXF1ZXN0IHNldHRpbmdzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2NhbWVyYV9tZXRhZGF0YV90KiBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpzYXZlUmVxdWVzdFNldHRpbmdzKAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSAmanBlZ01ldGFkYXRhLAorICAgICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICpyZXF1ZXN0KQoreworICAgIGNhbWVyYV9tZXRhZGF0YV90ICpyZXN1bHRNZXRhZGF0YTsKKyAgICBDYW1lcmFNZXRhZGF0YSBjYW1NZXRhZGF0YTsKKyAgICBjYW1NZXRhZGF0YSA9IHJlcXVlc3QtPnNldHRpbmdzOworCisgICAgaWYgKGpwZWdNZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9KUEVHX1RIVU1CTkFJTF9TSVpFKSkgeworICAgICAgICBpbnQzMl90IHRodW1ibmFpbF9zaXplWzJdOworICAgICAgICB0aHVtYm5haWxfc2l6ZVswXSA9IGpwZWdNZXRhZGF0YS5maW5kKEFORFJPSURfSlBFR19USFVNQk5BSUxfU0laRSkuZGF0YS5pMzJbMF07CisgICAgICAgIHRodW1ibmFpbF9zaXplWzFdID0ganBlZ01ldGFkYXRhLmZpbmQoQU5EUk9JRF9KUEVHX1RIVU1CTkFJTF9TSVpFKS5kYXRhLmkzMlsxXTsKKyAgICAgICAgY2FtTWV0YWRhdGEudXBkYXRlKEFORFJPSURfSlBFR19USFVNQk5BSUxfU0laRSwgdGh1bWJuYWlsX3NpemUsCisgICAgICAgICAgICAgICAganBlZ01ldGFkYXRhLmZpbmQoQU5EUk9JRF9KUEVHX1RIVU1CTkFJTF9TSVpFKS5jb3VudCk7CisgICAgfQorCisgICAgaWYgKHJlcXVlc3QtPmlucHV0X2J1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIHVpbnQ4X3QgcmVwcm9jZXNzRmxhZ3MgPSAxOworICAgICAgICBjYW1NZXRhZGF0YS51cGRhdGUoUUNBTUVSQTNfSEFMX1BSSVZBVEVEQVRBX1JFUFJPQ0VTU19GTEFHUywKKyAgICAgICAgICAgICAgICAodWludDhfdCopJnJlcHJvY2Vzc0ZsYWdzLAorICAgICAgICAgICAgICAgIHNpemVvZihyZXByb2Nlc3NGbGFncykpOworICAgIH0KKworICAgIHJlc3VsdE1ldGFkYXRhID0gY2FtTWV0YWRhdGEucmVsZWFzZSgpOworICAgIHJldHVybiByZXN1bHRNZXRhZGF0YTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRIYWxGcHNSYW5nZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgRlBTIHJhbmdlIHBhcmFtZXRlcgorICoKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHNldHRpbmdzICAgIDogTWV0YWRhdGEgZnJvbSBmcmFtZXdvcmsKKyAqICAgQGhhbF9tZXRhZGF0YTogTWV0YWRhdGEgYnVmZmVyCisgKgorICoKKyAqIFJFVFVSTiAgICAgOiBzdWNjZXNzOiBOT19FUlJPUgorICogICAgICAgICAgICAgIGZhaWx1cmU6CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6c2V0SGFsRnBzUmFuZ2UoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnNldHRpbmdzLAorICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCAqaGFsX21ldGFkYXRhKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBjYW1fZnBzX3JhbmdlX3QgZnBzX3JhbmdlOworICAgIGZwc19yYW5nZS5taW5fZnBzID0gKGZsb2F0KQorICAgICAgICAgICAgc2V0dGluZ3MuZmluZChBTkRST0lEX0NPTlRST0xfQUVfVEFSR0VUX0ZQU19SQU5HRSkuZGF0YS5pMzJbMF07CisgICAgZnBzX3JhbmdlLm1heF9mcHMgPSAoZmxvYXQpCisgICAgICAgICAgICBzZXR0aW5ncy5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9UQVJHRVRfRlBTX1JBTkdFKS5kYXRhLmkzMlsxXTsKKyAgICBmcHNfcmFuZ2UudmlkZW9fbWluX2ZwcyA9IGZwc19yYW5nZS5taW5fZnBzOworICAgIGZwc19yYW5nZS52aWRlb19tYXhfZnBzID0gZnBzX3JhbmdlLm1heF9mcHM7CisKKyAgICBMT0dEKCJhZVRhcmdldEZwc1JhbmdlIGZwczogWyVmICVmXSIsCisgICAgICAgICAgICBmcHNfcmFuZ2UubWluX2ZwcywgZnBzX3JhbmdlLm1heF9mcHMpOworICAgIC8qIEluIENPTlNUUkFJTkVEX0hGUl9NT0RFLCBzZW5zb3JfZnBzIGlzIGRlcml2ZWQgZnJvbSBhZVRhcmdldEZwc1JhbmdlIGFzCisgICAgICogZm9sbG93czoKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICogICAgICBWaWRlbyBzdHJlYW0gaXMgYWJzZW50IGluIGNvbmZpZ3VyZV9zdHJlYW1zICAgICAgICAgICAgICAgfAorICAgICAqICAgIChDYW1jb3JkZXIgcHJldmlldyBiZWZvcmUgdGhlIGZpcnN0IHZpZGVvIHJlY29yZCAgICAgICAgICAgIHwKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICogdmlkX2J1Zl9yZXF1ZXN0ZWQgfCBhZVRndEZwc1JuZyB8IHNuc3JGcHNNb2RlIHwgc2Vuc29yRnBzUmFuZ2UgfAorICAgICAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IHZpZF9taW4vbWF4X2Zwc3wKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICogICAgICAgIE5PICAgICAgICAgfCAgWyAzMCwgMjQwXSB8ICAgICAyNDAgICAgIHwgIFsyNDAsIDI0MF0gICAgfAorICAgICAqICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKiAgICAgICAgICAgICAgICAgICB8ICBbMjQwLCAyNDBdIHwgICAgIDI0MCAgICAgfCAgWzI0MCwgMjQwXSAgICB8CisgICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqICAgICBWaWRlbyBzdHJlYW0gaXMgcHJlc2VudCBpbiBjb25maWd1cmVfc3RyZWFtcyAgICAgICAgICAgICAgIHwKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICogdmlkX2J1Zl9yZXF1ZXN0ZWQgfCBhZVRndEZwc1JuZyB8IHNuc3JGcHNNb2RlIHwgc2Vuc29yRnBzUmFuZ2UgfAorICAgICAqICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICB8IHZpZF9taW4vbWF4X2Zwc3wKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICogICAgICAgIE5PICAgICAgICAgfCAgWyAzMCwgMjQwXSB8ICAgICAyNDAgICAgIHwgIFsyNDAsIDI0MF0gICAgfAorICAgICAqIChjYW1jb3JkZXIgcHJldiAgIHwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKiAgYWZ0ZXIgdmlkZW8gcmVjICB8ICBbMjQwLCAyNDBdIHwgICAgIDI0MCAgICAgfCAgWzI0MCwgMjQwXSAgICB8CisgICAgICogIGlzIHN0b3BwZWQpICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAorICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKKyAgICAgKiAgICAgICBZRVMgICAgICAgICB8ICBbIDMwLCAyNDBdIHwgICAgIDI0MCAgICAgfCAgWzI0MCwgMjQwXSAgICB8CisgICAgICogICAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tfAorICAgICAqICAgICAgICAgICAgICAgICAgIHwgIFsyNDAsIDI0MF0gfCAgICAgMjQwICAgICB8ICBbMjQwLCAyNDBdICAgIHwKKyAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgICAgICogV2hlbiBWaWRlbyBzdHJlYW0gaXMgYWJzZW50IGluIGNvbmZpZ3VyZV9zdHJlYW1zLAorICAgICAqIHByZXZpZXcgZnBzID0gc2Vuc29yX2ZwcyAvIGJhdGNoc2l6ZQorICAgICAqIEVnOiBmb3IgMjQwZnBzIGF0IGJhdGNoU2l6ZSA0LCBwcmV2aWV3ID0gNjBmcHMKKyAgICAgKiAgICAgZm9yIDEyMGZwcyBhdCBiYXRjaFNpemUgNCwgcHJldmlldyA9IDMwZnBzCisgICAgICoKKyAgICAgKiBXaGVuIHZpZGVvIHN0cmVhbSBpcyBwcmVzZW50IGluIGNvbmZpZ3VyZV9zdHJlYW1zLCBwcmV2aWV3IGZwcyBpcyBhcyBwZXIKKyAgICAgKiB0aGUgcmF0aW8gb2YgcHJldmlldyBidWZmZXJzIHRvIHZpZGVvIGJ1ZmZlcnMgcmVxdWVzdGVkIGluIHByb2Nlc3MKKyAgICAgKiBjYXB0dXJlIHJlcXVlc3QKKyAgICAgKi8KKyAgICBtQmF0Y2hTaXplID0gMDsKKyAgICBpZiAoQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9DT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUgPT0gbU9wTW9kZSkgeworICAgICAgICBmcHNfcmFuZ2UubWluX2ZwcyA9IGZwc19yYW5nZS52aWRlb19tYXhfZnBzOworICAgICAgICBmcHNfcmFuZ2UudmlkZW9fbWluX2ZwcyA9IGZwc19yYW5nZS52aWRlb19tYXhfZnBzOworICAgICAgICBpbnQgdmFsID0gbG9va3VwSGFsTmFtZShIRlJfTU9ERV9NQVAsIE1FVEFEQVRBX01BUF9TSVpFKEhGUl9NT0RFX01BUCksCisgICAgICAgICAgICAgICAgZnBzX3JhbmdlLm1heF9mcHMpOworICAgICAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gdmFsKSB7CisgICAgICAgICAgICBjYW1faGZyX21vZGVfdCBoZnJNb2RlID0gKGNhbV9oZnJfbW9kZV90KXZhbDsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfUEFSTV9IRlIsIGhmck1vZGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZwc19yYW5nZS5tYXhfZnBzID49IE1JTl9GUFNfRk9SX0JBVENIX01PREUpIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBiYXRjaG1vZGUgaXMgY3VycmVudGx5IGluIHByb2dyZXNzIGFuZCB0aGUgZnBzIGNoYW5nZXMsCisgICAgICAgICAgICAgICAgICogc2V0IHRoZSBmbGFnIHRvIHJlc3RhcnQgdGhlIHNlbnNvciAqLworICAgICAgICAgICAgICAgIGlmKChtSEZSVmlkZW9GcHMgPj0gTUlOX0ZQU19GT1JfQkFUQ0hfTU9ERSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChtSEZSVmlkZW9GcHMgIT0gZnBzX3JhbmdlLm1heF9mcHMpKSB7CisgICAgICAgICAgICAgICAgICAgIG1OZWVkU2Vuc29yUmVzdGFydCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1IRlJWaWRlb0ZwcyA9IGZwc19yYW5nZS5tYXhfZnBzOworICAgICAgICAgICAgICAgIG1CYXRjaFNpemUgPSBtSEZSVmlkZW9GcHMgLyBQUkVWSUVXX0ZQU19GT1JfSEZSOworICAgICAgICAgICAgICAgIGlmIChtQmF0Y2hTaXplID4gTUFYX0hGUl9CQVRDSF9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIG1CYXRjaFNpemUgPSBNQVhfSEZSX0JBVENIX1NJWkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR0QoImhmck1vZGU6ICVkIGJhdGNoU2l6ZTogJWQiLCBoZnJNb2RlLCBtQmF0Y2hTaXplKTsKKworICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEhGUiBtb2RlIGlzIHNlc3Npb24gcGFyYW0gaW4gYmFja2VuZC9JU1AuIFRoaXMgc2hvdWxkIGJlIHJlc2V0IHdoZW4KKyAgICAgICAgICogaW4gbm9uLUhGUiBtb2RlICAqLworICAgICAgICBjYW1faGZyX21vZGVfdCBoZnJNb2RlID0gQ0FNX0hGUl9NT0RFX09GRjsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9QQVJNX0hGUiwgaGZyTW9kZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9QQVJNX0ZQU19SQU5HRSwgZnBzX3JhbmdlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBMT0dEKCJmcHM6IFslZiAlZl0gdmlkX2ZwczogWyVmICVmXSIsIGZwc19yYW5nZS5taW5fZnBzLAorICAgICAgICAgICAgZnBzX3JhbmdlLm1heF9mcHMsIGZwc19yYW5nZS52aWRlb19taW5fZnBzLCBmcHNfcmFuZ2UudmlkZW9fbWF4X2Zwcyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHRyYW5zbGF0ZVRvSGFsTWV0YWRhdGEKKyAqCisgKiBERVNDUklQVElPTjogcmVhZCBmcm9tIHRoZSBjYW1lcmFfbWV0YWRhdGFfdCBhbmQgY2hhbmdlIHRvIHBhcm1fdHlwZV90CisgKgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVxdWVzdCAgOiByZXF1ZXN0IHNlbnQgZnJvbSBmcmFtZXdvcmsKKyAqCisgKgorICogUkVUVVJOICAgICA6IHN1Y2Nlc3M6IE5PX0VSUk9SCisgKiAgICAgICAgICAgICAgZmFpbHVyZToKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OnRyYW5zbGF0ZVRvSGFsTWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfYnVmZmVyX3QgKmhhbF9tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc25hcHNob3RTdHJlYW1JZCkKK3sKKyAgICBpbnQgcmMgPSAwOworICAgIENhbWVyYU1ldGFkYXRhIGZyYW1lX3NldHRpbmdzOworICAgIGZyYW1lX3NldHRpbmdzID0gcmVxdWVzdC0+c2V0dGluZ3M7CisKKyAgICAvKiBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgZm9sbG93aW5nIGxpc3QgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZQorICAgICAqIGRvaW5nLgorICAgICAqIFRoZSBvcmRlciBpcyBsYWlkIG91dCBpbiBzdWNoIGEgd2F5IHRoYXQgcGFyYW1ldGVycyBpbiB0aGUgZnJvbnQgb2YgdGhlIHRhYmxlCisgICAgICogbWF5IGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIHBhcmFtZXRlcnMgbGF0ZXIgaW4gdGhlIHRhYmxlLiBFeGFtcGxlcyBhcmU6CisgICAgICogMS4gTUVUQV9NT0RFIHNob3VsZCBwcmVjZWRlIEFFQy9BV0IvQUYgTU9ERQorICAgICAqIDIuIEFFQyBNT0RFIHNob3VsZCBwcmVjZWQgRVhQT1NVUkVfVElNRS9TRU5TSVRJVklUWS9GUkFNRV9EVVJBVElPTgorICAgICAqIDMuIEFXQl9NT0RFIHNob3VsZCBwcmVjZWRlIENPTE9SX0NPUlJFQ1RJT05fTU9ERQorICAgICAqIDQuIEFueSBtb2RlIHNob3VsZCBwcmVjZWRlIGl0J3MgY29ycmVzcG9uZGluZyBzZXR0aW5ncworICAgICAqLworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9DT05UUk9MX01PREUpKSB7CisgICAgICAgIHVpbnQ4X3QgbWV0YU1vZGUgPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfQ09OVFJPTF9NT0RFKS5kYXRhLnU4WzBdOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX01FVEFfTU9ERSwgbWV0YU1vZGUpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByYyA9IGV4dHJhY3RTY2VuZU1vZGUoZnJhbWVfc2V0dGluZ3MsIG1ldGFNb2RlLCBoYWxfbWV0YWRhdGEpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoImV4dHJhY3RTY2VuZU1vZGUgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BRV9NT0RFKSkgeworICAgICAgICB1aW50OF90IGZ3a19hZU1vZGUgPQorICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0NPTlRST0xfQUVfTU9ERSkuZGF0YS51OFswXTsKKyAgICAgICAgdWludDhfdCBhZU1vZGU7CisgICAgICAgIGludDMyX3QgcmVkZXllOworCisgICAgICAgIGlmIChmd2tfYWVNb2RlID09IEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09GRiApIHsKKyAgICAgICAgICAgIGFlTW9kZSA9IENBTV9BRV9NT0RFX09GRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFlTW9kZSA9IENBTV9BRV9NT0RFX09OOworICAgICAgICB9CisgICAgICAgIGlmIChmd2tfYWVNb2RlID09IEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OX0FVVE9fRkxBU0hfUkVERVlFKSB7CisgICAgICAgICAgICByZWRleWUgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVkZXllID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGludCB2YWwgPSBsb29rdXBIYWxOYW1lKEFFX0ZMQVNIX01PREVfTUFQLCBNRVRBREFUQV9NQVBfU0laRShBRV9GTEFTSF9NT0RFX01BUCksCisgICAgICAgICAgICAgICAgZndrX2FlTW9kZSk7CisgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKKyAgICAgICAgICAgIGludDMyX3QgZmxhc2hNb2RlID0gKGludDMyX3QpdmFsOworICAgICAgICAgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX1BBUk1fTEVEX01PREUsIGZsYXNoTW9kZSk7CisgICAgICAgIH0KKworICAgICAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9BRUNfTU9ERSwgYWVNb2RlKTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9QQVJNX1JFREVZRV9SRURVQ1RJT04sIHJlZGV5ZSkpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQVdCX01PREUpKSB7CisgICAgICAgIHVpbnQ4X3QgZndrX3doaXRlTGV2ZWwgPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSkuZGF0YS51OFswXTsKKyAgICAgICAgaW50IHZhbCA9IGxvb2t1cEhhbE5hbWUoV0hJVEVfQkFMQU5DRV9NT0RFU19NQVAsIE1FVEFEQVRBX01BUF9TSVpFKFdISVRFX0JBTEFOQ0VfTU9ERVNfTUFQKSwKKyAgICAgICAgICAgICAgICBmd2tfd2hpdGVMZXZlbCk7CisgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qgd2hpdGVMZXZlbCA9ICh1aW50OF90KXZhbDsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfUEFSTV9XSElURV9CQUxBTkNFLCB3aGl0ZUxldmVsKSkgeworICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFKSkgeworICAgICAgICB1aW50OF90IGZ3a19jYWNNb2RlID0KKyAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTU9ERSkuZGF0YS51OFswXTsKKyAgICAgICAgaW50IHZhbCA9IGxvb2t1cEhhbE5hbWUoQ09MT1JfQUJFUlJBVElPTl9NQVAsIE1FVEFEQVRBX01BUF9TSVpFKENPTE9SX0FCRVJSQVRJT05fTUFQKSwKKyAgICAgICAgICAgICAgICBmd2tfY2FjTW9kZSk7CisgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKKyAgICAgICAgICAgIGNhbV9hYmVycmF0aW9uX21vZGVfdCBjYWNNb2RlID0gKGNhbV9hYmVycmF0aW9uX21vZGVfdCkgdmFsOworICAgICAgICAgICAgYm9vbCBlbnRyeUF2YWlsYWJsZSA9IEZBTFNFOworICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBGcmFtZXdvcmtzIHNldCBDQUMgbW9kZSBpcyBzdXBwb3J0ZWQgaW4gZGV2aWNlIG9yIG5vdAorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5hYmVycmF0aW9uX21vZGVzX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWJlcnJhdGlvbl9tb2Rlc1tpXSA9PSBjYWNNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5QXZhaWxhYmxlID0gVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HRCgiRnJhbWV3b3Jrc0NhY01vZGU9JWQgZW50cnlBdmFpbGFibGU9JWQiLCBjYWNNb2RlLCBlbnRyeUF2YWlsYWJsZSk7CisgICAgICAgICAgICAvLyBJZiBlbnRyeSBub3QgZm91bmQgdGhlbiBzZXQgdGhlIGRldmljZSBzdXBwb3J0ZWQgbW9kZSBpbnN0ZWFkIG9mIGZyYW1ld29ya3MgbW9kZSBpLmUsCisgICAgICAgICAgICAvLyBPbmx5IEhXIElTUCBDQUMgKyBOTyBTVyBDQUMgOiBBZHZlcnRpc2UgYWxsIDMgd2l0aCBIaWdoIGRvaW5nIHNhbWUgYXMgZmFzdCBieSBJU1AKKyAgICAgICAgICAgIC8vIE5PIEhXIElTUCBDQUMgKyBPbmx5IFNXIENBQyA6IEFkdmVydGlzZSBhbGwgMyB3aXRoIEZhc3QgZG9pbmcgdGhlIHNhbWUgYXMgT0ZGCisgICAgICAgICAgICBpZiAoZW50cnlBdmFpbGFibGUgPT0gRkFMU0UpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+YWJlcnJhdGlvbl9tb2Rlc19jb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNhY01vZGUgPSBDQU1fQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX09GRjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjTW9kZSA9PSBDQU1fQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX0hJR0hfUVVBTElUWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGlnaCBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzbyBzZXQgdGhlIEZBU1QgYXMgc3BlYyBzYXkncyB1bmRlcmx5aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2UgaW1wbGVtZW50YXRpb24gY2FuIGJlIHRoZSBzYW1lIGZvciBib3RoIG1vZGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgY2FjTW9kZSA9IENBTV9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fRkFTVDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYWNNb2RlID09IENBTV9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fRkFTVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFzdCBpcyBub3Qgc3VwcG9ydGVkIGFuZCBzbyB3ZSBjYW5ub3Qgc2V0IEhJR0ggb3IgRkFTVCBidXQgY2hvb3NlIE9GRgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgdGhlIGZwcyBkcm9wIGR1ZSB0byBoaWdoIHF1YWxpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY01vZGUgPSBDQU1fQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX09GRjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhY01vZGUgPSBDQU1fQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX09GRjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR0QoIkZpbmFsIGNhY01vZGUgaXMgJWQiLCBjYWNNb2RlKTsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfUEFSTV9DQUMsIGNhY01vZGUpKSB7CisgICAgICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIGZyYW1ld29yayBDQUMgbW9kZTogJWQiLCBmd2tfY2FjTW9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BRl9NT0RFKSkgeworICAgICAgICB1aW50OF90IGZ3a19mb2N1c01vZGUgPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfQ09OVFJPTF9BRl9NT0RFKS5kYXRhLnU4WzBdOworICAgICAgICBpbnQgdmFsID0gbG9va3VwSGFsTmFtZShGT0NVU19NT0RFU19NQVAsIE1FVEFEQVRBX01BUF9TSVpFKEZPQ1VTX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgZndrX2ZvY3VzTW9kZSk7CisgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgZm9jdXNNb2RlID0gKHVpbnQ4X3QpdmFsOworICAgICAgICAgICAgTE9HRCgic2V0IGZvY3VzIG1vZGUgJWQiLCBmb2N1c01vZGUpOworICAgICAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9QQVJNX0ZPQ1VTX01PREUsIGZvY3VzTW9kZSkpIHsKKyAgICAgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9MRU5TX0ZPQ1VTX0RJU1RBTkNFKSkgeworICAgICAgICBmbG9hdCBmb2NhbERpc3RhbmNlID0gZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0xFTlNfRk9DVVNfRElTVEFOQ0UpLmRhdGEuZlswXTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX0xFTlNfRk9DVVNfRElTVEFOQ0UsCisgICAgICAgICAgICAgICAgZm9jYWxEaXN0YW5jZSkpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQUVfQU5USUJBTkRJTkdfTU9ERSkpIHsKKyAgICAgICAgdWludDhfdCBmd2tfYW50aWJhbmRpbmdNb2RlID0KKyAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9BTlRJQkFORElOR19NT0RFKS5kYXRhLnU4WzBdOworICAgICAgICBpbnQgdmFsID0gbG9va3VwSGFsTmFtZShBTlRJQkFORElOR19NT0RFU19NQVAsCisgICAgICAgICAgICAgICAgTUVUQURBVEFfTUFQX1NJWkUoQU5USUJBTkRJTkdfTU9ERVNfTUFQKSwgZndrX2FudGliYW5kaW5nTW9kZSk7CisgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGhhbF9hbnRpYmFuZGluZ01vZGUgPSAodWludDMyX3QpdmFsOworICAgICAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9QQVJNX0FOVElCQU5ESU5HLAorICAgICAgICAgICAgICAgICAgICBoYWxfYW50aWJhbmRpbmdNb2RlKSkgeworICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQUVfRVhQT1NVUkVfQ09NUEVOU0FUSU9OKSkgeworICAgICAgICBpbnQzMl90IGV4cENvbXBlbnNhdGlvbiA9IGZyYW1lX3NldHRpbmdzLmZpbmQoCisgICAgICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX0FFX0VYUE9TVVJFX0NPTVBFTlNBVElPTikuZGF0YS5pMzJbMF07CisgICAgICAgIGlmIChleHBDb21wZW5zYXRpb24gPCBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5leHBvc3VyZV9jb21wZW5zYXRpb25fbWluKQorICAgICAgICAgICAgZXhwQ29tcGVuc2F0aW9uID0gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+ZXhwb3N1cmVfY29tcGVuc2F0aW9uX21pbjsKKyAgICAgICAgaWYgKGV4cENvbXBlbnNhdGlvbiA+IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmV4cG9zdXJlX2NvbXBlbnNhdGlvbl9tYXgpCisgICAgICAgICAgICBleHBDb21wZW5zYXRpb24gPSBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5leHBvc3VyZV9jb21wZW5zYXRpb25fbWF4OworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX1BBUk1fRVhQT1NVUkVfQ09NUEVOU0FUSU9OLAorICAgICAgICAgICAgICAgIGV4cENvbXBlbnNhdGlvbikpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQUVfTE9DSykpIHsKKyAgICAgICAgdWludDhfdCBhZUxvY2sgPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9MT0NLKS5kYXRhLnU4WzBdOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX1BBUk1fQUVDX0xPQ0ssIGFlTG9jaykpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FFX1RBUkdFVF9GUFNfUkFOR0UpKSB7CisgICAgICAgIHJjID0gc2V0SGFsRnBzUmFuZ2UoZnJhbWVfc2V0dGluZ3MsIGhhbF9tZXRhZGF0YSk7CisgICAgICAgIGlmIChyYyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgic2V0SGFsRnBzUmFuZ2UgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BV0JfTE9DSykpIHsKKyAgICAgICAgdWludDhfdCBhd2JMb2NrID0gZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0NPTlRST0xfQVdCX0xPQ0spLmRhdGEudThbMF07CisgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfUEFSTV9BV0JfTE9DSywgYXdiTG9jaykpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfRUZGRUNUX01PREUpKSB7CisgICAgICAgIHVpbnQ4X3QgZndrX2VmZmVjdE1vZGUgPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfQ09OVFJPTF9FRkZFQ1RfTU9ERSkuZGF0YS51OFswXTsKKyAgICAgICAgaW50IHZhbCA9IGxvb2t1cEhhbE5hbWUoRUZGRUNUX01PREVTX01BUCwgTUVUQURBVEFfTUFQX1NJWkUoRUZGRUNUX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgZndrX2VmZmVjdE1vZGUpOworICAgICAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gdmFsKSB7CisgICAgICAgICAgICB1aW50OF90IGVmZmVjdE1vZGUgPSAodWludDhfdCl2YWw7CisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX1BBUk1fRUZGRUNULCBlZmZlY3RNb2RlKSkgeworICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSkpIHsKKyAgICAgICAgdWludDhfdCBjb2xvckNvcnJlY3RNb2RlID0gZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSkuZGF0YS51OFswXTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX0NPTE9SX0NPUlJFQ1RfTU9ERSwKKyAgICAgICAgICAgICAgICBjb2xvckNvcnJlY3RNb2RlKSkgeworICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9HQUlOUykpIHsKKyAgICAgICAgY2FtX2NvbG9yX2NvcnJlY3RfZ2FpbnNfdCBjb2xvckNvcnJlY3RHYWluczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBDQ19HQUlOX01BWDsgaSsrKSB7CisgICAgICAgICAgICBjb2xvckNvcnJlY3RHYWlucy5nYWluc1tpXSA9CisgICAgICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0dBSU5TKS5kYXRhLmZbaV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX0NPTE9SX0NPUlJFQ1RfR0FJTlMsCisgICAgICAgICAgICAgICAgY29sb3JDb3JyZWN0R2FpbnMpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSkpIHsKKyAgICAgICAgY2FtX2NvbG9yX2NvcnJlY3RfbWF0cml4X3QgY29sb3JDb3JyZWN0VHJhbnNmb3JtOworICAgICAgICBjYW1fcmF0aW9uYWxfdHlwZV90IHRyYW5zZm9ybV9lbGVtOworICAgICAgICBzaXplX3QgbnVtID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBDQ19NQVRSSVhfUk9XUzsgaSsrKSB7CisgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgQ0NfTUFUUklYX0NPTFM7IGorKykgeworICAgICAgICAgICAgICB0cmFuc2Zvcm1fZWxlbS5udW1lcmF0b3IgPQorICAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmRhdGEucltudW1dLm51bWVyYXRvcjsKKyAgICAgICAgICAgICAgdHJhbnNmb3JtX2VsZW0uZGVub21pbmF0b3IgPQorICAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0pLmRhdGEucltudW1dLmRlbm9taW5hdG9yOworICAgICAgICAgICAgICBjb2xvckNvcnJlY3RUcmFuc2Zvcm0udHJhbnNmb3JtX21hdHJpeFtpXVtqXSA9IHRyYW5zZm9ybV9lbGVtOworICAgICAgICAgICAgICBudW0rKzsKKyAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9DT0xPUl9DT1JSRUNUX1RSQU5TRk9STSwKKyAgICAgICAgICAgICAgICBjb2xvckNvcnJlY3RUcmFuc2Zvcm0pKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNhbV90cmlnZ2VyX3QgYWVjVHJpZ2dlcjsKKyAgICBhZWNUcmlnZ2VyLnRyaWdnZXIgPSBDQU1fQUVDX1RSSUdHRVJfSURMRTsKKyAgICBhZWNUcmlnZ2VyLnRyaWdnZXJfaWQgPSAtMTsKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIpJiYKKyAgICAgICAgZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX0lEKSkgeworICAgICAgICBhZWNUcmlnZ2VyLnRyaWdnZXIgPQorICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSKS5kYXRhLnU4WzBdOworICAgICAgICBhZWNUcmlnZ2VyLnRyaWdnZXJfaWQgPQorICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9JRCkuZGF0YS5pMzJbMF07CisgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9BRUNfUFJFQ0FQVFVSRV9UUklHR0VSLAorICAgICAgICAgICAgICAgIGFlY1RyaWdnZXIpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJwcmVjYXB0dXJlVHJpZ2dlcjogJWQgcHJlY2FwdHVyZVRyaWdnZXJJRDogJWQiLAorICAgICAgICAgICAgICAgIGFlY1RyaWdnZXIudHJpZ2dlciwgYWVjVHJpZ2dlci50cmlnZ2VyX2lkKTsKKyAgICB9CisKKyAgICAvKmFmX3RyaWdnZXIgbXVzdCBjb21lIHdpdGggYSB0cmlnZ2VyIGlkKi8KKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSKSAmJgorICAgICAgICBmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVJfSUQpKSB7CisgICAgICAgIGNhbV90cmlnZ2VyX3QgYWZfdHJpZ2dlcjsKKyAgICAgICAgYWZfdHJpZ2dlci50cmlnZ2VyID0KKyAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FGX1RSSUdHRVIpLmRhdGEudThbMF07CisgICAgICAgIGFmX3RyaWdnZXIudHJpZ2dlcl9pZCA9CisgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfQ09OVFJPTF9BRl9UUklHR0VSX0lEKS5kYXRhLmkzMlswXTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX0FGX1RSSUdHRVIsIGFmX3RyaWdnZXIpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJBZlRyaWdnZXI6ICVkIEFmVHJpZ2dlcklEOiAlZCIsCisgICAgICAgICAgICAgICAgYWZfdHJpZ2dlci50cmlnZ2VyLCBhZl90cmlnZ2VyLnRyaWdnZXJfaWQpOworICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9ERU1PU0FJQ19NT0RFKSkgeworICAgICAgICBpbnQzMl90IGRlbW9zYWljID0gZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0RFTU9TQUlDX01PREUpLmRhdGEudThbMF07CisgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9ERU1PU0FJQywgZGVtb3NhaWMpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfRURHRV9NT0RFKSkgeworICAgICAgICBjYW1fZWRnZV9hcHBsaWNhdGlvbl90IGVkZ2VfYXBwbGljYXRpb247CisgICAgICAgIGVkZ2VfYXBwbGljYXRpb24uZWRnZV9tb2RlID0gZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0VER0VfTU9ERSkuZGF0YS51OFswXTsKKyAgICAgICAgaWYgKGVkZ2VfYXBwbGljYXRpb24uZWRnZV9tb2RlID09IENBTV9FREdFX01PREVfT0ZGKSB7CisgICAgICAgICAgICBlZGdlX2FwcGxpY2F0aW9uLnNoYXJwbmVzcyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlZGdlX2FwcGxpY2F0aW9uLnNoYXJwbmVzcyA9IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnNoYXJwbmVzc19jdHJsLmRlZl92YWx1ZTsgLy9kZWZhdWx0CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX0VER0VfTU9ERSwgZWRnZV9hcHBsaWNhdGlvbikpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0ZMQVNIX01PREUpKSB7CisgICAgICAgIGludDMyX3QgcmVzcGVjdEZsYXNoTW9kZSA9IDE7CisgICAgICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FFX01PREUpKSB7CisgICAgICAgICAgICB1aW50OF90IGZ3a19hZU1vZGUgPQorICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FFX01PREUpLmRhdGEudThbMF07CisgICAgICAgICAgICBpZiAoZndrX2FlTW9kZSA+IEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OKSB7CisgICAgICAgICAgICAgICAgcmVzcGVjdEZsYXNoTW9kZSA9IDA7CisgICAgICAgICAgICAgICAgTE9HSCgiQUUgTW9kZSBjb250cm9scyBmbGFzaCwgaWdub3JlIGFuZHJvaWQuZmxhc2gubW9kZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyZXNwZWN0Rmxhc2hNb2RlKSB7CisgICAgICAgICAgICBpbnQgdmFsID0gbG9va3VwSGFsTmFtZShGTEFTSF9NT0RFU19NQVAsIE1FVEFEQVRBX01BUF9TSVpFKEZMQVNIX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgICAgIChpbnQpZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0ZMQVNIX01PREUpLmRhdGEudThbMF0pOworICAgICAgICAgICAgTE9HSCgiZmxhc2ggbW9kZSBhZnRlciBtYXBwaW5nICVkIiwgdmFsKTsKKyAgICAgICAgICAgIC8vIFRvIGNoZWNrOiBDQU1fSU5URl9NRVRBX0ZMQVNIX01PREUgdXNhZ2UKKyAgICAgICAgICAgIGlmIChOQU1FX05PVF9GT1VORCAhPSB2YWwpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGZsYXNoTW9kZSA9ICh1aW50OF90KXZhbDsKKyAgICAgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX1BBUk1fTEVEX01PREUsIGZsYXNoTW9kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0ZMQVNIX0ZJUklOR19QT1dFUikpIHsKKyAgICAgICAgdWludDhfdCBmbGFzaFBvd2VyID0gZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0ZMQVNIX0ZJUklOR19QT1dFUikuZGF0YS51OFswXTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX0ZMQVNIX1BPV0VSLCBmbGFzaFBvd2VyKSkgeworICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfRkxBU0hfRklSSU5HX1RJTUUpKSB7CisgICAgICAgIGludDY0X3QgZmxhc2hGaXJpbmdUaW1lID0gZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0ZMQVNIX0ZJUklOR19USU1FKS5kYXRhLmk2NFswXTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX0ZMQVNIX0ZJUklOR19USU1FLAorICAgICAgICAgICAgICAgIGZsYXNoRmlyaW5nVGltZSkpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0hPVF9QSVhFTF9NT0RFKSkgeworICAgICAgICB1aW50OF90IGhvdFBpeGVsTW9kZSA9IGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9IT1RfUElYRUxfTU9ERSkuZGF0YS51OFswXTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX0hPVFBJWEVMX01PREUsCisgICAgICAgICAgICAgICAgaG90UGl4ZWxNb2RlKSkgeworICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfTEVOU19BUEVSVFVSRSkpIHsKKyAgICAgICAgZmxvYXQgbGVuc0FwZXJ0dXJlID0gZnJhbWVfc2V0dGluZ3MuZmluZCggQU5EUk9JRF9MRU5TX0FQRVJUVVJFKS5kYXRhLmZbMF07CisgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9MRU5TX0FQRVJUVVJFLAorICAgICAgICAgICAgICAgIGxlbnNBcGVydHVyZSkpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0xFTlNfRklMVEVSX0RFTlNJVFkpKSB7CisgICAgICAgIGZsb2F0IGZpbHRlckRlbnNpdHkgPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfTEVOU19GSUxURVJfREVOU0lUWSkuZGF0YS5mWzBdOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX01FVEFfTEVOU19GSUxURVJERU5TSVRZLAorICAgICAgICAgICAgICAgIGZpbHRlckRlbnNpdHkpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9MRU5TX0ZPQ0FMX0xFTkdUSCkpIHsKKyAgICAgICAgZmxvYXQgZm9jYWxMZW5ndGggPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfTEVOU19GT0NBTF9MRU5HVEgpLmRhdGEuZlswXTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX0xFTlNfRk9DQUxfTEVOR1RILAorICAgICAgICAgICAgICAgIGZvY2FsTGVuZ3RoKSkgeworICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfTEVOU19PUFRJQ0FMX1NUQUJJTElaQVRJT05fTU9ERSkpIHsKKyAgICAgICAgdWludDhfdCBvcHRTdGFiTW9kZSA9CisgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0xFTlNfT1BUSUNBTF9TVEFCSUxJWkFUSU9OX01PREUpLmRhdGEudThbMF07CisgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9MRU5TX09QVF9TVEFCX01PREUsCisgICAgICAgICAgICAgICAgb3B0U3RhYk1vZGUpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9DT05UUk9MX1ZJREVPX1NUQUJJTElaQVRJT05fTU9ERSkpIHsKKyAgICAgICAgdWludDhfdCB2aWRlb1N0YWJNb2RlID0KKyAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfQ09OVFJPTF9WSURFT19TVEFCSUxJWkFUSU9OX01PREUpLmRhdGEudThbMF07CisgICAgICAgIExPR0QoInZpZGVvU3RhYk1vZGUgZnJvbSBBUFAgPSAlZCIsIHZpZGVvU3RhYk1vZGUpOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChtUGFyYW1ldGVycywgQ0FNX0lOVEZfTUVUQV9WSURFT19TVEFCX01PREUsCisgICAgICAgICAgICAgICAgdmlkZW9TdGFiTW9kZSkpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfTk9JU0VfUkVEVUNUSU9OX01PREUpKSB7CisgICAgICAgIHVpbnQ4X3Qgbm9pc2VSZWRNb2RlID0gZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX05PSVNFX1JFRFVDVElPTl9NT0RFKS5kYXRhLnU4WzBdOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX01FVEFfTk9JU0VfUkVEVUNUSU9OX01PREUsCisgICAgICAgICAgICAgICAgbm9pc2VSZWRNb2RlKSkgeworICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfUkVQUk9DRVNTX0VGRkVDVElWRV9FWFBPU1VSRV9GQUNUT1IpKSB7CisgICAgICAgIGZsb2F0IHJlcHJvY2Vzc0VmZmVjdGl2ZUV4cG9zdXJlRmFjdG9yID0KKyAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9SRVBST0NFU1NfRUZGRUNUSVZFX0VYUE9TVVJFX0ZBQ1RPUikuZGF0YS5mWzBdOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX01FVEFfRUZGRUNUSVZFX0VYUE9TVVJFX0ZBQ1RPUiwKKyAgICAgICAgICAgICAgICByZXByb2Nlc3NFZmZlY3RpdmVFeHBvc3VyZUZhY3RvcikpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgY2FtX2Nyb3BfcmVnaW9uX3Qgc2NhbGVyQ3JvcFJlZ2lvbjsKKyAgICBib29sIHNjYWxlckNyb3BTZXQgPSBmYWxzZTsKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfU0NBTEVSX0NST1BfUkVHSU9OKSkgeworICAgICAgICBzY2FsZXJDcm9wUmVnaW9uLmxlZnQgPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfU0NBTEVSX0NST1BfUkVHSU9OKS5kYXRhLmkzMlswXTsKKyAgICAgICAgc2NhbGVyQ3JvcFJlZ2lvbi50b3AgPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfU0NBTEVSX0NST1BfUkVHSU9OKS5kYXRhLmkzMlsxXTsKKyAgICAgICAgc2NhbGVyQ3JvcFJlZ2lvbi53aWR0aCA9IGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQ1JPUF9SRUdJT04pLmRhdGEuaTMyWzJdOworICAgICAgICBzY2FsZXJDcm9wUmVnaW9uLmhlaWdodCA9IGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQ1JPUF9SRUdJT04pLmRhdGEuaTMyWzNdOworCisgICAgICAgIC8vIE1hcCBjb29yZGluYXRlIHN5c3RlbSBmcm9tIGFjdGl2ZSBhcnJheSB0byBzZW5zb3Igb3V0cHV0LgorICAgICAgICBtQ3JvcFJlZ2lvbk1hcHBlci50b1NlbnNvcihzY2FsZXJDcm9wUmVnaW9uLmxlZnQsIHNjYWxlckNyb3BSZWdpb24udG9wLAorICAgICAgICAgICAgICAgIHNjYWxlckNyb3BSZWdpb24ud2lkdGgsIHNjYWxlckNyb3BSZWdpb24uaGVpZ2h0KTsKKworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX01FVEFfU0NBTEVSX0NST1BfUkVHSU9OLAorICAgICAgICAgICAgICAgIHNjYWxlckNyb3BSZWdpb24pKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBzY2FsZXJDcm9wU2V0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfU0VOU09SX0VYUE9TVVJFX1RJTUUpKSB7CisgICAgICAgIGludDY0X3Qgc2Vuc29yRXhwVGltZSA9CisgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX1NFTlNPUl9FWFBPU1VSRV9USU1FKS5kYXRhLmk2NFswXTsKKyAgICAgICAgTE9HRCgic2V0dGluZyBzZW5zb3JFeHBUaW1lICVsbGQiLCBzZW5zb3JFeHBUaW1lKTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX1NFTlNPUl9FWFBPU1VSRV9USU1FLAorICAgICAgICAgICAgICAgIHNlbnNvckV4cFRpbWUpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9TRU5TT1JfRlJBTUVfRFVSQVRJT04pKSB7CisgICAgICAgIGludDY0X3Qgc2Vuc29yRnJhbWVEdXJhdGlvbiA9CisgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX1NFTlNPUl9GUkFNRV9EVVJBVElPTikuZGF0YS5pNjRbMF07CisgICAgICAgIGludDY0X3QgbWluRnJhbWVEdXJhdGlvbiA9IGdldE1pbkZyYW1lRHVyYXRpb24ocmVxdWVzdCk7CisgICAgICAgIHNlbnNvckZyYW1lRHVyYXRpb24gPSBNQVgoc2Vuc29yRnJhbWVEdXJhdGlvbiwgbWluRnJhbWVEdXJhdGlvbik7CisgICAgICAgIGlmIChzZW5zb3JGcmFtZUR1cmF0aW9uID4gZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+bWF4X2ZyYW1lX2R1cmF0aW9uKQorICAgICAgICAgICAgc2Vuc29yRnJhbWVEdXJhdGlvbiA9IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPm1heF9mcmFtZV9kdXJhdGlvbjsKKyAgICAgICAgTE9HRCgiY2xhbXAgc2Vuc29yRnJhbWVEdXJhdGlvbiB0byAlbGxkIiwgc2Vuc29yRnJhbWVEdXJhdGlvbik7CisgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9TRU5TT1JfRlJBTUVfRFVSQVRJT04sCisgICAgICAgICAgICAgICAgc2Vuc29yRnJhbWVEdXJhdGlvbikpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX1NFTlNPUl9TRU5TSVRJVklUWSkpIHsKKyAgICAgICAgaW50MzJfdCBzZW5zb3JTZW5zaXRpdml0eSA9IGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9TRU5TT1JfU0VOU0lUSVZJVFkpLmRhdGEuaTMyWzBdOworICAgICAgICBpZiAoc2Vuc29yU2Vuc2l0aXZpdHkgPCBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5zZW5zaXRpdml0eV9yYW5nZS5taW5fc2Vuc2l0aXZpdHkpCisgICAgICAgICAgICAgICAgc2Vuc29yU2Vuc2l0aXZpdHkgPSBnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5zZW5zaXRpdml0eV9yYW5nZS5taW5fc2Vuc2l0aXZpdHk7CisgICAgICAgIGlmIChzZW5zb3JTZW5zaXRpdml0eSA+IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnNlbnNpdGl2aXR5X3JhbmdlLm1heF9zZW5zaXRpdml0eSkKKyAgICAgICAgICAgICAgICBzZW5zb3JTZW5zaXRpdml0eSA9IGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnNlbnNpdGl2aXR5X3JhbmdlLm1heF9zZW5zaXRpdml0eTsKKyAgICAgICAgTE9HRCgiY2xhbXAgc2Vuc29yU2Vuc2l0aXZpdHkgdG8gJWQiLCBzZW5zb3JTZW5zaXRpdml0eSk7CisgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9TRU5TT1JfU0VOU0lUSVZJVFksCisgICAgICAgICAgICAgICAgc2Vuc29yU2Vuc2l0aXZpdHkpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworI2lmbmRlZiBVU0VfSEFMXzNfMworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NUKSkgeworICAgICAgICBpbnQzMl90IGlzcFNlbnNpdGl2aXR5ID0KKyAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NUKS5kYXRhLmkzMlswXTsKKyAgICAgICAgaWYgKGlzcFNlbnNpdGl2aXR5IDwKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmlzcF9zZW5zaXRpdml0eV9yYW5nZS5taW5fc2Vuc2l0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICBpc3BTZW5zaXRpdml0eSA9CisgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmlzcF9zZW5zaXRpdml0eV9yYW5nZS5taW5fc2Vuc2l0aXZpdHk7CisgICAgICAgICAgICAgICAgTE9HRCgiY2xhbXAgaXNwU2Vuc2l0aXZpdHkgdG8gJWQiLCBpc3BTZW5zaXRpdml0eSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzcFNlbnNpdGl2aXR5ID4KKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmlzcF9zZW5zaXRpdml0eV9yYW5nZS5tYXhfc2Vuc2l0aXZpdHkpIHsKKyAgICAgICAgICAgICAgICBpc3BTZW5zaXRpdml0eSA9CisgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmlzcF9zZW5zaXRpdml0eV9yYW5nZS5tYXhfc2Vuc2l0aXZpdHk7CisgICAgICAgICAgICAgICAgTE9HRCgiY2xhbXAgaXNwU2Vuc2l0aXZpdHkgdG8gJWQiLCBpc3BTZW5zaXRpdml0eSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX0lTUF9TRU5TSVRJVklUWSwKKyAgICAgICAgICAgICAgICBpc3BTZW5zaXRpdml0eSkpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfU0hBRElOR19NT0RFKSkgeworICAgICAgICB1aW50OF90IHNoYWRpbmdNb2RlID0gZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX1NIQURJTkdfTU9ERSkuZGF0YS51OFswXTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX1NIQURJTkdfTU9ERSwgc2hhZGluZ01vZGUpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9TVEFUSVNUSUNTX0ZBQ0VfREVURUNUX01PREUpKSB7CisgICAgICAgIHVpbnQ4X3QgZndrX2ZhY2VkZXRlY3RNb2RlID0KKyAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfU1RBVElTVElDU19GQUNFX0RFVEVDVF9NT0RFKS5kYXRhLnU4WzBdOworCisgICAgICAgIGludCB2YWwgPSBsb29rdXBIYWxOYW1lKEZBQ0VERVRFQ1RfTU9ERVNfTUFQLCBNRVRBREFUQV9NQVBfU0laRShGQUNFREVURUNUX01PREVTX01BUCksCisgICAgICAgICAgICAgICAgZndrX2ZhY2VkZXRlY3RNb2RlKTsKKworICAgICAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gdmFsKSB7CisgICAgICAgICAgICB1aW50OF90IGZhY2VkZXRlY3RNb2RlID0gKHVpbnQ4X3QpdmFsOworICAgICAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX1NUQVRTX0ZBQ0VERVRFQ1RfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgZmFjZWRldGVjdE1vZGUpKSB7CisgICAgICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfU1RBVElTVElDU19ISVNUT0dSQU1fTU9ERSkpIHsKKyAgICAgICAgdWludDhfdCBoaXN0b2dyYW1Nb2RlID0KKyAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfU1RBVElTVElDU19ISVNUT0dSQU1fTU9ERSkuZGF0YS51OFswXTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX1NUQVRTX0hJU1RPR1JBTV9NT0RFLAorICAgICAgICAgICAgICAgIGhpc3RvZ3JhbU1vZGUpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9TVEFUSVNUSUNTX1NIQVJQTkVTU19NQVBfTU9ERSkpIHsKKyAgICAgICAgdWludDhfdCBzaGFycG5lc3NNYXBNb2RlID0KKyAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfU1RBVElTVElDU19TSEFSUE5FU1NfTUFQX01PREUpLmRhdGEudThbMF07CisgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9TVEFUU19TSEFSUE5FU1NfTUFQX01PREUsCisgICAgICAgICAgICAgICAgc2hhcnBuZXNzTWFwTW9kZSkpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX1RPTkVNQVBfTU9ERSkpIHsKKyAgICAgICAgdWludDhfdCB0b25lbWFwTW9kZSA9CisgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX1RPTkVNQVBfTU9ERSkuZGF0YS51OFswXTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX1RPTkVNQVBfTU9ERSwgdG9uZW1hcE1vZGUpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBUb25lbWFwIGN1cnZlIGNoYW5uZWxzIGNoMCA9IEcsIGNoIDEgPSBCLCBjaCAyID0gUiAqLworICAgIC8qQWxsIHRvbmVtYXAgY2hhbm5lbHMgd2lsbCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBwb2ludHMqLworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9UT05FTUFQX0NVUlZFX0dSRUVOKSAmJgorICAgICAgICBmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9UT05FTUFQX0NVUlZFX0JMVUUpICYmCisgICAgICAgIGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX1RPTkVNQVBfQ1VSVkVfUkVEKSkgeworICAgICAgICBjYW1fcmdiX3RvbmVtYXBfY3VydmVzIHRvbmVtYXBDdXJ2ZXM7CisgICAgICAgIHRvbmVtYXBDdXJ2ZXMudG9uZW1hcF9wb2ludHNfY250ID0gZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfR1JFRU4pLmNvdW50LzI7CisgICAgICAgIGlmICh0b25lbWFwQ3VydmVzLnRvbmVtYXBfcG9pbnRzX2NudCA+IENBTV9NQVhfVE9ORU1BUF9DVVJWRV9TSVpFKSB7CisgICAgICAgICAgICBMT0dFKCJGYXRhbDogdG9uZW1hcF9wb2ludHNfY250ICVkIGV4Y2VlZHMgbWF4IHZhbHVlIG9mICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHRvbmVtYXBDdXJ2ZXMudG9uZW1hcF9wb2ludHNfY250LAorICAgICAgICAgICAgICAgICAgICBDQU1fTUFYX1RPTkVNQVBfQ1VSVkVfU0laRSk7CisgICAgICAgICAgICB0b25lbWFwQ3VydmVzLnRvbmVtYXBfcG9pbnRzX2NudCA9IENBTV9NQVhfVE9ORU1BUF9DVVJWRV9TSVpFOworICAgICAgICB9CisKKyAgICAgICAgLyogY2gwID0gRyovCisgICAgICAgIHNpemVfdCBwb2ludCA9IDA7CisgICAgICAgIGNhbV90b25lbWFwX2N1cnZlX3QgdG9uZW1hcEN1cnZlR3JlZW47CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdG9uZW1hcEN1cnZlcy50b25lbWFwX3BvaW50c19jbnQ7IGkrKykgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgIHRvbmVtYXBDdXJ2ZUdyZWVuLnRvbmVtYXBfcG9pbnRzW2ldW2pdID0KKyAgICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9UT05FTUFQX0NVUlZFX0dSRUVOKS5kYXRhLmZbcG9pbnRdOworICAgICAgICAgICAgICAgcG9pbnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0b25lbWFwQ3VydmVzLmN1cnZlc1swXSA9IHRvbmVtYXBDdXJ2ZUdyZWVuOworCisgICAgICAgIC8qIGNoIDEgPSBCICovCisgICAgICAgIHBvaW50ID0gMDsKKyAgICAgICAgY2FtX3RvbmVtYXBfY3VydmVfdCB0b25lbWFwQ3VydmVCbHVlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRvbmVtYXBDdXJ2ZXMudG9uZW1hcF9wb2ludHNfY250OyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgICAgICAgICB0b25lbWFwQ3VydmVCbHVlLnRvbmVtYXBfcG9pbnRzW2ldW2pdID0KKyAgICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9UT05FTUFQX0NVUlZFX0JMVUUpLmRhdGEuZltwb2ludF07CisgICAgICAgICAgICAgICBwb2ludCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRvbmVtYXBDdXJ2ZXMuY3VydmVzWzFdID0gdG9uZW1hcEN1cnZlQmx1ZTsKKworICAgICAgICAvKiBjaCAyID0gUiAqLworICAgICAgICBwb2ludCA9IDA7CisgICAgICAgIGNhbV90b25lbWFwX2N1cnZlX3QgdG9uZW1hcEN1cnZlUmVkOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRvbmVtYXBDdXJ2ZXMudG9uZW1hcF9wb2ludHNfY250OyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgICAgICAgICB0b25lbWFwQ3VydmVSZWQudG9uZW1hcF9wb2ludHNbaV1bal0gPQorICAgICAgICAgICAgICAgICAgZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfUkVEKS5kYXRhLmZbcG9pbnRdOworICAgICAgICAgICAgICAgcG9pbnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0b25lbWFwQ3VydmVzLmN1cnZlc1syXSA9IHRvbmVtYXBDdXJ2ZVJlZDsKKworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX01FVEFfVE9ORU1BUF9DVVJWRVMsCisgICAgICAgICAgICAgICAgdG9uZW1hcEN1cnZlcykpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQpKSB7CisgICAgICAgIHVpbnQ4X3QgY2FwdHVyZUludGVudCA9IGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UKS5kYXRhLnU4WzBdOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX01FVEFfQ0FQVFVSRV9JTlRFTlQsCisgICAgICAgICAgICAgICAgY2FwdHVyZUludGVudCkpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0JMQUNLX0xFVkVMX0xPQ0spKSB7CisgICAgICAgIHVpbnQ4X3QgYmxhY2tMZXZlbExvY2sgPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfQkxBQ0tfTEVWRUxfTE9DSykuZGF0YS51OFswXTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX0JMQUNLX0xFVkVMX0xPQ0ssCisgICAgICAgICAgICAgICAgYmxhY2tMZXZlbExvY2spKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVBfTU9ERSkpIHsKKyAgICAgICAgdWludDhfdCBsZW5zU2hhZGluZ01hcE1vZGUgPQorICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVBfTU9ERSkuZGF0YS51OFswXTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX0xFTlNfU0hBRElOR19NQVBfTU9ERSwKKyAgICAgICAgICAgICAgICBsZW5zU2hhZGluZ01hcE1vZGUpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FFX1JFR0lPTlMpKSB7CisgICAgICAgIGNhbV9hcmVhX3Qgcm9pOworICAgICAgICBib29sIHJlc2V0ID0gdHJ1ZTsKKyAgICAgICAgY29udmVydEZyb21SZWdpb25zKHJvaSwgcmVxdWVzdC0+c2V0dGluZ3MsIEFORFJPSURfQ09OVFJPTF9BRV9SRUdJT05TKTsKKworICAgICAgICAvLyBNYXAgY29vcmRpbmF0ZSBzeXN0ZW0gZnJvbSBhY3RpdmUgYXJyYXkgdG8gc2Vuc29yIG91dHB1dC4KKyAgICAgICAgbUNyb3BSZWdpb25NYXBwZXIudG9TZW5zb3Iocm9pLnJlY3QubGVmdCwgcm9pLnJlY3QudG9wLCByb2kucmVjdC53aWR0aCwKKyAgICAgICAgICAgICAgICByb2kucmVjdC5oZWlnaHQpOworCisgICAgICAgIGlmIChzY2FsZXJDcm9wU2V0KSB7CisgICAgICAgICAgICByZXNldCA9IHJlc2V0SWZOZWVkZWRST0koJnJvaSwgJnNjYWxlckNyb3BSZWdpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChyZXNldCAmJiBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9BRUNfUk9JLCByb2kpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FGX1JFR0lPTlMpKSB7CisgICAgICAgIGNhbV9hcmVhX3Qgcm9pOworICAgICAgICBib29sIHJlc2V0ID0gdHJ1ZTsKKyAgICAgICAgY29udmVydEZyb21SZWdpb25zKHJvaSwgcmVxdWVzdC0+c2V0dGluZ3MsIEFORFJPSURfQ09OVFJPTF9BRl9SRUdJT05TKTsKKworICAgICAgICAvLyBNYXAgY29vcmRpbmF0ZSBzeXN0ZW0gZnJvbSBhY3RpdmUgYXJyYXkgdG8gc2Vuc29yIG91dHB1dC4KKyAgICAgICAgbUNyb3BSZWdpb25NYXBwZXIudG9TZW5zb3Iocm9pLnJlY3QubGVmdCwgcm9pLnJlY3QudG9wLCByb2kucmVjdC53aWR0aCwKKyAgICAgICAgICAgICAgICByb2kucmVjdC5oZWlnaHQpOworCisgICAgICAgIGlmIChzY2FsZXJDcm9wU2V0KSB7CisgICAgICAgICAgICByZXNldCA9IHJlc2V0SWZOZWVkZWRST0koJnJvaSwgJnNjYWxlckNyb3BSZWdpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChyZXNldCAmJiBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9BRl9ST0ksIHJvaSkpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ0RTIGZvciBub24tSEZSIG5vbi12aWRlbyBtb2RlCisgICAgaWYgKChtT3BNb2RlICE9IENBTUVSQTNfU1RSRUFNX0NPTkZJR1VSQVRJT05fQ09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFKSAmJgorICAgICAgICAgICAgIShtX2JJc1ZpZGVvKSAmJiBmcmFtZV9zZXR0aW5ncy5leGlzdHMoUUNBTUVSQTNfQ0RTX01PREUpKSB7CisgICAgICAgIGludDMyX3QgKmZ3a19jZHMgPSBmcmFtZV9zZXR0aW5ncy5maW5kKFFDQU1FUkEzX0NEU19NT0RFKS5kYXRhLmkzMjsKKyAgICAgICAgaWYgKChDQU1fQ0RTX01PREVfTUFYIDw9ICpmd2tfY2RzKSB8fCAoMCA+ICpmd2tfY2RzKSkgeworICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBDRFMgbW9kZSAlZCEiLCAqZndrX2Nkcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIENBTV9JTlRGX1BBUk1fQ0RTX01PREUsICpmd2tfY2RzKSkgeworICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmlkZW8gSERSCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhRQ0FNRVJBM19WSURFT19IRFJfTU9ERSkpIHsKKyAgICAgICAgY2FtX3ZpZGVvX2hkcl9tb2RlX3QgdmhkciA9IChjYW1fdmlkZW9faGRyX21vZGVfdCkKKyAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKFFDQU1FUkEzX1ZJREVPX0hEUl9NT0RFKS5kYXRhLmkzMlswXTsKKyAgICAgICAgcmMgPSBzZXRWaWRlb0hkck1vZGUobVBhcmFtZXRlcnMsIHZoZHIpOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoInNldFZpZGVvSERSIGlzIGZhaWxlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy9JUgorICAgIGlmKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhRQ0FNRVJBM19JUl9NT0RFKSkgeworICAgICAgICBjYW1faXJfbW9kZV90eXBlX3QgZndrX2lyID0gKGNhbV9pcl9tb2RlX3R5cGVfdCkKKyAgICAgICAgICAgICAgICBmcmFtZV9zZXR0aW5ncy5maW5kKFFDQU1FUkEzX0lSX01PREUpLmRhdGEuaTMyWzBdOworICAgICAgICBpZiAoKENBTV9JUl9NT0RFX01BWCA8PSBmd2tfaXIpIHx8ICgwID4gZndrX2lyKSkgeworICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBJUiBtb2RlICVkISIsIGZ3a19pcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfSVJfTU9ERSwgZndrX2lyKSkgeworICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhRQ0FNRVJBM19BRUNfQ09OVkVSR0VOQ0VfU1BFRUQpKSB7CisgICAgICAgIGZsb2F0IGFlY19zcGVlZDsKKyAgICAgICAgYWVjX3NwZWVkID0gZnJhbWVfc2V0dGluZ3MuZmluZChRQ0FNRVJBM19BRUNfQ09OVkVSR0VOQ0VfU1BFRUQpLmRhdGEuZlswXTsKKyAgICAgICAgTE9HRCgiQUVDIFNwZWVkIDolZiIsIGFlY19zcGVlZCk7CisgICAgICAgIGlmICggYWVjX3NwZWVkIDwgMCApIHsKKyAgICAgICAgICAgIExPR0UoIkludmFsaWQgQUVDIG1vZGUgJWYhIiwgYWVjX3NwZWVkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9BRUNfQ09OVkVSR0VOQ0VfU1BFRUQsCisgICAgICAgICAgICAgICAgICAgIGFlY19zcGVlZCkpIHsKKyAgICAgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoUUNBTUVSQTNfQVdCX0NPTlZFUkdFTkNFX1NQRUVEKSkgeworICAgICAgICBmbG9hdCBhd2Jfc3BlZWQ7CisgICAgICAgIGF3Yl9zcGVlZCA9IGZyYW1lX3NldHRpbmdzLmZpbmQoUUNBTUVSQTNfQVdCX0NPTlZFUkdFTkNFX1NQRUVEKS5kYXRhLmZbMF07CisgICAgICAgIExPR0QoIkFXQiBTcGVlZCA6JWYiLCBhd2Jfc3BlZWQpOworICAgICAgICBpZiAoIGF3Yl9zcGVlZCA8IDAgKSB7CisgICAgICAgICAgICBMT0dFKCJJbnZhbGlkIEFXQiBtb2RlICVmISIsIGF3Yl9zcGVlZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX01FVEFfQVdCX0NPTlZFUkdFTkNFX1NQRUVELAorICAgICAgICAgICAgICAgICAgICBhd2Jfc3BlZWQpKSB7CisgICAgICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUTlIKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKFFDQU1FUkEzX1RFTVBPUkFMX0RFTk9JU0VfRU5BQkxFKSAmJgorICAgICAgICBmcmFtZV9zZXR0aW5ncy5leGlzdHMoUUNBTUVSQTNfVEVNUE9SQUxfREVOT0lTRV9QUk9DRVNTX1RZUEUpKSB7CisgICAgICAgIHVpbnQ4X3QgYl9UbnJSZXF1ZXN0ZWQgPSAwOworICAgICAgICBjYW1fZGVub2lzZV9wYXJhbV90IHRucjsKKyAgICAgICAgdG5yLmRlbm9pc2VfZW5hYmxlID0gZnJhbWVfc2V0dGluZ3MuZmluZChRQ0FNRVJBM19URU1QT1JBTF9ERU5PSVNFX0VOQUJMRSkuZGF0YS51OFswXTsKKyAgICAgICAgdG5yLnByb2Nlc3NfcGxhdGVzID0KKyAgICAgICAgICAgIChjYW1fZGVub2lzZV9wcm9jZXNzX3R5cGVfdClmcmFtZV9zZXR0aW5ncy5maW5kKAorICAgICAgICAgICAgUUNBTUVSQTNfVEVNUE9SQUxfREVOT0lTRV9QUk9DRVNTX1RZUEUpLmRhdGEuaTMyWzBdOworICAgICAgICBiX1RuclJlcXVlc3RlZCA9IHRuci5kZW5vaXNlX2VuYWJsZTsKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobVBhcmFtZXRlcnMsIENBTV9JTlRGX1BBUk1fVEVNUE9SQUxfREVOT0lTRSwgdG5yKSkgeworICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfU0VOU09SX1RFU1RfUEFUVEVSTl9NT0RFKSkgeworICAgICAgICBpbnQzMl90IGZ3a190ZXN0UGF0dGVybk1vZGUgPQorICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX01PREUpLmRhdGEuaTMyWzBdOworICAgICAgICBpbnQgdGVzdFBhdHRlcm5Nb2RlID0gbG9va3VwSGFsTmFtZShURVNUX1BBVFRFUk5fTUFQLAorICAgICAgICAgICAgICAgIE1FVEFEQVRBX01BUF9TSVpFKFRFU1RfUEFUVEVSTl9NQVApLCBmd2tfdGVzdFBhdHRlcm5Nb2RlKTsKKworICAgICAgICBpZiAoTkFNRV9OT1RfRk9VTkQgIT0gdGVzdFBhdHRlcm5Nb2RlKSB7CisgICAgICAgICAgICBjYW1fdGVzdF9wYXR0ZXJuX2RhdGFfdCB0ZXN0UGF0dGVybkRhdGE7CisgICAgICAgICAgICBtZW1zZXQoJnRlc3RQYXR0ZXJuRGF0YSwgMCwgc2l6ZW9mKHRlc3RQYXR0ZXJuRGF0YSkpOworICAgICAgICAgICAgdGVzdFBhdHRlcm5EYXRhLm1vZGUgPSAoY2FtX3Rlc3RfcGF0dGVybl9tb2RlX3QpdGVzdFBhdHRlcm5Nb2RlOworICAgICAgICAgICAgaWYgKHRlc3RQYXR0ZXJuTW9kZSA9PSBDQU1fVEVTVF9QQVRURVJOX1NPTElEX0NPTE9SICYmCisgICAgICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX1NFTlNPUl9URVNUX1BBVFRFUk5fREFUQSkpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90ICpmd2tfdGVzdFBhdHRlcm5EYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9TRU5TT1JfVEVTVF9QQVRURVJOX0RBVEEpLmRhdGEuaTMyOworICAgICAgICAgICAgICAgIHRlc3RQYXR0ZXJuRGF0YS5yID0gZndrX3Rlc3RQYXR0ZXJuRGF0YVswXTsKKyAgICAgICAgICAgICAgICB0ZXN0UGF0dGVybkRhdGEuYiA9IGZ3a190ZXN0UGF0dGVybkRhdGFbM107CisgICAgICAgICAgICAgICAgc3dpdGNoIChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5jb2xvcl9hcnJhbmdlbWVudCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfUkdHQjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDQU1fRklMVEVSX0FSUkFOR0VNRU5UX0dSQkc6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGF0dGVybkRhdGEuZ3IgPSBmd2tfdGVzdFBhdHRlcm5EYXRhWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBhdHRlcm5EYXRhLmdiID0gZndrX3Rlc3RQYXR0ZXJuRGF0YVsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfR0JSRzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDQU1fRklMVEVSX0FSUkFOR0VNRU5UX0JHR1I6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGF0dGVybkRhdGEuZ3IgPSBmd2tfdGVzdFBhdHRlcm5EYXRhWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFBhdHRlcm5EYXRhLmdiID0gZndrX3Rlc3RQYXR0ZXJuRGF0YVsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiY29sb3IgYXJyYW5nZW1lbnQgJWQgaXMgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmNvbG9yX2FycmFuZ2VtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9URVNUX1BBVFRFUk5fREFUQSwKKyAgICAgICAgICAgICAgICAgICAgdGVzdFBhdHRlcm5EYXRhKSkgeworICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBmcmFtZXdvcmsgc2Vuc29yIHRlc3QgcGF0dGVybiBtb2RlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZndrX3Rlc3RQYXR0ZXJuTW9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfSlBFR19HUFNfQ09PUkRJTkFURVMpKSB7CisgICAgICAgIHNpemVfdCBjb3VudCA9IDA7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGdwc19jb29yZHMgPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfSlBFR19HUFNfQ09PUkRJTkFURVMpOworICAgICAgICBBRERfU0VUX1BBUkFNX0FSUkFZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9KUEVHX0dQU19DT09SRElOQVRFUywKKyAgICAgICAgICAgICAgICBncHNfY29vcmRzLmRhdGEuZCwgZ3BzX2Nvb3Jkcy5jb3VudCwgY291bnQpOworICAgICAgICBpZiAoZ3BzX2Nvb3Jkcy5jb3VudCAhPSBjb3VudCkgeworICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKEFORFJPSURfSlBFR19HUFNfUFJPQ0VTU0lOR19NRVRIT0QpKSB7CisgICAgICAgIGNoYXIgZ3BzX21ldGhvZHNbR1BTX1BST0NFU1NJTkdfTUVUSE9EX1NJWkVdOworICAgICAgICBzaXplX3QgY291bnQgPSAwOworICAgICAgICBjb25zdCBjaGFyICpncHNfbWV0aG9kc19zcmMgPSAoY29uc3QgY2hhciAqKQorICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9KUEVHX0dQU19QUk9DRVNTSU5HX01FVEhPRCkuZGF0YS51ODsKKyAgICAgICAgbWVtc2V0KGdwc19tZXRob2RzLCAnXDAnLCBzaXplb2YoZ3BzX21ldGhvZHMpKTsKKyAgICAgICAgc3RybGNweShncHNfbWV0aG9kcywgZ3BzX21ldGhvZHNfc3JjLCBzaXplb2YoZ3BzX21ldGhvZHMpKTsKKyAgICAgICAgQUREX1NFVF9QQVJBTV9BUlJBWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX01FVEFfSlBFR19HUFNfUFJPQ19NRVRIT0RTLAorICAgICAgICAgICAgICAgIGdwc19tZXRob2RzLCBHUFNfUFJPQ0VTU0lOR19NRVRIT0RfU0laRSwgY291bnQpOworICAgICAgICBpZiAoR1BTX1BST0NFU1NJTkdfTUVUSE9EX1NJWkUgIT0gY291bnQpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0pQRUdfR1BTX1RJTUVTVEFNUCkpIHsKKyAgICAgICAgaW50NjRfdCBncHNfdGltZXN0YW1wID0gZnJhbWVfc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfR1BTX1RJTUVTVEFNUCkuZGF0YS5pNjRbMF07CisgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9KUEVHX0dQU19USU1FU1RBTVAsCisgICAgICAgICAgICAgICAgZ3BzX3RpbWVzdGFtcCkpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZyYW1lX3NldHRpbmdzLmV4aXN0cyhBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04pKSB7CisgICAgICAgIGludDMyX3Qgb3JpZW50YXRpb24gPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfSlBFR19PUklFTlRBVElPTikuZGF0YS5pMzJbMF07CisgICAgICAgIGNhbV9yb3RhdGlvbl9pbmZvX3Qgcm90YXRpb25faW5mbzsKKyAgICAgICAgaWYgKG9yaWVudGF0aW9uID09IDApIHsKKyAgICAgICAgICAgcm90YXRpb25faW5mby5yb3RhdGlvbiA9IFJPVEFURV8wOworICAgICAgICB9IGVsc2UgaWYgKG9yaWVudGF0aW9uID09IDkwKSB7CisgICAgICAgICAgIHJvdGF0aW9uX2luZm8ucm90YXRpb24gPSBST1RBVEVfOTA7CisgICAgICAgIH0gZWxzZSBpZiAob3JpZW50YXRpb24gPT0gMTgwKSB7CisgICAgICAgICAgIHJvdGF0aW9uX2luZm8ucm90YXRpb24gPSBST1RBVEVfMTgwOworICAgICAgICB9IGVsc2UgaWYgKG9yaWVudGF0aW9uID09IDI3MCkgeworICAgICAgICAgICByb3RhdGlvbl9pbmZvLnJvdGF0aW9uID0gUk9UQVRFXzI3MDsKKyAgICAgICAgfQorICAgICAgICByb3RhdGlvbl9pbmZvLnN0cmVhbUlkID0gc25hcHNob3RTdHJlYW1JZDsKKyAgICAgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX01FVEFfSlBFR19PUklFTlRBVElPTiwgb3JpZW50YXRpb24pOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX1BBUk1fUk9UQVRJT04sIHJvdGF0aW9uX2luZm8pKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9KUEVHX1FVQUxJVFkpKSB7CisgICAgICAgIHVpbnQzMl90IHF1YWxpdHkgPSAodWludDMyX3QpIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9KUEVHX1FVQUxJVFkpLmRhdGEudThbMF07CisgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9KUEVHX1FVQUxJVFksIHF1YWxpdHkpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9KUEVHX1RIVU1CTkFJTF9RVUFMSVRZKSkgeworICAgICAgICB1aW50MzJfdCB0aHVtYl9xdWFsaXR5ID0gKHVpbnQzMl90KQorICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9KUEVHX1RIVU1CTkFJTF9RVUFMSVRZKS5kYXRhLnU4WzBdOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX01FVEFfSlBFR19USFVNQl9RVUFMSVRZLAorICAgICAgICAgICAgICAgIHRodW1iX3F1YWxpdHkpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmcmFtZV9zZXR0aW5ncy5leGlzdHMoQU5EUk9JRF9KUEVHX1RIVU1CTkFJTF9TSVpFKSkgeworICAgICAgICBjYW1fZGltZW5zaW9uX3QgZGltOworICAgICAgICBkaW0ud2lkdGggPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfSlBFR19USFVNQk5BSUxfU0laRSkuZGF0YS5pMzJbMF07CisgICAgICAgIGRpbS5oZWlnaHQgPSBmcmFtZV9zZXR0aW5ncy5maW5kKEFORFJPSURfSlBFR19USFVNQk5BSUxfU0laRSkuZGF0YS5pMzJbMV07CisgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwgQ0FNX0lOVEZfTUVUQV9KUEVHX1RIVU1CX1NJWkUsIGRpbSkpIHsKKyAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW50ZXJuYWwgbWV0YWRhdGEKKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKFFDQU1FUkEzX1BSSVZBVEVEQVRBX1JFUFJPQ0VTUykpIHsKKyAgICAgICAgc2l6ZV90IGNvdW50ID0gMDsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgcHJpdmF0ZWRhdGEgPSBmcmFtZV9zZXR0aW5ncy5maW5kKFFDQU1FUkEzX1BSSVZBVEVEQVRBX1JFUFJPQ0VTUyk7CisgICAgICAgIEFERF9TRVRfUEFSQU1fQVJSQVlfVE9fQkFUQ0goaGFsX21ldGFkYXRhLCBDQU1fSU5URl9NRVRBX1BSSVZBVEVfREFUQSwKKyAgICAgICAgICAgICAgICBwcml2YXRlZGF0YS5kYXRhLmkzMiwgcHJpdmF0ZWRhdGEuY291bnQsIGNvdW50KTsKKyAgICAgICAgaWYgKHByaXZhdGVkYXRhLmNvdW50ICE9IGNvdW50KSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEVWIHN0ZXAKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsIENBTV9JTlRGX1BBUk1fRVZfU1RFUCwKKyAgICAgICAgICAgIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPmV4cF9jb21wZW5zYXRpb25fc3RlcCkpIHsKKyAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ0RTIGluZm8KKyAgICBpZiAoZnJhbWVfc2V0dGluZ3MuZXhpc3RzKFFDQU1FUkEzX0NEU19JTkZPKSkgeworICAgICAgICBjYW1fY2RzX2RhdGFfdCAqY2RzRGF0YSA9IChjYW1fY2RzX2RhdGFfdCAqKQorICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoUUNBTUVSQTNfQ0RTX0lORk8pLmRhdGEudTg7CisKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goaGFsX21ldGFkYXRhLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfQ0RTX0RBVEEsICpjZHNEYXRhKSkgeworICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2FwdHVyZVJlc3VsdENiCisgKgorICogREVTQ1JJUFRJT046IENhbGxiYWNrIGhhbmRsZXIgZm9yIGFsbCBjaGFubmVscyAoc3RyZWFtcywgYXMgd2VsbCBhcyBtZXRhZGF0YSkKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZyYW1lICA6IGZyYW1lIGluZm9ybWF0aW9uIGZyb20gbW0tY2FtZXJhLWludGVyZmFjZQorICogICBAYnVmZmVyIDogYWN0dWFsIGdyYWxsb2MgYnVmZmVyIHRvIGJlIHJldHVybmVkIHRvIGZyYW1ld29ya3MuIE5VTEwgaWYgbWV0YWRhdGEuCisgKiAgIEB1c2VyZGF0YTogdXNlcmRhdGEKKyAqCisgKiBSRVRVUk4gICAgIDogTk9ORQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmNhcHR1cmVSZXN1bHRDYihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKm1ldGFkYXRhLAorICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyLCBib29sIGlzSW5wdXRCdWZmZXIsIHZvaWQgKnVzZXJkYXRhKQoreworICAgIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0gKFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UgKil1c2VyZGF0YTsKKyAgICBpZiAoaHcgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGh3ICVwIiwgaHcpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaHctPmNhcHR1cmVSZXN1bHRDYihtZXRhZGF0YSwgYnVmZmVyLCBmcmFtZV9udW1iZXIsIGlzSW5wdXRCdWZmZXIpOworICAgIHJldHVybjsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGluaXRpYWxpemUKKyAqCisgKiBERVNDUklQVElPTjogUGFzcyBmcmFtZXdvcmsgY2FsbGJhY2sgcG9pbnRlcnMgdG8gSEFMCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICoKKyAqIFJFVFVSTiAgICAgOiBTdWNjZXNzIDogMAorICogICAgICAgICAgICAgIEZhaWx1cmU6IC1FTk9ERVYKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitpbnQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6aW5pdGlhbGl6ZShjb25zdCBzdHJ1Y3QgY2FtZXJhM19kZXZpY2UgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX2NhbGxiYWNrX29wc190ICpjYWxsYmFja19vcHMpCit7CisgICAgTE9HRCgiRSIpOworICAgIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlICo+KGRldmljZS0+cHJpdik7CisgICAgaWYgKCFodykgeworICAgICAgICBMT0dFKCJOVUxMIGNhbWVyYSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgaW50IHJjID0gaHctPmluaXRpYWxpemUoY2FsbGJhY2tfb3BzKTsKKyAgICBMT0dEKCJYIik7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbmZpZ3VyZV9zdHJlYW1zCisgKgorICogREVTQ1JJUFRJT046CisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICoKKyAqIFJFVFVSTiAgICAgOiBTdWNjZXNzOiAwCisgKiAgICAgICAgICAgICAgRmFpbHVyZTogLUVJTlZBTCAoaWYgc3RyZWFtIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAtRU5PREVWIChmYXRhbCBlcnJvcikKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitpbnQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Y29uZmlndXJlX3N0cmVhbXMoCisgICAgICAgIGNvbnN0IHN0cnVjdCBjYW1lcmEzX2RldmljZSAqZGV2aWNlLAorICAgICAgICBjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX3QgKnN0cmVhbV9saXN0KQoreworICAgIExPR0QoIkUiKTsKKyAgICBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlICpodyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSAqPihkZXZpY2UtPnByaXYpOworICAgIGlmICghaHcpIHsKKyAgICAgICAgTE9HRSgiTlVMTCBjYW1lcmEgZGV2aWNlIik7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICBpbnQgcmMgPSBody0+Y29uZmlndXJlU3RyZWFtcyhzdHJlYW1fbGlzdCk7CisgICAgTE9HRCgiWCIpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjb25zdHJ1Y3RfZGVmYXVsdF9yZXF1ZXN0X3NldHRpbmdzCisgKgorICogREVTQ1JJUFRJT046IENvbmZpZ3VyZSBhIHNldHRpbmdzIGJ1ZmZlciB0byBtZWV0IHRoZSByZXF1aXJlZCB1c2UgY2FzZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqCisgKiBSRVRVUk4gICAgIDogU3VjY2VzczogUmV0dXJuIHZhbGlkIG1ldGFkYXRhCisgKiAgICAgICAgICAgICAgRmFpbHVyZTogUmV0dXJuIE5VTEwKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OgorICAgIGNvbnN0cnVjdF9kZWZhdWx0X3JlcXVlc3Rfc2V0dGluZ3MoY29uc3Qgc3RydWN0IGNhbWVyYTNfZGV2aWNlICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpCit7CisKKyAgICBMT0dEKCJFIik7CisgICAgY2FtZXJhX21ldGFkYXRhX3QqIGZ3a19tZXRhZGF0YSA9IE5VTEw7CisgICAgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSAqaHcgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UgKj4oZGV2aWNlLT5wcml2KTsKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmd2tfbWV0YWRhdGEgPSBody0+dHJhbnNsYXRlQ2FwYWJpbGl0eVRvTWV0YWRhdGEodHlwZSk7CisKKyAgICBMT0dEKCJYIik7CisgICAgcmV0dXJuIGZ3a19tZXRhZGF0YTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jZXNzX2NhcHR1cmVfcmVxdWVzdAorICoKKyAqIERFU0NSSVBUSU9OOgorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OnByb2Nlc3NfY2FwdHVyZV9yZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgY2FtZXJhM19kZXZpY2UgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqcmVxdWVzdCkKK3sKKyAgICBMT0dEKCJFIik7CisgICAgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSAqaHcgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UgKj4oZGV2aWNlLT5wcml2KTsKKyAgICBpZiAoIWh3KSB7CisgICAgICAgIExPR0UoIk5VTEwgY2FtZXJhIGRldmljZSIpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpbnQgcmMgPSBody0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgIExPR0QoIlgiKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZHVtcAorICoKKyAqIERFU0NSSVBUSU9OOgorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmR1bXAoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYTNfZGV2aWNlICpkZXZpY2UsIGludCBmZCkKK3sKKyAgICAvKiBMb2cgbGV2ZWwgcHJvcGVydHkgaXMgcmVhZCB3aGVuICJhZGIgc2hlbGwgZHVtcHN5cyBtZWRpYS5jYW1lcmEiIGlzCisgICAgICAgY2FsbGVkIHNvIHRoYXQgdGhlIGxvZyBsZXZlbCBjYW4gYmUgY29udHJvbGxlZCB3aXRob3V0IHJlc3RhcnRpbmcKKyAgICAgICB0aGUgbWVkaWEgc2VydmVyICovCisgICAgZ2V0TG9nTGV2ZWwoKTsKKworICAgIExPR0QoIkUiKTsKKyAgICBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlICpodyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSAqPihkZXZpY2UtPnByaXYpOworICAgIGlmICghaHcpIHsKKyAgICAgICAgTE9HRSgiTlVMTCBjYW1lcmEgZGV2aWNlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBody0+ZHVtcChmZCk7CisgICAgTE9HRCgiWCIpOworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBmbHVzaAorICoKKyAqIERFU0NSSVBUSU9OOgorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitpbnQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Zmx1c2goCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYTNfZGV2aWNlICpkZXZpY2UpCit7CisgICAgaW50IHJjOworICAgIExPR0QoIkUiKTsKKyAgICBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlICpodyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSAqPihkZXZpY2UtPnByaXYpOworICAgIGlmICghaHcpIHsKKyAgICAgICAgTE9HRSgiTlVMTCBjYW1lcmEgZGV2aWNlIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmaHctPm1NdXRleCk7CisgICAgLy8gVmFsaWRhdGUgY3VycmVudCBzdGF0ZQorICAgIHN3aXRjaCAoaHctPm1TdGF0ZSkgeworICAgICAgICBjYXNlIFNUQVJURUQ6CisgICAgICAgICAgICAvKiB2YWxpZCBzdGF0ZSAqLworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBFUlJPUjoKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZody0+bU11dGV4KTsKKyAgICAgICAgICAgIGh3LT5oYW5kbGVDYW1lcmFEZXZpY2VFcnJvcigpOworICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR0koIkZsdXNoIHJldHVybmVkIGR1cmluZyBzdGF0ZSAlZCIsIGh3LT5tU3RhdGUpOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmh3LT5tTXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZody0+bU11dGV4KTsKKworICAgIHJjID0gaHctPmZsdXNoKHRydWUgLyogcmVzdGFydCBjaGFubmVscyAqLyApOworICAgIExPR0QoIlgiKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2xvc2VfY2FtZXJhX2RldmljZQorICoKKyAqIERFU0NSSVBUSU9OOgorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmNsb3NlX2NhbWVyYV9kZXZpY2Uoc3RydWN0IGh3X2RldmljZV90KiBkZXZpY2UpCit7CisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UgKmh3ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlICo+KAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjYW1lcmEzX2RldmljZV90ICo+KGRldmljZSktPnByaXYpOworICAgIGlmICghaHcpIHsKKyAgICAgICAgTE9HRSgiTlVMTCBjYW1lcmEgZGV2aWNlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTE9HSSgiW0tQSSBQZXJmXTogRSBjYW1lcmEgaWQgJWQiLCBody0+bUNhbWVyYUlkKTsKKyAgICBkZWxldGUgaHc7CisgICAgTE9HSSgiW0tQSSBQZXJmXTogWCIpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0V2F2ZWxldERlbm9pc2VQcm9jZXNzUGxhdGUKKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgd2F2ZWxldCBkZW5vaXNlIHByb2Nlc3MgcGxhdGUKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBXTlIgcHJjb2Nlc3MgcGxhdGUgdmFsdWUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY2FtX2Rlbm9pc2VfcHJvY2Vzc190eXBlX3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Z2V0V2F2ZWxldERlbm9pc2VQcm9jZXNzUGxhdGUoKQoreworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5kZW5vaXNlLnByb2Nlc3MucGxhdGVzIiwgcHJvcCwgIjAiKTsKKyAgICBpbnQgcHJvY2Vzc1BsYXRlID0gYXRvaShwcm9wKTsKKyAgICBzd2l0Y2gocHJvY2Vzc1BsYXRlKSB7CisgICAgY2FzZSAwOgorICAgICAgICByZXR1cm4gQ0FNX1dBVkVMRVRfREVOT0lTRV9ZQ0JDUl9QTEFORTsKKyAgICBjYXNlIDE6CisgICAgICAgIHJldHVybiBDQU1fV0FWRUxFVF9ERU5PSVNFX0NCQ1JfT05MWTsKKyAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiBDQU1fV0FWRUxFVF9ERU5PSVNFX1NUUkVBTUxJTkVfWUNCQ1I7CisgICAgY2FzZSAzOgorICAgICAgICByZXR1cm4gQ0FNX1dBVkVMRVRfREVOT0lTRV9TVFJFQU1MSU5FRF9DQkNSOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBDQU1fV0FWRUxFVF9ERU5PSVNFX1NUUkVBTUxJTkVfWUNCQ1I7CisgICAgfQorfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0VGVtcG9yYWxEZW5vaXNlUHJvY2Vzc1BsYXRlCisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IHRlbXBvcmFsIGRlbm9pc2UgcHJvY2VzcyBwbGF0ZQorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IFROUiBwcmNvY2VzcyBwbGF0ZSB2YWx1ZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjYW1fZGVub2lzZV9wcm9jZXNzX3R5cGVfdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpnZXRUZW1wb3JhbERlbm9pc2VQcm9jZXNzUGxhdGUoKQoreworICAgIGNoYXIgcHJvcFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIG1lbXNldChwcm9wLCAwLCBzaXplb2YocHJvcCkpOworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC50bnIucHJvY2Vzcy5wbGF0ZXMiLCBwcm9wLCAiMCIpOworICAgIGludCBwcm9jZXNzUGxhdGUgPSBhdG9pKHByb3ApOworICAgIHN3aXRjaChwcm9jZXNzUGxhdGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHJldHVybiBDQU1fV0FWRUxFVF9ERU5PSVNFX1lDQkNSX1BMQU5FOworICAgIGNhc2UgMToKKyAgICAgICAgcmV0dXJuIENBTV9XQVZFTEVUX0RFTk9JU0VfQ0JDUl9PTkxZOworICAgIGNhc2UgMjoKKyAgICAgICAgcmV0dXJuIENBTV9XQVZFTEVUX0RFTk9JU0VfU1RSRUFNTElORV9ZQ0JDUjsKKyAgICBjYXNlIDM6CisgICAgICAgIHJldHVybiBDQU1fV0FWRUxFVF9ERU5PSVNFX1NUUkVBTUxJTkVEX0NCQ1I7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIENBTV9XQVZFTEVUX0RFTk9JU0VfU1RSRUFNTElORV9ZQ0JDUjsKKyAgICB9Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBleHRyYWN0U2NlbmVNb2RlCisgKgorICogREVTQ1JJUFRJT046IEV4dHJhY3Qgc2NlbmUgbW9kZSBmcm9tIGZyYW1ld29ya3Mgc2V0IG1ldGFkYXRhCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgICAgIEBmcmFtZV9zZXR0aW5nczogQ2FtZXJhTWV0YWRhdGEgcmVmZXJlbmNlCisgKiAgICAgIEBtZXRhTW9kZTogQU5EUk9JRF9DT05UT1JMX01PREUKKyAqICAgICAgQGhhbF9tZXRhZGF0YTogaGFsIG1ldGFkYXRhIHN0cnVjdHVyZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6ZXh0cmFjdFNjZW5lTW9kZSgKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEgJmZyYW1lX3NldHRpbmdzLCB1aW50OF90IG1ldGFNb2RlLAorICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCAqaGFsX21ldGFkYXRhKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIGlmIChtZXRhTW9kZSA9PSBBTkRST0lEX0NPTlRST0xfTU9ERV9VU0VfU0NFTkVfTU9ERSkgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPQorICAgICAgICAgICAgICAgIGZyYW1lX3NldHRpbmdzLmZpbmQoQU5EUk9JRF9DT05UUk9MX1NDRU5FX01PREUpOworICAgICAgICBpZiAoMCA9PSBlbnRyeS5jb3VudCkKKyAgICAgICAgICAgIHJldHVybiByYzsKKworICAgICAgICB1aW50OF90IGZ3a19zY2VuZU1vZGUgPSBlbnRyeS5kYXRhLnU4WzBdOworCisgICAgICAgIGludCB2YWwgPSBsb29rdXBIYWxOYW1lKFNDRU5FX01PREVTX01BUCwKKyAgICAgICAgICAgICAgICBzaXplb2YoU0NFTkVfTU9ERVNfTUFQKS9zaXplb2YoU0NFTkVfTU9ERVNfTUFQWzBdKSwKKyAgICAgICAgICAgICAgICBmd2tfc2NlbmVNb2RlKTsKKyAgICAgICAgaWYgKE5BTUVfTk9UX0ZPVU5EICE9IHZhbCkgeworICAgICAgICAgICAgdWludDhfdCBzY2VuZU1vZGUgPSAodWludDhfdCl2YWw7CisgICAgICAgICAgICBMT0dEKCJzY2VuZU1vZGU6ICVkIiwgc2NlbmVNb2RlKTsKKyAgICAgICAgICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKGhhbF9tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9CRVNUU0hPVF9NT0RFLCBzY2VuZU1vZGUpKSB7CisgICAgICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKChBTkRST0lEX0NPTlRST0xfTU9ERV9PRkYgPT0gbWV0YU1vZGUpIHx8CisgICAgICAgICAgICAoQU5EUk9JRF9DT05UUk9MX01PREVfQVVUTyA9PSBtZXRhTW9kZSkpIHsKKyAgICAgICAgdWludDhfdCBzY2VuZU1vZGUgPSBDQU1fU0NFTkVfTU9ERV9PRkY7CisgICAgICAgIExPR0QoInNjZW5lTW9kZTogJWQiLCBzY2VuZU1vZGUpOworICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9CRVNUU0hPVF9NT0RFLCBzY2VuZU1vZGUpKSB7CisgICAgICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0VmlkZW9IZHJNb2RlCisgKgorICogREVTQ1JJUFRJT046IFNldCBWaWRlbyBIRFIgbW9kZSBmcm9tIGZyYW1ld29ya3Mgc2V0IG1ldGFkYXRhCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgICAgIEBoYWxfbWV0YWRhdGE6IGhhbCBtZXRhZGF0YSBzdHJ1Y3R1cmUKKyAqICAgICAgQG1ldGFNb2RlOiBRQ0FNRVJBM19WSURFT19IRFJfTU9ERQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6c2V0VmlkZW9IZHJNb2RlKAorICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCAqaGFsX21ldGFkYXRhLCBjYW1fdmlkZW9faGRyX21vZGVfdCB2aGRyKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpZiAoKENBTV9WSURFT19IRFJfTU9ERV9NQVggPD0gKHZoZHIpKSB8fCAoMCA+ICh2aGRyKSkpIHsKKyAgICAgICAgTE9HRSgiJXM6IEludmFsaWQgVmlkZW8gSERSIG1vZGUgJWQhIiwgX19mdW5jX18sIHZoZHIpOworICAgICAgICByYyA9IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgeworICAgICAgICBjYW1fc2Vuc29yX2hkcl90eXBlX3Qgdmhkcl90eXBlID0gQ0FNX1NFTlNPUl9IRFJfTUFYOworICAgICAgICBpZih2aGRyID09IFFDQU1FUkEzX1ZJREVPX0hEUl9NT0RFX09GRikgeworICAgICAgICAgICAgTE9HRCgiU2V0dGluZyBIRFIgbW9kZSBPZmYiKTsKKyAgICAgICAgICAgIHZoZHJfdHlwZSA9IENBTV9TRU5TT1JfSERSX09GRjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgdmlkZW9faGRyX3Byb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgICAgIG1lbXNldCh2aWRlb19oZHJfcHJvcCwgMCwgc2l6ZW9mKHZpZGVvX2hkcl9wcm9wKSk7CisgICAgICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmhkci52aWRlbyIsIHZpZGVvX2hkcl9wcm9wLCAiMyIpOworICAgICAgICAgICAgdWludDhfdCB1c2VfaGRyX3ZpZGVvID0gKHVpbnQ4X3QpYXRvaSh2aWRlb19oZHJfcHJvcCk7CisgICAgICAgICAgICBpZiAoKGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnFjb21fc3VwcG9ydGVkX2ZlYXR1cmVfbWFzayAmCisgICAgICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfU0VOU09SX0hEUikgJiYKKyAgICAgICAgICAgICAgICAgICAgKHVzZV9oZHJfdmlkZW8gPT0gQ0FNX1NFTlNPUl9IRFJfSU5fU0VOU09SKSkgeworICAgICAgICAgICAgICAgIExPR0QoIlNldHRpbmcgSERSIG1vZGUgSW4gU2Vuc29yIik7CisgICAgICAgICAgICAgICAgdmhkcl90eXBlID0gQ0FNX1NFTlNPUl9IRFJfSU5fU0VOU09SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgJgorICAgICAgICAgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX1pJR1pBR19WSURFT19IRFIpICYmCisgICAgICAgICAgICAgICAgICAgICh1c2VfaGRyX3ZpZGVvID09IENBTV9TRU5TT1JfSERSX1pJR1pBRykpIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJTZXR0aW5nIEhEUiBtb2RlIFppZ3phZyIpOworICAgICAgICAgICAgICAgIHZoZHJfdHlwZSA9IENBTV9TRU5TT1JfSERSX1pJR1pBRzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYKKyAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9TVEFHR0VSRURfVklERU9fSERSKSAmJgorICAgICAgICAgICAgICAgICAgICAodXNlX2hkcl92aWRlbyA9PSBDQU1fU0VOU09SX0hEUl9TVEFHR0VSRUQpKSB7CisgICAgICAgICAgICAgICAgTE9HRCgiU2V0dGluZyBIRFIgbW9kZSBTdGFnZ2VyZWQiKTsKKyAgICAgICAgICAgICAgICB2aGRyX3R5cGUgPSBDQU1fU0VOU09SX0hEUl9TVEFHR0VSRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZih2aGRyX3R5cGUgPT0gQ0FNX1NFTlNPUl9IRFJfTUFYKSB7CisgICAgICAgICAgICAgICAgTE9HRCgiSERSIG1vZGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChoYWxfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIENBTV9JTlRGX1BBUk1fU0VOU09SX0hEUiwgdmhkcl90eXBlKSkgeworICAgICAgICAgICAgICAgIHJjID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBuZWVkUm90YXRpb25SZXByb2Nlc3MKKyAqCisgKiBERVNDUklQVElPTjogaWYgcm90YXRpb24gbmVlZHMgdG8gYmUgZG9uZSBieSByZXByb2Nlc3MgaW4gcHAKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlOiBuZWVkZWQKKyAqICAgICAgICAgICAgICBmYWxzZTogbm8gbmVlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6Om5lZWRSb3RhdGlvblJlcHJvY2VzcygpCit7CisgICAgaWYgKChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX1JPVEFUSU9OKSA+IDApIHsKKyAgICAgICAgLy8gY3VycmVudCByb3RhdGlvbiBpcyBub3QgemVybywgYW5kIHBwIGhhcyB0aGUgY2FwYWJpbGl0eSB0byBwcm9jZXNzIHJvdGF0aW9uCisgICAgICAgIExPR0goIm5lZWQgZG8gcmVwcm9jZXNzIGZvciByb3RhdGlvbiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbmVlZFJlcHJvY2VzcworICoKKyAqIERFU0NSSVBUSU9OOiBpZiByZXByb2Nlc3MgaW4gbmVlZGVkCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZTogbmVlZGVkCisgKiAgICAgICAgICAgICAgZmFsc2U6IG5vIG5lZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpuZWVkUmVwcm9jZXNzKGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrKQoreworICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgPiAwKSB7CisgICAgICAgIC8vIFRPRE86IGFkZCBmb3IgWlNMIEhEUiBsYXRlcgorICAgICAgICAvLyBwcCBtb2R1bGUgaGFzIG1pbiByZXF1aXJlbWVudCBmb3IgenNsIHJlcHJvY2Vzcywgb3IgV05SIGluIFpTTCBtb2RlCisgICAgICAgIGlmKHBvc3Rwcm9jZXNzX21hc2sgPT0gQ0FNX1FDT01fRkVBVFVSRV9OT05FKXsKKyAgICAgICAgICAgIExPR0goIm5lZWQgZG8gcmVwcm9jZXNzIGZvciBaU0wgV05SIG9yIG1pbiBQUCByZXByb2Nlc3MiKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HSCgiYWxyZWFkeSBwb3N0IHByb2Nlc3NlZCBmcmFtZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZWVkUm90YXRpb25SZXByb2Nlc3MoKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBuZWVkSnBlZ0V4aWZSb3RhdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOiBpZiByb3RhdGlvbiBmcm9tIGpwZWcgaXMgbmVlZGVkCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZTogbmVlZGVkCisgKiAgICAgICAgICAgICAgZmFsc2U6IG5vIG5lZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpuZWVkSnBlZ0V4aWZSb3RhdGlvbigpCit7CisgICAvKklmIHRoZSBwcCBkb2VzIG5vdCBoYXZlIHRoZSBhYmlsaXR5IHRvIGRvIHJvdGF0aW9uLCBlbmFibGUganBlZyByb3RhdGlvbiovCisgICAgaWYgKCEoZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYgQ0FNX1FDT01fRkVBVFVSRV9ST1RBVElPTikpIHsKKyAgICAgICBMT0dEKCJOZWVkIHVzZSBKcGVnIEVYSUYgUm90YXRpb24iKTsKKyAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFkZE9mZmxpbmVSZXByb2NDaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGFkZCBhIHJlcHJvY2VzcyBjaGFubmVsIHRoYXQgd2lsbCBkbyByZXByb2Nlc3Mgb24gZnJhbWVzCisgKiAgICAgICAgICAgICAgY29taW5nIGZyb20gaW5wdXQgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY29uZmlnICA6IHJlcHJvY2VzcyBjb25maWd1cmF0aW9uCisgKiAgIEBpbnB1dENoSGFuZGxlIDogcG9pbnRlciB0byB0aGUgaW5wdXQgKHNvdXJjZSkgY2hhbm5lbAorICoKKyAqCisgKiBSRVRVUk4gICAgIDogUHRyIHRvIHRoZSBuZXdseSBjcmVhdGVkIGNoYW5uZWwgb2JqLiBOVUxMIGlmIGZhaWxlZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsICpRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjphZGRPZmZsaW5lUmVwcm9jQ2hhbm5lbCgKKyAgICAgICAgY29uc3QgcmVwcm9jZXNzX2NvbmZpZ190ICZjb25maWcsIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWwgKmlucHV0Q2hIYW5kbGUpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbCAqcENoYW5uZWwgPSBOVUxMOworCisgICAgcENoYW5uZWwgPSBuZXcgUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsKG1DYW1lcmFIYW5kbGUtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICBtQ2hhbm5lbEhhbmRsZSwgbUNhbWVyYUhhbmRsZS0+b3BzLCBjYXB0dXJlUmVzdWx0Q2IsIGNvbmZpZy5wYWRkaW5nLAorICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9OT05FLCB0aGlzLCBpbnB1dENoSGFuZGxlKTsKKyAgICBpZiAoTlVMTCA9PSBwQ2hhbm5lbCkgeworICAgICAgICBMT0dFKCJubyBtZW0gZm9yIHJlcHJvY2VzcyBjaGFubmVsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJjID0gcENoYW5uZWwtPmluaXRpYWxpemUoSVNfVFlQRV9OT05FKTsKKyAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgTE9HRSgiaW5pdCByZXByb2Nlc3MgY2hhbm5lbCBmYWlsZWQsIHJldCA9ICVkIiwgcmMpOworICAgICAgICBkZWxldGUgcENoYW5uZWw7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIHBwIGZlYXR1cmUgY29uZmlnCisgICAgY2FtX3BwX2ZlYXR1cmVfY29uZmlnX3QgcHBfY29uZmlnOworICAgIG1lbXNldCgmcHBfY29uZmlnLCAwLCBzaXplb2YoY2FtX3BwX2ZlYXR1cmVfY29uZmlnX3QpKTsKKworICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9QUF9TVVBFUlNFVF9IQUwzOworICAgIGlmIChnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sKKyAgICAgICAgICAgICYgQ0FNX1FDT01fRkVBVFVSRV9EU0ROKSB7CisgICAgICAgIC8vVXNlIENQUCBDRFMgaW5jYXNlIGgvdyBzdXBwb3J0cyBpdC4KKyAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayAmPSB+Q0FNX1FDT01fRkVBVFVSRV9DRFM7CisgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9EU0ROOworICAgIH0KKyAgICBpZiAoIShnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX1JPVEFUSU9OKSkgeworICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrICY9IH5DQU1fUUNPTV9GRUFUVVJFX1JPVEFUSU9OOworICAgIH0KKworICAgIHJjID0gcENoYW5uZWwtPmFkZFJlcHJvY1N0cmVhbXNGcm9tU291cmNlKHBwX2NvbmZpZywKKyAgICAgICAgICAgIGNvbmZpZywKKyAgICAgICAgICAgIElTX1RZUEVfTk9ORSwKKyAgICAgICAgICAgIG1NZXRhZGF0YUNoYW5uZWwpOworCisgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGRlbGV0ZSBwQ2hhbm5lbDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBwQ2hhbm5lbDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRNb2JpY2F0TWFzaworICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm5zIG1vYmljYXQgbWFzaworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG1vYmljYXQgbWFzaworICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDhfdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpnZXRNb2JpY2F0TWFzaygpCit7CisgICAgcmV0dXJuIG1fTW9iaWNhdE1hc2s7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0TW9iaWNhdAorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgTW9iaWNhdCBvbi9vZmYuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwYXJhbXMgIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6c2V0TW9iaWNhdCgpCit7CisgICAgY2hhciB2YWx1ZSBbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLm1vYmljYXQiLCB2YWx1ZSwgIjAiKTsKKyAgICBpbnQzMl90IHJldCA9IE5PX0VSUk9SOworICAgIHVpbnQ4X3QgZW5hYmxlTW9iaSA9ICh1aW50OF90KWF0b2kodmFsdWUpOworCisgICAgaWYgKGVuYWJsZU1vYmkpIHsKKyAgICAgICAgdHVuZV9jbWRfdCB0dW5lX2NtZDsKKyAgICAgICAgdHVuZV9jbWQudHlwZSA9IFNFVF9SRUxPQURfQ0hST01BVElYOworICAgICAgICB0dW5lX2NtZC5tb2R1bGUgPSBNT0RVTEVfQUxMOworICAgICAgICB0dW5lX2NtZC52YWx1ZSA9IFRSVUU7CisgICAgICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobVBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9TRVRfVkZFX0NPTU1BTkQsCisgICAgICAgICAgICAgICAgdHVuZV9jbWQpOworCisgICAgICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobVBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9TRVRfUFBfQ09NTUFORCwKKyAgICAgICAgICAgICAgICB0dW5lX2NtZCk7CisgICAgfQorICAgIG1fTW9iaWNhdE1hc2sgPSBlbmFibGVNb2JpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRlVOQ1RJT04gICA6IGdldExvZ0xldmVsCisqCisqIERFU0NSSVBUSU9OOiBSZWFkcyB0aGUgbG9nIGxldmVsIHByb3BlcnR5IGludG8gYSB2YXJpYWJsZQorKgorKiBQQVJBTUVURVJTIDoKKyogICBOb25lCisqCisqIFJFVFVSTiAgICAgOgorKiAgIE5vbmUKKyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmdldExvZ0xldmVsKCkKK3sKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICB1aW50MzJfdCBnbG9iYWxMb2dMZXZlbCA9IDA7CisKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmhhbC5kZWJ1ZyIsIHByb3AsICIwIik7CisgICAgaW50IHZhbCA9IGF0b2kocHJvcCk7CisgICAgaWYgKDAgPD0gdmFsKSB7CisgICAgICAgIGdDYW1IYWwzTG9nTGV2ZWwgPSAodWludDMyX3QpdmFsOworICAgIH0KKworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEua3BpLmRlYnVnIiwgcHJvcCwgIjEiKTsKKyAgICBnS3BpRGVidWdMZXZlbCA9IGF0b2kocHJvcCk7CisKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmdsb2JhbC5kZWJ1ZyIsIHByb3AsICIwIik7CisgICAgdmFsID0gYXRvaShwcm9wKTsKKyAgICBpZiAoMCA8PSB2YWwpIHsKKyAgICAgICAgZ2xvYmFsTG9nTGV2ZWwgPSAodWludDMyX3QpdmFsOworICAgIH0KKworICAgIC8qIEhpZ2hlc3QgbG9nIGxldmVsIGFtb25nIGhhbC5sb2dzIGFuZCBnbG9iYWwubG9ncyBpcyBzZWxlY3RlZCAqLworICAgIGlmIChnQ2FtSGFsM0xvZ0xldmVsIDwgZ2xvYmFsTG9nTGV2ZWwpCisgICAgICAgIGdDYW1IYWwzTG9nTGV2ZWwgPSBnbG9iYWxMb2dMZXZlbDsKKworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB2YWxpZGF0ZVN0cmVhbVJvdGF0aW9ucworICoKKyAqIERFU0NSSVBUSU9OOiBDaGVjayBpZiB0aGUgcm90YXRpb25zIHJlcXVlc3RlZCBhcmUgc3VwcG9ydGVkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdHJlYW1fbGlzdCA6IHN0cmVhbXMgdG8gYmUgY29uZmlndXJlZAorICoKKyAqIFJFVFVSTiAgICAgOiBOT19FUlJPUiBvbiBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLUVJTlZBTCBvbiBmYWlsdXJlCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6dmFsaWRhdGVTdHJlYW1Sb3RhdGlvbnMoCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCAqc3RyZWFtTGlzdCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKworICAgIC8qCisgICAgKiBMb29wIHRocm91Z2ggYWxsIHN0cmVhbXMgcmVxdWVzdGVkIGluIGNvbmZpZ3VyYXRpb24KKyAgICAqIENoZWNrIGlmIHVuc3VwcG9ydGVkIHJvdGF0aW9ucyBoYXZlIGJlZW4gcmVxdWVzdGVkIG9uIGFueSBvZiB0aGVtCisgICAgKi8KKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHN0cmVhbUxpc3QtPm51bV9zdHJlYW1zOyBqKyspeworICAgICAgICBjYW1lcmEzX3N0cmVhbV90ICpuZXdTdHJlYW0gPSBzdHJlYW1MaXN0LT5zdHJlYW1zW2pdOworCisgICAgICAgIGJvb2wgaXNSb3RhdGVkID0gKG5ld1N0cmVhbS0+cm90YXRpb24gIT0gQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCk7CisgICAgICAgIGJvb2wgaXNJbXBsRGVmID0gKG5ld1N0cmVhbS0+Zm9ybWF0ID09CisgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKTsKKyAgICAgICAgYm9vbCBpc1pzbCA9IChuZXdTdHJlYW0tPnN0cmVhbV90eXBlID09IENBTUVSQTNfU1RSRUFNX0JJRElSRUNUSU9OQUwgJiYKKyAgICAgICAgICAgICAgICBpc0ltcGxEZWYpOworCisgICAgICAgIGlmIChpc1JvdGF0ZWQgJiYgKCFpc0ltcGxEZWYgfHwgaXNac2wpKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvcjogVW5zdXBwb3J0ZWQgcm90YXRpb24gb2YgJWQgcmVxdWVzdGVkIGZvciBzdHJlYW0iCisgICAgICAgICAgICAgICAgICAgICJ0eXBlOiVkIGFuZCBzdHJlYW0gZm9ybWF0OiVkIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT5yb3RhdGlvbiwgbmV3U3RyZWFtLT5zdHJlYW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbmV3U3RyZWFtLT5mb3JtYXQpOworICAgICAgICAgICAgcmMgPSAtRUlOVkFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIEZVTkNUSU9OICAgOiBnZXRGbGFzaEluZm8KKyoKKyogREVTQ1JJUFRJT046IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgdGhlIGRldmljZSBoYXMgYSBmbGFzaC4KKyoKKyogUEFSQU1FVEVSUyA6CisqICAgQGNhbWVyYUlkICA6IENhbWVyYSBpZCB0byBxdWVyeQorKiAgIEBoYXNGbGFzaCAgOiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGVyZSBpcyBhIGZsYXNoIGRldmljZQorKiAgICAgICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gY2FtZXJhCisqICAgQGZsYXNoTm9kZSA6IElmIGEgZmxhc2ggZGV2aWNlIGV4aXN0cywgdGhpcyB3aWxsIGJlIGl0cyBkZXZpY2Ugbm9kZS4KKyoKKyogUkVUVVJOICAgICA6CisqICAgTm9uZQorKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Z2V0Rmxhc2hJbmZvKGNvbnN0IGludCBjYW1lcmFJZCwKKyAgICAgICAgYm9vbCYgaGFzRmxhc2gsCisgICAgICAgIGNoYXIgKCZmbGFzaE5vZGUpW1FDQU1FUkFfTUFYX0ZJTEVQQVRIX0xFTkdUSF0pCit7CisgICAgY2FtX2NhcGFiaWxpdHlfdCogY2FtQ2FwYWJpbGl0eSA9IGdDYW1DYXBhYmlsaXR5W2NhbWVyYUlkXTsKKyAgICBpZiAoTlVMTCA9PSBjYW1DYXBhYmlsaXR5KSB7CisgICAgICAgIGhhc0ZsYXNoID0gZmFsc2U7CisgICAgICAgIGZsYXNoTm9kZVswXSA9ICdcMCc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaGFzRmxhc2ggPSBjYW1DYXBhYmlsaXR5LT5mbGFzaF9hdmFpbGFibGU7CisgICAgICAgIHN0cmxjcHkoZmxhc2hOb2RlLAorICAgICAgICAgICAgICAgIChjaGFyKiljYW1DYXBhYmlsaXR5LT5mbGFzaF9kZXZfbmFtZSwKKyAgICAgICAgICAgICAgICBRQ0FNRVJBX01BWF9GSUxFUEFUSF9MRU5HVEgpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRlVOQ1RJT04gICA6IGdldEVlcHJvbVZlcnNpb25JbmZvCisqCisqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZSB2ZXJzaW9uIGluZm8gb2YgdGhlIHNlbnNvciBFRVBST00gZGF0YQorKgorKiBQQVJBTUVURVJTIDogTm9uZQorKgorKiBSRVRVUk4gICAgIDogc3RyaW5nIGRlc2NyaWJpbmcgRUVQUk9NIHZlcnNpb24KKyogICAgICAgICAgICAgICJcMCIgaWYgbm8gc3VjaCBpbmZvIGF2YWlsYWJsZQorKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2NvbnN0IGNoYXIgKlFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmdldEVlcHJvbVZlcnNpb25JbmZvKCkKK3sKKyAgICByZXR1cm4gKGNvbnN0IGNoYXIgKikmZ0NhbUNhcGFiaWxpdHlbbUNhbWVyYUlkXS0+ZWVwcm9tX3ZlcnNpb25faW5mb1swXTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRlVOQ1RJT04gICA6IGdldExkYWZDYWxpYgorKgorKiBERVNDUklQVElPTjogUmV0cmlldmUgTGFzZXIgQUYgY2FsaWJyYXRpb24gZGF0YQorKgorKiBQQVJBTUVURVJTIDogTm9uZQorKgorKiBSRVRVUk4gICAgIDogVHdvIHVpbnQzMl90IGRlc2NyaWJpbmcgbGFzZXIgQUYgY2FsaWJyYXRpb24gZGF0YQorKiAgICAgICAgICAgICAgTlVMTCBpZiBub25lIGlzIGF2YWlsYWJsZS4KKyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjb25zdCB1aW50MzJfdCAqUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Z2V0TGRhZkNhbGliKCkKK3sKKyAgICBpZiAobUxkYWZDYWxpYkV4aXN0KSB7CisgICAgICAgIHJldHVybiAmbUxkYWZDYWxpYlswXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZHluYW1pY1VwZGF0ZU1ldGFTdHJlYW1JbmZvCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb246CisgKiAgICAgICAgICAgICAoMSkgc3RvcHMgYWxsIHRoZSBjaGFubmVscworICogICAgICAgICAgICAgKDIpIHJldHVybnMgZXJyb3Igb24gcGVuZGluZyByZXF1ZXN0cyBhbmQgYnVmZmVycworICogICAgICAgICAgICAgKDMpIHNlbmRzIG1ldGFzdHJlYW1faW5mbyBpbiBzZXRwYXJhbXMKKyAqICAgICAgICAgICAgICg0KSBzdGFydHMgYWxsIGNoYW5uZWxzCisgKiAgICAgICAgICAgICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHNlbnNvciBoYXMgdG8gYmUgcmVzdGFydGVkIHRvIGFwcGx5IGFueQorICogICAgICAgICAgICAgc2V0dGluZ3Mgc3VjaCBhcyBmcmFtZSByYXRlIGZyb20gYSBkaWZmZXJlbnQgc2Vuc29yIG1vZGUKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOT19FUlJPUiBvbiBzdWNjZXNzCisgKiAgICAgICAgICAgICAgRXJyb3IgY29kZXMgb24gZmFpbHVyZQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpkeW5hbWljVXBkYXRlTWV0YVN0cmVhbUluZm8oKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisKKyAgICBMT0dEKCJFIik7CisKKyAgICByYyA9IHN0b3BBbGxDaGFubmVscygpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgic3RvcEFsbENoYW5uZWxzIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmMgPSBub3RpZnlFcnJvckZvclBlbmRpbmdSZXF1ZXN0cygpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgibm90aWZ5RXJyb3JGb3JQZW5kaW5nUmVxdWVzdHMgZmFpbGVkIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbVN0cmVhbUNvbmZpZ0luZm8ubnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBMT0dJKCJTVFJFQU0gSU5GTyA6IHR5cGUgJWQsIHd4aDogJWQgeCAlZCwgcHBfbWFzazogMHgleCIKKyAgICAgICAgICAgICAgICAiRm9ybWF0OiVkIiwKKyAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby50eXBlW2ldLAorICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnN0cmVhbV9zaXplc1tpXS53aWR0aCwKKyAgICAgICAgICAgICAgICBtU3RyZWFtQ29uZmlnSW5mby5zdHJlYW1fc2l6ZXNbaV0uaGVpZ2h0LAorICAgICAgICAgICAgICAgIG1TdHJlYW1Db25maWdJbmZvLnBvc3Rwcm9jZXNzX21hc2tbaV0sCisgICAgICAgICAgICAgICAgbVN0cmVhbUNvbmZpZ0luZm8uZm9ybWF0W2ldKTsKKyAgICB9CisKKyAgICAvKiBTZW5kIG1ldGEgc3RyZWFtIGluZm8gb25jZSBhZ2FpbiBzbyB0aGF0IElTUCBjYW4gc3RhcnQgKi8KKyAgICBBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKG1QYXJhbWV0ZXJzLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9TVFJFQU1fSU5GTywgbVN0cmVhbUNvbmZpZ0luZm8pOworICAgIHJjID0gbUNhbWVyYUhhbmRsZS0+b3BzLT5zZXRfcGFybXMobUNhbWVyYUhhbmRsZS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgIG1QYXJhbWV0ZXJzKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoInNldCBNZXRhc3RyZWFtaW5mbyBmYWlsZWQuIFNlbnNvciBtb2RlIGRvZXMgbm90IGNoYW5nZSIpOworICAgIH0KKworICAgIHJjID0gc3RhcnRBbGxDaGFubmVscygpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgic3RhcnRBbGxDaGFubmVscyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIExPR0QoIlgiKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RvcEFsbENoYW5uZWxzCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gc3RvcHMgKGVxdWl2YWxlbnQgdG8gc3RyZWFtLW9mZikgYWxsIGNoYW5uZWxzCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTk9fRVJST1Igb24gc3VjY2VzcworICogICAgICAgICAgICAgIEVycm9yIGNvZGVzIG9uIGZhaWx1cmUKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6c3RvcEFsbENoYW5uZWxzKCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBMT0dEKCJTdG9wcGluZyBhbGwgY2hhbm5lbHMiKTsKKyAgICAvLyBTdG9wIHRoZSBTdHJlYW1zL0NoYW5uZWxzCisgICAgZm9yIChMaXN0PHN0cmVhbV9pbmZvX3QgKj46Oml0ZXJhdG9yIGl0ID0gbVN0cmVhbUluZm8uYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gbVN0cmVhbUluZm8uZW5kKCk7IGl0KyspIHsKKyAgICAgICAgUUNhbWVyYTNDaGFubmVsICpjaGFubmVsID0gKFFDYW1lcmEzQ2hhbm5lbCAqKSgqaXQpLT5zdHJlYW0tPnByaXY7CisgICAgICAgIGlmIChjaGFubmVsKSB7CisgICAgICAgICAgICBjaGFubmVsLT5zdG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgKCppdCktPnN0YXR1cyA9IElOVkFMSUQ7CisgICAgfQorCisgICAgaWYgKG1TdXBwb3J0Q2hhbm5lbCkgeworICAgICAgICBtU3VwcG9ydENoYW5uZWwtPnN0b3AoKTsKKyAgICB9CisgICAgaWYgKG1BbmFseXNpc0NoYW5uZWwpIHsKKyAgICAgICAgbUFuYWx5c2lzQ2hhbm5lbC0+c3RvcCgpOworICAgIH0KKyAgICBpZiAobVJhd0R1bXBDaGFubmVsKSB7CisgICAgICAgIG1SYXdEdW1wQ2hhbm5lbC0+c3RvcCgpOworICAgIH0KKyAgICBpZiAobU1ldGFkYXRhQ2hhbm5lbCkgeworICAgICAgICAvKiBJZiBjb250ZW50IG9mIG1TdHJlYW1JbmZvIGlzIG5vdCAwLCB0aGVyZSBpcyBtZXRhZGF0YSBzdHJlYW0gKi8KKyAgICAgICAgbU1ldGFkYXRhQ2hhbm5lbC0+c3RvcCgpOworICAgIH0KKworICAgIExPR0QoIkFsbCBjaGFubmVscyBzdG9wcGVkIik7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHN0YXJ0QWxsQ2hhbm5lbHMKKyAqCisgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBzdGFydHMgKGVxdWl2YWxlbnQgdG8gc3RyZWFtLW9uKSBhbGwgY2hhbm5lbHMKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOT19FUlJPUiBvbiBzdWNjZXNzCisgKiAgICAgICAgICAgICAgRXJyb3IgY29kZXMgb24gZmFpbHVyZQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpzdGFydEFsbENoYW5uZWxzKCkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBMT0dEKCJTdGFydCBhbGwgY2hhbm5lbHMgIik7CisgICAgLy8gU3RhcnQgdGhlIFN0cmVhbXMvQ2hhbm5lbHMKKyAgICBpZiAobU1ldGFkYXRhQ2hhbm5lbCkgeworICAgICAgICAvKiBJZiBjb250ZW50IG9mIG1TdHJlYW1JbmZvIGlzIG5vdCAwLCB0aGVyZSBpcyBtZXRhZGF0YSBzdHJlYW0gKi8KKyAgICAgICAgcmMgPSBtTWV0YWRhdGFDaGFubmVsLT5zdGFydCgpOworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJNRVRBIGNoYW5uZWwgc3RhcnQgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChMaXN0PHN0cmVhbV9pbmZvX3QgKj46Oml0ZXJhdG9yIGl0ID0gbVN0cmVhbUluZm8uYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gbVN0cmVhbUluZm8uZW5kKCk7IGl0KyspIHsKKyAgICAgICAgUUNhbWVyYTNDaGFubmVsICpjaGFubmVsID0gKFFDYW1lcmEzQ2hhbm5lbCAqKSgqaXQpLT5zdHJlYW0tPnByaXY7CisgICAgICAgIGlmIChjaGFubmVsKSB7CisgICAgICAgICAgICByYyA9IGNoYW5uZWwtPnN0YXJ0KCk7CisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiY2hhbm5lbCBzdGFydCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1BbmFseXNpc0NoYW5uZWwpIHsKKyAgICAgICAgbUFuYWx5c2lzQ2hhbm5lbC0+c3RhcnQoKTsKKyAgICB9CisgICAgaWYgKG1TdXBwb3J0Q2hhbm5lbCkgeworICAgICAgICByYyA9IG1TdXBwb3J0Q2hhbm5lbC0+c3RhcnQoKTsKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiU3VwcG9ydCBjaGFubmVsIHN0YXJ0IGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtUmF3RHVtcENoYW5uZWwpIHsKKyAgICAgICAgcmMgPSBtUmF3RHVtcENoYW5uZWwtPnN0YXJ0KCk7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIlJBVyBkdW1wIGNoYW5uZWwgc3RhcnQgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dEKCJBbGwgY2hhbm5lbHMgc3RhcnRlZCIpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBub3RpZnlFcnJvckZvclBlbmRpbmdSZXF1ZXN0cworICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIHNlbmRzIGVycm9yIGZvciBhbGwgdGhlIHBlbmRpbmcgcmVxdWVzdHMvYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IEVycm9yIGNvZGVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1Igb24gc3VjY2VzcworICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpub3RpZnlFcnJvckZvclBlbmRpbmdSZXF1ZXN0cygpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIHVuc2lnbmVkIGludCBmcmFtZU51bSA9IDA7CisgICAgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdF90IHJlc3VsdDsKKyAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqcFN0cmVhbV9CdWYgPSBOVUxMOworCisgICAgbWVtc2V0KCZyZXN1bHQsIDAsIHNpemVvZihjYW1lcmEzX2NhcHR1cmVfcmVzdWx0X3QpKTsKKworICAgIGlmIChtUGVuZGluZ1JlcXVlc3RzTGlzdC5zaXplKCkgPiAwKSB7CisgICAgICAgIHBlbmRpbmdSZXF1ZXN0SXRlcmF0b3IgaSA9IG1QZW5kaW5nUmVxdWVzdHNMaXN0LmJlZ2luKCk7CisgICAgICAgIGZyYW1lTnVtID0gaS0+ZnJhbWVfbnVtYmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRoZXJlIG1pZ2h0IHN0aWxsIGJlIHBlbmRpbmcgYnVmZmVycyBldmVuIHRob3VnaCB0aGVyZSBhcmUKKyAgICAgICAgIG5vIHBlbmRpbmcgcmVxdWVzdHMuIFNldHRpbmcgdGhlIGZyYW1lTnVtIHRvIE1BWCBzbyB0aGF0CisgICAgICAgICBhbGwgdGhlIGJ1ZmZlcnMgd2l0aCBzbWFsbGVyIGZyYW1lIG51bWJlcnMgYXJlIHJldHVybmVkICovCisgICAgICAgIGZyYW1lTnVtID0gVUlOVF9NQVg7CisgICAgfQorCisgICAgTE9HSCgiT2xkZXN0IGZyYW1lIG51bSBvbiBtUGVuZGluZ1JlcXVlc3RzTGlzdCA9ICV1IiwKKyAgICAgICBmcmFtZU51bSk7CisKKyAgICBmb3IgKGF1dG8gcmVxID0gbVBlbmRpbmdCdWZmZXJzTWFwLm1QZW5kaW5nQnVmZmVyc0luUmVxdWVzdC5iZWdpbigpOworICAgICAgICAgICAgcmVxICE9IG1QZW5kaW5nQnVmZmVyc01hcC5tUGVuZGluZ0J1ZmZlcnNJblJlcXVlc3QuZW5kKCk7ICkgeworCisgICAgICAgIGlmIChyZXEtPmZyYW1lX251bWJlciA8IGZyYW1lTnVtKSB7CisgICAgICAgICAgICAvLyBTZW5kIEVycm9yIG5vdGlmeSB0byBmcmFtZXdvcmtzIGZvciBlYWNoIGJ1ZmZlciBmb3Igd2hpY2gKKyAgICAgICAgICAgIC8vIG1ldGFkYXRhIGJ1ZmZlciBpcyBhbHJlYWR5IHNlbnQKKyAgICAgICAgICAgIExPR0goIlNlbmRpbmcgRVJST1IgQlVGRkVSIGZvciBmcmFtZSAlZCBmb3IgJWQgYnVmZmVyKHMpIiwKKyAgICAgICAgICAgICAgICByZXEtPmZyYW1lX251bWJlciwgcmVxLT5tUGVuZGluZ0J1ZmZlckxpc3Quc2l6ZSgpKTsKKworICAgICAgICAgICAgcFN0cmVhbV9CdWYgPSBuZXcgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3RbcmVxLT5tUGVuZGluZ0J1ZmZlckxpc3Quc2l6ZSgpXTsKKyAgICAgICAgICAgIGlmIChOVUxMID09IHBTdHJlYW1fQnVmKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBwZW5kaW5nIGJ1ZmZlcnMgYXJyYXkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtc2V0KHBTdHJlYW1fQnVmLCAwLAorICAgICAgICAgICAgICAgIHNpemVvZihjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCkqcmVxLT5tUGVuZGluZ0J1ZmZlckxpc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIHJlc3VsdC5yZXN1bHQgPSBOVUxMOworICAgICAgICAgICAgcmVzdWx0LmZyYW1lX251bWJlciA9IHJlcS0+ZnJhbWVfbnVtYmVyOworICAgICAgICAgICAgcmVzdWx0Lm51bV9vdXRwdXRfYnVmZmVycyA9IHJlcS0+bVBlbmRpbmdCdWZmZXJMaXN0LnNpemUoKTsKKyAgICAgICAgICAgIHJlc3VsdC5vdXRwdXRfYnVmZmVycyA9IHBTdHJlYW1fQnVmOworCisgICAgICAgICAgICBzaXplX3QgaW5kZXggPSAwOworICAgICAgICAgICAgZm9yIChhdXRvIGluZm8gPSByZXEtPm1QZW5kaW5nQnVmZmVyTGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgIGluZm8gIT0gcmVxLT5tUGVuZGluZ0J1ZmZlckxpc3QuZW5kKCk7ICkgeworCisgICAgICAgICAgICAgICAgY2FtZXJhM19ub3RpZnlfbXNnX3Qgbm90aWZ5X21zZzsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJm5vdGlmeV9tc2csIDAsIHNpemVvZihjYW1lcmEzX25vdGlmeV9tc2dfdCkpOworICAgICAgICAgICAgICAgIG5vdGlmeV9tc2cudHlwZSA9IENBTUVSQTNfTVNHX0VSUk9SOworICAgICAgICAgICAgICAgIG5vdGlmeV9tc2cubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBM19NU0dfRVJST1JfQlVGRkVSOworICAgICAgICAgICAgICAgIG5vdGlmeV9tc2cubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBpbmZvLT5zdHJlYW07CisgICAgICAgICAgICAgICAgbm90aWZ5X21zZy5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciA9IHJlcS0+ZnJhbWVfbnVtYmVyOworICAgICAgICAgICAgICAgIHBTdHJlYW1fQnVmW2luZGV4XS5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICAgICAgcFN0cmVhbV9CdWZbaW5kZXhdLnJlbGVhc2VfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICBwU3RyZWFtX0J1ZltpbmRleF0uYnVmZmVyID0gaW5mby0+YnVmZmVyOworICAgICAgICAgICAgICAgIHBTdHJlYW1fQnVmW2luZGV4XS5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICAgICAgcFN0cmVhbV9CdWZbaW5kZXhdLnN0cmVhbSA9IGluZm8tPnN0cmVhbTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tPcHMtPm5vdGlmeShtQ2FsbGJhY2tPcHMsICZub3RpZnlfbXNnKTsKKyAgICAgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBidWZmZXIgZnJvbSBsaXN0CisgICAgICAgICAgICAgICAgaW5mbyA9IHJlcS0+bVBlbmRpbmdCdWZmZXJMaXN0LmVyYXNlKGluZm8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyByZXF1ZXN0IGZyb20gTWFwCisgICAgICAgICAgICBMT0dEKCJSZW1vdmluZyByZXF1ZXN0ICVkLiBSZW1haW5pbmcgcmVxdWVzdHMgaW4gbVBlbmRpbmdCdWZmZXJzTWFwOiAlZCIsCisgICAgICAgICAgICAgICAgcmVxLT5mcmFtZV9udW1iZXIsIG1QZW5kaW5nQnVmZmVyc01hcC5tUGVuZGluZ0J1ZmZlcnNJblJlcXVlc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIHJlcSA9IG1QZW5kaW5nQnVmZmVyc01hcC5tUGVuZGluZ0J1ZmZlcnNJblJlcXVlc3QuZXJhc2UocmVxKTsKKworICAgICAgICAgICAgbUNhbGxiYWNrT3BzLT5wcm9jZXNzX2NhcHR1cmVfcmVzdWx0KG1DYWxsYmFja09wcywgJnJlc3VsdCk7CisKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBwU3RyZWFtX0J1ZjsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gR28gdGhyb3VnaCB0aGUgcGVuZGluZyByZXF1ZXN0cyBpbmZvIGFuZCBzZW5kIGVycm9yIHJlcXVlc3QgdG8gZnJhbWV3b3JrCisgICAgICAgICAgICBwZW5kaW5nUmVxdWVzdEl0ZXJhdG9yIGkgPSBtUGVuZGluZ1JlcXVlc3RzTGlzdC5iZWdpbigpOyAvL21ha2Ugc3VyZSBpIGlzIGF0IHRoZSBiZWdpbm5pbmcKKworICAgICAgICAgICAgTE9HSCgiU2VuZGluZyBFUlJPUiBSRVFVRVNUIGZvciBmcmFtZSAlZCIsIHJlcS0+ZnJhbWVfbnVtYmVyKTsKKworICAgICAgICAgICAgLy8gU2VuZCBlcnJvciBub3RpZnkgdG8gZnJhbWV3b3JrcworICAgICAgICAgICAgY2FtZXJhM19ub3RpZnlfbXNnX3Qgbm90aWZ5X21zZzsKKyAgICAgICAgICAgIG1lbXNldCgmbm90aWZ5X21zZywgMCwgc2l6ZW9mKGNhbWVyYTNfbm90aWZ5X21zZ190KSk7CisgICAgICAgICAgICBub3RpZnlfbXNnLnR5cGUgPSBDQU1FUkEzX01TR19FUlJPUjsKKyAgICAgICAgICAgIG5vdGlmeV9tc2cubWVzc2FnZS5lcnJvci5lcnJvcl9jb2RlID0gQ0FNRVJBM19NU0dfRVJST1JfUkVRVUVTVDsKKyAgICAgICAgICAgIG5vdGlmeV9tc2cubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBOVUxMOworICAgICAgICAgICAgbm90aWZ5X21zZy5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciA9IHJlcS0+ZnJhbWVfbnVtYmVyOworICAgICAgICAgICAgbUNhbGxiYWNrT3BzLT5ub3RpZnkobUNhbGxiYWNrT3BzLCAmbm90aWZ5X21zZyk7CisKKyAgICAgICAgICAgIHBTdHJlYW1fQnVmID0gbmV3IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90W3JlcS0+bVBlbmRpbmdCdWZmZXJMaXN0LnNpemUoKV07CisgICAgICAgICAgICBpZiAoTlVMTCA9PSBwU3RyZWFtX0J1ZikgeworICAgICAgICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgcGVuZGluZyBidWZmZXJzIGFycmF5Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbXNldChwU3RyZWFtX0J1ZiwgMCwgc2l6ZW9mKGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90KSpyZXEtPm1QZW5kaW5nQnVmZmVyTGlzdC5zaXplKCkpOworCisgICAgICAgICAgICByZXN1bHQucmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgIHJlc3VsdC5mcmFtZV9udW1iZXIgPSByZXEtPmZyYW1lX251bWJlcjsKKyAgICAgICAgICAgIHJlc3VsdC5pbnB1dF9idWZmZXIgPSBpLT5pbnB1dF9idWZmZXI7CisgICAgICAgICAgICByZXN1bHQubnVtX291dHB1dF9idWZmZXJzID0gcmVxLT5tUGVuZGluZ0J1ZmZlckxpc3Quc2l6ZSgpOworICAgICAgICAgICAgcmVzdWx0Lm91dHB1dF9idWZmZXJzID0gcFN0cmVhbV9CdWY7CisKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgICAgICAgICBmb3IgKGF1dG8gaW5mbyA9IHJlcS0+bVBlbmRpbmdCdWZmZXJMaXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaW5mbyAhPSByZXEtPm1QZW5kaW5nQnVmZmVyTGlzdC5lbmQoKTsgKSB7CisgICAgICAgICAgICAgICAgcFN0cmVhbV9CdWZbaW5kZXhdLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICBwU3RyZWFtX0J1ZltpbmRleF0ucmVsZWFzZV9mZW5jZSA9IC0xOworICAgICAgICAgICAgICAgIHBTdHJlYW1fQnVmW2luZGV4XS5idWZmZXIgPSBpbmZvLT5idWZmZXI7CisgICAgICAgICAgICAgICAgcFN0cmVhbV9CdWZbaW5kZXhdLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICAgICAgICBwU3RyZWFtX0J1ZltpbmRleF0uc3RyZWFtID0gaW5mby0+c3RyZWFtOworICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGJ1ZmZlciBmcm9tIGxpc3QKKyAgICAgICAgICAgICAgICBpbmZvID0gcmVxLT5tUGVuZGluZ0J1ZmZlckxpc3QuZXJhc2UoaW5mbyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIHJlcXVlc3QgZnJvbSBNYXAKKyAgICAgICAgICAgIExPR0QoIlJlbW92aW5nIHJlcXVlc3QgJWQuIFJlbWFpbmluZyByZXF1ZXN0cyBpbiBtUGVuZGluZ0J1ZmZlcnNNYXA6ICVkIiwKKyAgICAgICAgICAgICAgICByZXEtPmZyYW1lX251bWJlciwgbVBlbmRpbmdCdWZmZXJzTWFwLm1QZW5kaW5nQnVmZmVyc0luUmVxdWVzdC5zaXplKCkpOworICAgICAgICAgICAgcmVxID0gbVBlbmRpbmdCdWZmZXJzTWFwLm1QZW5kaW5nQnVmZmVyc0luUmVxdWVzdC5lcmFzZShyZXEpOworCisgICAgICAgICAgICBtQ2FsbGJhY2tPcHMtPnByb2Nlc3NfY2FwdHVyZV9yZXN1bHQobUNhbGxiYWNrT3BzLCAmcmVzdWx0KTsKKyAgICAgICAgICAgIGRlbGV0ZSBbXSBwU3RyZWFtX0J1ZjsKKyAgICAgICAgICAgIGkgPSBlcmFzZVBlbmRpbmdSZXF1ZXN0KGkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogUmVzZXQgcGVuZGluZyBmcmFtZSBEcm9wIGxpc3QgYW5kIHJlcXVlc3RzIGxpc3QgKi8KKyAgICBtUGVuZGluZ0ZyYW1lRHJvcExpc3QuY2xlYXIoKTsKKworICAgIGZvciAoYXV0byAmcmVxIDogbVBlbmRpbmdCdWZmZXJzTWFwLm1QZW5kaW5nQnVmZmVyc0luUmVxdWVzdCkgeworICAgICAgICByZXEubVBlbmRpbmdCdWZmZXJMaXN0LmNsZWFyKCk7CisgICAgfQorICAgIG1QZW5kaW5nQnVmZmVyc01hcC5tUGVuZGluZ0J1ZmZlcnNJblJlcXVlc3QuY2xlYXIoKTsKKyAgICBtUGVuZGluZ1JlcHJvY2Vzc1Jlc3VsdExpc3QuY2xlYXIoKTsKKyAgICBMT0dIKCJDbGVhcmVkIGFsbCB0aGUgcGVuZGluZyBidWZmZXJzICIpOworCisgICAgcmV0dXJuIHJjOworfQorCitib29sIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmlzT25FbmNvZGVyKAorICAgICAgICBjb25zdCBjYW1fZGltZW5zaW9uX3QgbWF4X3ZpZXdmaW5kZXJfc2l6ZSwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKK3sKKyAgICByZXR1cm4gKHdpZHRoID4gKHVpbnQzMl90KW1heF92aWV3ZmluZGVyX3NpemUud2lkdGggfHwKKyAgICAgICAgICAgIGhlaWdodCA+ICh1aW50MzJfdCltYXhfdmlld2ZpbmRlcl9zaXplLmhlaWdodCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc2V0QnVuZGxlSW5mbworICoKKyAqIERFU0NSSVBUSU9OOiBTZXQgYnVuZGxlIGluZm8gZm9yIGFsbCBzdHJlYW1zIHRoYXQgYXJlIGJ1bmRsZS4KKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOT19FUlJPUiBvbiBzdWNjZXNzCisgKiAgICAgICAgICAgICAgRXJyb3IgY29kZXMgb24gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OnNldEJ1bmRsZUluZm8oKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIGlmIChtQ2hhbm5lbEhhbmRsZSkgeworICAgICAgICBjYW1fYnVuZGxlX2NvbmZpZ190IGJ1bmRsZUluZm87CisgICAgICAgIG1lbXNldCgmYnVuZGxlSW5mbywgMCwgc2l6ZW9mKGJ1bmRsZUluZm8pKTsKKyAgICAgICAgcmMgPSBtQ2FtZXJhSGFuZGxlLT5vcHMtPmdldF9idW5kbGVfaW5mbygKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSGFuZGxlLT5jYW1lcmFfaGFuZGxlLCBtQ2hhbm5lbEhhbmRsZSwgJmJ1bmRsZUluZm8pOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIExPR0UoImdldF9idW5kbGVfaW5mbyBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorICAgICAgICBpZiAobUFuYWx5c2lzQ2hhbm5lbCkgeworICAgICAgICAgICAgbUFuYWx5c2lzQ2hhbm5lbC0+c2V0QnVuZGxlSW5mbyhidW5kbGVJbmZvKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVN1cHBvcnRDaGFubmVsKSB7CisgICAgICAgICAgICBtU3VwcG9ydENoYW5uZWwtPnNldEJ1bmRsZUluZm8oYnVuZGxlSW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChMaXN0PHN0cmVhbV9pbmZvX3QgKj46Oml0ZXJhdG9yIGl0ID0gbVN0cmVhbUluZm8uYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBtU3RyZWFtSW5mby5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgUUNhbWVyYTNDaGFubmVsICpjaGFubmVsID0gKFFDYW1lcmEzQ2hhbm5lbCAqKSgqaXQpLT5zdHJlYW0tPnByaXY7CisgICAgICAgICAgICBjaGFubmVsLT5zZXRCdW5kbGVJbmZvKGJ1bmRsZUluZm8pOworICAgICAgICB9CisgICAgICAgIGlmIChtUmF3RHVtcENoYW5uZWwpIHsKKyAgICAgICAgICAgIG1SYXdEdW1wQ2hhbm5lbC0+c2V0QnVuZGxlSW5mbyhidW5kbGVJbmZvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRfbnVtX292ZXJhbGxfYnVmZmVycworICoKKyAqIERFU0NSSVBUSU9OOiBFc3RpbWF0ZSBudW1iZXIgb2YgcGVuZGluZyBidWZmZXJzIGFjcm9zcyBhbGwgcmVxdWVzdHMuCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTnVtYmVyIG9mIG92ZXJhbGwgcGVuZGluZyBidWZmZXJzCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50MzJfdCBQZW5kaW5nQnVmZmVyc01hcDo6Z2V0X251bV9vdmVyYWxsX2J1ZmZlcnMoKQoreworICAgIHVpbnQzMl90IHN1bV9idWZmZXJzID0gMDsKKyAgICBmb3IgKGF1dG8gJnJlcSA6IG1QZW5kaW5nQnVmZmVyc0luUmVxdWVzdCkgeworICAgICAgICBzdW1fYnVmZmVycyArPSByZXEubVBlbmRpbmdCdWZmZXJMaXN0LnNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIHN1bV9idWZmZXJzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbW92ZUJ1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBSZW1vdmUgYSBtYXRjaGluZyBidWZmZXIgZnJvbSB0cmFja2VyLgorICoKKyAqIFBBUkFNRVRFUlMgOiBAYnVmZmVyOiBpbWFnZSBidWZmZXIgZm9yIHRoZSBjYWxsYmFjaworICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFBlbmRpbmdCdWZmZXJzTWFwOjpyZW1vdmVCdWYoYnVmZmVyX2hhbmRsZV90ICpidWZmZXIpCit7CisgICAgYm9vbCBidWZmZXJfZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gcmVxID0gbVBlbmRpbmdCdWZmZXJzSW5SZXF1ZXN0LmJlZ2luKCk7CisgICAgICAgICAgICByZXEgIT0gbVBlbmRpbmdCdWZmZXJzSW5SZXF1ZXN0LmVuZCgpOyByZXErKykgeworICAgICAgICBmb3IgKGF1dG8gayA9IHJlcS0+bVBlbmRpbmdCdWZmZXJMaXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgayAhPSByZXEtPm1QZW5kaW5nQnVmZmVyTGlzdC5lbmQoKTsgaysrICkgeworICAgICAgICAgICAgaWYgKGstPmJ1ZmZlciA9PSBidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJGcmFtZSAlZDogRm91bmQgRnJhbWUgYnVmZmVyICVwLCB0YWtlIGl0IG91dCBmcm9tIG1QZW5kaW5nQnVmZmVyTGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXEtPmZyYW1lX251bWJlciwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBrID0gcmVxLT5tUGVuZGluZ0J1ZmZlckxpc3QuZXJhc2Uoayk7CisgICAgICAgICAgICAgICAgaWYgKHJlcS0+bVBlbmRpbmdCdWZmZXJMaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoaXMgcmVxdWVzdCBmcm9tIE1hcAorICAgICAgICAgICAgICAgICAgICByZXEgPSBtUGVuZGluZ0J1ZmZlcnNJblJlcXVlc3QuZXJhc2UocmVxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmZmVyX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyX2ZvdW5kKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dEKCJtUGVuZGluZ0J1ZmZlcnNNYXAubnVtX292ZXJhbGxfYnVmZmVycyA9ICVkIiwKKyAgICAgICAgICAgIGdldF9udW1fb3ZlcmFsbF9idWZmZXJzKCkpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFBBQUZTdXBwb3J0CisgKgorICogREVTQ1JJUFRJT046IFNldCB0aGUgcHJldmlldy1hc3Npc3RlZCBhdXRvIGZvY3VzIHN1cHBvcnQgYml0IGluCisgKiAgICAgICAgICAgICAgZmVhdHVyZSBtYXNrIGFjY29yZGluZyB0byBzdHJlYW0gdHlwZSBhbmQgZmlsdGVyCisgKiAgICAgICAgICAgICAgYXJyYW5nZW1lbnQKKyAqCisgKiBQQVJBTUVURVJTIDogQGZlYXR1cmVfbWFzazogY3VycmVudCBmZWF0dXJlIG1hc2ssIHdoaWNoIG1heSBiZSBtb2RpZmllZAorICogICAgICAgICAgICAgIEBzdHJlYW1fdHlwZTogc3RyZWFtIHR5cGUKKyAqICAgICAgICAgICAgICBAZmlsdGVyX2FycmFuZ2VtZW50OiBmaWx0ZXIgYXJyYW5nZW1lbnQKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OnNldFBBQUZTdXBwb3J0KAorICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QmIGZlYXR1cmVfbWFzaywKKyAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUsCisgICAgICAgIGNhbV9jb2xvcl9maWx0ZXJfYXJyYW5nZW1lbnRfdCBmaWx0ZXJfYXJyYW5nZW1lbnQpCit7CisgICAgTE9HRCgiZmVhdHVyZV9tYXNrPTB4JWxseDsgc3RyZWFtX3R5cGU9JWQsIGZpbHRlcl9hcnJhbmdlbWVudD0lZCIsCisgICAgICAgICAgICBmZWF0dXJlX21hc2ssIHN0cmVhbV90eXBlLCBmaWx0ZXJfYXJyYW5nZW1lbnQpOworCisgICAgc3dpdGNoIChmaWx0ZXJfYXJyYW5nZW1lbnQpIHsKKyAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfUkdHQjoKKyAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfR1JCRzoKKyAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfR0JSRzoKKyAgICBjYXNlIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfQkdHUjoKKyAgICAgICAgaWYgKChzdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfQ0FMTEJBQ0spIHx8CisgICAgICAgICAgICAgICAgKHN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXKSB8fAorICAgICAgICAgICAgICAgIChzdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfVklERU8pKSB7CisgICAgICAgICAgICBmZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9QQUFGOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZJTFRFUl9BUlJBTkdFTUVOVF9ZOgorICAgICAgICBpZiAoc3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTKSB7CisgICAgICAgICAgICBmZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9QQUFGOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRlVOQ1RJT04gICA6IGdldFNlbnNvck1vdW50QW5nbGUKKyoKKyogREVTQ1JJUFRJT046IFJldHJpZXZlIHNlbnNvciBtb3VudCBhbmdsZQorKgorKiBQQVJBTUVURVJTIDogTm9uZQorKgorKiBSRVRVUk4gICAgIDogc2Vuc29yIG1vdW50IGFuZ2xlIGluIHVpbnQzMl90CisqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Z2V0U2Vuc29yTW91bnRBbmdsZSgpCit7CisgICAgcmV0dXJuIGdDYW1DYXBhYmlsaXR5W21DYW1lcmFJZF0tPnNlbnNvcl9tb3VudF9hbmdsZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRlVOQ1RJT04gICA6IGdldFJlbGF0ZWRDYWxpYnJhdGlvbkRhdGEKKyoKKyogREVTQ1JJUFRJT046IFJldHJpZXZlIHJlbGF0ZWQgc3lzdGVtIGNhbGlicmF0aW9uIGRhdGEKKyoKKyogUEFSQU1FVEVSUyA6IE5vbmUKKyoKKyogUkVUVVJOICAgICA6IFBvaW50ZXIgb2YgcmVsYXRlZCBzeXN0ZW0gY2FsaWJyYXRpb24gZGF0YQorKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2NvbnN0IGNhbV9yZWxhdGVkX3N5c3RlbV9jYWxpYnJhdGlvbl9kYXRhX3QgKlFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmdldFJlbGF0ZWRDYWxpYnJhdGlvbkRhdGEoKQoreworICAgIHJldHVybiAoY29uc3QgY2FtX3JlbGF0ZWRfc3lzdGVtX2NhbGlicmF0aW9uX2RhdGFfdCAqKQorICAgICAgICAgICAgJihnQ2FtQ2FwYWJpbGl0eVttQ2FtZXJhSWRdLT5yZWxhdGVkX2NhbV9jYWxpYnJhdGlvbik7Cit9Cit9OyAvL2VuZCBuYW1lc3BhY2UgcWNhbWVyYQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNIV0kuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzSFdJLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2Y3ZmIwMwotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzSFdJLmgKQEAgLTAsMCArMSw1NTEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyogbWV0OgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKi8KKworI2lmbmRlZiBfX1FDQU1FUkEzSEFSRFdBUkVJTlRFUkZBQ0VfSF9fCisjZGVmaW5lIF9fUUNBTUVSQTNIQVJEV0FSRUlOVEVSRkFDRV9IX18KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTMuaCIKKyNpbmNsdWRlICJRQ2FtZXJhM0NoYW5uZWwuaCIKKyNpbmNsdWRlICJRQ2FtZXJhM0Nyb3BSZWdpb25NYXBwZXIuaCIKKyNpbmNsdWRlICJRQ2FtZXJhM0hBTEhlYWRlci5oIgorI2luY2x1ZGUgIlFDYW1lcmEzTWVtLmgiCisjaW5jbHVkZSAiUUNhbWVyYVBlcmYuaCIKKyNpbmNsdWRlICJRQ2FtZXJhQ29tbW9uLmgiCisjaW5jbHVkZSAiUUNhbWVyYTNWZW5kb3JUYWdzLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJtbV9qcGVnX2ludGVyZmFjZS5oIgorfQorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworLyogVGltZSByZWxhdGVkIG1hY3JvcyAqLwordHlwZWRlZiBpbnQ2NF90IG5zZWNzX3Q7CisjZGVmaW5lIE5TRUNfUEVSX1NFQyAxMDAwMDAwMDAwTExVCisjZGVmaW5lIE5TRUNfUEVSX1VTRUMgMTAwMExMVQorI2RlZmluZSBOU0VDX1BFUl8zM01TRUMgMzMwMDAwMDBMTFUKKwordHlwZWRlZiBlbnVtIHsKKyAgICBTRVRfRU5BQkxFLAorICAgIFNFVF9DT05UUk9MRU5BQkxFLAorICAgIFNFVF9SRUxPQURfQ0hST01BVElYLAorICAgIFNFVF9TVEFUVVMsCit9IG9wdHlwZV90OworCisjZGVmaW5lIE1PRFVMRV9BTEwgMAorCitleHRlcm4gdm9sYXRpbGUgdWludDMyX3QgZ0NhbUhhbDNMb2dMZXZlbDsKKworY2xhc3MgUUNhbWVyYTNNZXRhZGF0YUNoYW5uZWw7CitjbGFzcyBRQ2FtZXJhM1BpY0NoYW5uZWw7CitjbGFzcyBRQ2FtZXJhM0hlYXBNZW1vcnk7CitjbGFzcyBRQ2FtZXJhM0V4aWY7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1lcmEzX3N0cmVhbV90ICpzdHJlYW07CisgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3NldF90IGJ1ZmZlcl9zZXQ7CisgICAgc3RyZWFtX3N0YXR1c190IHN0YXR1czsKKyAgICBpbnQgcmVnaXN0ZXJlZDsKKyAgICBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsICpjaGFubmVsOworfSBzdHJlYW1faW5mb190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLy8gU3RyZWFtIGhhbmRsZQorICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbTsKKyAgICAvLyBCdWZmZXIgaGFuZGxlCisgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXI7Cit9IFBlbmRpbmdCdWZmZXJJbmZvOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLy8gRnJhbWUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gcmVxdWVzdAorICAgIHVpbnQzMl90IGZyYW1lX251bWJlcjsKKyAgICAvLyBUaW1lIHdoZW4gcmVxdWVzdCBxdWV1ZWQgaW50byBzeXN0ZW0KKyAgICBuc2Vjc190IHRpbWVzdGFtcDsKKyAgICBMaXN0PFBlbmRpbmdCdWZmZXJJbmZvPiBtUGVuZGluZ0J1ZmZlckxpc3Q7Cit9IFBlbmRpbmdCdWZmZXJzSW5SZXF1ZXN0OworCitjbGFzcyBQZW5kaW5nQnVmZmVyc01hcCB7CitwdWJsaWM6CisgICAgLy8gTnVtYmVyIG9mIG91dHN0YW5kaW5nIGJ1ZmZlcnMgYXQgZmx1c2gKKyAgICB1aW50MzJfdCBudW1QZW5kaW5nQnVmc0F0Rmx1c2g7CisgICAgLy8gTGlzdCBvZiBwZW5kaW5nIGJ1ZmZlcnMgcGVyIHJlcXVlc3QKKyAgICBMaXN0PFBlbmRpbmdCdWZmZXJzSW5SZXF1ZXN0PiBtUGVuZGluZ0J1ZmZlcnNJblJlcXVlc3Q7CisgICAgdWludDMyX3QgZ2V0X251bV9vdmVyYWxsX2J1ZmZlcnMoKTsKKyAgICB2b2lkIHJlbW92ZUJ1ZihidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcik7Cit9OworCisKK2NsYXNzIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UgeworcHVibGljOgorICAgIC8qIHN0YXRpYyB2YXJpYWJsZSBhbmQgZnVuY3Rpb25zIGFjY2Vzc2VkIGJ5IGNhbWVyYSBzZXJ2aWNlICovCisgICAgc3RhdGljIGNhbWVyYTNfZGV2aWNlX29wc190IG1DYW1lcmFPcHM7CisgICAgLy9JZCBvZiBlYWNoIHNlc3Npb24gaW4gYnVuZGxlL2xpbmsKKyAgICBzdGF0aWMgdWludDMyX3Qgc2Vzc2lvbklkW01NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlNdOworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZShjb25zdCBzdHJ1Y3QgY2FtZXJhM19kZXZpY2UgKiwKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX2NhbGxiYWNrX29wc190ICpjYWxsYmFja19vcHMpOworICAgIHN0YXRpYyBpbnQgY29uZmlndXJlX3N0cmVhbXMoY29uc3Qgc3RydWN0IGNhbWVyYTNfZGV2aWNlICosCisgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl90ICpzdHJlYW1fbGlzdCk7CisgICAgc3RhdGljIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBjb25zdHJ1Y3RfZGVmYXVsdF9yZXF1ZXN0X3NldHRpbmdzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgY2FtZXJhM19kZXZpY2UgKiwgaW50IHR5cGUpOworICAgIHN0YXRpYyBpbnQgcHJvY2Vzc19jYXB0dXJlX3JlcXVlc3QoY29uc3Qgc3RydWN0IGNhbWVyYTNfZGV2aWNlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgKnJlcXVlc3QpOworCisgICAgc3RhdGljIHZvaWQgZHVtcChjb25zdCBzdHJ1Y3QgY2FtZXJhM19kZXZpY2UgKiwgaW50IGZkKTsKKyAgICBzdGF0aWMgaW50IGZsdXNoKGNvbnN0IHN0cnVjdCBjYW1lcmEzX2RldmljZSAqKTsKKyAgICBzdGF0aWMgaW50IGNsb3NlX2NhbWVyYV9kZXZpY2Uoc3RydWN0IGh3X2RldmljZV90KiBkZXZpY2UpOworCitwdWJsaWM6CisgICAgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSh1aW50MzJfdCBjYW1lcmFJZCwKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QgKmNhbGxiYWNrcyk7CisgICAgdmlydHVhbCB+UUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSgpOworICAgIHN0YXRpYyB2b2lkIGNhbUV2dEhhbmRsZSh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLCBtbV9jYW1lcmFfZXZlbnRfdCAqZXZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKyAgICBpbnQgb3BlbkNhbWVyYShzdHJ1Y3QgaHdfZGV2aWNlX3QgKipod19kZXZpY2UpOworICAgIGNhbWVyYV9tZXRhZGF0YV90KiB0cmFuc2xhdGVDYXBhYmlsaXR5VG9NZXRhZGF0YShpbnQgdHlwZSk7CisKKyAgICBzdGF0aWMgaW50IGdldENhbUluZm8odWludDMyX3QgY2FtZXJhSWQsIHN0cnVjdCBjYW1lcmFfaW5mbyAqaW5mbyk7CisgICAgc3RhdGljIGludCBpbml0Q2FwYWJpbGl0aWVzKHVpbnQzMl90IGNhbWVyYUlkKTsKKyAgICBzdGF0aWMgaW50IGluaXRTdGF0aWNNZXRhZGF0YSh1aW50MzJfdCBjYW1lcmFJZCk7CisgICAgc3RhdGljIHZvaWQgbWFrZVRhYmxlKGNhbV9kaW1lbnNpb25fdCAqZGltVGFibGUsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgc2l6ZV90IG1heF9zaXplLCBpbnQzMl90ICpzaXplVGFibGUpOworICAgIHN0YXRpYyB2b2lkIG1ha2VGUFNUYWJsZShjYW1fZnBzX3JhbmdlX3QgKmZwc1RhYmxlLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIHNpemVfdCBtYXhfc2l6ZSwgaW50MzJfdCAqZnBzUmFuZ2VzVGFibGUpOworICAgIHN0YXRpYyB2b2lkIG1ha2VPdmVycmlkZXNMaXN0KGNhbV9zY2VuZV9tb2RlX292ZXJyaWRlc190ICpvdmVycmlkZXNUYWJsZSwKKyAgICAgICAgICAgIHNpemVfdCBzaXplLCBzaXplX3QgbWF4X3NpemUsIHVpbnQ4X3QgKm92ZXJyaWRlc0xpc3QsCisgICAgICAgICAgICB1aW50OF90ICpzdXBwb3J0ZWRfaW5kZXhlcywgdWludDMyX3QgY2FtZXJhX2lkKTsKKyAgICBzdGF0aWMgc2l6ZV90IGZpbHRlckpwZWdTaXplcyhpbnQzMl90ICpqcGVnU2l6ZXMsIGludDMyX3QgKnByb2Nlc3NlZFNpemVzLAorICAgICAgICAgICAgc2l6ZV90IHByb2Nlc3NlZFNpemVzQ250LCBzaXplX3QgbWF4Q291bnQsIGNhbV9yZWN0X3QgYWN0aXZlX2FycmF5X3NpemUsCisgICAgICAgICAgICB1aW50OF90IGRvd25zY2FsZV9mYWN0b3IpOworICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRUb1JlZ2lvbnMoY2FtX3JlY3RfdCByZWN0LCBpbnQzMl90KiByZWdpb24sIGludCB3ZWlnaHQpOworICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRGcm9tUmVnaW9ucyhjYW1fYXJlYV90ICZyb2ksIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGFnKTsKKyAgICBzdGF0aWMgYm9vbCByZXNldElmTmVlZGVkUk9JKGNhbV9hcmVhX3QqIHJvaSwgY29uc3QgY2FtX2Nyb3BfcmVnaW9uX3QqIHNjYWxlckNyb3BSZWdpb24pOworICAgIHN0YXRpYyBpbnQzMl90IGdldFNlbnNvclNlbnNpdGl2aXR5KGludDMyX3QgaXNvX21vZGUpOworCisgICAgZG91YmxlIGNvbXB1dGVOb2lzZU1vZGVsRW50cnlTKGludDMyX3Qgc2Vuc2l0aXZpdHkpOworICAgIGRvdWJsZSBjb21wdXRlTm9pc2VNb2RlbEVudHJ5TyhpbnQzMl90IHNlbnNpdGl2aXR5KTsKKworICAgIHN0YXRpYyB2b2lkIGNhcHR1cmVSZXN1bHRDYihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKm1ldGFkYXRhLAorICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpidWZmZXIsIHVpbnQzMl90IGZyYW1lX251bWJlciwKKyAgICAgICAgICAgICAgICBib29sIGlzSW5wdXRCdWZmZXIsIHZvaWQgKnVzZXJkYXRhKTsKKworICAgIGludCBpbml0aWFsaXplKGNvbnN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzX3QgKmNhbGxiYWNrX29wcyk7CisgICAgaW50IGNvbmZpZ3VyZVN0cmVhbXMoY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl90ICpzdHJlYW1fbGlzdCk7CisgICAgaW50IGNvbmZpZ3VyZVN0cmVhbXNQZXJmTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCAqc3RyZWFtX2xpc3QpOworICAgIGludCBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqcmVxdWVzdCk7CisgICAgdm9pZCBkdW1wKGludCBmZCk7CisgICAgaW50IGZsdXNoUGVyZigpOworCisgICAgaW50IHNldEZyYW1lUGFyYW1ldGVycyhjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICpyZXF1ZXN0LAorICAgICAgICAgICAgY2FtX3N0cmVhbV9JRF90IHN0cmVhbUlELCBpbnQgYmxvYl9yZXF1ZXN0LCB1aW50MzJfdCBzbmFwc2hvdFN0cmVhbUlkKTsKKyAgICBpbnQzMl90IHNldFJlcHJvY1BhcmFtZXRlcnMoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqcmVxdWVzdCwKKyAgICAgICAgICAgIG1ldGFkYXRhX2J1ZmZlcl90ICpyZXByb2NQYXJhbSwgdWludDMyX3Qgc25hcHNob3RTdHJlYW1JZCk7CisgICAgaW50IHRyYW5zbGF0ZVRvSGFsTWV0YWRhdGEoY29uc3QgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqcmVxdWVzdCwKKyAgICAgICAgICAgIG1ldGFkYXRhX2J1ZmZlcl90ICpwYXJtLCB1aW50MzJfdCBzbmFwc2hvdFN0cmVhbUlkKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfdCogdHJhbnNsYXRlQ2JVcmdlbnRNZXRhZGF0YVRvUmVzdWx0TWV0YWRhdGEgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YV9idWZmZXJfdCAqbWV0YWRhdGEpOworICAgIGNhbWVyYV9tZXRhZGF0YV90KiB0cmFuc2xhdGVGcm9tSGFsTWV0YWRhdGEobWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBpbnQzMl90IHJlcXVlc3RfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGpwZWdNZXRhZGF0YSwgdWludDhfdCBwaXBlbGluZV9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNhcHR1cmVfaW50ZW50LCBib29sIHBwcm9jRG9uZSwgdWludDhfdCBmd2tfY2FjTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZpcnN0TWV0YWRhdGFJbkJhdGNoKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfdCogc2F2ZVJlcXVlc3RTZXR0aW5ncyhjb25zdCBDYW1lcmFNZXRhZGF0YSYganBlZ01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgKnJlcXVlc3QpOworICAgIGludCBpbml0UGFyYW1ldGVycygpOworICAgIHZvaWQgZGVpbml0UGFyYW1ldGVycygpOworICAgIFFDYW1lcmEzUmVwcm9jZXNzQ2hhbm5lbCAqYWRkT2ZmbGluZVJlcHJvY0NoYW5uZWwoY29uc3QgcmVwcm9jZXNzX2NvbmZpZ190ICZjb25maWcsCisgICAgICAgICAgICBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsICppbnB1dENoSGFuZGxlKTsKKyAgICBib29sIG5lZWRSb3RhdGlvblJlcHJvY2VzcygpOworICAgIGJvb2wgbmVlZEpwZWdFeGlmUm90YXRpb24oKTsKKyAgICBib29sIG5lZWRSZXByb2Nlc3MoY2FtX2ZlYXR1cmVfbWFza190IHBvc3Rwcm9jZXNzX21hc2spOworICAgIGJvb2wgbmVlZEpwZWdSb3RhdGlvbigpOworICAgIGNhbV9kZW5vaXNlX3Byb2Nlc3NfdHlwZV90IGdldFdhdmVsZXREZW5vaXNlUHJvY2Vzc1BsYXRlKCk7CisgICAgY2FtX2Rlbm9pc2VfcHJvY2Vzc190eXBlX3QgZ2V0VGVtcG9yYWxEZW5vaXNlUHJvY2Vzc1BsYXRlKCk7CisKKyAgICB2b2lkIGNhcHR1cmVSZXN1bHRDYihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKm1ldGFkYXRhLAorICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpidWZmZXIsIHVpbnQzMl90IGZyYW1lX251bWJlciwKKyAgICAgICAgICAgICAgICBib29sIGlzSW5wdXRCdWZmZXIpOworICAgIGNhbV9kaW1lbnNpb25fdCBjYWxjTWF4SnBlZ0RpbSgpOworICAgIGJvb2wgbmVlZE9ubGluZVJvdGF0aW9uKCk7CisgICAgdWludDMyX3QgZ2V0SnBlZ1F1YWxpdHkoKTsKKyAgICBRQ2FtZXJhM0V4aWYgKmdldEV4aWZEYXRhKCk7CisgICAgbW1fanBlZ19leGlmX3BhcmFtc190IGdldDNBRXhpZlBhcmFtcygpOworICAgIHVpbnQ4X3QgZ2V0TW9iaWNhdE1hc2soKTsKKyAgICBzdGF0aWMgdm9pZCBnZXRGbGFzaEluZm8oY29uc3QgaW50IGNhbWVyYUlkLAorICAgICAgICAgICAgYm9vbCYgaGFzRmxhc2gsCisgICAgICAgICAgICBjaGFyICgmZmxhc2hOb2RlKVtRQ0FNRVJBX01BWF9GSUxFUEFUSF9MRU5HVEhdKTsKKyAgICBjb25zdCBjaGFyICpnZXRFZXByb21WZXJzaW9uSW5mbygpOworICAgIGNvbnN0IHVpbnQzMl90ICpnZXRMZGFmQ2FsaWIoKTsKKyAgICB2b2lkIGdldDNBVmVyc2lvbihjYW1fcTNhX3ZlcnNpb25fdCAmc3dWZXJzaW9uKTsKKworICAgIC8vIEdldCBkdWFsIGNhbWVyYSByZWxhdGVkIGluZm8KKyAgICBib29sIGlzRGV2aWNlTGlua2VkKCkge3JldHVybiBtSXNEZXZpY2VMaW5rZWQ7fQorICAgIGJvb2wgaXNNYWluQ2FtZXJhKCkge3JldHVybiBtSXNNYWluQ2FtZXJhO30KKyAgICB1aW50MzJfdCBnZXRTZW5zb3JNb3VudEFuZ2xlKCk7CisgICAgY29uc3QgY2FtX3JlbGF0ZWRfc3lzdGVtX2NhbGlicmF0aW9uX2RhdGFfdCAqZ2V0UmVsYXRlZENhbGlicmF0aW9uRGF0YSgpOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIGZ3a1R5cGUsIHR5cGVuYW1lIGhhbFR5cGU+IHN0cnVjdCBRQ2FtZXJhTWFwIHsKKyAgICAgICAgZndrVHlwZSBmd2tfbmFtZTsKKyAgICAgICAgaGFsVHlwZSBoYWxfbmFtZTsKKyAgICB9OworCisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyICpjb25zdCBkZXNjOworICAgICAgICBjYW1fY2RzX21vZGVfdHlwZV90IHZhbDsKKyAgICB9IFFDYW1lcmFQcm9wTWFwOworCisKK3ByaXZhdGU6CisKKyAgICAvLyBTdGF0ZSB0cmFuc2l0aW9uIGNvbmRpdGlvbnM6CisgICAgLy8gIlwiIG1lYW5zIG5vdCBhcHBsaWNhYmxlCisgICAgLy8gIngiIG1lYW5zIG5vdCB2YWxpZAorICAgIC8vICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKworICAgIC8vIHwgICAgICAgICAgICB8ICBDTE9TRUQgIHwgIE9QRU5FRCAgfCBJTklUSUFMSVpFRCB8IENPTkZJR1VSRUQgfCBTVEFSVEVEIHwgRVJST1IgfCBERUlOSVQgfAorICAgIC8vICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKworICAgIC8vIHwgIENMT1NFRCAgICB8ICAgIFwgICAgIHwgICBvcGVuICAgfCAgICAgeCAgICAgICB8ICAgIHggICAgICAgfCAgICB4ICAgIHwgICB4ICAgfCAgIHggICAgfAorICAgIC8vICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKworICAgIC8vIHwgIE9QRU5FRCAgICB8ICBjbG9zZSAgIHwgICAgXCAgICAgfCBpbml0aWFsaXplICB8ICAgIHggICAgICAgfCAgICB4ICAgIHwgZXJyb3IgfCAgIHggICAgfAorICAgIC8vICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKworICAgIC8vIHxJTklUSUFMSVpFRCB8ICBjbG9zZSAgIHwgICAgeCAgICAgfCAgICAgXCAgICAgICB8IGNvbmZpZ3VyZSAgfCAgIHggICAgIHwgZXJyb3IgfCAgIHggICAgfAorICAgIC8vICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKworICAgIC8vIHwgQ09ORklHVVJFRCB8ICBjbG9zZSAgIHwgICAgeCAgICAgfCAgICAgeCAgICAgICB8IGNvbmZpZ3VyZSAgfCByZXF1ZXN0IHwgZXJyb3IgfCAgIHggICAgfAorICAgIC8vICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKworICAgIC8vIHwgIFNUQVJURUQgICB8ICBjbG9zZSAgIHwgICAgeCAgICAgfCAgICAgeCAgICAgICB8IGNvbmZpZ3VyZSAgfCAgICBcICAgIHwgZXJyb3IgfCAgIHggICAgfAorICAgIC8vICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKworICAgIC8vIHwgICBFUlJPUiAgICB8ICBjbG9zZSAgIHwgICAgeCAgICAgfCAgICAgeCAgICAgICB8ICAgICB4ICAgICAgfCAgICB4ICAgIHwgICBcICAgfCAgYW55ICAgfAorICAgIC8vICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKworICAgIC8vIHwgICBERUlOSVQgICB8ICBjbG9zZSAgIHwgICAgeCAgICAgfCAgICAgeCAgICAgICB8ICAgICB4ICAgICAgfCAgICB4ICAgIHwgICB4ICAgfCAgIFwgICAgfAorICAgIC8vICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tKworCisgICAgdHlwZWRlZiBlbnVtIHsKKyAgICAgICAgQ0xPU0VELAorICAgICAgICBPUEVORUQsCisgICAgICAgIElOSVRJQUxJWkVELAorICAgICAgICBDT05GSUdVUkVELAorICAgICAgICBTVEFSVEVELAorICAgICAgICBFUlJPUiwKKyAgICAgICAgREVJTklUCisgICAgfSBTdGF0ZTsKKworICAgIGludCBvcGVuQ2FtZXJhKCk7CisgICAgaW50IGNsb3NlQ2FtZXJhKCk7CisgICAgaW50IGZsdXNoKGJvb2wgcmVzdGFydENoYW5uZWxzKTsKKyAgICBzdGF0aWMgc2l6ZV90IGNhbGNNYXhKcGVnU2l6ZSh1aW50MzJfdCBjYW1lcmFfaWQpOworICAgIGNhbV9kaW1lbnNpb25fdCBnZXRNYXhSYXdTaXplKHVpbnQzMl90IGNhbWVyYV9pZCk7CisgICAgc3RhdGljIHZvaWQgYWRkU3RyZWFtQ29uZmlnKFZlY3RvcjxpbnQzMl90PiAmYXZhaWxhYmxlX3N0cmVhbV9jb25maWdzLAorICAgICAgICAgICAgaW50MzJfdCBzY2FsYXJfZm9ybWF0LCBjb25zdCBjYW1fZGltZW5zaW9uX3QgJmRpbSwKKyAgICAgICAgICAgIGludDMyX3QgY29uZmlnX3R5cGUpOworCisgICAgaW50IHZhbGlkYXRlQ2FwdHVyZVJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqcmVxdWVzdCk7CisgICAgaW50IHZhbGlkYXRlU3RyZWFtRGltZW5zaW9ucyhjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX3QgKnN0cmVhbUxpc3QpOworICAgIGludCB2YWxpZGF0ZVN0cmVhbVJvdGF0aW9ucyhjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX3QgKnN0cmVhbUxpc3QpOworICAgIHZvaWQgZGVyaXZlTWluRnJhbWVEdXJhdGlvbigpOworICAgIHZvaWQgaGFuZGxlQnVmZmVyc0R1cmluZ0ZsdXNoTG9jayhjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqYnVmZmVyKTsKKyAgICBpbnQzMl90IGhhbmRsZVBlbmRpbmdSZXByb2NSZXN1bHRzKHVpbnQzMl90IGZyYW1lX251bWJlcik7CisgICAgaW50NjRfdCBnZXRNaW5GcmFtZUR1cmF0aW9uKGNvbnN0IGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgKnJlcXVlc3QpOworICAgIHZvaWQgaGFuZGxlTWV0YWRhdGFXaXRoTG9jayhtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKm1ldGFkYXRhX2J1ZiwKKyAgICAgICAgICAgIGJvb2wgZnJlZV9hbmRfYnVmZG9uZV9tZXRhX2J1ZiwKKyAgICAgICAgICAgIGJvb2wgZmlyc3RNZXRhZGF0YUluQmF0Y2gpOworICAgIHZvaWQgaGFuZGxlQmF0Y2hNZXRhZGF0YShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKm1ldGFkYXRhX2J1ZiwKKyAgICAgICAgICAgIGJvb2wgZnJlZV9hbmRfYnVmZG9uZV9tZXRhX2J1Zik7CisgICAgdm9pZCBoYW5kbGVCdWZmZXJXaXRoTG9jayhjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqYnVmZmVyLAorICAgICAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyKTsKKyAgICB2b2lkIGhhbmRsZUlucHV0QnVmZmVyV2l0aExvY2sodWludDMyX3QgZnJhbWVfbnVtYmVyKTsKKyAgICB2b2lkIHVuYmxvY2tSZXF1ZXN0SWZOZWNlc3NhcnkoKTsKKyAgICB2b2lkIGR1bXBNZXRhZGF0YVRvRmlsZSh0dW5pbmdfcGFyYW1zX3QgJm1ldGEsIHVpbnQzMl90ICZkdW1wRnJhbWVDb3VudCwKKyAgICAgICAgICAgIGJvb2wgZW5hYmxlZCwgY29uc3QgY2hhciAqdHlwZSwgdWludDMyX3QgZnJhbWVOdW1iZXIpOworICAgIHN0YXRpYyB2b2lkIGdldExvZ0xldmVsKCk7CisKKyAgICB2b2lkIGNsZWFuQW5kU29ydFN0cmVhbUluZm8oKTsKKyAgICB2b2lkIGV4dHJhY3RKcGVnTWV0YWRhdGEoQ2FtZXJhTWV0YWRhdGEmIGpwZWdNZXRhZGF0YSwKKyAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgKnJlcXVlc3QpOworCisgICAgYm9vbCBpc1N1cHBvcnRDaGFubmVsTmVlZGVkKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fdCAqc3RyZWFtTGlzdCwKKyAgICAgICAgICAgIGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3Qgc3RyZWFtX2NvbmZpZ19pbmZvKTsKKyAgICBpbnQzMl90IHNldE1vYmljYXQoKTsKKworICAgIGludDMyX3QgZ2V0U2Vuc29yT3V0cHV0U2l6ZShjYW1fZGltZW5zaW9uX3QgJnNlbnNvcl9kaW0pOworICAgIGludDMyX3Qgc2V0SGFsRnBzUmFuZ2UoY29uc3QgQ2FtZXJhTWV0YWRhdGEgJnNldHRpbmdzLAorICAgICAgICAgICAgbWV0YWRhdGFfYnVmZmVyX3QgKmhhbF9tZXRhZGF0YSk7CisgICAgaW50MzJfdCBleHRyYWN0U2NlbmVNb2RlKGNvbnN0IENhbWVyYU1ldGFkYXRhICZmcmFtZV9zZXR0aW5ncywgdWludDhfdCBtZXRhTW9kZSwKKyAgICAgICAgICAgIG1ldGFkYXRhX2J1ZmZlcl90ICpoYWxfbWV0YWRhdGEpOworICAgIGludDMyX3Qgc2V0VmlkZW9IZHJNb2RlKG1ldGFkYXRhX2J1ZmZlcl90ICpoYWxfbWV0YWRhdGEsCisgICAgICAgICAgICBjYW1fdmlkZW9faGRyX21vZGVfdCB2aGRyKTsKKyAgICBpbnQzMl90IG51bU9mU2l6ZXNPbkVuY29kZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbl90ICpzdHJlYW1MaXN0LAorICAgICAgICAgICAgY29uc3QgY2FtX2RpbWVuc2lvbl90ICZtYXhWaWV3ZmluZGVyU2l6ZSk7CisKKyAgICB2b2lkIGFkZFRvUFBGZWF0dXJlTWFzayhpbnQgc3RyZWFtX2Zvcm1hdCwgdWludDMyX3Qgc3RyZWFtX2lkeCk7CisgICAgdm9pZCB1cGRhdGVGcHNJblByZXZpZXdCdWZmZXIobWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhLCB1aW50MzJfdCBmcmFtZV9udW1iZXIpOworCisgICAgdm9pZCBlbmFibGVQb3dlckhpbnQoKTsKKyAgICB2b2lkIGRpc2FibGVQb3dlckhpbnQoKTsKKyAgICBpbnQzMl90IGR5bmFtaWNVcGRhdGVNZXRhU3RyZWFtSW5mbygpOworICAgIGludDMyX3Qgc3RhcnRBbGxDaGFubmVscygpOworICAgIGludDMyX3Qgc3RvcEFsbENoYW5uZWxzKCk7CisgICAgaW50MzJfdCBub3RpZnlFcnJvckZvclBlbmRpbmdSZXF1ZXN0cygpOworICAgIHZvaWQgbm90aWZ5RXJyb3IodWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBjYW1lcmEzX2Vycm9yX21zZ19jb2RlX3QgZXJyb3JDb2RlKTsKKyAgICBpbnQzMl90IGdldFJlcHJvY2Vzc2libGVPdXRwdXRTdHJlYW1JZCh1aW50MzJfdCAmaWQpOworICAgIGludDMyX3QgaGFuZGxlQ2FtZXJhRGV2aWNlRXJyb3IoKTsKKworICAgIGJvb2wgaXNPbkVuY29kZXIoY29uc3QgY2FtX2RpbWVuc2lvbl90IG1heF92aWV3ZmluZGVyX3NpemUsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKKyAgICB2b2lkIGhkclBsdXNQZXJmTG9jayhtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKm1ldGFkYXRhX2J1Zik7CisKKyAgICBzdGF0aWMgYm9vbCBzdXBwb3J0QnVyc3RDYXB0dXJlKHVpbnQzMl90IGNhbWVyYUlkKTsKKyAgICBpbnQzMl90IHNldEJ1bmRsZUluZm8oKTsKKworICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRMYW5kbWFya3MoY2FtX2ZhY2VfbGFuZG1hcmtzX2luZm9fdCBmYWNlLCBpbnQzMl90KiBsYW5kbWFya3MpOworICAgIHN0YXRpYyB2b2lkIHNldEludmFsaWRMYW5kbWFya3MoaW50MzJfdCogbGFuZG1hcmtzKTsKKworICAgIHN0YXRpYyB2b2lkIHNldFBBQUZTdXBwb3J0KGNhbV9mZWF0dXJlX21hc2tfdCYgZmVhdHVyZV9tYXNrLAorICAgICAgICAgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUsCisgICAgICAgICAgICBjYW1fY29sb3JfZmlsdGVyX2FycmFuZ2VtZW50X3QgZmlsdGVyX2FycmFuZ2VtZW50KTsKKworICAgIGNhbWVyYTNfZGV2aWNlX3QgICBtQ2FtZXJhRGV2aWNlOworICAgIHVpbnQzMl90ICAgICAgICAgICBtQ2FtZXJhSWQ7CisgICAgbW1fY2FtZXJhX3Z0YmxfdCAgKm1DYW1lcmFIYW5kbGU7CisgICAgYm9vbCAgICAgICAgICAgICAgIG1DYW1lcmFJbml0aWFsaXplZDsKKyAgICBjYW1lcmFfbWV0YWRhdGFfdCAqbURlZmF1bHRNZXRhZGF0YVtDQU1FUkEzX1RFTVBMQVRFX0NPVU5UXTsKKyAgICBjb25zdCBjYW1lcmEzX2NhbGxiYWNrX29wc190ICptQ2FsbGJhY2tPcHM7CisKKyAgICBRQ2FtZXJhM01ldGFkYXRhQ2hhbm5lbCAqbU1ldGFkYXRhQ2hhbm5lbDsKKyAgICBRQ2FtZXJhM1BpY0NoYW5uZWwgKm1QaWN0dXJlQ2hhbm5lbDsKKyAgICBRQ2FtZXJhM1Jhd0NoYW5uZWwgKm1SYXdDaGFubmVsOworICAgIFFDYW1lcmEzU3VwcG9ydENoYW5uZWwgKm1TdXBwb3J0Q2hhbm5lbDsKKyAgICBRQ2FtZXJhM1N1cHBvcnRDaGFubmVsICptQW5hbHlzaXNDaGFubmVsOworICAgIFFDYW1lcmEzUmF3RHVtcENoYW5uZWwgKm1SYXdEdW1wQ2hhbm5lbDsKKyAgICBRQ2FtZXJhM1JlZ3VsYXJDaGFubmVsICptRHVtbXlCYXRjaENoYW5uZWw7CisgICAgUUNhbWVyYVBlcmZMb2NrIG1fcGVyZkxvY2s7CisgICAgUUNhbWVyYUNvbW1vbiAgIG1Db21tb247CisKKyAgICB1aW50MzJfdCBtQ2hhbm5lbEhhbmRsZTsKKworICAgIHZvaWQgc2F2ZUV4aWZQYXJhbXMobWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhKTsKKyAgICBtbV9qcGVnX2V4aWZfcGFyYW1zX3QgbUV4aWZQYXJhbXM7CisKKyAgICAgLy9GaXJzdCByZXF1ZXN0IHlldCB0byBiZSBwcm9jZXNzZWQgYWZ0ZXIgY29uZmlndXJlU3RyZWFtcworICAgIGJvb2wgbUZpcnN0Q29uZmlndXJhdGlvbjsKKyAgICBib29sIG1GbHVzaDsKKyAgICBib29sIG1GbHVzaFBlcmY7CisgICAgYm9vbCBtRW5hYmxlUmF3RHVtcDsKKyAgICBRQ2FtZXJhM0hlYXBNZW1vcnkgKm1QYXJhbUhlYXA7CisgICAgbWV0YWRhdGFfYnVmZmVyX3QqIG1QYXJhbWV0ZXJzOworICAgIG1ldGFkYXRhX2J1ZmZlcl90KiBtUHJldlBhcmFtZXRlcnM7CisgICAgQ2FtZXJhTWV0YWRhdGEgbUN1ckpwZWdNZXRhOworICAgIGJvb2wgbV9iSXNWaWRlbzsKKyAgICBib29sIG1fYklzNEtWaWRlbzsKKyAgICBib29sIG1fYkVpc1N1cHBvcnRlZFNpemU7CisgICAgYm9vbCBtX2JFaXNFbmFibGU7CisgICAgYm9vbCBtX2JFaXNTdXBwb3J0ZWQ7CisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBjYW1fZGltZW5zaW9uX3QgZGltOworICAgICAgICBpbnQgZm9ybWF0OworICAgICAgICB1aW50MzJfdCB1c2FnZTsKKyAgICB9IElucHV0U3RyZWFtSW5mbzsKKworICAgIElucHV0U3RyZWFtSW5mbyBtSW5wdXRTdHJlYW1JbmZvOworICAgIHVpbnQ4X3QgbV9Nb2JpY2F0TWFzazsKKyAgICB1aW50OF90IG1fYlRuckVuYWJsZWQ7CisgICAgaW50OF90ICBtU3VwcG9ydGVkRmFjZURldGVjdE1vZGU7CisgICAgdWludDhfdCBtX2JUbnJQcmV2aWV3OworICAgIHVpbnQ4X3QgbV9iVG5yVmlkZW87CisgICAgdWludDhfdCBtX2RlYnVnX2F2dGltZXI7CisKKyAgICAvKiBEYXRhIHN0cnVjdHVyZSB0byBzdG9yZSBwZW5kaW5nIHJlcXVlc3QgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3QgKnN0cmVhbTsKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKmJ1ZmZlcjsKKyAgICAgICAgLy8gbWV0YWRhdGEgbmVlZHMgdG8gYmUgY29uc3VtZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgc3RyZWFtCisgICAgICAgIC8vIGluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBidWZmZXIuCisgICAgICAgIGJvb2wgbmVlZF9tZXRhZGF0YTsKKyAgICB9IFJlcXVlc3RlZEJ1ZmZlckluZm87CisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICB1aW50MzJfdCBmcmFtZV9udW1iZXI7CisgICAgICAgIHVpbnQzMl90IG51bV9idWZmZXJzOworICAgICAgICBpbnQzMl90IHJlcXVlc3RfaWQ7CisgICAgICAgIExpc3Q8UmVxdWVzdGVkQnVmZmVySW5mbz4gYnVmZmVyczsKKyAgICAgICAgaW50IGJsb2JfcmVxdWVzdDsKKyAgICAgICAgdWludDhfdCBiVXJnZW50UmVjZWl2ZWQ7CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wOworICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqaW5wdXRfYnVmZmVyOworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2V0dGluZ3M7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIGpwZWdNZXRhZGF0YTsKKyAgICAgICAgdWludDhfdCBwaXBlbGluZV9kZXB0aDsKKyAgICAgICAgdWludDMyX3QgcGFydGlhbF9yZXN1bHRfY250OworICAgICAgICB1aW50OF90IGNhcHR1cmVfaW50ZW50OworICAgICAgICB1aW50OF90IGZ3a0NhY01vZGU7CisgICAgICAgIGJvb2wgc2h1dHRlcl9ub3RpZmllZDsKKyAgICB9IFBlbmRpbmdSZXF1ZXN0SW5mbzsKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIHVpbnQzMl90IGZyYW1lX251bWJlcjsKKyAgICAgICAgdWludDMyX3Qgc3RyZWFtX0lEOworICAgIH0gUGVuZGluZ0ZyYW1lRHJvcEluZm87CisKKyAgICB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGNhbWVyYTNfbm90aWZ5X21zZ190IG5vdGlmeV9tc2c7CisgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IGJ1ZmZlcjsKKyAgICAgICAgdWludDMyX3QgZnJhbWVfbnVtYmVyOworICAgIH0gUGVuZGluZ1JlcHJvY2Vzc1Jlc3VsdDsKKworICAgIHR5cGVkZWYgS2V5ZWRWZWN0b3I8dWludDMyX3QsIFZlY3RvcjxQZW5kaW5nQnVmZmVySW5mbz4gPiBGbHVzaE1hcDsKKyAgICB0eXBlZGVmIExpc3Q8UUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6UGVuZGluZ1JlcXVlc3RJbmZvPjo6aXRlcmF0b3IKKyAgICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0SXRlcmF0b3I7CisgICAgdHlwZWRlZiBMaXN0PFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OlJlcXVlc3RlZEJ1ZmZlckluZm8+OjppdGVyYXRvcgorICAgICAgICAgICAgcGVuZGluZ0J1ZmZlckl0ZXJhdG9yOworCisgICAgTGlzdDxQZW5kaW5nUmVwcm9jZXNzUmVzdWx0PiBtUGVuZGluZ1JlcHJvY2Vzc1Jlc3VsdExpc3Q7CisgICAgTGlzdDxQZW5kaW5nUmVxdWVzdEluZm8+IG1QZW5kaW5nUmVxdWVzdHNMaXN0OworICAgIExpc3Q8UGVuZGluZ0ZyYW1lRHJvcEluZm8+IG1QZW5kaW5nRnJhbWVEcm9wTGlzdDsKKyAgICAvKiBVc2UgbGFzdCBmcmFtZSBudW1iZXIgb2YgdGhlIGJhdGNoIGFzIGtleSBhbmQgZmlyc3QgZnJhbWUgbnVtYmVyIG9mIHRoZQorICAgICAqIGJhdGNoIGFzIHZhbHVlIGZvciB0aGF0IGtleSAqLworICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCB1aW50MzJfdD4gbVBlbmRpbmdCYXRjaE1hcDsKKworICAgIFBlbmRpbmdCdWZmZXJzTWFwIG1QZW5kaW5nQnVmZmVyc01hcDsKKyAgICBwdGhyZWFkX2NvbmRfdCBtUmVxdWVzdENvbmQ7CisgICAgdWludDMyX3QgbVBlbmRpbmdMaXZlUmVxdWVzdDsKKyAgICBib29sIG1Xb2tlblVwQnlEYWVtb247CisgICAgaW50MzJfdCBtQ3VycmVudFJlcXVlc3RJZDsKKyAgICBjYW1fc3RyZWFtX3NpemVfaW5mb190IG1TdHJlYW1Db25maWdJbmZvOworCisgICAgLy9tdXRleCBmb3Igc2VyaWFsaXplZCBhY2Nlc3MgdG8gY2FtZXJhM19kZXZpY2Vfb3BzX3QgZnVuY3Rpb25zCisgICAgcHRocmVhZF9tdXRleF90IG1NdXRleDsKKworICAgIC8vY29uZGl0aW9uIHVzZWQgdG8gc2lnbmFsIGZsdXNoIGFmdGVyIGJ1ZmZlcnMgaGF2ZSByZXR1cm5lZAorICAgIHB0aHJlYWRfY29uZF90IG1CdWZmZXJzQ29uZDsKKworICAgIExpc3Q8c3RyZWFtX2luZm9fdCo+IG1TdHJlYW1JbmZvOworCisgICAgaW50NjRfdCBtTWluUHJvY2Vzc2VkRnJhbWVEdXJhdGlvbjsKKyAgICBpbnQ2NF90IG1NaW5KcGVnRnJhbWVEdXJhdGlvbjsKKyAgICBpbnQ2NF90IG1NaW5SYXdGcmFtZUR1cmF0aW9uOworCisgICAgdWludDMyX3QgbU1ldGFGcmFtZUNvdW50OworICAgIGJvb2wgICAgbVVwZGF0ZURlYnVnTGV2ZWw7CisgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCAqbUNhbGxiYWNrczsKKworICAgIHVpbnQ4X3QgbUNhcHR1cmVJbnRlbnQ7CisgICAgdWludDhfdCBtQ2FjTW9kZTsKKyAgICBtZXRhZGF0YV9idWZmZXJfdCBtUmVwcm9jTWV0YTsgLy9zY3JhdGNoIG1ldGEgYnVmZmVyCisgICAgLyogMDogTm90IGJhdGNoLCBub24temVybzogTnVtYmVyIG9mIGltYWdlIGJ1ZmZlcnMgaW4gYSBiYXRjaCAqLworICAgIHVpbnQ4X3QgbUJhdGNoU2l6ZTsKKyAgICAvLyBVc2VkIG9ubHkgaW4gYmF0Y2ggbW9kZQorICAgIHVpbnQ4X3QgbVRvQmVRdWV1ZWRWaWRCdWZzOworICAgIC8vIEZpeGVkIHZpZGVvIGZwcworICAgIGZsb2F0IG1IRlJWaWRlb0ZwczsKKyAgICB1aW50OF90IG1PcE1vZGU7CisgICAgdWludDMyX3QgbUZpcnN0RnJhbWVOdW1iZXJJbkJhdGNoOworICAgIGNhbWVyYTNfc3RyZWFtX3QgbUR1bW15QmF0Y2hTdHJlYW07CisgICAgYm9vbCBtTmVlZFNlbnNvclJlc3RhcnQ7CisgICAgdWludDMyX3QgbU1pbkluRmxpZ2h0UmVxdWVzdHM7CisgICAgdWludDMyX3QgbU1heEluRmxpZ2h0UmVxdWVzdHM7CisKKyAgICAvKiBzZW5zb3Igb3V0cHV0IHNpemUgd2l0aCBjdXJyZW50IHN0cmVhbSBjb25maWd1cmF0aW9uICovCisgICAgUUNhbWVyYTNDcm9wUmVnaW9uTWFwcGVyIG1Dcm9wUmVnaW9uTWFwcGVyOworCisgICAgLyogTGRhZiBjYWxpYnJhdGlvbiBkYXRhICovCisgICAgYm9vbCBtTGRhZkNhbGliRXhpc3Q7CisgICAgdWludDMyX3QgbUxkYWZDYWxpYlsyXTsKKyAgICBib29sIG1Qb3dlckhpbnRFbmFibGVkOworICAgIGludDMyX3QgbUxhc3RDdXN0SW50ZW50RnJtTnVtOworICAgIENhbWVyYU1ldGFkYXRhICBtQ2FjaGVkTWV0YWRhdGE7CisKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2NvbnRyb2xfZWZmZWN0X21vZGVfdCwKKyAgICAgICAgICAgIGNhbV9lZmZlY3RfbW9kZV90eXBlPiBFRkZFQ1RfTU9ERVNfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8Y2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9jb250cm9sX2F3Yl9tb2RlX3QsCisgICAgICAgICAgICBjYW1fd2JfbW9kZV90eXBlPiBXSElURV9CQUxBTkNFX01PREVTX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfY29udHJvbF9zY2VuZV9tb2RlX3QsCisgICAgICAgICAgICBjYW1fc2NlbmVfbW9kZV90eXBlPiBTQ0VORV9NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2NvbnRyb2xfYWZfbW9kZV90LAorICAgICAgICAgICAgY2FtX2ZvY3VzX21vZGVfdHlwZT4gRk9DVVNfTU9ERVNfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8Y2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9jb2xvcl9jb3JyZWN0aW9uX2FiZXJyYXRpb25fbW9kZV90LAorICAgICAgICAgICAgY2FtX2FiZXJyYXRpb25fbW9kZV90PiBDT0xPUl9BQkVSUkFUSU9OX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfY29udHJvbF9hZV9hbnRpYmFuZGluZ19tb2RlX3QsCisgICAgICAgICAgICBjYW1fYW50aWJhbmRpbmdfbW9kZV90eXBlPiBBTlRJQkFORElOR19NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2xlbnNfc3RhdGVfdCwKKyAgICAgICAgICAgIGNhbV9hZl9sZW5zX3N0YXRlX3Q+IExFTlNfU1RBVEVfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8Y2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9jb250cm9sX2FlX21vZGVfdCwKKyAgICAgICAgICAgIGNhbV9mbGFzaF9tb2RlX3Q+IEFFX0ZMQVNIX01PREVfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8Y2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9mbGFzaF9tb2RlX3QsCisgICAgICAgICAgICBjYW1fZmxhc2hfbW9kZV90PiBGTEFTSF9NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3N0YXRpc3RpY3NfZmFjZV9kZXRlY3RfbW9kZV90LAorICAgICAgICAgICAgY2FtX2ZhY2VfZGV0ZWN0X21vZGVfdD4gRkFDRURFVEVDVF9NT0RFU19NQVBbXTsKKyAgICBzdGF0aWMgY29uc3QgUUNhbWVyYU1hcDxjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2xlbnNfaW5mb19mb2N1c19kaXN0YW5jZV9jYWxpYnJhdGlvbl90LAorICAgICAgICAgICAgY2FtX2ZvY3VzX2NhbGlicmF0aW9uX3Q+IEZPQ1VTX0NBTElCUkFUSU9OX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2Vuc29yX3Rlc3RfcGF0dGVybl9tb2RlX3QsCisgICAgICAgICAgICBjYW1fdGVzdF9wYXR0ZXJuX21vZGVfdD4gVEVTVF9QQVRURVJOX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfdmlkZW9faGRyX21vZGVfdCwKKyAgICAgICAgICAgIGNhbV92aWRlb19oZHJfbW9kZV90PiBWSURFT19IRFJfTU9ERVNfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8Y2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zZW5zb3JfcmVmZXJlbmNlX2lsbHVtaW5hbnQxX3QsCisgICAgICAgICAgICBjYW1faWxsdW1pbmF0X3Q+IFJFRkVSRU5DRV9JTExVTUlOQU5UX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhTWFwPGludDMyX3QsCisgICAgICAgICAgICBjYW1faGZyX21vZGVfdD4gSEZSX01PREVfTUFQW107CisgICAgc3RhdGljIGNvbnN0IFFDYW1lcmFNYXA8Y2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9pcl9tb2RlX3QsCisgICAgICAgICAgICBjYW1faXJfbW9kZV90eXBlX3Q+IElSX01PREVTX01BUFtdOworICAgIHN0YXRpYyBjb25zdCBRQ2FtZXJhUHJvcE1hcCBDRFNfTUFQW107CisKKyAgICBwZW5kaW5nUmVxdWVzdEl0ZXJhdG9yIGVyYXNlUGVuZGluZ1JlcXVlc3QocGVuZGluZ1JlcXVlc3RJdGVyYXRvciBpKTsKKyAgICAvL0dQVSBsaWJyYXJ5IHRvIHJlYWQgYnVmZmVyIHBhZGRpbmcgZGV0YWlscy4KKyAgICB2b2lkICpsaWJfc3VyZmFjZV91dGlsczsKKyAgICBpbnQgKCpMSU5LX2dldF9zdXJmYWNlX3BpeGVsX2FsaWdubWVudCkoKTsKKyAgICB1aW50MzJfdCBtU3VyZmFjZVN0cmlkZVBhZGRpbmc7CisKKyAgICBTdGF0ZSBtU3RhdGU7CisgICAgLy9EdWFsIGNhbWVyYSByZWxhdGVkIHBhcmFtcworICAgIGJvb2wgbUlzRGV2aWNlTGlua2VkOworICAgIGJvb2wgbUlzTWFpbkNhbWVyYTsKKyAgICB1aW50OF90IG1MaW5rZWRDYW1lcmFJZDsKKyAgICBRQ2FtZXJhM0hlYXBNZW1vcnkgKm1fcFJlbENhbVN5bmNIZWFwOworICAgIGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QgKm1fcFJlbENhbVN5bmNCdWY7CisgICAgY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCBtX3JlbENhbVN5bmNJbmZvOworCit9OworCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQorCisjZW5kaWYgLyogX19RQ0FNRVJBMkhBUkRXQVJFSU5URVJGQUNFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNNZW0uY3BwIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNNZW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViY2MzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM01lbS5jcHAKQEAgLTAsMCArMSwxMTk5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYUhXSV9NZW0iCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxmY250bC5oPgorI2RlZmluZSBNTUFOX0ggPFNZU1RFTV9IRUFERVJfUFJFRklYL21tYW4uaD4KKyNpbmNsdWRlIE1NQU5fSAorI2luY2x1ZGUgImdyYWxsb2NfcHJpdi5oIgorCisvLyBEaXNwbGF5IGRlcGVuZGVuY2llcworI2luY2x1ZGUgInFkTWV0YURhdGEuaCIKKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIlFDYW1lcmEzSFdJLmgiCisjaW5jbHVkZSAiUUNhbWVyYTNNZW0uaCIKKyNpbmNsdWRlICJRQ2FtZXJhVHJhY2UuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKK30KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworLy8gUUNhZW1yYTJNZW1vcnkgYmFzZSBjbGFzcworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmEzTWVtb3J5CisgKgorICogREVTQ1JJUFRJT046IGRlZmF1bHQgY29uc3RydWN0b3Igb2YgUUNhbWVyYTNNZW1vcnkKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEzTWVtb3J5OjpRQ2FtZXJhM01lbW9yeSgpCit7CisgICAgbUJ1ZmZlckNvdW50ID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUzsgaSsrKSB7CisgICAgICAgIG1NZW1JbmZvW2ldLmZkID0gLTE7CisgICAgICAgIG1NZW1JbmZvW2ldLm1haW5faW9uX2ZkID0gLTE7CisgICAgICAgIG1NZW1JbmZvW2ldLmhhbmRsZSA9IDA7CisgICAgICAgIG1NZW1JbmZvW2ldLnNpemUgPSAwOworICAgICAgICBtQ3VycmVudEZyYW1lTnVtYmVyc1tpXSA9IC0xOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYTNNZW1vcnkKKyAqCisgKiBERVNDUklQVElPTjogZGVjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhM01lbW9yeQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNNZW1vcnk6On5RQ2FtZXJhM01lbW9yeSgpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2FjaGVPcHNJbnRlcm5hbAorICoKKyAqIERFU0NSSVBUSU9OOiBpb24gcmVsYXRlZCBtZW1vcnkgY2FjaGUgb3BlcmF0aW9ucworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGluZGV4IG9mIHRoZSBidWZmZXIKKyAqICAgQGNtZCAgICAgOiBjYWNoZSBvcHMgY29tbWFuZAorICogICBAdmFkZHIgICA6IHB0ciB0byB0aGUgdmlydHVhbCBhZGRyZXNzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEzTWVtb3J5OjpjYWNoZU9wc0ludGVybmFsKHVpbnQzMl90IGluZGV4LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICp2YWRkcikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBzdHJ1Y3QgaW9uX2ZsdXNoX2RhdGEgY2FjaGVfaW52X2RhdGE7CisgICAgc3RydWN0IGlvbl9jdXN0b21fZGF0YSBjdXN0b21fZGF0YTsKKyAgICBpbnQgcmV0ID0gT0s7CisKKyAgICBpZiAoTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTIDw9IGluZGV4KSB7CisgICAgICAgIExPR0UoImluZGV4ICVkIG91dCBvZiBib3VuZCBbMCwgJWQpIiwKKyAgICAgICAgICAgICAgICAgaW5kZXgsIE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUyk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgaWYgKDAgPT0gbU1lbUluZm9baW5kZXhdLmhhbmRsZSkgeworICAgICAgICBMT0dFKCJCdWZmZXIgYXQgJWQgbm90IHJlZ2lzdGVyZWQiLCBpbmRleCk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgbWVtc2V0KCZjYWNoZV9pbnZfZGF0YSwgMCwgc2l6ZW9mKGNhY2hlX2ludl9kYXRhKSk7CisgICAgbWVtc2V0KCZjdXN0b21fZGF0YSwgMCwgc2l6ZW9mKGN1c3RvbV9kYXRhKSk7CisgICAgY2FjaGVfaW52X2RhdGEudmFkZHIgPSB2YWRkcjsKKyAgICBjYWNoZV9pbnZfZGF0YS5mZCA9IG1NZW1JbmZvW2luZGV4XS5mZDsKKyAgICBjYWNoZV9pbnZfZGF0YS5oYW5kbGUgPSBtTWVtSW5mb1tpbmRleF0uaGFuZGxlOworICAgIGNhY2hlX2ludl9kYXRhLmxlbmd0aCA9ICh1bnNpZ25lZCBpbnQpbU1lbUluZm9baW5kZXhdLnNpemU7CisgICAgY3VzdG9tX2RhdGEuY21kID0gY21kOworICAgIGN1c3RvbV9kYXRhLmFyZyA9ICh1bnNpZ25lZCBsb25nKSZjYWNoZV9pbnZfZGF0YTsKKworICAgIExPR0QoImFkZHIgPSAlcCwgZmQgPSAlZCwgaGFuZGxlID0gJWx4IGxlbmd0aCA9ICVkLCBJT04gRmQgPSAlZCIsCisgICAgICAgICAgY2FjaGVfaW52X2RhdGEudmFkZHIsIGNhY2hlX2ludl9kYXRhLmZkLAorICAgICAgICAgKHVuc2lnbmVkIGxvbmcpY2FjaGVfaW52X2RhdGEuaGFuZGxlLCBjYWNoZV9pbnZfZGF0YS5sZW5ndGgsCisgICAgICAgICBtTWVtSW5mb1tpbmRleF0ubWFpbl9pb25fZmQpOworICAgIHJldCA9IGlvY3RsKG1NZW1JbmZvW2luZGV4XS5tYWluX2lvbl9mZCwgSU9OX0lPQ19DVVNUT00sICZjdXN0b21fZGF0YSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIExPR0UoIkNhY2hlIEludmFsaWRhdGUgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RmQKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW5kZXhlZCBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGZpbGUgZGVzY3JpcHRvcgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTNNZW1vcnk6OmdldEZkKHVpbnQzMl90IGluZGV4KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGlmIChNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVMgPD0gaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBpZiAoMCA9PSBtTWVtSW5mb1tpbmRleF0uaGFuZGxlKSB7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgcmV0dXJuIG1NZW1JbmZvW2luZGV4XS5mZDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRTaXplCisgKgorICogREVTQ1JJUFRJT046IHJldHVybiBidWZmZXIgc2l6ZSBvZiB0aGUgaW5kZXhlZCBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGJ1ZmZlciBzaXplCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3NzaXplX3QgUUNhbWVyYTNNZW1vcnk6OmdldFNpemUodWludDMyX3QgaW5kZXgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgaWYgKE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUyA8PSBpbmRleCkgeworICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIH0KKworICAgIGlmICgwID09IG1NZW1JbmZvW2luZGV4XS5oYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICByZXR1cm4gKHNzaXplX3QpbU1lbUluZm9baW5kZXhdLnNpemU7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0Q250CisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50MzJfdCBRQ2FtZXJhM01lbW9yeTo6Z2V0Q250KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICByZXR1cm4gbUJ1ZmZlckNvdW50OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEJ1ZkRlZgorICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBkZXRhaWxlZCBidWZmZXIgaW5mb3JtYXRpb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG9mZnNldCAgOiBbaW5wdXRdIGZyYW1lIGJ1ZmZlciBvZmZzZXQKKyAqICAgQGJ1ZkRlZiAgOiBbb3V0cHV0XSByZWZlcmVuY2UgdG8gc3RydWN0IHRvIHN0b3JlIGJ1ZmZlciBkZWZpbml0aW9uCisgKiAgIEBpbmRleCAgIDogW2lucHV0XSBpbmRleCBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM01lbW9yeTo6Z2V0QnVmRGVmKGNvbnN0IGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QgJm9mZnNldCwKKyAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAmYnVmRGVmLCB1aW50MzJfdCBpbmRleCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBpZiAoIW1CdWZmZXJDb3VudCkgeworICAgICAgICBMT0dFKCJNZW1vcnkgbm90IGFsbG9jYXRlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBidWZEZWYuZmQgPSBtTWVtSW5mb1tpbmRleF0uZmQ7CisgICAgYnVmRGVmLmZyYW1lX2xlbiA9IG1NZW1JbmZvW2luZGV4XS5zaXplOworICAgIGJ1ZkRlZi5tZW1faW5mbyA9ICh2b2lkICopdGhpczsKKyAgICBidWZEZWYuYnVmZmVyID0gZ2V0UHRyTG9ja2VkKGluZGV4KTsKKyAgICBidWZEZWYucGxhbmVzX2J1Zi5udW1fcGxhbmVzID0gKGludDhfdClvZmZzZXQubnVtX3BsYW5lczsKKyAgICBidWZEZWYuYnVmX2lkeCA9ICh1aW50OF90KWluZGV4OworCisgICAgLyogUGxhbmUgMCBuZWVkcyB0byBiZSBzZXQgc2VwYXJhdGVseS4gU2V0IG90aGVyIHBsYW5lcyBpbiBhIGxvb3AgKi8KKyAgICBidWZEZWYucGxhbmVzX2J1Zi5wbGFuZXNbMF0ubGVuZ3RoID0gb2Zmc2V0Lm1wWzBdLmxlbjsKKyAgICBidWZEZWYucGxhbmVzX2J1Zi5wbGFuZXNbMF0ubS51c2VycHRyID0gKGxvbmcgdW5zaWduZWQgaW50KW1NZW1JbmZvW2luZGV4XS5mZDsKKyAgICBidWZEZWYucGxhbmVzX2J1Zi5wbGFuZXNbMF0uZGF0YV9vZmZzZXQgPSBvZmZzZXQubXBbMF0ub2Zmc2V0OworICAgIGJ1ZkRlZi5wbGFuZXNfYnVmLnBsYW5lc1swXS5yZXNlcnZlZFswXSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBidWZEZWYucGxhbmVzX2J1Zi5udW1fcGxhbmVzOyBpKyspIHsKKyAgICAgICAgIGJ1ZkRlZi5wbGFuZXNfYnVmLnBsYW5lc1tpXS5sZW5ndGggPSBvZmZzZXQubXBbaV0ubGVuOworICAgICAgICAgYnVmRGVmLnBsYW5lc19idWYucGxhbmVzW2ldLm0udXNlcnB0ciA9IChsb25nIHVuc2lnbmVkIGludCltTWVtSW5mb1tpXS5mZDsKKyAgICAgICAgIGJ1ZkRlZi5wbGFuZXNfYnVmLnBsYW5lc1tpXS5kYXRhX29mZnNldCA9IG9mZnNldC5tcFtpXS5vZmZzZXQ7CisgICAgICAgICBidWZEZWYucGxhbmVzX2J1Zi5wbGFuZXNbaV0ucmVzZXJ2ZWRbMF0gPQorICAgICAgICAgICAgICAgICBidWZEZWYucGxhbmVzX2J1Zi5wbGFuZXNbaS0xXS5yZXNlcnZlZFswXSArCisgICAgICAgICAgICAgICAgIGJ1ZkRlZi5wbGFuZXNfYnVmLnBsYW5lc1tpLTFdLmxlbmd0aDsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYTNIZWFwTWVtb3J5CisgKgorICogREVTQ1JJUFRJT046IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmEzSGVhcE1lbW9yeSBmb3IgaW9uIG1lbW9yeSB1c2VkIGludGVybmFsbHkgaW4gSEFMCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhM0hlYXBNZW1vcnk6OlFDYW1lcmEzSGVhcE1lbW9yeSh1aW50MzJfdCBtYXhDbnQpCisgICAgOiBRQ2FtZXJhM01lbW9yeSgpCit7CisgICAgbU1heENudCA9IE1JTihtYXhDbnQsIE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUyk7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1NYXhDbnQ7IGkgKyspCisgICAgICAgIG1QdHJbaV0gPSBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhM0hlYXBNZW1vcnkKKyAqCisgKiBERVNDUklQVElPTjogZGVjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhM0hlYXBNZW1vcnkKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEzSGVhcE1lbW9yeTo6flFDYW1lcmEzSGVhcE1lbW9yeSgpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWxsb2NPbmVCdWZmZXIKKyAqCisgKiBERVNDUklQVElPTjogaW1wbCBvZiBhbGxvY2F0aW5nIG9uZSBidWZmZXJzIG9mIGNlcnRhaW4gc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbWVtSW5mbyA6IFtvdXRwdXRdIHJlZmVyZW5jZSB0byBzdHJ1Y3QgdG8gc3RvcmUgYWRkaXRpb25hbCBtZW1vcnkgYWxsb2NhdGlvbiBpbmZvCisgKiAgIEBoZWFwICAgIDogW2lucHV0XSBoZWFwIGlkIHRvIGluZGljYXRlIHdoZXJlIHRoZSBidWZmZXJzIHdpbGwgYmUgYWxsb2NhdGVkIGZyb20KKyAqICAgQHNpemUgICAgOiBbaW5wdXRdIGxlbmdodCBvZiB0aGUgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM0hlYXBNZW1vcnk6OmFsbG9jT25lQnVmZmVyKFFDYW1lcmEzTWVtSW5mbyAmbWVtSW5mbywKKyAgICAgICAgdW5zaWduZWQgaW50IGhlYXBfaWQsIHNpemVfdCBzaXplKQoreworICAgIGludCByYyA9IE9LOworICAgIHN0cnVjdCBpb25faGFuZGxlX2RhdGEgaGFuZGxlX2RhdGE7CisgICAgc3RydWN0IGlvbl9hbGxvY2F0aW9uX2RhdGEgYWxsb2NEYXRhOworICAgIHN0cnVjdCBpb25fZmRfZGF0YSBpb25faW5mb19mZDsKKyAgICBpbnQgbWFpbl9pb25fZmQgPSAtMTsKKworICAgIG1haW5faW9uX2ZkID0gb3BlbigiL2Rldi9pb24iLCBPX1JET05MWSk7CisgICAgaWYgKG1haW5faW9uX2ZkIDwgMCkgeworICAgICAgICBMT0dFKCJJb24gZGV2IG9wZW4gZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBJT05fT1BFTl9GQUlMRUQ7CisgICAgfQorCisgICAgbWVtc2V0KCZhbGxvY0RhdGEsIDAsIHNpemVvZihhbGxvY0RhdGEpKTsKKyAgICBhbGxvY0RhdGEubGVuID0gc2l6ZTsKKyAgICAvKiB0byBtYWtlIGl0IHBhZ2Ugc2l6ZSBhbGlnbmVkICovCisgICAgYWxsb2NEYXRhLmxlbiA9IChhbGxvY0RhdGEubGVuICsgNDA5NVUpICYgKH40MDk1VSk7CisgICAgYWxsb2NEYXRhLmFsaWduID0gNDA5NjsKKyAgICBhbGxvY0RhdGEuZmxhZ3MgPSBJT05fRkxBR19DQUNIRUQ7CisgICAgYWxsb2NEYXRhLmhlYXBfaWRfbWFzayA9IGhlYXBfaWQ7CisgICAgcmMgPSBpb2N0bChtYWluX2lvbl9mZCwgSU9OX0lPQ19BTExPQywgJmFsbG9jRGF0YSk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJJT04gYWxsb2NhdGlvbiBmb3IgbGVuICVkIGZhaWxlZDogJXNcbiIsIGFsbG9jRGF0YS5sZW4sCisgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgICBnb3RvIElPTl9BTExPQ19GQUlMRUQ7CisgICAgfQorCisgICAgbWVtc2V0KCZpb25faW5mb19mZCwgMCwgc2l6ZW9mKGlvbl9pbmZvX2ZkKSk7CisgICAgaW9uX2luZm9fZmQuaGFuZGxlID0gYWxsb2NEYXRhLmhhbmRsZTsKKyAgICByYyA9IGlvY3RsKG1haW5faW9uX2ZkLCBJT05fSU9DX1NIQVJFLCAmaW9uX2luZm9fZmQpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiSU9OIG1hcCBmYWlsZWQgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGdvdG8gSU9OX01BUF9GQUlMRUQ7CisgICAgfQorCisgICAgbWVtSW5mby5tYWluX2lvbl9mZCA9IG1haW5faW9uX2ZkOworICAgIG1lbUluZm8uZmQgPSBpb25faW5mb19mZC5mZDsKKyAgICBtZW1JbmZvLmhhbmRsZSA9IGlvbl9pbmZvX2ZkLmhhbmRsZTsKKyAgICBtZW1JbmZvLnNpemUgPSBhbGxvY0RhdGEubGVuOworICAgIHJldHVybiBPSzsKKworSU9OX01BUF9GQUlMRUQ6CisgICAgbWVtc2V0KCZoYW5kbGVfZGF0YSwgMCwgc2l6ZW9mKGhhbmRsZV9kYXRhKSk7CisgICAgaGFuZGxlX2RhdGEuaGFuZGxlID0gaW9uX2luZm9fZmQuaGFuZGxlOworICAgIGlvY3RsKG1haW5faW9uX2ZkLCBJT05fSU9DX0ZSRUUsICZoYW5kbGVfZGF0YSk7CitJT05fQUxMT0NfRkFJTEVEOgorICAgIGNsb3NlKG1haW5faW9uX2ZkKTsKK0lPTl9PUEVOX0ZBSUxFRDoKKyAgICByZXR1cm4gTk9fTUVNT1JZOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGRlYWxsb2NPbmVCdWZmZXIKKyAqCisgKiBERVNDUklQVElPTjogaW1wbCBvZiBkZWFsbG9jYXRpbmcgb25lIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG1lbUluZm8gOiByZWZlcmVuY2UgdG8gc3RydWN0IHRoYXQgc3RvcmVzIGFkZGl0aW9uYWwgbWVtb3J5IGFsbG9jYXRpb24gaW5mbworICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNIZWFwTWVtb3J5OjpkZWFsbG9jT25lQnVmZmVyKFFDYW1lcmEzTWVtSW5mbyAmbWVtSW5mbykKK3sKKyAgICBzdHJ1Y3QgaW9uX2hhbmRsZV9kYXRhIGhhbmRsZV9kYXRhOworCisgICAgaWYgKG1lbUluZm8uZmQgPj0gMCkgeworICAgICAgICBjbG9zZShtZW1JbmZvLmZkKTsKKyAgICAgICAgbWVtSW5mby5mZCA9IC0xOworICAgIH0KKworICAgIGlmIChtZW1JbmZvLm1haW5faW9uX2ZkID49IDApIHsKKyAgICAgICAgbWVtc2V0KCZoYW5kbGVfZGF0YSwgMCwgc2l6ZW9mKGhhbmRsZV9kYXRhKSk7CisgICAgICAgIGhhbmRsZV9kYXRhLmhhbmRsZSA9IG1lbUluZm8uaGFuZGxlOworICAgICAgICBpb2N0bChtZW1JbmZvLm1haW5faW9uX2ZkLCBJT05fSU9DX0ZSRUUsICZoYW5kbGVfZGF0YSk7CisgICAgICAgIGNsb3NlKG1lbUluZm8ubWFpbl9pb25fZmQpOworICAgICAgICBtZW1JbmZvLm1haW5faW9uX2ZkID0gLTE7CisgICAgfQorICAgIG1lbUluZm8uaGFuZGxlID0gMDsKKyAgICBtZW1JbmZvLnNpemUgPSAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFB0ckxvY2tlZAorICoKKyAqIERFU0NSSVBUSU9OOiBSZXR1cm4gYnVmZmVyIHBvaW50ZXIuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBidWZmZXIgcHRyCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgKlFDYW1lcmEzSGVhcE1lbW9yeTo6Z2V0UHRyTG9ja2VkKHVpbnQzMl90IGluZGV4KQoreworICAgIGlmIChpbmRleCA+PSBtQnVmZmVyQ291bnQpIHsKKyAgICAgICAgTE9HRSgiaW5kZXggb3V0IG9mIGJvdW5kIik7CisgICAgICAgIHJldHVybiAodm9pZCAqKUJBRF9JTkRFWDsKKyAgICB9CisgICAgcmV0dXJuIG1QdHJbaW5kZXhdOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1hcmtGcmFtZU51bWJlcgorICoKKyAqIERFU0NSSVBUSU9OOiBXZSB1c2UgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSByZXF1ZXN0IGNhbGwgcGF0aCB0byBtYXJrIHRoZQorICogICAgICAgICAgICAgIGJ1ZmZlcnMgd2l0aCB0aGUgZnJhbWUgbnVtYmVyIHRoZXkgYXJlIGludGVuZGVkIGZvciB0aGlzIGluZm8KKyAqICAgICAgICAgICAgICBpcyB1c2VkIGxhdGVyIHdoZW4gZ2l2aW5nIG91dCBjYWxsYmFjayAmIGl0IGlzIGR1dHkgb2YgUFAgdG8KKyAqICAgICAgICAgICAgICBlbnN1cmUgdGhhdCBkYXRhIGZvciB0aGF0IHBhcnRpY3VsYXIgZnJhbWVOdW1iZXIvUmVxdWVzdCBpcworICogICAgICAgICAgICAgIHdyaXR0ZW4gdG8gdGhpcyBidWZmZXIuCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKiAgIEBmcmFtZSMgIDogRnJhbWUgbnVtYmVyIGZyb20gdGhlIGZyYW1ld29yaworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNIZWFwTWVtb3J5OjptYXJrRnJhbWVOdW1iZXIodWludDMyX3QgaW5kZXgsIHVpbnQzMl90IGZyYW1lTnVtYmVyKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGlmIChpbmRleCA+PSBtQnVmZmVyQ291bnQpIHsKKyAgICAgICAgTE9HRSgiSW5kZXggJWQgb3V0IG9mIGJvdW5kcywgY3VycmVudCBidWZmZXIgY291bnQgaXMgJWQiLAorICAgICAgICAgICAgICAgICBpbmRleCwgbUJ1ZmZlckNvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBpZiAoMCA9PSBtTWVtSW5mb1tpbmRleF0uaGFuZGxlKSB7CisgICAgICAgIExPR0UoIkJ1ZmZlciBhdCAlZCBub3QgYWxsb2NhdGVkIiwgaW5kZXgpOworICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIH0KKworICAgIG1DdXJyZW50RnJhbWVOdW1iZXJzW2luZGV4XSA9IChpbnQzMl90KWZyYW1lTnVtYmVyOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEZyYW1lTnVtYmVyCisgKgorICogREVTQ1JJUFRJT046IFdlIHVzZSB0aGlzIHRvIGZldGNoIHRoZSBmcmFtZU51bWJlciBmb3IgdGhlIHJlcXVlc3Qgd2l0aCB3aGljaAorICogICAgICAgICAgICAgIHRoaXMgYnVmZmVyIHdhcyBnaXZlbiB0byBIQUwKKyAqCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IGZyYW1lTnVtYmVyCisgKiAgICAgICAgICAgICAgcG9zaXRpdmUvemVybyAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5lZ2F0aXZlIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM0hlYXBNZW1vcnk6OmdldEZyYW1lTnVtYmVyKHVpbnQzMl90IGluZGV4KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGlmIChpbmRleCA+PSBtQnVmZmVyQ291bnQpIHsKKyAgICAgICAgTE9HRSgiSW5kZXggJWQgb3V0IG9mIGJvdW5kcywgY3VycmVudCBidWZmZXIgY291bnQgaXMgJWQiLAorICAgICAgICAgICAgICAgICBpbmRleCwgbUJ1ZmZlckNvdW50KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICgwID09IG1NZW1JbmZvW2luZGV4XS5oYW5kbGUpIHsKKyAgICAgICAgTE9HRSgiQnVmZmVyIGF0ICVkIG5vdCByZWdpc3RlcmVkIiwgaW5kZXgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIG1DdXJyZW50RnJhbWVOdW1iZXJzW2luZGV4XTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRCdWZmZXJJbmRleAorICoKKyAqIERFU0NSSVBUSU9OOiBXZSB1c2UgdGhpcyB0byBmZXRjaCB0aGUgYnVmZmVyIGluZGV4IGZvciB0aGUgcmVxdWVzdCB3aXRoCisgKiAgICAgICAgICAgICAgYSBwYXJ0aWN1bGFyIGZyYW1lIG51bWJlcgorICoKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZyYW1lTnVtYmVyICA6IGZyYW1lIG51bWJlciBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgYnVmZmVyIGluZGV4CisgKiAgICAgICAgICAgICAgbmVnYXRpdmUgZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzSGVhcE1lbW9yeTo6Z2V0QnVmZmVySW5kZXgodWludDMyX3QgZnJhbWVOdW1iZXIpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgZm9yICh1aW50MzJfdCBpbmRleCA9IDA7CisgICAgICAgICAgICBpbmRleCA8IG1CdWZmZXJDb3VudDsgaW5kZXgrKykgeworICAgICAgICBpZiAobU1lbUluZm9baW5kZXhdLmhhbmRsZSAmJgorICAgICAgICAgICAgICAgIG1DdXJyZW50RnJhbWVOdW1iZXJzW2luZGV4XSA9PSAoaW50MzJfdClmcmFtZU51bWJlcikKKyAgICAgICAgICAgIHJldHVybiAoaW50MzJfdClpbmRleDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldFB0cgorICoKKyAqIERFU0NSSVBUSU9OOiBSZXR1cm4gYnVmZmVyIHBvaW50ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGJ1ZmZlciBwdHIKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCAqUUNhbWVyYTNIZWFwTWVtb3J5OjpnZXRQdHIodWludDMyX3QgaW5kZXgpCit7CisgICAgcmV0dXJuIGdldFB0ckxvY2tlZChpbmRleCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWxsb2NhdGUKKyAqCisgKiBERVNDUklQVElPTjogYWxsb2NhdGUgcmVxdWVzdGVkIG51bWJlciBvZiBidWZmZXJzIG9mIGNlcnRhaW4gc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc2l6ZSAgICA6IGxlbmdodCBvZiB0aGUgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM0hlYXBNZW1vcnk6OmFsbG9jYXRlKHNpemVfdCBzaXplKQoreworICAgIHVuc2lnbmVkIGludCBoZWFwX2lkX21hc2sgPSAweDEgPDwgSU9OX0lPTU1VX0hFQVBfSUQ7CisgICAgdWludDMyX3QgaTsKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKworICAgIC8vTm90ZSB0aGF0IG5vdyB3ZSBhbGxvdyBpbmNyZW1lbnRhbCBhbGxvY2F0aW9uLiBJbiBvdGhlciB3b3Jkcywgd2UgYWxsb3cKKyAgICAvL211bHRpcGxlIGFsbG9jIGJlaW5nIGNhbGxlZCBhcyBsb25nIGFzIHRoZSBzdW0gb2YgY291bnQgZG9lcyBub3QgZXhjZWVkCisgICAgLy9tTWF4Q250LgorICAgIGlmIChtQnVmZmVyQ291bnQgPiAwKSB7CisgICAgICAgIExPR0UoIlRoZXJlIGlzIGFscmVhZHkgYnVmZmVyIGFsbG9jYXRlZC4iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbU1heENudDsgaSArKykgeworICAgICAgICByYyA9IGFsbG9jT25lQnVmZmVyKG1NZW1JbmZvW2ldLCBoZWFwX2lkX21hc2ssIHNpemUpOworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJBbGxvY2F0ZUlvbk1lbW9yeSBmYWlsZWQiKTsKKyAgICAgICAgICAgIGdvdG8gQUxMT0NfRkFJTEVEOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCAqdmFkZHIgPSBtbWFwKE5VTEwsCisgICAgICAgICAgICAgICAgICAgIG1NZW1JbmZvW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgIG1NZW1JbmZvW2ldLmZkLCAwKTsKKyAgICAgICAgaWYgKHZhZGRyID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgICAgIGRlYWxsb2NPbmVCdWZmZXIobU1lbUluZm9baV0pOworICAgICAgICAgICAgTE9HRSgibW1hcCBmYWlsZWQgZm9yIGJ1ZmZlciAlZCIsIGkpOworICAgICAgICAgICAgZ290byBBTExPQ19GQUlMRUQ7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbVB0cltpXSA9IHZhZGRyOworICAgIH0KKyAgICBpZiAocmMgPT0gMCkKKyAgICAgICAgbUJ1ZmZlckNvdW50ID0gbU1heENudDsKKworICAgIHJldHVybiBPSzsKKworQUxMT0NfRkFJTEVEOgorICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgbXVubWFwKG1QdHJbal0sIG1NZW1JbmZvW2pdLnNpemUpOworICAgICAgICBtUHRyW2pdID0gTlVMTDsKKyAgICAgICAgZGVhbGxvY09uZUJ1ZmZlcihtTWVtSW5mb1tqXSk7CisgICAgfQorICAgIHJldHVybiBOT19NRU1PUlk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWxsb2NhdGVPbmUKKyAqCisgKiBERVNDUklQVElPTjogYWxsb2NhdGUgb25lIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc2l6ZSAgICA6IGxlbmdodCBvZiB0aGUgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM0hlYXBNZW1vcnk6OmFsbG9jYXRlT25lKHNpemVfdCBzaXplKQoreworICAgIHVuc2lnbmVkIGludCBoZWFwX2lkX21hc2sgPSAweDEgPDwgSU9OX0lPTU1VX0hFQVBfSUQ7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisKKyAgICAvL05vdGUgdGhhdCBub3cgd2UgYWxsb3cgaW5jcmVtZW50YWwgYWxsb2NhdGlvbi4gSW4gb3RoZXIgd29yZHMsIHdlIGFsbG93CisgICAgLy9tdWx0aXBsZSBhbGxvYyBiZWluZyBjYWxsZWQgYXMgbG9uZyBhcyB0aGUgc3VtIG9mIGNvdW50IGRvZXMgbm90IGV4Y2VlZAorICAgIC8vbU1heENudC4KKyAgICBpZiAobUJ1ZmZlckNvdW50ICsgMSA+IG1NYXhDbnQpIHsKKyAgICAgICAgTE9HRSgiQnVmZmVyIGNvdW50ICVkICsgMSBvdXQgb2YgYm91bmQuIE1heCBpcyAlZCIsCisgICAgICAgICAgICAgICAgbUJ1ZmZlckNvdW50LCBtTWF4Q250KTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICByYyA9IGFsbG9jT25lQnVmZmVyKG1NZW1JbmZvW21CdWZmZXJDb3VudF0sIGhlYXBfaWRfbWFzaywgc2l6ZSk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJBbGxvY2F0ZUlvbk1lbW9yeSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB2b2lkICp2YWRkciA9IG1tYXAoTlVMTCwKKyAgICAgICAgICAgICAgICBtTWVtSW5mb1ttQnVmZmVyQ291bnRdLnNpemUsCisgICAgICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICBNQVBfU0hBUkVELAorICAgICAgICAgICAgICAgIG1NZW1JbmZvW21CdWZmZXJDb3VudF0uZmQsIDApOworICAgIGlmICh2YWRkciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgIGRlYWxsb2NPbmVCdWZmZXIobU1lbUluZm9bbUJ1ZmZlckNvdW50XSk7CisgICAgICAgIExPR0UoIm1tYXAgZmFpbGVkIGZvciBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9IGVsc2UKKyAgICAgICAgbVB0clttQnVmZmVyQ291bnRdID0gdmFkZHI7CisKKyAgICBpZiAocmMgPT0gMCkKKyAgICAgICAgbUJ1ZmZlckNvdW50ICs9IDE7CisKKyAgICByZXR1cm4gbUJ1ZmZlckNvdW50LTE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGVhbGxvY2F0ZQorICoKKyAqIERFU0NSSVBUSU9OOiBkZWFsbG9jYXRlIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNIZWFwTWVtb3J5OjpkZWFsbG9jYXRlKCkKK3sKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbUJ1ZmZlckNvdW50OyBpKyspIHsKKyAgICAgICAgbXVubWFwKG1QdHJbaV0sIG1NZW1JbmZvW2ldLnNpemUpOworICAgICAgICBtUHRyW2ldID0gTlVMTDsKKyAgICAgICAgZGVhbGxvY09uZUJ1ZmZlcihtTWVtSW5mb1tpXSk7CisgICAgICAgIG1DdXJyZW50RnJhbWVOdW1iZXJzW2ldID0gLTE7CisgICAgfQorICAgIG1CdWZmZXJDb3VudCA9IDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2FjaGVPcHMKKyAqCisgKiBERVNDUklQVElPTjogaW9uIHJlbGF0ZWQgbWVtb3J5IGNhY2hlIG9wZXJhdGlvbnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKiAgIEBjbWQgICAgIDogY2FjaGUgb3BzIGNvbW1hbmQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTNIZWFwTWVtb3J5OjpjYWNoZU9wcyh1aW50MzJfdCBpbmRleCwgdW5zaWduZWQgaW50IGNtZCkKK3sKKyAgICBpZiAoaW5kZXggPj0gbUJ1ZmZlckNvdW50KQorICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIHJldHVybiBjYWNoZU9wc0ludGVybmFsKGluZGV4LCBjbWQsIG1QdHJbaW5kZXhdKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRNYXRjaEJ1ZkluZGV4CisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IGJ1ZmZlciBpbmRleCBieSBvYmplY3QgcHRyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBvYmplY3QgIDogb2JqZWN0IHB0cgorICoKKyAqIFJFVFVSTiAgICAgOiBidWZmZXIgaW5kZXggaWYgbWF0Y2ggZm91bmQsCisgKiAgICAgICAgICAgICAgLTEgaWYgZmFpbGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM0hlYXBNZW1vcnk6OmdldE1hdGNoQnVmSW5kZXgodm9pZCAqIC8qb2JqZWN0Ki8pCit7CisKKy8qCisgICAgVE9ETyBmb3IgSEVBUCBtZW1vcnkgdHlwZSwgd291bGQgdGhlcmUgYmUgYW4gZXF1aXZhbGVudCByZXF1aXJlbWVudD8KKworICAgIGludCBpbmRleCA9IC0xOworICAgIGJ1ZmZlcl9oYW5kbGVfdCAqa2V5ID0gKGJ1ZmZlcl9oYW5kbGVfdCopIG9iamVjdDsKKyAgICBpZiAoIWtleSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1CdWZmZXJDb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChtQnVmZmVySGFuZGxlW2ldID09IGtleSkgeworICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGluZGV4OworKi8KKyAgICBMT0dFKCJGQVRBTDogTm90IHN1cHBvc2VkIHRvIGNvbWUgaGVyZSIpOworICAgIHJldHVybiAtMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhM0dyYWxsb2NNZW1vcnkKKyAqCisgKiBERVNDUklQVElPTjogY29uc3RydWN0b3Igb2YgUUNhbWVyYTNHcmFsbG9jTWVtb3J5CisgKiAgICAgICAgICAgICAgcHJldmlldyBzdHJlYW0gYnVmZmVycyBhcmUgYWxsb2NhdGVkIGZyb20gZ3JhbGxvYyBuYXRpdmVfd2luZG9lCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdGFydElkeCA6IHN0YXJ0IGluZGV4IG9mIGFycmF5IGFmdGVyIHdoaWNoIHdlIGNhbiByZWdpc3RlciBidWZmZXJzIGluLgorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEzR3JhbGxvY01lbW9yeTo6UUNhbWVyYTNHcmFsbG9jTWVtb3J5KHVpbnQzMl90IHN0YXJ0SWR4KQorICAgICAgICA6IFFDYW1lcmEzTWVtb3J5KCksIG1TdGFydElkeChzdGFydElkeCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUzsgaSArKykgeworICAgICAgICBtQnVmZmVySGFuZGxlW2ldID0gTlVMTDsKKyAgICAgICAgbVByaXZhdGVIYW5kbGVbaV0gPSBOVUxMOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYTNHcmFsbG9jTWVtb3J5CisgKgorICogREVTQ1JJUFRJT046IGRlY29uc3RydWN0b3Igb2YgUUNhbWVyYTNHcmFsbG9jTWVtb3J5CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhM0dyYWxsb2NNZW1vcnk6On5RQ2FtZXJhM0dyYWxsb2NNZW1vcnkoKQoreworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlZ2lzdGVyQnVmZmVyCisgKgorICogREVTQ1JJUFRJT046IHJlZ2lzdGVycyBmcmFtZXdvcmtzLWFsbG9jYXRlZCBncmFsbG9jIGJ1ZmZlcl9oYW5kbGVfdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAYnVmZmVycyA6IGJ1ZmZlcl9oYW5kbGVfdCBwb2ludGVyCisgKiAgIEB0eXBlIDogICAgY2FtX3N0cmVhbV90eXBlX3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTNHcmFsbG9jTWVtb3J5OjpyZWdpc3RlckJ1ZmZlcihidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwKKyAgICAgICAgX191bnVzZWQgY2FtX3N0cmVhbV90eXBlX3QgdHlwZSkKK3sKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICBzdHJ1Y3QgaW9uX2ZkX2RhdGEgaW9uX2luZm9fZmQ7CisgICAgdm9pZCAqdmFkZHIgPSBOVUxMOworICAgIGludDMyX3QgY29sb3JTcGFjZSA9IElUVV9SXzYwMV9GUjsKKyAgICBpbnQzMl90IGlkeCA9IC0xOworCisgICAgTE9HRCgiRSIpOworCisgICAgbWVtc2V0KCZpb25faW5mb19mZCwgMCwgc2l6ZW9mKGlvbl9pbmZvX2ZkKSk7CisKKyAgICBpZiAoMCA8PSBnZXRNYXRjaEJ1ZkluZGV4KCh2b2lkICopIGJ1ZmZlcikpIHsKKyAgICAgICAgTE9HTCgiQnVmZmVyIGFscmVhZHkgcmVnaXN0ZXJlZCIpOworICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtQnVmZmVyQ291bnQgPj0gKE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUyAtIDEgLSBtU3RhcnRJZHgpKSB7CisgICAgICAgIExPR0UoIk51bWJlciBvZiBidWZmZXJzICVkIGdyZWF0ZXIgdGhhbiB3aGF0J3Mgc3VwcG9ydGVkICVkIiwKKyAgICAgICAgICAgICAgICAgbUJ1ZmZlckNvdW50LCBNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVMgLSBtU3RhcnRJZHgpOworICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIH0KKworICAgIGlkeCA9IGdldEZyZWVJbmRleExvY2tlZCgpOworICAgIGlmICgwID4gaWR4KSB7CisgICAgICAgIExPR0UoIk5vIGF2YWlsYWJsZSBtZW1vcnkgc2xvdHMiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBtQnVmZmVySGFuZGxlW2lkeF0gPSBidWZmZXI7CisgICAgbVByaXZhdGVIYW5kbGVbaWR4XSA9IChzdHJ1Y3QgcHJpdmF0ZV9oYW5kbGVfdCAqKSgqbUJ1ZmZlckhhbmRsZVtpZHhdKTsKKworICAgIHNldE1ldGFEYXRhKG1Qcml2YXRlSGFuZGxlW2lkeF0sIFVQREFURV9DT0xPUl9TUEFDRSwgJmNvbG9yU3BhY2UpOworCisgICAgbU1lbUluZm9baWR4XS5tYWluX2lvbl9mZCA9IG9wZW4oIi9kZXYvaW9uIiwgT19SRE9OTFkpOworICAgIGlmIChtTWVtSW5mb1tpZHhdLm1haW5faW9uX2ZkIDwgMCkgeworICAgICAgICBMT0dFKCJmYWlsZWQ6IGNvdWxkIG5vdCBvcGVuIGlvbiBkZXZpY2UiKTsKKyAgICAgICAgcmV0ID0gTk9fTUVNT1JZOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9IGVsc2UgeworICAgICAgICBpb25faW5mb19mZC5mZCA9IG1Qcml2YXRlSGFuZGxlW2lkeF0tPmZkOworICAgICAgICBpZiAoaW9jdGwobU1lbUluZm9baWR4XS5tYWluX2lvbl9mZCwKKyAgICAgICAgICAgICAgICAgIElPTl9JT0NfSU1QT1JULCAmaW9uX2luZm9fZmQpIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiSU9OIGltcG9ydCBmYWlsZWRcbiIpOworICAgICAgICAgICAgY2xvc2UobU1lbUluZm9baWR4XS5tYWluX2lvbl9mZCk7CisgICAgICAgICAgICByZXQgPSBOT19NRU1PUlk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dEKCJpZHggPSAlZCwgZmQgPSAlZCwgc2l6ZSA9ICVkLCBvZmZzZXQgPSAlZCIsCisgICAgICAgICAgICAgaWR4LCBtUHJpdmF0ZUhhbmRsZVtpZHhdLT5mZCwKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlW2lkeF0tPnNpemUsCisgICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZVtpZHhdLT5vZmZzZXQpOworICAgIG1NZW1JbmZvW2lkeF0uZmQgPSBtUHJpdmF0ZUhhbmRsZVtpZHhdLT5mZDsKKyAgICBtTWVtSW5mb1tpZHhdLnNpemUgPQorICAgICAgICAgICAgKCAvKiBGSVhNRTogU2hvdWxkIHVwZGF0ZSBJT04gaW50ZXJmYWNlICovIHNpemVfdCkKKyAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlW2lkeF0tPnNpemU7CisgICAgbU1lbUluZm9baWR4XS5oYW5kbGUgPSBpb25faW5mb19mZC5oYW5kbGU7CisKKyAgICB2YWRkciA9IG1tYXAoTlVMTCwKKyAgICAgICAgICAgIG1NZW1JbmZvW2lkeF0uc2l6ZSwKKyAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICBNQVBfU0hBUkVELAorICAgICAgICAgICAgbU1lbUluZm9baWR4XS5mZCwgMCk7CisgICAgaWYgKHZhZGRyID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgbU1lbUluZm9baWR4XS5oYW5kbGUgPSAwOworICAgICAgICByZXQgPSBOT19NRU1PUlk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVB0cltpZHhdID0gdmFkZHI7CisgICAgICAgIG1CdWZmZXJDb3VudCsrOworICAgIH0KKworZW5kOgorICAgIExPR0QoIlggIik7CisgICAgcmV0dXJuIHJldDsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdW5yZWdpc3RlckJ1ZmZlckxvY2tlZAorICoKKyAqIERFU0NSSVBUSU9OOiBVbnJlZ2lzdGVyIGJ1ZmZlci4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBoYXMgdG8gYmUKKyAqICAgICAgICAgICAgICBjYWxsZWQgd2l0aCAnbUxvY2snIGFjcXVpcmVkLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaWR4ICAgICA6IHVucmVnaXN0ZXIgYnVmZmVyIGF0IGluZGV4ICdpZHgnCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM0dyYWxsb2NNZW1vcnk6OnVucmVnaXN0ZXJCdWZmZXJMb2NrZWQoc2l6ZV90IGlkeCkKK3sKKyAgICBtdW5tYXAobVB0cltpZHhdLCBtTWVtSW5mb1tpZHhdLnNpemUpOworICAgIG1QdHJbaWR4XSA9IE5VTEw7CisKKyAgICBzdHJ1Y3QgaW9uX2hhbmRsZV9kYXRhIGlvbl9oYW5kbGU7CisgICAgbWVtc2V0KCZpb25faGFuZGxlLCAwLCBzaXplb2YoaW9uX2hhbmRsZSkpOworICAgIGlvbl9oYW5kbGUuaGFuZGxlID0gbU1lbUluZm9baWR4XS5oYW5kbGU7CisgICAgaWYgKGlvY3RsKG1NZW1JbmZvW2lkeF0ubWFpbl9pb25fZmQsIElPTl9JT0NfRlJFRSwgJmlvbl9oYW5kbGUpIDwgMCkgeworICAgICAgICBMT0dFKCJpb24gZnJlZSBmYWlsZWQiKTsKKyAgICB9CisgICAgY2xvc2UobU1lbUluZm9baWR4XS5tYWluX2lvbl9mZCk7CisgICAgbWVtc2V0KCZtTWVtSW5mb1tpZHhdLCAwLCBzaXplb2Yoc3RydWN0IFFDYW1lcmEzTWVtSW5mbykpOworICAgIG1NZW1JbmZvW2lkeF0ubWFpbl9pb25fZmQgPSAtMTsKKyAgICBtQnVmZmVySGFuZGxlW2lkeF0gPSBOVUxMOworICAgIG1Qcml2YXRlSGFuZGxlW2lkeF0gPSBOVUxMOworICAgIG1DdXJyZW50RnJhbWVOdW1iZXJzW2lkeF0gPSAtMTsKKyAgICBtQnVmZmVyQ291bnQtLTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB1bnJlZ2lzdGVyQnVmZmVyCisgKgorICogREVTQ1JJUFRJT046IHVucmVnaXN0ZXIgYnVmZmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpZHggICAgIDogdW5yZWdpc3RlciBidWZmZXIgYXQgaW5kZXggJ2lkeCcKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzR3JhbGxvY01lbW9yeTo6dW5yZWdpc3RlckJ1ZmZlcihzaXplX3QgaWR4KQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBMT0dEKCJFICIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBpZiAoTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTIDw9IGlkeCkgeworICAgICAgICBMT0dFKCJCdWZmZXIgaW5kZXggJWQgZ3JlYXRlciB0aGFuIHdoYXQgaXMgc3VwcG9ydGVkICVkIiwKKyAgICAgICAgICAgICAgICAgaWR4LCBNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoaWR4IDwgbVN0YXJ0SWR4KSB7CisgICAgICAgIExPR0UoImJ1ZmZlciBpbmRleCAlZCBsZXNzIHRoYW4gc3RhcnRpbmcgaW5kZXggJWQiLAorICAgICAgICAgICAgICAgICBpZHgsIG1TdGFydElkeCk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgaWYgKDAgPT0gbU1lbUluZm9baWR4XS5oYW5kbGUpIHsKKyAgICAgICAgTE9HRSgiVHJ5aW5nIHRvIHVucmVnaXN0ZXIgYnVmZmVyIGF0ICVkIHdoaWNoIHN0aWxsIG5vdCByZWdpc3RlcmVkIiwKKyAgICAgICAgICAgICAgICAgaWR4KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByYyA9IHVucmVnaXN0ZXJCdWZmZXJMb2NrZWQoaWR4KTsKKworICAgIExPR0QoIlggIixfX0ZVTkNUSU9OX18pOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVucmVnaXN0ZXJCdWZmZXJzCisgKgorICogREVTQ1JJUFRJT046IHVucmVnaXN0ZXIgYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM0dyYWxsb2NNZW1vcnk6OnVucmVnaXN0ZXJCdWZmZXJzKCkKK3sKKyAgICBpbnQgZXJyID0gTk9fRVJST1I7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgTE9HRCgiRSAiLCBfX0ZVTkNUSU9OX18pOworCisgICAgZm9yICh1aW50MzJfdCBjbnQgPSBtU3RhcnRJZHg7IGNudCA8IE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUzsgY250KyspIHsKKyAgICAgICAgaWYgKDAgPT0gbU1lbUluZm9bY250XS5oYW5kbGUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGVyciA9IHVucmVnaXN0ZXJCdWZmZXJMb2NrZWQoY250KTsKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IGVycikgeworICAgICAgICAgICAgTE9HRSgiRXJyb3IgdW5yZWdpc3RlcmluZyBidWZmZXIgJWQgZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgICAgICAgY250LCBlcnIpOworICAgICAgICB9CisgICAgfQorICAgIG1CdWZmZXJDb3VudCA9IDA7CisgICAgTE9HRCgiWCAiLF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbWFya0ZyYW1lTnVtYmVyCisgKgorICogREVTQ1JJUFRJT046IFdlIHVzZSB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIHJlcXVlc3QgY2FsbCBwYXRoIHRvIG1hcmsgdGhlCisgKiAgICAgICAgICAgICAgYnVmZmVycyB3aXRoIHRoZSBmcmFtZSBudW1iZXIgdGhleSBhcmUgaW50ZW5kZWQgZm9yIHRoaXMgaW5mbworICogICAgICAgICAgICAgIGlzIHVzZWQgbGF0ZXIgd2hlbiBnaXZpbmcgb3V0IGNhbGxiYWNrICYgaXQgaXMgZHV0eSBvZiBQUCB0bworICogICAgICAgICAgICAgIGVuc3VyZSB0aGF0IGRhdGEgZm9yIHRoYXQgcGFydGljdWxhciBmcmFtZU51bWJlci9SZXF1ZXN0IGlzCisgKiAgICAgICAgICAgICAgd3JpdHRlbiB0byB0aGlzIGJ1ZmZlci4KKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGluZGV4IG9mIHRoZSBidWZmZXIKKyAqICAgQGZyYW1lIyAgOiBGcmFtZSBudW1iZXIgZnJvbSB0aGUgZnJhbWV3b3JrCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM0dyYWxsb2NNZW1vcnk6Om1hcmtGcmFtZU51bWJlcih1aW50MzJfdCBpbmRleCwgdWludDMyX3QgZnJhbWVOdW1iZXIpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgaWYgKGluZGV4ID49IE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUykgeworICAgICAgICBMT0dFKCJJbmRleCBvdXQgb2YgYm91bmRzIik7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorICAgIGlmIChpbmRleCA8IG1TdGFydElkeCkgeworICAgICAgICBMT0dFKCJidWZmZXIgaW5kZXggJWQgbGVzcyB0aGFuIHN0YXJ0aW5nIGluZGV4ICVkIiwKKyAgICAgICAgICAgICAgICAgaW5kZXgsIG1TdGFydElkeCk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgaWYgKDAgPT0gbU1lbUluZm9baW5kZXhdLmhhbmRsZSkgeworICAgICAgICBMT0dFKCJCdWZmZXIgYXQgJWQgbm90IHJlZ2lzdGVyZWQiLCBpbmRleCk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgbUN1cnJlbnRGcmFtZU51bWJlcnNbaW5kZXhdID0gKGludDMyX3QpZnJhbWVOdW1iZXI7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RnJhbWVOdW1iZXIKKyAqCisgKiBERVNDUklQVElPTjogV2UgdXNlIHRoaXMgdG8gZmV0Y2ggdGhlIGZyYW1lTnVtYmVyIGZvciB0aGUgcmVxdWVzdCB3aXRoIHdoaWNoCisgKiAgICAgICAgICAgICAgdGhpcyBidWZmZXIgd2FzIGdpdmVuIHRvIEhBTAorICoKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgZnJhbWVOdW1iZXIKKyAqICAgICAgICAgICAgICBwb3NpdGl2ZS96ZXJvICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbmVnYXRpdmUgZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzR3JhbGxvY01lbW9yeTo6Z2V0RnJhbWVOdW1iZXIodWludDMyX3QgaW5kZXgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgaWYgKGluZGV4ID49IE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUykgeworICAgICAgICBMT0dFKCJJbmRleCBvdXQgb2YgYm91bmRzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGluZGV4IDwgbVN0YXJ0SWR4KSB7CisgICAgICAgIExPR0UoImJ1ZmZlciBpbmRleCAlZCBsZXNzIHRoYW4gc3RhcnRpbmcgaW5kZXggJWQiLAorICAgICAgICAgICAgICAgICBpbmRleCwgbVN0YXJ0SWR4KTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBpZiAoMCA9PSBtTWVtSW5mb1tpbmRleF0uaGFuZGxlKSB7CisgICAgICAgIExPR0UoIkJ1ZmZlciBhdCAlZCBub3QgcmVnaXN0ZXJlZCIsIGluZGV4KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBtQ3VycmVudEZyYW1lTnVtYmVyc1tpbmRleF07Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0QnVmZmVySW5kZXgKKyAqCisgKiBERVNDUklQVElPTjogV2UgdXNlIHRoaXMgdG8gZmV0Y2ggdGhlIGJ1ZmZlciBpbmRleCBmb3IgdGhlIHJlcXVlc3Qgd2l0aAorICogICAgICAgICAgICAgIGEgcGFydGljdWxhciBmcmFtZSBudW1iZXIKKyAqCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmcmFtZU51bWJlciAgOiBmcmFtZSBudW1iZXIgb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IGJ1ZmZlciBpbmRleAorICogICAgICAgICAgICAgIG5lZ2F0aXZlIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM0dyYWxsb2NNZW1vcnk6OmdldEJ1ZmZlckluZGV4KHVpbnQzMl90IGZyYW1lTnVtYmVyKQoreworICAgIGZvciAodWludDMyX3QgaW5kZXggPSBtU3RhcnRJZHg7CisgICAgICAgICAgICBpbmRleCA8IE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUzsgaW5kZXgrKykgeworICAgICAgICBpZiAobU1lbUluZm9baW5kZXhdLmhhbmRsZSAmJgorICAgICAgICAgICAgICAgIG1DdXJyZW50RnJhbWVOdW1iZXJzW2luZGV4XSA9PSAoaW50MzJfdClmcmFtZU51bWJlcikKKyAgICAgICAgICAgIHJldHVybiAoaW50MzJfdClpbmRleDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhY2hlT3BzCisgKgorICogREVTQ1JJUFRJT046IGlvbiByZWxhdGVkIG1lbW9yeSBjYWNoZSBvcGVyYXRpb25zCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgdGhlIGJ1ZmZlcgorICogICBAY21kICAgICA6IGNhY2hlIG9wcyBjb21tYW5kCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEzR3JhbGxvY01lbW9yeTo6Y2FjaGVPcHModWludDMyX3QgaW5kZXgsIHVuc2lnbmVkIGludCBjbWQpCit7CisgICAgaWYgKGluZGV4ID49IE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUykgeworICAgICAgICBMT0dFKCJJbmRleCBvdXQgb2YgYm91bmRzIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGluZGV4IDwgbVN0YXJ0SWR4KSB7CisgICAgICAgIExPR0UoImJ1ZmZlciBpbmRleCAlZCBsZXNzIHRoYW4gc3RhcnRpbmcgaW5kZXggJWQiLAorICAgICAgICAgICAgICAgICBpbmRleCwgbVN0YXJ0SWR4KTsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICByZXR1cm4gY2FjaGVPcHNJbnRlcm5hbChpbmRleCwgY21kLCBtUHRyW2luZGV4XSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TWF0Y2hCdWZJbmRleAorICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBidWZmZXIgaW5kZXggYnkgb2JqZWN0IHB0cgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb3BhcXVlICA6IG9wYXF1ZSBwdHIKKyAqCisgKiBSRVRVUk4gICAgIDogYnVmZmVyIGluZGV4IGlmIG1hdGNoIGZvdW5kLAorICogICAgICAgICAgICAgIC0xIGlmIGZhaWxlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTNHcmFsbG9jTWVtb3J5OjpnZXRNYXRjaEJ1ZkluZGV4KHZvaWQgKm9iamVjdCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBpbnQgaW5kZXggPSAtMTsKKyAgICBidWZmZXJfaGFuZGxlX3QgKmtleSA9IChidWZmZXJfaGFuZGxlX3QqKSBvYmplY3Q7CisgICAgaWYgKCFrZXkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgZm9yICh1aW50MzJfdCBpID0gbVN0YXJ0SWR4OyBpIDwgTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTOyBpKyspIHsKKyAgICAgICAgaWYgKG1CdWZmZXJIYW5kbGVbaV0gPT0ga2V5KSB7CisgICAgICAgICAgICBpbmRleCA9IChpbnQpaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGluZGV4OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEZyZWVJbmRleExvY2tlZAorICoKKyAqIERFU0NSSVBUSU9OOiBGaW5kIGZyZWUgaW5kZXggc2xvdC4gTm90ZSAnbUxvY2snIG5lZWRzIHRvIGJlIGFjcXVpcmVkCisgKiAgICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogZnJlZSBidWZmZXIgaW5kZXggaWYgZm91bmQsCisgKiAgICAgICAgICAgICAgLTEgaWYgZmFpbGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM0dyYWxsb2NNZW1vcnk6OmdldEZyZWVJbmRleExvY2tlZCgpCit7CisgICAgaW50IGluZGV4ID0gLTE7CisKKyAgICBpZiAobUJ1ZmZlckNvdW50ID49IChNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVMgLSAxKSkgeworICAgICAgICBMT0dFKCJOdW1iZXIgb2YgYnVmZmVycyAlZCBncmVhdGVyIHRoYW4gd2hhdCdzIHN1cHBvcnRlZCAlZCIsCisgICAgICAgICAgICAgbUJ1ZmZlckNvdW50LCBNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVMpOworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IG1TdGFydElkeDsgaSA8IE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUzsgaSsrKSB7CisgICAgICAgIGlmICgwID09IG1NZW1JbmZvW2ldLmhhbmRsZSkgeworICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0UHRyTG9ja2VkCisgKgorICogREVTQ1JJUFRJT046IFJldHVybiBidWZmZXIgcG9pbnRlci4gUGxlYXNlIG5vdGUgJ21Mb2NrJyBtdXN0IGJlIGFjcXVpcmVkCisgKiAgICAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBidWZmZXIgcHRyCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgKlFDYW1lcmEzR3JhbGxvY01lbW9yeTo6Z2V0UHRyTG9ja2VkKHVpbnQzMl90IGluZGV4KQoreworICAgIGlmIChNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVMgPD0gaW5kZXgpIHsKKyAgICAgICAgTE9HRSgiaW5kZXggJWQgb3V0IG9mIGJvdW5kIFswLCAlZCkiLAorICAgICAgICAgICAgICAgICBpbmRleCwgTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpbmRleCA8IG1TdGFydElkeCkgeworICAgICAgICBMT0dFKCJidWZmZXIgaW5kZXggJWQgbGVzcyB0aGFuIHN0YXJ0aW5nIGluZGV4ICVkIiwKKyAgICAgICAgICAgICAgICAgaW5kZXgsIG1TdGFydElkeCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworCisgICAgaWYgKDAgPT0gbU1lbUluZm9baW5kZXhdLmhhbmRsZSkgeworICAgICAgICBMT0dFKCJCdWZmZXIgYXQgJWQgbm90IHJlZ2lzdGVyZWQiLCBpbmRleCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBtUHRyW2luZGV4XTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRQdHIKKyAqCisgKiBERVNDUklQVElPTjogUmV0dXJuIGJ1ZmZlciBwb2ludGVyLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGluZGV4IG9mIHRoZSBidWZmZXIKKyAqCisgKiBSRVRVUk4gICAgIDogYnVmZmVyIHB0cgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkICpRQ2FtZXJhM0dyYWxsb2NNZW1vcnk6OmdldFB0cih1aW50MzJfdCBpbmRleCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgcmV0dXJuIGdldFB0ckxvY2tlZChpbmRleCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0QnVmZmVySGFuZGxlCisgKgorICogREVTQ1JJUFRJT046IHJldHVybiBmcmFtZXdvcmsgcG9pbnRlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGluZGV4IG9mIHRoZSBidWZmZXIKKyAqCisgKiBSRVRVUk4gICAgIDogYnVmZmVyIHB0ciBpZiBtYXRjaCBmb3VuZAorICAgICAgICAgICAgICAgIE5VTEwgaWYgZmFpbGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgKlFDYW1lcmEzR3JhbGxvY01lbW9yeTo6Z2V0QnVmZmVySGFuZGxlKHVpbnQzMl90IGluZGV4KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGlmIChNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVMgPD0gaW5kZXgpIHsKKyAgICAgICAgTE9HRSgiaW5kZXggJWQgb3V0IG9mIGJvdW5kIFswLCAlZCkiLAorICAgICAgICAgICAgICAgICBpbmRleCwgTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChpbmRleCA8IG1TdGFydElkeCkgeworICAgICAgICBMT0dFKCJidWZmZXIgaW5kZXggJWQgbGVzcyB0aGFuIHN0YXJ0aW5nIGluZGV4ICVkIiwKKyAgICAgICAgICAgICAgICAgaW5kZXgsIG1TdGFydElkeCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICgwID09IG1NZW1JbmZvW2luZGV4XS5oYW5kbGUpIHsKKyAgICAgICAgTE9HRSgiQnVmZmVyIGF0ICVkIG5vdCByZWdpc3RlcmVkIiwgaW5kZXgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbUJ1ZmZlckhhbmRsZVtpbmRleF07Cit9Cit9OyAvL25hbWVzcGFjZSBxY2FtZXJhCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM01lbS5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNNZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGJjY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNNZW0uaApAQCAtMCwwICsxLDE1OCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIF9fUUNBTUVSQTNIV0lfTUVNX0hfXworI2RlZmluZSBfX1FDQU1FUkEzSFdJX01FTV9IX18KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhMy5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJtbV9jYW1lcmFfaW50ZXJmYWNlLmgiCit9CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgcWNhbWVyYSB7CisKKy8vIEJhc2UgY2xhc3MgZm9yIGFsbCBtZW1vcnkgdHlwZXMuIEFic3RyYWN0LgorY2xhc3MgUUNhbWVyYTNNZW1vcnkgeworCitwdWJsaWM6CisgICAgaW50IGNsZWFuQ2FjaGUodWludDMyX3QgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gY2FjaGVPcHMoaW5kZXgsIElPTl9JT0NfQ0xFQU5fQ0FDSEVTKTsKKyAgICB9CisgICAgaW50IGludmFsaWRhdGVDYWNoZSh1aW50MzJfdCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBjYWNoZU9wcyhpbmRleCwgSU9OX0lPQ19JTlZfQ0FDSEVTKTsKKyAgICB9CisgICAgaW50IGNsZWFuSW52YWxpZGF0ZUNhY2hlKHVpbnQzMl90IGluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlT3BzKGluZGV4LCBJT05fSU9DX0NMRUFOX0lOVl9DQUNIRVMpOworICAgIH0KKyAgICBpbnQgZ2V0RmQodWludDMyX3QgaW5kZXgpOworICAgIHNzaXplX3QgZ2V0U2l6ZSh1aW50MzJfdCBpbmRleCk7CisgICAgdWludDMyX3QgZ2V0Q250KCk7CisKKyAgICB2aXJ0dWFsIGludCBjYWNoZU9wcyh1aW50MzJfdCBpbmRleCwgdW5zaWduZWQgaW50IGNtZCkgPSAwOworICAgIHZpcnR1YWwgaW50IGdldE1hdGNoQnVmSW5kZXgodm9pZCAqb2JqZWN0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkICpnZXRQdHIodWludDMyX3QgaW5kZXgpID0gMDsKKworICAgIHZpcnR1YWwgaW50MzJfdCBtYXJrRnJhbWVOdW1iZXIodWludDMyX3QgaW5kZXgsIHVpbnQzMl90IGZyYW1lTnVtYmVyKSA9IDA7CisgICAgdmlydHVhbCBpbnQzMl90IGdldEZyYW1lTnVtYmVyKHVpbnQzMl90IGluZGV4KSA9IDA7CisgICAgdmlydHVhbCBpbnQzMl90IGdldEJ1ZmZlckluZGV4KHVpbnQzMl90IGZyYW1lTnVtYmVyKSA9IDA7CisKKyAgICBRQ2FtZXJhM01lbW9yeSgpOworICAgIHZpcnR1YWwgflFDYW1lcmEzTWVtb3J5KCk7CisKKyAgICBpbnQzMl90IGdldEJ1ZkRlZihjb25zdCBjYW1fZnJhbWVfbGVuX29mZnNldF90ICZvZmZzZXQsCisgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICZidWZEZWYsIHVpbnQzMl90IGluZGV4KTsKKworcHJvdGVjdGVkOgorICAgIHN0cnVjdCBRQ2FtZXJhM01lbUluZm8geworICAgICAgICBpbnQgZmQ7CisgICAgICAgIGludCBtYWluX2lvbl9mZDsKKyAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICB9OworCisgICAgaW50IGNhY2hlT3BzSW50ZXJuYWwodWludDMyX3QgaW5kZXgsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKnZhZGRyKTsKKyAgICB2aXJ0dWFsIHZvaWQgKmdldFB0ckxvY2tlZCh1aW50MzJfdCBpbmRleCkgPSAwOworCisgICAgdWludDMyX3QgbUJ1ZmZlckNvdW50OworICAgIHN0cnVjdCBRQ2FtZXJhM01lbUluZm8gbU1lbUluZm9bTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTXTsKKyAgICB2b2lkICptUHRyW01NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FU107CisgICAgaW50MzJfdCBtQ3VycmVudEZyYW1lTnVtYmVyc1tNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVNdOworICAgIE11dGV4IG1Mb2NrOworfTsKKworLy8gSW50ZXJuYWwgaGVhcCBtZW1vcnkgaXMgdXNlZCBmb3IgbWVtb3JpZXMgdXNlZCBpbnRlcm5hbGx5CisvLyBUaGV5IGFyZSBhbGxvY2F0ZWQgZnJvbSAvZGV2L2lvbi4gRXhhbXBsZXMgYXJlOiBjYXBhYmlsaXRpZXMsCisvLyBwYXJhbWV0ZXJzLCBtZXRhZGF0YSwgYW5kIGludGVybmFsIFlVViBkYXRhIGZvciBqcGVnIGVuY29kaW5nLgorY2xhc3MgUUNhbWVyYTNIZWFwTWVtb3J5IDogcHVibGljIFFDYW1lcmEzTWVtb3J5IHsKK3B1YmxpYzoKKyAgICBRQ2FtZXJhM0hlYXBNZW1vcnkodWludDMyX3QgbWF4Q250KTsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhM0hlYXBNZW1vcnkoKTsKKworICAgIGludCBhbGxvY2F0ZShzaXplX3Qgc2l6ZSk7CisgICAgaW50IGFsbG9jYXRlT25lKHNpemVfdCBzaXplKTsKKyAgICB2b2lkIGRlYWxsb2NhdGUoKTsKKworICAgIHZpcnR1YWwgaW50IGNhY2hlT3BzKHVpbnQzMl90IGluZGV4LCB1bnNpZ25lZCBpbnQgY21kKTsKKyAgICB2aXJ0dWFsIGludCBnZXRNYXRjaEJ1ZkluZGV4KHZvaWQgKm9iamVjdCk7CisgICAgdmlydHVhbCB2b2lkICpnZXRQdHIodWludDMyX3QgaW5kZXgpOworCisgICAgdmlydHVhbCBpbnQzMl90IG1hcmtGcmFtZU51bWJlcih1aW50MzJfdCBpbmRleCwgdWludDMyX3QgZnJhbWVOdW1iZXIpOworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRGcmFtZU51bWJlcih1aW50MzJfdCBpbmRleCk7CisgICAgdmlydHVhbCBpbnQzMl90IGdldEJ1ZmZlckluZGV4KHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCAqZ2V0UHRyTG9ja2VkKHVpbnQzMl90IGluZGV4KTsKK3ByaXZhdGU6CisgICAgaW50IGFsbG9jT25lQnVmZmVyKHN0cnVjdCBRQ2FtZXJhM01lbUluZm8gJm1lbUluZm8sCisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaGVhcF9pZCwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgZGVhbGxvY09uZUJ1ZmZlcihzdHJ1Y3QgUUNhbWVyYTNNZW1JbmZvICZtZW1JbmZvKTsKKyAgICB1aW50MzJfdCBtTWF4Q250OworfTsKKworLy8gR3JhbGxvYyBNZW1vcnkgc2hhcmVkIHdpdGggZnJhbWV3b3JrcworY2xhc3MgUUNhbWVyYTNHcmFsbG9jTWVtb3J5IDogcHVibGljIFFDYW1lcmEzTWVtb3J5IHsKK3B1YmxpYzoKKyAgICBRQ2FtZXJhM0dyYWxsb2NNZW1vcnkodWludDMyX3Qgc3RhcnRJZHgpOworICAgIHZpcnR1YWwgflFDYW1lcmEzR3JhbGxvY01lbW9yeSgpOworCisgICAgaW50IHJlZ2lzdGVyQnVmZmVyKGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLCBjYW1fc3RyZWFtX3R5cGVfdCB0eXBlKTsKKyAgICBpbnQzMl90IHVucmVnaXN0ZXJCdWZmZXIoc2l6ZV90IGlkeCk7CisgICAgdm9pZCB1bnJlZ2lzdGVyQnVmZmVycygpOworICAgIHZpcnR1YWwgaW50IGNhY2hlT3BzKHVpbnQzMl90IGluZGV4LCB1bnNpZ25lZCBpbnQgY21kKTsKKyAgICB2aXJ0dWFsIGludCBnZXRNYXRjaEJ1ZkluZGV4KHZvaWQgKm9iamVjdCk7CisgICAgdmlydHVhbCB2b2lkICpnZXRQdHIodWludDMyX3QgaW5kZXgpOworCisgICAgdmlydHVhbCBpbnQzMl90IG1hcmtGcmFtZU51bWJlcih1aW50MzJfdCBpbmRleCwgdWludDMyX3QgZnJhbWVOdW1iZXIpOworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRGcmFtZU51bWJlcih1aW50MzJfdCBpbmRleCk7CisgICAgdmlydHVhbCBpbnQzMl90IGdldEJ1ZmZlckluZGV4KHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKKworICAgIHZvaWQgKmdldEJ1ZmZlckhhbmRsZSh1aW50MzJfdCBpbmRleCk7Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkICpnZXRQdHJMb2NrZWQodWludDMyX3QgaW5kZXgpOworcHJpdmF0ZToKKyAgICBpbnQzMl90IHVucmVnaXN0ZXJCdWZmZXJMb2NrZWQoc2l6ZV90IGlkeCk7CisgICAgaW50MzJfdCBnZXRGcmVlSW5kZXhMb2NrZWQoKTsKKyAgICBidWZmZXJfaGFuZGxlX3QgKm1CdWZmZXJIYW5kbGVbTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTXTsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9oYW5kbGVfdCAqbVByaXZhdGVIYW5kbGVbTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTXTsKKworICAgIHVpbnQzMl90IG1TdGFydElkeDsKK307Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1Bvc3RQcm9jLmNwcCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzUG9zdFByb2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NTM4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1Bvc3RQcm9jLmNwcApAQCAtMCwwICsxLDMxNDIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyogbWV0OgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKi8KKworI2RlZmluZSBMT0dfVEFHICJRQ2FtZXJhM1Bvc3RQcm9jIgorCisvLyBUbyByZW1vdmUKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIlFDYW1lcmEzQ2hhbm5lbC5oIgorI2luY2x1ZGUgIlFDYW1lcmEzSFdJLmgiCisjaW5jbHVkZSAiUUNhbWVyYTNQb3N0UHJvYy5oIgorI2luY2x1ZGUgIlFDYW1lcmEzU3RyZWFtLmgiCisjaW5jbHVkZSAiUUNhbWVyYVRyYWNlLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKK30KKworI2RlZmluZSBFTkFCTEVfTU9ERUxfSU5GT19FWElGCisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworc3RhdGljIGNvbnN0IGNoYXIgRXhpZkFzY2lpUHJlZml4W10gPQorICAgIHsgMHg0MSwgMHg1MywgMHg0MywgMHg0OSwgMHg0OSwgMHgwLCAweDAsIDB4MCB9OyAgICAgICAgICAvLyAiQVNDSUlcMFwwXDAiCisKK19fdW51c2VkCitzdGF0aWMgY29uc3QgY2hhciBFeGlmVW5kZWZpbmVkUHJlZml4W10gPQorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OyAgIC8vICJcMFwwXDBcMFwwXDBcMFwwIgorCisjZGVmaW5lIEVYSUZfQVNDSUlfUFJFRklYX1NJWkUgICAgICAgICAgIDggICAvLyhzaXplb2YoRXhpZkFzY2lpUHJlZml4KSkKKyNkZWZpbmUgRk9DQUxfTEVOR1RIX0RFQ0lNQUxfUFJFQ0lTSU9OICAgMTAwMAorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmEzUG9zdFByb2Nlc3NvcgorICoKKyAqIERFU0NSSVBUSU9OOiBjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1fY3RybCA6IHB0ciB0byBIV0kgb2JqZWN0CisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNQb3N0UHJvY2Vzc29yOjpRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IoUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCogY2hfY3RybCkKKyAgICA6IG1fcGFyZW50KGNoX2N0cmwpLAorICAgICAgbUpwZWdDQihOVUxMKSwKKyAgICAgIG1KcGVnVXNlckRhdGEoTlVMTCksCisgICAgICBtSnBlZ0NsaWVudEhhbmRsZSgwKSwKKyAgICAgIG1KcGVnU2Vzc2lvbklkKDApLAorICAgICAgbV9iVGh1bWJuYWlsTmVlZGVkKFRSVUUpLAorICAgICAgbV9wUmVwcm9jQ2hhbm5lbChOVUxMKSwKKyAgICAgIG1faW5wdXRQUFEocmVsZWFzZVBQSW5wdXREYXRhLCB0aGlzKSwKKyAgICAgIG1faW5wdXRGV0tQUFEoTlVMTCwgdGhpcyksCisgICAgICBtX29uZ29pbmdQUFEocmVsZWFzZU9uZ29pbmdQUERhdGEsIHRoaXMpLAorICAgICAgbV9pbnB1dEpwZWdRKHJlbGVhc2VKcGVnRGF0YSwgdGhpcyksCisgICAgICBtX29uZ29pbmdKcGVnUShyZWxlYXNlSnBlZ0RhdGEsIHRoaXMpLAorICAgICAgbV9pbnB1dE1ldGFRKHJlbGVhc2VNZXRhZGF0YSwgdGhpcyksCisgICAgICBtX2pwZWdTZXR0aW5nc1EoTlVMTCwgdGhpcykKK3sKKyAgICBtZW1zZXQoJm1KcGVnSGFuZGxlLCAwLCBzaXplb2YobUpwZWdIYW5kbGUpKTsKKyAgICBtZW1zZXQoJm1KcGVnTWV0YWRhdGEsIDAsIHNpemVvZihtSnBlZ01ldGFkYXRhKSk7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtUmVwcm9jSm9iTG9jaywgTlVMTCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogflFDYW1lcmEzUG9zdFByb2Nlc3NvcgorICoKKyAqIERFU0NSSVBUSU9OOiBkZWNvbnN0cnVjdG9yIG9mIFFDYW1lcmEzUG9zdFByb2Nlc3Nvci4KKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEzUG9zdFByb2Nlc3Nvcjo6flFDYW1lcmEzUG9zdFByb2Nlc3NvcigpCit7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtUmVwcm9jSm9iTG9jayk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW5pdAorICoKKyAqIERFU0NSSVBUSU9OOiBpbml0aWFsaXphdGlvbiBvZiBwb3N0cHJvY2Vzc29yCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtZW1vcnkgICAgICAgICAgICAgIDogb3V0cHV0IGJ1ZmZlciBtZW1vcnkKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUG9zdFByb2Nlc3Nvcjo6aW5pdChRQ2FtZXJhM1N0cmVhbU1lbSAqbWVtb3J5KQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgbU91dHB1dE1lbSA9IG1lbW9yeTsKKyAgICBtX2RhdGFQcm9jVGgubGF1bmNoKGRhdGFQcm9jZXNzUm91dGluZSwgdGhpcyk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGVpbml0CisgKgorICogREVTQ1JJUFRJT046IGRlLWluaXRpYWxpemF0aW9uIG9mIHBvc3Rwcm9jZXNzb3IKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNQb3N0UHJvY2Vzc29yOjpkZWluaXQoKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIG1fZGF0YVByb2NUaC5leGl0KCk7CisKKyAgICBpZiAobV9wUmVwcm9jQ2hhbm5lbCAhPSBOVUxMKSB7CisgICAgICAgIG1fcFJlcHJvY0NoYW5uZWwtPnN0b3AoKTsKKyAgICAgICAgZGVsZXRlIG1fcFJlcHJvY0NoYW5uZWw7CisgICAgICAgIG1fcFJlcHJvY0NoYW5uZWwgPSBOVUxMOworICAgIH0KKworICAgIGlmKG1KcGVnQ2xpZW50SGFuZGxlID4gMCkgeworICAgICAgICByYyA9IG1KcGVnSGFuZGxlLmNsb3NlKG1KcGVnQ2xpZW50SGFuZGxlKTsKKyAgICAgICAgTE9HSCgiSnBlZyBjbG9zZWQsIHJjID0gJWQsIG1KcGVnQ2xpZW50SGFuZGxlID0gJXgiLAorICAgICAgICAgICAgICAgcmMsIG1KcGVnQ2xpZW50SGFuZGxlKTsKKyAgICAgICAgbUpwZWdDbGllbnRIYW5kbGUgPSAwOworICAgICAgICBtZW1zZXQoJm1KcGVnSGFuZGxlLCAwLCBzaXplb2YobUpwZWdIYW5kbGUpKTsKKyAgICB9CisKKyAgICBtT3V0cHV0TWVtID0gTlVMTDsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW5pdEpwZWcKKyAqCisgKiBERVNDUklQVElPTjogaW5pdGlhbGl6YXRpb24gb2YganBlZyB0aHJvdWdoIHBvc3Rwcm9jZXNzb3IKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGpwZWdfY2IgICAgICA6IGNhbGxiYWNrIHRvIGhhbmRsZSBqcGVnIGV2ZW50IGZyb20gbW0tY2FtZXJhLWludGVyZmFjZQorICogICBAbWF4X3BpY19kaW0gIDogbWF4IHBpY3R1cmUgZGltZW5zaW9ucworICogICBAdXNlcl9kYXRhICAgIDogdXNlciBkYXRhIHB0ciBmb3IganBlZyBjYWxsYmFjaworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNQb3N0UHJvY2Vzc29yOjppbml0SnBlZyhqcGVnX2VuY29kZV9jYWxsYmFja190IGpwZWdfY2IsCisgICAgICAgIGNhbV9kaW1lbnNpb25fdCogbWF4X3BpY19kaW0sCisgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIG1KcGVnQ0IgPSBqcGVnX2NiOworICAgIG1KcGVnVXNlckRhdGEgPSB1c2VyX2RhdGE7CisgICAgbW1fZGltZW5zaW9uIG1heF9zaXplOworCisgICAgaWYgKCgwID4gbWF4X3BpY19kaW0tPndpZHRoKSB8fCAoMCA+IG1heF9waWNfZGltLT5oZWlnaHQpKSB7CisgICAgICAgIExPR0UoIk5lZ2F0aXZlIGRpbWVuc2lvbiAlZHglZCIsCisgICAgICAgICAgICAgICAgbWF4X3BpY19kaW0tPndpZHRoLCBtYXhfcGljX2RpbS0+aGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBzZXQgbWF4IHBpYyBzaXplCisgICAgbWVtc2V0KCZtYXhfc2l6ZSwgMCwgc2l6ZW9mKG1tX2RpbWVuc2lvbikpOworICAgIG1heF9zaXplLncgPSAgbWF4X3BpY19kaW0tPndpZHRoOworICAgIG1heF9zaXplLmggPSAgbWF4X3BpY19kaW0tPmhlaWdodDsKKworICAgIC8vIFBhc3MgT1RQIGNhbGlicmF0aW9uIGRhdGEgdG8gSlBFRworICAgIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UqIGhhbF9vYmogPSAoUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSopbV9wYXJlbnQtPm1Vc2VyRGF0YTsKKyAgICBtSnBlZ01ldGFkYXRhLmRlZmF1bHRfc2Vuc29yX2ZsaXAgPSBGTElQX05PTkU7CisgICAgbUpwZWdNZXRhZGF0YS5zZW5zb3JfbW91bnRfYW5nbGUgPSBoYWxfb2JqLT5nZXRTZW5zb3JNb3VudEFuZ2xlKCk7CisgICAgbWVtY3B5KCZtSnBlZ01ldGFkYXRhLm90cF9jYWxpYnJhdGlvbl9kYXRhLAorICAgICAgICAgICAgaGFsX29iai0+Z2V0UmVsYXRlZENhbGlicmF0aW9uRGF0YSgpLAorICAgICAgICAgICAgc2l6ZW9mKGNhbV9yZWxhdGVkX3N5c3RlbV9jYWxpYnJhdGlvbl9kYXRhX3QpKTsKKyAgICBtSnBlZ0NsaWVudEhhbmRsZSA9IGpwZWdfb3BlbigmbUpwZWdIYW5kbGUsIE5VTEwsIG1heF9zaXplLCAmbUpwZWdNZXRhZGF0YSk7CisKKyAgICBpZiAoIW1KcGVnQ2xpZW50SGFuZGxlKSB7CisgICAgICAgIExPR0UoImpwZWdfb3BlbiBkaWQgbm90IHdvcmsiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdGFydAorICoKKyAqIERFU0NSSVBUSU9OOiBzdGFydCBwb3N0cHJvY2Vzc29yLiBEYXRhIHByb2Nlc3MgdGhyZWFkIGFuZCBkYXRhIG5vdGlmeSB0aHJlYWQKKyAqICAgICAgICAgICAgICB3aWxsIGJlIGxhdW5jaGVkLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY29uZmlnICAgICAgICA6IHJlcHJvY2VzcyBjb25maWd1cmF0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqCisgKiBOT1RFICAgICAgIDogaWYgYW55IHJlcHJvY2VzcyBpcyBuZWVkZWQsIGEgcmVwcm9jZXNzIGNoYW5uZWwvc3RyZWFtCisgKiAgICAgICAgICAgICAgd2lsbCBiZSBzdGFydGVkLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUG9zdFByb2Nlc3Nvcjo6c3RhcnQoY29uc3QgcmVwcm9jZXNzX2NvbmZpZ190ICZjb25maWcpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UqIGhhbF9vYmogPSAoUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSopbV9wYXJlbnQtPm1Vc2VyRGF0YTsKKworICAgIGlmIChjb25maWcucmVwcm9jZXNzX3R5cGUgIT0gUkVQUk9DRVNTX1RZUEVfTk9ORSkgeworICAgICAgICBpZiAobV9wUmVwcm9jQ2hhbm5lbCAhPSBOVUxMKSB7CisgICAgICAgICAgICBtX3BSZXByb2NDaGFubmVsLT5zdG9wKCk7CisgICAgICAgICAgICBkZWxldGUgbV9wUmVwcm9jQ2hhbm5lbDsKKyAgICAgICAgICAgIG1fcFJlcHJvY0NoYW5uZWwgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLy8gaWYgcmVwcm9jZXNzIGlzIG5lZWRlZCwgc3RhcnQgcmVwcm9jZXNzIGNoYW5uZWwKKyAgICAgICAgTE9HRCgiU2V0dGluZyBpbnB1dCBjaGFubmVsIGFzIHBJbnB1dENoYW5uZWwiKTsKKyAgICAgICAgbV9wUmVwcm9jQ2hhbm5lbCA9IGhhbF9vYmotPmFkZE9mZmxpbmVSZXByb2NDaGFubmVsKGNvbmZpZywgbV9wYXJlbnQpOworICAgICAgICBpZiAobV9wUmVwcm9jQ2hhbm5lbCA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJjYW5ub3QgYWRkIHJlcHJvY2VzcyBjaGFubmVsIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvKnN0YXJ0IHRoZSByZXByb2Nlc3MgY2hhbm5lbCBvbmx5IGlmIGJ1ZmZlcnMgYXJlIGFscmVhZHkgYWxsb2NhdGVkLCB0aHVzCisgICAgICAgICAgb25seSBzdGFydCBpdCBpbiBhbiBpbnRlcm1lZGlhdGUgcmVwcm9jZXNzIHR5cGUsIGRlZmVyIGl0IGZvciBvdGhlcnMqLworICAgICAgICBpZiAoY29uZmlnLnJlcHJvY2Vzc190eXBlID09IFJFUFJPQ0VTU19UWVBFX0pQRUcpIHsKKyAgICAgICAgICAgIHJjID0gbV9wUmVwcm9jQ2hhbm5lbC0+c3RhcnQoKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiY2Fubm90IHN0YXJ0IHJlcHJvY2VzcyBjaGFubmVsIik7CisgICAgICAgICAgICAgICAgZGVsZXRlIG1fcFJlcHJvY0NoYW5uZWw7CisgICAgICAgICAgICAgICAgbV9wUmVwcm9jQ2hhbm5lbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1fZGF0YVByb2NUaC5zZW5kQ21kKENBTUVSQV9DTURfVFlQRV9TVEFSVF9EQVRBX1BST0MsIFRSVUUsIEZBTFNFKTsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBmbHVzaAorICoKKyAqIERFU0NSSVBUSU9OOiBzdG9wIG9uZ29pbmcgcG9zdHByb2Nlc3MgYW5kIGpwZWcgam9icworICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNQb3N0UHJvY2Vzc29yOjpmbHVzaCgpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCAqanBlZ19qb2IgPQorICAgICAgICAgICAgKHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCAqKW1fb25nb2luZ0pwZWdRLmRlcXVldWUoKTsKKyAgICB3aGlsZSAoanBlZ19qb2IgIT0gTlVMTCkgeworICAgICAgICByYyA9IG1KcGVnSGFuZGxlLmFib3J0X2pvYihqcGVnX2pvYi0+am9iSWQpOworICAgICAgICByZWxlYXNlSnBlZ0pvYkRhdGEoanBlZ19qb2IpOworICAgICAgICBmcmVlKGpwZWdfam9iKTsKKworICAgICAgICBqcGVnX2pvYiA9IChxY2FtZXJhX2hhbDNfanBlZ19kYXRhX3QgKiltX29uZ29pbmdKcGVnUS5kZXF1ZXVlKCk7CisgICAgfQorICAgIHJjID0gcmVsZWFzZU9mZmxpbmVCdWZmZXJzKHRydWUpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdG9wCisgKgorICogREVTQ1JJUFRJT046IHN0b3AgcG9zdHByb2Nlc3Nvci4gRGF0YSBwcm9jZXNzIGFuZCBub3RpZnkgdGhyZWFkIHdpbGwgYmUgc3RvcHBlZC4KKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKgorICogTk9URSAgICAgICA6IHJlcHJvY2VzcyBjaGFubmVsIHdpbGwgYmUgc3RvcHBlZCBhbmQgZGVsZXRlZCBpZiB0aGVyZSBpcyBhbnkKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OnN0b3AoKQoreworICAgIG1fZGF0YVByb2NUaC5zZW5kQ21kKENBTUVSQV9DTURfVFlQRV9TVE9QX0RBVEFfUFJPQywgVFJVRSwgVFJVRSk7CisKKyAgICBpZiAobV9wUmVwcm9jQ2hhbm5lbCAhPSBOVUxMKSB7CisgICAgICAgIG1fcFJlcHJvY0NoYW5uZWwtPnN0b3AoKTsKKyAgICAgICAgZGVsZXRlIG1fcFJlcHJvY0NoYW5uZWw7CisgICAgICAgIG1fcFJlcHJvY0NoYW5uZWwgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRGV0tKcGVnRW5jb2RlQ29uZmlnCisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIHByZXBhcmUgZW5jb2Rpbmcgam9iIGluZm9ybWF0aW9uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBlbmNvZGVfcGFybSAgIDogcGFyYW0gdG8gYmUgZmlsbGVkIHdpdGggZW5jb2RpbmcgY29uZmlndXJhdGlvbgorICogICBAZnJhbWUgICAgICAgICA6IGZyYW1ld29yayBpbnB1dCBidWZmZXIKKyAqICAgQGpwZWdfc2V0dGluZ3MgOiBqcGVnIHNldHRpbmdzIHRvIGJlIGFwcGxpZWQgZm9yIGVuY29kaW5nCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OmdldEZXS0pwZWdFbmNvZGVDb25maWcoCisgICAgICAgIG1tX2pwZWdfZW5jb2RlX3BhcmFtc190JiBlbmNvZGVfcGFybSwKKyAgICAgICAgcWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICpmcmFtZSwKKyAgICAgICAganBlZ19zZXR0aW5nc190ICpqcGVnX3NldHRpbmdzKQoreworICAgIExPR0QoIkUiKTsKKyAgICBpbnQzMl90IHJldCA9IE5PX0VSUk9SOworCisgICAgaWYgKChOVUxMID09IGZyYW1lKSB8fCAoTlVMTCA9PSBqcGVnX3NldHRpbmdzKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNzaXplX3QgYnVmU2l6ZSA9IG1PdXRwdXRNZW0tPmdldFNpemUoanBlZ19zZXR0aW5ncy0+b3V0X2J1Zl9pbmRleCk7CisgICAgaWYgKEJBRF9JTkRFWCA9PSBidWZTaXplKSB7CisgICAgICAgIExPR0UoImNhbm5vdCByZXRyaWV2ZSBidWZmZXIgc2l6ZSBmb3IgYnVmZmVyICV1IiwKKyAgICAgICAgICAgICAgICBqcGVnX3NldHRpbmdzLT5vdXRfYnVmX2luZGV4KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBlbmNvZGVfcGFybS5qcGVnX2NiID0gbUpwZWdDQjsKKyAgICBlbmNvZGVfcGFybS51c2VyZGF0YSA9IG1KcGVnVXNlckRhdGE7CisKKyAgICBpZiAoanBlZ19zZXR0aW5ncy0+dGh1bWJuYWlsX3NpemUud2lkdGggPiAwICYmCisgICAgICAgICAgICBqcGVnX3NldHRpbmdzLT50aHVtYm5haWxfc2l6ZS5oZWlnaHQgPiAwKQorICAgICAgICBtX2JUaHVtYm5haWxOZWVkZWQgPSBUUlVFOworICAgIGVsc2UKKyAgICAgICAgbV9iVGh1bWJuYWlsTmVlZGVkID0gRkFMU0U7CisgICAgZW5jb2RlX3Bhcm0uZW5jb2RlX3RodW1ibmFpbCA9IG1fYlRodW1ibmFpbE5lZWRlZDsKKworICAgIC8vIGdldCBjb2xvciBmb3JtYXQKKyAgICBjYW1fZm9ybWF0X3QgaW1nX2ZtdCA9IGZyYW1lLT5yZXByb2NfY29uZmlnLnN0cmVhbV9mb3JtYXQ7CisgICAgZW5jb2RlX3Bhcm0uY29sb3JfZm9ybWF0ID0gZ2V0Q29sb3JmbXRGcm9tSW1nRm10KGltZ19mbXQpOworCisgICAgLy8gZ2V0IGpwZWcgcXVhbGl0eQorICAgIGVuY29kZV9wYXJtLnF1YWxpdHkgPSBqcGVnX3NldHRpbmdzLT5qcGVnX3F1YWxpdHk7CisgICAgaWYgKGVuY29kZV9wYXJtLnF1YWxpdHkgPD0gMCkgeworICAgICAgICBlbmNvZGVfcGFybS5xdWFsaXR5ID0gODU7CisgICAgfQorCisgICAgLy8gZ2V0IGpwZWcgdGh1bWJuYWlsIHF1YWxpdHkKKyAgICBlbmNvZGVfcGFybS50aHVtYl9xdWFsaXR5ID0ganBlZ19zZXR0aW5ncy0+anBlZ190aHVtYl9xdWFsaXR5OworCisgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCBtYWluX29mZnNldCA9CisgICAgICAgICAgICBmcmFtZS0+cmVwcm9jX2NvbmZpZy5pbnB1dF9zdHJlYW1fcGxhbmVfaW5mby5wbGFuZV9pbmZvOworCisgICAgZW5jb2RlX3Bhcm0ubnVtX3NyY19idWZzID0gMTsKKyAgICBlbmNvZGVfcGFybS5zcmNfbWFpbl9idWZbMF0uaW5kZXggPSAwOworICAgIGVuY29kZV9wYXJtLnNyY19tYWluX2J1ZlswXS5idWZfc2l6ZSA9IGZyYW1lLT5pbnB1dF9idWZmZXIuZnJhbWVfbGVuOworICAgIGVuY29kZV9wYXJtLnNyY19tYWluX2J1ZlswXS5idWZfdmFkZHIgPSAodWludDhfdCAqKSBmcmFtZS0+aW5wdXRfYnVmZmVyLmJ1ZmZlcjsKKyAgICBlbmNvZGVfcGFybS5zcmNfbWFpbl9idWZbMF0uZmQgPSBmcmFtZS0+aW5wdXRfYnVmZmVyLmZkOworICAgIGVuY29kZV9wYXJtLnNyY19tYWluX2J1ZlswXS5mb3JtYXQgPSBNTV9KUEVHX0ZNVF9ZVVY7CisgICAgZW5jb2RlX3Bhcm0uc3JjX21haW5fYnVmWzBdLm9mZnNldCA9IG1haW5fb2Zmc2V0OworCisgICAgLy9QYXNzIGlucHV0IHRodW1ibmFpbCBidWZmZXIgaW5mbyB0byBlbmNvZGVyLgorICAgIC8vTm90ZTogVXNlIG1haW4gYnVmZmVyIHRvIGVuY29kZSB0aHVtYm5haWwKKyAgICBpZiAobV9iVGh1bWJuYWlsTmVlZGVkID09IFRSVUUpIHsKKyAgICAgICAgZW5jb2RlX3Bhcm0ubnVtX3RtYl9idWZzID0gMTsKKyAgICAgICAgZW5jb2RlX3Bhcm0uc3JjX3RodW1iX2J1ZlswXSA9IGVuY29kZV9wYXJtLnNyY19tYWluX2J1ZlswXTsKKyAgICB9CisKKyAgICAvL1Bhc3Mgb3V0cHV0IGpwZWcgYnVmZmVyIGluZm8gdG8gZW5jb2Rlci4KKyAgICAvL21PdXRwdXRNZW0gaXMgYWxsb2NhdGVkIGJ5IGZyYW1ld29yay4KKyAgICBlbmNvZGVfcGFybS5udW1fZHN0X2J1ZnMgPSAxOworICAgIGVuY29kZV9wYXJtLmRlc3RfYnVmWzBdLmluZGV4ID0gMDsKKyAgICBlbmNvZGVfcGFybS5kZXN0X2J1ZlswXS5idWZfc2l6ZSA9IChzaXplX3QpYnVmU2l6ZTsKKyAgICBlbmNvZGVfcGFybS5kZXN0X2J1ZlswXS5idWZfdmFkZHIgPSAodWludDhfdCAqKW1PdXRwdXRNZW0tPmdldFB0cigKKyAgICAgICAgICAgIGpwZWdfc2V0dGluZ3MtPm91dF9idWZfaW5kZXgpOworICAgIGVuY29kZV9wYXJtLmRlc3RfYnVmWzBdLmZkID0gbU91dHB1dE1lbS0+Z2V0RmQoCisgICAgICAgICAgICBqcGVnX3NldHRpbmdzLT5vdXRfYnVmX2luZGV4KTsKKyAgICBlbmNvZGVfcGFybS5kZXN0X2J1ZlswXS5mb3JtYXQgPSBNTV9KUEVHX0ZNVF9ZVVY7CisgICAgZW5jb2RlX3Bhcm0uZGVzdF9idWZbMF0ub2Zmc2V0ID0gbWFpbl9vZmZzZXQ7CisKKyAgICBMT0dEKCJYIik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgTE9HRCgiWCB3aXRoIGVycm9yICVkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEpwZWdFbmNvZGVDb25maWcKKyAqCisgKiBERVNDUklQVElPTjogZnVuY3Rpb24gdG8gcHJlcGFyZSBlbmNvZGluZyBqb2IgaW5mb3JtYXRpb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGVuY29kZV9wYXJtICAgOiBwYXJhbSB0byBiZSBmaWxsZWQgd2l0aCBlbmNvZGluZyBjb25maWd1cmF0aW9uCisgKiAgICNtYWluX3N0cmVhbSAgIDogc3RyZWFtIG9iamVjdCB3aGVyZSB0aGUgaW5wdXQgYnVmZmVyIGNvbWVzIGZyb20KKyAqICAgQGpwZWdfc2V0dGluZ3MgOiBqcGVnIHNldHRpbmdzIHRvIGJlIGFwcGxpZWQgZm9yIGVuY29kaW5nCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OmdldEpwZWdFbmNvZGVDb25maWcoCisgICAgICAgICAgICAgICAgbW1fanBlZ19lbmNvZGVfcGFyYW1zX3QmIGVuY29kZV9wYXJtLAorICAgICAgICAgICAgICAgIFFDYW1lcmEzU3RyZWFtICptYWluX3N0cmVhbSwKKyAgICAgICAgICAgICAgICBqcGVnX3NldHRpbmdzX3QgKmpwZWdfc2V0dGluZ3MpCit7CisgICAgTE9HRCgiRSIpOworICAgIGludDMyX3QgcmV0ID0gTk9fRVJST1I7CisgICAgc3NpemVfdCBidWZTaXplID0gMDsKKworICAgIGVuY29kZV9wYXJtLmpwZWdfY2IgPSBtSnBlZ0NCOworICAgIGVuY29kZV9wYXJtLnVzZXJkYXRhID0gbUpwZWdVc2VyRGF0YTsKKworICAgIGlmIChqcGVnX3NldHRpbmdzLT50aHVtYm5haWxfc2l6ZS53aWR0aCA+IDAgJiYKKyAgICAgICAgICAgIGpwZWdfc2V0dGluZ3MtPnRodW1ibmFpbF9zaXplLmhlaWdodCA+IDApCisgICAgICAgIG1fYlRodW1ibmFpbE5lZWRlZCA9IFRSVUU7CisgICAgZWxzZQorICAgICAgICBtX2JUaHVtYm5haWxOZWVkZWQgPSBGQUxTRTsKKyAgICBlbmNvZGVfcGFybS5lbmNvZGVfdGh1bWJuYWlsID0gbV9iVGh1bWJuYWlsTmVlZGVkOworCisgICAgLy8gZ2V0IGNvbG9yIGZvcm1hdAorICAgIGNhbV9mb3JtYXRfdCBpbWdfZm10ID0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTI7ICAvL2RlZmF1bHQgdmFsdWUKKyAgICBtYWluX3N0cmVhbS0+Z2V0Rm9ybWF0KGltZ19mbXQpOworICAgIGVuY29kZV9wYXJtLmNvbG9yX2Zvcm1hdCA9IGdldENvbG9yZm10RnJvbUltZ0ZtdChpbWdfZm10KTsKKworICAgIC8vIGdldCBqcGVnIHF1YWxpdHkKKyAgICBlbmNvZGVfcGFybS5xdWFsaXR5ID0ganBlZ19zZXR0aW5ncy0+anBlZ19xdWFsaXR5OworICAgIGlmIChlbmNvZGVfcGFybS5xdWFsaXR5IDw9IDApIHsKKyAgICAgICAgZW5jb2RlX3Bhcm0ucXVhbGl0eSA9IDg1OworICAgIH0KKworICAgIC8vIGdldCBqcGVnIHRodW1ibmFpbCBxdWFsaXR5CisgICAgZW5jb2RlX3Bhcm0udGh1bWJfcXVhbGl0eSA9IGpwZWdfc2V0dGluZ3MtPmpwZWdfdGh1bWJfcXVhbGl0eTsKKworICAgIGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QgbWFpbl9vZmZzZXQ7CisgICAgbWVtc2V0KCZtYWluX29mZnNldCwgMCwgc2l6ZW9mKGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QpKTsKKyAgICBtYWluX3N0cmVhbS0+Z2V0RnJhbWVPZmZzZXQobWFpbl9vZmZzZXQpOworCisgICAgLy8gc3JjIGJ1ZiBjb25maWcKKyAgICAvL1Bhc3MgaW5wdXQgbWFpbiBpbWFnZSBidWZmZXIgaW5mbyB0byBlbmNvZGVyLgorICAgIFFDYW1lcmEzU3RyZWFtTWVtICpwU3RyZWFtTWVtID0gbWFpbl9zdHJlYW0tPmdldFN0cmVhbUJ1ZnMoKTsKKyAgICBpZiAocFN0cmVhbU1lbSA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoImNhbm5vdCBnZXQgc3RyZWFtIGJ1ZnMgZnJvbSBtYWluIHN0cmVhbSIpOworICAgICAgICByZXQgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgfQorICAgIGVuY29kZV9wYXJtLm51bV9zcmNfYnVmcyA9IE1JTihwU3RyZWFtTWVtLT5nZXRDbnQoKSwgTU1fSlBFR19NQVhfQlVGKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW5jb2RlX3Bhcm0ubnVtX3NyY19idWZzOyBpKyspIHsKKyAgICAgICAgaWYgKHBTdHJlYW1NZW0gIT0gTlVMTCkgeworICAgICAgICAgICAgZW5jb2RlX3Bhcm0uc3JjX21haW5fYnVmW2ldLmluZGV4ID0gaTsKKyAgICAgICAgICAgIGJ1ZlNpemUgPSBwU3RyZWFtTWVtLT5nZXRTaXplKGkpOworICAgICAgICAgICAgaWYgKEJBRF9JTkRFWCA9PSBidWZTaXplKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiY2Fubm90IHJldHJpZXZlIGJ1ZmZlciBzaXplIGZvciBidWZmZXIgJXUiLCBpKTsKKyAgICAgICAgICAgICAgICByZXQgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuY29kZV9wYXJtLnNyY19tYWluX2J1ZltpXS5idWZfc2l6ZSA9IChzaXplX3QpYnVmU2l6ZTsKKyAgICAgICAgICAgIGVuY29kZV9wYXJtLnNyY19tYWluX2J1ZltpXS5idWZfdmFkZHIgPSAodWludDhfdCAqKXBTdHJlYW1NZW0tPmdldFB0cihpKTsKKyAgICAgICAgICAgIGVuY29kZV9wYXJtLnNyY19tYWluX2J1ZltpXS5mZCA9IHBTdHJlYW1NZW0tPmdldEZkKGkpOworICAgICAgICAgICAgZW5jb2RlX3Bhcm0uc3JjX21haW5fYnVmW2ldLmZvcm1hdCA9IE1NX0pQRUdfRk1UX1lVVjsKKyAgICAgICAgICAgIGVuY29kZV9wYXJtLnNyY19tYWluX2J1ZltpXS5vZmZzZXQgPSBtYWluX29mZnNldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vUGFzcyBpbnB1dCB0aHVtYm5haWwgYnVmZmVyIGluZm8gdG8gZW5jb2Rlci4KKyAgICAvL05vdGU6IFVzZSBtYWluIGJ1ZmZlciB0byBlbmNvZGUgdGh1bWJuYWlsCisgICAgaWYgKG1fYlRodW1ibmFpbE5lZWRlZCA9PSBUUlVFKSB7CisgICAgICAgIHBTdHJlYW1NZW0gPSBtYWluX3N0cmVhbS0+Z2V0U3RyZWFtQnVmcygpOworICAgICAgICBpZiAocFN0cmVhbU1lbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJjYW5ub3QgZ2V0IHN0cmVhbSBidWZzIGZyb20gdGh1bWIgc3RyZWFtIik7CisgICAgICAgICAgICByZXQgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgICAgICB9CisgICAgICAgIGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QgdGh1bWJfb2Zmc2V0OworICAgICAgICBtZW1zZXQoJnRodW1iX29mZnNldCwgMCwgc2l6ZW9mKGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QpKTsKKyAgICAgICAgbWFpbl9zdHJlYW0tPmdldEZyYW1lT2Zmc2V0KHRodW1iX29mZnNldCk7CisgICAgICAgIGVuY29kZV9wYXJtLm51bV90bWJfYnVmcyA9IE1JTihwU3RyZWFtTWVtLT5nZXRDbnQoKSwgTU1fSlBFR19NQVhfQlVGKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVuY29kZV9wYXJtLm51bV90bWJfYnVmczsgaSsrKSB7CisgICAgICAgICAgICBpZiAocFN0cmVhbU1lbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZW5jb2RlX3Bhcm0uc3JjX3RodW1iX2J1ZltpXS5pbmRleCA9IGk7CisgICAgICAgICAgICAgICAgYnVmU2l6ZSA9IHBTdHJlYW1NZW0tPmdldFNpemUoaSk7CisgICAgICAgICAgICAgICAgaWYgKEJBRF9JTkRFWCA9PSBidWZTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoImNhbm5vdCByZXRyaWV2ZSBidWZmZXIgc2l6ZSBmb3IgYnVmZmVyICV1IiwgaSk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW5jb2RlX3Bhcm0uc3JjX3RodW1iX2J1ZltpXS5idWZfc2l6ZSA9ICh1aW50MzJfdClidWZTaXplOworICAgICAgICAgICAgICAgIGVuY29kZV9wYXJtLnNyY190aHVtYl9idWZbaV0uYnVmX3ZhZGRyID0gKHVpbnQ4X3QgKilwU3RyZWFtTWVtLT5nZXRQdHIoaSk7CisgICAgICAgICAgICAgICAgZW5jb2RlX3Bhcm0uc3JjX3RodW1iX2J1ZltpXS5mZCA9IHBTdHJlYW1NZW0tPmdldEZkKGkpOworICAgICAgICAgICAgICAgIGVuY29kZV9wYXJtLnNyY190aHVtYl9idWZbaV0uZm9ybWF0ID0gTU1fSlBFR19GTVRfWVVWOworICAgICAgICAgICAgICAgIGVuY29kZV9wYXJtLnNyY190aHVtYl9idWZbaV0ub2Zmc2V0ID0gdGh1bWJfb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy9QYXNzIG91dHB1dCBqcGVnIGJ1ZmZlciBpbmZvIHRvIGVuY29kZXIuCisgICAgLy9tSnBlZ01lbSBpcyBhbGxvY2F0ZWQgYnkgZnJhbWV3b3JrLgorICAgIGJ1ZlNpemUgPSBtT3V0cHV0TWVtLT5nZXRTaXplKGpwZWdfc2V0dGluZ3MtPm91dF9idWZfaW5kZXgpOworICAgIGlmIChCQURfSU5ERVggPT0gYnVmU2l6ZSkgeworICAgICAgICBMT0dFKCJjYW5ub3QgcmV0cmlldmUgYnVmZmVyIHNpemUgZm9yIGJ1ZmZlciAldSIsCisgICAgICAgICAgICAgICAganBlZ19zZXR0aW5ncy0+b3V0X2J1Zl9pbmRleCk7CisgICAgICAgIHJldCA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICB9CisgICAgZW5jb2RlX3Bhcm0ubnVtX2RzdF9idWZzID0gMTsKKyAgICBlbmNvZGVfcGFybS5kZXN0X2J1ZlswXS5pbmRleCA9IDA7CisgICAgZW5jb2RlX3Bhcm0uZGVzdF9idWZbMF0uYnVmX3NpemUgPSAoc2l6ZV90KWJ1ZlNpemU7CisgICAgZW5jb2RlX3Bhcm0uZGVzdF9idWZbMF0uYnVmX3ZhZGRyID0gKHVpbnQ4X3QgKiltT3V0cHV0TWVtLT5nZXRQdHIoCisgICAgICAgICAgICBqcGVnX3NldHRpbmdzLT5vdXRfYnVmX2luZGV4KTsKKyAgICBlbmNvZGVfcGFybS5kZXN0X2J1ZlswXS5mZCA9IG1PdXRwdXRNZW0tPmdldEZkKAorICAgICAgICAgICAganBlZ19zZXR0aW5ncy0+b3V0X2J1Zl9pbmRleCk7CisgICAgZW5jb2RlX3Bhcm0uZGVzdF9idWZbMF0uZm9ybWF0ID0gTU1fSlBFR19GTVRfWVVWOworICAgIGVuY29kZV9wYXJtLmRlc3RfYnVmWzBdLm9mZnNldCA9IG1haW5fb2Zmc2V0OworCisgICAgTE9HRCgiWCIpOworICAgIHJldHVybiBOT19FUlJPUjsKKworb25fZXJyb3I6CisgICAgTE9HRCgiWCB3aXRoIGVycm9yICVkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQzMl90IFFDYW1lcmEzUG9zdFByb2Nlc3Nvcjo6cHJvY2Vzc0RhdGEobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICppbnB1dCkgeworICAgIHJldHVybiBwcm9jZXNzRGF0YShpbnB1dCwgTlVMTCwgMCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHJvY2Vzc0RhdGEKKyAqCisgKiBERVNDUklQVElPTjogZW5xdWV1ZSBkYXRhIGludG8gZGF0YVByb2MgdGhyZWFkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmcmFtZSAgIDogcHJvY2VzcyBpbnB1dCBmcmFtZQorICogICBAb3V0cHV0ICA6IHByb2Nlc3Mgb3V0cHV0IGZyYW1lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqCisgKiBOT1RFICAgICAgIDogZGVwZW5kcyBvbiBpZiBvZmZsaW5lIHJlcHJvY2VzcyBpcyBuZWVkZWQsIHJlY2VpdmVkIGZyYW1lIHdpbGwKKyAqICAgICAgICAgICAgICBiZSBzZW50IHRvIGVpdGhlciBpbnB1dCBxdWV1ZSBvZiBwb3N0cHJvY2VzcyBvciBqcGVnIGVuY29kaW5nCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNQb3N0UHJvY2Vzc29yOjpwcm9jZXNzRGF0YShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmlucHV0LAorICAgICAgICBidWZmZXJfaGFuZGxlX3QgKm91dHB1dCwgdWludDMyX3QgZnJhbWVOdW1iZXIpCit7CisgICAgTE9HRCgiRSIpOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbVJlcHJvY0pvYkxvY2spOworCisgICAgLy8gZW5xdWV1ZSB0byBwb3N0IHByb2MgaW5wdXQgcXVldWUKKyAgICBxY2FtZXJhX2hhbDNfcHBfYnVmZmVyX3QgKnBwX2J1ZmZlciA9IChxY2FtZXJhX2hhbDNfcHBfYnVmZmVyX3QgKiltYWxsb2MoCisgICAgICAgICAgICBzaXplb2YocWNhbWVyYV9oYWwzX3BwX2J1ZmZlcl90KSk7CisgICAgaWYgKE5VTEwgPT0gcHBfYnVmZmVyKSB7CisgICAgICAgIExPR0UoIm91dCBvZiBtZW1vcnkiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KHBwX2J1ZmZlciwgMCwgc2l6ZW9mKCpwcF9idWZmZXIpKTsKKyAgICBwcF9idWZmZXItPmlucHV0ID0gaW5wdXQ7CisgICAgcHBfYnVmZmVyLT5vdXRwdXQgPSBvdXRwdXQ7CisgICAgcHBfYnVmZmVyLT5mcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgIG1faW5wdXRQUFEuZW5xdWV1ZSgodm9pZCAqKXBwX2J1ZmZlcik7CisgICAgaWYgKCEobV9pbnB1dE1ldGFRLmlzRW1wdHkoKSkpIHsKKyAgICAgICAgTE9HRCgibWV0YSBxdWV1ZSBpcyBub3QgZW1wdHksIGRvIG5leHQgam9iIik7CisgICAgICAgIG1fZGF0YVByb2NUaC5zZW5kQ21kKENBTUVSQV9DTURfVFlQRV9ET19ORVhUX0pPQiwgRkFMU0UsIEZBTFNFKTsKKyAgICB9IGVsc2UKKyAgICAgICAgTE9HRCgibWV0YWRhdGEgcXVldWUgaXMgZW1wdHkiKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbVJlcHJvY0pvYkxvY2spOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG5lZWRzUmVwcm9jZXNzCisgKgorICogREVTQ1JJUFRJT046IERldGVybWluZSBpZiByZXByb2Nlc3MgaXMgbmVlZGVkLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZnJhbWUgICA6IHByb2Nlc3MgZnJhbWUKKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqICBUUlVFIGlmIGZyYW1lIG5lZWRzIHRvIGJlIHJlcHJvY2Vzc2VkCisgKiAgRkFMU0UgaXMgZnJhbWUgZG9lcyBub3QgbmVlZCB0byBiZSByZXByb2Nlc3NlZAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworYm9vbCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6Om5lZWRzUmVwcm9jZXNzKHFjYW1lcmFfZndrX2lucHV0X3BwX2RhdGFfdCAqZnJhbWUpCit7CisgICAgbWV0YWRhdGFfYnVmZmVyX3QqIG1ldGEgPSAobWV0YWRhdGFfYnVmZmVyX3QgKikgZnJhbWUtPm1ldGFkYXRhX2J1ZmZlci5idWZmZXI7CisgICAgYm9vbCBlZGdlTW9kZU9uID0gRkFMU0U7CisgICAgYm9vbCBub2lzZVJlZE1vZGVPbiA9IEZBTFNFOworICAgIGJvb2wgcmVwcm9Ob3REb25lID0gVFJVRTsKKworICAgIGlmIChmcmFtZS0+cmVwcm9jX2NvbmZpZy5yZXByb2Nlc3NfdHlwZSA9PSBSRVBST0NFU1NfVFlQRV9OT05FKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvLyBlZGdlIGRldGVjdGlvbgorICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9lZGdlX2FwcGxpY2F0aW9uX3QsIGVkZ2VNb2RlLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9FREdFX01PREUsIG1ldGEpIHsKKyAgICAgICAgZWRnZU1vZGVPbiA9IChDQU1fRURHRV9NT0RFX09GRiAhPSBlZGdlTW9kZS0+ZWRnZV9tb2RlKTsKKyAgICB9CisKKyAgICAvLyBub2lzZSByZWR1Y3Rpb24KKyAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgbm9pc2VSZWRNb2RlLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9OT0lTRV9SRURVQ1RJT05fTU9ERSwgbWV0YSkgeworICAgICAgICBub2lzZVJlZE1vZGVPbiA9IChDQU1fTk9JU0VfUkVEVUNUSU9OX01PREVfT0ZGICE9ICpub2lzZVJlZE1vZGUpOworICAgIH0KKworICAgIElGX01FVEFfQVZBSUxBQkxFKHVpbnQ4X3QsIHJlcHJvY2Vzc19mbGFncywKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfUkVQUk9DRVNTX0ZMQUdTLCBtZXRhKSB7CisgICAgICAgIHJlcHJvTm90RG9uZSA9IEZBTFNFOworICAgIH0KKworICAgIHJldHVybiAoZWRnZU1vZGVPbiB8fCBub2lzZVJlZE1vZGVPbiB8fCByZXByb05vdERvbmUpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2Nlc3NEYXRhCisgKgorICogREVTQ1JJUFRJT046IGVucXVldWUgZGF0YSBpbnRvIGRhdGFQcm9jIHRocmVhZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZnJhbWUgICA6IHByb2Nlc3MgZnJhbWUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICoKKyAqIE5PVEUgICAgICAgOiBkZXBlbmRzIG9uIGlmIG9mZmxpbmUgcmVwcm9jZXNzIGlzIG5lZWRlZCwgcmVjZWl2ZWQgZnJhbWUgd2lsbAorICogICAgICAgICAgICAgIGJlIHNlbnQgdG8gZWl0aGVyIGlucHV0IHF1ZXVlIG9mIHBvc3Rwcm9jZXNzIG9yIGpwZWcgZW5jb2RpbmcKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OnByb2Nlc3NEYXRhKHFjYW1lcmFfZndrX2lucHV0X3BwX2RhdGFfdCAqZnJhbWUpCit7CisgICAgaWYgKG5lZWRzUmVwcm9jZXNzKGZyYW1lKSkgeworICAgICAgICBBVFJBQ0VfSU5UKCJDYW1lcmE6UmVwcm9jZXNzIiwgMSk7CisgICAgICAgIExPR0goInNjaGVkdWxpbmcgZnJhbWV3b3JrIHJlcHJvY2VzcyIpOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1SZXByb2NKb2JMb2NrKTsKKyAgICAgICAgLy8gZW5xdWV1IHRvIHBvc3QgcHJvYyBpbnB1dCBxdWV1ZQorICAgICAgICBtX2lucHV0RldLUFBRLmVucXVldWUoKHZvaWQgKilmcmFtZSk7CisgICAgICAgIG1fZGF0YVByb2NUaC5zZW5kQ21kKENBTUVSQV9DTURfVFlQRV9ET19ORVhUX0pPQiwgRkFMU0UsIEZBTFNFKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1SZXByb2NKb2JMb2NrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBqcGVnX3NldHRpbmdzX3QgKmpwZWdfc2V0dGluZ3MgPSAoanBlZ19zZXR0aW5nc190ICopbV9qcGVnU2V0dGluZ3NRLmRlcXVldWUoKTsKKworICAgICAgICBpZiAoanBlZ19zZXR0aW5ncyA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJDYW5ub3QgZmluZCBqcGVnIHNldHRpbmdzIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgTE9HSCgibm8gbmVlZCBvZmZsaW5lIHJlcHJvY2Vzcywgc2VuZGluZyB0byBqcGVnIGVuY29kaW5nIik7CisgICAgICAgIHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCAqanBlZ19qb2IgPQorICAgICAgICAgICAgKHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCAqKW1hbGxvYyhzaXplb2YocWNhbWVyYV9oYWwzX2pwZWdfZGF0YV90KSk7CisgICAgICAgIGlmIChqcGVnX2pvYiA9PSBOVUxMKSB7CisgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIGpwZWcgam9iIik7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KGpwZWdfam9iLCAwLCBzaXplb2YocWNhbWVyYV9oYWwzX2pwZWdfZGF0YV90KSk7CisgICAgICAgIGpwZWdfam9iLT5md2tfZnJhbWUgPSBmcmFtZTsKKyAgICAgICAganBlZ19qb2ItPmpwZWdfc2V0dGluZ3MgPSBqcGVnX3NldHRpbmdzOworICAgICAgICBqcGVnX2pvYi0+bWV0YWRhdGEgPQorICAgICAgICAgICAgICAgIChtZXRhZGF0YV9idWZmZXJfdCAqKSBmcmFtZS0+bWV0YWRhdGFfYnVmZmVyLmJ1ZmZlcjsKKworICAgICAgICAvLyBlbnF1ZXUgdG8ganBlZyBpbnB1dCBxdWV1ZQorICAgICAgICBtX2lucHV0SnBlZ1EuZW5xdWV1ZSgodm9pZCAqKWpwZWdfam9iKTsKKyAgICAgICAgbV9kYXRhUHJvY1RoLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX0RPX05FWFRfSk9CLCBGQUxTRSwgRkFMU0UpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jZXNzUFBNZXRhZGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBlbnF1ZXVlIGRhdGEgaW50byBkYXRhUHJvYyB0aHJlYWQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZyYW1lICAgOiBwcm9jZXNzIG1ldGFkYXRhIGZyYW1lIHJlY2VpdmVkIGZyb20gcGljIGNoYW5uZWwKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OnByb2Nlc3NQUE1ldGFkYXRhKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVwcm9jX21ldGEpCit7CisgICAgTE9HRCgiRSIpOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbVJlcHJvY0pvYkxvY2spOworICAgIC8vIGVucXVldWUgdG8gbWV0YWRhdGEgaW5wdXQgcXVldWUKKyAgICBtX2lucHV0TWV0YVEuZW5xdWV1ZSgodm9pZCAqKXJlcHJvY19tZXRhKTsKKyAgICBpZiAoIShtX2lucHV0UFBRLmlzRW1wdHkoKSkpIHsKKyAgICAgICBMT0dEKCJwcCBxdWV1ZSBpcyBub3QgZW1wdHksIGRvIG5leHQgam9iIik7CisgICAgICAgbV9kYXRhUHJvY1RoLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX0RPX05FWFRfSk9CLCBGQUxTRSwgRkFMU0UpOworICAgIH0gZWxzZSB7CisgICAgICAgTE9HRCgicHAgcXVldWUgaXMgZW1wdHksIG5vdCBjYWxsaW5nIGRvIG5leHQgam9iIik7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtUmVwcm9jSm9iTG9jayk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHByb2Nlc3NKcGVnU2V0dGluZ0RhdGEKKyAqCisgKiBERVNDUklQVElPTjogZW5xdWV1ZSBqcGVnU2V0dGluZyBpbnRvIGRhdGFQcm9jIHRocmVhZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAanBlZ19zZXR0aW5ncyA6IGpwZWcgc2V0dGluZ3MgZGF0YSByZWNlaXZlZCBmcm9tIHBpYyBjaGFubmVsCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNQb3N0UHJvY2Vzc29yOjpwcm9jZXNzSnBlZ1NldHRpbmdEYXRhKAorICAgICAgICBqcGVnX3NldHRpbmdzX3QgKmpwZWdfc2V0dGluZ3MpCit7CisgICAgaWYgKCFqcGVnX3NldHRpbmdzKSB7CisgICAgICAgIExPR0UoImludmFsaWQganBlZyBzZXR0aW5ncyBwb2ludGVyIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICByZXR1cm4gbV9qcGVnU2V0dGluZ3NRLmVucXVldWUoKHZvaWQgKilqcGVnX3NldHRpbmdzKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jZXNzUFBEYXRhCisgKgorICogREVTQ1JJUFRJT046IHByb2Nlc3MgcmVjZWl2ZWQgZnJhbWUgYWZ0ZXIgcmVwcm9jZXNzLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZnJhbWUgICA6IHJlY2VpdmVkIGZyYW1lIGZyb20gcmVwcm9jZXNzIGNoYW5uZWwuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqCisgKiBOT1RFICAgICAgIDogVGhlIGZyYW1lIGFmdGVyIHJlcHJvY2VzcyBuZWVkIHRvIHNlbmQgdG8ganBlZyBlbmNvZGluZy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OnByb2Nlc3NQUERhdGEobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSkKK3sKKyAgICBxY2FtZXJhX2hhbDNfcHBfZGF0YV90ICpqb2IgPSAocWNhbWVyYV9oYWwzX3BwX2RhdGFfdCAqKW1fb25nb2luZ1BQUS5kZXF1ZXVlKCk7CisgICAgQVRSQUNFX0lOVCgiQ2FtZXJhOlJlcHJvY2VzcyIsIDApOworICAgIGlmIChqb2IgPT0gTlVMTCB8fCAoKE5VTEwgPT0gam9iLT5zcmNfZnJhbWUpICYmIChOVUxMID09IGpvYi0+ZndrX3NyY19mcmFtZSkpKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBmaW5kIHJlcHJvY2VzcyBqb2IiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKGpvYi0+anBlZ19zZXR0aW5ncyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBmaW5kIGpwZWcgc2V0dGluZ3MiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBxY2FtZXJhX2hhbDNfanBlZ19kYXRhX3QgKmpwZWdfam9iID0KKyAgICAgICAgKHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCAqKW1hbGxvYyhzaXplb2YocWNhbWVyYV9oYWwzX2pwZWdfZGF0YV90KSk7CisgICAgaWYgKGpwZWdfam9iID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBqcGVnIGpvYiIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1lbXNldChqcGVnX2pvYiwgMCwgc2l6ZW9mKHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCkpOworICAgIGpwZWdfam9iLT5zcmNfZnJhbWUgPSBmcmFtZTsKKyAgICBpZihmcmFtZSAhPSBqb2ItPnNyY19mcmFtZSkKKyAgICAgICAganBlZ19qb2ItPnNyY19yZXByb2NfZnJhbWUgPSBqb2ItPnNyY19mcmFtZTsKKyAgICBpZiAoTlVMTCA9PSBqb2ItPmZ3a19zcmNfZnJhbWUpIHsKKyAgICAgICAganBlZ19qb2ItPm1ldGFkYXRhID0gam9iLT5tZXRhZGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBqcGVnX2pvYi0+bWV0YWRhdGEgPQorICAgICAgICAgICAgICAgIChtZXRhZGF0YV9idWZmZXJfdCAqKSBqb2ItPmZ3a19zcmNfZnJhbWUtPm1ldGFkYXRhX2J1ZmZlci5idWZmZXI7CisgICAgICAgIGpwZWdfam9iLT5md2tfc3JjX2J1ZmZlciA9IGpvYi0+ZndrX3NyY19mcmFtZTsKKyAgICB9CisgICAganBlZ19qb2ItPnNyY19tZXRhZGF0YSA9IGpvYi0+c3JjX21ldGFkYXRhOworICAgIGpwZWdfam9iLT5qcGVnX3NldHRpbmdzID0gam9iLT5qcGVnX3NldHRpbmdzOworCisgICAgLy8gZnJlZSBwcCBqb2IgYnVmCisgICAgZnJlZShqb2IpOworCisgICAgLy8gZW5xdWV1IHJlcHJvY2Vzc2VkIGZyYW1lIHRvIGpwZWcgaW5wdXQgcXVldWUKKyAgICBtX2lucHV0SnBlZ1EuZW5xdWV1ZSgodm9pZCAqKWpwZWdfam9iKTsKKworICAgIC8vIHdhaXQgdXAgZGF0YSBwcm9jIHRocmVhZAorICAgIG1fZGF0YVByb2NUaC5zZW5kQ21kKENBTUVSQV9DTURfVFlQRV9ET19ORVhUX0pPQiwgRkFMU0UsIEZBTFNFKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkZXF1ZXVlUFBKb2IKKyAqCisgKiBERVNDUklQVElPTjogZmluZCBhIHBvc3Rwcm9jZXNzaW5nIGpvYiBmcm9tIG9uZ29pbmcgcHAgcXVldWUgYnkgZnJhbWUgbnVtYmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmcmFtZU51bWJlciA6IGZyYW1lIG51bWJlciBmb3IgdGhlIHBwIGpvYgorICoKKyAqIFJFVFVSTiAgICAgOiBwdHIgdG8gYSBwcCBqb2Igc3RydWN0LiBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworcWNhbWVyYV9oYWwzX3BwX2RhdGFfdCAqUUNhbWVyYTNQb3N0UHJvY2Vzc29yOjpkZXF1ZXVlUFBKb2IodWludDMyX3QgZnJhbWVOdW1iZXIpIHsKKyAgICBxY2FtZXJhX2hhbDNfcHBfZGF0YV90ICpwcF9qb2IgPSBOVUxMOworICAgIHBwX2pvYiA9IChxY2FtZXJhX2hhbDNfcHBfZGF0YV90ICopbV9vbmdvaW5nUFBRLmRlcXVldWUoKTsKKworICAgIGlmIChwcF9qb2IgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJGYXRhbDogb25nb2luZyBQUCBxdWV1ZSBpcyBlbXB0eSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHBwX2pvYi0+ZndrX3NyY19mcmFtZSAmJgorICAgICAgICAgICAgKHBwX2pvYi0+ZndrX3NyY19mcmFtZS0+ZnJhbWVOdW1iZXIgIT0gZnJhbWVOdW1iZXIpKSB7CisgICAgICAgIExPR0UoImhlYWQgb2YgcHAgcXVldWUgZG9lc24ndCBtYXRjaCByZXF1ZXN0ZWQgZnJhbWUgbnVtYmVyIik7CisgICAgfQorICAgIHJldHVybiBwcF9qb2I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZmluZEpwZWdKb2JCeUpvYklkCisgKgorICogREVTQ1JJUFRJT046IGZpbmQgYSBqcGVnIGpvYiBmcm9tIG9uZ29pbmcgSnBlZyBxdWV1ZSBieSBpdHMgam9iIElECisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBqb2JJZCAgIDogam9iIElkIG9mIHRoZSBqb2IKKyAqCisgKiBSRVRVUk4gICAgIDogcHRyIHRvIGEganBlZyBqb2Igc3RydWN0LiBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqCisgKiBOT1RFICAgICAgIDogQ3VycmVudGx5IG9ubHkgb25lIGpvYiBpcyBzZW5kaW5nIHRvIG1tLWpwZWctaW50ZXJmYWNlIGZvciBqcGVnCisgKiAgICAgICAgICAgICAgZW5jb2RpbmcuIFRoZXJlZm9yZSBzaW1wbHkgZGVxdWV1ZSBmcm9tIHRoZSBvbmdvaW5nIEpwZWcgUXVldWUKKyAqICAgICAgICAgICAgICB3aWxsIHNlcnZlIHRoZSBwdXJwb3NlIHRvIGZpbmQgdGhlIGpwZWcgam9iLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitxY2FtZXJhX2hhbDNfanBlZ19kYXRhX3QgKlFDYW1lcmEzUG9zdFByb2Nlc3Nvcjo6ZmluZEpwZWdKb2JCeUpvYklkKHVpbnQzMl90IGpvYklkKQoreworICAgIHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCAqIGpvYiA9IE5VTEw7CisgICAgaWYgKGpvYklkID09IDApIHsKKyAgICAgICAgTE9HRSgibm90IGEgdmFsaWQganBlZyBqb2JJZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBjdXJyZWx5IG9ubHkgb25lIGpwZWcgam9iIG9uZ29pbmcsIHNvIHNpbXBseSBkZXF1ZXVlIHRoZSBoZWFkCisgICAgam9iID0gKHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCAqKW1fb25nb2luZ0pwZWdRLmRlcXVldWUoKTsKKyAgICByZXR1cm4gam9iOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbGVhc2VQUElucHV0RGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBjYWxsYmFjayBmdW5jdGlvbiB0byByZWxlYXNlIHBvc3QgcHJvY2VzcyBpbnB1dCBkYXRhIG5vZGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRhdGEgICAgICA6IHB0ciB0byBwb3N0IHByb2Nlc3MgaW5wdXQgZGF0YQorICogICBAdXNlcl9kYXRhIDogdXNlciBkYXRhIHB0ciAoUUNhbWVyYTNSZXByb2Nlc3NvcikKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzUG9zdFByb2Nlc3Nvcjo6cmVsZWFzZVBQSW5wdXREYXRhKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IgKnBtZSA9IChRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IgKil1c2VyX2RhdGE7CisgICAgaWYgKE5VTEwgIT0gcG1lKSB7CisgICAgICAgIHFjYW1lcmFfaGFsM19wcF9idWZmZXJfdCAqYnVmID0gKHFjYW1lcmFfaGFsM19wcF9idWZmZXJfdCAqKWRhdGE7CisgICAgICAgIGlmIChOVUxMICE9IGJ1ZikgeworICAgICAgICAgICAgaWYgKGJ1Zi0+aW5wdXQpIHsKKyAgICAgICAgICAgICAgICBwbWUtPnJlbGVhc2VTdXBlckJ1ZihidWYtPmlucHV0KTsKKyAgICAgICAgICAgICAgICBmcmVlKGJ1Zi0+aW5wdXQpOworICAgICAgICAgICAgICAgIGJ1Zi0+aW5wdXQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbGVhc2VNZXRhRGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBjYWxsYmFjayBmdW5jdGlvbiB0byByZWxlYXNlIG1ldGFkYXRhIGNhbWVyYSBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRhdGEgICAgICA6IHB0ciB0byBwb3N0IHByb2Nlc3MgaW5wdXQgZGF0YQorICogICBAdXNlcl9kYXRhIDogdXNlciBkYXRhIHB0ciAoUUNhbWVyYTNSZXByb2Nlc3NvcikKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzUG9zdFByb2Nlc3Nvcjo6cmVsZWFzZU1ldGFkYXRhKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IgKnBtZSA9IChRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IgKil1c2VyX2RhdGE7CisgICAgaWYgKE5VTEwgIT0gcG1lKSB7CisgICAgICAgIHBtZS0+bV9wYXJlbnQtPm1ldGFkYXRhQnVmRG9uZSgobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICopZGF0YSk7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbGVhc2VKcGVnRGF0YQorICoKKyAqIERFU0NSSVBUSU9OOiBjYWxsYmFjayBmdW5jdGlvbiB0byByZWxlYXNlIGpwZWcgam9iIG5vZGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRhdGEgICAgICA6IHB0ciB0byBvbmdvaW5nIGpwZWcgam9iIGRhdGEKKyAqICAgQHVzZXJfZGF0YSA6IHVzZXIgZGF0YSBwdHIgKFFDYW1lcmEzUmVwcm9jZXNzb3IpCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OnJlbGVhc2VKcGVnRGF0YSh2b2lkICpkYXRhLCB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgUUNhbWVyYTNQb3N0UHJvY2Vzc29yICpwbWUgPSAoUUNhbWVyYTNQb3N0UHJvY2Vzc29yICopdXNlcl9kYXRhOworICAgIGlmIChOVUxMICE9IHBtZSkgeworICAgICAgICBwbWUtPnJlbGVhc2VKcGVnSm9iRGF0YSgocWNhbWVyYV9oYWwzX2pwZWdfZGF0YV90ICopZGF0YSk7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbGVhc2VPbmdvaW5nUFBEYXRhCisgKgorICogREVTQ1JJUFRJT046IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlbGVhc2Ugb25nb2luZyBwb3N0cHJvY2VzcyBqb2Igbm9kZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGF0YSAgICAgIDogcHRyIHRvIG9uZ2luZyBwb3N0cHJvY2VzcyBqb2IKKyAqICAgQHVzZXJfZGF0YSA6IHVzZXIgZGF0YSBwdHIgKFFDYW1lcmEzUmVwcm9jZXNzb3IpCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OnJlbGVhc2VPbmdvaW5nUFBEYXRhKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IgKnBtZSA9IChRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IgKil1c2VyX2RhdGE7CisgICAgaWYgKE5VTEwgIT0gcG1lKSB7CisgICAgICAgIHFjYW1lcmFfaGFsM19wcF9kYXRhX3QgKnBwX2RhdGEgPSAocWNhbWVyYV9oYWwzX3BwX2RhdGFfdCAqKWRhdGE7CisKKyAgICAgICAgaWYgKHBwX2RhdGEgJiYgcHBfZGF0YS0+c3JjX2ZyYW1lKQorICAgICAgICAgIHBtZS0+cmVsZWFzZVN1cGVyQnVmKHBwX2RhdGEtPnNyY19mcmFtZSk7CisKKyAgICAgICAgcG1lLT5yZWxlYXNlUFBKb2JEYXRhKHBwX2RhdGEpOworCisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlbGVhc2VTdXBlckJ1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byByZWxlYXNlIGEgc3VwZXJidWYgZnJhbWUgYnkgcmV0dXJuaW5nIGJhY2sgdG8ga2VybmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdXBlcl9idWYgOiBwdHIgdG8gdGhlIHN1cGVyYnVmIGZyYW1lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OnJlbGVhc2VTdXBlckJ1ZihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2J1ZikKK3sKKyAgICBpZiAoTlVMTCAhPSBzdXBlcl9idWYpIHsKKyAgICAgICAgaWYgKG1fcGFyZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1fcGFyZW50LT5idWZEb25lKHN1cGVyX2J1Zik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVsZWFzZU9mZmxpbmVCdWZmZXJzCisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIHJlbGVhc2UvdW5tYXAgb2ZmbGluZSBidWZmZXJzIGlmIGFueQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogQGFsbEJ1ZmZlcnMgOiBmbGFnIHRoYXQgYXNrcyB0byByZWxlYXNlIGFsbCBidWZmZXJzIG9yIG9ubHkgb25lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OnJlbGVhc2VPZmZsaW5lQnVmZmVycyhib29sIGFsbEJ1ZmZlcnMpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgaWYoTlVMTCAhPSBtX3BSZXByb2NDaGFubmVsKSB7CisgICAgICAgIHJjID0gbV9wUmVwcm9jQ2hhbm5lbC0+dW5tYXBPZmZsaW5lQnVmZmVycyhhbGxCdWZmZXJzKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVsZWFzZUpwZWdKb2JEYXRhCisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIHJlbGVhc2UgaW50ZXJuYWwgcmVzb3VyY2VzIGluIGpwZWcgam9iIHN0cnVjdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAam9iICAgICA6IHB0ciB0byBqcGVnIGpvYiBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICoKKyAqIE5PVEUgICAgICAgOiBvcmlnaW5hbCBzb3VyY2UgZnJhbWUgbmVlZCB0byBiZSBxdWV1ZWQgYmFjayB0byBrZXJuZWwgZm9yCisgKiAgICAgICAgICAgICAgZnV0dXJlIHVzZS4gT3V0cHV0IGJ1ZiBvZiBqcGVnIGpvYiBuZWVkIHRvIGJlIHJlbGVhc2VkIHNpbmNlCisgKiAgICAgICAgICAgICAgaXQncyBhbGxvY2F0ZWQgZm9yIGVhY2ggam9iLiBFeGlmIG9iamVjdCBuZWVkIHRvIGJlIGRlbGV0ZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNQb3N0UHJvY2Vzc29yOjpyZWxlYXNlSnBlZ0pvYkRhdGEocWNhbWVyYV9oYWwzX2pwZWdfZGF0YV90ICpqb2IpCit7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgTE9HRCgiRSIpOworICAgIGlmIChOVUxMICE9IGpvYikgeworICAgICAgICBpZiAoTlVMTCAhPSBqb2ItPnNyY19yZXByb2NfZnJhbWUpIHsKKyAgICAgICAgICAgIGZyZWUoam9iLT5zcmNfcmVwcm9jX2ZyYW1lKTsKKyAgICAgICAgICAgIGpvYi0+c3JjX3JlcHJvY19mcmFtZSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTlVMTCAhPSBqb2ItPnNyY19mcmFtZSkgeworICAgICAgICAgICAgaWYgKE5VTEwgIT0gbV9wUmVwcm9jQ2hhbm5lbCkgeworICAgICAgICAgICAgICAgIHJjID0gbV9wUmVwcm9jQ2hhbm5lbC0+YnVmRG9uZShqb2ItPnNyY19mcmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKQorICAgICAgICAgICAgICAgICAgICBMT0dFKCJidWZEb25lIGVycm9yOiAlZCIsIHJjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUoam9iLT5zcmNfZnJhbWUpOworICAgICAgICAgICAgam9iLT5zcmNfZnJhbWUgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE5VTEwgIT0gam9iLT5md2tfc3JjX2J1ZmZlcikgeworICAgICAgICAgICAgZnJlZShqb2ItPmZ3a19zcmNfYnVmZmVyKTsKKyAgICAgICAgICAgIGpvYi0+ZndrX3NyY19idWZmZXIgPSBOVUxMOworICAgICAgICB9IGVsc2UgaWYgKE5VTEwgIT0gam9iLT5zcmNfbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIG1fcGFyZW50LT5tZXRhZGF0YUJ1ZkRvbmUoam9iLT5zcmNfbWV0YWRhdGEpOworICAgICAgICAgICAgZnJlZShqb2ItPnNyY19tZXRhZGF0YSk7CisgICAgICAgICAgICBqb2ItPnNyY19tZXRhZGF0YSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTlVMTCAhPSBqb2ItPmZ3a19mcmFtZSkgeworICAgICAgICAgICAgZnJlZShqb2ItPmZ3a19mcmFtZSk7CisgICAgICAgICAgICBqb2ItPmZ3a19mcmFtZSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTlVMTCAhPSBqb2ItPnBKcGVnRXhpZk9iaikgeworICAgICAgICAgICAgZGVsZXRlIGpvYi0+cEpwZWdFeGlmT2JqOworICAgICAgICAgICAgam9iLT5wSnBlZ0V4aWZPYmogPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE5VTEwgIT0gam9iLT5qcGVnX3NldHRpbmdzKSB7CisgICAgICAgICAgICBmcmVlKGpvYi0+anBlZ19zZXR0aW5ncyk7CisgICAgICAgICAgICBqb2ItPmpwZWdfc2V0dGluZ3MgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIC8qIEFkZGl0aW9uYWwgdHJpZ2dlciB0byBwcm9jZXNzIGFueSBwZW5kaW5nIGpvYnMgaW4gdGhlIGlucHV0IHF1ZXVlICovCisgICAgbV9kYXRhUHJvY1RoLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX0RPX05FWFRfSk9CLCBGQUxTRSwgRkFMU0UpOworICAgIExPR0QoIlgiKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWxlYXNlUFBKb2JEYXRhCisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIHJlbGVhc2UgaW50ZXJuYWwgcmVzb3VyY2VzIGluIHAgcGpvYiBzdHJ1Y3QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGpvYiAgICAgOiBwdHIgdG8gcHAgam9iIHN0cnVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKgorICogTk9URSAgICAgICA6IE9yaWdpbmFsIHNvdXJjZSBtZXRhZGF0YSBidWZmZXIgbmVlZHMgdG8gYmUgcmVsZWFzZWQgYW5kCisgKiAgICAgICAgICAgICAgcXVldWVkIGJhY2sgdG8ga2VybmVsIGZvciBmdXR1cmUgdXNlLiBzcmNfZnJhbWUsIHNyY19tZXRhZGF0YSwKKyAqICAgICAgICAgICAgICBhbmQgZndrX3NyY19mcmFtZSBzdHJ1Y3R1cmVzIG5lZWQgdG8gYmUgZnJlZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNQb3N0UHJvY2Vzc29yOjpyZWxlYXNlUFBKb2JEYXRhKHFjYW1lcmFfaGFsM19wcF9kYXRhX3QgKnBwX2pvYikKK3sKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIExPR0QoIkUiKTsKKyAgICBpZiAoTlVMTCAhPSBwcF9qb2IpIHsKKyAgICAgICAgaWYgKE5VTEwgIT0gcHBfam9iLT5zcmNfZnJhbWUpIHsKKyAgICAgICAgICAgIGZyZWUocHBfam9iLT5zcmNfZnJhbWUpOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gcHBfam9iLT5zcmNfbWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICBtX3BhcmVudC0+bWV0YWRhdGFCdWZEb25lKHBwX2pvYi0+c3JjX21ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICBmcmVlKHBwX2pvYi0+c3JjX21ldGFkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBwX2pvYi0+c3JjX2ZyYW1lID0gTlVMTDsKKyAgICAgICAgICAgIHBwX2pvYi0+bWV0YWRhdGEgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE5VTEwgIT0gcHBfam9iLT5md2tfc3JjX2ZyYW1lKSB7CisgICAgICAgICAgICBmcmVlKHBwX2pvYi0+ZndrX3NyY19mcmFtZSk7CisgICAgICAgICAgICBwcF9qb2ItPmZ3a19zcmNfZnJhbWUgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQWRkaXRpb25hbCB0cmlnZ2VyIHRvIHByb2Nlc3MgYW55IHBlbmRpbmcgam9icyBpbiB0aGUgaW5wdXQgcXVldWUgKi8KKyAgICBtX2RhdGFQcm9jVGguc2VuZENtZChDQU1FUkFfQ01EX1RZUEVfRE9fTkVYVF9KT0IsIEZBTFNFLCBGQUxTRSk7CisgICAgTE9HRCgiWCIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldENvbG9yZm10RnJvbUltZ0ZtdAorICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byByZXR1cm4ganBlZyBjb2xvciBmb3JtYXQgYmFzZWQgb24gaXRzIGltYWdlIGZvcm1hdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW1nX2ZtdCA6IGltYWdlIGZvcm1hdAorICoKKyAqIFJFVFVSTiAgICAgOiBqcGVnIGNvbG9yIGZvcm1hdCB0aGF0IGNhbiBiZSB1bmRlcnN0YW5kYWJsZSBieSBvbXggbGliCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK21tX2pwZWdfY29sb3JfZm9ybWF0IFFDYW1lcmEzUG9zdFByb2Nlc3Nvcjo6Z2V0Q29sb3JmbXRGcm9tSW1nRm10KGNhbV9mb3JtYXRfdCBpbWdfZm10KQoreworICAgIHN3aXRjaCAoaW1nX2ZtdCkgeworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjE6CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYyMV9WRU5VUzoKKyAgICAgICAgcmV0dXJuIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDUkNCTFBfSDJWMjsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxX0FEUkVOTzoKKyAgICAgICAgcmV0dXJuIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDUkNCTFBfSDJWMjsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVkVOVVM6CisgICAgICAgIHJldHVybiBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gyVjI7CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfWVYxMjoKKyAgICAgICAgcmV0dXJuIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDQkNSTFBfSDJWMjsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMl9OVjYxOgorICAgICAgICByZXR1cm4gTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNSQ0JMUF9IMlYxOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIyX05WMTY6CisgICAgICAgIHJldHVybiBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gyVjE7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDUkNCTFBfSDJWMjsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0SnBlZ0ltZ1R5cGVGcm9tSW1nRm10CisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIHJldHVybiBqcGVnIGVuY29kZSBpbWFnZSB0eXBlIGJhc2VkIG9uIGl0cyBpbWFnZSBmb3JtYXQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGltZ19mbXQgOiBpbWFnZSBmb3JtYXQKKyAqCisgKiBSRVRVUk4gICAgIDogcmV0dXJuIGpwZWcgc291cmNlIGltYWdlIGZvcm1hdCAoWVVWIG9yIEJpdHN0cmVhbSkKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworbW1fanBlZ19mb3JtYXRfdCBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OmdldEpwZWdJbWdUeXBlRnJvbUltZ0ZtdChjYW1fZm9ybWF0X3QgaW1nX2ZtdCkKK3sKKyAgICBzd2l0Y2ggKGltZ19mbXQpIHsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjFfQURSRU5POgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTI6CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9WRU5VUzoKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxX1ZFTlVTOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX1lWMTI6CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjJfTlY2MToKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMl9OVjE2OgorICAgICAgICByZXR1cm4gTU1fSlBFR19GTVRfWVVWOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBNTV9KUEVHX0ZNVF9ZVVY7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGVuY29kZUZXS0RhdGEKKyAqCisgKiBERVNDUklQVElPTjogZnVuY3Rpb24gdG8gcHJlcGFyZSBlbmNvZGluZyBqb2IgaW5mb3JtYXRpb24gYW5kIHNlbmQgdG8KKyAqICAgICAgICAgICAgICBtbS1qcGVnLWludGVyZmFjZSB0byBkbyB0aGUgZW5jb2Rpbmcgam9iCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBqcGVnX2pvYl9kYXRhIDogcHRyIHRvIGEgc3RydWN0IHNhdmluZyBqb2IgcmVsYXRlZCBpbmZvcm1hdGlvbgorICogICBAbmVlZE5ld1Nlc3MgICA6IGZsYWcgdG8gaW5kaWNhdGUgaWYgYSBuZXcganBlZyBlbmNvZGluZyBzZXNzaW9uIG5lZWQKKyAqICAgICAgICAgICAgICAgICAgICB0byBiZSBjcmVhdGVkLiBBZnRlciBjcmVhdGlvbiwgdGhpcyBmbGFnIHdpbGwgYmUgdG9nZ2xlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNQb3N0UHJvY2Vzc29yOjplbmNvZGVGV0tEYXRhKHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCAqanBlZ19qb2JfZGF0YSwKKyAgICAgICAgdWludDhfdCAmbmVlZE5ld1Nlc3MpCit7CisgICAgTE9HRCgiRSIpOworICAgIGludDMyX3QgcmV0ID0gTk9fRVJST1I7CisgICAgbW1fanBlZ19qb2JfdCBqcGdfam9iOworICAgIHVpbnQzMl90IGpvYklkID0gMDsKKyAgICBxY2FtZXJhX2Z3a19pbnB1dF9wcF9kYXRhX3QgKnJlY3ZkX2ZyYW1lID0gTlVMTDsKKyAgICBtZXRhZGF0YV9idWZmZXJfdCAqbWV0YWRhdGEgPSBOVUxMOworICAgIGpwZWdfc2V0dGluZ3NfdCAqanBlZ19zZXR0aW5ncyA9IE5VTEw7CisgICAgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSogaGFsX29iaiA9IE5VTEw7CisgICAgbW1fanBlZ19kZWJ1Z19leGlmX3BhcmFtc190ICpleGlmX2RlYnVnX3BhcmFtcyA9IE5VTEw7CisgICAgYm9vbCBuZWVkSnBlZ0V4aWZSb3RhdGlvbiA9IGZhbHNlOworCisgICAgaWYgKE5VTEwgPT0ganBlZ19qb2JfZGF0YSkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGpwZWcgam9iIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmVjdmRfZnJhbWUgPSBqcGVnX2pvYl9kYXRhLT5md2tfZnJhbWU7CisgICAgaWYgKE5VTEwgPT0gcmVjdmRfZnJhbWUpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBpbnB1dCBidWZmZXIiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtZXRhZGF0YSA9IGpwZWdfam9iX2RhdGEtPm1ldGFkYXRhOworICAgIGlmIChOVUxMID09IG1ldGFkYXRhKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgbWV0YWRhdGEgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAganBlZ19zZXR0aW5ncyA9IGpwZWdfam9iX2RhdGEtPmpwZWdfc2V0dGluZ3M7CisgICAgaWYgKE5VTEwgPT0ganBlZ19zZXR0aW5ncykgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGpwZWcgc2V0dGluZ3MgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKChOVUxMICE9IGpwZWdfam9iX2RhdGEtPnNyY19mcmFtZSkgJiYgKE5VTEwgIT0ganBlZ19qb2JfZGF0YS0+c3JjX2ZyYW1lKSkgeworICAgICAgICBMT0dFKCJVbnN1cHBvcnRlZCBjYXNlIGJvdGggZnJhbWV3b3JrIGFuZCBjYW1lcmEgc291cmNlIGJ1ZmZlcnMgYXJlIGludmFsaWQhIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaGFsX29iaiA9IChRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlKiltX3BhcmVudC0+bVVzZXJEYXRhOworICAgIGlmIChoYWxfb2JqID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiaGFsX29iaiBpcyBOVUxMLCBFcnJvciIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChtSnBlZ0NsaWVudEhhbmRsZSA8PSAwKSB7CisgICAgICAgIExPR0UoIkVycm9yOiBidWcgaGVyZSwgbUpwZWdDbGllbnRIYW5kbGUgaXMgMCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBjYW1fZGltZW5zaW9uX3Qgc3JjX2RpbTsKKyAgICBtZW1zZXQoJnNyY19kaW0sIDAsIHNpemVvZihjYW1fZGltZW5zaW9uX3QpKTsKKyAgICBzcmNfZGltLndpZHRoID0gcmVjdmRfZnJhbWUtPnJlcHJvY19jb25maWcuaW5wdXRfc3RyZWFtX2RpbS53aWR0aDsKKyAgICBzcmNfZGltLmhlaWdodCA9IHJlY3ZkX2ZyYW1lLT5yZXByb2NfY29uZmlnLmlucHV0X3N0cmVhbV9kaW0uaGVpZ2h0OworCisgICAgY2FtX2RpbWVuc2lvbl90IGRzdF9kaW07CisgICAgbWVtc2V0KCZkc3RfZGltLCAwLCBzaXplb2YoY2FtX2RpbWVuc2lvbl90KSk7CisgICAgZHN0X2RpbS53aWR0aCA9IHJlY3ZkX2ZyYW1lLT5yZXByb2NfY29uZmlnLm91dHB1dF9zdHJlYW1fZGltLndpZHRoOworICAgIGRzdF9kaW0uaGVpZ2h0ID0gcmVjdmRfZnJhbWUtPnJlcHJvY19jb25maWcub3V0cHV0X3N0cmVhbV9kaW0uaGVpZ2h0OworCisgICAgY2FtX3JlY3RfdCBjcm9wOworICAgIG1lbXNldCgmY3JvcCwgMCwgc2l6ZW9mKGNhbV9yZWN0X3QpKTsKKyAgICAvL1RCRF9sYXRlciAtIFpvb20gZXZlbnQgcmVtb3ZlZCBpbiBzdHJlYW0KKyAgICAvL21haW5fc3RyZWFtLT5nZXRDcm9wSW5mbyhjcm9wKTsKKworICAgIC8vIFNldCBKUEVHIGVuY29kZSBjcm9wIGluIHJlcHJvY2VzcyBmcmFtZSBtZXRhZGF0YQorICAgIC8vIElmIHRoaXMgSlBFRyBjcm9wIGluZm8gZXhpc3QsIGVuY29kZXIgc2hvdWxkIGRvIGNyb3BwaW5nCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3N0cmVhbV9jcm9wX2luZm9fdCwganBlZ19jcm9wLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9KUEVHX0VOQ09ERV9DUk9QLCBtZXRhZGF0YSkgeworICAgICAgICBtZW1jcHkoJmNyb3AsICYoanBlZ19jcm9wLT5jcm9wKSwgc2l6ZW9mKGNhbV9yZWN0X3QpKTsKKyAgICB9CisKKyAgICAvLyBTZXQgSlBFRyBlbmNvZGUgY3JvcCBpbiByZXByb2Nlc3MgZnJhbWUgbWV0YWRhdGEKKyAgICAvLyBJZiB0aGlzIEpQRUcgc2NhbGUgaW5mbyBleGlzdCwgZW5jb2RlciBzaG91bGQgZG8gc2NhbGluZworICAgIElGX01FVEFfQVZBSUxBQkxFKGNhbV9kaW1lbnNpb25fdCwgc2NhbGVfZGltLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9KUEVHX1NDQUxFX0RJTUVOU0lPTiwgbWV0YWRhdGEpIHsKKyAgICAgICAgaWYgKHNjYWxlX2RpbS0+d2lkdGggIT0gMCAmJiBzY2FsZV9kaW0tPmhlaWdodCAhPSAwKSB7CisgICAgICAgICAgICBkc3RfZGltLndpZHRoID0gc2NhbGVfZGltLT53aWR0aDsKKyAgICAgICAgICAgIGRzdF9kaW0uaGVpZ2h0ID0gc2NhbGVfZGltLT5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuZWVkSnBlZ0V4aWZSb3RhdGlvbiA9IChoYWxfb2JqLT5uZWVkSnBlZ0V4aWZSb3RhdGlvbigpIHx8ICFuZWVkc1JlcHJvY2VzcyhyZWN2ZF9mcmFtZSkpOworCisgICAgLy8gSWYgRVhJRiByb3RhdGlvbiBtZXRhZGF0YSBpcyBhZGRlZCBhbmQgdXNlZCB0byBtYXRjaCB0aGUgSlBFRyBvcmllbnRhdGlvbiwKKyAgICAvLyBpdCBtZWFucyBDUFAgcm90YXRpb24gaXMgbm90IGludm9sdmVkLCB3aGV0aGVyIGl0IGlzIGJlY2F1c2UgQ1BQIGRvZXMgbm90CisgICAgLy8gc3VwcG9ydCByb3RhdGlvbiwgb3IgdGhlIHJlcHJvY2Vzc2VkIGZyYW1lIGlzIG5vdCBzZW50IHRvIENQUC4KKyAgICAvLyBPdmVycmlkZSBDQU1fSU5URl9QQVJNX1JPVEFUSU9OIHRvIDAgdG8gYXZvaWQgd3JvbmcgQ1BQIHJvdGF0aW9uIGluZm8KKyAgICAvLyB0byBiZSBmaWxsZWQgaW4gdG8gSlBFRyBtZXRhZGF0YS4KKyAgICBpZiAobmVlZEpwZWdFeGlmUm90YXRpb24pIHsKKyAgICAgICAgY2FtX3JvdGF0aW9uX2luZm9fdCByb3RhdGlvbl9pbmZvOworICAgICAgICBtZW1zZXQoJnJvdGF0aW9uX2luZm8sIDAsIHNpemVvZihyb3RhdGlvbl9pbmZvKSk7CisgICAgICAgIHJvdGF0aW9uX2luZm8ucm90YXRpb24gPSBST1RBVEVfMDsKKyAgICAgICAgcm90YXRpb25faW5mby5zdHJlYW1JZCA9IDA7CisgICAgICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobWV0YWRhdGEsIENBTV9JTlRGX1BBUk1fUk9UQVRJT04sIHJvdGF0aW9uX2luZm8pOworICAgIH0KKworICAgIExPR0goIk5lZWQgbmV3IHNlc3Npb24/OiVkIiwgbmVlZE5ld1Nlc3MpOworICAgIGlmIChuZWVkTmV3U2VzcykgeworICAgICAgICAvL2NyZWF0aW5nIGEgbmV3IHNlc3Npb24sIHNvIHdlIG11c3QgZGVzdHJveSB0aGUgb2xkIG9uZQorICAgICAgICBpZiAoIDAgPCBtSnBlZ1Nlc3Npb25JZCApIHsKKyAgICAgICAgICAgIHJldCA9IG1KcGVnSGFuZGxlLmRlc3Ryb3lfc2Vzc2lvbihtSnBlZ1Nlc3Npb25JZCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRXJyb3IgZGVzdHJveWluZyBhbiBvbGQganBlZyBlbmNvZGluZyBzZXNzaW9uLCBpZCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbUpwZWdTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSnBlZ1Nlc3Npb25JZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLy8gY3JlYXRlIGpwZWcgZW5jb2Rpbmcgc2Vzc2lvbgorICAgICAgICBtbV9qcGVnX2VuY29kZV9wYXJhbXNfdCBlbmNvZGVQYXJhbTsKKyAgICAgICAgbWVtc2V0KCZlbmNvZGVQYXJhbSwgMCwgc2l6ZW9mKG1tX2pwZWdfZW5jb2RlX3BhcmFtc190KSk7CisgICAgICAgIGdldEZXS0pwZWdFbmNvZGVDb25maWcoZW5jb2RlUGFyYW0sIHJlY3ZkX2ZyYW1lLCBqcGVnX3NldHRpbmdzKTsKKyAgICAgICAgTE9HSCgiI3NyYyBidWZzOiVkICMgdG1iIGJ1ZnM6JWQgI2RzdF9idWZzOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgIGVuY29kZVBhcmFtLm51bV9zcmNfYnVmcyxlbmNvZGVQYXJhbS5udW1fdG1iX2J1ZnMsZW5jb2RlUGFyYW0ubnVtX2RzdF9idWZzKTsKKyAgICAgICAgaWYgKCFuZWVkSnBlZ0V4aWZSb3RhdGlvbiAmJgorICAgICAgICAgICAgKGpwZWdfc2V0dGluZ3MtPmpwZWdfb3JpZW50YXRpb24gPT0gOTAgfHwKKyAgICAgICAgICAgIGpwZWdfc2V0dGluZ3MtPmpwZWdfb3JpZW50YXRpb24gPT0gMjcwKSkgeworICAgICAgICAgICAgLy8gc3dhcCBzcmMgd2lkdGggYW5kIGhlaWdodCwgc3RyaWRlIGFuZCBzY2FubGluZSBkdWUgdG8gcm90YXRpb24KKyAgICAgICAgICAgIGVuY29kZVBhcmFtLm1haW5fZGltLnNyY19kaW0ud2lkdGggPSBzcmNfZGltLmhlaWdodDsKKyAgICAgICAgICAgIGVuY29kZVBhcmFtLm1haW5fZGltLnNyY19kaW0uaGVpZ2h0ID0gc3JjX2RpbS53aWR0aDsKKyAgICAgICAgICAgIGVuY29kZVBhcmFtLnRodW1iX2RpbS5zcmNfZGltLndpZHRoID0gc3JjX2RpbS5oZWlnaHQ7CisgICAgICAgICAgICBlbmNvZGVQYXJhbS50aHVtYl9kaW0uc3JjX2RpbS5oZWlnaHQgPSBzcmNfZGltLndpZHRoOworCisgICAgICAgICAgICBpbnQzMl90IHRlbXAgPSBlbmNvZGVQYXJhbS5zcmNfbWFpbl9idWZbMF0ub2Zmc2V0Lm1wWzBdLnN0cmlkZTsKKyAgICAgICAgICAgIGVuY29kZVBhcmFtLnNyY19tYWluX2J1ZlswXS5vZmZzZXQubXBbMF0uc3RyaWRlID0KKyAgICAgICAgICAgICAgICBlbmNvZGVQYXJhbS5zcmNfbWFpbl9idWZbMF0ub2Zmc2V0Lm1wWzBdLnNjYW5saW5lOworICAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX21haW5fYnVmWzBdLm9mZnNldC5tcFswXS5zY2FubGluZSA9IHRlbXA7CisKKyAgICAgICAgICAgIHRlbXAgPSBlbmNvZGVQYXJhbS5zcmNfdGh1bWJfYnVmWzBdLm9mZnNldC5tcFswXS5zdHJpZGU7CisgICAgICAgICAgICBlbmNvZGVQYXJhbS5zcmNfdGh1bWJfYnVmWzBdLm9mZnNldC5tcFswXS5zdHJpZGUgPQorICAgICAgICAgICAgICAgIGVuY29kZVBhcmFtLnNyY190aHVtYl9idWZbMF0ub2Zmc2V0Lm1wWzBdLnNjYW5saW5lOworICAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX3RodW1iX2J1ZlswXS5vZmZzZXQubXBbMF0uc2NhbmxpbmUgPSB0ZW1wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW5jb2RlUGFyYW0ubWFpbl9kaW0uc3JjX2RpbSA9IHNyY19kaW07CisgICAgICAgICAgICBlbmNvZGVQYXJhbS50aHVtYl9kaW0uc3JjX2RpbSA9IHNyY19kaW07CisgICAgICAgIH0KKyAgICAgICAgZW5jb2RlUGFyYW0ubWFpbl9kaW0uZHN0X2RpbSA9IGRzdF9kaW07CisgICAgICAgIGVuY29kZVBhcmFtLnRodW1iX2RpbS5kc3RfZGltID0ganBlZ19zZXR0aW5ncy0+dGh1bWJuYWlsX3NpemU7CisKKyAgICAgICAgTE9HSSgiU3JjIEJ1ZmZlciBjbnQgPSAlZCwgcmVzID0gJWRYJWQgbGVuID0gJWQgcm90ID0gJWQgIgorICAgICAgICAgICAgInNyY19kaW0gPSAlZFglZCBkc3RfZGltID0gJWRYJWQiLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0ubnVtX3NyY19idWZzLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX21haW5fYnVmWzBdLm9mZnNldC5tcFswXS5zdHJpZGUsCisgICAgICAgICAgICBlbmNvZGVQYXJhbS5zcmNfbWFpbl9idWZbMF0ub2Zmc2V0Lm1wWzBdLnNjYW5saW5lLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX21haW5fYnVmWzBdLm9mZnNldC5mcmFtZV9sZW4sCisgICAgICAgICAgICBlbmNvZGVQYXJhbS5yb3RhdGlvbiwKKyAgICAgICAgICAgIHNyY19kaW0ud2lkdGgsIHNyY19kaW0uaGVpZ2h0LAorICAgICAgICAgICAgZHN0X2RpbS53aWR0aCwgZHN0X2RpbS5oZWlnaHQpOworICAgICAgICBMT0dJKCJTcmMgVEhVTUIgYnVmX2NudCA9ICVkLCByZXMgPSAlZFglZCBsZW4gPSAlZCByb3QgPSAlZCAiCisgICAgICAgICAgICAic3JjX2RpbSA9ICVkWCVkLCBkc3RfZGltID0gJWRYJWQiLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0ubnVtX3RtYl9idWZzLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX3RodW1iX2J1ZlswXS5vZmZzZXQubXBbMF0uc3RyaWRlLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX3RodW1iX2J1ZlswXS5vZmZzZXQubXBbMF0uc2NhbmxpbmUsCisgICAgICAgICAgICBlbmNvZGVQYXJhbS5zcmNfdGh1bWJfYnVmWzBdLm9mZnNldC5mcmFtZV9sZW4sCisgICAgICAgICAgICBlbmNvZGVQYXJhbS50aHVtYl9yb3RhdGlvbiwKKyAgICAgICAgICAgIGVuY29kZVBhcmFtLnRodW1iX2RpbS5zcmNfZGltLndpZHRoLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0udGh1bWJfZGltLnNyY19kaW0uaGVpZ2h0LAorICAgICAgICAgICAgZW5jb2RlUGFyYW0udGh1bWJfZGltLmRzdF9kaW0ud2lkdGgsCisgICAgICAgICAgICBlbmNvZGVQYXJhbS50aHVtYl9kaW0uZHN0X2RpbS5oZWlnaHQpOworCisgICAgICAgIExPR0goIiNzcmMgYnVmczolZCAjIHRtYiBidWZzOiVkICNkc3RfYnVmczolZCIsCisgICAgICAgICAgICAgICAgICAgICBlbmNvZGVQYXJhbS5udW1fc3JjX2J1ZnMsZW5jb2RlUGFyYW0ubnVtX3RtYl9idWZzLGVuY29kZVBhcmFtLm51bV9kc3RfYnVmcyk7CisKKyAgICAgICAgcmV0ID0gbUpwZWdIYW5kbGUuY3JlYXRlX3Nlc3Npb24obUpwZWdDbGllbnRIYW5kbGUsICZlbmNvZGVQYXJhbSwgJm1KcGVnU2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgTE9HRSgiRXJyb3IgY3JlYXRpbmcgYSBuZXcganBlZyBlbmNvZGluZyBzZXNzaW9uLCByZXQgPSAlZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIG5lZWROZXdTZXNzID0gRkFMU0U7CisgICAgfQorCisgICAgLy8gRmlsbCBpbiBuZXcgam9iCisgICAgbWVtc2V0KCZqcGdfam9iLCAwLCBzaXplb2YobW1fanBlZ19qb2JfdCkpOworICAgIGpwZ19qb2Iuam9iX3R5cGUgPSBKUEVHX0pPQl9UWVBFX0VOQ09ERTsKKyAgICBqcGdfam9iLmVuY29kZV9qb2Iuc2Vzc2lvbl9pZCA9IG1KcGVnU2Vzc2lvbklkOworICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5zcmNfaW5kZXggPSAwOworICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5kc3RfaW5kZXggPSAwOworCisgICAgLy8gU2V0IG1haW4gZGltIGpvYiBwYXJhbWV0ZXJzIGFuZCBoYW5kbGUgcm90YXRpb24KKyAgICBpZiAoIW5lZWRKcGVnRXhpZlJvdGF0aW9uICYmIChqcGVnX3NldHRpbmdzLT5qcGVnX29yaWVudGF0aW9uID09IDkwIHx8CisgICAgICAgICAgICBqcGVnX3NldHRpbmdzLT5qcGVnX29yaWVudGF0aW9uID09IDI3MCkpIHsKKworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubWFpbl9kaW0uc3JjX2RpbS53aWR0aCA9IHNyY19kaW0uaGVpZ2h0OworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubWFpbl9kaW0uc3JjX2RpbS5oZWlnaHQgPSBzcmNfZGltLndpZHRoOworCisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tYWluX2RpbS5kc3RfZGltLndpZHRoID0gZHN0X2RpbS5oZWlnaHQ7CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tYWluX2RpbS5kc3RfZGltLmhlaWdodCA9IGRzdF9kaW0ud2lkdGg7CisKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm1haW5fZGltLmNyb3Aud2lkdGggPSBjcm9wLmhlaWdodDsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm1haW5fZGltLmNyb3AuaGVpZ2h0ID0gY3JvcC53aWR0aDsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm1haW5fZGltLmNyb3AubGVmdCA9IGNyb3AudG9wOworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubWFpbl9kaW0uY3JvcC50b3AgPSBjcm9wLmxlZnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm1haW5fZGltLnNyY19kaW0gPSBzcmNfZGltOworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubWFpbl9kaW0uZHN0X2RpbSA9IGRzdF9kaW07CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tYWluX2RpbS5jcm9wID0gY3JvcDsKKyAgICB9CisKKyAgICAvLyBnZXQgM2Egc3cgdmVyc2lvbiBpbmZvCisgICAgY2FtX3EzYV92ZXJzaW9uX3Qgc3dfdmVyc2lvbjsKKyAgICBtZW1zZXQoJnN3X3ZlcnNpb24sIDAsIHNpemVvZihzd192ZXJzaW9uKSk7CisgICAgaWYgKGhhbF9vYmopCisgICAgICAgIGhhbF9vYmotPmdldDNBVmVyc2lvbihzd192ZXJzaW9uKTsKKworICAgIC8vIGdldCBleGlmIGRhdGEKKyAgICBRQ2FtZXJhM0V4aWYgKnBKcGVnRXhpZk9iaiA9IGdldEV4aWZEYXRhKG1ldGFkYXRhLCBqcGVnX3NldHRpbmdzLCBuZWVkSnBlZ0V4aWZSb3RhdGlvbik7CisgICAganBlZ19qb2JfZGF0YS0+cEpwZWdFeGlmT2JqID0gcEpwZWdFeGlmT2JqOworICAgIGlmIChwSnBlZ0V4aWZPYmogIT0gTlVMTCkgeworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuZXhpZl9pbmZvLmV4aWZfZGF0YSA9IHBKcGVnRXhpZk9iai0+Z2V0RW50cmllcygpOworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuZXhpZl9pbmZvLm51bU9mRW50cmllcyA9CisgICAgICAgICAgICBwSnBlZ0V4aWZPYmotPmdldE51bU9mRW50cmllcygpOworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuZXhpZl9pbmZvLmRlYnVnX2RhdGEuc3dfM2FfdmVyc2lvblswXSA9CisgICAgICAgICAgICBzd192ZXJzaW9uLm1ham9yX3ZlcnNpb247CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5leGlmX2luZm8uZGVidWdfZGF0YS5zd18zYV92ZXJzaW9uWzFdID0KKyAgICAgICAgICAgIHN3X3ZlcnNpb24ubWlub3JfdmVyc2lvbjsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmV4aWZfaW5mby5kZWJ1Z19kYXRhLnN3XzNhX3ZlcnNpb25bMl0gPQorICAgICAgICAgICAgc3dfdmVyc2lvbi5wYXRjaF92ZXJzaW9uOworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuZXhpZl9pbmZvLmRlYnVnX2RhdGEuc3dfM2FfdmVyc2lvblszXSA9CisgICAgICAgICAgICBzd192ZXJzaW9uLm5ld19mZWF0dXJlX2RlczsKKyAgICB9CisKKyAgICAvLyB0aHVtYm5haWwgZGltCisgICAgTE9HSCgiVGh1bWJuYWlsIG5lZWRlZDolZCIsIG1fYlRodW1ibmFpbE5lZWRlZCk7CisgICAgaWYgKG1fYlRodW1ibmFpbE5lZWRlZCA9PSBUUlVFKSB7CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uZHN0X2RpbSA9CisgICAgICAgICAgICAgICAganBlZ19zZXR0aW5ncy0+dGh1bWJuYWlsX3NpemU7CisKKyAgICAgICAgaWYgKCFuZWVkSnBlZ0V4aWZSb3RhdGlvbiAmJiAoanBlZ19zZXR0aW5ncy0+anBlZ19vcmllbnRhdGlvbiA9PSA5MCB8fAorICAgICAgICAgICAgICAgIGpwZWdfc2V0dGluZ3MtPmpwZWdfb3JpZW50YXRpb24gPT0gMjcwKSkgeworICAgICAgICAgICAgLy9zd2FwIHRoZSB0aHVtYm5haWwgZGVzdGluYXRpb24gd2lkdGggYW5kIGhlaWdodCBpZiBpdCBoYXMKKyAgICAgICAgICAgIC8vYWxyZWFkeSBiZWVuIHJvdGF0ZWQKKyAgICAgICAgICAgIGludCB0ZW1wID0ganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2RpbS5kc3RfZGltLndpZHRoOworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2RpbS5kc3RfZGltLndpZHRoID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2RpbS5kc3RfZGltLmhlaWdodDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uZHN0X2RpbS5oZWlnaHQgPSB0ZW1wOworCisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IudGh1bWJfZGltLnNyY19kaW0ud2lkdGggPSBzcmNfZGltLmhlaWdodDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uc3JjX2RpbS5oZWlnaHQgPSBzcmNfZGltLndpZHRoOworCisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IudGh1bWJfZGltLmNyb3Aud2lkdGggPSBjcm9wLmhlaWdodDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uY3JvcC5oZWlnaHQgPSBjcm9wLndpZHRoOworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2RpbS5jcm9wLmxlZnQgPSBjcm9wLnRvcDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uY3JvcC50b3AgPSBjcm9wLmxlZnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uc3JjX2RpbSA9IHNyY19kaW07CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uY3JvcCA9IGNyb3A7CisgICAgICAgIH0KKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2luZGV4ID0gMDsKKyAgICB9CisKKyAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zID0gaGFsX29iai0+Z2V0M0FFeGlmUGFyYW1zKCk7CisgICAgZXhpZl9kZWJ1Z19wYXJhbXMgPSBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtczsKKyAgICAvLyBGaWxsIGluIGV4aWYgZGVidWcgZGF0YQorICAgIC8vIEFsbG9jYXRlIGZvciBhIGxvY2FsIGNvcHkgb2YgZGVidWcgcGFyYW1ldGVycworICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zID0KKyAgICAgICAgICAgIChtbV9qcGVnX2RlYnVnX2V4aWZfcGFyYW1zX3QgKikgbWFsbG9jIChzaXplb2YobW1fanBlZ19kZWJ1Z19leGlmX3BhcmFtc190KSk7CisgICAgaWYgKCFqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcykgeworICAgICAgICBMT0dFKCJPdXQgb2YgTWVtb3J5LiBBbGxvY2F0aW9uIGZhaWxlZCBmb3IgM0EgZGVidWcgZXhpZiBwYXJhbXMiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBqcGdfam9iLmVuY29kZV9qb2IubW9iaWNhdF9tYXNrID0gaGFsX29iai0+Z2V0TW9iaWNhdE1hc2soKTsKKworICAgIGlmIChtZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIC8vIEZpbGwgaW4gdGhlIG1ldGFkYXRhIHBhc3NlZCBhcyBwYXJhbWV0ZXIKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEgPSBtZXRhZGF0YTsKKworICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19tb2JpY2F0X2FlY19wYXJhbXNfdmFsaWQgPQorICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuY2FtXzNhX3BhcmFtc192YWxpZDsKKworICAgICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmNhbV8zYV9wYXJhbXNfdmFsaWQpIHsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5tb2JpY2F0X2FlY19wYXJhbXMgPQorICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuY2FtXzNhX3BhcmFtczsKKyAgICAgICB9CisKKyAgICAgICAgaWYgKGV4aWZfZGVidWdfcGFyYW1zKSB7CisgICAgICAgICAgICAvLyBDb3B5IGRlYnVnIHBhcmFtZXRlcnMgbG9jYWxseS4KKyAgICAgICAgICAgbWVtY3B5KGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgIGV4aWZfZGVidWdfcGFyYW1zLCAoc2l6ZW9mKG1tX2pwZWdfZGVidWdfZXhpZl9wYXJhbXNfdCkpKTsKKyAgICAgICAgICAgLyogU2F2ZSBhIGNvcHkgb2YgM0EgZGVidWcgcGFyYW1zICovCisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+aXNfc3RhdHNkZWJ1Z19hZV9wYXJhbXNfdmFsaWQgPQorICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YWVfZGVidWdfcGFyYW1zX3ZhbGlkOworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPmlzX3N0YXRzZGVidWdfYXdiX3BhcmFtc192YWxpZCA9CisgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5hd2JfZGVidWdfcGFyYW1zX3ZhbGlkOworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPmlzX3N0YXRzZGVidWdfYWZfcGFyYW1zX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmFmX2RlYnVnX3BhcmFtc192YWxpZDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19zdGF0c2RlYnVnX2FzZF9wYXJhbXNfdmFsaWQgPQorICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YXNkX2RlYnVnX3BhcmFtc192YWxpZDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19zdGF0c2RlYnVnX3N0YXRzX3BhcmFtc192YWxpZCA9CisgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5zdGF0c19kZWJ1Z19wYXJhbXNfdmFsaWQ7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+aXNfc3RhdHNkZWJ1Z19iZXN0YXRzX3BhcmFtc192YWxpZCA9CisgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iZXN0YXRzX2RlYnVnX3BhcmFtc192YWxpZDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19zdGF0c2RlYnVnX2JoaXN0X3BhcmFtc192YWxpZCA9CisgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iaGlzdF9kZWJ1Z19wYXJhbXNfdmFsaWQ7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+aXNfc3RhdHNkZWJ1Z18zYV90dW5pbmdfcGFyYW1zX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPnEzYV90dW5pbmdfZGVidWdfcGFyYW1zX3ZhbGlkOworCisgICAgICAgICAgICBpZiAoanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmFlX2RlYnVnX3BhcmFtc192YWxpZCkgeworICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5zdGF0c2RlYnVnX2FlX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmFlX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YXdiX2RlYnVnX3BhcmFtc192YWxpZCkgeworICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5zdGF0c2RlYnVnX2F3Yl9kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5hd2JfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5hZl9kZWJ1Z19wYXJhbXNfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+c3RhdHNkZWJ1Z19hZl9kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5hZl9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmFzZF9kZWJ1Z19wYXJhbXNfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+c3RhdHNkZWJ1Z19hc2RfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YXNkX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+c3RhdHNfZGVidWdfcGFyYW1zX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPnN0YXRzZGVidWdfc3RhdHNfYnVmZmVyX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPnN0YXRzX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YmVzdGF0c19kZWJ1Z19wYXJhbXNfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+c3RhdHNkZWJ1Z19iZXN0YXRzX2J1ZmZlcl9kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iZXN0YXRzX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+Ymhpc3RfZGVidWdfcGFyYW1zX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPnN0YXRzZGVidWdfYmhpc3RfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+Ymhpc3RfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5xM2FfdHVuaW5nX2RlYnVnX3BhcmFtc192YWxpZCkgeworICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5zdGF0c2RlYnVnXzNhX3R1bmluZ19kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5xM2FfdHVuaW5nX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgTE9HVygiTWV0YWRhdGEgaXMgbnVsbCIpOworICAgIH0KKworICAgIC8vIE11bHRpIGltYWdlIGluZm8KKyAgICBpZiAoaGFsX29iai0+aXNEZXZpY2VMaW5rZWQoKSA9PSBUUlVFKSB7CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tdWx0aV9pbWFnZV9pbmZvLnR5cGUgPSBNTV9KUEVHX1RZUEVfSlBFRzsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm11bHRpX2ltYWdlX2luZm8ubnVtX29mX2ltYWdlcyA9IDE7CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tdWx0aV9pbWFnZV9pbmZvLmVuYWJsZV9tZXRhZGF0YSA9IDE7CisgICAgICAgIGlmIChoYWxfb2JqLT5pc01haW5DYW1lcmEoKSA9PSBUUlVFKSB7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubXVsdGlfaW1hZ2VfaW5mby5pc19wcmltYXJ5ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tdWx0aV9pbWFnZV9pbmZvLmlzX3ByaW1hcnkgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAganBnX2pvYi5lbmNvZGVfam9iLmhhbF92ZXJzaW9uID0gQ0FNX0hBTF9WMzsKKworICAgIC8vU3RhcnQganBlZyBlbmNvZGluZworICAgIHJldCA9IG1KcGVnSGFuZGxlLnN0YXJ0X2pvYigmanBnX2pvYiwgJmpvYklkKTsKKyAgICBpZiAoanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgZnJlZShqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcyk7CisgICAgfQorICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gcmVtZW1iZXIgam9iIGluZm8KKyAgICAgICAganBlZ19qb2JfZGF0YS0+am9iSWQgPSBqb2JJZDsKKyAgICB9CisKKyAgICBMT0dEKCJYIik7CisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBlbmNvZGVEYXRhCisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIHByZXBhcmUgZW5jb2Rpbmcgam9iIGluZm9ybWF0aW9uIGFuZCBzZW5kIHRvCisgKiAgICAgICAgICAgICAgbW0tanBlZy1pbnRlcmZhY2UgdG8gZG8gdGhlIGVuY29kaW5nIGpvYgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAanBlZ19qb2JfZGF0YSA6IHB0ciB0byBhIHN0cnVjdCBzYXZpbmcgam9iIHJlbGF0ZWQgaW5mb3JtYXRpb24KKyAqICAgQG5lZWROZXdTZXNzICAgOiBmbGFnIHRvIGluZGljYXRlIGlmIGEgbmV3IGpwZWcgZW5jb2Rpbmcgc2Vzc2lvbiBuZWVkCisgKiAgICAgICAgICAgICAgICAgICAgdG8gYmUgY3JlYXRlZC4gQWZ0ZXIgY3JlYXRpb24sIHRoaXMgZmxhZyB3aWxsIGJlIHRvZ2dsZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzUG9zdFByb2Nlc3Nvcjo6ZW5jb2RlRGF0YShxY2FtZXJhX2hhbDNfanBlZ19kYXRhX3QgKmpwZWdfam9iX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgJm5lZWROZXdTZXNzKQoreworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTE9HRCgiRSIpOworICAgIGludDMyX3QgcmV0ID0gTk9fRVJST1I7CisgICAgbW1fanBlZ19qb2JfdCBqcGdfam9iOworICAgIHVpbnQzMl90IGpvYklkID0gMDsKKyAgICBRQ2FtZXJhM1N0cmVhbSAqbWFpbl9zdHJlYW0gPSBOVUxMOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1haW5fZnJhbWUgPSBOVUxMOworICAgIFFDYW1lcmEzQ2hhbm5lbCAqc3JjQ2hhbm5lbCA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSA9IE5VTEw7CisgICAgbWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhID0gTlVMTDsKKyAgICBqcGVnX3NldHRpbmdzX3QgKmpwZWdfc2V0dGluZ3MgPSBOVUxMOworICAgIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UqIGhhbF9vYmogPSBOVUxMOworICAgIG1tX2pwZWdfZGVidWdfZXhpZl9wYXJhbXNfdCAqZXhpZl9kZWJ1Z19wYXJhbXMgPSBOVUxMOworICAgIGlmIChtX3BhcmVudCAhPSBOVUxMKSB7CisgICAgICAgIGhhbF9vYmogPSAoUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZSopbV9wYXJlbnQtPm1Vc2VyRGF0YTsKKyAgICAgICAgaWYgKGhhbF9vYmogPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiaGFsX29iaiBpcyBOVUxMLCBFcnJvciIpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIm1fcGFyZW50IGlzIE5VTEwsIEVycm9yIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGJvb2wgbmVlZEpwZWdFeGlmUm90YXRpb24gPSBmYWxzZTsKKworICAgIHJlY3ZkX2ZyYW1lID0ganBlZ19qb2JfZGF0YS0+c3JjX2ZyYW1lOworICAgIG1ldGFkYXRhID0ganBlZ19qb2JfZGF0YS0+bWV0YWRhdGE7CisgICAganBlZ19zZXR0aW5ncyA9IGpwZWdfam9iX2RhdGEtPmpwZWdfc2V0dGluZ3M7CisKKyAgICBMT0dEKCJlbmNvZGluZyBidWZJbmRleDogJXUiLAorICAgICAgICBqcGVnX2pvYl9kYXRhLT5zcmNfZnJhbWUtPmJ1ZnNbMF0tPmJ1Zl9pZHgpOworCisgICAgUUNhbWVyYTNDaGFubmVsICpwQ2hhbm5lbCA9IE5VTEw7CisgICAgLy8gZmlyc3QgY2hlY2sgcGljdHVyZSBjaGFubmVsCisgICAgaWYgKG1fcGFyZW50LT5nZXRNeUhhbmRsZSgpID09IHJlY3ZkX2ZyYW1lLT5jaF9pZCkgeworICAgICAgICBwQ2hhbm5lbCA9IG1fcGFyZW50OworICAgIH0KKyAgICAvLyBjaGVjayByZXByb2Nlc3MgY2hhbm5lbCBpZiBub3QgZm91bmQKKyAgICBpZiAocENoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICBpZiAobV9wUmVwcm9jQ2hhbm5lbCAhPSBOVUxMICYmCisgICAgICAgICAgICBtX3BSZXByb2NDaGFubmVsLT5nZXRNeUhhbmRsZSgpID09IHJlY3ZkX2ZyYW1lLT5jaF9pZCkgeworICAgICAgICAgICAgcENoYW5uZWwgPSBtX3BSZXByb2NDaGFubmVsOworICAgICAgICB9CisgICAgfQorCisgICAgc3JjQ2hhbm5lbCA9IHBDaGFubmVsOworCisgICAgaWYgKHNyY0NoYW5uZWwgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJObyBjb3JyZXNwb25kaW5nIGNoYW5uZWwgKGNoX2lkID0gJWQpIGV4aXN0LCByZXR1cm4gaGVyZSIsCisgICAgICAgICAgICAgICByZWN2ZF9mcmFtZS0+Y2hfaWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIGZpbmQgc25hcHNob3QgZnJhbWUgYW5kIHRodW1uYWlsIGZyYW1lCisgICAgLy9Ob3RlOiBJbiB0aGlzIHZlcnNpb24gd2Ugd2lsbCByZWNlaXZlIG9ubHkgc25hcHNob3QgZnJhbWUuCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHJlY3ZkX2ZyYW1lLT5udW1fYnVmczsgaSsrKSB7CisgICAgICAgIFFDYW1lcmEzU3RyZWFtICpzcmNTdHJlYW0gPQorICAgICAgICAgICAgc3JjQ2hhbm5lbC0+Z2V0U3RyZWFtQnlIYW5kbGUocmVjdmRfZnJhbWUtPmJ1ZnNbaV0tPnN0cmVhbV9pZCk7CisgICAgICAgIGlmIChzcmNTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgc3dpdGNoIChzcmNTdHJlYW0tPmdldE15VHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVDoKKyAgICAgICAgICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX09GRkxJTkVfUFJPQzoKKyAgICAgICAgICAgICAgICBtYWluX3N0cmVhbSA9IHNyY1N0cmVhbTsKKyAgICAgICAgICAgICAgICBtYWluX2ZyYW1lID0gcmVjdmRfZnJhbWUtPmJ1ZnNbaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoTlVMTCA9PSBtYWluX2ZyYW1lKXsKKyAgICAgICBMT0dFKCJNYWluIGZyYW1lIGlzIE5VTEwiKTsKKyAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIFFDYW1lcmEzU3RyZWFtTWVtICptZW1PYmogPSAoUUNhbWVyYTNTdHJlYW1NZW0gKiltYWluX2ZyYW1lLT5tZW1faW5mbzsKKyAgICBpZiAoTlVMTCA9PSBtZW1PYmopIHsKKyAgICAgICAgTE9HRSgiTWVtZW9yeSBPYmogb2YgbWFpbiBmcmFtZSBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgLy8gY2xlYW4gYW5kIGludmFsaWRhdGUgY2FjaGUgb3BzIHRocm91Z2ggbWVtIG9iaiBvZiB0aGUgZnJhbWUKKyAgICBtZW1PYmotPmNsZWFuSW52YWxpZGF0ZUNhY2hlKG1haW5fZnJhbWUtPmJ1Zl9pZHgpOworCisgICAgaWYgKG1KcGVnQ2xpZW50SGFuZGxlIDw9IDApIHsKKyAgICAgICAgTE9HRSgiRXJyb3I6IGJ1ZyBoZXJlLCBtSnBlZ0NsaWVudEhhbmRsZSBpcyAwIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBjYW1fZGltZW5zaW9uX3Qgc3JjX2RpbTsKKyAgICBtZW1zZXQoJnNyY19kaW0sIDAsIHNpemVvZihjYW1fZGltZW5zaW9uX3QpKTsKKyAgICBtYWluX3N0cmVhbS0+Z2V0RnJhbWVEaW1lbnNpb24oc3JjX2RpbSk7CisKKyAgICBjYW1fZGltZW5zaW9uX3QgZHN0X2RpbTsKKyAgICBtZW1zZXQoJmRzdF9kaW0sIDAsIHNpemVvZihjYW1fZGltZW5zaW9uX3QpKTsKKyAgICBpZiAoTk9fRVJST1IgIT0gbV9wYXJlbnQtPmdldFN0cmVhbVNpemUoZHN0X2RpbSkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGdldCBzaXplIG9mIHRoZSBKUEVHIHN0cmVhbSIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBuZWVkSnBlZ0V4aWZSb3RhdGlvbiA9IGhhbF9vYmotPm5lZWRKcGVnRXhpZlJvdGF0aW9uKCk7CisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3JvdGF0aW9uX2luZm9fdCwgcm90YXRpb25faW5mbywgQ0FNX0lOVEZfUEFSTV9ST1RBVElPTiwgbWV0YWRhdGEpIHsKKyAgICAgICAgaWYgKGpwZWdfc2V0dGluZ3MtPmpwZWdfb3JpZW50YXRpb24gIT0gMCAmJiByb3RhdGlvbl9pbmZvLT5yb3RhdGlvbiA9PSBST1RBVEVfMCkgeworICAgICAgICAgICAgbmVlZEpwZWdFeGlmUm90YXRpb24gPSBUUlVFOworICAgICAgICAgICAgTE9HSCgiTmVlZCBFWElGIEpQRUcgUk9UQVRJT04iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFsdGhvdWdoIGluIEhBTDMsIGxlZ2FjeSBmbGlwIG1vZGUgaXMgbm90IGFkdmVydGlzZWQKKyAgICAvLyBkZWZhdWx0IHZhbHVlIG9mIENBTV9JTlRGX1BBUk1fRkxJUCBpcyBzdGlsbCBhZGRlZCBoZXJlCisgICAgLy8gZm9yIGpwZ2UgbWV0YWRhdGEKKyAgICBpbnQzMl90IGZsaXBNb2RlID0gMDsgLy8gbm8gZmxpcAorICAgIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0gobWV0YWRhdGEsIENBTV9JTlRGX1BBUk1fRkxJUCwgZmxpcE1vZGUpOworCisgICAgTE9HSCgiTmVlZCBuZXcgc2Vzc2lvbj86JWQiLCBuZWVkTmV3U2Vzcyk7CisgICAgaWYgKG5lZWROZXdTZXNzKSB7CisgICAgICAgIC8vY3JlYXRpbmcgYSBuZXcgc2Vzc2lvbiwgc28gd2UgbXVzdCBkZXN0cm95IHRoZSBvbGQgb25lCisgICAgICAgIGlmICggMCA8IG1KcGVnU2Vzc2lvbklkICkgeworICAgICAgICAgICAgcmV0ID0gbUpwZWdIYW5kbGUuZGVzdHJveV9zZXNzaW9uKG1KcGVnU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJFcnJvciBkZXN0cm95aW5nIGFuIG9sZCBqcGVnIGVuY29kaW5nIHNlc3Npb24sIGlkID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBtSnBlZ1Nlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1KcGVnU2Vzc2lvbklkID0gMDsKKyAgICAgICAgfQorICAgICAgICAvLyBjcmVhdGUganBlZyBlbmNvZGluZyBzZXNzaW9uCisgICAgICAgIG1tX2pwZWdfZW5jb2RlX3BhcmFtc190IGVuY29kZVBhcmFtOworICAgICAgICBtZW1zZXQoJmVuY29kZVBhcmFtLCAwLCBzaXplb2YobW1fanBlZ19lbmNvZGVfcGFyYW1zX3QpKTsKKyAgICAgICAgZ2V0SnBlZ0VuY29kZUNvbmZpZyhlbmNvZGVQYXJhbSwgbWFpbl9zdHJlYW0sIGpwZWdfc2V0dGluZ3MpOworICAgICAgICBMT0dIKCIjc3JjIGJ1ZnM6JWQgIyB0bWIgYnVmczolZCAjZHN0X2J1ZnM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgZW5jb2RlUGFyYW0ubnVtX3NyY19idWZzLGVuY29kZVBhcmFtLm51bV90bWJfYnVmcyxlbmNvZGVQYXJhbS5udW1fZHN0X2J1ZnMpOworICAgICAgICBpZiAoIW5lZWRKcGVnRXhpZlJvdGF0aW9uICYmCisgICAgICAgICAgICAoanBlZ19zZXR0aW5ncy0+anBlZ19vcmllbnRhdGlvbiA9PSA5MCB8fAorICAgICAgICAgICAganBlZ19zZXR0aW5ncy0+anBlZ19vcmllbnRhdGlvbiA9PSAyNzApKSB7CisgICAgICAgICAgIC8vc3dhcCBzcmMgd2lkdGggYW5kIGhlaWdodCwgc3RyaWRlIGFuZCBzY2FubGluZSBkdWUgdG8gcm90YXRpb24KKyAgICAgICAgICAgZW5jb2RlUGFyYW0ubWFpbl9kaW0uc3JjX2RpbS53aWR0aCA9IHNyY19kaW0uaGVpZ2h0OworICAgICAgICAgICBlbmNvZGVQYXJhbS5tYWluX2RpbS5zcmNfZGltLmhlaWdodCA9IHNyY19kaW0ud2lkdGg7CisgICAgICAgICAgIGVuY29kZVBhcmFtLnRodW1iX2RpbS5zcmNfZGltLndpZHRoID0gc3JjX2RpbS5oZWlnaHQ7CisgICAgICAgICAgIGVuY29kZVBhcmFtLnRodW1iX2RpbS5zcmNfZGltLmhlaWdodCA9IHNyY19kaW0ud2lkdGg7CisKKyAgICAgICAgICAgaW50MzJfdCB0ZW1wID0gZW5jb2RlUGFyYW0uc3JjX21haW5fYnVmWzBdLm9mZnNldC5tcFswXS5zdHJpZGU7CisgICAgICAgICAgIGVuY29kZVBhcmFtLnNyY19tYWluX2J1ZlswXS5vZmZzZXQubXBbMF0uc3RyaWRlID0KKyAgICAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX21haW5fYnVmWzBdLm9mZnNldC5tcFswXS5zY2FubGluZTsKKyAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX21haW5fYnVmWzBdLm9mZnNldC5tcFswXS5zY2FubGluZSA9IHRlbXA7CisKKyAgICAgICAgICAgdGVtcCA9IGVuY29kZVBhcmFtLnNyY190aHVtYl9idWZbMF0ub2Zmc2V0Lm1wWzBdLnN0cmlkZTsKKyAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX3RodW1iX2J1ZlswXS5vZmZzZXQubXBbMF0uc3RyaWRlID0KKyAgICAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX3RodW1iX2J1ZlswXS5vZmZzZXQubXBbMF0uc2NhbmxpbmU7CisgICAgICAgICAgIGVuY29kZVBhcmFtLnNyY190aHVtYl9idWZbMF0ub2Zmc2V0Lm1wWzBdLnNjYW5saW5lID0gdGVtcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgZW5jb2RlUGFyYW0ubWFpbl9kaW0uc3JjX2RpbSAgPSBzcmNfZGltOworICAgICAgICAgICBlbmNvZGVQYXJhbS50aHVtYl9kaW0uc3JjX2RpbSA9IHNyY19kaW07CisgICAgICAgIH0KKyAgICAgICAgZW5jb2RlUGFyYW0ubWFpbl9kaW0uZHN0X2RpbSA9IGRzdF9kaW07CisgICAgICAgIGVuY29kZVBhcmFtLnRodW1iX2RpbS5kc3RfZGltID0ganBlZ19zZXR0aW5ncy0+dGh1bWJuYWlsX3NpemU7CisKKyAgICAgICAgTE9HSSgiU3JjIEJ1ZmZlciBjbnQgPSAlZCwgcmVzID0gJWRYJWQgbGVuID0gJWQgcm90ID0gJWQgIgorICAgICAgICAgICAgInNyY19kaW0gPSAlZFglZCBkc3RfZGltID0gJWRYJWQiLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0ubnVtX3NyY19idWZzLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX21haW5fYnVmWzBdLm9mZnNldC5tcFswXS5zdHJpZGUsCisgICAgICAgICAgICBlbmNvZGVQYXJhbS5zcmNfbWFpbl9idWZbMF0ub2Zmc2V0Lm1wWzBdLnNjYW5saW5lLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX21haW5fYnVmWzBdLm9mZnNldC5mcmFtZV9sZW4sCisgICAgICAgICAgICBlbmNvZGVQYXJhbS5yb3RhdGlvbiwKKyAgICAgICAgICAgIHNyY19kaW0ud2lkdGgsIHNyY19kaW0uaGVpZ2h0LAorICAgICAgICAgICAgZHN0X2RpbS53aWR0aCwgZHN0X2RpbS5oZWlnaHQpOworICAgICAgICBMT0dJKCJTcmMgVEhVTUIgYnVmX2NudCA9ICVkLCByZXMgPSAlZFglZCBsZW4gPSAlZCByb3QgPSAlZCAiCisgICAgICAgICAgICAic3JjX2RpbSA9ICVkWCVkLCBkc3RfZGltID0gJWRYJWQiLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0ubnVtX3RtYl9idWZzLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX3RodW1iX2J1ZlswXS5vZmZzZXQubXBbMF0uc3RyaWRlLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0uc3JjX3RodW1iX2J1ZlswXS5vZmZzZXQubXBbMF0uc2NhbmxpbmUsCisgICAgICAgICAgICBlbmNvZGVQYXJhbS5zcmNfdGh1bWJfYnVmWzBdLm9mZnNldC5mcmFtZV9sZW4sCisgICAgICAgICAgICBlbmNvZGVQYXJhbS50aHVtYl9yb3RhdGlvbiwKKyAgICAgICAgICAgIGVuY29kZVBhcmFtLnRodW1iX2RpbS5zcmNfZGltLndpZHRoLAorICAgICAgICAgICAgZW5jb2RlUGFyYW0udGh1bWJfZGltLnNyY19kaW0uaGVpZ2h0LAorICAgICAgICAgICAgZW5jb2RlUGFyYW0udGh1bWJfZGltLmRzdF9kaW0ud2lkdGgsCisgICAgICAgICAgICBlbmNvZGVQYXJhbS50aHVtYl9kaW0uZHN0X2RpbS5oZWlnaHQpOworICAgICAgICByZXQgPSBtSnBlZ0hhbmRsZS5jcmVhdGVfc2Vzc2lvbihtSnBlZ0NsaWVudEhhbmRsZSwgJmVuY29kZVBhcmFtLCAmbUpwZWdTZXNzaW9uSWQpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciBjcmVhdGluZyBhIG5ldyBqcGVnIGVuY29kaW5nIHNlc3Npb24sIHJldCA9ICVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgbmVlZE5ld1Nlc3MgPSBGQUxTRTsKKyAgICB9CisKKyAgICAvLyBGaWxsIGluIG5ldyBqb2IKKyAgICBtZW1zZXQoJmpwZ19qb2IsIDAsIHNpemVvZihtbV9qcGVnX2pvYl90KSk7CisgICAganBnX2pvYi5qb2JfdHlwZSA9IEpQRUdfSk9CX1RZUEVfRU5DT0RFOworICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5zZXNzaW9uX2lkID0gbUpwZWdTZXNzaW9uSWQ7CisgICAganBnX2pvYi5lbmNvZGVfam9iLnNyY19pbmRleCA9IChpbnQzMl90KW1haW5fZnJhbWUtPmJ1Zl9pZHg7CisgICAganBnX2pvYi5lbmNvZGVfam9iLmRzdF9pbmRleCA9IDA7CisKKyAgICBjYW1fcmVjdF90IGNyb3A7CisgICAgbWVtc2V0KCZjcm9wLCAwLCBzaXplb2YoY2FtX3JlY3RfdCkpOworICAgIC8vVEJEX2xhdGVyIC0gWm9vbSBldmVudCByZW1vdmVkIGluIHN0cmVhbQorICAgIC8vbWFpbl9zdHJlYW0tPmdldENyb3BJbmZvKGNyb3ApOworCisgICAgLy8gU2V0IG1haW4gZGltIGpvYiBwYXJhbWV0ZXJzIGFuZCBoYW5kbGUgcm90YXRpb24KKyAgICBpZiAoIW5lZWRKcGVnRXhpZlJvdGF0aW9uICYmIChqcGVnX3NldHRpbmdzLT5qcGVnX29yaWVudGF0aW9uID09IDkwIHx8CisgICAgICAgICAgICBqcGVnX3NldHRpbmdzLT5qcGVnX29yaWVudGF0aW9uID09IDI3MCkpIHsKKworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubWFpbl9kaW0uc3JjX2RpbS53aWR0aCA9IHNyY19kaW0uaGVpZ2h0OworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubWFpbl9kaW0uc3JjX2RpbS5oZWlnaHQgPSBzcmNfZGltLndpZHRoOworCisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tYWluX2RpbS5kc3RfZGltLndpZHRoID0gZHN0X2RpbS5oZWlnaHQ7CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tYWluX2RpbS5kc3RfZGltLmhlaWdodCA9IGRzdF9kaW0ud2lkdGg7CisKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm1haW5fZGltLmNyb3Aud2lkdGggPSBjcm9wLmhlaWdodDsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm1haW5fZGltLmNyb3AuaGVpZ2h0ID0gY3JvcC53aWR0aDsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm1haW5fZGltLmNyb3AubGVmdCA9IGNyb3AudG9wOworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubWFpbl9kaW0uY3JvcC50b3AgPSBjcm9wLmxlZnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm1haW5fZGltLnNyY19kaW0gPSBzcmNfZGltOworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubWFpbl9kaW0uZHN0X2RpbSA9IGRzdF9kaW07CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tYWluX2RpbS5jcm9wID0gY3JvcDsKKyAgICB9CisKKyAgICAvLyBnZXQgM2Egc3cgdmVyc2lvbiBpbmZvCisgICAgY2FtX3EzYV92ZXJzaW9uX3Qgc3dfdmVyc2lvbjsKKyAgICBtZW1zZXQoJnN3X3ZlcnNpb24sIDAsIHNpemVvZihzd192ZXJzaW9uKSk7CisKKyAgICBpZiAoaGFsX29iaikKKyAgICAgICAgaGFsX29iai0+Z2V0M0FWZXJzaW9uKHN3X3ZlcnNpb24pOworCisgICAgLy8gZ2V0IGV4aWYgZGF0YQorICAgIFFDYW1lcmEzRXhpZiAqcEpwZWdFeGlmT2JqID0gZ2V0RXhpZkRhdGEobWV0YWRhdGEsIGpwZWdfc2V0dGluZ3MsIG5lZWRKcGVnRXhpZlJvdGF0aW9uKTsKKyAgICBqcGVnX2pvYl9kYXRhLT5wSnBlZ0V4aWZPYmogPSBwSnBlZ0V4aWZPYmo7CisgICAgaWYgKHBKcGVnRXhpZk9iaiAhPSBOVUxMKSB7CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5leGlmX2luZm8uZXhpZl9kYXRhID0gcEpwZWdFeGlmT2JqLT5nZXRFbnRyaWVzKCk7CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5leGlmX2luZm8ubnVtT2ZFbnRyaWVzID0KKyAgICAgICAgICAgIHBKcGVnRXhpZk9iai0+Z2V0TnVtT2ZFbnRyaWVzKCk7CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5leGlmX2luZm8uZGVidWdfZGF0YS5zd18zYV92ZXJzaW9uWzBdID0KKyAgICAgICAgICAgIHN3X3ZlcnNpb24ubWFqb3JfdmVyc2lvbjsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmV4aWZfaW5mby5kZWJ1Z19kYXRhLnN3XzNhX3ZlcnNpb25bMV0gPQorICAgICAgICAgICAgc3dfdmVyc2lvbi5taW5vcl92ZXJzaW9uOworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuZXhpZl9pbmZvLmRlYnVnX2RhdGEuc3dfM2FfdmVyc2lvblsyXSA9CisgICAgICAgICAgICBzd192ZXJzaW9uLnBhdGNoX3ZlcnNpb247CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5leGlmX2luZm8uZGVidWdfZGF0YS5zd18zYV92ZXJzaW9uWzNdID0KKyAgICAgICAgICAgIHN3X3ZlcnNpb24ubmV3X2ZlYXR1cmVfZGVzOworICAgIH0KKworICAgIC8vIHRodW1ibmFpbCBkaW0KKyAgICBMT0dIKCJUaHVtYm5haWwgbmVlZGVkOiVkIiwgbV9iVGh1bWJuYWlsTmVlZGVkKTsKKyAgICBpZiAobV9iVGh1bWJuYWlsTmVlZGVkID09IFRSVUUpIHsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2RpbS5kc3RfZGltID0KKyAgICAgICAgICAgICAgICBqcGVnX3NldHRpbmdzLT50aHVtYm5haWxfc2l6ZTsKKworICAgICAgaWYgKCFuZWVkSnBlZ0V4aWZSb3RhdGlvbiAmJgorICAgICAgICAgIChqcGVnX3NldHRpbmdzLT5qcGVnX29yaWVudGF0aW9uICA9PSA5MCB8fAorICAgICAgICAgICBqcGVnX3NldHRpbmdzLT5qcGVnX29yaWVudGF0aW9uID09IDI3MCkpIHsKKyAgICAgICAgICAgIC8vc3dhcCB0aGUgdGh1bWJuYWlsIGRlc3RpbmF0aW9uIHdpZHRoIGFuZCBoZWlnaHQgaWYgaXQgaGFzCisgICAgICAgICAgICAvL2FscmVhZHkgYmVlbiByb3RhdGVkCisgICAgICAgICAgICBpbnQgdGVtcCA9IGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uZHN0X2RpbS53aWR0aDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uZHN0X2RpbS53aWR0aCA9CisgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uZHN0X2RpbS5oZWlnaHQ7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IudGh1bWJfZGltLmRzdF9kaW0uaGVpZ2h0ID0gdGVtcDsKKworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2RpbS5zcmNfZGltLndpZHRoID0gc3JjX2RpbS5oZWlnaHQ7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IudGh1bWJfZGltLnNyY19kaW0uaGVpZ2h0ID0gc3JjX2RpbS53aWR0aDsKKworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2RpbS5jcm9wLndpZHRoID0gY3JvcC5oZWlnaHQ7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IudGh1bWJfZGltLmNyb3AuaGVpZ2h0ID0gY3JvcC53aWR0aDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uY3JvcC5sZWZ0ID0gY3JvcC50b3A7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IudGh1bWJfZGltLmNyb3AudG9wID0gY3JvcC5sZWZ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IudGh1bWJfZGltLnNyY19kaW0gPSBzcmNfZGltOworICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IudGh1bWJfZGltLmNyb3AgPSBjcm9wOworICAgICAgICB9CisgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9pbmRleCA9IG1haW5fZnJhbWUtPmJ1Zl9pZHg7CisgICAgICAgIExPR0koIlRodW1ibmFpbCBpZHggPSAlZCBzcmMgdy9oICglZHglZCksIGRzdCB3L2ggKCVkeCVkKSIsCisgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnRodW1iX2luZGV4LAorICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uc3JjX2RpbS53aWR0aCwKKyAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IudGh1bWJfZGltLnNyY19kaW0uaGVpZ2h0LAorICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uZHN0X2RpbS53aWR0aCwKKyAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IudGh1bWJfZGltLmRzdF9kaW0uaGVpZ2h0KTsKKyAgICB9CisgICAgTE9HSSgiTWFpbiBpbWFnZSBpZHggPSAlZCBzcmMgdy9oICglZHglZCksIGRzdCB3L2ggKCVkeCVkKSIsCisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2Iuc3JjX2luZGV4LAorICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm1haW5fZGltLnNyY19kaW0ud2lkdGgsCisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubWFpbl9kaW0uc3JjX2RpbS5oZWlnaHQsCisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubWFpbl9kaW0uZHN0X2RpbS53aWR0aCwKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tYWluX2RpbS5kc3RfZGltLmhlaWdodCk7CisKKyAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zID0gaGFsX29iai0+Z2V0M0FFeGlmUGFyYW1zKCk7CisgICAgZXhpZl9kZWJ1Z19wYXJhbXMgPSBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtczsKKworICAgIC8vIEFsbG9jYXRlIGZvciBhIGxvY2FsIGNvcHkgb2YgZGVidWcgcGFyYW1ldGVycworICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zID0KKyAgICAgICAgICAgIChtbV9qcGVnX2RlYnVnX2V4aWZfcGFyYW1zX3QgKikgbWFsbG9jIChzaXplb2YobW1fanBlZ19kZWJ1Z19leGlmX3BhcmFtc190KSk7CisgICAgaWYgKCFqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcykgeworICAgICAgICBMT0dFKCJPdXQgb2YgTWVtb3J5LiBBbGxvY2F0aW9uIGZhaWxlZCBmb3IgM0EgZGVidWcgZXhpZiBwYXJhbXMiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBqcGdfam9iLmVuY29kZV9qb2IubW9iaWNhdF9tYXNrID0gaGFsX29iai0+Z2V0TW9iaWNhdE1hc2soKTsKKworICAgIGlmIChtZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgICAgLy9GaWxsIGluIHRoZSBtZXRhZGF0YSBwYXNzZWQgYXMgcGFyYW1ldGVyCisgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEgPSBtZXRhZGF0YTsKKworICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19tb2JpY2F0X2FlY19wYXJhbXNfdmFsaWQgPQorICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuY2FtXzNhX3BhcmFtc192YWxpZDsKKworICAgICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmNhbV8zYV9wYXJhbXNfdmFsaWQpIHsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5tb2JpY2F0X2FlY19wYXJhbXMgPQorICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuY2FtXzNhX3BhcmFtczsKKyAgICAgICB9CisKKyAgICAgICBpZiAoZXhpZl9kZWJ1Z19wYXJhbXMpIHsKKyAgICAgICAgICAgIC8vIENvcHkgZGVidWcgcGFyYW1ldGVycyBsb2NhbGx5LgorICAgICAgICAgICBtZW1jcHkoanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgZXhpZl9kZWJ1Z19wYXJhbXMsIChzaXplb2YobW1fanBlZ19kZWJ1Z19leGlmX3BhcmFtc190KSkpOworICAgICAgICAgICAvKiBTYXZlIGEgY29weSBvZiAzQSBkZWJ1ZyBwYXJhbXMgKi8KKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19zdGF0c2RlYnVnX2FlX3BhcmFtc192YWxpZCA9CisgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5hZV9kZWJ1Z19wYXJhbXNfdmFsaWQ7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+aXNfc3RhdHNkZWJ1Z19hd2JfcGFyYW1zX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmF3Yl9kZWJ1Z19wYXJhbXNfdmFsaWQ7CisgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+aXNfc3RhdHNkZWJ1Z19hZl9wYXJhbXNfdmFsaWQgPQorICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YWZfZGVidWdfcGFyYW1zX3ZhbGlkOworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPmlzX3N0YXRzZGVidWdfYXNkX3BhcmFtc192YWxpZCA9CisgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5hc2RfZGVidWdfcGFyYW1zX3ZhbGlkOworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPmlzX3N0YXRzZGVidWdfc3RhdHNfcGFyYW1zX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPnN0YXRzX2RlYnVnX3BhcmFtc192YWxpZDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19zdGF0c2RlYnVnX2Jlc3RhdHNfcGFyYW1zX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmJlc3RhdHNfZGVidWdfcGFyYW1zX3ZhbGlkOworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPmlzX3N0YXRzZGVidWdfYmhpc3RfcGFyYW1zX3ZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmJoaXN0X2RlYnVnX3BhcmFtc192YWxpZDsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5pc19zdGF0c2RlYnVnXzNhX3R1bmluZ19wYXJhbXNfdmFsaWQgPQorICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+cTNhX3R1bmluZ19kZWJ1Z19wYXJhbXNfdmFsaWQ7CisKKyAgICAgICAgICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YWVfZGVidWdfcGFyYW1zX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPnN0YXRzZGVidWdfYWVfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YWVfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5hd2JfZGVidWdfcGFyYW1zX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPnN0YXRzZGVidWdfYXdiX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmF3Yl9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmFmX2RlYnVnX3BhcmFtc192YWxpZCkgeworICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5zdGF0c2RlYnVnX2FmX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmFmX2RlYnVnX3BhcmFtczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+YXNkX2RlYnVnX3BhcmFtc192YWxpZCkgeworICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5zdGF0c2RlYnVnX2FzZF9kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5hc2RfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5zdGF0c19kZWJ1Z19wYXJhbXNfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+c3RhdHNkZWJ1Z19zdGF0c19idWZmZXJfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcy0+c3RhdHNfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iZXN0YXRzX2RlYnVnX3BhcmFtc192YWxpZCkgeworICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5wX21ldGFkYXRhLT5zdGF0c2RlYnVnX2Jlc3RhdHNfYnVmZmVyX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPmJlc3RhdHNfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iaGlzdF9kZWJ1Z19wYXJhbXNfdmFsaWQpIHsKKyAgICAgICAgICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YS0+c3RhdHNkZWJ1Z19iaGlzdF9kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zLT5iaGlzdF9kZWJ1Z19wYXJhbXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoanBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPnEzYV90dW5pbmdfZGVidWdfcGFyYW1zX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLnBfbWV0YWRhdGEtPnN0YXRzZGVidWdfM2FfdHVuaW5nX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLmNhbV9leGlmX3BhcmFtcy5kZWJ1Z19wYXJhbXMtPnEzYV90dW5pbmdfZGVidWdfcGFyYW1zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICBMT0dXKCJNZXRhZGF0YSBpcyBudWxsIik7CisgICAgfQorCisgICAgLy8gTXVsdGkgaW1hZ2UgaW5mbworICAgIGlmIChoYWxfb2JqLT5pc0RldmljZUxpbmtlZCgpID09IFRSVUUpIHsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm11bHRpX2ltYWdlX2luZm8udHlwZSA9IE1NX0pQRUdfVFlQRV9KUEVHOworICAgICAgICBqcGdfam9iLmVuY29kZV9qb2IubXVsdGlfaW1hZ2VfaW5mby5udW1fb2ZfaW1hZ2VzID0gMTsKKyAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm11bHRpX2ltYWdlX2luZm8uZW5hYmxlX21ldGFkYXRhID0gMTsKKyAgICAgICAgaWYgKGhhbF9vYmotPmlzTWFpbkNhbWVyYSgpID09IFRSVUUpIHsKKyAgICAgICAgICAgIGpwZ19qb2IuZW5jb2RlX2pvYi5tdWx0aV9pbWFnZV9pbmZvLmlzX3ByaW1hcnkgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAganBnX2pvYi5lbmNvZGVfam9iLm11bHRpX2ltYWdlX2luZm8uaXNfcHJpbWFyeSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBqcGdfam9iLmVuY29kZV9qb2IuaGFsX3ZlcnNpb24gPSBDQU1fSEFMX1YzOworCisgICAgLy9TdGFydCBqcGVnIGVuY29kaW5nCisgICAgcmV0ID0gbUpwZWdIYW5kbGUuc3RhcnRfam9iKCZqcGdfam9iLCAmam9iSWQpOworICAgIGlmIChqcGdfam9iLmVuY29kZV9qb2IuY2FtX2V4aWZfcGFyYW1zLmRlYnVnX3BhcmFtcykgeworICAgICAgICBmcmVlKGpwZ19qb2IuZW5jb2RlX2pvYi5jYW1fZXhpZl9wYXJhbXMuZGVidWdfcGFyYW1zKTsKKyAgICB9CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAvLyByZW1lbWJlciBqb2IgaW5mbworICAgICAgICBqcGVnX2pvYl9kYXRhLT5qb2JJZCA9IGpvYklkOworICAgIH0KKworICAgIExPR0QoIlgiKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGRhdGFQcm9jZXNzUm91dGluZQorICoKKyAqIERFU0NSSVBUSU9OOiBkYXRhIHByb2Nlc3Mgcm91dGluZSB0aGF0IGhhbmRsZXMgaW5wdXQgZGF0YSBlaXRoZXIgZnJvbSBpbnB1dAorICogICAgICAgICAgICAgIEpwZWcgUXVldWUgdG8gZG8ganBlZyBlbmNvZGluZywgb3IgZnJvbSBpbnB1dCBQUCBRdWV1ZSB0byBkbworICogICAgICAgICAgICAgIHJlcHJvY2Vzcy4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRhdGEgICAgOiB1c2VyIGRhdGEgcHRyIChRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IpCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCAqUUNhbWVyYTNQb3N0UHJvY2Vzc29yOjpkYXRhUHJvY2Vzc1JvdXRpbmUodm9pZCAqZGF0YSkKK3sKKyAgICBpbnQgcnVubmluZyA9IDE7CisgICAgaW50IHJldDsKKyAgICB1aW50OF90IGlzX2FjdGl2ZSA9IEZBTFNFOworICAgIHVpbnQ4X3QgbmVlZE5ld1Nlc3MgPSBUUlVFOworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqbWV0YV9idWZmZXIgPSBOVUxMOworICAgIExPR0QoIkUiKTsKKyAgICBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IgKnBtZSA9IChRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IgKilkYXRhOworICAgIFFDYW1lcmFDbWRUaHJlYWQgKmNtZFRocmVhZCA9ICZwbWUtPm1fZGF0YVByb2NUaDsKKyAgICBjbWRUaHJlYWQtPnNldE5hbWUoImNhbV9kYXRhX3Byb2MiKTsKKworICAgIGRvIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcmV0ID0gY2FtX3NlbV93YWl0KCZjbWRUaHJlYWQtPmNtZF9zZW0pOworICAgICAgICAgICAgaWYgKHJldCAhPSAwICYmIGVycm5vICE9IEVJTlZBTCkgeworICAgICAgICAgICAgICAgIExPR0UoImNhbV9zZW1fd2FpdCBlcnJvciAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChyZXQgIT0gMCk7CisKKyAgICAgICAgLy8gd2UgZ290IG5vdGlmaWVkIGFib3V0IG5ldyBjbWQgYXZhaWwgaW4gY21kIHF1ZXVlCisgICAgICAgIGNhbWVyYV9jbWRfdHlwZV90IGNtZCA9IGNtZFRocmVhZC0+Z2V0Q21kKCk7CisgICAgICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBX0NNRF9UWVBFX1NUQVJUX0RBVEFfUFJPQzoKKyAgICAgICAgICAgIExPR0goInN0YXJ0IGRhdGEgcHJvYyIpOworICAgICAgICAgICAgaXNfYWN0aXZlID0gVFJVRTsKKyAgICAgICAgICAgIG5lZWROZXdTZXNzID0gVFJVRTsKKworICAgICAgICAgICAgcG1lLT5tX29uZ29pbmdQUFEuaW5pdCgpOworICAgICAgICAgICAgcG1lLT5tX2lucHV0SnBlZ1EuaW5pdCgpOworICAgICAgICAgICAgcG1lLT5tX2lucHV0UFBRLmluaXQoKTsKKyAgICAgICAgICAgIHBtZS0+bV9pbnB1dEZXS1BQUS5pbml0KCk7CisgICAgICAgICAgICBwbWUtPm1faW5wdXRNZXRhUS5pbml0KCk7CisgICAgICAgICAgICBjYW1fc2VtX3Bvc3QoJmNtZFRocmVhZC0+c3luY19zZW0pOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1RZUEVfU1RPUF9EQVRBX1BST0M6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTE9HSCgic3RvcCBkYXRhIHByb2MiKTsKKyAgICAgICAgICAgICAgICBpc19hY3RpdmUgPSBGQUxTRTsKKworICAgICAgICAgICAgICAgIC8vIGNhbmNlbCBhbGwgb25nb2luZyBqcGVnIGpvYnMKKyAgICAgICAgICAgICAgICBxY2FtZXJhX2hhbDNfanBlZ19kYXRhX3QgKmpwZWdfam9iID0KKyAgICAgICAgICAgICAgICAgICAgKHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCAqKXBtZS0+bV9vbmdvaW5nSnBlZ1EuZGVxdWV1ZSgpOworICAgICAgICAgICAgICAgIHdoaWxlIChqcGVnX2pvYiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHBtZS0+bUpwZWdIYW5kbGUuYWJvcnRfam9iKGpwZWdfam9iLT5qb2JJZCk7CisKKyAgICAgICAgICAgICAgICAgICAgcG1lLT5yZWxlYXNlSnBlZ0pvYkRhdGEoanBlZ19qb2IpOworICAgICAgICAgICAgICAgICAgICBmcmVlKGpwZWdfam9iKTsKKworICAgICAgICAgICAgICAgICAgICBqcGVnX2pvYiA9IChxY2FtZXJhX2hhbDNfanBlZ19kYXRhX3QgKilwbWUtPm1fb25nb2luZ0pwZWdRLmRlcXVldWUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBkZXN0cm95IGpwZWcgZW5jb2Rpbmcgc2Vzc2lvbgorICAgICAgICAgICAgICAgIGlmICggMCA8IHBtZS0+bUpwZWdTZXNzaW9uSWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHBtZS0+bUpwZWdIYW5kbGUuZGVzdHJveV9zZXNzaW9uKHBtZS0+bUpwZWdTZXNzaW9uSWQpOworICAgICAgICAgICAgICAgICAgICBwbWUtPm1KcGVnU2Vzc2lvbklkID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBuZWVkTmV3U2VzcyA9IFRSVUU7CisKKyAgICAgICAgICAgICAgICAvLyBmbHVzaCBvbmdvaW5nIHBvc3Rwcm9jIFF1ZXVlCisgICAgICAgICAgICAgICAgcG1lLT5tX29uZ29pbmdQUFEuZmx1c2goKTsKKworICAgICAgICAgICAgICAgIC8vIGZsdXNoIGlucHV0IGpwZWcgUXVldWUKKyAgICAgICAgICAgICAgICBwbWUtPm1faW5wdXRKcGVnUS5mbHVzaCgpOworCisgICAgICAgICAgICAgICAgLy8gZmx1c2ggaW5wdXQgUG9zdHByb2MgUXVldWUKKyAgICAgICAgICAgICAgICBwbWUtPm1faW5wdXRQUFEuZmx1c2goKTsKKworICAgICAgICAgICAgICAgIC8vIGZsdXNoIGZyYW1ld29yayBpbnB1dCBQb3N0cHJvYyBRdWV1ZQorICAgICAgICAgICAgICAgIHBtZS0+bV9pbnB1dEZXS1BQUS5mbHVzaCgpOworCisgICAgICAgICAgICAgICAgcG1lLT5tX2lucHV0TWV0YVEuZmx1c2goKTsKKworICAgICAgICAgICAgICAgIC8vIHNpZ25hbCBjbWQgaXMgY29tcGxldGVkCisgICAgICAgICAgICAgICAgY2FtX3NlbV9wb3N0KCZjbWRUaHJlYWQtPnN5bmNfc2VtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9DTURfVFlQRV9ET19ORVhUX0pPQjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMT0dIKCJEbyBuZXh0IGpvYiwgYWN0aXZlIGlzICVkIiwgaXNfYWN0aXZlKTsKKyAgICAgICAgICAgICAgICAvKiBuZWVkTmV3U2VzcyBpcyBzZXQgdG8gVFJVRSBhcyBwb3N0cHJvYyBpcyBub3QgcmUtU1RBUlRlZAorICAgICAgICAgICAgICAgICAqIGFueW1vcmUgZm9yIGV2ZXJ5IGNhcHR1cmVSZXF1ZXN0ICovCisgICAgICAgICAgICAgICAgbmVlZE5ld1Nlc3MgPSBUUlVFOworICAgICAgICAgICAgICAgIGlmIChpc19hY3RpdmUgPT0gVFJVRSkgeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhbnkgb25nb2luZyBqcGVnIGpvYnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBtZS0+bV9vbmdvaW5nSnBlZ1EuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dEKCJvbmdvaW5nIGpwZWcgcXVldWUgaXMgZW1wdHkgc28gZG9pbmcgdGhlIGpwZWcgam9iIik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBvbmdvaW5nIGpwZWcgam9iLCB3ZSBhcmUgZmluZSB0byBzZW5kIGpwZWcgZW5jb2Rpbmcgam9iCisgICAgICAgICAgICAgICAgICAgICAgICBxY2FtZXJhX2hhbDNfanBlZ19kYXRhX3QgKmpwZWdfam9iID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocWNhbWVyYV9oYWwzX2pwZWdfZGF0YV90ICopcG1lLT5tX2lucHV0SnBlZ1EuZGVxdWV1ZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBqcGVnX2pvYikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBpbnRvIG9uZ29pbmcganBlZyBqb2IgUQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+bV9vbmdvaW5nSnBlZ1EuZW5xdWV1ZSgodm9pZCAqKWpwZWdfam9iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqcGVnX2pvYi0+ZndrX2ZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHBtZS0+ZW5jb2RlRldLRGF0YShqcGVnX2pvYiwgbmVlZE5ld1Nlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHBtZS0+ZW5jb2RlRGF0YShqcGVnX2pvYiwgbmVlZE5ld1Nlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcXVldWUgdGhlIGxhc3Qgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+bV9vbmdvaW5nSnBlZ1EuZGVxdWV1ZShmYWxzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5yZWxlYXNlSnBlZ0pvYkRhdGEoanBlZ19qb2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKGpwZWdfam9iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGZyYW1ld29yayBwcCBqb2JzCisgICAgICAgICAgICAgICAgICAgIGlmICghcG1lLT5tX2lucHV0RldLUFBRLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICpmd2tfZnJhbWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICopIHBtZS0+bV9pbnB1dEZXS1BQUS5kZXF1ZXVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBmd2tfZnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY2FtZXJhX2hhbDNfcHBfZGF0YV90ICpwcF9qb2IgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHFjYW1lcmFfaGFsM19wcF9kYXRhX3QgKiltYWxsb2Moc2l6ZW9mKHFjYW1lcmFfaGFsM19wcF9kYXRhX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnX3NldHRpbmdzX3QgKmpwZWdfc2V0dGluZ3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpwZWdfc2V0dGluZ3NfdCAqKXBtZS0+bV9qcGVnU2V0dGluZ3NRLmRlcXVldWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHBfam9iICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBwX2pvYiwgMCwgc2l6ZW9mKHFjYW1lcmFfaGFsM19wcF9kYXRhX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfam9iLT5qcGVnX3NldHRpbmdzID0ganBlZ19zZXR0aW5nczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBtZS0+bV9wUmVwcm9jQ2hhbm5lbCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcG1lLT5tX3BSZXByb2NDaGFubmVsLT5vdmVycmlkZUZ3a01ldGFkYXRhKGZ3a19mcmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gZXh0cmFjdCBvdXRwdXQgY3JvcCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGludG8gb25nb2luZyBQUCBqb2IgUQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfam9iLT5md2tfc3JjX2ZyYW1lID0gZndrX2ZyYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5tX29uZ29pbmdQUFEuZW5xdWV1ZSgodm9pZCAqKXBwX2pvYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBwbWUtPm1fcFJlcHJvY0NoYW5uZWwtPmRvUmVwcm9jZXNzT2ZmbGluZShmd2tfZnJhbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIG9uZ29pbmcgUFAgam9iIFEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPm1fb25nb2luZ1BQUS5kZXF1ZXVlKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIlJlcHJvY2VzcyBjaGFubmVsIGlzIE5VTEwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgibm8gbWVtIGZvciBxY2FtZXJhX2hhbDNfcHBfZGF0YV90Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgwICE9IHJldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmVlIHBwX2pvYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHBfam9iICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocHBfam9iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmVlIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmd2tfZnJhbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShmd2tfZnJhbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgTE9HSCgiZGVxdWV1aW5nIHBwIGZyYW1lIik7CisgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcG1lLT5tUmVwcm9jSm9iTG9jayk7CisgICAgICAgICAgICAgICAgICAgIGlmKCFwbWUtPm1faW5wdXRQUFEuaXNFbXB0eSgpICYmICFwbWUtPm1faW5wdXRNZXRhUS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHFjYW1lcmFfaGFsM19wcF9idWZmZXJfdCAqcHBfYnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocWNhbWVyYV9oYWwzX3BwX2J1ZmZlcl90ICopcG1lLT5tX2lucHV0UFBRLmRlcXVldWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFfYnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICopcG1lLT5tX2lucHV0TWV0YVEuZGVxdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAganBlZ19zZXR0aW5nc190ICpqcGVnX3NldHRpbmdzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChqcGVnX3NldHRpbmdzX3QgKilwbWUtPm1fanBlZ1NldHRpbmdzUS5kZXF1ZXVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcG1lLT5tUmVwcm9jSm9iTG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBxY2FtZXJhX2hhbDNfcHBfZGF0YV90ICpwcF9qb2IgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxY2FtZXJhX2hhbDNfcHBfZGF0YV90ICopbWFsbG9jKHNpemVvZihxY2FtZXJhX2hhbDNfcHBfZGF0YV90KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHBfam9iID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJubyBtZW0gZm9yIHFjYW1lcmFfaGFsM19wcF9kYXRhX3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0YV9idWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoImZhaWxlZCB0byBkZXF1ZXVlIGZyb20gbV9pbnB1dE1ldGFRIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBwX2J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGRlcXVldWUgZnJvbSBtX2lucHV0UFBRIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBwX2J1ZmZlciAhPSBOVUxMKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocHBfam9iLCAwLCBzaXplb2YocWNhbWVyYV9oYWwzX3BwX2RhdGFfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwX2pvYi0+c3JjX2ZyYW1lID0gcHBfYnVmZmVyLT5pbnB1dDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcF9qb2ItPnNyY19tZXRhZGF0YSA9IG1ldGFfYnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhX2J1ZmZlci0+YnVmc1swXSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwX2pvYi0+bWV0YWRhdGEgPSAobWV0YWRhdGFfYnVmZmVyX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX2J1ZmZlci0+YnVmc1swXS0+YnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcF9qb2ItPmpwZWdfc2V0dGluZ3MgPSBqcGVnX3NldHRpbmdzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+bV9vbmdvaW5nUFBRLmVucXVldWUoKHZvaWQgKilwcF9qb2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbWUtPm1fcFJlcHJvY0NoYW5uZWwgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICptZXRhX2J1ZmZlcl9hcmcgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX2J1ZmZlcl9hcmcgPSBtZXRhX2J1ZmZlci0+YnVmc1swXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90IGZ3a19mcmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZmd2tfZnJhbWUsIDAsIHNpemVvZihxY2FtZXJhX2Z3a19pbnB1dF9wcF9kYXRhX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZndrX2ZyYW1lLmZyYW1lTnVtYmVyID0gcHBfYnVmZmVyLT5mcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcG1lLT5tX3BSZXByb2NDaGFubmVsLT5vdmVycmlkZU1ldGFkYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwX2J1ZmZlciwgbWV0YV9idWZmZXJfYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwX2pvYi0+anBlZ19zZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmd2tfZnJhbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgPT0gcmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgaW50byBvbmdvaW5nIFBQIGpvYiBRCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBwbWUtPm1fcFJlcHJvY0NoYW5uZWwtPmRvUmVwcm9jZXNzT2ZmbGluZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ3a19mcmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gb25nb2luZyBQUCBqb2IgUQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+bV9vbmdvaW5nUFBRLmRlcXVldWUoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiTm8gcmVwcm9jZXNzLiBDYWxsaW5nIHByb2Nlc3NQUERhdGEgZGlyZWN0bHkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcG1lLT5wcm9jZXNzUFBEYXRhKHBwX2J1ZmZlci0+aW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDAgIT0gcmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJlZSBwcF9qb2IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHBfam9iICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwcF9qb2IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmVlIGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBwX2J1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcF9idWZmZXItPmlucHV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPnJlbGVhc2VTdXBlckJ1ZihwcF9idWZmZXItPmlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocHBfYnVmZmVyLT5pbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwcF9idWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2ZyZWUgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBtZXRhX2J1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPm1fcGFyZW50LT5tZXRhZGF0YUJ1ZkRvbmUobWV0YV9idWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1ldGFfYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcF9idWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHBwX2J1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBtZS0+bVJlcHJvY0pvYkxvY2spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IGFjdGl2ZSwgc2ltcGx5IHJldHVybiBidWYgYW5kIGRvIG5vIG9wCisgICAgICAgICAgICAgICAgICAgIHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCAqanBlZ19qb2IgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCAqKXBtZS0+bV9pbnB1dEpwZWdRLmRlcXVldWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0ganBlZ19qb2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoanBlZ19qb2IpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcWNhbWVyYV9oYWwzX3BwX2J1ZmZlcl90KiBwcF9idWYgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxY2FtZXJhX2hhbDNfcHBfYnVmZmVyX3QgKilwbWUtPm1faW5wdXRQUFEuZGVxdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBwcF9idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcF9idWYtPmlucHV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5yZWxlYXNlU3VwZXJCdWYocHBfYnVmLT5pbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShwcF9idWYtPmlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcF9idWYtPmlucHV0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUocHBfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKm1ldGFkYXRhID0gKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqKXBtZS0+bV9pbnB1dE1ldGFRLmRlcXVldWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+bV9wYXJlbnQtPm1ldGFkYXRhQnVmRG9uZShtZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBxY2FtZXJhX2Z3a19pbnB1dF9wcF9kYXRhX3QgKmZ3a19mcmFtZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHFjYW1lcmFfZndrX2lucHV0X3BwX2RhdGFfdCAqKSBwbWUtPm1faW5wdXRGV0tQUFEuZGVxdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBmd2tfZnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoZndrX2ZyYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQV9DTURfVFlQRV9FWElUOgorICAgICAgICAgICAgcnVubmluZyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAocnVubmluZyk7CisgICAgTE9HRCgiWCIpOworICAgIHJldHVybiBOVUxMOworfQorCisvKiBFWElGIHJlbGF0ZWQgaGVscGVyIG1ldGhvZHMgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRSYXRpb25hbAorICoKKyAqIERFU0NSSVBUSU9OOiBjb21wb3NlIHJhdGlvbmFsIHN0cnVjdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmF0ICAgICA6IHB0ciB0byBzdHJ1Y3QgdG8gc3RvcmUgcmF0aW9uYWwgaW5mbworICogICBAbnVtICAgICA6bnVtIG9mIHRoZSByYXRpb25hbAorICogICBAZGVub20gICA6IGRlbm9tIG9mIHRoZSByYXRpb25hbAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgZ2V0UmF0aW9uYWwocmF0X3QgKnJhdCwgaW50IG51bSwgaW50IGRlbm9tKQoreworICAgIGlmICgoMCA+IG51bSkgfHwgKDAgPj0gZGVub20pKSB7CisgICAgICAgIExPR0UoIk5lZ2F0aXZlIHZhbHVlcyIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoTlVMTCA9PSByYXQpIHsKKyAgICAgICAgTE9HRSgiTlVMTCByYXQgaW5wdXQiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmF0LT5udW0gPSAodWludDMyX3QpbnVtOworICAgIHJhdC0+ZGVub20gPSAodWludDMyX3QpZGVub207CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHBhcnNlR1BTQ29vcmRpbmF0ZQorICoKKyAqIERFU0NSSVBUSU9OOiBwYXJzZSBHUFMgY29vcmRpbmF0ZSBzdHJpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNvb3JkX3N0ciA6IFtpbnB1dF0gY29vcmRpbmF0ZSBzdHJpbmcKKyAqICAgQGNvb3JkICAgICA6IFtvdXRwdXRdICBwdHIgdG8gc3RydWN0IHRvIHN0b3JlIGNvb3JkaW5hdGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgcGFyc2VHUFNDb29yZGluYXRlKGNvbnN0IGNoYXIgKmNvb3JkX3N0ciwgcmF0X3QqIGNvb3JkKQoreworICAgIGlmKGNvb3JkID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiZXJyb3IsIGludmFsaWQgYXJndW1lbnQgY29vcmQgPT0gTlVMTCIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBkb3VibGUgZGVnRiA9IGF0b2YoY29vcmRfc3RyKTsKKyAgICBpZiAoZGVnRiA8IDApIHsKKyAgICAgICAgZGVnRiA9IC1kZWdGOworICAgIH0KKyAgICBkb3VibGUgbWluRiA9IChkZWdGIC0gKGludCkgZGVnRikgKiA2MDsKKyAgICBkb3VibGUgc2VjRiA9IChtaW5GIC0gKGludCkgbWluRikgKiA2MDsKKworICAgIGdldFJhdGlvbmFsKCZjb29yZFswXSwgKGludClkZWdGLCAxKTsKKyAgICBnZXRSYXRpb25hbCgmY29vcmRbMV0sIChpbnQpbWluRiwgMSk7CisgICAgZ2V0UmF0aW9uYWwoJmNvb3JkWzJdLCAoaW50KShzZWNGICogMTAwMDApLCAxMDAwMCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEV4aWZEYXRlVGltZQorICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBleGlmIGRhdGUgdGltZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGF0ZVRpbWUgICA6IHN0cmluZyB0byBzdG9yZSBleGlmIGRhdGUgdGltZQorICogICBAc3Vic2VjVGltZSA6IHN0cmluZyB0byBzdG9yZSBleGlmIHN1YnNlYyB0aW1lCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBnZXRFeGlmRGF0ZVRpbWUoU3RyaW5nOCAmZGF0ZVRpbWUsIFN0cmluZzggJnN1YnNlY1RpbWUpCit7CisgICAgaW50MzJfdCByZXQgPSBOT19FUlJPUjsKKworICAgIC8vZ2V0IHRpbWUgYW5kIGRhdGUgZnJvbSBzeXN0ZW0KKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBzdHJ1Y3QgdG0gdGltZWluZm9fZGF0YTsKKworICAgIGludCByZXMgPSBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKyAgICBpZiAoMCA9PSByZXMpIHsKKyAgICAgICAgc3RydWN0IHRtICp0aW1laW5mbyA9IGxvY2FsdGltZV9yKCZ0di50dl9zZWMsICZ0aW1laW5mb19kYXRhKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gdGltZWluZm8pIHsKKyAgICAgICAgICAgIC8vV3JpdGUgZGF0ZXRpbWUgYWNjb3JkaW5nIHRvIEVYSUYgU3BlYworICAgICAgICAgICAgLy8iWVlZWTpNTTpERCBISDpNTTpTUyIgKDIwIGNoYXJzIGluY2x1ZGluZyBcMCkKKyAgICAgICAgICAgIGRhdGVUaW1lID0gU3RyaW5nODo6Zm9ybWF0KCIlMDRkOiUwMmQ6JTAyZCAlMDJkOiUwMmQ6JTAyZCIsCisgICAgICAgICAgICAgICAgICAgIHRpbWVpbmZvLT50bV95ZWFyICsgMTkwMCwgdGltZWluZm8tPnRtX21vbiArIDEsCisgICAgICAgICAgICAgICAgICAgIHRpbWVpbmZvLT50bV9tZGF5LCB0aW1laW5mby0+dG1faG91ciwKKyAgICAgICAgICAgICAgICAgICAgdGltZWluZm8tPnRtX21pbiwgdGltZWluZm8tPnRtX3NlYyk7CisgICAgICAgICAgICAvL1dyaXRlIHN1YnNlYyBhY2NvcmRpbmcgdG8gRVhJRiBTZXBjCisgICAgICAgICAgICBzdWJzZWNUaW1lID0gU3RyaW5nODo6Zm9ybWF0KCIlMDZsZCIsIHR2LnR2X3VzZWMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgibG9jYWx0aW1lX3IoKSBlcnJvciIpOworICAgICAgICAgICAgcmV0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoLTEgPT0gcmVzKSB7CisgICAgICAgIExPR0UoImdldHRpbWVvZmRheSgpIGVycm9yOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldCA9IFVOS05PV05fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiZ2V0dGltZW9mZGF5KCkgdW5leHBlY3RlZCByZXR1cm4gY29kZTogJWQiLCByZXMpOworICAgICAgICByZXQgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RXhpZkZvY2FsTGVuZ3RoCisgKgorICogREVTQ1JJUFRJT046IGdldCBleGlmIGZvY2FsIGxlbmd0aAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZm9jYWxMZW5ndGggOiBwdHIgdG8gcmF0aW9uYWwgc3RydWN0IHRvIHN0b3JlIGZvY2FsIGxlbmd0aAorICogICBAdmFsdWUgICAgICAgOiBmb2NhbCBsZW5ndGggdmFsdWUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IGdldEV4aWZGb2NhbExlbmd0aChyYXRfdCAqZm9jYWxMZW5ndGgsIGZsb2F0IHZhbHVlKQoreworICAgIGludCBmb2NhbExlbmd0aFZhbHVlID0KKyAgICAgICAgKGludCkodmFsdWUgKiBGT0NBTF9MRU5HVEhfREVDSU1BTF9QUkVDSVNJT04pOworICAgIHJldHVybiBnZXRSYXRpb25hbChmb2NhbExlbmd0aCwgZm9jYWxMZW5ndGhWYWx1ZSwgRk9DQUxfTEVOR1RIX0RFQ0lNQUxfUFJFQ0lTSU9OKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgKiBGVU5DVElPTiAgIDogZ2V0RXhpZkV4cFRpbWVJbmZvCisgICoKKyAgKiBERVNDUklQVElPTjogZ2V0IGV4aWYgZXhwb3N1cmUgdGltZSBpbmZvcm1hdGlvbgorICAqCisgICogUEFSQU1FVEVSUyA6CisgICogICBAZXhwb1RpbWVJbmZvICAgICA6IHJhdGlvbmFsIGV4cG9zdXJlIHRpbWUgdmFsdWUKKyAgKiAgIEB2YWx1ZSAgICAgICAgICAgIDogZXhwb3N1cmUgdGltZSB2YWx1ZQorICAqIFJFVFVSTiAgICAgOiBudDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBnZXRFeGlmRXhwVGltZUluZm8ocmF0X3QgKmV4cG9UaW1lSW5mbywgaW50NjRfdCB2YWx1ZSkKK3sKKworICAgIGludDY0X3QgY2FsX2V4cG9zdXJlVGltZTsKKyAgICBpZiAodmFsdWUgIT0gMCkKKyAgICAgICAgY2FsX2V4cG9zdXJlVGltZSA9IHZhbHVlOworICAgIGVsc2UKKyAgICAgICAgY2FsX2V4cG9zdXJlVGltZSA9IDYwOworCisgICAgcmV0dXJuIGdldFJhdGlvbmFsKGV4cG9UaW1lSW5mbywgMSwgKGludCljYWxfZXhwb3N1cmVUaW1lKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRFeGlmR3BzUHJvY2Vzc2luZ01ldGhvZAorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgR1BTIHByb2Nlc3NpbmcgbWV0aG9kCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBncHNQcm9jZXNzaW5nTWV0aG9kIDogc3RyaW5nIHRvIHN0b3JlIEdQUyBwcm9jZXNzIG1ldGhvZAorICogICBAY291bnQgICAgICAgICAgICAgICA6IGxlbmd0aCBvZiB0aGUgc3RyaW5nCisgKiAgIEB2YWx1ZSAgICAgICAgICAgICAgIDogdGhlIHZhbHVlIG9mIHRoZSBwcm9jZXNzaW5nIG1ldGhvZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgZ2V0RXhpZkdwc1Byb2Nlc3NpbmdNZXRob2QoY2hhciAqZ3BzUHJvY2Vzc2luZ01ldGhvZCwKKyAgICAgICAgdWludDMyX3QgJmNvdW50LCBjaGFyKiB2YWx1ZSkKK3sKKyAgICBpZih2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIG1lbWNweShncHNQcm9jZXNzaW5nTWV0aG9kLCBFeGlmQXNjaWlQcmVmaXgsIEVYSUZfQVNDSUlfUFJFRklYX1NJWkUpOworICAgICAgICBjb3VudCA9IEVYSUZfQVNDSUlfUFJFRklYX1NJWkU7CisgICAgICAgIHN0cmxjcHkoZ3BzUHJvY2Vzc2luZ01ldGhvZCArIEVYSUZfQVNDSUlfUFJFRklYX1NJWkUsCisgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgR1BTX1BST0NFU1NJTkdfTUVUSE9EX1NJWkUpOworICAgICAgICBjb3VudCArPSAodWludDMyX3Qpc3RybGVuKHZhbHVlKTsKKyAgICAgICAgZ3BzUHJvY2Vzc2luZ01ldGhvZFtjb3VudCsrXSA9ICdcMCc7IC8vIGluY3JlYXNlIDEgZm9yIHRoZSBsYXN0IE5VTEwgY2hhcgorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RXhpZkxhdGl0dWRlCisgKgorICogREVTQ1JJUFRJT046IGdldCBleGlmIGxhdGl0dWRlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBsYXRpdHVkZSA6IHB0ciB0byByYXRpb25hbCBzdHJ1Y3QgdG8gc3RvcmUgbGF0aXR1ZGUgaW5mbworICogICBAbGF0UmVmICAgOiBjaGFyYWN0ZXIgdG8gaW5kaWNhdGUgbGF0aXR1ZGUgcmVmZXJlbmNlCisgKiAgIEB2YWx1ZSAgICA6IHZhbHVlIG9mIHRoZSBsYXRpdHVkZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgZ2V0RXhpZkxhdGl0dWRlKHJhdF90ICpsYXRpdHVkZSwgY2hhciAqbGF0UmVmLCBkb3VibGUgdmFsdWUpCit7CisgICAgY2hhciBzdHJbMzBdOworICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlZiIsIHZhbHVlKTsKKyAgICBpZihzdHJbMF0gIT0gJ1wwJykgeworICAgICAgICBwYXJzZUdQU0Nvb3JkaW5hdGUoc3RyLCBsYXRpdHVkZSk7CisKKyAgICAgICAgLy9zZXQgTGF0aXR1ZGUgUmVmCisgICAgICAgIGZsb2F0IGxhdGl0dWRlVmFsdWUgPSBzdHJ0b2Yoc3RyLCAwKTsKKyAgICAgICAgaWYobGF0aXR1ZGVWYWx1ZSA8IDAuMGYpIHsKKyAgICAgICAgICAgIGxhdFJlZlswXSA9ICdTJzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxhdFJlZlswXSA9ICdOJzsKKyAgICAgICAgfQorICAgICAgICBsYXRSZWZbMV0gPSAnXDAnOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfWVsc2V7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEV4aWZMb25naXR1ZGUKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IGV4aWYgbG9uZ2l0dWRlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBsb25naXR1ZGUgOiBwdHIgdG8gcmF0aW9uYWwgc3RydWN0IHRvIHN0b3JlIGxvbmdpdHVkZSBpbmZvCisgKiAgIEBsb25SZWYgICAgOiBjaGFyYWN0ZXIgdG8gaW5kaWNhdGUgbG9uZ2l0dWRlIHJlZmVyZW5jZQorICogICBAdmFsdWUgICAgIDogdmFsdWUgb2YgdGhlIGxvbmdpdHVkZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgZ2V0RXhpZkxvbmdpdHVkZShyYXRfdCAqbG9uZ2l0dWRlLCBjaGFyICpsb25SZWYsIGRvdWJsZSB2YWx1ZSkKK3sKKyAgICBjaGFyIHN0clszMF07CisgICAgc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiVmIiwgdmFsdWUpOworICAgIGlmKHN0clswXSAhPSAnXDAnKSB7CisgICAgICAgIHBhcnNlR1BTQ29vcmRpbmF0ZShzdHIsIGxvbmdpdHVkZSk7CisKKyAgICAgICAgLy9zZXQgTG9uZ2l0dWRlIFJlZgorICAgICAgICBmbG9hdCBsb25naXR1ZGVWYWx1ZSA9IHN0cnRvZihzdHIsIDApOworICAgICAgICBpZihsb25naXR1ZGVWYWx1ZSA8IDAuMGYpIHsKKyAgICAgICAgICAgIGxvblJlZlswXSA9ICdXJzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvblJlZlswXSA9ICdFJzsKKyAgICAgICAgfQorICAgICAgICBsb25SZWZbMV0gPSAnXDAnOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfWVsc2V7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEV4aWZBbHRpdHVkZQorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgZXhpZiBhbHRpdHVkZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAYWx0aXR1ZGUgOiBwdHIgdG8gcmF0aW9uYWwgc3RydWN0IHRvIHN0b3JlIGFsdGl0dWRlIGluZm8KKyAqICAgQGFsdFJlZiAgIDogY2hhcmFjdGVyIHRvIGluZGljYXRlIGFsdGl0dWRlIHJlZmVyZW5jZQorICogICBAYXJnVmFsdWUgOiBhbHRpdHVkZSB2YWx1ZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgZ2V0RXhpZkFsdGl0dWRlKHJhdF90ICphbHRpdHVkZSwgY2hhciAqYWx0UmVmLCBkb3VibGUgYXJnVmFsdWUpCit7CisgICAgY2hhciBzdHJbMzBdOworICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlZiIsIGFyZ1ZhbHVlKTsKKyAgICBpZiAoc3RyWzBdICE9ICdcMCcpIHsKKyAgICAgICAgZG91YmxlIHZhbHVlID0gYXRvZihzdHIpOworICAgICAgICAqYWx0UmVmID0gMDsKKyAgICAgICAgaWYodmFsdWUgPCAwKXsKKyAgICAgICAgICAgICphbHRSZWYgPSAxOworICAgICAgICAgICAgdmFsdWUgPSAtdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFJhdGlvbmFsKGFsdGl0dWRlLCAoaW50KSh2YWx1ZSAqIDEwMDApLCAxMDAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRFeGlmR3BzRGF0ZVRpbWVTdGFtcAorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgZXhpZiBHUFMgZGF0ZSB0aW1lIHN0YW1wCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBncHNEYXRlU3RhbXAgOiBHUFMgZGF0ZSB0aW1lIHN0YW1wIHN0cmluZworICogICBAYnVmTGVuICAgICAgIDogbGVuZ3RoIG9mIHRoZSBzdHJpbmcKKyAqICAgQGdwc1RpbWVTdGFtcCA6IHB0ciB0byByYXRpb25hbCBzdHJ1Y3QgdG8gc3RvcmUgdGltZSBzdGFtcCBpbmZvCisgKiAgIEB2YWx1ZSAgICAgICAgOiB0aW1lc3RhbXAgdmFsdWUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IGdldEV4aWZHcHNEYXRlVGltZVN0YW1wKGNoYXIgKmdwc0RhdGVTdGFtcCwgdWludDMyX3QgYnVmTGVuLAorICAgICAgICByYXRfdCAqZ3BzVGltZVN0YW1wLCBpbnQ2NF90IHZhbHVlKQoreworICAgIGNoYXIgc3RyWzMwXTsKKyAgICBzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiJWxsZCIsIChsb25nIGxvbmcgaW50KXZhbHVlKTsKKyAgICBpZihzdHJbMF0gIT0gJ1wwJykgeworICAgICAgICB0aW1lX3QgdW5peFRpbWUgPSAodGltZV90KWF0b2woc3RyKTsKKyAgICAgICAgc3RydWN0IHRtICpVVENUaW1lc3RhbXAgPSBnbXRpbWUoJnVuaXhUaW1lKTsKKyAgICAgICAgaWYgKFVUQ1RpbWVzdGFtcCAhPSBOVUxMICYmIGdwc0RhdGVTdGFtcCAhPSBOVUxMCisgICAgICAgICAgICAgICAgJiYgZ3BzVGltZVN0YW1wICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0cmZ0aW1lKGdwc0RhdGVTdGFtcCwgYnVmTGVuLCAiJVk6JW06JWQiLCBVVENUaW1lc3RhbXApOworCisgICAgICAgICAgICBnZXRSYXRpb25hbCgmZ3BzVGltZVN0YW1wWzBdLCBVVENUaW1lc3RhbXAtPnRtX2hvdXIsIDEpOworICAgICAgICAgICAgZ2V0UmF0aW9uYWwoJmdwc1RpbWVTdGFtcFsxXSwgVVRDVGltZXN0YW1wLT50bV9taW4sIDEpOworICAgICAgICAgICAgZ2V0UmF0aW9uYWwoJmdwc1RpbWVTdGFtcFsyXSwgVVRDVGltZXN0YW1wLT50bV9zZWMsIDEpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiQ291bGQgbm90IGdldCB0aGUgdGltZXN0YW1wIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RXhpZkV4cG9zdXJlVmFsdWUKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IGV4aWYgR1BTIGRhdGUgdGltZSBzdGFtcAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZXhwb3N1cmVfdmFsICAgICAgICA6IHJhdGlvbmFsIGV4cG9zdXJlIHZhbHVlCisgKiAgIEBleHBvc3VyZV9jb21wICAgICAgIDogZXhwb3N1cmUgY29tcGVuc2F0aW9uCisgKiAgIEBzdGVwICAgICAgICAgICAgICAgIDogZXhwb3N1cmUgc3RlcAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgZ2V0RXhpZkV4cG9zdXJlVmFsdWUoc3JhdF90KiBleHBvc3VyZV92YWwsIGludDMyX3QgZXhwb3N1cmVfY29tcCwKKyAgICAgICAgY2FtX3JhdGlvbmFsX3R5cGVfdCBzdGVwKQoreworICAgIGV4cG9zdXJlX3ZhbC0+bnVtID0gZXhwb3N1cmVfY29tcCAqIHN0ZXAubnVtZXJhdG9yOworICAgIGV4cG9zdXJlX3ZhbC0+ZGVub20gPSBzdGVwLmRlbm9taW5hdG9yOworICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEV4aWZEYXRhCisgKgorICogREVTQ1JJUFRJT046IGdldCBleGlmIGRhdGEgdG8gYmUgcGFzc2VkIGludG8ganBlZyBlbmNvZGluZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogQG1ldGFkYXRhICAgICAgOiBtZXRhZGF0YSBvZiB0aGUgZW5jb2RpbmcgcmVxdWVzdAorICogQGpwZWdfc2V0dGluZ3MgOiBqcGVnX3NldHRpbmdzIGZvciBlbmNvZGluZworICogQG5lZWRKcGVnRXhpZlJvdGF0aW9uOiBjaGVjayBpZiByb3RhdGlvbiBuZWVkIHRvIGFkZGVkIGluIEVYSUYKKyAqCisgKiBSRVRVUk4gICAgIDogZXhpZiBkYXRhIGZyb20gdXNlciBzZXR0aW5nIGFuZCBHUFMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNFeGlmICpRQ2FtZXJhM1Bvc3RQcm9jZXNzb3I6OmdldEV4aWZEYXRhKG1ldGFkYXRhX2J1ZmZlcl90ICptZXRhZGF0YSwKKyAgICAgICAganBlZ19zZXR0aW5nc190ICpqcGVnX3NldHRpbmdzLCBib29sIG5lZWRKcGVnRXhpZlJvdGF0aW9uKQoreworICAgIFFDYW1lcmEzRXhpZiAqZXhpZiA9IG5ldyBRQ2FtZXJhM0V4aWYoKTsKKyAgICBpZiAoZXhpZiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgUUNhbWVyYTNFeGlmIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlKiBoYWxfb2JqID0gTlVMTDsKKyAgICBpZiAobV9wYXJlbnQgIT0gTlVMTCkgeworICAgICAgICBoYWxfb2JqID0gKFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2UqKW1fcGFyZW50LT5tVXNlckRhdGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgibV9wYXJlbnQgaXMgTlVMTCwgRXJyb3IiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIHVpbnQzMl90IGNvdW50ID0gMDsKKworICAgIC8vIGFkZCBleGlmIGVudHJpZXMKKyAgICBTdHJpbmc4IGRhdGVUaW1lOworICAgIFN0cmluZzggc3Vic2VjVGltZTsKKyAgICByYyA9IGdldEV4aWZEYXRlVGltZShkYXRlVGltZSwgc3Vic2VjVGltZSk7CisgICAgaWYgKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9EQVRFX1RJTUUsIEVYSUZfQVNDSUksCisgICAgICAgICAgICAgICAgKHVpbnQzMl90KShkYXRlVGltZS5sZW5ndGgoKSArIDEpLCAodm9pZCAqKWRhdGVUaW1lLnN0cmluZygpKTsKKyAgICAgICAgZXhpZi0+YWRkRW50cnkoRVhJRlRBR0lEX0VYSUZfREFURV9USU1FX09SSUdJTkFMLCBFWElGX0FTQ0lJLAorICAgICAgICAgICAgICAgICh1aW50MzJfdCkoZGF0ZVRpbWUubGVuZ3RoKCkgKyAxKSwgKHZvaWQgKilkYXRlVGltZS5zdHJpbmcoKSk7CisgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9FWElGX0RBVEVfVElNRV9ESUdJVElaRUQsIEVYSUZfQVNDSUksCisgICAgICAgICAgICAgICAgKHVpbnQzMl90KShkYXRlVGltZS5sZW5ndGgoKSArIDEpLCAodm9pZCAqKWRhdGVUaW1lLnN0cmluZygpKTsKKyAgICAgICAgZXhpZi0+YWRkRW50cnkoRVhJRlRBR0lEX1NVQlNFQ19USU1FLCBFWElGX0FTQ0lJLAorICAgICAgICAgICAgICAgICh1aW50MzJfdCkoc3Vic2VjVGltZS5sZW5ndGgoKSArIDEpLCAodm9pZCAqKXN1YnNlY1RpbWUuc3RyaW5nKCkpOworICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfU1VCU0VDX1RJTUVfT1JJR0lOQUwsIEVYSUZfQVNDSUksCisgICAgICAgICAgICAgICAgKHVpbnQzMl90KShzdWJzZWNUaW1lLmxlbmd0aCgpICsgMSksICh2b2lkICopc3Vic2VjVGltZS5zdHJpbmcoKSk7CisgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9TVUJTRUNfVElNRV9ESUdJVElaRUQsIEVYSUZfQVNDSUksCisgICAgICAgICAgICAgICAgKHVpbnQzMl90KShzdWJzZWNUaW1lLmxlbmd0aCgpICsgMSksICh2b2lkICopc3Vic2VjVGltZS5zdHJpbmcoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVygiZ2V0RXhpZkRhdGVUaW1lIGZhaWxlZCIpOworICAgIH0KKworCisgICAgaWYgKG1ldGFkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoZmxvYXQsIGZvY2FsX2xlbmd0aCwgQ0FNX0lOVEZfTUVUQV9MRU5TX0ZPQ0FMX0xFTkdUSCwgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIHJhdF90IGZvY2FsTGVuZ3RoOworICAgICAgICAgICAgcmMgPSBnZXRFeGlmRm9jYWxMZW5ndGgoJmZvY2FsTGVuZ3RoLCAqZm9jYWxfbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9GT0NBTF9MRU5HVEgsCisgICAgICAgICAgICAgICAgICAgICAgICBFWElGX1JBVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJihmb2NhbExlbmd0aCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJnZXRFeGlmRm9jYWxMZW5ndGggZmFpbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCBpc29TcGVlZCwgQ0FNX0lOVEZfTUVUQV9TRU5TT1JfU0VOU0lUSVZJVFksIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBpbnQxNl90IGZ3a19pc29TcGVlZCA9IChpbnQxNl90KSAqaXNvU3BlZWQ7CisgICAgICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfSVNPX1NQRUVEX1JBVElORywgRVhJRl9TSE9SVCwgMSwgKHZvaWQgKikgJihmd2tfaXNvU3BlZWQpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50NjRfdCwgc2Vuc29yX2V4cG9zdXJlX3RpbWUsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9TRU5TT1JfRVhQT1NVUkVfVElNRSwgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIHJhdF90IHNlbnNvckV4cFRpbWU7CisgICAgICAgICAgICByYyA9IGdldEV4aWZFeHBUaW1lSW5mbygmc2Vuc29yRXhwVGltZSwgKnNlbnNvcl9leHBvc3VyZV90aW1lKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBOT19FUlJPUil7CisgICAgICAgICAgICAgICAgZXhpZi0+YWRkRW50cnkoRVhJRlRBR0lEX0VYUE9TVVJFX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICBFWElGX1JBVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJihzZW5zb3JFeHBUaW1lKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR1coImdldEV4aWZFeHBUaW1lSW5mbyBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNoYXIqIGpwZWdfZ3BzX3Byb2Nlc3NpbmdfbWV0aG9kID0ganBlZ19zZXR0aW5ncy0+Z3BzX3Byb2Nlc3NpbmdfbWV0aG9kOworICAgICAgICBpZiAoc3RybGVuKGpwZWdfZ3BzX3Byb2Nlc3NpbmdfbWV0aG9kKSA+IDApIHsKKyAgICAgICAgICAgIGNoYXIgZ3BzUHJvY2Vzc2luZ01ldGhvZFtFWElGX0FTQ0lJX1BSRUZJWF9TSVpFICsKKyAgICAgICAgICAgICAgICAgICAgR1BTX1BST0NFU1NJTkdfTUVUSE9EX1NJWkVdOworICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgcmMgPSBnZXRFeGlmR3BzUHJvY2Vzc2luZ01ldGhvZChncHNQcm9jZXNzaW5nTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAganBlZ19ncHNfcHJvY2Vzc2luZ19tZXRob2QpOworICAgICAgICAgICAgaWYocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfR1BTX1BST0NFU1NJTkdNRVRIT0QsCisgICAgICAgICAgICAgICAgICAgICAgICBFWElGX0FTQ0lJLAorICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWdwc1Byb2Nlc3NpbmdNZXRob2QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dXKCJnZXRFeGlmR3BzUHJvY2Vzc2luZ01ldGhvZCBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChqcGVnX3NldHRpbmdzLT5ncHNfY29vcmRpbmF0ZXNfdmFsaWQpIHsKKworICAgICAgICAgICAgLy9sYXRpdHVkZQorICAgICAgICAgICAgcmF0X3QgbGF0aXR1ZGVbM107CisgICAgICAgICAgICBjaGFyIGxhdFJlZlsyXTsKKyAgICAgICAgICAgIHJjID0gZ2V0RXhpZkxhdGl0dWRlKGxhdGl0dWRlLCBsYXRSZWYsCisgICAgICAgICAgICAgICAgICAgIGpwZWdfc2V0dGluZ3MtPmdwc19jb29yZGluYXRlc1swXSk7CisgICAgICAgICAgICBpZihyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9HUFNfTEFUSVRVREUsCisgICAgICAgICAgICAgICAgICAgICAgICBFWElGX1JBVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbGF0aXR1ZGUpOworICAgICAgICAgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9HUFNfTEFUSVRVREVfUkVGLAorICAgICAgICAgICAgICAgICAgICAgICAgRVhJRl9BU0NJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWxhdFJlZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR1coImdldEV4aWZMYXRpdHVkZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9sb25naXR1ZGUKKyAgICAgICAgICAgIHJhdF90IGxvbmdpdHVkZVszXTsKKyAgICAgICAgICAgIGNoYXIgbG9uUmVmWzJdOworICAgICAgICAgICAgcmMgPSBnZXRFeGlmTG9uZ2l0dWRlKGxvbmdpdHVkZSwgbG9uUmVmLAorICAgICAgICAgICAgICAgICAgICBqcGVnX3NldHRpbmdzLT5ncHNfY29vcmRpbmF0ZXNbMV0pOworICAgICAgICAgICAgaWYocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfR1BTX0xPTkdJVFVERSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYSUZfUkFUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAzLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilsb25naXR1ZGUpOworCisgICAgICAgICAgICAgICAgZXhpZi0+YWRkRW50cnkoRVhJRlRBR0lEX0dQU19MT05HSVRVREVfUkVGLAorICAgICAgICAgICAgICAgICAgICAgICAgRVhJRl9BU0NJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWxvblJlZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR1coImdldEV4aWZMb25naXR1ZGUgZmFpbGVkIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vYWx0aXR1ZGUKKyAgICAgICAgICAgIHJhdF90IGFsdGl0dWRlOworICAgICAgICAgICAgY2hhciBhbHRSZWY7CisgICAgICAgICAgICByYyA9IGdldEV4aWZBbHRpdHVkZSgmYWx0aXR1ZGUsICZhbHRSZWYsCisgICAgICAgICAgICAgICAgICAgIGpwZWdfc2V0dGluZ3MtPmdwc19jb29yZGluYXRlc1syXSk7CisgICAgICAgICAgICBpZihyYyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9HUFNfQUxUSVRVREUsCisgICAgICAgICAgICAgICAgICAgICAgICBFWElGX1JBVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJihhbHRpdHVkZSkpOworCisgICAgICAgICAgICAgICAgZXhpZi0+YWRkRW50cnkoRVhJRlRBR0lEX0dQU19BTFRJVFVERV9SRUYsCisgICAgICAgICAgICAgICAgICAgICAgICBFWElGX0JZVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmYWx0UmVmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HVygiZ2V0RXhpZkFsdGl0dWRlIGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGpwZWdfc2V0dGluZ3MtPmdwc190aW1lc3RhbXBfdmFsaWQpIHsKKworICAgICAgICAgICAgY2hhciBncHNEYXRlU3RhbXBbMjBdOworICAgICAgICAgICAgcmF0X3QgZ3BzVGltZVN0YW1wWzNdOworICAgICAgICAgICAgcmMgPSBnZXRFeGlmR3BzRGF0ZVRpbWVTdGFtcChncHNEYXRlU3RhbXAsIDIwLCBncHNUaW1lU3RhbXAsCisgICAgICAgICAgICAgICAgICAgIGpwZWdfc2V0dGluZ3MtPmdwc190aW1lc3RhbXApOworICAgICAgICAgICAgaWYocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfR1BTX0RBVEVTVEFNUCwgRVhJRl9BU0NJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoc3RybGVuKGdwc0RhdGVTdGFtcCkgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopZ3BzRGF0ZVN0YW1wKTsKKworICAgICAgICAgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9HUFNfVElNRVNUQU1QLAorICAgICAgICAgICAgICAgICAgICAgICAgRVhJRl9SQVRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWdwc1RpbWVTdGFtcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR1coImdldEV4aWZHcHNEYXRhVGltZVN0YW1wIGZhaWxlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgZXhwb3N1cmVfY29tcCwgQ0FNX0lOVEZfUEFSTV9FWFBPU1VSRV9DT01QRU5TQVRJT04sIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fcmF0aW9uYWxfdHlwZV90LCBjb21wX3N0ZXAsIENBTV9JTlRGX1BBUk1fRVZfU1RFUCwgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICBzcmF0X3QgZXhwb3N1cmVfdmFsOworICAgICAgICAgICAgICAgIHJjID0gZ2V0RXhpZkV4cG9zdXJlVmFsdWUoJmV4cG9zdXJlX3ZhbCwgKmV4cG9zdXJlX2NvbXAsICpjb21wX3N0ZXApOworICAgICAgICAgICAgICAgIGlmKHJjID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9FWFBPU1VSRV9CSUFTX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYSUZfU1JBVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikoJmV4cG9zdXJlX3ZhbCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPR1coImdldEV4aWZFeHBvc3VyZVZhbHVlIGZhaWxlZCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dXKCJubyBtZXRhZGF0YSBwcm92aWRlZCAiKTsKKyAgICB9CisKKyNpZmRlZiBFTkFCTEVfTU9ERUxfSU5GT19FWElGCisKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgicm8ucHJvZHVjdC5tYW51ZmFjdHVyZXIiLCB2YWx1ZSwgIlFDT00tQUEiKSA+IDApIHsKKyAgICAgICAgZXhpZi0+YWRkRW50cnkoRVhJRlRBR0lEX01BS0UsIEVYSUZfQVNDSUksCisgICAgICAgICAgICAgICAgKHVpbnQzMl90KShzdHJsZW4odmFsdWUpICsgMSksICh2b2lkICopdmFsdWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR1coImdldEV4aWZNYWtlciBmYWlsZWQiKTsKKyAgICB9CisKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJyby5wcm9kdWN0Lm1vZGVsIiwgdmFsdWUsICJRQ0FNLUFBIikgPiAwKSB7CisgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9NT0RFTCwgRVhJRl9BU0NJSSwKKyAgICAgICAgICAgICAgICAodWludDMyX3QpKHN0cmxlbih2YWx1ZSkgKyAxKSwgKHZvaWQgKil2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVygiZ2V0RXhpZk1vZGVsIGZhaWxlZCIpOworICAgIH0KKworICAgIGlmIChwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLmRlc2NyaXB0aW9uIiwgdmFsdWUsICJRQ0FNLUFBIikgPiAwKSB7CisgICAgICAgIGV4aWYtPmFkZEVudHJ5KEVYSUZUQUdJRF9TT0ZUV0FSRSwgRVhJRl9BU0NJSSwKKyAgICAgICAgICAgICAgICAodWludDMyX3QpKHN0cmxlbih2YWx1ZSkgKyAxKSwgKHZvaWQgKil2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HVygiZ2V0RXhpZlNvZnR3YXJlIGZhaWxlZCIpOworICAgIH0KKworI2VuZGlmCisKKyAgICBpZiAoanBlZ19zZXR0aW5ncy0+aW1hZ2VfZGVzY192YWxpZCkgeworICAgICAgICBpZiAoZXhpZi0+YWRkRW50cnkoRVhJRlRBR0lEX0lNQUdFX0RFU0NSSVBUSU9OLCBFWElGX0FTQ0lJLAorICAgICAgICAgICAgICAgIHN0cmxlbihqcGVnX3NldHRpbmdzLT5pbWFnZV9kZXNjKSsxLAorICAgICAgICAgICAgICAgICh2b2lkICopanBlZ19zZXR0aW5ncy0+aW1hZ2VfZGVzYykpIHsKKyAgICAgICAgICAgIExPR1coIkFkZGluZyBJTUFHRV9ERVNDUklQVElPTiB0YWcgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobmVlZEpwZWdFeGlmUm90YXRpb24pIHsKKyAgICAgICAgaW50MTZfdCBvcmllbnRhdGlvbjsKKyAgICAgICAgc3dpdGNoIChqcGVnX3NldHRpbmdzLT5qcGVnX29yaWVudGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MDoKKyAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3MDoKKyAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDg7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBleGlmLT5hZGRFbnRyeShFWElGVEFHSURfT1JJRU5UQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgIEVYSUZfU0hPUlQsCisgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJm9yaWVudGF0aW9uKTsKKyAgICAgICAgZXhpZi0+YWRkRW50cnkoRVhJRlRBR0lEX1ROX09SSUVOVEFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICBFWElGX1NIT1JULAorICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZvcmllbnRhdGlvbik7CisKKyAgICB9CisKKyAgICByZXR1cm4gZXhpZjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhM0V4aWYKKyAqCisgKiBERVNDUklQVElPTjogY29uc3RydWN0b3Igb2YgUUNhbWVyYTNFeGlmCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhM0V4aWY6OlFDYW1lcmEzRXhpZigpCisgICAgOiBtX25OdW1FbnRyaWVzKDApCit7CisgICAgbWVtc2V0KG1fRW50cmllcywgMCwgc2l6ZW9mKG1fRW50cmllcykpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhM0V4aWYKKyAqCisgKiBERVNDUklQVElPTjogZGVjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhM0V4aWYuIFdpbGwgcmVsZWFzZSBpbnRlcm5hbCBtZW1vcnkgcHRyLgorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNFeGlmOjp+UUNhbWVyYTNFeGlmKCkKK3sKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uTnVtRW50cmllczsgaSsrKSB7CisgICAgICAgIHN3aXRjaCAobV9FbnRyaWVzW2ldLnRhZ19lbnRyeS50eXBlKSB7CisgICAgICAgICAgICBjYXNlIEVYSUZfQllURToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX0VudHJpZXNbaV0udGFnX2VudHJ5LmNvdW50ID4gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fYnl0ZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX2J5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fYnl0ZXMgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFWElGX0FTQ0lJOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fYXNjaWkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX2FzY2lpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fYXNjaWkgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFWElGX1NIT1JUOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fRW50cmllc1tpXS50YWdfZW50cnkuY291bnQgPiAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9FbnRyaWVzW2ldLnRhZ19lbnRyeS5kYXRhLl9zaG9ydHMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX3Nob3J0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX3Nob3J0cyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVYSUZfTE9ORzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX0VudHJpZXNbaV0udGFnX2VudHJ5LmNvdW50ID4gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fbG9uZ3MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX2xvbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fbG9uZ3MgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFWElGX1JBVElPTkFMOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fRW50cmllc1tpXS50YWdfZW50cnkuY291bnQgPiAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9FbnRyaWVzW2ldLnRhZ19lbnRyeS5kYXRhLl9yYXRzICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobV9FbnRyaWVzW2ldLnRhZ19lbnRyeS5kYXRhLl9yYXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fcmF0cyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVYSUZfVU5ERUZJTkVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fdW5kZWZpbmVkICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUobV9FbnRyaWVzW2ldLnRhZ19lbnRyeS5kYXRhLl91bmRlZmluZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9FbnRyaWVzW2ldLnRhZ19lbnRyeS5kYXRhLl91bmRlZmluZWQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBFWElGX1NMT05HOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fRW50cmllc1tpXS50YWdfZW50cnkuY291bnQgPiAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9FbnRyaWVzW2ldLnRhZ19lbnRyeS5kYXRhLl9zbG9uZ3MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX3Nsb25ncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX0VudHJpZXNbaV0udGFnX2VudHJ5LmRhdGEuX3Nsb25ncyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVYSUZfU1JBVElPTkFMOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fRW50cmllc1tpXS50YWdfZW50cnkuY291bnQgPiAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9FbnRyaWVzW2ldLnRhZ19lbnRyeS5kYXRhLl9zcmF0cyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG1fRW50cmllc1tpXS50YWdfZW50cnkuZGF0YS5fc3JhdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9FbnRyaWVzW2ldLnRhZ19lbnRyeS5kYXRhLl9zcmF0cyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR1coIkVycm9yLCBVbmtub3duIHR5cGUiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBhZGRFbnRyeQorICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byBhZGQgYW4gZW50cnkgdG8gZXhpZiBkYXRhCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB0YWdpZCAgIDogZXhpZiB0YWcgSUQKKyAqICAgQHR5cGUgICAgOiBkYXRhIHR5cGUKKyAqICAgQGNvdW50ICAgOiBudW1iZXIgb2YgZGF0YSBpbiB1aW50IG9mIGl0cyB0eXBlCisgKiAgIEBkYXRhICAgIDogaW5wdXQgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzRXhpZjo6YWRkRW50cnkoZXhpZl90YWdfaWRfdCB0YWdpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aWZfdGFnX3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBpZihtX25OdW1FbnRyaWVzID49IE1BWF9IQUwzX0VYSUZfVEFCTEVfRU5UUklFUykgeworICAgICAgICBMT0dFKCJOdW1iZXIgb2YgZW50cmllcyBleGNlZWRlZCBsaW1pdCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfaWQgPSB0YWdpZDsKKyAgICBtX0VudHJpZXNbbV9uTnVtRW50cmllc10udGFnX2VudHJ5LnR5cGUgPSB0eXBlOworICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuY291bnQgPSBjb3VudDsKKyAgICBtX0VudHJpZXNbbV9uTnVtRW50cmllc10udGFnX2VudHJ5LmNvcHkgPSAxOworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEVYSUZfQllURToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnZhbHVlcyA9ICh1aW50OF90ICopbWFsbG9jKGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIGJ5dGUgYXJyYXkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHZhbHVlcywgZGF0YSwgY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9FbnRyaWVzW21fbk51bUVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9ieXRlcyA9IHZhbHVlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fYnl0ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAqKHVpbnQ4X3QgKilkYXRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVYSUZfQVNDSUk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciAqc3RyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzdHIgPSAoY2hhciAqKW1hbGxvYyhjb3VudCArIDEpOworICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIGFzY2lpIHN0cmluZyIpOworICAgICAgICAgICAgICAgICAgICByYyA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoc3RyLCAwLCBjb3VudCArIDEpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc3RyLCBkYXRhLCBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fYXNjaWkgPSBzdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVhJRl9TSE9SVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAqZXhpZl9kYXRhID0gKHVpbnQxNl90ICopZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICp2YWx1ZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90ICopbWFsbG9jKGNvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBzaG9ydCBhcnJheSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkodmFsdWVzLCBleGlmX2RhdGEsIGNvdW50ICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX0VudHJpZXNbbV9uTnVtRW50cmllc10udGFnX2VudHJ5LmRhdGEuX3Nob3J0cyA9IHZhbHVlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fc2hvcnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKih1aW50MTZfdCAqKWRhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVhJRl9MT05HOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVpbnQzMl90ICpleGlmX2RhdGEgPSAodWludDMyX3QgKilkYXRhOworICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnZhbHVlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKiltYWxsb2MoY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIGxvbmcgYXJyYXkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHZhbHVlcywgZXhpZl9kYXRhLCBjb3VudCAqIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9FbnRyaWVzW21fbk51bUVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9sb25ncyA9IHZhbHVlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fbG9uZyA9CisgICAgICAgICAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFWElGX1JBVElPTkFMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJhdF90ICpleGlmX2RhdGEgPSAocmF0X3QgKilkYXRhOworICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmF0X3QgKnZhbHVlcyA9IChyYXRfdCAqKW1hbGxvYyhjb3VudCAqIHNpemVvZihyYXRfdCkpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgcmF0aW9uYWwgYXJyYXkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHZhbHVlcywgZXhpZl9kYXRhLCBjb3VudCAqIHNpemVvZihyYXRfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9FbnRyaWVzW21fbk51bUVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9yYXRzID0gdmFsdWVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbV9FbnRyaWVzW21fbk51bUVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9yYXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKihyYXRfdCAqKWRhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVhJRl9VTkRFRklORUQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqdmFsdWVzID0gKHVpbnQ4X3QgKiltYWxsb2MoY291bnQpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIHVuZGVmaW5lZCBhcnJheSIpOworICAgICAgICAgICAgICAgICAgICByYyA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkodmFsdWVzLCBkYXRhLCBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fdW5kZWZpbmVkID0gdmFsdWVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVYSUZfU0xPTkc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50MzJfdCAqZXhpZl9kYXRhID0gKGludDMyX3QgKilkYXRhOworICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqdmFsdWVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90ICopbWFsbG9jKGNvdW50ICogc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIHNpZ25lZCBsb25nIGFycmF5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSh2YWx1ZXMsIGV4aWZfZGF0YSwgY291bnQgKiBzaXplb2YoaW50MzJfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9FbnRyaWVzW21fbk51bUVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9zbG9uZ3MgPXZhbHVlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fc2xvbmcgPQorICAgICAgICAgICAgICAgICAgICAgICAgKihpbnQzMl90ICopZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFWElGX1NSQVRJT05BTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcmF0X3QgKmV4aWZfZGF0YSA9IChzcmF0X3QgKilkYXRhOworICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgc3JhdF90ICp2YWx1ZXMgPSAoc3JhdF90ICopbWFsbG9jKGNvdW50ICogc2l6ZW9mKHNyYXRfdCkpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3Igc2lnbiByYXRpb25hbCBhcnJheSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkodmFsdWVzLCBleGlmX2RhdGEsIGNvdW50ICogc2l6ZW9mKHNyYXRfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9FbnRyaWVzW21fbk51bUVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9zcmF0cyA9IHZhbHVlczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1fRW50cmllc1ttX25OdW1FbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fc3JhdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNyYXRfdCAqKWRhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dFKCJFcnJvciwgVW5rbm93biB0eXBlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBJbmNyZWFzZSBudW1iZXIgb2YgZW50cmllcworICAgIG1fbk51bUVudHJpZXMrKzsKKyAgICByZXR1cm4gcmM7Cit9CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1Bvc3RQcm9jLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1Bvc3RQcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY2MTI2ZgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzUG9zdFByb2MuaApAQCAtMCwwICsxLDE5MiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIF9fUUNhbWVyYTNfUE9TVFBST0NfSF9fCisjZGVmaW5lIF9fUUNhbWVyYTNfUE9TVFBST0NfSF9fCisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmEzLmgiCisjaW5jbHVkZSAiUUNhbWVyYTNIQUxIZWFkZXIuaCIKKyNpbmNsdWRlICJRQ2FtZXJhQ21kVGhyZWFkLmgiCisjaW5jbHVkZSAiUUNhbWVyYVF1ZXVlLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJtbV9qcGVnX2ludGVyZmFjZS5oIgorfQorCituYW1lc3BhY2UgcWNhbWVyYSB7CisKK2NsYXNzIFFDYW1lcmEzRXhpZjsKK2NsYXNzIFFDYW1lcmEzUHJvY2Vzc2luZ0NoYW5uZWw7CitjbGFzcyBRQ2FtZXJhM1JlcHJvY2Vzc0NoYW5uZWw7CitjbGFzcyBRQ2FtZXJhM1N0cmVhbTsKK2NsYXNzIFFDYW1lcmEzU3RyZWFtTWVtOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3Qgc3JjX2ZyYW1lOy8vIHNvdXJjZSBmcmFtZQorICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgbWV0YWRhdGFfYnVmZmVyOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgaW5wdXRfYnVmZmVyOworICAgIHJlcHJvY2Vzc19jb25maWdfdCByZXByb2NfY29uZmlnOworICAgIGJ1ZmZlcl9oYW5kbGVfdCAqb3V0cHV0X2J1ZmZlcjsKKyAgICB1aW50MzJfdCBmcmFtZU51bWJlcjsKK30gcWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgam9iSWQ7ICAgICAgICAgICAgICAgICAgLy8gam9iIElECisgICAgdWludDMyX3QgY2xpZW50X2hkbDsgICAgICAgICAgICAgLy8gaGFuZGxlIG9mIGpwZWcgY2xpZW50IChvYnRhaW5lZCB3aGVuIG9wZW4ganBlZykKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnNyY19mcmFtZTsvLyBzb3VyY2UgZnJhbWUgKG5lZWQgdG8gYmUgcmV0dXJuZWQgYmFjayB0byBrZXJuZWwgYWZ0ZXIgZG9uZSkKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnNyY19yZXByb2NfZnJhbWU7IC8vIG9yaWdpbmFsIHNvdXJjZSBmcmFtZSBmb3IgcmVwcm9jIGlmIG5vdCBOVUxMCisgICAgcWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICpmd2tfZnJhbWU7IC8vIHNvdXJjZSBmcmFtZXdvcmsgYnVmZmVyCisgICAgcWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICpmd2tfc3JjX2J1ZmZlcjsgLy8gb3JpZ2luYWwgZnJhbWV3b3JrIHNvdXJjZSBmcmFtZSBmb3IgcmVwcm9jCisgICAgUUNhbWVyYTNFeGlmICpwSnBlZ0V4aWZPYmo7CisgICAgbWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhOworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3JjX21ldGFkYXRhOworICAgIGpwZWdfc2V0dGluZ3NfdCAqanBlZ19zZXR0aW5nczsKK30gcWNhbWVyYV9oYWwzX2pwZWdfZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgam9iSWQ7ICAgICAgICAgICAgICAgICAgLy8gam9iIElECisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzcmNfZnJhbWU7Ly8gc291cmNlIGZyYW1lIChuZWVkIHRvIGJlIHJldHVybmVkIGJhY2sgdG8ga2VybmVsIGFmdGVyIGRvbmUpCisgICAgcWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICpmd2tfc3JjX2ZyYW1lOy8vIHNvdXJjZSBmcmFtZQorICAgIG1ldGFkYXRhX2J1ZmZlcl90ICptZXRhZGF0YTsKKyAgICBqcGVnX3NldHRpbmdzX3QgKmpwZWdfc2V0dGluZ3M7CisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzcmNfbWV0YWRhdGE7Cit9IHFjYW1lcmFfaGFsM19wcF9kYXRhX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmlucHV0OworICAgIGJ1ZmZlcl9oYW5kbGVfdCAqb3V0cHV0OworICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyOworfSBxY2FtZXJhX2hhbDNfcHBfYnVmZmVyX3Q7CisKKyNkZWZpbmUgTUFYX0hBTDNfRVhJRl9UQUJMRV9FTlRSSUVTIDIzCitjbGFzcyBRQ2FtZXJhM0V4aWYKK3sKK3B1YmxpYzoKKyAgICBRQ2FtZXJhM0V4aWYoKTsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhM0V4aWYoKTsKKworICAgIGludDMyX3QgYWRkRW50cnkoZXhpZl90YWdfaWRfdCB0YWdpZCwKKyAgICAgICAgICAgICAgICAgICAgIGV4aWZfdGFnX3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhKTsKKyAgICB1aW50MzJfdCBnZXROdW1PZkVudHJpZXMoKSB7cmV0dXJuIG1fbk51bUVudHJpZXM7fTsKKyAgICBRRVhJRl9JTkZPX0RBVEEgKmdldEVudHJpZXMoKSB7cmV0dXJuIG1fRW50cmllczt9OworCitwcml2YXRlOgorICAgIFFFWElGX0lORk9fREFUQSBtX0VudHJpZXNbTUFYX0hBTDNfRVhJRl9UQUJMRV9FTlRSSUVTXTsgIC8vIGV4aWYgdGFncyBmb3IgSlBFRyBlbmNvZGVyCisgICAgdWludDMyX3QgIG1fbk51bUVudHJpZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiB2YWxpZCBlbnRyaWVzCit9OworCitjbGFzcyBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IKK3sKK3B1YmxpYzoKKyAgICBRQ2FtZXJhM1Bvc3RQcm9jZXNzb3IoUUNhbWVyYTNQcm9jZXNzaW5nQ2hhbm5lbCAqY2hfY3RybCk7CisgICAgdmlydHVhbCB+UUNhbWVyYTNQb3N0UHJvY2Vzc29yKCk7CisKKyAgICBpbnQzMl90IGluaXQoUUNhbWVyYTNTdHJlYW1NZW0gKm1NZW1vcnkpOworICAgIGludDMyX3QgaW5pdEpwZWcoanBlZ19lbmNvZGVfY2FsbGJhY2tfdCBqcGVnX2NiLAorICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90ICptX21heF9waWNfZGltLAorICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKyAgICBpbnQzMl90IGRlaW5pdCgpOworICAgIGludDMyX3Qgc3RhcnQoY29uc3QgcmVwcm9jZXNzX2NvbmZpZ190ICZjb25maWcpOworICAgIGludDMyX3Qgc3RvcCgpOworICAgIGludDMyX3QgZmx1c2goKTsKKyAgICBpbnQzMl90IHByb2Nlc3NEYXRhKHFjYW1lcmFfZndrX2lucHV0X3BwX2RhdGFfdCAqZnJhbWUpOworICAgIGludDMyX3QgcHJvY2Vzc0RhdGEobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICppbnB1dCwKKyAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqb3V0cHV0LCB1aW50MzJfdCBmcmFtZU51bWJlcik7CisgICAgaW50MzJfdCBwcm9jZXNzRGF0YShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmlucHV0KTsKKyAgICBpbnQzMl90IHByb2Nlc3NQUERhdGEobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSk7CisgICAgaW50MzJfdCBwcm9jZXNzUFBNZXRhZGF0YShtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnJlcHJvY19tZXRhKTsKKyAgICBpbnQzMl90IHByb2Nlc3NKcGVnU2V0dGluZ0RhdGEoanBlZ19zZXR0aW5nc190ICpqcGVnX3NldHRpbmdzKTsKKyAgICBxY2FtZXJhX2hhbDNfcHBfZGF0YV90ICpkZXF1ZXVlUFBKb2IodWludDMyX3QgZnJhbWVOdW1iZXIpOworICAgIHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCAqZmluZEpwZWdKb2JCeUpvYklkKHVpbnQzMl90IGpvYklkKTsKKyAgICB2b2lkIHJlbGVhc2VKcGVnSm9iRGF0YShxY2FtZXJhX2hhbDNfanBlZ19kYXRhX3QgKmpvYik7CisgICAgaW50MzJfdCByZWxlYXNlT2ZmbGluZUJ1ZmZlcnMoYm9vbCBhbGwpOworICAgIHZvaWQgcmVsZWFzZVBQSm9iRGF0YShxY2FtZXJhX2hhbDNfcHBfZGF0YV90ICpqb2IpOworCitwcml2YXRlOgorICAgIGludDMyX3Qgc2VuZEV2dE5vdGlmeShpbnQzMl90IG1zZ190eXBlLCBpbnQzMl90IGV4dDEsIGludDMyX3QgZXh0Mik7CisgICAgbW1fanBlZ19jb2xvcl9mb3JtYXQgZ2V0Q29sb3JmbXRGcm9tSW1nRm10KGNhbV9mb3JtYXRfdCBpbWdfZm10KTsKKyAgICBtbV9qcGVnX2Zvcm1hdF90IGdldEpwZWdJbWdUeXBlRnJvbUltZ0ZtdChjYW1fZm9ybWF0X3QgaW1nX2ZtdCk7CisgICAgaW50MzJfdCBnZXRKcGVnRW5jb2RlQ29uZmlnKG1tX2pwZWdfZW5jb2RlX3BhcmFtc190JiBlbmNvZGVfcGFybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM1N0cmVhbSAqbWFpbl9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19zZXR0aW5nc190ICpqcGVnX3NldHRpbmdzKTsKKyAgICBpbnQzMl90IGdldEZXS0pwZWdFbmNvZGVDb25maWcobW1fanBlZ19lbmNvZGVfcGFyYW1zX3QmIGVuY29kZV9wYXJtLAorICAgICAgICAgICAgcWNhbWVyYV9md2tfaW5wdXRfcHBfZGF0YV90ICpmcmFtZSwKKyAgICAgICAgICAgIGpwZWdfc2V0dGluZ3NfdCAqanBlZ19zZXR0aW5ncyk7CisgICAgUUNhbWVyYTNFeGlmICogZ2V0RXhpZkRhdGEobWV0YWRhdGFfYnVmZmVyX3QgKm1ldGFkYXRhLAorICAgICAgICAgICAganBlZ19zZXR0aW5nc190ICpqcGVnX3NldHRpbmdzLCBib29sIG5lZWRKcGVnRXhpZlJvdGF0aW9uKTsKKyAgICBpbnQzMl90IGVuY29kZURhdGEocWNhbWVyYV9oYWwzX2pwZWdfZGF0YV90ICpqcGVnX2pvYl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICZuZWVkTmV3U2Vzcyk7CisgICAgaW50MzJfdCBlbmNvZGVGV0tEYXRhKHFjYW1lcmFfaGFsM19qcGVnX2RhdGFfdCAqanBlZ19qb2JfZGF0YSwKKyAgICAgICAgICAgIHVpbnQ4X3QgJm5lZWROZXdTZXNzKTsKKyAgICB2b2lkIHJlbGVhc2VTdXBlckJ1ZihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2J1Zik7CisgICAgc3RhdGljIHZvaWQgcmVsZWFzZU5vdGlmeURhdGEodm9pZCAqdXNlcl9kYXRhLCB2b2lkICpjb29raWUpOworICAgIGludDMyX3QgcHJvY2Vzc1Jhd0ltYWdlSW1wbChtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnJlY3ZkX2ZyYW1lKTsKKworICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VKcGVnRGF0YSh2b2lkICpkYXRhLCB2b2lkICp1c2VyX2RhdGEpOworICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VQUElucHV0RGF0YSh2b2lkICpkYXRhLCB2b2lkICp1c2VyX2RhdGEpOworICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VNZXRhZGF0YSh2b2lkICpkYXRhLCB2b2lkICp1c2VyX2RhdGEpOworICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VPbmdvaW5nUFBEYXRhKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSk7CisKKyAgICBzdGF0aWMgdm9pZCAqZGF0YVByb2Nlc3NSb3V0aW5lKHZvaWQgKmRhdGEpOworCisgICAgYm9vbCBuZWVkc1JlcHJvY2VzcyhxY2FtZXJhX2Z3a19pbnB1dF9wcF9kYXRhX3QgKmZyYW1lKTsKKworcHJpdmF0ZToKKyAgICBRQ2FtZXJhM1Byb2Nlc3NpbmdDaGFubmVsICAqbV9wYXJlbnQ7CisgICAganBlZ19lbmNvZGVfY2FsbGJhY2tfdCAgICAgbUpwZWdDQjsKKyAgICB2b2lkICogICAgICAgICAgICAgICAgICAgICBtSnBlZ1VzZXJEYXRhOworICAgIG1tX2pwZWdfb3BzX3QgICAgICAgICAgICAgIG1KcGVnSGFuZGxlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1KcGVnQ2xpZW50SGFuZGxlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1KcGVnU2Vzc2lvbklkOworICAgIGNhbV9qcGVnX21ldGFkYXRhX3QgICAgICAgIG1KcGVnTWV0YWRhdGE7CisKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICBtX2JUaHVtYm5haWxOZWVkZWQ7CisgICAgUUNhbWVyYTNTdHJlYW1NZW0gICAgICAgICAgKm1PdXRwdXRNZW07CisgICAgUUNhbWVyYTNSZXByb2Nlc3NDaGFubmVsICogIG1fcFJlcHJvY0NoYW5uZWw7CisKKyAgICBRQ2FtZXJhUXVldWUgbV9pbnB1dFBQUTsgICAgICAgICAgICAvLyBpbnB1dCBxdWV1ZSBmb3IgcG9zdHByb2MKKyAgICBRQ2FtZXJhUXVldWUgbV9pbnB1dEZXS1BQUTsgICAgICAgICAvLyBmcmFtZXdvcmsgaW5wdXQgcXVldWUgZm9yIHBvc3Rwcm9jCisgICAgUUNhbWVyYVF1ZXVlIG1fb25nb2luZ1BQUTsgICAgICAgICAgLy8gb25nb2luZyBwb3N0cHJvYyBxdWV1ZQorICAgIFFDYW1lcmFRdWV1ZSBtX2lucHV0SnBlZ1E7ICAgICAgICAgIC8vIGlucHV0IGpwZWcgam9iIHF1ZXVlCisgICAgUUNhbWVyYVF1ZXVlIG1fb25nb2luZ0pwZWdROyAgICAgICAgLy8gb25nb2luZyBqcGVnIGpvYiBxdWV1ZQorICAgIFFDYW1lcmFRdWV1ZSBtX2lucHV0UmF3UTsgICAgICAgICAgIC8vIGlucHV0IHJhdyBqb2IgcXVldWUKKyAgICBRQ2FtZXJhUXVldWUgbV9pbnB1dE1ldGFROyAgICAgICAgICAvLyBpbnB1dCBtZXRhIHF1ZXVlCisgICAgUUNhbWVyYVF1ZXVlIG1fanBlZ1NldHRpbmdzUTsgICAgICAgLy8gaW5wdXQganBlZyBzZXR0aW5nIHF1ZXVlCisgICAgUUNhbWVyYUNtZFRocmVhZCBtX2RhdGFQcm9jVGg7ICAgICAgLy8gdGhyZWFkIGZvciBkYXRhIHByb2Nlc3NpbmcKKworICAgIHB0aHJlYWRfbXV0ZXhfdCBtUmVwcm9jSm9iTG9jazsKK307CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCisKKyNlbmRpZiAvKiBfX1FDYW1lcmEzX1BPU1RQUk9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNTdHJlYW0uY3BwIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODk1N2YKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1N0cmVhbS5jcHAKQEAgLTAsMCArMSwxNTMyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYTNTdHJlYW0iCisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJRQ2FtZXJhM0hXSS5oIgorI2luY2x1ZGUgIlFDYW1lcmEzU3RyZWFtLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKK30KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKyNkZWZpbmUgTUFYX0JBVENIX1NJWkUgICAzMgorCitjb25zdCBjaGFyKiBRQ2FtZXJhM1N0cmVhbTo6bVN0cmVhbU5hbWVzW10gPSB7CisgICAgICAgICJDQU1fREVGQVVMVCIsCisgICAgICAgICJDQU1fUFJFVklFVyIsCisgICAgICAgICJDQU1fUE9TVFZJRVciLAorICAgICAgICAiQ0FNX1NOQVBTSE9UIiwKKyAgICAgICAgIkNBTV9WSURFTyIsCisgICAgICAgICJDQU1fQ0FMTEJBQ0siLAorICAgICAgICAiQ0FNX0lNUExfREVGSU5FRCIsCisgICAgICAgICJDQU1fTUVUQURBVEEiLAorICAgICAgICAiQ0FNX1JBVyIsCisgICAgICAgICJDQU1fT0ZGTElORV9QUk9DIiwKKyAgICAgICAgIkNBTV9QQVJNIiwKKyAgICAgICAgIkNBTV9BTkFMWVNJUyIKKyAgICAgICAgIkNBTV9NQVgiIH07CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0X2J1ZnMKKyAqCisgKiBERVNDUklQVElPTjogc3RhdGljIGZ1bmN0aW9uIGVudHJ5IHRvIGFsbG9jYXRlIHN0cmVhbSBidWZmZXJzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBvZmZzZXQgICAgIDogb2Zmc2V0IGluZm8gb2Ygc3RyZWFtIGJ1ZmZlcnMKKyAqICAgQG51bV9idWZzICAgOiBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQKKyAqICAgQGluaXRpYWxfcmVnX2ZsYWc6IGZsYWcgdG8gaW5kaWNhdGUgaWYgYnVmZmVyIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIGF0IGtlcm5lbCBpbml0aWFsbHkKKyAqICAgQGJ1ZnMgICAgICAgOiBvdXRwdXQgb2YgYWxsb2NhdGVkIGJ1ZmZlcnMKKyAqICAgQG9wc190YmwgICAgOiBwdHIgdG8gYnVmIG1hcHBpbmcvdW5tYXBwaW5nIG9wcworICogICBAdXNlcl9kYXRhICA6IHVzZXIgZGF0YSBwdHIgb2Ygb3BzX3RibAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW06OmdldF9idWZzKAorICAgICAgICAgICAgICAgICAgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCAqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbnVtX2J1ZnMsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqaW5pdGlhbF9yZWdfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKipidWZzLAorICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKm9wc190YmwsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIFFDYW1lcmEzU3RyZWFtICpzdHJlYW0gPSByZWludGVycHJldF9jYXN0PFFDYW1lcmEzU3RyZWFtICo+KHVzZXJfZGF0YSk7CisgICAgaWYgKCFzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiZ2V0QnVmcyBpbnZhbGlkIHN0cmVhbSBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIHJjID0gc3RyZWFtLT5nZXRCdWZzKG9mZnNldCwgbnVtX2J1ZnMsIGluaXRpYWxfcmVnX2ZsYWcsIGJ1ZnMsIG9wc190YmwpOworICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICBMT0dFKCJzdHJlYW0tPmdldEJ1ZnMgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIGlmIChzdHJlYW0tPm1CYXRjaFNpemUpIHsKKyAgICAgICAgLy9BbGxvY2F0ZSBiYXRjaCBidWZmZXJzIGlmIG1CYXRjaFNpemUgaXMgbm9uLXplcm8uIEFsbCB0aGUgb3V0cHV0CisgICAgICAgIC8vYXJndW1lbnRzIGNvcnJlc3BvbmQgdG8gYmF0Y2ggY29udGFpbmVycyBhbmQgbm90IGltYWdlIGJ1ZmZlcnMKKyAgICAgICAgcmMgPSBzdHJlYW0tPmdldEJhdGNoQnVmcyhudW1fYnVmcywgaW5pdGlhbF9yZWdfZmxhZywKKyAgICAgICAgICAgICAgICBidWZzLCBvcHNfdGJsKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHB1dF9idWZzCisgKgorICogREVTQ1JJUFRJT046IHN0YXRpYyBmdW5jdGlvbiBlbnRyeSB0byBkZWFsbG9jYXRlIHN0cmVhbSBidWZmZXJzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBvcHNfdGJsICAgIDogcHRyIHRvIGJ1ZiBtYXBwaW5nL3VubWFwcGluZyBvcHMKKyAqICAgQHVzZXJfZGF0YSAgOiB1c2VyIGRhdGEgcHRyIG9mIG9wc190YmwKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzU3RyZWFtOjpwdXRfYnVmcygKKyAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBRQ2FtZXJhM1N0cmVhbSAqc3RyZWFtID0gcmVpbnRlcnByZXRfY2FzdDxRQ2FtZXJhM1N0cmVhbSAqPih1c2VyX2RhdGEpOworICAgIGlmICghc3RyZWFtKSB7CisgICAgICAgIExPR0UoInB1dEJ1ZnMgaW52YWxpZCBzdHJlYW0gcG9pbnRlciIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGlmIChzdHJlYW0tPm1CYXRjaFNpemUpIHsKKyAgICAgICAgcmMgPSBzdHJlYW0tPnB1dEJhdGNoQnVmcyhvcHNfdGJsKTsKKyAgICAgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgICAgICBMT0dFKCJzdHJlYW0tPnB1dEJhdGNoQnVmcyBmYWlsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByYyA9IHN0cmVhbS0+cHV0QnVmcyhvcHNfdGJsKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW52YWxpZGF0ZV9idWYKKyAqCisgKiBERVNDUklQVElPTjogc3RhdGljIGZ1bmN0aW9uIGVudHJ5IHRvIGludmFsaWRhdGUgYSBzcGVjaWZpYyBzdHJlYW0gYnVmZmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgICAgIDogaW5kZXggb2YgdGhlIHN0cmVhbSBidWZmZXIgdG8gaW52YWxpZGF0ZQorICogICBAdXNlcl9kYXRhICA6IHVzZXIgZGF0YSBwdHIgb2Ygb3BzX3RibAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW06OmludmFsaWRhdGVfYnVmKHVpbnQzMl90IGluZGV4LCB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYTNTdHJlYW0gKj4odXNlcl9kYXRhKTsKKyAgICBpZiAoIXN0cmVhbSkgeworICAgICAgICBMT0dFKCJpbnZhbGlkIHN0cmVhbSBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIGlmIChzdHJlYW0tPm1CYXRjaFNpemUpIHsKKyAgICAgICAgaW50MzJfdCByZXRWYWwgPSBOT19FUlJPUjsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7CisgICAgICAgICAgICAgICAgaSA8IHN0cmVhbS0+bUJhdGNoQnVmRGVmc1tpbmRleF0udXNlcl9idWYuYnVmc191c2VkOyBpKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1Zl9pZHggPSBzdHJlYW0tPm1CYXRjaEJ1ZkRlZnNbaW5kZXhdLnVzZXJfYnVmLmJ1Zl9pZHhbaV07CisgICAgICAgICAgICByZXRWYWwgPSBzdHJlYW0tPmludmFsaWRhdGVCdWYoYnVmX2lkeCk7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmV0VmFsKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiaW52YWxpZGF0ZUJ1ZiBmYWlsZWQgZm9yIGJ1Zl9pZHg6ICVkIGVycjogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9pZHgsIHJldFZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYyB8PSByZXRWYWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByYyA9IHN0cmVhbS0+aW52YWxpZGF0ZUJ1ZihpbmRleCk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjbGVhbl9pbnZhbGlkYXRlX2J1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBzdGF0aWMgZnVuY3Rpb24gZW50cnkgdG8gY2xlYW4gYW5kIGludmFsaWRhdGUgYSBzcGVjaWZpYyBzdHJlYW0gYnVmZmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgICAgIDogaW5kZXggb2YgdGhlIHN0cmVhbSBidWZmZXIgdG8gaW52YWxpZGF0ZQorICogICBAdXNlcl9kYXRhICA6IHVzZXIgZGF0YSBwdHIgb2Ygb3BzX3RibAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW06OmNsZWFuX2ludmFsaWRhdGVfYnVmKHVpbnQzMl90IGluZGV4LCB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgUUNhbWVyYTNTdHJlYW0gKnN0cmVhbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UUNhbWVyYTNTdHJlYW0gKj4odXNlcl9kYXRhKTsKKyAgICBpZiAoIXN0cmVhbSkgeworICAgICAgICBMT0dFKCJpbnZhbGlkIHN0cmVhbSBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIGlmIChzdHJlYW0tPm1CYXRjaFNpemUpIHsKKyAgICAgICAgaW50MzJfdCByZXRWYWwgPSBOT19FUlJPUjsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7CisgICAgICAgICAgICAgICAgaSA8IHN0cmVhbS0+bUJhdGNoQnVmRGVmc1tpbmRleF0udXNlcl9idWYuYnVmc191c2VkOyBpKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1Zl9pZHggPSBzdHJlYW0tPm1CYXRjaEJ1ZkRlZnNbaW5kZXhdLnVzZXJfYnVmLmJ1Zl9pZHhbaV07CisgICAgICAgICAgICByZXRWYWwgPSBzdHJlYW0tPmNsZWFuSW52YWxpZGF0ZUJ1ZihidWZfaWR4KTsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByZXRWYWwpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJpbnZhbGlkYXRlQnVmIGZhaWxlZCBmb3IgYnVmX2lkeDogJWQgZXJyOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX2lkeCwgcmV0VmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJjIHw9IHJldFZhbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJjID0gc3RyZWFtLT5jbGVhbkludmFsaWRhdGVCdWYoaW5kZXgpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYTNTdHJlYW0KKyAqCisgKiBERVNDUklQVElPTjogY29uc3RydWN0b3Igb2YgUUNhbWVyYTNTdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGFsbG9jYXRvciAgOiBtZW1vcnkgYWxsb2NhdG9yIG9iagorICogICBAY2FtSGFuZGxlICA6IGNhbWVyYSBoYW5kbGUKKyAqICAgQGNoSWQgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAY2FtT3BzICAgICA6IHB0ciB0byBjYW1lcmEgb3BzIHRhYmxlCisgKiAgIEBwYWRkaW5nSW5mbzogcHRyIHRvIHBhZGRpbmcgaW5mbworICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEzU3RyZWFtOjpRQ2FtZXJhM1N0cmVhbSh1aW50MzJfdCBjYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vcHNfdCAqY2FtT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM0NoYW5uZWwgKmNoYW5uZWwpIDoKKyAgICAgICAgbUNhbUhhbmRsZShjYW1IYW5kbGUpLAorICAgICAgICBtQ2hhbm5lbEhhbmRsZShjaElkKSwKKyAgICAgICAgbUhhbmRsZSgwKSwKKyAgICAgICAgbUNhbU9wcyhjYW1PcHMpLAorICAgICAgICBtU3RyZWFtSW5mbyhOVUxMKSwKKyAgICAgICAgbU1lbU9wcyhOVUxMKSwKKyAgICAgICAgbU51bUJ1ZnMoMCksCisgICAgICAgIG1EYXRhQ0IoTlVMTCksCisgICAgICAgIG1Vc2VyRGF0YShOVUxMKSwKKyAgICAgICAgbURhdGFRKHJlbGVhc2VGcmFtZURhdGEsIHRoaXMpLAorICAgICAgICBtU3RyZWFtSW5mb0J1ZihOVUxMKSwKKyAgICAgICAgbVN0cmVhbUJ1ZnMoTlVMTCksCisgICAgICAgIG1CdWZEZWZzKE5VTEwpLAorICAgICAgICBtQ2hhbm5lbChjaGFubmVsKSwKKyAgICAgICAgbUJhdGNoU2l6ZSgwKSwKKyAgICAgICAgbU51bUJhdGNoQnVmcygwKSwKKyAgICAgICAgbVN0cmVhbUJhdGNoQnVmcyhOVUxMKSwKKyAgICAgICAgbUJhdGNoQnVmRGVmcyhOVUxMKSwKKyAgICAgICAgbUN1cnJlbnRCYXRjaEJ1ZkRlZihOVUxMKSwKKyAgICAgICAgbUJ1ZnNTdGFnZWQoMCksCisgICAgICAgIG1GcmVlQmF0Y2hCdWZRKE5VTEwsIHRoaXMpCit7CisgICAgbU1lbVZ0YmwudXNlcl9kYXRhID0gdGhpczsKKyAgICBtTWVtVnRibC5nZXRfYnVmcyA9IGdldF9idWZzOworICAgIG1NZW1WdGJsLnB1dF9idWZzID0gcHV0X2J1ZnM7CisgICAgbU1lbVZ0YmwuaW52YWxpZGF0ZV9idWYgPSBpbnZhbGlkYXRlX2J1ZjsKKyAgICBtTWVtVnRibC5jbGVhbl9pbnZhbGlkYXRlX2J1ZiA9IGNsZWFuX2ludmFsaWRhdGVfYnVmOworICAgIG1NZW1WdGJsLnNldF9jb25maWdfb3BzID0gTlVMTDsKKyAgICBtZW1zZXQoJm1GcmFtZUxlbk9mZnNldCwgMCwgc2l6ZW9mKG1GcmFtZUxlbk9mZnNldCkpOworICAgIG1lbWNweSgmbVBhZGRpbmdJbmZvLCBwYWRkaW5nSW5mbywgc2l6ZW9mKGNhbV9wYWRkaW5nX2luZm9fdCkpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhM1N0cmVhbQorICoKKyAqIERFU0NSSVBUSU9OOiBkZWNvbnN0cnVjdG9yIG9mIFFDYW1lcmEzU3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhM1N0cmVhbTo6flFDYW1lcmEzU3RyZWFtKCkKK3sKKyAgICBpZiAobVN0cmVhbUluZm9CdWYgIT0gTlVMTCkgeworICAgICAgICBpbnQgcmMgPSBtQ2FtT3BzLT51bm1hcF9zdHJlYW1fYnVmKG1DYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLCBtSGFuZGxlLCBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fSU5GTywgMCwgLTEpOworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gdW4tbWFwIHN0cmVhbSBpbmZvIGJ1ZmZlciIpOworICAgICAgICB9CisgICAgICAgIG1TdHJlYW1JbmZvQnVmLT5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbGV0ZSBtU3RyZWFtSW5mb0J1ZjsKKyAgICAgICAgbVN0cmVhbUluZm9CdWYgPSBOVUxMOworICAgIH0KKyAgICAvLyBkZWxldGUgc3RyZWFtCisgICAgaWYgKG1IYW5kbGUgPiAwKSB7CisgICAgICAgIG1DYW1PcHMtPmRlbGV0ZV9zdHJlYW0obUNhbUhhbmRsZSwgbUNoYW5uZWxIYW5kbGUsIG1IYW5kbGUpOworICAgICAgICBtSGFuZGxlID0gMDsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW5pdAorICoKKyAqIERFU0NSSVBUSU9OOiBpbml0aWFsaXplIHN0cmVhbSBvYmoKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN0cmVhbVR5cGUgICAgIDogc3RyZWFtIHR5cGUKKyAqICAgQHN0cmVhbUZvcm1hdCAgIDogc3RyZWFtIGZvcm1hdAorICogICBAc3RyZWFtRGltICAgICAgOiBzdHJlYW0gZGltZW5zaW9uCisgKiAgIEByZXByb2Nlc3NfY29uZmlnOiByZXByb2Nlc3Mgc3RyZWFtIGlucHV0IGNvbmZpZ3VyYXRpb24KKyAqICAgQG1pbk51bUJ1ZmZlcnMgIDogbWluaW1hbCBidWZmZXIgY291bnQgZm9yIHBhcnRpY3VsYXIgc3RyZWFtIHR5cGUKKyAqICAgQHBvc3Rwcm9jZXNzX21hc2s6IFBQIG1hc2sKKyAqICAgQGlzX3R5cGUgIDogSW1hZ2Ugc3RhYmlsaXphdGlvbiB0eXBlLCBjYW1faXNfdHlwZV90CisgKiAgIEBiYXRjaFNpemUgIDogTnVtYmVyIG9mIGltYWdlIGJ1ZmZlcnMgaW4gYSBiYXRjaC4KKyAqICAgICAgICAgICAgICAgICAwOiBObyBiYXRjaC4gTjogY29udGFpbmVyIHdpdGggTiBpbWFnZSBidWZmZXJzCisgKiAgIEBzdHJlYW1fY2IgICAgICA6IGNhbGxiYWNrIGhhbmRsZQorICogICBAdXNlcmRhdGEgICAgICAgOiB1c2VyIGRhdGEKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzU3RyZWFtOjppbml0KGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2Zvcm1hdF90IHN0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3Qgc3RyZWFtRGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9yb3RhdGlvbl90IHN0cmVhbVJvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fcmVwcm9jX2NvbmZpZ190KiByZXByb2Nlc3NfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWluTnVtQnVmZmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1faXNfdHlwZV90IGlzX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmF0Y2hTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbDNfc3RyZWFtX2NiX3JvdXRpbmUgc3RyZWFtX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKQoreworICAgIGludDMyX3QgcmMgPSBPSzsKKyAgICBzc2l6ZV90IGJ1ZlNpemUgPSBCQURfSU5ERVg7CisgICAgbW1fY2FtZXJhX3N0cmVhbV9jb25maWdfdCBzdHJlYW1fY29uZmlnOworICAgIExPR0QoImJhdGNoIHNpemUgaXMgJWQiLCBiYXRjaFNpemUpOworCisgICAgbUhhbmRsZSA9IG1DYW1PcHMtPmFkZF9zdHJlYW0obUNhbUhhbmRsZSwgbUNoYW5uZWxIYW5kbGUpOworICAgIGlmICghbUhhbmRsZSkgeworICAgICAgICBMT0dFKCJhZGRfc3RyZWFtIGZhaWxlZCIpOworICAgICAgICByYyA9IFVOS05PV05fRVJST1I7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICAvLyBhbGxvY2F0ZSBhbmQgbWFwIHN0cmVhbSBpbmZvIG1lbW9yeQorICAgIG1TdHJlYW1JbmZvQnVmID0gbmV3IFFDYW1lcmEzSGVhcE1lbW9yeSgxKTsKKyAgICBpZiAobVN0cmVhbUluZm9CdWYgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJubyBtZW1vcnkgZm9yIHN0cmVhbSBpbmZvIGJ1ZiBvYmoiKTsKKyAgICAgICAgcmMgPSAtRU5PTUVNOworICAgICAgICBnb3RvIGVycjE7CisgICAgfQorICAgIHJjID0gbVN0cmVhbUluZm9CdWYtPmFsbG9jYXRlKHNpemVvZihjYW1fc3RyZWFtX2luZm9fdCkpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgibm8gbWVtb3J5IGZvciBzdHJlYW0gaW5mbyIpOworICAgICAgICByYyA9IC1FTk9NRU07CisgICAgICAgIGdvdG8gZXJyMjsKKyAgICB9CisKKyAgICBtU3RyZWFtSW5mbyA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtX3N0cmVhbV9pbmZvX3QgKj4obVN0cmVhbUluZm9CdWYtPmdldFB0cigwKSk7CisgICAgbWVtc2V0KG1TdHJlYW1JbmZvLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9pbmZvX3QpKTsKKyAgICBtU3RyZWFtSW5mby0+c3RyZWFtX3R5cGUgPSBzdHJlYW1UeXBlOworICAgIG1TdHJlYW1JbmZvLT5mbXQgPSBzdHJlYW1Gb3JtYXQ7CisgICAgbVN0cmVhbUluZm8tPmRpbSA9IHN0cmVhbURpbTsKKyAgICBtU3RyZWFtSW5mby0+bnVtX2J1ZnMgPSBtaW5OdW1CdWZmZXJzOworICAgIG1TdHJlYW1JbmZvLT5wcF9jb25maWcuZmVhdHVyZV9tYXNrID0gcG9zdHByb2Nlc3NfbWFzazsKKyAgICBtU3RyZWFtSW5mby0+aXNfdHlwZSA9IGlzX3R5cGU7CisgICAgbVN0cmVhbUluZm8tPnBwX2NvbmZpZy5yb3RhdGlvbiA9IHN0cmVhbVJvdGF0aW9uOworICAgIExPR0QoInN0cmVhbV90eXBlIGlzICVkLCBmZWF0dXJlX21hc2sgaXMgJUxkIiwKKyAgICAgICAgICAgbVN0cmVhbUluZm8tPnN0cmVhbV90eXBlLCBtU3RyZWFtSW5mby0+cHBfY29uZmlnLmZlYXR1cmVfbWFzayk7CisKKyAgICBidWZTaXplID0gbVN0cmVhbUluZm9CdWYtPmdldFNpemUoMCk7CisgICAgaWYgKEJBRF9JTkRFWCAhPSBidWZTaXplKSB7CisgICAgICAgIHJjID0gbUNhbU9wcy0+bWFwX3N0cmVhbV9idWYobUNhbUhhbmRsZSwKKyAgICAgICAgICAgICAgICBtQ2hhbm5lbEhhbmRsZSwgbUhhbmRsZSwgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0lORk8sCisgICAgICAgICAgICAgICAgMCwgLTEsIG1TdHJlYW1JbmZvQnVmLT5nZXRGZCgwKSwgKHNpemVfdClidWZTaXplLAorICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvQnVmLT5nZXRQdHIoMCkpOworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gbWFwIHN0cmVhbSBpbmZvIGJ1ZmZlciIpOworICAgICAgICAgICAgZ290byBlcnIzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGJ1ZmZlciBzaXplIChiYWQgaW5kZXgpIik7CisgICAgICAgIGdvdG8gZXJyMzsKKyAgICB9CisKKyAgICBtTnVtQnVmcyA9IG1pbk51bUJ1ZmZlcnM7CisgICAgaWYgKHJlcHJvY2Vzc19jb25maWcgIT0gTlVMTCkgeworICAgICAgICBtU3RyZWFtSW5mby0+cmVwcm9jZXNzX2NvbmZpZyA9ICpyZXByb2Nlc3NfY29uZmlnOworICAgICAgICBtU3RyZWFtSW5mby0+c3RyZWFtaW5nX21vZGUgPSBDQU1fU1RSRUFNSU5HX01PREVfQlVSU1Q7CisgICAgICAgIC8vbVN0cmVhbUluZm8tPm51bV9vZl9idXJzdCA9IHJlcHJvY2Vzc19jb25maWctPm9mZmxpbmUubnVtX29mX2J1ZnM7CisgICAgICAgIG1TdHJlYW1JbmZvLT5udW1fb2ZfYnVyc3QgPSAxOworICAgIH0gZWxzZSBpZiAoYmF0Y2hTaXplKSB7CisgICAgICAgIGlmIChiYXRjaFNpemUgPiBNQVhfQkFUQ0hfU0laRSkgeworICAgICAgICAgICAgTE9HRSgiYmF0Y2hTaXplOiVkIGlzIHZlcnkgbGFyZ2UiLCBiYXRjaFNpemUpOworICAgICAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGVycjQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtTnVtQmF0Y2hCdWZzID0gTUFYX0lORkxJR0hUX0hGUl9SRVFVRVNUUyAvIGJhdGNoU2l6ZTsKKyAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5zdHJlYW1pbmdfbW9kZSA9IENBTV9TVFJFQU1JTkdfTU9ERV9CQVRDSDsKKyAgICAgICAgICAgIG1TdHJlYW1JbmZvLT51c2VyX2J1Zl9pbmZvLmZyYW1lX2J1Zl9jbnQgPSBiYXRjaFNpemU7CisgICAgICAgICAgICBtU3RyZWFtSW5mby0+dXNlcl9idWZfaW5mby5zaXplID0KKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShzaXplb2YobXNtX2NhbWVyYV91c2VyX2J1Zl9jb250X3QpKTsKKyAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5udW1fYnVmcyA9IG1OdW1CYXRjaEJ1ZnM7CisgICAgICAgICAgICAvL0ZyYW1lIGludGVydmFsIGlzIGlycmVsYXZlbnQgc2luY2UgdGltZSBzdGFtcCBjYWxjdWxhdGlvbiBpcyBub3QKKyAgICAgICAgICAgIC8vcmVxdWlyZWQgZnJvbSB0aGUgbUNhbU9wcworICAgICAgICAgICAgbVN0cmVhbUluZm8tPnVzZXJfYnVmX2luZm8uZnJhbWVJbnRlcnZhbCA9IDA7CisgICAgICAgICAgICBMT0dEKCJiYXRjaCBzaXplIGlzICVkIiwgYmF0Y2hTaXplKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1TdHJlYW1JbmZvLT5zdHJlYW1pbmdfbW9kZSA9IENBTV9TVFJFQU1JTkdfTU9ERV9DT05USU5VT1VTOworICAgIH0KKworICAgIC8vIENvbmZpZ3VyZSB0aGUgc3RyZWFtCisgICAgc3RyZWFtX2NvbmZpZy5zdHJlYW1faW5mbyA9IG1TdHJlYW1JbmZvOworICAgIHN0cmVhbV9jb25maWcubWVtX3Z0YmwgPSBtTWVtVnRibDsKKyAgICBzdHJlYW1fY29uZmlnLnBhZGRpbmdfaW5mbyA9IG1QYWRkaW5nSW5mbzsKKyAgICBzdHJlYW1fY29uZmlnLnVzZXJkYXRhID0gdGhpczsKKyAgICBzdHJlYW1fY29uZmlnLnN0cmVhbV9jYiA9IGRhdGFOb3RpZnlDQjsKKyAgICBzdHJlYW1fY29uZmlnLnN0cmVhbV9jYl9zeW5jID0gTlVMTDsKKworICAgIHJjID0gbUNhbU9wcy0+Y29uZmlnX3N0cmVhbShtQ2FtSGFuZGxlLAorICAgICAgICAgICAgbUNoYW5uZWxIYW5kbGUsIG1IYW5kbGUsICZzdHJlYW1fY29uZmlnKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBjb25maWcgc3RyZWFtLCByYyA9ICVkIiwgcmMpOworICAgICAgICBnb3RvIGVycjQ7CisgICAgfQorCisgICAgbURhdGFDQiA9IHN0cmVhbV9jYjsKKyAgICBtVXNlckRhdGEgPSB1c2VyZGF0YTsKKyAgICBtQmF0Y2hTaXplID0gYmF0Y2hTaXplOworICAgIHJldHVybiAwOworCitlcnI0OgorICAgIG1DYW1PcHMtPnVubWFwX3N0cmVhbV9idWYobUNhbUhhbmRsZSwKKyAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLCBtSGFuZGxlLCBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fSU5GTywgMCwgLTEpOworZXJyMzoKKyAgICBtU3RyZWFtSW5mb0J1Zi0+ZGVhbGxvY2F0ZSgpOworZXJyMjoKKyAgICBkZWxldGUgbVN0cmVhbUluZm9CdWY7CisgICAgbVN0cmVhbUluZm9CdWYgPSBOVUxMOworICAgIG1TdHJlYW1JbmZvID0gTlVMTDsKK2VycjE6CisgICAgbUNhbU9wcy0+ZGVsZXRlX3N0cmVhbShtQ2FtSGFuZGxlLCBtQ2hhbm5lbEhhbmRsZSwgbUhhbmRsZSk7CisgICAgbUhhbmRsZSA9IDA7CisgICAgbU51bUJ1ZnMgPSAwOworZG9uZToKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc3RhcnQKKyAqCisgKiBERVNDUklQVElPTjogc3RhcnQgc3RyZWFtLiBXaWxsIHN0YXJ0IG1haW4gc3RyZWFtIHRocmVhZCB0byBoYW5kbGUgc3RyZWFtCisgKiAgICAgICAgICAgICAgcmVsYXRlZCBvcHMuCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzU3RyZWFtOjpzdGFydCgpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisKKyAgICBtRGF0YVEuaW5pdCgpOworICAgIGlmIChtQmF0Y2hTaXplKQorICAgICAgICBtRnJlZUJhdGNoQnVmUS5pbml0KCk7CisgICAgcmMgPSBtUHJvY1RoLmxhdW5jaChkYXRhUHJvY1JvdXRpbmUsIHRoaXMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdG9wCisgKgorICogREVTQ1JJUFRJT046IHN0b3Agc3RyZWFtLiBXaWxsIHN0b3AgbWFpbiBzdHJlYW0gdGhyZWFkCisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzU3RyZWFtOjpzdG9wKCkKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICByYyA9IG1Qcm9jVGguZXhpdCgpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwcm9jZXNzRGF0YU5vdGlmeQorICoKKyAqIERFU0NSSVBUSU9OOiBwcm9jZXNzIHN0cmVhbSBkYXRhIG5vdGlmeQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZnJhbWUgICA6IHN0cmVhbSBmcmFtZSByZWNlaXZlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW06OnByb2Nlc3NEYXRhTm90aWZ5KG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUpCit7CisgICAgTE9HRCgiRVxuIik7CisgICAgaW50MzJfdCByYzsKKyAgICBpZiAobURhdGFRLmVucXVldWUoKHZvaWQgKilmcmFtZSkpIHsKKyAgICAgICAgcmMgPSBtUHJvY1RoLnNlbmRDbWQoQ0FNRVJBX0NNRF9UWVBFX0RPX05FWFRfSk9CLCBGQUxTRSwgRkFMU0UpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0QoIlN0cmVhbSB0aHJlYWQgaXMgbm90IGFjdGl2ZSwgbm8gb3BzIGhlcmUiKTsKKyAgICAgICAgYnVmRG9uZShmcmFtZS0+YnVmc1swXS0+YnVmX2lkeCk7CisgICAgICAgIGZyZWUoZnJhbWUpOworICAgICAgICByYyA9IE5PX0VSUk9SOworICAgIH0KKyAgICBMT0dEKCJYXG4iKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGF0YU5vdGlmeUNCCisgKgorICogREVTQ1JJUFRJT046IGNhbGxiYWNrIGZvciBkYXRhIG5vdGlmeS4gVGhpcyBmdW5jdGlvbiBpcyByZWdpc3RlcmVkIHdpdGgKKyAqICAgICAgICAgICAgICBtbS1jYW1lcmEtaW50ZXJmYWNlIHRvIGhhbmRsZSBkYXRhIG5vdGlmeQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVjdmRfZnJhbWUgICA6IHN0cmVhbSBmcmFtZSByZWNlaXZlZAorICogICB1c2VyZGF0YSAgICAgICA6IHVzZXIgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzU3RyZWFtOjpkYXRhTm90aWZ5Q0IobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKQoreworICAgIExPR0QoIkVcbiIpOworICAgIFFDYW1lcmEzU3RyZWFtKiBzdHJlYW0gPSAoUUNhbWVyYTNTdHJlYW0gKil1c2VyZGF0YTsKKyAgICBpZiAoc3RyZWFtID09IE5VTEwgfHwKKyAgICAgICAgcmVjdmRfZnJhbWUgPT0gTlVMTCB8fAorICAgICAgICByZWN2ZF9mcmFtZS0+YnVmc1swXSA9PSBOVUxMIHx8CisgICAgICAgIHJlY3ZkX2ZyYW1lLT5idWZzWzBdLT5zdHJlYW1faWQgIT0gc3RyZWFtLT5nZXRNeUhhbmRsZSgpKSB7CisgICAgICAgIExPR0UoIk5vdCBhIHZhbGlkIHN0cmVhbSB0byBoYW5kbGUgYnVmIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmZyYW1lID0KKyAgICAgICAgKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqKW1hbGxvYyhzaXplb2YobW1fY2FtZXJhX3N1cGVyX2J1Zl90KSk7CisgICAgaWYgKGZyYW1lID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtIGZvciBtbV9jYW1lcmFfYnVmX2RlZl90Iik7CisgICAgICAgIHN0cmVhbS0+YnVmRG9uZShyZWN2ZF9mcmFtZS0+YnVmc1swXS0+YnVmX2lkeCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgKmZyYW1lID0gKnJlY3ZkX2ZyYW1lOworICAgIHN0cmVhbS0+cHJvY2Vzc0RhdGFOb3RpZnkoZnJhbWUpOworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkYXRhUHJvY1JvdXRpbmUKKyAqCisgKiBERVNDUklQVElPTjogZnVuY3Rpb24gdG8gcHJvY2VzcyBkYXRhIGluIHRoZSBtYWluIHN0cmVhbSB0aHJlYWQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRhdGEgICAgOiB1c2VyIGRhdGEgcHRyCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCAqUUNhbWVyYTNTdHJlYW06OmRhdGFQcm9jUm91dGluZSh2b2lkICpkYXRhKQoreworICAgIGludCBydW5uaW5nID0gMTsKKyAgICBpbnQgcmV0OworICAgIFFDYW1lcmEzU3RyZWFtICpwbWUgPSAoUUNhbWVyYTNTdHJlYW0gKilkYXRhOworICAgIFFDYW1lcmFDbWRUaHJlYWQgKmNtZFRocmVhZCA9ICZwbWUtPm1Qcm9jVGg7CisKKyAgICBjbWRUaHJlYWQtPnNldE5hbWUobVN0cmVhbU5hbWVzW3BtZS0+bVN0cmVhbUluZm8tPnN0cmVhbV90eXBlXSk7CisKKyAgICBMT0dEKCJFIik7CisgICAgZG8geworICAgICAgICBkbyB7CisgICAgICAgICAgICByZXQgPSBjYW1fc2VtX3dhaXQoJmNtZFRocmVhZC0+Y21kX3NlbSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDAgJiYgZXJybm8gIT0gRUlOVkFMKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiY2FtX3NlbV93YWl0IGVycm9yICglcykiLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChyZXQgIT0gMCk7CisKKyAgICAgICAgLy8gd2UgZ290IG5vdGlmaWVkIGFib3V0IG5ldyBjbWQgYXZhaWwgaW4gY21kIHF1ZXVlCisgICAgICAgIGNhbWVyYV9jbWRfdHlwZV90IGNtZCA9IGNtZFRocmVhZC0+Z2V0Q21kKCk7CisgICAgICAgIHN3aXRjaCAoY21kKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBX0NNRF9UWVBFX0RPX05FWFRfSk9COgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExPR0QoIkRvIG5leHQgam9iIik7CisgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSA9CisgICAgICAgICAgICAgICAgICAgIChtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKilwbWUtPm1EYXRhUS5kZXF1ZXVlKCk7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gZnJhbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFVOTElLRUxZKGZyYW1lLT5idWZzWzBdLT5idWZfdHlwZSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9TVFJFQU1fQlVGX1RZUEVfVVNFUlBUUikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+aGFuZGxlQmF0Y2hCdWZmZXIoZnJhbWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBtZS0+bURhdGFDQiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbWUtPm1EYXRhQ0IoZnJhbWUsIHBtZSwgcG1lLT5tVXNlckRhdGEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZGF0YSBjYiByb3V0aW5lLCByZXR1cm4gYnVmIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHBtZS0+YnVmRG9uZShmcmFtZS0+YnVmc1swXS0+YnVmX2lkeCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkFfQ01EX1RZUEVfRVhJVDoKKyAgICAgICAgICAgIExPR0goIkV4aXQiKTsKKyAgICAgICAgICAgIC8qIGZsdXNoIGRhdGEgYnVmIHF1ZXVlICovCisgICAgICAgICAgICBwbWUtPm1EYXRhUS5mbHVzaCgpOworICAgICAgICAgICAgcG1lLT5mbHVzaEZyZWVCYXRjaEJ1ZlEoKTsKKyAgICAgICAgICAgIHJ1bm5pbmcgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHJ1bm5pbmcpOworICAgIExPR0QoIlgiKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBidWZEb25lCisgKgorICogREVTQ1JJUFRJT046IHJldHVybiBzdHJlYW0gYnVmZmVyIHRvIGtlcm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGluZGV4IG9mIGJ1ZmZlciB0byBiZSByZXR1cm5lZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW06OmJ1ZkRvbmUodWludDMyX3QgaW5kZXgpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGlmICgoaW5kZXggPj0gbU51bUJ1ZnMpIHx8IChtQnVmRGVmcyA9PSBOVUxMKSkgeworICAgICAgICBMT0dFKCJpbmRleDsgJWQsIG1OdW1CdWZzOiAlZCIsIGluZGV4LCBtTnVtQnVmcyk7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorICAgIGlmIChtU3RyZWFtQnVmcyA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgTE9HRSgicHV0QnVmcyBhbHJlYWR5IGNhbGxlZCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYoIE5VTEwgPT0gbUJ1ZkRlZnNbaW5kZXhdLm1lbV9pbmZvKSB7CisgICAgICAgIGlmIChOVUxMID09IG1NZW1PcHMpIHsKKyAgICAgICAgICAgIExPR0UoIkNhbWVyYSBvcGVyYXRpb25zIG5vdCBpbml0aWFsaXplZCIpOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKworICAgICAgICBzc2l6ZV90IGJ1ZlNpemUgPSBtU3RyZWFtQnVmcy0+Z2V0U2l6ZShpbmRleCk7CisKKyAgICAgICAgaWYgKEJBRF9JTkRFWCAhPSBidWZTaXplKSB7CisgICAgICAgICAgICBMT0dEKCJNYXAgc3RyZWFtQnVmSWR4OiAlZCIsIGluZGV4KTsKKyAgICAgICAgICAgIHJjID0gbU1lbU9wcy0+bWFwX29wcyhpbmRleCwgLTEsIG1TdHJlYW1CdWZzLT5nZXRGZChpbmRleCksCisgICAgICAgICAgICAgICAgICAgIChzaXplX3QpYnVmU2l6ZSwgbVN0cmVhbUJ1ZnMtPmdldFB0cihpbmRleCksCisgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsIG1NZW1PcHMtPnVzZXJkYXRhKTsKKyAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgdG8gbWFwIGNhbWVyYSBidWZmZXIgJWQiLCBpbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByYyA9IG1TdHJlYW1CdWZzLT5nZXRCdWZEZWYobUZyYW1lTGVuT2Zmc2V0LCBtQnVmRGVmc1tpbmRleF0sIGluZGV4KTsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgIExPR0UoIkNvdWxkbid0IGZpbmQgY2FtZXJhIGJ1ZmZlciBkZWZpbml0aW9uIik7CisgICAgICAgICAgICAgICAgbU1lbU9wcy0+dW5tYXBfb3BzKGluZGV4LCAtMSwgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiwgbU1lbU9wcy0+dXNlcmRhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBidWZmZXIgc2l6ZSAoYmFkIGluZGV4KSIpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKFVOTElLRUxZKG1CYXRjaFNpemUpKSB7CisgICAgICAgIHJjID0gYWdncmVnYXRlQnVmVG9CYXRjaChtQnVmRGVmc1tpbmRleF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJjID0gbUNhbU9wcy0+cWJ1ZihtQ2FtSGFuZGxlLCBtQ2hhbm5lbEhhbmRsZSwgJm1CdWZEZWZzW2luZGV4XSk7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYnVmUmVsZWFzZQorICoKKyAqIERFU0NSSVBUSU9OOiByZWxlYXNlIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVmZmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgYnVmZmVyIHRvIGJlIHJlbGVhc2VkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1N0cmVhbTo6YnVmUmVsZWFzZShpbnQzMl90IGluZGV4KQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBpZiAoKGluZGV4ID49IG1OdW1CdWZzKSB8fCAobUJ1ZkRlZnMgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICB9CisKKyAgICBpZiAoTlVMTCAhPSBtQnVmRGVmc1tpbmRleF0ubWVtX2luZm8pIHsKKyAgICAgICAgaWYgKE5VTEwgPT0gbU1lbU9wcykgeworICAgICAgICAgICAgTE9HRSgiQ2FtZXJhIG9wZXJhdGlvbnMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gbU1lbU9wcy0+dW5tYXBfb3BzKGluZGV4LCAtMSwgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiwKKyAgICAgICAgICAgICAgICBtTWVtT3BzLT51c2VyZGF0YSk7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byB1bi1tYXAgY2FtZXJhIGJ1ZmZlciAlZCIsIGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIG1CdWZEZWZzW2luZGV4XS5tZW1faW5mbyA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiQnVmZmVyIGF0IGluZGV4ICVkIG5vdCByZWdpc3RlcmVkIik7CisgICAgICAgIHJldHVybiBCQURfSU5ERVg7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEJ1ZnMKKyAqCisgKiBERVNDUklQVElPTjogYWxsb2NhdGUgc3RyZWFtIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG9mZnNldCAgICAgOiBvZmZzZXQgaW5mbyBvZiBzdHJlYW0gYnVmZmVycworICogICBAbnVtX2J1ZnMgICA6IG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZAorICogICBAaW5pdGlhbF9yZWdfZmxhZzogZmxhZyB0byBpbmRpY2F0ZSBpZiBidWZmZXIgbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZAorICogICAgICAgICAgICAgICAgICAgICAgYXQga2VybmVsIGluaXRpYWxseQorICogICBAYnVmcyAgICAgICA6IG91dHB1dCBvZiBhbGxvY2F0ZWQgYnVmZmVycworICogICBAb3BzX3RibCAgICA6IHB0ciB0byBidWYgbWFwcGluZy91bm1hcHBpbmcgb3BzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1N0cmVhbTo6Z2V0QnVmcyhjYW1fZnJhbWVfbGVuX29mZnNldF90ICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpudW1fYnVmcywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKippbml0aWFsX3JlZ19mbGFnLAorICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqKmJ1ZnMsCisgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICB1aW50OF90ICpyZWdGbGFnczsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBpZiAoIW9wc190YmwpIHsKKyAgICAgICAgTE9HRSgib3BzX3RibCBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBtRnJhbWVMZW5PZmZzZXQgPSAqb2Zmc2V0OworICAgIG1NZW1PcHMgPSBvcHNfdGJsOworCisgICAgaWYgKG1TdHJlYW1CdWZzICE9IE5VTEwpIHsKKyAgICAgICBMT0dFKCJGYWlsZWQgZ2V0QnVmcyBiZWluZyBjYWxsZWQgdHdpY2UgaW4gYSByb3cgd2l0aG91dCBhIHB1dEJ1ZnMgY2FsbCIpOworICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgbVN0cmVhbUJ1ZnMgPSBtQ2hhbm5lbC0+Z2V0U3RyZWFtQnVmcyhtRnJhbWVMZW5PZmZzZXQuZnJhbWVfbGVuKTsKKyAgICBpZiAoIW1TdHJlYW1CdWZzKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBzdHJlYW0gYnVmZmVycyIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtTnVtQnVmczsgaSsrKSB7CisgICAgICAgIGlmIChtU3RyZWFtQnVmcy0+dmFsaWQoaSkpIHsKKyAgICAgICAgICAgIHNzaXplX3QgYnVmU2l6ZSA9IG1TdHJlYW1CdWZzLT5nZXRTaXplKGkpOworICAgICAgICAgICAgaWYgKEJBRF9JTkRFWCAhPSBidWZTaXplKSB7CisgICAgICAgICAgICAgICAgcmMgPSBvcHNfdGJsLT5tYXBfb3BzKGksIC0xLCBtU3RyZWFtQnVmcy0+Z2V0RmQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KWJ1ZlNpemUsIG1TdHJlYW1CdWZzLT5nZXRQdHIoaSksCisgICAgICAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgb3BzX3RibC0+dXNlcmRhdGEpOworICAgICAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgibWFwX3N0cmVhbV9idWYgZmFpbGVkOiAlZCIsIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TdHJlYW1CdWZzLT52YWxpZChqKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wc190YmwtPnVubWFwX29wcyhqLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHNfdGJsLT51c2VyZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGJ1ZmZlciBzaXplIChiYWQgaW5kZXgpIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy9yZWdGbGFncyBhcnJheSBpcyBhbGxvY2F0ZWQgYnkgdXMsIGJ1dCBjb25zdW1lZCBhbmQgZnJlZWQgYnkgbW0tY2FtZXJhLWludGVyZmFjZQorICAgIHJlZ0ZsYWdzID0gKHVpbnQ4X3QgKiltYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogbU51bUJ1ZnMpOworICAgIGlmICghcmVnRmxhZ3MpIHsKKyAgICAgICAgTE9HRSgiT3V0IG9mIG1lbW9yeSIpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbU51bUJ1ZnM7IGkrKykgeworICAgICAgICAgICAgaWYgKG1TdHJlYW1CdWZzLT52YWxpZChpKSkgeworICAgICAgICAgICAgICAgIG9wc190YmwtPnVubWFwX29wcyhpLCAtMSwgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wc190YmwtPnVzZXJkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBtZW1zZXQocmVnRmxhZ3MsIDAsIHNpemVvZih1aW50OF90KSAqIG1OdW1CdWZzKTsKKworICAgIG1CdWZEZWZzID0gKG1tX2NhbWVyYV9idWZfZGVmX3QgKiltYWxsb2MobU51bUJ1ZnMgKiBzaXplb2YobW1fY2FtZXJhX2J1Zl9kZWZfdCkpOworICAgIGlmIChtQnVmRGVmcyA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBtbV9jYW1lcmFfYnVmX2RlZl90ICVkIiwgcmMpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbU51bUJ1ZnM7IGkrKykgeworICAgICAgICAgICAgaWYgKG1TdHJlYW1CdWZzLT52YWxpZChpKSkgeworICAgICAgICAgICAgICAgIG9wc190YmwtPnVubWFwX29wcyhpLCAtMSwgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wc190YmwtPnVzZXJkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcmVlKHJlZ0ZsYWdzKTsKKyAgICAgICAgcmVnRmxhZ3MgPSBOVUxMOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1lbXNldChtQnVmRGVmcywgMCwgbU51bUJ1ZnMgKiBzaXplb2YobW1fY2FtZXJhX2J1Zl9kZWZfdCkpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtTnVtQnVmczsgaSsrKSB7CisgICAgICAgIGlmIChtU3RyZWFtQnVmcy0+dmFsaWQoaSkpIHsKKyAgICAgICAgICAgIG1TdHJlYW1CdWZzLT5nZXRCdWZEZWYobUZyYW1lTGVuT2Zmc2V0LCBtQnVmRGVmc1tpXSwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByYyA9IG1TdHJlYW1CdWZzLT5nZXRSZWdGbGFncyhyZWdGbGFncyk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJnZXRSZWdGbGFncyBmYWlsZWQgJWQiLCByYyk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtTnVtQnVmczsgaSsrKSB7CisgICAgICAgICAgICBpZiAobVN0cmVhbUJ1ZnMtPnZhbGlkKGkpKSB7CisgICAgICAgICAgICAgICAgb3BzX3RibC0+dW5tYXBfb3BzKGksIC0xLCBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgb3BzX3RibC0+dXNlcmRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyZWUobUJ1ZkRlZnMpOworICAgICAgICBtQnVmRGVmcyA9IE5VTEw7CisgICAgICAgIGZyZWUocmVnRmxhZ3MpOworICAgICAgICByZWdGbGFncyA9IE5VTEw7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAqbnVtX2J1ZnMgPSBtTnVtQnVmczsKKyAgICAqaW5pdGlhbF9yZWdfZmxhZyA9IHJlZ0ZsYWdzOworICAgICpidWZzID0gbUJ1ZkRlZnM7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHB1dEJ1ZnMKKyAqCisgKiBERVNDUklQVElPTjogZGVhbGxvY2F0ZSBzdHJlYW0gYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb3BzX3RibCAgICA6IHB0ciB0byBidWYgbWFwcGluZy91bm1hcHBpbmcgb3BzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1N0cmVhbTo6cHV0QnVmcyhtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbU51bUJ1ZnM7IGkrKykgeworICAgICAgICBpZiAobVN0cmVhbUJ1ZnMtPnZhbGlkKGkpICYmIE5VTEwgIT0gbUJ1ZkRlZnNbaV0ubWVtX2luZm8pIHsKKyAgICAgICAgICAgIHJjID0gb3BzX3RibC0+dW5tYXBfb3BzKGksIC0xLCBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGLCBvcHNfdGJsLT51c2VyZGF0YSk7CisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgidW4tbWFwIHN0cmVhbSBidWYgZmFpbGVkOiAlZCIsIHJjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmRGVmcyA9IE5VTEw7IC8vIG1CdWZEZWZzIGp1c3Qga2VlcCBhIHB0ciB0byB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAvLyBtbS1jYW1lcmEtaW50ZXJmYWNlIG93biB0aGUgYnVmZmVyLCBzbyBubyBuZWVkIHRvIGZyZWUKKyAgICBtZW1zZXQoJm1GcmFtZUxlbk9mZnNldCwgMCwgc2l6ZW9mKG1GcmFtZUxlbk9mZnNldCkpOworCisgICAgaWYgKG1TdHJlYW1CdWZzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiZ2V0QnVmIGZhaWxlZCBwcmV2aW91c2x5LCBvciBjYWxsaW5nIHB1dEJ1ZnMgdHdpY2UiKTsKKyAgICB9CisKKyAgICBtQ2hhbm5lbC0+cHV0U3RyZWFtQnVmcygpOworCisgICAgLy9uZWVkIHRvIHNldCBtU3RyZWFtQnVmcyB0byBudWxsIGJlY2F1c2UgcHV0U3RyZWFtQnVmcyBkZWxldGVzIHRoYXQgbWVtb3J5CisgICAgbVN0cmVhbUJ1ZnMgPSBOVUxMOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGludmFsaWRhdGVCdWYKKyAqCisgKiBERVNDUklQVElPTjogaW52YWxpZGF0ZSBhIHNwZWNpZmljIHN0cmVhbSBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyIHRvIGludmFsaWRhdGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzU3RyZWFtOjppbnZhbGlkYXRlQnVmKHVpbnQzMl90IGluZGV4KQoreworICAgIGlmIChtU3RyZWFtQnVmcyA9PSBOVUxMKSB7CisgICAgICAgTE9HRSgicHV0QnVmcyBhbHJlYWR5IGNhbGxlZCIpOworICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9IGVsc2UKKyAgICAgICByZXR1cm4gbVN0cmVhbUJ1ZnMtPmludmFsaWRhdGVDYWNoZShpbmRleCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2xlYW5JbnZhbGlkYXRlQnVmCisgKgorICogREVTQ1JJUFRJT046IGNsZWFuIGFuZCBpbnZhbGlkYXRlIGEgc3BlY2lmaWMgc3RyZWFtIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGluZGV4IG9mIHRoZSBidWZmZXIgdG8gaW52YWxpZGF0ZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW06OmNsZWFuSW52YWxpZGF0ZUJ1Zih1aW50MzJfdCBpbmRleCkKK3sKKyAgICBpZiAobVN0cmVhbUJ1ZnMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJwdXRCdWZzIGFscmVhZHkgY2FsbGVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIG1TdHJlYW1CdWZzLT5jbGVhbkludmFsaWRhdGVDYWNoZShpbmRleCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RnJhbWVPZmZzZXQKKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgc3RyZWFtIGJ1ZmZlciBmcmFtZSBvZmZzZXQgaW5mbworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAb2Zmc2V0ICA6IHJlZmVyZW5jZSB0byBzdHJ1Y3QgdG8gc3RvcmUgdGhlIHF1ZXJpZWQgZnJhbWUgb2Zmc2V0IGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzU3RyZWFtOjpnZXRGcmFtZU9mZnNldChjYW1fZnJhbWVfbGVuX29mZnNldF90ICZvZmZzZXQpCit7CisgICAgb2Zmc2V0ID0gbUZyYW1lTGVuT2Zmc2V0OworICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEZyYW1lRGltZW5zaW9uCisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IHN0cmVhbSBmcmFtZSBkaW1lbnNpb24gaW5mbworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGltICAgICA6IHJlZmVyZW5jZSB0byBzdHJ1Y3QgdG8gc3RvcmUgdGhlIHF1ZXJpZWQgZnJhbWUgZGltZW5zaW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1N0cmVhbTo6Z2V0RnJhbWVEaW1lbnNpb24oY2FtX2RpbWVuc2lvbl90ICZkaW0pCit7CisgICAgaWYgKG1TdHJlYW1JbmZvICE9IE5VTEwpIHsKKyAgICAgICAgZGltID0gbVN0cmVhbUluZm8tPmRpbTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRGb3JtYXQKKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgc3RyZWFtIGZvcm1hdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZm10ICAgICA6IHJlZmVyZW5jZSB0byBzdHJlYW0gZm9ybWF0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1N0cmVhbTo6Z2V0Rm9ybWF0KGNhbV9mb3JtYXRfdCAmZm10KQoreworICAgIGlmIChtU3RyZWFtSW5mbyAhPSBOVUxMKSB7CisgICAgICAgIGZtdCA9IG1TdHJlYW1JbmZvLT5mbXQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TXlTZXJ2ZXJJRAorICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBzZXJ2ZXIgc3RyZWFtIElECisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogc3RyZWFtIElEIGZyb20gc2VydmVyCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQzMl90IFFDYW1lcmEzU3RyZWFtOjpnZXRNeVNlcnZlcklEKCkgeworICAgIGlmIChtU3RyZWFtSW5mbyAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtU3RyZWFtSW5mby0+c3RyZWFtX3N2cl9pZDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0TXlUeXBlCisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IHN0cmVhbSB0eXBlCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdHlwZSBvZiBzdHJlYW0KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworY2FtX3N0cmVhbV90eXBlX3QgUUNhbWVyYTNTdHJlYW06OmdldE15VHlwZSgpIGNvbnN0Cit7CisgICAgaWYgKG1TdHJlYW1JbmZvICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1TdHJlYW1JbmZvLT5zdHJlYW1fdHlwZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQ0FNX1NUUkVBTV9UWVBFX01BWDsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbWFwQnVmCisgKgorICogREVTQ1JJUFRJT046IG1hcCBzdHJlYW0gcmVsYXRlZCBidWZmZXIgdG8gYmFja2VuZCBzZXJ2ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJ1Zl90eXBlIDogbWFwcGluZyB0eXBlIG9mIGJ1ZmZlcgorICogICBAYnVmX2lkeCAgOiBpbmRleCBvZiBidWZmZXIKKyAqICAgQHBsYW5lX2lkeDogcGxhbmUgaW5kZXgKKyAqICAgQGZkICAgICAgIDogZmQgb2YgdGhlIGJ1ZmZlcgorICogICBAYnVmZmVyIDogYnVmZmVyIHB0cgorICogICBAc2l6ZSAgICAgOiBsZW5naHQgb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW06Om1hcEJ1Zih1aW50OF90IGJ1Zl90eXBlLCB1aW50MzJfdCBidWZfaWR4LAorICAgICAgICBpbnQzMl90IHBsYW5lX2lkeCwgaW50IGZkLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIHJldHVybiBtQ2FtT3BzLT5tYXBfc3RyZWFtX2J1ZihtQ2FtSGFuZGxlLCBtQ2hhbm5lbEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZSwgYnVmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9pZHgsIHBsYW5lX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmQsIHNpemUsIGJ1ZmZlcik7CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB1bm1hcEJ1ZgorICoKKyAqIERFU0NSSVBUSU9OOiB1bm1hcCBzdHJlYW0gcmVsYXRlZCBidWZmZXIgdG8gYmFja2VuZCBzZXJ2ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJ1Zl90eXBlIDogbWFwcGluZyB0eXBlIG9mIGJ1ZmZlcgorICogICBAYnVmX2lkeCAgOiBpbmRleCBvZiBidWZmZXIKKyAqICAgQHBsYW5lX2lkeDogcGxhbmUgaW5kZXgKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzU3RyZWFtOjp1bm1hcEJ1Zih1aW50OF90IGJ1Zl90eXBlLCB1aW50MzJfdCBidWZfaWR4LCBpbnQzMl90IHBsYW5lX2lkeCkKK3sKKyAgICByZXR1cm4gbUNhbU9wcy0+dW5tYXBfc3RyZWFtX2J1ZihtQ2FtSGFuZGxlLCBtQ2hhbm5lbEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLCBidWZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfaWR4LCBwbGFuZV9pZHgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldFBhcmFtZXRlcgorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgc3RyZWFtIGJhc2VkIHBhcmFtZXRlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBhcmFtICAgOiBwdHIgdG8gcGFyYW1ldGVycyB0byBiZSBzZXQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzU3RyZWFtOjpzZXRQYXJhbWV0ZXIoY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90ICZwYXJhbSkKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgbVN0cmVhbUluZm8tPnBhcm1fYnVmID0gcGFyYW07CisgICAgcmMgPSBtQ2FtT3BzLT5zZXRfc3RyZWFtX3Bhcm1zKG1DYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVN0cmVhbUluZm8tPnBhcm1fYnVmKTsKKyAgICBpZiAocmMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgcGFyYW0gPSBtU3RyZWFtSW5mby0+cGFybV9idWY7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWxlYXNlRnJhbWVEYXRhCisgKgorICogREVTQ1JJUFRJT046IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHJlbGVhc2UgZnJhbWUgZGF0YSBub2RlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkYXRhICAgICAgOiBwdHIgdG8gcG9zdCBwcm9jZXNzIGlucHV0IGRhdGEKKyAqICAgQHVzZXJfZGF0YSA6IHVzZXIgZGF0YSBwdHIgKFFDYW1lcmFSZXByb2Nlc3NvcikKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzU3RyZWFtOjpyZWxlYXNlRnJhbWVEYXRhKHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBRQ2FtZXJhM1N0cmVhbSAqcG1lID0gKFFDYW1lcmEzU3RyZWFtICopdXNlcl9kYXRhOworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqZnJhbWUgPSAobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICopZGF0YTsKKyAgICBpZiAoTlVMTCAhPSBwbWUpIHsKKyAgICAgICAgaWYgKFVOTElLRUxZKHBtZS0+bUJhdGNoU2l6ZSkpIHsKKyAgICAgICAgICAgIC8qIEZvciBiYXRjaCBtb2RlLCB0aGUgYmF0Y2ggYnVmZmVyIGlzIGFkZGVkIHRvIGVtcHR5IGxpc3QgKi8KKyAgICAgICAgICAgIGlmKCFwbWUtPm1GcmVlQmF0Y2hCdWZRLmVucXVldWUoKHZvaWQqKSBmcmFtZS0+YnVmc1swXSkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJiYXRjaEJ1Zi5idWZfaWR4OiAlZCBlbnF1ZXVlIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+YnVmc1swXS0+YnVmX2lkeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwbWUtPmJ1ZkRvbmUoZnJhbWUtPmJ1ZnNbMF0tPmJ1Zl9pZHgpOworICAgICAgICB9CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEJhdGNoQnVmcworICoKKyAqIERFU0NSSVBUSU9OOiBhbGxvY2F0ZSBiYXRjaCBjb250YWluZXJzIGZvciB0aGUgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBudW1fYnVmcyAgIDogbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkCisgKiAgIEBpbml0aWFsX3JlZ19mbGFnOiBmbGFnIHRvIGluZGljYXRlIGlmIGJ1ZmZlciBuZWVkcyB0byBiZSByZWdpc3RlcmVkCisgKiAgICAgICAgICAgICAgICAgICAgICBhdCBrZXJuZWwgaW5pdGlhbGx5CisgKiAgIEBidWZzICAgICAgIDogb3V0cHV0IG9mIGFsbG9jYXRlZCBidWZmZXJzCisgICogIEBvcHNfdGJsICAgIDogcHRyIHRvIGJ1ZiBtYXBwaW5nL3VubWFwcGluZyBvcHMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzU3RyZWFtOjpnZXRCYXRjaEJ1ZnMoCisgICAgICAgIHVpbnQ4X3QgKm51bV9idWZzLCB1aW50OF90ICoqaW5pdGlhbF9yZWdfZmxhZywKKyAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqKmJ1ZnMsCisgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIHVpbnQ4X3QgKnJlZ0ZsYWdzOworCisgICAgaWYgKCFvcHNfdGJsIHx8ICFudW1fYnVmcyB8fCAhaW5pdGlhbF9yZWdfZmxhZyB8fCAhYnVmcykgeworICAgICAgICBMT0dFKCJpbnB1dCBhcmdzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBMT0dIKCJCYXRjaCBjb250YWluZXIgYWxsb2NhdGlvbiBzdHJlYW0gdHlwZSA9ICVkIiwKKyAgICAgICAgICAgICBnZXRNeVR5cGUoKSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBtTWVtT3BzID0gb3BzX3RibDsKKworICAgIC8vQWxsb2NhdGUgYmF0Y2ggY29udGFpbmVycworICAgIG1TdHJlYW1CYXRjaEJ1ZnMgPSBuZXcgUUNhbWVyYTNIZWFwTWVtb3J5KDEpOworICAgIGlmICghbVN0cmVhbUJhdGNoQnVmcykgeworICAgICAgICBMT0dFKCJ1bmFibGUgdG8gY3JlYXRlIGJhdGNoIGNvbnRhaW5lciBtZW1vcnkiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgLy8gQWxsb2NhdGluZyBzaW5nbGUgYnVmZmVyIGZpbGUtZGVzY3JpcHRvciBmb3IgYWxsIGJhdGNoIGNvbnRhaW5lcnMsCisgICAgLy8gbVN0cmVhbUJhdGNoQnVmcyBjb25zaWRlcnMgYWxsIHRoZSBjb250YWluZXIgYnVmcyBhcyBhIHNpbmdsZSBidWZmZXIuIEJ1dAorICAgIC8vIFFDYW1lcmEzU3RyZWFtIG1hbmFnZXMgdGhhdCBzaW5nbGUgYnVmZmVyIGFzIG11bHRpcGxlIGJhdGNoIGJ1ZmZlcnMKKyAgICBMT0dEKCJBbGxvY2F0aW5nIGJhdGNoIGNvbnRhaW5lciBtZW1vcnkuIG51bUJhdGNoOiAlZCBzaXplOiAlZCIsCisgICAgICAgICAgICAgbU51bUJhdGNoQnVmcywgbVN0cmVhbUluZm8tPnVzZXJfYnVmX2luZm8uc2l6ZSk7CisgICAgcmMgPSBtU3RyZWFtQmF0Y2hCdWZzLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgIG1OdW1CYXRjaEJ1ZnMgKiBtU3RyZWFtSW5mby0+dXNlcl9idWZfaW5mby5zaXplKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoInVuYWJsZSB0byBhbGxvY2F0ZSBiYXRjaCBjb250YWluZXIgbWVtb3J5Iik7CisgICAgICAgIHJjID0gTk9fTUVNT1JZOworICAgICAgICBnb3RvIGVycjE7CisgICAgfQorCisgICAgLyogbWFwIGJhdGNoIGJ1ZmZlcnMuIGdldENudCBoZXJlIHJldHVybnMgMSBiZWNhdXNlIG9mIHNpbmdsZSBGRCBhY3Jvc3MKKyAgICAgKiBiYXRjaCBidWZzICovCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1TdHJlYW1CYXRjaEJ1ZnMtPmdldENudCgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1OdW1CYXRjaEJ1ZnMpIHsKKyAgICAgICAgICAgIC8vRm9yIFVTRVJfQlVGLCBzaXplID0gbnVtYmVyX29mX2NvbnRhaW5lciBidWZzIGluc3RlYWQgb2YgdGhlIHRvdGFsCisgICAgICAgICAgICAvL2J1ZiBzaXplCisgICAgICAgICAgICByYyA9IG9wc190YmwtPm1hcF9vcHMoaSwgLTEsIG1TdHJlYW1CYXRjaEJ1ZnMtPmdldEZkKGkpLAorICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KW1OdW1CYXRjaEJ1ZnMsIG1TdHJlYW1CYXRjaEJ1ZnMtPmdldFB0cihpKSwKKyAgICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX1VTRVJfQlVGLAorICAgICAgICAgICAgICAgICAgICBvcHNfdGJsLT51c2VyZGF0YSk7CisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIG1hcCBzdHJlYW0gY29udGFpbmVyIGJ1ZmZlcjogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgICAvL1VubWFwIGFsbCB0aGUgYnVmZmVycyB0aGF0IHdlcmUgc3VjY2Vzc2Z1bGx5IG1hcHBlZCBiZWZvcmUKKyAgICAgICAgICAgICAgICAvL3RoaXMgYnVmZmVyIG1hcHBpbmcgZmFpbGVkCisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgb3BzX3RibC0+dW5tYXBfb3BzKGosIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9VU0VSX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHNfdGJsLT51c2VyZGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gZXJyMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBidWZmZXIgc2l6ZSAoYmFkIGluZGV4KSIpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HRCgiYmF0Y2ggYnVmcyBzdWNjZXNzZnVsbHkgbW1hcHBlZCA9ICVkIiwKKyAgICAgICAgICAgICBtTnVtQmF0Y2hCdWZzKTsKKworICAgIC8qIHJlZ0ZsYWdzIGFycmF5IGlzIGFsbG9jYXRlZCBoZXJlLCBidXQgY29uc3VtZWQgYW5kIGZyZWVkIGJ5CisgICAgICogbW0tY2FtZXJhLWludGVyZmFjZSAqLworICAgIHJlZ0ZsYWdzID0gKHVpbnQ4X3QgKiltYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogbU51bUJhdGNoQnVmcyk7CisgICAgaWYgKCFyZWdGbGFncykgeworICAgICAgICBMT0dFKCJPdXQgb2YgbWVtb3J5Iik7CisgICAgICAgIHJjID0gTk9fTUVNT1JZOworICAgICAgICBnb3RvIGVycjM7CisgICAgfQorICAgIG1lbXNldChyZWdGbGFncywgMCwgc2l6ZW9mKHVpbnQ4X3QpICogbU51bUJhdGNoQnVmcyk7CisgICAgLyogRG8gbm90IHF1ZXVlIHRoZSBjb250YWluZXIgYnVmZmVycyBhcyB0aGUgaW1hZ2UgYnVmZmVycyBhcmUgbm90IHlldAorICAgICAqIHF1ZXVlZC4gbVN0cmVhbUJhdGNoQnVmcy0+Z2V0UmVnRmxhZ3MgaXMgbm90IGNhbGxlZCBhcyBtU3RyZWFtQmF0Y2hCdWZzCisgICAgICogY29uc2lkZXJzIHNpbmdsZSBidWZmZXIgaXMgYWxsb2NhdGVkICovCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1OdW1CYXRjaEJ1ZnM7IGkrKykgeworICAgICAgICByZWdGbGFnc1tpXSA9IDA7CisgICAgfQorCisgICAgbUJhdGNoQnVmRGVmcyA9IChtbV9jYW1lcmFfYnVmX2RlZl90ICopCisgICAgICAgICAgICBtYWxsb2MobU51bUJhdGNoQnVmcyAqIHNpemVvZihtbV9jYW1lcmFfYnVmX2RlZl90KSk7CisgICAgaWYgKG1CYXRjaEJ1ZkRlZnMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJtQmF0Y2hCdWZEZWZzIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICByYyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBnb3RvIGVycjQ7CisgICAgfQorICAgIG1lbXNldChtQmF0Y2hCdWZEZWZzLCAwLCBtTnVtQmF0Y2hCdWZzICogc2l6ZW9mKG1tX2NhbWVyYV9idWZfZGVmX3QpKTsKKworICAgIC8vUG9wdWxhdGUgYnVmRGVmIGFuZCBxdWV1ZSB0byBmcmVlIGJhdGNoQnVmUQorICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtTnVtQmF0Y2hCdWZzOyBpKyspIHsKKyAgICAgICAgZ2V0QmF0Y2hCdWZEZWYobUJhdGNoQnVmRGVmc1tpXSwgaSk7CisgICAgICAgIGlmKG1GcmVlQmF0Y2hCdWZRLmVucXVldWUoKHZvaWQqKSAmbUJhdGNoQnVmRGVmc1tpXSkpIHsKKyAgICAgICAgICAgIExPR0QoIm1CYXRjaEJ1ZkRlZnNbJWRdOiAweCVwIiwgaSwgJm1CYXRjaEJ1ZkRlZnNbaV0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgiZW5xdWV1ZSBtQmF0Y2hCdWZEZWZzWyVkXSBmYWlsZWQiLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpudW1fYnVmcyA9IG1OdW1CYXRjaEJ1ZnM7CisgICAgKmluaXRpYWxfcmVnX2ZsYWcgPSByZWdGbGFnczsKKyAgICAqYnVmcyA9IG1CYXRjaEJ1ZkRlZnM7CisgICAgTE9HSCgic3RyZWFtIHR5cGU6ICVkLCBudW1CdWZzKGJhdGNoKTogJWQiLAorICAgICAgICAgICAgIG1TdHJlYW1JbmZvLT5zdHJlYW1fdHlwZSwgbU51bUJhdGNoQnVmcyk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7CitlcnI0OgorICAgIGZyZWUocmVnRmxhZ3MpOworZXJyMzoKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1CYXRjaEJ1ZnMtPmdldENudCgpOyBpKyspIHsKKyAgICAgICAgb3BzX3RibC0+dW5tYXBfb3BzKGksIC0xLCBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fVVNFUl9CVUYsCisgICAgICAgICAgICAgICAgb3BzX3RibC0+dXNlcmRhdGEpOworICAgIH0KK2VycjI6CisgICAgbVN0cmVhbUJhdGNoQnVmcy0+ZGVhbGxvY2F0ZSgpOworZXJyMToKKyAgICBkZWxldGUgbVN0cmVhbUJhdGNoQnVmczsKKyAgICBtU3RyZWFtQmF0Y2hCdWZzID0gTlVMTDsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcHV0QmF0Y2hCdWZzCisgKgorICogREVTQ1JJUFRJT046IGRlYWxsb2NhdGUgc3RyZWFtIGJhdGNoIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG9wc190YmwgICAgOiBwdHIgdG8gYnVmIG1hcHBpbmcvdW5tYXBwaW5nIG9wcworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW06OnB1dEJhdGNoQnVmcyhtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBpZiAobVN0cmVhbUJhdGNoQnVmcykgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbVN0cmVhbUJhdGNoQnVmcy0+Z2V0Q250KCk7IGkrKykgeworICAgICAgICAgICAgcmMgPSBvcHNfdGJsLT51bm1hcF9vcHMoaSwgLTEsIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9VU0VSX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgb3BzX3RibC0+dXNlcmRhdGEpOworICAgICAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoInVuLW1hcCBiYXRjaCBidWYgZmFpbGVkOiAlZCIsIHJjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtU3RyZWFtQmF0Y2hCdWZzLT5kZWFsbG9jYXRlKCk7CisgICAgICAgIGRlbGV0ZSBtU3RyZWFtQmF0Y2hCdWZzOworICAgICAgICBtU3RyZWFtQmF0Y2hCdWZzID0gTlVMTDsKKyAgICB9CisgICAgLy8gbW0tY2FtZXJhLWludGVyZmFjZSBmcmVlcyBidWZEZWZzIGV2ZW4gdGhvdWdoIGJ1ZkRlZnMgYXJlIGFsbG9jYXRlZCBieQorICAgIC8vIFFDYW1lcmEzU3RyZWFtLiBEb24ndCBmcmVlIGhlcmUKKyAgICBtQmF0Y2hCdWZEZWZzID0gTlVMTDsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRCYXRjaEJ1ZkRlZgorICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBkZXRhaWxlZCBidWZmZXIgaW5mb3JtYXRpb24gb2YgYmF0Y2ggYnVmZmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBidWZEZWYgIDogW291dHB1dF0gcmVmZXJlbmNlIHRvIHN0cnVjdCB0byBzdG9yZSBidWZmZXIgZGVmaW5pdGlvbgorICogICBAQGluZGV4ICA6IFtpbnB1dF0gaW5kZXggb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW06OmdldEJhdGNoQnVmRGVmKG1tX2NhbWVyYV9idWZfZGVmX3QmIGJhdGNoQnVmRGVmLAorICAgICAgICBpbnQzMl90IGluZGV4KQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIG1lbXNldCgmYmF0Y2hCdWZEZWYsIDAsIHNpemVvZihtbV9jYW1lcmFfYnVmX2RlZl90KSk7CisgICAgaWYgKG1TdHJlYW1CYXRjaEJ1ZnMpIHsKKyAgICAgICAgLy9TaW5nbGUgZmlsZSBkZXNjcmlwdG9yIGZvciBhbGwgYmF0Y2ggYnVmZmVycworICAgICAgICBiYXRjaEJ1ZkRlZi5mZCAgICAgICAgICA9IG1TdHJlYW1CYXRjaEJ1ZnMtPmdldEZkKDApOworICAgICAgICBiYXRjaEJ1ZkRlZi5idWZfdHlwZSAgICA9IENBTV9TVFJFQU1fQlVGX1RZUEVfVVNFUlBUUjsKKyAgICAgICAgYmF0Y2hCdWZEZWYuZnJhbWVfbGVuICAgPSBtU3RyZWFtSW5mby0+dXNlcl9idWZfaW5mby5zaXplOworICAgICAgICBiYXRjaEJ1ZkRlZi5tZW1faW5mbyAgICA9IG1TdHJlYW1CYXRjaEJ1ZnM7CisgICAgICAgIGJhdGNoQnVmRGVmLmJ1ZmZlciAgICAgID0gKHVpbnQ4X3QgKiltU3RyZWFtQmF0Y2hCdWZzLT5nZXRQdHIoMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZGV4ICogbVN0cmVhbUluZm8tPnVzZXJfYnVmX2luZm8uc2l6ZSk7CisgICAgICAgIGJhdGNoQnVmRGVmLmJ1Zl9pZHggICAgID0gaW5kZXg7CisgICAgICAgIGJhdGNoQnVmRGVmLnVzZXJfYnVmLm51bV9idWZmZXJzID0gbUJhdGNoU2l6ZTsKKyAgICAgICAgYmF0Y2hCdWZEZWYudXNlcl9idWYuYnVmc191c2VkID0gMDsKKyAgICAgICAgYmF0Y2hCdWZEZWYudXNlcl9idWYucGxhbmVfYnVmID0gbUJ1ZkRlZnM7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGFnZ3JlZ2F0ZUJ1ZlRvQmF0Y2gKKyAqCisgKiBERVNDUklQVElPTjogcXVldWUgYmF0Y2ggY29udGFpbmVyIHRvIGRvd25zdHJlYW0uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBidWZEZWYgOiBpbWFnZSBidWZmZXIgdG8gYmUgYWdncmVnYXRlZCBpbnRvIGJhdGNoCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcyBhbHdheXMKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW06OmFnZ3JlZ2F0ZUJ1ZlRvQmF0Y2gobW1fY2FtZXJhX2J1Zl9kZWZfdCYgYnVmRGVmKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIGlmIChVTkxJS0VMWSghbUJhdGNoU2l6ZSkpIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggbW9kIGlzIG5vdCBlbmFibGVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKCFtQ3VycmVudEJhdGNoQnVmRGVmKSB7CisgICAgICAgIG1DdXJyZW50QmF0Y2hCdWZEZWYgPSAobW1fY2FtZXJhX2J1Zl9kZWZfdCAqKW1GcmVlQmF0Y2hCdWZRLmRlcXVldWUoKTsKKyAgICAgICAgaWYgKCFtQ3VycmVudEJhdGNoQnVmRGVmKSB7CisgICAgICAgICAgICBMT0dFKCJObyBlbXB0eSBiYXRjaCBidWZmZXJzIGlzIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJiYXRjaCBidWZmZXI6ICVkIGRlcXVldWVkIGZyb20gZW1wdHkgYnVmZmVyIGxpc3QiLAorICAgICAgICAgICAgICAgIG1DdXJyZW50QmF0Y2hCdWZEZWYtPmJ1Zl9pZHgpOworICAgIH0KKyAgICBpZiAobUJ1ZnNTdGFnZWQgPT0gbUN1cnJlbnRCYXRjaEJ1ZkRlZi0+dXNlcl9idWYubnVtX2J1ZmZlcnMpIHsKKyAgICAgICAgTE9HRSgiYmF0Y2ggYnVmZmVyIGlzIGFscmVhZHkgZnVsbCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIG1DdXJyZW50QmF0Y2hCdWZEZWYtPnVzZXJfYnVmLmJ1Zl9pZHhbbUJ1ZnNTdGFnZWRdID0gYnVmRGVmLmJ1Zl9pZHg7CisgICAgbUJ1ZnNTdGFnZWQrKzsKKyAgICBMT0dEKCJidWZmZXIgaWQ6ICVkIGFnZ3JlZ2F0ZWQgaW50byBiYXRjaCBidWZmZXIgaWQ6ICVkIiwKKyAgICAgICAgICAgICBidWZEZWYuYnVmX2lkeCwgbUN1cnJlbnRCYXRjaEJ1ZkRlZi0+YnVmX2lkeCk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHF1ZXVlQmF0Y2hCdWYKKyAqCisgKiBERVNDUklQVElPTjogcXVldWUgYmF0Y2ggY29udGFpbmVyIHRvIGRvd25zdHJlYW0uCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzIGFsd2F5cworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1N0cmVhbTo6cXVldWVCYXRjaEJ1ZigpCit7CisgICAgaW50MzJfdCByYyA9IE5PX0VSUk9SOworCisgICAgaWYgKCFtQ3VycmVudEJhdGNoQnVmRGVmKSB7CisgICAgICAgIExPR0UoIk5vIGJ1ZmZlcnMgd2VyZSBxdWV1ZWQgaW50byBiYXRjaCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIC8vYnVmc191c2VkOiBudW1iZXIgb2YgdmFsaWQgYnVmZmVycyBpbiB0aGUgYmF0Y2ggYnVmZmVycworICAgIG1DdXJyZW50QmF0Y2hCdWZEZWYtPnVzZXJfYnVmLmJ1ZnNfdXNlZCA9IG1CdWZzU3RhZ2VkOworCisgICAgLy9pZiBtQnVmc1N0YWdlZCA8IG51bV9idWZmZXJzLCBpbml0aWFsaXplIHRoZSBidWZfaWR4IHRvIC0xIGZvciByZXN0IG9mIHRoZQorICAgIC8vYnVmZmVycworICAgIGZvciAoc2l6ZV90IGkgPSBtQnVmc1N0YWdlZDsgaSA8IG1DdXJyZW50QmF0Y2hCdWZEZWYtPnVzZXJfYnVmLm51bV9idWZmZXJzOworICAgICAgICAgICAgaSsrKSB7CisgICAgICAgIG1DdXJyZW50QmF0Y2hCdWZEZWYtPnVzZXJfYnVmLmJ1Zl9pZHhbaV0gPSAtMTsKKyAgICB9CisKKyAgICByYyA9IG1DYW1PcHMtPnFidWYobUNhbUhhbmRsZSwgbUNoYW5uZWxIYW5kbGUsIG1DdXJyZW50QmF0Y2hCdWZEZWYpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgicXVldWVpbmcgb2YgYmF0Y2ggYnVmZmVyOiAlZCBmYWlsZWQgd2l0aCBlcnI6ICVkIiwKKyAgICAgICAgICAgICAgICBtQ3VycmVudEJhdGNoQnVmRGVmLT5idWZfaWR4LCByYyk7CisgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorICAgIExPR0QoIkJhdGNoIGJ1ZiBpZDogJWQgcXVldWVkLiBidWZzX3VzZWQ6ICVkIiwKKyAgICAgICAgICAgIG1DdXJyZW50QmF0Y2hCdWZEZWYtPmJ1Zl9pZHgsCisgICAgICAgICAgICBtQ3VycmVudEJhdGNoQnVmRGVmLT51c2VyX2J1Zi5idWZzX3VzZWQpOworCisgICAgbUN1cnJlbnRCYXRjaEJ1ZkRlZiA9IE5VTEw7CisgICAgbUJ1ZnNTdGFnZWQgPSAwOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGhhbmRsZUJhdGNoQnVmZmVyCisgKgorICogREVTQ1JJUFRJT046IHNlcGFyYXRlIGluZGl2aWR1YWwgYnVmZmVycyBmcm9tIHRoZSBiYXRjaCBhbmQgaXNzdWUgY2FsbGJhY2sKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN1cGVyQnVmIDogUmVjZWl2ZWQgc3VwZXJidWYgY29udGFpbmluZyBiYXRjaCBidWZmZXIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzIGFsd2F5cworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1N0cmVhbTo6aGFuZGxlQmF0Y2hCdWZmZXIobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlckJ1ZikKK3sKKyAgICBpbnQzMl90IHJjID0gTk9fRVJST1I7CisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZTsKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90IGJhdGNoQnVmOworCisgICAgaWYgKExJS0VMWSghbUJhdGNoU2l6ZSkpIHsKKyAgICAgICAgTE9HRSgiU3RyZWFtOiAlZCBub3QgaW4gYmF0Y2ggbW9kZSwgYnV0IGJhdGNoIGJ1ZmZlciByZWNlaXZlZCIsCisgICAgICAgICAgICAgICAgIGdldE15VHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAoIW1EYXRhQ0IpIHsKKyAgICAgICAgTE9HRSgiRGF0YSBjYWxsYmFjayBub3Qgc2V0IGZvciBiYXRjaCBtb2RlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghc3VwZXJCdWYtPmJ1ZnNbMF0pIHsKKyAgICAgICAgTE9HRSgic3VwZXJCdWYtPmJ1ZnNbMF0gaXMgTlVMTCEhIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLyogQ29weSB0aGUgYmF0Y2ggYnVmZmVyIHRvIGxvY2FsIGFuZCBxdWV1ZSB0aGUgYmF0Y2ggYnVmZmVyIHRvICBlbXB0eSBxdWV1ZQorICAgICAqIHRvIGhhbmRsZSB0aGUgbmV3IHJlcXVlc3RzIHJlY2VpdmVkIHdoaWxlIGNhbGxiYWNrcyBhcmUgaW4gcHJvZ3Jlc3MgKi8KKyAgICBiYXRjaEJ1ZiA9ICpzdXBlckJ1Zi0+YnVmc1swXTsKKyAgICBpZiAoIW1GcmVlQmF0Y2hCdWZRLmVucXVldWUoKHZvaWQqKSBzdXBlckJ1Zi0+YnVmc1swXSkpIHsKKyAgICAgICAgTE9HRSgiYmF0Y2hCdWYuYnVmX2lkeDogJWQgZW5xdWV1ZSBmYWlsZWQiLAorICAgICAgICAgICAgICAgIGJhdGNoQnVmLmJ1Zl9pZHgpOworICAgICAgICBmcmVlKHN1cGVyQnVmKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgTE9HRCgiUmVjZWl2ZWQgYmF0Y2ggYnVmZmVyOiAlZCBidWZzX3VzZWQ6ICVkIiwKKyAgICAgICAgICAgIGJhdGNoQnVmLmJ1Zl9pZHgsIGJhdGNoQnVmLnVzZXJfYnVmLmJ1ZnNfdXNlZCk7CisgICAgLy9kdW1teSBsb2NhbCBidWZEZWYgdG8gaXNzdWUgbXVsdGlwbGUgY2FsbGJhY2tzCisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCBidWY7CisgICAgbWVtc2V0KCZidWYsIDAsIHNpemVvZihtbV9jYW1lcmFfYnVmX2RlZl90KSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJhdGNoQnVmLnVzZXJfYnVmLmJ1ZnNfdXNlZDsgaSsrKSB7CisgICAgICAgIGludDMyX3QgYnVmX2lkeCA9IGJhdGNoQnVmLnVzZXJfYnVmLmJ1Zl9pZHhbaV07CisgICAgICAgIGJ1ZiA9IG1CdWZEZWZzW2J1Zl9pZHhdOworCisgICAgICAgIC8qIHRoaXMgbWVtb3J5IGlzIGZyZWVkIGluc2lkZSBkYXRhQ0IuIFNob3VsZCBub3QgYmUgZnJlZWQgaGVyZSAqLworICAgICAgICBmcmFtZSA9IChtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKiltYWxsb2Moc2l6ZW9mKG1tX2NhbWVyYV9zdXBlcl9idWZfdCkpOworICAgICAgICBpZiAoIWZyYW1lKSB7CisgICAgICAgICAgICBMT0dFKCJtYWxsb2MgZmFpbGVkLiBCdWZmZXJzIHdpbGwgYmUgZHJvcHBlZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkoZnJhbWUsIHN1cGVyQnVmLCBzaXplb2YobW1fY2FtZXJhX3N1cGVyX2J1Zl90KSk7CisgICAgICAgICAgICBmcmFtZS0+YnVmc1swXSA9ICZidWY7CisKKyAgICAgICAgICAgIG1EYXRhQ0IoZnJhbWUsIHRoaXMsIG1Vc2VyRGF0YSk7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRCgiYmF0Y2ggYnVmZmVyOiAlZCBjYWxsYmFja3MgZG9uZSIsCisgICAgICAgICAgICBiYXRjaEJ1Zi5idWZfaWR4KTsKKworICAgIGZyZWUoc3VwZXJCdWYpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBmbHVzaEZyZWVCYXRjaEJ1ZlEKKyAqCisgKiBERVNDUklQVElPTjogZGVxdWV1ZSBhbGwgdGhlIGVudHJpZXMgb2YgbUZyZWVCYXRjaEJ1ZlEgYW5kIGNhbGwgZmx1c2guCisgKiAgICAgICAgICAgICAgUUNhbWVyYVF1ZXVlOjpmbHVzaCBjYWxscyAnZnJlZShub2RlLT5kYXRhKScgd2hpY2ggc2hvdWxkIGJlCisgKiAgICAgICAgICAgICAgYXZvaWRlZCBmb3IgbUZyZWVCYXRjaEJ1ZlEgYXMgdGhlIGVudHJpZXMgYXJlIG5vdCBhbGxvY2F0ZWQKKyAqICAgICAgICAgICAgICBkdXJpbmcgZWFjaCBlbnF1ZXVlCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzU3RyZWFtOjpmbHVzaEZyZWVCYXRjaEJ1ZlEoKQoreworICAgIHdoaWxlICghbUZyZWVCYXRjaEJ1ZlEuaXNFbXB0eSgpKSB7CisgICAgICAgIG1GcmVlQmF0Y2hCdWZRLmRlcXVldWUoKTsKKyAgICB9CisgICAgbUZyZWVCYXRjaEJ1ZlEuZmx1c2goKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHFjYW1lcmEKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzU3RyZWFtLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmJlNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1N0cmVhbS5oCkBAIC0wLDAgKzEsMTcwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19RQ0FNRVJBM19TVFJFQU1fSF9fCisjZGVmaW5lIF9fUUNBTUVSQTNfU1RSRUFNX0hfXworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIlFDYW1lcmEzTWVtLmgiCisjaW5jbHVkZSAiUUNhbWVyYTNTdHJlYW1NZW0uaCIKKyNpbmNsdWRlICJRQ2FtZXJhQ21kVGhyZWFkLmgiCisjaW5jbHVkZSAiUUNhbWVyYVF1ZXVlLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKK30KKworbmFtZXNwYWNlIHFjYW1lcmEgeworCitjbGFzcyBRQ2FtZXJhM0NoYW5uZWw7CitjbGFzcyBRQ2FtZXJhM1N0cmVhbTsKKwordHlwZWRlZiB2b2lkICgqaGFsM19zdHJlYW1fY2Jfcm91dGluZSkobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ2FtZXJhM1N0cmVhbSAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworY2xhc3MgUUNhbWVyYTNTdHJlYW0KK3sKK3B1YmxpYzoKKyAgICBRQ2FtZXJhM1N0cmVhbSh1aW50MzJfdCBjYW1IYW5kbGUsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaElkLAorICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX29wc190ICpjYW1PcHMsCisgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmdJbmZvLAorICAgICAgICAgICAgICAgICAgUUNhbWVyYTNDaGFubmVsICpjaGFubmVsKTsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhM1N0cmVhbSgpOworICAgIHZpcnR1YWwgaW50MzJfdCBpbml0KGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2Zvcm1hdF90IHN0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3Qgc3RyZWFtRGltLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9yb3RhdGlvbl90IHN0cmVhbVJvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fcmVwcm9jX2NvbmZpZ190KiByZXByb2Nlc3NfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWluU3RyZWFtQnVmTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9mZWF0dXJlX21hc2tfdCBwb3N0cHJvY2Vzc19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9pc190eXBlX3QgaXNfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiYXRjaFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFsM19zdHJlYW1fY2Jfcm91dGluZSBzdHJlYW1fY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworICAgIHZpcnR1YWwgaW50MzJfdCBidWZEb25lKHVpbnQzMl90IGluZGV4KTsKKyAgICB2aXJ0dWFsIGludDMyX3QgYnVmUmVsZWFzZShpbnQzMl90IGluZGV4KTsKKyAgICB2aXJ0dWFsIGludDMyX3QgcHJvY2Vzc0RhdGFOb3RpZnkobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpidWZzKTsKKyAgICB2aXJ0dWFsIGludDMyX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIGludDMyX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgaW50MzJfdCBxdWV1ZUJhdGNoQnVmKCk7CisKKyAgICBzdGF0aWMgdm9pZCBkYXRhTm90aWZ5Q0IobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpyZWN2ZF9mcmFtZSwgdm9pZCAqdXNlcmRhdGEpOworICAgIHN0YXRpYyB2b2lkICpkYXRhUHJvY1JvdXRpbmUodm9pZCAqZGF0YSk7CisgICAgdWludDMyX3QgZ2V0TXlIYW5kbGUoKSBjb25zdCB7cmV0dXJuIG1IYW5kbGU7fQorICAgIGNhbV9zdHJlYW1fdHlwZV90IGdldE15VHlwZSgpIGNvbnN0OworICAgIGludDMyX3QgZ2V0RnJhbWVPZmZzZXQoY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCAmb2Zmc2V0KTsKKyAgICBpbnQzMl90IGdldEZyYW1lRGltZW5zaW9uKGNhbV9kaW1lbnNpb25fdCAmZGltKTsKKyAgICBpbnQzMl90IGdldEZvcm1hdChjYW1fZm9ybWF0X3QgJmZtdCk7CisgICAgUUNhbWVyYTNTdHJlYW1NZW0gKmdldFN0cmVhbUJ1ZnMoKSB7cmV0dXJuIG1TdHJlYW1CdWZzO307CisgICAgdWludDMyX3QgZ2V0TXlTZXJ2ZXJJRCgpOworCisgICAgaW50MzJfdCBtYXBCdWYodWludDhfdCBidWZfdHlwZSwgdWludDMyX3QgYnVmX2lkeCwKKyAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4LCBpbnQgZmQsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworICAgIGludDMyX3QgdW5tYXBCdWYodWludDhfdCBidWZfdHlwZSwgdWludDMyX3QgYnVmX2lkeCwgaW50MzJfdCBwbGFuZV9pZHgpOworICAgIGludDMyX3Qgc2V0UGFyYW1ldGVyKGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCAmcGFyYW0pOworICAgIGNhbV9zdHJlYW1faW5mb190KiBnZXRTdHJlYW1JbmZvKCkgY29uc3Qge3JldHVybiBtU3RyZWFtSW5mbzsgfTsKKworICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VGcmFtZURhdGEodm9pZCAqZGF0YSwgdm9pZCAqdXNlcl9kYXRhKTsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtQ2FtSGFuZGxlOworICAgIHVpbnQzMl90IG1DaGFubmVsSGFuZGxlOworICAgIHVpbnQzMl90IG1IYW5kbGU7IC8vIHN0cmVhbSBoYW5kbGUgZnJvbSBtbS1jYW1lcmEtaW50ZXJmYWNlCisgICAgbW1fY2FtZXJhX29wc190ICptQ2FtT3BzOworICAgIGNhbV9zdHJlYW1faW5mb190ICptU3RyZWFtSW5mbzsgLy8gcHRyIHRvIHN0cmVhbSBpbmZvIGJ1ZgorICAgIG1tX2NhbWVyYV9zdHJlYW1fbWVtX3Z0YmxfdCBtTWVtVnRibDsKKyAgICBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqbU1lbU9wczsKKyAgICB1aW50OF90IG1OdW1CdWZzOworICAgIGhhbDNfc3RyZWFtX2NiX3JvdXRpbmUgbURhdGFDQjsKKyAgICB2b2lkICptVXNlckRhdGE7CisKKyAgICBRQ2FtZXJhUXVldWUgICAgIG1EYXRhUTsKKyAgICBRQ2FtZXJhQ21kVGhyZWFkIG1Qcm9jVGg7IC8vIHRocmVhZCBmb3IgZGF0YUNCCisKKyAgICBRQ2FtZXJhM0hlYXBNZW1vcnkgKm1TdHJlYW1JbmZvQnVmOworICAgIFFDYW1lcmEzU3RyZWFtTWVtICptU3RyZWFtQnVmczsKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICptQnVmRGVmczsKKyAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90IG1GcmFtZUxlbk9mZnNldDsKKyAgICBjYW1fcGFkZGluZ19pbmZvX3QgbVBhZGRpbmdJbmZvOworICAgIFFDYW1lcmEzQ2hhbm5lbCAqbUNoYW5uZWw7CisgICAgTXV0ZXggbUxvY2s7ICAgIC8vTG9jayBjb250cm9sbGluZyBhY2Nlc3MgdG8gJ21CdWZEZWZzJworCisgICAgdWludDMyX3QgbUJhdGNoU2l6ZTsgLy8gMDogTm8gYmF0Y2gsIG5vbi0wOiBOdW1iZXIgb2YgaW1hYWdlIGJ1ZnMgaW4gYSBiYXRjaAorICAgIHVpbnQ4X3QgbU51bUJhdGNoQnVmczsgLy9OdW1iZXIgb2YgYmF0Y2ggYnVmZmVycyB3aGljaCBjYW4gaG9sZCBpbWFnZSBidWZzCisgICAgUUNhbWVyYTNIZWFwTWVtb3J5ICptU3RyZWFtQmF0Y2hCdWZzOyAvL1BvaW50ZXIgdG8gYmF0Y2ggYnVmZmVycyBtZW1vcnkKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICptQmF0Y2hCdWZEZWZzOyAvL1BvaW50ZXIgdG8gYXJyYXkgb2YgYmF0Y2ggYnVmRGVmcworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1DdXJyZW50QmF0Y2hCdWZEZWY7IC8vYmF0Y2ggYnVmZmVyIGluIHByb2dyZXNzIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWdncmVnYXRpb24KKyAgICB1aW50MzJfdCAgICBtQnVmc1N0YWdlZDsgLy9OdW1iZXIgb2YgaW1hZ2UgYnVmZmVycyBhZ2dyZWdhdGVkIGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jdXJyZW50QmF0Y2hCdWZEZWYKKyAgICBRQ2FtZXJhUXVldWUgbUZyZWVCYXRjaEJ1ZlE7IC8vQnVmZmVyIHF1ZXVlIGNvbnRhaW5pbmcgZW1wdHkgYmF0Y2ggYnVmZmVycworCisgICAgc3RhdGljIGludDMyX3QgZ2V0X2J1ZnMoCisgICAgICAgICAgICAgICAgICAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90ICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpudW1fYnVmcywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKippbml0aWFsX3JlZ19mbGFnLAorICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqKmJ1ZnMsCisgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisgICAgc3RhdGljIGludDMyX3QgcHV0X2J1ZnMoCisgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSk7CisgICAgc3RhdGljIGludDMyX3QgaW52YWxpZGF0ZV9idWYodWludDMyX3QgaW5kZXgsIHZvaWQgKnVzZXJfZGF0YSk7CisgICAgc3RhdGljIGludDMyX3QgY2xlYW5faW52YWxpZGF0ZV9idWYodWludDMyX3QgaW5kZXgsIHZvaWQgKnVzZXJfZGF0YSk7CisKKyAgICBpbnQzMl90IGdldEJ1ZnMoY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCAqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbnVtX2J1ZnMsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqaW5pdGlhbF9yZWdfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKipidWZzLAorICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKm9wc190YmwpOworICAgIGludDMyX3QgcHV0QnVmcyhtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCk7CisgICAgaW50MzJfdCBpbnZhbGlkYXRlQnVmKHVpbnQzMl90IGluZGV4KTsKKyAgICBpbnQzMl90IGNsZWFuSW52YWxpZGF0ZUJ1Zih1aW50MzJfdCBpbmRleCk7CisgICAgaW50MzJfdCBnZXRCYXRjaEJ1ZnMoCisgICAgICAgICAgICB1aW50OF90ICpudW1fYnVmcywgdWludDhfdCAqKmluaXRpYWxfcmVnX2ZsYWcsCisgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICoqYnVmcywKKyAgICAgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsKTsKKyAgICBpbnQzMl90IHB1dEJhdGNoQnVmcyhtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCk7CisgICAgaW50MzJfdCBnZXRCYXRjaEJ1ZkRlZihtbV9jYW1lcmFfYnVmX2RlZl90JiBiYXRjaEJ1ZkRlZiwKKyAgICAgICAgICAgIGludDMyX3QgaW5kZXgpOworICAgIGludDMyX3QgYWdncmVnYXRlQnVmVG9CYXRjaChtbV9jYW1lcmFfYnVmX2RlZl90JiBidWZEZWYpOworICAgIGludDMyX3QgaGFuZGxlQmF0Y2hCdWZmZXIobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzdXBlckJ1Zik7CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciogbVN0cmVhbU5hbWVzW0NBTV9TVFJFQU1fVFlQRV9NQVhdOworICAgIHZvaWQgZmx1c2hGcmVlQmF0Y2hCdWZRKCk7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQorCisjZW5kaWYgLyogX19RQ0FNRVJBM19TVFJFQU1fSF9fICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1N0cmVhbU1lbS5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1N0cmVhbU1lbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0M2FmYgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzU3RyZWFtTWVtLmNwcApAQCAtMCwwICsxLDQ3NyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjZGVmaW5lIExPR19UQUcgIlFDYW1lcmEzU3RyZWFtTWVtIgorCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiZ3JhbGxvY19wcml2LmgiCisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJRQ2FtZXJhM1N0cmVhbU1lbS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmEzU3RyZWFtTWVtCisgKgorICogREVTQ1JJUFRJT046IGRlZmF1bHQgY29uc3RydWN0b3Igb2YgUUNhbWVyYTNTdHJlYW1NZW0KKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEzU3RyZWFtTWVtOjpRQ2FtZXJhM1N0cmVhbU1lbSh1aW50MzJfdCBtYXhIZWFwQnVmZmVyLCBib29sIHF1ZXVlSGVhcEJ1ZmZlcnMpIDoKKyAgICAgICAgbUhlYXBNZW0obWF4SGVhcEJ1ZmZlciksCisgICAgICAgIG1HcmFsbG9jTWVtKG1heEhlYXBCdWZmZXIpLAorICAgICAgICBtTWF4SGVhcEJ1ZmZlcnMobWF4SGVhcEJ1ZmZlciksCisgICAgICAgIG1RdWV1ZUhlYXBCdWZmZXJzKHF1ZXVlSGVhcEJ1ZmZlcnMpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYTNTdHJlYW1NZW0KKyAqCisgKiBERVNDUklQVElPTjogZGVzdHJ1Y3RvciBvZiBRQ2FtZXJhM1N0cmVhbU1lbQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYTNTdHJlYW1NZW06On5RQ2FtZXJhM1N0cmVhbU1lbSgpCit7CisgICAgY2xlYXIoKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRDbnQKKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkL3JlZ2lzdGVyZWQKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgUUNhbWVyYTNTdHJlYW1NZW06OmdldENudCgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgcmV0dXJuIChtSGVhcE1lbS5nZXRDbnQoKSArIG1HcmFsbG9jTWVtLmdldENudCgpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRSZWdGbGFncworICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBpbml0aWFsIHJlZyBmbGFncworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcmVnRmxhZ3M6IGluaXRpYWwgcmVnIGZsYWdzIG9mIHRoZSBhbGxvY2F0ZWQvcmVnaXN0ZXJlZCBidWZmZXJzCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEzU3RyZWFtTWVtOjpnZXRSZWdGbGFncyh1aW50OF90ICogcmVnRmxhZ3MpCit7CisgICAgLy8gQXNzdW1lIHRoYXQgYWxsIGJ1ZmZlcnMgYWxsb2NhdGVkIGNhbiBiZSBxdWV1ZWQuCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1IZWFwTWVtLmdldENudCgpOyBpICsrKQorICAgICAgICByZWdGbGFnc1tpXSA9IChtUXVldWVIZWFwQnVmZmVycyA/IDEgOiAwKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RmQKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgaW5kZXhlZCBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGZpbGUgZGVzY3JpcHRvcgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTNTdHJlYW1NZW06OmdldEZkKHVpbnQzMl90IGluZGV4KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGlmIChpbmRleCA8IG1NYXhIZWFwQnVmZmVycykKKyAgICAgICAgcmV0dXJuIG1IZWFwTWVtLmdldEZkKGluZGV4KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBtR3JhbGxvY01lbS5nZXRGZChpbmRleCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0U2l6ZQorICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm4gYnVmZmVyIHNpemUgb2YgdGhlIGluZGV4ZWQgYnVmZmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmRleCAgIDogaW5kZXggb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBidWZmZXIgc2l6ZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzc2l6ZV90IFFDYW1lcmEzU3RyZWFtTWVtOjpnZXRTaXplKHVpbnQzMl90IGluZGV4KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGlmIChpbmRleCA8IG1NYXhIZWFwQnVmZmVycykKKyAgICAgICAgcmV0dXJuIG1IZWFwTWVtLmdldFNpemUoaW5kZXgpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG1HcmFsbG9jTWVtLmdldFNpemUoaW5kZXgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGludmFsaWRhdGVDYWNoZQorICoKKyAqIERFU0NSSVBUSU9OOiBpbnZhbGlkYXRlIHRoZSBjYWNoZSBvZiB0aGUgaW5kZXhlZCBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEzU3RyZWFtTWVtOjppbnZhbGlkYXRlQ2FjaGUodWludDMyX3QgaW5kZXgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgaWYgKGluZGV4IDwgbU1heEhlYXBCdWZmZXJzKQorICAgICAgICByZXR1cm4gbUhlYXBNZW0uaW52YWxpZGF0ZUNhY2hlKGluZGV4KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBtR3JhbGxvY01lbS5pbnZhbGlkYXRlQ2FjaGUoaW5kZXgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNsZWFuSW52YWxpZGF0ZUNhY2hlCisgKgorICogREVTQ1JJUFRJT046IGNsZWFuIGFuZCBpbnZhbGlkYXRlIHRoZSBjYWNoZSBvZiB0aGUgaW5kZXhlZCBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEzU3RyZWFtTWVtOjpjbGVhbkludmFsaWRhdGVDYWNoZSh1aW50MzJfdCBpbmRleCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBpZiAoaW5kZXggPCBtTWF4SGVhcEJ1ZmZlcnMpCisgICAgICAgIHJldHVybiBtSGVhcE1lbS5jbGVhbkludmFsaWRhdGVDYWNoZShpbmRleCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gbUdyYWxsb2NNZW0uY2xlYW5JbnZhbGlkYXRlQ2FjaGUoaW5kZXgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEJ1ZkRlZgorICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBkZXRhaWxlZCBidWZmZXIgaW5mb3JtYXRpb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG9mZnNldCAgOiBbaW5wdXRdIGZyYW1lIGJ1ZmZlciBvZmZzZXQKKyAqICAgQGJ1ZkRlZiAgOiBbb3V0cHV0XSByZWZlcmVuY2UgdG8gc3RydWN0IHRvIHN0b3JlIGJ1ZmZlciBkZWZpbml0aW9uCisgKiAgIEBpbmRleCAgIDogW2lucHV0XSBpbmRleCBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1N0cmVhbU1lbTo6Z2V0QnVmRGVmKGNvbnN0IGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QgJm9mZnNldCwKKyAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAmYnVmRGVmLCB1aW50MzJfdCBpbmRleCkKK3sKKyAgICBpbnQzMl90IHJldCA9IE5PX0VSUk9SOworCisgICAgaWYgKGluZGV4IDwgbU1heEhlYXBCdWZmZXJzKQorICAgICAgICByZXQgPSBtSGVhcE1lbS5nZXRCdWZEZWYob2Zmc2V0LCBidWZEZWYsIGluZGV4KTsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IG1HcmFsbG9jTWVtLmdldEJ1ZkRlZihvZmZzZXQsIGJ1ZkRlZiwgaW5kZXgpOworCisgICAgYnVmRGVmLm1lbV9pbmZvID0gKHZvaWQgKil0aGlzOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRQdHIKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIHZpcnR1YWwgYWRkcmVzcyBvZiB0aGUgaW5kZXhlZCBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IHZpcnR1YWwgYWRkcmVzcworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkKiBRQ2FtZXJhM1N0cmVhbU1lbTo6Z2V0UHRyKHVpbnQzMl90IGluZGV4KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGlmIChpbmRleCA8IG1NYXhIZWFwQnVmZmVycykKKyAgICAgICAgcmV0dXJuIG1IZWFwTWVtLmdldFB0cihpbmRleCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gbUdyYWxsb2NNZW0uZ2V0UHRyKGluZGV4KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB2YWxpZAorICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm4gd2hldGhlciB0aGVyZSBpcyBhIHZhbGlkIGJ1ZmZlciBhdCB0aGUgY3VycmVudCBpbmRleAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGluZGV4IG9mIHRoZSBidWZmZXIKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZSBpZiB0aGVyZSBpcyBhIGJ1ZmZlciwgZmFsc2Ugb3RoZXJ3aXNlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTNTdHJlYW1NZW06OnZhbGlkKHVpbnQzMl90IGluZGV4KQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGlmIChpbmRleCA8IG1NYXhIZWFwQnVmZmVycykKKyAgICAgICAgcmV0dXJuIChtSGVhcE1lbS5nZXRTaXplKGluZGV4KSA+IDApOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIChtR3JhbGxvY01lbS5nZXRTaXplKGluZGV4KSA+IDApOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHJlZ2lzdGVyQnVmZmVyCisgKgorICogREVTQ1JJUFRJT046IHJlZ2lzdGVycyBmcmFtZXdvcmtzLWFsbG9jYXRlZCBncmFsbG9jIGJ1ZmZlcl9oYW5kbGVfdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAYnVmZmVycyA6IGJ1ZmZlcl9oYW5kbGVfdCBwb2ludGVyCisgKiAgIEB0eXBlIDogICAgY2FtX3N0cmVhbV90eXBlX3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTNTdHJlYW1NZW06OnJlZ2lzdGVyQnVmZmVyKGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLAorICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCB0eXBlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbUdyYWxsb2NNZW0ucmVnaXN0ZXJCdWZmZXIoYnVmZmVyLCB0eXBlKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVucmVnaXN0ZXJCdWZmZXIKKyAqCisgKiBERVNDUklQVElPTjogdW5yZWdpc3RlciBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGlkeCAgICAgOiB1bnJlZ2lzdGVyIGJ1ZmZlciBhdCBpbmRleCAnaWR4JworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW1NZW06OnVucmVnaXN0ZXJCdWZmZXIoc2l6ZV90IGlkeCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1HcmFsbG9jTWVtLnVucmVnaXN0ZXJCdWZmZXIoaWR4KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRNYXRjaEJ1ZkluZGV4CisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IGJ1ZmZlciBpbmRleCBieSBvYmplY3QgcHRyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBvcGFxdWUgIDogb3BhcXVlIHB0cgorICoKKyAqIFJFVFVSTiAgICAgOiBidWZmZXIgaW5kZXggaWYgbWF0Y2ggZm91bmQsCisgKiAgICAgICAgICAgICAgLTEgaWYgZmFpbGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM1N0cmVhbU1lbTo6Z2V0TWF0Y2hCdWZJbmRleCh2b2lkICpvYmplY3QpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHJldHVybiBtR3JhbGxvY01lbS5nZXRNYXRjaEJ1ZkluZGV4KG9iamVjdCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0QnVmZmVySGFuZGxlCisgKgorICogREVTQ1JJUFRJT046IHJldHVybiBmcmFtZXdvcmsgcG9pbnRlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGluZGV4IG9mIHRoZSBidWZmZXIKKyAqCisgKiBSRVRVUk4gICAgIDogYnVmZmVyIHB0ciBpZiBtYXRjaCBmb3VuZAorICAgICAgICAgICAgICAgIE5VTEwgaWYgZmFpbGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgKlFDYW1lcmEzU3RyZWFtTWVtOjpnZXRCdWZmZXJIYW5kbGUodWludDMyX3QgaW5kZXgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHJldHVybiBtR3JhbGxvY01lbS5nZXRCdWZmZXJIYW5kbGUoaW5kZXgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHVucmVnaXN0ZXJCdWZmZXJzCisgKgorICogREVTQ1JJUFRJT046IHVucmVnaXN0ZXIgYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhM1N0cmVhbU1lbTo6dW5yZWdpc3RlckJ1ZmZlcnMoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtR3JhbGxvY01lbS51bnJlZ2lzdGVyQnVmZmVycygpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogYWxsb2NhdGUKKyAqCisgKiBERVNDUklQVElPTjogYWxsb2NhdGUgcmVxdWVzdGVkIG51bWJlciBvZiBidWZmZXJzIG9mIGNlcnRhaW4gc2l6ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY291bnQgICA6IG51bWJlciBvZiBidWZmZXJzIHRvIGJlIGFsbG9jYXRlZAorICogICBAc2l6ZSAgICA6IGxlbmdodCBvZiB0aGUgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM1N0cmVhbU1lbTo6YWxsb2NhdGVBbGwoc2l6ZV90IHNpemUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHJldHVybiBtSGVhcE1lbS5hbGxvY2F0ZShzaXplKTsKK30KKworaW50IFFDYW1lcmEzU3RyZWFtTWVtOjphbGxvY2F0ZU9uZShzaXplX3Qgc2l6ZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1IZWFwTWVtLmFsbG9jYXRlT25lKHNpemUpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGRlYWxsb2NhdGUKKyAqCisgKiBERVNDUklQVElPTjogZGVhbGxvY2F0ZSBoZWFwIGJ1ZmZlcnMKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYTNTdHJlYW1NZW06OmRlYWxsb2NhdGUoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtSGVhcE1lbS5kZWFsbG9jYXRlKCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbWFya0ZyYW1lTnVtYmVyCisgKgorICogREVTQ1JJUFRJT046IFdlIHVzZSB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIHJlcXVlc3QgY2FsbCBwYXRoIHRvIG1hcmsgdGhlCisgKiAgICAgICAgICAgICAgYnVmZmVycyB3aXRoIHRoZSBmcmFtZSBudW1iZXIgdGhleSBhcmUgaW50ZW5kZWQgZm9yIHRoaXMgaW5mbworICogICAgICAgICAgICAgIGlzIHVzZWQgbGF0ZXIgd2hlbiBnaXZpbmcgb3V0IGNhbGxiYWNrICYgaXQgaXMgZHV0eSBvZiBQUCB0bworICogICAgICAgICAgICAgIGVuc3VyZSB0aGF0IGRhdGEgZm9yIHRoYXQgcGFydGljdWxhciBmcmFtZU51bWJlci9SZXF1ZXN0IGlzCisgKiAgICAgICAgICAgICAgd3JpdHRlbiB0byB0aGlzIGJ1ZmZlci4KKyAqIFBBUkFNRVRFUlMgOgorICogICBAaW5kZXggICA6IGluZGV4IG9mIHRoZSBidWZmZXIKKyAqICAgQGZyYW1lIyAgOiBGcmFtZSBudW1iZXIgZnJvbSB0aGUgZnJhbWV3b3JrCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhM1N0cmVhbU1lbTo6bWFya0ZyYW1lTnVtYmVyKHVpbnQzMl90IGluZGV4LCB1aW50MzJfdCBmcmFtZU51bWJlcikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKGluZGV4IDwgbU1heEhlYXBCdWZmZXJzKQorICAgICAgICByZXR1cm4gbUhlYXBNZW0ubWFya0ZyYW1lTnVtYmVyKGluZGV4LCBmcmFtZU51bWJlcik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gbUdyYWxsb2NNZW0ubWFya0ZyYW1lTnVtYmVyKGluZGV4LCBmcmFtZU51bWJlcik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0RnJhbWVOdW1iZXIKKyAqCisgKiBERVNDUklQVElPTjogV2UgdXNlIHRoaXMgdG8gZmV0Y2ggdGhlIGZyYW1lTnVtYmVyIGZvciB0aGUgcmVxdWVzdCB3aXRoIHdoaWNoCisgKiAgICAgICAgICAgICAgdGhpcyBidWZmZXIgd2FzIGdpdmVuIHRvIEhBTAorICoKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4ICAgOiBpbmRleCBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgZnJhbWVOdW1iZXIKKyAqICAgICAgICAgICAgICBwb3NpdGl2ZS96ZXJvICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbmVnYXRpdmUgZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzU3RyZWFtTWVtOjpnZXRGcmFtZU51bWJlcih1aW50MzJfdCBpbmRleCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKGluZGV4IDwgbU1heEhlYXBCdWZmZXJzKQorICAgICAgICByZXR1cm4gbUhlYXBNZW0uZ2V0RnJhbWVOdW1iZXIoaW5kZXgpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIG1HcmFsbG9jTWVtLmdldEZyYW1lTnVtYmVyKGluZGV4KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRHcmFsbG9jQnVmZmVySW5kZXgKKyAqCisgKiBERVNDUklQVElPTjogV2UgdXNlIHRoaXMgdG8gZmV0Y2ggdGhlIGdyYWxsb2MgYnVmZmVyIGluZGV4IGJhc2VkIG9uIGZyYW1lTnVtYmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmcmFtZU51bWJlciA6IGZyYW1lIE51bWJlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IGJ1ZmZlciBpbmRleAorICogICAgICAgICAgICAgIHBvc2l0aXZlL3plcm8gIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBuZWdhdGl2ZSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYTNTdHJlYW1NZW06OmdldEdyYWxsb2NCdWZmZXJJbmRleCh1aW50MzJfdCBmcmFtZU51bWJlcikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaW50MzJfdCBpbmRleCA9IG1HcmFsbG9jTWVtLmdldEJ1ZmZlckluZGV4KGZyYW1lTnVtYmVyKTsKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0SGVhcEJ1ZmZlckluZGV4CisgKgorICogREVTQ1JJUFRJT046IFdlIHVzZSB0aGlzIHRvIGZldGNoIHRoZSBoZWFwIGJ1ZmZlciBpbmRleCBiYXNlZCBvbiBmcmFtZU51bWJlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZnJhbWVOdW1iZXIgOiBmcmFtZSBOdW1iZXIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCBidWZmZXIgaW5kZXgKKyAqICAgICAgICAgICAgICBwb3NpdGl2ZS96ZXJvICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbmVnYXRpdmUgZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmEzU3RyZWFtTWVtOjpnZXRIZWFwQnVmZmVySW5kZXgodWludDMyX3QgZnJhbWVOdW1iZXIpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGludDMyX3QgaW5kZXggPSBtSGVhcE1lbS5nZXRCdWZmZXJJbmRleChmcmFtZU51bWJlcik7CisgICAgcmV0dXJuIGluZGV4OworfQorCit9OyAvL25hbWVzcGFjZSBxY2FtZXJhCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1N0cmVhbU1lbS5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNTdHJlYW1NZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGJhYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNTdHJlYW1NZW0uaApAQCAtMCwwICsxLDk3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19RQ0FNRVJBM19TVFJFQU1NRU1fSF9fCisjZGVmaW5lIF9fUUNBTUVSQTNfU1RSRUFNTUVNX0hfXworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIlFDYW1lcmEzTWVtLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKK30KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworY2xhc3MgUUNhbWVyYTNTdHJlYW1NZW0geworcHVibGljOgorICAgIFFDYW1lcmEzU3RyZWFtTWVtKHVpbnQzMl90IG1heEhlYXBCdWZmZXIsIGJvb2wgcXVldWVBbGwgPSB0cnVlKTsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhM1N0cmVhbU1lbSgpOworCisgICAgdWludDMyX3QgZ2V0Q250KCk7CisgICAgaW50IGdldFJlZ0ZsYWdzKHVpbnQ4X3QgKnJlZ0ZsYWdzKTsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBhY2Nlc3MgaW5kaXZpZHVhbCBRQ2FtZXJhM0J1ZmZlciBvYmplY3QKKyAgICBpbnQgZ2V0RmQodWludDMyX3QgaW5kZXgpOworICAgIHNzaXplX3QgZ2V0U2l6ZSh1aW50MzJfdCBpbmRleCk7CisgICAgaW50IGludmFsaWRhdGVDYWNoZSh1aW50MzJfdCBpbmRleCk7CisgICAgaW50IGNsZWFuSW52YWxpZGF0ZUNhY2hlKHVpbnQzMl90IGluZGV4KTsKKyAgICBpbnQzMl90IGdldEJ1ZkRlZihjb25zdCBjYW1fZnJhbWVfbGVuX29mZnNldF90ICZvZmZzZXQsCisgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICZidWZEZWYsIHVpbnQzMl90IGluZGV4KTsKKyAgICB2b2lkICpnZXRQdHIodWludDMyX3QgaW5kZXgpOworCisgICAgYm9vbCB2YWxpZCh1aW50MzJfdCBpbmRleCk7CisKKyAgICAvLyBHcmFsbG9jIGJ1ZmZlciByZWxhdGVkIGZ1bmN0aW9ucworICAgIGludCByZWdpc3RlckJ1ZmZlcihidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciwgY2FtX3N0cmVhbV90eXBlX3QgdHlwZSk7CisgICAgaW50IHVucmVnaXN0ZXJCdWZmZXIodWludDMyX3QgaW5kZXgpOworICAgIGludCBnZXRNYXRjaEJ1ZkluZGV4KHZvaWQgKm9iamVjdCk7CisgICAgdm9pZCAqZ2V0QnVmZmVySGFuZGxlKHVpbnQzMl90IGluZGV4KTsKKyAgICB2b2lkIHVucmVnaXN0ZXJCdWZmZXJzKCk7IC8vVE9ETzogcmVsYWNlIHdpdGggdW5pZmlmZWQgY2xlYXIoKSBmdW5jdGlvbj8KKworICAgIC8vIEhlYXAgYnVmZmVyIHJlbGF0ZWQgZnVuY3Rpb25zCisgICAgaW50IGFsbG9jYXRlQWxsKHNpemVfdCBzaXplKTsKKyAgICBpbnQgYWxsb2NhdGVPbmUoc2l6ZV90IHNpemUpOworICAgIHZvaWQgZGVhbGxvY2F0ZSgpOyAvL1RPRE86IHJlcGxhY2Ugd2l0aCB1bmlmaWVkIGNsZWFyKCkgZnVuY3Rpb24/CisKKyAgICAvLyBDbGVhciBmdW5jdGlvbjogdW5yZWdpc3RlciBmb3IgZ3JhbGxvYyBidWZmZXIsIGFuZCBkZWFsbG9jYXRlIGZvciBoZWFwIGJ1ZmZlcgorICAgIHZvaWQgY2xlYXIoKSB7dW5yZWdpc3RlckJ1ZmZlcnMoKTsgZGVhbGxvY2F0ZSgpOyB9CisKKyAgICAvLyBGcmFtZSBudW1iZXIgZ2V0dGVyIGFuZCBzZXR0ZXIKKyAgICBpbnQzMl90IG1hcmtGcmFtZU51bWJlcih1aW50MzJfdCBpbmRleCwgdWludDMyX3QgZnJhbWVOdW1iZXIpOworICAgIGludDMyX3QgZ2V0RnJhbWVOdW1iZXIodWludDMyX3QgaW5kZXgpOworICAgIGludDMyX3QgZ2V0R3JhbGxvY0J1ZmZlckluZGV4KHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKKyAgICBpbnQzMl90IGdldEhlYXBCdWZmZXJJbmRleCh1aW50MzJfdCBmcmFtZU51bWJlcik7CisKK3ByaXZhdGU6CisgICAgLy92YXJpYWJsZXMKKyAgICBRQ2FtZXJhM0hlYXBNZW1vcnkgbUhlYXBNZW07CisgICAgUUNhbWVyYTNHcmFsbG9jTWVtb3J5IG1HcmFsbG9jTWVtOworICAgIHVpbnQzMl90IG1NYXhIZWFwQnVmZmVyczsKKyAgICBNdXRleCBtTG9jazsKKyAgICBib29sIG1RdWV1ZUhlYXBCdWZmZXJzOworfTsKKworfTsKKyNlbmRpZiAvLyBfX1FDQU1FUkEzX1NUUkVBTU1FTV9IX18KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzVmVuZG9yVGFncy5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1ZlbmRvclRhZ3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjkzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9RQ2FtZXJhM1ZlbmRvclRhZ3MuY3BwCkBAIC0wLDAgKzEsNDYzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYTNWZW5kb3JUYWdzIgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiUUNhbWVyYTNIV0kuaCIKKyNpbmNsdWRlICJRQ2FtZXJhM1ZlbmRvclRhZ3MuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorfQorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCitlbnVtIHFjYW1lcmEzX2V4dF90YWdzIHFjYW1lcmEzX2V4dDNfc2VjdGlvbl9ib3VuZHNbUUNBTUVSQTNfU0VDVElPTlNfRU5EIC0KKyAgICBWRU5ET1JfU0VDVElPTl0gPSB7CisgICAgICAgIFFDQU1FUkEzX1BSSVZBVEVEQVRBX0VORCwKKyAgICAgICAgUUNBTUVSQTNfQ0RTX0VORCwKKyAgICAgICAgUUNBTUVSQTNfT1BBUVVFX1JBV19FTkQsCisgICAgICAgIFFDQU1FUkEzX0NST1BfRU5ELAorICAgICAgICBRQ0FNRVJBM19UVU5JTkdfTUVUQV9EQVRBX0VORCwKKyAgICAgICAgUUNBTUVSQTNfVEVNUE9SQUxfREVOT0lTRV9FTkQsCisgICAgICAgIFFDQU1FUkEzX0FWX1RJTUVSX0VORCwKKyAgICAgICAgUUNBTUVSQTNfU0VOU09SX01FVEFfREFUQV9FTkQsCisgICAgICAgIFFDQU1FUkEzX0RVQUxDQU1fTElOS19NRVRBX0RBVEFfRU5ELAorICAgICAgICBRQ0FNRVJBM19EVUFMQ0FNX0NBTElCX01FVEFfREFUQV9FTkQsCisgICAgICAgIFFDQU1FUkEzX0hBTF9QUklWQVRFREFUQV9FTkQsCisgICAgICAgIFFDQU1FUkEzX0pQRUdfRU5DT0RFX0NST1BfRU5ELAorICAgICAgICBRQ0FNRVJBM19WSURFT19IRFJfRU5ELAorICAgICAgICBRQ0FNRVJBM19JUl9FTkQsCisgICAgICAgIFFDQU1FUkEzX0FFQ19DT05WRVJHRU5DRV9TUEVFRF9FTkQsCisgICAgICAgIFFDQU1FUkEzX0FXQl9DT05WRVJHRU5DRV9TUEVFRF9FTkQKK30gOworCit0eXBlZGVmIHN0cnVjdCB2ZW5kb3JfdGFnX2luZm8geworICAgIGNvbnN0IGNoYXIgKnRhZ19uYW1lOworICAgIHVpbnQ4X3QgICAgIHRhZ190eXBlOworfSB2ZW5kb3JfdGFnX2luZm9fdDsKKworY29uc3QgY2hhciAqcWNhbWVyYTNfZXh0X3NlY3Rpb25fbmFtZXNbUUNBTUVSQTNfU0VDVElPTlNfRU5EIC0KKyAgICAgICAgVkVORE9SX1NFQ1RJT05dID0geworICAgICJvcmcuY29kZWF1cm9yYS5xY2FtZXJhMy5wcml2YXRlZGF0YSIsCisgICAgIm9yZy5jb2RlYXVyb3JhLnFjYW1lcmEzLkNEUyIsCisgICAgIm9yZy5jb2RlYXVyb3JhLnFjYW1lcmEzLm9wYXF1ZV9yYXciLAorICAgICJvcmcuY29kZWF1cm9yYS5xY2FtZXJhMy5jcm9wIiwKKyAgICAib3JnLmNvZGVhdXJvcmEucWNhbWVyYTMudHVuaW5nX21ldGFfZGF0YSIsCisgICAgIm9yZy5jb2RlYXVyb3JhLnFjYW1lcmEzLnRlbXBvcmFsX2Rlbm9pc2UiLAorICAgICJvcmcuY29kZWF1cm9yYS5xY2FtZXJhMy5hdl90aW1lciIsCisgICAgIm9yZy5jb2RlYXVyb3JhLnFjYW1lcmEzLnNlbnNvcl9tZXRhX2RhdGEiLAorICAgICJvcmcuY29kZWF1cm9yYS5xY2FtZXJhMy5kdWFsY2FtX2xpbmtfbWV0YV9kYXRhIiwKKyAgICAib3JnLmNvZGVhdXJvcmEucWNhbWVyYTMuZHVhbGNhbV9jYWxpYl9tZXRhX2RhdGEiLAorICAgICJvcmcuY29kZWF1cm9yYS5xY2FtZXJhMy5oYWxfcHJpdmF0ZV9kYXRhIiwKKyAgICAib3JnLmNvZGVhdXJvcmEucWNhbWVyYTMuanBlZ19lbmNvZGVfY3JvcCIsCisgICAgIm9yZy5jb2RlYXVyb3JhLnFjYW1lcmEzLnZpZGVvX2hkcl9tb2RlIiwKKyAgICAib3JnLmNvZGVhdXJvcmEucWNhbWVyYTMuaXIiLAorICAgICJvcmcuY29kZWF1cm9yYS5xY2FtZXJhMy5hZWNfY29udmVyZ2VuY2Vfc3BlZWQiLAorICAgICJvcmcuY29kZWF1cm9yYS5xY2FtZXJhMy5hd2JfY29udmVyZ2VuY2Vfc3BlZWQiCit9OworCit2ZW5kb3JfdGFnX2luZm9fdCBxY2FtZXJhM19wcml2YXRlZGF0YVtRQ0FNRVJBM19QUklWQVRFREFUQV9FTkQgLSBRQ0FNRVJBM19QUklWQVRFREFUQV9TVEFSVF0gPSB7CisgICAgeyAicHJpdmF0ZWRhdGFfcmVwcm9jZXNzIiwgVFlQRV9JTlQzMiB9Cit9OworCit2ZW5kb3JfdGFnX2luZm9fdCBxY2FtZXJhM19jZHNbUUNBTUVSQTNfQ0RTX0VORCAtIFFDQU1FUkEzX0NEU19TVEFSVF0gPSB7CisgICAgeyAiY2RzX21vZGUiLCBUWVBFX0lOVDMyIH0sCisgICAgeyAiY2RzX2luZm8iLCBUWVBFX0JZVEUgfQorfTsKKwordmVuZG9yX3RhZ19pbmZvX3QgcWNhbWVyYTNfb3BhcXVlX3Jhd1tRQ0FNRVJBM19PUEFRVUVfUkFXX0VORCAtCisgICAgICAgIFFDQU1FUkEzX09QQVFVRV9SQVdfU1RBUlRdID0geworICAgIHsgIm9wYXF1ZV9yYXdfc3RyaWRlcyIsIFRZUEVfSU5UMzIgfSwKKyAgICB7ICJvcGFxdWVfcmF3X2Zvcm1hdCIsIFRZUEVfQllURSB9Cit9OworCit2ZW5kb3JfdGFnX2luZm9fdCBxY2FtZXJhM19jcm9wW1FDQU1FUkEzX0NST1BfRU5ELSBRQ0FNRVJBM19DUk9QX1NUQVJUXSA9IHsKKyAgICB7ICJjb3VudCIsIFRZUEVfSU5UMzIgfSwKKyAgICB7ICJkYXRhIiwgVFlQRV9JTlQzMn0sCisgICAgeyAicm9pbWFwIiwgVFlQRV9JTlQzMiB9Cit9OworCit2ZW5kb3JfdGFnX2luZm9fdCBxY2FtZXJhM190dW5pbmdfbWV0YV9kYXRhW1FDQU1FUkEzX1RVTklOR19NRVRBX0RBVEFfRU5EIC0KKyAgICAgICAgUUNBTUVSQTNfVFVOSU5HX01FVEFfREFUQV9TVEFSVF0gPSB7CisgICAgeyAidHVuaW5nX21ldGFfZGF0YV9ibG9iIiwgVFlQRV9JTlQzMiB9Cit9OworCit2ZW5kb3JfdGFnX2luZm9fdCBxY2FtZXJhM190ZW1wb3JhbF9kZW5vaXNlW1FDQU1FUkEzX1RFTVBPUkFMX0RFTk9JU0VfRU5EIC0KKyAgICAgICAgUUNBTUVSQTNfVEVNUE9SQUxfREVOT0lTRV9TVEFSVF0gPSB7CisgICAgeyAiZW5hYmxlIiwgVFlQRV9CWVRFIH0sCisgICAgeyAicHJvY2Vzc190eXBlIiwgVFlQRV9JTlQzMiB9Cit9OworCit2ZW5kb3JfdGFnX2luZm8gcWNhbWVyYTNfYXZfdGltZXJbUUNBTUVSQTNfQVZfVElNRVJfRU5EIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ0FNRVJBM19BVl9USU1FUl9TVEFSVF0gPSB7CisgICB7InVzZV9hdl90aW1lciIsIFRZUEVfQllURSB9Cit9OworCit2ZW5kb3JfdGFnX2luZm8gcWNhbWVyYTNfc2Vuc29yX21ldGFfZGF0YVtRQ0FNRVJBM19TRU5TT1JfTUVUQV9EQVRBX0VORCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNBTUVSQTNfU0VOU09SX01FVEFfREFUQV9TVEFSVF0gPSB7CisgICB7ImR5bmFtaWNfYmxhY2tfbGV2ZWxfcGF0dGVybiIsIFRZUEVfRkxPQVQgfSwKKyAgIHsiaXNfbW9ub19vbmx5IiwgICAgICAgICAgICAgICAgVFlQRV9CWVRFIH0KK307CisKK3ZlbmRvcl90YWdfaW5mb190CisgICAgICAgIHFjYW1lcmEzX2R1YWxjYW1fbGlua19tZXRhX2RhdGFbUUNBTUVSQTNfRFVBTENBTV9MSU5LX01FVEFfREFUQV9FTkQgLQorICAgICAgICBRQ0FNRVJBM19EVUFMQ0FNX0xJTktfTUVUQV9EQVRBX1NUQVJUXSA9IHsKKyAgICB7ICJlbmFibGUiLCAgICAgICAgICAgIFRZUEVfQllURSB9LAorICAgIHsgImlzX21haW4iLCAgICAgICAgICAgVFlQRV9CWVRFIH0sCisgICAgeyAicmVsYXRlZF9jYW1lcmFfaWQiLCBUWVBFX0lOVDMyIH0KK307CisKK3ZlbmRvcl90YWdfaW5mb190CisgICAgICAgIHFjYW1lcmEzX2R1YWxjYW1fY2FsaWJfbWV0YV9kYXRhW1FDQU1FUkEzX0RVQUxDQU1fQ0FMSUJfTUVUQV9EQVRBX0VORCAtCisgICAgICAgIFFDQU1FUkEzX0RVQUxDQU1fQ0FMSUJfTUVUQV9EQVRBX1NUQVJUXSA9IHsKKyAgICB7ICJkdWFsY2FtX2NhbGliX21ldGFfZGF0YV9ibG9iIiwgVFlQRV9CWVRFIH0KK307CisKK3ZlbmRvcl90YWdfaW5mb190CisgICAgICAgIHFjYW1lcmEzX2hhbF9wcml2YXRlZGF0YVtRQ0FNRVJBM19IQUxfUFJJVkFURURBVEFfRU5EIC0KKyAgICAgICAgUUNBTUVSQTNfSEFMX1BSSVZBVEVEQVRBX1NUQVJUXSA9IHsKKyAgICB7ICJyZXByb2Nlc3NfZmxhZ3MiLCAgICAgIFRZUEVfQllURSB9LAorICAgIHsgImRkbV9kYXRhX2Jsb2IiLCAgICAgICAgVFlQRV9CWVRFIH0KK307CisKK3ZlbmRvcl90YWdfaW5mb190CisgICAgICAgIHFjYW1lcmEzX2pwZXBfZW5jb2RlX2Nyb3BbUUNBTUVSQTNfSlBFR19FTkNPREVfQ1JPUF9FTkQgLQorICAgICAgICBRQ0FNRVJBM19KUEVHX0VOQ09ERV9DUk9QX1NUQVJUXSA9IHsKKyAgICB7ICJlbmFibGUiLCBUWVBFX0JZVEUgfSwKKyAgICB7ICJyZWN0IiwgICBUWVBFX0lOVDMyIH0sCisgICAgeyAicm9pIiwgICAgVFlQRV9JTlQzMn0KK307CisKK3ZlbmRvcl90YWdfaW5mb190IHFjYW1lcmEzX3ZpZGVvX2hkcltRQ0FNRVJBM19WSURFT19IRFJfRU5EIC0KKyAgICAgICAgUUNBTUVSQTNfVklERU9fSERSX1NUQVJUXSA9IHsKKyAgICB7ICJ2aGRyX21vZGUiLCBUWVBFX0lOVDMyIH0sCisgICAgeyAidmhkcl9zdXBwb3J0ZWRfbW9kZXMiLCBUWVBFX0lOVDMyIH0KK307CisKK3ZlbmRvcl90YWdfaW5mb190IHFjYW1lcmEzX2lyW1FDQU1FUkEzX0lSX0VORCAtCisgICAgICAgIFFDQU1FUkEzX0lSX1NUQVJUXSA9IHsKKyAgICB7ICJpcl9tb2RlIiwgVFlQRV9JTlQzMiB9LAorICAgIHsgImlyX3N1cHBvcnRlZF9tb2RlcyIsIFRZUEVfSU5UMzJ9Cit9OworCit2ZW5kb3JfdGFnX2luZm9fdCBxY2FtZXJhM19hZWNfc3BlZWRbUUNBTUVSQTNfQUVDX0NPTlZFUkdFTkNFX1NQRUVEX0VORCAtCisgICAgICAgIFFDQU1FUkEzX0FFQ19DT05WRVJHRU5DRV9TUEVFRF9TVEFSVF0gPSB7CisgICAgeyJhZWNfc3BlZWQiLCBUWVBFX0ZMT0FUIH0KK307CisKK3ZlbmRvcl90YWdfaW5mb190IHFjYW1lcmEzX2F3Yl9zcGVlZFtRQ0FNRVJBM19BV0JfQ09OVkVSR0VOQ0VfU1BFRURfRU5EIC0KKyAgICAgICAgUUNBTUVSQTNfQVdCX0NPTlZFUkdFTkNFX1NQRUVEX1NUQVJUXSA9IHsKKyAgICB7ImF3Yl9zcGVlZCIsIFRZUEVfRkxPQVQgfQorfTsKKwordmVuZG9yX3RhZ19pbmZvX3QgKnFjYW1lcmEzX3RhZ19pbmZvW1FDQU1FUkEzX1NFQ1RJT05TX0VORCAtCisgICAgICAgIFZFTkRPUl9TRUNUSU9OXSA9IHsKKyAgICBxY2FtZXJhM19wcml2YXRlZGF0YSwKKyAgICBxY2FtZXJhM19jZHMsCisgICAgcWNhbWVyYTNfb3BhcXVlX3JhdywKKyAgICBxY2FtZXJhM19jcm9wLAorICAgIHFjYW1lcmEzX3R1bmluZ19tZXRhX2RhdGEsCisgICAgcWNhbWVyYTNfdGVtcG9yYWxfZGVub2lzZSwKKyAgICBxY2FtZXJhM19hdl90aW1lciwKKyAgICBxY2FtZXJhM19zZW5zb3JfbWV0YV9kYXRhLAorICAgIHFjYW1lcmEzX2R1YWxjYW1fbGlua19tZXRhX2RhdGEsCisgICAgcWNhbWVyYTNfZHVhbGNhbV9jYWxpYl9tZXRhX2RhdGEsCisgICAgcWNhbWVyYTNfaGFsX3ByaXZhdGVkYXRhLAorICAgIHFjYW1lcmEzX2pwZXBfZW5jb2RlX2Nyb3AsCisgICAgcWNhbWVyYTNfdmlkZW9faGRyLAorICAgIHFjYW1lcmEzX2lyLAorICAgIHFjYW1lcmEzX2FlY19zcGVlZCwKKyAgICBxY2FtZXJhM19hd2Jfc3BlZWQKK307CisKK3VpbnQzMl90IHFjYW1lcmEzX2FsbF90YWdzW10gPSB7CisgICAgLy8gUUNBTUVSQTNfUFJJVkFURURBVEEKKyAgICAodWludDMyX3QpUUNBTUVSQTNfUFJJVkFURURBVEFfUkVQUk9DRVNTLAorCisgICAgLy8gUUNBTUVSQTNfQ0RTCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX0NEU19NT0RFLAorICAgICh1aW50MzJfdClRQ0FNRVJBM19DRFNfSU5GTywKKworICAgIC8vIFFDQU1FUkEzX09QQVFVRV9SQVcKKyAgICAodWludDMyX3QpUUNBTUVSQTNfT1BBUVVFX1JBV19TVFJJREVTLAorICAgICh1aW50MzJfdClRQ0FNRVJBM19PUEFRVUVfUkFXX0ZPUk1BVCwKKworICAgIC8vIFFDQU1FUkEzX0NST1AKKyAgICAodWludDMyX3QpUUNBTUVSQTNfQ1JPUF9DT1VOVF9SRVBST0NFU1MsCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX0NST1BfUkVQUk9DRVNTLAorICAgICh1aW50MzJfdClRQ0FNRVJBM19DUk9QX1JPSV9NQVBfUkVQUk9DRVNTLAorCisgICAgLy8gUUNBTUVSQTNfVFVOSU5HX01FVEFfREFUQQorICAgICh1aW50MzJfdClRQ0FNRVJBM19UVU5JTkdfTUVUQV9EQVRBX0JMT0IsCisKKyAgICAvLyBRQ0FNRVJBM19URU1QT1JBTF9ERU5PSVNFCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX1RFTVBPUkFMX0RFTk9JU0VfRU5BQkxFLAorICAgICh1aW50MzJfdClRQ0FNRVJBM19URU1QT1JBTF9ERU5PSVNFX1BST0NFU1NfVFlQRSwKKyAgICAvL1FDQU1FUkEzX0FWVElNRVIKKyAgICAodWludDMyX3QpUUNBTUVSQTNfVVNFX0FWX1RJTUVSLAorCisgICAgLy9RQ0FNRVJBM19TRU5TT1JfTUVUQV9EQVRBCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMX1BBVFRFUk4sCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX1NFTlNPUl9JU19NT05PX09OTFksCisKKyAgICAvLyBRQ0FNRVJBM19EVUFMQ0FNX0xJTktfTUVUQV9EQVRBCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX0RVQUxDQU1fTElOS19FTkFCTEUsCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX0RVQUxDQU1fTElOS19JU19NQUlOLAorICAgICh1aW50MzJfdClRQ0FNRVJBM19EVUFMQ0FNX0xJTktfUkVMQVRFRF9DQU1FUkFfSUQsCisKKyAgICAvLyBRQ0FNRVJBM19EVUFMQ0FNX0NBTElCX01FVEFfREFUQQorICAgICh1aW50MzJfdClRQ0FNRVJBM19EVUFMQ0FNX0NBTElCX01FVEFfREFUQV9CTE9CLAorCisgICAgLy8gUUNBTUVSQTNfSEFMX1BSSVZBVEVEQVRBCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX0hBTF9QUklWQVRFREFUQV9SRVBST0NFU1NfRkxBR1MsCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX0hBTF9QUklWQVRFREFUQV9ERE1fREFUQV9CTE9CLAorCisgICAgLy8gUUNBTUVSQTNfSlBFR19FTkNPREVfQ1JPUAorICAgICh1aW50MzJfdClRQ0FNRVJBM19KUEVHX0VOQ09ERV9DUk9QX0VOQUJMRSwKKyAgICAodWludDMyX3QpUUNBTUVSQTNfSlBFR19FTkNPREVfQ1JPUF9SRUNULAorICAgICh1aW50MzJfdClRQ0FNRVJBM19KUEVHX0VOQ09ERV9DUk9QX1JPSSwKKworICAgIC8vIFFDQU1FUkEzX1ZJREVPX0hEUgorICAgICh1aW50MzJfdClRQ0FNRVJBM19WSURFT19IRFJfTU9ERSwKKyAgICAodWludDMyX3QpUUNBTUVSQTNfQVZBSUxBQkxFX1ZJREVPX0hEUl9NT0RFUywKKworICAgIC8vIFFDQU1FUkEzX0lSX01PREVfRU5BQkxFCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX0lSX01PREUsCisgICAgKHVpbnQzMl90KVFDQU1FUkEzX0lSX0FWQUlMQUJMRV9NT0RFUywKKworICAgIC8vUUNBTUVSQTNfQUVDX0NPTlZFUkdFTkNFX1NQRUVECisgICAgKHVpbnQzMl90KVFDQU1FUkEzX0FFQ19DT05WRVJHRU5DRV9TUEVFRCwKKworICAgIC8vUUNBTUVSQTNfQVdCX0NPTlZFUkdFTkNFX1NQRUVECisgICAgKHVpbnQzMl90KVFDQU1FUkEzX0FXQl9DT05WRVJHRU5DRV9TUEVFRAorfTsKKworY29uc3QgdmVuZG9yX3RhZ19vcHNfdCogUUNhbWVyYTNWZW5kb3JUYWdzOjpPcHMgPSBOVUxMOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldF92ZW5kb3JfdGFnX29wcworICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgdGhlIG1ldGFkYXRhIHZlbmRvciB0YWcgZnVuY3Rpb24gcG9pbnRlcnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgIEBvcHMgICA6IGZ1bmN0aW9uIHBvaW50ZXIgdGFibGUgdG8gYmUgZmlsbGVkIGJ5IEhBTAorICoKKyAqCisgKiBSRVRVUk4gICAgIDogTk9ORQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzVmVuZG9yVGFnczo6Z2V0X3ZlbmRvcl90YWdfb3BzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3JfdGFnX29wc190KiBvcHMpCit7CisgICAgTE9HTCgiRSIpOworCisgICAgT3BzID0gb3BzOworCisgICAgb3BzLT5nZXRfdGFnX2NvdW50ID0gZ2V0X3RhZ19jb3VudDsKKyAgICBvcHMtPmdldF9hbGxfdGFncyA9IGdldF9hbGxfdGFnczsKKyAgICBvcHMtPmdldF9zZWN0aW9uX25hbWUgPSBnZXRfc2VjdGlvbl9uYW1lOworICAgIG9wcy0+Z2V0X3RhZ19uYW1lID0gZ2V0X3RhZ19uYW1lOworICAgIG9wcy0+Z2V0X3RhZ190eXBlID0gZ2V0X3RhZ190eXBlOworICAgIG9wcy0+cmVzZXJ2ZWRbMF0gPSBOVUxMOworCisgICAgTE9HTCgiWCIpOworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRfdGFnX2NvdW50CisgKgorICogREVTQ1JJUFRJT046IEdldCBudW1iZXIgb2YgdmVuZG9yIHRhZ3Mgc3VwcG9ydGVkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgICBAb3BzICAgOiAgVmVuZG9yIHRhZyBvcHMgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKgorICogUkVUVVJOICAgICA6IE51bWJlciBvZiB2ZW5kb3IgdGFncyBzdXBwb3J0ZWQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitpbnQgUUNhbWVyYTNWZW5kb3JUYWdzOjpnZXRfdGFnX2NvdW50KAorICAgICAgICAgICAgICAgIGNvbnN0IHZlbmRvcl90YWdfb3BzX3QgKiBvcHMpCit7CisgICAgc2l6ZV90IGNvdW50ID0gMDsKKyAgICBpZiAob3BzID09IE9wcykKKyAgICAgICAgY291bnQgPSBzaXplb2YocWNhbWVyYTNfYWxsX3RhZ3MpL3NpemVvZihxY2FtZXJhM19hbGxfdGFnc1swXSk7CisKKyAgICBMT0dMKCJjb3VudCBpcyAlZCIsIGNvdW50KTsKKyAgICByZXR1cm4gKGludCljb3VudDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRfYWxsX3RhZ3MKKyAqCisgKiBERVNDUklQVElPTjogRmlsbCBhcnJheSB3aXRoIGFsbCBzdXBwb3J0ZWQgdmVuZG9yIHRhZ3MKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgIEBvcHMgICAgICA6ICBWZW5kb3IgdGFnIG9wcyBkYXRhIHN0cnVjdHVyZQorICogICAgQHRhZ19hcnJheTogIGFycmF5IG9mIG1ldGFkYXRhIHRhZ3MKKyAqCisgKiBSRVRVUk4gICAgIDogU3VjY2VzczogdGhlIHNlY3Rpb24gbmFtZSBvZiB0aGUgc3BlY2lmaWMgdGFnCisgKiAgICAgICAgICAgICAgRmFpbHVyZTogTlVMTAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmEzVmVuZG9yVGFnczo6Z2V0X2FsbF90YWdzKAorICAgICAgICAgICAgICAgIGNvbnN0IHZlbmRvcl90YWdfb3BzX3QgKiBvcHMsCisgICAgICAgICAgICAgICAgdWludDMyX3QgKmdfYXJyYXkpCit7CisgICAgaWYgKG9wcyAhPSBPcHMpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgaSA8IHNpemVvZihxY2FtZXJhM19hbGxfdGFncykvc2l6ZW9mKHFjYW1lcmEzX2FsbF90YWdzWzBdKTsKKyAgICAgICAgICAgIGkrKykgeworICAgICAgICBnX2FycmF5W2ldID0gcWNhbWVyYTNfYWxsX3RhZ3NbaV07CisgICAgICAgIExPR0QoImdfYXJyYXlbJWRdIGlzICVkIiwgaSwgZ19hcnJheVtpXSk7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldF9zZWN0aW9uX25hbWUKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHNlY3Rpb24gbmFtZSBmb3IgdmVuZG9yIHRhZworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICAgQG9wcyAgIDogIFZlbmRvciB0YWcgb3BzIHN0cnVjdHVyZQorICogICAgQHRhZyAgIDogIFZlbmRvciBzcGVjaWZpYyB0YWcKKyAqCisgKgorICogUkVUVVJOICAgICA6IFN1Y2Nlc3M6IHRoZSBzZWN0aW9uIG5hbWUgb2YgdGhlIHNwZWNpZmljIHRhZworICogICAgICAgICAgICAgIEZhaWx1cmU6IE5VTEwKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitjb25zdCBjaGFyKiBRQ2FtZXJhM1ZlbmRvclRhZ3M6OmdldF9zZWN0aW9uX25hbWUoCisgICAgICAgICAgICAgICAgY29uc3QgdmVuZG9yX3RhZ19vcHNfdCAqIG9wcywKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0YWcpCit7CisgICAgTE9HTCgiRSIpOworICAgIGlmIChvcHMgIT0gT3BzKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGNvbnN0IGNoYXIgKnJldDsKKyAgICB1aW50MzJfdCBzZWN0aW9uID0gdGFnID4+IDE2OworCisgICAgaWYgKHNlY3Rpb24gPCBWRU5ET1JfU0VDVElPTiB8fCBzZWN0aW9uID49IFFDQU1FUkEzX1NFQ1RJT05TX0VORCkKKyAgICAgICAgcmV0ID0gTlVMTDsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IHFjYW1lcmEzX2V4dF9zZWN0aW9uX25hbWVzW3NlY3Rpb24gLSBWRU5ET1JfU0VDVElPTl07CisKKyAgICBpZiAocmV0KQorICAgICAgICBMT0dMKCJzZWN0aW9uX25hbWVbJWRdIGlzICVzIiwgdGFnLCByZXQpOworICAgIExPR0woIlgiKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldF90YWdfbmFtZQorICoKKyAqIERFU0NSSVBUSU9OOiBHZXQgbmFtZSBvZiBhIHZlbmRvciBzcGVjaWZpYyB0YWcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgIEB0YWcgICA6ICBWZW5kb3Igc3BlY2lmaWMgdGFnCisgKgorICoKKyAqIFJFVFVSTiAgICAgOiBTdWNjZXNzOiB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWMgdGFnCisgKiAgICAgICAgICAgICAgRmFpbHVyZTogTlVMTAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjb25zdCBjaGFyKiBRQ2FtZXJhM1ZlbmRvclRhZ3M6OmdldF90YWdfbmFtZSgKKyAgICAgICAgICAgICAgICBjb25zdCB2ZW5kb3JfdGFnX29wc190ICogb3BzLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhZykKK3sKKyAgICBMT0dMKCJFIik7CisgICAgY29uc3QgY2hhciAqcmV0OworICAgIHVpbnQzMl90IHNlY3Rpb24gPSB0YWcgPj4gMTY7CisgICAgdWludDMyX3Qgc2VjdGlvbl9pbmRleCA9IHNlY3Rpb24gLSBWRU5ET1JfU0VDVElPTjsKKyAgICB1aW50MzJfdCB0YWdfaW5kZXggPSB0YWcgJiAweEZGRkY7CisKKyAgICBpZiAob3BzICE9IE9wcykgeworICAgICAgICByZXQgPSBOVUxMOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgaWYgKHNlY3Rpb24gPCBWRU5ET1JfU0VDVElPTiB8fCBzZWN0aW9uID49IFFDQU1FUkEzX1NFQ1RJT05TX0VORCkKKyAgICAgICAgcmV0ID0gTlVMTDsKKyAgICBlbHNlIGlmICh0YWcgPj0gKHVpbnQzMl90KXFjYW1lcmEzX2V4dDNfc2VjdGlvbl9ib3VuZHNbc2VjdGlvbl9pbmRleF0pCisgICAgICAgIHJldCA9IE5VTEw7CisgICAgZWxzZQorICAgICAgICByZXQgPSBxY2FtZXJhM190YWdfaW5mb1tzZWN0aW9uX2luZGV4XVt0YWdfaW5kZXhdLnRhZ19uYW1lOworCisgICAgaWYgKHJldCkKKyAgICAgICAgTE9HTCgidGFnIG5hbWUgZm9yIHRhZyAlZCBpcyAlcyIsIHRhZywgcmV0KTsKKyAgICBMT0dMKCJYIik7CisKK2RvbmU6CisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRfdGFnX3R5cGUKKyAqCisgKiBERVNDUklQVElPTjogR2V0IHR5cGUgb2YgYSB2ZW5kb3Igc3BlY2lmaWMgdGFnCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgICBAdGFnICAgOiAgVmVuZG9yIHNwZWNpZmljIHRhZworICoKKyAqCisgKiBSRVRVUk4gICAgIDogU3VjY2VzczogdGhlIHR5cGUgb2YgdGhlIHNwZWNpZmljIHRhZworICogICAgICAgICAgICAgIEZhaWx1cmU6IC0xCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhM1ZlbmRvclRhZ3M6OmdldF90YWdfdHlwZSgKKyAgICAgICAgICAgICAgICBjb25zdCB2ZW5kb3JfdGFnX29wc190ICpvcHMsCisgICAgICAgICAgICAgICAgdWludDMyX3QgdGFnKQoreworICAgIExPR0woIkUiKTsKKyAgICBpbnQgcmV0OworICAgIHVpbnQzMl90IHNlY3Rpb24gPSB0YWcgPj4gMTY7CisgICAgdWludDMyX3Qgc2VjdGlvbl9pbmRleCA9IHNlY3Rpb24gLSBWRU5ET1JfU0VDVElPTjsKKyAgICB1aW50MzJfdCB0YWdfaW5kZXggPSB0YWcgJiAweEZGRkY7CisKKyAgICBpZiAob3BzICE9IE9wcykgeworICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKyAgICBpZiAoc2VjdGlvbiA8IFZFTkRPUl9TRUNUSU9OIHx8IHNlY3Rpb24gPj0gUUNBTUVSQTNfU0VDVElPTlNfRU5EKQorICAgICAgICByZXQgPSAtMTsKKyAgICBlbHNlIGlmICh0YWcgPj0gKHVpbnQzMl90IClxY2FtZXJhM19leHQzX3NlY3Rpb25fYm91bmRzW3NlY3Rpb25faW5kZXhdKQorICAgICAgICByZXQgPSAtMTsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IHFjYW1lcmEzX3RhZ19pbmZvW3NlY3Rpb25faW5kZXhdW3RhZ19pbmRleF0udGFnX3R5cGU7CisKKyAgICBMT0dMKCJ0YWcgdHlwZSBmb3IgdGFnICVkIGlzICVkIiwgdGFnLCByZXQpOworICAgIExPR0woIlgiKTsKK2RvbmU6CisgICAgcmV0dXJuIHJldDsKK30KKworfTsgLy9lbmQgbmFtZXNwYWNlIHFjYW1lcmEKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzVmVuZG9yVGFncy5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvUUNhbWVyYTNWZW5kb3JUYWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0YTdiZQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL1FDYW1lcmEzVmVuZG9yVGFncy5oCkBAIC0wLDAgKzEsMjUzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNpZm5kZWYgX19RQ0FNRVJBM1ZFTkRPUlRBR1NfSF9fCisjZGVmaW5lIF9fUUNBTUVSQTNWRU5ET1JUQUdTX0hfXworCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAic3lzdGVtL2NhbWVyYV9tZXRhZGF0YS5oIgorCituYW1lc3BhY2UgcWNhbWVyYSB7CisKK2VudW0gcWNhbWVyYTNfZXh0X3NlY3Rpb24geworICAgIFFDQU1FUkEzX1BSSVZBVEVEQVRBID0gVkVORE9SX1NFQ1RJT04sCisgICAgUUNBTUVSQTNfQ0RTLAorICAgIFFDQU1FUkEzX09QQVFVRV9SQVcsCisgICAgUUNBTUVSQTNfQ1JPUCwKKyAgICBRQ0FNRVJBM19UVU5JTkdfTUVUQV9EQVRBLAorICAgIFFDQU1FUkEzX1RFTVBPUkFMX0RFTk9JU0UsCisgICAgUUNBTUVSQTNfQVZfVElNRVIsCisgICAgUUNBTUVSQTNfU0VOU09SX01FVEFfREFUQSwKKyAgICBRQ0FNRVJBM19EVUFMQ0FNX0xJTktfTUVUQV9EQVRBLAorICAgIFFDQU1FUkEzX0RVQUxDQU1fQ0FMSUJfTUVUQV9EQVRBLAorICAgIFFDQU1FUkEzX0hBTF9QUklWQVRFREFUQSwKKyAgICBRQ0FNRVJBM19KUEVHX0VOQ09ERV9DUk9QLAorICAgIFFDQU1FUkEzX1ZJREVPX0hEUiwKKyAgICBRQ0FNRVJBM19JUiwKKyAgICBRQ0FNRVJBM19BRUNfQ09OVkVSR0VOQ0UsCisgICAgUUNBTUVSQTNfQVdCX0NPTlZFUkdFTkNFLAorICAgIFFDQU1FUkEzX1NFQ1RJT05TX0VORAorfTsKKworZW51bSBxY2FtZXJhM19leHRfc2VjdGlvbl9yYW5nZXMgeworICAgIFFDQU1FUkEzX1BSSVZBVEVEQVRBX1NUQVJUID0gUUNBTUVSQTNfUFJJVkFURURBVEEgPDwgMTYsCisgICAgUUNBTUVSQTNfQ0RTX1NUQVJUID0gUUNBTUVSQTNfQ0RTIDw8IDE2LAorICAgIFFDQU1FUkEzX09QQVFVRV9SQVdfU1RBUlQgPSBRQ0FNRVJBM19PUEFRVUVfUkFXIDw8IDE2LAorICAgIFFDQU1FUkEzX0NST1BfU1RBUlQgPSBRQ0FNRVJBM19DUk9QIDw8IDE2LAorICAgIFFDQU1FUkEzX1RVTklOR19NRVRBX0RBVEFfU1RBUlQgPSBRQ0FNRVJBM19UVU5JTkdfTUVUQV9EQVRBIDw8IDE2LAorICAgIFFDQU1FUkEzX1RFTVBPUkFMX0RFTk9JU0VfU1RBUlQgPSBRQ0FNRVJBM19URU1QT1JBTF9ERU5PSVNFIDw8IDE2LAorICAgIFFDQU1FUkEzX0FWX1RJTUVSX1NUQVJUID0gUUNBTUVSQTNfQVZfVElNRVIgPDwgMTYsCisgICAgUUNBTUVSQTNfU0VOU09SX01FVEFfREFUQV9TVEFSVCA9IFFDQU1FUkEzX1NFTlNPUl9NRVRBX0RBVEEgPDwgMTYsCisgICAgUUNBTUVSQTNfRFVBTENBTV9MSU5LX01FVEFfREFUQV9TVEFSVCA9IFFDQU1FUkEzX0RVQUxDQU1fTElOS19NRVRBX0RBVEEgPDwgMTYsCisgICAgUUNBTUVSQTNfRFVBTENBTV9DQUxJQl9NRVRBX0RBVEFfU1RBUlQgPSBRQ0FNRVJBM19EVUFMQ0FNX0NBTElCX01FVEFfREFUQSA8PCAxNiwKKyAgICBRQ0FNRVJBM19IQUxfUFJJVkFURURBVEFfU1RBUlQgPSBRQ0FNRVJBM19IQUxfUFJJVkFURURBVEEgPDwgMTYsCisgICAgUUNBTUVSQTNfSlBFR19FTkNPREVfQ1JPUF9TVEFSVCA9IFFDQU1FUkEzX0pQRUdfRU5DT0RFX0NST1AgPDwgMTYsCisgICAgUUNBTUVSQTNfVklERU9fSERSX1NUQVJUID0gUUNBTUVSQTNfVklERU9fSERSIDw8IDE2LAorICAgIFFDQU1FUkEzX0lSX1NUQVJUID0gUUNBTUVSQTNfSVIgPDwgMTYsCisgICAgUUNBTUVSQTNfQUVDX0NPTlZFUkdFTkNFX1NQRUVEX1NUQVJUID0gUUNBTUVSQTNfQUVDX0NPTlZFUkdFTkNFIDw8IDE2LAorICAgIFFDQU1FUkEzX0FXQl9DT05WRVJHRU5DRV9TUEVFRF9TVEFSVCA9IFFDQU1FUkEzX0FXQl9DT05WRVJHRU5DRSA8PCAxNgorfTsKKworZW51bSBxY2FtZXJhM19leHRfdGFncyB7CisgICAgUUNBTUVSQTNfUFJJVkFURURBVEFfUkVQUk9DRVNTID0gUUNBTUVSQTNfUFJJVkFURURBVEFfU1RBUlQsCisgICAgUUNBTUVSQTNfUFJJVkFURURBVEFfRU5ELAorICAgIFFDQU1FUkEzX0NEU19NT0RFID0gUUNBTUVSQTNfQ0RTX1NUQVJULAorICAgIFFDQU1FUkEzX0NEU19JTkZPLAorICAgIFFDQU1FUkEzX0NEU19FTkQsCisKKyAgICAvL1Byb3BlcnR5IE5hbWU6ICBvcmcuY29kZWF1cm9yYS5xY2FtZXJhMy5vcGFxdWVfcmF3Lm9wYXF1ZV9yYXdfc3RyaWRlcworICAgIC8vCisgICAgLy9UeXBlOiBpbnQzMiAqIG4gKiAzIFtwdWJsaWNdCisgICAgLy8KKyAgICAvL0Rlc2NyaXB0aW9uOiBEaXN0YW5jZSBpbiBieXRlcyBmcm9tIHRoZSBiZWdpbm5pbmcgb2Ygb25lIHJvdyBvZiBvcGFxdWUKKyAgICAvL3JhdyBpbWFnZSBkYXRhIHRvIHRoZSBiZWdpbm5pbmcgb2YgbmV4dCByb3cuCisgICAgLy8KKyAgICAvL0RldGFpbHM6IFRoZSBzdHJpZGVzIGFyZSBsaXN0ZWQgYXMgKHJhd193aWR0aCwgcmF3X2hlaWdodCwgc3RyaWRlKQorICAgIC8vdHJpcGxldHMuIEZvciBlYWNoIHN1cHBvcnRlZCByYXcgc2l6ZSwgdGhlcmUgd2lsbCBiZSBhIHN0cmlkZSBhc3NvY2lhdGVkCisgICAgLy93aXRoIGl0LgorICAgIFFDQU1FUkEzX09QQVFVRV9SQVdfU1RSSURFUyA9IFFDQU1FUkEzX09QQVFVRV9SQVdfU1RBUlQsCisKKyAgICAvL1Byb3BlcnR5IE5hbWU6IG9yZy5jb2RlYXVyb3JhLnFjYW1lcmEzLm9wYXF1ZV9yYXcub3BhcXVlX3Jhd19mb3JtYXQKKyAgICAvLworICAgIC8vVHlwZTogYnl0ZShlbnVtKSBbcHVibGljXQorICAgIC8vICAqIExFR0FDWSAtIFRoZSBsZWdhY3kgcmF3IGZvcm1hdCB3aGVyZSA4LCAxMCwgb3IgMTItYml0CisgICAgLy8gICAgcmF3IGRhdGEgaXMgcGFja2VkIGludG8gYSA2NC1iaXQgd29yZC4KKyAgICAvLyAgKiBNSVBJIC0gcmF3IGZvcm1hdCBtYXRjaGluZyB0aGUgZGF0YSBwYWNraW5nIGRlc2NyaWJlZAorICAgIC8vICAgIGluIE1JUEkgQ1NJLTIgc3BlY2lmaWNhdGlvbi4gSW4gbWVtb3J5LCB0aGUgZGF0YQorICAgIC8vICAgIGlzIGNvbnN0cnVjdGVkIGJ5IHBhY2tpbmcgc2VxdWVudGlhbGx5IHJlY2VpdmVkIHBpeGVscworICAgIC8vICAgIGludG8gbGVhc3Qgc2lnbmlmaWNhbnQgcGFydHMgb2YgdGhlIHdvcmRzIGZpcnN0LgorICAgIC8vICAgIFdpdGhpbiBlYWNoIHBpeGVsLCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgYWxzbworICAgIC8vICAgIHBsYWNlZCB0b3dhcmRzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSB3b3JkLgorICAgIC8vCisgICAgLy9EZXRhaWxzOiBMYXkgb3V0IG9mIG9wYXF1ZSByYXcgZGF0YSBpbiBtZW1vcnkgaXMgZGVjaWRlZCBieSB0d28gZmFjdG9yczoKKyAgICAvLyAgICAgICAgIG9wYXF1ZV9yYXdfZm9ybWF0IGFuZCBiaXQgZGVwdGggKGltcGxpZWQgYnkgd2hpdGVMZXZlbCkuIEJlbG93CisgICAgLy8gICAgICAgICBsaXN0IGlsbHVzdHJhdGVzIHRoZWlyIHJlbGF0aW9uc2hpcDoKKyAgICAvLyAgTEVHQUNZODogIFA3KDc6MCkgUDYoNzowKSBQNSg3OjApIFA0KDc6MCkgUDMoNzowKSBQMig3OjApIFAxKDc6MCkgUDAoNzowKQorICAgIC8vICAgICAgICAgICAgOCBwaXhlbHMgb2NjdXB5IDggYnl0ZXMsIG5vIHBhZGRpbmcgbmVlZGVkCisgICAgLy8gICAgICAgICAgICBtaW5fc3RyaWRlID0gQ0VJTElORzgocmF3X3dpZHRoKQorICAgIC8vIExFR0FDWTEwOiAgMDAwMCBQNSg5OjApIFA0KDk6MCkgUDMoOTowKSBQMig5OjApIFAxKDk6MCkgUDAoOTowKQorICAgIC8vICAgICAgICAgICAgNiBwaXhlbHMgb2NjdXB5IDggYnl0ZXMsIDQgYml0cyBwYWRkaW5nIGF0IE1TQgorICAgIC8vICAgICAgICAgICAgbWluX3N0cmlkZSA9IChyYXdfd2lkdGgrNSkvNiAqIDgKKyAgICAvLyBMRUdBQ1kxMjogIDAwMDAgUDQoMTE6MCkgUDMoMTE6MCkgUDIoMTE6MCkgUDEoMTE6MCkgUDAoMTE6MCkKKyAgICAvLyAgICAgICAgICAgIDUgcGl4ZWxzIG9jY3VweSA4IGJ5dGVzLCA0IGJpdHMgcGFkZGluZyBhdCBNU0IKKyAgICAvLyAgICAgICAgICAgIG1pbl9zdHJpZGUgPSAocmF3X3dpZHRoKzQpLzUgKiA4CisgICAgLy8gICAgTUlQSTg6ICBQMCg3OjApCisgICAgLy8gICAgICAgICAgICAxIHBpeGVsIG9jY3VweSAxIGJ5dGUKKyAgICAvLyAgICAgICAgICAgIG1pbl9zdHJpZGUgPSByYXdfd2lkdGgKKyAgICAvLyAgIE1JUEkxMDogIFAzKDE6MCkgUDIoMTowKSBQMSgxOjApIFAwKDE6MCkgUDMoOToyKSBQMig5OjIpIFAxKDk6MikgUDAoOToyKQorICAgIC8vICAgICAgICAgICAgNCBwaXhlbHMgb2NjdXB5IDUgYnl0ZXMKKyAgICAvLyAgICAgICAgICAgIG1pbl9zdHJpZGUgPSAocmF3X3dpZHRoKzMpLzQgKiA1CisgICAgLy8gICBNSVBJMTI6ICBQMSgzOjApIFAwKDM6MCkgUDEoMTE6NCkgUDAoMTE6NCkKKyAgICAvLyAgICAgICAgICAgIDIgcGl4ZWxzIG9jY3VweSAzIGJ5dGVzCisgICAgLy8gICAgICAgICAgICBtaW5fc3RyaWRlID0gKHJhd193aWR0aCsxKS8yICogMworICAgIC8vTm90ZSB0aGF0IG9wYXF1ZV9yYXdfc3RyaWRlIG5lZWRzIHRvIGJlIGF0IGxlYXN0IHRoZSByZXF1aXJlZCBtaW5pbXVtCisgICAgLy9zdHJpZGUgZnJvbSB0aGUgdGFibGUgYWJvdmUuIElTUCBoYXJkd2FyZSBtYXkgbmVlZCBtb3JlIGdlbmVyb3VzIHN0cmlkZQorICAgIC8vc2V0dGluZy4gRm9yIGV4YW1wbGUsIGZvciBMRUdBQ1k4LCB0aGUgYWN0dWFsIHN0cmlkZSBtYXkgYmUKKyAgICAvL0NFSUxJTkcxNihyYXdfd2lkdGgpIGR1ZSB0byBidXMgYnVyc3QgbGVuZ3RoIHJlcXVpcmVtZW50LgorICAgIFFDQU1FUkEzX09QQVFVRV9SQVdfRk9STUFULAorICAgIFFDQU1FUkEzX09QQVFVRV9SQVdfRU5ELAorCisgICAgUUNBTUVSQTNfQ1JPUF9DT1VOVF9SRVBST0NFU1MgPSBRQ0FNRVJBM19DUk9QX1NUQVJULAorICAgIFFDQU1FUkEzX0NST1BfUkVQUk9DRVNTLAorICAgIFFDQU1FUkEzX0NST1BfUk9JX01BUF9SRVBST0NFU1MsCisgICAgUUNBTUVSQTNfQ1JPUF9FTkQsCisKKyAgICBRQ0FNRVJBM19UVU5JTkdfTUVUQV9EQVRBX0JMT0IgPSBRQ0FNRVJBM19UVU5JTkdfTUVUQV9EQVRBX1NUQVJULAorICAgIFFDQU1FUkEzX1RVTklOR19NRVRBX0RBVEFfRU5ELAorCisgICAgUUNBTUVSQTNfVEVNUE9SQUxfREVOT0lTRV9FTkFCTEUgPSBRQ0FNRVJBM19URU1QT1JBTF9ERU5PSVNFX1NUQVJULAorICAgIFFDQU1FUkEzX1RFTVBPUkFMX0RFTk9JU0VfUFJPQ0VTU19UWVBFLAorICAgIFFDQU1FUkEzX1RFTVBPUkFMX0RFTk9JU0VfRU5ELAorCisgICAgUUNBTUVSQTNfVVNFX0FWX1RJTUVSID0gUUNBTUVSQTNfQVZfVElNRVJfU1RBUlQsCisgICAgUUNBTUVSQTNfQVZfVElNRVJfRU5ELAorCisgICAgUUNBTUVSQTNfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUxfUEFUVEVSTiA9IFFDQU1FUkEzX1NFTlNPUl9NRVRBX0RBVEFfU1RBUlQsCisgICAgUUNBTUVSQTNfU0VOU09SX0lTX01PTk9fT05MWSwKKyAgICBRQ0FNRVJBM19TRU5TT1JfTUVUQV9EQVRBX0VORCwKKworICAgIFFDQU1FUkEzX0RVQUxDQU1fTElOS19FTkFCTEUgPSBRQ0FNRVJBM19EVUFMQ0FNX0xJTktfTUVUQV9EQVRBX1NUQVJULAorICAgIFFDQU1FUkEzX0RVQUxDQU1fTElOS19JU19NQUlOLAorICAgIFFDQU1FUkEzX0RVQUxDQU1fTElOS19SRUxBVEVEX0NBTUVSQV9JRCwKKyAgICBRQ0FNRVJBM19EVUFMQ0FNX0xJTktfTUVUQV9EQVRBX0VORCwKKworICAgIFFDQU1FUkEzX0RVQUxDQU1fQ0FMSUJfTUVUQV9EQVRBX0JMT0IgPSBRQ0FNRVJBM19EVUFMQ0FNX0NBTElCX01FVEFfREFUQV9TVEFSVCwKKyAgICBRQ0FNRVJBM19EVUFMQ0FNX0NBTElCX01FVEFfREFUQV9FTkQsCisKKyAgICBRQ0FNRVJBM19IQUxfUFJJVkFURURBVEFfUkVQUk9DRVNTX0ZMQUdTID0gUUNBTUVSQTNfSEFMX1BSSVZBVEVEQVRBX1NUQVJULAorICAgIFFDQU1FUkEzX0hBTF9QUklWQVRFREFUQV9ERE1fREFUQV9CTE9CLAorICAgIFFDQU1FUkEzX0hBTF9QUklWQVRFREFUQV9FTkQsCisKKyAgICAvKiBQcm9wZXJ0eSBOYW1lOiAgb3JnLmNvZGVhdXJvcmEucWNhbWVyYTMuanBlZ19lbmNvZGVfY3JvcC5lbmFibGUKKyAgICAgICBUeXBlOiBieXRlCisgICAgICAgRGVzY3JpcHRpb246IElmIEpQRUcgY3JvcCBpcyBlbmFibGUKKyAgICAqLworICAgIFFDQU1FUkEzX0pQRUdfRU5DT0RFX0NST1BfRU5BQkxFID0gUUNBTUVSQTNfSlBFR19FTkNPREVfQ1JPUF9TVEFSVCwKKyAgICAvKiBQcm9wZXJ0eSBOYW1lOiAgb3JnLmNvZGVhdXJvcmEucWNhbWVyYTMuanBlZ19lbmNvZGVfY3JvcC5yZWN0CisgICAgICAgVHlwZTogaW50MzJbNF0KKyAgICAgICBEZXNjcmlwdGlvbjogQ3JvcCBpbWFnZSBpbnRvIHNpemUgd2lkdGggeCBoZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgZnJvbSBbbGVmdCwgdG9wXSBjb29yZGluYXRlCisgICAgICAgcmVjdFswXSA9IGxlZnQKKyAgICAgICByZWN0WzFdID0gdG9wCisgICAgICAgcmVjdFsyXSA9IHdpZHRoCisgICAgICAgcmVjdFszXSA9IGhlaWdodAorICAgICovCisgICAgUUNBTUVSQTNfSlBFR19FTkNPREVfQ1JPUF9SRUNULAorICAgIC8qIFByb3BlcnR5IE5hbWU6ICBvcmcuY29kZWF1cm9yYS5xY2FtZXJhMy5qcGVnX2VuY29kZV9jcm9wLnJvaQorICAgICAgIFR5cGU6IGludDMyWzRdCisgICAgICAgRGVzY3JpcHRpb246IFNjYWxlIHRoZSBjcm9wIGltYWdlIGludG8gc2l6ZSB3aWR0aCB4IGhlaWdodAorICAgICAgICAgICAgICAgICAgICBmcm9tIFtsZWZ0LCB0b3BdIGNvb3JkaW5hdGUuCisgICAgICAgcm9pWzBdID0gbGVmdAorICAgICAgIHJvaVsxXSA9IHRvcAorICAgICAgIHJvaVsyXSA9IHdpZHRoCisgICAgICAgcm9pWzNdID0gaGVpZ2h0CisgICAgKi8KKyAgICBRQ0FNRVJBM19KUEVHX0VOQ09ERV9DUk9QX1JPSSwKKyAgICBRQ0FNRVJBM19KUEVHX0VOQ09ERV9DUk9QX0VORCwKKworICAgIFFDQU1FUkEzX1ZJREVPX0hEUl9NT0RFID0gUUNBTUVSQTNfVklERU9fSERSX1NUQVJULAorICAgIFFDQU1FUkEzX0FWQUlMQUJMRV9WSURFT19IRFJfTU9ERVMsCisgICAgUUNBTUVSQTNfVklERU9fSERSX0VORCwKKworICAgIFFDQU1FUkEzX0lSX01PREUgPSBRQ0FNRVJBM19JUl9TVEFSVCwKKyAgICBRQ0FNRVJBM19JUl9BVkFJTEFCTEVfTU9ERVMsCisgICAgUUNBTUVSQTNfSVJfRU5ELAorCisgICAgUUNBTUVSQTNfQUVDX0NPTlZFUkdFTkNFX1NQRUVEID0gUUNBTUVSQTNfQUVDX0NPTlZFUkdFTkNFX1NQRUVEX1NUQVJULAorICAgIFFDQU1FUkEzX0FFQ19DT05WRVJHRU5DRV9TUEVFRF9FTkQsCisKKyAgICBRQ0FNRVJBM19BV0JfQ09OVkVSR0VOQ0VfU1BFRUQgPSBRQ0FNRVJBM19BV0JfQ09OVkVSR0VOQ0VfU1BFRURfU1RBUlQsCisgICAgUUNBTUVSQTNfQVdCX0NPTlZFUkdFTkNFX1NQRUVEX0VORAorfTsKKworLy8gUUNBTUVSQTNfT1BBUVVFX1JBV19GT1JNQVQKK3R5cGVkZWYgZW51bSBxY2FtZXJhM19leHRfb3BhcXVlX3Jhd19mb3JtYXQgeworICAgIFFDQU1FUkEzX09QQVFVRV9SQVdfRk9STUFUX0xFR0FDWSwKKyAgICBRQ0FNRVJBM19PUEFRVUVfUkFXX0ZPUk1BVF9NSVBJCit9IHFjYW1lcmEzX2V4dF9vcGFxdWVfcmF3X2Zvcm1hdF90OworCisKKy8vIFFDQU1FUkEzX1ZJREVPX0hEUl9NT0RFCit0eXBlZGVmIGVudW0gY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF92aWRlb19oZHJfbW9kZSB7CisgICAgUUNBTUVSQTNfVklERU9fSERSX01PREVfT0ZGLAorICAgIFFDQU1FUkEzX1ZJREVPX0hEUl9NT0RFX09OCit9IGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfdmlkZW9faGRyX21vZGVfdDsKKworLy8gUUNBTUVSQTNfSVJfTU9ERQordHlwZWRlZiBlbnVtIGNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfaXJfbW9kZSB7CisgICAgUUNBTUVSQTNfSVJfTU9ERV9PRkYsCisgICAgUUNBTUVSQTNfSVJfTU9ERV9PTiwKKyAgICBRQ0FNRVJBM19JUl9NT0RFX0FVVE8KK30gY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9pcl9tb2RlX3Q7CisKK2NsYXNzIFFDYW1lcmEzVmVuZG9yVGFncyB7CisKK3B1YmxpYzoKKyAgICBzdGF0aWMgdm9pZCBnZXRfdmVuZG9yX3RhZ19vcHModmVuZG9yX3RhZ19vcHNfdCogb3BzKTsKKyAgICBzdGF0aWMgaW50IGdldF90YWdfY291bnQoCisgICAgICAgICAgICBjb25zdCB2ZW5kb3JfdGFnX29wc190ICpvcHMpOworICAgIHN0YXRpYyB2b2lkIGdldF9hbGxfdGFncygKKyAgICAgICAgICAgIGNvbnN0IHZlbmRvcl90YWdfb3BzX3QgKm9wcywKKyAgICAgICAgICAgIHVpbnQzMl90ICp0YWdfYXJyYXkpOworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXRfc2VjdGlvbl9uYW1lKAorICAgICAgICAgICAgY29uc3QgdmVuZG9yX3RhZ19vcHNfdCAqb3BzLAorICAgICAgICAgICAgdWludDMyX3QgdGFnKTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0X3RhZ19uYW1lKAorICAgICAgICAgICAgY29uc3QgdmVuZG9yX3RhZ19vcHNfdCAqb3BzLAorICAgICAgICAgICAgdWludDMyX3QgdGFnKTsKKyAgICBzdGF0aWMgaW50IGdldF90YWdfdHlwZSgKKyAgICAgICAgICAgIGNvbnN0IHZlbmRvcl90YWdfb3BzX3QgKm9wcywKKyAgICAgICAgICAgIHVpbnQzMl90IHRhZyk7CisKKyAgICBzdGF0aWMgY29uc3QgdmVuZG9yX3RhZ19vcHNfdCAqT3BzOworfTsKKworfTsgLy8gbmFtZXNwYWNlIHFjYW1lcmEKKworI2VuZGlmIC8qIF9fUUNBTUVSQTNWRU5ET1JUQUdTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvYW5kcm9pZC9RQ2FtZXJhM0V4dGVybmFsLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy9hbmRyb2lkL1FDYW1lcmEzRXh0ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTUzZWFlCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvYW5kcm9pZC9RQ2FtZXJhM0V4dGVybmFsLmgKQEAgLTAsMCArMSw0NyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorKiBtZXQ6CisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisjaWZuZGVmIF9fUUNBTUVSQTNFWFRFUk5BTF9IX18KKyNkZWZpbmUgX19RQ0FNRVJBM0VYVEVSTkFMX0hfXworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKy8vIERpc3BsYXkgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiUVNlcnZpY2VVdGlscy5oIgorCituYW1lc3BhY2UgcWNhbWVyYSB7CisKK2lubGluZSBhbmRyb2lkOjpzdGF0dXNfdCBzZXRDYW1lcmFMYXVuY2hTdGF0dXModWludDMyX3Qgb24pIHsKKyAgICByZXR1cm4gOjpzZXRDYW1lcmFMYXVuY2hTdGF0dXMob24pOworfQorCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQorCisjZW5kaWYgLyogX19RQ0FNRVJBM0VYVEVSTkFMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9BbmRyb2lkLm1rIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOWVlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L0FuZHJvaWQubWsKQEAgLTAsMCArMSw0NyBAQAorTE9DQUxfUEFUSDo9JChjYWxsIG15LWRpcikKKworIyBCdWlsZCBjb21tYW5kIGxpbmUgdGVzdCBhcHA6IG1tLWhhbDMtYXBwCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworaWZlcSAoJChUQVJHRVRfU1VQUE9SVF9IQUwxKSxmYWxzZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFFDQU1FUkFfSEFMM19TVVBQT1JUCitlbmRpZgorCitpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtODk1MykKKyAgICBMT0NBTF9DRkxBR1MgKz0gLURDQU1FUkFfQ0hJUFNFVF84OTUzCitlbHNlCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0NISVBTRVRfODkzNworZW5kaWYKKworTE9DQUxfQ19JTkNMVURFUyArPSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvS0VSTkVMX09CSi91c3IvaW5jbHVkZQorTE9DQUxfQ19JTkNMVURFUys9ICQoa2VybmVsX2luY2x1ZGVzKQorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICBoYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlL2hhcmR3YXJlIFwKKyAgICBzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAorICAgIHN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIFwKKyAgICAkKExPQ0FMX1BBVEgpLy4uLyBcCisgICAgJChMT0NBTF9QQVRIKS8uLi8uLi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL2luYyBcCisKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBRQ2FtZXJhSEFMM0Jhc2UuY3BwIFwKKyAgICBRQ2FtZXJhSEFMM01haW5UZXN0Q29udGV4dC5jcHAgXAorICAgIFFDYW1lcmFIQUwzVmlkZW9UZXN0LmNwcCBcCisgICAgUUNhbWVyYUhBTDNQcmV2aWV3VGVzdC5jcHAgXAorICAgIFFDYW1lcmFIQUwzU25hcHNob3RUZXN0LmNwcCBcCisgICAgUUNhbWVyYUhBTDNSYXdTbmFwc2hvdFRlc3QuY3BwIFwKKyAgICBRQ2FtZXJhSEFMM1Rlc3QuY3BwCisKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IGxpYnV0aWxzIGxpYmNhbWVyYV9jbGllbnQgbGlibG9nIGxpYmNhbWVyYV9tZXRhZGF0YSBsaWJjdXRpbHMKKworTE9DQUxfMzJfQklUX09OTFkgOj0gJChCT0FSRF9RVElfQ0FNRVJBXzMyQklUX09OTFkpCisKK0xPQ0FMX01PRFVMRTo9IGhhbDMtdGVzdC1hcHAKKworTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEKKworTE9DQUxfQ0ZMQUdTICs9IC1zdGQ9YysrMTEgLXN0ZD1nbnUrKzB4CisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM0Jhc2UuY3BwIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM0Jhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmFiNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzQmFzZS5jcHAKQEAgLTAsMCArMSw0NzMgQEAKKy8qQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyogbWV0OgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKi8KKworI2luY2x1ZGUgIlFDYW1lcmFIQUwzTWFpblRlc3RDb250ZXh0LmgiCisjaW5jbHVkZSAiUUNhbWVyYUhBTDNTbmFwc2hvdFRlc3QuaCIKKyNpbmNsdWRlICJRQ2FtZXJhSEFMM1Jhd1NuYXBzaG90VGVzdC5oIgorI2luY2x1ZGUgIlFDYW1lcmFIQUwzUHJldmlld1Rlc3QuaCIKKworI2lmZGVmIFFDQU1FUkFfSEFMM19TVVBQT1JUCisjZGVmaW5lIExJQl9QQVRIIC91c3IvbGliL2h3L2NhbWVyYS5tc204OTUzLnNvCisjZWxzZQorI2RlZmluZSBMSUJfUEFUSCAvc3lzdGVtL2xpYi9ody9jYW1lcmEubXNtODk1My5zbworI2VuZGlmCisKK2V4dGVybiAiQyIgeworZXh0ZXJuIGludCBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9vcHMoY29uc3QgdmVuZG9yX3RhZ19vcHNfdCAqcXVlcnlfb3BzKTsKK30KKworLyojaWZkZWYgQ0FNRVJBX0NISVBTRVRfODk1MworI2RlZmluZSBDSElQU0VUX0xJQiBsaWIvaHcvY2FtZXJhLm1zbTg5NTMuc28KKyNlbHNlCisjZGVmaW5lIENISVBTRVRfTElCIGxpYi9ody9jYW1lcmEubXNtODkzNy5zbworI2VuZGlmKi8KKworI2RlZmluZSBDQU1fTElCKHMpIFNUUl9MSUJfUEFUSChzKQorI2RlZmluZSBTVFJfTElCX1BBVEgocykgI3MKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCitRQ2FtZXJhSEFMM1ByZXZpZXdUZXN0ICptUHJldmlld3Rlc3RDYXNlID0gTlVMTDsKK1FDYW1lcmFIQUwzVmlkZW9UZXN0ICptVmlkZW90ZXN0Q2FzZSA9IE5VTEw7CitRQ2FtZXJhSEFMM1NuYXBzaG90VGVzdCAqbVNuYXBzaG90dGVzdENhc2UgPSBOVUxMOworUUNhbWVyYUhBTDNSYXdTbmFwc2hvdFRlc3QgKm1SYXdTbmFwc2hvdHRlc3RDYXNlID0gTlVMTDsKKworc3RydWN0IHRpbWV2YWwgc3RhcnRfdGltZTsKK2ludCBjYXB0dXJlX3JlY2VpdmVkOworaW50IHBmZFsyXTsKK2V4dGVybiBpbnQgdGVzdF9jYXNlX2VuZDsKK2V4dGVybiBpbnQgc25hcHNob3RfYnVmZmVyOworCitwdGhyZWFkX2NvbmRfdCBtUmVxdWVzdEFwcENvbmQ7CitzdGQ6Omxpc3Q8dWludDMyX3Q+IFByZXZpZXdRdWV1ZTsKK3N0ZDo6bGlzdDx1aW50MzJfdD4gVmlkZW9RdWV1ZTsKKworcHRocmVhZF9tdXRleF90IFRlc3RBcHBMb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3B0aHJlYWRfbXV0ZXhfdCBtQ2FwdHVyZVJlcXVlc3RMb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworCisKK3N0YXRpYyB2b2lkIGNhbWVyYV9kZXZpY2Vfc3RhdHVzX2NoYW5nZSgKKyAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgIGludCBjYW1lcmFfaWQsIGludCBuZXdfc3RhdHVzKQoreworICAgIC8qIFN0dWIgZnVuY3Rpb24gKi8KKyAgICBpZiAoY2FsbGJhY2tzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRCgiUGFyYW1ldGVycyBhcmUgTlVMTCAlZCAlZCIsIGNhbWVyYV9pZCwgbmV3X3N0YXR1cyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UoCisgICAgICAgIGNvbnN0IHN0cnVjdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFfaWQsIGludCBuZXdfc3RhdHVzKQoreworICAgIC8qIFN0dWIgZnVuY3Rpb24gKi8KKyAgICBpZigoY2FsbGJhY2tzID09IE5VTEwpIHx8IChjYW1lcmFfaWQgPT0gTlVMTCkpIHsKKyAgICAgICAgTE9HRCgiUGFyYW1ldGVycyBhcmUgTlVMTCAlZCIsIG5ld19zdGF0dXMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgTm90aWZ5KAorICAgICAgICBjb25zdCBjYW1lcmEzX2NhbGxiYWNrX29wcyAqY2IsCisgICAgICAgIGNvbnN0IGNhbWVyYTNfbm90aWZ5X21zZyAqbXNnKQoreworICAgIC8qIFN0dWIgZnVuY3Rpb24gKi8KKyAgICBpZigoY2IgPT0gTlVMTCkgfHwgKG1zZyA9PSBOVUxMKSkgeworICAgICAgICBMT0dEKCJQYXJhbWV0ZXJzIGFyZSBOVUxMICIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgUHJvY2Vzc0NhcHR1cmVSZXN1bHQoCisgICAgICAgIGNvbnN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICpjYiwKKyAgICAgICAgY29uc3QgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdCAqcmVzdWx0KQoreworICAgIGJ1ZmZlcl90aHJlYWRfbXNnX3QgbXNnOworICAgIGV4dGVybiBDYW1lcmFIQUwzQmFzZSAqbUNhbUhhbDNCYXNlOworICAgIGludCBmcmFtZV9udW07CisgICAgZXh0ZXJuIGludCByZXFfc2VudDsKKyAgICBleHRlcm4gaW50IHByZXZpZXdfYnVmZmVyX2FsbG9jYXRlZDsKKyAgICBleHRlcm4gaW50IHZpZGVvX2J1ZmZlcl9hbGxvY2F0ZWQ7CisgICAgaW50IG51bTsKKyAgICBpZihjYiA9PSBOVUxMKSB7CisgICAgICAgIExPR0QoImNhbGxiYWNrIHJldHVybmVkIGlzIE5VTEwiKTsKKyAgICB9CisgICAgTE9HRCgiQ2FtIENhcHR1cmUgUmVzdWx0IENhbGxiYWNrICVkIGFuZCAlZCIsCisgICAgICAgICAgICByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycywgbUNhbUhhbDNCYXNlLT5tRnJhbWVDb3VudCk7CisgICAgaWYgKG1DYW1IYWwzQmFzZS0+bVRlc3RDYXNlU2VsZWN0ZWQgPT0gTUVOVV9TVEFSVF9QUkVWSUVXIHx8CisgICAgICAgICAgICBtQ2FtSGFsM0Jhc2UtPm1UZXN0Q2FzZVNlbGVjdGVkID09IE1FTlVfU1RBUlRfVklERU8pIHsKKyAgICAgICAgaWYgKHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzID09IDEpIHsKKyAgICAgICAgICAgIGZyYW1lX251bSA9IHJlc3VsdC0+ZnJhbWVfbnVtYmVyOworICAgICAgICAgICAgTE9HRCgiRnJhbWUgd2lkdGg6JWQgYW5kIGhlaWdodDolZCBhbmQgZm9ybWF0OiVkIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5vdXRwdXRfYnVmZmVycy0+c3RyZWFtLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LT5vdXRwdXRfYnVmZmVycy0+c3RyZWFtLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC0+b3V0cHV0X2J1ZmZlcnMtPnN0cmVhbS0+Zm9ybWF0KTsKKyAgICAgICAgICAgIChtQ2FtSGFsM0Jhc2UtPm1GcmFtZUNvdW50KSsrOworICAgICAgICAgICAgTE9HRCgiUHJldmlldy9WaWRlbyBDYXB0dXJlIFJlc3VsdCAlZCBhbmQgZmNvdW50OiAlZCBhbmQgcmVxX1NlbnQ6JWQgYW5kICVkICIsCisgICAgICAgICAgICByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycywgbUNhbUhhbDNCYXNlLT5tRnJhbWVDb3VudCwgcmVxX3NlbnQsIHJlc3VsdC0+ZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgIGlmICh0ZXN0X2Nhc2VfZW5kID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobUNhbUhhbDNCYXNlLT5tVGVzdENhc2VTZWxlY3RlZCA9PSBNRU5VX1NUQVJUX1BSRVZJRVcpIHsKKyAgICAgICAgICAgICAgICAgICAgbnVtID0gKHJlc3VsdC0+ZnJhbWVfbnVtYmVyKSVwcmV2aWV3X2J1ZmZlcl9hbGxvY2F0ZWQ7CisgICAgICAgICAgICAgICAgICAgIFByZXZpZXdRdWV1ZS5wdXNoX2JhY2sobnVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG51bSA9IChyZXN1bHQtPmZyYW1lX251bWJlcikldmlkZW9fYnVmZmVyX2FsbG9jYXRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvUXVldWUucHVzaF9iYWNrKG51bSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJm1SZXF1ZXN0QXBwQ29uZCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZtc2csIDAsIHNpemVvZihidWZmZXJfdGhyZWFkX21zZ190KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGV4dGVybiBpbnQgZmNvdW50X2NhcHR1cmVkOworICAgICAgICBpZiAocmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMgPT0gMSkgeworICAgICAgICAgICAgTE9HRCgic25hcHNob3QvUmF3IENhcHR1cmUxIFJlc3VsdCBDYWxsYmFjayAlZCBhbmQgJWQiLAorICAgICAgICAgICAgICAgICAgICByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycywgZmNvdW50X2NhcHR1cmVkKTsKKyAgICAgICAgICAgIChtQ2FtSGFsM0Jhc2UtPm1GcmFtZUNvdW50KSsrOworICAgICAgICAgICAgZmNvdW50X2NhcHR1cmVkKys7CisgICAgICAgICAgICBMT0dEKCJcbiBDYXB0dXJlICVkIGRvbmUgcHJlcGFyaW5nIGZvciBjYXB0dXJlICIsIGZjb3VudF9jYXB0dXJlZCk7CisgICAgICAgICAgICBtZW1zZXQoJm1zZywgMCwgc2l6ZW9mKGJ1ZmZlcl90aHJlYWRfbXNnX3QpKTsKKyAgICAgICAgICAgIHdyaXRlKHBmZFsxXSwgJm1zZywgc2l6ZW9mKGJ1ZmZlcl90aHJlYWRfbXNnX3QpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworQ2FtZXJhSEFMM0Jhc2U6OkNhbWVyYUhBTDNCYXNlKGludCBjYW1lcmFJbmRleCkgOgorICAgIG1DYW1lcmFJbmRleChjYW1lcmFJbmRleCksCisgICAgbUxpYkhhbmRsZShOVUxMKSwKKyAgICBtRnJhbWVDb3VudCgwKSwKKyAgICBtU2VjRWxhcHNlZCgxKSwKKyAgICBtVGVzdENhc2VTZWxlY3RlZCgwKSwKKyAgICBtUHJldmlld1J1bm5pbmcoMCksCisgICAgbVZpZGVvUnVubmluZygwKSwKKyAgICBtU25hcFNob3RSdW5uaW5nKDApCit7CisKK30KKworCitpbnQgQ2FtZXJhSEFMM0Jhc2U6OmhhbDNhcHBDYW1lcmFUZXN0TG9hZCgpCit7CisgICAgaW50IHJjID0gSEFMM19DQU1fT0s7CisgICAgaW50IG51bUNhbTsKKyAgICBpbnQzMl90IHJlcyA9IDA7CisgICAgaGFsM19jYW1lcmFfdGVzdF9vYmpfdCAqbXlfdGVzdF9vYmo7CisgICAgbUxpYkhhbmRsZSA9IG5ldyBoYWwzX2NhbWVyYV9saWJfdGVzdDsKKyAgICBtZW1zZXQobUxpYkhhbmRsZSwgMCwgc2l6ZW9mKGhhbDNfY2FtZXJhX2xpYl9oYW5kbGUpKTsKKyAgICByYyA9IGhhbDNhcHBUZXN0TG9hZCgmbUxpYkhhbmRsZS0+YXBwX29iaik7CisgICAgY2FtZXJhX21vZHVsZV90ICpteV9pZl9oYW5kbGUgPSBtTGliSGFuZGxlLT5hcHBfb2JqLmhhbDNfbGliLmhhbE1vZHVsZV90OworICAgIGlmIChIQUwzX0NBTV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJoYWwzIGVyclxuIik7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBudW1DYW0gPSBteV9pZl9oYW5kbGUtPmdldF9udW1iZXJfb2ZfY2FtZXJhcygpOworICAgIHByaW50ZigiXG4gTnVtYmVyIG9mIENhbWVyYXMgYXJlIDogJWQgIiwgbnVtQ2FtKTsKKyAgICBpZiAobXlfaWZfaGFuZGxlLT5nZXRfdmVuZG9yX3RhZ19vcHMpIHsKKyAgICAgICAgbUxpYkhhbmRsZS0+YXBwX29iai5tVmVuZG9yVGFnT3BzID0gdmVuZG9yX3RhZ19vcHNfdCgpOworICAgICAgICBteV9pZl9oYW5kbGUtPmdldF92ZW5kb3JfdGFnX29wcygmKG1MaWJIYW5kbGUtPmFwcF9vYmoubVZlbmRvclRhZ09wcykpOworCisgICAgICAgIHJlcyA9IHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX29wcygmKG1MaWJIYW5kbGUtPmFwcF9vYmoubVZlbmRvclRhZ09wcykpOworICAgICAgICBpZiAoMCAhPSByZXMpIHsKKyAgICAgICAgICAgIHByaW50ZigiJXM6IENvdWxkIG5vdCBzZXQgdmVuZG9yIHRhZyBkZXNjcmlwdG9yLCAiCisgICAgICAgICAgICAgICAgICAgICJyZWNlaXZlZCBlcnJvciAlcyAoJWQpLiBcbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKyAgICBteV90ZXN0X29iaiA9ICYobUxpYkhhbmRsZS0+dGVzdF9vYmopOworICAgIG15X3Rlc3Rfb2JqLT5tb2R1bGVfY2IudG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlID0gJnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZTsKKyAgICBteV90ZXN0X29iai0+bW9kdWxlX2NiLmNhbWVyYV9kZXZpY2Vfc3RhdHVzX2NoYW5nZSA9ICZjYW1lcmFfZGV2aWNlX3N0YXR1c19jaGFuZ2U7CisgICAgbXlfaWZfaGFuZGxlLT5zZXRfY2FsbGJhY2tzKCYobXlfdGVzdF9vYmotPm1vZHVsZV9jYikpOworICAgIG15X2lmX2hhbmRsZS0+Z2V0X2NhbWVyYV9pbmZvKDAsICYobUxpYkhhbmRsZS0+dGVzdF9vYmouY2FtX2luZm8pKTsKKyAgICBjYW1jYXBfaW5mbyA9IG1MaWJIYW5kbGUtPnRlc3Rfb2JqLmNhbV9pbmZvOworICAgIGhhbDNhcHBfY2FtX3NldHRpbmdzID0gKGNhbWNhcF9pbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzKTsKKyAgICBkaXNwbGF5X2NhcGFiaWxpdHkoKTsKKyAgICByZXR1cm4gbnVtQ2FtOworICAgIEVYSVQ6CisgICAgcmV0dXJuIHJjOworCit9CisKK3ZvaWQgQ2FtZXJhSEFMM0Jhc2U6OmRpc3BsYXlfY2FwYWJpbGl0eSgpCit7CisgICAgQUxPR0UoIkNhbWVyYSBIZXJlIik7CisgICAgaW50IGksajsKKyAgICBpbnQgKmF2YWlsYWJsZV9pcl9tb2RlcyA9IE5VTEwsICphdmFpbGFibGVfc3ZoZHJfbW9kZSA9IE5VTEwsIGNvdW50X3N0cmVhbTsKKyAgICBpZihoYWwzYXBwX2NhbV9zZXR0aW5ncy5leGlzdHMoUUNBTUVSQTNfSVJfQVZBSUxBQkxFX01PREVTKSkgeworICAgICAgICBBTE9HRSgiXG4gbXJhZCBjaGVjazEgIik7CisgICAgICAgIGVudHJ5X2hhbDNhcHAgPSBoYWwzYXBwX2NhbV9zZXR0aW5ncy5maW5kKFFDQU1FUkEzX0lSX0FWQUlMQUJMRV9NT0RFUyk7CisgICAgICAgIGF2YWlsYWJsZV9pcl9tb2RlcyA9IChpbnQgKikgbWFsbG9jKChlbnRyeV9oYWwzYXBwLmNvdW50KSpzaXplb2YoaW50ICkpOworICAgICAgICBmb3IoaSA9MDtpIDwgKGludCllbnRyeV9oYWwzYXBwLmNvdW50OyBpKyspeworICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVfaXJfbW9kZXNbaV0gPSBlbnRyeV9oYWwzYXBwLmRhdGEuaTMyW2ldOworICAgICAgICAgICAgQUxPR0UoIlxuIG1yYWQgY2FwICVkICIsIGF2YWlsYWJsZV9pcl9tb2Rlc1tpXSk7CisKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IENhbWVyYUhBTDNCYXNlOjpoYWwzYXBwQ2FtZXJhTGliT3BlbihpbnQgY2FtaWQpCit7CisgICAgaW50IHJjOworICAgIHJjID0gaGFsM2FwcENhbU9wZW4oJm1MaWJIYW5kbGUtPmFwcF9vYmosIChpbnQpY2FtaWQsICYobUxpYkhhbmRsZS0+dGVzdF9vYmopKTsKKyAgICBpZiAocmMgIT0gSEFMM19DQU1fT0spIHsKKyAgICAgICAgTE9HRSgiaGFsM2FwcENhbU9wZW4oKSBjYW1pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICBjYW1pZCwgcmMpOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHJjID0gaGFsM2FwcENhbUluaXRpYWxpemUoKGludCljYW1pZCwgJm1MaWJIYW5kbGUtPnRlc3Rfb2JqKTsKKyAgICBFWElUOgorICAgIHJldHVybiByYzsKK30KKworaW50IENhbWVyYUhBTDNCYXNlOjpoYWwzYXBwVGVzdExvYWQoaGFsM19jYW1lcmFfYXBwX3QgKm15X2hhbDNfYXBwKQoreworICAgIG1lbXNldCgmbXlfaGFsM19hcHAtPmhhbDNfbGliLCAwLCBzaXplb2YoaGFsM19pbnRlcmZhY2VfbGliX3QpKTsKKyAgICBwcmludGYoIlxuTGlicmFyeSBwYXRoIGlzIDolcyIsIENBTV9MSUIoTElCX1BBVEgpKTsKKyAgICBteV9oYWwzX2FwcC0+aGFsM19saWIucHRyID0gZGxvcGVuKENBTV9MSUIoTElCX1BBVEgpLCBSVExEX05PVyk7CisKKyAgICBpZiAoIW15X2hhbDNfYXBwLT5oYWwzX2xpYi5wdHIpIHsKKyAgICAgICAgTE9HRSgiRXJyb3Igb3BlbmluZyBIQUwgbGlicmFyaWVzICVzXG4iLAorICAgICAgICAgICAgICAgIGRsZXJyb3IoKSk7CisgICAgICAgIHJldHVybiAtSEFMM19DQU1fRV9HRU5FUkFMOworICAgIH0KKyAgICBteV9oYWwzX2FwcC0+aGFsM19saWIuaGFsTW9kdWxlX3QgPQorICAgICAgICAoY2FtZXJhX21vZHVsZV90KilkbHN5bShteV9oYWwzX2FwcC0+aGFsM19saWIucHRyLCBIQUxfTU9EVUxFX0lORk9fU1lNX0FTX1NUUik7CisgICAgaWYgKG15X2hhbDNfYXBwLT5oYWwzX2xpYi5oYWxNb2R1bGVfdCA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkVycm9yIG9wZW5pbmcgSEFMIGxpYnJhcnkgJXNcbiIsCisgICAgICAgICAgICAgICAgZGxlcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIC1IQUwzX0NBTV9FX0dFTkVSQUw7CisgICAgfQorICAgIHJldHVybiBIQUwzX0NBTV9PSzsKK30KKworaW50IENhbWVyYUhBTDNCYXNlOjpoYWwzYXBwQ2FtT3BlbigKKyAgICAgICAgaGFsM19jYW1lcmFfYXBwX3QgKm15X2hhbDNfYXBwLAorICAgICAgICBpbnQgY2FtaWQsCisgICAgICAgIGhhbDNfY2FtZXJhX3Rlc3Rfb2JqX3QgKm15X3Rlc3Rfb2JqKQoreworICAgIGNhbWVyYV9tb2R1bGVfdCAqbXlfaWZfaGFuZGxlID0gbXlfaGFsM19hcHAtPmhhbDNfbGliLmhhbE1vZHVsZV90OworICAgIG15X2lmX2hhbmRsZS0+Y29tbW9uLm1ldGhvZHMtPm9wZW4oJihteV9pZl9oYW5kbGUtPmNvbW1vbiksICIwIiwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aHdfZGV2aWNlX3QqKj4oJihteV90ZXN0X29iai0+ZGV2aWNlKSkpOworICAgIHByaW50ZigiXG4gQ2FtZXJhIElEICVkIE9wZW5lZCBcbiIsIGNhbWlkKTsKKyAgICByZXR1cm4gSEFMM19DQU1fT0s7Cit9CisKK2ludCBDYW1lcmFIQUwzQmFzZTo6aGFsM2FwcENhbUluaXRpYWxpemUoaW50IGNhbWlkLCBoYWwzX2NhbWVyYV90ZXN0X29ial90ICpteV90ZXN0X29iaikKK3sKKyAgICBpbnQgcmMgPSAwOworICAgIGNhbWVyYTNfZGV2aWNlX3QgKmRldmljZV9oYW5kbGUgPSBteV90ZXN0X29iai0+ZGV2aWNlOworICAgIG15X3Rlc3Rfb2JqLT5jYWxsYmFja19vcHMubm90aWZ5ID0gJk5vdGlmeTsKKyAgICBteV90ZXN0X29iai0+Y2FsbGJhY2tfb3BzLnByb2Nlc3NfY2FwdHVyZV9yZXN1bHQgPSAmUHJvY2Vzc0NhcHR1cmVSZXN1bHQ7CisgICAgcmMgPSBkZXZpY2VfaGFuZGxlLT5vcHMtPmluaXRpYWxpemUobXlfdGVzdF9vYmotPmRldmljZSwgJihteV90ZXN0X29iai0+Y2FsbGJhY2tfb3BzKSk7CisgICAgaWYgKHJjICE9IEhBTDNfQ0FNX09LKSB7CisgICAgICAgIExPR0UoImhhbDNhcHBDYW1Jbml0aWFsaXplKCkgY2FtaWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgY2FtaWQsIHJjKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBFWElUOgorICAgIHJldHVybiByYzsKK30KKworCit2b2lkIENhbWVyYUhBTDNCYXNlOjpoYWwzYXBwQ2hlY2tTdHJlYW0oaW50IHRlc3RjYXNlLCBpbnQgY2FtaWQpCit7CisgICAgaWYgKHRlc3RjYXNlICE9IE1FTlVfU1RBUlRfUFJFVklFVykgeworICAgICAgICBpZiAobVByZXZpZXd0ZXN0Q2FzZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtUHJldmlld3Rlc3RDYXNlLT5wcmV2aWV3VGVzdEVuZChtTGliSGFuZGxlLCBjYW1pZCk7CisgICAgICAgICAgICBkZWxldGUgbVByZXZpZXd0ZXN0Q2FzZTsKKyAgICAgICAgICAgIG1QcmV2aWV3dGVzdENhc2UgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0ZXN0Y2FzZSAhPSBNRU5VX1NUQVJUX1ZJREVPKXsKKyAgICAgICAgaWYgKG1WaWRlb3Rlc3RDYXNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1WaWRlb3Rlc3RDYXNlLT52aWRlb1Rlc3RFbmQobUxpYkhhbmRsZSwgY2FtaWQpOworICAgICAgICAgICAgZGVsZXRlIG1WaWRlb3Rlc3RDYXNlOworICAgICAgICAgICAgbVZpZGVvdGVzdENhc2UgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRlc3RjYXNlICE9IE1FTlVfU1RBUlRfQ0FQVFVSRSl7CisgICAgICAgIGlmIChtU25hcHNob3R0ZXN0Q2FzZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBkZWxldGUgbVNuYXBzaG90dGVzdENhc2U7CisgICAgICAgICAgICBtU25hcHNob3R0ZXN0Q2FzZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGVzdGNhc2UgIT0gTUVOVV9TVEFSVF9SQVdfQ0FQVFVSRSkgeworICAgICAgICBpZiAobVJhd1NuYXBzaG90dGVzdENhc2UgIT0gTlVMTCkgeworICAgICAgICAgICAgZGVsZXRlIG1SYXdTbmFwc2hvdHRlc3RDYXNlOworICAgICAgICAgICAgbVJhd1NuYXBzaG90dGVzdENhc2UgPSBOVUxMOworICAgICAgICB9CisgICAgfQorfQorCisKK2ludCBDYW1lcmFIQUwzQmFzZTo6aGFsM2FwcENhbWVyYVByZXZpZXdJbml0KGludCB0ZXN0Y2FzZSwgaW50IGNhbWlkLCBpbnQgdywgaW50IGgpCit7CisgICAgZXh0ZXJuIGludCByZXFfc2VudDsKKyAgICBpbnQgdGVzdENhc2VFbmRDb21wbGV0ZSA9IDA7CisgICAgaWYgKHcgPT0gMCB8fCBoID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJcbiBGcmFtZSBkaW1lbnNpb24gaXMgd3JvbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIG1QcmV2aWV3dGVzdENhc2UgIT0gTlVMTCkgeworICAgICAgICBpZih0ZXN0Y2FzZSA9PSBNRU5VX1RPR0dMRV9JUl9NT0RFKSB7CisgICAgICAgICAgICBBTE9HRSgiXG4gSVIgbW9kZSByZXF1ZXN0ZWQgaXMgOiVkIiwgaXJfbW9kZSk7CisgICAgICAgICAgICBtUHJldmlld3Rlc3RDYXNlLT5pcl9tb2RlID0gaXJfbW9kZTsKKyAgICAgICAgfQorICAgICAgICBpZih0ZXN0Y2FzZSA9PSBNRU5VX1RPR0dMRV9TVkhEUl9NT0RFKSB7CisgICAgICAgICAgICBBTE9HRSgiXG4gU1ZIRFIgbW9kZSByZXF1ZXN0ZWQgaXMgOiVkIiwgc3ZoZHJfbW9kZSk7CisgICAgICAgICAgICBtUHJldmlld3Rlc3RDYXNlLT5zdmhkcl9tb2RlID0gc3ZoZHJfbW9kZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRlc3RDYXNlRW5kQ29tcGxldGUgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAobVZpZGVvUnVubmluZyA9PSAxKSB7CisgICAgICAgICAgICAgICAgaGFsM2FwcENoZWNrU3RyZWFtKE1FTlVfU1RBUlRfUFJFVklFVywgY2FtaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZUZXN0QXBwTG9jayk7CisgICAgICAgICAgICBtVGVzdENhc2VTZWxlY3RlZCA9IE1FTlVfU1RBUlRfUFJFVklFVzsKKyAgICAgICAgICAgIGlmIChtVmlkZW9SdW5uaW5nICE9IDEpIHsKKyAgICAgICAgICAgICAgICBoYWwzYXBwQ2hlY2tTdHJlYW0oTUVOVV9TVEFSVF9QUkVWSUVXLCBjYW1pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJldmlld3Rlc3RDYXNlID0gbmV3IFFDYW1lcmFIQUwzUHJldmlld1Rlc3QoMCk7CisgICAgICAgICAgICBwcmludGYoIlxuXG4gVGVzdGluZyB0aGUgUmVzb2x1dGlvbiA6ICVkIFggJWQiLCB3LCBoKTsKKyAgICAgICAgICAgIHJlcV9zZW50ID0gMDsKKyAgICAgICAgICAgIFByZXZpZXdRdWV1ZS5jbGVhcigpOworICAgICAgICAgICAgY2FwdHVyZV9yZWNlaXZlZCA9IDA7IG1TZWNFbGFwc2VkID0gMTsKKyAgICAgICAgICAgIHNuYXBzaG90X2J1ZmZlciA9IC0xOyBtRnJhbWVDb3VudCA9IDA7CisgICAgICAgICAgICBtUHJldmlld3Rlc3RDYXNlLT53aWR0aCA9IHc7IG1QcmV2aWV3dGVzdENhc2UtPmhlaWdodCA9IGg7CisgICAgICAgICAgICBtUHJldmlld3Rlc3RDYXNlLT5pcl9tb2RlID0gMDsgbVByZXZpZXd0ZXN0Q2FzZS0+c3ZoZHJfbW9kZSA9IDA7CisgICAgICAgICAgICBtUHJldmlld3Rlc3RDYXNlLT5pbml0VGVzdChtTGliSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAoaW50KSBNRU5VX1NUQVJUX1BSRVZJRVcsIGNhbWlkLCB3LCBoKTsKKyAgICAgICAgICAgIHRlc3RDYXNlRW5kQ29tcGxldGUgPSAxOworICAgICAgICB9d2hpbGUodGVzdENhc2VFbmRDb21wbGV0ZSAhPSAxKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBDYW1lcmFIQUwzQmFzZTo6aGFsM2FwcENhbWVyYVZpZGVvSW5pdChpbnQgdGVzdGNhc2UsIGludCBjYW1pZCwgaW50IHcsIGludCBoKQoreworICAgIGV4dGVybiBpbnQgcmVxX3NlbnQ7CisgICAgaW50IHRlc3RDYXNlRW5kQ29tcGxldGUgPSAwOworICAgIGlmICh3ID09IDAgfHwgaCA9PSAwKSB7CisgICAgICAgIHByaW50ZigiXG4gRnJhbWUgZGltZW5zaW9uIGlzIHdyb25nIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAobVZpZGVvdGVzdENhc2UgIT0gTlVMTCkgeworICAgICAgICBMT0dEKCJ0ZXN0Y2FzZSBpcyA6ICVkIiwgdGVzdGNhc2UpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHRlc3RDYXNlRW5kQ29tcGxldGUgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAobVByZXZpZXdSdW5uaW5nID09IDEpIHsKKyAgICAgICAgICAgICAgICBoYWwzYXBwQ2hlY2tTdHJlYW0oTUVOVV9TVEFSVF9WSURFTywgY2FtaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZUZXN0QXBwTG9jayk7CisgICAgICAgICAgICBtVGVzdENhc2VTZWxlY3RlZCA9IE1FTlVfU1RBUlRfVklERU87CisgICAgICAgICAgICBpZiAobVByZXZpZXdSdW5uaW5nICE9IDEpIHsKKyAgICAgICAgICAgICAgICBoYWwzYXBwQ2hlY2tTdHJlYW0oTUVOVV9TVEFSVF9WSURFTywgY2FtaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVZpZGVvdGVzdENhc2UgPSBuZXcgUUNhbWVyYUhBTDNWaWRlb1Rlc3QoMCk7CisgICAgICAgICAgICBWaWRlb1F1ZXVlLmNsZWFyKCk7CisgICAgICAgICAgICBwcmludGYoIlxuXG5UZXN0aW5nIHRoZSBSZXNvbHV0aW9uIDogJWQgWCAlZCIsIHcsIGgpOworICAgICAgICAgICAgcmVxX3NlbnQgPSAwOworICAgICAgICAgICAgY2FwdHVyZV9yZWNlaXZlZCA9MDsgbVNlY0VsYXBzZWQgPSAxOyB0ZXN0X2Nhc2VfZW5kID0gMDsKKyAgICAgICAgICAgIG1WaWRlb3Rlc3RDYXNlLT53aWR0aCA9IHc7IG1WaWRlb3Rlc3RDYXNlLT5oZWlnaHQgPSBoOworICAgICAgICAgICAgc25hcHNob3RfYnVmZmVyID0gLTE7IG1GcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgIG1WaWRlb3Rlc3RDYXNlLT5pbml0VGVzdChtTGliSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAoaW50KSBNRU5VX1NUQVJUX1ZJREVPLCBjYW1pZCwgdywgaCk7CisgICAgICAgICAgICB0ZXN0Q2FzZUVuZENvbXBsZXRlID0gMTsKKyAgICAgICAgfXdoaWxlKHRlc3RDYXNlRW5kQ29tcGxldGUgIT0xKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50IENhbWVyYUhBTDNCYXNlOjpoYWwzYXBwUmF3Q2FwdHVyZUluaXQoaGFsM19jYW1lcmFfbGliX3Rlc3QgKmhhbmRsZSwgaW50IGNhbWlkLCBpbnQgcmVxX2NhcCkKK3sKKyAgICBpbnQgdGVzdENhc2VFbmRDb21wbGV0ZSA9IDA7CisgICAgaWYoaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FtZXJhIEhhbmRsZSBpcyBOVUxMIik7CisgICAgfQorICAgIGlmIChtU25hcFNob3RSdW5uaW5nICE9IDEpIHsKKyAgICAgICAgaGFsM2FwcENoZWNrU3RyZWFtKE1FTlVfU1RBUlRfUkFXX0NBUFRVUkUsIGNhbWlkKTsKKyAgICB9CisgICAgdGVzdENhc2VFbmRDb21wbGV0ZSA9IDA7CisgICAgZG8geworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJlRlc3RBcHBMb2NrKTsKKyAgICAgICAgaWYgKG1TbmFwU2hvdFJ1bm5pbmcgPT0gMSkgeworICAgICAgICAgICAgaGFsM2FwcENoZWNrU3RyZWFtKE1FTlVfU1RBUlRfUkFXX0NBUFRVUkUsIGNhbWlkKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIGNhcHR1cmU6JWQiLCByZXFfY2FwKTsKKyAgICAgICAgbVRlc3RDYXNlU2VsZWN0ZWQgPSBNRU5VX1NUQVJUX1JBV19DQVBUVVJFOworICAgICAgICBtUmF3U25hcHNob3R0ZXN0Q2FzZSA9IG5ldyBRQ2FtZXJhSEFMM1Jhd1NuYXBzaG90VGVzdChyZXFfY2FwKTsKKyAgICAgICAgbVJhd1NuYXBzaG90dGVzdENhc2UtPm1SZXF1ZXN0ZWRDYXB0dXJlID0gcmVxX2NhcDsKKyAgICAgICAgbVJhd1NuYXBzaG90dGVzdENhc2UtPmluaXRUZXN0KG1MaWJIYW5kbGUsCisgICAgICAgIChpbnQpIE1FTlVfU1RBUlRfUkFXX0NBUFRVUkUsIGNhbWlkLCBSQVdTTkFQU0hPVF9DQVBUVVJFX1dJRFRILAorICAgICAgICAgICAgICAgIFJBV1NOQVBTSE9UX0NBUFRVUkVfSEVJR0hUKTsKKyAgICAgICAgdGVzdENhc2VFbmRDb21wbGV0ZSA9IDE7CisgICAgfXdoaWxlKHRlc3RDYXNlRW5kQ29tcGxldGUgIT0xKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IENhbWVyYUhBTDNCYXNlOjpoYWwzYXBwQ2FtZXJhQ2FwdHVyZUluaXQoaGFsM19jYW1lcmFfbGliX3Rlc3QgKmhhbmRsZSwKKyAgICAgICAgaW50IGNhbWlkLCBpbnQgcmVxX2NhcCkKK3sKKyAgICBpbnQgdGVzdENhc2VFbmRDb21wbGV0ZSA9IDA7CisgICAgaWYoaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiQ2FtZXJhIEhhbmRsZSBpcyBOVUxMIik7CisgICAgfQorICAgIGlmIChtU25hcFNob3RSdW5uaW5nICE9IDEpIHsKKyAgICAgICAgaGFsM2FwcENoZWNrU3RyZWFtKE1FTlVfU1RBUlRfQ0FQVFVSRSwgY2FtaWQpOworICAgIH0KKyAgICB0ZXN0Q2FzZUVuZENvbXBsZXRlID0gMDsKKyAgICBkbyB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmVGVzdEFwcExvY2spOworICAgICAgICBpZiAobVNuYXBTaG90UnVubmluZyA9PSAxKSB7CisgICAgICAgICAgICBoYWwzYXBwQ2hlY2tTdHJlYW0oTUVOVV9TVEFSVF9DQVBUVVJFLCBjYW1pZCk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbiBjYXB0dXJlOiVkIiwgcmVxX2NhcCk7CisgICAgICAgIG1UZXN0Q2FzZVNlbGVjdGVkID0gTUVOVV9TVEFSVF9DQVBUVVJFOworICAgICAgICBtU25hcHNob3R0ZXN0Q2FzZSA9IG5ldyBRQ2FtZXJhSEFMM1NuYXBzaG90VGVzdChyZXFfY2FwKTsKKyAgICAgICAgbVNuYXBzaG90dGVzdENhc2UtPm1SZXF1ZXN0ZWRDYXB0dXJlID0gcmVxX2NhcDsKKyAgICAgICAgbVNuYXBzaG90dGVzdENhc2UtPmluaXRUZXN0KG1MaWJIYW5kbGUsCisgICAgICAgICAgICAoaW50KSBNRU5VX1NUQVJUX0NBUFRVUkUsIGNhbWlkLCBTTkFQU0hPVF9DQVBUVVJFX1dJRFRILCBTTkFQU0hPVF9DQVBUVVJFX0hFSUdIVCk7CisgICAgICAgIHRlc3RDYXNlRW5kQ29tcGxldGUgPSAxOworICAgIH13aGlsZSh0ZXN0Q2FzZUVuZENvbXBsZXRlICE9IDEpOworICAgIHJldHVybiAwOworfQorCit9CisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL3Rlc3QvUUNhbWVyYUhBTDNCYXNlLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNDJlMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzQmFzZS5oCkBAIC0wLDAgKzEsMTc2IEBACisvKkNvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisjaWZuZGVmIF9fSEFMM0FQUF9IX18KKyNkZWZpbmUgX19IQUwzQVBQX0hfXworCisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSAiUUNhbWVyYTNWZW5kb3JUYWdzLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKK30KKworI2RlZmluZSBIQUwzX0RBVEFTUEFDRV9VTktOT1dOIDB4MAorI2RlZmluZSBIQUwzX0RBVEFTUEFDRV9BUkJJVFJBUlkgMHgxCisjZGVmaW5lIEhBTDNfREFUQVNQQUNFX0pGSUYgMHgxMDEKKyNkZWZpbmUgRkxBR1NfVklERU9fRU5DT0RFUiAweDAwMDEwMDAwCisKKyNkZWZpbmUgUFJFVklFV19XSURUSCAxNDQwCisjZGVmaW5lIFBSRVZJRVdfSEVJR0hUIDEwODAKKworI2RlZmluZSBWSURFT19XSURUSCAxOTIwCisjZGVmaW5lIFZJREVPX0hFSUdIVCAxMDgwCisKKyNkZWZpbmUgU05BUFNIT1RfQ0FQVFVSRV9XSURUSCA1MzQ0CisjZGVmaW5lIFNOQVBTSE9UX0NBUFRVUkVfSEVJR0hUIDQwMDgKKworI2RlZmluZSBSQVdTTkFQU0hPVF9DQVBUVVJFX1dJRFRIIDUzNDQKKyNkZWZpbmUgUkFXU05BUFNIT1RfQ0FQVFVSRV9IRUlHSFQgNDAxNgorCituYW1lc3BhY2UgcWNhbWVyYSB7CisKK3R5cGVkZWYgZW51bSB7CisgICAgSEFMM19DQU1fT0ssCisgICAgSEFMM19DQU1fRV9HRU5FUkFMLAorICAgIEhBTDNfQ0FNX0VfTk9fTUVNT1JZLAorICAgIEhBTDNfQ0FNX0VfTk9UX1NVUFBPUlRFRCwKKyAgICBIQUwzX0NBTV9FX0lOVkFMSURfSU5QVVQsCisgICAgSEFMM19DQU1fRV9JTlZBTElEX09QRVJBVElPTiwKKyAgICBIQUwzX0NBTV9FX0VOQ09ERSwKKyAgICBIQUwzX0NBTV9FX0JVRkZFUl9SRUcsCisgICAgSEFMM19DQU1fRV9QTUVNX0FMTE9DLAorICAgIEhBTDNfQ0FNX0VfQ0FQVFVSRV9GQUlMRUQsCisgICAgSEFMM19DQU1fRV9DQVBUVVJFX1RJTUVPVVQsCit9IGhhbDNfY2FtZXJhX3N0YXR1c190eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUFJPQ0VTU19CVUZGRVIsCit9IGJ1ZmZlcl90aHJlYWRfbXNnX3R5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbWVyYTNfZGV2aWNlX3QgKmRldmljZTsKKyAgICBjYW1lcmEzX2NhbGxiYWNrX29wcyBjYWxsYmFja19vcHM7CisgICAgc3RydWN0IGNhbWVyYV9pbmZvIGNhbV9pbmZvOworICAgIGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QgbW9kdWxlX2NiOworfSBoYWwzX2NhbWVyYV90ZXN0X29ial90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGZkOworICAgIGludCBpb25fZmQ7CisgICAgaW9uX3VzZXJfaGFuZGxlX3QgaW9uX2hhbmRsZTsKKyAgICBzaXplX3Qgc2l6ZTsKK30gaGFsM19jYW10ZXN0X21lbWluZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGJ1ZmZlcl90aHJlYWRfbXNnX3R5cGVfdCBtc2c7CisgICAgYm9vbCBzdG9wX3RocmVhZDsKK30gYnVmZmVyX3RocmVhZF9tc2dfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHZvaWQgKnB0cjsKKyAgICBjYW1lcmFfbW9kdWxlX3QqIGhhbE1vZHVsZV90OworfSBoYWwzX2ludGVyZmFjZV9saWJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgbnVtX2NhbWVyYXM7CisgICAgdmVuZG9yX3RhZ19vcHNfdCBtVmVuZG9yVGFnT3BzOworICAgIGhhbDNfaW50ZXJmYWNlX2xpYl90IGhhbDNfbGliOworfSBoYWwzX2NhbWVyYV9hcHBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGhhbDNfY2FtZXJhX2FwcF90IGFwcF9vYmo7CisgICAgaGFsM19jYW1lcmFfdGVzdF9vYmpfdCB0ZXN0X29iajsKK30gaGFsM19jYW1lcmFfbGliX3Rlc3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBwdGhyZWFkX3QgdGQ7CisgICAgcHRocmVhZF9tdXRleF90IG11dGV4OworICAgIHB0aHJlYWRfY29uZF90IGNvbmQ7CisgICAgaW50MzJfdCByZWFkZmQ7CisgICAgaW50MzJfdCB3cml0ZWZkOworICAgIHZvaWQgKmRhdGFfb2JqOworICAgIGJvb2wgaXNfdGhyZWFkX3N0YXJ0ZWQ7CisgICAgaW50IHRlc3RjYXNlOworfSBidWZmZXJfdGhyZWFkX3Q7CisKK2V4dGVybiBpbnQzMl90IHBmZFsyXTsKK3R5cGVkZWYgaGFsM19jYW1lcmFfbGliX3Rlc3QgaGFsM19jYW1lcmFfbGliX2hhbmRsZTsKKworY2xhc3MgQ2FtZXJhSEFMM0Jhc2UKK3sKKyAgICBmcmllbmQgY2xhc3MgTWFpblRlc3RDb250ZXh0OworcHJvdGVjdGVkOgorICAgIGludCBtQ2FtZXJhSW5kZXg7CitwdWJsaWM6CisgICAgQ2FtZXJhSEFMM0Jhc2UoKTsKKyAgICBDYW1lcmFIQUwzQmFzZShpbnQgY2FtZXJhSW5kZXgpOworICAgIGhhbDNfY2FtZXJhX2xpYl90ZXN0ICptTGliSGFuZGxlOworICAgIGludCBtRnJhbWVDb3VudDsKKyAgICBpbnQgZnBzOworICAgIGludCBtU2VjRWxhcHNlZDsKKyAgICBpbnQgbVRlc3RDYXNlU2VsZWN0ZWQ7CisgICAgaW50IG1QcmV2aWV3UnVubmluZzsKKyAgICBpbnQgbVZpZGVvUnVubmluZzsKKyAgICBpbnQgbVNuYXBTaG90UnVubmluZzsKKyAgICBib29sIGlyX21vZGU7CisgICAgYm9vbCBzdmhkcl9tb2RlOworICAgIGNhbWVyYV9pbmZvIGNhbWNhcF9pbmZvOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBlbnRyeV9oYWwzYXBwOworICAgIGFuZHJvaWQ6OkNhbWVyYU1ldGFkYXRhIGhhbDNhcHBfY2FtX3NldHRpbmdzOworICAgIGludCBoYWwzYXBwQ2FtSW5pdGlhbGl6ZShpbnQgY2FtaWQsIGhhbDNfY2FtZXJhX3Rlc3Rfb2JqX3QgKm15X3Rlc3Rfb2JqKTsKKyAgICB2b2lkIGhhbDNhcHBDYW1DYXBhYmlsaXR5R2V0KGhhbDNfY2FtZXJhX2xpYl90ZXN0ICpoYW5kbGUsaW50IGNhbWlkKTsKKyAgICBpbnQgaGFsM2FwcENhbWVyYUxpYk9wZW4oaW50ICk7CisgICAgaW50IGhhbDNhcHBUZXN0TG9hZChoYWwzX2NhbWVyYV9hcHBfdCAqKTsKKyAgICBpbnQgaGFsM2FwcENhbU9wZW4oaGFsM19jYW1lcmFfYXBwX3QgKiwKKyAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgaGFsM19jYW1lcmFfdGVzdF9vYmpfdCAqKTsKKyAgICBpbnQgaGFsM2FwcENhbWVyYVByZXZpZXdJbml0KGludCwgaW50LCBpbnQsIGludCk7CisgICAgaW50IGhhbDNhcHBDYW1lcmFWaWRlb0luaXQoaW50LCBpbnQgY2FtaWQsIGludCB3LCBpbnQgaCk7CisgICAgdm9pZCBkaXNwbGF5X2NhcGFiaWxpdHkoKTsKKyAgICBpbnQgaGFsM2FwcENhbWVyYUNhcHR1cmVJbml0KGhhbDNfY2FtZXJhX2xpYl90ZXN0ICosIGludCwgaW50KTsKKyAgICBpbnQgaGFsM2FwcFJhd0NhcHR1cmVJbml0KGhhbDNfY2FtZXJhX2xpYl90ZXN0ICpoYW5kbGUsIGludCBjYW1pZCwgaW50ICk7CisgICAgaW50IGhhbDNhcHBDYW1lcmFUZXN0TG9hZCgpOworICAgIHZvaWQgaGFsM2FwcENoZWNrU3RyZWFtKGludCB0ZXN0Y2FzZSwgaW50IGNhbWlkKTsKK307CisKK30KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL3Rlc3QvUUNhbWVyYUhBTDNNYWluVGVzdENvbnRleHQuY3BwIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM01haW5UZXN0Q29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2YWI2MAotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL3Rlc3QvUUNhbWVyYUhBTDNNYWluVGVzdENvbnRleHQuY3BwCkBAIC0wLDAgKzEsMzAxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorKiBtZXQ6CisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisjaW5jbHVkZSAiUUNhbWVyYUhBTDNNYWluVGVzdENvbnRleHQuaCIKKyNpbmNsdWRlICJRQ2FtZXJhSEFMM0Jhc2UuaCIKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisjZGVmaW5lIE1BWF9DQU1FUkFfU1VQUE9SVEVEIDIwCisKK2NvbnN0IENBTUVSQV9CQVNFX01FTlVfVEJMX1QgY2FtZXJhX21haW5fbWVudV90YmxbXSA9IHsKKyAgICB7TUVOVV9TVEFSVF9QUkVWSUVXLCAgICAgICAgICAgICAiVG8gU3RhcnQgUHJldmlldyJ9LAorICAgIHtNRU5VX1NUQVJUX1ZJREVPLCAgICAgICAgICAgICAgICJUbyBTdGFydCBWaWRlbyJ9LAorICAgIHtNRU5VX1NUQVJUX0NBUFRVUkUsICAgICAgICAgICAgICJUbyBDYXB0dXJlIn0sCisgICAge01FTlVfU1RBUlRfUkFXX0NBUFRVUkUsICAgICAgICAgIlRvIFJhdyBDYXB0dXJlIn0sCisgICAge01FTlVfVE9HR0xFX0lSX01PREUsICAgICAgICAgICAgIlRvZ2dsZSBJUiBNb2RlIn0sCisgICAge01FTlVfVE9HR0xFX1NWSERSX01PREUsICAgICAgICAgIlRvZ2dsZSBTVkhEUiBNb2RlIn0sCisgICAge01FTlVfRVhJVCwgICAgICAgICAgICAgICAgICAgICAgIkVYSVQifSwKK307CisKK2NvbnN0IEhBTDNURVNUX1NFTlNPUl9NRU5VX1RCTF9UIHNlbnNvcl90YmxbXSA9IHsKKyAgICB7IlJlYXIgQ2FtZXJhIn0sCisgICAgeyJGcm9udCBDYW1lcmEifSwKK307CisKK0NhbWVyYUhBTDNCYXNlICptQ2FtSGFsM0Jhc2UgPSBOVUxMOworcHRocmVhZF9tdXRleF90IGdDYW1Mb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworTWFpblRlc3RDb250ZXh0OjpNYWluVGVzdENvbnRleHQoKQoreworICAgIG1UZXN0UnVubmluZyA9IGZhbHNlOworICAgIG1DYW1IYWwzQmFzZSA9IE5VTEw7CisgICAgaXJtb2RlID0gMDsKKyAgICBzdmhkcm1vZGUgPSAwOworfQorCitpbnQgTWFpblRlc3RDb250ZXh0OjpoYWwzYXBwR2V0VXNlckV2ZW50KCkKK3sKKyAgICBpbnQgY2hvaWNlOworICAgIGludCByYyA9IDAsIHJlcV9jYXB0dXJlID0gMDsKKyAgICBpbnQgcHJldmlld19yZXN0YXJ0OworICAgIHVpbnQ4X3QgbnVtX29mX2NhbWVyYXM7CisgICAgaWYgKG1DYW1IYWwzQmFzZSAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtQ2FtSGFsM0Jhc2U7CisgICAgfQorICAgIG1DYW1IYWwzQmFzZSA9IG5ldyBDYW1lcmFIQUwzQmFzZSgwKTsKKyAgICBudW1fb2ZfY2FtZXJhcyA9IG1DYW1IYWwzQmFzZS0+aGFsM2FwcENhbWVyYVRlc3RMb2FkKCk7CisgICAgaWYgKChudW1fb2ZfY2FtZXJhcyA8PSAwKSAmJiAobnVtX29mX2NhbWVyYXMgPj0gTUFYX0NBTUVSQV9TVVBQT1JURUQpKSB7CisgICAgICAgIExPR0UoIlxuIFN1cHBvcnRlZCBDYW1lcmEgVmFsdWUgaXMgd3JvbmcgOiAlZCIsIG51bV9vZl9jYW1lcmFzKTsKKyAgICAgICAgcHJpbnRmKCJcbiBJbnZhbGlkIE51bWJlciBPZiBDYW1lcmFzIik7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNob2ljZSA9IGhhbDNhcHBEaXNwbGF5U2Vuc29yTWVudShudW1fb2ZfY2FtZXJhcyk7CisgICAgICAgIGlmIChjaG9pY2UgPj0gbnVtX29mX2NhbWVyYXMgfHwgY2hvaWNlIDwgMCkgeworICAgICAgICAgICAgcHJpbnRmKCJcbiBVbnN1cHBvcnRlZCBQYXJhbWV0ZXIiKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1DYW1IYWwzQmFzZS0+bUNhbWVyYUluZGV4ID0gY2hvaWNlOworICAgICAgICAgICAgcmMgPSBtQ2FtSGFsM0Jhc2UtPmhhbDNhcHBDYW1lcmFMaWJPcGVuKGNob2ljZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZG8geworICAgICAgICBjaG9pY2UgPSBoYWwzYXBwUHJpbnRNZW51KCk7CisgICAgICAgIHN3aXRjaChjaG9pY2UpIHsKKyAgICAgICAgICAgIGNhc2UgTUVOVV9TVEFSVF9QUkVWSUVXOgorICAgICAgICAgICAgICAgIG1DYW1IYWwzQmFzZS0+aGFsM2FwcENhbWVyYVByZXZpZXdJbml0KE1FTlVfU1RBUlRfUFJFVklFVywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1IYWwzQmFzZS0+bUNhbWVyYUluZGV4LCBQUkVWSUVXX1dJRFRILCBQUkVWSUVXX0hFSUdIVCk7CisgICAgICAgICAgICAgICAgbUNhbUhhbDNCYXNlLT5tUHJldmlld1J1bm5pbmcgPSAxOyBtQ2FtSGFsM0Jhc2UtPm1WaWRlb1J1bm5pbmcgPSAwOworICAgICAgICAgICAgICAgIG1DYW1IYWwzQmFzZS0+bVNuYXBTaG90UnVubmluZyA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBNRU5VX1NUQVJUX1ZJREVPOgorICAgICAgICAgICAgICAgIG1DYW1IYWwzQmFzZS0+aGFsM2FwcENhbWVyYVZpZGVvSW5pdChNRU5VX1NUQVJUX1ZJREVPLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbUhhbDNCYXNlLT5tQ2FtZXJhSW5kZXgsIFZJREVPX1dJRFRILCBWSURFT19IRUlHSFQpOworICAgICAgICAgICAgICAgIG1DYW1IYWwzQmFzZS0+bVByZXZpZXdSdW5uaW5nID0gMDsgbUNhbUhhbDNCYXNlLT5tVmlkZW9SdW5uaW5nID0gMTsKKyAgICAgICAgICAgICAgICBtQ2FtSGFsM0Jhc2UtPm1TbmFwU2hvdFJ1bm5pbmcgPSAwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTUVOVV9TVEFSVF9DQVBUVVJFOgorICAgICAgICAgICAgICAgIGhhbDNhcHBEaXNwbGF5U25hcHNob3RNZW51KCk7CisgICAgICAgICAgICAgICAgcmVxX2NhcHR1cmUgPSAxOyBwcmV2aWV3X3Jlc3RhcnQgPSAwOworICAgICAgICAgICAgICAgIGlmIChtQ2FtSGFsM0Jhc2UtPm1QcmV2aWV3UnVubmluZyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXZpZXdfcmVzdGFydCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYW1IYWwzQmFzZS0+aGFsM2FwcENhbWVyYUNhcHR1cmVJbml0KDAsIDAsIHJlcV9jYXB0dXJlKTsKKyAgICAgICAgICAgICAgICBtQ2FtSGFsM0Jhc2UtPm1QcmV2aWV3UnVubmluZyA9IDA7IG1DYW1IYWwzQmFzZS0+bVZpZGVvUnVubmluZyA9IDA7CisgICAgICAgICAgICAgICAgbUNhbUhhbDNCYXNlLT5tU25hcFNob3RSdW5uaW5nID0gMTsKKyAgICAgICAgICAgICAgICBpZiAocHJldmlld19yZXN0YXJ0ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbUhhbDNCYXNlLT5oYWwzYXBwQ2FtZXJhUHJldmlld0luaXQoTUVOVV9TVEFSVF9QUkVWSUVXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1IYWwzQmFzZS0+bUNhbWVyYUluZGV4LCBQUkVWSUVXX1dJRFRILCBQUkVWSUVXX0hFSUdIVCk7CisgICAgICAgICAgICAgICAgICAgIG1DYW1IYWwzQmFzZS0+bVByZXZpZXdSdW5uaW5nID0gMTsgbUNhbUhhbDNCYXNlLT5tVmlkZW9SdW5uaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbUNhbUhhbDNCYXNlLT5tU25hcFNob3RSdW5uaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBNRU5VX1NUQVJUX1JBV19DQVBUVVJFOgorICAgICAgICAgICAgICAgIGhhbDNhcHBEaXNwbGF5UmF3Q2FwdHVyZU1lbnUoKTsKKyAgICAgICAgICAgICAgICByZXFfY2FwdHVyZSA9IDM7CisgICAgICAgICAgICAgICAgbUNhbUhhbDNCYXNlLT5oYWwzYXBwUmF3Q2FwdHVyZUluaXQoMCwgMCwgcmVxX2NhcHR1cmUpOworICAgICAgICAgICAgICAgIG1DYW1IYWwzQmFzZS0+bVByZXZpZXdSdW5uaW5nID0gMDsgbUNhbUhhbDNCYXNlLT5tVmlkZW9SdW5uaW5nID0gMDsKKyAgICAgICAgICAgICAgICBtQ2FtSGFsM0Jhc2UtPm1TbmFwU2hvdFJ1bm5pbmcgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgTUVOVV9UT0dHTEVfSVJfTU9ERToKKyAgICAgICAgICAgICAgICAgaWYobUNhbUhhbDNCYXNlLT5tUHJldmlld1J1bm5pbmcgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgQ2FudCBzZXQgSVIvU1ZIRFIgbW9kZSBpbiBwcmV2aWV3IG1vZGUgb25seSIpOworICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIGlybW9kZSA9ICFpcm1vZGU7CisgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIFN3aXRjaGluZyBJUi9TVkhEUiBtb2RlIHRvICVzIiwoaXJtb2RlID8gIk9uIiA6ICJPZmYiKSk7CisgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiXG4gU3dpdGNoaW5nIElSL1NWSERSIG1vZGUgdG8gJXMgYW5kICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlybW9kZSA/ICJPbiIgOiAiT2ZmIiksaXJtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgIG1DYW1IYWwzQmFzZS0+aXJfbW9kZSA9IGlybW9kZTsKKyAgICAgICAgICAgICAgICAgICAgIG1DYW1IYWwzQmFzZS0+aGFsM2FwcENhbWVyYVByZXZpZXdJbml0KE1FTlVfVE9HR0xFX0lSX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1IYWwzQmFzZS0+bUNhbWVyYUluZGV4LCBQUkVWSUVXX1dJRFRILCBQUkVWSUVXX0hFSUdIVCk7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIE1FTlVfVE9HR0xFX1NWSERSX01PREU6CisgICAgICAgICAgICAgICAgIGlmKG1DYW1IYWwzQmFzZS0+bVByZXZpZXdSdW5uaW5nID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiIENhbnQgc2V0IElSL1NWSERSIG1vZGUgaW4gcHJldmlldyBtb2RlIG9ubHkiKTsKKyAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICBzdmhkcm1vZGUgPSAhc3ZoZHJtb2RlOworICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBTd2l0Y2hpbmcgSVIvU1ZIRFIgbW9kZSB0byAlcyIsKHN2aGRybW9kZSA/ICJPbiIgOiAiT2ZmIikpOworICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlxuIFN3aXRjaGluZyBJUi9TVkhEUiBtb2RlIHRvICVzIGFuZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdmhkcm1vZGUgPyAiT24iIDogIk9mZiIpLHN2aGRybW9kZSk7CisgICAgICAgICAgICAgICAgICAgICBtQ2FtSGFsM0Jhc2UtPnN2aGRyX21vZGUgPSBzdmhkcm1vZGU7CisgICAgICAgICAgICAgICAgICAgICBtQ2FtSGFsM0Jhc2UtPmhhbDNhcHBDYW1lcmFQcmV2aWV3SW5pdChNRU5VX1RPR0dMRV9TVkhEUl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtSGFsM0Jhc2UtPm1DYW1lcmFJbmRleCwgUFJFVklFV19XSURUSCwgUFJFVklFV19IRUlHSFQpOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBNRU5VX0VYSVQ6CisgICAgICAgICAgICAgICAgaGFsM2FwcERpc3BsYXlFeGl0TWVudSgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBPcHRpb24gbm90IGluIE1lbnVcbiIpOworICAgICAgICB9CisgICAgfXdoaWxlKGNob2ljZSAhPSBNRU5VX0VYSVQpOworICAgIGV4aXQ6CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBNYWluVGVzdENvbnRleHQ6OmhhbDNhcHBEaXNwbGF5U2Vuc29yTWVudSh1aW50OF90IG51bV9vZl9jYW1lcmFzKQoreworICAgIGludCBpLCBjaG9pY2U7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgcHJpbnRmKCIgICAgQ2FtZXJhIFNlbnNvciB0byBiZSB1c2VkOiAgICAgICAgICAgIFxuIik7CisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworCisgICAgZm9yICggaT0wO2kgPCBudW1fb2ZfY2FtZXJhczsgaSsrKSB7CisgICAgICAgIGlmIChpIDw9IDEpIHsKKyAgICAgICAgICAgIHByaW50ZigiXG4gUHJlc3MgJWQgdG8gc2VsZWN0ICVzIiwgKGkpLCBzZW5zb3JfdGJsW2ldLm1lbnVfbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIlxuIFByZXNzICVkIHRvIHNlbGVjdCBDYW1lcmElZCIsIChpKSwgaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpbnRmKCJcbiBFbnRlciB5b3VyIENob2ljZToiKTsKKyAgICBmc2NhbmYoc3RkaW4sICIlZCIsICZjaG9pY2UpOworICAgIHJldHVybiBjaG9pY2U7Cit9CisKK3ZvaWQgTWFpblRlc3RDb250ZXh0OjpoYWwzYXBwRGlzcGxheUNhcGFiaWxpdHlNZW51KCkKK3sKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICBwcmludGYoIiAgICAgIFNlbnNvciBDYXBhYmlsdHkgYXJlIGR1bXBlZCBhdCBsb2NhdGlvbjpcbiIpOworICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iKTsKK30KKworaW50IE1haW5UZXN0Q29udGV4dDo6aGFsM2FwcERpc3BsYXlQcmV2aWV3TWVudSgpCit7CisgICAgaW50IGNob2ljZTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICBwcmludGYoIlNlbGVjdCBDYW1lcmEgUHJldmlldyBSZXNvbHV0aW9uOlxuIik7CisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworICAgIHByaW50ZigiPT09PT09PT1TZWxlY3QgUHJldmlldyBSZXNvbHV0aW9ucz09PT09PT09PT09PT09PT1cbiIpOworICAgIHByaW50ZigiXG5QcmVzcyAxIC5Bc3BlY3QgUmF0aW8oNDozKSBSZXNvbHV0aW9uIDE0NDAgWCAxMDgwIik7CisgICAgcHJpbnRmKCJcblByZXNzIDIgLkFzcGVjdCBSYXRpbygxNjo5KSBSZXNvbHV0aW9uIDE5MjAgWCAxMDgwIik7CisgICAgcHJpbnRmKCJcbiBFbnRlciB5b3VyIENob2ljZToiKTsKKyAgICBmc2NhbmYoc3RkaW4sICIlZCIsICZjaG9pY2UpOworICAgIHJldHVybiBjaG9pY2U7Cit9CisKK2ludCBNYWluVGVzdENvbnRleHQ6OmhhbDNhcHBEaXNwbGF5VmlkZW9NZW51KCkKK3sKKyAgICBpbnQgY2hvaWNlMTsKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICBwcmludGYoIlRlc3RpbmcgQ2FtZXJhIFJlY29yZGluZyBvbiBEaWZmZXJlbnQgUmVzb2x1dGlvbjpcbiIpOworICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iKTsKKworICAgIHByaW50ZigiPT09PT09PT1TZWxlY3QgVmlkZW8gUmVzb2x1dGlvbnM9PT09PT09PT09PT09PT09XG4iKTsKKyAgICBwcmludGYoIlxuUHJlc3MgMSAuQXNwZWN0IFJhdGlvKDQ6MykgUmVzb2x1dGlvbiA2NDAgWCA0ODAiKTsKKyAgICBwcmludGYoIlxuUHJlc3MgMiAuQXNwZWN0IFJhdGlvKDE2OjkpIFJlc29sdXRpb24gMTkyMCBYIDEwODAiKTsKKyAgICBwcmludGYoIlxuUHJlc3MgMyAuVG8gc2VsZWN0IGJvdGgiKTsKKworICAgIHByaW50ZigiXG4gRW50ZXIgeW91ciBDaG9pY2U6Iik7CisgICAgZnNjYW5mKHN0ZGluLCAiJWQiLCAmY2hvaWNlMSk7CisgICAgcmV0dXJuIGNob2ljZTE7Cit9CisKK3ZvaWQgTWFpblRlc3RDb250ZXh0OjpoYWwzYXBwRGlzcGxheVJhd0NhcHR1cmVNZW51KCkKK3sKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICBwcmludGYoIlRlc3RpbmcgUkFXIENhbWVyYSBDYXB0dXJlIG9uIERpZmZlcmVudCBSZXNvbHV0aW9uOjpcbiIpOworICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iKTsKK30KKwordm9pZCBNYWluVGVzdENvbnRleHQ6OmhhbDNhcHBEaXNwbGF5U25hcHNob3RNZW51KCkKK3sKKyAgICBwcmludGYoIlxuIik7CisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgICBwcmludGYoIlRlc3RpbmcgTm9ybWFsIENhbWVyYSBDYXB0dXJlIG9uIFJlc29sdXRpb24gNTM0NCBYIDQwMDhcbiIpOworICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iKTsKK30KKworCit2b2lkIE1haW5UZXN0Q29udGV4dDo6aGFsM2FwcERpc3BsYXlFeGl0TWVudSgpCit7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgcHJpbnRmKCIgICAgICBFeGl0aW5nIEhBTDMgQVBQIHRlc3QgXG4iKTsKKyAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7Cit9CisKK2ludCBNYWluVGVzdENvbnRleHQ6OmhhbDNhcHBQcmludE1lbnUoKQoreworICAgIGludCBpLCBjaG9pY2UgPSAwOworICAgIGNoYXIgY2ggPSAnMCc7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgcHJpbnRmKCIgICAgICAgSEFMMyBNRU5VIFxuIik7CisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworICAgIGZvciAoIGkgPSAwOyBpIDwgKGludCkoc2l6ZW9mKGNhbWVyYV9tYWluX21lbnVfdGJsKS9zaXplb2YoY2FtZXJhX21haW5fbWVudV90YmxbMF0pKTsgaSsrKSB7CisgICAgICAgIHByaW50ZigiXG4gUHJlc3MgJWQgdG8gc2VsZWN0ICVzIiwgKGkrMSksIGNhbWVyYV9tYWluX21lbnVfdGJsW2ldLm1lbnVfbmFtZSk7CisgICAgfQorICAgIHByaW50ZigiXG4gRW50ZXIgeW91ciBDaG9pY2U6Iik7CisgICAgZG8geworICAgICAgICBzdGQ6OmNpbiA+PiBjaDsKKyAgICB9IHdoaWxlKCEoY2ggPj0gJzEnICYmIGNoIDw9ICc5JykpOworICAgIGNob2ljZSA9IGNoIC0nMCc7CisgICAgcmV0dXJuIGNob2ljZTsKK30KK30KKworaW50IG1haW4oKQoreworICAgIGNoYXIgdGNfYnVmWzNdOworICAgIGludCBtb2RlID0gMDsKKyAgICBpbnQgcmMgPSAwOworICAgIHFjYW1lcmE6Ok1haW5UZXN0Q29udGV4dCBtYWluX2N0eDsKKyAgICBwcmludGYoIlBsZWFzZSBTZWxlY3QgRXhlY3V0aW9uIE1vZGU6XG4iKTsKKyAgICBwcmludGYoIjA6IE1lbnUgQmFzZWQgMTogUmVncmVzc2lvblxuIik7CisgICAgcHJpbnRmKCJcbiBFbnRlciB5b3VyIGNob2ljZToiKTsKKyAgICBmZ2V0cyh0Y19idWYsIDMsIHN0ZGluKTsKKyAgICBtb2RlID0gdGNfYnVmWzBdIC0gJzAnOworICAgIGlmIChtb2RlID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJcblN0YXJ0aW5nIE1lbnUgYmFzZWQhIVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJcblBsZWFzZSBFbnRlciAwIG9yIDFcbiIpOworICAgICAgICBwcmludGYoIlxuRXhpc3RpbmcgdGhlIEFwcCEhXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgcmMgPSBtYWluX2N0eC5oYWwzYXBwR2V0VXNlckV2ZW50KCk7CisgICAgcHJpbnRmKCJFeGl0aW5nIGFwcGxpY2F0aW9uXG4iKTsKKyAgICByZXR1cm4gcmM7Cit9CisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL3Rlc3QvUUNhbWVyYUhBTDNNYWluVGVzdENvbnRleHQuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL3Rlc3QvUUNhbWVyYUhBTDNNYWluVGVzdENvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTg4ZjYyCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM01haW5UZXN0Q29udGV4dC5oCkBAIC0wLDAgKzEsODYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisjaWZuZGVmIF9fSEFMM1RFU1RfSF9fCisjZGVmaW5lIF9fSEFMM1RFU1RfSF9fCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorbmFtZXNwYWNlIHFjYW1lcmEgeworCisKK3R5cGVkZWYgZW51bQoreworICAgIE1FTlVfQkFTRSA9IDAsCisgICAgTUVOVV9TVEFSVF9QUkVWSUVXLAorICAgIE1FTlVfU1RBUlRfVklERU8sCisgICAgTUVOVV9TVEFSVF9DQVBUVVJFLAorICAgIE1FTlVfU1RBUlRfUkFXX0NBUFRVUkUsCisgICAgTUVOVV9UT0dHTEVfSVJfTU9ERSwKKyAgICBNRU5VX1RPR0dMRV9TVkhEUl9NT0RFLAorICAgIE1FTlVfRVhJVAorfSBtZW51X2lkOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbWVudV9pZCBiYXNlX21lbnU7CisgICAgY2hhciAqICBiYXNlbWVudV9uYW1lOworfSBIQUwzVEVTVF9CQVNFX01FTlVfVEJMX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICogbWVudV9uYW1lOworfSBIQUwzVEVTVF9TRU5TT1JfTUVOVV9UQkxfVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG1lbnVfaWQgbWFpbl9tZW51OworICAgIGNvbnN0IGNoYXIgKiBtZW51X25hbWU7Cit9IENBTUVSQV9CQVNFX01FTlVfVEJMX1Q7CisKK2NsYXNzIENhbWVyYUhBTDNCYXNlOworY2xhc3MgTWFpblRlc3RDb250ZXh0Cit7CisgICAgaW50IGNob2ljZTsKKyAgICBib29sIG1UZXN0UnVubmluZzsKKyAgICBib29sIGlybW9kZTsKKyAgICBib29sIHN2aGRybW9kZTsKK3B1YmxpYzoKKyAgICBNYWluVGVzdENvbnRleHQoKTsKKyAgICBpbnQgaGFsM2FwcEdldFVzZXJFdmVudCgpOworICAgIGludCBoYWwzYXBwRGlzcGxheVNlbnNvck1lbnUodWludDhfdCApOworICAgIHZvaWQgaGFsM2FwcERpc3BsYXlDYXBhYmlsaXR5TWVudSgpOworICAgIGludCBoYWwzYXBwRGlzcGxheVByZXZpZXdNZW51KCk7CisgICAgaW50IGhhbDNhcHBEaXNwbGF5VmlkZW9NZW51KCk7CisgICAgdm9pZCBoYWwzYXBwRGlzcGxheVJhd0NhcHR1cmVNZW51KCk7CisgICAgdm9pZCBoYWwzYXBwRGlzcGxheVNuYXBzaG90TWVudSgpOworICAgIHZvaWQgaGFsM2FwcERpc3BsYXlFeGl0TWVudSgpOworICAgIGludCBoYWwzYXBwUHJpbnRNZW51KCk7Cit9OworCit9CisKKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL3Rlc3QvUUNhbWVyYUhBTDNQcmV2aWV3VGVzdC5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzUHJldmlld1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjM3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzUHJldmlld1Rlc3QuY3BwCkBAIC0wLDAgKzEsMjcxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorKiBtZXQ6CisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisjaW5jbHVkZSAiUUNhbWVyYUhBTDNQcmV2aWV3VGVzdC5oIgorI2luY2x1ZGUgIlFDYW1lcmFIQUwzTWFpblRlc3RDb250ZXh0LmgiCisKK25hbWVzcGFjZSBxY2FtZXJhIHsKK2V4dGVybiBoYWwzX2NhbWVyYV9saWJfdGVzdCAqQ2FtT2JqX2hhbmRsZTsKK2ludCByZXFfc2VudDsKK2V4dGVybiBwdGhyZWFkX2NvbmRfdCBtUmVxdWVzdEFwcENvbmQ7CitpbnQgdGVzdF9jYXNlX2VuZDsKK2Jvb2wgdGhyZWFkX2V4aXQ7CitleHRlcm4gc3RkOjpsaXN0PHVpbnQzMl90PiBQcmV2aWV3UXVldWU7CitpbnQgcHJldmlld19idWZmZXJfYWxsb2NhdGVkOworZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCBUZXN0QXBwTG9jaywgbUNhcHR1cmVSZXF1ZXN0TG9jazsKK2ludCBzbmFwc2hvdF9idWZmZXIgPSAtMTsKKworCitRQ2FtZXJhSEFMM1ByZXZpZXdUZXN0OjpRQ2FtZXJhSEFMM1ByZXZpZXdUZXN0KGludCBjYW1pZCkgOgorICAgIFFDYW1lcmFIQUwzVGVzdCgwKSwKKyAgICBtUHJldmlld0hhbmRsZShOVUxMKSwKKyAgICBtQ2FwdHVyZUhhbmRsZShOVUxMKSwKKyAgICBtUHJldmlld1N0cmVhbShOVUxMKSwKKyAgICBub2J1ZmZlcigwKSwKKyAgICBpcl9tb2RlKDApLAorICAgIHN2aGRyX21vZGUoMCkKK3sKKworfQorCit2b2lkIFFDYW1lcmFIQUwzUHJldmlld1Rlc3Q6OmluaXRUZXN0KGhhbDNfY2FtZXJhX2xpYl90ZXN0ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZXN0Y2FzZSwgaW50IGNhbWlkLCBpbnQgdywgaW50IGgpCit7CisgICAgaW50IGk7CisgICAgQ2FtT2JqX2hhbmRsZSA9IGhhbmRsZTsgdGhyZWFkX2V4aXQgPSAwOyB0ZXN0X2Nhc2VfZW5kID0gMDsKKyAgICBMT0dEKCJcbiBidWZmZXIgdGhyZWFkIGNyZWF0ZWQgZm9yIHRlc3RjYXNlICVkICAlZCBhbmQgJWQgIix0ZXN0Y2FzZSwgdywgaCk7CisgICAgY29uZmlndXJlUHJldmlld1N0cmVhbSgmKGhhbmRsZS0+dGVzdF9vYmopICwgY2FtaWQsIHcsIGgpOworICAgIExPR0QoIlxuIHByZXZpZXcgc3RyZWFtIGNvbmZpZ3VyZWQiKTsKKyAgICBjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdCgmKGhhbmRsZS0+dGVzdF9vYmopLCBjYW1pZCk7CisgICAgTE9HRCgiRGVmYXVsdCBzdHJlYW0gc2V0dGluZyByZWFkICIpOworICAgIHByaW50ZigiXG5waXBlbGluZV9kZXB0aCBpcyAlZCIsIG1QaXBlbGluZURlcHRoUHJldmlldyk7CisgICAgbVByZXZpZXdIYW5kbGUgPSBuZXcgbmF0aXZlX2hhbmRsZV90ICpbbVBpcGVsaW5lRGVwdGhQcmV2aWV3XTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbVBpcGVsaW5lRGVwdGhQcmV2aWV3OyBpKyspCisgICAgICAgIG1QcmV2aWV3SGFuZGxlW2ldID0gbmV3IG5hdGl2ZV9oYW5kbGVfdDsKKyAgICBmb3IgKGkgPSAwLCByZXFfc2VudCA9IDE7IGkgPCBtUGlwZWxpbmVEZXB0aFByZXZpZXc7IGkrKywgcmVxX3NlbnQrKykgeworICAgICAgICBwcmV2aWV3QWxsb2NhdGVCdWZmZXJzKHdpZHRoLCBoZWlnaHQsIGkpOworICAgICAgICBQcmV2aWV3UXVldWUucHVzaF9iYWNrKGkpOworICAgIH0KKyAgICBMT0dEKCIgUmVxdWVzdCBOdW1iZXIgaXMgcHJldmlldyA6ICVkICIsbVJlcXVlc3QuZnJhbWVfbnVtYmVyKTsKKyAgICBtUmVxdWVzdC5mcmFtZV9udW1iZXIgPSAwOworICAgIHByZXZpZXdQcm9jZXNzVGhyZWFkQ3JlYXRlKGhhbmRsZSk7Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNQcmV2aWV3VGVzdDo6c25hcHNob3RDYXB0dXJlUmVxdWVzdChoYWwzX2NhbWVyYV9saWJfdGVzdCAqaGFuZGxlLAorICAgICAgICBpbnQgdGVzdGNhc2UsIGludCBjYW1pZCwgaW50IHcsIGludCBoKQoreworICAgIExPR0QoIlJlcXVlc3RlZCBDYXB0dXJlIFNpemVzIGZvciB0ZXN0Y2FzZTolZCBhcmUgOiVkICBYICVkIix0ZXN0Y2FzZSwgdywgaCk7CisgICAgY2FwdHVyZVJlcXVlc3RSZXBlYXQoaGFuZGxlLCBjYW1pZCwgTUVOVV9TVEFSVF9DQVBUVVJFKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUNhcHR1cmVSZXF1ZXN0TG9jayk7Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNQcmV2aWV3VGVzdDo6Y29uZmlndXJlUHJldmlld1N0cmVhbShoYWwzX2NhbWVyYV90ZXN0X29ial90ICpteV90ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbWlkLCBpbnQgdywgaW50IGgpCit7CisgICAgY2FtZXJhM19kZXZpY2VfdCAqZGV2aWNlX2hhbmRsZSA9IG15X3Rlc3Rfb2JqLT5kZXZpY2U7CisgICAgbVByZXZpZXdTdHJlYW0gPSAgbmV3IGNhbWVyYTNfc3RyZWFtX3Q7CisgICAgbWVtc2V0KG1QcmV2aWV3U3RyZWFtLCAwLCBzaXplb2YoY2FtZXJhM19zdHJlYW1fdCkpOworICAgIG1QcmV2aWV3U3RyZWFtID0gaW5pdFN0cmVhbShDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIGNhbWlkLCB3LCBoLCAwLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELCBIQUwzX0RBVEFTUEFDRV9VTktOT1dOKTsKKworICAgIG1QcmV2aWV3Q29uZmlnID0gY29uZmlndXJlU3RyZWFtKENBTUVSQTNfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREUsIDEpOworICAgIG1QcmV2aWV3Q29uZmlnLnN0cmVhbXNbMF0gPSBtUHJldmlld1N0cmVhbTsKKyAgICBkZXZpY2VfaGFuZGxlLT5vcHMtPmNvbmZpZ3VyZV9zdHJlYW1zKG15X3Rlc3Rfb2JqLT5kZXZpY2UsICYobVByZXZpZXdDb25maWcpKTsKKyAgICBtUGlwZWxpbmVEZXB0aFByZXZpZXcgPSBtUHJldmlld0NvbmZpZy5zdHJlYW1zWzBdLT5tYXhfYnVmZmVyczsKKyAgICBwcmV2aWV3X2J1ZmZlcl9hbGxvY2F0ZWQgPSBtUGlwZWxpbmVEZXB0aFByZXZpZXc7Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNQcmV2aWV3VGVzdDo6Y29uc3RydWN0RGVmYXVsdFJlcXVlc3QoCisgICAgICAgIGhhbDNfY2FtZXJhX3Rlc3Rfb2JqX3QgKm15X3Rlc3Rfb2JqLCBpbnQgY2FtaWQpCit7CisgICAgY2FtZXJhM19kZXZpY2VfdCAqZGV2aWNlX2hhbmRsZSA9IG15X3Rlc3Rfb2JqLT5kZXZpY2U7CisgICAgTE9HRCgiQ2FtZXJhIElEIDogJWQiLGNhbWlkKTsKKyAgICBtTWV0YURhdGFQdHJbMF09IGRldmljZV9oYW5kbGUtPm9wcy0+Y29uc3RydWN0X2RlZmF1bHRfcmVxdWVzdF9zZXR0aW5ncyhteV90ZXN0X29iai0+ZGV2aWNlLAorICAgICAgICAgICAgQ0FNRVJBM19URU1QTEFURV9QUkVWSUVXKTsKKyAgICBtTWV0YURhdGFQdHJbMV0gPSBkZXZpY2VfaGFuZGxlLT5vcHMtPmNvbnN0cnVjdF9kZWZhdWx0X3JlcXVlc3Rfc2V0dGluZ3MobXlfdGVzdF9vYmotPmRldmljZSwKKyAgICAgICAgICAgIENBTUVSQTNfVEVNUExBVEVfU1RJTExfQ0FQVFVSRSk7Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNQcmV2aWV3VGVzdDo6Y2FwdHVyZVJlcXVlc3RSZXBlYXQoCisgICAgICAgIGhhbDNfY2FtZXJhX2xpYl90ZXN0ICpteV9oYWwzdGVzdF9vYmosIGludCBjYW1pZCwgaW50IHRlc3RjYXNlKQoreworICAgIGludCBudW0xLCBudW0yOworICAgIGludCBpcl9tb2RlX2NoYW5nZWQ7CisgICAgaW50IHN2aGRyX21vZGVfY2hhbmdlZDsKKyAgICBpbnQzMl90IHNldF9zdmhkcl9tb2RlOworICAgIGludDMyX3Qgc2V0X2lyX21vZGU7CisgICAgaGFsM19jYW1lcmFfdGVzdF9vYmpfdCAqbXlfdGVzdF9vYmogPSAmKG15X2hhbDN0ZXN0X29iai0+dGVzdF9vYmopOworICAgIGNhbWVyYTNfZGV2aWNlX3QgKmRldmljZV9oYW5kbGUgPSBteV90ZXN0X29iai0+ZGV2aWNlOworCisgICAgaWYgKHRlc3RjYXNlID09IE1FTlVfU1RBUlRfUFJFVklFVykgeworICAgICAgICBpZiAoUHJldmlld1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIExPR0UoIm5vIHByZXZpZXcgYnVmZmVyIGZvciBDYW1JRCA6ICVkIiwgY2FtaWQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHRlc3RfY2FzZV9lbmQgPT0gMCkgeworICAgICAgICAgICAgICAgIExPR0QoIiBSZXF1ZXN0IE51bWJlciBpcyBwcmV2aWV3IDogJWQgIixtUmVxdWVzdC5mcmFtZV9udW1iZXIpOworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbUNhcHR1cmVSZXF1ZXN0TG9jayk7CisgICAgICAgICAgICAgICAgbnVtMiA9IFByZXZpZXdRdWV1ZS5mcm9udCgpOworICAgICAgICAgICAgICAgIFByZXZpZXdRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBudW0xID0gbVJlcXVlc3QuZnJhbWVfbnVtYmVyOworICAgICAgICAgICAgICAgIGlyX21vZGVfY2hhbmdlZCA9IGdldF9pcl9tb2RlKGlyX21vZGUpOworICAgICAgICAgICAgICAgIHN2aGRyX21vZGVfY2hhbmdlZCA9IGdldF9zdmhkcl9tb2RlKHN2aGRyX21vZGUpOworICAgICAgICAgICAgICAgIEFMT0dFKCJzZXR0aW5nIElSIG1vZGUgOiVkIixpcl9tb2RlX2NoYW5nZWQpOworICAgICAgICAgICAgICAgIEFMT0dFKCJzZXR0aW5nIFNWSERSIG1vZGUgOiVkIixzdmhkcl9tb2RlX2NoYW5nZWQpOworICAgICAgICAgICAgICAgIGlmIChudW0xIDwgMSkgeworICAgICAgICAgICAgICAgICAgICAobVJlcXVlc3QpLnNldHRpbmdzID0gbU1ldGFEYXRhUHRyWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKGlyX21vZGVfY2hhbmdlZCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbDNhcHBfcHJldmlld19zZXR0aW5ncyA9IG1NZXRhRGF0YVB0clswXTsKKyAgICAgICAgICAgICAgICAgICAgaWYoaXJfbW9kZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgic2V0dGluZyBJUiBtb2RlIG9mZiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2lyX21vZGUgPSAoaW50MzJfdClRQ0FNRVJBM19JUl9NT0RFX09GRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0X3N2aGRyX21vZGUgPSAoaW50MzJfdClRQ0FNRVJBM19WSURFT19IRFJfTU9ERV9PRkY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgic2V0dGluZyBJUiBtb2RlIE9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfaXJfbW9kZSA9IChpbnQzMl90KVFDQU1FUkEzX0lSX01PREVfT047CisgICAgICAgICAgICAgICAgICAgICAgICAvL3NldF9zdmhkcl9tb2RlID0gKGludDMyX3QpUUNBTUVSQTNfVklERU9fSERSX01PREVfT047CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFsM2FwcF9wcmV2aWV3X3NldHRpbmdzLnVwZGF0ZShRQ0FNRVJBM19JUl9NT0RFLCAmc2V0X2lyX21vZGUsIDEpOworICAgICAgICAgICAgICAgICAgICAvL2hhbDNhcHBfcHJldmlld19zZXR0aW5ncy51cGRhdGUoUUNBTUVSQTNfVklERU9fSERSX01PREUsICZzZXRfc3ZoZHJfbW9kZSwgMSk7CisgICAgICAgICAgICAgICAgICAgIChtUmVxdWVzdCkuc2V0dGluZ3MgPSBoYWwzYXBwX3ByZXZpZXdfc2V0dGluZ3MucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKHN2aGRyX21vZGVfY2hhbmdlZCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbDNhcHBfcHJldmlld19zZXR0aW5ncyA9IG1NZXRhRGF0YVB0clswXTsKKyAgICAgICAgICAgICAgICAgICAgaWYoc3ZoZHJfbW9kZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgic2V0dGluZyBIRFIgbW9kZSBvZmYiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0X2lyX21vZGUgPSAoaW50MzJfdClBTkRST0lEX0lSX01PREVfT0ZGOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3N2aGRyX21vZGUgPSAoaW50MzJfdClRQ0FNRVJBM19WSURFT19IRFJfTU9ERV9PRkY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgic2V0dGluZyBIRFIgbW9kZSBPbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXRfaXJfbW9kZSA9IChpbnQzMl90KUFORFJPSURfSVJfTU9ERV9PTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9zdmhkcl9tb2RlID0gKGludDMyX3QpUUNBTUVSQTNfVklERU9fSERSX01PREVfT047CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy9oYWwzYXBwX3ByZXZpZXdfc2V0dGluZ3MudXBkYXRlKFFDQU1FUkEzX0lSX01PREUsICZzZXRfaXJfbW9kZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIGhhbDNhcHBfcHJldmlld19zZXR0aW5ncy51cGRhdGUoUUNBTUVSQTNfVklERU9fSERSX01PREUsICZzZXRfc3ZoZHJfbW9kZSwgMSk7CisgICAgICAgICAgICAgICAgICAgIChtUmVxdWVzdCkuc2V0dGluZ3MgPSBoYWwzYXBwX3ByZXZpZXdfc2V0dGluZ3MucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKG1SZXF1ZXN0KS5zZXR0aW5ncyA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIChtUmVxdWVzdCkuaW5wdXRfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAobVJlcXVlc3QpLm51bV9vdXRwdXRfYnVmZmVycyA9IDE7CisgICAgICAgICAgICAgICAgbVByZXZpZXdTdHJlYW1CdWZmcy5zdHJlYW0gPSBtUHJldmlld1N0cmVhbTsKKyAgICAgICAgICAgICAgICBtUHJldmlld1N0cmVhbUJ1ZmZzLnN0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgbVByZXZpZXdTdHJlYW1CdWZmcy5idWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqKSZtUHJldmlld0hhbmRsZVtudW0yXTsKKyAgICAgICAgICAgICAgICBtUHJldmlld1N0cmVhbUJ1ZmZzLnJlbGVhc2VfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICBtUHJldmlld1N0cmVhbUJ1ZmZzLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICAobVJlcXVlc3QpLm91dHB1dF9idWZmZXJzID0gJihtUHJldmlld1N0cmVhbUJ1ZmZzKTsKKyAgICAgICAgICAgICAgICBMT0dEKCJDYWxsaW5nIEhBTDNBUFAgcmVwZWF0IGNhcHR1cmUgcmVxdWVzdCAlZCBhbmQgJWQgYW5kIGZyZWUgYnVmZmVyIDolZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAsIG51bTEsIG51bTIsIFByZXZpZXdRdWV1ZS5zaXplKCkpOworCisgICAgICAgICAgICAgICAgZGV2aWNlX2hhbmRsZS0+b3BzLT5wcm9jZXNzX2NhcHR1cmVfcmVxdWVzdChteV90ZXN0X29iai0+ZGV2aWNlLCAmKG1SZXF1ZXN0KSk7CisgICAgICAgICAgICAgICAgKG1SZXF1ZXN0LmZyYW1lX251bWJlcikrKzsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUNhcHR1cmVSZXF1ZXN0TG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNuYXBzaG90X2J1ZmZlciA9IG1SZXF1ZXN0LmZyYW1lX251bWJlcjsKKyAgICAgICAgKG1SZXF1ZXN0KS5zZXR0aW5ncyA9IG1NZXRhRGF0YVB0clsxXTsKKyAgICAgICAgbVNuYXBzaG90U3RyZWFtQnVmZnMgPSBoYWwzYXBwR2V0U3RyZWFtQnVmZnMobVNuYXBzaG90U3RyZWFtKTsKKyAgICAgICAgbVNuYXBzaG90U3RyZWFtQnVmZnMuYnVmZmVyID0gKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqKSZtQ2FwdHVyZUhhbmRsZTsKKyAgICAgICAgbVJlcXVlc3QgPSBoYWwzYXBwR2V0UmVxdWVzdFNldHRpbmdzKCZtU25hcHNob3RTdHJlYW1CdWZmcywgMSk7CisgICAgICAgIExPR0QoIkNhbGxpbmcgc25hcCBIQUwzQVBQIHJlcGVhdCBjYXB0dXJlIHJlcXVlc3QgcmVwZWF0ICVkICAiLCBzbmFwc2hvdF9idWZmZXIpOworICAgICAgICBkZXZpY2VfaGFuZGxlLT5vcHMtPnByb2Nlc3NfY2FwdHVyZV9yZXF1ZXN0KG15X3Rlc3Rfb2JqLT5kZXZpY2UsICYobVJlcXVlc3QpKTsKKyAgICAgICAgKG1SZXF1ZXN0LmZyYW1lX251bWJlcikrKzsKKyAgICB9Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNQcmV2aWV3VGVzdDo6cHJldmlld1Rlc3RFbmQoCisgICAgICAgIGhhbDNfY2FtZXJhX2xpYl90ZXN0ICpteV9oYWwzdGVzdF9vYmosIGludCBjYW1pZCkKK3sKKyAgICB0ZXN0X2Nhc2VfZW5kID0gMTsKKyAgICBoYWwzX2NhbWVyYV90ZXN0X29ial90ICpteV90ZXN0X29iaiA9ICYobXlfaGFsM3Rlc3Rfb2JqLT50ZXN0X29iaik7CisgICAgY2FtZXJhM19kZXZpY2VfdCAqZGV2aWNlX2hhbmRsZSA9IG15X3Rlc3Rfb2JqLT5kZXZpY2U7CisgICAgZGV2aWNlX2hhbmRsZS0+b3BzLT5mbHVzaChteV90ZXN0X29iai0+ZGV2aWNlKTsKKyAgICBMT0dEKCIlcyBDbG9zaW5nIENhbWVyYSAlZCIsIF9fZnVuY19fLCBjYW1pZCk7CisgICAgaW9jdGwobVByZXZpZXdNZW1pbmZvLmlvbl9mZCwgSU9OX0lPQ19GUkVFLCAmbVByZXZpZXdNZW1pbmZvLmlvbl9oYW5kbGUpOworICAgIGNsb3NlKG1QcmV2aWV3TWVtaW5mby5pb25fZmQpOworICAgIG1QcmV2aWV3TWVtaW5mby5pb25fZmQgPSAtMTsKKyAgICBMT0dEKCIlcyBDbG9zaW5nIHRocmVhZCIsIF9fZnVuY19fKTsKKyAgICB0aHJlYWRfZXhpdCA9IDE7Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNQcmV2aWV3VGVzdDo6cHJldmlld0FsbG9jYXRlQnVmZmVycyhpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBudW0pCit7CisgICAgbVByZXZpZXdIYW5kbGVbbnVtXSA9IGFsbG9jYXRlQnVmZmVycyh3aWR0aCwgaGVpZ2h0LCAmbVByZXZpZXdNZW1pbmZvKTsKK30KKwordm9pZCBRQ2FtZXJhSEFMM1ByZXZpZXdUZXN0OjpzbmFwc2hvdEFsbG9jYXRlQnVmZmVycyhpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgbUNhcHR1cmVIYW5kbGUgPSBhbGxvY2F0ZUJ1ZmZlcnMod2lkdGgsIGhlaWdodCwgJm1DYXB0dXJlTWVtSW5mbyk7Cit9CisKK2Jvb2wgUUNhbWVyYUhBTDNQcmV2aWV3VGVzdDo6cHJldmlld1Byb2Nlc3NUaHJlYWRDcmVhdGUoCisgICAgICAgIGhhbDNfY2FtZXJhX2xpYl90ZXN0ICpoYW5kbGUpCit7CisgICAgaWYoaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRCgiQ2FtZXJhIEhhbmxlIGlzIE5VTEwiKTsKKyAgICB9CisgICAgcHJvY2Vzc1RocmVhZENyZWF0ZSh0aGlzLCBNRU5VX1NUQVJUX1BSRVZJRVcpOworICAgIHJldHVybiAxOworfQorCitpbnQgUUNhbWVyYUhBTDNQcmV2aWV3VGVzdDo6Z2V0X2lyX21vZGUoaW50IGlyX21vZGUpCit7CisgICAgc3RhdGljIGludCBwcmV2X2lybW9kZTsKKyAgICBpZihpcl9tb2RlID09IHByZXZfaXJtb2RlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgcHJldl9pcm1vZGUgPSBpcl9tb2RlOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKK2ludCBRQ2FtZXJhSEFMM1ByZXZpZXdUZXN0OjpnZXRfc3ZoZHJfbW9kZShpbnQgaGRyX21vZGUpCit7CisgICAgc3RhdGljIGludCBwcmV2X2hkcm1vZGU7CisgICAgaWYoaGRyX21vZGUgPT0gcHJldl9oZHJtb2RlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBlbHNlIHsKKyAgICAgICAgcHJldl9oZHJtb2RlID0gaGRyX21vZGU7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworUUNhbWVyYUhBTDNQcmV2aWV3VGVzdDo6flFDYW1lcmFIQUwzUHJldmlld1Rlc3QoKQoreworCit9CisKK30KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL3Rlc3QvUUNhbWVyYUhBTDNQcmV2aWV3VGVzdC5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM1ByZXZpZXdUZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliZTI4MQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL3Rlc3QvUUNhbWVyYUhBTDNQcmV2aWV3VGVzdC5oCkBAIC0wLDAgKzEsODIgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisjaWZuZGVmIF9fSEFMM0FQUFBSRVZJRVdURVNUX0hfXworI2RlZmluZSBfX0hBTDNBUFBQUkVWSUVXVEVTVF9IX18KKworI2luY2x1ZGUgIlFDYW1lcmFIQUwzQmFzZS5oIgorI2luY2x1ZGUgIlFDYW1lcmFIQUwzVGVzdC5oIgorCituYW1lc3BhY2UgcWNhbWVyYSB7CisKK2NsYXNzIFFDYW1lcmFIQUwzUHJldmlld1Rlc3QgOiBwdWJsaWMgUUNhbWVyYUhBTDNUZXN0Cit7Citwcml2YXRlOgorICAgIGhhbDNfY2FtdGVzdF9tZW1pbmZvX3QgbVByZXZpZXdNZW1pbmZvOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqKm1QcmV2aWV3SGFuZGxlOworICAgIGhhbDNfY2FtdGVzdF9tZW1pbmZvX3QgbUNhcHR1cmVNZW1JbmZvOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqbUNhcHR1cmVIYW5kbGU7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKm1NZXRhRGF0YVB0clszXTsKKyAgICBjYW1lcmEzX3N0cmVhbV90ICptUHJldmlld1N0cmVhbTsKKyAgICBjYW1lcmEzX3N0cmVhbV90ICptU25hcHNob3RTdHJlYW07CisgICAgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3QgbVJlcXVlc3Q7CisgICAgYW5kcm9pZDo6Q2FtZXJhTWV0YWRhdGEgaGFsM2FwcF9wcmV2aWV3X3NldHRpbmdzOworICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IG1QcmV2aWV3U3RyZWFtQnVmZnM7CisgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgbVNuYXBzaG90U3RyZWFtQnVmZnM7CisgICAgY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbiBtUHJldmlld0NvbmZpZzsKK3B1YmxpYzoKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgbm9idWZmZXI7CisgICAgaW50IG1QaXBlbGluZURlcHRoUHJldmlldzsKKyAgICBib29sIGlyX21vZGU7CisgICAgYm9vbCBzdmhkcl9tb2RlOworICAgIFFDYW1lcmFIQUwzUHJldmlld1Rlc3QoaW50IGNhbWVyYUluZGV4KTsKKyAgICB2b2lkIGNvbmZpZ3VyZVByZXZpZXdTdHJlYW0oaGFsM19jYW1lcmFfdGVzdF9vYmpfdCAqbXlfdGVzdF9vYmosIGludCBjYW1pZCwKKyAgICAgICAgICAgIGludCB3LCBpbnQgaCk7CisKKyAgICB2b2lkIHNuYXBzaG90Q2FwdHVyZVJlcXVlc3QoaGFsM19jYW1lcmFfbGliX3Rlc3QgKmhhbmRsZSwKKyAgICAgICAgICAgIGludCB0ZXN0Y2FzZSwgaW50IGNhbWlkLCBpbnQgdywgaW50IGgpOworICAgIHZvaWQgY29uc3RydWN0RGVmYXVsdFJlcXVlc3QoaGFsM19jYW1lcmFfdGVzdF9vYmpfdCAqLCBpbnQpOworICAgIHZvaWQgaW5pdFRlc3QoaGFsM19jYW1lcmFfbGliX3Rlc3QgKmhhbmRsZSwKKyAgICAgICAgICAgIGludCB0ZXN0Y2FzZSwgaW50IGNhbWlkLCBpbnQgdywgaW50IGgpOworCisgICAgdm9pZCBjYXB0dXJlUmVxdWVzdFJlcGVhdChoYWwzX2NhbWVyYV9saWJfdGVzdCAqLCBpbnQsIGludCk7CisgICAgdm9pZCBwcmV2aWV3QWxsb2NhdGVCdWZmZXJzKGludCwKKyAgICAgICAgICAgIGludCwgaW50KTsKKyAgICBib29sIHByZXZpZXdQcm9jZXNzVGhyZWFkQ3JlYXRlKGhhbDNfY2FtZXJhX2xpYl90ZXN0ICopOworICAgIHZvaWQgcHJldmlld1Rlc3RFbmQoaGFsM19jYW1lcmFfbGliX3Rlc3QgKm15X2hhbDN0ZXN0X29iaiwgaW50IGNhbWlkKTsKKyAgICB2b2lkIHNuYXBzaG90QWxsb2NhdGVCdWZmZXJzKGludCwgaW50ICk7CisgICAgdmlydHVhbCB+UUNhbWVyYUhBTDNQcmV2aWV3VGVzdCgpOworICAgIGludCBnZXRfaXJfbW9kZShpbnQgaXJfbW9kZSk7CisgICAgaW50IGdldF9zdmhkcl9tb2RlKGludCBoZHJfbW9kZSk7Cit9OworCisgICAgdm9pZCAqIGhhbDNhcHBQcmV2aWV3UHJvY2Vzc0J1ZmZlcnModm9pZCAqKTsKK30KKyNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL3Rlc3QvUUNhbWVyYUhBTDNSYXdTbmFwc2hvdFRlc3QuY3BwIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM1Jhd1NuYXBzaG90VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE2MzRhNQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL3Rlc3QvUUNhbWVyYUhBTDNSYXdTbmFwc2hvdFRlc3QuY3BwCkBAIC0wLDAgKzEsMjY1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorKiBtZXQ6CisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisjaW5jbHVkZSAiUUNhbWVyYUhBTDNSYXdTbmFwc2hvdFRlc3QuaCIKKyNpbmNsdWRlICJRQ2FtZXJhSEFMM01haW5UZXN0Q29udGV4dC5oIgorCituYW1lc3BhY2UgcWNhbWVyYSB7CitoYWwzX2NhbWVyYV9saWJfdGVzdCAqUmF3U25hcHNob3RfQ2FtT2JqX2hhbmRsZTsKK2V4dGVybiBpbnQgZmNvdW50X2NhcHR1cmVkOworZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCBUZXN0QXBwTG9jazsKKworUUNhbWVyYUhBTDNSYXdTbmFwc2hvdFRlc3Q6OlFDYW1lcmFIQUwzUmF3U25hcHNob3RUZXN0KGludCByZXFfY2FwKSA6CisgICAgUUNhbWVyYUhBTDNUZXN0KDApLAorICAgIG1SYXdDYXB0dXJlSGFuZGxlKE5VTEwpLAorICAgIG1SYXdTbmFwc2hvdFN0cmVhbShOVUxMKSwKKyAgICBtUmVxdWVzdGVkQ2FwdHVyZShyZXFfY2FwKQoreworCit9CisKK3ZvaWQgUUNhbWVyYUhBTDNSYXdTbmFwc2hvdFRlc3Q6OmluaXRUZXN0KGhhbDNfY2FtZXJhX2xpYl90ZXN0ICpoYW5kbGUsCisgICAgICAgIGludCB0ZXN0Y2FzZSwgaW50IGNhbWlkLCBpbnQgdywgaW50IGgpCit7CisgICAgUmF3U25hcHNob3RfQ2FtT2JqX2hhbmRsZSA9IGhhbmRsZTsKKyAgICBMT0dEKCJcbiBSYXcgYnVmZmVyIHRocmVhZCBjcmVhdGVkIGZvciB0ZXN0Y2FzZSA6ICVkIiwgdGVzdGNhc2UpOworICAgIGNvbmZpZ3VyZVJhd1NuYXBzaG90U3RyZWFtKCYoaGFuZGxlLT50ZXN0X29iaiksIGNhbWlkLCB3LCBoKTsKKyAgICBjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdCgmKGhhbmRsZS0+dGVzdF9vYmopLCAwKTsKKyAgICBMT0dEKCJcbiBSYXcgU25hcHNob3QgRGVmYXVsdCBzdHJlYW0gc2V0dGluZyByZWFkIik7CisgICAgcmF3UHJvY2Vzc1RocmVhZENyZWF0ZShNRU5VX1NUQVJUX1JBV19DQVBUVVJFLAorICAgICAgICAgICAgcmF3UHJvY2Vzc0J1ZmZlcnMpOworICAgIG1SZXF1ZXN0LmZyYW1lX251bWJlciA9IDA7CisgICAgTE9HRCgiXG5SYXcgIFNuYXBzaG90IHN0cmVhbSBjb25maWd1cmVkIik7CisgICAgcmF3UHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KCYoaGFuZGxlLT50ZXN0X29iaiksIDApOworICAgIExPR0QoIlxuUmF3ICBTbmFwc2hvdCBQcm9jZXNzIENhcHR1cmUgUmVxdWVzdCBTZW50Iik7Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNSYXdTbmFwc2hvdFRlc3Q6OmNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0KAorICAgICAgICBoYWwzX2NhbWVyYV90ZXN0X29ial90ICpteV90ZXN0X29iaiwgaW50IGNhbWlkKQoreworICAgIGNhbWVyYTNfZGV2aWNlX3QgKmRldmljZV9oYW5kbGUgPSBteV90ZXN0X29iai0+ZGV2aWNlOworICAgIExPR0QoIkNhbWVyYSBJRCA6ICVkIixjYW1pZCk7CisgICAgbU1ldGFEYXRhUHRyWzBdID0gZGV2aWNlX2hhbmRsZS0+b3BzLT5jb25zdHJ1Y3RfZGVmYXVsdF9yZXF1ZXN0X3NldHRpbmdzKAorICAgICAgICAgICAgbXlfdGVzdF9vYmotPmRldmljZSwgQ0FNRVJBM19URU1QTEFURV9QUkVWSUVXKTsKKyAgICBtTWV0YURhdGFQdHJbMV0gPSBkZXZpY2VfaGFuZGxlLT5vcHMtPmNvbnN0cnVjdF9kZWZhdWx0X3JlcXVlc3Rfc2V0dGluZ3MoCisgICAgICAgICAgICBteV90ZXN0X29iai0+ZGV2aWNlLCBDQU1FUkEzX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkUpOworfQorCit2b2lkIFFDYW1lcmFIQUwzUmF3U25hcHNob3RUZXN0Ojpjb25maWd1cmVSYXdTbmFwc2hvdFN0cmVhbShoYWwzX2NhbWVyYV90ZXN0X29ial90ICpteV90ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW1pZCwgaW50IHcsIGludCBoKQoreworICAgIGNhbWVyYTNfZGV2aWNlX3QgKmRldmljZV9oYW5kbGUgPSBteV90ZXN0X29iai0+ZGV2aWNlOworICAgIExPR0QoIiBjb25maWd1cmVTbmFwc2hvdFN0cmVhbSB0ZXN0Y2FzZSBkaW0gOiVkICBYICVkIiwgdywgaCk7CisgICAgbVByZXZpZXdTdHJlYW0gPSBuZXcgY2FtZXJhM19zdHJlYW1fdDsKKyAgICBtUmF3U25hcHNob3RTdHJlYW0gPSBuZXcgY2FtZXJhM19zdHJlYW1fdDsKKworICAgIG1lbXNldChtUHJldmlld1N0cmVhbSwgMCwgc2l6ZW9mKGNhbWVyYTNfc3RyZWFtX3QpKTsKKyAgICBtZW1zZXQobVJhd1NuYXBzaG90U3RyZWFtLCAwLCBzaXplb2YoY2FtZXJhM19zdHJlYW1fdCkpOworCisgICAgbVByZXZpZXdTdHJlYW0gPSBpbml0U3RyZWFtKENBTUVSQTNfU1RSRUFNX09VVFBVVCwgY2FtaWQsIFBSRVZJRVdfV0lEVEgsIFBSRVZJRVdfSEVJR0hULCAwLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELCBIQUwzX0RBVEFTUEFDRV9VTktOT1dOKTsKKyAgICBtUmF3U25hcHNob3RTdHJlYW0gPSBpbml0U3RyZWFtKENBTUVSQTNfU1RSRUFNX09VVFBVVCwgY2FtaWQsIFJBV1NOQVBTSE9UX0NBUFRVUkVfV0lEVEgsCisgICAgICAgICAgICBSQVdTTkFQU0hPVF9DQVBUVVJFX0hFSUdIVCwgMCwgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxNiwgSEFMM19EQVRBU1BBQ0VfQVJCSVRSQVJZKTsKKyAgICBtUmF3U25hcHNob3RDb25maWcgPSBjb25maWd1cmVTdHJlYW0oQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERSwgMik7CisKKyAgICBtUmF3U25hcHNob3RDb25maWcuc3RyZWFtc1swXSA9IG1QcmV2aWV3U3RyZWFtOworICAgIG1SYXdTbmFwc2hvdENvbmZpZy5zdHJlYW1zWzFdID0gbVJhd1NuYXBzaG90U3RyZWFtOworICAgIGRldmljZV9oYW5kbGUtPm9wcy0+Y29uZmlndXJlX3N0cmVhbXMobXlfdGVzdF9vYmotPmRldmljZSwgJihtUmF3U25hcHNob3RDb25maWcpKTsKK30KKworCit2b2lkIFFDYW1lcmFIQUwzUmF3U25hcHNob3RUZXN0OjpyYXdQcm9jZXNzQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgIGhhbDNfY2FtZXJhX3Rlc3Rfb2JqX3QgKm15X3Rlc3Rfb2JqLCBpbnQgY2FtaWQpCit7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgICBjYW1lcmEzX2RldmljZV90ICpkZXZpY2VfaGFuZGxlID0gbXlfdGVzdF9vYmotPmRldmljZTsKKyAgICB3aWR0aCA9IG1SYXdTbmFwc2hvdFN0cmVhbS0+d2lkdGg7CisgICAgaGVpZ2h0ID0gbVJhd1NuYXBzaG90U3RyZWFtLT5oZWlnaHQ7CisgICAgcmF3QWxsb2NhdGVCdWZmZXJzKHdpZHRoLCBoZWlnaHQpOworICAgIG1SZXF1ZXN0LmZyYW1lX251bWJlciA9IDA7CisgICAgbVJlcXVlc3Quc2V0dGluZ3MgPSBtTWV0YURhdGFQdHJbMV07CisgICAgbVJlcXVlc3QuaW5wdXRfYnVmZmVyID0gTlVMTDsKKyAgICBtUmVxdWVzdC5udW1fb3V0cHV0X2J1ZmZlcnMgPSAxOworICAgIG1SYXdTbmFwc2hvdFN0cmVhbUJ1ZmZzLnN0cmVhbSA9IG1SYXdTbmFwc2hvdFN0cmVhbTsKKyAgICBtUmF3U25hcHNob3RTdHJlYW1CdWZmcy5zdGF0dXMgPSAwOworICAgIG1SYXdTbmFwc2hvdFN0cmVhbUJ1ZmZzLmJ1ZmZlciA9IChjb25zdCBuYXRpdmVfaGFuZGxlX3QqKikmbVJhd0NhcHR1cmVIYW5kbGU7CisgICAgbVJhd1NuYXBzaG90U3RyZWFtQnVmZnMucmVsZWFzZV9mZW5jZSA9IC0xOworICAgIG1SYXdTbmFwc2hvdFN0cmVhbUJ1ZmZzLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICBtUmVxdWVzdC5vdXRwdXRfYnVmZmVycyA9ICYobVJhd1NuYXBzaG90U3RyZWFtQnVmZnMpOworICAgIExPR0QoIkNhbGxpbmcgSEFMM0FQUCBjYXB0dXJlIHJlcXVlc3QgZm9yIGNhbWlkIDogJWQiLCBjYW1pZCk7CisgICAgZGV2aWNlX2hhbmRsZS0+b3BzLT5wcm9jZXNzX2NhcHR1cmVfcmVxdWVzdChteV90ZXN0X29iai0+ZGV2aWNlLCAmKG1SZXF1ZXN0KSk7Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNSYXdTbmFwc2hvdFRlc3Q6OnJhd1Byb2Nlc3NDYXB0dXJlUmVxdWVzdFJlcGVhdCgKKyAgICAgICAgaGFsM19jYW1lcmFfbGliX3Rlc3QgKm15X2hhbDN0ZXN0X29iaiwgaW50IGNhbWlkKQoreworICAgIGhhbDNfY2FtZXJhX3Rlc3Rfb2JqX3QgKm15X3Rlc3Rfb2JqID0gJihteV9oYWwzdGVzdF9vYmotPnRlc3Rfb2JqKTsKKyAgICBMT0dEKCJcblJhdyBSZXF1ZXN0ZWQgQ2FwdHVyZSA6ICVkIGFuZCBSZWNlaXZlZCBDYXB0dXJlIDogJWQiLAorICAgICAgICAgICAgbVJlcXVlc3RlZENhcHR1cmUsIGZjb3VudF9jYXB0dXJlZCk7CisgICAgaWYgKG1SZXF1ZXN0ZWRDYXB0dXJlID09IGZjb3VudF9jYXB0dXJlZCkgeworICAgICAgICBMT0dEKCJcbiBSYXcgU25hcHNob3QgaXMgcnVubmluZyBzdWNjZXNzZnVsbHkgRW5kaW5nIHRlc3QiKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIExPR0QoIlxuIENhcHR1cmUgRG9uZSAsIFJlY2lldmVkIEZyYW1lIDogJWQiLCBmY291bnRfY2FwdHVyZWQpOworICAgICAgICByYXdUZXN0RW5kKG15X2hhbDN0ZXN0X29iaiwgY2FtaWQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgY2FtZXJhM19kZXZpY2VfdCAqZGV2aWNlX2hhbmRsZSA9IG15X3Rlc3Rfb2JqLT5kZXZpY2U7CisgICAgICAgIChtUmVxdWVzdC5mcmFtZV9udW1iZXIpKys7CisgICAgICAgIG1SZXF1ZXN0LnNldHRpbmdzID0gbU1ldGFEYXRhUHRyWzFdOworICAgICAgICBtUmVxdWVzdC5pbnB1dF9idWZmZXIgPSBOVUxMOworICAgICAgICBtUmVxdWVzdC5udW1fb3V0cHV0X2J1ZmZlcnMgPSAxOworICAgICAgICBtUmF3U25hcHNob3RTdHJlYW1CdWZmcy5zdHJlYW0gPSBtUmF3U25hcHNob3RTdHJlYW07CisgICAgICAgIG1SYXdTbmFwc2hvdFN0cmVhbUJ1ZmZzLmJ1ZmZlciA9IChjb25zdCBuYXRpdmVfaGFuZGxlX3QqKikmbVJhd0NhcHR1cmVIYW5kbGU7CisgICAgICAgIG1SYXdTbmFwc2hvdFN0cmVhbUJ1ZmZzLnJlbGVhc2VfZmVuY2UgPSAtMTsKKyAgICAgICAgbVJhd1NuYXBzaG90U3RyZWFtQnVmZnMuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICBtUmVxdWVzdC5vdXRwdXRfYnVmZmVycyA9ICYobVJhd1NuYXBzaG90U3RyZWFtQnVmZnMpOworICAgICAgICBMT0dEKCJDYWxsaW5nIEhBTDNBUFAgcmVwZWF0IGNhcHR1cmUgcmVxdWVzdCByZXBlYXQgIik7CisgICAgICAgIGRldmljZV9oYW5kbGUtPm9wcy0+cHJvY2Vzc19jYXB0dXJlX3JlcXVlc3QobXlfdGVzdF9vYmotPmRldmljZSwgJihtUmVxdWVzdCkpOworICAgIH0KK30KKwordm9pZCBRQ2FtZXJhSEFMM1Jhd1NuYXBzaG90VGVzdDo6cmF3VGVzdEVuZCgKKyAgICAgICAgaGFsM19jYW1lcmFfbGliX3Rlc3QgKm15X2hhbDN0ZXN0X29iaiwgaW50IGNhbWlkKQoreworICAgIGJ1ZmZlcl90aHJlYWRfbXNnX3QgbXNnOworICAgIGV4dGVybiBwdGhyZWFkX211dGV4X3QgZ0NhbUxvY2s7CisgICAgaGFsM19jYW1lcmFfdGVzdF9vYmpfdCAqbXlfdGVzdF9vYmogPSAmKG15X2hhbDN0ZXN0X29iai0+dGVzdF9vYmopOworICAgIGNhbWVyYTNfZGV2aWNlX3QgKmRldmljZV9oYW5kbGUgPSBteV90ZXN0X29iai0+ZGV2aWNlOworICAgIGRldmljZV9oYW5kbGUtPm9wcy0+Zmx1c2gobXlfdGVzdF9vYmotPmRldmljZSk7CisgICAgTE9HRCgiJXMgQ2xvc2luZyBDYW1lcmEgJWQiLCBfX2Z1bmNfXywgY2FtaWQpOworICAgIC8qIEZyZWUgdGhlIEFsbG9jYXRlZCBJT04gTWVtb3J5ICovCisgICAgaW9jdGwobVJhd0NhcHR1cmVNZW1JbmZvLmlvbl9mZCwgSU9OX0lPQ19GUkVFLCAmbVJhd0NhcHR1cmVNZW1JbmZvLmlvbl9oYW5kbGUpOworICAgIGNsb3NlKG1SYXdDYXB0dXJlTWVtSW5mby5pb25fZmQpOworICAgIG1SYXdDYXB0dXJlTWVtSW5mby5pb25fZmQgPSAtMTsKKyAgICAvKiBDbG9zZSB0aGUgVGhyZWFkICovCisgICAgbWVtc2V0KCZtc2csIDAsIHNpemVvZihidWZmZXJfdGhyZWFkX21zZ190KSk7CisgICAgbXNnLnN0b3BfdGhyZWFkID0gMTsKKyAgICB3cml0ZShwZmRbMV0sICZtc2csIHNpemVvZihidWZmZXJfdGhyZWFkX21zZ190KSk7Cit9CisKKwordm9pZCBRQ2FtZXJhSEFMM1Jhd1NuYXBzaG90VGVzdDo6cmF3QWxsb2NhdGVCdWZmZXJzKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBtUmF3Q2FwdHVyZUhhbmRsZSA9IGFsbG9jYXRlQnVmZmVycyh3aWR0aCwgaGVpZ2h0LCAmbVJhd0NhcHR1cmVNZW1JbmZvKTsKK30KKworYm9vbCBRQ2FtZXJhSEFMM1Jhd1NuYXBzaG90VGVzdDo6cmF3UHJvY2Vzc1RocmVhZENyZWF0ZShpbnQgdGVzdGNhc2VfaWQsCisgICAgICAgIHZvaWQgKigqaGFsM190aHJlYWRfb3BzKSh2b2lkICopKQoreworICAgIGludDMyX3QgcmV0ID0gMDsKKyAgICBidWZmZXJfdGhyZWFkX3QgdGhyZWFkOworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgaWYgKHBpcGUocGZkKSA8IDApIHsKKyAgICAgICAgTE9HRSgiJXM6VGVzdDolZCBFcnJvciBpbiBjcmVhdGluZyB0aGUgcGlwZSIsIF9fZnVuY19fLCB0ZXN0Y2FzZV9pZCk7CisgICAgfQorICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0RFVEFDSEVEKTsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJnRocmVhZC5tdXRleCwgTlVMTCk7CisgICAgcHRocmVhZF9jb25kX2luaXQoJnRocmVhZC5jb25kLCBOVUxMKTsKKyAgICB0aHJlYWQuaXNfdGhyZWFkX3N0YXJ0ZWQgPSAwOworICAgIHRocmVhZC5yZWFkZmQgPSBwZmRbMF07CisgICAgdGhyZWFkLndyaXRlZmQgPSBwZmRbMV07CisgICAgdGhyZWFkLmRhdGFfb2JqID0gdGhpczsKKyAgICByZXQgPSBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLnRkLCAmYXR0ciwgaGFsM190aHJlYWRfb3BzLCAmdGhyZWFkICk7CisgICAgcHRocmVhZF9zZXRuYW1lX25wKHRocmVhZC50ZCwgIlRlc3RBcHBfVGhyZWFkIik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBzdGF0dXMgdGhyZWFkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZC5tdXRleCk7CisgICAgd2hpbGUodGhyZWFkLmlzX3RocmVhZF9zdGFydGVkID09IDApIHsKKyAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJnRocmVhZC5jb25kLCAmdGhyZWFkLm11dGV4KTsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnRocmVhZC5tdXRleCk7CisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNSYXdTbmFwc2hvdFRlc3Q6OmNhcHR1cmVSZXF1ZXN0UmVwZWF0KAorICAgICAgICBoYWwzX2NhbWVyYV9saWJfdGVzdCAqbXlfaGFsM3Rlc3Rfb2JqLCBpbnQgY2FtaWQsIGludCB0ZXN0Y2FzZSkKK3sKKyAgICBpZihteV9oYWwzdGVzdF9vYmogPT0gTlVMTCkgeworICAgICAgICBMT0dEKCJjYW1pZCA6JWQgYW5kIHRlc3RjYXNlIDogJWQgaGFuZGxlIGlzIE5VTEwiLCBjYW1pZCwgdGVzdGNhc2UpOworICAgIH0KK30KKwordm9pZCAqIHJhd1Byb2Nlc3NCdWZmZXJzKHZvaWQgKmRhdGEpIHsKKyAgICBidWZmZXJfdGhyZWFkX3QgKnRocmVhZCA9IChidWZmZXJfdGhyZWFkX3QqKWRhdGE7CisgICAgaW50MzJfdCByZWFkZmQsIHdyaXRlZmQ7CisgICAgaGFsM19jYW1lcmFfbGliX3Rlc3QgKmhhbDNfdGVzdF9oYW5kbGU7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZ0aHJlYWQtPm11dGV4KTsKKyAgICB0aHJlYWQtPmlzX3RocmVhZF9zdGFydGVkID0gMTsKKyAgICByZWFkZmQgPSB0aHJlYWQtPnJlYWRmZDsKKyAgICB3cml0ZWZkID0gdGhyZWFkLT53cml0ZWZkOworICAgIFFDYW1lcmFIQUwzUmF3U25hcHNob3RUZXN0ICpvYmo7CisgICAgb2JqID0gKFFDYW1lcmFIQUwzUmF3U25hcHNob3RUZXN0ICopdGhyZWFkLT5kYXRhX29iajsKKyAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0aHJlYWQtPmNvbmQpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aHJlYWQtPm11dGV4KTsKKyAgICBzdHJ1Y3QgcG9sbGZkIHBvbGxmZHM7CisgICAgaW50MzJfdCBudW1fb2ZfZmRzID0gMTsKKyAgICBib29sIHJ0aHJlYWRfZXhpdCA9IDA7CisgICAgaW50MzJfdCByZWFkeSA9IDA7CisgICAgcG9sbGZkcy5mZCA9IHJlYWRmZDsKKyAgICBwb2xsZmRzLmV2ZW50cyA9IFBPTExJTiB8IFBPTExQUkk7CisgICAgd2hpbGUoIXJ0aHJlYWRfZXhpdCkgeworICAgICAgICByZWFkeSA9IHBvbGwoJnBvbGxmZHMsIChuZmRzX3QpbnVtX29mX2ZkcywgLTEpOworICAgICAgICBpZiAocmVhZHkgPiAwKSB7CisgICAgICAgICAgICBpZiAocG9sbGZkcy5yZXZlbnRzICYgKFBPTExJTiB8IFBPTExQUkkpKSB7CisgICAgICAgICAgICAgICAgc3NpemVfdCBucmVhZCA9IDA7CisgICAgICAgICAgICAgICAgYnVmZmVyX3RocmVhZF9tc2dfdCBtc2c7CisgICAgICAgICAgICAgICAgbnJlYWQgPSByZWFkKHBvbGxmZHMuZmQsICZtc2csIHNpemVvZihidWZmZXJfdGhyZWFkX21zZ190KSk7CisgICAgICAgICAgICAgICAgaWYgKG5yZWFkIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJVbmFibGUgdG8gcmVhZCB0aGUgbWVzc2FnZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobXNnLnN0b3BfdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoYWwzX3Rlc3RfaGFuZGxlID0gUmF3U25hcHNob3RfQ2FtT2JqX2hhbmRsZTsKKyAgICAgICAgICAgICAgICBvYmotPnJhd1Byb2Nlc3NDYXB0dXJlUmVxdWVzdFJlcGVhdChoYWwzX3Rlc3RfaGFuZGxlLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBwb2xsIGV4aXRpbmcgdGhlIHRocmVhZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HRCgiU2Vuc29yIHRocmVhZCBpcyBleGl0aW5nIik7CisgICAgY2xvc2UocmVhZGZkKTsKKyAgICBjbG9zZSh3cml0ZWZkKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmVGVzdEFwcExvY2spOworICAgIHB0aHJlYWRfZXhpdCgwKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworUUNhbWVyYUhBTDNSYXdTbmFwc2hvdFRlc3Q6On5RQ2FtZXJhSEFMM1Jhd1NuYXBzaG90VGVzdCgpCit7CisKK30KKworfQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM1Jhd1NuYXBzaG90VGVzdC5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM1Jhd1NuYXBzaG90VGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MmQwNGEKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzUmF3U25hcHNob3RUZXN0LmgKQEAgLTAsMCArMSw2OSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyogbWV0OgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKi8KKworI2lmbmRlZiBfX0hBTDNBUFBSQVdTTkFQU0hPVF9IX18KKyNkZWZpbmUgX19IQUwzQVBQUkFXU05BUFNIT1RfSF9fCisKKyNpbmNsdWRlICJRQ2FtZXJhSEFMM1NuYXBzaG90VGVzdC5oIgorCituYW1lc3BhY2UgcWNhbWVyYQoreworY2xhc3MgUUNhbWVyYUhBTDNSYXdTbmFwc2hvdFRlc3QgOiBwdWJsaWMgUUNhbWVyYUhBTDNUZXN0Cit7Citwcml2YXRlOgorICAgIGhhbDNfY2FtdGVzdF9tZW1pbmZvX3QgbVJhd0NhcHR1cmVNZW1JbmZvOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqbVJhd0NhcHR1cmVIYW5kbGU7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKm1NZXRhRGF0YVB0clszXTsKKyAgICBjYW1lcmEzX3N0cmVhbV90ICptUHJldmlld1N0cmVhbTsKKyAgICBjYW1lcmEzX3N0cmVhbV90ICptUmF3U25hcHNob3RTdHJlYW07CisgICAgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3QgbVJlcXVlc3Q7CisgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgbVJhd1NuYXBzaG90U3RyZWFtQnVmZnM7CisgICAgY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbiBtUmF3U25hcHNob3RDb25maWc7CitwdWJsaWM6CisgICAgaW50IG1SZXF1ZXN0ZWRDYXB0dXJlOworICAgIFFDYW1lcmFIQUwzUmF3U25hcHNob3RUZXN0KGludCByZXFfY2FwKTsKKyAgICB2b2lkIGNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0KGhhbDNfY2FtZXJhX3Rlc3Rfb2JqX3QgKm15X3Rlc3Rfb2JqLAorICAgICAgICAgICAgaW50IGNhbWlkKTsKKyAgICB2b2lkIGNvbmZpZ3VyZVJhd1NuYXBzaG90U3RyZWFtKGhhbDNfY2FtZXJhX3Rlc3Rfb2JqX3QgKm15X3Rlc3Rfb2JqLAorICAgICAgICAgICAgaW50IGNhbWlkLCBpbnQsIGludCApOworICAgIHZvaWQgcmF3UHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KGhhbDNfY2FtZXJhX3Rlc3Rfb2JqX3QgKm15X3Rlc3Rfb2JqLAorICAgICAgICAgICAgaW50IGNhbWlkKTsKKyAgICB2b2lkIHJhd1Byb2Nlc3NDYXB0dXJlUmVxdWVzdFJlcGVhdChoYWwzX2NhbWVyYV9saWJfdGVzdCAqbXlfaGFsM3Rlc3Rfb2JqLAorICAgICAgICAgICAgaW50IGNhbWlkKTsKKyAgICB2b2lkIGluaXRUZXN0KGhhbDNfY2FtZXJhX2xpYl90ZXN0ICpoYW5kbGUsIGludCB0ZXN0Y2FzZSwgaW50LCBpbnQsIGludCk7CisgICAgYm9vbCByYXdQcm9jZXNzVGhyZWFkQ3JlYXRlKGludCB0ZXN0Y2FzZV9pZCwKKyAgICAgICAgICAgIHZvaWQgKigqaGFsM190aHJlYWRfb3BzKSh2b2lkICopKTsKKyAgICB2b2lkIHJhd0FsbG9jYXRlQnVmZmVycyhpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOworICAgIHZvaWQgcmF3VGVzdEVuZChoYWwzX2NhbWVyYV9saWJfdGVzdCAqbXlfaGFsM3Rlc3Rfb2JqLCBpbnQgY2FtaWQpOworICAgIHZvaWQgY2FwdHVyZVJlcXVlc3RSZXBlYXQoaGFsM19jYW1lcmFfbGliX3Rlc3QgKm15X2hhbDN0ZXN0X29iaiwgaW50IGNhbWlkLCBpbnQgdGVzdGNhc2UpOworICAgIHZpcnR1YWwgflFDYW1lcmFIQUwzUmF3U25hcHNob3RUZXN0KCk7Cit9OworICAgIHZvaWQgKiByYXdQcm9jZXNzQnVmZmVycyh2b2lkICpkYXRhKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM1NuYXBzaG90VGVzdC5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzU25hcHNob3RUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmFmMGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM1NuYXBzaG90VGVzdC5jcHAKQEAgLTAsMCArMSwyNjQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisjaW5jbHVkZSAiUUNhbWVyYUhBTDNTbmFwc2hvdFRlc3QuaCIKKyNpbmNsdWRlICJRQ2FtZXJhSEFMM01haW5UZXN0Q29udGV4dC5oIgorCisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworaGFsM19jYW1lcmFfbGliX3Rlc3QgKlNuYXBzaG90X0NhbU9ial9oYW5kbGU7CitpbnQgZmNvdW50X2NhcHR1cmVkOworZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCBUZXN0QXBwTG9jazsKK1FDYW1lcmFIQUwzU25hcHNob3RUZXN0OjpRQ2FtZXJhSEFMM1NuYXBzaG90VGVzdChpbnQgcmVxX2NhcCkgOgorICAgIFFDYW1lcmFIQUwzVGVzdCgwKSwKKyAgICBtQ2FwdHVyZUhhbmRsZShOVUxMKSwKKyAgICBtU25hcHNob3RTdHJlYW0oTlVMTCksCisgICAgbVJlcXVlc3RlZENhcHR1cmUocmVxX2NhcCkKK3sKKworfQorCit2b2lkIFFDYW1lcmFIQUwzU25hcHNob3RUZXN0Ojppbml0VGVzdChoYWwzX2NhbWVyYV9saWJfdGVzdCAqaGFuZGxlLAorICAgICAgICBpbnQgdGVzdGNhc2UsIGludCBjYW1pZCwgaW50IHcsIGludCBoKQoreworICAgIGZjb3VudF9jYXB0dXJlZCA9IDA7CisgICAgU25hcHNob3RfQ2FtT2JqX2hhbmRsZSA9IGhhbmRsZTsKKyAgICBMT0dEKCJcbnRlc3RjYXNlICVkICAlZCBhbmQgJWQgIix0ZXN0Y2FzZSwgdywgaCk7CisgICAgY29uZmlndXJlU25hcHNob3RTdHJlYW0oJihoYW5kbGUtPnRlc3Rfb2JqKSwgY2FtaWQsIHcsIGgpOworCisgICAgY29uc3RydWN0RGVmYXVsdFJlcXVlc3QoJihoYW5kbGUtPnRlc3Rfb2JqKSwgMCk7CisgICAgTE9HRCgiXG4gU25hcHNob3QgRGVmYXVsdCBzdHJlYW0gc2V0dGluZyByZWFkIik7CisKKyAgICBMT0dEKCJcbiBTbmFwc2hvdCBzdHJlYW0gY29uZmlndXJlZCIpOworICAgIHNuYXBzaG90VGhyZWFkQ3JlYXRlKE1FTlVfU1RBUlRfQ0FQVFVSRSwgaGFsM2FwcFNuYXBzaG90UHJvY2Vzc0J1ZmZlcnMpOworICAgIChtUmVxdWVzdC5mcmFtZV9udW1iZXIpID0gMDsKKyAgICBzbmFwc2hvdFByb2Nlc3NDYXB0dXJlUmVxdWVzdCgmKGhhbmRsZS0+dGVzdF9vYmopLCAwKTsKKyAgICBMT0dEKCJcbiBTbmFwc2hvdCBQcm9jZXNzIENhcHR1cmUgUmVxdWVzdCBTZW50Iik7Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNTbmFwc2hvdFRlc3Q6OmNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0KAorICAgICAgICBoYWwzX2NhbWVyYV90ZXN0X29ial90ICpteV90ZXN0X29iaiwgaW50IGNhbWlkKQoreworICAgIGNhbWVyYTNfZGV2aWNlX3QgKmRldmljZV9oYW5kbGUgPSBteV90ZXN0X29iai0+ZGV2aWNlOworICAgIExPR0QoIkNhbWVyYSBJRCA6ICVkIixjYW1pZCk7CisgICAgbU1ldGFEYXRhUHRyWzBdPSBkZXZpY2VfaGFuZGxlLT5vcHMtPmNvbnN0cnVjdF9kZWZhdWx0X3JlcXVlc3Rfc2V0dGluZ3MobXlfdGVzdF9vYmotPmRldmljZSwKKyAgICAgICAgICAgIENBTUVSQTNfVEVNUExBVEVfUFJFVklFVyk7CisgICAgbU1ldGFEYXRhUHRyWzFdID0gZGV2aWNlX2hhbmRsZS0+b3BzLT5jb25zdHJ1Y3RfZGVmYXVsdF9yZXF1ZXN0X3NldHRpbmdzKG15X3Rlc3Rfb2JqLT5kZXZpY2UsCisgICAgICAgICAgICBDQU1FUkEzX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkUpOworfQorCit2b2lkIFFDYW1lcmFIQUwzU25hcHNob3RUZXN0Ojpjb25maWd1cmVTbmFwc2hvdFN0cmVhbShoYWwzX2NhbWVyYV90ZXN0X29ial90ICpteV90ZXN0X29iaiwKKyAgICAgICAgaW50IGNhbWlkLCBpbnQgdywgaW50IGgpCit7CisgICAgY2FtZXJhM19kZXZpY2VfdCAqZGV2aWNlX2hhbmRsZSA9IG15X3Rlc3Rfb2JqLT5kZXZpY2U7CisgICAgTE9HRCgiIGNvbmZpZ3VyZVNuYXBzaG90U3RyZWFtIHRlc3RjYXNlIGRpbSA6JWQgIFggJWQiLCB3LCBoKTsKKyAgICBtUHJldmlld1N0cmVhbSA9IG5ldyBjYW1lcmEzX3N0cmVhbV90OworICAgIG1TbmFwc2hvdFN0cmVhbSA9IG5ldyBjYW1lcmEzX3N0cmVhbV90OworCisgICAgbWVtc2V0KG1QcmV2aWV3U3RyZWFtLCAwLCBzaXplb2YoY2FtZXJhM19zdHJlYW1fdCkpOworICAgIG1lbXNldChtU25hcHNob3RTdHJlYW0sIDAsIHNpemVvZihjYW1lcmEzX3N0cmVhbV90KSk7CisgICAgbVByZXZpZXdTdHJlYW0gPSBpbml0U3RyZWFtKENBTUVSQTNfU1RSRUFNX09VVFBVVCwgY2FtaWQsIFBSRVZJRVdfV0lEVEgsIFBSRVZJRVdfSEVJR0hULCAwLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELCBIQUwzX0RBVEFTUEFDRV9VTktOT1dOKTsKKyAgICBtU25hcHNob3RTdHJlYW0gPSBpbml0U3RyZWFtKENBTUVSQTNfU1RSRUFNX09VVFBVVCwgY2FtaWQsIFNOQVBTSE9UX0NBUFRVUkVfV0lEVEgsCisgICAgICAgICAgICBTTkFQU0hPVF9DQVBUVVJFX0hFSUdIVCwgMCwgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBIQUwzX0RBVEFTUEFDRV9KRklGKTsKKworICAgIG1TbmFwc2hvdENvbmZpZyA9IGNvbmZpZ3VyZVN0cmVhbShDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX05PUk1BTF9NT0RFLCAyKTsKKyAgICBtU25hcHNob3RDb25maWcuc3RyZWFtc1swXSA9IG1QcmV2aWV3U3RyZWFtOworICAgIG1TbmFwc2hvdENvbmZpZy5zdHJlYW1zWzFdID0gbVNuYXBzaG90U3RyZWFtOworICAgIGRldmljZV9oYW5kbGUtPm9wcy0+Y29uZmlndXJlX3N0cmVhbXMobXlfdGVzdF9vYmotPmRldmljZSwgJihtU25hcHNob3RDb25maWcpKTsKK30KKwordm9pZCBRQ2FtZXJhSEFMM1NuYXBzaG90VGVzdDo6c25hcHNob3RQcm9jZXNzQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICAgICAgaGFsM19jYW1lcmFfdGVzdF9vYmpfdCAqbXlfdGVzdF9vYmosIGludCBjYW1pZCkKK3sKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBjYW1lcmEzX2RldmljZV90ICpkZXZpY2VfaGFuZGxlID0gbXlfdGVzdF9vYmotPmRldmljZTsKKyAgICB3aWR0aCA9IG1TbmFwc2hvdFN0cmVhbS0+d2lkdGg7CisgICAgaGVpZ2h0ID0gbVNuYXBzaG90U3RyZWFtLT5oZWlnaHQ7CisgICAgc25hcHNob3RBbGxvY2F0ZUJ1ZmZlcnMod2lkdGgsIGhlaWdodCk7CisgICAgbVJlcXVlc3Quc2V0dGluZ3MgPSBtTWV0YURhdGFQdHJbMV07CisgICAgbVJlcXVlc3QuaW5wdXRfYnVmZmVyID0gTlVMTDsKKyAgICBtUmVxdWVzdC5udW1fb3V0cHV0X2J1ZmZlcnMgPSAxOworICAgIG1TbmFwc2hvdFN0cmVhbUJ1ZmZzLnN0cmVhbSA9IG1TbmFwc2hvdFN0cmVhbTsKKyAgICBtU25hcHNob3RTdHJlYW1CdWZmcy5zdGF0dXMgPSAwOworICAgIG1TbmFwc2hvdFN0cmVhbUJ1ZmZzLmJ1ZmZlciA9IChjb25zdCBuYXRpdmVfaGFuZGxlX3QqKikmbUNhcHR1cmVIYW5kbGU7CisgICAgbVNuYXBzaG90U3RyZWFtQnVmZnMucmVsZWFzZV9mZW5jZSA9IC0xOworICAgIG1TbmFwc2hvdFN0cmVhbUJ1ZmZzLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICBtUmVxdWVzdC5vdXRwdXRfYnVmZmVycyA9ICYobVNuYXBzaG90U3RyZWFtQnVmZnMpOworICAgIExPR0QoIkNhbGxpbmcgSEFMM0FQUCBjYXB0dXJlIHJlcXVlc3QgZm9yIGNhbWlkIDogJWQiLCBjYW1pZCk7CisgICAgZGV2aWNlX2hhbmRsZS0+b3BzLT5wcm9jZXNzX2NhcHR1cmVfcmVxdWVzdChteV90ZXN0X29iai0+ZGV2aWNlLCAmKG1SZXF1ZXN0KSk7CisgICAgKG1SZXF1ZXN0LmZyYW1lX251bWJlcikrKzsKK30KKwordm9pZCBRQ2FtZXJhSEFMM1NuYXBzaG90VGVzdDo6c25hcHNob3RQcm9jZXNzQ2FwdHVyZVJlcXVlc3RSZXBlYXQoCisgICAgICAgICAgICAgICAgICAgIGhhbDNfY2FtZXJhX2xpYl90ZXN0ICpteV9oYWwzdGVzdF9vYmosIGludCBjYW1pZCkKK3sKKyAgICBoYWwzX2NhbWVyYV90ZXN0X29ial90ICpteV90ZXN0X29iaiA9ICYobXlfaGFsM3Rlc3Rfb2JqLT50ZXN0X29iaik7CisgICAgTE9HRCgiXG5TbmFwc2hvdCBSZXF1ZXN0ZWQgQ2FwdHVyZSA6ICVkIGFuZCBSZWNlaXZlZCBDYXB0dXJlIDogJWQiLAorICAgICAgICAgICAgbVJlcXVlc3RlZENhcHR1cmUsIGZjb3VudF9jYXB0dXJlZCk7CisgICAgaWYgKG1SZXF1ZXN0ZWRDYXB0dXJlID09IGZjb3VudF9jYXB0dXJlZCkgeworICAgICAgICBMT0dEKCJcbiBTbmFwc2hvdCBpcyBydW5uaW5nIHN1Y2Nlc3NmdWxseSBFbmRpbmcgdGVzdCIpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICAgICAgTE9HRCgiXG4gQ2FwdHVyZSBEb25lICwgUmVjaWV2ZWQgRnJhbWUgOiAlZCIsIGZjb3VudF9jYXB0dXJlZCk7CisgICAgICAgIHNuYXBzaG90VGVzdEVuZChteV9oYWwzdGVzdF9vYmosIGNhbWlkKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNhbWVyYTNfZGV2aWNlX3QgKmRldmljZV9oYW5kbGUgPSBteV90ZXN0X29iai0+ZGV2aWNlOworICAgICAgICBtUmVxdWVzdC5zZXR0aW5ncyA9IG1NZXRhRGF0YVB0clsxXTsKKyAgICAgICAgbVJlcXVlc3QuaW5wdXRfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgbVJlcXVlc3QubnVtX291dHB1dF9idWZmZXJzID0gMTsKKyAgICAgICAgbVNuYXBzaG90U3RyZWFtQnVmZnMuc3RyZWFtID0gbVNuYXBzaG90U3RyZWFtOworICAgICAgICBtU25hcHNob3RTdHJlYW1CdWZmcy5idWZmZXIgPSAoY29uc3QgbmF0aXZlX2hhbmRsZV90KiopJm1DYXB0dXJlSGFuZGxlOworICAgICAgICBtU25hcHNob3RTdHJlYW1CdWZmcy5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgIG1TbmFwc2hvdFN0cmVhbUJ1ZmZzLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgbVJlcXVlc3Qub3V0cHV0X2J1ZmZlcnMgPSAmKG1TbmFwc2hvdFN0cmVhbUJ1ZmZzKTsKKyAgICAgICAgTE9HRCgiQ2FsbGluZyBIQUwzQVBQIHJlcGVhdCBjYXB0dXJlIHJlcXVlc3QgcmVwZWF0ICVkIGFuZCAlZCIsCisgICAgICAgICAgICAgICAgbVJlcXVlc3RlZENhcHR1cmUsIGZjb3VudF9jYXB0dXJlZCk7CisgICAgICAgIGRldmljZV9oYW5kbGUtPm9wcy0+cHJvY2Vzc19jYXB0dXJlX3JlcXVlc3QobXlfdGVzdF9vYmotPmRldmljZSwgJihtUmVxdWVzdCkpOworICAgICAgICAobVJlcXVlc3QuZnJhbWVfbnVtYmVyKSsrOworICAgIH0KK30KKwordm9pZCBRQ2FtZXJhSEFMM1NuYXBzaG90VGVzdDo6c25hcHNob3RUZXN0RW5kKAorICAgICAgICBoYWwzX2NhbWVyYV9saWJfdGVzdCAqbXlfaGFsM3Rlc3Rfb2JqLCBpbnQgY2FtaWQpCit7CisgICAgYnVmZmVyX3RocmVhZF9tc2dfdCBtc2c7CisgICAgZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCBnQ2FtTG9jazsKKyAgICBoYWwzX2NhbWVyYV90ZXN0X29ial90ICpteV90ZXN0X29iaiA9ICYobXlfaGFsM3Rlc3Rfb2JqLT50ZXN0X29iaik7CisgICAgY2FtZXJhM19kZXZpY2VfdCAqZGV2aWNlX2hhbmRsZSA9IG15X3Rlc3Rfb2JqLT5kZXZpY2U7CisgICAgZGV2aWNlX2hhbmRsZS0+b3BzLT5mbHVzaChteV90ZXN0X29iai0+ZGV2aWNlKTsKKyAgICBMT0dEKCIlcyBDbG9zaW5nIENhbWVyYSAlZCIsIF9fZnVuY19fLCBjYW1pZCk7CisgICAgaW9jdGwobUNhcHR1cmVNZW1JbmZvLmlvbl9mZCwgSU9OX0lPQ19GUkVFLCAmbUNhcHR1cmVNZW1JbmZvLmlvbl9oYW5kbGUpOworICAgIGNsb3NlKG1DYXB0dXJlTWVtSW5mby5pb25fZmQpOworICAgIG1DYXB0dXJlTWVtSW5mby5pb25fZmQgPSAtMTsKKyAgICBtZW1zZXQoJm1zZywgMCwgc2l6ZW9mKGJ1ZmZlcl90aHJlYWRfbXNnX3QpKTsKKyAgICBtc2cuc3RvcF90aHJlYWQgPSAxOworICAgIHdyaXRlKHBmZFsxXSwgJm1zZywgc2l6ZW9mKGJ1ZmZlcl90aHJlYWRfbXNnX3QpKTsKK30KKwordm9pZCBRQ2FtZXJhSEFMM1NuYXBzaG90VGVzdDo6c25hcHNob3RBbGxvY2F0ZUJ1ZmZlcnMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIG1DYXB0dXJlSGFuZGxlPSBhbGxvY2F0ZUJ1ZmZlcnMod2lkdGgsIGhlaWdodCwgJm1DYXB0dXJlTWVtSW5mbyk7Cit9CisKK2Jvb2wgUUNhbWVyYUhBTDNTbmFwc2hvdFRlc3Q6OnNuYXBzaG90VGhyZWFkQ3JlYXRlKGludCB0ZXN0Y2FzZV9pZCwKKyAgICAgICAgICAgICAgICB2b2lkICooKmhhbDNfdGhyZWFkX29wcykodm9pZCAqKSkKK3sKKyAgICBpbnQzMl90IHJldCA9IDA7CisgICAgYnVmZmVyX3RocmVhZF90IHRocmVhZDsKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgIGlmIChwaXBlKHBmZCkgPCAwKSB7CisgICAgICAgIExPR0UoIiVzOlRlc3Q6JWQgRXJyb3IgaW4gY3JlYXRpbmcgdGhlIHBpcGUiLCBfX2Z1bmNfXywgdGVzdGNhc2VfaWQpOworICAgIH0KKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZ0aHJlYWQubXV0ZXgsIE5VTEwpOworICAgIHB0aHJlYWRfY29uZF9pbml0KCZ0aHJlYWQuY29uZCwgTlVMTCk7CisgICAgdGhyZWFkLmlzX3RocmVhZF9zdGFydGVkID0gMDsKKyAgICB0aHJlYWQucmVhZGZkID0gcGZkWzBdOworICAgIHRocmVhZC53cml0ZWZkID0gcGZkWzFdOworICAgIHRocmVhZC5kYXRhX29iaiA9IHRoaXM7CisgICAgcmV0ID0gcHRocmVhZF9jcmVhdGUoJnRocmVhZC50ZCwgJmF0dHIsIGhhbDNfdGhyZWFkX29wcywgJnRocmVhZCApOworICAgIHB0aHJlYWRfc2V0bmFtZV9ucCh0aHJlYWQudGQsICJUZXN0QXBwX1RocmVhZCIpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBjcmVhdGUgc3RhdHVzIHRocmVhZCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZ0aHJlYWQubXV0ZXgpOworICAgIHdoaWxlKHRocmVhZC5pc190aHJlYWRfc3RhcnRlZCA9PSAwKSB7CisgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZ0aHJlYWQuY29uZCwgJnRocmVhZC5tdXRleCk7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aHJlYWQubXV0ZXgpOworICAgIHJldHVybiAxOworfQorCit2b2lkICogaGFsM2FwcFNuYXBzaG90UHJvY2Vzc0J1ZmZlcnModm9pZCAqZGF0YSkKK3sKKyAgICBidWZmZXJfdGhyZWFkX3QgKnRocmVhZCA9IChidWZmZXJfdGhyZWFkX3QqKWRhdGE7CisgICAgaW50MzJfdCByZWFkZmQsIHdyaXRlZmQ7CisgICAgaGFsM19jYW1lcmFfbGliX3Rlc3QgKmhhbDNfdGVzdF9oYW5kbGU7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZ0aHJlYWQtPm11dGV4KTsKKyAgICB0aHJlYWQtPmlzX3RocmVhZF9zdGFydGVkID0gMTsKKyAgICByZWFkZmQgPSB0aHJlYWQtPnJlYWRmZDsKKyAgICB3cml0ZWZkID0gdGhyZWFkLT53cml0ZWZkOworICAgIFFDYW1lcmFIQUwzU25hcHNob3RUZXN0ICpvYmo7CisgICAgb2JqID0gKFFDYW1lcmFIQUwzU25hcHNob3RUZXN0ICopdGhyZWFkLT5kYXRhX29iajsKKyAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZ0aHJlYWQtPmNvbmQpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ0aHJlYWQtPm11dGV4KTsKKyAgICBzdHJ1Y3QgcG9sbGZkIHBvbGxmZHM7CisgICAgaW50MzJfdCBudW1fb2ZfZmRzID0gMTsKKyAgICBib29sIHN0aHJlYWRfZXhpdCA9IDA7CisgICAgaW50MzJfdCByZWFkeSA9IDA7CisgICAgcG9sbGZkcy5mZCA9IHJlYWRmZDsKKyAgICBwb2xsZmRzLmV2ZW50cyA9IFBPTExJTiB8IFBPTExQUkk7CisgICAgd2hpbGUoIXN0aHJlYWRfZXhpdCkgeworICAgICAgICByZWFkeSA9IHBvbGwoJnBvbGxmZHMsIChuZmRzX3QpbnVtX29mX2ZkcywgLTEpOworICAgICAgICBpZiAocmVhZHkgPiAwKSB7CisgICAgICAgICAgICBMT0dEKCJHb3Qgc29tZSBldmVudHMiKTsKKyAgICAgICAgICAgIGlmIChwb2xsZmRzLnJldmVudHMgJiAoUE9MTElOIHwgUE9MTFBSSSkpIHsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG5yZWFkID0gMDsKKyAgICAgICAgICAgICAgICBidWZmZXJfdGhyZWFkX21zZ190IG1zZzsKKyAgICAgICAgICAgICAgICBucmVhZCA9IHJlYWQocG9sbGZkcy5mZCwgJm1zZywgc2l6ZW9mKGJ1ZmZlcl90aHJlYWRfbXNnX3QpKTsKKyAgICAgICAgICAgICAgICBpZiAobnJlYWQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byByZWFkIHRoZSBtZXNzYWdlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtc2cuc3RvcF90aHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhhbDNfdGVzdF9oYW5kbGUgPSBTbmFwc2hvdF9DYW1PYmpfaGFuZGxlOworICAgICAgICAgICAgICAgIG9iai0+c25hcHNob3RQcm9jZXNzQ2FwdHVyZVJlcXVlc3RSZXBlYXQoaGFsM190ZXN0X2hhbmRsZSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMT0dFKCJVbmFibGUgdG8gcG9sbCBleGl0aW5nIHRoZSB0aHJlYWQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIExPR0QoIlNlbnNvciB0aHJlYWQgaXMgZXhpdGluZyIpOworICAgIGNsb3NlKHJlYWRmZCk7CisgICAgY2xvc2Uod3JpdGVmZCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJlRlc3RBcHBMb2NrKTsKKyAgICBwdGhyZWFkX2V4aXQoMCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNTbmFwc2hvdFRlc3Q6OmNhcHR1cmVSZXF1ZXN0UmVwZWF0KAorICAgICAgICBoYWwzX2NhbWVyYV9saWJfdGVzdCAqbXlfaGFsM3Rlc3Rfb2JqLCBpbnQgY2FtaWQsIGludCB0ZXN0Y2FzZSkKK3sKKyAgICBpZihteV9oYWwzdGVzdF9vYmogPT0gTlVMTCkgeworICAgICAgICBMT0dEKCJjYW1pZCA6JWQgYW5kIHRlc3RjYXNlIDogJWQgaGFuZGxlIGlzIE5VTEwiLCBjYW1pZCwgdGVzdGNhc2UpOworICAgIH0KK30KKworUUNhbWVyYUhBTDNTbmFwc2hvdFRlc3Q6On5RQ2FtZXJhSEFMM1NuYXBzaG90VGVzdCgpCit7CisKK30KKworfQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM1NuYXBzaG90VGVzdC5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM1NuYXBzaG90VGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MmEyMWUKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzU25hcHNob3RUZXN0LmgKQEAgLTAsMCArMSw2OSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyogbWV0OgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKi8KKyNpZm5kZWYgX19IQUwzQVBQU05BUFNIT1RfSF9fCisjZGVmaW5lIF9fSEFMM0FQUFNOQVBTSE9UX0hfXworCisjaW5jbHVkZSAiUUNhbWVyYUhBTDNWaWRlb1Rlc3QuaCIKKworbmFtZXNwYWNlIHFjYW1lcmEKK3sKK2NsYXNzIFFDYW1lcmFIQUwzU25hcHNob3RUZXN0IDogcHVibGljIFFDYW1lcmFIQUwzVGVzdAoreworcHJpdmF0ZToKKyAgICBoYWwzX2NhbXRlc3RfbWVtaW5mb190IG1DYXB0dXJlTWVtSW5mbzsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1DYXB0dXJlSGFuZGxlOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICptTWV0YURhdGFQdHJbM107CisgICAgY2FtZXJhM19zdHJlYW1fdCAqbVByZXZpZXdTdHJlYW07CisgICAgY2FtZXJhM19zdHJlYW1fdCAqbVNuYXBzaG90U3RyZWFtOworICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0IG1SZXF1ZXN0OworICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IG1TbmFwc2hvdFN0cmVhbUJ1ZmZzOworICAgIGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb24gbVNuYXBzaG90Q29uZmlnOworcHVibGljOgorICAgIGludCBtUmVxdWVzdGVkQ2FwdHVyZTsKKyAgICBRQ2FtZXJhSEFMM1NuYXBzaG90VGVzdChpbnQgcmVxX2NhcCk7CisgICAgdm9pZCBjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdChoYWwzX2NhbWVyYV90ZXN0X29ial90ICosIGludCApOworICAgIHZvaWQgY29uZmlndXJlU25hcHNob3RTdHJlYW0oaGFsM19jYW1lcmFfdGVzdF9vYmpfdCAqLCBpbnQsCisgICAgICAgICAgICBpbnQgdywgaW50IGgpOworICAgIHZvaWQgc25hcHNob3RQcm9jZXNzQ2FwdHVyZVJlcXVlc3QoaGFsM19jYW1lcmFfdGVzdF9vYmpfdCAqbXlfdGVzdF9vYmosCisgICAgICAgICAgICBpbnQgY2FtaWQpOworICAgIHZvaWQgc25hcHNob3RBbGxvY2F0ZUJ1ZmZlcnMoaW50LCBpbnQgKTsKKyAgICB2b2lkIGluaXRUZXN0KGhhbDNfY2FtZXJhX2xpYl90ZXN0ICpteV90ZXN0X29iaiwKKyAgICAgICAgICAgIGludCB0ZXN0Y2FzZSwgaW50IGNhbWlkLCBpbnQgdywgaW50IGgpOworICAgIGJvb2wgc25hcHNob3RUaHJlYWRDcmVhdGUoaW50IHRlc3RjYXNlX2lkLCB2b2lkICogKCpoYWwzX3RocmVhZF9vcHMpKHZvaWQgKikpOworICAgIHZvaWQgc25hcHNob3RQcm9jZXNzQ2FwdHVyZVJlcXVlc3RSZXBlYXQoaGFsM19jYW1lcmFfbGliX3Rlc3QgKm15X2hhbDN0ZXN0X29iaiwKKyAgICAgICAgICAgIGludCBjYW1pZCk7CisgICAgdm9pZCBjYXB0dXJlUmVxdWVzdFJlcGVhdChoYWwzX2NhbWVyYV9saWJfdGVzdCAqbXlfaGFsM3Rlc3Rfb2JqLCBpbnQgY2FtaWQsIGludCB0ZXN0Y2FzZSk7CisgICAgdm9pZCBzbmFwc2hvdFRlc3RFbmQoaGFsM19jYW1lcmFfbGliX3Rlc3QgKm15X2hhbDN0ZXN0X29iaiwgaW50IGNhbWlkKTsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhSEFMM1NuYXBzaG90VGVzdCgpOworfTsKKworICAgIHZvaWQgKiBoYWwzYXBwU25hcHNob3RQcm9jZXNzQnVmZmVycyh2b2lkICpkYXRhKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzVGVzdC5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlYTY4YQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL3Rlc3QvUUNhbWVyYUhBTDNUZXN0LmNwcApAQCAtMCwwICsxLDIxNCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyogbWV0OgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKi8KKworCisjaW5jbHVkZSAiUUNhbWVyYUhBTDNUZXN0LmgiCisjaW5jbHVkZSAiUUNhbWVyYUhBTDNCYXNlLmgiCisKK25hbWVzcGFjZSBxY2FtZXJhIHsKK2hhbDNfY2FtZXJhX2xpYl90ZXN0ICpDYW1PYmpfaGFuZGxlOworZXh0ZXJuIGJvb2wgdGhyZWFkX2V4aXQ7CitleHRlcm4gaW50IHRlc3RfY2FzZV9lbmQ7CitidWZmZXJfdGhyZWFkX3QgdGhyZWFkOworZXh0ZXJuIHB0aHJlYWRfY29uZF90IG1SZXF1ZXN0QXBwQ29uZDsKK2V4dGVybiBwdGhyZWFkX211dGV4X3QgVGVzdEFwcExvY2ssIG1DYXB0dXJlUmVxdWVzdExvY2s7CisKK2NhbWVyYTNfc3RyZWFtX3QgKlFDYW1lcmFIQUwzVGVzdDo6aW5pdFN0cmVhbShpbnQgc3RyZWFtdHlwZSwKKyAgICAgICAgaW50IGNhbWlkLCBpbnQgdywgaW50IGgsIGludCB1c2FnZSwgaW50IGZvcm1hdCwgaW50IGRhdGFzcGFjZSkKK3sKKyAgICBMT0dEKCJTdHJlYW0gaW5pdCBmb3IgQ2FtZXJhIDogJWQiLCBjYW1pZCk7CisgICAgcmVxdWVzdGVkX3N0cmVhbSA9ICBuZXcgY2FtZXJhM19zdHJlYW1fdDsKKyAgICBtZW1zZXQocmVxdWVzdGVkX3N0cmVhbSwgMCwgc2l6ZW9mKGNhbWVyYTNfc3RyZWFtX3QpKTsKKworICAgIHJlcXVlc3RlZF9zdHJlYW0tPnN0cmVhbV90eXBlID0gc3RyZWFtdHlwZTsKKyAgICByZXF1ZXN0ZWRfc3RyZWFtLT53aWR0aCA9IHc7CisgICAgcmVxdWVzdGVkX3N0cmVhbS0+aGVpZ2h0ID0gaDsKKyAgICByZXF1ZXN0ZWRfc3RyZWFtLT5mb3JtYXQgPSBmb3JtYXQ7CisgICAgcmVxdWVzdGVkX3N0cmVhbS0+dXNhZ2UgPSB1c2FnZTsKKyAgICByZXF1ZXN0ZWRfc3RyZWFtLT5kYXRhX3NwYWNlID0gKGFuZHJvaWRfZGF0YXNwYWNlX3QpZGF0YXNwYWNlOworICAgIHJlcXVlc3RlZF9zdHJlYW0tPnJvdGF0aW9uID0gQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMDsKKyAgICByZXR1cm4gcmVxdWVzdGVkX3N0cmVhbTsKK30KKworUUNhbWVyYUhBTDNUZXN0OjpRQ2FtZXJhSEFMM1Rlc3QoaW50IGlkKQoreworICAgIG1DYW1JZCA9IGlkOworfQorCitjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uIFFDYW1lcmFIQUwzVGVzdDo6Y29uZmlndXJlU3RyZWFtKAorICAgICAgICBpbnQgb3Btb2RlLCBpbnQgbnVtX3N0cmVhbXMpCit7CisgICAgY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbiByZXF1ZXN0ZWRfY29uZmlnOworICAgIHJlcXVlc3RlZF9jb25maWcub3BlcmF0aW9uX21vZGUgID0gb3Btb2RlOworICAgIHJlcXVlc3RlZF9jb25maWcubnVtX3N0cmVhbXMgPSBudW1fc3RyZWFtczsKKyAgICByZXF1ZXN0ZWRfY29uZmlnLnN0cmVhbXMgPSBuZXcgY2FtZXJhM19zdHJlYW1fdCAqW251bV9zdHJlYW1zXTsKKyAgICByZXR1cm4gcmVxdWVzdGVkX2NvbmZpZzsKK30KKworCitjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBRQ2FtZXJhSEFMM1Rlc3Q6OmhhbDNhcHBHZXRTdHJlYW1CdWZmcyhjYW1lcmEzX3N0cmVhbV90ICpyZXFfc3RyZWFtKQoreworICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IHN0cmVhbV9idWZmczsKKyAgICBzdHJlYW1fYnVmZnMuc3RyZWFtID0gcmVxX3N0cmVhbTsKKyAgICBzdHJlYW1fYnVmZnMucmVsZWFzZV9mZW5jZSA9IC0xOworICAgIHN0cmVhbV9idWZmcy5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgcmV0dXJuIHN0cmVhbV9idWZmczsKK30KKworY2FtZXJhM19jYXB0dXJlX3JlcXVlc3QgUUNhbWVyYUhBTDNUZXN0OjpoYWwzYXBwR2V0UmVxdWVzdFNldHRpbmdzKAorICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqc3RyZWFtX2J1ZmZzLCBpbnQgbnVtX2J1ZmZlcikKK3sKKyAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdCByZXF1ZXN0X3NldHRpbmdzOworICAgIHJlcXVlc3Rfc2V0dGluZ3MuaW5wdXRfYnVmZmVyID0gTlVMTDsKKyAgICBMT0dEKCJOdW1iZXIgb2YgYnVmZmVyIHNlbnQgOiAlZCIsIG51bV9idWZmZXIpOworICAgIHJlcXVlc3Rfc2V0dGluZ3MubnVtX291dHB1dF9idWZmZXJzID0gMTsKKyAgICByZXF1ZXN0X3NldHRpbmdzLm91dHB1dF9idWZmZXJzID0gc3RyZWFtX2J1ZmZzOworICAgIHJldHVybiByZXF1ZXN0X3NldHRpbmdzOworfQorCituYXRpdmVfaGFuZGxlX3QgKlFDYW1lcmFIQUwzVGVzdDo6YWxsb2NhdGVCdWZmZXJzKGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgaGFsM19jYW10ZXN0X21lbWluZm9fdCAqcmVxX21lbWluZm8pCit7CisgICAgc3RydWN0IGlvbl9hbGxvY2F0aW9uX2RhdGEgYWxsb2M7CisgICAgc3RydWN0IGlvbl9mZF9kYXRhIGlvbl9pbmZvX2ZkOworICAgIGludCBtYWluX2lvbl9mZCA9IC0xLCByYzsKKyAgICBzaXplX3QgYnVmX3NpemU7CisgICAgbmF0aXZlX2hhbmRsZV90ICpuaF90ZXN0OworICAgIG1haW5faW9uX2ZkID0gb3BlbigiL2Rldi9pb24iLCBPX1JET05MWSk7CisgICAgaWYgKG1haW5faW9uX2ZkIDw9IDApIHsKKyAgICAgICAgTE9HRSgiSW9uIGRldiBvcGVuIGZhaWxlZCAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldCgmYWxsb2MsIDAsIHNpemVvZihhbGxvYykpOworICAgIGJ1Zl9zaXplID0gKHNpemVfdCkod2lkdGggKiBoZWlnaHQgKjIpOworICAgIGFsbG9jLmxlbiA9IChzaXplX3QpKGJ1Zl9zaXplKTsKKyAgICBhbGxvYy5sZW4gPSAoYWxsb2MubGVuICsgNDA5NVUpICYgKH40MDk1VSk7CisgICAgYWxsb2MuYWxpZ24gPSA0MDk2OworICAgIGFsbG9jLmZsYWdzID0gSU9OX0ZMQUdfQ0FDSEVEOworICAgIGFsbG9jLmhlYXBfaWRfbWFzayA9IElPTl9IRUFQKElPTl9TWVNURU1fSEVBUF9JRCk7CisgICAgcmMgPSBpb2N0bChtYWluX2lvbl9mZCwgSU9OX0lPQ19BTExPQywgJmFsbG9jKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoIklPTiBhbGxvY2F0aW9uIGZhaWxlZCAlcyB3aXRoIHJjID0gJWQgXG4iLCBzdHJlcnJvcihlcnJubyksIHJjKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldCgmaW9uX2luZm9fZmQsIDAsIHNpemVvZihpb25faW5mb19mZCkpOworICAgIGlvbl9pbmZvX2ZkLmhhbmRsZSA9IGFsbG9jLmhhbmRsZTsKKyAgICByYyA9IGlvY3RsKG1haW5faW9uX2ZkLCBJT05fSU9DX1NIQVJFLCAmaW9uX2luZm9fZmQpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiSU9OIG1hcCBmYWlsZWQgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXFfbWVtaW5mby0+aW9uX2ZkID0gbWFpbl9pb25fZmQ7CisgICAgcmVxX21lbWluZm8tPmlvbl9oYW5kbGUgPSBpb25faW5mb19mZC5oYW5kbGU7CisgICAgTE9HRCgiJXMgSU9OIEZEICVkIGxlbiAlZFxuIiwgX19mdW5jX18sIGlvbl9pbmZvX2ZkLmZkLCBhbGxvYy5sZW4pOworICAgIG5oX3Rlc3QgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgyLCA0KTsKKyAgICBuaF90ZXN0LT5kYXRhWzBdID0gaW9uX2luZm9fZmQuZmQ7CisgICAgbmhfdGVzdC0+ZGF0YVsxXSA9IDA7CisgICAgbmhfdGVzdC0+ZGF0YVsyXSA9IDA7CisgICAgbmhfdGVzdC0+ZGF0YVszXSA9IDA7CisgICAgbmhfdGVzdC0+ZGF0YVs0XSA9IGFsbG9jLmxlbjsKKyAgICBuaF90ZXN0LT5kYXRhWzVdID0gMDsKKyAgICByZXR1cm4gbmhfdGVzdDsKK30KKwordm9pZCBRQ2FtZXJhSEFMM1Rlc3Q6OmNhcHR1cmVSZXF1ZXN0UmVwZWF0KAorICAgICAgICBoYWwzX2NhbWVyYV9saWJfdGVzdCAqbXlfaGFsM3Rlc3Rfb2JqLCBpbnQgY2FtaWQsIGludCB0ZXN0Y2FzZSkKK3sKKyAgICBpZihteV9oYWwzdGVzdF9vYmogPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJUZXN0Q2FzZSA6ICVkIENhbWVyYTolZCBIYW5kbGUgaXMgTlVMTCIsIHRlc3RjYXNlLCBjYW1pZCk7CisgICAgfQorfQorCitib29sIFFDYW1lcmFIQUwzVGVzdDo6cHJvY2Vzc1RocmVhZENyZWF0ZSgKKyAgICAgICAgdm9pZCAqb2JqLCBpbnQgdGVzdGNhc2UpCit7CisgICAgaW50MzJfdCByZXQgPSAwOworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgaWYgKHBpcGUocGZkKSA8IDApIHsKKyAgICAgICAgTE9HRSgiJXM6IEVycm9yIGluIGNyZWF0aW5nIHRoZSBwaXBlIiwgX19mdW5jX18pOworICAgIH0KKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZ0aHJlYWQubXV0ZXgsIE5VTEwpOworICAgIHB0aHJlYWRfY29uZF9pbml0KCZ0aHJlYWQuY29uZCwgTlVMTCk7CisgICAgcHRocmVhZF9jb25kX2luaXQoJm1SZXF1ZXN0QXBwQ29uZCwgTlVMTCk7CisgICAgdGhyZWFkLmlzX3RocmVhZF9zdGFydGVkID0gMDsKKyAgICB0aHJlYWQucmVhZGZkID0gcGZkWzBdOworICAgIHRocmVhZC53cml0ZWZkID0gcGZkWzFdOworICAgIHRocmVhZC5kYXRhX29iaiA9IG9iajsKKyAgICB0aHJlYWQudGVzdGNhc2UgPSB0ZXN0Y2FzZTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnRocmVhZC5tdXRleCk7CisgICAgcmV0ID0gcHRocmVhZF9jcmVhdGUoJnRocmVhZC50ZCwgJmF0dHIsIHByb2Nlc3NCdWZmZXJzLCAmdGhyZWFkICk7CisgICAgcHRocmVhZF9zZXRuYW1lX25wKHRocmVhZC50ZCwgIlRlc3RBcHBfVGhyZWFkIik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBzdGF0dXMgdGhyZWFkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdGhyZWFkLm11dGV4KTsKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCAqIHByb2Nlc3NCdWZmZXJzKHZvaWQgKmRhdGEpIHsKKyAgICBidWZmZXJfdGhyZWFkX3QgKnRocmVhZCA9IChidWZmZXJfdGhyZWFkX3QqKWRhdGE7CisgICAgaW50MzJfdCByZWFkZmQsIHdyaXRlZmQ7CisgICAgaW50IHRlc3RjYXNlOworICAgIGhhbDNfY2FtZXJhX2xpYl90ZXN0ICpoYWwzX3Rlc3RfaGFuZGxlOworICAgIHN0cnVjdCB0aW1lc3BlYyB0czE7CisgICAgdGhyZWFkLT5pc190aHJlYWRfc3RhcnRlZCA9IDE7CisgICAgcmVhZGZkID0gdGhyZWFkLT5yZWFkZmQ7CisgICAgd3JpdGVmZCA9IHRocmVhZC0+d3JpdGVmZDsKKyAgICB0ZXN0Y2FzZSA9IHRocmVhZC0+dGVzdGNhc2U7CisgICAgUUNhbWVyYUhBTDNUZXN0ICpvYmo7CisgICAgb2JqID0gKFFDYW1lcmFIQUwzVGVzdCAqKXRocmVhZC0+ZGF0YV9vYmo7CisgICAgd2hpbGUoIXRocmVhZF9leGl0KSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmdGhyZWFkLT5tdXRleCk7CisgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0czEpOworICAgICAgICB0czEudHZfbnNlYyArPSAxMDAwMDAwMEw7CisgICAgICAgIHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJm1SZXF1ZXN0QXBwQ29uZCwgJnRocmVhZC0+bXV0ZXgsICZ0czEpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdGhyZWFkLT5tdXRleCk7CisgICAgICAgIGhhbDNfdGVzdF9oYW5kbGUgPSBDYW1PYmpfaGFuZGxlOworICAgICAgICBpZiAodGVzdF9jYXNlX2VuZCA9PSAwKSB7CisgICAgICAgICAgICBvYmotPmNhcHR1cmVSZXF1ZXN0UmVwZWF0KGhhbDNfdGVzdF9oYW5kbGUsIDAsIHRlc3RjYXNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dEKCJTZW5zb3IgdGhyZWFkIGlzIGV4aXRpbmciKTsKKyAgICBjbG9zZShyZWFkZmQpOworICAgIGNsb3NlKHdyaXRlZmQpOworICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZtUmVxdWVzdEFwcENvbmQpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZUZXN0QXBwTG9jayk7CisgICAgcHRocmVhZF9leGl0KDApOworICAgIHJldHVybiBOVUxMOworfQorCitRQ2FtZXJhSEFMM1Rlc3Q6On5RQ2FtZXJhSEFMM1Rlc3QoKQoreworCit9CisKK30KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9IQUwzL3Rlc3QvUUNhbWVyYUhBTDNUZXN0LmggYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzVGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODI2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzVGVzdC5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisjaWZuZGVmIF9fSEFMM0FQUFRFU1RJTklUX0hfXworI2RlZmluZSBfX0hBTDNBUFBURVNUSU5JVF9IX18KKworI2luY2x1ZGUgIlFDYW1lcmFIQUwzTWFpblRlc3RDb250ZXh0LmgiCisjaW5jbHVkZSAiUUNhbWVyYUhBTDNCYXNlLmgiCisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworY2xhc3MgUUNhbWVyYUhBTDNUZXN0Cit7CisgICAgaW50IG1DYW1JZDsKK3B1YmxpYzoKKyAgICBRQ2FtZXJhSEFMM1Rlc3QoaW50IGNhbWVyYUluZGV4KTsKKyAgICBjYW1lcmEzX3N0cmVhbV90ICpyZXF1ZXN0ZWRfc3RyZWFtOworICAgIGNhbWVyYTNfc3RyZWFtX3QgKmluaXRTdHJlYW0oaW50IHN0cmVhbXR5cGUsCisgICAgICAgICAgICBpbnQgY2FtaWQsIGludCB3LCBpbnQgaCwgaW50IGZvcm1hdCxpbnQgdXNhZ2UsaW50IGRhdGFzcGFjZSk7CisKKyAgICBjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uIGNvbmZpZ3VyZVN0cmVhbSgKKyAgICAgICAgICAgIGludCBvcG1vZGUsIGludCBudW1fc3RyZWFtcyk7CisgICAgdmlydHVhbCB2b2lkIGNhcHR1cmVSZXF1ZXN0UmVwZWF0KGhhbDNfY2FtZXJhX2xpYl90ZXN0ICosIGludCwgaW50KTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfdCogaGFsM2FwcEdldERlZmF1bHRSZXF1ZXN0KGludCB0eXBlKTsKKworICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0IGhhbDNhcHBHZXRSZXF1ZXN0U2V0dGluZ3MoCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqc3RyZWFtX2J1ZmZzLCBpbnQgbnVtX2J1ZmZlcik7CisgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgaGFsM2FwcEdldFN0cmVhbUJ1ZmZzKGNhbWVyYTNfc3RyZWFtX3QgKnJlcV9zdHJlYW0pOworCisgICAgbmF0aXZlX2hhbmRsZV90ICphbGxvY2F0ZUJ1ZmZlcnMoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgaGFsM19jYW10ZXN0X21lbWluZm9fdCAqcmVxX21lbWluZm8pOworICAgIGJvb2wgcHJvY2Vzc1RocmVhZENyZWF0ZSh2b2lkICpvYmosIGludCB0ZXN0Y2FzZSk7CisgICAgdmlydHVhbCB+UUNhbWVyYUhBTDNUZXN0KCk7Cit9OworCisgICAgdm9pZCAqIHByb2Nlc3NCdWZmZXJzKHZvaWQgKmRhdGEpOworfQorI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM1ZpZGVvVGVzdC5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzVmlkZW9UZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTk3ZjRiCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM1ZpZGVvVGVzdC5jcHAKQEAgLTAsMCArMSwyMTMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNpbmNsdWRlICJRQ2FtZXJhSEFMM1ZpZGVvVGVzdC5oIgorI2luY2x1ZGUgIlFDYW1lcmFIQUwzTWFpblRlc3RDb250ZXh0LmgiCisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworZXh0ZXJuIGhhbDNfY2FtZXJhX2xpYl90ZXN0ICpDYW1PYmpfaGFuZGxlOworYnVmZmVyX3RocmVhZF90IFZpZGVvX3RocmVhZDsKK2ludCB2aWRlb19yZXFfc2VudDsKK2V4dGVybiBwdGhyZWFkX2NvbmRfdCBtUmVxdWVzdEFwcENvbmQ7CisKK2V4dGVybiBpbnQgdGVzdF9jYXNlX2VuZDsKK2V4dGVybiBib29sIHRocmVhZF9leGl0OworZXh0ZXJuIHN0ZDo6bGlzdDx1aW50MzJfdD4gVmlkZW9RdWV1ZTsKK2ludCB2aWRlb19idWZmZXJfYWxsb2NhdGVkOworZXh0ZXJuIHB0aHJlYWRfbXV0ZXhfdCBUZXN0QXBwTG9jaywgbUNhcHR1cmVSZXF1ZXN0TG9jazsKK2V4dGVybiBpbnQgc25hcHNob3RfYnVmZmVyOworCisKK1FDYW1lcmFIQUwzVmlkZW9UZXN0OjpRQ2FtZXJhSEFMM1ZpZGVvVGVzdChpbnQgY2FtaWQpIDoKKyAgICBRQ2FtZXJhSEFMM1Rlc3QoMCksCisgICAgbVZpZGVvSGFuZGxlKE5VTEwpLAorICAgIG1DYXB0dXJlSGFuZGxlKE5VTEwpLAorICAgIG1WaWRlb1N0cmVhbShOVUxMKSwKKyAgICBtQ2FtZXJhSWQoY2FtaWQpCit7CisKK30KKwordm9pZCBRQ2FtZXJhSEFMM1ZpZGVvVGVzdDo6aW5pdFRlc3QoaGFsM19jYW1lcmFfbGliX3Rlc3QgKmhhbmRsZSwKKyAgICAgICAgaW50IHRlc3RjYXNlLCBpbnQgY2FtaWQsIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgaTsKKyAgICBDYW1PYmpfaGFuZGxlID0gaGFuZGxlOyB0aHJlYWRfZXhpdCA9IDA7CisgICAgdGVzdF9jYXNlX2VuZCA9IDA7CisgICAgTE9HRCgiXG4gYnVmZmVyIHRocmVhZCBjcmVhdGVkIGZvciB0ZXN0Y2FzZSAlZCAgJWQgYW5kICVkICIsdGVzdGNhc2UsIHcsIGgpOworICAgIGNvbmZpZ3VyZVZpZGVvU3RyZWFtKCYoaGFuZGxlLT50ZXN0X29iaiksIGNhbWlkLCB3LCBoKTsKKyAgICBMT0dEKCJcbiB2aWRlbyBzdHJlYW0gY29uZmlndXJlZCIpOworICAgIGNvbnN0cnVjdERlZmF1bHRSZXF1ZXN0KCYoaGFuZGxlLT50ZXN0X29iaiksIGNhbWlkKTsKKyAgICBMT0dEKCJwaXBlbGluZV9kZXB0aCBpcyAlZCIsIG1QaXBlbGluZURlcHRoVmlkZW8pOworICAgIG1WaWRlb0hhbmRsZSA9IG5ldyBuYXRpdmVfaGFuZGxlX3QgKlttUGlwZWxpbmVEZXB0aFZpZGVvXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbVBpcGVsaW5lRGVwdGhWaWRlbzsgaSsrKSB7CisgICAgICAgIG1WaWRlb0hhbmRsZVtpXSA9IG5ldyBuYXRpdmVfaGFuZGxlX3Q7CisgICAgfQorCisgICAgZm9yIChpID0gMCwgdmlkZW9fcmVxX3NlbnQgPSAxOyBpIDwgbVBpcGVsaW5lRGVwdGhWaWRlbzsgaSsrLCB2aWRlb19yZXFfc2VudCsrKSB7CisgICAgICAgIHZpZG9lQWxsb2NhdGVCdWZmZXJzKHdpZHRoLCBoZWlnaHQsIGkpOworICAgICAgICBWaWRlb1F1ZXVlLnB1c2hfYmFjayhpKTsKKyAgICB9CisgICAgTE9HRCgiIFJlcXVlc3QgTnVtYmVyIGlzIDogJWQgIixtUmVxdWVzdC5mcmFtZV9udW1iZXIpOworICAgIG1SZXF1ZXN0LmZyYW1lX251bWJlciA9IDA7CisgICAgdmlkZW9Qcm9jZXNzVGhyZWFkQ3JlYXRlKGhhbmRsZSk7Cit9CisKKwordm9pZCBRQ2FtZXJhSEFMM1ZpZGVvVGVzdDo6c25hcHNob3RDYXB0dXJlUmVxdWVzdChoYWwzX2NhbWVyYV9saWJfdGVzdCAqaGFuZGxlLAorICAgICAgICBpbnQgdGVzdGNhc2UsIGludCBjYW1pZCwgaW50IHcsIGludCBoKQoreworICAgIExPR0QoIlJlcXVlc3RlZCBDYXB0dXJlIFNpemVzIGZvciB0ZXN0Y2FzZTolZCBhcmUgOiVkICBYICVkIix0ZXN0Y2FzZSwgdywgaCk7CisgICAgY2FwdHVyZVJlcXVlc3RSZXBlYXQoaGFuZGxlLCBjYW1pZCwgTUVOVV9TVEFSVF9DQVBUVVJFKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUNhcHR1cmVSZXF1ZXN0TG9jayk7Cit9CisKKwordm9pZCBRQ2FtZXJhSEFMM1ZpZGVvVGVzdDo6Y29uZmlndXJlVmlkZW9TdHJlYW0oaGFsM19jYW1lcmFfdGVzdF9vYmpfdCAqbXlfdGVzdF9vYmosCisgICAgICAgIGludCBjYW1pZCwgaW50IHcsIGludCBoKQoreworICAgIGNhbWVyYTNfZGV2aWNlX3QgKmRldmljZV9oYW5kbGUgPSBteV90ZXN0X29iai0+ZGV2aWNlOworICAgIG1WaWRlb1N0cmVhbSA9IG5ldyBjYW1lcmEzX3N0cmVhbV90OworICAgIG1lbXNldChtVmlkZW9TdHJlYW0sIDAsIHNpemVvZihjYW1lcmEzX3N0cmVhbV90KSk7CisgICAgbVZpZGVvU3RyZWFtID0gaW5pdFN0cmVhbShDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIGNhbWlkLCB3LCBoLCBGTEFHU19WSURFT19FTkNPREVSLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVELCBIQUwzX0RBVEFTUEFDRV9VTktOT1dOKTsKKyAgICBtVmlkZW9Db25maWcgPSBjb25maWd1cmVTdHJlYW0oQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERSwgMSk7CisgICAgbVZpZGVvQ29uZmlnLnN0cmVhbXNbMF0gPSBtVmlkZW9TdHJlYW07CisKKyAgICBkZXZpY2VfaGFuZGxlLT5vcHMtPmNvbmZpZ3VyZV9zdHJlYW1zKG15X3Rlc3Rfb2JqLT5kZXZpY2UsICYobVZpZGVvQ29uZmlnKSk7CisgICAgbVBpcGVsaW5lRGVwdGhWaWRlbyA9IG1WaWRlb0NvbmZpZy5zdHJlYW1zWzBdLT5tYXhfYnVmZmVyczsKKyAgICB2aWRlb19idWZmZXJfYWxsb2NhdGVkID0gbVBpcGVsaW5lRGVwdGhWaWRlbzsKK30KKwordm9pZCBRQ2FtZXJhSEFMM1ZpZGVvVGVzdDo6Y29uc3RydWN0RGVmYXVsdFJlcXVlc3QoCisgICAgICAgIGhhbDNfY2FtZXJhX3Rlc3Rfb2JqX3QgKm15X3Rlc3Rfb2JqLCBpbnQgY2FtaWQpCit7CisgICAgY2FtZXJhM19kZXZpY2VfdCAqZGV2aWNlX2hhbmRsZSA9IG15X3Rlc3Rfb2JqLT5kZXZpY2U7CisgICAgTE9HRCgiQ2FtZXJhIElEIDogJWQiLGNhbWlkKTsKKyAgICBtTWV0YURhdGFQdHJbMF0gPSBkZXZpY2VfaGFuZGxlLT5vcHMtPmNvbnN0cnVjdF9kZWZhdWx0X3JlcXVlc3Rfc2V0dGluZ3MoCisgICAgICAgICAgICBteV90ZXN0X29iai0+ZGV2aWNlLCBDQU1FUkEzX1RFTVBMQVRFX1ZJREVPX1JFQ09SRCk7CisgICAgbU1ldGFEYXRhUHRyWzFdID0gZGV2aWNlX2hhbmRsZS0+b3BzLT5jb25zdHJ1Y3RfZGVmYXVsdF9yZXF1ZXN0X3NldHRpbmdzKG15X3Rlc3Rfb2JqLT5kZXZpY2UsCisgICAgICAgICAgICBDQU1FUkEzX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkUpOworfQorCisKKwordm9pZCBRQ2FtZXJhSEFMM1ZpZGVvVGVzdDo6Y2FwdHVyZVJlcXVlc3RSZXBlYXQoCisgICAgICAgIGhhbDNfY2FtZXJhX2xpYl90ZXN0ICpteV9oYWwzdGVzdF9vYmosIGludCBjYW1pZCwgaW50IHRlc3RjYXNlKQoreworICAgIGludCBudW0xLCBudW0yOworICAgIGhhbDNfY2FtZXJhX3Rlc3Rfb2JqX3QgKm15X3Rlc3Rfb2JqID0gJihteV9oYWwzdGVzdF9vYmotPnRlc3Rfb2JqKTsKKyAgICBjYW1lcmEzX2RldmljZV90ICpkZXZpY2VfaGFuZGxlID0gbXlfdGVzdF9vYmotPmRldmljZTsKKyAgICBpZiAodGVzdGNhc2UgPT0gTUVOVV9TVEFSVF9WSURFTykgeworICAgICAgICBpZiAoVmlkZW9RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBMT0dFKCJubyBWaWRlbyBidWZmZXIgZm9yIENhbUlEIDogJWQiLCBjYW1pZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAodGVzdF9jYXNlX2VuZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgTE9HRCgiIFJlcXVlc3QgTnVtYmVyIGlzIDogJWQgIiwgbVJlcXVlc3QuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1DYXB0dXJlUmVxdWVzdExvY2spOworICAgICAgICAgICAgICAgIG51bTIgPSBWaWRlb1F1ZXVlLmZyb250KCk7CisgICAgICAgICAgICAgICAgVmlkZW9RdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBudW0xID0gbVJlcXVlc3QuZnJhbWVfbnVtYmVyOworICAgICAgICAgICAgICAgIGlmIChudW0xIDwgMikgeworICAgICAgICAgICAgICAgICAgICAobVJlcXVlc3QpLnNldHRpbmdzID0gbU1ldGFEYXRhUHRyWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKG1SZXF1ZXN0KS5zZXR0aW5ncyA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIChtUmVxdWVzdCkuaW5wdXRfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAobVJlcXVlc3QpLm51bV9vdXRwdXRfYnVmZmVycyA9IDE7CisgICAgICAgICAgICAgICAgbVZpZGVvU3RyZWFtQnVmZnMuc3RyZWFtID0gbVZpZGVvU3RyZWFtOworICAgICAgICAgICAgICAgIG1WaWRlb1N0cmVhbUJ1ZmZzLnN0YXR1cyA9IDA7CisgICAgICAgICAgICAgICAgbVZpZGVvU3RyZWFtQnVmZnMuYnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBuYXRpdmVfaGFuZGxlX3QqKikmbVZpZGVvSGFuZGxlW251bTJdOworICAgICAgICAgICAgICAgIG1WaWRlb1N0cmVhbUJ1ZmZzLnJlbGVhc2VfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICBtVmlkZW9TdHJlYW1CdWZmcy5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICAgICAgKG1SZXF1ZXN0KS5vdXRwdXRfYnVmZmVycyA9ICYobVZpZGVvU3RyZWFtQnVmZnMpOworICAgICAgICAgICAgICAgIExPR0QoIkNhbGxpbmcgSEFMM0FQUCByZXBlYXQgY2FwdHVyZSByZXF1ZXN0ICVkIGFuZCAlZCBhbmQgZnJlZSBidWZmZXIgOiVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICwgbnVtMSwgbnVtMiwgVmlkZW9RdWV1ZS5zaXplKCkpOworICAgICAgICAgICAgICAgIGRldmljZV9oYW5kbGUtPm9wcy0+cHJvY2Vzc19jYXB0dXJlX3JlcXVlc3QobXlfdGVzdF9vYmotPmRldmljZSwgJihtUmVxdWVzdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKG1SZXF1ZXN0LmZyYW1lX251bWJlcikrKzsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbUNhcHR1cmVSZXF1ZXN0TG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNuYXBzaG90X2J1ZmZlciA9IG1SZXF1ZXN0LmZyYW1lX251bWJlcjsKKyAgICAgICAgKG1SZXF1ZXN0KS5zZXR0aW5ncyA9IG1NZXRhRGF0YVB0clsxXTsKKyAgICAgICAgbVNuYXBzaG90U3RyZWFtQnVmZnMgPSBoYWwzYXBwR2V0U3RyZWFtQnVmZnMobVNuYXBzaG90U3RyZWFtKTsKKyAgICAgICAgbVNuYXBzaG90U3RyZWFtQnVmZnMuYnVmZmVyID0gKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqKSZtQ2FwdHVyZUhhbmRsZTsKKyAgICAgICAgbVJlcXVlc3QgPSBoYWwzYXBwR2V0UmVxdWVzdFNldHRpbmdzKCZtU25hcHNob3RTdHJlYW1CdWZmcywgMSk7CisgICAgICAgIExPR0QoIkNhbGxpbmcgc25hcCBIQUwzQVBQIHJlcGVhdCBjYXB0dXJlIHJlcXVlc3QgcmVwZWF0ICVkICAiLCBzbmFwc2hvdF9idWZmZXIpOworICAgICAgICBkZXZpY2VfaGFuZGxlLT5vcHMtPnByb2Nlc3NfY2FwdHVyZV9yZXF1ZXN0KG15X3Rlc3Rfb2JqLT5kZXZpY2UsICYobVJlcXVlc3QpKTsKKyAgICAgICAgKG1SZXF1ZXN0LmZyYW1lX251bWJlcikrKzsKKyAgICB9Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNWaWRlb1Rlc3Q6OnZpZGVvVGVzdEVuZCgKKyAgICAgICAgICAgICAgICAgICAgaGFsM19jYW1lcmFfbGliX3Rlc3QgKm15X2hhbDN0ZXN0X29iaiwgaW50IGNhbWlkKQoreworICAgIHRlc3RfY2FzZV9lbmQgPSAxOworICAgIGhhbDNfY2FtZXJhX3Rlc3Rfb2JqX3QgKm15X3Rlc3Rfb2JqID0gJihteV9oYWwzdGVzdF9vYmotPnRlc3Rfb2JqKTsKKyAgICBjYW1lcmEzX2RldmljZV90ICpkZXZpY2VfaGFuZGxlID0gbXlfdGVzdF9vYmotPmRldmljZTsKKyAgICBkZXZpY2VfaGFuZGxlLT5vcHMtPmZsdXNoKG15X3Rlc3Rfb2JqLT5kZXZpY2UpOworICAgIExPR0QoIiVzIENsb3NpbmcgQ2FtZXJhICVkIiwgX19mdW5jX18sIGNhbWlkKTsKKyAgICBpb2N0bChtVmlkZW9NZW1pbmZvLmlvbl9mZCwgSU9OX0lPQ19GUkVFLCAmbVZpZGVvTWVtaW5mby5pb25faGFuZGxlKTsKKyAgICBjbG9zZShtVmlkZW9NZW1pbmZvLmlvbl9mZCk7CisgICAgbVZpZGVvTWVtaW5mby5pb25fZmQgPSAtMTsKKyAgICBMT0dEKCIlcyBDbG9zaW5nIHRocmVhZCIsIF9fZnVuY19fKTsKKyAgICB0aHJlYWRfZXhpdCA9IDE7Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNWaWRlb1Rlc3Q6OnZpZG9lQWxsb2NhdGVCdWZmZXJzKGludCBoZWlnaHQsIGludCB3aWR0aCwgaW50IG51bSkKK3sKKyAgICBtVmlkZW9IYW5kbGVbbnVtXSA9IGFsbG9jYXRlQnVmZmVycyh3aWR0aCwgaGVpZ2h0LCAmbVZpZGVvTWVtaW5mbyk7Cit9CisKK3ZvaWQgUUNhbWVyYUhBTDNWaWRlb1Rlc3Q6OnNuYXBzaG90QWxsb2NhdGVCdWZmZXJzKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBtQ2FwdHVyZUhhbmRsZSA9IGFsbG9jYXRlQnVmZmVycyh3aWR0aCwgaGVpZ2h0LCAmbUNhcHR1cmVNZW1JbmZvKTsKK30KKworYm9vbCBRQ2FtZXJhSEFMM1ZpZGVvVGVzdDo6dmlkZW9Qcm9jZXNzVGhyZWFkQ3JlYXRlKAorICAgICAgICAgICAgICAgICAgICBoYWwzX2NhbWVyYV9saWJfdGVzdCAqaGFuZGxlKSB7CisgICAgaWYoaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgTE9HRCgiQ2FtZXJhIEhhbmxlIGlzIE5VTEwiKTsKKyAgICB9CisgICAgcHJvY2Vzc1RocmVhZENyZWF0ZSh0aGlzLCBNRU5VX1NUQVJUX1ZJREVPKTsKKyAgICByZXR1cm4gMTsKK30KKworUUNhbWVyYUhBTDNWaWRlb1Rlc3Q6On5RQ2FtZXJhSEFMM1ZpZGVvVGVzdCgpCit7CisKK30KKworfQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM1ZpZGVvVGVzdC5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL0hBTDMvdGVzdC9RQ2FtZXJhSEFMM1ZpZGVvVGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNjE3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvSEFMMy90ZXN0L1FDYW1lcmFIQUwzVmlkZW9UZXN0LmgKQEAgLTAsMCArMSw4NSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyogbWV0OgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKi8KKyNpZm5kZWYgX19IQUwzQVBQVklERU9URVNUX0hfXworI2RlZmluZSBfX0hBTDNBUFBWSURFT1RFU1RfSF9fCisKKyNpbmNsdWRlICJRQ2FtZXJhSEFMM0Jhc2UuaCIKKyNpbmNsdWRlICJRQ2FtZXJhSEFMM1Rlc3QuaCIKKworCituYW1lc3BhY2UgcWNhbWVyYSB7CisKKworY2xhc3MgUUNhbWVyYUhBTDNWaWRlb1Rlc3QgOiBwdWJsaWMgUUNhbWVyYUhBTDNUZXN0Cit7CisKK3ByaXZhdGU6CisgICAgaGFsM19jYW10ZXN0X21lbWluZm9fdCBtVmlkZW9NZW1pbmZvOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqKm1WaWRlb0hhbmRsZTsKKyAgICBoYWwzX2NhbXRlc3RfbWVtaW5mb190IG1DYXB0dXJlTWVtSW5mbzsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1DYXB0dXJlSGFuZGxlOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICptTWV0YURhdGFQdHJbM107CisgICAgY2FtZXJhM19zdHJlYW1fdCAqbVZpZGVvU3RyZWFtOworICAgIGNhbWVyYTNfc3RyZWFtX3QgKm1TbmFwc2hvdFN0cmVhbTsKKyAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdCBtUmVxdWVzdDsKKyAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBtVmlkZW9TdHJlYW1CdWZmczsKKyAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBtU25hcHNob3RTdHJlYW1CdWZmczsKKyAgICBjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uIG1WaWRlb0NvbmZpZzsKK3B1YmxpYzoKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgbm9idWZmZXI7CisgICAgaW50IG1QaXBlbGluZURlcHRoVmlkZW87CisgICAgaW50IG1DYW1lcmFJZDsKKworICAgIFFDYW1lcmFIQUwzVmlkZW9UZXN0KGludCBjYW1lcmFJbmRleCk7CisKKyAgICB2b2lkIGNvbmZpZ3VyZVZpZGVvU3RyZWFtKGhhbDNfY2FtZXJhX3Rlc3Rfb2JqX3QgKiwKKyAgICAgICAgICAgIGludCwgaW50LCBpbnQpOworICAgIHZvaWQgc25hcHNob3RDYXB0dXJlUmVxdWVzdChoYWwzX2NhbWVyYV9saWJfdGVzdCAqaGFuZGxlLGludCB0ZXN0Y2FzZSwKKyAgICAgICAgICAgIGludCBjYW1pZCwgaW50IHcsIGludCBoKTsKKworICAgIHZvaWQgY29uc3RydWN0RGVmYXVsdFJlcXVlc3QoaGFsM19jYW1lcmFfdGVzdF9vYmpfdCAqLAorICAgICAgICAgICAgaW50KTsKKworICAgIHZvaWQgY2FwdHVyZVJlcXVlc3RSZXBlYXQoaGFsM19jYW1lcmFfbGliX3Rlc3QgKiwgaW50LCBpbnQpOworICAgIHZvaWQgaW5pdFRlc3QoaGFsM19jYW1lcmFfbGliX3Rlc3QgKmhhbmRsZSwgaW50IHRlc3RjYXNlLCBpbnQgY2FtaWQsCisgICAgICAgICAgICBpbnQgdywgaW50IGgpOworICAgIHZvaWQgdmlkb2VBbGxvY2F0ZUJ1ZmZlcnMoaW50LCBpbnQsIGludCk7CisKKyAgICBib29sIHZpZGVvUHJvY2Vzc1RocmVhZENyZWF0ZShoYWwzX2NhbWVyYV9saWJfdGVzdCAqKTsKKyAgICB2b2lkIHZpZGVvVGVzdEVuZChoYWwzX2NhbWVyYV9saWJfdGVzdCAqbXlfaGFsM3Rlc3Rfb2JqLCBpbnQgY2FtaWQpOworICAgIHZvaWQgc25hcHNob3RBbGxvY2F0ZUJ1ZmZlcnMoaW50LCBpbnQgKTsKKyAgICB2aXJ0dWFsIH5RQ2FtZXJhSEFMM1ZpZGVvVGVzdCgpOworfTsKKworICAgIHZvaWQgKiBoYWwzYXBwVmlkZW9Qcm9jZXNzQnVmZmVycyh2b2lkICopOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9RQ2FtZXJhMkZhY3RvcnkuY3BwIGIvbXNtY29iYWx0L1FDYW1lcmEyL1FDYW1lcmEyRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiMDUxYQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9RQ2FtZXJhMkZhY3RvcnkuY3BwCkBAIC0wLDAgKzEsNjM1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYTJGYWN0b3J5IgorCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2lmZGVmIFFDQU1FUkFfSEFMMV9TVVBQT1JUCisjaW5jbHVkZSAiY2FtZXJhLmgiCisjaW5jbHVkZSAiSEFML1FDYW1lcmEySFdJLmgiCisjaW5jbHVkZSAiUUNhbWVyYU11eGVyLmgiCisjZW5kaWYKKworI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTMuaCIKKyNpbmNsdWRlICJIQUwzL1FDYW1lcmEzSFdJLmgiCisjaW5jbHVkZSAidXRpbC9RQ2FtZXJhRmxhc2guaCIKKyNpbmNsdWRlICJRQ2FtZXJhMkZhY3RvcnkuaCIKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKK30KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworUUNhbWVyYTJGYWN0b3J5ICpnUUNhbWVyYTJGYWN0b3J5ID0gTlVMTDsKK3B0aHJlYWRfbXV0ZXhfdCBnQ2FtTG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisjaWZkZWYgUUNBTUVSQV9IQUwxX1NVUFBPUlQKK1FDYW1lcmFNdXhlciAqZ1FDYW1lcmFNdXhlciA9IE5VTEw7CisjZW5kaWYKKworLy9Ub3RhbCBudW1iZXIgb2YgY2FtZXJhcyBvcGVuZWQgc2ltdWx0YW5lb3VzbHkuCisvL1RoaXMgdmFyaWFibGUgdXBkYXRpb24gaXMgcHJvdGVjdGVkIGJ5IGdDYW1Mb2NrLgordWludDhfdCBnTnVtQ2FtZXJhU2Vzc2lvbnMgPSAwOworCit2b2xhdGlsZSB1aW50MzJfdCBnS3BpRGVidWdMZXZlbCA9IDE7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYTJGYWN0b3J5CisgKgorICogREVTQ1JJUFRJT046IGRlZmF1bHQgY29uc3RydWN0b3Igb2YgUUNhbWVyYTJGYWN0b3J5CisgKgorICogUEFSQU1FVEVSUyA6IG5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhMkZhY3Rvcnk6OlFDYW1lcmEyRmFjdG9yeSgpCit7CisgICAgbUhhbERlc2NyaXB0b3JzID0gTlVMTDsKKyAgICBtQ2FsbGJhY2tzID0gTlVMTDsKKyAgICBtTnVtT2ZDYW1lcmFzID0gZ2V0X251bV9vZl9jYW1lcmFzKCk7CisgICAgaW50IGJEdWFsQ2FtZXJhID0gMDsKKyAgICBjaGFyIHByb3BEZWZhdWx0W1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5IQUwzLmVuYWJsZWQiLCBwcm9wLCAiMSIpOworICAgIGludCBpc0hBTDNFbmFibGVkID0gYXRvaShwcm9wKTsKKyNpZm5kZWYgUUNBTUVSQV9IQUwxX1NVUFBPUlQKKyAgICBpc0hBTDNFbmFibGVkID0gMTsKKyNlbmRpZgorCisgICAgLy8gU2lnbmlmaWVzIHdoZXRoZXIgc3lzdGVtIGhhcyB0byBlbmFibGUgZHVhbCBjYW1lcmEgbW9kZQorICAgIHNucHJpbnRmKHByb3BEZWZhdWx0LCBQUk9QRVJUWV9WQUxVRV9NQVgsICIlZCIsIGlzRHVhbENhbUF2YWlsYWJsZShpc0hBTDNFbmFibGVkKSk7CisgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5kdWFsLmNhbWVyYSIsIHByb3AsIHByb3BEZWZhdWx0KTsKKyAgICBiRHVhbENhbWVyYSA9IGF0b2kocHJvcCk7CisgICAgTE9HSCgiZHVhbENhbWVyYTolZCAiLCBiRHVhbENhbWVyYSk7CisjaWZuZGVmIFFDQU1FUkFfSEFMMV9TVVBQT1JUCisgICAgYkR1YWxDYW1lcmEgPSAwOworI2VuZGlmCisKKyAgICBpZihiRHVhbENhbWVyYSkgeworICAgICAgICBMT0dJKCJFbmFibGluZyBRQ2FtZXJhIE11eGVyIik7CisjaWZkZWYgUUNBTUVSQV9IQUwxX1NVUFBPUlQKKyAgICAgICAgaWYgKCFnUUNhbWVyYU11eGVyKSB7CisgICAgICAgICAgICBRQ2FtZXJhTXV4ZXI6OmdldENhbWVyYU11eGVyKCZnUUNhbWVyYU11eGVyLCBtTnVtT2ZDYW1lcmFzKTsKKyAgICAgICAgICAgIGlmICghZ1FDYW1lcmFNdXhlcikgeworICAgICAgICAgICAgICAgIExPR0UoIkVycm9yICEhIEZhaWxlZCB0byBnZXQgUUNhbWVyYU11eGVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyNpZmRlZiBRQ0FNRVJBX0hBTDFfU1VQUE9SVAorICAgIGlmICghZ1FDYW1lcmFNdXhlciAmJiAobU51bU9mQ2FtZXJhcyA+IDApICYmKG1OdW1PZkNhbWVyYXMgPD0gTU1fQ0FNRVJBX01BWF9OVU1fU0VOU09SUykpIHsKKyNlbHNlCisgICAgaWYgKChtTnVtT2ZDYW1lcmFzID4gMCkgJiYobU51bU9mQ2FtZXJhcyA8PSBNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTKSkgeworI2VuZGlmCisgICAgICAgIG1IYWxEZXNjcmlwdG9ycyA9IG5ldyBoYWxfZGVzY1ttTnVtT2ZDYW1lcmFzXTsKKyAgICAgICAgaWYgKCBOVUxMICE9IG1IYWxEZXNjcmlwdG9ycykgeworICAgICAgICAgICAgdWludDMyX3QgY2FtZXJhSWQgPSAwOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1PZkNhbWVyYXMgOyBpKyssIGNhbWVyYUlkKyspIHsKKyAgICAgICAgICAgICAgICBtSGFsRGVzY3JpcHRvcnNbaV0uY2FtZXJhSWQgPSBjYW1lcmFJZDsKKyAgICAgICAgICAgICAgICAvLyBTZXQgRGV2aWNlIHZlcnNpb24gdG8gMy54IHdoZW4gYm90aCBIQUwzIGlzIGVuYWJsZWQgJiBpdHMgQkFZRVIgc2Vuc29yCisgICAgICAgICAgICAgICAgaWYgKGlzSEFMM0VuYWJsZWQgJiYgIShpc195dXZfc2Vuc29yKGNhbWVyYUlkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhhbERlc2NyaXB0b3JzW2ldLmRldmljZV92ZXJzaW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtSGFsRGVzY3JpcHRvcnNbaV0uZGV2aWNlX3ZlcnNpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIk5vdCBlbm91Z2ggcmVzb3VyY2VzIHRvIGFsbG9jYXRlIEhBTCBkZXNjcmlwdG9yIHRhYmxlISIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HSSgiJWQgY2FtZXJhIGRldmljZXMgZGV0ZWN0ZWQhIiwgbU51bU9mQ2FtZXJhcyk7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhMkZhY3RvcnkKKyAqCisgKiBERVNDUklQVElPTjogZGVjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhMkZhY3RvcnkKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmEyRmFjdG9yeTo6flFDYW1lcmEyRmFjdG9yeSgpCit7CisgICAgaWYgKCBOVUxMICE9IG1IYWxEZXNjcmlwdG9ycyApIHsKKyAgICAgICAgZGVsZXRlIFtdIG1IYWxEZXNjcmlwdG9yczsKKyAgICB9CisjaWZkZWYgUUNBTUVSQV9IQUwxX1NVUFBPUlQKKyAgICBpZiAoZ1FDYW1lcmFNdXhlcikgeworICAgICAgICBkZWxldGUgZ1FDYW1lcmFNdXhlcjsKKyAgICAgICAgZ1FDYW1lcmFNdXhlciA9IE5VTEw7CisgICAgfQorI2VuZGlmCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0X251bWJlcl9vZl9jYW1lcmFzCisgKgorICogREVTQ1JJUFRJT046IHN0YXRpYyBmdW5jdGlvbiB0byBxdWVyeSBudW1iZXIgb2YgY2FtZXJhcyBkZXRlY3RlZAorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG51bWJlciBvZiBjYW1lcmFzIGRldGVjdGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkZhY3Rvcnk6OmdldF9udW1iZXJfb2ZfY2FtZXJhcygpCit7CisgICAgaW50IG51bUNhbWVyYXMgPSAwOworCisgICAgaWYgKCFnUUNhbWVyYTJGYWN0b3J5KSB7CisgICAgICAgIGdRQ2FtZXJhMkZhY3RvcnkgPSBuZXcgUUNhbWVyYTJGYWN0b3J5KCk7CisgICAgICAgIGlmICghZ1FDYW1lcmEyRmFjdG9yeSkgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIENhbWVyYTJGYWN0b3J5IG9iamVjdCIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgUUNBTUVSQV9IQUwxX1NVUFBPUlQKKyAgICBpZihnUUNhbWVyYU11eGVyKQorICAgICAgICBudW1DYW1lcmFzID0gZ1FDYW1lcmFNdXhlci0+Z2V0X251bWJlcl9vZl9jYW1lcmFzKCk7CisgICAgZWxzZQorI2VuZGlmCisgICAgICAgIG51bUNhbWVyYXMgPSBnUUNhbWVyYTJGYWN0b3J5LT5nZXROdW1iZXJPZkNhbWVyYXMoKTsKKworICAgIExPR0goIm51bSBvZiBjYW1lcmFzOiAlZCIsIG51bUNhbWVyYXMpOworICAgIHJldHVybiBudW1DYW1lcmFzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldF9jYW1lcmFfaW5mbworICoKKyAqIERFU0NSSVBUSU9OOiBzdGF0aWMgZnVuY3Rpb24gdG8gcXVlcnkgY2FtZXJhIGluZm9ybWF0aW9uIHdpdGggaXRzIElECisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaWQgOiBjYW1lcmEgSUQKKyAqICAgQGluZm8gICAgICA6IHB0ciB0byBjYW1lcmEgaW5mbyBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJGYWN0b3J5OjpnZXRfY2FtZXJhX2luZm8oaW50IGNhbWVyYV9pZCwgc3RydWN0IGNhbWVyYV9pbmZvICppbmZvKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworI2lmZGVmIFFDQU1FUkFfSEFMMV9TVVBQT1JUCisgICAgaWYoZ1FDYW1lcmFNdXhlcikKKyAgICAgICAgcmMgPSBnUUNhbWVyYU11eGVyLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhX2lkLCBpbmZvKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgcmMgPSAgZ1FDYW1lcmEyRmFjdG9yeS0+Z2V0Q2FtZXJhSW5mbyhjYW1lcmFfaWQsIGluZm8pOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldF9jYWxsYmFja3MKKyAqCisgKiBERVNDUklQVElPTjogc3RhdGljIGZ1bmN0aW9uIHRvIHNldCBjYWxsYmFja3MgZnVuY3Rpb24gdG8gY2FtZXJhIG1vZHVsZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FsbGJhY2tzIDogcHRyIHRvIGNhbGxiYWNrIGZ1bmN0aW9ucworICoKKyAqIFJFVFVSTiAgICAgOiBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IFFDYW1lcmEyRmFjdG9yeTo6c2V0X2NhbGxiYWNrcyhjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190ICpjYWxsYmFja3MpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisjaWZkZWYgUUNBTUVSQV9IQUwxX1NVUFBPUlQKKyAgICBpZihnUUNhbWVyYU11eGVyKQorICAgICAgICByYyA9IGdRQ2FtZXJhTXV4ZXItPnNldF9jYWxsYmFja3MoY2FsbGJhY2tzKTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgcmMgPSAgZ1FDYW1lcmEyRmFjdG9yeS0+c2V0Q2FsbGJhY2tzKGNhbGxiYWNrcyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogb3Blbl9sZWdhY3kKKyAqCisgKiBERVNDUklQVElPTjogRnVuY3Rpb24gdG8gb3BlbiBvbGRlciBoYWwgdmVyc2lvbiBpbXBsZW1lbnRhdGlvbgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAaHdfZGV2aWNlIDogcHRyIHRvIHN0cnVjdCBzdG9yaW5nIGNhbWVyYSBoYXJkd2FyZSBkZXZpY2UgaW5mbworICogICBAY2FtZXJhX2lkIDogY2FtZXJhIElECisgKiAgIEBoYWxWZXJzaW9uOiBCYXNlZCBvbiBjYW1lcmFfbW9kdWxlX3QuY29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbgorICoKKyAqIFJFVFVSTiAgICAgOiAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJGYWN0b3J5OjpvcGVuX2xlZ2FjeShjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QqIG1vZHVsZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGlkLCB1aW50MzJfdCBoYWxWZXJzaW9uLCBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBkZXZpY2UpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisgICAgaWYgKG1vZHVsZSAhPSAmSEFMX01PRFVMRV9JTkZPX1NZTS5jb21tb24pIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBtb2R1bGUuIFRyeWluZyB0byBvcGVuICVwLCBleHBlY3QgJXAiLAorICAgICAgICAgICAgbW9kdWxlLCAmSEFMX01PRFVMRV9JTkZPX1NZTS5jb21tb24pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmICghaWQpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBjYW1lcmEgaWQiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisjaWZkZWYgUUNBTUVSQV9IQUwxX1NVUFBPUlQKKyAgICBpZihnUUNhbWVyYU11eGVyKQorICAgICAgICByYyA9ICBnUUNhbWVyYU11eGVyLT5vcGVuX2xlZ2FjeShtb2R1bGUsIGlkLCBoYWxWZXJzaW9uLCBkZXZpY2UpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgICByYyA9ICBnUUNhbWVyYTJGYWN0b3J5LT5vcGVuTGVnYWN5KGF0b2koaWQpLCBoYWxWZXJzaW9uLCBkZXZpY2UpOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldF90b3JjaF9tb2RlCisgKgorICogREVTQ1JJUFRJT046IEF0dGVtcHQgdG8gdHVybiBvbiBvciBvZmYgdGhlIHRvcmNoIG1vZGUgb2YgdGhlIGZsYXNoIHVuaXQuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaWQgOiBjYW1lcmEgSUQKKyAqICAgQG9uICAgICAgICA6IEluZGljYXRlcyB3aGV0aGVyIHRvIHR1cm4gdGhlIGZsYXNoIG9uIG9yIG9mZgorICoKKyAqIFJFVFVSTiAgICAgOiAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJGYWN0b3J5OjpzZXRfdG9yY2hfbW9kZShjb25zdCBjaGFyKiBjYW1lcmFfaWQsIGJvb2wgb24pCit7CisgICAgcmV0dXJuIGdRQ2FtZXJhMkZhY3RvcnktPnNldFRvcmNoTW9kZShjYW1lcmFfaWQsIG9uKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXROdW1iZXJPZkNhbWVyYXMKKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgbnVtYmVyIG9mIGNhbWVyYXMgZGV0ZWN0ZWQKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBudW1iZXIgb2YgY2FtZXJhcyBkZXRlY3RlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJGYWN0b3J5OjpnZXROdW1iZXJPZkNhbWVyYXMoKQoreworICAgIHJldHVybiBtTnVtT2ZDYW1lcmFzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldENhbWVyYUluZm8KKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgY2FtZXJhIGluZm9ybWF0aW9uIHdpdGggaXRzIElECisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaWQgOiBjYW1lcmEgSUQKKyAqICAgQGluZm8gICAgICA6IHB0ciB0byBjYW1lcmEgaW5mbyBzdHJ1Y3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJGYWN0b3J5OjpnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFfaWQsIHN0cnVjdCBjYW1lcmFfaW5mbyAqaW5mbykKK3sKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoIW1OdW1PZkNhbWVyYXMgfHwgY2FtZXJhX2lkID49IG1OdW1PZkNhbWVyYXMgfHwgIWluZm8gfHwKKyAgICAgICAgKGNhbWVyYV9pZCA8IDApKSB7CisgICAgICAgIExPR0UoIkVycm9yIGdldHRpbmcgY2FtZXJhIGluZm8hISBtTnVtT2ZDYW1lcmFzID0gJWQsIgorICAgICAgICAgICAgICAgICJjYW1lcmFfaWQgPSAlZCwgaW5mbyA9ICVwIiwKKyAgICAgICAgICAgICAgICAgbU51bU9mQ2FtZXJhcywgY2FtZXJhX2lkLCBpbmZvKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgaWYgKCBOVUxMID09IG1IYWxEZXNjcmlwdG9ycyApIHsKKyAgICAgICAgTE9HRSgiSGFsIGRlc2NyaXB0b3IgdGFibGUgaXMgbm90IGluaXRpYWxpemVkISIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBMT0dJKCJDYW1lcmEgaWQgJWQgQVBJIHZlcnNpb24gJWQiLAorICAgICAgICAgICAgY2FtZXJhX2lkLCBtSGFsRGVzY3JpcHRvcnNbY2FtZXJhX2lkXS5kZXZpY2VfdmVyc2lvbik7CisKKyAgICAvLyBOZWVkIEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUgcHJvcGVydHkgZm9yIGZsYXNobGlnaHQgd2lkZ2V0IHRvCisgICAgLy8gd29yayBhbmQgc28gZ2V0IHRoZSBzdGF0aWMgZGF0YSByZWdhcmRsZXNzIG9mIEhBTCB2ZXJzaW9uCisgICAgcmMgPSBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlOjpnZXRDYW1JbmZvKAorICAgICAgICAgICAgbUhhbERlc2NyaXB0b3JzW2NhbWVyYV9pZF0uY2FtZXJhSWQsIGluZm8pOworICAgIGlmIChtSGFsRGVzY3JpcHRvcnNbY2FtZXJhX2lkXS5kZXZpY2VfdmVyc2lvbiA9PQorICAgICAgICAgICAgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApIHsKKyAgICAgICAgaW5mby0+ZGV2aWNlX3ZlcnNpb24gPSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNldENhbGxiYWNrcworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgY2FsbGJhY2sgZnVuY3Rpb25zIHRvIHNlbmQgYXN5bmNocm9ub3VzIG5vdGlmaWNhdGlvbnMgdG8KKyAqICAgICAgICAgICAgICBmcmFtZXdvcmtzLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FsbGJhY2tzIDogY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorICoKKyAqIFJFVFVSTiAgICAgOgorICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJGYWN0b3J5OjpzZXRDYWxsYmFja3MoY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCAqY2FsbGJhY2tzKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIG1DYWxsYmFja3MgPSBjYWxsYmFja3M7CisKKyAgICByYyA9IFFDYW1lcmFGbGFzaDo6Z2V0SW5zdGFuY2UoKS5yZWdpc3RlckNhbGxiYWNrcyhjYWxsYmFja3MpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byByZWdpc3RlciBjYWxsYmFja3Mgd2l0aCBmbGFzaCBtb2R1bGUhIik7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhbWVyYURldmljZU9wZW4KKyAqCisgKiBERVNDUklQVElPTjogb3BlbiBhIGNhbWVyYSBkZXZpY2Ugd2l0aCBpdHMgSUQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9pZCA6IGNhbWVyYSBJRAorICogICBAaHdfZGV2aWNlIDogcHRyIHRvIHN0cnVjdCBzdG9yaW5nIGNhbWVyYSBoYXJkd2FyZSBkZXZpY2UgaW5mbworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkZhY3Rvcnk6OmNhbWVyYURldmljZU9wZW4oaW50IGNhbWVyYV9pZCwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGh3X2RldmljZV90ICoqaHdfZGV2aWNlKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworICAgIGlmIChjYW1lcmFfaWQgPCAwIHx8IGNhbWVyYV9pZCA+PSBtTnVtT2ZDYW1lcmFzKQorICAgICAgICByZXR1cm4gLUVOT0RFVjsKKworICAgIGlmICggTlVMTCA9PSBtSGFsRGVzY3JpcHRvcnMgKSB7CisgICAgICAgIExPR0UoIkhhbCBkZXNjcmlwdG9yIHRhYmxlIGlzIG5vdCBpbml0aWFsaXplZCEiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgTE9HSSgiT3BlbiBjYW1lcmEgaWQgJWQgQVBJIHZlcnNpb24gJWQiLAorICAgICAgICAgICAgY2FtZXJhX2lkLCBtSGFsRGVzY3JpcHRvcnNbY2FtZXJhX2lkXS5kZXZpY2VfdmVyc2lvbik7CisKKyAgICBpZiAoIG1IYWxEZXNjcmlwdG9yc1tjYW1lcmFfaWRdLmRldmljZV92ZXJzaW9uID09IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wICkgeworICAgICAgICBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlICpodyA9IG5ldyBRQ2FtZXJhM0hhcmR3YXJlSW50ZXJmYWNlKG1IYWxEZXNjcmlwdG9yc1tjYW1lcmFfaWRdLmNhbWVyYUlkLAorICAgICAgICAgICAgICAgIG1DYWxsYmFja3MpOworICAgICAgICBpZiAoIWh3KSB7CisgICAgICAgICAgICBMT0dFKCJBbGxvY2F0aW9uIG9mIGhhcmR3YXJlIGludGVyZmFjZSBmYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBody0+b3BlbkNhbWVyYShod19kZXZpY2UpOworICAgICAgICBpZiAocmMgIT0gMCkgeworICAgICAgICAgICAgZGVsZXRlIGh3OworICAgICAgICB9CisgICAgfQorI2lmZGVmIFFDQU1FUkFfSEFMMV9TVVBQT1JUCisgICAgZWxzZSBpZiAobUhhbERlc2NyaXB0b3JzW2NhbWVyYV9pZF0uZGV2aWNlX3ZlcnNpb24gPT0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApIHsKKyAgICAgICAgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSAqaHcgPSBuZXcgUUNhbWVyYTJIYXJkd2FyZUludGVyZmFjZSgodWludDMyX3QpY2FtZXJhX2lkKTsKKyAgICAgICAgaWYgKCFodykgeworICAgICAgICAgICAgTE9HRSgiQWxsb2NhdGlvbiBvZiBoYXJkd2FyZSBpbnRlcmZhY2UgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIHJjID0gaHctPm9wZW5DYW1lcmEoaHdfZGV2aWNlKTsKKyAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBkZWxldGUgaHc7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgTE9HRSgiRGV2aWNlIHZlcnNpb24gZm9yIGNhbWVyYSBpZCAlZCBpbnZhbGlkICVkIiwKKyAgICAgICAgICAgICAgY2FtZXJhX2lkLAorICAgICAgICAgICAgICBtSGFsRGVzY3JpcHRvcnNbY2FtZXJhX2lkXS5kZXZpY2VfdmVyc2lvbik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNhbWVyYV9kZXZpY2Vfb3BlbgorICoKKyAqIERFU0NSSVBUSU9OOiBzdGF0aWMgZnVuY3Rpb24gdG8gb3BlbiBhIGNhbWVyYSBkZXZpY2UgYnkgaXRzIElECisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaWQgOiBjYW1lcmEgSUQKKyAqICAgQGh3X2RldmljZSA6IHB0ciB0byBzdHJ1Y3Qgc3RvcmluZyBjYW1lcmEgaGFyZHdhcmUgZGV2aWNlIGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJGYWN0b3J5OjpjYW1lcmFfZGV2aWNlX29wZW4oCisgICAgY29uc3Qgc3RydWN0IGh3X21vZHVsZV90ICptb2R1bGUsIGNvbnN0IGNoYXIgKmlkLAorICAgIHN0cnVjdCBod19kZXZpY2VfdCAqKmh3X2RldmljZSkKK3sKKyAgICBpbnQgcmMgPSBOT19FUlJPUjsKKyAgICBpZiAobW9kdWxlICE9ICZIQUxfTU9EVUxFX0lORk9fU1lNLmNvbW1vbikgeworICAgICAgICBMT0dFKCJJbnZhbGlkIG1vZHVsZS4gVHJ5aW5nIHRvIG9wZW4gJXAsIGV4cGVjdCAlcCIsCisgICAgICAgICAgICBtb2R1bGUsICZIQUxfTU9EVUxFX0lORk9fU1lNLmNvbW1vbik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKCFpZCkgeworICAgICAgICBMT0dFKCJJbnZhbGlkIGNhbWVyYSBpZCIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyNpZmRlZiBRQ0FNRVJBX0hBTDFfU1VQUE9SVAorICAgIGlmKGdRQ2FtZXJhTXV4ZXIpCisgICAgICAgIHJjID0gIGdRQ2FtZXJhTXV4ZXItPmNhbWVyYV9kZXZpY2Vfb3Blbihtb2R1bGUsIGlkLCBod19kZXZpY2UpOworICAgIGVsc2UKKyNlbmRpZgorICAgICAgICByYyA9IGdRQ2FtZXJhMkZhY3RvcnktPmNhbWVyYURldmljZU9wZW4oYXRvaShpZCksIGh3X2RldmljZSk7CisgICAgcmV0dXJuIHJjOworfQorCitzdHJ1Y3QgaHdfbW9kdWxlX21ldGhvZHNfdCBRQ2FtZXJhMkZhY3Rvcnk6Om1Nb2R1bGVNZXRob2RzID0geworICAgIC5vcGVuID0gUUNhbWVyYTJGYWN0b3J5OjpjYW1lcmFfZGV2aWNlX29wZW4sCit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG9wZW5MZWdhY3kKKyAqCisgKiBERVNDUklQVElPTjogRnVuY3Rpb24gdG8gb3BlbiBvbGRlciBoYWwgdmVyc2lvbiBpbXBsZW1lbnRhdGlvbgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2lkIDogY2FtZXJhIElECisgKiAgIEBoYWxWZXJzaW9uOiBCYXNlZCBvbiBjYW1lcmFfbW9kdWxlX3QuY29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbgorICogICBAaHdfZGV2aWNlIDogcHRyIHRvIHN0cnVjdCBzdG9yaW5nIGNhbWVyYSBoYXJkd2FyZSBkZXZpY2UgaW5mbworICoKKyAqIFJFVFVSTiAgICAgOiAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYTJGYWN0b3J5OjpvcGVuTGVnYWN5KAorICAgICAgICBpbnQzMl90IGNhbWVyYUlkLCB1aW50MzJfdCBoYWxWZXJzaW9uLCBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBod19kZXZpY2UpCit7CisgICAgaW50IHJjID0gTk9fRVJST1I7CisKKyAgICBMT0dJKCJvcGVuTGVnYWN5IGhhbFZlcnNpb246ICVkIiwgaGFsVmVyc2lvbik7CisgICAgLy9Bc3N1bXB0aW9uOiBhbGwgY2FtZXJhcyBjYW4gc3VwcG9ydCBsZWdhY3kgQVBJIHZlcnNpb24KKyAgICBpZiAoY2FtZXJhSWQgPCAwIHx8IGNhbWVyYUlkID49IGdRQ2FtZXJhMkZhY3RvcnktPmdldE51bWJlck9mQ2FtZXJhcygpKQorICAgICAgICByZXR1cm4gLUVOT0RFVjsKKworICAgIHN3aXRjaChoYWxWZXJzaW9uKQorICAgIHsKKyNpZmRlZiBRQ0FNRVJBX0hBTDFfU1VQUE9SVAorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgorICAgICAgICB7CisgICAgICAgICAgICBRQ2FtZXJhMkhhcmR3YXJlSW50ZXJmYWNlICpodyA9CisgICAgICAgICAgICAgICAgbmV3IFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2UoKHVpbnQzMl90KWNhbWVyYUlkKTsKKyAgICAgICAgICAgIGlmICghaHcpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJBbGxvY2F0aW9uIG9mIGhhcmR3YXJlIGludGVyZmFjZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmMgPSBody0+b3BlbkNhbWVyYShod19kZXZpY2UpOworICAgICAgICAgICAgaWYgKHJjICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIGh3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRSgiRGV2aWNlIEFQSSB2ZXJzaW9uOiAlZCBmb3IgY2FtZXJhIGlkICVkIGludmFsaWQiLAorICAgICAgICAgICAgICAgICBoYWxWZXJzaW9uLCBjYW1lcmFJZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRUb3JjaE1vZGUKKyAqCisgKiBERVNDUklQVElPTjogQXR0ZW1wdCB0byB0dXJuIG9uIG9yIG9mZiB0aGUgdG9yY2ggbW9kZSBvZiB0aGUgZmxhc2ggdW5pdC4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9pZCA6IGNhbWVyYSBJRAorICogICBAb24gICAgICAgIDogSW5kaWNhdGVzIHdoZXRoZXIgdG8gdHVybiB0aGUgZmxhc2ggb24gb3Igb2ZmCisgKgorICogUkVUVVJOICAgICA6IDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBRQ2FtZXJhMkZhY3Rvcnk6OnNldFRvcmNoTW9kZShjb25zdCBjaGFyKiBjYW1lcmFfaWQsIGJvb2wgb24pCit7CisgICAgaW50IHJldFZhbCgwKTsKKyAgICBsb25nIGNhbWVyYUlkTG9uZygtMSk7CisgICAgaW50IGNhbWVyYUlkSW50KC0xKTsKKyAgICBjaGFyKiBlbmRQb2ludGVyID0gTlVMTDsKKyAgICBlcnJubyA9IDA7CisgICAgUUNhbWVyYUZsYXNoJiBmbGFzaCA9IFFDYW1lcmFGbGFzaDo6Z2V0SW5zdGFuY2UoKTsKKworICAgIGNhbWVyYUlkTG9uZyA9IHN0cnRvbChjYW1lcmFfaWQsICZlbmRQb2ludGVyLCAxMCk7CisKKyAgICBpZiAoKGVycm5vID09IEVSQU5HRSkgfHwKKyAgICAgICAgICAgIChjYW1lcmFJZExvbmcgPCAwKSB8fAorICAgICAgICAgICAgKGNhbWVyYUlkTG9uZyA+PSBzdGF0aWNfY2FzdDxsb25nPihnZXRfbnVtYmVyX29mX2NhbWVyYXMoKSkpIHx8CisgICAgICAgICAgICAoZW5kUG9pbnRlciA9PSBjYW1lcmFfaWQpIHx8CisgICAgICAgICAgICAoKmVuZFBvaW50ZXIgIT0gJ1wwJykpIHsKKyAgICAgICAgcmV0VmFsID0gLUVJTlZBTDsKKyAgICB9IGVsc2UgaWYgKG9uKSB7CisgICAgICAgIGNhbWVyYUlkSW50ID0gc3RhdGljX2Nhc3Q8aW50PihjYW1lcmFJZExvbmcpOworICAgICAgICByZXRWYWwgPSBmbGFzaC5pbml0Rmxhc2goY2FtZXJhSWRJbnQpOworCisgICAgICAgIGlmIChyZXRWYWwgPT0gMCkgeworICAgICAgICAgICAgcmV0VmFsID0gZmxhc2guc2V0Rmxhc2hNb2RlKGNhbWVyYUlkSW50LCBvbik7CisgICAgICAgICAgICBpZiAoKHJldFZhbCA9PSAwKSAmJiAobUNhbGxiYWNrcyAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09OKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0VmFsID09IC1FQUxSRUFEWSkgeworICAgICAgICAgICAgICAgIC8vIEZsYXNoIGlzIGFscmVhZHkgb24sIHNvIHRyZWF0IHRoaXMgYXMgYSBzdWNjZXNzLgorICAgICAgICAgICAgICAgIHJldFZhbCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjYW1lcmFJZEludCA9IHN0YXRpY19jYXN0PGludD4oY2FtZXJhSWRMb25nKTsKKyAgICAgICAgcmV0VmFsID0gZmxhc2guc2V0Rmxhc2hNb2RlKGNhbWVyYUlkSW50LCBvbik7CisKKyAgICAgICAgaWYgKHJldFZhbCA9PSAwKSB7CisgICAgICAgICAgICByZXRWYWwgPSBmbGFzaC5kZWluaXRGbGFzaChjYW1lcmFJZEludCk7CisgICAgICAgICAgICBpZiAoKHJldFZhbCA9PSAwKSAmJiAobUNhbGxiYWNrcyAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09GRik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmV0VmFsID09IC1FQUxSRUFEWSkgeworICAgICAgICAgICAgLy8gRmxhc2ggaXMgYWxyZWFkeSBvZmYsIHNvIHRyZWF0IHRoaXMgYXMgYSBzdWNjZXNzLgorICAgICAgICAgICAgcmV0VmFsID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXRWYWw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaXNEdWFsQ2FtQXZhaWxhYmxlCisgKgorICogREVTQ1JJUFRJT046IEZ1bmN0aW9uIHRvIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBkdWFsIENhbWVyYSBIVyBhdmFpbGFibGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGhhbDNFbmFibGVkIDogSEFMMyBlbmFibGUgZmxhZworICoKKyAqIFJFVFVSTiAgICAgOiBib29sIC0gdHJ1ZSA6IGhhdmUgRHVhbCBDYW1lcmEgSFcgYXZhaWxhYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIDogbm90IGhhdmUgRHVhbCBDYW1lcmEgSFcgYXZhaWxhYmxlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYTJGYWN0b3J5Ojppc0R1YWxDYW1BdmFpbGFibGUoaW50IGhhbDNFbmFibGVkKQoreworICAgIGJvb2wgcmMgPSBmYWxzZTsKKyAgICBpbnQgaSA9IDA7CisgICAgY2FtZXJhX2luZm8gaW5mbzsKKyAgICBjYW1fc3luY190eXBlX3QgY2FtX3R5cGUgPSBDQU1fVFlQRV9NQUlOOworCisgICAgZm9yIChpID0gMDsgaSA8IG1OdW1PZkNhbWVyYXM7IGkrKykgeworICAgICAgICBpZiAoIWhhbDNFbmFibGVkKSB7CisjaWZkZWYgUUNBTUVSQV9IQUwxX1NVUFBPUlQKKyAgICAgICAgICAgIFFDYW1lcmEySGFyZHdhcmVJbnRlcmZhY2U6OmdldENhcGFiaWxpdGllcyhpLCAmaW5mbywgJmNhbV90eXBlKTsKKyNlbmRpZgorICAgICAgICB9CisKKyAgICAgICAgaWYoY2FtX3R5cGUgPT0gQ0FNX1RZUEVfQVVYKSB7CisgICAgICAgICAgICBMT0dIKCJIYXZlIER1YWwgQ2FtZXJhIEhXIEF2YWlhYmxlLiIpOworICAgICAgICAgICAgcmMgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisjaWZkZWYgUUNBTUVSQV9IQUwxX1NVUFBPUlQKKyAgICByZXR1cm4gcmM7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQorCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvUUNhbWVyYTJGYWN0b3J5LmggYi9tc21jb2JhbHQvUUNhbWVyYTIvUUNhbWVyYTJGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5MTQzOQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9RQ2FtZXJhMkZhY3RvcnkuaApAQCAtMCwwICsxLDgwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNpZm5kZWYgX19RQ0FNRVJBMkZBQ1RPUllfSF9fCisjZGVmaW5lIF9fUUNBTUVSQTJGQUNUT1JZX0hfXworCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhX2NvbW1vbi5oIgorCituYW1lc3BhY2UgcWNhbWVyYSB7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjYW1lcmFJZDsKKyAgICB1aW50MzJfdCBkZXZpY2VfdmVyc2lvbjsKK30gaGFsX2Rlc2M7CisKK2NsYXNzIFFDYW1lcmEyRmFjdG9yeQoreworcHVibGljOgorICAgIFFDYW1lcmEyRmFjdG9yeSgpOworICAgIHZpcnR1YWwgflFDYW1lcmEyRmFjdG9yeSgpOworCisgICAgc3RhdGljIGludCBnZXRfbnVtYmVyX29mX2NhbWVyYXMoKTsKKyAgICBzdGF0aWMgaW50IGdldF9jYW1lcmFfaW5mbyhpbnQgY2FtZXJhX2lkLCBzdHJ1Y3QgY2FtZXJhX2luZm8gKmluZm8pOworICAgIHN0YXRpYyBpbnQgc2V0X2NhbGxiYWNrcyhjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190ICpjYWxsYmFja3MpOworICAgIHN0YXRpYyBpbnQgb3Blbl9sZWdhY3koY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBpZCwgdWludDMyX3QgaGFsVmVyc2lvbiwgc3RydWN0IGh3X2RldmljZV90KiogZGV2aWNlKTsKKyAgICBzdGF0aWMgaW50IHNldF90b3JjaF9tb2RlKGNvbnN0IGNoYXIqIGNhbWVyYV9pZCwgYm9vbCBvbik7CisgICAgYm9vbCBpc0R1YWxDYW1BdmFpbGFibGUoaW50IGhhbDNFbmFibGVkKTsKKworcHJpdmF0ZToKKyAgICBpbnQgZ2V0TnVtYmVyT2ZDYW1lcmFzKCk7CisgICAgaW50IGdldENhbWVyYUluZm8oaW50IGNhbWVyYV9pZCwgc3RydWN0IGNhbWVyYV9pbmZvICppbmZvKTsKKyAgICBpbnQgc2V0Q2FsbGJhY2tzKGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QgKmNhbGxiYWNrcyk7CisgICAgaW50IGNhbWVyYURldmljZU9wZW4oaW50IGNhbWVyYV9pZCwgc3RydWN0IGh3X2RldmljZV90ICoqaHdfZGV2aWNlKTsKKyAgICBzdGF0aWMgaW50IGNhbWVyYV9kZXZpY2Vfb3Blbihjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QgKm1vZHVsZSwgY29uc3QgY2hhciAqaWQsCisgICAgICAgICAgICAgICAgc3RydWN0IGh3X2RldmljZV90ICoqaHdfZGV2aWNlKTsKKyAgICBzdGF0aWMgaW50IG9wZW5MZWdhY3koCisgICAgICAgICAgICBpbnQzMl90IGNhbWVyYUlkLCB1aW50MzJfdCBoYWxWZXJzaW9uLCBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBod19kZXZpY2UpOworICAgIGludCBzZXRUb3JjaE1vZGUoY29uc3QgY2hhciogY2FtZXJhX2lkLCBib29sIG9uKTsKK3B1YmxpYzoKKyAgICBzdGF0aWMgc3RydWN0IGh3X21vZHVsZV9tZXRob2RzX3QgbU1vZHVsZU1ldGhvZHM7CisKK3ByaXZhdGU6CisgICAgaW50IG1OdW1PZkNhbWVyYXM7CisgICAgaGFsX2Rlc2MgKm1IYWxEZXNjcmlwdG9yczsKKyAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190ICptQ2FsbGJhY2tzOworfTsKKworfTsgLypuYW1lc3BhY2UgcWNhbWVyYSovCisKK2V4dGVybiBjYW1lcmFfbW9kdWxlX3QgSEFMX01PRFVMRV9JTkZPX1NZTTsKKworI2VuZGlmIC8qIF9fUUNBTUVSQTJGQUNUT1JZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL1FDYW1lcmEySGFsLmNwcCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9RQ2FtZXJhMkhhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyMDhiYgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9RQ2FtZXJhMkhhbC5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorKiBtZXQ6CisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiUUNhbWVyYTJGYWN0b3J5LmgiCisjaW5jbHVkZSAiSEFMMy9RQ2FtZXJhM1ZlbmRvclRhZ3MuaCIKKworc3RhdGljIGh3X21vZHVsZV90IGNhbWVyYV9jb21tb24gPSB7CisgICAgLnRhZyAgICAgICAgICAgICAgICAgICAgPSBIQVJEV0FSRV9NT0RVTEVfVEFHLAorICAgIC5tb2R1bGVfYXBpX3ZlcnNpb24gICAgID0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzQsCisgICAgLmhhbF9hcGlfdmVyc2lvbiAgICAgICAgPSBIQVJEV0FSRV9IQUxfQVBJX1ZFUlNJT04sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICAgPSBDQU1FUkFfSEFSRFdBUkVfTU9EVUxFX0lELAorICAgIC5uYW1lICAgICAgICAgICAgICAgICAgID0gIlFDYW1lcmEgTW9kdWxlIiwKKyAgICAuYXV0aG9yICAgICAgICAgICAgICAgICA9ICJRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciBJbmMiLAorICAgIC5tZXRob2RzICAgICAgICAgICAgICAgID0gJnFjYW1lcmE6OlFDYW1lcmEyRmFjdG9yeTo6bU1vZHVsZU1ldGhvZHMsCisgICAgLmRzbyAgICAgICAgICAgICAgICAgICAgPSBOVUxMLAorICAgIC5yZXNlcnZlZCAgICAgICAgICAgICAgID0gezB9Cit9OworCitjYW1lcmFfbW9kdWxlX3QgSEFMX01PRFVMRV9JTkZPX1NZTSA9IHsKKyAgICAuY29tbW9uICAgICAgICAgICAgICAgICA9IGNhbWVyYV9jb21tb24sCisgICAgLmdldF9udW1iZXJfb2ZfY2FtZXJhcyAgPSBxY2FtZXJhOjpRQ2FtZXJhMkZhY3Rvcnk6OmdldF9udW1iZXJfb2ZfY2FtZXJhcywKKyAgICAuZ2V0X2NhbWVyYV9pbmZvICAgICAgICA9IHFjYW1lcmE6OlFDYW1lcmEyRmFjdG9yeTo6Z2V0X2NhbWVyYV9pbmZvLAorICAgIC5zZXRfY2FsbGJhY2tzICAgICAgICAgID0gcWNhbWVyYTo6UUNhbWVyYTJGYWN0b3J5OjpzZXRfY2FsbGJhY2tzLAorICAgIC5nZXRfdmVuZG9yX3RhZ19vcHMgICAgID0gcWNhbWVyYTo6UUNhbWVyYTNWZW5kb3JUYWdzOjpnZXRfdmVuZG9yX3RhZ19vcHMsCisgICAgLm9wZW5fbGVnYWN5ICAgICAgICAgICAgPSBxY2FtZXJhOjpRQ2FtZXJhMkZhY3Rvcnk6Om9wZW5fbGVnYWN5LAorICAgIC5zZXRfdG9yY2hfbW9kZSAgICAgICAgID0gcWNhbWVyYTo6UUNhbWVyYTJGYWN0b3J5OjpzZXRfdG9yY2hfbW9kZSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgICA9IE5VTEwsCisgICAgLnJlc2VydmVkICAgICAgICAgICAgICAgPSB7MH0KK307CmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvUUNhbWVyYUZvcm1hdC5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL1FDYW1lcmFGb3JtYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzg2OWIyCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL1FDYW1lcmFGb3JtYXQuaApAQCAtMCwwICsxLDQ0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorKiBtZXQ6CisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisKKy8qIE1hY3JvcyBleHBvc2VkIHRvIGdyYWxsb2MgdG8gcXVlcnkgY2FtZXJhIEhBTCBmb3IgZ3JhbGxvYyBmb3JtYXQgdG8gYmUKK3VzZWQgZm9yIHZlZG9yIHNwZWNpZmljIGNhbWVyYSBmb3JtYXRzLiAqLworCisjZGVmaW5lIFBSRUZFUlJFRF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEX0NBTUVSQV9GT1JNQVQgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1BfVkVOVVMKKyNkZWZpbmUgUFJFRkVSUkVEX1lDQkNSXzQyMF84ODhfQ0FNRVJBX0ZPUk1BVCBIQUxfUElYRUxfRk9STUFUX05WMjFfWlNMCisKKy8qIE1hY3JvcyBleHBvc2VkIHRvIGNhbWVyYSBIQUwgdG8gZ2V0IHRoZSBwcmV2aWV3IGFuZCBjYWxsYmFjayBzdHJlYW0KK2Zvcm1hdHMuIFBsZWFzZSBlbnN1cmUgdGhhdCBpZiB0aGUgbWFjcm9zIGJlbG93IGFyZSBjaGFuZ2VkIHRoZW4gdGhlCitjb3JyZXNwb25kaW5nIGNoYW5nZSBzaG91bGQgYmUgZG9uZSBpbiB0aGUgYWJvdmUgbWFjcm9zIGFuZCB2aWNlIHZlcnNhCit0byBwcmV2ZW50IGZvcm1hdCBtaXNtYXRjaCBiZXR3ZWVuIEdyYWxsb2MgYW5kIENhbWVyYSBIQUwgZm9yIHN0cmVhbQorYnVmZmVycyAqLworCisjZGVmaW5lIFBSRVZJRVdfU1RSRUFNX0ZPUk1BVCBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9WRU5VUworI2RlZmluZSBDQUxMQkFDS19TVFJFQU1fRk9STUFUIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svQW5kcm9pZC5tayBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNTc0MTcKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svQW5kcm9pZC5tawpAQCAtMCwwICsxLDUgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKExPQ0FMX1BBVEgpL21tLWNhbWVyYS1pbnRlcmZhY2UvQW5kcm9pZC5taworaW5jbHVkZSAkKExPQ0FMX1BBVEgpL21tLWpwZWctaW50ZXJmYWNlL0FuZHJvaWQubWsKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9tbS1qcGVnLWludGVyZmFjZS90ZXN0L0FuZHJvaWQubWsKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9tbS1jYW1lcmEtdGVzdC9BbmRyb2lkLm1rCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svY29tbW9uL2NhbV9pbnRmLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svY29tbW9uL2NhbV9pbnRmLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGI2ZmVjYgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9jb21tb24vY2FtX2ludGYuaApAQCAtMCwwICsxLDEwOTggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1FDQU1FUkFfSU5URl9IX18KKyNkZWZpbmUgX19RQ0FNRVJBX0lOVEZfSF9fCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9tc21iX2lzcC5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiY2FtX3R5cGVzLmgiCisKKyNkZWZpbmUgQ0FNX1BSSVZfSU9DVExfQkFTRSAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgTVNNX0NBTUVSQV9QUklWX0NNRF9NQVgpCit0eXBlZGVmIGVudW0geworICAgIC8qIHNlc3Npb24gYmFzZWQgcGFyYW1ldGVycyAqLworICAgIENBTV9QUklWX1BBUk0gPSBDQU1fUFJJVl9JT0NUTF9CQVNFLAorICAgIC8qIHNlc3Npb24gYmFzZWQgYWN0aW9uOiBkbyBhdXRvIGZvY3VzLiovCisgICAgQ0FNX1BSSVZfRE9fQVVUT19GT0NVUywKKyAgICAvKiBzZXNzaW9uIGJhc2VkIGFjdGlvbjogY2FuY2VsIGF1dG8gZm9jdXMuKi8KKyAgICBDQU1fUFJJVl9DQU5DRUxfQVVUT19GT0NVUywKKyAgICAvKiBzZXNzaW9uIGJhc2VkIGFjdGlvbjogcHJlcGFyZSBmb3Igc25hcHNob3QuKi8KKyAgICBDQU1fUFJJVl9QUkVQQVJFX1NOQVBTSE9ULAorICAgIC8qIHN5bmMgc3RyZWFtIGluZm8uKi8KKyAgICBDQU1fUFJJVl9TVFJFQU1fSU5GT19TWU5DLAorICAgIC8qIHN0cmVhbSBiYXNlZCBwYXJhbWV0ZXJzKi8KKyAgICBDQU1fUFJJVl9TVFJFQU1fUEFSTSwKKyAgICAvKiBzdGFydCBaU0wgc25hcHNob3QuKi8KKyAgICBDQU1fUFJJVl9TVEFSVF9aU0xfU05BUFNIT1QsCisgICAgLyogc3RvcCBaU0wgc25hcHNob3QuKi8KKyAgICBDQU1fUFJJVl9TVE9QX1pTTF9TTkFQU0hPVCwKKyAgICAvKiBldmVudCBmb3IgcmVsYXRlZCBzZW5zb3JzIHN5bmNocm9uaXphdGlvbi4gKi8KKyAgICBDQU1fUFJJVl9TWU5DX1JFTEFURURfU0VOU09SUywKKyAgICAvKiBmbHVzaCAqLworICAgIENBTV9QUklWX0ZMVVNICit9IGNhbV9wcml2YXRlX2lvY3RsX2VudW1fdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICAvKiBzdGFydCBzeW5jaW5nIGZvciByZWxhdGVkIGNhbWVyYXMgKi8KKyAgICBDQU1fU1lOQ19SRUxBVEVEX1NFTlNPUlNfT04gPSAxLAorICAgIC8qIHN0b3Agc3luY2luZyBmb3IgcmVsYXRlZCBjYW1lcmFzICovCisgICAgQ0FNX1NZTkNfUkVMQVRFRF9TRU5TT1JTX09GRgorfSBjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfY29udHJvbF90OworCit0eXBlZGVmIGVudW0geworICAgIC8qIERyaXZpbmcgY2FtZXJhIG9mIHRoZSByZWxhdGVkIGNhbWVyYSBzdWItc3lzdGVtICovCisgICAgLyogQ2VydGFpbiBmZWF0dXJlcyBhcmUgZW5hYmxlZCBvbmx5IGZvciBwcmltYXJ5IGNhbWVyYQorICAgICAgIHN1Y2ggYXMgZGlzcGxheSBtb2RlIGZvciBwcmV2aWV3LCBhdXRvZm9jdXMgZXRjCisgICAgICAgSW4gY2VydGFpbiBjb25maWd1cmF0aW9ucyBmb3IgZWcuIHdoZW4gb3B0aWNhbCB6b29tCisgICAgICAgbGltaXQgaXMgcmVhY2hlZCwgQXV4IENhbWVyYSB3b3VsZCBiZWNvbWUKKyAgICAgICB0aGUgZHJpdmluZyBjYW1lcmEgYW5kIHRoZXJlIHdpbGwgYmUgcm9sZSBzd2l0Y2guKi8KKyAgICBDQU1fTU9ERV9QUklNQVJZID0gMCwKKyAgICAvKiBOb24tZHJpdmluZyBjYW1lcmEgb2YgdGhlIHJlbGF0ZWQgY2FtZXJhIHN1Yi1zeXN0ZW0KKyAgICAgICBubyBkaXNwbGF5IG1vZGUgc2V0IGZvciBzZWNvbmRhcnkgY2FtZXJhICovCisgICAgQ0FNX01PREVfU0VDT05EQVJZCit9IGNhbV9zeW5jX21vZGVfdDsKKworLyogUGF5bG9hZCBmb3Igc2VuZGluZyBidW5kbGluZyBpbmZvIHRvIGJhY2tlbmQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1fc3luY19yZWxhdGVkX3NlbnNvcnNfY29udHJvbF90IHN5bmNfY29udHJvbDsKKyAgICBjYW1fc3luY190eXBlX3QgdHlwZTsKKyAgICBjYW1fc3luY19tb2RlX3QgbW9kZTsKKyAgICBjYW1fM2Ffc3luY19tb2RlX3Qgc3luY18zYV9tb2RlOworICAgIC8qIHNlc3Npb24gSWQgb2YgdGhlIG90aGVyIGNhbWVyYSBzZXNzaW9uCisgICAgICAgTGlua2luZyB3aWxsIGJlIGRvbmUgd2l0aCB0aGlzIHNlc3Npb24gaW4gdGhlCisgICAgICAgYmFja2VuZCAqLworICAgIHVpbnQzMl90IHJlbGF0ZWRfc2Vuc29yX3Nlc3Npb25faWQ7CisgICAgdWludDhfdCBpc19mcmFtZV9zeW5jX2VuYWJsZWQ7Cit9Y2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdDsKKworLyogUmVsYXRlZCBjYW1lcmEgc2Vuc29yIHNwZWNpZmljIGNhbGlicmF0aW9uIGRhdGEgKi8KKy8vIEFsaWduIGJ5dGVzIGFjY29yZGluZyB0byBBUEkgZG9jdW1lbnQuCisjcHJhZ21hIHBhY2soMikKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBGb2NhbCBsZW5ndGggaW4gcGl4ZWxzIEAgY2FsaWJyYXRpb24gcmVzb2x1dGlvbi4qLworICAgIGZsb2F0ICAgICAgIG5vcm1hbGl6ZWRfZm9jYWxfbGVuZ3RoOworICAgIC8qIE5hdGl2ZSBzZW5zb3IgcmVzb2x1dGlvbiBXIHRoYXQgd2FzIHVzZWQgdG8gY2FwdHVyZSBjYWxpYnJhdGlvbiBpbWFnZSAqLworICAgIHVpbnQxNl90ICAgIG5hdGl2ZV9zZW5zb3JfcmVzb2x1dGlvbl93aWR0aDsKKyAgICAvKiBOYXRpdmUgc2Vuc29yIHJlc29sdXRpb24gSCB0aGF0IHdhcyB1c2VkIHRvIGNhcHR1cmUgY2FsaWJyYXRpb24gaW1hZ2UgKi8KKyAgICB1aW50MTZfdCAgICBuYXRpdmVfc2Vuc29yX3Jlc29sdXRpb25faGVpZ2h0OworICAgIC8qIEltYWdlIHNpemUgVyB1c2VkIGludGVybmFsbHkgYnkgY2FsaWJyYXRpb24gdG9vbCAqLworICAgIHVpbnQxNl90ICAgIGNhbGlicmF0aW9uX3NlbnNvcl9yZXNvbHV0aW9uX3dpZHRoOworICAgIC8qIEltYWdlIHNpemUgSCB1c2VkIGludGVybmFsbHkgYnkgY2FsaWJyYXRpb24gdG9vbCAqLworICAgIHVpbnQxNl90ICAgIGNhbGlicmF0aW9uX3NlbnNvcl9yZXNvbHV0aW9uX2hlaWdodDsKKyAgICAvKiBGb2NhbCBsZW5ndGggcmF0aW8gQCBDYWxpYnJhdGlvbiAqLworICAgIGZsb2F0ICAgICAgIGZvY2FsX2xlbmd0aF9yYXRpbzsKK31jYW1fcmVsYXRlZF9zZW5zb3JfY2FsaWJyYXRpb25fZGF0YV90OworI3ByYWdtYSBwYWNrKCkKKworLyogUmVsYXRlZCBDYW1lcmEgU3lzdGVtIENhbGlicmF0aW9uIGRhdGEKKyAgIENhbGlicmF0aW9uIGRhdGEgZm9yIHRoZSBlbnRpcmUgcmVsYXRlZCBjYW0gc3ViLXN5c3RlbSBpcworICAgaW4gYSBzaGFyZWQgRUVQUk9NLiBXZSBoYXZlIDIgZmllbGRzIHdoaWNoIGFyZSBzcGVjaWZpYyB0bworICAgZWFjaCBzZW5zb3IgZm9sbG93ZWQgYnkgYSBzZXQgb2YgY29tbW9uIGNhbGlicmF0aW9uIG9mIHRoZQorICAgZW50aXJlIHJlbGF0ZWQgY2FtIHN5c3RlbSovCisvLyBBbGlnbiBieXRlcyBhY2NvcmRpbmcgdG8gQVBJIGRvY3VtZW50LgorI3ByYWdtYSBwYWNrKDIpCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogVmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIHVpbnQzMl90ICAgIGNhbGlicmF0aW9uX2Zvcm1hdF92ZXJzaW9uOworICAgIC8qIE1haW4gQ2FtZXJhIFNlbnNvciBzcGVjaWZpYyBjYWxpYnJhdGlvbiAqLworICAgIGNhbV9yZWxhdGVkX3NlbnNvcl9jYWxpYnJhdGlvbl9kYXRhX3QgIG1haW5fY2FtX3NwZWNpZmljX2NhbGlicmF0aW9uOworICAgIC8qIEF1eCBDYW1lcmEgU2Vuc29yIHNwZWNpZmljIGNhbGlicmF0aW9uICovCisgICAgY2FtX3JlbGF0ZWRfc2Vuc29yX2NhbGlicmF0aW9uX2RhdGFfdCAgYXV4X2NhbV9zcGVjaWZpY19jYWxpYnJhdGlvbjsKKyAgICAvKiBSZWxhdGl2ZSB2aWV3cG9pbnQgbWF0Y2hpbmcgbWF0cml4IHcuci50IE1haW4gKi8KKyAgICBmbG9hdCAgICAgIHJlbGF0aXZlX3JvdGF0aW9uX21hdHJpeFtSRUxDQU1fQ0FMSUJfUk9UX01BVFJJWF9NQVhdOworICAgIC8qIFJlbGF0aXZlIGdlb21ldHJpYyBzdXJmYWNlIGRlc2NyaXB0aW9uIHBhcmFtZXRlcnMgKi8KKyAgICBmbG9hdCAgICAgIHJlbGF0aXZlX2dlb21ldHJpY19zdXJmYWNlX3BhcmFtZXRlcnNbCisgICAgICAgICAgICBSRUxDQU1fQ0FMSUJfU1VSRkFDRV9QQVJNU19NQVhdOworICAgIC8qIFJlbGF0aXZlIG9mZnNldCBvZiBzZW5zb3IgY2VudGVyIGZyb20gb3B0aWNhbCBheGlzIGFsb25nIGhvcml6b250YWwgZGltZW5zaW9uICovCisgICAgZmxvYXQgICAgICByZWxhdGl2ZV9wcmluY2lwbGVfcG9pbnRfeF9vZmZzZXQ7CisgICAgLyogUmVsYXRpdmUgb2Zmc2V0IG9mIHNlbnNvciBjZW50ZXIgZnJvbSBvcHRpY2FsIGF4aXMgYWxvbmcgdmVydGljYWwgZGltZW5zaW9uICovCisgICAgZmxvYXQgICAgICByZWxhdGl2ZV9wcmluY2lwbGVfcG9pbnRfeV9vZmZzZXQ7CisgICAgLyogMD1NYWluIENhbWVyYSBpcyBvbiB0aGUgbGVmdCBvZiBBdXg7IDE9TWFpbiBDYW1lcmEgaXMgb24gdGhlIHJpZ2h0IG9mIEF1eCAqLworICAgIHVpbnQxNl90ICAgcmVsYXRpdmVfcG9zaXRpb25fZmxhZzsKKyAgICAvKiBDYW1lcmEgc2VwYXJhdGlvbiBpbiBtbSAqLworICAgIGZsb2F0ICAgICAgcmVsYXRpdmVfYmFzZWxpbmVfZGlzdGFuY2U7CisgICAgLyogbWFpbiBzZW5zb3Igc2V0dGluZyBkdXJpbmcgY2FsOiAwLW5vbmUsIDEtaG9yLW1pcnJvciwgMi12ZXItZmxpcCwgMy1ib3RoICovCisgICAgdWludDE2X3QgICBtYWluX3NlbnNvcl9taXJyb3JfZmxpcF9zZXR0aW5nOworICAgIC8qIGF1eCBzZW5zb3Igc2V0dGluZyBkdXJpbmcgY2FsOiAwLW5vbmUsIDEtaG9yLW1pcnJvciwgMi12ZXItZmxpcCwgMy1ib3RoICovCisgICAgdWludDE2X3QgICBhdXhfc2Vuc29yX21pcnJvcl9mbGlwX3NldHRpbmc7CisgICAgLyogbW9kdWxlIG9yaWVudGF0aW9uIGR1cmluZyBjYWw6IDAtc2Vuc29ycyBpbiBsYW5kc2NhcGUsIDEtc2Vuc29ycyBpbiBwb3J0cmFpdCAqLworICAgIHVpbnQxNl90ICAgbW9kdWxlX29yaWVudGF0aW9uX2R1cmluZ19jYWxpYnJhdGlvbjsKKyAgICAvKiBjYWwgaW1hZ2VzIHJlcXVpcmVkIHJvdGF0aW9uOiAwLW5vLCAxLTkwIGRlZ3JlZXMgcmlnaHQsIDItOTAgZGVncmVlcyBsZWZ0ICovCisgICAgdWludDE2X3QgICByb3RhdGlvbl9mbGFnOworICAgIC8qIEFFQyBzeW5jIE9UUCBkYXRhICovCisgICAgLyogQUVDIHN5bmMgYnJpZ2h0bmVzcyByYXRpb24uIEZpeGVkIFBvaW50IFExMCovCisgICAgaW50MTZfdCAgICBicmlnaHRuZXNzX3JhdGlvOworICAgIC8qIFJlZmVyZW5jZSBtb25vIGdhaW4gdmFsdWUgb2J0YWluZWQgZnJvbSBzZXR1cCBzdGFnZSBhbmQgdXNlZCBkdXJpbmcgY2FsaWJyYXRpb24gc3RhZ2UgKi8KKyAgICAvKiBGaXhlZCBQb2ludCBRMTAgKi8KKyAgICBpbnQxNl90ICAgIHJlZl9tb25vX2dhaW47CisgICAgLyogUmVmZXJlbmNlIG1vbm8gbGluZSBjb3VudCBvYnRhaW5lZCBmcm9tIHNldHVwIHN0YWdlIGFuZCB1c2VkIGR1cmluZyBjYWxpYnJhdGlvbiBzdGFnZSAqLworICAgIHVpbnQxNl90ICAgcmVmX21vbm9fbGluZWNvdW50OworICAgIC8qIFJlZmVyZW5jZSBiYXllciBnYWluIHZhbHVlIG9idGFpbmVkIGZyb20gc2V0dXAgc3RhZ2UgYW5kIHVzZWQgZHVyaW5nIGNhbGlicmF0aW9uIHN0YWdlICovCisgICAgLyogRml4ZWQgUG9pbnQgUTEwICovCisgICAgaW50MTZfdCAgICByZWZfYmF5ZXJfZ2FpbjsKKyAgICAvKiBSZWZlcmVuY2UgYmF5ZXIgbGluZSBjb3VudCBvYnRhaW5lZCBmcm9tIHNldHVwIHN0YWdlIGFuZCB1c2VkIGR1cmluZyBjYWxpYnJhdGlvbiBzdGFnZSAqLworICAgIHVpbnQxNl90ICAgcmVmX2JheWVyX2xpbmVjb3VudDsKKyAgICAvKiBSZWZlcmVuY2UgYmF5ZXIgY29sb3IgdGVtcGVyYXR1cmUgKi8KKyAgICB1aW50MTZfdCAgIHJlZl9iYXllcl9jb2xvcl90ZW1wZXJhdHVyZTsKKyAgICAvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworICAgIGZsb2F0ICAgICAgcmVzZXJ2ZWRbUkVMQ0FNX0NBTElCX1JFU0VSVkVEX01BWF07Cit9IGNhbV9yZWxhdGVkX3N5c3RlbV9jYWxpYnJhdGlvbl9kYXRhX3Q7CisjcHJhZ21hIHBhY2soKQorCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IGRlZmF1bHRfc2Vuc29yX2ZsaXA7CisgIHVpbnQzMl90IHNlbnNvcl9tb3VudF9hbmdsZTsKKyAgY2FtX3JlbGF0ZWRfc3lzdGVtX2NhbGlicmF0aW9uX2RhdGFfdCBvdHBfY2FsaWJyYXRpb25fZGF0YTsKK30gY2FtX2pwZWdfbWV0YWRhdGFfdDsKKworLyogY2FwYWJpbGl0eSBzdHJ1Y3QgZGVmaW5pdGlvbiBmb3IgSEFMIDEqLwordHlwZWRlZiBzdHJ1Y3R7CisgICAgY2FtX2hhbF92ZXJzaW9uX3QgdmVyc2lvbjsKKworICAgIGNhbV9wb3NpdGlvbl90IHBvc2l0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2Vuc29yIHBvc2l0aW9uOiBmcm9udCwgYmFjayAqLworCisgICAgdWludDhfdCBhdXRvX2hkcl9zdXBwb3J0ZWQ7CisKKyAgICB1aW50MTZfdCBpc1duclN1cHBvcnRlZDsKKyAgICAvKiBzdXBwb3J0ZWQgaXNvIG1vZGVzICovCisgICAgc2l6ZV90IHN1cHBvcnRlZF9pc29fbW9kZXNfY250OworICAgIGNhbV9pc29fbW9kZV90eXBlIHN1cHBvcnRlZF9pc29fbW9kZXNbQ0FNX0lTT19NT0RFX01BWF07CisKKyAgICAvKiBzdXBwb3J0ZWQgZmxhc2ggbW9kZXMgKi8KKyAgICBzaXplX3Qgc3VwcG9ydGVkX2ZsYXNoX21vZGVzX2NudDsKKyAgICBjYW1fZmxhc2hfbW9kZV90IHN1cHBvcnRlZF9mbGFzaF9tb2Rlc1tDQU1fRkxBU0hfTU9ERV9NQVhdOworCisgICAgc2l6ZV90IHpvb21fcmF0aW9fdGJsX2NudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWJsZSBzaXplIGZvciB6b29tIHJhdGlvcyAqLworICAgIHVpbnQzMl90IHpvb21fcmF0aW9fdGJsW01BWF9aT09NU19DTlRdOyAgICAgICAgICAgICAgICAgLyogem9vbSByYXRpb3MgdGFibGUgKi8KKworICAgIC8qIHN1cHBvcnRlZCBlZmZlY3QgbW9kZXMgKi8KKyAgICBzaXplX3Qgc3VwcG9ydGVkX2VmZmVjdHNfY250OworICAgIGNhbV9lZmZlY3RfbW9kZV90eXBlIHN1cHBvcnRlZF9lZmZlY3RzW0NBTV9FRkZFQ1RfTU9ERV9NQVhdOworCisgICAgLyogc3VwcG9ydGVkIHNjZW5lIG1vZGVzICovCisgICAgc2l6ZV90IHN1cHBvcnRlZF9zY2VuZV9tb2Rlc19jbnQ7CisgICAgY2FtX3NjZW5lX21vZGVfdHlwZSBzdXBwb3J0ZWRfc2NlbmVfbW9kZXNbQ0FNX1NDRU5FX01PREVfTUFYXTsKKworICAgIC8qIHN1cHBvcnRlZCBhdXRvIGV4cG9zdXJlIG1vZGVzICovCisgICAgc2l6ZV90IHN1cHBvcnRlZF9hZWNfbW9kZXNfY250OworICAgIGNhbV9hdXRvX2V4cG9zdXJlX21vZGVfdHlwZSBzdXBwb3J0ZWRfYWVjX21vZGVzW0NBTV9BRUNfTU9ERV9NQVhdOworCisgICAgc2l6ZV90IGZwc19yYW5nZXNfdGJsX2NudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmcHMgcmFuZ2VzIHRhYmxlIHNpemUgKi8KKyAgICBjYW1fZnBzX3JhbmdlX3QgZnBzX3Jhbmdlc190YmxbTUFYX1NJWkVTX0NOVF07ICAgICAgICAgIC8qIGZwcyByYW5nZXMgdGFibGUgKi8KKworICAgIC8qIHN1cHBvcnRlZCBhbnRpYmFuZGluZyBtb2RlcyAqLworICAgIHNpemVfdCBzdXBwb3J0ZWRfYW50aWJhbmRpbmdzX2NudDsKKyAgICBjYW1fYW50aWJhbmRpbmdfbW9kZV90eXBlIHN1cHBvcnRlZF9hbnRpYmFuZGluZ3NbQ0FNX0FOVElCQU5ESU5HX01PREVfTUFYXTsKKworICAgIC8qIHN1cHBvcnRlZCB3aGl0ZSBiYWxhbmNlIG1vZGVzICovCisgICAgc2l6ZV90IHN1cHBvcnRlZF93aGl0ZV9iYWxhbmNlc19jbnQ7CisgICAgY2FtX3diX21vZGVfdHlwZSBzdXBwb3J0ZWRfd2hpdGVfYmFsYW5jZXNbQ0FNX1dCX01PREVfTUFYXTsKKworICAgIC8qIENhcGFiaWxpdHkgbGlzdCBvZiBzdXBwb3J0ZWQgaW5zZW5zb3IgSERSIHR5cGVzCisgICAgICogQmFja2VuZCBpcyBleHBlY3RlZCB0byBmaWxsIGluIGFsbCB0aGUgc3VwcG9ydGVkIHR5cGVzIGFuZCBzZXQgYXBwcm9wcmlhdGUKKyAgICAgKiBjb3VudCwgc2VlIGNhbV9zZW5zb3JfaGRyX3R5cGVfdCBmb3IgdmFsaWQgdHlwZXMKKyAgICAqLworICAgIHNpemVfdCBzdXBwb3J0ZWRfc2Vuc29yX2hkcl90eXBlc19jbnQ7CisgICAgY2FtX3NlbnNvcl9oZHJfdHlwZV90IHN1cHBvcnRlZF9zZW5zb3JfaGRyX3R5cGVzW0NBTV9TRU5TT1JfSERSX01BWF07CisKKyAgICAvKiBzdXBwb3J0ZWQgbWFudWFsIHdiIGNjdCAqLworICAgIGludDMyX3QgbWluX3diX2NjdDsKKyAgICBpbnQzMl90IG1heF93Yl9jY3Q7CisKKyAgICAvKiBzdXBwb3J0ZWQgbWFudWFsIHdiIHJnYiBnYWlucyAqLworICAgIGZsb2F0IG1pbl93Yl9nYWluOworICAgIGZsb2F0IG1heF93Yl9nYWluOworCisgICAgLyogc3VwcG9ydGVkIGZvY3VzIG1vZGVzICovCisgICAgc2l6ZV90IHN1cHBvcnRlZF9mb2N1c19tb2Rlc19jbnQ7CisgICAgY2FtX2ZvY3VzX21vZGVfdHlwZSBzdXBwb3J0ZWRfZm9jdXNfbW9kZXNbQ0FNX0ZPQ1VTX01PREVfTUFYXTsKKworICAgIC8qIHN1cHBvcnRlZCBtYW51YWwgZm9jdXMgcG9zaXRpb24gKi8KKyAgICBmbG9hdCBtaW5fZm9jdXNfcG9zW0NBTV9NQU5VQUxfRk9DVVNfTU9ERV9NQVhdOworICAgIGZsb2F0IG1heF9mb2N1c19wb3NbQ0FNX01BTlVBTF9GT0NVU19NT0RFX01BWF07CisKKyAgICBpbnQzMl90IGV4cG9zdXJlX2NvbXBlbnNhdGlvbl9taW47ICAgICAgIC8qIG1pbiB2YWx1ZSBvZiBleHBvc3VyZSBjb21wZW5zYXRpb24gaW5kZXggKi8KKyAgICBpbnQzMl90IGV4cG9zdXJlX2NvbXBlbnNhdGlvbl9tYXg7ICAgICAgIC8qIG1heCB2YWx1ZSBvZiBleHBvc3VyZSBjb21wZW5zYXRpb24gaW5kZXggKi8KKyAgICBpbnQzMl90IGV4cG9zdXJlX2NvbXBlbnNhdGlvbl9kZWZhdWx0OyAgIC8qIGRlZmF1bHQgdmFsdWUgb2YgZXhwb3N1cmUgY29tcGVuc2F0aW9uIGluZGV4ICovCisgICAgZmxvYXQgZXhwb3N1cmVfY29tcGVuc2F0aW9uX3N0ZXA7CisgICAgY2FtX3JhdGlvbmFsX3R5cGVfdCBleHBfY29tcGVuc2F0aW9uX3N0ZXA7ICAgIC8qIGV4cG9zdXJlIGNvbXBlbnNhdGlvbiBzdGVwIHZhbHVlICovCisKKyAgICB1aW50OF90IHZpZGVvX3N0YWJsaXphdGlvbl9zdXBwb3J0ZWQ7IC8qIGZsYWcgaWQgdmlkZW8gc3RhYmxpemF0aW9uIGlzIHN1cHBvcnRlZCAqLworCisgICAgc2l6ZV90IHBpY3R1cmVfc2l6ZXNfdGJsX2NudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwaWN0dXJlIHNpemVzIHRhYmxlIHNpemUgKi8KKyAgICBjYW1fZGltZW5zaW9uX3QgcGljdHVyZV9zaXplc190YmxbTUFYX1NJWkVTX0NOVF07ICAgICAgIC8qIHBpY3R1cmUgc2l6ZXMgdGFibGUgKi8KKyAgICAvKiBUaGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiB0aGF0IGlzIHN1cHBvcnRlZCBmb3IgZWFjaAorICAgICAqIHJlc29sdXRpb24gaW4gYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuIFNob3VsZCBjb3JyZXNwb25kCisgICAgICogdG8gdGhlIGZyYW1lIGR1cmF0aW9uIHdoZW4gb25seSB0aGF0IHByb2Nlc3NlZCBzdHJlYW0KKyAgICAgKiBpcyBhY3RpdmUsIHdpdGggYWxsIHByb2Nlc3Npbmcgc2V0IHRvIEZBU1QgKi8KKyAgICBpbnQ2NF90IHBpY3R1cmVfbWluX2R1cmF0aW9uW01BWF9TSVpFU19DTlRdOworCisgICAgLyogY2FwYWJpbGl0aWVzIHNwZWNpZmljIHRvIEhBTCAxICovCisKKyAgICBpbnQzMl90IG1vZGVzX3N1cHBvcnRlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc2sgb2YgbW9kZXMgc3VwcG9ydGVkOiAyRCwgM0QgKi8KKyAgICB1aW50MzJfdCBzZW5zb3JfbW91bnRfYW5nbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNlbnNvciBtb3VudCBhbmdsZSAqLworCisgICAgZmxvYXQgZm9jYWxfbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb2NhbCBsZW5ndGggKi8KKyAgICBmbG9hdCBob3Jfdmlld19hbmdsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhvcml6b250YWwgdmlldyBhbmdsZSAqLworICAgIGZsb2F0IHZlcl92aWV3X2FuZ2xlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmVydGljYWwgdmlldyBhbmdsZSAqLworCisgICAgc2l6ZV90IHByZXZpZXdfc2l6ZXNfdGJsX2NudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2aWV3IHNpemVzIHRhYmxlIHNpemUgKi8KKyAgICBjYW1fZGltZW5zaW9uX3QgcHJldmlld19zaXplc190YmxbTUFYX1NJWkVTX0NOVF07ICAgICAgIC8qIHByZWlldyBzaXplcyB0YWJsZSAqLworCisgICAgc2l6ZV90IHZpZGVvX3NpemVzX3RibF9jbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2aWRlbyBzaXplcyB0YWJsZSBzaXplICovCisgICAgY2FtX2RpbWVuc2lvbl90IHZpZGVvX3NpemVzX3RibFtNQVhfU0laRVNfQ05UXTsgICAgICAgICAvKiB2aWRlbyBzaXplcyB0YWJsZSAqLworCisKKyAgICBzaXplX3QgbGl2ZXNuYXBzaG90X3NpemVzX3RibF9jbnQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdmVzbmFwc2hvdCBzaXplcyB0YWJsZSBzaXplICovCisgICAgY2FtX2RpbWVuc2lvbl90IGxpdmVzbmFwc2hvdF9zaXplc190YmxbTUFYX1NJWkVTX0NOVF07ICAvKiBsaXZlc25hcHNob3Qgc2l6ZXMgdGFibGUgKi8KKworICAgIHNpemVfdCB2aGRyX2xpdmVzbmFwc2hvdF9zaXplc190YmxfY250OyAgICAgICAgICAgICAgICAgLyogdmhkcl9saXZlc25hcHNob3Qgc2l6ZXMgdGFibGUgc2l6ZSAqLworICAgIGNhbV9kaW1lbnNpb25fdCB2aGRyX2xpdmVzbmFwc2hvdF9zaXplc190YmxbTUFYX1NJWkVTX0NOVF07ICAvKiB2aGRyX2xpdmVzbmFwc2hvdCBzaXplcyB0YWJsZSAqLworCisgICAgc2l6ZV90IGhmcl90YmxfY250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWJsZSBzaXplIGZvciBIRlIgKi8KKyAgICBjYW1faGZyX2luZm9fdCBoZnJfdGJsW0NBTV9IRlJfTU9ERV9NQVhdOyAgICAgICAgICAgICAgIC8qIEhGUiB0YWJsZSAqLworCisgICAgc2l6ZV90IHp6aGRyX3NpemVzX3RibF9jbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcmVzb2x1dGlvbnMgaW4genpIRFIgbW9kZSovCisgICAgY2FtX2RpbWVuc2lvbl90IHp6aGRyX3NpemVzX3RibFtNQVhfU0laRVNfQ05UXTsgICAgICAgICAvKiBUYWJsZSBmb3IgWlpIRFIgc3VwcG9ydGVkIHNpemVzICovCisKKyAgICBzaXplX3Qgc3VwcG9ydGVkX3F1YWRyYV9jZmFfZGltX2NudDsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiByZXNvbHV0aW9ucyBpbiBRdWFkcmEgQ0ZBIG1vZGUgKi8KKyAgICBjYW1fZGltZW5zaW9uX3QgcXVhZHJhX2NmYV9kaW1bTUFYX1NJWkVTX0NOVF07ICAgIC8qIFRhYmxlIGZvciBRdWFkcmEgQ0ZBIHN1cHBvcnRlZCBzaXplcyAqLworICAgIGNhbV9mb3JtYXRfdCBxdWFkcmFfY2ZhX2Zvcm1hdDsgICAgICAgICAgICAgICAgICAgLyogUXVhZHJhIENGQSBvdXRwdXQgZm9ybWF0ICovCisgICAgdWludDMyX3QgaXNfcmVtb3NhaWNfbGliX3ByZXNlbnQ7ICAgICAgICAgICAgICAgICAvKiBGbGFnIGluZGljYXRpbmcgaWYgcmVtb3NhaWMgbGliIHByZXNlbnQgKi8KKworICAgIC8qIHN1cHBvcnRlZCBwcmV2aWV3IGZvcm1hdHMgKi8KKyAgICBzaXplX3Qgc3VwcG9ydGVkX3ByZXZpZXdfZm10X2NudDsKKyAgICBjYW1fZm9ybWF0X3Qgc3VwcG9ydGVkX3ByZXZpZXdfZm10c1tDQU1fRk9STUFUX01BWF07CisKKyAgICAvKiBzdXBwb3J0ZWQgcGljdHVyZSBmb3JtYXRzICovCisgICAgc2l6ZV90IHN1cHBvcnRlZF9waWN0dXJlX2ZtdF9jbnQ7CisgICAgY2FtX2Zvcm1hdF90IHN1cHBvcnRlZF9waWN0dXJlX2ZtdHNbQ0FNX0ZPUk1BVF9NQVhdOworCisgICAgdWludDhfdCBtYXhfZG93bnNjYWxlX2ZhY3RvcjsKKworICAgIC8qIGRpbWVuc2lvbiBhbmQgc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQgb2YgcmF3IGR1bXAgZnJvbSBjYW1pZiAqLworICAgIHNpemVfdCBzdXBwb3J0ZWRfcmF3X2RpbV9jbnQ7CisgICAgY2FtX2RpbWVuc2lvbl90IHJhd19kaW1bTUFYX1NJWkVTX0NOVF07CisgICAgc2l6ZV90IHN1cHBvcnRlZF9yYXdfZm10X2NudDsKKyAgICBjYW1fZm9ybWF0X3Qgc3VwcG9ydGVkX3Jhd19mbXRzW0NBTV9GT1JNQVRfTUFYXTsKKyAgICAvKiBUaGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiB0aGF0IGlzIHN1cHBvcnRlZCBmb3IgYWJvdmUKKyAgICAgICByYXcgcmVzb2x1dGlvbiAqLworICAgIGludDY0X3QgcmF3X21pbl9kdXJhdGlvbltNQVhfU0laRVNfQ05UXTsKKworICAgIC8qIDNBIHZlcnNpb24qLworICAgIGNhbV9xM2FfdmVyc2lvbl90IHEzYV92ZXJzaW9uOworICAgIC8qIHN1cHBvcnRlZCBmb2N1cyBhbGdvcml0aG1zICovCisgICAgc2l6ZV90IHN1cHBvcnRlZF9mb2N1c19hbGdvc19jbnQ7CisgICAgY2FtX2ZvY3VzX2FsZ29yaXRobV90eXBlIHN1cHBvcnRlZF9mb2N1c19hbGdvc1tDQU1fRk9DVVNfQUxHT19NQVhdOworCisKKyAgICB1aW50OF90IGF1dG9fd2JfbG9ja19zdXBwb3J0ZWQ7ICAgICAgIC8qIGZsYWcgaWYgYXV0byB3aGl0ZSBiYWxhbmNlIGxvY2sgaXMgc3VwcG9ydGVkICovCisgICAgdWludDhfdCB6b29tX3N1cHBvcnRlZDsgICAgICAgICAgICAgICAvKiBmbGFnIGlmIHpvb20gaXMgc3VwcG9ydGVkICovCisgICAgdWludDhfdCBzbW9vdGhfem9vbV9zdXBwb3J0ZWQ7ICAgICAgICAvKiBmbGFnIGlmIHNtb290aCB6b29tIGlzIHN1cHBvcnRlZCAqLworICAgIHVpbnQ4X3QgYXV0b19leHBvc3VyZV9sb2NrX3N1cHBvcnRlZDsgLyogZmxhZyBpZiBhdXRvIGV4cG9zdXJlIGxvY2sgaXMgc3VwcG9ydGVkICovCisgICAgdWludDhfdCB2aWRlb19zbmFwc2hvdF9zdXBwb3J0ZWQ7ICAgICAvKiBmbGFnIGlmIHZpZGVvIHNuYXBzaG90IGlzIHN1cHBvcnRlZCAqLworCisgICAgdWludDhfdCBtYXhfbnVtX3JvaTsgICAgICAgICAgICAgICAgICAvKiBtYXggbnVtYmVyIG9mIHJvaSBjYW4gYmUgZGV0ZWN0ZWQgKi8KKyAgICB1aW50OF90IG1heF9udW1fZm9jdXNfYXJlYXM7ICAgICAgICAgIC8qIG1heCBudW0gb2YgZm9jdXMgYXJlYXMgKi8KKyAgICB1aW50OF90IG1heF9udW1fbWV0ZXJpbmdfYXJlYXM7ICAgICAgIC8qIG1heCBudW0gb3BmIG1ldGVyaW5nIGFyZWFzICovCisgICAgdWludDhfdCBtYXhfem9vbV9zdGVwOyAgICAgICAgICAgICAgICAvKiBtYXggem9vbSBzdGVwIHZhbHVlICovCisKKyAgICAvKiBRQ09NIHNwZWNpZmljIGNvbnRyb2wgKi8KKyAgICBjYW1fY29udHJvbF9yYW5nZV90IGJyaWdodG5lc3NfY3RybDsgIC8qIGJyaWdodG5lc3MgKi8KKyAgICBjYW1fY29udHJvbF9yYW5nZV90IHNoYXJwbmVzc19jdHJsOyAgIC8qIHNoYXJwbmVzcyAqLworICAgIGNhbV9jb250cm9sX3JhbmdlX3QgY29udHJhc3RfY3RybDsgICAgLyogY29udHJhc3QgKi8KKyAgICBjYW1fY29udHJvbF9yYW5nZV90IHNhdHVyYXRpb25fY3RybDsgIC8qIHNhdHVyYXRpb24gKi8KKyAgICBjYW1fY29udHJvbF9yYW5nZV90IHNjZV9jdHJsOyAgICAgICAgIC8qIHNraW50b25lIGVuaGFuY2VtZW50IGZhY3RvciAqLworCisgICAgLyogUUNPTSBIRFIgc3BlY2lmaWMgY29udHJvbC4gSW5kaWNhdGVzIG51bWJlciBvZiBmcmFtZXMgYW5kIGV4cG9zdXJlIG5lZWRzIGZvciB0aGUgZnJhbWVzICovCisgICAgY2FtX2hkcl9icmFja2V0aW5nX2luZm9fdCBoZHJfYnJhY2tldGluZ19zZXR0aW5nOworCisgICAgY2FtX2ZlYXR1cmVfbWFza190IHFjb21fc3VwcG9ydGVkX2ZlYXR1cmVfbWFzazsgLyogbWFzayBvZiBxY29tIHNwZWNpZmljIGZlYXR1cmVzIHN1cHBvcnRlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdWNoIGFzIENBTV9RQ09NX0ZFQVRVUkVfU1VQUE9SVEVEX0ZBQ0VfREVURUNUSU9OKi8KKyAgICBjYW1fcGFkZGluZ19pbmZvX3QgcGFkZGluZ19pbmZvOyAgICAgIC8qIHBhZGRpbmcgaW5mb3JtYXRpb24gZnJvbSBQUCAqLworICAgIHVpbnQzMl90IG1pbl9udW1fcHBfYnVmczsgICAgICAgICAgICAgLyogbWluaW11bSBudW1iZXIgb2YgYnVmZmVycyBuZWVkZWQgYnkgcG9zdHByb2MgbW9kdWxlICovCisgICAgY2FtX2Zvcm1hdF90IHJkaV9tb2RlX3N0cmVhbV9mbXQ7ICAvKiBzdHJlYW0gZm9ybWF0IHN1cHBvcnRlZCBpbiByZGkgbW9kZSAqLworCisgICAgLyogY2FwYWJpbGl0aWVzIHNwZWNpZmljIHRvIEhBTCAzICovCisKKyAgICBmbG9hdCBtaW5fZm9jdXNfZGlzdGFuY2U7CisgICAgZmxvYXQgaHlwZXJfZm9jYWxfZGlzdGFuY2U7CisKKyAgICBmbG9hdCBmb2NhbF9sZW5ndGhzW0NBTV9GT0NBTF9MRU5HVEhTX01BWF07CisgICAgdWludDhfdCBmb2NhbF9sZW5ndGhzX2NvdW50OworCisgICAgLyogTmVlZHMgdG8gYmUgcmVndWxhciBmIG51bWJlciBpbnN0ZWFkIG9mIEFQRVggKi8KKyAgICBmbG9hdCBhcGVydHVyZXNbQ0FNX0FQRVJUVVJFU19NQVhdOworICAgIHVpbnQ4X3QgYXBlcnR1cmVzX2NvdW50OworCisgICAgZmxvYXQgZmlsdGVyX2RlbnNpdGllc1tDQU1fRklMVEVSX0RFTlNJVElFU19NQVhdOworICAgIHVpbnQ4X3QgZmlsdGVyX2RlbnNpdGllc19jb3VudDsKKworICAgIHVpbnQ4X3Qgb3B0aWNhbF9zdGFiX21vZGVzW0NBTV9PUFRfU1RBQl9NQVhdOworICAgIHVpbnQ4X3Qgb3B0aWNhbF9zdGFiX21vZGVzX2NvdW50OworCisgICAgY2FtX2RpbWVuc2lvbl90IGxlbnNfc2hhZGluZ19tYXBfc2l6ZTsKKworICAgIGNhbV9kaW1lbnNpb25fdCBnZW9fY29ycmVjdGlvbl9tYXBfc2l6ZTsKKyAgICBmbG9hdCBnZW9fY29ycmVjdGlvbl9tYXBbMiAqIDMgKiBDQU1fTUFYX01BUF9XSURUSCAqCisgICAgICAgICAgICAgIENBTV9NQVhfTUFQX0hFSUdIVF07CisKKyAgICBmbG9hdCBsZW5zX3Bvc2l0aW9uWzNdOworCisgICAgLyogbmFubyBzZWNvbmRzICovCisgICAgaW50NjRfdCBleHBvc3VyZV90aW1lX3JhbmdlW0VYUE9TVVJFX1RJTUVfUkFOR0VfQ05UXTsKKworICAgIC8qIG5hbm8gc2Vjb25kcyAqLworICAgIGludDY0X3QgbWF4X2ZyYW1lX2R1cmF0aW9uOworCisgICAgY2FtX2NvbG9yX2ZpbHRlcl9hcnJhbmdlbWVudF90IGNvbG9yX2FycmFuZ2VtZW50OworICAgIHVpbnQ4X3QgbnVtX2NvbG9yX2NoYW5uZWxzOworCisgICAgLyogcGFyYW1ldGVycyByZXF1aXJlZCB0byBjYWxjdWxhdGUgUyBhbmQgTyBjby1lZmZpY2llbnRzICovCisgICAgZG91YmxlIGdyYWRpZW50X1M7CisgICAgZG91YmxlIG9mZnNldF9TOworICAgIGRvdWJsZSBncmFkaWVudF9POworICAgIGRvdWJsZSBvZmZzZXRfTzsKKworICAgIGZsb2F0IHNlbnNvcl9waHlzaWNhbF9zaXplW1NFTlNPUl9QSFlTSUNBTF9TSVpFX0NOVF07CisKKyAgICAvKiBEaW1lbnNpb25zIG9mIGZ1bGwgcGl4ZWwgYXJyYXksIHBvc3NpYmx5IGluY2x1ZGluZworICAgICAgIGJsYWNrIGNhbGlicmF0aW9uIHBpeGVscyAqLworICAgIGNhbV9kaW1lbnNpb25fdCBwaXhlbF9hcnJheV9zaXplOworICAgIC8qIEFyZWEgb2YgcmF3IGRhdGEgd2hpY2ggY29ycmVzcG9uZHMgdG8gb25seSBhY3RpdmUKKyAgICAgICBwaXhlbHM7IHNtYWxsZXIgb3IgZXF1YWwgdG8gcGl4ZWxBcnJheVNpemUuICovCisgICAgY2FtX3JlY3RfdCBhY3RpdmVfYXJyYXlfc2l6ZTsKKworICAgIC8qIE1heGltdW0gcmF3IHZhbHVlIG91dHB1dCBieSBzZW5zb3IgKi8KKyAgICBpbnQzMl90IHdoaXRlX2xldmVsOworCisgICAgLyogQSBmaXhlZCBibGFjayBsZXZlbCBvZmZzZXQgZm9yIGVhY2ggb2YgdGhlIEJheWVyCisgICAgICAgbW9zYWljIGNoYW5uZWxzICovCisgICAgaW50MzJfdCBibGFja19sZXZlbF9wYXR0ZXJuW0JMQUNLX0xFVkVMX1BBVFRFUk5fQ05UXTsKKworICAgIC8qIFRpbWUgdGFrZW4gYmVmb3JlIGZsYXNoIGNhbiBmaXJlIGFnYWluIGluIG5hbm8gc2VjcyAqLworICAgIGludDY0X3QgZmxhc2hfY2hhcmdlX2R1cmF0aW9uOworCisgICAgLyogZmxhc2ggZmlyaW5nIHBvd2VyICovCisgICAgc2l6ZV90IHN1cHBvcnRlZF9mbGFzaF9maXJpbmdfbGV2ZWxfY250OworICAgIGNhbV9mb3JtYXRfdCBzdXBwb3J0ZWRfZmlyaW5nX2xldmVsc1tDQU1fRkxBU0hfRklSSU5HX0xFVkVMX01BWF07CisKKyAgICAvKiBGbGFzaCBGaXJpbmcgVGltZSAqLworICAgIGludDY0X3QgZmxhc2hfZmlyaW5nX3RpbWU7CisKKyAgICAvKiBGbGFzaCBDaW9sb3IgVGVtcGVyYXR1cmUgKi8KKyAgICB1aW50OF90IGZsYXNoX2NvbG9yX3RlbXA7CisKKyAgICAvKiBGbGFzaCBtYXggRW5lcmd5ICovCisgICAgdWludDhfdCBmbGFzaF9tYXhfZW5lcmd5OworCisgICAgLyogTWF4aW11bSBudW1iZXIgb2Ygc3VwcG9ydGVkIHBvaW50cyBpbiB0aGUgdG9uZW1hcAorICAgICAgIGN1cnZlICovCisgICAgaW50MzJfdCBtYXhfdG9uZV9tYXBfY3VydmVfcG9pbnRzOworCisgICAgLyogc3VwcG9ydGVkIGZvcm1hdHMgKi8KKyAgICBzaXplX3Qgc3VwcG9ydGVkX3NjYWxhcl9mb3JtYXRfY250OworICAgIGNhbV9mb3JtYXRfdCBzdXBwb3J0ZWRfc2NhbGFyX2ZtdHNbQ0FNX0ZPUk1BVF9NQVhdOworCisgICAgdWludDMyX3QgbWF4X2ZhY2VfZGV0ZWN0aW9uX2NvdW50OworCisgICAgdWludDhfdCBoaXN0b2dyYW1fc3VwcG9ydGVkOworICAgIC8qIE51bWJlciBvZiBoaXN0b2dyYW0gYnVja2V0cyBzdXBwb3J0ZWQgKi8KKyAgICBpbnQzMl90IGhpc3RvZ3JhbV9zaXplOworICAgIC8qIE1heGltdW0gdmFsdWUgcG9zc2libGUgZm9yIGEgaGlzdG9ncmFtIGJ1Y2tldCAqLworICAgIGludDMyX3QgbWF4X2hpc3RvZ3JhbV9jb3VudDsKKworICAgIGNhbV9kaW1lbnNpb25fdCBzaGFycG5lc3NfbWFwX3NpemU7CisKKyAgICAvKiBNYXhpbXVtIHZhbHVlIHBvc3NpYmxlIGZvciBhIHNoYXJwbmVzcyBtYXAgcmVnaW9uICovCisgICAgaW50MzJfdCBtYXhfc2hhcnBuZXNzX21hcF92YWx1ZTsKKworICAgIC8qQXV0b2V4cG9zdXJlIG1vZGVzIGZvciBjYW1lcmEgMyBhcGkqLworICAgIHNpemVfdCBzdXBwb3J0ZWRfYWVfbW9kZXNfY250OworICAgIGNhbV9hZV9tb2RlX3R5cGUgc3VwcG9ydGVkX2FlX21vZGVzW0NBTV9BRV9NT0RFX01BWF07CisKKworICAgIGNhbV9zZW5zaXRpdml0eV9yYW5nZV90IHNlbnNpdGl2aXR5X3JhbmdlOworICAgIGludDMyX3QgbWF4X2FuYWxvZ19zZW5zaXRpdml0eTsKKworICAgIC8qIElTUCBkaWdpdGFsIGdhaW4gKi8KKyAgICBjYW1fc2Vuc2l0aXZpdHlfcmFuZ2VfdCBpc3Bfc2Vuc2l0aXZpdHlfcmFuZ2U7CisKKyAgICAvKiBwaWN0dXJlIHNpemVzIG5lZWQgc2NhbGUqLworICAgIGNhbV9zY2VuZV9tb2RlX292ZXJyaWRlc190IHNjZW5lX21vZGVfb3ZlcnJpZGVzW0NBTV9TQ0VORV9NT0RFX01BWF07CisgICAgc2l6ZV90IHNjYWxlX3BpY3R1cmVfc2l6ZXNfY250OworICAgIGNhbV9kaW1lbnNpb25fdCBzY2FsZV9waWN0dXJlX3NpemVzW01BWF9TQ0FMRV9TSVpFU19DTlRdOworCisgICAgdWludDhfdCBmbGFzaF9hdmFpbGFibGU7CisKKyAgICBjYW1fcmF0aW9uYWxfdHlwZV90IGJhc2VfZ2Fpbl9mYWN0b3I7ICAgIC8qIHNlbnNvciBiYXNlIGdhaW4gZmFjdG9yICovCisgICAgLyogQUYgQnJhY2tldGluZyBpbmZvICovCisgICAgY2FtX2FmX2JyYWNrZXRpbmdfdCAgdWJpZm9jdXNfYWZfYnJhY2tldGluZ19uZWVkOworICAgIGNhbV9hZl9icmFja2V0aW5nX3QgIHJlZm9jdXNfYWZfYnJhY2tldGluZ19uZWVkOworICAgIC8qIG9wdGkgWm9vbSBpbmZvICovCisgICAgY2FtX29wdGlfem9vbV90ICAgICAgb3B0aV96b29tX3NldHRpbmdzX25lZWQ7CisgICAgLyogc3RpbGwgbW9yZSBpbmZvICovCisgICAgY2FtX3N0aWxsX21vcmVfdCAgc3RpbGxtb3JlX3NldHRpbmdzX25lZWQ7CisgICAgLyogY2hyb21hIGZsYXNoIGluZm8gKi8KKyAgICBjYW1fY2hyb21hX2ZsYXNoX3QgY2hyb21hX2ZsYXNoX3NldHRpbmdzX25lZWQ7CisKKyAgICBjYW1fcmF0aW9uYWxfdHlwZV90IGZvcndhcmRfbWF0cml4WzNdWzNdOworICAgIGNhbV9yYXRpb25hbF90eXBlX3QgY29sb3JfdHJhbnNmb3JtWzNdWzNdOworCisgICAgdWludDhfdCBmb2N1c19kaXN0X2NhbGlicmF0ZWQ7CisgICAgdWludDhfdCBzdXBwb3J0ZWRfdGVzdF9wYXR0ZXJuX21vZGVzX2NudDsKKyAgICBjYW1fdGVzdF9wYXR0ZXJuX21vZGVfdCBzdXBwb3J0ZWRfdGVzdF9wYXR0ZXJuX21vZGVzW01BWF9URVNUX1BBVFRFUk5fQ05UXTsKKworICAgIGludDY0X3Qgc3RhbGxfZHVyYXRpb25zW01BWF9TSVpFU19DTlRdOworCisgICAgY2FtX2lsbHVtaW5hdF90IHJlZmVyZW5jZV9pbGx1bWluYW50MTsKKyAgICBjYW1faWxsdW1pbmF0X3QgcmVmZXJlbmNlX2lsbHVtaW5hbnQyOworCisgICAgaW50NjRfdCBqcGVnX3N0YWxsX2R1cmF0aW9uc1tNQVhfU0laRVNfQ05UXTsKKyAgICBpbnQ2NF90IHJhdzE2X3N0YWxsX2R1cmF0aW9uc1tNQVhfU0laRVNfQ05UXTsKKyAgICBjYW1fcmF0aW9uYWxfdHlwZV90IGZvcndhcmRfbWF0cml4MVtGT1JXQVJEX01BVFJJWF9ST1dTXVtGT1JXQVJEX01BVFJJWF9DT0xTXTsKKyAgICBjYW1fcmF0aW9uYWxfdHlwZV90IGZvcndhcmRfbWF0cml4MltGT1JXQVJEX01BVFJJWF9ST1dTXVtGT1JXQVJEX01BVFJJWF9DT0xTXTsKKyAgICBjYW1fcmF0aW9uYWxfdHlwZV90IGNvbG9yX3RyYW5zZm9ybTFbQ09MT1JfVFJBTlNGT1JNX1JPV1NdW0NPTE9SX1RSQU5TRk9STV9DT0xTXTsKKyAgICBjYW1fcmF0aW9uYWxfdHlwZV90IGNvbG9yX3RyYW5zZm9ybTJbQ09MT1JfVFJBTlNGT1JNX1JPV1NdW0NPTE9SX1RSQU5TRk9STV9DT0xTXTsKKyAgICBjYW1fcmF0aW9uYWxfdHlwZV90IGNhbGlicmF0aW9uX3RyYW5zZm9ybTFbQ0FMX1RSQU5TRk9STV9ST1dTXVtDQUxfVFJBTlNGT1JNX0NPTFNdOworICAgIGNhbV9yYXRpb25hbF90eXBlX3QgY2FsaWJyYXRpb25fdHJhbnNmb3JtMltDQUxfVFJBTlNGT1JNX1JPV1NdW0NBTF9UUkFOU0ZPUk1fQ09MU107CisgICAgdWludDE2X3QgaXNDYWNTdXBwb3J0ZWQ7CisKKyAgICBjYW1fb3BhcXVlX3Jhd19mb3JtYXRfdCBvcGFxdWVfcmF3X2ZtdDsKKworICAgIC8qIHRydWUgUG9ydHJhaXQgaW5mbyAqLworICAgIGNhbV90cnVlX3BvcnRyYWl0X3QgIHRydWVfcG9ydHJhaXRfc2V0dGluZ3NfbmVlZDsKKworICAgIC8qIFNlbnNvciB0eXBlIGluZm9ybWF0aW9uICovCisgICAgY2FtX3NlbnNvcl90eXBlX3Qgc2Vuc29yX3R5cGU7CisKKyAgICBjYW1fYWJlcnJhdGlvbl9tb2RlX3QgYWJlcnJhdGlvbl9tb2Rlc1tDQU1fQ09MT1JfQ09SUkVDVElPTl9BQkVSUkFUSU9OX01BWF07CisgICAgdWludDMyX3QgYWJlcnJhdGlvbl9tb2Rlc19jb3VudDsKKworICAgIC8qIENhbiB0aGUgc2Vuc29yIHRpbWVzdGFtcCBiZSBjb21wYXJlZCB0bworICAgICAqIHRpbWVzdGFtcHMgZnJvbSBvdGhlciBzdWItc3lzdGVtcyAoZ3lybywgYWNjZWxlcm9tZXRlciBldGMuKSAqLworICAgIHVpbnQ4X3QgaXNUaW1lc3RhbXBDYWxpYnJhdGVkOworCisgICAgLyogTWF4IHNpemUgc3VwcG9ydGVkIGJ5IElTUCB2aWV3ZmluZGVyIHBhdGggKi8KKyAgICBjYW1fZGltZW5zaW9uX3QgbWF4X3ZpZXdmaW5kZXJfc2l6ZTsKKworICAgIC8qIEFuYWx5c2lzIGJ1ZmZlciByZXF1aXJlbWVudHMgKi8KKyAgICBjYW1fYW5hbHlzaXNfaW5mb190IGFuYWx5c2lzX2luZm9bQ0FNX0FOQUxZU0lTX0lORk9fTUFYXTsKKworICAgIC8qIFRoaXMgaXMgc2V0IHRvICd0cnVlJyBpZiBzZW5zb3IgY2Fubm90IGd1YXJhbnRlZSBwZXIgZnJhbWUgY29udHJvbCAqLworICAgIC8qIERlZmF1bHQgdmFsdWUgb2YgdGhpcyBjYXBhYmlsaXR5IGlzICdmYWxzZScgaW5kaWNhdGluZyBwZXItZnJhbWUgKi8KKyAgICAvKiBjb250cm9sIGlzIHN1cHBvcnRlZCAqLworICAgIHVpbnQ4X3Qgbm9fcGVyX2ZyYW1lX2NvbnRyb2xfc3VwcG9ydDsKKworICAgIC8qIEVJUyBpbmZvcm1hdGlvbiAqLworICAgIHVpbnQ4X3Qgc3VwcG9ydGVkX2lzX3R5cGVzX2NudDsKKyAgICB1aW50MzJfdCBzdXBwb3J0ZWRfaXNfdHlwZXNbSVNfVFlQRV9NQVhdOworICAgIC8qZm9yIGVhY2ggdHlwZSwgc3BlY2lmeSB0aGUgbWFyZ2luIG5lZWRlZC4gTWFyZ2luIHdpbGwgYmUKKyAgICAgIHRoZSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgcGVyY2VudGFnZQorICAgICAgZXg6IDEwJSBtYXJnaW4gPSAwLjEgKi8KKyAgICBmbG9hdCBzdXBwb3J0ZWRfaXNfdHlwZV9tYXJnaW5zW0lTX1RZUEVfTUFYXTsKKworICAgIC8qIE1heCBjcHAgYmF0Y2ggc2l6ZSAqLworICAgIHVpbnQ4X3QgbWF4X2JhdGNoX2J1ZnNfc3VwcG9ydGVkOworICAgIHVpbnQzMl90IGJ1Zl9hbGlnbm1lbnQ7CisgICAgdWludDMyX3QgbWluX3N0cmlkZTsKKyAgICB1aW50MzJfdCBtaW5fc2NhbmxpbmU7CisgICAgdWludDhfdCBmbGFzaF9kZXZfbmFtZVtRQ0FNRVJBX01BWF9GSUxFUEFUSF9MRU5HVEhdOworICAgIHVpbnQ4X3QgZWVwcm9tX3ZlcnNpb25faW5mb1tNQVhfRUVQUk9NX1ZFUlNJT05fSU5GT19MRU5dOworCisgICAgLyogbWF4aW11bSBwaXhlbCBiYW5kd2lkdGggc2hhcmVkIGJldHdlZW4gY2FtZXJhcyAqLworICAgIHVpbnQ2NF90IG1heF9waXhlbF9iYW5kd2lkdGg7CisKKyAgICAvKiBBcnJheSBvZiBLIGludGVnZXJzLCB3aGVyZSBLJTQ9PTAsCisgICAgICBhcyBhIGxpc3Qgb2YgcmVjdGFuZ2xlcyBpbiB0aGUgcGl4ZWxBcnJheSBjby1vcmQgc3lzdGVtCisgICAgICBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20gKi8KKyAgICBpbnQzMl90IG9wdGljYWxfYmxhY2tfcmVnaW9uc1tNQVhfT1BUSUNBTF9CTEFDS19SRUdJT05TICogNF07CisgICAgLyogQ291bnQgaXMgSy80ICovCisgICAgdWludDhfdCBvcHRpY2FsX2JsYWNrX3JlZ2lvbl9jb3VudDsKKworICAgIC8qIGhvdCBwaXhlbCAqLworICAgIHVpbnQ4X3QgaG90UGl4ZWxfbW9kZTsKKyAgICB1aW50MzJfdCBob3RQaXhlbF9jb3VudDsKKyAgICBjYW1fY29vcmRpbmF0ZV90eXBlX3QgaG90UGl4ZWxNYXBbNTEyXTsKKworICAgIC8qIHN1cHBvcnRlZCBpbnN0YW50IGNhcHR1cmUvQUVDIGNvbnZlcmdlbmNlIG1vZGVzICovCisgICAgc2l6ZV90IHN1cHBvcnRlZF9pbnN0YW50X2FlY19tb2Rlc19jbnQ7CisgICAgY2FtX2FlY19jb252ZXJnZW5jZV90eXBlIHN1cHBvcnRlZF9pbnN0YW50X2FlY19tb2Rlc1tDQU1fQUVDX0NPTlZFUkdFTkNFX01BWF07CisKKyAgICAvKiBEdWFsIGNhbSBjYWxpYnJhdGlvbiBkYXRhICovCisgICAgY2FtX3JlbGF0ZWRfc3lzdGVtX2NhbGlicmF0aW9uX2RhdGFfdCByZWxhdGVkX2NhbV9jYWxpYnJhdGlvbjsKKworICAgIC8qIE1ldGFfUkFXIGNhcGFiaWxpdHkgKi8KKyAgICB1aW50OF90IG1ldGFfcmF3X2NoYW5uZWxfY291bnQ7CisgICAgdWludDhfdCB2Y1tNQVhfU0laRVNfQ05UXTsKKyAgICB1aW50OF90IGR0W01BWF9TSVpFU19DTlRdOworICAgIGNhbV9mb3JtYXRfdCBzdXBwb3J0ZWRfbWV0YV9yYXdfZm10c1tDQU1fRk9STUFUX01BWF07CisgICAgY2FtX2RpbWVuc2lvbl90IHJhd19tZXRhX2RpbVtNQVhfU0laRVNfQ05UXTsKKyAgICBjYW1fc3ViX2Zvcm1hdF90eXBlX3Qgc3ViX2ZtdFtDQU1fRk9STUFUX1NVQlRZUEVfTUFYXTsKKyAgICAvKiBTdXBwb3J0ZWQgSVIgTW9kZSAqLworICAgIHNpemVfdCBzdXBwb3J0ZWRfaXJfbW9kZV9jbnQ7CisgICAgY2FtX2lyX21vZGVfdHlwZV90IHN1cHBvcnRlZF9pcl9tb2Rlc1tDQU1fSVJfTU9ERV9NQVhdOworfSBjYW1fY2FwYWJpbGl0eV90OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9TVFJFQU1fUEFSQU1fVFlQRV9ET19SRVBST0NFU1MgPSBDQU1fSU5URl9QQVJNX0RPX1JFUFJPQ0VTUywKKyAgICBDQU1fU1RSRUFNX1BBUkFNX1RZUEVfU0VUX0JVTkRMRV9JTkZPID0gQ0FNX0lOVEZfUEFSTV9TRVRfQlVORExFLAorICAgIENBTV9TVFJFQU1fUEFSQU1fVFlQRV9TRVRfRkxJUCA9IENBTV9JTlRGX1BBUk1fU1RSRUFNX0ZMSVAsCisgICAgQ0FNX1NUUkVBTV9QQVJBTV9UWVBFX0dFVF9PVVRQVVRfQ1JPUCA9IENBTV9JTlRGX1BBUk1fR0VUX09VVFBVVF9DUk9QLAorICAgIENBTV9TVFJFQU1fUEFSQU1fVFlQRV9HRVRfSU1HX1BST1AgPSBDQU1fSU5URl9QQVJNX0dFVF9JTUdfUFJPUCwKKyAgICBDQU1fU1RSRUFNX1BBUkFNX1RZUEVfUkVRVUVTVF9GUkFNRVMgPSBDQU1fSU5URl9QQVJNX1JFUVVFU1RfRlJBTUVTLAorICAgIENBTV9TVFJFQU1fUEFSQU1fVFlQRV9SRVFVRVNUX09QU19NT0RFID0gQ0FNX0lOVEZfUEFSTV9SRVFVRVNUX09QU19NT0RFLAorICAgIENBTV9TVFJFQU1fUEFSQU1fVFlQRV9NQVgKK30gY2FtX3N0cmVhbV9wYXJhbV90eXBlX2U7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBidWZfaW5kZXg7ICAgICAgICAgICAvKiBidWYgaW5kZXggdG8gdGhlIHNvdXJjZSBmcmFtZSBidWZmZXIgdGhhdCBuZWVkcyByZXByb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXNzdW1lIGJ1ZmZlciBpcyBhbHJlYWR5IG1hcHBlZCkqLworICAgIHVpbnQzMl90IGZyYW1lX2lkeDsgICAgICAgICAgIC8qIGZyYW1lIGlkIG9mIHNvdXJjZSBmcmFtZSB0byBiZSByZXByb2Nlc3NlZCAqLworICAgIGludDMyX3QgcmV0X3ZhbDsgICAgICAgICAgICAgIC8qIHJldHVybiB2YWx1ZSBmcm9tIHJlcHJvY2Vzcy4gQ291bGQgaGF2ZSBkaWZmZXJlbnQgbWVhbmluZ3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5lLiwgZmFjZUlEIGluIHRoZSBjYXNlIG9mIGZhY2UgcmVnaXN0cmF0aW9uLiAqLworICAgIHVpbnQ4X3QgbWV0YV9wcmVzZW50OyAgICAgICAgIC8qIGlmIHRoZXJlIGlzIG1ldGEgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXByb2Nlc3MgZnJhbWUgKi8KKyAgICB1aW50MzJfdCBtZXRhX3N0cmVhbV9oYW5kbGU7ICAvKiBtZXRhIGRhdGEgc3RyZWFtIElELiBvbmx5IHZhbGlkIGlmIG1ldGFfcHJlc2VudCAhPSAwICovCisgICAgdWludDMyX3QgbWV0YV9idWZfaW5kZXg7ICAgICAgLyogYnVmIGluZGV4IHRvIG1ldGEgZGF0YSBidWZmZXIuIG9ubHkgdmFsaWQgaWYgbWV0YV9wcmVzZW50ICE9IDAgKi8KKworICAgIC8qIG9wYXF1ZSBtZXRhZGF0YSByZXF1aXJlZCBmb3IgcmVwcm9jZXNzaW5nICovCisgICAgaW50MzJfdCBwcml2YXRlX2RhdGFbTUFYX01FVEFEQVRBX1BSSVZBVEVfUEFZTE9BRF9TSVpFX0lOX0JZVEVTXTsKKyAgICBjYW1fcmVjdF90IGNyb3BfcmVjdDsKK30gY2FtX3JlcHJvY2Vzc19wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGZsaXBfbWFzazsKK30gY2FtX2ZsaXBfbW9kZV90OworCisjZGVmaW5lIElNR19OQU1FX1NJWkUgMzIKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1fcmVjdF90IGNyb3A7ICAvKiBjcm9wIGluZm8gZm9yIHRoZSBpbWFnZSAqLworICAgIGNhbV9kaW1lbnNpb25fdCBpbnB1dDsgLyogaW5wdXQgZGltZW5zaW9uIG9mIHRoZSBpbWFnZSAqLworICAgIGNhbV9kaW1lbnNpb25fdCBvdXRwdXQ7IC8qIG91dHB1dCBkaW1lbnNpb24gb2YgdGhlIGltYWdlICovCisgICAgY2hhciBuYW1lW0lNR19OQU1FX1NJWkVdOyAvKiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHQqLworICAgIGNhbV9mb3JtYXRfdCBmb3JtYXQ7IC8qIGltYWdlIGZvcm1hdCAqLworfSBjYW1fc3RyZWFtX2ltZ19wcm9wX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IGVuYWJsZVN0cmVhbTsgLyowIJYgc3RvcCBhbmQgMS1zdGFydCAqLworfSBjYW1fcmVxdWVzdF9mcmFtZXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1fc3RyZWFtX3BhcmFtX3R5cGVfZSB0eXBlOworICAgIHVuaW9uIHsKKyAgICAgICAgY2FtX3JlcHJvY2Vzc19wYXJhbSByZXByb2Nlc3M7ICAvKiBkbyByZXByb2Nlc3MgKi8KKyAgICAgICAgY2FtX2J1bmRsZV9jb25maWdfdCBidW5kbGVJbmZvOyAvKiBzZXQgYnVuZGxlIGluZm8qLworICAgICAgICBjYW1fZmxpcF9tb2RlX3QgZmxpcEluZm87ICAgICAgIC8qIGZsaXAgbW9kZSAqLworICAgICAgICBjYW1fY3JvcF9kYXRhX3Qgb3V0cHV0Q3JvcDsgICAgIC8qIG91dHB1dCBjcm9wIGZvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgIGNhbV9zdHJlYW1faW1nX3Byb3BfdCBpbWdQcm9wOyAgLyogaW1hZ2UgcHJvcGVydGllcyBvZiBjdXJyZW50IGZyYW1lICovCisgICAgICAgIGNhbV9yZXF1ZXN0X2ZyYW1lcyBmcmFtZVJlcXVlc3Q7IC8qZG8gVE5SIHByb2Nlc3MqLworICAgICAgICBjYW1fcGVyZl9tb2RlX3QgcGVyZl9tb2RlOyAgICAgICAvKnJlcXVlc3Qgb3BlcmF0aW9uYWwgbW9kZSovCisgICAgfTsKK30gY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90OworCisvKiBzdHJlYW0gaW5mbyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIHN0cmVhbSBJRCBmcm9tIHNlcnZlciAqLworICAgIHVpbnQzMl90IHN0cmVhbV9zdnJfaWQ7CisKKyAgICAvKiBzdHJlYW0gdHlwZSAqLworICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlOworCisgICAgLyogaW1hZ2UgZm9ybWF0ICovCisgICAgY2FtX2Zvcm1hdF90IGZtdDsKKworICAgIC8qIGltYWdlIGRpbWVuc2lvbiAqLworICAgIGNhbV9kaW1lbnNpb25fdCBkaW07CisKKyAgICAvKiBidWZmZXIgcGxhbmUgaW5mb3JtYXRpb24sIHdpbGwgYmUgY2FsYyBiYXNlZCBvbiBzdHJlYW1fdHlwZSwgZm10LAorICAgICAgIGRpbSwgYW5kIHBhZGRpbmdfaW5mbyhmcm9tIHN0cmVhbSBjb25maWcpLiBJbmZvIGluY2x1ZGluZzoKKyAgICAgICBvZmZzZXRfeCwgb2Zmc2V0X3ksIHN0cmlkZSwgc2NhbmxpbmUsIHBsYW5lIG9mZnNldCAqLworICAgIGNhbV9zdHJlYW1fYnVmX3BsYW5lX2luZm9fdCBidWZfcGxhbmVzOworCisgICAgLyogbnVtYmVyIG9mIHN0cmVhbSBidWZzIHdpbGwgYmUgYWxsb2NhdGVkICovCisgICAgdWludDMyX3QgbnVtX2J1ZnM7CisKKyAgICAvKiBzdHJlYW1pbmcgdHlwZSAqLworICAgIGNhbV9zdHJlYW1pbmdfbW9kZV90IHN0cmVhbWluZ19tb2RlOworCisgICAgLyogbnVtIG9mIGZyYW1lcyBuZWVkcyB0byBiZSBnZW5lcmF0ZWQuCisgICAgICogb25seSB2YWxpZCB3aGVuIHN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0JVUlNUICovCisgICAgdWludDhfdCBudW1fb2ZfYnVyc3Q7CisKKyAgICAvKiBudW0gb2YgZnJhbWVzIGluIG9uZSBiYXRjaC4KKyAgICAgKiBvbmx5IHZhbGlkIHdoZW4gc3RyZWFtaW5nX21vZGUgPSBDQU1fU1RSRUFNSU5HX01PREVfQkFUQ0ggKi8KKyAgICBjYW1fc3RyZWFtX3VzZXJfYnVmX2luZm9fdCB1c2VyX2J1Zl9pbmZvOworCisgICAgLyogc3RyZWFtIHNwZWNpZmljIHBwIGNvbmZpZyAqLworICAgIGNhbV9wcF9mZWF0dXJlX2NvbmZpZ190IHBwX2NvbmZpZzsKKworICAgIC8qIHRoaXMgc2VjdGlvbiBpcyB2YWxpZCBpZiBvZmZsaW5lIHJlcHJvY2VzcyB0eXBlIHN0cmVhbSAqLworICAgIGNhbV9zdHJlYW1fcmVwcm9jX2NvbmZpZ190IHJlcHJvY2Vzc19jb25maWc7CisKKyAgICBjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgcGFybV9idWY7ICAgIC8qIHN0cmVhbSBiYXNlZCBwYXJhbWV0ZXJzICovCisKKyAgICB1aW50OF90IGRpc19lbmFibGU7CisKKyAgICAvKiBJbWFnZSBTdGFiaWxpemF0aW9uIHR5cGUgKi8KKyAgICBjYW1faXNfdHlwZV90IGlzX3R5cGU7CisKKyAgICAvKiBTaWduaWZpZXMgU2VjdXJlIHN0cmVhbSBtb2RlICovCisgICAgY2FtX3N0cmVhbV9zZWN1cmVfdCBpc19zZWN1cmU7CisKKyAgICAvKiBQcmVmZXJyZWQgUGVyZm9ybWFuY2UgbW9kZSAqLworICAgIGNhbV9wZXJmX21vZGVfdCBwZXJmX21vZGU7CisKKyAgICAvKiBpZiBmcmFtZXMgd2lsbCBub3QgYmUgcmVjZWl2ZWQgKi8KKyAgICB1aW50OF90IG5vRnJhbWVFeHBlY3RlZDsKKworICAgIC8qIERUIGZvciB0aGlzIHN0cmVhbSAqLworICAgIGludDMyX3QgZHQ7CisKKyAgICAvKiBWQyBmb3IgdGhpcyBzdHJlYW0gKi8KKyAgICBpbnQzMl90IHZjOworCisgICAvKiBTdWJmb3JtYXQgZm9yIHRoaXMgc3RyZWFtICovCisgICAgY2FtX3N1Yl9mb3JtYXRfdHlwZV90IHN1Yl9mb3JtYXRfdHlwZTsKKworfSBjYW1fc3RyZWFtX2luZm9fdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgQ29kZSBmb3IgRG9tYWluIFNvY2tldCBCYXNlZCBQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJTkNMVURFKFBBUkFNX0lELERBVEFUWVBFLENPVU5UKSAgXAorICAgICAgICBEQVRBVFlQRSBtZW1iZXJfdmFyaWFibGVfIyNQQVJBTV9JRFsgQ09VTlQgXQorCisjZGVmaW5lIFBPSU5URVJfT0ZfTUVUQShNRVRBX0lELCBUQUJMRV9QVFIpIFwKKyAgICAgICAgKChOVUxMICE9IFRBQkxFX1BUUikgPyBcCisgICAgICAgICAgICAoJlRBQkxFX1BUUi0+ZGF0YS5tZW1iZXJfdmFyaWFibGVfIyNNRVRBX0lEWyAwIF0pIDogKE5VTEwpKQorCisjZGVmaW5lIFNJWkVfT0ZfUEFSQU0oTUVUQV9JRCwgVEFCTEVfUFRSKSBcCisgICAgICAgIHNpemVvZihUQUJMRV9QVFItPmRhdGEubWVtYmVyX3ZhcmlhYmxlXyMjTUVUQV9JRCkKKworI2RlZmluZSBJRl9NRVRBX0FWQUlMQUJMRShNRVRBX1RZUEUsIE1FVEFfUFRSX05BTUUsIE1FVEFfSUQsIFRBQkxFX1BUUikgXAorICAgICAgICBNRVRBX1RZUEUgKk1FVEFfUFRSX05BTUUgPSBcCisgICAgICAgICgoKE5VTEwgIT0gVEFCTEVfUFRSKSAmJiAoVEFCTEVfUFRSLT5pc192YWxpZFtNRVRBX0lEXSkpID8gXAorICAgICAgICAgICAgKCZUQUJMRV9QVFItPmRhdGEubWVtYmVyX3ZhcmlhYmxlXyMjTUVUQV9JRFsgMCBdKSA6IFwKKyAgICAgICAgICAgIChOVUxMKSk7IFwKKyAgICAgICAgaWYgKE5VTEwgIT0gTUVUQV9QVFJfTkFNRSkgXAorCisjZGVmaW5lIEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0goVEFCTEVfUFRSLCBNRVRBX0lELCBEQVRBKSBcCisgICAgKChOVUxMICE9IFRBQkxFX1BUUikgPyBcCisgICAgKChUQUJMRV9QVFItPmRhdGEubWVtYmVyX3ZhcmlhYmxlXyMjTUVUQV9JRFsgMCBdID0gREFUQSksIFwKKyAgICAoVEFCTEVfUFRSLT5pc192YWxpZFtNRVRBX0lEXSA9IDEpLCAoMCkpIDogXAorICAgICgoTE9HRSgiVW5hYmxlIHRvIHNldCBtZXRhZGF0YSBUQUJMRV9QVFI6JXAgTUVUQV9JRDolZCIsIFwKKyAgICAgICAgICAgIFRBQkxFX1BUUiwgTUVUQV9JRCkpLCAoLTEpKSkgXAorCisjZGVmaW5lIEFERF9TRVRfUEFSQU1fQVJSQVlfVE9fQkFUQ0goVEFCTEVfUFRSLCBNRVRBX0lELCBQREFUQSwgQ09VTlQsIFJDT1VOVCkgXAoreyBcCisgICAgaWYgKChOVUxMICE9IFRBQkxFX1BUUikgJiYgXAorICAgICAgICAgICAgKDAgPCBDT1VOVCkgJiYgXAorICAgICAgICAgICAgKChzaXplb2YoVEFCTEVfUFRSLT5kYXRhLm1lbWJlcl92YXJpYWJsZV8jI01FVEFfSUQpIC8gXAorICAgICAgICAgICAgc2l6ZW9mKFRBQkxFX1BUUi0+ZGF0YS5tZW1iZXJfdmFyaWFibGVfIyNNRVRBX0lEWyAwIF0pKSBcCisgICAgICAgICAgICA+PSBDT1VOVCkpICB7IFwKKyAgICAgICAgZm9yIChzaXplX3QgX2kgPSAwOyBfaSA8IENPVU5UIDsgX2krKykgeyBcCisgICAgICAgICAgICBUQUJMRV9QVFItPmRhdGEubWVtYmVyX3ZhcmlhYmxlXyMjTUVUQV9JRFsgX2kgXSA9IFBEQVRBIFsgX2kgXTsgXAorICAgICAgICB9IFwKKyAgICAgICAgVEFCTEVfUFRSLT5pc192YWxpZFtNRVRBX0lEXSA9IDE7IFwKKyAgICAgICAgUkNPVU5UID0gQ09VTlQ7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICAgIExPR0UoIlVuYWJsZSB0byBzZXQgbWV0YWRhdGEgVEFCTEVfUFRSOiVwIE1FVEFfSUQ6JWQgQ09VTlQ6JXp1IiwgXAorICAgICAgICAgICAgICBUQUJMRV9QVFIsIE1FVEFfSUQsIENPVU5UKTsgXAorICAgICAgICBSQ09VTlQgPSAwOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgQUREX0dFVF9QQVJBTV9FTlRSWV9UT19CQVRDSChUQUJMRV9QVFIsIE1FVEFfSUQpIFwKK3sgXAorICAgIGlmIChOVUxMICE9IFRBQkxFX1BUUikgeyBcCisgICAgICAgIFRBQkxFX1BUUi0+aXNfcmVxZFtNRVRBX0lEXSA9IDE7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICAgIExPR0UoIlVuYWJsZSB0byBnZXQgbWV0YWRhdGEgVEFCTEVfUFRSOiVwIE1FVEFfSUQ6JWQiLCBcCisgICAgICAgICAgICAgICAgICBUQUJMRV9QVFIsIE1FVEFfSUQpOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgUkVBRF9QQVJBTV9FTlRSWShUQUJMRV9QVFIsIE1FVEFfSUQsIERBVEEpIFwKK3sgXAorICAgIGlmIChOVUxMICE9IFRBQkxFX1BUUikgeyBcCisgICAgICAgIERBVEEgPSBUQUJMRV9QVFItPmRhdGEubWVtYmVyX3ZhcmlhYmxlXyMjTUVUQV9JRFsgMCBdOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBMT0dFKCJVbmFibGUgdG8gcmVhZCBtZXRhZGF0YSBUQUJMRV9QVFI6JXAgTUVUQV9JRDolZCIsIFwKKyAgICAgICAgICAgICAgICAgIFRBQkxFX1BUUiwgTUVUQV9JRCk7IFwKKyAgICB9IFwKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDdXN0b20gcGFyYW1ldGVyIGRhdGEgZGVmaW5pdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKkNBTV9DVVNUT01fUEFSTV9FWEFNUExFIGlzIGFkZGVkIHRvIGV4cGxhaW4gY3VzdG9tIHBhcmFtIHByb2NlZHVyZSovCisgICAgSU5DTFVERShDQU1fQ1VTVE9NX1BBUk1fRVhBTVBMRSwgICAgICAgICAgICBpbnQzMl90LCAgICAgICAgICAgMSk7Cit9IGN1c3RvbV9wYXJtX2RhdGFfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBDdXN0b20gUGFyYW1ldGVyIGJ1ZmZlciBkZWZpbml0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuaW9uIHsKKyAgICAgICAgLyogSGFzaCB0YWJsZSBvZiAnaXMgdmFsaWQnIGZsYWdzICovCisgICAgICAgIHVpbnQ4X3QgICAgICAgICBpc192YWxpZFtDQU1fQ1VTVE9NX1BBUk1fTUFYXTsKKworICAgICAgICAvKiBIYXNoIHRhYmxlIG9mICdpcyByZXF1aXJlZCcgZmxhZ3MgZm9yIHRoZSBHRVQgUEFSQU0gKi8KKyAgICAgICAgdWludDhfdCAgICAgICAgIGlzX3JlcWRbQ0FNX0NVU1RPTV9QQVJNX01BWF07CisgICAgfTsKKyAgICBjdXN0b21fcGFybV9kYXRhX3QgZGF0YTsKK30gY3VzdG9tX3Bhcm1fYnVmZmVyX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgSUQgZnJvbSAoY2FtX2ludGZfbWV0YWRhdGFfdHlwZV90KSAgICAgICAgICAgICAgICBEQVRBVFlQRSAgICAgICAgICAgICAgICAgICAgIENPVU5UCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogY29tbW9uIGJldHdlZW4gSEFMMSBhbmQgSEFMMyAqLworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9ISVNUT0dSQU0sICAgICAgICAgICAgICAgICAgICBjYW1faGlzdF9zdGF0c190LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GQUNFX0RFVEVDVElPTiwgICAgICAgICAgICAgICBjYW1fZmFjZV9kZXRlY3Rpb25fZGF0YV90LCAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GQUNFX1JFQ09HLCAgICAgICAgICAgICAgICAgICBjYW1fZmFjZV9yZWNvZ19kYXRhX3QsICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GQUNFX0JMSU5LLCAgICAgICAgICAgICAgICAgICBjYW1fZmFjZV9ibGlua19kYXRhX3QsICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GQUNFX0dBWkUsICAgICAgICAgICAgICAgICAgICBjYW1fZmFjZV9nYXplX2RhdGFfdCwgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GQUNFX1NNSUxFLCAgICAgICAgICAgICAgICAgICBjYW1fZmFjZV9zbWlsZV9kYXRhX3QsICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GQUNFX0xBTkRNQVJLLCAgICAgICAgICAgICAgICBjYW1fZmFjZV9sYW5kbWFya3NfZGF0YV90LCAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GQUNFX0NPTlRPVVIsICAgICAgICAgICAgICAgICBjYW1fZmFjZV9jb250b3VyX2RhdGFfdCwgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9BVVRPRk9DVVNfREFUQSwgICAgICAgICAgICAgICBjYW1fYXV0b19mb2N1c19kYXRhX3QsICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9DRFNfREFUQSwgICAgICAgICAgICAgICAgICAgICBjYW1fY2RzX2RhdGFfdCwgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfUEFSTV9VUERBVEVfREVCVUdfTEVWRUwsICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgICAgIDEpOworCisgICAgLyogU3BlY2lmaWMgdG8gSEFsMSAqLworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9DUk9QX0RBVEEsICAgICAgICAgICAgICAgICAgICBjYW1fY3JvcF9kYXRhX3QsICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9QUkVQX1NOQVBTSE9UX0RPTkUsICAgICAgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9HT09EX0ZSQU1FX0lEWF9SQU5HRSwgICAgICAgICBjYW1fZnJhbWVfaWR4X3JhbmdlX3QsICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9BU0RfSERSX1NDRU5FX0RBVEEsICAgICAgICAgICBjYW1fYXNkX2hkcl9zY2VuZV9kYXRhX3QsICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9BU0RfU0NFTkVfSU5GTywgICAgICAgICAgICAgICBjYW1fYXNkX2RlY2lzaW9uX3QsICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9DVVJSRU5UX1NDRU5FLCAgICAgICAgICAgICAgICBjYW1fc2NlbmVfbW9kZV90eXBlLCAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9BV0JfSU5GTywgICAgICAgICAgICAgICAgICAgICBjYW1fYXdiX3BhcmFtc190LCAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GT0NVU19QT1NJVElPTiwgICAgICAgICAgICAgICBjYW1fZm9jdXNfcG9zX2luZm9fdCwgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9DSFJPTUFUSVhfTElURV9JU1AsICAgICAgICAgICBjYW1fY2hyb21hdGl4X2xpdGVfaXNwX3QsICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9DSFJPTUFUSVhfTElURV9QUCwgICAgICAgICAgICBjYW1fY2hyb21hdGl4X2xpdGVfcHBfdCwgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9DSFJPTUFUSVhfTElURV9BRSwgICAgICAgICAgICBjYW1fY2hyb21hdGl4X2xpdGVfYWVfc3RhdHNfdCwgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9DSFJPTUFUSVhfTElURV9BV0IsICAgICAgICAgICBjYW1fY2hyb21hdGl4X2xpdGVfYXdiX3N0YXRzX3QsIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9DSFJPTUFUSVhfTElURV9BRiwgICAgICAgICAgICBjYW1fY2hyb21hdGl4X2xpdGVfYWZfc3RhdHNfdCwgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9DSFJPTUFUSVhfTElURV9BU0QsICAgICAgICAgICBjYW1fY2hyb21hdGl4X2xpdGVfYXNkX3N0YXRzX3QsIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfQlVGX0RJVkVSVF9JTkZPLCAgICAgICAgICAgICAgICAgICBjYW1fYnVmX2RpdmVydF9pbmZvX3QsICAgICAgICAgIDEpOworCisgICAgLyogU3BlY2lmaWMgdG8gSEFMMyAqLworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GUkFNRV9OVU1CRVJfVkFMSUQsICAgICAgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9VUkdFTlRfRlJBTUVfTlVNQkVSX1ZBTElELCAgICBpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GUkFNRV9EUk9QUEVELCAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX0lEX3QsICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GUkFNRV9OVU1CRVIsICAgICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9VUkdFTlRfRlJBTUVfTlVNQkVSLCAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9DT0xPUl9DT1JSRUNUX01PREUsICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9DT0xPUl9DT1JSRUNUX1RSQU5TRk9STSwgICAgICBjYW1fY29sb3JfY29ycmVjdF9tYXRyaXhfdCwgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9DT0xPUl9DT1JSRUNUX0dBSU5TLCAgICAgICAgICBjYW1fY29sb3JfY29ycmVjdF9nYWluc190LCAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9QUkVEX0NPTE9SX0NPUlJFQ1RfVFJBTlNGT1JNLCBjYW1fY29sb3JfY29ycmVjdF9tYXRyaXhfdCwgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9QUkVEX0NPTE9SX0NPUlJFQ1RfR0FJTlMsICAgICBjYW1fY29sb3JfY29ycmVjdF9nYWluc190LCAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9BRUNfUk9JLCAgICAgICAgICAgICAgICAgICAgICBjYW1fYXJlYV90LCAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9BRUNfU1RBVEUsICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfUEFSTV9GT0NVU19NT0RFLCAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfUEFSTV9NQU5VQUxfRk9DVVNfUE9TLCAgICAgICAgICAgICBjYW1fbWFudWFsX2ZvY3VzX3Bhcm1fdCwgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9BRl9ST0ksICAgICAgICAgICAgICAgICAgICAgICBjYW1fYXJlYV90LCAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9BRl9TVEFURSwgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfUEFSTV9XSElURV9CQUxBTkNFLCAgICAgICAgICAgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9BV0JfUkVHSU9OUywgICAgICAgICAgICAgICAgICBjYW1fYXJlYV90LCAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9BV0JfU1RBVEUsICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9BV0JfQ09OVkVSR0VOQ0VfU1BFRUQsICAgICAgICBmbG9hdCwgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9CTEFDS19MRVZFTF9MT0NLLCAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9NT0RFLCAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9FREdFX01PREUsICAgICAgICAgICAgICAgICAgICBjYW1fZWRnZV9hcHBsaWNhdGlvbl90LCAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GTEFTSF9QT1dFUiwgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GTEFTSF9GSVJJTkdfVElNRSwgICAgICAgICAgICBpbnQ2NF90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GTEFTSF9NT0RFLCAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GTEFTSF9TVEFURSwgICAgICAgICAgICAgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9IT1RQSVhFTF9NT0RFLCAgICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9MRU5TX0FQRVJUVVJFLCAgICAgICAgICAgICAgICBmbG9hdCwgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9MRU5TX0ZJTFRFUkRFTlNJVFksICAgICAgICAgICBmbG9hdCwgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9MRU5TX0ZPQ0FMX0xFTkdUSCwgICAgICAgICAgICBmbG9hdCwgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9MRU5TX0ZPQ1VTX0RJU1RBTkNFLCAgICAgICAgICBmbG9hdCwgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9GT0NVU19WQUxVRSwgICAgICAgICAgICAgICAgICBmbG9hdCwgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TUE9UX0xJR0hUX0RFVEVDVCwgICAgICAgICAgICB1aW50OF90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9MRU5TX0ZPQ1VTX1JBTkdFLCAgICAgICAgICAgICBmbG9hdCwgICAgICAgICAgICAgICAgICAgICAgIDIpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9MRU5TX1NUQVRFLCAgICAgICAgICAgICAgICAgICBjYW1fYWZfbGVuc19zdGF0ZV90LCAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9MRU5TX09QVF9TVEFCX01PREUsICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9WSURFT19TVEFCX01PREUsICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9MRU5TX0ZPQ1VTX1NUQVRFLCAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9OT0lTRV9SRURVQ1RJT05fTU9ERSwgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9OT0lTRV9SRURVQ1RJT05fU1RSRU5HVEgsICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TQ0FMRVJfQ1JPUF9SRUdJT04sICAgICAgICAgICBjYW1fY3JvcF9yZWdpb25fdCwgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TQ0VORV9GTElDS0VSLCAgICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TRU5TT1JfRVhQT1NVUkVfVElNRSwgICAgICAgICBpbnQ2NF90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TRU5TT1JfRlJBTUVfRFVSQVRJT04sICAgICAgICBpbnQ2NF90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TRU5TT1JfU0VOU0lUSVZJVFksICAgICAgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9JU1BfU0VOU0lUSVZJVFkgLCAgICAgICAgICAgICBpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TRU5TT1JfVElNRVNUQU1QLCAgICAgICAgICAgICBpbnQ2NF90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TRU5TT1JfUk9MTElOR19TSFVUVEVSX1NLRVcsICBpbnQ2NF90LCAgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TSEFESU5HX01PREUsICAgICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TVEFUU19GQUNFREVURUNUX01PREUsICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TVEFUU19ISVNUT0dSQU1fTU9ERSwgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TVEFUU19TSEFSUE5FU1NfTUFQX01PREUsICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TVEFUU19TSEFSUE5FU1NfTUFQLCAgICAgICAgICBjYW1fc2hhcnBuZXNzX21hcF90LCAgICAgICAgIDMpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9UT05FTUFQX0NVUlZFUywgICAgICAgICAgICAgICBjYW1fcmdiX3RvbmVtYXBfY3VydmVzLCAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9MRU5TX1NIQURJTkdfTUFQLCAgICAgICAgICAgICBjYW1fbGVuc19zaGFkaW5nX21hcF90LCAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9BRUNfSU5GTywgICAgICAgICAgICAgICAgICAgICBjYW1fM2FfcGFyYW1zX3QsICAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9TRU5TT1JfSU5GTywgICAgICAgICAgICAgICAgICBjYW1fc2Vuc29yX3BhcmFtc190LCAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX0FFLCAgICAgICAgICAgICAgICBjYW1fYWVfZXhpZl9kZWJ1Z190LCAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX0FXQiwgICAgICAgICAgICAgICBjYW1fYXdiX2V4aWZfZGVidWdfdCwgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX0FGLCAgICAgICAgICAgICAgICBjYW1fYWZfZXhpZl9kZWJ1Z190LCAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX0FTRCwgICAgICAgICAgICAgICBjYW1fYXNkX2V4aWZfZGVidWdfdCwgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX1NUQVRTLCAgICAgICAgICAgICBjYW1fc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdCwgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR19CRVNUQVRTLCAgICAgICAgICAgY2FtX2Jlc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdCwgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQkhJU1QsICAgICAgICAgICAgIGNhbV9iaGlzdF9idWZmZXJfZXhpZl9kZWJ1Z190LCAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHXzNBX1RVTklORywgICAgICAgICBjYW1fcTNhX3R1bmluZ19pbmZvX3QsICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfTUVUQV9BU0RfU0NFTkVfQ0FQVFVSRV9UWVBFLCAgICAgICBjYW1fYXV0b19zY2VuZV90LCAgICAgICAgICAgIDEpOworICAgIElOQ0xVREUoQ0FNX0lOVEZfUEFSTV9FRkZFQ1QsICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgICAgICAgICAgICAgICAgICAgIDEpOworICAgIC8qIERlZmluaW5nIGFzIGludDMyX3Qgc28gdGhhdCB0aGlzIGFycmF5IGlzIDQgYnl0ZSBhbGlnbmVkICovCisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX1BSSVZBVEVfREFUQSwgICAgICAgICAgICAgICAgIGludDMyX3QsCisgICAgICAgICAgICBNQVhfTUVUQURBVEFfUFJJVkFURV9QQVlMT0FEX1NJWkVfSU5fQllURVMgLyA0KTsKKworICAgIC8qIEZvbGxvd2luZyBhcmUgUGFyYW1zIG9ubHkgYW5kIG5vdCBtZXRhZGF0YSBjdXJyZW50bHkgKi8KKyAgICBJTkNMVURFKENBTV9JTlRGX1BBUk1fSEFMX1ZFUlNJT04sICAgICAgICAgICAgICAgICAgaW50MzJfdCwgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAvKiBTaGFyZWQgYmV0d2VlbiBIQUwxIGFuZCBIQUwzICovCisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0FOVElCQU5ESU5HLCAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0VYUE9TVVJFX0NPTVBFTlNBVElPTiwgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0VWX1NURVAsICAgICAgICAgICAgICAgICAgICAgIGNhbV9yYXRpb25hbF90eXBlX3QsICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0FFQ19MT0NLLCAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0ZQU19SQU5HRSwgICAgICAgICAgICAgICAgICAgIGNhbV9mcHNfcmFuZ2VfdCwgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0FXQl9MT0NLLCAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0JFU1RTSE9UX01PREUsICAgICAgICAgICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0RJU19FTkFCTEUsICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0xFRF9NT0RFLCAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0xFRF9NT0RFX09WRVJSSURFLCAgICAgICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMSk7CisKKyAgICAvKiBkdWFsIGNhbWVyYSBzcGVjaWZpYyBwYXJhbXMgKi8KKyAgICBJTkNMVURFKENBTV9JTlRGX1BBUk1fUkVMQVRFRF9TRU5TT1JTX0NBTElCUkFUSU9OLCAgY2FtX3JlbGF0ZWRfc3lzdGVtX2NhbGlicmF0aW9uX2RhdGFfdCwgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0FGX0ZPQ0FMX0xFTkdUSF9SQVRJTywgICAgICAgIGNhbV9mb2NhbF9sZW5ndGhfcmF0aW9fdCwgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX1NOQVBfQ1JPUF9JTkZPX1NFTlNPUiwgICAgICAgIGNhbV9zdHJlYW1fY3JvcF9pbmZvX3QsICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX1NOQVBfQ1JPUF9JTkZPX0NBTUlGLCAgICAgICAgIGNhbV9zdHJlYW1fY3JvcF9pbmZvX3QsICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX1NOQVBfQ1JPUF9JTkZPX0lTUCwgICAgICAgICAgIGNhbV9zdHJlYW1fY3JvcF9pbmZvX3QsICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX1NOQVBfQ1JPUF9JTkZPX0NQUCwgICAgICAgICAgIGNhbV9zdHJlYW1fY3JvcF9pbmZvX3QsICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0RDUkYsICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9kY3JmX3Jlc3VsdF90LCAgICAgICAgMSk7CisKKyAgICAvKiBIQUwxIHNwZWNpZmljICovCisgICAgLyogcmVhZCBvbmx5ICovCisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1FVRVJZX0ZMQVNINFNOQVAsICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0VYUE9TVVJFLCAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1NIQVJQTkVTUywgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0NPTlRSQVNULCAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1NBVFVSQVRJT04sICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0JSSUdIVE5FU1MsICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0lTTywgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9pbnRmX3Bhcm1fbWFudWFsXzNhX3QsICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0VYUE9TVVJFX1RJTUUsICAgICAgICAgICAgICAgIGNhbV9pbnRmX3Bhcm1fbWFudWFsXzNhX3QsICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1pPT00sICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1JPTExPRkYsICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX01PREUsICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0FFQ19BTEdPX1RZUEUsICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0ZPQ1VTX0FMR09fVFlQRSwgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0FFQ19ST0ksICAgICAgICAgICAgICAgICAgICAgIGNhbV9zZXRfYWVjX3JvaV90LCAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0FGX1JPSSwgICAgICAgICAgICAgICAgICAgICAgIGNhbV9yb2lfaW5mb190LCAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1NDRV9GQUNUT1IsICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0ZELCAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9mZF9zZXRfcGFybV90LCAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX01DRSwgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0hGUiwgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1JFREVZRV9SRURVQ1RJT04sICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1dBVkVMRVRfREVOT0lTRSwgICAgICAgICAgICAgIGNhbV9kZW5vaXNlX3BhcmFtX3QsICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1RFTVBPUkFMX0RFTk9JU0UsICAgICAgICAgICAgIGNhbV9kZW5vaXNlX3BhcmFtX3QsICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0hJU1RPR1JBTSwgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0FTRF9FTkFCTEUsICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1JFQ09SRElOR19ISU5ULCAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0hEUiwgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9leHBfYnJhY2tldGluZ190LCAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0ZSQU1FU0tJUCwgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1pTTF9NT0RFLCAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0hEUl9ORUVEXzFYLCAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0xPQ0tfQ0FGLCAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1ZJREVPX0hEUiwgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1NFTlNPUl9IRFIsICAgICAgICAgICAgICAgICAgIGNhbV9zZW5zb3JfaGRyX3R5cGVfdCwgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1ZULCAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1NFVF9BVVRPRk9DVVNUVU5JTkcsICAgICAgICAgIHR1bmVfYWN0dWF0b3JfdCwgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1NFVF9WRkVfQ09NTUFORCwgICAgICAgICAgICAgIHR1bmVfY21kX3QsICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1NFVF9QUF9DT01NQU5ELCAgICAgICAgICAgICAgIHR1bmVfY21kX3QsICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX01BWF9ESU1FTlNJT04sICAgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCwgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1JBV19ESU1FTlNJT04sICAgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCwgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1RJTlRMRVNTLCAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1dCX01BTlVBTCwgICAgICAgICAgICAgICAgICAgIGNhbV9tYW51YWxfd2JfcGFybV90LCAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0NEU19NT0RFLCAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0VaVFVORV9DTUQsICAgICAgICAgICAgICAgICAgIGNhbV9lenR1bmVfY21kX2RhdGFfdCwgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0lOVF9FVlQsICAgICAgICAgICAgICAgICAgICAgIGNhbV9pbnRfZXZ0X3BhcmFtc190LCAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1JESV9NT0RFLCAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0JVUlNUX05VTSwgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1JFVFJPX0JVUlNUX05VTSwgICAgICAgICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0JVUlNUX0xFRF9PTl9QRVJJT0QsICAgICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0xPTkdTSE9UX0VOQUJMRSwgICAgICAgICAgICAgIGludDhfdCwgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1RPTkVfTUFQX01PREUsICAgICAgICAgICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX1RPVUNIX0FFX1JFU1VMVCwgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0RVQUxfTEVEX0NBTElCUkFUSU9OLCAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0FEVl9DQVBUVVJFX01PREUsICAgICAgICAgICAgIHVpbnQ4X3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1FVQURSQV9DRkEsICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX1JBVywgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCwgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX1NUUkVBTV9JTkZPX0ZPUl9QSUNfUkVTLCAgICAgIGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QsICAgICAgMSk7CisKKworICAgIC8qIEhBTDMgc3BlY2lmaWMgKi8KKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfU1RSRUFNX0lORk8sICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9zaXplX2luZm9fdCwgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfQUVDX01PREUsICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfQUVDX0NPTlZFUkdFTkNFX1NQRUVELCAgICAgICAgZmxvYXQsICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfQUVDX1BSRUNBUFRVUkVfVFJJR0dFUiwgICAgICAgY2FtX3RyaWdnZXJfdCwgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfQUZfVFJJR0dFUiwgICAgICAgICAgICAgICAgICAgY2FtX3RyaWdnZXJfdCwgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfQ0FQVFVSRV9JTlRFTlQsICAgICAgICAgICAgICAgdWludDMyX3QsICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfREVNT1NBSUMsICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCwgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfU0hBUlBORVNTX1NUUkVOR1RILCAgICAgICAgICAgaW50MzJfdCwgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfR0VPTUVUUklDX01PREUsICAgICAgICAgICAgICAgdWludDMyX3QsICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfR0VPTUVUUklDX1NUUkVOR1RILCAgICAgICAgICAgdWludDMyX3QsICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfTEVOU19TSEFESU5HX01BUF9NT0RFLCAgICAgICAgdWludDMyX3QsICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfU0hBRElOR19TVFJFTkdUSCwgICAgICAgICAgICAgdWludDMyX3QsICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfVE9ORU1BUF9NT0RFLCAgICAgICAgICAgICAgICAgdWludDMyX3QsICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfSVJfTU9ERSwgICAgICAgICAgICAgICAgICAgICAgY2FtX2lyX21vZGVfdHlwZV90LCAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfU1RSRUFNX0lELCAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9JRF90LCAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX1BBUk1fU1RBVFNfREVCVUdfTUFTSywgICAgICAgICAgICAgdWludDMyX3QsICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX1BBUk1fU1RBVFNfQUZfUEFBRiwgICAgICAgICAgICAgICAgdWludDMyX3QsICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX1BBUk1fRk9DVVNfQlJBQ0tFVElORywgICAgICAgICAgICAgY2FtX2FmX2JyYWNrZXRpbmdfdCwgICAgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX1BBUk1fRkxBU0hfQlJBQ0tFVElORywgICAgICAgICAgICAgY2FtX2ZsYXNoX2JyYWNrZXRpbmdfdCwgICAgICAxKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfSlBFR19HUFNfQ09PUkRJTkFURVMsICAgICAgICAgZG91YmxlLCAgICAgICAgICAgICAgICAgICAgICAzKTsKKyAgICBJTkNMVURFKENBTV9JTlRGX01FVEFfSlBFR19HUFNfUFJPQ19NRVRIT0RTLCAgICAgICAgdWludDhfdCwgICAgICAgICAgICAgICAgICAgICBHUFNfUFJPQ0VTU0lOR19NRVRIT0RfU0laRSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0pQRUdfR1BTX1RJTUVTVEFNUCwgICAgICAgICAgIGludDY0X3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0pQRUdfT1JJRU5UQVRJT04sICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0pQRUdfUVVBTElUWSwgICAgICAgICAgICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0pQRUdfVEhVTUJfUVVBTElUWSwgICAgICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0pQRUdfVEhVTUJfU0laRSwgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCwgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX1RFU1RfUEFUVEVSTl9EQVRBLCAgICAgICAgICAgIGNhbV90ZXN0X3BhdHRlcm5fZGF0YV90LCAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX1BST0ZJTEVfVE9ORV9DVVJWRSwgICAgICAgICAgIGNhbV9wcm9maWxlX3RvbmVfY3VydmUsICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX09UUF9XQl9HUkdCLCAgICAgICAgICAgICAgICAgIGZsb2F0LCAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0lNR19IWVNUX0lORk8sICAgICAgICAgICAgICAgIGNhbV9pbWdfaHlzdGVyaXNpc19pbmZvX3QsICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0NBQ19JTkZPLCAgICAgICAgICAgICAgICAgICAgIGNhbV9jYWNfaW5mb190LCAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0NBQywgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9hYmVycmF0aW9uX21vZGVfdCwgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX05FVVRSQUxfQ09MX1BPSU5ULCAgICAgICAgICAgIGNhbV9uZXV0cmFsX2NvbF9wb2ludF90LCAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX1JPVEFUSU9OLCAgICAgICAgICAgICAgICAgICAgIGNhbV9yb3RhdGlvbl9pbmZvX3QsICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0hXX0RBVEFfT1ZFUldSSVRFLCAgICAgICAgICAgIGNhbV9od19kYXRhX292ZXJ3cml0ZV90LCAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0lNR0xJQiwgICAgICAgICAgICAgICAgICAgICAgIGNhbV9pbnRmX21ldGFfaW1nbGliX3QsICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0NBUFRVUkVfRlJBTUVfQ09ORklHLCAgICAgICAgIGNhbV9jYXB0dXJlX2ZyYW1lX2NvbmZpZ190LCAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0NVU1RPTSwgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbV9wYXJtX2J1ZmZlcl90LCAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0ZMSVAsICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX1VTRV9BVl9USU1FUiwgICAgICAgICAgICAgICAgIHVpbnQ4X3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0VGRkVDVElWRV9FWFBPU1VSRV9GQUNUT1IsICAgIGZsb2F0LCAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0xEQUZfRVhJRiwgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMik7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0JMQUNLX0xFVkVMX1NPVVJDRV9QQVRURVJOLCAgIGNhbV9ibGFja19sZXZlbF9tZXRhZGF0YV90LCAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0JMQUNLX0xFVkVMX0FQUExJRURfUEFUVEVSTiwgIGNhbV9ibGFja19sZXZlbF9tZXRhZGF0YV90LCAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0xPV19MSUdIVCwgICAgICAgICAgICAgICAgICAgIGNhbV9sb3dfbGlnaHRfbW9kZV90LCAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0lNR19EWU5fRkVBVCwgICAgICAgICAgICAgICAgIGNhbV9keW5faW1nX2RhdGFfdCwgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX01BTlVBTF9DQVBUVVJFX1RZUEUsICAgICAgICAgIGNhbV9tYW51YWxfY2FwdHVyZV90eXBlLCAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9BRl9TVEFURV9UUkFOU0lUSU9OLCAgICAgICAgICAgICAgIHVpbnQ4X3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0lOSVRJQUxfRVhQT1NVUkVfSU5ERVgsICAgICAgIHVpbnQzMl90LCAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0lOU1RBTlRfQUVDLCAgICAgICAgICAgICAgICAgIHVpbnQ4X3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX1JFUFJPQ0VTU19GTEFHUywgICAgICAgICAgICAgIHVpbnQ4X3QsICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0pQRUdfRU5DT0RFX0NST1AsICAgICAgICAgICAgIGNhbV9zdHJlYW1fY3JvcF9pbmZvX3QsICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9QQVJNX0pQRUdfU0NBTEVfRElNRU5TSU9OLCAgICAgICAgIGNhbV9kaW1lbnNpb25fdCwgICAgICAgICAgICAgMSk7CisgICAgSU5DTFVERShDQU1fSU5URl9NRVRBX0ZPQ1VTX0RFUFRIX0lORk8sICAgICAgICAgICAgIHVpbnQ4X3QsICAgICAgICAgICAgICAgICAgICAgMSk7Cit9IG1ldGFkYXRhX2RhdGFfdDsKKworLyogVXBkYXRlIGNsZWFyX21ldGFkYXRhX2J1ZmZlcigpIGZ1bmN0aW9uIHdoZW4gYSBuZXcgaXNfeHh4X3ZhbGlkIGlzIGFkZGVkIHRvCisgKiBvciByZW1vdmVkIGZyb20gdGhpcyBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bmlvbnsKKyAgICAgICAgLyogSGFzaCB0YWJsZSBvZiAnaXMgdmFsaWQnIGZsYWdzICovCisgICAgICAgIHVpbnQ4X3QgICAgICAgICBpc192YWxpZFtDQU1fSU5URl9QQVJNX01BWF07CisKKyAgICAgICAgLyogSGFzaCB0YWJsZSBvZiAnaXMgcmVxdWlyZWQnIGZsYWdzIGZvciB0aGUgR0VUIFBBUkFNICovCisgICAgICAgIHVpbnQ4X3QgICAgICAgICBpc19yZXFkW0NBTV9JTlRGX1BBUk1fTUFYXTsKKyAgICB9OworICAgIG1ldGFkYXRhX2RhdGFfdCBkYXRhOworICAgIC8qVHVuaW5nIERhdGEgKi8KKyAgICB1aW50OF90IGlzX3R1bmluZ19wYXJhbXNfdmFsaWQ7CisgICAgdHVuaW5nX3BhcmFtc190IHR1bmluZ19wYXJhbXM7CisKKyAgICAvKiBNb2JpY2F0IFBhcmFtcyAqLworICAgIHVpbnQ4X3QgaXNfbW9iaWNhdF9hZWNfcGFyYW1zX3ZhbGlkOworICAgIGNhbV8zYV9wYXJhbXNfdCBtb2JpY2F0X2FlY19wYXJhbXM7CisKKyAgICAvKiBTdGF0cyAzQSBEZWJ1ZyBQYXJhbXMgKi8KKyAgICB1aW50OF90IGlzX3N0YXRzZGVidWdfYWVfcGFyYW1zX3ZhbGlkOworICAgIGNhbV9hZV9leGlmX2RlYnVnX3Qgc3RhdHNkZWJ1Z19hZV9kYXRhOworCisgICAgdWludDhfdCBpc19zdGF0c2RlYnVnX2F3Yl9wYXJhbXNfdmFsaWQ7CisgICAgY2FtX2F3Yl9leGlmX2RlYnVnX3Qgc3RhdHNkZWJ1Z19hd2JfZGF0YTsKKworICAgIHVpbnQ4X3QgaXNfc3RhdHNkZWJ1Z19hZl9wYXJhbXNfdmFsaWQ7CisgICAgY2FtX2FmX2V4aWZfZGVidWdfdCBzdGF0c2RlYnVnX2FmX2RhdGE7CisKKyAgICB1aW50OF90IGlzX3N0YXRzZGVidWdfYXNkX3BhcmFtc192YWxpZDsKKyAgICBjYW1fYXNkX2V4aWZfZGVidWdfdCBzdGF0c2RlYnVnX2FzZF9kYXRhOworCisgICAgdWludDhfdCBpc19zdGF0c2RlYnVnX3N0YXRzX3BhcmFtc192YWxpZDsKKyAgICBjYW1fc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdCBzdGF0c2RlYnVnX3N0YXRzX2J1ZmZlcl9kYXRhOworCisgICAgdWludDhfdCBpc19zdGF0c2RlYnVnX2Jlc3RhdHNfcGFyYW1zX3ZhbGlkOworICAgIGNhbV9iZXN0YXRzX2J1ZmZlcl9leGlmX2RlYnVnX3Qgc3RhdHNkZWJ1Z19iZXN0YXRzX2J1ZmZlcl9kYXRhOworCisgICAgdWludDhfdCBpc19zdGF0c2RlYnVnX2JoaXN0X3BhcmFtc192YWxpZDsKKyAgICBjYW1fYmhpc3RfYnVmZmVyX2V4aWZfZGVidWdfdCBzdGF0c2RlYnVnX2JoaXN0X2RhdGE7CisKKyAgICB1aW50OF90IGlzX3N0YXRzZGVidWdfM2FfdHVuaW5nX3BhcmFtc192YWxpZDsKKyAgICBjYW1fcTNhX3R1bmluZ19pbmZvX3Qgc3RhdHNkZWJ1Z18zYV90dW5pbmdfZGF0YTsKKworfSBtZXRhZGF0YV9idWZmZXJfdDsKKwordHlwZWRlZiBtZXRhZGF0YV9idWZmZXJfdCBwYXJtX2J1ZmZlcl90OworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBVcGRhdGUgdGhpcyBpbmxpbmUgZnVuY3Rpb24gd2hlbiBhIG5ldyBpc194eHhfdmFsaWQgaXMgYWRkZWQgdG8KKyAqIG9yIHJlbW92ZWQgZnJvbSBtZXRhZGF0YV9idWZmZXJfdCAqLworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX21ldGFkYXRhX2J1ZmZlcihtZXRhZGF0YV9idWZmZXJfdCAqbWV0YSkKK3sKKyAgICBpZiAobWV0YSkgeworICAgICAgbWVtc2V0KG1ldGEtPmlzX3ZhbGlkLCAwLCBDQU1fSU5URl9QQVJNX01BWCk7CisgICAgICBtZXRhLT5pc190dW5pbmdfcGFyYW1zX3ZhbGlkID0gMDsKKyAgICAgIG1ldGEtPmlzX21vYmljYXRfYWVjX3BhcmFtc192YWxpZCA9IDA7CisgICAgICBtZXRhLT5pc19zdGF0c2RlYnVnX2FlX3BhcmFtc192YWxpZCA9IDA7CisgICAgICBtZXRhLT5pc19zdGF0c2RlYnVnX2F3Yl9wYXJhbXNfdmFsaWQgPSAwOworICAgICAgbWV0YS0+aXNfc3RhdHNkZWJ1Z19hZl9wYXJhbXNfdmFsaWQgPSAwOworICAgICAgbWV0YS0+aXNfc3RhdHNkZWJ1Z19hc2RfcGFyYW1zX3ZhbGlkID0gMDsKKyAgICAgIG1ldGEtPmlzX3N0YXRzZGVidWdfc3RhdHNfcGFyYW1zX3ZhbGlkID0gMDsKKyAgICAgIG1ldGEtPmlzX3N0YXRzZGVidWdfYmVzdGF0c19wYXJhbXNfdmFsaWQgPSAwOworICAgICAgbWV0YS0+aXNfc3RhdHNkZWJ1Z19iaGlzdF9wYXJhbXNfdmFsaWQgPSAwOworICAgICAgbWV0YS0+aXNfc3RhdHNkZWJ1Z18zYV90dW5pbmdfcGFyYW1zX3ZhbGlkID0gMDsKKyAgICB9Cit9CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19RQ0FNRVJBX0lOVEZfSF9fICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svY29tbW9uL2NhbV9saXN0LmggYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svY29tbW9uL2NhbV9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2NTI2MgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9jb21tb24vY2FtX2xpc3QuaApAQCAtMCwwICsxLDg1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvKiBUaGlzIGZpbGUgaXMgYSBzbGF2ZSBjb3B5IGZyb20gL3ZlbmRvci9xY29tL3Byb3ByZWl0YXJ5L21tLWNhbW1lcmEvY29tbW9uLAorICogUGxlYXNlIGRvIG5vdCBtb2RpZnkgaXQgZGlyZWN0bHkgaGVyZS4gKi8KKworI2lmbmRlZiBfX0NBTUxJU1RfSAorI2RlZmluZSBfX0NBTUxJU1RfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisvLyBTeXN0ZW0gZGVwZW5kZW5jeQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjZGVmaW5lIG1lbWJlcl9vZihwdHIsIHR5cGUsIG1lbWJlcikgKHsgXAorICBjb25zdCB0eXBlb2YoKCh0eXBlICopMCktPm1lbWJlcikgKl9fbXB0ciA9IChwdHIpOyBcCisgICh0eXBlICopKChjaGFyICopX19tcHRyIC0gb2Zmc2V0b2YodHlwZSxtZW1iZXIpKTt9KQorCitzdHJ1Y3QgY2FtX2xpc3QgeworICBzdHJ1Y3QgY2FtX2xpc3QgKm5leHQsICpwcmV2OworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGNhbV9saXN0X2luaXQoc3RydWN0IGNhbV9saXN0ICpwdHIpCit7CisgIHB0ci0+bmV4dCA9IHB0cjsKKyAgcHRyLT5wcmV2ID0gcHRyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2FtX2xpc3RfYWRkX3RhaWxfbm9kZShzdHJ1Y3QgY2FtX2xpc3QgKml0ZW0sCisgIHN0cnVjdCBjYW1fbGlzdCAqaGVhZCkKK3sKKyAgc3RydWN0IGNhbV9saXN0ICpwcmV2ID0gaGVhZC0+cHJldjsKKworICBoZWFkLT5wcmV2ID0gaXRlbTsKKyAgaXRlbS0+bmV4dCA9IGhlYWQ7CisgIGl0ZW0tPnByZXYgPSBwcmV2OworICBwcmV2LT5uZXh0ID0gaXRlbTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNhbV9saXN0X2luc2VydF9iZWZvcmVfbm9kZShzdHJ1Y3QgY2FtX2xpc3QgKml0ZW0sCisgIHN0cnVjdCBjYW1fbGlzdCAqbm9kZSkKK3sKKyAgaXRlbS0+bmV4dCA9IG5vZGU7CisgIGl0ZW0tPnByZXYgPSBub2RlLT5wcmV2OworICBpdGVtLT5wcmV2LT5uZXh0ID0gaXRlbTsKKyAgbm9kZS0+cHJldiA9IGl0ZW07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjYW1fbGlzdF9kZWxfbm9kZShzdHJ1Y3QgY2FtX2xpc3QgKnB0cikKK3sKKyAgc3RydWN0IGNhbV9saXN0ICpwcmV2ID0gcHRyLT5wcmV2OworICBzdHJ1Y3QgY2FtX2xpc3QgKm5leHQgPSBwdHItPm5leHQ7CisKKyAgbmV4dC0+cHJldiA9IHB0ci0+cHJldjsKKyAgcHJldi0+bmV4dCA9IHB0ci0+bmV4dDsKKyAgcHRyLT5uZXh0ID0gcHRyOworICBwdHItPnByZXYgPSBwdHI7Cit9CisKKyNlbmRpZiAvKiBfX0NBTUxJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9jYW1fcXVldWUuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9jb21tb24vY2FtX3F1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiNWY2MwotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9jb21tb24vY2FtX3F1ZXVlLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJjYW1fbGlzdC5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc3RydWN0IGNhbV9saXN0IGxpc3Q7CisgICAgdm9pZCAqZGF0YTsKK30gY2FtX25vZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9ub2RlX3QgaGVhZDsgLyogZHVtbXkgaGVhZCAqLworICAgIHVpbnQzMl90IHNpemU7CisgICAgcHRocmVhZF9tdXRleF90IGxvY2s7Cit9IGNhbV9xdWV1ZV90OworCitzdGF0aWMgaW5saW5lIGludDMyX3QgY2FtX3F1ZXVlX2luaXQoY2FtX3F1ZXVlX3QgKnF1ZXVlKQoreworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmcXVldWUtPmxvY2ssIE5VTEwpOworICAgIGNhbV9saXN0X2luaXQoJnF1ZXVlLT5oZWFkLmxpc3QpOworICAgIHF1ZXVlLT5zaXplID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IGNhbV9xdWV1ZV9lbnEoY2FtX3F1ZXVlX3QgKnF1ZXVlLCB2b2lkICpkYXRhKQoreworICAgIGNhbV9ub2RlX3QgKm5vZGUgPQorICAgICAgICAoY2FtX25vZGVfdCAqKW1hbGxvYyhzaXplb2YoY2FtX25vZGVfdCkpOworICAgIGlmIChOVUxMID09IG5vZGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1lbXNldChub2RlLCAwLCBzaXplb2YoY2FtX25vZGVfdCkpOworICAgIG5vZGUtPmRhdGEgPSBkYXRhOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZxdWV1ZS0+bG9jayk7CisgICAgY2FtX2xpc3RfYWRkX3RhaWxfbm9kZSgmbm9kZS0+bGlzdCwgJnF1ZXVlLT5oZWFkLmxpc3QpOworICAgIHF1ZXVlLT5zaXplKys7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKmNhbV9xdWV1ZV9kZXEoY2FtX3F1ZXVlX3QgKnF1ZXVlKQoreworICAgIGNhbV9ub2RlX3QgKm5vZGUgPSBOVUxMOworICAgIHZvaWQgKmRhdGEgPSBOVUxMOworICAgIHN0cnVjdCBjYW1fbGlzdCAqaGVhZCA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpwb3MgPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZxdWV1ZS0+bG9jayk7CisgICAgaGVhZCA9ICZxdWV1ZS0+aGVhZC5saXN0OworICAgIHBvcyA9IGhlYWQtPm5leHQ7CisgICAgaWYgKHBvcyAhPSBoZWFkKSB7CisgICAgICAgIG5vZGUgPSBtZW1iZXJfb2YocG9zLCBjYW1fbm9kZV90LCBsaXN0KTsKKyAgICAgICAgY2FtX2xpc3RfZGVsX25vZGUoJm5vZGUtPmxpc3QpOworICAgICAgICBxdWV1ZS0+c2l6ZS0tOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcXVldWUtPmxvY2spOworCisgICAgaWYgKE5VTEwgIT0gbm9kZSkgeworICAgICAgICBkYXRhID0gbm9kZS0+ZGF0YTsKKyAgICAgICAgZnJlZShub2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IGNhbV9xdWV1ZV9mbHVzaChjYW1fcXVldWVfdCAqcXVldWUpCit7CisgICAgY2FtX25vZGVfdCAqbm9kZSA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpoZWFkID0gTlVMTDsKKyAgICBzdHJ1Y3QgY2FtX2xpc3QgKnBvcyA9IE5VTEw7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnF1ZXVlLT5sb2NrKTsKKyAgICBoZWFkID0gJnF1ZXVlLT5oZWFkLmxpc3Q7CisgICAgcG9zID0gaGVhZC0+bmV4dDsKKworICAgIHdoaWxlKHBvcyAhPSBoZWFkKSB7CisgICAgICAgIG5vZGUgPSBtZW1iZXJfb2YocG9zLCBjYW1fbm9kZV90LCBsaXN0KTsKKyAgICAgICAgcG9zID0gcG9zLT5uZXh0OworICAgICAgICBjYW1fbGlzdF9kZWxfbm9kZSgmbm9kZS0+bGlzdCk7CisgICAgICAgIHF1ZXVlLT5zaXplLS07CisKKyAgICAgICAgLyogVE9ETyBsYXRlciB0byBjb25zaWRlciBwdHIgaW5zaWRlIGRhdGEgKi8KKyAgICAgICAgLyogZm9yIG5vdyB3ZSBvbmx5IGFzc3VtZSB0aGVyZSBpcyBubyBwdHIgaW5zaWRlIGRhdGEKKyAgICAgICAgICogc28gd2UgZnJlZSBkYXRhIGRpcmVjdGx5ICovCisgICAgICAgIGlmIChOVUxMICE9IG5vZGUtPmRhdGEpIHsKKyAgICAgICAgICAgIGZyZWUobm9kZS0+ZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShub2RlKTsKKworICAgIH0KKyAgICBxdWV1ZS0+c2l6ZSA9IDA7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IGNhbV9xdWV1ZV9kZWluaXQoY2FtX3F1ZXVlX3QgKnF1ZXVlKQoreworICAgIGNhbV9xdWV1ZV9mbHVzaChxdWV1ZSk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZxdWV1ZS0+bG9jayk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svY29tbW9uL2NhbV9zZW1hcGhvcmUuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9jb21tb24vY2FtX3NlbWFwaG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNTYzNGMKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svY29tbW9uL2NhbV9zZW1hcGhvcmUuaApAQCAtMCwwICsxLDg4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIF9fUUNBTUVSQV9TRU1BUEhPUkVfSF9fCisjZGVmaW5lIF9fUUNBTUVSQV9TRU1BUEhPUkVfSF9fCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW1wbGVtZW50IHNlbWFwaG9yZSB3aXRoIG11dGV4IGFuZCBjb25kaXRpb25hbCB2YXJpYWJsZS4KKyAqIFJlYXNvbiBiZWluZywgUE9TSVggc2VtYXBob3JlIG9uIEFuZHJvaWQgYXJlIG5vdCB1c2VkIG9yCisgKiB3ZWxsIHRlc3RlZC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHZhbDsKKyAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7CisgICAgcHRocmVhZF9jb25kX3QgY29uZDsKK30gY2FtX3NlbWFwaG9yZV90OworCitzdGF0aWMgaW5saW5lIHZvaWQgY2FtX3NlbV9pbml0KGNhbV9zZW1hcGhvcmVfdCAqcywgaW50IG4pCit7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCYocy0+bXV0ZXgpLCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmKHMtPmNvbmQpLCBOVUxMKTsKKyAgICBzLT52YWwgPSBuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2FtX3NlbV9wb3N0KGNhbV9zZW1hcGhvcmVfdCAqcykKK3sKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJihzLT5tdXRleCkpOworICAgIHMtPnZhbCsrOworICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJihzLT5jb25kKSk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJihzLT5tdXRleCkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBjYW1fc2VtX3dhaXQoY2FtX3NlbWFwaG9yZV90ICpzKQoreworICAgIGludCByYyA9IDA7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCYocy0+bXV0ZXgpKTsKKyAgICB3aGlsZSAocy0+dmFsID09IDApCisgICAgICAgIHJjID0gcHRocmVhZF9jb25kX3dhaXQoJihzLT5jb25kKSwgJihzLT5tdXRleCkpOworICAgIHMtPnZhbC0tOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYocy0+bXV0ZXgpKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjYW1fc2VtX2Rlc3Ryb3koY2FtX3NlbWFwaG9yZV90ICpzKQoreworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmKHMtPm11dGV4KSk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJihzLT5jb25kKSk7CisgICAgcy0+dmFsID0gMDsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fUUNBTUVSQV9TRU1BUEhPUkVfSF9fICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svY29tbW9uL2NhbV90eXBlcy5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9jYW1fdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGFjZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9jYW1fdHlwZXMuaApAQCAtMCwwICsxLDI4MzcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1FDQU1FUkFfVFlQRVNfSF9fCisjZGVmaW5lIF9fUUNBTUVSQV9UWVBFU19IX18KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPG1lZGlhL21zbWJfY2FtZXJhLmg+CisKKyNkZWZpbmUgQ0FNX01BWF9OVU1fQlVGU19QRVJfU1RSRUFNIDY0CisjZGVmaW5lIE1BWF9NRVRBREFUQV9QUklWQVRFX1BBWUxPQURfU0laRV9JTl9CWVRFUyA4MDk2CisjZGVmaW5lIEFXQl9ERUJVR19EQVRBX1NJWkUgICAgICAgICAgICAgICAoNDUwMDApCisjZGVmaW5lIEFFQ19ERUJVR19EQVRBX1NJWkUgICAgICAgICAgICAgICAoNTAwMCkKKyNkZWZpbmUgQUZfREVCVUdfREFUQV9TSVpFICAgICAgICAgICAgICAgICg1MDAwMCkKKyNkZWZpbmUgQVNEX0RFQlVHX0RBVEFfU0laRSAgICAgICAgICAgICAgICgxMDApCisjZGVmaW5lIFNUQVRTX0JVRkZFUl9ERUJVR19EQVRBX1NJWkUgICAgICAoNzUwMDApCisjZGVmaW5lIEJFU1RBVFNfQlVGRkVSX0RFQlVHX0RBVEFfU0laRSAgICAoMTUwMDAwKQorI2RlZmluZSBCSElTVF9TVEFUU19ERUJVR19EQVRBX1NJWkUgICAgICAgKDcwMDAwKQorI2RlZmluZSBUVU5JTkdfSU5GT19ERUJVR19EQVRBX1NJWkUgICAgICAgKDQpCisKKyNkZWZpbmUgQ0VJTElORzY0KFgpICgoKFgpICsgMHgwMDAzRikgJiAweEZGRkZGRkMwKQorI2RlZmluZSBDRUlMSU5HMzIoWCkgKCgoWCkgKyAweDAwMDFGKSAmIDB4RkZGRkZGRTApCisjZGVmaW5lIENFSUxJTkcxNihYKSAoKChYKSArIDB4MDAwRikgJiAweEZGRjApCisjZGVmaW5lIENFSUxJTkc0KFgpICAoKChYKSArIDB4MDAwMykgJiAweEZGRkMpCisjZGVmaW5lIENFSUxJTkcyKFgpICAoKChYKSArIDB4MDAwMSkgJiAweEZGRkUpCisKKyNkZWZpbmUgTUFYX1pPT01TX0NOVCA5MQorI2RlZmluZSBNQVhfU0laRVNfQ05UIDQwCisjZGVmaW5lIE1BWF9FWFBfQlJBQ0tFVElOR19MRU5HVEggMzIKKyNkZWZpbmUgTUFYX1JPSSAxMAorI2RlZmluZSBNQVhfU1RSRUFNX05VTV9JTl9CVU5ETEUgOAorI2RlZmluZSBNQVhfTlVNX1NUUkVBTVMgICAgICAgICAgOAorI2RlZmluZSBDSFJPTUFUSVhfU0laRSA2MDAwMAorI2RlZmluZSBDT01NT05DSFJPTUFUSVhfU0laRSA0NTAwMAorI2RlZmluZSBDUFBDSFJPTUFUSVhfU0laRSAzNjAwMAorI2RlZmluZSBTV1BPU1RQUk9DQ0hST01BVElYX1NJWkUgMzYwMDAKKyNkZWZpbmUgQUZUVU5FX1NJWkUgIDMyNzY4CisjZGVmaW5lIEEzQ0hST01BVElYX1NJWkUgMzAwMDAKKyNkZWZpbmUgTUFYX1NDQUxFX1NJWkVTX0NOVCA4CisjZGVmaW5lIE1BWF9TQU1QX0RFQ0lTSU9OX0NOVCAgICAgNjQKKyNkZWZpbmUgU0VOU09SX1BIWVNJQ0FMX1NJWkVfQ05UICAyCisjZGVmaW5lIEVYUE9TVVJFX1RJTUVfUkFOR0VfQ05UICAgMgorI2RlZmluZSBCTEFDS19MRVZFTF9QQVRURVJOX0NOVCAgIDQKKyNkZWZpbmUgRk9SV0FSRF9NQVRSSVhfQ09MUyAgICAgICAzCisjZGVmaW5lIEZPUldBUkRfTUFUUklYX1JPV1MgICAgICAgMworI2RlZmluZSBDT0xPUl9UUkFOU0ZPUk1fQ09MUyAgICAgIDMKKyNkZWZpbmUgQ09MT1JfVFJBTlNGT1JNX1JPV1MgICAgICAzCisjZGVmaW5lIENBTF9UUkFOU0ZPUk1fQ09MUyAgICAgICAgMworI2RlZmluZSBDQUxfVFJBTlNGT1JNX1JPV1MgICAgICAgIDMKKworI2RlZmluZSBNQVhfSVNQX0RBVEFfU0laRSAoMjAqMTAyNCkKKyNkZWZpbmUgTUFYX1BQX0RBVEFfU0laRSAgMTYzODQKKyNkZWZpbmUgTUFYX0FFX1NUQVRTX0RBVEFfU0laRSAgMTAwMAorI2RlZmluZSBNQVhfQVdCX1NUQVRTX0RBVEFfU0laRSAxMDAwCisjZGVmaW5lIE1BWF9BRl9TVEFUU19EQVRBX1NJWkUgIDEwMDAKKyNkZWZpbmUgTUFYX0FTRF9TVEFUU19EQVRBX1NJWkUgMTAwMAorCisjZGVmaW5lIE1BWF9DQVBUVVJFX0JBVENIX05VTSAzMgorCisjZGVmaW5lIFRVTklOR19EQVRBX1ZFUlNJT04gICAgICAgIDYKKyNkZWZpbmUgVFVOSU5HX1NFTlNPUl9EQVRBX01BWCAgICAgMHgxMDAwMCAvKihuZWVkIHZhbHVlIGZyb20gc2Vuc29yIHRlYW0pKi8KKyNkZWZpbmUgVFVOSU5HX1ZGRV9EQVRBX01BWCAgICAgICAgMHgxMDAwMCAvKihuZWVkIHZhbHVlIGZyb20gdmZlIHRlYW0pKi8KKyNkZWZpbmUgVFVOSU5HX0NQUF9EQVRBX01BWCAgICAgICAgMHgxMDAwMCAvKihuZWVkIHZhbHVlIGZyb20gcHByb2MgdGVhbSkqLworI2RlZmluZSBUVU5JTkdfQ0FDX0RBVEFfTUFYICAgICAgICAweDEwMDAwIC8qKG5lZWQgdmFsdWUgZnJvbSBpbWdsaWIgdGVhbSkqLworI2RlZmluZSBUVU5JTkdfREFUQV9NQVggICAgICAgICAgICAoVFVOSU5HX1NFTlNPUl9EQVRBX01BWCArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFVOSU5HX1ZGRV9EQVRBX01BWCArIFRVTklOR19DUFBfREFUQV9NQVggKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRVTklOR19DQUNfREFUQV9NQVgpCisKKyNkZWZpbmUgVFVOSU5HX1NFTlNPUl9EQVRBX09GRlNFVCAgMAorI2RlZmluZSBUVU5JTkdfVkZFX0RBVEFfT0ZGU0VUICAgICBUVU5JTkdfU0VOU09SX0RBVEFfTUFYCisjZGVmaW5lIFRVTklOR19DUFBfREFUQV9PRkZTRVQgICAgIChUVU5JTkdfU0VOU09SX0RBVEFfTUFYICsgVFVOSU5HX1ZGRV9EQVRBX01BWCkKKyNkZWZpbmUgVFVOSU5HX0NBQ19EQVRBX09GRlNFVCAgICAgKFRVTklOR19TRU5TT1JfREFUQV9NQVggKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRVTklOR19WRkVfREFUQV9NQVggKyBUVU5JTkdfQ1BQX0RBVEFfTUFYKQorI2RlZmluZSBNQVhfU1RBVFNfREFUQV9TSVpFIDQwMDAKKworI2RlZmluZSBNQVhfQUZfQlJBQ0tFVElOR19WQUxVRVMgNQorI2RlZmluZSBNQVhfVEVTVF9QQVRURVJOX0NOVCAgICAgOAorCisjZGVmaW5lIEdQU19QUk9DRVNTSU5HX01FVEhPRF9TSVpFIDMzCisjZGVmaW5lIEVYSUZfSU1BR0VfREVTQ1JJUFRJT05fU0laRSAxMDAKKworI2RlZmluZSBNQVhfSU5GTElHSFRfUkVRVUVTVFMgIDYKKyNkZWZpbmUgTUFYX0lORkxJR0hUX0JMT0IgICAgICAzCisjZGVmaW5lIE1JTl9JTkZMSUdIVF9SRVFVRVNUUyAgMworI2RlZmluZSBNSU5fSU5GTElHSFRfNjBGUFNfUkVRVUVTVFMgKDYpCisjZGVmaW5lIE1BWF9JTkZMSUdIVF9SRVBST0NFU1NfUkVRVUVTVFMgMQorI2RlZmluZSBNQVhfSU5GTElHSFRfSEZSX1JFUVVFU1RTICg0OCkKKyNkZWZpbmUgTUlOX0lORkxJR0hUX0hGUl9SRVFVRVNUUyAoNDApCisKKyNkZWZpbmUgUUNBTUVSQV9EVU1QX0ZSTV9MT0NBVElPTiAiL2RhdGEvbWlzYy9jYW1lcmEvIgorI2RlZmluZSBRQ0FNRVJBX01BWF9GSUxFUEFUSF9MRU5HVEggNjQKKworI2RlZmluZSBMSUtFTFkoeCkgICAgICAgX19idWlsdGluX2V4cGVjdCgoeCksIHRydWUpCisjZGVmaW5lIFVOTElLRUxZKHgpICAgICBfX2J1aWx0aW5fZXhwZWN0KCh4KSwgZmFsc2UpCisKKyNkZWZpbmUgUkVMQ0FNX0NBTElCX1JPVF9NQVRSSVhfTUFYIDkKKyNkZWZpbmUgUkVMQ0FNX0NBTElCX1NVUkZBQ0VfUEFSTVNfTUFYIDMyCisjZGVmaW5lIFJFTENBTV9DQUxJQl9SRVNFUlZFRF9NQVggNTAKKworI2RlZmluZSBNQVhfTlVNX0NBTUVSQV9QRVJfQlVORExFICAgIDIgLyogTWF4IG51bWJlciBvZiBjYW1lcmFzIHBlciBidW5kbGUgKi8KKyNkZWZpbmUgRVhUUkFfRlJBTUVfU1lOQ19CVUZGRVJTICAgICA0IC8qIEV4dHJhIGZyYW1lIHN5bmMgYnVmZmVycyBpbiBkYyBtb2RlKi8KKyNkZWZpbmUgTU1fQ0FNRVJBX0ZSQU1FX1NZTkNfTk9ERVMgICBFWFRSQV9GUkFNRV9TWU5DX0JVRkZFUlMKKworI2RlZmluZSBNQVhfUkVQUk9DRVNTX1NUQUxMIDIKKworI2RlZmluZSBRQ0FNRVJBX01BWF9GSUxFUEFUSF9MRU5HVEggNjQKKworI2RlZmluZSBNQVhfRUVQUk9NX1ZFUlNJT05fSU5GT19MRU4gMzIKKworI2RlZmluZSBNQVhfT1BUSUNBTF9CTEFDS19SRUdJT05TIDUKKworLypyZXByb2Nlc3MgcGlwZWxpbmUgc3RhZ2VzIGFyZSBwcHJvYyBhbmQganBlZyAqLworI2RlZmluZSBNQVhfUkVQUk9DRVNTX1BJUEVMSU5FX1NUQUdFUyAyCisKKy8qIERlZmluZXMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBjb2xvciBjb3JyZWN0aW9uIG1hdHJpeCAoQ0NNKSAqLworI2RlZmluZSBBV0JfTlVNX0NDTV9ST1dTICgzKQorCisvKiBEZWZpbmVzIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgY29sb3IgY29ycmVjdGlvbiBtYXRyaXggKENDTSkgKi8KKyNkZWZpbmUgQVdCX05VTV9DQ01fQ09MUyAoMykKKwordHlwZWRlZiB1aW50NjRfdCBjYW1fZmVhdHVyZV9tYXNrX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0hBTF9WMSA9IDEsCisgICAgQ0FNX0hBTF9WMyA9IDMKK30gY2FtX2hhbF92ZXJzaW9uX3Q7CisKKyB0eXBlZGVmIGVudW0geworICAgIENBTV9TVEFUVVNfSU5WQUxJRF9QQVJNICA9IC00LCAvKiBJbmF2bGlkIHBhcmFtZXRlciBwcm92aWRlZCAqLworICAgIENBTV9TVEFUVVNfTk9UX1NVUFBPUlRFRCA9IC0zLCAvKiBQYXJhbWV0ZXIvb3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgKi8KKyAgICBDQU1fU1RBVFVTX0JVU1kgICAgICAgICAgPSAtMiwgLyogb3BlcmF0aW9uIGJ1c3kgKi8KKyAgICBDQU1fU1RBVFVTX0ZBSUxFRCAgICAgICAgPSAtMSwgLyogRmFpbHVyZSBpbiBkb2luZyBvcGVyYXRpb24gKi8KKyAgICBDQU1fU1RBVFVTX1NVQ0NFU1MgICAgICAgPSAgMCwgLyogT3BlcmF0aW9uIFN1Y2NlZGVkICovCisgICAgQ0FNX1NUQVRVU19BQ0NFUFRFRCAgICAgID0gIDEsIC8qIFBhcmFtZXRlciBhY2NlcHRlZCAqLworICAgIENBTV9TVEFUVVNfTUFYICAgICAgICAgICA9ICAyLAorfSBjYW1fc3RhdHVzX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgLyogYmFjayBtYWluIGNhbWVyYSAqLworICAgIENBTV9QT1NJVElPTl9CQUNLLAorICAgIC8qIGZyb250IG1haW4gY2FtZXJhICovCisgICAgQ0FNX1BPU0lUSU9OX0ZST05ULAorICAgIC8qIGJhY2sgYXV4IGNhbWVyYSAqLworICAgIENBTV9QT1NJVElPTl9CQUNLX0FVWCwKKyAgICAvKiBmcm9udCBhdXggY2FtZXJhICovCisgICAgQ0FNX1BPU0lUSU9OX0ZST05UX0FVWAorfSBjYW1fcG9zaXRpb25fdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fRkxJQ0tFUl9OT05FLAorICAgIENBTV9GTElDS0VSXzUwX0haLAorICAgIENBTV9GTElDS0VSXzYwX0haCit9IGNhbV9mbGlja2VyX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0ZPUk1BVF9KUEVHID0gMCwKKyAgICBDQU1fRk9STUFUX1lVVl80MjBfTlYxMiA9IDEsCisgICAgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjEsCisgICAgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjFfQURSRU5PLAorICAgIENBTV9GT1JNQVRfWVVWXzQyMF9ZVjEyLAorICAgIENBTV9GT1JNQVRfWVVWXzQyMl9OVjE2LAorICAgIENBTV9GT1JNQVRfWVVWXzQyMl9OVjYxLAorICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyX1ZFTlVTLAorICAgIC8qIE5vdGU6IEZvciBhbGwgcmF3IGZvcm1hdHMsIGVhY2ggc2NhbmxpbmUgbmVlZHMgdG8gYmUgMTYgYnl0ZXMgYWxpZ25lZCAqLworCisgICAgLyogUGFja2VkIFlVVi9ZVlUgcmF3IGZvcm1hdCwgMTYgYnBwOiA4IGJpdHMgWSBhbmQgOCBiaXRzIFVWLgorICAgICAqIFUgYW5kIFYgYXJlIGludGVybGVhdmVkIHdpdGggWTogWVVZViBvciBZVllWICovCisgICAgQ0FNX0ZPUk1BVF9ZVVZfUkFXXzhCSVRfWVVZViwKKyAgICBDQU1fRk9STUFUX1lVVl9SQVdfOEJJVF9ZVllVLAorICAgIENBTV9GT1JNQVRfWVVWX1JBV184QklUX1VZVlksIC8vMTAKKyAgICBDQU1fRk9STUFUX1lVVl9SQVdfOEJJVF9WWVVZLAorCisgICAgLyogUUNPTSBSQVcgZm9ybWF0cyB3aGVyZSBkYXRhIGlzIHBhY2tlZCBpbnRvIDY0Yml0IHdvcmQuCisgICAgICogOEJQUDogMSA2NC1iaXQgd29yZCBjb250YWlucyA4IHBpeGVscyBwMCAtIHA3LCB3aGVyZSBwMCBpcworICAgICAqICAgICAgIHN0b3JlZCBhdCBMU0IuCisgICAgICogMTBCUFA6IDEgNjQtYml0IHdvcmQgY29udGFpbnMgNiBwaXhlbHMgcDAgLSBwNSwgd2hlcmUgbW9zdAorICAgICAqICAgICAgIHNpZ25pZmljYW50IDQgYml0cyBhcmUgc2V0IHRvIDAuIFAwIGlzIHN0b3JlZCBhdCBMU0IuCisgICAgICogMTJCUFA6IDEgNjQtYml0IHdvcmQgY29udGFpbnMgNSBwaXhlbHMgcDAgLSBwNCwgd2hlcmUgbW9zdAorICAgICAqICAgICAgIHNpZ25pZmljYW50IDQgYml0cyBhcmUgc2V0IHRvIDAuIFAwIGlzIHN0b3JlZCBhdCBMU0IuICovCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV184QlBQX0dCUkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV184QlBQX0dSQkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV184QlBQX1JHR0IsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV184QlBQX0JHR1IsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEJQUF9HQlJHLAorICAgIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBCUFBfR1JCRywKKyAgICBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEwQlBQX1JHR0IsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEJQUF9CR0dSLAorICAgIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTJCUFBfR0JSRywgIC8vMjAKKyAgICBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQlBQX0dSQkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMkJQUF9SR0dCLAorICAgIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTJCUFBfQkdHUiwKKyAgICAvKiBNSVBJIFJBVyBmb3JtYXRzIGJhc2VkIG9uIE1JUEkgQ1NJLTIgc3BlY2lmaWN0aW9uLgorICAgICAqIDhCUFA6IEVhY2ggcGl4ZWwgb2NjdXBpZXMgb25lIGJ5dGVzLCBzdGFydGluZyBhdCBMU0IuCisgICAgICogICAgICAgT3V0cHV0IHdpdGggb2YgaW1hZ2UgaGFzIG5vIHJlc3RyaWN0b25zLgorICAgICAqIDEwQlBQOiBGb3VyIHBpeGVscyBhcmUgaGVsZCBpbiBldmVyeSA1IGJ5dGVzLiBUaGUgb3V0cHV0CisgICAgICogICAgICAgd2l0aCBvZiBpbWFnZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCBwaXhlbHMuCisgICAgICogMTJCUFA6IFR3byBwaXhlbHMgYXJlIGhlbGQgaW4gZXZlcnkgMyBieXRlcy4gVGhlIG91dHB1dAorICAgICAqICAgICAgIHdpZHRoIG9mIGltYWdlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyIHBpeGVscy4gKi8KKyAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzhCUFBfR0JSRywKKyAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzhCUFBfR1JCRywKKyAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzhCUFBfUkdHQiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzhCUFBfQkdHUiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX0dCUkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMEJQUF9HUkJHLAorICAgIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTBCUFBfUkdHQiwgLy8zMAorICAgIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTBCUFBfQkdHUiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEyQlBQX0dCUkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xMkJQUF9HUkJHLAorICAgIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJCUFBfUkdHQiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEyQlBQX0JHR1IsCisgICAgLyogSWRlYWwgcmF3IGZvcm1hdHMgd2hlcmUgaW1hZ2UgZGF0YSBoYXMgZ29uZSB0aHJvdWdoIGJsYWNrCisgICAgICogY29ycmVjdGlvbiwgbGVucyByb2xsb2ZmLCBkZW11eC9jaGFubmVsIGdhaW4sIGJhZCBwaXhlbAorICAgICAqIGNvcnJlY3Rpb24sIGFuZCBBQkYuCisgICAgICogSWRlYWwgcmF3IGZvcm1hdHMgY291bGQgb3V0cHV0IGFueSBvZiBRQ09NX1JBVyBhbmQgTUlQSV9SQVcKKyAgICAgKiBmb3JtYXRzLCBwbHVzIHBsYWluOCA4YmJwLCBwbGFpbjE2IDgwMCwgcGxhaW4xNiAxMGJwcCwgYW5kCisgICAgICogcGxhaW4gMTYgMTJicHAgKi8KKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzhCUFBfR0JSRywKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzhCUFBfR1JCRywKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzhCUFBfUkdHQiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzhCUFBfQkdHUiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzEwQlBQX0dCUkcsIC8vNDAKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzEwQlBQX0dSQkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMEJQUF9SR0dCLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTBCUFBfQkdHUiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzEyQlBQX0dCUkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xMkJQUF9HUkJHLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTJCUFBfUkdHQiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzEyQlBQX0JHR1IsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV84QlBQX0dCUkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV84QlBQX0dSQkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV84QlBQX1JHR0IsIC8vNTAKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzhCUFBfQkdHUiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEwQlBQX0dCUkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xMEJQUF9HUkJHLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTBCUFBfUkdHQiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEwQlBQX0JHR1IsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xMkJQUF9HQlJHLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTJCUFBfR1JCRywKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEyQlBQX1JHR0IsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xMkJQUF9CR0dSLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOOF84QlBQX0dCUkcsIC8vNjAKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjhfOEJQUF9HUkJHLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOOF84QlBQX1JHR0IsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU44XzhCUFBfQkdHUiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzhCUFBfR0JSRywKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzhCUFBfR1JCRywKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzhCUFBfUkdHQiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzhCUFBfQkdHUiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzEwQlBQX0dCUkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU4xNl8xMEJQUF9HUkJHLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOMTZfMTBCUFBfUkdHQiwgLy83MAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOMTZfMTBCUFBfQkdHUiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzEyQlBQX0dCUkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU4xNl8xMkJQUF9HUkJHLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOMTZfMTJCUFBfUkdHQiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzEyQlBQX0JHR1IsCisKKyAgICAvKiBnZW5lcmljIDgtYml0IHJhdyAqLworICAgIENBTV9GT1JNQVRfSlBFR19SQVdfOEJJVCwKKyAgICBDQU1fRk9STUFUX01FVEFfUkFXXzhCSVQsCisKKyAgICAvKiBnZW5lcmljIDEwLWJpdCByYXcgKi8KKyAgICBDQU1fRk9STUFUX01FVEFfUkFXXzEwQklULAorCisgICAgLyogUUNPTSBSQVcgZm9ybWF0cyB3aGVyZSBkYXRhIGlzIHBhY2tlZCBpbnRvIDY0Yml0IHdvcmQuCisgICAgICogMTRCUFA6IDEgNjQtYml0IHdvcmQgY29udGFpbnMgNCBwaXhlbHMgcDAgLSBwMywgd2hlcmUgbW9zdAorICAgICAqICAgICAgIHNpZ25pZmljYW50IDQgYml0cyBhcmUgc2V0IHRvIDAuIFAwIGlzIHN0b3JlZCBhdCBMU0IuCisgICAgICovCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xNEJQUF9HQlJHLAorICAgIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTRCUFBfR1JCRywKKyAgICBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX1JHR0IsIC8vODAKKyAgICBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX0JHR1IsCisgICAgLyogTUlQSSBSQVcgZm9ybWF0cyBiYXNlZCBvbiBNSVBJIENTSS0yIHNwZWNpZmljdGlvbi4KKyAgICAgKiAxNCBCUFBQOiAxc3QgYnl0ZTogUDAgWzEzOjZdCisgICAgICogICAgICAgICAgMm5kIGJ5dGU6IFAxIFsxMzo2XQorICAgICAqICAgICAgICAgIDNyZCBieXRlOiBQMiBbMTM6Nl0KKyAgICAgKiAgICAgICAgICA0dGggYnl0ZTogUDMgWzEzOjZdCisgICAgICogICAgICAgICAgNXRoIGJ5dGU6IFAwIFs1OjBdCisgICAgICogICAgICAgICAgN3RoIGJ5dGU6IFAxIFs1OjBdCisgICAgICogICAgICAgICAgOHRoIGJ5dGU6IFAyIFs1OjBdCisgICAgICogICAgICAgICAgOXRoIGJ5dGU6IFAzIFs1OjBdCisgICAgICovCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xNEJQUF9HQlJHLAorICAgIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTRCUFBfR1JCRywKKyAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzE0QlBQX1JHR0IsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xNEJQUF9CR0dSLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTRCUFBfR0JSRywKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzE0QlBQX0dSQkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xNEJQUF9SR0dCLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTRCUFBfQkdHUiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzE0QlBQX0dCUkcsIC8vOTAKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzE0QlBQX0dSQkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xNEJQUF9SR0dCLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTRCUFBfQkdHUiwKKyAgICAvKiAxNEJQUDogMXN0IGJ5dGU6IFAwIFs4OjBdCisgICAgICogICAgICAgIDJuZCBieXRlOiBQMCBbMTM6OV0KKyAgICAgKiAgICAgICAgM3JkIGJ5dGU6IFAxIFs4OjBdCisgICAgICogICAgICAgIDR0aCBieXRlOiBQMSBbMTM6OV0KKyAgICAgKi8KKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzE0QlBQX0dCUkcsCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU4xNl8xNEJQUF9HUkJHLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOMTZfMTRCUFBfUkdHQiwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzE0QlBQX0JHR1IsCisKKyAgICBDQU1fRk9STUFUX1lVVl80NDRfTlYyNCwKKyAgICBDQU1fRk9STUFUX1lVVl80NDRfTlY0MiwKKworICAgIC8qIFkgcGxhbmUgb25seSwgdXNlZCBmb3IgRkQsIDhCUFAgKi8KKyAgICBDQU1fRk9STUFUX1lfT05MWSwgLy8xMDAKKworICAgIC8qIFVCV0MgZm9ybWF0ICovCisgICAgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVUJXQywKKworICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxX1ZFTlVTLAorCisgICAgLyogUkdCIGZvcm1hdHMgKi8KKyAgICBDQU1fRk9STUFUXzg4ODhfQVJHQiwKKworICAgIC8qIFkgcGxhbmUgb25seSAqLworICAgIENBTV9GT1JNQVRfWV9PTkxZXzEwX0JQUCwKKyAgICBDQU1fRk9STUFUX1lfT05MWV8xMl9CUFAsCisgICAgQ0FNX0ZPUk1BVF9ZX09OTFlfMTRfQlBQLAorICAgIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfOEJQUF9HUkVZLAorICAgIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBCUFBfR1JFWSwKKyAgICBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQlBQX0dSRVksCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xNEJQUF9HUkVZLAorICAgIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfOEJQUF9HUkVZLAorICAgIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTBCUFBfR1JFWSwKKyAgICBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEyQlBQX0dSRVksCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xNEJQUF9HUkVZLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fOEJQUF9HUkVZLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTBCUFBfR1JFWSwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzEyQlBQX0dSRVksCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV8xNEJQUF9HUkVZLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfOEJQUF9HUkVZLAorICAgIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTBCUFBfR1JFWSwKKyAgICBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEyQlBQX0dSRVksCisgICAgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xNEJQUF9HUkVZLAorCisgICAgQ0FNX0ZPUk1BVF9NQVgKK30gY2FtX2Zvcm1hdF90OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9GT1JNQVRfU1VCVFlQRV9IRFJfU1RBVFMsCisgICAgQ0FNX0ZPUk1BVF9TVUJUWVBFX1BEQUZfU1RBVFMsCisgICAgQ0FNX0ZPUk1BVF9TVUJUWVBFX01BWAorfSBjYW1fc3ViX2Zvcm1hdF90eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX1NUUkVBTV9UWVBFX0RFRkFVTFQsICAgICAgIC8qIGRlZmF1bHQgc3RyZWFtIHR5cGUgKi8KKyAgICBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVywgICAgICAgLyogcHJldmlldyAqLworICAgIENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVywgICAgICAvKiBwb3N0dmlldyAqLworICAgIENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCwgICAgICAvKiBzbmFwc2hvdCAqLworICAgIENBTV9TVFJFQU1fVFlQRV9WSURFTywgICAgICAgICAvKiB2aWRlbyAqLworICAgIENBTV9TVFJFQU1fVFlQRV9DQUxMQkFDSywgICAgICAvKiBhcHAgcmVxdWVzdGVkIGNhbGxiYWNrICovCisgICAgQ0FNX1NUUkVBTV9UWVBFX0lNUExfREVGSU5FRCwgLyogb3BhcXVlIGZvcm1hdDogY291bGQgYmUgZGlzcGxheSwgdmlkZW8gZW5jLCBaU0wgWVVWICovCisgICAgQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBLCAgICAgIC8qIG1ldGEgZGF0YSAqLworICAgIENBTV9TVFJFQU1fVFlQRV9SQVcsICAgICAgICAgICAvKiByYXcgZHVtcCBmcm9tIGNhbWlmICovCisgICAgQ0FNX1NUUkVBTV9UWVBFX09GRkxJTkVfUFJPQywgIC8qIG9mZmxpbmUgcHJvY2VzcyAqLworICAgIENBTV9TVFJFQU1fVFlQRV9QQVJNLCAgICAgICAgIC8qIG1jdCBpbnRlcm5hbCBzdHJlYW0gKi8KKyAgICBDQU1fU1RSRUFNX1RZUEVfQU5BTFlTSVMsICAgICAvKiBhbmFseXNpcyBzdHJlYW0gKi8KKyAgICBDQU1fU1RSRUFNX1RZUEVfTUFYLAorfSBjYW1fc3RyZWFtX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fUEFEX05PTkUgPSAxLAorICAgIENBTV9QQURfVE9fMiA9IDIsCisgICAgQ0FNX1BBRF9UT180ID0gNCwKKyAgICBDQU1fUEFEX1RPX1dPUkQgPSBDQU1fUEFEX1RPXzQsCisgICAgQ0FNX1BBRF9UT184ID0gOCwKKyAgICBDQU1fUEFEX1RPXzE2ID0gMTYsCisgICAgQ0FNX1BBRF9UT18zMiA9IDMyLAorICAgIENBTV9QQURfVE9fNjQgPSA2NCwKKyAgICBDQU1fUEFEX1RPXzEyOCA9IDEyOCwKKyAgICBDQU1fUEFEX1RPXzI1NiA9IDI1NiwKKyAgICBDQU1fUEFEX1RPXzUxMiA9IDUxMiwKKyAgICBDQU1fUEFEX1RPXzFLID0gMTAyNCwKKyAgICBDQU1fUEFEX1RPXzJLID0gMjA0OCwKKyAgICBDQU1fUEFEX1RPXzRLID0gNDA5NiwKKyAgICBDQU1fUEFEX1RPXzhLID0gODE5MgorfSBjYW1fcGFkX2Zvcm1hdF90OworCit0eXBlZGVmIGVudW0geworICAgIC8qIGZvbGxvd2luZ3MgYXJlIHBlciBjYW1lcmEgKi8KKyAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9DQVBBQklMSVRZLCAgLyogbWFwcGluZyBjYW1lcmEgY2FwYWJpbGl0eSBidWZmZXIgKi8KKyAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9QQVJNX0JVRiwgICAgLyogbWFwcGluZyBwYXJhbWV0ZXJzIGJ1ZmZlciAqLworICAgIC8qIHRoaXMgYnVmZmVyIGlzIG5lZWRlZCBmb3IgdGhlIHBheWxvYWQgdG8gYmUgc2VudCB3aXRoIGJ1bmRsaW5nIHJlbGF0ZWQgY2FtZXJhcyBjbWQgKi8KKyAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TWU5DX1JFTEFURURfU0VOU09SU19CVUYsIC8qIG1hcHBpbmcgc3luYyBidWZmZXIuKi8KKworICAgIC8qIGZvbGxvd2luZ3MgYXJlIHBlciBzdHJlYW0gKi8KKyAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGLCAgICAgICAgLyogbWFwcGluZyBzdHJlYW0gYnVmZmVycyAqLworICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9JTkZPLCAgICAgICAvKiBtYXBwaW5nIHN0cmVhbSBpbmZvcm1hdGlvbiBidWZmZXIgKi8KKyAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX0lOUFVUX0JVRiwgLyogbWFwcGluZyBvZmZsaW5lIHByb2Nlc3MgaW5wdXQgYnVmZmVyICovCisgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfT0ZGTElORV9NRVRBX0JVRiwgIC8qIG1hcHBpbmcgb2ZmbGluZSBtZXRhIGJ1ZmZlciAqLworICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX01JU0NfQlVGLCAgICAgICAgICAvKiBtYXBwaW5nIG9mZmxpbmUgbWlzY2VsbGFuZW91cyBidWZmZXIgKi8KKyAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fVVNFUl9CVUYsICAgLyogbWFwcGluZyB1c2VyIHB0ciBzdHJlYW0gYnVmZmVycyAqLworICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX01BWAorfSBjYW1fbWFwcGluZ19idWZfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fU1RSRUFNX0JVRl9UWVBFX01QTEFORSwgIC8qIE11bHRpcGxhbmFyIEJ1ZmZlciB0eXBlICovCisgICAgQ0FNX1NUUkVBTV9CVUZfVFlQRV9VU0VSUFRSLCAvKiBVc2VyIHNwZWNpZmljIHN0cnVjdHVyZSBwb2ludGVyKi8KKyAgICBDQU1fU1RSRUFNX0JVRl9UWVBFX01BWAorfSBjYW1fc3RyZWFtX2J1Zl90eXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtX21hcHBpbmdfYnVmX3R5cGUgdHlwZTsKKyAgICB1aW50MzJfdCBzdHJlYW1faWQ7ICAgLyogc3RyZWFtIGlkOiB2YWxpZCBpZiBTVFJFQU1fQlVGICovCisgICAgdWludDMyX3QgZnJhbWVfaWR4OyAgIC8qIGZyYW1lIGluZGV4OiB2YWxpZCBpZiB0eXBlIGlzIFNUUkVBTV9CVUYgKi8KKyAgICBpbnQzMl90IHBsYW5lX2lkeDsgICAgLyogcGxhbm5lciBpbmRleC4gdmFsaWQgaWYgdHlwZSBpcyBTVFJFQU1fQlVGLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAtMSBtZWFucyBhbGwgcGxhbm5lcnMgc2hhbnJlIHRoZSBzYW1lIGZkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvdGhlcndpc2UsIGVhY2ggcGxhbm5lciBoYXMgaXRzIG93biBmZCAqLworICAgIHVpbnQzMl90IGNvb2tpZTsgICAgICAvKiBjb3VsZCBiZSBqb2JfaWQodWludDMyX3QpIHRvIGlkZW50aWZ5IG1hcHBpbmcgam9iICovCisgICAgaW50MzJfdCBmZDsgICAgICAgICAgIC8qIG9yaWdpbiBmZCAqLworICAgIHNpemVfdCBzaXplOyAgICAgICAgICAvKiBzaXplIG9mIHRoZSBidWZmZXIgKi8KKyAgICB2b2lkICpidWZmZXI7ICAgICAgICAgLyogQnVmZmVyIHBvaW50ZXIgKi8KK30gY2FtX2J1Zl9tYXBfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGxlbmd0aDsKKyAgICBjYW1fYnVmX21hcF90eXBlIGJ1Zl9tYXBzW0NBTV9NQVhfTlVNX0JVRlNfUEVSX1NUUkVBTV07Cit9IGNhbV9idWZfbWFwX3R5cGVfbGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9tYXBwaW5nX2J1Zl90eXBlIHR5cGU7CisgICAgdWludDMyX3Qgc3RyZWFtX2lkOyAgIC8qIHN0cmVhbSBpZDogdmFsaWQgaWYgU1RSRUFNX0JVRiAqLworICAgIHVpbnQzMl90IGZyYW1lX2lkeDsgICAvKiBmcmFtZSBpbmRleDogdmFsaWQgaWYgU1RSRUFNX0JVRiBvciBISVNUX0JVRiAqLworICAgIGludDMyX3QgcGxhbmVfaWR4OyAgICAvKiBwbGFubmVyIGluZGV4LiB2YWxpZCBpZiB0eXBlIGlzIFNUUkVBTV9CVUYuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIC0xIG1lYW5zIGFsbCBwbGFubmVycyBzaGFucmUgdGhlIHNhbWUgZmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG90aGVyd2lzZSwgZWFjaCBwbGFubmVyIGhhcyBpdHMgb3duIGZkICovCisgICAgdWludDMyX3QgY29va2llOyAgICAgIC8qIGNvdWxkIGJlIGpvYl9pZCh1aW50MzJfdCkgdG8gaWRlbnRpZnkgdW5tYXBwaW5nIGpvYiAqLworfSBjYW1fYnVmX3VubWFwX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBsZW5ndGg7CisgICAgY2FtX2J1Zl91bm1hcF90eXBlIGJ1Zl91bm1hcHNbQ0FNX01BWF9OVU1fQlVGU19QRVJfU1RSRUFNXTsKK30gY2FtX2J1Zl91bm1hcF90eXBlX2xpc3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX01BUFBJTkdfVFlQRV9GRF9NQVBQSU5HLAorICAgIENBTV9NQVBQSU5HX1RZUEVfRkRfVU5NQVBQSU5HLAorICAgIENBTV9NQVBQSU5HX1RZUEVfRkRfQlVORExFRF9NQVBQSU5HLAorICAgIENBTV9NQVBQSU5HX1RZUEVfRkRfQlVORExFRF9VTk1BUFBJTkcsCisgICAgQ0FNX01BUFBJTkdfVFlQRV9NQVgKK30gY2FtX21hcHBpbmdfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9tYXBwaW5nX3R5cGUgbXNnX3R5cGU7CisgICAgdW5pb24geworICAgICAgICBjYW1fYnVmX21hcF90eXBlIGJ1Zl9tYXA7CisgICAgICAgIGNhbV9idWZfdW5tYXBfdHlwZSBidWZfdW5tYXA7CisgICAgICAgIGNhbV9idWZfbWFwX3R5cGVfbGlzdCBidWZfbWFwX2xpc3Q7CisgICAgICAgIGNhbV9idWZfdW5tYXBfdHlwZV9saXN0IGJ1Zl91bm1hcF9saXN0OworICAgIH0gcGF5bG9hZDsKK30gY2FtX3NvY2tfcGFja2V0X3Q7Cit0eXBlZGVmIGNhbV9zb2NrX3BhY2tldF90IGNhbV9yZWdfYnVmX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX01PREVfMkQgPSAoMTw8MCksCisgICAgQ0FNX01PREVfM0QgPSAoMTw8MSkKK30gY2FtX21vZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGxlbjsKKyAgICB1aW50MzJfdCB5X29mZnNldDsKKyAgICB1aW50MzJfdCBjYmNyX29mZnNldDsKK30gY2FtX3NwX2xlbl9vZmZzZXRfdDsKKwordHlwZWRlZiBzdHJ1Y3R7CisgICAgdWludDMyX3QgbGVuOworICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICBpbnQzMl90IG9mZnNldF94OworICAgIGludDMyX3Qgb2Zmc2V0X3k7CisgICAgaW50MzJfdCBzdHJpZGU7CisgICAgaW50MzJfdCBzdHJpZGVfaW5fYnl0ZXM7CisgICAgaW50MzJfdCBzY2FubGluZTsKKyAgICBpbnQzMl90IHdpZHRoOyAgICAvKiB3aWR0aCB3aXRob3V0IHBhZGRpbmcgKi8KKyAgICBpbnQzMl90IGhlaWdodDsgICAvKiBoZWlnaHQgd2l0aG91dCBwYWRkaW5nICovCisgICAgaW50MzJfdCBtZXRhX3N0cmlkZTsgICAvKk1ldGEgc3RyaWRlKi8KKyAgICBpbnQzMl90IG1ldGFfc2NhbmxpbmU7IC8qTWV0YSBTY2FubGluZSovCisgICAgaW50MzJfdCBtZXRhX2xlbjsgICAvKk1ldGEgcGxhbmUgbGVuZ3RoIGluY2x1ZGluZyA0ayBwYWRkaW5nKi8KK30gY2FtX21wX2xlbl9vZmZzZXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IG9mZnNldF94OworICAgIHVpbnQzMl90IG9mZnNldF95OworfSBjYW1fb2Zmc2V0X2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IHdpZHRoX3BhZGRpbmc7CisgICAgdWludDMyX3QgaGVpZ2h0X3BhZGRpbmc7CisgICAgdWludDMyX3QgcGxhbmVfcGFkZGluZzsKKyAgICB1aW50MzJfdCBtaW5fc3RyaWRlOworICAgIHVpbnQzMl90IG1pbl9zY2FubGluZTsKKyAgICBjYW1fb2Zmc2V0X2luZm9fdCBvZmZzZXRfaW5mbzsKK30gY2FtX3BhZGRpbmdfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgbnVtX3BsYW5lczsgICAgLypOdW1iZXIgb2YgcGxhbmVzIGluIHBsYW5hciBidWZmZXIqLworICAgIHVuaW9uIHsKKyAgICAgICAgY2FtX3NwX2xlbl9vZmZzZXRfdCBzcDsKKyAgICAgICAgY2FtX21wX2xlbl9vZmZzZXRfdCBtcFtWSURFT19NQVhfUExBTkVTXTsKKyAgICB9OworICAgIHVpbnQzMl90IGZyYW1lX2xlbjsKK30gY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgZnJhbWVfYnVmX2NudDsgIC8qVG90YWwgcGxhbmUgZnJhbWVzIHByZXNlbnQgaW4gMSBiYXRjaCovCisgICAgdWludDMyX3Qgc2l6ZTsgICAgICAgICAgLypTaXplIG9mIDEgYmF0Y2ggYnVmZmVyLiBLZXJuZWwgc3RydWN0dXJlIHNpemUqLworICAgIGxvbmcgZnJhbWVJbnRlcnZhbDsgICAgIC8qZnJhbWUgaW50ZXJ2YWwgYmV0d2VlbiBlYWNoIGZyYW1lKi8KK30gY2FtX3N0cmVhbV91c2VyX2J1Zl9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworfSBjYW1fZGltZW5zaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90IHBsYW5lX2luZm87Cit9IGNhbV9zdHJlYW1fYnVmX3BsYW5lX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IG1pbl9mcHM7CisgICAgZmxvYXQgbWF4X2ZwczsKKyAgICBmbG9hdCB2aWRlb19taW5fZnBzOworICAgIGZsb2F0IHZpZGVvX21heF9mcHM7Cit9IGNhbV9mcHNfcmFuZ2VfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgbWluX3NlbnNpdGl2aXR5OworICAgIGludDMyX3QgbWF4X3NlbnNpdGl2aXR5OworfSBjYW1fc2Vuc2l0aXZpdHlfcmFuZ2VfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fSEZSX01PREVfT0ZGLAorICAgIENBTV9IRlJfTU9ERV82MEZQUywKKyAgICBDQU1fSEZSX01PREVfOTBGUFMsCisgICAgQ0FNX0hGUl9NT0RFXzEyMEZQUywKKyAgICBDQU1fSEZSX01PREVfMTUwRlBTLAorICAgIENBTV9IRlJfTU9ERV8xODBGUFMsCisgICAgQ0FNX0hGUl9NT0RFXzIxMEZQUywKKyAgICBDQU1fSEZSX01PREVfMjQwRlBTLAorICAgIENBTV9IRlJfTU9ERV80ODBGUFMsCisgICAgQ0FNX0hGUl9NT0RFX01BWAorfSBjYW1faGZyX21vZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9oZnJfbW9kZV90IG1vZGU7CisgICAgdWludDhfdCBkaW1fY250OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoZnIgc2l6ZXMgdGFibGUgY291bnQgKi8KKyAgICBjYW1fZGltZW5zaW9uX3QgZGltW01BWF9TSVpFU19DTlRdOyAgICAgICAgICAgICAgICAgICAgIC8qIGhmciBzaXplcyB0YWJsZSAqLworICAgIHVpbnQ4X3QgbGl2ZXNuYXBzaG90X3NpemVzX3RibF9jbnQ7ICAgICAgICAgICAgICAgICAgICAgLyogbGl2ZXNuYXBzaG90IHNpemVzIHRhYmxlIGNvdW50ICovCisgICAgY2FtX2RpbWVuc2lvbl90IGxpdmVzbmFwc2hvdF9zaXplc190YmxbTUFYX1NJWkVTX0NOVF07ICAvKiBsaXZlc25hcHNob3Qgc2l6ZXMgdGFibGUgKi8KK30gY2FtX2hmcl9pbmZvX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX1dCX01PREVfQVVUTywKKyAgICBDQU1fV0JfTU9ERV9DVVNUT00sCisgICAgQ0FNX1dCX01PREVfSU5DQU5ERVNDRU5ULAorICAgIENBTV9XQl9NT0RFX0ZMVU9SRVNDRU5ULAorICAgIENBTV9XQl9NT0RFX1dBUk1fRkxVT1JFU0NFTlQsCisgICAgQ0FNX1dCX01PREVfREFZTElHSFQsCisgICAgQ0FNX1dCX01PREVfQ0xPVURZX0RBWUxJR0hULAorICAgIENBTV9XQl9NT0RFX1RXSUxJR0hULAorICAgIENBTV9XQl9NT0RFX1NIQURFLAorICAgIENBTV9XQl9NT0RFX01BTlVBTCwKKyAgICBDQU1fV0JfTU9ERV9PRkYsCisgICAgQ0FNX1dCX01PREVfTUFYCit9IGNhbV93Yl9tb2RlX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0FOVElCQU5ESU5HX01PREVfT0ZGLAorICAgIENBTV9BTlRJQkFORElOR19NT0RFXzYwSFosCisgICAgQ0FNX0FOVElCQU5ESU5HX01PREVfNTBIWiwKKyAgICBDQU1fQU5USUJBTkRJTkdfTU9ERV9BVVRPLAorICAgIENBTV9BTlRJQkFORElOR19NT0RFX0FVVE9fNTBIWiwKKyAgICBDQU1fQU5USUJBTkRJTkdfTU9ERV9BVVRPXzYwSFosCisgICAgQ0FNX0FOVElCQU5ESU5HX01PREVfTUFYLAorfSBjYW1fYW50aWJhbmRpbmdfbW9kZV90eXBlOworCisvKiBFbnVtIFR5cGUgZm9yIGRpZmZlcmVudCBJU08gTW9kZSBzdXBwb3J0ZWQgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0lTT19NT0RFX0FVVE8sCisgICAgQ0FNX0lTT19NT0RFX0RFQkxVUiwKKyAgICBDQU1fSVNPX01PREVfMTAwLAorICAgIENBTV9JU09fTU9ERV8yMDAsCisgICAgQ0FNX0lTT19NT0RFXzQwMCwKKyAgICBDQU1fSVNPX01PREVfODAwLAorICAgIENBTV9JU09fTU9ERV8xNjAwLAorICAgIENBTV9JU09fTU9ERV8zMjAwLAorICAgIENBTV9JU09fTU9ERV9NQVgKK30gY2FtX2lzb19tb2RlX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0FFQ19NT0RFX0ZSQU1FX0FWRVJBR0UsCisgICAgQ0FNX0FFQ19NT0RFX0NFTlRFUl9XRUlHSFRFRCwKKyAgICBDQU1fQUVDX01PREVfU1BPVF9NRVRFUklORywKKyAgICBDQU1fQUVDX01PREVfU01BUlRfTUVURVJJTkcsCisgICAgQ0FNX0FFQ19NT0RFX1VTRVJfTUVURVJJTkcsCisgICAgQ0FNX0FFQ19NT0RFX1NQT1RfTUVURVJJTkdfQURWLAorICAgIENBTV9BRUNfTU9ERV9DRU5URVJfV0VJR0hURURfQURWLAorICAgIENBTV9BRUNfTU9ERV9NQVgKK30gY2FtX2F1dG9fZXhwb3N1cmVfbW9kZV90eXBlOworCisvKiBlbnVtIHRvIHNlbGVjdCBBRUMgY29udmVyZ2VuY2UgdHlwZSAqLwordHlwZWRlZiBlbnVtIHsKKyAgICAvKiBOb3JtYWwgQUVDIGNvbm52ZXJnZW5jZSAqLworICAgIENBTV9BRUNfTk9STUFMX0NPTlZFUkdFTkNFID0gMCwKKyAgICAvKiBBZ2dyZXNzaXZlIEFFQyBjb25udmVyZ2VuY2UgKi8KKyAgICBDQU1fQUVDX0FHR1JFU1NJVkVfQ09OVkVSR0VOQ0UsCisgICAgLyogRmFzdCBBRUMgY29udmVyZ2VuY2UgKi8KKyAgICBDQU1fQUVDX0ZBU1RfQ09OVkVSR0VOQ0UsCisgICAgQ0FNX0FFQ19DT05WRVJHRU5DRV9NQVgKK30gY2FtX2FlY19jb252ZXJnZW5jZV90eXBlOworCit0eXBlZGVmIGVudW0geworICAgIENBTV9BRV9NT0RFX09GRiwKKyAgICBDQU1fQUVfTU9ERV9PTiwKKyAgICBDQU1fQUVfTU9ERV9NQVgKK30gY2FtX2FlX21vZGVfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fRk9DVVNfQUxHT19BVVRPLAorICAgIENBTV9GT0NVU19BTEdPX1NQT1QsCisgICAgQ0FNX0ZPQ1VTX0FMR09fQ0VOVEVSX1dFSUdIVEVELAorICAgIENBTV9GT0NVU19BTEdPX0FWRVJBR0UsCisgICAgQ0FNX0ZPQ1VTX0FMR09fTUFYCit9IGNhbV9mb2N1c19hbGdvcml0aG1fdHlwZTsKKworLyogQXV0byBmb2N1cyBtb2RlICovCit0eXBlZGVmIGVudW0geworICAgIENBTV9GT0NVU19NT0RFX09GRiwKKyAgICBDQU1fRk9DVVNfTU9ERV9BVVRPLAorICAgIENBTV9GT0NVU19NT0RFX0lORklOSVRZLAorICAgIENBTV9GT0NVU19NT0RFX01BQ1JPLAorICAgIENBTV9GT0NVU19NT0RFX0ZJWEVELAorICAgIENBTV9GT0NVU19NT0RFX0VET0YsCisgICAgQ0FNX0ZPQ1VTX01PREVfQ09OVElOT1VTX1ZJREVPLAorICAgIENBTV9GT0NVU19NT0RFX0NPTlRJTk9VU19QSUNUVVJFLAorICAgIENBTV9GT0NVU19NT0RFX01BTlVBTCwKKyAgICBDQU1fRk9DVVNfTU9ERV9NQVgKK30gY2FtX2ZvY3VzX21vZGVfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fTUFOVUFMX0ZPQ1VTX01PREVfSU5ERVgsCisgICAgQ0FNX01BTlVBTF9GT0NVU19NT0RFX0RBQ19DT0RFLAorICAgIENBTV9NQU5VQUxfRk9DVVNfTU9ERV9SQVRJTywKKyAgICBDQU1fTUFOVUFMX0ZPQ1VTX01PREVfRElPUFRFUiwKKyAgICBDQU1fTUFOVUFMX0ZPQ1VTX01PREVfTUFYCit9IGNhbV9tYW51YWxfZm9jdXNfbW9kZV90eXBlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtX21hbnVhbF9mb2N1c19tb2RlX3R5cGUgZmxhZzsKKyAgICB1bmlvbnsKKyAgICAgICAgaW50MzJfdCBhZl9tYW51YWxfbGVuc19wb3NpdGlvbl9pbmRleDsKKyAgICAgICAgaW50MzJfdCBhZl9tYW51YWxfbGVuc19wb3NpdGlvbl9kYWM7CisgICAgICAgIGludDMyX3QgYWZfbWFudWFsX2xlbnNfcG9zaXRpb25fcmF0aW87CisgICAgICAgIGZsb2F0IGFmX21hbnVhbF9kaW9wdGVyOworICAgIH07Cit9IGNhbV9tYW51YWxfZm9jdXNfcGFybV90OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9NQU5VQUxfV0JfTU9ERV9DQ1QsCisgICAgQ0FNX01BTlVBTF9XQl9NT0RFX0dBSU4sCisgICAgQ0FNX01BTlVBTF9XQl9NT0RFX01BWAorfSBjYW1fbWFudWFsX3diX21vZGVfdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IHJfZ2FpbjsKKyAgICBmbG9hdCBnX2dhaW47CisgICAgZmxvYXQgYl9nYWluOworfSBjYW1fYXdiX2dhaW5fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9tYW51YWxfd2JfbW9kZV90eXBlIHR5cGU7CisgICAgdW5pb257CisgICAgICAgIGludDMyX3QgY2N0OworICAgICAgICBjYW1fYXdiX2dhaW5fdCBnYWluczsKKyAgICB9OworfSBjYW1fbWFudWFsX3diX3Bhcm1fdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fU0NFTkVfTU9ERV9PRkYsCisgICAgQ0FNX1NDRU5FX01PREVfQVVUTywKKyAgICBDQU1fU0NFTkVfTU9ERV9MQU5EU0NBUEUsCisgICAgQ0FNX1NDRU5FX01PREVfU05PVywKKyAgICBDQU1fU0NFTkVfTU9ERV9CRUFDSCwKKyAgICBDQU1fU0NFTkVfTU9ERV9TVU5TRVQsCisgICAgQ0FNX1NDRU5FX01PREVfTklHSFQsCisgICAgQ0FNX1NDRU5FX01PREVfUE9SVFJBSVQsCisgICAgQ0FNX1NDRU5FX01PREVfQkFDS0xJR0hULAorICAgIENBTV9TQ0VORV9NT0RFX1NQT1JUUywKKyAgICBDQU1fU0NFTkVfTU9ERV9BTlRJU0hBS0UsCisgICAgQ0FNX1NDRU5FX01PREVfRkxPV0VSUywKKyAgICBDQU1fU0NFTkVfTU9ERV9DQU5ETEVMSUdIVCwKKyAgICBDQU1fU0NFTkVfTU9ERV9GSVJFV09SS1MsCisgICAgQ0FNX1NDRU5FX01PREVfUEFSVFksCisgICAgQ0FNX1NDRU5FX01PREVfTklHSFRfUE9SVFJBSVQsCisgICAgQ0FNX1NDRU5FX01PREVfVEhFQVRSRSwKKyAgICBDQU1fU0NFTkVfTU9ERV9BQ1RJT04sCisgICAgQ0FNX1NDRU5FX01PREVfQVIsCisgICAgQ0FNX1NDRU5FX01PREVfRkFDRV9QUklPUklUWSwKKyAgICBDQU1fU0NFTkVfTU9ERV9CQVJDT0RFLAorICAgIENBTV9TQ0VORV9NT0RFX0hEUiwKKyAgICBDQU1fU0NFTkVfTU9ERV9BUVVBLAorICAgIENBTV9TQ0VORV9NT0RFX01BWAorfSBjYW1fc2NlbmVfbW9kZV90eXBlOworCit0eXBlZGVmIGVudW0geworICAgIENBTV9FRkZFQ1RfTU9ERV9PRkYsCisgICAgQ0FNX0VGRkVDVF9NT0RFX01PTk8sCisgICAgQ0FNX0VGRkVDVF9NT0RFX05FR0FUSVZFLAorICAgIENBTV9FRkZFQ1RfTU9ERV9TT0xBUklaRSwKKyAgICBDQU1fRUZGRUNUX01PREVfU0VQSUEsCisgICAgQ0FNX0VGRkVDVF9NT0RFX1BPU1RFUklaRSwKKyAgICBDQU1fRUZGRUNUX01PREVfV0hJVEVCT0FSRCwKKyAgICBDQU1fRUZGRUNUX01PREVfQkxBQ0tCT0FSRCwKKyAgICBDQU1fRUZGRUNUX01PREVfQVFVQSwKKyAgICBDQU1fRUZGRUNUX01PREVfRU1CT1NTLAorICAgIENBTV9FRkZFQ1RfTU9ERV9TS0VUQ0gsCisgICAgQ0FNX0VGRkVDVF9NT0RFX05FT04sCisgICAgQ0FNX0VGRkVDVF9NT0RFX0JFQVVUWSwKKyAgICBDQU1fRUZGRUNUX01PREVfTUFYCit9IGNhbV9lZmZlY3RfbW9kZV90eXBlOworCit0eXBlZGVmIGVudW0geworICAgIENBTV9GTEFTSF9NT0RFX09GRiwKKyAgICBDQU1fRkxBU0hfTU9ERV9BVVRPLAorICAgIENBTV9GTEFTSF9NT0RFX09OLAorICAgIENBTV9GTEFTSF9NT0RFX1RPUkNILAorICAgIENBTV9GTEFTSF9NT0RFX1NJTkdMRSwKKyAgICBDQU1fRkxBU0hfTU9ERV9NQVgKK30gY2FtX2ZsYXNoX21vZGVfdDsKKworLy8gRmxhc2ggU3RhdGVzCit0eXBlZGVmIGVudW0geworICAgIENBTV9GTEFTSF9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICBDQU1fRkxBU0hfU1RBVEVfQ0hBUkdJTkcsCisgICAgQ0FNX0ZMQVNIX1NUQVRFX1JFQURZLAorICAgIENBTV9GTEFTSF9TVEFURV9GSVJFRCwKKyAgICBDQU1fRkxBU0hfU1RBVEVfUEFSVElBTCwKKyAgICBDQU1fRkxBU0hfU1RBVEVfTUFYCit9IGNhbV9mbGFzaF9zdGF0ZV90OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9GTEFTSF9GSVJJTkdfTEVWRUxfMCwKKyAgICBDQU1fRkxBU0hfRklSSU5HX0xFVkVMXzEsCisgICAgQ0FNX0ZMQVNIX0ZJUklOR19MRVZFTF8yLAorICAgIENBTV9GTEFTSF9GSVJJTkdfTEVWRUxfMywKKyAgICBDQU1fRkxBU0hfRklSSU5HX0xFVkVMXzQsCisgICAgQ0FNX0ZMQVNIX0ZJUklOR19MRVZFTF81LAorICAgIENBTV9GTEFTSF9GSVJJTkdfTEVWRUxfNiwKKyAgICBDQU1fRkxBU0hfRklSSU5HX0xFVkVMXzcsCisgICAgQ0FNX0ZMQVNIX0ZJUklOR19MRVZFTF84LAorICAgIENBTV9GTEFTSF9GSVJJTkdfTEVWRUxfOSwKKyAgICBDQU1fRkxBU0hfRklSSU5HX0xFVkVMXzEwLAorICAgIENBTV9GTEFTSF9GSVJJTkdfTEVWRUxfTUFYCit9IGNhbV9mbGFzaF9maXJpbmdfbGV2ZWxfdDsKKworCit0eXBlZGVmIGVudW0geworICAgIENBTV9BRUNfVFJJR0dFUl9JRExFLAorICAgIENBTV9BRUNfVFJJR0dFUl9TVEFSVAorfSBjYW1fYWVjX3RyaWdnZXJfdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9BRl9UUklHR0VSX0lETEUsCisgICAgQ0FNX0FGX1RSSUdHRVJfU1RBUlQsCisgICAgQ0FNX0FGX1RSSUdHRVJfQ0FOQ0VMCit9IGNhbV9hZl90cmlnZ2VyX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fQUVfU1RBVEVfSU5BQ1RJVkUsCisgICAgQ0FNX0FFX1NUQVRFX1NFQVJDSElORywKKyAgICBDQU1fQUVfU1RBVEVfQ09OVkVSR0VELAorICAgIENBTV9BRV9TVEFURV9MT0NLRUQsCisgICAgQ0FNX0FFX1NUQVRFX0ZMQVNIX1JFUVVJUkVELAorICAgIENBTV9BRV9TVEFURV9QUkVDQVBUVVJFCit9IGNhbV9hZV9zdGF0ZV90OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9OT0lTRV9SRURVQ1RJT05fTU9ERV9PRkYsCisgICAgQ0FNX05PSVNFX1JFRFVDVElPTl9NT0RFX0ZBU1QsCisgICAgQ0FNX05PSVNFX1JFRFVDVElPTl9NT0RFX0hJR0hfUVVBTElUWSwKKyAgICBDQU1fTk9JU0VfUkVEVUNUSU9OX01PREVfTUlOSU1BTCwKKyAgICBDQU1fTk9JU0VfUkVEVUNUSU9OX01PREVfWkVST19TSFVUVEVSX0xBRworfSBjYW1fbm9pc2VfcmVkdWN0aW9uX21vZGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fRURHRV9NT0RFX09GRiwKKyAgICBDQU1fRURHRV9NT0RFX0ZBU1QsCisgICAgQ0FNX0VER0VfTU9ERV9ISUdIX1FVQUxJVFksCisgICAgQ0FNX0VER0VfTU9ERV9aRVJPX1NIVVRURVJfTEFHLAorfSBjYW1fZWRnZV9tb2RlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgIHVpbnQ4X3QgZWRnZV9tb2RlOworICAgaW50MzJfdCBzaGFycG5lc3M7Cit9IGNhbV9lZGdlX2FwcGxpY2F0aW9uX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0JMQUNLX0xFVkVMX0xPQ0tfT0ZGLAorICAgIENBTV9CTEFDS19MRVZFTF9MT0NLX09OLAorfSBjYW1fYmxhY2tfbGV2ZWxfbG9ja190OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9IT1RQSVhFTF9NT0RFX09GRiwKKyAgICBDQU1fSE9UUElYRUxfTU9ERV9GQVNULAorICAgIENBTV9IT1RQSVhFTF9NT0RFX0hJR0hfUVVBTElUWSwKK30gY2FtX2hvdHBpeGVsX21vZGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fTEVOU19TSEFESU5HX01BUF9NT0RFX09GRiwKKyAgICBDQU1fTEVOU19TSEFESU5HX01BUF9NT0RFX09OLAorfSBjYW1fbGVuc19zaGFkaW5nX21hcF9tb2RlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0xFTlNfU0hBRElOR19NT0RFX09GRiwKKyAgICBDQU1fTEVOU19TSEFESU5HX01PREVfRkFTVCwKKyAgICBDQU1fTEVOU19TSEFESU5HX01PREVfSElHSF9RVUFMSVRZLAorfSBjYW1fbGVuc19zaGFkaW5nX21vZGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fRkFDRV9ERVRFQ1RfTU9ERV9PRkYsCisgICAgQ0FNX0ZBQ0VfREVURUNUX01PREVfU0lNUExFLAorICAgIENBTV9GQUNFX0RFVEVDVF9NT0RFX0ZVTEwsCit9IGNhbV9mYWNlX2RldGVjdF9tb2RlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX1RPTkVNQVBfTU9ERV9DT05UUkFTVF9DVVJWRSwKKyAgICBDQU1fVE9ORU1BUF9NT0RFX0ZBU1QsCisgICAgQ0FNX1RPTkVNQVBfTU9ERV9ISUdIX1FVQUxJVFksCit9IGNhbV90b25lbWFwX21vZGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fQ0RTX01PREVfT0ZGLAorICAgIENBTV9DRFNfTU9ERV9PTiwKKyAgICBDQU1fQ0RTX01PREVfQVVUTywKKyAgICBDQU1fQ0RTX01PREVfTE9DSywKKyAgICBDQU1fQ0RTX01PREVfTUFYCit9IGNhbV9jZHNfbW9kZV90eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0lSX01PREVfT0ZGLAorICAgIENBTV9JUl9NT0RFX09OLAorICAgIENBTV9JUl9NT0RFX0FVVE8sCisgICAgQ0FNX0lSX01PREVfTUFYCit9IGNhbV9pcl9tb2RlX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fU0VOU09SX0hEUl9PRkYsCisgICAgQ0FNX1NFTlNPUl9IRFJfSU5fU0VOU09SID0gMSwKKyAgICBDQU1fU0VOU09SX0hEUl9aSUdaQUcsCisgICAgQ0FNX1NFTlNPUl9IRFJfU1RBR0dFUkVELAorICAgIENBTV9TRU5TT1JfSERSX01BWCwKK30gY2FtX3NlbnNvcl9oZHJfdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9WSURFT19IRFJfTU9ERV9PRkYsCisgICAgQ0FNX1ZJREVPX0hEUl9NT0RFX09OLAorICAgIENBTV9WSURFT19IRFJfTU9ERV9NQVgsCit9IGNhbV92aWRlb19oZHJfbW9kZV90OworCisKK3R5cGVkZWYgc3RydWN0ICB7CisgICAgaW50MzJfdCBsZWZ0OworICAgIGludDMyX3QgdG9wOworICAgIGludDMyX3Qgd2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQ7Cit9IGNhbV9yZWN0X3Q7CisKK3R5cGVkZWYgc3RydWN0ICB7CisgICAgY2FtX3JlY3RfdCByZWN0OworICAgIGludDMyX3Qgd2VpZ2h0OyAvKiB3ZWlnaHQgb2YgdGhlIGFyZWEsIHZhbGlkIGZvciBmb2N1c2luZy9tZXRlcmluZyBhcmVhcyAqLworfSBjYW1fYXJlYV90OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9TVFJFQU1JTkdfTU9ERV9DT05USU5VT1VTLCAvKiBjb250aW5vdXMgc3RyZWFtaW5nICovCisgICAgQ0FNX1NUUkVBTUlOR19NT0RFX0JVUlNULCAgICAgIC8qIGJ1cnN0IHN0cmVhbWluZyAqLworICAgIENBTV9TVFJFQU1JTkdfTU9ERV9CQVRDSCwgICAgICAvKiBzdHJlYW0gZnJhbWVzIGluIGJhdGNoZXMgKi8KKyAgICBDQU1fU1RSRUFNSU5HX01PREVfTUFYCit9IGNhbV9zdHJlYW1pbmdfbW9kZV90OworCit0eXBlZGVmIGVudW0geworICAgIElTX1RZUEVfTk9ORSwKKyAgICBJU19UWVBFX0NST1AsCisgICAgSVNfVFlQRV9ESVMsCisgICAgSVNfVFlQRV9HQV9ESVMsCisgICAgSVNfVFlQRV9FSVNfMl8wLAorICAgIElTX1RZUEVfRUlTXzNfMCwKKyAgICBJU19UWVBFX01BWAorfSBjYW1faXNfdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIERJU19ESVNBQkxFLAorICAgIERJU19FTkFCTEUKK30gY2FtX2Rpc19tb2RlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgIE5PTl9TRUNVUkUsCisgIFNFQ1VSRQorfSBjYW1fc3RyZWFtX3NlY3VyZV90OworCisjZGVmaW5lIENBTV9SRVBST0NFU1NfTUFTS19UWVBFX1dOUiAoMTw8MCkKKworLyogZXZlbnQgZnJvbSBzZXJ2ZXIgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0VWRU5UX1RZUEVfTUFQX1VOTUFQX0RPTkUgID0gKDE8PDApLAorICAgIENBTV9FVkVOVF9UWVBFX0FVVE9fRk9DVVNfRE9ORSA9ICgxPDwxKSwKKyAgICBDQU1fRVZFTlRfVFlQRV9aT09NX0RPTkUgICAgICAgPSAoMTw8MiksCisgICAgQ0FNX0VWRU5UX1RZUEVfREFFTU9OX0RJRUQgICAgID0gKDE8PDMpLAorICAgIENBTV9FVkVOVF9UWVBFX0lOVF9UQUtFX0pQRUcgICA9ICgxPDw0KSwKKyAgICBDQU1fRVZFTlRfVFlQRV9JTlRfVEFLRV9SQVcgICAgPSAoMTw8NSksCisgICAgQ0FNX0VWRU5UX1RZUEVfREFFTU9OX1BVTExfUkVRID0gKDE8PDYpLAorICAgIENBTV9FVkVOVF9UWVBFX0NBQ19ET05FICAgICAgICA9ICgxPDw3KSwKKyAgICBDQU1fRVZFTlRfVFlQRV9NQVgKK30gY2FtX2V2ZW50X3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fRVhQX0JSQUNLRVRJTkdfT0ZGLAorICAgIENBTV9FWFBfQlJBQ0tFVElOR19PTgorfSBjYW1fYnJhY2tldF9tb2RlOworCit0eXBlZGVmIGVudW0geworICAgIENBTV9MT1dfTElHSFRfT0ZGID0gMCwKKyAgICBDQU1fTE9XX0xJR0hUX09OLAorfSBjYW1fbG93X2xpZ2h0X21vZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9icmFja2V0X21vZGUgbW9kZTsKKyAgICBjaGFyIHZhbHVlc1tNQVhfRVhQX0JSQUNLRVRJTkdfTEVOR1RIXTsgIC8qIHVzZXIgZGVmaW5lZCB2YWx1ZXMgKi8KK30gY2FtX2V4cF9icmFja2V0aW5nX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgbnVtX2ZyYW1lczsKKyAgY2FtX2V4cF9icmFja2V0aW5nX3QgZXhwX3ZhbDsKK30gY2FtX2hkcl9icmFja2V0aW5nX2luZm9fdDsKKworIHR5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1fYnJhY2tldF9tb2RlIG1vZGU7CisgICAgaW50MzJfdCB2YWx1ZXM7ICAvKiB1c2VyIGRlZmluZWQgdmFsdWVzICovCit9IGNhbV9jYXB0dXJlX2JyYWNrZXRpbmdfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fU0VUVElOR1NfVFlQRV9PRkYsCisgICAgQ0FNX1NFVFRJTkdTX1RZUEVfT04sCisgICAgQ0FNX1NFVFRJTkdTX1RZUEVfQVVUTworfSBjYW1fbWFudWFsX3NldHRpbmdfbW9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9tYW51YWxfc2V0dGluZ19tb2RlIGV4cF9tb2RlOworICAgIGludDY0X3QgZXhwX3RpbWU7CisgICAgY2FtX21hbnVhbF9zZXR0aW5nX21vZGUgaXNvX21vZGU7CisgICAgaW50MzJfdCBpc29fdmFsdWU7Cit9IGNhbV9jYXB0dXJlX21hbnVhbF8zQV90OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9DQVBUVVJFX05PUk1BTCwKKyAgICBDQU1fQ0FQVFVSRV9GTEFTSCwKKyAgICBDQU1fQ0FQVFVSRV9CUkFDS0VUSU5HLAorICAgIENBTV9DQVBUVVJFX0xPV19MSUdIVCwKKyAgICBDQU1fQ0FQVFVSRV9SRVNFVCwKKyAgICBDQU1fQ0FQVFVSRV9NQU5VQUxfM0EsCisgICAgQ0FNX0NBUFRVUkVfTUFYCit9IGNhbV9jYXB0dXJlX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQzMl90IG51bV9mcmFtZXM7ICAgICAvKk51bSBvZiBmcmFtZXMgcmVxdWVzdGVkIG9uIHRoaXMgcXVhbGl0eSovCisgICAgY2FtX2NhcHR1cmVfdHlwZSB0eXBlOyAgLyp0eXBlIG9mIHRoZSBjYXB0dXJlIHJlcXVlc3QqLworCisgICAgLyp1bmlvbiB0byBzdHJvcmUgdmFsdWVzIG9mIGNhcHR1cmUgdHlwZSovCisgICAgdW5pb24geworICAgICAgICBjYW1fZmxhc2hfbW9kZV90IGZsYXNoX21vZGU7CisgICAgICAgIGNhbV9jYXB0dXJlX2JyYWNrZXRpbmdfdCBoZHJfbW9kZTsKKyAgICAgICAgY2FtX2xvd19saWdodF9tb2RlX3QgbG93X2xpZ2h0X21vZGU7CisgICAgICAgIGNhbV9jYXB0dXJlX21hbnVhbF8zQV90IG1hbnVhbF8zQV9tb2RlOworICAgIH07Cit9IGNhbV9jYXB0dXJlX3NldHRpbmdzX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBudW1fYmF0Y2g7ICAvKk51bWJlciBvZiBmcmFtZXMgYmF0Y2ggcmVxdWVzdGVkKi8KKyAgICBjYW1fY2FwdHVyZV9zZXR0aW5nc190IGNvbmZpZ3NbTUFYX0NBUFRVUkVfQkFUQ0hfTlVNXTsKK30gY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IHN0ZXBzaXplOworICAgIHVpbnQ4X3QgZGlyZWN0aW9uOworICAgIGludDMyX3QgbnVtX3N0ZXBzOworICAgIHVpbnQ4X3QgdHR5cGU7Cit9IHR1bmVfYWN0dWF0b3JfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgbW9kdWxlOworICAgIHVpbnQ4X3QgdHlwZTsKKyAgICBpbnQzMl90IHZhbHVlOworfSB0dW5lX2NtZF90OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9BRUNfUk9JX09GRiwKKyAgICBDQU1fQUVDX1JPSV9PTgorfSBjYW1fYWVjX3JvaV9jdHJsX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0FFQ19ST0lfQllfSU5ERVgsCisgICAgQ0FNX0FFQ19ST0lfQllfQ09PUkRJTkFURSwKK30gY2FtX2FlY19yb2lfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgeDsKKyAgICB1aW50MzJfdCB5OworfSBjYW1fY29vcmRpbmF0ZV90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQzMl90IG51bWVyYXRvcjsKKyAgICBpbnQzMl90IGRlbm9taW5hdG9yOworfSBjYW1fcmF0aW9uYWxfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtX2FlY19yb2lfY3RybF90IGFlY19yb2lfZW5hYmxlOworICAgIGNhbV9hZWNfcm9pX3R5cGVfdCBhZWNfcm9pX3R5cGU7CisgICAgdW5pb24geworICAgICAgICBjYW1fY29vcmRpbmF0ZV90eXBlX3QgY29vcmRpbmF0ZVtNQVhfUk9JXTsKKyAgICAgICAgdWludDMyX3QgYWVjX3JvaV9pZHhbTUFYX1JPSV07CisgICAgfSBjYW1fYWVjX3JvaV9wb3NpdGlvbjsKK30gY2FtX3NldF9hZWNfcm9pX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBmcm1faWQ7CisgICAgdWludDhfdCBudW1fcm9pOworICAgIGNhbV9yZWN0X3Qgcm9pW01BWF9ST0ldOworICAgIGludDMyX3Qgd2VpZ2h0W01BWF9ST0ldOworICAgIHVpbnQ4X3QgaXNfbXVsdGl3aW5kb3c7Cit9IGNhbV9yb2lfaW5mb190OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9XQVZFTEVUX0RFTk9JU0VfWUNCQ1JfUExBTkUsCisgICAgQ0FNX1dBVkVMRVRfREVOT0lTRV9DQkNSX09OTFksCisgICAgQ0FNX1dBVkVMRVRfREVOT0lTRV9TVFJFQU1MSU5FX1lDQkNSLAorICAgIENBTV9XQVZFTEVUX0RFTk9JU0VfU1RSRUFNTElORURfQ0JDUgorfSBjYW1fZGVub2lzZV9wcm9jZXNzX3R5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgZGVub2lzZV9lbmFibGU7CisgICAgY2FtX2Rlbm9pc2VfcHJvY2Vzc190eXBlX3QgcHJvY2Vzc19wbGF0ZXM7Cit9IGNhbV9kZW5vaXNlX3BhcmFtX3Q7CisKKyNkZWZpbmUgQ0FNX0ZBQ0VfUFJPQ0VTU19NQVNLX0RFVEVDVElPTiAgICAgKDFVPDwwKQorI2RlZmluZSBDQU1fRkFDRV9QUk9DRVNTX01BU0tfUkVDT0dOSVRJT04gICAoMVU8PDEpCisjZGVmaW5lIENBTV9GQUNFX1BST0NFU1NfTUFTS19GT0NVUyAgICAgICAgICgxVTw8MikKKyNkZWZpbmUgQ0FNX0ZBQ0VfUFJPQ0VTU19NQVNLX0JMSU5LICAgICAgICAgKDFVPDwzKQorI2RlZmluZSBDQU1fRkFDRV9QUk9DRVNTX01BU0tfU01JTEUgICAgICAgICAoMVU8PDQpCisjZGVmaW5lIENBTV9GQUNFX1BST0NFU1NfTUFTS19HQVpFICAgICAgICAgICgxVTw8NSkKKworLyogS2VlcCB0aGlzIGluIHN5bmMgd2l0aCBpbnZhbGlkIGxhbmRtYXJrIHZhbHVlIDogc3lzdGVtL2NvcmUvaW5jbHVkZS9zeXN0ZW0vY2FtZXJhLmggKi8KKyNkZWZpbmUgRkFDRV9JTlZBTElEX1BPSU5UIC0yMDAwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBmZF9tb2RlOyAgICAgICAgICAvKiBtYXNrIG9mIGZhY2UgcHJvY2VzcyAqLworICAgIHVpbnQzMl90IG51bV9mZDsKK30gY2FtX2ZkX3NldF9wYXJtX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgUUNBTUVSQV9GRF9QUkVWSUVXLAorICAgIFFDQU1FUkFfRkRfU05BUFNIT1QKK31xY2FtZXJhX2ZhY2VfZGV0ZWN0X3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9FWUVfTF9QVVBJTCwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9FWUVfTF9JTiwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9FWUVfTF9PVVQsCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfRVlFX0xfVVAsCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfRVlFX0xfRE9XTiwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9FWUVfUl9QVVBJTCwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9FWUVfUl9JTiwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9FWUVfUl9PVVQsCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfRVlFX1JfVVAsCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfRVlFX1JfRE9XTiwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9FWUVfTUFYCit9IGNhbV9mYWNlX2N0X3BvaW50X2V5ZV90OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9GQUNFX0NUX1BPSU5UX0ZPUkVIRUFELAorICAgIENBTV9GQUNFX0NUX1BPSU5UX0ZPUkVIRUFEX01BWAorfSBjYW1fZmFjZV9jdF9wb2ludF9mb3JoX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfTk9TRSwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9OT1NFX1RJUCwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9OT1NFX0wsCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfTk9TRV9SLAorICAgIENBTV9GQUNFX0NUX1BPSU5UX05PU0VfTF8wLAorICAgIENBTV9GQUNFX0NUX1BPSU5UX05PU0VfUl8wLAorICAgIENBTV9GQUNFX0NUX1BPSU5UX05PU0VfTF8xLAorICAgIENBTV9GQUNFX0NUX1BPSU5UX05PU0VfUl8xLAorICAgIENBTV9GQUNFX0NUX1BPSU5UX05PU0VfTUFYCit9IGNhbV9mYWNlX2N0X3BvaW50X25vc2VfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9NT1VUSF9MLAorICAgIENBTV9GQUNFX0NUX1BPSU5UX01PVVRIX1IsCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfTU9VVEhfVVAsCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfTU9VVEhfRE9XTiwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9NT1VUSF9NQVgKK30gY2FtX2ZhY2VfY3RfcG9pbnRfbW91dGhfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9MSVBfVVAsCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfTElQX0RPV04sCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfTElQX01BWAorfSBjYW1fZmFjZV9jdF9wb2ludF9saXBfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9CUk9XX0xfVVAsCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfQlJPV19MX0RPV04sCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfQlJPV19MX0lOLAorICAgIENBTV9GQUNFX0NUX1BPSU5UX0JST1dfTF9PVVQsCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfQlJPV19SX1VQLAorICAgIENBTV9GQUNFX0NUX1BPSU5UX0JST1dfUl9ET1dOLAorICAgIENBTV9GQUNFX0NUX1BPSU5UX0JST1dfUl9JTiwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9CUk9XX1JfT1VULAorICAgIENBTV9GQUNFX0NUX1BPSU5UX0JST1dfTUFYCit9IGNhbV9mYWNlX2N0X3BvaW50X2Jyb3dfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9DSElOLAorICAgIENBTV9GQUNFX0NUX1BPSU5UX0NISU5fTCwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9DSElOX1IsCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfQ0hJTl9NQVgKK30gY2FtX2ZhY2VfY3RfcG9pbnRfY2hpbl90OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9GQUNFX0NUX1BPSU5UX0VBUl9MX0RPV04sCisgICAgQ0FNX0ZBQ0VfQ1RfUE9JTlRfRUFSX1JfRE9XTiwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9FQVJfTF9VUCwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9FQVJfUl9VUCwKKyAgICBDQU1fRkFDRV9DVF9QT0lOVF9FQVJfTUFYCit9IGNhbV9mYWNlX2N0X3BvaW50X2Vhcl90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgaXNfZXllX3ZhbGlkOworICBjYW1fY29vcmRpbmF0ZV90eXBlX3QgY29udG91cl9leWVfcHRbQ0FNX0ZBQ0VfQ1RfUE9JTlRfRVlFX01BWF07CisgIHVpbnQ4X3QgaXNfZm9yZWhlYWRfdmFsaWQ7CisgIGNhbV9jb29yZGluYXRlX3R5cGVfdCBjb250b3VyX2ZvcmhfcHRbQ0FNX0ZBQ0VfQ1RfUE9JTlRfRk9SRUhFQURfTUFYXTsKKyAgdWludDhfdCBpc19ub3NlX3ZhbGlkOworICBjYW1fY29vcmRpbmF0ZV90eXBlX3QgY29udG91cl9ub3NlX3B0W0NBTV9GQUNFX0NUX1BPSU5UX05PU0VfTUFYXTsKKyAgdWludDhfdCBpc19tb3V0aF92YWxpZDsKKyAgY2FtX2Nvb3JkaW5hdGVfdHlwZV90IGNvbnRvdXJfbW91dGhfcHRbQ0FNX0ZBQ0VfQ1RfUE9JTlRfTU9VVEhfTUFYXTsKKyAgdWludDhfdCBpc19saXBfdmFsaWQ7CisgIGNhbV9jb29yZGluYXRlX3R5cGVfdCBjb250b3VyX2xpcF9wdFtDQU1fRkFDRV9DVF9QT0lOVF9MSVBfTUFYXTsKKyAgdWludDhfdCBpc19icm93X3ZhbGlkOworICBjYW1fY29vcmRpbmF0ZV90eXBlX3QgY29udG91cl9icm93X3B0W0NBTV9GQUNFX0NUX1BPSU5UX0JST1dfTUFYXTsKKyAgdWludDhfdCBpc19jaGluX3ZhbGlkOworICBjYW1fY29vcmRpbmF0ZV90eXBlX3QgY29udG91cl9jaGluX3B0W0NBTV9GQUNFX0NUX1BPSU5UX0NISU5fTUFYXTsKKyAgdWludDhfdCBpc19lYXJfdmFsaWQ7CisgIGNhbV9jb29yZGluYXRlX3R5cGVfdCBjb250b3VyX2Vhcl9wdFtDQU1fRkFDRV9DVF9QT0lOVF9FQVJfTUFYXTsKK30gY2FtX2ZhY2VfY29udG91cl9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1fZmFjZV9jb250b3VyX2luZm9fdCBmYWNlX2NvbnRvdXJbTUFYX1JPSV07Cit9IGNhbV9mYWNlX2NvbnRvdXJfZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBpc19sZWZ0X2V5ZV92YWxpZDsKKyAgICBjYW1fY29vcmRpbmF0ZV90eXBlX3QgbGVmdF9leWVfY2VudGVyOyAgLyogY29vcmRpbmF0ZSBvZiBjZW50ZXIgb2YgbGVmdCBleWUgKi8KKyAgICB1aW50OF90IGlzX3JpZ2h0X2V5ZV92YWxpZDsKKyAgICBjYW1fY29vcmRpbmF0ZV90eXBlX3QgcmlnaHRfZXllX2NlbnRlcjsgLyogY29vcmRpbmF0ZSBvZiBjZW50ZXIgb2YgcmlnaHQgZXllICovCisgICAgdWludDhfdCBpc19tb3V0aF92YWxpZDsKKyAgICBjYW1fY29vcmRpbmF0ZV90eXBlX3QgbW91dGhfY2VudGVyOyAgICAgLyogY29vcmRpbmF0ZSBvZiBjZW50ZXIgb2YgbW91dGggKi8KK30gY2FtX2ZhY2VfbGFuZG1hcmtzX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9mYWNlX2xhbmRtYXJrc19pbmZvX3QgZmFjZV9sYW5kbWFya3NbTUFYX1JPSV07Cit9IGNhbV9mYWNlX2xhbmRtYXJrc19kYXRhX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IHNtaWxlX2RlZ3JlZTsgICAgICAvKiBzbWlsZSBkZWdyZWUgKDAsIC0xMDApICovCisgICAgdWludDhfdCBzbWlsZV9jb25maWRlbmNlOyAgLyogc21pbGUgY29uZmlkZW5jZSAoMCwgMTAwKSAqLworfSBjYW1fZmFjZV9zbWlsZV9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1fZmFjZV9zbWlsZV9pbmZvX3Qgc21pbGVbTUFYX1JPSV07Cit9IGNhbV9mYWNlX3NtaWxlX2RhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDhfdCBnYXplX2FuZ2xlOyAgICAgICAgIC8qIC05MCAtNDUgMCA0NSA5MCBmb3IgaGVhZCBsZWZ0IHRvIHJpZ3RoIHRpbHQgKi8KKyAgICBpbnQzMl90IHVwZG93bl9kaXI7ICAgICAgICAvKiB1cCBkb3duIGRpcmVjdGlvbiAoLTE4MCwgMTc5KSAqLworICAgIGludDMyX3QgbGVmdHJpZ2h0X2RpcjsgICAgIC8qIGxlZnQgcmlnaHQgZGlyZWN0aW9uICgtMTgwLCAxNzkpICovCisgICAgaW50MzJfdCByb2xsX2RpcjsgICAgICAgICAgLyogcm9sbCBkaXJlY3Rpb24gKC0xODAsIDE3OSkgKi8KKyAgICBpbnQ4X3QgbGVmdF9yaWdodF9nYXplOyAgICAvKiBsZWZ0IHJpZ2h0IGdhemUgZGVncmVlICgtNTAsIDUwKSAqLworICAgIGludDhfdCB0b3BfYm90dG9tX2dhemU7ICAgIC8qIHVwIGRvd24gZ2F6ZSBkZWdyZWUgKC01MCwgNTApICovCit9IGNhbV9mYWNlX2dhemVfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtX2ZhY2VfZ2F6ZV9pbmZvX3QgZ2F6ZVtNQVhfUk9JXTsKK30gY2FtX2ZhY2VfZ2F6ZV9kYXRhX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IGJsaW5rX2RldGVjdGVkOyAgICAvKiBpZiBibGluayBpcyBkZXRlY3RlZCAqLworICAgIHVpbnQ4X3QgbGVmdF9ibGluazsgICAgICAgIC8qIGxlZnQgZXllIGJsaW5rIGRlZ2VyZWUgKDAsIC0xMDApICovCisgICAgdWludDhfdCByaWdodF9ibGluazsgICAgICAgLyogcmlnaHQgZXllIGJsaW5rIGRlZ3JlZSAoMCwgLSAxMDApICovCit9IGNhbV9mYWNlX2JsaW5rX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9mYWNlX2JsaW5rX2luZm9fdCBibGlua1tNQVhfUk9JXTsKK30gY2FtX2ZhY2VfYmxpbmtfZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBmYWNlX3JlY29nbmlzZWQ7ICAgLyogaWYgZmFjZSBpcyByZWNvZ25pc2VkICovCisgICAgdWludDMyX3QgdW5pcXVlX2lkOyAgIC8qIGlmIGZhY2UgaXMgcmVjb2duaXNlZCAqLworfSBjYW1fZmFjZV9yZWNvZ19pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1fZmFjZV9yZWNvZ19pbmZvX3QgZmFjZV9yZWNbTUFYX1JPSV07Cit9IGNhbV9mYWNlX3JlY29nX2RhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgZmFjZV9pZDsgICAgICAgICAgICAvKiB1bmlxdWUgaWQgZm9yIGZhY2UgdHJhY2tpbmcgd2l0aGluIHZpZXcgdW5sZXNzIHZpZXcgY2hhbmdlcyAqLworICAgIGludDhfdCBzY29yZTsgICAgICAgICAgICAgIC8qIHNjb3JlIG9mIGNvbmZpZGVuY2UgKDAsIC0xMDApICovCisgICAgY2FtX3JlY3RfdCBmYWNlX2JvdW5kYXJ5OyAgLyogYm91bmRhcnkgb2YgZmFjZSBkZXRlY3RlZCAqLworfSBjYW1fZmFjZV9kZXRlY3Rpb25faW5mb190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgZnJhbWVfaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyYW1lIGluZGV4IG9mIHdoaWNoIGZhY2VzIGFyZSBkZXRlY3RlZCAqLworICAgIHVpbnQ4X3QgbnVtX2ZhY2VzX2RldGVjdGVkOyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZmFjZXMgZGV0ZWN0ZWQgKi8KKyAgICBjYW1fZmFjZV9kZXRlY3Rpb25faW5mb190IGZhY2VzW01BWF9ST0ldOyAgLyogZGV0YWlsZWQgaW5mb3JtYXRpb24gb2YgZmFjZXMgZGV0ZWN0ZWQgKi8KKyAgICBxY2FtZXJhX2ZhY2VfZGV0ZWN0X3R5cGVfdCBmZF90eXBlOyAgICAgICAgLyogZmFjZSBkZXRlY3QgZm9yIHByZXZpZXcgb3Igc25hcHNob3QgZnJhbWUqLworICAgIGNhbV9kaW1lbnNpb25fdCBmZF9mcmFtZV9kaW07ICAgICAgICAgICAgICAvKiBmcmFtZSBkaW1zIG9uIHdoaWNoIGZkIGlzIGFwcGxpZWQgKi8KKyAgICB1aW50OF90IHVwZGF0ZV9mbGFnOyAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZyB0byBpbmZvcm0gd2hldGhlciBIQUwgbmVlZHMgdG8gc2VuZCBjYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBhcHAgb3Igbm90ICovCit9IGNhbV9mYWNlX2RldGVjdGlvbl9kYXRhX3Q7CisKKy8vIGRlZmluaXRpb24gb2YgY29tcG9zaXRlIGZhY2UgZGV0ZWN0aW9uIGRhdGEKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1fZmFjZV9kZXRlY3Rpb25fZGF0YV90IGRldGVjdGlvbl9kYXRhOworCisgICAgaW50OF90IHJlY29nX3ZhbGlkOworICAgIGNhbV9mYWNlX3JlY29nX2RhdGFfdCByZWNvZ19kYXRhOworCisgICAgaW50OF90IGJsaW5rX3ZhbGlkOworICAgIGNhbV9mYWNlX2JsaW5rX2RhdGFfdCBibGlua19kYXRhOworCisgICAgaW50OF90IGdhemVfdmFsaWQ7CisgICAgY2FtX2ZhY2VfZ2F6ZV9kYXRhX3QgZ2F6ZV9kYXRhOworCisgICAgaW50OF90IHNtaWxlX3ZhbGlkOworICAgIGNhbV9mYWNlX3NtaWxlX2RhdGFfdCBzbWlsZV9kYXRhOworCisgICAgaW50OF90IGxhbmRtYXJrX3ZhbGlkOworICAgIGNhbV9mYWNlX2xhbmRtYXJrc19kYXRhX3QgbGFuZG1hcmtfZGF0YTsKKworICAgIGludDhfdCBjb250b3VyX3ZhbGlkOworICAgIGNhbV9mYWNlX2NvbnRvdXJfZGF0YV90IGNvbnRvdXJfZGF0YTsKK30gY2FtX2ZhY2VzX2RhdGFfdDsKKworI2RlZmluZSBDQU1fSElTVE9HUkFNX1NUQVRTX1NJWkUgMjU2CisKK3R5cGVkZWYgZW51bSB7CisgIENBTV9TVEFUU19DSEFOTkVMX1ksCisgIENBTV9TVEFUU19DSEFOTkVMX0dSLAorICBDQU1fU1RBVFNfQ0hBTk5FTF9HQiwKKyAgQ0FNX1NUQVRTX0NIQU5ORUxfUiwKKyAgQ0FNX1NUQVRTX0NIQU5ORUxfQiwKKyAgQ0FNX1NUQVRTX0NIQU5ORUxfQUxMLAorICBDQU1fU1RBVFNfQ0hBTk5FTF9NQVgKK30gY2FtX2hpc3RvZ3JhbV9kYXRhX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBtYXhfaGlzdF92YWx1ZTsKKyAgICB1aW50MzJfdCBoaXN0X2J1ZltDQU1fSElTVE9HUkFNX1NUQVRTX1NJWkVdOyAvKiBidWYgaG9sZGluZyBoaXN0b2dyYW0gc3RhdHMgZGF0YSAqLworfSBjYW1faGlzdG9ncmFtX2RhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9oaXN0b2dyYW1fZGF0YV90eXBlIGRhdGFfdHlwZTsKKyAgICBjYW1faGlzdG9ncmFtX2RhdGFfdCByX3N0YXRzOworICAgIGNhbV9oaXN0b2dyYW1fZGF0YV90IGJfc3RhdHM7CisgICAgY2FtX2hpc3RvZ3JhbV9kYXRhX3QgZ3Jfc3RhdHM7CisgICAgY2FtX2hpc3RvZ3JhbV9kYXRhX3QgZ2Jfc3RhdHM7Cit9IGNhbV9iYXllcl9oaXN0X3N0YXRzX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0hJU1RPR1JBTV9UWVBFX0JBWUVSLAorICAgIENBTV9ISVNUT0dSQU1fVFlQRV9ZVVYKK30gY2FtX2hpc3RvZ3JhbV90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1faGlzdG9ncmFtX3R5cGVfdCB0eXBlOworICAgIHVuaW9uIHsKKyAgICAgICAgY2FtX2JheWVyX2hpc3Rfc3RhdHNfdCBiYXllcl9zdGF0czsKKyAgICAgICAgY2FtX2hpc3RvZ3JhbV9kYXRhX3QgeXV2X3N0YXRzOworICAgIH07Cit9IGNhbV9oaXN0X3N0YXRzX3Q7CisKK2VudW0gY2FtX2ZvY3VzX2Rpc3RhbmNlX2luZGV4eworICBDQU1fRk9DVVNfRElTVEFOQ0VfTkVBUl9JTkRFWCwgIC8qIDAgKi8KKyAgQ0FNX0ZPQ1VTX0RJU1RBTkNFX09QVElNQUxfSU5ERVgsCisgIENBTV9GT0NVU19ESVNUQU5DRV9GQVJfSU5ERVgsCisgIENBTV9GT0NVU19ESVNUQU5DRV9NQVhfSU5ERVgKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgZmxvYXQgZm9jdXNfZGlzdGFuY2VbQ0FNX0ZPQ1VTX0RJU1RBTkNFX01BWF9JTkRFWF07Cit9IGNhbV9mb2N1c19kaXN0YW5jZXNfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgc2NhbGU7CisgICAgZmxvYXQgZGlvcHRlcjsKK30gY2FtX2ZvY3VzX3Bvc19pbmZvX3QgOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgZm9jYWxMZW5ndGhSYXRpbzsKK30gY2FtX2ZvY2FsX2xlbmd0aF9yYXRpb190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBuZWVkRmx1c2g7CisgICAgdWludDMyX3QgZm9jdXNlZF9mcmFtZV9pZHg7Cit9IGNhbV9hZl9mbHVzaF9pbmZvX3Q7CisKKy8qIERpZmZlcmVudCBhdXRvZm9jdXMgY3ljbGUgd2hlbiBjYWxsaW5nIGRvX2F1dG9Gb2N1cworICogQ0FNX0FGX0NPTVBMRVRFX0VYSVNUSU5HX1NXRUVQOiBDb21wbGV0ZSBleGlzdGluZyBzd2VlcAorICogaWYgb25lIGlzIG9uZ29pbmcsIGFuZCBsb2NrLgorICogQ0FNX0FGX0RPX09ORV9GVUxMX1NXRUVQOiBEbyBvbmUgZnVsbCBzd2VlcCwgcmVnYXJkbGVzcworICogb2YgdGhlIGN1cnJlbnQgc3RhdGUsIGFuZCBsb2NrLgorICogQ0FNX0FGX1NUQVJUX0NPTlRJTlVPVVNfU1dFRVA6IFN0YXJ0IGNvbnRpbm91cyBzd2VlcC4KKyAqIEFmdGVyIGRvX2F1dG9Gb2N1cywgSEFMIHJlY2VpdmVzIGFuIGV2ZW50OiBDQU1fQUZfRk9DVVNFRCwKKyAqIG9yIENBTV9BRl9OT1RfRk9DVVNFRC4KKyAqIGNhbmNlbF9hdXRvRm9jdXMgc3RvcHMgYW55IGxlbnMgbW92ZW1lbnQuCisgKiBFYWNoIGRvX2F1dG9Gb2N1cyBjYWxsIG9ubHkgcHJvZHVjZXMgMSBGT0NVU0VEL05PVF9GT0NVU0VECisgKiBldmVudCwgbm90IGJvdGguCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0FGX0NPTVBMRVRFX0VYSVNUSU5HX1NXRUVQLAorICAgIENBTV9BRl9ET19PTkVfRlVMTF9TV0VFUCwKKyAgICBDQU1fQUZfU1RBUlRfQ09OVElOVU9VU19TV0VFUAorfSBjYW1fYXV0b2ZvY3VzX2N5Y2xlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0FGX1NDQU5OSU5HLAorICAgIENBTV9BRl9GT0NVU0VELAorICAgIENBTV9BRl9OT1RfRk9DVVNFRCwKKyAgICBDQU1fQ0FGX1NDQU5OSU5HLAorICAgIENBTV9DQUZfRk9DVVNFRCwKKyAgICBDQU1fQ0FGX05PVF9GT0NVU0VELAorICAgIENBTV9BRl9JTkFDVElWRQorfSBjYW1fYXV0b2ZvY3VzX3N0YXRlX3Q7CisKKy8vRG9uJ3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUgQUYgc3RhdGVzIGJlbG93LiBJdCBzaG91bGQgbWF0Y2gKKy8vd2l0aCB0aGUgY29ycmVzcG9uZGluZyBlbnVtIGluIGZyYW1ld29ya3MgKGNhbWVyYTMuaCBhbmQKKy8vQ2FtZXJhTWV0YWRhdGEuamF2YSkKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0FGX1NUQVRFX0lOQUNUSVZFLAorICAgIENBTV9BRl9TVEFURV9QQVNTSVZFX1NDQU4sCisgICAgQ0FNX0FGX1NUQVRFX1BBU1NJVkVfRk9DVVNFRCwKKyAgICBDQU1fQUZfU1RBVEVfQUNUSVZFX1NDQU4sCisgICAgQ0FNX0FGX1NUQVRFX0ZPQ1VTRURfTE9DS0VELAorICAgIENBTV9BRl9TVEFURV9OT1RfRk9DVVNFRF9MT0NLRUQsCisgICAgQ0FNX0FGX1NUQVRFX1BBU1NJVkVfVU5GT0NVU0VECit9IGNhbV9hZl9zdGF0ZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtX2FmX3N0YXRlX3QgZm9jdXNfc3RhdGU7ICAgICAgICAgICAvKiBzdGF0ZSBvZiBmb2N1cyAqLworICAgIGNhbV9mb2N1c19kaXN0YW5jZXNfaW5mb190IGZvY3VzX2Rpc3Q7ICAgICAgIC8qIGZvY3VzIGRpc3RhbmNlICovCisgICAgY2FtX2ZvY3VzX21vZGVfdHlwZSBmb2N1c19tb2RlOyAgICAgICAgLyogZm9jdXMgbW9kZSBmcm9tIGJhY2tlbmQgKi8KKyAgICBpbnQzMl90IGZvY3VzX3BvczsKKyAgICBjYW1fYWZfZmx1c2hfaW5mb190IGZsdXNoX2luZm87CisgICAgdWludDhfdCBpc0RlcHRoOworICAgIGZsb2F0IGZvY3VzX3ZhbHVlOworICAgIHVpbnQ4X3Qgc3BvdF9saWdodF9kZXRlY3RlZDsKK30gY2FtX2F1dG9fZm9jdXNfZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgc3RyZWFtX2lkOworICAgIGNhbV9yZWN0X3QgY3JvcDsKKyAgICBjYW1fcmVjdF90IHJvaV9tYXA7Cit9IGNhbV9zdHJlYW1fY3JvcF9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IG51bV9vZl9zdHJlYW1zOworICAgIGNhbV9zdHJlYW1fY3JvcF9pbmZvX3QgY3JvcF9pbmZvW01BWF9OVU1fU1RSRUFNU107Cit9IGNhbV9jcm9wX2RhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IHN0cmVhbV9pZDsKKyAgICB1aW50MzJfdCBjZHNfZW5hYmxlOworfSBjYW1fc3RyZWFtX2Nkc19pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IHNlc3Npb25fY2RzX2VuYWJsZTsKKyAgICB1aW50OF90IG51bV9vZl9zdHJlYW1zOworICAgIGNhbV9zdHJlYW1fY2RzX2luZm9fdCBjZHNfaW5mb1tNQVhfTlVNX1NUUkVBTVNdOworfSBjYW1fY2RzX2RhdGFfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBET19OT1RfTkVFRF9GVVRVUkVfRlJBTUUsCisgICAgTkVFRF9GVVRVUkVfRlJBTUUsCit9IGNhbV9wcmVwX3NuYXBzaG90X3N0YXRlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0NfUkVEX0dBSU4sCisgICAgQ0NfR1JFRU5fUkVEX0dBSU4sCisgICAgQ0NfR1JFRU5fQkxVRV9HQUlOLAorICAgIENDX0JMVUVfR0FJTiwKKyAgICBDQ19HQUlOX01BWAorfSBjYW1fY2NfZ2FpbnNfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgZ2FpbnNbQ0NfR0FJTl9NQVhdOworfSBjYW1fY29sb3JfY29ycmVjdF9nYWluc190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLy8gSWYgTEVEIGlzIE9OIGFuZCBCdXJzdCBOdW0gPiAxLCB0aGlzIGlzIGZpcnN0IExFRCBPTiBmcmFtZQorICAgIHVpbnQzMl90IG1pbl9mcmFtZV9pZHg7CisgICAgLy8gSWYgTEVEIGlzIE9OIGFuZCBCdXJzdCBOdW0gPiAxLCB0aGlzIGlzIGZpcnN0IExFRCBPZmYgZnJhbWUgYWZ0ZXIgT04KKyAgICB1aW50MzJfdCBtYXhfZnJhbWVfaWR4OworICAgIC8vIFVzZWQgb25seSB3aGVuIExFRCBJcyBPTiBhbmQgYnVyc3QgbnVtID4gMQorICAgIHVpbnQzMl90IG51bV9sZWRfb25fZnJhbWVzOworICAgIC8vIFNraXAgY291bnQgYWZ0ZXIgTEVEIGlzIHR1cm5lZCBPRkYKKyAgICB1aW50MzJfdCBmcmFtZV9za2lwX2NvdW50OworICAgIC8vIEJhdGNoIGlkIGZvciBlYWNoIHBpY3R1cmUgcmVxdWVzdAorICAgIHVpbnQzMl90IGNvbmZpZ19iYXRjaF9pZHg7Cit9IGNhbV9mcmFtZV9pZHhfcmFuZ2VfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgU19OT1JNQUwgPSAwLAorICBTX1NDRU5FUlksCisgIFNfUE9SVFJBSVQsCisgIFNfUE9SVFJBSVRfQkFDS0xJR0hULAorICBTX1NDRU5FUllfQkFDS0xJR0hULAorICBTX0JBQ0tMSUdIVCwKKyAgU19IRFIsCisgIFNfTUFYX0RFRkFVTFQsCisgIFNfQ1VTVE9NMCA9IFNfTUFYX0RFRkFVTFQsCisgIFNfQ1VTVE9NMSwKKyAgU19DVVNUT00yLAorICBTX0NVU1RPTTMsCisgIFNfQ1VTVE9NNCwKKyAgU19DVVNUT001LAorICBTX0NVU1RPTTYsCisgIFNfQ1VTVE9NNywKKyAgU19DVVNUT004LAorICBTX0NVU1RPTTksCisgIFNfTUFYLAorfSBjYW1fYXV0b19zY2VuZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IGlzX2hkcl9zY2VuZTsKKyAgZmxvYXQgICAgaGRyX2NvbmZpZGVuY2U7Cit9IGNhbV9hc2RfaGRyX3NjZW5lX2RhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCAgICAgICAgICBkZXRlY3RlZDsKKyAgZmxvYXQgICAgICAgICAgICAgY29uZmlkZW5jZTsKKyAgdWludDMyX3QgICAgICAgICAgYXV0b19jb21wZW5zYXRpb247Cit9IGNhbV9hc2Rfc2NlbmVfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNhbV9hdXRvX3NjZW5lX3QgICAgICBkZXRlY3RlZF9zY2VuZTsKKyAgdWludDhfdCAgICAgICAgICAgICAgIG1heF9uX3NjZW5lczsKKyAgY2FtX2FzZF9zY2VuZV9pbmZvX3QgIHNjZW5lX2luZm9bU19NQVhdOworfSBjYW1fYXNkX2RlY2lzaW9uX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDMyX3QgbWV0YV9mcmFtZV9pZDsKK30gY2FtX21ldGFfdmFsaWRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fU0VOU09SX1JBVywKKyAgICBDQU1fU0VOU09SX1lVViwKKyAgICBDQU1fU0VOU09SX01PTk8KK30gY2FtX3NlbnNvcl90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtX2ZsYXNoX21vZGVfdCBmbGFzaF9tb2RlOworICAgIGZsb2F0ICAgICAgICAgICAgYXBlcnR1cmVfdmFsdWU7CisgICAgY2FtX2ZsYXNoX3N0YXRlX3QgICAgICAgIGZsYXNoX3N0YXRlOworICAgIGZsb2F0ICAgICAgICAgICAgZm9jYWxfbGVuZ3RoOworICAgIGZsb2F0ICAgICAgICAgICAgZl9udW1iZXI7CisgICAgaW50MzJfdCAgICAgICAgICBzZW5zaW5nX21ldGhvZDsKKyAgICBmbG9hdCAgICAgICAgICAgIGNyb3BfZmFjdG9yOworICAgIGNhbV9zZW5zb3JfdCBzZW5zX3R5cGU7Cit9IGNhbV9zZW5zb3JfcGFyYW1zX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX01FVEVSSU5HX01PREVfVU5LTk9XTiA9IDAsCisgICAgQ0FNX01FVEVSSU5HX01PREVfQVZFUkFHRSA9IDEsCisgICAgQ0FNX01FVEVSSU5HX01PREVfQ0VOVEVSX1dFSUdIVEVEX0FWRVJBR0UgPSAyLAorICAgIENBTV9NRVRFUklOR19NT0RFX1NQT1QgPSAzLAorICAgIENBTV9NRVRFUklOR19NT0RFX01VTFRJX1NQT1QgPSA0LAorICAgIENBTV9NRVRFUklOR19NT0RFX1BBVFRFUk4gPSA1LAorICAgIENBTV9NRVRFUklOR19NT0RFX1BBUlRJQUwgPSA2LAorICAgIENBTV9NRVRFUklOR19NT0RFX09USEVSID0gMjU1LAorfSBjYW1fbWV0ZXJpbmdfbW9kZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZmxvYXQgZXhwX3RpbWU7CisgICAgaW50MzJfdCBpc29fdmFsdWU7CisgICAgdWludDMyX3QgZmxhc2hfbmVlZGVkOworICAgIHVpbnQzMl90IHNldHRsZWQ7CisgICAgY2FtX3diX21vZGVfdHlwZSB3Yl9tb2RlOworICAgIHVpbnQzMl90IG1ldGVyaW5nX21vZGU7CisgICAgdWludDMyX3QgZXhwb3N1cmVfcHJvZ3JhbTsKKyAgICB1aW50MzJfdCBleHBvc3VyZV9tb2RlOworICAgIHVpbnQzMl90IHNjZW5ldHlwZTsKKyAgICBmbG9hdCBicmlnaHRuZXNzOworICAgIGZsb2F0IGVzdF9zbmFwX2V4cF90aW1lOworICAgIGludDMyX3QgZXN0X3NuYXBfaXNvX3ZhbHVlOworICAgIHVpbnQzMl90IGVzdF9zbmFwX2x1bWE7CisgICAgdWludDMyX3QgZXN0X3NuYXBfdGFyZ2V0OworfSBjYW1fM2FfcGFyYW1zX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50NjRfdCBzd192ZXJzaW9uX251bWJlcjsKKyAgICBpbnQzMl90IGFlY19kZWJ1Z19kYXRhX3NpemU7CisgICAgY2hhciBhZWNfcHJpdmF0ZV9kZWJ1Z19kYXRhW0FFQ19ERUJVR19EQVRBX1NJWkVdOworfSBjYW1fYWVfZXhpZl9kZWJ1Z190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50OF90IGF3Yl9jY21fZW5hYmxlOworICAgIGludDhfdCBoYXJkX2F3Yl9jY21fZmxhZzsKKyAgICBpbnQ4X3QgY2NtX3VwZGF0ZV9mbGFnOworICAgIGZsb2F0ICBjY21bQVdCX05VTV9DQ01fUk9XU11bQVdCX05VTV9DQ01fQ09MU107CisgICAgZmxvYXQgIGNjbV9vZmZzZXRbQVdCX05VTV9DQ01fUk9XU107Cit9IGNhbV9hd2JfY2NtX3VwZGF0ZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MzJfdCBjY3RfdmFsdWU7CisgICAgY2FtX2F3Yl9nYWluX3QgcmdiX2dhaW5zOworICAgIGNhbV9hd2JfY2NtX3VwZGF0ZV90IGNjbV91cGRhdGU7Cit9IGNhbV9hd2JfcGFyYW1zX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQzMl90IGF3Yl9kZWJ1Z19kYXRhX3NpemU7CisgICAgY2hhciBhd2JfcHJpdmF0ZV9kZWJ1Z19kYXRhW0FXQl9ERUJVR19EQVRBX1NJWkVdOworfSBjYW1fYXdiX2V4aWZfZGVidWdfdDsKKworLyogQUYgZGVidWcgZGF0YSBmb3IgZXhpZiovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MzJfdCBhZl9kZWJ1Z19kYXRhX3NpemU7CisgICAgY2hhciBhZl9wcml2YXRlX2RlYnVnX2RhdGFbQUZfREVCVUdfREFUQV9TSVpFXTsKK30gY2FtX2FmX2V4aWZfZGVidWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgYXNkX2RlYnVnX2RhdGFfc2l6ZTsKKyAgICBjaGFyIGFzZF9wcml2YXRlX2RlYnVnX2RhdGFbQVNEX0RFQlVHX0RBVEFfU0laRV07Cit9IGNhbV9hc2RfZXhpZl9kZWJ1Z190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MzJfdCBiZ19zdGF0c19idWZmZXJfc2l6ZTsKKyAgICBpbnQzMl90IGJnX2NvbmZpZ19idWZmZXJfc2l6ZTsKKyAgICBjaGFyIHN0YXRzX2J1ZmZlcl9wcml2YXRlX2RlYnVnX2RhdGFbU1RBVFNfQlVGRkVSX0RFQlVHX0RBVEFfU0laRV07Cit9IGNhbV9zdGF0c19idWZmZXJfZXhpZl9kZWJ1Z190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MzJfdCBiZV9zdGF0c19idWZmZXJfc2l6ZTsKKyAgICBpbnQzMl90IGJlX2NvbmZpZ19idWZmZXJfc2l6ZTsKKyAgICBjaGFyIGJlc3RhdHNfYnVmZmVyX3ByaXZhdGVfZGVidWdfZGF0YVtCRVNUQVRTX0JVRkZFUl9ERUJVR19EQVRBX1NJWkVdOworfSBjYW1fYmVzdGF0c19idWZmZXJfZXhpZl9kZWJ1Z190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MzJfdCBiaGlzdF9zdGF0c19idWZmZXJfc2l6ZTsKKyAgICBjaGFyIGJoaXN0X3ByaXZhdGVfZGVidWdfZGF0YVtCSElTVF9TVEFUU19ERUJVR19EQVRBX1NJWkVdOworfSBjYW1fYmhpc3RfYnVmZmVyX2V4aWZfZGVidWdfdDsKKworLyogM0EgdmVyc2lvbiovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgbWFqb3JfdmVyc2lvbjsKKyAgICB1aW50MTZfdCBtaW5vcl92ZXJzaW9uOworICAgIHVpbnQxNl90IHBhdGNoX3ZlcnNpb247CisgICAgdWludDE2X3QgbmV3X2ZlYXR1cmVfZGVzOworfSBjYW1fcTNhX3ZlcnNpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgdHVuaW5nX2luZm9fYnVmZmVyX3NpemU7CisgICAgY2hhciB0dW5pbmdfaW5mb19wcml2YXRlX2RlYnVnX2RhdGFbVFVOSU5HX0lORk9fREVCVUdfREFUQV9TSVpFXTsKK30gY2FtX3EzYV90dW5pbmdfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgdHVuaW5nX2RhdGFfdmVyc2lvbjsKKyAgICBzaXplX3QgdHVuaW5nX3NlbnNvcl9kYXRhX3NpemU7CisgICAgc2l6ZV90IHR1bmluZ192ZmVfZGF0YV9zaXplOworICAgIHNpemVfdCB0dW5pbmdfY3BwX2RhdGFfc2l6ZTsKKyAgICBzaXplX3QgdHVuaW5nX2NhY19kYXRhX3NpemU7CisgICAgc2l6ZV90IHR1bmluZ19jYWNfZGF0YV9zaXplMjsKKyAgICBzaXplX3QgdHVuaW5nX21vZDNfZGF0YV9zaXplOworICAgIHVpbnQ4X3QgIGRhdGFbVFVOSU5HX0RBVEFfTUFYXTsKK310dW5pbmdfcGFyYW1zX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQzMl90IGV2ZW50X3R5cGU7CisgICAgY2FtX2RpbWVuc2lvbl90IGRpbTsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBjaGFyIHBhdGhbUUNBTUVSQV9NQVhfRklMRVBBVEhfTEVOR1RIXTsKKyAgICBjYW1fZm9ybWF0X3QgcGljdHVyZV9mb3JtYXQ7Cit9IGNhbV9pbnRfZXZ0X3BhcmFtc190OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgcHJpdmF0ZV9pc3BfZGF0YVtNQVhfSVNQX0RBVEFfU0laRV07Cit9IGNhbV9jaHJvbWF0aXhfbGl0ZV9pc3BfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90IHByaXZhdGVfcHBfZGF0YVtNQVhfUFBfREFUQV9TSVpFXTsKK30gY2FtX2Nocm9tYXRpeF9saXRlX3BwX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBwcml2YXRlX3N0YXRzX2RhdGFbTUFYX0FFX1NUQVRTX0RBVEFfU0laRV07Cit9IGNhbV9jaHJvbWF0aXhfbGl0ZV9hZV9zdGF0c190OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgcHJpdmF0ZV9zdGF0c19kYXRhW01BWF9BV0JfU1RBVFNfREFUQV9TSVpFXTsKK30gY2FtX2Nocm9tYXRpeF9saXRlX2F3Yl9zdGF0c190OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgcHJpdmF0ZV9zdGF0c19kYXRhW01BWF9BRl9TVEFUU19EQVRBX1NJWkVdOworfSBjYW1fY2hyb21hdGl4X2xpdGVfYWZfc3RhdHNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90IHByaXZhdGVfc3RhdHNfZGF0YVtNQVhfQVNEX1NUQVRTX0RBVEFfU0laRV07Cit9IGNhbV9jaHJvbWF0aXhfbGl0ZV9hc2Rfc3RhdHNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgdWludDMyX3QgbWluX2J1ZmZlcnM7CisgICB1aW50MzJfdCBtYXhfYnVmZmVyczsKK30gY2FtX2J1ZmZlcl9pbmZvX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgLyogU3RhbmRhbG9uZSBjYW1lcmEgKHdvbid0IGJlIGxpbmtlZCkgKi8KKyAgICBDQU1fVFlQRV9TVEFOREFMT05FPTAsCisgICAgLyogTWFpbiBjYW1lcmEgb2YgdGhlIHJlbGF0ZWQgY2FtIHN1YnN5c3RlbSB3aGljaCBjb250cm9scworICAgICAgIEhXIHN5bmMgYXQgc2Vuc29yIGxldmVsKi8KKyAgICBDQU1fVFlQRV9NQUlOLAorICAgIC8qIEF1eCBjYW1lcmEgb2YgdGhlIHJlbGF0ZWQgY2FtIHN1YnN5c3RlbSAqLworICAgIENBTV9UWVBFX0FVWAorfSBjYW1fc3luY190eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNXzNBX1NZTkNfTk9ORSwgICAgIC8qIERlZmF1bHQgZm9yIHNpbmdsZSBjYW1lcmEsIG5vdCBsaW5rICovCisgICAgQ0FNXzNBX1NZTkNfRk9MTE9XLCAgIC8qIE1hc3Rlci0+U2xhdmU6IE1hc3RlciB1cGRhdGVzIHNsYXZlICovCisgICAgQ0FNXzNBX1NZTkNfQUxHT19DVFJMLC8qIEFsZ29yaXRobSB1cGRhdGVkIGNhbWVyYXMgZGlyZWN0bHkgKi8KK30gY2FtXzNhX3N5bmNfbW9kZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtX2RpbWVuc2lvbl90IHN0cmVhbV9zaXplc1tNQVhfTlVNX1NUUkVBTVNdOworICAgIHVpbnQzMl90IG51bV9zdHJlYW1zOworICAgIGNhbV9zdHJlYW1fdHlwZV90IHR5cGVbTUFYX05VTV9TVFJFQU1TXTsKKyAgICBjYW1fZmVhdHVyZV9tYXNrX3QgcG9zdHByb2Nlc3NfbWFza1tNQVhfTlVNX1NUUkVBTVNdOworICAgIGNhbV9idWZmZXJfaW5mb190IGJ1ZmZlcl9pbmZvOworICAgIGNhbV9pc190eXBlX3QgaXNfdHlwZVtNQVhfTlVNX1NUUkVBTVNdOworICAgIGNhbV9oZnJfbW9kZV90IGhmcl9tb2RlOworICAgIGNhbV9mb3JtYXRfdCBmb3JtYXRbTUFYX05VTV9TVFJFQU1TXTsKKyAgICB1aW50MzJfdCBidWZfYWxpZ25tZW50OworICAgIHVpbnQzMl90IG1pbl9zdHJpZGU7CisgICAgdWludDMyX3QgbWluX3NjYW5saW5lOworICAgIHVpbnQ4X3QgYmF0Y2hfc2l6ZTsKKyAgICBjYW1fc3luY190eXBlX3Qgc3luY190eXBlOworICAgIHVpbnQzMl90IGR0W01BWF9OVU1fU1RSRUFNU107CisgICAgdWludDMyX3QgdmNbTUFYX05VTV9TVFJFQU1TXTsKKyAgICBjYW1fc3ViX2Zvcm1hdF90eXBlX3Qgc3ViX2Zvcm1hdF90eXBlW01BWF9OVU1fU1RSRUFNU107Cit9IGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0lOVEZfT1ZFUldSSVRFX01JTklfQ0hST01BVElYX09GRkxJTkUsCisgICAgQ0FNX0lOVEZfT1ZFUldSSVRFX0lTUF9IV19EQVRBX09GRkxJTkUsCisgICAgQ0FNX0lOVEZfT1ZFUldSSVRFX01JTklfQ0hST01BVElYX09OTElORSwKKyAgICBDQU1fSU5URl9PVkVSV1JJVEVfSVNQX0hXX0RBVEFfT05MSU5FLAorICAgIENBTV9JTlRGX09WRVJXUklURV9NQVgsCit9IGNhbV9pbnRmX292ZXJ3cml0ZV90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBsZHNfZW5hYmxlZDsKKyAgZmxvYXQgcm5yX3NhbXBsaW5nX2ZhY3RvcjsKK30gY2FtX2ltZ19oeXN0ZXJpc2lzX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBkeW5hbWljIGZlYXR1cmUgZW5hYmxlbWVudCAqLworICB1aW50NjRfdCBkeW5fZmVhdHVyZV9tYXNrOworICAvKiBpbnB1dCBmcmFtZSBjb3VudCBmb3Igc3RhY2tpbmcgKi8KKyAgdWludDMyX3QgaW5wdXRfY291bnQ7CisgIC8qIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisgIHVpbnQ4X3QgIHJlc2VydmVkWzMyXTsKK30gY2FtX2R5bl9pbWdfZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNhbV9pbnRmX292ZXJ3cml0ZV90eXBlX3Qgb3ZlcndyaXRlX3R5cGU7CisgIGNoYXIgaXNwX2h3X2RhdGFfbGlzdFs0MDk2XTsgICAgIC8qYWRkIHVwcGVyIGJvdW5kIG1lbW9yeSwgY3VzdG9tZXIgdG8gZmlsbCovCisgIGNoYXIgY2hyb21hdGl4X2RhdGFfb3ZlcndyaXRlWzQwOTZdOyAvKmFkZCBib3VuZCBtZW1vcnksIGN1c3RvbWVyIGZpbGwqLworfSBjYW1faHdfZGF0YV9vdmVyd3JpdGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IG51bV9zdHJlYW1zOworICAgIHVpbnQzMl90IHN0cmVhbUlEW01BWF9OVU1fU1RSRUFNU107Cit9IGNhbV9zdHJlYW1fSURfdDsKKworLypDQUMgTWVzc2FnZSBwb3N0ZWQgZHVyaW5nIHBpcGVsaW5lKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBmcmFtZV9pZDsKKyAgICBpbnQzMl90IGJ1Zl9pZHg7Cit9IGNhbV9jYWNfaW5mb190OworCit0eXBlZGVmIHN0cnVjdAoreworICB1aW50MzJfdCBpZDsgICAgICAgICAgICAvKiBGcmFtZSBJRCAqLworICB1aW50NjRfdCB0aW1lc3RhbXA7ICAgIC8qIFRpbWUgc3RhbXAgKi8KKyAgdWludDMyX3QgZGlzdGFuY2VfaW5fbW07IC8qIERpc3RhbmNlIG9mIG9iamVjdCBpbiBST0kncyBpbiBtaWxpbWV0ZXJzICovCisgIHVpbnQzMl90IGNvbmZpZGVuY2U7ICAgICAvKiBDb25maWRlbmNlIG9uIGRpc3RhbmNlIGZyb20gMChObyBjb25maWRlbmNlKXRvIDEwMjQobWF4KSAqLworICB1aW50MzJfdCBzdGF0dXM7ICAgICAgICAvKiBTdGF0dXMgb2YgRENSRiBsaWJyYXJ5IGV4ZWN1dGlvbiBjYWxsICovCisgIGNhbV9yZWN0X3QgZm9jdXNlZF9yb2k7IC8qIFJPSSdzIGZvciB3aGljaCBkaXN0YW5jZSBpcyBlc3RpbWF0ZWQgKi8KKyAgdWludDMyX3QgZm9jdXNlZF94OyAgICAgLyogRm9jdXMgbG9jYXRpb24gWCBpbnNpZGUgUk9JIHdpdGggZGlzdGFuY2UgZXN0aW1hdGlvbiAqLworICB1aW50MzJfdCBmb2N1c2VkX3k7ICAgICAvKiBGb2N1cyBsb2NhdGlvbiBZIGluc2lkZSBST0kgd2l0aCBkaXN0YW5jZSBlc3RpbWF0aW9uICovCit9IGNhbV9kY3JmX3Jlc3VsdF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgZnJhbWVfaWQ7CisgICAgdWludDMyX3QgbnVtX3N0cmVhbXM7CisgICAgdWludDMyX3Qgc3RyZWFtX2lkW01BWF9OVU1fU1RSRUFNU107Cit9IGNhbV9idWZfZGl2ZXJ0X2luZm9fdDsKKwordHlwZWRlZiAgc3RydWN0IHsKKyAgICB1aW50OF90IGlzX3N0YXRzX3ZhbGlkOyAgICAgICAgICAgICAgIC8qIGlmIGhpc3RncmFtIGRhdGEgaXMgdmFsaWQgKi8KKyAgICBjYW1faGlzdF9zdGF0c190IHN0YXRzX2RhdGE7ICAgICAgICAgIC8qIGhpc3RvZ3JhbSBkYXRhICovCisKKyAgICB1aW50OF90IGlzX2ZhY2VzX3ZhbGlkOyAgICAgICAgICAgICAgIC8qIGlmIGZhY2UgZGV0ZWN0aW9uIGRhdGEgaXMgdmFsaWQgKi8KKyAgICBjYW1fZmFjZV9kZXRlY3Rpb25fZGF0YV90IGZhY2VzX2RhdGE7IC8qIGZhY2UgZGV0ZWN0aW9uIHJlc3VsdCAqLworCisgICAgdWludDhfdCBpc19mb2N1c192YWxpZDsgICAgICAgICAgICAgICAvKiBpZiBmb2N1cyBkYXRhIGlzIHZhbGlkICovCisgICAgY2FtX2F1dG9fZm9jdXNfZGF0YV90IGZvY3VzX2RhdGE7ICAgICAvKiBmb2N1cyBkYXRhICovCisKKyAgICB1aW50OF90IGlzX2Nyb3BfdmFsaWQ7ICAgICAgICAgICAgICAgIC8qIGlmIGNyb3AgZGF0YSBpcyB2YWxpZCAqLworICAgIGNhbV9jcm9wX2RhdGFfdCBjcm9wX2RhdGE7ICAgICAgICAgICAgLyogY3JvcCBkYXRhICovCisKKyAgICB1aW50OF90IGlzX3ByZXBfc25hcHNob3RfZG9uZV92YWxpZDsgIC8qIGlmIHByZXAgc25hcHNob3QgZG9uZSBpcyB2YWxpZCAqLworICAgIGNhbV9wcmVwX3NuYXBzaG90X3N0YXRlX3QgcHJlcF9zbmFwc2hvdF9kb25lX3N0YXRlOyAgLyogcHJlcGFyZSBzbmFwc2hvdCBkb25lIHN0YXRlICovCisKKyAgICB1aW50OF90IGlzX2NhY192YWxpZDsgICAgICAgICAgICAgICAgIC8qIGlmIGNhYyBpbmZvIGlzIHZhbGlkICovCisgICAgY2FtX2NhY19pbmZvX3QgY2FjX2luZm87ICAgICAgICAgICAgICAvKiBjYWMgaW5mbyAqLworCisgICAgLyogSHlzdGVyaXNpcyBkYXRhIGZyb20gSW1nIG1vZHVsZXMgKi8KKyAgICB1aW50OF90IGlzX2h5c3RfaW5mb192YWxpZDsgICAgICAgICAgIC8qIGlmIGh5c3QgaW5mbyBpcyB2YWxpZCAqLworICAgIGNhbV9pbWdfaHlzdGVyaXNpc19pbmZvX3QgaW1nX2h5c3RfaW5mbzsgLyogaHlzdCBpbmZvICovCisKKyAgICAvKiBpZiBnb29kIGZyYW1lIGlkeCByYW5nZSBpcyB2YWxpZCAqLworICAgIHVpbnQ4X3QgaXNfZ29vZF9mcmFtZV9pZHhfcmFuZ2VfdmFsaWQ7CisgICAgLyogZ29vZCBmcmFtZSBpZHggcmFuZ2UsIG1ha2Ugc3VyZToKKyAgICAgKiAxLiBnb29kX2ZyYW1lX2lkeF9yYW5nZS5taW5fZnJhbWVfaWR4ID4gY3VycmVudF9mcmFtZV9pZHgKKyAgICAgKiAyLiBnb29kX2ZyYW1lX2lkeF9yYW5nZS5taW5fZnJhbWVfaWR4IC0gY3VycmVudF9mcmFtZV9pZHggPCAxMDAgKi8KKyAgICBjYW1fZnJhbWVfaWR4X3JhbmdlX3QgZ29vZF9mcmFtZV9pZHhfcmFuZ2U7CisKKyAgICBjYW1fYXNkX2RlY2lzaW9uX3QgY2FtX2FzZF9pbmZvOworCisgICAgY2hhciBwcml2YXRlX21ldGFkYXRhW01BWF9NRVRBREFUQV9QUklWQVRFX1BBWUxPQURfU0laRV9JTl9CWVRFU107CisKKyAgICAvKiBBRSBwYXJhbWV0ZXJzICovCisgICAgdWludDhfdCBpc18zYV9wYXJhbXNfdmFsaWQ7CisgICAgY2FtXzNhX3BhcmFtc190IGNhbV8zYV9wYXJhbXM7CisKKyAgICAvKiBBRSBleGlmIGRlYnVnIHBhcmFtZXRlcnMgKi8KKyAgICB1aW50OF90IGlzX2FlX2V4aWZfZGVidWdfdmFsaWQ7CisgICAgY2FtX2FlX2V4aWZfZGVidWdfdCBhZV9leGlmX2RlYnVnX3BhcmFtczsKKworICAgIC8qIEFXQiBleGlmIGRlYnVnIHBhcmFtZXRlcnMgKi8KKyAgICB1aW50OF90IGlzX2F3Yl9leGlmX2RlYnVnX3ZhbGlkOworICAgIGNhbV9hd2JfZXhpZl9kZWJ1Z190IGF3Yl9leGlmX2RlYnVnX3BhcmFtczsKKworICAgIC8qIEFGIGV4aWYgZGVidWcgcGFyYW1ldGVycyAqLworICAgIHVpbnQ4X3QgaXNfYWZfZXhpZl9kZWJ1Z192YWxpZDsKKyAgICBjYW1fYWZfZXhpZl9kZWJ1Z190IGFmX2V4aWZfZGVidWdfcGFyYW1zOworCisgICAgLyogQVNEIGV4aWYgZGVidWcgcGFyYW1ldGVycyAqLworICAgIHVpbnQ4X3QgaXNfYXNkX2V4aWZfZGVidWdfdmFsaWQ7CisgICAgY2FtX2FzZF9leGlmX2RlYnVnX3QgYXNkX2V4aWZfZGVidWdfcGFyYW1zOworCisgICAgLyogU3RhdHMgYnVmZmVyIGV4aWYgZGVidWcgcGFyYW1ldGVycyAqLworICAgIHVpbnQ4X3QgaXNfc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfdmFsaWQ7CisgICAgY2FtX3N0YXRzX2J1ZmZlcl9leGlmX2RlYnVnX3Qgc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfcGFyYW1zOworCisgICAgLyogQkUgc3RhdHMgYnVmZmVyIGV4aWYgZGVidWcgcGFyYW1ldGVycyAqLworICAgIHVpbnQ4X3QgaXNfYmVzdGF0c19idWZmZXJfZXhpZl9kZWJ1Z192YWxpZDsKKyAgICBjYW1fYmVzdGF0c19idWZmZXJfZXhpZl9kZWJ1Z190IGJlc3RhdHNfYnVmZmVyX2V4aWZfZGVidWdfcGFyYW1zOworCisgICAgLyogQmhpc3QgZXhpZiBkZWJ1ZyBwYXJhbWV0ZXJzLiAqLworICAgIHVpbnQ4X3QgaXNfYmhpc3RfZXhpZl9kZWJ1Z192YWxpZDsKKyAgICBjYW1fYmhpc3RfYnVmZmVyX2V4aWZfZGVidWdfdCBiaGlzdF9leGlmX2RlYnVnX3BhcmFtczsKKworICAgIC8qIEFXQiBwYXJhbWV0ZXJzICovCisgICAgdWludDhfdCBpc19hd2JfcGFyYW1zX3ZhbGlkOworICAgIGNhbV9hd2JfcGFyYW1zX3QgYXdiX3BhcmFtczsKKworICAgIC8qIHNlbnNvciBwYXJhbWV0ZXJzICovCisgICAgdWludDhfdCBpc19zZW5zb3JfcGFyYW1zX3ZhbGlkOworICAgIGNhbV9zZW5zb3JfcGFyYW1zX3Qgc2Vuc29yX3BhcmFtczsKKworICAgIC8qIE1ldGEgdmFsaWQgcGFyYW1zICovCisgICAgdWludDhfdCBpc19tZXRhX3ZhbGlkOworICAgIGNhbV9tZXRhX3ZhbGlkX3QgbWV0YV92YWxpZF9wYXJhbXM7CisKKyAgICAvKlR1bmluZyBEYXRhKi8KKyAgICB1aW50OF90IGlzX3R1bmluZ19wYXJhbXNfdmFsaWQ7CisgICAgdHVuaW5nX3BhcmFtc190IHR1bmluZ19wYXJhbXM7CisKKyAgICB1aW50OF90IGlzX2Nocm9tYXRpeF9saXRlX2lzcF92YWxpZDsKKyAgICBjYW1fY2hyb21hdGl4X2xpdGVfaXNwX3QgY2hyb21hdGl4X2xpdGVfaXNwX2RhdGE7CisKKyAgICB1aW50OF90IGlzX2Nocm9tYXRpeF9saXRlX3BwX3ZhbGlkOworICAgIGNhbV9jaHJvbWF0aXhfbGl0ZV9wcF90IGNocm9tYXRpeF9saXRlX3BwX2RhdGE7CisKKyAgICB1aW50OF90IGlzX2Nocm9tYXRpeF9saXRlX2FlX3N0YXRzX3ZhbGlkOworICAgIGNhbV9jaHJvbWF0aXhfbGl0ZV9hZV9zdGF0c190IGNocm9tYXRpeF9saXRlX2FlX3N0YXRzX2RhdGE7CisKKyAgICB1aW50OF90IGlzX2Nocm9tYXRpeF9saXRlX2F3Yl9zdGF0c192YWxpZDsKKyAgICBjYW1fY2hyb21hdGl4X2xpdGVfYXdiX3N0YXRzX3QgY2hyb21hdGl4X2xpdGVfYXdiX3N0YXRzX2RhdGE7CisKKyAgICB1aW50OF90IGlzX2Nocm9tYXRpeF9saXRlX2FmX3N0YXRzX3ZhbGlkOworICAgIGNhbV9jaHJvbWF0aXhfbGl0ZV9hZl9zdGF0c190IGNocm9tYXRpeF9saXRlX2FmX3N0YXRzX2RhdGE7CisKKyAgICB1aW50OF90IGlzX2RjcmZfcmVzdWx0X3ZhbGlkOworICAgIGNhbV9kY3JmX3Jlc3VsdF90IGRjcmZfcmVzdWx0OworCisgICAgLyogRHluYW1pYyBmZWF0dXJlIGVuYWJsZW1lbnQgZnJvbSBwb3N0cHJvY2Vzc2luZyBtb2R1bGVzICovCisgICAgdWludDhfdCBpc19keW5faW1nX2RhdGFfdmFsaWQ7CisgICAgY2FtX2R5bl9pbWdfZGF0YV90IGR5bl9pbWdfZGF0YTsKKworfSBjYW1fbWV0YWRhdGFfaW5mb190OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9JTlRGX1BBUk1fSEFMX1ZFUlNJT04gPSAweDEsCisKKyAgICAvKiBPdmVyYWxsIG1vZGUgb2YgM0EgY29udHJvbCByb3V0aW5lcy4gV2UgbmVlZCB0byBoYXZlIHRoaXMgcGFyYW1ldGVyCisgICAgICogYmVjYXVzZSBub3QgYWxsIGFuZHJvaWQuY29udHJvbC4qIGhhdmUgYW4gT0ZGIG9wdGlvbiwgZm9yIGV4YW1wbGUsCisgICAgICogQUVfRlBTX1JhbmdlLCBhZVByZWNhcHR1cmVUcmlnZ2VyICovCisgICAgQ0FNX0lOVEZfTUVUQV9NT0RFLAorICAgIC8qIFdoZXRoZXIgQUUgaXMgY3VycmVudGx5IHVwZGF0aW5nIHRoZSBzZW5zb3IgZXhwb3N1cmUgYW5kIHNlbnNpdGl2aXR5CisgICAgICogZmllbGRzICovCisgICAgQ0FNX0lOVEZfTUVUQV9BRUNfTU9ERSwKKyAgICBDQU1fSU5URl9QQVJNX1dISVRFX0JBTEFOQ0UsCisgICAgQ0FNX0lOVEZfUEFSTV9GT0NVU19NT0RFLAorCisgICAgLyogY29tbW9uIGJldHdlZW4gSEFMMSBhbmQgSEFMMyAqLworICAgIENBTV9JTlRGX1BBUk1fQU5USUJBTkRJTkcsCisgICAgQ0FNX0lOVEZfUEFSTV9FWFBPU1VSRV9DT01QRU5TQVRJT04sCisgICAgQ0FNX0lOVEZfUEFSTV9FVl9TVEVQLAorICAgIENBTV9JTlRGX1BBUk1fQUVDX0xPQ0ssCisgICAgQ0FNX0lOVEZfUEFSTV9GUFNfUkFOR0UsIC8qIDEwICovCisgICAgQ0FNX0lOVEZfUEFSTV9BV0JfTE9DSywKKyAgICBDQU1fSU5URl9QQVJNX0VGRkVDVCwKKyAgICBDQU1fSU5URl9QQVJNX0JFU1RTSE9UX01PREUsCisgICAgQ0FNX0lOVEZfUEFSTV9ESVNfRU5BQkxFLAorICAgIENBTV9JTlRGX1BBUk1fTEVEX01PREUsCisgICAgQ0FNX0lOVEZfTUVUQV9ISVNUT0dSQU0sCisgICAgQ0FNX0lOVEZfTUVUQV9GQUNFX0RFVEVDVElPTiwKKyAgICAvKiBXaGV0aGVyIG9wdGljYWwgaW1hZ2Ugc3RhYmlsaXphdGlvbiBpcyBlbmFibGVkLiAqLworICAgIENBTV9JTlRGX01FVEFfTEVOU19PUFRfU1RBQl9NT0RFLAorICAgIC8qIHNwZWNpZmljIHRvIEhBbDEgKi8KKyAgICBDQU1fSU5URl9NRVRBX0FVVE9GT0NVU19EQVRBLAorICAgIENBTV9JTlRGX1BBUk1fUVVFUllfRkxBU0g0U05BUCwgLyogMjAgKi8KKyAgICBDQU1fSU5URl9QQVJNX0VYUE9TVVJFLAorICAgIENBTV9JTlRGX1BBUk1fU0hBUlBORVNTLAorICAgIENBTV9JTlRGX1BBUk1fQ09OVFJBU1QsCisgICAgQ0FNX0lOVEZfUEFSTV9TQVRVUkFUSU9OLAorICAgIENBTV9JTlRGX1BBUk1fQlJJR0hUTkVTUywKKyAgICBDQU1fSU5URl9QQVJNX0lTTywKKyAgICBDQU1fSU5URl9QQVJNX1pPT00sCisgICAgQ0FNX0lOVEZfUEFSTV9ST0xMT0ZGLAorICAgIENBTV9JTlRGX1BBUk1fTU9ERSwgICAgICAgICAgICAgLyogY2FtZXJhIG1vZGUgKi8KKyAgICBDQU1fSU5URl9QQVJNX0FFQ19BTEdPX1RZUEUsIC8qIDMwICovIC8qIGF1dG8gZXhwb3N1cmUgYWxnb3JpdGhtICovCisgICAgQ0FNX0lOVEZfUEFSTV9GT0NVU19BTEdPX1RZUEUsICAvKiBmb2N1cyBhbGdvcml0aG0gKi8KKyAgICBDQU1fSU5URl9QQVJNX0FFQ19ST0ksCisgICAgQ0FNX0lOVEZfUEFSTV9BRl9ST0ksCisgICAgQ0FNX0lOVEZfUEFSTV9TQ0VfRkFDVE9SLAorICAgIENBTV9JTlRGX1BBUk1fRkQsCisgICAgQ0FNX0lOVEZfUEFSTV9NQ0UsCisgICAgQ0FNX0lOVEZfUEFSTV9IRlIsCisgICAgQ0FNX0lOVEZfUEFSTV9SRURFWUVfUkVEVUNUSU9OLAorICAgIENBTV9JTlRGX1BBUk1fV0FWRUxFVF9ERU5PSVNFLAorICAgIENBTV9JTlRGX1BBUk1fVEVNUE9SQUxfREVOT0lTRSwgLyogNDAgKi8KKyAgICBDQU1fSU5URl9QQVJNX0hJU1RPR1JBTSwKKyAgICBDQU1fSU5URl9QQVJNX0FTRF9FTkFCTEUsCisgICAgQ0FNX0lOVEZfUEFSTV9SRUNPUkRJTkdfSElOVCwKKyAgICBDQU1fSU5URl9QQVJNX0hEUiwKKyAgICBDQU1fSU5URl9QQVJNX01BWF9ESU1FTlNJT04sCisgICAgQ0FNX0lOVEZfUEFSTV9SQVdfRElNRU5TSU9OLAorICAgIENBTV9JTlRGX1BBUk1fRlJBTUVTS0lQLAorICAgIENBTV9JTlRGX1BBUk1fWlNMX01PREUsICAvKiBpbmRpY2F0aW5nIGlmIGl0J3MgcnVubmluZyBpbiBaU0wgbW9kZSAqLworICAgIENBTV9JTlRGX1BBUk1fQlVSU1RfTlVNLAorICAgIENBTV9JTlRGX1BBUk1fUkVUUk9fQlVSU1RfTlVNLCAvKiA1MCAqLworICAgIENBTV9JTlRGX1BBUk1fQlVSU1RfTEVEX09OX1BFUklPRCwKKyAgICBDQU1fSU5URl9QQVJNX0hEUl9ORUVEXzFYLCAvKiBpZiBIRFIgbmVlZHMgMXggb3V0cHV0ICovCisgICAgQ0FNX0lOVEZfUEFSTV9MT0NLX0NBRiwKKyAgICBDQU1fSU5URl9QQVJNX1ZJREVPX0hEUiwKKyAgICBDQU1fSU5URl9QQVJNX1NFTlNPUl9IRFIsCisgICAgQ0FNX0lOVEZfUEFSTV9ST1RBVElPTiwKKyAgICBDQU1fSU5URl9QQVJNX1NDQUxFLAorICAgIENBTV9JTlRGX1BBUk1fVlQsIC8qIGluZGljYXRpbmcgaWYgaXQncyBhIFZpZGVvIENhbGwgQXBsbGljYXRpb24gKi8KKyAgICBDQU1fSU5URl9NRVRBX0NST1BfREFUQSwKKyAgICBDQU1fSU5URl9NRVRBX1BSRVBfU05BUFNIT1RfRE9ORSwgLyogNjAgKi8KKyAgICBDQU1fSU5URl9NRVRBX0dPT0RfRlJBTUVfSURYX1JBTkdFLAorICAgIENBTV9JTlRGX01FVEFfQVNEX0hEUl9TQ0VORV9EQVRBLAorICAgIENBTV9JTlRGX01FVEFfQVNEX1NDRU5FX0lORk8sCisgICAgQ0FNX0lOVEZfTUVUQV9DVVJSRU5UX1NDRU5FLAorICAgIENBTV9JTlRGX01FVEFfQUVDX0lORk8sCisgICAgQ0FNX0lOVEZfTUVUQV9TRU5TT1JfSU5GTywKKyAgICBDQU1fSU5URl9NRVRBX0NIUk9NQVRJWF9MSVRFX0lTUCwKKyAgICBDQU1fSU5URl9NRVRBX0NIUk9NQVRJWF9MSVRFX1BQLAorICAgIENBTV9JTlRGX01FVEFfQ0hST01BVElYX0xJVEVfQUUsCisgICAgQ0FNX0lOVEZfTUVUQV9DSFJPTUFUSVhfTElURV9BV0IsIC8qIDcwICovCisgICAgQ0FNX0lOVEZfTUVUQV9DSFJPTUFUSVhfTElURV9BRiwKKyAgICBDQU1fSU5URl9NRVRBX0NIUk9NQVRJWF9MSVRFX0FTRCwKKyAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQUUsCisgICAgQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX0FXQiwKKyAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfQUYsCisgICAgQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX0FTRCwKKyAgICBDQU1fSU5URl9NRVRBX0VYSUZfREVCVUdfU1RBVFMsCisgICAgQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX0JFU1RBVFMsCisgICAgQ0FNX0lOVEZfTUVUQV9FWElGX0RFQlVHX0JISVNULAorICAgIENBTV9JTlRGX01FVEFfRVhJRl9ERUJVR18zQV9UVU5JTkcsCisgICAgQ0FNX0lOVEZfUEFSTV9HRVRfQ0hST01BVElYLAorICAgIENBTV9JTlRGX1BBUk1fU0VUX1JFTE9BRF9DSFJPTUFUSVgsCisgICAgQ0FNX0lOVEZfUEFSTV9TRVRfQVVUT0ZPQ1VTVFVOSU5HLCAvKiA4MCAqLworICAgIENBTV9JTlRGX1BBUk1fR0VUX0FGVFVORSwKKyAgICBDQU1fSU5URl9QQVJNX1NFVF9SRUxPQURfQUZUVU5FLAorICAgIENBTV9JTlRGX1BBUk1fU0VUX1ZGRV9DT01NQU5ELAorICAgIENBTV9JTlRGX1BBUk1fU0VUX1BQX0NPTU1BTkQsCisgICAgQ0FNX0lOVEZfUEFSTV9USU5UTEVTUywKKyAgICBDQU1fSU5URl9QQVJNX0xPTkdTSE9UX0VOQUJMRSwKKyAgICBDQU1fSU5URl9QQVJNX1JESV9NT0RFLAorICAgIENBTV9JTlRGX1BBUk1fQ0RTX01PREUsCisgICAgQ0FNX0lOVEZfUEFSTV9UT05FX01BUF9NT0RFLAorICAgIENBTV9JTlRGX1BBUk1fQ0FQVFVSRV9GUkFNRV9DT05GSUcsIC8qIDkwICovCisgICAgQ0FNX0lOVEZfUEFSTV9EVUFMX0xFRF9DQUxJQlJBVElPTiwKKyAgICBDQU1fSU5URl9QQVJNX0FEVl9DQVBUVVJFX01PREUsCisKKyAgICAvKiBzdHJlYW0gYmFzZWQgcGFyYW1ldGVycyAqLworICAgIENBTV9JTlRGX1BBUk1fRE9fUkVQUk9DRVNTLAorICAgIENBTV9JTlRGX1BBUk1fU0VUX0JVTkRMRSwKKyAgICBDQU1fSU5URl9QQVJNX1NUUkVBTV9GTElQLAorICAgIENBTV9JTlRGX1BBUk1fR0VUX09VVFBVVF9DUk9QLAorCisgICAgQ0FNX0lOVEZfUEFSTV9FWlRVTkVfQ01ELAorICAgIENBTV9JTlRGX1BBUk1fSU5UX0VWVCwKKworICAgIC8qIHNwZWNpZmljIHRvIEhBTDMgKi8KKyAgICAvKiBXaGV0aGVyIHRoZSBtZXRhZGF0YSBtYXBzIHRvIGEgdmFsaWQgZnJhbWUgbnVtYmVyICovCisgICAgQ0FNX0lOVEZfTUVUQV9GUkFNRV9OVU1CRVJfVkFMSUQsCisgICAgLyogV2hldGhlciB0aGUgdXJnZW50IG1ldGFkYXRhIG1hcHMgdG8gYSB2YWxpZCBmcmFtZSBudW1iZXIgKi8KKyAgICBDQU1fSU5URl9NRVRBX1VSR0VOVF9GUkFNRV9OVU1CRVJfVkFMSUQsCisgICAgLyogV2hldGhlciB0aGUgc3RyZWFtIGJ1ZmZlciBjb3JyZXNwb25kaW5nIHRoaXMgZnJhbWUgaXMgZHJvcHBlZCBvciBub3QgKi8KKyAgICBDQU1fSU5URl9NRVRBX0ZSQU1FX0RST1BQRUQsIC8qIDEwMCAqLworICAgIC8qIENPTE9SIENPUlJFQ1RJT04uKi8KKyAgICBDQU1fSU5URl9NRVRBX0NPTE9SX0NPUlJFQ1RfTU9ERSwKKyAgICAvKiBBIHRyYW5zZm9ybSBtYXRyaXggdG8gY2hyb21hdGljYWxseSBhZGFwdCBwaXhlbHMgaW4gdGhlIENJRSBYWVogKDE5MzEpCisgICAgICogY29sb3Igc3BhY2UgZnJvbSB0aGUgc2NlbmUgaWxsdW1pbmFudCB0byB0aGUgc1JHQi1zdGFuZGFyZCBENjUtaWxsdW1pbmFudC4gKi8KKyAgICBDQU1fSU5URl9NRVRBX0NPTE9SX0NPUlJFQ1RfVFJBTlNGT1JNLAorICAgIC8qQ29sb3IgY2hhbm5lbCBnYWlucyBpbiB0aGUgQmF5ZXIgcmF3IGRvbWFpbiBpbiB0aGUgb3JkZXIgW1JHZUdvQl0qLworICAgIENBTV9JTlRGX01FVEFfQ09MT1JfQ09SUkVDVF9HQUlOUywKKyAgICAvKlRoZSBiZXN0IGZpdCBjb2xvciB0cmFuc2Zvcm0gbWF0cml4IGNhbGN1bGF0ZWQgYnkgdGhlIHN0YXRzKi8KKyAgICBDQU1fSU5URl9NRVRBX1BSRURfQ09MT1JfQ09SUkVDVF9UUkFOU0ZPUk0sCisgICAgLypUaGUgYmVzdCBmaXQgY29sb3IgY2hhbm5lbHMgZ2FpbnMgY2FsY3VsYXRlZCBieSB0aGUgc3RhdHMqLworICAgIENBTV9JTlRGX01FVEFfUFJFRF9DT0xPUl9DT1JSRUNUX0dBSU5TLAorICAgIC8qIENPTlRST0wgKi8KKyAgICAvKiBBIGZyYW1lIGNvdW50ZXIgc2V0IGJ5IHRoZSBmcmFtZXdvcmsuIE11c3QgYmUgbWFpbnRhaW5lZCB1bmNoYW5nZWQgaW4KKyAgICAgKiBvdXRwdXQgZnJhbWUuICovCisgICAgQ0FNX0lOVEZfTUVUQV9GUkFNRV9OVU1CRVIsCisgICAgLyogQSBmcmFtZSBjb3VudGVyIHNldCBieSB0aGUgZnJhbWV3b3JrLiBNdXN0IGJlIG1haW50YWluZWQgdW5jaGFuZ2VkIGluCisgICAgICogb3V0cHV0IGZyYW1lLiAqLworICAgIENBTV9JTlRGX01FVEFfVVJHRU5UX0ZSQU1FX05VTUJFUiwKKyAgICAvKk51bWJlciBvZiBzdHJlYW1zIGFuZCBzaXplIG9mIHN0cmVhbXMgaW4gY3VycmVudCBjb25maWd1cmF0aW9uKi8KKyAgICBDQU1fSU5URl9NRVRBX1NUUkVBTV9JTkZPLAorICAgIC8qIExpc3Qgb2YgYXJlYXMgdG8gdXNlIGZvciBtZXRlcmluZyAqLworICAgIENBTV9JTlRGX01FVEFfQUVDX1JPSSwKKyAgICAvKiBXaGV0aGVyIHRoZSBIQUwgbXVzdCB0cmlnZ2VyIHByZWNhcHR1cmUgbWV0ZXJpbmcuKi8KKyAgICBDQU1fSU5URl9NRVRBX0FFQ19QUkVDQVBUVVJFX1RSSUdHRVIsIC8qIDExMCAqLworICAgIC8qIFRoZSBJRCBzZW50IHdpdGggdGhlIGxhdGVzdCBDQU1FUkEyX1RSSUdHRVJfUFJFQ0FQVFVSRV9NRVRFUklORyBjYWxsICovCisgICAgLyogQ3VycmVudCBzdGF0ZSBvZiBBRSBhbGdvcml0aG0gKi8KKyAgICBDQU1fSU5URl9NRVRBX0FFQ19TVEFURSwKKyAgICAvKiBMaXN0IG9mIGFyZWFzIHRvIHVzZSBmb3IgZm9jdXMgZXN0aW1hdGlvbiAqLworICAgIENBTV9JTlRGX01FVEFfQUZfUk9JLAorICAgIC8qIFdoZXRoZXIgdGhlIEhBTCBtdXN0IHRyaWdnZXIgYXV0b2ZvY3VzLiAqLworICAgIENBTV9JTlRGX01FVEFfQUZfVFJJR0dFUiwKKyAgICAvKiBDdXJyZW50IHN0YXRlIG9mIEFGIGFsZ29yaXRobSAqLworICAgIENBTV9JTlRGX01FVEFfQUZfU1RBVEUsCisgICAgLyogTGlzdCBvZiBhcmVhcyB0byB1c2UgZm9yIGlsbHVtaW5hbnQgZXN0aW1hdGlvbiAqLworICAgIENBTV9JTlRGX01FVEFfQVdCX1JFR0lPTlMsCisgICAgLyogQ3VycmVudCBzdGF0ZSBvZiBBV0IgYWxnb3JpdGhtICovCisgICAgQ0FNX0lOVEZfTUVUQV9BV0JfU1RBVEUsCisgICAgLypXaGV0aGVyIGJsYWNrIGxldmVsIGNvbXBlbnNhdGlvbiBpcyBmcm96ZW4gb3IgZnJlZSB0byB2YXJ5Ki8KKyAgICBDQU1fSU5URl9NRVRBX0JMQUNLX0xFVkVMX0xPQ0ssCisgICAgLyogSW5mb3JtYXRpb24gdG8gM0Egcm91dGluZXMgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBjYXB0dXJlLCB0byBoZWxwCisgICAgICogZGVjaWRlIG9wdGltYWwgM0Egc3RyYXRlZ3kgKi8KKyAgICBDQU1fSU5URl9NRVRBX0NBUFRVUkVfSU5URU5ULAorICAgIC8qIERFTU9TQUlDICovCisgICAgLyogQ29udHJvbHMgdGhlIHF1YWxpdHkgb2YgdGhlIGRlbW9zYWljaW5nIHByb2Nlc3NpbmcgKi8KKyAgICBDQU1fSU5URl9NRVRBX0RFTU9TQUlDLAorICAgIC8qIEVER0UgKi8KKyAgICAvKiBPcGVyYXRpb24gbW9kZSBmb3IgZWRnZSBlbmhhbmNlbWVudCAqLworICAgIENBTV9JTlRGX01FVEFfRURHRV9NT0RFLCAvKiAxMjAgKi8KKyAgICAvKiBDb250cm9sIHRoZSBhbW91bnQgb2YgZWRnZSBlbmhhbmNlbWVudCBhcHBsaWVkIHRvIHRoZSBpbWFnZXMuKi8KKyAgICAvKiAxLTEwOyAxMCBpcyBtYXhpbXVtIHNoYXJwZW5pbmcgKi8KKyAgICBDQU1fSU5URl9NRVRBX1NIQVJQTkVTU19TVFJFTkdUSCwKKyAgICAvKiBGTEFTSCAqLworICAgIC8qIFBvd2VyIGZvciBmbGFzaCBmaXJpbmcvdG9yY2gsIDEwIGlzIG1heCBwb3dlcjsgMCBpcyBubyBmbGFzaC4gTGluZWFyICovCisgICAgQ0FNX0lOVEZfTUVUQV9GTEFTSF9QT1dFUiwKKyAgICAvKiBGaXJpbmcgdGltZSBvZiBmbGFzaCByZWxhdGl2ZSB0byBzdGFydCBvZiBleHBvc3VyZSwgaW4gbmFub3NlY29uZHMqLworICAgIENBTV9JTlRGX01FVEFfRkxBU0hfRklSSU5HX1RJTUUsCisgICAgLyogQ3VycmVudCBzdGF0ZSBvZiB0aGUgZmxhc2ggdW5pdCAqLworICAgIENBTV9JTlRGX01FVEFfRkxBU0hfU1RBVEUsCisgICAgLyogR0VPTUVUUklDICovCisgICAgLyogT3BlcmF0aW5nIG1vZGUgb2YgZ2VvbWV0cmljIGNvcnJlY3Rpb24gKi8KKyAgICBDQU1fSU5URl9NRVRBX0dFT01FVFJJQ19NT0RFLAorICAgIC8qIENvbnRyb2wgdGhlIGFtb3VudCBvZiBzaGFkaW5nIGNvcnJlY3Rpb24gYXBwbGllZCB0byB0aGUgaW1hZ2VzICovCisgICAgQ0FNX0lOVEZfTUVUQV9HRU9NRVRSSUNfU1RSRU5HVEgsCisgICAgLyogSE9UIFBJWEVMICovCisgICAgLyogU2V0IG9wZXJhdGlvbmFsIG1vZGUgZm9yIGhvdCBwaXhlbCBjb3JyZWN0aW9uICovCisgICAgQ0FNX0lOVEZfTUVUQV9IT1RQSVhFTF9NT0RFLAorICAgIC8qIExFTlMgKi8KKyAgICAvKiBTaXplIG9mIHRoZSBsZW5zIGFwZXJ0dXJlICovCisgICAgQ0FNX0lOVEZfTUVUQV9MRU5TX0FQRVJUVVJFLAorICAgIC8qIFN0YXRlIG9mIGxlbnMgbmV1dHJhbCBkZW5zaXR5IGZpbHRlcihzKSAqLworICAgIENBTV9JTlRGX01FVEFfTEVOU19GSUxURVJERU5TSVRZLAorICAgIC8qIExlbnMgb3B0aWNhbCB6b29tIHNldHRpbmcgKi8KKyAgICBDQU1fSU5URl9NRVRBX0xFTlNfRk9DQUxfTEVOR1RILCAvKiAxMzAgKi8KKyAgICAvKiBEaXN0YW5jZSB0byBwbGFuZSBvZiBzaGFycGVzdCBmb2N1cywgbWVhc3VyZWQgZnJvbSBmcm9udG1vc3Qgc3VyZmFjZQorICAgICAqIG9mIHRoZSBsZW5zICovCisgICAgQ0FNX0lOVEZfTUVUQV9MRU5TX0ZPQ1VTX0RJU1RBTkNFLAorICAgIC8qIFRoZSByYW5nZSBvZiBzY2VuZSBkaXN0YW5jZXMgdGhhdCBhcmUgaW4gc2hhcnAgZm9jdXMgKGRlcHRoIG9mIGZpZWxkKSAqLworICAgIENBTV9JTlRGX01FVEFfTEVOU19GT0NVU19SQU5HRSwKKyAgICAvKldoZXRoZXIgdGhlIGhhbCBuZWVkcyB0byBvdXRwdXQgdGhlIGxlbnMgc2hhZGluZyBtYXAqLworICAgIENBTV9JTlRGX01FVEFfTEVOU19TSEFESU5HX01BUF9NT0RFLAorICAgIC8qIEN1cnJlbnQgbGVucyBzdGF0dXMgKi8KKyAgICBDQU1fSU5URl9NRVRBX0xFTlNfU1RBVEUsCisgICAgLyogTk9JU0UgUkVEVUNUSU9OICovCisgICAgLyogTW9kZSBvZiBvcGVyYXRpb24gZm9yIHRoZSBub2lzZSByZWR1Y3Rpb24gYWxnb3JpdGhtICovCisgICAgQ0FNX0lOVEZfTUVUQV9OT0lTRV9SRURVQ1RJT05fTU9ERSwKKyAgIC8qIENvbnRyb2wgdGhlIGFtb3VudCBvZiBub2lzZSByZWR1Y3Rpb24gYXBwbGllZCB0byB0aGUgaW1hZ2VzLgorICAgICogMS0xMDsgMTAgaXMgbWF4IG5vaXNlIHJlZHVjdGlvbiAqLworICAgIENBTV9JTlRGX01FVEFfTk9JU0VfUkVEVUNUSU9OX1NUUkVOR1RILAorICAgIC8qIFNDQUxFUiAqLworICAgIC8qIFRvcC1sZWZ0IGNvcm5lciBhbmQgd2lkdGggb2YgdGhlIG91dHB1dCByZWdpb24gdG8gc2VsZWN0IGZyb20gdGhlIGFjdGl2ZQorICAgICAqIHBpeGVsIGFycmF5ICovCisgICAgQ0FNX0lOVEZfTUVUQV9TQ0FMRVJfQ1JPUF9SRUdJT04sCisgICAgLyogVGhlIGVzdGltYXRlZCBzY2VuZSBpbGx1bWluYXRpb24gbGlnaHRpbmcgZnJlcXVlbmN5ICovCisgICAgQ0FNX0lOVEZfTUVUQV9TQ0VORV9GTElDS0VSLAorICAgIC8qIFNFTlNPUiAqLworICAgIC8qIER1cmF0aW9uIGVhY2ggcGl4ZWwgaXMgZXhwb3NlZCB0byBsaWdodCwgaW4gbmFub3NlY29uZHMgKi8KKyAgICBDQU1fSU5URl9NRVRBX1NFTlNPUl9FWFBPU1VSRV9USU1FLAorICAgIC8qIER1cmF0aW9uIGZyb20gc3RhcnQgb2YgZnJhbWUgZXhwb3N1cmUgdG8gc3RhcnQgb2YgbmV4dCBmcmFtZSBleHBvc3VyZSwKKyAgICAgKiBpbiBuYW5vc2Vjb25kcyAqLworICAgIENBTV9JTlRGX01FVEFfU0VOU09SX0ZSQU1FX0RVUkFUSU9OLCAvKiAxNDAgKi8KKyAgICAvKiBHYWluIGFwcGxpZWQgdG8gaW1hZ2UgZGF0YS4gTXVzdCBiZSBpbXBsZW1lbnRlZCB0aHJvdWdoIGFuYWxvZyBnYWluIG9ubHkKKyAgICAgKiBpZiBzZXQgdG8gdmFsdWVzIGJlbG93ICdtYXhpbXVtIGFuYWxvZyBzZW5zaXRpdml0eScuICovCisgICAgQ0FNX0lOVEZfTUVUQV9TRU5TT1JfU0VOU0lUSVZJVFksCisgICAgLyogVGltZSBhdCBzdGFydCBvZiBleHBvc3VyZSBvZiBmaXJzdCByb3cgKi8KKyAgICBDQU1fSU5URl9NRVRBX1NFTlNPUl9USU1FU1RBTVAsCisgICAgLyogRHVyYXRpb24gYi93IHN0YXJ0IG9mIGZpcnN0IHJvdyBleHBvc3VyZSBhbmQgdGhlIHN0YXJ0IG9mIGxhc3QKKyAgICAgICByb3cgZXhwb3N1cmUgaW4gbmFub3NlY29uZHMgKi8KKyAgICBDQU1fSU5URl9NRVRBX1NFTlNPUl9ST0xMSU5HX1NIVVRURVJfU0tFVywKKyAgICAvKiBTSEFESU5HICovCisgICAgLyogUXVhbGl0eSBvZiBsZW5zIHNoYWRpbmcgY29ycmVjdGlvbiBhcHBsaWVkIHRvIHRoZSBpbWFnZSBkYXRhICovCisgICAgQ0FNX0lOVEZfTUVUQV9TSEFESU5HX01PREUsCisgICAgLyogQ29udHJvbCB0aGUgYW1vdW50IG9mIHNoYWRpbmcgY29ycmVjdGlvbiBhcHBsaWVkIHRvIHRoZSBpbWFnZXMuCisgICAgICogdW5pdGxlc3M6IDEtMTA7IDEwIGlzIGZ1bGwgc2hhZGluZyBjb21wZW5zYXRpb24gKi8KKyAgICBDQU1fSU5URl9NRVRBX1NIQURJTkdfU1RSRU5HVEgsCisgICAgLyogU1RBVElTVElDUyAqLworICAgIC8qIFN0YXRlIG9mIHRoZSBmYWNlIGRldGVjdG9yIHVuaXQgKi8KKyAgICBDQU1fSU5URl9NRVRBX1NUQVRTX0ZBQ0VERVRFQ1RfTU9ERSwKKyAgICAvKiBPcGVyYXRpbmcgbW9kZSBmb3IgaGlzdG9ncmFtIGdlbmVyYXRpb24gKi8KKyAgICBDQU1fSU5URl9NRVRBX1NUQVRTX0hJU1RPR1JBTV9NT0RFLAorICAgIC8qIE9wZXJhdGluZyBtb2RlIGZvciBzaGFycG5lc3MgbWFwIGdlbmVyYXRpb24gKi8KKyAgICBDQU1fSU5URl9NRVRBX1NUQVRTX1NIQVJQTkVTU19NQVBfTU9ERSwKKyAgICAvKiBBIDMtY2hhbm5lbCBzaGFycG5lc3MgbWFwLCBiYXNlZCBvbiB0aGUgcmF3IHNlbnNvciBkYXRhLAorICAgICAqIElmIG9ubHkgYSBtb25vY2hyb21lIHNoYXJwbmVzcyBtYXAgaXMgc3VwcG9ydGVkLCBhbGwgY2hhbm5lbHMKKyAgICAgKiBzaG91bGQgaGF2ZSB0aGUgc2FtZSBkYXRhCisgICAgICovCisgICAgQ0FNX0lOVEZfTUVUQV9TVEFUU19TSEFSUE5FU1NfTUFQLAorCisgICAgLyogVE9ORU1BUCAqLworICAgIC8qIFRvbmUgbWFwIG1vZGUgKi8KKyAgICBDQU1fSU5URl9NRVRBX1RPTkVNQVBfTU9ERSwgLyogMTUwICovCisgICAgLyogVGFibGUgbWFwcGluZyBSR0IgaW5wdXQgdmFsdWVzIHRvIG91dHB1dCB2YWx1ZXMgKi8KKyAgICBDQU1fSU5URl9NRVRBX1RPTkVNQVBfQ1VSVkVTLAorCisgICAgQ0FNX0lOVEZfTUVUQV9GTEFTSF9NT0RFLAorICAgIC8qIDJEIGFycmF5IG9mIGdhaW4gZmFjdG9ycyBmb3IgZWFjaCBjb2xvciBjaGFubmVsIHRoYXQgd2FzIHVzZWQgdG8KKyAgICAgKiBjb21wZW5zYXRlIGZvciBsZW5zIHNoYWRpbmcgZm9yIHRoaXMgZnJhbWUgKi8KKyAgICBDQU1fSU5URl9NRVRBX0xFTlNfU0hBRElOR19NQVAsCisgICAgQ0FNX0lOVEZfTUVUQV9QUklWQVRFX0RBVEEsCisgICAgQ0FNX0lOVEZfUEFSTV9TVEFUU19ERUJVR19NQVNLLAorICAgIENBTV9JTlRGX1BBUk1fU1RBVFNfQUZfUEFBRiwKKyAgICAvKiBJbmRpY2F0ZXMgc3RyZWFtcyBJRCBvZiBhbGwgdGhlIHJlcXVlc3RlZCBidWZmZXJzICovCisgICAgQ0FNX0lOVEZfTUVUQV9TVFJFQU1fSUQsCisgICAgQ0FNX0lOVEZfUEFSTV9GT0NVU19CUkFDS0VUSU5HLAorICAgIENBTV9JTlRGX1BBUk1fRkxBU0hfQlJBQ0tFVElORywKKyAgICBDQU1fSU5URl9QQVJNX0dFVF9JTUdfUFJPUCwgLyogMTYwICovCisgICAgQ0FNX0lOVEZfTUVUQV9KUEVHX0dQU19DT09SRElOQVRFUywKKyAgICBDQU1fSU5URl9NRVRBX0pQRUdfR1BTX1BST0NfTUVUSE9EUywKKyAgICBDQU1fSU5URl9NRVRBX0pQRUdfR1BTX1RJTUVTVEFNUCwKKyAgICBDQU1fSU5URl9NRVRBX0pQRUdfT1JJRU5UQVRJT04sCisgICAgQ0FNX0lOVEZfTUVUQV9KUEVHX1FVQUxJVFksCisgICAgQ0FNX0lOVEZfTUVUQV9KUEVHX1RIVU1CX1FVQUxJVFksCisgICAgQ0FNX0lOVEZfTUVUQV9KUEVHX1RIVU1CX1NJWkUsCisKKyAgICBDQU1fSU5URl9NRVRBX1RFU1RfUEFUVEVSTl9EQVRBLAorICAgIC8qIERORyBmaWxlIHN1cHBvcnQgKi8KKyAgICBDQU1fSU5URl9NRVRBX1BST0ZJTEVfVE9ORV9DVVJWRSwKKyAgICBDQU1fSU5URl9NRVRBX05FVVRSQUxfQ09MX1BPSU5ULCAvKiAxNzAgKi8KKworICAgIC8qIENBQyAqLworICAgIENBTV9JTlRGX01FVEFfQ0FDX0lORk8sCisgICAgQ0FNX0lOVEZfUEFSTV9DQUMsCisgICAgQ0FNX0lOVEZfTUVUQV9JTUdfSFlTVF9JTkZPLAorCisgICAgLyogdHJpZ2dlciBmb3IgYWxsIG1vZHVsZXMgdG8gcmVhZCB0aGUgZGVidWcvbG9nIGxldmVsIHByb3BlcnRpZXMgKi8KKyAgICBDQU1fSU5URl9QQVJNX1VQREFURV9ERUJVR19MRVZFTCwKKworICAgIC8qIE9UUCA6IFdCIGdyL2diICovCisgICAgQ0FNX0lOVEZfTUVUQV9PVFBfV0JfR1JHQiwKKyAgICAvKiBMRUQgb3ZlcnJpZGUgZm9yIEVaVFVORSAqLworICAgIENBTV9JTlRGX01FVEFfTEVEX01PREVfT1ZFUlJJREUsCisgICAgLyogYXV0byBsZW5zIHBvc2l0aW9uIGluZm8gKi8KKyAgICBDQU1fSU5URl9NRVRBX0ZPQ1VTX1BPU0lUSU9OLAorICAgIC8qIE1hbnVhbCBleHBvc3VyZSB0aW1lICovCisgICAgQ0FNX0lOVEZfUEFSTV9FWFBPU1VSRV9USU1FLAorICAgIC8qIEFXQiBtZXRhIGRhdGEgaW5mbyAqLworICAgIENBTV9JTlRGX01FVEFfQVdCX0lORk8sCisgICAgLyogTWFudWFsIGxlbnMgcG9zaXRpb24gaW5mbyAqLworICAgIENBTV9JTlRGX1BBUk1fTUFOVUFMX0ZPQ1VTX1BPUywgLyogMTgwICovCisgICAgLyogTWFudWFsIFdoaXRlIGJhbGFuY2UgZ2FpbnMgKi8KKyAgICBDQU1fSU5URl9QQVJNX1dCX01BTlVBTCwKKyAgICAvKiBPZmZsaW5lIERhdGEgT3ZlcndyaXRlICovCisgICAgQ0FNX0lOVEZfUEFSTV9IV19EQVRBX09WRVJXUklURSwKKyAgICAvKiBJTUcgTElCIHJlcHJvY2VzcyBkZWJ1ZyBzZWN0aW9uICovCisgICAgQ0FNX0lOVEZfTUVUQV9JTUdMSUIsIC8qIGNhbV9pbnRmX21ldGFfaW1nbGliX3QgKi8KKyAgICAvKiBPRU0gc3BlY2lmaWMgcGFyYW1ldGVycyAqLworICAgIENBTV9JTlRGX1BBUk1fQ1VTVE9NLAorICAgIC8qIHBhcmFtZXRlcnMgYWRkZWQgZm9yIHJlbGF0ZWQgY2FtZXJhcyAqLworICAgIC8qIGZldGNoIGNhbGlicmF0aW9uIGluZm8gZm9yIHJlbGF0ZWQgY2FtIHN1YnN5c3RlbSAqLworICAgIENBTV9JTlRGX1BBUk1fUkVMQVRFRF9TRU5TT1JTX0NBTElCUkFUSU9OLAorICAgIC8qIGZvY2FsIGxlbmd0aCByYXRpbyBpbmZvICovCisgICAgQ0FNX0lOVEZfTUVUQV9BRl9GT0NBTF9MRU5HVEhfUkFUSU8sCisgICAgLyogY3JvcCBmb3IgYmlubmluZyAmIEZPViBhZGp1c3QgKi8KKyAgICBDQU1fSU5URl9NRVRBX1NOQVBfQ1JPUF9JTkZPX1NFTlNPUiwKKyAgICAvKiBjcm9wIGZvciB0cmltbWluZyBlZGdlIHBpeGVscyAqLworICAgIENBTV9JTlRGX01FVEFfU05BUF9DUk9QX0lORk9fQ0FNSUYsCisgICAgLyogY3JvcCBmb3IgRk9WIGFkanVzdCBhbmQgem9vbSAqLworICAgIENBTV9JTlRGX01FVEFfU05BUF9DUk9QX0lORk9fSVNQLAorICAgIC8qIGNyb3AgZm9yIGltYWdlLXN0YWJpbGl6YXRpb24gYW5kIHpvb20gKi8KKyAgICBDQU1fSU5URl9NRVRBX1NOQVBfQ1JPUF9JTkZPX0NQUCwgLyogMTkwICovCisgICAgLyogcGFyYW1ldGVyIGZvciBlbmFibGluZyBEQ1JGICovCisgICAgQ0FNX0lOVEZfUEFSTV9EQ1JGLAorICAgIC8qIG1ldGFkYXRhIHRhZyBmb3IgRENSRiBpbmZvICovCisgICAgQ0FNX0lOVEZfTUVUQV9EQ1JGLAorICAgIC8qIEZMSVAgbW9kZSBwYXJhbWV0ZXIqLworICAgIENBTV9JTlRGX1BBUk1fRkxJUCwKKyAgICAvKkZyYW1lIGRpdmVydCBpbmZvIGZyb20gSVNQKi8KKyAgICBDQU1fSU5URl9CVUZfRElWRVJUX0lORk8sCisgICAgLyogVXNlIEFWIHRpbWVyICovCisgICAgQ0FNX0lOVEZfTUVUQV9VU0VfQVZfVElNRVIsCisgICAgQ0FNX0lOVEZfTUVUQV9FRkZFQ1RJVkVfRVhQT1NVUkVfRkFDVE9SLAorICAgIC8qIFNwZWNpYWwgZXZlbnQgdG8gcmVxdWVzdCBzdHJlYW0gZnJhbWVzKi8KKyAgICBDQU1fSU5URl9QQVJNX1JFUVVFU1RfRlJBTUVTLAorICAgIC8qIFNwZWNpYWwgZXZlbnQgdG8gcmVxdWVzdCBvcGVyYXRpb25hbCBtb2RlKi8KKyAgICBDQU1fSU5URl9QQVJNX1JFUVVFU1RfT1BTX01PREUsCisgICAgLypCbGFjayBsZXZlbCBwYXJhbWV0ZXJzKi8KKyAgICBDQU1fSU5URl9NRVRBX0xEQUZfRVhJRiwKKyAgICBDQU1fSU5URl9NRVRBX0JMQUNLX0xFVkVMX1NPVVJDRV9QQVRURVJOLAorICAgIENBTV9JTlRGX01FVEFfQkxBQ0tfTEVWRUxfQVBQTElFRF9QQVRURVJOLCAvKiAyMDAgKi8KKyAgICBDQU1fSU5URl9NRVRBX0NEU19EQVRBLAorICAgIC8qM0EgbG93IGxpZ2h0IGxldmVsIGluZm9ybWF0aW9uKi8KKyAgICBDQU1fSU5URl9NRVRBX0xPV19MSUdIVCwKKyAgICAvKiBkeW5hbWljIGZlYXR1cmUgZGV0ZWN0aW9uICovCisgICAgQ0FNX0lOVEZfTUVUQV9JTUdfRFlOX0ZFQVQsIC8qIDIwMCAqLworICAgIC8qUGFyYW1ldGVyIGVudHJ5IHRvIGNvbW11bmljYXRlIG1hbnVhbAorICAgIGNhcHR1cmUgdHlwZSovCisgICAgQ0FNX0lOVEZfUEFSTV9NQU5VQUxfQ0FQVFVSRV9UWVBFLAorICAgIC8qQUYgc3RhdGUgY2hhbmdlIGRldGVjdGVkIGJ5IEFGIG1vZHVsZSovCisgICAgQ0FNX0lOVEZfQUZfU1RBVEVfVFJBTlNJVElPTiwKKyAgICAvKiBmYWNlIHJlY29nbml0aW9uICovCisgICAgQ0FNX0lOVEZfTUVUQV9GQUNFX1JFQ09HLAorICAgIC8qIGZhY2UgYmxpbmsgZGV0ZWN0aW9uICovCisgICAgQ0FNX0lOVEZfTUVUQV9GQUNFX0JMSU5LLAorICAgIC8qIGZhY2UgZ2F6ZSBkZXRlY3Rpb24gKi8KKyAgICBDQU1fSU5URl9NRVRBX0ZBQ0VfR0FaRSwKKyAgICAvKiBmYWNlIHNtaWxlIGRldGVjdGlvbiAqLworICAgIENBTV9JTlRGX01FVEFfRkFDRV9TTUlMRSwKKyAgICAvKiBmYWNlIGxhbmRtYXJrIGRldGVjdGlvbiAqLworICAgIENBTV9JTlRGX01FVEFfRkFDRV9MQU5ETUFSSywgLyogMjEwICovCisgICAgLyogZmFjZSBjb250b3VyIGRldGVjdGlvbiAqLworICAgIENBTV9JTlRGX01FVEFfRkFDRV9DT05UT1VSLAorICAgIC8qIFdoZXRoZXIgRUlTIGlzIGVuYWJsZWQgKi8KKyAgICBDQU1fSU5URl9NRVRBX1ZJREVPX1NUQUJfTU9ERSwKKyAgICAvKiBUb3VjaCBleHBvc3VyZSBjb21wZW5zYXRpb24gKEVWKSBzdGF0dXMgKi8KKyAgICBDQU1fSU5URl9NRVRBX1RPVUNIX0FFX1JFU1VMVCwKKyAgICAvKiBQYXJhbSBmb3IgdXBkYXRpbmcgaW5pdGlhbCBleHBvc3VyZSBpbmRleCB2YWx1ZSovCisgICAgQ0FNX0lOVEZfUEFSTV9JTklUSUFMX0VYUE9TVVJFX0lOREVYLAorICAgIC8qIEdhaW4gYXBwbGllZCBwb3N0IHJhdyBjYXB0cnVlLgorICAgICAgIElTUCBkaWdpdGFsIGdhaW4gKi8KKyAgICBDQU1fSU5URl9NRVRBX0lTUF9TRU5TSVRJVklUWSwKKyAgICAvKiBQYXJhbSBmb3IgZW5hYmxpbmcgaW5zdGFudCBhZWMqLworICAgIENBTV9JTlRGX1BBUk1fSU5TVEFOVF9BRUMsCisgICAgLyogUGFyYW0gZm9yIHRyYWNraW5nIHByZXZpb3VzIHJlcHJvY2Vzc2luZyBhY3Rpdml0eSAqLworICAgIENBTV9JTlRGX01FVEFfUkVQUk9DRVNTX0ZMQUdTLAorICAgIC8qIFBhcmFtIG9mIGNyb3BwaW5nIGluZm9ybWF0aW9uIGZvciBKUEVHIGVuY29kZXIgKi8KKyAgICBDQU1fSU5URl9QQVJNX0pQRUdfRU5DT0RFX0NST1AsCisgICAgLyogUGFyYW0gb2Ygc2NhbGluZyBpbmZvcm1hdGlvbiBmb3IgSlBFRyBlbmNvZGVyICovCisgICAgQ0FNX0lOVEZfUEFSTV9KUEVHX1NDQUxFX0RJTUVOU0lPTiwKKyAgICAvKlBhcmFtIGZvciB1cGRhdGluZyBRdWFkcmEgQ0ZBIG1vZGUgKi8KKyAgICBDQU1fSU5URl9QQVJNX1FVQURSQV9DRkEsCisgICAgLyogTWV0YSBSYXcgRGltICovCisgICAgQ0FNX0lOVEZfTUVUQV9SQVcsCisgICAgLyogTnVtYmVyIG9mIHN0cmVhbXMgYW5kIHNpemUgb2Ygc3RyZWFtcyBpbgorICAgICAgIGN1cnJlbnQgY29uZmlndXJhdGlvbiBmb3IgcGljIHJlcyovCisgICAgQ0FNX0lOVEZfTUVUQV9TVFJFQU1fSU5GT19GT1JfUElDX1JFUywKKyAgICBDQU1fSU5URl9NRVRBX0ZPQ1VTX0RFUFRIX0lORk8sCisgICAgLyogT3BlcmF0aW9uIE1vZGUgZm9yIElSICovCisgICAgQ0FNX0lOVEZfTUVUQV9JUl9NT0RFLAorICAgIC8qIEFFQyxBV0IgU3BlZWQgY29udHJvbCBlbmFibGVkICovCisgICAgQ0FNX0lOVEZfTUVUQV9BRUNfQ09OVkVSR0VOQ0VfU1BFRUQsCisgICAgQ0FNX0lOVEZfTUVUQV9BV0JfQ09OVkVSR0VOQ0VfU1BFRUQsCisgICAgLypGb2N1cyB2YWx1ZSBvdXRwdXQgZnJvbSBhZiBjb3JlKi8KKyAgICBDQU1fSU5URl9NRVRBX0ZPQ1VTX1ZBTFVFLAorICAgIC8qU3BvdCBsaWdodCBkZXRlY3Rpb24gcmVzdWx0IG91dHB1dCBmcm9tIGFmIGNvcmUqLworICAgIENBTV9JTlRGX01FVEFfU1BPVF9MSUdIVF9ERVRFQ1QsCisgICAgQ0FNX0lOVEZfUEFSTV9NQVgKK30gY2FtX2ludGZfcGFybV90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBmb3JjZWQ7CisgICAgdW5pb24geworICAgICAgdWludDMyX3QgZm9yY2VfbGluZWNvdW50X3ZhbHVlOworICAgICAgZmxvYXQgICAgZm9yY2VfZ2Fpbl92YWx1ZTsKKyAgICAgIGZsb2F0ICAgIGZvcmNlX3NuYXBfZXhwX3ZhbHVlOworICAgICAgZmxvYXQgICAgZm9yY2VfZXhwX3ZhbHVlOworICAgICAgdWludDMyX3QgZm9yY2Vfc25hcF9saW5lY291bnRfdmFsdWU7CisgICAgICBmbG9hdCAgICBmb3JjZV9zbmFwX2dhaW5fdmFsdWU7CisgICAgfSB1OworfSBjYW1fZXpfZm9yY2VfcGFyYW1zX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBmbG9hdCBjYW1fYmxhY2tfbGV2ZWxbNF07Cit9IGNhbV9ibGFja19sZXZlbF9tZXRhZGF0YV90OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9FWlRVTkVfQ01EX1NUQVRVUywKKyAgICBDQU1fRVpUVU5FX0NNRF9BRUNfRU5BQkxFLAorICAgIENBTV9FWlRVTkVfQ01EX0FXQl9FTkFCTEUsCisgICAgQ0FNX0VaVFVORV9DTURfQUZfRU5BQkxFLAorICAgIENBTV9FWlRVTkVfQ01EX0FFQ19GT1JDRV9MSU5FQ09VTlQsCisgICAgQ0FNX0VaVFVORV9DTURfQUVDX0ZPUkNFX0dBSU4sCisgICAgQ0FNX0VaVFVORV9DTURfQUVDX0ZPUkNFX0VYUCwKKyAgICBDQU1fRVpUVU5FX0NNRF9BRUNfRk9SQ0VfU05BUF9MQywKKyAgICBDQU1fRVpUVU5FX0NNRF9BRUNfRk9SQ0VfU05BUF9HQUlOLAorICAgIENBTV9FWlRVTkVfQ01EX0FFQ19GT1JDRV9TTkFQX0VYUCwKKyAgICBDQU1fRVpUVU5FX0NNRF9BV0JfTU9ERSwKKyAgICBDQU1fRVpUVU5FX0NNRF9BV0JfRk9SQ0VfRFVBTF9MRURfSURYLAorfSBjYW1fZXp0dW5lX2NtZF90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2FtX2V6dHVuZV9jbWRfdHlwZV90ICAgY21kOworICB1bmlvbiB7CisgICAgaW50MzJfdCBydW5uaW5nOworICAgIGludDMyX3QgYWVjX2VuYWJsZTsKKyAgICBpbnQzMl90IGF3Yl9lbmFibGU7CisgICAgaW50MzJfdCBhZl9lbmFibGU7CisgICAgY2FtX2V6X2ZvcmNlX3BhcmFtc190IGV6X2ZvcmNlX3BhcmFtOworICAgIGludDMyX3QgYXdiX21vZGU7CisgICAgaW50MzJfdCBlel9mb3JjZV9kdWFsX2xlZF9pZHg7CisgIH0gdTsKK30gY2FtX2V6dHVuZV9jbWRfZGF0YV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgIENvZGUgZm9yIEhBTDMgZGF0YSB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0lOVEZfTUVUQURBVEFfTUFYCit9IGNhbV9pbnRmX21ldGFkYXRhX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fSU5URU5UX0NVU1RPTSwKKyAgICBDQU1fSU5URU5UX1BSRVZJRVcsCisgICAgQ0FNX0lOVEVOVF9TVElMTF9DQVBUVVJFLAorICAgIENBTV9JTlRFTlRfVklERU9fUkVDT1JELAorICAgIENBTV9JTlRFTlRfVklERU9fU05BUFNIT1QsCisgICAgQ0FNX0lOVEVOVF9aRVJPX1NIVVRURVJfTEFHLAorICAgIENBTV9JTlRFTlRfTUFYLAorfSBjYW1faW50ZW50X3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgLyogRnVsbCBhcHBsaWNhdGlvbiBjb250cm9sIG9mIHBpcGVsaW5lLiBBbGwgM0Egcm91dGluZXMgYXJlIGRpc2FibGVkLAorICAgICAqIG5vIG90aGVyIHNldHRpbmdzIGluIGFuZHJvaWQuY29udHJvbC4qIGhhdmUgYW55IGVmZmVjdCAqLworICAgIENBTV9DT05UUk9MX09GRiwKKyAgICAvKiBVc2Ugc2V0dGluZ3MgZm9yIGVhY2ggaW5kaXZpZHVhbCAzQSByb3V0aW5lLiBNYW51YWwgY29udHJvbCBvZiBjYXB0dXJlCisgICAgICogcGFyYW1ldGVycyBpcyBkaXNhYmxlZC4gQWxsIGNvbnRyb2xzIGluIGFuZHJvaWQuY29udHJvbC4qIGJlc2lkZXMgc2NlbmVNb2RlCisgICAgICogdGFrZSBlZmZlY3QgKi8KKyAgICBDQU1fQ09OVFJPTF9BVVRPLAorICAgIC8qIFVzZSBzcGVjaWZpYyBzY2VuZSBtb2RlLiBFbmFibGluZyB0aGlzIGRpc2FibGVzIGNvbnRyb2wuYWVNb2RlLAorICAgICAqIGNvbnRyb2wuYXdiTW9kZSBhbmQgY29udHJvbC5hZk1vZGUgY29udHJvbHM7IHRoZSBIQUwgbXVzdCBpZ25vcmUgdGhvc2UKKyAgICAgKiBzZXR0aW5ncyB3aGlsZSBVU0VfU0NFTkVfTU9ERSBpcyBhY3RpdmUgKGV4Y2VwdCBmb3IgRkFDRV9QUklPUklUWSBzY2VuZSBtb2RlKS4KKyAgICAgKiBPdGhlciBjb250cm9sIGVudHJpZXMgYXJlIHN0aWxsIGFjdGl2ZS4gVGhpcyBzZXR0aW5nIGNhbiBvbmx5IGJlIHVzZWQgaWYKKyAgICAgKiBhdmFpbGFibGVTY2VuZU1vZGVzICE9IFVOU1VQUE9SVEVELiBUT0RPOiBTaG91bGQgd2UgcmVtb3ZlIHRoaXMgYW5kIGhhbmRsZSB0aGlzCisgICAgICogaW4gSEFMID8qLworICAgIENBTV9DT05UUk9MX1VTRV9TQ0VORV9NT0RFLAorICAgIENBTV9DT05UUk9MX01BWAorfSBjYW1fY29udHJvbF9tb2RlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgLyogVXNlIHRoZSBhbmRyb2lkLmNvbG9yQ29ycmVjdGlvbi50cmFuc2Zvcm0gbWF0cml4IHRvIGRvIGNvbG9yIGNvbnZlcnNpb24gKi8KKyAgICBDQU1fQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk1fTUFUUklYLAorICAgIC8qIE11c3Qgbm90IHNsb3cgZG93biBmcmFtZSByYXRlIHJlbGF0aXZlIHRvIHJhdyBiYXllciBvdXRwdXQgKi8KKyAgICBDQU1fQ09MT1JfQ09SUkVDVElPTl9GQVNULAorICAgIC8qIEZyYW1lIHJhdGUgbWF5IGJlIHJlZHVjZWQgYnkgaGlnaCBxdWFsaXR5ICovCisgICAgQ0FNX0NPTE9SX0NPUlJFQ1RJT05fSElHSF9RVUFMSVRZLAorfSBjYW1fY29sb3JfY29ycmVjdF9tb2RlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9PRkYsCisgICAgQ0FNX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9GQVNULAorICAgIENBTV9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fSElHSF9RVUFMSVRZLAorICAgIENBTV9DT0xPUl9DT1JSRUNUSU9OX0FCRVJSQVRJT05fTUFYCit9IGNhbV9hYmVycmF0aW9uX21vZGVfdDsKKworI2RlZmluZSBDQ19NQVRSSVhfUk9XUyAzCisjZGVmaW5lIENDX01BVFJJWF9DT0xTIDMKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIDN4MyBmbG9hdCBtYXRyaXggaW4gcm93LW1ham9yIG9yZGVyLiBlYWNoIGVsZW1lbnQgaXMgaW4gcmFuZ2Ugb2YgKDAsIDEpICovCisgICAgY2FtX3JhdGlvbmFsX3R5cGVfdCB0cmFuc2Zvcm1fbWF0cml4W0NDX01BVFJJWF9ST1dTXVtDQ19NQVRSSVhfQ09MU107Cit9IGNhbV9jb2xvcl9jb3JyZWN0X21hdHJpeF90OworCisjZGVmaW5lIENBTV9GT0NBTF9MRU5HVEhTX01BWCAgICAgMQorI2RlZmluZSBDQU1fQVBFUlRVUkVTX01BWCAgICAgICAgIDEKKyNkZWZpbmUgQ0FNX0ZJTFRFUl9ERU5TSVRJRVNfTUFYICAxCisjZGVmaW5lIENBTV9NQVhfTUFQX0hFSUdIVCAgICAgICAgNgorI2RlZmluZSBDQU1fTUFYX01BUF9XSURUSCAgICAgICAgIDYKKyNkZWZpbmUgQ0FNX01BWF9TSEFESU5HX01BUF9XSURUSCAxNworI2RlZmluZSBDQU1fTUFYX1NIQURJTkdfTUFQX0hFSUdIVCAxMworI2RlZmluZSBDQU1fTUFYX1RPTkVNQVBfQ1VSVkVfU0laRSAgICA1MTIKKyNkZWZpbmUgQ0FNX01BWF9GTEFTSF9CUkFDS0VUSU5HICAgIDUKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIEEgMUQgYXJyYXkgb2YgcGFpcnMgb2YgZmxvYXRzLgorICAgICAqIE1hcHBpbmcgYSAwLTEgaW5wdXQgcmFuZ2UgdG8gYSAwLTEgb3V0cHV0IHJhbmdlLgorICAgICAqIFRoZSBpbnB1dCByYW5nZSBtdXN0IGJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB3aXRoIE4sCisgICAgICogYW5kIHZhbHVlcyBiZXR3ZWVuIGVudHJpZXMgc2hvdWxkIGJlIGxpbmVhcmx5IGludGVycG9sYXRlZC4KKyAgICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIGFycmF5IGlzOiBbMC4wLCAwLjAsIDAuMywgMC41LCAxLjAsIDEuMF0sCisgICAgICogdGhlbiB0aGUgaW5wdXQtPm91dHB1dCBtYXBwaW5nIGZvciBhIGZldyBzYW1wbGUgcG9pbnRzIHdvdWxkIGJlOgorICAgICAqIDAgLT4gMCwgMC4xNSAtPiAwLjI1LCAwLjMgLT4gMC41LCAwLjUgLT4gMC42NCAqLworICAgIGZsb2F0IHRvbmVtYXBfcG9pbnRzW0NBTV9NQVhfVE9ORU1BUF9DVVJWRV9TSVpFXVsyXTsKK30gY2FtX3RvbmVtYXBfY3VydmVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgc2l6ZV90IHRvbmVtYXBfcG9pbnRzX2NudDsKKyAgIGNhbV90b25lbWFwX2N1cnZlX3QgY3VydmVzWzNdOworfSBjYW1fcmdiX3RvbmVtYXBfY3VydmVzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICBzaXplX3QgdG9uZW1hcF9wb2ludHNfY250OworICAgY2FtX3RvbmVtYXBfY3VydmVfdCBjdXJ2ZTsKK30gY2FtX3Byb2ZpbGVfdG9uZV9jdXJ2ZTsKKworI2RlZmluZSBORVVUUkFMX0NPTF9QT0lOVFMgMworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtX3JhdGlvbmFsX3R5cGVfdCBuZXV0cmFsX2NvbF9wb2ludFtORVVUUkFMX0NPTF9QT0lOVFNdOworfSBjYW1fbmV1dHJhbF9jb2xfcG9pbnRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBPRkYsCisgICAgRkFTVCwKKyAgICBRVUFMSVRZLAorfSBjYW1fcXVhbGl0eV9wcmVmZXJlbmNlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0ZMQVNIX0NUUkxfT0ZGLAorICAgIENBTV9GTEFTSF9DVFJMX1NJTkdMRSwKKyAgICBDQU1fRkxBU0hfQ1RSTF9UT1JDSAorfSBjYW1fZmxhc2hfY3RybF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBhZV9tb2RlOworICAgIHVpbnQ4X3QgYXdiX21vZGU7CisgICAgdWludDhfdCBhZl9tb2RlOworfSBjYW1fc2NlbmVfbW9kZV9vdmVycmlkZXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgbGVmdDsKKyAgICBpbnQzMl90IHRvcDsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworfSBjYW1fY3JvcF9yZWdpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIEVzdGltYXRlZCBzaGFycG5lc3MgZm9yIGVhY2ggcmVnaW9uIG9mIHRoZSBpbnB1dCBpbWFnZS4KKyAgICAgKiBOb3JtYWxpemVkIHRvIGJlIGJldHdlZW4gMCBhbmQgbWF4U2hhcnBuZXNzTWFwVmFsdWUuCisgICAgICogSGlnaGVyIHZhbHVlcyBtZWFuIHNoYXJwZXIgKGJldHRlciBmb2N1c2VkKSAqLworICAgIGludDMyX3Qgc2hhcnBuZXNzW0NBTV9NQVhfTUFQX1dJRFRIXVtDQU1fTUFYX01BUF9IRUlHSFRdOworfSBjYW1fc2hhcnBuZXNzX21hcF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICBmbG9hdCBsZW5zX3NoYWRpbmdbNCpDQU1fTUFYX1NIQURJTkdfTUFQX0hFSUdIVCpDQU1fTUFYX1NIQURJTkdfTUFQX1dJRFRIXTsKK30gY2FtX2xlbnNfc2hhZGluZ19tYXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgbWluX3ZhbHVlOworICAgIGludDMyX3QgbWF4X3ZhbHVlOworICAgIGludDMyX3QgZGVmX3ZhbHVlOworICAgIGludDMyX3Qgc3RlcDsKK30gY2FtX2NvbnRyb2xfcmFuZ2VfdDsKKworI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX05PTkUgICAgICAgICAgICAoY2FtX2ZlYXR1cmVfbWFza190KTBVTAorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0ZBQ0VfREVURUNUSU9OICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MCkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9ERU5PSVNFMkQgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDEpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfQ1JPUCAgICAgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwyKQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX1JPVEFUSU9OICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MykKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9GTElQICAgICAgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDQpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfSERSICAgICAgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDw1KQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX1JFR0lTVEVSX0ZBQ0UgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8NikKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9TSEFSUE5FU1MgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDcpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfVklERU9fSERSICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDw4KQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0NBQyAgICAgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8OSkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9TQ0FMRSAgICAgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDEwKQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0VGRkVDVCAgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MTEpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfVUJJRk9DVVMgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwxMikKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9DSFJPTUFfRkxBU0ggICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDEzKQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX09QVElaT09NICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MTQpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfU0VOU09SX0hEUiAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwxNSkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9SRUZPQ1VTICAgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDE2KQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0NQUF9UTlIgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MTcpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfUkFXX1BST0NFU1NJTkcgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwxOCkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9UUlVFUE9SVFJBSVQgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDE5KQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0xMVkQgICAgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MjApCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfRElTMjAgICAgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwyMSkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9TVElMTE1PUkUgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDIyKQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0RDUkYgICAgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MjMpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfQ0RTICAgICAgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwyNCkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9FWlRVTkUgICAgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDI1KQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX0RTRE4gICAgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MjYpIC8vU3BlY2lhbCBDRFMgaW4gQ1BQIGJsb2NrCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfU1cyRCAgICAgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwyNykKKyNkZWZpbmUgQ0FNX09FTV9GRUFUVVJFXzEgICAgICAgICAgICAgICAoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUw8PDI4KQorI2RlZmluZSBDQU1fT0VNX0ZFQVRVUkVfMiAgICAgICAgICAgICAgICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MjkpCisjZGVmaW5lIENBTV9RVElfRkVBVFVSRV9TV19UTlIgICAgICAgICAgKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMPDwzMCkKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9NRVRBREFUQV9QUk9DRVNTSU5HICgoY2FtX2ZlYXR1cmVfbWFza190KTFVTDw8MzEpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfUEFBRiAgICAgICAgICAgKCgoY2FtX2ZlYXR1cmVfbWFza190KTFVTCk8PDMyKQorI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX1FVQURSQV9DRkEgICAgICgoKGNhbV9mZWF0dXJlX21hc2tfdCkxVUwpPDwzMykKKyNkZWZpbmUgQ0FNX1FUSV9GRUFUVVJFX1BQRUlTQ09SRSAgICAgICAoKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMKTw8MzQpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfWklHWkFHX1ZJREVPX0hEUiAoKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMKTw8MzUpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfU1RBR0dFUkVEX1ZJREVPX0hEUiAoKChjYW1fZmVhdHVyZV9tYXNrX3QpMVVMKTw8MzYpCisjZGVmaW5lIENBTV9RQ09NX0ZFQVRVUkVfUFBfU1VQRVJTRVQgICAgKENBTV9RQ09NX0ZFQVRVUkVfREVOT0lTRTJEfENBTV9RQ09NX0ZFQVRVUkVfQ1JPUHxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfUk9UQVRJT058Q0FNX1FDT01fRkVBVFVSRV9TSEFSUE5FU1N8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX1NDQUxFfENBTV9RQ09NX0ZFQVRVUkVfQ0FDfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9FWlRVTkV8Q0FNX1FDT01fRkVBVFVSRV9DUFBfVE5SfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9MTFZEfENBTV9RQ09NX0ZFQVRVUkVfUVVBRFJBX0NGQSkKKworI2RlZmluZSBDQU1fUUNPTV9GRUFUVVJFX1BQX1BBU1NfMSAgICAgIENBTV9RQ09NX0ZFQVRVUkVfUFBfU1VQRVJTRVQKKyNkZWZpbmUgQ0FNX1FDT01fRkVBVFVSRV9QUF9QQVNTXzIgICAgICBDQU1fUUNPTV9GRUFUVVJFX1NDQUxFIHwgQ0FNX1FDT01fRkVBVFVSRV9DUk9QOworCisvLyBDb3VudGVyIGNsb2NrIHdpc2UKK3R5cGVkZWYgZW51bSB7CisgICAgUk9UQVRFXzAgPSAxPDwwLAorICAgIFJPVEFURV85MCA9IDE8PDEsCisgICAgUk9UQVRFXzE4MCA9IDE8PDIsCisgICAgUk9UQVRFXzI3MCA9IDE8PDMsCit9IGNhbV9yb3RhdGlvbl90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICBjYW1fcm90YXRpb25fdCByb3RhdGlvbjsgICAgICAgICAvKiBqcGVnIHJvdGF0aW9uICovCisgICBjYW1fcm90YXRpb25fdCBkZXZpY2Vfcm90YXRpb247ICAvKiBkZXZpY2Ugcm90YXRpb24gKi8KKyAgIHVpbnQzMl90IHN0cmVhbUlkOworfSBjYW1fcm90YXRpb25faW5mb190OworCit0eXBlZGVmIGVudW0geworICAgIEZMSVBfTk9ORSA9IDAsIC8qIDAwYiAqLworICAgIEZMSVBfSCA9IDEsICAgIC8qIDAxYiAqLworICAgIEZMSVBfViA9IDIsICAgIC8qIDEwYiAqLworICAgIEZMSVBfVl9IID0gMywgIC8qIDExYiAqLworfSBjYW1fZmxpcF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgYnVuZGxlX2lkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBidW5kbGUgaWQgKi8KKyAgICB1aW50OF90IG51bV9vZl9zdHJlYW1zOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdHJlYW1zIGluIHRoZSBidW5kbGUgKi8KKyAgICB1aW50MzJfdCBzdHJlYW1faWRzW01BWF9TVFJFQU1fTlVNX0lOX0JVTkRMRV07IC8qIGFycmF5IG9mIHN0cmVhbSBpZHMgdG8gYmUgYnVuZGxlZCAqLworfSBjYW1fYnVuZGxlX2NvbmZpZ190OworCit0eXBlZGVmIGVudW0geworICAgIENBTV9PTkxJTkVfUkVQUk9DRVNTX1RZUEUsICAgIC8qIG9ubGluZSByZXByb2Nlc3MsIGZyYW1lcyBmcm9tIHJ1bm5pbmcgc3RyZWFtcyAqLworICAgIENBTV9PRkZMSU5FX1JFUFJPQ0VTU19UWVBFLCAgIC8qIG9mZmxpbmUgcmVwcm9jZXNzLCBmcmFtZXMgZnJvbSBleHRlcm5hbCBzb3VyY2UgKi8KK30gY2FtX3JlcHJvY2Vzc190eXBlX2VudW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgYnVyc3RfY291bnQ7CisgICAgdWludDhfdCBtaW5fYnVyc3RfY291bnQ7CisgICAgdWludDhfdCBtYXhfYnVyc3RfY291bnQ7Cit9IGNhbV9zdGlsbF9tb3JlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IGJ1cnN0X2NvdW50OworICAgIHVpbnQ4X3Qgb3V0cHV0X2NvdW50OworICAgIHVpbnQ4X3QgZmxhc2hfYnJhY2tldGluZ1tDQU1fTUFYX0ZMQVNIX0JSQUNLRVRJTkddOworICAgIHVpbnQ4X3QgbWV0YWRhdGFfaW5kZXg7Cit9IGNhbV9jaHJvbWFfZmxhc2hfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fSERSX01PREVfU0lOR0xFRlJBTUUsICAgIC8qIFNpbmdsZSBmcmFtZSBIRFIgbW9kZSB3aGljaCBkb2VzIG9ubHkgdG9uZSBtYXBwaW5nICovCisgICAgQ0FNX0hEUl9NT0RFX01VTFRJRlJBTUUsICAgICAvKiBNdWx0aSBmcmFtZSBIRFIgbW9kZSB3aGljaCBuZWVkcyB0d28gZnJhbWVzIHdpdGggMC41eCBhbmQgMnggZXhwb3N1cmUgcmVzcGVjdGl2ZWx5ICovCit9IGNhbV9oZHJfbW9kZV9lbnVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBoZHJfZW5hYmxlOworICAgIHVpbnQzMl90IGhkcl9uZWVkXzF4OyAvKiB3aGVuIENBTV9RQ09NX0ZFQVRVUkVfSERSIGVuYWJsZWQsIGluZGljYXRlIGlmIDF4IGlzIG5lZWRlZCBmb3Igb3V0cHV0ICovCisgICAgY2FtX2hkcl9tb2RlX2VudW1fdCBoZHJfbW9kZTsKK30gY2FtX2hkcl9wYXJhbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MzJfdCBvdXRwdXRfd2lkdGg7CisgICAgaW50MzJfdCBvdXRwdXRfaGVpZ2h0OworfSBjYW1fc2NhbGVfcGFyYW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgZW5hYmxlOworICAgIHVpbnQ4X3QgYnVyc3RfY291bnQ7CisgICAgdWludDhfdCBmb2N1c19zdGVwc1tNQVhfQUZfQlJBQ0tFVElOR19WQUxVRVNdOworICAgIHVpbnQ4X3Qgb3V0cHV0X2NvdW50OworICAgIHVpbnQzMl90IG1ldGFfbWF4X3NpemU7Cit9IGNhbV9hZl9icmFja2V0aW5nX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IGVuYWJsZTsKKyAgICB1aW50OF90IGJ1cnN0X2NvdW50OworfSBjYW1fZmxhc2hfYnJhY2tldGluZ190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBlbmFibGU7CisgICAgdWludDhfdCBidXJzdF9jb3VudDsKKyAgICB1aW50OF90IHpvb21fdGhyZXNob2xkOworfSBjYW1fb3B0aV96b29tX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaXplX3QgbWV0YV9tYXhfc2l6ZTsKK30gY2FtX3RydWVfcG9ydHJhaXRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fRkxBU0hfT0ZGLAorICAgIENBTV9GTEFTSF9PTgorfSBjYW1fZmxhc2hfdmFsdWVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9zZW5zb3JfdCBzZW5zX3R5cGU7CisgICAgY2FtX2Zvcm1hdF90IG5hdGl2ZV9mb3JtYXQ7Cit9IGNhbV9zZW5zb3JfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgcmVzdWx0OworICAgIHVpbnQzMl90IGhlYWRlcl9zaXplOworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICB1aW50OF90IGRhdGFbMF07Cit9IGNhbV9taXNjX2J1Zl90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgbWlzY19idWZmZXJfaW5kZXg7Cit9IGNhbV9taXNjX2J1Zl9wYXJhbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogcmVwcm9jZXNzIGZlYXR1cmUgbWFzayAqLworICAgIGNhbV9mZWF0dXJlX21hc2tfdCBmZWF0dXJlX21hc2s7CisKKyAgICAvKiBpbmRpdmlkdWFsIHNldHRpbmcgZm9yIGZlYXR1cmVzIHRvIGJlIHJlcHJvY2Vzc2VkICovCisgICAgY2FtX2Rlbm9pc2VfcGFyYW1fdCBkZW5vaXNlMmQ7CisgICAgY2FtX3JlY3RfdCBpbnB1dF9jcm9wOworICAgIGNhbV9yb3RhdGlvbl90IHJvdGF0aW9uOworICAgIHVpbnQzMl90IGZsaXA7CisgICAgaW50MzJfdCBzaGFycG5lc3M7CisgICAgaW50MzJfdCBlZmZlY3Q7CisgICAgY2FtX2hkcl9wYXJhbV90IGhkcl9wYXJhbTsKKyAgICBjYW1fc2NhbGVfcGFyYW1fdCBzY2FsZV9wYXJhbTsKKworICAgIHVpbnQ4X3Qgem9vbV9sZXZlbDsKKyAgICBjYW1fZmxhc2hfdmFsdWVfdCBmbGFzaF92YWx1ZTsKKyAgICBjYW1fbWlzY19idWZfcGFyYW1fdCBtaXNjX2J1Zl9wYXJhbTsKKyAgICB1aW50MzJfdCBidXJzdF9jbnQ7CisgICAgdWludDhfdCBjdXJfcmVwcm9jX2NvdW50OworICAgIHVpbnQ4X3QgdG90YWxfcmVwcm9jX2NvdW50OworfSBjYW1fcHBfZmVhdHVyZV9jb25maWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGlucHV0X3N0cmVhbV9pZDsKKyAgICAvKiBpbnB1dCBzb3VyY2Ugc3RyZWFtIHR5cGUgKi8KKyAgICBjYW1fc3RyZWFtX3R5cGVfdCBpbnB1dF9zdHJlYW1fdHlwZTsKK30gY2FtX3BwX29ubGluZV9zcmNfY29uZmlnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBpbWFnZSBmb3JtYXQgKi8KKyAgICBjYW1fZm9ybWF0X3QgaW5wdXRfZm10OworCisgICAgLyogaW1hZ2UgZGltZW5zaW9uICovCisgICAgY2FtX2RpbWVuc2lvbl90IGlucHV0X2RpbTsKKworICAgIC8qIGJ1ZmZlciBwbGFuZSBpbmZvcm1hdGlvbiwgd2lsbCBiZSBjYWxjIGJhc2VkIG9uIHN0cmVhbV90eXBlLCBmbXQsCisgICAgICAgZGltLCBhbmQgcGFkZGluZ19pbmZvKGZyb20gc3RyZWFtIGNvbmZpZykuIEluZm8gaW5jbHVkaW5nOgorICAgICAgIG9mZnNldF94LCBvZmZzZXRfeSwgc3RyaWRlLCBzY2FubGluZSwgcGxhbmUgb2Zmc2V0ICovCisgICAgY2FtX3N0cmVhbV9idWZfcGxhbmVfaW5mb190IGlucHV0X2J1Zl9wbGFuZXM7CisKKyAgICAvKiBudW1iZXIgb2YgaW5wdXQgcmVwcm9jZXNzIGJ1ZmZlcnMgKi8KKyAgICB1aW50OF90IG51bV9vZl9idWZzOworCisgICAgLyogaW5wdXQgc291cmNlIHR5cGUgKi8KKyAgICBjYW1fc3RyZWFtX3R5cGVfdCBpbnB1dF90eXBlOworCit9IGNhbV9wcF9vZmZsaW5lX3NyY19jb25maWdfdDsKKworLyogcmVwcm9jZXNzIHN0cmVhbSBpbnB1dCBjb25maWd1cmF0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogaW5wdXQgc291cmNlIGNvbmZpZyAqLworICAgIGNhbV9yZXByb2Nlc3NfdHlwZV9lbnVtX3QgcHBfdHlwZTsKKyAgICB1bmlvbiB7CisgICAgICAgIGNhbV9wcF9vbmxpbmVfc3JjX2NvbmZpZ190IG9ubGluZTsKKyAgICAgICAgY2FtX3BwX29mZmxpbmVfc3JjX2NvbmZpZ190IG9mZmxpbmU7CisgICAgfTsKKworICAgIC8qIHBwIGZlYXR1cmUgY29uZmlnICovCisgICAgY2FtX3BwX2ZlYXR1cmVfY29uZmlnX3QgcHBfZmVhdHVyZV9jb25maWc7Cit9IGNhbV9zdHJlYW1fcmVwcm9jX2NvbmZpZ190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBjcm9wX2VuYWJsZWQ7CisgICAgY2FtX3JlY3RfdCBpbnB1dF9jcm9wOworfSBjYW1fY3JvcF9wYXJhbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCB0cmlnZ2VyOworICAgIGludDMyX3QgdHJpZ2dlcl9pZDsKK30gY2FtX3RyaWdnZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9kZW5vaXNlX3BhcmFtX3QgZGVub2lzZTJkOworICAgIGNhbV9jcm9wX3BhcmFtX3QgY3JvcDsKKyAgICB1aW50MzJfdCBmbGlwOyAgICAgLyogMCBtZWFucyBubyBmbGlwICovCisgICAgdWludDMyX3QgdXZfdXBzYW1wbGU7IC8qIDAgbWVhbnMgbm8gY2hyb21hIHVwc2FtcGxpbmcgKi8KKyAgICBpbnQzMl90IHNoYXJwbmVzczsgLyogMCBtZWFucyBubyBzaGFycG5lc3MgKi8KKyAgICBpbnQzMl90IGVmZmVjdDsKKyAgICBjYW1fcm90YXRpb25fdCByb3RhdGlvbjsKKyAgICBjYW1fcm90YXRpb25fdCBkZXZpY2Vfcm90YXRpb247Cit9IGNhbV9wZXJfZnJhbWVfcHBfY29uZmlnX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX09QVF9TVEFCX09GRiwKKyAgICBDQU1fT1BUX1NUQUJfT04sCisgICAgQ0FNX09QVF9TVEFCX01BWAorfSBjYW1fb3B0aWNhbF9zdGFiX21vZGVzX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0ZJTFRFUl9BUlJBTkdFTUVOVF9SR0dCLAorICAgIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfR1JCRywKKyAgICBDQU1fRklMVEVSX0FSUkFOR0VNRU5UX0dCUkcsCisgICAgQ0FNX0ZJTFRFUl9BUlJBTkdFTUVOVF9CR0dSLAorCisgICAgLyogU2Vuc29yIGlzIG5vdCBCYXllcjsgb3V0cHV0IGhhcyAzIDE2LWJpdCB2YWx1ZXMgZm9yIGVhY2ggcGl4ZWwsCisgICAgICogaW5zdGVhZCBvZiBqdXN0IDEgMTYtYml0IHZhbHVlIHBlciBwaXhlbC4qLworICAgIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfUkdCLAorICAgIC8qIFNlbnNvciBpcyBZVVY7IFNXIGRvIG5vdCBoYXZlIGFjY2VzcyB0byBhY3R1YWwgUkFXLAorICAgICAqIG91dHB1dCBpcyBpbnRlcmxlYXZlZCBVWVZZICovCisgICAgQ0FNX0ZJTFRFUl9BUlJBTkdFTUVOVF9VWVZZLAorICAgIENBTV9GSUxURVJfQVJSQU5HRU1FTlRfWVVZViwKKyAgICBDQU1fRklMVEVSX0FSUkFOR0VNRU5UX1kKK30gY2FtX2NvbG9yX2ZpbHRlcl9hcnJhbmdlbWVudF90OworCit0eXBlZGVmIGVudW0geworICBDQU1fQUZfTEVOU19TVEFURV9TVEFUSU9OQVJZLAorICBDQU1fQUZfTEVOU19TVEFURV9NT1ZJTkcsCit9IGNhbV9hZl9sZW5zX3N0YXRlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0FXQl9TVEFURV9JTkFDVElWRSwKKyAgICBDQU1fQVdCX1NUQVRFX1NFQVJDSElORywKKyAgICBDQU1fQVdCX1NUQVRFX0NPTlZFUkdFRCwKKyAgICBDQU1fQVdCX1NUQVRFX0xPQ0tFRAorfSBjYW1fYXdiX3N0YXRlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX0ZPQ1VTX1VOQ0FMSUJSQVRFRCwKKyAgICBDQU1fRk9DVVNfQVBQUk9YSU1BVEUsCisgICAgQ0FNX0ZPQ1VTX0NBTElCUkFURUQKK30gY2FtX2ZvY3VzX2NhbGlicmF0aW9uX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX1RFU1RfUEFUVEVSTl9PRkYsCisgICAgQ0FNX1RFU1RfUEFUVEVSTl9TT0xJRF9DT0xPUiwKKyAgICBDQU1fVEVTVF9QQVRURVJOX0NPTE9SX0JBUlMsCisgICAgQ0FNX1RFU1RfUEFUVEVSTl9DT0xPUl9CQVJTX0ZBREVfVE9fR1JBWSwKKyAgICBDQU1fVEVTVF9QQVRURVJOX1BOOSwKKyAgICBDQU1fVEVTVF9QQVRURVJOX0NVU1RPTTEgPSAyNTYKK30gY2FtX3Rlc3RfcGF0dGVybl9tb2RlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1fdGVzdF9wYXR0ZXJuX21vZGVfdCBtb2RlOworICAgIGludDMyX3QgcjsKKyAgICBpbnQzMl90IGdyOworICAgIGludDMyX3QgZ2I7CisgICAgaW50MzJfdCBiOworfSBjYW1fdGVzdF9wYXR0ZXJuX2RhdGFfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fQVdCX0Q1MCwKKyAgICBDQU1fQVdCX0Q2NSwKKyAgICBDQU1fQVdCX0Q3NSwKKyAgICBDQU1fQVdCX0EsCisgICAgQ0FNX0FXQl9DVVNUT01fQSwKKyAgICBDQU1fQVdCX1dBUk1fRkxPLAorICAgIENBTV9BV0JfQ09MRF9GTE8sCisgICAgQ0FNX0FXQl9DVVNUT01fRkxPLAorICAgIENBTV9BV0JfTk9PTiwKKyAgICBDQU1fQVdCX0NVU1RPTV9EQVlMSUdIVCwKKyAgICBDQU1fQVdCX0lOVkFMSURfQUxMX0xJR0hULAorfSBjYW1faWxsdW1pbmF0X3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTEVHQUNZX1JBVywKKyAgICBNSVBJX1JBVywKK30gY2FtX29wYXF1ZV9yYXdfZm9ybWF0X3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX1BFUkZfTk9STUFMID0gMCwKKyAgICBDQU1fUEVSRl9ISUdILAorICAgIENBTV9QRVJGX0hJR0hfUEVSRk9STUFOQ0UsCit9IGNhbV9wZXJmX21vZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGZsb2F0IHJlYWxfZ2FpbjsKKyAgICBmbG9hdCBsdXhfaWR4OworICAgIGZsb2F0IGV4cF90aW1lOworfSBjYW1faW50Zl9hZWNfdDsKKworI2RlZmluZSBDQU1fSU5URl9BRUNfREFUQV9NQVggICAoMTApCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBmcmFtZV9jb3VudDsKKyAgICBjYW1faW50Zl9hZWNfdCBhZWNfZGF0YVtDQU1fSU5URl9BRUNfREFUQV9NQVhdOworfSBjYW1faW50Zl9tZXRhX2ltZ2xpYl9pbnB1dF9hZWNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbV9pbnRmX21ldGFfaW1nbGliX2lucHV0X2FlY190IG1ldGFfaW1nbGliX2lucHV0X2FlYzsKK30gY2FtX2ludGZfbWV0YV9pbWdsaWJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgcHJldmlld09ubHk7CisgICAgdWludDY0X3QgdmFsdWU7Cit9IGNhbV9pbnRmX3Bhcm1fbWFudWFsXzNhX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX01BTlVBTF9DQVBUVVJFX1RZUEVfT0ZGLCAvKk1hbnVhbCBjYXB0dXJlIG1vZGUgZGlzYWJsZWQqLworICAgIENBTV9NQU5VQUxfQ0FQVFVSRV9UWVBFXzEsICAgLypOb3JtYWwgWlNMIGNhcHR1cmUgd2l0aCBsaW1pdGVkIDNBIHNldHRpbmdzKi8KKyAgICBDQU1fTUFOVUFMX0NBUFRVUkVfVFlQRV8yLCAgIC8qTG93IGxpZ2h0IGNhcHR1cmUgbW9kZSAqLworICAgIENBTV9NQU5VQUxfQ0FQVFVSRV9UWVBFXzMsICAgLypPZmZsaW5lIFJBVyBwcm9jZXNzaW5nICovCisgICAgQ0FNX01BTlVBTF9DQVBUVVJFX1RZUEVfNCAgICAvKk9mZmxpbmUgUkFXIHByb2Nlc3Npbmcgd2l0aCBtdWx0aXBsZSBSQVcqLworfSBjYW1fbWFudWFsX2NhcHR1cmVfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fQU5BTFlTSVNfSU5GT19GRF9TVElMTCwgICAvKkFuYWx5c2lzIHJlcXVpcmVtZW50cyBmb3IgU1RJTEwgUFJFVklFVyovCisgICAgQ0FNX0FOQUxZU0lTX0lORk9fRkRfVklERU8sICAgLypBbmFseXNpcyByZXF1aXJlbWVudHMgZm9yIFZJREVPKi8KKyAgICBDQU1fQU5BTFlTSVNfSU5GT19QQUFGLCAgICAgICAvKkFuYWx5c2lzIHJlcXVpcmVtZW50cyBmb3IgUEFBRiovCisgICAgQ0FNX0FOQUxZU0lTX0lORk9fTUFYLCAgICAgLypNYXggbnVtYmVyKi8KK30gY2FtX2FuYWx5c2lzX2luZm9fdHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIFdoZXRoZXIgdGhlIGluZm9ybWF0aW9uIGhlcmUgaXMgdmFsaWQgb3Igbm90ICovCisgICAgdWludDhfdCB2YWxpZDsKKworICAgIC8qIFdoZXRoZXIgYW5hbHlzaXMgc3VwcG9ydGVkIGJ5IGh3ICovCisgICAgdWludDhfdCBod19hbmFseXNpc19zdXBwb3J0ZWQ7CisKKyAgICAvKiBBbmFseXNpcyBzdHJlYW0gbWF4IHN1cHBvcnRlZCBzaXplICovCisgICAgY2FtX2RpbWVuc2lvbl90IGFuYWx5c2lzX21heF9yZXM7CisKKyAgICAvKiBBbmFseXNpcyBzdHJlYW0gcGFkZGluZyBpbmZvICovCisgICAgY2FtX3BhZGRpbmdfaW5mb190IGFuYWx5c2lzX3BhZGRpbmdfaW5mbzsKKworICAgIC8qIEFuYWx5c2lzIGZvcm1hdCAqLworICAgIGNhbV9mb3JtYXRfdCBhbmFseXNpc19mb3JtYXQ7CisKKyAgICAvKiBBbmFseXNpcyByZWNvbW1lbmRlZCBzaXplICovCisgICAgY2FtX2RpbWVuc2lvbl90IGFuYWx5c2lzX3JlY29tbWVuZGVkX3JlczsKK30gY2FtX2FuYWx5c2lzX2luZm9fdDsKKworLyoqIG1tX2NhbWVyYV9ldmVudF90OiBzdHJ1Y3R1cmUgZm9yIGV2ZW50CisqICAgIEBzZXJ2ZXJfZXZlbnRfdHlwZSA6IGV2ZW50IHR5cGUgZnJvbSBzZXJlcgorKiAgICBAc3RhdHVzIDogc3RhdHVzIG9mIGFuIGV2ZW50LCB2YWx1ZSBjb3VsZCBiZQorKiAgICAgICAgICAgICAgQ0FNX1NUQVRVU19TVUNDRVNTCisqICAgICAgICAgICAgICBDQU1fU1RBVFVTX0ZBSUxFRAorKiovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtX2V2ZW50X3R5cGVfdCBzZXJ2ZXJfZXZlbnRfdHlwZTsKKyAgICB1aW50MzJfdCBzdGF0dXM7Cit9IGNhbV9ldmVudF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogSW5mb3JtYXRpb24gZm9yIERETSAqLworICAgIGNhbV9zdHJlYW1fY3JvcF9pbmZvX3QgICBzZW5zb3JfY3JvcF9pbmZvOyAvKiBzZW5zb3IgY3JvcCBpbmZvICovCisgICAgY2FtX3N0cmVhbV9jcm9wX2luZm9fdCAgIGNhbWlmX2Nyb3BfaW5mbzsgLyogQ0FNSUYgY3JvcCBpbmZvICovCisgICAgY2FtX3N0cmVhbV9jcm9wX2luZm9fdCAgIGlzcF9jcm9wX2luZm87IC8qIElTUCBjcm9wIGluZm8gKi8KKyAgICBjYW1fc3RyZWFtX2Nyb3BfaW5mb190ICAgY3BwX2Nyb3BfaW5mbzsgLyogQ1BQIGNyb3AgaW5mbyAqLworICAgIGNhbV9mb2NhbF9sZW5ndGhfcmF0aW9fdCBhZl9mb2NhbF9sZW5ndGhfcmF0aW87IC8qIEFGIGZvY2FsIGxlbmd0aCByYXRpbyAqLworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBwaXBlbGluZV9mbGlwOyAvKiBjdXJyZW50IHBpcGVsaW5lIGZsaXAgYW5kIHJvdGF0aW9uYWwgcGFyYW1ldGVycyAqLworICAgIGNhbV9yb3RhdGlvbl9pbmZvX3QgICAgICByb3RhdGlvbl9pbmZvOyAvKiByb3RhdGlvbiBpbmZvcm1hdGlvbiAqLworfSBjYW1fZGRtX2luZm9fdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIEVOVU0gZGVmaW5pdGlvbiBmb3IgY3VzdG9tIHBhcmFtZXRlciB0eXBlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworICAgIENBTV9DVVNUT01fUEFSTV9FWEFNUExFLAorICAgIENBTV9DVVNUT01fUEFSTV9NQVgsCit9IGNhbV9jdXN0b21fcGFybV90eXBlOworCisjZW5kaWYgLyogX19RQ0FNRVJBX1RZUEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9tbV9jYW1lcmFfaW50ZXJmYWNlLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svY29tbW9uL21tX2NhbWVyYV9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTI4M2ExCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9tbV9jYW1lcmFfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw5MTggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX01NX0NBTUVSQV9JTlRFUkZBQ0VfSF9fCisjZGVmaW5lIF9fTU1fQ0FNRVJBX0lOVEVSRkFDRV9IX18KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPG1lZGlhL21zbWJfY2FtZXJhLmg+CisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJjYW1faW50Zi5oIgorI2luY2x1ZGUgImNhbV9xdWV1ZS5oIgorCisjZGVmaW5lIE1NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlMgTVNNX01BWF9DQU1FUkFfU0VOU09SUworI2RlZmluZSBNTV9DQU1FUkFfTUFYX05VTV9GUkFNRVMgQ0FNX01BWF9OVU1fQlVGU19QRVJfU1RSRUFNCisvKiBudW0gb2YgY2hhbm5lbHMgYWxsb3dlZCBpbiBhIGNhbWVyYSBvYmogKi8KKyNkZWZpbmUgTU1fQ0FNRVJBX0NIQU5ORUxfTUFYIDE2CisKKyNkZWZpbmUgUEFEX1RPX1NJWkUoc2l6ZSwgcGFkZGluZykgXAorICAgICAgICAoKHNpemUgKyAodHlwZW9mKHNpemUpKShwYWRkaW5nIC0gMSkpICYgXAorICAgICAgICAodHlwZW9mKHNpemUpKSh+KHBhZGRpbmcgLSAxKSkpCisKKyNkZWZpbmUgQ0VJTF9ESVZJU0lPTihuLCBkKSAoKG4rZC0xKS9kKQorCisvKiogQ0FNX0RVTVBfVE9fRklMRToKKyAqICBAZmlsZW5hbWU6IGZpbGUgbmFtZQorICogIEBuYW1lOmZpbGVuYW1lCisgKiAgQGluZGV4OiBpbmRleCBvZiB0aGUgZmlsZQorICogIEBleHRuOiBmaWxlIGV4dGVuc2lvbgorICogIEBwX2FkZHI6IGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorICogIEBsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCisgKiAgZHVtcCB0aGUgaW1hZ2UgdG8gdGhlIGZpbGUKKyAqKi8KKyNkZWZpbmUgQ0FNX0RVTVBfVE9fRklMRShwYXRoLCBuYW1lLCBpbmRleCwgZXh0biwgcF9hZGRyLCBsZW4pICh7IFwKKyAgc2l6ZV90IHJjID0gMDsgXAorICBjaGFyIGZpbGVuYW1lW0ZJTEVOQU1FX01BWF07IFwKKyAgaWYgKGluZGV4ID49IDApIFwKKyAgICBzbnByaW50ZihmaWxlbmFtZSwgRklMRU5BTUVfTUFYLCAiJXMvJXMlZC4lcyIsIHBhdGgsIG5hbWUsIGluZGV4LCBleHRuKTsgXAorICBlbHNlIFwKKyAgICBzbnByaW50ZihmaWxlbmFtZSwgRklMRU5BTUVfTUFYLCAiJXMvJXMuJXMiLCBwYXRoLCBuYW1lLCBleHRuKTsgXAorICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCAidysiKTsgXAorICBpZiAoZnApIHsgXAorICAgIHJjID0gZndyaXRlKHBfYWRkciwgMSwgbGVuLCBmcCk7IFwKKyAgICBMT0dFKCJ3cml0dGVuIHNpemUgJWQiLCBsZW4pOyBcCisgICAgZmNsb3NlKGZwKTsgXAorICB9IGVsc2UgeyBcCisgICAgTE9HRSgib3BlbiAlcyBmYWlsZWQiLCBmaWxlbmFtZSk7IFwKKyAgfSBcCit9KQorCisvKiBEZWNsYXJpbmcgQnVmZmVyIHN0cnVjdHVyZSAqLworc3RydWN0IG1tX2NhbWVyYV9idWZfZGVmOworCisvKiogbW1fY2FtZXJhX3BsYW5lX2RlZl90IDogc3RydWN0dXJlIGZvciBmcmFtZSBwbGFuZSBpbmZvCisqICAgIEBudW1fcGxhbmVzIDogbnVtIG9mIHBsYW5lcyBmb3IgdGhlIGZyYW1lIGJ1ZmZlciwgdG8gYmUKKyogICAgICAgICAgICAgICBmaWxsZWQgZHVyaW5nIG1lbSBhbGxvY2F0aW9uCisqICAgIEBwbGFuZXMgOiBwbGFuZSBpbmZvIGZvciB0aGUgZnJhbWUgYnVmZmVyLCB0byBiZSBmaWxsZWQKKyogICAgICAgICAgICAgICBkdXJpbmcgbWVtIGFsbG9jYXRpb24KKyoqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDhfdCBudW1fcGxhbmVzOworICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lc1tWSURFT19NQVhfUExBTkVTXTsKK30gbW1fY2FtZXJhX3BsYW5lX2J1Zl9kZWZfdDsKKworLyoqIG1tX2NhbWVyYV91c2VyX2J1Zl9kZWZfdCA6IHN0cnVjdHVyZSBmb3IgZnJhbWUgcGxhbmUgaW5mbworKiAgICBAbnVtX2J1ZmZlcnMgOiBudW0gb2YgYnVmZmVycyBpbiB0aGlzIHVzZXIgZGVmaW5lZCBzdHJ1Y3R1cmUKKyogICAgQGJ1ZnNfdXNlZCA6IGFjdHVhbCBudW1iZXIgb2YgYnVmZmVyIGZpbGxlZAorKiAgICBAYnVmX2luX3VzZSA6IGZsYWcgdG8gbm90aWZ5IGJ1ZmZlciB1c2FnZSBzdGF0dXMuCisqICAgIEBwbGFuZV9idWYgOiBQbGFuZSBidWZmZXIgYXJyYXkgcG9pbnRlci4KKyoqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgbnVtX2J1ZmZlcnM7CisgICAgdWludDhfdCBidWZzX3VzZWQ7ICAgICAvKk51bSBvZiBCdWZmZXIgZmlsbGVkIGJ5IEtlcm5lbCovCisgICAgdWludDhfdCBidWZfaW5fdXNlOyAgLyogQ29udGFpbmVyIGJ1ZmZlciBpcyBmcmVlZCB0byBmaWxsKi8KKyAgICBpbnQzMl90IGJ1Zl9pZHhbTVNNX0NBTUVSQV9NQVhfVVNFUl9CVUZGX0NOVF07CisgICAgc3RydWN0IG1tX2NhbWVyYV9idWZfZGVmICpwbGFuZV9idWY7Cit9IG1tX2NhbWVyYV91c2VyX2J1Zl9kZWZfdDsKKworLyoqIG1tX2NhbWVyYV9idWZfZGVmX3Q6IHN0cnVjdHVyZSBmb3Igc3RyZWFtIGZyYW1lIGJ1ZgorKiAgICBAc3RyZWFtX2lkIDogc3RyZWFtIGhhbmRsZXIgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBzdHJlYW0KKyogICAgICAgICAgICAgICBvYmplY3QKKyogICAgQGJ1Zl9pZHggOiBpbmRleCBvZiB0aGUgYnVmIHdpdGhpbiB0aGUgc3RyZWFtIGJ1ZnMsIHRvIGJlCisqICAgICAgICAgICAgICAgZmlsbGVkIGR1cmluZyBtZW0gYWxsb2NhdGlvbgorKiAgICBAdGltZXNwZWNfdHMgOiB0aW1lIHN0YW1wLCB0byBiZSBmaWxsZWQgd2hlbiBEUUJVRiBpcworKiAgICAgICAgICAgICAgICAgY2FsbGVkCisqICAgIEBmcmFtZV9pZHggOiBmcmFtZSBzZXF1ZW5jZSBudW0sIHRvIGJlIGZpbGxlZCB3aGVuIERRQlVGCisqICAgIEBwbGFuZV9idWYgIDogRnJhbWUgcGxhbmUgZGVmaW5pdGlvbgorKiAgICBAZmQgOiBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGZyYW1lIGJ1ZmZlciwgdG8gYmUgZmlsbGVkCisqICAgICAgICBkdXJpbmcgbWVtIGFsbG9jYXRpb24KKyogICAgQGJ1ZmZlciA6IHBvaW50ZXIgdG8gdGhlIGZyYW1lIGJ1ZmZlciwgdG8gYmUgZmlsbGVkIGR1cmluZworKiAgICAgICAgICAgIG1lbSBhbGxvY2F0aW9uCisqICAgIEBmcmFtZV9sZW4gOiBsZW5ndGggb2YgdGhlIHdob2xlIGZyYW1lLCB0byBiZSBmaWxsZWQgZHVyaW5nCisqICAgICAgICAgICAgICAgbWVtIGFsbG9jYXRpb24KKyogICAgQG1lbV9pbmZvIDogdXNlciBzcGVjaWZpYyBwb2ludGVyIHRvIGFkZGl0aW9uYWwgbWVtIGluZm8KKyogICAgQGZsYWdzOiAgdjRsMl9idWZmZXIgZmxhZ3MsIHVzZWQgdG8gcmVwb3J0IGVycm9yIGluIGRhdGEgYnVmZmVycworKiovCit0eXBlZGVmIHN0cnVjdCBtbV9jYW1lcmFfYnVmX2RlZiB7CisgICAgdWludDMyX3Qgc3RyZWFtX2lkOworICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlOworICAgIGNhbV9zdHJlYW1fYnVmX3R5cGUgYnVmX3R5cGU7CisgICAgdWludDMyX3QgYnVmX2lkeDsKKyAgICB1aW50OF90IGlzX3V2X3N1YnNhbXBsZWQ7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIHVpbnQzMl90IGZyYW1lX2lkeDsKKyAgICB1bmlvbiB7CisgICAgICAgIG1tX2NhbWVyYV9wbGFuZV9idWZfZGVmX3QgcGxhbmVzX2J1ZjsKKyAgICAgICAgbW1fY2FtZXJhX3VzZXJfYnVmX2RlZl90IHVzZXJfYnVmOworICAgIH07CisgICAgaW50IGZkOworICAgIHZvaWQgKmJ1ZmZlcjsKKyAgICBzaXplX3QgZnJhbWVfbGVuOworICAgIHZvaWQgKm1lbV9pbmZvOworICAgIHVpbnQzMl90IGZsYWdzOworfSBtbV9jYW1lcmFfYnVmX2RlZl90OworCisvKiogbW1fY2FtZXJhX3N1cGVyX2J1Zl90OiBzdXBlciBidWYgc3RydWN0dXJlIGZvciBidW5kbGVkCisqICAgc3RyZWFtIGZyYW1lcworKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyYSBoYW5kbGVyIHRvIHVuaXF1ZWx5IGlkZW50aWZ5CisqICAgICAgICAgICAgICBhIGNhbWVyYSBvYmplY3QKKyogICAgQGNoX2lkIDogY2hhbm5lbCBoYW5kbGVyIHRvIHVuaXF1ZWx5IGlkZWVudGlmeSBhIGNoYW5uZWwKKyogICAgICAgICAgIG9iamVjdAorKiAgICBAbnVtX2J1ZnMgOiBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGUgc3VwZXIgYnVmLCBzaG91bGQgbm90CisqICAgICAgICAgICAgICBleGNlZWRzIE1BWF9TVFJFQU1fTlVNX0lOX0JVTkRMRQorKiAgICBAYnVmcyA6IGFycmF5IG9mIGJ1ZmZlcnMgaW4gdGhlIGJ1bmRsZQorKiovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgY2FtZXJhX2hhbmRsZTsKKyAgICB1aW50MzJfdCBjaF9pZDsKKyAgICB1aW50MzJfdCBudW1fYnVmczsKKyAgICB1aW50OF90IGJVbmxvY2tBRUM7CisgICAgdWludDhfdCBiUmVhZHlGb3JQcmVwYXJlU25hcHNob3Q7CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCogYnVmc1tNQVhfU1RSRUFNX05VTV9JTl9CVU5ETEVdOworfSBtbV9jYW1lcmFfc3VwZXJfYnVmX3Q7CisKKy8qKiBtbV9jYW1lcmFfcmVxX2J1Zl90eXBlX3QKKyogUmVxdWVzdCB0eXBlIGZvciBzdXBlciBidWYgZnJvbSBjaGFubmVsCisqKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTU1fQ0FNRVJBX1JFUV9TVVBFUl9CVUYsCisgICAgTU1fQ0FNRVJBX1JFUV9GUkFNRV9TWU5DX0JVRgorfSBtbV9jYW1lcmFfcmVxX2J1Zl90eXBlX3Q7CisKKy8qKiBtbV9jYW1lcmFfcmVxX2J1Zl90OiBBdHRyaWJ1dGVzIGZvciBzdXBlciBidWYgcmVxdWVzdAorKgorKiAgICBAdHlwZSA6IHR5cGUgb2Ygc3VwZXIgYnVmIHJlcXVlc3RlZAorKiAgICBAbnVtX2J1Zl9yZXF1ZXN0ZWQgOiBudW0gb2Ygc3VwZXIgYnVmcyByZXF1ZXN0ZWQKKyogICAgQG51bV9yZXRyb19idWZfcmVxdWVzdGVkIDogbnVtYmVyIG9mIHJldHJvIGJ1ZnMgcmVxdWVzdGVkCisqICAgIEBwcmltYXJ5X29ubHkgOiBzcGVjaWZpZXMgaWYgb25seSBwcmltYXJ5IGNhbWVyYSBmcmFtZSBmb3IgYSBkdWFsCisqICAgICBjYW1lcmEgaXMgcmVxdWVzdGVkCisqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBtbV9jYW1lcmFfcmVxX2J1Zl90eXBlX3QgdHlwZTsKKyAgICB1aW50MzJfdCBudW1fYnVmX3JlcXVlc3RlZDsKKyAgICB1aW50MzJfdCBudW1fcmV0cm9fYnVmX3JlcXVlc3RlZDsKKyAgICB1aW50OF90IHByaW1hcnlfb25seTsKK30gbW1fY2FtZXJhX3JlcV9idWZfdDsKKwordHlwZWRlZiBjYW1fZXZlbnRfdCBtbV9jYW1lcmFfZXZlbnRfdDsKKworLyoqIG1tX2NhbWVyYV9ldmVudF9ub3RpZnlfdDogZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3IgZXZlbnQKKyogICBub3RpZnkgaGFuZGxpbmcKKyogICAgQGNhbWVyYV9oYW5kbGUgOiBjYW1lcmEgaGFuZGxlcgorKiAgICBAZXZ0IDogcG9pbnRlciB0byBhbiBldmVudCBzdHJ1Y3QKKyogICAgQHVzZXJfZGF0YTogdXNlciBkYXRhIHBvaW50ZXIKKyoqLwordHlwZWRlZiB2b2lkICgqbW1fY2FtZXJhX2V2ZW50X25vdGlmeV90KSh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfZXZlbnRfdCAqZXZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworCisvKiogbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdDogZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3IgZnJhbWUgbm90aWZ5CisqICAgaGFuZGxpbmcKKyogICAgQG1tX2NhbWVyYV9zdXBlcl9idWZfdCA6IHJlY2VpdmVkIGZyYW1lIGJ1ZmZlcnMKKyogICAgQHVzZXJfZGF0YTogdXNlciBkYXRhIHBvaW50ZXIKKyoqLwordHlwZWRlZiB2b2lkICgqbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCkgKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqYnVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworCisvKiogbWFwX3N0cmVhbV9idWZfb3BfdDogZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3Igb3BlcmF0aW9uIG9mCisqICAgbWFwcGluZyBzdHJlYW0gYnVmZmVycyB2aWEgZG9tYWluIHNvY2tldAorKiAgICBAZnJhbWVfaWR4IDogYnVmZmVyIGluZGV4IHdpdGhpbiBzdHJlYW0gYnVmZmVycworKiAgICBAcGxhbmVfaWR4ICAgIDogcGxhbmUgaW5kZXguIElmIGFsbCBwbGFuZXMgc2hhcmUgdGhlIHNhbWUKKyogICAgICAgICAgICAgICAgICAgZmQsIHBsYW5lX2lkeCA9IC0xOyBvdGhlcndpc2UsIHBsZWFuX2lkeCBpcworKiAgICAgICAgICAgICAgICAgICB0aGUgaW5kZXggdG8gcGxhbmUgKDAuLm51bV9vZl9wbGFuZXMpCisqICAgIEBmZCA6IGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgc3RyZWFtIGJ1ZmZlcgorKiAgICBAc2l6ZTogc2l6ZSBvZiB0aGUgc3RyZWFtIGJ1ZmZlcgorKiAgICBAYnVmZmVyOiBQb2ludGVyIHRvIGJ1ZmZlciB0byByZWdpc3RlcgorKiAgICBAdXNlcmRhdGEgOiB1c2VyIGRhdGEgcG9pbnRlcgorKiovCit0eXBlZGVmIGludDMyX3QgKCptYXBfc3RyZWFtX2J1Zl9vcF90KSAodWludDMyX3QgZnJhbWVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX21hcHBpbmdfYnVmX3R5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKK3R5cGVkZWYgaW50MzJfdCAoKm1hcF9zdHJlYW1fYnVmc19vcF90KSAoY29uc3QgY2FtX2J1Zl9tYXBfdHlwZV9saXN0ICpidWZfbWFwX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworLyoqIHVubWFwX3N0cmVhbV9idWZfb3BfdDogZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3Igb3BlcmF0aW9uIG9mCisqICAgICAgICAgICAgICAgICAgICAgICAgICB1bm1hcHBpbmcgc3RyZWFtIGJ1ZmZlcnMgdmlhIGRvbWFpbgorKiAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0CisqICAgIEBmcmFtZV9pZHggOiBidWZmZXIgaW5kZXggd2l0aGluIHN0cmVhbSBidWZmZXJzCisqICAgIEBwbGFuZV9pZHggOiBwbGFuZSBpbmRleC4gSWYgYWxsIHBsYW5lcyBzaGFyZSB0aGUgc2FtZQorKiAgICAgICAgICAgICAgICAgZmQsIHBsYW5lX2lkeCA9IC0xOyBvdGhlcndpc2UsIHBsZWFuX2lkeCBpcworKiAgICAgICAgICAgICAgICAgdGhlIGluZGV4IHRvIHBsYW5lICgwLi5udW1fb2ZfcGxhbmVzKQorKiAgICBAdXNlcmRhdGEgOiB1c2VyIGRhdGEgcG9pbnRlcgorKiovCit0eXBlZGVmIGludDMyX3QgKCp1bm1hcF9zdHJlYW1fYnVmX29wX3QpICh1aW50MzJfdCBmcmFtZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBsYW5lX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9tYXBwaW5nX2J1Zl90eXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSk7CisKKy8qKiBtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdDogdmlydHVhbCB0YWJsZQorKiAgICAgICAgICAgICAgICAgICAgICBmb3IgbWFwcGluZy91bm1hcHBpbmcgc3RyZWFtIGJ1ZmZlcnMgdmlhCisqICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiBzb2NrZXQKKyogICAgQG1hcF9vcHMgOiBvcGVyYXRpb24gZm9yIG1hcHBpbmcKKyogICAgQHVubWFwX29wcyA6IG9wZXJhdGlvbiBmb3IgdW5tYXBwaW5nCisqICAgIEB1c2VyZGF0YTogdXNlciBkYXRhIHBvaW50ZXIKKyoqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG1hcF9zdHJlYW1fYnVmX29wX3QgbWFwX29wczsKKyAgICBtYXBfc3RyZWFtX2J1ZnNfb3BfdCBidW5kbGVkX21hcF9vcHM7CisgICAgdW5tYXBfc3RyZWFtX2J1Zl9vcF90IHVubWFwX29wczsKKyAgICB2b2lkICp1c2VyZGF0YTsKK30gbW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3Q7CisKKy8qKiBtbV9jYW1lcmFfc3RyZWFtX21lbV92dGJsX3Q6IHZpcnR1YWwgdGFibGUgZm9yIHN0cmVhbQorKiAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uCisqICAgIEBnZXRfYnVmcyA6IGZ1bmN0aW9uIGRlZmluaXRpb24gZm9yIGFsbG9jYXRpbmcKKyogICAgICAgICAgICAgICAgc3RyZWFtIGJ1ZmZlcnMKKyogICAgQHB1dF9idWZzIDogZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3IgZGVhbGxvY2F0aW5nCisqICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXJzCisqICAgIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBwb2ludGVyCisqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdm9pZCAqdXNlcl9kYXRhOworICBpbnQzMl90ICgqc2V0X2NvbmZpZ19vcHMpIChtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCwKKyAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworICBpbnQzMl90ICgqZ2V0X2J1ZnMpIChjYW1fZnJhbWVfbGVuX29mZnNldF90ICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm51bV9idWZzLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqaW5pdGlhbF9yZWdfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqKmJ1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworICBpbnQzMl90ICgqcHV0X2J1ZnMpIChtbV9jYW1lcmFfbWFwX3VubWFwX29wc190YmxfdCAqb3BzX3RibCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKyAgaW50MzJfdCAoKmludmFsaWRhdGVfYnVmKSh1aW50MzJfdCBpbmRleCwgdm9pZCAqdXNlcl9kYXRhKTsKKyAgaW50MzJfdCAoKmNsZWFuX2ludmFsaWRhdGVfYnVmKSh1aW50MzJfdCBpbmRleCwgdm9pZCAqdXNlcl9kYXRhKTsKK30gbW1fY2FtZXJhX3N0cmVhbV9tZW1fdnRibF90OworCisvKiogbW1fY2FtZXJhX3N0cmVhbV9jb25maWdfdDogc3RydWN0dXJlIGZvciBzdHJlYW0KKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uCisqICAgIEBzdHJlYW1faW5mbyA6IHBvaW50ZXIgdG8gYSBzdHJlYW0gaW5mbyBzdHJ1Y3R1cmUKKyogICAgQHBhZGRpbmdfaW5mbzogcGFkZGluZyBpbmZvIG9idGFpbmVkIGZyb20gcXVlcnljYXBhYmlsaXR5CisqICAgIEBtZW1fdGJsIDogbWVtb3J5IG9wZXJhdGlvbiB0YWJsZSBmb3IKKyogICAgICAgICAgICAgIGFsbG9jYXRpbmcvZGVhbGxvY2F0aW5nIHN0cmVhbSBidWZmZXJzCisqICAgIEBzdHJlYW1fY2Jfc3luYyA6IFNZTkMgY2FsbGJhY2sgaGFuZGxpbmcgc3RyZWFtIGZyYW1lIG5vdGlmeQorKiAgICBAc3RyZWFtX2NiIDogQVNZTkMgY2FsbGJhY2sgaGFuZGxpbmcgc3RyZWFtIGZyYW1lIG5vdGlmeQorKiAgICBAdXNlcmRhdGEgOiB1c2VyIGRhdGEgcG9pbnRlcgorKiovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY2FtX3N0cmVhbV9pbmZvX3QgKnN0cmVhbV9pbmZvOworICAgIGNhbV9wYWRkaW5nX2luZm9fdCBwYWRkaW5nX2luZm87CisgICAgbW1fY2FtZXJhX3N0cmVhbV9tZW1fdnRibF90IG1lbV92dGJsOworICAgIG1tX2NhbWVyYV9idWZfbm90aWZ5X3Qgc3RyZWFtX2NiX3N5bmM7CisgICAgbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCBzdHJlYW1fY2I7CisgICAgdm9pZCAqdXNlcmRhdGE7Cit9IG1tX2NhbWVyYV9zdHJlYW1fY29uZmlnX3Q7CisKKy8qKiBtbV9jYW1lcmFfc3VwZXJfYnVmX25vdGlmeV9tb2RlX3Q6IGVudW0gZm9yIHN1cGVyIHVmZmVyCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24gbW9kZQorKiAgICBATU1fQ0FNRVJBX1NVUEVSX0JVRl9OT1RJRllfQlVSU1QgOgorKiAgICAgICBaU0wgdXNlIGNhc2U6IGdldCBidXJzdCBvZiBmcmFtZXMKKyogICAgQE1NX0NBTUVSQV9TVVBFUl9CVUZfTk9USUZZX0NPTlRJTlVPVVMgOgorKiAgICAgICBnZXQgY29udGludW91cyBmcmFtZXM6IHdoZW4gdGhlIHN1cGVyIGJ1ZiBpcyByZWFkeQorKiAgICAgICBkaXNwYXRjaCBpdCB0byBIQUwKKyoqLwordHlwZWRlZiBlbnVtIHsKKyAgICBNTV9DQU1FUkFfU1VQRVJfQlVGX05PVElGWV9CVVJTVCA9IDAsCisgICAgTU1fQ0FNRVJBX1NVUEVSX0JVRl9OT1RJRllfQ09OVElOVU9VUywKKyAgICBNTV9DQU1FUkFfU1VQRVJfQlVGX05PVElGWV9NQVgKK30gbW1fY2FtZXJhX3N1cGVyX2J1Zl9ub3RpZnlfbW9kZV90OworCisvKiogbW1fY2FtZXJhX3N1cGVyX2J1Zl9wcmlvcml0eV90OiBlbnVtIGZvciBzdXBlciBidWZmZXIKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nIHByaW9yaXR5CisqICAgIEBNTV9DQU1FUkFfU1VQRVJfQlVGX1BSSU9SSVRZX05PUk1BTCA6CisqICAgICAgIFNhdmUgdGhlIGZyYW1lIG5vIG1hdHRlciBmb2N1c2VkIG9yIG5vdC4gQ3VycmVudGx5IG9ubHkKKyogICAgICAgdGhpcyB0eXBlIGlzIHN1cHBvcnRlZC4KKyogICAgQE1NX0NBTUVSQV9TVVBFUl9CVUZfUFJJT1JJVFlfRk9DVVMgOgorKiAgICAgICBvbmx5IHF1ZXVlIHRoZSBmcmFtZSB0aGF0IGlzIGZvY3VzZWQuIFdpbGwgZW5hYmxlIG1ldGEKKyogICAgICAgZGF0YSBoZWFkZXIgdG8gY2FycnkgZm9jdXMgaW5mbworKiAgICBATU1fQ0FNRVJBX1NVUEVSX0JVRl9QUklPUklUWV9FWFBPU1VSRV9CUkFDS0VUSU5HIDoKKyogICAgICAgYWZ0ZXIgc2h1dHRlciwgb25seSBxdWV1ZSBtYXRjaGVkIGV4cG9zdXJlIGluZGV4CisqKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTU1fQ0FNRVJBX1NVUEVSX0JVRl9QUklPUklUWV9OT1JNQUwgPSAwLAorICAgIE1NX0NBTUVSQV9TVVBFUl9CVUZfUFJJT1JJVFlfRk9DVVMsCisgICAgTU1fQ0FNRVJBX1NVUEVSX0JVRl9QUklPUklUWV9FWFBPU1VSRV9CUkFDS0VUSU5HLAorICAgIE1NX0NBTUVSQV9TVVBFUl9CVUZfUFJJT1JJVFlfTE9XLC8qIEJ1bmRsZWQgbWV0YWRhdGEgZnJhbWUgbWF5IG5vdCBtYXRjaCovCisgICAgTU1fQ0FNRVJBX1NVUEVSX0JVRl9QUklPUklUWV9NQVgKK30gbW1fY2FtZXJhX3N1cGVyX2J1Zl9wcmlvcml0eV90OworCisvKiogbW1fY2FtZXJhX2FkdmFuY2VkX2NhcHR1cmVfdDogZW51bSBmb3IgYWR2YW5jZWQgY2FwdHVyZSB0eXBlLgorKiAgICBATU1fQ0FNRVJBX0FGX0JSQUNLRVRJTkcgOgorKiAgICAgICB0byBlbmFibGUgQUYgQnJhY2tldGlnLgorKiAgICBATU1fQ0FNRVJBX0FFX0JSQUNLRVRJTkcgOgorKiAgICAgICB0byBlbmFibGUgQUYgQnJhY2tldGluZy4KKyogICAgQE1NX0NBTUVSQV9GTEFTSF9CUkFDS0VUSU5HIDoKKyogICAgICAgdG8gZW5hYmxlIEZsYXNoIEJyYWNrZXRpbmcuCisqICAgIEBNTV9DQU1FUkFfWk9PTV8xWCA6CisqICAgICAgIHRvIGVuYWJsZSB6b29tIDF4IGNhcHR1cmUgcmVxdWVzdAorKiovCit0eXBlZGVmIGVudW0geworICAgTU1fQ0FNRVJBX0FGX0JSQUNLRVRJTkcgPSAwLAorICAgTU1fQ0FNRVJBX0FFX0JSQUNLRVRJTkcsCisgICBNTV9DQU1FUkFfRkxBU0hfQlJBQ0tFVElORywKKyAgIE1NX0NBTUVSQV9aT09NXzFYLAorICAgTU1fQ0FNRVJBX0ZSQU1FX0NBUFRVUkUsCit9IG1tX2NhbWVyYV9hZHZhbmNlZF9jYXB0dXJlX3Q7CisKKy8qKiBtbV9jYW1lcmFfc3RyZWFtX2NiX3R5cGU6IGVudW0gZm9yIHN0cmVhbSBidWZmZXIgY2FsbGJhY2sgdHlwZS4KKyogICAgQE1NX0NBTUVSQV9TVFJFQU1fQ0JfVFlQRV9BU1lOQyA6CisqICAgICAgIGNhbGxiYWNrIGlzIGFzeW5jIHR5cGUuIGJ1ZmZlciBwcm9jZXNzIGRvbmUgaW4gY2xpZW50IHRocmVhZCBjb250ZXh0CisqICAgIEBNTV9DQU1FUkFfU1RSRUFNX0NCX1RZUEVfU1lOQyA6CisqICAgICAgIGNhbGxiYWNrIGlzIHN5bmMgdHlwZS4gYnVmZmVyIHByb2Nlc3MgZG9uZSBpbnRlcmZhY2UgdGhyZWFkIGNvbnRleHQKKyoqLwordHlwZWRlZiBlbnVtIHsKKyAgICBNTV9DQU1FUkFfU1RSRUFNX0NCX1RZUEVfQVNZTkMsCisgICAgTU1fQ0FNRVJBX1NUUkVBTV9DQl9UWVBFX1NZTkMsCit9IG1tX2NhbWVyYV9zdHJlYW1fY2JfdHlwZTsKKworCisvKiogbW1fY2FtZXJhX2NoYW5uZWxfYXR0cl90OiBzdHJ1Y3R1cmUgZm9yIGRlZmluaW5nIGNoYW5uZWwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMKKyogICAgQG5vdGlmeV9tb2RlIDogbm90aWZ5IG1vZGU6IGJ1cnN0IG9yIGNvbnRpbnVvdXMKKyogICAgQHdhdGVyX21hcmsgOiBxdWV1ZSBkZXB0aC4gT25seSB2YWxpZCBmb3IgYnVyc3QgbW9kZQorKiAgICBAbG9va19iYWNrIDogbG9vayBiYWNrIGhvdyBtYW55IGZyYW1lcyBmcm9tIGxhc3QgYnVmLgorKiAgICAgICAgICAgICAgICAgT25seSB2YWxpZCBmb3IgYnVyc3QgbW9kZQorKiAgICBAcG9zdF9mcmFtZV9za2lwIDogYWZ0ZXIgc2VuZCBmaXJzdCBmcmFtZSB0byBIQUwsIGhvdyBtYW55CisqICAgICAgICAgICAgICAgICAgICAgZnJhbWVzIG5lZWRpbmcgdG8gYmUgc2tpcHBlZCBmb3IgbmV4dAorKiAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJ5LiBPbmx5IHZhbGlkIGZvciBidXJzdCBtb2RlCisqICAgIEBtYXhfdW5tYXRjaGVkX2ZyYW1lcyA6IG1heCBudW1iZXIgb2YgdW5tYXRjaGVkIGZyYW1lcyBpbgorKiAgICAgICAgICAgICAgICAgICAgIHF1ZXVlCisqICAgIEBlbmFibGVfZnJhbWVfc3luYzogRW5hYmxlcyBmcmFtZSBzeW5jIGZvciBkdWFsIGNhbWVyYQorKiAgICBAcHJpb3JpdHkgOiBzYXZlIG1hdGNoZWQgcHJpb3JpdHkgZnJhbWVzIG9ubHkKKyogICAgQHVzZXJfZXhwZWN0ZWRfZnJhbWVfaWQgOiBOdW1iZXIgb2YgZnJhbWVzLCBjYW1lcmEgaW50ZXJmYWNlCisqICAgICAgICAgICAgICAgICAgICAgd2lsbCB3YWl0IGZvciBnZXR0aW5nIHRoZSBpbnN0YW50IGNhcHR1cmUgZnJhbWUuCisqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX25vdGlmeV9tb2RlX3Qgbm90aWZ5X21vZGU7CisgICAgdWludDhfdCB3YXRlcl9tYXJrOworICAgIHVpbnQ4X3QgbG9va19iYWNrOworICAgIHVpbnQ4X3QgcG9zdF9mcmFtZV9za2lwOworICAgIHVpbnQ4X3QgbWF4X3VubWF0Y2hlZF9mcmFtZXM7CisgICAgdWludDhfdCBlbmFibGVfZnJhbWVfc3luYzsKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3ByaW9yaXR5X3QgcHJpb3JpdHk7CisgICAgdWludDhfdCB1c2VyX2V4cGVjdGVkX2ZyYW1lX2lkOworfSBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiogcXVlcnlfY2FwYWJpbGl0eTogZnVjbnRpb24gZGVmaW5pdGlvbiBmb3IgcXVlcnlpbmcgc3RhdGljCisgICAgICogICAgICAgICAgICAgICAgICAgIGNhbWVyYSBjYXBhYmlsaXRpZXMKKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgUmV0dXJuIHZhbHVlOiAwIC0tIHN1Y2Nlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgICAgICogIE5vdGU6IHdvdWxkIGFzc3VtZSBjYW1fY2FwYWJpbGl0eV90IGlzIGFscmVhZHkgbWFwcGVkCisgICAgICoqLworICAgIGludDMyX3QgKCpxdWVyeV9jYXBhYmlsaXR5KSAodWludDMyX3QgY2FtZXJhX2hhbmRsZSk7CisKKyAgICAvKiogcmVnaXN0ZXJfZXZlbnRfbm90aWZ5OiBmdWNudGlvbiBkZWZpbml0aW9uIGZvciByZWdpc3RlcmluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBldmVudCBub3RpZmljYXRpb24KKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgICBAZXZ0X2NiIDogY2FsbGJhY2sgZm9yIGV2ZW50IG5vdGlmeQorICAgICAqICAgIEB1c2VyX2RhdGEgOiB1c2VyIGRhdGEgcG9pbmVyCisgICAgICogIFJldHVybiB2YWx1ZTogMCAtLSBzdWNjZXNzCisgICAgICogICAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICAgICAqKi8KKyAgICBpbnQzMl90ICgqcmVnaXN0ZXJfZXZlbnRfbm90aWZ5KSAodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2V2ZW50X25vdGlmeV90IGV2dF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKTsKKworICAgIC8qKiBjbG9zZV9jYW1lcmE6IGZ1Y250aW9uIGRlZmluaXRpb24gZm9yIGNsb3NpbmcgYSBjYW1lcmEKKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgUmV0dXJuIHZhbHVlOiAwIC0tIHN1Y2Nlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgICAgICoqLworICAgIGludDMyX3QgKCpjbG9zZV9jYW1lcmEpICh1aW50MzJfdCBjYW1lcmFfaGFuZGxlKTsKKworICAgIC8qKiBtYXBfYnVmOiBmdWNudGlvbiBkZWZpbml0aW9uIGZvciBtYXBwaW5nIGEgY2FtZXJhIGJ1ZmZlcgorICAgICAqICAgICAgICAgICB2aWEgZG9tYWluIHNvY2tldAorICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXIgaGFuZGxlcgorICAgICAqICAgIEBidWZfdHlwZSA6IHR5cGUgb2YgbWFwcGluZyBidWZmZXJzLCBjYW4gYmUgdmFsdWUgb2YKKyAgICAgKiAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9DQVBBQklMSVRZCisgICAgICogICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU0VUUEFSTV9CVUYKKyAgICAgKiAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9HRVRQQVJNX0JVRgorICAgICAqICAgIEBmZCA6IGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgc3RyZWFtIGJ1ZmZlcgorICAgICAqICAgIEBzaXplIDogIHNpemUgb2YgdGhlIHN0cmVhbSBidWZmZXIKKyAgICAgKiAgUmV0dXJuIHZhbHVlOiAwIC0tIHN1Y2Nlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgICAgICoqLworICAgIGludDMyX3QgKCptYXBfYnVmKSAodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlcik7CisKKyAgICAvKiogbWFwX2J1ZnM6IGZ1bmN0aW9uIGRlZmluaXRpb24gZm9yIG1hcHBpbmcgbXVsdGlwbGUgY2FtZXJhIGJ1ZmZlcnMKKyAgICAgKiAgICAgICAgICAgdmlhIGRvbWFpbiBzb2NrZXQKKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyYSBoYW5kbGVyCisgICAgICogICAgQGJ1Zl9tYXBfbGlzdCA6IGxpc3Qgb2YgYnVmZmVycyB0byBtYXAKKyAgICAgKiAgUmV0dXJuIHZhbHVlOiAwIC0tIHN1Y2Nlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgICAgICoqLworICAgIGludDMyX3QgKCptYXBfYnVmcykgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtX2J1Zl9tYXBfdHlwZV9saXN0ICpidWZfbWFwX2xpc3QpOworCisgICAgLyoqIHVubWFwX2J1ZjogZnVjbnRpb24gZGVmaW5pdGlvbiBmb3IgdW5tYXBwaW5nIGEgY2FtZXJhIGJ1ZmZlcgorICAgICAqICAgICAgICAgICB2aWEgZG9tYWluIHNvY2tldAorICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXIgaGFuZGxlcgorICAgICAqICAgIEBidWZfdHlwZSA6IHR5cGUgb2YgbWFwcGluZyBidWZmZXJzLCBjYW4gYmUgdmFsdWUgb2YKKyAgICAgKiAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9DQVBBQklMSVRZCisgICAgICogICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU0VUUEFSTV9CVUYKKyAgICAgKiAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9HRVRQQVJNX0JVRgorICAgICAqICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICAqICAgICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAgICAgKiovCisgICAgaW50MzJfdCAoKnVubWFwX2J1ZikgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmX3R5cGUpOworCisgICAgLyoqIHNldF9wYXJtczogZnVjbnRpb24gZGVmaW5pdGlvbiBmb3Igc2V0dGluZyBjYW1lcmEKKyAgICAgKiAgICAgICAgICAgICBiYXNlZCBwYXJhbWV0ZXJzIHRvIHNlcnZlcgorICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXIgaGFuZGxlcgorICAgICAqICAgIEBwYXJtcyA6IGJhdGNoIGZvciBwYXJhbWV0ZXJzIHRvIGJlIHNldCwgc3RvcmVkIGluCisgICAgICogICAgICAgICAgICAgICBwYXJtX2J1ZmZlcl90CisgICAgICogIFJldHVybiB2YWx1ZTogMCAtLSBzdWNjZXNzCisgICAgICogICAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICAgICAqICBOb3RlOiB3b3VsZCBhc3N1bWUgcGFybV9idWZmZXJfdCBpcyBhbHJlYWR5IG1hcHBlZCwgYW5kCisgICAgICogICAgICAgYWNjb3JkaW5nIHBhcmFtZXRlciBlbnRyaWVzIHRvIGJlIHNldCBhcmUgZmlsbGVkIGluIHRoZQorICAgICAqICAgICAgIGJ1ZiBiZWZvcmUgdGhpcyBjYWxsCisgICAgICoqLworICAgIGludDMyX3QgKCpzZXRfcGFybXMpICh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtX2J1ZmZlcl90ICpwYXJtcyk7CisKKyAgICAvKiogZ2V0X3Bhcm1zOiBmdWNudGlvbiBkZWZpbml0aW9uIGZvciBxdWVyeWluZyBjYW1lcmEKKyAgICAgKiAgICAgICAgICAgICBiYXNlZCBwYXJhbWV0ZXJzIGZyb20gc2VydmVyCisgICAgICogICAgQGNhbWVyYV9oYW5kbGUgOiBjYW1lciBoYW5kbGVyCisgICAgICogICAgQHBhcm1zIDogYmF0Y2ggZm9yIHBhcmFtZXRlcnMgdG8gYmUgcXVlcmllZCwgc3RvcmVkIGluCisgICAgICogICAgICAgICAgICAgICBwYXJtX2J1ZmZlcl90CisgICAgICogIFJldHVybiB2YWx1ZTogMCAtLSBzdWNjZXNzCisgICAgICogICAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICAgICAqICBOb3RlOiB3b3VsZCBhc3N1bWUgcGFybV9idWZmZXJfdCBpcyBhbHJlYWR5IG1hcHBlZCwgYW5kCisgICAgICogICAgICAgYWNjb3JkaW5nIHBhcmFtZXRlciBlbnRyaWVzIHRvIGJlIHF1ZXJpZWQgYXJlIGZpbGxlZCBpbgorICAgICAqICAgICAgIHRoZSBidWYgYmVmb3JlIHRoaXMgY2FsbAorICAgICAqKi8KKyAgICBpbnQzMl90ICgqZ2V0X3Bhcm1zKSAodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybV9idWZmZXJfdCAqcGFybXMpOworCisgICAgLyoqIGRvX2F1dG9fZm9jdXM6IGZ1Y250aW9uIGRlZmluaXRpb24gZm9yIHBlcmZvcm1pbmcgYXV0byBmb2N1cworICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXIgaGFuZGxlcgorICAgICAqICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICAqICAgICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAgICAgKiAgTm90ZTogaWYgdGhpcyBjYWxsIHN1Y2Nlc3MsIHdlIHdpbGwgYWx3YXlzIGFzc3VtZSB0aGVyZSB3aWxsCisgICAgICogICAgICAgIGJlIGFuIGF1dG9fZm9jdXMgZXZlbnQgZm9sbG93aW5nIHVwLgorICAgICAqKi8KKyAgICBpbnQzMl90ICgqZG9fYXV0b19mb2N1cykgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUpOworCisgICAgLyoqIGNhbmNlbF9hdXRvX2ZvY3VzOiBmdWNudGlvbiBkZWZpbml0aW9uIGZvciBjYW5jZWxsaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyBhdXRvIGZvY3VzIHJlcXVlc3QKKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAqICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICogICAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICAgICAqKi8KKyAgICBpbnQzMl90ICgqY2FuY2VsX2F1dG9fZm9jdXMpICh1aW50MzJfdCBjYW1lcmFfaGFuZGxlKTsKKworICAgIC8qKiBwcmVwYXJlX3NuYXBzaG90OiBmdWNudGlvbiBkZWZpbml0aW9uIGZvciBwcmVwYXJpbmcgaGFyZHdhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgZm9yIHNuYXBzaG90LgorICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXIgaGFuZGxlcgorICAgICAqICAgIEBkb19hZl9mbGFnICAgIDogZmxhZyBpbmRpY2F0aW5nIGlmIEFGIG5lZWRzIHRvIGJlIGRvbmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIDAgLS0gbm8gQUYgbmVlZGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAxIC0tIEFGIG5lZWRlZAorICAgICAqICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICAqICAgICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAgICAgKiovCisgICAgaW50MzJfdCAoKnByZXBhcmVfc25hcHNob3QpICh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb19hZl9mbGFnKTsKKworICAgIC8qKiBzdGFydF96c2xfc25hcHNob3Q6IGZ1bmN0aW9uIGRlZmluaXRpb24gZm9yIHN0YXJ0aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgIHpzbCBzbmFwc2hvdC4KKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgICBAY2hfaWQgICAgICAgICA6IGNoYW5uZWwgaWQKKyAgICAgKiAgUmV0dXJuIHZhbHVlOiAwIC0tIHN1Y2Nlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgICAgICoqLworICAgIGludDMyX3QgKCpzdGFydF96c2xfc25hcHNob3QpICh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLCB1aW50MzJfdCBjaF9pZCk7CisKKyAgICAvKiogc3RvcF96c2xfc25hcHNob3Q6IGZ1bmN0aW9uIGRlZmluaXRpb24gZm9yIHN0b3BwaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgIHpzbCBzbmFwc2hvdC4KKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgICBAY2hfaWQgICAgICAgICA6IGNoYW5uZWwgaWQKKyAgICAgKiAgUmV0dXJuIHZhbHVlOiAwIC0tIHN1Y2Nlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgICAgICoqLworICAgIGludDMyX3QgKCpzdG9wX3pzbF9zbmFwc2hvdCkgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsIHVpbnQzMl90IGNoX2lkKTsKKworICAgIC8qKiBhZGRfY2hhbm5lbDogZnVjbnRpb24gZGVmaW5pdGlvbiBmb3IgYWRkaW5nIGEgY2hhbm5lbAorICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXIgaGFuZGxlcgorICAgICAqICAgIEBjaF9pZCA6IGNoYW5uZWwgaGFuZGxlcgorICAgICAqICAgIEBhdHRyIDogcG9pbnRlciB0byBjaGFubmVsIGF0dHJpYnV0ZSBzdHJ1Y3R1cmUKKyAgICAgKiAgICBAY2hhbm5lbF9jYiA6IGNhbGxiYWsgdG8gaGFuZGxlIGJ1bmRsZWQgc3VwZXIgYnVmZmVyCisgICAgICogICAgQHVzZXJkYXRhIDogdXNlciBkYXRhIHBvaW50ZXIKKyAgICAgKiAgUmV0dXJuIHZhbHVlOiBjaGFubmVsIGlkLCB6ZXJvIGlzIGludmFsaWQgY2hfaWQKKyAgICAgKiBOb3RlOiBhdHRyLCBjaGFubmVsX2NiLCBhbmQgdXNlcmRhdGEgY2FuIGJlIE5VTEwgaWYgbm8KKyAgICAgKiAgICAgICBzdXBlcmJ1ZkNCIGlzIG5lZWRlZAorICAgICAqKi8KKyAgICB1aW50MzJfdCAoKmFkZF9jaGFubmVsKSAodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfYXR0cl90ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IGNoYW5uZWxfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKworICAgIC8qKiBkZWxldGVfY2hhbm5lbDogZnVjbnRpb24gZGVmaW5pdGlvbiBmb3IgZGVsZXRpbmcgYSBjaGFubmVsCisgICAgICogICAgQGNhbWVyYV9oYW5kbGUgOiBjYW1lciBoYW5kbGVyCisgICAgICogICAgQGNoX2lkIDogY2hhbm5lbCBoYW5kbGVyCisgICAgICogIFJldHVybiB2YWx1ZTogMCAtLSBzdWNjZXNzCisgICAgICogICAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICAgICAqKi8KKyAgICBpbnQzMl90ICgqZGVsZXRlX2NoYW5uZWwpICh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkKTsKKworICAgIC8qKiBnZXRfYnVuZGxlX2luZm86IGZ1bmN0aW9uIGRlZmluaXRpb24gZm9yIHF1ZXJ5aW5nIGJ1bmRsZQorICAgICAqICBpbmZvIG9mIHRoZSBjaGFubmVsCisgICAgICogICAgQGNhbWVyYV9oYW5kbGUgOiBjYW1lcmEgaGFuZGxlcgorICAgICAqICAgIEBjaF9pZCAgICAgICAgIDogY2hhbm5lbCBoYW5kbGVyCisgICAgICogICAgQGJ1bmRsZV9pbmZvICAgOiBidW5kbGUgaW5mbyB0byBiZSBmaWxsZWQgaW4KKyAgICAgKiAgUmV0dXJuIHZhbHVlOiAwIC0tIHN1Y2Nlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgICAgICoqLworICAgIGludDMyX3QgKCpnZXRfYnVuZGxlX2luZm8pICh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2J1bmRsZV9jb25maWdfdCAqYnVuZGxlX2luZm8pOworCisgICAgLyoqIGFkZF9zdHJlYW06IGZ1Y250aW9uIGRlZmluaXRpb24gZm9yIGFkZGluZyBhIHN0cmVhbQorICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXIgaGFuZGxlcgorICAgICAqICAgIEBjaF9pZCA6IGNoYW5uZWwgaGFuZGxlcgorICAgICAqICBSZXR1cm4gdmFsdWU6IHN0cmVhbV9pZC4gemVybyBpcyBpbnZhbGlkIHN0cmVhbV9pZAorICAgICAqKi8KKyAgICB1aW50MzJfdCAoKmFkZF9zdHJlYW0pICh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkKTsKKworICAgIC8qKiBkZWxldGVfc3RyZWFtOiBmdWNudGlvbiBkZWZpbml0aW9uIGZvciBkZWxldGluZyBhIHN0cmVhbQorICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXIgaGFuZGxlcgorICAgICAqICAgIEBjaF9pZCA6IGNoYW5uZWwgaGFuZGxlcgorICAgICAqICAgIEBzdHJlYW1faWQgOiBzdHJlYW0gaGFuZGxlcgorICAgICAqICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICAqICAgICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAgICAgKiovCisgICAgaW50MzJfdCAoKmRlbGV0ZV9zdHJlYW0pICh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQpOworCisgICAgLyoqIGxpbmtfc3RyZWFtOiBmdW5jdGlvbiBkZWZpbml0aW9uIGZvciBsaW5raW5nIGEgc3RyZWFtCisgICAgICogICAgQGNhbWVyYV9oYW5kbGUgOiBjYW1lcmEgaGFuZGxlCisgICAgICogICAgQGNoX2lkIDogY2hhbm5lbCBoYW5kbGUgZnJvbSB3aGljaCB0aGUgc3RyZWFtIG9yaWdpbmF0ZXMKKyAgICAgKiAgICBAc3RyZWFtX2lkIDogc3RyZWFtIGhhbmRsZQorICAgICAqICAgIEBsaW5rZWRfY2hfaWQ6IGNoYW5uZWwgaGFuZGxlIGluIHdoaWNoIHRoZSBzdHJlYW0gd2lsbCBiZSBsaW5rZWQKKyAgICAgKiAgUmV0dXJuIHZhbHVlOiAwIC0tIHN1Y2Nlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgICAgICoqLworICAgIGludDMyX3QgKCpsaW5rX3N0cmVhbSkgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkLAorICAgICAgICAgIHVpbnQzMl90IGxpbmtlZF9jaF9pZCk7CisKKyAgICAvKiogY29uZmlnX3N0cmVhbTogZnVjbnRpb24gZGVmaW5pdGlvbiBmb3IgY29uZmlndXJpbmcgYSBzdHJlYW0KKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgICBAY2hfaWQgOiBjaGFubmVsIGhhbmRsZXIKKyAgICAgKiAgICBAc3RyZWFtX2lkIDogc3RyZWFtIGhhbmRsZXIKKyAgICAgKiAgICBAY29uZmlkIDogcG9pbnRlciB0byBhIHN0cmVhbSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZQorICAgICAqICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICAqICAgICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAgICAgKiovCisgICAgaW50MzJfdCAoKmNvbmZpZ19zdHJlYW0pICh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3RyZWFtX2NvbmZpZ190ICpjb25maWcpOworCisgICAgLyoqIG1hcF9zdHJlYW1fYnVmOiBmdWNudGlvbiBkZWZpbml0aW9uIGZvciBtYXBwaW5nCisgICAgICogICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgdmlhIGRvbWFpbiBzb2NrZXQKKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgICBAY2hfaWQgOiBjaGFubmVsIGhhbmRsZXIKKyAgICAgKiAgICBAc3RyZWFtX2lkIDogc3RyZWFtIGhhbmRsZXIKKyAgICAgKiAgICBAYnVmX3R5cGUgOiB0eXBlIG9mIG1hcHBpbmcgYnVmZmVycywgY2FuIGJlIHZhbHVlIG9mCisgICAgICogICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRgorICAgICAqICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9JTkZPCisgICAgICogICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfT0ZGTElORV9JTlBVVF9CVUYKKyAgICAgKiAgICBAYnVmX2lkeCA6IGJ1ZmZlciBpbmRleCB3aXRoaW4gdGhlIHN0cmVhbSBidWZmZXJzCisgICAgICogICAgQHBsYW5lX2lkeCA6IHBsYW5lIGluZGV4LiBJZiBhbGwgcGxhbmVzIHNoYXJlIHRoZSBzYW1lIGZkLAorICAgICAqICAgICAgICAgICAgICAgcGxhbmVfaWR4ID0gLTE7IG90aGVyd2lzZSwgcGxlYW5faWR4IGlzIHRoZQorICAgICAqICAgICAgICAgICAgICAgaW5kZXggdG8gcGxhbmUgKDAuLm51bV9vZl9wbGFuZXMpCisgICAgICogICAgQGZkIDogZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBzdHJlYW0gYnVmZmVyCisgICAgICogICAgQHNpemUgOiAgc2l6ZSBvZiB0aGUgc3RyZWFtIGJ1ZmZlcgorICAgICAqICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICAqICAgICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAgICAgKiovCisgICAgaW50MzJfdCAoKm1hcF9zdHJlYW1fYnVmKSAodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBidWZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIpOworCisgICAgLyoqIG1hcF9zdHJlYW1fYnVmczogZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3IgbWFwcGluZyBtdWx0aXBsZQorICAgICAqICAgICAgICAgICAgICAgICBzdHJlYW0gYnVmZmVycyB2aWEgZG9tYWluIHNvY2tldAorICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXJhIGhhbmRsZXIKKyAgICAgKiAgICBAY2hfaWQgOiBjaGFubmVsIGhhbmRsZXIKKyAgICAgKiAgICBAYnVmX21hcF9saXN0IDogbGlzdCBvZiBidWZmZXJzIHRvIG1hcAorICAgICAqICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICAqICAgICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAgICAgKiovCisgICAgaW50MzJfdCAoKm1hcF9zdHJlYW1fYnVmcykgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1fYnVmX21hcF90eXBlX2xpc3QgKmJ1Zl9tYXBfbGlzdCk7CisKKyAgICAvKiogdW5tYXBfc3RyZWFtX2J1ZjogZnVjbnRpb24gZGVmaW5pdGlvbiBmb3IgdW5tYXBwaW5nCisgICAgICogICAgICAgICAgICAgICAgIHN0cmVhbSBidWZmZXIgdmlhIGRvbWFpbiBzb2NrZXQKKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgICBAY2hfaWQgOiBjaGFubmVsIGhhbmRsZXIKKyAgICAgKiAgICBAc3RyZWFtX2lkIDogc3RyZWFtIGhhbmRsZXIKKyAgICAgKiAgICBAYnVmX3R5cGUgOiB0eXBlIG9mIG1hcHBpbmcgYnVmZmVycywgY2FuIGJlIHZhbHVlIG9mCisgICAgICogICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRgorICAgICAqICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9JTkZPCisgICAgICogICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfT0ZGTElORV9JTlBVVF9CVUYKKyAgICAgKiAgICBAYnVmX2lkeCA6IGJ1ZmZlciBpbmRleCB3aXRoaW4gdGhlIHN0cmVhbSBidWZmZXJzCisgICAgICogICAgQHBsYW5lX2lkeCA6IHBsYW5lIGluZGV4LiBJZiBhbGwgcGxhbmVzIHNoYXJlIHRoZSBzYW1lIGZkLAorICAgICAqICAgICAgICAgICAgICAgcGxhbmVfaWR4ID0gLTE7IG90aGVyd2lzZSwgcGxlYW5faWR4IGlzIHRoZQorICAgICAqICAgICAgICAgICAgICAgaW5kZXggdG8gcGxhbmUgKDAuLm51bV9vZl9wbGFuZXMpCisgICAgICogIFJldHVybiB2YWx1ZTogMCAtLSBzdWNjZXNzCisgICAgICogICAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICAgICAqKi8KKyAgICBpbnQzMl90ICgqdW5tYXBfc3RyZWFtX2J1ZikgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwbGFuZV9pZHgpOworCisgICAgLyoqIHNldF9zdHJlYW1fcGFybXM6IGZ1Y250aW9uIGRlZmluaXRpb24gZm9yIHNldHRpbmcgc3RyZWFtCisgICAgICogICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIHBhcmFtZXRlcnMgdG8gc2VydmVyCisgICAgICogICAgQGNhbWVyYV9oYW5kbGUgOiBjYW1lciBoYW5kbGVyCisgICAgICogICAgQGNoX2lkIDogY2hhbm5lbCBoYW5kbGVyCisgICAgICogICAgQHN0cmVhbV9pZCA6IHN0cmVhbSBoYW5kbGVyCisgICAgICogICAgQHBhcm1zIDogYmF0Y2ggZm9yIHBhcmFtZXRlcnMgdG8gYmUgc2V0CisgICAgICogIFJldHVybiB2YWx1ZTogMCAtLSBzdWNjZXNzCisgICAgICogICAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICAgICAqICBOb3RlOiB3b3VsZCBhc3N1bWUgcGFybSBidWZmZXIgaXMgYWxyZWFkeSBtYXBwZWQsIGFuZAorICAgICAqICAgICAgIGFjY29yZGluZyBwYXJhbWV0ZXIgZW50cmllcyB0byBiZSBzZXQgYXJlIGZpbGxlZCBpbiB0aGUKKyAgICAgKiAgICAgICBidWYgYmVmb3JlIHRoaXMgY2FsbAorICAgICAqKi8KKyAgICBpbnQzMl90ICgqc2V0X3N0cmVhbV9wYXJtcykgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgKnBhcm1zKTsKKworICAgIC8qKiBnZXRfc3RyZWFtX3Bhcm1zOiBmdWNudGlvbiBkZWZpbml0aW9uIGZvciBxdWVyeWluZyBzdHJlYW0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgcGFyYW1ldGVycyBmcm9tIHNlcnZlcgorICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXIgaGFuZGxlcgorICAgICAqICAgIEBjaF9pZCA6IGNoYW5uZWwgaGFuZGxlcgorICAgICAqICAgIEBzdHJlYW1faWQgOiBzdHJlYW0gaGFuZGxlcgorICAgICAqICAgIEBwYXJtcyA6IGJhdGNoIGZvciBwYXJhbWV0ZXJzIHRvIGJlIHF1ZXJpZWQKKyAgICAgKiAgUmV0dXJuIHZhbHVlOiAwIC0tIHN1Y2Nlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgICAgICogIE5vdGU6IHdvdWxkIGFzc3VtZSBwYXJtIGJ1ZmZlciBpcyBhbHJlYWR5IG1hcHBlZCwgYW5kCisgICAgICogICAgICAgYWNjb3JkaW5nIHBhcmFtZXRlciBlbnRyaWVzIHRvIGJlIHF1ZXJpZWQgYXJlIGZpbGxlZCBpbgorICAgICAqICAgICAgIHRoZSBidWYgYmVmb3JlIHRoaXMgY2FsbAorICAgICAqKi8KKyAgICBpbnQzMl90ICgqZ2V0X3N0cmVhbV9wYXJtcykgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgKnBhcm1zKTsKKworICAgIC8qKiBzdGFydF9jaGFubmVsOiBmdWNudGlvbiBkZWZpbml0aW9uIGZvciBzdGFydGluZyBhIGNoYW5uZWwKKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgICBAY2hfaWQgOiBjaGFubmVsIGhhbmRsZXIKKyAgICAgKiAgUmV0dXJuIHZhbHVlOiAwIC0tIHN1Y2Nlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgICAgICogVGhpcyBjYWxsIHdpbGwgc3RhcnQgYWxsIHN0cmVhbXMgYmVsb25ncyB0byB0aGUgY2hhbm5lbAorICAgICAqKi8KKyAgICBpbnQzMl90ICgqc3RhcnRfY2hhbm5lbCkgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCk7CisKKyAgICAvKiogc3RvcF9jaGFubmVsOiBmdWNudGlvbiBkZWZpbml0aW9uIGZvciBzdG9wcGluZyBhIGNoYW5uZWwKKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgICBAY2hfaWQgOiBjaGFubmVsIGhhbmRsZXIKKyAgICAgKiAgUmV0dXJuIHZhbHVlOiAwIC0tIHN1Y2Nlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgICAgICogVGhpcyBjYWxsIHdpbGwgc3RvcCBhbGwgc3RyZWFtcyBiZWxvbmdzIHRvIHRoZSBjaGFubmVsCisgICAgICoqLworICAgIGludDMyX3QgKCpzdG9wX2NoYW5uZWwpICh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCk7CisKKyAgICAvKiogcWJ1ZjogZnVjbnRpb24gZGVmaW5pdGlvbiBmb3IgcXVldWluZyBhIGZyYW1lIGJ1ZmZlciBiYWNrIHRvCisgICAgICogICAgICAgIGtlcm5lbCBmb3IgcmV1c2UKKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgICBAY2hfaWQgOiBjaGFubmVsIGhhbmRsZXIKKyAgICAgKiAgICBAYnVmIDogYSBmcmFtZSBidWZmZXIgdG8gYmUgcXVldWVkIGJhY2sgdG8ga2VybmVsCisgICAgICogIFJldHVybiB2YWx1ZTogMCAtLSBzdWNjZXNzCisgICAgICogICAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICAgICAqKi8KKyAgICBpbnQzMl90ICgqcWJ1ZikgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmJ1Zik7CisKKyAgICAvKiogZ2V0X3F1ZXVlZF9idWZfY291bnQ6IGZ1Y250aW9uIGRlZmluaXRpb24gZm9yIHF1ZXJ5aW5nIHF1ZXVlZCBidWYgY291bnQKKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgICBAY2hfaWQgOiBjaGFubmVsIGhhbmRsZXIKKyAgICAgKiAgICBAc3RyZWFtX2lkIDogc3RyZWFtIGhhbmRsZXIKKyAgICAgKiAgUmV0dXJuIHZhbHVlOiBxdWV1ZWQgYnVmIGNvdW50CisgICAgICoqLworICAgIGludDMyX3QgKCpnZXRfcXVldWVkX2J1Zl9jb3VudCkgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCk7CisKKyAgICAvKiogcmVxdWVzdF9zdXBlcl9idWY6IGZ1Y250aW9uIGRlZmluaXRpb24gZm9yIHJlcXVlc3RpbmcgZnJhbWVzCisgICAgICogICAgICAgICAgICAgICAgICAgICBmcm9tIHN1cGVyYnVmIHF1ZXVlIGluIGJ1cnN0IG1vZGUKKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgICBAY2hfaWQgOiBjaGFubmVsIGhhbmRsZXIKKyAgICAgKiAgICBAYnVmIDogcHJvdmlkZXMgaW5mbyByZWxhdGVkIHRvIHRoZSBzdXBlciBidWYgcmVxdWVzdAorICAgICAqICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICAqICAgICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAgICAgKiovCisgICAgaW50MzJfdCAoKnJlcXVlc3Rfc3VwZXJfYnVmKSAodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfcmVxX2J1Zl90ICpidWYpOworCisgICAgLyoqIGNhbmNlbF9zdXBlcl9idWZfcmVxdWVzdDogZnVjbnRpb24gZGVmaW5pdGlvbiBmb3IgY2FuY2VsaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICBmcmFtZXMgZGlzcGF0Y2hlZCBmcm9tIHN1cGVyYnVmIHF1ZXVlIGluCisgICAgICogICAgICAgICAgICAgICAgICAgICBidXJzdCBtb2RlCisgICAgICogICAgQGNhbWVyYV9oYW5kbGUgOiBjYW1lciBoYW5kbGVyCisgICAgICogICAgQGNoX2lkIDogY2hhbm5lbCBoYW5kbGVyCisgICAgICogIFJldHVybiB2YWx1ZTogMCAtLSBzdWNjZXNzCisgICAgICogICAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICAgICAqKi8KKyAgICBpbnQzMl90ICgqY2FuY2VsX3N1cGVyX2J1Zl9yZXF1ZXN0KSAodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQpOworCisgICAgLyoqIGZsdXNoX3N1cGVyX2J1Zl9xdWV1ZTogZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3IgZmx1c2hpbmcgb3V0CisgICAgICogICAgICAgICAgICAgICAgICAgICBhbGwgZnJhbWVzIGluIHRoZSBzdXBlcmJ1ZiBxdWV1ZSB1cCB0byBmcmFtZV9pZHgsCisgICAgICogICAgICAgICAgICAgICAgICAgICBldmVuIGlmIGZyYW1lcyB3aXRoIGZyYW1lX2lkeCBjb21lIGluIGxhdGVyIHRoYW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoaXMgY2FsbC4KKyAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyIGhhbmRsZXIKKyAgICAgKiAgICBAY2hfaWQgOiBjaGFubmVsIGhhbmRsZXIKKyAgICAgKiAgICBAZnJhbWVfaWR4IDogZnJhbWUgaW5kZXggdXAgdW50aWwgd2hpY2ggYWxsIHN1cGVyYnVmcyBhcmUgZmx1c2hlZAorICAgICAqICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICAqICAgICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAgICAgKiovCisgICAgaW50MzJfdCAoKmZsdXNoX3N1cGVyX2J1Zl9xdWV1ZSkgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLCB1aW50MzJfdCBmcmFtZV9pZHgpOworCisgICAgLyoqIGNvbmZpZ3VyZV9ub3RpZnlfbW9kZTogZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3IgY29uZmlndXJpbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uIG1vZGUgb2YgY2hhbm5lbAorICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXJhIGhhbmRsZXIKKyAgICAgKiAgICBAY2hfaWQgOiBjaGFubmVsIGhhbmRsZXIKKyAgICAgKiAgICBAbm90aWZ5X21vZGUgOiBub3RpZmljYXRpb24gbW9kZQorICAgICAqICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICAqICAgICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAgICAgKiovCisgICAgaW50MzJfdCAoKmNvbmZpZ3VyZV9ub3RpZnlfbW9kZSkgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX25vdGlmeV9tb2RlX3Qgbm90aWZ5X21vZGUpOworCisgICAvKiogcHJvY2Vzc19hZHZhbmNlZF9jYXB0dXJlOiBmdW5jdGlvbiBkZWZpbml0aW9uIGZvciBzdGFydC9zdG9wIGFkdmFuY2VkIGNhcHR1cmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgZm9yIHNuYXBzaG90LgorICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXJhIGhhbmRsZQorICAgICAqICAgIEBjaF9pZCA6IGNoYW5uZWwgaGFuZGxlcgorICAgICAqICAgIEB0eXBlIDogIGFkdmFuY2VkIGNhcHR1cmUgdHlwZS4KKyAgICAgKiAgICBAdHJpZ2dlciAgICA6IGZsYWcgaW5kaWNhdGluZyBpZiBhZHZhbmNlZCBjYXB0dXJlIG5lZWRzIHRvIGJlIGRvbmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIDAgLS0gc3RvcCBhZHZhbmNlZCBjYXB0dXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAxIC0tIHN0YXJ0IGFkdmFuY2VkIGNhcHR1cmUKKyAgICAgKiAgICBAaW5fdmFsdWU6IElucHV0IHZhbHVlLiBDb25maWdhcmF0aW9uCisgICAgICogIFJldHVybiB2YWx1ZTogMCAtLSBzdWNjZXNzCisgICAgICogICAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICAgICAqKi8KKyAgICBpbnQzMl90ICgqcHJvY2Vzc19hZHZhbmNlZF9jYXB0dXJlKSAodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwgbW1fY2FtZXJhX2FkdmFuY2VkX2NhcHR1cmVfdCB0eXBlLAorICAgICAgICAgICAgIGludDhfdCBzdGFydF9mbGFnLCB2b2lkICppbl92YWx1ZSk7CisKKyAgIC8qKiBnZXRfc2Vzc2lvbl9pZDogZ2V0cyB0aGUgYmFja2VuZCBzZXNzaW9uIGlkIGZyb20gdGhlIGtlcm5lbAorICAgICAqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXJhIGhhbmRsZQorICAgICAqICAgIEBzZXNzaW9uaWQgOiBzZXNzaW9uIGlkIHRvIGJlIHJldHJpZXZlZAorICAgICAqICAgICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICAqICAgICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAgICAgKiAgTm90ZTogaWYgdGhpcyBjYWxsIHN1Y2NlZWRzLCB3ZSB3aWxsIGdldCBhIHZhbGlkIHNlc3Npb24gaWQKKyAgICAgKiovCisgICAgaW50MzJfdCAoKmdldF9zZXNzaW9uX2lkKSAodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgIHVpbnQzMl90KiBzZXNzaW9uaWQpOworCisgICAgLyoqIHN5bmNfcmVsYXRlZF9zZW5zb3JzOiBzZW5kcyBzeW5jIGNtZAorICAgICAgKiAgICBAY2FtZXJhX2hhbmRsZSA6IGNhbWVyYSBoYW5kbGUKKyAgICAgICogICAgQHJlbGF0ZWRfY2FtX2luZm8gOiByZWxhdGVkIGNhbSBpbmZvIHRvIGJlIHNlbnQgdG8gc2VydmVyCisgICAgICAqICAgICBSZXR1cm4gdmFsdWU6IDAgLS0gc3VjY2VzcworICAgICAgKiAgICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgICAgICAqICBOb3RlOiBpZiB0aGlzIGNhbGwgc3VjY2VlZHMsIHdlIHdpbGwgZ2V0IGxpbmtpbmcgZXN0YWJsaXNoZWQgaW4gYmFjayBlbmQKKyAgICAgICoqLworICAgICBpbnQzMl90ICgqc3luY19yZWxhdGVkX3NlbnNvcnMpICh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCoKKyAgICAgICAgICAgIHJlbGF0ZWRfY2FtX2luZm8pOworICAgIC8qKiBmbHVzaDogZnVuY3Rpb24gZGVmaW5pdGlvbiBmb3IgZmx1c2gKKyAgICAgKiAgQGNhbWVyYV9oYW5kbGU6IGNhbWVyYSBoYW5kbGVyCisgICAgICogIFJldHVybiB2YWx1ZTogMCAtLSBzdWNjZXNzCisgICAgICogICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgICAgICoqLworICAgIGludDMyX3QgKCpmbHVzaCkgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUpOworCisgICAvKiogcmVnaXN0ZXJfc3RyZWFtX2J1Zl9jYjogZnVjbnRpb24gZGVmaW5pdGlvbiBmb3IgcmVnaXN0ZXJpbmcgc3BlY2lhbCBzdHJlYW0gY2FsbGJhY2tzCisgICAgICogICAgQGNhbWVyYV9oYW5kbGUgOiBjYW1lciBoYW5kbGVyCisgICAgICogICAgQGNoX2lkIDogY2hhbm5lbCBoYW5kbGVyCisgICAgICogICAgQHN0cmVhbV9pZCA6IHN0cmVhbSBoYW5kbGVyCisgICAgICogICAgQGJ1Zl9jYiA6IGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICAgKiAgICBAY2JfdHlwZSA6IENhbGxiYWNrIHR5cGUgU1lOQy9BU1lOQworICAgICAqICAgIEB1c2VyZGF0YSA6IHVzZXIgZGF0YSBwb2ludGVyCisgICAgICogICAgUmV0dXJuIHZhbHVlOiAwIC0tIHN1Y2Nlc3MKKyAgICAgKiAgICAgICAgICAgICAgICAtICAgICAgIDEgLS0gZmFpbHVyZQorICAgICAqKi8KKyAgICBpbnQzMl90ICgqcmVnaXN0ZXJfc3RyZWFtX2J1Zl9jYikgKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwgdWludDMyX3Qgc3RyZWFtX2lkLCBtbV9jYW1lcmFfYnVmX25vdGlmeV90IGJ1Zl9jYiwKKyAgICAgICAgICAgIG1tX2NhbWVyYV9zdHJlYW1fY2JfdHlwZSBjYl90eXBlLCB2b2lkICp1c2VyZGF0YSk7Cit9IG1tX2NhbWVyYV9vcHNfdDsKKworLyoqIG1tX2NhbWVyYV92dGJsX3Q6IHZpcnR1YWwgdGFibGUgZm9yIGNhbWVyYSBvcGVyYXRpb25zCisqICAgIEBjYW1lcmFfaGFuZGxlIDogY2FtZXJhIGhhbmRsZXIgd2hpY2ggdW5pcXVlbHkgaWRlbnRpZmllcyBhCisqICAgICAgICAgICAgICAgICAgIGNhbWVyYSBvYmplY3QKKyogICAgQG9wcyA6IEFQSSBjYWxsIHRhYmxlCisqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjYW1lcmFfaGFuZGxlOworICAgIG1tX2NhbWVyYV9vcHNfdCAqb3BzOworfSBtbV9jYW1lcmFfdnRibF90OworCisvKiByZXR1cm4gbnVtYmVyIG9mIGNhbWVyYXMgKi8KK3VpbnQ4X3QgZ2V0X251bV9vZl9jYW1lcmFzKCk7CisKKy8qIHJldHVybiByZWZlcmVuY2UgcG9pbnRlciBvZiBjYW1lcmEgdnRibCAqLworaW50MzJfdCBjYW1lcmFfb3Blbih1aW50OF90IGNhbWVyYV9pZHgsIG1tX2NhbWVyYV92dGJsX3QgKipjYW1lcmFfb2JqKTsKKworLyogaGVscGVyIGZ1bmN0aW9ucyAqLworaW50MzJfdCBtbV9zdHJlYW1fY2FsY19vZmZzZXRfcHJldmlldyhjYW1fc3RyZWFtX2luZm9fdCAqc3RyZWFtX2luZm8sCisgICAgICAgIGNhbV9kaW1lbnNpb25fdCAqZGltLAorICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmcsCisgICAgICAgIGNhbV9zdHJlYW1fYnVmX3BsYW5lX2luZm9fdCAqYnVmX3BsYW5lcyk7CisKK2ludDMyX3QgbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3Bvc3RfdmlldyhjYW1fZm9ybWF0X3QgZm10LAorICAgICAgICBjYW1fZGltZW5zaW9uX3QgKmRpbSwKKyAgICAgICAgY2FtX3N0cmVhbV9idWZfcGxhbmVfaW5mb190ICpidWZfcGxhbmVzKTsKKworaW50MzJfdCBtbV9zdHJlYW1fY2FsY19vZmZzZXRfc25hcHNob3QoY2FtX2Zvcm1hdF90IGZtdCwKKyAgICAgICAgY2FtX2RpbWVuc2lvbl90ICpkaW0sCisgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZywKKyAgICAgICAgY2FtX3N0cmVhbV9idWZfcGxhbmVfaW5mb190ICpidWZfcGxhbmVzKTsKKworaW50MzJfdCBtbV9zdHJlYW1fY2FsY19vZmZzZXRfcmF3KGNhbV9mb3JtYXRfdCBmbXQsCisgICAgICAgIGNhbV9kaW1lbnNpb25fdCAqZGltLAorICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmcsCisgICAgICAgIGNhbV9zdHJlYW1fYnVmX3BsYW5lX2luZm9fdCAqYnVmX3BsYW5lcyk7CisKK2ludDMyX3QgbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3ZpZGVvKGNhbV9mb3JtYXRfdCBmbXQsCisgICAgICAgIGNhbV9kaW1lbnNpb25fdCAqZGltLAorICAgICAgICBjYW1fc3RyZWFtX2J1Zl9wbGFuZV9pbmZvX3QgKmJ1Zl9wbGFuZXMpOworCitpbnQzMl90IG1tX3N0cmVhbV9jYWxjX29mZnNldF9tZXRhZGF0YShjYW1fZGltZW5zaW9uX3QgKmRpbSwKKyAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nLAorICAgICAgICBjYW1fc3RyZWFtX2J1Zl9wbGFuZV9pbmZvX3QgKmJ1Zl9wbGFuZXMpOworCitpbnQzMl90IG1tX3N0cmVhbV9jYWxjX29mZnNldF9wb3N0cHJvYyhjYW1fc3RyZWFtX2luZm9fdCAqc3RyZWFtX2luZm8sCisgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZywKKyAgICAgICAgY2FtX3N0cmVhbV9idWZfcGxhbmVfaW5mb190ICpidWZfcGxhbmVzKTsKKworaW50MzJfdCBtbV9zdHJlYW1fY2FsY19vZmZzZXRfYW5hbHlzaXMoY2FtX2Zvcm1hdF90IGZtdCwKKyAgICAgICAgY2FtX2RpbWVuc2lvbl90ICpkaW0sCisgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZywKKyAgICAgICAgY2FtX3N0cmVhbV9idWZfcGxhbmVfaW5mb190ICpidWZfcGxhbmVzKTsKKwordWludDMyX3QgbW1fc3RyZWFtX2NhbGNfbGNtIChpbnQzMl90IG51bTEsIGludDMyX3QgbnVtMik7CisKK3N0cnVjdCBjYW1lcmFfaW5mbyAqZ2V0X2NhbV9pbmZvKHVpbnQzMl90IGNhbWVyYV9pZCwgY2FtX3N5bmNfdHlwZV90ICpwQ2FtVHlwZSk7CisKK3VpbnQ4X3QgaXNfeXV2X3NlbnNvcih1aW50MzJfdCBjYW1lcmFfaWQpOworCisjZW5kaWYgLypfX01NX0NBTUVSQV9JTlRFUkZBQ0VfSF9fKi8KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9jb21tb24vbW1fY2FtZXJhX3NoaW0uaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9jb21tb24vbW1fY2FtZXJhX3NoaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2IwZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9tbV9jYW1lcmFfc2hpbS5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19NTV9DQU1FUkFfU0hJTUxBWUVSX0hfCisjZGVmaW5lIF9fTU1fQ0FNRVJBX1NISU1MQVlFUl9IXworCisjaW5jbHVkZSAiY2FtX2ludGYuaCIKKworLyoKKyAqIE1DVCBzaGltIGxheWVyIEFQSXMKKyAqLworI2RlZmluZSBTSElNTEFZRVJfTElCICIvc3lzdGVtL3ZlbmRvci9saWIvbGlibW1jYW1lcmEyX21jdF9zaGltbGF5ZXIuc28iCisKK3N0cnVjdCBjYW1fc2hpbV9wYWNrZXQ7CisKKy8qCisqIEJ1bmRsZWQgZXZlbnRzIHN0cnVjdHVyZS4KKyovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBjbWRfY291bnQ7ICAgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGV2ZW50cyBpbiB0aGlzIHBhY2tldCAqLworICAgIHN0cnVjdCBjYW1fc2hpbV9wYWNrZXQgKmNtZDsgIC8qRXZlbnRzIHRvIHByb2Nlc3MqLworfSBjYW1fc2hpbV9jbWRfcGFja2V0X3Q7CisKKy8qCisqIEJ1bmRsZWQgc3RyZWFtIGV2ZW50IHN0cnVjdHVyZQorKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IHN0cmVhbV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qTnVtYmVyIG9mIHN0cmVhbXMgaW4gYSBidW5kbGUqLworICAgIGNhbV9zaGltX2NtZF9wYWNrZXRfdCBzdHJlYW1fZXZlbnRbTUFYX05VTV9TVFJFQU1TXTsgLypFdmVudCBmb3IgZGlmZmVyZW50IHN0cmVhbXMqLworfSBjYW1fc2hpbV9zdHJlYW1fY21kX3BhY2tldF90OworCisvKgorKiBDb21tYW5kIHR5cGVzIHRvIHByb2Nlc3MgaW4gc2hpbSBsYXllcgorKi8KK3R5cGVkZWYgZW51bSB7CisgICAgQ0FNX1NISU1fU0VUX1BBUk0sICAgLyp2NGwyIHNldCBwYXJhbWV0ZXIqLworICAgIENBTV9TSElNX0dFVF9QQVJNLCAgIC8qdjRsMiBnZXQgcGFyYW1ldGVyKi8KKyAgICBDQU1fU0hJTV9SRUdfQlVGLCAgICAvKlJlZy91bnJlZyBidWZmZXJzIHdpdGggYmFjay1lbmQqLworICAgIENBTV9TSElNX0JVTkRMRV9DTUQsIC8qQnVuZGxlZCBjb21tYW5kIGZvciBzdHJlYW1zKi8KK30gY2FtX3NoaW1fY21kX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjb21tYW5kOyAgICAvKlY0TDIgb3IgcHJpdmF0ZSBjb21tYW5kKi8KKyAgICB1aW50MzJfdCBzdHJlYW1faWQ7ICAvKnN0cmVhbUlEKi8KKyAgICB2b2lkICp2YWx1ZTsgICAgICAgICAgLypjb21tYW5kIHZhbHVlL2RhdGEqLworfSBjYW1fc2hpbV9jbWRfZGF0YTsKKworLyoKKyogU3RydWN0dXJlIHRvIGNvbW11bmljYXRlIGNvbW1hbmQgd2l0aCBzaGltIGxheWVyCisqLwordHlwZWRlZiBzdHJ1Y3QgY2FtX3NoaW1fcGFja2V0IHsKKyAgICB1aW50MzJfdCBzZXNzaW9uX2lkOworICAgIGNhbV9zaGltX2NtZF90eXBlIGNtZF90eXBlOyAgICAgICAgICAgICAgICAgLypDb21tYW5kIHR5cGUgdG8gcHJvY2VzcyovCisgICAgdW5pb24geworICAgICAgICBjYW1fc2hpbV9jbWRfZGF0YSBjbWRfZGF0YTsgICAgICAgICAgICAgLypnZXQvc2V0IHBhcmFtZXRlciBzdHJ1Y3R1cmUqLworICAgICAgICBjYW1fcmVnX2J1Zl90IHJlZ19idWY7ICAgICAgICAgICAgICAgICAgLypCdWZmZXIgcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIqLworICAgICAgICBjYW1fc2hpbV9zdHJlYW1fY21kX3BhY2tldF90IGJ1bmRsZV9jbWQ7LypCdW5kbGVkIGNvbW1hbmQqLworICAgIH07Cit9IGNhbV9zaGltX3BhY2tldF90OworCit0eXBlZGVmIGludDMyX3QgKCptbV9jYW1lcmFfc2hpbV9ldmVudF9oYW5kbGVyX2Z1bmMpKHVpbnQzMl90IHNlc3Npb25faWQsCisgICAgICAgIGNhbV9ldmVudF90ICpldmVudCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1fc3RhdHVzX3QgKCptbV9jYW1lcmFfc2hpbV9vcGVuX3Nlc3Npb24pIChpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgIG1tX2NhbWVyYV9zaGltX2V2ZW50X2hhbmRsZXJfZnVuYyBldnRfY2IpOworICAgIGludDMyX3QgKCptbV9jYW1lcmFfc2hpbV9jbG9zZV9zZXNzaW9uKShpbnQgc2Vzc2lvbik7CisgICAgaW50MzJfdCAoKm1tX2NhbWVyYV9zaGltX3NlbmRfY21kKShjYW1fc2hpbV9wYWNrZXRfdCAqZXZlbnQpOworfSBtbV9jYW1lcmFfc2hpbV9vcHNfdDsKKworaW50MzJfdCAoKm1tX2NhbWVyYV9zaGltX21vZHVsZV9pbml0KShtbV9jYW1lcmFfc2hpbV9vcHNfdCAqc2hpbV9vcHMpOworCisjZW5kaWYgIC8qX19NTV9DQU1FUkFfU0hJTUxBWUVSX0hfKi8KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9jb21tb24vbW1fanBlZ19pbnRlcmZhY2UuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9jb21tb24vbW1fanBlZ19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjBhYzdmCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL2NvbW1vbi9tbV9qcGVnX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNDA4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgTU1fSlBFR19JTlRFUkZBQ0VfSF8KKyNkZWZpbmUgTU1fSlBFR19JTlRFUkZBQ0VfSF8KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIlFPTVhfSnBlZ0V4dGVuc2lvbnMuaCIKKyNpbmNsdWRlICJjYW1faW50Zi5oIgorCisjZGVmaW5lIE1NX0pQRUdfTUFYX1BMQU5FUyAzCisjZGVmaW5lIE1NX0pQRUdfTUFYX0JVRiBDQU1fTUFYX05VTV9CVUZTX1BFUl9TVFJFQU0KKyNkZWZpbmUgUVVBTlRfU0laRSA2NAorI2RlZmluZSBRVEFCTEVfTUFYIDIKKyNkZWZpbmUgTU1fSlBFR19NQVhfTVBPX0lNQUdFUyAyCisKK3R5cGVkZWYgZW51bSB7CisgIE1NX0pQRUdfRk1UX1lVViwKKyAgTU1fSlBFR19GTVRfQklUU1RSRUFNCit9IG1tX2pwZWdfZm9ybWF0X3Q7CisKK3R5cGVkZWYgZW51bSB7CisgIE1NX0pQRUdfVFlQRV9KUEVHLAorICBNTV9KUEVHX1RZUEVfTVBPCit9IG1tX2pwZWdfaW1hZ2VfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNhbV9hZV9leGlmX2RlYnVnX3QgYWVfZGVidWdfcGFyYW1zOworICBjYW1fYXdiX2V4aWZfZGVidWdfdCBhd2JfZGVidWdfcGFyYW1zOworICBjYW1fYWZfZXhpZl9kZWJ1Z190IGFmX2RlYnVnX3BhcmFtczsKKyAgY2FtX2FzZF9leGlmX2RlYnVnX3QgYXNkX2RlYnVnX3BhcmFtczsKKyAgY2FtX3N0YXRzX2J1ZmZlcl9leGlmX2RlYnVnX3Qgc3RhdHNfZGVidWdfcGFyYW1zOworICBjYW1fYmVzdGF0c19idWZmZXJfZXhpZl9kZWJ1Z190IGJlc3RhdHNfZGVidWdfcGFyYW1zOworICBjYW1fYmhpc3RfYnVmZmVyX2V4aWZfZGVidWdfdCBiaGlzdF9kZWJ1Z19wYXJhbXM7CisgIGNhbV9xM2FfdHVuaW5nX2luZm9fdCBxM2FfdHVuaW5nX2RlYnVnX3BhcmFtczsKKyAgdWludDhfdCBhZV9kZWJ1Z19wYXJhbXNfdmFsaWQ7CisgIHVpbnQ4X3QgYXdiX2RlYnVnX3BhcmFtc192YWxpZDsKKyAgdWludDhfdCBhZl9kZWJ1Z19wYXJhbXNfdmFsaWQ7CisgIHVpbnQ4X3QgYXNkX2RlYnVnX3BhcmFtc192YWxpZDsKKyAgdWludDhfdCBzdGF0c19kZWJ1Z19wYXJhbXNfdmFsaWQ7CisgIHVpbnQ4X3QgYmVzdGF0c19kZWJ1Z19wYXJhbXNfdmFsaWQ7CisgIHVpbnQ4X3QgYmhpc3RfZGVidWdfcGFyYW1zX3ZhbGlkOworICB1aW50OF90IHEzYV90dW5pbmdfZGVidWdfcGFyYW1zX3ZhbGlkOworfSBtbV9qcGVnX2RlYnVnX2V4aWZfcGFyYW1zX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2FtXzNhX3BhcmFtc190IGNhbV8zYV9wYXJhbXM7CisgIHVpbnQ4X3QgY2FtXzNhX3BhcmFtc192YWxpZDsKKyAgY2FtX3NlbnNvcl9wYXJhbXNfdCBzZW5zb3JfcGFyYW1zOworICBtbV9qcGVnX2RlYnVnX2V4aWZfcGFyYW1zX3QgKmRlYnVnX3BhcmFtczsKK30gbW1fanBlZ19leGlmX3BhcmFtc190OworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIEluZGljYXRlcyBpZiBpdCBpcyBhIHNpbmdsZSBqcGVnIG9yIHBhcnQgb2YgYSBtdWx0aSBwaWN0dXJlIHNlcXVlbmNlICovCisgIG1tX2pwZWdfaW1hZ2VfdHlwZV90IHR5cGU7CisKKyAgLyogSW5kaWNhdGVzIGlmIGltYWdlIGlzIHRoZSBwcmltYXJ5IGltYWdlIGluIGEgc2VxdWVuY2Ugb2YgaW1hZ2VzLgorICBBcHBsaWNhYmxlIG9ubHkgdG8gbXVsdGkgcGljdHVyZSBmb3JtYXRzICovCisgIHVpbnQ4X3QgaXNfcHJpbWFyeTsKKworICAvKiBOdW1iZXIgb2YgaW1hZ2VzIGluIHRoZSBzZXF1ZW5jZSAqLworICB1aW50MzJfdCBudW1fb2ZfaW1hZ2VzOworCisgIC8qIEZsYWcgdG8gaW5kaWNhdGUgaWYgbXVsdGkgcGljdHVyZSBtZXRhZGF0YSBuZWVkIHRvIGJlIGFkZGVkIHRvIEV4aWYgKi8KKyAgdWludDhfdCBlbmFibGVfbWV0YWRhdGE7Cit9IG1tX2pwZWdfbXVsdGlfaW1hZ2VfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBzZXF1ZW5jZTsgICAgICAgICAgLyogZm9yIGpwZWcgYml0IHN0cmVhbXMsIGFzc2VtYmxpbmcgaXMgYmFzZWQgb24gc2VxdWVuY2UuIHNlcXVlbmNlIHN0YXJ0cyBmcm9tIDAgKi8KKyAgdWludDhfdCAqYnVmX3ZhZGRyOyAgICAgICAgLyogcHRyIHRvIGJ1ZiAqLworICBpbnQgZmQ7ICAgICAgICAgICAgICAgICAgICAvKiBmZCBvZiBidWYgKi8KKyAgc2l6ZV90IGJ1Zl9zaXplOyAgICAgICAgIC8qIHRvdGFsIHNpemUgb2YgYnVmIChoZWFkZXIgKyBpbWFnZSkgKi8KKyAgbW1fanBlZ19mb3JtYXRfdCBmb3JtYXQ7ICAgLyogYnVmZmVyIGZvcm1hdCovCisgIGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3Qgb2Zmc2V0OyAvKiBvZmZzZXQgb2YgYWxsIHRoZSBwbGFuZXMgKi8KKyAgdWludDMyX3QgaW5kZXg7IC8qIGluZGV4IHVzZWQgdG8gaWRlbnRpZnkgdGhlIGJ1ZmZlcnMgKi8KK30gbW1fanBlZ19idWZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90ICpidWZfdmFkZHI7ICAgICAgICAvKiBwdHIgdG8gYnVmICovCisgIGludCBmZDsgICAgICAgICAgICAgICAgICAgIC8qIGZkIG9mIGJ1ZiAqLworICBzaXplX3QgYnVmX2ZpbGxlZF9sZW47ICAgLyogdXNlZCBmb3Igb3V0cHV0IGltYWdlLiBmaWxsZWQgYnkgdGhlIGNsaWVudCAqLworfSBtbV9qcGVnX291dHB1dF90OworCit0eXBlZGVmIGVudW0geworICBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ1JDQkxQX0gyVjIsCisgIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDQkNSTFBfSDJWMiwKKyAgTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNSQ0JMUF9IMlYxLAorICBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gyVjEsCisgIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDUkNCTFBfSDFWMiwKKyAgTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNCQ1JMUF9IMVYyLAorICBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ1JDQkxQX0gxVjEsCisgIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDQkNSTFBfSDFWMSwKKyAgTU1fSlBFR19DT0xPUl9GT1JNQVRfTU9OT0NIUk9NRSwKKyAgTU1fSlBFR19DT0xPUl9GT1JNQVRfQklUU1RSRUFNX0gyVjIsCisgIE1NX0pQRUdfQ09MT1JfRk9STUFUX0JJVFNUUkVBTV9IMlYxLAorICBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9CSVRTVFJFQU1fSDFWMiwKKyAgTU1fSlBFR19DT0xPUl9GT1JNQVRfQklUU1RSRUFNX0gxVjEsCisgIE1NX0pQRUdfQ09MT1JfRk9STUFUX01BWAorfSBtbV9qcGVnX2NvbG9yX2Zvcm1hdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgSlBFR19KT0JfU1RBVFVTX0RPTkUgPSAwLAorICBKUEVHX0pPQl9TVEFUVVNfRVJST1IKK30ganBlZ19qb2Jfc3RhdHVzX3Q7CisKK3R5cGVkZWYgdm9pZCAoKmpwZWdfZW5jb2RlX2NhbGxiYWNrX3QpKGpwZWdfam9iX3N0YXR1c190IHN0YXR1cywKKyAgdWludDMyX3QgY2xpZW50X2hkbCwKKyAgdWludDMyX3Qgam9iSWQsCisgIG1tX2pwZWdfb3V0cHV0X3QgKnBfb3V0cHV0LAorICB2b2lkICp1c2VyRGF0YSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogc3JjIGltZyBkaW1lbnNpb24gKi8KKyAgY2FtX2RpbWVuc2lvbl90IHNyY19kaW07CisKKyAgLyoganBlZyBvdXRwdXQgZGltZW5zaW9uICovCisgIGNhbV9kaW1lbnNpb25fdCBkc3RfZGltOworCisgIC8qIGNyb3AgaW5mb3JtYXRpb24gKi8KKyAgY2FtX3JlY3RfdCBjcm9wOworfSBtbV9qcGVnX2RpbV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIG51bSBvZiBidWYgaW4gc3JjIGltZyAqLworICB1aW50MzJfdCBudW1fc3JjX2J1ZnM7CisKKyAgLyogbnVtIG9mIHNyYyB0bWIgYnVmcyAqLworICB1aW50MzJfdCBudW1fdG1iX2J1ZnM7CisKKyAgLyogbnVtIG9mIGJ1ZiBpbiBzcmMgaW1nICovCisgIHVpbnQzMl90IG51bV9kc3RfYnVmczsKKworICAvKiBzaG91bGQgY3JlYXRlIHRodW1ibmFpbCBmcm9tIG1haW4gaW1hZ2Ugb3Igbm90ICovCisgIHVpbnQzMl90IGVuY29kZV90aHVtYm5haWw7CisKKyAgLyogc3JjIGltZyBidWZzICovCisgIG1tX2pwZWdfYnVmX3Qgc3JjX21haW5fYnVmW01NX0pQRUdfTUFYX0JVRl07CisKKyAgLyogdGhpcyB3aWxsIGJlIHVzZWQgb25seSBmb3IgYml0c3RyZWFtICovCisgIG1tX2pwZWdfYnVmX3Qgc3JjX3RodW1iX2J1ZltNTV9KUEVHX01BWF9CVUZdOworCisgIC8qIHRoaXMgd2lsbCBiZSB1c2VkIG9ubHkgZm9yIGJpdHN0cmVhbSAqLworICBtbV9qcGVnX2J1Zl90IGRlc3RfYnVmW01NX0pQRUdfTUFYX0JVRl07CisKKyAgLyogbWFpbmltYWdlIGNvbG9yIGZvcm1hdCAqLworICBtbV9qcGVnX2NvbG9yX2Zvcm1hdCBjb2xvcl9mb3JtYXQ7CisKKyAgLyogdGh1bWJuYWlsIGNvbG9yIGZvcm1hdCAqLworICBtbV9qcGVnX2NvbG9yX2Zvcm1hdCB0aHVtYl9jb2xvcl9mb3JtYXQ7CisKKyAgLyoganBlZyBxdWFsaXR5OiByYW5nZSAwfjEwMCAqLworICB1aW50MzJfdCBxdWFsaXR5OworCisgIC8qIGpwZWcgdGh1bWJuYWlsIHF1YWxpdHk6IHJhbmdlIDB+MTAwICovCisgIHVpbnQzMl90IHRodW1iX3F1YWxpdHk7CisKKyAgLyogYnVmIHRvIGV4aWYgZW50cmllcywgY2FsbGVyIG5lZWRzIHRvCisgICAqIHRha2UgY2FyZSBvZiB0aGUgbWVtb3J5IG1hbmFnZSB3aXRoIGluc2lkZXIgcHRyICovCisgIFFPTVhfRVhJRl9JTkZPIGV4aWZfaW5mbzsKKworICAvKkNhbGxiYWNrIHJlZ2lzdGVyZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGVuY29kZSovCisgIGpwZWdfZW5jb2RlX2NhbGxiYWNrX3QganBlZ19jYjsKKworICAvKkFwcGRhdGEgcGFzc2VkIGJ5IHRoZSB1c2VyKi8KKyAgdm9pZCogdXNlcmRhdGE7CisKKyAgLyogdGh1bWJuYWlsIGRpbWVuc2lvbiAqLworICBtbV9qcGVnX2RpbV90IHRodW1iX2RpbTsKKworICAvKiByb3RhdGlvbiBpbmZvcm1haXRvbiAqLworICB1aW50MzJfdCByb3RhdGlvbjsKKworICAvKiB0aHVtYiByb3RhdGlvbiBpbmZvcm1haXRvbiAqLworICB1aW50MzJfdCB0aHVtYl9yb3RhdGlvbjsKKworICAvKiBtYWluIGltYWdlIGRpbWVuc2lvbiAqLworICBtbV9qcGVnX2RpbV90IG1haW5fZGltOworCisgIC8qIGVuYWJsZSBlbmNvZGVyIGJ1cnN0IG1vZGUgKi8KKyAgdWludDMyX3QgYnVyc3RfbW9kZTsKKworICAvKiBnZXQgbWVtb3J5IGZ1bmN0aW9uIHB0ciAqLworICBpbnQgKCpnZXRfbWVtb3J5KSggb214X2pwZWdfb3VwdXRfYnVmX3QgKnBfb3V0X2J1Zik7CisKKyAgLyogcmVsZWFzZSBtZW1vcnkgZnVuY3Rpb24gcHRyICovCisgIGludCAoKnB1dF9tZW1vcnkpKCBvbXhfanBlZ19vdXB1dF9idWZfdCAqcF9vdXRfYnVmKTsKKworICAvKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdG8gZ2VuZXJhdGUgdGh1bWJuYWlsIGZyb20gcG9zdHZpZXcgKi8KKyAgYm9vbCB0aHVtYl9mcm9tX3Bvc3R2aWV3OworfSBtbV9qcGVnX2VuY29kZV9wYXJhbXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBudW0gb2YgYnVmIGluIHNyYyBpbWcgKi8KKyAgdWludDMyX3QgbnVtX3NyY19idWZzOworCisgIC8qIG51bSBvZiBidWYgaW4gc3JjIGltZyAqLworICB1aW50MzJfdCBudW1fZHN0X2J1ZnM7CisKKyAgLyogc3JjIGltZyBidWZzICovCisgIG1tX2pwZWdfYnVmX3Qgc3JjX21haW5fYnVmW01NX0pQRUdfTUFYX0JVRl07CisKKyAgLyogdGhpcyB3aWxsIGJlIHVzZWQgb25seSBmb3IgYml0c3RyZWFtICovCisgIG1tX2pwZWdfYnVmX3QgZGVzdF9idWZbTU1fSlBFR19NQVhfQlVGXTsKKworICAvKiBjb2xvciBmb3JtYXQgKi8KKyAgbW1fanBlZ19jb2xvcl9mb3JtYXQgY29sb3JfZm9ybWF0OworCisgIGpwZWdfZW5jb2RlX2NhbGxiYWNrX3QganBlZ19jYjsKKworICB2b2lkKiB1c2VyZGF0YTsKKworfSBtbV9qcGVnX2RlY29kZV9wYXJhbXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBhY3RpdmUgaW5kaWNlcyBvZiB0aGUgYnVmZmVycyBmb3IgZW5jb2RpbmcgKi8KKyAgaW50MzJfdCBzcmNfaW5kZXg7CisgIGludDMyX3QgZHN0X2luZGV4OworICB1aW50MzJfdCB0aHVtYl9pbmRleDsKKyAgbW1fanBlZ19kaW1fdCB0aHVtYl9kaW07CisKKyAgLyogcm90YXRpb24gaW5mb3JtYWl0b24gKi8KKyAgdWludDMyX3Qgcm90YXRpb247CisKKyAgLyogbWFpbiBpbWFnZSBkaW1lbnNpb24gKi8KKyAgbW1fanBlZ19kaW1fdCBtYWluX2RpbTsKKworICAvKnNlc3Npb24gaWQqLworICB1aW50MzJfdCBzZXNzaW9uX2lkOworCisgIC8qIGpwZWcgb3V0cHV0IGJ1ZmZlciByZWYgY291bnQgKi8KKyAgaW50MzJfdCByZWZfY291bnQ7CisKKyAgLyogYWxsb2NhdGVkIGpwZWcgb3V0cHV0IGJ1ZmZlciAqLworICB2b2lkICphbGxvY19vdXRfYnVmZmVyOworCisgIC8qTWV0YWRhdGEgc3RyZWFtKi8KKyAgbWV0YWRhdGFfYnVmZmVyX3QgKnBfbWV0YWRhdGE7CisKKyAgLypIQUwgdmVyc2lvbiovCisgIGNhbV9oYWxfdmVyc2lvbl90IGhhbF92ZXJzaW9uOworCisgIC8qIGJ1ZiB0byBleGlmIGVudHJpZXMsIGNhbGxlciBuZWVkcyB0bworICAgKiB0YWtlIGNhcmUgb2YgdGhlIG1lbW9yeSBtYW5hZ2Ugd2l0aCBpbnNpZGVyIHB0ciAqLworICBRT01YX0VYSUZfSU5GTyBleGlmX2luZm87CisKKyAgLyogM2EgcGFyYW1ldGVycyAqLworICBtbV9qcGVnX2V4aWZfcGFyYW1zX3QgY2FtX2V4aWZfcGFyYW1zOworCisgIC8qIGpwZWcgZW5jb2RlciBRVGFibGUgKi8KKyAgdWludDhfdCBxdGFibGVfc2V0W1FUQUJMRV9NQVhdOworCisgIE9NWF9JTUFHRV9QQVJBTV9RVUFOVElaQVRJT05UQUJMRVRZUEUgcXRhYmxlW1FUQUJMRV9NQVhdOworCisgIC8qIGZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgbW9iaWNhdCAqLworICB1aW50OF90IG1vYmljYXRfbWFzazsKKworICAvKkluZm8gYXNzb2NpYXRlZCB3aXRoIG11bHRpcGxlIGltYWdlIHNlcXVlbmNlKi8KKyAgbW1fanBlZ19tdWx0aV9pbWFnZV90IG11bHRpX2ltYWdlX2luZm87CisKKyAgLyogd29yayBidWYgKi8KKyAgbW1fanBlZ19idWZfdCB3b3JrX2J1ZjsKK30gbW1fanBlZ19lbmNvZGVfam9iX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogYWN0aXZlIGluZGljZXMgb2YgdGhlIGJ1ZmZlcnMgZm9yIGVuY29kaW5nICovCisgIGludDMyX3Qgc3JjX2luZGV4OworICBpbnQzMl90IGRzdF9pbmRleDsKKyAgdWludDMyX3QgdG1iX2RzdF9pbmRleDsKKworICAvKiByb3RhdGlvbiBpbmZvcm1haXRvbiAqLworICB1aW50MzJfdCByb3RhdGlvbjsKKworICAvKiBtYWluIGltYWdlICAqLworICBtbV9qcGVnX2RpbV90IG1haW5fZGltOworCisgIC8qc2Vzc2lvbiBpZCovCisgIHVpbnQzMl90IHNlc3Npb25faWQ7Cit9IG1tX2pwZWdfZGVjb2RlX2pvYl90OworCit0eXBlZGVmIGVudW0geworICBKUEVHX0pPQl9UWVBFX0VOQ09ERSwKKyAgSlBFR19KT0JfVFlQRV9ERUNPREUsCisgIEpQRUdfSk9CX1RZUEVfTUFYCit9IG1tX2pwZWdfam9iX3R5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBtbV9qcGVnX2pvYl90eXBlX3Qgam9iX3R5cGU7CisgIHVuaW9uIHsKKyAgICBtbV9qcGVnX2VuY29kZV9qb2JfdCBlbmNvZGVfam9iOworICAgIG1tX2pwZWdfZGVjb2RlX2pvYl90IGRlY29kZV9qb2I7CisgIH07Cit9IG1tX2pwZWdfam9iX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgdzsKKyAgdWludDMyX3QgaDsKK30gbW1fZGltZW5zaW9uOworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qUHJpbWFyeSBpbWFnZSBpbiB0aGUgTVBPIHNlcXVlbmNlKi8KKyAgbW1fanBlZ19vdXRwdXRfdCBwcmltYXJ5X2ltYWdlOworCisgIC8qQWxsIGF1eGlsbGFyeSBpbWFnZXMgaW4gdGhlIHNlcXVlbmNlKi8KKyAgbW1fanBlZ19vdXRwdXRfdCBhdXhfaW1hZ2VzW01NX0pQRUdfTUFYX01QT19JTUFHRVMgLSAxXTsKKworICAvKlRvdGFsIG51bWJlciBvZiBpbWFnZXMgaW4gdGhlIE1QTyBzZXF1ZW5jZSovCisgIGludCBudW1fb2ZfaW1hZ2VzOworCisgIC8qT3V0cHV0IE1QTyBidWZmZXIqLworICBtbV9qcGVnX291dHB1dF90IG91dHB1dF9idWZmOworCisgIC8qU2l6ZSBvZiB0aGUgYWxsb2NhdGVkIG91dHB1dCBidWZmZXIqLworICBzaXplX3Qgb3V0cHV0X2J1ZmZfc2l6ZTsKK30gbW1fanBlZ19tcG9faW5mb190OworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIGNvbmZpZyBhIGpvYiAtLSBhc3luYyBjYWxsICovCisgIGludCAoKnN0YXJ0X2pvYikobW1fanBlZ19qb2JfdCogam9iLCB1aW50MzJfdCogam9iX2lkKTsKKworICAvKiBhYm9ydCBhIGpvYiAtLSBzeW5jIGNhbGwgKi8KKyAgaW50ICgqYWJvcnRfam9iKSh1aW50MzJfdCBqb2JfaWQpOworCisgIC8qIGNyZWF0ZSBhIHNlc3Npb24gKi8KKyAgaW50ICgqY3JlYXRlX3Nlc3Npb24pKHVpbnQzMl90IGNsaWVudF9oZGwsCisgICAgbW1fanBlZ19lbmNvZGVfcGFyYW1zX3QgKnBfcGFyYW1zLCB1aW50MzJfdCAqcF9zZXNzaW9uX2lkKTsKKworICAvKiBkZXN0cm95IHNlc3Npb24gKi8KKyAgaW50ICgqZGVzdHJveV9zZXNzaW9uKSh1aW50MzJfdCBzZXNzaW9uX2lkKTsKKworICAvKiBjbG9zZSBhIGpwZWcgY2xpZW50IC0tIHN5bmMgY2FsbCAqLworICBpbnQgKCpjbG9zZSkgKHVpbnQzMl90IGNsaWVudEhkbCk7CisKK30gbW1fanBlZ19vcHNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiBjb25maWcgYSBqb2IgLS0gYXN5bmMgY2FsbCAqLworICBpbnQgKCpzdGFydF9qb2IpKG1tX2pwZWdfam9iX3QqIGpvYiwgdWludDMyX3QqIGpvYl9pZCk7CisKKyAgLyogYWJvcnQgYSBqb2IgLS0gc3luYyBjYWxsICovCisgIGludCAoKmFib3J0X2pvYikodWludDMyX3Qgam9iX2lkKTsKKworICAvKiBjcmVhdGUgYSBzZXNzaW9uICovCisgIGludCAoKmNyZWF0ZV9zZXNzaW9uKSh1aW50MzJfdCBjbGllbnRfaGRsLAorICAgIG1tX2pwZWdfZGVjb2RlX3BhcmFtc190ICpwX3BhcmFtcywgdWludDMyX3QgKnBfc2Vzc2lvbl9pZCk7CisKKyAgLyogZGVzdHJveSBzZXNzaW9uICovCisgIGludCAoKmRlc3Ryb3lfc2Vzc2lvbikodWludDMyX3Qgc2Vzc2lvbl9pZCk7CisKKyAgLyogY2xvc2UgYSBqcGVnIGNsaWVudCAtLSBzeW5jIGNhbGwgKi8KKyAgaW50ICgqY2xvc2UpICh1aW50MzJfdCBjbGllbnRIZGwpOworfSBtbV9qcGVnZGVjX29wc190OworCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgLyogR2V0IE1wbyBzaXplKi8KKyAgaW50ICgqZ2V0X21wb19zaXplKShtbV9qcGVnX291dHB1dF90IGpwZWdfYnVmZmVyW01NX0pQRUdfTUFYX01QT19JTUFHRVNdLAorICAgIGludCBudW1fb2ZfaW1hZ2VzKTsKKworICAvKiBDb21wb3NlIE1QTyovCisgIGludCAoKmNvbXBvc2VfbXBvKShtbV9qcGVnX21wb19pbmZvX3QgKm1wb19pbmZvKTsKKworfSBtbV9qcGVnX21wb19vcHNfdDsKKworLyogb3BlbiBhIGpwZWcgY2xpZW50IC0tIHN5bmMgY2FsbAorICogcmV0dXJucyBjbGllbnRfaGFuZGxlLgorICogZmFpbGVkIGlmIGNsaWVudF9oYW5kbGU9MAorICoganBlZyBvcHMgdGJsIGFuZCBtcG8gb3BzIHRibCB3aWxsIGJlIGZpbGxlZCBpbiBpZiBvcGVuIHN1Y2NlZWRzCisgKiBhbmQganBlZyBtZXRhIGRhdGEgd2lsbCBiZSBjYWNoZWQgKi8KK3VpbnQzMl90IGpwZWdfb3BlbihtbV9qcGVnX29wc190ICpvcHMsIG1tX2pwZWdfbXBvX29wc190ICptcG9fb3BzLAorICBtbV9kaW1lbnNpb24gcGljdHVyZV9zaXplLAorICBjYW1fanBlZ19tZXRhZGF0YV90ICpqcGVnX21ldGFkYXRhKTsKKworLyogb3BlbiBhIGpwZWcgY2xpZW50IC0tIHN5bmMgY2FsbAorICogcmV0dXJucyBjbGllbnRfaGFuZGxlLgorICogZmFpbGVkIGlmIGNsaWVudF9oYW5kbGU9MAorICoganBlZyBvcHMgdGJsIHdpbGwgYmUgZmlsbGVkIGluIGlmIG9wZW4gc3VjY2VlZHMgKi8KK3VpbnQzMl90IGpwZWdkZWNfb3BlbihtbV9qcGVnZGVjX29wc190ICpvcHMpOworCisjZW5kaWYgLyogTU1fSlBFR19JTlRFUkZBQ0VfSF8gKi8KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL0FuZHJvaWQubWsgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OTdmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNjcgQEAKK09MRF9MT0NBTF9QQVRIIDo9ICQoTE9DQUxfUEFUSCkKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uLy4uL2NvbW1vbi5taworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK01NX0NBTV9GSUxFUyA6PSBcCisgICAgICAgIHNyYy9tbV9jYW1lcmFfaW50ZXJmYWNlLmMgXAorICAgICAgICBzcmMvbW1fY2FtZXJhLmMgXAorICAgICAgICBzcmMvbW1fY2FtZXJhX2NoYW5uZWwuYyBcCisgICAgICAgIHNyYy9tbV9jYW1lcmFfc3RyZWFtLmMgXAorICAgICAgICBzcmMvbW1fY2FtZXJhX3RocmVhZC5jIFwKKyAgICAgICAgc3JjL21tX2NhbWVyYV9zb2NrLmMKKworaWZlcSAoJChDQU1FUkFfREFFTU9OX05PVF9QUkVTRU5UKSwgdHJ1ZSkKK2Vsc2UKK0xPQ0FMX0NGTEFHUyArPSAtRERBRU1PTl9QUkVTRU5UCitlbmRpZgorCisjIFN5c3RlbSBoZWFkZXIgZmlsZSBwYXRoIHByZWZpeAorTE9DQUxfQ0ZMQUdTICs9IC1EU1lTVEVNX0hFQURFUl9QUkVGSVg9c3lzCisKK2lmZXEgKCQoc3RyaXAgJChUQVJHRVRfVVNFU19JT04pKSx0cnVlKQorICAgIExPQ0FMX0NGTEFHUyArPSAtRFVTRV9JT04KK2VuZGlmCisKK2lmbmVxICgsJChmaWx0ZXIgbXNtODk3NCBtc204OTE2IG1zbTgyMjYgbXNtODYxMCBtc204OTE2IGFwcTgwODQgbXNtODA4NCBtc204OTk0IG1zbTg5OTIgbXNtODk1MiBtc204OTM3IG1zbTg5NTMgbXNtODk5NiBtc21jb2JhbHQgbXNtZmFsY29uLCAkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpKQorICAgIExPQ0FMX0NGTEFHUyArPSAtRFZFTlVTX1BSRVNFTlQKK2VuZGlmCisKK2lmbmVxICgsJChmaWx0ZXIgbXNtODk5NiBtc21jb2JhbHQgbXNtZmFsY29uLCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSkpCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1EVUJXQ19QUkVTRU5UCitlbmRpZgorCitMT0NBTF9DRkxBR1MgKz0gLURfQU5EUk9JRF8gLURRQ0FNRVJBX1JFREVGSU5FX0xPRworTE9DQUxfQ09QWV9IRUFERVJTX1RPIDo9IG1tLWNhbWVyYS1pbnRlcmZhY2UKK0xPQ0FMX0NPUFlfSEVBREVSUyArPSAuLi9jb21tb24vY2FtX2ludGYuaAorTE9DQUxfQ09QWV9IRUFERVJTICs9IC4uL2NvbW1vbi9jYW1fdHlwZXMuaAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKExPQ0FMX1BBVEgpL2luYyBcCisgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24gXAorICAgIGhhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUvaGFyZHdhcmUgXAorICAgIHN5c3RlbS9tZWRpYS9jYW1lcmEvaW5jbHVkZSBcCisKK0xPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9JT05fSEVBUF9JRD1JT05fSU9NTVVfSEVBUF9JRAorTE9DQUxfQ19JTkNMVURFUys9ICQoa2VybmVsX2luY2x1ZGVzKQorTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChjb21tb25fZGVwcykKKworaWZuZXEgKDEsJChmaWx0ZXIgMSwkKHNoZWxsIGVjaG8gIiQkKCggJChQTEFURk9STV9TREtfVkVSU0lPTikgPj0gMTcgKSkiICkpKQorICBMT0NBTF9DRkxBR1MgKz0gLWluY2x1ZGUgYmlvbmljL2xpYmMva2VybmVsL2NvbW1vbi9saW51eC9zb2NrZXQuaAorICBMT0NBTF9DRkxBR1MgKz0gLWluY2x1ZGUgYmlvbmljL2xpYmMva2VybmVsL2NvbW1vbi9saW51eC91bi5oCitlbmRpZgorCitMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKE1NX0NBTV9GSUxFUykKKworTE9DQUxfTU9EVUxFICAgICAgICAgICA6PSBsaWJtbWNhbWVyYV9pbnRlcmZhY2UKK0xPQ0FMX1BSRUxJTktfTU9EVUxFICAgOj0gZmFsc2UKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliZGwgbGliY3V0aWxzIGxpYmxvZworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfMzJfQklUX09OTFkgOj0gJChCT0FSRF9RVElfQ0FNRVJBXzMyQklUX09OTFkpCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK0xPQ0FMX1BBVEggOj0gJChPTERfTE9DQUxfUEFUSCkKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL2luYy9tbV9jYW1lcmEuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL2luYy9tbV9jYW1lcmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGYxNThmCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2UvaW5jL21tX2NhbWVyYS5oCkBAIC0wLDAgKzEsNzgxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19NTV9DQU1FUkFfSF9fCisjZGVmaW5lIF9fTU1fQ0FNRVJBX0hfXworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8cG9sbC5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhX2NvbW1vbi5oIgorI2luY2x1ZGUgImNhbV9zZW1hcGhvcmUuaCIKKyNpbmNsdWRlICJtbV9jYW1lcmFfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibW1fY2FtZXJhX3NoaW0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRGF0YSBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIG51bSBvZiBjYWxsYmFja3MgYWxsb3dlZCBmb3IgYW4gZXZlbnQgdHlwZSAqLworI2RlZmluZSBNTV9DQU1FUkFfRVZUX0VOVFJZX01BWCA0CisvKiBudW0gb2YgZGF0YSBjYWxsYmFja3MgYWxsb3dlZCBpbiBhIHN0cmVhbSBvYmogKi8KKyNkZWZpbmUgTU1fQ0FNRVJBX1NUUkVBTV9CVUZfQ0JfTUFYIDQKKy8qIG51bSBvZiBkYXRhIHBvbGwgdGhyZWFkcyBhbGxvd2VkIGluIGEgY2hhbm5lbCBvYmogKi8KKyNkZWZpbmUgTU1fQ0FNRVJBX0NIQU5ORUxfUE9MTF9USFJFQURfTUFYIDEKKworI2RlZmluZSBNTV9DQU1FUkFfREVWX05BTUVfTEVOIDMyCisjZGVmaW5lIE1NX0NBTUVSQV9ERVZfT1BFTl9UUklFUyAyMAorI2RlZmluZSBNTV9DQU1FUkFfREVWX09QRU5fUkVUUllfU0xFRVAgMjAKKyNkZWZpbmUgVEhSRUFEX05BTUVfU0laRSAxNQorCisvKiBGdXR1cmUgZnJhbWUgaWR4LCBsYXJnZSBlbm91Z2ggdG8gbWFrZSBzdXJlIGNhcHR1cmUKKyogc2V0dGluZ3MgY2FuIGJlIGFwcGxpZWQgYW5kIHNtYWxsIGVub3VnaCB0byBzdGlsbCBjYXB0dXJlIGFuIGltYWdlICovCisjZGVmaW5lIE1NX0NBTUVSQV9NQVhfRlVUVVJFX0ZSQU1FX1dBSVQgMTAwCisjZGVmaW5lIFdBSVRfVElNRU9VVCA1CisKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKS9zaXplb2YoKGEpWzBdKSkKKworc3RydWN0IG1tX2NoYW5uZWw7CitzdHJ1Y3QgbW1fc3RyZWFtOworc3RydWN0IG1tX2NhbWVyYV9vYmo7CisKK3R5cGVkZWYgaW50NjRfdCBuc2Vjc190OworCit0eXBlZGVmIGVudW0KK3sKKyAgICBNTV9DQU1FUkFfQ01EX1RZUEVfREFUQV9DQiwgICAgLyogZGF0YUIgQ01EICovCisgICAgTU1fQ0FNRVJBX0NNRF9UWVBFX0VWVF9DQiwgICAgIC8qIGV2dENCIENNRCAqLworICAgIE1NX0NBTUVSQV9DTURfVFlQRV9FWElULCAgICAgICAvKiBFWElUICovCisgICAgTU1fQ0FNRVJBX0NNRF9UWVBFX1JFUV9EQVRBX0NCLC8qIHJlcXVlc3QgZGF0YSAqLworICAgIE1NX0NBTUVSQV9DTURfVFlQRV9TVVBFUl9CVUZfREFUQV9DQiwgICAgLyogc3VwZXJidWYgZGF0YUIgQ01EICovCisgICAgTU1fQ0FNRVJBX0NNRF9UWVBFX0NPTkZJR19OT1RJRlksIC8qIGNvbmZpZ3VyZSBub3RpZnkgbW9kZSAqLworICAgIE1NX0NBTUVSQV9DTURfVFlQRV9TVEFSVF9aU0wsIC8qIHN0YXJ0IHpzbCBzbmFwc2hvdCBmb3IgY2hhbm5lbCAqLworICAgIE1NX0NBTUVSQV9DTURfVFlQRV9TVE9QX1pTTCwgLyogc3RvcCB6c2wgc25hcHNob3QgZm9yIGNoYW5uZWwgKi8KKyAgICBNTV9DQU1FUkFfQ01EX1RZUEVfRkxVU0hfUVVFVUUsIC8qIGZsdXNoIHF1ZXVlICovCisgICAgTU1fQ0FNRVJBX0NNRF9UWVBFX0dFTkVSQUwsICAvKiBnZW5lcmFsIGNtZCAqLworICAgIE1NX0NBTUVSQV9DTURfVFlQRV9NQVgKK30gbW1fY2FtZXJhX2NtZGNiX3R5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IHN0cmVhbV9pZDsKKyAgICB1aW50MzJfdCBmcmFtZV9pZHg7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqYnVmOyAvKiByZWYgdG8gYnVmICovCit9IG1tX2NhbWVyYV9idWZfaW5mb190OworCit0eXBlZGVmIGVudW0geworICAgIE1NX0NBTUVSQV9HRU5FUklDX0NNRF9UWVBFX0FFX0JSQUNLRVRJTkcsCisgICAgTU1fQ0FNRVJBX0dFTkVSSUNfQ01EX1RZUEVfQUZfQlJBQ0tFVElORywKKyAgICBNTV9DQU1FUkFfR0VORVJJQ19DTURfVFlQRV9GTEFTSF9CUkFDS0VUSU5HLAorICAgIE1NX0NBTUVSQV9HRU5FUklDX0NNRF9UWVBFX1pPT01fMVgsCisgICAgTU1fQ0FNRVJBX0dFTkVSSUNfQ01EX1RZUEVfQ0FQVFVSRV9TRVRUSU5HLAorfSBtbV9jYW1lcmFfZ2VuZXJpY19jbWRfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbW1fY2FtZXJhX2dlbmVyaWNfY21kX3R5cGVfdCB0eXBlOworICAgIHVpbnQzMl90IHBheWxvYWRbMzJdOworICAgIHVuaW9uIHsKKyAgICAgICAgY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QgZnJhbWVfY29uZmlnOworICAgIH07Cit9IG1tX2NhbWVyYV9nZW5lcmljX2NtZF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgZnJhbWVfaWR4OworICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlOworfSBtbV9jYW1lcmFfZmx1c2hfY21kX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBtbV9jYW1lcmFfY21kY2JfdHlwZV90IGNtZF90eXBlOworICAgIHVuaW9uIHsKKyAgICAgICAgbW1fY2FtZXJhX2J1Zl9pbmZvX3QgYnVmOyAgICAvKiBmcmFtZSBidWYgaWYgZGF0YUNCICovCisgICAgICAgIG1tX2NhbWVyYV9ldmVudF90IGV2dDsgICAgICAgLyogZXZ0IGlmIGV2dENCICovCisgICAgICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCBzdXBlcmJ1ZjsgLyogc3VwZXJidWYgaWYgc3VwZXJidWYgZGF0YUNCKi8KKyAgICAgICAgbW1fY2FtZXJhX3JlcV9idWZfdCByZXFfYnVmOyAvKiBudW0gb2YgYnVmIHJlcXVlc3RlZCAqLworICAgICAgICBtbV9jYW1lcmFfZmx1c2hfY21kX3QgZmx1c2hfY21kOyAvKiBmcmFtZSBpZHggYm91bmRhcnkgZm9yIGZsdXNoIHN1cGVyYnVmIHF1ZXVlKi8KKyAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl9ub3RpZnlfbW9kZV90IG5vdGlmeV9tb2RlOyAvKiBub3RpZmljYXRpb24gbW9kZSAqLworICAgICAgICBtbV9jYW1lcmFfZ2VuZXJpY19jbWRfdCBnZW5fY21kOworICAgIH0gdTsKK30gbW1fY2FtZXJhX2NtZGNiX3Q7CisKK3R5cGVkZWYgdm9pZCAoKm1tX2NhbWVyYV9jbWRfY2JfdCkobW1fY2FtZXJhX2NtZGNiX3QgKiBjbWRfY2IsIHZvaWQqIHVzZXJfZGF0YSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IGlzX2FjdGl2ZTsgICAgIC8qaW5kaWNhdGVzIHdoZXRoZXIgdGhyZWFkIGlzIGFjdGl2ZSBvciBub3QgKi8KKyAgICBjYW1fcXVldWVfdCBjbWRfcXVldWU7IC8qIGNtZCBxdWV1ZSAocXVldWluZyBkYXRhQ0IsIGFzeW5jQ0IsIG9yIGV4aXRDTUQpICovCisgICAgcHRocmVhZF90IGNtZF9waWQ7ICAgICAgICAgICAvKiBjbWQgdGhyZWFkIElEICovCisgICAgY2FtX3NlbWFwaG9yZV90IGNtZF9zZW07ICAgICAvKiBzZW1hcGhvcmUgZm9yIGNtZCB0aHJlYWQgKi8KKyAgICBjYW1fc2VtYXBob3JlX3Qgc3luY19zZW07ICAgICAvKiBzZW1hcGhvcmUgZm9yIHN5bmNocm9uaXphdGlvbiB3aXRoIGNtZCB0aHJlYWQgKi8KKyAgICBtbV9jYW1lcmFfY21kX2NiX3QgY2I7ICAgICAgIC8qIGNiIGZvciBjbWQgKi8KKyAgICB2b2lkKiB1c2VyX2RhdGE7ICAgICAgICAgICAgIC8qIHVzZXJfZGF0YSBmb3IgY2IgKi8KKyAgICBjaGFyIHRocmVhZE5hbWVbVEhSRUFEX05BTUVfU0laRV07Cit9IG1tX2NhbWVyYV9jbWRfdGhyZWFkX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTU1fQ0FNRVJBX1BPTExfVFlQRV9FVlQsCisgICAgTU1fQ0FNRVJBX1BPTExfVFlQRV9EQVRBLAorICAgIE1NX0NBTUVSQV9QT0xMX1RZUEVfTUFYCit9IG1tX2NhbWVyYV9wb2xsX3RocmVhZF90eXBlX3Q7CisKKy8qIGZ1bmN0aW9uIHB0ciBkZWZpbmVkIGZvciBwb2xsIG5vdGlmeSBDQiwKKyAqIHJlZ2lzdGVyZWQgYXQgcG9sbCB0aHJlYWQgd2l0aCBwb2xsIGZkICovCit0eXBlZGVmIHZvaWQgKCptbV9jYW1lcmFfcG9sbF9ub3RpZnlfdCkodm9pZCAqdXNlcl9kYXRhKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgZmQ7CisgICAgbW1fY2FtZXJhX3BvbGxfbm90aWZ5X3Qgbm90aWZ5X2NiOworICAgIHVpbnQzMl90IGhhbmRsZXI7CisgICAgdm9pZCogdXNlcl9kYXRhOworfSBtbV9jYW1lcmFfcG9sbF9lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX3R5cGVfdCBwb2xsX3R5cGU7CisgICAgLyogYXJyYXkgdG8gc3RvcmUgcG9sbCBmZCBhbmQgY2IgaW5mbworICAgICAqIGZvciBNTV9DQU1FUkFfUE9MTF9UWVBFX0VWVCwgb25seSBpbmRleCAwIGlzIHZhbGlkOworICAgICAqIGZvciBNTV9DQU1FUkFfUE9MTF9UWVBFX0RBVEEsIGRlcGVuZHMgb24gdmFsaWQgc3RyZWFtIGZkICovCisgICAgbW1fY2FtZXJhX3BvbGxfZW50cnlfdCBwb2xsX2VudHJpZXNbTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFXTsKKyAgICBpbnQzMl90IHBmZHNbMl07CisgICAgcHRocmVhZF90IHBpZDsKKyAgICBpbnQzMl90IHN0YXRlOworICAgIGludCB0aW1lb3V0bXM7CisgICAgdWludDMyX3QgY21kOworICAgIHN0cnVjdCBwb2xsZmQgcG9sbF9mZHNbTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFICsgMV07CisgICAgdWludDhfdCBudW1fZmRzOworICAgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKKyAgICBwdGhyZWFkX2NvbmRfdCBjb25kX3Y7CisgICAgaW50MzJfdCBzdGF0dXM7CisgICAgY2hhciB0aHJlYWROYW1lW1RIUkVBRF9OQU1FX1NJWkVdOworICAgIC8vdm9pZCAqbXlfb2JqOworfSBtbV9jYW1lcmFfcG9sbF90aHJlYWRfdDsKKworLyogbW1fc3RyZWFtICovCit0eXBlZGVmIGVudW0geworICAgIE1NX1NUUkVBTV9TVEFURV9OT1RVU0VEID0gMCwgICAgICAvKiBub3QgdXNlZCAqLworICAgIE1NX1NUUkVBTV9TVEFURV9JTklURUQsICAgICAgICAgICAvKiBpbml0ZWQgICovCisgICAgTU1fU1RSRUFNX1NUQVRFX0FDUVVJUkVELCAgICAgICAgIC8qIGFjcXVpcmVkLCBmZCBvcGVuZWQgICovCisgICAgTU1fU1RSRUFNX1NUQVRFX0NGRywgICAgICAgICAgICAgIC8qIGZtdCAmIGRpbSBjb25maWd1cmVkICovCisgICAgTU1fU1RSRUFNX1NUQVRFX0JVRkZFRCwgICAgICAgICAgIC8qIGJ1ZiBhbGxvY2F0ZWQgKi8KKyAgICBNTV9TVFJFQU1fU1RBVEVfUkVHLCAgICAgICAgICAgICAgLyogYnVmIHJlZ2dlZCwgc3RyZWFtIG9mZiAqLworICAgIE1NX1NUUkVBTV9TVEFURV9BQ1RJVkUsICAgICAgICAgICAvKiBhY3RpdmUgKi8KKyAgICBNTV9TVFJFQU1fU1RBVEVfTUFYCit9IG1tX3N0cmVhbV9zdGF0ZV90eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTU1fU1RSRUFNX0VWVF9BQ1FVSVJFLAorICAgIE1NX1NUUkVBTV9FVlRfUkVMRUFTRSwKKyAgICBNTV9TVFJFQU1fRVZUX1NFVF9GTVQsCisgICAgTU1fU1RSRUFNX0VWVF9HRVRfQlVGLAorICAgIE1NX1NUUkVBTV9FVlRfUFVUX0JVRiwKKyAgICBNTV9TVFJFQU1fRVZUX1JFR19CVUYsCisgICAgTU1fU1RSRUFNX0VWVF9VTlJFR19CVUYsCisgICAgTU1fU1RSRUFNX0VWVF9TVEFSVCwKKyAgICBNTV9TVFJFQU1fRVZUX1NUT1AsCisgICAgTU1fU1RSRUFNX0VWVF9RQlVGLAorICAgIE1NX1NUUkVBTV9FVlRfU0VUX1BBUk0sCisgICAgTU1fU1RSRUFNX0VWVF9HRVRfUEFSTSwKKyAgICBNTV9TVFJFQU1fRVZUX0RPX0FDVElPTiwKKyAgICBNTV9TVFJFQU1fRVZUX0dFVF9RVUVVRURfQlVGX0NPVU5ULAorICAgIE1NX1NUUkVBTV9FVlRfTUFYCit9IG1tX3N0cmVhbV9ldnRfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCBjYjsKKyAgICB2b2lkICp1c2VyX2RhdGE7CisgICAgLyogY2JfY291bnQgPSAtMTogaW5maW5pdGUKKyAgICAgKiBjYl9jb3VudCA+IDA6IHJlZ2lzdGVyIG9ubHkgZm9yIHJlcXVpcmVkIHRpbWVzICovCisgICAgaW50OF90IGNiX2NvdW50OworICAgIG1tX2NhbWVyYV9zdHJlYW1fY2JfdHlwZSBjYl90eXBlOworfSBtbV9zdHJlYW1fZGF0YV9jYl90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogYnVmIHJlZmVyZW5jZSBjb3VudCAqLworICAgIHVpbnQ4X3QgYnVmX3JlZmNudDsKKworICAgIC8qIFRoaXMgZmxhZyBpcyB0byBpbmRpY2F0ZSBpZiBhZnRlciBhbGxvY2F0aW9uLAorICAgICAqIHRoZSBjb3JyZXNwb25kaW5nIGJ1ZiBuZWVkcyB0byBxYnVmIGludG8ga2VybmVsCisgICAgICogKGUuZy4gZm9yIHByZXZpZXcgdXNlY2FzZSwgZGlzcGxheSBuZWVkcyB0byBob2xkIHR3byBidWZzLAorICAgICAqIHNvIG5vIG5lZWQgdG8gcWJ1ZiB0aGVzZSB0d28gYnVmcyBpbml0aWFsbHkpICovCisgICAgdWludDhfdCBpbml0aWFsX3JlZ19mbGFnOworCisgICAgLyogaW5kaWNhdGUgaWYgYnVmIGlzIGluIGtlcm5lbCgxKSBvciBjbGllbnQoMCkgKi8KKyAgICB1aW50OF90IGluX2tlcm5lbDsKKyAgICAvKmluZGljYXRlIGlmIHRoaXMgYnVmZmVyIGlzIG1hcHBlZCB0byBkYWVtb24qLworICAgIGludDhfdCBtYXBfc3RhdHVzOworfSBtbV9zdHJlYW1fYnVmX3N0YXR1c190OworCit0eXBlZGVmIHN0cnVjdCBtbV9zdHJlYW0geworICAgIHVpbnQzMl90IG15X2hkbDsgLyogbG9jYWwgc3RyZWFtIGlkICovCisgICAgdWludDMyX3Qgc2VydmVyX3N0cmVhbV9pZDsgLyogc3RyZWFtIGlkIGZyb20gc2VydmVyICovCisgICAgaW50MzJfdCBmZDsKKyAgICBtbV9zdHJlYW1fc3RhdGVfdHlwZV90IHN0YXRlOworCisgICAgLyogc3RyZWFtIGluZm8qLworICAgIGNhbV9zdHJlYW1faW5mb190ICpzdHJlYW1faW5mbzsKKworICAgIC8qIHBhZGRpbmcgaW5mbyAqLworICAgIGNhbV9wYWRkaW5nX2luZm9fdCBwYWRkaW5nX2luZm87CisKKyAgICAvKiBvZmZzZXQgKi8KKyAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90IGZyYW1lX29mZnNldDsKKworICAgIHB0aHJlYWRfbXV0ZXhfdCBjbWRfbG9jazsgLyogbG9jayB0byBwcm90ZWN0IGNtZF90aHJlYWQgKi8KKyAgICBtbV9jYW1lcmFfY21kX3RocmVhZF90IGNtZF90aHJlYWQ7CisKKyAgICAvKiBkYXRhQ0IgcmVnaXN0ZXJlZCBvbiB0aGlzIHN0cmVhbSBvYmogKi8KKyAgICBwdGhyZWFkX211dGV4X3QgY2JfbG9jazsgLyogY2IgbG9jayB0byBwcm90ZWN0IGJ1Zl9jYiAqLworICAgIG1tX3N0cmVhbV9kYXRhX2NiX3QgYnVmX2NiW01NX0NBTUVSQV9TVFJFQU1fQlVGX0NCX01BWF07CisKKyAgICAvKiBzdHJlYW0gYnVmZmVyIG1hbmFnZW1lbnQgKi8KKyAgICBwdGhyZWFkX211dGV4X3QgYnVmX2xvY2s7CisgICAgdWludDhfdCBidWZfbnVtOyAvKiBudW0gb2YgYnVmZmVycyBhbGxvY2F0ZWQgKi8KKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90KiBidWY7IC8qIHB0ciB0byBidWYgYXJyYXkgKi8KKyAgICBtbV9zdHJlYW1fYnVmX3N0YXR1c190IGJ1Zl9zdGF0dXNbQ0FNX01BWF9OVU1fQlVGU19QRVJfU1RSRUFNXTsgLyogcHRyIHRvIGJ1ZiBzdGF0dXMgYXJyYXkgKi8KKworICAgIHVpbnQ4X3QgcGxhbmVfYnVmX251bTsgLyogbnVtIG9mIHBsYW5lIGJ1ZmZlcnMgYWxsb2NhdGVkICBVc2VkIG9ubHkgaW4gQmF0Y2ggbW9kZSovCisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqcGxhbmVfYnVmOyAvKlBvaW50ZXIgdG8gcGxhbmUgYnVmZmVyIGFycmF5IFVzZWQgb25seSBpbiBCYXRjaCBtb2RlICovCisgICAgaW50MzJfdCBjdXJfYnVmX2lkeDsgLyogQ3VycmVudCBjb250YWluZXIgYnVmZmVyIGFjdGl2ZSBmaWxsaW5nLiBVc2VkIG9ubHkgaW4gQmF0Y2ggbW9kZSovCisgICAgdWludDhfdCBjdXJfYnVmc19zdGFnZWQ7IC8qTnVtYmVyIG9mIHBsYW5lIGJ1ZiBmcmVlZCBieSBIQUwgZm9yIHRoaXMgdXNyIGJ1ZiovCisKKworICAgIC8qIHJlZmVyZW5jZSB0byBwYXJlbnQgY2hhbm5lbF9vYmogKi8KKyAgICBzdHJ1Y3QgbW1fY2hhbm5lbCogY2hfb2JqOworCisgICAgdWludDhfdCBpc19idW5kbGVkOyAvKiBmbGFnIGlmIHN0cmVhbSBpcyBidW5kbGVkICovCisKKyAgICAvKiByZWZlcmVuY2UgdG8gbGlua2VkIGNoYW5uZWxfb2JqICovCisgICAgc3RydWN0IG1tX2NoYW5uZWwqIGxpbmtlZF9vYmo7CisgICAgc3RydWN0IG1tX3N0cmVhbSAqIGxpbmtlZF9zdHJlYW07IC8qIG9yaWdpbmFsIHN0cmVhbSAqLworICAgIHVpbnQ4X3QgaXNfbGlua2VkOyAvKiBmbGFnIGlmIHN0cmVhbSBpcyBsaW5rZWQgKi8KKworICAgIG1tX2NhbWVyYV9zdHJlYW1fbWVtX3Z0YmxfdCBtZW1fdnRibDsgLyogbWVtIG9wcyB0YmwgKi8KKworICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90IG1hcF9vcHM7CisKKyAgICBpbnQ4X3QgcXVldWVkX2J1ZmZlcl9jb3VudDsKKworICAgIC8qbGF0ZXN0IHRpbWVzdGFtcCBvZiB0aGlzIHN0cmVhbSBmcmFtZSByZWNlaXZlZCAmIGxhc3QgZnJhbWVJRCovCisgICAgdWludDMyX3QgcHJldl9mcmFtZUlEOworICAgIG5zZWNzX3QgcHJldl90aW1lc3RhbXA7CisKKyAgICAvKiBOZWVkIHRvIHdhaXQgZm9yIGJ1ZmZlciBtYXBwaW5nIGJlZm9yZSBzdHJlYW0tb24qLworICAgIHB0aHJlYWRfY29uZF90IGJ1Zl9jb25kOworfSBtbV9zdHJlYW1fdDsKKworLyogbW1fY2hhbm5lbCAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBNTV9DSEFOTkVMX1NUQVRFX05PVFVTRUQgPSAwLCAgIC8qIG5vdCB1c2VkICovCisgICAgTU1fQ0hBTk5FTF9TVEFURV9TVE9QUEVELCAgICAgICAvKiBzdG9wcGVkICovCisgICAgTU1fQ0hBTk5FTF9TVEFURV9BQ1RJVkUsICAgICAgICAvKiBhY3RpdmUsIGF0IGxlYXN0IG9uZSBzdHJlYW0gYWN0aXZlICovCisgICAgTU1fQ0hBTk5FTF9TVEFURV9QQVVTRUQsICAgICAgICAvKiBwYXVzZWQgKi8KKyAgICBNTV9DSEFOTkVMX1NUQVRFX01BWAorfSBtbV9jaGFubmVsX3N0YXRlX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNTV9DSEFOTkVMX0VWVF9BRERfU1RSRUFNLAorICAgIE1NX0NIQU5ORUxfRVZUX0RFTF9TVFJFQU0sCisgICAgTU1fQ0hBTk5FTF9FVlRfTElOS19TVFJFQU0sCisgICAgTU1fQ0hBTk5FTF9FVlRfQ09ORklHX1NUUkVBTSwKKyAgICBNTV9DSEFOTkVMX0VWVF9HRVRfQlVORExFX0lORk8sCisgICAgTU1fQ0hBTk5FTF9FVlRfU1RBUlQsCisgICAgTU1fQ0hBTk5FTF9FVlRfU1RPUCwKKyAgICBNTV9DSEFOTkVMX0VWVF9QQVVTRSwKKyAgICBNTV9DSEFOTkVMX0VWVF9SRVNVTUUsCisgICAgTU1fQ0hBTk5FTF9FVlRfUkVRVUVTVF9TVVBFUl9CVUYsCisgICAgTU1fQ0hBTk5FTF9FVlRfQ0FOQ0VMX1JFUVVFU1RfU1VQRVJfQlVGLAorICAgIE1NX0NIQU5ORUxfRVZUX0ZMVVNIX1NVUEVSX0JVRl9RVUVVRSwKKyAgICBNTV9DSEFOTkVMX0VWVF9DT05GSUdfTk9USUZZX01PREUsCisgICAgTU1fQ0hBTk5FTF9FVlRfU1RBUlRfWlNMX1NOQVBTSE9ULAorICAgIE1NX0NIQU5ORUxfRVZUX1NUT1BfWlNMX1NOQVBTSE9ULAorICAgIE1NX0NIQU5ORUxfRVZUX01BUF9TVFJFQU1fQlVGLAorICAgIE1NX0NIQU5ORUxfRVZUX1VOTUFQX1NUUkVBTV9CVUYsCisgICAgTU1fQ0hBTk5FTF9FVlRfU0VUX1NUUkVBTV9QQVJNLAorICAgIE1NX0NIQU5ORUxfRVZUX0dFVF9TVFJFQU1fUEFSTSwKKyAgICBNTV9DSEFOTkVMX0VWVF9ET19TVFJFQU1fQUNUSU9OLAorICAgIE1NX0NIQU5ORUxfRVZUX0RFTEVURSwKKyAgICBNTV9DSEFOTkVMX0VWVF9BRl9CUkFDS0VUSU5HLAorICAgIE1NX0NIQU5ORUxfRVZUX0FFX0JSQUNLRVRJTkcsCisgICAgTU1fQ0hBTk5FTF9FVlRfRkxBU0hfQlJBQ0tFVElORywKKyAgICBNTV9DSEFOTkVMX0VWVF9aT09NXzFYLAorICAgIE1NX0NBTUVSQV9FVlRfQ0FQVFVSRV9TRVRUSU5HLAorICAgIE1NX0NIQU5ORUxfRVZUX0dFVF9TVFJFQU1fUVVFVUVEX0JVRl9DT1VOVCwKKyAgICBNTV9DSEFOTkVMX0VWVF9NQVBfU1RSRUFNX0JVRlMsCisgICAgTU1fQ0hBTk5FTF9FVlRfUkVHX1NUUkVBTV9CVUZfQ0IKK30gbW1fY2hhbm5lbF9ldnRfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgc3RyZWFtX2lkOworICAgIG1tX2NhbWVyYV9zdHJlYW1fY29uZmlnX3QgKmNvbmZpZzsKK30gbW1fZXZ0X3BheWxvZF9jb25maWdfc3RyZWFtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBzdHJlYW1faWQ7CisgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90ICpwYXJtczsKK30gbW1fZXZ0X3BheWxvZF9zZXRfZ2V0X3N0cmVhbV9wYXJtc190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgc3RyZWFtX2lkOworICAgIHZvaWQgKmFjdGlvbnM7Cit9IG1tX2V2dF9wYXlsb2RfZG9fc3RyZWFtX2FjdGlvbl90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgc3RyZWFtX2lkOworICAgIG1tX3N0cmVhbV9kYXRhX2NiX3QgYnVmX2NiOworfSBtbV9ldnRfcGF5bG9kX3JlZ19zdHJlYW1fYnVmX2NiOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDhfdCBudW1fb2ZfYnVmczsKKyAgICBtbV9jYW1lcmFfYnVmX2luZm9fdCBzdXBlcl9idWZbTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFXTsKKyAgICB1aW50OF90IG1hdGNoZWQ7CisgICAgdWludDhfdCBleHBlY3RlZF9mcmFtZTsKKyAgICB1aW50MzJfdCBmcmFtZV9pZHg7CisgICAgLyogdW5tYXRjaGVkIG1ldGEgaWR4IG5lZWRlZCBpbiBjYXNlIG9mIGxvdyBwcmlvcml0eSBxdWV1ZSAqLworICAgIHVpbnQzMl90IHVubWF0Y2hlZF9tZXRhX2lkeDsKK30gbW1fY2hhbm5lbF9xdWV1ZV9ub2RlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1fcXVldWVfdCBxdWU7CisgICAgdWludDhfdCBudW1fc3RyZWFtczsKKyAgICAvKiBjb250YWluZXIgZm9yIGJ1bmRsZWQgc3RyZWFtIGhhbmRsZXJzICovCisgICAgdWludDMyX3QgYnVuZGxlZF9zdHJlYW1zW01BWF9TVFJFQU1fTlVNX0lOX0JVTkRMRV07CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfYXR0cl90IGF0dHI7CisgICAgdWludDMyX3QgZXhwZWN0ZWRfZnJhbWVfaWQ7CisgICAgdWludDMyX3QgbWF0Y2hfY250OworICAgIHVpbnQzMl90IGV4cGVjdGVkX2ZyYW1lX2lkX3dpdGhvdXRfbGVkOworICAgIHVpbnQzMl90IGxlZF9vbl9zdGFydF9mcmFtZV9pZDsKKyAgICB1aW50MzJfdCBsZWRfb2ZmX3N0YXJ0X2ZyYW1lX2lkOworICAgIHVpbnQzMl90IGxlZF9vbl9udW1fZnJhbWVzOworICAgIHVpbnQzMl90IG9uY2U7CisgICAgdWludDMyX3QgZnJhbWVfc2tpcF9jb3VudDsKKyAgICB1aW50MzJfdCBnb29kX2ZyYW1lX2lkOworfSBtbV9jaGFubmVsX3F1ZXVlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IGlzX2FjdGl2ZTsgLyogZmxhZyB0byBpbmRpY2F0ZSBpZiBidW5kbGUgaXMgdmFsaWQgKi8KKyAgICAvKiBxdWV1ZSB0byBzdG9yZSBidW5kbGVkIHN1cGVyIGJ1ZmZlcnMgKi8KKyAgICBtbV9jaGFubmVsX3F1ZXVlX3Qgc3VwZXJidWZfcXVldWU7CisgICAgbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCBzdXBlcl9idWZfbm90aWZ5X2NiOworICAgIHZvaWQgKnVzZXJfZGF0YTsKK30gbW1fY2hhbm5lbF9idW5kbGVfdDsKKworLyogTm9kZXMgdXNlZCBmb3IgZnJhbWUgc3luYyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIEZyYW1lIGlkeCAqLworICAgIHVpbnQzMl90IGZyYW1lX2lkeDsKKyAgICAvKiBGcmFtZSBwcmVzZW50IGZvciBjb3JyZXNwb25kaW5nIGNoYW5uZWwqLworICAgIHVpbnQzMl90IGZyYW1lX3ZhbGlkW01BWF9OVU1fQ0FNRVJBX1BFUl9CVU5ETEVdOworICAgIC8qIEZyYW1lIHByZXNlbnQgaW4gYWxsIGNoYW5uZWxzKi8KKyAgICB1aW50MzJfdCBtYXRjaGVkOworfSBtbV9jaGFubmVsX3N5bmNfbm9kZV90OworCisvKiBGcmFtZSBzeW5jIGluZm9ybWF0aW9uICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogTnVtYmVyIG9mIGNhbWVyYSBjaGFubmVscyB0aGF0IG5lZWQgdG8gYmUgc3luY2VkKi8KKyAgICB1aW50OF90IG51bV9jYW07CisgICAgLyogcG9zaXRpb24gb2YgdGhlIG5leHQgbm9kZSB0byBiZSB1cGRhdGVkICovCisgICAgdWludDhfdCBwb3M7CisgICAgLyogY2lyY3VsYXIgbm9kZSBhcnJheSB1c2VkIHRvIHN0b3JlIGZyYW1lIGluZm9ybWF0aW9uICovCisgICAgbW1fY2hhbm5lbF9zeW5jX25vZGVfdCBub2RlW01NX0NBTUVSQV9GUkFNRV9TWU5DX05PREVTXTsKKyAgICAvKiBDaGFubmVsIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBjYW1lcmEgKi8KKyAgICBzdHJ1Y3QgbW1fY2hhbm5lbCAqY2hfb2JqW01BWF9OVU1fQ0FNRVJBX1BFUl9CVU5ETEVdOworICAgIC8qIENiIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBjYW1lcmEgKi8KKyAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IGNiW01BWF9OVU1fQ0FNRVJBX1BFUl9CVU5ETEVdOworfSBtbV9jaGFubmVsX2ZyYW1lX3N5bmNfaW5mb190OworCisvKiBOb2RlIGluZm9ybWF0aW9uIGZvciBtdWx0aXBsZSBzdXBlcmJ1ZiBjYWxsYmFja3MKKyogIFRoaXMgY2FuIGJlIHVzZWQgdG8gYmF0Y2ggbm9kZXMgYmVmb3JlIHNlbmRpbmcgdG8gdXBwZXIgbGF5ZXIgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBOdW1iZXIgb2Ygbm9kZXMgdG8gYmUgc2VudCovCisgICAgdWludDhfdCBudW1fbm9kZXM7CisgICAgLyogcXVldWUgbm9kZSBpbmZvcm1hdGlvbiovCisgICAgbW1fY2hhbm5lbF9xdWV1ZV9ub2RlX3QgKm5vZGVbTUFYX05VTV9DQU1FUkFfUEVSX0JVTkRMRV07CisgICAgLyogY2hhbm5lbCBpbmZvcm1hdGlvbiovCisgICAgc3RydWN0IG1tX2NoYW5uZWwgKmNoX29ialtNQVhfTlVNX0NBTUVSQV9QRVJfQlVORExFXTsKK30gbW1fY2hhbm5lbF9ub2RlX2luZm9fdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNTV9DSEFOTkVMX0JSQUNLRVRJTkdfU1RBVEVfT0ZGLAorICAgIE1NX0NIQU5ORUxfQlJBQ0tFVElOR19TVEFURV9XQUlUX0dPT0RfRlJBTUVfSURYLAorICAgIE1NX0NIQU5ORUxfQlJBQ0tFVElOR19TVEFURV9BQ1RJVkUsCit9IG1tX2NoYW5uZWxfYnJhY2tldGluZ19zdGF0ZV90OworCit0eXBlZGVmIHN0cnVjdCBtbV9jaGFubmVsIHsKKyAgICB1aW50MzJfdCBteV9oZGw7CisgICAgbW1fY2hhbm5lbF9zdGF0ZV90eXBlX3Qgc3RhdGU7CisgICAgcHRocmVhZF9tdXRleF90IGNoX2xvY2s7IC8qIGNoYW5uZWwgbG9jayAqLworCisgICAgLyogc3RyZWFtIGJ1bmRsZSBpbmZvIGluIHRoZSBjaGFubmVsICovCisgICAgbW1fY2hhbm5lbF9idW5kbGVfdCBidW5kbGU7CisKKyAgICAvKiBudW0gb2YgcGVuZGluZyBzdWZlcmJ1ZmZlcnMgKi8KKyAgICB1aW50MzJfdCBwZW5kaW5nX2NudDsKKyAgICB1aW50MzJfdCBwZW5kaW5nX3JldHJvX2NudDsKKyAgICBtbV9jYW1lcmFfcmVxX2J1Zl90eXBlX3QgcmVxX3R5cGU7CisgICAgdWludDMyX3QgYldhaXRGb3JQcmVwU25hcHNob3REb25lOworICAgIHVpbnQzMl90IHVuTG9ja0FFQzsKKyAgICAvKiBudW0gb2YgcGVuZGluZyBzdWZlcmJ1ZmZlcnMgKi8KKyAgICB1aW50OF90IHN0b3Bac2xTbmFwc2hvdDsKKworICAgIC8qIGNtZCB0aHJlYWQgZm9yIHN1cGVyYnVmZmVyIGRhdGFDQiBhbmQgYXN5bmMgc3RvcCovCisgICAgbW1fY2FtZXJhX2NtZF90aHJlYWRfdCBjbWRfdGhyZWFkOworCisgICAgLyogY2IgdGhyZWFkIGZvciBzZW5kaW5nIGRhdGEgY2IgKi8KKyAgICBtbV9jYW1lcmFfY21kX3RocmVhZF90IGNiX3RocmVhZDsKKworICAgIC8qIGRhdGEgcG9sbCB0aHJlYWQKKyAgICAqIGN1cnJlbnRseSBvbmUgZGF0YSBwb2xsIHRocmVhZCBwZXIgY2hhbm5lbAorICAgICogY291bGQgZXh0ZW5kZWQgdG8gc3VwcG9ydCBvbmUgZGF0YSBwb2xsIHRocmVhZCBwZXIgc3RyZWFtIGluIHRoZSBjaGFubmVsICovCisgICAgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX3QgcG9sbF90aHJlYWRbTU1fQ0FNRVJBX0NIQU5ORUxfUE9MTF9USFJFQURfTUFYXTsKKworICAgIC8qIGNvbnRhaW5lciBmb3IgYWxsIHN0cmVhbXMgaW4gY2hhbm5lbCAqLworICAgIG1tX3N0cmVhbV90IHN0cmVhbXNbTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFXTsKKworICAgIC8qIHJlZmVyZW5jZSB0byBwYXJlbnQgY2FtX29iaiAqLworICAgIHN0cnVjdCBtbV9jYW1lcmFfb2JqKiBjYW1fb2JqOworCisgICAgLyogbWFudWFsIHpzbCBzbmFwc2hvdCBjb250cm9sICovCisgICAgdWludDhfdCBtYW51YWxaU0xTbmFwc2hvdDsKKworICAgIC8qIGNvbnRyb2wgZm9yIHpzbCBsZWQgKi8KKyAgICB1aW50OF90IHN0YXJ0WlNsU25hcHNob3RDYWxsZWQ7CisgICAgdWludDhfdCBuZWVkTEVERmxhc2g7CisgICAgbW1fY2hhbm5lbF9icmFja2V0aW5nX3N0YXRlX3QgYnJhY2tldGluZ1N0YXRlOworICAgIHVpbnQ4X3QgaXNGbGFzaEJyYWNrZXRpbmdFbmFibGVkOworICAgIHVpbnQ4X3QgaXNab29tMXhGcmFtZVJlcXVlc3RlZDsKKyAgICB1aW50MzJfdCBidXJzdFNuYXBOdW07CisgICAgY2hhciB0aHJlYWROYW1lW1RIUkVBRF9OQU1FX1NJWkVdOworCisgICAgLypCdWZmZXIgZGl2ZXJ0ZWQqLworICAgIHVpbnQ4X3QgZGl2ZXJ0ZWRfZnJhbWVfaWQ7CisgICAgdWludDMyX3Qgc2Vzc2lvbmlkOworCisgICAgLypGcmFtZSBjYXB0dXJlIGNvbmZpZ2FyYXRpb24qLworICAgIHVpbnQ4X3QgaXNDb25maWdDYXB0dXJlOworICAgIHVpbnQ4X3QgY3VyX2NhcHR1cmVfaWR4OworICAgIHVpbnQzMl90IGNhcHR1cmVfZnJhbWVfaWRbTUFYX0NBUFRVUkVfQkFUQ0hfTlVNXTsKKyAgICBjYW1fY2FwdHVyZV9mcmFtZV9jb25maWdfdCBmcmFtZUNvbmZpZzsKKyAgICB1aW50OF90IG5lZWRMb3dMaWdodFpTTDsKK30gbW1fY2hhbm5lbF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbW1fY2hhbm5lbF90ICpjaDsKKyAgICB1aW50MzJfdCBzdHJlYW1faWQ7Cit9IG1tX2NhbWVyYV9zdHJlYW1fbGlua190OworCisvKiBzdHJ1Y3QgdG8gc3RvcmUgaW5mb3JtYXRpb24gYWJvdXQgcHAgY29va2llKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjYW1faGRsOworICAgIHVpbnQzMl90IGNoX2hkbDsKKyAgICB1aW50MzJfdCBzdHJlYW1faGRsOworICAgIG1tX2NoYW5uZWxfcXVldWVfbm9kZV90KiBzdXBlcl9idWY7Cit9IG1tX2NoYW5uZWxfcHBfaW5mb190OworCisvKiBtbV9jYW1lcmEgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBtbV9jYW1lcmFfZXZlbnRfbm90aWZ5X3QgZXZ0X2NiOworICAgIHZvaWQgKnVzZXJfZGF0YTsKK30gbW1fY2FtZXJhX2V2dF9lbnRyeV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbW1fY2FtZXJhX2V2dF9lbnRyeV90IGV2dFtNTV9DQU1FUkFfRVZUX0VOVFJZX01BWF07CisgICAgLyogcmVnX2NvdW50IDw9MDogaW5maW5pdGUKKyAgICAgKiByZWdfY291bnQgPiAwOiByZWdpc3RlciBvbmx5IGZvciByZXF1aXJlZCB0aW1lcyAqLworICAgIGludCByZWdfY291bnQ7Cit9IG1tX2NhbWVyYV9ldnRfb2JqX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1tX2NhbWVyYV9vYmogeworICAgIHVpbnQzMl90IG15X2hkbDsKKyAgICBpbnQgcmVmX2NvdW50OworICAgIGludDMyX3QgY3RybF9mZDsKKyAgICBpbnQzMl90IGRzX2ZkOyAvKiBkb21haW4gc29ja2V0IGZkICovCisgICAgcHRocmVhZF9tdXRleF90IGNhbV9sb2NrOworICAgIHB0aHJlYWRfbXV0ZXhfdCBjYl9sb2NrOyAvKiBsb2NrIGZvciBldnQgY2IgKi8KKyAgICBtbV9jaGFubmVsX3QgY2hbTU1fQ0FNRVJBX0NIQU5ORUxfTUFYXTsKKyAgICBtbV9jYW1lcmFfZXZ0X29ial90IGV2dDsKKyAgICBtbV9jYW1lcmFfcG9sbF90aHJlYWRfdCBldnRfcG9sbF90aHJlYWQ7IC8qIGV2dCBwb2xsIHRocmVhZCAqLworICAgIG1tX2NhbWVyYV9jbWRfdGhyZWFkX3QgZXZ0X3RocmVhZDsgICAgICAgLyogdGhyZWFkIGZvciBldnQgQ0IgKi8KKyAgICBtbV9jYW1lcmFfdnRibF90IHZ0Ymw7CisKKyAgICBwdGhyZWFkX211dGV4X3QgZXZ0X2xvY2s7CisgICAgcHRocmVhZF9jb25kX3QgZXZ0X2NvbmQ7CisgICAgbW1fY2FtZXJhX2V2ZW50X3QgZXZ0X3JjdmQ7CisKKyAgICBwdGhyZWFkX211dGV4X3QgbXNnX2xvY2s7IC8qIGxvY2sgZm9yIHNlbmRpbmcgbXNnIHRocm91Z2ggc29ja2V0ICovCisgICAgdWludDMyX3Qgc2Vzc2lvbmlkOyAvKiBDYW1lcmEgc2VydmVyIHNlc3Npb24gaWQgKi8KK30gbW1fY2FtZXJhX29ial90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50OF90IG51bV9jYW07CisgICAgbW1fY2FtZXJhX3NoaW1fb3BzX3QgY2FtX3NoaW1fb3BzOworICAgIGNoYXIgdmlkZW9fZGV2X25hbWVbTU1fQ0FNRVJBX01BWF9OVU1fU0VOU09SU11bTU1fQ0FNRVJBX0RFVl9OQU1FX0xFTl07CisgICAgbW1fY2FtZXJhX29ial90ICpjYW1fb2JqW01NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlNdOworICAgIHN0cnVjdCBjYW1lcmFfaW5mbyBpbmZvW01NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlNdOworICAgIGNhbV9zeW5jX3R5cGVfdCBjYW1fdHlwZVtNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTXTsKKyAgICBjYW1fc3luY19tb2RlX3QgY2FtX21vZGVbTU1fQ0FNRVJBX01BWF9OVU1fU0VOU09SU107CisgICAgdWludDhfdCBpc195dXZbTU1fQ0FNRVJBX01BWF9OVU1fU0VOU09SU107IC8vIDE9Q0FNX1NFTlNPUl9ZVVYsIDA9Q0FNX1NFTlNPUl9SQVcKK30gbW1fY2FtZXJhX2N0cmxfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBtbV9jYW1lcmFfYXN5bmNfY2FsbCwKKyAgICBtbV9jYW1lcmFfc3luY19jYWxsCit9IG1tX2NhbWVyYV9jYWxsX3R5cGVfdDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogZXh0ZXJuYWwgZnVuY3Rpb24gZGVjbGFyZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB1dGlsaXR5IGZ1bmN0aW9ucyAqLworLyogc2V0IGludDMyX3QgdmFsdWUgKi8KK2V4dGVybiBpbnQzMl90IG1tX2NhbWVyYV91dGlsX3NfY3RybChtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgaW50IHN0cmVhbV9pZCwgaW50MzJfdCBmZCwgdWludDMyX3QgaWQsIGludDMyX3QgKnZhbHVlKTsKKworLyogZ2V0IGludDMyX3QgdmFsdWUgKi8KK2V4dGVybiBpbnQzMl90IG1tX2NhbWVyYV91dGlsX2dfY3RybChtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgaW50IHN0cmVhbV9pZCwgaW50MzJfdCBmZCwgdWludDMyX3QgaWQsIGludDMyX3QgKnZhbHVlKTsKKworLyogc2VuZCBtc2cgdGhyb3VnaHQgZG9tYWluIHNvY2tldCBmb3IgZmQgbWFwcGluZyAqLworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3V0aWxfc2VuZG1zZyhtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZW5kZmQpOworCisvKiBzZW5kIG1zZyB0aHJvdWdoIGRvbWFpbiBzb2NrZXQgZm9yIGJ1bmRsZWQgZmQgbWFwcGluZyAqLworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3V0aWxfYnVuZGxlZF9zZW5kbXNnKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlbmRmZHNbQ0FNX01BWF9OVU1fQlVGU19QRVJfU1RSRUFNXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtZmRzKTsKKworLyogQ2hlY2sgaWYgaGFyZHdhcmUgdGFyZ2V0IGlzIEEgZmFtaWx5ICovCit1aW50OF90IG1tX2NhbWVyYV91dGlsX2NoaXBfaXNfYV9mYW1pbHkodm9pZCk7CisKKy8qIG1tLWNhbWVyYSAqLworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX29wZW4obW1fY2FtZXJhX29ial90ICpteV9vYmopOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX2Nsb3NlKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqKTsKK2V4dGVybiBpbnQzMl90IG1tX2NhbWVyYV9yZWdpc3Rlcl9ldmVudF9ub3RpZnkobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9ldmVudF9ub3RpZnlfdCBldnRfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiB1c2VyX2RhdGEpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3FidWYobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmJ1Zik7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfZ2V0X3F1ZXVlZF9idWZfY291bnQobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgIHVpbnQzMl90IGNoX2lkLCB1aW50MzJfdCBzdHJlYW1faWQpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3F1ZXJ5X2NhcGFiaWxpdHkobW1fY2FtZXJhX29ial90ICpteV9vYmopOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3NldF9wYXJtcyhtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybV9idWZmZXJfdCAqcGFybXMpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX2dldF9wYXJtcyhtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybV9idWZmZXJfdCAqcGFybXMpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX21hcF9idWYobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJ1Zl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX21hcF9idWZzKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbV9idWZfbWFwX3R5cGVfbGlzdCAqYnVmX21hcF9saXN0KTsKK2V4dGVybiBpbnQzMl90IG1tX2NhbWVyYV91bm1hcF9idWYobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmX3R5cGUpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX2RvX2F1dG9fZm9jdXMobW1fY2FtZXJhX29ial90ICpteV9vYmopOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX2NhbmNlbF9hdXRvX2ZvY3VzKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqKTsKK2V4dGVybiBpbnQzMl90IG1tX2NhbWVyYV9wcmVwYXJlX3NuYXBzaG90KG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb19hZl9mbGFnKTsKK2V4dGVybiBpbnQzMl90IG1tX2NhbWVyYV9zdGFydF96c2xfc25hcHNob3QobW1fY2FtZXJhX29ial90ICpteV9vYmopOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3N0b3BfenNsX3NuYXBzaG90KG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqKTsKK2V4dGVybiBpbnQzMl90IG1tX2NhbWVyYV9mbHVzaChtbV9jYW1lcmFfb2JqX3QgKm15X29iaik7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfc3RhcnRfenNsX3NuYXBzaG90X2NoKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICB1aW50MzJfdCBjaF9pZCk7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfc3RvcF96c2xfc25hcHNob3RfY2gobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgIHVpbnQzMl90IGNoX2lkKTsKK2V4dGVybiB1aW50MzJfdCBtbV9jYW1lcmFfYWRkX2NoYW5uZWwobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCBjaGFubmVsX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSk7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfZGVsX2NoYW5uZWwobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX2dldF9idW5kbGVfaW5mbyhtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9idW5kbGVfY29uZmlnX3QgKmJ1bmRsZV9pbmZvKTsKK2V4dGVybiB1aW50MzJfdCBtbV9jYW1lcmFfYWRkX3N0cmVhbShtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCk7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfZGVsX3N0cmVhbShtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkKTsKK2V4dGVybiB1aW50MzJfdCBtbV9jYW1lcmFfbGlua19zdHJlYW0obW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQsCisgICAgICAgIHVpbnQzMl90IGxpbmtlZF9jaF9pZCk7CisKK2V4dGVybiBpbnQzMl90IG1tX2NhbWVyYV9yZWdfc3RyZWFtX2J1Zl9jYihtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgdWludDMyX3QgY2hfaWQsIHVpbnQzMl90IHN0cmVhbV9pZCwgbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCBidWZfY2IsCisgICAgICAgIG1tX2NhbWVyYV9zdHJlYW1fY2JfdHlwZSBjYl90eXBlLCB2b2lkICp1c2VyZGF0YSk7CisKK2V4dGVybiBpbnQzMl90IG1tX2NhbWVyYV9jb25maWdfc3RyZWFtKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3RyZWFtX2NvbmZpZ190ICpjb25maWcpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3N0YXJ0X2NoYW5uZWwobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCk7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfc3RvcF9jaGFubmVsKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCk7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfcmVxdWVzdF9zdXBlcl9idWYobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgIHVpbnQzMl90IGNoX2lkLCBtbV9jYW1lcmFfcmVxX2J1Zl90ICpidWYpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX2NhbmNlbF9zdXBlcl9idWZfcmVxdWVzdChtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX2ZsdXNoX3N1cGVyX2J1Zl9xdWV1ZShtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX2lkeCk7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfY29uZmlnX2NoYW5uZWxfbm90aWZ5KG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl9ub3RpZnlfbW9kZV90IG5vdGlmeV9tb2RlKTsKK2V4dGVybiBpbnQzMl90IG1tX2NhbWVyYV9zZXRfc3RyZWFtX3Bhcm1zKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90ICpwYXJtcyk7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfZ2V0X3N0cmVhbV9wYXJtcyhtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCAqcGFybXMpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3JlZ2lzdGVyX2V2ZW50X25vdGlmeV9pbnRlcm5hbChtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2V2ZW50X25vdGlmeV90IGV2dF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHVzZXJfZGF0YSk7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfbWFwX3N0cmVhbV9idWYobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBsYW5lX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyKTsKK2V4dGVybiBpbnQzMl90IG1tX2NhbWVyYV9tYXBfc3RyZWFtX2J1ZnMobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1fYnVmX21hcF90eXBlX2xpc3QgKmJ1Zl9tYXBfbGlzdCk7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfdW5tYXBfc3RyZWFtX2J1ZihtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBidWZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1Zl9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBsYW5lX2lkeCk7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfZG9fc3RyZWFtX2FjdGlvbihtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYWN0aW9ucyk7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfZ2V0X3Nlc3Npb25faWQobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHNlc3Npb25pZCk7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfc3luY19yZWxhdGVkX3NlbnNvcnMobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QgKnBhcm1zKTsKKworLyogbW1fY2hhbm5lbCAqLworZXh0ZXJuIGludDMyX3QgbW1fY2hhbm5lbF9mc21fZm4obW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jaGFubmVsX2V2dF90eXBlX3QgZXZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGluX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBvdXRfdmFsKTsKK2V4dGVybiBpbnQzMl90IG1tX2NoYW5uZWxfaW5pdChtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCBjaGFubmVsX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKTsKKy8qIHFidWYgaXMgYSBzcGVjaWFsIGNhc2UgdGhhdCBub3QgZ29pbmcgdGhyb3VnaCBzdGF0ZSBtYWNoaW5lLgorICogVGhpcyBpcyB0byBhdm9pZCBkZWFkbG9jayB3aGVuIHRyeWluZyB0byBhcXVpcmUgY2hfbG9jaywKKyAqIGZyb20gdGhlIGNvbnRleHQgb2YgZGF0YUNCLCBidXQgYXN5bmMgc3RvcCBpcyBob2xkaW5nIGNoX2xvY2sgKi8KK2V4dGVybiBpbnQzMl90IG1tX2NoYW5uZWxfcWJ1ZihtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpidWYpOworLyogbW1fc3RyZWFtICovCitleHRlcm4gaW50MzJfdCBtbV9zdHJlYW1fZnNtX2ZuKG1tX3N0cmVhbV90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX3N0cmVhbV9ldnRfdHlwZV90IGV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGluX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIG91dF92YWwpOworLyogRnVuY3Rpb24gdG8gcmVnaXN0ZXIgc3BlY2lhbCBjYWxsYmFjayBmb3Igc3RyZWFtIGJ1ZmZlciovCitleHRlcm4gaW50MzJfdCBtbV9zdHJlYW1fcmVnX2J1Zl9jYihtbV9zdHJlYW1fdCAqbXlfb2JqLAorICAgICAgICBtbV9zdHJlYW1fZGF0YV9jYl90IHZhbCk7CitleHRlcm4gaW50MzJfdCBtbV9zdHJlYW1fbWFwX2J1ZihtbV9zdHJlYW1fdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBidWZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIpOworZXh0ZXJuIGludDMyX3QgbW1fc3RyZWFtX21hcF9idWZzKG1tX3N0cmVhbV90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtX2J1Zl9tYXBfdHlwZV9saXN0ICpidWZfbWFwX2xpc3QpOworZXh0ZXJuIGludDMyX3QgbW1fc3RyZWFtX3VubWFwX2J1ZihtbV9zdHJlYW1fdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJ1Zl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmcmFtZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4KTsKKworLyogdXRpbHRpdHkgZnVjbnRpb24gZGVjbGFyZWQgaW4gbW0tY2FtZXJhLWludGVmYWNlMi5jCisgKiBhbmQgbmVlZCBiZSB1c2VkIGJ5IG1tLWNhbWVyYSBhbmQgYmVsb3cqLwordWludDMyX3QgbW1fY2FtZXJhX3V0aWxfZ2VuZXJhdGVfaGFuZGxlcih1aW50OF90IGluZGV4KTsKK2NvbnN0IGNoYXIgKiBtbV9jYW1lcmFfdXRpbF9nZXRfZGV2X25hbWUodWludDMyX3QgY2FtX2hhbmRsZXIpOwordWludDhfdCBtbV9jYW1lcmFfdXRpbF9nZXRfaW5kZXhfYnlfaGFuZGxlcih1aW50MzJfdCBoYW5kbGVyKTsKKworLyogcG9sbC9jbWQgdGhyZWFkIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX2xhdW5jaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX3QgKiBwb2xsX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfcG9sbF90aHJlYWRfdHlwZV90IHBvbGxfdHlwZSk7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfcG9sbF90aHJlYWRfcmVsZWFzZShtbV9jYW1lcmFfcG9sbF90aHJlYWRfdCAqcG9sbF9jYik7CitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfcG9sbF90aHJlYWRfYWRkX3BvbGxfZmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9wb2xsX3RocmVhZF90ICogcG9sbF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3BvbGxfbm90aWZ5X3Qgbm9maXR5X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NhbGxfdHlwZV90KTsKK2V4dGVybiBpbnQzMl90IG1tX2NhbWVyYV9wb2xsX3RocmVhZF9kZWxfcG9sbF9mZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX3QgKiBwb2xsX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2FsbF90eXBlX3QpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX2NvbW1pdF91cGRhdGVzKAorICAgICAgICBtbV9jYW1lcmFfcG9sbF90aHJlYWRfdCAqIHBvbGxfY2IpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX2NtZF90aHJlYWRfbGF1bmNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY21kX3RocmVhZF90ICogY21kX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NtZF9jYl90IGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpOworZXh0ZXJuIGludDMyX3QgbW1fY2FtZXJhX2NtZF90aHJlYWRfbmFtZShjb25zdCBjaGFyKiBuYW1lKTsKK2V4dGVybiBpbnQzMl90IG1tX2NhbWVyYV9jbWRfdGhyZWFkX3JlbGVhc2UobW1fY2FtZXJhX2NtZF90aHJlYWRfdCAqIGNtZF90aHJlYWQpOworCitleHRlcm4gaW50MzJfdCBtbV9jYW1lcmFfY2hhbm5lbF9hZHZhbmNlZF9jYXB0dXJlKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICB1aW50MzJfdCBjaF9pZCwgbW1fY2FtZXJhX2FkdmFuY2VkX2NhcHR1cmVfdCB0eXBlLAorICAgICAgICB1aW50MzJfdCB0cmlnZ2VyLCB2b2lkICppbl92YWx1ZSk7CitpbnQzMl90IG1tX2NhbWVyYV9lbnF1ZXVlX2V2dChtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9ldmVudF90ICpldmVudCk7CitpbnQzMl90IG1tX2NhbWVyYV9sb2FkX3NoaW1fbGliKCk7CitjYW1fc2hpbV9wYWNrZXRfdCAqbW1fY2FtZXJhX2NyZWF0ZV9zaGltX2NtZF9wYWNrZXQoY2FtX3NoaW1fY21kX3R5cGUgdHlwZSwKKyAgICAgICAgdWludDMyX3Qgc2Vzc2lvbklELCB2b2lkICpkYXRhKTsKK2ludDMyX3QgbW1fY2FtZXJhX2Rlc3Ryb3lfc2hpbV9jbWRfcGFja2V0KGNhbV9zaGltX3BhY2tldF90ICpjbWQpOworaW50MzJfdCBtbV9jYW1lcmFfbW9kdWxlX2V2ZW50X2hhbmRsZXIoCisgICAgICAgIHVpbnQzMl90IHNlc3Npb25faWQsIGNhbV9ldmVudF90ICpldmVudCk7CitjYW1fc3RhdHVzX3QgbW1fY2FtZXJhX21vZHVsZV9vcGVuX3Nlc3Npb24oaW50IHNlc3Npb25pZCwKKyAgICAgICAgaW50ICgqZXZlbnRfY2IpKHVpbnQzMl90IHNlc3Npb25pZCwgY2FtX2V2ZW50X3QgKmV2ZW50KSk7CitpbnQzMl90IG1tX2NhbWVyYV9tb2R1bGVfY2xvc2Vfc2Vzc2lvbihpbnQgc2Vzc2lvbik7CitpbnQzMl90IG1tX2NhbWVyYV9tb2R1bGVfc2VuZF9jbWQoY2FtX3NoaW1fcGFja2V0X3QgKmV2ZW50KTsKKworI2VuZGlmIC8qIF9fTU1fQ0FNRVJBX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2UvaW5jL21tX2NhbWVyYV9kYmcuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL2luYy9tbV9jYW1lcmFfZGJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5OGM3OAotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL2luYy9tbV9jYW1lcmFfZGJnLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMiwgMjAxNCwgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19NTV9DQU1FUkFfREJHX0hfXworI2RlZmluZSBfX01NX0NBTUVSQV9EQkdfSF9fCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2lmZGVmIFFDQU1FUkFfUkVERUZJTkVfTE9HCisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJjYW1fdHlwZXMuaCIKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fTk9fTU9EVUxFLAorICAgIENBTV9IQUxfTU9EVUxFLAorICAgIENBTV9NQ0lfTU9EVUxFLAorICAgIENBTV9KUEVHX01PRFVMRSwKKyAgICBDQU1fTEFTVF9NT0RVTEUKK30gY2FtX21vZHVsZXNfdDsKKworLyogdmFsdWVzIHRoYXQgcGVyc2lzdC5jYW1lcmEuZ2xvYmFsLmRlYnVnIGNhbiBiZSBzZXQgdG8gKi8KKy8qIGFsbCBjYW1lcmEgbW9kdWxlcyBuZWVkIHRvIG1hcCB0aGVpciBpbnRlcm5hbCBkZWJ1ZyBsZXZlbHMgdG8gdGhpcyByYW5nZSAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBDQU1fR0xCTF9EQkdfTk9ORSAgPSAwLAorICAgIENBTV9HTEJMX0RCR19FUlIgICA9IDEsCisgICAgQ0FNX0dMQkxfREJHX1dBUk4gID0gMiwKKyAgICBDQU1fR0xCTF9EQkdfSElHSCAgPSAzLAorICAgIENBTV9HTEJMX0RCR19ERUJVRyA9IDQsCisgICAgQ0FNX0dMQkxfREJHX0xPVyAgID0gNSwKKyAgICBDQU1fR0xCTF9EQkdfSU5GTyAgPSA2Cit9IGNhbV9nbG9iYWxfZGVidWdfbGV2ZWxfdDsKKworZXh0ZXJuIGludCBnX2NhbV9sb2dbQ0FNX0xBU1RfTU9EVUxFXVtDQU1fR0xCTF9EQkdfSU5GTyArIDFdOworCisjZGVmaW5lIEZBVEFMX0lGKGNvbmQsIC4uLikgTE9HX0FMV0FZU19GQVRBTF9JRihjb25kLCAjIyBfX1ZBX0FSR1NfXykKKworI3VuZGVmIENMT0d4CisjZGVmaW5lIENMT0d4KG1vZHVsZSwgbGV2ZWwsIGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgICAgICAgICAgXAore1wKK2lmIChnX2NhbV9sb2dbbW9kdWxlXVtsZXZlbF0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtbV9jYW1lcmFfZGVidWdfbG9nKG1vZHVsZSwgbGV2ZWwsIF9fZnVuY19fLCBfX0xJTkVfXywgZm10LCAjI2FyZ3MpOyBcCit9XAorfQorCisjdW5kZWYgQ0xPR0kKKyNkZWZpbmUgQ0xPR0kobW9kdWxlLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgIFwKKyAgICBDTE9HeChtb2R1bGUsIENBTV9HTEJMX0RCR19JTkZPLCBmbXQsICMjYXJncykKKyN1bmRlZiBDTE9HRAorI2RlZmluZSBDTE9HRChtb2R1bGUsIGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgXAorICAgIENMT0d4KG1vZHVsZSwgQ0FNX0dMQkxfREJHX0RFQlVHLCBmbXQsICMjYXJncykKKyN1bmRlZiBDTE9HTAorI2RlZmluZSBDTE9HTChtb2R1bGUsIGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgXAorICAgIENMT0d4KG1vZHVsZSwgQ0FNX0dMQkxfREJHX0xPVywgZm10LCAjI2FyZ3MpCisjdW5kZWYgQ0xPR1cKKyNkZWZpbmUgQ0xPR1cobW9kdWxlLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgIFwKKyAgICBDTE9HeChtb2R1bGUsIENBTV9HTEJMX0RCR19XQVJOLCBmbXQsICMjYXJncykKKyN1bmRlZiBDTE9HSAorI2RlZmluZSBDTE9HSChtb2R1bGUsIGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgXAorICAgIENMT0d4KG1vZHVsZSwgQ0FNX0dMQkxfREJHX0hJR0gsIGZtdCwgIyNhcmdzKQorI3VuZGVmIENMT0dFCisjZGVmaW5lIENMT0dFKG1vZHVsZSwgZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICBcCisgICAgQ0xPR3gobW9kdWxlLCBDQU1fR0xCTF9EQkdfRVJSLCBmbXQsICMjYXJncykKKworI2lmbmRlZiBDQU1fTU9EVUxFCisjZGVmaW5lIENBTV9NT0RVTEUgQ0FNX01DSV9NT0RVTEUKKyNlbmRpZgorCisjdW5kZWYgTE9HRAorI2RlZmluZSBMT0dEKGZtdCwgYXJncy4uLikgQ0xPR0QoQ0FNX01PRFVMRSwgZm10LCAjI2FyZ3MpCisjdW5kZWYgTE9HTAorI2RlZmluZSBMT0dMKGZtdCwgYXJncy4uLikgQ0xPR0woQ0FNX01PRFVMRSwgZm10LCAjI2FyZ3MpCisjdW5kZWYgTE9HVworI2RlZmluZSBMT0dXKGZtdCwgYXJncy4uLikgQ0xPR1coQ0FNX01PRFVMRSwgZm10LCAjI2FyZ3MpCisjdW5kZWYgTE9HSAorI2RlZmluZSBMT0dIKGZtdCwgYXJncy4uLikgQ0xPR0goQ0FNX01PRFVMRSwgZm10LCAjI2FyZ3MpCisjdW5kZWYgTE9HRQorI2RlZmluZSBMT0dFKGZtdCwgYXJncy4uLikgQ0xPR0UoQ0FNX01PRFVMRSwgZm10LCAjI2FyZ3MpCisjdW5kZWYgTE9HSQorI2RlZmluZSBMT0dJKGZtdCwgYXJncy4uLikgQ0xPR0koQ0FNX01PRFVMRSwgZm10LCAjI2FyZ3MpCisKKy8qIHJlYWRzIGFuZCB1cGRhdGVzIGNhbWVyYSBsb2dnaW5nIHByb3BlcnRpZXMgKi8KK3ZvaWQgbW1fY2FtZXJhX3NldF9kYmdfbG9nX3Byb3BlcnRpZXModm9pZCk7CisKKy8qIGdlbmVyaWMgbG9nZ2VyIGZ1bmN0aW9uICovCit2b2lkIG1tX2NhbWVyYV9kZWJ1Z19sb2coY29uc3QgY2FtX21vZHVsZXNfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtX2dsb2JhbF9kZWJ1Z19sZXZlbF90IGxldmVsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmMsIGNvbnN0IGludCBsaW5lLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKKyNlbHNlCisKKyN1bmRlZiBMT0dECisjZGVmaW5lIExPR0QoZm10LCBhcmdzLi4uKSBBTE9HRChmbXQsICMjYXJncykKKyN1bmRlZiBMT0dMCisjZGVmaW5lIExPR0woZm10LCBhcmdzLi4uKSBBTE9HRChmbXQsICMjYXJncykKKyN1bmRlZiBMT0dXCisjZGVmaW5lIExPR1coZm10LCBhcmdzLi4uKSBBTE9HVyhmbXQsICMjYXJncykKKyN1bmRlZiBMT0dICisjZGVmaW5lIExPR0goZm10LCBhcmdzLi4uKSBBTE9HRChmbXQsICMjYXJncykKKyN1bmRlZiBMT0dFCisjZGVmaW5lIExPR0UoZm10LCBhcmdzLi4uKSBBTE9HRShmbXQsICMjYXJncykKKyN1bmRlZiBMT0dJCisjZGVmaW5lIExPR0koZm10LCBhcmdzLi4uKSBBTE9HVihmbXQsICMjYXJncykKKworI2VuZGlmCisKKyNlbmRpZiAvKiBfX01NX0NBTUVSQV9EQkdfSF9fICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9pbmMvbW1fY2FtZXJhX3NvY2suaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL2luYy9tbV9jYW1lcmFfc29jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDUwNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9pbmMvbW1fY2FtZXJhX3NvY2suaApAQCAtMCwwICsxLDc2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNCwgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19NTV9DQU1FUkFfU09DS0VUX0hfXworI2RlZmluZSBfX01NX0NBTUVSQV9TT0NLRVRfSF9fCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNkZWZpbmUgU09DS0VUX0ggPFNZU1RFTV9IRUFERVJfUFJFRklYL3NvY2tldC5oPgorI2luY2x1ZGUgU09DS0VUX0gKKyNkZWZpbmUgVU5fSCA8U1lTVEVNX0hFQURFUl9QUkVGSVgvdW4uaD4KKyNpbmNsdWRlIFVOX0gKKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgImNhbV90eXBlcy5oIgorCit0eXBlZGVmIGVudW0geworICAgIE1NX0NBTUVSQV9TT0NLX1RZUEVfVURQLAorICAgIE1NX0NBTUVSQV9TT0NLX1RZUEVfVENQLAorfSBtbV9jYW1lcmFfc29ja190eXBlX3Q7CisKK3R5cGVkZWYgdW5pb24geworICAgIHN0cnVjdCBzb2NrYWRkciBhZGRyOworICAgIHN0cnVjdCBzb2NrYWRkcl91biBhZGRyX3VuOworfSBtbV9jYW1lcmFfc29ja19hZGRyX3Q7CisKK2ludCBtbV9jYW1lcmFfc29ja2V0X2NyZWF0ZShpbnQgY2FtX2lkLCBtbV9jYW1lcmFfc29ja190eXBlX3Qgc29ja190eXBlKTsKKworaW50IG1tX2NhbWVyYV9zb2NrZXRfc2VuZG1zZygKKyAgaW50IGZkLAorICB2b2lkICptc2csCisgIHNpemVfdCBidWZfc2l6ZSwKKyAgaW50IHNlbmRmZCk7CisKK2ludCBtbV9jYW1lcmFfc29ja2V0X2J1bmRsZV9zZW5kbXNnKAorICBpbnQgZmQsCisgIHZvaWQgKm1zZywKKyAgc2l6ZV90IGJ1Zl9zaXplLAorICBpbnQgc2VuZGZkc1tDQU1fTUFYX05VTV9CVUZTX1BFUl9TVFJFQU1dLAorICBpbnQgbnVtX2Zkcyk7CisKK2ludCBtbV9jYW1lcmFfc29ja2V0X3JlY3Ztc2coCisgIGludCBmZCwKKyAgdm9pZCAqbXNnLAorICB1aW50MzJfdCBidWZfc2l6ZSwKKyAgaW50ICpyY3ZkZmQpOworCit2b2lkIG1tX2NhbWVyYV9zb2NrZXRfY2xvc2UoaW50IGZkKTsKKworI2VuZGlmIC8qX19NTV9DQU1FUkFfU09DS0VUX0hfXyovCisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmEuYyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGFiNTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2Uvc3JjL21tX2NhbWVyYS5jCkBAIC0wLDAgKzEsMjYwOCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvLyBUbyByZW1vdmUKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2RlZmluZSBJT0NUTF9IIDxTWVNURU1fSEVBREVSX1BSRUZJWC9pb2N0bC5oPgorI2luY2x1ZGUgSU9DVExfSAorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiY2FtX3NlbWFwaG9yZS5oIgorI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKKyNpbmNsdWRlICJtbV9jYW1lcmFfc29jay5oIgorI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJtbV9jYW1lcmEuaCIKKworI2RlZmluZSBTRVRfUEFSTV9CSVQzMihwYXJtLCBwYXJtX2FycikgXAorICAgIChwYXJtX2FycltwYXJtLzMyXSB8PSAoMTw8KHBhcm0lMzIpKSkKKworI2RlZmluZSBHRVRfUEFSTV9CSVQzMihwYXJtLCBwYXJtX2FycikgXAorICAgICgocGFybV9hcnJbcGFybS8zMl0+PihwYXJtJTMyKSkmIDB4MSkKKworLyogaW50ZXJuYWwgZnVuY3Rpb24gZGVjbGFyZSAqLworaW50MzJfdCBtbV9jYW1lcmFfZXZ0X3N1YihtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVnX2ZsYWcpOworaW50MzJfdCBtbV9jYW1lcmFfZW5xdWV1ZV9ldnQobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfZXZlbnRfdCAqZXZlbnQpOworZXh0ZXJuIG1tX2NhbWVyYV9vYmpfdCogbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9zZXNzaW9uX2lkCisgICAgICAgICh1aW50MzJfdCBzZXNzaW9uX2lkKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfdXRpbF9nZXRfY2hhbm5lbF9ieV9oYW5kbGVyCisgKgorICogREVTQ1JJUFRJT046IHV0aWxpdHkgZnVuY3Rpb24gdG8gZ2V0IGEgY2hhbm5lbCBvYmplY3QgZnJvbSBpdHMgaGFuZGxlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1fb2JqOiBwdHIgdG8gYSBjYW1lcmEgb2JqZWN0CisgKiAgIEBoYW5kbGVyOiBjaGFubmVsIGhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiBwdHIgdG8gYSBjaGFubmVsIG9iamVjdC4KKyAqICAgICAgICAgICAgICBOVUxMIGlmIGZhaWxlZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworbW1fY2hhbm5lbF90ICogbW1fY2FtZXJhX3V0aWxfZ2V0X2NoYW5uZWxfYnlfaGFuZGxlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9vYmpfdCAqIGNhbV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoYW5kbGVyKQoreworICAgIGludCBpOworICAgIG1tX2NoYW5uZWxfdCAqY2hfb2JqID0gTlVMTDsKKyAgICBmb3IoaSA9IDA7IGkgPCBNTV9DQU1FUkFfQ0hBTk5FTF9NQVg7IGkrKykgeworICAgICAgICBpZiAoaGFuZGxlciA9PSBjYW1fb2JqLT5jaFtpXS5teV9oZGwpIHsKKyAgICAgICAgICAgIGNoX29iaiA9ICZjYW1fb2JqLT5jaFtpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjaF9vYmo7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3V0aWxfY2hpcF9pc19hX2ZhbWlseQorICoKKyAqIERFU0NSSVBUSU9OOiB1dGlsaXR5IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBob3N0IGlzIEEgZmFtaWx5IGNoaXAKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqCisgKiBSRVRVUk4gICAgIDogVFJVRSBpZiBBIGZhbWlseS4KKyAqICAgICAgICAgICAgICBGQUxTRSBvdGhlcndpc2UuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQ4X3QgbW1fY2FtZXJhX3V0aWxfY2hpcF9pc19hX2ZhbWlseSh2b2lkKQoreworI2lmZGVmIFVTRV9BX0ZBTUlMWQorICAgIHJldHVybiBUUlVFOworI2Vsc2UKKyAgICByZXR1cm4gRkFMU0U7CisjZW5kaWYKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfZGlzcGF0Y2hfYXBwX2V2ZW50CisgKgorICogREVTQ1JJUFRJT046IGRpc3BhdGNoIGV2ZW50IHRvIGFwcHMgd2hvIHJlZ2l0c3RlciBmb3IgZXZlbnQgbm90aWZ5CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjbWRfY2I6IHB0ciB0byBhIHN0cnVjdCBzdG9yaW5nIGV2ZW50IGluZm8KKyAqICAgQHVzZXJfZGF0YTogdXNlciBkYXRhIHB0ciAoY2FtZXJhIG9iamVjdCkKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBtbV9jYW1lcmFfZGlzcGF0Y2hfYXBwX2V2ZW50KG1tX2NhbWVyYV9jbWRjYl90ICpjbWRfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJfZGF0YSkKK3sKKyAgICBpbnQgaTsKKyAgICBtbV9jYW1lcmFfZXZlbnRfdCAqZXZlbnQgPSAmY21kX2NiLT51LmV2dDsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSAobW1fY2FtZXJhX29ial90ICopdXNlcl9kYXRhOworICAgIGlmIChOVUxMICE9IG15X29iaikgeworICAgICAgICBtbV9jYW1lcmFfY21kX3RocmVhZF9uYW1lKG15X29iai0+ZXZ0X3RocmVhZC50aHJlYWROYW1lKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNiX2xvY2spOworICAgICAgICBmb3IoaSA9IDA7IGkgPCBNTV9DQU1FUkFfRVZUX0VOVFJZX01BWDsgaSsrKSB7CisgICAgICAgICAgICBpZihteV9vYmotPmV2dC5ldnRbaV0uZXZ0X2NiKSB7CisgICAgICAgICAgICAgICAgbXlfb2JqLT5ldnQuZXZ0W2ldLmV2dF9jYigKKyAgICAgICAgICAgICAgICAgICAgbXlfb2JqLT5teV9oZGwsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LAorICAgICAgICAgICAgICAgICAgICBteV9vYmotPmV2dC5ldnRbaV0udXNlcl9kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYl9sb2NrKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2V2ZW50X25vdGlmeQorICoKKyAqIERFU0NSSVBUSU9OOiBjYWxsYmFjayB0byBoYW5kbGUgZXZlbnQgbm90aWZ5IGZyb20ga2VybmVsLiBUaGlzIGNhbGwgd2lsbAorICogICAgICAgICAgICAgIGRlcXVldWUgZXZlbnQgZnJvbSBrZXJuZWwuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEB1c2VyX2RhdGE6IHVzZXIgZGF0YSBwdHIgKGNhbWVyYSBvYmplY3QpCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgbW1fY2FtZXJhX2V2ZW50X25vdGlmeSh2b2lkKiB1c2VyX2RhdGEpCit7CisgICAgc3RydWN0IHY0bDJfZXZlbnQgZXY7CisgICAgc3RydWN0IG1zbV92NGwyX2V2ZW50X2RhdGEgKm1zbV9ldnQgPSBOVUxMOworICAgIGludCByYzsKKyAgICBtbV9jYW1lcmFfZXZlbnRfdCBldnQ7CisgICAgbWVtc2V0KCZldnQsIDAsIHNpemVvZihtbV9jYW1lcmFfZXZlbnRfdCkpOworCisgICAgbW1fY2FtZXJhX29ial90ICpteV9vYmogPSAobW1fY2FtZXJhX29ial90Kil1c2VyX2RhdGE7CisgICAgaWYgKE5VTEwgIT0gbXlfb2JqKSB7CisgICAgICAgIC8qIHJlYWQgZXZ0ICovCisgICAgICAgIG1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOworICAgICAgICByYyA9IGlvY3RsKG15X29iai0+Y3RybF9mZCwgVklESU9DX0RRRVZFTlQsICZldik7CisKKyAgICAgICAgaWYgKHJjID49IDAgJiYgZXYuaWQgPT0gTVNNX0NBTUVSQV9NU01fTk9USUZZKSB7CisgICAgICAgICAgICBtc21fZXZ0ID0gKHN0cnVjdCBtc21fdjRsMl9ldmVudF9kYXRhICopZXYudS5kYXRhOworICAgICAgICAgICAgc3dpdGNoIChtc21fZXZ0LT5jb21tYW5kKSB7CisgICAgICAgICAgICBjYXNlIENBTV9FVkVOVF9UWVBFX0RBRU1PTl9QVUxMX1JFUToKKyAgICAgICAgICAgICAgICBldnQuc2VydmVyX2V2ZW50X3R5cGUgPSBDQU1fRVZFTlRfVFlQRV9EQUVNT05fUFVMTF9SRVE7CisgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2VucXVldWVfZXZ0KG15X29iaiwgJmV2dCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENBTV9FVkVOVF9UWVBFX01BUF9VTk1BUF9ET05FOgorICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5ldnRfbG9jayk7CisgICAgICAgICAgICAgICAgbXlfb2JqLT5ldnRfcmN2ZC5zZXJ2ZXJfZXZlbnRfdHlwZSA9IG1zbV9ldnQtPmNvbW1hbmQ7CisgICAgICAgICAgICAgICAgbXlfb2JqLT5ldnRfcmN2ZC5zdGF0dXMgPSBtc21fZXZ0LT5zdGF0dXM7CisgICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmbXlfb2JqLT5ldnRfY29uZCk7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+ZXZ0X2xvY2spOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1fRVZFTlRfVFlQRV9JTlRfVEFLRV9KUEVHOgorICAgICAgICAgICAgY2FzZSBDQU1fRVZFTlRfVFlQRV9JTlRfVEFLRV9SQVc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBldnQuc2VydmVyX2V2ZW50X3R5cGUgPSBtc21fZXZ0LT5jb21tYW5kOworICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfZW5xdWV1ZV9ldnQobXlfb2JqLCAmZXZ0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1TTV9DQU1FUkFfUFJJVl9TSFVURE9XTjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIkNhbWVyYSBFdmVudCBEQUVNT04gRElFRCByZWNlaXZlZCIpOworICAgICAgICAgICAgICAgICAgICBldnQuc2VydmVyX2V2ZW50X3R5cGUgPSBDQU1fRVZFTlRfVFlQRV9EQUVNT05fRElFRDsKKyAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2VucXVldWVfZXZ0KG15X29iaiwgJmV2dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDQU1fRVZFTlRfVFlQRV9DQUNfRE9ORToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGV2dC5zZXJ2ZXJfZXZlbnRfdHlwZSA9IENBTV9FVkVOVF9UWVBFX0NBQ19ET05FOworICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfZW5xdWV1ZV9ldnQobXlfb2JqLCAmZXZ0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9lbnF1ZXVlX2V2dAorICoKKyAqIERFU0NSSVBUSU9OOiBlbnF1ZXVlIHJlY2VpdmVkIGV2ZW50IGludG8gZXZlbnQgcXVldWUgdG8gYmUgcHJvY2Vzc2VkIGJ5CisgKiAgICAgICAgICAgICAgZXZlbnQgdGhyZWFkLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgOiBwdHIgdG8gYSBjYW1lcmEgb2JqZWN0CisgKiAgIEBldmVudCAgICA6IGV2ZW50IHRvIGJlIHF1ZXVlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfZW5xdWV1ZV9ldnQobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfZXZlbnRfdCAqZXZlbnQpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgbW1fY2FtZXJhX2NtZGNiX3QgKm5vZGUgPSBOVUxMOworCisgICAgbm9kZSA9IChtbV9jYW1lcmFfY21kY2JfdCAqKW1hbGxvYyhzaXplb2YobW1fY2FtZXJhX2NtZGNiX3QpKTsKKyAgICBpZiAoTlVMTCAhPSBub2RlKSB7CisgICAgICAgIG1lbXNldChub2RlLCAwLCBzaXplb2YobW1fY2FtZXJhX2NtZGNiX3QpKTsKKyAgICAgICAgbm9kZS0+Y21kX3R5cGUgPSBNTV9DQU1FUkFfQ01EX1RZUEVfRVZUX0NCOworICAgICAgICBub2RlLT51LmV2dCA9ICpldmVudDsKKworICAgICAgICAvKiBlbnF1ZXVlIHRvIGV2dCBjbWQgdGhyZWFkICovCisgICAgICAgIGNhbV9xdWV1ZV9lbnEoJihteV9vYmotPmV2dF90aHJlYWQuY21kX3F1ZXVlKSwgbm9kZSk7CisgICAgICAgIC8qIHdha2UgdXAgZXZ0IGNtZCB0aHJlYWQgKi8KKyAgICAgICAgY2FtX3NlbV9wb3N0KCYobXlfb2JqLT5ldnRfdGhyZWFkLmNtZF9zZW0pKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIG1tX2NhbWVyYV9ub2RlX3QiKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX29wZW4KKyAqCisgKiBERVNDUklQVElPTjogb3BlbiBhIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgOiBwdHIgdG8gYSBjYW1lcmEgb2JqZWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9vcGVuKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqKQoreworICAgIGNoYXIgZGV2X25hbWVbTU1fQ0FNRVJBX0RFVl9OQU1FX0xFTl07CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgaW50OF90IG5fdHJ5PU1NX0NBTUVSQV9ERVZfT1BFTl9UUklFUzsKKyAgICB1aW50OF90IHNsZWVwX21zZWM9TU1fQ0FNRVJBX0RFVl9PUEVOX1JFVFJZX1NMRUVQOworICAgIGludCBjYW1faWR4ID0gMDsKKyAgICBjb25zdCBjaGFyICpkZXZfbmFtZV92YWx1ZSA9IE5VTEw7CisgICAgaW50IGxfZXJybm8gPSAwOworCisgICAgTE9HRCgiYmVnaW5cbiIpOworCisgICAgaWYgKE5VTEwgPT0gbXlfb2JqKSB7CisgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgfQorICAgIGRldl9uYW1lX3ZhbHVlID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2Rldl9uYW1lKG15X29iai0+bXlfaGRsKTsKKyAgICBpZiAoTlVMTCA9PSBkZXZfbmFtZV92YWx1ZSkgeworICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgIH0KKyAgICBzbnByaW50ZihkZXZfbmFtZSwgc2l6ZW9mKGRldl9uYW1lKSwgIi9kZXYvJXMiLAorICAgICAgICAgICAgIGRldl9uYW1lX3ZhbHVlKTsKKyAgICBzc2NhbmYoZGV2X25hbWUsICIvZGV2L3ZpZGVvJWQiLCAmY2FtX2lkeCk7CisgICAgTE9HRCgiZGV2IG5hbWUgPSAlcywgY2FtX2lkeCA9ICVkIiwgZGV2X25hbWUsIGNhbV9pZHgpOworCisgICAgZG97CisgICAgICAgIG5fdHJ5LS07CisgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgbXlfb2JqLT5jdHJsX2ZkID0gb3BlbihkZXZfbmFtZSwgT19SRFdSIHwgT19OT05CTE9DSyk7CisgICAgICAgIGxfZXJybm8gPSBlcnJubzsKKyAgICAgICAgTE9HRCgiY3RybF9mZCA9ICVkLCBlcnJubyA9PSAlZCIsIG15X29iai0+Y3RybF9mZCwgbF9lcnJubyk7CisgICAgICAgIGlmKChteV9vYmotPmN0cmxfZmQgPj0gMCkgfHwgKGVycm5vICE9IEVJTyAmJiBlcnJubyAhPSBFVElNRURPVVQpIHx8IChuX3RyeSA8PSAwICkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIExPR0UoIkZhaWxlZCB3aXRoICVzIGVycm9yLCByZXRyeWluZyBhZnRlciAlZCBtaWxsaS1zZWNvbmRzIiwKKyAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pLCBzbGVlcF9tc2VjKTsKKyAgICAgICAgdXNsZWVwKHNsZWVwX21zZWMgKiAxMDAwVSk7CisgICAgfXdoaWxlIChuX3RyeSA+IDApOworCisgICAgaWYgKG15X29iai0+Y3RybF9mZCA8IDApIHsKKyAgICAgICAgTE9HRSgiY2Fubm90IG9wZW4gY29udHJvbCBmZCBvZiAnJXMnICglcylcbiIsCisgICAgICAgICAgICAgICAgICBkZXZfbmFtZSwgc3RyZXJyb3IobF9lcnJubykpOworICAgICAgICBpZiAobF9lcnJubyA9PSBFQlVTWSkKKyAgICAgICAgICAgIHJjID0gLUVVU0VSUzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBvbl9lcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgICBtbV9jYW1lcmFfZ2V0X3Nlc3Npb25faWQobXlfb2JqLCAmbXlfb2JqLT5zZXNzaW9uaWQpOworICAgICAgICBMT0dIKCJDYW1lcmEgT3BlbmVkIGlkID0gJWQgc2Vzc2lvbmlkID0gJWQiLCBjYW1faWR4LCBteV9vYmotPnNlc3Npb25pZCk7CisgICAgfQorCisjaWZkZWYgREFFTU9OX1BSRVNFTlQKKyAgICAvKiBvcGVuIGRvbWFpbiBzb2NrZXQqLworICAgIG5fdHJ5ID0gTU1fQ0FNRVJBX0RFVl9PUEVOX1RSSUVTOworICAgIGRvIHsKKyAgICAgICAgbl90cnktLTsKKyAgICAgICAgbXlfb2JqLT5kc19mZCA9IG1tX2NhbWVyYV9zb2NrZXRfY3JlYXRlKGNhbV9pZHgsIE1NX0NBTUVSQV9TT0NLX1RZUEVfVURQKTsKKyAgICAgICAgbF9lcnJubyA9IGVycm5vOworICAgICAgICBMT0dEKCJkc19mZCA9ICVkLCBlcnJubyA9ICVkIiwgbXlfb2JqLT5kc19mZCwgbF9lcnJubyk7CisgICAgICAgIGlmKChteV9vYmotPmRzX2ZkID49IDApIHx8IChuX3RyeSA8PSAwICkpIHsKKyAgICAgICAgICAgIExPR0QoIm9wZW5lZCwgYnJlYWsgb3V0IHdoaWxlIGxvb3AiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIExPR0QoImZhaWxlZCB3aXRoIEkvTyBlcnJvciByZXRyeWluZyBhZnRlciAlZCBtaWxsaS1zZWNvbmRzIiwKKyAgICAgICAgICAgICAgc2xlZXBfbXNlYyk7CisgICAgICAgIHVzbGVlcChzbGVlcF9tc2VjICogMTAwMFUpOworICAgIH0gd2hpbGUgKG5fdHJ5ID4gMCk7CisKKyAgICBpZiAobXlfb2JqLT5kc19mZCA8IDApIHsKKyAgICAgICAgTE9HRSgiY2Fubm90IG9wZW4gZG9tYWluIHNvY2tldCBmZCBvZiAnJXMnKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgIGRldl9uYW1lLCBzdHJlcnJvcihsX2Vycm5vKSk7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gb25fZXJyb3I7CisgICAgfQorI2Vsc2UgLyogREFFTU9OX1BSRVNFTlQgKi8KKyAgICBjYW1fc3RhdHVzX3QgY2FtX3N0YXR1czsKKyAgICBjYW1fc3RhdHVzID0gbW1fY2FtZXJhX21vZHVsZV9vcGVuX3Nlc3Npb24obXlfb2JqLT5zZXNzaW9uaWQsCisgICAgICAgICAgICBtbV9jYW1lcmFfbW9kdWxlX2V2ZW50X2hhbmRsZXIpOworICAgIGlmIChjYW1fc3RhdHVzIDwgMCkgeworICAgICAgICBMT0dFKCJGYWlsZWQgdG8gb3BlbiBzZXNzaW9uIik7CisgICAgICAgIGlmIChjYW1fc3RhdHVzID09IENBTV9TVEFUVVNfQlVTWSkgeworICAgICAgICAgICAgcmMgPSAtRVVTRVJTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIG9uX2Vycm9yOworICAgIH0KKyNlbmRpZiAvKiBEQUVNT05fUFJFU0VOVCAqLworCisgICAgcHRocmVhZF9tdXRleF9pbml0KCZteV9vYmotPm1zZ19sb2NrLCBOVUxMKTsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJm15X29iai0+Y2JfbG9jaywgTlVMTCk7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZteV9vYmotPmV2dF9sb2NrLCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbXlfb2JqLT5ldnRfY29uZCwgTlVMTCk7CisKKyAgICBMT0dEKCJMYXVuY2ggZXZ0IFRocmVhZCBpbiBDYW0gT3BlbiIpOworICAgIHNucHJpbnRmKG15X29iai0+ZXZ0X3RocmVhZC50aHJlYWROYW1lLCBUSFJFQURfTkFNRV9TSVpFLCAiQ0FNX0Rpc3BhdGNoIik7CisgICAgbW1fY2FtZXJhX2NtZF90aHJlYWRfbGF1bmNoKCZteV9vYmotPmV2dF90aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9kaXNwYXRjaF9hcHBfZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbXlfb2JqKTsKKworICAgIC8qIGxhdW5jaCBldmVudCBwb2xsIHRocmVhZAorICAgICAqIHdlIHdpbGwgYWRkIGV2dCBmZCBpbnRvIGV2ZW50IHBvbGwgdGhyZWFkIHVwb24gdXNlciBmaXJzdCByZWdpc3RlciBmb3IgZXZ0ICovCisgICAgTE9HRCgiTGF1bmNoIGV2dCBQb2xsIFRocmVhZCBpbiBDYW0gT3BlbiIpOworICAgIHNucHJpbnRmKG15X29iai0+ZXZ0X3BvbGxfdGhyZWFkLnRocmVhZE5hbWUsIFRIUkVBRF9OQU1FX1NJWkUsICJDQU1fZXZudFBvbGwiKTsKKyAgICBtbV9jYW1lcmFfcG9sbF90aHJlYWRfbGF1bmNoKCZteV9vYmotPmV2dF9wb2xsX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NBTUVSQV9QT0xMX1RZUEVfRVZUKTsKKyAgICBtbV9jYW1lcmFfZXZ0X3N1YihteV9vYmosIFRSVUUpOworCisgICAgLyogdW5sb2NrIGNhbV9sb2NrLCB3ZSBuZWVkIHJlbGVhc2UgZ2xvYmFsIGludGZfbG9jayBpbiBjYW1lcmFfb3BlbigpLAorICAgICAqIGluIG9yZGVyIG5vdCBibG9jayBvcGVyYXRpb24gb2Ygb3RoZXIgQ2FtZXJhIGluIGR1YWwgY2FtZXJhIHVzZSBjYXNlLiovCisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIExPR0QoImVuZCAocmMgPSAlZClcbiIsIHJjKTsKKyAgICByZXR1cm4gcmM7CisKK29uX2Vycm9yOgorCisgICAgaWYgKE5VTEwgPT0gZGV2X25hbWVfdmFsdWUpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBkZXZpY2UgbmFtZVxuIik7CisgICAgICAgIHJjID0gLTE7CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gbXlfb2JqKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgY2FtZXJhIG9iamVjdFxuIik7CisgICAgICAgIHJjID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG15X29iai0+Y3RybF9mZCA+PSAwKSB7CisgICAgICAgICAgICBjbG9zZShteV9vYmotPmN0cmxfZmQpOworICAgICAgICAgICAgbXlfb2JqLT5jdHJsX2ZkID0gLTE7CisgICAgICAgIH0KKyNpZmRlZiBEQUVNT05fUFJFU0VOVAorICAgICAgICBpZiAobXlfb2JqLT5kc19mZCA+PSAwKSB7CisgICAgICAgICAgICBtbV9jYW1lcmFfc29ja2V0X2Nsb3NlKG15X29iai0+ZHNfZmQpOworICAgICAgICAgICAgbXlfb2JqLT5kc19mZCA9IC0xOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICAvKiB1bmxvY2sgY2FtX2xvY2ssIHdlIG5lZWQgcmVsZWFzZSBnbG9iYWwgaW50Zl9sb2NrIGluIGNhbWVyYV9vcGVuKCksCisgICAgICogaW4gb3JkZXIgbm90IGJsb2NrIG9wZXJhdGlvbiBvZiBvdGhlciBDYW1lcmEgaW4gZHVhbCBjYW1lcmEgdXNlIGNhc2UuKi8KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9jbG9zZQorICoKKyAqIERFU0NSSVBUSU9OOiBlbnF1ZXVlIHJlY2VpdmVkIGV2ZW50IGludG8gZXZlbnQgcXVldWUgdG8gYmUgcHJvY2Vzc2VkIGJ5CisgKiAgICAgICAgICAgICAgZXZlbnQgdGhyZWFkLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgOiBwdHIgdG8gYSBjYW1lcmEgb2JqZWN0CisgKiAgIEBldmVudCAgICA6IGV2ZW50IHRvIGJlIHF1ZXVlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfY2xvc2UobW1fY2FtZXJhX29ial90ICpteV9vYmopCit7CisgICAgTE9HRCgidW5zdWJzY3JpYmUgZXZ0Iik7CisKKyNpZm5kZWYgREFFTU9OX1BSRVNFTlQKKyAgICBtbV9jYW1lcmFfbW9kdWxlX2Nsb3NlX3Nlc3Npb24obXlfb2JqLT5zZXNzaW9uaWQpOworI2VuZGlmIC8qIERBRU1PTl9QUkVTRU5UICovCisKKyAgICBtbV9jYW1lcmFfZXZ0X3N1YihteV9vYmosIEZBTFNFKTsKKworICAgIExPR0QoIkNsb3NlIGV2dCBQb2xsIFRocmVhZCBpbiBDYW0gQ2xvc2UiKTsKKyAgICBtbV9jYW1lcmFfcG9sbF90aHJlYWRfcmVsZWFzZSgmbXlfb2JqLT5ldnRfcG9sbF90aHJlYWQpOworCisgICAgTE9HRCgiQ2xvc2UgZXZ0IGNtZCBUaHJlYWQgaW4gQ2FtIENsb3NlIik7CisgICAgbW1fY2FtZXJhX2NtZF90aHJlYWRfcmVsZWFzZSgmbXlfb2JqLT5ldnRfdGhyZWFkKTsKKworICAgIGlmKG15X29iai0+Y3RybF9mZCA+PSAwKSB7CisgICAgICAgIGNsb3NlKG15X29iai0+Y3RybF9mZCk7CisgICAgICAgIG15X29iai0+Y3RybF9mZCA9IC0xOworICAgIH0KKworI2lmZGVmIERBRU1PTl9QUkVTRU5UCisgICAgaWYobXlfb2JqLT5kc19mZCA+PSAwKSB7CisgICAgICAgIG1tX2NhbWVyYV9zb2NrZXRfY2xvc2UobXlfb2JqLT5kc19mZCk7CisgICAgICAgIG15X29iai0+ZHNfZmQgPSAtMTsKKyAgICB9CisjZW5kaWYKKworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXlfb2JqLT5tc2dfbG9jayk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZteV9vYmotPmNiX2xvY2spOworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXlfb2JqLT5ldnRfbG9jayk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJm15X29iai0+ZXZ0X2NvbmQpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfcmVnaXN0ZXJfZXZlbnRfbm90aWZ5X2ludGVybmFsCisgKgorICogREVTQ1JJUFRJT046IGludGVybmFsIGltcGxlbWVudGF0aW9uIGZvciByZWdpc3RlcmluZyBjYWxsYmFjayBmb3IgZXZlbnQgbm90aWZ5LgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgOiBwdHIgdG8gYSBjYW1lcmEgb2JqZWN0CisgKiAgIEBldnRfY2IgICA6IGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQgdG8gaGFuZGxlIGV2ZW50IG5vdGlmeQorICogICBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgcHRyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9yZWdpc3Rlcl9ldmVudF9ub3RpZnlfaW50ZXJuYWwobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2V2ZW50X25vdGlmeV90IGV2dF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlcl9kYXRhKQoreworICAgIGludCBpOworICAgIGludCByYyA9IC0xOworICAgIG1tX2NhbWVyYV9ldnRfb2JqX3QgKmV2dF9hcnJheSA9IE5VTEw7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2JfbG9jayk7CisgICAgZXZ0X2FycmF5ID0gJm15X29iai0+ZXZ0OworICAgIGlmKGV2dF9jYikgeworICAgICAgICAvKiB0aGlzIGlzIHJlZyBjYXNlICovCisgICAgICAgIGZvcihpID0gMDsgaSA8IE1NX0NBTUVSQV9FVlRfRU5UUllfTUFYOyBpKyspIHsKKyAgICAgICAgICAgIGlmKGV2dF9hcnJheS0+ZXZ0W2ldLnVzZXJfZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXZ0X2FycmF5LT5ldnRbaV0uZXZ0X2NiID0gZXZ0X2NiOworICAgICAgICAgICAgICAgIGV2dF9hcnJheS0+ZXZ0W2ldLnVzZXJfZGF0YSA9IHVzZXJfZGF0YTsKKyAgICAgICAgICAgICAgICBldnRfYXJyYXktPnJlZ19jb3VudCsrOworICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHRoaXMgaXMgdW5yZWcgY2FzZSAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCBNTV9DQU1FUkFfRVZUX0VOVFJZX01BWDsgaSsrKSB7CisgICAgICAgICAgICBpZihldnRfYXJyYXktPmV2dFtpXS51c2VyX2RhdGEgPT0gdXNlcl9kYXRhKSB7CisgICAgICAgICAgICAgICAgZXZ0X2FycmF5LT5ldnRbaV0uZXZ0X2NiID0gTlVMTDsKKyAgICAgICAgICAgICAgICBldnRfYXJyYXktPmV2dFtpXS51c2VyX2RhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgIGV2dF9hcnJheS0+cmVnX2NvdW50LS07CisgICAgICAgICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2JfbG9jayk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9yZWdpc3Rlcl9ldmVudF9ub3RpZnkKKyAqCisgKiBERVNDUklQVElPTjogcmVnaXN0ZXJpbmcgYSBjYWxsYmFjayBmb3IgZXZlbnQgbm90aWZ5LgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgOiBwdHIgdG8gYSBjYW1lcmEgb2JqZWN0CisgKiAgIEBldnRfY2IgICA6IGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQgdG8gaGFuZGxlIGV2ZW50IG5vdGlmeQorICogICBAdXNlcl9kYXRhOiB1c2VyIGRhdGEgcHRyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9yZWdpc3Rlcl9ldmVudF9ub3RpZnkobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2V2ZW50X25vdGlmeV90IGV2dF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlcl9kYXRhKQoreworICAgIGludCByYyA9IC0xOworICAgIHJjID0gbW1fY2FtZXJhX3JlZ2lzdGVyX2V2ZW50X25vdGlmeV9pbnRlcm5hbChteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2dF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcl9kYXRhKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9xYnVmCisgKgorICogREVTQ1JJUFRJT046IGVucXVldWUgYnVmZmVyIGJhY2sgdG8ga2VybmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAYnVmICAgICAgICAgIDogYnVmIHB0ciB0byBiZSBlbnF1ZXVlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfcWJ1ZihtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmJ1ZikKK3sKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBtbV9jaGFubmVsX3QgKiBjaF9vYmogPSBOVUxMOworICAgIGNoX29iaiA9IG1tX2NhbWVyYV91dGlsX2dldF9jaGFubmVsX2J5X2hhbmRsZXIobXlfb2JqLCBjaF9pZCk7CisKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisKKyAgICAvKiB3ZSBhbHdheXMgYXNzdW1lIHFidWYgd2lsbCBiZSBkb25lIGJlZm9yZSBjaGFubmVsL3N0cmVhbSBpcyBmdWxseSBzdG9wcGVkCisgICAgICogYmVjYXVzZSBxYnVmIGlzIGRvbmUgd2l0aGluIGRhdGFDQiBjb250ZXh0CisgICAgICogaW4gb3JkZXIgdG8gYXZvaWQgZGVhZGxvY2ssIHdlIGFyZSBub3QgbG9ja2luZyBjaF9sb2NrIGZvciBxYnVmICovCisgICAgaWYgKE5VTEwgIT0gY2hfb2JqKSB7CisgICAgICAgIHJjID0gbW1fY2hhbm5lbF9xYnVmKGNoX29iaiwgYnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2dldF9xdWV1ZWRfYnVmX2NvdW50CisgKgorICogREVTQ1JJUFRJT046IHJldHVybiBxdWV1ZWQgYnVmZmVyIGNvdW50CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAc3RyZWFtX2lkIDogc3RyZWFtIGlkCisgKgorICogUkVUVVJOICAgICA6IHF1ZXVlZCBidWZmZXIgY291bnQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfZ2V0X3F1ZXVlZF9idWZfY291bnQobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgIHVpbnQzMl90IGNoX2lkLCB1aW50MzJfdCBzdHJlYW1faWQpCit7CisgICAgaW50IHJjID0gLTE7CisgICAgbW1fY2hhbm5lbF90ICogY2hfb2JqID0gTlVMTDsKKyAgICB1aW50MzJfdCBwYXlsb2FkOworICAgIGNoX29iaiA9IG1tX2NhbWVyYV91dGlsX2dldF9jaGFubmVsX2J5X2hhbmRsZXIobXlfb2JqLCBjaF9pZCk7CisgICAgcGF5bG9hZCA9IHN0cmVhbV9pZDsKKworICAgIGlmIChOVUxMICE9IGNoX29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNoX29iai0+Y2hfbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgcmMgPSBtbV9jaGFubmVsX2ZzbV9mbihjaF9vYmosCisgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9FVlRfR0VUX1NUUkVBTV9RVUVVRURfQlVGX0NPVU5ULAorICAgICAgICAgICAgICAgICh2b2lkICopJnBheWxvYWQsCisgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfcXVlcnlfY2FwYWJpbGl0eQorICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBjYW1lcmEgY2FwYWJpbGl0eQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqOiBjYW1lcmEgb2JqZWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9xdWVyeV9jYXBhYmlsaXR5KG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqKQoreworICAgIGludDMyX3QgcmMgPSAwOworCisjaWZkZWYgREFFTU9OX1BSRVNFTlQKKyAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IGNhcDsKKyAgICAvKiBnZXQgY2FtZXJhIGNhcGFiaWxpdGllcyAqLworICAgIG1lbXNldCgmY2FwLCAwLCBzaXplb2YoY2FwKSk7CisgICAgcmMgPSBpb2N0bChteV9vYmotPmN0cmxfZmQsIFZJRElPQ19RVUVSWUNBUCwgJmNhcCk7CisjZWxzZSAvKiBEQUVNT05fUFJFU0VOVCAqLworICAgIGNhbV9zaGltX3BhY2tldF90ICpzaGltX2NtZDsKKyAgICBjYW1fc2hpbV9jbWRfZGF0YSBzaGltX2NtZF9kYXRhOworICAgIG1lbXNldCgmc2hpbV9jbWRfZGF0YSwgMCwgc2l6ZW9mKHNoaW1fY21kX2RhdGEpKTsKKyAgICBzaGltX2NtZF9kYXRhLmNvbW1hbmQgPSBNU01fQ0FNRVJBX1BSSVZfUVVFUllfQ0FQOworICAgIHNoaW1fY21kX2RhdGEuc3RyZWFtX2lkID0gMDsKKyAgICBzaGltX2NtZF9kYXRhLnZhbHVlID0gTlVMTDsKKyAgICBzaGltX2NtZCA9IG1tX2NhbWVyYV9jcmVhdGVfc2hpbV9jbWRfcGFja2V0KENBTV9TSElNX0dFVF9QQVJNLAorICAgICAgICAgICAgbXlfb2JqLT5zZXNzaW9uaWQsJnNoaW1fY21kX2RhdGEpOworICAgIHJjID0gbW1fY2FtZXJhX21vZHVsZV9zZW5kX2NtZChzaGltX2NtZCk7CisgICAgbW1fY2FtZXJhX2Rlc3Ryb3lfc2hpbV9jbWRfcGFja2V0KHNoaW1fY21kKTsKKyNlbmRpZiAvKiBEQUVNT05fUFJFU0VOVCAqLworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIExPR0UoImNhbm5vdCBnZXQgY2FtZXJhIGNhcGFiaWxpdGllcywgcmMgPSAlZCwgZXJybm8gJWQiLAorICAgICAgICAgICAgICAgIHJjLCBlcnJubyk7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3NldF9wYXJtcworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgcGFyYW1ldGVycyBwZXIgY2FtZXJhCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBwYXJtcyAgICAgICAgOiBwdHIgdG8gYSBwYXJhbSBzdHJ1Y3QgdG8gYmUgc2V0IHRvIHNlcnZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBBc3N1bWUgdGhlIHBhcm1zIHN0cnVjdCBidWYgaXMgYWxyZWFkeSBtYXBwZWQgdG8gc2VydmVyIHZpYQorICogICAgICAgICAgICAgIGRvbWFpbiBzb2NrZXQuIENvcnJlc3BvbmRpbmcgZmllbGRzIG9mIHBhcmFtZXRlcnMgdG8gYmUgc2V0CisgKiAgICAgICAgICAgICAgYXJlIGFscmVhZHkgZmlsbGVkIGluIGJ5IHVwcGVyIGxheWVyIGNhbGxlci4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfc2V0X3Bhcm1zKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1fYnVmZmVyX3QgKnBhcm1zKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBpbnQzMl90IHZhbHVlID0gMDsKKyAgICBpZiAocGFybXMgIT0gIE5VTEwpIHsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zX2N0cmwobXlfb2JqLCAwLCBteV9vYmotPmN0cmxfZmQsCisgICAgICAgICAgICBDQU1fUFJJVl9QQVJNLCAmdmFsdWUpOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9nZXRfcGFybXMKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IHBhcmFtZXRlcnMgcGVyIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2FtZXJhIG9iamVjdAorICogICBAcGFybXMgICAgICAgIDogcHRyIHRvIGEgcGFyYW0gc3RydWN0IHRvIGJlIGdldCBmcm9tIHNlcnZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBBc3N1bWUgdGhlIHBhcm1zIHN0cnVjdCBidWYgaXMgYWxyZWFkeSBtYXBwZWQgdG8gc2VydmVyIHZpYQorICogICAgICAgICAgICAgIGRvbWFpbiBzb2NrZXQuIFBhcmFtZXRlcnMgdG8gYmUgZ2V0IGZyb20gc2VydmVyIGFyZSBhbHJlYWR5CisgKiAgICAgICAgICAgICAgZmlsbGVkIGluIGJ5IHVwcGVyIGxheWVyIGNhbGxlci4gQWZ0ZXIgdGhpcyBjYWxsLCBjb3JyZXNwb25kaW5nCisgKiAgICAgICAgICAgICAgZmllbGRzIG9mIHJlcXVlc3RlZCBwYXJhbWV0ZXJzIHdpbGwgYmUgZmlsbGVkIGluIGJ5IHNlcnZlciB3aXRoCisgKiAgICAgICAgICAgICAgZGV0YWlsZWQgaW5mb3JtYXRpb24uCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX2dldF9wYXJtcyhtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJtX2J1ZmZlcl90ICpwYXJtcykKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgaW50MzJfdCB2YWx1ZSA9IDA7CisgICAgaWYgKHBhcm1zICE9IE5VTEwpIHsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9nX2N0cmwobXlfb2JqLCAwLCBteV9vYmotPmN0cmxfZmQsIENBTV9QUklWX1BBUk0sICZ2YWx1ZSk7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2RvX2F1dG9fZm9jdXMKKyAqCisgKiBERVNDUklQVElPTjogcGVyZm9ybWluZyBhdXRvIGZvY3VzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICogTk9URSAgICAgICA6IGlmIHRoaXMgY2FsbCBzdWNjZXNzLCB3ZSB3aWxsIGFsd2F5cyBhc3N1bWUgdGhlcmUgd2lsbAorICogICAgICAgICAgICAgIGJlIGFuIGF1dG9fZm9jdXMgZXZlbnQgZm9sbG93aW5nIHVwLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9kb19hdXRvX2ZvY3VzKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBpbnQzMl90IHZhbHVlID0gMDsKKyAgICByYyA9IG1tX2NhbWVyYV91dGlsX3NfY3RybChteV9vYmosIDAsIG15X29iai0+Y3RybF9mZCwgQ0FNX1BSSVZfRE9fQVVUT19GT0NVUywgJnZhbHVlKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9jYW5jZWxfYXV0b19mb2N1cworICoKKyAqIERFU0NSSVBUSU9OOiBjYW5jZWwgYXV0byBmb2N1cworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfY2FuY2VsX2F1dG9fZm9jdXMobW1fY2FtZXJhX29ial90ICpteV9vYmopCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIGludDMyX3QgdmFsdWUgPSAwOworICAgIHJjID0gbW1fY2FtZXJhX3V0aWxfc19jdHJsKG15X29iaiwgMCwgbXlfb2JqLT5jdHJsX2ZkLCBDQU1fUFJJVl9DQU5DRUxfQVVUT19GT0NVUywgJnZhbHVlKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9wcmVwYXJlX3NuYXBzaG90CisgKgorICogREVTQ1JJUFRJT046IHByZXBhcmUgaGFyZHdhcmUgZm9yIHNuYXBzaG90CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBkb19hZl9mbGFnICAgOiBmbGFnIGluZGljYXRpbmcgaWYgQUYgaXMgbmVlZGVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9wcmVwYXJlX3NuYXBzaG90KG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvX2FmX2ZsYWcpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIGludDMyX3QgdmFsdWUgPSBkb19hZl9mbGFnOworICAgIHJjID0gbW1fY2FtZXJhX3V0aWxfc19jdHJsKG15X29iaiwgMCwgbXlfb2JqLT5jdHJsX2ZkLCBDQU1fUFJJVl9QUkVQQVJFX1NOQVBTSE9ULCAmdmFsdWUpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3N0YXJ0X3pzbF9zbmFwc2hvdAorICoKKyAqIERFU0NSSVBUSU9OOiBzdGFydCB6c2wgc25hcHNob3QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNhbWVyYSBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX3N0YXJ0X3pzbF9zbmFwc2hvdChtbV9jYW1lcmFfb2JqX3QgKm15X29iaikKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgaW50MzJfdCB2YWx1ZSA9IDA7CisKKyAgICByYyA9IG1tX2NhbWVyYV91dGlsX3NfY3RybChteV9vYmosIDAsIG15X29iai0+Y3RybF9mZCwKKyAgICAgICAgICAgICBDQU1fUFJJVl9TVEFSVF9aU0xfU05BUFNIT1QsICZ2YWx1ZSk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9zdG9wX3pzbF9zbmFwc2hvdAorICoKKyAqIERFU0NSSVBUSU9OOiBzdG9wIHpzbCBjYXB0dXJlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9zdG9wX3pzbF9zbmFwc2hvdChtbV9jYW1lcmFfb2JqX3QgKm15X29iaikKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgaW50MzJfdCB2YWx1ZTsKKyAgICByYyA9IG1tX2NhbWVyYV91dGlsX3NfY3RybChteV9vYmosIDAsIG15X29iai0+Y3RybF9mZCwKKyAgICAgICAgICAgICBDQU1fUFJJVl9TVE9QX1pTTF9TTkFQU0hPVCwgJnZhbHVlKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ZsdXNoCisgKgorICogREVTQ1JJUFRJT046IGZsdXNoIHRoZSBjdXJyZW50IGNhbWVyYSBzdGF0ZSBhbmQgYnVmZmVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2FtZXJhIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfZmx1c2gobW1fY2FtZXJhX29ial90ICpteV9vYmopCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIGludDMyX3QgdmFsdWU7CisgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zX2N0cmwobXlfb2JqLCAwLCBteV9vYmotPmN0cmxfZmQsCisgICAgICAgICAgICBDQU1fUFJJVl9GTFVTSCwgJnZhbHVlKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9hZGRfY2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBhZGQgYSBjaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBhdHRyICAgICAgICAgOiBidW5kbGUgYXR0cmlidXRlIG9mIHRoZSBjaGFubmVsIGlmIG5lZWRlZAorICogICBAY2hhbm5lbF9jYiAgIDogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGJ1bmRsZSBkYXRhIG5vdGlmeQorICogICBAdXNlcmRhdGEgICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICAgOiB1aW50MzJfdCB0eXBlIG9mIGNoYW5uZWwgaGFuZGxlCisgKiAgICAgICAgICAgICAgMCAgLS0gaW52YWxpZCBjaGFubmVsIGhhbmRsZSwgbWVhbmluZyB0aGUgb3AgZmFpbGVkCisgKiAgICAgICAgICAgICAgPjAgLS0gc3VjY2Vzc2Z1bGx5IGFkZGVkIGEgY2hhbm5lbCB3aXRoIGEgdmFsaWQgaGFuZGxlCisgKiBOT1RFICAgICAgIDogaWYgbm8gYnVuZGxlIGRhdGEgbm90aWZ5IGlzIG5lZWRlZCwgbWVhbmluZyBlYWNoIHN0cmVhbSBpbiB0aGUKKyAqICAgICAgICAgICAgICBjaGFubmVsIHdpbGwgaGF2ZSBpdHMgb3duIHN0cmVhbSBkYXRhIG5vdGlmeSBjYWxsYmFjaywgdGhlbgorICogICAgICAgICAgICAgIGF0dHIsIGNoYW5uZWxfY2IsIGFuZCB1c2VyZGF0YSBjYW4gYmUgTlVMTC4gSW4gdGhpcyBjYXNlLAorICogICAgICAgICAgICAgIG5vIG1hdGNoaW5nIGxvZ2ljIHdpbGwgYmUgcGVyZm9ybWVkIGluIGNoYW5uZWwgZm9yIHRoZSBidW5kbGluZy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgbW1fY2FtZXJhX2FkZF9jaGFubmVsKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IGNoYW5uZWxfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgbW1fY2hhbm5lbF90ICpjaF9vYmogPSBOVUxMOworICAgIHVpbnQ4X3QgY2hfaWR4ID0gMDsKKyAgICB1aW50MzJfdCBjaF9oZGwgPSAwOworCisgICAgZm9yKGNoX2lkeCA9IDA7IGNoX2lkeCA8IE1NX0NBTUVSQV9DSEFOTkVMX01BWDsgY2hfaWR4KyspIHsKKyAgICAgICAgaWYgKE1NX0NIQU5ORUxfU1RBVEVfTk9UVVNFRCA9PSBteV9vYmotPmNoW2NoX2lkeF0uc3RhdGUpIHsKKyAgICAgICAgICAgIGNoX29iaiA9ICZteV9vYmotPmNoW2NoX2lkeF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChOVUxMICE9IGNoX29iaikgeworICAgICAgICAvKiBpbml0aWFsaXplIGNoYW5uZWwgb2JqICovCisgICAgICAgIG1lbXNldChjaF9vYmosIDAsIHNpemVvZihtbV9jaGFubmVsX3QpKTsKKyAgICAgICAgY2hfaGRsID0gbW1fY2FtZXJhX3V0aWxfZ2VuZXJhdGVfaGFuZGxlcihjaF9pZHgpOworICAgICAgICBjaF9vYmotPm15X2hkbCA9IGNoX2hkbDsKKyAgICAgICAgY2hfb2JqLT5zdGF0ZSA9IE1NX0NIQU5ORUxfU1RBVEVfU1RPUFBFRDsKKyAgICAgICAgY2hfb2JqLT5jYW1fb2JqID0gbXlfb2JqOworICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJmNoX29iai0+Y2hfbG9jaywgTlVMTCk7CisgICAgICAgIGNoX29iai0+c2Vzc2lvbmlkID0gbXlfb2JqLT5zZXNzaW9uaWQ7CisgICAgICAgIG1tX2NoYW5uZWxfaW5pdChjaF9vYmosIGF0dHIsIGNoYW5uZWxfY2IsIHVzZXJkYXRhKTsKKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisKKyAgICByZXR1cm4gY2hfaGRsOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9kZWxfY2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBkZWxldGUgYSBjaGFubmVsIGJ5IGl0cyBoYW5kbGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNhbWVyYSBvYmplY3QKKyAqICAgQGNoX2lkICAgICAgICA6IGNoYW5uZWwgaGFuZGxlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICogTk9URSAgICAgICA6IGFsbCBzdHJlYW1zIGluIHRoZSBjaGFubmVsIHNob3VsZCBiZSBzdG9wcGVkIGFscmVhZHkgYmVmb3JlCisgKiAgICAgICAgICAgICAgdGhpcyBjaGFubmVsIGNhbiBiZSBkZWxldGVkLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9kZWxfY2hhbm5lbChtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jaGFubmVsX3QgKiBjaF9vYmogPQorICAgICAgICBtbV9jYW1lcmFfdXRpbF9nZXRfY2hhbm5lbF9ieV9oYW5kbGVyKG15X29iaiwgY2hfaWQpOworCisgICAgaWYgKE5VTEwgIT0gY2hfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY2hfb2JqLT5jaF9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworCisgICAgICAgIHJjID0gbW1fY2hhbm5lbF9mc21fZm4oY2hfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NIQU5ORUxfRVZUX0RFTEVURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmY2hfb2JqLT5jaF9sb2NrKTsKKyAgICAgICAgbWVtc2V0KGNoX29iaiwgMCwgc2l6ZW9mKG1tX2NoYW5uZWxfdCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9nZXRfYnVuZGxlX2luZm8KKyAqCisgKiBERVNDUklQVElPTjogcXVlcnkgYnVuZGxlIGluZm8gb2YgdGhlIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNhbWVyYSBvYmplY3QKKyAqICAgQGNoX2lkICAgICAgICA6IGNoYW5uZWwgaGFuZGxlCisgKiAgIEBidW5kbGVfaW5mbyAgOiBidW5kbGUgaW5mbyB0byBiZSBmaWxsZWQgaW4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKiBOT1RFICAgICAgIDogYWxsIHN0cmVhbXMgaW4gdGhlIGNoYW5uZWwgc2hvdWxkIGJlIHN0b3BwZWQgYWxyZWFkeSBiZWZvcmUKKyAqICAgICAgICAgICAgICB0aGlzIGNoYW5uZWwgY2FuIGJlIGRlbGV0ZWQuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX2dldF9idW5kbGVfaW5mbyhtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fYnVuZGxlX2NvbmZpZ190ICpidW5kbGVfaW5mbykKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2hhbm5lbF90ICogY2hfb2JqID0KKyAgICAgICAgbW1fY2FtZXJhX3V0aWxfZ2V0X2NoYW5uZWxfYnlfaGFuZGxlcihteV9vYmosIGNoX2lkKTsKKworICAgIGlmIChOVUxMICE9IGNoX29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNoX29iai0+Y2hfbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKworICAgICAgICByYyA9IG1tX2NoYW5uZWxfZnNtX2ZuKGNoX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DSEFOTkVMX0VWVF9HRVRfQlVORExFX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilidW5kbGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfbGlua19zdHJlYW0KKyAqCisgKiBERVNDUklQVElPTjogbGluayBhIHN0cmVhbSBpbnRvIGEgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2FtZXJhIG9iamVjdAorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqICAgQHN0cmVhbV9pZCAgICA6IHN0cmVhbSB0aGF0IHdpbGwgYmUgbGlua2VkCisgKiAgIEBsaW5rZWRfY2hfaWQgOiBjaGFubmVsIGluIHdoaWNoIHRoZSBzdHJlYW0gd2lsbCBiZSBsaW5rZWQKKyAqCisgKiBSRVRVUk4gICAgIDogdWludDMyX3QgdHlwZSBvZiBzdHJlYW0gaGFuZGxlCisgKiAgICAgICAgICAgICAgMCAgLS0gaW52YWxpZCBzdHJlYW0gaGFuZGxlLCBtZWFuaW5nIHRoZSBvcCBmYWlsZWQKKyAqICAgICAgICAgICAgICA+MCAtLSBzdWNjZXNzZnVsbHkgbGlua2VkIGEgc3RyZWFtIHdpdGggYSB2YWxpZCBoYW5kbGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgbW1fY2FtZXJhX2xpbmtfc3RyZWFtKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkLAorICAgICAgICB1aW50MzJfdCBsaW5rZWRfY2hfaWQpCit7CisgICAgdWludDMyX3Qgc19oZGwgPSAwOworICAgIG1tX2NoYW5uZWxfdCAqIGNoX29iaiA9CisgICAgICAgICAgICBtbV9jYW1lcmFfdXRpbF9nZXRfY2hhbm5lbF9ieV9oYW5kbGVyKG15X29iaiwgbGlua2VkX2NoX2lkKTsKKyAgICBtbV9jaGFubmVsX3QgKiBvd25lcl9vYmogPQorICAgICAgICAgICAgbW1fY2FtZXJhX3V0aWxfZ2V0X2NoYW5uZWxfYnlfaGFuZGxlcihteV9vYmosIGNoX2lkKTsKKworICAgIGlmICgoTlVMTCAhPSBjaF9vYmopICYmIChOVUxMICE9IG93bmVyX29iaikpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjaF9vYmotPmNoX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisKKyAgICAgICAgbW1fY2FtZXJhX3N0cmVhbV9saW5rX3Qgc3RyZWFtX2xpbms7CisgICAgICAgIG1lbXNldCgmc3RyZWFtX2xpbmssIDAsIHNpemVvZihtbV9jYW1lcmFfc3RyZWFtX2xpbmtfdCkpOworICAgICAgICBzdHJlYW1fbGluay5jaCA9IG93bmVyX29iajsKKyAgICAgICAgc3RyZWFtX2xpbmsuc3RyZWFtX2lkID0gc3RyZWFtX2lkOworICAgICAgICBtbV9jaGFubmVsX2ZzbV9mbihjaF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NIQU5ORUxfRVZUX0xJTktfU1RSRUFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJnN0cmVhbV9saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJnNfaGRsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIHNfaGRsOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9hZGRfc3RyZWFtCisgKgorICogREVTQ1JJUFRJT046IGFkZCBhIHN0cmVhbSBpbnRvIGEgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2FtZXJhIG9iamVjdAorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogdWludDMyX3QgdHlwZSBvZiBzdHJlYW0gaGFuZGxlCisgKiAgICAgICAgICAgICAgMCAgLS0gaW52YWxpZCBzdHJlYW0gaGFuZGxlLCBtZWFuaW5nIHRoZSBvcCBmYWlsZWQKKyAqICAgICAgICAgICAgICA+MCAtLSBzdWNjZXNzZnVsbHkgYWRkZWQgYSBzdHJlYW0gd2l0aCBhIHZhbGlkIGhhbmRsZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50MzJfdCBtbV9jYW1lcmFfYWRkX3N0cmVhbShtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkKQoreworICAgIHVpbnQzMl90IHNfaGRsID0gMDsKKyAgICBtbV9jaGFubmVsX3QgKiBjaF9vYmogPQorICAgICAgICBtbV9jYW1lcmFfdXRpbF9nZXRfY2hhbm5lbF9ieV9oYW5kbGVyKG15X29iaiwgY2hfaWQpOworCisgICAgaWYgKE5VTEwgIT0gY2hfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY2hfb2JqLT5jaF9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworCisgICAgICAgIG1tX2NoYW5uZWxfZnNtX2ZuKGNoX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9FVlRfQUREX1NUUkVBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmc19oZGwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICB9CisKKyAgICByZXR1cm4gc19oZGw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2RlbF9zdHJlYW0KKyAqCisgKiBERVNDUklQVElPTjogZGVsZXRlIGEgc3RyZWFtIGJ5IGl0cyBoYW5kbGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNhbWVyYSBvYmplY3QKKyAqICAgQGNoX2lkICAgICAgICA6IGNoYW5uZWwgaGFuZGxlCisgKiAgIEBzdHJlYW1faWQgICAgOiBzdHJlYW0gaGFuZGxlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICogTk9URSAgICAgICA6IHN0cmVhbSBzaG91bGQgYmUgc3RvcHBlZCBhbHJlYWR5IGJlZm9yZSBpdCBjYW4gYmUgZGVsZXRlZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfZGVsX3N0cmVhbShtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCkKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2hhbm5lbF90ICogY2hfb2JqID0KKyAgICAgICAgbW1fY2FtZXJhX3V0aWxfZ2V0X2NoYW5uZWxfYnlfaGFuZGxlcihteV9vYmosIGNoX2lkKTsKKworICAgIGlmIChOVUxMICE9IGNoX29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNoX29iai0+Y2hfbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKworICAgICAgICByYyA9IG1tX2NoYW5uZWxfZnNtX2ZuKGNoX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DSEFOTkVMX0VWVF9ERUxfU1RSRUFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnN0cmVhbV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9zdGFydF96c2xfc25hcHNob3RfY2gKKyAqCisgKiBERVNDUklQVElPTjogc3RhcnRzIHpzbCBzbmFwc2hvdCBmb3Igc3BlY2lmaWMgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2FtZXJhIG9iamVjdAorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX3N0YXJ0X3pzbF9zbmFwc2hvdF9jaChtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgdWludDMyX3QgY2hfaWQpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX2NoYW5uZWxfdCAqIGNoX29iaiA9CisgICAgICAgIG1tX2NhbWVyYV91dGlsX2dldF9jaGFubmVsX2J5X2hhbmRsZXIobXlfb2JqLCBjaF9pZCk7CisKKyAgICBpZiAoTlVMTCAhPSBjaF9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjaF9vYmotPmNoX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisKKyAgICAgICAgcmMgPSBtbV9jaGFubmVsX2ZzbV9mbihjaF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9FVlRfU1RBUlRfWlNMX1NOQVBTSE9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfc3RvcF96c2xfc25hcHNob3RfY2gKKyAqCisgKiBERVNDUklQVElPTjogc3RvcHMgenNsIHNuYXBzaG90IGZvciBzcGVjaWZpYyBjaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfc3RvcF96c2xfc25hcHNob3RfY2gobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgIHVpbnQzMl90IGNoX2lkKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jaGFubmVsX3QgKiBjaF9vYmogPQorICAgICAgICBtbV9jYW1lcmFfdXRpbF9nZXRfY2hhbm5lbF9ieV9oYW5kbGVyKG15X29iaiwgY2hfaWQpOworCisgICAgaWYgKE5VTEwgIT0gY2hfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY2hfb2JqLT5jaF9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworCisgICAgICAgIHJjID0gbW1fY2hhbm5lbF9mc21fZm4oY2hfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NIQU5ORUxfRVZUX1NUT1BfWlNMX1NOQVBTSE9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfY29uZmlnX3N0cmVhbQorICoKKyAqIERFU0NSSVBUSU9OOiBjb25maWd1cmUgYSBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNhbWVyYSBvYmplY3QKKyAqICAgQGNoX2lkICAgICAgICA6IGNoYW5uZWwgaGFuZGxlCisgKiAgIEBzdHJlYW1faWQgICAgOiBzdHJlYW0gaGFuZGxlCisgKiAgIEBjb25maWcgICAgICAgOiBzdHJlYW0gY29uZmlndXJhdGlvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfY29uZmlnX3N0cmVhbShtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3N0cmVhbV9jb25maWdfdCAqY29uZmlnKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jaGFubmVsX3QgKiBjaF9vYmogPQorICAgICAgICBtbV9jYW1lcmFfdXRpbF9nZXRfY2hhbm5lbF9ieV9oYW5kbGVyKG15X29iaiwgY2hfaWQpOworICAgIG1tX2V2dF9wYXlsb2RfY29uZmlnX3N0cmVhbV90IHBheWxvYWQ7CisKKyAgICBpZiAoTlVMTCAhPSBjaF9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjaF9vYmotPmNoX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisKKyAgICAgICAgbWVtc2V0KCZwYXlsb2FkLCAwLCBzaXplb2YobW1fZXZ0X3BheWxvZF9jb25maWdfc3RyZWFtX3QpKTsKKyAgICAgICAgcGF5bG9hZC5zdHJlYW1faWQgPSBzdHJlYW1faWQ7CisgICAgICAgIHBheWxvYWQuY29uZmlnID0gY29uZmlnOworICAgICAgICByYyA9IG1tX2NoYW5uZWxfZnNtX2ZuKGNoX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DSEFOTkVMX0VWVF9DT05GSUdfU1RSRUFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfc3RhcnRfY2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBzdGFydCBhIGNoYW5uZWwsIHdoaWNoIHdpbGwgc3RhcnQgYWxsIHN0cmVhbXMgaW4gdGhlIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNhbWVyYSBvYmplY3QKKyAqICAgQGNoX2lkICAgICAgICA6IGNoYW5uZWwgaGFuZGxlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9zdGFydF9jaGFubmVsKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLCB1aW50MzJfdCBjaF9pZCkKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2hhbm5lbF90ICogY2hfb2JqID0KKyAgICAgICAgbW1fY2FtZXJhX3V0aWxfZ2V0X2NoYW5uZWxfYnlfaGFuZGxlcihteV9vYmosIGNoX2lkKTsKKworICAgIGlmIChOVUxMICE9IGNoX29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNoX29iai0+Y2hfbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKworICAgICAgICByYyA9IG1tX2NoYW5uZWxfZnNtX2ZuKGNoX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DSEFOTkVMX0VWVF9TVEFSVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3N0b3BfY2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBzdG9wIGEgY2hhbm5lbCwgd2hpY2ggd2lsbCBzdG9wIGFsbCBzdHJlYW1zIGluIHRoZSBjaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfc3RvcF9jaGFubmVsKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIG1tX2NoYW5uZWxfdCAqIGNoX29iaiA9CisgICAgICAgIG1tX2NhbWVyYV91dGlsX2dldF9jaGFubmVsX2J5X2hhbmRsZXIobXlfb2JqLCBjaF9pZCk7CisKKyAgICBpZiAoTlVMTCAhPSBjaF9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjaF9vYmotPmNoX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisKKyAgICAgICAgcmMgPSBtbV9jaGFubmVsX2ZzbV9mbihjaF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9FVlRfU1RPUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9yZXF1ZXN0X3N1cGVyX2J1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBmb3IgYnVyc3QgbW9kZSBpbiBidW5kbGUsIHJldXFlc3QgY2VydGFpbiBhbW91bnQgb2YgbWF0Y2hlZAorICogICAgICAgICAgICAgIGZyYW1lcyBmcm9tIHN1cGVyYnVmIHF1ZXVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAbnVtX2J1Zl9yZXF1ZXN0ZWQgOiBudW1iZXIgb2YgbWF0Y2hlZCBmcmFtZXMgbmVlZGVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9yZXF1ZXN0X3N1cGVyX2J1ZihtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgdWludDMyX3QgY2hfaWQsIG1tX2NhbWVyYV9yZXFfYnVmX3QgKmJ1ZikKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2hhbm5lbF90ICogY2hfb2JqID0KKyAgICAgICAgbW1fY2FtZXJhX3V0aWxfZ2V0X2NoYW5uZWxfYnlfaGFuZGxlcihteV9vYmosIGNoX2lkKTsKKworICAgIGlmICgoTlVMTCAhPSBjaF9vYmopICYmIChidWYgIT0gTlVMTCkpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjaF9vYmotPmNoX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisKKyAgICAgICAgcmMgPSBtbV9jaGFubmVsX2ZzbV9mbihjaF9vYmosIE1NX0NIQU5ORUxfRVZUX1JFUVVFU1RfU1VQRVJfQlVGLAorICAgICAgICAgICAgICAgICh2b2lkICopYnVmLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9jYW5jZWxfc3VwZXJfYnVmX3JlcXVlc3QKKyAqCisgKiBERVNDUklQVElPTjogZm9yIGJ1cnN0IG1vZGUgaW4gYnVuZGxlLCBjYW5jZWwgdGhlIHJldXFlc3QgZm9yIGNlcnRhaW4gYW1vdW50CisgKiAgICAgICAgICAgICAgb2YgbWF0Y2hlZCBmcmFtZXMgZnJvbSBzdXBlcmJ1ZiBxdWV1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2FtZXJhIG9iamVjdAorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX2NhbmNlbF9zdXBlcl9idWZfcmVxdWVzdChtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwgdWludDMyX3QgY2hfaWQpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX2NoYW5uZWxfdCAqIGNoX29iaiA9CisgICAgICAgIG1tX2NhbWVyYV91dGlsX2dldF9jaGFubmVsX2J5X2hhbmRsZXIobXlfb2JqLCBjaF9pZCk7CisKKyAgICBpZiAoTlVMTCAhPSBjaF9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjaF9vYmotPmNoX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisKKyAgICAgICAgcmMgPSBtbV9jaGFubmVsX2ZzbV9mbihjaF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9FVlRfQ0FOQ0VMX1JFUVVFU1RfU1VQRVJfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfZmx1c2hfc3VwZXJfYnVmX3F1ZXVlCisgKgorICogREVTQ1JJUFRJT046IGZsdXNoIG91dCBhbGwgZnJhbWVzIGluIHRoZSBzdXBlcmJ1ZiBxdWV1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2FtZXJhIG9iamVjdAorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX2ZsdXNoX3N1cGVyX2J1Zl9xdWV1ZShtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhbWVfaWR4KQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jaGFubmVsX3QgKiBjaF9vYmogPQorICAgICAgICBtbV9jYW1lcmFfdXRpbF9nZXRfY2hhbm5lbF9ieV9oYW5kbGVyKG15X29iaiwgY2hfaWQpOworCisgICAgaWYgKE5VTEwgIT0gY2hfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY2hfb2JqLT5jaF9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworCisgICAgICAgIHJjID0gbW1fY2hhbm5lbF9mc21fZm4oY2hfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NIQU5ORUxfRVZUX0ZMVVNIX1NVUEVSX0JVRl9RVUVVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZmcmFtZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfY29uZmlnX2NoYW5uZWxfbm90aWZ5CisgKgorICogREVTQ1JJUFRJT046IGNvbmZpZ3VyZXMgdGhlIGNoYW5uZWwgbm90aWZpY2F0aW9uIG1vZGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNhbWVyYSBvYmplY3QKKyAqICAgQGNoX2lkICAgICAgICA6IGNoYW5uZWwgaGFuZGxlCisgKiAgIEBub3RpZnlfbW9kZSAgOiBub3RpZmljYXRpb24gbW9kZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfY29uZmlnX2NoYW5uZWxfbm90aWZ5KG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfbm90aWZ5X21vZGVfdCBub3RpZnlfbW9kZSkKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2hhbm5lbF90ICogY2hfb2JqID0KKyAgICAgICAgbW1fY2FtZXJhX3V0aWxfZ2V0X2NoYW5uZWxfYnlfaGFuZGxlcihteV9vYmosIGNoX2lkKTsKKworICAgIGlmIChOVUxMICE9IGNoX29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNoX29iai0+Y2hfbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKworICAgICAgICByYyA9IG1tX2NoYW5uZWxfZnNtX2ZuKGNoX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DSEFOTkVMX0VWVF9DT05GSUdfTk9USUZZX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmbm90aWZ5X21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfc2V0X3N0cmVhbV9wYXJtcworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgcGFyYW1ldGVycyBwZXIgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAc19pZCAgICAgICAgIDogc3RyZWFtIGhhbmRsZQorICogICBAcGFybXMgICAgICAgIDogcHRyIHRvIGEgcGFyYW0gc3RydWN0IHRvIGJlIHNldCB0byBzZXJ2ZXIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKiBOT1RFICAgICAgIDogQXNzdW1lIHRoZSBwYXJtcyBzdHJ1Y3QgYnVmIGlzIGFscmVhZHkgbWFwcGVkIHRvIHNlcnZlciB2aWEKKyAqICAgICAgICAgICAgICBkb21haW4gc29ja2V0LiBDb3JyZXNwb25kaW5nIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHRvIGJlIHNldAorICogICAgICAgICAgICAgIGFyZSBhbHJlYWR5IGZpbGxlZCBpbiBieSB1cHBlciBsYXllciBjYWxsZXIuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX3NldF9zdHJlYW1fcGFybXMobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgKnBhcm1zKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9ldnRfcGF5bG9kX3NldF9nZXRfc3RyZWFtX3Bhcm1zX3QgcGF5bG9hZDsKKyAgICBtbV9jaGFubmVsX3QgKiBjaF9vYmogPQorICAgICAgICBtbV9jYW1lcmFfdXRpbF9nZXRfY2hhbm5lbF9ieV9oYW5kbGVyKG15X29iaiwgY2hfaWQpOworCisgICAgaWYgKE5VTEwgIT0gY2hfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY2hfb2JqLT5jaF9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworCisgICAgICAgIG1lbXNldCgmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKKyAgICAgICAgcGF5bG9hZC5zdHJlYW1faWQgPSBzX2lkOworICAgICAgICBwYXlsb2FkLnBhcm1zID0gcGFybXM7CisKKyAgICAgICAgcmMgPSBtbV9jaGFubmVsX2ZzbV9mbihjaF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9FVlRfU0VUX1NUUkVBTV9QQVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfZ2V0X3N0cmVhbV9wYXJtcworICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgcGFyYW1ldGVycyBwZXIgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAc19pZCAgICAgICAgIDogc3RyZWFtIGhhbmRsZQorICogICBAcGFybXMgICAgICAgIDogcHRyIHRvIGEgcGFyYW0gc3RydWN0IHRvIGJlIGdldCBmcm9tIHNlcnZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBBc3N1bWUgdGhlIHBhcm1zIHN0cnVjdCBidWYgaXMgYWxyZWFkeSBtYXBwZWQgdG8gc2VydmVyIHZpYQorICogICAgICAgICAgICAgIGRvbWFpbiBzb2NrZXQuIFBhcmFtZXRlcnMgdG8gYmUgZ2V0IGZyb20gc2VydmVyIGFyZSBhbHJlYWR5CisgKiAgICAgICAgICAgICAgZmlsbGVkIGluIGJ5IHVwcGVyIGxheWVyIGNhbGxlci4gQWZ0ZXIgdGhpcyBjYWxsLCBjb3JyZXNwb25kaW5nCisgKiAgICAgICAgICAgICAgZmllbGRzIG9mIHJlcXVlc3RlZCBwYXJhbWV0ZXJzIHdpbGwgYmUgZmlsbGVkIGluIGJ5IHNlcnZlciB3aXRoCisgKiAgICAgICAgICAgICAgZGV0YWlsZWQgaW5mb3JtYXRpb24uCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX2dldF9zdHJlYW1fcGFybXMobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgKnBhcm1zKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9ldnRfcGF5bG9kX3NldF9nZXRfc3RyZWFtX3Bhcm1zX3QgcGF5bG9hZDsKKyAgICBtbV9jaGFubmVsX3QgKiBjaF9vYmogPQorICAgICAgICBtbV9jYW1lcmFfdXRpbF9nZXRfY2hhbm5lbF9ieV9oYW5kbGVyKG15X29iaiwgY2hfaWQpOworCisgICAgaWYgKE5VTEwgIT0gY2hfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY2hfb2JqLT5jaF9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworCisgICAgICAgIG1lbXNldCgmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKKyAgICAgICAgcGF5bG9hZC5zdHJlYW1faWQgPSBzX2lkOworICAgICAgICBwYXlsb2FkLnBhcm1zID0gcGFybXM7CisKKyAgICAgICAgcmMgPSBtbV9jaGFubmVsX2ZzbV9mbihjaF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9FVlRfR0VUX1NUUkVBTV9QQVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfZG9fc3RyZWFtX2FjdGlvbgorICoKKyAqIERFU0NSSVBUSU9OOiByZXF1ZXN0IHNlcnZlciB0byBwZXJmb3JtIHN0cmVhbSBiYXNlZCBhY3Rpb24uIE1heWJlIHJlbW92ZWQgbGF0ZXIKKyAqICAgICAgICAgICAgICBpZiB0aGUgZnVuY3Rpb25hbGl0eSBpcyBpbmNsdWRlZCBpbiBtbV9jYW1lcmFfc2V0X3Bhcm1zCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAc19pZCAgICAgICAgIDogc3RyZWFtIGhhbmRsZQorICogICBAYWN0aW9ucyAgICAgIDogcHRyIHRvIGFuIGFjdGlvbiBzdHJ1Y3QgYnVmIHRvIGJlIHBlcmZvcm1lZCBieSBzZXJ2ZXIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKiBOT1RFICAgICAgIDogQXNzdW1lIHRoZSBhY3Rpb24gc3RydWN0IGJ1ZiBpcyBhbHJlYWR5IG1hcHBlZCB0byBzZXJ2ZXIgdmlhCisgKiAgICAgICAgICAgICAgZG9tYWluIHNvY2tldC4gQWN0aW9ucyB0byBiZSBwZXJmb3JtZWQgYnkgc2VydmVyIGFyZSBhbHJlYWR5CisgKiAgICAgICAgICAgICAgZmlsbGVkIGluIGJ5IHVwcGVyIGxheWVyIGNhbGxlci4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfZG9fc3RyZWFtX2FjdGlvbihtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYWN0aW9ucykKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fZXZ0X3BheWxvZF9kb19zdHJlYW1fYWN0aW9uX3QgcGF5bG9hZDsKKyAgICBtbV9jaGFubmVsX3QgKiBjaF9vYmogPQorICAgICAgICBtbV9jYW1lcmFfdXRpbF9nZXRfY2hhbm5lbF9ieV9oYW5kbGVyKG15X29iaiwgY2hfaWQpOworCisgICAgaWYgKE5VTEwgIT0gY2hfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY2hfb2JqLT5jaF9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworCisgICAgICAgIG1lbXNldCgmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKKyAgICAgICAgcGF5bG9hZC5zdHJlYW1faWQgPSBzdHJlYW1faWQ7CisgICAgICAgIHBheWxvYWQuYWN0aW9ucyA9IGFjdGlvbnM7CisKKyAgICAgICAgcmMgPSBtbV9jaGFubmVsX2ZzbV9mbihjaF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9FVlRfRE9fU1RSRUFNX0FDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJnBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfbWFwX3N0cmVhbV9idWYKKyAqCisgKiBERVNDUklQVElPTjogbWFwcGluZyBzdHJlYW0gYnVmZmVyIHZpYSBkb21haW4gc29ja2V0IHRvIHNlcnZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2FtZXJhIG9iamVjdAorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqICAgQHNfaWQgICAgICAgICA6IHN0cmVhbSBoYW5kbGUKKyAqICAgQGJ1Zl90eXBlICAgICA6IHR5cGUgb2YgYnVmZmVyIHRvIGJlIG1hcHBlZC4gY291bGQgYmUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9JTkZPCisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX0lOUFVUX0JVRgorICogICBAYnVmX2lkeCAgICAgIDogaW5kZXggb2YgYnVmZmVyIHdpdGhpbiB0aGUgc3RyZWFtIGJ1ZmZlcnMsIG9ubHkgdmFsaWQgaWYKKyAqICAgICAgICAgICAgICAgICAgIGJ1Zl90eXBlIGlzIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYgb3IKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfSU5QVVRfQlVGCisgKiAgIEBwbGFuZV9pZHggICAgOiBwbGFuZSBpbmRleC4gSWYgYWxsIHBsYW5lcyBzaGFyZSB0aGUgc2FtZSBmZCwKKyAqICAgICAgICAgICAgICAgICAgIHBsYW5lX2lkeCA9IC0xOyBvdGhlcndpc2UsIHBsZWFuX2lkeCBpcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgIGluZGV4IHRvIHBsYW5lICgwLi5udW1fb2ZfcGxhbmVzKQorICogICBAZmQgICAgICAgICAgIDogZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBidWZmZXIKKyAqICAgQHNpemUgICAgICAgICA6IHNpemUgb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfbWFwX3N0cmVhbV9idWYobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwbGFuZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlcikKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgY2FtX2J1Zl9tYXBfdHlwZSBwYXlsb2FkOworICAgIG1tX2NoYW5uZWxfdCAqIGNoX29iaiA9CisgICAgICAgIG1tX2NhbWVyYV91dGlsX2dldF9jaGFubmVsX2J5X2hhbmRsZXIobXlfb2JqLCBjaF9pZCk7CisKKyAgICBpZiAoTlVMTCAhPSBjaF9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjaF9vYmotPmNoX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisKKyAgICAgICAgbWVtc2V0KCZwYXlsb2FkLCAwLCBzaXplb2YocGF5bG9hZCkpOworICAgICAgICBwYXlsb2FkLnN0cmVhbV9pZCA9IHN0cmVhbV9pZDsKKyAgICAgICAgcGF5bG9hZC50eXBlID0gYnVmX3R5cGU7CisgICAgICAgIHBheWxvYWQuZnJhbWVfaWR4ID0gYnVmX2lkeDsKKyAgICAgICAgcGF5bG9hZC5wbGFuZV9pZHggPSBwbGFuZV9pZHg7CisgICAgICAgIHBheWxvYWQuZmQgPSBmZDsKKyAgICAgICAgcGF5bG9hZC5zaXplID0gc2l6ZTsKKyAgICAgICAgcGF5bG9hZC5idWZmZXIgPSBidWZmZXI7CisgICAgICAgIHJjID0gbW1fY2hhbm5lbF9mc21fZm4oY2hfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NIQU5ORUxfRVZUX01BUF9TVFJFQU1fQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikmcGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9tYXBfc3RyZWFtX2J1ZnMKKyAqCisgKiBERVNDUklQVElPTjogbWFwcGluZyBzdHJlYW0gYnVmZmVycyB2aWEgZG9tYWluIHNvY2tldCB0byBzZXJ2ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNhbWVyYSBvYmplY3QKKyAqICAgQGNoX2lkICAgICAgICA6IGNoYW5uZWwgaGFuZGxlCisgKiAgIEBidWZfbWFwX2xpc3QgOiBsaXN0IG9mIGJ1ZmZlcnMgdG8gYmUgbWFwcGVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9tYXBfc3RyZWFtX2J1ZnMobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtX2J1Zl9tYXBfdHlwZV9saXN0ICpidWZfbWFwX2xpc3QpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIGNhbV9idWZfbWFwX3R5cGVfbGlzdCBwYXlsb2FkOworICAgIG1tX2NoYW5uZWxfdCAqIGNoX29iaiA9CisgICAgICAgIG1tX2NhbWVyYV91dGlsX2dldF9jaGFubmVsX2J5X2hhbmRsZXIobXlfb2JqLCBjaF9pZCk7CisKKyAgICBpZiAoTlVMTCAhPSBjaF9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjaF9vYmotPmNoX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisKKyAgICAgICAgbWVtY3B5KCZwYXlsb2FkLCBidWZfbWFwX2xpc3QsIHNpemVvZihwYXlsb2FkKSk7CisgICAgICAgIHJjID0gbW1fY2hhbm5lbF9mc21fZm4oY2hfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NIQU5ORUxfRVZUX01BUF9TVFJFQU1fQlVGUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJnBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfdW5tYXBfc3RyZWFtX2J1ZgorICoKKyAqIERFU0NSSVBUSU9OOiB1bm1hcHBpbmcgc3RyZWFtIGJ1ZmZlciB2aWEgZG9tYWluIHNvY2tldCB0byBzZXJ2ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNhbWVyYSBvYmplY3QKKyAqICAgQGNoX2lkICAgICAgICA6IGNoYW5uZWwgaGFuZGxlCisgKiAgIEBzX2lkICAgICAgICAgOiBzdHJlYW0gaGFuZGxlCisgKiAgIEBidWZfdHlwZSAgICAgOiB0eXBlIG9mIGJ1ZmZlciB0byBiZSBtYXBwZWQuIGNvdWxkIGJlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGCisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fSU5GTworICogICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfT0ZGTElORV9JTlBVVF9CVUYKKyAqICAgQGJ1Zl9pZHggICAgICA6IGluZGV4IG9mIGJ1ZmZlciB3aXRoaW4gdGhlIHN0cmVhbSBidWZmZXJzLCBvbmx5IHZhbGlkIGlmCisgKiAgICAgICAgICAgICAgICAgICBidWZfdHlwZSBpcyBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGIG9yCisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX0lOUFVUX0JVRgorICogICBAcGxhbmVfaWR4ICAgIDogcGxhbmUgaW5kZXguIElmIGFsbCBwbGFuZXMgc2hhcmUgdGhlIHNhbWUgZmQsCisgKiAgICAgICAgICAgICAgICAgICBwbGFuZV9pZHggPSAtMTsgb3RoZXJ3aXNlLCBwbGVhbl9pZHggaXMgdGhlCisgKiAgICAgICAgICAgICAgICAgICBpbmRleCB0byBwbGFuZSAoMC4ubnVtX29mX3BsYW5lcykKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX3VubWFwX3N0cmVhbV9idWYobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1Zl9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4KQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBjYW1fYnVmX3VubWFwX3R5cGUgcGF5bG9hZDsKKyAgICBtbV9jaGFubmVsX3QgKiBjaF9vYmogPQorICAgICAgICBtbV9jYW1lcmFfdXRpbF9nZXRfY2hhbm5lbF9ieV9oYW5kbGVyKG15X29iaiwgY2hfaWQpOworCisgICAgaWYgKE5VTEwgIT0gY2hfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY2hfb2JqLT5jaF9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworCisgICAgICAgIG1lbXNldCgmcGF5bG9hZCwgMCwgc2l6ZW9mKHBheWxvYWQpKTsKKyAgICAgICAgcGF5bG9hZC5zdHJlYW1faWQgPSBzdHJlYW1faWQ7CisgICAgICAgIHBheWxvYWQudHlwZSA9IGJ1Zl90eXBlOworICAgICAgICBwYXlsb2FkLmZyYW1lX2lkeCA9IGJ1Zl9pZHg7CisgICAgICAgIHBheWxvYWQucGxhbmVfaWR4ID0gcGxhbmVfaWR4OworICAgICAgICByYyA9IG1tX2NoYW5uZWxfZnNtX2ZuKGNoX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DSEFOTkVMX0VWVF9VTk1BUF9TVFJFQU1fQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikmcGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9ldnRfc3ViCisgKgorICogREVTQ1JJUFRJT046IHN1YnNjcmliZS91bnN1YnNjcmliZSBldmVudCBub3RpZnkgZnJvbSBrZXJuZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNhbWVyYSBvYmplY3QKKyAqICAgQHJlZ19mbGFnICAgICA6IDEgLS0gc3Vic2NyaWJlIDsgMCAtLSB1bnN1YnNjcmliZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfZXZ0X3N1YihtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmVnX2ZsYWcpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uIHN1YjsKKworICAgIG1lbXNldCgmc3ViLCAwLCBzaXplb2Yoc3ViKSk7CisgICAgc3ViLnR5cGUgPSBNU01fQ0FNRVJBX1Y0TDJfRVZFTlRfVFlQRTsKKyAgICBzdWIuaWQgPSBNU01fQ0FNRVJBX01TTV9OT1RJRlk7CisgICAgaWYoRkFMU0UgPT0gcmVnX2ZsYWcpIHsKKyAgICAgICAgLyogdW5zdWJzY3JpYmUgKi8KKyAgICAgICAgcmMgPSBpb2N0bChteV9vYmotPmN0cmxfZmQsIFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVCwgJnN1Yik7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIExPR0UoInVuc3Vic2NyaWJlIGV2ZW50IHJjID0gJWQsIGVycm5vICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHJjLCBlcnJubyk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICAgICAgLyogcmVtb3ZlIGV2dCBmZCBmcm9tIHRoZSBwb2xsaW5nIHRocmFlZCB3aGVuIHVucmVnIHRoZSBsYXN0IGV2ZW50ICovCisgICAgICAgIHJjID0gbW1fY2FtZXJhX3BvbGxfdGhyZWFkX2RlbF9wb2xsX2ZkKCZteV9vYmotPmV2dF9wb2xsX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfb2JqLT5teV9oZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zeW5jX2NhbGwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJjID0gaW9jdGwobXlfb2JqLT5jdHJsX2ZkLCBWSURJT0NfU1VCU0NSSUJFX0VWRU5ULCAmc3ViKTsKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgTE9HRSgic3Vic2NyaWJlIGV2ZW50IHJjID0gJWQsIGVycm5vICVkIiwKKyAgICAgICAgICAgICByYywgZXJybm8pOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgICAgIC8qIGFkZCBldnQgZmQgdG8gcG9sbGluZyB0aHJlYWQgd2hlbiBzdWJzY3JpYmUgdGhlIGZpcnN0IGV2ZW50ICovCisgICAgICAgIHJjID0gbW1fY2FtZXJhX3BvbGxfdGhyZWFkX2FkZF9wb2xsX2ZkKCZteV9vYmotPmV2dF9wb2xsX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfb2JqLT5teV9oZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X29iai0+Y3RybF9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2V2ZW50X25vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3N5bmNfY2FsbCk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfdXRpbF93YWl0X2Zvcl9ldmVudAorICoKKyAqIERFU0NSSVBUSU9OOiB1dGlsaXR5IGZ1bmN0aW9uIHRvIHdhaXQgZm9yIGNlcnRhaW4gZXZlbnRzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBldnRfbWFzayAgICAgOiBtYXNrIGZvciBldmVudHMgdG8gYmUgd2FpdGVkLiBBbnkgb2YgZXZlbnQgaW4gdGhlIG1hc2sgd291bGQKKyAqICAgICAgICAgICAgICAgICAgIHRyaWdnZXIgdGhlIHdhaXQgdG8gZW5kCisgKiAgIEBzdGF0dXMgICAgICAgOiBzdGF0dXMgb2YgdGhlIGV2ZW50CisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBtbV9jYW1lcmFfdXRpbF93YWl0X2Zvcl9ldmVudChtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXZ0X21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpzdGF0dXMpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmV2dF9sb2NrKTsKKyAgICB3aGlsZSAoIShteV9vYmotPmV2dF9yY3ZkLnNlcnZlcl9ldmVudF90eXBlICYgZXZ0X21hc2spKSB7CisgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7CisgICAgICAgIHRzLnR2X3NlYyArPSBXQUlUX1RJTUVPVVQ7CisgICAgICAgIHJjID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmbXlfb2JqLT5ldnRfY29uZCwgJm15X29iai0+ZXZ0X2xvY2ssICZ0cyk7CisgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgTE9HRSgicHRocmVhZF9jb25kX3RpbWVkd2FpdCBvZiBldnRfbWFzayAweCV4IGZhaWxlZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICBldnRfbWFzaywgcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFyYykgeworICAgICAgICAqc3RhdHVzID0gbXlfb2JqLT5ldnRfcmN2ZC5zdGF0dXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnN0YXR1cyA9IE1TTV9DQU1FUkFfU1RBVFVTX0ZBSUw7CisgICAgfQorICAgIC8qIHJlc2V0IGxvY2FsIHN0b3JhZ2UgZm9yIHJlY2lldmVkIGV2ZW50IGZvciBuZXh0IGV2ZW50ICovCisgICAgbWVtc2V0KCZteV9vYmotPmV2dF9yY3ZkLCAwLCBzaXplb2YobW1fY2FtZXJhX2V2ZW50X3QpKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5ldnRfbG9jayk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3V0aWxfYnVuZGxlZF9zZW5kbXNnCisgKgorICogREVTQ1JJUFRJT046IHV0aWxpdHkgZnVuY3Rpb24gdG8gc2VuZCBidW5kbGVkIG1zZyB2aWEgZG9tYWluIHNvY2tldAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2FtZXJhIG9iamVjdAorICogICBAbXNnICAgICAgICAgIDogbWVzc2FnZSB0byBiZSBzZW50CisgKiAgIEBidWZfc2l6ZSAgICAgOiBzaXplIG9mIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQKKyAqICAgQHNlbmRmZHMgICAgICA6IGFycmF5IG9mIGZpbGUgZGVzY3JpcHRvcnMgdG8gYmUgc2VudAorICogICBAbnVtZmRzICAgICAgIDogbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgdG8gYmUgc2VudAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfdXRpbF9idW5kbGVkX3NlbmRtc2cobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VuZGZkc1tDQU1fTUFYX05VTV9CVUZTX1BFUl9TVFJFQU1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWZkcykKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgdWludDMyX3Qgc3RhdHVzOworCisgICAgLyogbmVlZCB0byBsb2NrIG1zZ19sb2NrLCBzaW5jZSBzZW5kbXNnIHVudGlsIHJlc3BvbnNlIGJhY2sgaXMgZGVlbWVkIGFzIG9uZSBvcGVyYXRpb24qLworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5tc2dfbG9jayk7CisgICAgaWYobW1fY2FtZXJhX3NvY2tldF9idW5kbGVfc2VuZG1zZyhteV9vYmotPmRzX2ZkLCBtc2csIGJ1Zl9zaXplLCBzZW5kZmRzLCBudW1mZHMpID4gMCkgeworICAgICAgICAvKiB3YWl0IGZvciBldmVudCB0aGF0IG1hcHBpbmcvdW5tYXBwaW5nIGlzIGRvbmUgKi8KKyAgICAgICAgbW1fY2FtZXJhX3V0aWxfd2FpdF9mb3JfZXZlbnQobXlfb2JqLCBDQU1fRVZFTlRfVFlQRV9NQVBfVU5NQVBfRE9ORSwgJnN0YXR1cyk7CisgICAgICAgIGlmIChNU01fQ0FNRVJBX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworICAgICAgICAgICAgcmMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPm1zZ19sb2NrKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3V0aWxfc2VuZG1zZworICoKKyAqIERFU0NSSVBUSU9OOiB1dGlsaXR5IGZ1bmN0aW9uIHRvIHNlbmQgbXNnIHZpYSBkb21haW4gc29ja2V0CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBtc2cgICAgICAgICAgOiBtZXNzYWdlIHRvIGJlIHNlbnQKKyAqICAgQGJ1Zl9zaXplICAgICA6IHNpemUgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgc2VudAorICogICBAc2VuZGZkICAgICAgIDogPjAgaWYgYW55IGZpbGUgZGVzY3JpcHRvciBuZWVkIHRvIGJlIHBhc3NlZCBhY3Jvc3MgcHJvY2VzcworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfdXRpbF9zZW5kbXNnKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlbmRmZCkKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgdWludDMyX3Qgc3RhdHVzOworCisgICAgLyogbmVlZCB0byBsb2NrIG1zZ19sb2NrLCBzaW5jZSBzZW5kbXNnIHVudGlsIHJlcG9zb25zZSBiYWNrIGlzIGRlZW1lZCBhcyBvbmUgb3BlcmF0aW9uKi8KKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+bXNnX2xvY2spOworICAgIGlmKG1tX2NhbWVyYV9zb2NrZXRfc2VuZG1zZyhteV9vYmotPmRzX2ZkLCBtc2csIGJ1Zl9zaXplLCBzZW5kZmQpID4gMCkgeworICAgICAgICAvKiB3YWl0IGZvciBldmVudCB0aGF0IG1hcHBpbmcvdW5tYXBwaW5nIGlzIGRvbmUgKi8KKyAgICAgICAgbW1fY2FtZXJhX3V0aWxfd2FpdF9mb3JfZXZlbnQobXlfb2JqLCBDQU1fRVZFTlRfVFlQRV9NQVBfVU5NQVBfRE9ORSwgJnN0YXR1cyk7CisgICAgICAgIGlmIChNU01fQ0FNRVJBX1NUQVRVU19TVUNDRVNTID09IHN0YXR1cykgeworICAgICAgICAgICAgcmMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPm1zZ19sb2NrKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPYSAgIDogbW1fY2FtZXJhX21hcF9idWYKKyAqCisgKiBERVNDUklQVElPTjogbWFwcGluZyBjYW1lcmEgYnVmZmVyIHZpYSBkb21haW4gc29ja2V0IHRvIHNlcnZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2FtZXJhIG9iamVjdAorICogICBAYnVmX3R5cGUgICAgIDogdHlwZSBvZiBidWZmZXIgdG8gYmUgbWFwcGVkLiBjb3VsZCBiZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfQ0FQQUJJTElUWQorICogICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU0VUUEFSTV9CVUYKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX0dFVFBBUk1fQlVGCisgKiAgIEBmZCAgICAgICAgICAgOiBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGJ1ZmZlcgorICogICBAc2l6ZSAgICAgICAgIDogc2l6ZSBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9tYXBfYnVmKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICB1aW50OF90IGJ1Zl90eXBlLCBpbnQgZmQsIHNpemVfdCBzaXplLCB2b2lkICpidWZmZXIpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisKKyAgICBjYW1fc29ja19wYWNrZXRfdCBwYWNrZXQ7CisgICAgbWVtc2V0KCZwYWNrZXQsIDAsIHNpemVvZihjYW1fc29ja19wYWNrZXRfdCkpOworICAgIHBhY2tldC5tc2dfdHlwZSA9IENBTV9NQVBQSU5HX1RZUEVfRkRfTUFQUElORzsKKyAgICBwYWNrZXQucGF5bG9hZC5idWZfbWFwLnR5cGUgPSBidWZfdHlwZTsKKyAgICBwYWNrZXQucGF5bG9hZC5idWZfbWFwLmZkID0gZmQ7CisgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcC5zaXplID0gc2l6ZTsKKyAgICBwYWNrZXQucGF5bG9hZC5idWZfbWFwLmJ1ZmZlciA9IGJ1ZmZlcjsKKyNpZmRlZiBEQUVNT05fUFJFU0VOVAorICAgIHJjID0gbW1fY2FtZXJhX3V0aWxfc2VuZG1zZyhteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjYW1fc29ja19wYWNrZXRfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkKTsKKyNlbHNlCisgICAgY2FtX3NoaW1fcGFja2V0X3QgKnNoaW1fY21kOworICAgIHNoaW1fY21kID0gbW1fY2FtZXJhX2NyZWF0ZV9zaGltX2NtZF9wYWNrZXQoQ0FNX1NISU1fUkVHX0JVRiwKKyAgICAgICAgICAgIG15X29iai0+c2Vzc2lvbmlkLCAmcGFja2V0KTsKKyAgICByYyA9IG1tX2NhbWVyYV9tb2R1bGVfc2VuZF9jbWQoc2hpbV9jbWQpOworICAgIG1tX2NhbWVyYV9kZXN0cm95X3NoaW1fY21kX3BhY2tldChzaGltX2NtZCk7CisjZW5kaWYKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9tYXBfYnVmcworICoKKyAqIERFU0NSSVBUSU9OOiBtYXBwaW5nIGNhbWVyYSBidWZmZXJzIHZpYSBkb21haW4gc29ja2V0IHRvIHNlcnZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2FtZXJhIG9iamVjdAorICogICBAYnVmX21hcF9saXN0IDogbGlzdCBvZiBidWZmZXJzIHRvIGJlIG1hcHBlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfbWFwX2J1ZnMobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1fYnVmX21hcF90eXBlX2xpc3QqIGJ1Zl9tYXBfbGlzdCkKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBjYW1fc29ja19wYWNrZXRfdCBwYWNrZXQ7CisgICAgbWVtc2V0KCZwYWNrZXQsIDAsIHNpemVvZihjYW1fc29ja19wYWNrZXRfdCkpOworICAgIHBhY2tldC5tc2dfdHlwZSA9IENBTV9NQVBQSU5HX1RZUEVfRkRfQlVORExFRF9NQVBQSU5HOworCisgICAgbWVtY3B5KCZwYWNrZXQucGF5bG9hZC5idWZfbWFwX2xpc3QsIGJ1Zl9tYXBfbGlzdCwKKyAgICAgICAgICAgc2l6ZW9mKHBhY2tldC5wYXlsb2FkLmJ1Zl9tYXBfbGlzdCkpOworCisgICAgaW50IHNlbmRmZHNbQ0FNX01BWF9OVU1fQlVGU19QRVJfU1RSRUFNXTsKKyAgICB1aW50MzJfdCBudW1idWZzID0gcGFja2V0LnBheWxvYWQuYnVmX21hcF9saXN0Lmxlbmd0aDsKKyAgICB1aW50MzJfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1idWZzOyBpKyspIHsKKyAgICAgICAgc2VuZGZkc1tpXSA9IHBhY2tldC5wYXlsb2FkLmJ1Zl9tYXBfbGlzdC5idWZfbWFwc1tpXS5mZDsKKyAgICAgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcF9saXN0LmJ1Zl9tYXBzW2ldLmJ1ZmZlciA9CisgICAgICAgICAgICAgICAgYnVmX21hcF9saXN0LT5idWZfbWFwc1tpXS5idWZmZXI7CisgICAgfQorICAgIGZvciAoaSA9IG51bWJ1ZnM7IGkgPCBDQU1fTUFYX05VTV9CVUZTX1BFUl9TVFJFQU07IGkrKykgeworICAgICAgICBwYWNrZXQucGF5bG9hZC5idWZfbWFwX2xpc3QuYnVmX21hcHNbaV0uZmQgPSAtMTsKKyAgICAgICAgc2VuZGZkc1tpXSA9IC0xOworICAgIH0KKworI2lmZGVmIERBRU1PTl9QUkVTRU5UCisgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9idW5kbGVkX3NlbmRtc2cobXlfb2JqLAorICAgICAgICAgICAgJnBhY2tldCwgc2l6ZW9mKGNhbV9zb2NrX3BhY2tldF90KSwKKyAgICAgICAgICAgIHNlbmRmZHMsIG51bWJ1ZnMpOworI2Vsc2UKKyAgICBjYW1fc2hpbV9wYWNrZXRfdCAqc2hpbV9jbWQ7CisgICAgc2hpbV9jbWQgPSBtbV9jYW1lcmFfY3JlYXRlX3NoaW1fY21kX3BhY2tldChDQU1fU0hJTV9SRUdfQlVGLAorICAgICAgICAgICAgbXlfb2JqLT5zZXNzaW9uaWQsICZwYWNrZXQpOworICAgIHJjID0gbW1fY2FtZXJhX21vZHVsZV9zZW5kX2NtZChzaGltX2NtZCk7CisgICAgbW1fY2FtZXJhX2Rlc3Ryb3lfc2hpbV9jbWRfcGFja2V0KHNoaW1fY21kKTsKKyNlbmRpZgorCisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfdW5tYXBfYnVmCisgKgorICogREVTQ1JJUFRJT046IHVubWFwcGluZyBjYW1lcmEgYnVmZmVyIHZpYSBkb21haW4gc29ja2V0IHRvIHNlcnZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2FtZXJhIG9iamVjdAorICogICBAYnVmX3R5cGUgICAgIDogdHlwZSBvZiBidWZmZXIgdG8gYmUgbWFwcGVkLiBjb3VsZCBiZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfQ0FQQUJJTElUWQorICogICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU0VUUEFSTV9CVUYKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX0dFVFBBUk1fQlVGCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV91bm1hcF9idWYobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBidWZfdHlwZSkKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBjYW1fc29ja19wYWNrZXRfdCBwYWNrZXQ7CisgICAgbWVtc2V0KCZwYWNrZXQsIDAsIHNpemVvZihjYW1fc29ja19wYWNrZXRfdCkpOworICAgIHBhY2tldC5tc2dfdHlwZSA9IENBTV9NQVBQSU5HX1RZUEVfRkRfVU5NQVBQSU5HOworICAgIHBhY2tldC5wYXlsb2FkLmJ1Zl91bm1hcC50eXBlID0gYnVmX3R5cGU7CisjaWZkZWYgREFFTU9OX1BSRVNFTlQKKyAgICByYyA9IG1tX2NhbWVyYV91dGlsX3NlbmRtc2cobXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FtX3NvY2tfcGFja2V0X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSk7CisjZWxzZQorICAgIGNhbV9zaGltX3BhY2tldF90ICpzaGltX2NtZDsKKyAgICBzaGltX2NtZCA9IG1tX2NhbWVyYV9jcmVhdGVfc2hpbV9jbWRfcGFja2V0KENBTV9TSElNX1JFR19CVUYsCisgICAgICAgICAgICBteV9vYmotPnNlc3Npb25pZCwgJnBhY2tldCk7CisgICAgcmMgPSBtbV9jYW1lcmFfbW9kdWxlX3NlbmRfY21kKHNoaW1fY21kKTsKKyAgICBtbV9jYW1lcmFfZGVzdHJveV9zaGltX2NtZF9wYWNrZXQoc2hpbV9jbWQpOworI2VuZGlmCisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfdXRpbF9zX2N0cmwKKyAqCisgKiBERVNDUklQVElPTjogdXRpbGl0eSBmdW5jdGlvbiB0byBzZW5kIHY0bDIgaW9jdGwgZm9yIHNfY3RybAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICA6Q2FtZXJhIG9iamVjdAorICogICBAc3RyZWFtX2lkIDpzdHJlYW1JRAorICogICBAZmQgICAgICA6IGZpbGUgZGVzY3JpdHBvciBmb3Igc2VuZGluZyBpb2N0bAorICogICBAaWQgICAgICA6IGNvbnRyb2wgaWQKKyAqICAgQHZhbHVlICAgOiB2YWx1ZSBvZiB0aGUgaW9jdGwgdG8gYmUgc2VudAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfdXRpbF9zX2N0cmwoX191bnVzZWQgbW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgIF9fdW51c2VkIGludCBzdHJlYW1faWQsIGludDMyX3QgZmQsCisgICAgICAgIHVpbnQzMl90IGlkLCBpbnQzMl90ICp2YWx1ZSkKK3sKKyAgICBpbnQgcmMgPSAwOworCisjaWZkZWYgREFFTU9OX1BSRVNFTlQKKyAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7CisgICAgbWVtc2V0KCZjb250cm9sLCAwLCBzaXplb2YoY29udHJvbCkpOworICAgIGNvbnRyb2wuaWQgPSBpZDsKKyAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICBjb250cm9sLnZhbHVlID0gKnZhbHVlOworICAgIH0KKyAgICByYyA9IGlvY3RsKGZkLCBWSURJT0NfU19DVFJMLCAmY29udHJvbCk7CisgICAgTE9HRCgiZmQ9JWQsIFNfQ1RSTCwgaWQ9MHgleCwgdmFsdWUgPSAlcCwgcmMgPSAlZFxuIiwKKyAgICAgICAgICBmZCwgaWQsIHZhbHVlLCByYyk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJpb2N0bCBmYWlsZWQgJWQsIGVycm5vICVkIiwgcmMsIGVycm5vKTsKKyAgICB9IGVsc2UgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgKnZhbHVlID0gY29udHJvbC52YWx1ZTsKKyAgICB9CisjZWxzZSAvKiBEQUVNT05fUFJFU0VOVCAqLworICAgIGNhbV9zaGltX3BhY2tldF90ICpzaGltX2NtZDsKKyAgICBjYW1fc2hpbV9jbWRfZGF0YSBzaGltX2NtZF9kYXRhOworICAgICh2b2lkKWZkOworICAgICh2b2lkKXZhbHVlOworICAgIG1lbXNldCgmc2hpbV9jbWRfZGF0YSwgMCwgc2l6ZW9mKHNoaW1fY21kX2RhdGEpKTsKKworICAgIHNoaW1fY21kX2RhdGEuY29tbWFuZCA9IGlkOworICAgIHNoaW1fY21kX2RhdGEuc3RyZWFtX2lkID0gc3RyZWFtX2lkOworICAgIHNoaW1fY21kX2RhdGEudmFsdWUgPSBOVUxMOworICAgIHNoaW1fY21kID0gbW1fY2FtZXJhX2NyZWF0ZV9zaGltX2NtZF9wYWNrZXQoQ0FNX1NISU1fU0VUX1BBUk0sCisgICAgICAgICAgICBteV9vYmotPnNlc3Npb25pZCwmc2hpbV9jbWRfZGF0YSk7CisgICAgcmMgPSBtbV9jYW1lcmFfbW9kdWxlX3NlbmRfY21kKHNoaW1fY21kKTsKKyAgICBtbV9jYW1lcmFfZGVzdHJveV9zaGltX2NtZF9wYWNrZXQoc2hpbV9jbWQpOworI2VuZGlmIC8qIERBRU1PTl9QUkVTRU5UICovCisgICAgcmV0dXJuIChyYyA+PSAwKT8gMCA6IC0xOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV91dGlsX2dfY3RybAorICoKKyAqIERFU0NSSVBUSU9OOiB1dGlsaXR5IGZ1bmN0aW9uIHRvIHNlbmQgdjRsMiBpb2N0bCBmb3IgZ19jdHJsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgIDpDYW1lcmEgb2JqZWN0CisgKiAgIEBzdHJlYW1faWQgOnN0cmVhbUlECisgKiAgIEBmZCAgICAgIDogZmlsZSBkZXNjcml0cG9yIGZvciBzZW5kaW5nIGlvY3RsCisgKiAgIEBpZCAgICAgIDogY29udHJvbCBpZAorICogICBAdmFsdWUgICA6IHZhbHVlIG9mIHRoZSBpb2N0bCB0byBiZSBzZW50CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV91dGlsX2dfY3RybChfX3VudXNlZCBtbV9jYW1lcmFfb2JqX3QgKm15X29iaiwKKyAgICAgICAgX191bnVzZWQgaW50IHN0cmVhbV9pZCwgaW50MzJfdCBmZCwgdWludDMyX3QgaWQsIGludDMyX3QgKnZhbHVlKQoreworICAgIGludCByYyA9IDA7CisgICAgc3RydWN0IHY0bDJfY29udHJvbCBjb250cm9sOworCisgICAgbWVtc2V0KCZjb250cm9sLCAwLCBzaXplb2YoY29udHJvbCkpOworICAgIGNvbnRyb2wuaWQgPSBpZDsKKyAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICBjb250cm9sLnZhbHVlID0gKnZhbHVlOworICAgIH0KKworI2lmZGVmIERBRU1PTl9QUkVTRU5UCisgICAgcmMgPSBpb2N0bChmZCwgVklESU9DX0dfQ1RSTCwgJmNvbnRyb2wpOworICAgIExPR0QoImZkPSVkLCBHX0NUUkwsIGlkPTB4JXgsIHJjID0gJWRcbiIsIGZkLCBpZCwgcmMpOworICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICp2YWx1ZSA9IGNvbnRyb2wudmFsdWU7CisgICAgfQorI2Vsc2UgLyogREFFTU9OX1BSRVNFTlQgKi8KKyAgICBjYW1fc2hpbV9wYWNrZXRfdCAqc2hpbV9jbWQ7CisgICAgY2FtX3NoaW1fY21kX2RhdGEgc2hpbV9jbWRfZGF0YTsKKyAgICAodm9pZClmZDsKKyAgICBtZW1zZXQoJnNoaW1fY21kX2RhdGEsIDAsIHNpemVvZihzaGltX2NtZF9kYXRhKSk7CisKKyAgICBzaGltX2NtZF9kYXRhLmNvbW1hbmQgPSBpZDsKKyAgICBzaGltX2NtZF9kYXRhLnN0cmVhbV9pZCA9IHN0cmVhbV9pZDsKKyAgICBzaGltX2NtZF9kYXRhLnZhbHVlID0gdmFsdWU7CisgICAgc2hpbV9jbWQgPSBtbV9jYW1lcmFfY3JlYXRlX3NoaW1fY21kX3BhY2tldChDQU1fU0hJTV9HRVRfUEFSTSwKKyAgICAgICAgICAgIG15X29iai0+c2Vzc2lvbmlkLCAmc2hpbV9jbWRfZGF0YSk7CisKKyAgICByYyA9IG1tX2NhbWVyYV9tb2R1bGVfc2VuZF9jbWQoc2hpbV9jbWQpOworICAgIG1tX2NhbWVyYV9kZXN0cm95X3NoaW1fY21kX3BhY2tldChzaGltX2NtZCk7CisjZW5kaWYgLyogREFFTU9OX1BSRVNFTlQgKi8KKyAgICByZXR1cm4gKHJjID49IDApPyAwIDogLTE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2NyZWF0ZV9zaGltX2NtZAorICoKKyAqIERFU0NSSVBUSU9OOiBQcmVwYXJlIGNvbWFuZCBwYWNrZXQgdG8gcGFzcyB0byBiYWNrLWVuZCB0aHJvdWdoIHNoaW0gbGF5ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHR5cGUgICAgICAgICAgICAgICAgOiB0eXBlIG9mIGNvbW1hbmQKKyAqICAgQHNlc3Npb25JRCAgICAgICAgOiBjYW1lcmEgc2Vzc2lvbklECisgICogIEBkYXRhICAgICAgICAgICAgICAgIDogY29tbWFuZCBkYXRhCisgKgorICogUkVUVVJOICAgICA6IE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlcworICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBwb2ludGVyIHRvIHNoaW0gcGFja2V0CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2NhbV9zaGltX3BhY2tldF90ICptbV9jYW1lcmFfY3JlYXRlX3NoaW1fY21kX3BhY2tldChjYW1fc2hpbV9jbWRfdHlwZSB0eXBlLAorICAgICAgICB1aW50MzJfdCBzZXNzaW9uSUQsIHZvaWQgKmRhdGEpCit7CisgICAgY2FtX3NoaW1fcGFja2V0X3QgKnNoaW1fcGFjayA9IE5VTEw7CisgICAgdWludDMyX3QgaSA9IDA7CisKKyAgICBzaGltX3BhY2sgPSAoY2FtX3NoaW1fcGFja2V0X3QgKiltYWxsb2Moc2l6ZW9mKGNhbV9zaGltX3BhY2tldF90KSk7CisgICAgaWYgKHNoaW1fcGFjayA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBhbGxvY2F0ZSBhIG1lbW9yeSBmb3Igc2hpbSBwYWNrZXQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1lbXNldChzaGltX3BhY2ssIDAsIHNpemVvZihjYW1fc2hpbV9wYWNrZXRfdCkpOworICAgIHNoaW1fcGFjay0+Y21kX3R5cGUgPSB0eXBlOworICAgIHNoaW1fcGFjay0+c2Vzc2lvbl9pZCA9IHNlc3Npb25JRDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBDQU1fU0hJTV9TRVRfUEFSTToKKyAgICAgICAgY2FzZSBDQU1fU0hJTV9HRVRfUEFSTTogeworICAgICAgICAgICAgY2FtX3NoaW1fY21kX2RhdGEgKmNtZF9kYXRhID0gKGNhbV9zaGltX2NtZF9kYXRhICopZGF0YTsKKyAgICAgICAgICAgIHNoaW1fcGFjay0+Y21kX2RhdGEgPSAqY21kX2RhdGE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIENBTV9TSElNX1JFR19CVUY6IHsKKyAgICAgICAgICAgIGNhbV9yZWdfYnVmX3QgKmNtZF9kYXRhID0gKGNhbV9yZWdfYnVmX3QgKilkYXRhOworICAgICAgICAgICAgc2hpbV9wYWNrLT5yZWdfYnVmID0gKmNtZF9kYXRhOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDQU1fU0hJTV9CVU5ETEVfQ01EOiB7CisgICAgICAgICAgICBjYW1fc2hpbV9zdHJlYW1fY21kX3BhY2tldF90ICpjbWRfZGF0YSA9IChjYW1fc2hpbV9zdHJlYW1fY21kX3BhY2tldF90ICopZGF0YTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbWRfZGF0YS0+c3RyZWFtX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBzaGltX3BhY2stPmJ1bmRsZV9jbWQuc3RyZWFtX2V2ZW50W2ldID0gY21kX2RhdGEtPnN0cmVhbV9ldmVudFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNoaW1fcGFjay0+YnVuZGxlX2NtZC5zdHJlYW1fY291bnQgPSBjbWRfZGF0YS0+c3RyZWFtX2NvdW50OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1coIk5vIERhdGEgZm9yIHRoaXMgY29tbWFuZCIpOworICAgIH0KKyAgICByZXR1cm4gc2hpbV9wYWNrOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9kZXN0cm95X3NoaW1fY21kCisgKgorICogREVTQ1JJUFRJT046IGRlc3Ryb3kgc2hpbSBwYWNrZXQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNtZCAgICAgICAgICAgICAgICA6IHB0ciB0byBzaGltIHBhY2tldAorCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX2Rlc3Ryb3lfc2hpbV9jbWRfcGFja2V0KGNhbV9zaGltX3BhY2tldF90ICpjbWQpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgdWludDMyX3QgaSA9IDAsIGogPSAwOworCisgICAgaWYgKGNtZCA9PSBOVUxMKSB7CisgICAgICAgIExPR1coIkNvbW1hbmQgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgc3dpdGNoIChjbWQtPmNtZF90eXBlKSB7CisgICAgICAgIGNhc2UgQ0FNX1NISU1fU0VUX1BBUk06CisgICAgICAgIGNhc2UgQ0FNX1NISU1fR0VUX1BBUk06CisgICAgICAgIGNhc2UgQ0FNX1NISU1fUkVHX0JVRjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTV9TSElNX0JVTkRMRV9DTUQ6IHsKKyAgICAgICAgICAgIGNhbV9zaGltX3N0cmVhbV9jbWRfcGFja2V0X3QgKmNtZF9kYXRhID0gKGNhbV9zaGltX3N0cmVhbV9jbWRfcGFja2V0X3QgKiljbWQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY21kX2RhdGEtPnN0cmVhbV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY2FtX3NoaW1fY21kX3BhY2tldF90ICpzdHJlYW1fZXZ0ID0gJmNtZF9kYXRhLT5zdHJlYW1fZXZlbnRbaV07CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHN0cmVhbV9ldnQtPmNtZF9jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1fZXZ0LT5jbWQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RyZWFtX2V2dC0+Y21kLT5jbWRfdHlwZSA9PSBDQU1fU0hJTV9CVU5ETEVfQ01EKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2Rlc3Ryb3lfc2hpbV9jbWRfcGFja2V0KHN0cmVhbV9ldnQtPmNtZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKHN0cmVhbV9ldnQtPmNtZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fZXZ0LT5jbWQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR1coIk5vIERhdGEgZm9yIHRoaXMgY29tbWFuZCIpOworICAgIH0KKyAgICBmcmVlKGNtZCk7CisgICAgY21kID0gTlVMTDsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2NoYW5uZWxfYWR2YW5jZWRfY2FwdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXRzIHRoZSBjaGFubmVsIGFkdmFuY2VkIGNhcHR1cmUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNhbWVyYSBvYmplY3QKKyAqICAgQGNoX2lkICAgICAgICA6IGNoYW5uZWwgaGFuZGxlCisgICogICBAdHlwZSA6IGFkdmFuY2VkIGNhcHR1cmUgdHlwZS4KKyAqICAgQHN0YXJ0X2ZsYWcgIDogZmxhZyB0byBpbmRpY2F0ZSBzdGFydC9zdG9wCisgICogICBAaW5fdmFsdWUgIDogaW5wdXQgY29uZmlnYXJhdGlvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfY2hhbm5lbF9hZHZhbmNlZF9jYXB0dXJlKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsIG1tX2NhbWVyYV9hZHZhbmNlZF9jYXB0dXJlX3QgdHlwZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHRyaWdnZXIsIHZvaWQgKmluX3ZhbHVlKQoreworICAgIExPR0QoIkUgdHlwZSA9ICVkIiwgdHlwZSk7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX2NoYW5uZWxfdCAqIGNoX29iaiA9CisgICAgICAgIG1tX2NhbWVyYV91dGlsX2dldF9jaGFubmVsX2J5X2hhbmRsZXIobXlfb2JqLCBjaF9pZCk7CisKKyAgICBpZiAoTlVMTCAhPSBjaF9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjaF9vYmotPmNoX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBNTV9DQU1FUkFfQUZfQlJBQ0tFVElORzoKKyAgICAgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfZnNtX2ZuKGNoX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NIQU5ORUxfRVZUX0FGX0JSQUNLRVRJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZ0cmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1NX0NBTUVSQV9BRV9CUkFDS0VUSU5HOgorICAgICAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9mc21fZm4oY2hfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9FVlRfQUVfQlJBQ0tFVElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnRyaWdnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0ZMQVNIX0JSQUNLRVRJTkc6CisgICAgICAgICAgICAgICAgcmMgPSBtbV9jaGFubmVsX2ZzbV9mbihjaF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DSEFOTkVMX0VWVF9GTEFTSF9CUkFDS0VUSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmdHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNTV9DQU1FUkFfWk9PTV8xWDoKKyAgICAgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfZnNtX2ZuKGNoX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NIQU5ORUxfRVZUX1pPT01fMVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZ0cmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1NX0NBTUVSQV9GUkFNRV9DQVBUVVJFOgorICAgICAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9mc21fZm4oY2hfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0VWVF9DQVBUVVJFX1NFVFRJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWluX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgfQorCisgICAgTE9HRCgiWCIpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfZ2V0X3Nlc3Npb25faWQKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IHRoZSBzZXNzaW9uIGlkZW50aXR5CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBzZXNzaW9uaWQ6IHBvaW50ZXIgdG8gdGhlIG91dHB1dCBzZXNzaW9uIGlkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICogTk9URSAgICAgICA6IGlmIHRoaXMgY2FsbCBzdWNjZWVkcywgd2Ugd2lsbCBnZXQgYSB2YWxpZCBzZXNzaW9uIGlkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX2dldF9zZXNzaW9uX2lkKG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqLAorICAgICAgICB1aW50MzJfdCogc2Vzc2lvbmlkKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBpbnQzMl90IHZhbHVlID0gMDsKKyAgICBpZihzZXNzaW9uaWQgIT0gTlVMTCkgeworICAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sIGNvbnRyb2w7CisgICAgICAgIG1lbXNldCgmY29udHJvbCwgMCwgc2l6ZW9mKGNvbnRyb2wpKTsKKyAgICAgICAgY29udHJvbC5pZCA9IE1TTV9DQU1FUkFfUFJJVl9HX1NFU1NJT05fSUQ7CisgICAgICAgIGNvbnRyb2wudmFsdWUgPSB2YWx1ZTsKKworICAgICAgICByYyA9IGlvY3RsKG15X29iai0+Y3RybF9mZCwgVklESU9DX0dfQ1RSTCwgJmNvbnRyb2wpOworICAgICAgICB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7CisgICAgICAgIExPR0QoImZkPSVkLCBnZXRfc2Vzc2lvbl9pZCwgaWQ9MHgleCwgdmFsdWUgPSAlZCwgcmMgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgbXlfb2JqLT5jdHJsX2ZkLCBNU01fQ0FNRVJBX1BSSVZfR19TRVNTSU9OX0lELAorICAgICAgICAgICAgICAgIHZhbHVlLCByYyk7CisgICAgICAgICpzZXNzaW9uaWQgPSB2YWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9zeW5jX3JlbGF0ZWRfc2Vuc29ycworICoKKyAqIERFU0NSSVBUSU9OOiBzZW5kIHN5bmMgY21kCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBwYXJtcyAgICAgICAgOiBwdHIgdG8gdGhlIHJlbGF0ZWQgY2FtIGluZm8gdG8gYmUgc2VudCB0byBzZXJ2ZXIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKiBOT1RFICAgICAgIDogQXNzdW1lIHRoZSBzeW5jIHN0cnVjdCBidWYgaXMgYWxyZWFkeSBtYXBwZWQgdG8gc2VydmVyIHZpYQorICogICAgICAgICAgICAgIGRvbWFpbiBzb2NrZXQuIENvcnJlc3BvbmRpbmcgZmllbGRzIG9mIHBhcmFtZXRlcnMgdG8gYmUgc2V0CisgKiAgICAgICAgICAgICAgYXJlIGFscmVhZHkgZmlsbGVkIGluIGJ5IHVwcGVyIGxheWVyIGNhbGxlci4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfc3luY19yZWxhdGVkX3NlbnNvcnMobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgIGNhbV9zeW5jX3JlbGF0ZWRfc2Vuc29yc19ldmVudF9pbmZvX3QqIHBhcm1zKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBpbnQzMl90IHZhbHVlID0gMDsKKyAgICBpZiAocGFybXMgIT0gIE5VTEwpIHsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zX2N0cmwobXlfb2JqLCAwLCBteV9vYmotPmN0cmxfZmQsCisgICAgICAgICAgICAgICAgQ0FNX1BSSVZfU1lOQ19SRUxBVEVEX1NFTlNPUlMsICZ2YWx1ZSk7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3JlZ19zdHJlYW1fYnVmX2NiCisgKgorICogREVTQ1JJUFRJT046IFJlZ2lzdGVyIGNhbGxiYWNrIGZvciBzdHJlYW0gYnVmZmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgOiBjYW1lcmEgb2JqZWN0CisgKiAgIEBjaF9pZCAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAc3RyZWFtX2lkIDogc3RyZWFtIHRoYXQgd2lsbCBiZSBsaW5rZWQKKyAqICAgQGJ1Zl9jYiAgICA6IHNwZWNpYWwgY2FsbGJhY2sgbmVlZHMgdG8gYmUgcmVnaXN0ZXJlZCBmb3Igc3RyZWFtIGJ1ZmZlcgorICogICBAY2JfdHlwZSAgIDogQ2FsbGJhY2sgdHlwZSBTWU5DL0FTWU5DCisgKiAgIEB1c2VyZGF0YSAgOiB1c2VyIGRhdGEgcG9pbnRlcgorICoKKyAqIFJFVFVSTiAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgIDEgLS0gIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfcmVnX3N0cmVhbV9idWZfY2IobW1fY2FtZXJhX29ial90ICpteV9vYmosCisgICAgICAgIHVpbnQzMl90IGNoX2lkLCB1aW50MzJfdCBzdHJlYW1faWQsIG1tX2NhbWVyYV9idWZfbm90aWZ5X3Qgc3RyZWFtX2NiLAorICAgICAgICBtbV9jYW1lcmFfc3RyZWFtX2NiX3R5cGUgY2JfdHlwZSwgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgaW50IHJjID0gMDsKKyAgICBtbV9zdHJlYW1fZGF0YV9jYl90IGJ1Zl9jYjsKKyAgICBtbV9jaGFubmVsX3QgKiBjaF9vYmogPQorICAgICAgICAgICAgbW1fY2FtZXJhX3V0aWxfZ2V0X2NoYW5uZWxfYnlfaGFuZGxlcihteV9vYmosIGNoX2lkKTsKKworICAgIGlmIChOVUxMICE9IGNoX29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmNoX29iai0+Y2hfbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKworICAgICAgICBtZW1zZXQoJmJ1Zl9jYiwgMCwgc2l6ZW9mKG1tX3N0cmVhbV9kYXRhX2NiX3QpKTsKKyAgICAgICAgYnVmX2NiLmNiID0gc3RyZWFtX2NiOworICAgICAgICBidWZfY2IuY2JfY291bnQgPSAtMTsKKyAgICAgICAgYnVmX2NiLmNiX3R5cGUgPSBjYl90eXBlOworICAgICAgICBidWZfY2IudXNlcl9kYXRhID0gdXNlcmRhdGE7CisKKyAgICAgICAgbW1fZXZ0X3BheWxvZF9yZWdfc3RyZWFtX2J1Zl9jYiBwYXlsb2FkOworICAgICAgICBtZW1zZXQoJnBheWxvYWQsIDAsIHNpemVvZihtbV9ldnRfcGF5bG9kX3JlZ19zdHJlYW1fYnVmX2NiKSk7CisgICAgICAgIHBheWxvYWQuYnVmX2NiID0gYnVmX2NiOworICAgICAgICBwYXlsb2FkLnN0cmVhbV9pZCA9IHN0cmVhbV9pZDsKKyAgICAgICAgbW1fY2hhbm5lbF9mc21fZm4oY2hfb2JqLAorICAgICAgICAgICAgICAgIE1NX0NIQU5ORUxfRVZUX1JFR19TVFJFQU1fQlVGX0NCLAorICAgICAgICAgICAgICAgICh2b2lkKikmcGF5bG9hZCwgTlVMTCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBRQ0FNRVJBX1JFREVGSU5FX0xPRworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogREVTQ1JJUFRJT046IG1tIGNhbWVyYSBkZWJ1ZyBpbnRlcmZhY2UKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3B0aHJlYWRfbXV0ZXhfdCBkYmdfbG9nX211dGV4OworCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJRQ2FtZXJhIgorI2RlZmluZSBDREJHX01BWF9TVFJfTEVOIDEwMjQKKyNkZWZpbmUgQ0RCR19NQVhfTElORV9MRU5HVEggMjU2CisKKy8qIGN1cnJlbnQgdHJhY2UgbG9nZ2luIHBlcm1pc3Npb25zCisgICAqIHtOT05FLCBFUlIsIFdBUk4sIEhJR0gsIERFQlVHLCBMT1csIElORk99ICovCitpbnQgZ19jYW1fbG9nW0NBTV9MQVNUX01PRFVMRV1bQ0FNX0dMQkxfREJHX0lORk8gKyAxXSA9IHsKKyAgICB7MCwgMSwgMCwgMCwgMCwgMCwgMX0sIC8qIENBTV9OT19NT0RVTEUgICAgICovCisgICAgezAsIDEsIDAsIDAsIDAsIDAsIDF9LCAvKiBDQU1fSEFMX01PRFVMRSAgICAqLworICAgIHswLCAxLCAwLCAwLCAwLCAwLCAxfSwgLyogQ0FNX01DSV9NT0RVTEUgICAgKi8KKyAgICB7MCwgMSwgMCwgMCwgMCwgMCwgMX0sIC8qIENBTV9KUEVHX01PRFVMRSAgICovCit9OworCisvKiBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIGxvZ2dpbmcgbGV2ZWwgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjYW1fZGJnX2xldmVsX3RvX3N0cltdID0geworICAgICAiIiwgICAgICAgIC8qIENBTV9HTEJMX0RCR19OT05FICAqLworICAgICAiPEVSUk9SPiIsIC8qIENBTV9HTEJMX0RCR19FUlIgICAqLworICAgICAiPFdBUk4+IiwgLyogQ0FNX0dMQkxfREJHX1dBUk4gICovCisgICAgICI8SElHSD4iLCAvKiBDQU1fR0xCTF9EQkdfSElHSCAgKi8KKyAgICAgIjxEQkc+IiwgLyogQ0FNX0dMQkxfREJHX0RFQlVHICovCisgICAgICI8TE9XPiIsIC8qIENBTV9HTEJMX0RCR19MT1cgICAqLworICAgICAiPElORk8+IiAgLyogQ0FNX0dMQkxfREJHX0lORk8gICovCit9OworCisvKiBjdXJyZW50IHRyYWNlIGxvZ2dpbmcgY29uZmlndXJhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgY2FtX2dsb2JhbF9kZWJ1Z19sZXZlbF90ICBsZXZlbDsKKyAgIGludCAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQ7CisgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgKm5hbWU7CisgICBjb25zdCBjaGFyICAgICAgICAgICAgICAgKnByb3A7Cit9IG1vZHVsZV9kZWJ1Z190OworCitzdGF0aWMgbW9kdWxlX2RlYnVnX3QgY2FtX2xvZ2luZm9bKGludClDQU1fTEFTVF9NT0RVTEVdID0geworICB7Q0FNX0dMQkxfREJHX0VSUiwgMSwKKyAgICAgICIiLCAgICAgICAgICJwZXJzaXN0LmNhbWVyYS5nbG9iYWwuZGVidWciICAgICB9LCAvKiBDQU1fTk9fTU9EVUxFICAgICAqLworICB7Q0FNX0dMQkxfREJHX0VSUiwgMSwKKyAgICAgICI8SEFMPiIsICJwZXJzaXN0LmNhbWVyYS5oYWwuZGVidWciICAgICAgICB9LCAvKiBDQU1fSEFMX01PRFVMRSAgICAqLworICB7Q0FNX0dMQkxfREJHX0VSUiwgMSwKKyAgICAgICI8TUNJPiIsICJwZXJzaXN0LmNhbWVyYS5tY2kuZGVidWciICAgICAgICB9LCAvKiBDQU1fTUNJX01PRFVMRSAgICAqLworICB7Q0FNX0dMQkxfREJHX0VSUiwgMSwKKyAgICAgICI8SlBFRz4iLCAicGVyc2lzdC5jYW1lcmEubW1zdGlsbC5sb2dzIiAgICAgfSwgLyogQ0FNX0pQRUdfTU9EVUxFICAgKi8KK307CisKKy8qKiBjYW1fZ2V0X2RiZ19sZXZlbAorICoKKyAqICAgIEBtb2R1bGU6IG1vZHVsZSBuYW1lCisgKiAgICBAbGV2ZWw6ICBtb2R1bGUgZGVidWcgbG9nZ2luZyBsZXZlbAorICoKKyAqICBNYXBzIGRlYnVnIGxvZyBzdHJpbmcgdG8gdmFsdWUuCisgKgorICogIFJldHVybjogbG9nZ2luZyBsZXZlbAorICoqLworX191bnVzZWQKK3N0YXRpYyBjYW1fZ2xvYmFsX2RlYnVnX2xldmVsX3QgY2FtX2dldF9kYmdfbGV2ZWwoY29uc3QgY2hhciAqbW9kdWxlLAorICBjaGFyICpwVmFsdWUpIHsKKworICBjYW1fZ2xvYmFsX2RlYnVnX2xldmVsX3QgcmMgPSBDQU1fR0xCTF9EQkdfTk9ORTsKKworICBpZiAoIXN0cmNtcChwVmFsdWUsICJub25lIikpIHsKKyAgICByYyA9IENBTV9HTEJMX0RCR19OT05FOworICB9IGVsc2UgaWYgKCFzdHJjbXAocFZhbHVlLCAid2FybiIpKSB7CisgICAgcmMgPSBDQU1fR0xCTF9EQkdfV0FSTjsKKyAgfSBlbHNlIGlmICghc3RyY21wKHBWYWx1ZSwgImRlYnVnIikpIHsKKyAgICByYyA9IENBTV9HTEJMX0RCR19ERUJVRzsKKyAgfSBlbHNlIGlmICghc3RyY21wKHBWYWx1ZSwgImVycm9yIikpIHsKKyAgICByYyA9IENBTV9HTEJMX0RCR19FUlI7CisgIH0gZWxzZSBpZiAoIXN0cmNtcChwVmFsdWUsICJsb3ciKSkgeworICAgIHJjID0gQ0FNX0dMQkxfREJHX0xPVzsKKyAgfSBlbHNlIGlmICghc3RyY21wKHBWYWx1ZSwgImhpZ2giKSkgeworICAgIHJjID0gQ0FNX0dMQkxfREJHX0hJR0g7CisgIH0gZWxzZSBpZiAoIXN0cmNtcChwVmFsdWUsICJpbmZvIikpIHsKKyAgICByYyA9IENBTV9HTEJMX0RCR19JTkZPOworICB9IGVsc2UgeworICAgIEFMT0dFKCJJbnZhbGlkICVzIGRlYnVnIGxvZyBsZXZlbCAlc1xuIiwgbW9kdWxlLCBwVmFsdWUpOworICB9CisKKyAgQUxPR0QoIiVzIGRlYnVnIGxvZyBsZXZlbDogJXNcbiIsIG1vZHVsZSwgY2FtX2RiZ19sZXZlbF90b19zdHJbcmNdKTsKKworICByZXR1cm4gcmM7Cit9CisKKy8qKiBjYW1fdnNucHJpbnRmCisgKiAgICBAcGRzdDogICBkZXN0aW5hdGlvbiBidWZmZXIgcG9pbnRlcgorICogICAgQHNpemU6ICAgc2l6ZSBvZiBkZXN0aW5hdGlvbiBiIHVmZmVyCisgKiAgICBAcGZtdDogICBzdHJpbmcgZm9ybWF0CisgKiAgICBAYXJncHRyOiB2YXJpYWJrbGUgbGVuZ3RoIGFyZ3VtZW50IGxpc3QKKyAqCisgKiAgUHJvY2Vzc2VzIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudCBsaXN0IHRvIGEgZm9ybWF0dGVkIHN0cmluZy4KKyAqCisgKiAgUmV0dXJuOiBuL2EKKyAqKi8KK3N0YXRpYyB2b2lkIGNhbV92c25wcmludGYoY2hhciogcGRzdCwgdW5zaWduZWQgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBmbXQsIHZhX2xpc3QgYXJncHRyKSB7CisgIGludCBudW1fY2hhcnNfd3JpdHRlbiA9IDA7CisKKyAgcGRzdFswXSA9ICdcMCc7CisgIG51bV9jaGFyc193cml0dGVuID0gdnNucHJpbnRmKHBkc3QsIHNpemUsIHBmbXQsIGFyZ3B0cik7CisKKyAgaWYgKChudW1fY2hhcnNfd3JpdHRlbiA+PSAoaW50KXNpemUpICYmIChzaXplID4gMCkpIHsKKyAgICAgLyogTWVzc2FnZSBsZW5ndGggZXhjZWVkcyB0aGUgYnVmZmVyIGxpbWl0IHNpemUgKi8KKyAgICAgbnVtX2NoYXJzX3dyaXR0ZW4gPSBzaXplIC0gMTsKKyAgICAgcGRzdFtzaXplIC0gMV0gPSAnXDAnOworICB9Cit9CisKKy8qKiBtbV9jYW1lcmFfZGVidWdfbG9nCisgKiAgICBAbW9kdWxlOiBvcmlnaW4gb3IgbG9nIG1lc3NhZ2UKKyAqICAgIEBsZXZlbDogIGxvZ2dpbmcgbGV2ZWwKKyAqICAgIEBmdW5jOiAgIGNhbGxlciBmdW5jdGlvbiBuYW1lCisgKiAgICBAbGluZTogICBjYWxsZXIgbGluZSBudW1iZXIKKyAqICAgIEBmbXQ6ICAgIGxvZyBtZXNzYWdlIGZvcm1hdHRpbmcgc3RyaW5nCisgKiAgICBALi4uOiAgICB2YXJpYWJsZSBhcmd1bWVudCBsaXN0CisgKgorICogIEdlbmVyaWcgbG9nZ2VyIG1ldGhvZC4KKyAqCisgKiAgUmV0dXJuOiBOL0EKKyAqKi8KK3ZvaWQgbW1fY2FtZXJhX2RlYnVnX2xvZyhjb25zdCBjYW1fbW9kdWxlc190IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1fZ2xvYmFsX2RlYnVnX2xldmVsX3QgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuYywgY29uc3QgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CisgIGNoYXIgICAgc3RyX2J1ZmZlcltDREJHX01BWF9TVFJfTEVOXTsKKyAgdmFfbGlzdCBhcmdzOworCisgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgIGNhbV92c25wcmludGYoc3RyX2J1ZmZlciwgQ0RCR19NQVhfU1RSX0xFTiwgZm10LCBhcmdzKTsKKyAgdmFfZW5kKGFyZ3MpOworCisgIHN3aXRjaCAobGV2ZWwpIHsKKyAgY2FzZSBDQU1fR0xCTF9EQkdfV0FSTjoKKyAgICBBTE9HVygiJXMlcyAlczogJWQ6ICVzIiwgY2FtX2xvZ2luZm9bbW9kdWxlXS5uYW1lLAorICAgICAgY2FtX2RiZ19sZXZlbF90b19zdHJbbGV2ZWxdLCBmdW5jLCBsaW5lLCBzdHJfYnVmZmVyKTsKKyAgICBicmVhazsKKyAgY2FzZSBDQU1fR0xCTF9EQkdfRVJSOgorICAgIEFMT0dFKCIlcyVzICVzOiAlZDogJXMiLCBjYW1fbG9naW5mb1ttb2R1bGVdLm5hbWUsCisgICAgICBjYW1fZGJnX2xldmVsX3RvX3N0cltsZXZlbF0sIGZ1bmMsIGxpbmUsIHN0cl9idWZmZXIpOworICAgIGJyZWFrOworICBjYXNlIENBTV9HTEJMX0RCR19JTkZPOgorICAgIEFMT0dJKCIlcyVzICVzOiAlZDogJXMiLCBjYW1fbG9naW5mb1ttb2R1bGVdLm5hbWUsCisgICAgICBjYW1fZGJnX2xldmVsX3RvX3N0cltsZXZlbF0sIGZ1bmMsIGxpbmUsIHN0cl9idWZmZXIpOworICAgIGJyZWFrOworICBjYXNlIENBTV9HTEJMX0RCR19ISUdIOgorICBjYXNlIENBTV9HTEJMX0RCR19ERUJVRzoKKyAgY2FzZSBDQU1fR0xCTF9EQkdfTE9XOgorICBkZWZhdWx0OgorICAgIEFMT0dEKCIlcyVzICVzOiAlZDogJXMiLCBjYW1fbG9naW5mb1ttb2R1bGVdLm5hbWUsCisgICAgICBjYW1fZGJnX2xldmVsX3RvX3N0cltsZXZlbF0sIGZ1bmMsIGxpbmUsIHN0cl9idWZmZXIpOworICB9Cit9CisKKyAvKiogbW1fY2FtZXJhX3NldF9kYmdfbG9nX3Byb3BlcnRpZXMKKyAqCisgKiAgU2V0IGdsb2JhbCBhbmQgbW9kdWxlIGxvZyBsZXZlbCBwcm9wZXJ0aWVzLgorICoKKyAqICBSZXR1cm46IE4vQQorICoqLwordm9pZCBtbV9jYW1lcmFfc2V0X2RiZ19sb2dfcHJvcGVydGllcyh2b2lkKSB7CisgIGludCAgICAgICAgICBpOworICB1bnNpZ25lZCBpbnQgajsKKyAgc3RhdGljIGludCAgIGJvb3RfaW5pdCA9IDE7CisgIGNoYXIgICAgICAgICBwcm9wZXJ0eV92YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdID0gezB9OworICBjaGFyICAgICAgICAgZGVmYXVsdF92YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdICA9IHswfTsKKworICBpZiAoYm9vdF9pbml0KSB7CisgICAgICBib290X2luaXQgPSAwOworICAgICAgcHRocmVhZF9tdXRleF9pbml0KCZkYmdfbG9nX211dGV4LCAwKTsKKyAgfQorCisgIC8qIHNldCBnbG9iYWwgYW5kIGluZGl2aWR1YWwgbW9kdWxlIGxvZ2dpbmcgbGV2ZWxzICovCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZGJnX2xvZ19tdXRleCk7CisgIGZvciAoaSA9IENBTV9OT19NT0RVTEU7IGkgPCBDQU1fTEFTVF9NT0RVTEU7IGkrKykgeworICAgIGNhbV9nbG9iYWxfZGVidWdfbGV2ZWxfdCBsb2dfbGV2ZWw7CisgICAgc25wcmludGYoZGVmYXVsdF92YWx1ZSwgUFJPUEVSVFlfVkFMVUVfTUFYLCAiJWQiLCAoaW50KWNhbV9sb2dpbmZvW2ldLmxldmVsKTsKKyAgICBwcm9wZXJ0eV9nZXQoY2FtX2xvZ2luZm9baV0ucHJvcCwgcHJvcGVydHlfdmFsdWUsIGRlZmF1bHRfdmFsdWUpOworICAgIGxvZ19sZXZlbCA9IChjYW1fZ2xvYmFsX2RlYnVnX2xldmVsX3QpYXRvaShwcm9wZXJ0eV92YWx1ZSk7CisKKyAgICAvKiBmaXggS1cgd2FybmluZ3MgKi8KKyAgICBpZiAobG9nX2xldmVsID4gQ0FNX0dMQkxfREJHX0lORk8pIHsKKyAgICAgICBsb2dfbGV2ZWwgPSBDQU1fR0xCTF9EQkdfSU5GTzsKKyAgICB9CisKKyAgICBjYW1fbG9naW5mb1tpXS5sZXZlbCA9IGxvZ19sZXZlbDsKKworICAgIC8qIFRoZSBsb2dnaW5nIG1hY3JvcyB3aWxsIHByb2R1Y2UgYSBsb2cgbWVzc2FnZSB3aGVuIGxvZ2dpbmcgbGV2ZWwgZm9yCisgICAgICogYSBtb2R1bGUgaXMgbGVzcyBvciBlcXVhbCB0byB0aGUgbGV2ZWwgc3BlY2lmaWVkIGluIHRoZSBwcm9wZXJ0eSBmb3IKKyAgICAgKiB0aGUgbW9kdWxlLCBvciBsZXNzIG9yIGVxdWFsIHRoZSBsZXZlbCBzcGVjaWZpZWQgYnkgdGhlIGdsb2JhbCBsb2dnaW5nCisgICAgICogcHJvcGVydHkuIEN1cnJlbnRseSB3ZSBkb24ndCBhbGxvdyBJTkZPIGxvZ2dpbmcgdG8gYmUgdHVybmVkIG9mZiAqLworICAgIGZvciAoaiA9IENBTV9HTEJMX0RCR19FUlI7IGogPD0gQ0FNX0dMQkxfREJHX0xPVzsgaisrKSB7CisgICAgICBnX2NhbV9sb2dbaV1bal0gPSAoY2FtX2xvZ2luZm9bQ0FNX05PX01PRFVMRV0ubGV2ZWwgIT0gQ0FNX0dMQkxfREJHX05PTkUpICAgICAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKGNhbV9sb2dpbmZvW2ldLmxldmVsICAgICAgICAgICAgICE9IENBTV9HTEJMX0RCR19OT05FKSAgICAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgoaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD0gY2FtX2xvZ2luZm9baV0ubGV2ZWwpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKGogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IGNhbV9sb2dpbmZvW0NBTV9OT19NT0RVTEVdLmxldmVsKSk7CisgICAgfQorICB9CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZkYmdfbG9nX211dGV4KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9zcmMvbW1fY2FtZXJhX2NoYW5uZWwuYyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmFfY2hhbm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NWQ5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9zcmMvbW1fY2FtZXJhX2NoYW5uZWwuYwpAQCAtMCwwICsxLDM2MzggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiY2FtX3NlbWFwaG9yZS5oIgorI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKKyNpbmNsdWRlICJtbV9jYW1lcmFfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibW1fY2FtZXJhLmgiCisKK2V4dGVybiBtbV9jYW1lcmFfb2JqX3QqIG1tX2NhbWVyYV91dGlsX2dldF9jYW1lcmFfYnlfaGFuZGxlcih1aW50MzJfdCBjYW1faGFuZGxlcik7CitleHRlcm4gbW1fY2hhbm5lbF90ICogbW1fY2FtZXJhX3V0aWxfZ2V0X2NoYW5uZWxfYnlfaGFuZGxlcihtbV9jYW1lcmFfb2JqX3QgKiBjYW1fb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFuZGxlcik7CisvKiBTdGF0aWMgZnJhbWUgc3luYyBpbmZvIHVzZWQgYmV0d2VlbiBkaWZmZXJlbnQgY2FtZXJhIGNoYW5uZWxzKi8KK3N0YXRpYyBtbV9jaGFubmVsX2ZyYW1lX3N5bmNfaW5mb190IGZzID0geyAubnVtX2NhbSA9MCwgLnBvcyA9IDB9OworLyogRnJhbWUgc3luYyBpbmZvIGFjY2VzcyBsb2NrICovCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGZzX2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworCisvKiBpbnRlcm5hbCBmdW5jdGlvbiBkZWNsYXJlIGdvZXMgaGVyZSAqLworaW50MzJfdCBtbV9jaGFubmVsX3FidWYobW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpidWYpOworaW50MzJfdCBtbV9jaGFubmVsX2luaXQobW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IGNoYW5uZWxfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSk7Cit2b2lkIG1tX2NoYW5uZWxfcmVsZWFzZShtbV9jaGFubmVsX3QgKm15X29iaik7Cit1aW50MzJfdCBtbV9jaGFubmVsX2FkZF9zdHJlYW0obW1fY2hhbm5lbF90ICpteV9vYmopOworaW50MzJfdCBtbV9jaGFubmVsX2RlbF9zdHJlYW0obW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCk7Cit1aW50MzJfdCBtbV9jaGFubmVsX2xpbmtfc3RyZWFtKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICBtbV9jYW1lcmFfc3RyZWFtX2xpbmtfdCAqc3RyZWFtX2xpbmspOworaW50MzJfdCBtbV9jaGFubmVsX2NvbmZpZ19zdHJlYW0obW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3RyZWFtX2NvbmZpZ190ICpjb25maWcpOworaW50MzJfdCBtbV9jaGFubmVsX2dldF9idW5kbGVfaW5mbyhtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2J1bmRsZV9jb25maWdfdCAqYnVuZGxlX2luZm8pOworaW50MzJfdCBtbV9jaGFubmVsX3N0YXJ0KG1tX2NoYW5uZWxfdCAqbXlfb2JqKTsKK2ludDMyX3QgbW1fY2hhbm5lbF9zdG9wKG1tX2NoYW5uZWxfdCAqbXlfb2JqKTsKK2ludDMyX3QgbW1fY2hhbm5lbF9yZXF1ZXN0X3N1cGVyX2J1ZihtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgbW1fY2FtZXJhX3JlcV9idWZfdCAqYnVmKTsKK2ludDMyX3QgbW1fY2hhbm5lbF9jYW5jZWxfc3VwZXJfYnVmX3JlcXVlc3QobW1fY2hhbm5lbF90ICpteV9vYmopOworaW50MzJfdCBtbV9jaGFubmVsX2ZsdXNoX3N1cGVyX2J1Zl9xdWV1ZShtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhbWVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSk7CitpbnQzMl90IG1tX2NoYW5uZWxfY29uZmlnX25vdGlmeV9tb2RlKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX25vdGlmeV9tb2RlX3Qgbm90aWZ5X21vZGUpOworaW50MzJfdCBtbV9jaGFubmVsX3N0YXJ0X3pzbF9zbmFwc2hvdChtbV9jaGFubmVsX3QgKm15X29iaik7CitpbnQzMl90IG1tX2NoYW5uZWxfc3RvcF96c2xfc25hcHNob3QobW1fY2hhbm5lbF90ICpteV9vYmopOworaW50MzJfdCBtbV9jaGFubmVsX3N1cGVyYnVmX2ZsdXNoKG1tX2NoYW5uZWxfdCogbXlfb2JqLAorICAgICAgICBtbV9jaGFubmVsX3F1ZXVlX3QgKiBxdWV1ZSwgY2FtX3N0cmVhbV90eXBlX3QgY2FtX3R5cGUpOworaW50MzJfdCBtbV9jaGFubmVsX3NldF9zdHJlYW1fcGFybShtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fZXZ0X3BheWxvZF9zZXRfZ2V0X3N0cmVhbV9wYXJtc190ICpwYXlsb2FkKTsKK2ludDMyX3QgbW1fY2hhbm5lbF9nZXRfcXVldWVkX2J1Zl9jb3VudChtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkKTsKKworaW50MzJfdCBtbV9jaGFubmVsX2dldF9zdHJlYW1fcGFybShtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fZXZ0X3BheWxvZF9zZXRfZ2V0X3N0cmVhbV9wYXJtc190ICpwYXlsb2FkKTsKK2ludDMyX3QgbW1fY2hhbm5lbF9kb19zdHJlYW1fYWN0aW9uKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fZXZ0X3BheWxvZF9kb19zdHJlYW1fYWN0aW9uX3QgKnBheWxvYWQpOworaW50MzJfdCBtbV9jaGFubmVsX21hcF9zdHJlYW1fYnVmKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9idWZfbWFwX3R5cGUgKnBheWxvYWQpOworaW50MzJfdCBtbV9jaGFubmVsX21hcF9zdHJlYW1fYnVmcyhtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2J1Zl9tYXBfdHlwZV9saXN0ICpwYXlsb2FkKTsKK2ludDMyX3QgbW1fY2hhbm5lbF91bm1hcF9zdHJlYW1fYnVmKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2J1Zl91bm1hcF90eXBlICpwYXlsb2FkKTsKKworLyogc3RhdGUgbWFjaGluZSBmdW5jdGlvbiBkZWNsYXJlICovCitpbnQzMl90IG1tX2NoYW5uZWxfZnNtX2ZuX25vdHVzZWQobW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfZXZ0X3R5cGVfdCBldnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBpbl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBvdXRfdmFsKTsKK2ludDMyX3QgbW1fY2hhbm5lbF9mc21fZm5fc3RvcHBlZChtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF9ldnRfdHlwZV90IGV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGluX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIG91dF92YWwpOworaW50MzJfdCBtbV9jaGFubmVsX2ZzbV9mbl9hY3RpdmUobW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfZXZ0X3R5cGVfdCBldnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBpbl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBvdXRfdmFsKTsKK2ludDMyX3QgbW1fY2hhbm5lbF9mc21fZm5fcGF1c2VkKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jaGFubmVsX2V2dF90eXBlX3QgZXZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaW5fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogb3V0X3ZhbCk7CisKKy8qIGNoYW5uZWwgc3VwZXIgcXVldWUgZnVuY3Rpb25zICovCitpbnQzMl90IG1tX2NoYW5uZWxfc3VwZXJidWZfcXVldWVfaW5pdChtbV9jaGFubmVsX3F1ZXVlX3QgKiBxdWV1ZSk7CitpbnQzMl90IG1tX2NoYW5uZWxfc3VwZXJidWZfcXVldWVfZGVpbml0KG1tX2NoYW5uZWxfcXVldWVfdCAqIHF1ZXVlKTsKK2ludDMyX3QgbW1fY2hhbm5lbF9zdXBlcmJ1Zl9jb21wX2FuZF9lbnF1ZXVlKG1tX2NoYW5uZWxfdCAqY2hfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF9xdWV1ZV90ICogcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2luZm9fdCAqYnVmKTsKK21tX2NoYW5uZWxfcXVldWVfbm9kZV90KiBtbV9jaGFubmVsX3N1cGVyYnVmX2RlcXVldWUoCisgICAgICAgIG1tX2NoYW5uZWxfcXVldWVfdCAqIHF1ZXVlLCBtbV9jaGFubmVsX3QgKmNoX29iaik7CitpbnQzMl90IG1tX2NoYW5uZWxfc3VwZXJidWZfYnVmZG9uZV9vdmVyZmxvdyhtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfcXVldWVfdCAqcXVldWUpOworaW50MzJfdCBtbV9jaGFubmVsX3N1cGVyYnVmX3NraXAobW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jaGFubmVsX3F1ZXVlX3QgKnF1ZXVlKTsKKworc3RhdGljIGludDMyX3QgbW1fY2hhbm5lbF9wcm9jX2dlbmVyYWxfY21kKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9nZW5lcmljX2NtZF90ICpwX2dlbl9jbWQpOworaW50MzJfdCBtbV9jaGFubmVsX3N1cGVyYnVmX2ZsdXNoX21hdGNoZWQobW1fY2hhbm5lbF90KiBteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jaGFubmVsX3F1ZXVlX3QgKiBxdWV1ZSk7CisKKy8qIFN0YXJ0IG9mIEZyYW1lIFN5bmMgdXRpbCBtZXRob2RzICovCit2b2lkIG1tX2ZyYW1lX3N5bmNfcmVzZXQoKTsKK2ludDMyX3QgbW1fZnJhbWVfc3luY19yZWdpc3Rlcl9jaGFubmVsKG1tX2NoYW5uZWxfdCAqY2hfb2JqKTsKK2ludDMyX3QgbW1fZnJhbWVfc3luY191bnJlZ2lzdGVyX2NoYW5uZWwobW1fY2hhbm5lbF90ICpjaF9vYmopOworaW50MzJfdCBtbV9mcmFtZV9zeW5jX2FkZCh1aW50MzJfdCBmcmFtZV9pZCwgbW1fY2hhbm5lbF90ICpjaF9vYmopOworaW50MzJfdCBtbV9mcmFtZV9zeW5jX3JlbW92ZSh1aW50MzJfdCBmcmFtZV9pZCk7Cit1aW50MzJfdCBtbV9mcmFtZV9zeW5jX2ZpbmRfbWF0Y2hlZCh1aW50OF90IG9sZGVzdCk7CitpbnQ4X3QgbW1fZnJhbWVfc3luY19maW5kX2ZyYW1lX2luZGV4KHVpbnQzMl90IGZyYW1lX2lkKTsKK3ZvaWQgbW1fZnJhbWVfc3luY19sb2NrX3F1ZXVlcygpOwordm9pZCBtbV9mcmFtZV9zeW5jX3VubG9ja19xdWV1ZXMoKTsKK3ZvaWQgbW1fY2hhbm5lbF9ub2RlX3FidWYobW1fY2hhbm5lbF90ICpjaF9vYmosIG1tX2NoYW5uZWxfcXVldWVfbm9kZV90ICpub2RlKTsKKy8qIEVuZCBvZiBGcmFtZSBTeW5jIFV0aWwgbWV0aG9kcyAqLwordm9pZCBtbV9jaGFubmVsX3NlbmRfc3VwZXJfYnVmKG1tX2NoYW5uZWxfbm9kZV9pbmZvX3QgKmluZm8pOworbW1fY2hhbm5lbF9xdWV1ZV9ub2RlX3QqIG1tX2NoYW5uZWxfc3VwZXJidWZfZGVxdWV1ZV9mcmFtZV9pbnRlcm5hbCgKKyAgICAgICAgbW1fY2hhbm5lbF9xdWV1ZV90ICogcXVldWUsIHVpbnQzMl90IGZyYW1lX2lkeCk7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF91dGlsX2dldF9zdHJlYW1fYnlfaGFuZGxlcgorICoKKyAqIERFU0NSSVBUSU9OOiB1dGlsaXR5IGZ1bmN0aW9uIHRvIGdldCBhIHN0cmVhbSBvYmplY3QgZnJvbSBpdHMgaGFuZGxlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1fb2JqOiBwdHIgdG8gYSBjaGFubmVsIG9iamVjdAorICogICBAaGFuZGxlcjogc3RyZWFtIGhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiBwdHIgdG8gYSBzdHJlYW0gb2JqZWN0LgorICogICAgICAgICAgICAgIE5VTEwgaWYgZmFpbGVkLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCittbV9zdHJlYW1fdCAqIG1tX2NoYW5uZWxfdXRpbF9nZXRfc3RyZWFtX2J5X2hhbmRsZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jaGFubmVsX3QgKiBjaF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoYW5kbGVyKQoreworICAgIGludCBpOworICAgIG1tX3N0cmVhbV90ICpzX29iaiA9IE5VTEw7CisgICAgZm9yKGkgPSAwOyBpIDwgTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFOyBpKyspIHsKKyAgICAgICAgaWYgKChNTV9TVFJFQU1fU1RBVEVfTk9UVVNFRCAhPSBjaF9vYmotPnN0cmVhbXNbaV0uc3RhdGUpICYmCisgICAgICAgICAgICAoaGFuZGxlciA9PSBjaF9vYmotPnN0cmVhbXNbaV0ubXlfaGRsKSkgeworICAgICAgICAgICAgc19vYmogPSAmY2hfb2JqLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNfb2JqOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NoYW5uZWxfZGlzcGF0Y2hfc3VwZXJfYnVmCisgKgorICogREVTQ1JJUFRJT046IGRpc3BhdGNoIHN1cGVyIGJ1ZmZlciBvZiBidW5kbGUgdG8gcmVnaXN0ZXJlZCB1c2VyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjbWRfY2IgIDogcHRyIHN0b3JpbmcgbWF0Y2hlZCBzdXBlciBidWYgaW5mb3JtYXRpb24KKyAqICAgQHVzZXJkYXRhOiB1c2VyIGRhdGEgcHRyCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgbW1fY2hhbm5lbF9kaXNwYXRjaF9zdXBlcl9idWYobW1fY2FtZXJhX2NtZGNiX3QgKmNtZF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJfZGF0YSkKK3sKKyAgICBtbV9jaGFubmVsX3QgKiBteV9vYmogPSAobW1fY2hhbm5lbF90ICopdXNlcl9kYXRhOworCisgICAgaWYgKE5VTEwgPT0gbXlfb2JqKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoTU1fQ0FNRVJBX0NNRF9UWVBFX1NVUEVSX0JVRl9EQVRBX0NCICE9IGNtZF9jYi0+Y21kX3R5cGUpIHsKKyAgICAgICAgTE9HRSgiV3JvbmcgY21kX3R5cGUgKCVkKSBmb3Igc3VwZXIgYnVmIGRhdGFDQiIsCisgICAgICAgICAgICAgICAgICAgIGNtZF9jYi0+Y21kX3R5cGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG15X29iai0+YnVuZGxlLnN1cGVyX2J1Zl9ub3RpZnlfY2IpIHsKKyAgICAgICAgbXlfb2JqLT5idW5kbGUuc3VwZXJfYnVmX25vdGlmeV9jYigmY21kX2NiLT51LnN1cGVyYnVmLCBteV9vYmotPmJ1bmRsZS51c2VyX2RhdGEpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3Byb2Nlc3Nfc3RyZWFtX2J1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBoYW5kbGUgaW5jb21pbmcgYnVmZmVyIGZyb20gc3RyZWFtIGluIGEgYnVuZGxlLiBJbiB0aGlzIGZ1bmN0aW9uLAorICogICAgICAgICAgICAgIG1hdGNoaW5nIGxvZ2ljIHdpbGwgYmUgcGVyZm9ybWVkIG9uIGluY29taW5nIHN0cmVhbSBmcmFtZXMuCisgKiAgICAgICAgICAgICAgV2lsbCBkZXBlbmRzIG9uIHRoZSBidW5kbGUgYXR0cmlidXRlLCBlaXRoZXIgc3RvcmluZyBtYXRjaGVkIGZyYW1lcworICogICAgICAgICAgICAgIGluIHRoZSBzdXBlcmJ1ZiBxdWV1ZSwgb3Igc2VuZGluZyBtYXRjaGVkIHN1cGVyYnVmIGZyYW1lcyB0byB1cHBlcgorICogICAgICAgICAgICAgIGxheWVyIHRocm91Z2ggcmVnaXN0ZXJlZCBjYWxsYmFjay4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNtZF9jYiAgOiBwdHIgc3RvcmluZyBtYXRjaGVkIHN1cGVyIGJ1ZiBpbmZvcm1hdGlvbgorICogICBAdXNlcmRhdGE6IHVzZXIgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBtbV9jaGFubmVsX3Byb2Nlc3Nfc3RyZWFtX2J1ZihtbV9jYW1lcmFfY21kY2JfdCAqIGNtZF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX25vdGlmeV9tb2RlX3Qgbm90aWZ5X21vZGU7CisgICAgbW1fY2hhbm5lbF9xdWV1ZV9ub2RlX3QgKm5vZGUgPSBOVUxMOworICAgIG1tX2NoYW5uZWxfdCAqY2hfb2JqID0gKG1tX2NoYW5uZWxfdCAqKXVzZXJfZGF0YTsKKyAgICB1aW50MzJfdCBpID0gMDsKKyAgICAvKiBTZXQgZXhwZWN0ZWQgZnJhbWUgaWQgdG8gYSBmdXR1cmUgZnJhbWUgaWR4LCBsYXJnZSBlbm91Z2ggdG8gd2FpdAorICAgICogZm9yIGdvb2RfZnJhbWVfaWR4X3JhbmdlLCBhbmQgc21hbGwgZW5vdWdoIHRvIHN0aWxsIGNhcHR1cmUgYW4gaW1hZ2UgKi8KKyAgICB1aW50OF90IG5lZWRTdGFydFpTTCA9IEZBTFNFOworCisgICAgaWYgKE5VTEwgPT0gY2hfb2JqKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKE1NX0NBTUVSQV9DTURfVFlQRV9EQVRBX0NCICA9PSBjbWRfY2ItPmNtZF90eXBlKSB7CisgICAgICAgIC8qIGNvbXBfYW5kX2VucXVldWUgKi8KKyAgICAgICAgbW1fY2hhbm5lbF9zdXBlcmJ1Zl9jb21wX2FuZF9lbnF1ZXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgY2hfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgJmNoX29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgJmNtZF9jYi0+dS5idWYpOworICAgIH0gZWxzZSBpZiAoTU1fQ0FNRVJBX0NNRF9UWVBFX1JFUV9EQVRBX0NCICA9PSBjbWRfY2ItPmNtZF90eXBlKSB7CisgICAgICAgIC8qIHNraXAgZnJhbWVzIGlmIG5lZWRlZCAqLworICAgICAgICBjaF9vYmotPnBlbmRpbmdfY250ID0gY21kX2NiLT51LnJlcV9idWYubnVtX2J1Zl9yZXF1ZXN0ZWQ7CisgICAgICAgIGNoX29iai0+cGVuZGluZ19yZXRyb19jbnQgPSBjbWRfY2ItPnUucmVxX2J1Zi5udW1fcmV0cm9fYnVmX3JlcXVlc3RlZDsKKyAgICAgICAgY2hfb2JqLT5yZXFfdHlwZSA9IGNtZF9jYi0+dS5yZXFfYnVmLnR5cGU7CisgICAgICAgIGNoX29iai0+YldhaXRGb3JQcmVwU25hcHNob3REb25lID0gMDsKKworICAgICAgICBMT0dIKCJwZW5kaW5nIGNudCAoJWQpLCByZXRybyBjb3VudCAoJWQpIgorICAgICAgICAgICAgICAgICJyZXFfdHlwZSAoJWQpIGlzX3ByaW1hcnkgKCVkKSIsCisgICAgICAgICAgICAgICAgIGNoX29iai0+cGVuZGluZ19jbnQsIGNoX29iai0+cGVuZGluZ19yZXRyb19jbnQsCisgICAgICAgICAgICAgICAgY2hfb2JqLT5yZXFfdHlwZSwgY21kX2NiLT51LnJlcV9idWYucHJpbWFyeV9vbmx5KTsKKyAgICAgICAgaWYgKCFjaF9vYmotPnBlbmRpbmdfY250IHx8IChjaF9vYmotPnBlbmRpbmdfcmV0cm9fY250ID4gY2hfb2JqLT5wZW5kaW5nX2NudCkpIHsKKyAgICAgICAgICBjaF9vYmotPnBlbmRpbmdfcmV0cm9fY250ID0gY2hfb2JqLT5wZW5kaW5nX2NudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hfb2JqLT5wZW5kaW5nX3JldHJvX2NudCA+IDApIHsKKyAgICAgICAgICBMT0dMKCJSZXNldHRpbmcgbmVlZCBMZWQgRmxhc2ghISEiKTsKKyAgICAgICAgICBjaF9vYmotPm5lZWRMRURGbGFzaCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgY2hfb2JqLT5zdG9wWnNsU25hcHNob3QgPSAwOworICAgICAgICBjaF9vYmotPnVuTG9ja0FFQyA9IDA7CisKKyAgICAgICAgbW1fY2hhbm5lbF9zdXBlcmJ1Zl9za2lwKGNoX29iaiwgJmNoX29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlKTsKKworICAgIH0gZWxzZSBpZiAoTU1fQ0FNRVJBX0NNRF9UWVBFX1NUQVJUX1pTTCA9PSBjbWRfY2ItPmNtZF90eXBlKSB7CisgICAgICAgICAgICBjaF9vYmotPm1hbnVhbFpTTFNuYXBzaG90ID0gVFJVRTsKKyAgICAgICAgICAgIG1tX2NhbWVyYV9zdGFydF96c2xfc25hcHNob3QoY2hfb2JqLT5jYW1fb2JqKTsKKyAgICB9IGVsc2UgaWYgKE1NX0NBTUVSQV9DTURfVFlQRV9TVE9QX1pTTCA9PSBjbWRfY2ItPmNtZF90eXBlKSB7CisgICAgICAgICAgICBjaF9vYmotPm1hbnVhbFpTTFNuYXBzaG90ID0gRkFMU0U7CisgICAgICAgICAgICBtbV9jYW1lcmFfc3RvcF96c2xfc25hcHNob3QoY2hfb2JqLT5jYW1fb2JqKTsKKyAgICB9IGVsc2UgaWYgKE1NX0NBTUVSQV9DTURfVFlQRV9DT05GSUdfTk9USUZZID09IGNtZF9jYi0+Y21kX3R5cGUpIHsKKyAgICAgICAgICAgY2hfb2JqLT5idW5kbGUuc3VwZXJidWZfcXVldWUuYXR0ci5ub3RpZnlfbW9kZSA9IGNtZF9jYi0+dS5ub3RpZnlfbW9kZTsKKyAgICB9IGVsc2UgaWYgKE1NX0NBTUVSQV9DTURfVFlQRV9GTFVTSF9RVUVVRSAgPT0gY21kX2NiLT5jbWRfdHlwZSkgeworICAgICAgICBjaF9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5leHBlY3RlZF9mcmFtZV9pZCA9IGNtZF9jYi0+dS5mbHVzaF9jbWQuZnJhbWVfaWR4OworICAgICAgICBtbV9jaGFubmVsX3N1cGVyYnVmX2ZsdXNoKGNoX29iaiwKKyAgICAgICAgICAgICAgICAmY2hfb2JqLT5idW5kbGUuc3VwZXJidWZfcXVldWUsIGNtZF9jYi0+dS5mbHVzaF9jbWQuc3RyZWFtX3R5cGUpOworICAgICAgICBjYW1fc2VtX3Bvc3QoJihjaF9vYmotPmNtZF90aHJlYWQuc3luY19zZW0pKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoTU1fQ0FNRVJBX0NNRF9UWVBFX0dFTkVSQUwgPT0gY21kX2NiLT5jbWRfdHlwZSkgeworICAgICAgICBMT0dIKCJNTV9DQU1FUkFfQ01EX1RZUEVfR0VORVJBTCIpOworICAgICAgICBzd2l0Y2ggKGNtZF9jYi0+dS5nZW5fY21kLnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0dFTkVSSUNfQ01EX1RZUEVfQUVfQlJBQ0tFVElORzoKKyAgICAgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0dFTkVSSUNfQ01EX1RZUEVfQUZfQlJBQ0tFVElORzogeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0ID0gY21kX2NiLT51Lmdlbl9jbWQucGF5bG9hZFswXTsKKyAgICAgICAgICAgICAgICBMT0dJKCJNTV9DQU1FUkFfR0VORVJJQ19DTURUWVBFX0FGX0JSQUNLRVRJTkcgJXUiLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBtbV9jaGFubmVsX3N1cGVyYnVmX2ZsdXNoKGNoX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjaF9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZSwgQ0FNX1NUUkVBTV9UWVBFX0RFRkFVTFQpOworCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIExPR0goIm5lZWQgQUUgYnJhY2tldGluZywgc3RhcnQgenNsIHNuYXBzaG90Iik7CisgICAgICAgICAgICAgICAgICAgIGNoX29iai0+YnJhY2tldGluZ1N0YXRlID0gTU1fQ0hBTk5FTF9CUkFDS0VUSU5HX1NUQVRFX1dBSVRfR09PRF9GUkFNRV9JRFg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5icmFja2V0aW5nU3RhdGUgPSBNTV9DSEFOTkVMX0JSQUNLRVRJTkdfU1RBVEVfT0ZGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0dFTkVSSUNfQ01EX1RZUEVfRkxBU0hfQlJBQ0tFVElORzogeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0ID0gY21kX2NiLT51Lmdlbl9jbWQucGF5bG9hZFswXTsKKyAgICAgICAgICAgICAgICBMT0dJKCJNTV9DQU1FUkFfR0VORVJJQ19DTURUWVBFX0ZMQVNIX0JSQUNLRVRJTkcgJXUiLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0KTsKKyAgICAgICAgICAgICAgICBtbV9jaGFubmVsX3N1cGVyYnVmX2ZsdXNoKGNoX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZjaF9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZSwgQ0FNX1NUUkVBTV9UWVBFX0RFRkFVTFQpOworCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIExPR0goIm5lZWQgZmxhc2ggYnJhY2tldGluZyIpOworICAgICAgICAgICAgICAgICAgICBjaF9vYmotPmlzRmxhc2hCcmFja2V0aW5nRW5hYmxlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5pc0ZsYXNoQnJhY2tldGluZ0VuYWJsZWQgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1NX0NBTUVSQV9HRU5FUklDX0NNRF9UWVBFX1pPT01fMVg6IHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGFydCA9IGNtZF9jYi0+dS5nZW5fY21kLnBheWxvYWRbMF07CisgICAgICAgICAgICAgICAgTE9HSSgiTU1fQ0FNRVJBX0dFTkVSSUNfQ01EX1RZUEVfWk9PTV8xWCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgc3RhcnQpOworICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfc3VwZXJidWZfZmx1c2goY2hfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgJmNoX29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLCBDQU1fU1RSRUFNX1RZUEVfREVGQVVMVCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HSCgibmVlZCB6b29tIDF4IGZyYW1lIik7CisgICAgICAgICAgICAgICAgICAgIGNoX29iai0+aXNab29tMXhGcmFtZVJlcXVlc3RlZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5pc1pvb20xeEZyYW1lUmVxdWVzdGVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNTV9DQU1FUkFfR0VORVJJQ19DTURfVFlQRV9DQVBUVVJFX1NFVFRJTkc6IHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGFydCA9IGNtZF9jYi0+dS5nZW5fY21kLnBheWxvYWRbMF07CisgICAgICAgICAgICAgICAgTE9HSSgiTU1fQ0FNRVJBX0dFTkVSSUNfQ01EX1RZUEVfQ0FQVFVSRV9TRVRUSU5HICV1IG51bV9iYXRjaCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgY21kX2NiLT51Lmdlbl9jbWQuZnJhbWVfY29uZmlnLm51bV9iYXRjaCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZjaF9vYmotPmZyYW1lQ29uZmlnLCAwLCBzaXplb2YoY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNtZF9jYi0+dS5nZW5fY21kLmZyYW1lX2NvbmZpZy5udW1fYmF0Y2g7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtZF9jYi0+dS5nZW5fY21kLmZyYW1lX2NvbmZpZy5jb25maWdzW2ldLnR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gQ0FNX0NBUFRVUkVfUkVTRVQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaF9vYmotPmZyYW1lQ29uZmlnLmNvbmZpZ3NbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaF9vYmotPmZyYW1lQ29uZmlnLm51bV9iYXRjaF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kX2NiLT51Lmdlbl9jbWQuZnJhbWVfY29uZmlnLmNvbmZpZ3NbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5mcmFtZUNvbmZpZy5udW1fYmF0Y2grKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dIKCJjYXB0dXJlIHNldHRpbmcgZnJhbWUgPSAlZCB0eXBlID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSxjaF9vYmotPmZyYW1lQ29uZmlnLmNvbmZpZ3NbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaF9vYmotPmZyYW1lQ29uZmlnLm51bV9iYXRjaF0udHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTE9HRCgiQ2FwdHVyZSBzZXR0aW5nIEJhdGNoIENvdW50ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoX29iai0+ZnJhbWVDb25maWcubnVtX2JhdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5pc0NvbmZpZ0NhcHR1cmUgPSBUUlVFOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoX29iai0+aXNDb25maWdDYXB0dXJlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCgmY2hfb2JqLT5mcmFtZUNvbmZpZywgMCwgc2l6ZW9mKGNhbV9jYXB0dXJlX2ZyYW1lX2NvbmZpZ190KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNoX29iai0+Y3VyX2NhcHR1cmVfaWR4ID0gMDsKKyAgICAgICAgICAgICAgICBtZW1zZXQoY2hfb2JqLT5jYXB0dXJlX2ZyYW1lX2lkLCAwLCBzaXplb2YodWludDhfdCkgKiBNQVhfQ0FQVFVSRV9CQVRDSF9OVU0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0dFKCJFcnJvcjogSW52YWxpZCBjb21tYW5kIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbm90aWZ5X21vZGUgPSBjaF9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5hdHRyLm5vdGlmeV9tb2RlOworCisgICAgLypIYW5kbGUgdXNlIGNhc2Ugd2hpY2ggZG9lcyBub3QgbmVlZCBzdGFydCBaU0wgZXZlbiBpbiB1bmlmaWVkIGNhc2UqLworICAgIGlmICgoY2hfb2JqLT5wZW5kaW5nX2NudCA+IDApCisgICAgICAgICAgICAmJiAoY2hfb2JqLT5pc0NvbmZpZ0NhcHR1cmUpCisgICAgICAgICAgICAmJiAoY2hfb2JqLT5tYW51YWxaU0xTbmFwc2hvdCA9PSBGQUxTRSkKKyAgICAgICAgICAgICYmIChjaF9vYmotPnN0YXJ0WlNsU25hcHNob3RDYWxsZWQgPT0gRkFMU0UpKSB7CisgICAgICAgIG5lZWRTdGFydFpTTCA9IFRSVUU7CisgICAgICAgIGZvciAoaSA9IGNoX29iai0+Y3VyX2NhcHR1cmVfaWR4OworICAgICAgICAgICAgICAgIGkgPCBjaF9vYmotPmZyYW1lQ29uZmlnLm51bV9iYXRjaDsKKyAgICAgICAgICAgICAgICBpKyspIHsKKyAgICAgICAgICAgIGNhbV9jYXB0dXJlX3R5cGUgdHlwZSA9IGNoX29iai0+ZnJhbWVDb25maWcuY29uZmlnc1tpXS50eXBlOworICAgICAgICAgICAgaWYgKCgodHlwZSA9PSBDQU1fQ0FQVFVSRV9GTEFTSCkgJiYgKCFjaF9vYmotPm5lZWRMRURGbGFzaCkpCisgICAgICAgICAgICAgICAgICAgIHx8ICgodHlwZSA9PSBDQU1fQ0FQVFVSRV9MT1dfTElHSFQpICYmICghY2hfb2JqLT5uZWVkTG93TGlnaHRaU0wpKSkgeworICAgICAgICAgICAgICAgIC8qRm9yIGZsYXNoIGFuZCBsb3cgbGlnaHQgY2FwdHVyZSwgc3RhcnQgWlNMIGlzIHRyaWdnZXJlZCBvbmx5IGlmIG5lZWRlZCovCisgICAgICAgICAgICAgICAgbmVlZFN0YXJ0WlNMID0gRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGNoX29iai0+aXNDb25maWdDYXB0dXJlKQorICAgICAgICAgICAgJiYgKG5lZWRTdGFydFpTTCkpIHsKKyAgICAgICAgZm9yIChpID0gY2hfb2JqLT5jdXJfY2FwdHVyZV9pZHg7CisgICAgICAgICAgICAgICAgaSA8IGNoX29iai0+ZnJhbWVDb25maWcubnVtX2JhdGNoOworICAgICAgICAgICAgICAgIGkrKykgeworICAgICAgICAgICAgY2hfb2JqLT5jYXB0dXJlX2ZyYW1lX2lkW2ldID0KKyAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5idW5kbGUuc3VwZXJidWZfcXVldWUuZXhwZWN0ZWRfZnJhbWVfaWQKKyAgICAgICAgICAgICAgICAgICAgKyBNTV9DQU1FUkFfTUFYX0ZVVFVSRV9GUkFNRV9XQUlUOworICAgICAgICB9CisKKyAgICAgICAgLyogTmVlZCB0byBGbHVzaCB0aGUgcXVldWUgYW5kIHRyaWdnZXIgZnJhbWUgY29uZmlnICovCisgICAgICAgIG1tX2NoYW5uZWxfc3VwZXJidWZfZmx1c2goY2hfb2JqLAorICAgICAgICAgICAgICAgICZjaF9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZSwgQ0FNX1NUUkVBTV9UWVBFX0RFRkFVTFQpOworICAgICAgICBMT0dJKCJUUklHR0VSIFN0YXJ0IFpTTCIpOworICAgICAgICBtbV9jYW1lcmFfc3RhcnRfenNsX3NuYXBzaG90KGNoX29iai0+Y2FtX29iaik7CisgICAgICAgIGNoX29iai0+c3RhcnRaU2xTbmFwc2hvdENhbGxlZCA9IFRSVUU7CisgICAgICAgIGNoX29iai0+YnVyc3RTbmFwTnVtID0gY2hfb2JqLT5wZW5kaW5nX2NudDsKKyAgICAgICAgY2hfb2JqLT5iV2FpdEZvclByZXBTbmFwc2hvdERvbmUgPSAwOworICAgIH0gZWxzZSBpZiAoKGNoX29iai0+cGVuZGluZ19jbnQgPiAwKQorICAgICAgICAmJiAoKGNoX29iai0+bmVlZExFREZsYXNoID09IFRSVUUpIHx8CisgICAgICAgIChNTV9DSEFOTkVMX0JSQUNLRVRJTkdfU1RBVEVfT0ZGICE9IGNoX29iai0+YnJhY2tldGluZ1N0YXRlKSkKKyAgICAgICAgJiYgKGNoX29iai0+bWFudWFsWlNMU25hcHNob3QgPT0gRkFMU0UpCisgICAgICAgICYmIGNoX29iai0+c3RhcnRaU2xTbmFwc2hvdENhbGxlZCA9PSBGQUxTRSkgeworCisgICAgICAgIExPR0koIlRSSUdHRVIgU3RhcnQgWlNMIGZvciBGbGFzaCIpOworICAgICAgICBtbV9jYW1lcmFfc3RhcnRfenNsX3NuYXBzaG90KGNoX29iai0+Y2FtX29iaik7CisgICAgICAgIGNoX29iai0+c3RhcnRaU2xTbmFwc2hvdENhbGxlZCA9IFRSVUU7CisgICAgICAgIGNoX29iai0+YnVyc3RTbmFwTnVtID0gY2hfb2JqLT5wZW5kaW5nX2NudDsKKyAgICAgICAgY2hfb2JqLT5iV2FpdEZvclByZXBTbmFwc2hvdERvbmUgPSAwOworICAgIH0gZWxzZSBpZiAoKChjaF9vYmotPnBlbmRpbmdfY250ID09IDApIHx8IChjaF9vYmotPnN0b3Bac2xTbmFwc2hvdCA9PSAxKSkKKyAgICAgICAgICAgICYmIChjaF9vYmotPm1hbnVhbFpTTFNuYXBzaG90ID09IEZBTFNFKQorICAgICAgICAgICAgJiYgKGNoX29iai0+c3RhcnRaU2xTbmFwc2hvdENhbGxlZCA9PSBUUlVFKSkgeworICAgICAgICBMT0dJKCJUUklHR0VSIFN0b3AgWlNMIGZvciBjYW5jZWwgcGljdHVyZSIpOworICAgICAgICBtbV9jYW1lcmFfc3RvcF96c2xfc25hcHNob3QoY2hfb2JqLT5jYW1fb2JqKTsKKyAgICAgICAgLy8gVW5sb2NrIEFFQworICAgICAgICBjaF9vYmotPnN0YXJ0WlNsU25hcHNob3RDYWxsZWQgPSBGQUxTRTsKKyAgICAgICAgY2hfb2JqLT5uZWVkTEVERmxhc2ggPSBGQUxTRTsKKyAgICAgICAgY2hfb2JqLT5idXJzdFNuYXBOdW0gPSAwOworICAgICAgICBjaF9vYmotPnN0b3Bac2xTbmFwc2hvdCA9IDA7CisgICAgICAgIGNoX29iai0+YldhaXRGb3JQcmVwU25hcHNob3REb25lID0gMDsKKyAgICAgICAgY2hfb2JqLT51bkxvY2tBRUMgPSAxOworICAgICAgICBjaF9vYmotPmJyYWNrZXRpbmdTdGF0ZSA9IE1NX0NIQU5ORUxfQlJBQ0tFVElOR19TVEFURV9PRkY7CisgICAgICAgIGNoX29iai0+aXNDb25maWdDYXB0dXJlID0gRkFMU0U7CisgICAgfQorICAgIC8qIGJ1ZmRvbmUgZm9yIG92ZXJmbG93ZWQgYnVmcyAqLworICAgIG1tX2NoYW5uZWxfc3VwZXJidWZfYnVmZG9uZV9vdmVyZmxvdyhjaF9vYmosICZjaF9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZSk7CisKKyAgICBMT0dEKCJTdXBlciBCdWZmZXIgcmVjZWl2ZWQsIHBlbmRpbmdfY250PSVkIHF1ZXVlIGNudCA9ICVkIGV4cGVjdGVkID0gJWQiLAorICAgICAgICAgICAgY2hfb2JqLT5wZW5kaW5nX2NudCwgY2hfb2JqLT5idW5kbGUuc3VwZXJidWZfcXVldWUubWF0Y2hfY250LAorICAgICAgICAgICAgY2hfb2JqLT5idW5kbGUuc3VwZXJidWZfcXVldWUuZXhwZWN0ZWRfZnJhbWVfaWQpOworCisgICAgLyogZGlzcGF0Y2ggZnJhbWUgaWYgcGVuZGluZ19jbnQ+MCBvciBpcyBpbiBjb250aW51b3VzIHN0cmVhbWluZyBtb2RlICovCisgICAgd2hpbGUgKCgoY2hfb2JqLT5wZW5kaW5nX2NudCA+IDApIHx8CisgICAgICAgICAgICAgKE1NX0NBTUVSQV9TVVBFUl9CVUZfTk9USUZZX0NPTlRJTlVPVVMgPT0gbm90aWZ5X21vZGUpKSAmJgorICAgICAgICAgICAgICghY2hfb2JqLT5iV2FpdEZvclByZXBTbmFwc2hvdERvbmUpKSB7CisKKyAgICAgICAgLyogZGVxdWV1ZSAqLworICAgICAgICBtbV9jaGFubmVsX25vZGVfaW5mb190IGluZm87CisgICAgICAgIG1lbXNldCgmaW5mbywgMHgwLCBzaXplb2YoaW5mbykpOworCisgICAgICAgIGlmIChjaF9vYmotPnJlcV90eXBlID09IE1NX0NBTUVSQV9SRVFfRlJBTUVfU1lOQ19CVUYpIHsKKyAgICAgICAgICAgIC8vIExvY2sgdGhlIFF1ZXVlcworICAgICAgICAgICAgbW1fZnJhbWVfc3luY19sb2NrX3F1ZXVlcygpOworICAgICAgICAgICAgdWludDMyX3QgbWF0Y2hfZnJhbWUgPSBtbV9mcmFtZV9zeW5jX2ZpbmRfbWF0Y2hlZChGQUxTRSk7CisgICAgICAgICAgICBpZiAobWF0Y2hfZnJhbWUpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGogPSAwOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhfTlVNX0NBTUVSQV9QRVJfQlVORExFOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZzLmNoX29ialtqXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF9xdWV1ZV90ICpjaF9xdWV1ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmcy5jaF9vYmpbal0tPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaF9xdWV1ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HVygiQ2hhbm5lbCBxdWV1ZSBpcyBOVUxMIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbW1fY2hhbm5lbF9zdXBlcmJ1Zl9kZXF1ZXVlX2ZyYW1lX2ludGVybmFsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaF9xdWV1ZSwgbWF0Y2hfZnJhbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uY2hfb2JqW2luZm8ubnVtX25vZGVzXSA9IGZzLmNoX29ialtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm5vZGVbaW5mby5udW1fbm9kZXNdID0gbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLm51bV9ub2RlcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0goIkFkZGVkIGNoKCVwKSB0byBub2RlICxudW0gbm9kZXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNoX29ialtqXSwgaW5mby5udW1fbm9kZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1tX2ZyYW1lX3N5bmNfcmVtb3ZlKG1hdGNoX2ZyYW1lKTsKKyAgICAgICAgICAgICAgICBMT0dJKCJtYXRjaCBmcmFtZSAlZCIsIG1hdGNoX2ZyYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mby5udW1fbm9kZXMgIT0gZnMubnVtX2NhbSkgeworICAgICAgICAgICAgICAgICAgICBMT0dJKCJudW0gbm9kZSAlZCAhPSBudW0gY2FtICglZCkgRGVidWcgdGhpcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubnVtX25vZGVzLCBmcy5udW1fY2FtKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCBqID0gMDsKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJlZSBzdXBlciBidWZmZXJzIGZyb20gdmFyaW91cyBub2RlcworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5mby5udW1fbm9kZXM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8ubm9kZVtqXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfbm9kZV9xYnVmKGluZm8uY2hfb2JqW2pdLCBpbmZvLm5vZGVbal0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoaW5mby5ub2RlW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgbm90IHVzZSBpdCBhcyBtYXRjaGVkIGR1YWwgY2FtZXJhIGZyYW1lcworICAgICAgICAgICAgICAgICAgICBpbmZvLm51bV9ub2RlcyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbW1fZnJhbWVfc3luY191bmxvY2tfcXVldWVzKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIG5vZGUgPSBtbV9jaGFubmVsX3N1cGVyYnVmX2RlcXVldWUoJmNoX29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLCBjaF9vYmopOworICAgICAgICAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICBpZiAoY2hfb2JqLT5pc0NvbmZpZ0NhcHR1cmUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKChub2RlLT5mcmFtZV9pZHggPAorICAgICAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5jYXB0dXJlX2ZyYW1lX2lkW2NoX29iai0+Y3VyX2NhcHR1cmVfaWR4XSkpKSB7CisgICAgICAgICAgICAgICAgICAgdWludDhfdCBpOworICAgICAgICAgICAgICAgICAgIExPR0QoIk5vdCBleHBlY3RlZCBzdXBlciBidWZmZXIuIGZyYW1lSUQgPSAlZCBleHBlY3RlZCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmZyYW1lX2lkeCwgY2hfb2JqLT5jYXB0dXJlX2ZyYW1lX2lkW2NoX29iai0+Y3VyX2NhcHR1cmVfaWR4XSk7CisgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5vZGUtPm51bV9vZl9idWZzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF9xYnVmKGNoX29iaiwgbm9kZS0+c3VwZXJfYnVmW2ldLmJ1Zik7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIGZyZWUobm9kZSk7CisgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgIGluZm8ubnVtX25vZGVzID0gMTsKKyAgICAgICAgICAgICAgICAgICBpbmZvLmNoX29ialswXSA9IGNoX29iajsKKyAgICAgICAgICAgICAgICAgICBpbmZvLm5vZGVbMF0gPSBub2RlOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpbmZvLm51bV9ub2RlcyA+IDApIHsKKyAgICAgICAgICAgIC8qIGRlY3JlYXNlIHBlbmRpbmdfY250ICovCisgICAgICAgICAgICBpZiAoTU1fQ0FNRVJBX1NVUEVSX0JVRl9OT1RJRllfQlVSU1QgPT0gbm90aWZ5X21vZGUpIHsKKyAgICAgICAgICAgICAgICBjaF9vYmotPnBlbmRpbmdfY250LS07CisgICAgICAgICAgICAgICAgaWYgKGNoX29iai0+cGVuZGluZ19yZXRyb19jbnQgPiAwKSB7CisgICAgICAgICAgICAgICAgICBpZiAoY2hfb2JqLT5wZW5kaW5nX3JldHJvX2NudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGNoX29iai0+YldhaXRGb3JQcmVwU25hcHNob3REb25lID0gMTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGNoX29iai0+cGVuZGluZ19yZXRyb19jbnQtLTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoKChjaF9vYmotPnBlbmRpbmdfY250ID09IDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgKGNoX29iai0+c3RvcFpzbFNuYXBzaG90ID09IDEpKSAmJgorICAgICAgICAgICAgICAgICAgICAgIChjaF9vYmotPm1hbnVhbFpTTFNuYXBzaG90ID09IEZBTFNFKSAmJgorICAgICAgICAgICAgICAgICAgICAgICBjaF9vYmotPnN0YXJ0WlNsU25hcHNob3RDYWxsZWQgPT0gVFJVRSkgeworICAgICAgICAgICAgICAgICAgICBMT0dJKCJUUklHR0VSIFN0b3AgWlNMLiBBbGwgZnJhbWUgcmVjZWl2ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3N0b3BfenNsX3NuYXBzaG90KGNoX29iai0+Y2FtX29iaik7CisgICAgICAgICAgICAgICAgICAgIGNoX29iai0+c3RhcnRaU2xTbmFwc2hvdENhbGxlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBjaF9vYmotPmJ1cnN0U25hcE51bSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNoX29iai0+c3RvcFpzbFNuYXBzaG90ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT51bkxvY2tBRUMgPSAxOworICAgICAgICAgICAgICAgICAgICBjaF9vYmotPm5lZWRMRURGbGFzaCA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICBjaF9vYmotPmJyYWNrZXRpbmdTdGF0ZSA9IE1NX0NIQU5ORUxfQlJBQ0tFVElOR19TVEFURV9PRkY7CisgICAgICAgICAgICAgICAgICAgIGNoX29iai0+aXNDb25maWdDYXB0dXJlID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNoX29iai0+aXNDb25maWdDYXB0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaF9vYmotPmZyYW1lQ29uZmlnLmNvbmZpZ3NbY2hfb2JqLT5jdXJfY2FwdHVyZV9pZHhdLm51bV9mcmFtZXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5mcmFtZUNvbmZpZy5jb25maWdzW2NoX29iai0+Y3VyX2NhcHR1cmVfaWR4XS5udW1fZnJhbWVzLS07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dXKCJJbnZhbGlkIGZyYW1lIGNvbmZpZyBiYXRjaCBpbmRleCAlZCBtYXggYmF0Y2ggPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoX29iai0+Y3VyX2NhcHR1cmVfaWR4LCBjaF9vYmotPmZyYW1lQ29uZmlnLm51bV9iYXRjaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoY2hfb2JqLT5mcmFtZUNvbmZpZy5jb25maWdzW2NoX29iai0+Y3VyX2NhcHR1cmVfaWR4XS5udW1fZnJhbWVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVjZWl2ZWQgYWxsIGZyYW1lcyBmb3IgY3VycmVudCBiYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5jdXJfY2FwdHVyZV9pZHgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoX29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLmV4cGVjdGVkX2ZyYW1lX2lkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5jYXB0dXJlX2ZyYW1lX2lkW2NoX29iai0+Y3VyX2NhcHR1cmVfaWR4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoX29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLmdvb2RfZnJhbWVfaWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaF9vYmotPmNhcHR1cmVfZnJhbWVfaWRbY2hfb2JqLT5jdXJfY2FwdHVyZV9pZHhdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HSCgiTmVlZCAlZCBmcmFtZXMgbW9yZSBmb3IgYmF0Y2ggJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaF9vYmotPmZyYW1lQ29uZmlnLmNvbmZpZ3NbY2hfb2JqLT5jdXJfY2FwdHVyZV9pZHhdLm51bV9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoX29iai0+Y3VyX2NhcHR1cmVfaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRpc3BhdGNoIHN1cGVyYnVmICovCisgICAgICAgICAgICBtbV9jaGFubmVsX3NlbmRfc3VwZXJfYnVmKCZpbmZvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5vIHN1cGVyYnVmIGF2YWlsLCBicmVhayB0aGUgbG9vcCAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF9zZW5kX3N1cGVyX2J1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBTZW5kIHN1cGVyIGJ1ZmZlcnMgdG8gSEFMCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBpbmZvICA6IEluZm8gb2Ygc3VwZXIgYnVmZmVycyB0byBiZSBzZW50IGluIGNhbGxiYWNrCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBtbV9jaGFubmVsX3NlbmRfc3VwZXJfYnVmKG1tX2NoYW5uZWxfbm9kZV9pbmZvX3QgKmluZm8pCit7CisgICAgaWYgKCFpbmZvIHx8ICFpbmZvLT5udW1fbm9kZXMpeworICAgICAgICBMT0dFKCJYIEVycm9yISEgSW5mbyBpbnZhbGlkIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbW1fY2hhbm5lbF9xdWV1ZV9ub2RlX3QgKm5vZGUgPSBOVUxMOworCisgICAgTE9HSCgibnVtIG5vZGVzICVkIHRvIHNlbmQiLCBpbmZvLT5udW1fbm9kZXMpOworICAgIHVpbnQzMl90IGlkeCA9IDA7CisgICAgbW1fY2hhbm5lbF90ICpjaF9vYmogPSBOVUxMOworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgaW5mby0+bnVtX25vZGVzOyBpZHgrKykgeworICAgICAgICBub2RlID0gaW5mby0+bm9kZVtpZHhdOworICAgICAgICBjaF9vYmogPSBpbmZvLT5jaF9vYmpbaWR4XTsKKyAgICAgICAgaWYgKChjaF9vYmopICYmIChOVUxMICE9IGNoX29iai0+YnVuZGxlLnN1cGVyX2J1Zl9ub3RpZnlfY2IpICYmIG5vZGUpIHsKKyAgICAgICAgICAgIG1tX2NhbWVyYV9jbWRjYl90KiBjYl9ub2RlID0gTlVMTDsKKyAgICAgICAgICAgIExPR0QoIlNlbmQgc3VwZXJidWYgdG8gSEFMLCBwZW5kaW5nX2NudD0lZCIsCisgICAgICAgICAgICAgICAgICAgICBjaF9vYmotPnBlbmRpbmdfY250KTsKKyAgICAgICAgICAgIC8qIHNlbmQgY2FtX3NlbV9wb3N0IHRvIHdha2UgdXAgY2IgdGhyZWFkIHRvIGRpc3BhdGNoIHN1cGVyIGJ1ZmZlciAqLworICAgICAgICAgICAgY2Jfbm9kZSA9IChtbV9jYW1lcmFfY21kY2JfdCAqKW1hbGxvYyhzaXplb2YobW1fY2FtZXJhX2NtZGNiX3QpKTsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IGNiX25vZGUpIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQoY2Jfbm9kZSwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9jbWRjYl90KSk7CisgICAgICAgICAgICAgICAgY2Jfbm9kZS0+Y21kX3R5cGUgPSBNTV9DQU1FUkFfQ01EX1RZUEVfU1VQRVJfQlVGX0RBVEFfQ0I7CisgICAgICAgICAgICAgICAgY2Jfbm9kZS0+dS5zdXBlcmJ1Zi5udW1fYnVmcyA9IG5vZGUtPm51bV9vZl9idWZzOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgaSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5vZGUtPm51bV9vZl9idWZzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY2Jfbm9kZS0+dS5zdXBlcmJ1Zi5idWZzW2ldID0gbm9kZS0+c3VwZXJfYnVmW2ldLmJ1ZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2Jfbm9kZS0+dS5zdXBlcmJ1Zi5jYW1lcmFfaGFuZGxlID0gY2hfb2JqLT5jYW1fb2JqLT5teV9oZGw7CisgICAgICAgICAgICAgICAgY2Jfbm9kZS0+dS5zdXBlcmJ1Zi5jaF9pZCA9IGNoX29iai0+bXlfaGRsOworICAgICAgICAgICAgICAgIGNiX25vZGUtPnUuc3VwZXJidWYuYlJlYWR5Rm9yUHJlcGFyZVNuYXBzaG90ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNoX29iai0+YldhaXRGb3JQcmVwU25hcHNob3REb25lOworICAgICAgICAgICAgICAgIGlmIChjaF9vYmotPnVuTG9ja0FFQyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGNiX25vZGUtPnUuc3VwZXJidWYuYlVubG9ja0FFQyA9IDE7CisgICAgICAgICAgICAgICAgICAgIExPR0goIlVubG9ja2luZyBBRUMiKTsKKyAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT51bkxvY2tBRUMgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBlbnF1ZXVlIHRvIGNiIHRocmVhZCAqLworICAgICAgICAgICAgICAgIGNhbV9xdWV1ZV9lbnEoJihjaF9vYmotPmNiX3RocmVhZC5jbWRfcXVldWUpLCBjYl9ub2RlKTsKKyAgICAgICAgICAgICAgICAvKiB3YWtlIHVwIGNiIHRocmVhZCAqLworICAgICAgICAgICAgICAgIGNhbV9zZW1fcG9zdCgmKGNoX29iai0+Y2JfdGhyZWFkLmNtZF9zZW0pKTsKKyAgICAgICAgICAgICAgICBMT0dIKCJTZW50IHN1cGVyIGJ1ZiBmb3Igbm9kZVslZF0gIiwgaWR4KTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIG1tX2NhbWVyYV9ub2RlX3QiKTsKKyAgICAgICAgICAgICAgICAvKiBidWYgZG9uZSB3aXRoIHRoZSB1bnVzZWQgc3VwZXIgYnVmICovCisgICAgICAgICAgICAgICAgdWludDhfdCBpID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbm9kZS0+bnVtX29mX2J1ZnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBtbV9jaGFubmVsX3FidWYoY2hfb2JqLCBub2RlLT5zdXBlcl9idWZbaV0uYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKG5vZGUpOworICAgICAgICB9IGVsc2UgaWYgKChjaF9vYmogIT0gTlVMTCkgJiYgKG5vZGUgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgIC8qIGJ1ZiBkb25lIHdpdGggdGhlIHVudXNlZCBzdXBlciBidWYgKi8KKyAgICAgICAgICAgIHVpbnQ4X3QgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBub2RlLT5udW1fb2ZfYnVmczsgaSsrKSB7CisgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF9xYnVmKGNoX29iaiwgbm9kZS0+c3VwZXJfYnVmW2ldLmJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKG5vZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRSgibm9kZSBpcyBOVUxMLCBkZWJ1ZyB0aGlzIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF9yZWdfc3RyZWFtX2J1Zl9jYgorICoKKyAqIERFU0NSSVBUSU9OOiBSZWdpc3RlciBjYWxsYmFjayBmb3Igc3RyZWFtIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICA6IENoYW5uZWwgb2JqZWN0CisgKiAgIEBzdHJlYW1faWQgIDogc3RyZWFtIHRoYXQgd2lsbCBiZSBsaW5rZWQKKyAqICAgQGJ1Zl9jYiAgICAgOiBzcGVjaWFsIGNhbGxiYWNrIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHN0cmVhbSBidWZmZXIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSAgZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NoYW5uZWxfcmVnX3N0cmVhbV9idWZfY2IgKG1tX2NoYW5uZWxfdCogbXlfb2JqLAorICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQsIG1tX3N0cmVhbV9kYXRhX2NiX3QgYnVmX2NiKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9zdHJlYW1fdCogc19vYmogPSBtbV9jaGFubmVsX3V0aWxfZ2V0X3N0cmVhbV9ieV9oYW5kbGVyKG15X29iaiwKKyAgICAgICAgICAgIHN0cmVhbV9pZCk7CisKKyAgICBpZiAoTlVMTCAhPSBzX29iaikgeworICAgICAgICBpZiAoc19vYmotPmNoX29iaiAhPSBteV9vYmopIHsKKyAgICAgICAgICAgIC8qIE5vIG9wLiBvbiBsaW5rZWQgc3RyZWFtcyAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fcmVnX2J1Zl9jYihzX29iaiwgYnVmX2NiKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7CisKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX2ZzbV9mbgorICoKKyAqIERFU0NSSVBUSU9OOiBjaGFubmVsIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGVudHJ5IGZ1bmN0aW9uLiBEZXBlbmRzIG9uIGNoYW5uZWwKKyAqICAgICAgICAgICAgICBzdGF0ZSwgaW5jb21pbmcgZXZlbnQgd2lsbCBiZSBoYW5kbGVkIGRpZmZlcmVudGx5LgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgOiBwdHIgdG8gYSBjaGFubmVsIG9iamVjdAorICogICBAZXZ0ICAgICAgOiBjaGFubmVsIGV2ZW50IHRvIGJlIHByb2Nlc3NlZAorICogICBAaW5fdmFsICAgOiBpbnB1dCBldmVudCBwYXlsb2FkLiBDYW4gYmUgTlVMTCBpZiBub3QgbmVlZGVkLgorICogICBAb3V0X3ZhbCAgOiBvdXRwdXQgcGF5bG9hZCwgQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9mc21fZm4obW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfZXZ0X3R5cGVfdCBldnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBpbl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBvdXRfdmFsKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKworICAgIExPR0QoIkUgc3RhdGUgPSAlZCIsIG15X29iai0+c3RhdGUpOworICAgIHN3aXRjaCAobXlfb2JqLT5zdGF0ZSkgeworICAgIGNhc2UgTU1fQ0hBTk5FTF9TVEFURV9OT1RVU0VEOgorICAgICAgICByYyA9IG1tX2NoYW5uZWxfZnNtX2ZuX25vdHVzZWQobXlfb2JqLCBldnQsIGluX3ZhbCwgb3V0X3ZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fQ0hBTk5FTF9TVEFURV9TVE9QUEVEOgorICAgICAgICByYyA9IG1tX2NoYW5uZWxfZnNtX2ZuX3N0b3BwZWQobXlfb2JqLCBldnQsIGluX3ZhbCwgb3V0X3ZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fQ0hBTk5FTF9TVEFURV9BQ1RJVkU6CisgICAgICAgIHJjID0gbW1fY2hhbm5lbF9mc21fZm5fYWN0aXZlKG15X29iaiwgZXZ0LCBpbl92YWwsIG91dF92YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NIQU5ORUxfU1RBVEVfUEFVU0VEOgorICAgICAgICByYyA9IG1tX2NoYW5uZWxfZnNtX2ZuX3BhdXNlZChteV9vYmosIGV2dCwgaW5fdmFsLCBvdXRfdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRCgiTm90IGEgdmFsaWQgc3RhdGUgKCVkKSIsIG15X29iai0+c3RhdGUpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiB1bmxvY2sgY2hfbG9jayAqLworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNoX2xvY2spOworICAgIExPR0QoIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF9mc21fZm5fbm90dXNlZAorICoKKyAqIERFU0NSSVBUSU9OOiBjaGFubmVsIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uIHRvIGhhbmRsZSBldmVudAorICogICAgICAgICAgICAgIGluIE5PVF9VU0VEIHN0YXRlLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgOiBwdHIgdG8gYSBjaGFubmVsIG9iamVjdAorICogICBAZXZ0ICAgICAgOiBjaGFubmVsIGV2ZW50IHRvIGJlIHByb2Nlc3NlZAorICogICBAaW5fdmFsICAgOiBpbnB1dCBldmVudCBwYXlsb2FkLiBDYW4gYmUgTlVMTCBpZiBub3QgbmVlZGVkLgorICogICBAb3V0X3ZhbCAgOiBvdXRwdXQgcGF5bG9hZCwgQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9mc21fZm5fbm90dXNlZChtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jaGFubmVsX2V2dF90eXBlX3QgZXZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBpbl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIG91dF92YWwpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworCisgICAgc3dpdGNoIChldnQpIHsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJpbnZhbGlkIHN0YXRlICglZCkgZm9yIGV2dCAoJWQpLCBpbiglcCksIG91dCglcCkiLAorICAgICAgICAgICAgICAgICAgICBteV9vYmotPnN0YXRlLCBldnQsIGluX3ZhbCwgb3V0X3ZhbCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX2ZzbV9mbl9zdG9wcGVkCisgKgorICogREVTQ1JJUFRJT046IGNoYW5uZWwgZmluaXRlIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb24gdG8gaGFuZGxlIGV2ZW50CisgKiAgICAgICAgICAgICAgaW4gU1RPUFBFRCBzdGF0ZS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgIDogcHRyIHRvIGEgY2hhbm5lbCBvYmplY3QKKyAqICAgQGV2dCAgICAgIDogY2hhbm5lbCBldmVudCB0byBiZSBwcm9jZXNzZWQKKyAqICAgQGluX3ZhbCAgIDogaW5wdXQgZXZlbnQgcGF5bG9hZC4gQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4KKyAqICAgQG91dF92YWwgIDogb3V0cHV0IHBheWxvYWQsIENhbiBiZSBOVUxMIGlmIG5vdCBuZWVkZWQuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NoYW5uZWxfZnNtX2ZuX3N0b3BwZWQobW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF9ldnRfdHlwZV90IGV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaW5fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBvdXRfdmFsKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIExPR0QoIkUgZXZ0ID0gJWQiLCBldnQpOworICAgIHN3aXRjaCAoZXZ0KSB7CisgICAgY2FzZSBNTV9DSEFOTkVMX0VWVF9BRERfU1RSRUFNOgorICAgICAgICB7CisgICAgICAgICAgICB1aW50MzJfdCBzX2hkbCA9IDA7CisgICAgICAgICAgICBzX2hkbCA9IG1tX2NoYW5uZWxfYWRkX3N0cmVhbShteV9vYmopOworICAgICAgICAgICAgKigodWludDMyX3QqKW91dF92YWwpID0gc19oZGw7CisgICAgICAgICAgICByYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9DSEFOTkVMX0VWVF9MSU5LX1NUUkVBTToKKyAgICAgICAgeworICAgICAgICAgICAgbW1fY2FtZXJhX3N0cmVhbV9saW5rX3QgKnN0cmVhbV9saW5rID0gTlVMTDsKKyAgICAgICAgICAgIHVpbnQzMl90IHNfaGRsID0gMDsKKyAgICAgICAgICAgIHN0cmVhbV9saW5rID0gKG1tX2NhbWVyYV9zdHJlYW1fbGlua190ICopIGluX3ZhbDsKKyAgICAgICAgICAgIHNfaGRsID0gbW1fY2hhbm5lbF9saW5rX3N0cmVhbShteV9vYmosIHN0cmVhbV9saW5rKTsKKyAgICAgICAgICAgICooKHVpbnQzMl90KilvdXRfdmFsKSA9IHNfaGRsOworICAgICAgICAgICAgcmMgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fQ0hBTk5FTF9FVlRfREVMX1NUUkVBTToKKyAgICAgICAgeworICAgICAgICAgICAgdWludDMyX3Qgc19pZCA9ICooKHVpbnQzMl90ICopaW5fdmFsKTsKKyAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9kZWxfc3RyZWFtKG15X29iaiwgc19pZCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9DSEFOTkVMX0VWVF9TVEFSVDoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtbV9jaGFubmVsX3N0YXJ0KG15X29iaik7CisgICAgICAgICAgICAvKiBmaXJzdCBzdHJlYW0gc3RhcnRlZCBpbiBzdG9wcGVkIHN0YXRlCisgICAgICAgICAgICAgKiBtb3ZlIHRvIGFjdGl2ZSBzdGF0ZSAqLworICAgICAgICAgICAgaWYgKDAgPT0gcmMpIHsKKyAgICAgICAgICAgICAgICBteV9vYmotPnN0YXRlID0gTU1fQ0hBTk5FTF9TVEFURV9BQ1RJVkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9DSEFOTkVMX0VWVF9DT05GSUdfU1RSRUFNOgorICAgICAgICB7CisgICAgICAgICAgICBtbV9ldnRfcGF5bG9kX2NvbmZpZ19zdHJlYW1fdCAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKG1tX2V2dF9wYXlsb2RfY29uZmlnX3N0cmVhbV90ICopaW5fdmFsOworICAgICAgICAgICAgcmMgPSBtbV9jaGFubmVsX2NvbmZpZ19zdHJlYW0obXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC0+c3RyZWFtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC0+Y29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NIQU5ORUxfRVZUX0dFVF9CVU5ETEVfSU5GTzoKKyAgICAgICAgeworICAgICAgICAgICAgY2FtX2J1bmRsZV9jb25maWdfdCAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKGNhbV9idW5kbGVfY29uZmlnX3QgKilpbl92YWw7CisgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfZ2V0X2J1bmRsZV9pbmZvKG15X29iaiwgcGF5bG9hZCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9DSEFOTkVMX0VWVF9ERUxFVEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2NoYW5uZWxfcmVsZWFzZShteV9vYmopOworICAgICAgICAgICAgcmMgPSAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fQ0hBTk5FTF9FVlRfU0VUX1NUUkVBTV9QQVJNOgorICAgICAgICB7CisgICAgICAgICAgICBtbV9ldnRfcGF5bG9kX3NldF9nZXRfc3RyZWFtX3Bhcm1zX3QgKnBheWxvYWQgPQorICAgICAgICAgICAgICAgIChtbV9ldnRfcGF5bG9kX3NldF9nZXRfc3RyZWFtX3Bhcm1zX3QgKilpbl92YWw7CisgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfc2V0X3N0cmVhbV9wYXJtKG15X29iaiwgcGF5bG9hZCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9DSEFOTkVMX0VWVF9HRVRfU1RSRUFNX1FVRVVFRF9CVUZfQ09VTlQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCA9ICooKHVpbnQzMl90ICopaW5fdmFsKTsKKyAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9nZXRfcXVldWVkX2J1Zl9jb3VudChteV9vYmosIHN0cmVhbV9pZCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9DSEFOTkVMX0VWVF9HRVRfU1RSRUFNX1BBUk06CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2V2dF9wYXlsb2Rfc2V0X2dldF9zdHJlYW1fcGFybXNfdCAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKG1tX2V2dF9wYXlsb2Rfc2V0X2dldF9zdHJlYW1fcGFybXNfdCAqKWluX3ZhbDsKKyAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9nZXRfc3RyZWFtX3Bhcm0obXlfb2JqLCBwYXlsb2FkKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NIQU5ORUxfRVZUX0RPX1NUUkVBTV9BQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2V2dF9wYXlsb2RfZG9fc3RyZWFtX2FjdGlvbl90ICpwYXlsb2FkID0KKyAgICAgICAgICAgICAgICAobW1fZXZ0X3BheWxvZF9kb19zdHJlYW1fYWN0aW9uX3QgKilpbl92YWw7CisgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfZG9fc3RyZWFtX2FjdGlvbihteV9vYmosIHBheWxvYWQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fQ0hBTk5FTF9FVlRfTUFQX1NUUkVBTV9CVUY6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNhbV9idWZfbWFwX3R5cGUgKnBheWxvYWQgPQorICAgICAgICAgICAgICAgIChjYW1fYnVmX21hcF90eXBlICopaW5fdmFsOworICAgICAgICAgICAgcmMgPSBtbV9jaGFubmVsX21hcF9zdHJlYW1fYnVmKG15X29iaiwgcGF5bG9hZCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9DSEFOTkVMX0VWVF9NQVBfU1RSRUFNX0JVRlM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNhbV9idWZfbWFwX3R5cGVfbGlzdCAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKGNhbV9idWZfbWFwX3R5cGVfbGlzdCAqKWluX3ZhbDsKKyAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9tYXBfc3RyZWFtX2J1ZnMobXlfb2JqLCBwYXlsb2FkKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NIQU5ORUxfRVZUX1VOTUFQX1NUUkVBTV9CVUY6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNhbV9idWZfdW5tYXBfdHlwZSAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKGNhbV9idWZfdW5tYXBfdHlwZSAqKWluX3ZhbDsKKyAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF91bm1hcF9zdHJlYW1fYnVmKG15X29iaiwgcGF5bG9hZCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9DSEFOTkVMX0VWVF9SRUdfU1RSRUFNX0JVRl9DQjoKKyAgICAgICAgeworICAgICAgICAgICAgbW1fZXZ0X3BheWxvZF9yZWdfc3RyZWFtX2J1Zl9jYiAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKG1tX2V2dF9wYXlsb2RfcmVnX3N0cmVhbV9idWZfY2IgKilpbl92YWw7CisgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfcmVnX3N0cmVhbV9idWZfY2IgKG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC0+c3RyZWFtX2lkLCBwYXlsb2FkLT5idWZfY2IpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoImludmFsaWQgc3RhdGUgKCVkKSBmb3IgZXZ0ICglZCkiLAorICAgICAgICAgICAgICAgICAgICBteV9vYmotPnN0YXRlLCBldnQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgTE9HRCgiRSByYyA9ICVkIiwgcmMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX2ZzbV9mbl9hY3RpdmUKKyAqCisgKiBERVNDUklQVElPTjogY2hhbm5lbCBmaW5pdGUgc3RhdGUgbWFjaGluZSBmdW5jdGlvbiB0byBoYW5kbGUgZXZlbnQKKyAqICAgICAgICAgICAgICBpbiBBQ1RJVkUgc3RhdGUuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICA6IHB0ciB0byBhIGNoYW5uZWwgb2JqZWN0CisgKiAgIEBldnQgICAgICA6IGNoYW5uZWwgZXZlbnQgdG8gYmUgcHJvY2Vzc2VkCisgKiAgIEBpbl92YWwgICA6IGlucHV0IGV2ZW50IHBheWxvYWQuIENhbiBiZSBOVUxMIGlmIG5vdCBuZWVkZWQuCisgKiAgIEBvdXRfdmFsICA6IG91dHB1dCBwYXlsb2FkLCBDYW4gYmUgTlVMTCBpZiBub3QgbmVlZGVkLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jaGFubmVsX2ZzbV9mbl9hY3RpdmUobW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfZXZ0X3R5cGVfdCBldnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBpbl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBvdXRfdmFsKQoreworICAgIGludDMyX3QgcmMgPSAwOworCisgICAgTE9HRCgiRSBldnQgPSAlZCIsIGV2dCk7CisgICAgc3dpdGNoIChldnQpIHsKKyAgICBjYXNlIE1NX0NIQU5ORUxfRVZUX1NUT1A6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9zdG9wKG15X29iaik7CisgICAgICAgICAgICBteV9vYmotPnN0YXRlID0gTU1fQ0hBTk5FTF9TVEFURV9TVE9QUEVEOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fQ0hBTk5FTF9FVlRfUkVRVUVTVF9TVVBFUl9CVUY6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2NhbWVyYV9yZXFfYnVmX3QgKnBheWxvYWQgPQorICAgICAgICAgICAgICAgICAgICAobW1fY2FtZXJhX3JlcV9idWZfdCAqKWluX3ZhbDsKKyAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9yZXF1ZXN0X3N1cGVyX2J1ZihteV9vYmosIHBheWxvYWQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fQ0hBTk5FTF9FVlRfQ0FOQ0VMX1JFUVVFU1RfU1VQRVJfQlVGOgorICAgICAgICB7CisgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfY2FuY2VsX3N1cGVyX2J1Zl9yZXF1ZXN0KG15X29iaik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9DSEFOTkVMX0VWVF9GTFVTSF9TVVBFUl9CVUZfUVVFVUU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX2lkeCA9ICooKHVpbnQzMl90ICopaW5fdmFsKTsKKyAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9mbHVzaF9zdXBlcl9idWZfcXVldWUobXlfb2JqLCBmcmFtZV9pZHgsIENBTV9TVFJFQU1fVFlQRV9ERUZBVUxUKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NIQU5ORUxfRVZUX1NUQVJUX1pTTF9TTkFQU0hPVDoKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtbV9jaGFubmVsX3N0YXJ0X3pzbF9zbmFwc2hvdChteV9vYmopOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fQ0hBTk5FTF9FVlRfU1RPUF9aU0xfU05BUFNIT1Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9zdG9wX3pzbF9zbmFwc2hvdChteV9vYmopOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fQ0hBTk5FTF9FVlRfQ09ORklHX05PVElGWV9NT0RFOgorICAgICAgICB7CisgICAgICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX25vdGlmeV9tb2RlX3Qgbm90aWZ5X21vZGUgPQorICAgICAgICAgICAgICAgICooKG1tX2NhbWVyYV9zdXBlcl9idWZfbm90aWZ5X21vZGVfdCAqKWluX3ZhbCk7CisgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfY29uZmlnX25vdGlmeV9tb2RlKG15X29iaiwgbm90aWZ5X21vZGUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fQ0hBTk5FTF9FVlRfU0VUX1NUUkVBTV9QQVJNOgorICAgICAgICB7CisgICAgICAgICAgICBtbV9ldnRfcGF5bG9kX3NldF9nZXRfc3RyZWFtX3Bhcm1zX3QgKnBheWxvYWQgPQorICAgICAgICAgICAgICAgIChtbV9ldnRfcGF5bG9kX3NldF9nZXRfc3RyZWFtX3Bhcm1zX3QgKilpbl92YWw7CisgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfc2V0X3N0cmVhbV9wYXJtKG15X29iaiwgcGF5bG9hZCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9DSEFOTkVMX0VWVF9HRVRfU1RSRUFNX1FVRVVFRF9CVUZfQ09VTlQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCA9ICooKHVpbnQzMl90ICopaW5fdmFsKTsKKyAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9nZXRfcXVldWVkX2J1Zl9jb3VudChteV9vYmosIHN0cmVhbV9pZCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9DSEFOTkVMX0VWVF9HRVRfU1RSRUFNX1BBUk06CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2V2dF9wYXlsb2Rfc2V0X2dldF9zdHJlYW1fcGFybXNfdCAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKG1tX2V2dF9wYXlsb2Rfc2V0X2dldF9zdHJlYW1fcGFybXNfdCAqKWluX3ZhbDsKKyAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9nZXRfc3RyZWFtX3Bhcm0obXlfb2JqLCBwYXlsb2FkKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NIQU5ORUxfRVZUX0RPX1NUUkVBTV9BQ1RJT046CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2V2dF9wYXlsb2RfZG9fc3RyZWFtX2FjdGlvbl90ICpwYXlsb2FkID0KKyAgICAgICAgICAgICAgICAobW1fZXZ0X3BheWxvZF9kb19zdHJlYW1fYWN0aW9uX3QgKilpbl92YWw7CisgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfZG9fc3RyZWFtX2FjdGlvbihteV9vYmosIHBheWxvYWQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fQ0hBTk5FTF9FVlRfTUFQX1NUUkVBTV9CVUY6CisgICAgICAgIHsKKyAgICAgICAgICAgIGNhbV9idWZfbWFwX3R5cGUgKnBheWxvYWQgPQorICAgICAgICAgICAgICAgIChjYW1fYnVmX21hcF90eXBlICopaW5fdmFsOworICAgICAgICAgICAgaWYgKHBheWxvYWQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHlwZSA9IHBheWxvYWQtPnR5cGU7CisgICAgICAgICAgICAgICAgaWYgKCh0eXBlID09IENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfSU5QVVRfQlVGKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gQ0FNX01BUFBJTkdfQlVGX1RZUEVfT0ZGTElORV9NRVRBX0JVRikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBtbV9jaGFubmVsX21hcF9zdHJlYW1fYnVmKG15X29iaiwgcGF5bG9hZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJjYW5ub3QgbWFwIHJlZ3VhbHIgc3RyZWFtIGJ1ZiBpbiBhY3RpdmUgc3RhdGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NIQU5ORUxfRVZUX01BUF9TVFJFQU1fQlVGUzoKKyAgICAgICAgeworICAgICAgICAgICAgY2FtX2J1Zl9tYXBfdHlwZV9saXN0ICpwYXlsb2FkID0KKyAgICAgICAgICAgICAgICAoY2FtX2J1Zl9tYXBfdHlwZV9saXN0ICopaW5fdmFsOworICAgICAgICAgICAgaWYgKChwYXlsb2FkICE9IE5VTEwpICYmIChwYXlsb2FkLT5sZW5ndGggPiAwKSkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHlwZSA9IHBheWxvYWQtPmJ1Zl9tYXBzWzBdLnR5cGU7CisgICAgICAgICAgICAgICAgaWYgKCh0eXBlID09IENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfSU5QVVRfQlVGKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gQ0FNX01BUFBJTkdfQlVGX1RZUEVfT0ZGTElORV9NRVRBX0JVRikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBtbV9jaGFubmVsX21hcF9zdHJlYW1fYnVmcyhteV9vYmosIHBheWxvYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiY2Fubm90IG1hcCByZWd1YWxyIHN0cmVhbSBidWYgaW4gYWN0aXZlIHN0YXRlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9DSEFOTkVMX0VWVF9VTk1BUF9TVFJFQU1fQlVGOgorICAgICAgICB7CisgICAgICAgICAgICBjYW1fYnVmX3VubWFwX3R5cGUgKnBheWxvYWQgPQorICAgICAgICAgICAgICAgIChjYW1fYnVmX3VubWFwX3R5cGUgKilpbl92YWw7CisgICAgICAgICAgICBpZiAocGF5bG9hZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCB0eXBlID0gcGF5bG9hZC0+dHlwZTsKKyAgICAgICAgICAgICAgICBpZiAoKHR5cGUgPT0gQ0FNX01BUFBJTkdfQlVGX1RZUEVfT0ZGTElORV9JTlBVVF9CVUYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX01FVEFfQlVGKSkgeworICAgICAgICAgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfdW5tYXBfc3RyZWFtX2J1ZihteV9vYmosIHBheWxvYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiY2Fubm90IHVubWFwIHJlZ3VhbHIgc3RyZWFtIGJ1ZiBpbiBhY3RpdmUgc3RhdGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NIQU5ORUxfRVZUX0FGX0JSQUNLRVRJTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIExPR0goIk1NX0NIQU5ORUxfRVZUX0FGX0JSQUNLRVRJTkciKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0X2ZsYWcgPSAqKCh1aW50MzJfdCAqKWluX3ZhbCk7CisgICAgICAgICAgICBtbV9jYW1lcmFfZ2VuZXJpY19jbWRfdCBnZW5fY21kOworICAgICAgICAgICAgZ2VuX2NtZC50eXBlID0gTU1fQ0FNRVJBX0dFTkVSSUNfQ01EX1RZUEVfQUZfQlJBQ0tFVElORzsKKyAgICAgICAgICAgIGdlbl9jbWQucGF5bG9hZFswXSA9IHN0YXJ0X2ZsYWc7CisgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfcHJvY19nZW5lcmFsX2NtZChteV9vYmosICZnZW5fY21kKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NIQU5ORUxfRVZUX0FFX0JSQUNLRVRJTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIExPR0goIk1NX0NIQU5ORUxfRVZUX0FFX0JSQUNLRVRJTkciKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0X2ZsYWcgPSAqKCh1aW50MzJfdCAqKWluX3ZhbCk7CisgICAgICAgICAgICBtbV9jYW1lcmFfZ2VuZXJpY19jbWRfdCBnZW5fY21kOworICAgICAgICAgICAgZ2VuX2NtZC50eXBlID0gTU1fQ0FNRVJBX0dFTkVSSUNfQ01EX1RZUEVfQUVfQlJBQ0tFVElORzsKKyAgICAgICAgICAgIGdlbl9jbWQucGF5bG9hZFswXSA9IHN0YXJ0X2ZsYWc7CisgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfcHJvY19nZW5lcmFsX2NtZChteV9vYmosICZnZW5fY21kKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NIQU5ORUxfRVZUX0ZMQVNIX0JSQUNLRVRJTkc6CisgICAgICAgIHsKKyAgICAgICAgICAgIExPR0goIk1NX0NIQU5ORUxfRVZUX0ZMQVNIX0JSQUNLRVRJTkciKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0X2ZsYWcgPSAqKCh1aW50MzJfdCAqKWluX3ZhbCk7CisgICAgICAgICAgICBtbV9jYW1lcmFfZ2VuZXJpY19jbWRfdCBnZW5fY21kOworICAgICAgICAgICAgZ2VuX2NtZC50eXBlID0gTU1fQ0FNRVJBX0dFTkVSSUNfQ01EX1RZUEVfRkxBU0hfQlJBQ0tFVElORzsKKyAgICAgICAgICAgIGdlbl9jbWQucGF5bG9hZFswXSA9IHN0YXJ0X2ZsYWc7CisgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfcHJvY19nZW5lcmFsX2NtZChteV9vYmosICZnZW5fY21kKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NIQU5ORUxfRVZUX1pPT01fMVg6CisgICAgICAgIHsKKyAgICAgICAgICAgIExPR0goIk1NX0NIQU5ORUxfRVZUX1pPT01fMVgiKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0X2ZsYWcgPSAqKCh1aW50MzJfdCAqKWluX3ZhbCk7CisgICAgICAgICAgICBtbV9jYW1lcmFfZ2VuZXJpY19jbWRfdCBnZW5fY21kOworICAgICAgICAgICAgZ2VuX2NtZC50eXBlID0gTU1fQ0FNRVJBX0dFTkVSSUNfQ01EX1RZUEVfWk9PTV8xWDsKKyAgICAgICAgICAgIGdlbl9jbWQucGF5bG9hZFswXSA9IHN0YXJ0X2ZsYWc7CisgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfcHJvY19nZW5lcmFsX2NtZChteV9vYmosICZnZW5fY21kKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NBTUVSQV9FVlRfQ0FQVFVSRV9TRVRUSU5HOgorICAgICAgICB7CisgICAgICAgICAgICBtbV9jYW1lcmFfZ2VuZXJpY19jbWRfdCBnZW5fY21kOworICAgICAgICAgICAgY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QgKmlucHV0OworICAgICAgICAgICAgZ2VuX2NtZC50eXBlID0gTU1fQ0FNRVJBX0dFTkVSSUNfQ01EX1RZUEVfQ0FQVFVSRV9TRVRUSU5HOworICAgICAgICAgICAgTE9HSCgiTU1fQ0FNRVJBX0VWVF9DQVBUVVJFX1NFVFRJTkciKTsKKyAgICAgICAgICAgIGlmIChpbl92YWwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdlbl9jbWQucGF5bG9hZFswXSA9IDA7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZnZW5fY21kLmZyYW1lX2NvbmZpZywgMCwgc2l6ZW9mKGNhbV9jYXB0dXJlX2ZyYW1lX2NvbmZpZ190KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdlbl9jbWQucGF5bG9hZFswXSA9IDE7CisgICAgICAgICAgICAgICAgaW5wdXQgPSAoY2FtX2NhcHR1cmVfZnJhbWVfY29uZmlnX3QgKilpbl92YWw7CisgICAgICAgICAgICAgICAgZ2VuX2NtZC5mcmFtZV9jb25maWcgPSAqaW5wdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYyA9IG1tX2NoYW5uZWxfcHJvY19nZW5lcmFsX2NtZChteV9vYmosICZnZW5fY21kKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NIQU5ORUxfRVZUX1JFR19TVFJFQU1fQlVGX0NCOgorICAgICAgICB7CisgICAgICAgICAgICBtbV9ldnRfcGF5bG9kX3JlZ19zdHJlYW1fYnVmX2NiICpwYXlsb2FkID0KKyAgICAgICAgICAgICAgICAobW1fZXZ0X3BheWxvZF9yZWdfc3RyZWFtX2J1Zl9jYiAqKWluX3ZhbDsKKyAgICAgICAgICAgIHJjID0gbW1fY2hhbm5lbF9yZWdfc3RyZWFtX2J1Zl9jYiAobXlfb2JqLAorICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLT5zdHJlYW1faWQsIHBheWxvYWQtPmJ1Zl9jYik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoImludmFsaWQgc3RhdGUgKCVkKSBmb3IgZXZ0ICglZCksIGluKCVwKSwgb3V0KCVwKSIsCisgICAgICAgICAgICAgICAgICAgIG15X29iai0+c3RhdGUsIGV2dCwgaW5fdmFsLCBvdXRfdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIExPR0QoIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF9mc21fZm5fcGF1c2VkCisgKgorICogREVTQ1JJUFRJT046IGNoYW5uZWwgZmluaXRlIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb24gdG8gaGFuZGxlIGV2ZW50CisgKiAgICAgICAgICAgICAgaW4gUEFVU0VEIHN0YXRlLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgOiBwdHIgdG8gYSBjaGFubmVsIG9iamVjdAorICogICBAZXZ0ICAgICAgOiBjaGFubmVsIGV2ZW50IHRvIGJlIHByb2Nlc3NlZAorICogICBAaW5fdmFsICAgOiBpbnB1dCBldmVudCBwYXlsb2FkLiBDYW4gYmUgTlVMTCBpZiBub3QgbmVlZGVkLgorICogICBAb3V0X3ZhbCAgOiBvdXRwdXQgcGF5bG9hZCwgQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9mc21fZm5fcGF1c2VkKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jaGFubmVsX2V2dF90eXBlX3QgZXZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaW5fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogb3V0X3ZhbCkKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKworICAgIC8qIGN1cnJlbnRseSB3ZSBhcmUgbm90IHN1cHBvcnRpbmcgcGF1c2UvcmVzdW1lIGNoYW5uZWwgKi8KKyAgICBMT0dFKCJpbnZhbGlkIHN0YXRlICglZCkgZm9yIGV2dCAoJWQpLCBpbiglcCksIG91dCglcCkiLAorICAgICAgICAgICAgICAgIG15X29iai0+c3RhdGUsIGV2dCwgaW5fdmFsLCBvdXRfdmFsKTsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX2luaXQKKyAqCisgKiBERVNDUklQVElPTjogaW5pdGlhbGl6ZSBhIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNoYW5uZWwgb2JqZWN0IGJlIHRvIGluaXRpYWxpemVkCisgKiAgIEBhdHRyICAgICAgICAgOiBidW5kbGUgYXR0cmlidXRlIG9mIHRoZSBjaGFubmVsIGlmIG5lZWRlZAorICogICBAY2hhbm5lbF9jYiAgIDogY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGJ1bmRsZSBkYXRhIG5vdGlmeQorICogICBAdXNlcmRhdGEgICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBpZiBubyBidW5kbGUgZGF0YSBub3RpZnkgaXMgbmVlZGVkLCBtZWFuaW5nIGVhY2ggc3RyZWFtIGluIHRoZQorICogICAgICAgICAgICAgIGNoYW5uZWwgd2lsbCBoYXZlIGl0cyBvd24gc3RyZWFtIGRhdGEgbm90aWZ5IGNhbGxiYWNrLCB0aGVuCisgKiAgICAgICAgICAgICAgYXR0ciwgY2hhbm5lbF9jYiwgYW5kIHVzZXJkYXRhIGNhbiBiZSBOVUxMLiBJbiB0aGlzIGNhc2UsCisgKiAgICAgICAgICAgICAgbm8gbWF0Y2hpbmcgbG9naWMgd2lsbCBiZSBwZXJmb3JtZWQgaW4gY2hhbm5lbCBmb3IgdGhlIGJ1bmRsaW5nLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NoYW5uZWxfaW5pdChtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfbm90aWZ5X3QgY2hhbm5lbF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKQoreworICAgIGludDMyX3QgcmMgPSAwOworCisgICAgbXlfb2JqLT5idW5kbGUuc3VwZXJfYnVmX25vdGlmeV9jYiA9IGNoYW5uZWxfY2I7CisgICAgbXlfb2JqLT5idW5kbGUudXNlcl9kYXRhID0gdXNlcmRhdGE7CisgICAgaWYgKE5VTEwgIT0gYXR0cikgeworICAgICAgICBteV9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5hdHRyID0gKmF0dHI7CisgICAgfQorCisgICAgTE9HRCgiTGF1bmNoIGRhdGEgcG9sbCB0aHJlYWQgaW4gY2hhbm5lbCBvcGVuIik7CisgICAgc25wcmludGYobXlfb2JqLT5wb2xsX3RocmVhZFswXS50aHJlYWROYW1lLCBUSFJFQURfTkFNRV9TSVpFLCAiQ0FNX2RhdGFQb2xsIik7CisgICAgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX2xhdW5jaCgmbXlfb2JqLT5wb2xsX3RocmVhZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NBTUVSQV9QT0xMX1RZUEVfREFUQSk7CisKKyAgICAvKiBjaGFuZ2Ugc3RhdGUgdG8gc3RvcHBlZCBzdGF0ZSAqLworICAgIG15X29iai0+c3RhdGUgPSBNTV9DSEFOTkVMX1NUQVRFX1NUT1BQRUQ7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NoYW5uZWxfcmVsZWFzZQorICoKKyAqIERFU0NSSVBUSU9OOiByZWxlYXNlIGEgY2hhbm5lbCByZXNvdXJjZS4gQ2hhbm5lbCBzdGF0ZSB3aWxsIG1vdmUgdG8gVU5VU0VECisgKiAgICAgICAgICAgICAgc3RhdGUgYWZ0ZXIgdGhpcyBjYWxsLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2hhbm5lbCBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIG1tX2NoYW5uZWxfcmVsZWFzZShtbV9jaGFubmVsX3QgKm15X29iaikKK3sKKyAgICAvKiBzdG9wIGRhdGEgcG9sbCB0aHJlYWQgKi8KKyAgICBtbV9jYW1lcmFfcG9sbF90aHJlYWRfcmVsZWFzZSgmbXlfb2JqLT5wb2xsX3RocmVhZFswXSk7CisKKyAgICAvKiBtZW1zZXQgYnVuZGxlIGluZm8gKi8KKyAgICBtZW1zZXQoJm15X29iai0+YnVuZGxlLCAwLCBzaXplb2YobW1fY2hhbm5lbF9idW5kbGVfdCkpOworCisgICAgLyogY2hhbmdlIHN0YXRlIHRvIG5vdHVzZWQgc3RhdGUgKi8KKyAgICBteV9vYmotPnN0YXRlID0gTU1fQ0hBTk5FTF9TVEFURV9OT1RVU0VEOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NoYW5uZWxfbGlua19zdHJlYW0KKyAqCisgKiBERVNDUklQVElPTjogbGluayBhIHN0cmVhbSBmcm9tIGV4dGVybmFsIGNoYW5uZWwgaW50byB0aGlzIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgOiBjaGFubmVsIG9iamVjdAorICogICBAc3RyZWFtX2xpbmsgIDogY2hhbm5lbCBhbmQgc3RyZWFtIHRvIGJlIGxpbmtlZAorICoKKyAqIFJFVFVSTiAgICAgOiB1aW50MzJfdCB0eXBlIG9mIHN0cmVhbSBoYW5kbGUKKyAqICAgICAgICAgICAgICAwICAtLSBpbnZhbGlkIHN0cmVhbSBoYW5kbGUsIG1lYW5pbmcgdGhlIG9wIGZhaWxlZAorICogICAgICAgICAgICAgID4wIC0tIHN1Y2Nlc3NmdWxseSBhZGRlZCBhIHN0cmVhbSB3aXRoIGEgdmFsaWQgaGFuZGxlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQzMl90IG1tX2NoYW5uZWxfbGlua19zdHJlYW0obW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgIG1tX2NhbWVyYV9zdHJlYW1fbGlua190ICpzdHJlYW1fbGluaykKK3sKKyAgICB1aW50OF90IGlkeCA9IDA7CisgICAgdWludDMyX3Qgc19oZGwgPSAwOworICAgIG1tX3N0cmVhbV90ICpzdHJlYW1fb2JqID0gTlVMTDsKKyAgICBtbV9zdHJlYW1fdCAqc3RyZWFtID0gTlVMTDsKKworICAgIGlmIChOVUxMID09IHN0cmVhbV9saW5rKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgc3RyZWFtIGxpbmsiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3RyZWFtID0gbW1fY2hhbm5lbF91dGlsX2dldF9zdHJlYW1fYnlfaGFuZGxlcihzdHJlYW1fbGluay0+Y2gsCisgICAgICAgICAgICBzdHJlYW1fbGluay0+c3RyZWFtX2lkKTsKKyAgICBpZiAoTlVMTCA9PSBzdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogY2hlY2sgYXZhaWxhYmxlIHN0cmVhbSAqLworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFOyBpZHgrKykgeworICAgICAgICBpZiAoTU1fU1RSRUFNX1NUQVRFX05PVFVTRUQgPT0gbXlfb2JqLT5zdHJlYW1zW2lkeF0uc3RhdGUpIHsKKyAgICAgICAgICAgIHN0cmVhbV9vYmogPSAmbXlfb2JqLT5zdHJlYW1zW2lkeF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoTlVMTCA9PSBzdHJlYW1fb2JqKSB7CisgICAgICAgIExPR0UoInN0cmVhbXMgcmVhY2ggbWF4LCBubyBtb3JlIHN0cmVhbSBhbGxvd2VkIHRvIGFkZCIpOworICAgICAgICByZXR1cm4gc19oZGw7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBzdHJlYW0gb2JqZWN0ICovCisgICAgKnN0cmVhbV9vYmogPSAqc3RyZWFtOworICAgIHN0cmVhbV9vYmotPmxpbmtlZF9zdHJlYW0gPSBzdHJlYW07CisgICAgc19oZGwgPSBzdHJlYW0tPm15X2hkbDsKKworICAgIExPR0QoInN0cmVhbSBoYW5kbGUgPSAlZCIsIHNfaGRsKTsKKyAgICByZXR1cm4gc19oZGw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF9hZGRfc3RyZWFtCisgKgorICogREVTQ1JJUFRJT046IGFkZCBhIHN0cmVhbSBpbnRvIHRoZSBjaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjaGFubmVsIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiB1aW50MzJfdCB0eXBlIG9mIHN0cmVhbSBoYW5kbGUKKyAqICAgICAgICAgICAgICAwICAtLSBpbnZhbGlkIHN0cmVhbSBoYW5kbGUsIG1lYW5pbmcgdGhlIG9wIGZhaWxlZAorICogICAgICAgICAgICAgID4wIC0tIHN1Y2Nlc3NmdWxseSBhZGRlZCBhIHN0cmVhbSB3aXRoIGEgdmFsaWQgaGFuZGxlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQzMl90IG1tX2NoYW5uZWxfYWRkX3N0cmVhbShtbV9jaGFubmVsX3QgKm15X29iaikKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICB1aW50OF90IGlkeCA9IDA7CisgICAgdWludDMyX3Qgc19oZGwgPSAwOworICAgIG1tX3N0cmVhbV90ICpzdHJlYW1fb2JqID0gTlVMTDsKKworICAgIExPR0QoIkUiKTsKKyAgICAvKiBjaGVjayBhdmFpbGFibGUgc3RyZWFtICovCisgICAgZm9yIChpZHggPSAwOyBpZHggPCBNQVhfU1RSRUFNX05VTV9JTl9CVU5ETEU7IGlkeCsrKSB7CisgICAgICAgIGlmIChNTV9TVFJFQU1fU1RBVEVfTk9UVVNFRCA9PSBteV9vYmotPnN0cmVhbXNbaWR4XS5zdGF0ZSkgeworICAgICAgICAgICAgc3RyZWFtX29iaiA9ICZteV9vYmotPnN0cmVhbXNbaWR4XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChOVUxMID09IHN0cmVhbV9vYmopIHsKKyAgICAgICAgTE9HRSgic3RyZWFtcyByZWFjaCBtYXgsIG5vIG1vcmUgc3RyZWFtIGFsbG93ZWQgdG8gYWRkIik7CisgICAgICAgIHJldHVybiBzX2hkbDsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIHN0cmVhbSBvYmplY3QgKi8KKyAgICBtZW1zZXQoc3RyZWFtX29iaiwgMCwgc2l6ZW9mKG1tX3N0cmVhbV90KSk7CisgICAgc3RyZWFtX29iai0+ZmQgPSAtMTsKKyAgICBzdHJlYW1fb2JqLT5teV9oZGwgPSBtbV9jYW1lcmFfdXRpbF9nZW5lcmF0ZV9oYW5kbGVyKGlkeCk7CisgICAgc3RyZWFtX29iai0+Y2hfb2JqID0gbXlfb2JqOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmc3RyZWFtX29iai0+YnVmX2xvY2ssIE5VTEwpOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmc3RyZWFtX29iai0+Y2JfbG9jaywgTlVMTCk7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZzdHJlYW1fb2JqLT5jbWRfbG9jaywgTlVMTCk7CisgICAgcHRocmVhZF9jb25kX2luaXQoJnN0cmVhbV9vYmotPmJ1Zl9jb25kLCBOVUxMKTsKKyAgICBtZW1zZXQoc3RyZWFtX29iai0+YnVmX3N0YXR1cywgMCwKKyAgICAgICAgICAgIHNpemVvZihzdHJlYW1fb2JqLT5idWZfc3RhdHVzKSk7CisgICAgc3RyZWFtX29iai0+c3RhdGUgPSBNTV9TVFJFQU1fU1RBVEVfSU5JVEVEOworCisgICAgLyogYWNxdWlyZSBzdHJlYW0gKi8KKyAgICByYyA9IG1tX3N0cmVhbV9mc21fZm4oc3RyZWFtX29iaiwgTU1fU1RSRUFNX0VWVF9BQ1FVSVJFLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoMCA9PSByYykgeworICAgICAgICBzX2hkbCA9IHN0cmVhbV9vYmotPm15X2hkbDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBlcnJvciBkdXJpbmcgYWNxdWlyZSwgZGUtaW5pdCAqLworICAgICAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmc3RyZWFtX29iai0+YnVmX2NvbmQpOworICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnN0cmVhbV9vYmotPmJ1Zl9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZzdHJlYW1fb2JqLT5jYl9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZzdHJlYW1fb2JqLT5jbWRfbG9jayk7CisgICAgICAgIG1lbXNldChzdHJlYW1fb2JqLCAwLCBzaXplb2YobW1fc3RyZWFtX3QpKTsKKyAgICB9CisgICAgTE9HRCgic3RyZWFtIGhhbmRsZSA9ICVkIiwgc19oZGwpOworICAgIHJldHVybiBzX2hkbDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX2RlbF9zdHJlYW0KKyAqCisgKiBERVNDUklQVElPTjogZGVsZXRlIGEgc3RyZWFtIGZyb20gdGhlIGNoYW5uZWwgYnUgaXRzIGhhbmRsZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2hhbm5lbCBvYmplY3QKKyAqICAgQHN0cmVhbV9pZCAgICA6IHN0cmVhbSBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKiBOT1RFICAgICAgIDogYXNzdW1lIHN0ZWFtIGlzIHN0b29wZWQgYmVmb3JlIGl0IGNhbiBiZSBkZWxldGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9kZWxfc3RyZWFtKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkKQoreworICAgIGludCByYyA9IC0xOworICAgIG1tX3N0cmVhbV90ICogc3RyZWFtX29iaiA9IE5VTEw7CisgICAgc3RyZWFtX29iaiA9IG1tX2NoYW5uZWxfdXRpbF9nZXRfc3RyZWFtX2J5X2hhbmRsZXIobXlfb2JqLCBzdHJlYW1faWQpOworCisgICAgaWYgKE5VTEwgPT0gc3RyZWFtX29iaikgeworICAgICAgICBMT0dFKCJJbnZhbGlkIFN0cmVhbSBPYmplY3QgZm9yIHN0cmVhbV9pZCA9ICVkIiwgc3RyZWFtX2lkKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmIChzdHJlYW1fb2JqLT5jaF9vYmogIT0gbXlfb2JqKSB7CisgICAgICAgIC8qIE9ubHkgdW5saW5rIHN0cmVhbSAqLworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnN0cmVhbV9vYmotPmxpbmtlZF9zdHJlYW0tPmJ1Zl9sb2NrKTsKKyAgICAgICAgc3RyZWFtX29iai0+bGlua2VkX3N0cmVhbS0+aXNfbGlua2VkID0gMDsKKyAgICAgICAgc3RyZWFtX29iai0+bGlua2VkX3N0cmVhbS0+bGlua2VkX29iaiA9IE5VTEw7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzdHJlYW1fb2JqLT5saW5rZWRfc3RyZWFtLT5idWZfbG9jayk7CisgICAgICAgIG1lbXNldChzdHJlYW1fb2JqLCAwLCBzaXplb2YobW1fc3RyZWFtX3QpKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByYyA9IG1tX3N0cmVhbV9mc21fZm4oc3RyZWFtX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fU1RSRUFNX0VWVF9SRUxFQVNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX2NvbmZpZ19zdHJlYW0KKyAqCisgKiBERVNDUklQVElPTjogY29uZmlndXJlIGEgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjaGFubmVsIG9iamVjdAorICogICBAc3RyZWFtX2lkICAgIDogc3RyZWFtIGhhbmRsZQorICogICBAY29uZmlnICAgICAgIDogc3RyZWFtIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9jb25maWdfc3RyZWFtKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zdHJlYW1fY29uZmlnX3QgKmNvbmZpZykKK3sKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBtbV9zdHJlYW1fdCAqIHN0cmVhbV9vYmogPSBOVUxMOworICAgIExPR0QoIkUgc3RyZWFtIElEID0gJWQiLCBzdHJlYW1faWQpOworICAgIHN0cmVhbV9vYmogPSBtbV9jaGFubmVsX3V0aWxfZ2V0X3N0cmVhbV9ieV9oYW5kbGVyKG15X29iaiwgc3RyZWFtX2lkKTsKKworICAgIGlmIChOVUxMID09IHN0cmVhbV9vYmopIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBTdHJlYW0gT2JqZWN0IGZvciBzdHJlYW1faWQgPSAlZCIsIHN0cmVhbV9pZCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAoc3RyZWFtX29iai0+Y2hfb2JqICE9IG15X29iaikgeworICAgICAgICAvKiBObyBvcC4gb24gbGlua2VkIHN0cmVhbXMgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogc2V0IHN0cmVhbSBmbXQgKi8KKyAgICByYyA9IG1tX3N0cmVhbV9mc21fZm4oc3RyZWFtX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fU1RSRUFNX0VWVF9TRVRfRk1ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgTE9HRCgiWCByYyA9ICVkIixyYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NoYW5uZWxfZ2V0X2J1bmRsZV9pbmZvCisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IGJ1bmRsZSBpbmZvIG9mIHRoZSBjaGFubmVsLCB3aGljaCBzaG91bGQgaW5jbHVkZSBhbGwKKyAqICAgICAgICAgICAgICBzdHJlYW1zIHdpdGhpbiB0aGlzIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNoYW5uZWwgb2JqZWN0CisgKiAgIEBidW5kbGVfaW5mbyAgOiBidW5kbGUgaW5mbyB0byBiZSBmaWxsZWQgaW4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9nZXRfYnVuZGxlX2luZm8obW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9idW5kbGVfY29uZmlnX3QgKmJ1bmRsZV9pbmZvKQoreworICAgIGludCBpOworICAgIG1tX3N0cmVhbV90ICpzX29iaiA9IE5VTEw7CisgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUgPSBDQU1fU1RSRUFNX1RZUEVfREVGQVVMVDsKKyAgICBpbnQzMl90IHJjID0gMDsKKworICAgIG1lbXNldChidW5kbGVfaW5mbywgMCwgc2l6ZW9mKGNhbV9idW5kbGVfY29uZmlnX3QpKTsKKyAgICBidW5kbGVfaW5mby0+YnVuZGxlX2lkID0gbXlfb2JqLT5teV9oZGw7CisgICAgYnVuZGxlX2luZm8tPm51bV9vZl9zdHJlYW1zID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFOyBpKyspIHsKKyAgICAgICAgaWYgKG15X29iai0+c3RyZWFtc1tpXS5teV9oZGwgPiAwKSB7CisgICAgICAgICAgICBzX29iaiA9IG1tX2NoYW5uZWxfdXRpbF9nZXRfc3RyZWFtX2J5X2hhbmRsZXIobXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X29iai0+c3RyZWFtc1tpXS5teV9oZGwpOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gc19vYmopIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1fdHlwZSA9IHNfb2JqLT5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGU7CisgICAgICAgICAgICAgICAgaWYgKChDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEgIT0gc3RyZWFtX3R5cGUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoc19vYmotPmNoX29iaiA9PSBteV9vYmopKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZV9pbmZvLT5zdHJlYW1faWRzW2J1bmRsZV9pbmZvLT5udW1fb2Zfc3RyZWFtcysrXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRSgiY2Fubm90IGZpbmQgc3RyZWFtIG9iaiAoJWQpIGJ5IGhhbmRsZXIgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgbXlfb2JqLT5zdHJlYW1zW2ldLm15X2hkbCk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgICAvKiBlcnJvciwgcmVzZXQgdG8gMCAqLworICAgICAgICBtZW1zZXQoYnVuZGxlX2luZm8sIDAsIHNpemVvZihjYW1fYnVuZGxlX2NvbmZpZ190KSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3N0YXJ0CisgKgorICogREVTQ1JJUFRJT046IHN0YXJ0IGEgY2hhbm5lbCwgd2hpY2ggd2lsbCBzdGFydCBhbGwgc3RyZWFtcyBpbiB0aGUgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2hhbm5lbCBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9zdGFydChtbV9jaGFubmVsX3QgKm15X29iaikKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBpbnQgaSA9IDAsIGogPSAwOworICAgIG1tX3N0cmVhbV90ICpzX29ianNbTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFXSA9IHtOVUxMfTsKKyAgICB1aW50OF90IG51bV9zdHJlYW1zX3RvX3N0YXJ0ID0gMDsKKyAgICB1aW50OF90IG51bV9zdHJlYW1zX2luX2J1bmRsZV9xdWV1ZSA9IDA7CisgICAgbW1fc3RyZWFtX3QgKnNfb2JqID0gTlVMTDsKKyAgICBpbnQgbWV0YV9zdHJlYW1faWR4ID0gMDsKKyAgICBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSA9IENBTV9TVFJFQU1fVFlQRV9ERUZBVUxUOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9TVFJFQU1fTlVNX0lOX0JVTkRMRTsgaSsrKSB7CisgICAgICAgIGlmIChteV9vYmotPnN0cmVhbXNbaV0ubXlfaGRsID4gMCkgeworICAgICAgICAgICAgc19vYmogPSBtbV9jaGFubmVsX3V0aWxfZ2V0X3N0cmVhbV9ieV9oYW5kbGVyKG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9vYmotPnN0cmVhbXNbaV0ubXlfaGRsKTsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IHNfb2JqKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtX3R5cGUgPSBzX29iai0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlOworICAgICAgICAgICAgICAgIC8qIHJlbWVtYmVyIG1ldGEgZGF0YSBzdHJlYW0gaW5kZXggKi8KKyAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChzX29iai0+Y2hfb2JqID09IG15X29iaikpIHsKKyAgICAgICAgICAgICAgICAgICAgbWV0YV9zdHJlYW1faWR4ID0gbnVtX3N0cmVhbXNfdG9fc3RhcnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNfb2Jqc1tudW1fc3RyZWFtc190b19zdGFydCsrXSA9IHNfb2JqOworCisgICAgICAgICAgICAgICAgaWYgKCFzX29iai0+c3RyZWFtX2luZm8tPm5vRnJhbWVFeHBlY3RlZCkgeworICAgICAgICAgICAgICAgICAgICBudW1fc3RyZWFtc19pbl9idW5kbGVfcXVldWUrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YV9zdHJlYW1faWR4ID4gMCApIHsKKyAgICAgICAgLyogYWx3YXlzIHN0YXJ0IG1ldGEgZGF0YSBzdHJlYW0gZmlyc3QsIHNvIHN3aXRjaCB0aGUgc3RyZWFtIG9iamVjdCB3aXRoIHRoZSBmaXJzdCBvbmUgKi8KKyAgICAgICAgc19vYmogPSBzX29ianNbMF07CisgICAgICAgIHNfb2Jqc1swXSA9IHNfb2Jqc1ttZXRhX3N0cmVhbV9pZHhdOworICAgICAgICBzX29ianNbbWV0YV9zdHJlYW1faWR4XSA9IHNfb2JqOworICAgIH0KKworICAgIGlmIChOVUxMICE9IG15X29iai0+YnVuZGxlLnN1cGVyX2J1Zl9ub3RpZnlfY2IpIHsKKyAgICAgICAgLyogbmVlZCB0byBzZW5kIHVwIGNiLCB0aGVyZWZvcmUgbGF1bmNoIHRocmVhZCAqLworICAgICAgICAvKiBpbml0IHN1cGVyYnVmIHF1ZXVlICovCisgICAgICAgIG1tX2NoYW5uZWxfc3VwZXJidWZfcXVldWVfaW5pdCgmbXlfb2JqLT5idW5kbGUuc3VwZXJidWZfcXVldWUpOworICAgICAgICBteV9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5udW1fc3RyZWFtcyA9IG51bV9zdHJlYW1zX2luX2J1bmRsZV9xdWV1ZTsKKyAgICAgICAgbXlfb2JqLT5idW5kbGUuc3VwZXJidWZfcXVldWUuZXhwZWN0ZWRfZnJhbWVfaWQgPQorICAgICAgICAgICAgICAgIG15X29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLmF0dHIudXNlcl9leHBlY3RlZF9mcmFtZV9pZDsKKyAgICAgICAgbXlfb2JqLT5idW5kbGUuc3VwZXJidWZfcXVldWUuZXhwZWN0ZWRfZnJhbWVfaWRfd2l0aG91dF9sZWQgPSAwOworICAgICAgICBteV9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5sZWRfb2ZmX3N0YXJ0X2ZyYW1lX2lkID0gMDsKKyAgICAgICAgbXlfb2JqLT5idW5kbGUuc3VwZXJidWZfcXVldWUubGVkX29uX3N0YXJ0X2ZyYW1lX2lkID0gMDsKKyAgICAgICAgbXlfb2JqLT5idW5kbGUuc3VwZXJidWZfcXVldWUubGVkX29uX251bV9mcmFtZXMgPSAwOworICAgICAgICBteV9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5nb29kX2ZyYW1lX2lkID0gMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N0cmVhbXNfdG9fc3RhcnQ7IGkrKykgeworICAgICAgICAgICAgLyogT25seSBidW5kbGUgc3RyZWFtcyB0aGF0IGJlbG9uZyB0byB0aGUgY2hhbm5lbCAqLworICAgICAgICAgICAgaWYoIShzX29ianNbaV0tPnN0cmVhbV9pbmZvLT5ub0ZyYW1lRXhwZWN0ZWQpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNfb2Jqc1tpXS0+Y2hfb2JqID09IG15X29iaikgeworICAgICAgICAgICAgICAgICAgICAvKiBzZXQgYnVuZGxlZCBmbGFnIHRvIHN0cmVhbXMgKi8KKyAgICAgICAgICAgICAgICAgICAgc19vYmpzW2ldLT5pc19idW5kbGVkID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXlfb2JqLT5idW5kbGUuc3VwZXJidWZfcXVldWUuYnVuZGxlZF9zdHJlYW1zW2orK10gPSBzX29ianNbaV0tPm15X2hkbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGxhdW5jaCBjYiB0aHJlYWQgZm9yIGRpc3BhdGNoaW5nIHN1cGVyIGJ1ZiB0aHJvdWdoIGNiICovCisgICAgICAgIHNucHJpbnRmKG15X29iai0+Y2JfdGhyZWFkLnRocmVhZE5hbWUsIFRIUkVBRF9OQU1FX1NJWkUsICJDQU1fU3VwZXJCdWYiKTsKKyAgICAgICAgbW1fY2FtZXJhX2NtZF90aHJlYWRfbGF1bmNoKCZteV9vYmotPmNiX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfZGlzcGF0Y2hfc3VwZXJfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW15X29iaik7CisKKyAgICAgICAgLyogbGF1bmNoIGNtZCB0aHJlYWQgZm9yIHN1cGVyIGJ1ZiBkYXRhQ0IgKi8KKyAgICAgICAgc25wcmludGYobXlfb2JqLT5jbWRfdGhyZWFkLnRocmVhZE5hbWUsIFRIUkVBRF9OQU1FX1NJWkUsICJDQU1fU3VwZXJCdWZDQiIpOworICAgICAgICBtbV9jYW1lcmFfY21kX3RocmVhZF9sYXVuY2goJm15X29iai0+Y21kX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfcHJvY2Vzc19zdHJlYW1fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW15X29iaik7CisKKyAgICAgICAgLyogc2V0IGZsYWcgdG8gVFJVRSAqLworICAgICAgICBteV9vYmotPmJ1bmRsZS5pc19hY3RpdmUgPSBUUlVFOworICAgIH0KKworICAgIC8qIGxpbmsgYW55IHN0cmVhbXMgZmlyc3QgYmVmb3JlIHN0YXJ0aW5nIHRoZSByZXN0IG9mIHRoZSBzdHJlYW1zICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9zdHJlYW1zX3RvX3N0YXJ0OyBpKyspIHsKKyAgICAgICAgaWYgKHNfb2Jqc1tpXS0+Y2hfb2JqICE9IG15X29iaikgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzX29ianNbaV0tPmxpbmtlZF9zdHJlYW0tPmJ1Zl9sb2NrKTsKKyAgICAgICAgICAgIHNfb2Jqc1tpXS0+bGlua2VkX3N0cmVhbS0+bGlua2VkX29iaiA9IG15X29iajsKKyAgICAgICAgICAgIHNfb2Jqc1tpXS0+bGlua2VkX3N0cmVhbS0+aXNfbGlua2VkID0gMTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzX29ianNbaV0tPmxpbmtlZF9zdHJlYW0tPmJ1Zl9sb2NrKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9zdHJlYW1zX3RvX3N0YXJ0OyBpKyspIHsKKyAgICAgICAgaWYgKHNfb2Jqc1tpXS0+Y2hfb2JqICE9IG15X29iaikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLyogYWxsIHN0cmVhbXMgd2l0aGluIGEgY2hhbm5lbCBzaG91bGQgYmUgc3RhcnRlZCBhdCB0aGUgc2FtZSB0aW1lICovCisgICAgICAgIGlmIChzX29ianNbaV0tPnN0YXRlID09IE1NX1NUUkVBTV9TVEFURV9BQ1RJVkUpIHsKKyAgICAgICAgICAgIExPR0UoInN0cmVhbSBhbHJlYWR5IHN0YXJ0ZWQgaWR4KCVkKSIsIGkpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogYWxsb2NhdGUgYnVmICovCisgICAgICAgIHJjID0gbW1fc3RyZWFtX2ZzbV9mbihzX29ianNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9TVFJFQU1fRVZUX0dFVF9CVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGlmICgwICE9IHJjKSB7CisgICAgICAgICAgICBMT0dFKCJnZXQgYnVmIGZhaWxlZCBhdCBpZHgoJWQpIiwgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlZyBidWYgKi8KKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fZnNtX2ZuKHNfb2Jqc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX1NUUkVBTV9FVlRfUkVHX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgaWYgKDAgIT0gcmMpIHsKKyAgICAgICAgICAgIExPR0UoInJlZyBidWYgZmFpbGVkIGF0IGlkeCglZCkiLCBpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogc3RhcnQgc3RyZWFtICovCisgICAgICAgIHJjID0gbW1fc3RyZWFtX2ZzbV9mbihzX29ianNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9TVFJFQU1fRVZUX1NUQVJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBpZiAoMCAhPSByYykgeworICAgICAgICAgICAgTE9HRSgic3RhcnQgc3RyZWFtIGZhaWxlZCBhdCBpZHgoJWQpIiwgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaWYgKDAgIT0gcmMpIHsKKyAgICAgICAgLyogdW5saW5rIHRoZSBzdHJlYW1zIGZpcnN0ICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fc3RyZWFtc190b19zdGFydDsgaisrKSB7CisgICAgICAgICAgICBpZiAoc19vYmpzW2pdLT5jaF9vYmogIT0gbXlfb2JqKSB7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzX29ianNbal0tPmxpbmtlZF9zdHJlYW0tPmJ1Zl9sb2NrKTsKKyAgICAgICAgICAgICAgICBzX29ianNbal0tPmxpbmtlZF9zdHJlYW0tPmlzX2xpbmtlZCA9IDA7CisgICAgICAgICAgICAgICAgc19vYmpzW2pdLT5saW5rZWRfc3RyZWFtLT5saW5rZWRfb2JqID0gTlVMTDsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmc19vYmpzW2pdLT5saW5rZWRfc3RyZWFtLT5idWZfbG9jayk7CisKKyAgICAgICAgICAgICAgICBpZiAoVFJVRSA9PSBteV9vYmotPmJ1bmRsZS5pc19hY3RpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF9mbHVzaF9zdXBlcl9idWZfcXVldWUobXlfb2JqLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNfb2Jqc1tpXS0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWVtc2V0KHNfb2Jqc1tqXSwgMCwgc2l6ZW9mKG1tX3N0cmVhbV90KSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDw9IGk7IGorKykgeworICAgICAgICAgICAgaWYgKChOVUxMID09IHNfb2Jqc1tqXSkgfHwgKHNfb2Jqc1tqXS0+Y2hfb2JqICE9IG15X29iaikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHN0b3Agc3RyZWFtcyovCisgICAgICAgICAgICBtbV9zdHJlYW1fZnNtX2ZuKHNfb2Jqc1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fU1RSRUFNX0VWVF9TVE9QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAgICAgLyogdW5yZWcgYnVmICovCisgICAgICAgICAgICBtbV9zdHJlYW1fZnNtX2ZuKHNfb2Jqc1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fU1RSRUFNX0VWVF9VTlJFR19CVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCisgICAgICAgICAgICAvKiBwdXQgYnVmIGJhY2sgKi8KKyAgICAgICAgICAgIG1tX3N0cmVhbV9mc21fZm4oc19vYmpzW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9TVFJFQU1fRVZUX1BVVF9CVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgLyogZGVzdHJveSBzdXBlciBidWYgY21kIHRocmVhZCAqLworICAgICAgICBpZiAoVFJVRSA9PSBteV9vYmotPmJ1bmRsZS5pc19hY3RpdmUpIHsKKyAgICAgICAgICAgIC8qIGZpcnN0IHN0b3AgYnVuZGxlIHRocmVhZCAqLworICAgICAgICAgICAgbW1fY2FtZXJhX2NtZF90aHJlYWRfcmVsZWFzZSgmbXlfb2JqLT5jbWRfdGhyZWFkKTsKKyAgICAgICAgICAgIG1tX2NhbWVyYV9jbWRfdGhyZWFkX3JlbGVhc2UoJm15X29iai0+Y2JfdGhyZWFkKTsKKworICAgICAgICAgICAgLyogZGVpbml0IHN1cGVyYnVmIHF1ZXVlICovCisgICAgICAgICAgICBtbV9jaGFubmVsX3N1cGVyYnVmX3F1ZXVlX2RlaW5pdCgmbXlfb2JqLT5idW5kbGUuc3VwZXJidWZfcXVldWUpOworCisgICAgICAgICAgICAvKiBtZW1zZXQgc3VwZXIgYnVmZmVyIHF1ZXVlIGluZm8gKi8KKyAgICAgICAgICAgIG15X29iai0+YnVuZGxlLmlzX2FjdGl2ZSA9IDA7CisgICAgICAgICAgICBtZW1zZXQoJm15X29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLCAwLCBzaXplb2YobW1fY2hhbm5lbF9xdWV1ZV90KSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbXlfb2JqLT5iV2FpdEZvclByZXBTbmFwc2hvdERvbmUgPSAwOworICAgIGlmIChteV9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5hdHRyLmVuYWJsZV9mcmFtZV9zeW5jKSB7CisgICAgICAgIExPR0goInJlZ2lzdGVyaW5nIENoYW5uZWwgb2JqICVwIiwgbXlfb2JqKTsKKyAgICAgICAgbW1fZnJhbWVfc3luY19yZWdpc3Rlcl9jaGFubmVsKG15X29iaik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3N0b3AKKyAqCisgKiBERVNDUklQVElPTjogc3RvcCBhIGNoYW5uZWwsIHdoaWNoIHdpbGwgc3RvcCBhbGwgc3RyZWFtcyBpbiB0aGUgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2hhbm5lbCBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9zdG9wKG1tX2NoYW5uZWxfdCAqbXlfb2JqKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIGludCBpOworICAgIG1tX3N0cmVhbV90ICpzX29ianNbTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFXSA9IHtOVUxMfTsKKyAgICB1aW50OF90IG51bV9zdHJlYW1zX3RvX3N0b3AgPSAwOworICAgIG1tX3N0cmVhbV90ICpzX29iaiA9IE5VTEw7CisgICAgaW50IG1ldGFfc3RyZWFtX2lkeCA9IDA7CisgICAgY2FtX3N0cmVhbV90eXBlX3Qgc3RyZWFtX3R5cGUgPSBDQU1fU1RSRUFNX1RZUEVfREVGQVVMVDsKKworICAgIGlmIChteV9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5hdHRyLmVuYWJsZV9mcmFtZV9zeW5jKSB7CisgICAgICAgIG1tX2ZyYW1lX3N5bmNfdW5yZWdpc3Rlcl9jaGFubmVsKG15X29iaik7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9TVFJFQU1fTlVNX0lOX0JVTkRMRTsgaSsrKSB7CisgICAgICAgIGlmIChteV9vYmotPnN0cmVhbXNbaV0ubXlfaGRsID4gMCkgeworICAgICAgICAgICAgc19vYmogPSBtbV9jaGFubmVsX3V0aWxfZ2V0X3N0cmVhbV9ieV9oYW5kbGVyKG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9vYmotPnN0cmVhbXNbaV0ubXlfaGRsKTsKKyAgICAgICAgICAgIGlmIChOVUxMICE9IHNfb2JqKSB7CisgICAgICAgICAgICAgICAgaWYgKHNfb2JqLT5jaF9vYmogPT0gbXlfb2JqKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbV90eXBlID0gc19vYmotPnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVtZW1iZXIgbWV0YSBkYXRhIHN0cmVhbSBpbmRleCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhX3N0cmVhbV9pZHggPSBudW1fc3RyZWFtc190b19zdG9wOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNfb2Jqc1tudW1fc3RyZWFtc190b19zdG9wKytdID0gc19vYmo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YV9zdHJlYW1faWR4IDwgbnVtX3N0cmVhbXNfdG9fc3RvcCAtIDEgKSB7CisgICAgICAgIC8qIGFsd2F5cyBzdG9wIG1ldGEgZGF0YSBzdHJlYW0gbGFzdCwgc28gc3dpdGNoIHRoZSBzdHJlYW0gb2JqZWN0IHdpdGggdGhlIGxhc3Qgb25lICovCisgICAgICAgIHNfb2JqID0gc19vYmpzW251bV9zdHJlYW1zX3RvX3N0b3AgLSAxXTsKKyAgICAgICAgc19vYmpzW251bV9zdHJlYW1zX3RvX3N0b3AgLSAxXSA9IHNfb2Jqc1ttZXRhX3N0cmVhbV9pZHhdOworICAgICAgICBzX29ianNbbWV0YV9zdHJlYW1faWR4XSA9IHNfb2JqOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3RyZWFtc190b19zdG9wOyBpKyspIHsKKyAgICAgICAgLyogc3RyZWFtIHRoYXQgYXJlIGxpbmtlZCB0byB0aGlzIGNoYW5uZWwgc2hvdWxkIG5vdCBiZSBzdG9wcGVkICovCisgICAgICAgIGlmIChzX29ianNbaV0tPmNoX29iaiAhPSBteV9vYmopIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogc3RyZWFtIG9mZiAqLworICAgICAgICBtbV9zdHJlYW1fZnNtX2ZuKHNfb2Jqc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNTV9TVFJFQU1fRVZUX1NUT1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKworICAgICAgICAvKiB1bnJlZyBidWYgYXQga2VybmVsICovCisgICAgICAgIG1tX3N0cmVhbV9mc21fZm4oc19vYmpzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1NX1NUUkVBTV9FVlRfVU5SRUdfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9zdHJlYW1zX3RvX3N0b3A7IGkrKykgeworICAgICAgICBpZiAoc19vYmpzW2ldLT5jaF9vYmogIT0gbXlfb2JqKSB7CisgICAgICAgICAgICAvKiBPbmx5IHVubGluayBzdHJlYW0gKi8KKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmc19vYmpzW2ldLT5saW5rZWRfc3RyZWFtLT5idWZfbG9jayk7CisgICAgICAgICAgICBzX29ianNbaV0tPmxpbmtlZF9zdHJlYW0tPmlzX2xpbmtlZCA9IDA7CisgICAgICAgICAgICBzX29ianNbaV0tPmxpbmtlZF9zdHJlYW0tPmxpbmtlZF9vYmogPSBOVUxMOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnNfb2Jqc1tpXS0+bGlua2VkX3N0cmVhbS0+YnVmX2xvY2spOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZGVzdHJveSBzdXBlciBidWYgY21kIHRocmVhZCAqLworICAgIGlmIChUUlVFID09IG15X29iai0+YnVuZGxlLmlzX2FjdGl2ZSkgeworICAgICAgICBtbV9jaGFubmVsX2ZsdXNoX3N1cGVyX2J1Zl9xdWV1ZShteV9vYmosIDAsIENBTV9TVFJFQU1fVFlQRV9ERUZBVUxUKTsKKyAgICAgICAgLyogZmlyc3Qgc3RvcCBidW5kbGUgdGhyZWFkICovCisgICAgICAgIG1tX2NhbWVyYV9jbWRfdGhyZWFkX3JlbGVhc2UoJm15X29iai0+Y21kX3RocmVhZCk7CisgICAgICAgIG1tX2NhbWVyYV9jbWRfdGhyZWFkX3JlbGVhc2UoJm15X29iai0+Y2JfdGhyZWFkKTsKKworICAgICAgICAvKiBkZWluaXQgc3VwZXJidWYgcXVldWUgKi8KKyAgICAgICAgbW1fY2hhbm5lbF9zdXBlcmJ1Zl9xdWV1ZV9kZWluaXQoJm15X29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlKTsKKworICAgICAgICAvKiByZXNldCBmZXcgZmllbGRzIGluIHRoZSBidW5kbGUgaW5mbyAqLworICAgICAgICBteV9vYmotPmJ1bmRsZS5pc19hY3RpdmUgPSAwOworICAgICAgICBteV9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5leHBlY3RlZF9mcmFtZV9pZCA9IDA7CisgICAgICAgIG15X29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLmdvb2RfZnJhbWVfaWQgPSAwOworICAgICAgICBteV9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5tYXRjaF9jbnQgPSAwOworICAgIH0KKworICAgIC8qIHNpbmNlIGFsbCBzdHJlYW1zIGFyZSBzdG9wcGVkLCB3ZSBhcmUgc2FmZSB0bworICAgICAqIHJlbGVhc2UgYWxsIGJ1ZmZlcnMgYWxsb2NhdGVkIGluIHN0cmVhbSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3RyZWFtc190b19zdG9wOyBpKyspIHsKKyAgICAgICAgaWYgKHNfb2Jqc1tpXS0+Y2hfb2JqICE9IG15X29iaikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLyogcHV0IGJ1ZiBiYWNrICovCisgICAgICAgIG1tX3N0cmVhbV9mc21fZm4oc19vYmpzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1NX1NUUkVBTV9FVlRfUFVUX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3RyZWFtc190b19zdG9wOyBpKyspIHsKKyAgICAgICAgaWYgKHNfb2Jqc1tpXS0+Y2hfb2JqICE9IG15X29iaikgeworICAgICAgICAgICAgbWVtc2V0KHNfb2Jqc1tpXSwgMCwgc2l6ZW9mKG1tX3N0cmVhbV90KSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3JlcXVlc3Rfc3VwZXJfYnVmCisgKgorICogREVTQ1JJUFRJT046IGZvciBidXJzdCBtb2RlIGluIGJ1bmRsZSwgcmV1cWVzdCBjZXJ0YWluIGFtb3VudCBvZiBtYXRjaGVkCisgKiAgICAgICAgICAgICAgZnJhbWVzIGZyb20gc3VwZXJidWYgcXVldWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNoYW5uZWwgb2JqZWN0CisgKiAgIEBudW1fYnVmX3JlcXVlc3RlZCA6IG51bWJlciBvZiBtYXRjaGVkIGZyYW1lcyBuZWVkZWQKKyAqICAgQG51bV9yZXRyb19idWZfcmVxdWVzdGVkIDogbnVtYmVyIG9mIHJldHJvIGZyYW1lcyBuZWVkZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9yZXF1ZXN0X3N1cGVyX2J1ZihtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgbW1fY2FtZXJhX3JlcV9idWZfdCAqYnVmKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIG1tX2NhbWVyYV9jbWRjYl90KiBub2RlID0gTlVMTDsKKworICAgIGlmKCFidWYpIHsKKyAgICAgICAgTE9HRSgiUmVxdWVzdCBpbmZvIGJ1ZiBpcyBOVUxMIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBzZXQgcGVuZGluZ19jbnQKKyAgICAgKiB3aWxsIHRyaWdnZXIgZGlzcGF0Y2hpbmcgc3VwZXIgZnJhbWVzIGlmIHBlbmRpbmdfY250ID4gMCAqLworICAgIC8qIHNlbmQgY2FtX3NlbV9wb3N0IHRvIHdha2UgdXAgY21kIHRocmVhZCB0byBkaXNwYXRjaCBzdXBlciBidWZmZXIgKi8KKyAgICBub2RlID0gKG1tX2NhbWVyYV9jbWRjYl90ICopbWFsbG9jKHNpemVvZihtbV9jYW1lcmFfY21kY2JfdCkpOworICAgIGlmIChOVUxMICE9IG5vZGUpIHsKKyAgICAgICAgbWVtc2V0KG5vZGUsIDAsIHNpemVvZihtbV9jYW1lcmFfY21kY2JfdCkpOworICAgICAgICBub2RlLT5jbWRfdHlwZSA9IE1NX0NBTUVSQV9DTURfVFlQRV9SRVFfREFUQV9DQjsKKyAgICAgICAgbm9kZS0+dS5yZXFfYnVmID0gKmJ1ZjsKKworICAgICAgICAvKiBlbnF1ZXVlIHRvIGNtZCB0aHJlYWQgKi8KKyAgICAgICAgY2FtX3F1ZXVlX2VucSgmKG15X29iai0+Y21kX3RocmVhZC5jbWRfcXVldWUpLCBub2RlKTsKKworICAgICAgICAvKiB3YWtlIHVwIGNtZCB0aHJlYWQgKi8KKyAgICAgICAgY2FtX3NlbV9wb3N0KCYobXlfb2JqLT5jbWRfdGhyZWFkLmNtZF9zZW0pKTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIG1tX2NhbWVyYV9ub2RlX3QiKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF9jYW5jZWxfc3VwZXJfYnVmX3JlcXVlc3QKKyAqCisgKiBERVNDUklQVElPTjogZm9yIGJ1cnN0IG1vZGUgaW4gYnVuZGxlLCBjYW5jZWwgdGhlIHJldXFlc3QgZm9yIGNlcnRhaW4gYW1vdW50CisgKiAgICAgICAgICAgICAgb2YgbWF0Y2hlZCBmcmFtZXMgZnJvbSBzdXBlcmJ1ZiBxdWV1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2hhbm5lbCBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9jYW5jZWxfc3VwZXJfYnVmX3JlcXVlc3QobW1fY2hhbm5lbF90ICpteV9vYmopCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgLyogcmVzZXQgcGVuZGluZ19jbnQgKi8KKyAgICBtbV9jYW1lcmFfcmVxX2J1Zl90IGJ1ZjsKKyAgICBtZW1zZXQoJmJ1ZiwgMHgwLCBzaXplb2YoYnVmKSk7CisgICAgYnVmLnR5cGUgPSBNTV9DQU1FUkFfUkVRX1NVUEVSX0JVRjsKKyAgICBidWYubnVtX2J1Zl9yZXF1ZXN0ZWQgPSAwOworICAgIHJjID0gbW1fY2hhbm5lbF9yZXF1ZXN0X3N1cGVyX2J1ZihteV9vYmosICZidWYpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX2ZsdXNoX3N1cGVyX2J1Zl9xdWV1ZQorICoKKyAqIERFU0NSSVBUSU9OOiBmbHVzaCBzdXBlcmJ1ZiBxdWV1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICA6IGNoYW5uZWwgb2JqZWN0CisgKiAgIEBmcmFtZV9pZHggOiBmcmFtZSBpZHggdW50aWwgd2hpY2ggdG8gZmx1c2ggYWxsIHN1cGVyYnVmcworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jaGFubmVsX2ZsdXNoX3N1cGVyX2J1Zl9xdWV1ZShtbV9jaGFubmVsX3QgKm15X29iaiwgdWludDMyX3QgZnJhbWVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX3R5cGVfdCBzdHJlYW1fdHlwZSkKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBtbV9jYW1lcmFfY21kY2JfdCogbm9kZSA9IE5VTEw7CisKKyAgICBub2RlID0gKG1tX2NhbWVyYV9jbWRjYl90ICopbWFsbG9jKHNpemVvZihtbV9jYW1lcmFfY21kY2JfdCkpOworICAgIGlmIChOVUxMICE9IG5vZGUpIHsKKyAgICAgICAgbWVtc2V0KG5vZGUsIDAsIHNpemVvZihtbV9jYW1lcmFfY21kY2JfdCkpOworICAgICAgICBub2RlLT5jbWRfdHlwZSA9IE1NX0NBTUVSQV9DTURfVFlQRV9GTFVTSF9RVUVVRTsKKyAgICAgICAgbm9kZS0+dS5mbHVzaF9jbWQuZnJhbWVfaWR4ID0gZnJhbWVfaWR4OworICAgICAgICBub2RlLT51LmZsdXNoX2NtZC5zdHJlYW1fdHlwZSA9IHN0cmVhbV90eXBlOworCisgICAgICAgIC8qIGVucXVldWUgdG8gY21kIHRocmVhZCAqLworICAgICAgICBjYW1fcXVldWVfZW5xKCYobXlfb2JqLT5jbWRfdGhyZWFkLmNtZF9xdWV1ZSksIG5vZGUpOworCisgICAgICAgIC8qIHdha2UgdXAgY21kIHRocmVhZCAqLworICAgICAgICBjYW1fc2VtX3Bvc3QoJihteV9vYmotPmNtZF90aHJlYWQuY21kX3NlbSkpOworCisgICAgICAgIC8qIHdhaXQgZm9yIGFjayBmcm9tIGNtZCB0aHJlYWQgKi8KKyAgICAgICAgY2FtX3NlbV93YWl0KCYobXlfb2JqLT5jbWRfdGhyZWFkLnN5bmNfc2VtKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBtbV9jYW1lcmFfbm9kZV90Iik7CisgICAgICAgIHJjID0gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NoYW5uZWxfY29uZmlnX25vdGlmeV9tb2RlCisgKgorICogREVTQ1JJUFRJT046IGNvbmZpZ3VyZSBub3RpZmljYXRpb24gbW9kZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICA6IGNoYW5uZWwgb2JqZWN0CisgKiAgIEBub3RpZnlfbW9kZSA6IG5vdGlmaWNhdGlvbiBtb2RlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NoYW5uZWxfY29uZmlnX25vdGlmeV9tb2RlKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX25vdGlmeV9tb2RlX3Qgbm90aWZ5X21vZGUpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgbW1fY2FtZXJhX2NtZGNiX3QqIG5vZGUgPSBOVUxMOworCisgICAgbm9kZSA9IChtbV9jYW1lcmFfY21kY2JfdCAqKW1hbGxvYyhzaXplb2YobW1fY2FtZXJhX2NtZGNiX3QpKTsKKyAgICBpZiAoTlVMTCAhPSBub2RlKSB7CisgICAgICAgIG1lbXNldChub2RlLCAwLCBzaXplb2YobW1fY2FtZXJhX2NtZGNiX3QpKTsKKyAgICAgICAgbm9kZS0+dS5ub3RpZnlfbW9kZSA9IG5vdGlmeV9tb2RlOworICAgICAgICBub2RlLT5jbWRfdHlwZSA9IE1NX0NBTUVSQV9DTURfVFlQRV9DT05GSUdfTk9USUZZOworCisgICAgICAgIC8qIGVucXVldWUgdG8gY21kIHRocmVhZCAqLworICAgICAgICBjYW1fcXVldWVfZW5xKCYobXlfb2JqLT5jbWRfdGhyZWFkLmNtZF9xdWV1ZSksIG5vZGUpOworCisgICAgICAgIC8qIHdha2UgdXAgY21kIHRocmVhZCAqLworICAgICAgICBjYW1fc2VtX3Bvc3QoJihteV9vYmotPmNtZF90aHJlYWQuY21kX3NlbSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgbW1fY2FtZXJhX25vZGVfdCIpOworICAgICAgICByYyA9IC0xOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3N0YXJ0X3pzbF9zbmFwc2hvdAorICoKKyAqIERFU0NSSVBUSU9OOiBzdGFydCB6c2wgc25hcHNob3QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgOiBjaGFubmVsIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jaGFubmVsX3N0YXJ0X3pzbF9zbmFwc2hvdChtbV9jaGFubmVsX3QgKm15X29iaikKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBtbV9jYW1lcmFfY21kY2JfdCogbm9kZSA9IE5VTEw7CisKKyAgICBub2RlID0gKG1tX2NhbWVyYV9jbWRjYl90ICopbWFsbG9jKHNpemVvZihtbV9jYW1lcmFfY21kY2JfdCkpOworICAgIGlmIChOVUxMICE9IG5vZGUpIHsKKyAgICAgICAgbWVtc2V0KG5vZGUsIDAsIHNpemVvZihtbV9jYW1lcmFfY21kY2JfdCkpOworICAgICAgICBub2RlLT5jbWRfdHlwZSA9IE1NX0NBTUVSQV9DTURfVFlQRV9TVEFSVF9aU0w7CisKKyAgICAgICAgLyogZW5xdWV1ZSB0byBjbWQgdGhyZWFkICovCisgICAgICAgIGNhbV9xdWV1ZV9lbnEoJihteV9vYmotPmNtZF90aHJlYWQuY21kX3F1ZXVlKSwgbm9kZSk7CisKKyAgICAgICAgLyogd2FrZSB1cCBjbWQgdGhyZWFkICovCisgICAgICAgIGNhbV9zZW1fcG9zdCgmKG15X29iai0+Y21kX3RocmVhZC5jbWRfc2VtKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBtbV9jYW1lcmFfbm9kZV90Iik7CisgICAgICAgIHJjID0gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NoYW5uZWxfc3RvcF96c2xfc25hcHNob3QKKyAqCisgKiBERVNDUklQVElPTjogc3RvcCB6c2wgc25hcHNob3QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgOiBjaGFubmVsIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jaGFubmVsX3N0b3BfenNsX3NuYXBzaG90KG1tX2NoYW5uZWxfdCAqbXlfb2JqKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIG1tX2NhbWVyYV9jbWRjYl90KiBub2RlID0gTlVMTDsKKworICAgIG5vZGUgPSAobW1fY2FtZXJhX2NtZGNiX3QgKiltYWxsb2Moc2l6ZW9mKG1tX2NhbWVyYV9jbWRjYl90KSk7CisgICAgaWYgKE5VTEwgIT0gbm9kZSkgeworICAgICAgICBtZW1zZXQobm9kZSwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9jbWRjYl90KSk7CisgICAgICAgIG5vZGUtPmNtZF90eXBlID0gTU1fQ0FNRVJBX0NNRF9UWVBFX1NUT1BfWlNMOworCisgICAgICAgIC8qIGVucXVldWUgdG8gY21kIHRocmVhZCAqLworICAgICAgICBjYW1fcXVldWVfZW5xKCYobXlfb2JqLT5jbWRfdGhyZWFkLmNtZF9xdWV1ZSksIG5vZGUpOworCisgICAgICAgIC8qIHdha2UgdXAgY21kIHRocmVhZCAqLworICAgICAgICBjYW1fc2VtX3Bvc3QoJihteV9vYmotPmNtZF90aHJlYWQuY21kX3NlbSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgbW1fY2FtZXJhX25vZGVfdCIpOworICAgICAgICByYyA9IC0xOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3FidWYKKyAqCisgKiBERVNDUklQVElPTjogZW5xdWV1ZSBidWZmZXIgYmFjayB0byBrZXJuZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNoYW5uZWwgb2JqZWN0CisgKiAgIEBidWYgICAgICAgICAgOiBidWYgcHRyIHRvIGJlIGVucXVldWVkCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NoYW5uZWxfcWJ1ZihtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmJ1ZikKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fc3RyZWFtX3QqIHNfb2JqID0gbW1fY2hhbm5lbF91dGlsX2dldF9zdHJlYW1fYnlfaGFuZGxlcihteV9vYmosIGJ1Zi0+c3RyZWFtX2lkKTsKKworICAgIGlmIChOVUxMICE9IHNfb2JqKSB7CisgICAgICAgIGlmIChzX29iai0+Y2hfb2JqICE9IG15X29iaikgeworICAgICAgICAgICAgLyogUmVkaXJlY3QgdG8gbGlua2VkIHN0cmVhbSAqLworICAgICAgICAgICAgcmMgPSBtbV9zdHJlYW1fZnNtX2ZuKHNfb2JqLT5saW5rZWRfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICBNTV9TVFJFQU1fRVZUX1FCVUYsCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopYnVmLAorICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJjID0gbW1fc3RyZWFtX2ZzbV9mbihzX29iaiwKKyAgICAgICAgICAgICAgICAgICAgTU1fU1RSRUFNX0VWVF9RQlVGLAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF9nZXRfcXVldWVkX2J1Zl9jb3VudAorICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm4gcXVldWVkIGJ1ZmZlciBjb3VudAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2hhbm5lbCBvYmplY3QKKyAqICAgQHN0cmVhbV9pZCAgICA6IHN0ZWFtX2lkCisgKgorICogUkVUVVJOICAgICA6IHF1ZXVlZCBidWZmZXIgY291bnQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jaGFubmVsX2dldF9xdWV1ZWRfYnVmX2NvdW50KG1tX2NoYW5uZWxfdCAqbXlfb2JqLCB1aW50MzJfdCBzdHJlYW1faWQpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX3N0cmVhbV90KiBzX29iaiA9IG1tX2NoYW5uZWxfdXRpbF9nZXRfc3RyZWFtX2J5X2hhbmRsZXIobXlfb2JqLCBzdHJlYW1faWQpOworCisgICAgaWYgKE5VTEwgIT0gc19vYmopIHsKKyAgICAgICAgaWYgKHNfb2JqLT5jaF9vYmogIT0gbXlfb2JqKSB7CisgICAgICAgICAgICAvKiBSZWRpcmVjdCB0byBsaW5rZWQgc3RyZWFtICovCisgICAgICAgICAgICByYyA9IG1tX3N0cmVhbV9mc21fZm4oc19vYmotPmxpbmtlZF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIE1NX1NUUkVBTV9FVlRfR0VUX1FVRVVFRF9CVUZfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmMgPSBtbV9zdHJlYW1fZnNtX2ZuKHNfb2JqLAorICAgICAgICAgICAgICAgICAgICBNTV9TVFJFQU1fRVZUX0dFVF9RVUVVRURfQlVGX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3NldF9zdHJlYW1fcGFybXMKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHBhcmFtZXRlcnMgcGVyIHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2hhbm5lbCBvYmplY3QKKyAqICAgQHNfaWQgICAgICAgICA6IHN0cmVhbSBoYW5kbGUKKyAqICAgQHBhcm1zICAgICAgICA6IHB0ciB0byBhIHBhcmFtIHN0cnVjdCB0byBiZSBzZXQgdG8gc2VydmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICogTk9URSAgICAgICA6IEFzc3VtZSB0aGUgcGFybXMgc3RydWN0IGJ1ZiBpcyBhbHJlYWR5IG1hcHBlZCB0byBzZXJ2ZXIgdmlhCisgKiAgICAgICAgICAgICAgZG9tYWluIHNvY2tldC4gQ29ycmVzcG9uZGluZyBmaWVsZHMgb2YgcGFyYW1ldGVycyB0byBiZSBzZXQKKyAqICAgICAgICAgICAgICBhcmUgYWxyZWFkeSBmaWxsZWQgaW4gYnkgdXBwZXIgbGF5ZXIgY2FsbGVyLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NoYW5uZWxfc2V0X3N0cmVhbV9wYXJtKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9ldnRfcGF5bG9kX3NldF9nZXRfc3RyZWFtX3Bhcm1zX3QgKnBheWxvYWQpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX3N0cmVhbV90KiBzX29iaiA9IG1tX2NoYW5uZWxfdXRpbF9nZXRfc3RyZWFtX2J5X2hhbmRsZXIobXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC0+c3RyZWFtX2lkKTsKKyAgICBpZiAoTlVMTCAhPSBzX29iaikgeworICAgICAgICBpZiAoc19vYmotPmNoX29iaiAhPSBteV9vYmopIHsKKyAgICAgICAgICAgIC8qIE5vIG9wLiBvbiBsaW5rZWQgc3RyZWFtcyAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICByYyA9IG1tX3N0cmVhbV9mc21fZm4oc19vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9TVFJFQU1fRVZUX1NFVF9QQVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilwYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NoYW5uZWxfZ2V0X3N0cmVhbV9wYXJtcworICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgcGFyYW1ldGVycyBwZXIgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjaGFubmVsIG9iamVjdAorICogICBAc19pZCAgICAgICAgIDogc3RyZWFtIGhhbmRsZQorICogICBAcGFybXMgICAgICAgIDogcHRyIHRvIGEgcGFyYW0gc3RydWN0IHRvIGJlIGdldCBmcm9tIHNlcnZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBBc3N1bWUgdGhlIHBhcm1zIHN0cnVjdCBidWYgaXMgYWxyZWFkeSBtYXBwZWQgdG8gc2VydmVyIHZpYQorICogICAgICAgICAgICAgIGRvbWFpbiBzb2NrZXQuIFBhcmFtZXRlcnMgdG8gYmUgZ2V0IGZyb20gc2VydmVyIGFyZSBhbHJlYWR5CisgKiAgICAgICAgICAgICAgZmlsbGVkIGluIGJ5IHVwcGVyIGxheWVyIGNhbGxlci4gQWZ0ZXIgdGhpcyBjYWxsLCBjb3JyZXNwb25kaW5nCisgKiAgICAgICAgICAgICAgZmllbGRzIG9mIHJlcXVlc3RlZCBwYXJhbWV0ZXJzIHdpbGwgYmUgZmlsbGVkIGluIGJ5IHNlcnZlciB3aXRoCisgKiAgICAgICAgICAgICAgZGV0YWlsZWQgaW5mb3JtYXRpb24uCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9nZXRfc3RyZWFtX3Bhcm0obW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2V2dF9wYXlsb2Rfc2V0X2dldF9zdHJlYW1fcGFybXNfdCAqcGF5bG9hZCkKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fc3RyZWFtX3QqIHNfb2JqID0gbW1fY2hhbm5lbF91dGlsX2dldF9zdHJlYW1fYnlfaGFuZGxlcihteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLT5zdHJlYW1faWQpOworICAgIGlmIChOVUxMICE9IHNfb2JqKSB7CisgICAgICAgIGlmIChzX29iai0+Y2hfb2JqICE9IG15X29iaikgeworICAgICAgICAgICAgLyogTm8gb3AuIG9uIGxpbmtlZCBzdHJlYW1zICovCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gbW1fc3RyZWFtX2ZzbV9mbihzX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX1NUUkVBTV9FVlRfR0VUX1BBUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXBheWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF9kb19zdHJlYW1fYWN0aW9uCisgKgorICogREVTQ1JJUFRJT046IHJlcXVlc3Qgc2VydmVyIHRvIHBlcmZvcm0gc3RyZWFtIGJhc2VkIGFjdGlvbi4gTWF5YmUgcmVtb3ZlZCBsYXRlcgorICogICAgICAgICAgICAgIGlmIHRoZSBmdW5jdGlvbmFsaXR5IGlzIGluY2x1ZGVkIGluIG1tX2NhbWVyYV9zZXRfcGFybXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNoYW5uZWwgb2JqZWN0CisgKiAgIEBzX2lkICAgICAgICAgOiBzdHJlYW0gaGFuZGxlCisgKiAgIEBhY3Rpb25zICAgICAgOiBwdHIgdG8gYW4gYWN0aW9uIHN0cnVjdCBidWYgdG8gYmUgcGVyZm9ybWVkIGJ5IHNlcnZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBBc3N1bWUgdGhlIGFjdGlvbiBzdHJ1Y3QgYnVmIGlzIGFscmVhZHkgbWFwcGVkIHRvIHNlcnZlciB2aWEKKyAqICAgICAgICAgICAgICBkb21haW4gc29ja2V0LiBBY3Rpb25zIHRvIGJlIHBlcmZvcm1lZCBieSBzZXJ2ZXIgYXJlIGFscmVhZHkKKyAqICAgICAgICAgICAgICBmaWxsZWQgaW4gYnkgdXBwZXIgbGF5ZXIgY2FsbGVyLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NoYW5uZWxfZG9fc3RyZWFtX2FjdGlvbihtbV9jaGFubmVsX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fZXZ0X3BheWxvZF9kb19zdHJlYW1fYWN0aW9uX3QgKnBheWxvYWQpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX3N0cmVhbV90KiBzX29iaiA9IG1tX2NoYW5uZWxfdXRpbF9nZXRfc3RyZWFtX2J5X2hhbmRsZXIobXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC0+c3RyZWFtX2lkKTsKKyAgICBpZiAoTlVMTCAhPSBzX29iaikgeworICAgICAgICBpZiAoc19vYmotPmNoX29iaiAhPSBteV9vYmopIHsKKyAgICAgICAgICAgIC8qIE5vIG9wLiBvbiBsaW5rZWQgc3RyZWFtcyAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICByYyA9IG1tX3N0cmVhbV9mc21fZm4oc19vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9TVFJFQU1fRVZUX0RPX0FDVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopcGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX21hcF9zdHJlYW1fYnVmCisgKgorICogREVTQ1JJUFRJT046IG1hcHBpbmcgc3RyZWFtIGJ1ZmZlciB2aWEgZG9tYWluIHNvY2tldCB0byBzZXJ2ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IGNoYW5uZWwgb2JqZWN0CisgKiAgIEBwYXlsb2FkICAgICAgOiBwdHIgdG8gcGF5bG9hZCBmb3IgbWFwcGluZworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jaGFubmVsX21hcF9zdHJlYW1fYnVmKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9idWZfbWFwX3R5cGUgKnBheWxvYWQpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX3N0cmVhbV90KiBzX29iaiA9IG1tX2NoYW5uZWxfdXRpbF9nZXRfc3RyZWFtX2J5X2hhbmRsZXIobXlfb2JqLAorICAgICAgICAgICAgcGF5bG9hZC0+c3RyZWFtX2lkKTsKKyAgICBpZiAoTlVMTCAhPSBzX29iaikgeworICAgICAgICBpZiAoc19vYmotPmNoX29iaiAhPSBteV9vYmopIHsKKyAgICAgICAgICAgIC8qIE5vIG9wLiBvbiBsaW5rZWQgc3RyZWFtcyAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fbWFwX2J1ZihzX29iaiwKKyAgICAgICAgICAgICAgICBwYXlsb2FkLT50eXBlLCBwYXlsb2FkLT5mcmFtZV9pZHgsCisgICAgICAgICAgICAgICAgcGF5bG9hZC0+cGxhbmVfaWR4LCBwYXlsb2FkLT5mZCwKKyAgICAgICAgICAgICAgICBwYXlsb2FkLT5zaXplLCBwYXlsb2FkLT5idWZmZXIpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX21hcF9zdHJlYW1fYnVmcworICoKKyAqIERFU0NSSVBUSU9OOiBtYXBwaW5nIHN0cmVhbSBidWZmZXJzIHZpYSBkb21haW4gc29ja2V0IHRvIHNlcnZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogY2hhbm5lbCBvYmplY3QKKyAqICAgQHBheWxvYWQgICAgICA6IHB0ciB0byBwYXlsb2FkIGZvciBtYXBwaW5nCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NoYW5uZWxfbWFwX3N0cmVhbV9idWZzKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fYnVmX21hcF90eXBlX2xpc3QgKnBheWxvYWQpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIGlmICgocGF5bG9hZCA9PSBOVUxMKSB8fCAocGF5bG9hZC0+bGVuZ3RoID09IDApKSB7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBtbV9zdHJlYW1fdCogc19vYmogPSBtbV9jaGFubmVsX3V0aWxfZ2V0X3N0cmVhbV9ieV9oYW5kbGVyKG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQtPmJ1Zl9tYXBzWzBdLnN0cmVhbV9pZCk7CisgICAgaWYgKE5VTEwgIT0gc19vYmopIHsKKyAgICAgICAgaWYgKHNfb2JqLT5jaF9vYmogIT0gbXlfb2JqKSB7CisgICAgICAgICAgICAvKiBObyBvcC4gb24gbGlua2VkIHN0cmVhbXMgKi8KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fbWFwX2J1ZnMoc19vYmosIHBheWxvYWQpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3VubWFwX3N0cmVhbV9idWYKKyAqCisgKiBERVNDUklQVElPTjogdW5tYXBwaW5nIHN0cmVhbSBidWZmZXIgdmlhIGRvbWFpbiBzb2NrZXQgdG8gc2VydmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBjaGFubmVsIG9iamVjdAorICogICBAcGF5bG9hZCAgICAgIDogcHRyIHRvIHVubWFwIHBheWxvYWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF91bm1hcF9zdHJlYW1fYnVmKG1tX2NoYW5uZWxfdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2J1Zl91bm1hcF90eXBlICpwYXlsb2FkKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9zdHJlYW1fdCogc19vYmogPSBtbV9jaGFubmVsX3V0aWxfZ2V0X3N0cmVhbV9ieV9oYW5kbGVyKG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQtPnN0cmVhbV9pZCk7CisgICAgaWYgKE5VTEwgIT0gc19vYmopIHsKKyAgICAgICAgaWYgKHNfb2JqLT5jaF9vYmogIT0gbXlfb2JqKSB7CisgICAgICAgICAgICAvKiBObyBvcC4gb24gbGlua2VkIHN0cmVhbXMgKi8KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fdW5tYXBfYnVmKHNfb2JqLCBwYXlsb2FkLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZC0+ZnJhbWVfaWR4LCBwYXlsb2FkLT5wbGFuZV9pZHgpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3N1cGVyYnVmX3F1ZXVlX2luaXQKKyAqCisgKiBERVNDUklQVElPTjogaW5pdGlhbGl6ZSBzdXBlcmJ1ZiBxdWV1ZSBpbiB0aGUgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcXVldWUgICA6IHB0ciB0byBzdXBlcmJ1ZiBxdWV1ZSB0byBiZSBpbml0aWFsaXplZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jaGFubmVsX3N1cGVyYnVmX3F1ZXVlX2luaXQobW1fY2hhbm5lbF9xdWV1ZV90ICogcXVldWUpCit7CisgICAgcmV0dXJuIGNhbV9xdWV1ZV9pbml0KCZxdWV1ZS0+cXVlKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3N1cGVyYnVmX3F1ZXVlX2RlaW5pdAorICoKKyAqIERFU0NSSVBUSU9OOiBkZWluaXRpYWxpemUgc3VwZXJidWYgcXVldWUgaW4gdGhlIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHF1ZXVlICAgOiBwdHIgdG8gc3VwZXJidWYgcXVldWUgdG8gYmUgZGVpbml0aWFsaXplZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jaGFubmVsX3N1cGVyYnVmX3F1ZXVlX2RlaW5pdChtbV9jaGFubmVsX3F1ZXVlX3QgKiBxdWV1ZSkKK3sKKyAgICByZXR1cm4gY2FtX3F1ZXVlX2RlaW5pdCgmcXVldWUtPnF1ZSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF91dGlsX3NlcV9jb21wX3dfcm9sbG92ZXIKKyAqCisgKiBERVNDUklQVElPTjogdXRpbGl0eSBmdW5jdGlvbiB0byBoYW5kbGUgc2VxdWVuY2UgbnVtYmVyIGNvbXBhcmlzb24gd2l0aCByb2xsb3ZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAdjEgICAgICA6IGZpcnN0IHZhbHVlIHRvIGJlIGNvbXBhcmVkCisgKiAgIEB2MiAgICAgIDogc2Vjb25kIHZhbHVlIHRvIGJlIGNvbXBhcmVkCisgKgorICogUkVUVVJOICAgICA6IGludDhfdCB0eXBlIG9mIGNvbXBhcmlzb24gcmVzdWx0CisgKiAgICAgICAgICAgICAgPjAgIC0tIHYxIGxhcmdlciB0aGFuIHYyCisgKiAgICAgICAgICAgICAgPTAgIC0tIHZpIGVxdWFsIHRvIHYyCisgKiAgICAgICAgICAgICAgPDAgIC0tIHYxIHNtYWxsZXIgdGhhbiB2MgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQ4X3QgbW1fY2hhbm5lbF91dGlsX3NlcV9jb21wX3dfcm9sbG92ZXIodWludDMyX3QgdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdjIpCit7CisgICAgaW50OF90IHJldCA9IDA7CisKKyAgICAvKiBUT0RPOiBuZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSBpZiB2MiByb2xsIG92ZXIgdG8gMCAqLworICAgIGlmICh2MSA+IHYyKSB7CisgICAgICAgIHJldCA9IDE7CisgICAgfSBlbHNlIGlmICh2MSA8IHYyKSB7CisgICAgICAgIHJldCA9IC0xOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF92YWxpZGF0ZV9zdXBlcl9idWYuCisgKgorICogREVTQ1JJUFRJT046IFZhbGlkYXRlIGluY29taW5nIGJ1ZmZlciB3aXRoIGV4aXN0aW5nIHN1cGVyIGJ1ZmZlci4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNoX29iaiAgOiBjaGFubmVsIG9iamVjdAorICogICBAcXVldWUgICA6IHN1cGVyYnVmIHF1ZXVlCisgKiAgIEBidWZfaW5mbzogbmV3IGJ1ZmZlciBmcm9tIHN0cmVhbQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQ4X3QgdHlwZSBvZiB2YWxpZGF0aW9uIHJlc3VsdAorICogICAgICAgICAgICAgID4wICAtLSBWYWxpZCBmcmFtZQorICogICAgICAgICAgICAgID0wICAtLSBDYW5ub3QgdmFsaWRhdGUKKyAqICAgICAgICAgICAgICA8MCAgLS0gSW52YWxpZCBmcmFtZS4gQ2FuIGJlIGZyZWVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDhfdCBtbV9jaGFubmVsX3ZhbGlkYXRlX3N1cGVyX2J1ZihtbV9jaGFubmVsX3QqIGNoX29iaiwKKyAgICAgICAgbW1fY2hhbm5lbF9xdWV1ZV90ICpxdWV1ZSwgbW1fY2FtZXJhX2J1Zl9pbmZvX3QgKmJ1Zl9pbmZvKQoreworICAgIGludDhfdCByZXQgPSAwOworICAgIGNhbV9ub2RlX3QqIG5vZGUgPSBOVUxMOworICAgIHN0cnVjdCBjYW1fbGlzdCAqaGVhZCA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpwb3MgPSBOVUxMOworICAgIG1tX2NoYW5uZWxfcXVldWVfbm9kZV90KiBzdXBlcl9idWYgPSBOVUxMOworCisgICAgKHZvaWQpY2hfb2JqOworCisgICAgLyogY29tcCAqLworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcXVldWUtPnF1ZS5sb2NrKTsKKyAgICBoZWFkID0gJnF1ZXVlLT5xdWUuaGVhZC5saXN0OworICAgIC8qIGdldCB0aGUgbGFzdCBvbmUgaW4gdGhlIHF1ZXVlIHdoaWNoIGlzIHBvc3NpYmx5IGhhdmluZyBubyBtYXRjaGluZyAqLworICAgIHBvcyA9IGhlYWQtPm5leHQ7CisgICAgd2hpbGUgKHBvcyAhPSBoZWFkKSB7CisgICAgICAgIG5vZGUgPSBtZW1iZXJfb2YocG9zLCBjYW1fbm9kZV90LCBsaXN0KTsKKyAgICAgICAgc3VwZXJfYnVmID0gKG1tX2NoYW5uZWxfcXVldWVfbm9kZV90Kilub2RlLT5kYXRhOworICAgICAgICBpZiAoTlVMTCAhPSBzdXBlcl9idWYpIHsKKyAgICAgICAgICAgIGlmICgoc3VwZXJfYnVmLT5leHBlY3RlZF9mcmFtZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGJ1Zl9pbmZvLT5mcmFtZV9pZHggPT0gc3VwZXJfYnVmLT5mcmFtZV9pZHgpKSB7CisgICAgICAgICAgICAgICAgLy9UaGlzIGlzIGdvb2QgZnJhbWUuIEV4cGVjdGluZyBtb3JlIGZyYW1lcy4gS2VlcGluZyB0aGlzIGZyYW1lLgorICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBvcyA9IHBvcy0+bmV4dDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcXVldWUtPnF1ZS5sb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NoYW5uZWxfaGFuZGxlX21ldGFkYXRhCisgKgorICogREVTQ1JJUFRJT046IEhhbmRsZSBmcmFtZSBtYXRjaGluZyBsb2dpYyBjaGFuZ2UgZHVlIHRvIG1ldGFkYXRhCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjaF9vYmogIDogY2hhbm5lbCBvYmplY3QKKyAqICAgQHF1ZXVlICAgOiBzdXBlcmJ1ZiBxdWV1ZQorICogICBAYnVmX2luZm86IG5ldyBidWZmZXIgZnJvbSBzdHJlYW0KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9oYW5kbGVfbWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICBtbV9jaGFubmVsX3QqIGNoX29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfcXVldWVfdCAqIHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9pbmZvX3QgKmJ1Zl9pbmZvKQoreworCisgICAgaW50IHJjID0gMCA7CisgICAgbW1fc3RyZWFtX3QqIHN0cmVhbV9vYmogPSBOVUxMOworICAgIHN0cmVhbV9vYmogPSBtbV9jaGFubmVsX3V0aWxfZ2V0X3N0cmVhbV9ieV9oYW5kbGVyKGNoX29iaiwKKyAgICAgICAgICAgICAgICBidWZfaW5mby0+c3RyZWFtX2lkKTsKKyAgICB1aW50OF90IGlzX3ByZXBfc25hcHNob3RfZG9uZV92YWxpZCA9IDA7CisgICAgdWludDhfdCBpc19nb29kX2ZyYW1lX2lkeF9yYW5nZV92YWxpZCA9IDA7CisgICAgaW50MzJfdCBwcmVwX3NuYXBzaG90X2RvbmVfc3RhdGUgPSAwOworICAgIGNhbV9mcmFtZV9pZHhfcmFuZ2VfdCBnb29kX2ZyYW1lX2lkeF9yYW5nZTsKKyAgICB1aW50OF90IGlzX2Nyb3BfMXhfZm91bmQgPSAwOworICAgIHVpbnQzMl90IHNuYXBzaG90X3N0cmVhbV9pZCA9IDA7CisgICAgdWludDMyX3QgaTsKKyAgICAvKiBTZXQgZXhwZWN0ZWQgZnJhbWUgaWQgdG8gYSBmdXR1cmUgZnJhbWUgaWR4LCBsYXJnZSBlbm91Z2ggdG8gd2FpdAorICAgICogZm9yIGdvb2RfZnJhbWVfaWR4X3JhbmdlLCBhbmQgc21hbGwgZW5vdWdoIHRvIHN0aWxsIGNhcHR1cmUgYW4gaW1hZ2UgKi8KKyAgICBjb25zdCB1aW50MzJfdCBtYXhfZnV0dXJlX2ZyYW1lX29mZnNldCA9IE1NX0NBTUVSQV9NQVhfRlVUVVJFX0ZSQU1FX1dBSVQ7CisKKyAgICBtZW1zZXQoJmdvb2RfZnJhbWVfaWR4X3JhbmdlLCAwLCBzaXplb2YoZ29vZF9mcmFtZV9pZHhfcmFuZ2UpKTsKKworICAgIGlmIChOVUxMID09IHN0cmVhbV9vYmopIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBTdHJlYW0gT2JqZWN0IGZvciBzdHJlYW1faWQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5zdHJlYW1faWQpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYgKE5VTEwgPT0gc3RyZWFtX29iai0+c3RyZWFtX2luZm8pIHsKKyAgICAgICAgTE9HRSgiTlVMTCBzdHJlYW0gaW5mbyBmb3Igc3RyZWFtX2lkID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgYnVmX2luZm8tPnN0cmVhbV9pZCk7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmICgoQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBID09IHN0cmVhbV9vYmotPnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSkgJiYKKyAgICAgICAgICAgICgoc3RyZWFtX29iai0+Y2hfb2JqID09IGNoX29iaikgfHwKKyAgICAgICAgICAgICgoc3RyZWFtX29iai0+bGlua2VkX3N0cmVhbSAhPSBOVUxMKSAmJgorICAgICAgICAgICAgKHN0cmVhbV9vYmotPmxpbmtlZF9zdHJlYW0tPmxpbmtlZF9vYmogPT0gY2hfb2JqKSkpKSB7CisgICAgICAgIGNvbnN0IG1ldGFkYXRhX2J1ZmZlcl90ICptZXRhZGF0YTsKKyAgICAgICAgbWV0YWRhdGEgPSAoY29uc3QgbWV0YWRhdGFfYnVmZmVyX3QgKilidWZfaW5mby0+YnVmLT5idWZmZXI7CisKKyAgICAgICAgaWYgKE5VTEwgPT0gbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIExPR0UoIk5VTEwgbWV0YWRhdGEgYnVmZmVyIGZvciBtZXRhZGF0YSBzdHJlYW0iKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBMT0dMKCJFICwgZXhwZWN0ZWQgZnJhbWUgaWQ6ICVkIiwgcXVldWUtPmV4cGVjdGVkX2ZyYW1lX2lkKTsKKworICAgICAgICBJRl9NRVRBX0FWQUlMQUJMRShjb25zdCBpbnQzMl90LCBwX3ByZXBfc25hcHNob3RfZG9uZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX1BSRVBfU05BUFNIT1RfRE9ORSwgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIHByZXBfc25hcHNob3RfZG9uZV9zdGF0ZSA9ICpwX3ByZXBfc25hcHNob3RfZG9uZV9zdGF0ZTsKKyAgICAgICAgICAgIGlzX3ByZXBfc25hcHNob3RfZG9uZV92YWxpZCA9IDE7CisgICAgICAgICAgICBMT0dIKCJwcmVwYXJlIHNuYXBzaG90IGRvbmUgdmFsaWQgIik7CisgICAgICAgIH0KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY29uc3QgY2FtX2ZyYW1lX2lkeF9yYW5nZV90LCBwX2dvb2RfZnJhbWVfaWR4X3JhbmdlLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX01FVEFfR09PRF9GUkFNRV9JRFhfUkFOR0UsIG1ldGFkYXRhKSB7CisgICAgICAgICAgICBnb29kX2ZyYW1lX2lkeF9yYW5nZSA9ICpwX2dvb2RfZnJhbWVfaWR4X3JhbmdlOworICAgICAgICAgICAgaXNfZ29vZF9mcmFtZV9pZHhfcmFuZ2VfdmFsaWQgPSAxOworICAgICAgICAgICAgTE9HSCgiZ29vZF9mcmFtZV9pZHhfcmFuZ2UgOiBtaW46ICVkLCBtYXg6ICVkICwgbnVtIGZyYW1lcyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgZ29vZF9mcmFtZV9pZHhfcmFuZ2UubWluX2ZyYW1lX2lkeCwKKyAgICAgICAgICAgICAgICBnb29kX2ZyYW1lX2lkeF9yYW5nZS5tYXhfZnJhbWVfaWR4LCBnb29kX2ZyYW1lX2lkeF9yYW5nZS5udW1fbGVkX29uX2ZyYW1lcyk7CisgICAgICAgIH0KKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY29uc3QgY2FtX2Nyb3BfZGF0YV90LCBwX2Nyb3BfZGF0YSwKKyAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0NST1BfREFUQSwgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGNhbV9jcm9wX2RhdGFfdCBjcm9wX2RhdGEgPSAqcF9jcm9wX2RhdGE7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoX29iai0+c3RyZWFtcyk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChNTV9TVFJFQU1fU1RBVEVfTk9UVVNFRCA9PSBjaF9vYmotPnN0cmVhbXNbaV0uc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QgPT0KKyAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5zdHJlYW1zW2ldLnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdF9zdHJlYW1faWQgPSBjaF9vYmotPnN0cmVhbXNbaV0uc2VydmVyX3N0cmVhbV9pZDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGk9MDsgaTxjcm9wX2RhdGEubnVtX29mX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzbmFwc2hvdF9zdHJlYW1faWQgPT0gY3JvcF9kYXRhLmNyb3BfaW5mb1tpXS5zdHJlYW1faWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjcm9wX2RhdGEuY3JvcF9pbmZvW2ldLmNyb3AubGVmdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjcm9wX2RhdGEuY3JvcF9pbmZvW2ldLmNyb3AudG9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpc19jcm9wXzF4X2ZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY29uc3QgY2FtX2J1Zl9kaXZlcnRfaW5mb190LCBwX2RpdmVydF9pbmZvLAorICAgICAgICAgICAgICAgIENBTV9JTlRGX0JVRl9ESVZFUlRfSU5GTywgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGNhbV9idWZfZGl2ZXJ0X2luZm9fdCBkaXZlcnRfaW5mbyA9ICpwX2RpdmVydF9pbmZvOworICAgICAgICAgICAgaWYgKGRpdmVydF9pbmZvLmZyYW1lX2lkID49IGJ1Zl9pbmZvLT5mcmFtZV9pZHgpIHsKKyAgICAgICAgICAgICAgICBjaF9vYmotPmRpdmVydGVkX2ZyYW1lX2lkID0gZGl2ZXJ0X2luZm8uZnJhbWVfaWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNoX29iai0+ZGl2ZXJ0ZWRfZnJhbWVfaWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoX29iai0+aXNab29tMXhGcmFtZVJlcXVlc3RlZCkgeworICAgICAgICAgICAgaWYgKGlzX2Nyb3BfMXhfZm91bmQpIHsKKyAgICAgICAgICAgICAgICBjaF9vYmotPmlzWm9vbTF4RnJhbWVSZXF1ZXN0ZWQgPSAwOworICAgICAgICAgICAgICAgIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZCA9IGJ1Zl9pbmZvLT5mcmFtZV9pZHggKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+ZXhwZWN0ZWRfZnJhbWVfaWQgKz0gbWF4X2Z1dHVyZV9mcmFtZV9vZmZzZXQ7CisgICAgICAgICAgICAgICAgLyogRmx1c2ggdW53YW50ZWQgZnJhbWVzICovCisgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF9zdXBlcmJ1Zl9mbHVzaF9tYXRjaGVkKGNoX29iaiwgcXVldWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2hfb2JqLT5zdGFydFpTbFNuYXBzaG90Q2FsbGVkICYmIGlzX2dvb2RfZnJhbWVfaWR4X3JhbmdlX3ZhbGlkKSB7CisgICAgICAgICAgICBMT0dJKCJmcmFtZUlEID0gJWQsIGV4cGVjdGVkID0gJWQgZ29vZF9mcmFtZV9pZHggPSAlZCIsCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5mcmFtZV9pZHgsIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgZ29vZF9mcmFtZV9pZHhfcmFuZ2UubWluX2ZyYW1lX2lkeCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNfcHJlcF9zbmFwc2hvdF9kb25lX3ZhbGlkKSB7CisgICAgICAgICAgICBjaF9vYmotPmJXYWl0Rm9yUHJlcFNuYXBzaG90RG9uZSA9IDA7CisgICAgICAgICAgICBpZiAocHJlcF9zbmFwc2hvdF9kb25lX3N0YXRlID09IE5FRURfRlVUVVJFX0ZSQU1FKSB7CisgICAgICAgICAgICAgICAgcXVldWUtPmV4cGVjdGVkX2ZyYW1lX2lkICs9IG1heF9mdXR1cmVfZnJhbWVfb2Zmc2V0OworICAgICAgICAgICAgICAgIExPR0koIlByZUZsYXNoIERvbmUuIE5lZWQgTWFpbiBGbGFzaCIpOworCisgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF9zdXBlcmJ1Zl9mbHVzaChjaF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwgQ0FNX1NUUkVBTV9UWVBFX0RFRkFVTFQpOworCisgICAgICAgICAgICAgICAgY2hfb2JqLT5uZWVkTEVERmxhc2ggPSBUUlVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaF9vYmotPm5lZWRMRURGbGFzaCA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpc19nb29kX2ZyYW1lX2lkeF9yYW5nZV92YWxpZCkgeworICAgICAgICAgICAgcXVldWUtPmV4cGVjdGVkX2ZyYW1lX2lkID0KKyAgICAgICAgICAgICAgICBnb29kX2ZyYW1lX2lkeF9yYW5nZS5taW5fZnJhbWVfaWR4OworICAgICAgICAgICAgcXVldWUtPmdvb2RfZnJhbWVfaWQgPSBnb29kX2ZyYW1lX2lkeF9yYW5nZS5taW5fZnJhbWVfaWR4OworICAgICAgICAgICAgaWYoKGNoX29iai0+bmVlZExFREZsYXNoID09IFRSVUUpICYmIChjaF9vYmotPmJ1cnN0U25hcE51bSA+IDEpKSB7CisgICAgICAgICAgICAgICAgcXVldWUtPmxlZF9vbl9zdGFydF9mcmFtZV9pZCA9CisgICAgICAgICAgICAgICAgZ29vZF9mcmFtZV9pZHhfcmFuZ2UubWluX2ZyYW1lX2lkeDsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+bGVkX29mZl9zdGFydF9mcmFtZV9pZCA9CisgICAgICAgICAgICAgICAgZ29vZF9mcmFtZV9pZHhfcmFuZ2UubWF4X2ZyYW1lX2lkeDsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+b25jZSA9IDA7CisgICAgICAgICAgICAgICAgcXVldWUtPmxlZF9vbl9udW1fZnJhbWVzID0KKyAgICAgICAgICAgICAgICAgIGdvb2RfZnJhbWVfaWR4X3JhbmdlLm51bV9sZWRfb25fZnJhbWVzOworICAgICAgICAgICAgICAgIHF1ZXVlLT5mcmFtZV9za2lwX2NvdW50ID0gZ29vZF9mcmFtZV9pZHhfcmFuZ2UuZnJhbWVfc2tpcF9jb3VudDsKKyAgICAgICAgICAgICAgICBMT0dEKCJOZWVkIEZsYXNoLCBleHBlY3RlZCBmcmFtZSBpZCA9ICVkLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbGVkX29uIHN0YXJ0ID0gJWQsIGxlZCBvZmYgc3RhcnQgPSAlZCwgbGVkIG9uIGZyYW1lcyA9ICVkICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+ZXhwZWN0ZWRfZnJhbWVfaWQsIHF1ZXVlLT5sZWRfb25fc3RhcnRfZnJhbWVfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+bGVkX29mZl9zdGFydF9mcmFtZV9pZCwgcXVldWUtPmxlZF9vbl9udW1fZnJhbWVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HRCgiTm8gZmxhc2gsIGV4cGVjdGVkIGZyYW1lIGlkID0gJWQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+ZXhwZWN0ZWRfZnJhbWVfaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKChNTV9DSEFOTkVMX0JSQUNLRVRJTkdfU1RBVEVfV0FJVF9HT09EX0ZSQU1FX0lEWCA9PSBjaF9vYmotPmJyYWNrZXRpbmdTdGF0ZSkgJiYKKyAgICAgICAgICAgICAgICAhaXNfcHJlcF9zbmFwc2hvdF9kb25lX3ZhbGlkKSB7CisgICAgICAgICAgICAvKiBGbHVzaCB1bndhbnRlZCBmcmFtZXMgKi8KKyAgICAgICAgICAgIG1tX2NoYW5uZWxfc3VwZXJidWZfZmx1c2hfbWF0Y2hlZChjaF9vYmosIHF1ZXVlKTsKKyAgICAgICAgICAgIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZCArPSBtYXhfZnV0dXJlX2ZyYW1lX29mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hfb2JqLT5pc0ZsYXNoQnJhY2tldGluZ0VuYWJsZWQgJiYKKyAgICAgICAgICAgIGlzX2dvb2RfZnJhbWVfaWR4X3JhbmdlX3ZhbGlkKSB7CisgICAgICAgICAgICAvKiBGbGFzaCBicmFja2V0aW5nIG5lZWRzIHR3byBmcmFtZXMsIHdpdGggJiB3aXRob3V0IGxlZCBmbGFzaC4KKyAgICAgICAgICAgICogaW4gdmFsaWQgcmFuZ2UgbWluIGZyYW1lIGlzIHdpdGggbGVkIGZsYXNoIGFuZCBtYXggZnJhbWUgaXMKKyAgICAgICAgICAgICogd2l0aG91dCBsZWQgZmxhc2ggKi8KKyAgICAgICAgICAgIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZCA9CisgICAgICAgICAgICAgICAgICAgIGdvb2RfZnJhbWVfaWR4X3JhbmdlLm1pbl9mcmFtZV9pZHg7CisgICAgICAgICAgICAvKiBtYXggZnJhbWUgaXMgd2l0aG91dCBsZWQgZmxhc2ggKi8KKyAgICAgICAgICAgIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZF93aXRob3V0X2xlZCA9CisgICAgICAgICAgICAgICAgICAgIGdvb2RfZnJhbWVfaWR4X3JhbmdlLm1heF9mcmFtZV9pZHg7CisgICAgICAgICAgICBxdWV1ZS0+Z29vZF9mcmFtZV9pZCA9CisgICAgICAgICAgICAgICAgICAgIGdvb2RfZnJhbWVfaWR4X3JhbmdlLm1pbl9mcmFtZV9pZHg7CisgICAgICAgIH0gZWxzZSBpZiAoaXNfZ29vZF9mcmFtZV9pZHhfcmFuZ2VfdmFsaWQpIHsKKyAgICAgICAgICAgIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZCA9CisgICAgICAgICAgICAgICAgICAgIGdvb2RfZnJhbWVfaWR4X3JhbmdlLm1pbl9mcmFtZV9pZHg7CisgICAgICAgICAgICBjaF9vYmotPmJyYWNrZXRpbmdTdGF0ZSA9IE1NX0NIQU5ORUxfQlJBQ0tFVElOR19TVEFURV9BQ1RJVkU7CisgICAgICAgICAgICBxdWV1ZS0+Z29vZF9mcmFtZV9pZCA9CisgICAgICAgICAgICAgICAgICAgIGdvb2RfZnJhbWVfaWR4X3JhbmdlLm1pbl9mcmFtZV9pZHg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2hfb2JqLT5pc0NvbmZpZ0NhcHR1cmUgJiYgaXNfZ29vZF9mcmFtZV9pZHhfcmFuZ2VfdmFsaWQKKyAgICAgICAgICAgICAgICAmJiAoZ29vZF9mcmFtZV9pZHhfcmFuZ2UuY29uZmlnX2JhdGNoX2lkeCA8IGNoX29iai0+ZnJhbWVDb25maWcubnVtX2JhdGNoKSkgeworCisgICAgICAgICAgICBMT0dJKCJGcmFtZSBDb25maWc6IEV4cGN0ZWQgSUQgPSAlZCBiYXRjaCBpbmRleCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZ29vZF9mcmFtZV9pZHhfcmFuZ2UubWluX2ZyYW1lX2lkeCwgZ29vZF9mcmFtZV9pZHhfcmFuZ2UuY29uZmlnX2JhdGNoX2lkeCk7CisgICAgICAgICAgICBjaF9vYmotPmNhcHR1cmVfZnJhbWVfaWRbZ29vZF9mcmFtZV9pZHhfcmFuZ2UuY29uZmlnX2JhdGNoX2lkeF0gPQorICAgICAgICAgICAgICAgICAgICBnb29kX2ZyYW1lX2lkeF9yYW5nZS5taW5fZnJhbWVfaWR4OworCisgICAgICAgICAgICBpZiAoY2hfb2JqLT5jdXJfY2FwdHVyZV9pZHggPT0gZ29vZF9mcmFtZV9pZHhfcmFuZ2UuY29uZmlnX2JhdGNoX2lkeCkgeworICAgICAgICAgICAgICAgIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZCA9CisgICAgICAgICAgICAgICAgICAgICAgICBnb29kX2ZyYW1lX2lkeF9yYW5nZS5taW5fZnJhbWVfaWR4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+ZXhwZWN0ZWRfZnJhbWVfaWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5jYXB0dXJlX2ZyYW1lX2lkW2NoX29iai0+Y3VyX2NhcHR1cmVfaWR4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHF1ZXVlLT5nb29kX2ZyYW1lX2lkID0gcXVldWUtPmV4cGVjdGVkX2ZyYW1lX2lkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChjaF9vYmotPmJ1cnN0U25hcE51bSA+IDEpICYmIChjaF9vYmotPm5lZWRMRURGbGFzaCA9PSBUUlVFKQorICAgICAgICAgICAgJiYgIWNoX29iai0+aXNGbGFzaEJyYWNrZXRpbmdFbmFibGVkCisgICAgICAgICAgICAmJiAoTU1fQ0hBTk5FTF9CUkFDS0VUSU5HX1NUQVRFX09GRiA9PSBjaF9vYmotPmJyYWNrZXRpbmdTdGF0ZSkKKyAgICAgICAgICAgICYmICFjaF9vYmotPmlzQ29uZmlnQ2FwdHVyZSkgeworICAgICAgICAgICAgaWYoKGJ1Zl9pbmZvLT5mcmFtZV9pZHggPj0gcXVldWUtPmxlZF9vZmZfc3RhcnRfZnJhbWVfaWQpCisgICAgICAgICAgICAgICAgICAgICYmICAhcXVldWUtPm9uY2UpIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJCdXJzdCBzbmFwIG51bSA9ICVkICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hfb2JqLT5idXJzdFNuYXBOdW0pOworICAgICAgICAgICAgICAgIC8vIFNraXAgZnJhbWVzIGZyb20gTEVEIE9GRiBmcmFtZSB0byBnZXQgYSBnb29kIGZyYW1lCisgICAgICAgICAgICAgICAgcXVldWUtPmV4cGVjdGVkX2ZyYW1lX2lkID0gcXVldWUtPmxlZF9vZmZfc3RhcnRfZnJhbWVfaWQgKworICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUtPmZyYW1lX3NraXBfY291bnQ7CisgICAgICAgICAgICAgICAgcXVldWUtPm9uY2UgPSAxOworICAgICAgICAgICAgICAgIGNoX29iai0+c3RvcFpzbFNuYXBzaG90ID0gMTsKKyAgICAgICAgICAgICAgICBjaF9vYmotPm5lZWRMRURGbGFzaCA9IEZBTFNFOworICAgICAgICAgICAgICAgIExPR0QoIlJlYWNoZWQgbWF4IGxlZCBvbiBmcmFtZXMgPSAlZCAsIGV4cGVjdGVkIGlkID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5mcmFtZV9pZHgsIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZCk7CisgICAgICAgICB9CisgICAgICAgfQorCisgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGNvbnN0IGNhbV9sb3dfbGlnaHRfbW9kZV90LCBsb3dfbGlnaHRfbGV2ZWwsCisgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0xPV19MSUdIVCwgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIGNoX29iai0+bmVlZExvd0xpZ2h0WlNMID0gKmxvd19saWdodF9sZXZlbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvciB0aGUgaW5zdGFudCBjYXB0dXJlIGNhc2UsIGlmIEFFQyBzZXR0bGVzIGJlZm9yZSBleHBlY3RlZCBmcmFtZSBJRCBmcm9tIHVzZXIsCisgICAgICAgIC8vIHJlc2V0IHRoZSBleHBlY3RlZCBmcmFtZSBJRCB0byBjdXJyZW50IGZyYW1lIGluZGV4LgorICAgICAgICBpZiAocXVldWUtPmF0dHIudXNlcl9leHBlY3RlZF9mcmFtZV9pZCA+IDApIHsKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+YXR0ci51c2VyX2V4cGVjdGVkX2ZyYW1lX2lkID4gYnVmX2luZm8tPmZyYW1lX2lkeCkgeworICAgICAgICAgICAgICAgIElGX01FVEFfQVZBSUxBQkxFKGNvbnN0IGNhbV8zYV9wYXJhbXNfdCwgYWVfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBDQU1fSU5URl9NRVRBX0FFQ19JTkZPLCBtZXRhZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWVfcGFyYW1zLT5zZXR0bGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+ZXhwZWN0ZWRfZnJhbWVfaWQgPSBidWZfaW5mby0+ZnJhbWVfaWR4OworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGV4cGVjdGVkIGZyYW1lIElEIGZyb20gSEFMIHRvIDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT5hdHRyLnVzZXJfZXhwZWN0ZWRfZnJhbWVfaWQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRCgiQUVDIHNldHRsZWQsIHJlc2V0IGV4cGVjdGVkIGZyYW1lIElEIGZyb20gdXNlciIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGV4cGVjdGVkIGZyYW1lIElEIGZyb20gSEFMIHRvIDAgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBmcmFtZSBpbmRleCBpcyBncmVhdGVyIHRoYW4gZXhwZWN0ZWQgaWQuCisgICAgICAgICAgICAgICAgcXVldWUtPmF0dHIudXNlcl9leHBlY3RlZF9mcmFtZV9pZCA9IDA7CisgICAgICAgICAgICAgICAgTE9HRCgicmVzZXQgZXhwZWN0ZWQgZnJhbWUgSUQgZnJvbSB1c2VyIGFzIGl0IHJlYWNoZWQgdGhlIGJvdW5kIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CitlbmQ6CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NoYW5uZWxfc3VwZXJidWZfY29tcF9hbmRfZW5xdWV1ZQorICoKKyAqIERFU0NSSVBUSU9OOiBpbXBsZW1lbnRhdGlvbiBmb3IgbWF0Y2hpbmcgbG9naWMgZm9yIHN1cGVyYnVmCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjaF9vYmogIDogY2hhbm5lbCBvYmplY3QKKyAqICAgQHF1ZXVlICAgOiBzdXBlcmJ1ZiBxdWV1ZQorICogICBAYnVmX2luZm86IG5ldyBidWZmZXIgZnJvbSBzdHJlYW0KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9zdXBlcmJ1Zl9jb21wX2FuZF9lbnF1ZXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF90KiBjaF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBtbV9jaGFubmVsX3F1ZXVlX3QgKnF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9pbmZvX3QgKmJ1Zl9pbmZvKQoreworICAgIGNhbV9ub2RlX3QqIG5vZGUgPSBOVUxMOworICAgIHN0cnVjdCBjYW1fbGlzdCAqaGVhZCA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpwb3MgPSBOVUxMOworICAgIG1tX2NoYW5uZWxfcXVldWVfbm9kZV90KiBzdXBlcl9idWYgPSBOVUxMOworICAgIHVpbnQ4X3QgYnVmX3NfaWR4LCBpLCBmb3VuZF9zdXBlcl9idWYsIHVubWF0Y2hlZF9idW5kbGVzOworICAgIHN0cnVjdCBjYW1fbGlzdCAqbGFzdF9idWYsICppbnNlcnRfYmVmb3JlX2J1ZiwgKmxhc3RfYnVmX3B0cjsKKworICAgIExPR0QoIkUiKTsKKworICAgIGZvciAoYnVmX3NfaWR4ID0gMDsgYnVmX3NfaWR4IDwgcXVldWUtPm51bV9zdHJlYW1zOyBidWZfc19pZHgrKykgeworICAgICAgICBpZiAoYnVmX2luZm8tPnN0cmVhbV9pZCA9PSBxdWV1ZS0+YnVuZGxlZF9zdHJlYW1zW2J1Zl9zX2lkeF0pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJ1Zl9zX2lkeCA9PSBxdWV1ZS0+bnVtX3N0cmVhbXMpIHsKKyAgICAgICAgTE9HRSgiYnVmIGZyb20gc3RyZWFtICglZCkgbm90IGJ1bmRsZWQiLCBidWZfaW5mby0+c3RyZWFtX2lkKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmKGJ1Zl9pbmZvLT5mcmFtZV9pZHggPT0gMCkgeworICAgICAgICBtbV9jaGFubmVsX3FidWYoY2hfb2JqLCBidWZfaW5mby0+YnVmKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKG1tX2NoYW5uZWxfaGFuZGxlX21ldGFkYXRhKGNoX29iaiwgcXVldWUsIGJ1Zl9pbmZvKSA8IDApIHsKKyAgICAgICAgbW1fY2hhbm5lbF9xYnVmKGNoX29iaiwgYnVmX2luZm8tPmJ1Zik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKG1tX2NoYW5uZWxfdXRpbF9zZXFfY29tcF93X3JvbGxvdmVyKGJ1Zl9pbmZvLT5mcmFtZV9pZHgsCisgICAgICAgICAgICBxdWV1ZS0+ZXhwZWN0ZWRfZnJhbWVfaWQpIDwgMCkgJiYKKyAgICAgICAgICAgIChtbV9jaGFubmVsX3ZhbGlkYXRlX3N1cGVyX2J1ZihjaF9vYmosIHF1ZXVlLCBidWZfaW5mbykgPD0gMCkpIHsKKyAgICAgICAgTE9HSCgiaW5jb21pbmcgYnVmIGlkKCVkKSBpcyBvbGRlciB0aGFuIGV4cGVjdGVkIGJ1ZiBpZCglZCksIHdpbGwgZGlzY2FyZCBpdCIsCisgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5mcmFtZV9pZHgsIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZCk7CisgICAgICAgIG1tX2NoYW5uZWxfcWJ1ZihjaF9vYmosIGJ1Zl9pbmZvLT5idWYpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBjb21wICovCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZxdWV1ZS0+cXVlLmxvY2spOworICAgIGhlYWQgPSAmcXVldWUtPnF1ZS5oZWFkLmxpc3Q7CisgICAgLyogZ2V0IHRoZSBsYXN0IG9uZSBpbiB0aGUgcXVldWUgd2hpY2ggaXMgcG9zc2libHkgaGF2aW5nIG5vIG1hdGNoaW5nICovCisgICAgcG9zID0gaGVhZC0+bmV4dDsKKworICAgIGZvdW5kX3N1cGVyX2J1ZiA9IDA7CisgICAgdW5tYXRjaGVkX2J1bmRsZXMgPSAwOworICAgIGxhc3RfYnVmID0gTlVMTDsKKyAgICBpbnNlcnRfYmVmb3JlX2J1ZiA9IE5VTEw7CisgICAgbGFzdF9idWZfcHRyID0gTlVMTDsKKworICAgIHdoaWxlIChwb3MgIT0gaGVhZCkgeworICAgICAgICBub2RlID0gbWVtYmVyX29mKHBvcywgY2FtX25vZGVfdCwgbGlzdCk7CisgICAgICAgIHN1cGVyX2J1ZiA9IChtbV9jaGFubmVsX3F1ZXVlX25vZGVfdCopbm9kZS0+ZGF0YTsKKworICAgICAgICBpZiAoTlVMTCAhPSBzdXBlcl9idWYpIHsKKyAgICAgICAgICAgIGlmIChzdXBlcl9idWYtPm1hdGNoZWQpIHsKKyAgICAgICAgICAgICAgICAvKiBmaW5kIGEgbWF0Y2hlZCBzdXBlciBidWYsIG1vdmUgdG8gbmV4dCBvbmUgKi8KKyAgICAgICAgICAgICAgICBwb3MgPSBwb3MtPm5leHQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCggYnVmX2luZm8tPmZyYW1lX2lkeCA9PSBzdXBlcl9idWYtPmZyYW1lX2lkeCApCisgICAgICAgICAgICAgICAgICAgIC8qUGljayBtZXRhZGF0YSBncmVhdGVyIHRoYW4gYXZhaWxhYmxlIGZyYW1lSUQqLworICAgICAgICAgICAgICAgICAgICB8fCAoKHF1ZXVlLT5hdHRyLnByaW9yaXR5ID09IE1NX0NBTUVSQV9TVVBFUl9CVUZfUFJJT1JJVFlfTE9XKQorICAgICAgICAgICAgICAgICAgICAmJiAoc3VwZXJfYnVmLT5zdXBlcl9idWZbYnVmX3NfaWR4XS5mcmFtZV9pZHggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKGJ1Zl9pbmZvLT5idWYtPnN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHN1cGVyX2J1Zi0+ZnJhbWVfaWR4IDwgYnVmX2luZm8tPmZyYW1lX2lkeCkpCisgICAgICAgICAgICAgICAgICAgIC8qUGljayBhdmFpbGFibGUgbWV0YWRhdGEgY2xvc2VzdCB0byBmcmFtZUlEKi8KKyAgICAgICAgICAgICAgICAgICAgfHwgKChxdWV1ZS0+YXR0ci5wcmlvcml0eSA9PSBNTV9DQU1FUkFfU1VQRVJfQlVGX1BSSU9SSVRZX0xPVykKKyAgICAgICAgICAgICAgICAgICAgJiYgKGJ1Zl9pbmZvLT5idWYtPnN0cmVhbV90eXBlICE9IENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHN1cGVyX2J1Zi0+c3VwZXJfYnVmW2J1Zl9zX2lkeF0uZnJhbWVfaWR4ID09IDApCisgICAgICAgICAgICAgICAgICAgICYmIChzdXBlcl9idWYtPnVubWF0Y2hlZF9tZXRhX2lkeCA+IGJ1Zl9pbmZvLT5mcmFtZV9pZHgpKSl7CisgICAgICAgICAgICAgICAgLypzdXBlciBidWZmZXIgZnJhbWUgSURzIG1hdGNoaW5nIE9SIEluIGxvdyBwcmlvcml0eSBidW5kbGluZworICAgICAgICAgICAgICAgIG1ldGFkYXRhIGZyYW1lSUQgZ3JlYXRlciB0aGFuIGF2aWFsYmFsZSBzdXBlciBidWZmZXIgZnJhbWVJRCAgT1IKKyAgICAgICAgICAgICAgICBtZXRhZGF0YSBmcmFtZSBjbG9zZXN0IHRvIGluY29taW5nIGZyYW1lSUQgd2lsbCBiZSBidW5kbGVkKi8KKyAgICAgICAgICAgICAgICBmb3VuZF9zdXBlcl9idWYgPSAxOworICAgICAgICAgICAgICAgIC8qIElmIHdlIGFyZSBmaWxsaW5nIGludG8gYSAnbWV0YSBvbmx5JyBzdXBlcmJ1ZiwgbWFrZSBzdXJlIHRvIHJlc2V0CisgICAgICAgICAgICAgICAgdGhlIHN1cGVyX2J1ZiBmcmFtZV9pZHggc28gdGhhdCBtaXNzaW5nIHN0cmVhbXMgaW4gdGhpcyBzdXBlcmJ1ZgorICAgICAgICAgICAgICAgIGFyZSBmaWxsZWQgYXMgcGVyIG1hdGNoaW5nIGZyYW1lIGlkIGxvZ2ljLiBOb3RlIHRoYXQsIGluIGxvdyBwcmlvcml0eQorICAgICAgICAgICAgICAgIHF1ZXVlLCBvbmx5IG1ldGEgZnJhbWUgaWQgbmVlZCBub3QgbWF0Y2ggKGNsb3Nlc3Qgc3VmZmljZXMpIGJ1dAorICAgICAgICAgICAgICAgIHRoZSBvdGhlciBzdHJlYW1zIGluIHRoaXMgc3VwZXJidWYgc2hvdWxkIGhhdmUgc2FtZSBmcmFtZSBpZC4gKi8KKyAgICAgICAgICAgICAgICBpZiAoc3VwZXJfYnVmLT51bm1hdGNoZWRfbWV0YV9pZHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyX2J1Zi0+dW5tYXRjaGVkX21ldGFfaWR4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXJfYnVmLT5mcmFtZV9pZHggPSBidWZfaW5mby0+ZnJhbWVfaWR4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdW5tYXRjaGVkX2J1bmRsZXMrKzsKKyAgICAgICAgICAgICAgICBpZiAoIE5VTEwgPT0gbGFzdF9idWYgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3VwZXJfYnVmLT5mcmFtZV9pZHggPCBidWZfaW5mby0+ZnJhbWVfaWR4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9idWYgPSBwb3M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBOVUxMID09IGluc2VydF9iZWZvcmVfYnVmICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN1cGVyX2J1Zi0+ZnJhbWVfaWR4ID4gYnVmX2luZm8tPmZyYW1lX2lkeCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydF9iZWZvcmVfYnVmID0gcG9zOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvcyA9IHBvcy0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggZm91bmRfc3VwZXJfYnVmICkgeworICAgICAgICBpZihzdXBlcl9idWYtPnN1cGVyX2J1ZltidWZfc19pZHhdLmZyYW1lX2lkeCAhPSAwKSB7CisgICAgICAgICAgICAvL1RoaXMgY2FuIGNhdXNlIGZyYW1lIGRyb3AuIFdlIGFyZSBvdmVyd3JpdGluZyBzYW1lIG1lbW9yeS4KKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+cXVlLmxvY2spOworICAgICAgICAgICAgTE9HVygiV2FybmluZzogZnJhbWUgaXMgYWxyZWFkeSBpbiBjYW1lcmEgWlNMIHF1ZXVlIik7CisgICAgICAgICAgICBtbV9jaGFubmVsX3FidWYoY2hfb2JqLCBidWZfaW5mby0+YnVmKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLypJbnNlcnQgaW5jb21pbmcgYnVmZmVyIHRvIHN1cGVyIGJ1ZmZlciovCisgICAgICAgIHN1cGVyX2J1Zi0+c3VwZXJfYnVmW2J1Zl9zX2lkeF0gPSAqYnVmX2luZm87CisKKyAgICAgICAgLyogY2hlY2sgaWYgc3VwZXJidWYgaXMgYWxsIG1hdGNoZWQgKi8KKyAgICAgICAgc3VwZXJfYnVmLT5tYXRjaGVkID0gMTsKKyAgICAgICAgZm9yIChpPTA7IGkgPCBzdXBlcl9idWYtPm51bV9vZl9idWZzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdXBlcl9idWYtPnN1cGVyX2J1ZltpXS5mcmFtZV9pZHggPT0gMCkgeworICAgICAgICAgICAgICAgIHN1cGVyX2J1Zi0+bWF0Y2hlZCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3VwZXJfYnVmLT5tYXRjaGVkKSB7CisgICAgICAgICAgICBpZihjaF9vYmotPmlzRmxhc2hCcmFja2V0aW5nRW5hYmxlZCkgeworICAgICAgICAgICAgICAgcXVldWUtPmV4cGVjdGVkX2ZyYW1lX2lkID0KKyAgICAgICAgICAgICAgICAgICBxdWV1ZS0+ZXhwZWN0ZWRfZnJhbWVfaWRfd2l0aG91dF9sZWQ7CisgICAgICAgICAgICAgICBpZiAoYnVmX2luZm8tPmZyYW1lX2lkeCA+PQorICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+ZXhwZWN0ZWRfZnJhbWVfaWRfd2l0aG91dF9sZWQpIHsKKyAgICAgICAgICAgICAgICAgICBjaF9vYmotPmlzRmxhc2hCcmFja2V0aW5nRW5hYmxlZCA9IEZBTFNFOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZCA9IGJ1Zl9pbmZvLT5mcmFtZV9pZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcXVldWUtPmF0dHIucG9zdF9mcmFtZV9za2lwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdXBlcl9idWYtPmV4cGVjdGVkX2ZyYW1lID0gRkFMU0U7CisKKyAgICAgICAgICAgIExPR0QoImN1cnIgPSAlZCwgc2tpcCA9ICVkICwgRXhwZWN0ZWQgRnJhbWUgSUQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmZvLT5mcmFtZV9pZHgsCisgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT5hdHRyLnBvc3RfZnJhbWVfc2tpcCwgcXVldWUtPmV4cGVjdGVkX2ZyYW1lX2lkKTsKKworICAgICAgICAgICAgcXVldWUtPm1hdGNoX2NudCsrOworICAgICAgICAgICAgaWYgKGNoX29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLmF0dHIuZW5hYmxlX2ZyYW1lX3N5bmMpIHsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmZzX2xvY2spOworICAgICAgICAgICAgICAgIG1tX2ZyYW1lX3N5bmNfYWRkKGJ1Zl9pbmZvLT5mcmFtZV9pZHgsIGNoX29iaik7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmZzX2xvY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogQW55IG9sZGVyIHVubWF0Y2hlZCBidWZmZXIgbmVlZCB0byBiZSByZWxlYXNlZCAqLworICAgICAgICAgICAgaWYgKCBsYXN0X2J1ZiApIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIGxhc3RfYnVmICE9IHBvcyApIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG1lbWJlcl9vZihsYXN0X2J1ZiwgY2FtX25vZGVfdCwgbGlzdCk7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyX2J1ZiA9IChtbV9jaGFubmVsX3F1ZXVlX25vZGVfdCopbm9kZS0+ZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gc3VwZXJfYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxzdXBlcl9idWYtPm51bV9vZl9idWZzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VwZXJfYnVmLT5zdXBlcl9idWZbaV0uZnJhbWVfaWR4ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF9xYnVmKGNoX29iaiwgc3VwZXJfYnVmLT5zdXBlcl9idWZbaV0uYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+cXVlLnNpemUtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfYnVmID0gbGFzdF9idWYtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW1fbGlzdF9kZWxfbm9kZSgmbm9kZS0+bGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShzdXBlcl9idWYpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiSW52YWxpZCBzdXBlcmJ1ZiBpbiBxdWV1ZSEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICBpZiAoY2hfb2JqLT5kaXZlcnRlZF9mcmFtZV9pZCA9PSBidWZfaW5mby0+ZnJhbWVfaWR4KSB7CisgICAgICAgICAgICAgICAgc3VwZXJfYnVmLT5leHBlY3RlZF9mcmFtZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgY2hfb2JqLT5kaXZlcnRlZF9mcmFtZV9pZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHF1ZXVlLT5hdHRyLm1heF91bm1hdGNoZWRfZnJhbWVzIDwgdW5tYXRjaGVkX2J1bmRsZXMpCisgICAgICAgICAgICAgICAgJiYgKCBOVUxMID09IGxhc3RfYnVmICkpIHsKKyAgICAgICAgICAgIC8qIGluY29taW5nIGZyYW1lIGlzIG9sZGVyIHRoYW4gdGhlIGxhc3QgYnVuZGxlZCBvbmUgKi8KKyAgICAgICAgICAgIG1tX2NoYW5uZWxfcWJ1ZihjaF9vYmosIGJ1Zl9pbmZvLT5idWYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGFzdF9idWZfcHRyID0gbGFzdF9idWY7CisKKyAgICAgICAgICAgIC8qIExvb3AgdG8gcmVtb3ZlIHVubWF0Y2hlZCBmcmFtZXMgKi8KKyAgICAgICAgICAgIHdoaWxlICgocXVldWUtPmF0dHIubWF4X3VubWF0Y2hlZF9mcmFtZXMgPCB1bm1hdGNoZWRfYnVuZGxlcykKKyAgICAgICAgICAgICAgICAgICAgJiYgKGxhc3RfYnVmX3B0ciAhPSBOVUxMICYmIGxhc3RfYnVmX3B0ciAhPSBwb3MpKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IG1lbWJlcl9vZihsYXN0X2J1Zl9wdHIsIGNhbV9ub2RlX3QsIGxpc3QpOworICAgICAgICAgICAgICAgIHN1cGVyX2J1ZiA9IChtbV9jaGFubmVsX3F1ZXVlX25vZGVfdCopbm9kZS0+ZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBzdXBlcl9idWYgJiYgc3VwZXJfYnVmLT5leHBlY3RlZF9mcmFtZSA9PSBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCZub2RlLT5saXN0ICE9IGluc2VydF9iZWZvcmVfYnVmKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxzdXBlcl9idWYtPm51bV9vZl9idWZzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXBlcl9idWYtPnN1cGVyX2J1ZltpXS5mcmFtZV9pZHggIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfcWJ1ZihjaF9vYmosIHN1cGVyX2J1Zi0+c3VwZXJfYnVmW2ldLmJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcXVldWUtPnF1ZS5zaXplLS07CisgICAgICAgICAgICAgICAgICAgIGNhbV9saXN0X2RlbF9ub2RlKCZub2RlLT5saXN0KTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShzdXBlcl9idWYpOworICAgICAgICAgICAgICAgICAgICB1bm1hdGNoZWRfYnVuZGxlcy0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXN0X2J1Zl9wdHIgPSBsYXN0X2J1Zl9wdHItPm5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+YXR0ci5tYXhfdW5tYXRjaGVkX2ZyYW1lcyA8IHVubWF0Y2hlZF9idW5kbGVzKSB7CisgICAgICAgICAgICAgICAgbm9kZSA9IG1lbWJlcl9vZihsYXN0X2J1ZiwgY2FtX25vZGVfdCwgbGlzdCk7CisgICAgICAgICAgICAgICAgc3VwZXJfYnVmID0gKG1tX2NoYW5uZWxfcXVldWVfbm9kZV90Kilub2RlLT5kYXRhOworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPHN1cGVyX2J1Zi0+bnVtX29mX2J1ZnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3VwZXJfYnVmLT5zdXBlcl9idWZbaV0uZnJhbWVfaWR4ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfcWJ1ZihjaF9vYmosIHN1cGVyX2J1Zi0+c3VwZXJfYnVmW2ldLmJ1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcXVldWUtPnF1ZS5zaXplLS07CisgICAgICAgICAgICAgICAgY2FtX2xpc3RfZGVsX25vZGUoJm5vZGUtPmxpc3QpOworICAgICAgICAgICAgICAgIGZyZWUobm9kZSk7CisgICAgICAgICAgICAgICAgZnJlZShzdXBlcl9idWYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBpbnNlcnQgdGhlIG5ldyBmcmFtZSBhdCB0aGUgYXBwcm9wcmlhdGUgcG9zaXRpb24uICovCisKKyAgICAgICAgICAgIG1tX2NoYW5uZWxfcXVldWVfbm9kZV90ICpuZXdfYnVmID0gTlVMTDsKKyAgICAgICAgICAgIGNhbV9ub2RlX3QqIG5ld19ub2RlID0gTlVMTDsKKworICAgICAgICAgICAgbmV3X2J1ZiA9IChtbV9jaGFubmVsX3F1ZXVlX25vZGVfdCopbWFsbG9jKHNpemVvZihtbV9jaGFubmVsX3F1ZXVlX25vZGVfdCkpOworICAgICAgICAgICAgbmV3X25vZGUgPSAoY2FtX25vZGVfdCopbWFsbG9jKHNpemVvZihjYW1fbm9kZV90KSk7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBuZXdfYnVmICYmIE5VTEwgIT0gbmV3X25vZGUpIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQobmV3X2J1ZiwgMCwgc2l6ZW9mKG1tX2NoYW5uZWxfcXVldWVfbm9kZV90KSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG5ld19ub2RlLCAwLCBzaXplb2YoY2FtX25vZGVfdCkpOworICAgICAgICAgICAgICAgIG5ld19ub2RlLT5kYXRhID0gKHZvaWQgKiluZXdfYnVmOworICAgICAgICAgICAgICAgIG5ld19idWYtPm51bV9vZl9idWZzID0gcXVldWUtPm51bV9zdHJlYW1zOworICAgICAgICAgICAgICAgIG5ld19idWYtPnN1cGVyX2J1ZltidWZfc19pZHhdID0gKmJ1Zl9pbmZvOworICAgICAgICAgICAgICAgIG5ld19idWYtPmZyYW1lX2lkeCA9IGJ1Zl9pbmZvLT5mcmFtZV9pZHg7CisKKyAgICAgICAgICAgICAgICBpZiAoKGNoX29iai0+ZGl2ZXJ0ZWRfZnJhbWVfaWQgPT0gYnVmX2luZm8tPmZyYW1lX2lkeCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChidWZfaW5mby0+ZnJhbWVfaWR4ID09IHF1ZXVlLT5nb29kX2ZyYW1lX2lkKSkgeworICAgICAgICAgICAgICAgICAgICBuZXdfYnVmLT5leHBlY3RlZF9mcmFtZSA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgIGNoX29iai0+ZGl2ZXJ0ZWRfZnJhbWVfaWQgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIGVucXVldWUgKi8KKyAgICAgICAgICAgICAgICBpZiAoIGluc2VydF9iZWZvcmVfYnVmICkgeworICAgICAgICAgICAgICAgICAgICBjYW1fbGlzdF9pbnNlcnRfYmVmb3JlX25vZGUoJm5ld19ub2RlLT5saXN0LCBpbnNlcnRfYmVmb3JlX2J1Zik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2FtX2xpc3RfYWRkX3RhaWxfbm9kZSgmbmV3X25vZGUtPmxpc3QsICZxdWV1ZS0+cXVlLmhlYWQubGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHF1ZXVlLT5xdWUuc2l6ZSsrOworCisgICAgICAgICAgICAgICAgaWYocXVldWUtPm51bV9zdHJlYW1zID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3X2J1Zi0+bWF0Y2hlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIG5ld19idWYtPmV4cGVjdGVkX2ZyYW1lID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT5leHBlY3RlZF9mcmFtZV9pZCA9IGJ1Zl9pbmZvLT5mcmFtZV9pZHggKyBxdWV1ZS0+YXR0ci5wb3N0X2ZyYW1lX3NraXA7CisgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT5tYXRjaF9jbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoX29iai0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlLmF0dHIuZW5hYmxlX2ZyYW1lX3N5bmMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZnNfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBtbV9mcmFtZV9zeW5jX2FkZChidWZfaW5mby0+ZnJhbWVfaWR4LCBjaF9vYmopOworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmZzX2xvY2spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEluIGxvdyBwcmlvcml0eSBxdWV1ZSwgdGhpcyB3aWxsIGJlY29tZSBhICdtZXRhIG9ubHknIHN1cGVyYnVmLiBTZXQgdGhlCisgICAgICAgICAgICAgICAgdW5tYXRjaGVkX2ZyYW1lX2lkeCBzbyB0aGF0IHRoZSB1cGNvbWluZyBzdHJlYW0gYnVmZmVycyAob3RoZXIgdGhhbiBtZXRhKQorICAgICAgICAgICAgICAgIGNhbiBiZSBmaWxsZWQgaW50byB0aGlzIHdoaWNoIGFyZSBuZWFyZXN0IHRvIHRoaXMgaWR4LiAqLworICAgICAgICAgICAgICAgIGlmICgocXVldWUtPmF0dHIucHJpb3JpdHkgPT0gTU1fQ0FNRVJBX1NVUEVSX0JVRl9QUklPUklUWV9MT1cpCisgICAgICAgICAgICAgICAgICAgICYmIChidWZfaW5mby0+YnVmLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld19idWYtPnVubWF0Y2hlZF9tZXRhX2lkeCA9IGJ1Zl9pbmZvLT5mcmFtZV9pZHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBObyBtZW1vcnkgKi8KKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBuZXdfYnVmKSB7CisgICAgICAgICAgICAgICAgICAgIGZyZWUobmV3X2J1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChOVUxMICE9IG5ld19ub2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGZyZWUobmV3X25vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBxYnVmIHRoZSBuZXcgYnVmIHNpbmNlIHdlIGNhbm5vdCBlbnF1ZXVlICovCisgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF9xYnVmKGNoX29iaiwgYnVmX2luZm8tPmJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcXVldWUtPnF1ZS5sb2NrKTsKKyAgICBMT0dEKCJYIik7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF9zdXBlcmJ1Zl9kZXF1ZXVlX2ludGVybmFsCisgKgorICogREVTQ1JJUFRJT046IGludGVybmFsIGltcGxlbWVudGF0aW9uIGZvciBkZXF1ZXVlIGZyb20gdGhlIHN1cGVyYnVmIHF1ZXVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBxdWV1ZSAgIDogc3VwZXJidWYgcXVldWUKKyAqICAgQG1hdGNoZWRfb25seSA6IGlmIGRlcXVldWVkIGJ1ZiBzaG91bGQgYmUgbWF0Y2hlZAorICogICBAY2hfb2JqICA6IGNoYW5uZWwgb2JqZWN0CisgKgorICogUkVUVVJOICAgICA6IHB0ciB0byBhIG5vZGUgZnJvbSBzdXBlcmJ1ZiBxdWV1ZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCittbV9jaGFubmVsX3F1ZXVlX25vZGVfdCogbW1fY2hhbm5lbF9zdXBlcmJ1Zl9kZXF1ZXVlX2ludGVybmFsKAorICAgICAgICBtbV9jaGFubmVsX3F1ZXVlX3QgKiBxdWV1ZSwKKyAgICAgICAgdWludDhfdCBtYXRjaGVkX29ubHksIG1tX2NoYW5uZWxfdCAqY2hfb2JqKQoreworICAgIGNhbV9ub2RlX3QqIG5vZGUgPSBOVUxMOworICAgIHN0cnVjdCBjYW1fbGlzdCAqaGVhZCA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpwb3MgPSBOVUxMOworICAgIG1tX2NoYW5uZWxfcXVldWVfbm9kZV90KiBzdXBlcl9idWYgPSBOVUxMOworCisgICAgaGVhZCA9ICZxdWV1ZS0+cXVlLmhlYWQubGlzdDsKKyAgICBwb3MgPSBoZWFkLT5uZXh0OworICAgIGlmIChwb3MgIT0gaGVhZCkgeworICAgICAgICAvKiBnZXQgdGhlIGZpcnN0IG5vZGUgKi8KKyAgICAgICAgbm9kZSA9IG1lbWJlcl9vZihwb3MsIGNhbV9ub2RlX3QsIGxpc3QpOworICAgICAgICBzdXBlcl9idWYgPSAobW1fY2hhbm5lbF9xdWV1ZV9ub2RlX3QqKW5vZGUtPmRhdGE7CisgICAgICAgIGlmICggKE5VTEwgIT0gc3VwZXJfYnVmKSAmJgorICAgICAgICAgICAgIChtYXRjaGVkX29ubHkgPT0gVFJVRSkgJiYKKyAgICAgICAgICAgICAoc3VwZXJfYnVmLT5tYXRjaGVkID09IEZBTFNFKSApIHsKKyAgICAgICAgICAgIC8qIHJlcXVpcmUgdG8gZGVxdWV1ZSBtYXRjaGVkIGZyYW1lIG9ubHksIGJ1dCB0aGlzIHN1cGVyYnVmIGlzIG5vdCBtYXRjaGVkLAorICAgICAgICAgICAgICAgc2ltcGx5IHNldCByZXR1cm4gcHRyIHRvIE5VTEwgKi8KKyAgICAgICAgICAgIHN1cGVyX2J1ZiA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE5VTEwgIT0gc3VwZXJfYnVmKSB7CisgICAgICAgICAgICAvKiByZW1vdmUgZnJvbSB0aGUgcXVldWUgKi8KKyAgICAgICAgICAgIGNhbV9saXN0X2RlbF9ub2RlKCZub2RlLT5saXN0KTsKKyAgICAgICAgICAgIHF1ZXVlLT5xdWUuc2l6ZS0tOworICAgICAgICAgICAgaWYgKHN1cGVyX2J1Zi0+bWF0Y2hlZCA9PSBUUlVFKSB7CisgICAgICAgICAgICAgICAgcXVldWUtPm1hdGNoX2NudC0tOworICAgICAgICAgICAgICAgIGlmIChjaF9vYmotPmJ1bmRsZS5zdXBlcmJ1Zl9xdWV1ZS5hdHRyLmVuYWJsZV9mcmFtZV9zeW5jKSB7CisgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZnNfbG9jayk7CisgICAgICAgICAgICAgICAgICAgIG1tX2ZyYW1lX3N5bmNfcmVtb3ZlKHN1cGVyX2J1Zi0+ZnJhbWVfaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmZzX2xvY2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUobm9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3VwZXJfYnVmOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NoYW5uZWxfc3VwZXJidWZfZGVxdWV1ZV9mcmFtZV9pbnRlcm5hbAorICoKKyAqIERFU0NSSVBUSU9OOiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBmb3IgZGVxdWV1ZSBiYXNlZCBvbiBmcmFtZSBpbmRleAorICogICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBzdXBlcmJ1ZiBxdWV1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcXVldWUgICAgICAgOiBzdXBlcmJ1ZiBxdWV1ZQorICogICBAZnJhbWVfaWR4ICA6IGZyYW1lIGluZGV4IHRvIGJlIGRlcXVldWVkCisgKgorICogUkVUVVJOICAgICA6IHB0ciB0byBhIG5vZGUgZnJvbSBzdXBlcmJ1ZiBxdWV1ZSB3aXRoIG1hdGNoZWQgZnJhbWUgaW5kZXgKKyAqICAgICAgICAgICAgICAgIDogTlVMTCBpZiBub3QgZm91bmQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworbW1fY2hhbm5lbF9xdWV1ZV9ub2RlX3QqIG1tX2NoYW5uZWxfc3VwZXJidWZfZGVxdWV1ZV9mcmFtZV9pbnRlcm5hbCgKKyAgICAgICAgbW1fY2hhbm5lbF9xdWV1ZV90ICogcXVldWUsIHVpbnQzMl90IGZyYW1lX2lkeCkKK3sKKyAgICBjYW1fbm9kZV90KiBub2RlID0gTlVMTDsKKyAgICBzdHJ1Y3QgY2FtX2xpc3QgKmhlYWQgPSBOVUxMOworICAgIHN0cnVjdCBjYW1fbGlzdCAqcG9zID0gTlVMTDsKKyAgICBtbV9jaGFubmVsX3F1ZXVlX25vZGVfdCogc3VwZXJfYnVmID0gTlVMTDsKKworICAgIGlmICghcXVldWUpIHsKKyAgICAgICAgTE9HRSgicXVldWUgaXMgTlVMTCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBoZWFkID0gJnF1ZXVlLT5xdWUuaGVhZC5saXN0OworICAgIHBvcyA9IGhlYWQtPm5leHQ7CisgICAgTE9HTCgiU2VhcmNoaW5nIGZvciBtYXRjaCBmcmFtZSAlZCIsIGZyYW1lX2lkeCk7CisgICAgd2hpbGUgKChwb3MgIT0gaGVhZCkgJiYgKHBvcyAhPSBOVUxMKSkgeworICAgICAgICAvKiBnZXQgdGhlIGZpcnN0IG5vZGUgKi8KKyAgICAgICAgbm9kZSA9IG1lbWJlcl9vZihwb3MsIGNhbV9ub2RlX3QsIGxpc3QpOworICAgICAgICBzdXBlcl9idWYgPSAobW1fY2hhbm5lbF9xdWV1ZV9ub2RlX3QqKW5vZGUtPmRhdGE7CisgICAgICAgIGlmIChzdXBlcl9idWYgJiYgc3VwZXJfYnVmLT5tYXRjaGVkICYmCisgICAgICAgICAgICAgICAgKHN1cGVyX2J1Zi0+ZnJhbWVfaWR4ID09IGZyYW1lX2lkeCkpIHsKKyAgICAgICAgICAgIC8qIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZSAqLworICAgICAgICAgICAgY2FtX2xpc3RfZGVsX25vZGUoJm5vZGUtPmxpc3QpOworICAgICAgICAgICAgcXVldWUtPnF1ZS5zaXplLS07CisgICAgICAgICAgICBxdWV1ZS0+bWF0Y2hfY250LS07CisgICAgICAgICAgICBMT0dIKCJGb3VuZCBtYXRjaCBmcmFtZSAlZCIsIGZyYW1lX2lkeCk7CisgICAgICAgICAgICBmcmVlKG5vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMT0dIKCJtYXRjaCBmcmFtZSBub3QgZm91bmQgJWQiLCBmcmFtZV9pZHgpOworICAgICAgICAgICAgc3VwZXJfYnVmID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBwb3MgPSBwb3MtPm5leHQ7CisgICAgfQorICAgIHJldHVybiBzdXBlcl9idWY7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3N1cGVyYnVmX2RlcXVldWUKKyAqCisgKiBERVNDUklQVElPTjogZGVxdWV1ZSBmcm9tIHRoZSBzdXBlcmJ1ZiBxdWV1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcXVldWUgICA6IHN1cGVyYnVmIHF1ZXVlCisgKiAgIEBjaF9vYmogIDogY2hhbm5lbCBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogcHRyIHRvIGEgbm9kZSBmcm9tIHN1cGVyYnVmIHF1ZXVlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK21tX2NoYW5uZWxfcXVldWVfbm9kZV90KiBtbV9jaGFubmVsX3N1cGVyYnVmX2RlcXVldWUoCisgICAgICAgIG1tX2NoYW5uZWxfcXVldWVfdCAqIHF1ZXVlLCBtbV9jaGFubmVsX3QgKmNoX29iaikKK3sKKyAgICBtbV9jaGFubmVsX3F1ZXVlX25vZGVfdCogc3VwZXJfYnVmID0gTlVMTDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcXVldWUtPnF1ZS5sb2NrKTsKKyAgICBzdXBlcl9idWYgPSBtbV9jaGFubmVsX3N1cGVyYnVmX2RlcXVldWVfaW50ZXJuYWwocXVldWUsIFRSVUUsIGNoX29iaik7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnF1ZXVlLT5xdWUubG9jayk7CisKKyAgICByZXR1cm4gc3VwZXJfYnVmOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NoYW5uZWxfc3VwZXJidWZfYnVmZG9uZV9vdmVyZmxvdworICoKKyAqIERFU0NSSVBUSU9OOiBrZWVwIHN1cGVyYnVmIHF1ZXVlIG5vIGxhcmdlciB0aGFuIHdhdGVybWFyayBzZXQgYnkgdXBwZXIgbGF5ZXIKKyAqICAgICAgICAgICAgICB2aWEgY2hhbm5lbCBhdHRyaWJ1dGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgOiBjaGFubmVsIG9iamVjdAorICogICBAcXVldWUgICA6IHN1cGVyYnVmIHF1ZXVlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NoYW5uZWxfc3VwZXJidWZfYnVmZG9uZV9vdmVyZmxvdyhtbV9jaGFubmVsX3QqIG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfcXVldWVfdCAqIHF1ZXVlKQoreworICAgIGludDMyX3QgcmMgPSAwLCBpOworICAgIG1tX2NoYW5uZWxfcXVldWVfbm9kZV90KiBzdXBlcl9idWYgPSBOVUxMOworICAgIGlmIChNTV9DQU1FUkFfU1VQRVJfQlVGX05PVElGWV9DT05USU5VT1VTID09IHF1ZXVlLT5hdHRyLm5vdGlmeV9tb2RlKSB7CisgICAgICAgIC8qIGZvciBjb250aW51b3VzIHN0cmVhbWluZyBtb2RlLCBubyBvdmVyZmxvdyBpcyBuZWVkZWQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgTE9HRCgiYmVmb3JlIG1hdGNoX2NudD0lZCwgd2F0ZXJfbWFyaz0lZCIsCisgICAgICAgICAgcXVldWUtPm1hdGNoX2NudCwgcXVldWUtPmF0dHIud2F0ZXJfbWFyayk7CisgICAgLyogYnVmZG9uZSBvdmVyZmxvd2VkIGJ1ZnMgKi8KKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnF1ZXVlLT5xdWUubG9jayk7CisgICAgd2hpbGUgKHF1ZXVlLT5tYXRjaF9jbnQgPiBxdWV1ZS0+YXR0ci53YXRlcl9tYXJrKSB7CisgICAgICAgIHN1cGVyX2J1ZiA9IG1tX2NoYW5uZWxfc3VwZXJidWZfZGVxdWV1ZV9pbnRlcm5hbChxdWV1ZSwgVFJVRSwgbXlfb2JqKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gc3VwZXJfYnVmKSB7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxzdXBlcl9idWYtPm51bV9vZl9idWZzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBzdXBlcl9idWYtPnN1cGVyX2J1ZltpXS5idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF9xYnVmKG15X29iaiwgc3VwZXJfYnVmLT5zdXBlcl9idWZbaV0uYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKHN1cGVyX2J1Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnF1ZXVlLT5xdWUubG9jayk7CisgICAgTE9HRCgiYWZ0ZXIgbWF0Y2hfY250PSVkLCB3YXRlcl9tYXJrPSVkIiwKKyAgICAgICAgICBxdWV1ZS0+bWF0Y2hfY250LCBxdWV1ZS0+YXR0ci53YXRlcl9tYXJrKTsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3N1cGVyYnVmX3NraXAKKyAqCisgKiBERVNDUklQVElPTjogZGVwZW5kcyBvbiB0aGUgbG9va2JhY2sgY29uZmlndXJhdGlvbiBvZiB0aGUgY2hhbm5lbCBhdHRyaWJ1dGUsCisgKiAgICAgICAgICAgICAgdW53YW50ZWQgc3VwZXJidWZzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBzdXBlcmJ1ZiBxdWV1ZS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgOiBjaGFubmVsIG9iamVjdAorICogICBAcXVldWUgICA6IHN1cGVyYnVmIHF1ZXVlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NoYW5uZWxfc3VwZXJidWZfc2tpcChtbV9jaGFubmVsX3QqIG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfcXVldWVfdCAqIHF1ZXVlKQoreworICAgIGludDMyX3QgcmMgPSAwLCBpOworICAgIG1tX2NoYW5uZWxfcXVldWVfbm9kZV90KiBzdXBlcl9idWYgPSBOVUxMOworICAgIGlmIChNTV9DQU1FUkFfU1VQRVJfQlVGX05PVElGWV9DT05USU5VT1VTID09IHF1ZXVlLT5hdHRyLm5vdGlmeV9tb2RlKSB7CisgICAgICAgIC8qIGZvciBjb250aW51b3VzIHN0cmVhbWluZyBtb2RlLCBubyBza2lwIGlzIG5lZWRlZCAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBidWZkb25lIG92ZXJmbG93ZWQgYnVmcyAqLworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcXVldWUtPnF1ZS5sb2NrKTsKKyAgICB3aGlsZSAocXVldWUtPm1hdGNoX2NudCA+IHF1ZXVlLT5hdHRyLmxvb2tfYmFjaykgeworICAgICAgICBzdXBlcl9idWYgPSBtbV9jaGFubmVsX3N1cGVyYnVmX2RlcXVldWVfaW50ZXJuYWwocXVldWUsIFRSVUUsIG15X29iaik7CisgICAgICAgIGlmIChOVUxMICE9IHN1cGVyX2J1ZikgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8c3VwZXJfYnVmLT5udW1fb2ZfYnVmczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gc3VwZXJfYnVmLT5zdXBlcl9idWZbaV0uYnVmKSB7CisgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfcWJ1ZihteV9vYmosIHN1cGVyX2J1Zi0+c3VwZXJfYnVmW2ldLmJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShzdXBlcl9idWYpOworICAgICAgICB9CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+cXVlLmxvY2spOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NoYW5uZWxfc3VwZXJidWZfZmx1c2gKKyAqCisgKiBERVNDUklQVElPTjogZmx1c2ggdGhlIHN1cGVyYnVmIHF1ZXVlLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICA6IGNoYW5uZWwgb2JqZWN0CisgKiAgIEBxdWV1ZSAgIDogc3VwZXJidWYgcXVldWUKKyAqICAgQGNhbV90eXBlOiBmbHVzaCBvbmx5IHBhcnRpY3VsYXIgdHlwZSAoZGVmYXVsdCBmbHVzaGVzIGFsbCkKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9zdXBlcmJ1Zl9mbHVzaChtbV9jaGFubmVsX3QqIG15X29iaiwKKyAgICAgICAgbW1fY2hhbm5lbF9xdWV1ZV90ICogcXVldWUsIGNhbV9zdHJlYW1fdHlwZV90IGNhbV90eXBlKQoreworICAgIGludDMyX3QgcmMgPSAwLCBpOworICAgIG1tX2NoYW5uZWxfcXVldWVfbm9kZV90KiBzdXBlcl9idWYgPSBOVUxMOworICAgIGNhbV9zdHJlYW1fdHlwZV90IHN0cmVhbV90eXBlID0gQ0FNX1NUUkVBTV9UWVBFX0RFRkFVTFQ7CisKKyAgICAvKiBidWZkb25lIGJ1ZnMgKi8KKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnF1ZXVlLT5xdWUubG9jayk7CisgICAgc3VwZXJfYnVmID0gbW1fY2hhbm5lbF9zdXBlcmJ1Zl9kZXF1ZXVlX2ludGVybmFsKHF1ZXVlLCBGQUxTRSwgbXlfb2JqKTsKKyAgICB3aGlsZSAoc3VwZXJfYnVmICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpPTA7IGk8c3VwZXJfYnVmLT5udW1fb2ZfYnVmczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBzdXBlcl9idWYtPnN1cGVyX2J1ZltpXS5idWYpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1fdHlwZSA9IHN1cGVyX2J1Zi0+c3VwZXJfYnVmW2ldLmJ1Zi0+c3RyZWFtX3R5cGU7CisgICAgICAgICAgICAgICAgaWYgKChDQU1fU1RSRUFNX1RZUEVfREVGQVVMVCA9PSBjYW1fdHlwZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjYW1fdHlwZSA9PSBzdHJlYW1fdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbW1fY2hhbm5lbF9xYnVmKG15X29iaiwgc3VwZXJfYnVmLT5zdXBlcl9idWZbaV0uYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJlZShzdXBlcl9idWYpOworICAgICAgICBzdXBlcl9idWYgPSBtbV9jaGFubmVsX3N1cGVyYnVmX2RlcXVldWVfaW50ZXJuYWwocXVldWUsIEZBTFNFLCBteV9vYmopOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcXVldWUtPnF1ZS5sb2NrKTsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3Byb2NfZ2VuZXJhbF9jbWQKKyAqCisgKiBERVNDUklQVElPTjogcHJvY2VzcyBnZW5lcmFsIGNvbW1hbmQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgOiBjaGFubmVsIG9iamVjdAorICogICBAbm90aWZ5X21vZGUgOiBub3RpZmljYXRpb24gbW9kZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jaGFubmVsX3Byb2NfZ2VuZXJhbF9jbWQobW1fY2hhbm5lbF90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9nZW5lcmljX2NtZF90ICpwX2dlbl9jbWQpCit7CisgICAgTE9HRCgiRSIpOworICAgIGludDMyX3QgcmMgPSAwOworICAgIG1tX2NhbWVyYV9jbWRjYl90KiBub2RlID0gTlVMTDsKKworICAgIG5vZGUgPSAobW1fY2FtZXJhX2NtZGNiX3QgKiltYWxsb2Moc2l6ZW9mKG1tX2NhbWVyYV9jbWRjYl90KSk7CisgICAgaWYgKE5VTEwgIT0gbm9kZSkgeworICAgICAgICBtZW1zZXQobm9kZSwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9jbWRjYl90KSk7CisgICAgICAgIG5vZGUtPnUuZ2VuX2NtZCA9ICpwX2dlbl9jbWQ7CisgICAgICAgIG5vZGUtPmNtZF90eXBlID0gTU1fQ0FNRVJBX0NNRF9UWVBFX0dFTkVSQUw7CisKKyAgICAgICAgLyogZW5xdWV1ZSB0byBjbWQgdGhyZWFkICovCisgICAgICAgIGNhbV9xdWV1ZV9lbnEoJihteV9vYmotPmNtZF90aHJlYWQuY21kX3F1ZXVlKSwgbm9kZSk7CisKKyAgICAgICAgLyogd2FrZSB1cCBjbWQgdGhyZWFkICovCisgICAgICAgIGNhbV9zZW1fcG9zdCgmKG15X29iai0+Y21kX3RocmVhZC5jbWRfc2VtKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBtbV9jYW1lcmFfbm9kZV90Iik7CisgICAgICAgIHJjID0gLTE7CisgICAgfQorICAgIExPR0QoIlgiKTsKKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jaGFubmVsX3N1cGVyYnVmX2ZsdXNoX21hdGNoZWQKKyAqCisgKiBERVNDUklQVElPTjogZmx1c2ggbWF0Y2hlZCBidWZmZXJzIGZyb20gdGhlIHN1cGVyYnVmIHF1ZXVlLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICA6IGNoYW5uZWwgb2JqZWN0CisgKiAgIEBxdWV1ZSAgIDogc3VwZXJidWYgcXVldWUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2hhbm5lbF9zdXBlcmJ1Zl9mbHVzaF9tYXRjaGVkKG1tX2NoYW5uZWxfdCogbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NoYW5uZWxfcXVldWVfdCAqIHF1ZXVlKQoreworICAgIGludDMyX3QgcmMgPSAwLCBpOworICAgIG1tX2NoYW5uZWxfcXVldWVfbm9kZV90KiBzdXBlcl9idWYgPSBOVUxMOworCisgICAgLyogYnVmZG9uZSBidWZzICovCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZxdWV1ZS0+cXVlLmxvY2spOworICAgIHN1cGVyX2J1ZiA9IG1tX2NoYW5uZWxfc3VwZXJidWZfZGVxdWV1ZV9pbnRlcm5hbChxdWV1ZSwgVFJVRSwgbXlfb2JqKTsKKyAgICB3aGlsZSAoc3VwZXJfYnVmICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpPTA7IGk8c3VwZXJfYnVmLT5udW1fb2ZfYnVmczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBzdXBlcl9idWYtPnN1cGVyX2J1ZltpXS5idWYpIHsKKyAgICAgICAgICAgICAgICBtbV9jaGFubmVsX3FidWYobXlfb2JqLCBzdXBlcl9idWYtPnN1cGVyX2J1ZltpXS5idWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyZWUoc3VwZXJfYnVmKTsKKyAgICAgICAgc3VwZXJfYnVmID0gbW1fY2hhbm5lbF9zdXBlcmJ1Zl9kZXF1ZXVlX2ludGVybmFsKHF1ZXVlLCBUUlVFLCBteV9vYmopOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcXVldWUtPnF1ZS5sb2NrKTsKKworICAgIHJldHVybiByYzsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2ZyYW1lX3N5bmNfcmVzZXQKKyAqCisgKiBERVNDUklQVElPTjogUmVzZXQgRnJhbWUgc3luYyBpbmZvCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBtbV9mcmFtZV9zeW5jX3Jlc2V0KCkgeworICAgIG1lbXNldCgmZnMsIDB4MCwgc2l6ZW9mKGZzKSk7CisgICAgTE9HRCgiUmVzZXQgRG9uZSIpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2ZyYW1lX3N5bmNfcmVnaXN0ZXJfY2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBSZWdpc3RlciBDaGFubmVsIGZvciBmcmFtZSBzeW5jCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjaF9vYmogIDogY2hhbm5lbCBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fZnJhbWVfc3luY19yZWdpc3Rlcl9jaGFubmVsKG1tX2NoYW5uZWxfdCAqY2hfb2JqKSB7CisgICAgLy8gTG9jayBmcmFtZSBzeW5jIGluZm8KKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmZzX2xvY2spOworICAgIGlmICgoZnMubnVtX2NhbSA+PSBNQVhfTlVNX0NBTUVSQV9QRVJfQlVORExFKSB8fCAoIWNoX29iaikpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IhISBudW0gY2FtKCVkKSBpcyBvdXQgb2YgcmFuZ2UgIiwKKyAgICAgICAgICAgICAgICAgZnMubnVtX2NhbSk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZmc19sb2NrKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoZnMubnVtX2NhbSA9PSAwKSB7CisgICAgICAgIExPR0goIkZpcnN0IGNoYW5uZWwgcmVnaXN0ZXJpbmchISIpOworICAgICAgICBtbV9mcmFtZV9zeW5jX3Jlc2V0KCk7CisgICAgfQorICAgIHVpbnQ4X3QgaSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fQ0FNRVJBX1BFUl9CVU5ETEU7IGkrKykgeworICAgICAgICBpZiAoZnMuY2hfb2JqW2ldID09IE5VTEwpIHsKKyAgICAgICAgICAgIGZzLmNoX29ialtpXSA9IGNoX29iajsKKyAgICAgICAgICAgIGZzLmNiW2ldID0gY2hfb2JqLT5idW5kbGUuc3VwZXJfYnVmX25vdGlmeV9jYjsKKyAgICAgICAgICAgIGZzLm51bV9jYW0rKzsKKyAgICAgICAgICAgIExPR0QoIkRCR19GUyBpbmRleCAlZCIsIGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPj0gTUFYX05VTV9DQU1FUkFfUEVSX0JVTkRMRSkgeworICAgICAgICBMT0dIKCJYLCBEQkdfRlMgQ2Fubm90IHJlZ2lzdGVyIGNoYW5uZWwhISIpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZnNfbG9jayk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgTE9HSCgibnVtX2NhbSAlZCAiLCBmcy5udW1fY2FtKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZnNfbG9jayk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fZnJhbWVfc3luY191bnJlZ2lzdGVyX2NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogdW4tcmVnaXN0ZXIgQ2hhbm5lbCBmb3IgZnJhbWUgc3luYworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2hfb2JqICA6IGNoYW5uZWwgb2JqZWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2ZyYW1lX3N5bmNfdW5yZWdpc3Rlcl9jaGFubmVsKG1tX2NoYW5uZWxfdCAqY2hfb2JqKSB7CisgICAgdWludDhfdCBpID0gMDsKKyAgICAvLyBMb2NrIGZyYW1lIHN5bmMgaW5mbworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZnNfbG9jayk7CisgICAgaWYgKCFmcy5udW1fY2FtIHx8ICFjaF9vYmopIHsKKyAgICAgICAgTE9HSCgiWCwgREJHX0ZTOiBjaGFubmVsIG5vdCBmb3VuZCAgISEiKTsKKyAgICAgICAgLy8gTG9jayBmcmFtZSBzeW5jIGluZm8KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmZzX2xvY2spOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0NBTUVSQV9QRVJfQlVORExFOyBpKyspIHsKKyAgICAgICAgaWYgKGZzLmNoX29ialtpXSA9PSBjaF9vYmopIHsKKyAgICAgICAgICAgIExPR0QoImZvdW5kIGNoX29iaiBhdCBpICglZCkgIiwgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA8IE1BWF9OVU1fQ0FNRVJBX1BFUl9CVU5ETEUpIHsKKyAgICAgICAgTE9HRCgicmVtb3ZlIGNoYW5uZWwgaW5mbyAiKTsKKyAgICAgICAgZnMuY2hfb2JqW2ldID0gTlVMTDsKKyAgICAgICAgZnMuY2JbaV0gPSBOVUxMOworICAgICAgICBmcy5udW1fY2FtLS07CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiREJHX0ZTIENoYW5uZWwgbm90IGZvdW5kICIpOworICAgIH0KKyAgICBpZiAoZnMubnVtX2NhbSA9PSAwKSB7CisgICAgICAgIG1tX2ZyYW1lX3N5bmNfcmVzZXQoKTsKKyAgICB9CisgICAgTE9HSCgiWCwgZnMubnVtX2NhbSAlZCIsIGZzLm51bV9jYW0pOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZmc19sb2NrKTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2ZyYW1lX3N5bmNfYWRkCisgKgorICogREVTQ1JJUFRJT046IEFkZCBmcmFtZSBpbmZvIGludG8gZnJhbWUgc3luYyBub2RlcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZnJhbWVfaWQgIDogZnJhbWUgaWQgdG8gYmUgYWRkZWQKKyAqICAgQGNoX29iaiAgOiBjaGFubmVsIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9mcmFtZV9zeW5jX2FkZCh1aW50MzJfdCBmcmFtZV9pZCwgbW1fY2hhbm5lbF90ICpjaF9vYmopIHsKKworICAgIExPR0QoIkUsIGZyYW1lIGlkICVkIGNoX29iaiAlcCIsIGZyYW1lX2lkLCBjaF9vYmopOworICAgIGlmICghZnJhbWVfaWQgfHwgIWNoX29iaikgeworICAgICAgICBMT0dIKCJYIDogRXJyb3IsIGNhbm5vdCBhZGQgc3luYyBmcmFtZSAhISIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50OF90IGNoX2lkeCA9IC0xOworICAgIHVpbnQ4X3QgaSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fQ0FNRVJBX1BFUl9CVU5ETEU7IGkrKykgeworICAgICAgICBpZiAoZnMuY2hfb2JqW2ldID09IGNoX29iaikgeworICAgICAgICAgICAgY2hfaWR4ID0gaTsKKyAgICAgICAgICAgIExPR0QoImNoIGlkICVkICIsIGNoX2lkeCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY2hfaWR4IDwgMCkgeworICAgICAgICBMT0dIKCJYIDogREJHX0ZTIGNoIG5vdCBmb3VuZCEhIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW50OF90IGluZGV4ID0gbW1fZnJhbWVfc3luY19maW5kX2ZyYW1lX2luZGV4KGZyYW1lX2lkKTsKKyAgICBpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IE1NX0NBTUVSQV9GUkFNRV9TWU5DX05PREVTKSkgeworICAgICAgICBmcy5ub2RlW2luZGV4XS5mcmFtZV92YWxpZFtjaF9pZHhdID0gMTsKKyAgICB9IGVsc2UgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBpZiAoZnMucG9zID49IE1NX0NBTUVSQV9GUkFNRV9TWU5DX05PREVTKSB7CisgICAgICAgICAgICBmcy5wb3MgPSAwOworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gZnMucG9zOworICAgICAgICBtZW1zZXQoJmZzLm5vZGVbaW5kZXhdLCAweDAwLCBzaXplb2YobW1fY2hhbm5lbF9zeW5jX25vZGVfdCkpOworICAgICAgICBmcy5wb3MrKzsKKyAgICAgICAgZnMubm9kZVtpbmRleF0uZnJhbWVfaWR4ID0gZnJhbWVfaWQ7CisgICAgICAgIGZzLm5vZGVbaW5kZXhdLmZyYW1lX3ZhbGlkW2NoX2lkeF0gPSAxOworICAgICAgICBpZiAoZnMubnVtX2NhbSA9PSAxKSB7CisgICAgICAgICAgICBMT0dEKCJTaW5nbGUgY2FtZXJhIGZyYW1lICVkICwgbWF0Y2hlZCAiLCBmcmFtZV9pZCk7CisgICAgICAgICAgICBmcy5ub2RlW2luZGV4XS5tYXRjaGVkID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50OF90IGZyYW1lc192YWxpZCA9IDA7CisgICAgaWYgKCFmcy5ub2RlW2luZGV4XS5tYXRjaGVkKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0NBTUVSQV9QRVJfQlVORExFOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmcy5ub2RlW2luZGV4XS5mcmFtZV92YWxpZFtpXSkgeworICAgICAgICAgICAgICAgIGZyYW1lc192YWxpZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmcmFtZXNfdmFsaWQgPT0gZnMubnVtX2NhbSkgeworICAgICAgICAgICAgZnMubm9kZVtpbmRleF0ubWF0Y2hlZCA9IDE7CisgICAgICAgICAgICBMT0dEKCJkdWFsIGNhbWVyYSBmcmFtZSAlZCAsIG1hdGNoZWQgIiwKKyAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2lkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9mcmFtZV9zeW5jX3JlbW92ZQorICoKKyAqIERFU0NSSVBUSU9OOiBSZW1vdmUgZnJhbWUgaW5mbyBmcm9tIGZyYW1lIHN5bmMgbm9kZXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZyYW1lX2lkICA6IGZyYW1lIGlkIHRvIGJlIHJlbW92ZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fZnJhbWVfc3luY19yZW1vdmUodWludDMyX3QgZnJhbWVfaWQpIHsKKyAgICBpbnQ4X3QgaW5kZXggPSAtMTsKKworICAgIExPR0QoIkUsIGZyYW1lX2lkICVkIiwgZnJhbWVfaWQpOworICAgIGlmICghZnJhbWVfaWQpIHsKKyAgICAgICAgTE9HRSgiWCwgREJHX0ZTIGZyYW1lIGlkIGludmFsaWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGluZGV4ID0gbW1fZnJhbWVfc3luY19maW5kX2ZyYW1lX2luZGV4KGZyYW1lX2lkKTsKKyAgICBpZiAoKGluZGV4ID49IDApICYmIChpbmRleCA8IE1NX0NBTUVSQV9GUkFNRV9TWU5DX05PREVTKSkgeworICAgICAgICBMT0dEKCJSZW1vdmluZyBzeW5jIGZyYW1lICVkIiwgZnJhbWVfaWQpOworICAgICAgICBtZW1zZXQoJmZzLm5vZGVbaW5kZXhdLCAweDAwLCBzaXplb2YobW1fY2hhbm5lbF9zeW5jX25vZGVfdCkpOworICAgIH0KKyAgICBMT0dEKCJYICIpOworICAgIHJldHVybiAwOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2ZyYW1lX3N5bmNfZmluZF9tYXRjaGVkCisgKgorICogREVTQ1JJUFRJT046IEZpbmQgIGEgbWF0Y2hlZCBzeW5jIGZyYW1lIGZyb20gdGhlIG5vZGUgYXJyYXkKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG9sZGVzdCAgOiBJZiBlbmFibGVkLCBmaW5kIG9sZGVzdCBtYXRjaGVkIGZyYW1lLiwKKyAqICAgICAgICAgICAgICAgICAgSWYgbm90IGVuYWJsZWQsIGdldCB0aGUgZmlyc3QgbWF0Y2hlZCBmcmFtZSBmb3VuZAorICoKKyAqIFJFVFVSTiAgICAgOiB1bnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gSWYgbm8gbWF0Y2hlZCBmcmFtZXMgZm91bmQKKyAqICAgICAgICAgICAgICBmcmFtZSBpbmRleDogaW5mIG1hdGNoZWQgZnJhbWUgZm91bmQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgbW1fZnJhbWVfc3luY19maW5kX21hdGNoZWQodWludDhfdCBvbGRlc3QpIHsKKyAgICBMT0dIKCJFLCBvbGRlc3QgJWQgIiwgb2xkZXN0KTsKKyAgICB1aW50OF90IGkgPSAwOworICAgIHVpbnQzMl90IGZyYW1lX2lkeCA9IDA7CisgICAgdWludDMyX3QgY3Vycl9mcmFtZV9pZHggPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBNTV9DQU1FUkFfRlJBTUVfU1lOQ19OT0RFUzsgaSsrKSB7CisgICAgICAgIGlmIChmcy5ub2RlW2ldLm1hdGNoZWQpIHsKKyAgICAgICAgICAgIGN1cnJfZnJhbWVfaWR4ID0gZnMubm9kZVtpXS5mcmFtZV9pZHg7CisgICAgICAgICAgICBpZiAoIWZyYW1lX2lkeCkgeworICAgICAgICAgICAgICAgIGZyYW1lX2lkeCA9IGN1cnJfZnJhbWVfaWR4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFvbGRlc3QpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVfaWR4ID4gY3Vycl9mcmFtZV9pZHgpIHsKKyAgICAgICAgICAgICAgICBmcmFtZV9pZHggPSBjdXJyX2ZyYW1lX2lkeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dIKCJYLCBvbGRlc3QgJWQgZnJhbWUgaWR4ICVkIiwgb2xkZXN0LCBmcmFtZV9pZHgpOworICAgIHJldHVybiBmcmFtZV9pZHg7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fZnJhbWVfc3luY19maW5kX2ZyYW1lX2luZGV4CisgKgorICogREVTQ1JJUFRJT046IEZpbmQgc3luYyBmcmFtZSBpbmRleCBpZiBwcmVzZW50CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmcmFtZV9pZCAgOiBmcmFtZSBpZCB0byBiZSBzZWFyY2hlZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQ4X3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAtMSAgLS0gSWYgZGVzaXJlZCBmcmFtZSBub3QgZm91bmQKKyAqICAgICAgICAgICAgICBpbmRleDogbm9kZSBhcnJheSBpbmRleCBpZiBmcmFtZSBpcyBmb3VuZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQ4X3QgbW1fZnJhbWVfc3luY19maW5kX2ZyYW1lX2luZGV4KHVpbnQzMl90IGZyYW1lX2lkKSB7CisKKyAgICBMT0dEKCJFLCBmcmFtZV9pZCAlZCIsIGZyYW1lX2lkKTsKKyAgICBpbnQ4X3QgaW5kZXggPSAtMSwgaSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IE1NX0NBTUVSQV9GUkFNRV9TWU5DX05PREVTOyBpKyspIHsKKyAgICAgICAgaWYgKGZzLm5vZGVbaV0uZnJhbWVfaWR4ID09IGZyYW1lX2lkKSB7CisgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dEKCJYIGluZGV4IDolZCIsIGluZGV4KTsKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fZnJhbWVfc3luY19sb2NrX3F1ZXVlcworICoKKyAqIERFU0NSSVBUSU9OOiBMb2NrIGFsbCBjaGFubmVsIHF1ZXVlcyBwcmVzZW50IGluIG5vZGUgaW5mbworICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgbW1fZnJhbWVfc3luY19sb2NrX3F1ZXVlcygpIHsKKyAgICB1aW50OF90IGogPSAwOworICAgIExPR0QoIkUgIik7CisgICAgZm9yIChqID0gMDsgaiA8IE1BWF9OVU1fQ0FNRVJBX1BFUl9CVU5ETEU7IGorKykgeworICAgICAgICBpZiAoZnMuY2hfb2JqW2pdKSB7CisgICAgICAgICAgICBtbV9jaGFubmVsX3F1ZXVlX3QgKmNoX3F1ZXVlID0KKyAgICAgICAgICAgICAgICAgICAgJmZzLmNoX29ialtqXS0+YnVuZGxlLnN1cGVyYnVmX3F1ZXVlOworICAgICAgICAgICAgaWYgKGNoX3F1ZXVlKSB7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjaF9xdWV1ZS0+cXVlLmxvY2spOworICAgICAgICAgICAgICAgIExPR0woIkRvbmUgbG9ja2luZyBmcy5jaF9vYmpbJWRdICIsIGopOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZnNfbG9jayk7CisgICAgTE9HRCgiWCAiKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9mcmFtZV9zeW5jX3VubG9ja19xdWV1ZXMKKyAqCisgKiBERVNDUklQVElPTjogVW5sb2NrIGFsbCBjaGFubmVsIHF1ZXVlcworICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgbW1fZnJhbWVfc3luY191bmxvY2tfcXVldWVzKCkgeworICAgIC8vIFVubG9jayBhbGwgcXVldWVzCisgICAgdWludDhfdCBqID0gMDsKKyAgICBMT0dEKCJFICIpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZmc19sb2NrKTsKKyAgICBMT0dMKCJEb25lIHVubG9ja2luZyBmcyAiKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgTUFYX05VTV9DQU1FUkFfUEVSX0JVTkRMRTsgaisrKSB7CisgICAgICAgIGlmIChmcy5jaF9vYmpbal0pIHsKKyAgICAgICAgICAgIG1tX2NoYW5uZWxfcXVldWVfdCAqY2hfcXVldWUgPQorICAgICAgICAgICAgICAgICAgICAmZnMuY2hfb2JqW2pdLT5idW5kbGUuc3VwZXJidWZfcXVldWU7CisgICAgICAgICAgICBpZiAoY2hfcXVldWUpIHsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY2hfcXVldWUtPnF1ZS5sb2NrKTsKKyAgICAgICAgICAgICAgICBMT0dMKCJEb25lIHVubG9ja2luZyBmcy5jaF9vYmpbJWRdICIsIGopOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIExPR0QoIlggIik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2hhbm5lbF9ub2RlX3FidWYKKyAqCisgKiBERVNDUklQVElPTjogcWJ1ZiBhbGwgYnVmZmVycyBpbiBhIG5vZGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNoX29iaiAgOiBDaGFubmVsIGluZm8KKyAqICAgQG5vZGUgICAgOiBub2RlIHRvIHFidWYKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIG1tX2NoYW5uZWxfbm9kZV9xYnVmKG1tX2NoYW5uZWxfdCAqY2hfb2JqLCBtbV9jaGFubmVsX3F1ZXVlX25vZGVfdCAqbm9kZSkgeworICAgIHVpbnQ4X3QgaTsKKyAgICBpZiAoIWNoX29iaiB8fCAhbm9kZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBub2RlLT5udW1fb2ZfYnVmczsgaSsrKSB7CisgICAgICAgIG1tX2NoYW5uZWxfcWJ1ZihjaF9vYmosIG5vZGUtPnN1cGVyX2J1ZltpXS5idWYpOworICAgIH0KKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9zcmMvbW1fY2FtZXJhX2ludGVyZmFjZS5jIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2Uvc3JjL21tX2NhbWVyYV9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQ5YWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2Uvc3JjL21tX2NhbWVyYV9pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDIyNTcgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLy8gVG8gcmVtb3ZlCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGludXgvbWVkaWEuaD4KKyNpbmNsdWRlIDxtZWRpYS9tc21fY2FtX3NlbnNvci5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisKKyNkZWZpbmUgSU9DVExfSCA8U1lTVEVNX0hFQURFUl9QUkVGSVgvaW9jdGwuaD4KKyNpbmNsdWRlIElPQ1RMX0gKKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKKyNpbmNsdWRlICJtbV9jYW1lcmFfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibW1fY2FtZXJhLmgiCisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgZ19pbnRmX2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworCitzdGF0aWMgbW1fY2FtZXJhX2N0cmxfdCBnX2NhbV9jdHJsOworCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdfaGFuZGxlcl9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyB1aW50MTZfdCBnX2hhbmRsZXJfaGlzdG9yeV9jb3VudCA9IDA7IC8qIGhpc3RvcnkgY291bnQgZm9yIGhhbmRsZXIgKi8KKworLy8gMTZ0aCAoc3RhcnRpbmcgZnJvbSAwKSBiaXQgdGVsbHMgaXRzIGEgQkFDSyBvciBGUk9OVCBjYW1lcmEKKyNkZWZpbmUgQ0FNX1NFTlNPUl9GQUNJTkdfTUFTSyAoMVU8PDE2KQorLy8gMjR0aCAoc3RhcnRpbmcgZnJvbSAwKSBiaXQgdGVsbHMgaXRzIGEgTUFJTiBvciBBVVggY2FtZXJhCisjZGVmaW5lIENBTV9TRU5TT1JfVFlQRV9NQVNLICgxVTw8MjQpCisvLyAyNXRoIChzdGFydGluZyBmcm9tIDApIGJpdCB0ZWxscyBpdHMgWVVWIHNlbnNvciBvciBub3QKKyNkZWZpbmUgQ0FNX1NFTlNPUl9GT1JNQVRfTUFTSyAoMVU8PDI1KQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV91dGlsX2dlbmVyYXRlX2hhbmRsZXIKKyAqCisgKiBERVNDUklQVElPTjogdXRpbGl0eSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBoYW5kbGVyIGZvciBjYW1lcmEvY2hhbm5lbC9zdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGluZGV4OiBpbmRleCBvZiB0aGUgb2JqZWN0IHRvIGhhdmUgaGFuZGxlcgorICoKKyAqIFJFVFVSTiAgICAgOiB1aW50MzJfdCB0eXBlIG9mIGhhbmRsZSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBvYmplY3QKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgbW1fY2FtZXJhX3V0aWxfZ2VuZXJhdGVfaGFuZGxlcih1aW50OF90IGluZGV4KQoreworICAgIHVpbnQzMl90IGhhbmRsZXIgPSAwOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19oYW5kbGVyX2xvY2spOworICAgIGdfaGFuZGxlcl9oaXN0b3J5X2NvdW50Kys7CisgICAgaWYgKDAgPT0gZ19oYW5kbGVyX2hpc3RvcnlfY291bnQpIHsKKyAgICAgICAgZ19oYW5kbGVyX2hpc3RvcnlfY291bnQrKzsKKyAgICB9CisgICAgaGFuZGxlciA9IGdfaGFuZGxlcl9oaXN0b3J5X2NvdW50OworICAgIGhhbmRsZXIgPSAoaGFuZGxlcjw8OCkgfCBpbmRleDsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19oYW5kbGVyX2xvY2spOworICAgIHJldHVybiBoYW5kbGVyOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV91dGlsX2dldF9pbmRleF9ieV9oYW5kbGVyCisgKgorICogREVTQ1JJUFRJT046IHV0aWxpdHkgZnVuY3Rpb24gdG8gZ2V0IGluZGV4IGZyb20gaGFuZGxlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBoYW5kbGVyOiBvYmplY3QgaGFuZGxlCisgKgorICogUkVUVVJOICAgICA6IHVpbnQ4X3QgdHlwZSBvZiBpbmRleCBkZXJpdmVkIGZyb20gaGFuZGxlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQ4X3QgbW1fY2FtZXJhX3V0aWxfZ2V0X2luZGV4X2J5X2hhbmRsZXIodWludDMyX3QgaGFuZGxlcikKK3sKKyAgICByZXR1cm4gKGhhbmRsZXImMHgwMDAwMDBmZik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3V0aWxfZ2V0X2Rldl9uYW1lCisgKgorICogREVTQ1JJUFRJT046IHV0aWxpdHkgZnVuY3Rpb24gdG8gZ2V0IGRldmljZSBuYW1lIGZyb20gY2FtZXJhIGhhbmRsZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiBjaGFyIHB0ciB0byB0aGUgZGV2aWNlIG5hbWUgc3RvcmVkIGluIGdsb2JhbCB2YXJpYWJsZQorICogTk9URSAgICAgICA6IGNhbGxlciBzaG91bGQgbm90IGZyZWUgdGhlIGNoYXIgcHRyCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2NvbnN0IGNoYXIgKm1tX2NhbWVyYV91dGlsX2dldF9kZXZfbmFtZSh1aW50MzJfdCBjYW1faGFuZGxlKQoreworICAgIGNoYXIgKmRldl9uYW1lID0gTlVMTDsKKyAgICB1aW50OF90IGNhbV9pZHggPSBtbV9jYW1lcmFfdXRpbF9nZXRfaW5kZXhfYnlfaGFuZGxlcihjYW1faGFuZGxlKTsKKyAgICBpZihjYW1faWR4IDwgTU1fQ0FNRVJBX01BWF9OVU1fU0VOU09SUykgeworICAgICAgICBkZXZfbmFtZSA9IGdfY2FtX2N0cmwudmlkZW9fZGV2X25hbWVbY2FtX2lkeF07CisgICAgfQorICAgIHJldHVybiBkZXZfbmFtZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X2hhbmRsZXIKKyAqCisgKiBERVNDUklQVElPTjogdXRpbGl0eSBmdW5jdGlvbiB0byBnZXQgY2FtZXJhIG9iamVjdCBmcm9tIGNhbWVyYSBoYW5kbGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbV9oYW5kbGU6IGNhbWVyYSBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogcHRyIHRvIHRoZSBjYW1lcmEgb2JqZWN0IHN0b3JlZCBpbiBnbG9iYWwgdmFyaWFibGUKKyAqIE5PVEUgICAgICAgOiBjYWxsZXIgc2hvdWxkIG5vdCBmcmVlIHRoZSBjYW1lcmEgb2JqZWN0IHB0cgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCittbV9jYW1lcmFfb2JqX3QqIG1tX2NhbWVyYV91dGlsX2dldF9jYW1lcmFfYnlfaGFuZGxlcih1aW50MzJfdCBjYW1faGFuZGxlKQoreworICAgIG1tX2NhbWVyYV9vYmpfdCAqY2FtX29iaiA9IE5VTEw7CisgICAgdWludDhfdCBjYW1faWR4ID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2luZGV4X2J5X2hhbmRsZXIoY2FtX2hhbmRsZSk7CisKKyAgICBpZiAoY2FtX2lkeCA8IE1NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlMgJiYKKyAgICAgICAgKE5VTEwgIT0gZ19jYW1fY3RybC5jYW1fb2JqW2NhbV9pZHhdKSAmJgorICAgICAgICAoY2FtX2hhbmRsZSA9PSBnX2NhbV9jdHJsLmNhbV9vYmpbY2FtX2lkeF0tPm15X2hkbCkpIHsKKyAgICAgICAgY2FtX29iaiA9IGdfY2FtX2N0cmwuY2FtX29ialtjYW1faWR4XTsKKyAgICB9CisgICAgcmV0dXJuIGNhbV9vYmo7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9zZXNzaW9uX2lkCisgKgorICogREVTQ1JJUFRJT046IHV0aWxpdHkgZnVuY3Rpb24gdG8gZ2V0IGNhbWVyYSBvYmplY3QgZnJvbSBjYW1lcmEgc2Vzc2lvbklECisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzZXNzaW9uX2lkOiBzZXNzaW9uaWQgZm9yIHdoaWNoIGNhbSBvYmogbWFwcGVkCisgKgorICogUkVUVVJOICAgICA6IHB0ciB0byB0aGUgY2FtZXJhIG9iamVjdCBzdG9yZWQgaW4gZ2xvYmFsIHZhcmlhYmxlCisgKiBOT1RFICAgICAgIDogY2FsbGVyIHNob3VsZCBub3QgZnJlZSB0aGUgY2FtZXJhIG9iamVjdCBwdHIKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworbW1fY2FtZXJhX29ial90KiBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X3Nlc3Npb25faWQodWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKyAgIGludCBjYW1faWR4ID0gMDsKKyAgIG1tX2NhbWVyYV9vYmpfdCAqY2FtX29iaiA9IE5VTEw7CisgICBmb3IgKGNhbV9pZHggPSAwOyBjYW1faWR4IDwgTU1fQ0FNRVJBX01BWF9OVU1fU0VOU09SUzsgY2FtX2lkeCsrKSB7CisgICAgICAgIGlmICgoTlVMTCAhPSBnX2NhbV9jdHJsLmNhbV9vYmpbY2FtX2lkeF0pICYmCisgICAgICAgICAgICAgICAgKHNlc3Npb25faWQgPT0gKHVpbnQzMl90KWdfY2FtX2N0cmwuY2FtX29ialtjYW1faWR4XS0+c2Vzc2lvbmlkKSkgeworICAgICAgICAgICAgTE9HRCgic2Vzc2lvbiBpZDolZCBtYXRjaCBpZHg6JWRcbiIsIHNlc3Npb25faWQsIGNhbV9pZHgpOworICAgICAgICAgICAgY2FtX29iaiA9IGdfY2FtX2N0cmwuY2FtX29ialtjYW1faWR4XTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2FtX29iajsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfaW50Zl9xdWVyeV9jYXBhYmlsaXR5CisgKgorICogREVTQ1JJUFRJT046IHF1ZXJ5IGNhbWVyYSBjYXBhYmlsaXR5CisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfaW50Zl9xdWVyeV9jYXBhYmlsaXR5KHVpbnQzMl90IGNhbWVyYV9oYW5kbGUpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CisKKyAgICBMT0dEKCJFOiBjYW1lcmFfaGFuZGxlciA9ICVkICIsIGNhbWVyYV9oYW5kbGUpOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX3F1ZXJ5X2NhcGFiaWxpdHkobXlfb2JqKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIH0KKyAgICBMT0dEKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX3NldF9wYXJtcworICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgcGFyYW1ldGVycyBwZXIgY2FtZXJhCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBwYXJtcyAgICAgICAgOiBwdHIgdG8gYSBwYXJhbSBzdHJ1Y3QgdG8gYmUgc2V0IHRvIHNlcnZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBBc3N1bWUgdGhlIHBhcm1zIHN0cnVjdCBidWYgaXMgYWxyZWFkeSBtYXBwZWQgdG8gc2VydmVyIHZpYQorICogICAgICAgICAgICAgIGRvbWFpbiBzb2NrZXQuIENvcnJlc3BvbmRpbmcgZmllbGRzIG9mIHBhcmFtZXRlcnMgdG8gYmUgc2V0CisgKiAgICAgICAgICAgICAgYXJlIGFscmVhZHkgZmlsbGVkIGluIGJ5IHVwcGVyIGxheWVyIGNhbGxlci4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX2ludGZfc2V0X3Bhcm1zKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFybV9idWZmZXJfdCAqcGFybXMpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfaW50Zl9sb2NrKTsKKyAgICBteV9vYmogPSBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X2hhbmRsZXIoY2FtZXJhX2hhbmRsZSk7CisKKyAgICBpZihteV9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfc2V0X3Bhcm1zKG15X29iaiwgcGFybXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfaW50Zl9nZXRfcGFybXMKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IHBhcmFtZXRlcnMgcGVyIGNhbWVyYQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAcGFybXMgICAgICAgIDogcHRyIHRvIGEgcGFyYW0gc3RydWN0IHRvIGJlIGdldCBmcm9tIHNlcnZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBBc3N1bWUgdGhlIHBhcm1zIHN0cnVjdCBidWYgaXMgYWxyZWFkeSBtYXBwZWQgdG8gc2VydmVyIHZpYQorICogICAgICAgICAgICAgIGRvbWFpbiBzb2NrZXQuIFBhcmFtZXRlcnMgdG8gYmUgZ2V0IGZyb20gc2VydmVyIGFyZSBhbHJlYWR5CisgKiAgICAgICAgICAgICAgZmlsbGVkIGluIGJ5IHVwcGVyIGxheWVyIGNhbGxlci4gQWZ0ZXIgdGhpcyBjYWxsLCBjb3JyZXNwb25kaW5nCisgKiAgICAgICAgICAgICAgZmllbGRzIG9mIHJlcXVlc3RlZCBwYXJhbWV0ZXJzIHdpbGwgYmUgZmlsbGVkIGluIGJ5IHNlcnZlciB3aXRoCisgKiAgICAgICAgICAgICAgZGV0YWlsZWQgaW5mb3JtYXRpb24uCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX2dldF9wYXJtcyh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcm1fYnVmZmVyX3QgKnBhcm1zKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX2dldF9wYXJtcyhteV9vYmosIHBhcm1zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfZG9fYXV0b19mb2N1cworICoKKyAqIERFU0NSSVBUSU9OOiBwZXJmb3JtaW5nIGF1dG8gZm9jdXMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9oYW5kbGU6IGNhbWVyYSBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKiBOT1RFICAgICAgIDogaWYgdGhpcyBjYWxsIHN1Y2Nlc3MsIHdlIHdpbGwgYWx3YXlzIGFzc3VtZSB0aGVyZSB3aWxsCisgKiAgICAgICAgICAgICAgYmUgYW4gYXV0b19mb2N1cyBldmVudCBmb2xsb3dpbmcgdXAuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX2RvX2F1dG9fZm9jdXModWludDMyX3QgY2FtZXJhX2hhbmRsZSkKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworICAgIG15X29iaiA9IG1tX2NhbWVyYV91dGlsX2dldF9jYW1lcmFfYnlfaGFuZGxlcihjYW1lcmFfaGFuZGxlKTsKKworICAgIGlmKG15X29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgICAgICByYyA9IG1tX2NhbWVyYV9kb19hdXRvX2ZvY3VzKG15X29iaik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX2NhbmNlbF9hdXRvX2ZvY3VzCisgKgorICogREVTQ1JJUFRJT046IGNhbmNlbCBhdXRvIGZvY3VzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfaW50Zl9jYW5jZWxfYXV0b19mb2N1cyh1aW50MzJfdCBjYW1lcmFfaGFuZGxlKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX2NhbmNlbF9hdXRvX2ZvY3VzKG15X29iaik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX3ByZXBhcmVfc25hcHNob3QKKyAqCisgKiBERVNDUklQVElPTjogcHJlcGFyZSBoYXJkd2FyZSBmb3Igc25hcHNob3QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9oYW5kbGU6IGNhbWVyYSBoYW5kbGUKKyAqICAgQGRvX2FmX2ZsYWcgICA6IGZsYWcgaW5kaWNhdGluZyBpZiBBRiBpcyBuZWVkZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX3ByZXBhcmVfc25hcHNob3QodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb19hZl9mbGFnKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX3ByZXBhcmVfc25hcHNob3QobXlfb2JqLCBkb19hZl9mbGFnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfZmx1c2gKKyAqCisgKiBERVNDUklQVElPTjogZmx1c2ggdGhlIGN1cnJlbnQgY2FtZXJhIHN0YXRlIGFuZCBidWZmZXJzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfaW50Zl9mbHVzaCh1aW50MzJfdCBjYW1lcmFfaGFuZGxlKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX2ZsdXNoKG15X29iaik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX2Nsb3NlCisgKgorICogREVTQ1JJUFRJT046IGNsb3NlIGEgY2FtZXJhIGJ5IGl0cyBoYW5kbGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9oYW5kbGU6IGNhbWVyYSBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX2Nsb3NlKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIHVpbnQ4X3QgY2FtX2lkeCA9IGNhbWVyYV9oYW5kbGUgJiAweDAwZmY7CisgICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKKworICAgIExPR0QoIkU6IGNhbWVyYV9oYW5kbGVyID0gJWQgIiwgY2FtZXJhX2hhbmRsZSk7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfaW50Zl9sb2NrKTsKKyAgICBteV9vYmogPSBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X2hhbmRsZXIoY2FtZXJhX2hhbmRsZSk7CisKKyAgICBpZiAobXlfb2JqKXsKKyAgICAgICAgbXlfb2JqLT5yZWZfY291bnQtLTsKKworICAgICAgICBpZihteV9vYmotPnJlZl9jb3VudCA+IDApIHsKKyAgICAgICAgICAgIC8qIHN0aWxsIGhhdmUgcmVmZXJlbmNlIHRvIG9iaiwgcmV0dXJuIGhlcmUgKi8KKyAgICAgICAgICAgIExPR0QoInJlZl9jb3VudD0lZFxuIiwgbXlfb2JqLT5yZWZfY291bnQpOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5lZWQgY2xvc2UgY2FtZXJhIGhlcmUgYXMgbm8gb3RoZXIgcmVmZXJlbmNlCisgICAgICAgICAgICAgKiBmaXJzdCBlbXB0eSBnX2NhbV9jdHJsJ3MgcmVmZXJlbnQgdG8gY2FtX29iaiAqLworICAgICAgICAgICAgZ19jYW1fY3RybC5jYW1fb2JqW2NhbV9pZHhdID0gTlVMTDsKKworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgICAgICByYyA9IG1tX2NhbWVyYV9jbG9zZShteV9vYmopOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgICAgIGZyZWUobXlfb2JqKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX2FkZF9jaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGFkZCBhIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9oYW5kbGU6IGNhbWVyYSBoYW5kbGUKKyAqICAgQGF0dHIgICAgICAgICA6IGJ1bmRsZSBhdHRyaWJ1dGUgb2YgdGhlIGNoYW5uZWwgaWYgbmVlZGVkCisgKiAgIEBjaGFubmVsX2NiICAgOiBjYWxsYmFjayBmdW5jdGlvbiBmb3IgYnVuZGxlIGRhdGEgbm90aWZ5CisgKiAgIEB1c2VyZGF0YSAgICAgOiB1c2VyIGRhdGEgcHRyCisgKgorICogUkVUVVJOICAgICA6IHVpbnQzMl90IHR5cGUgb2YgY2hhbm5lbCBoYW5kbGUKKyAqICAgICAgICAgICAgICAwICAtLSBpbnZhbGlkIGNoYW5uZWwgaGFuZGxlLCBtZWFuaW5nIHRoZSBvcCBmYWlsZWQKKyAqICAgICAgICAgICAgICA+MCAtLSBzdWNjZXNzZnVsbHkgYWRkZWQgYSBjaGFubmVsIHdpdGggYSB2YWxpZCBoYW5kbGUKKyAqIE5PVEUgICAgICAgOiBpZiBubyBidW5kbGUgZGF0YSBub3RpZnkgaXMgbmVlZGVkLCBtZWFuaW5nIGVhY2ggc3RyZWFtIGluIHRoZQorICogICAgICAgICAgICAgIGNoYW5uZWwgd2lsbCBoYXZlIGl0cyBvd24gc3RyZWFtIGRhdGEgbm90aWZ5IGNhbGxiYWNrLCB0aGVuCisgKiAgICAgICAgICAgICAgYXR0ciwgY2hhbm5lbF9jYiwgYW5kIHVzZXJkYXRhIGNhbiBiZSBOVUxMLiBJbiB0aGlzIGNhc2UsCisgKiAgICAgICAgICAgICAgbm8gbWF0Y2hpbmcgbG9naWMgd2lsbCBiZSBwZXJmb3JtZWQgaW4gY2hhbm5lbCBmb3IgdGhlIGJ1bmRsaW5nLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdWludDMyX3QgbW1fY2FtZXJhX2ludGZfYWRkX2NoYW5uZWwodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCBjaGFubmVsX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKQoreworICAgIHVpbnQzMl90IGNoX2lkID0gMDsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgTE9HRCgiRSBjYW1lcmFfaGFuZGxlciA9ICVkIiwgY2FtZXJhX2hhbmRsZSk7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIGNoX2lkID0gbW1fY2FtZXJhX2FkZF9jaGFubmVsKG15X29iaiwgYXR0ciwgY2hhbm5lbF9jYiwgdXNlcmRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgfQorICAgIExPR0QoIlggY2hfaWQgPSAlZCIsIGNoX2lkKTsKKyAgICByZXR1cm4gY2hfaWQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfZGVsX2NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogZGVsZXRlIGEgY2hhbm5lbCBieSBpdHMgaGFuZGxlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBhbGwgc3RyZWFtcyBpbiB0aGUgY2hhbm5lbCBzaG91bGQgYmUgc3RvcHBlZCBhbHJlYWR5IGJlZm9yZQorICogICAgICAgICAgICAgIHRoaXMgY2hhbm5lbCBjYW4gYmUgZGVsZXRlZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX2ludGZfZGVsX2NoYW5uZWwodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgTE9HRCgiRSBjaF9pZCA9ICVkIiwgY2hfaWQpOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworICAgIG15X29iaiA9IG1tX2NhbWVyYV91dGlsX2dldF9jYW1lcmFfYnlfaGFuZGxlcihjYW1lcmFfaGFuZGxlKTsKKworICAgIGlmKG15X29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgICAgICByYyA9IG1tX2NhbWVyYV9kZWxfY2hhbm5lbChteV9vYmosIGNoX2lkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIH0KKyAgICBMT0dEKCJYIik7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX2dldF9idW5kbGVfaW5mbworICoKKyAqIERFU0NSSVBUSU9OOiBxdWVyeSBidW5kbGUgaW5mbyBvZiB0aGUgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqICAgQGJ1bmRsZV9pbmZvICA6IGJ1bmRsZSBpbmZvIHRvIGJlIGZpbGxlZCBpbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBhbGwgc3RyZWFtcyBpbiB0aGUgY2hhbm5lbCBzaG91bGQgYmUgc3RvcHBlZCBhbHJlYWR5IGJlZm9yZQorICogICAgICAgICAgICAgIHRoaXMgY2hhbm5lbCBjYW4gYmUgZGVsZXRlZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX2ludGZfZ2V0X2J1bmRsZV9pbmZvKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2J1bmRsZV9jb25maWdfdCAqYnVuZGxlX2luZm8pCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CisKKyAgICBMT0dEKCJFIGNoX2lkID0gJWQiLCBjaF9pZCk7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX2dldF9idW5kbGVfaW5mbyhteV9vYmosIGNoX2lkLCBidW5kbGVfaW5mbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisgICAgTE9HRCgiWCIpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfaW50Zl9yZWdpc3Rlcl9ldmVudF9ub3RpZnkKKyAqCisgKiBERVNDUklQVElPTjogcmVnaXN0ZXIgZm9yIGV2ZW50IG5vdGlmeQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAZXZ0X2NiICAgICAgIDogY2FsbGJhY2sgZm9yIGV2ZW50IG5vdGlmeQorICogICBAdXNlcl9kYXRhICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX2ludGZfcmVnaXN0ZXJfZXZlbnRfbm90aWZ5KHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2V2ZW50X25vdGlmeV90IGV2dF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogdXNlcl9kYXRhKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgTE9HRCgiRSAiKTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfaW50Zl9sb2NrKTsKKyAgICBteV9vYmogPSBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X2hhbmRsZXIoY2FtZXJhX2hhbmRsZSk7CisKKyAgICBpZihteV9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfcmVnaXN0ZXJfZXZlbnRfbm90aWZ5KG15X29iaiwgZXZ0X2NiLCB1c2VyX2RhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgfQorICAgIExPR0QoIkUgcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfcWJ1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBlbnF1ZXVlIGJ1ZmZlciBiYWNrIHRvIGtlcm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqICAgQGJ1ZiAgICAgICAgICA6IGJ1ZiBwdHIgdG8gYmUgZW5xdWV1ZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX3FidWYodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqYnVmKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX3FidWYobXlfb2JqLCBjaF9pZCwgYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIH0KKyAgICBMT0dEKCJYIGV2dF90eXBlID0gJWQiLHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfZ2V0X3F1ZXVlZF9idWZfY291bnQKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJucyB0aGUgcXVldWVkIGJ1ZmZlciBjb3VudAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqICAgQHN0cmVhbV9pZCA6IHN0cmVhbSBpZAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IC0gcXVldWVkIGJ1ZmZlciBjb3VudAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX2ludGZfZ2V0X3F1ZXVlZF9idWZfY291bnQodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgdWludDMyX3QgY2hfaWQsIHVpbnQzMl90IHN0cmVhbV9pZCkKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworICAgIG15X29iaiA9IG1tX2NhbWVyYV91dGlsX2dldF9jYW1lcmFfYnlfaGFuZGxlcihjYW1lcmFfaGFuZGxlKTsKKworICAgIGlmKG15X29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgICAgICByYyA9IG1tX2NhbWVyYV9nZXRfcXVldWVkX2J1Zl9jb3VudChteV9vYmosIGNoX2lkLCBzdHJlYW1faWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgfQorICAgIExPR0QoIlggcXVldWVkIGJ1ZmZlciBjb3VudCA9ICVkIixyYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX2xpbmtfc3RyZWFtCisgKgorICogREVTQ1JJUFRJT046IGxpbmsgYSBzdHJlYW0gaW50byBhIG5ldyBjaGFubmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAc3RyZWFtX2lkICAgIDogc3RyZWFtIGlkCisgKiAgIEBsaW5rZWRfY2hfaWQgOiBjaGFubmVsIGluIHdoaWNoIHRoZSBzdHJlYW0gd2lsbCBiZSBsaW5rZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0cmVhbSBoYW5kbGUKKyAqICAgICAgICAgICAgICAwICAtLSBpbnZhbGlkIHN0cmVhbSBoYW5kbGUsIG1lYW5pbmcgdGhlIG9wIGZhaWxlZAorICogICAgICAgICAgICAgID4wIC0tIHN1Y2Nlc3NmdWxseSBsaW5rZWQgYSBzdHJlYW0gd2l0aCBhIHZhbGlkIGhhbmRsZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfaW50Zl9saW5rX3N0cmVhbSh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgdWludDMyX3Qgc3RyZWFtX2lkLAorICAgICAgICB1aW50MzJfdCBsaW5rZWRfY2hfaWQpCit7CisgICAgdWludDMyX3QgaWQgPSAwOworICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CisKKyAgICBMT0dEKCJFIGhhbmRsZSA9ICV1IGNoX2lkID0gJXUiLAorICAgICAgICAgIGNhbWVyYV9oYW5kbGUsIGNoX2lkKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworICAgIG15X29iaiA9IG1tX2NhbWVyYV91dGlsX2dldF9jYW1lcmFfYnlfaGFuZGxlcihjYW1lcmFfaGFuZGxlKTsKKworICAgIGlmKG15X29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgICAgICBpZCA9IG1tX2NhbWVyYV9saW5rX3N0cmVhbShteV9vYmosIGNoX2lkLCBzdHJlYW1faWQsIGxpbmtlZF9jaF9pZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisKKyAgICBMT0dEKCJYIHN0cmVhbV9pZCA9ICV1Iiwgc3RyZWFtX2lkKTsKKyAgICByZXR1cm4gKGludDMyX3QpaWQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfYWRkX3N0cmVhbQorICoKKyAqIERFU0NSSVBUSU9OOiBhZGQgYSBzdHJlYW0gaW50byBhIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9oYW5kbGU6IGNhbWVyYSBoYW5kbGUKKyAqICAgQGNoX2lkICAgICAgICA6IGNoYW5uZWwgaGFuZGxlCisgKgorICogUkVUVVJOICAgICA6IHVpbnQzMl90IHR5cGUgb2Ygc3RyZWFtIGhhbmRsZQorICogICAgICAgICAgICAgIDAgIC0tIGludmFsaWQgc3RyZWFtIGhhbmRsZSwgbWVhbmluZyB0aGUgb3AgZmFpbGVkCisgKiAgICAgICAgICAgICAgPjAgLS0gc3VjY2Vzc2Z1bGx5IGFkZGVkIGEgc3RyZWFtIHdpdGggYSB2YWxpZCBoYW5kbGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHVpbnQzMl90IG1tX2NhbWVyYV9pbnRmX2FkZF9zdHJlYW0odWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkKQoreworICAgIHVpbnQzMl90IHN0cmVhbV9pZCA9IDA7CisgICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKKworICAgIExPR0QoIkUgaGFuZGxlID0gJWQgY2hfaWQgPSAlZCIsCisgICAgICAgICAgY2FtZXJhX2hhbmRsZSwgY2hfaWQpOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHN0cmVhbV9pZCA9IG1tX2NhbWVyYV9hZGRfc3RyZWFtKG15X29iaiwgY2hfaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgfQorICAgIExPR0QoIlggc3RyZWFtX2lkID0gJWQiLCBzdHJlYW1faWQpOworICAgIHJldHVybiBzdHJlYW1faWQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfZGVsX3N0cmVhbQorICoKKyAqIERFU0NSSVBUSU9OOiBkZWxldGUgYSBzdHJlYW0gYnkgaXRzIGhhbmRsZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqICAgQHN0cmVhbV9pZCAgICA6IHN0cmVhbSBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKiBOT1RFICAgICAgIDogc3RyZWFtIHNob3VsZCBiZSBzdG9wcGVkIGFscmVhZHkgYmVmb3JlIGl0IGNhbiBiZSBkZWxldGVkLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfaW50Zl9kZWxfc3RyZWFtKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1faWQpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CisKKyAgICBMT0dEKCJFIGhhbmRsZSA9ICVkIGNoX2lkID0gJWQgc3RyZWFtX2lkID0gJWQiLAorICAgICAgICAgIGNhbWVyYV9oYW5kbGUsIGNoX2lkLCBzdHJlYW1faWQpOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX2RlbF9zdHJlYW0obXlfb2JqLCBjaF9pZCwgc3RyZWFtX2lkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIH0KKyAgICBMT0dEKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX2NvbmZpZ19zdHJlYW0KKyAqCisgKiBERVNDUklQVElPTjogY29uZmlndXJlIGEgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAc3RyZWFtX2lkICAgIDogc3RyZWFtIGhhbmRsZQorICogICBAY29uZmlnICAgICAgIDogc3RyZWFtIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX2NvbmZpZ19zdHJlYW0odWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3N0cmVhbV9jb25maWdfdCAqY29uZmlnKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgTE9HRCgiRSBoYW5kbGUgPSAlZCwgY2hfaWQgPSAlZCxzdHJlYW1faWQgPSAlZCIsCisgICAgICAgICAgY2FtZXJhX2hhbmRsZSwgY2hfaWQsIHN0cmVhbV9pZCk7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfaW50Zl9sb2NrKTsKKyAgICBteV9vYmogPSBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X2hhbmRsZXIoY2FtZXJhX2hhbmRsZSk7CisKKyAgICBMT0dEKCJtbV9jYW1lcmFfaW50Zl9jb25maWdfc3RyZWFtIHN0cmVhbV9pZCA9ICVkIixzdHJlYW1faWQpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX2NvbmZpZ19zdHJlYW0obXlfb2JqLCBjaF9pZCwgc3RyZWFtX2lkLCBjb25maWcpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgfQorICAgIExPR0QoIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfc3RhcnRfY2hhbm5lbAorICoKKyAqIERFU0NSSVBUSU9OOiBzdGFydCBhIGNoYW5uZWwsIHdoaWNoIHdpbGwgc3RhcnQgYWxsIHN0cmVhbXMgaW4gdGhlIGNoYW5uZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9oYW5kbGU6IGNhbWVyYSBoYW5kbGUKKyAqICAgQGNoX2lkICAgICAgICA6IGNoYW5uZWwgaGFuZGxlCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfaW50Zl9zdGFydF9jaGFubmVsKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX3N0YXJ0X2NoYW5uZWwobXlfb2JqLCBjaF9pZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisgICAgTE9HRCgiWCByYyA9ICVkIiwgcmMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfaW50Zl9zdG9wX2NoYW5uZWwKKyAqCisgKiBERVNDUklQVElPTjogc3RvcCBhIGNoYW5uZWwsIHdoaWNoIHdpbGwgc3RvcCBhbGwgc3RyZWFtcyBpbiB0aGUgY2hhbm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX3N0b3BfY2hhbm5lbCh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX3N0b3BfY2hhbm5lbChteV9vYmosIGNoX2lkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIH0KKyAgICBMT0dEKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX3JlcXVlc3Rfc3VwZXJfYnVmCisgKgorICogREVTQ1JJUFRJT046IGZvciBidXJzdCBtb2RlIGluIGJ1bmRsZSwgcmV1cWVzdCBjZXJ0YWluIGFtb3VudCBvZiBtYXRjaGVkCisgKiAgICAgICAgICAgICAgZnJhbWVzIGZyb20gc3VwZXJidWYgcXVldWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9oYW5kbGU6IGNhbWVyYSBoYW5kbGUKKyAqICAgQGNoX2lkICAgICAgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqICAgQGJ1ZiAgICAgICAgICAgICAgICA6IHJlcXVlc3QgYnVmZmVyIGluZm8KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX3JlcXVlc3Rfc3VwZXJfYnVmKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgIHVpbnQzMl90IGNoX2lkLCBtbV9jYW1lcmFfcmVxX2J1Zl90ICpidWYpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIExPR0QoIkUgY2FtZXJhX2hhbmRsZXIgPSAlZCxjaF9pZCA9ICVkIiwKKyAgICAgICAgICBjYW1lcmFfaGFuZGxlLCBjaF9pZCk7CisgICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworICAgIG15X29iaiA9IG1tX2NhbWVyYV91dGlsX2dldF9jYW1lcmFfYnlfaGFuZGxlcihjYW1lcmFfaGFuZGxlKTsKKworICAgIGlmKG15X29iaiAmJiBidWYpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfcmVxdWVzdF9zdXBlcl9idWYgKG15X29iaiwgY2hfaWQsIGJ1Zik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisgICAgTE9HRCgiWCByYyA9ICVkIiwgcmMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfaW50Zl9jYW5jZWxfc3VwZXJfYnVmX3JlcXVlc3QKKyAqCisgKiBERVNDUklQVElPTjogZm9yIGJ1cnN0IG1vZGUgaW4gYnVuZGxlLCBjYW5jZWwgdGhlIHJldXFlc3QgZm9yIGNlcnRhaW4gYW1vdW50CisgKiAgICAgICAgICAgICAgb2YgbWF0Y2hlZCBmcmFtZXMgZnJvbSBzdXBlcmJ1ZiBxdWV1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX2NhbmNlbF9zdXBlcl9idWZfcmVxdWVzdCh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgTE9HRCgiRSBjYW1lcmFfaGFuZGxlciA9ICVkLGNoX2lkID0gJWQiLAorICAgICAgICAgIGNhbWVyYV9oYW5kbGUsIGNoX2lkKTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfaW50Zl9sb2NrKTsKKyAgICBteV9vYmogPSBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X2hhbmRsZXIoY2FtZXJhX2hhbmRsZSk7CisKKyAgICBpZihteV9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfY2FuY2VsX3N1cGVyX2J1Zl9yZXF1ZXN0KG15X29iaiwgY2hfaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgfQorICAgIExPR0QoIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfZmx1c2hfc3VwZXJfYnVmX3F1ZXVlCisgKgorICogREVTQ1JJUFRJT046IGZsdXNoIG91dCBhbGwgZnJhbWVzIGluIHRoZSBzdXBlcmJ1ZiBxdWV1ZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqICAgQGZyYW1lX2lkeCAgICA6IGZyYW1lIGluZGV4CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfaW50Zl9mbHVzaF9zdXBlcl9idWZfcXVldWUodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwgdWludDMyX3QgZnJhbWVfaWR4KQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgTE9HRCgiRSBjYW1lcmFfaGFuZGxlciA9ICVkLGNoX2lkID0gJWQiLAorICAgICAgICAgIGNhbWVyYV9oYW5kbGUsIGNoX2lkKTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfaW50Zl9sb2NrKTsKKyAgICBteV9vYmogPSBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X2hhbmRsZXIoY2FtZXJhX2hhbmRsZSk7CisKKyAgICBpZihteV9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfZmx1c2hfc3VwZXJfYnVmX3F1ZXVlKG15X29iaiwgY2hfaWQsIGZyYW1lX2lkeCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisgICAgTE9HRCgiWCByYyA9ICVkIiwgcmMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfaW50Zl9zdGFydF96c2xfc25hcHNob3QKKyAqCisgKiBERVNDUklQVElPTjogU3RhcnRzIHpzbCBzbmFwc2hvdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX3N0YXJ0X3pzbF9zbmFwc2hvdCh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICB1aW50MzJfdCBjaF9pZCkKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKKworICAgIExPR0QoIkUgY2FtZXJhX2hhbmRsZXIgPSAlZCxjaF9pZCA9ICVkIiwKKyAgICAgICAgICBjYW1lcmFfaGFuZGxlLCBjaF9pZCk7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX3N0YXJ0X3pzbF9zbmFwc2hvdF9jaChteV9vYmosIGNoX2lkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIH0KKyAgICBMT0dEKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX3N0b3BfenNsX3NuYXBzaG90CisgKgorICogREVTQ1JJUFRJT046IFN0b3BzIHpzbCBzbmFwc2hvdAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX3N0b3BfenNsX3NuYXBzaG90KHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgIHVpbnQzMl90IGNoX2lkKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgTE9HRCgiRSBjYW1lcmFfaGFuZGxlciA9ICVkLGNoX2lkID0gJWQiLAorICAgICAgICAgIGNhbWVyYV9oYW5kbGUsIGNoX2lkKTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfaW50Zl9sb2NrKTsKKyAgICBteV9vYmogPSBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X2hhbmRsZXIoY2FtZXJhX2hhbmRsZSk7CisKKyAgICBpZihteV9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfc3RvcF96c2xfc25hcHNob3RfY2gobXlfb2JqLCBjaF9pZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisgICAgTE9HRCgiWCByYyA9ICVkIiwgcmMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfaW50Zl9jb25maWd1cmVfbm90aWZ5X21vZGUKKyAqCisgKiBERVNDUklQVElPTjogQ29uZmlndXJlcyBjaGFubmVsIG5vdGlmaWNhdGlvbiBtb2RlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAbm90aWZ5X21vZGUgIDogbm90aWZpY2F0aW9uIG1vZGUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX2NvbmZpZ3VyZV9ub3RpZnlfbW9kZSh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfbm90aWZ5X21vZGVfdCBub3RpZnlfbW9kZSkKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKKworICAgIExPR0QoIkUgY2FtZXJhX2hhbmRsZXIgPSAlZCxjaF9pZCA9ICVkIiwKKyAgICAgICAgICBjYW1lcmFfaGFuZGxlLCBjaF9pZCk7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX2NvbmZpZ19jaGFubmVsX25vdGlmeShteV9vYmosIGNoX2lkLCBub3RpZnlfbW9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisgICAgTE9HRCgiWCByYyA9ICVkIiwgcmMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfaW50Zl9tYXBfYnVmCisgKgorICogREVTQ1JJUFRJT046IG1hcHBpbmcgY2FtZXJhIGJ1ZmZlciB2aWEgZG9tYWluIHNvY2tldCB0byBzZXJ2ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9oYW5kbGU6IGNhbWVyYSBoYW5kbGUKKyAqICAgQGJ1Zl90eXBlICAgICA6IHR5cGUgb2YgYnVmZmVyIHRvIGJlIG1hcHBlZC4gY291bGQgYmUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX0NBUEFCSUxJVFkKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NFVFBBUk1fQlVGCisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9HRVRQQVJNX0JVRgorICogICBAZmQgICAgICAgICAgIDogZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBidWZmZXIKKyAqICAgQHNpemUgICAgICAgICA6IHNpemUgb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX2ludGZfbWFwX2J1Zih1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgIHVpbnQ4X3QgYnVmX3R5cGUsIGludCBmZCwgc2l6ZV90IHNpemUsIHZvaWQgKmJ1ZmZlcikKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworICAgIG15X29iaiA9IG1tX2NhbWVyYV91dGlsX2dldF9jYW1lcmFfYnlfaGFuZGxlcihjYW1lcmFfaGFuZGxlKTsKKworICAgIGlmKG15X29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgICAgICByYyA9IG1tX2NhbWVyYV9tYXBfYnVmKG15X29iaiwgYnVmX3R5cGUsIGZkLCBzaXplLCBidWZmZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfaW50Zl9tYXBfYnVmcworICoKKyAqIERFU0NSSVBUSU9OOiBtYXBwaW5nIGNhbWVyYSBidWZmZXIgdmlhIGRvbWFpbiBzb2NrZXQgdG8gc2VydmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBidWZfdHlwZSAgICAgOiB0eXBlIG9mIGJ1ZmZlciB0byBiZSBtYXBwZWQuIGNvdWxkIGJlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9DQVBBQklMSVRZCisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TRVRQQVJNX0JVRgorICogICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfR0VUUEFSTV9CVUYKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX21hcF9idWZzKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgIGNvbnN0IGNhbV9idWZfbWFwX3R5cGVfbGlzdCAqYnVmX21hcF9saXN0KQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX21hcF9idWZzKG15X29iaiwgYnVmX21hcF9saXN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfdW5tYXBfYnVmCisgKgorICogREVTQ1JJUFRJT046IHVubWFwcGluZyBjYW1lcmEgYnVmZmVyIHZpYSBkb21haW4gc29ja2V0IHRvIHNlcnZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAYnVmX3R5cGUgICAgIDogdHlwZSBvZiBidWZmZXIgdG8gYmUgdW5tYXBwZWQuIGNvdWxkIGJlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9DQVBBQklMSVRZCisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TRVRQQVJNX0JVRgorICogICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfR0VUUEFSTV9CVUYKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX3VubWFwX2J1Zih1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmX3R5cGUpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfaW50Zl9sb2NrKTsKKyAgICBteV9vYmogPSBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X2hhbmRsZXIoY2FtZXJhX2hhbmRsZSk7CisKKyAgICBpZihteV9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfdW5tYXBfYnVmKG15X29iaiwgYnVmX3R5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfaW50Zl9zZXRfc3RyZWFtX3Bhcm1zCisgKgorICogREVTQ1JJUFRJT046IHNldCBwYXJhbWV0ZXJzIHBlciBzdHJlYW0KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9oYW5kbGU6IGNhbWVyYSBoYW5kbGUKKyAqICAgQGNoX2lkICAgICAgICA6IGNoYW5uZWwgaGFuZGxlCisgKiAgIEBzX2lkICAgICAgICAgOiBzdHJlYW0gaGFuZGxlCisgKiAgIEBwYXJtcyAgICAgICAgOiBwdHIgdG8gYSBwYXJhbSBzdHJ1Y3QgdG8gYmUgc2V0IHRvIHNlcnZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBBc3N1bWUgdGhlIHBhcm1zIHN0cnVjdCBidWYgaXMgYWxyZWFkeSBtYXBwZWQgdG8gc2VydmVyIHZpYQorICogICAgICAgICAgICAgIGRvbWFpbiBzb2NrZXQuIENvcnJlc3BvbmRpbmcgZmllbGRzIG9mIHBhcmFtZXRlcnMgdG8gYmUgc2V0CisgKiAgICAgICAgICAgICAgYXJlIGFscmVhZHkgZmlsbGVkIGluIGJ5IHVwcGVyIGxheWVyIGNhbGxlci4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX2ludGZfc2V0X3N0cmVhbV9wYXJtcyh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90ICpwYXJtcykKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworICAgIG15X29iaiA9IG1tX2NhbWVyYV91dGlsX2dldF9jYW1lcmFfYnlfaGFuZGxlcihjYW1lcmFfaGFuZGxlKTsKKworICAgIExPR0QoIkUgY2FtZXJhX2hhbmRsZSA9ICVkLGNoX2lkID0gJWQsc19pZCA9ICVkIiwKKyAgICAgICAgICBjYW1lcmFfaGFuZGxlLCBjaF9pZCwgc19pZCk7CisKKyAgICBpZihteV9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfc2V0X3N0cmVhbV9wYXJtcyhteV9vYmosIGNoX2lkLCBzX2lkLCBwYXJtcyk7CisgICAgfWVsc2V7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgfQorICAgIExPR0QoIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfZ2V0X3N0cmVhbV9wYXJtcworICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgcGFyYW1ldGVycyBwZXIgc3RyZWFtCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAc19pZCAgICAgICAgIDogc3RyZWFtIGhhbmRsZQorICogICBAcGFybXMgICAgICAgIDogcHRyIHRvIGEgcGFyYW0gc3RydWN0IHRvIGJlIGdldCBmcm9tIHNlcnZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBBc3N1bWUgdGhlIHBhcm1zIHN0cnVjdCBidWYgaXMgYWxyZWFkeSBtYXBwZWQgdG8gc2VydmVyIHZpYQorICogICAgICAgICAgICAgIGRvbWFpbiBzb2NrZXQuIFBhcmFtZXRlcnMgdG8gYmUgZ2V0IGZyb20gc2VydmVyIGFyZSBhbHJlYWR5CisgKiAgICAgICAgICAgICAgZmlsbGVkIGluIGJ5IHVwcGVyIGxheWVyIGNhbGxlci4gQWZ0ZXIgdGhpcyBjYWxsLCBjb3JyZXNwb25kaW5nCisgKiAgICAgICAgICAgICAgZmllbGRzIG9mIHJlcXVlc3RlZCBwYXJhbWV0ZXJzIHdpbGwgYmUgZmlsbGVkIGluIGJ5IHNlcnZlciB3aXRoCisgKiAgICAgICAgICAgICAgZGV0YWlsZWQgaW5mb3JtYXRpb24uCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX2dldF9zdHJlYW1fcGFybXModWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCAqcGFybXMpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfaW50Zl9sb2NrKTsKKyAgICBteV9vYmogPSBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X2hhbmRsZXIoY2FtZXJhX2hhbmRsZSk7CisKKyAgICBMT0dEKCJFIGNhbWVyYV9oYW5kbGUgPSAlZCxjaF9pZCA9ICVkLHNfaWQgPSAlZCIsCisgICAgICAgICAgY2FtZXJhX2hhbmRsZSwgY2hfaWQsIHNfaWQpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX2dldF9zdHJlYW1fcGFybXMobXlfb2JqLCBjaF9pZCwgc19pZCwgcGFybXMpOworICAgIH1lbHNleworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIH0KKworICAgIExPR0QoIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfbWFwX3N0cmVhbV9idWYKKyAqCisgKiBERVNDUklQVElPTjogbWFwcGluZyBzdHJlYW0gYnVmZmVyIHZpYSBkb21haW4gc29ja2V0IHRvIHNlcnZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqICAgQHNfaWQgICAgICAgICA6IHN0cmVhbSBoYW5kbGUKKyAqICAgQGJ1Zl90eXBlICAgICA6IHR5cGUgb2YgYnVmZmVyIHRvIGJlIG1hcHBlZC4gY291bGQgYmUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9JTkZPCisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX0lOUFVUX0JVRgorICogICBAYnVmX2lkeCAgICAgIDogaW5kZXggb2YgYnVmZmVyIHdpdGhpbiB0aGUgc3RyZWFtIGJ1ZmZlcnMsIG9ubHkgdmFsaWQgaWYKKyAqICAgICAgICAgICAgICAgICAgIGJ1Zl90eXBlIGlzIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYgb3IKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfSU5QVVRfQlVGCisgKiAgIEBwbGFuZV9pZHggICAgOiBwbGFuZSBpbmRleC4gSWYgYWxsIHBsYW5lcyBzaGFyZSB0aGUgc2FtZSBmZCwKKyAqICAgICAgICAgICAgICAgICAgIHBsYW5lX2lkeCA9IC0xOyBvdGhlcndpc2UsIHBsZWFuX2lkeCBpcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgIGluZGV4IHRvIHBsYW5lICgwLi5udW1fb2ZfcGxhbmVzKQorICogICBAZmQgICAgICAgICAgIDogZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBidWZmZXIKKyAqICAgQHNpemUgICAgICAgICA6IHNpemUgb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX2ludGZfbWFwX3N0cmVhbV9idWYodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgdWludDMyX3QgY2hfaWQsIHVpbnQzMl90IHN0cmVhbV9pZCwgdWludDhfdCBidWZfdHlwZSwKKyAgICAgICAgdWludDMyX3QgYnVmX2lkeCwgaW50MzJfdCBwbGFuZV9pZHgsIGludCBmZCwKKyAgICAgICAgc2l6ZV90IHNpemUsIHZvaWQgKmJ1ZmZlcikKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworICAgIG15X29iaiA9IG1tX2NhbWVyYV91dGlsX2dldF9jYW1lcmFfYnlfaGFuZGxlcihjYW1lcmFfaGFuZGxlKTsKKworICAgIExPR0QoIkUgY2FtZXJhX2hhbmRsZSA9ICVkLCBjaF9pZCA9ICVkLCBzX2lkID0gJWQsIGJ1Zl9pZHggPSAlZCwgcGxhbmVfaWR4ID0gJWQiLAorICAgICAgICAgIGNhbWVyYV9oYW5kbGUsIGNoX2lkLCBzdHJlYW1faWQsIGJ1Zl9pZHgsIHBsYW5lX2lkeCk7CisKKyAgICBpZihteV9vYmopIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfbWFwX3N0cmVhbV9idWYobXlfb2JqLCBjaF9pZCwgc3RyZWFtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfdHlwZSwgYnVmX2lkeCwgcGxhbmVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwgc2l6ZSwgYnVmZmVyKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisKKyAgICBMT0dEKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX21hcF9zdHJlYW1fYnVmcworICoKKyAqIERFU0NSSVBUSU9OOiBtYXBwaW5nIHN0cmVhbSBidWZmZXJzIHZpYSBkb21haW4gc29ja2V0IHRvIHNlcnZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAY2hfaWQgICAgICAgIDogY2hhbm5lbCBoYW5kbGUKKyAqICAgQGJ1Zl9tYXBfbGlzdCA6IGxpc3Qgb2YgYnVmZmVycyB0byBiZSBtYXBwZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX21hcF9zdHJlYW1fYnVmcyh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbV9idWZfbWFwX3R5cGVfbGlzdCAqYnVmX21hcF9saXN0KQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgTE9HRCgiRSBjYW1lcmFfaGFuZGxlID0gJWQsIGNoX2lkID0gJWQiLAorICAgICAgICAgIGNhbWVyYV9oYW5kbGUsIGNoX2lkKTsKKworICAgIGlmKG15X29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgICAgICByYyA9IG1tX2NhbWVyYV9tYXBfc3RyZWFtX2J1ZnMobXlfb2JqLCBjaF9pZCwgYnVmX21hcF9saXN0KTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisKKyAgICBMT0dEKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX3VubWFwX3N0cmVhbV9idWYKKyAqCisgKiBERVNDUklQVElPTjogdW5tYXBwaW5nIHN0cmVhbSBidWZmZXIgdmlhIGRvbWFpbiBzb2NrZXQgdG8gc2VydmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAc19pZCAgICAgICAgIDogc3RyZWFtIGhhbmRsZQorICogICBAYnVmX3R5cGUgICAgIDogdHlwZSBvZiBidWZmZXIgdG8gYmUgdW5tYXBwZWQuIGNvdWxkIGJlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGCisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fSU5GTworICogICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfT0ZGTElORV9JTlBVVF9CVUYKKyAqICAgQGJ1Zl9pZHggICAgICA6IGluZGV4IG9mIGJ1ZmZlciB3aXRoaW4gdGhlIHN0cmVhbSBidWZmZXJzLCBvbmx5IHZhbGlkIGlmCisgKiAgICAgICAgICAgICAgICAgICBidWZfdHlwZSBpcyBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fQlVGIG9yCisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX0lOUFVUX0JVRgorICogICBAcGxhbmVfaWR4ICAgIDogcGxhbmUgaW5kZXguIElmIGFsbCBwbGFuZXMgc2hhcmUgdGhlIHNhbWUgZmQsCisgKiAgICAgICAgICAgICAgICAgICBwbGFuZV9pZHggPSAtMTsgb3RoZXJ3aXNlLCBwbGVhbl9pZHggaXMgdGhlCisgKiAgICAgICAgICAgICAgICAgICBpbmRleCB0byBwbGFuZSAoMC4ubnVtX29mX3BsYW5lcykKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX2NhbWVyYV9pbnRmX3VubWFwX3N0cmVhbV9idWYodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmVhbV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBidWZfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwbGFuZV9pZHgpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIG1tX2NhbWVyYV9vYmpfdCAqIG15X29iaiA9IE5VTEw7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmdfaW50Zl9sb2NrKTsKKyAgICBteV9vYmogPSBtbV9jYW1lcmFfdXRpbF9nZXRfY2FtZXJhX2J5X2hhbmRsZXIoY2FtZXJhX2hhbmRsZSk7CisKKyAgICBMT0dEKCJFIGNhbWVyYV9oYW5kbGUgPSAlZCwgY2hfaWQgPSAlZCwgc19pZCA9ICVkLCBidWZfaWR4ID0gJWQsIHBsYW5lX2lkeCA9ICVkIiwKKyAgICAgICAgICBjYW1lcmFfaGFuZGxlLCBjaF9pZCwgc3RyZWFtX2lkLCBidWZfaWR4LCBwbGFuZV9pZHgpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX3VubWFwX3N0cmVhbV9idWYobXlfb2JqLCBjaF9pZCwgc3RyZWFtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl90eXBlLCBidWZfaWR4LCBwbGFuZV9pZHgpOworICAgIH1lbHNleworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIH0KKworICAgIExPR0QoIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfZ2V0X3Nlc3Npb25faWQKKyAqCisgKiBERVNDUklQVElPTjogcmV0cmlldmUgdGhlIHNlc3Npb24gSUQgZnJvbSB0aGUga2VybmVsIGZvciB0aGlzIEhXSSBpbnN0YW5jZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2hhbmRsZTogY2FtZXJhIGhhbmRsZQorICogICBAc2Vzc2lvbmlkOiBzZXNzaW9uIGlkIHRvIGJlIHJldHJpZXZlZCBmcm9tIHNlcnZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBpZiB0aGlzIGNhbGwgc3VjY2VlZHMsIHdlIHdpbGwgZ2V0IGEgdmFsaWQgc2Vzc2lvbiBpZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX2ludGZfZ2V0X3Nlc3Npb25faWQodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogc2Vzc2lvbmlkKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBtbV9jYW1lcmFfb2JqX3QgKiBteV9vYmogPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgICpzZXNzaW9uaWQgPSBteV9vYmotPnNlc3Npb25pZDsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgICAgICByYyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX3N5bmNfcmVsYXRlZF9zZW5zb3JzCisgKgorICogREVTQ1JJUFRJT046IHJldHJpZXZlIHRoZSBzZXNzaW9uIElEIGZyb20gdGhlIGtlcm5lbCBmb3IgdGhpcyBIV0kgaW5zdGFuY2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9oYW5kbGU6IGNhbWVyYSBoYW5kbGUKKyAqICAgQHJlbGF0ZWRfY2FtX2luZm86IHBvaW50ZXIgdG8gdGhlIHJlbGF0ZWQgY2FtIGluZm8gdG8gYmUgc2VudCB0byB0aGUgc2VydmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICogTk9URSAgICAgICA6IGlmIHRoaXMgY2FsbCBzdWNjZWVkcywgd2Ugd2lsbCBnZXQgbGlua2luZyBlc3RhYmxpc2hlZCBpbiBiYWNrIGVuZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfaW50Zl9zeW5jX3JlbGF0ZWRfc2Vuc29ycyh1aW50MzJfdCBjYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3N5bmNfcmVsYXRlZF9zZW5zb3JzX2V2ZW50X2luZm9fdCogcmVsYXRlZF9jYW1faW5mbykKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworICAgIG15X29iaiA9IG1tX2NhbWVyYV91dGlsX2dldF9jYW1lcmFfYnlfaGFuZGxlcihjYW1lcmFfaGFuZGxlKTsKKworICAgIGlmKG15X29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2FtX2xvY2spOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgICAgICByYyA9IG1tX2NhbWVyYV9zeW5jX3JlbGF0ZWRfc2Vuc29ycyhteV9vYmosIHJlbGF0ZWRfY2FtX2luZm8pOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRfc2Vuc29yX2luZm8KKyAqCisgKiBERVNDUklQVElPTjogZ2V0IHNlbnNvciBpbmZvIGxpa2UgZmFjaW5nKGJhY2svZnJvbnQpIGFuZCBtb3VudCBhbmdsZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIGdldF9zZW5zb3JfaW5mbygpCit7CisgICAgaW50IHJjID0gMDsKKyAgICBpbnQgZGV2X2ZkID0gLTE7CisgICAgc3RydWN0IG1lZGlhX2RldmljZV9pbmZvIG1kZXZfaW5mbzsKKyAgICBpbnQgbnVtX21lZGlhX2RldmljZXMgPSAwOworICAgIHNpemVfdCBudW1fY2FtZXJhcyA9IDA7CisKKyAgICBMT0dEKCJFIik7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgY2hhciBkZXZfbmFtZVszMl07CisgICAgICAgIHNucHJpbnRmKGRldl9uYW1lLCBzaXplb2YoZGV2X25hbWUpLCAiL2Rldi9tZWRpYSVkIiwgbnVtX21lZGlhX2RldmljZXMpOworICAgICAgICBkZXZfZmQgPSBvcGVuKGRldl9uYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLKTsKKyAgICAgICAgaWYgKGRldl9mZCA8IDApIHsKKyAgICAgICAgICAgIExPR0QoIkRvbmUgZGlzY292ZXJpbmcgbWVkaWEgZGV2aWNlc1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBudW1fbWVkaWFfZGV2aWNlcysrOworICAgICAgICBtZW1zZXQoJm1kZXZfaW5mbywgMCwgc2l6ZW9mKG1kZXZfaW5mbykpOworICAgICAgICByYyA9IGlvY3RsKGRldl9mZCwgTUVESUFfSU9DX0RFVklDRV9JTkZPLCAmbWRldl9pbmZvKTsKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiRXJyb3I6IGlvY3RsIG1lZGlhX2RldiBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgY2xvc2UoZGV2X2ZkKTsKKyAgICAgICAgICAgIGRldl9mZCA9IC0xOworICAgICAgICAgICAgbnVtX2NhbWVyYXMgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZihzdHJuY21wKG1kZXZfaW5mby5tb2RlbCwgIE1TTV9DT05GSUdVUkFUSU9OX05BTUUsIHNpemVvZihtZGV2X2luZm8ubW9kZWwpKSAhPSAwKSB7CisgICAgICAgICAgICBjbG9zZShkZXZfZmQpOworICAgICAgICAgICAgZGV2X2ZkID0gLTE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fZW50aXRpZXMgPSAxOworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3RydWN0IG1lZGlhX2VudGl0eV9kZXNjIGVudGl0eTsKKyAgICAgICAgICAgIHVpbnQzMl90IHRlbXA7CisgICAgICAgICAgICB1aW50MzJfdCBtb3VudF9hbmdsZTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZhY2luZzsKKyAgICAgICAgICAgIGludDMyX3QgdHlwZSA9IDA7CisgICAgICAgICAgICB1aW50OF90IGlzX3l1djsKKworICAgICAgICAgICAgbWVtc2V0KCZlbnRpdHksIDAsIHNpemVvZihlbnRpdHkpKTsKKyAgICAgICAgICAgIGVudGl0eS5pZCA9IG51bV9lbnRpdGllcysrOworICAgICAgICAgICAgcmMgPSBpb2N0bChkZXZfZmQsIE1FRElBX0lPQ19FTlVNX0VOVElUSUVTLCAmZW50aXR5KTsKKyAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJEb25lIGVudW1lcmF0aW5nIG1lZGlhIGVudGl0aWVzXG4iKTsKKyAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihlbnRpdHkudHlwZSA9PSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFViAmJgorICAgICAgICAgICAgICAgIGVudGl0eS5ncm91cF9pZCA9PSBNU01fQ0FNRVJBX1NVQkRFVl9TRU5TT1IpIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gZW50aXR5LmZsYWdzID4+IDg7CisgICAgICAgICAgICAgICAgbW91bnRfYW5nbGUgPSAodGVtcCAmIDB4RkYpICogOTA7CisgICAgICAgICAgICAgICAgZmFjaW5nID0gKChlbnRpdHkuZmxhZ3MgJiBDQU1fU0VOU09SX0ZBQ0lOR19NQVNLKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfRkFDSU5HX0ZST05UOkNBTUVSQV9GQUNJTkdfQkFDSyk7CisgICAgICAgICAgICAgICAgLyogVE9ETzogTmVlZCB0byByZXZpc2l0IHRoaXMgbG9naWMgaWYgZnJvbnQgQVVYIGlzIGF2YWlsYWJsZS4gKi8KKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkIGludClmYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19GUk9OVCkgeworICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0FNX1RZUEVfU1RBTkRBTE9ORTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVudGl0eS5mbGFncyAmIENBTV9TRU5TT1JfVFlQRV9NQVNLKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDQU1fVFlQRV9BVVg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENBTV9UWVBFX01BSU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlzX3l1diA9ICgoZW50aXR5LmZsYWdzICYgQ0FNX1NFTlNPUl9GT1JNQVRfTUFTSykgPworICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1NFTlNPUl9ZVVY6Q0FNX1NFTlNPUl9SQVcpOworICAgICAgICAgICAgICAgIExPR0woImluZGV4ID0gJXUgZmxhZyA9ICV4IG1vdW50X2FuZ2xlID0gJXUgIgorICAgICAgICAgICAgICAgICAgICAgICAgImZhY2luZyA9ICV1IHR5cGU6ICV1IGlzX3l1diA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCludW1fY2FtZXJhcywgKHVuc2lnbmVkIGludCl0ZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCltb3VudF9hbmdsZSwgKHVuc2lnbmVkIGludClmYWNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgaW50KXR5cGUsICh1aW50OF90KWlzX3l1dik7CisgICAgICAgICAgICAgICAgZ19jYW1fY3RybC5pbmZvW251bV9jYW1lcmFzXS5mYWNpbmcgPSAoaW50KWZhY2luZzsKKyAgICAgICAgICAgICAgICBnX2NhbV9jdHJsLmluZm9bbnVtX2NhbWVyYXNdLm9yaWVudGF0aW9uID0gKGludCltb3VudF9hbmdsZTsKKyAgICAgICAgICAgICAgICBnX2NhbV9jdHJsLmNhbV90eXBlW251bV9jYW1lcmFzXSA9IHR5cGU7CisgICAgICAgICAgICAgICAgZ19jYW1fY3RybC5pc195dXZbbnVtX2NhbWVyYXNdID0gaXNfeXV2OworICAgICAgICAgICAgICAgIExPR0QoImRldl9pbmZvW2lkPSV6dSxuYW1lPSclcyddXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9jYW1lcmFzLCBnX2NhbV9jdHJsLnZpZGVvX2Rldl9uYW1lW251bV9jYW1lcmFzXSk7CisgICAgICAgICAgICAgICAgbnVtX2NhbWVyYXMrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zZShkZXZfZmQpOworICAgICAgICBkZXZfZmQgPSAtMTsKKyAgICB9CisKKyAgICBMT0dEKCJudW1fY2FtZXJhcz0lZFxuIiwgZ19jYW1fY3RybC5udW1fY2FtKTsKKyAgICByZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogc29ydF9jYW1lcmFfaW5mbworICoKKyAqIERFU0NSSVBUSU9OOiBzb3J0IGNhbWVyYSBpbmZvIHRvIGtlZXAgYmFjayBjYW1lcmFzIGlkeCBpcyBzbWFsbGVyIHRoYW4gZnJvbnQgY2FtZXJhcyBpZHgKKyAqCisgKiBQQVJBTUVURVJTIDogbnVtYmVyIG9mIGNhbWVyYXMKKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBzb3J0X2NhbWVyYV9pbmZvKGludCBudW1fY2FtKQoreworICAgIGludCBpZHggPSAwLCBpOworICAgIGludDhfdCBpc195dXZfYXV4X2NhbV9leHBvc2VkID0gMDsKKyAgICBjaGFyIHByb3BbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gdGVtcF9pbmZvW01NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlNdOworICAgIGNhbV9zeW5jX3R5cGVfdCB0ZW1wX3R5cGVbTU1fQ0FNRVJBX01BWF9OVU1fU0VOU09SU107CisgICAgY2FtX3N5bmNfbW9kZV90IHRlbXBfbW9kZVtNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTXTsKKyAgICB1aW50OF90IHRlbXBfaXNfeXV2W01NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlNdOworICAgIGNoYXIgdGVtcF9kZXZfbmFtZVtNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTXVtNTV9DQU1FUkFfREVWX05BTUVfTEVOXTsKKworICAgIG1lbXNldCh0ZW1wX2luZm8sIDAsIHNpemVvZih0ZW1wX2luZm8pKTsKKyAgICBtZW1zZXQodGVtcF9kZXZfbmFtZSwgMCwgc2l6ZW9mKHRlbXBfZGV2X25hbWUpKTsKKyAgICBtZW1zZXQodGVtcF90eXBlLCAwLCBzaXplb2YodGVtcF90eXBlKSk7CisgICAgbWVtc2V0KHRlbXBfbW9kZSwgMCwgc2l6ZW9mKHRlbXBfbW9kZSkpOworICAgIG1lbXNldCh0ZW1wX2lzX3l1diwgMCwgc2l6ZW9mKHRlbXBfaXNfeXV2KSk7CisKKyAgICAvLyBTaWduaWZpZXMgd2hldGhlciBZVVYgQVVYIGNhbWVyYSBoYXMgdG8gYmUgZXhwb3NlZCBhcyBwaHlzaWNhbCBjYW1lcmEKKyAgICBtZW1zZXQocHJvcCwgMCwgc2l6ZW9mKHByb3ApKTsKKyAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmF1eC55dXYiLCBwcm9wLCAiMCIpOworICAgIGlzX3l1dl9hdXhfY2FtX2V4cG9zZWQgPSBhdG9pKHByb3ApOworICAgIExPR0koIllVViBBdXggY2FtZXJhIGV4cG9zZWQgJWQiLGlzX3l1dl9hdXhfY2FtX2V4cG9zZWQpOworCisgICAgLyogT3JkZXIgb2YgdGhlIGNhbWVyYSBleHBvc2VkIGlzCisgICAgQmFjayBtYWluLCBGcm9udCBtYWluLCBCYWNrIEF1eCBhbmQgdGhlbiBGcm9udCBBdXguCisgICAgSXQgaXMgYmVjYXVzZSB0aGF0IGxvdCBvZiAzcmQgcGFydHkgY2FtZXJhcyBhcHBzCisgICAgYmxpbmRseSBhc3N1bWUgMHRoIGlzIEJhY2sgYW5kIDFzdCBpcyBmcm9udCAqLworCisgICAgLyogRmlyc3RseSBzYXZlIHRoZSBtYWluIGJhY2sgY2FtZXJhcyBpbmZvICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9jYW07IGkrKykgeworICAgICAgICBpZiAoKGdfY2FtX2N0cmwuaW5mb1tpXS5mYWNpbmcgPT0gQ0FNRVJBX0ZBQ0lOR19CQUNLKSAmJgorICAgICAgICAgICAgKGdfY2FtX2N0cmwuY2FtX3R5cGVbaV0gIT0gQ0FNX1RZUEVfQVVYKSkgeworICAgICAgICAgICAgdGVtcF9pbmZvW2lkeF0gPSBnX2NhbV9jdHJsLmluZm9baV07CisgICAgICAgICAgICB0ZW1wX3R5cGVbaWR4XSA9IGdfY2FtX2N0cmwuY2FtX3R5cGVbaV07CisgICAgICAgICAgICB0ZW1wX21vZGVbaWR4XSA9IGdfY2FtX2N0cmwuY2FtX21vZGVbaV07CisgICAgICAgICAgICB0ZW1wX2lzX3l1dltpZHhdID0gZ19jYW1fY3RybC5pc195dXZbaV07CisgICAgICAgICAgICBMT0dEKCJGb3VuZCBCYWNrIE1haW4gQ2FtZXJhOiBpOiAlZCBpZHg6ICVkIiwgaSwgaWR4KTsKKyAgICAgICAgICAgIG1lbWNweSh0ZW1wX2Rldl9uYW1lW2lkeCsrXSxnX2NhbV9jdHJsLnZpZGVvX2Rldl9uYW1lW2ldLAorICAgICAgICAgICAgICAgIE1NX0NBTUVSQV9ERVZfTkFNRV9MRU4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2F2ZSB0aGUgbWFpbiBmcm9udCBjYW1lcmFzIGluZm8gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NhbTsgaSsrKSB7CisgICAgICAgIGlmICgoZ19jYW1fY3RybC5pbmZvW2ldLmZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0ZST05UKSAmJgorICAgICAgICAgICAgKGdfY2FtX2N0cmwuY2FtX3R5cGVbaV0gIT0gQ0FNX1RZUEVfQVVYKSkgeworICAgICAgICAgICAgdGVtcF9pbmZvW2lkeF0gPSBnX2NhbV9jdHJsLmluZm9baV07CisgICAgICAgICAgICB0ZW1wX3R5cGVbaWR4XSA9IGdfY2FtX2N0cmwuY2FtX3R5cGVbaV07CisgICAgICAgICAgICB0ZW1wX21vZGVbaWR4XSA9IGdfY2FtX2N0cmwuY2FtX21vZGVbaV07CisgICAgICAgICAgICB0ZW1wX2lzX3l1dltpZHhdID0gZ19jYW1fY3RybC5pc195dXZbaV07CisgICAgICAgICAgICBMT0dEKCJGb3VuZCBGcm9udCBNYWluIENhbWVyYTogaTogJWQgaWR4OiAlZCIsIGksIGlkeCk7CisgICAgICAgICAgICBtZW1jcHkodGVtcF9kZXZfbmFtZVtpZHgrK10sZ19jYW1fY3RybC52aWRlb19kZXZfbmFtZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0RFVl9OQU1FX0xFTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFeHBvc2UgWVVWIEFVWCBjYW1lcmEgaWYgcGVyc2lzdC5jYW1lcmEuYXV4Lnl1diBpcyBzZXQgdG8gMS4KKyAgICBPdGhlcndzaWUgZXhwb3NlIEFVWCBjYW1lcmEgaWYgaXQgaXMgbm90IFlVVi4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NhbTsgaSsrKSB7CisgICAgICAgIGlmICgoZ19jYW1fY3RybC5pbmZvW2ldLmZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0JBQ0spICYmCisgICAgICAgICAgICAgICAgKGdfY2FtX2N0cmwuY2FtX3R5cGVbaV0gPT0gQ0FNX1RZUEVfQVVYKSAmJgorICAgICAgICAgICAgICAgIChpc195dXZfYXV4X2NhbV9leHBvc2VkIHx8ICEoZ19jYW1fY3RybC5pc195dXZbaV0pKSkgeworICAgICAgICAgICAgdGVtcF9pbmZvW2lkeF0gPSBnX2NhbV9jdHJsLmluZm9baV07CisgICAgICAgICAgICB0ZW1wX3R5cGVbaWR4XSA9IGdfY2FtX2N0cmwuY2FtX3R5cGVbaV07CisgICAgICAgICAgICB0ZW1wX21vZGVbaWR4XSA9IGdfY2FtX2N0cmwuY2FtX21vZGVbaV07CisgICAgICAgICAgICB0ZW1wX2lzX3l1dltpZHhdID0gZ19jYW1fY3RybC5pc195dXZbaV07CisgICAgICAgICAgICBMT0dEKCJGb3VuZCBiYWNrIEF1eCBDYW1lcmE6IGk6ICVkIGlkeDogJWQiLCBpLCBpZHgpOworICAgICAgICAgICAgbWVtY3B5KHRlbXBfZGV2X25hbWVbaWR4KytdLGdfY2FtX2N0cmwudmlkZW9fZGV2X25hbWVbaV0sCisgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0RFVl9OQU1FX0xFTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBFeHBvc2UgWVVWIEFVWCBjYW1lcmEgaWYgcGVyc2lzdC5jYW1lcmEuYXV4Lnl1diBpcyBzZXQgdG8gMS4KKyAgICBPdGhlcndzaWUgZXhwb3NlIEFVWCBjYW1lcmEgaWYgaXQgaXMgbm90IFlVVi4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NhbTsgaSsrKSB7CisgICAgICAgIGlmICgoZ19jYW1fY3RybC5pbmZvW2ldLmZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0ZST05UKSAmJgorICAgICAgICAgICAgICAgIChnX2NhbV9jdHJsLmNhbV90eXBlW2ldID09IENBTV9UWVBFX0FVWCkgJiYKKyAgICAgICAgICAgICAgICAoaXNfeXV2X2F1eF9jYW1fZXhwb3NlZCB8fCAhKGdfY2FtX2N0cmwuaXNfeXV2W2ldKSkpIHsKKyAgICAgICAgICAgIHRlbXBfaW5mb1tpZHhdID0gZ19jYW1fY3RybC5pbmZvW2ldOworICAgICAgICAgICAgdGVtcF90eXBlW2lkeF0gPSBnX2NhbV9jdHJsLmNhbV90eXBlW2ldOworICAgICAgICAgICAgdGVtcF9tb2RlW2lkeF0gPSBnX2NhbV9jdHJsLmNhbV9tb2RlW2ldOworICAgICAgICAgICAgdGVtcF9pc195dXZbaWR4XSA9IGdfY2FtX2N0cmwuaXNfeXV2W2ldOworICAgICAgICAgICAgTE9HRCgiRm91bmQgRnJvbnQgQXV4IENhbWVyYTogaTogJWQgaWR4OiAlZCIsIGksIGlkeCk7CisgICAgICAgICAgICBtZW1jcHkodGVtcF9kZXZfbmFtZVtpZHgrK10sZ19jYW1fY3RybC52aWRlb19kZXZfbmFtZVtpXSwKKyAgICAgICAgICAgICAgICBNTV9DQU1FUkFfREVWX05BTUVfTEVOKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpZHggPD0gbnVtX2NhbSkgeworICAgICAgICBtZW1jcHkoZ19jYW1fY3RybC5pbmZvLCB0ZW1wX2luZm8sIHNpemVvZih0ZW1wX2luZm8pKTsKKyAgICAgICAgbWVtY3B5KGdfY2FtX2N0cmwuY2FtX3R5cGUsIHRlbXBfdHlwZSwgc2l6ZW9mKHRlbXBfdHlwZSkpOworICAgICAgICBtZW1jcHkoZ19jYW1fY3RybC5jYW1fbW9kZSwgdGVtcF9tb2RlLCBzaXplb2YodGVtcF9tb2RlKSk7CisgICAgICAgIG1lbWNweShnX2NhbV9jdHJsLmlzX3l1diwgdGVtcF9pc195dXYsIHNpemVvZih0ZW1wX2lzX3l1dikpOworICAgICAgICBtZW1jcHkoZ19jYW1fY3RybC52aWRlb19kZXZfbmFtZSwgdGVtcF9kZXZfbmFtZSwgc2l6ZW9mKHRlbXBfZGV2X25hbWUpKTsKKyAgICAgICAgLy9TZXQgbnVtIGNhbSBiYXNlZCBvbiB0aGUgY2FtZXJhcyBleHBvc2VkIGZpbmFsbHkgdmlhIGR1YWwvYXV4IHByb3BlcnRpZXMuCisgICAgICAgIGdfY2FtX2N0cmwubnVtX2NhbSA9IGlkeDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGlkeDsgaSsrKSB7CisgICAgICAgICAgICBMT0dJKCJDYW1lcmEgaWQ6ICVkIGZhY2luZzogJWQsIHR5cGU6ICVkIGlzX3l1djogJWQiLAorICAgICAgICAgICAgICAgIGksIGdfY2FtX2N0cmwuaW5mb1tpXS5mYWNpbmcsIGdfY2FtX2N0cmwuY2FtX3R5cGVbaV0sIGdfY2FtX2N0cmwuaXNfeXV2W2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0dJKCJOdW1iZXIgb2YgY2FtZXJhcyAlZCBzb3J0ZWQgJWQiLCBudW1fY2FtLCBpZHgpOworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRfbnVtX29mX2NhbWVyYXMKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IG51bWJlciBvZiBjYW1lcmFzCisgKgorICogUEFSQU1FVEVSUyA6CisgKgorICogUkVUVVJOICAgICA6IG51bWJlciBvZiBjYW1lcmFzIHN1cHBvcnRlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50OF90IGdldF9udW1fb2ZfY2FtZXJhcygpCit7CisgICAgaW50IHJjID0gMDsKKyAgICBpbnQgZGV2X2ZkID0gLTE7CisgICAgc3RydWN0IG1lZGlhX2RldmljZV9pbmZvIG1kZXZfaW5mbzsKKyAgICBpbnQgbnVtX21lZGlhX2RldmljZXMgPSAwOworICAgIGludDhfdCBudW1fY2FtZXJhcyA9IDA7CisgICAgY2hhciBzdWJkZXZfbmFtZVszMl07CisgICAgaW50MzJfdCBzZF9mZCA9IC0xOworICAgIHN0cnVjdCBzZW5zb3JfaW5pdF9jZmdfZGF0YSBjZmc7CisgICAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICBMT0dEKCJFIik7CisKKyAgICBwcm9wZXJ0eV9nZXQoInZvbGQuZGVjcnlwdCIsIHByb3AsICIwIik7CisgICAgaW50IGRlY3J5cHQgPSBhdG9pKHByb3ApOworICAgIGlmIChkZWNyeXB0ID09IDEpCisgICAgIHJldHVybiAwOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworCisgICAgbWVtc2V0ICgmZ19jYW1fY3RybCwgMCwgc2l6ZW9mIChnX2NhbV9jdHJsKSk7CisjaWZuZGVmIERBRU1PTl9QUkVTRU5UCisgICAgaWYgKG1tX2NhbWVyYV9sb2FkX3NoaW1fbGliKCkgPCAwKSB7CisgICAgICAgIExPR0UgKCJGYWlsZWQgdG8gbW9kdWxlIHNoaW0gbGlicmFyeSIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisjZW5kaWYgLyogREFFTU9OX1BSRVNFTlQgKi8KKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHVpbnQzMl90IG51bV9lbnRpdGllcyA9IDFVOworICAgICAgICBjaGFyIGRldl9uYW1lWzMyXTsKKworICAgICAgICBzbnByaW50ZihkZXZfbmFtZSwgc2l6ZW9mKGRldl9uYW1lKSwgIi9kZXYvbWVkaWElZCIsIG51bV9tZWRpYV9kZXZpY2VzKTsKKyAgICAgICAgZGV2X2ZkID0gb3BlbihkZXZfbmFtZSwgT19SRFdSIHwgT19OT05CTE9DSyk7CisgICAgICAgIGlmIChkZXZfZmQgPCAwKSB7CisgICAgICAgICAgICBMT0dEKCJEb25lIGRpc2NvdmVyaW5nIG1lZGlhIGRldmljZXNcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbnVtX21lZGlhX2RldmljZXMrKzsKKyAgICAgICAgcmMgPSBpb2N0bChkZXZfZmQsIE1FRElBX0lPQ19ERVZJQ0VfSU5GTywgJm1kZXZfaW5mbyk7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIkVycm9yOiBpb2N0bCBtZWRpYV9kZXYgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGNsb3NlKGRldl9mZCk7CisgICAgICAgICAgICBkZXZfZmQgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0cm5jbXAobWRldl9pbmZvLm1vZGVsLCBNU01fQ09ORklHVVJBVElPTl9OQU1FLAorICAgICAgICAgIHNpemVvZihtZGV2X2luZm8ubW9kZWwpKSAhPSAwKSB7CisgICAgICAgICAgICBjbG9zZShkZXZfZmQpOworICAgICAgICAgICAgZGV2X2ZkID0gLTE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzdHJ1Y3QgbWVkaWFfZW50aXR5X2Rlc2MgZW50aXR5OworICAgICAgICAgICAgbWVtc2V0KCZlbnRpdHksIDAsIHNpemVvZihlbnRpdHkpKTsKKyAgICAgICAgICAgIGVudGl0eS5pZCA9IG51bV9lbnRpdGllcysrOworICAgICAgICAgICAgTE9HRCgiZW50aXR5IGlkICVkIiwgZW50aXR5LmlkKTsKKyAgICAgICAgICAgIHJjID0gaW9jdGwoZGV2X2ZkLCBNRURJQV9JT0NfRU5VTV9FTlRJVElFUywgJmVudGl0eSk7CisgICAgICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRCgiRG9uZSBlbnVtZXJhdGluZyBtZWRpYSBlbnRpdGllcyIpOworICAgICAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR0QoImVudGl0eSBuYW1lICVzIHR5cGUgJWQgZ3JvdXAgaWQgJWQiLAorICAgICAgICAgICAgICAgIGVudGl0eS5uYW1lLCBlbnRpdHkudHlwZSwgZW50aXR5Lmdyb3VwX2lkKTsKKyAgICAgICAgICAgIGlmIChlbnRpdHkudHlwZSA9PSBNRURJQV9FTlRfVF9WNEwyX1NVQkRFViAmJgorICAgICAgICAgICAgICAgIGVudGl0eS5ncm91cF9pZCA9PSBNU01fQ0FNRVJBX1NVQkRFVl9TRU5TT1JfSU5JVCkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKHN1YmRldl9uYW1lLCBzaXplb2YoZGV2X25hbWUpLCAiL2Rldi8lcyIsIGVudGl0eS5uYW1lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zZShkZXZfZmQpOworICAgICAgICBkZXZfZmQgPSAtMTsKKyAgICB9CisKKyAgICAvKiBPcGVuIHNlbnNvcl9pbml0IHN1YmRldiAqLworICAgIHNkX2ZkID0gb3BlbihzdWJkZXZfbmFtZSwgT19SRFdSKTsKKyAgICBpZiAoc2RfZmQgPCAwKSB7CisgICAgICAgIExPR0UoIk9wZW4gc2Vuc29yX2luaXQgc3ViZGV2IGZhaWxlZCIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgY2ZnLmNmZ3R5cGUgPSBDRkdfU0lOSVRfUFJPQkVfV0FJVF9ET05FOworICAgIGNmZy5jZmcuc2V0dGluZyA9IE5VTEw7CisgICAgaWYgKGlvY3RsKHNkX2ZkLCBWSURJT0NfTVNNX1NFTlNPUl9JTklUX0NGRywgJmNmZykgPCAwKSB7CisgICAgICAgIExPR0UoImZhaWxlZCIpOworICAgIH0KKyAgICBjbG9zZShzZF9mZCk7CisgICAgZGV2X2ZkID0gLTE7CisKKworICAgIG51bV9tZWRpYV9kZXZpY2VzID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB1aW50MzJfdCBudW1fZW50aXRpZXMgPSAxVTsKKyAgICAgICAgY2hhciBkZXZfbmFtZVszMl07CisKKyAgICAgICAgc25wcmludGYoZGV2X25hbWUsIHNpemVvZihkZXZfbmFtZSksICIvZGV2L21lZGlhJWQiLCBudW1fbWVkaWFfZGV2aWNlcyk7CisgICAgICAgIGRldl9mZCA9IG9wZW4oZGV2X25hbWUsIE9fUkRXUiB8IE9fTk9OQkxPQ0spOworICAgICAgICBpZiAoZGV2X2ZkIDwgMCkgeworICAgICAgICAgICAgTE9HRCgiRG9uZSBkaXNjb3ZlcmluZyBtZWRpYSBkZXZpY2VzOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG51bV9tZWRpYV9kZXZpY2VzKys7CisgICAgICAgIG1lbXNldCgmbWRldl9pbmZvLCAwLCBzaXplb2YobWRldl9pbmZvKSk7CisgICAgICAgIHJjID0gaW9jdGwoZGV2X2ZkLCBNRURJQV9JT0NfREVWSUNFX0lORk8sICZtZGV2X2luZm8pOworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvcjogaW9jdGwgbWVkaWFfZGV2IGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBjbG9zZShkZXZfZmQpOworICAgICAgICAgICAgZGV2X2ZkID0gLTE7CisgICAgICAgICAgICBudW1fY2FtZXJhcyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHN0cm5jbXAobWRldl9pbmZvLm1vZGVsLCBNU01fQ0FNRVJBX05BTUUsIHNpemVvZihtZGV2X2luZm8ubW9kZWwpKSAhPSAwKSB7CisgICAgICAgICAgICBjbG9zZShkZXZfZmQpOworICAgICAgICAgICAgZGV2X2ZkID0gLTE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzdHJ1Y3QgbWVkaWFfZW50aXR5X2Rlc2MgZW50aXR5OworICAgICAgICAgICAgbWVtc2V0KCZlbnRpdHksIDAsIHNpemVvZihlbnRpdHkpKTsKKyAgICAgICAgICAgIGVudGl0eS5pZCA9IG51bV9lbnRpdGllcysrOworICAgICAgICAgICAgcmMgPSBpb2N0bChkZXZfZmQsIE1FRElBX0lPQ19FTlVNX0VOVElUSUVTLCAmZW50aXR5KTsKKyAgICAgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dEKCJEb25lIGVudW1lcmF0aW5nIG1lZGlhIGVudGl0aWVzXG4iKTsKKyAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihlbnRpdHkudHlwZSA9PSBNRURJQV9FTlRfVF9ERVZOT0RFX1Y0TCAmJiBlbnRpdHkuZ3JvdXBfaWQgPT0gUUNBTUVSQV9WTk9ERV9HUk9VUF9JRCkgeworICAgICAgICAgICAgICAgIHN0cmxjcHkoZ19jYW1fY3RybC52aWRlb19kZXZfbmFtZVtudW1fY2FtZXJhc10sCisgICAgICAgICAgICAgICAgICAgICBlbnRpdHkubmFtZSwgc2l6ZW9mKGVudGl0eS5uYW1lKSk7CisgICAgICAgICAgICAgICAgTE9HSSgiZGV2X2luZm9baWQ9JWQsbmFtZT0nJXMnXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgKGludCludW1fY2FtZXJhcywgZ19jYW1fY3RybC52aWRlb19kZXZfbmFtZVtudW1fY2FtZXJhc10pOworICAgICAgICAgICAgICAgIG51bV9jYW1lcmFzKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2xvc2UoZGV2X2ZkKTsKKyAgICAgICAgZGV2X2ZkID0gLTE7CisgICAgICAgIGlmIChudW1fY2FtZXJhcyA+PSBNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTKSB7CisgICAgICAgICAgICBMT0dXKCJNYXhpbXVtIG51bWJlciBvZiBjYW1lcmEgcmVhY2hlZCAlZCIsIG51bV9jYW1lcmFzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGdfY2FtX2N0cmwubnVtX2NhbSA9IG51bV9jYW1lcmFzOworCisgICAgZ2V0X3NlbnNvcl9pbmZvKCk7CisgICAgc29ydF9jYW1lcmFfaW5mbyhnX2NhbV9jdHJsLm51bV9jYW0pOworICAgIC8qIHVubG9jayB0aGUgbXV0ZXggKi8KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIExPR0koIm51bV9jYW1lcmFzPSVkXG4iLCAoaW50KWdfY2FtX2N0cmwubnVtX2NhbSk7CisgICAgcmV0dXJuKHVpbnQ4X3QpZ19jYW1fY3RybC5udW1fY2FtOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9pbnRmX3Byb2Nlc3NfYWR2YW5jZWRfY2FwdHVyZQorICoKKyAqIERFU0NSSVBUSU9OOiBDb25maWd1cmVzIGNoYW5uZWwgYWR2YW5jZWQgY2FwdHVyZSBtb2RlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKiAgIEB0eXBlIDogYWR2YW5jZWQgY2FwdHVyZSB0eXBlCisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAdHJpZ2dlciAgOiAxIGZvciBzdGFydCBhbmQgMCBmb3IgY2FuY2VsL3N0b3AKKyAqICAgQHZhbHVlICA6IGlucHV0IGNhcHR1cmUgY29uZmlnYXJhdGlvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX2ludGZfcHJvY2Vzc19hZHZhbmNlZF9jYXB0dXJlKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgIHVpbnQzMl90IGNoX2lkLCBtbV9jYW1lcmFfYWR2YW5jZWRfY2FwdHVyZV90IHR5cGUsCisgICAgICAgIGludDhfdCB0cmlnZ2VyLCB2b2lkICppbl92YWx1ZSkKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKKworICAgIExPR0QoIkUgY2FtZXJhX2hhbmRsZXIgPSAlZCxjaF9pZCA9ICVkIiwKKyAgICAgICAgICBjYW1lcmFfaGFuZGxlLCBjaF9pZCk7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX2NoYW5uZWxfYWR2YW5jZWRfY2FwdHVyZShteV9vYmosIGNoX2lkLCB0eXBlLAorICAgICAgICAgICAgICAgICh1aW50MzJfdCl0cmlnZ2VyLCBpbl92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICB9CisgICAgTE9HRCgiWCAiKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX2ludGZfcmVnaXN0ZXJfc3RyZWFtX2J1Zl9jYgorICoKKyAqIERFU0NSSVBUSU9OOiBSZWdpc3RlciBzcGVjaWFsIGNhbGxiYWNrIGZvciBzdHJlYW0gYnVmZmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaGFuZGxlOiBjYW1lcmEgaGFuZGxlCisgKiAgIEBjaF9pZCAgICAgICAgOiBjaGFubmVsIGhhbmRsZQorICogICBAc3RyZWFtX2lkICAgIDogc3RyZWFtIGhhbmRsZQorICogICBAYnVmX2NiICAgICAgIDogY2FsbGJhY2sgZnVuY3Rpb24KKyAqICAgQGJ1Zl90eXBlICAgICA6U1lOQy9BU1lOQworICogICBAdXNlcmRhdGEgICAgIDogdXNlcmRhdGEgcG9pbnRlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIDEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50MzJfdCBtbV9jYW1lcmFfaW50Zl9yZWdpc3Rlcl9zdHJlYW1fYnVmX2NiKHVpbnQzMl90IGNhbWVyYV9oYW5kbGUsCisgICAgICAgIHVpbnQzMl90IGNoX2lkLCB1aW50MzJfdCBzdHJlYW1faWQsIG1tX2NhbWVyYV9idWZfbm90aWZ5X3QgYnVmX2NiLAorICAgICAgICBtbV9jYW1lcmFfc3RyZWFtX2NiX3R5cGUgY2JfdHlwZSwgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgbW1fY2FtZXJhX29ial90ICogbXlfb2JqID0gTlVMTDsKKworICAgIExPR0QoIkUgaGFuZGxlID0gJXUgY2hfaWQgPSAldSIsCisgICAgICAgICAgY2FtZXJhX2hhbmRsZSwgY2hfaWQpOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgbXlfb2JqID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2NhbWVyYV9ieV9oYW5kbGVyKGNhbWVyYV9oYW5kbGUpOworCisgICAgaWYobXlfb2JqKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYW1fbG9jayk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX3JlZ19zdHJlYW1fYnVmX2NiKG15X29iaiwgY2hfaWQsIHN0cmVhbV9pZCwKKyAgICAgICAgICAgICAgICBidWZfY2IsIGNiX3R5cGUsIHVzZXJkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIH0KKyAgICByZXR1cm4gKGludDMyX3QpcmM7Cit9CisKK3N0cnVjdCBjYW1lcmFfaW5mbyAqZ2V0X2NhbV9pbmZvKHVpbnQzMl90IGNhbWVyYV9pZCwgY2FtX3N5bmNfdHlwZV90ICpwQ2FtVHlwZSkKK3sKKyAgICAqcENhbVR5cGUgPSBnX2NhbV9jdHJsLmNhbV90eXBlW2NhbWVyYV9pZF07CisgICAgcmV0dXJuICZnX2NhbV9jdHJsLmluZm9bY2FtZXJhX2lkXTsKK30KKwordWludDhfdCBpc195dXZfc2Vuc29yKHVpbnQzMl90IGNhbWVyYV9pZCkKK3sKKyAgICByZXR1cm4gZ19jYW1fY3RybC5pc195dXZbY2FtZXJhX2lkXTsKK30KKworLyogY2FtZXJhIG9wcyB2LXRhYmxlICovCitzdGF0aWMgbW1fY2FtZXJhX29wc190IG1tX2NhbWVyYV9vcHMgPSB7CisgICAgLnF1ZXJ5X2NhcGFiaWxpdHkgPSBtbV9jYW1lcmFfaW50Zl9xdWVyeV9jYXBhYmlsaXR5LAorICAgIC5yZWdpc3Rlcl9ldmVudF9ub3RpZnkgPSBtbV9jYW1lcmFfaW50Zl9yZWdpc3Rlcl9ldmVudF9ub3RpZnksCisgICAgLmNsb3NlX2NhbWVyYSA9IG1tX2NhbWVyYV9pbnRmX2Nsb3NlLAorICAgIC5zZXRfcGFybXMgPSBtbV9jYW1lcmFfaW50Zl9zZXRfcGFybXMsCisgICAgLmdldF9wYXJtcyA9IG1tX2NhbWVyYV9pbnRmX2dldF9wYXJtcywKKyAgICAuZG9fYXV0b19mb2N1cyA9IG1tX2NhbWVyYV9pbnRmX2RvX2F1dG9fZm9jdXMsCisgICAgLmNhbmNlbF9hdXRvX2ZvY3VzID0gbW1fY2FtZXJhX2ludGZfY2FuY2VsX2F1dG9fZm9jdXMsCisgICAgLnByZXBhcmVfc25hcHNob3QgPSBtbV9jYW1lcmFfaW50Zl9wcmVwYXJlX3NuYXBzaG90LAorICAgIC5zdGFydF96c2xfc25hcHNob3QgPSBtbV9jYW1lcmFfaW50Zl9zdGFydF96c2xfc25hcHNob3QsCisgICAgLnN0b3BfenNsX3NuYXBzaG90ID0gbW1fY2FtZXJhX2ludGZfc3RvcF96c2xfc25hcHNob3QsCisgICAgLm1hcF9idWYgPSBtbV9jYW1lcmFfaW50Zl9tYXBfYnVmLAorICAgIC5tYXBfYnVmcyA9IG1tX2NhbWVyYV9pbnRmX21hcF9idWZzLAorICAgIC51bm1hcF9idWYgPSBtbV9jYW1lcmFfaW50Zl91bm1hcF9idWYsCisgICAgLmFkZF9jaGFubmVsID0gbW1fY2FtZXJhX2ludGZfYWRkX2NoYW5uZWwsCisgICAgLmRlbGV0ZV9jaGFubmVsID0gbW1fY2FtZXJhX2ludGZfZGVsX2NoYW5uZWwsCisgICAgLmdldF9idW5kbGVfaW5mbyA9IG1tX2NhbWVyYV9pbnRmX2dldF9idW5kbGVfaW5mbywKKyAgICAuYWRkX3N0cmVhbSA9IG1tX2NhbWVyYV9pbnRmX2FkZF9zdHJlYW0sCisgICAgLmxpbmtfc3RyZWFtID0gbW1fY2FtZXJhX2ludGZfbGlua19zdHJlYW0sCisgICAgLmRlbGV0ZV9zdHJlYW0gPSBtbV9jYW1lcmFfaW50Zl9kZWxfc3RyZWFtLAorICAgIC5jb25maWdfc3RyZWFtID0gbW1fY2FtZXJhX2ludGZfY29uZmlnX3N0cmVhbSwKKyAgICAucWJ1ZiA9IG1tX2NhbWVyYV9pbnRmX3FidWYsCisgICAgLmdldF9xdWV1ZWRfYnVmX2NvdW50ID0gbW1fY2FtZXJhX2ludGZfZ2V0X3F1ZXVlZF9idWZfY291bnQsCisgICAgLm1hcF9zdHJlYW1fYnVmID0gbW1fY2FtZXJhX2ludGZfbWFwX3N0cmVhbV9idWYsCisgICAgLm1hcF9zdHJlYW1fYnVmcyA9IG1tX2NhbWVyYV9pbnRmX21hcF9zdHJlYW1fYnVmcywKKyAgICAudW5tYXBfc3RyZWFtX2J1ZiA9IG1tX2NhbWVyYV9pbnRmX3VubWFwX3N0cmVhbV9idWYsCisgICAgLnNldF9zdHJlYW1fcGFybXMgPSBtbV9jYW1lcmFfaW50Zl9zZXRfc3RyZWFtX3Bhcm1zLAorICAgIC5nZXRfc3RyZWFtX3Bhcm1zID0gbW1fY2FtZXJhX2ludGZfZ2V0X3N0cmVhbV9wYXJtcywKKyAgICAuc3RhcnRfY2hhbm5lbCA9IG1tX2NhbWVyYV9pbnRmX3N0YXJ0X2NoYW5uZWwsCisgICAgLnN0b3BfY2hhbm5lbCA9IG1tX2NhbWVyYV9pbnRmX3N0b3BfY2hhbm5lbCwKKyAgICAucmVxdWVzdF9zdXBlcl9idWYgPSBtbV9jYW1lcmFfaW50Zl9yZXF1ZXN0X3N1cGVyX2J1ZiwKKyAgICAuY2FuY2VsX3N1cGVyX2J1Zl9yZXF1ZXN0ID0gbW1fY2FtZXJhX2ludGZfY2FuY2VsX3N1cGVyX2J1Zl9yZXF1ZXN0LAorICAgIC5mbHVzaF9zdXBlcl9idWZfcXVldWUgPSBtbV9jYW1lcmFfaW50Zl9mbHVzaF9zdXBlcl9idWZfcXVldWUsCisgICAgLmNvbmZpZ3VyZV9ub3RpZnlfbW9kZSA9IG1tX2NhbWVyYV9pbnRmX2NvbmZpZ3VyZV9ub3RpZnlfbW9kZSwKKyAgICAucHJvY2Vzc19hZHZhbmNlZF9jYXB0dXJlID0gbW1fY2FtZXJhX2ludGZfcHJvY2Vzc19hZHZhbmNlZF9jYXB0dXJlLAorICAgIC5nZXRfc2Vzc2lvbl9pZCA9IG1tX2NhbWVyYV9pbnRmX2dldF9zZXNzaW9uX2lkLAorICAgIC5zeW5jX3JlbGF0ZWRfc2Vuc29ycyA9IG1tX2NhbWVyYV9pbnRmX3N5bmNfcmVsYXRlZF9zZW5zb3JzLAorICAgIC5mbHVzaCA9IG1tX2NhbWVyYV9pbnRmX2ZsdXNoLAorICAgIC5yZWdpc3Rlcl9zdHJlYW1fYnVmX2NiID0gbW1fY2FtZXJhX2ludGZfcmVnaXN0ZXJfc3RyZWFtX2J1Zl9jYgorfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBjYW1lcmFfb3BlbgorICoKKyAqIERFU0NSSVBUSU9OOiBvcGVuIGEgY2FtZXJhIGJ5IGNhbWVyYSBpbmRleAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtZXJhX2lkeCAgOiBjYW1lcmEgaW5kZXguIHNob3VsZCB3aXRoaW4gcmFuZ2Ugb2YgMCB0byBudW1fb2ZfY2FtZXJhcworICogICBAY2FtZXJhX3Z0YmwgOiBwdHIgdG8gYSB2aXJ0dWFsIHRhYmxlIGNvbnRhaW5pbmcgY2FtZXJhIGhhbmRsZSBhbmQgb3BlcmF0aW9uIHRhYmxlLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbi16ZXJvIGVycm9yIGNvZGUgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IGNhbWVyYV9vcGVuKHVpbnQ4X3QgY2FtZXJhX2lkeCwgbW1fY2FtZXJhX3Z0YmxfdCAqKmNhbWVyYV92dGJsKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIG1tX2NhbWVyYV9vYmpfdCAqY2FtX29iaiA9IE5VTEw7CisKKyNpZmRlZiBRQ0FNRVJBX1JFREVGSU5FX0xPRworICAgIG1tX2NhbWVyYV9zZXRfZGJnX2xvZ19wcm9wZXJ0aWVzKCk7CisjZW5kaWYKKworICAgIExPR0QoIkUgY2FtZXJhX2lkeCA9ICVkXG4iLCBjYW1lcmFfaWR4KTsKKyAgICBpZiAoY2FtZXJhX2lkeCA+PSBnX2NhbV9jdHJsLm51bV9jYW0pIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBjYW1lcmFfaWR4ICglZCkiLCBjYW1lcmFfaWR4KTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgICAgLyogb3BlbmVkIGFscmVhZHkgKi8KKyAgICBpZihOVUxMICE9IGdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmFfaWR4XSkgeworICAgICAgICAvKiBBZGQgcmVmZXJlbmNlICovCisgICAgICAgIGdfY2FtX2N0cmwuY2FtX29ialtjYW1lcmFfaWR4XS0+cmVmX2NvdW50Kys7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgIExPR0QoIm9wZW5lZCBhbHJlYWR5biIpOworICAgICAgICAqY2FtZXJhX3Z0YmwgPSAmZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYV9pZHhdLT52dGJsOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgY2FtX29iaiA9IChtbV9jYW1lcmFfb2JqX3QgKiltYWxsb2Moc2l6ZW9mKG1tX2NhbWVyYV9vYmpfdCkpOworICAgIGlmKE5VTEwgPT0gY2FtX29iaikgeworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgICAgICBMT0dFKCJubyBtZW0iKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBjYW1lcmEgb2JqICovCisgICAgbWVtc2V0KGNhbV9vYmosIDAsIHNpemVvZihtbV9jYW1lcmFfb2JqX3QpKTsKKyAgICBjYW1fb2JqLT5jdHJsX2ZkID0gLTE7CisgICAgY2FtX29iai0+ZHNfZmQgPSAtMTsKKyAgICBjYW1fb2JqLT5yZWZfY291bnQrKzsKKyAgICBjYW1fb2JqLT5teV9oZGwgPSBtbV9jYW1lcmFfdXRpbF9nZW5lcmF0ZV9oYW5kbGVyKGNhbWVyYV9pZHgpOworICAgIGNhbV9vYmotPnZ0YmwuY2FtZXJhX2hhbmRsZSA9IGNhbV9vYmotPm15X2hkbDsgLyogc2V0IGhhbmRsZXIgKi8KKyAgICBjYW1fb2JqLT52dGJsLm9wcyA9ICZtbV9jYW1lcmFfb3BzOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmY2FtX29iai0+Y2FtX2xvY2ssIE5VTEwpOworICAgIC8qIHVubG9jayBnbG9iYWwgaW50ZXJmYWNlIGxvY2ssIGlmIG5vdCwgaW4gZHVhbCBjYW1lcmEgdXNlIGNhc2UsCisgICAgICAqIGN1cnJlbnQgb3BlbiB3aWxsIGJsb2NrIG9wZXJhdGlvbiBvZiBhbm90aGVyIG9wZW5lZCBjYW1lcmEgb2JqKi8KKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmNhbV9vYmotPmNhbV9sb2NrKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworCisgICAgcmMgPSBtbV9jYW1lcmFfb3BlbihjYW1fb2JqKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIExPR0UoIm1tX2NhbWVyYV9vcGVuIGVyciA9ICVkIiwgcmMpOworICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmNhbV9vYmotPmNhbV9sb2NrKTsKKyAgICAgICAgZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYV9pZHhdID0gTlVMTDsKKyAgICAgICAgZnJlZShjYW1fb2JqKTsKKyAgICAgICAgY2FtX29iaiA9IE5VTEw7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICAgICpjYW1lcmFfdnRibCA9IE5VTEw7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJPcGVuIHN1Y2NlZGVkXG4iKTsKKyAgICAgICAgZ19jYW1fY3RybC5jYW1fb2JqW2NhbWVyYV9pZHhdID0gY2FtX29iajsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICAgICAgKmNhbWVyYV92dGJsID0gJmNhbV9vYmotPnZ0Ymw7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfbG9hZF9zaGltX2xpYgorICoKKyAqIERFU0NSSVBUSU9OOiBMb2FkIHNoaW0gbGF5ZXIgbGlicmFyeQorICoKKyAqIFBBUkFNRVRFUlMgOgorICoKKyAqIFJFVFVSTiAgICAgOiBzdGF0dXMgb2YgbG9hZCBzaGltIGxpYnJhcnkKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfbG9hZF9zaGltX2xpYigpCit7CisgICAgY29uc3QgY2hhciogZXJyb3IgPSBOVUxMOworICAgIHZvaWQgKnFkYWVtb25fbGliID0gTlVMTDsKKworICAgIExPR0QoIkUiKTsKKyAgICBxZGFlbW9uX2xpYiA9IGRsb3BlbihTSElNTEFZRVJfTElCLCBSVExEX05PVyk7CisgICAgaWYgKCFxZGFlbW9uX2xpYikgeworICAgICAgICBlcnJvciA9IGRsZXJyb3IoKTsKKyAgICAgICAgTE9HRSgiZGxvcGVuIGZhaWxlZCB3aXRoIGVycm9yICVzIiwgZXJyb3IgPyBlcnJvciA6ICIiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgICoodm9pZCAqKikmbW1fY2FtZXJhX3NoaW1fbW9kdWxlX2luaXQgPQorICAgICAgICAgICAgZGxzeW0ocWRhZW1vbl9saWIsICJtY3Rfc2hpbWxheWVyX3Byb2Nlc3NfbW9kdWxlX2luaXQiKTsKKyAgICBpZiAoIW1tX2NhbWVyYV9zaGltX21vZHVsZV9pbml0KSB7CisgICAgICAgIGVycm9yID0gZGxlcnJvcigpOworICAgICAgICBMT0dFKCJkbHN5bSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVzIiwgZXJyb3IgPyBlcnJvcjogIiIpOworICAgICAgICBkbGNsb3NlKHFkYWVtb25fbGliKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBtbV9jYW1lcmFfc2hpbV9tb2R1bGVfaW5pdCgmZ19jYW1fY3RybC5jYW1fc2hpbV9vcHMpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9tb2R1bGVfb3Blbl9zZXNzaW9uCisgKgorICogREVTQ1JJUFRJT046IHdyYXBwZXIgZnVuY3Rpb24gdG8gY2FsbCBzaGltIGxheWVyIEFQSSB0byBvcGVuIHNlc3Npb24uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzZXNzaW9uaWQgIDogc2Vzc2lvbklEIHRvIG9wZW4gc2Vzc2lvbgorICogICBAZXZ0X2NiICAgICA6IEV2ZW50IGNhbGxiYWNrIGZ1bmN0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uLXplcm8gZXJyb3IgY29kZSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2NhbV9zdGF0dXNfdCBtbV9jYW1lcmFfbW9kdWxlX29wZW5fc2Vzc2lvbihpbnQgc2Vzc2lvbmlkLAorICAgICAgICBtbV9jYW1lcmFfc2hpbV9ldmVudF9oYW5kbGVyX2Z1bmMgZXZ0X2NiKQoreworICAgIGNhbV9zdGF0dXNfdCByYyA9IC0xOworICAgIGlmKGdfY2FtX2N0cmwuY2FtX3NoaW1fb3BzLm1tX2NhbWVyYV9zaGltX29wZW5fc2Vzc2lvbikgeworICAgICAgICByYyA9IGdfY2FtX2N0cmwuY2FtX3NoaW1fb3BzLm1tX2NhbWVyYV9zaGltX29wZW5fc2Vzc2lvbigKKyAgICAgICAgICAgICAgICBzZXNzaW9uaWQsIGV2dF9jYik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfbW9kdWxlX2Nsb3NlX3Nlc3Npb24KKyAqCisgKiBERVNDUklQVElPTjogd3JhcHBlciBmdW5jdGlvbiB0byBjYWxsIHNoaW0gbGF5ZXIgQVBJIHRvIGNsb3NlIHNlc3Npb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHNlc3Npb25pZCAgOiBzZXNzaW9uSUQgdG8gb3BlbiBzZXNzaW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uLXplcm8gZXJyb3IgY29kZSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX21vZHVsZV9jbG9zZV9zZXNzaW9uKGludCBzZXNzaW9uKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBpZihnX2NhbV9jdHJsLmNhbV9zaGltX29wcy5tbV9jYW1lcmFfc2hpbV9jbG9zZV9zZXNzaW9uKSB7CisgICAgICAgIHJjID0gZ19jYW1fY3RybC5jYW1fc2hpbV9vcHMubW1fY2FtZXJhX3NoaW1fY2xvc2Vfc2Vzc2lvbihzZXNzaW9uKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9tb2R1bGVfb3Blbl9zZXNzaW9uCisgKgorICogREVTQ1JJUFRJT046IHdyYXBwZXIgZnVuY3Rpb24gdG8gY2FsbCBzaGltIGxheWVyIEFQSQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAc2Vzc2lvbmlkICA6IHNlc3Npb25JRCB0byBvcGVuIHNlc3Npb24KKyAqICAgQGV2dF9jYiAgICAgOiBFdmVudCBjYWxsYmFjayBmdW5jdGlvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbi16ZXJvIGVycm9yIGNvZGUgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX2NhbWVyYV9tb2R1bGVfc2VuZF9jbWQoY2FtX3NoaW1fcGFja2V0X3QgKmV2ZW50KQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBpZihnX2NhbV9jdHJsLmNhbV9zaGltX29wcy5tbV9jYW1lcmFfc2hpbV9zZW5kX2NtZCkgeworICAgICAgICByYyA9IGdfY2FtX2N0cmwuY2FtX3NoaW1fb3BzLm1tX2NhbWVyYV9zaGltX3NlbmRfY21kKGV2ZW50KTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9tb2R1bGVfZXZlbnRfaGFuZGxlcgorICoKKyAqIERFU0NSSVBUSU9OOiBjYWxsIGJhY2sgZnVuY3Rpb24gZm9yIHNoaW0gbGF5ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqCisgKiBSRVRVUk4gICAgIDogc3RhdHVzIG9mIGNhbGwgYmFjayBmdW5jdGlvbgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgbW1fY2FtZXJhX21vZHVsZV9ldmVudF9oYW5kbGVyKHVpbnQzMl90IHNlc3Npb25faWQsIGNhbV9ldmVudF90ICpldmVudCkKK3sKKyAgICBpZiAoIWV2ZW50KSB7CisgICAgICAgIExPR0UoIm51bGwgZXZlbnQiKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBtbV9jYW1lcmFfZXZlbnRfdCBldnQ7CisKKyAgICBMT0dEKCJzZXNzaW9uX2lkOiVkLCBjbWQ6MHgleCIsIHNlc3Npb25faWQsIGV2ZW50LT5zZXJ2ZXJfZXZlbnRfdHlwZSk7CisgICAgbWVtc2V0KCZldnQsIDAsIHNpemVvZihtbV9jYW1lcmFfZXZlbnRfdCkpOworCisgICAgZXZ0ID0gKmV2ZW50OworICAgIG1tX2NhbWVyYV9vYmpfdCAqbXlfb2JqID0KKyAgICAgICAgIG1tX2NhbWVyYV91dGlsX2dldF9jYW1lcmFfYnlfc2Vzc2lvbl9pZChzZXNzaW9uX2lkKTsKKyAgICBpZiAoIW15X29iaikgeworICAgICAgICBMT0dFKCJteV9vYmo6JXAiLCBteV9vYmopOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHN3aXRjaCggZXZ0LnNlcnZlcl9ldmVudF90eXBlKSB7CisgICAgICAgY2FzZSBDQU1fRVZFTlRfVFlQRV9EQUVNT05fUFVMTF9SRVE6CisgICAgICAgY2FzZSBDQU1fRVZFTlRfVFlQRV9DQUNfRE9ORToKKyAgICAgICBjYXNlIENBTV9FVkVOVF9UWVBFX0RBRU1PTl9ESUVEOgorICAgICAgIGNhc2UgQ0FNX0VWRU5UX1RZUEVfSU5UX1RBS0VfSlBFRzoKKyAgICAgICBjYXNlIENBTV9FVkVOVF9UWVBFX0lOVF9UQUtFX1JBVzoKKyAgICAgICAgICAgbW1fY2FtZXJhX2VucXVldWVfZXZ0KG15X29iaiwgJmV2dCk7CisgICAgICAgICAgIGJyZWFrOworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgIExPR0UoImNtZDoleCBmcm9tIHNoaW0gbGF5ZXIgaXMgbm90IGhhbmRsZWQiLCBldnQuc2VydmVyX2V2ZW50X3R5cGUpOworICAgICAgICAgICBicmVhazsKKyAgIH0KKyAgIHJldHVybiBUUlVFOworfQorCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9zcmMvbW1fY2FtZXJhX3NvY2suYyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmFfc29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTVkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLWludGVyZmFjZS9zcmMvbW1fY2FtZXJhX3NvY2suYwpAQCAtMCwwICsxLDI5NCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorI2luY2x1ZGUgIm1tX2NhbWVyYV9zb2NrLmgiCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3NvY2tldF9jcmVhdGUKKyAqCisgKiBERVNDUklQVElPTjogb3BlbnMgYSBkb21haW4gc29ja2V0IHRpZWQgdG8gY2FtZXJhIElEIGFuZCBzb2NrZXQgdHlwZQorICogIEBjYW1faWQgICA6IGNhbWVyYSBJRAorICogIEBzb2NrX3R5cGU6IHNvY2tldCB0eXBlLCBUQ1AvVURQCisgKgorICogUkVUVVJOICAgICA6IGZkIHJlbGF0ZWQgdG8gdGhlIGRvbWFpbiBzb2NrZXQKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IG1tX2NhbWVyYV9zb2NrZXRfY3JlYXRlKGludCBjYW1faWQsIG1tX2NhbWVyYV9zb2NrX3R5cGVfdCBzb2NrX3R5cGUpCit7CisgICAgaW50IHNvY2tldF9mZDsKKyAgICBtbV9jYW1lcmFfc29ja19hZGRyX3Qgc29ja19hZGRyOworICAgIGludCBza3R5cGU7CisgICAgaW50IHJjOworCisgICAgc3dpdGNoIChzb2NrX3R5cGUpCisgICAgeworICAgICAgY2FzZSBNTV9DQU1FUkFfU09DS19UWVBFX1VEUDoKKyAgICAgICAgc2t0eXBlID0gU09DS19ER1JBTTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1NX0NBTUVSQV9TT0NLX1RZUEVfVENQOgorICAgICAgICBza3R5cGUgPSBTT0NLX1NUUkVBTTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJ1bmtub3duIHNvY2tldCB0eXBlID0lZCIsIHNvY2tfdHlwZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc29ja2V0X2ZkID0gc29ja2V0KEFGX1VOSVgsIHNrdHlwZSwgMCk7CisgICAgaWYgKHNvY2tldF9mZCA8IDApIHsKKyAgICAgICAgTE9HRSgiZXJyb3IgY3JlYXRlIHNvY2tldCBmZCA9JWQiLCBzb2NrZXRfZmQpOworICAgICAgICByZXR1cm4gc29ja2V0X2ZkOworICAgIH0KKworICAgIG1lbXNldCgmc29ja19hZGRyLCAwLCBzaXplb2Yoc29ja19hZGRyKSk7CisgICAgc29ja19hZGRyLmFkZHJfdW4uc3VuX2ZhbWlseSA9IEFGX1VOSVg7CisgICAgc25wcmludGYoc29ja19hZGRyLmFkZHJfdW4uc3VuX3BhdGgsCisgICAgICAgICAgICAgVU5JWF9QQVRIX01BWCwgUUNBTUVSQV9EVU1QX0ZSTV9MT0NBVElPTiJjYW1fc29ja2V0JWQiLCBjYW1faWQpOworICAgIHJjID0gY29ubmVjdChzb2NrZXRfZmQsICZzb2NrX2FkZHIuYWRkciwgc2l6ZW9mKHNvY2tfYWRkci5hZGRyX3VuKSk7CisgICAgaWYgKDAgIT0gcmMpIHsKKyAgICAgIGNsb3NlKHNvY2tldF9mZCk7CisgICAgICBzb2NrZXRfZmQgPSAtMTsKKyAgICAgIExPR0UoInNvY2tldF9mZD0lZCAlcyAiLCBzb2NrZXRfZmQsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorCisgICAgTE9HRCgic29ja2V0X2ZkPSVkICVzIiwgc29ja2V0X2ZkLAorICAgICAgICBzb2NrX2FkZHIuYWRkcl91bi5zdW5fcGF0aCk7CisgICAgcmV0dXJuIHNvY2tldF9mZDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfc29ja2V0X2Nsb3NlCisgKgorICogREVTQ1JJUFRJT046ICBjbG9zZSBkb21haW4gc29ja2V0IGJ5IGl0cyBmZAorICogICBAZmQgICAgICA6IGZpbGUgZGVzY3JpcHRvciBmb3IgdGhlIGRvbWFpbiBzb2NrZXQgdG8gYmUgY2xvc2VkCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBtbV9jYW1lcmFfc29ja2V0X2Nsb3NlKGludCBmZCkKK3sKKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgY2xvc2UoZmQpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfc29ja2V0X3NlbmRtc2cKKyAqCisgKiBERVNDUklQVElPTjogIHNlbmQgbXNnIHRocm91Z2ggZG9tYWluIHNvY2tldAorICogICBAZmQgICAgICA6IHNvY2tldCBmZAorICogICBAbXNnICAgICA6IHBvaW50ZXIgdG8gbXNnIHRvIGJlIHNlbnQgb3ZlciBkb21haW4gc29ja2V0CisgKiAgIEBzZW5kZmQgIDogZmlsZSBkZXNjcmlwdG9ycyB0byBiZSBzZW50CisgKgorICogUkVUVVJOICAgICA6IHRoZSB0b3RhbCBieXRlcyBvZiBzZW50IG1zZworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgbW1fY2FtZXJhX3NvY2tldF9zZW5kbXNnKAorICBpbnQgZmQsCisgIHZvaWQgKm1zZywKKyAgc2l6ZV90IGJ1Zl9zaXplLAorICBpbnQgc2VuZGZkKQoreworICAgIHN0cnVjdCBtc2doZHIgbXNnaDsKKyAgICBzdHJ1Y3QgaW92ZWMgaW92WzFdOworICAgIHN0cnVjdCBjbXNnaGRyICogY21zZ2hwID0gTlVMTDsKKyAgICBjaGFyIGNvbnRyb2xbQ01TR19TUEFDRShzaXplb2YoaW50KSldOworCisgICAgaWYgKG1zZyA9PSBOVUxMKSB7CisgICAgICBMT0dEKCJtc2cgaXMgTlVMTCIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZW1zZXQoJm1zZ2gsIDAsIHNpemVvZihtc2doKSk7CisgICAgbXNnaC5tc2dfbmFtZSA9IE5VTEw7CisgICAgbXNnaC5tc2dfbmFtZWxlbiA9IDA7CisKKyAgICBpb3ZbMF0uaW92X2Jhc2UgPSBtc2c7CisgICAgaW92WzBdLmlvdl9sZW4gPSBidWZfc2l6ZTsKKyAgICBtc2doLm1zZ19pb3YgPSBpb3Y7CisgICAgbXNnaC5tc2dfaW92bGVuID0gMTsKKyAgICBMT0dEKCJpb3ZfbGVuPSVsbHUiLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpaW92WzBdLmlvdl9sZW4pOworCisgICAgbXNnaC5tc2dfY29udHJvbCA9IE5VTEw7CisgICAgbXNnaC5tc2dfY29udHJvbGxlbiA9IDA7CisKKyAgICAvKiBpZiBzZW5kZmQgaXMgdmFsaWQsIHdlIG5lZWQgdG8gcGFzcyBpdCB0aHJvdWdoIGNvbnRyb2wgbXNnICovCisgICAgaWYoIHNlbmRmZCA+PSAwKSB7CisgICAgICBtc2doLm1zZ19jb250cm9sID0gY29udHJvbDsKKyAgICAgIG1zZ2gubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoY29udHJvbCk7CisgICAgICBjbXNnaHAgPSBDTVNHX0ZJUlNUSERSKCZtc2doKTsKKyAgICAgIGlmIChjbXNnaHAgIT0gTlVMTCkgeworICAgICAgICBMT0dEKCJHb3QgY3RybCBtc2cgcG9pbnRlciIpOworICAgICAgICBjbXNnaHAtPmNtc2dfbGV2ZWwgPSBTT0xfU09DS0VUOworICAgICAgICBjbXNnaHAtPmNtc2dfdHlwZSA9IFNDTV9SSUdIVFM7CisgICAgICAgIGNtc2docC0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2YoaW50KSk7CisgICAgICAgICooKGludCAqKUNNU0dfREFUQShjbXNnaHApKSA9IHNlbmRmZDsKKyAgICAgICAgTE9HRCgiY21zZyBkYXRhPSVkIiwgKigoaW50ICopIENNU0dfREFUQShjbXNnaHApKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCJjdHJsIG1zZyBOVUxMIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2VuZG1zZyhmZCwgJihtc2doKSwgMCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3NvY2tldF9idW5kbGVfc2VuZG1zZworICoKKyAqIERFU0NSSVBUSU9OOiAgc2VuZCBtc2cgdGhyb3VnaCBkb21haW4gc29ja2V0CisgKiAgIEBmZCAgICAgIDogc29ja2V0IGZkCisgKiAgIEBtc2cgICAgIDogcG9pbnRlciB0byBtc2cgdG8gYmUgc2VudCBvdmVyIGRvbWFpbiBzb2NrZXQKKyAqICAgQHNlbmRmZHMgOiBmaWxlIGRlc2NyaXB0b3JzIHRvIGJlIHNlbnQKKyAqICAgQG51bWZkcyAgOiBudW0gb2YgZmlsZSBkZXNjcmlwdG9ycyB0byBiZSBzZW50CisgKgorICogUkVUVVJOICAgICA6IHRoZSB0b3RhbCBieXRlcyBvZiBzZW50IG1zZworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgbW1fY2FtZXJhX3NvY2tldF9idW5kbGVfc2VuZG1zZygKKyAgaW50IGZkLAorICB2b2lkICptc2csCisgIHNpemVfdCBidWZfc2l6ZSwKKyAgaW50IHNlbmRmZHNbQ0FNX01BWF9OVU1fQlVGU19QRVJfU1RSRUFNXSwKKyAgaW50IG51bWZkcykKK3sKKyAgICBzdHJ1Y3QgbXNnaGRyIG1zZ2g7CisgICAgc3RydWN0IGlvdmVjIGlvdlsxXTsKKyAgICBzdHJ1Y3QgY21zZ2hkciAqIGNtc2docCA9IE5VTEw7CisgICAgY2hhciBjb250cm9sW0NNU0dfU1BBQ0Uoc2l6ZW9mKGludCkgKiBudW1mZHMpXTsKKyAgICBpbnQgKmZkc19wdHIgPSBOVUxMOworCisgICAgaWYgKG1zZyA9PSBOVUxMKSB7CisgICAgICBMT0dEKCJtc2cgaXMgTlVMTCIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtZW1zZXQoJm1zZ2gsIDAsIHNpemVvZihtc2doKSk7CisgICAgbXNnaC5tc2dfbmFtZSA9IE5VTEw7CisgICAgbXNnaC5tc2dfbmFtZWxlbiA9IDA7CisKKyAgICBpb3ZbMF0uaW92X2Jhc2UgPSBtc2c7CisgICAgaW92WzBdLmlvdl9sZW4gPSBidWZfc2l6ZTsKKyAgICBtc2doLm1zZ19pb3YgPSBpb3Y7CisgICAgbXNnaC5tc2dfaW92bGVuID0gMTsKKyAgICBMT0dEKCJpb3ZfbGVuPSVsbHUiLAorICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpaW92WzBdLmlvdl9sZW4pOworCisgICAgbXNnaC5tc2dfY29udHJvbCA9IE5VTEw7CisgICAgbXNnaC5tc2dfY29udHJvbGxlbiA9IDA7CisKKyAgICAvKiBpZiBudW1mZHMgaXMgdmFsaWQsIHdlIG5lZWQgdG8gcGFzcyBpdCB0aHJvdWdoIGNvbnRyb2wgbXNnICovCisgICAgaWYgKG51bWZkcyA+IDApIHsKKyAgICAgIG1zZ2gubXNnX2NvbnRyb2wgPSBjb250cm9sOworICAgICAgbXNnaC5tc2dfY29udHJvbGxlbiA9IHNpemVvZihjb250cm9sKTsKKyAgICAgIGNtc2docCA9IENNU0dfRklSU1RIRFIoJm1zZ2gpOworICAgICAgaWYgKGNtc2docCAhPSBOVUxMKSB7CisgICAgICAgIGNtc2docC0+Y21zZ19sZXZlbCA9IFNPTF9TT0NLRVQ7CisgICAgICAgIGNtc2docC0+Y21zZ190eXBlID0gU0NNX1JJR0hUUzsKKyAgICAgICAgY21zZ2hwLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihpbnQpICogbnVtZmRzKTsKKworICAgICAgICBmZHNfcHRyID0gKGludCopIENNU0dfREFUQShjbXNnaHApOworICAgICAgICBtZW1jcHkoZmRzX3B0ciwgc2VuZGZkcywgc2l6ZW9mKGludCkgKiBudW1mZHMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiY3RybCBtc2cgTlVMTCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNlbmRtc2coZmQsICYobXNnaCksIDApOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9zb2NrZXRfcmVjdm1zZworICoKKyAqIERFU0NSSVBUSU9OOiAgcmVjZWl2ZSBtc2cgZnJvbSBkb21haW4gc29ja2V0LgorICogICBAZmQgICAgICA6IHNvY2tldCBmZAorICogICBAbXNnICAgICA6IHBvaW50ZXIgdG8gbW1fY2FtZXJhX3NvY2tfbXNnX3BhY2tldF90IHRvIGhvbGQgaW5jb21pbmcgbXNnLAorICogICAgICAgICAgICAgIG5lZWQgYmUgYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIKKyAqICAgQGJ1Zl9zaXplOiB0aGUgc2l6ZSBvZiB0aGUgYnVmIHRoYXQgaG9sZHMgaW5jb21pbmcgbXNnCisgKiAgIEByY3ZkZmQgIDogcG9pbnRlciB0byBob2xkIHJlY3ZkIGZpbGUgZGVzY3JpcHRvciBpZiBub3QgTlVMTC4KKyAqCisgKiBSRVRVUk4gICAgIDogdGhlIHRvdGFsIGJ5dGVzIG9mIHJlY2VpdmVkIG1zZworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgbW1fY2FtZXJhX3NvY2tldF9yZWN2bXNnKAorICBpbnQgZmQsCisgIHZvaWQgKm1zZywKKyAgdWludDMyX3QgYnVmX3NpemUsCisgIGludCAqcmN2ZGZkKQoreworICAgIHN0cnVjdCBtc2doZHIgbXNnaDsKKyAgICBzdHJ1Y3QgaW92ZWMgaW92WzFdOworICAgIHN0cnVjdCBjbXNnaGRyICpjbXNnaHAgPSBOVUxMOworICAgIGNoYXIgY29udHJvbFtDTVNHX1NQQUNFKHNpemVvZihpbnQpKV07CisgICAgaW50IHJjdmRfZmQgPSAtMTsKKyAgICBpbnQgcmN2ZF9sZW4gPSAwOworCisgICAgaWYgKCAobXNnID09IE5VTEwpIHx8IChidWZfc2l6ZSA8PSAwKSApIHsKKyAgICAgIExPR0UoIm1zZyBidWYgaXMgTlVMTCIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1lbXNldCgmbXNnaCwgMCwgc2l6ZW9mKG1zZ2gpKTsKKyAgICBtc2doLm1zZ19uYW1lID0gTlVMTDsKKyAgICBtc2doLm1zZ19uYW1lbGVuID0gMDsKKyAgICBtc2doLm1zZ19jb250cm9sID0gY29udHJvbDsKKyAgICBtc2doLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGNvbnRyb2wpOworCisgICAgaW92WzBdLmlvdl9iYXNlID0gbXNnOworICAgIGlvdlswXS5pb3ZfbGVuID0gYnVmX3NpemU7CisgICAgbXNnaC5tc2dfaW92ID0gaW92OworICAgIG1zZ2gubXNnX2lvdmxlbiA9IDE7CisKKyAgICBpZiAoIChyY3ZkX2xlbiA9IHJlY3Ztc2coZmQsICYobXNnaCksIDApKSA8PSAwKSB7CisgICAgICBMT0dFKCJyZWN2bXNnIGZhaWxlZCIpOworICAgICAgcmV0dXJuIHJjdmRfbGVuOworICAgIH0KKworICAgIExPR0QoIm1zZ19jdHJsICVwIGxlbiAlemQiLCBtc2doLm1zZ19jb250cm9sLAorICAgICAgICBtc2doLm1zZ19jb250cm9sbGVuKTsKKworICAgIGlmKCAoKGNtc2docCA9IENNU0dfRklSU1RIRFIoJm1zZ2gpKSAhPSBOVUxMKSAmJgorICAgICAgICAoY21zZ2hwLT5jbXNnX2xlbiA9PSBDTVNHX0xFTihzaXplb2YoaW50KSkpICkgeworICAgICAgaWYgKGNtc2docC0+Y21zZ19sZXZlbCA9PSBTT0xfU09DS0VUICYmCisgICAgICAgIGNtc2docC0+Y21zZ190eXBlID09IFNDTV9SSUdIVFMpIHsKKyAgICAgICAgTE9HRCgiQ3RybE1zZyBpcyB2YWxpZCIpOworICAgICAgICByY3ZkX2ZkID0gKigoaW50ICopIENNU0dfREFUQShjbXNnaHApKTsKKyAgICAgICAgTE9HRCgiUmVjZWlldmVkIGZkPSVkIiwgcmN2ZF9mZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJVbmV4cGVjdGVkIENvbnRyb2wgTXNnLiBMaW5lPSVkIik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHJjdmRmZCkgeworICAgICAgKnJjdmRmZCA9IHJjdmRfZmQ7CisgICAgfQorCisgICAgcmV0dXJuIHJjdmRfbGVuOworfQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2Uvc3JjL21tX2NhbWVyYV9zdHJlYW0uYyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmFfc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiOTFhOAotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmFfc3RyZWFtLmMKQEAgLTAsMCArMSw0NzA0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG1lZGlhL21zbV9tZWRpYV9pbmZvLmg+CisjZGVmaW5lIFRJTUVfSCA8U1lTVEVNX0hFQURFUl9QUkVGSVgvdGltZS5oPgorI2luY2x1ZGUgVElNRV9ICisjZGVmaW5lIElPQ1RMX0ggPFNZU1RFTV9IRUFERVJfUFJFRklYL2lvY3RsLmg+CisjaW5jbHVkZSBJT0NUTF9ICisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJjYW1fc2VtYXBob3JlLmgiCisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJtbV9jYW1lcmEuaCIKKworLyogaW50ZXJuYWwgZnVuY3Rpb24gZGVjYWxyZSAqLworaW50MzJfdCBtbV9zdHJlYW1fcWJ1ZihtbV9zdHJlYW1fdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpidWYpOworaW50MzJfdCBtbV9zdHJlYW1fc2V0X2V4dF9tb2RlKG1tX3N0cmVhbV90ICogbXlfb2JqKTsKK2ludDMyX3QgbW1fc3RyZWFtX3NldF9mbXQobW1fc3RyZWFtX3QgKiBteV9vYmopOworaW50MzJfdCBtbV9zdHJlYW1fc3luY19pbmZvKG1tX3N0cmVhbV90ICpteV9vYmopOworaW50MzJfdCBtbV9zdHJlYW1faW5pdF9idWZzKG1tX3N0cmVhbV90ICogbXlfb2JqKTsKK2ludDMyX3QgbW1fc3RyZWFtX2RlaW5pdF9idWZzKG1tX3N0cmVhbV90ICogbXlfb2JqKTsKK2ludDMyX3QgbW1fc3RyZWFtX3JlcXVlc3RfYnVmKG1tX3N0cmVhbV90ICogbXlfb2JqKTsKK2ludDMyX3QgbW1fc3RyZWFtX3VucmVnX2J1ZihtbV9zdHJlYW1fdCAqIG15X29iaik7CitpbnQzMl90IG1tX3N0cmVhbV9yZWxlYXNlKG1tX3N0cmVhbV90ICpteV9vYmopOworaW50MzJfdCBtbV9zdHJlYW1fc2V0X3Bhcm0obW1fc3RyZWFtX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCAqdmFsdWUpOworaW50MzJfdCBtbV9zdHJlYW1fZ2V0X3Bhcm0obW1fc3RyZWFtX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCAqdmFsdWUpOworaW50MzJfdCBtbV9zdHJlYW1fZG9fYWN0aW9uKG1tX3N0cmVhbV90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqaW5fdmFsdWUpOworaW50MzJfdCBtbV9zdHJlYW1fc3RyZWFtb24obW1fc3RyZWFtX3QgKm15X29iaik7CitpbnQzMl90IG1tX3N0cmVhbV9zdHJlYW1vZmYobW1fc3RyZWFtX3QgKm15X29iaik7CitpbnQzMl90IG1tX3N0cmVhbV9yZWFkX21zbV9mcmFtZShtbV9zdHJlYW1fdCAqIG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfaW5mb190KiBidWZfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3BsYW5lcyk7CitpbnQzMl90IG1tX3N0cmVhbV9yZWFkX3VzZXJfYnVmKG1tX3N0cmVhbV90ICogbXlfb2JqLAorICAgICAgICBtbV9jYW1lcmFfYnVmX2luZm9fdCogYnVmX2luZm8pOworaW50MzJfdCBtbV9zdHJlYW1fd3JpdGVfdXNlcl9idWYobW1fc3RyZWFtX3QgKiBteV9vYmosCisgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmJ1Zik7CisKK2ludDMyX3QgbW1fc3RyZWFtX2NvbmZpZyhtbV9zdHJlYW1fdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zdHJlYW1fY29uZmlnX3QgKmNvbmZpZyk7CitpbnQzMl90IG1tX3N0cmVhbV9yZWdfYnVmKG1tX3N0cmVhbV90ICogbXlfb2JqKTsKK2ludDMyX3QgbW1fc3RyZWFtX2J1Zl9kb25lKG1tX3N0cmVhbV90ICogbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqZnJhbWUpOworaW50MzJfdCBtbV9zdHJlYW1fZ2V0X3F1ZXVlZF9idWZfY291bnQobW1fc3RyZWFtX3QgKiBteV9vYmopOworCitpbnQzMl90IG1tX3N0cmVhbV9jYWxjX29mZnNldChtbV9zdHJlYW1fdCAqbXlfb2JqKTsKK2ludDMyX3QgbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3ByZXZpZXcoY2FtX3N0cmVhbV9pbmZvX3QgKnN0cmVhbV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3QgKmRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX2J1Zl9wbGFuZV9pbmZvX3QgKmJ1Zl9wbGFuZXMpOworaW50MzJfdCBtbV9zdHJlYW1fY2FsY19vZmZzZXRfcG9zdF92aWV3KGNhbV9mb3JtYXRfdCBmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCAqZGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX2J1Zl9wbGFuZV9pbmZvX3QgKmJ1Zl9wbGFuZXMpOworCitpbnQzMl90IG1tX3N0cmVhbV9jYWxjX29mZnNldF9zbmFwc2hvdChjYW1fZm9ybWF0X3QgZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90ICpkaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX2J1Zl9wbGFuZV9pbmZvX3QgKmJ1Zl9wbGFuZXMpOworaW50MzJfdCBtbV9zdHJlYW1fY2FsY19vZmZzZXRfcmF3KGNhbV9mb3JtYXRfdCBmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90ICpkaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fYnVmX3BsYW5lX2luZm9fdCAqYnVmX3BsYW5lcyk7CitpbnQzMl90IG1tX3N0cmVhbV9jYWxjX29mZnNldF92aWRlbyhjYW1fZm9ybWF0X3QgZm10LAorICAgICAgICBjYW1fZGltZW5zaW9uX3QgKmRpbSwKKyAgICAgICAgY2FtX3N0cmVhbV9idWZfcGxhbmVfaW5mb190ICpidWZfcGxhbmVzKTsKK2ludDMyX3QgbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X21ldGFkYXRhKGNhbV9kaW1lbnNpb25fdCAqZGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9idWZfcGxhbmVfaW5mb190ICpidWZfcGxhbmVzKTsKK2ludDMyX3QgbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3Bvc3Rwcm9jKGNhbV9zdHJlYW1faW5mb190ICpzdHJlYW1faW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fYnVmX3BsYW5lX2luZm9fdCAqcGxucyk7Cit1aW50MzJfdCBtbV9zdHJlYW1fY2FsY19sY20oaW50MzJfdCBudW0xLCBpbnQzMl90IG51bTIpOworCisKKy8qIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb24gZGVjbGFyZSAqLworaW50MzJfdCBtbV9zdHJlYW1fZnNtX2luaXRlZChtbV9zdHJlYW1fdCAqIG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fc3RyZWFtX2V2dF90eXBlX3QgZXZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaW5fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogb3V0X3ZhbCk7CitpbnQzMl90IG1tX3N0cmVhbV9mc21fYWNxdWlyZWQobW1fc3RyZWFtX3QgKiBteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fc3RyZWFtX2V2dF90eXBlX3QgZXZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBpbl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIG91dF92YWwpOworaW50MzJfdCBtbV9zdHJlYW1fZnNtX2NmZyhtbV9zdHJlYW1fdCAqIG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fc3RyZWFtX2V2dF90eXBlX3QgZXZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaW5fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogb3V0X3ZhbCk7CitpbnQzMl90IG1tX3N0cmVhbV9mc21fYnVmZmVkKG1tX3N0cmVhbV90ICogbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9zdHJlYW1fZXZ0X3R5cGVfdCBldnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBpbl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBvdXRfdmFsKTsKK2ludDMyX3QgbW1fc3RyZWFtX2ZzbV9yZWcobW1fc3RyZWFtX3QgKiBteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX3N0cmVhbV9ldnRfdHlwZV90IGV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGluX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIG91dF92YWwpOworaW50MzJfdCBtbV9zdHJlYW1fZnNtX2FjdGl2ZShtbV9zdHJlYW1fdCAqIG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fc3RyZWFtX2V2dF90eXBlX3QgZXZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaW5fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogb3V0X3ZhbCk7Cit1aW50MzJfdCBtbV9zdHJlYW1fZ2V0X3Y0bDJfZm10KGNhbV9mb3JtYXRfdCBmbXQpOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX25vdGlmeV9jaGFubmVsCisgKgorICogREVTQ1JJUFRJT046IGZ1bmN0aW9uIHRvIG5vdGlmeSBjaGFubmVsIG9iamVjdCBvbiByZWNlaXZlZCBidWZmZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNoX29iaiAgOiBjaGFubmVsIG9iamVjdAorICogICBAYnVmX2luZm86IHB0ciB0byBzdHJ1Y3Qgc3RvcmluZyBidWZmZXIgaW5mb3JtYXRpb24KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAwPiAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX25vdGlmeV9jaGFubmVsKHN0cnVjdCBtbV9jaGFubmVsKiBjaF9vYmosCisgICAgICAgIG1tX2NhbWVyYV9idWZfaW5mb190ICpidWZfaW5mbykKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBtbV9jYW1lcmFfY21kY2JfdCogbm9kZSA9IE5VTEw7CisKKyAgICBpZiAoKE5VTEwgPT0gY2hfb2JqKSB8fCAoTlVMTCA9PSBidWZfaW5mbykpIHsKKyAgICAgICAgTE9HRCgiSW52YWxpZCBjaGFubmVsL2J1ZmZlciIpOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICAvKiBzZW5kIGNhbV9zZW1fcG9zdCB0byB3YWtlIHVwIGNoYW5uZWwgY21kIHRocmVhZCB0byBlbnF1ZXVlCisgICAgICogdG8gc3VwZXIgYnVmZmVyICovCisgICAgbm9kZSA9IChtbV9jYW1lcmFfY21kY2JfdCAqKW1hbGxvYyhzaXplb2YobW1fY2FtZXJhX2NtZGNiX3QpKTsKKyAgICBpZiAoTlVMTCAhPSBub2RlKSB7CisgICAgICAgIG1lbXNldChub2RlLCAwLCBzaXplb2YobW1fY2FtZXJhX2NtZGNiX3QpKTsKKyAgICAgICAgbm9kZS0+Y21kX3R5cGUgPSBNTV9DQU1FUkFfQ01EX1RZUEVfREFUQV9DQjsKKyAgICAgICAgbm9kZS0+dS5idWYgPSAqYnVmX2luZm87CisKKyAgICAgICAgLyogZW5xdWV1ZSB0byBjbWQgdGhyZWFkICovCisgICAgICAgIGNhbV9xdWV1ZV9lbnEoJihjaF9vYmotPmNtZF90aHJlYWQuY21kX3F1ZXVlKSwgbm9kZSk7CisKKyAgICAgICAgLyogd2FrZSB1cCBjbWQgdGhyZWFkICovCisgICAgICAgIGNhbV9zZW1fcG9zdCgmKGNoX29iai0+Y21kX3RocmVhZC5jbWRfc2VtKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBtbV9jYW1lcmFfbm9kZV90Iik7CisgICAgICAgIHJjID0gLUVOT01FTTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2hhbmRsZV9yY3ZkX2J1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBmdW5jdGlvbiB0byBoYW5kbGUgbmV3bHkgcmVjZWl2ZWQgc3RyZWFtIGJ1ZmZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY2FtX29iaiA6IHN0cmVhbSBvYmplY3QKKyAqICAgQGJ1Zl9pbmZvOiBwdHIgdG8gc3RydWN0IHN0b3JpbmcgYnVmZmVyIGluZm9ybWF0aW9uCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBtbV9zdHJlYW1faGFuZGxlX3JjdmRfYnVmKG1tX3N0cmVhbV90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9pbmZvX3QgKmJ1Zl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaGFzX2NiKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIExPR0QoIkUsIG15X2hhbmRsZSA9IDB4JXgsIGZkID0gJWQsIHN0YXRlID0gJWQiLAorICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlKTsKKworICAgIC8qIGVucXVldWUgdG8gc3VwZXIgYnVmIHRocmVhZCAqLworICAgIGlmIChteV9vYmotPmlzX2J1bmRsZWQpIHsKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fbm90aWZ5X2NoYW5uZWwobXlfb2JqLT5jaF9vYmosIGJ1Zl9pbmZvKTsKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiVW5hYmxlIHRvIG5vdGlmeSBjaGFubmVsIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+YnVmX2xvY2spOworICAgIGlmKG15X29iai0+aXNfbGlua2VkKSB7CisgICAgICAgIC8qIG5lZWQgdG8gYWRkIGludG8gc3VwZXIgYnVmIGZvciBsaW5raW5nLCBhZGQgcmVmIGNvdW50ICovCisgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tidWZfaW5mby0+YnVmLT5idWZfaWR4XS5idWZfcmVmY250Kys7CisKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fbm90aWZ5X2NoYW5uZWwobXlfb2JqLT5saW5rZWRfb2JqLCBidWZfaW5mbyk7CisgICAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBub3RpZnkgY2hhbm5lbCIpOworICAgICAgICB9CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jbWRfbG9jayk7CisgICAgaWYoaGFzX2NiICYmIG15X29iai0+Y21kX3RocmVhZC5pc19hY3RpdmUpIHsKKyAgICAgICAgbW1fY2FtZXJhX2NtZGNiX3QqIG5vZGUgPSBOVUxMOworCisgICAgICAgIC8qIHNlbmQgY2FtX3NlbV9wb3N0IHRvIHdha2UgdXAgY21kIHRocmVhZCB0byBkaXNwYXRjaCBkYXRhQ0IgKi8KKyAgICAgICAgbm9kZSA9IChtbV9jYW1lcmFfY21kY2JfdCAqKW1hbGxvYyhzaXplb2YobW1fY2FtZXJhX2NtZGNiX3QpKTsKKyAgICAgICAgaWYgKE5VTEwgIT0gbm9kZSkgeworICAgICAgICAgICAgbWVtc2V0KG5vZGUsIDAsIHNpemVvZihtbV9jYW1lcmFfY21kY2JfdCkpOworICAgICAgICAgICAgbm9kZS0+Y21kX3R5cGUgPSBNTV9DQU1FUkFfQ01EX1RZUEVfREFUQV9DQjsKKyAgICAgICAgICAgIG5vZGUtPnUuYnVmID0gKmJ1Zl9pbmZvOworCisgICAgICAgICAgICAvKiBlbnF1ZXVlIHRvIGNtZCB0aHJlYWQgKi8KKyAgICAgICAgICAgIGNhbV9xdWV1ZV9lbnEoJihteV9vYmotPmNtZF90aHJlYWQuY21kX3F1ZXVlKSwgbm9kZSk7CisKKyAgICAgICAgICAgIC8qIHdha2UgdXAgY21kIHRocmVhZCAqLworICAgICAgICAgICAgY2FtX3NlbV9wb3N0KCYobXlfb2JqLT5jbWRfdGhyZWFkLmNtZF9zZW0pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgbW1fY2FtZXJhX25vZGVfdCIpOworICAgICAgICB9CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNtZF9sb2NrKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fZGlzcGF0Y2hfc3luY19kYXRhCisgKgorICogREVTQ1JJUFRJT046IGRpc3BhdGNoIHN0cmVhbSBidWZmZXIgdG8gcmVnaXN0ZXJlZCB1c2VycyBvbiBwb2xsIHRocmVhZAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY21kX2NiICA6IHB0ciBzdG9yaW5nIHN0cmVhbSBidWZmZXIgaW5mb3JtYXRpb24KKyAqICAgQHVzZXJkYXRhOiB1c2VyIGRhdGEgcHRyIChzdHJlYW0gb2JqZWN0KQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIG1tX3N0cmVhbV9kaXNwYXRjaF9zeW5jX2RhdGEobW1fc3RyZWFtX3QgKiBteV9vYmosCisgICAgICAgICBtbV9zdHJlYW1fZGF0YV9jYl90ICpidWZfY2IsIG1tX2NhbWVyYV9idWZfaW5mb190ICpidWZfaW5mbykKK3sKKyAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3Qgc3VwZXJfYnVmOworCisgICAgaWYgKE5VTEwgPT0gbXlfb2JqIHx8IGJ1Zl9pbmZvID09IE5VTEwgfHwKKyAgICAgICAgICAgIGJ1Zl9jYiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtZW1zZXQoJnN1cGVyX2J1ZiwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9zdXBlcl9idWZfdCkpOworICAgIHN1cGVyX2J1Zi5udW1fYnVmcyA9IDE7CisgICAgc3VwZXJfYnVmLmJ1ZnNbMF0gPSBidWZfaW5mby0+YnVmOworICAgIHN1cGVyX2J1Zi5jYW1lcmFfaGFuZGxlID0gbXlfb2JqLT5jaF9vYmotPmNhbV9vYmotPm15X2hkbDsKKyAgICBzdXBlcl9idWYuY2hfaWQgPSBteV9vYmotPmNoX29iai0+bXlfaGRsOworICAgIGlmICgoYnVmX2NiICE9IE5VTEwpICYmIChidWZfY2ItPmNiX3R5cGUgPT0gTU1fQ0FNRVJBX1NUUkVBTV9DQl9UWVBFX1NZTkMpCisgICAgICAgICAgICAmJiAoYnVmX2NiLT5jYl9jb3VudCAhPSAwKSkgeworICAgICAgICAvKiBjYWxsYmFjayAqLworICAgICAgICBidWZfY2ItPmNiKCZzdXBlcl9idWYsIGJ1Zl9jYi0+dXNlcl9kYXRhKTsKKworICAgICAgICAvKiBpZiA+MCwgcmVkdWNlIGNvdW50IGJ5IDEgZXZlcnkgdGltZSB3ZSBjYWxsZWQgQ0IgdW50aWwgcmVhY2hlcyAwCisgICAgICAgICAgICAgKiB3aGVuIGNvdW50IHJlYWNoIDAsIHJlc2V0IHRoZSBidWZfY2IgdG8gaGF2ZSBubyBDQiAqLworICAgICAgICBpZiAoYnVmX2NiLT5jYl9jb3VudCA+IDApIHsKKyAgICAgICAgICAgIGJ1Zl9jYi0+Y2JfY291bnQtLTsKKyAgICAgICAgICAgIGlmICgwID09IGJ1Zl9jYi0+Y2JfY291bnQpIHsKKyAgICAgICAgICAgICAgICBidWZfY2ItPmNiID0gTlVMTDsKKyAgICAgICAgICAgICAgICBidWZfY2ItPnVzZXJfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2RhdGFfbm90aWZ5CisgKgorICogREVTQ1JJUFRJT046IGNhbGxiYWNrIHRvIGhhbmRsZSBkYXRhIG5vdGlmeSBmcm9tIGtlcm5lbAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAdXNlcl9kYXRhIDogdXNlciBkYXRhIHB0ciAoc3RyZWFtIG9iamVjdCkKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBtbV9zdHJlYW1fZGF0YV9ub3RpZnkodm9pZCogdXNlcl9kYXRhKQoreworICAgIG1tX3N0cmVhbV90ICpteV9vYmogPSAobW1fc3RyZWFtX3QqKXVzZXJfZGF0YTsKKyAgICBpbnQzMl90IGksIHJjOworICAgIHVpbnQ4X3QgaGFzX2NiID0gMCwgbGVuZ3RoID0gMDsKKyAgICBtbV9jYW1lcmFfYnVmX2luZm9fdCBidWZfaW5mbzsKKworICAgIGlmIChOVUxMID09IG15X29iaikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTE9HRCgiRSwgbXlfaGFuZGxlID0gMHgleCwgZmQgPSAlZCwgc3RhdGUgPSAlZCIsCisgICAgICAgICAgbXlfb2JqLT5teV9oZGwsIG15X29iai0+ZmQsIG15X29iai0+c3RhdGUpOworICAgIGlmIChNTV9TVFJFQU1fU1RBVEVfQUNUSVZFICE9IG15X29iai0+c3RhdGUpIHsKKyAgICAgICAgLyogdGhpcyBDYiB3aWxsIG9ubHkgcmVjZWl2ZWQgaW4gYWN0aXZlX3N0cmVhbV9vbiBzdGF0ZQorICAgICAgICAgKiBpZiBub3Qgc28sIHJldHVybiBoZXJlICovCisgICAgICAgIExPR0UoIkVSUk9SISEgV3Jvbmcgc3RhdGUgKCVkKSB0byByZWNlaXZlIGRhdGEgbm90aWZ5ISIsCisgICAgICAgICAgICAgICAgICAgIG15X29iai0+c3RhdGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbWluZ19tb2RlID09IENBTV9TVFJFQU1JTkdfTU9ERV9CQVRDSCkgeworICAgICAgICBsZW5ndGggPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGxlbmd0aCA9IG15X29iai0+ZnJhbWVfb2Zmc2V0Lm51bV9wbGFuZXM7CisgICAgfQorCisgICAgbWVtc2V0KCZidWZfaW5mbywgMCwgc2l6ZW9mKG1tX2NhbWVyYV9idWZfaW5mb190KSk7CisgICAgcmMgPSBtbV9zdHJlYW1fcmVhZF9tc21fZnJhbWUobXlfb2JqLCAmYnVmX2luZm8sCisgICAgICAgICh1aW50OF90KWxlbmd0aCk7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50MzJfdCBpZHggPSBidWZfaW5mby5idWYtPmJ1Zl9pZHg7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2JfbG9jayk7CisgICAgZm9yIChpID0gMDsgaSA8IE1NX0NBTUVSQV9TVFJFQU1fQlVGX0NCX01BWDsgaSsrKSB7CisgICAgICAgIGlmKE5VTEwgIT0gbXlfb2JqLT5idWZfY2JbaV0uY2IpIHsKKyAgICAgICAgICAgIGlmIChteV9vYmotPmJ1Zl9jYltpXS5jYl90eXBlID09IE1NX0NBTUVSQV9TVFJFQU1fQ0JfVFlQRV9TWU5DKSB7CisgICAgICAgICAgICAgICAgLypGb3IgZXZlcnkgU1lOQyBjYWxsYmFjaywgc2VuZCBkYXRhKi8KKyAgICAgICAgICAgICAgICBtbV9zdHJlYW1fZGlzcGF0Y2hfc3luY19kYXRhKG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZteV9vYmotPmJ1Zl9jYltpXSwgJmJ1Zl9pbmZvKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZm9yIGV2ZXJ5IEFTWU5DIENCLCBuZWVkIHJlZiBjb3VudCAqLworICAgICAgICAgICAgICAgIGhhc19jYiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2JfbG9jayk7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+YnVmX2xvY2spOworICAgIC8qIHVwZGF0ZSBidWZmZXIgbG9jYXRpb24gKi8KKyAgICBteV9vYmotPmJ1Zl9zdGF0dXNbaWR4XS5pbl9rZXJuZWwgPSAwOworCisgICAgLyogdXBkYXRlIGJ1ZiByZWYgY291bnQgKi8KKyAgICBpZiAobXlfb2JqLT5pc19idW5kbGVkKSB7CisgICAgICAgIC8qIG5lZWQgdG8gYWRkIGludG8gc3VwZXIgYnVmIHNpbmNlIGJ1bmRsZWQsIGFkZCByZWYgY291bnQgKi8KKyAgICAgICAgbXlfb2JqLT5idWZfc3RhdHVzW2lkeF0uYnVmX3JlZmNudCsrOworICAgIH0KKyAgICBteV9vYmotPmJ1Zl9zdGF0dXNbaWR4XS5idWZfcmVmY250ID0KKyAgICAgICAgKHVpbnQ4X3QpKG15X29iai0+YnVmX3N0YXR1c1tpZHhdLmJ1Zl9yZWZjbnQgKyBoYXNfY2IpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKworICAgIG1tX3N0cmVhbV9oYW5kbGVfcmN2ZF9idWYobXlfb2JqLCAmYnVmX2luZm8sIGhhc19jYik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2Rpc3BhdGNoX2FwcF9kYXRhCisgKgorICogREVTQ1JJUFRJT046IGRpc3BhdGNoIHN0cmVhbSBidWZmZXIgdG8gcmVnaXN0ZXJlZCB1c2VycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAY21kX2NiICA6IHB0ciBzdG9yaW5nIHN0cmVhbSBidWZmZXIgaW5mb3JtYXRpb24KKyAqICAgQHVzZXJkYXRhOiB1c2VyIGRhdGEgcHRyIChzdHJlYW0gb2JqZWN0KQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB2b2lkIG1tX3N0cmVhbV9kaXNwYXRjaF9hcHBfZGF0YShtbV9jYW1lcmFfY21kY2JfdCAqY21kX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJfZGF0YSkKK3sKKyAgICBpbnQgaTsKKyAgICBtbV9zdHJlYW1fdCAqIG15X29iaiA9IChtbV9zdHJlYW1fdCAqKXVzZXJfZGF0YTsKKyAgICBtbV9jYW1lcmFfYnVmX2luZm9fdCogYnVmX2luZm8gPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCBzdXBlcl9idWY7CisKKyAgICBpZiAoTlVMTCA9PSBteV9vYmopIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMT0dEKCJFLCBteV9oYW5kbGUgPSAweCV4LCBmZCA9ICVkLCBzdGF0ZSA9ICVkIiwKKyAgICAgICAgICBteV9vYmotPm15X2hkbCwgbXlfb2JqLT5mZCwgbXlfb2JqLT5zdGF0ZSk7CisKKyAgICBpZiAoTU1fQ0FNRVJBX0NNRF9UWVBFX0RBVEFfQ0IgIT0gY21kX2NiLT5jbWRfdHlwZSkgeworICAgICAgICBMT0dFKCJXcm9uZyBjbWRfdHlwZSAoJWQpIGZvciBkYXRhQ0IiLAorICAgICAgICAgICAgICAgICAgICBjbWRfY2ItPmNtZF90eXBlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJ1Zl9pbmZvID0gJmNtZF9jYi0+dS5idWY7CisgICAgbWVtc2V0KCZzdXBlcl9idWYsIDAsIHNpemVvZihtbV9jYW1lcmFfc3VwZXJfYnVmX3QpKTsKKyAgICBzdXBlcl9idWYubnVtX2J1ZnMgPSAxOworICAgIHN1cGVyX2J1Zi5idWZzWzBdID0gYnVmX2luZm8tPmJ1ZjsKKyAgICBzdXBlcl9idWYuY2FtZXJhX2hhbmRsZSA9IG15X29iai0+Y2hfb2JqLT5jYW1fb2JqLT5teV9oZGw7CisgICAgc3VwZXJfYnVmLmNoX2lkID0gbXlfb2JqLT5jaF9vYmotPm15X2hkbDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jYl9sb2NrKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBNTV9DQU1FUkFfU1RSRUFNX0JVRl9DQl9NQVg7IGkrKykgeworICAgICAgICBpZihOVUxMICE9IG15X29iai0+YnVmX2NiW2ldLmNiCisgICAgICAgICAgICAgICAgJiYgKG15X29iai0+YnVmX2NiW2ldLmNiX3R5cGUgIT0KKyAgICAgICAgICAgICAgICBNTV9DQU1FUkFfU1RSRUFNX0NCX1RZUEVfU1lOQykpIHsKKyAgICAgICAgICAgIGlmIChteV9vYmotPmJ1Zl9jYltpXS5jYl9jb3VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgLyogaWYgPDAsIG1lYW5zIGluZmluaXRlIENCCisgICAgICAgICAgICAgICAgICogaWYgPjAsIG1lYW5zIENCIGZvciBjZXJ0YWluIHRpbWVzCisgICAgICAgICAgICAgICAgICogYm90aCBjYXNlIHdlIG5lZWQgdG8gY2FsbCBDQiAqLworCisgICAgICAgICAgICAgICAgLyogaW5jcmVhc2UgYnVmIHJlZiBjbnQgKi8KKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+YnVmX2xvY2spOworICAgICAgICAgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tidWZfaW5mby0+YnVmLT5idWZfaWR4XS5idWZfcmVmY250Kys7CisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+YnVmX2xvY2spOworCisgICAgICAgICAgICAgICAgLyogY2FsbGJhY2sgKi8KKyAgICAgICAgICAgICAgICBteV9vYmotPmJ1Zl9jYltpXS5jYigmc3VwZXJfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X29iai0+YnVmX2NiW2ldLnVzZXJfZGF0YSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGlmID4wLCByZWR1Y2UgY291bnQgYnkgMSBldmVyeSB0aW1lIHdlIGNhbGxlZCBDQiB1bnRpbCByZWFjaGVzIDAKKyAgICAgICAgICAgICAqIHdoZW4gY291bnQgcmVhY2ggMCwgcmVzZXQgdGhlIGJ1Zl9jYiB0byBoYXZlIG5vIENCICovCisgICAgICAgICAgICBpZiAobXlfb2JqLT5idWZfY2JbaV0uY2JfY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgbXlfb2JqLT5idWZfY2JbaV0uY2JfY291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoMCA9PSBteV9vYmotPmJ1Zl9jYltpXS5jYl9jb3VudCkgeworICAgICAgICAgICAgICAgICAgICBteV9vYmotPmJ1Zl9jYltpXS5jYiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIG15X29iai0+YnVmX2NiW2ldLnVzZXJfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNiX2xvY2spOworCisgICAgLyogZG8gYnVmX2RvbmUgc2luY2Ugd2UgaW5jcmVhc2VkIHJlZmNudCBieSBvbmUgd2hlbiBoYXNfY2IgKi8KKyAgICBtbV9zdHJlYW1fYnVmX2RvbmUobXlfb2JqLCBidWZfaW5mby0+YnVmKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fZnNtX2ZuCisgKgorICogREVTQ1JJUFRJT046IHN0cmVhbSBmaW5pdGUgc3RhdGUgbWFjaGluZSBlbnRyeSBmdW5jdGlvbi4gRGVwZW5kcyBvbiBzdHJlYW0KKyAqICAgICAgICAgICAgICBzdGF0ZSwgaW5jb21pbmcgZXZlbnQgd2lsbCBiZSBoYW5kbGVkIGRpZmZlcmVudGx5LgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgOiBwdHIgdG8gYSBzdHJlYW0gb2JqZWN0CisgKiAgIEBldnQgICAgICA6IHN0cmVhbSBldmVudCB0byBiZSBwcm9jZXNzZWQKKyAqICAgQGluX3ZhbCAgIDogaW5wdXQgZXZlbnQgcGF5bG9hZC4gQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4KKyAqICAgQG91dF92YWwgIDogb3V0cHV0IHBheWxvYWQsIENhbiBiZSBOVUxMIGlmIG5vdCBuZWVkZWQuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9mc21fZm4obW1fc3RyZWFtX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtbV9zdHJlYW1fZXZ0X3R5cGVfdCBldnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGluX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogb3V0X3ZhbCkKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisKKyAgICBMT0dEKCJFLCBteV9oYW5kbGUgPSAweCV4LCBmZCA9ICVkLCBzdGF0ZSA9ICVkIiwKKyAgICAgICAgICBteV9vYmotPm15X2hkbCwgbXlfb2JqLT5mZCwgbXlfb2JqLT5zdGF0ZSk7CisgICAgc3dpdGNoIChteV9vYmotPnN0YXRlKSB7CisgICAgY2FzZSBNTV9TVFJFQU1fU1RBVEVfTk9UVVNFRDoKKyAgICAgICAgTE9HRCgiTm90IGhhbmRsaW5nIGV2dCBpbiB1bnVzZWQgc3RhdGUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9TVFJFQU1fU1RBVEVfSU5JVEVEOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9mc21faW5pdGVkKG15X29iaiwgZXZ0LCBpbl92YWwsIG91dF92YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX1NUUkVBTV9TVEFURV9BQ1FVSVJFRDoKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fZnNtX2FjcXVpcmVkKG15X29iaiwgZXZ0LCBpbl92YWwsIG91dF92YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX1NUUkVBTV9TVEFURV9DRkc6CisgICAgICAgIHJjID0gbW1fc3RyZWFtX2ZzbV9jZmcobXlfb2JqLCBldnQsIGluX3ZhbCwgb3V0X3ZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fU1RSRUFNX1NUQVRFX0JVRkZFRDoKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fZnNtX2J1ZmZlZChteV9vYmosIGV2dCwgaW5fdmFsLCBvdXRfdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9TVFJFQU1fU1RBVEVfUkVHOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9mc21fcmVnKG15X29iaiwgZXZ0LCBpbl92YWwsIG91dF92YWwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX1NUUkVBTV9TVEFURV9BQ1RJVkU6CisgICAgICAgIHJjID0gbW1fc3RyZWFtX2ZzbV9hY3RpdmUobXlfb2JqLCBldnQsIGluX3ZhbCwgb3V0X3ZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0QoIk5vdCBhIHZhbGlkIHN0YXRlICglZCkiLCBteV9vYmotPnN0YXRlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIExPR0QoIlggcmMgPSVkIixyYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9mc21faW5pdGVkCisgKgorICogREVTQ1JJUFRJT046IHN0cmVhbSBmaW5pdGUgc3RhdGUgbWFjaGluZSBmdW5jdGlvbiB0byBoYW5kbGUgZXZlbnQgaW4gSU5JVEVECisgKiAgICAgICAgICAgICAgc3RhdGUuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICA6IHB0ciB0byBhIHN0cmVhbSBvYmplY3QKKyAqICAgQGV2dCAgICAgIDogc3RyZWFtIGV2ZW50IHRvIGJlIHByb2Nlc3NlZAorICogICBAaW5fdmFsICAgOiBpbnB1dCBldmVudCBwYXlsb2FkLiBDYW4gYmUgTlVMTCBpZiBub3QgbmVlZGVkLgorICogICBAb3V0X3ZhbCAgOiBvdXRwdXQgcGF5bG9hZCwgQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX2ZzbV9pbml0ZWQobW1fc3RyZWFtX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fc3RyZWFtX2V2dF90eXBlX3QgZXZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaW5fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogb3V0X3ZhbCkKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBjaGFyIGRldl9uYW1lW01NX0NBTUVSQV9ERVZfTkFNRV9MRU5dOworICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lX3ZhbHVlID0gTlVMTDsKKyAgICBpZiAoTlVMTCA9PSBteV9vYmopIHsKKyAgICAgIExPR0UoIk5VTEwgY2FtZXJhIG9iamVjdFxuIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgTE9HRCgiRSwgbXlfaGFuZGxlID0gMHgleCwgZmQgPSAlZCwgc3RhdGUgPSAlZCIsCisgICAgICAgICAgbXlfb2JqLT5teV9oZGwsIG15X29iai0+ZmQsIG15X29iai0+c3RhdGUpOworICAgIHN3aXRjaChldnQpIHsKKyAgICBjYXNlIE1NX1NUUkVBTV9FVlRfQUNRVUlSRToKKyAgICAgICAgaWYgKChOVUxMID09IG15X29iai0+Y2hfb2JqKSB8fCAoTlVMTCA9PSBteV9vYmotPmNoX29iai0+Y2FtX29iaikpIHsKKyAgICAgICAgICAgIExPR0UoIk5VTEwgY2hhbm5lbCBvciBjYW1lcmEgb2JqXG4iKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRldl9uYW1lX3ZhbHVlID0gbW1fY2FtZXJhX3V0aWxfZ2V0X2Rldl9uYW1lKG15X29iai0+Y2hfb2JqLT5jYW1fb2JqLT5teV9oZGwpOworICAgICAgICBpZiAoTlVMTCA9PSBkZXZfbmFtZV92YWx1ZSkgeworICAgICAgICAgICAgTE9HRSgiTlVMTCBkZXZpY2UgbmFtZVxuIik7CisgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzbnByaW50ZihkZXZfbmFtZSwgc2l6ZW9mKGRldl9uYW1lKSwgIi9kZXYvJXMiLAorICAgICAgICAgICAgICAgICBkZXZfbmFtZV92YWx1ZSk7CisKKyAgICAgICAgbXlfb2JqLT5mZCA9IG9wZW4oZGV2X25hbWUsIE9fUkRXUiB8IE9fTk9OQkxPQ0spOworICAgICAgICBpZiAobXlfb2JqLT5mZCA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIm9wZW4gZGV2IHJldHVybmVkICVkXG4iLCBteV9vYmotPmZkKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJvcGVuIGRldiBmZCA9ICVkXG4iLCBteV9vYmotPmZkKTsKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fc2V0X2V4dF9tb2RlKG15X29iaik7CisgICAgICAgIGlmICgwID09IHJjKSB7CisgICAgICAgICAgICBteV9vYmotPnN0YXRlID0gTU1fU1RSRUFNX1NUQVRFX0FDUVVJUkVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogZmFpbGVkIHNldHRpbmcgZXh0X21vZGUKKyAgICAgICAgICAgICAqIGNsb3NlIGZkICovCisgICAgICAgICAgICBjbG9zZShteV9vYmotPmZkKTsKKyAgICAgICAgICAgIG15X29iai0+ZmQgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoImludmFsaWQgc3RhdGUgKCVkKSBmb3IgZXZ0ICglZCksIGluKCVwKSwgb3V0KCVwKSIsCisgICAgICAgICAgICAgICAgICAgIG15X29iai0+c3RhdGUsIGV2dCwgaW5fdmFsLCBvdXRfdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fZnNtX2FjcXVpcmVkCisgKgorICogREVTQ1JJUFRJT046IHN0cmVhbSBmaW5pdGUgc3RhdGUgbWFjaGluZSBmdW5jdGlvbiB0byBoYW5kbGUgZXZlbnQgaW4gQVFVSVJFRAorICogICAgICAgICAgICAgIHN0YXRlLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgOiBwdHIgdG8gYSBzdHJlYW0gb2JqZWN0CisgKiAgIEBldnQgICAgICA6IHN0cmVhbSBldmVudCB0byBiZSBwcm9jZXNzZWQKKyAqICAgQGluX3ZhbCAgIDogaW5wdXQgZXZlbnQgcGF5bG9hZC4gQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4KKyAqICAgQG91dF92YWwgIDogb3V0cHV0IHBheWxvYWQsIENhbiBiZSBOVUxMIGlmIG5vdCBuZWVkZWQuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9mc21fYWNxdWlyZWQobW1fc3RyZWFtX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9zdHJlYW1fZXZ0X3R5cGVfdCBldnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGluX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogb3V0X3ZhbCkKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKworICAgIExPR0QoIkUsIG15X2hhbmRsZSA9IDB4JXgsIGZkID0gJWQsIHN0YXRlID0gJWQiLAorICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlKTsKKyAgICBzd2l0Y2goZXZ0KSB7CisgICAgY2FzZSBNTV9TVFJFQU1fRVZUX1NFVF9GTVQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2NhbWVyYV9zdHJlYW1fY29uZmlnX3QgKmNvbmZpZyA9CisgICAgICAgICAgICAgICAgKG1tX2NhbWVyYV9zdHJlYW1fY29uZmlnX3QgKilpbl92YWw7CisKKyAgICAgICAgICAgIHJjID0gbW1fc3RyZWFtX2NvbmZpZyhteV9vYmosIGNvbmZpZyk7CisKKyAgICAgICAgICAgIC8qIGNoYW5nZSBzdGF0ZSB0byBjb25maWdlZCAqLworICAgICAgICAgICAgbXlfb2JqLT5zdGF0ZSA9IE1NX1NUUkVBTV9TVEFURV9DRkc7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBNTV9TVFJFQU1fRVZUX1JFTEVBU0U6CisgICAgICAgIHJjID0gbW1fc3RyZWFtX3JlbGVhc2UobXlfb2JqKTsKKyAgICAgICAgLyogY2hhbmdlIHN0YXRlIHRvIG5vdCB1c2VkICovCisgICAgICAgICBteV9vYmotPnN0YXRlID0gTU1fU1RSRUFNX1NUQVRFX05PVFVTRUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fU1RSRUFNX0VWVF9TRVRfUEFSTToKKyAgICAgICAgeworICAgICAgICAgICAgbW1fZXZ0X3BheWxvZF9zZXRfZ2V0X3N0cmVhbV9wYXJtc190ICpwYXlsb2FkID0KKyAgICAgICAgICAgICAgICAobW1fZXZ0X3BheWxvZF9zZXRfZ2V0X3N0cmVhbV9wYXJtc190ICopaW5fdmFsOworICAgICAgICAgICAgcmMgPSBtbV9zdHJlYW1fc2V0X3Bhcm0obXlfb2JqLCBwYXlsb2FkLT5wYXJtcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9TVFJFQU1fRVZUX0dFVF9QQVJNOgorICAgICAgICB7CisgICAgICAgICAgICBtbV9ldnRfcGF5bG9kX3NldF9nZXRfc3RyZWFtX3Bhcm1zX3QgKnBheWxvYWQgPQorICAgICAgICAgICAgICAgIChtbV9ldnRfcGF5bG9kX3NldF9nZXRfc3RyZWFtX3Bhcm1zX3QgKilpbl92YWw7CisgICAgICAgICAgICByYyA9IG1tX3N0cmVhbV9nZXRfcGFybShteV9vYmosIHBheWxvYWQtPnBhcm1zKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJpbnZhbGlkIHN0YXRlICglZCkgZm9yIGV2dCAoJWQpLCBpbiglcCksIG91dCglcCkiLAorICAgICAgICAgICAgICAgICAgICBteV9vYmotPnN0YXRlLCBldnQsIGluX3ZhbCwgb3V0X3ZhbCk7CisgICAgfQorICAgIExPR0QoIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2ZzbV9jZmcKKyAqCisgKiBERVNDUklQVElPTjogc3RyZWFtIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uIHRvIGhhbmRsZSBldmVudCBpbiBDT05GSUdVUkVECisgKiAgICAgICAgICAgICAgc3RhdGUuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICA6IHB0ciB0byBhIHN0cmVhbSBvYmplY3QKKyAqICAgQGV2dCAgICAgIDogc3RyZWFtIGV2ZW50IHRvIGJlIHByb2Nlc3NlZAorICogICBAaW5fdmFsICAgOiBpbnB1dCBldmVudCBwYXlsb2FkLiBDYW4gYmUgTlVMTCBpZiBub3QgbmVlZGVkLgorICogICBAb3V0X3ZhbCAgOiBvdXRwdXQgcGF5bG9hZCwgQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX2ZzbV9jZmcobW1fc3RyZWFtX3QgKiBteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX3N0cmVhbV9ldnRfdHlwZV90IGV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGluX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIG91dF92YWwpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgTE9HRCgiRSwgbXlfaGFuZGxlID0gMHgleCwgZmQgPSAlZCwgc3RhdGUgPSAlZCIsCisgICAgICAgICAgbXlfb2JqLT5teV9oZGwsIG15X29iai0+ZmQsIG15X29iai0+c3RhdGUpOworICAgIHN3aXRjaChldnQpIHsKKyAgICBjYXNlIE1NX1NUUkVBTV9FVlRfU0VUX0ZNVDoKKyAgICAgICAgeworICAgICAgICAgICAgbW1fY2FtZXJhX3N0cmVhbV9jb25maWdfdCAqY29uZmlnID0KKyAgICAgICAgICAgICAgICAobW1fY2FtZXJhX3N0cmVhbV9jb25maWdfdCAqKWluX3ZhbDsKKworICAgICAgICAgICAgcmMgPSBtbV9zdHJlYW1fY29uZmlnKG15X29iaiwgY29uZmlnKTsKKworICAgICAgICAgICAgLyogY2hhbmdlIHN0YXRlIHRvIGNvbmZpZ2VkICovCisgICAgICAgICAgICBteV9vYmotPnN0YXRlID0gTU1fU1RSRUFNX1NUQVRFX0NGRzsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIE1NX1NUUkVBTV9FVlRfUkVMRUFTRToKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fcmVsZWFzZShteV9vYmopOworICAgICAgICBteV9vYmotPnN0YXRlID0gTU1fU1RSRUFNX1NUQVRFX05PVFVTRUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fU1RSRUFNX0VWVF9TRVRfUEFSTToKKyAgICAgICAgeworICAgICAgICAgICAgbW1fZXZ0X3BheWxvZF9zZXRfZ2V0X3N0cmVhbV9wYXJtc190ICpwYXlsb2FkID0KKyAgICAgICAgICAgICAgICAobW1fZXZ0X3BheWxvZF9zZXRfZ2V0X3N0cmVhbV9wYXJtc190ICopaW5fdmFsOworICAgICAgICAgICAgcmMgPSBtbV9zdHJlYW1fc2V0X3Bhcm0obXlfb2JqLCBwYXlsb2FkLT5wYXJtcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9TVFJFQU1fRVZUX0dFVF9QQVJNOgorICAgICAgICB7CisgICAgICAgICAgICBtbV9ldnRfcGF5bG9kX3NldF9nZXRfc3RyZWFtX3Bhcm1zX3QgKnBheWxvYWQgPQorICAgICAgICAgICAgICAgIChtbV9ldnRfcGF5bG9kX3NldF9nZXRfc3RyZWFtX3Bhcm1zX3QgKilpbl92YWw7CisgICAgICAgICAgICByYyA9IG1tX3N0cmVhbV9nZXRfcGFybShteV9vYmosIHBheWxvYWQtPnBhcm1zKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX1NUUkVBTV9FVlRfR0VUX0JVRjoKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1faW5pdF9idWZzKG15X29iaik7CisgICAgICAgIC8qIGNoYW5nZSBzdGF0ZSB0byBidWZmIGFsbG9jYXRlZCAqLworICAgICAgICBpZigwID09IHJjKSB7CisgICAgICAgICAgICBteV9vYmotPnN0YXRlID0gTU1fU1RSRUFNX1NUQVRFX0JVRkZFRDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJpbnZhbGlkIHN0YXRlICglZCkgZm9yIGV2dCAoJWQpLCBpbiglcCksIG91dCglcCkiLAorICAgICAgICAgICAgICAgICAgICBteV9vYmotPnN0YXRlLCBldnQsIGluX3ZhbCwgb3V0X3ZhbCk7CisgICAgfQorICAgIExPR0QoIlggcmMgPSAlZCIsIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2ZzbV9idWZmZWQKKyAqCisgKiBERVNDUklQVElPTjogc3RyZWFtIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIGZ1bmN0aW9uIHRvIGhhbmRsZSBldmVudCBpbiBCVUZGRUQKKyAqICAgICAgICAgICAgICBzdGF0ZS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgIDogcHRyIHRvIGEgc3RyZWFtIG9iamVjdAorICogICBAZXZ0ICAgICAgOiBzdHJlYW0gZXZlbnQgdG8gYmUgcHJvY2Vzc2VkCisgKiAgIEBpbl92YWwgICA6IGlucHV0IGV2ZW50IHBheWxvYWQuIENhbiBiZSBOVUxMIGlmIG5vdCBuZWVkZWQuCisgKiAgIEBvdXRfdmFsICA6IG91dHB1dCBwYXlsb2FkLCBDYW4gYmUgTlVMTCBpZiBub3QgbmVlZGVkLgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9zdHJlYW1fZnNtX2J1ZmZlZChtbV9zdHJlYW1fdCAqIG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fc3RyZWFtX2V2dF90eXBlX3QgZXZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaW5fdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogb3V0X3ZhbCkKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBMT0dEKCJFLCBteV9oYW5kbGUgPSAweCV4LCBmZCA9ICVkLCBzdGF0ZSA9ICVkIiwKKyAgICAgICAgICBteV9vYmotPm15X2hkbCwgbXlfb2JqLT5mZCwgbXlfb2JqLT5zdGF0ZSk7CisgICAgc3dpdGNoKGV2dCkgeworICAgIGNhc2UgTU1fU1RSRUFNX0VWVF9QVVRfQlVGOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9kZWluaXRfYnVmcyhteV9vYmopOworICAgICAgICAvKiBjaGFuZ2Ugc3RhdGUgdG8gY29uZmlnZWQgKi8KKyAgICAgICAgbXlfb2JqLT5zdGF0ZSA9IE1NX1NUUkVBTV9TVEFURV9DRkc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fU1RSRUFNX0VWVF9SRUdfQlVGOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9yZWdfYnVmKG15X29iaik7CisgICAgICAgIC8qIGNoYW5nZSBzdGF0ZSB0byByZWdnZWQgKi8KKyAgICAgICAgaWYoMCA9PSByYykgeworICAgICAgICAgICAgbXlfb2JqLT5zdGF0ZSA9IE1NX1NUUkVBTV9TVEFURV9SRUc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9TVFJFQU1fRVZUX1NFVF9QQVJNOgorICAgICAgICB7CisgICAgICAgICAgICBtbV9ldnRfcGF5bG9kX3NldF9nZXRfc3RyZWFtX3Bhcm1zX3QgKnBheWxvYWQgPQorICAgICAgICAgICAgICAgIChtbV9ldnRfcGF5bG9kX3NldF9nZXRfc3RyZWFtX3Bhcm1zX3QgKilpbl92YWw7CisgICAgICAgICAgICByYyA9IG1tX3N0cmVhbV9zZXRfcGFybShteV9vYmosIHBheWxvYWQtPnBhcm1zKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX1NUUkVBTV9FVlRfR0VUX1BBUk06CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2V2dF9wYXlsb2Rfc2V0X2dldF9zdHJlYW1fcGFybXNfdCAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKG1tX2V2dF9wYXlsb2Rfc2V0X2dldF9zdHJlYW1fcGFybXNfdCAqKWluX3ZhbDsKKyAgICAgICAgICAgIHJjID0gbW1fc3RyZWFtX2dldF9wYXJtKG15X29iaiwgcGF5bG9hZC0+cGFybXMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR1coImludmFsaWQgc3RhdGUgKCVkKSBmb3IgZXZ0ICglZCksIGluKCVwKSwgb3V0KCVwKSIsCisgICAgICAgICAgICAgICAgICAgIG15X29iai0+c3RhdGUsIGV2dCwgaW5fdmFsLCBvdXRfdmFsKTsKKyAgICB9CisgICAgTE9HRCgiWCByYyA9ICVkIiwgcmMpOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fZnNtX3JlZworICoKKyAqIERFU0NSSVBUSU9OOiBzdHJlYW0gZmluaXRlIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb24gdG8gaGFuZGxlIGV2ZW50IGluIFJFR0dFRAorICogICAgICAgICAgICAgIHN0YXRlLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgOiBwdHIgdG8gYSBzdHJlYW0gb2JqZWN0CisgKiAgIEBldnQgICAgICA6IHN0cmVhbSBldmVudCB0byBiZSBwcm9jZXNzZWQKKyAqICAgQGluX3ZhbCAgIDogaW5wdXQgZXZlbnQgcGF5bG9hZC4gQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4KKyAqICAgQG91dF92YWwgIDogb3V0cHV0IHBheWxvYWQsIENhbiBiZSBOVUxMIGlmIG5vdCBuZWVkZWQuCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9mc21fcmVnKG1tX3N0cmVhbV90ICogbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9zdHJlYW1fZXZ0X3R5cGVfdCBldnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBpbl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBvdXRfdmFsKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIExPR0QoIkUsIG15X2hhbmRsZSA9IDB4JXgsIGZkID0gJWQsIHN0YXRlID0gJWQiLAorICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlKTsKKworICAgIHN3aXRjaChldnQpIHsKKyAgICBjYXNlIE1NX1NUUkVBTV9FVlRfVU5SRUdfQlVGOgorICAgICAgICByYyA9IG1tX3N0cmVhbV91bnJlZ19idWYobXlfb2JqKTsKKworICAgICAgICAvKiBjaGFuZ2Ugc3RhdGUgdG8gYnVmZmVkICovCisgICAgICAgIG15X29iai0+c3RhdGUgPSBNTV9TVFJFQU1fU1RBVEVfQlVGRkVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX1NUUkVBTV9FVlRfU1RBUlQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaGFzX2NiID0gMDsKKyAgICAgICAgICAgIHVpbnQ4X3QgaTsKKyAgICAgICAgICAgIC8qIGxhdW5jaCBjbWQgdGhyZWFkIGlmIENCIGlzIG5vdCBudWxsICovCisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2JfbG9jayk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTU1fQ0FNRVJBX1NUUkVBTV9CVUZfQ0JfTUFYOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZigoTlVMTCAhPSBteV9vYmotPmJ1Zl9jYltpXS5jYikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChteV9vYmotPmJ1Zl9jYltpXS5jYl90eXBlICE9IE1NX0NBTUVSQV9TVFJFQU1fQ0JfVFlQRV9TWU5DKSkgeworICAgICAgICAgICAgICAgICAgICBoYXNfY2IgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jYl9sb2NrKTsKKworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNtZF9sb2NrKTsKKyAgICAgICAgICAgIGlmIChoYXNfY2IpIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihteV9vYmotPmNtZF90aHJlYWQudGhyZWFkTmFtZSwgVEhSRUFEX05BTUVfU0laRSwgIkNBTV9TdHJtQXBwRGF0YSIpOworICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jbWRfdGhyZWFkX2xhdW5jaCgmbXlfb2JqLT5jbWRfdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9zdHJlYW1fZGlzcGF0Y2hfYXBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbXlfb2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNtZF9sb2NrKTsKKworICAgICAgICAgICAgbXlfb2JqLT5zdGF0ZSA9IE1NX1NUUkVBTV9TVEFURV9BQ1RJVkU7CisgICAgICAgICAgICByYyA9IG1tX3N0cmVhbV9zdHJlYW1vbihteV9vYmopOworICAgICAgICAgICAgaWYgKDAgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICAvKiBmYWlsZWQgc3RyZWFtIG9uLCBuZWVkIHRvIHJlbGVhc2UgY21kIHRocmVhZCBpZiBpdCdzIGxhdW5jaGVkICovCisgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNtZF9sb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAoaGFzX2NiKSB7CisgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jbWRfdGhyZWFkX3JlbGVhc2UoJm15X29iai0+Y21kX3RocmVhZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNtZF9sb2NrKTsKKyAgICAgICAgICAgICAgICBteV9vYmotPnN0YXRlID0gTU1fU1RSRUFNX1NUQVRFX1JFRzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX1NUUkVBTV9FVlRfU0VUX1BBUk06CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2V2dF9wYXlsb2Rfc2V0X2dldF9zdHJlYW1fcGFybXNfdCAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKG1tX2V2dF9wYXlsb2Rfc2V0X2dldF9zdHJlYW1fcGFybXNfdCAqKWluX3ZhbDsKKyAgICAgICAgICAgIHJjID0gbW1fc3RyZWFtX3NldF9wYXJtKG15X29iaiwgcGF5bG9hZC0+cGFybXMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fU1RSRUFNX0VWVF9HRVRfUEFSTToKKyAgICAgICAgeworICAgICAgICAgICAgbW1fZXZ0X3BheWxvZF9zZXRfZ2V0X3N0cmVhbV9wYXJtc190ICpwYXlsb2FkID0KKyAgICAgICAgICAgICAgICAobW1fZXZ0X3BheWxvZF9zZXRfZ2V0X3N0cmVhbV9wYXJtc190ICopaW5fdmFsOworICAgICAgICAgICAgcmMgPSBtbV9zdHJlYW1fZ2V0X3Bhcm0obXlfb2JqLCBwYXlsb2FkLT5wYXJtcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiaW52YWxpZCBzdGF0ZSAoJWQpIGZvciBldnQgKCVkKSwgaW4oJXApLCBvdXQoJXApIiwKKyAgICAgICAgICAgICAgICAgICAgbXlfb2JqLT5zdGF0ZSwgZXZ0LCBpbl92YWwsIG91dF92YWwpOworICAgIH0KKyAgICBMT0dEKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9mc21fYWN0aXZlCisgKgorICogREVTQ1JJUFRJT046IHN0cmVhbSBmaW5pdGUgc3RhdGUgbWFjaGluZSBmdW5jdGlvbiB0byBoYW5kbGUgZXZlbnQgaW4gQUNUSVZFCisgKiAgICAgICAgICAgICAgc3RhdGUuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICA6IHB0ciB0byBhIHN0cmVhbSBvYmplY3QKKyAqICAgQGV2dCAgICAgIDogc3RyZWFtIGV2ZW50IHRvIGJlIHByb2Nlc3NlZAorICogICBAaW5fdmFsICAgOiBpbnB1dCBldmVudCBwYXlsb2FkLiBDYW4gYmUgTlVMTCBpZiBub3QgbmVlZGVkLgorICogICBAb3V0X3ZhbCAgOiBvdXRwdXQgcGF5bG9hZCwgQ2FuIGJlIE5VTEwgaWYgbm90IG5lZWRlZC4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX2ZzbV9hY3RpdmUobW1fc3RyZWFtX3QgKiBteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX3N0cmVhbV9ldnRfdHlwZV90IGV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGluX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIG91dF92YWwpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgTE9HRCgiRSwgbXlfaGFuZGxlID0gMHgleCwgZmQgPSAlZCwgc3RhdGUgPSAlZCIsCisgICAgICAgICAgbXlfb2JqLT5teV9oZGwsIG15X29iai0+ZmQsIG15X29iai0+c3RhdGUpOworICAgIHN3aXRjaChldnQpIHsKKyAgICBjYXNlIE1NX1NUUkVBTV9FVlRfUUJVRjoKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fYnVmX2RvbmUobXlfb2JqLCAobW1fY2FtZXJhX2J1Zl9kZWZfdCAqKWluX3ZhbCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fU1RSRUFNX0VWVF9HRVRfUVVFVUVEX0JVRl9DT1VOVDoKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fZ2V0X3F1ZXVlZF9idWZfY291bnQobXlfb2JqKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9TVFJFQU1fRVZUX1NUT1A6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgaGFzX2NiID0gMDsKKyAgICAgICAgICAgIHVpbnQ4X3QgaTsKKyAgICAgICAgICAgIHJjID0gbW1fc3RyZWFtX3N0cmVhbW9mZihteV9vYmopOworCisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2JfbG9jayk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTU1fQ0FNRVJBX1NUUkVBTV9CVUZfQ0JfTUFYOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZihOVUxMICE9IG15X29iai0+YnVmX2NiW2ldLmNiCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBteV9vYmotPmJ1Zl9jYltpXS5jYl90eXBlICE9IE1NX0NBTUVSQV9TVFJFQU1fQ0JfVFlQRV9TWU5DKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc19jYiA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNiX2xvY2spOworCisgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y21kX2xvY2spOworICAgICAgICAgICAgaWYgKGhhc19jYikgeworICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jbWRfdGhyZWFkX3JlbGVhc2UoJm15X29iai0+Y21kX3RocmVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jbWRfbG9jayk7CisgICAgICAgICAgICBteV9vYmotPnN0YXRlID0gTU1fU1RSRUFNX1NUQVRFX1JFRzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX1NUUkVBTV9FVlRfU0VUX1BBUk06CisgICAgICAgIHsKKyAgICAgICAgICAgIG1tX2V2dF9wYXlsb2Rfc2V0X2dldF9zdHJlYW1fcGFybXNfdCAqcGF5bG9hZCA9CisgICAgICAgICAgICAgICAgKG1tX2V2dF9wYXlsb2Rfc2V0X2dldF9zdHJlYW1fcGFybXNfdCAqKWluX3ZhbDsKKyAgICAgICAgICAgIHJjID0gbW1fc3RyZWFtX3NldF9wYXJtKG15X29iaiwgcGF5bG9hZC0+cGFybXMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fU1RSRUFNX0VWVF9HRVRfUEFSTToKKyAgICAgICAgeworICAgICAgICAgICAgbW1fZXZ0X3BheWxvZF9zZXRfZ2V0X3N0cmVhbV9wYXJtc190ICpwYXlsb2FkID0KKyAgICAgICAgICAgICAgICAobW1fZXZ0X3BheWxvZF9zZXRfZ2V0X3N0cmVhbV9wYXJtc190ICopaW5fdmFsOworICAgICAgICAgICAgcmMgPSBtbV9zdHJlYW1fZ2V0X3Bhcm0obXlfb2JqLCBwYXlsb2FkLT5wYXJtcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9TVFJFQU1fRVZUX0RPX0FDVElPTjoKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fZG9fYWN0aW9uKG15X29iaiwgaW5fdmFsKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiaW52YWxpZCBzdGF0ZSAoJWQpIGZvciBldnQgKCVkKSwgaW4oJXApLCBvdXQoJXApIiwKKyAgICAgICAgICAgICAgICAgICAgbXlfb2JqLT5zdGF0ZSwgZXZ0LCBpbl92YWwsIG91dF92YWwpOworICAgIH0KKyAgICBMT0dEKCJYIHJjID0gJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9tYXBfYnVmX29wcworICoKKyAqIERFU0NSSVBUSU9OOiBvcHMgZm9yIG1hcHBpbmcgc3RyZWFtIGJ1ZmZlciB2aWEgZG9tYWluIHNvY2tldCB0byBzZXJ2ZXIuCisgKiAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZCB0byB1cHBlciBsYXllciBhcyBwYXJ0IG9mIG9wcyB0YWJsZQorICogICAgICAgICAgICAgIHRvIGJlIHVzZWQgYnkgdXBwZXIgbGF5ZXIgd2hlbiBhbGxvY2F0aW5nIHN0cmVhbSBidWZmZXJzIGFuZCBtYXBwaW5nCisgKiAgICAgICAgICAgICAgYnVmZmVycyB0byBzZXJ2ZXIgdmlhIGRvbWFpbiBzb2NrZXQuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmcmFtZV9pZHggICAgOiBpbmRleCBvZiBidWZmZXIgd2l0aGluIHRoZSBzdHJlYW0gYnVmZmVycywgb25seSB2YWxpZCBpZgorICogICAgICAgICAgICAgICAgICAgYnVmX3R5cGUgaXMgQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRiBvcgorICogICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfT0ZGTElORV9JTlBVVF9CVUYKKyAqICAgQHBsYW5lX2lkeCAgICA6IHBsYW5lIGluZGV4LiBJZiBhbGwgcGxhbmVzIHNoYXJlIHRoZSBzYW1lIGZkLAorICogICAgICAgICAgICAgICAgICAgcGxhbmVfaWR4ID0gLTE7IG90aGVyd2lzZSwgcGxlYW5faWR4IGlzIHRoZQorICogICAgICAgICAgICAgICAgICAgaW5kZXggdG8gcGxhbmUgKDAuLm51bV9vZl9wbGFuZXMpCisgKiAgIEBmZCAgICAgICAgICAgOiBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGJ1ZmZlcgorICogICBAc2l6ZSAgICAgICAgIDogc2l6ZSBvZiB0aGUgYnVmZmVyCisgKiAgIEB1c2VyZGF0YSAgICAgOiB1c2VyIGRhdGEgcHRyIChzdHJlYW0gb2JqZWN0KQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludDMyX3QgbW1fc3RyZWFtX21hcF9idWZfb3BzKHVpbnQzMl90IGZyYW1lX2lkeCwKKyAgICAgICAgaW50MzJfdCBwbGFuZV9pZHgsIGludCBmZCwgc2l6ZV90IHNpemUsCisgICAgICAgIHZvaWQgKmJ1ZmZlciwgY2FtX21hcHBpbmdfYnVmX3R5cGUgdHlwZSwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgbW1fc3RyZWFtX3QgKm15X29iaiA9IChtbV9zdHJlYW1fdCAqKXVzZXJkYXRhOworICAgIHJldHVybiBtbV9zdHJlYW1fbWFwX2J1ZihteV9vYmosCisgICAgICAgICAgICB0eXBlLCBmcmFtZV9pZHgsIHBsYW5lX2lkeCwgZmQsIHNpemUsIGJ1ZmZlcik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2J1bmRsZWRfbWFwX2J1Zl9vcHMKKyAqCisgKiBERVNDUklQVElPTjogb3BzIGZvciBtYXBwaW5nIGJ1bmRsZWQgc3RyZWFtIGJ1ZmZlcnMgdmlhIGRvbWFpbiBzb2NrZXQgdG8gc2VydmVyLgorICogICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBwYXNzZWQgdG8gdXBwZXIgbGF5ZXIgYXMgcGFydCBvZiBvcHMgdGFibGUKKyAqICAgICAgICAgICAgICB0byBiZSB1c2VkIGJ5IHVwcGVyIGxheWVyIHdoZW4gYWxsb2NhdGluZyBzdHJlYW0gYnVmZmVycyBhbmQgbWFwcGluZworICogICAgICAgICAgICAgIGJ1ZmZlcnMgdG8gc2VydmVyIHZpYSBkb21haW4gc29ja2V0LgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAYnVmX21hcF9saXN0IDogbGlzdCBvZiBidWZmZXIgbWFwcGluZyBpbmZvcm1hdGlvbgorICogICBAdXNlcmRhdGEgICAgIDogdXNlciBkYXRhIHB0ciAoc3RyZWFtIG9iamVjdCkKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX3N0cmVhbV9idW5kbGVkX21hcF9idWZfb3BzKAorICAgICAgICBjb25zdCBjYW1fYnVmX21hcF90eXBlX2xpc3QgKmJ1Zl9tYXBfbGlzdCwKKyAgICAgICAgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgbW1fc3RyZWFtX3QgKm15X29iaiA9IChtbV9zdHJlYW1fdCAqKXVzZXJkYXRhOworICAgIHJldHVybiBtbV9zdHJlYW1fbWFwX2J1ZnMobXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX21hcF9saXN0KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fdW5tYXBfYnVmX29wcworICoKKyAqIERFU0NSSVBUSU9OOiBvcHMgZm9yIHVubWFwcGluZyBzdHJlYW0gYnVmZmVyIHZpYSBkb21haW4gc29ja2V0IHRvIHNlcnZlci4KKyAqICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIHRvIHVwcGVyIGxheWVyIGFzIHBhcnQgb2Ygb3BzIHRhYmxlCisgKiAgICAgICAgICAgICAgdG8gYmUgdXNlZCBieSB1cHBlciBsYXllciB3aGVuIGFsbG9jYXRpbmcgc3RyZWFtIGJ1ZmZlcnMgYW5kIHVubWFwcGluZworICogICAgICAgICAgICAgIGJ1ZmZlcnMgdG8gc2VydmVyIHZpYSBkb21haW4gc29ja2V0LgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZnJhbWVfaWR4ICAgIDogaW5kZXggb2YgYnVmZmVyIHdpdGhpbiB0aGUgc3RyZWFtIGJ1ZmZlcnMsIG9ubHkgdmFsaWQgaWYKKyAqICAgICAgICAgICAgICAgICAgIGJ1Zl90eXBlIGlzIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYgb3IKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfSU5QVVRfQlVGCisgKiAgIEBwbGFuZV9pZHggICAgOiBwbGFuZSBpbmRleC4gSWYgYWxsIHBsYW5lcyBzaGFyZSB0aGUgc2FtZSBmZCwKKyAqICAgICAgICAgICAgICAgICAgIHBsYW5lX2lkeCA9IC0xOyBvdGhlcndpc2UsIHBsZWFuX2lkeCBpcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgIGluZGV4IHRvIHBsYW5lICgwLi5udW1fb2ZfcGxhbmVzKQorICogICBAdXNlcmRhdGEgICAgIDogdXNlciBkYXRhIHB0ciAoc3RyZWFtIG9iamVjdCkKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQzMl90IG1tX3N0cmVhbV91bm1hcF9idWZfb3BzKHVpbnQzMl90IGZyYW1lX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX21hcHBpbmdfYnVmX3R5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhKQoreworICAgIG1tX3N0cmVhbV90ICpteV9vYmogPSAobW1fc3RyZWFtX3QgKil1c2VyZGF0YTsKKyAgICByZXR1cm4gbW1fc3RyZWFtX3VubWFwX2J1ZihteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfaWR4KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fY29uZmlnCisgKgorICogREVTQ1JJUFRJT046IGNvbmZpZ3VyZSBhIHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogc3RyZWFtIG9iamVjdAorICogICBAY29uZmlnICAgICAgIDogc3RyZWFtIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX2NvbmZpZyhtbV9zdHJlYW1fdCAqbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zdHJlYW1fY29uZmlnX3QgKmNvbmZpZykKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBpbnQzMl90IGNiX2luZGV4ID0gMDsKKworICAgIExPR0QoIkUsIG15X2hhbmRsZSA9IDB4JXgsIGZkID0gJWQsIHN0YXRlID0gJWQiLAorICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlKTsKKyAgICBteV9vYmotPnN0cmVhbV9pbmZvID0gY29uZmlnLT5zdHJlYW1faW5mbzsKKyAgICBteV9vYmotPmJ1Zl9udW0gPSAodWludDhfdCkgY29uZmlnLT5zdHJlYW1faW5mby0+bnVtX2J1ZnM7CisgICAgbXlfb2JqLT5tZW1fdnRibCA9IGNvbmZpZy0+bWVtX3Z0Ymw7CisgICAgbXlfb2JqLT5wYWRkaW5nX2luZm8gPSBjb25maWctPnBhZGRpbmdfaW5mbzsKKworICAgIGlmIChjb25maWctPnN0cmVhbV9jYl9zeW5jICE9IE5VTEwpIHsKKyAgICAgICAgLyogU1lOQyBjYWxsYmFjayBpcyBhbHdheXMgcGxhY2VkIGF0IGluZGV4IDAqLworICAgICAgICBteV9vYmotPmJ1Zl9jYltjYl9pbmRleF0uY2IgPSBjb25maWctPnN0cmVhbV9jYl9zeW5jOworICAgICAgICBteV9vYmotPmJ1Zl9jYltjYl9pbmRleF0udXNlcl9kYXRhID0gY29uZmlnLT51c2VyZGF0YTsKKyAgICAgICAgbXlfb2JqLT5idWZfY2JbY2JfaW5kZXhdLmNiX2NvdW50ID0gLTE7IC8qIGluZmluaXRlIGJ5IGRlZmF1bHQgKi8KKyAgICAgICAgbXlfb2JqLT5idWZfY2JbY2JfaW5kZXhdLmNiX3R5cGUgPSBNTV9DQU1FUkFfU1RSRUFNX0NCX1RZUEVfU1lOQzsKKyAgICAgICAgY2JfaW5kZXgrKzsKKyAgICB9CisgICAgbXlfb2JqLT5idWZfY2JbY2JfaW5kZXhdLmNiID0gY29uZmlnLT5zdHJlYW1fY2I7CisgICAgbXlfb2JqLT5idWZfY2JbY2JfaW5kZXhdLnVzZXJfZGF0YSA9IGNvbmZpZy0+dXNlcmRhdGE7CisgICAgbXlfb2JqLT5idWZfY2JbY2JfaW5kZXhdLmNiX2NvdW50ID0gLTE7IC8qIGluZmluaXRlIGJ5IGRlZmF1bHQgKi8KKyAgICBteV9vYmotPmJ1Zl9jYltjYl9pbmRleF0uY2JfdHlwZSA9IE1NX0NBTUVSQV9TVFJFQU1fQ0JfVFlQRV9BU1lOQzsKKworICAgIHJjID0gbW1fc3RyZWFtX3N5bmNfaW5mbyhteV9vYmopOworICAgIGlmIChyYyA9PSAwKSB7CisgICAgICAgIHJjID0gbW1fc3RyZWFtX3NldF9mbXQobXlfb2JqKTsKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgTE9HRSgibW1fc3RyZWFtX3NldF9mbXQgZmFpbGVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG15X29iai0+bWFwX29wcy5tYXBfb3BzID0gbW1fc3RyZWFtX21hcF9idWZfb3BzOworICAgIG15X29iai0+bWFwX29wcy5idW5kbGVkX21hcF9vcHMgPSBtbV9zdHJlYW1fYnVuZGxlZF9tYXBfYnVmX29wczsKKyAgICBteV9vYmotPm1hcF9vcHMudW5tYXBfb3BzID0gbW1fc3RyZWFtX3VubWFwX2J1Zl9vcHM7CisgICAgbXlfb2JqLT5tYXBfb3BzLnVzZXJkYXRhID0gbXlfb2JqOworCisgICAgaWYobXlfb2JqLT5tZW1fdnRibC5zZXRfY29uZmlnX29wcyAhPSBOVUxMKSB7CisgICAgICAgIG15X29iai0+bWVtX3Z0Ymwuc2V0X2NvbmZpZ19vcHMoJm15X29iai0+bWFwX29wcywKKyAgICAgICAgICAgICAgICBteV9vYmotPm1lbV92dGJsLnVzZXJfZGF0YSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fcmVsZWFzZQorICoKKyAqIERFU0NSSVBUSU9OOiByZWxlYXNlIGEgc3RyZWFtIHJlc291cmNlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBzdHJlYW0gb2JqZWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9yZWxlYXNlKG1tX3N0cmVhbV90ICpteV9vYmopCit7CisgICAgTE9HRCgiRSwgbXlfaGFuZGxlID0gMHgleCwgZmQgPSAlZCwgc3RhdGUgPSAlZCIsCisgICAgICAgICAgbXlfb2JqLT5teV9oZGwsIG15X29iai0+ZmQsIG15X29iai0+c3RhdGUpOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICBtZW1zZXQobXlfb2JqLT5idWZfc3RhdHVzLCAwLCBzaXplb2YobXlfb2JqLT5idWZfc3RhdHVzKSk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+YnVmX2xvY2spOworCisgICAgLyogY2xvc2UgZmQgKi8KKyAgICBpZiAobXlfb2JqLT5mZCA+PSAwKSB7CisjaWZuZGVmIERBRU1PTl9QUkVTRU5UCisgICAgICAgIGludDMyX3QgcmMgPSAwOworICAgICAgICBjYW1fc2hpbV9wYWNrZXRfdCAqc2hpbV9jbWQ7CisgICAgICAgIGNhbV9zaGltX2NtZF9kYXRhIHNoaW1fY21kX2RhdGE7CisgICAgICAgIG1tX2NhbWVyYV9vYmpfdCAqY2FtX29iaiA9IG15X29iai0+Y2hfb2JqLT5jYW1fb2JqOworCisgICAgICAgIG1lbXNldCgmc2hpbV9jbWRfZGF0YSwgMCwgc2l6ZW9mKHNoaW1fY21kX2RhdGEpKTsKKyAgICAgICAgc2hpbV9jbWRfZGF0YS5jb21tYW5kID0gTVNNX0NBTUVSQV9QUklWX0RFTF9TVFJFQU07CisgICAgICAgIHNoaW1fY21kX2RhdGEuc3RyZWFtX2lkID0gbXlfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkOworICAgICAgICBzaGltX2NtZF9kYXRhLnZhbHVlID0gTlVMTDsKKyAgICAgICAgc2hpbV9jbWQgPSBtbV9jYW1lcmFfY3JlYXRlX3NoaW1fY21kX3BhY2tldChDQU1fU0hJTV9TRVRfUEFSTSwKKyAgICAgICAgICAgICAgICBjYW1fb2JqLT5zZXNzaW9uaWQsICZzaGltX2NtZF9kYXRhKTsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfbW9kdWxlX3NlbmRfY21kKHNoaW1fY21kKTsKKyAgICAgICAgaWYgKHJjIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIERFTEVURSBTVFJFQU0iKTsKKyAgICAgICAgfQorICAgICAgICBtbV9jYW1lcmFfZGVzdHJveV9zaGltX2NtZF9wYWNrZXQoc2hpbV9jbWQpOworI2VuZGlmIC8qIERBRU1PTl9QUkVTRU5UICovCisgICAgICAgIGNsb3NlKG15X29iai0+ZmQpOworICAgIH0KKworICAgIC8qIGRlc3Ryb3kgbXV0ZXggKi8KKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmbXlfb2JqLT5idWZfY29uZCk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm15X29iai0+Y2JfbG9jayk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZteV9vYmotPmNtZF9sb2NrKTsKKworICAgIC8qIHJlc2V0IHN0cmVhbSBvYmogKi8KKyAgICBtZW1zZXQobXlfb2JqLCAwLCBzaXplb2YobW1fc3RyZWFtX3QpKTsKKyAgICBteV9vYmotPmZkID0gLTE7CisKKyAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fc3RyZWFtb24KKyAqCisgKiBERVNDUklQVElPTjogc3RyZWFtIG9uIGEgc3RyZWFtLiBzZW5kaW5nIHY0bDIgcmVxdWVzdCB0byBrZXJuZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IHN0cmVhbSBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX3N0cmVhbW9uKG1tX3N0cmVhbV90ICpteV9vYmopCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgaW50OF90IGk7CisgICAgZW51bSB2NGwyX2J1Zl90eXBlIGJ1Zl90eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKworICAgIExPR0QoIkUsIG15X2hhbmRsZSA9IDB4JXgsIGZkID0gJWQsIHN0YXRlID0gJWQiLAorICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5idWZfbG9jayk7CisgICAgZm9yIChpID0gMDsgaSA8IG15X29iai0+YnVmX251bTsgaSsrKSB7CisgICAgICAgIGlmICgobXlfb2JqLT5idWZfc3RhdHVzW2ldLm1hcF9zdGF0dXMgPT0gMCkgJiYKKyAgICAgICAgICAgICAgICAobXlfb2JqLT5idWZfc3RhdHVzW2ldLmluX2tlcm5lbCkpIHsKKyAgICAgICAgICAgIExPR0QoIndhaXRpbmcgZm9yIG1hcHBpbmcgdG8gZG9uZTogc3RybSBmZCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIG15X29iai0+ZmQpOworICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgICAgICAgICAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKTsKKyAgICAgICAgICAgIHRzLnR2X3NlYyArPSBXQUlUX1RJTUVPVVQ7CisgICAgICAgICAgICByYyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJm15X29iai0+YnVmX2NvbmQsICZteV9vYmotPmJ1Zl9sb2NrLCAmdHMpOworICAgICAgICAgICAgaWYgKHJjID09IEVUSU1FRE9VVCkgeworICAgICAgICAgICAgICAgIExPR0UoIlRpbWVkIG91dC4gQWJvcnQgc3RyZWFtLW9uIFxuIik7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKG15X29iai0+YnVmX3N0YXR1c1tpXS5tYXBfc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgTE9HRCgiQnVmZmVyIG1hcHBpbmcgZmFpbGVkLiBBYm9ydCBTdHJlYW0gT24iKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5idWZfbG9jayk7CisKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIC8qIHJlbW92ZSBmZCBmcm9tIGRhdGEgcG9sbCB0aHJlYWQgaW4gY2FzZSBvZiBmYWlsdXJlICovCisgICAgICAgIG1tX2NhbWVyYV9wb2xsX3RocmVhZF9kZWxfcG9sbF9mZCgmbXlfb2JqLT5jaF9vYmotPnBvbGxfdGhyZWFkWzBdLAorICAgICAgICAgICAgICAgIG15X29iai0+bXlfaGRsLCBtbV9jYW1lcmFfc3luY19jYWxsKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICBtbV9jYW1lcmFfb2JqX3QgKmNhbV9vYmogPSBteV9vYmotPmNoX29iai0+Y2FtX29iajsKKyAgICBMT0dEKCJFLCBteV9oYW5kbGUgPSAweCV4LCBmZCA9ICVkLCBzdGF0ZSA9ICVkIHNlc3Npb25faWQ6JWQgc3RyZWFtX2lkOiVkIiwKKyAgICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlLCBjYW1fb2JqLT5zZXNzaW9uaWQsCisgICAgICAgICAgICBteV9vYmotPnNlcnZlcl9zdHJlYW1faWQpOworCisgICAgcmMgPSBpb2N0bChteV9vYmotPmZkLCBWSURJT0NfU1RSRUFNT04sICZidWZfdHlwZSk7CisgICAgaWYgKHJjIDwgMCAmJiBteV9vYmotPnN0cmVhbV9pbmZvLT5udW1fYnVmcyAhPSAwKSB7CisgICAgICAgIExPR0UoImlvY3RsIFZJRElPQ19TVFJFQU1PTiBmYWlsZWQ6IHJjPSVkLCBlcnJubyAlZCIsCisgICAgICAgICAgICAgICAgcmMsIGVycm5vKTsKKyAgICAgICAgZ290byBlcnJvcl9jYXNlOworICAgIH0KKworI2lmbmRlZiBEQUVNT05fUFJFU0VOVAorICAgIGNhbV9zaGltX3BhY2tldF90ICpzaGltX2NtZDsKKyAgICBjYW1fc2hpbV9jbWRfZGF0YSBzaGltX2NtZF9kYXRhOworCisgICAgbWVtc2V0KCZzaGltX2NtZF9kYXRhLCAwLCBzaXplb2Yoc2hpbV9jbWRfZGF0YSkpOworICAgIHNoaW1fY21kX2RhdGEuY29tbWFuZCA9IE1TTV9DQU1FUkFfUFJJVl9TVFJFQU1fT047CisgICAgc2hpbV9jbWRfZGF0YS5zdHJlYW1faWQgPSBteV9vYmotPnNlcnZlcl9zdHJlYW1faWQ7CisgICAgc2hpbV9jbWRfZGF0YS52YWx1ZSA9IE5VTEw7CisgICAgc2hpbV9jbWQgPSBtbV9jYW1lcmFfY3JlYXRlX3NoaW1fY21kX3BhY2tldChDQU1fU0hJTV9TRVRfUEFSTSwKKyAgICAgICAgICAgIGNhbV9vYmotPnNlc3Npb25pZCwgJnNoaW1fY21kX2RhdGEpOworICAgIHJjID0gbW1fY2FtZXJhX21vZHVsZV9zZW5kX2NtZChzaGltX2NtZCk7CisgICAgbW1fY2FtZXJhX2Rlc3Ryb3lfc2hpbV9jbWRfcGFja2V0KHNoaW1fY21kKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoIk1vZHVsZSBTdHJlYW1PTiBmYWlsZWQ6IHJjPSVkIiwgcmMpOworICAgICAgICBpb2N0bChteV9vYmotPmZkLCBWSURJT0NfU1RSRUFNT0ZGLCAmYnVmX3R5cGUpOworICAgICAgICBnb3RvIGVycm9yX2Nhc2U7CisgICAgfQorI2VuZGlmCisgICAgTE9HRCgiWCByYyA9ICVkIixyYyk7CisgICAgcmV0dXJuIHJjOworZXJyb3JfY2FzZToKKyAgICAgLyogcmVtb3ZlIGZkIGZyb20gZGF0YSBwb2xsIHRocmVhZCBpbiBjYXNlIG9mIGZhaWx1cmUgKi8KKyAgICAgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX2RlbF9wb2xsX2ZkKCZteV9vYmotPmNoX29iai0+cG9sbF90aHJlYWRbMF0sCisgICAgICAgICAgICAgbXlfb2JqLT5teV9oZGwsIG1tX2NhbWVyYV9zeW5jX2NhbGwpOworCisgICAgTE9HRCgiWCByYyA9ICVkIixyYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9zdHJlYW1vZmYKKyAqCisgKiBERVNDUklQVElPTjogc3RyZWFtIG9mZiBhIHN0cmVhbS4gc2VuZGluZyB2NGwyIHJlcXVlc3QgdG8ga2VybmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBzdHJlYW0gb2JqZWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9zdHJlYW1vZmYobW1fc3RyZWFtX3QgKm15X29iaikKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBlbnVtIHY0bDJfYnVmX3R5cGUgYnVmX3R5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworICAgIExPR0QoIkUsIG15X2hhbmRsZSA9IDB4JXgsIGZkID0gJWQsIHN0YXRlID0gJWQiLAorICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlKTsKKworICAgIC8qIHN0ZXAxOiByZW1vdmUgZmQgZnJvbSBkYXRhIHBvbGwgdGhyZWFkICovCisgICAgcmMgPSBtbV9jYW1lcmFfcG9sbF90aHJlYWRfZGVsX3BvbGxfZmQoJm15X29iai0+Y2hfb2JqLT5wb2xsX3RocmVhZFswXSwKKyAgICAgICAgICAgIG15X29iai0+bXlfaGRsLCBtbV9jYW1lcmFfc3luY19jYWxsKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIC8qIFRoZSBlcnJvciBtaWdodCBiZSBkdWUgdG8gYXN5bmMgdXBkYXRlLiBJbiB0aGlzIGNhc2UKKyAgICAgICAgICogd2FpdCBmb3IgYWxsIHVwZGF0ZXMgdG8gY29tcGxldGUgYmVmb3JlIHByb2NlZWRpbmcuICovCisgICAgICAgIHJjID0gbW1fY2FtZXJhX3BvbGxfdGhyZWFkX2NvbW1pdF91cGRhdGVzKCZteV9vYmotPmNoX29iai0+cG9sbF90aHJlYWRbMF0pOworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJQb2xsIHN5bmMgZmFpbGVkICVkIiwgcmMpOworICAgICAgICAgICAgcmMgPSAwOworICAgICAgICB9CisgICAgfQorCisjaWZuZGVmIERBRU1PTl9QUkVTRU5UCisgICAgY2FtX3NoaW1fcGFja2V0X3QgKnNoaW1fY21kOworICAgIGNhbV9zaGltX2NtZF9kYXRhIHNoaW1fY21kX2RhdGE7CisgICAgbW1fY2FtZXJhX29ial90ICpjYW1fb2JqID0gbXlfb2JqLT5jaF9vYmotPmNhbV9vYmo7CisKKyAgICBtZW1zZXQoJnNoaW1fY21kX2RhdGEsIDAsIHNpemVvZihzaGltX2NtZF9kYXRhKSk7CisgICAgc2hpbV9jbWRfZGF0YS5jb21tYW5kID0gTVNNX0NBTUVSQV9QUklWX1NUUkVBTV9PRkY7CisgICAgc2hpbV9jbWRfZGF0YS5zdHJlYW1faWQgPSBteV9vYmotPnNlcnZlcl9zdHJlYW1faWQ7CisgICAgc2hpbV9jbWRfZGF0YS52YWx1ZSA9IE5VTEw7CisgICAgc2hpbV9jbWQgPSBtbV9jYW1lcmFfY3JlYXRlX3NoaW1fY21kX3BhY2tldChDQU1fU0hJTV9TRVRfUEFSTSwKKyAgICAgICAgICAgIGNhbV9vYmotPnNlc3Npb25pZCwgJnNoaW1fY21kX2RhdGEpOworCisgICAgcmMgfD0gbW1fY2FtZXJhX21vZHVsZV9zZW5kX2NtZChzaGltX2NtZCk7CisgICAgbW1fY2FtZXJhX2Rlc3Ryb3lfc2hpbV9jbWRfcGFja2V0KHNoaW1fY21kKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoIk1vZHVsZSBTdHJlYW1PRkYgZmFpbGVkOiByYz0lZCIsIHJjKQorICAgIH0KKyNlbmRpZgorCisgICAgLyogc3RlcDI6IHN0cmVhbSBvZmYgKi8KKyAgICByYyB8PSBpb2N0bChteV9vYmotPmZkLCBWSURJT0NfU1RSRUFNT0ZGLCAmYnVmX3R5cGUpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiU1RSRUFNT0ZGIGlvY3RsIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX3dyaXRlX3VzZXJfYnVmCisgKgorICogREVTQ1JJUFRJT046IGRlcXVldWUgYSBzdHJlYW0gYnVmZmVyIGZyb20gdXNlciBidWZmZXIgcXVldWUgYW5kIGZpbGwgaW50ZXJuYWwgc3RydWN0dXJlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBzdHJlYW0gb2JqZWN0CisgKiAgIEBidWYgICAgIDogcHRyIHRvIGEgc3RydWN0IHN0b3JpbmcgYnVmZmVyIGluZm9ybWF0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV93cml0ZV91c2VyX2J1ZihtbV9zdHJlYW1fdCAqIG15X29iaiwKKyAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqYnVmKQoreworICAgIGludDMyX3QgcmMgPSAwLCBpOworICAgIGludDMyX3QgaW5kZXggPSAtMSwgY291bnQgPSAwOworICAgIHN0cnVjdCBtc21fY2FtZXJhX3VzZXJfYnVmX2NvbnRfdCAqY29udF9idWYgPSBOVUxMOworCisgICAgaWYgKGJ1Zi0+YnVmX3R5cGUgPT0gQ0FNX1NUUkVBTV9CVUZfVFlQRV9VU0VSUFRSKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5idWZfbG9jayk7CisgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tidWYtPmJ1Zl9pZHhdLmJ1Zl9yZWZjbnQtLTsKKyAgICAgICAgaWYgKDAgPT0gbXlfb2JqLT5idWZfc3RhdHVzW2J1Zi0+YnVmX2lkeF0uYnVmX3JlZmNudCkgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+YnVmX2xvY2spOworICAgICAgICAgICAgY29udF9idWYgPSAoc3RydWN0IG1zbV9jYW1lcmFfdXNlcl9idWZfY29udF90ICopbXlfb2JqLT5idWZbYnVmLT5idWZfaWR4XS5idWZmZXI7CisgICAgICAgICAgICBjb250X2J1Zi0+YnVmX2NudCA9IG15X29iai0+YnVmW2J1Zi0+YnVmX2lkeF0udXNlcl9idWYuYnVmc191c2VkOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQzMl90KWNvbnRfYnVmLT5idWZfY250OyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb250X2J1Zi0+YnVmX2lkeFtpXSA9IG15X29iai0+YnVmW2J1Zi0+YnVmX2lkeF0udXNlcl9idWYuYnVmX2lkeFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJjID0gbW1fc3RyZWFtX3FidWYobXlfb2JqLCBidWYpOworICAgICAgICAgICAgaWYocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fY2FtZXJhX3N0cmVhbV9xYnVmKGlkeD0lZCkgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi0+YnVmX2lkeCwgcmMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludDMyX3QpY29udF9idWYtPmJ1Zl9jbnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBteV9vYmotPmJ1ZltidWYtPmJ1Zl9pZHhdLnVzZXJfYnVmLmJ1Zl9pZHhbaV0gPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXlfb2JqLT5idWZfc3RhdHVzW2J1Zi0+YnVmX2lkeF0uaW5fa2VybmVsID0gMTsKKyAgICAgICAgICAgICAgICBteV9vYmotPmJ1ZltidWYtPmJ1Zl9pZHhdLnVzZXJfYnVmLmJ1Zl9pbl91c2UgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HRCgiPERFQlVHPiA6IHJlZiBjb3VudCBwZW5kaW5nIGNvdW50IDolZCBpZHggPSAlZCIsCisgICAgICAgICAgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tidWYtPmJ1Zl9pZHhdLmJ1Zl9yZWZjbnQsIGJ1Zi0+YnVmX2lkeCk7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5idWZfbG9jayk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmICgobXlfb2JqLT5jdXJfYnVmX2lkeCA8IDApCisgICAgICAgICAgICB8fCAobXlfb2JqLT5jdXJfYnVmX2lkeCA+PSBteV9vYmotPmJ1Zl9udW0pKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBteV9vYmotPmJ1Zl9udW07IGkrKykgeworICAgICAgICAgICAgaWYgKChteV9vYmotPmJ1Zl9zdGF0dXNbaV0uaW5fa2VybmVsKQorICAgICAgICAgICAgICAgICAgICB8fCAobXlfb2JqLT5idWZbaV0udXNlcl9idWYuYnVmX2luX3VzZSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbXlfb2JqLT5jdXJfYnVmX2lkeCA9IGluZGV4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZXggPSBteV9vYmotPmN1cl9idWZfaWR4OworICAgIH0KKworICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICBMT0dFKCJObyBGcmVlIGJhdGNoIGJ1ZmZlciIpOworICAgICAgICByYyA9IC0xOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLy9JbnNlcnQgQnVmZmVyIHRvIEJhdGNoIHN0cnVjdHVyZS4KKyAgICBteV9vYmotPmJ1ZltpbmRleF0udXNlcl9idWYuYnVmX2lkeFtjb3VudF0gPSBidWYtPmJ1Zl9pZHg7CisgICAgbXlfb2JqLT5jdXJfYnVmc19zdGFnZWQrKzsKKworICAgIExPR0QoImluZGV4ID0gJWQgZmlsbGVkID0gJWQgdXNlZCA9ICVkIiwKKyAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgbXlfb2JqLT5jdXJfYnVmc19zdGFnZWQsCisgICAgICAgICAgICBteV9vYmotPmJ1ZltpbmRleF0udXNlcl9idWYuYnVmc191c2VkKTsKKworICAgIGlmIChteV9vYmotPmN1cl9idWZzX3N0YWdlZAorICAgICAgICAgICAgPT0gbXlfb2JqLT5idWZbaW5kZXhdLnVzZXJfYnVmLmJ1ZnNfdXNlZCl7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5idWZfbG9jayk7CisgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tpbmRleF0uYnVmX3JlZmNudC0tOworICAgICAgICBpZiAoMCA9PSBteV9vYmotPmJ1Zl9zdGF0dXNbaW5kZXhdLmJ1Zl9yZWZjbnQpIHsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICAgICAgICAgIGNvbnRfYnVmID0gKHN0cnVjdCBtc21fY2FtZXJhX3VzZXJfYnVmX2NvbnRfdCAqKW15X29iai0+YnVmW2luZGV4XS5idWZmZXI7CisgICAgICAgICAgICBjb250X2J1Zi0+YnVmX2NudCA9IG15X29iai0+YnVmW2luZGV4XS51c2VyX2J1Zi5idWZzX3VzZWQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludDMyX3QpY29udF9idWYtPmJ1Zl9jbnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnRfYnVmLT5idWZfaWR4W2ldID0gbXlfb2JqLT5idWZbaW5kZXhdLnVzZXJfYnVmLmJ1Zl9pZHhbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYyA9IG1tX3N0cmVhbV9xYnVmKG15X29iaiwgJm15X29iai0+YnVmW2luZGV4XSk7CisgICAgICAgICAgICBpZihyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9jYW1lcmFfc3RyZWFtX3FidWYoaWR4PSVkKSBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIHJjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQzMl90KWNvbnRfYnVmLT5idWZfY250OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbXlfb2JqLT5idWZbaW5kZXhdLnVzZXJfYnVmLmJ1Zl9pZHhbaV0gPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXlfb2JqLT5idWZfc3RhdHVzW2luZGV4XS5pbl9rZXJuZWwgPSAxOworICAgICAgICAgICAgICAgIG15X29iai0+YnVmW2luZGV4XS51c2VyX2J1Zi5idWZfaW5fdXNlID0gMTsKKyAgICAgICAgICAgICAgICBteV9vYmotPmN1cl9idWZzX3N0YWdlZCA9IDA7CisgICAgICAgICAgICAgICAgbXlfb2JqLT5jdXJfYnVmX2lkeCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIExPR0QoIjxERUJVRz4gOiByZWYgY291bnQgcGVuZGluZyBjb3VudCA6JWQgaWR4ID0gJWQiLAorICAgICAgICAgICAgICAgICBteV9vYmotPmJ1Zl9zdGF0dXNbaW5kZXhdLmJ1Zl9yZWZjbnQsIGluZGV4KTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fcmVhZF91c2VyX2J1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBkZXF1ZXVlIGEgc3RyZWFtIGJ1ZmZlciBmcm9tIHVzZXIgYnVmZmVyIHF1ZXVlIGFuZCBmaWxsIGludGVybmFsIHN0cnVjdHVyZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogc3RyZWFtIG9iamVjdAorICogICBAYnVmX2luZm8gICAgIDogcHRyIHRvIGEgc3RydWN0IHN0b3JpbmcgYnVmZmVyIGluZm9ybWF0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9yZWFkX3VzZXJfYnVmKG1tX3N0cmVhbV90ICogbXlfb2JqLAorICAgICAgICBtbV9jYW1lcmFfYnVmX2luZm9fdCogYnVmX2luZm8pCit7CisgICAgaW50MzJfdCByYyA9IDAsIGk7CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqc3RyZWFtX2J1ZiAgPSBOVUxMOworICAgIHN0cnVjdCBtc21fY2FtZXJhX3VzZXJfYnVmX2NvbnRfdCAqdXNlcl9idWYgPSBOVUxMOworICAgIG5zZWNzX3QgaW50ZXJ2YWxfbnNlYyA9IDAsIGZyYW1lX3RzID0gMCwgdGltZVN0YW1wID0gMDsKKyAgICBpbnQgdHNfZGVsdGEgPSAwOworICAgIHVpbnQzMl90IGZyYW1lSUQgPSAwOworCisgICAgdXNlcl9idWYgPSAoc3RydWN0IG1zbV9jYW1lcmFfdXNlcl9idWZfY29udF90ICopYnVmX2luZm8tPmJ1Zi0+YnVmZmVyOworCisgICAgaWYodXNlcl9idWYgIT0gbXlfb2JqLT5idWZbYnVmX2luZm8tPmJ1Zi0+YnVmX2lkeF0uYnVmZmVyKSB7CisgICAgICAgIExPR0QoIkJ1ZmZlciBtb2RpZmllZC4gRVJST1IiKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIGlmIChidWZfaW5mby0+YnVmLT5mcmFtZV9pZHggPT0gMSkgeworICAgICAgICBmcmFtZUlEID0gYnVmX2luZm8tPmJ1Zi0+ZnJhbWVfaWR4OworICAgIH1lbHNlIHsKKyAgICAgICAgZnJhbWVJRCA9IChidWZfaW5mby0+YnVmLT5mcmFtZV9pZHggLSAxKSAqIHVzZXJfYnVmLT5idWZfY250OworICAgIH0KKworICAgIHRpbWVTdGFtcCA9IChuc2Vjc190KShidWZfaW5mby0+YnVmLT50cy50dl9zZWMpICoKKyAgICAgICAgICAgIDEwMDAwMDAwMDBMTCArIGJ1Zl9pbmZvLT5idWYtPnRzLnR2X25zZWM7CisKKyAgICBpZiAodGltZVN0YW1wIDw9IG15X29iai0+cHJldl90aW1lc3RhbXApIHsKKyAgICAgICAgTE9HRSgiVGltZVN0YW1wIHJlY2VpdmVkIGxlc3MgdGhhbiBleHBlY3RlZCIpOworICAgICAgICBtbV9zdHJlYW1fcWJ1ZihteV9vYmosIGJ1Zl9pbmZvLT5idWYpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfSBlbHNlIGlmIChteV9vYmotPnByZXZfdGltZXN0YW1wID09IDAKKyAgICAgICAgICAgIHx8IChteV9vYmotPnByZXZfZnJhbWVJRCAhPSBidWZfaW5mby0+YnVmLT5mcmFtZV9pZHggKyAxKSkgeworICAgICAgICAvKiBGb3IgZmlyc3QgZnJhbWUgb3IgaW5jYXNlIGJhdGNoIGlzIGRyb3BlZCAqLworICAgICAgICBpbnRlcnZhbF9uc2VjID0gKChteV9vYmotPnN0cmVhbV9pbmZvLT51c2VyX2J1Zl9pbmZvLmZyYW1lSW50ZXJ2YWwpICogMTAwMDAwMCk7CisgICAgICAgIG15X29iai0+cHJldl90aW1lc3RhbXAgPSAodGltZVN0YW1wIC0gKG5zZWNzX3QpKHVzZXJfYnVmLT5idWZfY250ICogaW50ZXJ2YWxfbnNlYykpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRzX2RlbHRhID0gdGltZVN0YW1wIC0gbXlfb2JqLT5wcmV2X3RpbWVzdGFtcDsKKyAgICAgICAgaW50ZXJ2YWxfbnNlYyA9IChuc2Vjc190KSh0c19kZWx0YSAvIHVzZXJfYnVmLT5idWZfY250KTsKKyAgICAgICAgTE9HRCgiVGltZXN0YW1wIGRlbHRhID0gJWQgdGltZXN0YW1wID0gJWxsZCIsIHRzX2RlbHRhLCB0aW1lU3RhbXApOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAoaW50MzJfdCl1c2VyX2J1Zi0+YnVmX2NudDsgaSsrKSB7CisgICAgICAgIGJ1Zl9pbmZvLT5idWYtPnVzZXJfYnVmLmJ1Zl9pZHhbaV0gPSB1c2VyX2J1Zi0+YnVmX2lkeFtpXTsKKyAgICAgICAgc3RyZWFtX2J1ZiA9ICZteV9vYmotPnBsYW5lX2J1Zlt1c2VyX2J1Zi0+YnVmX2lkeFtpXV07CisgICAgICAgIHN0cmVhbV9idWYtPmZyYW1lX2lkeCA9IGZyYW1lSUQgKyBpOworCisgICAgICAgIGZyYW1lX3RzICA9IChpICogaW50ZXJ2YWxfbnNlYykgKyBteV9vYmotPnByZXZfdGltZXN0YW1wOworCisgICAgICAgIHN0cmVhbV9idWYtPnRzLnR2X3NlYyAgPSAoZnJhbWVfdHMgLyAxMDAwMDAwMDAwTEwpOworICAgICAgICBzdHJlYW1fYnVmLT50cy50dl9uc2VjID0gKGZyYW1lX3RzIC0gKHN0cmVhbV9idWYtPnRzLnR2X3NlYyAqIDEwMDAwMDAwMDBMTCkpOworICAgICAgICBzdHJlYW1fYnVmLT5pc191dl9zdWJzYW1wbGVkID0gYnVmX2luZm8tPmJ1Zi0+aXNfdXZfc3Vic2FtcGxlZDsKKworICAgICAgICBMT0dEKCJidWZfaW5kZXggJWQsIGZyYW1lX2lkeCAlZCwgc3RyZWFtIHR5cGUgJWQsIHRpbWVzdGFtcCA9ICVsbGQiLAorICAgICAgICAgICAgICAgICBzdHJlYW1fYnVmLT5idWZfaWR4LCBzdHJlYW1fYnVmLT5mcmFtZV9pZHgsCisgICAgICAgICAgICAgICAgbXlfb2JqLT5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUsIGZyYW1lX3RzKTsKKyAgICB9CisKKyAgICBidWZfaW5mby0+YnVmLT50cy50dl9zZWMgID0gKG15X29iai0+cHJldl90aW1lc3RhbXAgLyAxMDAwMDAwMDAwTEwpOworICAgIGJ1Zl9pbmZvLT5idWYtPnRzLnR2X25zZWMgPSAobXlfb2JqLT5wcmV2X3RpbWVzdGFtcCAtCisgICAgICAgICAgICAoYnVmX2luZm8tPmJ1Zi0+dHMudHZfc2VjICogMTAwMDAwMDAwMExMKSk7CisKKyAgICBidWZfaW5mby0+YnVmLT51c2VyX2J1Zi5idWZzX3VzZWQgPSB1c2VyX2J1Zi0+YnVmX2NudDsKKyAgICBidWZfaW5mby0+YnVmLT51c2VyX2J1Zi5idWZfaW5fdXNlID0gMTsKKworICAgIG15X29iai0+cHJldl90aW1lc3RhbXAgPSB0aW1lU3RhbXA7CisgICAgbXlfb2JqLT5wcmV2X2ZyYW1lSUQgPSBidWZfaW5mby0+YnVmLT5mcmFtZV9pZHg7CisKKyAgICBMT0dEKCJYIHJjID0gJWQiLHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX3JlYWRfbXNtX2ZyYW1lCisgKgorICogREVTQ1JJUFRJT046IGRlcXVldWUgYSBzdHJlYW0gYnVmZmVyIGZyb20ga2VybmVsIHF1ZXVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBzdHJlYW0gb2JqZWN0CisgKiAgIEBidWZfaW5mbyAgICAgOiBwdHIgdG8gYSBzdHJ1Y3Qgc3RvcmluZyBidWZmZXIgaW5mb3JtYXRpb24KKyAqICAgQG51bV9wbGFuZXMgICA6IG51bWJlciBvZiBwbGFuZXMgaW4gdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9zdHJlYW1fcmVhZF9tc21fZnJhbWUobW1fc3RyZWFtX3QgKiBteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX2luZm9fdCogYnVmX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9wbGFuZXMpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgc3RydWN0IHY0bDJfYnVmZmVyIHZiOworICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lc1tWSURFT19NQVhfUExBTkVTXTsKKyAgICBMT0dEKCJFLCBteV9oYW5kbGUgPSAweCV4LCBmZCA9ICVkLCBzdGF0ZSA9ICVkIiwKKyAgICAgICAgICBteV9vYmotPm15X2hkbCwgbXlfb2JqLT5mZCwgbXlfb2JqLT5zdGF0ZSk7CisKKyAgICBtZW1zZXQoJnZiLCAgMCwgIHNpemVvZih2YikpOworICAgIHZiLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworICAgIHZiLm1lbW9yeSA9IFY0TDJfTUVNT1JZX1VTRVJQVFI7CisgICAgdmIubS5wbGFuZXMgPSAmcGxhbmVzWzBdOworICAgIHZiLmxlbmd0aCA9IG51bV9wbGFuZXM7CisKKyAgICByYyA9IGlvY3RsKG15X29iai0+ZmQsIFZJRElPQ19EUUJVRiwgJnZiKTsKKyAgICBpZiAoMCA+IHJjKSB7CisgICAgICAgIExPR0UoIlZJRElPQ19EUUJVRiBpb2N0bCBjYWxsIGZhaWxlZCBvbiBzdHJlYW0gdHlwZSAlZCAocmM9JWQpOiAlcyIsCisgICAgICAgICAgICAgbXlfb2JqLT5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUsIHJjLCBzdHJlcnJvcihlcnJubykpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5idWZfbG9jayk7CisgICAgICAgIG15X29iai0+cXVldWVkX2J1ZmZlcl9jb3VudC0tOworICAgICAgICBpZiAoMCA9PSBteV9vYmotPnF1ZXVlZF9idWZmZXJfY291bnQpIHsKKyAgICAgICAgICAgIExPR0goIlN0b3BpbmcgcG9sbCBvbiBzdHJlYW0gJXAgdHlwZTogJWQiLAorICAgICAgICAgICAgICAgIG15X29iaiwgbXlfb2JqLT5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUpOworICAgICAgICAgICAgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX2RlbF9wb2xsX2ZkKCZteV9vYmotPmNoX29iai0+cG9sbF90aHJlYWRbMF0sCisgICAgICAgICAgICAgICAgbXlfb2JqLT5teV9oZGwsIG1tX2NhbWVyYV9hc3luY19jYWxsKTsKKyAgICAgICAgICAgIExPR0goIlN0b3BwZWQgcG9sbCBvbiBzdHJlYW0gJXAgdHlwZTogJWQiLAorICAgICAgICAgICAgICAgIG15X29iaiwgbXlfb2JqLT5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUpOworICAgICAgICB9CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICAgICAgdWludDMyX3QgaWR4ID0gdmIuaW5kZXg7CisgICAgICAgIGJ1Zl9pbmZvLT5idWYgPSAmbXlfb2JqLT5idWZbaWR4XTsKKyAgICAgICAgYnVmX2luZm8tPmZyYW1lX2lkeCA9IHZiLnNlcXVlbmNlOworICAgICAgICBidWZfaW5mby0+c3RyZWFtX2lkID0gbXlfb2JqLT5teV9oZGw7CisKKyAgICAgICAgYnVmX2luZm8tPmJ1Zi0+c3RyZWFtX2lkID0gbXlfb2JqLT5teV9oZGw7CisgICAgICAgIGJ1Zl9pbmZvLT5idWYtPmJ1Zl9pZHggPSBpZHg7CisgICAgICAgIGJ1Zl9pbmZvLT5idWYtPmZyYW1lX2lkeCA9IHZiLnNlcXVlbmNlOworICAgICAgICBidWZfaW5mby0+YnVmLT50cy50dl9zZWMgID0gdmIudGltZXN0YW1wLnR2X3NlYzsKKyAgICAgICAgYnVmX2luZm8tPmJ1Zi0+dHMudHZfbnNlYyA9IHZiLnRpbWVzdGFtcC50dl91c2VjICogMTAwMDsKKyAgICAgICAgYnVmX2luZm8tPmJ1Zi0+ZmxhZ3MgPSB2Yi5mbGFnczsKKworICAgICAgICBMT0dIKCJWSURJT0NfRFFCVUYgYnVmX2luZGV4ICVkLCBmcmFtZV9pZHggJWQsIHN0cmVhbSB0eXBlICVkLCByYyAlZCwiCisgICAgICAgICAgICAgICAgInF1ZXVlZDogJWQsIGJ1Zl90eXBlID0gJWQgZmxhZ3MgPSAlZCIsCisgICAgICAgICAgICAgdmIuaW5kZXgsIGJ1Zl9pbmZvLT5idWYtPmZyYW1lX2lkeCwKKyAgICAgICAgICAgIG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlLCByYywKKyAgICAgICAgICAgIG15X29iai0+cXVldWVkX2J1ZmZlcl9jb3VudCwgYnVmX2luZm8tPmJ1Zi0+YnVmX3R5cGUsCisgICAgICAgICAgICBidWZfaW5mby0+YnVmLT5mbGFncyk7CisKKyAgICAgICAgYnVmX2luZm8tPmJ1Zi0+aXNfdXZfc3Vic2FtcGxlZCA9CisgICAgICAgICAgICAodmIucmVzZXJ2ZWQgPT0gVjRMMl9QSVhfRk1UX05WMTQgfHwgdmIucmVzZXJ2ZWQgPT0gVjRMMl9QSVhfRk1UX05WNDEpOworCisgICAgICAgIGlmKGJ1Zl9pbmZvLT5idWYtPmJ1Zl90eXBlID09IENBTV9TVFJFQU1fQlVGX1RZUEVfVVNFUlBUUikgeworICAgICAgICAgICAgbW1fc3RyZWFtX3JlYWRfdXNlcl9idWYobXlfb2JqLCBidWZfaW5mbyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIE5VTEwgIT0gbXlfb2JqLT5tZW1fdnRibC5jbGVhbl9pbnZhbGlkYXRlX2J1ZiApIHsKKyAgICAgICAgICAgIHJjID0gbXlfb2JqLT5tZW1fdnRibC5jbGVhbl9pbnZhbGlkYXRlX2J1ZihpZHgsCisgICAgICAgICAgICAgICAgbXlfb2JqLT5tZW1fdnRibC51c2VyX2RhdGEpOworICAgICAgICAgICAgaWYgKDAgPiByYykgeworICAgICAgICAgICAgICAgIExPR0UoIkNsZWFuIGludmFsaWRhdGUgY2FjaGUgZmFpbGVkIG9uIGJ1ZmZlciBpbmRleDogJWQiLAorICAgICAgICAgICAgICAgICAgICAgaWR4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIkNsZWFuIGludmFsaWRhdGUgY2FjaGUgb3Agbm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HRCgiWCByYyA9ICVkIixyYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9zZXRfcGFybXMKKyAqCisgKiBERVNDUklQVElPTjogc2V0IHBhcmFtZXRlcnMgcGVyIHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogc3RyZWFtIG9iamVjdAorICogICBAaW5fdmFsdWUgICAgIDogcHRyIHRvIGEgcGFyYW0gc3RydWN0IHRvIGJlIHNldCB0byBzZXJ2ZXIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKiBOT1RFICAgICAgIDogQXNzdW1lIHRoZSBwYXJtcyBzdHJ1Y3QgYnVmIGlzIGFscmVhZHkgbWFwcGVkIHRvIHNlcnZlciB2aWEKKyAqICAgICAgICAgICAgICBkb21haW4gc29ja2V0LiBDb3JyZXNwb25kaW5nIGZpZWxkcyBvZiBwYXJhbWV0ZXJzIHRvIGJlIHNldAorICogICAgICAgICAgICAgIGFyZSBhbHJlYWR5IGZpbGxlZCBpbiBieSB1cHBlciBsYXllciBjYWxsZXIuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX3NldF9wYXJtKG1tX3N0cmVhbV90ICpteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QgKmluX3ZhbHVlKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICBpbnQzMl90IHZhbHVlID0gMDsKKyAgICBpZiAoaW5fdmFsdWUgIT0gTlVMTCkgeworICAgICAgbW1fY2FtZXJhX29ial90ICpjYW1fb2JqID0gbXlfb2JqLT5jaF9vYmotPmNhbV9vYmo7CisgICAgICBpbnQgc3RyZWFtX2lkID0gbXlfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkOworICAgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zX2N0cmwoY2FtX29iaiwgc3RyZWFtX2lkLCBteV9vYmotPmZkLAorICAgICAgICAgICAgICBDQU1fUFJJVl9TVFJFQU1fUEFSTSwgJnZhbHVlKTsKKyAgICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHNldCBzdHJlYW0gcGFyYW1ldGVyIHR5cGUgPSAlZCIsIGluX3ZhbHVlLT50eXBlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9nZXRfcGFybXMKKyAqCisgKiBERVNDUklQVElPTjogZ2V0IHBhcmFtZXRlcnMgcGVyIHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogc3RyZWFtIG9iamVjdAorICogICBAaW5fdmFsdWUgICAgIDogcHRyIHRvIGEgcGFyYW0gc3RydWN0IHRvIGJlIGdldCBmcm9tIHNlcnZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqIE5PVEUgICAgICAgOiBBc3N1bWUgdGhlIHBhcm1zIHN0cnVjdCBidWYgaXMgYWxyZWFkeSBtYXBwZWQgdG8gc2VydmVyIHZpYQorICogICAgICAgICAgICAgIGRvbWFpbiBzb2NrZXQuIENvcnJlc3BvbmRpbmcgZmllbGRzIG9mIHBhcmFtZXRlcnMgdG8gYmUgZ2V0CisgKiAgICAgICAgICAgICAgYXJlIGFscmVhZHkgZmlsbGVkIGluIGJ5IHVwcGVyIGxheWVyIGNhbGxlci4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9zdHJlYW1fZ2V0X3Bhcm0obW1fc3RyZWFtX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fcGFybV9idWZmZXJfdCAqaW5fdmFsdWUpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIGludDMyX3QgdmFsdWUgPSAwOworICAgIGlmIChpbl92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIG1tX2NhbWVyYV9vYmpfdCAqY2FtX29iaiA9IG15X29iai0+Y2hfb2JqLT5jYW1fb2JqOworICAgICAgICBpbnQgc3RyZWFtX2lkID0gbXlfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkOworICAgICAgICByYyA9IG1tX2NhbWVyYV91dGlsX2dfY3RybChjYW1fb2JqLCBzdHJlYW1faWQsIG15X29iai0+ZmQsCisgICAgICAgICAgICAgIENBTV9QUklWX1NUUkVBTV9QQVJNLCAmdmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2RvX2FjdGlvbnMKKyAqCisgKiBERVNDUklQVElPTjogcmVxdWVzdCBzZXJ2ZXIgdG8gcGVyZm9ybSBzdHJlYW0gYmFzZWQgYWN0aW9ucworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogc3RyZWFtIG9iamVjdAorICogICBAaW5fdmFsdWUgICAgIDogcHRyIHRvIGEgc3RydWN0IG9mIGFjdGlvbnMgdG8gYmUgcGVyZm9ybWVkIGJ5IHRoZSBzZXJ2ZXIKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKiBOT1RFICAgICAgIDogQXNzdW1lIHRoZSBhY3Rpb24gc3RydWN0IGJ1ZiBpcyBhbHJlYWR5IG1hcHBlZCB0byBzZXJ2ZXIgdmlhCisgKiAgICAgICAgICAgICAgZG9tYWluIHNvY2tldC4gQ29ycmVzcG9uZGluZyBmaWVsZHMgb2YgYWN0aW9ucyB0byBiZSBwZXJmb3JtZWQKKyAqICAgICAgICAgICAgICBhcmUgYWxyZWFkeSBmaWxsZWQgaW4gYnkgdXBwZXIgbGF5ZXIgY2FsbGVyLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9kb19hY3Rpb24obW1fc3RyZWFtX3QgKm15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICppbl92YWx1ZSkKK3sKKyAgICBpbnQzMl90IHJjID0gLTE7CisgICAgaW50MzJfdCB2YWx1ZSA9IDA7CisgICAgaWYgKGluX3ZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgbW1fY2FtZXJhX29ial90ICpjYW1fb2JqID0gbXlfb2JqLT5jaF9vYmotPmNhbV9vYmo7CisgICAgICAgIGludCBzdHJlYW1faWQgPSBteV9vYmotPnNlcnZlcl9zdHJlYW1faWQ7CisgICAgICAgIHJjID0gbW1fY2FtZXJhX3V0aWxfc19jdHJsKGNhbV9vYmosIHN0cmVhbV9pZCwgbXlfb2JqLT5mZCwKKyAgICAgICAgICAgICAgQ0FNX1BSSVZfU1RSRUFNX1BBUk0sICZ2YWx1ZSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fc2V0X2V4dF9tb2RlCisgKgorICogREVTQ1JJUFRJT046IHNldCBzdHJlYW0gZXh0ZW5kZWQgbW9kZSB0byBzZXJ2ZXIgdmlhIHY0bDIgaW9jdGwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IHN0cmVhbSBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKiBOT1RFICAgICAgIDogU2VydmVyIHdpbGwgcmV0dXJuIGEgc2VydmVyIHN0cmVhbSBpZCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZ5CisgKiAgICAgICAgICAgICAgdGhpcyBzdHJlYW0gb24gc2VydmVyIHNpZGUuIExhdGVyIG9uIGNvbW11bmljYXRpb24gdG8gc2VydmVyCisgKiAgICAgICAgICAgICAgcGVyIHN0cmVhbSBzaG91bGQgdXNlIHRoaXMgc2VydmVyIHN0cmVhbSBpZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9zdHJlYW1fc2V0X2V4dF9tb2RlKG1tX3N0cmVhbV90ICogbXlfb2JqKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gc19wYXJtOworICAgIExPR0QoIkUsIG15X2hhbmRsZSA9IDB4JXgsIGZkID0gJWQsIHN0YXRlID0gJWQiLAorICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlKTsKKworICAgIG1lbXNldCgmc19wYXJtLCAwLCBzaXplb2Yoc19wYXJtKSk7CisgICAgc19wYXJtLnR5cGUgPSAgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKworICAgIHJjID0gaW9jdGwobXlfb2JqLT5mZCwgVklESU9DX1NfUEFSTSwgJnNfcGFybSk7CisgICAgTE9HRCgic3RyZWFtIGZkPSVkLCByYz0lZCwgZXh0ZW5kZWRfbW9kZT0lZCIsCisgICAgICAgICBteV9vYmotPmZkLCByYywgc19wYXJtLnBhcm0uY2FwdHVyZS5leHRlbmRlZG1vZGUpOworCisgICAgaWYgKHJjID09IDApIHsKKyAgICAgICAgbXlfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkID0gc19wYXJtLnBhcm0uY2FwdHVyZS5leHRlbmRlZG1vZGU7CisjaWZuZGVmIERBRU1PTl9QUkVTRU5UCisgICAgICAgIGNhbV9zaGltX3BhY2tldF90ICpzaGltX2NtZDsKKyAgICAgICAgY2FtX3NoaW1fY21kX2RhdGEgc2hpbV9jbWRfZGF0YTsKKyAgICAgICAgbW1fY2FtZXJhX29ial90ICpjYW1fb2JqID0gbXlfb2JqLT5jaF9vYmotPmNhbV9vYmo7CisKKyAgICAgICAgbWVtc2V0KCZzaGltX2NtZF9kYXRhLCAwLCBzaXplb2Yoc2hpbV9jbWRfZGF0YSkpOworICAgICAgICBzaGltX2NtZF9kYXRhLmNvbW1hbmQgPSBNU01fQ0FNRVJBX1BSSVZfTkVXX1NUUkVBTTsKKyAgICAgICAgc2hpbV9jbWRfZGF0YS5zdHJlYW1faWQgPSBteV9vYmotPnNlcnZlcl9zdHJlYW1faWQ7CisgICAgICAgIHNoaW1fY21kX2RhdGEudmFsdWUgPSBOVUxMOworICAgICAgICBzaGltX2NtZCA9IG1tX2NhbWVyYV9jcmVhdGVfc2hpbV9jbWRfcGFja2V0KENBTV9TSElNX1NFVF9QQVJNLAorICAgICAgICAgICAgICAgIGNhbV9vYmotPnNlc3Npb25pZCwgJnNoaW1fY21kX2RhdGEpOworICAgICAgICByYyA9IG1tX2NhbWVyYV9tb2R1bGVfc2VuZF9jbWQoc2hpbV9jbWQpOworICAgICAgICBtbV9jYW1lcmFfZGVzdHJveV9zaGltX2NtZF9wYWNrZXQoc2hpbV9jbWQpOworI2VuZGlmIC8qIERBRU1PTl9QUkVTRU5UICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiVklESU9DX1NfUEFSTSAgZXh0ZW5kZWRtb2RlIGVycm9yIik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fcWJ1ZgorICoKKyAqIERFU0NSSVBUSU9OOiBlbnF1ZXVlIGJ1ZmZlciBiYWNrIHRvIGtlcm5lbCBxdWV1ZSBmb3IgZnVydHVyZSB1c2UKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IHN0cmVhbSBvYmplY3QKKyAqICAgQGJ1ZiAgICAgICAgICA6IHB0ciB0byBhIHN0cnVjdCBzdG9yaW5nIGJ1ZmZlciBpbmZvcm1hdGlvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9zdHJlYW1fcWJ1ZihtbV9zdHJlYW1fdCAqbXlfb2JqLCBtbV9jYW1lcmFfYnVmX2RlZl90ICpidWYpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgdWludDMyX3QgbGVuZ3RoID0gMDsKKyAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmZmVyOworICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lc1tWSURFT19NQVhfUExBTkVTXTsKKyAgICBMT0dEKCJFLCBteV9oYW5kbGUgPSAweCV4LCBmZCA9ICVkLCBzdGF0ZSA9ICVkLCBzdHJlYW0gdHlwZSA9ICVkIiwKKyAgICAgICAgICBteV9vYmotPm15X2hkbCwgbXlfb2JqLT5mZCwgbXlfb2JqLT5zdGF0ZSwKKyAgICAgICAgIG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlKTsKKworICAgIGlmIChidWYtPmJ1Zl90eXBlID09IENBTV9TVFJFQU1fQlVGX1RZUEVfVVNFUlBUUikgeworICAgICAgICBMT0dEKCJVU0VSUFRSIG51bV9idWYgPSAlZCwgaWR4ID0gJWQiLAorICAgICAgICAgICAgICAgIGJ1Zi0+dXNlcl9idWYuYnVmc191c2VkLCBidWYtPmJ1Zl9pZHgpOworICAgICAgICBtZW1zZXQoJnBsYW5lcywgMCwgc2l6ZW9mKHBsYW5lcykpOworICAgICAgICBwbGFuZXNbMF0ubGVuZ3RoID0gbXlfb2JqLT5zdHJlYW1faW5mby0+dXNlcl9idWZfaW5mby5zaXplOworICAgICAgICBwbGFuZXNbMF0ubS51c2VycHRyID0gYnVmLT5mZDsKKyAgICAgICAgbGVuZ3RoID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkocGxhbmVzLCBidWYtPnBsYW5lc19idWYucGxhbmVzLCBzaXplb2YocGxhbmVzKSk7CisgICAgICAgIGxlbmd0aCA9IGJ1Zi0+cGxhbmVzX2J1Zi5udW1fcGxhbmVzOworICAgIH0KKworICAgIG1lbXNldCgmYnVmZmVyLCAwLCBzaXplb2YoYnVmZmVyKSk7CisgICAgYnVmZmVyLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworICAgIGJ1ZmZlci5tZW1vcnkgPSBWNEwyX01FTU9SWV9VU0VSUFRSOworICAgIGJ1ZmZlci5pbmRleCA9IChfX3UzMilidWYtPmJ1Zl9pZHg7CisgICAgYnVmZmVyLm0ucGxhbmVzID0gJnBsYW5lc1swXTsKKyAgICBidWZmZXIubGVuZ3RoID0gKF9fdTMyKWxlbmd0aDsKKworICAgIGlmICggTlVMTCAhPSBteV9vYmotPm1lbV92dGJsLmludmFsaWRhdGVfYnVmICkgeworICAgICAgICByYyA9IG15X29iai0+bWVtX3Z0YmwuaW52YWxpZGF0ZV9idWYoYnVmZmVyLmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfb2JqLT5tZW1fdnRibC51c2VyX2RhdGEpOworICAgICAgICBpZiAoIDAgPiByYyApIHsKKyAgICAgICAgICAgIExPR0UoIkNhY2hlIGludmFsaWRhdGUgZmFpbGVkIG9uIGJ1ZmZlciBpbmRleDogJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiQ2FjaGUgaW52YWxpZGF0ZSBvcCBub3QgYWRkZWQiKTsKKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+YnVmX2xvY2spOworICAgIG15X29iai0+cXVldWVkX2J1ZmZlcl9jb3VudCsrOworICAgIGlmICgxID09IG15X29iai0+cXVldWVkX2J1ZmZlcl9jb3VudCkgeworICAgICAgICAvKiBBZGQgZmQgdG8gZGF0YSBwb2xsIHRocmVhZCAqLworICAgICAgICBMT0dIKCJTdGFydGluZyBwb2xsIG9uIHN0cmVhbSAlcCB0eXBlOiAlZCIsCisgICAgICAgICAgICBteV9vYmosbXlfb2JqLT5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUpOworICAgICAgICByYyA9IG1tX2NhbWVyYV9wb2xsX3RocmVhZF9hZGRfcG9sbF9mZCgmbXlfb2JqLT5jaF9vYmotPnBvbGxfdGhyZWFkWzBdLAorICAgICAgICAgICAgbXlfb2JqLT5teV9oZGwsIG15X29iai0+ZmQsIG1tX3N0cmVhbV9kYXRhX25vdGlmeSwgKHZvaWQqKW15X29iaiwKKyAgICAgICAgICAgIG1tX2NhbWVyYV9hc3luY19jYWxsKTsKKyAgICAgICAgaWYgKDAgPiByYykgeworICAgICAgICAgICAgTE9HRSgiQWRkIHBvbGwgb24gc3RyZWFtICVwIHR5cGU6ICVkIGZkIGVycm9yIChyYz0lZCkiLAorICAgICAgICAgICAgICAgICBteV9vYmosIG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlLCByYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dIKCJTdGFydGVkIHBvbGwgb24gc3RyZWFtICVwIHR5cGU6ICVkIiwKKyAgICAgICAgICAgICAgICBteV9vYmosIG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5idWZfbG9jayk7CisKKyAgICByYyA9IGlvY3RsKG15X29iai0+ZmQsIFZJRElPQ19RQlVGLCAmYnVmZmVyKTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+YnVmX2xvY2spOworICAgIGlmICgwID4gcmMpIHsKKyAgICAgICAgTE9HRSgiVklESU9DX1FCVUYgaW9jdGwgY2FsbCBmYWlsZWQgb24gc3RyZWFtIHR5cGUgJWQgKHJjPSVkKTogJXMiLAorICAgICAgICAgICAgIG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlLCByYywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgbXlfb2JqLT5xdWV1ZWRfYnVmZmVyX2NvdW50LS07CisgICAgICAgIGlmICgwID09IG15X29iai0+cXVldWVkX2J1ZmZlcl9jb3VudCkgeworICAgICAgICAgICAgLyogUmVtb3ZlIGZkIGZyb20gZGF0YSBwb2xsIGluIGNhc2Ugb2YgZmFpbGluZworICAgICAgICAgICAgICogZmlyc3QgYnVmZmVyIHF1ZXVpbmcgYXR0ZW1wdCAqLworICAgICAgICAgICAgTE9HSCgiU3RvcGluZyBwb2xsIG9uIHN0cmVhbSAlcCB0eXBlOiAlZCIsCisgICAgICAgICAgICAgICAgbXlfb2JqLCBteV9vYmotPnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSk7CisgICAgICAgICAgICBtbV9jYW1lcmFfcG9sbF90aHJlYWRfZGVsX3BvbGxfZmQoJm15X29iai0+Y2hfb2JqLT5wb2xsX3RocmVhZFswXSwKKyAgICAgICAgICAgICAgICBteV9vYmotPm15X2hkbCwgbW1fY2FtZXJhX2FzeW5jX2NhbGwpOworICAgICAgICAgICAgTE9HSCgiU3RvcHBlZCBwb2xsIG9uIHN0cmVhbSAlcCB0eXBlOiAlZCIsCisgICAgICAgICAgICAgICAgbXlfb2JqLCBteV9vYmotPnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dIKCJWSURJT0NfUUJVRiBidWZfaW5kZXggJWQsIGZyYW1lX2lkeCAlZCBzdHJlYW0gdHlwZSAlZCwgcmMgJWQsIgorICAgICAgICAgICAgICAgICIgcXVldWVkOiAlZCwgYnVmX3R5cGUgPSAlZCIsCisgICAgICAgICAgICAgICAgIGJ1ZmZlci5pbmRleCwgYnVmLT5mcmFtZV9pZHgsIG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlLCByYywKKyAgICAgICAgICAgICAgICBteV9vYmotPnF1ZXVlZF9idWZmZXJfY291bnQsIGJ1Zi0+YnVmX3R5cGUpOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5idWZfbG9jayk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX3JlcXVlc3RfYnVmCisgKgorICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gbGV0IGtlcm5lbCBrbm93IHRoZSBhbW91bnQgb2YgYnVmZmVycyBuZWVkIHRvCisgKiAgICAgICAgICAgICAgYmUgcmVnaXN0ZXJlZCB2aWEgdjRsMiBpb2N0bC4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IHN0cmVhbSBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX3JlcXVlc3RfYnVmKG1tX3N0cmVhbV90ICogbXlfb2JqKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIGJ1ZnJlcTsKKyAgICB1aW50OF90IGJ1Zl9udW0gPSBteV9vYmotPmJ1Zl9udW07CisgICAgTE9HRCgiRSwgbXlfaGFuZGxlID0gMHgleCwgZmQgPSAlZCwgc3RhdGUgPSAlZCIsCisgICAgICAgICAgbXlfb2JqLT5teV9oZGwsIG15X29iai0+ZmQsIG15X29iai0+c3RhdGUpOworCisgICAgTE9HRCgiYnVmX251bSA9ICVkLCBzdHJlYW0gdHlwZSA9ICVkIiwKKyAgICAgICAgICBidWZfbnVtLCBteV9vYmotPnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSk7CisKKyAgICBpZihidWZfbnVtID4gTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTKSB7CisgICAgICAgIExPR0UoImJ1ZiBudW0gJWQgPiBtYXggbGltaXQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9udW0sIE1NX0NBTUVSQV9NQVhfTlVNX0ZSQU1FUyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZW1zZXQoJmJ1ZnJlcSwgMCwgc2l6ZW9mKGJ1ZnJlcSkpOworICAgIGJ1ZnJlcS5jb3VudCA9IGJ1Zl9udW07CisgICAgYnVmcmVxLnR5cGUgID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICBidWZyZXEubWVtb3J5ID0gVjRMMl9NRU1PUllfVVNFUlBUUjsKKyAgICByYyA9IGlvY3RsKG15X29iai0+ZmQsIFZJRElPQ19SRVFCVUZTLCAmYnVmcmVxKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICBMT0dFKCJmZD0lZCwgaW9jdGwgVklESU9DX1JFUUJVRlMgZmFpbGVkOiByYz0lZCwgZXJybm8gJWQiLAorICAgICAgICAgICAgbXlfb2JqLT5mZCwgcmMsIGVycm5vKTsKKyAgICB9CisKKyAgICBMT0dEKCJYIHJjID0gJWQiLHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX25lZWRfd2FpdF9mb3JfbWFwcGluZworICoKKyAqIERFU0NSSVBUSU9OOiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIHdhaXQgZm9yIG1hcHBpbmcKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IHN0cmVhbSBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50OF90IHdoZXRoZXIgd2FpdCBpcyBuZWNlc3NhcnkKKyAqICAgICAgICAgICAgICAwICAtLSBubyB3YWl0CisgKiAgICAgICAgICAgICAgMSAtLSB3YWl0CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDhfdCBtbV9zdHJlYW1fbmVlZF93YWl0X2Zvcl9tYXBwaW5nKG1tX3N0cmVhbV90ICogbXlfb2JqKQoreworICAgIHVpbnQzMl90IGk7CisgICAgaW50OF90IHJldCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbXlfb2JqLT5idWZfbnVtOyBpKyspIHsKKyAgICAgICAgaWYgKChteV9vYmotPmJ1Zl9zdGF0dXNbaV0ubWFwX3N0YXR1cyA9PSAwKQorICAgICAgICAgICAgICAgICYmIChteV9vYmotPmJ1Zl9zdGF0dXNbaV0uaW5fa2VybmVsKSkgeworICAgICAgICAgICAgLypkbyBub3Qgc2lnbmFsIGluIGNhc2UgaWYgYW55IGJ1ZmZlciBpcyBub3QgbWFwcGVkCisgICAgICAgICAgICAgIGJ1dCBxdWV1ZWQgdG8ga2VybmVsLiovCisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICB9IGVsc2UgaWYgKG15X29iai0+YnVmX3N0YXR1c1tpXS5tYXBfc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9tYXBfYnVmCisgKgorICogREVTQ1JJUFRJT046IG1hcHBpbmcgc3RyZWFtIGJ1ZmZlciB2aWEgZG9tYWluIHNvY2tldCB0byBzZXJ2ZXIKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IHN0cmVhbSBvYmplY3QKKyAqICAgQGJ1Zl90eXBlICAgICA6IHR5cGUgb2YgYnVmZmVyIHRvIGJlIG1hcHBlZC4gY291bGQgYmUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9JTkZPCisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX0lOUFVUX0JVRgorICogICBAZnJhbWVfaWR4ICAgIDogaW5kZXggb2YgYnVmZmVyIHdpdGhpbiB0aGUgc3RyZWFtIGJ1ZmZlcnMsIG9ubHkgdmFsaWQgaWYKKyAqICAgICAgICAgICAgICAgICAgIGJ1Zl90eXBlIGlzIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYgb3IKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfSU5QVVRfQlVGCisgKiAgIEBwbGFuZV9pZHggICAgOiBwbGFuZSBpbmRleC4gSWYgYWxsIHBsYW5lcyBzaGFyZSB0aGUgc2FtZSBmZCwKKyAqICAgICAgICAgICAgICAgICAgIHBsYW5lX2lkeCA9IC0xOyBvdGhlcndpc2UsIHBsZWFuX2lkeCBpcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgIGluZGV4IHRvIHBsYW5lICgwLi5udW1fb2ZfcGxhbmVzKQorICogICBAZmQgICAgICAgICAgIDogZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBidWZmZXIKKyAqICAgQHNpemUgICAgICAgICA6IHNpemUgb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9zdHJlYW1fbWFwX2J1ZihtbV9zdHJlYW1fdCAqIG15X29iaiwKKyAgICAgICAgdWludDhfdCBidWZfdHlwZSwgdWludDMyX3QgZnJhbWVfaWR4LAorICAgICAgICBpbnQzMl90IHBsYW5lX2lkeCwgaW50MzJfdCBmZCwKKyAgICAgICAgc2l6ZV90IHNpemUsIHZvaWQgKmJ1ZmZlcikKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBpZiAoTlVMTCA9PSBteV9vYmogfHwgTlVMTCA9PSBteV9vYmotPmNoX29iaiB8fCBOVUxMID09IG15X29iai0+Y2hfb2JqLT5jYW1fb2JqKSB7CisgICAgICAgIExPR0UoIk5VTEwgb2JqIG9mIHN0cmVhbS9jaGFubmVsL2NhbWVyYSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY2FtX3NvY2tfcGFja2V0X3QgcGFja2V0OworICAgIG1lbXNldCgmcGFja2V0LCAwLCBzaXplb2YoY2FtX3NvY2tfcGFja2V0X3QpKTsKKyAgICBwYWNrZXQubXNnX3R5cGUgPSBDQU1fTUFQUElOR19UWVBFX0ZEX01BUFBJTkc7CisgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcC50eXBlID0gYnVmX3R5cGU7CisgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcC5mZCA9IGZkOworICAgIHBhY2tldC5wYXlsb2FkLmJ1Zl9tYXAuc2l6ZSA9IHNpemU7CisgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcC5zdHJlYW1faWQgPSBteV9vYmotPnNlcnZlcl9zdHJlYW1faWQ7CisgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcC5mcmFtZV9pZHggPSBmcmFtZV9pZHg7CisgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcC5wbGFuZV9pZHggPSBwbGFuZV9pZHg7CisgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcC5idWZmZXIgPSBidWZmZXI7CisgICAgTE9HRCgibWFwcGluZyBidWZfdHlwZSAlZCwgc3RyZWFtX2lkICVkLCBmcmFtZV9pZHggJWQsIGZkICVkLCBzaXplICVkIiwKKyAgICAgICAgICAgICBidWZfdHlwZSwgbXlfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkLCBmcmFtZV9pZHgsIGZkLCBzaXplKTsKKworI2lmZGVmIERBRU1PTl9QUkVTRU5UCisgICAgcmMgPSBtbV9jYW1lcmFfdXRpbF9zZW5kbXNnKG15X29iai0+Y2hfb2JqLT5jYW1fb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFja2V0LCBzaXplb2YoY2FtX3NvY2tfcGFja2V0X3QpLCBmZCk7CisjZWxzZQorICAgIGNhbV9zaGltX3BhY2tldF90ICpzaGltX2NtZDsKKyAgICBzaGltX2NtZCA9IG1tX2NhbWVyYV9jcmVhdGVfc2hpbV9jbWRfcGFja2V0KENBTV9TSElNX1JFR19CVUYsCisgICAgICAgICAgICBteV9vYmotPmNoX29iai0+Y2FtX29iai0+c2Vzc2lvbmlkLCAmcGFja2V0KTsKKyAgICByYyA9IG1tX2NhbWVyYV9tb2R1bGVfc2VuZF9jbWQoc2hpbV9jbWQpOworICAgIG1tX2NhbWVyYV9kZXN0cm95X3NoaW1fY21kX3BhY2tldChzaGltX2NtZCk7CisjZW5kaWYKKyAgICBpZiAoKGJ1Zl90eXBlID09IENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYpCisgICAgICAgICAgICB8fCAoKGJ1Zl90eXBlCisgICAgICAgICAgICA9PSBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fVVNFUl9CVUYpCisgICAgICAgICAgICAmJiAobXlfb2JqLT5zdHJlYW1faW5mbyAhPSBOVUxMKQorICAgICAgICAgICAgJiYgKG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbWluZ19tb2RlCisgICAgICAgICAgICA9PSBDQU1fU1RSRUFNSU5HX01PREVfQkFUQ0gpKSkgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+YnVmX2xvY2spOworICAgICAgICBpZiAocmMgPCAwKSB7CisgICAgICAgICAgICBteV9vYmotPmJ1Zl9zdGF0dXNbZnJhbWVfaWR4XS5tYXBfc3RhdHVzID0gLTE7CisgICAgICAgICAgICBMT0dFKCJmYWlsIHN0YXR1cyA9JWQiLCBteV9vYmotPmJ1Zl9zdGF0dXNbZnJhbWVfaWR4XS5tYXBfc3RhdHVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tmcmFtZV9pZHhdLm1hcF9zdGF0dXMgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChtbV9zdHJlYW1fbmVlZF93YWl0X2Zvcl9tYXBwaW5nKG15X29iaikgPT0gMCkgeworICAgICAgICAgICAgTE9HRCgiQnVmZmVyIG1hcHBpbmcgRG9uZTogU2lnbmFsIHN0cm0gZmQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICBteV9vYmotPmZkKTsKKyAgICAgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJm15X29iai0+YnVmX2NvbmQpOworICAgICAgICB9CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9tYXBfYnVmcworICoKKyAqIERFU0NSSVBUSU9OOiBtYXBwaW5nIHN0cmVhbSBidWZmZXJzIHZpYSBkb21haW4gc29ja2V0IHRvIHNlcnZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICAgICAgIDogc3RyZWFtIG9iamVjdAorICogICBAYnVmX21hcF9saXN0IDogbGlzdCBvZiBidWZmZXIgb2JqZWN0cyB0byBtYXAKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworaW50MzJfdCBtbV9zdHJlYW1fbWFwX2J1ZnMobW1fc3RyZWFtX3QgKiBteV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1fYnVmX21hcF90eXBlX2xpc3QgKmJ1Zl9tYXBfbGlzdCkKK3sKKyAgICBpZiAoTlVMTCA9PSBteV9vYmogfHwgTlVMTCA9PSBteV9vYmotPmNoX29iaiB8fCBOVUxMID09IG15X29iai0+Y2hfb2JqLT5jYW1fb2JqKSB7CisgICAgICAgIExPR0UoIk5VTEwgb2JqIG9mIHN0cmVhbS9jaGFubmVsL2NhbWVyYSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY2FtX3NvY2tfcGFja2V0X3QgcGFja2V0OworICAgIG1lbXNldCgmcGFja2V0LCAwLCBzaXplb2YoY2FtX3NvY2tfcGFja2V0X3QpKTsKKyAgICBwYWNrZXQubXNnX3R5cGUgPSBDQU1fTUFQUElOR19UWVBFX0ZEX0JVTkRMRURfTUFQUElORzsKKworICAgIG1lbWNweSgmcGFja2V0LnBheWxvYWQuYnVmX21hcF9saXN0LCBidWZfbWFwX2xpc3QsCisgICAgICAgICAgIHNpemVvZihwYWNrZXQucGF5bG9hZC5idWZfbWFwX2xpc3QpKTsKKworICAgIGludCBzZW5kZmRzW0NBTV9NQVhfTlVNX0JVRlNfUEVSX1NUUkVBTV07CisgICAgdWludDMyX3QgbnVtYnVmcyA9IHBhY2tldC5wYXlsb2FkLmJ1Zl9tYXBfbGlzdC5sZW5ndGg7CisgICAgaWYgKG51bWJ1ZnMgPCAxKSB7CisgICAgICBMT0dEKCJObyBidWZmZXJzLCBzdXBwcmVzc2luZyB0aGUgbWFwcGluZyBjb21tYW5kIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1idWZzOyBpKyspIHsKKyAgICAgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcF9saXN0LmJ1Zl9tYXBzW2ldLnN0cmVhbV9pZCA9IG15X29iai0+c2VydmVyX3N0cmVhbV9pZDsKKyAgICAgICAgc2VuZGZkc1tpXSA9IHBhY2tldC5wYXlsb2FkLmJ1Zl9tYXBfbGlzdC5idWZfbWFwc1tpXS5mZDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSBudW1idWZzOyBpIDwgQ0FNX01BWF9OVU1fQlVGU19QRVJfU1RSRUFNOyBpKyspIHsKKyAgICAgICAgcGFja2V0LnBheWxvYWQuYnVmX21hcF9saXN0LmJ1Zl9tYXBzW2ldLmZkID0gLTE7CisgICAgICAgIHNlbmRmZHNbaV0gPSAtMTsKKyAgICB9CisKKyNpZmRlZiBEQUVNT05fUFJFU0VOVAorICAgIGludDMyX3QgcmV0ID0gbW1fY2FtZXJhX3V0aWxfYnVuZGxlZF9zZW5kbXNnKG15X29iai0+Y2hfb2JqLT5jYW1fb2JqLAorICAgICAgICAgICAgJnBhY2tldCwgc2l6ZW9mKGNhbV9zb2NrX3BhY2tldF90KSwgc2VuZGZkcywgbnVtYnVmcyk7CisjZWxzZQorICAgIGNhbV9zaGltX3BhY2tldF90ICpzaGltX2NtZDsKKyAgICBzaGltX2NtZCA9IG1tX2NhbWVyYV9jcmVhdGVfc2hpbV9jbWRfcGFja2V0KENBTV9TSElNX1JFR19CVUYsCisgICAgICAgICAgICBteV9vYmotPmNoX29iai0+Y2FtX29iai0+c2Vzc2lvbmlkLCAmcGFja2V0KTsKKyAgICBpbnQzMl90IHJldCA9IG1tX2NhbWVyYV9tb2R1bGVfc2VuZF9jbWQoc2hpbV9jbWQpOworICAgIG1tX2NhbWVyYV9kZXN0cm95X3NoaW1fY21kX3BhY2tldChzaGltX2NtZCk7CisjZW5kaWYKKyAgICBpZiAoKG51bWJ1ZnMgPiAwKSAmJiAoKGJ1Zl9tYXBfbGlzdC0+YnVmX21hcHNbMF0udHlwZQorICAgICAgICAgICAgPT0gQ0FNX01BUFBJTkdfQlVGX1RZUEVfU1RSRUFNX0JVRikKKyAgICAgICAgICAgIHx8ICgoYnVmX21hcF9saXN0LT5idWZfbWFwc1swXS50eXBlID09CisgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fVVNFUl9CVUYpCisgICAgICAgICAgICAmJiAobXlfb2JqLT5zdHJlYW1faW5mbyAhPSBOVUxMKQorICAgICAgICAgICAgJiYgKG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbWluZ19tb2RlCisgICAgICAgICAgICA9PSBDQU1fU1RSRUFNSU5HX01PREVfQkFUQ0gpKSkpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bWJ1ZnM7IGkrKykgeworICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgbXlfb2JqLT5idWZfc3RhdHVzW2ldLm1hcF9zdGF0dXMgPSAtMTsKKyAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tpXS5tYXBfc3RhdHVzID0gMTsKKyAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1tX3N0cmVhbV9uZWVkX3dhaXRfZm9yX21hcHBpbmcobXlfb2JqKSA9PSAwKSB7CisgICAgICAgICAgICBMT0dEKCJCdWZmZXIgbWFwcGluZyBEb25lOiBTaWduYWwgc3RybSBmZCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIG15X29iai0+ZmQpOworICAgICAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmbXlfb2JqLT5idWZfY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+YnVmX2xvY2spOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV91bm1hcF9idWYKKyAqCisgKiBERVNDUklQVElPTjogdW5tYXBwaW5nIHN0cmVhbSBidWZmZXIgdmlhIGRvbWFpbiBzb2NrZXQgdG8gc2VydmVyCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogICAgICAgOiBzdHJlYW0gb2JqZWN0CisgKiAgIEBidWZfdHlwZSAgICAgOiB0eXBlIG9mIGJ1ZmZlciB0byBiZSB1bm1hcHBlZC4gY291bGQgYmUgZm9sbG93aW5nIHZhbHVlczoKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9JTkZPCisgKiAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9PRkZMSU5FX0lOUFVUX0JVRgorICogICBAZnJhbWVfaWR4ICAgIDogaW5kZXggb2YgYnVmZmVyIHdpdGhpbiB0aGUgc3RyZWFtIGJ1ZmZlcnMsIG9ubHkgdmFsaWQgaWYKKyAqICAgICAgICAgICAgICAgICAgIGJ1Zl90eXBlIGlzIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYgb3IKKyAqICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX09GRkxJTkVfSU5QVVRfQlVGCisgKiAgIEBwbGFuZV9pZHggICAgOiBwbGFuZSBpbmRleC4gSWYgYWxsIHBsYW5lcyBzaGFyZSB0aGUgc2FtZSBmZCwKKyAqICAgICAgICAgICAgICAgICAgIHBsYW5lX2lkeCA9IC0xOyBvdGhlcndpc2UsIHBsZWFuX2lkeCBpcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgIGluZGV4IHRvIHBsYW5lICgwLi5udW1fb2ZfcGxhbmVzKQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9zdHJlYW1fdW5tYXBfYnVmKG1tX3N0cmVhbV90ICogbXlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhbWVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVfaWR4KQoreworICAgIGludDMyX3QgcmV0OworICAgIGlmIChOVUxMID09IG15X29iaiB8fCBOVUxMID09IG15X29iai0+Y2hfb2JqIHx8IE5VTEwgPT0gbXlfb2JqLT5jaF9vYmotPmNhbV9vYmopIHsKKyAgICAgICAgTE9HRSgiTlVMTCBvYmogb2Ygc3RyZWFtL2NoYW5uZWwvY2FtZXJhIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgY2FtX3NvY2tfcGFja2V0X3QgcGFja2V0OworICAgIG1lbXNldCgmcGFja2V0LCAwLCBzaXplb2YoY2FtX3NvY2tfcGFja2V0X3QpKTsKKyAgICBwYWNrZXQubXNnX3R5cGUgPSBDQU1fTUFQUElOR19UWVBFX0ZEX1VOTUFQUElORzsKKyAgICBwYWNrZXQucGF5bG9hZC5idWZfdW5tYXAudHlwZSA9IGJ1Zl90eXBlOworICAgIHBhY2tldC5wYXlsb2FkLmJ1Zl91bm1hcC5zdHJlYW1faWQgPSBteV9vYmotPnNlcnZlcl9zdHJlYW1faWQ7CisgICAgcGFja2V0LnBheWxvYWQuYnVmX3VubWFwLmZyYW1lX2lkeCA9IGZyYW1lX2lkeDsKKyAgICBwYWNrZXQucGF5bG9hZC5idWZfdW5tYXAucGxhbmVfaWR4ID0gcGxhbmVfaWR4OworI2lmZGVmIERBRU1PTl9QUkVTRU5UCisgICAgcmV0ID0gbW1fY2FtZXJhX3V0aWxfc2VuZG1zZyhteV9vYmotPmNoX29iai0+Y2FtX29iaiwKKyAgICAgICAgICAgICZwYWNrZXQsIHNpemVvZihjYW1fc29ja19wYWNrZXRfdCksIC0xKTsKKyNlbHNlCisgICAgY2FtX3NoaW1fcGFja2V0X3QgKnNoaW1fY21kOworICAgIHNoaW1fY21kID0gbW1fY2FtZXJhX2NyZWF0ZV9zaGltX2NtZF9wYWNrZXQoQ0FNX1NISU1fUkVHX0JVRiwKKyAgICAgICAgICAgIG15X29iai0+Y2hfb2JqLT5jYW1fb2JqLT5zZXNzaW9uaWQsICZwYWNrZXQpOworICAgIHJldCA9IG1tX2NhbWVyYV9tb2R1bGVfc2VuZF9jbWQoc2hpbV9jbWQpOworICAgIG1tX2NhbWVyYV9kZXN0cm95X3NoaW1fY21kX3BhY2tldChzaGltX2NtZCk7CisjZW5kaWYKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+YnVmX2xvY2spOworICAgIG15X29iai0+YnVmX3N0YXR1c1tmcmFtZV9pZHhdLm1hcF9zdGF0dXMgPSAwOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9pbml0X2J1ZnMKKyAqCisgKiBERVNDUklQVElPTjogaW5pdGlhbGl6ZSBzdHJlYW0gYnVmZmVycyBuZWVkZWQuIFRoaXMgZnVuY3Rpb24gd2lsbCByZXF1ZXN0CisgKiAgICAgICAgICAgICAgYnVmZmVycyBuZWVkZWQgZnJvbSB1cHBlciBsYXllciB0aHJvdWdoIHRoZSBtZW0gb3BzIHRhYmxlIHBhc3NlZAorICogICAgICAgICAgICAgIGR1cmluZyBjb25maWd1cmF0aW9uIHN0YWdlLgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICA6IHN0cmVhbSBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX2luaXRfYnVmcyhtbV9zdHJlYW1fdCAqIG15X29iaikKK3sKKyAgICBpbnQzMl90IGksIHJjID0gMDsKKyAgICB1aW50OF90ICpyZWdfZmxhZ3MgPSBOVUxMOworICAgIExPR0QoIkUsIG15X2hhbmRsZSA9IDB4JXgsIGZkID0gJWQsIHN0YXRlID0gJWQiLAorICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlKTsKKworICAgIC8qIGRlaW5pdCBidWYgaWYgaXQncyBub3QgTlVMTCovCisgICAgaWYgKE5VTEwgIT0gbXlfb2JqLT5idWYpIHsKKyAgICAgICAgbW1fc3RyZWFtX2RlaW5pdF9idWZzKG15X29iaik7CisgICAgfQorCisgICAgcmMgPSBteV9vYmotPm1lbV92dGJsLmdldF9idWZzKCZteV9vYmotPmZyYW1lX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm15X29iai0+YnVmX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ19mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm15X29iai0+YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXlfb2JqLT5tYXBfb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9vYmotPm1lbV92dGJsLnVzZXJfZGF0YSk7CisKKyAgICBpZiAoMCAhPSByYykgeworICAgICAgICBMT0dFKCJFcnJvciBnZXQgYnVmLCByYyA9ICVkXG4iLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbXlfb2JqLT5idWZfbnVtOyBpKyspIHsKKyAgICAgICAgbXlfb2JqLT5idWZfc3RhdHVzW2ldLmluaXRpYWxfcmVnX2ZsYWcgPSByZWdfZmxhZ3NbaV07CisgICAgICAgIG15X29iai0+YnVmW2ldLnN0cmVhbV9pZCA9IG15X29iai0+bXlfaGRsOworICAgICAgICBteV9vYmotPmJ1ZltpXS5zdHJlYW1fdHlwZSA9IG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlOworCisgICAgICAgIGlmIChteV9vYmotPmJ1ZltpXS5idWZfdHlwZSA9PSBDQU1fU1RSRUFNX0JVRl9UWVBFX1VTRVJQVFIpIHsKKyAgICAgICAgICAgIG15X29iai0+YnVmW2ldLnVzZXJfYnVmLmJ1ZnNfdXNlZCA9CisgICAgICAgICAgICAgICAgICAgIChpbnQ4X3QpbXlfb2JqLT5zdHJlYW1faW5mby0+dXNlcl9idWZfaW5mby5mcmFtZV9idWZfY250OworICAgICAgICAgICAgbXlfb2JqLT5idWZbaV0udXNlcl9idWYuYnVmX2luX3VzZSA9IHJlZ19mbGFnc1tpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChteV9vYmotPnN0cmVhbV9pbmZvLT5zdHJlYW1pbmdfbW9kZSA9PSBDQU1fU1RSRUFNSU5HX01PREVfQkFUQ0gpIHsKKyAgICAgICAgbXlfb2JqLT5wbGFuZV9idWYgPSBteV9vYmotPmJ1ZlswXS51c2VyX2J1Zi5wbGFuZV9idWY7CisgICAgICAgIGlmIChteV9vYmotPnBsYW5lX2J1ZiAhPSBOVUxMKSB7CisgICAgICAgICAgICBteV9vYmotPnBsYW5lX2J1Zl9udW0gPQorICAgICAgICAgICAgICAgICAgICBteV9vYmotPmJ1Zl9udW0gKgorICAgICAgICAgICAgICAgICAgICBteV9vYmotPnN0cmVhbV9pbmZvLT51c2VyX2J1Zl9pbmZvLmZyYW1lX2J1Zl9jbnQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXlfb2JqLT5wbGFuZV9idWZfbnVtOyBpKyspIHsKKyAgICAgICAgICAgICAgICBteV9vYmotPnBsYW5lX2J1ZltpXS5zdHJlYW1faWQgPSBteV9vYmotPm15X2hkbDsKKyAgICAgICAgICAgICAgICBteV9vYmotPnBsYW5lX2J1ZltpXS5zdHJlYW1fdHlwZSA9IG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG15X29iai0+Y3VyX2J1ZnNfc3RhZ2VkID0gMDsKKyAgICAgICAgbXlfb2JqLT5jdXJfYnVmX2lkeCA9IC0xOworICAgIH0KKworICAgIGZyZWUocmVnX2ZsYWdzKTsKKyAgICByZWdfZmxhZ3MgPSBOVUxMOworCisgICAgLyogdXBkYXRlIGluIHN0cmVhbSBpbmZvIGFib3V0IG51bWJlciBvZiBzdHJlYW0gYnVmZmVycyAqLworICAgIG15X29iai0+c3RyZWFtX2luZm8tPm51bV9idWZzID0gbXlfb2JqLT5idWZfbnVtOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9kZWluaXRfYnVmcworICoKKyAqIERFU0NSSVBUSU9OOiByZXR1cm4gc3RyZWFtIGJ1ZmZlcnMgdG8gdXBwZXIgbGF5ZXIgdGhyb3VnaCB0aGUgbWVtIG9wcyB0YWJsZQorICogICAgICAgICAgICAgIHBhc3NlZCBkdXJpbmcgY29uZmlndXJhdGlvbiBzdGFnZS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgOiBzdHJlYW0gb2JqZWN0CisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9kZWluaXRfYnVmcyhtbV9zdHJlYW1fdCAqIG15X29iaikKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKworICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90IG9wc190Ymw7CisgICAgTE9HRCgiRSwgbXlfaGFuZGxlID0gMHgleCwgZmQgPSAlZCwgc3RhdGUgPSAlZCIsCisgICAgICAgICAgbXlfb2JqLT5teV9oZGwsIG15X29iai0+ZmQsIG15X29iai0+c3RhdGUpOworCisgICAgaWYgKE5VTEwgPT0gbXlfb2JqLT5idWYpIHsKKyAgICAgICAgTE9HRCgiQnVmIGlzIE5VTEwsIG5vIG5lZWQgdG8gZGVpbml0Iik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiByZWxlYXNlIGJ1ZnMgKi8KKyAgICBvcHNfdGJsLm1hcF9vcHMgPSBtbV9zdHJlYW1fbWFwX2J1Zl9vcHM7CisgICAgb3BzX3RibC5idW5kbGVkX21hcF9vcHMgPSBtbV9zdHJlYW1fYnVuZGxlZF9tYXBfYnVmX29wczsKKyAgICBvcHNfdGJsLnVubWFwX29wcyA9IG1tX3N0cmVhbV91bm1hcF9idWZfb3BzOworICAgIG9wc190YmwudXNlcmRhdGEgPSBteV9vYmo7CisKKyAgICByYyA9IG15X29iai0+bWVtX3Z0YmwucHV0X2J1ZnMoJm9wc190YmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X29iai0+bWVtX3Z0YmwudXNlcl9kYXRhKTsKKworICAgIGlmIChteV9vYmotPnBsYW5lX2J1ZiAhPSBOVUxMKSB7CisgICAgICAgIGZyZWUobXlfb2JqLT5wbGFuZV9idWYpOworICAgICAgICBteV9vYmotPnBsYW5lX2J1ZiA9IE5VTEw7CisgICAgfQorCisgICAgZnJlZShteV9vYmotPmJ1Zik7CisgICAgbXlfb2JqLT5idWYgPSBOVUxMOworCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9yZWdfYnVmCisgKgorICogREVTQ1JJUFRJT046IHJlZ2lzdGVyIGJ1ZmZlcnMgd2l0aCBrZXJuZWwgYnkgY2FsbGluZyB2NGwyIGlvY3RsIFFCVUYgZm9yCisgKiAgICAgICAgICAgICAgZWFjaCBidWZmZXIgaW4gdGhlIHN0cmVhbQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICA6IHN0cmVhbSBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX3JlZ19idWYobW1fc3RyZWFtX3QgKiBteV9vYmopCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgdWludDhfdCBpOworICAgIExPR0QoIkUsIG15X2hhbmRsZSA9IDB4JXgsIGZkID0gJWQsIHN0YXRlID0gJWQiLAorICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlKTsKKworICAgIHJjID0gbW1fc3RyZWFtX3JlcXVlc3RfYnVmKG15X29iaik7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIG15X29iai0+cXVldWVkX2J1ZmZlcl9jb3VudCA9IDA7CisgICAgZm9yKGkgPSAwOyBpIDwgbXlfb2JqLT5idWZfbnVtOyBpKyspeworICAgICAgICAvKiBjaGVjayBpZiBuZWVkIHRvIHFidWYgaW5pdGlhbGx5ICovCisgICAgICAgIGlmIChteV9vYmotPmJ1Zl9zdGF0dXNbaV0uaW5pdGlhbF9yZWdfZmxhZykgeworICAgICAgICAgICAgcmMgPSBtbV9zdHJlYW1fcWJ1ZihteV9vYmosICZteV9vYmotPmJ1ZltpXSk7CisgICAgICAgICAgICBpZiAocmMgIT0gMCkgeworICAgICAgICAgICAgICAgIExPR0UoIlZJRElPQ19RQlVGIHJjID0gJWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tpXS5idWZfcmVmY250ID0gMDsKKyAgICAgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tpXS5pbl9rZXJuZWwgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogdGhlIGJ1ZiBpcyBoZWxkIGJ5IHVwcGVyIGxheWVyLCB3aWxsIG5vdCBxdWV1ZSBpbnRvIGtlcm5lbC4KKyAgICAgICAgICAgICAqIGFkZCBidWYgcmVmZXJlbmNlIGNvdW50ICovCisgICAgICAgICAgICBteV9vYmotPmJ1Zl9zdGF0dXNbaV0uYnVmX3JlZmNudCA9IDE7CisgICAgICAgICAgICBteV9vYmotPmJ1Zl9zdGF0dXNbaV0uaW5fa2VybmVsID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fdW5yZWcgYnVmCisgKgorICogREVTQ1JJUFRJT046IHVucmVnaXN0ZXIgYWxsIHN0cmVhbSBidWZmZXJzIGZyb20ga2VybmVsCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogIDogc3RyZWFtIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9zdHJlYW1fdW5yZWdfYnVmKG1tX3N0cmVhbV90ICogbXlfb2JqKQoreworICAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIGJ1ZnJlcTsKKyAgICBpbnQzMl90IGksIHJjID0gMDsKKyAgICBMT0dEKCJFLCBteV9oYW5kbGUgPSAweCV4LCBmZCA9ICVkLCBzdGF0ZSA9ICVkIiwKKyAgICAgICAgICBteV9vYmotPm15X2hkbCwgbXlfb2JqLT5mZCwgbXlfb2JqLT5zdGF0ZSk7CisKKyAgICAvKiB1bnJlZyBidWYgdG8ga2VybmVsICovCisgICAgYnVmcmVxLmNvdW50ID0gMDsKKyAgICBidWZyZXEudHlwZSAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworICAgIGJ1ZnJlcS5tZW1vcnkgPSBWNEwyX01FTU9SWV9VU0VSUFRSOworICAgIHJjID0gaW9jdGwobXlfb2JqLT5mZCwgVklESU9DX1JFUUJVRlMsICZidWZyZXEpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiZmQ9JWQsIFZJRElPQ19SRVFCVUZTIGZhaWxlZCwgcmM9JWQsIGVycm5vICVkIiwKKyAgICAgICAgICAgICAgIG15X29iai0+ZmQsIHJjLCBlcnJubyk7CisgICAgfQorCisgICAgLyogcmVzZXQgYnVmIHJlZmVyZW5jZSBjb3VudCAqLworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5idWZfbG9jayk7CisgICAgZm9yKGkgPSAwOyBpIDwgbXlfb2JqLT5idWZfbnVtOyBpKyspeworICAgICAgICBteV9vYmotPmJ1Zl9zdGF0dXNbaV0uYnVmX3JlZmNudCA9IDA7CisgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tpXS5pbl9rZXJuZWwgPSAwOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5idWZfbG9jayk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2dldF92NGwyX2ZtdAorICoKKyAqIERFU0NSSVBUSU9OOiB0cmFuc2xhdGUgY2FtZXJhIGltYWdlIGZvcm1hdCBpbnRvIEZPVVJDQyBjb2RlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmbXQgICAgIDogY2FtZXJhIGltYWdlIGZvcm1hdAorICoKKyAqIFJFVFVSTiAgICAgOiBGT1VSQ0MgY29kZSBmb3IgaW1hZ2UgZm9ybWF0CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQzMl90IG1tX3N0cmVhbV9nZXRfdjRsMl9mbXQoY2FtX2Zvcm1hdF90IGZtdCkKK3sKKyAgICB1aW50MzJfdCB2YWwgPSAwOworICAgIHN3aXRjaChmbXQpIHsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVkVOVVM6CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9VQldDOgorICAgICAgICB2YWwgPSBWNEwyX1BJWF9GTVRfTlYxMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYyMToKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxX1ZFTlVTOgorICAgICAgICB2YWwgPSBWNEwyX1BJWF9GTVRfTlYyMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEwQlBQX0dCUkc6CisgICAgICAgIHZhbD0gVjRMMl9QSVhfRk1UX1NHQlJHMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMEJQUF9HUkJHOgorICAgICAgICB2YWw9IFY0TDJfUElYX0ZNVF9TR1JCRzEwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBCUFBfUkdHQjoKKyAgICAgICAgdmFsPSBWNEwyX1BJWF9GTVRfU1JHR0IxMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEwQlBQX0JHR1I6CisgICAgICAgIHZhbD0gVjRMMl9QSVhfRk1UX1NCR0dSMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMkJQUF9HQlJHOgorICAgICAgICB2YWw9IFY0TDJfUElYX0ZNVF9TR0JSRzEyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTJCUFBfR1JCRzoKKyAgICAgICAgdmFsPSBWNEwyX1BJWF9GTVRfU0dSQkcxMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQlBQX1JHR0I6CisgICAgICAgIHZhbD0gVjRMMl9QSVhfRk1UX1NSR0dCMTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xMkJQUF9CR0dSOgorICAgICAgICB2YWwgPSBWNEwyX1BJWF9GTVRfU0JHR1IxMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzE0QlBQX0dCUkc6CisgICAgICAgIHZhbD0gVjRMMl9QSVhfRk1UX1NHQlJHMTQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV18xNEJQUF9HUkJHOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xNEJQUF9HUkJHOgorICAgICAgICB2YWw9IFY0TDJfUElYX0ZNVF9TR1JCRzE0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTRCUFBfUkdHQjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTRCUFBfUkdHQjoKKyAgICAgICAgdmFsPSBWNEwyX1BJWF9GTVRfU1JHR0IxNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzE0QlBQX0JHR1I6CisgICAgICAgIHZhbCA9IFY0TDJfUElYX0ZNVF9TQkdHUjE0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMl9OVjYxOgorICAgICAgICB2YWw9IFY0TDJfUElYX0ZNVF9OVjYxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWX1JBV184QklUX1lVWVY6CisgICAgICAgIHZhbD0gVjRMMl9QSVhfRk1UX1lVWVY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfUkFXXzhCSVRfWVZZVToKKyAgICAgICAgdmFsPSBWNEwyX1BJWF9GTVRfWVZZVTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl9SQVdfOEJJVF9VWVZZOgorICAgICAgICB2YWw9IFY0TDJfUElYX0ZNVF9VWVZZOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWX1JBV184QklUX1ZZVVk6CisgICAgICAgIHZhbD0gVjRMMl9QSVhfRk1UX1ZZVVk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX1lWMTI6CisgICAgICAgIHZhbD0gVjRMMl9QSVhfRk1UX05WMTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIyX05WMTY6CisgICAgICAgIHZhbD0gVjRMMl9QSVhfRk1UX05WMTY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZX09OTFk6CisgICAgICAgIHZhbD0gVjRMMl9QSVhfRk1UX0dSRVk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZX09OTFlfMTBfQlBQOgorICAgICAgICB2YWw9IFY0TDJfUElYX0ZNVF9ZMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZX09OTFlfMTJfQlBQOgorICAgICAgICB2YWw9IFY0TDJfUElYX0ZNVF9ZMTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZX09OTFlfMTRfQlBQOgorICAgICAgICAvKiBObyB2NGwyIGZvcm1hdCBpcyBkZWZpbmVkIHlldCBmb3IgQ0FNX0ZPUk1BVF9ZX09OTFlfMTRfQlBQICovCisgICAgICAgIC8qIHZhbD0gVjRMMl9QSVhfRk1UX1kxNDsgKi8KKyAgICAgICAgdmFsID0gMDsKKyAgICAgICAgTE9HRSgiVW5rbm93biBmbXQ9JWQiLCBmbXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfTUFYOgorICAgICAgICAvKiBDQU1fU1RSRUFNX1RZUEVfREVGQVVMVCwKKyAgICAgICAgICogQ0FNX1NUUkVBTV9UWVBFX09GRkxJTkVfUFJPQywKKyAgICAgICAgICogYW5kIENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQQorICAgICAgICAgKiBzZXQgZm10IHRvIENBTV9GT1JNQVRfTUFYKi8KKyAgICAgICAgdmFsID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgdmFsID0gMDsKKyAgICAgICAgTE9HRSgiVW5rbm93biBmbXQ9JWQiLCBmbXQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgTE9HRCgiZm10PSVkLCB2YWwgPSVkIiwgZm10LCB2YWwpOworICAgIHJldHVybiB2YWw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3ByZXZpZXcKKyAqCisgKiBERVNDUklQVElPTjogY2FsY3VsYXRlIHByZXZpZXcgZnJhbWUgb2Zmc2V0IGJhc2VkIG9uIGZvcm1hdCBhbmQKKyAqICAgICAgICAgICAgICBwYWRkaW5nIGluZm9ybWF0aW9uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmbXQgICAgIDogaW1hZ2UgZm9ybWF0CisgKiAgIEBkaW0gICAgIDogaW1hZ2UgZGltZW5zaW9uCisgKiAgIEBidWZfcGxhbmVzIDogW291dF0gYnVmZmVyIHBsYW5lIGluZm9ybWF0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9jYWxjX29mZnNldF9wcmV2aWV3KGNhbV9zdHJlYW1faW5mb190ICpzdHJlYW1faW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90ICpkaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9idWZfcGxhbmVfaW5mb190ICpidWZfcGxhbmVzKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIGludCBzdHJpZGUgPSAwLCBzY2FubGluZSA9IDA7CisKKyAgICB1aW50MzJfdCB3aWR0aF9wYWRkaW5nID0gMDsKKyAgICB1aW50MzJfdCBoZWlnaHRfcGFkZGluZyA9IDA7CisKKyAgICBzd2l0Y2ggKHN0cmVhbV9pbmZvLT5mbXQpIHsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjE6CisgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWToKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzEwX0JQUDoKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzEyX0JQUDoKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzE0X0JQUDoKKyAgICAgICAgLyogMiBwbGFuZXM6IFkgKyBDYkNyICovCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDI7CisKKyAgICAgICAgaWYgKHN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSAhPSBDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DKSB7CisgICAgICAgICAgICB3aWR0aF9wYWRkaW5nID0gIHBhZGRpbmctPndpZHRoX3BhZGRpbmc7CisgICAgICAgICAgICBoZWlnaHRfcGFkZGluZyA9IENBTV9QQURfVE9fMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdpZHRoX3BhZGRpbmcgPSAgcGFkZGluZy0+d2lkdGhfcGFkZGluZzsKKyAgICAgICAgICAgIGhlaWdodF9wYWRkaW5nID0gcGFkZGluZy0+aGVpZ2h0X3BhZGRpbmc7CisgICAgICAgIH0KKworICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCB3aWR0aF9wYWRkaW5nKTsKKyAgICAgICAgc2NhbmxpbmUgPSBQQURfVE9fU0laRShkaW0tPmhlaWdodCwgaGVpZ2h0X3BhZGRpbmcpOworCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gPSAodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKworICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCB3aWR0aF9wYWRkaW5nKTsKKyAgICAgICAgc2NhbmxpbmUgPSBQQURfVE9fU0laRShkaW0tPmhlaWdodCAvIDIsIGhlaWdodF9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiA9CisgICAgICAgICAgICAodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5oZWlnaHQgPSBkaW0tPmhlaWdodCAvIDI7CisKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1BBRF9UT180Syk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjFfQURSRU5POgorICAgICAgICAvKiAyIHBsYW5lczogWSArIENiQ3IgKi8KKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMjsKKworICAgICAgICBpZiAoc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlICE9IENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0MpIHsKKyAgICAgICAgICAgIHN0cmlkZSA9IFBBRF9UT19TSVpFKGRpbS0+d2lkdGgsIENBTV9QQURfVE9fMzIpOworICAgICAgICAgICAgc2NhbmxpbmUgPSBQQURfVE9fU0laRShkaW0tPmhlaWdodCwgQ0FNX1BBRF9UT18zMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCBwYWRkaW5nLT53aWR0aF9wYWRkaW5nKTsKKyAgICAgICAgICAgIHNjYW5saW5lID0gUEFEX1RPX1NJWkUoZGltLT5oZWlnaHQsIHBhZGRpbmctPmhlaWdodF9wYWRkaW5nKTsKKyAgICAgICAgfQorICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKSwgQ0FNX1BBRF9UT180Syk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uaGVpZ2h0ID0gZGltLT5oZWlnaHQ7CisKKyAgICAgICAgc3RyaWRlID0gUEFEX1RPX1NJWkUoZGltLT53aWR0aCAvIDIsIENBTV9QQURfVE9fMzIpICogMjsKKyAgICAgICAgc2NhbmxpbmUgPSBQQURfVE9fU0laRShkaW0tPmhlaWdodCAvIDIsIENBTV9QQURfVE9fMzIpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKSwgQ0FNX1BBRF9UT180Syk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3ggPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uaGVpZ2h0ID0gZGltLT5oZWlnaHQgLyAyOworCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRShidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiArCisgICAgICAgICAgICAgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTV9QQURfVE9fNEspOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9ZVjEyOgorICAgICAgICAvKiAzIHBsYW5lczogWSArIENyICsgQ2IgKi8KKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMzsKKworICAgICAgICBpZiAoc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlICE9IENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0MpIHsKKyAgICAgICAgICAgIHN0cmlkZSA9IFBBRF9UT19TSVpFKGRpbS0+d2lkdGgsIENBTV9QQURfVE9fMTYpOworICAgICAgICAgICAgc2NhbmxpbmUgPSBQQURfVE9fU0laRShkaW0tPmhlaWdodCwgQ0FNX1BBRF9UT18yKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmlkZSA9IFBBRF9UT19TSVpFKGRpbS0+d2lkdGgsIHBhZGRpbmctPndpZHRoX3BhZGRpbmcpOworICAgICAgICAgICAgc2NhbmxpbmUgPSBQQURfVE9fU0laRShkaW0tPmhlaWdodCwgcGFkZGluZy0+aGVpZ2h0X3BhZGRpbmcpOworICAgICAgICB9CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gPSAodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKworICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShzdHJpZGUgLyAyLCBDQU1fUEFEX1RPXzE2KTsKKyAgICAgICAgc2NhbmxpbmUgPSBzY2FubGluZSAvIDI7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5sZW4gPQorICAgICAgICAgICAgKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3ggPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS53aWR0aCA9IGRpbS0+d2lkdGggLyAyOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmhlaWdodCA9IGRpbS0+aGVpZ2h0IC8gMjsKKworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzJdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMl0ubGVuID0KKyAgICAgICAgICAgICh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzJdLm9mZnNldF94ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsyXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMl0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzJdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMl0ud2lkdGggPSBkaW0tPndpZHRoIC8gMjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsyXS5oZWlnaHQgPSBkaW0tPmhlaWdodCAvIDI7CisKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMl0ubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1BBRF9UT180Syk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIyX05WMTY6CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjJfTlY2MToKKyAgICAgICAgLyogMiBwbGFuZXM6IFkgKyBDYkNyICovCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDI7CisKKyAgICAgICAgaWYgKHN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSAhPSBDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DKSB7CisgICAgICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCBDQU1fUEFEX1RPXzE2KTsKKyAgICAgICAgICAgIHNjYW5saW5lID0gZGltLT5oZWlnaHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCBwYWRkaW5nLT53aWR0aF9wYWRkaW5nKTsKKyAgICAgICAgICAgIHNjYW5saW5lID0gUEFEX1RPX1NJWkUoZGltLT5oZWlnaHQsIHBhZGRpbmctPmhlaWdodF9wYWRkaW5nKTsKKyAgICAgICAgfQorICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0gKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uaGVpZ2h0ID0gZGltLT5oZWlnaHQ7CisKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiA9ICh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF94ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRShidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiArCisgICAgICAgICAgICAgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTV9QQURfVE9fNEspOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyX1ZFTlVTOgorI2lmZGVmIFZFTlVTX1BSRVNFTlQKKyAgICAgICAgLy8gdXNpbmcgVmVudXMKKyAgICAgICAgaWYgKHN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSAhPSBDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DKSB7CisgICAgICAgICAgICBzdHJpZGUgPSBWRU5VU19ZX1NUUklERShDT0xPUl9GTVRfTlYxMiwgZGltLT53aWR0aCk7CisgICAgICAgICAgICBzY2FubGluZSA9IFZFTlVTX1lfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyLCBkaW0tPmhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCBwYWRkaW5nLT53aWR0aF9wYWRkaW5nKTsKKyAgICAgICAgICAgIHNjYW5saW5lID0gUEFEX1RPX1NJWkUoZGltLT5oZWlnaHQsIHBhZGRpbmctPmhlaWdodF9wYWRkaW5nKTsKKyAgICAgICAgfQorICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9CisgICAgICAgICAgICAgICAgVkVOVVNfQlVGRkVSX1NJWkUoQ09MT1JfRk1UX05WMTIsIHN0cmlkZSwgc2NhbmxpbmUpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAyOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiA9ICh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPTA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKyAgICAgICAgaWYgKHN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSAhPSBDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DKSB7CisgICAgICAgICAgICBzdHJpZGUgPSBWRU5VU19VVl9TVFJJREUoQ09MT1JfRk1UX05WMTIsIGRpbS0+d2lkdGgpOworICAgICAgICAgICAgc2NhbmxpbmUgPSBWRU5VU19VVl9TQ0FOTElORVMoQ09MT1JfRk1UX05WMTIsIGRpbS0+aGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmlkZSA9IFBBRF9UT19TSVpFKGRpbS0+d2lkdGgsIHBhZGRpbmctPndpZHRoX3BhZGRpbmcpOworICAgICAgICAgICAgc2NhbmxpbmUgPSBQQURfVE9fU0laRShkaW0tPmhlaWdodCwgcGFkZGluZy0+aGVpZ2h0X3BhZGRpbmcpOworICAgICAgICB9CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuID0KKyAgICAgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiAtIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3ggPTA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5oZWlnaHQgPSBkaW0tPmhlaWdodCAvIDI7CisjZWxzZQorICAgICAgICBMT0dFKCJWZW51cyBoYXJkd2FyZSBub3QgYXZhaWwsIGNhbm5vdCB1c2UgdGhpcyBmb3JtYXQiKTsKKyAgICAgICAgcmMgPSAtMTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxX1ZFTlVTOgorI2lmZGVmIFZFTlVTX1BSRVNFTlQKKyAgICAgICAgLy8gdXNpbmcgVmVudXMKKyAgICAgICAgaWYgKHN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSAhPSBDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DKSB7CisgICAgICAgICAgICBzdHJpZGUgPSBWRU5VU19ZX1NUUklERShDT0xPUl9GTVRfTlYyMSwgZGltLT53aWR0aCk7CisgICAgICAgICAgICBzY2FubGluZSA9IFZFTlVTX1lfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjIxLCBkaW0tPmhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCBwYWRkaW5nLT53aWR0aF9wYWRkaW5nKTsKKyAgICAgICAgICAgIHNjYW5saW5lID0gUEFEX1RPX1NJWkUoZGltLT5oZWlnaHQsIHBhZGRpbmctPmhlaWdodF9wYWRkaW5nKTsKKyAgICAgICAgfQorICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9CisgICAgICAgICAgICAgICAgVkVOVVNfQlVGRkVSX1NJWkUoQ09MT1JfRk1UX05WMjEsIHN0cmlkZSwgc2NhbmxpbmUpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAyOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiA9ICh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPTA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKyAgICAgICAgaWYgKHN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSAhPSBDQU1fU1RSRUFNX1RZUEVfT0ZGTElORV9QUk9DKSB7CisgICAgICAgICAgICBzdHJpZGUgPSBWRU5VU19VVl9TVFJJREUoQ09MT1JfRk1UX05WMjEsIGRpbS0+d2lkdGgpOworICAgICAgICAgICAgc2NhbmxpbmUgPSBWRU5VU19VVl9TQ0FOTElORVMoQ09MT1JfRk1UX05WMjEsIGRpbS0+aGVpZ2h0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmlkZSA9IFBBRF9UT19TSVpFKGRpbS0+d2lkdGgsIHBhZGRpbmctPndpZHRoX3BhZGRpbmcpOworICAgICAgICAgICAgc2NhbmxpbmUgPSBQQURfVE9fU0laRShkaW0tPmhlaWdodCwgcGFkZGluZy0+aGVpZ2h0X3BhZGRpbmcpOworICAgICAgICB9CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuID0KKyAgICAgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiAtIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3ggPTA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5oZWlnaHQgPSBkaW0tPmhlaWdodCAvIDI7CisjZWxzZQorICAgICAgICBMT0dFKCJWZW51cyBoYXJkd2FyZSBub3QgYXZhaWwsIGNhbm5vdCB1c2UgdGhpcyBmb3JtYXQiKTsKKyAgICAgICAgcmMgPSAtMTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyX1VCV0M6CisjaWZkZWYgVUJXQ19QUkVTRU5UCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtZXRhX3N0cmlkZSA9IDAsbWV0YV9zY2FubGluZSA9IDA7CisgICAgICAgICAgICAvLyB1c2luZyBVQldDCisgICAgICAgICAgICBpZiAoc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlICE9IENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0MpIHsKKyAgICAgICAgICAgICAgICBzdHJpZGUgPSBWRU5VU19ZX1NUUklERShDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPndpZHRoKTsKKyAgICAgICAgICAgICAgICBzY2FubGluZSA9IFZFTlVTX1lfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+aGVpZ2h0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyaWRlID0gUEFEX1RPX1NJWkUoZGltLT53aWR0aCwgcGFkZGluZy0+d2lkdGhfcGFkZGluZyk7CisgICAgICAgICAgICAgICAgc2NhbmxpbmUgPSBQQURfVE9fU0laRShkaW0tPmhlaWdodCwgcGFkZGluZy0+aGVpZ2h0X3BhZGRpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWV0YV9zdHJpZGUgPSBWRU5VU19ZX01FVEFfU1RSSURFKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+d2lkdGgpOworICAgICAgICAgICAgbWV0YV9zY2FubGluZSA9IFZFTlVTX1lfTUVUQV9TQ0FOTElORVMoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT5oZWlnaHQpOworCisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9CisgICAgICAgICAgICAgICAgICAgIFZFTlVTX0JVRkZFUl9TSVpFKENPTE9SX0ZNVF9OVjEyX1VCV0MsIHN0cmlkZSwgc2NhbmxpbmUpOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMjsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPTA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5tZXRhX3N0cmlkZSA9IG1ldGFfc3RyaWRlOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5tZXRhX3NjYW5saW5lID0gbWV0YV9zY2FubGluZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubWV0YV9sZW4gPQorICAgICAgICAgICAgICAgICAgICBNU01fTUVESUFfQUxJR04obWV0YV9zdHJpZGUgKiBtZXRhX3NjYW5saW5lLCA0MDk2KTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0KKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShNU01fTUVESUFfQUxJR04oKHN0cmlkZSAqIHNjYW5saW5lKSwgNDA5NikgKworICAgICAgICAgICAgICAgICAgICAoYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5tZXRhX2xlbikpOworCisgICAgICAgICAgICBzdHJpZGUgPSBWRU5VU19VVl9TVFJJREUoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT53aWR0aCk7CisgICAgICAgICAgICBzY2FubGluZSA9IFZFTlVTX1VWX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPmhlaWdodCk7CisgICAgICAgICAgICBtZXRhX3N0cmlkZSA9IFZFTlVTX1VWX01FVEFfU1RSSURFKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+d2lkdGgpOworICAgICAgICAgICAgbWV0YV9zY2FubGluZSA9IFZFTlVTX1VWX01FVEFfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3ggPTA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF95ID0gMDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmhlaWdodCA9IGRpbS0+aGVpZ2h0LzI7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm1ldGFfc3RyaWRlID0gbWV0YV9zdHJpZGU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm1ldGFfc2NhbmxpbmUgPSBtZXRhX3NjYW5saW5lOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5tZXRhX2xlbiA9CisgICAgICAgICAgICAgICAgICAgIE1TTV9NRURJQV9BTElHTihtZXRhX3N0cmlkZSAqIG1ldGFfc2NhbmxpbmUsIDQwOTYpOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5sZW4gPQorICAgICAgICAgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiAtIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuOworICAgICAgICB9CisjZWxzZQorICAgICAgICBMT0dFKCJVQldDIGhhcmR3YXJlIG5vdCBhdmFpbCwgY2Fubm90IHVzZSB0aGlzIGZvcm1hdCIpOworICAgICAgICByYyA9IC0xOworI2VuZGlmCisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiSW52YWxpZCBjYW1fZm9ybWF0IGZvciBwcmV2aWV3ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2luZm8tPmZtdCk7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3Bvc3RfdmlldworICoKKyAqIERFU0NSSVBUSU9OOiBjYWxjdWxhdGUgcG9zdHZpZXcgZnJhbWUgb2Zmc2V0IGJhc2VkIG9uIGZvcm1hdCBhbmQKKyAqICAgICAgICAgICAgICBwYWRkaW5nIGluZm9ybWF0aW9uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmbXQgICAgIDogaW1hZ2UgZm9ybWF0CisgKiAgIEBkaW0gICAgIDogaW1hZ2UgZGltZW5zaW9uCisgKiAgIEBidWZfcGxhbmVzIDogW291dF0gYnVmZmVyIHBsYW5lIGluZm9ybWF0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9jYWxjX29mZnNldF9wb3N0X3ZpZXcoY2FtX2Zvcm1hdF90IGZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2RpbWVuc2lvbl90ICpkaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fYnVmX3BsYW5lX2luZm9fdCAqYnVmX3BsYW5lcykKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBpbnQgc3RyaWRlID0gMCwgc2NhbmxpbmUgPSAwOworCisgICAgc3dpdGNoIChmbXQpIHsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjE6CisgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWToKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzEwX0JQUDoKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzEyX0JQUDoKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzE0X0JQUDoKKyAgICAgICAgLyogMiBwbGFuZXM6IFkgKyBDYkNyICovCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDI7CisKKyAgICAgICAgc3RyaWRlID0gUEFEX1RPX1NJWkUoZGltLT53aWR0aCwgQ0FNX1BBRF9UT182NCk7CisgICAgICAgIHNjYW5saW5lID0gUEFEX1RPX1NJWkUoZGltLT5oZWlnaHQsIENBTV9QQURfVE9fNjQpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0gKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uaGVpZ2h0ID0gZGltLT5oZWlnaHQ7CisKKyAgICAgICAgc3RyaWRlID0gUEFEX1RPX1NJWkUoZGltLT53aWR0aCwgQ0FNX1BBRF9UT182NCk7CisgICAgICAgIHNjYW5saW5lID0gUEFEX1RPX1NJWkUoZGltLT5oZWlnaHQgLyAyLCBDQU1fUEFEX1RPXzY0KTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiA9CisgICAgICAgICAgICAodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5oZWlnaHQgPSBkaW0tPmhlaWdodCAvIDI7CisKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1BBRF9UT180Syk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjFfQURSRU5POgorICAgICAgICAvKiAyIHBsYW5lczogWSArIENiQ3IgKi8KKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMjsKKworICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCBDQU1fUEFEX1RPXzMyKTsKKyAgICAgICAgc2NhbmxpbmUgPSBQQURfVE9fU0laRShkaW0tPmhlaWdodCwgQ0FNX1BBRF9UT18zMik7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpLCBDQU1fUEFEX1RPXzRLKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKworICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoIC8gMiwgQ0FNX1BBRF9UT18zMikgKiAyOworICAgICAgICBzY2FubGluZSA9IFBBRF9UT19TSVpFKGRpbS0+aGVpZ2h0IC8gMiwgQ0FNX1BBRF9UT18zMik7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpLCBDQU1fUEFEX1RPXzRLKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5oZWlnaHQgPSBkaW0tPmhlaWdodCAvIDI7CisKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1BBRF9UT180Syk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX1lWMTI6CisgICAgICAgIC8qIDMgcGxhbmVzOiBZICsgQ3IgKyBDYiAqLworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAzOworCisgICAgICAgIHN0cmlkZSA9IFBBRF9UT19TSVpFKGRpbS0+d2lkdGgsIENBTV9QQURfVE9fMTYpOworICAgICAgICBzY2FubGluZSA9IFBBRF9UT19TSVpFKGRpbS0+aGVpZ2h0LCBDQU1fUEFEX1RPXzIpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0gKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uaGVpZ2h0ID0gZGltLT5oZWlnaHQ7CisKKyAgICAgICAgc3RyaWRlID0gUEFEX1RPX1NJWkUoc3RyaWRlIC8gMiwgQ0FNX1BBRF9UT18xNik7CisgICAgICAgIHNjYW5saW5lID0gc2NhbmxpbmUgLyAyOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuID0KKyAgICAgICAgICAgICh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF94ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ud2lkdGggPSBkaW0tPndpZHRoIC8gMjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5oZWlnaHQgPSBkaW0tPmhlaWdodCAvIDI7CisKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsyXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzJdLmxlbiA9CisgICAgICAgICAgICAodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsyXS5vZmZzZXRfeCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMl0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzJdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsyXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzJdLndpZHRoID0gZGltLT53aWR0aCAvIDI7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMl0uaGVpZ2h0ID0gZGltLT5oZWlnaHQgLyAyOworCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRShidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiArCisgICAgICAgICAgICAgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiArCisgICAgICAgICAgICAgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzJdLmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTV9QQURfVE9fNEspOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMl9OVjE2OgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIyX05WNjE6CisgICAgICAgIC8qIDIgcGxhbmVzOiBZICsgQ2JDciAqLworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAyOworCisgICAgICAgIHN0cmlkZSA9IFBBRF9UT19TSVpFKGRpbS0+d2lkdGgsIENBTV9QQURfVE9fMTYpOworICAgICAgICBzY2FubGluZSA9IGRpbS0+aGVpZ2h0OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0gKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uaGVpZ2h0ID0gZGltLT5oZWlnaHQ7CisKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiA9ICh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF94ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRShidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiArCisgICAgICAgICAgICAgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENBTV9QQURfVE9fNEspOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyX1ZFTlVTOgorI2lmZGVmIFZFTlVTX1BSRVNFTlQKKyAgICAgICAgLy8gdXNpbmcgVmVudXMKKyAgICAgICAgc3RyaWRlID0gVkVOVVNfWV9TVFJJREUoQ09MT1JfRk1UX05WMTIsIGRpbS0+d2lkdGgpOworICAgICAgICBzY2FubGluZSA9IFZFTlVTX1lfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyLCBkaW0tPmhlaWdodCk7CisKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgVkVOVVNfQlVGRkVSX1NJWkUoQ09MT1JfRk1UX05WMTIsIGRpbS0+d2lkdGgsIGRpbS0+aGVpZ2h0KTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gPSAodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF94ID0wOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uaGVpZ2h0ID0gZGltLT5oZWlnaHQ7CisgICAgICAgIHN0cmlkZSA9IFZFTlVTX1VWX1NUUklERShDT0xPUl9GTVRfTlYxMiwgZGltLT53aWR0aCk7CisgICAgICAgIHNjYW5saW5lID0gVkVOVVNfVVZfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyLCBkaW0tPmhlaWdodCk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuID0KKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuIC0gYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW47CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmhlaWdodCA9IGRpbS0+aGVpZ2h0IC8gMjsKKyNlbHNlCisgICAgICAgIExPR0UoIlZlbnVzIGhhcmR3YXJlIG5vdCBhdmFpbCwgY2Fubm90IHVzZSB0aGlzIGZvcm1hdCIpOworICAgICAgICByYyA9IC0xOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjFfVkVOVVM6CisjaWZkZWYgVkVOVVNfUFJFU0VOVAorICAgICAgICAvLyB1c2luZyBWZW51cworICAgICAgICBzdHJpZGUgPSBWRU5VU19ZX1NUUklERShDT0xPUl9GTVRfTlYyMSwgZGltLT53aWR0aCk7CisgICAgICAgIHNjYW5saW5lID0gVkVOVVNfWV9TQ0FOTElORVMoQ09MT1JfRk1UX05WMjEsIGRpbS0+aGVpZ2h0KTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIFZFTlVTX0JVRkZFUl9TSVpFKENPTE9SX0ZNVF9OVjIxLCBkaW0tPndpZHRoLCBkaW0tPmhlaWdodCk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDI7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0gKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworICAgICAgICBzdHJpZGUgPSBWRU5VU19VVl9TVFJJREUoQ09MT1JfRk1UX05WMjEsIGRpbS0+d2lkdGgpOworICAgICAgICBzY2FubGluZSA9IFZFTlVTX1VWX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYyMSwgZGltLT5oZWlnaHQpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiA9CisgICAgICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gLSBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF94ID0wOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uaGVpZ2h0ID0gZGltLT5oZWlnaHQgLyAyOworI2Vsc2UKKyAgICAgICAgTE9HRSgiVmVudXMgaGFyZHdhcmUgbm90IGF2YWlsLCBjYW5ub3QgdXNlIHRoaXMgZm9ybWF0Iik7CisgICAgICAgIHJjID0gLTE7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9VQldDOgorI2lmZGVmIFVCV0NfUFJFU0VOVAorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWV0YV9zdHJpZGUgPSAwLG1ldGFfc2NhbmxpbmUgPSAwOworICAgICAgICAgICAgLy8gdXNpbmcgVUJXQworICAgICAgICAgICAgc3RyaWRlID0gVkVOVVNfWV9TVFJJREUoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT53aWR0aCk7CisgICAgICAgICAgICBzY2FubGluZSA9IFZFTlVTX1lfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+aGVpZ2h0KTsKKyAgICAgICAgICAgIG1ldGFfc3RyaWRlID0gVkVOVVNfWV9NRVRBX1NUUklERShDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPndpZHRoKTsKKyAgICAgICAgICAgIG1ldGFfc2NhbmxpbmUgPSBWRU5VU19ZX01FVEFfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+aGVpZ2h0KTsKKworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgICAgICBWRU5VU19CVUZGRVJfU0laRShDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPndpZHRoLCBkaW0tPmhlaWdodCk7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAyOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXQgPSAwOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3kgPSAwOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uaGVpZ2h0ID0gZGltLT5oZWlnaHQ7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm1ldGFfc3RyaWRlID0gbWV0YV9zdHJpZGU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm1ldGFfc2NhbmxpbmUgPSBtZXRhX3NjYW5saW5lOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5tZXRhX2xlbiA9CisgICAgICAgICAgICAgICAgICAgIE1TTV9NRURJQV9BTElHTihtZXRhX3N0cmlkZSAqIG1ldGFfc2NhbmxpbmUsIDQwOTYpOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gPQorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKE1TTV9NRURJQV9BTElHTigoc3RyaWRlICogc2NhbmxpbmUpLCA0MDk2KSArCisgICAgICAgICAgICAgICAgICAgIChidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm1ldGFfbGVuKSk7CisKKyAgICAgICAgICAgIHN0cmlkZSA9IFZFTlVTX1VWX1NUUklERShDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPndpZHRoKTsKKyAgICAgICAgICAgIHNjYW5saW5lID0gVkVOVVNfVVZfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+aGVpZ2h0KTsKKyAgICAgICAgICAgIG1ldGFfc3RyaWRlID0gVkVOVVNfVVZfTUVUQV9TVFJJREUoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT53aWR0aCk7CisgICAgICAgICAgICBtZXRhX3NjYW5saW5lID0gVkVOVVNfVVZfTUVUQV9TQ0FOTElORVMoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT5oZWlnaHQpOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXQgPSAwOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3kgPSAwOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uaGVpZ2h0ID0gZGltLT5oZWlnaHQvMjsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubWV0YV9zdHJpZGUgPSBtZXRhX3N0cmlkZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubWV0YV9zY2FubGluZSA9IG1ldGFfc2NhbmxpbmU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm1ldGFfbGVuID0KKyAgICAgICAgICAgICAgICAgICAgTVNNX01FRElBX0FMSUdOKG1ldGFfc3RyaWRlICogbWV0YV9zY2FubGluZSwgNDA5Nik7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiA9CisgICAgICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuIC0gYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW47CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIExPR0UoIlVCV0MgaGFyZHdhcmUgbm90IGF2YWlsLCBjYW5ub3QgdXNlIHRoaXMgZm9ybWF0Iik7CisgICAgICAgIHJjID0gLTE7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgiSW52YWxpZCBjYW1fZm9ybWF0IGZvciBwcmV2aWV3ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZm10KTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9jYWxjX29mZnNldF9zbmFwc2hvdAorICoKKyAqIERFU0NSSVBUSU9OOiBjYWxjdWxhdGUgc25hcHNob3QvcG9zdHByb2MgZnJhbWUgb2Zmc2V0IGJhc2VkIG9uIGZvcm1hdCBhbmQKKyAqICAgICAgICAgICAgICBwYWRkaW5nIGluZm9ybWF0aW9uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmbXQgICAgIDogaW1hZ2UgZm9ybWF0CisgKiAgIEBkaW0gICAgIDogaW1hZ2UgZGltZW5zaW9uCisgKiAgIEBwYWRkaW5nIDogcGFkZGluZyBpbmZvcm1hdGlvbgorICogICBAYnVmX3BsYW5lcyA6IFtvdXRdIGJ1ZmZlciBwbGFuZSBpbmZvcm1hdGlvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9zdHJlYW1fY2FsY19vZmZzZXRfc25hcHNob3QoY2FtX2Zvcm1hdF90IGZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9kaW1lbnNpb25fdCAqZGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9idWZfcGxhbmVfaW5mb190ICpidWZfcGxhbmVzKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIHVpbnQ4X3QgaXNBRmFtaWx5ID0gbW1fY2FtZXJhX3V0aWxfY2hpcF9pc19hX2ZhbWlseSgpOworICAgIGludCBvZmZzZXRfeCA9IDAsIG9mZnNldF95ID0gMDsKKyAgICBpbnQgc3RyaWRlID0gMCwgc2NhbmxpbmUgPSAwOworCisgICAgaWYgKGlzQUZhbWlseSkgeworICAgICAgICBzdHJpZGUgPSBkaW0tPndpZHRoOworICAgICAgICBzY2FubGluZSA9IFBBRF9UT19TSVpFKGRpbS0+aGVpZ2h0LCBDQU1fUEFEX1RPXzE2KTsKKyAgICAgICAgb2Zmc2V0X3ggPSAwOworICAgICAgICBvZmZzZXRfeSA9IHNjYW5saW5lIC0gZGltLT5oZWlnaHQ7CisgICAgICAgIHNjYW5saW5lICs9IG9mZnNldF95OyAvKiBkb3VibGUgcGFkZGluZyAqLworICAgIH0gZWxzZSB7CisgICAgICAgIG9mZnNldF94ID0gUEFEX1RPX1NJWkUocGFkZGluZy0+b2Zmc2V0X2luZm8ub2Zmc2V0X3gsCisgICAgICAgICAgICAgICAgcGFkZGluZy0+cGxhbmVfcGFkZGluZyk7CisgICAgICAgIG9mZnNldF95ID0gUEFEX1RPX1NJWkUocGFkZGluZy0+b2Zmc2V0X2luZm8ub2Zmc2V0X3ksCisgICAgICAgICAgICAgICAgcGFkZGluZy0+cGxhbmVfcGFkZGluZyk7CisgICAgICAgIHN0cmlkZSA9IFBBRF9UT19TSVpFKChkaW0tPndpZHRoICsKKyAgICAgICAgICAgICAgICAoMiAqIG9mZnNldF94KSksIHBhZGRpbmctPndpZHRoX3BhZGRpbmcpOworICAgICAgICBzY2FubGluZSA9IFBBRF9UT19TSVpFKChkaW0tPmhlaWdodCArCisgICAgICAgICAgICAgICAgKDIgKiBvZmZzZXRfeSkpLCBwYWRkaW5nLT5oZWlnaHRfcGFkZGluZyk7CisgICAgfQorCisgICAgc3dpdGNoIChmbXQpIHsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjE6CisgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWToKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzEwX0JQUDoKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzEyX0JQUDoKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzE0X0JQUDoKKyAgICAgICAgLyogMiBwbGFuZXM6IFkgKyBDYkNyICovCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDI7CisKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpLAorICAgICAgICAgICAgICAgIHBhZGRpbmctPnBsYW5lX3BhZGRpbmcpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShvZmZzZXRfeCArIHN0cmlkZSAqIG9mZnNldF95KSwKKyAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9IG9mZnNldF94OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gb2Zmc2V0X3k7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworCisgICAgICAgIHNjYW5saW5lID0gc2NhbmxpbmUvMjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpLAorICAgICAgICAgICAgICAgIHBhZGRpbmctPnBsYW5lX3BhZGRpbmcpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldCA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShvZmZzZXRfeCArIHN0cmlkZSAqIG9mZnNldF95KSwKKyAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeCA9IG9mZnNldF94OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF95ID0gb2Zmc2V0X3k7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmhlaWdodCA9IGRpbS0+aGVpZ2h0IC8gMjsKKworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gKworICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuLAorICAgICAgICAgICAgICAgIENBTV9QQURfVE9fNEspOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9ZVjEyOgorICAgICAgICAvKiAzIHBsYW5lczogWSArIENyICsgQ2IgKi8KKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMzsKKworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShvZmZzZXRfeCArIHN0cmlkZSAqIG9mZnNldF95KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctPnBsYW5lX3BhZGRpbmcpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9IG9mZnNldF94OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gb2Zmc2V0X3k7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworCisgICAgICAgIHN0cmlkZSA9IFBBRF9UT19TSVpFKHN0cmlkZSAvIDIsIENBTV9QQURfVE9fMTYpOworICAgICAgICBzY2FubGluZSA9IHNjYW5saW5lIC8gMjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXQgPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkob2Zmc2V0X3ggKyBzdHJpZGUgKiBvZmZzZXRfeSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy0+cGxhbmVfcGFkZGluZyk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3ggPSBvZmZzZXRfeDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeSA9IG9mZnNldF95OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLndpZHRoID0gZGltLT53aWR0aCAvIDI7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uaGVpZ2h0ID0gZGltLT5oZWlnaHQgLyAyOworCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMl0ub2Zmc2V0ID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKG9mZnNldF94ICsgc3RyaWRlICogb2Zmc2V0X3kpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy0+cGxhbmVfcGFkZGluZyk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMl0ubGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctPnBsYW5lX3BhZGRpbmcpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzJdLm9mZnNldF94ID0gb2Zmc2V0X3g7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMl0ub2Zmc2V0X3kgPSBvZmZzZXRfeTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsyXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMl0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsyXS53aWR0aCA9IGRpbS0+d2lkdGggLyAyOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzJdLmhlaWdodCA9IGRpbS0+aGVpZ2h0IC8gMjsKKworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gKworICAgICAgICAgICAgICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5sZW4gKworICAgICAgICAgICAgICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsyXS5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBDQU1fUEFEX1RPXzRLKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjJfTlYxNjoKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMl9OVjYxOgorICAgICAgICAvKiAyIHBsYW5lczogWSArIENiQ3IgKi8KKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy0+cGxhbmVfcGFkZGluZyk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKG9mZnNldF94ICsgc3RyaWRlICogb2Zmc2V0X3kpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy0+cGxhbmVfcGFkZGluZyk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPSBvZmZzZXRfeDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IG9mZnNldF95OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXQgPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkob2Zmc2V0X3ggKyBzdHJpZGUgKiBvZmZzZXRfeSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeCA9IG9mZnNldF94OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF95ID0gb2Zmc2V0X3k7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuID0gUEFEX1RPX1NJWkUoCisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiArIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuLAorICAgICAgICAgICAgQ0FNX1BBRF9UT180Syk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVUJXQzoKKyNpZmRlZiBVQldDX1BSRVNFTlQKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG1ldGFfc3RyaWRlID0gMCxtZXRhX3NjYW5saW5lID0gMDsKKyAgICAgICAgICAgIC8vIHVzaW5nIFVCV0MKKyAgICAgICAgICAgIHN0cmlkZSA9IFZFTlVTX1lfU1RSSURFKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+d2lkdGgpOworICAgICAgICAgICAgc2NhbmxpbmUgPSBWRU5VU19ZX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPmhlaWdodCk7CisgICAgICAgICAgICBtZXRhX3N0cmlkZSA9IFZFTlVTX1lfTUVUQV9TVFJJREUoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT53aWR0aCk7CisgICAgICAgICAgICBtZXRhX3NjYW5saW5lID0gVkVOVVNfWV9NRVRBX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPmhlaWdodCk7CisKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuID0KKyAgICAgICAgICAgICAgICAgICAgVkVOVVNfQlVGRkVSX1NJWkUoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT53aWR0aCwgZGltLT5oZWlnaHQpOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMjsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPSAwOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubWV0YV9zdHJpZGUgPSBtZXRhX3N0cmlkZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubWV0YV9zY2FubGluZSA9IG1ldGFfc2NhbmxpbmU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm1ldGFfbGVuID0KKyAgICAgICAgICAgICAgICAgICAgTVNNX01FRElBX0FMSUdOKG1ldGFfc3RyaWRlICogbWV0YV9zY2FubGluZSwgNDA5Nik7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiA9CisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoTVNNX01FRElBX0FMSUdOKChzdHJpZGUgKiBzY2FubGluZSksIDQwOTYpICsKKyAgICAgICAgICAgICAgICAgICAgKGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubWV0YV9sZW4pKTsKKworICAgICAgICAgICAgc3RyaWRlID0gVkVOVVNfVVZfU1RSSURFKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+d2lkdGgpOworICAgICAgICAgICAgc2NhbmxpbmUgPSBWRU5VU19VVl9TQ0FOTElORVMoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT5oZWlnaHQpOworICAgICAgICAgICAgbWV0YV9zdHJpZGUgPSBWRU5VU19VVl9NRVRBX1NUUklERShDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPndpZHRoKTsKKyAgICAgICAgICAgIG1ldGFfc2NhbmxpbmUgPSBWRU5VU19VVl9NRVRBX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPmhlaWdodCk7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldCA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF94ID0wOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeSA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5oZWlnaHQgPSBkaW0tPmhlaWdodC8yOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5tZXRhX3N0cmlkZSA9IG1ldGFfc3RyaWRlOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5tZXRhX3NjYW5saW5lID0gbWV0YV9zY2FubGluZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubWV0YV9sZW4gPQorICAgICAgICAgICAgICAgICAgICBNU01fTUVESUFfQUxJR04obWV0YV9zdHJpZGUgKiBtZXRhX3NjYW5saW5lLCA0MDk2KTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuID0KKyAgICAgICAgICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gLSBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbjsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgTE9HRSgiVUJXQyBoYXJkd2FyZSBub3QgYXZhaWwsIGNhbm5vdCB1c2UgdGhpcyBmb3JtYXQiKTsKKyAgICAgICAgcmMgPSAtMTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjEyX1ZFTlVTOgorI2lmZGVmIFZFTlVTX1BSRVNFTlQKKyAgICAgICAgLy8gdXNpbmcgVmVudXMKKyAgICAgICAgc3RyaWRlID0gVkVOVVNfWV9TVFJJREUoQ09MT1JfRk1UX05WMTIsIGRpbS0+d2lkdGgpOworICAgICAgICBzY2FubGluZSA9IFZFTlVTX1lfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyLCBkaW0tPmhlaWdodCk7CisKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIFZFTlVTX0JVRkZFUl9TSVpFKENPTE9SX0ZNVF9OVjEyLCBkaW0tPndpZHRoLCBkaW0tPmhlaWdodCk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDI7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0gKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworICAgICAgICBzdHJpZGUgPSBWRU5VU19VVl9TVFJJREUoQ09MT1JfRk1UX05WMTIsIGRpbS0+d2lkdGgpOworICAgICAgICBzY2FubGluZSA9IFZFTlVTX1VWX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMiwgZGltLT5oZWlnaHQpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiA9CisgICAgICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gLQorICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3ggPTA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5oZWlnaHQgPSBkaW0tPmhlaWdodCAvIDI7CisjZWxzZQorICAgICAgICBMT0dEKCJWaWRlbyBmb3JtYXQgVkVOVVMgaXMgbm90IHN1cHBvcnRlZCA9ICVkIiwKKyAgICAgICAgICAgICAgICAgZm10KTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxX1ZFTlVTOgorI2lmZGVmIFZFTlVTX1BSRVNFTlQKKyAgICAgICAgLy8gdXNpbmcgVmVudXMKKyAgICAgICAgc3RyaWRlID0gVkVOVVNfWV9TVFJJREUoQ09MT1JfRk1UX05WMjEsIGRpbS0+d2lkdGgpOworICAgICAgICBzY2FubGluZSA9IFZFTlVTX1lfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjIxLCBkaW0tPmhlaWdodCk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuID0KKyAgICAgICAgICAgICAgICBWRU5VU19CVUZGRVJfU0laRShDT0xPUl9GTVRfTlYyMSwgZGltLT53aWR0aCwgZGltLT5oZWlnaHQpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAyOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiA9ICh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPTA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKyAgICAgICAgc3RyaWRlID0gVkVOVVNfVVZfU1RSSURFKENPTE9SX0ZNVF9OVjIxLCBkaW0tPndpZHRoKTsKKyAgICAgICAgc2NhbmxpbmUgPSBWRU5VU19VVl9TQ0FOTElORVMoQ09MT1JfRk1UX05WMjEsIGRpbS0+aGVpZ2h0KTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5sZW4gPQorICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuIC0gYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW47CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmhlaWdodCA9IGRpbS0+aGVpZ2h0IC8gMjsKKyNlbHNlCisgICAgICAgIExPR0UoIlZlbnVzIGhhcmR3YXJlIG5vdCBhdmFpbCwgY2Fubm90IHVzZSB0aGlzIGZvcm1hdCIpOworICAgICAgICByYyA9IC0xOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR0UoIkludmFsaWQgY2FtX2Zvcm1hdCBmb3Igc25hcHNob3QgJWQiLAorICAgICAgICAgICAgICAgICAgICBmbXQpOworICAgICAgICByYyA9IC0xOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3JhdworICoKKyAqIERFU0NSSVBUSU9OOiBjYWxjdWxhdGUgcmF3IGZyYW1lIG9mZnNldCBiYXNlZCBvbiBmb3JtYXQgYW5kIHBhZGRpbmcgaW5mb3JtYXRpb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZtdCAgICAgOiBpbWFnZSBmb3JtYXQKKyAqICAgQGRpbSAgICAgOiBpbWFnZSBkaW1lbnNpb24KKyAqICAgQHBhZGRpbmcgOiBwYWRkaW5nIGluZm9ybWF0aW9uCisgKiAgIEBidWZfcGxhbmVzIDogW291dF0gYnVmZmVyIHBsYW5lIGluZm9ybWF0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9jYWxjX29mZnNldF9yYXcoY2FtX2Zvcm1hdF90IGZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3QgKmRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9idWZfcGxhbmVfaW5mb190ICpidWZfcGxhbmVzKQoreworICAgIGludDMyX3QgcmMgPSAwOworCisgICAgaWYgKChOVUxMID09IGRpbSkgfHwgKE5VTEwgPT0gcGFkZGluZykgfHwgKE5VTEwgPT0gYnVmX3BsYW5lcykpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGludDMyX3Qgc3RyaWRlID0gUEFEX1RPX1NJWkUoZGltLT53aWR0aCwgKGludDMyX3QpcGFkZGluZy0+d2lkdGhfcGFkZGluZyk7CisgICAgaW50MzJfdCBzdHJpZGVfaW5fYnl0ZXMgPSBzdHJpZGU7CisgICAgaW50MzJfdCBzY2FubGluZSA9IFBBRF9UT19TSVpFKGRpbS0+aGVpZ2h0LCAoaW50MzJfdClwYWRkaW5nLT5oZWlnaHRfcGFkZGluZyk7CisKKyAgICBzd2l0Y2ggKGZtdCkgeworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjE6CisgICAgICAgIC8qIDIgcGxhbmVzOiBZICsgQ2JDciAqLworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAyOworCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKSwKKyAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF94ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZV9pbl9ieXRlcyA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKworICAgICAgICBzY2FubGluZSA9IHNjYW5saW5lIC8gMjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpLAorICAgICAgICAgICAgICAgIHBhZGRpbmctPnBsYW5lX3BhZGRpbmcpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3ggPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc3RyaWRlX2luX2J5dGVzID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmhlaWdodCA9IGRpbS0+aGVpZ2h0IC8gMjsKKworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gKworICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuLAorICAgICAgICAgICAgICAgIENBTV9QQURfVE9fNEspOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWX1JBV184QklUX1lVWVY6CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl9SQVdfOEJJVF9ZVllVOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfUkFXXzhCSVRfVVlWWToKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWX1JBV184QklUX1ZZVVk6CisgICAgY2FzZSBDQU1fRk9STUFUX0pQRUdfUkFXXzhCSVQ6CisgICAgICAgIC8qIDEgcGxhbmUgKi8KKyAgICAgICAgLyogRXZlcnkgMTYgcGl4ZWxzIG9jY3VweSAxNiBieXRlcyAqLworICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCBDQU1fUEFEX1RPXzE2KTsKKyAgICAgICAgc3RyaWRlX2luX2J5dGVzID0gc3RyaWRlICogMjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShzdHJpZGVfaW5fYnl0ZXMgKiBzY2FubGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuLCBDQU1fUEFEX1RPXzRLKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZV9pbl9ieXRlcyA9IHN0cmlkZV9pbl9ieXRlczsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0KKyAgICAgICAgICAgICAgICAoaW50MzJfdClidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfTUVUQV9SQVdfOEJJVDoKKyAgICAgICAgLy8gRXZlcnkgMTYgcGl4ZWxzIG9jY3VweSAxNiBieXRlcworICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCBDQU1fUEFEX1RPXzE2KTsKKyAgICAgICAgc3RyaWRlX2luX2J5dGVzID0gc3RyaWRlICogMjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShzdHJpZGVfaW5fYnl0ZXMgKiBzY2FubGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuLCBDQU1fUEFEX1RPXzRLKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZV9pbl9ieXRlcyA9IHN0cmlkZV9pbl9ieXRlczsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV184QlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzhCUFBfR1JCRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfOEJQUF9SR0dCOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9RQ09NX1JBV184QlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzhCUFBfR1JFWToKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfOEJQUF9HQlJHOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV184QlBQX0dSQkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzhCUFBfUkdHQjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfOEJQUF9CR0dSOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV184QlBQX0dSRVk6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzhCUFBfR0JSRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fOEJQUF9HUkJHOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUUNPTV84QlBQX1JHR0I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzhCUFBfQkdHUjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fOEJQUF9HUkVZOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV84QlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzhCUFBfR1JCRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfOEJQUF9SR0dCOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV84QlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzhCUFBfR1JFWToKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOOF84QlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjhfOEJQUF9HUkJHOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU44XzhCUFBfUkdHQjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOOF84QlBQX0JHR1I6CisgICAgICAgIC8qIDEgcGxhbmUgKi8KKyAgICAgICAgLyogRXZlcnkgMTYgcGl4ZWxzIG9jY3VweSAxNiBieXRlcyAqLworICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCBDQU1fUEFEX1RPXzE2KTsKKyAgICAgICAgc3RyaWRlX2luX2J5dGVzID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAxOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKHN0cmlkZV9pbl9ieXRlcyAqIHNjYW5saW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctPnBsYW5lX3BhZGRpbmcpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4sIENBTV9QQURfVE9fNEspOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF94ID0wOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlX2luX2J5dGVzID0gc3RyaWRlX2luX2J5dGVzOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSAoaW50MzJfdClidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBCUFBfR0JSRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBCUFBfR1JCRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBCUFBfUkdHQjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBCUFBfQkdHUjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfUUNPTV9SQVdfMTBCUFBfR1JFWToKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTBCUFBfR0JSRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTBCUFBfR1JCRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTBCUFBfUkdHQjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTBCUFBfQkdHUjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1FDT01fMTBCUFBfR1JFWToKKyAgICAgICAgLyogRXZlcnkgMTIgcGl4ZWxzIG9jY3VweSAxNiBieXRlcyAqLworICAgICAgICBzdHJpZGUgPSAoZGltLT53aWR0aCArIDExKS8xMiAqIDEyOworICAgICAgICBzdHJpZGVfaW5fYnl0ZXMgPSBzdHJpZGUgKiA4IC8gNjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShzdHJpZGVfaW5fYnl0ZXMgKiBzY2FubGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuLCBDQU1fUEFEX1RPXzRLKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZV9pbl9ieXRlcyA9IHN0cmlkZV9pbl9ieXRlczsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gKGludDMyX3QpYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW47CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uaGVpZ2h0ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQlBQX0dSQkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQlBQX1JHR0I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzEyQlBQX0dSRVk6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzEyQlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzEyQlBQX0dSQkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzEyQlBQX1JHR0I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzEyQlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzEyQlBQX0dSRVk6CisgICAgICAgIC8qIEV2ZXJ5IDEwIHBpeGVscyBvY2N1cHkgMTYgYnl0ZXMgKi8KKyAgICAgICAgc3RyaWRlID0gKGRpbS0+d2lkdGggKyA5KS8xMCAqIDEwOworICAgICAgICBzdHJpZGVfaW5fYnl0ZXMgPSBzdHJpZGUgKiA4IC8gNTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShzdHJpZGVfaW5fYnl0ZXMgKiBzY2FubGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuLCBDQU1fUEFEX1RPXzRLKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZV9pbl9ieXRlcyA9IHN0cmlkZV9pbl9ieXRlczsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gKGludDMyX3QpYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW47CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uaGVpZ2h0ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX0dSQkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX1JHR0I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX01JUElfUkFXXzEwQlBQX0dSRVk6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEwQlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEwQlBQX0dSQkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEwQlBQX1JHR0I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19NSVBJXzEwQlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX01FVEFfUkFXXzEwQklUOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfTUlQSV8xMEJQUF9HUkVZOgorICAgICAgICAvKiBFdmVyeSA2NCBwaXhlbHMgb2NjdXB5IDgwIGJ5dGVzICovCisgICAgICAgIHN0cmlkZSA9IFBBRF9UT19TSVpFKGRpbS0+d2lkdGgsIENBTV9QQURfVE9fNCk7CisgICAgICAgIHN0cmlkZV9pbl9ieXRlcyA9IFBBRF9UT19TSVpFKHN0cmlkZSAqIDUgLyA0LCBDQU1fUEFEX1RPXzgpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAxOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKHN0cmlkZV9pbl9ieXRlcyAqIHNjYW5saW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctPnBsYW5lX3BhZGRpbmcpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4sIENBTV9QQURfVE9fNEspOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF94ID0wOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlX2luX2J5dGVzID0gc3RyaWRlX2luX2J5dGVzOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSAoaW50MzJfdClidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJCUFBfR0JSRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJCUFBfR1JCRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJCUFBfUkdHQjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJCUFBfQkdHUjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJCUFBfR1JFWToKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTJCUFBfR0JSRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTJCUFBfR1JCRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTJCUFBfUkdHQjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTJCUFBfQkdHUjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTJCUFBfR1JFWToKKyAgICAgICAgLyogRXZlcnkgMzIgcGl4ZWxzIG9jY3VweSA0OCBieXRlcyAqLworICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCBDQU1fUEFEX1RPXzMyKTsKKyAgICAgICAgc3RyaWRlX2luX2J5dGVzID0gc3RyaWRlICogMyAvIDI7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDE7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkoc3RyaWRlX2luX2J5dGVzICogc2NhbmxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy0+cGxhbmVfcGFkZGluZyk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRShidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiwgQ0FNX1BBRF9UT180Syk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPTA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3kgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGVfaW5fYnl0ZXMgPSBzdHJpZGVfaW5fYnl0ZXM7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS53aWR0aCA9IChpbnQzMl90KWJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmhlaWdodCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU4xNl84QlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzhCUFBfR1JCRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX1BMQUlOMTZfOEJQUF9SR0dCOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9CQVlFUl9JREVBTF9SQVdfUExBSU4xNl84QlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzEwQlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzEwQlBQX0dSQkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzEwQlBQX1JHR0I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzEwQlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzEyQlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzEyQlBQX0dSQkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzEyQlBQX1JHR0I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzEyQlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzE0QlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzE0QlBQX0dSQkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzE0QlBQX1JHR0I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19QTEFJTjE2XzE0QlBQX0JHR1I6CisgICAgICAgIC8qIEV2ZXJ5IDggcGl4ZWxzIG9jY3VweSAxNiBieXRlcyAqLworICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShkaW0tPndpZHRoLCBDQU1fUEFEX1RPXzgpOworICAgICAgICBzdHJpZGVfaW5fYnl0ZXMgPSBzdHJpZGUgKiAyOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAxOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKHN0cmlkZV9pbl9ieXRlcyAqIHNjYW5saW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctPnBsYW5lX3BhZGRpbmcpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4sIENBTV9QQURfVE9fNEspOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF94ID0wOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlX2luX2J5dGVzID0gc3RyaWRlX2luX2J5dGVzOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSAoaW50MzJfdClidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTRCUFBfR0JSRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTRCUFBfR1JCRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTRCUFBfUkdHQjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTRCUFBfQkdHUjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTRCUFBfR1JFWToKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTRCUFBfR0JSRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTRCUFBfR1JCRzoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTRCUFBfUkdHQjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTRCUFBfQkdHUjoKKyAgICBjYXNlIENBTV9GT1JNQVRfQkFZRVJfSURFQUxfUkFXX01JUElfMTRCUFBfR1JFWToKKyAgICAgICAgLyogRXZlcnkgNjQgcGl4ZWxzIG9jY3VweSAxMTIgYnl0ZXMgKi8KKyAgICAgICAgc3RyaWRlID0gUEFEX1RPX1NJWkUoZGltLT53aWR0aCwgQ0FNX1BBRF9UT182NCk7CisgICAgICAgIHN0cmlkZV9pbl9ieXRlcyA9IHN0cmlkZSAqIDcgLyA0OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAxOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKHN0cmlkZV9pbl9ieXRlcyAqIHNjYW5saW5lKSwKKyAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuLCBDQU1fUEFEX1RPXzRLKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZV9pbl9ieXRlcyA9IHN0cmlkZV9pbl9ieXRlczsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gKGludDMyX3QpYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW47CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uaGVpZ2h0ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX0dSQkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX1JHR0I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX1FDT01fUkFXXzE0QlBQX0dSRVk6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzE0QlBQX0dCUkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzE0QlBQX0dSQkc6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzE0QlBQX1JHR0I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzE0QlBQX0JHR1I6CisgICAgY2FzZSBDQU1fRk9STUFUX0JBWUVSX0lERUFMX1JBV19RQ09NXzE0QlBQX0dSRVk6CisgICAgICAgIC8qIEV2ZXJ5IDE2IHBpeGVscyBvY2N1cHkgMzIgYnl0ZXMgKi8KKyAgICAgICAgc3RyaWRlID0gUEFEX1RPX1NJWkUoZGltLT53aWR0aCwgQ0FNX1BBRF9UT18xNik7CisgICAgICAgIHN0cmlkZV9pbl9ieXRlcyA9IHN0cmlkZSAqIDI7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDE7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkoc3RyaWRlX2luX2J5dGVzICogc2NhbmxpbmUpLAorICAgICAgICAgICAgICAgIHBhZGRpbmctPnBsYW5lX3BhZGRpbmcpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4sIENBTV9QQURfVE9fNEspOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF94ID0wOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlX2luX2J5dGVzID0gc3RyaWRlX2luX2J5dGVzOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSAoaW50MzJfdClidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSAxOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJJbnZhbGlkIGNhbV9mb3JtYXQgJWQgZm9yIHJhdyBzdHJlYW0iLAorICAgICAgICAgICAgICAgICAgICBmbXQpOworICAgICAgICByYyA9IC0xOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3ZpZGVvCisgKgorICogREVTQ1JJUFRJT046IGNhbGN1bGF0ZSB2aWRlbyBmcmFtZSBvZmZzZXQgYmFzZWQgb24gZm9ybWF0IGFuZAorICogICAgICAgICAgICAgIHBhZGRpbmcgaW5mb3JtYXRpb24KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAgKiAgIEBmbXQgICAgIDogaW1hZ2UgZm9ybWF0CisgKiAgIEBkaW0gICAgIDogaW1hZ2UgZGltZW5zaW9uCisgKiAgIEBidWZfcGxhbmVzIDogW291dF0gYnVmZmVyIHBsYW5lIGluZm9ybWF0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9jYWxjX29mZnNldF92aWRlbyhjYW1fZm9ybWF0X3QgZm10LAorICAgICAgICBjYW1fZGltZW5zaW9uX3QgKmRpbSwgY2FtX3N0cmVhbV9idWZfcGxhbmVfaW5mb190ICpidWZfcGxhbmVzKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIGludCBzdHJpZGUgPSAwLCBzY2FubGluZSA9IDA7CisKKyAgICAjaWZkZWYgVUJXQ19QUkVTRU5UCisgICAgaW50IG1ldGFfc3RyaWRlID0gMCxtZXRhX3NjYW5saW5lID0gMDsKKyAgICAjZW5kaWYKKworCisgICAgc3dpdGNoIChmbXQpIHsKKyAgICAgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMjoKKyAgICAgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWToKKyAgICAgICAgY2FzZSBDQU1fRk9STUFUX1lfT05MWV8xMF9CUFA6CisgICAgICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZX09OTFlfMTJfQlBQOgorICAgICAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZXzE0X0JQUDoKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDI7CisKKyAgICAgICAgICAgIHN0cmlkZSA9IGRpbS0+d2lkdGg7CisgICAgICAgICAgICBzY2FubGluZSA9IGRpbS0+aGVpZ2h0OworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gPQorICAgICAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKSwKKyAgICAgICAgICAgICAgICAgICAgQ0FNX1BBRF9UT18ySyk7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF94ID0wOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKworICAgICAgICAgICAgc3RyaWRlID0gZGltLT53aWR0aDsKKyAgICAgICAgICAgIHNjYW5saW5lID0gZGltLT5oZWlnaHQgLyAyOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5sZW4gPQorICAgICAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKSwKKyAgICAgICAgICAgICAgICAgICAgQ0FNX1BBRF9UT18ySyk7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldCA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF94ID0wOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeSA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5oZWlnaHQgPSBkaW0tPmhlaWdodCAvIDI7CisKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuID0KKyAgICAgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gKworICAgICAgICAgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiwKKyAgICAgICAgICAgICAgICAgICAgQ0FNX1BBRF9UT180Syk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9WRU5VUzoKKyNpZmRlZiBWRU5VU19QUkVTRU5UCisgICAgICAgICAgICAvLyB1c2luZyBWZW51cworICAgICAgICAgICAgc3RyaWRlID0gVkVOVVNfWV9TVFJJREUoQ09MT1JfRk1UX05WMTIsIGRpbS0+d2lkdGgpOworICAgICAgICAgICAgc2NhbmxpbmUgPSBWRU5VU19ZX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMiwgZGltLT5oZWlnaHQpOworCisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9CisgICAgICAgICAgICAgICAgICAgIFZFTlVTX0JVRkZFUl9TSVpFKENPTE9SX0ZNVF9OVjEyLCBkaW0tPndpZHRoLCBkaW0tPmhlaWdodCk7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAyOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gPSAodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPTA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworICAgICAgICAgICAgc3RyaWRlID0gVkVOVVNfVVZfU1RSSURFKENPTE9SX0ZNVF9OVjEyLCBkaW0tPndpZHRoKTsKKyAgICAgICAgICAgIHNjYW5saW5lID0gVkVOVVNfVVZfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyLCBkaW0tPmhlaWdodCk7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiA9CisgICAgICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuIC0KKyAgICAgICAgICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW47CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldCA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF94ID0wOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeSA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5oZWlnaHQgPSBkaW0tPmhlaWdodC8yOworI2Vsc2UKKyAgICAgICAgICAgIExPR0QoIlZpZGVvIGZvcm1hdCBWRU5VUyBpcyBub3Qgc3VwcG9ydGVkID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgZm10KTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjFfVkVOVVM6CisjaWZkZWYgVkVOVVNfUFJFU0VOVAorICAgICAgICAgICAgLy8gdXNpbmcgVmVudXMKKyAgICAgICAgICAgIHN0cmlkZSA9IFZFTlVTX1lfU1RSSURFKENPTE9SX0ZNVF9OVjIxLCBkaW0tPndpZHRoKTsKKyAgICAgICAgICAgIHNjYW5saW5lID0gVkVOVVNfWV9TQ0FOTElORVMoQ09MT1JfRk1UX05WMjEsIGRpbS0+aGVpZ2h0KTsKKworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgICAgICBWRU5VU19CVUZGRVJfU0laRShDT0xPUl9GTVRfTlYyMSwgZGltLT53aWR0aCwgZGltLT5oZWlnaHQpOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMjsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0gKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSk7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF94ID0wOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKyAgICAgICAgICAgIHN0cmlkZSA9IFZFTlVTX1VWX1NUUklERShDT0xPUl9GTVRfTlYyMSwgZGltLT53aWR0aCk7CisgICAgICAgICAgICBzY2FubGluZSA9IFZFTlVTX1VWX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYyMSwgZGltLT5oZWlnaHQpOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5sZW4gPQorICAgICAgICAgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiAtCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXQgPSAwOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3kgPSAwOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uaGVpZ2h0ID0gZGltLT5oZWlnaHQgLyAyOworI2Vsc2UKKyAgICAgICAgICAgIExPR0QoIlZpZGVvIGZvcm1hdCBWRU5VUyBpcyBub3Qgc3VwcG9ydGVkID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgZm10KTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMTJfVUJXQzoKKyNpZmRlZiBVQldDX1BSRVNFTlQKKyAgICAgICAgICAgIC8vIHVzaW5nIFVCV0MKKyAgICAgICAgICAgIHN0cmlkZSA9IFZFTlVTX1lfU1RSSURFKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+d2lkdGgpOworICAgICAgICAgICAgc2NhbmxpbmUgPSBWRU5VU19ZX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPmhlaWdodCk7CisgICAgICAgICAgICBtZXRhX3N0cmlkZSA9IFZFTlVTX1lfTUVUQV9TVFJJREUoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT53aWR0aCk7CisgICAgICAgICAgICBtZXRhX3NjYW5saW5lID0gVkVOVVNfWV9NRVRBX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPmhlaWdodCk7CisKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuID0KKyAgICAgICAgICAgICAgICAgICAgVkVOVVNfQlVGRkVSX1NJWkUoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT53aWR0aCwgZGltLT5oZWlnaHQpOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMjsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPTA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gMDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5tZXRhX3N0cmlkZSA9IG1ldGFfc3RyaWRlOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5tZXRhX3NjYW5saW5lID0gbWV0YV9zY2FubGluZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubWV0YV9sZW4gPQorICAgICAgICAgICAgICAgICAgICBNU01fTUVESUFfQUxJR04obWV0YV9zdHJpZGUgKiBtZXRhX3NjYW5saW5lLCA0MDk2KTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0KKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShNU01fTUVESUFfQUxJR04oKHN0cmlkZSAqIHNjYW5saW5lKSwgNDA5NikgKworICAgICAgICAgICAgICAgICAgICAoYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5tZXRhX2xlbikpOworCisgICAgICAgICAgICBzdHJpZGUgPSBWRU5VU19VVl9TVFJJREUoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT53aWR0aCk7CisgICAgICAgICAgICBzY2FubGluZSA9IFZFTlVTX1VWX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPmhlaWdodCk7CisgICAgICAgICAgICBtZXRhX3N0cmlkZSA9IFZFTlVTX1VWX01FVEFfU1RSSURFKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+d2lkdGgpOworICAgICAgICAgICAgbWV0YV9zY2FubGluZSA9IFZFTlVTX1VWX01FVEFfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+aGVpZ2h0KTsKKworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXQgPSAwOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3kgPSAwOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uaGVpZ2h0ID0gZGltLT5oZWlnaHQvMjsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubWV0YV9zdHJpZGUgPSBtZXRhX3N0cmlkZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubWV0YV9zY2FubGluZSA9IG1ldGFfc2NhbmxpbmU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm1ldGFfbGVuID0KKyAgICAgICAgICAgICAgICAgICAgTVNNX01FRElBX0FMSUdOKG1ldGFfc3RyaWRlICogbWV0YV9zY2FubGluZSwgNDA5Nik7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiA9CisgICAgICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuIC0gYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW47CisKKyNlbHNlCisgICAgICAgICAgICBMT0dEKCJWaWRlbyBmb3JtYXQgVUJXQyBpcyBub3Qgc3VwcG9ydGVkID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgZm10KTsKKyAgICAgICAgICAgIHJjID0gLTE7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HRCgiSW52YWxpZCBWaWRlbyBGb3JtYXQgPSAlZCIsIGZtdCk7CisgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fY2FsY19vZmZzZXRfbWV0YWRhdGEKKyAqCisgKiBERVNDUklQVElPTjogY2FsY3VsYXRlIG1ldGFkYXRhIGZyYW1lIG9mZnNldCBiYXNlZCBvbiBmb3JtYXQgYW5kCisgKiAgICAgICAgICAgICAgcGFkZGluZyBpbmZvcm1hdGlvbgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGltICAgICA6IGltYWdlIGRpbWVuc2lvbgorICogICBAcGFkZGluZyA6IHBhZGRpbmcgaW5mb3JtYXRpb24KKyAqICAgQGJ1Zl9wbGFuZXMgOiBbb3V0XSBidWZmZXIgcGxhbmUgaW5mb3JtYXRpb24KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X21ldGFkYXRhKGNhbV9kaW1lbnNpb25fdCAqZGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3BhZGRpbmdfaW5mb190ICpwYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV9idWZfcGxhbmVfaW5mb190ICpidWZfcGxhbmVzKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDE7CisgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXQgPSAwOworICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0KKyAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkoZGltLT53aWR0aCAqIGRpbS0+aGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgcGFkZGluZy0+cGxhbmVfcGFkZGluZyk7CisgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbjsKKworICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPTA7CisgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUgPSBkaW0tPndpZHRoOworICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUgPSBkaW0tPmhlaWdodDsKKyAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fY2FsY19vZmZzZXRfYW5hbHlzaXMKKyAqCisgKiBERVNDUklQVElPTjogY2FsY3VsYXRlIGFuYWx5c2lzIGZyYW1lIG9mZnNldCBiYXNlZCBvbiBmb3JtYXQgYW5kCisgKiAgICAgICAgICAgICAgcGFkZGluZyBpbmZvcm1hdGlvbgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZm10ICAgICA6IGltYWdlIGZvcm1hdAorICogICBAZGltICAgICA6IGltYWdlIGRpbWVuc2lvbgorICogICBAcGFkZGluZyA6IHBhZGRpbmcgaW5mb3JtYXRpb24KKyAqICAgQGJ1Zl9wbGFuZXMgOiBbb3V0XSBidWZmZXIgcGxhbmUgaW5mb3JtYXRpb24KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X2FuYWx5c2lzKGNhbV9mb3JtYXRfdCBmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZGltZW5zaW9uX3QgKmRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9wYWRkaW5nX2luZm9fdCAqcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9zdHJlYW1fYnVmX3BsYW5lX2luZm9fdCAqYnVmX3BsYW5lcykKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBpbnQzMl90IG9mZnNldF94ID0gMCwgb2Zmc2V0X3kgPSAwOworICAgIGludDMyX3Qgc3RyaWRlLCBzY2FubGluZTsKKworICAgIC8qIENsaXAgdG8gbWluaW11bSBzdXBwb3J0ZWQgYnl0ZXMgcGVyIGxpbmUgKi8KKyAgICBpZiAoKHVpbnQzMl90KWRpbS0+d2lkdGggPCBwYWRkaW5nLT5taW5fc3RyaWRlKSB7CisgICAgICAgIHN0cmlkZSA9IChpbnQzMl90KXBhZGRpbmctPm1pbl9zdHJpZGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyaWRlID0gZGltLT53aWR0aDsKKyAgICB9CisKKyAgICBpZiAoKHVpbnQzMl90KWRpbS0+aGVpZ2h0IDwgcGFkZGluZy0+bWluX3NjYW5saW5lKSB7CisgICAgICBzY2FubGluZSA9IChpbnQzMl90KXBhZGRpbmctPm1pbl9zY2FubGluZTsKKyAgICB9IGVsc2UgeworICAgICAgc2NhbmxpbmUgPSBkaW0tPmhlaWdodDsKKyAgICB9CisKKyAgICBzdHJpZGUgPSBQQURfVE9fU0laRShzdHJpZGUsIHBhZGRpbmctPndpZHRoX3BhZGRpbmcpOworICAgIHNjYW5saW5lID0gUEFEX1RPX1NJWkUoc2NhbmxpbmUsIHBhZGRpbmctPmhlaWdodF9wYWRkaW5nKTsKKworICAgIHN3aXRjaCAoZm10KSB7CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMjoKKyAgICBjYXNlIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxOgorICAgICAgICAvKiAyIHBsYW5lczogWSArIENiQ3IgKi8KKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5udW1fcGxhbmVzID0gMjsKKworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXQgPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkob2Zmc2V0X3ggKyBzdHJpZGUgKiBvZmZzZXRfeSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9IG9mZnNldF94OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF95ID0gb2Zmc2V0X3k7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworCisgICAgICAgIHNjYW5saW5lID0gc2NhbmxpbmUgLyAyOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXQgPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkob2Zmc2V0X3ggKyBzdHJpZGUgKiBvZmZzZXRfeSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeCA9IG9mZnNldF94OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF95ID0gb2Zmc2V0X3k7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmhlaWdodCA9IGRpbS0+aGVpZ2h0IC8gMjsKKworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gKworICAgICAgICAgICAgICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBDQU1fUEFEX1RPXzRLKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfWVYxMjoKKyAgICAgICAgLyogMyBwbGFuZXM6IFkgKyBDciArIENiICovCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDM7CisKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXQgPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkob2Zmc2V0X3ggKyBzdHJpZGUgKiBvZmZzZXRfeSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy0+cGxhbmVfcGFkZGluZyk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPSBvZmZzZXRfeDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IG9mZnNldF95OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKworICAgICAgICBzdHJpZGUgPSBQQURfVE9fU0laRShzdHJpZGUgLyAyLCBDQU1fUEFEX1RPXzE2KTsKKyAgICAgICAgc2NhbmxpbmUgPSBzY2FubGluZSAvIDI7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0ID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKG9mZnNldF94ICsgc3RyaWRlICogb2Zmc2V0X3kpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy0+cGxhbmVfcGFkZGluZyk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctPnBsYW5lX3BhZGRpbmcpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF94ID0gb2Zmc2V0X3g7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3kgPSBvZmZzZXRfeTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS53aWR0aCA9IGRpbS0+d2lkdGggLyAyOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmhlaWdodCA9IGRpbS0+aGVpZ2h0IC8gMjsKKworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzJdLm9mZnNldCA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShvZmZzZXRfeCArIHN0cmlkZSAqIG9mZnNldF95KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctPnBsYW5lX3BhZGRpbmcpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzJdLmxlbiA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsyXS5vZmZzZXRfeCA9IG9mZnNldF94OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzJdLm9mZnNldF95ID0gb2Zmc2V0X3k7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMl0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzJdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMl0ud2lkdGggPSBkaW0tPndpZHRoIC8gMjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsyXS5oZWlnaHQgPSBkaW0tPmhlaWdodCAvIDI7CisKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMl0ubGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1BBRF9UT180Syk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZVVZfNDIyX05WMTY6CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjJfTlY2MToKKyAgICAgICAgLyogMiBwbGFuZXM6IFkgKyBDYkNyICovCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDI7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctPnBsYW5lX3BhZGRpbmcpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9CisgICAgICAgICAgICAgICAgUEFEX1RPX1NJWkUoKHVpbnQzMl90KShvZmZzZXRfeCArIHN0cmlkZSAqIG9mZnNldF95KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmctPnBsYW5lX3BhZGRpbmcpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF94ID0gb2Zmc2V0X3g7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3kgPSBvZmZzZXRfeTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uaGVpZ2h0ID0gZGltLT5oZWlnaHQ7CisKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkoc3RyaWRlICogc2NhbmxpbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy0+cGxhbmVfcGFkZGluZyk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0ID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKG9mZnNldF94ICsgc3RyaWRlICogb2Zmc2V0X3kpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZy0+cGxhbmVfcGFkZGluZyk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ub2Zmc2V0X3ggPSBvZmZzZXRfeDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeSA9IG9mZnNldF95OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbiA9IFBBRF9UT19TSVpFKAorICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW4gKyBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiwKKyAgICAgICAgICAgIENBTV9QQURfVE9fNEspOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9GT1JNQVRfWV9PTkxZOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZX09OTFlfMTBfQlBQOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZX09OTFlfMTJfQlBQOgorICAgIGNhc2UgQ0FNX0ZPUk1BVF9ZX09OTFlfMTRfQlBQOgorICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm51bV9wbGFuZXMgPSAxOworCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0KKyAgICAgICAgICAgICAgICBQQURfVE9fU0laRSgodWludDMyX3QpKHN0cmlkZSAqIHNjYW5saW5lKSwKKyAgICAgICAgICAgICAgICBwYWRkaW5nLT5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXQgPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKCh1aW50MzJfdCkob2Zmc2V0X3ggKyBzdHJpZGUgKiBvZmZzZXRfeSksCisgICAgICAgICAgICAgICAgcGFkZGluZy0+cGxhbmVfcGFkZGluZyk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0X3ggPSBvZmZzZXRfeDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IG9mZnNldF95OworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zY2FubGluZSA9IHNjYW5saW5lOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLndpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgIFBBRF9UT19TSVpFKGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuLCBDQU1fUEFEX1RPXzRLKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9WRU5VUzoKKyNpZmRlZiBWRU5VU19QUkVTRU5UCisgICAgICAgIC8vIHVzaW5nIFZlbnVzCisgICAgICAgIHN0cmlkZSA9IFZFTlVTX1lfU1RSSURFKENPTE9SX0ZNVF9OVjEyLCBkaW0tPndpZHRoKTsKKyAgICAgICAgc2NhbmxpbmUgPSBWRU5VU19ZX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMiwgZGltLT5oZWlnaHQpOworCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuID0KKyAgICAgICAgICAgICAgICBWRU5VU19CVUZGRVJfU0laRShDT0xPUl9GTVRfTlYxMiwgc3RyaWRlLCBzY2FubGluZSk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDI7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0gKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworICAgICAgICBzdHJpZGUgPSBWRU5VU19VVl9TVFJJREUoQ09MT1JfRk1UX05WMTIsIGRpbS0+d2lkdGgpOworICAgICAgICBzY2FubGluZSA9IFZFTlVTX1VWX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMiwgZGltLT5oZWlnaHQpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiA9CisgICAgICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gLSBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF94ID0wOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uaGVpZ2h0ID0gZGltLT5oZWlnaHQgLyAyOworI2Vsc2UKKyAgICAgICAgTE9HRSgiVmVudXMgaGFyZHdhcmUgbm90IGF2YWlsLCBjYW5ub3QgdXNlIHRoaXMgZm9ybWF0Iik7CisgICAgICAgIHJjID0gLTE7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYyMV9WRU5VUzoKKyNpZmRlZiBWRU5VU19QUkVTRU5UCisgICAgICAgIC8vIHVzaW5nIFZlbnVzCisgICAgICAgIHN0cmlkZSA9IFZFTlVTX1lfU1RSSURFKENPTE9SX0ZNVF9OVjIxLCBkaW0tPndpZHRoKTsKKyAgICAgICAgc2NhbmxpbmUgPSBWRU5VU19ZX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYyMSwgZGltLT5oZWlnaHQpOworCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8uZnJhbWVfbGVuID0KKyAgICAgICAgICAgICAgICBWRU5VU19CVUZGRVJfU0laRShDT0xPUl9GTVRfTlYyMSwgc3RyaWRlLCBzY2FubGluZSk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDI7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuID0gKHVpbnQzMl90KShzdHJpZGUgKiBzY2FubGluZSk7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeCA9MDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc3RyaWRlID0gc3RyaWRlOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnNjYW5saW5lID0gc2NhbmxpbmU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmhlaWdodCA9IGRpbS0+aGVpZ2h0OworICAgICAgICBzdHJpZGUgPSBWRU5VU19VVl9TVFJJREUoQ09MT1JfRk1UX05WMjEsIGRpbS0+d2lkdGgpOworICAgICAgICBzY2FubGluZSA9IFZFTlVTX1VWX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYyMSwgZGltLT5oZWlnaHQpOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLmxlbiA9CisgICAgICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gLSBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbjsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXQgPSAwOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF94ID0wOworICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF95ID0gMDsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS53aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uaGVpZ2h0ID0gZGltLT5oZWlnaHQgLyAyOworI2Vsc2UKKyAgICAgICAgTE9HRSgiVmVudXMgaGFyZHdhcmUgbm90IGF2YWlsLCBjYW5ub3QgdXNlIHRoaXMgZm9ybWF0Iik7CisgICAgICAgIHJjID0gLTE7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMl9VQldDOgorI2lmZGVmIFVCV0NfUFJFU0VOVAorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWV0YV9zdHJpZGUgPSAwLG1ldGFfc2NhbmxpbmUgPSAwOworICAgICAgICAgICAgLy8gdXNpbmcgVUJXQworICAgICAgICAgICAgc3RyaWRlID0gVkVOVVNfWV9TVFJJREUoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT53aWR0aCk7CisgICAgICAgICAgICBzY2FubGluZSA9IFZFTlVTX1lfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+aGVpZ2h0KTsKKyAgICAgICAgICAgIG1ldGFfc3RyaWRlID0gVkVOVVNfWV9NRVRBX1NUUklERShDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPndpZHRoKTsKKyAgICAgICAgICAgIG1ldGFfc2NhbmxpbmUgPSBWRU5VU19ZX01FVEFfU0NBTkxJTkVTKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+aGVpZ2h0KTsKKworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPQorICAgICAgICAgICAgICAgICAgICBWRU5VU19CVUZGRVJfU0laRShDT0xPUl9GTVRfTlYxMl9VQldDLCBzdHJpZGUsIHNjYW5saW5lKTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubnVtX3BsYW5lcyA9IDI7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldCA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm9mZnNldF94ID0wOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5vZmZzZXRfeSA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5oZWlnaHQgPSBkaW0tPmhlaWdodDsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubWV0YV9zdHJpZGUgPSBtZXRhX3N0cmlkZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubWV0YV9zY2FubGluZSA9IG1ldGFfc2NhbmxpbmU7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLm1ldGFfbGVuID0KKyAgICAgICAgICAgICAgICAgICAgTVNNX01FRElBX0FMSUdOKG1ldGFfc3RyaWRlICogbWV0YV9zY2FubGluZSwgNDA5Nik7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbiA9CisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoTVNNX01FRElBX0FMSUdOKChzdHJpZGUgKiBzY2FubGluZSksIDQwOTYpICsKKyAgICAgICAgICAgICAgICAgICAgKGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubWV0YV9sZW4pKTsKKworICAgICAgICAgICAgc3RyaWRlID0gVkVOVVNfVVZfU1RSSURFKENPTE9SX0ZNVF9OVjEyX1VCV0MsIGRpbS0+d2lkdGgpOworICAgICAgICAgICAgc2NhbmxpbmUgPSBWRU5VU19VVl9TQ0FOTElORVMoQ09MT1JfRk1UX05WMTJfVUJXQywgZGltLT5oZWlnaHQpOworICAgICAgICAgICAgbWV0YV9zdHJpZGUgPSBWRU5VU19VVl9NRVRBX1NUUklERShDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPndpZHRoKTsKKyAgICAgICAgICAgIG1ldGFfc2NhbmxpbmUgPSBWRU5VU19VVl9NRVRBX1NDQU5MSU5FUyhDT0xPUl9GTVRfTlYxMl9VQldDLCBkaW0tPmhlaWdodCk7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldCA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLm9mZnNldF94ID0wOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5vZmZzZXRfeSA9IDA7CisgICAgICAgICAgICBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzFdLnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0uc2NhbmxpbmUgPSBzY2FubGluZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ud2lkdGggPSBkaW0tPndpZHRoOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5oZWlnaHQgPSBkaW0tPmhlaWdodC8yOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5tZXRhX3N0cmlkZSA9IG1ldGFfc3RyaWRlOworICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFsxXS5tZXRhX3NjYW5saW5lID0gbWV0YV9zY2FubGluZTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubWV0YV9sZW4gPQorICAgICAgICAgICAgICAgICAgICBNU01fTUVESUFfQUxJR04obWV0YV9zdHJpZGUgKiBtZXRhX3NjYW5saW5lLCA0MDk2KTsKKyAgICAgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMV0ubGVuID0KKyAgICAgICAgICAgICAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gLSBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLm1wWzBdLmxlbjsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgTE9HRSgiVUJXQyBoYXJkd2FyZSBub3QgYXZhaWwsIGNhbm5vdCB1c2UgdGhpcyBmb3JtYXQiKTsKKyAgICAgICAgcmMgPSAtMTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJJbnZhbGlkIGNhbV9mb3JtYXQgZm9yIGFubHlzaXMgJWQiLAorICAgICAgICAgICAgICAgICAgICBmbXQpOworICAgICAgICByYyA9IC0xOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3Bvc3Rwcm9jCisgKgorICogREVTQ1JJUFRJT046IGNhbGN1bGF0ZSBwb3N0cHJvY2VzcyBmcmFtZSBvZmZzZXQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHN0cmVhbV9pbmZvOiBwdHIgdG8gc3RyZWFtIGluZm8KKyAqICAgQHBhZGRpbmcgOiBwYWRkaW5nIGluZm9ybWF0aW9uCisgKiAgIEBwbG5zIDogW291dF0gYnVmZmVyIHBsYW5lIGluZm9ybWF0aW9uCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9jYWxjX29mZnNldF9wb3N0cHJvYyhjYW1fc3RyZWFtX2luZm9fdCAqc3RyZWFtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fcGFkZGluZ19pbmZvX3QgKnBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX2J1Zl9wbGFuZV9pbmZvX3QgKnBsbnMpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgY2FtX3N0cmVhbV90eXBlX3QgdHlwZSA9IENBTV9TVFJFQU1fVFlQRV9ERUZBVUxUOworICAgIGlmIChzdHJlYW1faW5mby0+cmVwcm9jZXNzX2NvbmZpZy5wcF90eXBlID09IENBTV9PRkZMSU5FX1JFUFJPQ0VTU19UWVBFKSB7CisgICAgICAgIHR5cGUgPSBzdHJlYW1faW5mby0+cmVwcm9jZXNzX2NvbmZpZy5vZmZsaW5lLmlucHV0X3R5cGU7CisgICAgICAgIGlmIChDQU1fU1RSRUFNX1RZUEVfREVGQVVMVCA9PSB0eXBlKSB7CisgICAgICAgICAgICBpZiAocGxucy0+cGxhbmVfaW5mby5mcmFtZV9sZW4gPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIHRha2Ugb2Zmc2V0IGZyb20gaW5wdXQgc291cmNlCisgICAgICAgICAgICAgICAgKnBsbnMgPSBzdHJlYW1faW5mby0+cmVwcm9jZXNzX2NvbmZpZy5vZmZsaW5lLmlucHV0X2J1Zl9wbGFuZXM7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHlwZSA9IHN0cmVhbV9pbmZvLT5yZXByb2Nlc3NfY29uZmlnLm9mZmxpbmUuaW5wdXRfdHlwZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHR5cGUgPSBzdHJlYW1faW5mby0+cmVwcm9jZXNzX2NvbmZpZy5vbmxpbmUuaW5wdXRfc3RyZWFtX3R5cGU7CisgICAgfQorCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzoKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fY2FsY19vZmZzZXRfcHJldmlldyhzdHJlYW1faW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtX2luZm8tPmRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsbnMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVzoKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fY2FsY19vZmZzZXRfcG9zdF92aWV3KHN0cmVhbV9pbmZvLT5mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbV9pbmZvLT5kaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxucyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UOgorICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX0NBTExCQUNLOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9jYWxjX29mZnNldF9zbmFwc2hvdChzdHJlYW1faW5mby0+Zm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtX2luZm8tPmRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxucyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1ZJREVPOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9jYWxjX29mZnNldF92aWRlbyhzdHJlYW1faW5mby0+Zm10LAorICAgICAgICAgICAgICAgICZzdHJlYW1faW5mby0+ZGltLCBwbG5zKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUkFXOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9jYWxjX29mZnNldF9yYXcoc3RyZWFtX2luZm8tPmZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW1faW5mby0+ZGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsbnMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9BTkFMWVNJUzoKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fY2FsY19vZmZzZXRfYW5hbHlzaXMoc3RyZWFtX2luZm8tPmZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbV9pbmZvLT5kaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsbnMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQToKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fY2FsY19vZmZzZXRfbWV0YWRhdGEoJnN0cmVhbV9pbmZvLT5kaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsbnMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0M6CisgICAgICAgIHJjID0gbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3NuYXBzaG90KHN0cmVhbV9pbmZvLT5mbXQsCisgICAgICAgICAgICAgICAgJnN0cmVhbV9pbmZvLT5kaW0sIHBhZGRpbmcsIHBsbnMpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dFKCJub3Qgc3VwcG9ydGVkIGZvciBzdHJlYW0gdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgICAgIHR5cGUpOworICAgICAgICByYyA9IC0xOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBGVU5DVElPTiAgICA6IG1tX3N0cmVhbV9jYWxjX2xjbQorKgorKiBERVNDUklQVElPTjogY2FsY3VsYXRlIExDTSBvZiB0d28gbnVtYmVycworKgorKiBQQVJBTUVURVJTIDoKKyogICBAbnVtMSAgOiBudW1iZXIgMQorKiAgIEBudW0yICA6IG51bWJlciAyCisqCisqIFJFVFVSTiAgICAgOiB1aW50MzJfdCB0eXBlCisqCisqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQzMl90IG1tX3N0cmVhbV9jYWxjX2xjbShpbnQzMl90IG51bTEsIGludDMyX3QgbnVtMikKK3sKKyAgICB1aW50MzJfdCBsY20gPSAwOworICAgIHVpbnQzMl90IHRlbXAgPSAwOworCisgICAgaWYgKChudW0xIDwgMSkgJiYgKG51bTIgPCAxKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKG51bTEgPCAxKSB7CisgICAgICAgIHJldHVybiBudW0yOworICAgIH0gZWxzZSBpZiAobnVtMiA8IDEpIHsKKyAgICAgICAgcmV0dXJuIG51bTE7CisgICAgfQorCisgICAgaWYgKG51bTEgPiBudW0yKSB7CisgICAgICAgIGxjbSA9IG51bTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGNtID0gbnVtMjsKKyAgICB9CisgICAgdGVtcCA9IGxjbTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICgoKGxjbSVudW0xKSA9PSAwKSAmJiAoKGxjbSVudW0yKSA9PSAwKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbGNtICs9IHRlbXA7CisgICAgfQorICAgIHJldHVybiBsY207Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX2NhbGNfb2Zmc2V0CisgKgorICogREVTQ1JJUFRJT046IGNhbGN1bGF0ZSBmcmFtZSBvZmZzZXQgYmFzZWQgb24gZm9ybWF0IGFuZCBwYWRkaW5nIGluZm9ybWF0aW9uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBteV9vYmogIDogc3RyZWFtIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9zdHJlYW1fY2FsY19vZmZzZXQobW1fc3RyZWFtX3QgKm15X29iaikKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKworICAgIGNhbV9kaW1lbnNpb25fdCBkaW0gPSBteV9vYmotPnN0cmVhbV9pbmZvLT5kaW07CisgICAgaWYgKG15X29iai0+c3RyZWFtX2luZm8tPnBwX2NvbmZpZy5mZWF0dXJlX21hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX1JPVEFUSU9OICYmCisgICAgICAgIG15X29iai0+c3RyZWFtX2luZm8tPnN0cmVhbV90eXBlICE9IENBTV9TVFJFQU1fVFlQRV9WSURFTykgeworICAgICAgICBpZiAobXlfb2JqLT5zdHJlYW1faW5mby0+cHBfY29uZmlnLnJvdGF0aW9uID09IFJPVEFURV85MCB8fAorICAgICAgICAgICAgbXlfb2JqLT5zdHJlYW1faW5mby0+cHBfY29uZmlnLnJvdGF0aW9uID09IFJPVEFURV8yNzApIHsKKyAgICAgICAgICAgIC8vIHJvdGF0ZWQgYnkgOTAgb3IgMjcwLCBuZWVkIHRvIHN3aXRjaCB3aWR0aCBhbmQgaGVpZ2h0CisgICAgICAgICAgICBkaW0ud2lkdGggPSBteV9vYmotPnN0cmVhbV9pbmZvLT5kaW0uaGVpZ2h0OworICAgICAgICAgICAgZGltLmhlaWdodCA9IG15X29iai0+c3RyZWFtX2luZm8tPmRpbS53aWR0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAobXlfb2JqLT5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUpIHsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9jYWxjX29mZnNldF9wcmV2aWV3KG15X29iai0+c3RyZWFtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXlfb2JqLT5wYWRkaW5nX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm15X29iai0+c3RyZWFtX2luZm8tPmJ1Zl9wbGFuZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVzoKKyAgICAgIHJjID0gbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3Bvc3RfdmlldyhteV9vYmotPnN0cmVhbV9pbmZvLT5mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZteV9vYmotPnN0cmVhbV9pbmZvLT5idWZfcGxhbmVzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UOgorICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX0NBTExCQUNLOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9jYWxjX29mZnNldF9zbmFwc2hvdChteV9vYmotPnN0cmVhbV9pbmZvLT5mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZteV9vYmotPnBhZGRpbmdfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm15X29iai0+c3RyZWFtX2luZm8tPmJ1Zl9wbGFuZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9PRkZMSU5FX1BST0M6CisgICAgICAgIHJjID0gbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X3Bvc3Rwcm9jKG15X29iai0+c3RyZWFtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZteV9vYmotPnBhZGRpbmdfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm15X29iai0+c3RyZWFtX2luZm8tPmJ1Zl9wbGFuZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENBTV9TVFJFQU1fVFlQRV9WSURFTzoKKyAgICAgICAgcmMgPSBtbV9zdHJlYW1fY2FsY19vZmZzZXRfdmlkZW8obXlfb2JqLT5zdHJlYW1faW5mby0+Zm10LAorICAgICAgICAgICAgICAgICZkaW0sICZteV9vYmotPnN0cmVhbV9pbmZvLT5idWZfcGxhbmVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfUkFXOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9jYWxjX29mZnNldF9yYXcobXlfb2JqLT5zdHJlYW1faW5mby0+Zm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZteV9vYmotPnBhZGRpbmdfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZteV9vYmotPnN0cmVhbV9pbmZvLT5idWZfcGxhbmVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDQU1fU1RSRUFNX1RZUEVfQU5BTFlTSVM6CisgICAgICAgIHJjID0gbW1fc3RyZWFtX2NhbGNfb2Zmc2V0X2FuYWx5c2lzKG15X29iai0+c3RyZWFtX2luZm8tPmZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm15X29iai0+cGFkZGluZ19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXlfb2JqLT5zdHJlYW1faW5mby0+YnVmX3BsYW5lcyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBOgorICAgICAgICByYyA9IG1tX3N0cmVhbV9jYWxjX29mZnNldF9tZXRhZGF0YSgmZGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXlfb2JqLT5wYWRkaW5nX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZteV9vYmotPnN0cmVhbV9pbmZvLT5idWZfcGxhbmVzKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HRSgibm90IHN1cHBvcnRlZCBmb3Igc3RyZWFtIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgICAgICBteV9vYmotPnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSk7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIG15X29iai0+ZnJhbWVfb2Zmc2V0ID0gbXlfb2JqLT5zdHJlYW1faW5mby0+YnVmX3BsYW5lcy5wbGFuZV9pbmZvOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fc3luY19pbmZvCisgKgorICogREVTQ1JJUFRJT046IHN5bmNocm9uaXplIHN0cmVhbSBpbmZvcm1hdGlvbiB3aXRoIHNlcnZlcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICA6IHN0cmVhbSBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKiBOT1RFICAgICAgIDogYXNzdW1lIHN0cmVhbSBpbmZvIGJ1ZmZlciBpcyBtYXBwZWQgdG8gc2VydmVyIGFuZCBmaWxsZWQgaW4gd2l0aAorICogICAgICAgICAgICAgIHN0cmVhbSBpbmZvcm1hdGlvbiBieSB1cHBlciBsYXllci4gVGhpcyBjYWxsIHdpbGwgbGV0IHNlcnZlciB0bworICogICAgICAgICAgICAgIHN5bmNob3JuaXplIHRoZSBzdHJlYW0gaW5mb3JtYXRpb24gd2l0aCBIQUwuIElmIHNlcnZlciBmaW5kIGFueQorICogICAgICAgICAgICAgIGZpZWxkcyB0aGF0IG5lZWQgdG8gYmUgY2hhbmdlZCBhY2Nyb2RpbmcgdG8gaGFyZHdhcmUgY29uZmlndXJhdGlvbiwKKyAqICAgICAgICAgICAgICBzZXJ2ZXIgd2lsbCBtb2RpZnkgY29ycmVzcG9uZGluZyBmaWVsZHMgc28gdGhhdCBIQUwgY291bGQga25vdworICogICAgICAgICAgICAgIGFib3V0IGl0LgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9zeW5jX2luZm8obW1fc3RyZWFtX3QgKm15X29iaikKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBpbnQzMl90IHZhbHVlID0gMDsKKyAgICBteV9vYmotPnN0cmVhbV9pbmZvLT5zdHJlYW1fc3ZyX2lkID0gbXlfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkOworICAgIHJjID0gbW1fc3RyZWFtX2NhbGNfb2Zmc2V0KG15X29iaik7CisKKyAgICBpZiAocmMgPT0gMCkgeworICAgICAgICBtbV9jYW1lcmFfb2JqX3QgKmNhbV9vYmogPSBteV9vYmotPmNoX29iai0+Y2FtX29iajsKKyAgICAgICAgaW50IHN0cmVhbV9pZCAgPSAgbXlfb2JqLT5zZXJ2ZXJfc3RyZWFtX2lkOworICAgICAgICByYyA9IG1tX2NhbWVyYV91dGlsX3NfY3RybChjYW1fb2JqLCBzdHJlYW1faWQsIG15X29iai0+ZmQsCisgICAgICAgICAgICAgICAgQ0FNX1BSSVZfU1RSRUFNX0lORk9fU1lOQywgJnZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX3N0cmVhbV9zZXRfZm10CisgKgorICogREVTQ1JJUFRJT046IHNldCBzdHJlYW0gZm9ybWF0IHRvIGtlcm5lbCB2aWEgdjRsMiBpb2N0bAorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbXlfb2JqICA6IHN0cmVhbSBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX3NldF9mbXQobW1fc3RyZWFtX3QgKm15X29iaikKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm10OworICAgIHN0cnVjdCBtc21fdjRsMl9mb3JtYXRfZGF0YSBtc21fZm10OworICAgIGludCBpOworICAgIExPR0QoIkUsIG15X2hhbmRsZSA9IDB4JXgsIGZkID0gJWQsIHN0YXRlID0gJWQiLAorICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlKTsKKworICAgIGlmIChteV9vYmotPnN0cmVhbV9pbmZvLT5kaW0ud2lkdGggPT0gMCB8fAorICAgICAgICBteV9vYmotPnN0cmVhbV9pbmZvLT5kaW0uaGVpZ2h0ID09IDApIHsKKyAgICAgICAgTE9HRSgiaW52YWxpZCBpbnB1dFt3PSVkLGg9JWQsZm10PSVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICBteV9vYmotPnN0cmVhbV9pbmZvLT5kaW0ud2lkdGgsCisgICAgICAgICAgICAgICAgICAgbXlfb2JqLT5zdHJlYW1faW5mby0+ZGltLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBteV9vYmotPnN0cmVhbV9pbmZvLT5mbXQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbWVtc2V0KCZmbXQsIDAsIHNpemVvZihmbXQpKTsKKyAgICBtZW1zZXQoJm1zbV9mbXQsIDAsIHNpemVvZihtc21fZm10KSk7CisgICAgZm10LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FOworICAgIG1zbV9mbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7CisKKyAgICBtc21fZm10LndpZHRoID0gKHVuc2lnbmVkIGludClteV9vYmotPnN0cmVhbV9pbmZvLT5kaW0ud2lkdGg7CisgICAgbXNtX2ZtdC5oZWlnaHQgPSAodW5zaWduZWQgaW50KW15X29iai0+c3RyZWFtX2luZm8tPmRpbS5oZWlnaHQ7CisgICAgbXNtX2ZtdC5waXhlbGZvcm1hdCA9IG1tX3N0cmVhbV9nZXRfdjRsMl9mbXQobXlfb2JqLT5zdHJlYW1faW5mby0+Zm10KTsKKworICAgIGlmIChteV9vYmotPnN0cmVhbV9pbmZvLT5zdHJlYW1pbmdfbW9kZSAhPSBDQU1fU1RSRUFNSU5HX01PREVfQkFUQ0gpIHsKKyAgICAgICAgbXNtX2ZtdC5udW1fcGxhbmVzID0gKHVuc2lnbmVkIGNoYXIpbXlfb2JqLT5mcmFtZV9vZmZzZXQubnVtX3BsYW5lczsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1zbV9mbXQubnVtX3BsYW5lczsgaSsrKSB7CisgICAgICAgICAgICBtc21fZm10LnBsYW5lX3NpemVzW2ldID0gbXlfb2JqLT5mcmFtZV9vZmZzZXQubXBbaV0ubGVuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXNtX2ZtdC5udW1fcGxhbmVzID0gMTsKKyAgICAgICAgbXNtX2ZtdC5wbGFuZV9zaXplc1swXSA9IG15X29iai0+c3RyZWFtX2luZm8tPnVzZXJfYnVmX2luZm8uc2l6ZTsKKyAgICB9CisKKyAgICBtZW1jcHkoZm10LmZtdC5yYXdfZGF0YSwgJm1zbV9mbXQsIHNpemVvZihtc21fZm10KSk7CisgICAgcmMgPSBpb2N0bChteV9vYmotPmZkLCBWSURJT0NfU19GTVQsICZmbXQpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgICAgTE9HRSgiaW9jdGwgVklESU9DX1NfRk1UIGZhaWxlZDogcmM9JWQgZXJybm8gJWRcbiIsIHJjLCBlcnJubyk7CisgICAgfSBlbHNlIHsKKyNpZm5kZWYgREFFTU9OX1BSRVNFTlQKKyAgICAgICAgbW1fY2FtZXJhX29ial90ICpjYW1fb2JqID0gbXlfb2JqLT5jaF9vYmotPmNhbV9vYmo7CisgICAgICAgIGNhbV9zaGltX3BhY2tldF90ICpzaGltX2NtZDsKKyAgICAgICAgY2FtX3NoaW1fY21kX2RhdGEgc2hpbV9jbWRfZGF0YTsKKworICAgICAgICBtZW1zZXQoJnNoaW1fY21kX2RhdGEsIDAsIHNpemVvZihzaGltX2NtZF9kYXRhKSk7CisgICAgICAgIHNoaW1fY21kX2RhdGEuY29tbWFuZCA9IE1TTV9DQU1FUkFfUFJJVl9TX0ZNVDsKKyAgICAgICAgc2hpbV9jbWRfZGF0YS5zdHJlYW1faWQgPSBteV9vYmotPnNlcnZlcl9zdHJlYW1faWQ7CisgICAgICAgIHNoaW1fY21kX2RhdGEudmFsdWUgPSBOVUxMOworICAgICAgICBzaGltX2NtZCA9IG1tX2NhbWVyYV9jcmVhdGVfc2hpbV9jbWRfcGFja2V0KENBTV9TSElNX1NFVF9QQVJNLAorICAgICAgICAgICAgICAgIGNhbV9vYmotPnNlc3Npb25pZCwgJnNoaW1fY21kX2RhdGEpOworICAgICAgICByYyA9IG1tX2NhbWVyYV9tb2R1bGVfc2VuZF9jbWQoc2hpbV9jbWQpOworICAgICAgICBtbV9jYW1lcmFfZGVzdHJveV9zaGltX2NtZF9wYWNrZXQoc2hpbV9jbWQpOworI2VuZGlmIC8qIERBRU1PTl9QUkVTRU5UICovCisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fYnVmX2RvbmUKKyAqCisgKiBERVNDUklQVElPTjogZW5xdWV1ZSBidWZmZXIgYmFjayB0byBrZXJuZWwKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IHN0cmVhbSBvYmplY3QKKyAqICAgQGZyYW1lICAgICAgICA6IGZyYW1lIHRvIGJlIGVucXVldWVkIGJhY2sgdG8ga2VybmVsCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAwICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgLTEgLS0gZmFpbHVyZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9idWZfZG9uZShtbV9zdHJlYW1fdCAqIG15X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIExPR0QoIkUsIG15X2hhbmRsZSA9IDB4JXgsIGZkID0gJWQsIHN0YXRlID0gJWQiLAorICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5idWZfbG9jayk7CisgICAgaWYobXlfb2JqLT5idWZfc3RhdHVzW2ZyYW1lLT5idWZfaWR4XS5idWZfcmVmY250ID09IDApIHsKKyAgICAgICAgTE9HVygiV2FybmluZzogdHJ5aW5nIHRvIGZyZWUgYnVmZmVyIGZvciB0aGUgc2Vjb25kIHRpbWU/KGlkeD0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5idWZfaWR4KTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+YnVmX2xvY2spOworICAgICAgICByYyA9IC0xOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICBpZiAobXlfb2JqLT5zdHJlYW1faW5mby0+c3RyZWFtaW5nX21vZGUgPT0gQ0FNX1NUUkVBTUlOR19NT0RFX0JBVENIKSB7CisgICAgICAgIHJjID0gbW1fc3RyZWFtX3dyaXRlX3VzZXJfYnVmKG15X29iaiwgZnJhbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5idWZfbG9jayk7CisgICAgICAgIG15X29iai0+YnVmX3N0YXR1c1tmcmFtZS0+YnVmX2lkeF0uYnVmX3JlZmNudC0tOworICAgICAgICBpZiAoMCA9PSBteV9vYmotPmJ1Zl9zdGF0dXNbZnJhbWUtPmJ1Zl9pZHhdLmJ1Zl9yZWZjbnQpIHsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICAgICAgICAgIExPR0QoIjxERUJVRz4gOiBCdWYgZG9uZSBmb3IgYnVmZmVyOiVkLCBzdHJlYW06JWQiLCBmcmFtZS0+YnVmX2lkeCwgZnJhbWUtPnN0cmVhbV90eXBlKTsKKyAgICAgICAgICAgIHJjID0gbW1fc3RyZWFtX3FidWYobXlfb2JqLCBmcmFtZSk7CisgICAgICAgICAgICBpZihyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9jYW1lcmFfc3RyZWFtX3FidWYoaWR4PSVkKSBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmJ1Zl9pZHgsIHJjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXlfb2JqLT5idWZfc3RhdHVzW2ZyYW1lLT5idWZfaWR4XS5pbl9rZXJuZWwgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIExPR0QoIjxERUJVRz4gOiBTdGlsbCByZWYgY291bnQgcGVuZGluZyBjb3VudCA6JWQiLAorICAgICAgICAgICAgICAgICBteV9vYmotPmJ1Zl9zdGF0dXNbZnJhbWUtPmJ1Zl9pZHhdLmJ1Zl9yZWZjbnQpOworICAgICAgICAgICAgTE9HRCgiPERFQlVHPiA6IGZvciBidWZmZXI6JXA6JWQiLAorICAgICAgICAgICAgICAgICBteV9vYmosIGZyYW1lLT5idWZfaWR4KTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9zdHJlYW1fZ2V0X3F1ZXVlZF9idWZfY291bnQKKyAqCisgKiBERVNDUklQVElPTjogcmV0dXJuIHF1ZXVlZCBidWZmZXIgY291bnQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IHN0cmVhbSBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogcXVldWVkIGJ1ZmZlciBjb3VudAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IG1tX3N0cmVhbV9nZXRfcXVldWVkX2J1Zl9jb3VudChtbV9zdHJlYW1fdCAqbXlfb2JqKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIExPR0QoIkUsIG15X2hhbmRsZSA9IDB4JXgsIGZkID0gJWQsIHN0YXRlID0gJWQiLAorICAgICAgICAgICAgIG15X29iai0+bXlfaGRsLCBteV9vYmotPmZkLCBteV9vYmotPnN0YXRlKTsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+YnVmX2xvY2spOworICAgIHJjID0gbXlfb2JqLT5xdWV1ZWRfYnVmZmVyX2NvdW50OworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmJ1Zl9sb2NrKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fc3RyZWFtX3JlZ19idWZfY2IKKyAqCisgKiBERVNDUklQVElPTjogQWxsb3cgb3RoZXIgc3RyZWFtIHRvIHJlZ2lzdGVyIGRhdGFDQiBhdCB0aGlzIHN0cmVhbS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG15X29iaiAgICAgICA6IHN0cmVhbSBvYmplY3QKKyAqICAgQHZhbCAgICAgICAgICA6IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIHJlZ2lzdGVyZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fc3RyZWFtX3JlZ19idWZfY2IobW1fc3RyZWFtX3QgKm15X29iaiwKKyAgICAgICAgbW1fc3RyZWFtX2RhdGFfY2JfdCB2YWwpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIHVpbnQ4X3QgaTsKKyAgICBMT0dEKCJFLCBteV9oYW5kbGUgPSAweCV4LCBmZCA9ICVkLCBzdGF0ZSA9ICVkIiwKKyAgICAgICAgICBteV9vYmotPm15X2hkbCwgbXlfb2JqLT5mZCwgbXlfb2JqLT5zdGF0ZSk7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2JfbG9jayk7CisgICAgZm9yIChpPTAgO2kgPCBNTV9DQU1FUkFfU1RSRUFNX0JVRl9DQl9NQVg7IGkrKykgeworICAgICAgICBpZihOVUxMID09IG15X29iai0+YnVmX2NiW2ldLmNiKSB7CisgICAgICAgICAgICBteV9vYmotPmJ1Zl9jYltpXSA9IHZhbDsKKyAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNiX2xvY2spOworCisgICAgcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS1pbnRlcmZhY2Uvc3JjL21tX2NhbWVyYV90aHJlYWQuYyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmFfdGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3NDBiNAotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtaW50ZXJmYWNlL3NyYy9tbV9jYW1lcmFfdGhyZWFkLmMKQEAgLTAsMCArMSw2OTggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8Y2FtX3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJtbV9jYW1lcmEuaCIKKwordHlwZWRlZiBlbnVtIHsKKyAgICAvKiBwb2xsIGVudHJpZXMgdXBkYXRlZCAqLworICAgIE1NX0NBTUVSQV9QSVBFX0NNRF9QT0xMX0VOVFJJRVNfVVBEQVRFRCwKKyAgICAvKiBwb2xsIGVudHJpZXMgdXBkYXRlZCBhc3luY2hyb25vdXMgKi8KKyAgICBNTV9DQU1FUkFfUElQRV9DTURfUE9MTF9FTlRSSUVTX1VQREFURURfQVNZTkMsCisgICAgLyogY29tbWl0IHVwZGF0ZXMgKi8KKyAgICBNTV9DQU1FUkFfUElQRV9DTURfQ09NTUlULAorICAgIC8qIGV4aXQgKi8KKyAgICBNTV9DQU1FUkFfUElQRV9DTURfRVhJVCwKKyAgICAvKiBtYXggY291bnQgKi8KKyAgICBNTV9DQU1FUkFfUElQRV9DTURfTUFYCit9IG1tX2NhbWVyYV9waXBlX2NtZF90eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTU1fQ0FNRVJBX1BPTExfVEFTS19TVEFURV9TVE9QUEVELAorICAgIE1NX0NBTUVSQV9QT0xMX1RBU0tfU1RBVEVfUE9MTCwgICAgIC8qIHBvbGxpbmcgcGlkIGluIHBvbGxpbmcgc3RhdGUuICovCisgICAgTU1fQ0FNRVJBX1BPTExfVEFTS19TVEFURV9NQVgKK30gbW1fY2FtZXJhX3BvbGxfdGFza19zdGF0ZV90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjbWQ7CisgICAgbW1fY2FtZXJhX2V2ZW50X3QgZXZlbnQ7Cit9IG1tX2NhbWVyYV9zaWdfZXZ0X3Q7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfcG9sbF9zaWdfYXN5bmMKKyAqCisgKiBERVNDUklQVElPTjogQXN5bmNob3Jvbm91cyBjYWxsIHRvIHNlbmQgYSBjb21tYW5kIHRocm91Z2ggcGlwZS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBvbGxfY2IgICAgICA6IHB0ciB0byBwb2xsIHRocmVhZCBvYmplY3QKKyAqICAgQGNtZCAgICAgICAgICA6IGNvbW1hbmQgdG8gYmUgc2VudAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX3BvbGxfc2lnX2FzeW5jKG1tX2NhbWVyYV9wb2xsX3RocmVhZF90ICpwb2xsX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZCkKK3sKKyAgICAvKiBzZW5kIHRocm91Z2ggcGlwZSAqLworICAgIC8qIGdldCB0aGUgbXV0ZXggKi8KKyAgICBtbV9jYW1lcmFfc2lnX2V2dF90IGNtZF9ldnQ7CisKKyAgICBMT0dEKCJFIGNtZCA9ICVkIixjbWQpOworICAgIG1lbXNldCgmY21kX2V2dCwgMCwgc2l6ZW9mKGNtZF9ldnQpKTsKKyAgICBjbWRfZXZ0LmNtZCA9IGNtZDsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnBvbGxfY2ItPm11dGV4KTsKKyAgICAvKiByZXNldCB0aGUgc3RhdHVlIHRvIGZhbHNlICovCisgICAgcG9sbF9jYi0+c3RhdHVzID0gRkFMU0U7CisKKyAgICAvKiBzZW5kIGNtZCB0byB3b3JrZXIgKi8KKyAgICBzc2l6ZV90IGxlbiA9IHdyaXRlKHBvbGxfY2ItPnBmZHNbMV0sICZjbWRfZXZ0LCBzaXplb2YoY21kX2V2dCkpOworICAgIGlmIChsZW4gPCAxKSB7CisgICAgICAgIExPR1coImxlbiA9ICVsbGQsIGVycm5vID0gJWQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcgaW50KWxlbiwgZXJybm8pOworICAgICAgICAvKiBBdm9pZCB3YWl0aW5nIGZvciB0aGUgc2lnbmFsICovCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwb2xsX2NiLT5tdXRleCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBMT0dEKCJiZWdpbiBJTiBtdXRleCB3cml0ZSBkb25lLCBsZW4gPSAlbGxkIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcgaW50KWxlbik7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBvbGxfY2ItPm11dGV4KTsKKyAgICBMT0dEKCJYIik7CisgICAgcmV0dXJuIDA7Cit9CisKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3BvbGxfc2lnCisgKgorICogREVTQ1JJUFRJT046IHN5bmNob3JpbnplZCBjYWxsIHRvIHNlbmQgYSBjb21tYW5kIHRocm91Z2ggcGlwZS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBvbGxfY2IgICAgICA6IHB0ciB0byBwb2xsIHRocmVhZCBvYmplY3QKKyAqICAgQGNtZCAgICAgICAgICA6IGNvbW1hbmQgdG8gYmUgc2VudAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludDMyX3QgbW1fY2FtZXJhX3BvbGxfc2lnKG1tX2NhbWVyYV9wb2xsX3RocmVhZF90ICpwb2xsX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNtZCkKK3sKKyAgICAvKiBzZW5kIHRocm91Z2ggcGlwZSAqLworICAgIC8qIGdldCB0aGUgbXV0ZXggKi8KKyAgICBtbV9jYW1lcmFfc2lnX2V2dF90IGNtZF9ldnQ7CisKKyAgICBMT0dEKCJFIGNtZCA9ICVkIixjbWQpOworICAgIG1lbXNldCgmY21kX2V2dCwgMCwgc2l6ZW9mKGNtZF9ldnQpKTsKKyAgICBjbWRfZXZ0LmNtZCA9IGNtZDsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnBvbGxfY2ItPm11dGV4KTsKKyAgICAvKiByZXNldCB0aGUgc3RhdHVlIHRvIGZhbHNlICovCisgICAgcG9sbF9jYi0+c3RhdHVzID0gRkFMU0U7CisgICAgLyogc2VuZCBjbWQgdG8gd29ya2VyICovCisKKyAgICBzc2l6ZV90IGxlbiA9IHdyaXRlKHBvbGxfY2ItPnBmZHNbMV0sICZjbWRfZXZ0LCBzaXplb2YoY21kX2V2dCkpOworICAgIGlmKGxlbiA8IDEpIHsKKyAgICAgICAgTE9HVygibGVuID0gJWxsZCwgZXJybm8gPSAlZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyBpbnQpbGVuLCBlcnJubyk7CisgICAgICAgIC8qIEF2b2lkIHdhaXRpbmcgZm9yIHRoZSBzaWduYWwgKi8KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBvbGxfY2ItPm11dGV4KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIExPR0QoImJlZ2luIElOIG11dGV4IHdyaXRlIGRvbmUsIGxlbiA9ICVsbGQiLAorICAgICAgICAgICAgKGxvbmcgbG9uZyBpbnQpbGVuKTsKKyAgICAvKiB3YWl0IHRpbGwgd29ya2VyIHRhc2sgZ2l2ZXMgcG9zaXRpdmUgc2lnbmFsICovCisgICAgaWYgKEZBTFNFID09IHBvbGxfY2ItPnN0YXR1cykgeworICAgICAgICBMT0dEKCJ3YWl0Iik7CisgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZwb2xsX2NiLT5jb25kX3YsICZwb2xsX2NiLT5tdXRleCk7CisgICAgfQorICAgIC8qIGRvbmUgKi8KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcG9sbF9jYi0+bXV0ZXgpOworICAgIExPR0QoIlgiKTsKKyAgICByZXR1cm4gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfcG9sbF9zaWcKKyAqCisgKiBERVNDUklQVElPTjogc2lnbmFsIHRoZSBzdGF0dXMgb2YgZG9uZQorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcG9sbF9jYiA6IHB0ciB0byBwb2xsIHRocmVhZCBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBtbV9jYW1lcmFfcG9sbF9zaWdfZG9uZShtbV9jYW1lcmFfcG9sbF90aHJlYWRfdCAqcG9sbF9jYikKK3sKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnBvbGxfY2ItPm11dGV4KTsKKyAgICBwb2xsX2NiLT5zdGF0dXMgPSBUUlVFOworICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJnBvbGxfY2ItPmNvbmRfdik7CisgICAgTE9HRCgiZG9uZSwgaW4gbXV0ZXgiKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcG9sbF9jYi0+bXV0ZXgpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9wb2xsX3NldF9zdGF0ZQorICoKKyAqIERFU0NSSVBUSU9OOiBzZXQgYSBwb2xsaW5nIHN0YXRlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwb2xsX2NiIDogcHRyIHRvIHBvbGwgdGhyZWFkIG9iamVjdAorICogICBAc3RhdGUgICA6IHBvbGxpbmcgc3RhdGUgKHN0b3BwZWQvcG9sbGluZykKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCBtbV9jYW1lcmFfcG9sbF9zZXRfc3RhdGUobW1fY2FtZXJhX3BvbGxfdGhyZWFkX3QgKnBvbGxfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3BvbGxfdGFza19zdGF0ZV90eXBlX3Qgc3RhdGUpCit7CisgICAgcG9sbF9jYi0+c3RhdGUgPSBzdGF0ZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBtbV9jYW1lcmFfcG9sbF9wcm9jX3BpcGUKKyAqCisgKiBERVNDUklQVElPTjogcG9sbGluZyB0aHJlYWQgcm91dGluZSB0byBwcm9jZXNzIHBpcGUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBvbGxfY2IgOiBwdHIgdG8gcG9sbCB0aHJlYWQgb2JqZWN0CisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgbW1fY2FtZXJhX3BvbGxfcHJvY19waXBlKG1tX2NhbWVyYV9wb2xsX3RocmVhZF90ICpwb2xsX2NiKQoreworICAgIHNzaXplX3QgcmVhZF9sZW47CisgICAgaW50IGk7CisgICAgbW1fY2FtZXJhX3NpZ19ldnRfdCBjbWRfZXZ0OworICAgIHJlYWRfbGVuID0gcmVhZChwb2xsX2NiLT5wZmRzWzBdLCAmY21kX2V2dCwgc2l6ZW9mKGNtZF9ldnQpKTsKKyAgICBMT0dEKCJyZWFkX2ZkID0gJWQsIHJlYWRfbGVuID0gJWQsIGV4cGVjdF9sZW4gPSAlZCBjbWQgPSAlZCIsCisgICAgICAgICAgcG9sbF9jYi0+cGZkc1swXSwgKGludClyZWFkX2xlbiwgKGludClzaXplb2YoY21kX2V2dCksIGNtZF9ldnQuY21kKTsKKyAgICBzd2l0Y2ggKGNtZF9ldnQuY21kKSB7CisgICAgY2FzZSBNTV9DQU1FUkFfUElQRV9DTURfUE9MTF9FTlRSSUVTX1VQREFURUQ6CisgICAgY2FzZSBNTV9DQU1FUkFfUElQRV9DTURfUE9MTF9FTlRSSUVTX1VQREFURURfQVNZTkM6CisgICAgICAgIC8qIHdlIGFsd2F5cyBoYXZlIGluZGV4IDAgZm9yIHBpcGUgcmVhZCAqLworICAgICAgICBwb2xsX2NiLT5udW1fZmRzID0gMDsKKyAgICAgICAgcG9sbF9jYi0+cG9sbF9mZHNbcG9sbF9jYi0+bnVtX2Zkc10uZmQgPSBwb2xsX2NiLT5wZmRzWzBdOworICAgICAgICBwb2xsX2NiLT5wb2xsX2Zkc1twb2xsX2NiLT5udW1fZmRzXS5ldmVudHMgPSBQT0xMSU58UE9MTFJETk9STXxQT0xMUFJJOworICAgICAgICBwb2xsX2NiLT5udW1fZmRzKys7CisKKyAgICAgICAgaWYgKE1NX0NBTUVSQV9QT0xMX1RZUEVfRVZUID09IHBvbGxfY2ItPnBvbGxfdHlwZSAmJgorICAgICAgICAgICAgICAgIHBvbGxfY2ItPm51bV9mZHMgPCBNQVhfU1RSRUFNX05VTV9JTl9CVU5ETEUpIHsKKyAgICAgICAgICAgIGlmIChwb2xsX2NiLT5wb2xsX2VudHJpZXNbMF0uZmQgPj0gMCkgeworICAgICAgICAgICAgICAgIC8qIGZkIGlzIHZhbGlkLCB3ZSB1cGRhdGUgcG9sbF9mZHMgKi8KKyAgICAgICAgICAgICAgICBwb2xsX2NiLT5wb2xsX2Zkc1twb2xsX2NiLT5udW1fZmRzXS5mZCA9IHBvbGxfY2ItPnBvbGxfZW50cmllc1swXS5mZDsKKyAgICAgICAgICAgICAgICBwb2xsX2NiLT5wb2xsX2Zkc1twb2xsX2NiLT5udW1fZmRzXS5ldmVudHMgPSBQT0xMSU58UE9MTFJETk9STXxQT0xMUFJJOworICAgICAgICAgICAgICAgIHBvbGxfY2ItPm51bV9mZHMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChNTV9DQU1FUkFfUE9MTF9UWVBFX0RBVEEgPT0gcG9sbF9jYi0+cG9sbF90eXBlICYmCisgICAgICAgICAgICAgICAgcG9sbF9jYi0+bnVtX2ZkcyA8PSBNQVhfU1RSRUFNX05VTV9JTl9CVU5ETEUpIHsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IE1BWF9TVFJFQU1fTlVNX0lOX0JVTkRMRTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYocG9sbF9jYi0+cG9sbF9lbnRyaWVzW2ldLmZkID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZmQgaXMgdmFsaWQsIHdlIHVwZGF0ZSBwb2xsX2ZkcyB0byB0aGlzIGZkICovCisgICAgICAgICAgICAgICAgICAgIHBvbGxfY2ItPnBvbGxfZmRzW3BvbGxfY2ItPm51bV9mZHNdLmZkID0gcG9sbF9jYi0+cG9sbF9lbnRyaWVzW2ldLmZkOworICAgICAgICAgICAgICAgICAgICBwb2xsX2NiLT5wb2xsX2Zkc1twb2xsX2NiLT5udW1fZmRzXS5ldmVudHMgPSBQT0xMSU58UE9MTFJETk9STXxQT0xMUFJJOworICAgICAgICAgICAgICAgICAgICBwb2xsX2NiLT5udW1fZmRzKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZmQgaXMgaW52YWxpZCwgd2Ugc2V0IHRoZSBlbnRyeSB0byAtMSB0byBwcmV2ZW50IHBvbGxpbmcuCisgICAgICAgICAgICAgICAgICAgICAqIEFjY29yZGluZyB0byBzcGVjLCBwb2xsaW5nIHdpbGwgbm90IHBvbGwgb24gZW50cnkgd2l0aCBmZD0tMS4KKyAgICAgICAgICAgICAgICAgICAgICogSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHdlIG5lZWQgdG8gc2tpcCB0aGVzZSBpbnZhbGlkIGZkcworICAgICAgICAgICAgICAgICAgICAgKiB3aGVuIHVwZGF0aW5nIHRoaXMgYXJyYXkuCisgICAgICAgICAgICAgICAgICAgICAqIFdlIHN0aWxsIGtlZXAgZmQ9LTEgaW4gdGhpcyBhcnJheSBiZWNhdXNlIHRoaXMgbWFrZXMgZWFzaWVyIHRvCisgICAgICAgICAgICAgICAgICAgICAqIG1hcCBjYiBhc3NvY2lhdGVkIHdpdGggdGhpcyBmZCBvbmNlIGluY29taW5nIGRhdGEgYXZhaWwgYnkgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAgICAgICogdXNpbmcgdGhlIGluZGV4LTEoMCBpcyByZXNlcnZlZCBmb3IgcGlwZSByZWFkLCBzbyBuZWVkIHRvIHJlZHVjZSBpbmRleCBieSAxKSAqLworICAgICAgICAgICAgICAgICAgICBwb2xsX2NiLT5wb2xsX2Zkc1twb2xsX2NiLT5udW1fZmRzXS5mZCA9IC0xOworICAgICAgICAgICAgICAgICAgICBwb2xsX2NiLT5wb2xsX2Zkc1twb2xsX2NiLT5udW1fZmRzXS5ldmVudHMgPSAwOworICAgICAgICAgICAgICAgICAgICBwb2xsX2NiLT5udW1fZmRzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjbWRfZXZ0LmNtZCAhPSBNTV9DQU1FUkFfUElQRV9DTURfUE9MTF9FTlRSSUVTX1VQREFURURfQVNZTkMpCisgICAgICAgICAgICBtbV9jYW1lcmFfcG9sbF9zaWdfZG9uZShwb2xsX2NiKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1NX0NBTUVSQV9QSVBFX0NNRF9DT01NSVQ6CisgICAgICAgIG1tX2NhbWVyYV9wb2xsX3NpZ19kb25lKHBvbGxfY2IpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0NBTUVSQV9QSVBFX0NNRF9FWElUOgorICAgIGRlZmF1bHQ6CisgICAgICAgIG1tX2NhbWVyYV9wb2xsX3NldF9zdGF0ZShwb2xsX2NiLCBNTV9DQU1FUkFfUE9MTF9UQVNLX1NUQVRFX1NUT1BQRUQpOworICAgICAgICBtbV9jYW1lcmFfcG9sbF9zaWdfZG9uZShwb2xsX2NiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9wb2xsX2ZuCisgKgorICogREVTQ1JJUFRJT046IHBvbGxpbmcgdGhyZWFkIHJvdXRpbmUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBvbGxfY2IgOiBwdHIgdG8gcG9sbCB0aHJlYWQgb2JqZWN0CisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgKm1tX2NhbWVyYV9wb2xsX2ZuKG1tX2NhbWVyYV9wb2xsX3RocmVhZF90ICpwb2xsX2NiKQoreworICAgIGludCByYyA9IDAsIGk7CisKKyAgICBpZiAoTlVMTCA9PSBwb2xsX2NiKSB7CisgICAgICAgIExPR0UoInBvbGxfY2IgaXMgTlVMTCFcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgTE9HRCgicG9sbCB0eXBlID0gJWQsIG51bV9mZCA9ICVkIHBvbGxfY2IgPSAlcFxuIiwKKyAgICAgICAgICBwb2xsX2NiLT5wb2xsX3R5cGUsIHBvbGxfY2ItPm51bV9mZHMscG9sbF9jYik7CisgICAgZG8geworICAgICAgICAgZm9yKGkgPSAwOyBpIDwgcG9sbF9jYi0+bnVtX2ZkczsgaSsrKSB7CisgICAgICAgICAgICBwb2xsX2NiLT5wb2xsX2Zkc1tpXS5ldmVudHMgPSBQT0xMSU58UE9MTFJETk9STXxQT0xMUFJJOworICAgICAgICAgfQorCisgICAgICAgICByYyA9IHBvbGwocG9sbF9jYi0+cG9sbF9mZHMsIHBvbGxfY2ItPm51bV9mZHMsIHBvbGxfY2ItPnRpbWVvdXRtcyk7CisgICAgICAgICBpZihyYyA+IDApIHsKKyAgICAgICAgICAgIGlmICgocG9sbF9jYi0+cG9sbF9mZHNbMF0ucmV2ZW50cyAmIFBPTExJTikgJiYKKyAgICAgICAgICAgICAgICAocG9sbF9jYi0+cG9sbF9mZHNbMF0ucmV2ZW50cyAmIFBPTExSRE5PUk0pKSB7CisgICAgICAgICAgICAgICAgLyogaWYgd2UgaGF2ZSBkYXRhIG9uIHBpcGUsIHdlIG9ubHkgcHJvY2VzcyBwaXBlIGluIHRoaXMgaXRlcmF0aW9uICovCisgICAgICAgICAgICAgICAgTE9HRCgiY21kIHJlY2VpdmVkIG9uIHBpcGVcbiIpOworICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9wb2xsX3Byb2NfcGlwZShwb2xsX2NiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yKGk9MTsgaTxwb2xsX2NiLT5udW1fZmRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2tpbmcgZm9yIGN0cmwgZXZlbnRzICovCisgICAgICAgICAgICAgICAgICAgIGlmICgocG9sbF9jYi0+cG9sbF90eXBlID09IE1NX0NBTUVSQV9QT0xMX1RZUEVfRVZUKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHBvbGxfY2ItPnBvbGxfZmRzW2ldLnJldmVudHMgJiBQT0xMUFJJKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRCgibW1fY2FtZXJhX2V2dF9ub3RpZnlcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gcG9sbF9jYi0+cG9sbF9lbnRyaWVzW2ktMV0ubm90aWZ5X2NiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9sbF9jYi0+cG9sbF9lbnRyaWVzW2ktMV0ubm90aWZ5X2NiKHBvbGxfY2ItPnBvbGxfZW50cmllc1tpLTFdLnVzZXJfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoKE1NX0NBTUVSQV9QT0xMX1RZUEVfREFUQSA9PSBwb2xsX2NiLT5wb2xsX3R5cGUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocG9sbF9jYi0+cG9sbF9mZHNbaV0ucmV2ZW50cyAmIFBPTExJTikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChwb2xsX2NiLT5wb2xsX2Zkc1tpXS5yZXZlbnRzICYgUE9MTFJETk9STSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0QoIm1tX3N0cmVhbV9kYXRhX25vdGlmeVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBwb2xsX2NiLT5wb2xsX2VudHJpZXNbaS0xXS5ub3RpZnlfY2IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xsX2NiLT5wb2xsX2VudHJpZXNbaS0xXS5ub3RpZnlfY2IocG9sbF9jYi0+cG9sbF9lbnRyaWVzW2ktMV0udXNlcl9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGluIGVycm9yIGNhc2Ugc2xlZXAgMTAgdXMgYW5kIHRoZW4gY29udGludWUuIGhhcmQgY29kZWQgaGVyZSAqLworICAgICAgICAgICAgdXNsZWVwKDEwKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgfSB3aGlsZSAoKHBvbGxfY2IgIT0gTlVMTCkgJiYgKHBvbGxfY2ItPnN0YXRlID09IE1NX0NBTUVSQV9QT0xMX1RBU0tfU1RBVEVfUE9MTCkpOworICAgIHJldHVybiBOVUxMOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9wb2xsX3RocmVhZAorICoKKyAqIERFU0NSSVBUSU9OOiBwb2xsaW5nIHRocmVhZCBlbnRyeSBmdW5jdGlvbgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAZGF0YSAgICA6IHB0ciB0byBwb2xsIHRocmVhZCBvYmplY3QKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgdm9pZCAqbW1fY2FtZXJhX3BvbGxfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisgICAgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX3QgKnBvbGxfY2IgPSAobW1fY2FtZXJhX3BvbGxfdGhyZWFkX3QgKilkYXRhOworCisgICAgbW1fY2FtZXJhX2NtZF90aHJlYWRfbmFtZShwb2xsX2NiLT50aHJlYWROYW1lKTsKKyAgICAvKiBhZGQgcGlwZSByZWFkIGZkIGludG8gcG9sbCBmaXJzdCAqLworICAgIHBvbGxfY2ItPnBvbGxfZmRzW3BvbGxfY2ItPm51bV9mZHMrK10uZmQgPSBwb2xsX2NiLT5wZmRzWzBdOworCisgICAgbW1fY2FtZXJhX3BvbGxfc2lnX2RvbmUocG9sbF9jYik7CisgICAgbW1fY2FtZXJhX3BvbGxfc2V0X3N0YXRlKHBvbGxfY2IsIE1NX0NBTUVSQV9QT0xMX1RBU0tfU1RBVEVfUE9MTCk7CisgICAgcmV0dXJuIG1tX2NhbWVyYV9wb2xsX2ZuKHBvbGxfY2IpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9wb2xsX3RocmVhZAorICoKKyAqIERFU0NSSVBUSU9OOiBub3RpZnkgdGhlIHBvbGxpbmcgdGhyZWFkIHRoYXQgZW50cmllcyBmb3IgcG9sbGluZyBmZCBoYXZlCisgKiAgICAgICAgICAgICAgYmVlbiB1cGRhdGVkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwb2xsX2NiIDogcHRyIHRvIHBvbGwgdGhyZWFkIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX25vdGlmeV9lbnRyaWVzX3VwZGF0ZWQobW1fY2FtZXJhX3BvbGxfdGhyZWFkX3QgKiBwb2xsX2NiKQoreworICAgIC8qIHNlbmQgcG9sbCBlbnRyaWVzIHVwZGF0ZWQgc2lnbmFsIHRvIHBvbGwgdGhyZWFkICovCisgICAgcmV0dXJuIG1tX2NhbWVyYV9wb2xsX3NpZyhwb2xsX2NiLCBNTV9DQU1FUkFfUElQRV9DTURfUE9MTF9FTlRSSUVTX1VQREFURUQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9wb2xsX3RocmVhZF9jb21taXRfdXBkYXRlcworICoKKyAqIERFU0NSSVBUSU9OOiBzeW5jIHdpdGggYWxsIHByZXZpb3VzbHkgcGVuZGluZyBhc3luYyB1cGRhdGVzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwb2xsX2NiIDogcHRyIHRvIHBvbGwgdGhyZWFkIG9iamVjdAorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIC0xIC0tIGZhaWx1cmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfcG9sbF90aHJlYWRfY29tbWl0X3VwZGF0ZXMobW1fY2FtZXJhX3BvbGxfdGhyZWFkX3QgKiBwb2xsX2NiKQoreworICAgIHJldHVybiBtbV9jYW1lcmFfcG9sbF9zaWcocG9sbF9jYiwgTU1fQ0FNRVJBX1BJUEVfQ01EX0NPTU1JVCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbW1fY2FtZXJhX3BvbGxfdGhyZWFkX2FkZF9wb2xsX2ZkCisgKgorICogREVTQ1JJUFRJT046IGFkZCBhIG5ldyBmZCBpbnRvIHBvbGxpbmcgdGhyZWFkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwb2xsX2NiICAgOiBwdHIgdG8gcG9sbCB0aHJlYWQgb2JqZWN0CisgKiAgIEBoYW5kbGVyICAgOiBzdHJlYW0gaGFuZGxlIGlmIGNoYW5uZWwgZGF0YSBwb2xsaW5nIHRocmVhZCwKKyAqICAgICAgICAgICAgICAgIDAgaWYgZXZlbnQgcG9sbGluZyB0aHJlYWQKKyAqICAgQGZkICAgICAgICA6IGZpbGUgZGVzY3JpcHRvciBuZWVkIHRvIGJlIGFkZGVkIGludG8gcG9sbGluZyB0aHJlYWQKKyAqICAgQG5vdGlmeV9jYiA6IGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBpZiBhbnkgbm90aWZ5IGZyb20gZmQKKyAqICAgQHVzZXJkYXRhICA6IHVzZXIgZGF0YSBwdHIKKyAqICAgQGNhbGxfdHlwZSA6IFdoZXRoZXIgaXRzIFN5bmNocm9ub3VzIG9yIEFzeW5jaHJvbm91cyBjYWxsCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBtbV9jYW1lcmFfcG9sbF90aHJlYWRfYWRkX3BvbGxfZmQobW1fY2FtZXJhX3BvbGxfdGhyZWFkX3QgKiBwb2xsX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfcG9sbF9ub3RpZnlfdCBub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jYWxsX3R5cGVfdCBjYWxsX3R5cGUpCit7CisgICAgaW50MzJfdCByYyA9IC0xOworICAgIHVpbnQ4X3QgaWR4ID0gMDsKKworICAgIGlmIChNTV9DQU1FUkFfUE9MTF9UWVBFX0RBVEEgPT0gcG9sbF9jYi0+cG9sbF90eXBlKSB7CisgICAgICAgIC8qIGdldCBzdHJlYW0gaWR4IGZyb20gaGFuZGxlciBpZiBDSCB0eXBlICovCisgICAgICAgIGlkeCA9IG1tX2NhbWVyYV91dGlsX2dldF9pbmRleF9ieV9oYW5kbGVyKGhhbmRsZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGZvciBFVlQgdHlwZSwgb25seSBpZHg9MCBpcyB2YWxpZCAqLworICAgICAgICBpZHggPSAwOworICAgIH0KKworICAgIGlmIChNQVhfU1RSRUFNX05VTV9JTl9CVU5ETEUgPiBpZHgpIHsKKyAgICAgICAgcG9sbF9jYi0+cG9sbF9lbnRyaWVzW2lkeF0uZmQgPSBmZDsKKyAgICAgICAgcG9sbF9jYi0+cG9sbF9lbnRyaWVzW2lkeF0uaGFuZGxlciA9IGhhbmRsZXI7CisgICAgICAgIHBvbGxfY2ItPnBvbGxfZW50cmllc1tpZHhdLm5vdGlmeV9jYiA9IG5vdGlmeV9jYjsKKyAgICAgICAgcG9sbF9jYi0+cG9sbF9lbnRyaWVzW2lkeF0udXNlcl9kYXRhID0gdXNlcmRhdGE7CisgICAgICAgIC8qIHNlbmQgcG9sbCBlbnRyaWVzIHVwZGF0ZWQgc2lnbmFsIHRvIHBvbGwgdGhyZWFkICovCisgICAgICAgIGlmIChjYWxsX3R5cGUgPT0gbW1fY2FtZXJhX3N5bmNfY2FsbCApIHsKKyAgICAgICAgICAgIHJjID0gbW1fY2FtZXJhX3BvbGxfc2lnKHBvbGxfY2IsIE1NX0NBTUVSQV9QSVBFX0NNRF9QT0xMX0VOVFJJRVNfVVBEQVRFRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYyA9IG1tX2NhbWVyYV9wb2xsX3NpZ19hc3luYyhwb2xsX2NiLCBNTV9DQU1FUkFfUElQRV9DTURfUE9MTF9FTlRSSUVTX1VQREFURURfQVNZTkMgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoImludmFsaWQgaGFuZGxlciAlZCAoJWQpIiwgaGFuZGxlciwgaWR4KTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG1tX2NhbWVyYV9wb2xsX3RocmVhZF9kZWxfcG9sbF9mZAorICoKKyAqIERFU0NSSVBUSU9OOiBkZWxldGUgYSBmZCBmcm9tIHBvbGxpbmcgdGhyZWFkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwb2xsX2NiICAgOiBwdHIgdG8gcG9sbCB0aHJlYWQgb2JqZWN0CisgKiAgIEBoYW5kbGVyICAgOiBzdHJlYW0gaGFuZGxlIGlmIGNoYW5uZWwgZGF0YSBwb2xsaW5nIHRocmVhZCwKKyAqICAgICAgICAgICAgICAgIDAgaWYgZXZlbnQgcG9sbGluZyB0aHJlYWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIDAgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAtMSAtLSBmYWlsdXJlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX2RlbF9wb2xsX2ZkKG1tX2NhbWVyYV9wb2xsX3RocmVhZF90ICogcG9sbF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2FsbF90eXBlX3QgY2FsbF90eXBlKQoreworICAgIGludDMyX3QgcmMgPSAtMTsKKyAgICB1aW50OF90IGlkeCA9IDA7CisKKyAgICBpZiAoTU1fQ0FNRVJBX1BPTExfVFlQRV9EQVRBID09IHBvbGxfY2ItPnBvbGxfdHlwZSkgeworICAgICAgICAvKiBnZXQgc3RyZWFtIGlkeCBmcm9tIGhhbmRsZXIgaWYgQ0ggdHlwZSAqLworICAgICAgICBpZHggPSBtbV9jYW1lcmFfdXRpbF9nZXRfaW5kZXhfYnlfaGFuZGxlcihoYW5kbGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBmb3IgRVZUIHR5cGUsIG9ubHkgaWR4PTAgaXMgdmFsaWQgKi8KKyAgICAgICAgaWR4ID0gMDsKKyAgICB9CisKKyAgICBpZiAoKE1BWF9TVFJFQU1fTlVNX0lOX0JVTkRMRSA+IGlkeCkgJiYKKyAgICAgICAgKGhhbmRsZXIgPT0gcG9sbF9jYi0+cG9sbF9lbnRyaWVzW2lkeF0uaGFuZGxlcikpIHsKKyAgICAgICAgLyogcmVzZXQgcG9sbCBlbnRyeSAqLworICAgICAgICBwb2xsX2NiLT5wb2xsX2VudHJpZXNbaWR4XS5mZCA9IC0xOyAvKiBzZXQgZmQgdG8gaW52YWxpZCAqLworICAgICAgICBwb2xsX2NiLT5wb2xsX2VudHJpZXNbaWR4XS5oYW5kbGVyID0gMDsKKyAgICAgICAgcG9sbF9jYi0+cG9sbF9lbnRyaWVzW2lkeF0ubm90aWZ5X2NiID0gTlVMTDsKKworICAgICAgICAvKiBzZW5kIHBvbGwgZW50cmllcyB1cGRhdGVkIHNpZ25hbCB0byBwb2xsIHRocmVhZCAqLworICAgICAgICBpZiAoY2FsbF90eXBlID09IG1tX2NhbWVyYV9zeW5jX2NhbGwgKSB7CisgICAgICAgICAgICByYyA9IG1tX2NhbWVyYV9wb2xsX3NpZyhwb2xsX2NiLCBNTV9DQU1FUkFfUElQRV9DTURfUE9MTF9FTlRSSUVTX1VQREFURUQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmMgPSBtbV9jYW1lcmFfcG9sbF9zaWdfYXN5bmMocG9sbF9jYiwgTU1fQ0FNRVJBX1BJUEVfQ01EX1BPTExfRU5UUklFU19VUERBVEVEX0FTWU5DICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKE1BWF9TVFJFQU1fTlVNX0lOX0JVTkRMRSA8PSBpZHgpIHx8CisgICAgICAgICAgICAgICAgKHBvbGxfY2ItPnBvbGxfZW50cmllc1tpZHhdLmhhbmRsZXIgIT0gMCkpIHsKKyAgICAgICAgICAgIExPR0UoImludmFsaWQgaGFuZGxlciAlZCAoJWQpIiwgcG9sbF9jYi0+cG9sbF9lbnRyaWVzW2lkeF0uaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgaWR4KTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dXKCJpbnZhbGlkIGhhbmRsZXIgJWQgKCVkKSIsIGhhbmRsZXIsIGlkeCk7CisgICAgICAgICAgICByYyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludDMyX3QgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX2xhdW5jaChtbV9jYW1lcmFfcG9sbF90aHJlYWRfdCAqIHBvbGxfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3BvbGxfdGhyZWFkX3R5cGVfdCBwb2xsX3R5cGUpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgc2l6ZV90IGkgPSAwLCBjbnQgPSAwOworICAgIHBvbGxfY2ItPnBvbGxfdHlwZSA9IHBvbGxfdHlwZTsKKworICAgIC8vSW5pdGlhbGl6ZSBwb2xsX2ZkcworICAgIGNudCA9IHNpemVvZihwb2xsX2NiLT5wb2xsX2ZkcykgLyBzaXplb2YocG9sbF9jYi0+cG9sbF9mZHNbMF0pOworICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgICAgICBwb2xsX2NiLT5wb2xsX2Zkc1tpXS5mZCA9IC0xOworICAgIH0KKyAgICAvL0luaXRpYWxpemUgcG9sbF9lbnRyaWVzCisgICAgY250ID0gc2l6ZW9mKHBvbGxfY2ItPnBvbGxfZW50cmllcykgLyBzaXplb2YocG9sbF9jYi0+cG9sbF9lbnRyaWVzWzBdKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKyAgICAgICAgcG9sbF9jYi0+cG9sbF9lbnRyaWVzW2ldLmZkID0gLTE7CisgICAgfQorICAgIC8vSW5pdGlhbGl6ZSBwaXBlIGZkcworICAgIHBvbGxfY2ItPnBmZHNbMF0gPSAtMTsKKyAgICBwb2xsX2NiLT5wZmRzWzFdID0gLTE7CisgICAgcmMgPSBwaXBlKHBvbGxfY2ItPnBmZHMpOworICAgIGlmKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJwaXBlIG9wZW4gcmM9JWRcbiIsIHJjKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHBvbGxfY2ItPnRpbWVvdXRtcyA9IC0xOyAgLyogSW5maW5pdGUgc2Vjb25kcyAqLworCisgICAgTE9HRCgicG9sbF90eXBlID0gJWQsIHJlYWQgZmQgPSAlZCwgd3JpdGUgZmQgPSAlZCB0aW1lb3V0ID0gJWQiLAorICAgICAgICAgcG9sbF9jYi0+cG9sbF90eXBlLAorICAgICAgICBwb2xsX2NiLT5wZmRzWzBdLCBwb2xsX2NiLT5wZmRzWzFdLHBvbGxfY2ItPnRpbWVvdXRtcyk7CisKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJnBvbGxfY2ItPm11dGV4LCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmcG9sbF9jYi0+Y29uZF92LCBOVUxMKTsKKworICAgIC8qIGxhdW5jaCB0aGUgdGhyZWFkICovCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwb2xsX2NiLT5tdXRleCk7CisgICAgcG9sbF9jYi0+c3RhdHVzID0gMDsKKyAgICBwdGhyZWFkX2NyZWF0ZSgmcG9sbF9jYi0+cGlkLCBOVUxMLCBtbV9jYW1lcmFfcG9sbF90aHJlYWQsICh2b2lkICopcG9sbF9jYik7CisgICAgaWYoIXBvbGxfY2ItPnN0YXR1cykgeworICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcG9sbF9jYi0+Y29uZF92LCAmcG9sbF9jYi0+bXV0ZXgpOworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwb2xsX2NiLT5tdXRleCk7CisgICAgTE9HRCgiRW5kIik7CisgICAgcmV0dXJuIHJjOworfQorCitpbnQzMl90IG1tX2NhbWVyYV9wb2xsX3RocmVhZF9yZWxlYXNlKG1tX2NhbWVyYV9wb2xsX3RocmVhZF90ICpwb2xsX2NiKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIGlmKE1NX0NBTUVSQV9QT0xMX1RBU0tfU1RBVEVfU1RPUFBFRCA9PSBwb2xsX2NiLT5zdGF0ZSkgeworICAgICAgICBMT0dFKCJlcnIsIHBvbGwgdGhyZWFkIGlzIG5vdCBydW5uaW5nLlxuIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiBzZW5kIGV4aXQgc2lnbmFsIHRvIHBvbGwgdGhyZWFkICovCisgICAgbW1fY2FtZXJhX3BvbGxfc2lnKHBvbGxfY2IsIE1NX0NBTUVSQV9QSVBFX0NNRF9FWElUKTsKKyAgICAvKiB3YWl0IHVudGlsIHBvbGwgdGhyZWFkIGV4aXRzICovCisgICAgaWYgKHB0aHJlYWRfam9pbihwb2xsX2NiLT5waWQsIE5VTEwpICE9IDApIHsKKyAgICAgICAgTE9HRCgicHRocmVhZCBkZWFkIGFscmVhZHlcbiIpOworICAgIH0KKworICAgIC8qIGNsb3NlIHBpcGUgKi8KKyAgICBpZihwb2xsX2NiLT5wZmRzWzBdID49IDApIHsKKyAgICAgICAgY2xvc2UocG9sbF9jYi0+cGZkc1swXSk7CisgICAgfQorICAgIGlmKHBvbGxfY2ItPnBmZHNbMV0gPj0gMCkgeworICAgICAgICBjbG9zZShwb2xsX2NiLT5wZmRzWzFdKTsKKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnBvbGxfY2ItPm11dGV4KTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmcG9sbF9jYi0+Y29uZF92KTsKKyAgICBtZW1zZXQocG9sbF9jYiwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9wb2xsX3RocmVhZF90KSk7CisgICAgcG9sbF9jYi0+cGZkc1swXSA9IC0xOworICAgIHBvbGxfY2ItPnBmZHNbMV0gPSAtMTsKKyAgICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkICptbV9jYW1lcmFfY21kX3RocmVhZCh2b2lkICpkYXRhKQoreworICAgIGludCBydW5uaW5nID0gMTsKKyAgICBpbnQgcmV0OworICAgIG1tX2NhbWVyYV9jbWRfdGhyZWFkX3QgKmNtZF90aHJlYWQgPQorICAgICAgICAgICAgICAgIChtbV9jYW1lcmFfY21kX3RocmVhZF90ICopZGF0YTsKKyAgICBtbV9jYW1lcmFfY21kY2JfdCogbm9kZSA9IE5VTEw7CisKKyAgICBtbV9jYW1lcmFfY21kX3RocmVhZF9uYW1lKGNtZF90aHJlYWQtPnRocmVhZE5hbWUpOworICAgIGRvIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgcmV0ID0gY2FtX3NlbV93YWl0KCZjbWRfdGhyZWFkLT5jbWRfc2VtKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMCAmJiBlcnJubyAhPSBFSU5WQUwpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJjYW1fc2VtX3dhaXQgZXJyb3IgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAocmV0ICE9IDApOworCisgICAgICAgIC8qIHdlIGdvdCBub3RpZmllZCBhYm91dCBuZXcgY21kIGF2YWlsIGluIGNtZCBxdWV1ZSAqLworICAgICAgICBub2RlID0gKG1tX2NhbWVyYV9jbWRjYl90KiljYW1fcXVldWVfZGVxKCZjbWRfdGhyZWFkLT5jbWRfcXVldWUpOworICAgICAgICB3aGlsZSAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG5vZGUtPmNtZF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIE1NX0NBTUVSQV9DTURfVFlQRV9FVlRfQ0I6CisgICAgICAgICAgICBjYXNlIE1NX0NBTUVSQV9DTURfVFlQRV9EQVRBX0NCOgorICAgICAgICAgICAgY2FzZSBNTV9DQU1FUkFfQ01EX1RZUEVfUkVRX0RBVEFfQ0I6CisgICAgICAgICAgICBjYXNlIE1NX0NBTUVSQV9DTURfVFlQRV9TVVBFUl9CVUZfREFUQV9DQjoKKyAgICAgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0NNRF9UWVBFX0NPTkZJR19OT1RJRlk6CisgICAgICAgICAgICBjYXNlIE1NX0NBTUVSQV9DTURfVFlQRV9TVEFSVF9aU0w6CisgICAgICAgICAgICBjYXNlIE1NX0NBTUVSQV9DTURfVFlQRV9TVE9QX1pTTDoKKyAgICAgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0NNRF9UWVBFX0dFTkVSQUw6CisgICAgICAgICAgICBjYXNlIE1NX0NBTUVSQV9DTURfVFlQRV9GTFVTSF9RVUVVRToKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBjbWRfdGhyZWFkLT5jYikgeworICAgICAgICAgICAgICAgICAgICBjbWRfdGhyZWFkLT5jYihub2RlLCBjbWRfdGhyZWFkLT51c2VyX2RhdGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0NNRF9UWVBFX0VYSVQ6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShub2RlKTsKKyAgICAgICAgICAgIG5vZGUgPSAobW1fY2FtZXJhX2NtZGNiX3QqKWNhbV9xdWV1ZV9kZXEoJmNtZF90aHJlYWQtPmNtZF9xdWV1ZSk7CisgICAgICAgIH0gLyogKG5vZGUgIT0gTlVMTCkgKi8KKyAgICB9IHdoaWxlIChydW5uaW5nKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50MzJfdCBtbV9jYW1lcmFfY21kX3RocmVhZF9sYXVuY2gobW1fY2FtZXJhX2NtZF90aHJlYWRfdCAqIGNtZF90aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY21kX2NiX3QgY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisKKyAgICBjYW1fc2VtX2luaXQoJmNtZF90aHJlYWQtPmNtZF9zZW0sIDApOworICAgIGNhbV9zZW1faW5pdCgmY21kX3RocmVhZC0+c3luY19zZW0sIDApOworICAgIGNhbV9xdWV1ZV9pbml0KCZjbWRfdGhyZWFkLT5jbWRfcXVldWUpOworICAgIGNtZF90aHJlYWQtPmNiID0gY2I7CisgICAgY21kX3RocmVhZC0+dXNlcl9kYXRhID0gdXNlcl9kYXRhOworICAgIGNtZF90aHJlYWQtPmlzX2FjdGl2ZSA9IFRSVUU7CisKKyAgICAvKiBsYXVuY2ggdGhlIHRocmVhZCAqLworICAgIHB0aHJlYWRfY3JlYXRlKCZjbWRfdGhyZWFkLT5jbWRfcGlkLAorICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NtZF90aHJlYWQsCisgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljbWRfdGhyZWFkKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludDMyX3QgbW1fY2FtZXJhX2NtZF90aHJlYWRfbmFtZShjb25zdCBjaGFyKiBuYW1lKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIC8qIG5hbWUgdGhlIHRocmVhZCAqLworICAgIGlmIChuYW1lICYmIHN0cmxlbihuYW1lKSkKKyAgICAgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKW5hbWUsIDAsIDAsIDApOworICAgIHJldHVybiByYzsKK30KKworCitpbnQzMl90IG1tX2NhbWVyYV9jbWRfdGhyZWFkX3N0b3AobW1fY2FtZXJhX2NtZF90aHJlYWRfdCAqIGNtZF90aHJlYWQpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgbW1fY2FtZXJhX2NtZGNiX3QqIG5vZGUgPSAobW1fY2FtZXJhX2NtZGNiX3QgKiltYWxsb2Moc2l6ZW9mKG1tX2NhbWVyYV9jbWRjYl90KSk7CisgICAgaWYgKE5VTEwgPT0gbm9kZSkgeworICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIG1tX2NhbWVyYV9jbWRjYl90Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZW1zZXQobm9kZSwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9jbWRjYl90KSk7CisgICAgbm9kZS0+Y21kX3R5cGUgPSBNTV9DQU1FUkFfQ01EX1RZUEVfRVhJVDsKKworICAgIGNhbV9xdWV1ZV9lbnEoJmNtZF90aHJlYWQtPmNtZF9xdWV1ZSwgbm9kZSk7CisgICAgY2FtX3NlbV9wb3N0KCZjbWRfdGhyZWFkLT5jbWRfc2VtKTsKKworICAgIC8qIHdhaXQgdW50aWwgY21kIHRocmVhZCBleGl0cyAqLworICAgIGlmIChwdGhyZWFkX2pvaW4oY21kX3RocmVhZC0+Y21kX3BpZCwgTlVMTCkgIT0gMCkgeworICAgICAgICBMT0dEKCJwdGhyZWFkIGRlYWQgYWxyZWFkeVxuIik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworaW50MzJfdCBtbV9jYW1lcmFfY21kX3RocmVhZF9kZXN0cm95KG1tX2NhbWVyYV9jbWRfdGhyZWFkX3QgKiBjbWRfdGhyZWFkKQoreworICAgIGludDMyX3QgcmMgPSAwOworICAgIGNhbV9xdWV1ZV9kZWluaXQoJmNtZF90aHJlYWQtPmNtZF9xdWV1ZSk7CisgICAgY2FtX3NlbV9kZXN0cm95KCZjbWRfdGhyZWFkLT5jbWRfc2VtKTsKKyAgICBjYW1fc2VtX2Rlc3Ryb3koJmNtZF90aHJlYWQtPnN5bmNfc2VtKTsKKyAgICBtZW1zZXQoY21kX3RocmVhZCwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9jbWRfdGhyZWFkX3QpKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludDMyX3QgbW1fY2FtZXJhX2NtZF90aHJlYWRfcmVsZWFzZShtbV9jYW1lcmFfY21kX3RocmVhZF90ICogY21kX3RocmVhZCkKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICByYyA9IG1tX2NhbWVyYV9jbWRfdGhyZWFkX3N0b3AoY21kX3RocmVhZCk7CisgICAgaWYgKDAgPT0gcmMpIHsKKyAgICAgICAgcmMgPSBtbV9jYW1lcmFfY21kX3RocmVhZF9kZXN0cm95KGNtZF90aHJlYWQpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3QvQW5kcm9pZC5tayBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MjQwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3QvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE5MyBAQAorT0xEX0xPQ0FMX1BBVEggOj0gJChMT0NBTF9QQVRIKQorTE9DQUxfUEFUSDo9JChjYWxsIG15LWRpcikKKworIyBCdWlsZCBjb21tYW5kIGxpbmUgdGVzdCBhcHA6IG1tLXFjYW1lcmEtYXBwCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vLi4vY29tbW9uLm1rCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQ0ZMQUdTOj0gXAorICAgICAgICAtREFNU1NfVkVSU0lPTj0kKEFNU1NfVkVSU0lPTikgXAorICAgICAgICAkKG1tY2FtZXJhX2RlYnVnX2RlZmluZXMpIFwKKyAgICAgICAgJChtbWNhbWVyYV9kZWJ1Z19jZmxhZ3MpIFwKKyAgICAgICAgJChVU0VfU0VSVkVSX1RSRUUpCisKK2lmZXEgKCQoc3RyaXAgJChUQVJHRVRfVVNFU19JT04pKSx0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0lPTgorZW5kaWYKKworTE9DQUxfQ0ZMQUdTICs9IC1EX0FORFJPSURfIC1EUUNBTUVSQV9SRURFRklORV9MT0cKKworIyBTeXN0ZW0gaGVhZGVyIGZpbGUgcGF0aCBwcmVmaXgKK0xPQ0FMX0NGTEFHUyArPSAtRFNZU1RFTV9IRUFERVJfUFJFRklYPXN5cworCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgICAgIHNyYy9tbV9xY2FtZXJhX21haW5fbWVudS5jIFwKKyAgICAgICAgc3JjL21tX3FjYW1lcmFfYXBwLmMgXAorICAgICAgICBzcmMvbW1fcWNhbWVyYV91bml0X3Rlc3QuYyBcCisgICAgICAgIHNyYy9tbV9xY2FtZXJhX3ZpZGVvLmMgXAorICAgICAgICBzcmMvbW1fcWNhbWVyYV9wcmV2aWV3LmMgXAorICAgICAgICBzcmMvbW1fcWNhbWVyYV9zbmFwc2hvdC5jIFwKKyAgICAgICAgc3JjL21tX3FjYW1lcmFfcmRpLmMgXAorICAgICAgICBzcmMvbW1fcWNhbWVyYV9yZXByb2Nlc3MuY1wKKyAgICAgICAgc3JjL21tX3FjYW1lcmFfcXVldWUuYyBcCisgICAgICAgIHNyYy9tbV9xY2FtZXJhX3NvY2tldC5jIFwKKyAgICAgICAgc3JjL21tX3FjYW1lcmFfY29tbWFuZHMuYworIyAgICAgICAgc3JjL21tX3FjYW1lcmFfZHVhbF90ZXN0LmMgXAorCitMT0NBTF9DX0lOQ0xVREVTOj0kKExPQ0FMX1BBVEgpL2luYworTE9DQUxfQ19JTkNMVURFUys9IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24gXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL21tLWNhbWVyYS1pbnRlcmZhY2UvaW5jIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi8uLi8uLi9tbS1pbWFnZS1jb2RlYy9xZXhpZiBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vLi4vLi4vbW0taW1hZ2UtY29kZWMvcW9teF9jb3JlCisKK0xPQ0FMX0NfSU5DTFVERVMrPSAkKGtlcm5lbF9pbmNsdWRlcykKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoY29tbW9uX2RlcHMpCisKK0xPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9JT05fSEVBUF9JRD1JT05fSU9NTVVfSEVBUF9JRAoraWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLG1zbTg5NzQpCisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9JT05fRkFMTEJBQ0tfSEVBUF9JRD1JT05fSU9NTVVfSEVBUF9JRAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLURDQU1FUkFfR1JBTExPQ19DQUNISU5HX0lEPTAKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1ETlVNX1JFQ09SRElOR19CVUZGRVJTPTkKK2Vsc2UgaWZlcSAoJChmaWx0ZXIgJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLCBhcHE4MDg0IG1zbTgwODQpLCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSkKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lECisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9OQorZWxzZSBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtODk5NCkKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lECisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9OQorZWxzZSBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtODkxNiBtc204OTUyIG1zbTg5MzcgbXNtODk1MykKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lECisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9OQorZWxzZSBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtODIyNikKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lECisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9OQorZWxzZSBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtODYxMCkKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lECisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9OQorZWxzZSBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtODk2MCkKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lECisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9NQorZWxzZSBpZm5lcSAoLCQoZmlsdGVyIG1zbTg2NjAsJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pKSkKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lEICMgRUJJCisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9NQorZWxzZQorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLURDQU1FUkFfR1JBTExPQ19DQUNISU5HX0lEPUdSQUxMT0NfVVNBR0VfUFJJVkFURV9VTkNBQ0hFRCAjdW5jYWNoZWQKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9DQU1FUkFfSEVBUF9JRAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9NQorZW5kaWYKK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKKyAgICAgICAgIGxpYmN1dGlscyBsaWJkbCBsaWJtbWNhbWVyYV9pbnRlcmZhY2UKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfMzJfQklUX09OTFkgOj0gJChCT0FSRF9RVElfQ0FNRVJBXzMyQklUX09OTFkpCisKK0xPQ0FMX01PRFVMRTo9IG1tLXFjYW1lcmEtYXBwCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisjIEJ1aWxkIHR1bmluZyBsaWJyYXJ5CitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQ0ZMQUdTOj0gXAorICAgICAgICAtREFNU1NfVkVSU0lPTj0kKEFNU1NfVkVSU0lPTikgXAorICAgICAgICAkKG1tY2FtZXJhX2RlYnVnX2RlZmluZXMpIFwKKyAgICAgICAgJChtbWNhbWVyYV9kZWJ1Z19jZmxhZ3MpIFwKKyAgICAgICAgJChVU0VfU0VSVkVSX1RSRUUpCisKK2lmZXEgKCQoc3RyaXAgJChUQVJHRVRfVVNFU19JT04pKSx0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0lPTgorZW5kaWYKKworTE9DQUxfQ0ZMQUdTICs9IC1EX0FORFJPSURfIC1EUUNBTUVSQV9SRURFRklORV9MT0cKKworIyBTeXN0ZW0gaGVhZGVyIGZpbGUgcGF0aCBwcmVmaXgKK0xPQ0FMX0NGTEFHUyArPSAtRFNZU1RFTV9IRUFERVJfUFJFRklYPXN5cworCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgICAgIHNyYy9tbV9xY2FtZXJhX21haW5fbWVudS5jIFwKKyAgICAgICAgc3JjL21tX3FjYW1lcmFfYXBwLmMgXAorICAgICAgICBzcmMvbW1fcWNhbWVyYV91bml0X3Rlc3QuYyBcCisgICAgICAgIHNyYy9tbV9xY2FtZXJhX3ZpZGVvLmMgXAorICAgICAgICBzcmMvbW1fcWNhbWVyYV9wcmV2aWV3LmMgXAorICAgICAgICBzcmMvbW1fcWNhbWVyYV9zbmFwc2hvdC5jIFwKKyAgICAgICAgc3JjL21tX3FjYW1lcmFfcmRpLmMgXAorICAgICAgICBzcmMvbW1fcWNhbWVyYV9yZXByb2Nlc3MuY1wKKyAgICAgICAgc3JjL21tX3FjYW1lcmFfcXVldWUuYyBcCisgICAgICAgIHNyYy9tbV9xY2FtZXJhX3NvY2tldC5jIFwKKyAgICAgICAgc3JjL21tX3FjYW1lcmFfY29tbWFuZHMuYworIyAgICAgICAgc3JjL21tX3FjYW1lcmFfZHVhbF90ZXN0LmMgXAorCitMT0NBTF9DX0lOQ0xVREVTOj0kKExPQ0FMX1BBVEgpL2luYworTE9DQUxfQ19JTkNMVURFUys9IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9jb21tb24gXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL21tLWNhbWVyYS1pbnRlcmZhY2UvaW5jIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS8uLi8uLi8uLi9tbS1pbWFnZS1jb2RlYy9xZXhpZiBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vLi4vLi4vbW0taW1hZ2UtY29kZWMvcW9teF9jb3JlCisKK0xPQ0FMX0NfSU5DTFVERVMrPSAkKGtlcm5lbF9pbmNsdWRlcykKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoY29tbW9uX2RlcHMpCisKK0xPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9JT05fSEVBUF9JRD1JT05fSU9NTVVfSEVBUF9JRAoraWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLG1zbTg5NzQpCisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9JT05fRkFMTEJBQ0tfSEVBUF9JRD1JT05fSU9NTVVfSEVBUF9JRAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLURDQU1FUkFfR1JBTExPQ19DQUNISU5HX0lEPTAKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1ETlVNX1JFQ09SRElOR19CVUZGRVJTPTkKK2Vsc2UgaWZlcSAoJChmaWx0ZXIgJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLCBhcHE4MDg0IG1zbTgwODQpLCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSkKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lECisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9OQorZWxzZSBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtODk5NCkKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lECisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9OQorZWxzZSBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtODkxNiBtc204OTUyIG1zbTg5MzcgbXNtODk1MykKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lECisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9OQorZWxzZSBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtODIyNikKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lECisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9OQorZWxzZSBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtODYxMCkKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lECisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9OQorZWxzZSBpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksbXNtODk2MCkKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lECisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9NQorZWxzZSBpZm5lcSAoLCQoZmlsdGVyIG1zbTg2NjAsJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pKSkKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9JT01NVV9IRUFQX0lEICMgRUJJCisgICAgICAgIExPQ0FMX0NGTEFHUyArPSAtRENBTUVSQV9HUkFMTE9DX0NBQ0hJTkdfSUQ9MAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9NQorZWxzZQorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLURDQU1FUkFfR1JBTExPQ19DQUNISU5HX0lEPUdSQUxMT0NfVVNBR0VfUFJJVkFURV9VTkNBQ0hFRCAjdW5jYWNoZWQKKyAgICAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EQ0FNRVJBX0lPTl9GQUxMQkFDS19IRUFQX0lEPUlPTl9DQU1FUkFfSEVBUF9JRAorICAgICAgICBMT0NBTF9DRkxBR1MgKz0gLUROVU1fUkVDT1JESU5HX0JVRkZFUlM9NQorZW5kaWYKK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKKyAgICAgICAgIGxpYmxvZyBsaWJjdXRpbHMgbGliZGwgbGlibW1jYW1lcmFfaW50ZXJmYWNlCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9ICQoQk9BUkRfUVRJX0NBTUVSQV8zMkJJVF9PTkxZKQorCitMT0NBTF9NT0RVTEU6PSBsaWJtbS1xY2FtZXJhCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworTE9DQUxfUEFUSCA6PSAkKE9MRF9MT0NBTF9QQVRIKQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L2luYy9tbV9xY2FtZXJhX2FwcC5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L2luYy9tbV9xY2FtZXJhX2FwcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NTFiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3QvaW5jL21tX3FjYW1lcmFfYXBwLmgKQEAgLTAsMCArMSw1MzggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX01NX1FDQU1FUkFfQVBQX0hfXworI2RlZmluZSBfX01NX1FDQU1FUkFfQVBQX0hfXworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tc21fbWRwLmg+CisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJtbV9jYW1lcmFfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibW1fanBlZ19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJtbV9xY2FtZXJhX3NvY2tldC5oIgorCisjZGVmaW5lIE1NX1FDQU1FUkFfQVBQX0lOVEVSQVRJT04gMQorCisjZGVmaW5lIE1NX0FQUF9NQVhfRFVNUF9GUkFNRV9OVU0gMTAwMAorCisjZGVmaW5lIFBSRVZJRVdfQlVGX05VTSA3CisjZGVmaW5lIFNOQVBTSE9UX0JVRl9OVU0gMTAKKyNkZWZpbmUgVklERU9fQlVGX05VTSA3CisjZGVmaW5lIElTUF9QSVhfQlVGX05VTSA5CisjZGVmaW5lIFNUQVRTX0JVRl9OVU0gNAorI2RlZmluZSBSRElfQlVGX05VTSA4CisjZGVmaW5lIENBUFRVUkVfQlVGX05VTSA1CisKKyNkZWZpbmUgREVGQVVMVF9QUkVWSUVXX0ZPUk1BVCAgICBDQU1fRk9STUFUX1lVVl80MjBfTlYyMQorI2RlZmluZSBERUZBVUxUX1BSRVZJRVdfV0lEVEggICAgIDEyODAKKyNkZWZpbmUgREVGQVVMVF9QUkVWSUVXX0hFSUdIVCAgICA5NjAKKyNkZWZpbmUgREVGQVVMVF9QUkVWSUVXX1BBRERJTkcgICBDQU1fUEFEX1RPX1dPUkQKKyNkZWZpbmUgREVGQVVMVF9WSURFT19GT1JNQVQgICAgICBDQU1fRk9STUFUX1lVVl80MjBfTlYxMgorI2RlZmluZSBERUZBVUxUX1ZJREVPX1dJRFRIICAgICAgIDgwMAorI2RlZmluZSBERUZBVUxUX1ZJREVPX0hFSUdIVCAgICAgIDQ4MAorI2RlZmluZSBERUZBVUxUX1ZJREVPX1BBRERJTkcgICAgIENBTV9QQURfVE9fMksKKyNkZWZpbmUgREVGQVVMVF9TTkFQU0hPVF9GT1JNQVQgICBDQU1fRk9STUFUX1lVVl80MjBfTlYyMQorI2RlZmluZSBERUZBVUxUX1JBV19GT1JNQVQgICAgICAgIENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTBCUFBfR0JSRworCisjZGVmaW5lIERFRkFVTFRfU05BUFNIT1RfV0lEVEggICAgNDE2MAorI2RlZmluZSBERUZBVUxUX1NOQVBTSE9UX0hFSUdIVCAgIDMxMjAKKyNkZWZpbmUgREVGQVVMVF9TTkFQU0hPVF9QQURESU5HICBDQU1fUEFEX1RPX1dPUkQKKworI2RlZmluZSBERUZBVUxUX09WX0ZPUk1BVCAgICAgICAgIE1EUF9ZX0NSQ0JfSDJWMgorI2RlZmluZSBERUZBVUxUX09WX0ZPUk1BVF9CUFAgICAgIDMvMgorI2RlZmluZSBERUZBVUxUX0NBTUVSQV9GT1JNQVRfQlBQIDMvMgorI2RlZmluZSBGQl9QQVRIICAgICAgICAgICAgICAgICAgICIvZGV2L2dyYXBoaWNzL2ZiMCIKKyNkZWZpbmUgQkFDS0xJR0hUX0NPTlRST0wgICAgICAgICAiL3N5cy9jbGFzcy9sZWRzL2xjZC1iYWNrbGlnaHQvYnJpZ2h0bmVzcyIKKyNkZWZpbmUgQkFDS0xJR0hUX0xFVkVMICAgICAgICAgICAiMjA1IgorCisjZGVmaW5lIEVOQUJMRV9SRVBST0NFU1NJTkcgICAgICAgMQorCisjZGVmaW5lIElOVkFMSURfS0VZX1BSRVNTIDAKKyNkZWZpbmUgQkFTRV9PRkZTRVQgICgnWicgLSAnQScgKyAxKQorI2RlZmluZSBCQVNFX09GRlNFVF9OVU0gICgnWicgLSAnQScgKyAyKQorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKyAgICBUVU5FX0NNRF9JTklULAorICAgIFRVTkVfQ01EX0dFVF9MSVNULAorICAgIFRVTkVfQ01EX0dFVF9QQVJBTVMsCisgICAgVFVORV9DTURfU0VUX1BBUkFNUywKKyAgICBUVU5FX0NNRF9NSVNDLAorICAgIFRVTkVfQ01EX0RFSU5JVCwKK30gbW1fY2FtZXJhX3R1bmVfY21kX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgVFVORV9QUkVWQ01EX0lOSVQsCisgICAgVFVORV9QUkVWQ01EX1NFVERJTSwKKyAgICBUVU5FX1BSRVZDTURfR0VUSU5GTywKKyAgICBUVU5FX1BSRVZDTURfR0VUQ0hVTktTSVpFLAorICAgIFRVTkVfUFJFVkNNRF9HRVRGUkFNRSwKKyAgICBUVU5FX1BSRVZDTURfVU5TVVBQT1JURUQsCisgICAgVFVORV9QUkVWQ01EX0RFSU5JVCwKK30gbW1fY2FtZXJhX3R1bmVfcHJldmNtZF90OworCit0eXBlZGVmIHZvaWQgKCpjYW1fc3RyZWFtX3VzZXJfY2IpIChtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZSk7Cit0eXBlZGVmIHZvaWQgKCpwcmV2X2NhbGxiYWNrKSAobW1fY2FtZXJhX2J1Zl9kZWZfdCAqcHJldmlld19mcmFtZSk7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyICpzZW5kX2J1ZjsKKyAgdWludDMyX3Qgc2VuZF9sZW47CisgIHZvaWQgKm5leHQ7Cit9IGV6dHVuZV9wcmV2Y21kX3JzcDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCAoKmNvbW1hbmRfcHJvY2VzcykgKHZvaWQgKnJlY3YsIG1tX2NhbWVyYV90dW5lX2NtZF90IGNtZCwKKyAgICAgIHZvaWQgKnBhcmFtLCBjaGFyICpzZW5kX2J1ZiwgdWludDMyX3Qgc2VuZF9sZW4pOworICAgIGludCAoKnByZXZjb21tYW5kX3Byb2Nlc3MpICh2b2lkICpyZWN2LCBtbV9jYW1lcmFfdHVuZV9wcmV2Y21kX3QgY21kLAorICAgICAgdm9pZCAqcGFyYW0sIGNoYXIgKipzZW5kX2J1ZiwgdWludDMyX3QgKnNlbmRfbGVuKTsKKyAgICB2b2lkICgqcHJldmZyYW1lX2NhbGxiYWNrKSAobW1fY2FtZXJhX2J1Zl9kZWZfdCAqcHJldmlld19mcmFtZSk7Cit9IG1tX2NhbWVyYV90dW5lX2Z1bmNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG1tX2NhbWVyYV90dW5lX2Z1bmNfdCAqZnVuY190Ymw7CisgICAgdm9pZCAqbGliX2hhbmRsZTsKK31tbV9jYW1lcmFfdHVuaW5nX2xpYl9wYXJhbXNfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNTV9DQU1FUkFfT0ssCisgICAgTU1fQ0FNRVJBX0VfR0VORVJBTCwKKyAgICBNTV9DQU1FUkFfRV9OT19NRU1PUlksCisgICAgTU1fQ0FNRVJBX0VfTk9UX1NVUFBPUlRFRCwKKyAgICBNTV9DQU1FUkFfRV9JTlZBTElEX0lOUFVULAorICAgIE1NX0NBTUVSQV9FX0lOVkFMSURfT1BFUkFUSU9OLCAvKiA1ICovCisgICAgTU1fQ0FNRVJBX0VfRU5DT0RFLAorICAgIE1NX0NBTUVSQV9FX0JVRkZFUl9SRUcsCisgICAgTU1fQ0FNRVJBX0VfUE1FTV9BTExPQywKKyAgICBNTV9DQU1FUkFfRV9DQVBUVVJFX0ZBSUxFRCwKKyAgICBNTV9DQU1FUkFfRV9DQVBUVVJFX1RJTUVPVVQsIC8qIDEwICovCit9IG1tX2NhbWVyYV9zdGF0dXNfdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIE1NX0NIQU5ORUxfVFlQRV9aU0wsICAgICAgLyogcHJldmlldywgYW5kIHNuYXBzaG90IG1haW4gKi8KKyAgICBNTV9DSEFOTkVMX1RZUEVfQ0FQVFVSRSwgIC8qIHNuYXBzaG90IG1haW4sIGFuZCBwb3N0dmlldyAqLworICAgIE1NX0NIQU5ORUxfVFlQRV9QUkVWSUVXLCAgLyogcHJldmlldyBvbmx5ICovCisgICAgTU1fQ0hBTk5FTF9UWVBFX1NOQVBTSE9ULCAvKiBzbmFwc2hvdCBtYWluIG9ubHkgKi8KKyAgICBNTV9DSEFOTkVMX1RZUEVfVklERU8sICAgIC8qIHZpZGVvIG9ubHkgKi8KKyAgICBNTV9DSEFOTkVMX1RZUEVfUkRJLCAgICAgIC8qIHJkaSBvbmx5ICovCisgICAgTU1fQ0hBTk5FTF9UWVBFX1JFUFJPQ0VTUywvKiBvZmZsaW5lIHJlcHJvY2VzcyAqLworICAgIE1NX0NIQU5ORUxfVFlQRV9NQVgKK30gbW1fY2FtZXJhX2NoYW5uZWxfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgZmQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbWFpbl9pb25fZmQ7CisgICAgaW9uX3VzZXJfaGFuZGxlX3QgICAgICAgaGFuZGxlOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIHNpemU7CisgICAgcGFybV9idWZmZXJfdCAgICAgICAgICAqZGF0YTsKK30gbW1fY2FtZXJhX2FwcF9tZW1pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90IGJ1ZjsKKyAgICBtbV9jYW1lcmFfYXBwX21lbWluZm9fdCBtZW1faW5mbzsKK30gbW1fY2FtZXJhX2FwcF9idWZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IHNfaWQ7CisgICAgbW1fY2FtZXJhX3N0cmVhbV9jb25maWdfdCBzX2NvbmZpZzsKKyAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90IG9mZnNldDsKKyAgICB1aW50OF90IG51bV9vZl9idWZzOworICAgIHVpbnQzMl90IG11bHRpcGxlT2Y7CisgICAgbW1fY2FtZXJhX2FwcF9idWZfdCBzX2J1ZnNbTU1fQ0FNRVJBX01BWF9OVU1fRlJBTUVTXTsKKyAgICBtbV9jYW1lcmFfYXBwX2J1Zl90IHNfaW5mb19idWY7Cit9IG1tX2NhbWVyYV9zdHJlYW1fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGNoX2lkOworICAgIHVpbnQ4X3QgbnVtX3N0cmVhbXM7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90IHN0cmVhbXNbTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFXTsKK30gbW1fY2FtZXJhX2NoYW5uZWxfdDsKKwordHlwZWRlZiB2b2lkICgqcmVsZWFzZV9kYXRhX2ZuKSh2b2lkKiBkYXRhLCB2b2lkICp1c2VyX2RhdGEpOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc3RydWN0IGNhbV9saXN0IGxpc3Q7CisgICAgdm9pZCogZGF0YTsKK30gY2FtZXJhX3Ffbm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNhbWVyYV9xX25vZGUgbV9oZWFkOworICAgIGludCBtX3NpemU7CisgICAgcHRocmVhZF9tdXRleF90IG1fbG9jazsKKyAgICByZWxlYXNlX2RhdGFfZm4gbV9kYXRhRm47CisgICAgdm9pZCAqIG1fdXNlckRhdGE7Cit9IG1tX2NhbWVyYV9xdWV1ZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDE2X3QgdXNlcl9pbnB1dF9kaXNwbGF5X3dpZHRoOworICAgIHVpbnQxNl90IHVzZXJfaW5wdXRfZGlzcGxheV9oZWlnaHQ7Cit9IFVTRVJfSU5QVVRfRElTUExBWV9UOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbW1fY2FtZXJhX3Z0YmxfdCAqY2FtOworICAgIHVpbnQ4X3QgbnVtX2NoYW5uZWxzOworICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgY2hhbm5lbHNbTU1fQ0hBTk5FTF9UWVBFX01BWF07CisgICAgbW1fanBlZ19vcHNfdCBqcGVnX29wczsKKyAgICB1aW50MzJfdCBqcGVnX2hkbDsKKyAgICBtbV9jYW1lcmFfYXBwX2J1Zl90IGNhcF9idWY7CisgICAgbW1fY2FtZXJhX2FwcF9idWZfdCBwYXJtX2J1ZjsKKworICAgIHVpbnQzMl90IGN1cnJlbnRfanBlZ19zZXNzX2lkOworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCogY3VycmVudF9qb2JfZnJhbWVzOworICAgIHVpbnQzMl90IGN1cnJlbnRfam9iX2lkOworICAgIG1tX2NhbWVyYV9hcHBfYnVmX3QganBlZ19idWY7CisKKyAgICBpbnQgZmJfZmQ7CisgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZpbmZvOworICAgIHN0cnVjdCBtZHBfb3ZlcmxheSBkYXRhX292ZXJsYXk7CisgICAgdWludDMyX3Qgc2xpY2Vfc2l6ZTsKKyAgICB1aW50MzJfdCBidWZmZXJfd2lkdGgsIGJ1ZmZlcl9oZWlnaHQ7CisgICAgdWludDMyX3QgYnVmZmVyX3NpemU7CisgICAgY2FtX2Zvcm1hdF90IGJ1ZmZlcl9mb3JtYXQ7CisgICAgdWludDMyX3QgZnJhbWVfc2l6ZTsKKyAgICB1aW50MzJfdCBmcmFtZV9jb3VudDsKKyAgICBpbnQgZW5jb2RlSnBlZzsKKyAgICBpbnQgenNsX2VuYWJsZWQ7CisgICAgaW50OF90IGZvY3VzX3N1cHBvcnRlZDsKKyAgICBjYW1fc3RyZWFtX3VzZXJfY2IgdXNlcl9wcmV2aWV3X2NiOworICAgIGNhbV9zdHJlYW1fdXNlcl9jYiB1c2VyX21ldGFkYXRhX2NiOworICAgIHBhcm1fYnVmZmVyX3QgKnBhcmFtc19idWZmZXI7CisgICAgVVNFUl9JTlBVVF9ESVNQTEFZX1QgcHJldmlld19yZXNvbHV0aW9uOworCisgICAgLy9SZXByb2Nlc3MgcGFyYW1zJnN0cmVhbQorICAgIGludDhfdCBlbmFibGVfcmVwcm9jOworICAgIGludDMyX3QgcmVwcm9jX3NoYXJwbmVzczsKKyAgICBjYW1fZGVub2lzZV9wYXJhbV90IHJlcHJvY193bnI7CisgICAgaW50OF90IGVuYWJsZV9DQUM7CisgICAgaW50OF90IGVuYWJsZV9FWlR1bmU7CisgICAgaW50OF90IGVuYWJsZV9pcjsKKyAgICBtbV9jYW1lcmFfcXVldWVfdCBwcF9mcmFtZXM7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpyZXByb2Nfc3RyZWFtOworICAgIG1ldGFkYXRhX2J1ZmZlcl90ICptZXRhZGF0YTsKKyAgICBpbnQ4X3QgaXNfY2hyb21hdGl4X3JlbG9hZDsKK30gbW1fY2FtZXJhX3Rlc3Rfb2JqX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdm9pZCAqcHRyOworICB2b2lkKiBwdHJfanBlZzsKKworICB1aW50OF90ICgqZ2V0X251bV9vZl9jYW1lcmFzKSAoKTsKKyAgaW50MzJfdCAoKm1tX2NhbWVyYV9vcGVuKSAodWludDhfdCBjYW1lcmFfaWR4LCBtbV9jYW1lcmFfdnRibF90ICoqY2FtZXJhX3Z0YmwpOworICB1aW50MzJfdCAoKmpwZWdfb3BlbikobW1fanBlZ19vcHNfdCAqb3BzLCBtbV9qcGVnX21wb19vcHNfdCAqbXBvX29wcywKKyAgICAgICAgICAgICAgICAgICBtbV9kaW1lbnNpb24gcGljdHVyZV9zaXplLAorICAgICAgICAgICAgICAgICAgIGNhbV9qcGVnX21ldGFkYXRhX3QgKmpwZWdfbWV0YWRhdGEpOworCit9IGhhbF9pbnRlcmZhY2VfbGliX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IG51bV9jYW1lcmFzOworICAgIGhhbF9pbnRlcmZhY2VfbGliX3QgaGFsX2xpYjsKK30gbW1fY2FtZXJhX2FwcF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIGludCBpc1pTTDsKK30gbW1fY2FtZXJhX2xpYl9zbmFwc2hvdF9wYXJhbXM7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTU1fQ0FNRVJBX0xJQl9OT19BQ1RJT04gPSAwLAorICAgIE1NX0NBTUVSQV9MSUJfUkFXX0NBUFRVUkUsCisgICAgTU1fQ0FNRVJBX0xJQl9KUEVHX0NBUFRVUkUsCisgICAgTU1fQ0FNRVJBX0xJQl9TRVRfRk9DVVNfTU9ERSwKKyAgICBNTV9DQU1FUkFfTElCX0RPX0FGLAorICAgIE1NX0NBTUVSQV9MSUJfQ0FOQ0VMX0FGLAorICAgIE1NX0NBTUVSQV9MSUJfTE9DS19BRSwKKyAgICBNTV9DQU1FUkFfTElCX1VOTE9DS19BRSwKKyAgICBNTV9DQU1FUkFfTElCX0xPQ0tfQVdCLAorICAgIE1NX0NBTUVSQV9MSUJfVU5MT0NLX0FXQiwKKyAgICBNTV9DQU1FUkFfTElCX0dFVF9DSFJPTUFUSVgsCisgICAgTU1fQ0FNRVJBX0xJQl9TRVRfUkVMT0FEX0NIUk9NQVRJWCwKKyAgICBNTV9DQU1FUkFfTElCX0dFVF9BRlRVTkUsCisgICAgTU1fQ0FNRVJBX0xJQl9TRVRfUkVMT0FEX0FGVFVORSwKKyAgICBNTV9DQU1FUkFfTElCX1NFVF9BVVRPRk9DVVNfVFVOSU5HLAorICAgIE1NX0NBTUVSQV9MSUJfWlNMX0VOQUJMRSwKKyAgICBNTV9DQU1FUkFfTElCX0VWLAorICAgIE1NX0NBTUVSQV9MSUJfQU5USUJBTkRJTkcsCisgICAgTU1fQ0FNRVJBX0xJQl9TRVRfVkZFX0NPTU1BTkQsCisgICAgTU1fQ0FNRVJBX0xJQl9TRVRfUE9TVFBST0NfQ09NTUFORCwKKyAgICBNTV9DQU1FUkFfTElCX1NFVF8zQV9DT01NQU5ELAorICAgIE1NX0NBTUVSQV9MSUJfQUVDX0VOQUJMRSwKKyAgICBNTV9DQU1FUkFfTElCX0FFQ19ESVNBQkxFLAorICAgIE1NX0NBTUVSQV9MSUJfQUZfRU5BQkxFLAorICAgIE1NX0NBTUVSQV9MSUJfQUZfRElTQUJMRSwKKyAgICBNTV9DQU1FUkFfTElCX0FXQl9FTkFCTEUsCisgICAgTU1fQ0FNRVJBX0xJQl9BV0JfRElTQUJMRSwKKyAgICBNTV9DQU1FUkFfTElCX0FFQ19GT1JDRV9MQywKKyAgICBNTV9DQU1FUkFfTElCX0FFQ19GT1JDRV9HQUlOLAorICAgIE1NX0NBTUVSQV9MSUJfQUVDX0ZPUkNFX0VYUCwKKyAgICBNTV9DQU1FUkFfTElCX0FFQ19GT1JDRV9TTkFQX0xDLAorICAgIE1NX0NBTUVSQV9MSUJfQUVDX0ZPUkNFX1NOQVBfR0FJTiwKKyAgICBNTV9DQU1FUkFfTElCX0FFQ19GT1JDRV9TTkFQX0VYUCwKKyAgICBNTV9DQU1FUkFfTElCX1dCLAorICAgIE1NX0NBTUVSQV9MSUJfRVhQT1NVUkVfTUVURVJJTkcsCisgICAgTU1fQ0FNRVJBX0xJQl9CUklHSFRORVNTLAorICAgIE1NX0NBTUVSQV9MSUJfQ09OVFJBU1QsCisgICAgTU1fQ0FNRVJBX0xJQl9TQVRVUkFUSU9OLAorICAgIE1NX0NBTUVSQV9MSUJfU0hBUlBORVNTLAorICAgIE1NX0NBTUVSQV9MSUJfSVNPLAorICAgIE1NX0NBTUVSQV9MSUJfWk9PTSwKKyAgICBNTV9DQU1FUkFfTElCX0JFU1RTSE9ULAorICAgIE1NX0NBTUVSQV9MSUJfRkxBU0gsCisgICAgTU1fQ0FNRVJBX0xJQl9GUFNfUkFOR0UsCisgICAgTU1fQ0FNRVJBX0xJQl9XTlJfRU5BQkxFLAorICAgIE1NX0NBTUVSQV9MSUJfU0VUX1RJTlRMRVNTLAorICAgIE1NX0NBTUVSQV9MSUJfRVpUVU5FX0VOQUJMRSwKKyAgICBNTV9DQU1FUkFfTElCX0lSTU9ERSwKK30gbW1fY2FtZXJhX2xpYl9jb21tYW5kczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3Qgc3RyZWFtX3dpZHRoLCBzdHJlYW1faGVpZ2h0OworICAgIGNhbV9mb2N1c19tb2RlX3R5cGUgYWZfbW9kZTsKK30gbW1fY2FtZXJhX2xpYl9wYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdHVuZXNlcnZlcl9wcm90b2NvbF90ICpwcm90bzsKKyAgaW50IGNsaWVudHNvY2tldF9pZDsKKyAgcHJzZXJ2ZXJfcHJvdG9jb2xfdCAqcHJfcHJvdG87CisgIGludCBwcl9jbGllbnRzb2NrZXRfaWQ7CisgIG1tX2NhbWVyYV90dW5pbmdfbGliX3BhcmFtc190IHR1bmluZ19wYXJhbXM7Cit9IHR1bmluZ3NlcnZlcl90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbW1fY2FtZXJhX2FwcF90IGFwcF9jdHg7CisgICAgbW1fY2FtZXJhX3Rlc3Rfb2JqX3QgdGVzdF9vYmo7CisgICAgbW1fY2FtZXJhX2xpYl9wYXJhbXMgY3VycmVudF9wYXJhbXM7CisgICAgaW50IHN0cmVhbV9ydW5uaW5nOworICAgIHR1bmluZ3NlcnZlcl90IHRzY3RybDsKK30gbW1fY2FtZXJhX2xpYl9jdHg7CisKK3R5cGVkZWYgbW1fY2FtZXJhX2xpYl9jdHggbW1fY2FtZXJhX2xpYl9oYW5kbGU7CisKK3R5cGVkZWYgaW50ICgqbW1fYXBwX3Rlc3RfdCkgKG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcHMpOwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG1tX2FwcF90ZXN0X3QgZjsKKyAgICBpbnQgcjsKK30gbW1fYXBwX3RjX3Q7CisKK2V4dGVybiBpbnQgbW1fYXBwX3VuaXRfdGVzdF9lbnRyeShtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHApOworZXh0ZXJuIGludCBtbV9hcHBfZHVhbF90ZXN0X2VudHJ5KG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcCk7CitleHRlcm4gaW50IHNldG1ldGFpbmZvQ29tbWFuZChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX3NpemVfaW5mb190ICp2YWx1ZSk7CisKK2V4dGVybiB2b2lkIG1tX2FwcF9kdW1wX2ZyYW1lKG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX2lkeCk7CitleHRlcm4gdm9pZCBtbV9hcHBfZHVtcF9qcGVnX2ZyYW1lKGNvbnN0IHZvaWQgKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCk7CitleHRlcm4gaW50IG1tX2NhbWVyYV9hcHBfdGltZWR3YWl0KHVpbnQ4X3Qgc2Vjb25kcyk7CitleHRlcm4gaW50IG1tX2NhbWVyYV9hcHBfd2FpdCgpOworZXh0ZXJuIHZvaWQgbW1fY2FtZXJhX2FwcF9kb25lKCk7CitleHRlcm4gaW50IG1tX2FwcF9hbGxvY19idWZzKG1tX2NhbWVyYV9hcHBfYnVmX3QqIGFwcF9idWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90ICpmcmFtZV9vZmZzZXRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYnVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpc19zdHJlYW1idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtdWx0aXBsZU9mKTsKK2V4dGVybiBpbnQgbW1fYXBwX3JlbGVhc2VfYnVmcyh1aW50OF90IG51bV9idWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9hcHBfYnVmX3QqIGFwcF9idWZzKTsKK2V4dGVybiBpbnQgbW1fYXBwX3N0cmVhbV9pbml0YnVmKGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QgKmZyYW1lX29mZnNldF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbnVtX2J1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqaW5pdGlhbF9yZWdfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKipidWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKm9wc190YmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworZXh0ZXJuIGludDMyX3QgbW1fYXBwX3N0cmVhbV9kZWluaXRidWYobW1fY2FtZXJhX21hcF91bm1hcF9vcHNfdGJsX3QgKm9wc190YmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworZXh0ZXJuIGludCBtbV9hcHBfY2FjaGVfb3BzKG1tX2NhbWVyYV9hcHBfbWVtaW5mb190ICptZW1faW5mbywgaW50IGNtZCk7CitleHRlcm4gaW50MzJfdCBtbV9hcHBfc3RyZWFtX2NsZWFuX2ludmFsaWRhdGVfYnVmKHVpbnQzMl90IGluZGV4LCB2b2lkICp1c2VyX2RhdGEpOworZXh0ZXJuIGludDMyX3QgbW1fYXBwX3N0cmVhbV9pbnZhbGlkYXRlX2J1Zih1aW50MzJfdCBpbmRleCwgdm9pZCAqdXNlcl9kYXRhKTsKK2V4dGVybiBpbnQgbW1fYXBwX29wZW4obW1fY2FtZXJhX2FwcF90ICpjYW1fYXBwLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopOworZXh0ZXJuIGludCBtbV9hcHBfY2xvc2UobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKTsKK2V4dGVybiBtbV9jYW1lcmFfY2hhbm5lbF90ICogbW1fYXBwX2FkZF9jaGFubmVsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3R5cGVfdCBjaF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfbm90aWZ5X3QgY2hhbm5lbF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworZXh0ZXJuIGludCBtbV9hcHBfZGVsX2NoYW5uZWwobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCk7CitleHRlcm4gbW1fY2FtZXJhX3N0cmVhbV90ICogbW1fYXBwX2FkZF9zdHJlYW0obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwpOworZXh0ZXJuIGludCBtbV9hcHBfZGVsX3N0cmVhbShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc3RyZWFtKTsKK2V4dGVybiBpbnQgbW1fYXBwX2NvbmZpZ19zdHJlYW0obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3N0cmVhbV9jb25maWdfdCAqY29uZmlnKTsKK2V4dGVybiBpbnQgbW1fYXBwX3N0YXJ0X2NoYW5uZWwobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsKTsKK2V4dGVybiBpbnQgbW1fYXBwX3N0b3BfY2hhbm5lbChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCk7CitleHRlcm4gbW1fY2FtZXJhX2NoYW5uZWxfdCAqbW1fYXBwX2dldF9jaGFubmVsX2J5X3R5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90eXBlX3QgY2hfdHlwZSk7CisKK2V4dGVybiBpbnQgbW1fYXBwX3N0YXJ0X3ByZXZpZXcobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKTsKK2V4dGVybiBpbnQgbW1fYXBwX3N0b3BfcHJldmlldyhtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopOworZXh0ZXJuIGludCBtbV9hcHBfc3RhcnRfcHJldmlld196c2wobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKTsKK2V4dGVybiBpbnQgbW1fYXBwX3N0b3BfcHJldmlld196c2wobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKTsKK2V4dGVybiBtbV9jYW1lcmFfY2hhbm5lbF90ICogbW1fYXBwX2FkZF9wcmV2aWV3X2NoYW5uZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaik7CitleHRlcm4gbW1fY2FtZXJhX3N0cmVhbV90ICogbW1fYXBwX2FkZF9yYXdfc3RyZWFtKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IHN0cmVhbV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYnVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2J1cnN0KTsKK2V4dGVybiBpbnQgbW1fYXBwX3N0b3BfYW5kX2RlbF9jaGFubmVsKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwpOworZXh0ZXJuIG1tX2NhbWVyYV9jaGFubmVsX3QgKiBtbV9hcHBfYWRkX3NuYXBzaG90X2NoYW5uZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaik7CitleHRlcm4gbW1fY2FtZXJhX3N0cmVhbV90ICogbW1fYXBwX2FkZF9zbmFwc2hvdF9zdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCBzdHJlYW1fY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2J1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9idXJzdCk7CitleHRlcm4gbW1fY2FtZXJhX3N0cmVhbV90ICogbW1fYXBwX2FkZF9tZXRhZGF0YV9zdHJlYW0obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IHN0cmVhbV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2J1ZnMpOworZXh0ZXJuIGludCBtbV9hcHBfc3RhcnRfcmVjb3JkX3ByZXZpZXcobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLCBtbV9jYW1lcmFfbGliX3NuYXBzaG90X3BhcmFtcyAqZGltKTsKK2V4dGVybiBpbnQgbW1fYXBwX3N0b3BfcmVjb3JkX3ByZXZpZXcobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKTsKK2V4dGVybiBpbnQgbW1fYXBwX3N0YXJ0X3JlY29yZChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopOworZXh0ZXJuIGludCBtbV9hcHBfc3RvcF9yZWNvcmQobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKTsKK2V4dGVybiBpbnQgbW1fYXBwX3N0YXJ0X2xpdmVfc25hcHNob3QobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKTsKK2V4dGVybiBpbnQgbW1fYXBwX3N0b3BfbGl2ZV9zbmFwc2hvdChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopOworZXh0ZXJuIGludCBtbV9hcHBfc3RhcnRfY2FwdHVyZShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3NuYXBzaG90cyk7CitleHRlcm4gaW50IG1tX2FwcF9zdG9wX2NhcHR1cmUobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKTsKK2V4dGVybiBpbnQgbW1fYXBwX3N0YXJ0X2NhcHR1cmVfcmF3KG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX3NuYXBzaG90cyk7CitleHRlcm4gaW50IG1tX2FwcF9zdG9wX2NhcHR1cmVfcmF3KG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaik7CitleHRlcm4gaW50IG1tX2FwcF9zdGFydF9yZGkobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLCB1aW50OF90IG51bV9idXJzdCk7CitleHRlcm4gaW50IG1tX2FwcF9zdG9wX3JkaShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopOworZXh0ZXJuIGludCBtbV9hcHBfaW5pdGlhbGl6ZV9mYihtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopOworZXh0ZXJuIGludCBtbV9hcHBfY2xvc2VfZmIobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKTsKK2V4dGVybiBpbnQgbW1fYXBwX2ZiX3dyaXRlKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgY2hhciAqYnVmZmVyKTsKK2V4dGVybiBpbnQgbW1fYXBwX292ZXJsYXlfZGlzcGxheShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosIGludCBidWZmZXJGZCk7CitleHRlcm4gaW50IG1tX2FwcF9hbGxvY2F0ZV9pb25fbWVtb3J5KG1tX2NhbWVyYV9hcHBfYnVmX3QgKmJ1ZiwgdW5zaWduZWQgaW50IGlvbl90eXBlKTsKK2V4dGVybiBpbnQgbW1fYXBwX2RlYWxsb2NhdGVfaW9uX21lbW9yeShtbV9jYW1lcmFfYXBwX2J1Zl90ICpidWYpOworZXh0ZXJuIGludCBtbV9hcHBfc2V0X3BhcmFtcyhtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgY2FtX2ludGZfcGFybV90eXBlX3QgcGFyYW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlKTsKK2V4dGVybiBpbnQgbW1fYXBwX3NldF9wcmV2aWV3X2Zwc19yYW5nZShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZnBzX3JhbmdlX3QgKmZwc1JhbmdlKTsKK2V4dGVybiBpbnQgbW1fYXBwX3NldF9mYWNlX2RldGVjdGlvbihtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1fZmRfc2V0X3Bhcm1fdCAqZmRfc2V0X3Bhcm0pOworZXh0ZXJuIGludCBtbV9hcHBfc2V0X21ldGFkYXRhX3VzZXJjYihtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgY2FtX3N0cmVhbV91c2VyX2NiIHVzZXJjYik7CitleHRlcm4gaW50IG1tX2FwcF9zZXRfZmFjZV9kZXRlY3Rpb24obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICBjYW1fZmRfc2V0X3Bhcm1fdCAqZmRfc2V0X3Bhcm0pOworZXh0ZXJuIGludCBtbV9hcHBfc2V0X2ZsYXNoX21vZGUobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICBjYW1fZmxhc2hfbW9kZV90IGZsYXNoTW9kZSk7CisKKy8qIEpJRyBjYW1lcmEgbGliIGludGVyZmFjZSAqLworCitpbnQgbW1fY2FtZXJhX2xpYl9vcGVuKG1tX2NhbWVyYV9saWJfaGFuZGxlICpoYW5kbGUsIGludCBjYW1faWQpOworaW50IG1tX2NhbWVyYV9saWJfZ2V0X2NhcHMobW1fY2FtZXJhX2xpYl9oYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbV9jYXBhYmlsaXR5X3QgKmNhcHMpOworaW50IG1tX2NhbWVyYV9saWJfc3RhcnRfc3RyZWFtKG1tX2NhbWVyYV9saWJfaGFuZGxlICpoYW5kbGUpOworaW50IG1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKG1tX2NhbWVyYV9saWJfaGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2xpYl9jb21tYW5kcyBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgdm9pZCAqb3V0X2RhdGEpOworaW50IG1tX2NhbWVyYV9saWJfc3RvcF9zdHJlYW0obW1fY2FtZXJhX2xpYl9oYW5kbGUgKmhhbmRsZSk7CitpbnQgbW1fY2FtZXJhX2xpYl9udW1iZXJfb2ZfY2FtZXJhcyhtbV9jYW1lcmFfbGliX2hhbmRsZSAqaGFuZGxlKTsKK2ludCBtbV9jYW1lcmFfbGliX2Nsb3NlKG1tX2NhbWVyYV9saWJfaGFuZGxlICpoYW5kbGUpOworaW50MzJfdCBtbV9jYW1lcmFfbG9hZF90dW5pbmdsaWJyYXJ5KAorICBtbV9jYW1lcmFfdHVuaW5nX2xpYl9wYXJhbXNfdCAqdHVuaW5nX3BhcmFtKTsKK2ludCBtbV9jYW1lcmFfbGliX3NldF9wcmV2aWV3X3VzZXJjYigKKyAgbW1fY2FtZXJhX2xpYl9oYW5kbGUgKmhhbmRsZSwgY2FtX3N0cmVhbV91c2VyX2NiIGNiKTsKKy8vCisKK2ludCBtbV9hcHBfc3RhcnRfcmVncmVzc2lvbl90ZXN0KGludCBydW5fdGMpOworaW50IG1tX2FwcF9sb2FkX2hhbChtbV9jYW1lcmFfYXBwX3QgKm15X2NhbV9hcHApOworCitleHRlcm4gaW50IGNyZWF0ZUVuY29kaW5nU2Vzc2lvbihtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqbV9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1fZnJhbWUpOworZXh0ZXJuIGludCBlbmNvZGVEYXRhKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgbW1fY2FtZXJhX3N1cGVyX2J1Zl90KiByZWN2ZF9mcmFtZSwKKyAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqbV9zdHJlYW0pOworZXh0ZXJuIGludCBtbV9hcHBfdGFrZV9waWN0dXJlKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgdWludDhfdCk7CisKK2V4dGVybiBtbV9jYW1lcmFfY2hhbm5lbF90ICogbW1fYXBwX2FkZF9yZXByb2Nlc3NfY2hhbm5lbChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnNvdXJjZV9zdHJlYW0pOworZXh0ZXJuIGludCBtbV9hcHBfc3RhcnRfcmVwcm9jZXNzKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaik7CitleHRlcm4gaW50IG1tX2FwcF9zdG9wX3JlcHJvY2VzcyhtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopOworZXh0ZXJuIGludCBtbV9hcHBfZG9fcmVwcm9jZXNzKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwKKyAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqZnJhbWUsCisgICAgICAgIHVpbnQzMl90IG1ldGFfaWR4LAorICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2J1ZiwKKyAgICAgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzcmNfbWV0YSk7CitleHRlcm4gdm9pZCBtbV9hcHBfcmVsZWFzZV9wcGlucHV0KHZvaWQgKmRhdGEsIHZvaWQgKnVzZXJfZGF0YSk7CisKK2V4dGVybiBpbnQgbW1fY2FtZXJhX3F1ZXVlX2luaXQobW1fY2FtZXJhX3F1ZXVlX3QgKnF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfZGF0YV9mbiBkYXRhX3JlbF9mbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpOworZXh0ZXJuIGludCBtbV9xY2FtZXJhX3F1ZXVlX3JlbGVhc2UobW1fY2FtZXJhX3F1ZXVlX3QgKnF1ZXVlKTsKK2V4dGVybiBpbnQgbW1fcWNhbWVyYV9xdWV1ZV9pc2VtcHR5KG1tX2NhbWVyYV9xdWV1ZV90ICpxdWV1ZSk7CitleHRlcm4gaW50IG1tX3FjYW1lcmFfcXVldWVfZW5xdWV1ZShtbV9jYW1lcmFfcXVldWVfdCAqcXVldWUsIHZvaWQgKmRhdGEpOworZXh0ZXJuIHZvaWQqIG1tX3FjYW1lcmFfcXVldWVfZGVxdWV1ZShtbV9jYW1lcmFfcXVldWVfdCAqcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiRnJvbUhlYWQpOworZXh0ZXJuIHZvaWQgbW1fcWNhbWVyYV9xdWV1ZV9mbHVzaChtbV9jYW1lcmFfcXVldWVfdCAqcXVldWUpOworCisjZW5kaWYgLyogX19NTV9RQ0FNRVJBX0FQUF9IX18gKi8KKworCisKKworCisKKworCisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9pbmMvbW1fcWNhbWVyYV9jb21tYW5kcy5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L2luYy9tbV9xY2FtZXJhX2NvbW1hbmRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3YWMzMwotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9pbmMvbW1fcWNhbWVyYV9jb21tYW5kcy5oCkBAIC0wLDAgKzEsNjggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMywgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19NTV9RQ0FNRVJBX0NPTU1BTkRTX0hfXworI2RlZmluZSBfX01NX1FDQU1FUkFfQ09NTUFORFNfSF9fCisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJtbV9xY2FtZXJhX3NvY2tldC5oIgorI2luY2x1ZGUgIm1tX3FjYW1lcmFfYXBwLmgiCisKK2ludCB0dW5lc2VydmVyX2Nsb3NlX2NhbShtbV9jYW1lcmFfbGliX2hhbmRsZSAqbGliX2hhbmRsZSk7CitpbnQgdHVuZXNlcnZlcl9zdG9wX2NhbShtbV9jYW1lcmFfbGliX2hhbmRsZSAqbGliX2hhbmRsZSk7CitpbnQgdHVuZXNlcnZlcl9vcGVuX2NhbShtbV9jYW1lcmFfbGliX2hhbmRsZSAqbGliX2hhbmRsZSk7CisKK2ludCB0dW5lc2VydmVyX2luaXRpYWxpemVfdHVuaW5ncCh2b2lkICogY3RybCwgaW50IGNsaWVudF9zb2NrZXRfaWQsCisgIGNoYXIgKnNlbmRfYnVmLCB1aW50MzJfdCBzZW5kX2xlbik7CitpbnQgdHVuZXNlcnZlcl9kZWluaXRpYWxpemVfdHVuaW5ncCh2b2lkICogY3RybCwgaW50IGNsaWVudF9zb2NrZXRfaWQsCisgIGNoYXIgKnNlbmRfYnVmLCB1aW50MzJfdCBzZW5kX2xlbik7CitpbnQgdHVuZXNlcnZlcl9wcm9jZXNzX2dldF9saXN0X2NtZCh2b2lkICogY3RybCwgdm9pZCAqcmVjdl9jbWQsCisgIGNoYXIgKnNlbmRfYnVmLCB1aW50MzJfdCBzZW5kX2xlbik7CitpbnQgdHVuZXNlcnZlcl9wcm9jZXNzX21pc2NfY21kKHZvaWQgKiBjdHJsLCB2b2lkICpyZWN2X2NtZCwKKyAgY2hhciAqc2VuZF9idWYsIHVpbnQzMl90IHNlbmRfbGVuKTsKK2ludCB0dW5lc2VydmVyX3Byb2Nlc3NfZ2V0X3BhcmFtc19jbWQodm9pZCAqIGN0cmwsIHZvaWQgKnJlY3ZfY21kLAorICBjaGFyICpzZW5kX2J1ZiwgdWludDMyX3Qgc2VuZF9sZW4pOworaW50IHR1bmVzZXJ2ZXJfcHJvY2Vzc19zZXRfcGFyYW1zX2NtZCh2b2lkICogY3RybCwgdm9pZCAqcmVjdl9jbWQsCisgIGNoYXIgKnNlbmRfYnVmLCB1aW50MzJfdCBzZW5kX2xlbik7CisKK2ludCB0dW5lc2VydmVyX2luaXRpYWxpemVfcHJldnR1bmluZ3Aodm9pZCAqIGN0cmwsCisgIGludCBwcl9jbGllbnRfc29ja2V0X2lkLCBjYW1fZGltZW5zaW9uX3QgZGltZW5zaW9uLAorICBjaGFyICoqc2VuZF9idWYsIHVpbnQzMl90ICpzZW5kX2xlbik7CitpbnQgdHVuZXNlcnZlcl9kZWluaXRpYWxpemVfcHJldnR1bmluZ3Aodm9pZCAqIGN0cmwsCisgIGNoYXIgKipzZW5kX2J1ZiwgdWludDMyX3QgKnNlbmRfbGVuKTsKK2ludCB0dW5lc2VydmVyX3ByZXZpZXdfZ2V0aW5mbyh2b2lkICogY3RybCwKKyAgY2hhciAqKnNlbmRfYnVmLCB1aW50MzJfdCAqc2VuZF9sZW4pOworaW50IHR1bmVzZXJ2ZXJfcHJldmlld19nZXRjaHVua3NpemUodm9pZCAqIGN0cmwsCisgIGNoYXIgKipzZW5kX2J1ZiwgdWludDMyX3QgKnNlbmRfbGVuKTsKK2ludCB0dW5lc2VydmVyX3ByZXZpZXdfZ2V0ZnJhbWUodm9pZCAqIGN0cmwsCisgIGNoYXIgKipzZW5kX2J1ZiwgdWludDMyX3QgKnNlbmRfbGVuKTsKK2ludCB0dW5lc2VydmVyX3ByZXZpZXdfdW5zdXBwb3J0ZWQodm9pZCAqIGN0cmwsCisgIGNoYXIgKipzZW5kX2J1ZiwgdWludDMyX3QgKnNlbmRfbGVuKTsKKworI2VuZGlmIC8qX19NTV9RQ0FNRVJBX0NPTU1BTkRTX0hfXyovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3QvaW5jL21tX3FjYW1lcmFfZGJnLmggYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3QvaW5jL21tX3FjYW1lcmFfZGJnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkMTk3ZQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9pbmMvbW1fcWNhbWVyYV9kYmcuaApAQCAtMCwwICsxLDM4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIF9fTU1fUUNBTUVSQV9EQkdfSF9fCisjZGVmaW5lIF9fTU1fUUNBTUVSQV9EQkdfSF9fCisKKyNpZmRlZiBRQ0FNRVJBX1JFREVGSU5FX0xPRworI2RlZmluZSBDQU1fTU9EVUxFIENBTV9IQUxfTU9EVUxFCisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorI2VuZGlmCisKKyNlbmRpZiAvKiBfX01NX1FDQU1FUkFfREJHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L2luYy9tbV9xY2FtZXJhX21haW5fbWVudS5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L2luYy9tbV9xY2FtZXJhX21haW5fbWVudS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OTYwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3QvaW5jL21tX3FjYW1lcmFfbWFpbl9tZW51LmgKQEAgLTAsMCArMSw0NDAgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMywgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19NTV9RQ0FNRVJBX01BSU5fTUVOVV9IX18KKyNkZWZpbmUgX19NTV9RQ0FNRVJBX01BSU5fTUVOVV9IX18KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJtbV9qcGVnX2ludGVyZmFjZS5oIgorCisjZGVmaW5lIFZJREVPX0JVRkZFUl9TSVpFICAgICAgIChQUkVWSUVXX1dJRFRIICogUFJFVklFV19IRUlHSFQgKiAzLzIpCisjZGVmaW5lIFRIVU1CTkFJTF9CVUZGRVJfU0laRSAgIChUSFVNQk5BSUxfV0lEVEggKiBUSFVNQk5BSUxfSEVJR0hUICogMy8yKQorI2RlZmluZSBTTkFQU0hPVF9CVUZGRVJfU0laRSAgICAoUElDVFVSRV9XSURUSCAqIFBJQ1RVUkVfSEVJR0hUICogMy8yKQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTWFjcm8KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgUFJFVklFV19GUkFNRVNfTlVNICAgIDUKKyNkZWZpbmUgVklERU9fRlJBTUVTX05VTSAgICAgIDUKKyNkZWZpbmUgVEhVTUJOQUlMX0ZSQU1FU19OVU0gIDEKKyNkZWZpbmUgU05BUFNIT1RfRlJBTUVTX05VTSAgIDEKKyNkZWZpbmUgTUFYX05VTV9GT1JNQVQgICAgICAgIDMyCisKK3R5cGVkZWYgZW51bQoreworICBTVEFSVF9QUkVWSUVXLAorICBTVE9QX1BSRVZJRVcsCisgIFNFVF9XSElURV9CQUxBTkNFLAorICBTRVRfVElOVExFU1NfRU5BQkxFLAorICBTRVRfVElOVExFU1NfRElTQUJMRSwKKyAgU0VUX0VYUF9NRVRFUklORywKKyAgVE9HR0xFX0lSTEVELAorICBUT0dHTEVfRVpUVU5FLAorICBTRVRfSVNPLAorICBCUklHSFRORVNTX0dPVE9fU1VCTUVOVSwKKyAgQ09OVFJBU1RfR09UT19TVUJNRU5VLAorICBFVl9HT1RPX1NVQk1FTlUsCisgIFNBVFVSQVRJT05fR09UT19TVUJNRU5VLAorICBTRVRfWk9PTSwKKyAgU0VUX1NIQVJQTkVTUywKKyAgVEFLRV9KUEVHX1NOQVBTSE9ULAorICBTVEFSVF9SRUNPUkRJTkcsCisgIFNUT1BfUkVDT1JESU5HLAorICBCRVNUX1NIT1QsCisgIExJVkVfU0hPVCwKKyAgRkxBU0hfTU9ERVMsCisgIFRPR0dMRV9aU0wsCisgIFRBS0VfUkFXX1NOQVBTSE9ULAorICBTV0lUQ0hfU05BUF9SRVNPTFVUSU9OLAorICBUT0dHTEVfV05SLAorICBFWElUCit9IENhbWVyYV9tYWluX21lbnVfdDsKKwordHlwZWRlZiBlbnVtCit7CisgIEFDVElPTl9OT19BQ1RJT04sCisgIEFDVElPTl9TVEFSVF9QUkVWSUVXLAorICBBQ1RJT05fU1RPUF9QUkVWSUVXLAorICBBQ1RJT05fU0VUX1dISVRFX0JBTEFOQ0UsCisgIEFDVElPTl9TRVRfVElOVExFU1NfRU5BQkxFLAorICBBQ1RJT05fU0VUX1RJTlRMRVNTX0RJU0FCTEUsCisgIEFDVElPTl9TRVRfRVhQX01FVEVSSU5HLAorICBBQ1RJT05fVE9HR0xFX0lSX01PREUsCisgIEFDVElPTl9UT0dHTEVfQUZSLAorICBBQ1RJT05fVE9HR0xFX0VaVFVORSwKKyAgQUNUSU9OX1NFVF9JU08sCisgIEFDVElPTl9CUklHSFRORVNTX0lOQ1JFQVNFLAorICBBQ1RJT05fQlJJR0hUTkVTU19ERUNSRUFTRSwKKyAgQUNUSU9OX0NPTlRSQVNUX0lOQ1JFQVNFLAorICBBQ1RJT05fQ09OVFJBU1RfREVDUkVBU0UsCisgIEFDVElPTl9FVl9JTkNSRUFTRSwKKyAgQUNUSU9OX0VWX0RFQ1JFQVNFLAorICBBQ1RJT05fU0FUVVJBVElPTl9JTkNSRUFTRSwKKyAgQUNUSU9OX1NBVFVSQVRJT05fREVDUkVBU0UsCisgIEFDVElPTl9TRVRfWk9PTSwKKyAgQUNUSU9OX1NIQVJQTkVTU19JTkNSRUFTRSwKKyAgQUNUSU9OX1NIQVJQTkVTU19ERUNSRUFTRSwKKyAgQUNUSU9OX1RBS0VfSlBFR19TTkFQU0hPVCwKKyAgQUNUSU9OX1NUQVJUX1JFQ09SRElORywKKyAgQUNUSU9OX1NUT1BfUkVDT1JESU5HLAorICBBQ1RJT05fU0VUX0JFU1RTSE9UX01PREUsCisgIEFDVElPTl9UQUtFX0xJVkVfU05BUFNIT1QsCisgIEFDVElPTl9TRVRfRkxBU0hfTU9ERSwKKyAgQUNUSU9OX1NXSVRDSF9DQU1FUkEsCisgIEFDVElPTl9UT0dHTEVfWlNMLAorICBBQ1RJT05fVEFLRV9SQVdfU05BUFNIT1QsCisgIEFDVElPTl9TV0lUQ0hfUkVTT0xVVElPTiwKKyAgQUNUSU9OX1RPR0dMRV9XTlIsCisgIEFDVElPTl9FWElUCit9IGNhbWVyYV9hY3Rpb25fdDsKKworI2RlZmluZSBJTlZBTElEX0tFWV9QUkVTUyAwCisjZGVmaW5lIEJBU0VfT0ZGU0VUICAoJ1onIC0gJ0EnICsgMSkKKyNkZWZpbmUgQkFTRV9PRkZTRVRfTlVNICAoJ1onIC0gJ0EnICsgMikKKyNkZWZpbmUgUEFEX1RPX1dPUkQoYSkgICgoKGEpKzMpJn4zKQorCisKKyNkZWZpbmUgU1FDSUZfV0lEVEggICAgIDEyOAorI2RlZmluZSBTUUNJRl9IRUlHSFQgICAgIDk2CisjZGVmaW5lIFFDSUZfV0lEVEggICAgICAxNzYKKyNkZWZpbmUgUUNJRl9IRUlHSFQgICAgIDE0NAorI2RlZmluZSBRVkdBX1dJRFRIICAgICAgMzIwCisjZGVmaW5lIFFWR0FfSEVJR0hUICAgICAyNDAKKyNkZWZpbmUgSERfVEhVTUJOQUlMX1dJRFRIICAgICAgMjU2CisjZGVmaW5lIEhEX1RIVU1CTkFJTF9IRUlHSFQgICAgIDE0NAorI2RlZmluZSBDSUZfV0lEVEggICAgICAgMzUyCisjZGVmaW5lIENJRl9IRUlHSFQgICAgICAyODgKKyNkZWZpbmUgVkdBX1dJRFRIICAgICAgIDY0MAorI2RlZmluZSBWR0FfSEVJR0hUICAgICAgNDgwCisjZGVmaW5lIFdWR0FfV0lEVEggICAgICA4MDAKKyNkZWZpbmUgV1ZHQV9IRUlHSFQgICAgIDQ4MAorI2RlZmluZSBXVkdBX1BMVVNfV0lEVEggICAgICA5NjAKKyNkZWZpbmUgV1ZHQV9QTFVTX0hFSUdIVCAgICAgNzIwCisKKyNkZWZpbmUgTVAxX1dJRFRIICAgICAgMTI4MAorI2RlZmluZSBNUDFfSEVJR0hUICAgICAgOTYwCisjZGVmaW5lIE1QMl9XSURUSCAgICAgIDE2MDAKKyNkZWZpbmUgTVAyX0hFSUdIVCAgICAgMTIwMAorI2RlZmluZSBNUDNfV0lEVEggICAgICAyMDQ4CisjZGVmaW5lIE1QM19IRUlHSFQgICAgIDE1MzYKKyNkZWZpbmUgTVA1X1dJRFRIICAgICAgMjU5MgorI2RlZmluZSBNUDVfSEVJR0hUICAgICAxOTQ0CisjZGVmaW5lIE1QOF9XSURUSCAgICAgIDMyNjQKKyNkZWZpbmUgTVA4X0hFSUdIVCAgICAgMjQ0OAorI2RlZmluZSBNUDEyX1dJRFRIICAgICA0MDAwCisjZGVmaW5lIE1QMTJfSEVJR0hUICAgIDMwMDAKKworI2RlZmluZSBTVkdBX1dJRFRIICAgICAgODAwCisjZGVmaW5lIFNWR0FfSEVJR0hUICAgICA2MDAKKyNkZWZpbmUgWEdBX1dJRFRIICAgICAgMTAyNAorI2RlZmluZSBYR0FfSEVJR0hUICAgICAgNzY4CisjZGVmaW5lIEhENzIwX1dJRFRIICAgIDEyODAKKyNkZWZpbmUgSEQ3MjBfSEVJR0hUICAgIDcyMAorI2RlZmluZSBIRDcyMF9QTFVTX1dJRFRIICAgIDE0NDAKKyNkZWZpbmUgSEQ3MjBfUExVU19IRUlHSFQgICAxMDgwCisjZGVmaW5lIFdYR0FfV0lEVEggICAgIDEyODAKKyNkZWZpbmUgV1hHQV9IRUlHSFQgICAgIDc2OAorI2RlZmluZSBIRDEwODBfV0lEVEggICAxOTIwCisjZGVmaW5lIEhEMTA4MF9IRUlHSFQgIDEwODAKKworCisjZGVmaW5lIE9ORU1QX1dJRFRIICAgIDEyODAKKyNkZWZpbmUgU1hHQV9XSURUSCAgICAgMTI4MAorI2RlZmluZSBVWEdBX1dJRFRIICAgICAxNjAwCisjZGVmaW5lIFFYR0FfV0lEVEggICAgIDIwNDgKKyNkZWZpbmUgRklWRU1QX1dJRFRIICAgMjU2MAorCisKKyNkZWZpbmUgT05FTVBfSEVJR0hUICAgIDk2MAorI2RlZmluZSBTWEdBX0hFSUdIVCAgICAgMTAyNAorI2RlZmluZSBVWEdBX0hFSUdIVCAgICAgMTIwMAorI2RlZmluZSBRWEdBX0hFSUdIVCAgICAgMTUzNgorI2RlZmluZSBGSVZFTVBfSEVJR0hUICAgMTkyMAorCisKK3R5cGVkZWYgZW51bQoreworICBSRVNPTFVUSU9OX01JTiwKKyAgUUNJRiAgICAgICAgICAgICAgICAgID0gUkVTT0xVVElPTl9NSU4sCisgIFFWR0EsCisgIFZHQSwKKyAgV1ZHQSwKKyAgV1ZHQV9QTFVTICwKKyAgSEQ3MjAsCisgIEhENzIwX1BMVVMsCisgIEhEMTA4MCwKKyAgUkVTT0xVVElPTl9QUkVWSUVXX1ZJREVPX01BWCA9IEhEMTA4MCwKKyAgV1hHQSwKKyAgTVAxLAorICBNUDIsCisgIE1QMywKKyAgTVA1LAorICBNUDgsCisgIE1QMTIsCisgIFJFU09MVVRJT05fTUFYICAgICAgICAgPSBNUDEyLAorfSBDYW1lcmFfUmVzb2x1dGlvbjsKKwordHlwZWRlZiBzdHJ1Y3R7CisgICAgdWludDE2X3Qgd2lkdGg7CisgICAgdWludDE2X3QgIGhlaWdodDsKKyAgICBjaGFyICogbmFtZTsKKyAgICBjaGFyICogc3RyX25hbWU7CisgICAgaW50IHN1cHBvcnRlZDsKK30gRElNRU5TSU9OX1RCTF9UOworCit0eXBlZGVmIGVudW0geworICAgIFdISVRFX0JBTEFOQ0VfU1RBVEUsCisgICAgV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRSwKKyAgICBCUklHSFRORVNTX0NUUkwsCisgICAgRVYsCisgICAgQ09OVFJBU1RfQ1RSTCwKKyAgICBTQVRVUkFUSU9OX0NUUkwsCisgICAgU0hBUlBORVNTX0NUUkwKK30gR2V0X0N0cmxfbW9kZXM7CisKK3R5cGVkZWYgZW51bSB7CisgICAgQVVUT19FWFBfRlJBTUVfQVZHLAorICAgIEFVVE9fRVhQX0NFTlRFUl9XRUlHSFRFRCwKKyAgICBBVVRPX0VYUF9TUE9UX01FVEVSSU5HLAorICAgIEFVVE9fRVhQX1NNQVJUX01FVEVSSU5HLAorICAgIEFVVE9fRVhQX1VTRVJfTUVURVJJTkcsCisgICAgQVVUT19FWFBfU1BPVF9NRVRFUklOR19BRFYsCisgICAgQVVUT19FWFBfQ0VOVEVSX1dFSUdIVEVEX0FEViwKKyAgICBBVVRPX0VYUF9NQVgKK30gRXhwX01ldGVyaW5nX21vZGVzOworCit0eXBlZGVmIGVudW0geworICBJU09fQVVUTywKKyAgSVNPX0RFQkxVUiwKKyAgSVNPXzEwMCwKKyAgSVNPXzIwMCwKKyAgSVNPXzQwMCwKKyAgSVNPXzgwMCwKKyAgSVNPXzE2MDAsCisgIElTT19NQVgKK30gSVNPX21vZGVzOworCit0eXBlZGVmIGVudW0geworICBCRVNUU0hPVF9BVVRPLAorICBCRVNUU0hPVF9BQ1RJT04sCisgIEJFU1RTSE9UX1BPUlRSQUlULAorICBCRVNUU0hPVF9MQU5EU0NBUEUsCisgIEJFU1RTSE9UX05JR0hULAorICBCRVNUU0hPVF9OSUdIVF9QT1JUUkFJVCwKKyAgQkVTVFNIT1RfVEhFQVRSRSwKKyAgQkVTVFNIT1RfQkVBQ0gsCisgIEJFU1RTSE9UX1NOT1csCisgIEJFU1RTSE9UX1NVTlNFVCwKKyAgQkVTVFNIT1RfQU5USVNIQUtFLAorICBCRVNUU0hPVF9GSVJFV09SS1MsCisgIEJFU1RTSE9UX1NQT1JUUywKKyAgQkVTVFNIT1RfUEFSVFksCisgIEJFU1RTSE9UX0NBTkRMRUxJR0hULAorICBCRVNUU0hPVF9BU0QsCisgIEJFU1RTSE9UX0JBQ0tMSUdIVCwKKyAgQkVTVFNIT1RfRkxPV0VSUywKKyAgQkVTVFNIT1RfQVIsCisgIEJFU1RTSE9UX0hEUiwKKyAgQkVTVFNIT1RfTUFYCit9QmVzdHNob3RfbW9kZXM7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRkxBU0hfTU9ERV9PRkYsCisgICAgRkxBU0hfTU9ERV9BVVRPLAorICAgIEZMQVNIX01PREVfT04sCisgICAgRkxBU0hfTU9ERV9UT1JDSCwKKyAgICBGTEFTSF9NT0RFX01BWCwKK31GbGFzaF9tb2RlczsKKwordHlwZWRlZiBlbnVtIHsKKyAgV0JfQVVUTywKKyAgV0JfSU5DQU5ERVNDRU5ULAorICBXQl9GTFVPUkVTQ0VOVCwKKyAgV0JfV0FSTV9GTFVPUkVTQ0VOVCwKKyAgV0JfREFZTElHSFQsCisgIFdCX0NMT1VEWV9EQVlMSUdIVCwKKyAgV0JfVFdJTElHSFQsCisgIFdCX1NIQURFLAorICBXQl9NQVgKK30gV2hpdGVfQmFsYW5jZV9tb2RlczsKKwordHlwZWRlZiBlbnVtCit7CisgIE1FTlVfSURfTUFJTiwKKyAgTUVOVV9JRF9XSElURUJBTEFOQ0VDSEFOR0UsCisgIE1FTlVfSURfRVhQTUVURVJJTkdDSEFOR0UsCisgIE1FTlVfSURfR0VUX0NUUkxfVkFMVUUsCisgIE1FTlVfSURfVE9HR0xFQUZSLAorICBNRU5VX0lEX0lTT0NIQU5HRSwKKyAgTUVOVV9JRF9CUklHSFRORVNTQ0hBTkdFLAorICBNRU5VX0lEX0NPTlRSQVNUQ0hBTkdFLAorICBNRU5VX0lEX0VWQ0hBTkdFLAorICBNRU5VX0lEX1NBVFVSQVRJT05DSEFOR0UsCisgIE1FTlVfSURfWk9PTUNIQU5HRSwKKyAgTUVOVV9JRF9TSEFSUE5FU1NDSEFOR0UsCisgIE1FTlVfSURfQkVTVFNIT1QsCisgIE1FTlVfSURfRkxBU0hNT0RFLAorICBNRU5VX0lEX1NFTlNPUlMsCisgIE1FTlVfSURfU1dJVENIX1JFUywKKyAgTUVOVV9JRF9JTlZBTElELAorfSBtZW51X2lkX2NoYW5nZV90OworCit0eXBlZGVmIGVudW0KK3sKKyAgREVDUkVBU0VfWk9PTSwKKyAgSU5DUkVBU0VfWk9PTSwKKyAgSU5DUkVBU0VfU1RFUF9aT09NLAorICBERUNSRUFTRV9TVEVQX1pPT00sCit9IENhbWVyYV9ab29tOworCit0eXBlZGVmIGVudW0KK3sKKyAgSU5DX0NPTlRSQVNULAorICBERUNfQ09OVFJBU1QsCit9IENhbWVyYV9Db250cmFzdF9jaGFuZ2VzOworCit0eXBlZGVmIGVudW0KK3sKKyAgSU5DX0JSSUdIVE5FU1MsCisgIERFQ19CUklHSFRORVNTLAorfSBDYW1lcmFfQnJpZ2h0bmVzc19jaGFuZ2VzOworCit0eXBlZGVmIGVudW0KK3sKKyAgSU5DUkVBU0VfRVYsCisgIERFQ1JFQVNFX0VWLAorfSBDYW1lcmFfRVZfY2hhbmdlczsKKwordHlwZWRlZiBlbnVtIHsKKyAgSU5DX1NBVFVSQVRJT04sCisgIERFQ19TQVRVUkFUSU9OLAorfSBDYW1lcmFfU2F0dXJhdGlvbl9jaGFuZ2VzOworCit0eXBlZGVmIGVudW0KK3sKKyAgSU5DX0lTTywKKyAgREVDX0lTTywKK30gQ2FtZXJhX0lTT19jaGFuZ2VzOworCit0eXBlZGVmIGVudW0KK3sKKyAgSU5DX1NIQVJQTkVTUywKKyAgREVDX1NIQVJQTkVTUywKK30gQ2FtZXJhX1NoYXJwbmVzc19jaGFuZ2VzOworCit0eXBlZGVmIGVudW0geworICBaT09NX0lOLAorICBaT09NX09VVCwKK30gWm9vbV9kaXJlY3Rpb247CisKK3R5cGVkZWYgc3RydWN0eworICAgIENhbWVyYV9tYWluX21lbnVfdCBtYWluX21lbnU7CisgICAgY2hhciAqIG1lbnVfbmFtZTsKK30gQ0FNRVJBX01BSU5fTUVOVV9UQkxfVDsKKwordHlwZWRlZiBzdHJ1Y3R7CisgICAgY2hhciAqIG1lbnVfbmFtZTsKKyAgICBpbnQgcHJlc2VudDsKK30gQ0FNRVJBX1NFTlNPUl9NRU5VX1RMQl9UOworCit0eXBlZGVmIHN0cnVjdHsKKyAgICBDYW1lcmFfUmVzb2x1dGlvbiBjc19pZDsKKyAgICB1aW50MTZfdCB3aWR0aDsKKyAgICB1aW50MTZfdCAgaGVpZ2h0OworICAgIGNoYXIgKiBuYW1lOworICAgIGNoYXIgKiBzdHJfbmFtZTsKK30gUFJFVklFV19ESU1FTlNJT05fVEJMX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgV2hpdGVfQmFsYW5jZV9tb2RlcyB3Yl9pZDsKKyAgY2hhciAqIHdiX25hbWU7Cit9IFdISVRFX0JBTEFOQ0VfVEJMX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgR2V0X0N0cmxfbW9kZXMgZ2V0X2N0cmxfaWQ7CisgIGNoYXIgKiBnZXRfY3RybF9uYW1lOworfSBHRVRfQ1RSTF9UQkxfVDsKKwordHlwZWRlZiBzdHJ1Y3R7CisgIEV4cF9NZXRlcmluZ19tb2RlcyBleHBfbWV0ZXJpbmdfaWQ7CisgIGNoYXIgKiBleHBfbWV0ZXJpbmdfbmFtZTsKK30gRVhQX01FVEVSSU5HX1RCTF9UOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEJlc3RzaG90X21vZGVzIGJzX2lkOworICBjaGFyICpuYW1lOworfSBCRVNUU0hPVF9NT0RFX1RCVF9UOworCit0eXBlZGVmIHN0cnVjdCB7CisgIEZsYXNoX21vZGVzIGJzX2lkOworICBjaGFyICpuYW1lOworfSBGTEFTSF9NT0RFX1RCTF9UOworCit0eXBlZGVmIHN0cnVjdCB7CisgIElTT19tb2RlcyBpc29fbW9kZXM7CisgIGNoYXIgKmlzb19tb2Rlc19uYW1lOworfSBJU09fVEJMX1Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgWm9vbV9kaXJlY3Rpb24gem9vbV9kaXJlY3Rpb247CisgIGNoYXIgKiB6b29tX2RpcmVjdGlvbl9uYW1lOworfSBaT09NX1RCTF9UOworCit0eXBlZGVmIHN0cnVjdCB7CisgIENhbWVyYV9TaGFycG5lc3NfY2hhbmdlcyBzaGFycG5lc3NfY2hhbmdlOworICBjaGFyICpzaGFycG5lc3NfY2hhbmdlX25hbWU7Cit9IFNIQVJQTkVTU19UQkxfVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBDYW1lcmFfQnJpZ2h0bmVzc19jaGFuZ2VzIGJjX2lkOworICBjaGFyICogYnJpZ2h0bmVzc19uYW1lOworfSBDQU1FUkFfQlJJR0hUTkVTU19UQkxfVDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBDYW1lcmFfQ29udHJhc3RfY2hhbmdlcyBjY19pZDsKKyAgY2hhciAqIGNvbnRyYXN0X25hbWU7Cit9IENBTUVSQV9DT05UUlNUX1RCTF9UOworCit0eXBlZGVmIHN0cnVjdCB7CisgIENhbWVyYV9FVl9jaGFuZ2VzIGVjX2lkOworICBjaGFyICogRVZfbmFtZTsKK30gQ0FNRVJBX0VWX1RCTF9UOworCit0eXBlZGVmIHN0cnVjdCB7CisgIENhbWVyYV9TYXR1cmF0aW9uX2NoYW5nZXMgc2NfaWQ7CisgIGNoYXIgKiBzYXR1cmF0aW9uX25hbWU7Cit9IENBTUVSQV9TQVRVUkFUSU9OX1RCTF9UOworCit0eXBlZGVmIHN0cnVjdCB7CisgIENhbWVyYV9TaGFycG5lc3NfY2hhbmdlcyBiY19pZDsKKyAgY2hhciAqIHNoYXJwbmVzc19uYW1lOworfSBDQU1FUkFfU0hBUlBORVNTX1RCTF9UOworCisjZW5kaWYgLyogX19NTV9RQ0FNRVJBX01BSU5fTUVOVV9IX18gKi8KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9pbmMvbW1fcWNhbWVyYV9zb2NrZXQuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9pbmMvbW1fcWNhbWVyYV9zb2NrZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODZjMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L2luYy9tbV9xY2FtZXJhX3NvY2tldC5oCkBAIC0wLDAgKzEsMTEzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19NTV9RQ0FNRVJBX1NPQ0tFVF9IX18KKyNkZWZpbmUgX19NTV9RQ0FNRVJBX1NPQ0tFVF9IX18KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjdW5kZWYgX19GRF9TRVQKKyNkZWZpbmUgX19GRF9TRVQoZmQsIGZkc2V0cCkgXAorICAoKChmZF9zZXQgKikoZmRzZXRwKSktPmZkc19iaXRzWyhmZCkgPj4gNV0gfD0gKDFMVTw8KChmZCkgJiAzMSkpKQorCisjdW5kZWYgX19GRF9DTFIKKyNkZWZpbmUgX19GRF9DTFIoZmQsIGZkc2V0cCkgXAorICAoKChmZF9zZXQgKikoZmRzZXRwKSktPmZkc19iaXRzWyhmZCkgPj4gNV0gJj0gfigxTFU8PCgoZmQpICYgMzEpKSkKKworI3VuZGVmICBfX0ZEX0lTU0VUCisjZGVmaW5lIF9fRkRfSVNTRVQoZmQsIGZkc2V0cCkgXAorICAoKCgoZmRfc2V0ICopKGZkc2V0cCkpLT5mZHNfYml0c1soZmQpID4+IDVdICYgKDFMVTw8KChmZCkgJiAzMSkpKSAhPSAwKQorCisjdW5kZWYgIF9fRkRfWkVSTworI2RlZmluZSBfX0ZEX1pFUk8oZmRzZXRwKSBcCisgIChtZW1zZXQgKGZkc2V0cCwgMCwgc2l6ZW9mICgqKGZkX3NldCAqKShmZHNldHApKSkpCisKKyNkZWZpbmUgVFVORVNFUlZFUl9NQVhfUkVDViAyMDQ4CisjZGVmaW5lIFRVTkVTRVJWRVJfTUFYKGEsIGIpICAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisKKyNkZWZpbmUgVFVORVNFUlZFUl9HRVRfTElTVCAxMDE0CisjZGVmaW5lIFRVTkVTRVJWRVJfR0VUX1BBUk1TIDEwMTUKKyNkZWZpbmUgVFVORVNFUlZFUl9TRVRfUEFSTVMgMTAxNgorI2RlZmluZSBUVU5FU0VSVkVSX01JU0NfQ01EUyAxMDIxCisKKyNkZWZpbmUgVFVORV9QUkVWX0dFVF9JTkZPICAgICAgICAweDAwMDEKKyNkZWZpbmUgVFVORV9QUkVWX0NIX0NOS19TSVpFICAgICAweDAwMDIKKyNkZWZpbmUgVFVORV9QUkVWX0dFVF9QUkVWX0ZSQU1FICAweDAwMDMKKyNkZWZpbmUgVFVORV9QUkVWX0dFVF9KUEdfU05BUCAgICAweDAwMDQKKyNkZWZpbmUgVFVORV9QUkVWX0dFVF9SQVdfU05BUCAgICAweDAwMDUKKyNkZWZpbmUgVFVORV9QUkVWX0dFVF9SQVdfUFJFViAgICAweDAwMDYKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyIGRhdGFbMTI4XTsKK30gdHVuZXNlcnZlcl9taXNjX2NtZDsKKwordHlwZWRlZiBlbnVtIHsKKyAgVFVORVNFUlZFUl9SRUNWX0NPTU1BTkQgPSAxLAorICBUVU5FU0VSVkVSX1JFQ1ZfUEFZTE9BRF9TSVpFLAorICBUVU5FU0VSVkVSX1JFQ1ZfUEFZTE9BRCwKKyAgVFVORVNFUlZFUl9SRUNWX1JFU1BPTlNFLAorICBUVU5FU0VSVkVSRVJfUkVDVl9JTlZBTElELAorfSB0dW5lc2VydmVyX3JlY3ZfY21kX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDE2X3QgICAgICAgICAgY3VycmVudF9jbWQ7CisgIHR1bmVzZXJ2ZXJfcmVjdl9jbWRfdCBuZXh0X3JlY3ZfY29kZTsKKyAgdWludDMyX3QgICAgICAgICAgbmV4dF9yZWN2X2xlbjsKKyAgdm9pZCAgICAgICAgICAgICAgKnJlY3ZfYnVmOworICB1aW50MzJfdCAgICAgICAgICByZWN2X2xlbjsKKyAgdWludDMyX3QgICAgICAgICAgc2VuZF9sZW47CisgIHZvaWQgICAgICAgICAgICAgICpzZW5kX2J1ZjsKK30gdHVuZXNlcnZlcl9wcm90b2NvbF90OworCit0eXBlZGVmIGVudW0geworICBUVU5FX1BSRVZfUkVDVl9DT01NQU5EID0gMSwKKyAgVFVORV9QUkVWX1JFQ1ZfTkVXQ05LU0laRSwKKyAgVFVORV9QUkVWX1JFQ1ZfSU5WQUxJRAorfSB0dW5lX3ByZXZfY21kX3Q7CisKK3R5cGVkZWYgc3RydWN0IF9lenR1bmVfcHJldmlld19wcm90b2NvbF90IHsKKyAgdWludDE2X3QgICAgICAgICBjdXJyZW50X2NtZDsKKyAgdHVuZV9wcmV2X2NtZF90ICBuZXh0X3JlY3ZfY29kZTsKKyAgdWludDMyX3QgICAgICAgICBuZXh0X3JlY3ZfbGVuOworICBpbnQzMl90ICAgICAgICAgIHNlbmRfbGVuOworICBjaGFyKiAgICAgICAgICAgIHNlbmRfYnVmOworICB1aW50MzJfdCAgICAgICAgIHNlbmRfYnVmX3NpemU7CisgIHVpbnQzMl90ICAgICAgICAgbmV3X2Nua19zaXplOworICB1aW50MzJfdCAgICAgICAgIG5ld19jbWRfYXZhaWxhYmxlOworfSBwcnNlcnZlcl9wcm90b2NvbF90OworCit0eXBlZGVmIHVuaW9uIHsKKyAgc3RydWN0IHNvY2thZGRyIGFkZHI7CisgIHN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyX2luOworfSBtbV9xY2FtZXJhX3NvY2tfYWRkcl90OworCitpbnQgZXp0dW5lX3NlcnZlcl9zdGFydCh2b2lkICpsaWJfaGFuZGxlKTsKKworI2VuZGlmIC8qX19NTV9RQ0FNRVJBX1NPQ0tFVF9IX18qLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX2FwcC5jIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX2FwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZGFkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfYXBwLmMKQEAgLTAsMCArMSwyNDcxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLy8gVG8gcmVtb3ZlCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KKyNkZWZpbmUgTU1BTl9IIDxTWVNURU1fSEVBREVSX1BSRUZJWC9tbWFuLmg+CisjaW5jbHVkZSBNTUFOX0gKKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX3FjYW1lcmFfZGJnLmgiCisjaW5jbHVkZSAibW1fcWNhbWVyYV9hcHAuaCIKKworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBhcHBfbXV0ZXg7CitzdGF0aWMgaW50IHRocmVhZF9zdGF0dXMgPSAwOworc3RhdGljIHB0aHJlYWRfY29uZF90IGFwcF9jb25kX3Y7CisKKyNkZWZpbmUgTU1fUUNBTUVSQV9BUFBfTkFOT1NFQ19TQ0FMRSAxMDAwMDAwMDAwCisKK2ludCBtbV9jYW1lcmFfYXBwX3RpbWVkd2FpdCh1aW50OF90IHNlY29uZHMpCit7CisgICAgaW50IHJjID0gMDsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmFwcF9tdXRleCk7CisgICAgaWYoRkFMU0UgPT0gdGhyZWFkX3N0YXR1cykgeworICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdHc7CisgICAgICAgIG1lbXNldCgmdHcsIDAsIHNpemVvZiB0dyk7CisgICAgICAgIHR3LnR2X3NlYyA9IDA7CisgICAgICAgIHR3LnR2X25zZWMgPSB0aW1lKDApICsgc2Vjb25kcyAqIE1NX1FDQU1FUkFfQVBQX05BTk9TRUNfU0NBTEU7CisKKyAgICAgICAgcmMgPSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KCZhcHBfY29uZF92LCAmYXBwX211dGV4LCZ0dyk7CisgICAgICAgIHRocmVhZF9zdGF0dXMgPSBGQUxTRTsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmFwcF9tdXRleCk7CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fY2FtZXJhX2FwcF93YWl0KCkKK3sKKyAgICBpbnQgcmMgPSAwOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYXBwX211dGV4KTsKKyAgICBpZihGQUxTRSA9PSB0aHJlYWRfc3RhdHVzKXsKKyAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmFwcF9jb25kX3YsICZhcHBfbXV0ZXgpOworICAgIH0KKyAgICB0aHJlYWRfc3RhdHVzID0gRkFMU0U7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmFwcF9tdXRleCk7CisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIG1tX2NhbWVyYV9hcHBfZG9uZSgpCit7CisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYXBwX211dGV4KTsKKyAgdGhyZWFkX3N0YXR1cyA9IFRSVUU7CisgIHB0aHJlYWRfY29uZF9zaWduYWwoJmFwcF9jb25kX3YpOworICBwdGhyZWFkX211dGV4X3VubG9jaygmYXBwX211dGV4KTsKK30KKworaW50IG1tX2FwcF9sb2FkX2hhbChtbV9jYW1lcmFfYXBwX3QgKm15X2NhbV9hcHApCit7CisgICAgbWVtc2V0KCZteV9jYW1fYXBwLT5oYWxfbGliLCAwLCBzaXplb2YoaGFsX2ludGVyZmFjZV9saWJfdCkpOworICAgIG15X2NhbV9hcHAtPmhhbF9saWIucHRyID0gZGxvcGVuKCJsaWJtbWNhbWVyYV9pbnRlcmZhY2Uuc28iLCBSVExEX05PVyk7CisgICAgbXlfY2FtX2FwcC0+aGFsX2xpYi5wdHJfanBlZyA9IGRsb3BlbigibGlibW1qcGVnX2ludGVyZmFjZS5zbyIsIFJUTERfTk9XKTsKKyAgICBpZiAoIW15X2NhbV9hcHAtPmhhbF9saWIucHRyIHx8ICFteV9jYW1fYXBwLT5oYWxfbGliLnB0cl9qcGVnKSB7CisgICAgICAgIExPR0UoIkVycm9yIG9wZW5pbmcgSEFMIGxpYnJhcnkgJXNcbiIsICBkbGVycm9yKCkpOworICAgICAgICByZXR1cm4gLU1NX0NBTUVSQV9FX0dFTkVSQUw7CisgICAgfQorICAgICoodm9pZCAqKikmKG15X2NhbV9hcHAtPmhhbF9saWIuZ2V0X251bV9vZl9jYW1lcmFzKSA9CisgICAgICAgIGRsc3ltKG15X2NhbV9hcHAtPmhhbF9saWIucHRyLCAiZ2V0X251bV9vZl9jYW1lcmFzIik7CisgICAgKih2b2lkICoqKSYobXlfY2FtX2FwcC0+aGFsX2xpYi5tbV9jYW1lcmFfb3BlbikgPQorICAgICAgICBkbHN5bShteV9jYW1fYXBwLT5oYWxfbGliLnB0ciwgImNhbWVyYV9vcGVuIik7CisgICAgKih2b2lkICoqKSYobXlfY2FtX2FwcC0+aGFsX2xpYi5qcGVnX29wZW4pID0KKyAgICAgICAgZGxzeW0obXlfY2FtX2FwcC0+aGFsX2xpYi5wdHJfanBlZywgImpwZWdfb3BlbiIpOworCisgICAgaWYgKG15X2NhbV9hcHAtPmhhbF9saWIuZ2V0X251bV9vZl9jYW1lcmFzID09IE5VTEwgfHwKKyAgICAgICAgbXlfY2FtX2FwcC0+aGFsX2xpYi5tbV9jYW1lcmFfb3BlbiA9PSBOVUxMIHx8CisgICAgICAgIG15X2NhbV9hcHAtPmhhbF9saWIuanBlZ19vcGVuID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgbG9hZGluZyBIQUwgc3ltICVzXG4iLCAgZGxlcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIC1NTV9DQU1FUkFfRV9HRU5FUkFMOworICAgIH0KKworICAgIG15X2NhbV9hcHAtPm51bV9jYW1lcmFzID0gbXlfY2FtX2FwcC0+aGFsX2xpYi5nZXRfbnVtX29mX2NhbWVyYXMoKTsKKyAgICBMT0dEKCJudW1fY2FtZXJhcyA9ICVkXG4iLCAgbXlfY2FtX2FwcC0+bnVtX2NhbWVyYXMpOworCisgICAgcmV0dXJuIE1NX0NBTUVSQV9PSzsKK30KKworaW50IG1tX2FwcF9hbGxvY2F0ZV9pb25fbWVtb3J5KG1tX2NhbWVyYV9hcHBfYnVmX3QgKmJ1ZiwKKyAgICAgICAgX191bnVzZWQgdW5zaWduZWQgaW50IGlvbl90eXBlKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBzdHJ1Y3QgaW9uX2hhbmRsZV9kYXRhIGhhbmRsZV9kYXRhOworICAgIHN0cnVjdCBpb25fYWxsb2NhdGlvbl9kYXRhIGFsbG9jOworICAgIHN0cnVjdCBpb25fZmRfZGF0YSBpb25faW5mb19mZDsKKyAgICBpbnQgbWFpbl9pb25fZmQgPSAtMTsKKyAgICB2b2lkICpkYXRhID0gTlVMTDsKKworICAgIG1haW5faW9uX2ZkID0gb3BlbigiL2Rldi9pb24iLCBPX1JET05MWSk7CisgICAgaWYgKG1haW5faW9uX2ZkIDw9IDApIHsKKyAgICAgICAgTE9HRSgiSW9uIGRldiBvcGVuIGZhaWxlZCAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBJT05fT1BFTl9GQUlMRUQ7CisgICAgfQorCisgICAgbWVtc2V0KCZhbGxvYywgMCwgc2l6ZW9mKGFsbG9jKSk7CisgICAgYWxsb2MubGVuID0gYnVmLT5tZW1faW5mby5zaXplOworICAgIC8qIHRvIG1ha2UgaXQgcGFnZSBzaXplIGFsaWduZWQgKi8KKyAgICBhbGxvYy5sZW4gPSAoYWxsb2MubGVuICsgNDA5NVUpICYgKH40MDk1VSk7CisgICAgYWxsb2MuYWxpZ24gPSA0MDk2OworICAgIGFsbG9jLmZsYWdzID0gSU9OX0ZMQUdfQ0FDSEVEOworICAgIGFsbG9jLmhlYXBfaWRfbWFzayA9IElPTl9IRUFQKElPTl9TWVNURU1fSEVBUF9JRCk7CisgICAgcmMgPSBpb2N0bChtYWluX2lvbl9mZCwgSU9OX0lPQ19BTExPQywgJmFsbG9jKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoIklPTiBhbGxvY2F0aW9uIGZhaWxlZCAlcyB3aXRoIHJjID0gJWQgXG4iLHN0cmVycm9yKGVycm5vKSwgcmMpOworICAgICAgICBnb3RvIElPTl9BTExPQ19GQUlMRUQ7CisgICAgfQorCisgICAgbWVtc2V0KCZpb25faW5mb19mZCwgMCwgc2l6ZW9mKGlvbl9pbmZvX2ZkKSk7CisgICAgaW9uX2luZm9fZmQuaGFuZGxlID0gYWxsb2MuaGFuZGxlOworICAgIHJjID0gaW9jdGwobWFpbl9pb25fZmQsIElPTl9JT0NfU0hBUkUsICZpb25faW5mb19mZCk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBMT0dFKCJJT04gbWFwIGZhaWxlZCAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBJT05fTUFQX0ZBSUxFRDsKKyAgICB9CisKKyAgICBkYXRhID0gbW1hcChOVUxMLAorICAgICAgICAgICAgICAgIGFsbG9jLmxlbiwKKyAgICAgICAgICAgICAgICBQUk9UX1JFQUQgIHwgUFJPVF9XUklURSwKKyAgICAgICAgICAgICAgICBNQVBfU0hBUkVELAorICAgICAgICAgICAgICAgIGlvbl9pbmZvX2ZkLmZkLAorICAgICAgICAgICAgICAgIDApOworCisgICAgaWYgKGRhdGEgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICBMT0dFKCJJT05fTU1BUF9GQUlMRUQ6ICVzICglZClcbiIsIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOworICAgICAgICBnb3RvIElPTl9NQVBfRkFJTEVEOworICAgIH0KKyAgICBidWYtPm1lbV9pbmZvLm1haW5faW9uX2ZkID0gbWFpbl9pb25fZmQ7CisgICAgYnVmLT5tZW1faW5mby5mZCA9IGlvbl9pbmZvX2ZkLmZkOworICAgIGJ1Zi0+bWVtX2luZm8uaGFuZGxlID0gaW9uX2luZm9fZmQuaGFuZGxlOworICAgIGJ1Zi0+bWVtX2luZm8uc2l6ZSA9IGFsbG9jLmxlbjsKKyAgICBidWYtPm1lbV9pbmZvLmRhdGEgPSBkYXRhOworICAgIHJldHVybiBNTV9DQU1FUkFfT0s7CisKK0lPTl9NQVBfRkFJTEVEOgorICAgIG1lbXNldCgmaGFuZGxlX2RhdGEsIDAsIHNpemVvZihoYW5kbGVfZGF0YSkpOworICAgIGhhbmRsZV9kYXRhLmhhbmRsZSA9IGlvbl9pbmZvX2ZkLmhhbmRsZTsKKyAgICBpb2N0bChtYWluX2lvbl9mZCwgSU9OX0lPQ19GUkVFLCAmaGFuZGxlX2RhdGEpOworSU9OX0FMTE9DX0ZBSUxFRDoKKyAgICBjbG9zZShtYWluX2lvbl9mZCk7CitJT05fT1BFTl9GQUlMRUQ6CisgICAgcmV0dXJuIC1NTV9DQU1FUkFfRV9HRU5FUkFMOworfQorCitpbnQgbW1fYXBwX2RlYWxsb2NhdGVfaW9uX21lbW9yeShtbV9jYW1lcmFfYXBwX2J1Zl90ICpidWYpCit7CisgIHN0cnVjdCBpb25faGFuZGxlX2RhdGEgaGFuZGxlX2RhdGE7CisgIGludCByYyA9IDA7CisKKyAgcmMgPSBtdW5tYXAoYnVmLT5tZW1faW5mby5kYXRhLCBidWYtPm1lbV9pbmZvLnNpemUpOworCisgIGlmIChidWYtPm1lbV9pbmZvLmZkID49IDApIHsKKyAgICAgIGNsb3NlKGJ1Zi0+bWVtX2luZm8uZmQpOworICAgICAgYnVmLT5tZW1faW5mby5mZCA9IC0xOworICB9CisKKyAgaWYgKGJ1Zi0+bWVtX2luZm8ubWFpbl9pb25fZmQgPj0gMCkgeworICAgICAgbWVtc2V0KCZoYW5kbGVfZGF0YSwgMCwgc2l6ZW9mKGhhbmRsZV9kYXRhKSk7CisgICAgICBoYW5kbGVfZGF0YS5oYW5kbGUgPSBidWYtPm1lbV9pbmZvLmhhbmRsZTsKKyAgICAgIGlvY3RsKGJ1Zi0+bWVtX2luZm8ubWFpbl9pb25fZmQsIElPTl9JT0NfRlJFRSwgJmhhbmRsZV9kYXRhKTsKKyAgICAgIGNsb3NlKGJ1Zi0+bWVtX2luZm8ubWFpbl9pb25fZmQpOworICAgICAgYnVmLT5tZW1faW5mby5tYWluX2lvbl9mZCA9IC0xOworICB9CisgIHJldHVybiByYzsKK30KKworLyogY21kID0gSU9OX0lPQ19DTEVBTl9DQUNIRVMsIElPTl9JT0NfSU5WX0NBQ0hFUywgSU9OX0lPQ19DTEVBTl9JTlZfQ0FDSEVTICovCitpbnQgbW1fYXBwX2NhY2hlX29wcyhtbV9jYW1lcmFfYXBwX21lbWluZm9fdCAqbWVtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICBpbnQgY21kKQoreworICAgIHN0cnVjdCBpb25fZmx1c2hfZGF0YSBjYWNoZV9pbnZfZGF0YTsKKyAgICBzdHJ1Y3QgaW9uX2N1c3RvbV9kYXRhIGN1c3RvbV9kYXRhOworICAgIGludCByZXQgPSBNTV9DQU1FUkFfT0s7CisKKyNpZmRlZiBVU0VfSU9OCisgICAgaWYgKE5VTEwgPT0gbWVtX2luZm8pIHsKKyAgICAgICAgTE9HRSgibWVtX2luZm8gaXMgTlVMTCwgcmV0dXJuIGhlcmUiKTsKKyAgICAgICAgcmV0dXJuIC1NTV9DQU1FUkFfRV9HRU5FUkFMOworICAgIH0KKworICAgIG1lbXNldCgmY2FjaGVfaW52X2RhdGEsIDAsIHNpemVvZihjYWNoZV9pbnZfZGF0YSkpOworICAgIG1lbXNldCgmY3VzdG9tX2RhdGEsIDAsIHNpemVvZihjdXN0b21fZGF0YSkpOworICAgIGNhY2hlX2ludl9kYXRhLnZhZGRyID0gbWVtX2luZm8tPmRhdGE7CisgICAgY2FjaGVfaW52X2RhdGEuZmQgPSBtZW1faW5mby0+ZmQ7CisgICAgY2FjaGVfaW52X2RhdGEuaGFuZGxlID0gbWVtX2luZm8tPmhhbmRsZTsKKyAgICBjYWNoZV9pbnZfZGF0YS5sZW5ndGggPSAodW5zaWduZWQgaW50KW1lbV9pbmZvLT5zaXplOworICAgIGN1c3RvbV9kYXRhLmNtZCA9ICh1bnNpZ25lZCBpbnQpY21kOworICAgIGN1c3RvbV9kYXRhLmFyZyA9ICh1bnNpZ25lZCBsb25nKSZjYWNoZV9pbnZfZGF0YTsKKworICAgIExPR0QoImFkZHIgPSAlcCwgZmQgPSAlZCwgaGFuZGxlID0gJWx4IGxlbmd0aCA9ICVkLCBJT04gRmQgPSAlZCIsCisgICAgICAgICBjYWNoZV9pbnZfZGF0YS52YWRkciwgY2FjaGVfaW52X2RhdGEuZmQsCisgICAgICAgICAodW5zaWduZWQgbG9uZyljYWNoZV9pbnZfZGF0YS5oYW5kbGUsIGNhY2hlX2ludl9kYXRhLmxlbmd0aCwKKyAgICAgICAgIG1lbV9pbmZvLT5tYWluX2lvbl9mZCk7CisgICAgaWYobWVtX2luZm8tPm1haW5faW9uX2ZkID49IDApIHsKKyAgICAgICAgaWYoaW9jdGwobWVtX2luZm8tPm1haW5faW9uX2ZkLCBJT05fSU9DX0NVU1RPTSwgJmN1c3RvbV9kYXRhKSA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIkNhY2hlIEludmFsaWRhdGUgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldCA9IC1NTV9DQU1FUkFfRV9HRU5FUkFMOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIG1tX2FwcF9kdW1wX2ZyYW1lKG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpleHQsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX2lkeCkKK3sKKyAgICBjaGFyIGZpbGVfbmFtZVtGSUxFTkFNRV9NQVhdOworICAgIGludCBmaWxlX2ZkOworICAgIGludCBpOworICAgIGludCBvZmZzZXQgPSAwOworICAgIGlmICggZnJhbWUgIT0gTlVMTCkgeworICAgICAgICBzbnByaW50ZihmaWxlX25hbWUsIHNpemVvZihmaWxlX25hbWUpLAorICAgICAgICAgICAgICAgIFFDQU1FUkFfRFVNUF9GUk1fTE9DQVRJT04iJXNfJTA0ZC4lcyIsIG5hbWUsIGZyYW1lX2lkeCwgZXh0KTsKKyAgICAgICAgZmlsZV9mZCA9IG9wZW4oZmlsZV9uYW1lLCBPX1JEV1IgfCBPX0NSRUFULCAwNzc3KTsKKyAgICAgICAgaWYgKGZpbGVfZmQgPCAwKSB7CisgICAgICAgICAgICBMT0dFKCJjYW5ub3Qgb3BlbiBmaWxlICVzIFxuIiwgIGZpbGVfbmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPnBsYW5lc19idWYubnVtX3BsYW5lczsgaSsrKSB7CisgICAgICAgICAgICAgICAgTE9HRCgic2F2aW5nIGZpbGUgZnJvbSBhZGRyZXNzOiAlcCwgZGF0YSBvZmZzZXQ6ICVkLCAiCisgICAgICAgICAgICAgICAgICAgICAibGVuZ3RoOiAlZCBcbiIsICBmcmFtZS0+YnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBmcmFtZS0+cGxhbmVzX2J1Zi5wbGFuZXNbaV0uZGF0YV9vZmZzZXQsIGZyYW1lLT5wbGFuZXNfYnVmLnBsYW5lc1tpXS5sZW5ndGgpOworICAgICAgICAgICAgICAgIHdyaXRlKGZpbGVfZmQsCisgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilmcmFtZS0+YnVmZmVyICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5wbGFuZXNfYnVmLnBsYW5lc1tpXS5sZW5ndGgpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSAoaW50KWZyYW1lLT5wbGFuZXNfYnVmLnBsYW5lc1tpXS5sZW5ndGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsb3NlKGZpbGVfZmQpOworICAgICAgICAgICAgTE9HRCgiZHVtcCAlcyIsIGZpbGVfbmFtZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgbW1fYXBwX2R1bXBfanBlZ19mcmFtZShjb25zdCB2b2lkICogZGF0YSwgc2l6ZV90IHNpemUsIGNoYXIqIG5hbWUsCisgICAgICAgIGNoYXIqIGV4dCwgdWludDMyX3QgaW5kZXgpCit7CisgICAgY2hhciBidWZbRklMRU5BTUVfTUFYXTsKKyAgICBpbnQgZmlsZV9mZDsKKyAgICBpZiAoIGRhdGEgIT0gTlVMTCkgeworICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgIFFDQU1FUkFfRFVNUF9GUk1fTE9DQVRJT04idGVzdC8lc18ldS4lcyIsIG5hbWUsIGluZGV4LCBleHQpOworICAgICAgICBMT0dEKCIlcyBzaXplID0lenUsIGpvYklkPSV1IiwgIGJ1Ziwgc2l6ZSwgaW5kZXgpOworICAgICAgICBmaWxlX2ZkID0gb3BlbihidWYsIE9fUkRXUiB8IE9fQ1JFQVQsIDA3NzcpOworICAgICAgICB3cml0ZShmaWxlX2ZkLCBkYXRhLCBzaXplKTsKKyAgICAgICAgY2xvc2UoZmlsZV9mZCk7CisgICAgfQorfQorCitpbnQgbW1fYXBwX2FsbG9jX2J1ZnMobW1fY2FtZXJhX2FwcF9idWZfdCogYXBwX2J1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCAqZnJhbWVfb2Zmc2V0X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYnVmcywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGlzX3N0cmVhbWJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbXVsdGlwbGVPZikKK3sKKyAgICB1aW50MzJfdCBpLCBqOworICAgIHVuc2lnbmVkIGludCBpb25fdHlwZSA9IDB4MSA8PCBDQU1FUkFfSU9OX0ZBTExCQUNLX0hFQVBfSUQ7CisKKyAgICBpZiAoaXNfc3RyZWFtYnVmKSB7CisgICAgICAgIGlvbl90eXBlIHw9IDB4MSA8PCBDQU1FUkFfSU9OX0hFQVBfSUQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9idWZzIDsgaSsrKSB7CisgICAgICAgIGlmICggMCA8IG11bHRpcGxlT2YgKSB7CisgICAgICAgICAgICBzaXplX3QgbSA9IGZyYW1lX29mZnNldF9pbmZvLT5mcmFtZV9sZW4gLyBtdWx0aXBsZU9mOworICAgICAgICAgICAgaWYgKCAoIGZyYW1lX29mZnNldF9pbmZvLT5mcmFtZV9sZW4gJSBtdWx0aXBsZU9mICkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBtKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcHBfYnVmc1tpXS5tZW1faW5mby5zaXplID0gbSAqIG11bHRpcGxlT2Y7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhcHBfYnVmc1tpXS5tZW1faW5mby5zaXplID0gZnJhbWVfb2Zmc2V0X2luZm8tPmZyYW1lX2xlbjsKKyAgICAgICAgfQorICAgICAgICBtbV9hcHBfYWxsb2NhdGVfaW9uX21lbW9yeSgmYXBwX2J1ZnNbaV0sIGlvbl90eXBlKTsKKworICAgICAgICBhcHBfYnVmc1tpXS5idWYuYnVmX2lkeCA9IGk7CisgICAgICAgIGFwcF9idWZzW2ldLmJ1Zi5wbGFuZXNfYnVmLm51bV9wbGFuZXMgPSAoaW50OF90KWZyYW1lX29mZnNldF9pbmZvLT5udW1fcGxhbmVzOworICAgICAgICBhcHBfYnVmc1tpXS5idWYuZmQgPSBhcHBfYnVmc1tpXS5tZW1faW5mby5mZDsKKyAgICAgICAgYXBwX2J1ZnNbaV0uYnVmLmZyYW1lX2xlbiA9IGFwcF9idWZzW2ldLm1lbV9pbmZvLnNpemU7CisgICAgICAgIGFwcF9idWZzW2ldLmJ1Zi5idWZmZXIgPSBhcHBfYnVmc1tpXS5tZW1faW5mby5kYXRhOworICAgICAgICBhcHBfYnVmc1tpXS5idWYubWVtX2luZm8gPSAodm9pZCAqKSZhcHBfYnVmc1tpXS5tZW1faW5mbzsKKworICAgICAgICAvKiBQbGFuZSAwIG5lZWRzIHRvIGJlIHNldCBzZXBlcmF0ZWx5LiBTZXQgb3RoZXIgcGxhbmVzCisgICAgICAgICAgICAgKiBpbiBhIGxvb3AuICovCisgICAgICAgIGFwcF9idWZzW2ldLmJ1Zi5wbGFuZXNfYnVmLnBsYW5lc1swXS5sZW5ndGggPSBmcmFtZV9vZmZzZXRfaW5mby0+bXBbMF0ubGVuOworICAgICAgICBhcHBfYnVmc1tpXS5idWYucGxhbmVzX2J1Zi5wbGFuZXNbMF0ubS51c2VycHRyID0KKyAgICAgICAgICAgIChsb25nIHVuc2lnbmVkIGludClhcHBfYnVmc1tpXS5idWYuZmQ7CisgICAgICAgIGFwcF9idWZzW2ldLmJ1Zi5wbGFuZXNfYnVmLnBsYW5lc1swXS5kYXRhX29mZnNldCA9IGZyYW1lX29mZnNldF9pbmZvLT5tcFswXS5vZmZzZXQ7CisgICAgICAgIGFwcF9idWZzW2ldLmJ1Zi5wbGFuZXNfYnVmLnBsYW5lc1swXS5yZXNlcnZlZFswXSA9IDA7CisgICAgICAgIGZvciAoaiA9IDE7IGogPCAodWludDhfdClmcmFtZV9vZmZzZXRfaW5mby0+bnVtX3BsYW5lczsgaisrKSB7CisgICAgICAgICAgICBhcHBfYnVmc1tpXS5idWYucGxhbmVzX2J1Zi5wbGFuZXNbal0ubGVuZ3RoID0gZnJhbWVfb2Zmc2V0X2luZm8tPm1wW2pdLmxlbjsKKyAgICAgICAgICAgIGFwcF9idWZzW2ldLmJ1Zi5wbGFuZXNfYnVmLnBsYW5lc1tqXS5tLnVzZXJwdHIgPQorICAgICAgICAgICAgICAgIChsb25nIHVuc2lnbmVkIGludClhcHBfYnVmc1tpXS5idWYuZmQ7CisgICAgICAgICAgICBhcHBfYnVmc1tpXS5idWYucGxhbmVzX2J1Zi5wbGFuZXNbal0uZGF0YV9vZmZzZXQgPSBmcmFtZV9vZmZzZXRfaW5mby0+bXBbal0ub2Zmc2V0OworICAgICAgICAgICAgYXBwX2J1ZnNbaV0uYnVmLnBsYW5lc19idWYucGxhbmVzW2pdLnJlc2VydmVkWzBdID0KKyAgICAgICAgICAgICAgICBhcHBfYnVmc1tpXS5idWYucGxhbmVzX2J1Zi5wbGFuZXNbai0xXS5yZXNlcnZlZFswXSArCisgICAgICAgICAgICAgICAgYXBwX2J1ZnNbaV0uYnVmLnBsYW5lc19idWYucGxhbmVzW2otMV0ubGVuZ3RoOworICAgICAgICB9CisgICAgfQorICAgIExPR0QoIlgiKTsKKyAgICByZXR1cm4gTU1fQ0FNRVJBX09LOworfQorCitpbnQgbW1fYXBwX3JlbGVhc2VfYnVmcyh1aW50OF90IG51bV9idWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2FwcF9idWZfdCogYXBwX2J1ZnMpCit7CisgICAgaW50IGksIHJjID0gTU1fQ0FNRVJBX09LOworCisgICAgTE9HRCgiRSIpOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9idWZzOyBpKyspIHsKKyAgICAgICAgcmMgPSBtbV9hcHBfZGVhbGxvY2F0ZV9pb25fbWVtb3J5KCZhcHBfYnVmc1tpXSk7CisgICAgfQorICAgIG1lbXNldChhcHBfYnVmcywgMCwgbnVtX2J1ZnMgKiBzaXplb2YobW1fY2FtZXJhX2FwcF9idWZfdCkpOworICAgIExPR0QoIlgiKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfc3RyZWFtX2luaXRidWYoY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCAqZnJhbWVfb2Zmc2V0X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm51bV9idWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqaW5pdGlhbF9yZWdfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqKmJ1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzdHJlYW0gPSAobW1fY2FtZXJhX3N0cmVhbV90ICopdXNlcl9kYXRhOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKnBCdWZzID0gTlVMTDsKKyAgICB1aW50OF90ICpyZWdfZmxhZ3MgPSBOVUxMOworICAgIGludCBpLCByYzsKKworICAgIHN0cmVhbS0+b2Zmc2V0ID0gKmZyYW1lX29mZnNldF9pbmZvOworCisgICAgTE9HRCgiYWxsb2MgYnVmIGZvciBzdHJlYW1faWQgJWQsIGxlbj0lZCwgbnVtIHBsYW5lczogJWQsIG9mZnNldDogJWQiLAorICAgICAgICAgc3RyZWFtLT5zX2lkLAorICAgICAgICAgZnJhbWVfb2Zmc2V0X2luZm8tPmZyYW1lX2xlbiwKKyAgICAgICAgIGZyYW1lX29mZnNldF9pbmZvLT5udW1fcGxhbmVzLAorICAgICAgICAgZnJhbWVfb2Zmc2V0X2luZm8tPm1wWzFdLm9mZnNldCk7CisKKyAgICBpZiAoc3RyZWFtLT5udW1fb2ZfYnVmcyA+IENBTV9NQVhfTlVNX0JVRlNfUEVSX1NUUkVBTSkKKyAgICAgICAgc3RyZWFtLT5udW1fb2ZfYnVmcyA9IENBTV9NQVhfTlVNX0JVRlNfUEVSX1NUUkVBTTsKKworICAgIHBCdWZzID0gKG1tX2NhbWVyYV9idWZfZGVmX3QgKiltYWxsb2Moc2l6ZW9mKG1tX2NhbWVyYV9idWZfZGVmX3QpICogc3RyZWFtLT5udW1fb2ZfYnVmcyk7CisgICAgcmVnX2ZsYWdzID0gKHVpbnQ4X3QgKiltYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogc3RyZWFtLT5udW1fb2ZfYnVmcyk7CisgICAgaWYgKHBCdWZzID09IE5VTEwgfHwgcmVnX2ZsYWdzID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtIGZvciBidWZzIik7CisgICAgICAgIGlmIChwQnVmcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmVlKHBCdWZzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVnX2ZsYWdzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocmVnX2ZsYWdzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmMgPSBtbV9hcHBfYWxsb2NfYnVmcygmc3RyZWFtLT5zX2J1ZnNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9vZmZzZXRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+bnVtX29mX2J1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5tdWx0aXBsZU9mKTsKKworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgibW1fc3RyZWFtX2FsbG9jX2J1ZnMgZXJyID0gJWQiLCAgcmMpOworICAgICAgICBmcmVlKHBCdWZzKTsKKyAgICAgICAgZnJlZShyZWdfZmxhZ3MpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHN0cmVhbS0+bnVtX29mX2J1ZnM7IGkrKykgeworICAgICAgICAvKiBtYXBwaW5nIHN0cmVhbSBidWZzIGZpcnN0ICovCisgICAgICAgIHBCdWZzW2ldID0gc3RyZWFtLT5zX2J1ZnNbaV0uYnVmOworICAgICAgICByZWdfZmxhZ3NbaV0gPSAxOworICAgICAgICByYyA9IG9wc190YmwtPm1hcF9vcHMocEJ1ZnNbaV0uYnVmX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ1ZnNbaV0uZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpcEJ1ZnNbaV0uZnJhbWVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsIG9wc190YmwtPnVzZXJkYXRhKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibWFwcGluZyBidWZbJWRdIGVyciA9ICVkIiwgIGksIHJjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBpbnQgajsKKyAgICAgICAgZm9yIChqPTA7IGo+aTsgaisrKSB7CisgICAgICAgICAgICBvcHNfdGJsLT51bm1hcF9vcHMocEJ1ZnNbal0uYnVmX2lkeCwgLTEsCisgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsIG9wc190YmwtPnVzZXJkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBtbV9hcHBfcmVsZWFzZV9idWZzKHN0cmVhbS0+bnVtX29mX2J1ZnMsICZzdHJlYW0tPnNfYnVmc1swXSk7CisgICAgICAgIGZyZWUocEJ1ZnMpOworICAgICAgICBmcmVlKHJlZ19mbGFncyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAqbnVtX2J1ZnMgPSBzdHJlYW0tPm51bV9vZl9idWZzOworICAgICpidWZzID0gcEJ1ZnM7CisgICAgKmluaXRpYWxfcmVnX2ZsYWcgPSByZWdfZmxhZ3M7CisKKyAgICBMT0dEKCJYIik7CisgICAgcmV0dXJuIHJjOworfQorCitpbnQzMl90IG1tX2FwcF9zdHJlYW1fZGVpbml0YnVmKG1tX2NhbWVyYV9tYXBfdW5tYXBfb3BzX3RibF90ICpvcHNfdGJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzdHJlYW0gPSAobW1fY2FtZXJhX3N0cmVhbV90ICopdXNlcl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHN0cmVhbS0+bnVtX29mX2J1ZnMgOyBpKyspIHsKKyAgICAgICAgLyogbWFwcGluZyBzdHJlYW0gYnVmcyBmaXJzdCAqLworICAgICAgICBvcHNfdGJsLT51bm1hcF9vcHMoc3RyZWFtLT5zX2J1ZnNbaV0uYnVmLmJ1Zl9pZHgsIC0xLAorICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9CVUYsIG9wc190YmwtPnVzZXJkYXRhKTsKKyAgICB9CisKKyAgICBtbV9hcHBfcmVsZWFzZV9idWZzKHN0cmVhbS0+bnVtX29mX2J1ZnMsICZzdHJlYW0tPnNfYnVmc1swXSk7CisKKyAgICBMT0dEKCJYIik7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgbW1fYXBwX3N0cmVhbV9jbGVhbl9pbnZhbGlkYXRlX2J1Zih1aW50MzJfdCBpbmRleCwgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc3RyZWFtID0gKG1tX2NhbWVyYV9zdHJlYW1fdCAqKXVzZXJfZGF0YTsKKyAgICByZXR1cm4gbW1fYXBwX2NhY2hlX29wcygmc3RyZWFtLT5zX2J1ZnNbaW5kZXhdLm1lbV9pbmZvLAorICAgICAgSU9OX0lPQ19DTEVBTl9JTlZfQ0FDSEVTKTsKK30KKworaW50MzJfdCBtbV9hcHBfc3RyZWFtX2ludmFsaWRhdGVfYnVmKHVpbnQzMl90IGluZGV4LCB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzdHJlYW0gPSAobW1fY2FtZXJhX3N0cmVhbV90ICopdXNlcl9kYXRhOworICAgIHJldHVybiBtbV9hcHBfY2FjaGVfb3BzKCZzdHJlYW0tPnNfYnVmc1tpbmRleF0ubWVtX2luZm8sIElPTl9JT0NfSU5WX0NBQ0hFUyk7Cit9CisKK3N0YXRpYyB2b2lkIG5vdGlmeV9ldnRfY2IodWludDMyX3QgY2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2V2ZW50X3QgKmV2dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiA9CisgICAgICAgIChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqKXVzZXJfZGF0YTsKKyAgICBpZiAodGVzdF9vYmogPT0gTlVMTCB8fCB0ZXN0X29iai0+Y2FtLT5jYW1lcmFfaGFuZGxlICE9IGNhbWVyYV9oYW5kbGUpIHsKKyAgICAgICAgTE9HRSgiTm90IGEgdmFsaWQgdGVzdCBvYmoiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExPR0QoIkUgZXZ0ID0gJWQiLCAgZXZ0LT5zZXJ2ZXJfZXZlbnRfdHlwZSk7CisgICAgc3dpdGNoIChldnQtPnNlcnZlcl9ldmVudF90eXBlKSB7CisgICAgICAgY2FzZSBDQU1fRVZFTlRfVFlQRV9BVVRPX0ZPQ1VTX0RPTkU6CisgICAgICAgICAgIExPR0QoInJjdmQgYXV0byBmb2N1cyBkb25lIGV2dCIpOworICAgICAgICAgICBicmVhazsKKyAgICAgICBjYXNlIENBTV9FVkVOVF9UWVBFX1pPT01fRE9ORToKKyAgICAgICAgICAgTE9HRCgicmN2ZCB6b29tIGRvbmUgZXZ0Iik7CisgICAgICAgICAgIGJyZWFrOworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIExPR0QoIlgiKTsKK30KKworaW50IG1tX2FwcF9vcGVuKG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcCwKKyAgICAgICAgICAgICAgICBpbnQgY2FtX2lkLAorICAgICAgICAgICAgICAgIG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaikKK3sKKyAgICBpbnQzMl90IHJjID0gMDsKKyAgICBjYW1fZnJhbWVfbGVuX29mZnNldF90IG9mZnNldF9pbmZvOworCisgICAgTE9HRCgiQkVHSU5cbiIpOworCisgICAgcmMgPSBjYW1fYXBwLT5oYWxfbGliLm1tX2NhbWVyYV9vcGVuKCh1aW50OF90KWNhbV9pZCwgJih0ZXN0X29iai0+Y2FtKSk7CisgICAgaWYocmMgfHwgIXRlc3Rfb2JqLT5jYW0pIHsKKyAgICAgICAgTE9HRSgiZGV2IG9wZW4gZXJyb3IuIHJjID0gJWQsIHZ0YmwgPSAlcFxuIiwgIHJjLCB0ZXN0X29iai0+Y2FtKTsKKyAgICAgICAgcmV0dXJuIC1NTV9DQU1FUkFfRV9HRU5FUkFMOworICAgIH0KKworICAgIExPR0QoIk9wZW4gQ2FtZXJhIGlkID0gJWQgaGFuZGxlID0gJWQiLCBjYW1faWQsIHRlc3Rfb2JqLT5jYW0tPmNhbWVyYV9oYW5kbGUpOworCisgICAgLyogYWxsb2MgaW9uIG1lbSBmb3IgY2FwYWJpbGl0eSBidWYgKi8KKyAgICBtZW1zZXQoJm9mZnNldF9pbmZvLCAwLCBzaXplb2Yob2Zmc2V0X2luZm8pKTsKKyAgICBvZmZzZXRfaW5mby5mcmFtZV9sZW4gPSBzaXplb2YoY2FtX2NhcGFiaWxpdHlfdCk7CisKKyAgICByYyA9IG1tX2FwcF9hbGxvY19idWZzKCZ0ZXN0X29iai0+Y2FwX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJhbGxvYyBidWYgZm9yIGNhcGFiaWxpdHkgZXJyb3JcbiIpOworICAgICAgICBnb3RvIGVycm9yX2FmdGVyX2NhbV9vcGVuOworICAgIH0KKworICAgIC8qIG1hcHBpbmcgY2FwYWJpbGl0eSBidWYgKi8KKyAgICByYyA9IHRlc3Rfb2JqLT5jYW0tPm9wcy0+bWFwX2J1Zih0ZXN0X29iai0+Y2FtLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX0NBUEFCSUxJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9vYmotPmNhcF9idWYubWVtX2luZm8uZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9vYmotPmNhcF9idWYubWVtX2luZm8uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIm1hcCBmb3IgY2FwYWJpbGl0eSBlcnJvclxuIik7CisgICAgICAgIGdvdG8gZXJyb3JfYWZ0ZXJfY2FwX2J1Zl9hbGxvYzsKKyAgICB9CisKKyAgICAvKiBhbGxvYyBpb24gbWVtIGZvciBnZXRwYXJtIGJ1ZiAqLworICAgIG1lbXNldCgmb2Zmc2V0X2luZm8sIDAsIHNpemVvZihvZmZzZXRfaW5mbykpOworICAgIG9mZnNldF9pbmZvLmZyYW1lX2xlbiA9IHNpemVvZihwYXJtX2J1ZmZlcl90KTsKKyAgICByYyA9IG1tX2FwcF9hbGxvY19idWZzKCZ0ZXN0X29iai0+cGFybV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0X2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiYWxsb2MgYnVmIGZvciBnZXRwYXJtX2J1ZiBlcnJvclxuIik7CisgICAgICAgIGdvdG8gZXJyb3JfYWZ0ZXJfY2FwX2J1Zl9tYXA7CisgICAgfQorCisgICAgLyogbWFwcGluZyBnZXRwYXJtIGJ1ZiAqLworICAgIHJjID0gdGVzdF9vYmotPmNhbS0+b3BzLT5tYXBfYnVmKHRlc3Rfb2JqLT5jYW0tPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX01BUFBJTkdfQlVGX1RZUEVfUEFSTV9CVUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9vYmotPnBhcm1fYnVmLm1lbV9pbmZvLmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgibWFwIGdldHBhcm1fYnVmIGVycm9yXG4iKTsKKyAgICAgICAgZ290byBlcnJvcl9hZnRlcl9nZXRwYXJtX2J1Zl9hbGxvYzsKKyAgICB9CisgICAgdGVzdF9vYmotPnBhcmFtc19idWZmZXIgPSAocGFybV9idWZmZXJfdCopIHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhOworICAgIExPR0goIlxuJXMgcGFyYW1zX2J1ZmZlcj0lcFxuIix0ZXN0X29iai0+cGFyYW1zX2J1ZmZlcik7CisKKyAgICByYyA9IHRlc3Rfb2JqLT5jYW0tPm9wcy0+cmVnaXN0ZXJfZXZlbnRfbm90aWZ5KHRlc3Rfb2JqLT5jYW0tPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfZXZ0X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiZmFpbGVkIHJlZ2lzdGVyX2V2ZW50X25vdGlmeSIpOworICAgICAgICByYyA9IC1NTV9DQU1FUkFfRV9HRU5FUkFMOworICAgICAgICBnb3RvIGVycm9yX2FmdGVyX2dldHBhcm1fYnVmX21hcDsKKyAgICB9CisKKyAgICByYyA9IHRlc3Rfb2JqLT5jYW0tPm9wcy0+cXVlcnlfY2FwYWJpbGl0eSh0ZXN0X29iai0+Y2FtLT5jYW1lcmFfaGFuZGxlKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoImZhaWxlZCBxdWVyeV9jYXBhYmlsaXR5Iik7CisgICAgICAgIHJjID0gLU1NX0NBTUVSQV9FX0dFTkVSQUw7CisgICAgICAgIGdvdG8gZXJyb3JfYWZ0ZXJfZ2V0cGFybV9idWZfbWFwOworICAgIH0KKyAgICBtZW1zZXQoJnRlc3Rfb2JqLT5qcGVnX29wcywgMCwgc2l6ZW9mKG1tX2pwZWdfb3BzX3QpKTsKKyAgICBtbV9kaW1lbnNpb24gcGljX3NpemU7CisgICAgbWVtc2V0KCZwaWNfc2l6ZSwgMCwgc2l6ZW9mKG1tX2RpbWVuc2lvbikpOworICAgIHBpY19zaXplLncgPSA0MDAwOworICAgIHBpY19zaXplLmggPSAzMDAwOworICAgIHRlc3Rfb2JqLT5qcGVnX2hkbCA9IGNhbV9hcHAtPmhhbF9saWIuanBlZ19vcGVuKCZ0ZXN0X29iai0+anBlZ19vcHMsIE5VTEwsIHBpY19zaXplLCBOVUxMKTsKKyAgICBpZiAodGVzdF9vYmotPmpwZWdfaGRsID09IDApIHsKKyAgICAgICAgTE9HRSgianBlZyBsaWIgb3BlbiBlcnIiKTsKKyAgICAgICAgcmMgPSAtTU1fQ0FNRVJBX0VfR0VORVJBTDsKKyAgICAgICAgZ290byBlcnJvcl9hZnRlcl9nZXRwYXJtX2J1Zl9tYXA7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworCitlcnJvcl9hZnRlcl9nZXRwYXJtX2J1Zl9tYXA6CisgICAgdGVzdF9vYmotPmNhbS0+b3BzLT51bm1hcF9idWYodGVzdF9vYmotPmNhbS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9QQVJNX0JVRik7CitlcnJvcl9hZnRlcl9nZXRwYXJtX2J1Zl9hbGxvYzoKKyAgICBtbV9hcHBfcmVsZWFzZV9idWZzKDEsICZ0ZXN0X29iai0+cGFybV9idWYpOworZXJyb3JfYWZ0ZXJfY2FwX2J1Zl9tYXA6CisgICAgdGVzdF9vYmotPmNhbS0+b3BzLT51bm1hcF9idWYodGVzdF9vYmotPmNhbS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9DQVBBQklMSVRZKTsKK2Vycm9yX2FmdGVyX2NhcF9idWZfYWxsb2M6CisgICAgbW1fYXBwX3JlbGVhc2VfYnVmcygxLCAmdGVzdF9vYmotPmNhcF9idWYpOworZXJyb3JfYWZ0ZXJfY2FtX29wZW46CisgICAgdGVzdF9vYmotPmNhbS0+b3BzLT5jbG9zZV9jYW1lcmEodGVzdF9vYmotPmNhbS0+Y2FtZXJhX2hhbmRsZSk7CisgICAgdGVzdF9vYmotPmNhbSA9IE5VTEw7CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgaW5pdF9iYXRjaF91cGRhdGUocGFybV9idWZmZXJfdCAqcF90YWJsZSkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgTE9HSCgiXG5FbnRlciAlc1xuIik7CisgICAgaW50MzJfdCBoYWxfdmVyc2lvbiA9IENBTV9IQUxfVjE7CisKKyAgICBtZW1zZXQocF90YWJsZSwgMCwgc2l6ZW9mKHBhcm1fYnVmZmVyX3QpKTsKKyAgICBpZihBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHBfdGFibGUsIENBTV9JTlRGX1BBUk1fSEFMX1ZFUlNJT04sIGhhbF92ZXJzaW9uKSkgeworICAgICAgICByYyA9IC0xOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworaW50IGNvbW1pdF9zZXRfYmF0Y2gobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBDQU1fSU5URl9QQVJNX01BWDsgaSsrKXsKKyAgICAgICAgaWYodGVzdF9vYmotPnBhcmFtc19idWZmZXItPmlzX3ZhbGlkW2ldKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpIDwgQ0FNX0lOVEZfUEFSTV9NQVgpIHsKKyAgICAgICAgTE9HSCgiXG4gc2V0X3BhcmFtIHBfYnVmZmVyID0lcFxuIix0ZXN0X29iai0+cGFyYW1zX2J1ZmZlcik7CisgICAgICAgIHJjID0gdGVzdF9vYmotPmNhbS0+b3BzLT5zZXRfcGFybXModGVzdF9vYmotPmNhbS0+Y2FtZXJhX2hhbmRsZSwgdGVzdF9vYmotPnBhcmFtc19idWZmZXIpOworICAgIH0KKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoImNhbS0+b3BzLT5zZXRfcGFybXMgZmFpbGVkICEhIik7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF9jbG9zZShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopCit7CisgICAgaW50MzJfdCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIGlmICh0ZXN0X29iaiA9PSBOVUxMIHx8IHRlc3Rfb2JqLT5jYW0gPT1OVUxMKSB7CisgICAgICAgIExPR0UoImNhbSBub3Qgb3BlbmVkIik7CisgICAgICAgIHJldHVybiAtTU1fQ0FNRVJBX0VfR0VORVJBTDsKKyAgICB9CisKKyAgICAvKiB1bm1hcCBjYXBhYmlsaXR5IGJ1ZiAqLworICAgIHJjID0gdGVzdF9vYmotPmNhbS0+b3BzLT51bm1hcF9idWYodGVzdF9vYmotPmNhbS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX0NBUEFCSUxJVFkpOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgidW5tYXAgY2FwYWJpbGl0eSBidWYgZmFpbGVkLCByYz0lZCIsICByYyk7CisgICAgfQorCisgICAgLyogdW5tYXAgcGFybSBidWYgKi8KKyAgICByYyA9IHRlc3Rfb2JqLT5jYW0tPm9wcy0+dW5tYXBfYnVmKHRlc3Rfb2JqLT5jYW0tPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9QQVJNX0JVRik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJ1bm1hcCBzZXRwYXJtIGJ1ZiBmYWlsZWQsIHJjPSVkIiwgIHJjKTsKKyAgICB9CisKKyAgICByYyA9IHRlc3Rfb2JqLT5jYW0tPm9wcy0+Y2xvc2VfY2FtZXJhKHRlc3Rfb2JqLT5jYW0tPmNhbWVyYV9oYW5kbGUpOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiY2xvc2UgY2FtZXJhIGZhaWxlZCwgcmM9JWQiLCAgcmMpOworICAgIH0KKyAgICB0ZXN0X29iai0+Y2FtID0gTlVMTDsKKworICAgIC8qIGNsb3NlIGpwZWcgY2xpZW50ICovCisgICAgaWYgKHRlc3Rfb2JqLT5qcGVnX2hkbCAmJiB0ZXN0X29iai0+anBlZ19vcHMuY2xvc2UpIHsKKyAgICAgICAgcmMgPSB0ZXN0X29iai0+anBlZ19vcHMuY2xvc2UodGVzdF9vYmotPmpwZWdfaGRsKTsKKyAgICAgICAgdGVzdF9vYmotPmpwZWdfaGRsID0gMDsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgiY2xvc2UganBlZyBmYWlsZWQsIHJjPSVkIiwgIHJjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGRlYWxsb2MgY2FwYWJpbGl0eSBidWYgKi8KKyAgICByYyA9IG1tX2FwcF9yZWxlYXNlX2J1ZnMoMSwgJnRlc3Rfb2JqLT5jYXBfYnVmKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoInJlbGVhc2UgY2FwYWJpbGl0eSBidWYgZmFpbGVkLCByYz0lZCIsICByYyk7CisgICAgfQorCisgICAgLyogZGVhbGxvYyBwYXJtIGJ1ZiAqLworICAgIHJjID0gbW1fYXBwX3JlbGVhc2VfYnVmcygxLCAmdGVzdF9vYmotPnBhcm1fYnVmKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoInJlbGVhc2Ugc2V0cGFybSBidWYgZmFpbGVkLCByYz0lZCIsICByYyk7CisgICAgfQorCisgICAgcmV0dXJuIE1NX0NBTUVSQV9PSzsKK30KKworbW1fY2FtZXJhX2NoYW5uZWxfdCAqIG1tX2FwcF9hZGRfY2hhbm5lbChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3R5cGVfdCBjaF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfbm90aWZ5X3QgY2hhbm5lbF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEpCit7CisgICAgdWludDMyX3QgY2hfaWQgPSAwOworICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwgPSBOVUxMOworCisgICAgY2hfaWQgPSB0ZXN0X29iai0+Y2FtLT5vcHMtPmFkZF9jaGFubmVsKHRlc3Rfb2JqLT5jYW0tPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJkYXRhKTsKKyAgICBpZiAoY2hfaWQgPT0gMCkgeworICAgICAgICBMT0dFKCJhZGQgY2hhbm5lbCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGNoYW5uZWwgPSAmdGVzdF9vYmotPmNoYW5uZWxzW2NoX3R5cGVdOworICAgIGNoYW5uZWwtPmNoX2lkID0gY2hfaWQ7CisgICAgcmV0dXJuIGNoYW5uZWw7Cit9CisKK2ludCBtbV9hcHBfZGVsX2NoYW5uZWwobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsKQoreworICAgIHRlc3Rfb2JqLT5jYW0tPm9wcy0+ZGVsZXRlX2NoYW5uZWwodGVzdF9vYmotPmNhbS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwtPmNoX2lkKTsKKyAgICBtZW1zZXQoY2hhbm5lbCwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9jaGFubmVsX3QpKTsKKyAgICByZXR1cm4gTU1fQ0FNRVJBX09LOworfQorCittbV9jYW1lcmFfc3RyZWFtX3QgKiBtbV9hcHBfYWRkX3N0cmVhbShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsKQoreworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc3RyZWFtID0gTlVMTDsKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgY2FtX2ZyYW1lX2xlbl9vZmZzZXRfdCBvZmZzZXRfaW5mbzsKKworICAgIHN0cmVhbSA9ICYoY2hhbm5lbC0+c3RyZWFtc1tjaGFubmVsLT5udW1fc3RyZWFtcysrXSk7CisgICAgc3RyZWFtLT5zX2lkID0gdGVzdF9vYmotPmNhbS0+b3BzLT5hZGRfc3RyZWFtKHRlc3Rfb2JqLT5jYW0tPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwtPmNoX2lkKTsKKyAgICBpZiAoc3RyZWFtLT5zX2lkID09IDApIHsKKyAgICAgICAgTE9HRSgiYWRkIHN0cmVhbSBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RyZWFtLT5tdWx0aXBsZU9mID0gdGVzdF9vYmotPnNsaWNlX3NpemU7CisKKyAgICAvKiBhbGxvYyBpb24gbWVtIGZvciBzdHJlYW1faW5mbyBidWYgKi8KKyAgICBtZW1zZXQoJm9mZnNldF9pbmZvLCAwLCBzaXplb2Yob2Zmc2V0X2luZm8pKTsKKyAgICBvZmZzZXRfaW5mby5mcmFtZV9sZW4gPSBzaXplb2YoY2FtX3N0cmVhbV9pbmZvX3QpOworCisgICAgcmMgPSBtbV9hcHBfYWxsb2NfYnVmcygmc3RyZWFtLT5zX2luZm9fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoImFsbG9jIGJ1ZiBmb3Igc3RyZWFtX2luZm8gZXJyb3JcbiIpOworICAgICAgICB0ZXN0X29iai0+Y2FtLT5vcHMtPmRlbGV0ZV9zdHJlYW0odGVzdF9vYmotPmNhbS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwtPmNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5zX2lkKTsKKyAgICAgICAgc3RyZWFtLT5zX2lkID0gMDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyogbWFwcGluZyBzdHJlYW1pbmZvIGJ1ZiAqLworICAgIHJjID0gdGVzdF9vYmotPmNhbS0+b3BzLT5tYXBfc3RyZWFtX2J1Zih0ZXN0X29iai0+Y2FtLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLT5jaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5zX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fTUFQUElOR19CVUZfVFlQRV9TVFJFQU1fSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+c19pbmZvX2J1Zi5tZW1faW5mby5mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXN0cmVhbS0+c19pbmZvX2J1Zi5tZW1faW5mby5zaXplLCBOVUxMKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIm1hcCBzZXRwYXJtX2J1ZiBlcnJvclxuIik7CisgICAgICAgIG1tX2FwcF9kZWFsbG9jYXRlX2lvbl9tZW1vcnkoJnN0cmVhbS0+c19pbmZvX2J1Zik7CisgICAgICAgIHRlc3Rfb2JqLT5jYW0tPm9wcy0+ZGVsZXRlX3N0cmVhbSh0ZXN0X29iai0+Y2FtLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC0+Y2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnNfaWQpOworICAgICAgICBzdHJlYW0tPnNfaWQgPSAwOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtOworfQorCitpbnQgbW1fYXBwX2RlbF9zdHJlYW0obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzdHJlYW0pCit7CisgICAgdGVzdF9vYmotPmNhbS0+b3BzLT51bm1hcF9zdHJlYW1fYnVmKHRlc3Rfb2JqLT5jYW0tPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwtPmNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPnNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9NQVBQSU5HX0JVRl9UWVBFX1NUUkVBTV9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSk7CisgICAgbW1fYXBwX2RlYWxsb2NhdGVfaW9uX21lbW9yeSgmc3RyZWFtLT5zX2luZm9fYnVmKTsKKyAgICB0ZXN0X29iai0+Y2FtLT5vcHMtPmRlbGV0ZV9zdHJlYW0odGVzdF9vYmotPmNhbS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC0+Y2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+c19pZCk7CisgICAgbWVtc2V0KHN0cmVhbSwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9zdHJlYW1fdCkpOworICAgIHJldHVybiBNTV9DQU1FUkFfT0s7Cit9CisKK21tX2NhbWVyYV9jaGFubmVsX3QgKm1tX2FwcF9nZXRfY2hhbm5lbF9ieV90eXBlKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3R5cGVfdCBjaF90eXBlKQoreworICAgIHJldHVybiAmdGVzdF9vYmotPmNoYW5uZWxzW2NoX3R5cGVdOworfQorCitpbnQgbW1fYXBwX2NvbmZpZ19zdHJlYW0obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3N0cmVhbV9jb25maWdfdCAqY29uZmlnKQoreworICAgIHJldHVybiB0ZXN0X29iai0+Y2FtLT5vcHMtPmNvbmZpZ19zdHJlYW0odGVzdF9vYmotPmNhbS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwtPmNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5zX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnKTsKK30KKworaW50IG1tX2FwcF9zdGFydF9jaGFubmVsKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsKQoreworICAgIHJldHVybiB0ZXN0X29iai0+Y2FtLT5vcHMtPnN0YXJ0X2NoYW5uZWwodGVzdF9vYmotPmNhbS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwtPmNoX2lkKTsKK30KKworaW50IG1tX2FwcF9zdG9wX2NoYW5uZWwobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCkKK3sKKyAgICByZXR1cm4gdGVzdF9vYmotPmNhbS0+b3BzLT5zdG9wX2NoYW5uZWwodGVzdF9vYmotPmNhbS0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC0+Y2hfaWQpOworfQorCitpbnQgaW5pdEJhdGNoVXBkYXRlKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaikKK3sKKyAgICBpbnQzMl90IGhhbF92ZXJzaW9uID0gQ0FNX0hBTF9WMTsKKworICAgIHBhcm1fYnVmZmVyX3QgKnBhcm1fYnVmID0gKCBwYXJtX2J1ZmZlcl90ICogKSB0ZXN0X29iai0+cGFybV9idWYubWVtX2luZm8uZGF0YTsKKyAgICBtZW1zZXQocGFybV9idWYsIDAsIHNpemVvZihwYXJtX2J1ZmZlcl90KSk7CisgICAgQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSCh0ZXN0X29iai0+cGFybV9idWYubWVtX2luZm8uZGF0YSwKKyAgICAgICAgICAgIENBTV9JTlRGX1BBUk1fSEFMX1ZFUlNJT04sIGhhbF92ZXJzaW9uKTsKKworICAgIHJldHVybiBNTV9DQU1FUkFfT0s7Cit9CisKK2ludCBjb21taXRTZXRCYXRjaChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIGludCBpID0gMDsKKworICAgIHBhcm1fYnVmZmVyX3QgKnBfdGFibGUgPSAoIHBhcm1fYnVmZmVyX3QgKiApIHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhOworICAgIGZvcihpID0gMDsgaSA8IENBTV9JTlRGX1BBUk1fTUFYOyBpKyspeworICAgICAgICBpZihwX3RhYmxlLT5pc192YWxpZFtpXSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA8IENBTV9JTlRGX1BBUk1fTUFYKSB7CisgICAgICAgIHJjID0gdGVzdF9vYmotPmNhbS0+b3BzLT5zZXRfcGFybXModGVzdF9vYmotPmNhbS0+Y2FtZXJhX2hhbmRsZSwgcF90YWJsZSk7CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworCitpbnQgY29tbWl0R2V0QmF0Y2gobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBpbnQgaSA9IDA7CisgICAgcGFybV9idWZmZXJfdCAqcF90YWJsZSA9ICggcGFybV9idWZmZXJfdCAqICkgdGVzdF9vYmotPnBhcm1fYnVmLm1lbV9pbmZvLmRhdGE7CisgICAgZm9yKGkgPSAwOyBpIDwgQ0FNX0lOVEZfUEFSTV9NQVg7IGkrKyl7CisgICAgICAgIGlmKHBfdGFibGUtPmlzX3ZhbGlkW2ldKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpIDwgQ0FNX0lOVEZfUEFSTV9NQVgpIHsKKyAgICAgICAgcmMgPSB0ZXN0X29iai0+Y2FtLT5vcHMtPmdldF9wYXJtcyh0ZXN0X29iai0+Y2FtLT5jYW1lcmFfaGFuZGxlLCBwX3RhYmxlKTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgc2V0QWVjTG9jayhtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosIGludCB2YWx1ZSkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBjYW1lcmEgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9BRUNfTE9DSywgKHVpbnQzMl90KXZhbHVlKSkgeworICAgICAgICBMT0dFKCJBRUMgTG9jayBwYXJhbWV0ZXIgbm90IGFkZGVkIHRvIGJhdGNoXG4iKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICByYyA9IGNvbW1pdFNldEJhdGNoKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIHBhcmFtZXRlcnMgY29tbWl0IGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCitFUlJPUjoKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBzZXRBd2JMb2NrKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgaW50IHZhbHVlKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIHJjID0gaW5pdEJhdGNoVXBkYXRlKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIGNhbWVyYSBwYXJhbWV0ZXIgdXBkYXRlIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0godGVzdF9vYmotPnBhcm1fYnVmLm1lbV9pbmZvLmRhdGEsCisgICAgICAgICAgICBDQU1fSU5URl9QQVJNX0FXQl9MT0NLLCAodWludDMyX3QpdmFsdWUpKSB7CisgICAgICAgIExPR0UoIkFXQiBMb2NrIHBhcmFtZXRlciBub3QgYWRkZWQgdG8gYmF0Y2hcbiIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2godGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggcGFyYW1ldGVycyBjb21taXQgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKK0VSUk9SOgorICAgIHJldHVybiByYzsKK30KKworCitpbnQgc2V0M0Fjb21tYW5kKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgY2FtX2V6dHVuZV9jbWRfZGF0YV90ICp2YWx1ZSkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBjYW1lcmEgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9FWlRVTkVfQ01ELCAqdmFsdWUpKSB7CisgICAgICAgIExPR0UoIkNBTV9JTlRGX1BBUk1fRVpUVU5FX0NNRCBwYXJhbWV0ZXIgbm90IGFkZGVkIHRvIGJhdGNoXG4iKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICByYyA9IGNvbW1pdFNldEJhdGNoKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIHBhcmFtZXRlcnMgY29tbWl0IGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCitFUlJPUjoKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBzZXRBdXRvRm9jdXNUdW5pbmcobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLCB0dW5lX2FjdHVhdG9yX3QgKnZhbHVlKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIHJjID0gaW5pdEJhdGNoVXBkYXRlKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIGNhbWVyYSBwYXJhbWV0ZXIgdXBkYXRlIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0godGVzdF9vYmotPnBhcm1fYnVmLm1lbV9pbmZvLmRhdGEsCisgICAgICAgICAgICBDQU1fSU5URl9QQVJNX1NFVF9BVVRPRk9DVVNUVU5JTkcsICp2YWx1ZSkpIHsKKyAgICAgICAgTE9HRSgiQXV0b0ZvY3VzIFR1bmluZyBub3QgYWRkZWQgdG8gYmF0Y2hcbiIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2godGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggcGFyYW1ldGVycyBjb21taXQgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKK0VSUk9SOgorICAgIHJldHVybiByYzsKK30KKworaW50IHNldFZmZUNvbW1hbmQobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLCB0dW5lX2NtZF90ICp2YWx1ZSkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBjYW1lcmEgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9TRVRfVkZFX0NPTU1BTkQsICp2YWx1ZSkpIHsKKyAgICAgICAgTE9HRSgiVkZFIENvbW1hbmQgbm90IGFkZGVkIHRvIGJhdGNoXG4iKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICByYyA9IGNvbW1pdFNldEJhdGNoKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIHBhcmFtZXRlcnMgY29tbWl0IGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCitFUlJPUjoKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBzZXRtZXRhaW5mb0NvbW1hbmQobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLCBjYW1fc3RyZWFtX3NpemVfaW5mb190ICp2YWx1ZSkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBjYW1lcmEgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfTUVUQV9TVFJFQU1fSU5GTywgKnZhbHVlKSkgeworICAgICAgICBMT0dFKCJQUCBDb21tYW5kIG5vdCBhZGRlZCB0byBiYXRjaFxuIik7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBwYXJhbWV0ZXJzIGNvbW1pdCBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworRVJST1I6CisgICAgcmV0dXJuIHJjOworfQorCisKK2ludCBzZXRQUENvbW1hbmQobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLCB0dW5lX2NtZF90ICp2YWx1ZSkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBjYW1lcmEgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9TRVRfUFBfQ09NTUFORCwgKnZhbHVlKSkgeworICAgICAgICBMT0dFKCJQUCBDb21tYW5kIG5vdCBhZGRlZCB0byBiYXRjaFxuIik7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBwYXJhbWV0ZXJzIGNvbW1pdCBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworRVJST1I6CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgc2V0Rm9jdXNNb2RlKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgY2FtX2ZvY3VzX21vZGVfdHlwZSBtb2RlKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIHJjID0gaW5pdEJhdGNoVXBkYXRlKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIGNhbWVyYSBwYXJhbWV0ZXIgdXBkYXRlIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgdWludDMyX3QgdmFsdWUgPSBtb2RlOworCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0godGVzdF9vYmotPnBhcm1fYnVmLm1lbV9pbmZvLmRhdGEsCisgICAgICAgICAgICBDQU1fSU5URl9QQVJNX0ZPQ1VTX01PREUsIHZhbHVlKSkgeworICAgICAgICBMT0dFKCJGb2N1cyBtb2RlIHBhcmFtZXRlciBub3QgYWRkZWQgdG8gYmF0Y2hcbiIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2godGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggcGFyYW1ldGVycyBjb21taXQgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKK0VSUk9SOgorICAgIHJldHVybiByYzsKK30KKworaW50IHNldEVWQ29tcGVuc2F0aW9uKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgaW50IGV2KQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIGNhbV9jYXBhYmlsaXR5X3QgKmNhbWVyYV9jYXAgPSBOVUxMOworCisgICAgY2FtZXJhX2NhcCA9IChjYW1fY2FwYWJpbGl0eV90ICopIHRlc3Rfb2JqLT5jYXBfYnVmLm1lbV9pbmZvLmRhdGE7CisgICAgaWYgKCAoZXYgPj0gY2FtZXJhX2NhcC0+ZXhwb3N1cmVfY29tcGVuc2F0aW9uX21pbikgJiYKKyAgICAgICAgIChldiA8PSBjYW1lcmFfY2FwLT5leHBvc3VyZV9jb21wZW5zYXRpb25fbWF4KSApIHsKKworICAgICAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIkJhdGNoIGNhbWVyYSBwYXJhbWV0ZXIgdXBkYXRlIGZhaWxlZFxuIik7CisgICAgICAgICAgICBnb3RvIEVSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0godGVzdF9vYmotPnBhcm1fYnVmLm1lbV9pbmZvLmRhdGEsCisgICAgICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9FWFBPU1VSRV9DT01QRU5TQVRJT04sIGV2KSkgeworICAgICAgICAgICAgTE9HRSgiRVYgY29tcGVuc2F0aW9uIHBhcmFtZXRlciBub3QgYWRkZWQgdG8gYmF0Y2hcbiIpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gRVJST1I7CisgICAgICAgIH0KKworICAgICAgICByYyA9IGNvbW1pdFNldEJhdGNoKHRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgiQmF0Y2ggcGFyYW1ldGVycyBjb21taXQgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIGdvdG8gRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBMT0dFKCJFViBjb21wZW5zYXRpb24gc2V0IHRvOiAlZCIsICBldik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBFViBjb21wZW5zYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCitFUlJPUjoKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBzZXRBbnRpYmFuZGluZyhtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosIGNhbV9hbnRpYmFuZGluZ19tb2RlX3R5cGUgYW50aWJhbmRpbmcpCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworCisgICAgcmMgPSBpbml0QmF0Y2hVcGRhdGUodGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggY2FtZXJhIHBhcmFtZXRlciB1cGRhdGUgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSCh0ZXN0X29iai0+cGFybV9idWYubWVtX2luZm8uZGF0YSwKKyAgICAgICAgICAgIENBTV9JTlRGX1BBUk1fQU5USUJBTkRJTkcsIGFudGliYW5kaW5nKSkgeworICAgICAgICBMT0dFKCJBbnRpYmFuZGluZyBwYXJhbWV0ZXIgbm90IGFkZGVkIHRvIGJhdGNoXG4iKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICByYyA9IGNvbW1pdFNldEJhdGNoKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIHBhcmFtZXRlcnMgY29tbWl0IGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgTE9HRSgiQW50aWJhbmRpbmcgc2V0IHRvOiAlZCIsICAoaW50KWFudGliYW5kaW5nKTsKKworRVJST1I6CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgc2V0V2hpdGVCYWxhbmNlKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgY2FtX3diX21vZGVfdHlwZSBtb2RlKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIHJjID0gaW5pdEJhdGNoVXBkYXRlKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIGNhbWVyYSBwYXJhbWV0ZXIgdXBkYXRlIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0godGVzdF9vYmotPnBhcm1fYnVmLm1lbV9pbmZvLmRhdGEsCisgICAgICAgICAgICBDQU1fSU5URl9QQVJNX1dISVRFX0JBTEFOQ0UsIG1vZGUpKSB7CisgICAgICAgIExPR0UoIldoaXRlIGJhbGFuY2UgcGFyYW1ldGVyIG5vdCBhZGRlZCB0byBiYXRjaFxuIik7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBwYXJhbWV0ZXJzIGNvbW1pdCBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIExPR0UoIldoaXRlIGJhbGFuY2Ugc2V0IHRvOiAlZCIsICAoaW50KW1vZGUpOworCitFUlJPUjoKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBzZXRFeHBvc3VyZU1ldGVyaW5nKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgY2FtX2F1dG9fZXhwb3N1cmVfbW9kZV90eXBlIG1vZGUpCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworCisgICAgcmMgPSBpbml0QmF0Y2hVcGRhdGUodGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggY2FtZXJhIHBhcmFtZXRlciB1cGRhdGUgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSCh0ZXN0X29iai0+cGFybV9idWYubWVtX2luZm8uZGF0YSwKKyAgICAgICAgICAgIENBTV9JTlRGX1BBUk1fRVhQT1NVUkUsIG1vZGUpKSB7CisgICAgICAgIExPR0UoIkV4cG9zdXJlIG1ldGVyaW5nIHBhcmFtZXRlciBub3QgYWRkZWQgdG8gYmF0Y2hcbiIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2godGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggcGFyYW1ldGVycyBjb21taXQgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICBMT0dFKCJFeHBvc3VyZSBtZXRlcmluZyBzZXQgdG86ICVkIiwgIChpbnQpbW9kZSk7CisKK0VSUk9SOgorICAgIHJldHVybiByYzsKK30KKworaW50IHNldEJyaWdodG5lc3MobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLCBpbnQgYnJpZ2h0bmVzcykKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBjYW1lcmEgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9CUklHSFRORVNTLCBicmlnaHRuZXNzKSkgeworICAgICAgICBMT0dFKCJCcmlnaHRuZXNzIHBhcmFtZXRlciBub3QgYWRkZWQgdG8gYmF0Y2hcbiIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2godGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggcGFyYW1ldGVycyBjb21taXQgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICBMT0dFKCJCcmlnaHRuZXNzIHNldCB0bzogJWQiLCAgYnJpZ2h0bmVzcyk7CisKK0VSUk9SOgorICAgIHJldHVybiByYzsKK30KKworaW50IHNldENvbnRyYXN0KG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgaW50IGNvbnRyYXN0KQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIHJjID0gaW5pdEJhdGNoVXBkYXRlKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIGNhbWVyYSBwYXJhbWV0ZXIgdXBkYXRlIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0godGVzdF9vYmotPnBhcm1fYnVmLm1lbV9pbmZvLmRhdGEsCisgICAgICAgICAgICBDQU1fSU5URl9QQVJNX0NPTlRSQVNULCBjb250cmFzdCkpIHsKKyAgICAgICAgTE9HRSgiQ29udHJhc3QgcGFyYW1ldGVyIG5vdCBhZGRlZCB0byBiYXRjaFxuIik7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBwYXJhbWV0ZXJzIGNvbW1pdCBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIExPR0UoIkNvbnRyYXN0IHNldCB0bzogJWQiLCAgY29udHJhc3QpOworCitFUlJPUjoKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBzZXRUaW50bGVzcyhtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosIGludCB0aW50bGVzcykKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBjYW1lcmEgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9USU5UTEVTUywgdGludGxlc3MpKSB7CisgICAgICAgIExPR0UoIlRpbnRsZXNzIHBhcmFtZXRlciBub3QgYWRkZWQgdG8gYmF0Y2hcbiIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2godGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggcGFyYW1ldGVycyBjb21taXQgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICBMT0dFKCJzZXQgVGludGxlc3MgdG86ICVkIiwgIHRpbnRsZXNzKTsKKworRVJST1I6CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgc2V0U2F0dXJhdGlvbihtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosIGludCBzYXR1cmF0aW9uKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIHJjID0gaW5pdEJhdGNoVXBkYXRlKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIGNhbWVyYSBwYXJhbWV0ZXIgdXBkYXRlIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0godGVzdF9vYmotPnBhcm1fYnVmLm1lbV9pbmZvLmRhdGEsCisgICAgICAgICAgICBDQU1fSU5URl9QQVJNX1NBVFVSQVRJT04sIHNhdHVyYXRpb24pKSB7CisgICAgICAgIExPR0UoIlNhdHVyYXRpb24gcGFyYW1ldGVyIG5vdCBhZGRlZCB0byBiYXRjaFxuIik7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBwYXJhbWV0ZXJzIGNvbW1pdCBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIExPR0UoIlNhdHVyYXRpb24gc2V0IHRvOiAlZCIsICBzYXR1cmF0aW9uKTsKKworRVJST1I6CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgc2V0U2hhcnBuZXNzKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgaW50IHNoYXJwbmVzcykKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBjYW1lcmEgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9TSEFSUE5FU1MsIHNoYXJwbmVzcykpIHsKKyAgICAgICAgTE9HRSgiU2hhcnBuZXNzIHBhcmFtZXRlciBub3QgYWRkZWQgdG8gYmF0Y2hcbiIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2godGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggcGFyYW1ldGVycyBjb21taXQgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICB0ZXN0X29iai0+cmVwcm9jX3NoYXJwbmVzcyA9IHNoYXJwbmVzczsKKyAgICBMT0dFKCJTaGFycG5lc3Mgc2V0IHRvOiAlZCIsICBzaGFycG5lc3MpOworCitFUlJPUjoKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBzZXRJU08obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLCBjYW1faXNvX21vZGVfdHlwZSBpc28pCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworCisgICAgcmMgPSBpbml0QmF0Y2hVcGRhdGUodGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggY2FtZXJhIHBhcmFtZXRlciB1cGRhdGUgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICBjYW1faW50Zl9wYXJtX21hbnVhbF8zYV90IGlzb19zZXR0aW5nczsKKyAgICBtZW1zZXQoJmlzb19zZXR0aW5ncywgMCwgc2l6ZW9mKGNhbV9pbnRmX3Bhcm1fbWFudWFsXzNhX3QpKTsKKyAgICBpc29fc2V0dGluZ3MucHJldmlld09ubHkgPSBGQUxTRTsKKyAgICBpc29fc2V0dGluZ3MudmFsdWUgPSAodWludDY0X3QpaXNvOworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9JU08sIGlzb19zZXR0aW5ncykpIHsKKyAgICAgICAgTE9HRSgiSVNPIHBhcmFtZXRlciBub3QgYWRkZWQgdG8gYmF0Y2hcbiIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2godGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggcGFyYW1ldGVycyBjb21taXQgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICBMT0dFKCJJU08gc2V0IHRvOiAlZCIsICAoaW50KWlzbyk7CisKK0VSUk9SOgorICAgIHJldHVybiByYzsKK30KKworaW50IHNldFpvb20obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLCBpbnQgem9vbSkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBjYW1lcmEgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9aT09NLCB6b29tKSkgeworICAgICAgICBMT0dFKCJab29tIHBhcmFtZXRlciBub3QgYWRkZWQgdG8gYmF0Y2hcbiIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2godGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggcGFyYW1ldGVycyBjb21taXQgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICBMT0dFKCJab29tIHNldCB0bzogJWQiLCAgem9vbSk7CisKK0VSUk9SOgorICAgIHJldHVybiByYzsKK30KKworaW50IHNldEZQU1JhbmdlKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgY2FtX2Zwc19yYW5nZV90IHJhbmdlKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIHJjID0gaW5pdEJhdGNoVXBkYXRlKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIGNhbWVyYSBwYXJhbWV0ZXIgdXBkYXRlIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0godGVzdF9vYmotPnBhcm1fYnVmLm1lbV9pbmZvLmRhdGEsCisgICAgICAgICAgICBDQU1fSU5URl9QQVJNX0ZQU19SQU5HRSwgcmFuZ2UpKSB7CisgICAgICAgIExPR0UoIkZQUyByYW5nZSBwYXJhbWV0ZXIgbm90IGFkZGVkIHRvIGJhdGNoXG4iKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICByYyA9IGNvbW1pdFNldEJhdGNoKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIHBhcmFtZXRlcnMgY29tbWl0IGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgTE9HRSgiRlBTIFJhbmdlIHNldCB0bzogWyU1LjJmOiU1LjJmXSIsCisgICAgICAgICAgICByYW5nZS5taW5fZnBzLAorICAgICAgICAgICAgcmFuZ2UubWF4X2Zwcyk7CisKK0VSUk9SOgorICAgIHJldHVybiByYzsKK30KKworaW50IHNldFNjZW5lKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgY2FtX3NjZW5lX21vZGVfdHlwZSBzY2VuZSkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBjYW1lcmEgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9CRVNUU0hPVF9NT0RFLCBzY2VuZSkpIHsKKyAgICAgICAgTE9HRSgiU2NlbmUgcGFyYW1ldGVyIG5vdCBhZGRlZCB0byBiYXRjaFxuIik7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBwYXJhbWV0ZXJzIGNvbW1pdCBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIExPR0UoIlNjZW5lIHNldCB0bzogJWQiLCAgKGludClzY2VuZSk7CisKK0VSUk9SOgorICAgIHJldHVybiByYzsKK30KKworaW50IHNldEZsYXNoKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgY2FtX2ZsYXNoX21vZGVfdCBmbGFzaCkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBjYW1lcmEgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhLAorICAgICAgICAgICAgQ0FNX0lOVEZfUEFSTV9MRURfTU9ERSwgZmxhc2gpKSB7CisgICAgICAgIExPR0UoIkZsYXNoIHBhcmFtZXRlciBub3QgYWRkZWQgdG8gYmF0Y2hcbiIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2godGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggcGFyYW1ldGVycyBjb21taXQgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICBMT0dFKCJGbGFzaCBzZXQgdG86ICVkIiwgIChpbnQpZmxhc2gpOworCitFUlJPUjoKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBzZXRXTlIobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLCB1aW50OF90IGVuYWJsZSkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBjYW1lcmEgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIGNhbV9kZW5vaXNlX3BhcmFtX3QgcGFyYW07CisgICAgbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKGNhbV9kZW5vaXNlX3BhcmFtX3QpKTsKKyAgICBwYXJhbS5kZW5vaXNlX2VuYWJsZSA9IGVuYWJsZTsKKyAgICBwYXJhbS5wcm9jZXNzX3BsYXRlcyA9IENBTV9XQVZFTEVUX0RFTk9JU0VfWUNCQ1JfUExBTkU7CisKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSCh0ZXN0X29iai0+cGFybV9idWYubWVtX2luZm8uZGF0YSwKKyAgICAgICAgICAgIENBTV9JTlRGX1BBUk1fV0FWRUxFVF9ERU5PSVNFLCBwYXJhbSkpIHsKKyAgICAgICAgTE9HRSgiV05SIGVuYWJsZWQgcGFyYW1ldGVyIG5vdCBhZGRlZCB0byBiYXRjaFxuIik7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBwYXJhbWV0ZXJzIGNvbW1pdCBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworCisgICAgdGVzdF9vYmotPnJlcHJvY193bnIgPSBwYXJhbTsKKyAgICBMT0dFKCJXTlIgZW5hYmxlZDogJWQiLCAgZW5hYmxlKTsKK0VSUk9SOgorICAgIHJldHVybiByYzsKK30KKworCitpbnQgc2V0SVJNb2RlKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgY2FtX2lyX21vZGVfdHlwZV90IGlyX21vZGUpCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworCisgICAgcmMgPSBpbml0QmF0Y2hVcGRhdGUodGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggY2FtZXJhIHBhcmFtZXRlciB1cGRhdGUgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICBpZiAoQUREX1NFVF9QQVJBTV9FTlRSWV9UT19CQVRDSCh0ZXN0X29iai0+cGFybV9idWYubWVtX2luZm8uZGF0YSwKKyAgICAgICAgICAgIENBTV9JTlRGX01FVEFfSVJfTU9ERSwgaXJfbW9kZSkpIHsKKyAgICAgICAgTE9HRSgiRmxhc2ggcGFyYW1ldGVyIG5vdCBhZGRlZCB0byBiYXRjaFxuIik7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgcmMgPSBjb21taXRTZXRCYXRjaCh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBwYXJhbWV0ZXJzIGNvbW1pdCBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIExPR0UoIklSIExFRCBzZXQgdG86ICVkIiwgIChpbnQpaXJfbW9kZSk7CisKK0VSUk9SOgorICAgIHJldHVybiByYzsKK30KKworCitpbnQgc2V0RVpUdW5lKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgdWludDhfdCBlbmFibGUpCit7CisgICAgdGVzdF9vYmotPmVuYWJsZV9FWlR1bmUgPSBlbmFibGU7CisgICAgcmV0dXJuIDA7Cit9CisvKiogdHVuZXNlcnZlcl9jYXB0dXJlCisgKiAgICBAbGliX2hhbmRsZTogdGhlIGNhbWVyYSBoYW5kbGUgb2JqZWN0CisgKiAgICBAZGltOiBzbmFwc2hvdCBkaW1lbnNpb25zCisgKgorICogIG1ha2VzIEpQRUcgY2FwdHVyZQorICoKKyAqICBSZXR1cm46ID49MCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICoqLworaW50IHR1bmVzZXJ2ZXJfY2FwdHVyZShtbV9jYW1lcmFfbGliX2hhbmRsZSAqbGliX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2xpYl9zbmFwc2hvdF9wYXJhbXMgKmRpbSkKK3sKKyAgICBpbnQgcmMgPSAwOworCisgICAgcHJpbnRmKCJUYWtlIGpwZWcgc25hcHNob3RcbiIpOworICAgIGlmICggbGliX2hhbmRsZS0+c3RyZWFtX3J1bm5pbmcgKSB7CisKKyAgICAgICAgaWYgKCBsaWJfaGFuZGxlLT50ZXN0X29iai56c2xfZW5hYmxlZCkgeworICAgICAgICAgICAgaWYgKCBOVUxMICE9IGRpbSkgeworICAgICAgICAgICAgICAgIGlmICggKCBsaWJfaGFuZGxlLT50ZXN0X29iai5idWZmZXJfd2lkdGggIT0gZGltLT53aWR0aCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICggbGliX2hhbmRsZS0+dGVzdF9vYmouYnVmZmVyX2hlaWdodCA9IGRpbS0+aGVpZ2h0ICkgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgbGliX2hhbmRsZS0+dGVzdF9vYmouYnVmZmVyX3dpZHRoID0gZGltLT53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgbGliX2hhbmRsZS0+dGVzdF9vYmouYnVmZmVyX2hlaWdodCA9IGRpbS0+aGVpZ2h0OworCisgICAgICAgICAgICAgICAgICAgIHJjID0gbW1fY2FtZXJhX2xpYl9zdG9wX3N0cmVhbShsaWJfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgibW1fY2FtZXJhX2xpYl9zdG9wX3N0cmVhbSgpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJjID0gbW1fY2FtZXJhX2xpYl9zdGFydF9zdHJlYW0obGliX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfc3RhcnRfc3RyZWFtKCkgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpYl9oYW5kbGUtPnRlc3Rfb2JqLmVuY29kZUpwZWcgPSAxOworCisgICAgICAgICAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZvciBzdGFuZGFyZCAyRCBjYXB0dXJlIHN0cmVhbWluZyBoYXMgdG8gYmUgZGlzYWJsZWQgZmlyc3QKKyAgICAgICAgICAgIHJjID0gbW1fY2FtZXJhX2xpYl9zdG9wX3N0cmVhbShsaWJfaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9jYW1lcmFfbGliX3N0b3Bfc3RyZWFtKCkgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIE5VTEwgIT0gZGltICkgeworICAgICAgICAgICAgICAgIGxpYl9oYW5kbGUtPnRlc3Rfb2JqLmJ1ZmZlcl93aWR0aCA9IGRpbS0+d2lkdGg7CisgICAgICAgICAgICAgICAgbGliX2hhbmRsZS0+dGVzdF9vYmouYnVmZmVyX2hlaWdodCA9IGRpbS0+aGVpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmMgPSBtbV9hcHBfc3RhcnRfY2FwdHVyZSgmbGliX2hhbmRsZS0+dGVzdF9vYmosIDEpOworICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9zdGFydF9jYXB0dXJlKCkgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKworICAgICAgICAgICAgcmMgPSBtbV9hcHBfc3RvcF9jYXB0dXJlKCZsaWJfaGFuZGxlLT50ZXN0X29iaik7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX3N0b3BfY2FwdHVyZSgpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVzdGFydCBzdHJlYW1pbmcgYWZ0ZXIgY2FwdHVyZSBpcyBkb25lCisgICAgICAgICAgICByYyA9IG1tX2NhbWVyYV9saWJfc3RhcnRfc3RyZWFtKGxpYl9oYW5kbGUpOworICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfc3RhcnRfc3RyZWFtKCkgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitFWElUOgorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fYXBwX3N0YXJ0X3JlZ3Jlc3Npb25fdGVzdChpbnQgcnVuX3RjKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBtbV9jYW1lcmFfYXBwX3QgbXlfY2FtX2FwcDsKKworICAgIExPR0QoIlxuQ2FtZXJhIFRlc3QgQXBwbGljYXRpb25cbiIpOworICAgIG1lbXNldCgmbXlfY2FtX2FwcCwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9hcHBfdCkpOworCisgICAgcmMgPSBtbV9hcHBfbG9hZF9oYWwoJm15X2NhbV9hcHApOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgibW1fYXBwX2xvYWRfaGFsIGZhaWxlZCAhISIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgaWYocnVuX3RjKSB7CisgICAgICAgIHJjID0gbW1fYXBwX3VuaXRfdGVzdF9lbnRyeSgmbXlfY2FtX2FwcCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisjaWYgMAorICAgIGlmKHJ1bl9kdWFsX3RjKSB7CisgICAgICAgIHByaW50ZigiXHRSdW5uaW5nIER1YWwgY2FtZXJhIHRlc3QgZW5naW5lIG9ubHlcbiIpOworICAgICAgICByYyA9IG1tX2FwcF9kdWFsX3Rlc3RfZW50cnkoJm15X2NhbV9hcHApOworICAgICAgICBwcmludGYoIlx0IER1YWwgY2FtZXJhIGVuZ2luZS4gRVhJVCglZCkhISFcbiIsIHJjKTsKKyAgICAgICAgZXhpdChyYyk7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIHJjOworfQorCitpbnQzMl90IG1tX2NhbWVyYV9sb2FkX3R1bmluZ2xpYnJhcnkobW1fY2FtZXJhX3R1bmluZ19saWJfcGFyYW1zX3QgKnR1bmluZ19wYXJhbSkKK3sKKyAgdm9pZCAqKCp0dW5pbmdfb3Blbl9saWIpKHZvaWQpID0gTlVMTDsKKworICBMT0dEKCJFIik7CisgIHR1bmluZ19wYXJhbS0+bGliX2hhbmRsZSA9IGRsb3BlbigibGlibW1jYW1lcmFfdHVuaW5nLnNvIiwgUlRMRF9OT1cpOworICBpZiAoIXR1bmluZ19wYXJhbS0+bGliX2hhbmRsZSkgeworICAgIExPR0UoIkZhaWxlZCBvcGVuaW5nIGxpYm1tY2FtZXJhX3R1bmluZy5zb1xuIik7CisgICAgcmV0dXJuIC1FSU5WQUw7CisgIH0KKworICAqKHZvaWQgKiopJnR1bmluZ19vcGVuX2xpYiAgPSBkbHN5bSh0dW5pbmdfcGFyYW0tPmxpYl9oYW5kbGUsCisgICAgIm9wZW5fdHVuaW5nX2xpYiIpOworICBpZiAoIXR1bmluZ19vcGVuX2xpYikgeworICAgIExPR0UoIkZhaWxlZCBzeW1ib2wgbGlibW1jYW1lcmFfdHVuaW5nLnNvXG4iKTsKKyAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorCisgIGlmICh0dW5pbmdfcGFyYW0tPmZ1bmNfdGJsKSB7CisgICAgTE9HRSgiYWxyZWFkeSBsb2FkZWQgdHVuaW5nbGliLi4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHR1bmluZ19wYXJhbS0+ZnVuY190YmwgPSAobW1fY2FtZXJhX3R1bmVfZnVuY190ICopdHVuaW5nX29wZW5fbGliKCk7CisgIGlmICghdHVuaW5nX3BhcmFtLT5mdW5jX3RibCkgeworICAgIExPR0UoIkZhaWxlZCBvcGVuaW5nIGxpYnJhcnkgZnVuYyB0YWJsZSBwdHJcbiIpOworICAgIHJldHVybiAtRUlOVkFMOworICB9CisKKyAgTE9HRCgiWCIpOworICByZXR1cm4gMDsKK30KKworaW50IG1tX2NhbWVyYV9saWJfb3BlbihtbV9jYW1lcmFfbGliX2hhbmRsZSAqaGFuZGxlLCBpbnQgY2FtX2lkKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIGlmICggTlVMTCA9PSBoYW5kbGUgKSB7CisgICAgICAgIExPR0UoIiBJbnZhbGlkIGhhbmRsZSIpOworICAgICAgICByYyA9IE1NX0NBTUVSQV9FX0lOVkFMSURfSU5QVVQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBtZW1zZXQoaGFuZGxlLCAwLCBzaXplb2YobW1fY2FtZXJhX2xpYl9oYW5kbGUpKTsKKyAgICByYyA9IG1tX2FwcF9sb2FkX2hhbCgmaGFuZGxlLT5hcHBfY3R4KTsKKyAgICBpZiggTU1fQ0FNRVJBX09LICE9IHJjICkgeworICAgICAgICBMT0dFKCJtbV9hcHBfaW5pdCBlcnJcbiIpOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaGFuZGxlLT50ZXN0X29iai5idWZmZXJfd2lkdGggPSBERUZBVUxUX1BSRVZJRVdfV0lEVEg7CisgICAgaGFuZGxlLT50ZXN0X29iai5idWZmZXJfaGVpZ2h0ID0gREVGQVVMVF9QUkVWSUVXX0hFSUdIVDsKKyAgICBoYW5kbGUtPnRlc3Rfb2JqLmJ1ZmZlcl9mb3JtYXQgPSBERUZBVUxUX1NOQVBTSE9UX0ZPUk1BVDsKKyAgICBoYW5kbGUtPmN1cnJlbnRfcGFyYW1zLnN0cmVhbV93aWR0aCA9IERFRkFVTFRfU05BUFNIT1RfV0lEVEg7CisgICAgaGFuZGxlLT5jdXJyZW50X3BhcmFtcy5zdHJlYW1faGVpZ2h0ID0gREVGQVVMVF9TTkFQU0hPVF9IRUlHSFQ7CisgICAgaGFuZGxlLT5jdXJyZW50X3BhcmFtcy5hZl9tb2RlID0gQ0FNX0ZPQ1VTX01PREVfQVVUTzsgLy8gRGVmYXVsdCB0byBhdXRvIGZvY3VzIG1vZGUKKyAgICByYyA9IG1tX2FwcF9vcGVuKCZoYW5kbGUtPmFwcF9jdHgsICh1aW50OF90KWNhbV9pZCwgJmhhbmRsZS0+dGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgibW1fYXBwX29wZW4oKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGNhbV9pZCwgcmMpOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgLy9yYyA9IG1tX2FwcF9pbml0aWFsaXplX2ZiKCZoYW5kbGUtPnRlc3Rfb2JqKTsKKyAgICByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIm1tX2FwcF9pbml0aWFsaXplX2ZiKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICBjYW1faWQsIHJjKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworRVhJVDoKKworICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2NhbWVyYV9saWJfc3RhcnRfc3RyZWFtKG1tX2NhbWVyYV9saWJfaGFuZGxlICpoYW5kbGUpCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIGNhbV9jYXBhYmlsaXR5X3QgY2FtZXJhX2NhcDsKKworICAgIGlmICggTlVMTCA9PSBoYW5kbGUgKSB7CisgICAgICAgIExPR0UoIiBJbnZhbGlkIGhhbmRsZSIpOworICAgICAgICByYyA9IE1NX0NBTUVSQV9FX0lOVkFMSURfSU5QVVQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoIGhhbmRsZS0+dGVzdF9vYmouenNsX2VuYWJsZWQgKSB7CisgICAgICAgIHJjID0gbW1fYXBwX3N0YXJ0X3ByZXZpZXdfenNsKCZoYW5kbGUtPnRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX3N0YXJ0X3ByZXZpZXdfenNsKCkgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaGFuZGxlLT50ZXN0X29iai5lbmFibGVfcmVwcm9jID0gRU5BQkxFX1JFUFJPQ0VTU0lORzsKKyAgICAgICAgcmMgPSBtbV9hcHBfc3RhcnRfcHJldmlldygmaGFuZGxlLT50ZXN0X29iaik7CisgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9zdGFydF9wcmV2aWV3KCkgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29uZmlndXJlIGZvY3VzIG1vZGUgYWZ0ZXIgc3RyZWFtIHN0YXJ0cworICAgIHJjID0gbW1fY2FtZXJhX2xpYl9nZXRfY2FwcyhoYW5kbGUsICZjYW1lcmFfY2FwKTsKKyAgICBpZiAoIE1NX0NBTUVSQV9PSyAhPSByYyApIHsKKyAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfZ2V0X2NhcHMoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChjYW1lcmFfY2FwLnN1cHBvcnRlZF9mb2N1c19tb2Rlc19jbnQgPT0gMSAmJgorICAgICAgY2FtZXJhX2NhcC5zdXBwb3J0ZWRfZm9jdXNfbW9kZXNbMF0gPT0gQ0FNX0ZPQ1VTX01PREVfRklYRUQpIHsKKyAgICAgIExPR0QoImZvY3VzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgIGhhbmRsZS0+dGVzdF9vYmouZm9jdXNfc3VwcG9ydGVkID0gMDsKKyAgICAgIGhhbmRsZS0+Y3VycmVudF9wYXJhbXMuYWZfbW9kZSA9IENBTV9GT0NVU19NT0RFX0ZJWEVEOworICAgIH0gZWxzZSB7CisgICAgICBoYW5kbGUtPnRlc3Rfb2JqLmZvY3VzX3N1cHBvcnRlZCA9IDE7CisgICAgfQorICAgIHJjID0gc2V0Rm9jdXNNb2RlKCZoYW5kbGUtPnRlc3Rfb2JqLCBoYW5kbGUtPmN1cnJlbnRfcGFyYW1zLmFmX21vZGUpOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgIExPR0UoImF1dG9mb2N1cyBlcnJvclxuIik7CisgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGhhbmRsZS0+c3RyZWFtX3J1bm5pbmcgPSAxOworCitFWElUOgorICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2NhbWVyYV9saWJfc3RvcF9zdHJlYW0obW1fY2FtZXJhX2xpYl9oYW5kbGUgKmhhbmRsZSkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICBpZiAoIE5VTEwgPT0gaGFuZGxlICkgeworICAgICAgICBMT0dFKCIgSW52YWxpZCBoYW5kbGUiKTsKKyAgICAgICAgcmMgPSBNTV9DQU1FUkFfRV9JTlZBTElEX0lOUFVUOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKCBoYW5kbGUtPnRlc3Rfb2JqLnpzbF9lbmFibGVkICkgeworICAgICAgICByYyA9IG1tX2FwcF9zdG9wX3ByZXZpZXdfenNsKCZoYW5kbGUtPnRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX3N0b3BfcHJldmlld196c2woKSBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByYyA9IG1tX2FwcF9zdG9wX3ByZXZpZXcoJmhhbmRsZS0+dGVzdF9vYmopOworICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJtbV9hcHBfc3RvcF9wcmV2aWV3KCkgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgaGFuZGxlLT5zdHJlYW1fcnVubmluZyA9IDA7CisKK0VYSVQ6CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fY2FtZXJhX2xpYl9nZXRfY2FwcyhtbV9jYW1lcmFfbGliX2hhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2NhcGFiaWxpdHlfdCAqY2FwcykKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisKKyAgICBpZiAoIE5VTEwgPT0gaGFuZGxlICkgeworICAgICAgICBMT0dFKCIgSW52YWxpZCBoYW5kbGUiKTsKKyAgICAgICAgcmMgPSBNTV9DQU1FUkFfRV9JTlZBTElEX0lOUFVUOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKCBOVUxMID09IGNhcHMgKSB7CisgICAgICAgIExPR0UoIiBJbnZhbGlkIGNhcGFiaWxpdGllcyBzdHJ1Y3R1cmUiKTsKKyAgICAgICAgcmMgPSBNTV9DQU1FUkFfRV9JTlZBTElEX0lOUFVUOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgKmNhcHMgPSAqKCAoY2FtX2NhcGFiaWxpdHlfdCAqKSBoYW5kbGUtPnRlc3Rfb2JqLmNhcF9idWYubWVtX2luZm8uZGF0YSApOworCitFWElUOgorCisgICAgcmV0dXJuIHJjOworfQorCisKK2ludCBtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZChtbV9jYW1lcmFfbGliX2hhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9saWJfY29tbWFuZHMgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmluX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX191bnVzZWQgdm9pZCAqb3V0X2RhdGEpCit7CisgICAgdWludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgY2FtX2NhcGFiaWxpdHlfdCAqY2FtZXJhX2NhcCA9IE5VTEw7CisgICAgbW1fY2FtZXJhX2xpYl9zbmFwc2hvdF9wYXJhbXMgKmRpbSA9IE5VTEw7CisKKyAgICBpZiAoIE5VTEwgPT0gaGFuZGxlICkgeworICAgICAgICBMT0dFKCIgSW52YWxpZCBoYW5kbGUiKTsKKyAgICAgICAgcmMgPSBNTV9DQU1FUkFfRV9JTlZBTElEX0lOUFVUOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgY2FtZXJhX2NhcCA9IChjYW1fY2FwYWJpbGl0eV90ICopIGhhbmRsZS0+dGVzdF9vYmouY2FwX2J1Zi5tZW1faW5mby5kYXRhOworCisgICAgc3dpdGNoKGNtZCkgeworICAgICAgICBjYXNlIE1NX0NBTUVSQV9MSUJfRVpUVU5FX0VOQUJMRToKKyAgICAgICAgICAgIGlmICggTlVMTCAhPSBpbl9kYXRhKSB7CisgICAgICAgICAgICAgICAgaW50IGVuYWJsZV9lenR1bmUgPSAqKCggaW50ICogKWluX2RhdGEpOworICAgICAgICAgICAgICAgIGlmICggKCBlbmFibGVfZXp0dW5lICE9IGhhbmRsZS0+dGVzdF9vYmouZW5hYmxlX0VaVHVuZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+c3RyZWFtX3J1bm5pbmcgKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gbW1fY2FtZXJhX2xpYl9zdG9wX3N0cmVhbShoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJtbV9jYW1lcmFfbGliX3N0b3Bfc3RyZWFtKCkgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+dGVzdF9vYmouZW5hYmxlX0VaVHVuZT0gZW5hYmxlX2V6dHVuZTsKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBtbV9jYW1lcmFfbGliX3N0YXJ0X3N0cmVhbShoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJtbV9jYW1lcmFfbGliX3N0YXJ0X3N0cmVhbSgpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+dGVzdF9vYmouZW5hYmxlX0VaVHVuZT0gZW5hYmxlX2V6dHVuZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1NX0NBTUVSQV9MSUJfSVJNT0RFOgorICAgICAgICAgICAgaWYgKCBOVUxMICE9IGluX2RhdGEpIHsKKyAgICAgICAgICAgICAgICBpbnQgZW5hYmxlX2lyID0gKigoIGludCAqIClpbl9kYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlX2lyICE9IGhhbmRsZS0+dGVzdF9vYmouZW5hYmxlX2lyKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZS0+dGVzdF9vYmouZW5hYmxlX2lyID0gZW5hYmxlX2lyOworICAgICAgICAgICAgICAgICAgICByYyA9IHNldElSTW9kZSgmaGFuZGxlLT50ZXN0X29iaiwgZW5hYmxlX2lyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgic2V0Wm9vbSgpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1NX0NBTUVSQV9MSUJfRkxBU0g6CisgICAgICAgICAgICBpZiAoIE5VTEwgIT0gaW5fZGF0YSApIHsKKyAgICAgICAgICAgICAgICBjYW1fZmxhc2hfbW9kZV90IGZsYXNoID0gKigoIGludCAqIClpbl9kYXRhKTsKKyAgICAgICAgICAgICAgICByYyA9IHNldEZsYXNoKCZoYW5kbGUtPnRlc3Rfb2JqLCBmbGFzaCk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgic2V0Rmxhc2goKSBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0xJQl9CRVNUU0hPVDoKKyAgICAgICAgICAgIGlmICggTlVMTCAhPSBpbl9kYXRhICkgeworICAgICAgICAgICAgICAgIGNhbV9zY2VuZV9tb2RlX3R5cGUgc2NlbmUgPSAqKCggaW50ICogKWluX2RhdGEpOworICAgICAgICAgICAgICAgIHJjID0gc2V0U2NlbmUoJmhhbmRsZS0+dGVzdF9vYmosIHNjZW5lKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJzZXRTY2VuZSgpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNTV9DQU1FUkFfTElCX1pPT006CisgICAgICAgICAgICBpZiAoIE5VTEwgIT0gaW5fZGF0YSApIHsKKyAgICAgICAgICAgICAgICBpbnQgem9vbSA9ICooKCBpbnQgKiApaW5fZGF0YSk7CisgICAgICAgICAgICAgICAgcmMgPSBzZXRab29tKCZoYW5kbGUtPnRlc3Rfb2JqLCB6b29tKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJzZXRab29tKCkgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1NX0NBTUVSQV9MSUJfSVNPOgorICAgICAgICAgICAgaWYgKCBOVUxMICE9IGluX2RhdGEgKSB7CisgICAgICAgICAgICAgICAgY2FtX2lzb19tb2RlX3R5cGUgaXNvID0gKigoIGludCAqIClpbl9kYXRhKTsKKyAgICAgICAgICAgICAgICByYyA9IHNldElTTygmaGFuZGxlLT50ZXN0X29iaiwgaXNvKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJzZXRJU08oKSBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0xJQl9TSEFSUE5FU1M6CisgICAgICAgICAgICBpZiAoIE5VTEwgIT0gaW5fZGF0YSApIHsKKyAgICAgICAgICAgICAgICBpbnQgc2hhcnBuZXNzID0gKigoIGludCAqIClpbl9kYXRhKTsKKyAgICAgICAgICAgICAgICByYyA9IHNldFNoYXJwbmVzcygmaGFuZGxlLT50ZXN0X29iaiwgc2hhcnBuZXNzKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJzZXRTaGFycG5lc3MoKSBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0xJQl9TQVRVUkFUSU9OOgorICAgICAgICAgICAgaWYgKCBOVUxMICE9IGluX2RhdGEgKSB7CisgICAgICAgICAgICAgICAgaW50IHNhdHVyYXRpb24gPSAqKCggaW50ICogKWluX2RhdGEpOworICAgICAgICAgICAgICAgIHJjID0gc2V0U2F0dXJhdGlvbigmaGFuZGxlLT50ZXN0X29iaiwgc2F0dXJhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgic2V0U2F0dXJhdGlvbigpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNTV9DQU1FUkFfTElCX0NPTlRSQVNUOgorICAgICAgICAgICAgaWYgKCBOVUxMICE9IGluX2RhdGEgKSB7CisgICAgICAgICAgICAgICAgaW50IGNvbnRyYXN0ID0gKigoIGludCAqIClpbl9kYXRhKTsKKyAgICAgICAgICAgICAgICByYyA9IHNldENvbnRyYXN0KCZoYW5kbGUtPnRlc3Rfb2JqLCBjb250cmFzdCk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgic2V0Q29udHJhc3QoKSBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0xJQl9TRVRfVElOVExFU1M6CisgICAgICAgICAgICBpZiAoIE5VTEwgIT0gaW5fZGF0YSApIHsKKyAgICAgICAgICAgICAgICBpbnQgdGludGxlc3MgPSAqKCggaW50ICogKWluX2RhdGEpOworICAgICAgICAgICAgICAgIHJjID0gc2V0VGludGxlc3MoJmhhbmRsZS0+dGVzdF9vYmosIHRpbnRsZXNzKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJlbmxhYmUvZGlzYWJsZTolZCB0aW50bGVzcygpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbnRsZXNzLCByYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0xJQl9CUklHSFRORVNTOgorICAgICAgICAgICAgaWYgKCBOVUxMICE9IGluX2RhdGEgKSB7CisgICAgICAgICAgICAgICAgaW50IGJyaWdodG5lc3MgPSAqKCggaW50ICogKWluX2RhdGEpOworICAgICAgICAgICAgICAgIHJjID0gc2V0QnJpZ2h0bmVzcygmaGFuZGxlLT50ZXN0X29iaiwgYnJpZ2h0bmVzcyk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgic2V0QnJpZ2h0bmVzcygpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNTV9DQU1FUkFfTElCX0VYUE9TVVJFX01FVEVSSU5HOgorICAgICAgICAgICAgaWYgKCBOVUxMICE9IGluX2RhdGEgKSB7CisgICAgICAgICAgICAgICAgY2FtX2F1dG9fZXhwb3N1cmVfbW9kZV90eXBlIGV4cCA9ICooKCBpbnQgKiApaW5fZGF0YSk7CisgICAgICAgICAgICAgICAgcmMgPSBzZXRFeHBvc3VyZU1ldGVyaW5nKCZoYW5kbGUtPnRlc3Rfb2JqLCBleHApOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoInNldEV4cG9zdXJlTWV0ZXJpbmcoKSBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0xJQl9XQjoKKyAgICAgICAgICAgIGlmICggTlVMTCAhPSBpbl9kYXRhICkgeworICAgICAgICAgICAgICAgIGNhbV93Yl9tb2RlX3R5cGUgd2IgPSAqKCggaW50ICogKWluX2RhdGEpOworICAgICAgICAgICAgICAgIHJjID0gc2V0V2hpdGVCYWxhbmNlKCZoYW5kbGUtPnRlc3Rfb2JqLCB3Yik7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgic2V0V2hpdGVCYWxhbmNlKCkgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1NX0NBTUVSQV9MSUJfQU5USUJBTkRJTkc6CisgICAgICAgICAgICBpZiAoIE5VTEwgIT0gaW5fZGF0YSApIHsKKyAgICAgICAgICAgICAgICBpbnQgYW50aWJhbmRpbmcgPSAqKCggaW50ICogKWluX2RhdGEpOworICAgICAgICAgICAgICAgIHJjID0gc2V0QW50aWJhbmRpbmcoJmhhbmRsZS0+dGVzdF9vYmosIGFudGliYW5kaW5nKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dFKCJzZXRBbnRpYmFuZGluZygpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNTV9DQU1FUkFfTElCX0VWOgorICAgICAgICAgICAgaWYgKCBOVUxMICE9IGluX2RhdGEgKSB7CisgICAgICAgICAgICAgICAgaW50IGV2ID0gKigoIGludCAqIClpbl9kYXRhKTsKKyAgICAgICAgICAgICAgICByYyA9IHNldEVWQ29tcGVuc2F0aW9uKCZoYW5kbGUtPnRlc3Rfb2JqLCBldik7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgic2V0RVZDb21wZW5zYXRpb24oKSBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0xJQl9aU0xfRU5BQkxFOgorICAgICAgICAgICAgaWYgKCBOVUxMICE9IGluX2RhdGEpIHsKKyAgICAgICAgICAgICAgICBkaW0gPSAoIG1tX2NhbWVyYV9saWJfc25hcHNob3RfcGFyYW1zICogKSBpbl9kYXRhOworICAgICAgICAgICAgICAgIGlmICggKCBkaW0tPmlzWlNMIT0gaGFuZGxlLT50ZXN0X29iai56c2xfZW5hYmxlZCApICYmCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUtPnN0cmVhbV9ydW5uaW5nICkgeworICAgICAgICAgICAgICAgICAgICByYyA9IG1tX2NhbWVyYV9saWJfc3RvcF9zdHJlYW0oaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgibW1fY2FtZXJhX2xpYl9zdG9wX3N0cmVhbSgpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoYW5kbGUtPnRlc3Rfb2JqLnpzbF9lbmFibGVkICAgPSBkaW0tPmlzWlNMOworICAgICAgICAgICAgICAgICAgICBoYW5kbGUtPnRlc3Rfb2JqLmJ1ZmZlcl93aWR0aCAgPSBkaW0tPndpZHRoOworICAgICAgICAgICAgICAgICAgICBoYW5kbGUtPnRlc3Rfb2JqLmJ1ZmZlcl9oZWlnaHQgPSBkaW0tPmhlaWdodDsKKworICAgICAgICAgICAgICAgICAgICByYyA9IG1tX2NhbWVyYV9saWJfc3RhcnRfc3RyZWFtKGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfc3RhcnRfc3RyZWFtKCkgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlLT50ZXN0X29iai56c2xfZW5hYmxlZCA9IGRpbS0+aXNaU0w7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0xJQl9SQVdfQ0FQVFVSRToKKworICAgICAgICAgICAgaWYgKCAwID09IGhhbmRsZS0+c3RyZWFtX3J1bm5pbmcgKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIFN0cmVhbWluZyBpcyBub3QgZW5hYmxlZCEiKTsKKyAgICAgICAgICAgICAgICByYyA9IE1NX0NBTUVSQV9FX0lOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmMgPSBtbV9jYW1lcmFfbGliX3N0b3Bfc3RyZWFtKGhhbmRsZSk7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fY2FtZXJhX2xpYl9zdG9wX3N0cmVhbSgpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aWR0aCA9IGhhbmRsZS0+dGVzdF9vYmouYnVmZmVyX3dpZHRoOworICAgICAgICAgICAgaGVpZ2h0ID0gaGFuZGxlLT50ZXN0X29iai5idWZmZXJfaGVpZ2h0OworICAgICAgICAgICAgaGFuZGxlLT50ZXN0X29iai5idWZmZXJfd2lkdGggPQorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpY2FtZXJhX2NhcC0+cmF3X2RpbVswXS53aWR0aDsKKyAgICAgICAgICAgIGhhbmRsZS0+dGVzdF9vYmouYnVmZmVyX2hlaWdodCA9CisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCljYW1lcmFfY2FwLT5yYXdfZGltWzBdLmhlaWdodDsKKyAgICAgICAgICAgIGhhbmRsZS0+dGVzdF9vYmouYnVmZmVyX2Zvcm1hdCA9IERFRkFVTFRfUkFXX0ZPUk1BVDsKKyAgICAgICAgICAgIExPR0UoIk1NX0NBTUVSQV9MSUJfUkFXX0NBUFRVUkUgJWR4JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9jYXAtPnJhd19kaW1bMF0ud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9jYXAtPnJhd19kaW1bMF0uaGVpZ2h0KTsKKyAgICAgICAgICAgIHJjID0gbW1fYXBwX3N0YXJ0X2NhcHR1cmVfcmF3KCZoYW5kbGUtPnRlc3Rfb2JqLCAxKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfc3RhcnRfY2FwdHVyZSgpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKworICAgICAgICAgICAgcmMgPSBtbV9hcHBfc3RvcF9jYXB0dXJlX3JhdygmaGFuZGxlLT50ZXN0X29iaik7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX3N0b3BfY2FwdHVyZSgpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYW5kbGUtPnRlc3Rfb2JqLmJ1ZmZlcl93aWR0aCA9IHdpZHRoOworICAgICAgICAgICAgaGFuZGxlLT50ZXN0X29iai5idWZmZXJfaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgaGFuZGxlLT50ZXN0X29iai5idWZmZXJfZm9ybWF0ID0gREVGQVVMVF9TTkFQU0hPVF9GT1JNQVQ7CisgICAgICAgICAgICByYyA9IG1tX2NhbWVyYV9saWJfc3RhcnRfc3RyZWFtKGhhbmRsZSk7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fY2FtZXJhX2xpYl9zdGFydF9zdHJlYW0oKSBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNTV9DQU1FUkFfTElCX0pQRUdfQ0FQVFVSRToKKyAgICAgICAgICAgIGlmICggMCA9PSBoYW5kbGUtPnN0cmVhbV9ydW5uaW5nICkgeworICAgICAgICAgICAgICAgIExPR0UoIiBTdHJlYW1pbmcgaXMgbm90IGVuYWJsZWQhIik7CisgICAgICAgICAgICAgICAgcmMgPSBNTV9DQU1FUkFfRV9JTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggTlVMTCAhPSBpbl9kYXRhICkgeworICAgICAgICAgICAgICAgIGRpbSA9ICggbW1fY2FtZXJhX2xpYl9zbmFwc2hvdF9wYXJhbXMgKiApIGluX2RhdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJjID0gdHVuZXNlcnZlcl9jYXB0dXJlKGhhbmRsZSwgZGltKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJjYXB0dXJlIGVycm9yICVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0xJQl9TRVRfRk9DVVNfTU9ERTogeworICAgICAgICAgICAgY2FtX2ZvY3VzX21vZGVfdHlwZSBtb2RlID0gKigoY2FtX2ZvY3VzX21vZGVfdHlwZSAqKWluX2RhdGEpOworICAgICAgICAgICAgaGFuZGxlLT5jdXJyZW50X3BhcmFtcy5hZl9tb2RlID0gbW9kZTsKKyAgICAgICAgICAgIHJjID0gc2V0Rm9jdXNNb2RlKCZoYW5kbGUtPnRlc3Rfb2JqLCBtb2RlKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgTE9HRSgiYXV0b2ZvY3VzIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIE1NX0NBTUVSQV9MSUJfRE9fQUY6CisgICAgICAgICAgICBpZiAoaGFuZGxlLT50ZXN0X29iai5mb2N1c19zdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgcmMgPSBoYW5kbGUtPnRlc3Rfb2JqLmNhbS0+b3BzLT5kb19hdXRvX2ZvY3VzKGhhbmRsZS0+dGVzdF9vYmouY2FtLT5jYW1lcmFfaGFuZGxlKTsKKyAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoImF1dG9mb2N1cyBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIC8qV2FpdGluZyBmb3IgQXV0byBGb2N1cyBEb25lIENhbGwgQmFjayovCisgICAgICAgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNTV9DQU1FUkFfTElCX0NBTkNFTF9BRjoKKyAgICAgICAgICAgIHJjID0gaGFuZGxlLT50ZXN0X29iai5jYW0tPm9wcy0+Y2FuY2VsX2F1dG9fZm9jdXMoaGFuZGxlLT50ZXN0X29iai5jYW0tPmNhbWVyYV9oYW5kbGUpOworICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoImF1dG9mb2N1cyBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIE1NX0NBTUVSQV9MSUJfTE9DS19BV0I6CisgICAgICAgICAgICByYyA9IHNldEF3YkxvY2soJmhhbmRsZS0+dGVzdF9vYmosIDEpOworICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIkFXQiBsb2NraW5nIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNTV9DQU1FUkFfTElCX1VOTE9DS19BV0I6CisgICAgICAgICAgICByYyA9IHNldEF3YkxvY2soJmhhbmRsZS0+dGVzdF9vYmosIDApOworICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIkFFIHVubG9ja2luZyBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0xJQl9MT0NLX0FFOgorICAgICAgICAgICAgcmMgPSBzZXRBZWNMb2NrKCZoYW5kbGUtPnRlc3Rfb2JqLCAxKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJBRSBsb2NraW5nIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNTV9DQU1FUkFfTElCX1VOTE9DS19BRToKKyAgICAgICAgICAgIHJjID0gc2V0QWVjTG9jaygmaGFuZGxlLT50ZXN0X29iaiwgMCk7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiQUUgdW5sb2NraW5nIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICBjYXNlIE1NX0NBTUVSQV9MSUJfU0VUXzNBX0NPTU1BTkQ6IHsKKyAgICAgICAgICByYyA9IHNldDNBY29tbWFuZCgmaGFuZGxlLT50ZXN0X29iaiwgKGNhbV9lenR1bmVfY21kX2RhdGFfdCAqKWluX2RhdGEpOworICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIjNBIHNldCBjb21tYW5kIGVycm9yXG4iKTsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgIGNhc2UgTU1fQ0FNRVJBX0xJQl9TRVRfQVVUT0ZPQ1VTX1RVTklORzogeworICAgICAgICAgICByYyA9IHNldEF1dG9Gb2N1c1R1bmluZygmaGFuZGxlLT50ZXN0X29iaiwgaW5fZGF0YSk7CisgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICBMT0dFKCJTZXQgQUYgdHVuaW5nIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICB9CisgICAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworICAgICAgIGNhc2UgTU1fQ0FNRVJBX0xJQl9TRVRfVkZFX0NPTU1BTkQ6IHsKKyAgICAgICAgICAgcmMgPSBzZXRWZmVDb21tYW5kKCZoYW5kbGUtPnRlc3Rfb2JqLCBpbl9kYXRhKTsKKyAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgIExPR0UoIlNldCB2ZmUgY29tbWFuZCBmYWlsZWRcbiIpOworICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgfQorICAgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKyAgICAgICBjYXNlIE1NX0NBTUVSQV9MSUJfU0VUX1BPU1RQUk9DX0NPTU1BTkQ6IHsKKyAgICAgICAgICAgcmMgPSBzZXRQUENvbW1hbmQoJmhhbmRsZS0+dGVzdF9vYmosIGluX2RhdGEpOworICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgTE9HRSgiU2V0IHBwIGNvbW1hbmQgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgIGNhc2UgTU1fQ0FNRVJBX0xJQl9XTlJfRU5BQkxFOiB7CisgICAgICAgICAgICByYyA9IHNldFdOUigmaGFuZGxlLT50ZXN0X29iaiwgKigodWludDhfdCAqKWluX2RhdGEpKTsKKyAgICAgICAgICAgIGlmICggcmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiU2V0IHduciBlbmFibGUgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgY2FzZSBNTV9DQU1FUkFfTElCX05PX0FDVElPTjoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH07CisKK0VYSVQ6CisKKyAgICByZXR1cm4gcmM7Cit9CitpbnQgbW1fY2FtZXJhX2xpYl9udW1iZXJfb2ZfY2FtZXJhcyhtbV9jYW1lcmFfbGliX2hhbmRsZSAqaGFuZGxlKQoreworICAgIGludCByYyA9IDA7CisKKyAgICBpZiAoIE5VTEwgPT0gaGFuZGxlICkgeworICAgICAgICBMT0dFKCIgSW52YWxpZCBoYW5kbGUiKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJjID0gaGFuZGxlLT5hcHBfY3R4Lm51bV9jYW1lcmFzOworCitFWElUOgorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fY2FtZXJhX2xpYl9jbG9zZShtbV9jYW1lcmFfbGliX2hhbmRsZSAqaGFuZGxlKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIGlmICggTlVMTCA9PSBoYW5kbGUgKSB7CisgICAgICAgIExPR0UoIiBJbnZhbGlkIGhhbmRsZSIpOworICAgICAgICByYyA9IE1NX0NBTUVSQV9FX0lOVkFMSURfSU5QVVQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICAvL3JjID0gbW1fYXBwX2Nsb3NlX2ZiKCZoYW5kbGUtPnRlc3Rfb2JqKTsKKyAgICByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZV9mYigpIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgcmMpOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmMgPSBtbV9hcHBfY2xvc2UoJmhhbmRsZS0+dGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICByYyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKK0VYSVQ6CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fY2FtZXJhX2xpYl9zZXRfcHJldmlld191c2VyY2IoCisgICBtbV9jYW1lcmFfbGliX2hhbmRsZSAqaGFuZGxlLCBjYW1fc3RyZWFtX3VzZXJfY2IgY2IpCit7CisgICAgaWYgKGhhbmRsZS0+dGVzdF9vYmoudXNlcl9wcmV2aWV3X2NiICE9IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiIGFscmVhZHkgc2V0IHByZXZpZXcgY2FsbGJhY2tzXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBoYW5kbGUtPnRlc3Rfb2JqLnVzZXJfcHJldmlld19jYiA9ICpjYjsKKyAgICByZXR1cm4gMDsKK30KKworaW50IG1tX2FwcF9zZXRfcHJldmlld19mcHNfcmFuZ2UobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtX2Zwc19yYW5nZV90ICpmcHNSYW5nZSkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgTE9HSCgicHJldmlldyBmcHMgcmFuZ2U6IG1pbj0lZiwgbWF4PSVmLiIsCisgICAgICAgICAgICBmcHNSYW5nZS0+bWluX2ZwcywgZnBzUmFuZ2UtPm1heF9mcHMpOworICAgIHJjID0gc2V0RlBTUmFuZ2UodGVzdF9vYmosICpmcHNSYW5nZSk7CisKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoImFkZF9wYXJtX2VudHJ5X3RvYmF0Y2ggZmFpbGVkICEhIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfc2V0X2ZhY2VfZGV0ZWN0aW9uKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwKKyAgICAgICAgY2FtX2ZkX3NldF9wYXJtX3QgKmZkX3NldF9wYXJtKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIGlmICh0ZXN0X29iaiA9PSBOVUxMIHx8IGZkX3NldF9wYXJtID09IE5VTEwpIHsKKyAgICAgICAgTE9HRSgiIGludmFsaWQgcGFyYW1zISIpOworICAgICAgICByZXR1cm4gTU1fQ0FNRVJBX0VfSU5WQUxJRF9JTlBVVDsKKyAgICB9CisKKyAgICBMT0dIKCJtb2RlID0gJWQsIG51bV9mZCA9ICVkIiwKKyAgICAgICAgICBmZF9zZXRfcGFybS0+ZmRfbW9kZSwgZmRfc2V0X3Bhcm0tPm51bV9mZCk7CisKKyAgICByYyA9IGluaXRCYXRjaFVwZGF0ZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJCYXRjaCBjYW1lcmEgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIGlmIChBRERfU0VUX1BBUkFNX0VOVFJZX1RPX0JBVENIKHRlc3Rfb2JqLT5wYXJtX2J1Zi5tZW1faW5mby5kYXRhLAorICAgICAgICBDQU1fSU5URl9QQVJNX0ZELCAqZmRfc2V0X3Bhcm0pKSB7CisgICAgICAgIExPR0UoIkZEIHBhcmFtZXRlciBub3QgYWRkZWQgdG8gYmF0Y2hcbiIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIEVSUk9SOworICAgIH0KKworICAgIHJjID0gY29tbWl0U2V0QmF0Y2godGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiQmF0Y2ggcGFyYW1ldGVycyBjb21taXQgZmFpbGVkXG4iKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKK0VSUk9SOgorICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF9zZXRfZmxhc2hfbW9kZShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgIGNhbV9mbGFzaF9tb2RlX3QgZmxhc2hNb2RlKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIGlmICh0ZXN0X29iaiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIiBpbnZhbGlkIHBhcmFtcyEiKTsKKyAgICAgICAgcmV0dXJuIE1NX0NBTUVSQV9FX0lOVkFMSURfSU5QVVQ7CisgICAgfQorCisgICAgTE9HSCgibW9kZSA9ICVkIiwgIChpbnQpZmxhc2hNb2RlKTsKKworICAgIHJjID0gaW5pdEJhdGNoVXBkYXRlKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIGNhbWVyYSBwYXJhbWV0ZXIgdXBkYXRlIGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgaWYgKEFERF9TRVRfUEFSQU1fRU5UUllfVE9fQkFUQ0godGVzdF9vYmotPnBhcm1fYnVmLm1lbV9pbmZvLmRhdGEsCisgICAgICAgIENBTV9JTlRGX1BBUk1fTEVEX01PREUsIGZsYXNoTW9kZSkpIHsKKyAgICAgICAgTE9HRSgiRmxhc2ggbW9kZSBwYXJhbWV0ZXIgbm90IGFkZGVkIHRvIGJhdGNoXG4iKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICB9CisKKyAgICByYyA9IGNvbW1pdFNldEJhdGNoKHRlc3Rfb2JqKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIkJhdGNoIHBhcmFtZXRlcnMgY29tbWl0IGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCitFUlJPUjoKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfc2V0X21ldGFkYXRhX3VzZXJjYihtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1fc3RyZWFtX3VzZXJfY2IgdXNlcmNiKQoreworICAgIGlmICh0ZXN0X29iaiA9PSBOVUxMIHx8IHVzZXJjYiA9PSBOVUxMKSB7CisgICAgICAgIExPR0UoIiBpbnZhbGlkIHBhcmFtcyEiKTsKKyAgICAgICAgcmV0dXJuIE1NX0NBTUVSQV9FX0lOVkFMSURfSU5QVVQ7CisgICAgfQorCisgICAgTE9HSCgiJXMsIHNldCB1c2VyIG1ldGFkYXRhIGNhbGxiYWNrLCBhZGRyOiAlcFxuIiwgIHVzZXJjYik7CisKKyAgICBpZiAodGVzdF9vYmotPnVzZXJfbWV0YWRhdGFfY2IgIT0gTlVMTCkgeworICAgICAgICBMT0dIKCIlcywgYWxyZWFkeSBzZXQgdXNlciBtZXRhZGF0YSBjYWxsYmFjayIpOworICAgIH0KKyAgICB0ZXN0X29iai0+dXNlcl9tZXRhZGF0YV9jYiA9IHVzZXJjYjsKKworICAgIHJldHVybiAwOworfQorCisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9zcmMvbW1fcWNhbWVyYV9jb21tYW5kcy5jIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX2NvbW1hbmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmYjdhOAotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9zcmMvbW1fcWNhbWVyYV9jb21tYW5kcy5jCkBAIC0wLDAgKzEsMjkxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxMywgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8vIFRvIHJlbW92ZQorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJtbV9xY2FtZXJhX2NvbW1hbmRzLmgiCisjaW5jbHVkZSAibW1fcWNhbWVyYV9kYmcuaCIKKworaW50IHR1bmVzZXJ2ZXJfaW5pdGlhbGl6ZV9wcmV2dHVuaW5ncCh2b2lkICogY3RybCwKKyAgaW50IHByX2NsaWVudF9zb2NrZXRfaWQsIGNhbV9kaW1lbnNpb25fdCBkaW1lbnNpb24sCisgIGNoYXIgKipzZW5kX2J1ZiwgdWludDMyX3QgKnNlbmRfbGVuKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgbW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUgPSAobW1fY2FtZXJhX2xpYl9oYW5kbGUgKikgY3RybDsKKyAgdHVuaW5nc2VydmVyX3QgKnRjdHJsID0gJmxpYl9oYW5kbGUtPnRzY3RybDsKKworICBMT0dEKCJFIik7CisgIGlmICh0Y3RybC0+dHVuaW5nX3BhcmFtcy5mdW5jX3RibC0+cHJldmNvbW1hbmRfcHJvY2VzcyA9PSBOVUxMKSB7CisgICAgICBMT0dFKCJwcmV2Y29tbWFuZF9wcm9jZXNzIGlzIE5VTEwiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJlc3VsdCA9IHRjdHJsLT50dW5pbmdfcGFyYW1zLmZ1bmNfdGJsLT5wcmV2Y29tbWFuZF9wcm9jZXNzKAorICAgICAgTlVMTCwgVFVORV9QUkVWQ01EX0lOSVQsICh2b2lkICopJnByX2NsaWVudF9zb2NrZXRfaWQsCisgICAgICBzZW5kX2J1Ziwgc2VuZF9sZW4pOworICByZXN1bHQgPSB0Y3RybC0+dHVuaW5nX3BhcmFtcy5mdW5jX3RibC0+cHJldmNvbW1hbmRfcHJvY2VzcygKKyAgICAgIE5VTEwsIFRVTkVfUFJFVkNNRF9TRVRESU0sICh2b2lkICopJmRpbWVuc2lvbiwKKyAgICAgIHNlbmRfYnVmLCBzZW5kX2xlbik7CisKKyAgbW1fY2FtZXJhX2xpYl9zZXRfcHJldmlld191c2VyY2IobGliX2hhbmRsZSwKKyAgICAgICh0Y3RybC0+dHVuaW5nX3BhcmFtcy5mdW5jX3RibC0+cHJldmZyYW1lX2NhbGxiYWNrKSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHR1bmVzZXJ2ZXJfZGVpbml0aWFsaXplX3ByZXZ0dW5pbmdwKHZvaWQgKiBjdHJsLAorICAgIGNoYXIgKipzZW5kX2J1ZiwgdWludDMyX3QgKnNlbmRfbGVuKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgdHVuaW5nc2VydmVyX3QgKnRjdHJsID0gKHR1bmluZ3NlcnZlcl90ICopIGN0cmw7CisKKyAgTE9HRCgiRSIpOworCisgIHJlc3VsdCA9IHRjdHJsLT50dW5pbmdfcGFyYW1zLmZ1bmNfdGJsLT5wcmV2Y29tbWFuZF9wcm9jZXNzKAorICAgICZ0Y3RybC0+cHJfcHJvdG8sIFRVTkVfUFJFVkNNRF9ERUlOSVQsIE5VTEwsIHNlbmRfYnVmLCBzZW5kX2xlbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHR1bmVzZXJ2ZXJfcHJldmlld19nZXRpbmZvKHZvaWQgKiBjdHJsLCBjaGFyICoqc2VuZF9idWYsIHVpbnQzMl90ICpzZW5kX2xlbikKK3sKKyAgaW50IHJlc3VsdCA9IDA7CisgIHR1bmluZ3NlcnZlcl90ICp0Y3RybCA9ICh0dW5pbmdzZXJ2ZXJfdCAqKSBjdHJsOworCisgIExPR0QoIkUiKTsKKyAgcmVzdWx0ID0gdGN0cmwtPnR1bmluZ19wYXJhbXMuZnVuY190YmwtPnByZXZjb21tYW5kX3Byb2Nlc3MoCisgICAgJnRjdHJsLT5wcl9wcm90bywgVFVORV9QUkVWQ01EX0dFVElORk8sIE5VTEwsIHNlbmRfYnVmLCBzZW5kX2xlbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHR1bmVzZXJ2ZXJfcHJldmlld19nZXRjaHVua3NpemUodm9pZCAqIGN0cmwsCisgIGNoYXIgKipzZW5kX2J1ZiwgdWludDMyX3QgKnNlbmRfbGVuKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgdHVuaW5nc2VydmVyX3QgKnRjdHJsID0gKHR1bmluZ3NlcnZlcl90ICopIGN0cmw7CisKKyAgTE9HRCgiRSIpOworICByZXN1bHQgPSB0Y3RybC0+dHVuaW5nX3BhcmFtcy5mdW5jX3RibC0+cHJldmNvbW1hbmRfcHJvY2VzcygKKyAgICAmdGN0cmwtPnByX3Byb3RvLCBUVU5FX1BSRVZDTURfR0VUQ0hVTktTSVpFLAorICAgICh2b2lkICopJnRjdHJsLT5wcl9wcm90by0+bmV3X2Nua19zaXplLCBzZW5kX2J1Ziwgc2VuZF9sZW4pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCB0dW5lc2VydmVyX3ByZXZpZXdfZ2V0ZnJhbWUodm9pZCAqIGN0cmwsCisgIGNoYXIgKipzZW5kX2J1ZiwgdWludDMyX3QgKnNlbmRfbGVuKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgdHVuaW5nc2VydmVyX3QgKnRjdHJsID0gKHR1bmluZ3NlcnZlcl90ICopIGN0cmw7CisKKyAgTE9HRCgiRSIpOworICByZXN1bHQgPSB0Y3RybC0+dHVuaW5nX3BhcmFtcy5mdW5jX3RibC0+cHJldmNvbW1hbmRfcHJvY2VzcygKKyAgICAmdGN0cmwtPnByX3Byb3RvLCBUVU5FX1BSRVZDTURfR0VURlJBTUUsIE5VTEwsIHNlbmRfYnVmLCBzZW5kX2xlbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHR1bmVzZXJ2ZXJfcHJldmlld191bnN1cHBvcnRlZCh2b2lkICogY3RybCwKKyAgY2hhciAqKnNlbmRfYnVmLCB1aW50MzJfdCAqc2VuZF9sZW4pCit7CisgIGludCByZXN1bHQgPSAwOworICB0dW5pbmdzZXJ2ZXJfdCAqdGN0cmwgPSAodHVuaW5nc2VydmVyX3QgKikgY3RybDsKKworICBMT0dEKCJFIik7CisgIHJlc3VsdCA9IHRjdHJsLT50dW5pbmdfcGFyYW1zLmZ1bmNfdGJsLT5wcmV2Y29tbWFuZF9wcm9jZXNzKAorICAgICZ0Y3RybC0+cHJfcHJvdG8sIFRVTkVfUFJFVkNNRF9VTlNVUFBPUlRFRCwgTlVMTCwgc2VuZF9idWYsIHNlbmRfbGVuKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgdHVuZXNlcnZlcl9pbml0aWFsaXplX3R1bmluZ3Aodm9pZCAqIGN0cmwsIGludCBjbGllbnRfc29ja2V0X2lkLAorICBjaGFyICpzZW5kX2J1ZiwgdWludDMyX3Qgc2VuZF9sZW4pCit7CisgIGludCByZXN1bHQgPSAwOworICBtbV9jYW1lcmFfbGliX2hhbmRsZSAqbGliX2hhbmRsZSA9IChtbV9jYW1lcmFfbGliX2hhbmRsZSAqKSBjdHJsOworICB0dW5pbmdzZXJ2ZXJfdCAqdGN0cmwgPSAmbGliX2hhbmRsZS0+dHNjdHJsOworCisgIExPR0QoIkUiKTsKKyAgcmVzdWx0ID0gdGN0cmwtPnR1bmluZ19wYXJhbXMuZnVuY190YmwtPmNvbW1hbmRfcHJvY2VzcygKKyAgICBsaWJfaGFuZGxlLCBUVU5FX0NNRF9JTklULCAmY2xpZW50X3NvY2tldF9pZCwgc2VuZF9idWYsIHNlbmRfbGVuKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgdHVuZXNlcnZlcl9kZWluaXRpYWxpemVfdHVuaW5ncCh2b2lkICogY3RybCwgaW50IGNsaWVudF9zb2NrZXRfaWQsCisgIGNoYXIgKnNlbmRfYnVmLCB1aW50MzJfdCBzZW5kX2xlbikKK3sKKyAgaW50IHJlc3VsdCA9IDA7CisgIHR1bmluZ3NlcnZlcl90ICp0Y3RybCA9ICh0dW5pbmdzZXJ2ZXJfdCAqKSBjdHJsOworCisgIExPR0QoIkUiKTsKKworICByZXN1bHQgPSB0Y3RybC0+dHVuaW5nX3BhcmFtcy5mdW5jX3RibC0+Y29tbWFuZF9wcm9jZXNzKAorICAgIE5VTEwsIFRVTkVfQ01EX0RFSU5JVCwgJmNsaWVudF9zb2NrZXRfaWQsIHNlbmRfYnVmLCBzZW5kX2xlbik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHR1bmVzZXJ2ZXJfcHJvY2Vzc19nZXRfbGlzdF9jbWQodm9pZCAqIGN0cmwsIHZvaWQgKnJlY3ZfY21kLAorICBjaGFyICpzZW5kX2J1ZiwgdWludDMyX3Qgc2VuZF9sZW4pCit7CisgIGludCByZXN1bHQgPSAwOworICB0dW5pbmdzZXJ2ZXJfdCAqdGN0cmwgPSAodHVuaW5nc2VydmVyX3QgKikgY3RybDsKKworICBMT0dEKCJFIik7CisgIHJlc3VsdCA9IHRjdHJsLT50dW5pbmdfcGFyYW1zLmZ1bmNfdGJsLT5jb21tYW5kX3Byb2Nlc3MoCisgICAgIHJlY3ZfY21kLCBUVU5FX0NNRF9HRVRfTElTVCwgTlVMTCwgc2VuZF9idWYsIHNlbmRfbGVuKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgdHVuZXNlcnZlcl9wcm9jZXNzX2dldF9wYXJhbXNfY21kKHZvaWQgKiBjdHJsLCB2b2lkICpyZWN2X2NtZCwKKyAgY2hhciAqc2VuZF9idWYsIHVpbnQzMl90IHNlbmRfbGVuKQoreworICBpbnQgcmVzdWx0ID0gMDsKKyAgdHVuaW5nc2VydmVyX3QgKnRjdHJsID0gKHR1bmluZ3NlcnZlcl90ICopIGN0cmw7CisKKyAgTE9HRCgiRSIpOworICByZXN1bHQgPSB0Y3RybC0+dHVuaW5nX3BhcmFtcy5mdW5jX3RibC0+Y29tbWFuZF9wcm9jZXNzCisgICAgKHJlY3ZfY21kLCBUVU5FX0NNRF9HRVRfUEFSQU1TLCBOVUxMLCBzZW5kX2J1Ziwgc2VuZF9sZW4pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCB0dW5lc2VydmVyX3Byb2Nlc3Nfc2V0X3BhcmFtc19jbWQodm9pZCAqIGN0cmwsIHZvaWQgKnJlY3ZfY21kLAorICBjaGFyICpzZW5kX2J1ZiwgdWludDMyX3Qgc2VuZF9sZW4pCit7CisgIGludCByZXN1bHQgPSAwOworICB0dW5pbmdzZXJ2ZXJfdCAqdGN0cmwgPSAodHVuaW5nc2VydmVyX3QgKikgY3RybDsKKworICBMT0dEKCJFIik7CisgIHJlc3VsdCA9IHRjdHJsLT50dW5pbmdfcGFyYW1zLmZ1bmNfdGJsLT5jb21tYW5kX3Byb2Nlc3MoCisgICAgIHJlY3ZfY21kLCBUVU5FX0NNRF9TRVRfUEFSQU1TLCBOVUxMLCBzZW5kX2J1Ziwgc2VuZF9sZW4pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCB0dW5lc2VydmVyX3Byb2Nlc3NfbWlzY19jbWQodm9pZCAqIGN0cmwsIHZvaWQgKnJlY3ZfY21kLAorICBjaGFyICpzZW5kX2J1ZiwgdWludDMyX3Qgc2VuZF9sZW4pCit7CisgIGludCByZXN1bHQgPSAwOworICB0dW5pbmdzZXJ2ZXJfdCAqdGN0cmwgPSAodHVuaW5nc2VydmVyX3QgKikgY3RybDsKKworICBMT0dEKCJFIik7CisgIHJlc3VsdCA9IHRjdHJsLT50dW5pbmdfcGFyYW1zLmZ1bmNfdGJsLT5jb21tYW5kX3Byb2Nlc3MoCisgICAgIHJlY3ZfY21kLCBUVU5FX0NNRF9NSVNDLCBOVUxMLCBzZW5kX2J1Ziwgc2VuZF9sZW4pOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKiB0dW5lc2VydmVyX2Nsb3NlX2NhbQorICogICAgQGxpYl9oYW5kbGU6IHRoZSBjYW1lcmEgaGFuZGxlIG9iamVjdAorICoKKyAqICBjbG9zZXMgdGhlIGNhbWVyYQorICoKKyAqICBSZXR1cm46ID49MCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICoqLworaW50IHR1bmVzZXJ2ZXJfY2xvc2VfY2FtKG1tX2NhbWVyYV9saWJfaGFuZGxlICpsaWJfaGFuZGxlKQoreworICBpbnQgcmVzdWx0ID0gMDsKKworICByZXN1bHQgPSBtbV9jYW1lcmFfbGliX2Nsb3NlKGxpYl9oYW5kbGUpOworICBpZiAocmVzdWx0IDwgMCkgeworICAgIHByaW50ZigiIENhbWVyYSBjbG9zZSBmYWlsZWRcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZigiQ2FtZXJhIGlzIGNsb3NlZCBcbiIpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisjaWYgMAorLyoqIHR1bmVzZXJ2ZXJfc3RhcnRfY2FtCisgKiAgICBAbGliX2hhbmRsZTogdGhlIGNhbWVyYSBoYW5kbGUgb2JqZWN0CisgKgorICogIHN0YXJ0cyB0aGUgY2FtZXJhCisgKgorICogIFJldHVybjogPj0wIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisgKiovCitzdGF0aWMgaW50IHR1bmVzZXJ2ZXJfc3RhcnRfY2FtKG1tX2NhbWVyYV9saWJfaGFuZGxlICpsaWJfaGFuZGxlKQoreworICBpbnQgcmVzdWx0ID0gMDsKKworICByZXN1bHQgPSBtbV9jYW1lcmFfbGliX3N0YXJ0X3N0cmVhbShsaWJfaGFuZGxlKTsKKyAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICBwcmludGYoIiBDYW1lcmEgc3RhcnQgZmFpbGVkXG4iKTsKKyAgICBnb3RvIGVycm9yMTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworZXJyb3IxOgorICBtbV9jYW1lcmFfbGliX2Nsb3NlKGxpYl9oYW5kbGUpOworICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKy8qKiB0dW5lc2VydmVyX3N0b3BfY2FtCisgKiAgICBAbGliX2hhbmRsZTogdGhlIGNhbWVyYSBoYW5kbGUgb2JqZWN0CisgKgorICogIHN0b3BzIHRoZSBjYW1lcmEKKyAqCisgKiAgUmV0dXJuOiA+PTAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqKi8KK2ludCB0dW5lc2VydmVyX3N0b3BfY2FtKG1tX2NhbWVyYV9saWJfaGFuZGxlICpsaWJfaGFuZGxlKQoreworICBpbnQgcmVzdWx0ID0gMDsKKworICByZXN1bHQgPSBtbV9jYW1lcmFfbGliX3N0b3Bfc3RyZWFtKGxpYl9oYW5kbGUpOworICBpZiAocmVzdWx0IDwgMCkgeworICAgIHByaW50ZigiIENhbWVyYSBzdG9wIGZhaWxlZFxuIik7CisgIH0KKy8vICByZXN1bHQgPSBtbV9jYW1lcmFfbGliX2Nsb3NlKGxpYl9oYW5kbGUpOworICByZXR1cm4gcmVzdWx0OworfQorCisvKiogdHVuZXNlcnZlcl9vcGVuX2NhbQorICogICAgQGxpYl9oYW5kbGU6IHRoZSBjYW1lcmEgaGFuZGxlIG9iamVjdAorICoKKyAqICBvcGVucyB0aGUgY2FtZXJhCisgKgorICogIFJldHVybjogPj0wIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisgKiovCisjaWYgMQoraW50IHR1bmVzZXJ2ZXJfb3Blbl9jYW0obW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUpCit7CisgIGludCByZXN1bHQgPSAwOworCisgIExPR0QoIkUiKTsKKyAgcmVzdWx0ID0gbW1fY2FtZXJhX2xvYWRfdHVuaW5nbGlicmFyeSgmbGliX2hhbmRsZS0+dHNjdHJsLnR1bmluZ19wYXJhbXMpOworICBpZiAocmVzdWx0IDwgMCkgeworICAgIExPR0UoIiB0dW5pbmcgbGlicmFyeSBvcGVuIGZhaWxlZFxuIik7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX2R1YWxfdGVzdC5jIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX2R1YWxfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NGM0NzQKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfZHVhbF90ZXN0LmMKQEAgLTAsMCArMSwxOTMzIEBACisvKgorQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKK0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKK0JFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCitTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKK0JVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKK09SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KK0lGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX3FjYW1lcmFfdW5pdF90ZXN0LmgiCisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorCisjZGVmaW5lIE1NX1FDQU1FUkFfQVBQX1VURVNUX01BWF9NQUlOX0xPT1AgNAorI2RlZmluZSBNTV9RQ0FNX0FQUF9URVNUX05VTSAxMjgKKworI2RlZmluZSBNTV9RQ0FNRVJBX0FQUF9XQUlUX1RJTUUgMTAwMDAwMDAwMAorCitleHRlcm4gaW50IHN5c3RlbV9kaW1lbnNpb25fc2V0KGludCBjYW1faWQpOworZXh0ZXJuIGludCBzdG9wUHJldmlldyhpbnQgY2FtX2lkKTsKK2V4dGVybiBpbnQgdGFrZVBpY3R1cmVfeXV2KGludCBjYW1faWQpOworZXh0ZXJuIGludCB0YWtlUGljdHVyZV9yZGkoaW50IGNhbV9pZCk7CitleHRlcm4gaW50IHN0YXJ0UmRpKGludCBjYW1faWQpOworZXh0ZXJuIGludCBzdG9wUmRpKGludCBjYW1faWQpOworZXh0ZXJuIGludCBzdGFydFN0YXRzKGludCBjYW1faWQpOworZXh0ZXJuIGludCBzdG9wU3RhdHMoaW50IGNhbV9pZCk7CisKKworLyoKKyogMS4gb3BlbiBiYWNrCisqIDIuIG9wZW4gZnJvbnQKKyogMy4gc3RhcnQgYmFjaworKiA0LiBzdGFydCBmcm9udAorKiA1LiBzdG9wIGJhY2sKKyogNi4gc3RvcCBmcm9udAorKiA3LiBjbG9zZSBiYWNrCisqIDguIGNsb3NlIGZyb250CisqIDkuIHRha2UgcGljdHVyZQorKiBhLiBzdGFydCByZWNvcmRpbmcKKyogYi4gc3RvcCByZWNvcmRpbmcKKyogYy4gdGFrZSBwaWN0dXJlIHJkaQorKi8KK3N0YXRpYyBtbV9hcHBfdGNfdCBtbV9hcHBfdGNbTU1fUUNBTV9BUFBfVEVTVF9OVU1dOworc3RhdGljIGludCBudW1fdGVzdF9jYXNlcyA9IDA7CitzdHJ1Y3QgdGVzdF9jYXNlX3BhcmFtcyB7CisgIHVpbnQxNl90IGxhdW5jaDsKKyAgdWludDE2X3QgcHJldmlldzsKKyAgdWludDE2X3QgcmVjb3JkaW5nOworICB1aW50MTZfdCBzbmFwc2hvdDsKK307CisKKy8qICBUZXN0IGNhc2UgMTI0MzY4NTcgOiovCisKK2ludCBtbV9hcHBfZHRjXzAobW1fY2FtZXJhX2FwcF90ICpjYW1fYXBwcykKK3sKKyAgICAgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgICAgICBpbnQgaSxqOworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgaW50IGZyb250X2NhbWVyYSA9IDE7CisgICAgICAgIGludCBiYWNrX2NhbWVyYSA9IDA7CisKKyAgICAgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgUHJldmlldyBvbiBiYWNrIENhbWVyYSBhbmQgUkRJIG9uIEZyb250IGNhbWVyYSAwLi4uXG4iKTsKKyAgICAgICAgTE9HRSgiRFVBTCBvcGVuIGJhY2sgY2FtZXJhIFxuIik7CisgICAgICAgIGlmKG1tX2FwcF9vcGVuKGJhY2tfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGJhY2sgY2FtZXJhIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYoc3lzdGVtX2RpbWVuc2lvbl9zZXQoYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSyl7CisgICAgICAgICAgICAgICAgTE9HRSgic3lzdGVtX2RpbWVuc2lvbl9zZXQoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgTE9HRSgiRFVBTCBvcGVuIGZyb250IGNhbWVyYSBcbiIpOworICAgICAgICBpZihtbV9hcHBfb3Blbihmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgZnJvbnQgY2FtZXJhIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSyl7CisgICAgICAgICAgICAgICAgTE9HRSgic3lzdGVtX2RpbWVuc2lvbl9zZXQoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBjYW1lcmEgUmRpIGZvciBmcm9udCBcbiIpOworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UmRpKGZyb250X2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICBMT0dFKCIgYmFjayBjYW1lcmEgc3RhcnRQcmV2aWV3KCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICBzbGVlcCgxKTsKKworICAgICAgICBMT0dFKCJEVUFMIHN0YXJ0IGNhbWVyYSBQcmV2aWV3IGZvciBiYWNrIFxuIik7CisgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RhcnRQcmV2aWV3KGJhY2tfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIgc3RhcnRQcmV2aWV3KCkgYmFja2NhbWVyYSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgIHNsZWVwKDEpOworCisgICAgICAgIExPR0UoIkRVQUwgc3RvcCBjYW1lcmEgUmRpIGZvciBmcm9udCBcbiIpOworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0b3BSZGkoZnJvbnRfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIgc3RhcnRQcmV2aWV3KCkgYmFja2NhbWVyYSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKDEwKjEwMDApOworCisgICAgICAgIExPR0UoIkRVQUwgY2xvc2UgZnJvbnQgY2FtZXJhXG4iKTsKKyAgICAgICAgaWYoIG1tX2FwcF9jbG9zZShmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZSgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIExPR0UoIkRVQUwgc3RvcCBjYW1lcmEgUHJldmlldyBmb3IgYmFjayBcbiIpOworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0b3BQcmV2aWV3KGJhY2tfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dEKCIgc3RhcnRQcmV2aWV3KCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIHVzbGVlcCgxMCoxMDAwKTsKKyAgICAgICAgTE9HRSgiRFVBTCBjbG9zZSBiYWNrIGNhbWVyYSBcbiIpOworICAgICAgICBpZiggbW1fYXBwX2Nsb3NlKGJhY2tfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfY2xvc2UoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIExPR0UoIkRVQUwgZW5kIFxuIik7CisKK2VuZDoKKyAgICAgICAgaWYocmMgPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiXG5QYXNzZWRcbiIpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuRmFpbGVkXG4iKTsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJFTkQsIHJjID0gJWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiByYzsKK30KKworLyogIFRlc3QgY2FzZSAxMjQzNjU4NyA6Ki8KKworaW50IG1tX2FwcF9kdGNfMShtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHBzKQoreworICAgICAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgICAgIGludCBpLGo7CisgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBpbnQgZnJvbnRfY2FtZXJhID0gMTsKKyAgICAgICAgaW50IGJhY2tfY2FtZXJhID0gMDsKKworICAgICAgICBwcmludGYoIlxuIFZlcmlmeWluZyBQcmV2aWV3IG9uIGJhY2sgQ2FtZXJhIGFuZCBSREkgb24gRnJvbnQgY2FtZXJhIDEuLi5cbiIpOworICAgICAgICBMT0dFKCJEVUFMIG9wZW4gYmFjayBjYW1lcmEgXG4iKTsKKyAgICAgICAgaWYobW1fYXBwX29wZW4oYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgYmFjayBjYW1lcmEgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBMT0dFKCJEVUFMIG9wZW4gZnJvbnQgY2FtZXJhIFxuIik7CisgICAgICAgIGlmKG1tX2FwcF9vcGVuKGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX29wZW4oKSBmcm9udCBjYW1lcmEgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHN5c3RlbV9kaW1lbnNpb25fc2V0KGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBMT0dFKCJEVUFMIHN0YXJ0IGNhbWVyYSBSZGkgZm9yIGZyb250IFxuIik7CisgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RhcnRSZGkoZnJvbnRfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgIExPR0UoIiBiYWNrIGNhbWVyYSBzdGFydFByZXZpZXcoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgIHNsZWVwKDEpOworCisgICAgICAgIExPR0UoIkRVQUwgc3RhcnQgY2FtZXJhIFByZXZpZXcgZm9yIGJhY2sgXG4iKTsKKworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UHJldmlldyhiYWNrX2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIHN0YXJ0UHJldmlldygpIGJhY2tjYW1lcmEgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgTE9HRSgiRFVBTCBlbmQgXG4iKTsKKworICAgICAgICBMT0dFKCJEVUFMIHN0b3AgY2FtZXJhIFByZXZpZXcgZm9yIGZyb250IFxuIik7CisgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RvcFJkaShmcm9udF9jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBzdGFydFByZXZpZXcoKSBiYWNrY2FtZXJhIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoMTAqMTAwMCk7CisgICAgICAgIExPR0UoIkRVQUwgc3RvcCBjYW1lcmEgUHJldmlldyBmb3IgYmFjayBcbiIpOworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0b3BQcmV2aWV3KGJhY2tfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dEKCIgc3RhcnRQcmV2aWV3KCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIHVzbGVlcCgxMCoxMDAwKTsKKyAgICAgICAgTE9HRSgiRFVBTCBjbG9zZSBmcm9udCBjYW1lcmFcbiIpOworICAgICAgICBpZiggbW1fYXBwX2Nsb3NlKGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBMT0dFKCJEVUFMIGNsb3NlIGJhY2sgY2FtZXJhIFxuIik7CisgICAgICAgIGlmKCBtbV9hcHBfY2xvc2UoYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZSgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworZW5kOgorICAgICAgICBpZihyYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblBhc3NlZFxuIik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHByaW50ZigiXG5GYWlsZWRcbiIpOworICAgICAgICB9CisgICAgICAgIExPR0QoIkVORCwgcmMgPSAlZFxuIiwgIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworfQorCisvKiAgVGVzdCBjYXNlIDEyNDM2NTc4IDoqLworCitpbnQgbW1fYXBwX2R0Y18yKG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcHMpCit7CisgICAgICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICAgICAgaW50IGksajsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgIGludCBmcm9udF9jYW1lcmEgPSAxOworICAgICAgICBpbnQgYmFja19jYW1lcmEgPSAwOworCisgICAgICAgIHByaW50ZigiXG4gVmVyaWZ5aW5nIFByZXZpZXcgb24gYmFjayBDYW1lcmEgYW5kIFJESSBvbiBGcm9udCBjYW1lcmEgMi4uLlxuIik7CisgICAgICAgIExPR0UoIkRVQUwgb3BlbiBiYWNrIGNhbWVyYSBcbiIpOworICAgICAgICBpZihtbV9hcHBfb3BlbihiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX29wZW4oKSBiYWNrIGNhbWVyYSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIGlmKHN5c3RlbV9kaW1lbnNpb25fc2V0KGJhY2tfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0speworICAgICAgICAgICAgICAgIExPR0UoInN5c3RlbV9kaW1lbnNpb25fc2V0KCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIExPR0UoIkRVQUwgb3BlbiBmcm9udCBjYW1lcmEgXG4iKTsKKyAgICAgICAgaWYobW1fYXBwX29wZW4oZnJvbnRfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGZyb250IGNhbWVyYSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgaWYoc3lzdGVtX2RpbWVuc2lvbl9zZXQoZnJvbnRfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0speworICAgICAgICAgICAgICAgIExPR0UoInN5c3RlbV9kaW1lbnNpb25fc2V0KCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIExPR0UoIkRVQUwgc3RhcnQgY2FtZXJhIFJkaSBmb3IgZnJvbnQgXG4iKTsKKyAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdGFydFJkaShmcm9udF9jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgTE9HRSgiIGJhY2sgY2FtZXJhIHN0YXJ0UHJldmlldygpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKyAgICAgICAgc2xlZXAoMSk7CisKKyAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBjYW1lcmEgUHJldmlldyBmb3IgYmFjayBcbiIpOworCisgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RhcnRQcmV2aWV3KGJhY2tfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIgc3RhcnRQcmV2aWV3KCkgYmFja2NhbWVyYSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgIHNsZWVwKDEpOworICAgICAgICBMT0dFKCJEVUFMIGVuZCBcbiIpOworCisgICAgICAgIExPR0UoIkRVQUwgc3RvcCBjYW1lcmEgUHJldmlldyBmb3IgZnJvbnQgXG4iKTsKKyAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdG9wUmRpKGZyb250X2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIHN0YXJ0UHJldmlldygpIGJhY2tjYW1lcmEgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIHVzbGVlcCgxMCoxMDAwKTsKKyAgICAgICAgTE9HRSgiRFVBTCBzdG9wIGNhbWVyYSBQcmV2aWV3IGZvciBiYWNrIFxuIik7CisgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RvcFByZXZpZXcoYmFja19jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgIExPR0QoIiBzdGFydFByZXZpZXcoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKDEwKjEwMDApOworICAgICAgICBMT0dFKCJEVUFMIGNsb3NlIGJhY2sgY2FtZXJhIFxuIik7CisgICAgICAgIGlmKCBtbV9hcHBfY2xvc2UoYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZSgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgTE9HRSgiRFVBTCBjbG9zZSBmcm9udCBjYW1lcmFcbiIpOworICAgICAgICBpZiggbW1fYXBwX2Nsb3NlKGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCitlbmQ6CisgICAgICAgIGlmKHJjID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgICAgIH0KKyAgICAgICAgTE9HRCgiRU5ELCByYyA9ICVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gcmM7Cit9CisKKy8qICBUZXN0IGNhc2UgMjQxMzk1NzY4IDogMTM1NyAqIDMsIFRoaXMgaXMgcGVyZm9ybWVkIHRocmVlIHRpbWVzCisqIEFuZCBmb3IgZWFjaCBpdGVyYXRpb24gOSBpcyBwZXJmb3JtZWQgdGhyaWNlICovCisKK2ludCBtbV9hcHBfZHRjXzMobW1fY2FtZXJhX2FwcF90ICpjYW1fYXBwcykKK3sKKyAgICAgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgICAgICBpbnQgaSxqLGs7CisgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBpbnQgZnJvbnRfY2FtZXJhID0gMTsKKyAgICAgICAgaW50IGJhY2tfY2FtZXJhID0gMDsKKworICAgICAgICBwcmludGYoIlxuIFZlcmlmeWluZyBQcmV2aWV3IGFuZCBzbmFwc2hvdCBvbiBiYWNrIENhbWVyYSBhbmQgUkRJIG9uIEZyb250IGNhbWVyYSAzLi4uXG4iKTsKKyAgICAgICAgTE9HRSgiRFVBTCBvcGVuIGZyb250IGNhbWVyYSBcbiIpOworICAgICAgICBpZihtbV9hcHBfb3Blbihmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgZnJvbnQgY2FtZXJhIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYoc3lzdGVtX2RpbWVuc2lvbl9zZXQoZnJvbnRfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0speworICAgICAgICAgICAgICAgIExPR0UoInN5c3RlbV9kaW1lbnNpb25fc2V0KCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIExPR0UoIkRVQUwgc3RhcnQgY2FtZXJhIFByZXZpZXcgZm9yIGZyb250IFxuIik7CisKKyAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdGFydFJkaShmcm9udF9jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBzdGFydFByZXZpZXcoKSBmcm9udGNhbWVyYSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgIHVzbGVlcCgxMCoxMDAwKTsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTU1fUUNBTUVSQV9BUFBfSU5URVJBVElPTiA7IGsrKykgeworICAgICAgICAgIExPR0UoIkRVQUwgb3BlbiBiYWNrIGNhbWVyYSAlZCBcbiIsayk7CisgICAgICAgICAgaWYobW1fYXBwX29wZW4oYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX29wZW4oKSBiYWNrIGNhbWVyYSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgICAgICAgICAgIExPR0UoInN5c3RlbV9kaW1lbnNpb25fc2V0KCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBjYW1lcmEgUHJldmlldyBmb3IgYmFjayBcbiIpOworICAgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RhcnRQcmV2aWV3KGJhY2tfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICAgTE9HRSgiIGJhY2sgY2FtZXJhIHN0YXJ0UHJldmlldygpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBNTV9RQ0FNRVJBX0FQUF9JTlRFUkFUSU9OOyBqKyspIHsKKyAgICAgICAgICAgICAgTE9HRSgiRFVBTCB0YWtlIHBpY3R1cmUgZm9yIGJhY2sgXG4iKTsKKyAgICAgICAgICAgICAgaWYgKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gdGFrZVBpY3R1cmVfeXV2KGJhY2tfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICAgIExPR0UoIiBUYWtlUGljdHVyZSgpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworCisgICAgICAgICAgfQorICAgICAgICAgIHVzbGVlcCgxMCoxMDAwKTsKKyAgICAgICAgICBMT0dFKCJEVUFMIHN0b3AgY2FtZXJhIFByZXZpZXcgZm9yIGJhY2sgXG4iKTsKKyAgICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0b3BQcmV2aWV3KGJhY2tfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICAgIExPR0UoIiBzdG9wUHJldmlldygpIGJhY2tjYW1lcmEgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgfQorICAgICAgICAgIHVzbGVlcCgxMCoxMDAwKTsKKworICAgICAgICAgIExPR0UoIkRVQUwgY2xvc2UgYmFjayBjYW1lcmFcbiIpOworICAgICAgICAgIGlmKCBtbV9hcHBfY2xvc2UoYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgfQorICAgICAgICAgIHVzbGVlcCgyMCoxMDAwKTsKKyAgICAgICAgfQorICAgICAgICBMT0dFKCJEVUFMIHN0b3AgY2FtZXJhIFByZXZpZXcgZm9yIFJkaSBcbiIpOworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0b3BSZGkoZnJvbnRfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dEKCIgc3RvcFJkaSgpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoMTAqMTAwMCk7CisgICAgICAgIExPR0UoIkRVQUwgY2xvc2UgZnJvbnQgY2FtZXJhIFxuIik7CisgICAgICAgIGlmKCBtbV9hcHBfY2xvc2UoZnJvbnRfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfY2xvc2UoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIExPR0UoIkRVQUwgZW5kIFxuIik7CisKK2VuZDoKKyAgICAgICAgaWYocmMgPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiXG5QYXNzZWRcbiIpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuRmFpbGVkXG4iKTsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJFTkQsIHJjID0gJWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiByYzsKK30KKworLyogIFRlc3QgY2FzZSAyNDEzYWI1NzY4IDogMTM1NyAqIDMsIFRoaXMgaXMgcGVyZm9ybWVkIHRocmVlIHRpbWVzCisqIEFuZCBmb3IgZWFjaCBpdGVyYXRpb24gYWIgaXMgcGVyZm9ybWVkIHRocmljZSAqLworCitpbnQgbW1fYXBwX2R0Y180KG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcHMpCit7CisgICAgICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICAgICAgaW50IGksaixrOworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgaW50IGZyb250X2NhbWVyYSA9IDE7CisgICAgICAgIGludCBiYWNrX2NhbWVyYSA9IDA7CisKKyAgICAgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgUHJldmlldyBvbiBiYWNrIENhbWVyYSBhbmQgUkRJIG9uIEZyb250IGNhbWVyYSA0Li4uXG4iKTsKKyAgICAgICAgTE9HRSgiRFVBTCBvcGVuIGZyb250IGNhbWVyYSBcbiIpOworICAgICAgICBpZihtbV9hcHBfb3Blbihmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgZnJvbnQgY2FtZXJhIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYoc3lzdGVtX2RpbWVuc2lvbl9zZXQoZnJvbnRfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0speworICAgICAgICAgICAgICAgIExPR0UoInN5c3RlbV9kaW1lbnNpb25fc2V0KCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIExPR0UoIkRVQUwgc3RhcnQgY2FtZXJhIFByZXZpZXcgZm9yIGZyb250IFxuIik7CisKKyAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdGFydFJkaShmcm9udF9jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBzdGFydFByZXZpZXcoKSBmcm9udGNhbWVyYSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgIHVzbGVlcCgyMCoxMDAwKTsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTU1fUUNBTUVSQV9BUFBfSU5URVJBVElPTiA7IGsrKyl7CisgICAgICAgICAgTE9HRSgiRFVBTCBvcGVuIGJhY2sgY2FtZXJhICVkIFxuIixrKTsKKyAgICAgICAgICBpZihtbV9hcHBfb3BlbihiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgYmFjayBjYW1lcmEgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmKHN5c3RlbV9kaW1lbnNpb25fc2V0KGJhY2tfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0speworICAgICAgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBMT0dFKCJEVUFMIHN0YXJ0IGNhbWVyYSBQcmV2aWV3IGZvciBiYWNrIFxuIik7CisgICAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdGFydFByZXZpZXcoYmFja19jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBiYWNrIGNhbWVyYSBzdGFydFByZXZpZXcoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKyAgICAgICAgICB1c2xlZXAoMzAqMTAwMCk7CisKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTU1fUUNBTUVSQV9BUFBfSU5URVJBVElPTjsgaisrKSB7CisgICAgICAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBjYW1lcmEgcmVjb3JkIGZvciBiYWNrIFxuIik7CisgICAgICAgICAgICAgaWYgKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RhcnRSZWNvcmRpbmcoYmFja19jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgICBMT0dFKCIgU3RhcnRWaWRlb3JlY29yZGluZygpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgICAgICAgdXNsZWVwKDE1KjEwMDApOworICAgICAgICAgICAgIExPR0UoIkRVQUwgc3RvcCBjYW1lcmEgcmVjb3JkIGZvciBiYWNrIFxuIik7CisgICAgICAgICAgICAgaWYgKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RvcFJlY29yZGluZyhiYWNrX2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgIExPR0UoIiBTdG9wdmlkZW9yZWNvcmRpbmcoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgdXNsZWVwKDEwKjEwMDApOworCisgICAgICAgICAgTE9HRSgiRFVBTCBzdG9wIGNhbWVyYSBQcmV2aWV3IGZvciBiYWNrIFxuIik7CisgICAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdG9wUHJldmlldyhiYWNrX2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgIExPR0UoIiBzdG9wUHJldmlldygpIGJhY2tjYW1lcmEgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisgICAgICAgICAgdXNsZWVwKDEwKjEwMDApOworCisgICAgICAgICAgTE9HRSgiRFVBTCBjbG9zZSBiYWNrIGNhbWVyYVxuIik7CisgICAgICAgICAgaWYoIG1tX2FwcF9jbG9zZShiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZSgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisgICAgICAgICAgdXNsZWVwKDIwKjEwMDApOworICAgICAgICB9CisgICAgICAgIExPR0UoIkRVQUwgc3RvcCBjYW1lcmEgUHJldmlldyBmb3IgUmRpIFxuIik7CisgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RvcFJkaShmcm9udF9jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgIExPR0QoIiBzdG9wUmRpKCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIHVzbGVlcCgxMCoxMDAwKTsKKyAgICAgICAgTE9HRSgiRFVBTCBjbG9zZSBmcm9udCBjYW1lcmEgXG4iKTsKKyAgICAgICAgaWYoIG1tX2FwcF9jbG9zZShmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZSgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgTE9HRSgiRFVBTCBlbmQgXG4iKTsKKworZW5kOgorICAgICAgICBpZihyYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblBhc3NlZFxuIik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHByaW50ZigiXG5GYWlsZWRcbiIpOworICAgICAgICB9CisgICAgICAgIExPR0QoIkVORCwgcmMgPSAlZFxuIiwgIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworfQorCisvKiAgVGVzdCBjYXNlIDI0MTM1NzY4IDogMTM1NyAqIDMsIFRoaXMgaXMgcGVyZm9ybWVkIHRocmVlIHRpbWVzKi8KKworaW50IG1tX2FwcF9kdGNfNShtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHBzKQoreworICAgICAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgICAgIGludCBpLGosazsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgIGludCBmcm9udF9jYW1lcmEgPSAxOworICAgICAgICBpbnQgYmFja19jYW1lcmEgPSAwOworCisgICAgICAgIHByaW50ZigiXG4gVmVyaWZ5aW5nIFByZXZpZXcgb24gYmFjayBDYW1lcmEgYW5kIFJESSBvbiBGcm9udCBjYW1lcmEgNS4uLlxuIik7CisgICAgICAgIExPR0UoIkRVQUwgb3BlbiBmcm9udCBjYW1lcmEgXG4iKTsKKyAgICAgICAgaWYobW1fYXBwX29wZW4oZnJvbnRfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGZyb250IGNhbWVyYSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIGlmKHN5c3RlbV9kaW1lbnNpb25fc2V0KGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBMT0dFKCJEVUFMIHN0YXJ0IGNhbWVyYSBQcmV2aWV3IGZvciBmcm9udCBcbiIpOworCisgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RhcnRSZGkoZnJvbnRfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIgc3RhcnRQcmV2aWV3KCkgZnJvbnRjYW1lcmEgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICBzbGVlcCgxKTsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNCA7IGsrKykgeworICAgICAgICAgIExPR0UoIkRVQUwgb3BlbiBiYWNrIGNhbWVyYSAlZCBcbiIsayk7CisgICAgICAgICAgaWYobW1fYXBwX29wZW4oYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX29wZW4oKSBiYWNrIGNhbWVyYSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgICAgICAgICAgIExPR0UoInN5c3RlbV9kaW1lbnNpb25fc2V0KCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBjYW1lcmEgUHJldmlldyBmb3IgYmFjayBcbiIpOworICAgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RhcnRQcmV2aWV3KGJhY2tfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICAgTE9HRSgiIGJhY2sgY2FtZXJhIHN0YXJ0UHJldmlldygpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKyAgICAgICAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKyAgICAgICAgICBzbGVlcCgxKTsKKworICAgICAgICAgIExPR0UoIkRVQUwgc3RvcCBjYW1lcmEgUHJldmlldyBmb3IgYmFjayBcbiIpOworICAgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RvcFByZXZpZXcoYmFja19jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgICAgTE9HRSgiIHN0b3BQcmV2aWV3KCkgYmFja2NhbWVyYSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisgICAgICAgICAgdXNsZWVwKDEwKjEwMDApOworCisgICAgICAgICAgTE9HRSgiRFVBTCBjbG9zZSBiYWNrIGNhbWVyYVxuIik7CisgICAgICAgICAgaWYoIG1tX2FwcF9jbG9zZShiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfY2xvc2UoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisgICAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIH0KKyAgICAgICAgTE9HRSgiRFVBTCBzdG9wIGNhbWVyYSBQcmV2aWV3IGZvciBSZGkgXG4iKTsKKyAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdG9wUmRpKGZyb250X2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgTE9HRCgiIHN0b3BSZGkoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKDEwKjEwMDApOworICAgICAgICBMT0dFKCJEVUFMIGNsb3NlIGZyb250IGNhbWVyYSBcbiIpOworICAgICAgICBpZiggbW1fYXBwX2Nsb3NlKGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBMT0dFKCJEVUFMIGVuZCBcbiIpOworCitlbmQ6CisgICAgICAgIGlmKHJjID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgICAgIH0KKyAgICAgICAgTE9HRCgiRU5ELCByYyA9ICVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gcmM7Cit9CisKKy8qICBUZXN0IGNhc2UgMTMyNDY4NTcgOiAyNDY4ICogMywgVGhpcyBpcyBwZXJmb3JtZWQgdGhyZWUgdGltZXMqLworCitpbnQgbW1fYXBwX2R0Y182KG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcHMpCit7CisgICAgICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICAgICAgaW50IGksaixrOworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgaW50IGZyb250X2NhbWVyYSA9IDE7CisgICAgICAgIGludCBiYWNrX2NhbWVyYSA9IDA7CisKKyAgICAgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgUHJldmlldyBvbiBiYWNrIENhbWVyYSBhbmQgUkRJIG9uIEZyb250IGNhbWVyYSA2Li4uXG4iKTsKKyAgICAgICAgTE9HRSgiRFVBTCBvcGVuIGJhY2sgY2FtZXJhIFxuIik7CisgICAgICAgIGlmKG1tX2FwcF9vcGVuKGJhY2tfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGJhY2sgY2FtZXJhIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYoc3lzdGVtX2RpbWVuc2lvbl9zZXQoYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSyl7CisgICAgICAgICAgICAgICAgTE9HRSgic3lzdGVtX2RpbWVuc2lvbl9zZXQoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBjYW1lcmEgUHJldmlldyBmb3IgYmFjayBcbiIpOworCisgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RhcnRQcmV2aWV3KGJhY2tfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIgc3RhcnRQcmV2aWV3KCkgYmFja2NhbWVyYSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgIHNsZWVwKDEpOworCisgICAgICAgIGZvciAoayA9IDA7IGsgPCA0IDsgaysrKSB7CisgICAgICAgIExPR0UoIkRVQUwgb3BlbiBmcm9udCBjYW1lcmEgJWQgXG4iLGspOworICAgICAgICBpZihtbV9hcHBfb3Blbihmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgZnJvbnQgY2FtZXJhIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSyl7CisgICAgICAgICAgICAgICAgTE9HRSgic3lzdGVtX2RpbWVuc2lvbl9zZXQoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBjYW1lcmEgUmRpIGZvciBmcm9udCBcbiIpOworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UmRpKGZyb250X2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICBMT0dFKCIgYmFjayBjYW1lcmEgc3RhcnRQcmV2aWV3KCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICBzbGVlcCgxKTsKKworICAgICAgICBMT0dFKCJEVUFMIHN0b3AgY2FtZXJhIFByZXZpZXcgZm9yIGZyb250IFxuIik7CisgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RvcFJkaShmcm9udF9jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBzdGFydFByZXZpZXcoKSBiYWNrY2FtZXJhIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoMTAqMTAwMCk7CisKKyAgICAgICAgTE9HRSgiRFVBTCBjbG9zZSBmcm9udCBjYW1lcmFcbiIpOworICAgICAgICBpZiggbW1fYXBwX2Nsb3NlKGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgfQorICAgICAgICBMT0dFKCJEVUFMIHN0b3AgY2FtZXJhIFByZXZpZXcgZm9yIGJhY2sgXG4iKTsKKyAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdG9wUHJldmlldyhiYWNrX2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgTE9HRCgiIHN0YXJ0UHJldmlldygpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoMTAqMTAwMCk7CisgICAgICAgIExPR0UoIkRVQUwgY2xvc2UgYmFjayBjYW1lcmEgXG4iKTsKKyAgICAgICAgaWYoIG1tX2FwcF9jbG9zZShiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBMT0dFKCJEVUFMIGVuZCBcbiIpOworCitlbmQ6CisgICAgICAgIGlmKHJjID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgICAgIH0KKyAgICAgICAgTE9HRCgiRU5ELCByYyA9ICVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gcmM7Cit9CisKKy8qTXVsdGkgVGhyZWFkZWQgVGVzdCBDYXNlcyovCitzdGF0aWMgdm9pZCAqZnJvbnRfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisgICAgICAgIGludCBmcm9udF9jYW1lcmEgPSAxOworICAgICAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgICAgIGludCBpLGosayxtOworICAgICAgICBzdHJ1Y3QgdGVzdF9jYXNlX3BhcmFtcyBwYXJhbXMKKyAgICAgICAgICA9ICooKHN0cnVjdCB0ZXN0X2Nhc2VfcGFyYW1zICopZGF0YSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbXMubGF1bmNoOyBpKyspIHsKKyAgICAgICAgICBMT0dFKCJEVUFMIG9wZW4gZnJvbnQgY2FtZXJhICVkXG4iLGkpOworICAgICAgICAgIGlmKG1tX2FwcF9vcGVuKGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGZyb250IGNhbWVyYSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSyl7CisgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwYXJhbXMucHJldmlldzsgaisrKSB7CisgICAgICAgICAgICBMT0dFKCJEVUFMIHN0YXJ0IGNhbWVyYSBSZGkgZm9yIGZyb250ICVkICwlZCBcbiIsaSxqKTsKKyAgICAgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RhcnRSZGkoZnJvbnRfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgTE9HRSgiIGJhY2sgY2FtZXJhIHN0YXJ0UHJldmlldygpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKyAgICAgICAgICAgIHVzbGVlcCgyMCoxMDAwKTsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwYXJhbXMuc25hcHNob3Q7IGsrKykgeworICAgICAgICAgICAgICBMT0dFKCJEVUFMIHRha2UgcGljdHVyZSBmb3IgZnJvbnQgJWQsJWQsJWQgXG4iLGksaixrKTsKKyAgICAgICAgICAgICAgaWYgKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gdGFrZVBpY3R1cmVfcmRpKGZyb250X2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIFRha2VQaWN0dXJlKCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICAgICAgICB1c2xlZXAoMzAqMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0dFKCJEVUFMIHN0b3AgY2FtZXJhIFJkaSBmb3IgZnJvbnQgJWQsJWRcbiIsaSxqKTsKKyAgICAgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RvcFJkaShmcm9udF9jYW1lcmEpKSkgeworICAgICAgICAgICAgICBMT0dFKCIgc3RhcnRQcmV2aWV3KCkgYmFja2NhbWVyYSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXNsZWVwKDEwKjEwMDApOworICAgICAgICAgIH0KKworICAgICAgICAgIExPR0UoIkRVQUwgY2xvc2UgZnJvbnQgY2FtZXJhICVkXG4iLGkpOworICAgICAgICAgIGlmKCBtbV9hcHBfY2xvc2UoZnJvbnRfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZSgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKyAgICAgICAgfQorZW5kOgorICAgICAgICBMT0dFKCJEVUFMIGZyb250IHRocmVhZCBjbG9zZSAlZCIscmMpOworICAgICAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmJhY2tfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisgICAgICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICAgICAgaW50IGJhY2tfY2FtZXJhID0gMDsKKyAgICAgICAgaW50IGksaixrLG07CisgICAgICAgIHN0cnVjdCB0ZXN0X2Nhc2VfcGFyYW1zIHBhcmFtcworICAgICAgICAgID0gKigoc3RydWN0IHRlc3RfY2FzZV9wYXJhbXMgKilkYXRhKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtcy5sYXVuY2g7IGkrKykgeworICAgICAgICAgIExPR0UoIkRVQUwgb3BlbiBiYWNrIGNhbWVyYSAlZFxuIixpKTsKKyAgICAgICAgICBpZihtbV9hcHBfb3BlbihiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGJhY2sgY2FtZXJhIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKyAgICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgICAgIExPR0UoInN5c3RlbV9kaW1lbnNpb25fc2V0KCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBhcmFtcy5wcmV2aWV3OyBqKyspIHsKKyAgICAgICAgICAgIExPR0UoIkRVQUwgc3RhcnQgY2FtZXJhIFByZXZpZXcgZm9yIGJhY2sgJWQsICVkXG4iLGksaik7CisgICAgICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UHJldmlldyhiYWNrX2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgIExPR0UoIiBzdGFydFByZXZpZXcoKSBiYWNrY2FtZXJhIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKyAgICAgICAgICAgIHVzbGVlcCgyMCoxMDAwKTsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwYXJhbXMuc25hcHNob3Q7IGsrKykgeworICAgICAgICAgICAgICBMT0dFKCJEVUFMIHRha2UgcGljdHVyZSBmb3IgYmFjayAlZCwgJWQsICVkXG4iLGksaixrKTsKKyAgICAgICAgICAgICAgaWYgKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gdGFrZVBpY3R1cmVfeXV2KGJhY2tfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIgVGFrZVBpY3R1cmUoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgICAgICAgIHVzbGVlcCgzMCoxMDAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IHBhcmFtcy5yZWNvcmRpbmc7IG0rKykgeworICAgICAgICAgICAgICBMT0dFKCJEVUFMIHN0YXJ0IHJlY29yZCBmb3IgYmFjayAlZCwgJWQsICVkXG4iLGksaixtKTsKKyAgICAgICAgICAgICAgaWYgKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RhcnRSZWNvcmRpbmcoYmFja19jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBTdGFydFZpZGVvcmVjb3JkaW5nKCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgICAgICAgIHVzbGVlcCgxMCoxMDAwKTsKKyAgICAgICAgICAgICAgTE9HRSgiRFVBTCBzdG9wIGNhbWVyYSByZWNvcmQgZm9yIGJhY2sgXG4iKTsKKyAgICAgICAgICAgICAgaWYgKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RvcFJlY29yZGluZyhiYWNrX2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIFN0b3B2aWRlb3JlY29yZGluZygpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB1c2xlZXAoMTAqMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0dFKCJEVUFMIHN0b3AgY2FtZXJhIFByZXZpZXcgZm9yIGJhY2sgJWQsICVkXG4iLGksaik7CisgICAgICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0b3BQcmV2aWV3KGJhY2tfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgTE9HRCgiIHN0YXJ0UHJldmlldygpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1c2xlZXAoMTAqMTAwMCk7CisgICAgICAgICAgfQorCisgICAgICAgICAgTE9HRSgiRFVBTCBjbG9zZSBiYWNrIGNhbWVyYSAlZFxuIixpKTsKKyAgICAgICAgICBpZiggbW1fYXBwX2Nsb3NlKGJhY2tfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZSgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKyAgICAgICAgfQorZW5kOgorICAgICAgICBMT0dFKCJEVUFMIGJhY2sgdGhyZWFkIGNsb3NlICVkIixyYyk7CisgICAgICAgIHJldHVybiBOVUxMOworfQorCisvKiAgVGVzdCBjYXNlIG0xMzU3MjQ2OCA6IE9wZW4gJiBzdGFydCAgaW4gMiBjb25jdXJyZW50IHB0aHJlYWQqLworaW50IG1tX2FwcF9kdGNfNyhtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHBzKQoreworICAgICAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBwdGhyZWFkX3QgYmFja190aHJlYWRfaWQsIGZyb250X3RocmVhZF9pZDsKKyAgICAgICAgc3RydWN0IHRlc3RfY2FzZV9wYXJhbXMgcGFyYW1zOworICAgICAgICBtZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHN0cnVjdCB0ZXN0X2Nhc2VfcGFyYW1zKSk7CisgICAgICAgIHBhcmFtcy5sYXVuY2ggPSA1OworICAgICAgICBwYXJhbXMucHJldmlldyA9IDU7CisgICAgICAgIHByaW50ZigiXG4gVmVyaWZ5aW5nIFByZXZpZXcgb24gYmFjayBDYW1lcmEgYW5kIFJESSBvbiBGcm9udCBjYW1lcmEgNy4uLlxuIik7CisKKyAgICAgICAgTE9HRSgic3RhcnQgYmFjayBEVUFMICIpOworICAgICAgICByYyA9IHB0aHJlYWRfY3JlYXRlKCZiYWNrX3RocmVhZF9pZCwgTlVMTCwgYmFja190aHJlYWQsICZwYXJhbXMpOworICAgICAgICBMT0dFKCJzdGFydCBmcm9udCBEVUFMICIpOworICAgICAgICByYyA9IHB0aHJlYWRfY3JlYXRlKCZmcm9udF90aHJlYWRfaWQsIE5VTEwsIGZyb250X3RocmVhZCwgJnBhcmFtcyk7CisgICAgICAgIHNsZWVwKDEpOworICAgICAgICBMT0dFKCJzdG9wIGJhY2sgRFVBTCAiKTsKKyAgICAgICAgcmMgPSBwdGhyZWFkX2pvaW4oYmFja190aHJlYWRfaWQsIE5VTEwpOworICAgICAgICBMT0dFKCJzdG9wIGZyb250IERVQUwgIik7CisgICAgICAgIHJjID0gcHRocmVhZF9qb2luKGZyb250X3RocmVhZF9pZCwgTlVMTCk7CisgICAgICAgIExPR0UoIkRVQUwgZW5kIFxuIik7CisKK2VuZDoKKyAgICAgICAgaWYocmMgPT0gMCkgeworICAgICAgICAgIHByaW50ZigiXG5QYXNzZWRcbiIpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBwcmludGYoIlxuRmFpbGVkXG4iKTsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJFTkQsIHJjID0gJWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiByYzsKK30KKworLyogIFRlc3QgY2FzZSBtMTM5NTcyNDY4IDogT3BlbiAmIHN0YXJ0IGluIDIgY29uY3VycmVudCBwdGhyZWFkKi8KK2ludCBtbV9hcHBfZHRjXzgobW1fY2FtZXJhX2FwcF90ICpjYW1fYXBwcykKK3sKKyAgICAgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgICAgICBwdGhyZWFkX3QgYmFja190aHJlYWRfaWQsIGZyb250X3RocmVhZF9pZDsKKyAgICAgICAgc3RydWN0IHRlc3RfY2FzZV9wYXJhbXMgYnBhcmFtcywgZnBhcmFtczsKKyAgICAgICAgbWVtc2V0KCZicGFyYW1zLCAwLCBzaXplb2Yoc3RydWN0IHRlc3RfY2FzZV9wYXJhbXMpKTsKKyAgICAgICAgbWVtc2V0KCZmcGFyYW1zLCAwLCBzaXplb2Yoc3RydWN0IHRlc3RfY2FzZV9wYXJhbXMpKTsKKyAgICAgICAgYnBhcmFtcy5sYXVuY2ggPSA1OworICAgICAgICBicGFyYW1zLnByZXZpZXcgPSA1OworICAgICAgICBicGFyYW1zLnNuYXBzaG90PSA1OworICAgICAgICBmcGFyYW1zLmxhdW5jaCA9IDU7CisgICAgICAgIGZwYXJhbXMucHJldmlldyA9IDU7CisgICAgICAgIHByaW50ZigiXG4gVmVyaWZ5aW5nIFByZXZpZXcgb24gYmFjayBDYW1lcmEgYW5kIFJESSBvbiBGcm9udCBjYW1lcmEgOC4uLlxuIik7CisKKyAgICAgICAgTE9HRSgic3RhcnQgYmFjayBEVUFMICIpOworICAgICAgICByYyA9IHB0aHJlYWRfY3JlYXRlKCZiYWNrX3RocmVhZF9pZCwgTlVMTCwgYmFja190aHJlYWQsICZicGFyYW1zKTsKKyAgICAgICAgTE9HRSgic3RhcnQgZnJvbnQgRFVBTCAiKTsKKyAgICAgICAgcmMgPSBwdGhyZWFkX2NyZWF0ZSgmZnJvbnRfdGhyZWFkX2lkLCBOVUxMLCBmcm9udF90aHJlYWQsICZmcGFyYW1zKTsKKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIExPR0UoInN0b3AgYmFjayBEVUFMICIpOworICAgICAgICByYyA9IHB0aHJlYWRfam9pbihiYWNrX3RocmVhZF9pZCwgTlVMTCk7CisgICAgICAgIExPR0UoInN0b3AgZnJvbnQgRFVBTCAiKTsKKyAgICAgICAgcmMgPSBwdGhyZWFkX2pvaW4oZnJvbnRfdGhyZWFkX2lkLCBOVUxMKTsKKyAgICAgICAgTE9HRSgiRFVBTCBlbmQgXG4iKTsKKworZW5kOgorICAgICAgICBpZihyYyA9PSAwKQorICAgICAgICAgIHByaW50ZigiXG5QYXNzZWRcbiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgICAgIExPR0QoIkVORCwgcmMgPSAlZFxuIiwgIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworfQorCisvKiAgVGVzdCBjYXNlIG0xMzk1NzI0YzY4IDogT3BlbiAmIHN0YXJ0IGluIDIgY29uY3VycmVudCBwdGhyZWFkKi8KK2ludCBtbV9hcHBfZHRjXzkobW1fY2FtZXJhX2FwcF90ICpjYW1fYXBwcykKK3sKKyAgICAgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgICAgICBwdGhyZWFkX3QgYmFja190aHJlYWRfaWQsIGZyb250X3RocmVhZF9pZDsKKyAgICAgICAgc3RydWN0IHRlc3RfY2FzZV9wYXJhbXMgYnBhcmFtcywgZnBhcmFtczsKKyAgICAgICAgbWVtc2V0KCZicGFyYW1zLCAwLCBzaXplb2Yoc3RydWN0IHRlc3RfY2FzZV9wYXJhbXMpKTsKKyAgICAgICAgbWVtc2V0KCZmcGFyYW1zLCAwLCBzaXplb2Yoc3RydWN0IHRlc3RfY2FzZV9wYXJhbXMpKTsKKyAgICAgICAgYnBhcmFtcy5sYXVuY2ggPSA1OworICAgICAgICBicGFyYW1zLnByZXZpZXcgPSA1OworICAgICAgICBicGFyYW1zLnNuYXBzaG90PSA1OworICAgICAgICBmcGFyYW1zLmxhdW5jaCA9IDU7CisgICAgICAgIGZwYXJhbXMucHJldmlldyA9IDU7CisgICAgICAgIGZwYXJhbXMuc25hcHNob3QgPSA1OworICAgICAgICBwcmludGYoIlxuIFZlcmlmeWluZyBQcmV2aWV3IG9uIGJhY2sgQ2FtZXJhIGFuZCBSREkgb24gRnJvbnQgY2FtZXJhIDkuLi5cbiIpOworCisgICAgICAgIExPR0UoInN0YXJ0IGJhY2sgRFVBTCAiKTsKKyAgICAgICAgcmMgPSBwdGhyZWFkX2NyZWF0ZSgmYmFja190aHJlYWRfaWQsIE5VTEwsIGJhY2tfdGhyZWFkLCAmYnBhcmFtcyk7CisgICAgICAgIExPR0UoInN0YXJ0IGZyb250IERVQUwgIik7CisgICAgICAgIHJjID0gcHRocmVhZF9jcmVhdGUoJmZyb250X3RocmVhZF9pZCwgTlVMTCwgZnJvbnRfdGhyZWFkLCAmZnBhcmFtcyk7CisgICAgICAgIHNsZWVwKDEpOworICAgICAgICBMT0dFKCJzdG9wIGJhY2sgRFVBTCAiKTsKKyAgICAgICAgcmMgPSBwdGhyZWFkX2pvaW4oYmFja190aHJlYWRfaWQsIE5VTEwpOworICAgICAgICBMT0dFKCJzdG9wIGZyb250IERVQUwgIik7CisgICAgICAgIHJjID0gcHRocmVhZF9qb2luKGZyb250X3RocmVhZF9pZCwgTlVMTCk7CisgICAgICAgIExPR0UoIkRVQUwgZW5kIFxuIik7CisKK2VuZDoKKyAgICAgICAgaWYocmMgPT0gMCkgeworICAgICAgICAgIHByaW50ZigiXG5QYXNzZWRcbiIpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICBwcmludGYoIlxuRmFpbGVkXG4iKTsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJFTkQsIHJjID0gJWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiByYzsKK30KKworLyogIFRlc3QgY2FzZSBtMTNhYjU3MjQ2OCA6IE9wZW4gJiBzdGFydCBpbiAyIGNvbmN1cnJlbnQgcHRocmVhZCovCitpbnQgbW1fYXBwX2R0Y18xMChtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHBzKQoreworICAgICAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgICAgIGludCByZXN1bHQgPSAwOworCisgICAgICAgIHB0aHJlYWRfdCBiYWNrX3RocmVhZF9pZCwgZnJvbnRfdGhyZWFkX2lkOworICAgICAgICBzdHJ1Y3QgdGVzdF9jYXNlX3BhcmFtcyBicGFyYW1zLCBmcGFyYW1zOworICAgICAgICBtZW1zZXQoJmJwYXJhbXMsIDAsIHNpemVvZihzdHJ1Y3QgdGVzdF9jYXNlX3BhcmFtcykpOworICAgICAgICBtZW1zZXQoJmZwYXJhbXMsIDAsIHNpemVvZihzdHJ1Y3QgdGVzdF9jYXNlX3BhcmFtcykpOworICAgICAgICBicGFyYW1zLmxhdW5jaCA9IDU7CisgICAgICAgIGJwYXJhbXMucHJldmlldyA9IDU7CisgICAgICAgIGJwYXJhbXMucmVjb3JkaW5nPSA1OworICAgICAgICBmcGFyYW1zLmxhdW5jaCA9IDU7CisgICAgICAgIGZwYXJhbXMucHJldmlldyA9IDU7CisgICAgICAgIHByaW50ZigiXG4gVmVyaWZ5aW5nIFByZXZpZXcgb24gYmFjayBDYW1lcmEgYW5kIFJESSBvbiBGcm9udCBjYW1lcmEgMTAuLi5cbiIpOworCisgICAgICAgIExPR0UoInN0YXJ0IGJhY2sgRFVBTCAiKTsKKyAgICAgICAgcmMgPSBwdGhyZWFkX2NyZWF0ZSgmYmFja190aHJlYWRfaWQsIE5VTEwsIGJhY2tfdGhyZWFkLCAmYnBhcmFtcyk7CisgICAgICAgIExPR0UoInN0YXJ0IGZyb250IERVQUwgIik7CisgICAgICAgIHJjID0gcHRocmVhZF9jcmVhdGUoJmZyb250X3RocmVhZF9pZCwgTlVMTCwgZnJvbnRfdGhyZWFkLCAmZnBhcmFtcyk7CisgICAgICAgIHNsZWVwKDEpOworICAgICAgICBMT0dFKCJzdG9wIGJhY2sgRFVBTCAiKTsKKyAgICAgICAgcmMgPSBwdGhyZWFkX2pvaW4oYmFja190aHJlYWRfaWQsIE5VTEwpOworICAgICAgICBMT0dFKCJzdG9wIGZyb250IERVQUwgIik7CisgICAgICAgIHJjID0gcHRocmVhZF9qb2luKGZyb250X3RocmVhZF9pZCwgTlVMTCk7CisgICAgICAgIExPR0UoIkRVQUwgZW5kIFxuIik7CitlbmQ6CisgICAgICAgIGlmKHJjID09IDApIHsKKyAgICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgICAgIH0KKyAgICAgICAgTE9HRCgiRU5ELCByYyA9ICVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gcmM7Cit9CisKKy8qICBUZXN0IGNhc2UgbTEzYWI1NzI0YzY4IDogT3BlbiAmIHN0YXJ0IGluIDIgY29uY3VycmVudCBwdGhyZWFkKi8KK2ludCBtbV9hcHBfZHRjXzExKG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcHMpCit7CisgICAgICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICAgICAgcHRocmVhZF90IGJhY2tfdGhyZWFkX2lkLCBmcm9udF90aHJlYWRfaWQ7CisgICAgICAgIHN0cnVjdCB0ZXN0X2Nhc2VfcGFyYW1zIGJwYXJhbXMsIGZwYXJhbXM7CisgICAgICAgIG1lbXNldCgmYnBhcmFtcywgMCwgc2l6ZW9mKHN0cnVjdCB0ZXN0X2Nhc2VfcGFyYW1zKSk7CisgICAgICAgIG1lbXNldCgmZnBhcmFtcywgMCwgc2l6ZW9mKHN0cnVjdCB0ZXN0X2Nhc2VfcGFyYW1zKSk7CisgICAgICAgIGJwYXJhbXMubGF1bmNoID0gNTsKKyAgICAgICAgYnBhcmFtcy5wcmV2aWV3ID0gNTsKKyAgICAgICAgYnBhcmFtcy5yZWNvcmRpbmc9IDU7CisgICAgICAgIGZwYXJhbXMubGF1bmNoID0gNTsKKyAgICAgICAgZnBhcmFtcy5wcmV2aWV3ID0gNTsKKyAgICAgICAgZnBhcmFtcy5zbmFwc2hvdCA9IDU7CisgICAgICAgIHByaW50ZigiXG4gVmVyaWZ5aW5nIFByZXZpZXcgb24gYmFjayBDYW1lcmEgYW5kIFJESSBvbiBGcm9udCBjYW1lcmEgMTEuLi5cbiIpOworCisgICAgICAgIExPR0UoInN0YXJ0IGJhY2sgRFVBTCAiKTsKKyAgICAgICAgcmMgPSBwdGhyZWFkX2NyZWF0ZSgmYmFja190aHJlYWRfaWQsIE5VTEwsIGJhY2tfdGhyZWFkLCAmYnBhcmFtcyk7CisgICAgICAgIExPR0UoInN0YXJ0IGZyb250IERVQUwgIik7CisgICAgICAgIHJjID0gcHRocmVhZF9jcmVhdGUoJmZyb250X3RocmVhZF9pZCwgTlVMTCwgZnJvbnRfdGhyZWFkLCAmZnBhcmFtcyk7CisgICAgICAgIHNsZWVwKDEpOworICAgICAgICBMT0dFKCJzdG9wIGJhY2sgRFVBTCAiKTsKKyAgICAgICAgcmMgPSBwdGhyZWFkX2pvaW4oYmFja190aHJlYWRfaWQsIE5VTEwpOworICAgICAgICBMT0dFKCJzdG9wIGZyb250IERVQUwgIik7CisgICAgICAgIHJjID0gcHRocmVhZF9qb2luKGZyb250X3RocmVhZF9pZCwgTlVMTCk7CisgICAgICAgIExPR0UoIkRVQUwgZW5kIFxuIik7CisKK2VuZDoKKyAgICAgICAgaWYocmMgPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiXG5QYXNzZWRcbiIpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuRmFpbGVkXG4iKTsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJFTkQsIHJjID0gJWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiByYzsKK30KKworLyogIFRlc3QgY2FzZSBtMTcyOCA6IE9wZW4gJiBzdGFydCBpbiAyIGNvbmN1cnJlbnQgcHRocmVhZCovCitpbnQgbW1fYXBwX2R0Y18xMihtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHBzKQoreworICAgICAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgICAgIGludCByZXN1bHQgPSAwOworCisgICAgICAgIHB0aHJlYWRfdCBiYWNrX3RocmVhZF9pZCwgZnJvbnRfdGhyZWFkX2lkOworICAgICAgICBzdHJ1Y3QgdGVzdF9jYXNlX3BhcmFtcyBicGFyYW1zLCBmcGFyYW1zOworICAgICAgICBtZW1zZXQoJmJwYXJhbXMsIDAsIHNpemVvZihzdHJ1Y3QgdGVzdF9jYXNlX3BhcmFtcykpOworICAgICAgICBtZW1zZXQoJmZwYXJhbXMsIDAsIHNpemVvZihzdHJ1Y3QgdGVzdF9jYXNlX3BhcmFtcykpOworICAgICAgICBicGFyYW1zLmxhdW5jaCA9IDE1OworICAgICAgICBmcGFyYW1zLmxhdW5jaCA9IDE1OworICAgICAgICBwcmludGYoIlxuIFZlcmlmeWluZyBQcmV2aWV3IG9uIGJhY2sgQ2FtZXJhIGFuZCBSREkgb24gRnJvbnQgY2FtZXJhIDEyLi4uXG4iKTsKKworICAgICAgICBMT0dFKCJzdGFydCBiYWNrIERVQUwgIik7CisgICAgICAgIHJjID0gcHRocmVhZF9jcmVhdGUoJmJhY2tfdGhyZWFkX2lkLCBOVUxMLCBiYWNrX3RocmVhZCwgJmJwYXJhbXMpOworICAgICAgICBMT0dFKCJzdGFydCBmcm9udCBEVUFMICIpOworICAgICAgICByYyA9IHB0aHJlYWRfY3JlYXRlKCZmcm9udF90aHJlYWRfaWQsIE5VTEwsIGZyb250X3RocmVhZCwgJmZwYXJhbXMpOworICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgTE9HRSgic3RvcCBiYWNrIERVQUwgIik7CisgICAgICAgIHJjID0gcHRocmVhZF9qb2luKGJhY2tfdGhyZWFkX2lkLCBOVUxMKTsKKyAgICAgICAgTE9HRSgic3RvcCBmcm9udCBEVUFMICIpOworICAgICAgICByYyA9IHB0aHJlYWRfam9pbihmcm9udF90aHJlYWRfaWQsIE5VTEwpOworICAgICAgICBMT0dFKCJEVUFMIGVuZCBcbiIpOworCitlbmQ6CisgICAgICAgIGlmKHJjID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgICAgIH0KKyAgICAgICAgTE9HRCgiRU5ELCByYyA9ICVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gcmM7Cit9CisKKy8qICBUZXN0IGNhc2UgMjQxMyhhYik1NzY4CisgKiAgVGVzdCB0aGUgZHVhbCBjYW1lcmEgdXNlY2FzZS4gV2Ugc3RhcnRQcmV2aWV3IG9uIGZyb250IGNhbWVyYSwKKyAqICBidXQgYmFja2VuZCB3aWxsIGFsbG9jYXRlIFJESSBidWZmZXJzIGFuZCBzdGFydCBmcm9udCBjYW1lcmEgaW4KKyAqICBSREkgc3RyZWFtaW5nIG1vZGUuIEl0IHRoZW4gZGl2ZXJ0cyBSREkgZnJhbWVzLCBjb252ZXJ0cyB0aGVtIGludG8gWVVWIDQyMAorICogIHRocm91Z2ggQzJEIGFuZCBnZW5lcmF0ZSBwcmV2aWV3IGRhdGEgaW4gdGhlIGJ1ZmZlcnMgYWxsb2NhdGVkIGhlcmUuCisgKiAgQmFjayBjYW1lcmEgd2lsbCB1c2UgdGhlIHBpeGVsIGludGVyZmFjZSBhcyB1c3VhbC4KKyAqLworCitpbnQgbW1fYXBwX2R0Y18xMyhtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHBzKQoreworICAgICAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgICAgIGludCBpLGosazsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgIGludCBmcm9udF9jYW1lcmEgPSAxOworICAgICAgICBpbnQgYmFja19jYW1lcmEgPSAwOworCisgICAgICAgIHByaW50ZigiXG4gMTMuIFZlcmlmeWluZyBQcmV2aWV3ICsgUmVjb3JkaW5nIG9uIGJhY2sgQ2FtZXJhIGFuZCBQcmV2aWV3KHRocm91Z2ggUkRJKSBvbiBGcm9udCBjYW1lcmFcbiIpOworICAgICAgICBMT0dFKCJEVUFMIG9wZW4gZnJvbnQgY2FtZXJhIFxuIik7CisgICAgICAgIGlmKG1tX2FwcF9vcGVuKGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX29wZW4oKSBmcm9udCBjYW1lcmEgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSyl7CisgICAgICAgICAgICAgICAgTE9HRSgic3lzdGVtX2RpbWVuc2lvbl9zZXQoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBjYW1lcmEgUHJldmlldyBmb3IgZnJvbnQgXG4iKTsKKyAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdGFydFByZXZpZXcoZnJvbnRfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgIExPR0UoIiBmcm9udCBjYW1lcmEgc3RhcnRQcmV2aWV3KCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgIHVzbGVlcCgyMCoxMDAwKTsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTU1fUUNBTUVSQV9BUFBfSU5URVJBVElPTiA7IGsrKyl7CisgICAgICAgICAgTE9HRSgiRFVBTCBvcGVuIGJhY2sgY2FtZXJhICVkIFxuIixrKTsKKyAgICAgICAgICBpZihtbV9hcHBfb3BlbihiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgYmFjayBjYW1lcmEgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmKHN5c3RlbV9kaW1lbnNpb25fc2V0KGJhY2tfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0speworICAgICAgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBMT0dFKCJEVUFMIHN0YXJ0IGNhbWVyYSBQcmV2aWV3IGZvciBiYWNrIFxuIik7CisgICAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdGFydFByZXZpZXcoYmFja19jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBiYWNrIGNhbWVyYSBzdGFydFByZXZpZXcoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgIH0KKyAgICAgICAgICB1c2xlZXAoMzAqMTAwMCk7CisKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTU1fUUNBTUVSQV9BUFBfSU5URVJBVElPTjsgaisrKSB7CisgICAgICAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBjYW1lcmEgcmVjb3JkIGZvciBiYWNrIEl0ZXJhdGlvbiAlZCBcbiIsIGopOworICAgICAgICAgICAgIGlmICggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UmVjb3JkaW5nKGJhY2tfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICAgTE9HRSgiIFN0YXJ0VmlkZW9yZWNvcmRpbmcoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICAgICAgIHVzbGVlcCgxMCoxMDAwKjEwMDApOworICAgICAgICAgICAgIExPR0UoIkRVQUwgc3RvcCBjYW1lcmEgcmVjb3JkIGZvciBiYWNrIEl0ZXJhdGlvbiAlZFxuIiwgaik7CisgICAgICAgICAgICAgaWYgKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RvcFJlY29yZGluZyhiYWNrX2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgIExPR0UoIiBTdG9wdmlkZW9yZWNvcmRpbmcoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgdXNsZWVwKDEwKjEwMDApOworCisgICAgICAgICAgTE9HRSgiRFVBTCBzdG9wIGNhbWVyYSBQcmV2aWV3IGZvciBiYWNrIFxuIik7CisgICAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdG9wUHJldmlldyhiYWNrX2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgIExPR0UoIiBzdG9wUHJldmlldygpIGJhY2tjYW1lcmEgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisgICAgICAgICAgdXNsZWVwKDEwKjEwMDApOworCisgICAgICAgICAgTE9HRSgiRFVBTCBjbG9zZSBiYWNrIGNhbWVyYVxuIik7CisgICAgICAgICAgaWYoIG1tX2FwcF9jbG9zZShiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZSgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICB9CisgICAgICAgICAgdXNsZWVwKDIwKjEwMDApOworICAgICAgICB9CisgICAgICAgIExPR0UoIkRVQUwgc3RvcCBjYW1lcmEgUHJldmlldyBmb3IgUmRpIFxuIik7CisgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RvcFByZXZpZXcoZnJvbnRfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIgc3RvcFByZXZpZXcoKSBmcm9udGNhbWVyYSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKDEwKjEwMDApOworICAgICAgICBMT0dFKCJEVUFMIGNsb3NlIGZyb250IGNhbWVyYSBcbiIpOworICAgICAgICBpZiggbW1fYXBwX2Nsb3NlKGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBMT0dFKCJEVUFMIGVuZCBcbiIpOworCitlbmQ6CisgICAgICAgIGlmKHJjID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgICAgIH0KKyAgICAgICAgTE9HRCgiRU5ELCByYyA9ICVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gcmM7Cit9CisKKy8qQmVsb3cgNiAgYXJlIHJlZmVyZW5jZSB0ZXN0IGNhc2VzIGp1c3QgdG8gdGVzdCB0aGUgb3BlbiBwYXRoIGZvciBkdWFsIGNhbWVyYSovCitpbnQgbW1fYXBwX2R0Y18xMjQzKG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcHMpCit7CisgICAgICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICAgICAgaW50IGksajsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgIGludCBmcm9udF9jYW1lcmEgPSAxOworICAgICAgICBpbnQgYmFja19jYW1lcmEgPSAwOworCisgICAgICAgIHByaW50ZigiXG4gVmVyaWZ5aW5nIFByZXZpZXcgb24gYmFjayBDYW1lcmEgYW5kIFJESSBvbiBGcm9udCBjYW1lcmEuLi5cbiIpOworICAgICAgICBMT0dFKCJEVUFMIG9wZW4gYmFjayBjYW1lcmEgXG4iKTsKKyAgICAgICAgaWYobW1fYXBwX29wZW4oYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgYmFjayBjYW1lcmEgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBMT0dFKCJEVUFMIG9wZW4gZnJvbnQgY2FtZXJhIFxuIik7CisgICAgICAgIGlmKG1tX2FwcF9vcGVuKGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX29wZW4oKSBmcm9udCBjYW1lcmEgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHN5c3RlbV9kaW1lbnNpb25fc2V0KGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBMT0dFKCJEVUFMIHN0YXJ0IGNhbWVyYSBSZGkgZm9yIGZyb250IFxuIik7CisgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RhcnRSZGkoZnJvbnRfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgIExPR0UoIiBiYWNrIGNhbWVyYSBzdGFydFByZXZpZXcoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgIHNsZWVwKDEpOworCisgICAgICAgIExPR0UoIkRVQUwgc3RhcnQgY2FtZXJhIFByZXZpZXcgZm9yIGJhY2sgXG4iKTsKKworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UHJldmlldyhiYWNrX2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIHN0YXJ0UHJldmlldygpIGJhY2tjYW1lcmEgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgTE9HRSgiRFVBTCBlbmQgXG4iKTsKKworZW5kOgorICAgICAgICBpZihyYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblBhc3NlZFxuIik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHByaW50ZigiXG5GYWlsZWRcbiIpOworICAgICAgICB9CisgICAgICAgIExPR0QoIkVORCwgcmMgPSAlZFxuIiwgIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fYXBwX2R0Y18yMTM0KG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcHMpCit7CisgICAgICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICAgICAgaW50IGksajsKKyAgICAgICAgaW50IHJlc3VsdCA9IDA7CisgICAgICAgIGludCBmcm9udF9jYW1lcmEgPSAxOworICAgICAgICBpbnQgYmFja19jYW1lcmEgPSAwOworCisgICAgICAgIHByaW50ZigiXG4gVmVyaWZ5aW5nIFByZXZpZXcgb24gYmFjayBDYW1lcmEgYW5kIFJESSBvbiBGcm9udCBjYW1lcmEuLi5cbiIpOworICAgICAgICBMT0dFKCJEVUFMIG9wZW4gZnJvbnQgY2FtZXJhIFxuIik7CisgICAgICAgIGlmKG1tX2FwcF9vcGVuKGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX29wZW4oKSBiYWNrIGNhbWVyYSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIGlmKHN5c3RlbV9kaW1lbnNpb25fc2V0KGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBMT0dFKCJEVUFMIG9wZW4gYmFjayBjYW1lcmEgXG4iKTsKKyAgICAgICAgaWYobW1fYXBwX29wZW4oYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgZnJvbnQgY2FtZXJhIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBMT0dFKCJEVUFMIHN0YXJ0IGNhbWVyYSBQcmV2aWV3IGZvciBmcm9udCBcbiIpOworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UHJldmlldyhiYWNrX2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICBMT0dFKCIgYmFjayBjYW1lcmEgc3RhcnRQcmV2aWV3KCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICBzbGVlcCgxKTsKKworICAgICAgICBMT0dFKCJEVUFMIHN0YXJ0IGNhbWVyYSBSZGkgZm9yIGJhY2sgXG4iKTsKKworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UmRpKGZyb250X2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIHN0YXJ0UHJldmlldygpIGJhY2tjYW1lcmEgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgTE9HRSgiRFVBTCBlbmQgXG4iKTsKKworZW5kOgorICAgICAgICBpZihyYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcblBhc3NlZFxuIik7CisgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIHByaW50ZigiXG5GYWlsZWRcbiIpOworICAgICAgICB9CisgICAgICAgIExPR0QoIkVORCwgcmMgPSAlZFxuIiwgIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworfQoraW50IG1tX2FwcF9kdGNfMjE0MyhtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHBzKQoreworICAgICAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgICAgIGludCBpLGo7CisgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBpbnQgZnJvbnRfY2FtZXJhID0gMTsKKyAgICAgICAgaW50IGJhY2tfY2FtZXJhID0gMDsKKworICAgICAgICBwcmludGYoIlxuIFZlcmlmeWluZyBQcmV2aWV3IG9uIGJhY2sgQ2FtZXJhIGFuZCBSREkgb24gRnJvbnQgY2FtZXJhLi4uXG4iKTsKKyAgICAgICAgTE9HRSgiRFVBTCBvcGVuIGZyb250IGNhbWVyYSBcbiIpOworICAgICAgICBpZihtbV9hcHBfb3Blbihmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgYmFjayBjYW1lcmEgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSyl7CisgICAgICAgICAgICAgICAgTE9HRSgic3lzdGVtX2RpbWVuc2lvbl9zZXQoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgTE9HRSgiRFVBTCBvcGVuIGJhY2sgY2FtZXJhIFxuIik7CisgICAgICAgIGlmKG1tX2FwcF9vcGVuKGJhY2tfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGZyb250IGNhbWVyYSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgaWYoc3lzdGVtX2RpbWVuc2lvbl9zZXQoYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSyl7CisgICAgICAgICAgICAgICAgTE9HRSgic3lzdGVtX2RpbWVuc2lvbl9zZXQoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBjYW1lcmEgcmRpIGZvciBmcm9udCBcbiIpOworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UmRpKGZyb250X2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICBMT0dFKCIgYmFjayBjYW1lcmEgc3RhcnRQcmV2aWV3KCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICBzbGVlcCgxKTsKKworICAgICAgICBMT0dFKCJEVUFMIHN0YXJ0IGNhbWVyYSBwcmV2aWV3IGZvciBiYWNrIFxuIik7CisKKyAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdGFydFByZXZpZXcoYmFja19jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBzdGFydFByZXZpZXcoKSBiYWNrY2FtZXJhIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIExPR0UoIkRVQUwgZW5kIFxuIik7CisKK2VuZDoKKyAgICAgICAgaWYocmMgPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiXG5QYXNzZWRcbiIpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuRmFpbGVkXG4iKTsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJFTkQsIHJjID0gJWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF9kdGNfMjQxMyhtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHBzKQoreworICAgICAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgICAgIGludCBpLGo7CisgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBpbnQgZnJvbnRfY2FtZXJhID0gMTsKKyAgICAgICAgaW50IGJhY2tfY2FtZXJhID0gMDsKKworICAgICAgICBwcmludGYoIlxuIFZlcmlmeWluZyBQcmV2aWV3IG9uIGJhY2sgQ2FtZXJhIGFuZCBSREkgb24gRnJvbnQgY2FtZXJhLi4uXG4iKTsKKyAgICAgICAgTE9HRSgiRFVBTCBvcGVuIGZyb250IGNhbWVyYSBcbiIpOworICAgICAgICBpZihtbV9hcHBfb3Blbihmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgYmFjayBjYW1lcmEgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSyl7CisgICAgICAgICAgICAgICAgTE9HRSgic3lzdGVtX2RpbWVuc2lvbl9zZXQoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBjYW1lcmEgcmRpIGZvciBmcm9udCBcbiIpOworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UmRpKGZyb250X2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICBMT0dFKCIgYmFjayBjYW1lcmEgc3RhcnRQcmV2aWV3KCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICBzbGVlcCgxKTsKKworICAgICAgICBMT0dFKCJEVUFMIG9wZW4gYmFjayBjYW1lcmEgXG4iKTsKKyAgICAgICAgaWYobW1fYXBwX29wZW4oYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgZnJvbnQgY2FtZXJhIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBMT0dFKCJEVUFMIHN0YXJ0IGNhbWVyYSBwcmV2aWV3IGZvciBiYWNrIFxuIik7CisKKyAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdGFydFByZXZpZXcoYmFja19jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBzdGFydFByZXZpZXcoKSBiYWNrY2FtZXJhIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIExPR0UoIkRVQUwgZW5kIFxuIik7CisKK2VuZDoKKyAgICAgICAgaWYocmMgPT0gMCkgeworICAgICAgICAgICAgICAgIHByaW50ZigiXG5QYXNzZWRcbiIpOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuRmFpbGVkXG4iKTsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJFTkQsIHJjID0gJWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF9kdGNfMTIzNChtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHBzKQoreworICAgICAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgICAgIGludCBpLGo7CisgICAgICAgIGludCByZXN1bHQgPSAwOworICAgICAgICBpbnQgZnJvbnRfY2FtZXJhID0gMTsKKyAgICAgICAgaW50IGJhY2tfY2FtZXJhID0gMDsKKworICAgICAgICBwcmludGYoIlxuIFZlcmlmeWluZyBQcmV2aWV3IG9uIGJhY2sgQ2FtZXJhIGFuZCBSREkgb24gRnJvbnQgY2FtZXJhLi4uXG4iKTsKKyAgICAgICAgTE9HRSgiRFVBTCBvcGVuIGJhY2sgY2FtZXJhIFxuIik7CisgICAgICAgIGlmKG1tX2FwcF9vcGVuKGJhY2tfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGJhY2sgY2FtZXJhIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYoc3lzdGVtX2RpbWVuc2lvbl9zZXQoYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSyl7CisgICAgICAgICAgICAgICAgTE9HRSgic3lzdGVtX2RpbWVuc2lvbl9zZXQoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIExPR0UoIkRVQUwgb3BlbiBmcm9udCBjYW1lcmEgXG4iKTsKKyAgICAgICAgaWYobW1fYXBwX29wZW4oZnJvbnRfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGZyb250IGNhbWVyYSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgaWYoc3lzdGVtX2RpbWVuc2lvbl9zZXQoZnJvbnRfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0speworICAgICAgICAgICAgICAgIExPR0UoInN5c3RlbV9kaW1lbnNpb25fc2V0KCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIExPR0UoIkRVQUwgc3RhcnQgY2FtZXJhIHByZXZpZXcgZm9yIGJhY2sgXG4iKTsKKyAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdGFydFByZXZpZXcoYmFja19jYW1lcmEpKSkgeworICAgICAgICAgICAgICAgTE9HRSgiIGJhY2sgY2FtZXJhIHN0YXJ0UHJldmlldygpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKyAgICAgICAgc2xlZXAoMSk7CisKKyAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBjYW1lcmEgcmRpIGZvciBmcm9udCBcbiIpOworCisgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RhcnRSZGkoZnJvbnRfY2FtZXJhKSkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIgc3RhcnRQcmV2aWV3KCkgYmFja2NhbWVyYSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgIHNsZWVwKDEpOworICAgICAgICBMT0dFKCJEVUFMIGVuZCBcbiIpOworCitlbmQ6CisgICAgICAgIGlmKHJjID09IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgICAgIH0KKyAgICAgICAgTE9HRCgiRU5ELCByYyA9ICVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfZHRjXzEzMjQobW1fY2FtZXJhX2FwcF90ICpjYW1fYXBwcykKK3sKKyAgICAgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgICAgICBpbnQgaSxqOworICAgICAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAgICAgaW50IGZyb250X2NhbWVyYSA9IDE7CisgICAgICAgIGludCBiYWNrX2NhbWVyYSA9IDA7CisKKyAgICAgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgUHJldmlldyBvbiBiYWNrIENhbWVyYSBhbmQgUkRJIG9uIEZyb250IGNhbWVyYS4uLlxuIik7CisgICAgICAgIExPR0UoIkRVQUwgc3RhcnQgYmFjayBjYW1lcmEgXG4iKTsKKyAgICAgICAgaWYobW1fYXBwX29wZW4oYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgYmFjayBjYW1lcmEgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBjYW1lcmEgcHJldmlldyBmb3IgYmFjayBcbiIpOworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UHJldmlldyhiYWNrX2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIGJhY2sgY2FtZXJhIHN0YXJ0UHJldmlldygpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICAvL21tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgTE9HRSgiRFVBTCBzdGFydCBmcm9udCBjYW1lcmEgXG4iKTsKKyAgICAgICAgaWYobW1fYXBwX29wZW4oZnJvbnRfY2FtZXJhKSAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGZyb250IGNhbWVyYSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSyl7CisgICAgICAgICAgICAgICAgTE9HRSgic3lzdGVtX2RpbWVuc2lvbl9zZXQoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIExPR0UoIkRVQUwgc3RhcnQgcmRpIHByZXZpZXcgXG4iKTsKKworICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UmRpKGZyb250X2NhbWVyYSkpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIHN0YXJ0UHJldmlldygpIGJhY2tjYW1lcmEgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgTE9HRSgiRFVBTCBlbmQgXG4iKTsKKworZW5kOgorICAgICAgICBpZihyYyA9PSAwKSB7CisgICAgICAgICAgcHJpbnRmKCJcblBhc3NlZFxuIik7CisgICAgICAgIH1lbHNleworICAgICAgICAgIHByaW50ZigiXG5GYWlsZWRcbiIpOworICAgICAgICB9CisgICAgICAgIExPR0QoIkVORCwgcmMgPSAlZFxuIiwgIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworfQorCisvKiBzaW5nbGUgY2FtZXJhIHRlc3QgY2FzZXMqLworaW50IG1tX2FwcF9kdGNfc18wKG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcHMpCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIGludCBpLGo7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IGZyb250X2NhbWVyYSA9IDE7CisgICAgaW50IGJhY2tfY2FtZXJhID0gMDsKKworICAgIHByaW50ZigiXG4gVmVyaWZ5aW5nIFByZXZpZXcgb24gYmFjayBDYW1lcmEgYW5kIFJESSBvbiBGcm9udCBjYW1lcmEuLi5cbiIpOworCisgICAgaWYobW1fYXBwX29wZW4oYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGJhY2sgY2FtZXJhIGVycj0lZFxuIiwgcmMpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgaWYoc3lzdGVtX2RpbWVuc2lvbl9zZXQoYmFja19jYW1lcmEpICE9IE1NX0NBTUVSQV9PSyl7CisgICAgTE9HRSgic3lzdGVtX2RpbWVuc2lvbl9zZXQoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdGFydFByZXZpZXcoYmFja19jYW1lcmEpKSkgeworICAgICAgICBMT0dFKCIgYmFjayBjYW1lcmEgc3RhcnRQcmV2aWV3KCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKyAgICBpZihtbV9hcHBfb3Blbihmcm9udF9jYW1lcmEpICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGZyb250IGNhbWVyYSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGlmKHN5c3RlbV9kaW1lbnNpb25fc2V0KGZyb250X2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgTE9HRSgic3lzdGVtX2RpbWVuc2lvbl9zZXQoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdGFydFJkaShmcm9udF9jYW1lcmEpKSkgeworICAgICAgICBMT0dFKCIgc3RhcnRQcmV2aWV3KCkgYmFja2NhbWVyYSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKworICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RvcFJkaShmcm9udF9jYW1lcmEpKSkgeworICAgICAgICBMT0dFKCIgc3RhcnRQcmV2aWV3KCkgYmFja2NhbWVyYSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RvcFByZXZpZXcobXlfY2FtX2FwcC5jYW1fb3BlbikpKSB7CisgICAgICAgIExPR0QoIiBzdGFydFByZXZpZXcoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmKCBtbV9hcHBfY2xvc2UobXlfY2FtX2FwcC5jYW1fb3BlbikgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZSgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CitlbmQ6CisgICAgaWYocmMgPT0gMCkgeworICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgfQorICAgIExPR0QoIkVORCwgcmMgPSAlZFxuIiwgIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfZHRjX3NfMShtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHBzKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBpbnQgaSxqOworICAgIGludCByZXN1bHQgPSAwOworCisgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgU25hcHNob3Qgb24gZnJvbnQgYW5kIGJhY2sgY2FtZXJhLi4uXG4iKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBjYW1fYXBwcy0+bnVtX2NhbWVyYXM7IGkrKykgeworICAgICAgICBpZiggbW1fYXBwX29wZW4oaSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIGlmKHN5c3RlbV9kaW1lbnNpb25fc2V0KG15X2NhbV9hcHAuY2FtX29wZW4pICE9IE1NX0NBTUVSQV9PSyl7CisgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdGFydFByZXZpZXcobXlfY2FtX2FwcC5jYW1fb3BlbikpKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIHN0YXJ0UHJldmlldygpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmb3IoaiA9IDA7IGogPCBNTV9RQ0FNRVJBX0FQUF9JTlRFUkFUSU9OOyBqKyspIHsKKyAgICAgICAgICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gdGFrZVBpY3R1cmVfeXV2KG15X2NhbV9hcHAuY2FtX29wZW4pKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBUYWtlUGljdHVyZSgpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qaWYobW1fY2FtZXJhX2FwcF90aW1lZHdhaXQoKSA9PSBFVElNRURPVVQpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIgU25hcHNob3QvUHJldmlldyBDYWxsYmFjayBub3QgcmVjZWl2ZWQgaW4gdGltZSBvciBxYnVmIEZhaWxlXG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0qLworICAgICAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0b3BQcmV2aWV3KG15X2NhbV9hcHAuY2FtX29wZW4pKSkgeworICAgICAgICAgICAgTE9HRCgiIHN0YXJ0UHJldmlldygpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKCBtbV9hcHBfY2xvc2UobXlfY2FtX2FwcC5jYW1fb3BlbikgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJtbV9hcHBfY2xvc2UoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpZihyZXN1bHQgIT0gTU1fUUNBTUVSQV9BUFBfSU5URVJBVElPTikgeworICAgICAgICAgICAgcHJpbnRmKCIgU25hcHNob3QgU3RhcnQvU3RvcCBGYWlscyBmb3IgQ2FtZXJhICVkIGluICVkIGl0ZXJhdGlvbiIsICBpLGopOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICB9CitlbmQ6CisgICAgaWYocmMgPT0gMCkgeworICAgICAgICBwcmludGYoIlx0KioqUGFzc2VkKioqXG4iKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcHJpbnRmKCJcdCoqKkZhaWxlZCoqKlxuIik7CisgICAgfQorICAgIExPR0QoIkVORCwgcmMgPSAlZFxuIiwgIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfZHRjX3NfMihtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHBzKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBpbnQgaSxqOworICAgIGludCByZXN1bHQgPSAwOworCisgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgVmlkZW8gb24gZnJvbnQgYW5kIGJhY2sgY2FtZXJhLi4uXG4iKTsKKyAgICBmb3IoaSA9IDA7IGkgPCBjYW1fYXBwcy0+bnVtX2NhbWVyYXM7IGkrKykgeworICAgICAgICBpZiggbW1fYXBwX29wZW4oaSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIGlmKHN5c3RlbV9kaW1lbnNpb25fc2V0KG15X2NhbV9hcHAuY2FtX29wZW4pICE9IE1NX0NBTUVSQV9PSyl7CisgICAgICAgICAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdGFydFByZXZpZXcobXlfY2FtX2FwcC5jYW1fb3BlbikpKSB7CisgICAgICAgICAgICBMT0dFKCIgc3RhcnRQcmV2aWV3KCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGogPSAwOyBqIDwgTU1fUUNBTUVSQV9BUFBfSU5URVJBVElPTjsgaisrKSB7CisgICAgICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UmVjb3JkaW5nKG15X2NhbV9hcHAuY2FtX29wZW4pKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBTdGFydFZpZGVvcmVjb3JkaW5nKCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKmlmKG1tX2NhbWVyYV9hcHBfdGltZWR3YWl0KCkgPT0gRVRJTUVET1VUKSB7CisgICAgICAgICAgICBMT0dFKCIgVmlkZW8gQ2FsbGJhY2sgbm90IHJlY2VpdmVkIGluIHRpbWVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9Ki8KKyAgICAgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdG9wUmVjb3JkaW5nKG15X2NhbV9hcHAuY2FtX29wZW4pKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBTdG9wdmlkZW9yZWNvcmRpbmcoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0b3BQcmV2aWV3KG15X2NhbV9hcHAuY2FtX29wZW4pKSkgeworICAgICAgICAgICAgTE9HRCgiIHN0YXJ0UHJldmlldygpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmKCBtbV9hcHBfY2xvc2UobXlfY2FtX2FwcC5jYW1fb3BlbikgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJtbV9hcHBfY2xvc2UoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpZihyZXN1bHQgIT0gTU1fUUNBTUVSQV9BUFBfSU5URVJBVElPTikgeworICAgICAgICAgICAgcHJpbnRmKCIgVmlkZW8gU3RhcnQvU3RvcCBGYWlscyBmb3IgQ2FtZXJhICVkIGluICVkIGl0ZXJhdGlvbiIsICBpLGopOworICAgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0ID0gMDsKKyAgICB9CitlbmQ6CisgICAgaWYocmMgPT0gMCkgeworICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgfQorICAgIExPR0QoIkVORCwgcmMgPSAlZFxuIiwgIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfZHRjX3NfMyhtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHBzKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBpbnQgaSxqOworICAgIGludCByZXN1bHQgPSAwOworCisgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgUkRJIFN0cmVhbSBvbiBmcm9udCBhbmQgYmFjayBjYW1lcmEuLi5cbiIpOworICAgIGlmKGNhbV9hcHBzLT5udW1fY2FtZXJhcyA9PSAwKSB7CisgICAgICAgIExPR0UoIlF1ZXJ5IEZhaWxlZDogTnVtIG9mIGNhbWVyYXMgPSAlZFxuIiwgY2FtX2FwcHMtPm51bV9jYW1lcmFzKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGZvcihpID0gMDsgaSA8IGNhbV9hcHBzLT5udW1fY2FtZXJhczsgaSsrKSB7CisgICAgICAgIGlmKCBtbV9hcHBfb3BlbihpKSAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYoc3lzdGVtX2RpbWVuc2lvbl9zZXQobXlfY2FtX2FwcC5jYW1fb3BlbikgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICAgICAgICAgIExPR0UoInN5c3RlbV9kaW1lbnNpb25fc2V0KCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yKGogPSAwOyBqIDwgTU1fUUNBTUVSQV9BUFBfSU5URVJBVElPTjsgaisrKSB7CisgICAgICAgICAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0UmRpKG15X2NhbV9hcHAuY2FtX29wZW4pKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBTdGFydFZpZGVvcmVjb3JkaW5nKCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKmlmKG1tX2NhbWVyYV9hcHBfdGltZWR3YWl0KCkgPT0gRVRJTUVET1VUKSB7CisgICAgICAgICAgICBMT0dFKCIgVmlkZW8gQ2FsbGJhY2sgbm90IHJlY2VpdmVkIGluIHRpbWVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9Ki8KKyAgICAgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICAgICAgaWYoIE1NX0NBTUVSQV9PSyAhPSAocmMgPSBzdG9wUmRpKG15X2NhbV9hcHAuY2FtX29wZW4pKSkgeworICAgICAgICAgICAgICAgIExPR0UoIiBTdG9wdmlkZW9yZWNvcmRpbmcoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiggbW1fYXBwX2Nsb3NlKG15X2NhbV9hcHAuY2FtX29wZW4pICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgZXJyPSVkXG4iLCByYyk7CisgICAgICAgICAgICByYyA9IC0xOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgaWYocmVzdWx0ICE9IE1NX1FDQU1FUkFfQVBQX0lOVEVSQVRJT04pIHsKKyAgICAgICAgICAgIHByaW50ZigiIFZpZGVvIFN0YXJ0L1N0b3AgRmFpbHMgZm9yIENhbWVyYSAlZCBpbiAlZCBpdGVyYXRpb24iLCAgaSxqKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgfQorZW5kOgorICAgIGlmKHJjID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJcblBhc3NlZFxuIik7CisgICAgfWVsc2V7CisgICAgICAgIHByaW50ZigiXG5GYWlsZWRcbiIpOworICAgIH0KKyAgICBMT0dEKCJFTkQsIHJjID0gJWRcbiIsICByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKlN0YXRzIFRlc3QgQ2FzZSovCitpbnQgbW1fYXBwX2R0Y19zXzUobW1fY2FtZXJhX2FwcF90ICpjYW1fYXBwcykKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgaW50IGksajsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgZnJvbnRfY2FtZXJhID0gMTsKKyAgICBpbnQgYmFja19jYW1lcmEgPSAwOworCisgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgUHJldmlldyBvbiBiYWNrIENhbWVyYSBhbmQgUkRJIG9uIEZyb250IGNhbWVyYS4uLlxuIik7CisKKyAgICBpZihtbV9hcHBfb3BlbihiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgYmFjayBjYW1lcmEgZXJyPSVkXG4iLCByYyk7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBpZihzeXN0ZW1fZGltZW5zaW9uX3NldChiYWNrX2NhbWVyYSkgIT0gTU1fQ0FNRVJBX09LKXsKKyAgICBMT0dFKCJzeXN0ZW1fZGltZW5zaW9uX3NldCgpIGVycj0lZFxuIiwgcmMpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiggTU1fQ0FNRVJBX09LICE9IChyYyA9IHN0YXJ0U3RhdHMoYmFja19jYW1lcmEpKSkgeworICAgICAgICBMT0dFKCIgYmFjayBjYW1lcmEgc3RhcnRQcmV2aWV3KCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKworICAgIGlmKCBNTV9DQU1FUkFfT0sgIT0gKHJjID0gc3RvcFN0YXRzKG15X2NhbV9hcHAuY2FtX29wZW4pKSkgeworICAgICAgICBMT0dEKCIgc3RhcnRQcmV2aWV3KCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBpZiggbW1fYXBwX2Nsb3NlKG15X2NhbV9hcHAuY2FtX29wZW4pICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCJtbV9hcHBfY2xvc2UoKSBlcnI9JWRcbiIsIHJjKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorZW5kOgorICAgIGlmKHJjID09IDApIHsKKyAgICAgICAgcHJpbnRmKCJcblBhc3NlZFxuIik7CisgICAgfWVsc2V7CisgICAgICAgIHByaW50ZigiXG5GYWlsZWRcbiIpOworICAgIH0KKyAgICBMT0dEKCJFTkQsIHJjID0gJWRcbiIsICByYyk7CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fYXBwX2dlbl9kdWFsX3Rlc3RfY2FzZXMoKQoreworICAgIGludCB0YyA9IDA7CisgICAgbWVtc2V0KG1tX2FwcF90YywgMCwgc2l6ZW9mKG1tX2FwcF90YykpOworICAgIGlmKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX2R0Y18wOworICAgIGlmKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX2R0Y18xOworICAgIGlmKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX2R0Y18yOworICAgIGlmKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX2R0Y18zOworICAgIGlmKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX2R0Y180OworICAgIGlmKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX2R0Y181OworICAgIGlmKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX2R0Y182OworICAgIGlmKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX2R0Y183OworICAgIGlmKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX2R0Y184OworICAgIGlmKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX2R0Y185OworICAgIGlmKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX2R0Y18xMDsKKyAgICBpZih0YyA8IE1NX1FDQU1fQVBQX1RFU1RfTlVNKSBtbV9hcHBfdGNbdGMrK10uZiA9IG1tX2FwcF9kdGNfMTE7CisgICAgaWYodGMgPCBNTV9RQ0FNX0FQUF9URVNUX05VTSkgbW1fYXBwX3RjW3RjKytdLmYgPSBtbV9hcHBfZHRjXzEyOworICAgIGlmKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX2R0Y18xMzsKKworICAgIHJldHVybiB0YzsKK30KKworaW50IG1tX2FwcF9kdWFsX3Rlc3RfZW50cnkobW1fY2FtZXJhX2FwcF90ICpjYW1fYXBwKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBpbnQgaSwgdGMgPSAwOworICAgIGludCBjYW1faWQgPSAwOworCisgICAgdGMgPSBtbV9hcHBfZ2VuX2R1YWxfdGVzdF9jYXNlcygpOworICAgIExPR0QoIlJ1bm5pbmcgJWQgdGVzdCBjYXNlc1xuIix0Yyk7CisgICAgZm9yKGkgPSAwOyBpIDwgdGM7IGkrKykgeworICAgICAgICBtbV9hcHBfdGNbaV0uciA9IG1tX2FwcF90Y1tpXS5mKGNhbV9hcHApOworICAgICAgICBpZihtbV9hcHBfdGNbaV0uciAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIHByaW50ZigiIHRlc3QgY2FzZSAlZCBlcnJvciA9ICVkLCBhYm9ydCB1bml0IHRlc3RpbmcgZW5naW5lISEhIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIGksIG1tX2FwcF90Y1tpXS5yKTsKKyAgICAgICAgICAgIHJjID0gbW1fYXBwX3RjW2ldLnI7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgIH0KK2VuZDoKKyAgICBwcmludGYoIm5UT1RBTF9UU0VUX0NBU0UgPSAlZCwgTlVNX1RFU1RfUkFOID0gJWQsIHJjPSVkXG4iLCB0YywgaSwgcmMpOworICAgIHJldHVybiByYzsKK30KKworCisKKwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX21haW5fbWVudS5jIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX21haW5fbWVudS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YzA0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfbWFpbl9tZW51LmMKQEAgLTAsMCArMSwyMDUyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJtbV9xY2FtZXJhX21haW5fbWVudS5oIgorI2luY2x1ZGUgIm1tX3FjYW1lcmFfYXBwLmgiCisjaW5jbHVkZSAibW1fcWNhbWVyYV9kYmcuaCIKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIE1hY3JvCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisjZGVmaW5lIE1JTihYLFkpICgoWCkgPCAoWSkgPyAoWCkgOiAoWSkpCisjZGVmaW5lIFZJREVPX0JVRkZFUl9TSVpFICAgICAgIChQUkVWSUVXX1dJRFRIICogUFJFVklFV19IRUlHSFQgKiAzLzIpCisjZGVmaW5lIFRIVU1CTkFJTF9CVUZGRVJfU0laRSAgIChUSFVNQk5BSUxfV0lEVEggKiBUSFVNQk5BSUxfSEVJR0hUICogMy8yKQorI2RlZmluZSBTTkFQU0hPVF9CVUZGRVJfU0laRSAgICAoUElDVFVSRV9XSURUSCAqIFBJQ1RVUkVfSEVJR0hUICogMy8yKQorLy9UT0RPOmNoZWNrIHRoaXMgTWFjcm9zIHdpdGggY3VycmVudCBhcHAuCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEZWZpbmVzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvLyNkZWZpbmUgVklERU9fRlJBTUVTX05VTSAgICAgIDQKKyNkZWZpbmUgVEhVTUJOQUlMX0ZSQU1FU19OVU0gIDEKKyNkZWZpbmUgU05BUFNIT1RfRlJBTUVTX05VTSAgIDEKKyNkZWZpbmUgTUFYX05VTV9GT1JNQVQgICAgICAgIDMyCisjZGVmaW5lIFpPT01fU1RFUCAgICAgICAgICAgICAyCisjZGVmaW5lIFpPT01fTUlOX1ZBTFVFICAgICAgICAwCisjZGVmaW5lIEVYUE9TVVJFX0NPTVBFTlNBVElPTl9NQVhJTVVNX05VTUVSQVRPUiAxMgorI2RlZmluZSBFWFBPU1VSRV9DT01QRU5TQVRJT05fTUlOSU1VTV9OVU1FUkFUT1IgLTEyCisjZGVmaW5lIEVYUE9TVVJFX0NPTVBFTlNBVElPTl9ERUZBVUxUX05VTUVSQVRPUiAwCisjZGVmaW5lIEVYUE9TVVJFX0NPTVBFTlNBVElPTl9ERU5PTUlOQVRPUiA2CisKKy8vVE9ETzogZmluZCBjb3JyZWN0IHZhbHVlcyBvZiBDb250cmFzdCBkZWZpbmVzLgorI2RlZmluZSBDQU1FUkFfTUlOX0NPTlRSQVNUICAgIDAKKyNkZWZpbmUgQ0FNRVJBX0RFRl9DT05UUkFTVCAgICA1CisjZGVmaW5lIENBTUVSQV9NQVhfQ09OVFJBU1QgICAgMTAKKyNkZWZpbmUgQ0FNRVJBX0NPTlRSQVNUX1NURVAgICAxCisKKy8vVE9ETzogZmluZCBjb3JyZWN0IHZhbHVlcyBvZiBCcmlnaHRuZXNzIGRlZmluZXMuCisjZGVmaW5lIENBTUVSQV9NSU5fQlJJR0hUTkVTUyAgMAorI2RlZmluZSBDQU1FUkFfREVGX0JSSUdIVE5FU1MgIDMKKyNkZWZpbmUgQ0FNRVJBX01BWF9CUklHSFRORVNTICA2CisjZGVmaW5lIENBTUVSQV9CUklHSFRORVNTX1NURVAgMQorCisvL1RPRE86IGZpbmQgY29ycmVjdCB2YWx1ZXMgb2YgU2F0dXJhdGlvbiBkZWZpbmVzLgorI2RlZmluZSBDQU1FUkFfTUlOX1NBVFVSQVRJT04gIDAKKyNkZWZpbmUgQ0FNRVJBX0RFRl9TQVRVUkFUSU9OICA1CisjZGVmaW5lIENBTUVSQV9NQVhfU0FUVVJBVElPTiAgMTAKKyNkZWZpbmUgQ0FNRVJBX1NBVFVSQVRJT05fU1RFUCAxCisKKyNkZWZpbmUgQ0FNRVJBX01JTl9TSEFSUE5FU1MgMAorI2RlZmluZSBDQU1FUkFfTUFYX1NIQVJQTkVTUyAxMAorI2RlZmluZSBDQU1FUkFfREVGX1NIQVJQTkVTUyA1CisjZGVmaW5lIENBTUVSQV9TSEFSUE5FU1NfU1RFUCAxCisKK2NvbnN0IENBTUVSQV9NQUlOX01FTlVfVEJMX1QgY2FtZXJhX21haW5fbWVudV90YmxbXSA9IHsKKyAge1NUQVJUX1BSRVZJRVcsICAgICAgICAgICAgICAiU3RhcnQgcHJldmlldyJ9LAorICB7U1RPUF9QUkVWSUVXLCAgICAgICAgICAgICAgICJTdG9wIHByZXZpZXcvdmlkZW8ifSwKKyAge1NFVF9XSElURV9CQUxBTkNFLCAgICAgICAgICAiU2V0IHdoaXRlIGJhbGFuY2UgbW9kZSJ9LAorICB7U0VUX1RJTlRMRVNTX0VOQUJMRSwgICAgICAgICJTZXQgVGludGxlc3MgRW5hYmxlIn0sCisgIHtTRVRfVElOVExFU1NfRElTQUJMRSwgICAgICAgIlNldCBUaW50bGVzcyBEaXNhYmxlIn0sCisgIHtTRVRfRVhQX01FVEVSSU5HLCAgICAgICAgICAgIlNldCBleHBvc3VyZSBtZXRlcmluZyBtb2RlIn0sCisgIHtUT0dHTEVfSVJMRUQsICAgICAgICAgICAgICAgIlRvZ2dsZSBJUiBNb2RlLCBEZWZhdWx0IGlzIE9mZiJ9LAorICB7VE9HR0xFX0VaVFVORSwgICAgICAgICAgICAgICJUb2dnbGUgRVp0dW5lLiBEZWZhdWx0IEVaVHVuZSBPZmYifSwKKyAge1NFVF9JU08sICAgICAgICAgICAgICAgICAgICAiSVNPIGNoYW5nZXMuIn0sCisgIHtCUklHSFRORVNTX0dPVE9fU1VCTUVOVSwgICAgIkJyaWdodG5lc3MgY2hhbmdlcy4ifSwKKyAge0NPTlRSQVNUX0dPVE9fU1VCTUVOVSwgICAgICAiQ29udHJhc3QgY2hhbmdlcy4ifSwKKyAge0VWX0dPVE9fU1VCTUVOVSwgICAgICAgICAgICAiRVYgY2hhbmdlcy4ifSwKKyAge1NBVFVSQVRJT05fR09UT19TVUJNRU5VLCAgICAiU2F0dXJhdGlvbiBjaGFuZ2VzLiJ9LAorICB7U0VUX1pPT00sICAgICAgICAgICAgICAgICAgICJTZXQgRGlnaXRhbCBab29tLiJ9LAorICB7U0VUX1NIQVJQTkVTUywgICAgICAgICAgICAgICJTZXQgU2hhcnBuZXNzLiJ9LAorICB7VEFLRV9KUEVHX1NOQVBTSE9ULCAgICAgICAgICJUYWtlIGEgc25hcHNob3QifSwKKyAge1NUQVJUX1JFQ09SRElORywgICAgICAgICAgICAiU3RhcnQgUkVDT1JESU5HIn0sCisgIHtTVE9QX1JFQ09SRElORywgICAgICAgICAgICAgIlN0b3AgUkVDT1JESU5HIn0sCisgIHtCRVNUX1NIT1QsICAgICAgICAgICAgICAgICAgIlNldCBiZXN0LXNob3QgbW9kZSJ9LAorICB7TElWRV9TSE9ULCAgICAgICAgICAgICAgICAgICJUYWtlIGEgbGl2ZSBzbmFwc2hvdCJ9LAorICB7RkxBU0hfTU9ERVMsICAgICAgICAgICAgICAgICJTZXQgRmxhc2ggbW9kZXMifSwKKyAge1RPR0dMRV9aU0wsICAgICAgICAgICAgICAgICAiVG9nZ2xlIFpTTCBPbi9PZmYifSwKKyAge1RBS0VfUkFXX1NOQVBTSE9ULCAgICAgICAgICAiVGFrZSBSQVcgc25hcHNob3QifSwKKyAge1NXSVRDSF9TTkFQX1JFU09MVVRJT04sICAgICAiU2VsZWN0IEpwZWcgcmVzb2x1dGlvbiJ9LAorICB7VE9HR0xFX1dOUiwgICAgICAgICAgICAgICAgICJUb2dnbGUgV2F2ZWxldCBEZW5vaXNlIn0sCisgIHtFWElULCAgICAgICAgICAgICAgICAgICAgICAgIkV4aXQifQorfTsKKworQ0FNRVJBX1NFTlNPUl9NRU5VX1RMQl9UIHNlbnNvcl90YmxbXSA9IHsKKyAgICAgICAgeyJQcmltYXJ5IENhbWVyYSIsICAgICAgMH0sCisgICAgICAgIHsiU2Vjb25kYXJ5IENhbWVyYSIsICAgIDB9LAorICAgICAgICB7IkNhbWVyYSBTZW5zb3IgMyIsICAgICAwfSwKKyAgICAgICAgeyJDYW1lcmEgU2Vuc29yIDQiLCAgICAgMH0KK307CisKK2NvbnN0IENBTUVSQV9CUklHSFRORVNTX1RCTF9UIGJyaWdodG5lc3NfY2hhbmdlX3RibFtdID0geworICB7SU5DX0JSSUdIVE5FU1MsICJJbmNyZWFzZSBCcmlnaHRuZXNzIGJ5IG9uZSBzdGVwLiJ9LAorICB7REVDX0JSSUdIVE5FU1MsICJEZWNyZWFzZSBCcmlnaHRuZXNzIGJ5IG9uZSBzdGVwLiJ9LAorfTsKKworY29uc3QgQ0FNRVJBX0NPTlRSU1RfVEJMX1QgY29udHJhc3RfY2hhbmdlX3RibFtdID0geworICB7SU5DX0NPTlRSQVNULCAiSW5jcmVhc2UgQ29udHJhc3QgYnkgb25lIHN0ZXAuIn0sCisgIHtERUNfQ09OVFJBU1QsICJEZWNyZWFzZSBDb250cmFzdCBieSBvbmUgc3RlcC4ifSwKK307CisKK2NvbnN0IENBTUVSQV9FVl9UQkxfVCBjYW1lcmFfRVZfdGJsW10gPSB7CisgIHtJTkNSRUFTRV9FViwgIkluY3JlYXNlIEVWIGJ5IG9uZSBzdGVwLiJ9LAorICB7REVDUkVBU0VfRVYsICJEZWNyZWFzZSBFViBieSBvbmUgc3RlcC4ifSwKK307CisKK2NvbnN0IENBTUVSQV9TQVRVUkFUSU9OX1RCTF9UIGNhbWVyYV9zYXR1cmF0aW9uX3RibFtdID0geworICB7SU5DX1NBVFVSQVRJT04sICJJbmNyZWFzZSBTYXR1YXRpb24gYnkgb25lIHN0ZXAuIn0sCisgIHtERUNfU0FUVVJBVElPTiwgIkRlY3JlYXNlIFNhdHVhdGlvbiBieSBvbmUgc3RlcC4ifSwKK307CisKK2NvbnN0IENBTUVSQV9TSEFSUE5FU1NfVEJMX1QgY2FtZXJhX3NoYXJwbmVzc190YmxbXSA9IHsKKyAge0lOQ19TSEFSUE5FU1MsICJJbmNyZWFzZSBTaGFycG5lc3MuIn0sCisgIHtERUNfU0hBUlBORVNTLCAiRGVjcmVhc2UgU2hhcnBuZXNzLiJ9LAorfTsKKworY29uc3QgV0hJVEVfQkFMQU5DRV9UQkxfVCB3aGl0ZV9iYWxhbmNlX3RibFtdID0geworICB7ICAgV0JfQVVUTywgICAgICAgICAgICAgICAiV2hpdGUgQmFsYW5jZSAtIEF1dG8ifSwKKyAgeyAgIFdCX0lOQ0FOREVTQ0VOVCwgICAgICAgIldoaXRlIEJhbGFuY2UgLSBJbmNhbmRlc2NlbnQifSwKKyAgeyAgIFdCX0ZMVU9SRVNDRU5ULCAgICAgICAgIldoaXRlIEJhbGFuY2UgLSBGbHVvcmVzY2VudCJ9LAorICB7ICAgV0JfV0FSTV9GTFVPUkVTQ0VOVCwgICAiV2hpdGUgQmFsYW5jZSAtIFdhcm0gRmx1b3Jlc2NlbnQifSwKKyAgeyAgIFdCX0RBWUxJR0hULCAgICAgICAgICAgIldoaXRlIEJhbGFuY2UgLSBEYXlsaWdodCJ9LAorICB7ICAgV0JfQ0xPVURZX0RBWUxJR0hULCAgICAiV2hpdGUgQmFsYW5jZSAtIENsb3VkeSBEYXlsaWdodCJ9LAorICB7ICAgV0JfVFdJTElHSFQsICAgICAgICAgICAiV2hpdGUgQmFsYW5jZSAtIFR3aWxpZ2h0In0sCisgIHsgICBXQl9TSEFERSwgICAgICAgICAgICAgICJXaGl0ZSBCYWxhbmNlIC0gU2hhZGUifSwKK307CisKK2NvbnN0IEdFVF9DVFJMX1RCTF9UIGdldF9jdHJsX3RibFtdID0geworICB7ICAgICBXSElURV9CQUxBTkNFX1NUQVRFLCAgICAgICAgICAgICJHZXQgd2hpdGUgYmFsYW5jZSBzdGF0ZSAoYXV0by9vZmYpIn0sCisgIHsgICAgIFdISVRFX0JBTEFOQ0VfVEVNUEVSQVRVUkUsICAgICAgIkdldCB3aGl0ZSBiYWxhbmNlIHRlbXBlcmF0dXJlIn0sCisgIHsgICAgIEJSSUdIVE5FU1NfQ1RSTCwgICAgICAgICAgICAgICAgIkdldCBicmlnaHRuZXNzIHZhbHVlIn0sCisgIHsgICAgIEVWLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdldCBleHBvc3VyZSB2YWx1ZSJ9LAorICB7ICAgICBDT05UUkFTVF9DVFJMLCAgICAgICAgICAgICAgICAgICJHZXQgY29udHJhc3QgdmFsdWUifSwKKyAgeyAgICAgU0FUVVJBVElPTl9DVFJMLCAgICAgICAgICAgICAgICAiR2V0IHNhdHVyYXRpb24gdmFsdWUifSwKKyAgeyAgICAgU0hBUlBORVNTX0NUUkwsICAgICAgICAgICAgICAgICAiR2V0IHNoYXJwbmVzcyB2YWx1ZSJ9LAorfTsKKworY29uc3QgRVhQX01FVEVSSU5HX1RCTF9UIGV4cF9tZXRlcmluZ190YmxbXSA9IHsKKyAgeyAgIEFVVE9fRVhQX0ZSQU1FX0FWRywgICAgICAgICAgIkV4cG9zdXJlIE1ldGVyaW5nIC0gRnJhbWUgQXZlcmFnZSJ9LAorICB7ICAgQVVUT19FWFBfQ0VOVEVSX1dFSUdIVEVELCAgICAiRXhwb3N1cmUgTWV0ZXJpbmcgLSBDZW50ZXIgV2VpZ2h0ZWQifSwKKyAgeyAgIEFVVE9fRVhQX1NQT1RfTUVURVJJTkcsICAgICAgIkV4cG9zdXJlIE1ldGVyaW5nIC0gU3BvdCBNZXRlcmluZyJ9LAorICB7ICAgQVVUT19FWFBfU01BUlRfTUVURVJJTkcsICAgICAiRXhwb3N1cmUgTWV0ZXJpbmcgLSBTbWFydCBNZXRlcmluZyJ9LAorICB7ICAgQVVUT19FWFBfVVNFUl9NRVRFUklORywgICAgICAiRXhwb3N1cmUgTWV0ZXJpbmcgLSBVc2VyIE1ldGVyaW5nIn0sCisgIHsgICBBVVRPX0VYUF9TUE9UX01FVEVSSU5HX0FEViwgICJFeHBvc3VyZSBNZXRlcmluZyAtIFNwb3QgTWV0ZXJpbmcgQWR2In0sCisgIHsgICBBVVRPX0VYUF9DRU5URVJfV0VJR0hURURfQURWLCJFeHBvc3VyZSBNZXRlcmluZyAtIENlbnRlciBXZWlnaHRlZCBBZHYifSwKK307CisKK2NvbnN0IElTT19UQkxfVCBpc29fdGJsW10gPSB7CisgIHsgICBJU09fQVVUTywgICAiSVNPOiBBdXRvIn0sCisgIHsgICBJU09fREVCTFVSLCAiSVNPOiBEZWJsdXIifSwKKyAgeyAgIElTT18xMDAsICAgICJJU086IDEwMCJ9LAorICB7ICAgSVNPXzIwMCwgICAgIklTTzogMjAwIn0sCisgIHsgICBJU09fNDAwLCAgICAiSVNPOiA0MDAifSwKKyAgeyAgIElTT184MDAsICAgICJJU086IDgwMCJ9LAorICB7ICAgSVNPXzE2MDAsICAgIklTTzogMTYwMCJ9LAorfTsKKworY29uc3QgWk9PTV9UQkxfVCB6b29tX3RibFtdID0geworICB7ICAgWk9PTV9JTiwgICJab29tIEluIG9uZSBzdGVwIn0sCisgIHsgICBaT09NX09VVCwgIlpvb20gT3V0IG9uZSBzdGVwIn0sCit9OworCitjb25zdCBCRVNUU0hPVF9NT0RFX1RCVF9UIGJlc3RzaG90X21vZGVfdGJsW10gPSB7CisgIHtCRVNUU0hPVF9BVVRPLCAgICAgICAgICAgIkJlc3RzaG90IE1vZGU6IEF1dG8ifSwKKyAge0JFU1RTSE9UX0FDVElPTiwgICAgICAgICAiQmVzdHNob3QgTW9kZTogQWN0aW9uIn0sCisgIHtCRVNUU0hPVF9QT1JUUkFJVCwgICAgICAgIkJlc3RzaG90IE1vZGU6IFBvcnRyYWl0In0sCisgIHtCRVNUU0hPVF9MQU5EU0NBUEUsICAgICAgIkJlc3RzaG90IE1vZGU6IExhbmRzY2FwZSJ9LAorICB7QkVTVFNIT1RfTklHSFQsICAgICAgICAgICJCZXN0c2hvdCBNb2RlOiBOaWdodCJ9LAorICB7QkVTVFNIT1RfTklHSFRfUE9SVFJBSVQsICJCZXN0c2hvdCBNb2RlOiBOaWdodCBQb3J0cmFpdCJ9LAorICB7QkVTVFNIT1RfVEhFQVRSRSwgICAgICAgICJCZXN0c2hvdCBNb2RlOiBUaGVhdHJlIn0sCisgIHtCRVNUU0hPVF9CRUFDSCwgICAgICAgICAgIkJlc3RzaG90IE1vZGU6IEJlYWNoIn0sCisgIHtCRVNUU0hPVF9TTk9XLCAgICAgICAgICAgIkJlc3RzaG90IE1vZGU6IFNub3cifSwKKyAge0JFU1RTSE9UX1NVTlNFVCwgICAgICAgICAiQmVzdHNob3QgTW9kZTogU3Vuc2V0In0sCisgIHtCRVNUU0hPVF9BTlRJU0hBS0UsICAgICAgIkJlc3RzaG90IE1vZGU6IEFudGlzaGFrZSJ9LAorICB7QkVTVFNIT1RfRklSRVdPUktTLCAgICAgICJCZXN0c2hvdCBNb2RlOiBGaXJld29ya3MifSwKKyAge0JFU1RTSE9UX1NQT1JUUywgICAgICAgICAiQmVzdHNob3QgTW9kZTogU3BvcnRzIn0sCisgIHtCRVNUU0hPVF9QQVJUWSwgICAgICAgICAgIkJlc3RzaG90IE1vZGU6IFBhcnR5In0sCisgIHtCRVNUU0hPVF9DQU5ETEVMSUdIVCwgICAgIkJlc3RzaG90IE1vZGU6IENhbmRsZWxpZ2h0In0sCisgIHtCRVNUU0hPVF9BU0QsICAgICAgICAgICAgIkJlc3RzaG90IE1vZGU6IEFTRCJ9LAorICB7QkVTVFNIT1RfQkFDS0xJR0hULCAgICAgICJCZXN0c2hvdCBNb2RlOiBCYWNrbGlnaHQifSwKKyAge0JFU1RTSE9UX0ZMT1dFUlMsICAgICAgICAiQmVzdHNob3QgTW9kZTogRmxvd2VycyJ9LAorICB7QkVTVFNIT1RfQVIsICAgICAgICAgICAgICJCZXN0c2hvdCBNb2RlOiBBdWdtZW50ZWQgUmVhbGl0eSJ9LAorICB7QkVTVFNIT1RfSERSLCAgICAgICAgICAgICJCZXN0c2hvdCBNb2RlOiBIRFIifSwKK307CisKK2NvbnN0IEZMQVNIX01PREVfVEJMX1QgZmxhc2htb2Rlc190YmxbXSA9IHsKKyAgeyAgIEZMQVNIX01PREVfT0ZGLCAgICJGbGFzaCBNb2RlIE9mZiJ9LAorICB7ICAgRkxBU0hfTU9ERV9BVVRPLCAgIkZsYXNoIE1vZGUgQXV0byJ9LAorICB7ICAgRkxBU0hfTU9ERV9PTiwgICAgIkZsYXNoIE1vZGUgT24ifSwKKyAgeyAgIEZMQVNIX01PREVfVE9SQ0gsICJGbGFzaCBNb2RlIFRvcmNoIn0sCit9OworCitESU1FTlNJT05fVEJMX1QgZGltZW5zaW9uX3RibFtdID0gewore1ZHQV9XSURUSCwgICAgICBWR0FfSEVJR0hULCAgICAgICJWR0EiLCAgICJTaXplOiBWR0EgPDY0MHg0ODA+IiAgICwgMH0sCit7TVAxX1dJRFRILCAgICAgIE1QMV9IRUlHSFQsICAgICAgIjFNUCIsICAgIlNpemU6IDFNUCA8MTI4MHg5NjA+IiAgLCAwfSwKK3tNUDVfV0lEVEgsICAgICAgTVA1X0hFSUdIVCwgICAgICAiNU1QIiwgICAiU2l6ZTogNU1QIDwyNTkyeDE5NDQ+IiwgIDB9LAore01QOF9XSURUSCwgICAgICBNUDhfSEVJR0hULCAgICAgICI4TVAiLCAgICJTaXplOiA4TVAgPDMyNjR4MjQ0OD4iLCAgMH0sCit7TVAxMl9XSURUSCwgICAgIE1QMTJfSEVJR0hULCAgICAgIjEyTVAiLCAgIlNpemU6IDEyTVAgPDQwMDB4MzAwMD4iLCAwfSwKK307CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGb3J3YXJkIGRlY2xhcmF0aW9ucworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLy9zdGF0aWMgdm9pZCBzeXN0ZW1fZGltZW5zaW9uX3NldChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopOworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFN0YXRpYyBnbG9iYWwgdmFyaWFibGVzCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitVU0VSX0lOUFVUX0RJU1BMQVlfVCBpbnB1dF9kaXNwbGF5OworaW50IHByZXZpZXdfdmlkZW9fcmVzb2x1dGlvbl9mbGFnID0gMDsKKworLy9UT0RPOiBkZWZhdWx0IHZhbHVlcy4KKyNpZiAxCitpbnQgYnJpZ2h0bmVzcyA9IENBTUVSQV9ERUZfQlJJR0hUTkVTUzsKK2ludCBjb250cmFzdCA9IENBTUVSQV9ERUZfQ09OVFJBU1Q7CitpbnQgc2F0dXJhdGlvbiA9IENBTUVSQV9ERUZfU0FUVVJBVElPTjsKK2ludCBzaGFycG5lc3MgPSBDQU1FUkFfREVGX1NIQVJQTkVTUzsKK2ludCBldl9udW1lcmF0b3IgPSAwOworCisjZWxzZQoraW50IGJyaWdodG5lc3MgPSAwOworaW50IGNvbnRyYXN0ID0gMDsKK2ludCBzYXR1cmF0aW9uID0gMDsKK2ludCBzaGFycG5lc3MgPSAwOworI2VuZGlmCisvL1RPRE86IGZpbmQgbmV3IG1ldGhvZCB0byBjYWxjdWxhdGUgZXYuCisvL2ludDMyX3QgZXZfbnVtZXJhdG9yID0gRVhQT1NVUkVfQ09NUEVOU0FUSU9OX0RFRkFVTFRfTlVNRVJBVE9SOworCisvL1RPRE86CisvL2Zwc19tb2RlX3QgZnBzX21vZGUgPSBGUFNfTU9ERV9GSVhFRDsKK2ludCB6b29tX2xldmVsOworaW50IHpvb21fbWF4X3ZhbHVlOworaW50IGNhbV9pZDsKK2ludCBpc19yZWMgPSAwOworCisKK3N0YXRpYyBpbnQgc3VibWFpbigpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgLSBrZXlwcmVzc190b19ldmVudCAtCisgKgorICogREVTQ1JJUFRJT046CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBrZXlwcmVzc190b19ldmVudChjaGFyIGtleXByZXNzKQoreworICBpbnQgb3V0X2J1ZiA9IElOVkFMSURfS0VZX1BSRVNTOworICBpZiAoKGtleXByZXNzID49ICdBJyAmJiBrZXlwcmVzcyA8PSAnWicpIHx8CisgICAgKGtleXByZXNzID49ICdhJyAmJiBrZXlwcmVzcyA8PSAneicpKSB7CisgICAgb3V0X2J1ZiA9IHRvbG93ZXIoa2V5cHJlc3MpOworICAgIG91dF9idWYgPSBvdXRfYnVmIC0gJ2EnOworICB9IGVsc2UgaWYgKGtleXByZXNzID49ICcwJyAmJiBrZXlwcmVzcyA8PSAnOScpIHsKKyAgICBvdXRfYnVmID0ga2V5cHJlc3MgLSAnMCc7CisgIH0KKyAgcmV0dXJuIG91dF9idWY7Cit9CisKK2ludCBuZXh0X21lbnUobWVudV9pZF9jaGFuZ2VfdCBjdXJyZW50X21lbnVfaWQsIGNoYXIga2V5cHJlc3MsIGNhbWVyYV9hY3Rpb25fdCAqIGFjdGlvbl9pZF9wdHIsIGludCAqIGFjdGlvbl9wYXJhbSkKK3sKKyAgaW50IG91dHB1dF90b19ldmVudDsKKyAgbWVudV9pZF9jaGFuZ2VfdCBuZXh0X21lbnVfaWQgPSBNRU5VX0lEX0lOVkFMSUQ7CisgICogYWN0aW9uX2lkX3B0ciA9IEFDVElPTl9OT19BQ1RJT047CisKKyAgb3V0cHV0X3RvX2V2ZW50ID0ga2V5cHJlc3NfdG9fZXZlbnQoa2V5cHJlc3MpOworICBMT0dEKCJjdXJyZW50X21lbnVfaWQ9JWRcbiIsY3VycmVudF9tZW51X2lkKTsKKyAgcHJpbnRmKCJvdXRwdXRfdG9fZXZlbnQ9JWRcbiIsb3V0cHV0X3RvX2V2ZW50KTsKKyAgc3dpdGNoKGN1cnJlbnRfbWVudV9pZCkgeworICAgIGNhc2UgTUVOVV9JRF9NQUlOOgorICAgICAgc3dpdGNoKG91dHB1dF90b19ldmVudCkgeworICAgICAgICBjYXNlIFNUQVJUX1BSRVZJRVc6CisgICAgICAgICAgKiBhY3Rpb25faWRfcHRyID0gQUNUSU9OX1NUQVJUX1BSRVZJRVc7CisgICAgICAgICAgTE9HRCgiU1RBUlRfUFJFVklFV1xuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUF9QUkVWSUVXOgorICAgICAgICAgICogYWN0aW9uX2lkX3B0ciA9IEFDVElPTl9TVE9QX1BSRVZJRVc7CisgICAgICAgICAgTE9HRCgiU1RPUF9QUkVWSUVXXG4iKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNFVF9XSElURV9CQUxBTkNFOgorICAgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfV0hJVEVCQUxBTkNFQ0hBTkdFOworICAgICAgICAgIExPR0QoIm5leHRfbWVudV9pZCA9IE1FTlVfSURfV0hJVEVCQUxBTkNFQ0hBTkdFID0gJWRcbiIsIG5leHRfbWVudV9pZCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTRVRfVElOVExFU1NfRU5BQkxFOgorICAgICAgICAgICogYWN0aW9uX2lkX3B0ciA9IEFDVElPTl9TRVRfVElOVExFU1NfRU5BQkxFOworICAgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfTUFJTjsKKyAgICAgICAgICBMT0dEKCJuZXh0X21lbnVfaWQgPSBNRU5VX0lEX1RJTlRMRVNTRU5BQkxFID0gJWRcbiIsIG5leHRfbWVudV9pZCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTRVRfVElOVExFU1NfRElTQUJMRToKKyAgICAgICAgICAqIGFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fU0VUX1RJTlRMRVNTX0RJU0FCTEU7CisgICAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9NQUlOOworICAgICAgICAgIExPR0QoIm5leHRfbWVudV9pZCA9IE1FTlVfSURfVElOVExFU1NESVNBQkxFID0gJWRcbiIsIG5leHRfbWVudV9pZCk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTRVRfRVhQX01FVEVSSU5HOgorICAgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfRVhQTUVURVJJTkdDSEFOR0U7CisgICAgICAgICAgTE9HRCgibmV4dF9tZW51X2lkID0gTUVOVV9JRF9FWFBNRVRFUklOR0NIQU5HRSA9ICVkXG4iLCBuZXh0X21lbnVfaWQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJSSUdIVE5FU1NfR09UT19TVUJNRU5VOgorICAgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfQlJJR0hUTkVTU0NIQU5HRTsKKyAgICAgICAgICBMT0dEKCJuZXh0X21lbnVfaWQgPSBNRU5VX0lEX0JSSUdIVE5FU1NDSEFOR0UgPSAlZFxuIiwgbmV4dF9tZW51X2lkKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENPTlRSQVNUX0dPVE9fU1VCTUVOVToKKyAgICAgICAgICBuZXh0X21lbnVfaWQgPSBNRU5VX0lEX0NPTlRSQVNUQ0hBTkdFOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRVZfR09UT19TVUJNRU5VOgorICAgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfRVZDSEFOR0U7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTQVRVUkFUSU9OX0dPVE9fU1VCTUVOVToKKyAgICAgICAgICBuZXh0X21lbnVfaWQgPSBNRU5VX0lEX1NBVFVSQVRJT05DSEFOR0U7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBUT0dHTEVfRVpUVU5FOgorICAgICAgICAgICogYWN0aW9uX2lkX3B0ciA9IEFDVElPTl9UT0dHTEVfRVpUVU5FOworICAgICAgICAgIExPR0QoIm5leHRfbWVudV9pZCA9IE1FTlVfSURfVE9HR0xFIEVaVFVORSA9ICVkXG4iLCBuZXh0X21lbnVfaWQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRPR0dMRV9JUkxFRDoKKyAgICAgICAgICAqIGFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fVE9HR0xFX0lSX01PREU7CisgICAgICAgICAgTE9HRCgibmV4dF9tZW51X2lkID0gTUVOVV9JRF9UT0dHTEUgSVJMRUQgPSAlZFxuIiwgbmV4dF9tZW51X2lkKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNFVF9JU086CisgICAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9JU09DSEFOR0U7CisgICAgICAgICAgTE9HRCgibmV4dF9tZW51X2lkID0gTUVOVV9JRF9JU09DSEFOR0UgPSAlZFxuIiwgbmV4dF9tZW51X2lkKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNFVF9aT09NOgorICAgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfWk9PTUNIQU5HRTsKKyAgICAgICAgICBMT0dEKCJuZXh0X21lbnVfaWQgPSBNRU5VX0lEX1pPT01DSEFOR0UgPSAlZFxuIiwgbmV4dF9tZW51X2lkKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJFU1RfU0hPVDoKKyAgICAgICAgICBuZXh0X21lbnVfaWQgPSBNRU5VX0lEX0JFU1RTSE9UOworICAgICAgICAgIExPR0QoIm5leHRfbWVudV9pZCA9IE1FTlVfSURfQkVTVFNIT1QgPSAlZFxuIiwgbmV4dF9tZW51X2lkKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExJVkVfU0hPVDoKKyAgICAgICAgICAqIGFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fVEFLRV9MSVZFX1NOQVBTSE9UOworICAgICAgICAgIExPR0QoIlxuVGFraW5nIExpdmUgc25hcHNob3RcbiIpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRkxBU0hfTU9ERVM6CisgICAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9GTEFTSE1PREU7CisgICAgICAgICAgTE9HRCgibmV4dF9tZW51X2lkID0gTUVOVV9JRF9GTEFTSE1PREUgPSAlZFxuIiwgbmV4dF9tZW51X2lkKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNFVF9TSEFSUE5FU1M6CisgICAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9TSEFSUE5FU1NDSEFOR0U7CisgICAgICAgICAgTE9HRCgibmV4dF9tZW51X2lkID0gTUVOVV9JRF9TSEFSUE5FU1NDSEFOR0UgPSAlZFxuIiwgbmV4dF9tZW51X2lkKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNXSVRDSF9TTkFQX1JFU09MVVRJT046CisgICAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9TV0lUQ0hfUkVTOworICAgICAgICAgIExPR0QoIm5leHRfbWVudV9pZCA9IE1FTlVfSURfU1dJVENIX1JFUyA9ICVkXG4iLCBuZXh0X21lbnVfaWQpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVEFLRV9KUEVHX1NOQVBTSE9UOgorICAgICAgICAgICogYWN0aW9uX2lkX3B0ciA9IEFDVElPTl9UQUtFX0pQRUdfU05BUFNIT1Q7CisgICAgICAgICAgcHJpbnRmKCJcbiBUYWtpbmcgSlBFRyBzbmFwc2hvdFxuIik7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVEFSVF9SRUNPUkRJTkc6CisgICAgICAgICAgKiBhY3Rpb25faWRfcHRyID0gQUNUSU9OX1NUQVJUX1JFQ09SRElORzsKKyAgICAgICAgICBMT0dEKCJTdGFydCByZWNvcmRpbmdcbiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUT1BfUkVDT1JESU5HOgorICAgICAgICAgICogYWN0aW9uX2lkX3B0ciA9IEFDVElPTl9TVE9QX1JFQ09SRElORzsKKyAgICAgICAgICBMT0dEKCJTdG9wIHJlY29yZGluZ1xuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVE9HR0xFX1pTTDoKKyAgICAgICAgICAqIGFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fVE9HR0xFX1pTTDsKKyAgICAgICAgICBMT0dEKCJUb2dnbGUgWlNMXG4iKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQUtFX1JBV19TTkFQU0hPVDoKKyAgICAgICAgICAgICogYWN0aW9uX2lkX3B0ciA9IEFDVElPTl9UQUtFX1JBV19TTkFQU0hPVDsKKyAgICAgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfTUFJTjsKKyAgICAgICAgICAgIExPR0QoIkNhcHR1cmUgUkFXXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRPR0dMRV9XTlI6CisgICAgICAgICAgICAqIGFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fVE9HR0xFX1dOUjsKKyAgICAgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfTUFJTjsKKyAgICAgICAgICAgIExPR0QoIlRvZ2dsZSBXTlIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVYSVQ6CisgICAgICAgICAgKiBhY3Rpb25faWRfcHRyID0gQUNUSU9OX0VYSVQ7CisgICAgICAgICAgTE9HRCgiRXhpdCBcbiIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfTUFJTjsKKyAgICAgICAgICBMT0dEKCJuZXh0X21lbnVfaWQgPSBNRU5VX0lEX01BSU4gPSAlZFxuIiwgbmV4dF9tZW51X2lkKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRU5VX0lEX1NXSVRDSF9SRVM6CisgICAgICAgIHByaW50ZigiTUVOVV9JRF9TV0lUQ0hfUkVTXG4iKTsKKyAgICAgICAgKmFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fU1dJVENIX1JFU09MVVRJT047CisgICAgICAgICphY3Rpb25fcGFyYW0gPSBvdXRwdXRfdG9fZXZlbnQ7CisgICAgICAgIGludCBhdmFpbGFibGVfc2l6ZXMgPSBzaXplb2YoZGltZW5zaW9uX3RibCkvc2l6ZW9mKGRpbWVuc2lvbl90YmxbMF0pOworICAgICAgICBpZiAoICggKmFjdGlvbl9wYXJhbSA+PSAwICkgJiYKKyAgICAgICAgICAgICAoICphY3Rpb25fcGFyYW0gPCBhdmFpbGFibGVfc2l6ZXMgKSAmJgorICAgICAgICAgICAgICggZGltZW5zaW9uX3RibFsqYWN0aW9uX3BhcmFtXS5zdXBwb3J0ZWQgKSkgeworICAgICAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9NQUlOOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgIG5leHRfbWVudV9pZCA9IGN1cnJlbnRfbWVudV9pZDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgTUVOVV9JRF9TRU5TT1JTOgorICAgICAgICBuZXh0X21lbnVfaWQgPSBNRU5VX0lEX01BSU47CisgICAgICAgICphY3Rpb25faWRfcHRyID0gQUNUSU9OX1NXSVRDSF9DQU1FUkE7CisgICAgICAgICphY3Rpb25fcGFyYW0gPSBvdXRwdXRfdG9fZXZlbnQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRU5VX0lEX1dISVRFQkFMQU5DRUNIQU5HRToKKyAgICAgIHByaW50ZigiTUVOVV9JRF9XSElURUJBTEFOQ0VDSEFOR0VcbiIpOworICAgICAgaWYgKG91dHB1dF90b19ldmVudCA+PSBXQl9NQVgpIHsKKyAgICAgICAgbmV4dF9tZW51X2lkID0gY3VycmVudF9tZW51X2lkOworICAgICAgICAqIGFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fTk9fQUNUSU9OOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9NQUlOOworICAgICAgICAqIGFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fU0VUX1dISVRFX0JBTEFOQ0U7CisgICAgICAgICogYWN0aW9uX3BhcmFtID0gb3V0cHV0X3RvX2V2ZW50OworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1FTlVfSURfRVhQTUVURVJJTkdDSEFOR0U6CisgICAgICBwcmludGYoIk1FTlVfSURfRVhQTUVURVJJTkdDSEFOR0VcbiIpOworICAgICAgaWYgKG91dHB1dF90b19ldmVudCA+PSBBVVRPX0VYUF9NQVgpIHsKKyAgICAgICAgbmV4dF9tZW51X2lkID0gY3VycmVudF9tZW51X2lkOworICAgICAgICAqIGFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fTk9fQUNUSU9OOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9NQUlOOworICAgICAgICAqIGFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fU0VUX0VYUF9NRVRFUklORzsKKyAgICAgICAgKiBhY3Rpb25fcGFyYW0gPSBvdXRwdXRfdG9fZXZlbnQ7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTUVOVV9JRF9CUklHSFRORVNTQ0hBTkdFOgorICAgICAgc3dpdGNoIChvdXRwdXRfdG9fZXZlbnQpIHsKKyAgICAgICAgY2FzZSBJTkNfQlJJR0hUTkVTUzoKKyAgICAgICAgICAqIGFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fQlJJR0hUTkVTU19JTkNSRUFTRTsKKyAgICAgICAgICBuZXh0X21lbnVfaWQgPSBNRU5VX0lEX01BSU47CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBERUNfQlJJR0hUTkVTUzoKKyAgICAgICAgICAqIGFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fQlJJR0hUTkVTU19ERUNSRUFTRTsKKyAgICAgICAgICBuZXh0X21lbnVfaWQgPSBNRU5VX0lEX01BSU47CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBuZXh0X21lbnVfaWQgPSBNRU5VX0lEX0JSSUdIVE5FU1NDSEFOR0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTUVOVV9JRF9DT05UUkFTVENIQU5HRToKKyAgICAgIHN3aXRjaCAob3V0cHV0X3RvX2V2ZW50KSB7CisgICAgICAgIGNhc2UgSU5DX0NPTlRSQVNUOgorICAgICAgICAgICogYWN0aW9uX2lkX3B0ciA9IEFDVElPTl9DT05UUkFTVF9JTkNSRUFTRTsKKyAgICAgICAgICBuZXh0X21lbnVfaWQgPSBNRU5VX0lEX01BSU47CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBERUNfQ09OVFJBU1Q6CisgICAgICAgICAgKiBhY3Rpb25faWRfcHRyID0gQUNUSU9OX0NPTlRSQVNUX0RFQ1JFQVNFOworICAgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfTUFJTjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfQ09OVFJBU1RDSEFOR0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTUVOVV9JRF9FVkNIQU5HRToKKyAgICAgIHN3aXRjaCAob3V0cHV0X3RvX2V2ZW50KSB7CisgICAgICAgIGNhc2UgSU5DUkVBU0VfRVY6CisgICAgICAgICAgKiBhY3Rpb25faWRfcHRyID0gQUNUSU9OX0VWX0lOQ1JFQVNFOworICAgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfTUFJTjsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIERFQ1JFQVNFX0VWOgorICAgICAgICAgICogYWN0aW9uX2lkX3B0ciA9IEFDVElPTl9FVl9ERUNSRUFTRTsKKyAgICAgICAgICBuZXh0X21lbnVfaWQgPSBNRU5VX0lEX01BSU47CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBuZXh0X21lbnVfaWQgPSBNRU5VX0lEX0VWQ0hBTkdFOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1FTlVfSURfU0FUVVJBVElPTkNIQU5HRToKKyAgICAgIHN3aXRjaCAob3V0cHV0X3RvX2V2ZW50KSB7CisgICAgICAgIGNhc2UgSU5DX1NBVFVSQVRJT046CisgICAgICAgICAgKiBhY3Rpb25faWRfcHRyID0gQUNUSU9OX1NBVFVSQVRJT05fSU5DUkVBU0U7CisgICAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9NQUlOOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgREVDX1NBVFVSQVRJT046CisgICAgICAgICAgKiBhY3Rpb25faWRfcHRyID0gQUNUSU9OX1NBVFVSQVRJT05fREVDUkVBU0U7CisgICAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9NQUlOOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9FVkNIQU5HRTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRU5VX0lEX0lTT0NIQU5HRToKKyAgICAgIHByaW50ZigiTUVOVV9JRF9JU09DSEFOR0VcbiIpOworICAgICAgaWYgKG91dHB1dF90b19ldmVudCA+PSBJU09fTUFYKSB7CisgICAgICAgIG5leHRfbWVudV9pZCA9IGN1cnJlbnRfbWVudV9pZDsKKyAgICAgICAgKiBhY3Rpb25faWRfcHRyID0gQUNUSU9OX05PX0FDVElPTjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfTUFJTjsKKyAgICAgICAgKiBhY3Rpb25faWRfcHRyID0gQUNUSU9OX1NFVF9JU087CisgICAgICAgICogYWN0aW9uX3BhcmFtID0gb3V0cHV0X3RvX2V2ZW50OworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1FTlVfSURfWk9PTUNIQU5HRToKKyAgICAgICogYWN0aW9uX2lkX3B0ciA9IEFDVElPTl9TRVRfWk9PTTsKKyAgICAgIGlmIChvdXRwdXRfdG9fZXZlbnQgPiAwICYmCisgICAgICAgIG91dHB1dF90b19ldmVudCA8PSAoaW50KShzaXplb2Yoem9vbV90YmwpL3NpemVvZih6b29tX3RibFswXSkpKSB7CisgICAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9NQUlOOworICAgICAgICAgICogYWN0aW9uX3BhcmFtID0gb3V0cHV0X3RvX2V2ZW50OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV4dF9tZW51X2lkID0gY3VycmVudF9tZW51X2lkOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1FTlVfSURfU0hBUlBORVNTQ0hBTkdFOgorICAgICAgc3dpdGNoIChvdXRwdXRfdG9fZXZlbnQpIHsKKyAgICAgICAgY2FzZSBJTkNfU0hBUlBORVNTOgorICAgICAgICAgICogYWN0aW9uX2lkX3B0ciA9IEFDVElPTl9TSEFSUE5FU1NfSU5DUkVBU0U7CisgICAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9NQUlOOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERFQ19TSEFSUE5FU1M6CisgICAgICAgICAgKiBhY3Rpb25faWRfcHRyID0gQUNUSU9OX1NIQVJQTkVTU19ERUNSRUFTRTsKKyAgICAgICAgICBuZXh0X21lbnVfaWQgPSBNRU5VX0lEX01BSU47CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9TSEFSUE5FU1NDSEFOR0U7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTUVOVV9JRF9CRVNUU0hPVDoKKyAgICAgIGlmIChvdXRwdXRfdG9fZXZlbnQgPj0gQkVTVFNIT1RfTUFYKSB7CisgICAgICAgIG5leHRfbWVudV9pZCA9IGN1cnJlbnRfbWVudV9pZDsKKyAgICAgICAgKiBhY3Rpb25faWRfcHRyID0gQUNUSU9OX05PX0FDVElPTjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5leHRfbWVudV9pZCA9IE1FTlVfSURfTUFJTjsKKyAgICAgICAgKiBhY3Rpb25faWRfcHRyID0gQUNUSU9OX1NFVF9CRVNUU0hPVF9NT0RFOworICAgICAgICAqIGFjdGlvbl9wYXJhbSA9IG91dHB1dF90b19ldmVudDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRU5VX0lEX0ZMQVNITU9ERToKKyAgICAgIGlmIChvdXRwdXRfdG9fZXZlbnQgPj0gRkxBU0hfTU9ERV9NQVgpIHsKKyAgICAgICAgbmV4dF9tZW51X2lkID0gY3VycmVudF9tZW51X2lkOworICAgICAgICAqIGFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fTk9fQUNUSU9OOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV4dF9tZW51X2lkID0gTUVOVV9JRF9NQUlOOworICAgICAgICAqIGFjdGlvbl9pZF9wdHIgPSBBQ1RJT05fU0VUX0ZMQVNIX01PREU7CisgICAgICAgICogYWN0aW9uX3BhcmFtID0gb3V0cHV0X3RvX2V2ZW50OworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgTE9HRCgibWVudSBpZCBpcyB3cm9uZzogJWRcbiIsIGN1cnJlbnRfbWVudV9pZCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBuZXh0X21lbnVfaWQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICAtIHByaW50X21lbnVfcHJldmlld192aWRlbyAtCisgKgorICogREVTQ1JJUFRJT046CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIHZvaWQgcHJpbnRfbWVudV9wcmV2aWV3X3ZpZGVvKHZvaWQpIHsKKyAgdW5zaWduZWQgaW50IGk7CisgIGlmICghaXNfcmVjKSB7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgcHJpbnRmKCIgICAgICBDYW1lcmEgaXMgaW4gcHJldmlldy92aWRlbyBtb2RlIG5vdyAgICAgICAgXG4iKTsKKyAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgcHJpbnRmKCIgICAgICBDYW1lcmEgaXMgaW4gUkVDT1JESU5HIG1vZGUgbm93ICAgICAgIFxuIik7CisgICAgcHJpbnRmKCIgICAgICAgIFByZXNzICdRJyBUbyBTdG9wIFJlY29yZGluZyAgICAgICAgICBcbiIpOworICAgIHByaW50ZigiICAgICAgICBQcmVzcyAnUycgVG8gVGFrZSBMaXZlIFNuYXBzaG90ICAgICAgIFxuIik7CisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworICB9CisgIGNoYXIgbWVudU51bSA9ICdBJzsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihjYW1lcmFfbWFpbl9tZW51X3RibCkvc2l6ZW9mKGNhbWVyYV9tYWluX21lbnVfdGJsWzBdKTsgaSsrKSB7CisgICAgaWYgKGkgPT0gQkFTRV9PRkZTRVQpIHsKKyAgICAgIG1lbnVOdW0gPSAnMSc7CisgICAgfQorCisgICAgcHJpbnRmKCIlYy4gICVzXG4iLCBtZW51TnVtLCBjYW1lcmFfbWFpbl9tZW51X3RibFtpXS5tZW51X25hbWUpOworICAgIG1lbnVOdW0rKzsKKyAgfQorCisgIHByaW50ZigiXG5QbGVhc2UgZW50ZXIgeW91ciBjaG9pY2U6ICIpOworCisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgY2FtZXJhX3ByZXZpZXdfdmlkZW9fd2JfY2hhbmdlX3RibCh2b2lkKSB7CisgIHVuc2lnbmVkIGludCBpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgIHByaW50ZigiICAgICAgQ2FtZXJhIGlzIGluIHdoaXRlIGJhbGFuY2UgY2hhbmdlIG1vZGUgICAgICAgXG4iKTsKKyAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworCisgIGNoYXIgc3VibWVudU51bSA9ICdBJzsKKyAgZm9yIChpID0gMCA7IGkgPCBzaXplb2Yod2hpdGVfYmFsYW5jZV90YmwpIC8KKyAgICAgICAgICAgICAgICAgICBzaXplb2Yod2hpdGVfYmFsYW5jZV90YmxbMF0pOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIlYy4gICVzXG4iLCBzdWJtZW51TnVtLCB3aGl0ZV9iYWxhbmNlX3RibFtpXS53Yl9uYW1lKTsKKyAgICAgICAgc3VibWVudU51bSsrOworICB9CisgIHByaW50ZigiXG5QbGVhc2UgZW50ZXIgeW91ciBjaG9pY2UgZm9yIFdoaXRlIEJhbGFuY2UgbW9kZXM6ICIpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNhbWVyYV9wcmV2aWV3X3ZpZGVvX2dldF9jdHJsX3ZhbHVlX3RibCh2b2lkKSB7CisgIHVuc2lnbmVkIGludCBpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgIHByaW50ZigiICAgICAgQ2FtZXJhIGlzIGluIGdldCBjb250cm9sIHZhbHVlIG1vZGUgICAgICAgXG4iKTsKKyAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworCisgIGNoYXIgc3VibWVudU51bSA9ICdBJzsKKyAgZm9yIChpID0gMCA7IGkgPCBzaXplb2YoZ2V0X2N0cmxfdGJsKSAvCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGdldF9jdHJsX3RibFswXSk7IGkrKykgeworICAgICAgICBwcmludGYoIiVjLiAgJXNcbiIsIHN1Ym1lbnVOdW0sIGdldF9jdHJsX3RibFtpXS5nZXRfY3RybF9uYW1lKTsKKyAgICAgICAgc3VibWVudU51bSsrOworICB9CisgIHByaW50ZigiXG5QbGVhc2UgZW50ZXIgeW91ciBjaG9pY2UgZm9yIGNvbnRyb2wgdmFsdWUgeW91IHdhbnQgdG8gZ2V0OiAiKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjYW1lcmFfcHJldmlld192aWRlb19leHBfbWV0ZXJpbmdfY2hhbmdlX3RibCh2b2lkKSB7CisgIHVuc2lnbmVkIGludCBpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgIHByaW50ZigiICAgICAgQ2FtZXJhIGlzIGluIGV4cG9zdXJlIG1ldGVyaW5nIGNoYW5nZSBtb2RlICAgICAgIFxuIik7CisgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iKTsKKworICBjaGFyIHN1Ym1lbnVOdW0gPSAnQSc7CisgIGZvciAoaSA9IDAgOyBpIDwgc2l6ZW9mKGV4cF9tZXRlcmluZ190YmwpIC8KKyAgICAgICAgICAgICAgICAgICBzaXplb2YoZXhwX21ldGVyaW5nX3RibFswXSk7IGkrKykgeworICAgICAgICBwcmludGYoIiVjLiAgJXNcbiIsIHN1Ym1lbnVOdW0sIGV4cF9tZXRlcmluZ190YmxbaV0uZXhwX21ldGVyaW5nX25hbWUpOworICAgICAgICBzdWJtZW51TnVtKys7CisgIH0KKyAgcHJpbnRmKCJcblBsZWFzZSBlbnRlciB5b3VyIGNob2ljZSBmb3IgZXhwb3N1cmUgbWV0ZXJpbmcgbW9kZXM6ICIpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNhbWVyYV9jb250cmFzdF9jaGFuZ2VfdGJsKHZvaWQpIHsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgIHByaW50ZigiICAgICAgQ2FtZXJhIGlzIGluIGNoYW5nZSBjb250cmFzdCByZXNvbHV0aW9uIG1vZGUgICAgICAgXG4iKTsKKyAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7CisKKyAgICBjaGFyIGNvbnRyYXN0bWVudU51bSA9ICdBJzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNvbnRyYXN0X2NoYW5nZV90YmwpIC8KKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNvbnRyYXN0X2NoYW5nZV90YmxbMF0pOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIlYy4gICVzXG4iLCBjb250cmFzdG1lbnVOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhc3RfY2hhbmdlX3RibFtpXS5jb250cmFzdF9uYW1lKTsKKyAgICAgICAgY29udHJhc3RtZW51TnVtKys7CisgICAgfQorCisgICAgcHJpbnRmKCJcblBsZWFzZSBlbnRlciB5b3VyIGNob2ljZSBmb3IgY29udHJhc3QgQ2hhbmdlOiAiKTsKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNhbWVyYV9FVl9jaGFuZ2VfdGJsKHZvaWQpIHsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICBwcmludGYoIiAgICAgIENhbWVyYSBpcyBpbiBFViBjaGFuZ2UgbW9kZSBub3cgICAgICAgXG4iKTsKKyAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworCisgIGNoYXIgc3VibWVudU51bSA9ICdBJzsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihjYW1lcmFfRVZfdGJsKS9zaXplb2YoY2FtZXJhX0VWX3RibFswXSk7IGkrKykgeworICAgIHByaW50ZigiJWMuICAlc1xuIiwgc3VibWVudU51bSwgY2FtZXJhX0VWX3RibFtpXS5FVl9uYW1lKTsKKyAgICBzdWJtZW51TnVtKys7CisgIH0KKworICBwcmludGYoIlxuUGxlYXNlIGVudGVyIHlvdXIgY2hvaWNlIGZvciBFViBjaGFuZ2VzOiAiKTsKKyAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjYW1lcmFfcmVzb2x1dGlvbl9jaGFuZ2VfdGJsKHZvaWQpIHsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgIHByaW50ZigiICAgICAgQ2FtZXJhIGlzIGluIHNuYXBzaG90IHJlc29sdXRpb24gbW9kZSAgICAgICAgICAgICAgIFxuIik7CisgICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihkaW1lbnNpb25fdGJsKSAvCisgICAgICBzaXplb2YoZGltZW5zaW9uX3RibFswXSk7IGkrKykgeworICAgICAgICBpZiAoIGRpbWVuc2lvbl90YmxbaV0uc3VwcG9ydGVkICkgeworICAgICAgICAgICAgcHJpbnRmKCIlZC4gICVzXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25fdGJsW2ldLnN0cl9uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaW50ZigiXG5QbGVhc2UgZW50ZXIgeW91ciBjaG9pY2UgZm9yIFJlc29sdXRpb246ICIpOworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgY2FtZXJhX3ByZXZpZXdfdmlkZW9fem9vbV9jaGFuZ2VfdGJsKHZvaWQpIHsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICB6b29tX21heF92YWx1ZSA9IE1BWF9aT09NU19DTlQ7CisgICAgcHJpbnRmKCJcbkN1cnJlbnQgWm9vbSBWYWx1ZSA9ICVkICxNYXggWm9vbSBWYWx1ZSA9ICVkXG4iLHpvb21fbGV2ZWwsem9vbV9tYXhfdmFsdWUpOworICAgIGNoYXIgc3VibWVudU51bSA9ICdBJzsKKyAgICBmb3IgKGkgPSAwIDsgaSA8IHNpemVvZih6b29tX3RibCkgLworICAgICAgICAgICAgICAgICAgIHNpemVvZih6b29tX3RibFswXSk7IGkrKykgeworICAgICAgICBwcmludGYoIiVjLiAgJXNcbiIsIHN1Ym1lbnVOdW0sIHpvb21fdGJsW2ldLnpvb21fZGlyZWN0aW9uX25hbWUpOworICAgICAgICBzdWJtZW51TnVtKys7CisgICAgfQorICAgIHByaW50ZigiXG5QbGVhc2UgZW50ZXIgeW91ciBjaG9pY2UgZm9yIHpvb20gY2hhbmdlIGRpcmVjdGlvbjogIik7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjYW1lcmFfYnJpZ2h0bmVzc19jaGFuZ2VfdGJsKHZvaWQpIHsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgIHByaW50ZigiICAgICAgQ2FtZXJhIGlzIGluIGNoYW5nZSBicmlnaHRuZXNzIG1vZGUgICAgICAgXG4iKTsKKyAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7CisKKyAgICBjaGFyIGJyaWdodG5lc3NtZW51TnVtID0gJ0EnOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnJpZ2h0bmVzc19jaGFuZ2VfdGJsKSAvCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihicmlnaHRuZXNzX2NoYW5nZV90YmxbMF0pOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIlYy4gICVzXG4iLCBicmlnaHRuZXNzbWVudU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmlnaHRuZXNzX2NoYW5nZV90YmxbaV0uYnJpZ2h0bmVzc19uYW1lKTsKKyAgICAgICAgYnJpZ2h0bmVzc21lbnVOdW0rKzsKKyAgICB9CisKKyAgICBwcmludGYoIlxuUGxlYXNlIGVudGVyIHlvdXIgY2hvaWNlIGZvciBCcmlnaHRuZXNzIENoYW5nZTogIik7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjYW1lcmFfc2F0dXJhdGlvbl9jaGFuZ2VfdGJsKHZvaWQpIHsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgIHByaW50ZigiXG4iKTsKKyAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgIHByaW50ZigiICAgICAgQ2FtZXJhIGlzIGluIGNoYW5nZSBzYXR1cmF0aW9uIG1vZGUgICAgICAgXG4iKTsKKyAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7CisKKyAgICBjaGFyIHNhdHVyYXRpb25tZW51TnVtID0gJ0EnOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoY2FtZXJhX3NhdHVyYXRpb25fdGJsKSAvCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihjYW1lcmFfc2F0dXJhdGlvbl90YmxbMF0pOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIlYy4gICVzXG4iLCBzYXR1cmF0aW9ubWVudU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfc2F0dXJhdGlvbl90YmxbaV0uc2F0dXJhdGlvbl9uYW1lKTsKKyAgICAgICAgc2F0dXJhdGlvbm1lbnVOdW0rKzsKKyAgICB9CisKKyAgICBwcmludGYoIlxuUGxlYXNlIGVudGVyIHlvdXIgY2hvaWNlIGZvciBTYXR1cmF0aW9uIENoYW5nZTogIik7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjYW1lcmFfcHJldmlld192aWRlb19pc29fY2hhbmdlX3RibCh2b2lkKSB7CisgIHVuc2lnbmVkIGludCBpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgIHByaW50ZigiICAgICAgQ2FtZXJhIGlzIGluIElTTyBjaGFuZ2UgbW9kZSAgICAgICBcbiIpOworICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7CisKKyAgY2hhciBzdWJtZW51TnVtID0gJ0EnOworICBmb3IgKGkgPSAwIDsgaSA8IHNpemVvZihpc29fdGJsKSAvCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGlzb190YmxbMF0pOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIlYy4gICVzXG4iLCBzdWJtZW51TnVtLCBpc29fdGJsW2ldLmlzb19tb2Rlc19uYW1lKTsKKyAgICAgICAgc3VibWVudU51bSsrOworICB9CisgIHByaW50ZigiXG5QbGVhc2UgZW50ZXIgeW91ciBjaG9pY2UgZm9yIGlzbyBtb2RlczogIik7CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgY2FtZXJhX3ByZXZpZXdfdmlkZW9fc2hhcnBuZXNzX2NoYW5nZV90Ymwodm9pZCkgeworICB1bnNpZ25lZCBpbnQgaTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICBwcmludGYoIiAgICAgIENhbWVyYSBpcyBpbiBzaGFycG5lc3MgY2hhbmdlIG1vZGUgICAgICAgXG4iKTsKKyAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworCisgIGNoYXIgc3VibWVudU51bSA9ICdBJzsKKyAgZm9yIChpID0gMCA7IGkgPCBzaXplb2YoY2FtZXJhX3NoYXJwbmVzc190YmwpIC8KKyAgICAgICAgICAgICAgICAgICBzaXplb2YoY2FtZXJhX3NoYXJwbmVzc190YmxbMF0pOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIlYy4gICVzXG4iLCBzdWJtZW51TnVtLCBjYW1lcmFfc2hhcnBuZXNzX3RibFtpXS5zaGFycG5lc3NfbmFtZSk7CisgICAgICAgIHN1Ym1lbnVOdW0rKzsKKyAgfQorICBwcmludGYoIlxuUGxlYXNlIGVudGVyIHlvdXIgY2hvaWNlIGZvciBzaGFycG5lc3MgbW9kZXM6ICIpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNhbWVyYV9zZXRfYmVzdHNob3RfdGJsKHZvaWQpCit7CisgIHVuc2lnbmVkIGludCBpOworCisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgcHJpbnRmKCIgICAgICBDYW1lcmEgaXMgaW4gc2V0IGJlc3Rob3QgbW9kZSBub3cgICAgICAgXG4iKTsKKyAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworCisKKyAgY2hhciBic21lbnVOdW0gPSAnQSc7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoYmVzdHNob3RfbW9kZV90YmwpL3NpemVvZihiZXN0c2hvdF9tb2RlX3RibFswXSk7IGkrKykgeworICAgIHByaW50ZigiJWMuICAlc1xuIiwgYnNtZW51TnVtLAorICAgICAgYmVzdHNob3RfbW9kZV90YmxbaV0ubmFtZSk7CisgICAgYnNtZW51TnVtKys7CisgIH0KKworICBwcmludGYoIlxuUGxlYXNlIGVudGVyIHlvdXIgY2hvaWNlIG9mIEJlc3RzaG90IE1vZGU6ICIpOworICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNhbWVyYV9zZXRfZmxhc2htb2RlX3RibCh2b2lkKQoreworICB1bnNpZ25lZCBpbnQgaTsKKworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgIHByaW50ZigiICAgICAgQ2FtZXJhIGlzIGluIHNldCBmbGFzaCBtb2RlIG5vdyAgICAgICBcbiIpOworICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIik7CisKKworICBjaGFyIGJzbWVudU51bSA9ICdBJzsKKyAgZm9yIChpID0gMDsgaSA8IHNpemVvZihmbGFzaG1vZGVzX3RibCkvc2l6ZW9mKGZsYXNobW9kZXNfdGJsWzBdKTsgaSsrKSB7CisgICAgcHJpbnRmKCIlYy4gICVzXG4iLCBic21lbnVOdW0sCisgICAgICBmbGFzaG1vZGVzX3RibFtpXS5uYW1lKTsKKyAgICBic21lbnVOdW0rKzsKKyAgfQorCisgIHByaW50ZigiXG5QbGVhc2UgZW50ZXIgeW91ciBjaG9pY2Ugb2YgQmVzdHNob3QgTW9kZTogIik7CisgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgY2FtZXJhX3NlbnNvcnNfdGJsKHZvaWQpCit7CisgIHVuc2lnbmVkIGludCBpOworICBzaXplX3QgYXZhaWxhYmxlX3NlbnNvcnMgPSBzaXplb2Yoc2Vuc29yX3RibCkvc2l6ZW9mKHNlbnNvcl90YmxbMF0pOworCisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKyAgcHJpbnRmKCIgICAgICBDYW1lcmEgU2Vuc29yIHRvIGJlIHVzZWQ6ICAgICAgICAgICAgXG4iKTsKKyAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiIpOworCisKKyAgY2hhciBic21lbnVOdW0gPSAnQSc7CisgIGZvciAoaSA9IDA7ICggaSA8IGF2YWlsYWJsZV9zZW5zb3JzICkgJiYgKCBzZW5zb3JfdGJsW2ldLnByZXNlbnQgKSA7IGkrKykgeworICAgIHByaW50ZigiJWMuICAlc1xuIiwgYnNtZW51TnVtLAorICAgICAgICAgICAgc2Vuc29yX3RibFtpXS5tZW51X25hbWUpOworICAgIGJzbWVudU51bSsrOworICB9CisKKyAgcHJpbnRmKCJcblBsZWFzZSBlbnRlciB5b3VyIGNob2ljZSBmb3Igc2Vuc29yOiAiKTsKKyAgcmV0dXJuOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgIC0gaW5jcmVhc2VfY29udHJhc3QgLQorICoKKyAqIERFU0NSSVBUSU9OOgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBpbmNyZWFzZV9jb250cmFzdCAobW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUpIHsKKyAgICAgICAgY29udHJhc3QgKz0gQ0FNRVJBX0NPTlRSQVNUX1NURVA7CisgICAgICAgIGlmIChjb250cmFzdCA+IENBTUVSQV9NQVhfQ09OVFJBU1QpIHsKKyAgICAgICAgICAgICAgICBjb250cmFzdCA9IENBTUVSQV9NQVhfQ09OVFJBU1Q7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJSZWFjaGVkIG1heCBDT05UUkFTVC4gXG4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIkluY3JlYXNlIENvbnRyYXN0IHRvICVkXG4iLCBjb250cmFzdCk7CisgICAgICAgIHJldHVybiBtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZChsaWJfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0xJQl9DT05UUkFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250cmFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgIC0gZGVjcmVhc2VfY29udHJhc3QgLQorICoKKyAqIERFU0NSSVBUSU9OOgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBkZWNyZWFzZV9jb250cmFzdCAobW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUpIHsKKyAgICAgICAgY29udHJhc3QgLT0gQ0FNRVJBX0NPTlRSQVNUX1NURVA7CisgICAgICAgIGlmIChjb250cmFzdCA8IENBTUVSQV9NSU5fQ09OVFJBU1QpIHsKKyAgICAgICAgICAgICAgICBjb250cmFzdCA9IENBTUVSQV9NSU5fQ09OVFJBU1Q7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJSZWFjaGVkIG1pbiBDT05UUkFTVC4gXG4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIkRlY3JlYXNlIENvbnRyYXN0IHRvICVkXG4iLCBjb250cmFzdCk7CisgICAgICAgIHJldHVybiBtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZChsaWJfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0xJQl9DT05UUkFTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250cmFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgIC0gZGVjcmVhc2VfYnJpZ2h0bmVzcyAtCisgKgorICogREVTQ1JJUFRJT046CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IGRlY3JlYXNlX2JyaWdodG5lc3MgKG1tX2NhbWVyYV9saWJfaGFuZGxlICpsaWJfaGFuZGxlKSB7CisgICAgICAgIGJyaWdodG5lc3MgLT0gQ0FNRVJBX0JSSUdIVE5FU1NfU1RFUDsKKyAgICAgICAgaWYgKGJyaWdodG5lc3MgPCBDQU1FUkFfTUlOX0JSSUdIVE5FU1MpIHsKKyAgICAgICAgICAgICAgICBicmlnaHRuZXNzID0gQ0FNRVJBX01JTl9CUklHSFRORVNTOworICAgICAgICAgICAgICAgIHByaW50ZigiUmVhY2hlZCBtaW4gQlJJR0hUTkVTUy4gXG4iKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIkRlY3JlYXNlIEJyaWdodG5lc3MgdG8gJWRcbiIsIGJyaWdodG5lc3MpOworICAgICAgICByZXR1cm4gbW1fY2FtZXJhX2xpYl9zZW5kX2NvbW1hbmQobGliX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NBTUVSQV9MSUJfQlJJR0hUTkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZicmlnaHRuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICAgLSBpbmNyZWFzZV9icmlnaHRuZXNzIC0KKyAqCisgKiBERVNDUklQVElPTjoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgaW5jcmVhc2VfYnJpZ2h0bmVzcyAobW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUpIHsKKyAgICAgICAgYnJpZ2h0bmVzcyArPSBDQU1FUkFfQlJJR0hUTkVTU19TVEVQOworICAgICAgICBpZiAoYnJpZ2h0bmVzcyA+IENBTUVSQV9NQVhfQlJJR0hUTkVTUykgeworICAgICAgICAgICAgICAgIGJyaWdodG5lc3MgPSBDQU1FUkFfTUFYX0JSSUdIVE5FU1M7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJSZWFjaGVkIG1heCBCUklHSFRORVNTLiBcbiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiSW5jcmVhc2UgQnJpZ2h0bmVzcyB0byAlZFxuIiwgYnJpZ2h0bmVzcyk7CisgICAgICAgIHJldHVybiBtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZChsaWJfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0xJQl9CUklHSFRORVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyaWdodG5lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgICAtIGluY3JlYXNlX0VWIC0KKyAqCisgKiBERVNDUklQVElPTjoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK2ludCBpbmNyZWFzZV9FViAobW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUpIHsKKworICAgIGV2X251bWVyYXRvciArPSA0OworICAgIGlmKGV2X251bWVyYXRvciA+PSBFWFBPU1VSRV9DT01QRU5TQVRJT05fTUlOSU1VTV9OVU1FUkFUT1IgJiYKKyAgICAgICAgICAgIGV2X251bWVyYXRvciA8PSBFWFBPU1VSRV9DT01QRU5TQVRJT05fTUFYSU1VTV9OVU1FUkFUT1IpeworCisgICAgfSBlbHNlIHsKKyAgICAgICBwcmludGYoIlJlYWNoZWQgbWF4IEVWLlxuIik7CisgICAgfQorICAgIHByaW50ZigiSW5jcmVhc2UgRVYgdG8gJWRcbiIsIGV2X251bWVyYXRvcik7CisgICAgcmV0dXJuIG1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKGxpYl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DQU1FUkFfTElCX0VWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2X251bWVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgIC0gZGVjcmVhc2VfRVYgLQorICoKKyAqIERFU0NSSVBUSU9OOgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBkZWNyZWFzZV9FViAobW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUpIHsKKworICAgIGV2X251bWVyYXRvciAtPSA0OworICAgIGlmKGV2X251bWVyYXRvciA+PSBFWFBPU1VSRV9DT01QRU5TQVRJT05fTUlOSU1VTV9OVU1FUkFUT1IgJiYKKyAgICAgICAgICAgIGV2X251bWVyYXRvciA8PSBFWFBPU1VSRV9DT01QRU5TQVRJT05fTUFYSU1VTV9OVU1FUkFUT1IpeworCisgICAgfSBlbHNlIHsKKyAgICAgICBwcmludGYoIlJlYWNoZWQgbWluIEVWLlxuIik7CisgICAgfQorICAgIHByaW50ZigiRGVjcmVhc2UgRVYgdG8gJWRcbiIsIGV2X251bWVyYXRvcik7CisgICAgcmV0dXJuIG1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKGxpYl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DQU1FUkFfTElCX0VWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2X251bWVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworCit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICAgLSBpbmNyZWFzZV9zYXR1cmF0aW9uIC0KKyAqCisgKiBERVNDUklQVElPTjoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgaW5jcmVhc2Vfc2F0dXJhdGlvbiAobW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUpIHsKKyNpZiAwCisgIHNhdHVyYXRpb24gKz0gQ0FNRVJBX1NBVFVSQVRJT05fU1RFUDsKKyAgaWYgKHNhdHVyYXRpb24gPiBDQU1FUkFfTUFYX1NBVFVSQVRJT04pIHsKKyAgICBzYXR1cmF0aW9uID0gQ0FNRVJBX01BWF9TQVRVUkFUSU9OOworICAgIHByaW50ZigiUmVhY2hlZCBtYXggc2F0dXJhdGlvbi4gXG4iKTsKKyAgfQorICBwcmludGYoIkluY3JlYXNlIFNhdHVyYXRpb24gdG8gJWRcbiIsIHNhdHVyYXRpb24pOworICByZXR1cm4gbW1fYXBwX3NldF9jb25maWdfcGFybShjYW1faWQsIE1NX0NBTUVSQV9QQVJNX1NBVFVSQVRJT04sIHNhdHVyYXRpb24pOworI2VuZGlmCisgIHNhdHVyYXRpb24gKz0gQ0FNRVJBX1NBVFVSQVRJT05fU1RFUDsKKyAgaWYgKHNhdHVyYXRpb24gPiBDQU1FUkFfTUFYX1NBVFVSQVRJT04pIHsKKyAgICBzYXR1cmF0aW9uID0gQ0FNRVJBX01BWF9TQVRVUkFUSU9OOworICAgIHByaW50ZigiUmVhY2hlZCBtYXggc2F0dXJhdGlvbi4gXG4iKTsKKyAgfQorICBwcmludGYoIkluY3JlYXNlIHNhdHVyYXRpb24gdG8gJWRcbiIsIGNvbnRyYXN0KTsKKyAgcmV0dXJuIG1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKGxpYl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DQU1FUkFfTElCX1NBVFVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2F0dXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgIC0gZGVjcmVhc2Vfc2F0dXJhdGlvbiAtCisgKgorICogREVTQ1JJUFRJT046CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IGRlY3JlYXNlX3NhdHVyYXRpb24gKG1tX2NhbWVyYV9saWJfaGFuZGxlICpsaWJfaGFuZGxlKSB7CisjaWYgMAorICBzYXR1cmF0aW9uIC09IENBTUVSQV9TQVRVUkFUSU9OX1NURVA7CisgIGlmIChzYXR1cmF0aW9uIDwgQ0FNRVJBX01JTl9TQVRVUkFUSU9OKSB7CisgICAgc2F0dXJhdGlvbiA9IENBTUVSQV9NSU5fU0FUVVJBVElPTjsKKyAgICBwcmludGYoIlJlYWNoZWQgbWluIHNhdHVyYXRpb24uIFxuIik7CisgIH0KKyAgcHJpbnRmKCJEY3JlYXNlIFNhdHVyYXRpb24gdG8gJWRcbiIsIHNhdHVyYXRpb24pOworICByZXR1cm4gbW1fYXBwX3NldF9jb25maWdfcGFybShjYW1faWQsIE1NX0NBTUVSQV9QQVJNX1NBVFVSQVRJT04sIHNhdHVyYXRpb24pOworI2VuZGlmCisgIHNhdHVyYXRpb24gLT0gQ0FNRVJBX1NBVFVSQVRJT05fU1RFUDsKKyAgaWYgKHNhdHVyYXRpb24gPCBDQU1FUkFfTUlOX1NBVFVSQVRJT04pIHsKKyAgICBzYXR1cmF0aW9uID0gQ0FNRVJBX01JTl9TQVRVUkFUSU9OOworICAgIHByaW50ZigiUmVhY2hlZCBtaW4gc2F0dXJhdGlvbi4gXG4iKTsKKyAgfQorICBwcmludGYoImRlY3JlYXNlIHNhdHVyYXRpb24gdG8gJWRcbiIsIGNvbnRyYXN0KTsKKyAgcmV0dXJuIG1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKGxpYl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DQU1FUkFfTElCX1NBVFVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2F0dXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCisKK2ludCB0YWtlX2pwZWdfc25hcHNob3QobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLCBpbnQgaXNfYnVyc3RfbW9kZSkKK3sKKyAgTE9HSCgiXG5FbnRlciB0YWtlX2pwZWdfc25hcHNob3QhIVxuIik7CisgIGludCByYyA9IG1tX2FwcF90YWtlX3BpY3R1cmUgKHRlc3Rfb2JqLCAodWludDhfdClpc19idXJzdF9tb2RlKTsKKyAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgIExPR0UoIiBtbV9hcHBfdGFrZV9waWN0dXJlKCkgZXJyPSVkXG4iLCAgcmMpOworICB9CisgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgIC0gbWFpbiAtCisgKgorICogREVTQ1JJUFRJT046CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBtYWluKCkKK3sKKyAgICBjaGFyIHRjX2J1ZlszXTsKKyAgICBpbnQgbW9kZSA9IDA7CisgICAgaW50IHJjID0gMDsKKworICAgIHByaW50ZigiUGxlYXNlIFNlbGVjdCBFeGVjdXRpb24gTW9kZTpcbiIpOworICAgIHByaW50ZigiMDogTWVudSBCYXNlZCAxOiBSZWdyZXNzaW9uXG4iKTsKKyAgICBmZ2V0cyh0Y19idWYsIDMsIHN0ZGluKTsKKyAgICBtb2RlID0gdGNfYnVmWzBdIC0gJzAnOworICAgIGlmKG1vZGUgPT0gMCkgeworICAgICAgcHJpbnRmKCJcblN0YXJ0aW5nIE1lbnUgYmFzZWQhIVxuIik7CisgICAgfSBlbHNlIGlmKG1vZGUgPT0gMSkgeworICAgICAgcHJpbnRmKCJTdGFydGluZyBSZWdyZXNzaW9uIHRlc3RpbmchIVxuIik7CisgICAgICBpZighbW1fYXBwX3N0YXJ0X3JlZ3Jlc3Npb25fdGVzdCgxKSkgeworICAgICAgICAgcHJpbnRmKCJcblJlZ3Jlc3NpaW9uIHRlc3QgcGFzc2VkISFcbiIpOworICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIlxuUmVncmVzc2lvbiB0ZXN0IGZhaWxlZCEhXG4iKTsKKyAgICAgICAgZXhpdCgtMSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICBwcmludGYoIlxuUGxlYXNlIEVudGVyIDAgb3IgMVxuIik7CisgICAgICAgcHJpbnRmKCJcbkV4aXN0aW5nIHRoZSBBcHAhIVxuIik7CisgICAgICAgZXhpdCgtMSk7CisgICAgfQorCisKKyAgICByYyA9IHN1Ym1haW4oKTsKKworICAgIHByaW50ZigiRXhpdGluZyBhcHBsaWNhdGlvblxuIik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICAgLSBzZXRfd2hpdGViYWxhbmNlIC0KKyAqCisgKiBERVNDUklQVElPTjoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgc2V0X3doaXRlYmFsYW5jZSAobW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUsIGludCB3Yl9hY3Rpb25fcGFyYW0pIHsKKyAgICAgICAgY2FtX3diX21vZGVfdHlwZSB0eXBlID0gMDsKKyAgICAgICAgc3dpdGNoICh3Yl9hY3Rpb25fcGFyYW0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIFdCX0FVVE86CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIFdCX0FVVE9cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENBTV9XQl9NT0RFX0FVVE87CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFdCX0lOQ0FOREVTQ0VOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gV0JfSU5DQU5ERVNDRU5UXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDQU1fV0JfTU9ERV9JTkNBTkRFU0NFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFdCX0ZMVU9SRVNDRU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBXQl9GTFVPUkVTQ0VOVFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0FNX1dCX01PREVfRkxVT1JFU0NFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFdCX1dBUk1fRkxVT1JFU0NFTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIFdCX1dBUk1fRkxVT1JFU0NFTlRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENBTV9XQl9NT0RFX1dBUk1fRkxVT1JFU0NFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFdCX0RBWUxJR0hUOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBXQl9EQVlMSUdIVFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0FNX1dCX01PREVfREFZTElHSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFdCX0NMT1VEWV9EQVlMSUdIVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gV0JfQ0xPVURZX0RBWUxJR0hUXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDQU1fV0JfTU9ERV9DTE9VRFlfREFZTElHSFQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgIGNhc2UgV0JfVFdJTElHSFQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIFdCX1RXSUxJR0hUXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDQU1fV0JfTU9ERV9UV0lMSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgY2FzZSBXQl9TSEFERToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gV0JfU0hBREVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENBTV9XQl9NT0RFX1NIQURFOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZChsaWJfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0xJQl9XQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgICAtIHNldF9leHBfbWV0ZXJpbmcgLQorICoKKyAqIERFU0NSSVBUSU9OOgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBzZXRfZXhwX21ldGVyaW5nIChtbV9jYW1lcmFfbGliX2hhbmRsZSAqbGliX2hhbmRsZSwgaW50IGV4cF9tZXRlcmluZ19hY3Rpb25fcGFyYW0pIHsKKyAgICAgICAgY2FtX2F1dG9fZXhwb3N1cmVfbW9kZV90eXBlIHR5cGUgPSAwOworICAgICAgICBzd2l0Y2ggKGV4cF9tZXRlcmluZ19hY3Rpb25fcGFyYW0pIHsKKwkJY2FzZSBBVVRPX0VYUF9GUkFNRV9BVkc6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuQVVUT19FWFBfRlJBTUVfQVZHXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDQU1fQUVDX01PREVfRlJBTUVfQVZFUkFHRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVVUT19FWFBfQ0VOVEVSX1dFSUdIVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBBVVRPX0VYUF9DRU5URVJfV0VJR0hURURcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENBTV9BRUNfTU9ERV9DRU5URVJfV0VJR0hURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFVVE9fRVhQX1NQT1RfTUVURVJJTkc6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIEFVVE9fRVhQX1NQT1RfTUVURVJJTkdcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENBTV9BRUNfTU9ERV9TUE9UX01FVEVSSU5HOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0VYUF9TTUFSVF9NRVRFUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gQVVUT19FWFBfU01BUlRfTUVURVJJTkdcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IENBTV9BRUNfTU9ERV9TTUFSVF9NRVRFUklORzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVVUT19FWFBfVVNFUl9NRVRFUklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gQVVUT19FWFBfVVNFUl9NRVRFUklOR1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0FNX0FFQ19NT0RFX1VTRVJfTUVURVJJTkc7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFVVE9fRVhQX1NQT1RfTUVURVJJTkdfQURWOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBBVVRPX0VYUF9TUE9UX01FVEVSSU5HX0FEVlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0FNX0FFQ19NT0RFX1NQT1RfTUVURVJJTkdfQURWOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVVRPX0VYUF9DRU5URVJfV0VJR0hURURfQURWOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBBVVRPX0VYUF9DRU5URVJfV0VJR0hURURfQURWXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBDQU1fQUVDX01PREVfQ0VOVEVSX1dFSUdIVEVEX0FEVjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbW1fY2FtZXJhX2xpYl9zZW5kX2NvbW1hbmQobGliX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NBTUVSQV9MSUJfRVhQT1NVUkVfTUVURVJJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCitpbnQgZ2V0X2N0cmxfdmFsdWUgKGludCBjdHJsX3ZhbHVlX21vZGVfcGFyYW0peworI2lmIDAKKyAgICBpbnQgcmMgPSAwOworICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgY3RybDsKKworICAgIGlmIChjdHJsX3ZhbHVlX21vZGVfcGFyYW0gPT0gV0hJVEVfQkFMQU5DRV9TVEFURSkgeworICAgICAgICBwcmludGYoIllvdSBjaG9zZSBXSElURV9CQUxBTkNFX1NUQVRFXG4iKTsKKyAgICAgICAgY3RybC5pZCA9IFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRTsKKyAgICB9CisgICAgZWxzZSBpZiAoY3RybF92YWx1ZV9tb2RlX3BhcmFtID09IFdISVRFX0JBTEFOQ0VfVEVNUEVSQVRVUkUpIHsKKyAgICAgICAgcHJpbnRmKCJZb3UgY2hvc2UgV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRVxuIik7CisgICAgICAgIGN0cmwuaWQgPSBWNEwyX0NJRF9XSElURV9CQUxBTkNFX1RFTVBFUkFUVVJFOworICAgIH0KKyAgICBlbHNlIGlmIChjdHJsX3ZhbHVlX21vZGVfcGFyYW0gPT0gQlJJR0hUTkVTU19DVFJMKSB7CisgICAgICAgIHByaW50ZigiWW91IGNob3NlIGJyaWdodG5lc3MgdmFsdWVcbiIpOworICAgICAgICBjdHJsLmlkID0gVjRMMl9DSURfQlJJR0hUTkVTUzsKKyAgICB9CisgICAgZWxzZSBpZiAoY3RybF92YWx1ZV9tb2RlX3BhcmFtID09IEVWKSB7CisgICAgICAgIHByaW50ZigiWW91IGNob3NlIGV4cG9zdXJlIHZhbHVlXG4iKTsKKyAgICAgICAgY3RybC5pZCA9IFY0TDJfQ0lEX0VYUE9TVVJFOworICAgIH0KKyAgICBlbHNlIGlmIChjdHJsX3ZhbHVlX21vZGVfcGFyYW0gPT0gQ09OVFJBU1RfQ1RSTCkgeworICAgICAgICBwcmludGYoIllvdSBjaG9zZSBjb250cmFzdCB2YWx1ZVxuIik7CisgICAgICAgIGN0cmwuaWQgPSBWNEwyX0NJRF9DT05UUkFTVDsKKyAgICB9CisgICAgZWxzZSBpZiAoY3RybF92YWx1ZV9tb2RlX3BhcmFtID09IFNBVFVSQVRJT05fQ1RSTCkgeworICAgICAgICBwcmludGYoIllvdSBjaG9zZSBzYXR1cmF0aW9uIHZhbHVlXG4iKTsKKyAgICAgICAgY3RybC5pZCA9IFY0TDJfQ0lEX1NBVFVSQVRJT047CisgICAgfSBlbHNlIGlmIChjdHJsX3ZhbHVlX21vZGVfcGFyYW0gPT0gU0hBUlBORVNTX0NUUkwpIHsKKyAgICAgICAgcHJpbnRmKCJZb3UgY2hvc2Ugc2hhcnBuZXNzIHZhbHVlXG4iKTsKKyAgICAgICAgY3RybC5pZCA9IFY0TDJfQ0lEX1NIQVJQTkVTUzsKKyAgICB9CisKKyAgLy8gIHJjID0gaW9jdGwoY2FtZmQsIFZJRElPQ19HX0NUUkwsICZjdHJsKTsKKyAgICByZXR1cm4gcmM7CisjZW5kaWYKKyAgcmV0dXJuIGN0cmxfdmFsdWVfbW9kZV9wYXJhbTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgICAtIHRvZ2dsZV9hZnIgLQorICoKKyAqIERFU0NSSVBUSU9OOgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCB0b2dnbGVfYWZyICgpIHsKKyNpZiAwCisgICAgaWYgKGZwc19tb2RlID09IEZQU19NT0RFX0FVVE8pIHsKKyAgICAgICAgcHJpbnRmKCJcblNldHRpbmcgRlBTX01PREVfRklYRURcbiIpOworICAgICAgICBmcHNfbW9kZSA9IEZQU19NT0RFX0ZJWEVEOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiXG5TZXR0aW5nIEZQU19NT0RFX0FVVE9cbiIpOworICAgICAgICBmcHNfbW9kZSA9IEZQU19NT0RFX0FVVE87CisgICAgfQorICAgIHJldHVybiBtbV9hcHBfc2V0X2NvbmZpZ19wYXJtKGNhbV9pZCwgTU1fQ0FNRVJBX1BBUk1fRlBTX01PREUsIGZwc19tb2RlKTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KK2ludCBzZXRfem9vbSAobW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUsIGludCB6b29tX2FjdGlvbl9wYXJhbSkgeworCisgICAgaWYgKHpvb21fYWN0aW9uX3BhcmFtID09IFpPT01fSU4pIHsKKyAgICAgICAgem9vbV9sZXZlbCArPSBaT09NX1NURVA7CisgICAgICAgIGlmICh6b29tX2xldmVsID4gem9vbV9tYXhfdmFsdWUpCisgICAgICAgICAgICB6b29tX2xldmVsID0gem9vbV9tYXhfdmFsdWU7CisgICAgfSBlbHNlIGlmICh6b29tX2FjdGlvbl9wYXJhbSA9PSBaT09NX09VVCkgeworICAgICAgICB6b29tX2xldmVsIC09IFpPT01fU1RFUDsKKyAgICAgICAgaWYgKHpvb21fbGV2ZWwgPCBaT09NX01JTl9WQUxVRSkKKyAgICAgICAgICAgIHpvb21fbGV2ZWwgPSBaT09NX01JTl9WQUxVRTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dEKCIgSW52YWxpZCB6b29tX2FjdGlvbl9wYXJhbSB2YWx1ZVxuIik7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICByZXR1cm4gbW1fY2FtZXJhX2xpYl9zZW5kX2NvbW1hbmQobGliX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0xJQl9aT09NLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmem9vbV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICAgLSBzZXRfaXNvIC0KKyAqCisgKiBERVNDUklQVElPTjoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgc2V0X2lzbyAobW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUsIGludCBpc29fYWN0aW9uX3BhcmFtKSB7CisgICAgY2FtX2lzb19tb2RlX3R5cGUgdHlwZSA9IDA7CisgICAgc3dpdGNoIChpc29fYWN0aW9uX3BhcmFtKSB7CisgICAgICAgIGNhc2UgSVNPX0FVVE86CisgICAgICAgICAgICBwcmludGYoIlxuIElTT19BVVRPXG4iKTsKKyAgICAgICAgICAgIHR5cGUgPSBDQU1fSVNPX01PREVfQVVUTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElTT19ERUJMVVI6CisgICAgICAgICAgICBwcmludGYoIlxuIElTT19ERUJMVVJcbiIpOworICAgICAgICAgICAgdHlwZSA9IENBTV9JU09fTU9ERV9ERUJMVVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJU09fMTAwOgorICAgICAgICAgICAgcHJpbnRmKCJcbiBJU09fMTAwXG4iKTsKKyAgICAgICAgICAgIHR5cGUgPSBDQU1fSVNPX01PREVfMTAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVNPXzIwMDoKKyAgICAgICAgICAgIHByaW50ZigiXG4gSVNPXzIwMFxuIik7CisgICAgICAgICAgICB0eXBlID0gQ0FNX0lTT19NT0RFXzIwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElTT180MDA6CisgICAgICAgICAgICBwcmludGYoIlxuIElTT180MDBcbiIpOworICAgICAgICAgICAgdHlwZSA9IENBTV9JU09fTU9ERV80MDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJU09fODAwOgorICAgICAgICAgICAgcHJpbnRmKCJcbiBJU09fODAwXG4iKTsKKyAgICAgICAgICAgIHR5cGUgPSBDQU1fSVNPX01PREVfODAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSVNPXzE2MDA6CisgICAgICAgICAgICBwcmludGYoIlxuIElTT18xNjAwXG4iKTsKKyAgICAgICAgICAgIHR5cGUgPSBDQU1fSVNPX01PREVfMTYwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZChsaWJfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DQU1FUkFfTElCX0lTTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICAgIC0gaW5jcmVhc2Vfc2hhcnBuZXNzIC0KKyAqCisgKiBERVNDUklQVElPTjoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgaW5jcmVhc2Vfc2hhcnBuZXNzIChtbV9jYW1lcmFfbGliX2hhbmRsZSAqbGliX2hhbmRsZSkgeworICAgIHNoYXJwbmVzcyArPSBDQU1FUkFfU0hBUlBORVNTX1NURVA7CisgICAgaWYgKHNoYXJwbmVzcyA+IENBTUVSQV9NQVhfU0hBUlBORVNTKSB7CisgICAgICAgIHNoYXJwbmVzcyA9IENBTUVSQV9NQVhfU0hBUlBORVNTOworICAgICAgICBwcmludGYoIlJlYWNoZWQgbWF4IFNIQVJQTkVTUy4gXG4iKTsKKyAgICB9CisgICAgcHJpbnRmKCJJbmNyZWFzZSBTaGFycG5lc3MgdG8gJWRcbiIsIHNoYXJwbmVzcyk7CisgICAgcmV0dXJuIG1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKGxpYl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NBTUVSQV9MSUJfU0hBUlBORVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2hhcnBuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgICAtIGRlY3JlYXNlX3NoYXJwbmVzcyAtCisgKgorICogREVTQ1JJUFRJT046CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IGRlY3JlYXNlX3NoYXJwbmVzcyAobW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUpIHsKKyAgICBzaGFycG5lc3MgLT0gQ0FNRVJBX1NIQVJQTkVTU19TVEVQOworICAgIGlmIChzaGFycG5lc3MgPCBDQU1FUkFfTUlOX1NIQVJQTkVTUykgeworICAgICAgICBzaGFycG5lc3MgPSBDQU1FUkFfTUlOX1NIQVJQTkVTUzsKKyAgICAgICAgcHJpbnRmKCJSZWFjaGVkIG1pbiBTSEFSUE5FU1MuIFxuIik7CisgICAgfQorICAgIHByaW50ZigiRGVjcmVhc2UgU2hhcnBuZXNzIHRvICVkXG4iLCBzaGFycG5lc3MpOworICAgIHJldHVybiBtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZChsaWJfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DQU1FUkFfTElCX1NIQVJQTkVTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Cit9CisKK2ludCBzZXRfZmxhc2hfbW9kZSAobW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUsIGludCBhY3Rpb25fcGFyYW0pIHsKKyAgICBjYW1fZmxhc2hfbW9kZV90IHR5cGUgPSAwOworICAgIHN3aXRjaCAoYWN0aW9uX3BhcmFtKSB7CisgICAgICAgIGNhc2UgRkxBU0hfTU9ERV9PRkY6CisgICAgICAgICAgICBwcmludGYoIlxuIEZMQVNIX01PREVfT0ZGXG4iKTsKKyAgICAgICAgICAgIHR5cGUgPSBDQU1fRkxBU0hfTU9ERV9PRkY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGTEFTSF9NT0RFX0FVVE86CisgICAgICAgICAgICBwcmludGYoIlxuIEZMQVNIX01PREVfQVVUT1xuIik7CisgICAgICAgICAgICB0eXBlID0gQ0FNX0ZMQVNIX01PREVfQVVUTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZMQVNIX01PREVfT046CisgICAgICAgICAgICBwcmludGYoIlxuIEZMQVNIX01PREVfT05cbiIpOworICAgICAgICAgICAgdHlwZSA9IENBTV9GTEFTSF9NT0RFX09OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkxBU0hfTU9ERV9UT1JDSDoKKyAgICAgICAgICAgIHByaW50ZigiXG4gRkxBU0hfTU9ERV9UT1JDSFxuIik7CisgICAgICAgICAgICB0eXBlID0gQ0FNX0ZMQVNIX01PREVfVE9SQ0g7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbW1fY2FtZXJhX2xpYl9zZW5kX2NvbW1hbmQobGliX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0xJQl9GTEFTSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworfQorCitpbnQgc2V0X2Jlc3RzaG90X21vZGUobW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUsIGludCBhY3Rpb25fcGFyYW0pIHsKKyAgICBjYW1fc2NlbmVfbW9kZV90eXBlIHR5cGUgPSAwOworICAgIHN3aXRjaCAoYWN0aW9uX3BhcmFtKSB7CisgICAgICAgY2FzZSBCRVNUU0hPVF9BVVRPOgorICAgICAgICAgICAgcHJpbnRmKCJcbiBCRVNUIFNIT1QgQVVUT1xuIik7CisgICAgICAgICAgICB0eXBlID0gQ0FNX1NDRU5FX01PREVfT0ZGOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkVTVFNIT1RfQUNUSU9OOgorICAgICAgICAgICAgcHJpbnRmKCJcbiBCRVNUIFNIT1QgQUNUSU9OXG4iKTsKKyAgICAgICAgICAgIHR5cGUgPSBDQU1fU0NFTkVfTU9ERV9BQ1RJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRVNUU0hPVF9QT1JUUkFJVDoKKyAgICAgICAgICAgIHByaW50ZigiXG4gQkVTVCBTSE9UIFBPUlRSQUlUXG4iKTsKKyAgICAgICAgICAgIHR5cGUgPSBDQU1fU0NFTkVfTU9ERV9QT1JUUkFJVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJFU1RTSE9UX0xBTkRTQ0FQRToKKyAgICAgICAgICAgIHByaW50ZigiXG4gQkVTVCBTSE9UIExBTkRTQ0FQRVxuIik7CisgICAgICAgICAgICB0eXBlID0gQ0FNX1NDRU5FX01PREVfTEFORFNDQVBFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkVTVFNIT1RfTklHSFQ6CisgICAgICAgICAgICBwcmludGYoIlxuIEJFU1QgU0hPVCBOSUdIVFxuIik7CisgICAgICAgICAgICB0eXBlID0gQ0FNX1NDRU5FX01PREVfTklHSFQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRVNUU0hPVF9OSUdIVF9QT1JUUkFJVDoKKyAgICAgICAgICAgIHByaW50ZigiXG4gQkVTVCBTSE9UIE5JR0hUIFBPUlRSQUlUXG4iKTsKKyAgICAgICAgICAgIHR5cGUgPSBDQU1fU0NFTkVfTU9ERV9OSUdIVF9QT1JUUkFJVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJFU1RTSE9UX1RIRUFUUkU6CisgICAgICAgICAgICBwcmludGYoIlxuIEJFU1QgU0hPVCBUSFJFQVRSRVxuIik7CisgICAgICAgICAgICB0eXBlID0gQ0FNX1NDRU5FX01PREVfVEhFQVRSRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJFU1RTSE9UX0JFQUNIOgorICAgICAgICAgICAgcHJpbnRmKCJcbiBCRVNUIFNIT1QgQkVBQ0hcbiIpOworICAgICAgICAgICAgdHlwZSA9IENBTV9TQ0VORV9NT0RFX0JFQUNIOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkVTVFNIT1RfU05PVzoKKyAgICAgICAgICAgIHByaW50ZigiXG4gQkVTVCBTSE9UIFNOT1dcbiIpOworICAgICAgICAgICAgdHlwZSA9IENBTV9TQ0VORV9NT0RFX1NOT1c7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRVNUU0hPVF9TVU5TRVQ6CisgICAgICAgICAgICBwcmludGYoIlxuIEJFU1QgU0hPVCBTVU5TRVRcbiIpOworICAgICAgICAgICAgdHlwZSA9IENBTV9TQ0VORV9NT0RFX1NVTlNFVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJFU1RTSE9UX0FOVElTSEFLRToKKyAgICAgICAgICAgIHByaW50ZigiXG4gQkVTVCBTSE9UIEFOVElTSEFLRVxuIik7CisgICAgICAgICAgICB0eXBlID0gQ0FNX1NDRU5FX01PREVfQU5USVNIQUtFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkVTVFNIT1RfRklSRVdPUktTOgorICAgICAgICAgICAgcHJpbnRmKCJcbiBCRVNUIFNIT1QgRklSRVdPUktTXG4iKTsKKyAgICAgICAgICAgIHR5cGUgPSBDQU1fU0NFTkVfTU9ERV9GSVJFV09SS1M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRVNUU0hPVF9TUE9SVFM6CisgICAgICAgICAgICBwcmludGYoIlxuIEJFU1QgU0hPVCBTUE9SVFNcbiIpOworICAgICAgICAgICAgdHlwZSA9IENBTV9TQ0VORV9NT0RFX1NQT1JUUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJFU1RTSE9UX1BBUlRZOgorICAgICAgICAgICAgcHJpbnRmKCJcbiBCRVNUIFNIT1QgUEFSVFlcbiIpOworICAgICAgICAgICAgdHlwZSA9IENBTV9TQ0VORV9NT0RFX1BBUlRZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkVTVFNIT1RfQ0FORExFTElHSFQ6CisgICAgICAgICAgICBwcmludGYoIlxuIEJFU1QgU0hPVCBDQU5ETEVMSUdIVFxuIik7CisgICAgICAgICAgICB0eXBlID0gQ0FNX1NDRU5FX01PREVfQ0FORExFTElHSFQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRVNUU0hPVF9BU0Q6CisgICAgICAgICAgICBwcmludGYoIlxuIEJFU1QgU0hPVCBBU0RcbiIpOworICAgICAgICAgICAgdHlwZSA9IENBTV9TQ0VORV9NT0RFX0FVVE87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRVNUU0hPVF9CQUNLTElHSFQ6CisgICAgICAgICAgICBwcmludGYoIlxuIEJFU1QgU0hPVCBCQUNLTElHSFRcbiIpOworICAgICAgICAgICAgdHlwZSA9IENBTV9TQ0VORV9NT0RFX0JBQ0tMSUdIVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEJFU1RTSE9UX0ZMT1dFUlM6CisgICAgICAgICAgICBwcmludGYoIlxuIEJFU1QgU0hPVCBGTE9XRVJTXG4iKTsKKyAgICAgICAgICAgIHR5cGUgPSBDQU1fU0NFTkVfTU9ERV9GTE9XRVJTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQkVTVFNIT1RfQVI6CisgICAgICAgICAgICBwcmludGYoIlxuIEJFU1QgU0hPVCBBUlxuIik7CisgICAgICAgICAgICB0eXBlID0gQ0FNX1NDRU5FX01PREVfQVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBCRVNUU0hPVF9IRFI6CisgICAgICAgICAgICBwcmludGYoIlxuIEJFU1QgU0hPVCBIRFJcbiIpOworICAgICAgICAgICAgdHlwZSA9IENBTV9TQ0VORV9NT0RFX09GRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKGxpYl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DQU1FUkFfTElCX0JFU1RTSE9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICAgLSBwcmludF9jdXJyZW50X21lbnUgLQorICoKKyAqIERFU0NSSVBUSU9OOgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBwcmludF9jdXJyZW50X21lbnUgKG1lbnVfaWRfY2hhbmdlX3QgY3VycmVudF9tZW51X2lkKSB7CisgIGlmIChjdXJyZW50X21lbnVfaWQgPT0gTUVOVV9JRF9NQUlOKSB7CisgICAgcHJpbnRfbWVudV9wcmV2aWV3X3ZpZGVvICgpOworICB9IGVsc2UgaWYgKGN1cnJlbnRfbWVudV9pZCA9PSBNRU5VX0lEX1dISVRFQkFMQU5DRUNIQU5HRSkgeworICAgIGNhbWVyYV9wcmV2aWV3X3ZpZGVvX3diX2NoYW5nZV90YmwoKTsKKyAgfSBlbHNlIGlmIChjdXJyZW50X21lbnVfaWQgPT0gTUVOVV9JRF9FWFBNRVRFUklOR0NIQU5HRSkgeworICAgIGNhbWVyYV9wcmV2aWV3X3ZpZGVvX2V4cF9tZXRlcmluZ19jaGFuZ2VfdGJsKCk7CisgIH0gZWxzZSBpZiAoY3VycmVudF9tZW51X2lkID09IE1FTlVfSURfR0VUX0NUUkxfVkFMVUUpIHsKKyAgICBjYW1lcmFfcHJldmlld192aWRlb19nZXRfY3RybF92YWx1ZV90YmwoKTsKKyAgfSBlbHNlIGlmIChjdXJyZW50X21lbnVfaWQgPT0gTUVOVV9JRF9JU09DSEFOR0UpIHsKKyAgICBjYW1lcmFfcHJldmlld192aWRlb19pc29fY2hhbmdlX3RibCgpOworICB9IGVsc2UgaWYgKGN1cnJlbnRfbWVudV9pZCA9PSBNRU5VX0lEX0JSSUdIVE5FU1NDSEFOR0UpIHsKKyAgICBjYW1lcmFfYnJpZ2h0bmVzc19jaGFuZ2VfdGJsICgpOworICB9IGVsc2UgaWYgKGN1cnJlbnRfbWVudV9pZCA9PSBNRU5VX0lEX0NPTlRSQVNUQ0hBTkdFKSB7CisgICAgY2FtZXJhX2NvbnRyYXN0X2NoYW5nZV90YmwgKCk7CisgIH0gZWxzZSBpZiAoY3VycmVudF9tZW51X2lkID09IE1FTlVfSURfRVZDSEFOR0UpIHsKKyAgICBjYW1lcmFfRVZfY2hhbmdlX3RibCAoKTsKKyAgfSBlbHNlIGlmIChjdXJyZW50X21lbnVfaWQgPT0gTUVOVV9JRF9TQVRVUkFUSU9OQ0hBTkdFKSB7CisgICAgY2FtZXJhX3NhdHVyYXRpb25fY2hhbmdlX3RibCAoKTsKKyAgfSBlbHNlIGlmIChjdXJyZW50X21lbnVfaWQgPT0gTUVOVV9JRF9aT09NQ0hBTkdFKSB7CisgICAgY2FtZXJhX3ByZXZpZXdfdmlkZW9fem9vbV9jaGFuZ2VfdGJsKCk7CisgIH0gZWxzZSBpZiAoY3VycmVudF9tZW51X2lkID09IE1FTlVfSURfU0hBUlBORVNTQ0hBTkdFKSB7CisgICAgY2FtZXJhX3ByZXZpZXdfdmlkZW9fc2hhcnBuZXNzX2NoYW5nZV90YmwoKTsKKyAgfSBlbHNlIGlmIChjdXJyZW50X21lbnVfaWQgPT0gTUVOVV9JRF9CRVNUU0hPVCkgeworICAgIGNhbWVyYV9zZXRfYmVzdHNob3RfdGJsKCk7CisgIH0gZWxzZSBpZiAoY3VycmVudF9tZW51X2lkID09IE1FTlVfSURfRkxBU0hNT0RFKSB7CisgICAgY2FtZXJhX3NldF9mbGFzaG1vZGVfdGJsKCk7CisgIH0gZWxzZSBpZiAoY3VycmVudF9tZW51X2lkID09IE1FTlVfSURfU0VOU09SUyApIHsKKyAgICBjYW1lcmFfc2Vuc29yc190YmwoKTsKKyAgfSBlbHNlIGlmIChjdXJyZW50X21lbnVfaWQgPT0gTUVOVV9JRF9TV0lUQ0hfUkVTICkgeworICAgIGNhbWVyYV9yZXNvbHV0aW9uX2NoYW5nZV90YmwoKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCitpbnQgZmlsdGVyX3Jlc29sdXRpb25zKG1tX2NhbWVyYV9saWJfaGFuZGxlICpsaWJfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICBESU1FTlNJT05fVEJMX1QgKnRibCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRibF9zaXplKQoreworICAgIHNpemVfdCBpLCBqOworICAgIGNhbV9jYXBhYmlsaXR5X3QgY2FtZXJhX2NhcDsKKyAgICBpbnQgcmMgPSAwOworCisgICAgaWYgKCAoIE5VTEwgPT0gbGliX2hhbmRsZSApIHx8ICggTlVMTCA9PSB0YmwgKSApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJjID0gbW1fY2FtZXJhX2xpYl9nZXRfY2FwcyhsaWJfaGFuZGxlLCAmY2FtZXJhX2NhcCk7CisgICAgaWYgKCBNTV9DQU1FUkFfT0sgIT0gcmMgKSB7CisgICAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfZ2V0X2NhcHMoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmb3IoIGkgPSAwIDsgaSA8IHRibF9zaXplIDsgaSsrICkgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwgY2FtZXJhX2NhcC5waWN0dXJlX3NpemVzX3RibF9jbnQ7IGorKyApIHsKKyAgICAgICAgICAgIGlmICggKCB0YmxbaV0ud2lkdGggPT0gY2FtZXJhX2NhcC5waWN0dXJlX3NpemVzX3RibFtqXS53aWR0aCApICYmCisgICAgICAgICAgICAgICAgICggdGJsW2ldLmhlaWdodCA9PSBjYW1lcmFfY2FwLnBpY3R1cmVfc2l6ZXNfdGJsW2pdLmhlaWdodCApICkgeworICAgICAgICAgICAgICAgIHRibFtpXS5zdXBwb3J0ZWQgPSAxOworICAgICAgICAgICAgICAgIHJjID0gKGludClpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGVuYWJsZUFGUgorICoKKyAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIHdpbGwgZ28gdGhyb3VnaCB0aGUgbGlzdAorICogICAgICAgICAgICAgIG9mIHN1cHBvcnRlZCBGUFMgcmFuZ2VzIGFuZCBzZWxlY3QgdGhlCisgKiAgICAgICAgICAgICAgb25lIHdoaWNoIGhhcyBtYXhpbXVtIHJhbmdlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBsaWJfaGFuZGxlICAgOiBjYW1lcmEgdGVzdCBsaWJyYXJ5IGhhbmRsZQorICoKKyAqIFJFVFVSTiAgICAgOiB1aW50MzJfdCB0eXBlIG9mIHN0cmVhbSBoYW5kbGUKKyAqICAgICAgICAgICAgICBNTV9DQU1FUkFfT0sgIC0tIFN1Y2Nlc3MKKyAqICAgICAgICAgICAgICAhPU1NX0NBTUVSQV9PSyAtLSBFcnJvciBzdGF0dXMKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50IGVuYWJsZUFGUihtbV9jYW1lcmFfbGliX2hhbmRsZSAqbGliX2hhbmRsZSkKK3sKKyAgICBzaXplX3QgaSwgajsKKyAgICBmbG9hdCBtYXhfcmFuZ2UgPSAwLjBmOworICAgIGNhbV9jYXBhYmlsaXR5X3QgY2FwOworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIGlmICggTlVMTCA9PSBsaWJfaGFuZGxlICkgeworICAgICAgICByZXR1cm4gTU1fQ0FNRVJBX0VfSU5WQUxJRF9JTlBVVDsKKyAgICB9CisKKyAgICByYyA9IG1tX2NhbWVyYV9saWJfZ2V0X2NhcHMobGliX2hhbmRsZSwgJmNhcCk7CisgICAgaWYgKCBNTV9DQU1FUkFfT0sgIT0gcmMgKSB7CisgICAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfZ2V0X2NhcHMoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBmb3IoIGkgPSAwLCBqID0gMCA7IGkgPCBjYXAuZnBzX3Jhbmdlc190YmxfY250IDsgaSsrICkgeworICAgICAgICBpZiAoIG1heF9yYW5nZSA8IChjYXAuZnBzX3Jhbmdlc190YmxbaV0ubWF4X2ZwcyAtIGNhcC5mcHNfcmFuZ2VzX3RibFtpXS5taW5fZnBzKSApIHsKKyAgICAgICAgICAgIGogPSBpOworICAgICAgICB9CisgICAgfQorCisgICAgcmMgPSBtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZChsaWJfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0xJQl9GUFNfUkFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FwLmZwc19yYW5nZXNfdGJsW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICBMT0dFKCJGUFMgcmFuZ2UgWyU1LjJmOiU1LjJmXSByYyA9ICVkIiwKKyAgICAgICAgICAgICAgY2FwLmZwc19yYW5nZXNfdGJsW2pdLm1pbl9mcHMsCisgICAgICAgICAgICAgIGNhcC5mcHNfcmFuZ2VzX3RibFtqXS5tYXhfZnBzLAorICAgICAgICAgICAgICByYyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgICAgLSBzdWJtYWluIC0KKyAqCisgKiBERVNDUklQVElPTjoKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitzdGF0aWMgaW50IHN1Ym1haW4oKQoreworICAgIGludCByYyA9IDA7CisgICAgY2hhciB0Y19idWZbM107CisgICAgbWVudV9pZF9jaGFuZ2VfdCBjdXJyZW50X21lbnVfaWQgPSBNRU5VX0lEX01BSU4sIG5leHRfbWVudV9pZDsKKyAgICBjYW1lcmFfYWN0aW9uX3QgYWN0aW9uX2lkOworICAgIGludCBhY3Rpb25fcGFyYW07CisgICAgdWludDhfdCBwcmV2aWV3aW5nID0gMDsKKyAgICBpbnQgaXNaU0wgPSAwOworICAgIGludCBpc2V6VHVuZSA9IDA7CisgICAgaW50IGlzaXJtb2RlID0gMDsKKyAgICB1aW50OF90IHducl9lbmFibGVkID0gMDsKKyAgICBtbV9jYW1lcmFfbGliX2hhbmRsZSBsaWJfaGFuZGxlOworICAgIGludCBudW1fY2FtZXJhczsKKyAgICBpbnQgYXZhaWxhYmxlX3NlbnNvcnMgPQorICAgICAgICAoaW50KShzaXplb2Yoc2Vuc29yX3RibCkgLyBzaXplb2Yoc2Vuc29yX3RibFswXSkpOworICAgIGludCBhdmFpbGFibGVfc25hcF9zaXplcyA9CisgICAgICAgIChpbnQpKHNpemVvZihkaW1lbnNpb25fdGJsKS9zaXplb2YoZGltZW5zaW9uX3RibFswXSkpOworICAgIGludCBpLGM7CisgICAgbW1fY2FtZXJhX2xpYl9zbmFwc2hvdF9wYXJhbXMgc25hcF9kaW07CisgICAgc25hcF9kaW0ud2lkdGggPSBERUZBVUxUX1NOQVBTSE9UX1dJRFRIOworICAgIHNuYXBfZGltLmhlaWdodCA9IERFRkFVTFRfU05BUFNIT1RfSEVJR0hUOworICAgIGNhbV9zY2VuZV9tb2RlX3R5cGUgZGVmYXVsdF9zY2VuZT0gQ0FNX1NDRU5FX01PREVfT0ZGOworICAgIGludCBzZXRfdGludGxlc3M9IDA7CisKKyAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCB0ZXN0X29iajsKKyAgICBtZW1zZXQoJnRlc3Rfb2JqLCAwLCBzaXplb2YobW1fY2FtZXJhX3Rlc3Rfb2JqX3QpKTsKKyAgICBtZW1zZXQoJnNuYXBfZGltLCAwLCBzaXplb2YobW1fY2FtZXJhX2xpYl9zbmFwc2hvdF9wYXJhbXMpKTsKKworICAgIHJjID0gbW1fY2FtZXJhX2xpYl9vcGVuKCZsaWJfaGFuZGxlLCAwKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfb3BlbigpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG51bV9jYW1lcmFzID0gbW1fY2FtZXJhX2xpYl9udW1iZXJfb2ZfY2FtZXJhcygmbGliX2hhbmRsZSk7CisgICAgaWYgKCAwID49IG51bV9jYW1lcmFzICkgeworICAgICAgICBMT0dFKCIgTm8gY2FtZXJhIHNlbnNvcnMgcmVwb3J0ZWQhIik7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfSBlbHNlIGlmICggMSA8PSBudW1fY2FtZXJhcyApIHsKKyAgICAgICAgYyA9IE1JTihudW1fY2FtZXJhcywgYXZhaWxhYmxlX3NlbnNvcnMpOworICAgICAgICBmb3IgKCBpID0gMCA7IGkgPCBjIDsgaSsrICkgeworICAgICAgICAgICAgc2Vuc29yX3RibFtpXS5wcmVzZW50ID0gMTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50X21lbnVfaWQgPSBNRU5VX0lEX1NFTlNPUlM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaSA9IGZpbHRlcl9yZXNvbHV0aW9ucygmbGliX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uX3RibCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdClhdmFpbGFibGVfc25hcF9zaXplcyk7CisgICAgICAgIGlmICggKCBpIDwgMCApIHx8ICggaSA+PSBhdmFpbGFibGVfc25hcF9zaXplcyApICkgeworICAgICAgICAgICAgTE9HRSgiZmlsdGVyX3Jlc29sdXRpb25zKClcbiIpOworICAgICAgICAgICAgZ290byBFUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzbmFwX2RpbS53aWR0aCA9IGRpbWVuc2lvbl90YmxbaV0ud2lkdGg7CisgICAgICAgIHNuYXBfZGltLmhlaWdodCA9IGRpbWVuc2lvbl90YmxbaV0uaGVpZ2h0OworCisgICAgICAgIHJjID0gZW5hYmxlQUZSKCZsaWJfaGFuZGxlKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgiZW5hYmxlQUZSKCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgZ290byBFUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gIG1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKCZsaWJfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DQU1FUkFfTElCX0JFU1RTSE9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdF9zY2VuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgZ290byBFUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRvIHsKKyAgICAgICAgcHJpbnRfY3VycmVudF9tZW51IChjdXJyZW50X21lbnVfaWQpOworICAgICAgICBmZ2V0cyh0Y19idWYsIDMsIHN0ZGluKTsKKworICAgICAgICBuZXh0X21lbnVfaWQgPSBuZXh0X21lbnUoY3VycmVudF9tZW51X2lkLCB0Y19idWZbMF0sICYgYWN0aW9uX2lkLCAmIGFjdGlvbl9wYXJhbSk7CisKKyAgICAgICAgaWYgKG5leHRfbWVudV9pZCAhPSBNRU5VX0lEX0lOVkFMSUQpIHsKKyAgICAgICAgICBjdXJyZW50X21lbnVfaWQgPSBuZXh0X21lbnVfaWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFjdGlvbl9pZCA9PSBBQ1RJT05fTk9fQUNUSU9OKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2goYWN0aW9uX2lkKSB7CisgICAgICAgICAgICBjYXNlIEFDVElPTl9TVEFSVF9QUkVWSUVXOgorICAgICAgICAgICAgICAgIExPR0UoIkFDVElPTl9TVEFSVF9QUkVWSUVXIFxuIik7CisgICAgICAgICAgICAgICAgcmMgPSBtbV9jYW1lcmFfbGliX3N0YXJ0X3N0cmVhbSgmbGliX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJtbV9jYW1lcmFfbGliX3N0YXJ0X3N0cmVhbSgpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBFUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldmlld2luZyA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX1NUT1BfUFJFVklFVzoKKyAgICAgICAgICAgICAgICBMT0dEKCJBQ1RJT05fU1RPUF9QUkVWSUVXIFxuIik7CisgICAgICAgICAgICAgICAgcmMgPSBtbV9jYW1lcmFfbGliX3N0b3Bfc3RyZWFtKCZsaWJfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfc3RvcF9zdHJlYW0oKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZXZpZXdpbmcgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFDVElPTl9TRVRfV0hJVEVfQkFMQU5DRToKKyAgICAgICAgICAgICAgICBMT0dEKCJTZWxlY3Rpb24gZm9yIHRoZSBXaGl0ZSBCYWxhbmNlIGNoYW5nZXNcbiIpOworICAgICAgICAgICAgICAgIHNldF93aGl0ZWJhbGFuY2UoJmxpYl9oYW5kbGUsIGFjdGlvbl9wYXJhbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX1NFVF9USU5UTEVTU19FTkFCTEU6CisgICAgICAgICAgICAgICAgTE9HRCgiU2VsZWN0aW9uIGZvciB0aGUgVGludGxlc3MgZW5hYmxlIGNoYW5nZXNcbiIpOworICAgICAgICAgICAgICAgIHNldF90aW50bGVzcyA9IDE7CisgICAgICAgICAgICAgICAgcmMgPSAgbW1fY2FtZXJhX2xpYl9zZW5kX2NvbW1hbmQoJmxpYl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0xJQl9TRVRfVElOVExFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNldF90aW50bGVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgICAgICBnb3RvIEVSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBQ1RJT05fU0VUX1RJTlRMRVNTX0RJU0FCTEU6CisgICAgICAgICAgICAgICAgTE9HRCgiU2VsZWN0aW9uIGZvciB0aGUgVGludGxlc3MgZGlzYWJsZSBjaGFuZ2VzXG4iKTsKKyAgICAgICAgICAgICAgICBzZXRfdGludGxlc3MgPSAwOworICAgICAgICAgICAgICAgIHJjID0gIG1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKCZsaWJfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NBTUVSQV9MSUJfU0VUX1RJTlRMRVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXRfdGludGxlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZCgpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBFUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX1NFVF9FWFBfTUVURVJJTkc6CisgICAgICAgICAgICAgICAgTE9HRCgiU2VsZWN0aW9uIGZvciB0aGUgRXhwb3N1cmUgTWV0ZXJpbmcgY2hhbmdlc1xuIik7CisgICAgICAgICAgICAgICAgc2V0X2V4cF9tZXRlcmluZygmbGliX2hhbmRsZSwgYWN0aW9uX3BhcmFtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBQ1RJT05fQlJJR0hUTkVTU19JTkNSRUFTRToKKyAgICAgICAgICAgICAgICBwcmludGYoIkluY3JlYXNlIGJyaWdodG5lc3NcbiIpOworICAgICAgICAgICAgICAgIGluY3JlYXNlX2JyaWdodG5lc3MoJmxpYl9oYW5kbGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFDVElPTl9CUklHSFRORVNTX0RFQ1JFQVNFOgorICAgICAgICAgICAgICAgIHByaW50ZigiRGVjcmVhc2UgYnJpZ2h0bmVzc1xuIik7CisgICAgICAgICAgICAgICAgZGVjcmVhc2VfYnJpZ2h0bmVzcygmbGliX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX0NPTlRSQVNUX0lOQ1JFQVNFOgorICAgICAgICAgICAgICAgIExPR0QoIlNlbGVjdGlvbiBmb3IgdGhlIGNvbnRyYXN0IGluY3JlYXNlXG4iKTsKKyAgICAgICAgICAgICAgICBpbmNyZWFzZV9jb250cmFzdCAoJmxpYl9oYW5kbGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFDVElPTl9DT05UUkFTVF9ERUNSRUFTRToKKyAgICAgICAgICAgICAgICBMT0dEKCJTZWxlY3Rpb24gZm9yIHRoZSBjb250cmFzdCBkZWNyZWFzZVxuIik7CisgICAgICAgICAgICAgICAgZGVjcmVhc2VfY29udHJhc3QgKCZsaWJfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBQ1RJT05fRVZfSU5DUkVBU0U6CisgICAgICAgICAgICAgICAgTE9HRCgiU2VsZWN0aW9uIGZvciB0aGUgRVYgaW5jcmVhc2VcbiIpOworICAgICAgICAgICAgICAgIGluY3JlYXNlX0VWICgmbGliX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX0VWX0RFQ1JFQVNFOgorICAgICAgICAgICAgICAgIExPR0QoIlNlbGVjdGlvbiBmb3IgdGhlIEVWIGRlY3JlYXNlXG4iKTsKKyAgICAgICAgICAgICAgICBkZWNyZWFzZV9FViAoJmxpYl9oYW5kbGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFDVElPTl9TQVRVUkFUSU9OX0lOQ1JFQVNFOgorICAgICAgICAgICAgICAgIExPR0QoIlNlbGVjdGlvbiBmb3IgdGhlIEVWIGluY3JlYXNlXG4iKTsKKyAgICAgICAgICAgICAgICBpbmNyZWFzZV9zYXR1cmF0aW9uICgmbGliX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX1NBVFVSQVRJT05fREVDUkVBU0U6CisgICAgICAgICAgICAgICAgTE9HRCgiU2VsZWN0aW9uIGZvciB0aGUgRVYgZGVjcmVhc2VcbiIpOworICAgICAgICAgICAgICAgIGRlY3JlYXNlX3NhdHVyYXRpb24gKCZsaWJfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBQ1RJT05fVE9HR0xFX0FGUjoKKyAgICAgICAgICAgICAgICBMT0dEKCJTZWxlY3QgZm9yIGF1dG8gZnJhbWUgcmF0ZSB0b2dnbGluZ1xuIik7CisgICAgICAgICAgICAgICAgdG9nZ2xlX2FmcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFDVElPTl9UT0dHTEVfRVpUVU5FOgorICAgICAgICAgICAgICAgIExPR0UoIlNlbGVjdCBmb3IgRXpUdW5lIik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFWlRVTkUgVG9nZ2xlXG4iKTsKKyAgICAgICAgICAgICAgICBpc2V6VHVuZSA9ICFpc2V6VHVuZTsKKyAgICAgICAgICAgICAgICBpZiAoaXNlelR1bmUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFWiBUVU5FIE9uICEhISIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRVogVFVORSBPZmYgISEhIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmMgPSBtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZCgmbGliX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0xJQl9FWlRVTkVfRU5BQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNlelR1bmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgibW1fY2FtZXJhX2xpYl9zZW5kX2NvbW1hbmQoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFDVElPTl9UT0dHTEVfSVJfTU9ERToKKyAgICAgICAgICAgICAgICBMT0dFKCJTZWxlY3QgZm9yIElSIE1vZGUiKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIklSIE1vZGUgVG9nZ2xlXG4iKTsKKyAgICAgICAgICAgICAgICBpc2lybW9kZSA9ICFpc2lybW9kZTsKKyAgICAgICAgICAgICAgICBpZiAoaXNpcm1vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJJUiBNb2RlIE9uICEhISIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiSVIgTW9kZSBPZmYgISEhIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmMgPSBtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZCgmbGliX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0xJQl9JUk1PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc2lybW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZCgpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBFUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX1NFVF9JU086CisgICAgICAgICAgICAgICAgTE9HRCgiU2VsZWN0IGZvciBJU08gY2hhbmdlc1xuIik7CisgICAgICAgICAgICAgICAgc2V0X2lzbygmbGliX2hhbmRsZSwgYWN0aW9uX3BhcmFtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBQ1RJT05fU0VUX1pPT006CisgICAgICAgICAgICAgICAgTE9HRCgiU2VsZWN0aW9uIGZvciB0aGUgem9vbSBkaXJlY3Rpb24gY2hhbmdlc1xuIik7CisgICAgICAgICAgICAgICAgc2V0X3pvb20oJmxpYl9oYW5kbGUsIGFjdGlvbl9wYXJhbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX1NIQVJQTkVTU19JTkNSRUFTRToKKyAgICAgICAgICAgICAgICBMT0dEKCJTZWxlY3Rpb24gZm9yIHNoYXJwbmVzcyBpbmNyZWFzZVxuIik7CisgICAgICAgICAgICAgICAgaW5jcmVhc2Vfc2hhcnBuZXNzKCZsaWJfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBQ1RJT05fU0hBUlBORVNTX0RFQ1JFQVNFOgorICAgICAgICAgICAgICAgIExPR0QoIlNlbGVjdGlvbiBmb3Igc2hhcnBuZXNzIGRlY3JlYXNlXG4iKTsKKyAgICAgICAgICAgICAgICBkZWNyZWFzZV9zaGFycG5lc3MoJmxpYl9oYW5kbGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFDVElPTl9TRVRfQkVTVFNIT1RfTU9ERToKKyAgICAgICAgICAgICAgICBMT0dEKCJTZWxlY3Rpb24gZm9yIGJlc3RzaG90XG4iKTsKKyAgICAgICAgICAgICAgICBzZXRfYmVzdHNob3RfbW9kZSgmbGliX2hhbmRsZSwgYWN0aW9uX3BhcmFtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBQ1RJT05fU0VUX0ZMQVNIX01PREU6CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBTZWxlY3Rpb24gZm9yIGZsYXNobW9kZVxuIik7CisgICAgICAgICAgICAgICAgc2V0X2ZsYXNoX21vZGUoJmxpYl9oYW5kbGUsIGFjdGlvbl9wYXJhbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgQUNUSU9OX1NXSVRDSF9DQU1FUkE6CisgICAgICAgICAgICAgICAgcmMgPSBtbV9jYW1lcmFfbGliX2Nsb3NlKCZsaWJfaGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfY2xvc2UoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRVJST1I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmMgPSBtbV9jYW1lcmFfbGliX29wZW4oJmxpYl9oYW5kbGUsIGFjdGlvbl9wYXJhbSk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJtbV9jYW1lcmFfbGliX29wZW4oKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRVJST1I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaSA9IGZpbHRlcl9yZXNvbHV0aW9ucygmbGliX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25fdGJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkaW1lbnNpb25fdGJsKS9zaXplb2YoZGltZW5zaW9uX3RibFswXSkpOworICAgICAgICAgICAgICAgIGlmICggKCBpIDwgMCApIHx8ICggaSA+PSAgYXZhaWxhYmxlX3NuYXBfc2l6ZXMgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgiZmlsdGVyX3Jlc29sdXRpb25zKClcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIEVSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzbmFwX2RpbS53aWR0aCA9IGRpbWVuc2lvbl90YmxbaV0ud2lkdGg7CisgICAgICAgICAgICAgICAgc25hcF9kaW0uaGVpZ2h0ID0gZGltZW5zaW9uX3RibFtpXS5oZWlnaHQ7CisKKyAgICAgICAgICAgICAgICByYyA9IGVuYWJsZUFGUigmbGliX2hhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0dFKCJlbmFibGVBRlIoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRVJST1I7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmMgPSAgbW1fY2FtZXJhX2xpYl9zZW5kX2NvbW1hbmQoJmxpYl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0xJQl9CRVNUU0hPVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVmYXVsdF9zY2VuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgICAgICBnb3RvIEVSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBQ1RJT05fVE9HR0xFX1pTTDoKKyAgICAgICAgICAgICAgICBwcmludGYoIlpTTCBUb2dnbGUgISEhXG4iKTsKKyAgICAgICAgICAgICAgICBpc1pTTCA9ICFpc1pTTDsKKyAgICAgICAgICAgICAgICBpZiAoIGlzWlNMICkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIlpTTCBvbiAhISFcbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiWlNMIG9mZiAhISFcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzbmFwX2RpbS5pc1pTTCA9IGlzWlNMOworICAgICAgICAgICAgICAgIHJjID0gbW1fY2FtZXJhX2xpYl9zZW5kX2NvbW1hbmQoJmxpYl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DQU1FUkFfTElCX1pTTF9FTkFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc25hcF9kaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgICAgICBnb3RvIEVSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBBQ1RJT05fVEFLRV9SQVdfU05BUFNIT1Q6CisgICAgICAgICAgICAgICAgTE9HSCgiXG4gVGFrZSBSQVcgc25hcHNob3RcbiIpOworCisgICAgICAgICAgICAgICAgcmMgPSBtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZCgmbGliX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NBTUVSQV9MSUJfRE9fQUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisKKyAgICAgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0UoIm1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKCkgZXJyPSVkXG4iLCAgcmMpOworICAgICAgICAgICAgICAgICAgICBnb3RvIEVSUk9SOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJjID0gbW1fY2FtZXJhX2xpYl9zZW5kX2NvbW1hbmQoJmxpYl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DQU1FUkFfTElCX1JBV19DQVBUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgibW1fY2FtZXJhX2xpYl9zZW5kX2NvbW1hbmQoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFDVElPTl9UQUtFX0pQRUdfU05BUFNIT1Q6CisgICAgICAgICAgICAgICAgTE9HSCgiXG4gVGFrZSBKUEVHIHNuYXBzaG90XG4iKTsKKworICAgICAgICAgICAgICAgIHJjID0gbW1fY2FtZXJhX2xpYl9zZW5kX2NvbW1hbmQoJmxpYl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DQU1FUkFfTElCX0pQRUdfQ0FQVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbmFwX2RpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HRSgibW1fY2FtZXJhX2xpYl9zZW5kX2NvbW1hbmQoKSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQ1RJT05fU1dJVENIX1JFU09MVVRJT046CisgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBTd2l0Y2ggc25hcHNob3QgcmVzb2x1dGlvbiB0byAlZHglZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uX3RibFthY3Rpb25fcGFyYW1dLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25fdGJsW2FjdGlvbl9wYXJhbV0uaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBzbmFwX2RpbS53aWR0aCA9IGRpbWVuc2lvbl90YmxbYWN0aW9uX3BhcmFtXS53aWR0aDsKKyAgICAgICAgICAgICAgICBzbmFwX2RpbS5oZWlnaHQgPSBkaW1lbnNpb25fdGJsW2FjdGlvbl9wYXJhbV0uaGVpZ2h0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGNhc2UgQUNUSU9OX1NUQVJUX1JFQ09SRElORzoKKyAgICAgICAgICAgICBMT0dEKCJTdGFydCByZWNvcmRpbmcgYWN0aW9uXG4iKTsKKyAgICAgICAgICAgICBtbV9hcHBfc3RhcnRfcmVjb3JkX3ByZXZpZXcoJmxpYl9oYW5kbGUudGVzdF9vYmosICZzbmFwX2RpbSk7CisgICAgICAgICAgICAgaXNfcmVjID0gMTsKKyAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIEFDVElPTl9TVE9QX1JFQ09SRElORzoKKyAgICAgICAgICAgICBMT0dEKCJTdG9wIHJlY29yZGluZyBhY3Rpb25cbiIpOworICAgICAgICAgICAgIGlmKGlzX3JlYykgeworICAgICAgICAgICAgICAgICBtbV9hcHBfc3RvcF9yZWNvcmRfcHJldmlldygmbGliX2hhbmRsZS50ZXN0X29iaik7CisgICAgICAgICAgICAgICAgIGlzX3JlYyA9IDA7CisgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFDVElPTl9UQUtFX0xJVkVfU05BUFNIT1Q6CisgICAgICAgIHByaW50ZigiU2VsZWN0aW9uIGZvciBsaXZlIHNob3RcbiIpOworI2lmIDAKKyAgICAgICAgaWYoaXNfcmVjKQorICAgICAgICAgICBtbV9hcHBfdGFrZV9saXZlX3NuYXBzaG90KGNhbV9pZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgcHJpbnRmKCJcbiAhISEgVXNlIGxpdmUgc25hcHNob3Qgb3B0aW9uIHdoaWxlIHJlY29yZGluZyBvbmx5ICEhIVxuIik7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBQ1RJT05fVE9HR0xFX1dOUjoKKyAgICAgICAgICB3bnJfZW5hYmxlZCA9ICF3bnJfZW5hYmxlZDsKKyAgICAgICAgICBwcmludGYoIldOUiBFbmFibGVkID0gJWRcbiIsIHducl9lbmFibGVkKTsKKyAgICAgICAgICByYyA9IG1tX2NhbWVyYV9saWJfc2VuZF9jb21tYW5kKCZsaWJfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0FNRVJBX0xJQl9XTlJfRU5BQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnducl9lbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICBMT0dFKCJtbV9jYW1lcmFfbGliX3NlbmRfY29tbWFuZCgpIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgICAgZ290byBFUlJPUjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBQ1RJT05fRVhJVDoKKyAgICAgICAgICAgIHByaW50ZigiRXhpdGluZy4uLi5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUNUSU9OX05PX0FDVElPTjoKKyAgICAgICAgICAgIHByaW50ZigiR28gYmFjayB0byBtYWluIG1lbnUiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBwcmludGYoIlxuXG4hISEhIVdST05HIElOUFVUOiAlZCEhISFcbiIsIGFjdGlvbl9pZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICB1c2xlZXAoMTAwMCAqIDEwMDApOworICAgIExPR0QoImFjdGlvbl9pZCA9ICVkXG4iLCBhY3Rpb25faWQpOworCisgIH0gd2hpbGUgKGFjdGlvbl9pZCAhPSBBQ1RJT05fRVhJVCk7CisgIGFjdGlvbl9pZCA9IEFDVElPTl9OT19BQ1RJT047CisKKyAgICBtbV9jYW1lcmFfbGliX2Nsb3NlKCZsaWJfaGFuZGxlKTsKKyAgICByZXR1cm4gMDsKKworRVJST1I6CisKKyAgICBtbV9jYW1lcmFfbGliX2Nsb3NlKCZsaWJfaGFuZGxlKTsKKworICAgIHJldHVybiByYzsKK30KKwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX3ByZXZpZXcuYyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9zcmMvbW1fcWNhbWVyYV9wcmV2aWV3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYyNzcxOQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9zcmMvbW1fcWNhbWVyYV9wcmV2aWV3LmMKQEAgLTAsMCArMSwxNDg3IEBACisvKgorQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKK21ldDoKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKK1NVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2RlZmluZSBNTUFOX0ggPFNZU1RFTV9IRUFERVJfUFJFRklYL21tYW4uaD4KKyNpbmNsdWRlIE1NQU5fSAorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAibW1fcWNhbWVyYV9hcHAuaCIKKyNpbmNsdWRlICJtbV9xY2FtZXJhX2RiZy5oIgorI2luY2x1ZGUgIm1tX3FjYW1lcmFfYXBwLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KKworc3RhdGljIHZvaWQgbW1fYXBwX21ldGFkYXRhX25vdGlmeV9jYihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmJ1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICB1aW50MzJfdCBpID0gMDsKKyAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCA9IE5VTEw7CisgIG1tX2NhbWVyYV9zdHJlYW1fdCAqcF9zdHJlYW0gPSBOVUxMOworICBtbV9jYW1lcmFfdGVzdF9vYmpfdCAqcG1lID0gKG1tX2NhbWVyYV90ZXN0X29ial90ICopdXNlcl9kYXRhOworICBtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZTsKKyAgbWV0YWRhdGFfYnVmZmVyX3QgKnBNZXRhZGF0YTsKKworICBpZiAoTlVMTCA9PSBidWZzIHx8IE5VTEwgPT0gdXNlcl9kYXRhKSB7CisgICAgICBMT0dFKCJidWZzIG9yIHVzZXJfZGF0YSBhcmUgbm90IHZhbGlkICIpOworICAgICAgcmV0dXJuOworICB9CisgIGZyYW1lID0gYnVmcy0+YnVmc1swXTsKKworICAvKiBmaW5kIGNoYW5uZWwgKi8KKyAgZm9yIChpID0gMDsgaSA8IE1NX0NIQU5ORUxfVFlQRV9NQVg7IGkrKykgeworICAgICAgaWYgKHBtZS0+Y2hhbm5lbHNbaV0uY2hfaWQgPT0gYnVmcy0+Y2hfaWQpIHsKKyAgICAgICAgICBjaGFubmVsID0gJnBtZS0+Y2hhbm5lbHNbaV07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgIH0KKworICBpZiAoTlVMTCA9PSBjaGFubmVsKSB7CisgICAgICBMT0dFKCJDaGFubmVsIG9iamVjdCBpcyBOVUxMICIpOworICAgICAgcmV0dXJuOworICB9CisKKyAgLyogZmluZCBwcmV2aWV3IHN0cmVhbSAqLworICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgaWYgKGNoYW5uZWwtPnN0cmVhbXNbaV0uc19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSkgeworICAgICAgICAgIHBfc3RyZWFtID0gJmNoYW5uZWwtPnN0cmVhbXNbaV07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgIH0KKworICBpZiAoTlVMTCA9PSBwX3N0cmVhbSkgeworICAgICAgTE9HRSgiY2Fubm90IGZpbmQgbWV0YWRhdGEgc3RyZWFtIik7CisgICAgICByZXR1cm47CisgIH0KKworICAvKiBmaW5kIHByZXZpZXcgZnJhbWUgKi8KKyAgZm9yIChpID0gMDsgaSA8IGJ1ZnMtPm51bV9idWZzOyBpKyspIHsKKyAgICAgIGlmIChidWZzLT5idWZzW2ldLT5zdHJlYW1faWQgPT0gcF9zdHJlYW0tPnNfaWQpIHsKKyAgICAgICAgICBmcmFtZSA9IGJ1ZnMtPmJ1ZnNbaV07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgIH0KKworICBpZiAocG1lLT5tZXRhZGF0YSA9PSBOVUxMKSB7CisgICAgLyogVGhlIGFwcCB3aWxsIGZyZWUgdGhlIG1ldGEgZGF0YSwgd2UgZG9uJ3QgbmVlZCB0byBib3RoZXIgaGVyZSAqLworICAgIHBtZS0+bWV0YWRhdGEgPSBtYWxsb2Moc2l6ZW9mKG1ldGFkYXRhX2J1ZmZlcl90KSk7CisgICAgaWYgKE5VTEwgPT0gcG1lLT5tZXRhZGF0YSkgeworICAgICAgICBMT0dFKCJDYW5vdCBhbGxvY2F0ZSBtZXRhZGF0YSBtZW1vcnlcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICB9CisgIG1lbWNweShwbWUtPm1ldGFkYXRhLCBmcmFtZS0+YnVmZmVyLCBzaXplb2YobWV0YWRhdGFfYnVmZmVyX3QpKTsKKworICBwTWV0YWRhdGEgPSAobWV0YWRhdGFfYnVmZmVyX3QgKilmcmFtZS0+YnVmZmVyOworICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgYWZTdGF0ZSwgQ0FNX0lOVEZfTUVUQV9BRl9TVEFURSwgcE1ldGFkYXRhKSB7CisgICAgaWYgKChjYW1fYWZfc3RhdGVfdCkoKmFmU3RhdGUpID09IENBTV9BRl9TVEFURV9GT0NVU0VEX0xPQ0tFRCB8fAorICAgICAgICAgICAgKGNhbV9hZl9zdGF0ZV90KSgqYWZTdGF0ZSkgPT0gQ0FNX0FGX1NUQVRFX05PVF9GT0NVU0VEX0xPQ0tFRCkgeworICAgICAgICBMT0dFKCJBdXRvRm9jdXMgRG9uZSBDYWxsIEJhY2sgUmVjZWl2ZWRcbiIpOworICAgICAgICBtbV9jYW1lcmFfYXBwX2RvbmUoKTsKKyAgICB9IGVsc2UgaWYgKChjYW1fYWZfc3RhdGVfdCkoKmFmU3RhdGUpID09IENBTV9BRl9TVEFURV9OT1RfRk9DVVNFRF9MT0NLRUQpIHsKKyAgICAgICAgTE9HRSgiQXV0b0ZvY3VzIGZhaWxlZFxuIik7CisgICAgICAgIG1tX2NhbWVyYV9hcHBfZG9uZSgpOworICAgIH0KKyAgfQorCisgIGlmIChwbWUtPnVzZXJfbWV0YWRhdGFfY2IpIHsKKyAgICAgIExPR0QoIltEQkddICVzLCB1c2VyIGRlZmluZWQgb3duIG1ldGFkYXRhIGNiLiBjYWxsaW5nIGl0Li4uIik7CisgICAgICBwbWUtPnVzZXJfbWV0YWRhdGFfY2IoZnJhbWUpOworICB9CisKKyAgaWYgKE1NX0NBTUVSQV9PSyAhPSBwbWUtPmNhbS0+b3BzLT5xYnVmKGJ1ZnMtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzLT5jaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lKSkgeworICAgICAgTE9HRSgiRmFpbGVkIGluIFByZXZpZXcgUWJ1ZlxuIik7CisgIH0KKyAgbW1fYXBwX2NhY2hlX29wcygobW1fY2FtZXJhX2FwcF9tZW1pbmZvX3QgKilmcmFtZS0+bWVtX2luZm8sCisgICAgICAgICAgICAgICAgICAgSU9OX0lPQ19JTlZfQ0FDSEVTKTsKK30KKworc3RhdGljIHZvaWQgbW1fYXBwX3NuYXBzaG90X25vdGlmeV9jYihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmJ1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKworICAgIGludCByYyA9IDA7CisgICAgdWludDMyX3QgaSA9IDA7CisgICAgbW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnBtZSA9IChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqKXVzZXJfZGF0YTsKKyAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnBfc3RyZWFtID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKm1fc3RyZWFtID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpwX2ZyYW1lID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICptX2ZyYW1lID0gTlVMTDsKKworICAgIC8qIGZpbmQgY2hhbm5lbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNTV9DSEFOTkVMX1RZUEVfTUFYOyBpKyspIHsKKyAgICAgICAgaWYgKHBtZS0+Y2hhbm5lbHNbaV0uY2hfaWQgPT0gYnVmcy0+Y2hfaWQpIHsKKyAgICAgICAgICAgIGNoYW5uZWwgPSAmcG1lLT5jaGFubmVsc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChOVUxMID09IGNoYW5uZWwpIHsKKyAgICAgICAgTE9HRSgiV3JvbmcgY2hhbm5lbCBpZCAoJWQpIiwgIGJ1ZnMtPmNoX2lkKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBmaW5kIHNuYXBzaG90IHN0cmVhbSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChjaGFubmVsLT5zdHJlYW1zW2ldLnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QpIHsKKyAgICAgICAgICAgIG1fc3RyZWFtID0gJmNoYW5uZWwtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoTlVMTCA9PSBtX3N0cmVhbSkgeworICAgICAgICBMT0dFKCJjYW5ub3QgZmluZCBzbmFwc2hvdCBzdHJlYW0iKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBmaW5kIHNuYXBzaG90IGZyYW1lICovCisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZnMtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgaWYgKGJ1ZnMtPmJ1ZnNbaV0tPnN0cmVhbV9pZCA9PSBtX3N0cmVhbS0+c19pZCkgeworICAgICAgICAgICAgbV9mcmFtZSA9IGJ1ZnMtPmJ1ZnNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoTlVMTCA9PSBtX2ZyYW1lKSB7CisgICAgICAgIExPR0UoIm1haW4gZnJhbWUgaXMgTlVMTCIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIG1tX2FwcF9kdW1wX2ZyYW1lKG1fZnJhbWUsICJtYWluIiwgInl1diIsIG1fZnJhbWUtPmZyYW1lX2lkeCk7CisKKyAgICAvKiBmaW5kIHBvc3R2aWV3IHN0cmVhbSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChjaGFubmVsLT5zdHJlYW1zW2ldLnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVcpIHsKKyAgICAgICAgICAgIHBfc3RyZWFtID0gJmNoYW5uZWwtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoTlVMTCAhPSBwX3N0cmVhbSkgeworICAgICAgICAvKiBmaW5kIHByZXZpZXcgZnJhbWUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1ZnMtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChidWZzLT5idWZzW2ldLT5zdHJlYW1faWQgPT0gcF9zdHJlYW0tPnNfaWQpIHsKKyAgICAgICAgICAgICAgICBwX2ZyYW1lID0gYnVmcy0+YnVmc1tpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoTlVMTCAhPSBwX2ZyYW1lKSB7CisgICAgICAgICAgICBtbV9hcHBfZHVtcF9mcmFtZShwX2ZyYW1lLCAicG9zdHZpZXciLCAieXV2IiwgcF9mcmFtZS0+ZnJhbWVfaWR4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1tX2FwcF9jYWNoZV9vcHMoKG1tX2NhbWVyYV9hcHBfbWVtaW5mb190ICopbV9mcmFtZS0+bWVtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICBJT05fSU9DX0NMRUFOX0lOVl9DQUNIRVMpOworCisgICAgcG1lLT5qcGVnX2J1Zi5idWYuYnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MobV9mcmFtZS0+ZnJhbWVfbGVuKTsKKyAgICBpZiAoIE5VTEwgPT0gcG1lLT5qcGVnX2J1Zi5idWYuYnVmZmVyICkgeworICAgICAgICBMT0dFKCJlcnJvciBhbGxvY2F0aW5nIGpwZWcgb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHBtZS0+anBlZ19idWYuYnVmLmZyYW1lX2xlbiA9IG1fZnJhbWUtPmZyYW1lX2xlbjsKKyAgICAvKiBjcmVhdGUgYSBuZXcganBlZyBlbmNvZGluZyBzZXNzaW9uICovCisgICAgcmMgPSBjcmVhdGVFbmNvZGluZ1Nlc3Npb24ocG1lLCBtX3N0cmVhbSwgbV9mcmFtZSk7CisgICAgaWYgKDAgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgiZXJyb3IgY3JlYXRpbmcganBlZyBzZXNzaW9uIik7CisgICAgICAgIGZyZWUocG1lLT5qcGVnX2J1Zi5idWYuYnVmZmVyKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBzdGFydCBqcGVnIGVuY29kaW5nIGpvYiAqLworICAgIHJjID0gZW5jb2RlRGF0YShwbWUsIGJ1ZnMsIG1fc3RyZWFtKTsKKyAgICBpZiAoMCAhPSByYykgeworICAgICAgICBMT0dFKCJlcnJvciBjcmVhdGluZyBqcGVnIHNlc3Npb24iKTsKKyAgICAgICAgZnJlZShwbWUtPmpwZWdfYnVmLmJ1Zi5idWZmZXIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworZXJyb3I6CisgICAgLyogYnVmIGRvbmUgcmN2ZCBmcmFtZXMgaW4gZXJyb3IgY2FzZSAqLworICAgIGlmICggMCAhPSByYyApIHsKKyAgICAgICAgZm9yIChpPTA7IGk8YnVmcy0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICAgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSBwbWUtPmNhbS0+b3BzLT5xYnVmKGJ1ZnMtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmcy0+Y2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmcy0+YnVmc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJGYWlsZWQgaW4gUWJ1ZlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtbV9hcHBfY2FjaGVfb3BzKChtbV9jYW1lcmFfYXBwX21lbWluZm9fdCAqKWJ1ZnMtPmJ1ZnNbaV0tPm1lbV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT05fSU9DX0lOVl9DQUNIRVMpOworICAgICAgICB9CisgICAgfQorCisgICAgTE9HRCgiIEVORFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIG1tX2FwcF9wcmV2aWV3X25vdGlmeV9jYihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmJ1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIHVpbnQzMl90IGkgPSAwOworICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwgPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqcF9zdHJlYW0gPSBOVUxMOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCAqcG1lID0gKG1tX2NhbWVyYV90ZXN0X29ial90ICopdXNlcl9kYXRhOworCisgICAgaWYgKE5VTEwgPT0gYnVmcyB8fCBOVUxMID09IHVzZXJfZGF0YSkgeworICAgICAgICBMT0dFKCJidWZzIG9yIHVzZXJfZGF0YSBhcmUgbm90IHZhbGlkICIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZnJhbWUgPSBidWZzLT5idWZzWzBdOworCisgICAgLyogZmluZCBjaGFubmVsICovCisgICAgZm9yIChpID0gMDsgaSA8IE1NX0NIQU5ORUxfVFlQRV9NQVg7IGkrKykgeworICAgICAgICBpZiAocG1lLT5jaGFubmVsc1tpXS5jaF9pZCA9PSBidWZzLT5jaF9pZCkgeworICAgICAgICAgICAgY2hhbm5lbCA9ICZwbWUtPmNoYW5uZWxzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKE5VTEwgPT0gY2hhbm5lbCkgeworICAgICAgICBMT0dFKCJDaGFubmVsIG9iamVjdCBpcyBOVUxMICIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8qIGZpbmQgcHJldmlldyBzdHJlYW0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpZiAoY2hhbm5lbC0+c3RyZWFtc1tpXS5zX2NvbmZpZy5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVcpIHsKKyAgICAgICAgICAgIHBfc3RyZWFtID0gJmNoYW5uZWwtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChOVUxMID09IHBfc3RyZWFtKSB7CisgICAgICAgIExPR0UoImNhbm5vdCBmaW5kIHByZXZpZXcgc3RyZWFtIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBmaW5kIHByZXZpZXcgZnJhbWUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmcy0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICBpZiAoYnVmcy0+YnVmc1tpXS0+c3RyZWFtX2lkID09IHBfc3RyZWFtLT5zX2lkKSB7CisgICAgICAgICAgICBmcmFtZSA9IGJ1ZnMtPmJ1ZnNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggMCA8IHBtZS0+ZmJfZmQgKSB7CisgICAgICAgIG1tX2FwcF9vdmVybGF5X2Rpc3BsYXkocG1lLCBmcmFtZS0+ZmQpOworICAgIH0KKyNpZmRlZiBEVU1QX1BSVl9JTl9GSUxFCisgICAgeworICAgICAgICBjaGFyIGZpbGVfbmFtZVs2NF07CisgICAgICAgIHNucHJpbnRmKGZpbGVfbmFtZSwgc2l6ZW9mKGZpbGVfbmFtZSksICJQX0MlZCIsIHBtZS0+Y2FtLT5jYW1lcmFfaGFuZGxlKTsKKyAgICAgICAgbW1fYXBwX2R1bXBfZnJhbWUoZnJhbWUsIGZpbGVfbmFtZSwgInl1diIsIGZyYW1lLT5mcmFtZV9pZHgpOworICAgIH0KKyNlbmRpZgorICAgIGlmIChwbWUtPnVzZXJfcHJldmlld19jYikgeworICAgICAgICBMT0dFKCJbREJHXSAlcywgdXNlciBkZWZpbmVkIG93biBwcmV2aWV3IGNiLiBjYWxsaW5nIGl0Li4uIik7CisgICAgICAgIHBtZS0+dXNlcl9wcmV2aWV3X2NiKGZyYW1lKTsKKyAgICB9CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSBwbWUtPmNhbS0+b3BzLT5xYnVmKGJ1ZnMtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgYnVmcy0+Y2hfaWQsCisgICAgICAgICAgICAgICAgZnJhbWUpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCBpbiBQcmV2aWV3IFFidWZcbiIpOworICAgIH0KKyAgICBtbV9hcHBfY2FjaGVfb3BzKChtbV9jYW1lcmFfYXBwX21lbWluZm9fdCAqKWZyYW1lLT5tZW1faW5mbywKKyAgICAgICAgICAgIElPTl9JT0NfSU5WX0NBQ0hFUyk7CisKKyAgICBMT0dEKCIgRU5EXG4iKTsKK30KKworc3RhdGljIHZvaWQgbW1fYXBwX3pzbF9ub3RpZnlfY2IobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpidWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICB1aW50MzJfdCBpID0gMDsKKyAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCAqcG1lID0gKG1tX2NhbWVyYV90ZXN0X29ial90ICopdXNlcl9kYXRhOworICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwgPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqcF9zdHJlYW0gPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqbV9zdHJlYW0gPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqbWRfc3RyZWFtID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpwX2ZyYW1lID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICptX2ZyYW1lID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICptZF9mcmFtZSA9IE5VTEw7CisKKyAgICBMT0dEKCIgQkVHSU5cbiIpOworCisgICAgaWYgKE5VTEwgPT0gYnVmcyB8fCBOVUxMID09IHVzZXJfZGF0YSkgeworICAgICAgICBMT0dFKCJidWZzIG9yIHVzZXJfZGF0YSBhcmUgbm90IHZhbGlkICIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogZmluZCBjaGFubmVsICovCisgICAgZm9yIChpID0gMDsgaSA8IE1NX0NIQU5ORUxfVFlQRV9NQVg7IGkrKykgeworICAgICAgICBpZiAocG1lLT5jaGFubmVsc1tpXS5jaF9pZCA9PSBidWZzLT5jaF9pZCkgeworICAgICAgICAgICAgY2hhbm5lbCA9ICZwbWUtPmNoYW5uZWxzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKE5VTEwgPT0gY2hhbm5lbCkgeworICAgICAgICBMT0dFKCJXcm9uZyBjaGFubmVsIGlkICglZCkiLCAgYnVmcy0+Y2hfaWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogZmluZCBwcmV2aWV3IHN0cmVhbSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChjaGFubmVsLT5zdHJlYW1zW2ldLnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVykgeworICAgICAgICAgICAgcF9zdHJlYW0gPSAmY2hhbm5lbC0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChOVUxMID09IHBfc3RyZWFtKSB7CisgICAgICAgIExPR0UoImNhbm5vdCBmaW5kIHByZXZpZXcgc3RyZWFtIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBmaW5kIHNuYXBzaG90IHN0cmVhbSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChjaGFubmVsLT5zdHJlYW1zW2ldLnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1QpIHsKKyAgICAgICAgICAgIG1fc3RyZWFtID0gJmNoYW5uZWwtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoTlVMTCA9PSBtX3N0cmVhbSkgeworICAgICAgICBMT0dFKCJjYW5ub3QgZmluZCBzbmFwc2hvdCBzdHJlYW0iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGZpbmQgbWV0YWRhdGEgc3RyZWFtICovCisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKGNoYW5uZWwtPnN0cmVhbXNbaV0uc19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSkgeworICAgICAgICAgICAgbWRfc3RyZWFtID0gJmNoYW5uZWwtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoTlVMTCA9PSBtZF9zdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiY2Fubm90IGZpbmQgbWV0YWRhdGEgc3RyZWFtIik7CisgICAgfQorCisgICAgLyogZmluZCBwcmV2aWV3IGZyYW1lICovCisgICAgZm9yIChpID0gMDsgaSA8IGJ1ZnMtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgaWYgKGJ1ZnMtPmJ1ZnNbaV0tPnN0cmVhbV9pZCA9PSBwX3N0cmVhbS0+c19pZCkgeworICAgICAgICAgICAgcF9mcmFtZSA9IGJ1ZnMtPmJ1ZnNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKG1kX3N0cmVhbSkgeworICAgICAgLyogZmluZCBtZXRhZGF0YSBmcmFtZSAqLworICAgICAgZm9yIChpID0gMDsgaSA8IGJ1ZnMtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgICBpZiAoYnVmcy0+YnVmc1tpXS0+c3RyZWFtX2lkID09IG1kX3N0cmVhbS0+c19pZCkgeworICAgICAgICAgICAgICBtZF9mcmFtZSA9IGJ1ZnMtPmJ1ZnNbaV07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghbWRfZnJhbWUpIHsKKyAgICAgICAgICBMT0dFKCJtZF9mcmFtZSBpcyBudWxsXG4iKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoIXBtZS0+bWV0YWRhdGEpIHsKKyAgICAgICAgICAvKiBBcHAgd2lsbCBmcmVlIHRoZSBtZXRhZGF0YSAqLworICAgICAgICAgIHBtZS0+bWV0YWRhdGEgPSBtYWxsb2Moc2l6ZW9mKG1ldGFkYXRhX2J1ZmZlcl90KSk7CisgICAgICAgICAgaWYgKCFwbWUtPm1ldGFkYXRhKSB7CisgICAgICAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeVxuIik7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIG1lbWNweShwbWUtPm1ldGFkYXRhICwgbWRfZnJhbWUtPmJ1ZmZlciwgc2l6ZW9mKG1ldGFkYXRhX2J1ZmZlcl90KSk7CisgICAgfQorICAgIC8qIGZpbmQgc25hcHNob3QgZnJhbWUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmcy0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICBpZiAoYnVmcy0+YnVmc1tpXS0+c3RyZWFtX2lkID09IG1fc3RyZWFtLT5zX2lkKSB7CisgICAgICAgICAgICBtX2ZyYW1lID0gYnVmcy0+YnVmc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFtX2ZyYW1lIHx8ICFwX2ZyYW1lKSB7CisgICAgICAgIExPR0UoImNhbm5vdCBmaW5kIHByZXZpZXcvc25hcHNob3QgZnJhbWUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExPR0QoIiBaU0wgQ0Igd2l0aCBmYl9mZCA9ICVkLCBtX2ZyYW1lID0gJXAsIHBfZnJhbWUgPSAlcCBcbiIsCisgICAgICAgICBwbWUtPmZiX2ZkLAorICAgICAgICAgbV9mcmFtZSwKKyAgICAgICAgIHBfZnJhbWUpOworCisgICAgaWYgKCAwIDwgcG1lLT5mYl9mZCApIHsKKyAgICAgICAgbW1fYXBwX292ZXJsYXlfZGlzcGxheShwbWUsIHBfZnJhbWUtPmZkKTsKKyAgICB9LyogZWxzZSB7CisgICAgICAgIG1tX2FwcF9kdW1wX2ZyYW1lKHBfZnJhbWUsICJ6c2xfcHJldmlldyIsICJ5dXYiLCBwX2ZyYW1lLT5mcmFtZV9pZHgpOworICAgICAgICBtbV9hcHBfZHVtcF9mcmFtZShtX2ZyYW1lLCAienNsX21haW4iLCAieXV2IiwgbV9mcmFtZS0+ZnJhbWVfaWR4KTsKKyAgICB9Ki8KKworICAgIGlmICggcG1lLT5lbmFibGVfcmVwcm9jICYmICggTlVMTCAhPSBwbWUtPnJlcHJvY19zdHJlYW0gKSApIHsKKworICAgICAgICBpZiAoTlVMTCAhPSBtZF9mcmFtZSkgeworICAgICAgICAgICAgcmMgPSBtbV9hcHBfZG9fcmVwcm9jZXNzKHBtZSwKKyAgICAgICAgICAgICAgICAgICAgbV9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbWRfZnJhbWUtPmJ1Zl9pZHgsCisgICAgICAgICAgICAgICAgICAgIGJ1ZnMsCisgICAgICAgICAgICAgICAgICAgIG1kX3N0cmVhbSk7CisKKyAgICAgICAgICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMgKSB7CisgICAgICAgICAgICAgICAgTE9HRSgicmVwcm9jZXNzIGZhaWxlZCByYyA9ICVkIiwgIHJjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0UoIm1kX2ZyYW1lIGlzIG51bGxcbiIpOworICAgICAgICB9CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHBtZS0+ZW5jb2RlSnBlZyApIHsKKyAgICAgICAgcG1lLT5qcGVnX2J1Zi5idWYuYnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MobV9mcmFtZS0+ZnJhbWVfbGVuKTsKKyAgICAgICAgaWYgKCBOVUxMID09IHBtZS0+anBlZ19idWYuYnVmLmJ1ZmZlciApIHsKKyAgICAgICAgICAgIExPR0UoImVycm9yIGFsbG9jYXRpbmcganBlZyBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBwbWUtPmpwZWdfYnVmLmJ1Zi5mcmFtZV9sZW4gPSBtX2ZyYW1lLT5mcmFtZV9sZW47CisgICAgICAgIC8qIGNyZWF0ZSBhIG5ldyBqcGVnIGVuY29kaW5nIHNlc3Npb24gKi8KKyAgICAgICAgcmMgPSBjcmVhdGVFbmNvZGluZ1Nlc3Npb24ocG1lLCBtX3N0cmVhbSwgbV9mcmFtZSk7CisgICAgICAgIGlmICgwICE9IHJjKSB7CisgICAgICAgICAgICBMT0dFKCJlcnJvciBjcmVhdGluZyBqcGVnIHNlc3Npb24iKTsKKyAgICAgICAgICAgIGZyZWUocG1lLT5qcGVnX2J1Zi5idWYuYnVmZmVyKTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHN0YXJ0IGpwZWcgZW5jb2Rpbmcgam9iICovCisgICAgICAgIHJjID0gZW5jb2RlRGF0YShwbWUsIGJ1ZnMsIG1fc3RyZWFtKTsKKyAgICAgICAgcG1lLT5lbmNvZGVKcGVnID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHBtZS0+Y2FtLT5vcHMtPnFidWYoYnVmcy0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnMtPmNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mcmFtZSkpIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCBpbiBtYWluIFFidWZcbiIpOworICAgICAgICB9CisgICAgICAgIG1tX2FwcF9jYWNoZV9vcHMoKG1tX2NhbWVyYV9hcHBfbWVtaW5mb190ICopbV9mcmFtZS0+bWVtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgSU9OX0lPQ19JTlZfQ0FDSEVTKTsKKyAgICB9CisKK2V4aXQ6CisKKyAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHBtZS0+Y2FtLT5vcHMtPnFidWYoYnVmcy0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmcy0+Y2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZnJhbWUpKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCBpbiBwcmV2aWV3IFFidWZcbiIpOworICAgIH0KKyAgICBtbV9hcHBfY2FjaGVfb3BzKChtbV9jYW1lcmFfYXBwX21lbWluZm9fdCAqKXBfZnJhbWUtPm1lbV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgSU9OX0lPQ19JTlZfQ0FDSEVTKTsKKworICAgIGlmKG1kX2ZyYW1lKSB7CisgICAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHBtZS0+Y2FtLT5vcHMtPnFidWYoYnVmcy0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzLT5jaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZF9mcmFtZSkpIHsKKyAgICAgICAgICBMT0dFKCJGYWlsZWQgaW4gbWV0YWRhdGEgUWJ1ZlxuIik7CisgICAgICB9CisgICAgICBtbV9hcHBfY2FjaGVfb3BzKChtbV9jYW1lcmFfYXBwX21lbWluZm9fdCAqKW1kX2ZyYW1lLT5tZW1faW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgSU9OX0lPQ19JTlZfQ0FDSEVTKTsKKyAgICB9CisKKyAgICBMT0dEKCIgRU5EXG4iKTsKK30KKworbW1fY2FtZXJhX3N0cmVhbV90ICogbW1fYXBwX2FkZF9tZXRhZGF0YV9zdHJlYW0obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IHN0cmVhbV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2J1ZnMpCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc3RyZWFtID0gTlVMTDsKKyAgICBjYW1fY2FwYWJpbGl0eV90ICpjYW1fY2FwID0gKGNhbV9jYXBhYmlsaXR5X3QgKikodGVzdF9vYmotPmNhcF9idWYuYnVmLmJ1ZmZlcik7CisgICAgc3RyZWFtID0gbW1fYXBwX2FkZF9zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwpOworICAgIGlmIChOVUxMID09IHN0cmVhbSkgeworICAgICAgICBMT0dFKCJhZGQgc3RyZWFtIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuZ2V0X2J1ZnMgPSBtbV9hcHBfc3RyZWFtX2luaXRidWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5wdXRfYnVmcyA9IG1tX2FwcF9zdHJlYW1fZGVpbml0YnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuY2xlYW5faW52YWxpZGF0ZV9idWYgPQorICAgICAgbW1fYXBwX3N0cmVhbV9jbGVhbl9pbnZhbGlkYXRlX2J1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLmludmFsaWRhdGVfYnVmID0gbW1fYXBwX3N0cmVhbV9pbnZhbGlkYXRlX2J1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLnVzZXJfZGF0YSA9ICh2b2lkICopc3RyZWFtOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2NiID0gc3RyZWFtX2NiOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2NiX3N5bmMgPSBOVUxMOworICAgIHN0cmVhbS0+c19jb25maWcudXNlcmRhdGEgPSB1c2VyZGF0YTsKKyAgICBzdHJlYW0tPm51bV9vZl9idWZzID0gbnVtX2J1ZnM7CisKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvID0gKGNhbV9zdHJlYW1faW5mb190ICopc3RyZWFtLT5zX2luZm9fYnVmLmJ1Zi5idWZmZXI7CisgICAgbWVtc2V0KHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8sIDAsIHNpemVvZihjYW1fc3RyZWFtX2luZm9fdCkpOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlID0gQ0FNX1NUUkVBTV9UWVBFX01FVEFEQVRBOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0NPTlRJTlVPVVM7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+Zm10ID0gREVGQVVMVF9QUkVWSUVXX0ZPUk1BVDsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5kaW0ud2lkdGggPSBzaXplb2YobWV0YWRhdGFfYnVmZmVyX3QpOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS5oZWlnaHQgPSAxOworICAgIHN0cmVhbS0+c19jb25maWcucGFkZGluZ19pbmZvID0gY2FtX2NhcC0+cGFkZGluZ19pbmZvOworCisgICAgcmMgPSBtbV9hcHBfY29uZmlnX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc3RyZWFtLCAmc3RyZWFtLT5zX2NvbmZpZyk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJjb25maWcgcHJldmlldyBzdHJlYW0gZXJyPSVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtOworfQorCitjYW1fZGltZW5zaW9uX3QgbW1fYXBwX2dldF9hbmFseXNpc19zdHJlYW1fZGltKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbV9kaW1lbnNpb25fdCogcHJldmlld19kaW0pCit7CisgICAgY2FtX2NhcGFiaWxpdHlfdCAqY2FtX2NhcCA9IChjYW1fY2FwYWJpbGl0eV90ICopKHRlc3Rfb2JqLT5jYXBfYnVmLmJ1Zi5idWZmZXIpOworICAgIGNhbV9kaW1lbnNpb25fdCBtYXhfYW5hbHlzaXNfZGltID0KKyAgICAgICAgY2FtX2NhcC0+YW5hbHlzaXNfaW5mb1tDQU1fQU5BTFlTSVNfSU5GT19GRF9TVElMTF0uYW5hbHlzaXNfbWF4X3JlczsKKyAgICBjYW1fZGltZW5zaW9uX3QgYW5hbHlzaXNfZGltID0gezAsIDB9OworCisgICAgaWYgKHByZXZpZXdfZGltLT53aWR0aCA+IG1heF9hbmFseXNpc19kaW0ud2lkdGggfHwKKyAgICAgICAgICAgIHByZXZpZXdfZGltLT5oZWlnaHQgPiBtYXhfYW5hbHlzaXNfZGltLmhlaWdodCkgeworICAgICAgICBkb3VibGUgbWF4X3JhdGlvLCByZXF1ZXN0ZWRfcmF0aW87CisKKyAgICAgICAgbWF4X3JhdGlvID0gKGRvdWJsZSltYXhfYW5hbHlzaXNfZGltLndpZHRoIC8gKGRvdWJsZSltYXhfYW5hbHlzaXNfZGltLmhlaWdodDsKKyAgICAgICAgcmVxdWVzdGVkX3JhdGlvID0gKGRvdWJsZSlwcmV2aWV3X2RpbS0+d2lkdGggLyAoZG91YmxlKXByZXZpZXdfZGltLT5oZWlnaHQ7CisKKyAgICAgICAgaWYgKG1heF9yYXRpbyA8IHJlcXVlc3RlZF9yYXRpbykgeworICAgICAgICAgICAgYW5hbHlzaXNfZGltLndpZHRoID0gbWF4X2FuYWx5c2lzX2RpbS53aWR0aDsKKyAgICAgICAgICAgIGFuYWx5c2lzX2RpbS5oZWlnaHQgPSAoaW50MzJfdCkoKGRvdWJsZSltYXhfYW5hbHlzaXNfZGltLndpZHRoIC8gcmVxdWVzdGVkX3JhdGlvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFuYWx5c2lzX2RpbS5oZWlnaHQgPSBtYXhfYW5hbHlzaXNfZGltLmhlaWdodDsKKyAgICAgICAgICAgIGFuYWx5c2lzX2RpbS53aWR0aCA9IChpbnQzMl90KSgoZG91YmxlKW1heF9hbmFseXNpc19kaW0uaGVpZ2h0ICogcmVxdWVzdGVkX3JhdGlvKTsKKyAgICAgICAgfQorICAgICAgICBhbmFseXNpc19kaW0ud2lkdGggJj0gfjB4MTsKKyAgICAgICAgYW5hbHlzaXNfZGltLmhlaWdodCAmPSB+MHgxOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuYWx5c2lzX2RpbSA9ICpwcmV2aWV3X2RpbTsKKyAgICB9CisKKyAgICBMT0dJKCJhbmFseXNpcyBzdHJlYW0gZGltICglZCB4ICVkKVxuIiwgIGFuYWx5c2lzX2RpbS53aWR0aCwgYW5hbHlzaXNfZGltLmhlaWdodCk7CisgICAgcmV0dXJuIGFuYWx5c2lzX2RpbTsKK30KKworbW1fY2FtZXJhX3N0cmVhbV90ICogbW1fYXBwX2FkZF9hbmFseXNpc19zdHJlYW0obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IHN0cmVhbV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2J1ZnMpCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc3RyZWFtID0gTlVMTDsKKyAgICBjYW1fY2FwYWJpbGl0eV90ICpjYW1fY2FwID0gKGNhbV9jYXBhYmlsaXR5X3QgKikodGVzdF9vYmotPmNhcF9idWYuYnVmLmJ1ZmZlcik7CisgICAgY2FtX2RpbWVuc2lvbl90IHByZXZpZXdfZGltID0gezAsIDB9OworICAgIGNhbV9kaW1lbnNpb25fdCBhbmFseXNpc19kaW0gPSB7MCwgMH07CisKKyAgICBpZiAoKHRlc3Rfb2JqLT5wcmV2aWV3X3Jlc29sdXRpb24udXNlcl9pbnB1dF9kaXNwbGF5X3dpZHRoID09IDApIHx8CisgICAgICAgICAgICggdGVzdF9vYmotPnByZXZpZXdfcmVzb2x1dGlvbi51c2VyX2lucHV0X2Rpc3BsYXlfaGVpZ2h0ID09IDApKSB7CisgICAgICAgIHByZXZpZXdfZGltLndpZHRoID0gREVGQVVMVF9QUkVWSUVXX1dJRFRIOworICAgICAgICBwcmV2aWV3X2RpbS5oZWlnaHQgPSBERUZBVUxUX1BSRVZJRVdfSEVJR0hUOworICAgIH0gZWxzZSB7CisgICAgICAgIHByZXZpZXdfZGltLndpZHRoID0gdGVzdF9vYmotPnByZXZpZXdfcmVzb2x1dGlvbi51c2VyX2lucHV0X2Rpc3BsYXlfd2lkdGg7CisgICAgICAgIHByZXZpZXdfZGltLmhlaWdodCA9IHRlc3Rfb2JqLT5wcmV2aWV3X3Jlc29sdXRpb24udXNlcl9pbnB1dF9kaXNwbGF5X2hlaWdodDsKKyAgICB9CisKKyAgICBhbmFseXNpc19kaW0gPSBtbV9hcHBfZ2V0X2FuYWx5c2lzX3N0cmVhbV9kaW0odGVzdF9vYmosICZwcmV2aWV3X2RpbSk7CisgICAgTE9HSSgiYW5hbHlzaXMgc3RyZWFtIGRpbWVzaW9uOiAlZCB4ICVkXG4iLAorICAgICAgICAgICAgYW5hbHlzaXNfZGltLndpZHRoLCBhbmFseXNpc19kaW0uaGVpZ2h0KTsKKyAgICBpZiAoYW5hbHlzaXNfZGltLndpZHRoID09IDAgfHwgYW5hbHlzaXNfZGltLmhlaWdodCA9PSAwKSB7CisgICAgICAgIC8qIEZEIG9yIFBBQUYgbWlnaHQgbm90IGJlIGVuYWJsZWQgLCB1c2UgcHJldmlldyBkaW0gKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RyZWFtID0gbW1fYXBwX2FkZF9zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwpOworICAgIGlmIChOVUxMID09IHN0cmVhbSkgeworICAgICAgICBMT0dFKCJhZGQgc3RyZWFtIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuZ2V0X2J1ZnMgPSBtbV9hcHBfc3RyZWFtX2luaXRidWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5wdXRfYnVmcyA9IG1tX2FwcF9zdHJlYW1fZGVpbml0YnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuY2xlYW5faW52YWxpZGF0ZV9idWYgPQorICAgICAgbW1fYXBwX3N0cmVhbV9jbGVhbl9pbnZhbGlkYXRlX2J1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLmludmFsaWRhdGVfYnVmID0gbW1fYXBwX3N0cmVhbV9pbnZhbGlkYXRlX2J1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLnVzZXJfZGF0YSA9ICh2b2lkICopc3RyZWFtOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2NiID0gc3RyZWFtX2NiOworICAgIHN0cmVhbS0+c19jb25maWcudXNlcmRhdGEgPSB1c2VyZGF0YTsKKyAgICBzdHJlYW0tPm51bV9vZl9idWZzID0gbnVtX2J1ZnM7CisKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvID0gKGNhbV9zdHJlYW1faW5mb190ICopc3RyZWFtLT5zX2luZm9fYnVmLmJ1Zi5idWZmZXI7CisgICAgbWVtc2V0KHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8sIDAsIHNpemVvZihjYW1fc3RyZWFtX2luZm9fdCkpOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlID0gQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0NPTlRJTlVPVVM7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+Zm10ID0gREVGQVVMVF9QUkVWSUVXX0ZPUk1BVDsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5kaW0gPSBhbmFseXNpc19kaW07CisgICAgc3RyZWFtLT5zX2NvbmZpZy5wYWRkaW5nX2luZm8gPQorICAgICAgICBjYW1fY2FwLT5hbmFseXNpc19pbmZvW0NBTV9BTkFMWVNJU19JTkZPX0ZEX1NUSUxMXS5hbmFseXNpc19wYWRkaW5nX2luZm87CisKKyAgICByYyA9IG1tX2FwcF9jb25maWdfc3RyZWFtKHRlc3Rfb2JqLCBjaGFubmVsLCBzdHJlYW0sICZzdHJlYW0tPnNfY29uZmlnKTsKKyAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHJjKSB7CisgICAgICAgIExPR0UoImNvbmZpZyBwcmV2aWV3IHN0cmVhbSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBzdHJlYW07Cit9CittbV9jYW1lcmFfc3RyZWFtX3QgKiBtbV9hcHBfYWRkX1pTTF9wcmV2aWV3X3N0cmVhbShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfbm90aWZ5X3Qgc3RyZWFtX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYnVmcykKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzdHJlYW0gPSBOVUxMOworICAgIGNhbV9jYXBhYmlsaXR5X3QgKmNhbV9jYXAgPSAoY2FtX2NhcGFiaWxpdHlfdCAqKSh0ZXN0X29iai0+Y2FwX2J1Zi5idWYuYnVmZmVyKTsKKyAgICBjYW1fZGltZW5zaW9uX3QgcHJldmlld19kaW0gPSB7MCwgMH07CisgICAgY2FtX2RpbWVuc2lvbl90IGFuYWx5c2lzX2RpbSA9IHswLCAwfTsKKworICAgIGlmICgodGVzdF9vYmotPnByZXZpZXdfcmVzb2x1dGlvbi51c2VyX2lucHV0X2Rpc3BsYXlfd2lkdGggPT0gMCkgfHwKKyAgICAgICAgICAgKCB0ZXN0X29iai0+cHJldmlld19yZXNvbHV0aW9uLnVzZXJfaW5wdXRfZGlzcGxheV9oZWlnaHQgPT0gMCkpIHsKKyAgICAgICAgcHJldmlld19kaW0ud2lkdGggPSBERUZBVUxUX1BSRVZJRVdfV0lEVEg7CisgICAgICAgIHByZXZpZXdfZGltLmhlaWdodCA9IERFRkFVTFRfUFJFVklFV19IRUlHSFQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJldmlld19kaW0ud2lkdGggPSB0ZXN0X29iai0+cHJldmlld19yZXNvbHV0aW9uLnVzZXJfaW5wdXRfZGlzcGxheV93aWR0aDsKKyAgICAgICAgcHJldmlld19kaW0uaGVpZ2h0ID0gdGVzdF9vYmotPnByZXZpZXdfcmVzb2x1dGlvbi51c2VyX2lucHV0X2Rpc3BsYXlfaGVpZ2h0OworICAgIH0KKyAgICBMT0dJKCJwcmV2aWV3IGRpbWVzaW9uOiAlZCB4ICVkXG4iLCAgcHJldmlld19kaW0ud2lkdGgsIHByZXZpZXdfZGltLmhlaWdodCk7CisKKyAgICBhbmFseXNpc19kaW0gPSBtbV9hcHBfZ2V0X2FuYWx5c2lzX3N0cmVhbV9kaW0odGVzdF9vYmosICZwcmV2aWV3X2RpbSk7CisgICAgTE9HSSgiYW5hbHlzaXMgc3RyZWFtIGRpbWVzaW9uOiAlZCB4ICVkXG4iLAorICAgICAgICAgICAgYW5hbHlzaXNfZGltLndpZHRoLCBhbmFseXNpc19kaW0uaGVpZ2h0KTsKKworICAgIHVpbnQzMl90IGFuYWx5c2lzX3BwX21hc2sgPSBjYW1fY2FwLT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDQU1fUUNPTV9GRUFUVVJFX1NIQVJQTkVTUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfRUZGRUNUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNX1FDT01fRkVBVFVSRV9ERU5PSVNFMkQpOworICAgIExPR0koImFuYWx5c2lzIHN0cmVhbSBwcCBtYXNrOiV4XG4iLCAgYW5hbHlzaXNfcHBfbWFzayk7CisKKyAgICBzdHJlYW0gPSBtbV9hcHBfYWRkX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgaWYgKE5VTEwgPT0gc3RyZWFtKSB7CisgICAgICAgIExPR0UoImFkZCBzdHJlYW0gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuZ2V0X2J1ZnMgPSBtbV9hcHBfc3RyZWFtX2luaXRidWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5wdXRfYnVmcyA9IG1tX2FwcF9zdHJlYW1fZGVpbml0YnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuY2xlYW5faW52YWxpZGF0ZV9idWYgPQorICAgICAgbW1fYXBwX3N0cmVhbV9jbGVhbl9pbnZhbGlkYXRlX2J1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLmludmFsaWRhdGVfYnVmID0gbW1fYXBwX3N0cmVhbV9pbnZhbGlkYXRlX2J1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLnVzZXJfZGF0YSA9ICh2b2lkICopc3RyZWFtOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2NiID0gc3RyZWFtX2NiOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2NiX3N5bmMgPSBOVUxMOworICAgIHN0cmVhbS0+c19jb25maWcudXNlcmRhdGEgPSB1c2VyZGF0YTsKKyAgICBzdHJlYW0tPm51bV9vZl9idWZzID0gbnVtX2J1ZnM7CisKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvID0gKGNhbV9zdHJlYW1faW5mb190ICopc3RyZWFtLT5zX2luZm9fYnVmLmJ1Zi5idWZmZXI7CisgICAgbWVtc2V0KHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8sIDAsIHNpemVvZihjYW1fc3RyZWFtX2luZm9fdCkpOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlID0gQ0FNX1NUUkVBTV9UWVBFX1BSRVZJRVc7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+c3RyZWFtaW5nX21vZGUgPSBDQU1fU1RSRUFNSU5HX01PREVfQ09OVElOVU9VUzsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5mbXQgPSBERUZBVUxUX1BSRVZJRVdfRk9STUFUOworCisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+ZGltLndpZHRoID0gcHJldmlld19kaW0ud2lkdGg7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+ZGltLmhlaWdodCA9IHByZXZpZXdfZGltLmhlaWdodDsKKworICAgIHN0cmVhbS0+c19jb25maWcucGFkZGluZ19pbmZvID0gY2FtX2NhcC0+cGFkZGluZ19pbmZvOworCisgICAgcmMgPSBtbV9hcHBfY29uZmlnX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc3RyZWFtLCAmc3RyZWFtLT5zX2NvbmZpZyk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJjb25maWcgcHJldmlldyBzdHJlYW0gZXJyPSVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtOworfQorCisKK21tX2NhbWVyYV9zdHJlYW1fdCAqIG1tX2FwcF9hZGRfcHJldmlld19zdHJlYW0obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IHN0cmVhbV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2J1ZnMpCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc3RyZWFtID0gTlVMTDsKKyAgICBjYW1fY2FwYWJpbGl0eV90ICpjYW1fY2FwID0gKGNhbV9jYXBhYmlsaXR5X3QgKikodGVzdF9vYmotPmNhcF9idWYuYnVmLmJ1ZmZlcik7CisgICAgY2FtX2RpbWVuc2lvbl90IHByZXZpZXdfZGltID0gezAsIDB9OworICAgIGNhbV9kaW1lbnNpb25fdCBhbmFseXNpc19kaW0gPSB7MCwgMH07CisKKyAgICBpZiAoKHRlc3Rfb2JqLT5wcmV2aWV3X3Jlc29sdXRpb24udXNlcl9pbnB1dF9kaXNwbGF5X3dpZHRoID09IDApIHx8CisgICAgICAgICAgICggdGVzdF9vYmotPnByZXZpZXdfcmVzb2x1dGlvbi51c2VyX2lucHV0X2Rpc3BsYXlfaGVpZ2h0ID09IDApKSB7CisgICAgICAgIHByZXZpZXdfZGltLndpZHRoID0gREVGQVVMVF9QUkVWSUVXX1dJRFRIOworICAgICAgICBwcmV2aWV3X2RpbS5oZWlnaHQgPSBERUZBVUxUX1BSRVZJRVdfSEVJR0hUOworICAgIH0gZWxzZSB7CisgICAgICAgIHByZXZpZXdfZGltLndpZHRoID0gdGVzdF9vYmotPnByZXZpZXdfcmVzb2x1dGlvbi51c2VyX2lucHV0X2Rpc3BsYXlfd2lkdGg7CisgICAgICAgIHByZXZpZXdfZGltLmhlaWdodCA9IHRlc3Rfb2JqLT5wcmV2aWV3X3Jlc29sdXRpb24udXNlcl9pbnB1dF9kaXNwbGF5X2hlaWdodDsKKyAgICB9CisgICAgTE9HSSgicHJldmlldyBkaW1lc2lvbjogJWQgeCAlZFxuIiwgIHByZXZpZXdfZGltLndpZHRoLCBwcmV2aWV3X2RpbS5oZWlnaHQpOworCisgICAgYW5hbHlzaXNfZGltID0gbW1fYXBwX2dldF9hbmFseXNpc19zdHJlYW1fZGltKHRlc3Rfb2JqLCAmcHJldmlld19kaW0pOworICAgIExPR0koImFuYWx5c2lzIHN0cmVhbSBkaW1lc2lvbjogJWQgeCAlZFxuIiwKKyAgICAgICAgICAgIGFuYWx5c2lzX2RpbS53aWR0aCwgYW5hbHlzaXNfZGltLmhlaWdodCk7CisKKyAgICB1aW50MzJfdCBhbmFseXNpc19wcF9tYXNrID0gY2FtX2NhcC0+cWNvbV9zdXBwb3J0ZWRfZmVhdHVyZV9tYXNrICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0FNX1FDT01fRkVBVFVSRV9TSEFSUE5FU1MgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU1fUUNPTV9GRUFUVVJFX0VGRkVDVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9RQ09NX0ZFQVRVUkVfREVOT0lTRTJEKTsKKyAgICBMT0dJKCJhbmFseXNpcyBzdHJlYW0gcHAgbWFzazoleFxuIiwgIGFuYWx5c2lzX3BwX21hc2spOworCisgICAgY2FtX3N0cmVhbV9zaXplX2luZm9fdCBhYmMgOworICAgIG1lbXNldCAoJmFiYyAsIDAsIHNpemVvZiAoY2FtX3N0cmVhbV9zaXplX2luZm9fdCkpOworCisgICAgaWYgKGFuYWx5c2lzX2RpbS53aWR0aCAhPSAwICYmIGFuYWx5c2lzX2RpbS5oZWlnaHQgIT0gMCkgeworICAgICAgYWJjLm51bV9zdHJlYW1zID0gMjsKKyAgICB9IGVsc2UgeworICAgICAgYWJjLm51bV9zdHJlYW1zID0gMTsKKyAgICB9CisgICAgYWJjLnBvc3Rwcm9jZXNzX21hc2tbMF0gPSAyMTc4OworICAgIGFiYy5zdHJlYW1fc2l6ZXNbMF0ud2lkdGggPSBwcmV2aWV3X2RpbS53aWR0aDsKKyAgICBhYmMuc3RyZWFtX3NpemVzWzBdLmhlaWdodCA9IHByZXZpZXdfZGltLmhlaWdodDsKKyAgICBhYmMudHlwZVswXSA9IENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXOworCisgICAgaWYgKGFuYWx5c2lzX2RpbS53aWR0aCAhPSAwICYmIGFuYWx5c2lzX2RpbS5oZWlnaHQgIT0gMCkgeworICAgICAgYWJjLnBvc3Rwcm9jZXNzX21hc2tbMV0gPSBhbmFseXNpc19wcF9tYXNrOworICAgICAgYWJjLnN0cmVhbV9zaXplc1sxXS53aWR0aCA9IGFuYWx5c2lzX2RpbS53aWR0aDsKKyAgICAgIGFiYy5zdHJlYW1fc2l6ZXNbMV0uaGVpZ2h0ID0gYW5hbHlzaXNfZGltLmhlaWdodDsKKyAgICAgIGFiYy50eXBlWzFdID0gQ0FNX1NUUkVBTV9UWVBFX0FOQUxZU0lTOworICAgIH0KKworICAgIGFiYy5idWZmZXJfaW5mby5taW5fYnVmZmVycyA9IDEwOworICAgIGFiYy5idWZmZXJfaW5mby5tYXhfYnVmZmVycyA9IDEwOworICAgIGFiYy5pc190eXBlWzBdID0gSVNfVFlQRV9OT05FOworCisgICAgcmMgPSBzZXRtZXRhaW5mb0NvbW1hbmQodGVzdF9vYmosICZhYmMpOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICBMT0dFKCJtZXRhIGluZm8gY29tbWFuZCBmYWlsZWRcbiIpOworICAgIH0KKworICAgIHN0cmVhbSA9IG1tX2FwcF9hZGRfc3RyZWFtKHRlc3Rfb2JqLCBjaGFubmVsKTsKKyAgICBpZiAoTlVMTCA9PSBzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiYWRkIHN0cmVhbSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5nZXRfYnVmcyA9IG1tX2FwcF9zdHJlYW1faW5pdGJ1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLnB1dF9idWZzID0gbW1fYXBwX3N0cmVhbV9kZWluaXRidWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5jbGVhbl9pbnZhbGlkYXRlX2J1ZiA9CisgICAgICBtbV9hcHBfc3RyZWFtX2NsZWFuX2ludmFsaWRhdGVfYnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuaW52YWxpZGF0ZV9idWYgPSBtbV9hcHBfc3RyZWFtX2ludmFsaWRhdGVfYnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwudXNlcl9kYXRhID0gKHZvaWQgKilzdHJlYW07CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1fY2IgPSBzdHJlYW1fY2I7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1fY2Jfc3luYyA9IE5VTEw7CisgICAgc3RyZWFtLT5zX2NvbmZpZy51c2VyZGF0YSA9IHVzZXJkYXRhOworICAgIHN0cmVhbS0+bnVtX29mX2J1ZnMgPSBudW1fYnVmczsKKworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8gPSAoY2FtX3N0cmVhbV9pbmZvX3QgKilzdHJlYW0tPnNfaW5mb19idWYuYnVmLmJ1ZmZlcjsKKyAgICBtZW1zZXQoc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mbywgMCwgc2l6ZW9mKGNhbV9zdHJlYW1faW5mb190KSk7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUgPSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1pbmdfbW9kZSA9IENBTV9TVFJFQU1JTkdfTU9ERV9DT05USU5VT1VTOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmZtdCA9IERFRkFVTFRfUFJFVklFV19GT1JNQVQ7CisKKyAgICBpZiAodGVzdF9vYmotPmVuYWJsZV9FWlR1bmUpIHsKKyAgICAgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+cHBfY29uZmlnLmZlYXR1cmVfbWFzayA9IENBTV9RQ09NX0ZFQVRVUkVfRVpUVU5FOworICAgIH0KKworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS53aWR0aCA9IHByZXZpZXdfZGltLndpZHRoOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS5oZWlnaHQgPSBwcmV2aWV3X2RpbS5oZWlnaHQ7CisKKyAgICBzdHJlYW0tPnNfY29uZmlnLnBhZGRpbmdfaW5mbyA9IGNhbV9jYXAtPnBhZGRpbmdfaW5mbzsKKworICAgIHJjID0gbW1fYXBwX2NvbmZpZ19zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwsIHN0cmVhbSwgJnN0cmVhbS0+c19jb25maWcpOworICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgiY29uZmlnIHByZXZpZXcgc3RyZWFtIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHN0cmVhbTsKK30KKworbW1fY2FtZXJhX3N0cmVhbV90ICogbW1fYXBwX2FkZF9yYXdfc3RyZWFtKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IHN0cmVhbV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYnVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2J1cnN0KQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnN0cmVhbSA9IE5VTEw7CisgICAgY2FtX2NhcGFiaWxpdHlfdCAqY2FtX2NhcCA9IChjYW1fY2FwYWJpbGl0eV90ICopKHRlc3Rfb2JqLT5jYXBfYnVmLmJ1Zi5idWZmZXIpOworCisgICAgY2FtX3N0cmVhbV9zaXplX2luZm9fdCBhYmMgOworICAgIG1lbXNldCAoJmFiYyAsIDAsIHNpemVvZiAoY2FtX3N0cmVhbV9zaXplX2luZm9fdCkpOworCisgICAgYWJjLm51bV9zdHJlYW1zID0gMTsKKyAgICBhYmMucG9zdHByb2Nlc3NfbWFza1swXSA9IDA7CisKKyAgICBpZiAoIHRlc3Rfb2JqLT5idWZmZXJfd2lkdGggPT0gMCB8fCB0ZXN0X29iai0+YnVmZmVyX2hlaWdodCA9PSAwICkgeworICAgICAgICBhYmMuc3RyZWFtX3NpemVzWzBdLndpZHRoID0gREVGQVVMVF9TTkFQU0hPVF9XSURUSDsKKyAgICAgICAgYWJjLnN0cmVhbV9zaXplc1swXS5oZWlnaHQgPSBERUZBVUxUX1NOQVBTSE9UX0hFSUdIVDsKKyAgICB9IGVsc2UgeworICAgICAgICBhYmMuc3RyZWFtX3NpemVzWzBdLndpZHRoID0gKGludDMyX3QpdGVzdF9vYmotPmJ1ZmZlcl93aWR0aDsKKyAgICAgICAgYWJjLnN0cmVhbV9zaXplc1swXS5oZWlnaHQgPSAoaW50MzJfdCl0ZXN0X29iai0+YnVmZmVyX2hlaWdodDsKKyAgICB9CisgICAgYWJjLnR5cGVbMF0gPSBDQU1fU1RSRUFNX1RZUEVfUkFXOworCisgICAgYWJjLmJ1ZmZlcl9pbmZvLm1pbl9idWZmZXJzID0gbnVtX2J1ZnM7CisgICAgYWJjLmJ1ZmZlcl9pbmZvLm1heF9idWZmZXJzID0gbnVtX2J1ZnM7CisgICAgYWJjLmlzX3R5cGVbMF0gPSBJU19UWVBFX05PTkU7CisKKyAgICByYyA9IHNldG1ldGFpbmZvQ29tbWFuZCh0ZXN0X29iaiwgJmFiYyk7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgIExPR0UoIm1ldGEgaW5mbyBjb21tYW5kIGZhaWxlZFxuIik7CisgICAgfQorCisgICAgc3RyZWFtID0gbW1fYXBwX2FkZF9zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwpOworICAgIGlmIChOVUxMID09IHN0cmVhbSkgeworICAgICAgICBMT0dFKCJhZGQgc3RyZWFtIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuZ2V0X2J1ZnMgPSBtbV9hcHBfc3RyZWFtX2luaXRidWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5wdXRfYnVmcyA9IG1tX2FwcF9zdHJlYW1fZGVpbml0YnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuaW52YWxpZGF0ZV9idWYgPSBtbV9hcHBfc3RyZWFtX2ludmFsaWRhdGVfYnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwudXNlcl9kYXRhID0gKHZvaWQgKilzdHJlYW07CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1fY2IgPSBzdHJlYW1fY2I7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1fY2Jfc3luYyA9IE5VTEw7CisgICAgc3RyZWFtLT5zX2NvbmZpZy51c2VyZGF0YSA9IHVzZXJkYXRhOworICAgIHN0cmVhbS0+bnVtX29mX2J1ZnMgPSBudW1fYnVmczsKKworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8gPSAoY2FtX3N0cmVhbV9pbmZvX3QgKilzdHJlYW0tPnNfaW5mb19idWYuYnVmLmJ1ZmZlcjsKKyAgICBtZW1zZXQoc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mbywgMCwgc2l6ZW9mKGNhbV9zdHJlYW1faW5mb190KSk7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUgPSBDQU1fU1RSRUFNX1RZUEVfUkFXOworICAgIGlmIChudW1fYnVyc3QgPT0gMCkgeworICAgICAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1pbmdfbW9kZSA9IENBTV9TVFJFQU1JTkdfTU9ERV9DT05USU5VT1VTOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0JVUlNUOworICAgICAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5udW1fb2ZfYnVyc3QgPSBudW1fYnVyc3Q7CisgICAgfQorICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmZtdCA9IHRlc3Rfb2JqLT5idWZmZXJfZm9ybWF0OworICAgIGlmICggdGVzdF9vYmotPmJ1ZmZlcl93aWR0aCA9PSAwIHx8IHRlc3Rfb2JqLT5idWZmZXJfaGVpZ2h0ID09IDAgKSB7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS53aWR0aCA9IERFRkFVTFRfU05BUFNIT1RfV0lEVEg7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS5oZWlnaHQgPSBERUZBVUxUX1NOQVBTSE9UX0hFSUdIVDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5kaW0ud2lkdGggPSAoaW50MzJfdCl0ZXN0X29iai0+YnVmZmVyX3dpZHRoOworICAgICAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5kaW0uaGVpZ2h0ID0gKGludDMyX3QpdGVzdF9vYmotPmJ1ZmZlcl9oZWlnaHQ7CisgICAgfQorICAgIHN0cmVhbS0+c19jb25maWcucGFkZGluZ19pbmZvID0gY2FtX2NhcC0+cGFkZGluZ19pbmZvOworCisgICAgcmMgPSBtbV9hcHBfY29uZmlnX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc3RyZWFtLCAmc3RyZWFtLT5zX2NvbmZpZyk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJjb25maWcgcHJldmlldyBzdHJlYW0gZXJyPSVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtOworfQorCittbV9jYW1lcmFfc3RyZWFtX3QgKiBtbV9hcHBfYWRkX1pTTF9zbmFwc2hvdF9zdHJlYW0obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfbm90aWZ5X3Qgc3RyZWFtX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9idWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYnVyc3QpCit7CisgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnN0cmVhbSA9IE5VTEw7CisgICAgY2FtX2NhcGFiaWxpdHlfdCAqY2FtX2NhcCA9IChjYW1fY2FwYWJpbGl0eV90ICopKHRlc3Rfb2JqLT5jYXBfYnVmLmJ1Zi5idWZmZXIpOworICAgIGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QgYWJjX3NuYXAgOworICAgIG1lbXNldCAoJmFiY19zbmFwICwgMCwgc2l6ZW9mIChjYW1fc3RyZWFtX3NpemVfaW5mb190KSk7CisKKyAgICBhYmNfc25hcC5udW1fc3RyZWFtcyA9IDI7CisgICAgYWJjX3NuYXAucG9zdHByb2Nlc3NfbWFza1sxXSA9IDIxNzg7CisgICAgYWJjX3NuYXAuc3RyZWFtX3NpemVzWzFdLndpZHRoID0gREVGQVVMVF9QUkVWSUVXX1dJRFRIOworICAgIGFiY19zbmFwLnN0cmVhbV9zaXplc1sxXS5oZWlnaHQgPSBERUZBVUxUX1BSRVZJRVdfSEVJR0hUOworICAgIGFiY19zbmFwLnR5cGVbMV0gPSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzsKKworICAgIGFiY19zbmFwLnBvc3Rwcm9jZXNzX21hc2tbMF0gPSAwOworICAgIGlmICggdGVzdF9vYmotPmJ1ZmZlcl93aWR0aCA9PSAwIHx8IHRlc3Rfb2JqLT5idWZmZXJfaGVpZ2h0ID09IDAgKSB7CisgICAgICAgIGFiY19zbmFwLnN0cmVhbV9zaXplc1swXS53aWR0aCA9IERFRkFVTFRfU05BUFNIT1RfV0lEVEg7CisgICAgICAgIGFiY19zbmFwLnN0cmVhbV9zaXplc1swXS5oZWlnaHQgPSBERUZBVUxUX1NOQVBTSE9UX0hFSUdIVDsKKyAgICB9IGVsc2UgeworICAgICAgICBhYmNfc25hcC5zdHJlYW1fc2l6ZXNbMF0ud2lkdGggPSB0ZXN0X29iai0+YnVmZmVyX3dpZHRoOworICAgICAgICBhYmNfc25hcC5zdHJlYW1fc2l6ZXNbMF0uaGVpZ2h0ID0gdGVzdF9vYmotPmJ1ZmZlcl9oZWlnaHQ7CisgICAgfQorICAgIGFiY19zbmFwLnR5cGVbMF0gPSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q7CisKKyAgICBhYmNfc25hcC5idWZmZXJfaW5mby5taW5fYnVmZmVycyA9IDc7CisgICAgYWJjX3NuYXAuYnVmZmVyX2luZm8ubWF4X2J1ZmZlcnMgPSA3OworICAgIGFiY19zbmFwLmlzX3R5cGVbMF0gPSBJU19UWVBFX05PTkU7CisKKyAgICByYyA9IHNldG1ldGFpbmZvQ29tbWFuZCh0ZXN0X29iaiwgJmFiY19zbmFwKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgTE9HRSgibWV0YSBpbmZvIGNvbW1hbmQgc25hcHNob3QgZmFpbGVkXG4iKTsKKyAgICB9CisKKyAgICBzdHJlYW0gPSBtbV9hcHBfYWRkX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgaWYgKE5VTEwgPT0gc3RyZWFtKSB7CisgICAgICAgIExPR0UoImFkZCBzdHJlYW0gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5nZXRfYnVmcyA9IG1tX2FwcF9zdHJlYW1faW5pdGJ1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLnB1dF9idWZzID0gbW1fYXBwX3N0cmVhbV9kZWluaXRidWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5jbGVhbl9pbnZhbGlkYXRlX2J1ZiA9CisgICAgICBtbV9hcHBfc3RyZWFtX2NsZWFuX2ludmFsaWRhdGVfYnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuaW52YWxpZGF0ZV9idWYgPSBtbV9hcHBfc3RyZWFtX2ludmFsaWRhdGVfYnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwudXNlcl9kYXRhID0gKHZvaWQgKilzdHJlYW07CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1fY2IgPSBzdHJlYW1fY2I7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1fY2Jfc3luYyA9IE5VTEw7CisgICAgc3RyZWFtLT5zX2NvbmZpZy51c2VyZGF0YSA9IHVzZXJkYXRhOworICAgIHN0cmVhbS0+bnVtX29mX2J1ZnMgPSBudW1fYnVmczsKKworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8gPSAoY2FtX3N0cmVhbV9pbmZvX3QgKilzdHJlYW0tPnNfaW5mb19idWYuYnVmLmJ1ZmZlcjsKKyAgICBtZW1zZXQoc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mbywgMCwgc2l6ZW9mKGNhbV9zdHJlYW1faW5mb190KSk7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUgPSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q7CisgICAgaWYgKG51bV9idXJzdCA9PSAwKSB7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0NPTlRJTlVPVVM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+c3RyZWFtaW5nX21vZGUgPSBDQU1fU1RSRUFNSU5HX01PREVfQlVSU1Q7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPm51bV9vZl9idXJzdCA9IG51bV9idXJzdDsKKyAgICB9CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+Zm10ID0gREVGQVVMVF9TTkFQU0hPVF9GT1JNQVQ7CisgICAgaWYgKCB0ZXN0X29iai0+YnVmZmVyX3dpZHRoID09IDAgfHwgdGVzdF9vYmotPmJ1ZmZlcl9oZWlnaHQgPT0gMCApIHsKKyAgICAgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+ZGltLndpZHRoID0gREVGQVVMVF9TTkFQU0hPVF9XSURUSDsKKyAgICAgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+ZGltLmhlaWdodCA9IERFRkFVTFRfU05BUFNIT1RfSEVJR0hUOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS53aWR0aCA9IHRlc3Rfb2JqLT5idWZmZXJfd2lkdGg7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS5oZWlnaHQgPSB0ZXN0X29iai0+YnVmZmVyX2hlaWdodDsKKyAgICB9CisgICAgc3RyZWFtLT5zX2NvbmZpZy5wYWRkaW5nX2luZm8gPSBjYW1fY2FwLT5wYWRkaW5nX2luZm87CisgICAgLyogTWFrZSBvZmZzZXQgYXMgemVybyBhcyBDUFAgd2lsbCBub3QgYmUgdXNlZCAgKi8KKyAgICBzdHJlYW0tPnNfY29uZmlnLnBhZGRpbmdfaW5mby5vZmZzZXRfaW5mby5vZmZzZXRfeCA9IDA7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5wYWRkaW5nX2luZm8ub2Zmc2V0X2luZm8ub2Zmc2V0X3kgPSAwOworCisgICAgcmMgPSBtbV9hcHBfY29uZmlnX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc3RyZWFtLCAmc3RyZWFtLT5zX2NvbmZpZyk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJjb25maWcgcHJldmlldyBzdHJlYW0gZXJyPSVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtOworfQorCisKK21tX2NhbWVyYV9zdHJlYW1fdCAqIG1tX2FwcF9hZGRfc25hcHNob3Rfc3RyZWFtKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IHN0cmVhbV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYnVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2J1cnN0KQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnN0cmVhbSA9IE5VTEw7CisgICAgY2FtX2NhcGFiaWxpdHlfdCAqY2FtX2NhcCA9IChjYW1fY2FwYWJpbGl0eV90ICopKHRlc3Rfb2JqLT5jYXBfYnVmLmJ1Zi5idWZmZXIpOworICAgIGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QgYWJjX3NuYXAgOworICAgIG1lbXNldCAoJmFiY19zbmFwICwgMCwgc2l6ZW9mIChjYW1fc3RyZWFtX3NpemVfaW5mb190KSk7CisKKyAgICBhYmNfc25hcC5udW1fc3RyZWFtcyA9IDI7CisgICAgYWJjX3NuYXAucG9zdHByb2Nlc3NfbWFza1sxXSA9IDIxNzg7CisgICAgYWJjX3NuYXAuc3RyZWFtX3NpemVzWzFdLndpZHRoICA9IERFRkFVTFRfUFJFVklFV19XSURUSDsKKyAgICBhYmNfc25hcC5zdHJlYW1fc2l6ZXNbMV0uaGVpZ2h0ID0gREVGQVVMVF9QUkVWSUVXX0hFSUdIVDsKKyAgICBhYmNfc25hcC50eXBlWzFdID0gQ0FNX1NUUkVBTV9UWVBFX1BPU1RWSUVXOworCisgICAgYWJjX3NuYXAucG9zdHByb2Nlc3NfbWFza1swXSA9IDA7CisgICAgaWYgKCB0ZXN0X29iai0+YnVmZmVyX3dpZHRoID09IDAgfHwgdGVzdF9vYmotPmJ1ZmZlcl9oZWlnaHQgPT0gMCApIHsKKyAgICAgICAgYWJjX3NuYXAuc3RyZWFtX3NpemVzWzBdLndpZHRoICA9IERFRkFVTFRfU05BUFNIT1RfV0lEVEg7CisgICAgICAgIGFiY19zbmFwLnN0cmVhbV9zaXplc1swXS5oZWlnaHQgPSBERUZBVUxUX1NOQVBTSE9UX0hFSUdIVDsKKyAgICB9IGVsc2UgeworICAgICAgICBhYmNfc25hcC5zdHJlYW1fc2l6ZXNbMF0ud2lkdGggID0gdGVzdF9vYmotPmJ1ZmZlcl93aWR0aDsKKyAgICAgICAgYWJjX3NuYXAuc3RyZWFtX3NpemVzWzBdLmhlaWdodCA9IHRlc3Rfb2JqLT5idWZmZXJfaGVpZ2h0OworICAgIH0KKyAgICBhYmNfc25hcC50eXBlWzBdID0gQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UOworCisgICAgYWJjX3NuYXAuYnVmZmVyX2luZm8ubWluX2J1ZmZlcnMgPSA3OworICAgIGFiY19zbmFwLmJ1ZmZlcl9pbmZvLm1heF9idWZmZXJzID0gNzsKKyAgICBhYmNfc25hcC5pc190eXBlWzBdID0gSVNfVFlQRV9OT05FOworCisgICAgcmMgPSBzZXRtZXRhaW5mb0NvbW1hbmQodGVzdF9vYmosICZhYmNfc25hcCk7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgIExPR0UoIm1ldGEgaW5mbyBjb21tYW5kIHNuYXBzaG90IGZhaWxlZFxuIik7CisgICAgfQorCisgICAgc3RyZWFtID0gbW1fYXBwX2FkZF9zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwpOworICAgIGlmIChOVUxMID09IHN0cmVhbSkgeworICAgICAgICBMT0dFKCJhZGQgc3RyZWFtIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuZ2V0X2J1ZnMgPSBtbV9hcHBfc3RyZWFtX2luaXRidWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5wdXRfYnVmcyA9IG1tX2FwcF9zdHJlYW1fZGVpbml0YnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuY2xlYW5faW52YWxpZGF0ZV9idWYgPQorICAgICAgbW1fYXBwX3N0cmVhbV9jbGVhbl9pbnZhbGlkYXRlX2J1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLmludmFsaWRhdGVfYnVmID0gbW1fYXBwX3N0cmVhbV9pbnZhbGlkYXRlX2J1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLnVzZXJfZGF0YSA9ICh2b2lkICopc3RyZWFtOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2NiID0gc3RyZWFtX2NiOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2NiX3N5bmMgPSBOVUxMOworICAgIHN0cmVhbS0+c19jb25maWcudXNlcmRhdGEgPSB1c2VyZGF0YTsKKyAgICBzdHJlYW0tPm51bV9vZl9idWZzID0gbnVtX2J1ZnM7CisKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvID0gKGNhbV9zdHJlYW1faW5mb190ICopc3RyZWFtLT5zX2luZm9fYnVmLmJ1Zi5idWZmZXI7CisgICAgbWVtc2V0KHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8sIDAsIHNpemVvZihjYW1fc3RyZWFtX2luZm9fdCkpOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlID0gQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UOworICAgIGlmIChudW1fYnVyc3QgPT0gMCkgeworICAgICAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1pbmdfbW9kZSA9IENBTV9TVFJFQU1JTkdfTU9ERV9DT05USU5VT1VTOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0JVUlNUOworICAgICAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5udW1fb2ZfYnVyc3QgPSBudW1fYnVyc3Q7CisgICAgfQorICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmZtdCA9IERFRkFVTFRfU05BUFNIT1RfRk9STUFUOworICAgIGlmICggdGVzdF9vYmotPmJ1ZmZlcl93aWR0aCA9PSAwIHx8IHRlc3Rfb2JqLT5idWZmZXJfaGVpZ2h0ID09IDAgKSB7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS53aWR0aCA9IERFRkFVTFRfU05BUFNIT1RfV0lEVEg7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS5oZWlnaHQgPSBERUZBVUxUX1NOQVBTSE9UX0hFSUdIVDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5kaW0ud2lkdGggPSB0ZXN0X29iai0+YnVmZmVyX3dpZHRoOworICAgICAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5kaW0uaGVpZ2h0ID0gdGVzdF9vYmotPmJ1ZmZlcl9oZWlnaHQ7CisgICAgfQorICAgIHN0cmVhbS0+c19jb25maWcucGFkZGluZ19pbmZvID0gY2FtX2NhcC0+cGFkZGluZ19pbmZvOworICAgIC8qIE1ha2Ugb2Zmc2V0IGFzIHplcm8gYXMgQ1BQIHdpbGwgbm90IGJlIHVzZWQgICovCisgICAgc3RyZWFtLT5zX2NvbmZpZy5wYWRkaW5nX2luZm8ub2Zmc2V0X2luZm8ub2Zmc2V0X3ggPSAwOworICAgIHN0cmVhbS0+c19jb25maWcucGFkZGluZ19pbmZvLm9mZnNldF9pbmZvLm9mZnNldF95ID0gMDsKKworICAgIHJjID0gbW1fYXBwX2NvbmZpZ19zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwsIHN0cmVhbSwgJnN0cmVhbS0+c19jb25maWcpOworICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgiY29uZmlnIHByZXZpZXcgc3RyZWFtIGVycj0lZFxuIiwgIHJjKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHN0cmVhbTsKK30KKworbW1fY2FtZXJhX2NoYW5uZWxfdCAqIG1tX2FwcF9hZGRfcHJldmlld19jaGFubmVsKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaikKK3sKKyAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnN0cmVhbSA9IE5VTEw7CisKKyAgICBjaGFubmVsID0gbW1fYXBwX2FkZF9jaGFubmVsKHRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9UWVBFX1BSRVZJRVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGlmIChOVUxMID09IGNoYW5uZWwpIHsKKyAgICAgICAgTE9HRSgiYWRkIGNoYW5uZWwgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN0cmVhbSA9IG1tX2FwcF9hZGRfcHJldmlld19zdHJlYW0odGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fYXBwX3ByZXZpZXdfbm90aWZ5X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKil0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRVZJRVdfQlVGX05VTSk7CisgICAgaWYgKE5VTEwgPT0gc3RyZWFtKSB7CisgICAgICAgIExPR0UoImFkZCBzdHJlYW0gZmFpbGVkXG4iKTsKKyAgICAgICAgbW1fYXBwX2RlbF9jaGFubmVsKHRlc3Rfb2JqLCBjaGFubmVsKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNoYW5uZWw7Cit9CisKK2ludCBtbV9hcHBfc3RvcF9hbmRfZGVsX2NoYW5uZWwobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnN0cmVhbSA9IE5VTEw7CisgICAgdWludDhfdCBpOworICAgIGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QgYWJjIDsKKyAgICBtZW1zZXQgKCZhYmMgLCAwLCBzaXplb2YgKGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QpKTsKKworICAgIHJjID0gbW1fYXBwX3N0b3BfY2hhbm5lbCh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJTdG9wIFByZXZpZXcgZmFpbGVkIHJjPSVkXG4iLCAgcmMpOworICAgIH0KKworICAgIGlmIChjaGFubmVsLT5udW1fc3RyZWFtcyA8PSBNQVhfU1RSRUFNX05VTV9JTl9CVU5ETEUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIHN0cmVhbSA9ICZjaGFubmVsLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgcmMgPSBtbV9hcHBfZGVsX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc3RyZWFtKTsKKyAgICAgICAgICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJkZWwgc3RyZWFtKCVkKSBmYWlsZWQgcmM9JWRcbiIsICBpLCByYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJudW1fc3RyZWFtcyA9ICVkLiBTaG91bGQgbm90IGJlIG1vcmUgdGhhbiAlZFxuIiwKKyAgICAgICAgICAgICBjaGFubmVsLT5udW1fc3RyZWFtcywgTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFKTsKKyAgICB9CisKKyAgICByYyA9IHNldG1ldGFpbmZvQ29tbWFuZCh0ZXN0X29iaiwgJmFiYyk7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgIExPR0UoIm1ldGEgaW5mbyBjb21tYW5kIGZhaWxlZFxuIik7CisgICAgfQorCisgICAgcmMgPSBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgiZGVsZXRlIGNoYW5uZWwgZmFpbGVkIHJjPSVkXG4iLCAgcmMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF9zdGFydF9wcmV2aWV3KG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaikKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzdHJlYW0gPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc19tZXRhZGF0YSA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzX2FuYWx5c2lzID0gTlVMTDsKKyAgICB1aW50OF90IGk7CisKKyAgICBjaGFubmVsID0gIG1tX2FwcF9hZGRfcHJldmlld19jaGFubmVsKHRlc3Rfb2JqKTsKKyAgICBpZiAoTlVMTCA9PSBjaGFubmVsKSB7CisgICAgICAgIExPR0UoImFkZCBjaGFubmVsIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gLU1NX0NBTUVSQV9FX0dFTkVSQUw7CisgICAgfQorCisgICAgc19tZXRhZGF0YSA9IG1tX2FwcF9hZGRfbWV0YWRhdGFfc3RyZWFtKHRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9hcHBfbWV0YWRhdGFfbm90aWZ5X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVWSUVXX0JVRl9OVU0pOworICAgIGlmIChOVUxMID09IHNfbWV0YWRhdGEpIHsKKyAgICAgICAgTE9HRSgiYWRkIG1ldGFkYXRhIHN0cmVhbSBmYWlsZWRcbiIpOworICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgc19hbmFseXNpcyA9IG1tX2FwcF9hZGRfYW5hbHlzaXNfc3RyZWFtKHRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVWSUVXX0JVRl9OVU0pOworICAgIGlmIChOVUxMID09IHNfYW5hbHlzaXMpIHsKKyAgICAgICAgTE9HRSgiQW5hbHlzaXMgU3RyZWFtIGNvdWxkIG5vdCBiZSBhZGRlZFxuIik7CisgICAgfQorCisgICAgcmMgPSBtbV9hcHBfc3RhcnRfY2hhbm5lbCh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJzdGFydCBwcmV2aWV3IGZhaWxlZCByYz0lZFxuIiwgIHJjKTsKKyAgICAgICAgaWYgKGNoYW5uZWwtPm51bV9zdHJlYW1zIDw9IE1BWF9TVFJFQU1fTlVNX0lOX0JVTkRMRSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSAmY2hhbm5lbC0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICBtbV9hcHBfZGVsX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fYXBwX3N0b3BfcHJldmlldyhtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwgPQorICAgICAgICBtbV9hcHBfZ2V0X2NoYW5uZWxfYnlfdHlwZSh0ZXN0X29iaiwgTU1fQ0hBTk5FTF9UWVBFX1BSRVZJRVcpOworCisgICAgcmMgPSBtbV9hcHBfc3RvcF9hbmRfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgiU3RvcCBQcmV2aWV3IGZhaWxlZCByYz0lZFxuIiwgIHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfc3RhcnRfcHJldmlld196c2wobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKQoreworICAgIGludDMyX3QgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzX3ByZXZpZXcgPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc19tZXRhZGF0YSA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzX21haW4gPSBOVUxMOworICAgIG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCBhdHRyOworICAgIG1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCkpOworICAgIGF0dHIubm90aWZ5X21vZGUgPSBNTV9DQU1FUkFfU1VQRVJfQlVGX05PVElGWV9DT05USU5VT1VTOworICAgIGF0dHIubG9va19iYWNrID0gMjsKKyAgICBhdHRyLnBvc3RfZnJhbWVfc2tpcCA9IDA7CisgICAgYXR0ci53YXRlcl9tYXJrID0gMjsKKyAgICBhdHRyLm1heF91bm1hdGNoZWRfZnJhbWVzID0gMzsKKyAgICBjaGFubmVsID0gbW1fYXBwX2FkZF9jaGFubmVsKHRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9UWVBFX1pTTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fYXBwX3pzbF9ub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X29iaik7CisgICAgaWYgKE5VTEwgPT0gY2hhbm5lbCkgeworICAgICAgICBMT0dFKCJhZGQgY2hhbm5lbCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC1NTV9DQU1FUkFfRV9HRU5FUkFMOworICAgIH0KKworCisgICAgc19tYWluID0gbW1fYXBwX2FkZF9aU0xfc25hcHNob3Rfc3RyZWFtKHRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fYXBwX3NuYXBzaG90X25vdGlmeV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRVZJRVdfQlVGX05VTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoTlVMTCA9PSBzX21haW4pIHsKKyAgICAgICAgTE9HRSgiYWRkIG1haW4gc25hcHNob3Qgc3RyZWFtIGZhaWxlZFxuIik7CisgICAgICAgIG1tX2FwcF9kZWxfY2hhbm5lbCh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgc19wcmV2aWV3ID0gbW1fYXBwX2FkZF9aU0xfcHJldmlld19zdHJlYW0odGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fYXBwX3ByZXZpZXdfbm90aWZ5X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKil0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRVZJRVdfQlVGX05VTSk7CisgICAgaWYgKE5VTEwgPT0gc19wcmV2aWV3KSB7CisgICAgICAgIExPR0UoImFkZCBwcmV2aWV3IHN0cmVhbSBmYWlsZWRcbiIpOworICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisKKyAgICBzX21ldGFkYXRhID0gbW1fYXBwX2FkZF9tZXRhZGF0YV9zdHJlYW0odGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2FwcF9tZXRhZGF0YV9ub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRVZJRVdfQlVGX05VTSk7CisgICAgaWYgKE5VTEwgPT0gc19tZXRhZGF0YSkgeworICAgICAgICBMT0dFKCJhZGQgbWV0YWRhdGEgc3RyZWFtIGZhaWxlZFxuIik7CisgICAgICAgIG1tX2FwcF9kZWxfY2hhbm5lbCh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByYyA9IG1tX2FwcF9zdGFydF9jaGFubmVsKHRlc3Rfb2JqLCBjaGFubmVsKTsKKyAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHJjKSB7CisgICAgICAgIExPR0UoInN0YXJ0IHpzbCBmYWlsZWQgcmM9JWRcbiIsICByYyk7CisgICAgICAgIG1tX2FwcF9kZWxfc3RyZWFtKHRlc3Rfb2JqLCBjaGFubmVsLCBzX3ByZXZpZXcpOworICAgICAgICBtbV9hcHBfZGVsX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc19tZXRhZGF0YSk7CisgICAgICAgIG1tX2FwcF9kZWxfc3RyZWFtKHRlc3Rfb2JqLCBjaGFubmVsLCBzX21haW4pOworICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgaWYgKCB0ZXN0X29iai0+ZW5hYmxlX3JlcHJvYyApIHsKKyAgICAgICAgaWYgKCBOVUxMID09IG1tX2FwcF9hZGRfcmVwcm9jZXNzX2NoYW5uZWwodGVzdF9vYmosIHNfbWFpbikgKSB7CisgICAgICAgICAgICBMT0dFKCJSZXByb2Nlc3MgY2hhbm5lbCBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBcbiIpOworICAgICAgICAgICAgbW1fYXBwX2RlbF9zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwsIHNfcHJldmlldyk7CisjaWZkZWYgVVNFX01FVEFEQVRBX1NUUkVBTQorICAgICAgICAgICAgbW1fYXBwX2RlbF9zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwsIHNfbWV0YWRhdGEpOworI2VuZGlmCisgICAgICAgICAgICBtbV9hcHBfZGVsX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc19tYWluKTsKKyAgICAgICAgICAgIG1tX2FwcF9kZWxfY2hhbm5lbCh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSBtbV9hcHBfc3RhcnRfcmVwcm9jZXNzKHRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICAgICAgTE9HRSgicmVwcm9jZXNzIHN0YXJ0IGZhaWxlZCByYz0lZFxuIiwgIHJjKTsKKyAgICAgICAgICAgIG1tX2FwcF9kZWxfc3RyZWFtKHRlc3Rfb2JqLCBjaGFubmVsLCBzX3ByZXZpZXcpOworI2lmZGVmIFVTRV9NRVRBREFUQV9TVFJFQU0KKyAgICAgICAgICAgIG1tX2FwcF9kZWxfc3RyZWFtKHRlc3Rfb2JqLCBjaGFubmVsLCBzX21ldGFkYXRhKTsKKyNlbmRpZgorICAgICAgICAgICAgbW1fYXBwX2RlbF9zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwsIHNfbWFpbik7CisgICAgICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fYXBwX3N0b3BfcHJldmlld196c2wobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKworICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwgPQorICAgICAgICBtbV9hcHBfZ2V0X2NoYW5uZWxfYnlfdHlwZSh0ZXN0X29iaiwgTU1fQ0hBTk5FTF9UWVBFX1pTTCk7CisKKyAgICByYyA9IG1tX2FwcF9zdG9wX2FuZF9kZWxfY2hhbm5lbCh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJTdG9wIFByZXZpZXcgZmFpbGVkIHJjPSVkXG4iLCAgcmMpOworICAgIH0KKworICAgIGlmICggdGVzdF9vYmotPmVuYWJsZV9yZXByb2MgKSB7CisgICAgICAgIHJjIHw9IG1tX2FwcF9zdG9wX3JlcHJvY2Vzcyh0ZXN0X29iaik7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fYXBwX2luaXRpYWxpemVfZmIobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBpbnQgYnJpZ2h0bmVzc19mZDsKKyAgICBjb25zdCBjaGFyIGJyaWdodG5lc3NfbGV2ZWxbXSA9IEJBQ0tMSUdIVF9MRVZFTDsKKyAgICB2b2lkICpmYl9iYXNlID0gTlVMTDsKKworICAgIGFzc2VydCggKCBOVUxMICE9IHRlc3Rfb2JqICkgJiYgKCAwID09IHRlc3Rfb2JqLT5mYl9mZCApICk7CisKKyAgICB0ZXN0X29iai0+ZmJfZmQgPSBvcGVuKEZCX1BBVEgsIE9fUkRXUik7CisgICAgaWYgKCAwID4gdGVzdF9vYmotPmZiX2ZkICkgeworICAgICAgICBMT0dFKCJGQiBkZXZpY2Ugb3BlbiBmYWlsZWQgcmM9JWQsICVzXG4iLAorICAgICAgICAgICAgICAgICAgIC1lcnJubywKKyAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgICByYyA9IC1lcnJubzsKKyAgICAgICAgZ290byBGQUlMOworICAgIH0KKworICAgIHJjID0gaW9jdGwodGVzdF9vYmotPmZiX2ZkLCBGQklPR0VUX1ZTQ1JFRU5JTkZPLCAmdGVzdF9vYmotPnZpbmZvKTsKKyAgICBpZiAoIE1NX0NBTUVSQV9PSyAhPSByYyApIHsKKyAgICAgICAgTE9HRSgiQ2FuIG5vdCByZXRyaWV2ZSBzY3JlZW4gaW5mbyByYz0lZCwgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgLWVycm5vLAorICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJjID0gLWVycm5vOworICAgICAgICBnb3RvIEZBSUw7CisgICAgfQorCisgICAgaWYgKCAoIDAgPT0gdGVzdF9vYmotPnZpbmZvLnlyZXNfdmlydHVhbCApIHx8CisgICAgICAgICAoIDAgPT0gdGVzdF9vYmotPnZpbmZvLnlyZXMgKSB8fAorICAgICAgICAgKCB0ZXN0X29iai0+dmluZm8ueXJlcyA+IHRlc3Rfb2JqLT52aW5mby55cmVzX3ZpcnR1YWwgKSApIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBGQiB2aXJ0dWFsIHlyZXM6ICVkLCB5cmVzOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X29iai0+dmluZm8ueXJlc192aXJ0dWFsLAorICAgICAgICAgICAgICAgICAgIHRlc3Rfb2JqLT52aW5mby55cmVzKTsKKyAgICAgICAgcmMgPSBNTV9DQU1FUkFfRV9HRU5FUkFMOworICAgICAgICBnb3RvIEZBSUw7CisgICAgfQorCisgICAgaWYgKCAoIDAgPT0gdGVzdF9vYmotPnZpbmZvLnhyZXNfdmlydHVhbCApIHx8CisgICAgICAgICAoIDAgPT0gdGVzdF9vYmotPnZpbmZvLnhyZXMgKSB8fAorICAgICAgICAgKCB0ZXN0X29iai0+dmluZm8ueHJlcyA+IHRlc3Rfb2JqLT52aW5mby54cmVzX3ZpcnR1YWwgKSApIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBGQiB2aXJ0dWFsIHhyZXM6ICVkLCB4cmVzOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X29iai0+dmluZm8ueHJlc192aXJ0dWFsLAorICAgICAgICAgICAgICAgICAgIHRlc3Rfb2JqLT52aW5mby54cmVzKTsKKyAgICAgICAgcmMgPSBNTV9DQU1FUkFfRV9HRU5FUkFMOworICAgICAgICBnb3RvIEZBSUw7CisgICAgfQorCisgICAgYnJpZ2h0bmVzc19mZCA9IG9wZW4oQkFDS0xJR0hUX0NPTlRST0wsIE9fUkRXUik7CisgICAgaWYgKCBicmlnaHRuZXNzX2ZkID49IDAgKSB7CisgICAgICAgIHdyaXRlKGJyaWdodG5lc3NfZmQsIGJyaWdodG5lc3NfbGV2ZWwsIHN0cmxlbihicmlnaHRuZXNzX2xldmVsKSk7CisgICAgICAgIGNsb3NlKGJyaWdodG5lc3NfZmQpOworICAgIH0KKworICAgIHRlc3Rfb2JqLT5zbGljZV9zaXplID0gdGVzdF9vYmotPnZpbmZvLnhyZXMgKiAoIHRlc3Rfb2JqLT52aW5mby55cmVzIC0gMSApICogREVGQVVMVF9PVl9GT1JNQVRfQlBQOworICAgIG1lbXNldCgmdGVzdF9vYmotPmRhdGFfb3ZlcmxheSwgMCwgc2l6ZW9mKHN0cnVjdCBtZHBfb3ZlcmxheSkpOworICAgIHRlc3Rfb2JqLT5kYXRhX292ZXJsYXkuc3JjLndpZHRoICA9IHRlc3Rfb2JqLT5idWZmZXJfd2lkdGg7CisgICAgdGVzdF9vYmotPmRhdGFfb3ZlcmxheS5zcmMuaGVpZ2h0ID0gdGVzdF9vYmotPmJ1ZmZlcl9oZWlnaHQ7CisgICAgdGVzdF9vYmotPmRhdGFfb3ZlcmxheS5zcmNfcmVjdC53ID0gdGVzdF9vYmotPmJ1ZmZlcl93aWR0aDsKKyAgICB0ZXN0X29iai0+ZGF0YV9vdmVybGF5LnNyY19yZWN0LmggPSB0ZXN0X29iai0+YnVmZmVyX2hlaWdodDsKKyAgICB0ZXN0X29iai0+ZGF0YV9vdmVybGF5LmRzdF9yZWN0LncgPSB0ZXN0X29iai0+YnVmZmVyX3dpZHRoOworICAgIHRlc3Rfb2JqLT5kYXRhX292ZXJsYXkuZHN0X3JlY3QuaCA9IHRlc3Rfb2JqLT5idWZmZXJfaGVpZ2h0OworICAgIHRlc3Rfb2JqLT5kYXRhX292ZXJsYXkuc3JjLmZvcm1hdCA9IERFRkFVTFRfT1ZfRk9STUFUOworICAgIHRlc3Rfb2JqLT5kYXRhX292ZXJsYXkuc3JjX3JlY3QueCA9IDA7CisgICAgdGVzdF9vYmotPmRhdGFfb3ZlcmxheS5zcmNfcmVjdC55ID0gMDsKKyAgICB0ZXN0X29iai0+ZGF0YV9vdmVybGF5LmRzdF9yZWN0LnggPSAwOworICAgIHRlc3Rfb2JqLT5kYXRhX292ZXJsYXkuZHN0X3JlY3QueSA9IDA7CisgICAgdGVzdF9vYmotPmRhdGFfb3ZlcmxheS56X29yZGVyID0gMjsKKyAgICB0ZXN0X29iai0+ZGF0YV9vdmVybGF5LmFscGhhID0gMHg4MDsKKyAgICB0ZXN0X29iai0+ZGF0YV9vdmVybGF5LnRyYW5zcF9tYXNrID0gMHhmZmUwOworICAgIHRlc3Rfb2JqLT5kYXRhX292ZXJsYXkuZmxhZ3MgPSBNRFBfRkxJUF9MUiB8IE1EUF9GTElQX1VEOworCisgICAgLy8gTWFwIGFuZCBjbGVhciBGQiBwb3J0aW9uCisgICAgZmJfYmFzZSA9IG1tYXAoMCwKKyAgICAgICAgICAgICAgICAgICB0ZXN0X29iai0+c2xpY2Vfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBQUk9UX1dSSVRFLAorICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgdGVzdF9vYmotPmZiX2ZkLAorICAgICAgICAgICAgICAgICAgIDApOworICAgIGlmICggTUFQX0ZBSUxFRCAgPT0gZmJfYmFzZSApIHsKKyAgICAgICAgICAgIExPR0UoIiggRXJyb3Igd2hpbGUgbWVtb3J5IG1hcHBpbmcgZnJhbWUgYnVmZmVyICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHJjID0gLWVycm5vOworICAgICAgICAgICAgZ290byBGQUlMOworICAgIH0KKworICAgIG1lbXNldChmYl9iYXNlLCAwLCB0ZXN0X29iai0+c2xpY2Vfc2l6ZSk7CisKKyAgICBpZiAoaW9jdGwodGVzdF9vYmotPmZiX2ZkLCBGQklPUEFOX0RJU1BMQVksICZ0ZXN0X29iai0+dmluZm8pIDwgMCkgeworICAgICAgICBMT0dFKCJGQklPUEFOX0RJU1BMQVkgZmFpbGVkISIpOworICAgICAgICByYyA9IC1lcnJubzsKKyAgICAgICAgZ290byBGQUlMOworICAgIH0KKworICAgIG11bm1hcChmYl9iYXNlLCB0ZXN0X29iai0+c2xpY2Vfc2l6ZSk7CisgICAgdGVzdF9vYmotPmRhdGFfb3ZlcmxheS5pZCA9ICh1aW50MzJfdClNU01GQl9ORVdfUkVRVUVTVDsKKyAgICByYyA9IGlvY3RsKHRlc3Rfb2JqLT5mYl9mZCwgTVNNRkJfT1ZFUkxBWV9TRVQsICZ0ZXN0X29iai0+ZGF0YV9vdmVybGF5KTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIExPR0UoIk1TTUZCX09WRVJMQVlfU0VUIGZhaWxlZCEgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgdGVzdF9vYmotPmRhdGFfb3ZlcmxheS5pZCk7CisgICAgICAgIHJldHVybiBNTV9DQU1FUkFfRV9HRU5FUkFMOworICAgIH0KKyAgICBMT0dFKCJPdmVybGF5IHNldCB3aXRoIG92ZXJsYXkgaWQ6ICVkIiwgIHRlc3Rfb2JqLT5kYXRhX292ZXJsYXkuaWQpOworCisgICAgcmV0dXJuIHJjOworCitGQUlMOgorCisgICAgaWYgKCAwIDwgdGVzdF9vYmotPmZiX2ZkICkgeworICAgICAgICBjbG9zZSh0ZXN0X29iai0+ZmJfZmQpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF9jbG9zZV9mYihtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworCisgICAgYXNzZXJ0KCAoIE5VTEwgIT0gdGVzdF9vYmogKSAmJiAoIDAgPCB0ZXN0X29iai0+ZmJfZmQgKSApOworCisgICAgaWYgKGlvY3RsKHRlc3Rfb2JqLT5mYl9mZCwgTVNNRkJfT1ZFUkxBWV9VTlNFVCwgJnRlc3Rfb2JqLT5kYXRhX292ZXJsYXkuaWQpKSB7CisgICAgICAgIExPR0UoIlxuRVJST1IhIE1TTUZCX09WRVJMQVlfVU5TRVQgZmFpbGVkISAoTGluZSAlZClcbiIpOworICAgIH0KKworICAgIGlmIChpb2N0bCh0ZXN0X29iai0+ZmJfZmQsIEZCSU9QQU5fRElTUExBWSwgJnRlc3Rfb2JqLT52aW5mbykgPCAwKSB7CisgICAgICAgIExPR0UoIkVSUk9SOiBGQklPUEFOX0RJU1BMQVkgZmFpbGVkISBsaW5lPSVkXG4iKTsKKyAgICB9CisKKyAgICBjbG9zZSh0ZXN0X29iai0+ZmJfZmQpOworICAgIHRlc3Rfb2JqLT5mYl9mZCA9IC0xOworCisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIG1lbXNldDE2KHZvaWQgKnBEc3QsIHVpbnQxNl90IHZhbHVlLCBpbnQgY291bnQpCit7CisgICAgdWludDE2X3QgKnB0ciA9IHBEc3Q7CisgICAgd2hpbGUgKGNvdW50LS0pCisgICAgICAgICpwdHIrKyA9IHZhbHVlOworfQorCitpbnQgbW1fYXBwX292ZXJsYXlfZGlzcGxheShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosIGludCBidWZmZXJGZCkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgc3RydWN0IG1zbWZiX292ZXJsYXlfZGF0YSBvdmRhdGE7CisKKworICAgIG1lbXNldCgmb3ZkYXRhLCAwLCBzaXplb2Yoc3RydWN0IG1zbWZiX292ZXJsYXlfZGF0YSkpOworICAgIG92ZGF0YS5pZCA9IHRlc3Rfb2JqLT5kYXRhX292ZXJsYXkuaWQ7CisgICAgb3ZkYXRhLmRhdGEubWVtb3J5X2lkID0gYnVmZmVyRmQ7CisKKyAgICBpZiAoaW9jdGwodGVzdF9vYmotPmZiX2ZkLCBNU01GQl9PVkVSTEFZX1BMQVksICZvdmRhdGEpKSB7CisgICAgICAgIExPR0UoIk1TTUZCX09WRVJMQVlfUExBWSBmYWlsZWQhIik7CisgICAgICAgIHJldHVybiBNTV9DQU1FUkFfRV9HRU5FUkFMOworICAgIH0KKworICAgIGlmIChpb2N0bCh0ZXN0X29iai0+ZmJfZmQsIEZCSU9QQU5fRElTUExBWSwgJnRlc3Rfb2JqLT52aW5mbykgPCAwKSB7CisgICAgICAgIExPR0UoIkZCSU9QQU5fRElTUExBWSBmYWlsZWQhIik7CisgICAgICAgIHJldHVybiBNTV9DQU1FUkFfRV9HRU5FUkFMOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9zcmMvbW1fcWNhbWVyYV9xdWV1ZS5jIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX3F1ZXVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExNzZiZQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9zcmMvbW1fcWNhbWVyYV9xdWV1ZS5jCkBAIC0wLDAgKzEsMTY4IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorKiBtZXQ6CisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAibW1fcWNhbWVyYV9hcHAuaCIKKyNpbmNsdWRlICJtbV9xY2FtZXJhX2RiZy5oIgorCitpbnQgbW1fY2FtZXJhX3F1ZXVlX2luaXQobW1fY2FtZXJhX3F1ZXVlX3QgKnF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VfZGF0YV9mbiBkYXRhX3JlbF9mbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgaWYgKCBOVUxMID09IHF1ZXVlICkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHRocmVhZF9tdXRleF9pbml0KCZxdWV1ZS0+bV9sb2NrLCBOVUxMKTsKKyAgICBjYW1fbGlzdF9pbml0KCZxdWV1ZS0+bV9oZWFkLmxpc3QpOworICAgIHF1ZXVlLT5tX3NpemUgPSAwOworICAgIHF1ZXVlLT5tX2RhdGFGbiA9IGRhdGFfcmVsX2ZuOworICAgIHF1ZXVlLT5tX3VzZXJEYXRhID0gdXNlcl9kYXRhOworCisgICAgcmV0dXJuIE1NX0NBTUVSQV9PSzsKK30KKworaW50IG1tX3FjYW1lcmFfcXVldWVfcmVsZWFzZShtbV9jYW1lcmFfcXVldWVfdCAqcXVldWUpCit7CisgICAgaWYgKCBOVUxMID09IHF1ZXVlICkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbW1fcWNhbWVyYV9xdWV1ZV9mbHVzaChxdWV1ZSk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZxdWV1ZS0+bV9sb2NrKTsKKworICAgIHJldHVybiBNTV9DQU1FUkFfT0s7Cit9CisKK2ludCBtbV9xY2FtZXJhX3F1ZXVlX2lzZW1wdHkobW1fY2FtZXJhX3F1ZXVlX3QgKnF1ZXVlKQoreworICAgIGlmICggTlVMTCA9PSBxdWV1ZSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW50IGZsYWcgPSAxOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcXVldWUtPm1fbG9jayk7CisgICAgaWYgKHF1ZXVlLT5tX3NpemUgPiAwKSB7CisgICAgICAgIGZsYWcgPSAwOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcXVldWUtPm1fbG9jayk7CisKKyAgICByZXR1cm4gZmxhZzsKK30KKworaW50IG1tX3FjYW1lcmFfcXVldWVfZW5xdWV1ZShtbV9jYW1lcmFfcXVldWVfdCAqcXVldWUsIHZvaWQgKmRhdGEpCit7CisgICAgaWYgKCBOVUxMID09IHF1ZXVlICkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY2FtZXJhX3Ffbm9kZSAqbm9kZSA9CisgICAgICAgIChjYW1lcmFfcV9ub2RlICopbWFsbG9jKHNpemVvZihjYW1lcmFfcV9ub2RlKSk7CisgICAgaWYgKE5VTEwgPT0gbm9kZSkgeworICAgICAgICBMT0dFKCIgTm8gbWVtb3J5IGZvciBjYW1lcmFfcV9ub2RlIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG1lbXNldChub2RlLCAwLCBzaXplb2YoY2FtZXJhX3Ffbm9kZSkpOworICAgIG5vZGUtPmRhdGEgPSBkYXRhOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZxdWV1ZS0+bV9sb2NrKTsKKyAgICBjYW1fbGlzdF9hZGRfdGFpbF9ub2RlKCZub2RlLT5saXN0LCAmcXVldWUtPm1faGVhZC5saXN0KTsKKyAgICBxdWV1ZS0+bV9zaXplKys7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnF1ZXVlLT5tX2xvY2spOworCisgICAgcmV0dXJuIDE7Cit9CisKK3ZvaWQqIG1tX3FjYW1lcmFfcXVldWVfZGVxdWV1ZShtbV9jYW1lcmFfcXVldWVfdCAqcXVldWUsIGludCBiRnJvbUhlYWQpCit7CisgICAgaWYgKCBOVUxMID09IHF1ZXVlICkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjYW1lcmFfcV9ub2RlKiBub2RlID0gTlVMTDsKKyAgICB2b2lkKiBkYXRhID0gTlVMTDsKKyAgICBzdHJ1Y3QgY2FtX2xpc3QgKmhlYWQgPSBOVUxMOworICAgIHN0cnVjdCBjYW1fbGlzdCAqcG9zID0gTlVMTDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcXVldWUtPm1fbG9jayk7CisgICAgaGVhZCA9ICZxdWV1ZS0+bV9oZWFkLmxpc3Q7CisgICAgaWYgKGJGcm9tSGVhZCkgeworICAgICAgICBwb3MgPSBoZWFkLT5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICAgIHBvcyA9IGhlYWQtPnByZXY7CisgICAgfQorICAgIGlmIChwb3MgIT0gaGVhZCkgeworICAgICAgICBub2RlID0gbWVtYmVyX29mKHBvcywgY2FtZXJhX3Ffbm9kZSwgbGlzdCk7CisgICAgICAgIGNhbV9saXN0X2RlbF9ub2RlKCZub2RlLT5saXN0KTsKKyAgICAgICAgcXVldWUtPm1fc2l6ZS0tOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcXVldWUtPm1fbG9jayk7CisKKyAgICBpZiAoTlVMTCAhPSBub2RlKSB7CisgICAgICAgIGRhdGEgPSBub2RlLT5kYXRhOworICAgICAgICBmcmVlKG5vZGUpOworICAgIH0KKworICAgIHJldHVybiBkYXRhOworfQorCit2b2lkIG1tX3FjYW1lcmFfcXVldWVfZmx1c2gobW1fY2FtZXJhX3F1ZXVlX3QgKnF1ZXVlKQoreworICAgIGNhbWVyYV9xX25vZGUqIG5vZGUgPSBOVUxMOworICAgIHN0cnVjdCBjYW1fbGlzdCAqaGVhZCA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpwb3MgPSBOVUxMOworCisgICAgaWYgKCBOVUxMID09IHF1ZXVlICkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZxdWV1ZS0+bV9sb2NrKTsKKyAgICBoZWFkID0gJnF1ZXVlLT5tX2hlYWQubGlzdDsKKyAgICBwb3MgPSBoZWFkLT5uZXh0OworCisgICAgd2hpbGUocG9zICE9IGhlYWQpIHsKKyAgICAgICAgbm9kZSA9IG1lbWJlcl9vZihwb3MsIGNhbWVyYV9xX25vZGUsIGxpc3QpOworICAgICAgICBwb3MgPSBwb3MtPm5leHQ7CisgICAgICAgIGNhbV9saXN0X2RlbF9ub2RlKCZub2RlLT5saXN0KTsKKyAgICAgICAgcXVldWUtPm1fc2l6ZS0tOworCisgICAgICAgIGlmIChOVUxMICE9IG5vZGUtPmRhdGEpIHsKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+bV9kYXRhRm4pIHsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+bV9kYXRhRm4obm9kZS0+ZGF0YSwgcXVldWUtPm1fdXNlckRhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShub2RlLT5kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKG5vZGUpOworCisgICAgfQorICAgIHF1ZXVlLT5tX3NpemUgPSAwOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+bV9sb2NrKTsKK30KKwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX3JkaS5jIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX3JkaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMDdmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfcmRpLmMKQEAgLTAsMCArMSwzNDYgQEAKKy8qCitDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKK1dBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCitBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCitCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCitDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCitCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCitPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCitJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxmY250bC5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAibW1fcWNhbWVyYV9hcHAuaCIKKyNpbmNsdWRlICJtbV9xY2FtZXJhX2RiZy5oIgorCitzdGF0aWMgdWludDMyX3QgcmRpX2xlbiA9IDA7CisKK3N0YXRpYyB2b2lkIG1tX2FwcF9yZGlfZHVtcF9mcmFtZShtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmcmFtZV9pZHgpCit7CisgICAgY2hhciBmaWxlX25hbWVbRklMRU5BTUVfTUFYXTsKKyAgICBpbnQgZmlsZV9mZDsKKyAgICBpbnQgaTsKKworICAgIGlmIChmcmFtZSAhPSBOVUxMKSB7CisgICAgICAgIHNucHJpbnRmKGZpbGVfbmFtZSwgc2l6ZW9mKGZpbGVfbmFtZSksCisgICAgICAgICAgICBRQ0FNRVJBX0RVTVBfRlJNX0xPQ0FUSU9OIiVzXyUwM3UuJXMiLCBuYW1lLCBmcmFtZV9pZHgsIGV4dCk7CisgICAgICAgIGZpbGVfZmQgPSBvcGVuKGZpbGVfbmFtZSwgT19SRFdSIHwgT19DUkVBVCwgMDc3Nyk7CisgICAgICAgIGlmIChmaWxlX2ZkIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiIGNhbm5vdCBvcGVuIGZpbGUgJXMgXG4iLCAgZmlsZV9uYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS0+cGxhbmVzX2J1Zi5udW1fcGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICB3cml0ZShmaWxlX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopZnJhbWUtPmJ1ZmZlciArIGZyYW1lLT5wbGFuZXNfYnVmLnBsYW5lc1tpXS5kYXRhX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICByZGlfbGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xvc2UoZmlsZV9mZCk7CisgICAgICAgICAgICBMT0dEKCIgZHVtcCByZGkgZnJhbWUgJXMiLCBmaWxlX25hbWUpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtbV9hcHBfcmRpX25vdGlmeV9jYihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmJ1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgY2hhciBmaWxlX25hbWVbRklMRU5BTUVfTUFYXTsKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZSA9IGJ1ZnMtPmJ1ZnNbMF07CisgICAgbW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnBtZSA9IChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqKXVzZXJfZGF0YTsKKworICAgIExPR0QoIiBCRUdJTiAtIGxlbmd0aD0lenUsIGZyYW1lIGlkeCA9ICVkIHN0cmVhbV9pZD0lZFxuIiwKKyAgICAgICAgICBmcmFtZS0+ZnJhbWVfbGVuLCBmcmFtZS0+ZnJhbWVfaWR4LCBmcmFtZS0+c3RyZWFtX2lkKTsKKyAgICBzbnByaW50ZihmaWxlX25hbWUsIHNpemVvZihmaWxlX25hbWUpLCAiUkRJX2R1bXBfJWQiLCBwbWUtPmNhbS0+Y2FtZXJhX2hhbmRsZSk7CisgICAgbW1fYXBwX3JkaV9kdW1wX2ZyYW1lKGZyYW1lLCBmaWxlX25hbWUsICJyYXciLCBmcmFtZS0+ZnJhbWVfaWR4KTsKKworICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcG1lLT5jYW0tPm9wcy0+cWJ1ZihidWZzLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzLT5jaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUpKSB7CisgICAgICAgIExPR0UoIiBGYWlsZWQgaW4gUkRJIFFidWZcbiIpOworICAgIH0KKyAgICBtbV9hcHBfY2FjaGVfb3BzKChtbV9jYW1lcmFfYXBwX21lbWluZm9fdCAqKWZyYW1lLT5tZW1faW5mbywKKyAgICAgICAgICAgICAgICAgICAgIElPTl9JT0NfSU5WX0NBQ0hFUyk7CisKKyAgICBMT0dEKCIgRU5EXG4iKTsKK30KKworbW1fY2FtZXJhX3N0cmVhbV90ICogbW1fYXBwX2FkZF9yZGlfc3RyZWFtKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCBzdHJlYW1fY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9idWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9idXJzdCkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgc2l6ZV90IGk7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzdHJlYW0gPSBOVUxMOworICAgIGNhbV9jYXBhYmlsaXR5X3QgKmNhbV9jYXAgPSAoY2FtX2NhcGFiaWxpdHlfdCAqKSh0ZXN0X29iai0+Y2FwX2J1Zi5idWYuYnVmZmVyKTsKKyAgICBjYW1fZm9ybWF0X3QgZm10ID0gQ0FNX0ZPUk1BVF9NQVg7CisgICAgY2FtX3N0cmVhbV9idWZfcGxhbmVfaW5mb190ICpidWZfcGxhbmVzOworICAgIGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QgYWJjIDsKKyAgICBtZW1zZXQgKCZhYmMgLCAwLCBzaXplb2YgKGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QpKTsKKworCisKKyAgICBMT0dFKCIgcmF3X2RpbSB3OiVkIGhlaWdodDolZFxuIiwgIGNhbV9jYXAtPnJhd19kaW1bMF0ud2lkdGgsIGNhbV9jYXAtPnJhd19kaW1bMF0uaGVpZ2h0KTsKKyAgICBmb3IgKGkgPSAwO2kgPCBjYW1fY2FwLT5zdXBwb3J0ZWRfcmF3X2ZtdF9jbnQ7aSsrKSB7CisgICAgICAgIExPR0UoIiBzdXBwb3J0ZWRfcmF3X2ZtdHNbJXpkXT0lZFxuIiwKKyAgICAgICAgICAgIGksIChpbnQpY2FtX2NhcC0+c3VwcG9ydGVkX3Jhd19mbXRzW2ldKTsKKyAgICAgICAgaWYgKCgoQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV184QlBQX0dCUkcgPD0gY2FtX2NhcC0+c3VwcG9ydGVkX3Jhd19mbXRzW2ldKSAmJgorICAgICAgICAgICAgKENBTV9GT1JNQVRfQkFZRVJfTUlQSV9SQVdfMTJCUFBfQkdHUiA+PSBjYW1fY2FwLT5zdXBwb3J0ZWRfcmF3X2ZtdHNbaV0pKSB8fAorICAgICAgICAgICAgKGNhbV9jYXAtPnN1cHBvcnRlZF9yYXdfZm10c1tpXSA9PSBDQU1fRk9STUFUX01FVEFfUkFXXzhCSVQpIHx8CisgICAgICAgICAgICAoY2FtX2NhcC0+c3VwcG9ydGVkX3Jhd19mbXRzW2ldID09IENBTV9GT1JNQVRfSlBFR19SQVdfOEJJVCkgfHwKKyAgICAgICAgICAgIChjYW1fY2FwLT5zdXBwb3J0ZWRfcmF3X2ZtdHNbaV0gPT0gQ0FNX0ZPUk1BVF9CQVlFUl9NSVBJX1JBV18xNEJQUF9CR0dSKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm10ID0gY2FtX2NhcC0+c3VwcG9ydGVkX3Jhd19mbXRzW2ldOworICAgICAgICAgICAgTE9HRSgiIGZtdD0lZFxuIiwgIGZtdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoQ0FNX0ZPUk1BVF9NQVggPT0gZm10KSB7CisgICAgICAgIExPR0UoIiByZGkgZm9ybWF0IG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBhYmMubnVtX3N0cmVhbXMgPSAxOworICAgIGFiYy5wb3N0cHJvY2Vzc19tYXNrWzBdID0gMDsKKyAgICBhYmMuc3RyZWFtX3NpemVzWzBdLndpZHRoID0gY2FtX2NhcC0+cmF3X2RpbVswXS53aWR0aDsKKyAgICBhYmMuc3RyZWFtX3NpemVzWzBdLmhlaWdodCA9IGNhbV9jYXAtPnJhd19kaW1bMF0uaGVpZ2h0OworICAgIGFiYy50eXBlWzBdID0gQ0FNX1NUUkVBTV9UWVBFX1JBVzsKKyAgICBhYmMuYnVmZmVyX2luZm8ubWluX2J1ZmZlcnMgPSBudW1fYnVmczsKKyAgICBhYmMuYnVmZmVyX2luZm8ubWF4X2J1ZmZlcnMgPSBudW1fYnVmczsKKyAgICBhYmMuaXNfdHlwZVswXSA9IElTX1RZUEVfTk9ORTsKKworICAgIHJjID0gc2V0bWV0YWluZm9Db21tYW5kKHRlc3Rfb2JqLCAmYWJjKTsKKyAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgTE9HRSgiIG1ldGEgaW5mbyBjb21tYW5kIGZhaWxlZFxuIik7CisgICAgfQorCisgICAgc3RyZWFtID0gbW1fYXBwX2FkZF9zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwpOworICAgIGlmIChOVUxMID09IHN0cmVhbSkgeworICAgICAgICBMT0dFKCIgYWRkIHN0cmVhbSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLmdldF9idWZzID0gbW1fYXBwX3N0cmVhbV9pbml0YnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwucHV0X2J1ZnMgPSBtbV9hcHBfc3RyZWFtX2RlaW5pdGJ1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLmNsZWFuX2ludmFsaWRhdGVfYnVmID0KKyAgICAgIG1tX2FwcF9zdHJlYW1fY2xlYW5faW52YWxpZGF0ZV9idWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5pbnZhbGlkYXRlX2J1ZiA9IG1tX2FwcF9zdHJlYW1faW52YWxpZGF0ZV9idWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC51c2VyX2RhdGEgPSAodm9pZCAqKXN0cmVhbTsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9jYiA9IHN0cmVhbV9jYjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9jYl9zeW5jID0gTlVMTDsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnVzZXJkYXRhID0gdXNlcmRhdGE7CisgICAgc3RyZWFtLT5udW1fb2ZfYnVmcyA9IG51bV9idWZzOworCisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mbyA9IChjYW1fc3RyZWFtX2luZm9fdCAqKXN0cmVhbS0+c19pbmZvX2J1Zi5idWYuYnVmZmVyOworICAgIG1lbXNldChzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9pbmZvX3QpKTsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSA9IENBTV9TVFJFQU1fVFlQRV9SQVc7CisgICAgaWYgKG51bV9idXJzdCA9PSAwKSB7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0NPTlRJTlVPVVM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+c3RyZWFtaW5nX21vZGUgPSBDQU1fU1RSRUFNSU5HX01PREVfQlVSU1Q7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPm51bV9vZl9idXJzdCA9IG51bV9idXJzdDsKKyAgICB9CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+Zm10ID0gREVGQVVMVF9SQVdfRk9STUFUOworICAgIExPR0QoIiBSQVc6IHc6ICVkLCBoOiAlZCAiLAorICAgICAgIGNhbV9jYXAtPnJhd19kaW1bMF0ud2lkdGgsIGNhbV9jYXAtPnJhd19kaW1bMF0uaGVpZ2h0KTsKKworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS53aWR0aCA9IGNhbV9jYXAtPnJhd19kaW1bMF0ud2lkdGg7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+ZGltLmhlaWdodCA9IGNhbV9jYXAtPnJhd19kaW1bMF0uaGVpZ2h0OworICAgIHN0cmVhbS0+c19jb25maWcucGFkZGluZ19pbmZvID0gY2FtX2NhcC0+cGFkZGluZ19pbmZvOworCisgICAgcmMgPSBtbV9hcHBfY29uZmlnX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc3RyZWFtLCAmc3RyZWFtLT5zX2NvbmZpZyk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJjb25maWcgcmRpIHN0cmVhbSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGJ1Zl9wbGFuZXMgPSAmc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+YnVmX3BsYW5lczsKKyAgICByZGlfbGVuID0gYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5sZW47CisgICAgTE9HRCgiIHBsYW5lX2luZm8gJWR4JWQgbGVuOiVkIGZyYW1lX2xlbjolZFxuIiwKKyAgICAgICAgYnVmX3BsYW5lcy0+cGxhbmVfaW5mby5tcFswXS5zdHJpZGUsIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0uc2NhbmxpbmUsCisgICAgICAgIGJ1Zl9wbGFuZXMtPnBsYW5lX2luZm8ubXBbMF0ubGVuLCBidWZfcGxhbmVzLT5wbGFuZV9pbmZvLmZyYW1lX2xlbik7CisKKyAgICByZXR1cm4gc3RyZWFtOworfQorCittbV9jYW1lcmFfc3RyZWFtX3QgKiBtbV9hcHBfYWRkX3JkaV9zbmFwc2hvdF9zdHJlYW0obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfbm90aWZ5X3Qgc3RyZWFtX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9idWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYnVyc3QpCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc3RyZWFtID0gTlVMTDsKKyAgICBjYW1fY2FwYWJpbGl0eV90ICpjYW1fY2FwID0gKGNhbV9jYXBhYmlsaXR5X3QgKikodGVzdF9vYmotPmNhcF9idWYuYnVmLmJ1ZmZlcik7CisKKyAgICBzdHJlYW0gPSBtbV9hcHBfYWRkX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgaWYgKE5VTEwgPT0gc3RyZWFtKSB7CisgICAgICAgIExPR0UoIiBhZGQgc3RyZWFtIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuZ2V0X2J1ZnMgPSBtbV9hcHBfc3RyZWFtX2luaXRidWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5wdXRfYnVmcyA9IG1tX2FwcF9zdHJlYW1fZGVpbml0YnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuY2xlYW5faW52YWxpZGF0ZV9idWYgPQorICAgICAgbW1fYXBwX3N0cmVhbV9jbGVhbl9pbnZhbGlkYXRlX2J1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLmludmFsaWRhdGVfYnVmID0gbW1fYXBwX3N0cmVhbV9pbnZhbGlkYXRlX2J1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLnVzZXJfZGF0YSA9ICh2b2lkICopc3RyZWFtOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2NiID0gc3RyZWFtX2NiOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2NiX3N5bmMgPSBOVUxMOworICAgIHN0cmVhbS0+c19jb25maWcudXNlcmRhdGEgPSB1c2VyZGF0YTsKKyAgICBzdHJlYW0tPm51bV9vZl9idWZzID0gbnVtX2J1ZnM7CisKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvID0gKGNhbV9zdHJlYW1faW5mb190ICopc3RyZWFtLT5zX2luZm9fYnVmLmJ1Zi5idWZmZXI7CisgICAgbWVtc2V0KHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8sIDAsIHNpemVvZihjYW1fc3RyZWFtX2luZm9fdCkpOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlID0gQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UOworICAgIGlmIChudW1fYnVyc3QgPT0gMCkgeworICAgICAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1pbmdfbW9kZSA9IENBTV9TVFJFQU1JTkdfTU9ERV9DT05USU5VT1VTOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0JVUlNUOworICAgICAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5udW1fb2ZfYnVyc3QgPSBudW1fYnVyc3Q7CisgICAgfQorICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmZtdCA9IERFRkFVTFRfU05BUFNIT1RfRk9STUFUOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS53aWR0aCA9IERFRkFVTFRfU05BUFNIT1RfV0lEVEg7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+ZGltLmhlaWdodCA9IERFRkFVTFRfU05BUFNIT1RfSEVJR0hUOworICAgIHN0cmVhbS0+c19jb25maWcucGFkZGluZ19pbmZvID0gY2FtX2NhcC0+cGFkZGluZ19pbmZvOworCisgICAgcmMgPSBtbV9hcHBfY29uZmlnX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc3RyZWFtLCAmc3RyZWFtLT5zX2NvbmZpZyk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJjb25maWcgcmRpIHN0cmVhbSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBzdHJlYW07Cit9CisKK21tX2NhbWVyYV9jaGFubmVsX3QgKiBtbV9hcHBfYWRkX3JkaV9jaGFubmVsKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwgdWludDhfdCBudW1fYnVyc3QpCit7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzdHJlYW0gPSBOVUxMOworCisgICAgY2hhbm5lbCA9IG1tX2FwcF9hZGRfY2hhbm5lbCh0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NIQU5ORUxfVFlQRV9SREksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGlmIChOVUxMID09IGNoYW5uZWwpIHsKKyAgICAgICAgTE9HRSgiIGFkZCBjaGFubmVsIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzdHJlYW0gPSBtbV9hcHBfYWRkX3JkaV9zdHJlYW0odGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fYXBwX3JkaV9ub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkRJX0JVRl9OVU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYnVyc3QpOworICAgIGlmIChOVUxMID09IHN0cmVhbSkgeworICAgICAgICBMT0dFKCIgYWRkIHN0cmVhbSBmYWlsZWRcbiIpOworICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBMT0dEKCIgY2hhbm5lbD0lZCBzdHJlYW09JWRcbiIsICBjaGFubmVsLT5jaF9pZCwgc3RyZWFtLT5zX2lkKTsKKyAgICByZXR1cm4gY2hhbm5lbDsKK30KKworaW50IG1tX2FwcF9zdG9wX2FuZF9kZWxfcmRpX2NoYW5uZWwobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnN0cmVhbSA9IE5VTEw7CisgICAgdWludDhfdCBpOworICAgIGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QgYWJjIDsKKyAgICBtZW1zZXQgKCZhYmMgLCAwLCBzaXplb2YgKGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QpKTsKKworICAgIHJjID0gbW1fYXBwX3N0b3BfY2hhbm5lbCh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJTdG9wIFJESSBmYWlsZWQgcmM9JWRcbiIsICByYyk7CisgICAgfQorCisgICAgaWYgKGNoYW5uZWwtPm51bV9zdHJlYW1zIDw9IE1BWF9TVFJFQU1fTlVNX0lOX0JVTkRMRSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgc3RyZWFtID0gJmNoYW5uZWwtPnN0cmVhbXNbaV07CisgICAgICAgICAgICByYyA9IG1tX2FwcF9kZWxfc3RyZWFtKHRlc3Rfb2JqLCBjaGFubmVsLCBzdHJlYW0pOworICAgICAgICAgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICAgICAgICAgIExPR0UoImRlbCBzdHJlYW0oJWQpIGZhaWxlZCByYz0lZFxuIiwgIGksIHJjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIiBudW1fc3RyZWFtcyA9ICVkLiBTaG91bGQgbm90IGJlIG1vcmUgdGhhbiAlZFxuIiwKKyAgICAgICAgICAgICBjaGFubmVsLT5udW1fc3RyZWFtcywgTUFYX1NUUkVBTV9OVU1fSU5fQlVORExFKTsKKyAgICB9CisgICAgcmMgPSBzZXRtZXRhaW5mb0NvbW1hbmQodGVzdF9vYmosICZhYmMpOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICBMT0dFKCIgbWV0YSBpbmZvIGNvbW1hbmQgZmFpbGVkXG4iKTsKKyAgICB9CisgICAgcmMgPSBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgiZGVsZXRlIGNoYW5uZWwgZmFpbGVkIHJjPSVkXG4iLCAgcmMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF9zdGFydF9yZGkobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLCB1aW50OF90IG51bV9idXJzdCkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCA9IE5VTEw7CisKKyAgICBjaGFubmVsID0gbW1fYXBwX2FkZF9yZGlfY2hhbm5lbCh0ZXN0X29iaiwgbnVtX2J1cnN0KTsKKyAgICBpZiAoTlVMTCA9PSBjaGFubmVsKSB7CisgICAgICAgIExPR0UoIiBhZGQgY2hhbm5lbCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC1NTV9DQU1FUkFfRV9HRU5FUkFMOworICAgIH0KKworICAgIHJjID0gbW1fYXBwX3N0YXJ0X2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgic3RhcnQgcmRpIGZhaWxlZCByYz0lZFxuIiwgIHJjKTsKKyAgICAgICAgbW1fYXBwX2RlbF9jaGFubmVsKHRlc3Rfb2JqLCBjaGFubmVsKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF9zdG9wX3JkaShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworCisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCA9CisgICAgICAgIG1tX2FwcF9nZXRfY2hhbm5lbF9ieV90eXBlKHRlc3Rfb2JqLCBNTV9DSEFOTkVMX1RZUEVfUkRJKTsKKworICAgIHJjID0gbW1fYXBwX3N0b3BfYW5kX2RlbF9yZGlfY2hhbm5lbCh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJTdG9wIFJESSBmYWlsZWQgcmM9JWRcbiIsICByYyk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfcmVwcm9jZXNzLmMgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfcmVwcm9jZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkNGM1ZAotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9zcmMvbW1fcWNhbWVyYV9yZXByb2Nlc3MuYwpAQCAtMCwwICsxLDM0OSBAQAorLyoKK0NvcHlyaWdodCAoYykgMjAxMi0yMDE0LCAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKK0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKK0JFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCitTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKK0JVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKK09SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KK0lGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX3FjYW1lcmFfYXBwLmgiCisjaW5jbHVkZSAibW1fcWNhbWVyYV9kYmcuaCIKKworc3RhdGljIHZvaWQgbW1fYXBwX3JlcHJvY2Vzc19ub3RpZnlfY2IobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpidWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqZnJhbWUgPSBidWZzLT5idWZzWzBdOworICAgIG1tX2NhbWVyYV90ZXN0X29ial90ICpwbWUgPSAobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKil1c2VyX2RhdGE7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICptX3N0cmVhbSA9IE5VTEw7CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqbV9mcmFtZSA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpzcmNfZnJhbWU7CisgICAgaW50IGkgPSAwOworICAgIGludCByYyA9IDA7CisKKyAgICBMT0dFKCIgQkVHSU4gLSBsZW5ndGg9JXp1LCBmcmFtZSBpZHggPSAlZFxuIiwKKyAgICAgICAgICBmcmFtZS0+ZnJhbWVfbGVuLCBmcmFtZS0+ZnJhbWVfaWR4KTsKKworICAgIC8qIGZpbmQgY2hhbm5lbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNTV9DSEFOTkVMX1RZUEVfTUFYOyBpKyspIHsKKyAgICAgICAgaWYgKHBtZS0+Y2hhbm5lbHNbaV0uY2hfaWQgPT0gYnVmcy0+Y2hfaWQpIHsKKyAgICAgICAgICAgIGNoYW5uZWwgPSAmcG1lLT5jaGFubmVsc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChOVUxMID09IGNoYW5uZWwpIHsKKyAgICAgICAgTE9HRSgiIFdyb25nIGNoYW5uZWwgaWQgKCVkKSIsICBidWZzLT5jaF9pZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBXZSBoYXZlIG9ubHkgb25lIHN0cmVhbSBhbmQgYnVmZmVyCisgICAgLy8gaW4gdGhlIHJlcHJvY2VzcyBjaGFubmVsLgorICAgIG1fc3RyZWFtID0gJmNoYW5uZWwtPnN0cmVhbXNbMF07CisgICAgbV9mcmFtZSA9IGJ1ZnMtPmJ1ZnNbMF07CisKKyAgICBpZiAoIHBtZS0+ZW5jb2RlSnBlZyApIHsKKyAgICAgICAgcG1lLT5qcGVnX2J1Zi5idWYuYnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MobV9mcmFtZS0+ZnJhbWVfbGVuKTsKKyAgICAgICAgaWYgKCBOVUxMID09IHBtZS0+anBlZ19idWYuYnVmLmJ1ZmZlciApIHsKKyAgICAgICAgICAgIExPR0UoIiBlcnJvciBhbGxvY2F0aW5nIGpwZWcgb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgcG1lLT5qcGVnX2J1Zi5idWYuZnJhbWVfbGVuID0gbV9mcmFtZS0+ZnJhbWVfbGVuOworICAgICAgICAvKiBjcmVhdGUgYSBuZXcganBlZyBlbmNvZGluZyBzZXNzaW9uICovCisgICAgICAgIHJjID0gY3JlYXRlRW5jb2RpbmdTZXNzaW9uKHBtZSwgbV9zdHJlYW0sIG1fZnJhbWUpOworICAgICAgICBpZiAoMCAhPSByYykgeworICAgICAgICAgICAgTE9HRSgiIGVycm9yIGNyZWF0aW5nIGpwZWcgc2Vzc2lvbiIpOworICAgICAgICAgICAgZnJlZShwbWUtPmpwZWdfYnVmLmJ1Zi5idWZmZXIpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisKKyAgICAgICAgLyogc3RhcnQganBlZyBlbmNvZGluZyBqb2IgKi8KKyAgICAgICAgTE9HRSgiRW5jb2RpbmcgcmVwcm9jZXNzZWQgZnJhbWUhISIpOworICAgICAgICByYyA9IGVuY29kZURhdGEocG1lLCBidWZzLCBtX3N0cmVhbSk7CisgICAgICAgIHBtZS0+ZW5jb2RlSnBlZyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSBwbWUtPmNhbS0+b3BzLT5xYnVmKGJ1ZnMtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzLT5jaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lKSkgeworICAgICAgICAgICAgTE9HRSgiIEZhaWxlZCBpbiBSZXByb2Nlc3MgUWJ1ZlxuIik7CisgICAgICAgIH0KKyAgICAgICAgbW1fYXBwX2NhY2hlX29wcygobW1fY2FtZXJhX2FwcF9tZW1pbmZvX3QgKilmcmFtZS0+bWVtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgSU9OX0lPQ19JTlZfQ0FDSEVTKTsKKyAgICB9CisKK2V4aXQ6CisKKy8vIFJlbGVhc2Ugc291cmNlIGZyYW1lCisgICAgc3JjX2ZyYW1lID0gKCBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKiApIG1tX3FjYW1lcmFfcXVldWVfZGVxdWV1ZSgmcG1lLT5wcF9mcmFtZXMsIDEpOworICAgIGlmICggTlVMTCAhPSBzcmNfZnJhbWUgKSB7CisgICAgICAgIG1tX2FwcF9yZWxlYXNlX3BwaW5wdXQoKHZvaWQgKikgc3JjX2ZyYW1lLCAodm9pZCAqKSBwbWUpOworICAgIH0KKworICAgIExPR0UoIiBFTkRcbiIpOworfQorCittbV9jYW1lcmFfc3RyZWFtX3QgKiBtbV9hcHBfYWRkX3JlcHJvY2Vzc19zdHJlYW1fZnJvbV9zb3VyY2UobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2J1Zl9ub3RpZnlfdCBzdHJlYW1fY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtX3BwX2ZlYXR1cmVfY29uZmlnX3QgcHBfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2J1ZnMpCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc3RyZWFtID0gTlVMTDsKKyAgICBjYW1fY2FwYWJpbGl0eV90ICpjYW1fY2FwID0gTlVMTDsKKyAgICBjYW1fc3RyZWFtX2luZm9fdCAqc291cmNlX3N0cmVhbV9pbmZvOworCisgICAgaWYgKCAoIE5VTEwgPT0gdGVzdF9vYmogKSB8fAorICAgICAgICAgKCBOVUxMID09IGNoYW5uZWwgKSB8fAorICAgICAgICAgKCBOVUxMID09IHNvdXJjZSApICkgeworICAgICAgICBMT0dFKCIgSW52YWxpZCBpbnB1dFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNhbV9jYXAgPSAoY2FtX2NhcGFiaWxpdHlfdCAqKSh0ZXN0X29iai0+Y2FwX2J1Zi5idWYuYnVmZmVyKTsKKworICAgIHN0cmVhbSA9IG1tX2FwcF9hZGRfc3RyZWFtKHRlc3Rfb2JqLCBjaGFubmVsKTsKKyAgICBpZiAoTlVMTCA9PSBzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiIGFkZCBzdHJlYW0gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5nZXRfYnVmcyA9IG1tX2FwcF9zdHJlYW1faW5pdGJ1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLnB1dF9idWZzID0gbW1fYXBwX3N0cmVhbV9kZWluaXRidWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5jbGVhbl9pbnZhbGlkYXRlX2J1ZiA9CisgICAgICBtbV9hcHBfc3RyZWFtX2NsZWFuX2ludmFsaWRhdGVfYnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuaW52YWxpZGF0ZV9idWYgPSBtbV9hcHBfc3RyZWFtX2ludmFsaWRhdGVfYnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwudXNlcl9kYXRhID0gKHZvaWQgKilzdHJlYW07CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1fY2IgPSBzdHJlYW1fY2I7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1fY2Jfc3luYyA9IE5VTEw7CisgICAgc3RyZWFtLT5zX2NvbmZpZy51c2VyZGF0YSA9IHVzZXJkYXRhOworICAgIHN0cmVhbS0+bnVtX29mX2J1ZnMgPSBudW1fYnVmczsKKworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8gPSAoY2FtX3N0cmVhbV9pbmZvX3QgKilzdHJlYW0tPnNfaW5mb19idWYuYnVmLmJ1ZmZlcjsKKyAgICBzb3VyY2Vfc3RyZWFtX2luZm8gPSAoY2FtX3N0cmVhbV9pbmZvX3QgKikgc291cmNlLT5zX2luZm9fYnVmLmJ1Zi5idWZmZXI7CisgICAgbWVtc2V0KHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8sIDAsIHNpemVvZihjYW1fc3RyZWFtX2luZm9fdCkpOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlID0gQ0FNX1NUUkVBTV9UWVBFX09GRkxJTkVfUFJPQzsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1pbmdfbW9kZSA9IENBTV9TVFJFQU1JTkdfTU9ERV9DT05USU5VT1VTOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmZtdCA9IHNvdXJjZV9zdHJlYW1faW5mby0+Zm10OworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbSA9IHNvdXJjZV9zdHJlYW1faW5mby0+ZGltOworICAgIHN0cmVhbS0+c19jb25maWcucGFkZGluZ19pbmZvID0gY2FtX2NhcC0+cGFkZGluZ19pbmZvOworCisKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5yZXByb2Nlc3NfY29uZmlnLnBwX3R5cGUgPSBDQU1fT05MSU5FX1JFUFJPQ0VTU19UWVBFOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnJlcHJvY2Vzc19jb25maWcub25saW5lLmlucHV0X3N0cmVhbV9pZCA9IHNvdXJjZS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV9zdnJfaWQ7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+cmVwcm9jZXNzX2NvbmZpZy5vbmxpbmUuaW5wdXRfc3RyZWFtX3R5cGUgPSBzb3VyY2UtPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZTsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5yZXByb2Nlc3NfY29uZmlnLnBwX2ZlYXR1cmVfY29uZmlnID0gcHBfY29uZmlnOworCisgICAgcmMgPSBtbV9hcHBfY29uZmlnX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc3RyZWFtLCAmc3RyZWFtLT5zX2NvbmZpZyk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJjb25maWcgcHJldmlldyBzdHJlYW0gZXJyPSVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtOworfQorCittbV9jYW1lcmFfY2hhbm5lbF90ICogbW1fYXBwX2FkZF9yZXByb2Nlc3NfY2hhbm5lbChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnNvdXJjZV9zdHJlYW0pCit7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzdHJlYW0gPSBOVUxMOworCisgICAgaWYgKCBOVUxMID09IHNvdXJjZV9zdHJlYW0gKSB7CisgICAgICAgIExPR0UoIiBhZGQgcmVwcm9jZXNzIHN0cmVhbSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjaGFubmVsID0gbW1fYXBwX2FkZF9jaGFubmVsKHRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9UWVBFX1JFUFJPQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgaWYgKE5VTEwgPT0gY2hhbm5lbCkgeworICAgICAgICBMT0dFKCIgYWRkIGNoYW5uZWwgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIHBwIGZlYXR1cmUgY29uZmlnCisgICAgY2FtX3BwX2ZlYXR1cmVfY29uZmlnX3QgcHBfY29uZmlnOworICAgIG1lbXNldCgmcHBfY29uZmlnLCAwLCBzaXplb2YoY2FtX3BwX2ZlYXR1cmVfY29uZmlnX3QpKTsKKworICAgIGNhbV9jYXBhYmlsaXR5X3QgKmNhcHMgPSAoIGNhbV9jYXBhYmlsaXR5X3QgKiApICggdGVzdF9vYmotPmNhcF9idWYuYnVmLmJ1ZmZlciApOworICAgIGlmIChjYXBzLT5xY29tX3N1cHBvcnRlZF9mZWF0dXJlX21hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX1NIQVJQTkVTUykgeworICAgICAgICBwcF9jb25maWcuZmVhdHVyZV9tYXNrIHw9IENBTV9RQ09NX0ZFQVRVUkVfU0hBUlBORVNTOworICAgICAgICBwcF9jb25maWcuc2hhcnBuZXNzID0gdGVzdF9vYmotPnJlcHJvY19zaGFycG5lc3M7CisgICAgfQorCisgICAgaWYgKHRlc3Rfb2JqLT5yZXByb2Nfd25yLmRlbm9pc2VfZW5hYmxlKSB7CisgICAgICAgIHBwX2NvbmZpZy5mZWF0dXJlX21hc2sgfD0gQ0FNX1FDT01fRkVBVFVSRV9ERU5PSVNFMkQ7CisgICAgICAgIHBwX2NvbmZpZy5kZW5vaXNlMmQgPSB0ZXN0X29iai0+cmVwcm9jX3ducjsKKyAgICB9CisKKyAgICBpZiAodGVzdF9vYmotPmVuYWJsZV9DQUMpIHsKKyAgICAgICAgcHBfY29uZmlnLmZlYXR1cmVfbWFzayB8PSBDQU1fUUNPTV9GRUFUVVJFX0NBQzsKKyAgICB9CisKKyAgICB1aW50OF90IG1pblN0cmVhbUJ1Zk51bSA9IHNvdXJjZV9zdHJlYW0tPm51bV9vZl9idWZzOworICAgIHN0cmVhbSA9IG1tX2FwcF9hZGRfcmVwcm9jZXNzX3N0cmVhbV9mcm9tX3NvdXJjZSh0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fYXBwX3JlcHJvY2Vzc19ub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluU3RyZWFtQnVmTnVtKTsKKyAgICBpZiAoTlVMTCA9PSBzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiIGFkZCByZXByb2Nlc3Mgc3RyZWFtIGZhaWxlZFxuIik7CisgICAgICAgIG1tX2FwcF9kZWxfY2hhbm5lbCh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB0ZXN0X29iai0+cmVwcm9jX3N0cmVhbSA9IHN0cmVhbTsKKworICAgIHJldHVybiBjaGFubmVsOworfQorCitpbnQgbW1fYXBwX3N0YXJ0X3JlcHJvY2VzcyhtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKnJfY2ggPSBOVUxMOworCisgICAgbW1fY2FtZXJhX3F1ZXVlX2luaXQoJnRlc3Rfb2JqLT5wcF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW1fYXBwX3JlbGVhc2VfcHBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoIHZvaWQgKiApIHRlc3Rfb2JqKTsKKworICAgIHJfY2ggPSBtbV9hcHBfZ2V0X2NoYW5uZWxfYnlfdHlwZSh0ZXN0X29iaiwgTU1fQ0hBTk5FTF9UWVBFX1JFUFJPQ0VTUyk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCIgTm8gaW5pdGlhbGl6ZWQgcmVwcm9jZXNzIGNoYW5uZWwgZCByYz0lZFxuIiwgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmMgPSBtbV9hcHBfc3RhcnRfY2hhbm5lbCh0ZXN0X29iaiwgcl9jaCk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJzdGFydCByZXByb2Nlc3MgZmFpbGVkIHJjPSVkXG4iLCAgcmMpOworICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIHJfY2gpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fYXBwX3N0b3BfcmVwcm9jZXNzKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaikKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqcl9jaCA9IE5VTEw7CisKKyAgICByX2NoID0gbW1fYXBwX2dldF9jaGFubmVsX2J5X3R5cGUodGVzdF9vYmosIE1NX0NIQU5ORUxfVFlQRV9SRVBST0NFU1MpOworICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgiIE5vIGluaXRpYWxpemVkIHJlcHJvY2VzcyBjaGFubmVsIGQgcmM9JWRcbiIsIHJjKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJjID0gbW1fYXBwX3N0b3BfYW5kX2RlbF9jaGFubmVsKHRlc3Rfb2JqLCByX2NoKTsKKyAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHJjKSB7CisgICAgICAgIExPR0UoIlN0b3AgUHJldmlldyBmYWlsZWQgcmM9JWRcbiIsICByYyk7CisgICAgfQorCisgICAgbW1fcWNhbWVyYV9xdWV1ZV9yZWxlYXNlKCZ0ZXN0X29iai0+cHBfZnJhbWVzKTsKKyAgICB0ZXN0X29iai0+cmVwcm9jX3N0cmVhbSA9IE5VTEw7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfZG9fcmVwcm9jZXNzKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWV0YV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKnN1cGVyX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc3JjX21ldGEpCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKnJfY2ggPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqc3JjX2J1ZiA9IE5VTEw7CisKKyAgICBpZiAoICggTlVMTCA9PSB0ZXN0X29iaiApIHx8CisgICAgICAgICAoIE5VTEwgPT0gZnJhbWUgKSB8fAorICAgICAgICAgKCBOVUxMID09IHN1cGVyX2J1ZiApKSB7CisgICAgICAgIExPR0UoIiBJbnZhbGlkIGlucHV0IHJjPSVkXG4iLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBpZiAoIE5VTEwgPT0gdGVzdF9vYmotPnJlcHJvY19zdHJlYW0gKSB7CisgICAgICAgIExPR0UoIiBObyByZXByb2Nlc3Mgc3RyZWFtIHJjPSVkXG4iLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByX2NoID0gbW1fYXBwX2dldF9jaGFubmVsX2J5X3R5cGUodGVzdF9vYmosIE1NX0NIQU5ORUxfVFlQRV9SRVBST0NFU1MpOworICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgiIE5vIHJlcHJvY2VzcyBjaGFubmVsIHJjPSVkXG4iLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBzcmNfYnVmID0gKCBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKiApIG1hbGxvYyhzaXplb2YobW1fY2FtZXJhX3N1cGVyX2J1Zl90KSk7CisgICAgaWYgKCBOVUxMID09IHNyY19idWYgKSB7CisgICAgICAgIExPR0UoIiBObyByZXNvdXJjZXMgZm9yIHNyYyBmcmFtZSByYz0lZFxuIiwgcmMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1lbWNweShzcmNfYnVmLCBzdXBlcl9idWYsIHNpemVvZihtbV9jYW1lcmFfc3VwZXJfYnVmX3QpKTsKKyAgICBtbV9xY2FtZXJhX3F1ZXVlX2VucXVldWUoJnRlc3Rfb2JqLT5wcF9mcmFtZXMsIHNyY19idWYpOworCisgICAgY2FtX3N0cmVhbV9wYXJtX2J1ZmZlcl90IHBhcmFtOworICAgIG1lbXNldCgmcGFyYW0sIDAsIHNpemVvZihjYW1fc3RyZWFtX3Bhcm1fYnVmZmVyX3QpKTsKKyAgICBwYXJhbS50eXBlID0gQ0FNX1NUUkVBTV9QQVJBTV9UWVBFX0RPX1JFUFJPQ0VTUzsKKyAgICBwYXJhbS5yZXByb2Nlc3MuYnVmX2luZGV4ID0gZnJhbWUtPmJ1Zl9pZHg7CisgICAgcGFyYW0ucmVwcm9jZXNzLmZyYW1lX2lkeCA9IGZyYW1lLT5mcmFtZV9pZHg7CisgICAgaWYgKHNyY19tZXRhICE9IE5VTEwpIHsKKyAgICAgICAgcGFyYW0ucmVwcm9jZXNzLm1ldGFfcHJlc2VudCA9IDE7CisgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5tZXRhX3N0cmVhbV9oYW5kbGUgPSBzcmNfbWV0YS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV9zdnJfaWQ7CisgICAgICAgIHBhcmFtLnJlcHJvY2Vzcy5tZXRhX2J1Zl9pbmRleCA9IG1ldGFfaWR4OworICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIiBObyBtZXRhZGF0YSBzb3VyY2Ugc3RyZWFtIHJjPSVkXG4iLCByYyk7CisgICAgfQorCisgICAgdGVzdF9vYmotPnJlcHJvY19zdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5wYXJtX2J1ZiA9IHBhcmFtOworICAgIHJjID0gdGVzdF9vYmotPmNhbS0+b3BzLT5zZXRfc3RyZWFtX3Bhcm1zKHRlc3Rfb2JqLT5jYW0tPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9jaC0+Y2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9vYmotPnJlcHJvY19zdHJlYW0tPnNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlc3Rfb2JqLT5yZXByb2Nfc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+cGFybV9idWYpOworCisgICAgcmV0dXJuIHJjOworfQorCit2b2lkIG1tX2FwcF9yZWxlYXNlX3BwaW5wdXQodm9pZCAqZGF0YSwgdm9pZCAqdXNlcl9kYXRhKQoreworICAgIHVpbnQzMl90IGkgPSAwOworICAgIG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqcmVjdmRfZnJhbWUgID0gKCBtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKiApIGRhdGE7CisgICAgbW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnBtZSA9IChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqKXVzZXJfZGF0YTsKKworICAgIGZvciAoIGkgPSAwIDsgaSA8IHJlY3ZkX2ZyYW1lLT5udW1fYnVmcyA7IGkrKykgeworICAgICAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHBtZS0+Y2FtLT5vcHMtPnFidWYocG1lLT5jYW0tPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN2ZF9mcmFtZS0+Y2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN2ZF9mcmFtZS0+YnVmc1tpXSkpIHsKKyAgICAgICAgICAgIExPR0UoIiBGYWlsZWQgaW4gUWJ1ZlxuIik7CisgICAgICAgIH0KKyAgICAgICAgbW1fYXBwX2NhY2hlX29wcygobW1fY2FtZXJhX2FwcF9tZW1pbmZvX3QgKikgcmVjdmRfZnJhbWUtPmJ1ZnNbaV0tPm1lbV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIElPTl9JT0NfSU5WX0NBQ0hFUyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfc25hcHNob3QuYyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9zcmMvbW1fcWNhbWVyYV9zbmFwc2hvdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YzA5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfc25hcHNob3QuYwpAQCAtMCwwICsxLDcwNyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAibW1fcWNhbWVyYV9hcHAuaCIKKyNpbmNsdWRlICJtbV9xY2FtZXJhX2RiZy5oIgorCisvKiBUaGlzIGNhbGxiYWNrIGlzIHJlY2VpdmVkIG9uY2UgdGhlIGNvbXBsZXRlIEpQRUcgZW5jb2RpbmcgaXMgZG9uZSAqLworc3RhdGljIHZvaWQganBlZ19lbmNvZGVfY2IoanBlZ19qb2Jfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2xpZW50X2hkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGpvYklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fanBlZ19vdXRwdXRfdCAqcF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSkKK3sKKyAgICB1aW50MzJfdCBpID0gMDsKKyAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCAqcG1lID0gTlVMTDsKKyAgICBMT0dEKCIgQkVHSU5cbiIpOworCisgICAgcG1lID0gKG1tX2NhbWVyYV90ZXN0X29ial90ICopdXNlckRhdGE7CisgICAgaWYgKHBtZS0+anBlZ19oZGwgIT0gY2xpZW50X2hkbCB8fAorICAgICAgICBqb2JJZCAhPSBwbWUtPmN1cnJlbnRfam9iX2lkIHx8CisgICAgICAgICFwbWUtPmN1cnJlbnRfam9iX2ZyYW1lcykgeworICAgICAgICBMT0dFKCIgTlVMTCBjdXJyZW50IGpvYiBmcmFtZXMgb3Igbm90IG1hdGNoaW5nIGpvYiBJRCAoJWQsICVkKSIsCisgICAgICAgICAgICAgICAgICAgIGpvYklkLCBwbWUtPmN1cnJlbnRfam9iX2lkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGR1bXAganBlZyBpbWcgKi8KKyAgICBMT0dFKCIgam9iICVkLCBzdGF0dXM9JWQiLCAgam9iSWQsIHN0YXR1cyk7CisgICAgaWYgKHN0YXR1cyA9PSBKUEVHX0pPQl9TVEFUVVNfRE9ORSAmJiBwX2J1ZiAhPSBOVUxMKSB7CisgICAgICAgIG1tX2FwcF9kdW1wX2pwZWdfZnJhbWUocF9idWYtPmJ1Zl92YWRkciwgcF9idWYtPmJ1Zl9maWxsZWRfbGVuLCAianBlZyIsICJqcGciLCBqb2JJZCk7CisgICAgfQorCisgICAgLyogYnVmIGRvbmUgY3VycmVudCBlbmNvZGluZyBmcmFtZXMgKi8KKyAgICBwbWUtPmN1cnJlbnRfam9iX2lkID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcG1lLT5jdXJyZW50X2pvYl9mcmFtZXMtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSBwbWUtPmNhbS0+b3BzLT5xYnVmKHBtZS0+Y3VycmVudF9qb2JfZnJhbWVzLT5jYW1lcmFfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5jdXJyZW50X2pvYl9mcmFtZXMtPmNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1lLT5jdXJyZW50X2pvYl9mcmFtZXMtPmJ1ZnNbaV0pKSB7CisgICAgICAgICAgICBMT0dFKCIgRmFpbGVkIGluIFFidWZcbiIpOworICAgICAgICB9CisgICAgICAgIG1tX2FwcF9jYWNoZV9vcHMoKG1tX2NhbWVyYV9hcHBfbWVtaW5mb190ICopIHBtZS0+Y3VycmVudF9qb2JfZnJhbWVzLT5idWZzW2ldLT5tZW1faW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBJT05fSU9DX0lOVl9DQUNIRVMpOworICAgIH0KKworICAgIGZyZWUocG1lLT5qcGVnX2J1Zi5idWYuYnVmZmVyKTsKKyAgICBmcmVlKHBtZS0+Y3VycmVudF9qb2JfZnJhbWVzKTsKKyAgICBwbWUtPmN1cnJlbnRfam9iX2ZyYW1lcyA9IE5VTEw7CisKKyAgICAvKiBzaWduYWwgc25hcHNob3QgaXMgZG9uZSAqLworICAgIG1tX2NhbWVyYV9hcHBfZG9uZSgpOworfQorCitpbnQgZW5jb2RlRGF0YShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosIG1tX2NhbWVyYV9zdXBlcl9idWZfdCogcmVjdmRfZnJhbWUsCisgICAgICAgICAgICAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKm1fc3RyZWFtKQoreworCisgICAgaW50IHJjID0gLU1NX0NBTUVSQV9FX0dFTkVSQUw7CisgICAgbW1fanBlZ19qb2JfdCBqb2I7CisKKyAgICAvKiByZW1lbWJlciBjdXJyZW50IGZyYW1lcyBiZWluZyBlbmNvZGVkICovCisgICAgdGVzdF9vYmotPmN1cnJlbnRfam9iX2ZyYW1lcyA9CisgICAgICAgIChtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKiltYWxsb2Moc2l6ZW9mKG1tX2NhbWVyYV9zdXBlcl9idWZfdCkpOworICAgIGlmICghdGVzdF9vYmotPmN1cnJlbnRfam9iX2ZyYW1lcykgeworICAgICAgICBMT0dFKCIgTm8gbWVtb3J5IGZvciBjdXJyZW50X2pvYl9mcmFtZXMiKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICAqKHRlc3Rfb2JqLT5jdXJyZW50X2pvYl9mcmFtZXMpID0gKnJlY3ZkX2ZyYW1lOworCisgICAgbWVtc2V0KCZqb2IsIDAsIHNpemVvZihqb2IpKTsKKyAgICBqb2Iuam9iX3R5cGUgPSBKUEVHX0pPQl9UWVBFX0VOQ09ERTsKKyAgICBqb2IuZW5jb2RlX2pvYi5zZXNzaW9uX2lkID0gdGVzdF9vYmotPmN1cnJlbnRfanBlZ19zZXNzX2lkOworCisgICAgLy8gVE9ETzogUm90YXRpb24gc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8KKyAgICAvLyAgICAgICBzZW5zb3ImZGV2aWNlIG9yaWVudGF0aW9uCisgICAgam9iLmVuY29kZV9qb2Iucm90YXRpb24gPSAwOworCisgICAgLyogZmlsbCBpbiBtYWluIHNyYyBpbWcgZW5jb2RlIHBhcmFtICovCisgICAgam9iLmVuY29kZV9qb2IubWFpbl9kaW0uc3JjX2RpbSA9IG1fc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+ZGltOworICAgIGpvYi5lbmNvZGVfam9iLm1haW5fZGltLmRzdF9kaW0gPSBtX3N0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbTsKKyAgICBqb2IuZW5jb2RlX2pvYi5zcmNfaW5kZXggPSAwOworCisgICAgam9iLmVuY29kZV9qb2IudGh1bWJfZGltLnNyY19kaW0gPSBtX3N0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbTsKKyAgICBqb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uZHN0X2RpbS53aWR0aCA9IERFRkFVTFRfUFJFVklFV19XSURUSDsKKyAgICBqb2IuZW5jb2RlX2pvYi50aHVtYl9kaW0uZHN0X2RpbS5oZWlnaHQgPSBERUZBVUxUX1BSRVZJRVdfSEVJR0hUOworCisgICAgLyogZmlsbCBpbiBzaW5rIGltZyBwYXJhbSAqLworICAgIGpvYi5lbmNvZGVfam9iLmRzdF9pbmRleCA9IDA7CisKKyAgICBpZiAodGVzdF9vYmotPm1ldGFkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgam9iLmVuY29kZV9qb2IucF9tZXRhZGF0YSA9IHRlc3Rfb2JqLT5tZXRhZGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCIgTWV0YWRhdGEgbnVsbCwgbm90IHNldCBmb3IganBlZyBlbmNvZGluZyIpOworICAgIH0KKworICAgIHJjID0gdGVzdF9vYmotPmpwZWdfb3BzLnN0YXJ0X2pvYigmam9iLCAmdGVzdF9vYmotPmN1cnJlbnRfam9iX2lkKTsKKyAgICBpZiAoIDAgIT0gcmMgKSB7CisgICAgICAgIGZyZWUodGVzdF9vYmotPmN1cnJlbnRfam9iX2ZyYW1lcyk7CisgICAgICAgIHRlc3Rfb2JqLT5jdXJyZW50X2pvYl9mcmFtZXMgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworaW50IGNyZWF0ZUVuY29kaW5nU2Vzc2lvbihtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqbV9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1fZnJhbWUpCit7CisgICAgbW1fanBlZ19lbmNvZGVfcGFyYW1zX3QgZW5jb2RlX3BhcmFtOworCisgICAgbWVtc2V0KCZlbmNvZGVfcGFyYW0sIDAsIHNpemVvZihtbV9qcGVnX2VuY29kZV9wYXJhbXNfdCkpOworICAgIGVuY29kZV9wYXJhbS5qcGVnX2NiID0ganBlZ19lbmNvZGVfY2I7CisgICAgZW5jb2RlX3BhcmFtLnVzZXJkYXRhID0gKHZvaWQqKXRlc3Rfb2JqOworICAgIGVuY29kZV9wYXJhbS5lbmNvZGVfdGh1bWJuYWlsID0gMDsKKyAgICBlbmNvZGVfcGFyYW0ucXVhbGl0eSA9IDg1OworICAgIGVuY29kZV9wYXJhbS5jb2xvcl9mb3JtYXQgPSBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ1JDQkxQX0gyVjI7CisgICAgZW5jb2RlX3BhcmFtLnRodW1iX2NvbG9yX2Zvcm1hdCA9IE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDUkNCTFBfSDJWMjsKKworICAgIC8qIGZpbGwgaW4gbWFpbiBzcmMgaW1nIGVuY29kZSBwYXJhbSAqLworICAgIGVuY29kZV9wYXJhbS5udW1fc3JjX2J1ZnMgPSAxOworICAgIGVuY29kZV9wYXJhbS5zcmNfbWFpbl9idWZbMF0uaW5kZXggPSAwOworICAgIGVuY29kZV9wYXJhbS5zcmNfbWFpbl9idWZbMF0uYnVmX3NpemUgPSBtX2ZyYW1lLT5mcmFtZV9sZW47CisgICAgZW5jb2RlX3BhcmFtLnNyY19tYWluX2J1ZlswXS5idWZfdmFkZHIgPSAodWludDhfdCAqKW1fZnJhbWUtPmJ1ZmZlcjsKKyAgICBlbmNvZGVfcGFyYW0uc3JjX21haW5fYnVmWzBdLmZkID0gbV9mcmFtZS0+ZmQ7CisgICAgZW5jb2RlX3BhcmFtLnNyY19tYWluX2J1ZlswXS5mb3JtYXQgPSBNTV9KUEVHX0ZNVF9ZVVY7CisgICAgZW5jb2RlX3BhcmFtLnNyY19tYWluX2J1ZlswXS5vZmZzZXQgPSBtX3N0cmVhbS0+b2Zmc2V0OworCisgICAgLyogZmlsbCBpbiBzaW5rIGltZyBwYXJhbSAqLworICAgIGVuY29kZV9wYXJhbS5udW1fZHN0X2J1ZnMgPSAxOworICAgIGVuY29kZV9wYXJhbS5kZXN0X2J1ZlswXS5pbmRleCA9IDA7CisgICAgZW5jb2RlX3BhcmFtLmRlc3RfYnVmWzBdLmJ1Zl9zaXplID0gdGVzdF9vYmotPmpwZWdfYnVmLmJ1Zi5mcmFtZV9sZW47CisgICAgZW5jb2RlX3BhcmFtLmRlc3RfYnVmWzBdLmJ1Zl92YWRkciA9ICh1aW50OF90ICopdGVzdF9vYmotPmpwZWdfYnVmLmJ1Zi5idWZmZXI7CisgICAgZW5jb2RlX3BhcmFtLmRlc3RfYnVmWzBdLmZkID0gdGVzdF9vYmotPmpwZWdfYnVmLmJ1Zi5mZDsKKyAgICBlbmNvZGVfcGFyYW0uZGVzdF9idWZbMF0uZm9ybWF0ID0gTU1fSlBFR19GTVRfWVVWOworCisgICAgLyogbWFpbiBkaW1lbnNpb24gKi8KKyAgICBlbmNvZGVfcGFyYW0ubWFpbl9kaW0uc3JjX2RpbSA9IG1fc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+ZGltOworICAgIGVuY29kZV9wYXJhbS5tYWluX2RpbS5kc3RfZGltID0gbV9zdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5kaW07CisKKyAgICByZXR1cm4gdGVzdF9vYmotPmpwZWdfb3BzLmNyZWF0ZV9zZXNzaW9uKHRlc3Rfb2JqLT5qcGVnX2hkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNvZGVfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVzdF9vYmotPmN1cnJlbnRfanBlZ19zZXNzX2lkKTsKK30KKworLyoqIG1tX2FwcF9zbmFwc2hvdF9tZXRhZGF0YV9ub3RpZnlfY2IKKyAqICBAYnVmczogUG9pbnRlciB0byBzdXBlciBidWZmZXIKKyAqICBAdXNlcl9kYXRhOiBQb2ludGVyIHRvIHVzZXIgZGF0YQorICoKKyAqCisgKiovCitfX3VudXNlZAorc3RhdGljIHZvaWQgbW1fYXBwX3NuYXBzaG90X21ldGFkYXRhX25vdGlmeV9jYihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmJ1ZnMsCisgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgdWludDMyX3QgaSA9IDA7CisgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwgPSBOVUxMOworICBtbV9jYW1lcmFfc3RyZWFtX3QgKnBfc3RyZWFtID0gTlVMTDsKKyAgbW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnBtZSA9IChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqKXVzZXJfZGF0YTsKKyAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqZnJhbWU7CisgIG1ldGFkYXRhX2J1ZmZlcl90ICpwTWV0YWRhdGE7CisKKyAgaWYgKE5VTEwgPT0gYnVmcyB8fCBOVUxMID09IHVzZXJfZGF0YSkgeworICAgIExPR0UoIiBidWZzIG9yIHVzZXJfZGF0YSBhcmUgbm90IHZhbGlkICIpOworICAgIHJldHVybjsKKyAgfQorICBmcmFtZSA9IGJ1ZnMtPmJ1ZnNbMF07CisKKyAgLyogZmluZCBjaGFubmVsICovCisgIGZvciAoaSA9IDA7IGkgPCBNTV9DSEFOTkVMX1RZUEVfTUFYOyBpKyspIHsKKyAgICBpZiAocG1lLT5jaGFubmVsc1tpXS5jaF9pZCA9PSBidWZzLT5jaF9pZCkgeworICAgICAgY2hhbm5lbCA9ICZwbWUtPmNoYW5uZWxzW2ldOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKE5VTEwgPT0gY2hhbm5lbCkgeworICAgIExPR0UoIiBDaGFubmVsIG9iamVjdCBpcyBudWxsIik7CisgICAgcmV0dXJuOworICB9CisKKyAgLyogZmluZCBtZXRhIHN0cmVhbSAqLworICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgIGlmIChjaGFubmVsLT5zdHJlYW1zW2ldLnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfTUVUQURBVEEpIHsKKyAgICAgIHBfc3RyZWFtID0gJmNoYW5uZWwtPnN0cmVhbXNbaV07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoTlVMTCA9PSBwX3N0cmVhbSkgeworICAgIExPR0UoIiBjYW5ub3QgZmluZCBtZXRhZGF0YSBzdHJlYW0iKTsKKyAgICByZXR1cm47CisgIH0KKworICAvKiBmaW5kIG1ldGEgZnJhbWUgKi8KKyAgZm9yIChpID0gMDsgaSA8IGJ1ZnMtPm51bV9idWZzOyBpKyspIHsKKyAgICBpZiAoYnVmcy0+YnVmc1tpXS0+c3RyZWFtX2lkID09IHBfc3RyZWFtLT5zX2lkKSB7CisgICAgICBmcmFtZSA9IGJ1ZnMtPmJ1ZnNbaV07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoIXBtZS0+bWV0YWRhdGEpIHsKKyAgICAvKiBUaGUgYXBwIHdpbGwgZnJlZSB0aGUgbWV0YWRhdGEsIHdlIGRvbid0IG5lZWQgdG8gYm90aGVyIGhlcmUgKi8KKyAgICBwbWUtPm1ldGFkYXRhID0gbWFsbG9jKHNpemVvZihtZXRhZGF0YV9idWZmZXJfdCkpOworICAgIGlmIChOVUxMID09IHBtZS0+bWV0YWRhdGEpIHsKKyAgICAgICAgTE9HRSgiIG1hbGxvYyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIG1lbWNweShwbWUtPm1ldGFkYXRhICwgZnJhbWUtPmJ1ZmZlciwgc2l6ZW9mKG1ldGFkYXRhX2J1ZmZlcl90KSk7CisKKyAgcE1ldGFkYXRhID0gKG1ldGFkYXRhX2J1ZmZlcl90ICopZnJhbWUtPmJ1ZmZlcjsKKworICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fYXV0b19mb2N1c19kYXRhX3QsIGZvY3VzX2RhdGEsCisgICAgICAgIENBTV9JTlRGX01FVEFfQVVUT0ZPQ1VTX0RBVEEsIHBNZXRhZGF0YSkgeworICAgIGlmIChmb2N1c19kYXRhLT5mb2N1c19zdGF0ZSA9PSBDQU1fQUZfU1RBVEVfRk9DVVNFRF9MT0NLRUQpIHsKKyAgICAgIExPR0UoIiBBdXRvRm9jdXMgRG9uZSBDYWxsIEJhY2sgUmVjZWl2ZWRcbiIpOworICAgICAgbW1fY2FtZXJhX2FwcF9kb25lKCk7CisgICAgfSBlbHNlIGlmIChmb2N1c19kYXRhLT5mb2N1c19zdGF0ZSA9PSBDQU1fQUZfU1RBVEVfTk9UX0ZPQ1VTRURfTE9DS0VEKSB7CisgICAgICBMT0dFKCIgQXV0b0ZvY3VzIGZhaWxlZFxuIik7CisgICAgICBtbV9jYW1lcmFfYXBwX2RvbmUoKTsKKyAgICB9CisgIH0KKworICBpZiAoTU1fQ0FNRVJBX09LICE9IHBtZS0+Y2FtLT5vcHMtPnFidWYoYnVmcy0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnMtPmNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUpKSB7CisgICAgTE9HRSgiIEZhaWxlZCBpbiBQcmV2aWV3IFFidWZcbiIpOworICB9CisgIG1tX2FwcF9jYWNoZV9vcHMoKG1tX2NhbWVyYV9hcHBfbWVtaW5mb190ICopZnJhbWUtPm1lbV9pbmZvLAorICAgICAgICAgICAgICAgICAgIElPTl9JT0NfSU5WX0NBQ0hFUyk7Cit9CisKK3N0YXRpYyB2b2lkIG1tX2FwcF9zbmFwc2hvdF9ub3RpZnlfY2JfcmF3KG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqYnVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKworICAgIGludCByYzsKKyAgICB1aW50MzJfdCBpID0gMDsKKyAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCAqcG1lID0gKG1tX2NhbWVyYV90ZXN0X29ial90ICopdXNlcl9kYXRhOworICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwgPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqbV9zdHJlYW0gPSBOVUxMOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1fZnJhbWUgPSBOVUxMOworCisgICAgTE9HRCgiIEJFR0lOXG4iKTsKKworICAgIC8qIGZpbmQgY2hhbm5lbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNTV9DSEFOTkVMX1RZUEVfTUFYOyBpKyspIHsKKyAgICAgICAgaWYgKHBtZS0+Y2hhbm5lbHNbaV0uY2hfaWQgPT0gYnVmcy0+Y2hfaWQpIHsKKyAgICAgICAgICAgIGNoYW5uZWwgPSAmcG1lLT5jaGFubmVsc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChOVUxMID09IGNoYW5uZWwpIHsKKyAgICAgICAgTE9HRSgiIFdyb25nIGNoYW5uZWwgaWQgKCVkKSIsICBidWZzLT5jaF9pZCk7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICAvKiBmaW5kIHNuYXBzaG90IHN0cmVhbSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChjaGFubmVsLT5zdHJlYW1zW2ldLnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUkFXKSB7CisgICAgICAgICAgICBtX3N0cmVhbSA9ICZjaGFubmVsLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKE5VTEwgPT0gbV9zdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiIGNhbm5vdCBmaW5kIHNuYXBzaG90IHN0cmVhbSIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgLyogZmluZCBzbmFwc2hvdCBmcmFtZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBidWZzLT5udW1fYnVmczsgaSsrKSB7CisgICAgICAgIGlmIChidWZzLT5idWZzW2ldLT5zdHJlYW1faWQgPT0gbV9zdHJlYW0tPnNfaWQpIHsKKyAgICAgICAgICAgIG1fZnJhbWUgPSBidWZzLT5idWZzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKE5VTEwgPT0gbV9mcmFtZSkgeworICAgICAgICBMT0dFKCIgbWFpbiBmcmFtZSBpcyBOVUxMIik7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBtbV9hcHBfZHVtcF9mcmFtZShtX2ZyYW1lLCAibWFpbiIsICJyYXciLCBtX2ZyYW1lLT5mcmFtZV9pZHgpOworCitFWElUOgorICAgIGZvciAoaT0wOyBpPGJ1ZnMtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSBwbWUtPmNhbS0+b3BzLT5xYnVmKGJ1ZnMtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzLT5jaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnMtPmJ1ZnNbaV0pKSB7CisgICAgICAgICAgICBMT0dFKCIgRmFpbGVkIGluIFFidWZcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgbW1fY2FtZXJhX2FwcF9kb25lKCk7CisKKyAgICBMT0dEKCIgRU5EXG4iKTsKK30KKworc3RhdGljIHZvaWQgbW1fYXBwX3NuYXBzaG90X25vdGlmeV9jYihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmJ1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKworICAgIGludCByYyA9IDA7CisgICAgdWludDMyX3QgaSA9IDA7CisgICAgbW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnBtZSA9IChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqKXVzZXJfZGF0YTsKKyAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnBfc3RyZWFtID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKm1fc3RyZWFtID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICpwX2ZyYW1lID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfYnVmX2RlZl90ICptX2ZyYW1lID0gTlVMTDsKKworICAgIC8qIGZpbmQgY2hhbm5lbCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNTV9DSEFOTkVMX1RZUEVfTUFYOyBpKyspIHsKKyAgICAgICAgaWYgKHBtZS0+Y2hhbm5lbHNbaV0uY2hfaWQgPT0gYnVmcy0+Y2hfaWQpIHsKKyAgICAgICAgICAgIGNoYW5uZWwgPSAmcG1lLT5jaGFubmVsc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChOVUxMID09IGNoYW5uZWwpIHsKKyAgICAgICAgTE9HRSgiIFdyb25nIGNoYW5uZWwgaWQgKCVkKSIsICBidWZzLT5jaF9pZCk7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogZmluZCBzbmFwc2hvdCBzdHJlYW0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpZiAoY2hhbm5lbC0+c3RyZWFtc1tpXS5zX2NvbmZpZy5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUgPT0gQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UKSB7CisgICAgICAgICAgICBtX3N0cmVhbSA9ICZjaGFubmVsLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKE5VTEwgPT0gbV9zdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiIGNhbm5vdCBmaW5kIHNuYXBzaG90IHN0cmVhbSIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIGZpbmQgc25hcHNob3QgZnJhbWUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmcy0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICBpZiAoYnVmcy0+YnVmc1tpXS0+c3RyZWFtX2lkID09IG1fc3RyZWFtLT5zX2lkKSB7CisgICAgICAgICAgICBtX2ZyYW1lID0gYnVmcy0+YnVmc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChOVUxMID09IG1fZnJhbWUpIHsKKyAgICAgICAgTE9HRSgiIG1haW4gZnJhbWUgaXMgTlVMTCIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIG1tX2FwcF9kdW1wX2ZyYW1lKG1fZnJhbWUsICJtYWluIiwgInl1diIsIG1fZnJhbWUtPmZyYW1lX2lkeCk7CisKKyAgICAvKiBmaW5kIHBvc3R2aWV3IHN0cmVhbSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChjaGFubmVsLT5zdHJlYW1zW2ldLnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUE9TVFZJRVcpIHsKKyAgICAgICAgICAgIHBfc3RyZWFtID0gJmNoYW5uZWwtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoTlVMTCAhPSBwX3N0cmVhbSkgeworICAgICAgICAvKiBmaW5kIHByZXZpZXcgZnJhbWUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1ZnMtPm51bV9idWZzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChidWZzLT5idWZzW2ldLT5zdHJlYW1faWQgPT0gcF9zdHJlYW0tPnNfaWQpIHsKKyAgICAgICAgICAgICAgICBwX2ZyYW1lID0gYnVmcy0+YnVmc1tpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoTlVMTCAhPSBwX2ZyYW1lKSB7CisgICAgICAgICAgICBtbV9hcHBfZHVtcF9mcmFtZShwX2ZyYW1lLCAicG9zdHZpZXciLCAieXV2IiwgcF9mcmFtZS0+ZnJhbWVfaWR4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1tX2FwcF9jYWNoZV9vcHMoKG1tX2NhbWVyYV9hcHBfbWVtaW5mb190ICopbV9mcmFtZS0+bWVtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICBJT05fSU9DX0NMRUFOX0lOVl9DQUNIRVMpOworCisgICAgcG1lLT5qcGVnX2J1Zi5idWYuYnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MobV9mcmFtZS0+ZnJhbWVfbGVuKTsKKyAgICBpZiAoIE5VTEwgPT0gcG1lLT5qcGVnX2J1Zi5idWYuYnVmZmVyICkgeworICAgICAgICBMT0dFKCIgZXJyb3IgYWxsb2NhdGluZyBqcGVnIG91dHB1dCBidWZmZXIiKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBwbWUtPmpwZWdfYnVmLmJ1Zi5mcmFtZV9sZW4gPSBtX2ZyYW1lLT5mcmFtZV9sZW47CisgICAgLyogY3JlYXRlIGEgbmV3IGpwZWcgZW5jb2Rpbmcgc2Vzc2lvbiAqLworICAgIHJjID0gY3JlYXRlRW5jb2RpbmdTZXNzaW9uKHBtZSwgbV9zdHJlYW0sIG1fZnJhbWUpOworICAgIGlmICgwICE9IHJjKSB7CisgICAgICAgIExPR0UoIiBlcnJvciBjcmVhdGluZyBqcGVnIHNlc3Npb24iKTsKKyAgICAgICAgZnJlZShwbWUtPmpwZWdfYnVmLmJ1Zi5idWZmZXIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIHN0YXJ0IGpwZWcgZW5jb2Rpbmcgam9iICovCisgICAgcmMgPSBlbmNvZGVEYXRhKHBtZSwgYnVmcywgbV9zdHJlYW0pOworICAgIGlmICgwICE9IHJjKSB7CisgICAgICAgIExPR0UoIiBlcnJvciBjcmVhdGluZyBqcGVnIHNlc3Npb24iKTsKKyAgICAgICAgZnJlZShwbWUtPmpwZWdfYnVmLmJ1Zi5idWZmZXIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworZXJyb3I6CisgICAgLyogYnVmIGRvbmUgcmN2ZCBmcmFtZXMgaW4gZXJyb3IgY2FzZSAqLworICAgIGlmICggMCAhPSByYyApIHsKKyAgICAgICAgZm9yIChpPTA7IGk8YnVmcy0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICAgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSBwbWUtPmNhbS0+b3BzLT5xYnVmKGJ1ZnMtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmcy0+Y2hfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmcy0+YnVmc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIgRmFpbGVkIGluIFFidWZcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW1fYXBwX2NhY2hlX29wcygobW1fY2FtZXJhX2FwcF9tZW1pbmZvX3QgKilidWZzLT5idWZzW2ldLT5tZW1faW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9OX0lPQ19JTlZfQ0FDSEVTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIExPR0QoIiBFTkRcbiIpOworfQorCittbV9jYW1lcmFfY2hhbm5lbF90ICogbW1fYXBwX2FkZF9zbmFwc2hvdF9jaGFubmVsKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaikKK3sKKyAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnN0cmVhbSA9IE5VTEw7CisKKyAgICBjaGFubmVsID0gbW1fYXBwX2FkZF9jaGFubmVsKHRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9UWVBFX1NOQVBTSE9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBpZiAoTlVMTCA9PSBjaGFubmVsKSB7CisgICAgICAgIExPR0UoIiBhZGQgY2hhbm5lbCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RyZWFtID0gbW1fYXBwX2FkZF9zbmFwc2hvdF9zdHJlYW0odGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9hcHBfc25hcHNob3Rfbm90aWZ5X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBpZiAoTlVMTCA9PSBzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiIGFkZCBzbmFwc2hvdCBzdHJlYW0gZmFpbGVkXG4iKTsKKyAgICAgICAgbW1fYXBwX2RlbF9jaGFubmVsKHRlc3Rfb2JqLCBjaGFubmVsKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNoYW5uZWw7Cit9CisKK21tX2NhbWVyYV9zdHJlYW1fdCAqIG1tX2FwcF9hZGRfcG9zdHZpZXdfc3RyZWFtKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IHN0cmVhbV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYnVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2J1cnN0KQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnN0cmVhbSA9IE5VTEw7CisgICAgY2FtX2NhcGFiaWxpdHlfdCAqY2FtX2NhcCA9IChjYW1fY2FwYWJpbGl0eV90ICopKHRlc3Rfb2JqLT5jYXBfYnVmLmJ1Zi5idWZmZXIpOworCisgICAgc3RyZWFtID0gbW1fYXBwX2FkZF9zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwpOworICAgIGlmIChOVUxMID09IHN0cmVhbSkgeworICAgICAgICBMT0dFKCIgYWRkIHN0cmVhbSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLmdldF9idWZzID0gbW1fYXBwX3N0cmVhbV9pbml0YnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwucHV0X2J1ZnMgPSBtbV9hcHBfc3RyZWFtX2RlaW5pdGJ1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLmNsZWFuX2ludmFsaWRhdGVfYnVmID0KKyAgICAgIG1tX2FwcF9zdHJlYW1fY2xlYW5faW52YWxpZGF0ZV9idWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5pbnZhbGlkYXRlX2J1ZiA9IG1tX2FwcF9zdHJlYW1faW52YWxpZGF0ZV9idWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC51c2VyX2RhdGEgPSAodm9pZCAqKXN0cmVhbTsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9jYiA9IHN0cmVhbV9jYjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9jYl9zeW5jID0gTlVMTDsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnVzZXJkYXRhID0gdXNlcmRhdGE7CisgICAgc3RyZWFtLT5udW1fb2ZfYnVmcyA9IG51bV9idWZzOworCisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mbyA9IChjYW1fc3RyZWFtX2luZm9fdCAqKXN0cmVhbS0+c19pbmZvX2J1Zi5idWYuYnVmZmVyOworICAgIG1lbXNldChzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLCAwLCBzaXplb2YoY2FtX3N0cmVhbV9pbmZvX3QpKTsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSA9IENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVzsKKyAgICBpZiAobnVtX2J1cnN0ID09IDApIHsKKyAgICAgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+c3RyZWFtaW5nX21vZGUgPSBDQU1fU1RSRUFNSU5HX01PREVfQ09OVElOVU9VUzsKKyAgICB9IGVsc2UgeworICAgICAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1pbmdfbW9kZSA9IENBTV9TVFJFQU1JTkdfTU9ERV9CVVJTVDsKKyAgICAgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+bnVtX29mX2J1cnN0ID0gbnVtX2J1cnN0OworICAgIH0KKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5mbXQgPSBERUZBVUxUX1BSRVZJRVdfRk9STUFUOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS53aWR0aCA9IERFRkFVTFRfUFJFVklFV19XSURUSDsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5kaW0uaGVpZ2h0ID0gREVGQVVMVF9QUkVWSUVXX0hFSUdIVDsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnBhZGRpbmdfaW5mbyA9IGNhbV9jYXAtPnBhZGRpbmdfaW5mbzsKKworICAgIHJjID0gbW1fYXBwX2NvbmZpZ19zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwsIHN0cmVhbSwgJnN0cmVhbS0+c19jb25maWcpOworICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgiY29uZmlnIHBvc3R2aWV3IHN0cmVhbSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBzdHJlYW07Cit9CisKK2ludCBtbV9hcHBfc3RhcnRfY2FwdHVyZV9yYXcobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLCB1aW50OF90IG51bV9zbmFwc2hvdHMpCit7CisgICAgaW50MzJfdCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnNfbWFpbiA9IE5VTEw7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfYXR0cl90IGF0dHI7CisKKyAgICBtZW1zZXQoJmF0dHIsIDAsIHNpemVvZihtbV9jYW1lcmFfY2hhbm5lbF9hdHRyX3QpKTsKKyAgICBhdHRyLm5vdGlmeV9tb2RlID0gTU1fQ0FNRVJBX1NVUEVSX0JVRl9OT1RJRllfQlVSU1Q7CisgICAgYXR0ci5tYXhfdW5tYXRjaGVkX2ZyYW1lcyA9IDM7CisgICAgY2hhbm5lbCA9IG1tX2FwcF9hZGRfY2hhbm5lbCh0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NIQU5ORUxfVFlQRV9DQVBUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9hcHBfc25hcHNob3Rfbm90aWZ5X2NiX3JhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb2JqKTsKKyAgICBpZiAoTlVMTCA9PSBjaGFubmVsKSB7CisgICAgICAgIExPR0UoIiBhZGQgY2hhbm5lbCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC1NTV9DQU1FUkFfRV9HRU5FUkFMOworICAgIH0KKworICAgIHRlc3Rfb2JqLT5idWZmZXJfZm9ybWF0ID0gREVGQVVMVF9SQVdfRk9STUFUOworICAgIHNfbWFpbiA9IG1tX2FwcF9hZGRfcmF3X3N0cmVhbSh0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fYXBwX3NuYXBzaG90X25vdGlmeV9jYl9yYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc25hcHNob3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc25hcHNob3RzKTsKKyAgICBpZiAoTlVMTCA9PSBzX21haW4pIHsKKyAgICAgICAgTE9HRSgiIGFkZCBtYWluIHNuYXBzaG90IHN0cmVhbSBmYWlsZWRcbiIpOworICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmMgPSBtbV9hcHBfc3RhcnRfY2hhbm5lbCh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJzdGFydCB6c2wgZmFpbGVkIHJjPSVkXG4iLCAgcmMpOworICAgICAgICBtbV9hcHBfZGVsX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc19tYWluKTsKKyAgICAgICAgbW1fYXBwX2RlbF9jaGFubmVsKHRlc3Rfb2JqLCBjaGFubmVsKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF9zdG9wX2NhcHR1cmVfcmF3KG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaikKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2ggPSBOVUxMOworICAgIGludCBpOworICAgIGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QgYWJjIDsKKyAgICBtZW1zZXQgKCZhYmMgLCAwLCBzaXplb2YgKGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QpKTsKKworICAgIGNoID0gbW1fYXBwX2dldF9jaGFubmVsX2J5X3R5cGUodGVzdF9vYmosIE1NX0NIQU5ORUxfVFlQRV9DQVBUVVJFKTsKKworICAgIHJjID0gbW1fYXBwX3N0b3BfY2hhbm5lbCh0ZXN0X29iaiwgY2gpOworICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgic3RvcCByZWNvcmRpbmcgZmFpbGVkIHJjPSVkXG4iLCAgcmMpOworICAgIH0KKworICAgIGZvciAoIGkgPSAwIDsgaSA8IGNoLT5udW1fc3RyZWFtcyA7IGkrKyApIHsKKyAgICAgICAgbW1fYXBwX2RlbF9zdHJlYW0odGVzdF9vYmosIGNoLCAmY2gtPnN0cmVhbXNbaV0pOworICAgIH0KKyAgICByYyA9IHNldG1ldGFpbmZvQ29tbWFuZCh0ZXN0X29iaiwgJmFiYyk7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgIExPR0UoIiBtZXRhIGluZm8gY29tbWFuZCBmYWlsZWRcbiIpOworICAgIH0KKyAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoKTsKKworICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF9zdGFydF9jYXB0dXJlKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9zbmFwc2hvdHMpCit7CisgICAgaW50MzJfdCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnNfbWFpbiA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzX3Bvc3QgPSBOVUxMOworICAgIG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCBhdHRyOworICAgIG1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9jaGFubmVsX2F0dHJfdCkpOworICAgIGF0dHIubm90aWZ5X21vZGUgPSBNTV9DQU1FUkFfU1VQRVJfQlVGX05PVElGWV9DT05USU5VT1VTOworICAgIGF0dHIubWF4X3VubWF0Y2hlZF9mcmFtZXMgPSAzOworICAgIGNoYW5uZWwgPSBtbV9hcHBfYWRkX2NoYW5uZWwodGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DSEFOTkVMX1RZUEVfQ0FQVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fYXBwX3NuYXBzaG90X25vdGlmeV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb2JqKTsKKyAgICBpZiAoTlVMTCA9PSBjaGFubmVsKSB7CisgICAgICAgIExPR0UoIiBhZGQgY2hhbm5lbCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC1NTV9DQU1FUkFfRV9HRU5FUkFMOworICAgIH0KKworICAgIHNfbWFpbiA9IG1tX2FwcF9hZGRfc25hcHNob3Rfc3RyZWFtKHRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fYXBwX3NuYXBzaG90X25vdGlmeV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBUFRVUkVfQlVGX05VTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc25hcHNob3RzKTsKKyAgICBpZiAoTlVMTCA9PSBzX21haW4pIHsKKyAgICAgICAgTE9HRSgiIGFkZCBtYWluIHNuYXBzaG90IHN0cmVhbSBmYWlsZWRcbiIpOworICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgc19wb3N0ID0gbW1fYXBwX2FkZF9wb3N0dmlld19zdHJlYW0odGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FQVFVSRV9CVUZfTlVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9zbmFwc2hvdHMpOworICAgIGlmIChOVUxMID09IHNfbWFpbikgeworICAgICAgICBMT0dFKCIgYWRkIG1haW4gcG9zdHZpZXcgc3RyZWFtIGZhaWxlZFxuIik7CisgICAgICAgIG1tX2FwcF9kZWxfY2hhbm5lbCh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByYyA9IG1tX2FwcF9zdGFydF9jaGFubmVsKHRlc3Rfb2JqLCBjaGFubmVsKTsKKyAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHJjKSB7CisgICAgICAgIExPR0UoInN0YXJ0IHpzbCBmYWlsZWQgcmM9JWRcbiIsICByYyk7CisgICAgICAgIG1tX2FwcF9kZWxfc3RyZWFtKHRlc3Rfb2JqLCBjaGFubmVsLCBzX21haW4pOworICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fYXBwX3N0b3BfY2FwdHVyZShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoID0gTlVMTDsKKworICAgIGNoID0gbW1fYXBwX2dldF9jaGFubmVsX2J5X3R5cGUodGVzdF9vYmosIE1NX0NIQU5ORUxfVFlQRV9DQVBUVVJFKTsKKworICAgIHJjID0gbW1fYXBwX3N0b3BfYW5kX2RlbF9jaGFubmVsKHRlc3Rfb2JqLCBjaCk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJzdG9wIGNhcHR1cmUgY2hhbm5lbCBmYWlsZWQgcmM9JWRcbiIsICByYyk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fYXBwX3Rha2VfcGljdHVyZShtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosIHVpbnQ4X3QgaXNfYnVyc3RfbW9kZSkKK3sKKyAgICBMT0dIKCJcbkVudGVyICVzISFcbiIpOworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICB1aW50OF90IG51bV9zbmFwc2hvdCA9IDE7CisgICAgaW50IG51bV9yY3ZkX3NuYXBzaG90ID0gMDsKKworICAgIGlmIChpc19idXJzdF9tb2RlKQorICAgICAgIG51bV9zbmFwc2hvdCA9IDY7CisKKyAgICAvL3N0b3AgcHJldmlldyBiZWZvcmUgc3RhcnRpbmcgY2FwdHVyZS4KKyAgICByYyA9IG1tX2FwcF9zdG9wX3ByZXZpZXcodGVzdF9vYmopOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiIHN0b3AgcHJldmlldyBmYWlsZWQgYmVmb3JlIGNhcHR1cmUhISwgZXJyPSVkXG4iLCByYyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICByYyA9IG1tX2FwcF9zdGFydF9jYXB0dXJlKHRlc3Rfb2JqLCBudW1fc25hcHNob3QpOworICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgTE9HRSgiIG1tX2FwcF9zdGFydF9jYXB0dXJlKCksIGVycj0lZFxuIiwgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorICAgIHdoaWxlIChudW1fcmN2ZF9zbmFwc2hvdCA8IG51bV9zbmFwc2hvdCkgeworICAgICAgICBMT0dIKCJcbldhaXRpbmcgbW1fY2FtZXJhX2FwcF93YWl0ICEhXG4iKTsKKyAgICAgICAgbW1fY2FtZXJhX2FwcF93YWl0KCk7CisgICAgICAgIG51bV9yY3ZkX3NuYXBzaG90Kys7CisgICAgfQorICAgIHJjID0gbW1fYXBwX3N0b3BfY2FwdHVyZSh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgIExPR0UoIiBtbV9hcHBfc3RvcF9jYXB0dXJlKCksIGVycj0lZFxuIiwgcmMpOworICAgICAgIHJldHVybiByYzsKKyAgICB9CisgICAgLy9zdGFydCBwcmV2aWV3IGFmdGVyIGNhcHR1cmUuCisgICAgcmMgPSBtbV9hcHBfc3RhcnRfcHJldmlldyh0ZXN0X29iaik7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICBMT0dFKCIgc3RhcnQgcHJldmlldyBmYWlsZWQgYWZ0ZXIgY2FwdHVyZSEhLCBlcnI9JWRcbiIscmMpOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfc29ja2V0LmMgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjMzc3ZgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9zcmMvbW1fcWNhbWVyYV9zb2NrZXQuYwpAQCAtMCwwICsxLDg4MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQsIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX3FjYW1lcmFfc29ja2V0LmgiCisjaW5jbHVkZSAibW1fcWNhbWVyYV9jb21tYW5kcy5oIgorI2luY2x1ZGUgIm1tX3FjYW1lcmFfZGJnLmgiCisKKyNkZWZpbmUgSVBfQUREUiAgICAgICAgICAgICAgICAgICIxMjcuMC4wLjEiCisjZGVmaW5lIFRVTklOR19DSFJPTUFUSVhfUE9SVCAgICAgNTU1NTUKKyNkZWZpbmUgVFVOSU5HX1BSRVZJRVdfUE9SVCAgICAgICA1NTU1NgorCisjZGVmaW5lIENVUlJFTlRfQ09NTUFORF9BQ0tfU1VDQ0VTUyAxCisjZGVmaW5lIENVUlJFTlRfQ09NTUFORF9BQ0tfRkFJTFVSRSAyCisKK3B0aHJlYWRfdCBlenR1bmVfdGhyZWFkX2lkOworCitzdGF0aWMgc3NpemVfdCB0dW5lc2VydmVyX3NlbmRfY29tbWFuZF9yc3AodHVuaW5nc2VydmVyX3QgKnRzY3RybCwKKyAgY2hhciAqc2VuZF9idWYsIHVpbnQzMl90IHNlbmRfbGVuKQoreworICBzc2l6ZV90IHJjOworCisgIC8qIHNlbmQgYWNrIGJhY2sgdG8gY2xpZW50IHVwb24gcmVxICovCisgIGlmIChzZW5kX2xlbiA8PSAwKSB7CisgICAgTE9HRSgiSW52YWxpZCBzZW5kIGxlbiBcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBpZiAoc2VuZF9idWYgPT0gTlVMTCkgeworICAgIExPR0UoIkludmFsaWQgc2VuZCBidWYgXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICByYyA9IHNlbmQodHNjdHJsLT5jbGllbnRzb2NrZXRfaWQsIHNlbmRfYnVmLCBzZW5kX2xlbiwgMCk7CisgIGlmIChyYyA8IDApIHsKKyAgICBMT0dFKCJSU1Agc2VuZCByZXR1cm5zIGVycm9yICVzXG4iLCAgc3RyZXJyb3IoZXJybm8pKTsKKyAgfSBlbHNlIHsKKyAgICByYyA9IDA7CisgIH0KKworICBpZiAoc2VuZF9idWYgIT0gTlVMTCkgeworICAgIGZyZWUoc2VuZF9idWYpOworICAgIHNlbmRfYnVmID0gTlVMTDsKKyAgfQorICByZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfZXp0dW5lX3ByZXZjbWRfcnNwKGV6dHVuZV9wcmV2Y21kX3JzcCAqcEhlYWQpCit7CisgIGlmIChwSGVhZCAhPSBOVUxMICkgeworICAgIHJlbGVhc2VfZXp0dW5lX3ByZXZjbWRfcnNwKChlenR1bmVfcHJldmNtZF9yc3AgKilwSGVhZC0+bmV4dCk7CisgICAgZnJlZShwSGVhZCk7CisgIH0KK30KKworc3RhdGljIHNzaXplX3QgdHVuZXNlcnZlcl9hY2sodWludDE2X3QgYSwgdWludDMyX3QgYiwgdHVuaW5nc2VydmVyX3QgKnRzY3RybCkKK3sKKyAgc3NpemVfdCByYzsKKyAgY2hhciBhY2tfMVs2XTsKKyAgLypBY2sgdGhlIGNvbW1hbmQgaGVyZSovCisgIG1lbWNweShhY2tfMSwgJmEsIDIpOworICBtZW1jcHkoYWNrXzErMiwgJmIsIDQpOworICAvKiBzZW5kIGVjaG8gYmFjayB0byBjbGllbnQgdXBvbiBhY2NlcHQgKi8KKyAgcmMgPSBzZW5kKHRzY3RybC0+Y2xpZW50c29ja2V0X2lkLCAmYWNrXzEsIHNpemVvZihhY2tfMSksIDApOworICBpZiAocmMgPCAwKSB7CisgICAgTE9HRSgiIGV6dHVuZV9zZXJ2ZXJfcnVuOiBzZW5kIHJldHVybnMgZXJyb3IgJXNcbiIsCisgICAgICBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiByYzsKKyAgfSBlbHNlIGlmIChyYyA8IChpbnQzMl90KXNpemVvZihhY2tfMSkpIHsKKyAgICAvKlNob3VsZG4ndCBoaXQgdGhpcyBmb3IgcGFja2V0cyA8MUs7IG5lZWQgdG8gcmUtc2VuZCBpZiB3ZSBkbyovCisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHR1bmVzZXJ2ZXJfc2VuZF9jb21tYW5kX2FjayggdWludDhfdCBhY2ssCisgICAgdHVuaW5nc2VydmVyX3QgKnRzY3RybCkKK3sKKyAgc3NpemVfdCByYzsKKyAgLyogc2VuZCBhY2sgYmFjayB0byBjbGllbnQgdXBvbiByZXEgKi8KKyAgcmMgPSBzZW5kKHRzY3RybC0+Y2xpZW50c29ja2V0X2lkLCAmYWNrLCBzaXplb2YoYWNrKSwgMCk7CisgIGlmIChyYyA8IDApIHsKKyAgICBMT0dFKCJBQ0sgc2VuZCByZXR1cm5zIGVycm9yICVzXG4iLCAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8qKiB0dW5lc2VydmVyX3Byb2Nlc3NfY29tbWFuZAorICogICAgQHRzY3RybDogdGhlIHNlcnZlciBjb250cm9sIG9iamVjdAorICoKKyAqICBQcm9jZXNzZXMgdGhlIGNvbW1hbmQgdGhhdCB0aGUgY2xpZW50IHNlbnQKKyAqCisgKiAgUmV0dXJuOiA+PTAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqKi8KK3N0YXRpYyBpbnQzMl90IHR1bmVzZXJ2ZXJfcHJvY2Vzc19jb21tYW5kKHR1bmluZ3NlcnZlcl90ICp0c2N0cmwsCisgIGNoYXIgKnNlbmRfYnVmLCB1aW50MzJfdCBzZW5kX2xlbikKK3sKKyAgdHVuZXNlcnZlcl9wcm90b2NvbF90ICpwID0gdHNjdHJsLT5wcm90bzsKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgTE9HRCgiIEN1cnJlbnQgY29tbWFuZCBpcyAlZFxuIiwgIHAtPmN1cnJlbnRfY21kKTsKKyAgc3dpdGNoIChwLT5jdXJyZW50X2NtZCkgeworICBjYXNlIFRVTkVTRVJWRVJfR0VUX0xJU1Q6CisgICAgaWYodHVuZXNlcnZlcl9zZW5kX2NvbW1hbmRfYWNrKENVUlJFTlRfQ09NTUFORF9BQ0tfU1VDQ0VTUywgdHNjdHJsKSkgeworICAgICAgTE9HRSgiIEFjayBGYWlsZWQgZm9yIGNtZCAlZFxuIiwgIHAtPmN1cnJlbnRfY21kKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmVzdWx0ID0gdHVuZXNlcnZlcl9wcm9jZXNzX2dldF9saXN0X2NtZCh0c2N0cmwsIHAtPnJlY3ZfYnVmLAorICAgICAgc2VuZF9idWYsIHNlbmRfbGVuKTsKKyAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgTE9HRSgiIFJTUCBwcm9jZXNzaW5nIEZhaWxlZCBmb3IgY21kICVkXG4iLCAgcC0+Y3VycmVudF9jbWQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZih0dW5lc2VydmVyX3NlbmRfY29tbWFuZF9yc3AodHNjdHJsLCBzZW5kX2J1Ziwgc2VuZF9sZW4pKSB7CisgICAgICBMT0dFKCIgUlNQIEZhaWxlZCBmb3IgY21kICVkXG4iLCAgcC0+Y3VycmVudF9jbWQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIFRVTkVTRVJWRVJfR0VUX1BBUk1TOgorICAgIGlmKHR1bmVzZXJ2ZXJfc2VuZF9jb21tYW5kX2FjayhDVVJSRU5UX0NPTU1BTkRfQUNLX1NVQ0NFU1MsIHRzY3RybCkpIHsKKyAgICAgIExPR0UoIiBBY2sgRmFpbGVkIGZvciBjbWQgJWRcbiIsICBwLT5jdXJyZW50X2NtZCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlc3VsdCA9IHR1bmVzZXJ2ZXJfcHJvY2Vzc19nZXRfcGFyYW1zX2NtZCh0c2N0cmwsIHAtPnJlY3ZfYnVmLAorICAgICAgc2VuZF9idWYsIHNlbmRfbGVuKTsKKyAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgTE9HRSgiIFJTUCBwcm9jZXNzaW5nIEZhaWxlZCBmb3IgY21kICVkXG4iLCAgcC0+Y3VycmVudF9jbWQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZih0dW5lc2VydmVyX3NlbmRfY29tbWFuZF9yc3AodHNjdHJsLCBzZW5kX2J1Ziwgc2VuZF9sZW4pKSB7CisgICAgICBMT0dFKCIgUlNQIEZhaWxlZCBmb3IgY21kICVkXG4iLCAgcC0+Y3VycmVudF9jbWQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIFRVTkVTRVJWRVJfU0VUX1BBUk1TOgorICAgIGlmKHR1bmVzZXJ2ZXJfc2VuZF9jb21tYW5kX2FjayhDVVJSRU5UX0NPTU1BTkRfQUNLX1NVQ0NFU1MsIHRzY3RybCkpIHsKKyAgICAgIExPR0UoIiBBY2sgRmFpbGVkIGZvciBjbWQgJWRcbiIsICBwLT5jdXJyZW50X2NtZCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJlc3VsdCA9IHR1bmVzZXJ2ZXJfcHJvY2Vzc19zZXRfcGFyYW1zX2NtZCh0c2N0cmwsIHAtPnJlY3ZfYnVmLAorICAgICAgc2VuZF9idWYsIHNlbmRfbGVuKTsKKyAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgTE9HRSgiIFJTUCBwcm9jZXNzaW5nIEZhaWxlZCBmb3IgY21kICVkXG4iLCAgcC0+Y3VycmVudF9jbWQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZih0dW5lc2VydmVyX3NlbmRfY29tbWFuZF9yc3AodHNjdHJsLCBzZW5kX2J1Ziwgc2VuZF9sZW4pKSB7CisgICAgICBMT0dFKCIgUlNQIEZhaWxlZCBmb3IgY21kICVkXG4iLCAgcC0+Y3VycmVudF9jbWQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIFRVTkVTRVJWRVJfTUlTQ19DTURTOiB7CisgICAgaWYodHVuZXNlcnZlcl9zZW5kX2NvbW1hbmRfYWNrKENVUlJFTlRfQ09NTUFORF9BQ0tfU1VDQ0VTUywgdHNjdHJsKSkgeworICAgICAgTE9HRSgiIEFjayBGYWlsZWQgZm9yIGNtZCAlZFxuIiwgIHAtPmN1cnJlbnRfY21kKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmVzdWx0ID0gdHVuZXNlcnZlcl9wcm9jZXNzX21pc2NfY21kKHRzY3RybCwgcC0+cmVjdl9idWYsCisgICAgICBzZW5kX2J1Ziwgc2VuZF9sZW4pOworICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICBMT0dFKCIgUlNQIHByb2Nlc3NpbmcgRmFpbGVkIGZvciBjbWQgJWRcbiIsICBwLT5jdXJyZW50X2NtZCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmKHR1bmVzZXJ2ZXJfc2VuZF9jb21tYW5kX3JzcCh0c2N0cmwsIHNlbmRfYnVmLCBzZW5kX2xlbikpIHsKKyAgICAgIExPR0UoIiBSU1AgRmFpbGVkIGZvciBjbWQgJWRcbiIsICBwLT5jdXJyZW50X2NtZCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGJyZWFrOworICB9CisKKyAgZGVmYXVsdDoKKyAgICBpZih0dW5lc2VydmVyX3NlbmRfY29tbWFuZF9hY2soQ1VSUkVOVF9DT01NQU5EX0FDS19TVUNDRVNTLCB0c2N0cmwpKSB7CisgICAgICBMT0dFKCIgQWNrIEZhaWxlZCBmb3IgY21kICVkXG4iLCAgcC0+Y3VycmVudF9jbWQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBMT0dFKCIgcC0+Y3VycmVudF9jbWQ6IGRlZmF1bHRcbiIpOworICAgIHJlc3VsdCA9IC0xOworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqIHR1bmVzZXJ2ZXJfcHJvY2Vzc19jbGllbnRfbWVzc2FnZQorICogICAgQHJlY3ZfYnVmZmVyOiByZWNlaXZlZCBtZXNzYWdlIGZyb20gdGhlIGNsaWVudAorICogICAgQHRzY3RybDogdGhlIHNlcnZlciBjb250cm9sIG9iamVjdAorICoKKyAqICBQcm9jZXNzZXMgdGhlIG1lc3NhZ2UgZnJvbSBjbGllbnQgYW5kIHByZXBhcmVzIGZvciBuZXh0CisgKiAgbWVzc2FnZS4KKyAqCisgKiAgUmV0dXJuOiA+PTAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqKi8KK3N0YXRpYyBpbnQzMl90IHR1bmVzZXJ2ZXJfcHJvY2Vzc19jbGllbnRfbWVzc2FnZSh2b2lkICpyZWN2X2J1ZmZlciwKKyAgdHVuaW5nc2VydmVyX3QgKnRzY3RybCkKK3sKKyAgaW50IHJjID0gMDsKKyAgdHVuZXNlcnZlcl9wcm90b2NvbF90ICpwID0gdHNjdHJsLT5wcm90bzsKKworICBzd2l0Y2ggKHRzY3RybC0+cHJvdG8tPm5leHRfcmVjdl9jb2RlKSB7CisgIGNhc2UgVFVORVNFUlZFUl9SRUNWX0NPTU1BTkQ6CisgICAgcC0+Y3VycmVudF9jbWQgPSAqKHVpbnQxNl90ICopcmVjdl9idWZmZXI7CisgICAgcC0+bmV4dF9yZWN2X2NvZGUgPSBUVU5FU0VSVkVSX1JFQ1ZfUEFZTE9BRF9TSVpFOworICAgIHAtPm5leHRfcmVjdl9sZW4gPSBzaXplb2YodWludDMyX3QpOworICAgIGJyZWFrOworCisgIGNhc2UgVFVORVNFUlZFUl9SRUNWX1BBWUxPQURfU0laRToKKyAgICBwLT5uZXh0X3JlY3ZfY29kZSA9IFRVTkVTRVJWRVJfUkVDVl9QQVlMT0FEOworICAgIHAtPm5leHRfcmVjdl9sZW4gPSAqKHVpbnQzMl90ICopcmVjdl9idWZmZXI7CisgICAgcC0+cmVjdl9sZW4gPSBwLT5uZXh0X3JlY3ZfbGVuOworICAgIGlmIChwLT5uZXh0X3JlY3ZfbGVuID4gVFVORVNFUlZFUl9NQVhfUkVDVikKKyAgICAgIHJldHVybiAtMTsKKyAgICBpZiAocC0+bmV4dF9yZWN2X2xlbiA9PSAwKSB7CisgICAgICBwLT5uZXh0X3JlY3ZfY29kZSA9IFRVTkVTRVJWRVJfUkVDVl9SRVNQT05TRTsKKyAgICAgIHAtPm5leHRfcmVjdl9sZW4gPSBzaXplb2YodWludDMyX3QpOworICAgIH0KKyAgICBicmVhazsKKworICBjYXNlIFRVTkVTRVJWRVJfUkVDVl9QQVlMT0FEOgorICAgIHAtPnJlY3ZfYnVmID0gbWFsbG9jKHAtPm5leHRfcmVjdl9sZW4pOworICAgIGlmICghcC0+cmVjdl9idWYpIHsKKyAgICAgIExPR0UoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IGZvciByZWN2X2J1ZiAlc1xuIiwKKyAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbWVtY3B5KHAtPnJlY3ZfYnVmLCByZWN2X2J1ZmZlciwgcC0+bmV4dF9yZWN2X2xlbik7CisgICAgcC0+bmV4dF9yZWN2X2NvZGUgPSBUVU5FU0VSVkVSX1JFQ1ZfUkVTUE9OU0U7CisgICAgcC0+bmV4dF9yZWN2X2xlbiA9IHNpemVvZih1aW50MzJfdCk7CisgICAgLypQcm9jZXNzIGN1cnJlbnQgY29tbWFuZCBhdCB0aGlzIHBvaW50Ki8KKyAgICBicmVhazsKKworICBjYXNlIFRVTkVTRVJWRVJfUkVDVl9SRVNQT05TRToKKyAgICBwLT5uZXh0X3JlY3ZfY29kZSA9IFRVTkVTRVJWRVJfUkVDVl9DT01NQU5EOworICAgIHAtPm5leHRfcmVjdl9sZW4gPSAyOworICAgIHAtPnNlbmRfbGVuID0gKih1aW50MzJfdCAqKXJlY3ZfYnVmZmVyOworICAgIHAtPnNlbmRfYnVmID0gIChjaGFyICopY2FsbG9jKHAtPnNlbmRfbGVuLCBzaXplb2YoY2hhciAqKSk7CisgICAgaWYgKCFwLT5zZW5kX2J1ZikgeworICAgICAgTE9HRSgiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgZm9yIHNlbmRfYnVmICVzXG4iLAorICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByYyA9IHR1bmVzZXJ2ZXJfcHJvY2Vzc19jb21tYW5kKHRzY3RybCwgcC0+c2VuZF9idWYsIHAtPnNlbmRfbGVuKTsKKyAgICBmcmVlKHAtPnJlY3ZfYnVmKTsKKyAgICBwLT5yZWN2X2J1ZiA9IE5VTEw7CisgICAgcC0+cmVjdl9sZW4gPSAwOworICAgIGJyZWFrOworCisgIGRlZmF1bHQ6CisgICAgTE9HRSgiIHAtPm5leHRfcmVjdl9jb2RlOiBkZWZhdWx0XG4iKTsKKyAgICByYyA9IC0xOworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJjOworfQorCisvKiogdHVuZXNlcnZlcl9hY2tfb25hY2NlcHRfaW5pdHByb3RvY29sCisgKiAgICBAdHNjdHJsOiB0aGUgc2VydmVyIGNvbnRyb2wgb2JqZWN0CisgKgorICogIEFja3MgYSBjb25uZWN0aW9uIGZyb20gdGhlIGNpZW50IGFuZCBzZXRzIHVwIHRoZQorICogIHByb3RvY29sIG9iamVjdCB0byBzdGFydCByZWNlaXZpbmcgY29tbWFuZHMuCisgKgorICogIFJldHVybjogPj0wIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCisgKiovCitzdGF0aWMgc3NpemVfdCB0dW5lc2VydmVyX2Fja19vbmFjY2VwdF9pbml0cHJvdG9jb2wodHVuaW5nc2VydmVyX3QgKnRzY3RybCkKK3sKKyAgc3NpemVfdCByYyA9IDA7CisgIHVpbnQzMl90IGFja19zdGF0dXM7CisKKyAgTE9HRSgic3RhcnRzXG4iKTsKKy8qCisgIGlmKHRzY3RybC0+Y2FtZXJhX3J1bm5pbmcpIHsKKyAgICBhY2tfc3RhdHVzID0gMTsKKyAgfSBlbHNlIHsKKyAgICBhY2tfc3RhdHVzID0gMjsKKyAgfQorKi8KKyAgYWNrX3N0YXR1cyA9IDE7CisKKyAgcmMgPSB0dW5lc2VydmVyX2FjaygxLCBhY2tfc3RhdHVzLCB0c2N0cmwpOworCisgIHRzY3RybC0+cHJvdG8gPSBtYWxsb2Moc2l6ZW9mKHR1bmVzZXJ2ZXJfcHJvdG9jb2xfdCkpOworICBpZiAoIXRzY3RybC0+cHJvdG8pIHsKKyAgICBMT0dFKCIgbWFsbG9jIHJldHVybnMgTlVMTCB3aXRoIGVycm9yICVzXG4iLCAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICB0c2N0cmwtPnByb3RvLT5jdXJyZW50X2NtZCAgICA9IDB4RkZGRjsKKyAgdHNjdHJsLT5wcm90by0+bmV4dF9yZWN2X2NvZGUgPSBUVU5FU0VSVkVSX1JFQ1ZfQ09NTUFORDsKKyAgdHNjdHJsLT5wcm90by0+bmV4dF9yZWN2X2xlbiAgPSAyOworICB0c2N0cmwtPnByb3RvLT5yZWN2X2J1ZiAgICAgICA9IE5VTEw7CisgIHRzY3RybC0+cHJvdG8tPnNlbmRfYnVmICAgICAgID0gTlVMTDsKKworICBMT0dEKCJYXG4iKTsKKworICByZXR1cm4gcmM7Cit9CisKKy8qKiB0dW5lc2VydmVyX2NoZWNrX3N0YXR1cworICogICAgQHRzY3RybDogdGhlIHNlcnZlciBjb250cm9sIG9iamVjdAorICoKKyAqICBDaGVja3MgaWYgY2FtZXJhIGlzIHJ1bm5pbmcgYW5kIHN0b3BzIGl0LgorICoKKyAqICBSZXR1cm46ID49MCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorICoqLworI2lmIDAKK3N0YXRpYyB2b2lkIHR1bmVzZXJ2ZXJfY2hlY2tfc3RhdHVzKHR1bmluZ3NlcnZlcl90ICp0c2N0cmwpCit7CisgIGlmICh0c2N0cmwtPmNhbWVyYV9ydW5uaW5nID09IDEpIHsKKyAgICAvKlRPRE86IFN0b3AgY2FtZXJhIGhlcmUqLworICAgIHR1bmVzZXJ2ZXJfc3RvcF9jYW0oJnRzY3RybC0+bGliX2hhbmRsZSk7CisgIH0KKyAgdHNjdHJsLT5jYW1lcmFfcnVubmluZyA9IDA7CisKKyAgdHVuZXNlcnZlcl9jbG9zZV9jYW0oJnRzY3RybC0+bGliX2hhbmRsZSk7Cit9CisjZW5kaWYKKworc3RhdGljIHNzaXplX3QgcHJldnNlcnZlcl9zZW5kX2NvbW1hbmRfcnNwKHR1bmluZ3NlcnZlcl90ICp0c2N0cmwsCisgIGNoYXIgKnNlbmRfYnVmLCB1aW50MzJfdCBzZW5kX2xlbikKK3sKKyAgc3NpemVfdCByYzsKKworICAvKiBzZW5kIGFjayBiYWNrIHRvIGNsaWVudCB1cG9uIHJlcSAqLworICBpZiAoc2VuZF9sZW4gPD0gMCkgeworICAgIExPR0UoIkludmFsaWQgc2VuZCBsZW4gXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKHNlbmRfYnVmID09IE5VTEwpIHsKKyAgICBMT0dFKCJJbnZhbGlkIHNlbmQgYnVmIFxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmMgPSBzZW5kKHRzY3RybC0+cHJfY2xpZW50c29ja2V0X2lkLCBzZW5kX2J1Ziwgc2VuZF9sZW4sIDApOworICBpZiAocmMgPCAwKSB7CisgICAgTE9HRSgiUlNQIHNlbmQgcmV0dXJucyBlcnJvciAlc1xuIiwgIHN0cmVycm9yKGVycm5vKSk7CisgIH0gZWxzZSB7CisgICAgcmMgPSAwOworICB9CisgIGlmIChzZW5kX2J1ZiAhPSBOVUxMKSB7CisgICAgZnJlZShzZW5kX2J1Zik7CisgICAgc2VuZF9idWYgPSBOVUxMOworICB9CisgIHJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgcHJldnNlcnZlcl9pbml0X3Byb3RvY29sKHR1bmluZ3NlcnZlcl90ICp0c2N0cmwpCit7CisgIHRzY3RybC0+cHJfcHJvdG8gPSBtYWxsb2Moc2l6ZW9mKHByc2VydmVyX3Byb3RvY29sX3QpKTsKKyAgaWYgKCF0c2N0cmwtPnByX3Byb3RvKSB7CisgICAgTE9HRSgiIG1hbGxvYyByZXR1cm5zIE5VTEwgd2l0aCBlcnJvciAlc1xuIiwKKyAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgdHNjdHJsLT5wcl9wcm90by0+Y3VycmVudF9jbWQgICAgPSAweEZGRkY7CisgIHRzY3RybC0+cHJfcHJvdG8tPm5leHRfcmVjdl9jb2RlID0gVFVORV9QUkVWX1JFQ1ZfQ09NTUFORDsKKyAgdHNjdHJsLT5wcl9wcm90by0+bmV4dF9yZWN2X2xlbiAgPSAyOworfQorCitzdGF0aWMgaW50MzJfdCBwcmV2c2VydmVyX3Byb2Nlc3NfY29tbWFuZCgKKyAgdHVuaW5nc2VydmVyX3QgKnRzY3RybCwgY2hhciAqKnNlbmRfYnVmLCB1aW50MzJfdCAqc2VuZF9sZW4pCit7CisgIHByc2VydmVyX3Byb3RvY29sX3QgKnAgPSB0c2N0cmwtPnByX3Byb3RvOworICBpbnQgcmVzdWx0ID0gMDsKKyAgZXp0dW5lX3ByZXZjbWRfcnNwICpyc3BfcHRyPU5VTEwsICpyc3BuX3B0cj1OVUxMLCAqaGVhZF9wdHI9TlVMTDsKKworICBMT0dEKCIgQ3VycmVudCBjb21tYW5kIGlzICVkXG4iLCAgcC0+Y3VycmVudF9jbWQpOworICBzd2l0Y2ggKHAtPmN1cnJlbnRfY21kKSB7CisgIGNhc2UgVFVORV9QUkVWX0dFVF9JTkZPOgorICAgIHJlc3VsdCA9IHR1bmVzZXJ2ZXJfcHJldmlld19nZXRpbmZvKHRzY3RybCwgc2VuZF9idWYsIHNlbmRfbGVuKTsKKyAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgTE9HRSgiIFJTUCBwcm9jZXNzaW5nIEZhaWxlZCBmb3IgY21kICVkXG4iLAorICAgICAgICBwLT5jdXJyZW50X2NtZCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJzcF9wdHIgPSAoZXp0dW5lX3ByZXZjbWRfcnNwICopKnNlbmRfYnVmOworICAgIGlmICgoIXJzcF9wdHIpIHx8ICghcnNwX3B0ci0+c2VuZF9idWYpKSB7CisgICAgICBMT0dFKCIgUlNQIHB0ciBpcyBOVUxMICVkXG4iLCAgcC0+Y3VycmVudF9jbWQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAocHJldnNlcnZlcl9zZW5kX2NvbW1hbmRfcnNwKHRzY3RybCwKKyAgICAgIHJzcF9wdHItPnNlbmRfYnVmLCByc3BfcHRyLT5zZW5kX2xlbikpIHsKKyAgICAgIExPR0UoIiBSU1AgRmFpbGVkIGZvciBUVU5FX1BSRVZfR0VUX0lORk8gdmVyIGNtZCAlZFxuIiwKKyAgICAgICAgcC0+Y3VycmVudF9jbWQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByc3BuX3B0ciA9IChlenR1bmVfcHJldmNtZF9yc3AgKilyc3BfcHRyLT5uZXh0OworICAgIGlmICgoIXJzcG5fcHRyKSB8fCAoIXJzcG5fcHRyLT5zZW5kX2J1ZikpIHsKKyAgICAgIExPR0UoIiBSU1AxIHB0ciBpcyBOVUxMICVkXG4iLCAgcC0+Y3VycmVudF9jbWQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAocHJldnNlcnZlcl9zZW5kX2NvbW1hbmRfcnNwKHRzY3RybCwKKyAgICAgICAgcnNwbl9wdHItPnNlbmRfYnVmLCByc3BuX3B0ci0+c2VuZF9sZW4pKSB7CisgICAgICBMT0dFKCIgUlNQIEZhaWxlZCBmb3IgVFVORV9QUkVWX0dFVF9JTkZPIGNhcHMgY21kICVkXG4iLAorICAgICAgICBwLT5jdXJyZW50X2NtZCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZyZWUocnNwbl9wdHIpOworICAgIGZyZWUocnNwX3B0cik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUVU5FX1BSRVZfQ0hfQ05LX1NJWkU6CisgICAgcmVzdWx0ID0gdHVuZXNlcnZlcl9wcmV2aWV3X2dldGNodW5rc2l6ZSh0c2N0cmwsIHNlbmRfYnVmLCBzZW5kX2xlbik7CisgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgIExPR0UoIiBSU1AgcHJvY2Vzc2luZyBGYWlsZWQgZm9yIGNtZCAlZFxuIiwgIHAtPmN1cnJlbnRfY21kKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHByZXZzZXJ2ZXJfc2VuZF9jb21tYW5kX3JzcCh0c2N0cmwsICpzZW5kX2J1ZiwgKnNlbmRfbGVuKSkgeworICAgICAgTE9HRSgiIFJTUCBGYWlsZWQgZm9yIFRVTkVfUFJFVl9DSF9DTktfU0laRSBjbWQgJWRcbiIsCisgICAgICAgIHAtPmN1cnJlbnRfY21kKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgY2FzZSBUVU5FX1BSRVZfR0VUX1BSRVZfRlJBTUU6CisgICAgcmVzdWx0ID0gdHVuZXNlcnZlcl9wcmV2aWV3X2dldGZyYW1lKHRzY3RybCwgc2VuZF9idWYsIHNlbmRfbGVuKTsKKyAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgTE9HRSgiIFJTUCBwcm9jZXNzaW5nIEZhaWxlZCBmb3IgY21kICVkXG4iLCAgcC0+Y3VycmVudF9jbWQpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByc3BfcHRyID0gKGV6dHVuZV9wcmV2Y21kX3JzcCAqKSpzZW5kX2J1ZjsKKyAgICBpZiAoKCFyc3BfcHRyKSB8fCAoIXJzcF9wdHItPnNlbmRfYnVmKSkgeworICAgICAgTE9HRSgiIFJTUCBwdHIgaXMgTlVMTCAlZFxuIiwgIHAtPmN1cnJlbnRfY21kKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaGVhZF9wdHIgPSByc3BfcHRyOworCisgICAgd2hpbGUgKHJzcF9wdHIgIT0gTlVMTCkgeworICAgICAgaWYgKCghcnNwX3B0cikgfHwgKCFyc3BfcHRyLT5zZW5kX2J1ZikpIHsKKyAgICAgICAgTE9HRSgiIFJTUCBwdHIgaXMgTlVMTCAlZFxuIiwgIHAtPmN1cnJlbnRfY21kKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKHByZXZzZXJ2ZXJfc2VuZF9jb21tYW5kX3JzcCh0c2N0cmwsCisgICAgICAgIHJzcF9wdHItPnNlbmRfYnVmLCByc3BfcHRyLT5zZW5kX2xlbikpIHsKKyAgICAgICAgTE9HRSgiIFJTUCBGYWlsZWQgZm9yIFRVTkVfUFJFVl9HRVRfSU5GTyB2ZXIgY21kICVkXG4iLAorICAgICAgICAgIHAtPmN1cnJlbnRfY21kKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgcnNwX3B0ciA9IChlenR1bmVfcHJldmNtZF9yc3AgKilyc3BfcHRyLT5uZXh0OworICAgIH0KKyAgICByZWxlYXNlX2V6dHVuZV9wcmV2Y21kX3JzcChoZWFkX3B0cik7CisgICAgYnJlYWs7CisKKyAgY2FzZSBUVU5FX1BSRVZfR0VUX0pQR19TTkFQOgorICBjYXNlIFRVTkVfUFJFVl9HRVRfUkFXX1NOQVA6CisgIGNhc2UgVFVORV9QUkVWX0dFVF9SQVdfUFJFVjoKKyAgICByZXN1bHQgPSB0dW5lc2VydmVyX3ByZXZpZXdfdW5zdXBwb3J0ZWQodHNjdHJsLCBzZW5kX2J1Ziwgc2VuZF9sZW4pOworICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgTE9HRSgiUlNQIHByb2Nlc3NpbmcgRmFpbGVkIGZvciBjbWQgJWRcbiIsICBwLT5jdXJyZW50X2NtZCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChwcmV2c2VydmVyX3NlbmRfY29tbWFuZF9yc3AodHNjdHJsLCAqc2VuZF9idWYsICpzZW5kX2xlbikpIHsKKyAgICAgIExPR0UoIlJTUCBGYWlsZWQgZm9yIFVOU1VQUE9SVEVEIGNtZCAlZFxuIiwgIHAtPmN1cnJlbnRfY21kKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgZGVmYXVsdDoKKyAgICBMT0dFKCIgcC0+Y3VycmVudF9jbWQ6IGRlZmF1bHRcbiIpOworICAgIHJlc3VsdCA9IC0xOworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqIHByZXZpZXdzZXJ2ZXJfcHJvY2Vzc19jbGllbnRfbWVzc2FnZQorICogICAgQHJlY3ZfYnVmZmVyOiByZWNlaXZlZCBtZXNzYWdlIGZyb20gdGhlIGNsaWVudAorICogICAgQHRzY3RybDogdGhlIHNlcnZlciBjb250cm9sIG9iamVjdAorICoKKyAqICBQcm9jZXNzZXMgdGhlIG1lc3NhZ2UgZnJvbSBjbGllbnQgYW5kIHByZXBhcmVzIGZvciBuZXh0CisgKiAgbWVzc2FnZS4KKyAqCisgKiAgUmV0dXJuOiA+PTAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKyAqKi8KK3N0YXRpYyBpbnQzMl90IHByZXZzZXJ2ZXJfcHJvY2Vzc19jbGllbnRfbWVzc2FnZSh2b2lkICpyZWN2X2J1ZmZlciwKKyAgdHVuaW5nc2VydmVyX3QgKnRzY3RybCkKK3sKKyAgaW50IHJjID0gMDsKKyAgcHJzZXJ2ZXJfcHJvdG9jb2xfdCAqcCA9IHRzY3RybC0+cHJfcHJvdG87CisKKyAgTE9HRCgiY29tbWFuZCA9ICVkIiwgcC0+bmV4dF9yZWN2X2NvZGUpOworCisgIHN3aXRjaCAocC0+bmV4dF9yZWN2X2NvZGUpIHsKKyAgY2FzZSBUVU5FX1BSRVZfUkVDVl9DT01NQU5EOgorICAgIHAtPmN1cnJlbnRfY21kID0gKih1aW50MTZfdCAqKXJlY3ZfYnVmZmVyOworICAgIGlmKHAtPmN1cnJlbnRfY21kICE9IFRVTkVfUFJFVl9DSF9DTktfU0laRSkgeworICAgICAgcmMgPSBwcmV2c2VydmVyX3Byb2Nlc3NfY29tbWFuZCh0c2N0cmwsCisgICAgICAgICZwLT5zZW5kX2J1ZiwgKHVpbnQzMl90ICopJnAtPnNlbmRfbGVuKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwLT5uZXh0X3JlY3ZfY29kZSA9IFRVTkVfUFJFVl9SRUNWX05FV0NOS1NJWkU7CisgICAgcC0+bmV4dF9yZWN2X2xlbiA9IHNpemVvZih1aW50MzJfdCk7CisgICAgTE9HRCgiVFVORV9QUkVWX0NPTU1BTkQgWFxuIik7CisgICAgYnJlYWs7CisgIGNhc2UgVFVORV9QUkVWX1JFQ1ZfTkVXQ05LU0laRToKKyAgICBwLT5uZXdfY25rX3NpemUgPSAqKHVpbnQzMl90ICopcmVjdl9idWZmZXI7CisgICAgcC0+bmV4dF9yZWN2X2NvZGUgPSBUVU5FX1BSRVZfUkVDVl9DT01NQU5EOworICAgIHAtPm5leHRfcmVjdl9sZW4gID0gMjsKKyAgICByYyA9IHByZXZzZXJ2ZXJfcHJvY2Vzc19jb21tYW5kKHRzY3RybCwKKyAgICAgICZwLT5zZW5kX2J1ZiwgKHVpbnQzMl90ICopJnAtPnNlbmRfbGVuKTsKKyAgICBicmVhazsKKyAgZGVmYXVsdDoKKyAgICBMT0dFKCJwcmV2X3Byb2MtPm5leHRfcmVjdl9jb2RlOiBkZWZhdWx0XG4iKTsKKyAgICByYyA9IC0xOworICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIHJjOworfQorCisvKiogdHVubmluZ19zZXJ2ZXJfc29ja2V0X2xpc3RlbgorICogICAgQGlwX2FkZHI6IHRoZSBpcCBhZGRyIHRvIGxpc3RlbgorICogICAgQHBvcnQ6IHRoZSBwb3J0IHRvIGxpc3RlbgorICoKKyAqICBTZXR1cCBhIGxpc3RlbiBzb2NrZXQgZm9yIGV6dHVuZS4KKyAqCisgKiAgUmV0dXJuOiA+MCBvbiBzdWNjZXNzLCA8PTAgb24gZmFpbHVyZS4KKyAqKi8KK2ludCB0dW5uaW5nX3NlcnZlcl9zb2NrZXRfbGlzdGVuKGNvbnN0IGNoYXIqIGlwX2FkZHIsIHVpbnQxNl90IHBvcnQpCit7CisgIGludCBzb2NrX2ZkID0gLTE7CisgIG1tX3FjYW1lcmFfc29ja19hZGRyX3Qgc2VydmVyX2FkZHI7CisgIGludCByZXN1bHQ7CisgIGludCBvcHRpb247CisgIGludCBzb2NrZXRfZmxhZzsKKworICBtZW1zZXQoJnNlcnZlcl9hZGRyLCAwLCBzaXplb2Yoc2VydmVyX2FkZHIpKTsKKyAgc2VydmVyX2FkZHIuYWRkcl9pbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgc2VydmVyX2FkZHIuYWRkcl9pbi5zaW5fcG9ydCA9IChfX2JlMTYpIGh0b25zKHBvcnQpOworICBzZXJ2ZXJfYWRkci5hZGRyX2luLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihpcF9hZGRyKTsKKworICBpZiAoc2VydmVyX2FkZHIuYWRkcl9pbi5zaW5fYWRkci5zX2FkZHIgPT0gSU5BRERSX05PTkUpIHsKKyAgICBMT0dFKCIgaW52YWxpZCBhZGRyZXNzLlxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogQ3JlYXRlIGFuIEFGX0lORVQgc3RyZWFtIHNvY2tldCB0byByZWNlaXZlIGluY29taW5nIGNvbm5lY3Rpb24gT04gKi8KKyAgc29ja19mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisgIGlmIChzb2NrX2ZkIDwgMCkgeworICAgIExPR0UoIiBzb2NrZXQgZmFpbGVkXG4iKTsKKyAgICByZXR1cm4gc29ja19mZDsKKyAgfQorCisgIC8vIHNldCBsaXN0ZW4gc29ja2V0IHRvIG5vbi1ibG9jaywgYnV0IHdoeT8/CisgIHNvY2tldF9mbGFnID0gZmNudGwoc29ja19mZCwgRl9HRVRGTCwgMCk7CisgIGZjbnRsKHNvY2tfZmQsIEZfU0VURkwsIHNvY2tldF9mbGFnIHwgT19OT05CTE9DSyk7CisKKyAgLyogcmV1c2UgaW4gY2FzZSBpdCBpcyBpbiB0aW1lb3V0ICovCisgIG9wdGlvbiA9IDE7CisgIHJlc3VsdCA9IHNldHNvY2tvcHQoc29ja19mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLAorICAgICZvcHRpb24sIHNpemVvZihvcHRpb24pKTsKKworICBpZiAocmVzdWx0IDwgMCkgeworICAgIExPR0UoImV6dHVuZSBzZXRzb2Nrb3B0IGZhaWxlZCIpOworICAgIGNsb3NlKHNvY2tfZmQpOworICAgIHNvY2tfZmQgPSAtMTsKKyAgICByZXR1cm4gc29ja19mZDsKKyAgfQorCisgIHJlc3VsdCA9IGJpbmQoc29ja19mZCwgJnNlcnZlcl9hZGRyLmFkZHIsIHNpemVvZihzZXJ2ZXJfYWRkci5hZGRyX2luKSk7CisgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgTE9HRSgiZXp0dW5lIHNvY2tldCBiaW5kIGZhaWxlZCIpOworICAgIGNsb3NlKHNvY2tfZmQpOworICAgIHNvY2tfZmQgPSAtMTsKKyAgICByZXR1cm4gc29ja19mZDsKKyAgfQorCisgIHJlc3VsdCA9IGxpc3Rlbihzb2NrX2ZkLCAxKTsKKyAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICBMT0dFKCJlenR1bmUgc29ja2V0IGxpc3RlbiBmYWlsZWQiKTsKKyAgICBjbG9zZShzb2NrX2ZkKTsKKyAgICBzb2NrX2ZkID0gLTE7CisgICAgcmV0dXJuIHNvY2tfZmQ7CisgIH0KKworICBMT0dIKCJzb2NrX2ZkOiAlZCwgbGlzdGVuIGF0IHBvcnQ6ICVkXG4iLCAgc29ja19mZCwgcG9ydCk7CisKKyAgcmV0dXJuIHNvY2tfZmQ7Cit9CisKKy8qKiBtYWluCisgKgorICogIENyZWF0ZXMgdGhlIHNlcnZlciwgYW5kIHN0YXJ0cyB3YWl0aW5nIGZvcgorICogIGNvbm5lY3Rpb25zL21lc3NhZ2VzIGZyb20gYSBwcm9zcGVjdGl2ZQorICogIGNsaWVudAorICoKKyAqKi8KK3ZvaWQgKmV6dHVuZV9wcm9jKHZvaWQgKmRhdGEpCit7CisgIGludCBzZXJ2ZXJfc29ja2V0ID0gLTEsIGNsaWVudF9zb2NrZXQgPSAtMTsKKyAgaW50IHByZXZfc2VydmVyX3NvY2tldCA9IC0xLCBwcmV2X2NsaWVudF9zb2NrZXQgPSAtMTsKKworICBtbV9xY2FtZXJhX3NvY2tfYWRkcl90IGFkZHJfY2xpZW50X2luZXQ7CisgIHNvY2tsZW5fdCBhZGRyX2NsaWVudF9sZW4gPSBzaXplb2YoYWRkcl9jbGllbnRfaW5ldC5hZGRyX2luKTsKKyAgaW50IHJlc3VsdDsKKyAgZmRfc2V0IHRzZmRzOworICBpbnQgbnVtX2ZkcyA9IDA7CisgIHNzaXplX3QgcmVjdl9ieXRlczsKKyAgY2hhciBidWZbVFVORVNFUlZFUl9NQVhfUkVDVl07CisKKyAgbW1fY2FtZXJhX2xpYl9oYW5kbGUgKmxpYl9oYW5kbGUgPSAobW1fY2FtZXJhX2xpYl9oYW5kbGUgKilkYXRhOworCisgIExPR0UoIj4+PiBTdGFydGluZyB0dW5lIHNlcnZlciA8PDwgXG4iKTsKKworICAvLyBmb3IgZXp0dW5lIGNocm9tYXRpeCBwYXJhbXMKKyAgc2VydmVyX3NvY2tldCA9IHR1bm5pbmdfc2VydmVyX3NvY2tldF9saXN0ZW4oSVBfQUREUiwgVFVOSU5HX0NIUk9NQVRJWF9QT1JUKTsKKyAgaWYgKHNlcnZlcl9zb2NrZXQgPD0gMCkgeworICAgIExPR0UoIltFUlJdIGZhaWwgdG8gc2V0dXAgbGlzdGVuIHNvY2tldCBmb3IgZXp0dW5lIGNocm9tYXRpeCBwYXJtcy4uLiIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHByZXZfc2VydmVyX3NvY2tldCA9IHR1bm5pbmdfc2VydmVyX3NvY2tldF9saXN0ZW4oSVBfQUREUiwgVFVOSU5HX1BSRVZJRVdfUE9SVCk7CisgIGlmIChwcmV2X3NlcnZlcl9zb2NrZXQgPD0gMCkgeworICAgIExPR0UoIltFUlJdIGZhaWwgdG8gc2V0dXAgbGlzdGVuIHNvY2tldCBmb3IgZXp0dW5lIHByZXZpZXcuLi5cbiIpOworICAgIHJldHVybiBOVUxMOworICB9CisgIG51bV9mZHMgPSBUVU5FU0VSVkVSX01BWChzZXJ2ZXJfc29ja2V0LCBwcmV2X3NlcnZlcl9zb2NrZXQpOworICBMT0dIKCJudW1fZmRzID0gJWRcbiIsIG51bV9mZHMpOworCisgIGRvIHsKKyAgICBGRF9aRVJPKCZ0c2Zkcyk7CisgICAgRkRfU0VUKHNlcnZlcl9zb2NrZXQsICZ0c2Zkcyk7CisgICAgRkRfU0VUKHByZXZfc2VydmVyX3NvY2tldCwgJnRzZmRzKTsKKyAgICBpZiAoY2xpZW50X3NvY2tldCA+IDApIHsKKyAgICAgIEZEX1NFVChjbGllbnRfc29ja2V0LCAmdHNmZHMpOworICAgIH0KKyAgICBpZiAocHJldl9jbGllbnRfc29ja2V0ID4gMCkgeworICAgICAgRkRfU0VUKCBwcmV2X2NsaWVudF9zb2NrZXQsICZ0c2Zkcyk7CisgICAgfQorCisgICAgLyogbm8gdGltZW91dCAqLworICAgIHJlc3VsdCA9IHNlbGVjdChudW1fZmRzICsgMSwgJnRzZmRzLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgTE9HRSgic2VsZWN0IGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqKiAoMSkgQ0hST01BVElYIFNFUlZFUgorICAgICAqLworICAgIGlmIChGRF9JU1NFVChzZXJ2ZXJfc29ja2V0LCAmdHNmZHMpKSB7CisgICAgICBMT0dEKCJSZWNlaXZpbmcgTmV3IGNsaWVudCBjb25uZWN0aW9uXG4iKTsKKworICAgICAgY2xpZW50X3NvY2tldCA9IGFjY2VwdChzZXJ2ZXJfc29ja2V0LAorICAgICAgICAmYWRkcl9jbGllbnRfaW5ldC5hZGRyLCAmYWRkcl9jbGllbnRfbGVuKTsKKyAgICAgIGlmIChjbGllbnRfc29ja2V0ID09IC0xKSB7CisgICAgICAgIExPR0UoImFjY2VwdCBmYWlsZWQgJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKGNsaWVudF9zb2NrZXQgPj0gRkRfU0VUU0laRSkgeworICAgICAgICBMT0dFKCJjbGllbnRfc29ja2V0IGlzIG91dCBvZiByYW5nZS4gY2xpZW50X3NvY2tldD0lZCIsY2xpZW50X3NvY2tldCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBMT0dFKCJhY2NlcHQgYSBuZXcgY29ubmVjdCBvbiA1NTU1NSwgc2QoJWQpXG4iLCBjbGllbnRfc29ja2V0KTsKKyAgICAgIG51bV9mZHMgPSBUVU5FU0VSVkVSX01BWChudW1fZmRzLCBjbGllbnRfc29ja2V0KTsKKworICAgICAgLy8gb3BlbiBjYW1lcmEgYW5kIGdldCBoYW5kbGUgLSB0aGlzIGlzIG5lZWRlZCB0bworICAgICAgLy8gYmUgYWJsZSB0byBzZXQgcGFyYW1ldGVycyB3aXRob3V0IHN0YXJ0aW5nCisgICAgICAvLyBwcmV2aWV3IHN0cmVhbQorICAgICAgLyppZiAoIXRzY3RybC5jYW1lcmFfcnVubmluZykgeworICAgICAgICByZXN1bHQgPSB0dW5lc2VydmVyX29wZW5fY2FtKCZ0c2N0cmwubGliX2hhbmRsZSwgJnRzY3RybCk7CisgICAgICAgIGlmKHJlc3VsdCkgeworICAgICAgICAgIHByaW50ZigiXG4gQ2FtZXJhIE9wZW4gRmFpbCAhISEgXG4iKTsKKyAgICAgICAgICBjbG9zZShzZXJ2ZXJfc29ja2V0KTsKKyAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgICB9Ki8KKyAgICAgIHJlc3VsdCA9IHR1bmVzZXJ2ZXJfb3Blbl9jYW0obGliX2hhbmRsZSk7CisgICAgICBpZihyZXN1bHQpIHsKKyAgICAgICAgTE9HRSgiXG4gVHVuaW5nIExpYnJhcnkgb3BlbiBmYWlsZWQhISFcbiIpOworICAgICAgICBjbG9zZShzZXJ2ZXJfc29ja2V0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgICBsaWJfaGFuZGxlLT50c2N0cmwuY2xpZW50c29ja2V0X2lkID0gY2xpZW50X3NvY2tldDsKKyAgICAgIGlmICh0dW5lc2VydmVyX2Fja19vbmFjY2VwdF9pbml0cHJvdG9jb2woJmxpYl9oYW5kbGUtPnRzY3RybCkgPCAwKSB7CisgICAgICAgIExPR0UoIiBFcnJvciB3aGlsZSBhY2tpbmdcbiIpOworICAgICAgICBjbG9zZShjbGllbnRfc29ja2V0KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB0dW5lc2VydmVyX2luaXRpYWxpemVfdHVuaW5ncChsaWJfaGFuZGxlLCBjbGllbnRfc29ja2V0LAorICAgICAgICBsaWJfaGFuZGxlLT50c2N0cmwucHJvdG8tPnNlbmRfYnVmLCBsaWJfaGFuZGxlLT50c2N0cmwucHJvdG8tPnNlbmRfbGVuKTsKKyAgICB9CisKKyAgICBpZiAoKGNsaWVudF9zb2NrZXQgPCBGRF9TRVRTSVpFKSAmJiAoRkRfSVNTRVQoY2xpZW50X3NvY2tldCwgJnRzZmRzKSkpIHsKKyAgICAgIGlmIChsaWJfaGFuZGxlLT50c2N0cmwucHJvdG8gPT0gTlVMTCkgeworICAgICAgICBMT0dFKCIgQ2Fubm90IHJlY2VpdmUgbXNnIHdpdGhvdXQgY29ubmVjdFxuIik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKlJlY2VpdmUgbWVzc2FnZSBhbmQgcHJvY2VzcyBpdCovCisgICAgICByZWN2X2J5dGVzID0gcmVjdihjbGllbnRfc29ja2V0LCAodm9pZCAqKWJ1ZiwKKyAgICAgICAgbGliX2hhbmRsZS0+dHNjdHJsLnByb3RvLT5uZXh0X3JlY3ZfbGVuLCAwKTsKKyAgICAgIExPR0QoIlJlY2VpdmUgJWxsZCBieXRlcyBcbiIsIChsb25nIGxvbmcgaW50KSByZWN2X2J5dGVzKTsKKworICAgICAgaWYgKHJlY3ZfYnl0ZXMgPT0gLTEpIHsKKyAgICAgICAgTE9HRSgiIFJlY2VpdmUgZmFpbGVkIHdpdGggZXJyb3IgJXNcbiIsICBzdHJlcnJvcihlcnJubykpOworICAgICAgICAvL3R1bmVzZXJ2ZXJfY2hlY2tfc3RhdHVzKCZ0c2N0cmwpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0gZWxzZSBpZiAocmVjdl9ieXRlcyA9PSAwKSB7CisgICAgICAgIExPR0UoImNvbm5lY3Rpb24gaGFzIGJlZW4gdGVybWluYXRlZFxuIik7CisKKyAgICAgICAgdHVuZXNlcnZlcl9kZWluaXRpYWxpemVfdHVuaW5ncCgmbGliX2hhbmRsZS0+dHNjdHJsLCBjbGllbnRfc29ja2V0LAorICAgICAgICAgIGxpYl9oYW5kbGUtPnRzY3RybC5wcm90by0+c2VuZF9idWYsCisgICAgICAgICAgbGliX2hhbmRsZS0+dHNjdHJsLnByb3RvLT5zZW5kX2xlbik7CisgICAgICAgIGZyZWUobGliX2hhbmRsZS0+dHNjdHJsLnByb3RvKTsKKyAgICAgICAgbGliX2hhbmRsZS0+dHNjdHJsLnByb3RvID0gTlVMTDsKKworICAgICAgICBjbG9zZShjbGllbnRfc29ja2V0KTsKKyAgICAgICAgY2xpZW50X3NvY2tldCA9IC0xOworICAgICAgICAvL3R1bmVzZXJ2ZXJfY2hlY2tfc3RhdHVzKCZ0c2N0cmwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HRCgiIFByb2Nlc3Npbmcgc29ja2V0IGNvbW1hbmRcbiIpOworCisgICAgICAgIHJlc3VsdCA9IHR1bmVzZXJ2ZXJfcHJvY2Vzc19jbGllbnRfbWVzc2FnZShidWYsICZsaWJfaGFuZGxlLT50c2N0cmwpOworCisgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgTE9HRSgiUHJvdG9jb2wgdmlvbGF0ZWRcbiIpOworCisgICAgICAgICAgZnJlZShsaWJfaGFuZGxlLT50c2N0cmwucHJvdG8pOworICAgICAgICAgIGxpYl9oYW5kbGUtPnRzY3RybC5wcm90byA9IE5VTEw7CisKKyAgICAgICAgICBjbG9zZShjbGllbnRfc29ja2V0KTsKKyAgICAgICAgICBjbGllbnRfc29ja2V0ID0gLTE7CisgICAgICAgICAgLy90dW5lc2VydmVyX2NoZWNrX3N0YXR1cygmdHNjdHJsKTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICoqICgyKSBQUkVWSUVXIFNFUlZFUgorICAgICAqLworICAgIGlmIChGRF9JU1NFVChwcmV2X3NlcnZlcl9zb2NrZXQsICZ0c2ZkcykpIHsKKyAgICAgIExPR0QoIlJlY2VpdmluZyBOZXcgUHJldmlldyBjbGllbnQgY29ubmVjdGlvblxuIik7CisKKyAgICAgIHByZXZfY2xpZW50X3NvY2tldCA9IGFjY2VwdChwcmV2X3NlcnZlcl9zb2NrZXQsCisgICAgICAgICZhZGRyX2NsaWVudF9pbmV0LmFkZHIsICZhZGRyX2NsaWVudF9sZW4pOworICAgICAgaWYgKHByZXZfY2xpZW50X3NvY2tldCA9PSAtMSkgeworICAgICAgICBMT0dFKCJhY2NlcHQgZmFpbGVkICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAocHJldl9jbGllbnRfc29ja2V0ID49IEZEX1NFVFNJWkUpIHsKKyAgICAgICAgTE9HRSgicHJldl9jbGllbnRfc29ja2V0IGlzIG91dCBvZiByYW5nZS4gcHJldl9jbGllbnRfc29ja2V0PSVkIixwcmV2X2NsaWVudF9zb2NrZXQpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgbGliX2hhbmRsZS0+dHNjdHJsLnByX2NsaWVudHNvY2tldF9pZCA9IHByZXZfY2xpZW50X3NvY2tldDsKKworICAgICAgTE9HRCgiQWNjZXB0ZWQgYSBuZXcgY29ubmVjdGlvbiwgZmQoJWQpXG4iLCBwcmV2X2NsaWVudF9zb2NrZXQpOworICAgICAgbnVtX2ZkcyA9IFRVTkVTRVJWRVJfTUFYKG51bV9mZHMsIHByZXZfY2xpZW50X3NvY2tldCk7CisKKyAgICAgIC8vIHN0YXJ0IGNhbWVyYQorICAgICAgLyppZiAoIXRzY3RybC5jYW1lcmFfcnVubmluZykgeworICAgICAgICByZXN1bHQgPSAwOworICAgICAgICByZXN1bHQgPSB0dW5lc2VydmVyX29wZW5fY2FtKCZ0c2N0cmwubGliX2hhbmRsZSwgJnRzY3RybCk7CisgICAgICAgIGlmKHJlc3VsdCkgeworICAgICAgICAgIHByaW50ZigiXG4gQ2FtZXJhIE9wZW4gRmFpbCAhISEgXG4iKTsKKyAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgICB9Ki8KKyAgICAgIGNhbV9kaW1lbnNpb25fdCBkaW07CisgICAgICAvL2RpbS53aWR0aCA9IGxpYl9oYW5kbGUtPnRlc3Rfb2JqLmJ1ZmZlcl93aWR0aDsKKyAgICAgIC8vZGltLmhlaWdodCA9IGxpYl9oYW5kbGUtPnRlc3Rfb2JqLmJ1ZmZlcl9oZWlnaHQ7CisgICAgICBkaW0ud2lkdGggPSBERUZBVUxUX1BSRVZJRVdfV0lEVEg7CisgICAgICBkaW0uaGVpZ2h0ID0gREVGQVVMVF9QUkVWSUVXX0hFSUdIVDsKKworICAgICAgTE9HRCgicHJldmlldyBkaW1lbnNpb24gaW5mbzogdyglZCksIGgoJWQpXG4iLCBkaW0ud2lkdGgsIGRpbS5oZWlnaHQpOworICAgICAgLy8gd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCBjYW1lcmEgaXMgcnVubmluZywgYmVmb3JlIGluaXQgY29ubmVjdGlvbiwKKyAgICAgIC8vIGJlY2F1c2Ugd2UgbmVlZCB0byBrbm93IHRoZSBmcmFtZSBzaXplIGZvciBhbGxvY2F0aW5nIHRoZSBtZW1vcnkuCisgICAgICBwcmV2c2VydmVyX2luaXRfcHJvdG9jb2woJmxpYl9oYW5kbGUtPnRzY3RybCk7CisKKyAgICAgIHJlc3VsdCA9IHR1bmVzZXJ2ZXJfaW5pdGlhbGl6ZV9wcmV2dHVuaW5ncChsaWJfaGFuZGxlLCBwcmV2X2NsaWVudF9zb2NrZXQsCisgICAgICAgIGRpbSwgKGNoYXIgKiopJmxpYl9oYW5kbGUtPnRzY3RybC5wcm90by0+c2VuZF9idWYsCisgICAgICAgICZsaWJfaGFuZGxlLT50c2N0cmwucHJvdG8tPnNlbmRfbGVuKTsKKyAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgIExPR0UoInR1bmVzZXJ2ZXJfaW5pdGlhbGl6ZV9wcmV2dHVuaW5ncCBlcnJvciEiKTsKKyAgICAgICAgY2xvc2UocHJldl9jbGllbnRfc29ja2V0KTsKKyAgICAgICAgcHJldl9jbGllbnRfc29ja2V0ID0gLTE7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKChwcmV2X2NsaWVudF9zb2NrZXQgPCBGRF9TRVRTSVpFKSAmJiAoRkRfSVNTRVQocHJldl9jbGllbnRfc29ja2V0LCAmdHNmZHMpKSkgeworICAgICAgcmVjdl9ieXRlcyA9IHJlY3YocHJldl9jbGllbnRfc29ja2V0LCAodm9pZCAqKWJ1ZiwKKyAgICAgICAgbGliX2hhbmRsZS0+dHNjdHJsLnByX3Byb3RvLT5uZXh0X3JlY3ZfbGVuLCAwKTsKKworICAgICAgTE9HRCgicHJldl9jbGllbnRfc29ja2V0PSVkXG4iLCAgcHJldl9jbGllbnRfc29ja2V0KTsKKyAgICAgIExPR0QoIm5leHRfcmVjdl9sZW49JWRcbiIsICBidWZbMF0rYnVmWzFdKjI1Nik7CisKKyAgICAgIGlmIChyZWN2X2J5dGVzIDw9IDApIHsKKyAgICAgICAgaWYgKHJlY3ZfYnl0ZXMgPT0gMCkgeworICAgICAgICAgIExPR0UoImNsaWVudCBjbG9zZSB0aGUgY29ubmVjdGlvbi5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIExPR0UoInJlY2VpdmUgZXJyb3I6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICB9CisKKyAgICAgICAgLy90dW5lc2VydmVyX2NoZWNrX3N0YXR1cygmdHNjdHJsKTsKKyAgICAgICAgLy8gaWYgcmVjdiBlcnJvciwgd2Ugc2hvdWxkIGNsb3NlIHRoZSBjb25uZWN0aW9uLCBmcmVlIHRoZSBwcm90byBkYXRhLAorICAgICAgICAvLyBBTkQgd2FpdCBmb3IgYSBuZXcgY29ubmVjdG9uLi4KKyAgICAgICAgLy8gY2xvc2VfY29ubmVjdGlvbigpOworICAgICAgICAvLyBzdG9wX2NhbWVyYSgpCisgICAgICAgIC8vIGNsZWFudXBfcHJvdG9fZGF0YSgpOworICAgICAgICB0dW5lc2VydmVyX2RlaW5pdGlhbGl6ZV9wcmV2dHVuaW5ncCgmbGliX2hhbmRsZS0+dHNjdHJsLAorICAgICAgICAgIChjaGFyICoqKSZsaWJfaGFuZGxlLT50c2N0cmwucHJvdG8tPnNlbmRfYnVmLAorICAgICAgICAgICZsaWJfaGFuZGxlLT50c2N0cmwucHJvdG8tPnNlbmRfbGVuKTsKKyAgICAgICAgY2xvc2UocHJldl9jbGllbnRfc29ja2V0KTsKKyAgICAgICAgcHJldl9jbGllbnRfc29ja2V0ID0gLTE7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBwcmV2c2VydmVyX3Byb2Nlc3NfY2xpZW50X21lc3NhZ2UoKHZvaWQgKilidWYsCisgICAgICAgICAgJmxpYl9oYW5kbGUtPnRzY3RybCk7CisgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgTE9HRSgiUHJvdG9jb2wgdmlvbGF0ZWRcbiIpOworCisgICAgICAgICAgLy9mcmVlKHRzY3RybC0+cHJlaXZld19wcm90byk7CisgICAgICAgICAgLy9mcmVlKHRzY3RybCk7CisgICAgICAgICAgLy9tYXhfZmQgPSBlenRfcGFybXNfbGlzdGVuX3NkICsgMTsKKyAgICAgICAgICB0dW5lc2VydmVyX2RlaW5pdGlhbGl6ZV9wcmV2dHVuaW5ncCgmbGliX2hhbmRsZS0+dHNjdHJsLAorICAgICAgICAgICAgKGNoYXIgKiopJmxpYl9oYW5kbGUtPnRzY3RybC5wcm90by0+c2VuZF9idWYsCisgICAgICAgICAgICAmbGliX2hhbmRsZS0+dHNjdHJsLnByb3RvLT5zZW5kX2xlbik7CisgICAgICAgICAgY2xvc2UocHJldl9jbGllbnRfc29ja2V0KTsKKyAgICAgICAgICBwcmV2X2NsaWVudF9zb2NrZXQgPSAtMTsKKyAgICAgICAgICAvL3R1bmVzZXJ2ZXJfY2hlY2tfc3RhdHVzKCZ0c2N0cmwpOworICAgICAgICB9CisgICAgICAgIC8vc2xlZXAoMSk7CisgICAgICB9CisgICAgfQorICB9IHdoaWxlICgxKTsKKworICBpZiAoc2VydmVyX3NvY2tldCA+PSAwKSB7CisgICAgY2xvc2Uoc2VydmVyX3NvY2tldCk7CisgIH0KKyAgaWYgKGNsaWVudF9zb2NrZXQgPj0gMCkgeworICAgIGNsb3NlKGNsaWVudF9zb2NrZXQpOworICB9CisgIGlmIChwcmV2X3NlcnZlcl9zb2NrZXQgPj0gMCkgeworICAgIGNsb3NlKHByZXZfc2VydmVyX3NvY2tldCk7CisgIH0KKyAgaWYgKHByZXZfY2xpZW50X3NvY2tldCA+PSAwKSB7CisgICAgY2xvc2UocHJldl9jbGllbnRfc29ja2V0KTsKKyAgfQorCisgIHJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKK2ludCBlenR1bmVfc2VydmVyX3N0YXJ0ICh2b2lkICpsaWJfaGFuZGxlKQoreworICByZXR1cm4gcHRocmVhZF9jcmVhdGUoJmV6dHVuZV90aHJlYWRfaWQsIE5VTEwsICBlenR1bmVfcHJvYywgbGliX2hhbmRsZSk7Cit9CisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9zcmMvbW1fcWNhbWVyYV91bml0X3Rlc3QuYyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9zcmMvbW1fcWNhbWVyYV91bml0X3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGZkNDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWNhbWVyYS10ZXN0L3NyYy9tbV9xY2FtZXJhX3VuaXRfdGVzdC5jCkBAIC0wLDAgKzEsNzAxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAibW1fcWNhbWVyYV9hcHAuaCIKKyNpbmNsdWRlICJtbV9xY2FtZXJhX2RiZy5oIgorCisjZGVmaW5lIE1NX1FDQU1FUkFfQVBQX1VURVNUX01BWF9NQUlOX0xPT1AgMQorI2RlZmluZSBNTV9RQ0FNRVJBX0FQUF9VVEVTVF9PVVRFUl9MT09QIDEKKyNkZWZpbmUgTU1fUUNBTUVSQV9BUFBfVVRFU1RfSU5ORVJfTE9PUCAxCisjZGVmaW5lIE1NX1FDQU1fQVBQX1RFU1RfTlVNIDEyOAorCitzdGF0aWMgbW1fYXBwX3RjX3QgbW1fYXBwX3RjW01NX1FDQU1fQVBQX1RFU1RfTlVNXTsKKworaW50IG1tX2FwcF90Y19vcGVuX2Nsb3NlKG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcCkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgaW50IGk7CisgICAgbW1fY2FtZXJhX3Rlc3Rfb2JqX3QgdGVzdF9vYmo7CisKKyAgICBwcmludGYoIlxuIFZlcmlmeWluZyBvcGVuL2Nsb3NlIGNhbWVyYXMuLi5cbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjYW1fYXBwLT5udW1fY2FtZXJhczsgaSsrKSB7CisgICAgICAgIG1lbXNldCgmdGVzdF9vYmosIDAsIHNpemVvZihtbV9jYW1lcmFfdGVzdF9vYmpfdCkpOworICAgICAgICByYyA9IG1tX2FwcF9vcGVuKGNhbV9hcHAsIGksICZ0ZXN0X29iaik7CisgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIHJjID0gbW1fYXBwX2Nsb3NlKCZ0ZXN0X29iaik7CisgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZSgpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyYyA9PSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgcHJpbnRmKCJcblBhc3NlZFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgfQorICAgIExPR0QoIkVORCwgcmMgPSAlZFxuIiwgIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfdGNfc3RhcnRfc3RvcF9wcmV2aWV3KG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcCkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgaW50IGksIGo7CisgICAgbW1fY2FtZXJhX3Rlc3Rfb2JqX3QgdGVzdF9vYmo7CisKKyAgICBwcmludGYoIlxuIFZlcmlmeWluZyBzdGFydC9zdG9wIHByZXZpZXcuLi5cbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjYW1fYXBwLT5udW1fY2FtZXJhczsgaSsrKSB7CisgICAgICAgIG1lbXNldCgmdGVzdF9vYmosIDAsIHNpemVvZihtbV9jYW1lcmFfdGVzdF9vYmpfdCkpOworICAgICAgICByYyA9IG1tX2FwcF9vcGVuKGNhbV9hcHAsIGksICZ0ZXN0X29iaik7CisgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgTU1fUUNBTUVSQV9BUFBfVVRFU1RfSU5ORVJfTE9PUDsgaisrKSB7CisgICAgICAgICAgICByYyA9IG1tX2FwcF9zdGFydF9wcmV2aWV3KCZ0ZXN0X29iaik7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIG1tX2FwcF9zdGFydF9wcmV2aWV3KCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZWVwKDEpOworICAgICAgICAgICAgcmMgPSBtbV9hcHBfc3RvcF9wcmV2aWV3KCZ0ZXN0X29iaik7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIG1tX2FwcF9zdG9wX3ByZXZpZXcoKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmMgfD0gbW1fYXBwX2Nsb3NlKCZ0ZXN0X29iaik7CisgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZSgpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyYyA9PSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgcHJpbnRmKCJcblBhc3NlZFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgfQorICAgIExPR0QoIkVORCwgcmMgPSAlZFxuIiwgIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfdGNfc3RhcnRfc3RvcF96c2wobW1fY2FtZXJhX2FwcF90ICpjYW1fYXBwKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBpbnQgaSwgajsKKyAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCB0ZXN0X29iajsKKworICAgIHByaW50ZigiXG4gVmVyaWZ5aW5nIHN0YXJ0L3N0b3AgcHJldmlldy4uLlxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IGNhbV9hcHAtPm51bV9jYW1lcmFzOyBpKyspIHsKKyAgICAgICAgbWVtc2V0KCZ0ZXN0X29iaiwgMCwgc2l6ZW9mKG1tX2NhbWVyYV90ZXN0X29ial90KSk7CisgICAgICAgIHJjID0gbW1fYXBwX29wZW4oY2FtX2FwcCwgaSwgJnRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX29wZW4oKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCByYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxOyBqKyspIHsKKyAgICAgICAgICAgIHJjID0gbW1fYXBwX3N0YXJ0X3ByZXZpZXdfenNsKCZ0ZXN0X29iaik7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIG1tX2FwcF9zdGFydF9wcmV2aWV3X3pzbCgpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgICAgIHJjID0gbW1fYXBwX3N0b3BfcHJldmlld196c2woJnRlc3Rfb2JqKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIgbW1fYXBwX3N0b3BfcHJldmlld196c2woKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmMgPSBtbV9hcHBfY2xvc2UoJnRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJjID09IE1NX0NBTUVSQV9PSykgeworICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIlxuRmFpbGVkXG4iKTsKKyAgICB9CisgICAgTE9HRCgiRU5ELCByYyA9ICVkXG4iLCAgcmMpOworICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF90Y19zdGFydF9zdG9wX3ZpZGVvX3ByZXZpZXcobW1fY2FtZXJhX2FwcF90ICpjYW1fYXBwKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBpbnQgaSwgajsKKyAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCB0ZXN0X29iajsKKyAgICBtbV9jYW1lcmFfbGliX3NuYXBzaG90X3BhcmFtcyBkaW07CisgICAgbWVtc2V0KCZkaW0sIDAsIHNpemVvZihtbV9jYW1lcmFfbGliX3NuYXBzaG90X3BhcmFtcykpOworCisgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgc3RhcnQvc3RvcCB2aWRlbyBwcmV2aWV3Li4uXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2FtX2FwcC0+bnVtX2NhbWVyYXM7IGkrKykgeworICAgICAgICBtZW1zZXQoJnRlc3Rfb2JqLCAwLCBzaXplb2YobW1fY2FtZXJhX3Rlc3Rfb2JqX3QpKTsKKyAgICAgICAgcmMgPSBtbV9hcHBfb3BlbihjYW1fYXBwLCBpLCAmdGVzdF9vYmopOworICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IE1NX1FDQU1FUkFfQVBQX1VURVNUX0lOTkVSX0xPT1A7IGorKykgeworICAgICAgICAgICAgcmMgPSBtbV9hcHBfc3RhcnRfcmVjb3JkX3ByZXZpZXcoJnRlc3Rfb2JqLCAmZGltKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfc3RhcnRfcmVjb3JkX3ByZXZpZXcoKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXAoMSk7CisgICAgICAgICAgICByYyA9IG1tX2FwcF9zdG9wX3JlY29yZF9wcmV2aWV3KCZ0ZXN0X29iaik7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX3N0b3BfcmVjb3JkX3ByZXZpZXcoKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmMgPSBtbV9hcHBfY2xvc2UoJnRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJjID09IE1NX0NBTUVSQV9PSykgeworICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIlxuRmFpbGVkXG4iKTsKKyAgICB9CisgICAgTE9HRCgiRU5ELCByYyA9ICVkXG4iLCAgcmMpOworICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF90Y19zdGFydF9zdG9wX3ZpZGVvX3JlY29yZChtbV9jYW1lcmFfYXBwX3QgKmNhbV9hcHApCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIGludCBpLCBqOworICAgIG1tX2NhbWVyYV90ZXN0X29ial90IHRlc3Rfb2JqOworICAgIG1tX2NhbWVyYV9saWJfc25hcHNob3RfcGFyYW1zIGRpbTsKKyAgICBtZW1zZXQoJmRpbSwgMCwgc2l6ZW9mKG1tX2NhbWVyYV9saWJfc25hcHNob3RfcGFyYW1zKSk7CisKKyAgICBwcmludGYoIlxuIFZlcmlmeWluZyBzdGFydC9zdG9wIHJlY29yZGluZy4uLlxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IGNhbV9hcHAtPm51bV9jYW1lcmFzOyBpKyspIHsKKyAgICAgICAgbWVtc2V0KCZ0ZXN0X29iaiwgMCwgc2l6ZW9mKG1tX2NhbWVyYV90ZXN0X29ial90KSk7CisgICAgICAgIHJjID0gbW1fYXBwX29wZW4oY2FtX2FwcCwgaSwgJnRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX29wZW4oKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCByYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gbW1fYXBwX3N0YXJ0X3JlY29yZF9wcmV2aWV3KCZ0ZXN0X29iaiwgJmRpbSk7CisgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9zdGFydF9yZWNvcmRfcHJldmlldygpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgIG1tX2FwcF9jbG9zZSgmdGVzdF9vYmopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzbGVlcCgxKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgTU1fUUNBTUVSQV9BUFBfVVRFU1RfSU5ORVJfTE9PUDsgaisrKSB7CisgICAgICAgICAgICByYyA9IG1tX2FwcF9zdGFydF9yZWNvcmQoJnRlc3Rfb2JqKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfc3RhcnRfcmVjb3JkKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2xlZXAoMSk7CisKKyAgICAgICAgICAgIHJjID0gbW1fYXBwX3N0b3BfcmVjb3JkKCZ0ZXN0X29iaik7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX3N0b3BfcmVjb3JkKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJzdGFydC9zdG9wIHJlY29yZCBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCByYyk7CisgICAgICAgICAgICBtbV9hcHBfc3RvcF9yZWNvcmRfcHJldmlldygmdGVzdF9vYmopOworICAgICAgICAgICAgbW1fYXBwX2Nsb3NlKCZ0ZXN0X29iaik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gbW1fYXBwX3N0b3BfcmVjb3JkX3ByZXZpZXcoJnRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX3N0b3BfcmVjb3JkX3ByZXZpZXcoKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCByYyk7CisgICAgICAgICAgICBtbV9hcHBfY2xvc2UoJnRlc3Rfb2JqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBtbV9hcHBfY2xvc2UoJnRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJjID09IE1NX0NBTUVSQV9PSykgeworICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIlxuRmFpbGVkXG4iKTsKKyAgICB9CisgICAgTE9HRCgiRU5ELCByYyA9ICVkXG4iLCAgcmMpOworICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF90Y19zdGFydF9zdG9wX2xpdmVfc25hcHNob3QobW1fY2FtZXJhX2FwcF90ICpjYW1fYXBwKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBpbnQgaSwgajsKKyAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCB0ZXN0X29iajsKKyAgICBtbV9jYW1lcmFfbGliX3NuYXBzaG90X3BhcmFtcyBkaW07CisgICAgbWVtc2V0KCZkaW0sIDAsIHNpemVvZihtbV9jYW1lcmFfbGliX3NuYXBzaG90X3BhcmFtcykpOworCisgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgc3RhcnQvc3RvcCBsaXZlIHNuYXBzaG90Li4uXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2FtX2FwcC0+bnVtX2NhbWVyYXM7IGkrKykgeworICAgICAgICBtZW1zZXQoJnRlc3Rfb2JqLCAwLCBzaXplb2YobW1fY2FtZXJhX3Rlc3Rfb2JqX3QpKTsKKyAgICAgICAgcmMgPSBtbV9hcHBfb3BlbihjYW1fYXBwLCBpLCAmdGVzdF9vYmopOworICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmMgPSBtbV9hcHBfc3RhcnRfcmVjb3JkX3ByZXZpZXcoJnRlc3Rfb2JqLCAmZGltKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX3N0YXJ0X3JlY29yZF9wcmV2aWV3KCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgbW1fYXBwX2Nsb3NlKCZ0ZXN0X29iaik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHNsZWVwKDEpOworCisgICAgICAgIHJjID0gbW1fYXBwX3N0YXJ0X3JlY29yZCgmdGVzdF9vYmopOworICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJtbV9hcHBfc3RhcnRfcmVjb3JkKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgbW1fYXBwX3N0b3BfcmVjb3JkX3ByZXZpZXcoJnRlc3Rfb2JqKTsKKyAgICAgICAgICAgIG1tX2FwcF9jbG9zZSgmdGVzdF9vYmopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzbGVlcCgxKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgTU1fUUNBTUVSQV9BUFBfVVRFU1RfSU5ORVJfTE9PUDsgaisrKSB7CisgICAgICAgICAgICByYyA9IG1tX2FwcF9zdGFydF9saXZlX3NuYXBzaG90KCZ0ZXN0X29iaik7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgibW1fYXBwX3N0YXJ0X2xpdmVfc25hcHNob3QoKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB3YWl0IGZvciBqcGVnIGlzIGRvbmUgKi8KKyAgICAgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworCisgICAgICAgICAgICByYyA9IG1tX2FwcF9zdG9wX2xpdmVfc25hcHNob3QoJnRlc3Rfb2JqKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJtbV9hcHBfc3RvcF9saXZlX3NuYXBzaG90KCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJzdGFydC9zdG9wIGxpdmUgc25hcHNob3QgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgbW1fYXBwX3N0b3BfcmVjb3JkKCZ0ZXN0X29iaik7CisgICAgICAgICAgICBtbV9hcHBfc3RvcF9yZWNvcmRfcHJldmlldygmdGVzdF9vYmopOworICAgICAgICAgICAgbW1fYXBwX2Nsb3NlKCZ0ZXN0X29iaik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gbW1fYXBwX3N0b3BfcmVjb3JkKCZ0ZXN0X29iaik7CisgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9zdG9wX3JlY29yZCgpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgIG1tX2FwcF9zdG9wX3JlY29yZF9wcmV2aWV3KCZ0ZXN0X29iaik7CisgICAgICAgICAgICBtbV9hcHBfY2xvc2UoJnRlc3Rfb2JqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc2xlZXAoMSk7CisKKyAgICAgICAgcmMgPSBtbV9hcHBfc3RvcF9yZWNvcmRfcHJldmlldygmdGVzdF9vYmopOworICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJtbV9hcHBfc3RvcF9yZWNvcmRfcHJldmlldygpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgIG1tX2FwcF9jbG9zZSgmdGVzdF9vYmopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByYyA9IG1tX2FwcF9jbG9zZSgmdGVzdF9vYmopOworICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJtbV9hcHBfY2xvc2UoKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCByYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmMgPT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIHByaW50ZigiXG5QYXNzZWRcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiXG5GYWlsZWRcbiIpOworICAgIH0KKyAgICBMT0dEKCJFTkQsIHJjID0gJWRcbiIsICByYyk7CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fYXBwX3RjX2NhcHR1cmVfcmF3KG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcCkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgaW50IGksIGo7CisgICAgbW1fY2FtZXJhX3Rlc3Rfb2JqX3QgdGVzdF9vYmo7CisgICAgdWludDhfdCBudW1fc25hcHNob3QgPSAxOworICAgIHVpbnQ4X3QgbnVtX3JjdmRfc25hcHNob3QgPSAwOworCisgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgcmF3IGNhcHR1cmUuLi5cbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjYW1fYXBwLT5udW1fY2FtZXJhczsgaSsrKSB7CisgICAgICAgIG1lbXNldCgmdGVzdF9vYmosIDAsIHNpemVvZihtbV9jYW1lcmFfdGVzdF9vYmpfdCkpOworICAgICAgICByYyA9IG1tX2FwcF9vcGVuKGNhbV9hcHAsIGksICZ0ZXN0X29iaik7CisgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgTU1fUUNBTUVSQV9BUFBfVVRFU1RfSU5ORVJfTE9PUDsgaisrKSB7CisgICAgICAgICAgICByYyA9IG1tX2FwcF9zdGFydF9jYXB0dXJlX3JhdygmdGVzdF9vYmosIG51bV9zbmFwc2hvdCk7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIG1tX2FwcF9zdGFydF9jYXB0dXJlKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChudW1fcmN2ZF9zbmFwc2hvdCA8IG51bV9zbmFwc2hvdCkgeworICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9hcHBfd2FpdCgpOworICAgICAgICAgICAgICAgIG51bV9yY3ZkX3NuYXBzaG90Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByYyA9IG1tX2FwcF9zdG9wX2NhcHR1cmVfcmF3KCZ0ZXN0X29iaik7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIG1tX2FwcF9zdG9wX2NhcHR1cmUoKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmMgfD0gbW1fYXBwX2Nsb3NlKCZ0ZXN0X29iaik7CisgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZSgpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyYyA9PSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgcHJpbnRmKCJcblBhc3NlZFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgfQorICAgIExPR0QoIkVORCwgcmMgPSAlZFxuIiwgIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfdGNfY2FwdHVyZV9yZWd1bGFyKG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcCkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgaW50IGksIGo7CisgICAgbW1fY2FtZXJhX3Rlc3Rfb2JqX3QgdGVzdF9vYmo7CisgICAgdWludDhfdCBudW1fc25hcHNob3QgPSAxOworICAgIHVpbnQ4X3QgbnVtX3JjdmRfc25hcHNob3QgPSAwOworCisgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgY2FwdHVyZS4uLlxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IGNhbV9hcHAtPm51bV9jYW1lcmFzOyBpKyspIHsKKyAgICAgICAgbWVtc2V0KCZ0ZXN0X29iaiwgMCwgc2l6ZW9mKG1tX2NhbWVyYV90ZXN0X29ial90KSk7CisgICAgICAgIHJjID0gbW1fYXBwX29wZW4oY2FtX2FwcCwgaSwgJnRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX29wZW4oKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCByYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBNTV9RQ0FNRVJBX0FQUF9VVEVTVF9JTk5FUl9MT09QOyBqKyspIHsKKyAgICAgICAgICAgIHJjID0gbW1fYXBwX3N0YXJ0X2NhcHR1cmUoJnRlc3Rfb2JqLCBudW1fc25hcHNob3QpOworICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIiBtbV9hcHBfc3RhcnRfY2FwdHVyZSgpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAobnVtX3JjdmRfc25hcHNob3QgPCBudW1fc25hcHNob3QpIHsKKyAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKyAgICAgICAgICAgICAgICBudW1fcmN2ZF9zbmFwc2hvdCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmMgPSBtbV9hcHBfc3RvcF9jYXB0dXJlKCZ0ZXN0X29iaik7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIG1tX2FwcF9zdG9wX2NhcHR1cmUoKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmMgPSBtbV9hcHBfY2xvc2UoJnRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJjID09IE1NX0NBTUVSQV9PSykgeworICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIlxuRmFpbGVkXG4iKTsKKyAgICB9CisgICAgTE9HRCgiRU5ELCByYyA9ICVkXG4iLCAgcmMpOworICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF90Y19jYXB0dXJlX2J1cnN0KG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcCkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgaW50IGksIGo7CisgICAgbW1fY2FtZXJhX3Rlc3Rfb2JqX3QgdGVzdF9vYmo7CisgICAgdWludDhfdCBudW1fc25hcHNob3QgPSAzOworICAgIHVpbnQ4X3QgbnVtX3JjdmRfc25hcHNob3QgPSAwOworCisgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgY2FwdHVyZS4uLlxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IGNhbV9hcHAtPm51bV9jYW1lcmFzOyBpKyspIHsKKyAgICAgICAgbWVtc2V0KCZ0ZXN0X29iaiwgMCwgc2l6ZW9mKG1tX2NhbWVyYV90ZXN0X29ial90KSk7CisgICAgICAgIHJjID0gbW1fYXBwX29wZW4oY2FtX2FwcCwgaSwgJnRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX29wZW4oKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpLCByYyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBNTV9RQ0FNRVJBX0FQUF9VVEVTVF9JTk5FUl9MT09QOyBqKyspIHsKKyAgICAgICAgICAgIHJjID0gbW1fYXBwX3N0YXJ0X2NhcHR1cmUoJnRlc3Rfb2JqLCBudW1fc25hcHNob3QpOworICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIiBtbV9hcHBfc3RhcnRfY2FwdHVyZSgpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAobnVtX3JjdmRfc25hcHNob3QgPCBudW1fc25hcHNob3QpIHsKKyAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYXBwX3dhaXQoKTsKKyAgICAgICAgICAgICAgICBudW1fcmN2ZF9zbmFwc2hvdCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmMgPSBtbV9hcHBfc3RvcF9jYXB0dXJlKCZ0ZXN0X29iaik7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIG1tX2FwcF9zdG9wX2NhcHR1cmUoKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmMgPSBtbV9hcHBfY2xvc2UoJnRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJjID09IE1NX0NBTUVSQV9PSykgeworICAgICAgICBwcmludGYoIlxuUGFzc2VkXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludGYoIlxuRmFpbGVkXG4iKTsKKyAgICB9CisgICAgTE9HRCgiRU5ELCByYyA9ICVkXG4iLCAgcmMpOworICAgIHJldHVybiByYzsKK30KKworaW50IG1tX2FwcF90Y19yZGlfYnVyc3QobW1fY2FtZXJhX2FwcF90ICpjYW1fYXBwKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSywgcmMyID0gTU1fQ0FNRVJBX09LOworICAgIGludCBpLCBqOworICAgIG1tX2NhbWVyYV90ZXN0X29ial90IHRlc3Rfb2JqOworCisgICAgcHJpbnRmKCJcbiBWZXJpZnlpbmcgcmRpIGJ1cnN0ICgzKSBjYXB0dXJlLi4uXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2FtX2FwcC0+bnVtX2NhbWVyYXM7IGkrKykgeworICAgICAgICBtZW1zZXQoJnRlc3Rfb2JqLCAwLCBzaXplb2YobW1fY2FtZXJhX3Rlc3Rfb2JqX3QpKTsKKyAgICAgICAgcmMgPSBtbV9hcHBfb3BlbihjYW1fYXBwLCBpLCAmdGVzdF9vYmopOworICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBMT0dFKCJtbV9hcHBfb3BlbigpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IE1NX1FDQU1FUkFfQVBQX1VURVNUX0lOTkVSX0xPT1A7IGorKykgeworICAgICAgICAgICAgcmMgPSBtbV9hcHBfc3RhcnRfcmRpKCZ0ZXN0X29iaiwgMyk7CisgICAgICAgICAgICBpZiAocmMgIT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiIG1tX2FwcF9zdGFydF9wcmV2aWV3KCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsZWVwKDEpOworICAgICAgICAgICAgcmMgPSBtbV9hcHBfc3RvcF9yZGkoJnRlc3Rfb2JqKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIgbW1fYXBwX3N0b3BfcHJldmlldygpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCByYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByYzIgPSBtbV9hcHBfY2xvc2UoJnRlc3Rfb2JqKTsKKyAgICAgICAgaWYgKHJjMiAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9jbG9zZSgpIGNhbV9pZHg9JWQsIGVycj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjMik7CisgICAgICAgICAgICBpZiAocmMgPT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgcmMgPSByYzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmMgPT0gTU1fQ0FNRVJBX09LKSB7CisgICAgICAgIHByaW50ZigiXG5QYXNzZWRcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiXG5GYWlsZWRcbiIpOworICAgIH0KKyAgICBMT0dEKCJFTkQsIHJjID0gJWRcbiIsICByYyk7CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fYXBwX3RjX3JkaV9jb250KG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcCkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0ssIHJjMiA9IE1NX0NBTUVSQV9PSzsKKyAgICBpbnQgaSwgajsKKyAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCB0ZXN0X29iajsKKworICAgIHByaW50ZigiXG4gVmVyaWZ5aW5nIHJkaSBjb250aW51b3VzIGNhcHR1cmUuLi5cbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjYW1fYXBwLT5udW1fY2FtZXJhczsgaSsrKSB7CisgICAgICAgIG1lbXNldCgmdGVzdF9vYmosIDAsIHNpemVvZihtbV9jYW1lcmFfdGVzdF9vYmpfdCkpOworICAgICAgICByYyA9IG1tX2FwcF9vcGVuKGNhbV9hcHAsIGksICZ0ZXN0X29iaik7CisgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgIExPR0UoIm1tX2FwcF9vcGVuKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgTU1fUUNBTUVSQV9BUFBfVVRFU1RfSU5ORVJfTE9PUDsgaisrKSB7CisgICAgICAgICAgICByYyA9IG1tX2FwcF9zdGFydF9yZGkoJnRlc3Rfb2JqLCAwKTsKKyAgICAgICAgICAgIGlmIChyYyAhPSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICBMT0dFKCIgbW1fYXBwX3N0YXJ0X3ByZXZpZXcoKSBjYW1faWR4PSVkLCBlcnI9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2xlZXAoMSk7CisgICAgICAgICAgICByYyA9IG1tX2FwcF9zdG9wX3JkaSgmdGVzdF9vYmopOworICAgICAgICAgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIExPR0UoIiBtbV9hcHBfc3RvcF9wcmV2aWV3KCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHJjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJjMiA9IG1tX2FwcF9jbG9zZSgmdGVzdF9vYmopOworICAgICAgICBpZiAocmMyICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgTE9HRSgibW1fYXBwX2Nsb3NlKCkgY2FtX2lkeD0lZCwgZXJyPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgcmMyKTsKKyAgICAgICAgICAgIGlmIChyYyA9PSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgICAgICAgICByYyA9IHJjMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyYyA9PSBNTV9DQU1FUkFfT0spIHsKKyAgICAgICAgcHJpbnRmKCJcblBhc3NlZFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJcbkZhaWxlZFxuIik7CisgICAgfQorICAgIExPR0QoIkVORCwgcmMgPSAlZFxuIiwgIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfZ2VuX3Rlc3RfY2FzZXMoKQoreworICAgIGludCB0YyA9IDA7CisgICAgbWVtc2V0KG1tX2FwcF90YywgMCwgc2l6ZW9mKG1tX2FwcF90YykpOworICAgIGlmICh0YyA8IE1NX1FDQU1fQVBQX1RFU1RfTlVNKSBtbV9hcHBfdGNbdGMrK10uZiA9IG1tX2FwcF90Y19vcGVuX2Nsb3NlOworICAgIGlmICh0YyA8IE1NX1FDQU1fQVBQX1RFU1RfTlVNKSBtbV9hcHBfdGNbdGMrK10uZiA9IG1tX2FwcF90Y19zdGFydF9zdG9wX3ByZXZpZXc7CisgICAgLy9pZiAodGMgPCBNTV9RQ0FNX0FQUF9URVNUX05VTSkgbW1fYXBwX3RjW3RjKytdLmYgPSBtbV9hcHBfdGNfc3RhcnRfc3RvcF96c2w7CisgICAgLy9pZiAodGMgPCBNTV9RQ0FNX0FQUF9URVNUX05VTSkgbW1fYXBwX3RjW3RjKytdLmYgPSBtbV9hcHBfdGNfc3RhcnRfc3RvcF92aWRlb19wcmV2aWV3OworICAgIC8vaWYgKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX3RjX3N0YXJ0X3N0b3BfdmlkZW9fcmVjb3JkOworICAgIC8vaWYgKHRjIDwgTU1fUUNBTV9BUFBfVEVTVF9OVU0pIG1tX2FwcF90Y1t0YysrXS5mID0gbW1fYXBwX3RjX3N0YXJ0X3N0b3BfbGl2ZV9zbmFwc2hvdDsKKyAgICAvL2lmICh0YyA8IE1NX1FDQU1fQVBQX1RFU1RfTlVNKSBtbV9hcHBfdGNbdGMrK10uZiA9IG1tX2FwcF90Y19jYXB0dXJlX3JlZ3VsYXI7CisgICAgLy9pZiAodGMgPCBNTV9RQ0FNX0FQUF9URVNUX05VTSkgbW1fYXBwX3RjW3RjKytdLmYgPSBtbV9hcHBfdGNfY2FwdHVyZV9idXJzdDsKKyAgICAvL2lmICh0YyA8IE1NX1FDQU1fQVBQX1RFU1RfTlVNKSBtbV9hcHBfdGNbdGMrK10uZiA9IG1tX2FwcF90Y19yZGlfY29udDsKKyAgICAvL2lmICh0YyA8IE1NX1FDQU1fQVBQX1RFU1RfTlVNKSBtbV9hcHBfdGNbdGMrK10uZiA9IG1tX2FwcF90Y19yZGlfYnVyc3Q7CisKKyAgICByZXR1cm4gdGM7Cit9CisKK2ludCBtbV9hcHBfdW5pdF90ZXN0X2VudHJ5KG1tX2NhbWVyYV9hcHBfdCAqY2FtX2FwcCkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgaW50IGksIGosIHRjID0gMDsKKworICAgIHRjID0gbW1fYXBwX2dlbl90ZXN0X2Nhc2VzKCk7CisgICAgTE9HRCgiUnVubmluZyAlZCB0ZXN0IGNhc2VzXG4iLHRjKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGM7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgTU1fUUNBTUVSQV9BUFBfVVRFU1RfT1VURVJfTE9PUDsgaisrKSB7CisgICAgICAgICAgICBtbV9hcHBfdGNbaV0uciA9IG1tX2FwcF90Y1tpXS5mKGNhbV9hcHApOworICAgICAgICAgICAgaWYgKG1tX2FwcF90Y1tpXS5yICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIHByaW50ZigiIHRlc3QgY2FzZSAlZCAoaXRlcmF0aW9uICVkKSBlcnJvciA9ICVkLCBhYm9ydCB1bml0IHRlc3RpbmcgZW5naW5lISEhIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIGosIG1tX2FwcF90Y1tpXS5yKTsKKyAgICAgICAgICAgICAgICByYyA9IG1tX2FwcF90Y1tpXS5yOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorZW5kOgorICAgIHByaW50ZigiblRPVEFMX1RTRVRfQ0FTRSA9ICVkLCBOVU1fVEVTVF9SQU4gPSAlZCwgcmM9JWRcbiIsIHRjLCBpLCByYyk7CisgICAgcmV0dXJuIHJjOworfQorCisKKworCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfdmlkZW8uYyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1jYW1lcmEtdGVzdC9zcmMvbW1fcWNhbWVyYV92aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTJjMjcKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tY2FtZXJhLXRlc3Qvc3JjL21tX3FjYW1lcmFfdmlkZW8uYwpAQCAtMCwwICsxLDc3MyBAQAorLyoKK0NvcHlyaWdodCAoYykgMjAxMi0yMDE0LCAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKK0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKK0JFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCitTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKK0JVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKK09SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KK0lGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX3FjYW1lcmFfYXBwLmgiCisjaW5jbHVkZSAibW1fcWNhbWVyYV9kYmcuaCIKKworc3RhdGljIHZvaWQgbW1fYXBwX21ldGFkYXRhX25vdGlmeV9jYihtbV9jYW1lcmFfc3VwZXJfYnVmX3QgKmJ1ZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworICB1aW50MzJfdCBpID0gMDsKKyAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCA9IE5VTEw7CisgIG1tX2NhbWVyYV9zdHJlYW1fdCAqcF9zdHJlYW0gPSBOVUxMOworICBtbV9jYW1lcmFfdGVzdF9vYmpfdCAqcG1lID0gKG1tX2NhbWVyYV90ZXN0X29ial90ICopdXNlcl9kYXRhOworICBtbV9jYW1lcmFfYnVmX2RlZl90ICpmcmFtZTsKKyAgbWV0YWRhdGFfYnVmZmVyX3QgKnBNZXRhZGF0YTsKKworICBpZiAoTlVMTCA9PSBidWZzIHx8IE5VTEwgPT0gdXNlcl9kYXRhKSB7CisgICAgICBMT0dFKCJidWZzIG9yIHVzZXJfZGF0YSBhcmUgbm90IHZhbGlkICIpOworICAgICAgcmV0dXJuOworICB9CisgIGZyYW1lID0gYnVmcy0+YnVmc1swXTsKKworICAvKiBmaW5kIGNoYW5uZWwgKi8KKyAgZm9yIChpID0gMDsgaSA8IE1NX0NIQU5ORUxfVFlQRV9NQVg7IGkrKykgeworICAgICAgaWYgKHBtZS0+Y2hhbm5lbHNbaV0uY2hfaWQgPT0gYnVmcy0+Y2hfaWQpIHsKKyAgICAgICAgICBjaGFubmVsID0gJnBtZS0+Y2hhbm5lbHNbaV07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgIH0KKworICBpZiAoTlVMTCA9PSBjaGFubmVsKSB7CisgICAgICBMT0dFKCJDaGFubmVsIG9iamVjdCBpcyBOVUxMICIpOworICAgICAgcmV0dXJuOworICB9CisKKyAgLyogZmluZCBwcmV2aWV3IHN0cmVhbSAqLworICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbC0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgaWYgKGNoYW5uZWwtPnN0cmVhbXNbaV0uc19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9NRVRBREFUQSkgeworICAgICAgICAgIHBfc3RyZWFtID0gJmNoYW5uZWwtPnN0cmVhbXNbaV07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgIH0KKworICBpZiAoTlVMTCA9PSBwX3N0cmVhbSkgeworICAgICAgTE9HRSgiY2Fubm90IGZpbmQgbWV0YWRhdGEgc3RyZWFtIik7CisgICAgICByZXR1cm47CisgIH0KKworICAvKiBmaW5kIHByZXZpZXcgZnJhbWUgKi8KKyAgZm9yIChpID0gMDsgaSA8IGJ1ZnMtPm51bV9idWZzOyBpKyspIHsKKyAgICAgIGlmIChidWZzLT5idWZzW2ldLT5zdHJlYW1faWQgPT0gcF9zdHJlYW0tPnNfaWQpIHsKKyAgICAgICAgICBmcmFtZSA9IGJ1ZnMtPmJ1ZnNbaV07CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgIH0KKworICBpZiAocG1lLT5tZXRhZGF0YSA9PSBOVUxMKSB7CisgICAgLyogVGhlIGFwcCB3aWxsIGZyZWUgdGhlIG1ldGEgZGF0YSwgd2UgZG9uJ3QgbmVlZCB0byBib3RoZXIgaGVyZSAqLworICAgIHBtZS0+bWV0YWRhdGEgPSBtYWxsb2Moc2l6ZW9mKG1ldGFkYXRhX2J1ZmZlcl90KSk7CisgICAgaWYgKE5VTEwgPT0gcG1lLT5tZXRhZGF0YSkgeworICAgICAgICBMT0dFKCJDYW5vdCBhbGxvY2F0ZSBtZXRhZGF0YSBtZW1vcnlcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICB9CisgIG1lbWNweShwbWUtPm1ldGFkYXRhLCBmcmFtZS0+YnVmZmVyLCBzaXplb2YobWV0YWRhdGFfYnVmZmVyX3QpKTsKKworICBwTWV0YWRhdGEgPSAobWV0YWRhdGFfYnVmZmVyX3QgKilmcmFtZS0+YnVmZmVyOworICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgYWZTdGF0ZSwgQ0FNX0lOVEZfTUVUQV9BRl9TVEFURSwgcE1ldGFkYXRhKSB7CisgICAgaWYgKChjYW1fYWZfc3RhdGVfdCkoKmFmU3RhdGUpID09IENBTV9BRl9TVEFURV9GT0NVU0VEX0xPQ0tFRCB8fAorICAgICAgICAgICAgKGNhbV9hZl9zdGF0ZV90KSgqYWZTdGF0ZSkgPT0gQ0FNX0FGX1NUQVRFX05PVF9GT0NVU0VEX0xPQ0tFRCkgeworICAgICAgICBMT0dFKCJBdXRvRm9jdXMgRG9uZSBDYWxsIEJhY2sgUmVjZWl2ZWRcbiIpOworICAgICAgICBtbV9jYW1lcmFfYXBwX2RvbmUoKTsKKyAgICB9IGVsc2UgaWYgKChjYW1fYWZfc3RhdGVfdCkoKmFmU3RhdGUpID09IENBTV9BRl9TVEFURV9OT1RfRk9DVVNFRF9MT0NLRUQpIHsKKyAgICAgICAgTE9HRSgiQXV0b0ZvY3VzIGZhaWxlZFxuIik7CisgICAgICAgIG1tX2NhbWVyYV9hcHBfZG9uZSgpOworICAgIH0KKyAgfQorCisgIGlmIChwbWUtPnVzZXJfbWV0YWRhdGFfY2IpIHsKKyAgICAgIExPR0QoIltEQkddICVzLCB1c2VyIGRlZmluZWQgb3duIG1ldGFkYXRhIGNiLiBjYWxsaW5nIGl0Li4uIik7CisgICAgICBwbWUtPnVzZXJfbWV0YWRhdGFfY2IoZnJhbWUpOworICB9CisKKyAgaWYgKE1NX0NBTUVSQV9PSyAhPSBwbWUtPmNhbS0+b3BzLT5xYnVmKGJ1ZnMtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzLT5jaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lKSkgeworICAgICAgTE9HRSgiRmFpbGVkIGluIFByZXZpZXcgUWJ1ZlxuIik7CisgIH0KKyAgbW1fYXBwX2NhY2hlX29wcygobW1fY2FtZXJhX2FwcF9tZW1pbmZvX3QgKilmcmFtZS0+bWVtX2luZm8sCisgICAgICAgICAgICAgICAgICAgSU9OX0lPQ19JTlZfQ0FDSEVTKTsKK30KKworCitzdGF0aWMgdm9pZCBtbV9hcHBfc25hcHNob3Rfbm90aWZ5X2NiKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqYnVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhKQoreworCisgICAgaW50IHJjID0gMDsKKyAgICB1aW50MzJfdCBpID0gMDsKKyAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCAqcG1lID0gKG1tX2NhbWVyYV90ZXN0X29ial90ICopdXNlcl9kYXRhOworICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKmNoYW5uZWwgPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqcF9zdHJlYW0gPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqbV9zdHJlYW0gPSBOVUxMOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKnBfZnJhbWUgPSBOVUxMOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKm1fZnJhbWUgPSBOVUxMOworCisgICAgLyogZmluZCBjaGFubmVsICovCisgICAgZm9yIChpID0gMDsgaSA8IE1NX0NIQU5ORUxfVFlQRV9NQVg7IGkrKykgeworICAgICAgICBpZiAocG1lLT5jaGFubmVsc1tpXS5jaF9pZCA9PSBidWZzLT5jaF9pZCkgeworICAgICAgICAgICAgY2hhbm5lbCA9ICZwbWUtPmNoYW5uZWxzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKE5VTEwgPT0gY2hhbm5lbCkgeworICAgICAgICBMT0dFKCJXcm9uZyBjaGFubmVsIGlkICglZCkiLCAgYnVmcy0+Y2hfaWQpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIGZpbmQgc25hcHNob3Qgc3RyZWFtICovCisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKGNoYW5uZWwtPnN0cmVhbXNbaV0uc19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9TTkFQU0hPVCkgeworICAgICAgICAgICAgbV9zdHJlYW0gPSAmY2hhbm5lbC0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChOVUxMID09IG1fc3RyZWFtKSB7CisgICAgICAgIExPR0UoImNhbm5vdCBmaW5kIHNuYXBzaG90IHN0cmVhbSIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIGZpbmQgc25hcHNob3QgZnJhbWUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYnVmcy0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICBpZiAoYnVmcy0+YnVmc1tpXS0+c3RyZWFtX2lkID09IG1fc3RyZWFtLT5zX2lkKSB7CisgICAgICAgICAgICBtX2ZyYW1lID0gYnVmcy0+YnVmc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChOVUxMID09IG1fZnJhbWUpIHsKKyAgICAgICAgTE9HRSgibWFpbiBmcmFtZSBpcyBOVUxMIik7CisgICAgICAgIHJjID0gLTE7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgbW1fYXBwX2R1bXBfZnJhbWUobV9mcmFtZSwgIm1haW4iLCAieXV2IiwgbV9mcmFtZS0+ZnJhbWVfaWR4KTsKKworICAgIC8qIGZpbmQgcG9zdHZpZXcgc3RyZWFtICovCisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWwtPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKGNoYW5uZWwtPnN0cmVhbXNbaV0uc19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlID09IENBTV9TVFJFQU1fVFlQRV9QT1NUVklFVykgeworICAgICAgICAgICAgcF9zdHJlYW0gPSAmY2hhbm5lbC0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChOVUxMICE9IHBfc3RyZWFtKSB7CisgICAgICAgIC8qIGZpbmQgcHJldmlldyBmcmFtZSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmcy0+bnVtX2J1ZnM7IGkrKykgeworICAgICAgICAgICAgaWYgKGJ1ZnMtPmJ1ZnNbaV0tPnN0cmVhbV9pZCA9PSBwX3N0cmVhbS0+c19pZCkgeworICAgICAgICAgICAgICAgIHBfZnJhbWUgPSBidWZzLT5idWZzW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChOVUxMICE9IHBfZnJhbWUpIHsKKyAgICAgICAgICAgIG1tX2FwcF9kdW1wX2ZyYW1lKHBfZnJhbWUsICJwb3N0dmlldyIsICJ5dXYiLCBwX2ZyYW1lLT5mcmFtZV9pZHgpOworICAgICAgICB9CisgICAgfQorCisgICAgbW1fYXBwX2NhY2hlX29wcygobW1fY2FtZXJhX2FwcF9tZW1pbmZvX3QgKiltX2ZyYW1lLT5tZW1faW5mbywKKyAgICAgICAgICAgICAgICAgICAgIElPTl9JT0NfQ0xFQU5fSU5WX0NBQ0hFUyk7CisKKyAgICBwbWUtPmpwZWdfYnVmLmJ1Zi5idWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhtX2ZyYW1lLT5mcmFtZV9sZW4pOworICAgIGlmICggTlVMTCA9PSBwbWUtPmpwZWdfYnVmLmJ1Zi5idWZmZXIgKSB7CisgICAgICAgIExPR0UoImVycm9yIGFsbG9jYXRpbmcganBlZyBvdXRwdXQgYnVmZmVyIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcG1lLT5qcGVnX2J1Zi5idWYuZnJhbWVfbGVuID0gbV9mcmFtZS0+ZnJhbWVfbGVuOworICAgIC8qIGNyZWF0ZSBhIG5ldyBqcGVnIGVuY29kaW5nIHNlc3Npb24gKi8KKyAgICByYyA9IGNyZWF0ZUVuY29kaW5nU2Vzc2lvbihwbWUsIG1fc3RyZWFtLCBtX2ZyYW1lKTsKKyAgICBpZiAoMCAhPSByYykgeworICAgICAgICBMT0dFKCJlcnJvciBjcmVhdGluZyBqcGVnIHNlc3Npb24iKTsKKyAgICAgICAgZnJlZShwbWUtPmpwZWdfYnVmLmJ1Zi5idWZmZXIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8qIHN0YXJ0IGpwZWcgZW5jb2Rpbmcgam9iICovCisgICAgcmMgPSBlbmNvZGVEYXRhKHBtZSwgYnVmcywgbV9zdHJlYW0pOworICAgIGlmICgwICE9IHJjKSB7CisgICAgICAgIExPR0UoImVycm9yIGNyZWF0aW5nIGpwZWcgc2Vzc2lvbiIpOworICAgICAgICBmcmVlKHBtZS0+anBlZ19idWYuYnVmLmJ1ZmZlcik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCitlcnJvcjoKKyAgICAvKiBidWYgZG9uZSByY3ZkIGZyYW1lcyBpbiBlcnJvciBjYXNlICovCisgICAgaWYgKCAwICE9IHJjICkgeworICAgICAgICBmb3IgKGk9MDsgaTxidWZzLT5udW1fYnVmczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHBtZS0+Y2FtLT5vcHMtPnFidWYoYnVmcy0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzLT5jaF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzLT5idWZzW2ldKSkgeworICAgICAgICAgICAgICAgIExPR0UoIkZhaWxlZCBpbiBRYnVmXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1tX2FwcF9jYWNoZV9vcHMoKG1tX2NhbWVyYV9hcHBfbWVtaW5mb190ICopYnVmcy0+YnVmc1tpXS0+bWVtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPTl9JT0NfSU5WX0NBQ0hFUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dEKCIgRU5EXG4iKTsKK30KKworc3RhdGljIHZvaWQgbW1fYXBwX3ByZXZpZXdfbm90aWZ5X2NiKG1tX2NhbWVyYV9zdXBlcl9idWZfdCAqYnVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgdWludDMyX3QgaSA9IDA7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpwX3N0cmVhbSA9IE5VTEw7CisgICAgbW1fY2FtZXJhX2J1Zl9kZWZfdCAqZnJhbWUgPSBOVUxMOworICAgIG1tX2NhbWVyYV90ZXN0X29ial90ICpwbWUgPSAobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKil1c2VyX2RhdGE7CisKKyAgICBpZiAoTlVMTCA9PSBidWZzIHx8IE5VTEwgPT0gdXNlcl9kYXRhKSB7CisgICAgICAgIExPR0UoImJ1ZnMgb3IgdXNlcl9kYXRhIGFyZSBub3QgdmFsaWQgIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmcmFtZSA9IGJ1ZnMtPmJ1ZnNbMF07CisKKyAgICAvKiBmaW5kIGNoYW5uZWwgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTU1fQ0hBTk5FTF9UWVBFX01BWDsgaSsrKSB7CisgICAgICAgIGlmIChwbWUtPmNoYW5uZWxzW2ldLmNoX2lkID09IGJ1ZnMtPmNoX2lkKSB7CisgICAgICAgICAgICBjaGFubmVsID0gJnBtZS0+Y2hhbm5lbHNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoTlVMTCA9PSBjaGFubmVsKSB7CisgICAgICAgIExPR0UoIkNoYW5uZWwgb2JqZWN0IGlzIE5VTEwgIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogZmluZCBwcmV2aWV3IHN0cmVhbSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGlmIChjaGFubmVsLT5zdHJlYW1zW2ldLnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1fdHlwZSA9PSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVykgeworICAgICAgICAgICAgcF9zdHJlYW0gPSAmY2hhbm5lbC0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKE5VTEwgPT0gcF9zdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiY2Fubm90IGZpbmQgcHJldmlldyBzdHJlYW0iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGZpbmQgcHJldmlldyBmcmFtZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBidWZzLT5udW1fYnVmczsgaSsrKSB7CisgICAgICAgIGlmIChidWZzLT5idWZzW2ldLT5zdHJlYW1faWQgPT0gcF9zdHJlYW0tPnNfaWQpIHsKKyAgICAgICAgICAgIGZyYW1lID0gYnVmcy0+YnVmc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCAwIDwgcG1lLT5mYl9mZCApIHsKKyAgICAgICAgbW1fYXBwX292ZXJsYXlfZGlzcGxheShwbWUsIGZyYW1lLT5mZCk7CisgICAgfQorI2lmZGVmIERVTVBfUFJWX0lOX0ZJTEUKKyAgICB7CisgICAgICAgIGNoYXIgZmlsZV9uYW1lWzY0XTsKKyAgICAgICAgc25wcmludGYoZmlsZV9uYW1lLCBzaXplb2YoZmlsZV9uYW1lKSwgIlBfQyVkIiwgcG1lLT5jYW0tPmNhbWVyYV9oYW5kbGUpOworICAgICAgICBtbV9hcHBfZHVtcF9mcmFtZShmcmFtZSwgZmlsZV9uYW1lLCAieXV2IiwgZnJhbWUtPmZyYW1lX2lkeCk7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHBtZS0+dXNlcl9wcmV2aWV3X2NiKSB7CisgICAgICAgIExPR0UoIltEQkddICVzLCB1c2VyIGRlZmluZWQgb3duIHByZXZpZXcgY2IuIGNhbGxpbmcgaXQuLi4iKTsKKyAgICAgICAgcG1lLT51c2VyX3ByZXZpZXdfY2IoZnJhbWUpOworICAgIH0KKyAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHBtZS0+Y2FtLT5vcHMtPnFidWYoYnVmcy0+Y2FtZXJhX2hhbmRsZSwKKyAgICAgICAgICAgICAgICBidWZzLT5jaF9pZCwKKyAgICAgICAgICAgICAgICBmcmFtZSkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIGluIFByZXZpZXcgUWJ1ZlxuIik7CisgICAgfQorICAgIG1tX2FwcF9jYWNoZV9vcHMoKG1tX2NhbWVyYV9hcHBfbWVtaW5mb190ICopZnJhbWUtPm1lbV9pbmZvLAorICAgICAgICAgICAgSU9OX0lPQ19JTlZfQ0FDSEVTKTsKKworICAgIExPR0QoIiBFTkRcbiIpOworfQorCisKK3N0YXRpYyB2b2lkIG1tX2FwcF92aWRlb19ub3RpZnlfY2IobW1fY2FtZXJhX3N1cGVyX2J1Zl90ICpidWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyX2RhdGEpCit7CisgICAgY2hhciBmaWxlX25hbWVbNjRdOworICAgIG1tX2NhbWVyYV9idWZfZGVmX3QgKmZyYW1lID0gYnVmcy0+YnVmc1swXTsKKyAgICBtbV9jYW1lcmFfdGVzdF9vYmpfdCAqcG1lID0gKG1tX2NhbWVyYV90ZXN0X29ial90ICopdXNlcl9kYXRhOworCisgICAgTE9HRCgiQkVHSU4gLSBsZW5ndGg9JXp1LCBmcmFtZSBpZHggPSAlZFxuIiwKKyAgICAgICAgICBmcmFtZS0+ZnJhbWVfbGVuLCBmcmFtZS0+ZnJhbWVfaWR4KTsKKyAgICBzbnByaW50ZihmaWxlX25hbWUsIHNpemVvZihmaWxlX25hbWUpLCAiVl9DJWQiLCBwbWUtPmNhbS0+Y2FtZXJhX2hhbmRsZSk7CisgICAgbW1fYXBwX2R1bXBfZnJhbWUoZnJhbWUsIGZpbGVfbmFtZSwgInl1diIsIGZyYW1lLT5mcmFtZV9pZHgpOworCisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSBwbWUtPmNhbS0+b3BzLT5xYnVmKGJ1ZnMtPmNhbWVyYV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnMtPmNoX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSkpIHsKKyAgICAgICAgTE9HRSgiRmFpbGVkIGluIFByZXZpZXcgUWJ1ZlxuIik7CisgICAgfQorICAgIG1tX2FwcF9jYWNoZV9vcHMoKG1tX2NhbWVyYV9hcHBfbWVtaW5mb190ICopZnJhbWUtPm1lbV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgSU9OX0lPQ19JTlZfQ0FDSEVTKTsKKworICAgIExPR0QoIkVORFxuIik7Cit9CisKK21tX2NhbWVyYV9zdHJlYW1fdCAqIG1tX2FwcF9hZGRfdmlkZW9fcHJldmlld19zdHJlYW0obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9jYW1lcmFfYnVmX25vdGlmeV90IHN0cmVhbV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtX2J1ZnMpCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc3RyZWFtID0gTlVMTDsKKyAgICBjYW1fY2FwYWJpbGl0eV90ICpjYW1fY2FwID0gKGNhbV9jYXBhYmlsaXR5X3QgKikodGVzdF9vYmotPmNhcF9idWYuYnVmLmJ1ZmZlcik7CisgICAgY2FtX2RpbWVuc2lvbl90IHByZXZpZXdfZGltID0gezAsIDB9OworCisgICAgaWYgKCh0ZXN0X29iai0+cHJldmlld19yZXNvbHV0aW9uLnVzZXJfaW5wdXRfZGlzcGxheV93aWR0aCA9PSAwKSB8fAorICAgICAgICAgICAoIHRlc3Rfb2JqLT5wcmV2aWV3X3Jlc29sdXRpb24udXNlcl9pbnB1dF9kaXNwbGF5X2hlaWdodCA9PSAwKSkgeworICAgICAgICBwcmV2aWV3X2RpbS53aWR0aCA9IERFRkFVTFRfUFJFVklFV19XSURUSDsKKyAgICAgICAgcHJldmlld19kaW0uaGVpZ2h0ID0gREVGQVVMVF9QUkVWSUVXX0hFSUdIVDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmV2aWV3X2RpbS53aWR0aCA9IHRlc3Rfb2JqLT5wcmV2aWV3X3Jlc29sdXRpb24udXNlcl9pbnB1dF9kaXNwbGF5X3dpZHRoOworICAgICAgICBwcmV2aWV3X2RpbS5oZWlnaHQgPSB0ZXN0X29iai0+cHJldmlld19yZXNvbHV0aW9uLnVzZXJfaW5wdXRfZGlzcGxheV9oZWlnaHQ7CisgICAgfQorICAgIExPR0koInByZXZpZXcgZGltZXNpb246ICVkIHggJWRcbiIsICBwcmV2aWV3X2RpbS53aWR0aCwgcHJldmlld19kaW0uaGVpZ2h0KTsKKworICAgIHN0cmVhbSA9IG1tX2FwcF9hZGRfc3RyZWFtKHRlc3Rfb2JqLCBjaGFubmVsKTsKKyAgICBpZiAoTlVMTCA9PSBzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiYWRkIHN0cmVhbSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5nZXRfYnVmcyA9IG1tX2FwcF9zdHJlYW1faW5pdGJ1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLnB1dF9idWZzID0gbW1fYXBwX3N0cmVhbV9kZWluaXRidWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5jbGVhbl9pbnZhbGlkYXRlX2J1ZiA9CisgICAgICAgICAgICBtbV9hcHBfc3RyZWFtX2NsZWFuX2ludmFsaWRhdGVfYnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuaW52YWxpZGF0ZV9idWYgPSBtbV9hcHBfc3RyZWFtX2ludmFsaWRhdGVfYnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwudXNlcl9kYXRhID0gKHZvaWQgKilzdHJlYW07CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1fY2IgPSBzdHJlYW1fY2I7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1fY2Jfc3luYyA9IE5VTEw7CisgICAgc3RyZWFtLT5zX2NvbmZpZy51c2VyZGF0YSA9IHVzZXJkYXRhOworICAgIHN0cmVhbS0+bnVtX29mX2J1ZnMgPSBudW1fYnVmczsKKworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8gPSAoY2FtX3N0cmVhbV9pbmZvX3QgKilzdHJlYW0tPnNfaW5mb19idWYuYnVmLmJ1ZmZlcjsKKyAgICBtZW1zZXQoc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mbywgMCwgc2l6ZW9mKGNhbV9zdHJlYW1faW5mb190KSk7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUgPSBDQU1fU1RSRUFNX1RZUEVfUFJFVklFVzsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5zdHJlYW1pbmdfbW9kZSA9IENBTV9TVFJFQU1JTkdfTU9ERV9DT05USU5VT1VTOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmZtdCA9IERFRkFVTFRfUFJFVklFV19GT1JNQVQ7CisKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5kaW0ud2lkdGggPSBwcmV2aWV3X2RpbS53aWR0aDsKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvLT5kaW0uaGVpZ2h0ID0gcHJldmlld19kaW0uaGVpZ2h0OworCisgICAgc3RyZWFtLT5zX2NvbmZpZy5wYWRkaW5nX2luZm8gPSBjYW1fY2FwLT5wYWRkaW5nX2luZm87CisKKyAgICByYyA9IG1tX2FwcF9jb25maWdfc3RyZWFtKHRlc3Rfb2JqLCBjaGFubmVsLCBzdHJlYW0sICZzdHJlYW0tPnNfY29uZmlnKTsKKyAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHJjKSB7CisgICAgICAgIExPR0UoImNvbmZpZyBwcmV2aWV3IHN0cmVhbSBlcnI9JWRcbiIsICByYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBzdHJlYW07Cit9CisKKworbW1fY2FtZXJhX3N0cmVhbV90ICogbW1fYXBwX2FkZF92aWRlb19zbmFwc2hvdF9zdHJlYW0obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfbm90aWZ5X3Qgc3RyZWFtX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9idWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1fYnVyc3QpCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc3RyZWFtID0gTlVMTDsKKyAgICBjYW1fY2FwYWJpbGl0eV90ICpjYW1fY2FwID0gKGNhbV9jYXBhYmlsaXR5X3QgKikodGVzdF9vYmotPmNhcF9idWYuYnVmLmJ1ZmZlcik7CisKKyAgICBzdHJlYW0gPSBtbV9hcHBfYWRkX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCk7CisgICAgaWYgKE5VTEwgPT0gc3RyZWFtKSB7CisgICAgICAgIExPR0UoImFkZCBzdHJlYW0gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5nZXRfYnVmcyA9IG1tX2FwcF9zdHJlYW1faW5pdGJ1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLnB1dF9idWZzID0gbW1fYXBwX3N0cmVhbV9kZWluaXRidWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5jbGVhbl9pbnZhbGlkYXRlX2J1ZiA9CisgICAgICBtbV9hcHBfc3RyZWFtX2NsZWFuX2ludmFsaWRhdGVfYnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuaW52YWxpZGF0ZV9idWYgPSBtbV9hcHBfc3RyZWFtX2ludmFsaWRhdGVfYnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwudXNlcl9kYXRhID0gKHZvaWQgKilzdHJlYW07CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1fY2IgPSBzdHJlYW1fY2I7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1fY2Jfc3luYyA9IE5VTEw7CisgICAgc3RyZWFtLT5zX2NvbmZpZy51c2VyZGF0YSA9IHVzZXJkYXRhOworICAgIHN0cmVhbS0+bnVtX29mX2J1ZnMgPSBudW1fYnVmczsKKworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8gPSAoY2FtX3N0cmVhbV9pbmZvX3QgKilzdHJlYW0tPnNfaW5mb19idWYuYnVmLmJ1ZmZlcjsKKyAgICBtZW1zZXQoc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mbywgMCwgc2l6ZW9mKGNhbV9zdHJlYW1faW5mb190KSk7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+c3RyZWFtX3R5cGUgPSBDQU1fU1RSRUFNX1RZUEVfU05BUFNIT1Q7CisgICAgaWYgKG51bV9idXJzdCA9PSAwKSB7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0NPTlRJTlVPVVM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+c3RyZWFtaW5nX21vZGUgPSBDQU1fU1RSRUFNSU5HX01PREVfQlVSU1Q7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPm51bV9vZl9idXJzdCA9IG51bV9idXJzdDsKKyAgICB9CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+Zm10ID0gREVGQVVMVF9TTkFQU0hPVF9GT1JNQVQ7CisgICAgaWYgKCB0ZXN0X29iai0+YnVmZmVyX3dpZHRoID09IDAgfHwgdGVzdF9vYmotPmJ1ZmZlcl9oZWlnaHQgPT0gMCApIHsKKyAgICAgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+ZGltLndpZHRoID0gREVGQVVMVF9TTkFQU0hPVF9XSURUSDsKKyAgICAgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+ZGltLmhlaWdodCA9IERFRkFVTFRfU05BUFNIT1RfSEVJR0hUOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS53aWR0aCA9IHRlc3Rfb2JqLT5idWZmZXJfd2lkdGg7CisgICAgICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS5oZWlnaHQgPSB0ZXN0X29iai0+YnVmZmVyX2hlaWdodDsKKyAgICB9CisgICAgc3RyZWFtLT5zX2NvbmZpZy5wYWRkaW5nX2luZm8gPSBjYW1fY2FwLT5wYWRkaW5nX2luZm87CisgICAgLyogTWFrZSBvZmZzZXQgYXMgemVybyBhcyBDUFAgd2lsbCBub3QgYmUgdXNlZCAgKi8KKyAgICBzdHJlYW0tPnNfY29uZmlnLnBhZGRpbmdfaW5mby5vZmZzZXRfaW5mby5vZmZzZXRfeCA9IDA7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5wYWRkaW5nX2luZm8ub2Zmc2V0X2luZm8ub2Zmc2V0X3kgPSAwOworCisgICAgcmMgPSBtbV9hcHBfY29uZmlnX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc3RyZWFtLCAmc3RyZWFtLT5zX2NvbmZpZyk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJjb25maWcgcHJldmlldyBzdHJlYW0gZXJyPSVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtOworCit9CisKKworbW1fY2FtZXJhX3N0cmVhbV90ICogbW1fYXBwX2FkZF92aWRlb19zdHJlYW0obW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2NhbWVyYV9idWZfbm90aWZ5X3Qgc3RyZWFtX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG51bV9idWZzKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnN0cmVhbSA9IE5VTEw7CisgICAgY2FtX2NhcGFiaWxpdHlfdCAqY2FtX2NhcCA9IChjYW1fY2FwYWJpbGl0eV90ICopKHRlc3Rfb2JqLT5jYXBfYnVmLmJ1Zi5idWZmZXIpOworCisgICAgY2FtX3N0cmVhbV9zaXplX2luZm9fdCBhYmNfc25hcCA7CisgICAgbWVtc2V0ICgmYWJjX3NuYXAgLCAwLCBzaXplb2YgKGNhbV9zdHJlYW1fc2l6ZV9pbmZvX3QpKTsKKworICAgIGFiY19zbmFwLm51bV9zdHJlYW1zID0gMzsKKyAgICBhYmNfc25hcC5wb3N0cHJvY2Vzc19tYXNrWzJdID0gMjE3ODsKKyAgICBhYmNfc25hcC5zdHJlYW1fc2l6ZXNbMl0ud2lkdGggPSBERUZBVUxUX1BSRVZJRVdfV0lEVEg7CisgICAgYWJjX3NuYXAuc3RyZWFtX3NpemVzWzJdLmhlaWdodCA9IERFRkFVTFRfUFJFVklFV19IRUlHSFQ7CisgICAgYWJjX3NuYXAudHlwZVsyXSA9IENBTV9TVFJFQU1fVFlQRV9QUkVWSUVXOworCisgICAgYWJjX3NuYXAucG9zdHByb2Nlc3NfbWFza1sxXSA9IDIxNzg7CisgICAgYWJjX3NuYXAuc3RyZWFtX3NpemVzWzFdLndpZHRoID0gREVGQVVMVF9QUkVWSUVXX1dJRFRIOworICAgIGFiY19zbmFwLnN0cmVhbV9zaXplc1sxXS5oZWlnaHQgPSBERUZBVUxUX1BSRVZJRVdfSEVJR0hUOworICAgIGFiY19zbmFwLnR5cGVbMV0gPSBDQU1fU1RSRUFNX1RZUEVfVklERU87CisKKyAgICBhYmNfc25hcC5wb3N0cHJvY2Vzc19tYXNrWzBdID0gMDsKKwlpZiAoIHRlc3Rfb2JqLT5idWZmZXJfd2lkdGggPT0gMCB8fCB0ZXN0X29iai0+YnVmZmVyX2hlaWdodCA9PSAwICkgeworICAgICAgICBhYmNfc25hcC5zdHJlYW1fc2l6ZXNbMF0ud2lkdGggPSBERUZBVUxUX1NOQVBTSE9UX1dJRFRIOworICAgICAgICBhYmNfc25hcC5zdHJlYW1fc2l6ZXNbMF0uaGVpZ2h0ID0gREVGQVVMVF9TTkFQU0hPVF9IRUlHSFQ7CisJfSBlbHNlIHsKKyAgICAgICAgYWJjX3NuYXAuc3RyZWFtX3NpemVzWzBdLndpZHRoID0gdGVzdF9vYmotPmJ1ZmZlcl93aWR0aDsKKyAgICAgICAgYWJjX3NuYXAuc3RyZWFtX3NpemVzWzBdLmhlaWdodCA9IHRlc3Rfb2JqLT5idWZmZXJfaGVpZ2h0OworCX0KKyAgICBhYmNfc25hcC50eXBlWzBdID0gQ0FNX1NUUkVBTV9UWVBFX1NOQVBTSE9UOworCisgICAgYWJjX3NuYXAuYnVmZmVyX2luZm8ubWluX2J1ZmZlcnMgPSA3OworICAgIGFiY19zbmFwLmJ1ZmZlcl9pbmZvLm1heF9idWZmZXJzID0gNzsKKyAgICBhYmNfc25hcC5pc190eXBlWzBdID0gSVNfVFlQRV9OT05FOworCisgICAgcmMgPSBzZXRtZXRhaW5mb0NvbW1hbmQodGVzdF9vYmosICZhYmNfc25hcCk7CisgICAgaWYgKHJjICE9IE1NX0NBTUVSQV9PSykgeworICAgICAgIExPR0UoIm1ldGEgaW5mbyBjb21tYW5kIHNuYXBzaG90IGZhaWxlZFxuIik7CisgICAgfQorCisgICAgc3RyZWFtID0gbW1fYXBwX2FkZF9zdHJlYW0odGVzdF9vYmosIGNoYW5uZWwpOworICAgIGlmIChOVUxMID09IHN0cmVhbSkgeworICAgICAgICBMT0dFKCJhZGQgc3RyZWFtIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuZ2V0X2J1ZnMgPSBtbV9hcHBfc3RyZWFtX2luaXRidWY7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5tZW1fdnRibC5wdXRfYnVmcyA9IG1tX2FwcF9zdHJlYW1fZGVpbml0YnVmOworICAgIHN0cmVhbS0+c19jb25maWcubWVtX3Z0YmwuY2xlYW5faW52YWxpZGF0ZV9idWYgPQorICAgICAgICAgICAgbW1fYXBwX3N0cmVhbV9jbGVhbl9pbnZhbGlkYXRlX2J1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLmludmFsaWRhdGVfYnVmID0gbW1fYXBwX3N0cmVhbV9pbnZhbGlkYXRlX2J1ZjsKKyAgICBzdHJlYW0tPnNfY29uZmlnLm1lbV92dGJsLnVzZXJfZGF0YSA9ICh2b2lkICopc3RyZWFtOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2NiID0gc3RyZWFtX2NiOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2NiX3N5bmMgPSBOVUxMOworICAgIHN0cmVhbS0+c19jb25maWcudXNlcmRhdGEgPSB1c2VyZGF0YTsKKyAgICBzdHJlYW0tPm51bV9vZl9idWZzID0gbnVtX2J1ZnM7CisKKyAgICBzdHJlYW0tPnNfY29uZmlnLnN0cmVhbV9pbmZvID0gKGNhbV9zdHJlYW1faW5mb190ICopc3RyZWFtLT5zX2luZm9fYnVmLmJ1Zi5idWZmZXI7CisgICAgbWVtc2V0KHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8sIDAsIHNpemVvZihjYW1fc3RyZWFtX2luZm9fdCkpOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbV90eXBlID0gQ0FNX1NUUkVBTV9UWVBFX1ZJREVPOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPnN0cmVhbWluZ19tb2RlID0gQ0FNX1NUUkVBTUlOR19NT0RFX0NPTlRJTlVPVVM7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+Zm10ID0gREVGQVVMVF9WSURFT19GT1JNQVQ7CisgICAgc3RyZWFtLT5zX2NvbmZpZy5zdHJlYW1faW5mby0+ZGltLndpZHRoID0gREVGQVVMVF9QUkVWSUVXX1dJRFRIOworICAgIHN0cmVhbS0+c19jb25maWcuc3RyZWFtX2luZm8tPmRpbS5oZWlnaHQgPSBERUZBVUxUX1BSRVZJRVdfSEVJR0hUOworICAgIHN0cmVhbS0+c19jb25maWcucGFkZGluZ19pbmZvID0gY2FtX2NhcC0+cGFkZGluZ19pbmZvOworCisgICAgcmMgPSBtbV9hcHBfY29uZmlnX3N0cmVhbSh0ZXN0X29iaiwgY2hhbm5lbCwgc3RyZWFtLCAmc3RyZWFtLT5zX2NvbmZpZyk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJjb25maWcgcHJldmlldyBzdHJlYW0gZXJyPSVkXG4iLCAgcmMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyZWFtOworfQorCittbV9jYW1lcmFfY2hhbm5lbF90ICogbW1fYXBwX2FkZF92aWRlb19jaGFubmVsKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaikKK3sKKyAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpjaGFubmVsID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfc3RyZWFtX3QgKnN0cmVhbSA9IE5VTEw7CisKKyAgICBjaGFubmVsID0gbW1fYXBwX2FkZF9jaGFubmVsKHRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1fQ0hBTk5FTF9UWVBFX1ZJREVPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICBpZiAoTlVMTCA9PSBjaGFubmVsKSB7CisgICAgICAgIExPR0UoImFkZCBjaGFubmVsIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzdHJlYW0gPSBtbV9hcHBfYWRkX3ZpZGVvX3N0cmVhbSh0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2FwcF92aWRlb19ub3RpZnlfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKil0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBpZiAoTlVMTCA9PSBzdHJlYW0pIHsKKyAgICAgICAgTE9HRSgiYWRkIHZpZGVvIHN0cmVhbSBmYWlsZWRcbiIpOworICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIGNoYW5uZWwpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gY2hhbm5lbDsKK30KKworaW50IG1tX2FwcF9zdGFydF9yZWNvcmRfcHJldmlldyhtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmosCisJbW1fY2FtZXJhX2xpYl9zbmFwc2hvdF9wYXJhbXMgKmRpbSkKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqcF9jaCA9IE5VTEw7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqdl9jaCA9IE5VTEw7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqc19jaCA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzX3ByZXZpZXcgPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc19tZXRhZGF0YSA9IE5VTEw7CisgICAgbW1fY2FtZXJhX3N0cmVhbV90ICpzX21haW4gPSBOVUxMOworICAgIG1tX2NhbWVyYV9zdHJlYW1fdCAqc192aWRlbyA9IE5VTEw7CisKKworCWlmIChkaW0gIT0gTlVMTCkgeworICAgICAgICB0ZXN0X29iai0+YnVmZmVyX3dpZHRoICA9IGRpbS0+d2lkdGg7CisgICAgICAgIHRlc3Rfb2JqLT5idWZmZXJfaGVpZ2h0ID0gZGltLT5oZWlnaHQ7CisJfQorICAgIC8qIENyZWF0ZSBWaWRlbyBDaGFubmVsICovCisgICAgdl9jaCA9IG1tX2FwcF9hZGRfY2hhbm5lbCh0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1NX0NIQU5ORUxfVFlQRV9WSURFTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgaWYgKE5VTEwgPT0gdl9jaCkgeworICAgICAgICBMT0dFKCJhZGQgY2hhbm5lbCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC1NTV9DQU1FUkFfRV9HRU5FUkFMOworICAgIH0KKworICAgLyogQWRkIFZpZGVvIFN0cmVhbSAqLworICAgIHNfdmlkZW8gPSBtbV9hcHBfYWRkX3ZpZGVvX3N0cmVhbSh0ZXN0X29iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1fYXBwX3ZpZGVvX25vdGlmeV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKXRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSURFT19CVUZfTlVNKTsKKworICAgIGlmIChOVUxMID09IHNfdmlkZW8pIHsKKyAgICAgICAgTE9HRSgiYWRkIHZpZGVvIHN0cmVhbSBmYWlsZWRcbiIpOworICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIHZfY2gpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogQ3JlYXRlIFByZXZpZXcgQ2hhbm5lbCAqLworICAgIHBfY2ggPSBtbV9hcHBfYWRkX2NoYW5uZWwodGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DSEFOTkVMX1RZUEVfUFJFVklFVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgLyogQWRkIFByZXZpZXcgc3RyZWFtIHRvIENoYW5uZWwgKi8KKyAgICBpZiAoTlVMTCA9PSBwX2NoKSB7CisgICAgICAgIExPR0UoImFkZCBjaGFubmVsIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gLU1NX0NBTUVSQV9FX0dFTkVSQUw7CisgICAgfQorCisKKyAgICBzX3ByZXZpZXcgPSBtbV9hcHBfYWRkX3ZpZGVvX3ByZXZpZXdfc3RyZWFtKHRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tX2FwcF9wcmV2aWV3X25vdGlmeV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVWSUVXX0JVRl9OVU0pOworICAgIGlmIChOVUxMID09IHNfcHJldmlldykgeworICAgICAgICBMT0dFKCJhZGQgcHJldmlldyBzdHJlYW0gZmFpbGVkXG4iKTsKKyAgICAgICAgbW1fYXBwX2RlbF9jaGFubmVsKHRlc3Rfb2JqLCBwX2NoKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgICAvKiBDcmVhdGUgU25hcHNob3QgQ2hhbm5lbCAqLworICAgIHNfY2ggPSBtbV9hcHBfYWRkX2NoYW5uZWwodGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNTV9DSEFOTkVMX1RZUEVfU05BUFNIT1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGlmIChOVUxMID09IHNfY2gpIHsKKyAgICAgICAgTE9HRSgiYWRkIGNoYW5uZWwgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtTU1fQ0FNRVJBX0VfR0VORVJBTDsKKyAgICB9CisKKyAgICAvKiBBZGQgU25hcHNob3QgU3RyZWFtICovCisgICAgc19tYWluID0gbW1fYXBwX2FkZF92aWRlb19zbmFwc2hvdF9zdHJlYW0odGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc19jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9hcHBfc25hcHNob3Rfbm90aWZ5X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopdGVzdF9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBpZiAoTlVMTCA9PSBzX21haW4pIHsKKyAgICAgICAgTE9HRSgiYWRkIG1haW4gc25hcHNob3Qgc3RyZWFtIGZhaWxlZFxuIik7CisgICAgICAgIG1tX2FwcF9kZWxfY2hhbm5lbCh0ZXN0X29iaiwgc19jaCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKworICAgIC8qIEFkZCBNZXRhZGF0YSBTdHJlYW0gdG8gcHJldmlldyBjaGFubmVsICovCisgICAgc19tZXRhZGF0YSA9IG1tX2FwcF9hZGRfbWV0YWRhdGFfc3RyZWFtKHRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbV9hcHBfbWV0YWRhdGFfbm90aWZ5X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKXRlc3Rfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVWSUVXX0JVRl9OVU0pOworCisgICAgaWYgKE5VTEwgPT0gc19tZXRhZGF0YSkgeworICAgICAgICBMT0dFKCJhZGQgbWV0YWRhdGEgc3RyZWFtIGZhaWxlZFxuIik7CisgICAgICAgIG1tX2FwcF9kZWxfY2hhbm5lbCh0ZXN0X29iaiwgcF9jaCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiBTdGFydCBQcmV2aWV3IENoYW5uZWwgKi8KKyAgICByYyA9IG1tX2FwcF9zdGFydF9jaGFubmVsKHRlc3Rfb2JqLCBwX2NoKTsKKyAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHJjKSB7CisgICAgICAgIExPR0UoInN0YXJ0IHByZXZpZXcgZmFpbGVkIHJjPSVkXG4iLCByYyk7CisgICAgICAgIG1tX2FwcF9kZWxfY2hhbm5lbCh0ZXN0X29iaiwgcF9jaCk7CisgICAgICAgIG1tX2FwcF9kZWxfY2hhbm5lbCh0ZXN0X29iaiwgdl9jaCk7CisgICAgICAgIG1tX2FwcF9kZWxfY2hhbm5lbCh0ZXN0X29iaiwgc19jaCk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKiBTdGFydCBWaWRlbyBDaGFubmVsICovCisgICAgcmMgPSBtbV9hcHBfc3RhcnRfY2hhbm5lbCh0ZXN0X29iaiwgdl9jaCk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJzdGFydCBwcmV2aWV3IGZhaWxlZCByYz0lZFxuIiwgcmMpOworICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIHBfY2gpOworICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIHZfY2gpOworICAgICAgICBtbV9hcHBfZGVsX2NoYW5uZWwodGVzdF9vYmosIHNfY2gpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fYXBwX3N0b3BfcmVjb3JkX3ByZXZpZXcobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpwX2NoID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICp2X2NoID0gTlVMTDsKKyAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICpzX2NoID0gTlVMTDsKKworICAgIHBfY2ggPSBtbV9hcHBfZ2V0X2NoYW5uZWxfYnlfdHlwZSh0ZXN0X29iaiwgTU1fQ0hBTk5FTF9UWVBFX1BSRVZJRVcpOworICAgIHZfY2ggPSBtbV9hcHBfZ2V0X2NoYW5uZWxfYnlfdHlwZSh0ZXN0X29iaiwgTU1fQ0hBTk5FTF9UWVBFX1ZJREVPKTsKKyAgICBzX2NoID0gbW1fYXBwX2dldF9jaGFubmVsX2J5X3R5cGUodGVzdF9vYmosIE1NX0NIQU5ORUxfVFlQRV9TTkFQU0hPVCk7CisKKyAgICByYyA9IG1tX2FwcF9zdG9wX2FuZF9kZWxfY2hhbm5lbCh0ZXN0X29iaiwgcF9jaCk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJTdG9wIFByZXZpZXcgZmFpbGVkIHJjPSVkXG4iLCByYyk7CisgICAgfQorCisgICAgcmMgPSBtbV9hcHBfc3RvcF9hbmRfZGVsX2NoYW5uZWwodGVzdF9vYmosIHZfY2gpOworICAgIGlmIChNTV9DQU1FUkFfT0sgIT0gcmMpIHsKKyAgICAgICAgTE9HRSgiU3RvcCBQcmV2aWV3IGZhaWxlZCByYz0lZFxuIiwgcmMpOworICAgIH0KKworICAgIHJjID0gbW1fYXBwX3N0b3BfYW5kX2RlbF9jaGFubmVsKHRlc3Rfb2JqLCBzX2NoKTsKKyAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHJjKSB7CisgICAgICAgIExPR0UoIlN0b3AgUHJldmlldyBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfc3RhcnRfcmVjb3JkKG1tX2NhbWVyYV90ZXN0X29ial90ICp0ZXN0X29iaikKK3sKKyAgICBpbnQgcmMgPSBNTV9DQU1FUkFfT0s7CisgICAgbW1fY2FtZXJhX2NoYW5uZWxfdCAqdl9jaCA9IE5VTEw7CisKKyAgICB2X2NoID0gbW1fYXBwX2dldF9jaGFubmVsX2J5X3R5cGUodGVzdF9vYmosIE1NX0NIQU5ORUxfVFlQRV9WSURFTyk7CisKKyAgICByYyA9IG1tX2FwcF9zdGFydF9jaGFubmVsKHRlc3Rfb2JqLCB2X2NoKTsKKyAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHJjKSB7CisgICAgICAgIExPR0UoInN0YXJ0IHJlY29yZGluZyBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfc3RvcF9yZWNvcmQobW1fY2FtZXJhX3Rlc3Rfb2JqX3QgKnRlc3Rfb2JqKQoreworICAgIGludCByYyA9IE1NX0NBTUVSQV9PSzsKKyAgICBtbV9jYW1lcmFfY2hhbm5lbF90ICp2X2NoID0gTlVMTDsKKworICAgIHZfY2ggPSBtbV9hcHBfZ2V0X2NoYW5uZWxfYnlfdHlwZSh0ZXN0X29iaiwgTU1fQ0hBTk5FTF9UWVBFX1ZJREVPKTsKKworICAgIHJjID0gbW1fYXBwX3N0b3BfY2hhbm5lbCh0ZXN0X29iaiwgdl9jaCk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJzdG9wIHJlY29yZGluZyBmYWlsZWQgcmM9JWRcbiIsIHJjKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBtbV9hcHBfc3RhcnRfbGl2ZV9zbmFwc2hvdChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKnNfY2ggPSBOVUxMOworCisgICAgc19jaCA9IG1tX2FwcF9nZXRfY2hhbm5lbF9ieV90eXBlKHRlc3Rfb2JqLCBNTV9DSEFOTkVMX1RZUEVfU05BUFNIT1QpOworCisgICAgcmMgPSBtbV9hcHBfc3RhcnRfY2hhbm5lbCh0ZXN0X29iaiwgc19jaCk7CisgICAgaWYgKE1NX0NBTUVSQV9PSyAhPSByYykgeworICAgICAgICBMT0dFKCJzdGFydCByZWNvcmRpbmcgZmFpbGVkIHJjPSVkXG4iLCByYyk7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitpbnQgbW1fYXBwX3N0b3BfbGl2ZV9zbmFwc2hvdChtbV9jYW1lcmFfdGVzdF9vYmpfdCAqdGVzdF9vYmopCit7CisgICAgaW50IHJjID0gTU1fQ0FNRVJBX09LOworICAgIG1tX2NhbWVyYV9jaGFubmVsX3QgKnNfY2ggPSBOVUxMOworCisgICAgc19jaCA9IG1tX2FwcF9nZXRfY2hhbm5lbF9ieV90eXBlKHRlc3Rfb2JqLCBNTV9DSEFOTkVMX1RZUEVfU05BUFNIT1QpOworCisgICAgcmMgPSBtbV9hcHBfc3RvcF9jaGFubmVsKHRlc3Rfb2JqLCBzX2NoKTsKKyAgICBpZiAoTU1fQ0FNRVJBX09LICE9IHJjKSB7CisgICAgICAgIExPR0UoInN0b3AgcmVjb3JkaW5nIGZhaWxlZCByYz0lZFxuIiwgcmMpOworICAgIH0KKworICAgIHJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9BbmRyb2lkLm1rIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1Nzk2YgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsODIgQEAKK09MRF9MT0NBTF9QQVRIIDo9ICQoTE9DQUxfUEFUSCkKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uLy4uL2NvbW1vbi5taworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9ICQoQk9BUkRfUVRJX0NBTUVSQV8zMkJJVF9PTkxZKQorTE9DQUxfQ0ZMQUdTKz0gLURfQU5EUk9JRF8gLURRQ0FNRVJBX1JFREVGSU5FX0xPRworCitMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgorCitMT0NBTF9DX0lOQ0xVREVTKz0gJChrZXJuZWxfaW5jbHVkZXMpCitMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKGNvbW1vbl9kZXBzKQorCitMSUIyRF9ST1RBVElPTj1mYWxzZQorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAorICAgICQoTE9DQUxfUEFUSCkvaW5jIFwKKyAgICAkKExPQ0FMX1BBVEgpLy4uL2NvbW1vbiBcCisgICAgJChMT0NBTF9QQVRIKS8uLi9tbS1jYW1lcmEtaW50ZXJmYWNlL2luYyBcCisgICAgJChMT0NBTF9QQVRIKS8uLi8uLi8uLiBcCisgICAgJChMT0NBTF9QQVRIKS8uLi8uLi8uLi9tbS1pbWFnZS1jb2RlYy9xZXhpZiBcCisgICAgJChMT0NBTF9QQVRIKS8uLi8uLi8uLi9tbS1pbWFnZS1jb2RlYy9xb214X2NvcmUKKworaWZlcSAoJChzdHJpcCAkKExJQjJEX1JPVEFUSU9OKSksdHJ1ZSkKKyAgICBMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvLi4vbW0tbGliMmQtaW50ZXJmYWNlL2luYworICAgIExPQ0FMX0NGTEFHUyArPSAtRExJQjJEX1JPVEFUSU9OX0VOQUJMRQorZW5kaWYKKworCitpZmVxICgkKHN0cmlwICQoVEFSR0VUX1VTRVNfSU9OKSksdHJ1ZSkKKyAgICBMT0NBTF9DRkxBR1MgKz0gLURVU0VfSU9OCitlbmRpZgorCitpZm5lcSAoLCQoZmlsdGVyICBtc204NjEwLCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSkpCisgICAgTE9DQUxfQ0ZMQUdTKz0gLURMT0FEX0FEU1BfUlBDX0xJQgorZW5kaWYKKworRFVBTF9KUEVHX1RBUkdFVF9MSVNUIDo9IG1zbTg5NzQKK0RVQUxfSlBFR19UQVJHRVRfTElTVCArPSBtc204OTk0CisKK2lmbmVxICgsJChmaWx0ZXIgICQoRFVBTF9KUEVHX1RBUkdFVF9MSVNUKSwkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpKQorICAgIExPQ0FMX0NGTEFHUys9IC1ETU1fSlBFR19DT05DVVJSRU5UX1NFU1NJT05TX0NPVU5UPTIKK2Vsc2UKKyAgICBMT0NBTF9DRkxBR1MrPSAtRE1NX0pQRUdfQ09OQ1VSUkVOVF9TRVNTSU9OU19DT1VOVD0xCitlbmRpZgorCitKUEVHX1BJUEVMSU5FX1RBUkdFVF9MSVNUIDo9IG1zbTg5OTQKK0pQRUdfUElQRUxJTkVfVEFSR0VUX0xJU1QgKz0gbXNtODk5MgorSlBFR19QSVBFTElORV9UQVJHRVRfTElTVCArPSBtc204OTk2CitKUEVHX1BJUEVMSU5FX1RBUkdFVF9MSVNUICs9IG1zbWNvYmFsdAorCitpZm5lcSAoLCQoZmlsdGVyICAkKEpQRUdfUElQRUxJTkVfVEFSR0VUX0xJU1QpLCQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKSkpCisgICAgTE9DQUxfQ0ZMQUdTKz0gLURNTV9KUEVHX1VTRV9QSVBFTElORQorZW5kaWYKKworIyBTeXN0ZW0gaGVhZGVyIGZpbGUgcGF0aCBwcmVmaXgKK0xPQ0FMX0NGTEFHUyArPSAtRFNZU1RFTV9IRUFERVJfUFJFRklYPXN5cworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIHNyYy9tbV9qcGVnX3F1ZXVlLmMgXAorICAgIHNyYy9tbV9qcGVnX2V4aWYuYyBcCisgICAgc3JjL21tX2pwZWcuYyBcCisgICAgc3JjL21tX2pwZWdfaW50ZXJmYWNlLmMgXAorICAgIHNyYy9tbV9qcGVnX2lvbmJ1Zi5jIFwKKyAgICBzcmMvbW1fanBlZ2RlY19pbnRlcmZhY2UuYyBcCisgICAgc3JjL21tX2pwZWdkZWMuYyBcCisgICAgc3JjL21tX2pwZWdfbXBvX2NvbXBvc2VyLmMKKworTE9DQUxfTU9EVUxFICAgICAgICAgICA6PSBsaWJtbWpwZWdfaW50ZXJmYWNlCitMT0NBTF9QUkVMSU5LX01PRFVMRSAgIDo9IGZhbHNlCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmRsIGxpYmN1dGlscyBsaWJsb2cgbGlicW9teF9jb3JlIGxpYm1tY2FtZXJhX2ludGVyZmFjZQoraWZlcSAoJChzdHJpcCAkKExJQjJEX1JPVEFUSU9OKSksdHJ1ZSkKKyAgICBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYm1tbGliMmRfaW50ZXJmYWNlCitlbmRpZgorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfMzJfQklUX09OTFkgOj0gJChCT0FSRF9RVElfQ0FNRVJBXzMyQklUX09OTFkpCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK0xPQ0FMX1BBVEggOj0gJChPTERfTE9DQUxfUEFUSCkKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9pbmMvbW1fanBlZy5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL2luYy9tbV9qcGVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjMDdkNgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9pbmMvbW1fanBlZy5oCkBAIC0wLDAgKzEsNTM2IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgTU1fSlBFR19IXworI2RlZmluZSBNTV9KUEVHX0hfCisKKy8vIE9wZW5NQVggZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiT01YX1R5cGVzLmgiCisjaW5jbHVkZSAiT01YX0luZGV4LmgiCisjaW5jbHVkZSAiT01YX0NvcmUuaCIKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiUU9NWF9KcGVnRXh0ZW5zaW9ucy5oIgorCisvLyBKUEVHIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX2pwZWdfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibW1fanBlZ19pb25idWYuaCIKKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgImNhbV9saXN0LmgiCisjaW5jbHVkZSAiY2FtX3NlbWFwaG9yZS5oIgorCisjZGVmaW5lIE1NX0pQRUdfTUFYX1RIUkVBRFMgMzAKKyNkZWZpbmUgTU1fSlBFR19DSVJRX1NJWkUgMzAKKyNkZWZpbmUgTU1fSlBFR19NQVhfU0VTU0lPTiAxMAorI2RlZmluZSBNQVhfRVhJRl9UQUJMRV9FTlRSSUVTIDUwCisjZGVmaW5lIE1BWF9KUEVHX1NJWkUgMjAwMDAwMDAKKyNkZWZpbmUgTUFYX09NWF9IQU5ETEVTICg1KQorLy8gVGh1bWJuYWlsIHNyYyBhbmQgZGVzdCBhc3BlY3QgcmF0aW8gZGlmZnJlbmNlIHRvbGVyYW5jZQorI2RlZmluZSBBU1BFQ1RfVE9MRVJBTkNFIDAuMDAxCisKKworLyoqIG1tX2pwZWdfYWJvcnRfc3RhdGVfdDoKKyAqICBATU1fSlBFR19BQk9SVF9OT05FOiBBYm9ydCBpcyBub3QgaXNzdWVkCisgKiAgQE1NX0pQRUdfQUJPUlRfSU5JVDogQWJvcnQgaXMgaXNzdWVkIGZyb20gdGhlIGNsaWVudAorICogIEBNTV9KUEVHX0FCT1JUX0RPTkU6IEFib3J0IGlzIGNvbXBsZXRlZAorICoKKyAqICBTdGF0ZSByZXByZXNlbnRpbmcgdGhlIGFib3J0IHN0YXRlCisgKiovCit0eXBlZGVmIGVudW0geworICBNTV9KUEVHX0FCT1JUX05PTkUsCisgIE1NX0pQRUdfQUJPUlRfSU5JVCwKKyAgTU1fSlBFR19BQk9SVF9ET05FLAorfSBtbV9qcGVnX2Fib3J0X3N0YXRlX3Q7CisKKworLyogZGVmaW5lIG1heCBudW0gb2Ygc3VwcG9ydGVkIGNvbmN1cnJlbnQganBlZyBqb2JzIGJ5IE9NWCBlbmdpbmUuCisgKiBDdXJyZW50LCBvbmx5IG9uZSBwZXIgdGltZSAqLworI2RlZmluZSBOVU1fTUFYX0pQRUdfQ05DVVJSRU5UX0pPQlMgMgorCisjZGVmaW5lIEpPQl9JRF9NQUdJQ1ZBTCAweDEKKyNkZWZpbmUgSk9CX0hJU1RfTUFYIDEwMDAwCisKKy8qKiBEVU1QX1RPX0ZJTEU6CisgKiAgQGZpbGVuYW1lOiBmaWxlIG5hbWUKKyAqICBAcF9hZGRyOiBhZGRyZXNzIG9mIHRoZSBidWZmZXIKKyAqICBAbGVuOiBidWZmZXIgbGVuZ3RoCisgKgorICogIGR1bXAgdGhlIGltYWdlIHRvIHRoZSBmaWxlCisgKiovCisjZGVmaW5lIERVTVBfVE9fRklMRShmaWxlbmFtZSwgcF9hZGRyLCBsZW4pICh7IFwKKyAgc2l6ZV90IHJjID0gMDsgXAorICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCAidysiKTsgXAorICBpZiAoZnApIHsgXAorICAgIHJjID0gZndyaXRlKHBfYWRkciwgMSwgbGVuLCBmcCk7IFwKKyAgICBMT0dFKCJ3cml0dGVuIHNpemUgJXp1IiwgbGVuKTsgXAorICAgIGZjbG9zZShmcCk7IFwKKyAgfSBlbHNlIHsgXAorICAgIExPR0UoIm9wZW4gJXMgZmFpbGVkIiwgZmlsZW5hbWUpOyBcCisgIH0gXAorfSkKKworLyoqIERVTVBfVE9fRklMRTI6CisgKiAgQGZpbGVuYW1lOiBmaWxlIG5hbWUKKyAqICBAcF9hZGRyOiBhZGRyZXNzIG9mIHRoZSBidWZmZXIKKyAqICBAbGVuOiBidWZmZXIgbGVuZ3RoCisgKgorICogIGR1bXAgdGhlIGltYWdlIHRvIHRoZSBmaWxlIGlmIHRoZSBtZW1vcnkgaXMgbm9uLWNvbnRpZ3VvdXMKKyAqKi8KKyNkZWZpbmUgRFVNUF9UT19GSUxFMihmaWxlbmFtZSwgcF9hZGRyMSwgbGVuMSwgcGFkZHIyLCBsZW4yKSAoeyBcCisgIHNpemVfdCByYyA9IDA7IFwKKyAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZSwgIncrIik7IFwKKyAgaWYgKGZwKSB7IFwKKyAgICByYyA9IGZ3cml0ZShwX2FkZHIxLCAxLCBsZW4xLCBmcCk7IFwKKyAgICByYyA9IGZ3cml0ZShwX2FkZHIyLCAxLCBsZW4yLCBmcCk7IFwKKyAgICBMT0dFKCJ3cml0dGVuICV6dSAlenUiLCBsZW4xLCBsZW4yKTsgXAorICAgIGZjbG9zZShmcCk7IFwKKyAgfSBlbHNlIHsgXAorICAgIExPR0UoIm9wZW4gJXMgZmFpbGVkIiwgZmlsZW5hbWUpOyBcCisgIH0gXAorfSkKKworLyoqIE1NX0pQRUdfQ0hLX0FCT1JUOgorICogIEBwOiBjbGllbnQgcG9pbnRlcgorICogIEByZXQ6IHJldHVybiB2YWx1ZQorICogIEBsYWJlbDogbGFiZWwgdG8ganVtcCB0bworICoKKyAqICBjaGVjayB0aGUgYWJvcnQgZmFpbHVyZQorICoqLworI2RlZmluZSBNTV9KUEVHX0NIS19BQk9SVChwLCByZXQsIGxhYmVsKSAoeyBcCisgIGlmIChNTV9KUEVHX0FCT1JUX0lOSVQgPT0gcC0+YWJvcnRfc3RhdGUpIHsgXAorICAgIExPR0UoImpwZWcgYWJvcnQiKTsgXAorICAgIHJldCA9IE9NWF9FcnJvck5vbmU7IFwKKyAgICBnb3RvIGxhYmVsOyBcCisgIH0gXAorfSkKKworI2RlZmluZSBHRVRfQ0xJRU5UX0lEWCh4KSAoKHgpICYgMHhmZikKKyNkZWZpbmUgR0VUX1NFU1NJT05fSURYKHgpICgoKHgpID4+IDgpICYgMHhmZikKKyNkZWZpbmUgR0VUX0pPQl9JRFgoeCkgKCgoeCkgPj4gMTYpICYgMHhmZikKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1bmlvbiB7CisgICAgaW50IGlfZGF0YVtNTV9KUEVHX0NJUlFfU0laRV07CisgICAgdm9pZCAqcF9kYXRhW01NX0pQRUdfQ0lSUV9TSVpFXTsKKyAgfTsKKyAgaW50IGZyb250OworICBpbnQgcmVhcjsKKyAgaW50IGNvdW50OworICBwdGhyZWFkX211dGV4X3QgbG9jazsKK30gbW1fanBlZ19jaXJxX3Q7CisKKy8qKiBjaXJxX3Jlc2V0OgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAcTogY2lyY3VsYXIgcXVldWUKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgbm9uZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIFJlc2V0cyB0aGUgY2lyY3VsYXIgcXVldWUKKyAqCisgKiovCitzdGF0aWMgaW5saW5lIHZvaWQgY2lycV9yZXNldChtbV9qcGVnX2NpcnFfdCAqcSkKK3sKKyAgcS0+ZnJvbnQgPSAwOworICBxLT5yZWFyID0gMDsKKyAgcS0+Y291bnQgPSAwOworICBwdGhyZWFkX211dGV4X2luaXQoJnEtPmxvY2ssIE5VTEwpOworfQorCisvKiogY2lycV9lbXB0eToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHE6IGNpcmN1bGFyIHF1ZXVlCisgKgorICogIFJldHVybjoKKyAqICAgICAgIG5vbmUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBjaGVjayBpZiB0aGUgY3VyY3VsYXIgcXVldWUgaXMgZW1wdHkKKyAqCisgKiovCisjZGVmaW5lIGNpcnFfZW1wdHkocSkgKHEtPmNvdW50ID09IDApCisKKy8qKiBjaXJxX2Z1bGw6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBxOiBjaXJjdWxhciBxdWV1ZQorICoKKyAqICBSZXR1cm46CisgKiAgICAgICBub25lCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgY2hlY2sgaWYgdGhlIGN1cmN1bGFyIHF1ZXVlIGlzIGZ1bGwKKyAqCisgKiovCisjZGVmaW5lIGNpcnFfZnVsbChxKSAocS0+Y291bnQgPT0gTU1fSlBFR19DSVJRX1NJWkUpCisKKy8qKiBjaXJxX2VucXVldWU6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBxOiBjaXJjdWxhciBxdWV1ZQorICogICAgQGRhdGE6IGRhdGEgdG8gYmUgaW5zZXJ0ZWQKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgdHJ1ZS9mYWxzZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIGVucXVldWUgYW4gZWxlbWVudCBpbnRvIGNpcmN1bGFyIHF1ZXVlCisgKgorICoqLworI2RlZmluZSBjaXJxX2VucXVldWUocSwgdHlwZSwgZGF0YSkgKHsgXAorICBpbnQgcmMgPSAwOyBcCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+bG9jayk7IFwKKyAgaWYgKGNpcnFfZnVsbChxKSkgeyBcCisgICAgcmMgPSAtMTsgXAorICB9IGVsc2UgeyBcCisgICAgcS0+dHlwZVtxLT5yZWFyXSA9IGRhdGE7IFwKKyAgICBxLT5yZWFyID0gKHEtPnJlYXIgKyAxKSAlIE1NX0pQRUdfQ0lSUV9TSVpFOyBcCisgICAgcS0+Y291bnQrKzsgXAorICB9IFwKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJnEtPmxvY2spOyBcCisgIHJjOyBcCit9KQorCisvKiogY2lycV9kZXF1ZXVlOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAcTogY2lyY3VsYXIgcXVldWUKKyAqICAgIEBkYXRhOiBkYXRhIHRvIGJlIHBvcHBlZAorICoKKyAqICBSZXR1cm46CisgKiAgICAgICB0cnVlL2ZhbHNlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgZGVxdWV1ZSBhbiBlbGVtZW50IGZyb20gdGhlIGNpcmN1bGFyIHF1ZXVlCisgKgorICoqLworI2RlZmluZSBjaXJxX2RlcXVldWUocSwgdHlwZSwgZGF0YSkgKHsgXAorICBpbnQgcmMgPSAwOyBcCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcS0+bG9jayk7IFwKKyAgaWYgKGNpcnFfZW1wdHkocSkpIHsgXAorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5sb2NrKTsgXAorICAgIHJjID0gLTE7IFwKKyAgfSBlbHNlIHsgXAorICAgIGRhdGEgPSBxLT50eXBlW3EtPmZyb250XTsgXAorICAgIHEtPmNvdW50LS07IFwKKyAgfSBcCisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxLT5sb2NrKTsgXAorICByYzsgXAorfSkKKworCit0eXBlZGVmIHVuaW9uIHsKKyAgdWludDMyX3QgdTMyOworICB2b2lkKiBwOworfSBtbV9qcGVnX3FfZGF0YV90OworCisgIHR5cGVkZWYgc3RydWN0IHsKKyAgc3RydWN0IGNhbV9saXN0IGxpc3Q7CisgIG1tX2pwZWdfcV9kYXRhX3QgZGF0YTsKK30gbW1fanBlZ19xX25vZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBtbV9qcGVnX3Ffbm9kZV90IGhlYWQ7IC8qIGR1bW15IGhlYWQgKi8KKyAgdWludDMyX3Qgc2l6ZTsKKyAgcHRocmVhZF9tdXRleF90IGxvY2s7Cit9IG1tX2pwZWdfcXVldWVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgTU1fSlBFR19DTURfVFlQRV9KT0IsICAgICAgICAgIC8qIGpvYiBjbWQgKi8KKyAgTU1fSlBFR19DTURfVFlQRV9FWElULCAgICAgICAgIC8qIEVYSVQgY21kIGZvciBleGl0aW5nIGpvYk1nciB0aHJlYWQgKi8KKyAgTU1fSlBFR19DTURfVFlQRV9ERUNPREVfSk9CLAorICBNTV9KUEVHX0NNRF9UWVBFX01BWAorfSBtbV9qcGVnX2NtZF90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IG1tX2pwZWdfam9iX3Nlc3Npb24geworICB1aW50MzJfdCBjbGllbnRfaGRsOyAgICAgICAgICAgLyogY2xpZW50IGhhbmRsZXIgKi8KKyAgdWludDMyX3Qgam9iSWQ7ICAgICAgICAgICAgICAgIC8qIGpvYiBJRCAqLworICB1aW50MzJfdCBzZXNzaW9uSWQ7ICAgICAgICAgICAgLyogc2Vzc2lvbiBJRCAqLworICBtbV9qcGVnX2VuY29kZV9wYXJhbXNfdCBwYXJhbXM7IC8qIGVuY29kZSBwYXJhbXMgKi8KKyAgbW1fanBlZ19kZWNvZGVfcGFyYW1zX3QgZGVjX3BhcmFtczsgLyogZW5jb2RlIHBhcmFtcyAqLworICBtbV9qcGVnX2VuY29kZV9qb2JfdCBlbmNvZGVfam9iOyAgICAgICAgICAgICAvKiBqb2IgZGVzY3JpcHRpb24gKi8KKyAgbW1fanBlZ19kZWNvZGVfam9iX3QgZGVjb2RlX2pvYjsKKyAgcHRocmVhZF90IGVuY29kZV9waWQ7ICAgICAgICAgIC8qIGVuY29kZSB0aHJlYWQgaGFuZGxlciovCisKKyAgdm9pZCAqanBlZ19vYmo7ICAgICAgICAgICAgICAgIC8qIHB0ciB0byBtbV9qcGVnX29iaiAqLworICBqcGVnX2pvYl9zdGF0dXNfdCBqb2Jfc3RhdHVzOyAgLyogam9iIHN0YXR1cyAqLworCisgIGludCBzdGF0ZV9jaGFuZ2VfcGVuZGluZzsgICAgICAvKiBmbGFnIHRvIGluZGljYXRlIGlmIHN0YXRlIGNoYW5nZSBpcyBwZW5kaW5nICovCisgIE9NWF9FUlJPUlRZUEUgZXJyb3JfZmxhZzsgICAgICAvKiB2YXJpYWJsZSB0byBpbmRpY2F0ZSBlcnJvciBkdXJpbmcgZW5jb2RpbmcgKi8KKyAgbW1fanBlZ19hYm9ydF9zdGF0ZV90IGFib3J0X3N0YXRlOyAvKiB2YXJpYWJsZSB0byBpbmRpY2F0ZSBhYm9ydCBkdXJpbmcgZW5jb2RpbmcgKi8KKworICAvKiBPTVggcmVsYXRlZCAqLworICBPTVhfSEFORExFVFlQRSBvbXhfaGFuZGxlOyAgICAgICAgICAgICAgICAgICAgICAvKiBoYW5kbGUgdG8gb214IGVuZ2luZSAqLworICBPTVhfQ0FMTEJBQ0tUWVBFIG9teF9jYWxsYmFja3M7ICAgICAgICAgICAgICAgICAvKiBjYWxsYmFja3MgdG8gb214IGVuZ2luZSAqLworCisgIC8qIGJ1ZmZlciBoZWFkZXJzICovCisgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwX2luX29teF9idWZbTU1fSlBFR19NQVhfQlVGXTsKKyAgT01YX0JVRkZFUkhFQURFUlRZUEUgKnBfaW5fb214X3RodW1iX2J1ZltNTV9KUEVHX01BWF9CVUZdOworICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9vdXRfb214X2J1ZltNTV9KUEVHX01BWF9CVUZdOworICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9pbl9yb3Rfb214X2J1ZltNTV9KUEVHX01BWF9CVUZdOworICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9pbl9yb3Rfb214X3RodW1iX2J1ZltNTV9KUEVHX01BWF9CVUZdOworCisgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgaW5wdXRQb3J0OworICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIG91dHB1dFBvcnQ7CisgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgaW5wdXRUbWJQb3J0OworCisgIC8qIGV2ZW50IGxvY2tzICovCisgIHB0aHJlYWRfbXV0ZXhfdCBsb2NrOworICBwdGhyZWFkX2NvbmRfdCBjb25kOworCisgIFFFWElGX0lORk9fREFUQSBleGlmX2luZm9fbG9jYWxbTUFYX0VYSUZfVEFCTEVfRU5UUklFU107ICAvL2FsbCBleGlmIHRhZ3MgZm9yIEpQRUcgZW5jb2RlcgorICBpbnQgZXhpZl9jb3VudF9sb2NhbDsKKworICBtbV9qcGVnX2NpcnFfdCBjYl9xOworICBpbnQzMl90IGViZF9jb3VudDsKKyAgaW50MzJfdCBmYmRfY291bnQ7CisKKyAgLyogdGhpcyBmbGFnIHJlcHJlc2VudHMgd2hldGhlciB0aGUgam9iIGlzIGFjdGl2ZSAqLworICBPTVhfQk9PTCBhY3RpdmU7CisKKyAgLyogdGhpcyBmbGFnIGluZGljYXRlcyBpZiB0aGUgY29uZmlncmF0aW9uIGlzIGNvbXBsZXRlICovCisgIE9NWF9CT09MIGNvbmZpZzsKKworICAvKiBqb2IgaGlzdG9yeSBjb3VudCB0byBnZW5lcmF0ZSB1bmlxdWUgaWQgKi8KKyAgdW5zaWduZWQgaW50IGpvYl9oaXN0OworCisgIE9NWF9CT09MIGVuY29kaW5nOworCisgIGJ1ZmZlcl90IHdvcmtfYnVmZmVyOworICAvKiBzcmMgcm90YXRlIGlvbiBidWZzICovCisgIGJ1ZmZlcl90IHNyY19yb3RfaW9uX2J1ZmZlcltNTV9KUEVHX01BWF9CVUZdOworCisgIE9NWF9FVkVOVFRZUEUgb214RXZlbnQ7CisgIGludCBldmVudF9wZW5kaW5nOworCisgIHVpbnQ4X3QgKm1ldGFfZW5jX2tleTsKKyAgc2l6ZV90IG1ldGFfZW5jX2tleWxlbjsKKworICBzdHJ1Y3QgbW1fanBlZ19qb2Jfc2Vzc2lvbiAqbmV4dF9zZXNzaW9uOworCisgIHVpbnQzMl90IGN1cnJfb3V0X2J1Zl9pZHg7CisKKyAgdWludDMyX3QgbnVtX29teF9zZXNzaW9uczsKKyAgT01YX0JPT0wgYXV0b19vdXRfYnVmOworCisgIG1tX2pwZWdfcXVldWVfdCAqc2Vzc2lvbl9oYW5kbGVfcTsKKyAgbW1fanBlZ19xdWV1ZV90ICpvdXRfYnVmX3E7CisKKyAgaW50IHRodW1iX2Zyb21fbWFpbjsKKyAgdWludDMyX3Qgam9iX2luZGV4OworCisgIC8qIGxpYjJkIHJvdGF0aW9uIGZsYWcqLworICB1aW50MzJfdCBsaWIyZF9yb3RhdGlvbl9mbGFnOworCisgIC8qIG51bSBvZiBidWYgZm9yIGlucHV0IHNyYyByb3RhdGlvbiAqLworICB1aW50MzJfdCBudW1fc3JjX3JvdF9idWZzOworCisgIC8qIHNyYyByb3RhdGUgaW1nIGJ1ZnMgKi8KKyAgbW1fanBlZ19idWZfdCBzcmNfcm90X21haW5fYnVmW01NX0pQRUdfTUFYX0JVRl07Cit9IG1tX2pwZWdfam9iX3Nlc3Npb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBtbV9qcGVnX2VuY29kZV9qb2JfdCBlbmNvZGVfam9iOworICB1aW50MzJfdCBqb2JfaWQ7CisgIHVpbnQzMl90IGNsaWVudF9oYW5kbGU7Cit9IG1tX2pwZWdfZW5jb2RlX2pvYl9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgbW1fanBlZ19kZWNvZGVfam9iX3QgZGVjb2RlX2pvYjsKKyAgdWludDMyX3Qgam9iX2lkOworICB1aW50MzJfdCBjbGllbnRfaGFuZGxlOworfSBtbV9qcGVnX2RlY29kZV9qb2JfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCB7CisgIG1tX2pwZWdfY21kX3R5cGVfdCB0eXBlOworICB1bmlvbiB7CisgICAgbW1fanBlZ19lbmNvZGVfam9iX2luZm9fdCBlbmNfaW5mbzsKKyAgICBtbV9qcGVnX2RlY29kZV9qb2JfaW5mb190IGRlY19pbmZvOworICB9OworfSBtbV9qcGVnX2pvYl9xX25vZGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90IGlzX3VzZWQ7ICAgICAgICAgICAgICAgIC8qIGZsYWc6IGlmIGlzIGEgdmFsaWQgY2xpZW50ICovCisgIHVpbnQzMl90IGNsaWVudF9oYW5kbGU7ICAgICAgICAgLyogY2xpZW50IGhhbmRsZSAqLworICBtbV9qcGVnX2pvYl9zZXNzaW9uX3Qgc2Vzc2lvbltNTV9KUEVHX01BWF9TRVNTSU9OXTsKKyAgcHRocmVhZF9tdXRleF90IGxvY2s7ICAgICAgICAgICAvKiBqb2IgbG9jayAqLworfSBtbV9qcGVnX2NsaWVudF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHB0aHJlYWRfdCBwaWQ7ICAgICAgICAgICAgICAgICAgLyogam9iIGNtZCB0aHJlYWQgSUQgKi8KKyAgY2FtX3NlbWFwaG9yZV90IGpvYl9zZW07ICAgICAgICAvKiBzZW1hcGhvcmUgZm9yIGpvYiBjbWQgdGhyZWFkICovCisgIG1tX2pwZWdfcXVldWVfdCBqb2JfcXVldWU7ICAgICAgLyogcXVldWUgZm9yIGpvYiB0byBkbyAqLworfSBtbV9qcGVnX2pvYl9jbWRfdGhyZWFkX3Q7CisKKyNkZWZpbmUgTUFYX0pQRUdfQ0xJRU5UX05VTSA4Cit0eXBlZGVmIHN0cnVjdCBtbV9qcGVnX29ial90IHsKKyAgLyogQ2xpZW50TWdyICovCisgIGludCBudW1fY2xpZW50czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bSBvZiBjbGllbnRzICovCisgIG1tX2pwZWdfY2xpZW50X3QgY2xudF9tZ3JbTUFYX0pQRUdfQ0xJRU5UX05VTV07IC8qIGNsaWVudCBtYW5hZ2VyICovCisKKyAgLyogSm9iTWtyICovCisgIHB0aHJlYWRfbXV0ZXhfdCBqb2JfbG9jazsgICAgICAgICAgICAgICAgICAgICAgIC8qIGpvYiBsb2NrICovCisgIG1tX2pwZWdfam9iX2NtZF90aHJlYWRfdCBqb2JfbWdyOyAgICAgICAgICAgICAgIC8qIGpvYiBtZ3IgdGhyZWFkIGluY2x1ZGluZyB0b2RvX3EqLworICBtbV9qcGVnX3F1ZXVlX3Qgb25nb2luZ19qb2JfcTsgICAgICAgICAgICAgICAgICAvKiBxdWV1ZSBmb3Igb25nb2luZyBqb2JzICovCisgIGJ1ZmZlcl90IGlvbkJ1ZmZlcltNTV9KUEVHX0NPTkNVUlJFTlRfU0VTU0lPTlNfQ09VTlRdOworCisKKyAgLyogTWF4IHBpYyBkaW1lbnNpb24gZm9yIHdvcmsgYnVmIGNhbGMqLworICB1aW50MzJfdCBtYXhfcGljX3c7CisgIHVpbnQzMl90IG1heF9waWNfaDsKKyNpZmRlZiBMT0FEX0FEU1BfUlBDX0xJQgorICB2b2lkICphZHNwcnBjX2xpYl9oYW5kbGU7CisjZW5kaWYKKworICB1aW50MzJfdCB3b3JrX2J1Zl9jbnQ7CisKKyAgdWludDMyX3QgbnVtX3Nlc3Npb25zOworICB1aW50MzJfdCByZXVzZV9yZXByb2NfYnVmZmVyOworCisgIGNhbV9qcGVnX21ldGFkYXRhX3QgKmpwZWdfbWV0YWRhdGE7CisKKyAgLyogUG9pbnRlciB0byB0aGUgc2Vzc2lvbiBpbiBwcm9ncmVzcyovCisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uX2lucHJvZ3Jlc3M7CisKKyAgLy8gZHVtbXkgT01YIGhhbmRsZQorICBPTVhfSEFORExFVFlQRSBkdW1teV9oYW5kbGU7Cit9IG1tX2pwZWdfb2JqOworCisvKiogbW1fanBlZ19wZW5kaW5nX2Z1bmNfdDoKKyAqCisgKiBJbnRlcm1lZGlhdGUgZnVuY3Rpb24gZm9yIHRyYW5zaXRpb24gY2hhbmdlCisgKiovCit0eXBlZGVmIE9NWF9FUlJPUlRZUEUgKCptbV9qcGVnX3RyYW5zaXRpb25fZnVuY190KSh2b2lkICopOworCitleHRlcm4gaW50MzJfdCBtbV9qcGVnX2luaXQobW1fanBlZ19vYmogKm15X29iaik7CitleHRlcm4gaW50MzJfdCBtbV9qcGVnX2RlaW5pdChtbV9qcGVnX29iaiAqbXlfb2JqKTsKK2V4dGVybiB1aW50MzJfdCBtbV9qcGVnX25ld19jbGllbnQobW1fanBlZ19vYmogKm15X29iaik7CitleHRlcm4gaW50MzJfdCBtbV9qcGVnX3N0YXJ0X2pvYihtbV9qcGVnX29iaiAqbXlfb2JqLAorICBtbV9qcGVnX2pvYl90KiBqb2IsCisgIHVpbnQzMl90KiBqb2JJZCk7CitleHRlcm4gaW50MzJfdCBtbV9qcGVnX2Fib3J0X2pvYihtbV9qcGVnX29iaiAqbXlfb2JqLAorICB1aW50MzJfdCBqb2JJZCk7CitleHRlcm4gaW50MzJfdCBtbV9qcGVnX2Nsb3NlKG1tX2pwZWdfb2JqICpteV9vYmosCisgIHVpbnQzMl90IGNsaWVudF9oZGwpOworZXh0ZXJuIGludDMyX3QgbW1fanBlZ19jcmVhdGVfc2Vzc2lvbihtbV9qcGVnX29iaiAqbXlfb2JqLAorICB1aW50MzJfdCBjbGllbnRfaGRsLAorICBtbV9qcGVnX2VuY29kZV9wYXJhbXNfdCAqcF9wYXJhbXMsCisgIHVpbnQzMl90KiBwX3Nlc3Npb25faWQpOworZXh0ZXJuIGludDMyX3QgbW1fanBlZ19kZXN0cm95X3Nlc3Npb25fYnlfaWQobW1fanBlZ19vYmogKm15X29iaiwKKyAgdWludDMyX3Qgc2Vzc2lvbl9pZCk7CisKK2V4dGVybiBpbnQzMl90IG1tX2pwZWdkZWNfaW5pdChtbV9qcGVnX29iaiAqbXlfb2JqKTsKK2V4dGVybiBpbnQzMl90IG1tX2pwZWdkZWNfZGVpbml0KG1tX2pwZWdfb2JqICpteV9vYmopOworZXh0ZXJuIGludDMyX3QgbW1fanBlZ19qb2JtZ3JfdGhyZWFkX3JlbGVhc2UobW1fanBlZ19vYmogKiBteV9vYmopOworZXh0ZXJuIGludDMyX3QgbW1fanBlZ19qb2JtZ3JfdGhyZWFkX2xhdW5jaChtbV9qcGVnX29iaiAqbXlfb2JqKTsKK2V4dGVybiBpbnQzMl90IG1tX2pwZWdkZWNfc3RhcnRfZGVjb2RlX2pvYihtbV9qcGVnX29iaiAqbXlfb2JqLAorICBtbV9qcGVnX2pvYl90KiBqb2IsCisgIHVpbnQzMl90KiBqb2JJZCk7CisKK2V4dGVybiBpbnQzMl90IG1tX2pwZWdkZWNfY3JlYXRlX3Nlc3Npb24obW1fanBlZ19vYmogKm15X29iaiwKKyAgdWludDMyX3QgY2xpZW50X2hkbCwKKyAgbW1fanBlZ19kZWNvZGVfcGFyYW1zX3QgKnBfcGFyYW1zLAorICB1aW50MzJfdCogcF9zZXNzaW9uX2lkKTsKKworZXh0ZXJuIGludDMyX3QgbW1fanBlZ2RlY19kZXN0cm95X3Nlc3Npb25fYnlfaWQobW1fanBlZ19vYmogKm15X29iaiwKKyAgdWludDMyX3Qgc2Vzc2lvbl9pZCk7CisKK2V4dGVybiBpbnQzMl90IG1tX2pwZWdkZWNfYWJvcnRfam9iKG1tX2pwZWdfb2JqICpteV9vYmosCisgIHVpbnQzMl90IGpvYklkKTsKKworaW50MzJfdCBtbV9qcGVnZGVjX3Byb2Nlc3NfZGVjb2Rpbmdfam9iKG1tX2pwZWdfb2JqICpteV9vYmosCisgICAgbW1fanBlZ19qb2JfcV9ub2RlX3QqIGpvYl9ub2RlKTsKKworLyogdXRpbHRpdHkgZnVjbnRpb24gZGVjbGFyZWQgaW4gbW0tY2FtZXJhLWludGVmYWNlMi5jCisgKiBhbmQgbmVlZCBiZSB1c2VkIGJ5IG1tLWNhbWVyYSBhbmQgYmVsb3cqLwordWludDMyX3QgbW1fanBlZ191dGlsX2dlbmVyYXRlX2hhbmRsZXIodWludDhfdCBpbmRleCk7Cit1aW50OF90IG1tX2pwZWdfdXRpbF9nZXRfaW5kZXhfYnlfaGFuZGxlcih1aW50MzJfdCBoYW5kbGVyKTsKKworLyogYmFzaWMgcXVldWUgZnVuY3Rpb25zICovCitleHRlcm4gaW50MzJfdCBtbV9qcGVnX3F1ZXVlX2luaXQobW1fanBlZ19xdWV1ZV90KiBxdWV1ZSk7CitleHRlcm4gaW50MzJfdCBtbV9qcGVnX3F1ZXVlX2VucShtbV9qcGVnX3F1ZXVlX3QqIHF1ZXVlLAorICAgIG1tX2pwZWdfcV9kYXRhX3QgZGF0YSk7CitleHRlcm4gaW50MzJfdCBtbV9qcGVnX3F1ZXVlX2VucV9oZWFkKG1tX2pwZWdfcXVldWVfdCogcXVldWUsCisgICAgbW1fanBlZ19xX2RhdGFfdCBkYXRhKTsKK2V4dGVybiBtbV9qcGVnX3FfZGF0YV90IG1tX2pwZWdfcXVldWVfZGVxKG1tX2pwZWdfcXVldWVfdCogcXVldWUpOworZXh0ZXJuIGludDMyX3QgbW1fanBlZ19xdWV1ZV9kZWluaXQobW1fanBlZ19xdWV1ZV90KiBxdWV1ZSk7CitleHRlcm4gaW50MzJfdCBtbV9qcGVnX3F1ZXVlX2ZsdXNoKG1tX2pwZWdfcXVldWVfdCogcXVldWUpOworZXh0ZXJuIHVpbnQzMl90IG1tX2pwZWdfcXVldWVfZ2V0X3NpemUobW1fanBlZ19xdWV1ZV90KiBxdWV1ZSk7CitleHRlcm4gbW1fanBlZ19xX2RhdGFfdCBtbV9qcGVnX3F1ZXVlX3BlZWsobW1fanBlZ19xdWV1ZV90KiBxdWV1ZSk7CitleHRlcm4gaW50MzJfdCBhZGRFeGlmRW50cnkoUU9NWF9FWElGX0lORk8gKnBfZXhpZl9pbmZvLCBleGlmX3RhZ19pZF90IHRhZ2lkLAorICBleGlmX3RhZ190eXBlX3QgdHlwZSwgdWludDMyX3QgY291bnQsIHZvaWQgKmRhdGEpOworZXh0ZXJuIGludDMyX3QgcmVsZWFzZUV4aWZFbnRyeShRRVhJRl9JTkZPX0RBVEEgKnBfZXhpZl9kYXRhKTsKK2V4dGVybiBpbnQgcHJvY2Vzc19tZXRhX2RhdGEobWV0YWRhdGFfYnVmZmVyX3QgKnBfbWV0YSwKKyAgUU9NWF9FWElGX0lORk8gKmV4aWZfaW5mbywgbW1fanBlZ19leGlmX3BhcmFtc190ICpwX2NhbTNhX3BhcmFtcywKKyAgY2FtX2hhbF92ZXJzaW9uX3QgaGFsX3ZlcnNpb24pOworCitPTVhfRVJST1JUWVBFIG1tX2pwZWdfc2Vzc2lvbl9jaGFuZ2Vfc3RhdGUobW1fanBlZ19qb2Jfc2Vzc2lvbl90KiBwX3Nlc3Npb24sCisgIE9NWF9TVEFURVRZUEUgbmV3X3N0YXRlLAorICBtbV9qcGVnX3RyYW5zaXRpb25fZnVuY190IHBfZXhlYyk7CisKK2ludCBtYXBfanBlZ19mb3JtYXQobW1fanBlZ19jb2xvcl9mb3JtYXQgY29sb3JfZm10KTsKKworT01YX0JPT0wgbW1fanBlZ19zZXNzaW9uX2Fib3J0KG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uKTsKKy8qKgorICoKKyAqIHNwZWNpYWwgcXVldWUgZnVuY3Rpb25zIGZvciBqb2IgcXVldWUKKyAqKi8KK21tX2pwZWdfam9iX3Ffbm9kZV90KiBtbV9qcGVnX3F1ZXVlX3JlbW92ZV9qb2JfYnlfY2xpZW50X2lkKAorICBtbV9qcGVnX3F1ZXVlX3QqIHF1ZXVlLCB1aW50MzJfdCBjbGllbnRfaGRsKTsKK21tX2pwZWdfam9iX3Ffbm9kZV90KiBtbV9qcGVnX3F1ZXVlX3JlbW92ZV9qb2JfYnlfam9iX2lkKAorICBtbV9qcGVnX3F1ZXVlX3QqIHF1ZXVlLCB1aW50MzJfdCBqb2JfaWQpOworbW1fanBlZ19qb2JfcV9ub2RlX3QqIG1tX2pwZWdfcXVldWVfcmVtb3ZlX2pvYl9ieV9zZXNzaW9uX2lkKAorICBtbV9qcGVnX3F1ZXVlX3QqIHF1ZXVlLCB1aW50MzJfdCBzZXNzaW9uX2lkKTsKK21tX2pwZWdfam9iX3Ffbm9kZV90KiBtbV9qcGVnX3F1ZXVlX3JlbW92ZV9qb2JfdW5saygKKyAgbW1fanBlZ19xdWV1ZV90KiBxdWV1ZSwgdWludDMyX3Qgam9iX2lkKTsKKworCisvKiogbW1fanBlZ19xdWV1ZV9mdW5jX3Q6CisgKgorICogSW50ZXJtZWRpYXRlIGZ1bmN0aW9uIGZvciBxdWV1ZSBvcGVyYXRpb24KKyAqKi8KK3R5cGVkZWYgdm9pZCAoKm1tX2pwZWdfcXVldWVfZnVuY190KSh2b2lkICopOworCisvKiogbW1fanBlZ19leGlmX2ZsYXNoX21vZGU6CisgKgorICogRXhpZiBmbGFzaCBtb2RlIHZhbHVlcworICoqLwordHlwZWRlZiBlbnVtIHsKKyAgTU1fSlBFR19FWElGX0ZMQVNIX01PREVfT04gICA9IDB4MSwKKyAgTU1fSlBFR19FWElGX0ZMQVNIX01PREVfT0ZGICA9IDB4MiwKKyAgTU1fSlBFR19FWElGX0ZMQVNIX01PREVfQVVUTyA9IDB4MywKKyAgTU1fSlBFR19FWElGX0ZMQVNIX01PREVfTUFYCit9IG1tX2pwZWdfZXhpZl9mbGFzaF9tb2RlOworCisjZW5kaWYgLyogTU1fSlBFR19IXyAqLworCisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9pbmMvbW1fanBlZ19kYmcuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9pbmMvbW1fanBlZ19kYmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjY5NTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL2luYy9tbV9qcGVnX2RiZy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX01NX0pQRUdfREJHX0hfXworI2RlZmluZSBfX01NX0pQRUdfREJHX0hfXworCisjaWZkZWYgUUNBTUVSQV9SRURFRklORV9MT0cKKyNkZWZpbmUgQ0FNX01PRFVMRSBDQU1fSlBFR19NT0RVTEUKKyNpbmNsdWRlICJtbV9jYW1lcmFfZGJnLmgiCisjZW5kaWYKKworZXh0ZXJuIHZvbGF0aWxlIHVpbnQzMl90IGdLcGlEZWJ1Z0xldmVsOworCisjaWZuZGVmIEtQSV9ERUJVRworI2RlZmluZSBLUElfREVCVUcKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorI2luY2x1ZGUgPGN1dGlscy90cmFjZS5oPgorCisjZGVmaW5lIEtQSV9BUFQgMQorI2RlZmluZSBLUElfREJHIDIKKworI2RlZmluZSBLUElfQVRSQUNFX0lOVChuYW1lLHZhbCkgKHtcCitpZiAoZ0twaURlYnVnTGV2ZWwgPj0gS1BJX0FQVCkgeyBcCisgICAgIGF0cmFjZV9pbnQoQVRSQUNFX1RBRywgbmFtZSwgdmFsKTsgXAorfVwKK30pCisKKyNlbmRpZgorI2VuZGlmIC8qIF9fTU1fSlBFR19EQkdfSF9fICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2UvaW5jL21tX2pwZWdfaW5saW5lcy5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL2luYy9tbV9qcGVnX2lubGluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmNhNjNkCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL2luYy9tbV9qcGVnX2lubGluZXMuaApAQCAtMCwwICsxLDEyNyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBNTV9KUEVHX0lOTElORVNfSF8KKyNkZWZpbmUgTU1fSlBFR19JTkxJTkVTX0hfCisKKy8vIEpQRUcgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAibW1fanBlZy5oIgorCisvKiogbW1fanBlZ19nZXRfc2Vzc2lvbjoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQG15X29iajoganBlZyBvYmplY3QKKyAqICAgIEBjbGllbnRfaWR4OiBjbGllbnQgaW5kZXgKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgam9iIGluZGV4CisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgR2V0IGpvYiBpbmRleCBieSBjbGllbnQgaWQKKyAqCisgKiovCitzdGF0aWMgaW5saW5lIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqbW1fanBlZ19nZXRfc2Vzc2lvbihtbV9qcGVnX29iaiAqbXlfb2JqLCB1aW50MzJfdCBqb2JfaWQpCit7CisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uID0gTlVMTDsKKyAgaW50IGNsaWVudF9pZHggPSAgR0VUX0NMSUVOVF9JRFgoam9iX2lkKTsKKyAgaW50IHNlc3Npb25faWR4PSBHRVRfU0VTU0lPTl9JRFgoam9iX2lkKTsKKworICBMT0dEKCJjbGllbnRfaWR4ICVkIHNlc3Npb25faWR4ICVkIiwKKyAgICBjbGllbnRfaWR4LCBzZXNzaW9uX2lkeCk7CisgIGlmICgoc2Vzc2lvbl9pZHggPj0gTU1fSlBFR19NQVhfU0VTU0lPTikgfHwKKyAgICAoY2xpZW50X2lkeCA+PSBNQVhfSlBFR19DTElFTlRfTlVNKSkgeworICAgIExPR0UoImludmFsaWQgam9iIGlkICV4IiwKKyAgICAgIGpvYl9pZCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmNsbnRfbWdyW2NsaWVudF9pZHhdLmxvY2spOworICBwX3Nlc3Npb24gPSAmbXlfb2JqLT5jbG50X21ncltjbGllbnRfaWR4XS5zZXNzaW9uW3Nlc3Npb25faWR4XTsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+Y2xudF9tZ3JbY2xpZW50X2lkeF0ubG9jayk7CisgIHJldHVybiBwX3Nlc3Npb247Cit9CisKKy8qKiBtbV9qcGVnX2dldF9qb2JfaWR4OgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAbXlfb2JqOiBqcGVnIG9iamVjdAorICogICAgQGNsaWVudF9pZHg6IGNsaWVudCBpbmRleAorICoKKyAqICBSZXR1cm46CisgKiAgICAgICBqb2IgaW5kZXgKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBHZXQgam9iIGluZGV4IGJ5IGNsaWVudCBpZAorICoKKyAqKi8KK3N0YXRpYyBpbmxpbmUgaW50IG1tX2pwZWdfZ2V0X25ld19zZXNzaW9uX2lkeChtbV9qcGVnX29iaiAqbXlfb2JqLCBpbnQgY2xpZW50X2lkeCwKKyAgbW1fanBlZ19qb2Jfc2Vzc2lvbl90ICoqcHBfc2Vzc2lvbikKK3sKKyAgaW50IGkgPSAwOworICBpbnQgaW5kZXggPSAtMTsKKyAgZm9yIChpID0gMDsgaSA8IE1NX0pQRUdfTUFYX1NFU1NJT047IGkrKykgeworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5jbG50X21ncltjbGllbnRfaWR4XS5sb2NrKTsKKyAgICBpZiAoIW15X29iai0+Y2xudF9tZ3JbY2xpZW50X2lkeF0uc2Vzc2lvbltpXS5hY3RpdmUpIHsKKyAgICAgICpwcF9zZXNzaW9uID0gJm15X29iai0+Y2xudF9tZ3JbY2xpZW50X2lkeF0uc2Vzc2lvbltpXTsKKyAgICAgIG15X29iai0+Y2xudF9tZ3JbY2xpZW50X2lkeF0uc2Vzc2lvbltpXS5hY3RpdmUgPSBPTVhfVFJVRTsKKyAgICAgIGluZGV4ID0gaTsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNsbnRfbWdyW2NsaWVudF9pZHhdLmxvY2spOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmNsbnRfbWdyW2NsaWVudF9pZHhdLmxvY2spOworICB9CisgIHJldHVybiBpbmRleDsKK30KKworLyoqIG1tX2pwZWdfZ2V0X2pvYl9pZHg6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBteV9vYmo6IGpwZWcgb2JqZWN0CisgKiAgICBAY2xpZW50X2lkeDogY2xpZW50IGluZGV4CisgKgorICogIFJldHVybjoKKyAqICAgICAgIGpvYiBpbmRleAorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIEdldCBqb2IgaW5kZXggYnkgY2xpZW50IGlkCisgKgorICoqLworc3RhdGljIGlubGluZSB2b2lkIG1tX2pwZWdfcmVtb3ZlX3Nlc3Npb25faWR4KG1tX2pwZWdfb2JqICpteV9vYmosIHVpbnQzMl90IGpvYl9pZCkKK3sKKyAgaW50IGNsaWVudF9pZHggPSAgR0VUX0NMSUVOVF9JRFgoam9iX2lkKTsKKyAgaW50IHNlc3Npb25faWR4PSBHRVRfU0VTU0lPTl9JRFgoam9iX2lkKTsKKyAgTE9HRCgiY2xpZW50X2lkeCAlZCBzZXNzaW9uX2lkeCAlZCIsCisgICAgY2xpZW50X2lkeCwgc2Vzc2lvbl9pZHgpOworICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+Y2xudF9tZ3JbY2xpZW50X2lkeF0ubG9jayk7CisgIG15X29iai0+Y2xudF9tZ3JbY2xpZW50X2lkeF0uc2Vzc2lvbltzZXNzaW9uX2lkeF0uYWN0aXZlID0gT01YX0ZBTFNFOworICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5jbG50X21ncltjbGllbnRfaWR4XS5sb2NrKTsKK30KKworCisKKyNlbmRpZiAvKiBNTV9KUEVHX0lOTElORVNfSF8gKi8KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9pbmMvbW1fanBlZ19pb25idWYuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9pbmMvbW1fanBlZ19pb25idWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmI3MGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL2luYy9tbV9qcGVnX2lvbmJ1Zi5oCkBAIC0wLDAgKzEsMTA1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCwgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19NTV9KUEVHX0lPTkJVRl9IX18KKyNkZWZpbmUgX19NTV9KUEVHX0lPTkJVRl9IX18KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KKworLy8gSlBFRyBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJtbV9qcGVnX2RiZy5oIgorCit0eXBlZGVmIHN0cnVjdCAgeworICBzdHJ1Y3QgaW9uX2ZkX2RhdGEgaW9uX2luZm9fZmQ7CisgIHN0cnVjdCBpb25fYWxsb2NhdGlvbl9kYXRhIGFsbG9jOworICBpbnQgcF9wbWVtX2ZkOworICBzaXplX3Qgc2l6ZTsKKyAgaW50IGlvbl9mZDsKKyAgdWludDhfdCAqYWRkcjsKK30gYnVmZmVyX3Q7CisKKy8qKiBidWZmZXJfYWxsb2NhdGU6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgICBAcF9idWZmZXI6IElPTiBidWZmZXIKKyAqCisgKiAgUmV0dXJuOgorICogICAgIGJ1ZmZlciBhZGRyZXNzCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICBhbGxvY2F0ZXMgSU9OIGJ1ZmZlcgorICoKKyAqKi8KK3ZvaWQqIGJ1ZmZlcl9hbGxvY2F0ZShidWZmZXJfdCAqcF9idWZmZXIsIGludCBjYWNoZWQpOworCisvKiogYnVmZmVyX2RlYWxsb2NhdGU6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgICBAcF9idWZmZXI6IElPTiBidWZmZXIKKyAqCisgKiAgUmV0dXJuOgorICogICAgIGVycm9yIHZhbAorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgZGVhbGxvY2F0ZXMgSU9OIGJ1ZmZlcgorICoKKyAqKi8KK2ludCBidWZmZXJfZGVhbGxvY2F0ZShidWZmZXJfdCAqcF9idWZmZXIpOworCisvKiogYnVmZmVyX2ludmFsaWRhdGU6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgICBAcF9idWZmZXI6IElPTiBidWZmZXIKKyAqCisgKiAgUmV0dXJuOgorICogICAgIGVycm9yIHZhbAorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgSW52YWxpZGF0ZXMgdGhlIGNhY2hlZCBidWZmZXIKKyAqCisgKiovCitpbnQgYnVmZmVyX2ludmFsaWRhdGUoYnVmZmVyX3QgKnBfYnVmZmVyKTsKKworLyoqIGJ1ZmZlcl9jbGVhbjoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgIEBwX2J1ZmZlcjogSU9OIGJ1ZmZlcgorICoKKyAqICBSZXR1cm46CisgKiAgICAgZXJyb3IgdmFsCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICBjbGVhbiB0aGUgY2FjaGVkIGJ1ZmZlcgorICoKKyAqKi8KK2ludCBidWZmZXJfY2xlYW4oYnVmZmVyX3QgKnBfYnVmZmVyKTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9pbmMvbW1fanBlZ19tcG8uaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9pbmMvbW1fanBlZ19tcG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTg0MjRjCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL2luYy9tbV9qcGVnX21wby5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBNTV9KUEVHX01QT19IXworI2RlZmluZSBNTV9KUEVHX01QT19IXworCisvLyBKUEVHIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX2pwZWdfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAicW1wby5oIgorCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisKK2V4dGVybiBpbnQgbW1fanBlZ19tcG9fY29tcG9zZShtbV9qcGVnX21wb19pbmZvX3QgKm1wb19pbmZvKTsKKworZXh0ZXJuIGludCBnZXRfbXBvX3NpemUobW1fanBlZ19vdXRwdXRfdCBqcGVnX2J1ZmZlcltNTV9KUEVHX01BWF9NUE9fSU1BR0VTXSwKKyAgICBpbnQgbnVtX29mX2ltYWdlcyk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3NyYy9tbV9qcGVnLmMgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2Uvc3JjL21tX2pwZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjk3ZDViCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3NyYy9tbV9qcGVnLmMKQEAgLTAsMCArMSwzNzQzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNkZWZpbmUgUFJDVExfSCA8U1lTVEVNX0hFQURFUl9QUkVGSVgvcHJjdGwuaD4KKyNpbmNsdWRlIFBSQ1RMX0gKKworI2lmZGVmIExPQURfQURTUF9SUENfTElCCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisvLyBKUEVHIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX2pwZWdfZGJnLmgiCisjaW5jbHVkZSAibW1fanBlZ19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJtbV9qcGVnLmgiCisjaW5jbHVkZSAibW1fanBlZ19pbmxpbmVzLmgiCisjaWZkZWYgTElCMkRfUk9UQVRJT05fRU5BQkxFCisjaW5jbHVkZSAibW1fbGliMmQuaCIKKyNlbmRpZgorCisjZGVmaW5lIEVOQ09ESU5HX01PREVfUEFSQUxMRUwgMQorCisjZGVmaW5lIE1FVEFfS0VZRklMRSBRQ0FNRVJBX0RVTVBfRlJNX0xPQ0FUSU9OIm1ldGFkYXRhLmtleSIKKworLyoqCisgKiBtaW5pbWFsIHJlc29sdXRpb24gbmVlZGVkIGZvciBub3JtYWwgbW9kZSBvZiBvcHMKKyAqLworI2RlZmluZSBNTV9KUEVHX01JTl9OT01fUkVTT0xVVElPTiA3NjgwMDAwIC8qOE1QKi8KKworI2lmZGVmIE1NX0pQRUdfVVNFX1BJUEVMSU5FCisjdW5kZWYgTU1fSlBFR19DT05DVVJSRU5UX1NFU1NJT05TX0NPVU5UCisjZGVmaW5lIE1NX0pQRUdfQ09OQ1VSUkVOVF9TRVNTSU9OU19DT1VOVCAxCisjZW5kaWYKKworT01YX0VSUk9SVFlQRSBtbV9qcGVnX2ViZChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9QVFIgcEFwcERhdGEsCisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpOworT01YX0VSUk9SVFlQRSBtbV9qcGVnX2ZiZChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9QVFIgcEFwcERhdGEsCisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpOworT01YX0VSUk9SVFlQRSBtbV9qcGVnX2V2ZW50X2hhbmRsZXIoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfUFRSIHBBcHBEYXRhLAorICAgIE9NWF9FVkVOVFRZUEUgZUV2ZW50LAorICAgIE9NWF9VMzIgbkRhdGExLAorICAgIE9NWF9VMzIgbkRhdGEyLAorICAgIE9NWF9QVFIgcEV2ZW50RGF0YSk7CisKK3N0YXRpYyBpbnQzMl90IG1tX2pwZWdlbmNfZGVzdHJveV9qb2IobW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24pOworc3RhdGljIHZvaWQgbW1fanBlZ2VuY19qb2JfZG9uZShtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKnBfc2Vzc2lvbik7CittbV9qcGVnX2pvYl9xX25vZGVfdCogbW1fanBlZ19xdWV1ZV9yZW1vdmVfam9iX2J5X2RzdF9wdHIoCisgIG1tX2pwZWdfcXVldWVfdCogcXVldWUsIHZvaWQgKiBkc3RfcHRyKTsKK3N0YXRpYyBPTVhfRVJST1JUWVBFIG1tX2pwZWdfc2Vzc2lvbl9jb25maWd1cmUobW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24pOworCisvKiogbW1fanBlZ19nZXRfY29tcF9uYW1lOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgICBOb25lCisgKgorICogIFJldHVybjoKKyAqICAgICAgIEVuY29kZXIgY29tcG9uZW50IG5hbWUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBHZXQgdGhlIG5hbWUgb2Ygb214IGNvbXBvbmVudCB0byBiZSB1c2VkIGZvciBqcGVnIGVuY29kaW5nCisgKgorICoqLworaW5saW5lIGNoYXIqIG1tX2pwZWdfZ2V0X2NvbXBfbmFtZSgpCit7CisjaWZkZWYgTU1fSlBFR19VU0VfUElQRUxJTkUKKyAgcmV0dXJuICJPTVgucWNvbS5pbWFnZS5qcGVnLmVuY29kZXJfcGlwZWxpbmUiOworI2Vsc2UKKyAgcmV0dXJuICJPTVgucWNvbS5pbWFnZS5qcGVnLmVuY29kZXIiOworI2VuZGlmCit9CisKKy8qKiBtbV9qcGVnX3Nlc3Npb25fc2VuZF9idWZmZXJzOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAZGF0YTogam9iIHNlc3Npb24KKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgT01YIGVycm9yIHZhbHVlcworICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIFNlbmQgdGhlIGJ1ZmZlcnMgdG8gT01YIGxheWVyCisgKgorICoqLworT01YX0VSUk9SVFlQRSBtbV9qcGVnX3Nlc3Npb25fc2VuZF9idWZmZXJzKHZvaWQgKmRhdGEpCit7CisgIHVpbnQzMl90IGkgPSAwOworICBtbV9qcGVnX2pvYl9zZXNzaW9uX3QqIHBfc2Vzc2lvbiA9IChtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKilkYXRhOworICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgIFFPTVhfQlVGRkVSX0lORk8gbGJ1ZmZlcl9pbmZvOworICBtbV9qcGVnX2VuY29kZV9wYXJhbXNfdCAqcF9wYXJhbXMgPSAmcF9zZXNzaW9uLT5wYXJhbXM7CisKKyAgbWVtc2V0KCZsYnVmZmVyX2luZm8sIDB4MCwgc2l6ZW9mKFFPTVhfQlVGRkVSX0lORk8pKTsKKworICBpZiAocF9zZXNzaW9uLT5saWIyZF9yb3RhdGlvbl9mbGFnKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHBfc2Vzc2lvbi0+bnVtX3NyY19yb3RfYnVmczsgaSsrKSB7CisgICAgICBsYnVmZmVyX2luZm8uZmQgPSAoT01YX1UzMilwX3Nlc3Npb24tPnNyY19yb3RfbWFpbl9idWZbaV0uZmQ7CisgICAgICBMT0dEKCJTb3VyY2Ugcm90IGJ1ZmZlciAlZCIsIGkpOworICAgICAgcmV0ID0gT01YX1VzZUJ1ZmZlcihwX3Nlc3Npb24tPm9teF9oYW5kbGUsCisgICAgICAgICYocF9zZXNzaW9uLT5wX2luX3JvdF9vbXhfYnVmW2ldKSwgMCwKKyAgICAgICAgJmxidWZmZXJfaW5mbywgcF9zZXNzaW9uLT5zcmNfcm90X21haW5fYnVmW2ldLmJ1Zl9zaXplLAorICAgICAgICBwX3Nlc3Npb24tPnNyY19yb3RfbWFpbl9idWZbaV0uYnVmX3ZhZGRyKTsKKyAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgJWQiLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcF9wYXJhbXMtPm51bV9zcmNfYnVmczsgaSsrKSB7CisgICAgICBMT0dEKCJTb3VyY2UgYnVmZmVyICVkIiwgaSk7CisgICAgICBsYnVmZmVyX2luZm8uZmQgPSAoT01YX1UzMilwX3BhcmFtcy0+c3JjX21haW5fYnVmW2ldLmZkOworICAgICAgcmV0ID0gT01YX1VzZUJ1ZmZlcihwX3Nlc3Npb24tPm9teF9oYW5kbGUsCisgICAgICAgICYocF9zZXNzaW9uLT5wX2luX29teF9idWZbaV0pLCAwLAorICAgICAgICAmbGJ1ZmZlcl9pbmZvLCBwX3BhcmFtcy0+c3JjX21haW5fYnVmW2ldLmJ1Zl9zaXplLAorICAgICAgICBwX3BhcmFtcy0+c3JjX21haW5fYnVmW2ldLmJ1Zl92YWRkcik7CisgICAgICBpZiAocmV0KSB7CisgICAgICAgIExPR0UoIkVycm9yICVkIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAocF9zZXNzaW9uLT5saWIyZF9yb3RhdGlvbl9mbGFnICYmIHBfc2Vzc2lvbi0+dGh1bWJfZnJvbV9tYWluKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHBfc2Vzc2lvbi0+bnVtX3NyY19yb3RfYnVmczsgaSsrKSB7CisgICAgICBMT0dEKCJTb3VyY2Ugcm90IGJ1ZmZlciB0aHVtYiAlZCIsIGkpOworICAgICAgbGJ1ZmZlcl9pbmZvLmZkID0gKE9NWF9VMzIpcF9zZXNzaW9uLT5zcmNfcm90X21haW5fYnVmW2ldLmZkOworICAgICAgcmV0ID0gT01YX1VzZUJ1ZmZlcihwX3Nlc3Npb24tPm9teF9oYW5kbGUsCisgICAgICAgICYocF9zZXNzaW9uLT5wX2luX3JvdF9vbXhfdGh1bWJfYnVmW2ldKSwgMiwKKyAgICAgICAgJmxidWZmZXJfaW5mbywgcF9zZXNzaW9uLT5zcmNfcm90X21haW5fYnVmW2ldLmJ1Zl9zaXplLAorICAgICAgICBwX3Nlc3Npb24tPnNyY19yb3RfbWFpbl9idWZbaV0uYnVmX3ZhZGRyKTsKKyAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgTE9HRSgiRXJyb3IgJWQiLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcF9wYXJhbXMtPm51bV90bWJfYnVmczsgaSsrKSB7CisgICAgICBMT0dEKCJTb3VyY2UgYnVmZmVyICVkIiwgaSk7CisgICAgICBsYnVmZmVyX2luZm8uZmQgPSAoT01YX1UzMilwX3BhcmFtcy0+c3JjX3RodW1iX2J1ZltpXS5mZDsKKyAgICAgIHJldCA9IE9NWF9Vc2VCdWZmZXIocF9zZXNzaW9uLT5vbXhfaGFuZGxlLAorICAgICAgICAmKHBfc2Vzc2lvbi0+cF9pbl9vbXhfdGh1bWJfYnVmW2ldKSwgMiwKKyAgICAgICAgJmxidWZmZXJfaW5mbywgcF9wYXJhbXMtPnNyY190aHVtYl9idWZbaV0uYnVmX3NpemUsCisgICAgICBwX3BhcmFtcy0+c3JjX3RodW1iX2J1ZltpXS5idWZfdmFkZHIpOworICAgICAgaWYgKHJldCkgeworICAgICAgICBMT0dFKCJFcnJvciAlZCIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IHBfcGFyYW1zLT5udW1fZHN0X2J1ZnM7IGkrKykgeworICAgIExPR0QoIkRlc3QgYnVmZmVyICVkIiwgaSk7CisgICAgcmV0ID0gT01YX1VzZUJ1ZmZlcihwX3Nlc3Npb24tPm9teF9oYW5kbGUsICYocF9zZXNzaW9uLT5wX291dF9vbXhfYnVmW2ldKSwKKyAgICAgIDEsIE5VTEwsIHBfcGFyYW1zLT5kZXN0X2J1ZltpXS5idWZfc2l6ZSwKKyAgICAgIHBfcGFyYW1zLT5kZXN0X2J1ZltpXS5idWZfdmFkZHIpOworICAgIGlmIChyZXQpIHsKKyAgICAgIExPR0UoIkVycm9yIik7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgfQorCisgIHJldHVybiByZXQ7Cit9CisKKworLyoqIG1tX2pwZWdfc2Vzc2lvbl9mcmVlX2J1ZmZlcnM6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBkYXRhOiBqb2Igc2Vzc2lvbgorICoKKyAqICBSZXR1cm46CisgKiAgICAgICBPTVggZXJyb3IgdmFsdWVzCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgRnJlZSB0aGUgYnVmZmVycyBmcm9tIE9NWCBsYXllcgorICoKKyAqKi8KK09NWF9FUlJPUlRZUEUgbW1fanBlZ19zZXNzaW9uX2ZyZWVfYnVmZmVycyh2b2lkICpkYXRhKQoreworICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgIHVpbnQzMl90IGkgPSAwOworICBtbV9qcGVnX2pvYl9zZXNzaW9uX3QqIHBfc2Vzc2lvbiA9IChtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKilkYXRhOworICBtbV9qcGVnX2VuY29kZV9wYXJhbXNfdCAqcF9wYXJhbXMgPSAmcF9zZXNzaW9uLT5wYXJhbXM7CisKKworICBpZiAocF9zZXNzaW9uLT5saWIyZF9yb3RhdGlvbl9mbGFnKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHBfc2Vzc2lvbi0+bnVtX3NyY19yb3RfYnVmczsgaSsrKSB7CisgICAgICBMT0dEKCJTb3VyY2Ugcm90IGJ1ZmZlciAlZCIsIGkpOworICAgICAgcmV0ID0gT01YX0ZyZWVCdWZmZXIocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCAwLAorICAgICAgICBwX3Nlc3Npb24tPnBfaW5fcm90X29teF9idWZbaV0pOworICAgICAgaWYgKHJldCkgeworICAgICAgICBMT0dFKCJFcnJvciAlZCIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBwX3BhcmFtcy0+bnVtX3NyY19idWZzOyBpKyspIHsKKyAgICAgIExPR0QoIlNvdXJjZSBidWZmZXIgJWQiLCBpKTsKKyAgICAgIHJldCA9IE9NWF9GcmVlQnVmZmVyKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgMCwKKyAgICAgICAgcF9zZXNzaW9uLT5wX2luX29teF9idWZbaV0pOworICAgICAgaWYgKHJldCkgeworICAgICAgICBMT0dFKCJFcnJvciAlZCIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHBfc2Vzc2lvbi0+bGliMmRfcm90YXRpb25fZmxhZyAmJiBwX3Nlc3Npb24tPnRodW1iX2Zyb21fbWFpbikgeworICAgIGZvciAoaSA9IDA7IGkgPCBwX3Nlc3Npb24tPm51bV9zcmNfcm90X2J1ZnM7IGkrKykgeworICAgIExPR0QoIlNvdXJjZSByb3QgYnVmZmVyIHRodW1iICVkIiwgaSk7CisgICAgICByZXQgPSBPTVhfRnJlZUJ1ZmZlcihwX3Nlc3Npb24tPm9teF9oYW5kbGUsIDIsCisgICAgICAgIHBfc2Vzc2lvbi0+cF9pbl9yb3Rfb214X3RodW1iX2J1ZltpXSk7CisgICAgICBpZiAocmV0KSB7CisgICAgICAgIExPR0UoIkVycm9yICVkIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IHBfcGFyYW1zLT5udW1fdG1iX2J1ZnM7IGkrKykgeworICAgICAgTE9HRCgiU291cmNlIGJ1ZmZlciAlZCIsIGkpOworICAgICAgcmV0ID0gT01YX0ZyZWVCdWZmZXIocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCAyLAorICAgICAgICBwX3Nlc3Npb24tPnBfaW5fb214X3RodW1iX2J1ZltpXSk7CisgICAgICBpZiAocmV0KSB7CisgICAgICAgIExPR0UoIkVycm9yICVkIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgcF9wYXJhbXMtPm51bV9kc3RfYnVmczsgaSsrKSB7CisgICAgTE9HRCgiRGVzdCBidWZmZXIgJWQiLCBpKTsKKyAgICByZXQgPSBPTVhfRnJlZUJ1ZmZlcihwX3Nlc3Npb24tPm9teF9oYW5kbGUsIDEsIHBfc2Vzc2lvbi0+cF9vdXRfb214X2J1ZltpXSk7CisgICAgaWYgKHJldCkgeworICAgICAgTE9HRSgiRXJyb3IiKTsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICB9CisgIHJldHVybiByZXQ7Cit9CisKKworCisKKy8qKiBtbV9qcGVnX3Nlc3Npb25fY2hhbmdlX3N0YXRlOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAcF9zZXNzaW9uOiBqb2Igc2Vzc2lvbgorICogICAgQG5ld19zdGF0ZTogbmV3IHN0YXRlIHRvIGJlIHRyYW5zaXRpb25lZCB0bworICogICAgQHBfZXhlYzogdHJhbnNpdGlvbiBmdW5jdGlvbgorICoKKyAqICBSZXR1cm46CisgKiAgICAgICBPTVggZXJyb3IgdmFsdWVzCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgVGhpcyBtZXRob2QgaXMgdXNlZCBmb3Igc3RhdGUgdHJhbnNpdGlvbgorICoKKyAqKi8KK09NWF9FUlJPUlRZUEUgbW1fanBlZ19zZXNzaW9uX2NoYW5nZV9zdGF0ZShtbV9qcGVnX2pvYl9zZXNzaW9uX3QqIHBfc2Vzc2lvbiwKKyAgT01YX1NUQVRFVFlQRSBuZXdfc3RhdGUsCisgIG1tX2pwZWdfdHJhbnNpdGlvbl9mdW5jX3QgcF9leGVjKQoreworICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgIE9NWF9TVEFURVRZUEUgY3VycmVudF9zdGF0ZTsKKyAgTE9HRCgibmV3X3N0YXRlICVkIHBfZXhlYyAlcCIsCisgICAgbmV3X3N0YXRlLCBwX2V4ZWMpOworCisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZwX3Nlc3Npb24tPmxvY2spOworCisgIHJldCA9IE9NWF9HZXRTdGF0ZShwX3Nlc3Npb24tPm9teF9oYW5kbGUsICZjdXJyZW50X3N0YXRlKTsKKworICBpZiAocmV0KSB7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGlmIChjdXJyZW50X3N0YXRlID09IG5ld19zdGF0ZSkgeworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwX3Nlc3Npb24tPmxvY2spOworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICB9CisKKyAgcF9zZXNzaW9uLT5zdGF0ZV9jaGFuZ2VfcGVuZGluZyA9IE9NWF9UUlVFOworICBwdGhyZWFkX211dGV4X3VubG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKyAgcmV0ID0gT01YX1NlbmRDb21tYW5kKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgT01YX0NvbW1hbmRTdGF0ZVNldCwKKyAgICBuZXdfc3RhdGUsIE5VTEwpOworICBwdGhyZWFkX211dGV4X2xvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgIGlmIChyZXQpIHsKKyAgICBMT0dFKCJFcnJvciAlZCIsIHJldCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgICAgcmV0dXJuIE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbjsKKyAgfQorICBpZiAoKE9NWF9FcnJvck5vbmUgIT0gcF9zZXNzaW9uLT5lcnJvcl9mbGFnKSAmJgorICAgICAgKE9NWF9FcnJvck92ZXJmbG93ICE9IHBfc2Vzc2lvbi0+ZXJyb3JfZmxhZykpIHsKKyAgICBMT0dFKCJFcnJvciAlZCIsIHBfc2Vzc2lvbi0+ZXJyb3JfZmxhZyk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgICAgcmV0dXJuIHBfc2Vzc2lvbi0+ZXJyb3JfZmxhZzsKKyAgfQorICBpZiAocF9leGVjKSB7CisgICAgcmV0ID0gcF9leGVjKHBfc2Vzc2lvbik7CisgICAgaWYgKHJldCkgeworICAgICAgTE9HRSgiRXJyb3IgJWQiLCByZXQpOworICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgfQorICBpZiAocF9zZXNzaW9uLT5zdGF0ZV9jaGFuZ2VfcGVuZGluZykgeworICAgIExPR0woImJlZm9yZSB3YWl0Iik7CisgICAgcHRocmVhZF9jb25kX3dhaXQoJnBfc2Vzc2lvbi0+Y29uZCwgJnBfc2Vzc2lvbi0+bG9jayk7CisgICAgTE9HTCgiYWZ0ZXIgd2FpdCIpOworICB9CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwX3Nlc3Npb24tPmxvY2spOworICByZXR1cm4gcmV0OworfQorCisvKiogbW1fanBlZ19zZXNzaW9uX2NyZWF0ZToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHBfc2Vzc2lvbjogam9iIHNlc3Npb24KKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgT01YIGVycm9yIHR5cGVzCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgQ3JlYXRlIGEganBlZyBlbmNvZGUgc2Vzc2lvbgorICoKKyAqKi8KK09NWF9FUlJPUlRZUEUgbW1fanBlZ19zZXNzaW9uX2NyZWF0ZShtbV9qcGVnX2pvYl9zZXNzaW9uX3QqIHBfc2Vzc2lvbikKK3sKKyAgT01YX0VSUk9SVFlQRSByYyA9IE9NWF9FcnJvck5vbmU7CisgIG1tX2pwZWdfb2JqICpteV9vYmogPSAobW1fanBlZ19vYmogKikgcF9zZXNzaW9uLT5qcGVnX29iajsKKworICBwdGhyZWFkX211dGV4X2luaXQoJnBfc2Vzc2lvbi0+bG9jaywgTlVMTCk7CisgIHB0aHJlYWRfY29uZF9pbml0KCZwX3Nlc3Npb24tPmNvbmQsIE5VTEwpOworICBjaXJxX3Jlc2V0KCZwX3Nlc3Npb24tPmNiX3EpOworICBwX3Nlc3Npb24tPnN0YXRlX2NoYW5nZV9wZW5kaW5nID0gT01YX0ZBTFNFOworICBwX3Nlc3Npb24tPmFib3J0X3N0YXRlID0gTU1fSlBFR19BQk9SVF9OT05FOworICBwX3Nlc3Npb24tPmVycm9yX2ZsYWcgPSBPTVhfRXJyb3JOb25lOworICBwX3Nlc3Npb24tPmViZF9jb3VudCA9IDA7CisgIHBfc2Vzc2lvbi0+ZmJkX2NvdW50ID0gMDsKKyAgcF9zZXNzaW9uLT5lbmNvZGVfcGlkID0gLTE7CisgIHBfc2Vzc2lvbi0+Y29uZmlnID0gT01YX0ZBTFNFOworICBwX3Nlc3Npb24tPmV4aWZfY291bnRfbG9jYWwgPSAwOworICBwX3Nlc3Npb24tPmF1dG9fb3V0X2J1ZiA9IE9NWF9GQUxTRTsKKworICBwX3Nlc3Npb24tPm9teF9jYWxsYmFja3MuRW1wdHlCdWZmZXJEb25lID0gbW1fanBlZ19lYmQ7CisgIHBfc2Vzc2lvbi0+b214X2NhbGxiYWNrcy5GaWxsQnVmZmVyRG9uZSA9IG1tX2pwZWdfZmJkOworICBwX3Nlc3Npb24tPm9teF9jYWxsYmFja3MuRXZlbnRIYW5kbGVyID0gbW1fanBlZ19ldmVudF9oYW5kbGVyOworCisgIHBfc2Vzc2lvbi0+dGh1bWJfZnJvbV9tYWluID0gMDsKKyNpZmRlZiBNTV9KUEVHX1VTRV9QSVBFTElORQorICBwX3Nlc3Npb24tPnRodW1iX2Zyb21fbWFpbiA9ICFwX3Nlc3Npb24tPnBhcmFtcy50aHVtYl9mcm9tX3Bvc3R2aWV3OworI2VuZGlmCisKKyAgcmMgPSBPTVhfR2V0SGFuZGxlKCZwX3Nlc3Npb24tPm9teF9oYW5kbGUsCisgICAgICBtbV9qcGVnX2dldF9jb21wX25hbWUoKSwKKyAgICAgICh2b2lkICopcF9zZXNzaW9uLAorICAgICAgJnBfc2Vzc2lvbi0+b214X2NhbGxiYWNrcyk7CisgIGlmIChPTVhfRXJyb3JOb25lICE9IHJjKSB7CisgICAgTE9HRSgiT01YX0dldEhhbmRsZSBmYWlsZWQgKCVkKSIsIHJjKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworICBteV9vYmotPm51bV9zZXNzaW9ucysrOworCisgIHJldHVybiByYzsKK30KKworCisKKy8qKiBtbV9qcGVnX3Nlc3Npb25fZGVzdHJveToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHBfc2Vzc2lvbjogam9iIHNlc3Npb24KKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgbm9uZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIERlc3Ryb3kgYSBqcGVnIGVuY29kZSBzZXNzaW9uCisgKgorICoqLwordm9pZCBtbV9qcGVnX3Nlc3Npb25fZGVzdHJveShtbV9qcGVnX2pvYl9zZXNzaW9uX3QqIHBfc2Vzc2lvbikKK3sKKyAgT01YX0VSUk9SVFlQRSByYyA9IE9NWF9FcnJvck5vbmU7CisgIE9NWF9TVEFURVRZUEUgc3RhdGU7CisgIHVpbnQzMl90IGk7CisgIG1tX2pwZWdfb2JqICpteV9vYmogPSAobW1fanBlZ19vYmogKikgcF9zZXNzaW9uLT5qcGVnX29iajsKKworICBMT0dEKCJFIik7CisgIGlmIChOVUxMID09IHBfc2Vzc2lvbi0+b214X2hhbmRsZSkgeworICAgIExPR0UoImludmFsaWQgaGFuZGxlIik7CisgICAgcmV0dXJuOworICB9CisKKyAgcmMgPSBPTVhfR2V0U3RhdGUocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCAmc3RhdGUpOworCisgIC8vQ2hlY2sgc3RhdGUgYmVmb3JlIHN0YXRlIHRyYW5zaXRpb24KKyAgaWYgKChzdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpIHx8IChzdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkpIHsKKyAgICByYyA9IG1tX2pwZWdfc2Vzc2lvbl9jaGFuZ2Vfc3RhdGUocF9zZXNzaW9uLCBPTVhfU3RhdGVJZGxlLCBOVUxMKTsKKyAgICBpZiAocmMpIHsKKyAgICAgIExPR0UoIkVycm9yIik7CisgICAgfQorICB9CisKKyAgcmMgPSBPTVhfR2V0U3RhdGUocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCAmc3RhdGUpOworCisgIGlmIChzdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSB7CisgICAgcmMgPSBtbV9qcGVnX3Nlc3Npb25fY2hhbmdlX3N0YXRlKHBfc2Vzc2lvbiwgT01YX1N0YXRlTG9hZGVkLAorICAgICAgbW1fanBlZ19zZXNzaW9uX2ZyZWVfYnVmZmVycyk7CisgICAgaWYgKHJjKSB7CisgICAgICBMT0dFKCJFcnJvciIpOworICAgIH0KKyAgfQorCisgIGlmIChwX3Nlc3Npb24tPmxpYjJkX3JvdGF0aW9uX2ZsYWcpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcF9zZXNzaW9uLT5udW1fc3JjX3JvdF9idWZzOyBpKyspIHsKKyAgICAgIGlmIChwX3Nlc3Npb24tPnNyY19yb3RfaW9uX2J1ZmZlcltpXS5hZGRyKSB7CisgICAgICAgIGJ1ZmZlcl9kZWFsbG9jYXRlKCZwX3Nlc3Npb24tPnNyY19yb3RfaW9uX2J1ZmZlcltpXSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogSWYgY3VycmVudCBzZXNzaW9uIGlzIHRoZSBzZXNzaW9uIGluIHByb2dyZXNzCisgICAgIHNldCBzZXNzaW9uIGluIHByb2dyZXNzIHBvaW50ZXIgdG8gbnVsbCovCisgIHBfc2Vzc2lvbi0+Y29uZmlnID0gT01YX0ZBTFNFOworICBpZiAobXlfb2JqLT5wX3Nlc3Npb25faW5wcm9ncmVzcyA9PSBwX3Nlc3Npb24pIHsKKyAgICBteV9vYmotPnBfc2Vzc2lvbl9pbnByb2dyZXNzID0gTlVMTDsKKyAgfQorCisgIHJjID0gT01YX0ZyZWVIYW5kbGUocF9zZXNzaW9uLT5vbXhfaGFuZGxlKTsKKyAgaWYgKDAgIT0gcmMpIHsKKyAgICBMT0dFKCJPTVhfRnJlZUhhbmRsZSBmYWlsZWQgKCVkKSIsIHJjKTsKKyAgfQorICBwX3Nlc3Npb24tPm9teF9oYW5kbGUgPSBOVUxMOworCisgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcF9zZXNzaW9uLT5sb2NrKTsKKyAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJnBfc2Vzc2lvbi0+Y29uZCk7CisKKyAgaWYgKE5VTEwgIT0gcF9zZXNzaW9uLT5tZXRhX2VuY19rZXkpIHsKKyAgICBmcmVlKHBfc2Vzc2lvbi0+bWV0YV9lbmNfa2V5KTsKKyAgICBwX3Nlc3Npb24tPm1ldGFfZW5jX2tleSA9IE5VTEw7CisgIH0KKworICBteV9vYmotPm51bV9zZXNzaW9ucy0tOworCisgIC8vIERlc3Ryb3kgbmV4dCBzZXNzaW9uCisgIGlmIChwX3Nlc3Npb24tPm5leHRfc2Vzc2lvbikgeworICAgIG1tX2pwZWdfc2Vzc2lvbl9kZXN0cm95KHBfc2Vzc2lvbi0+bmV4dF9zZXNzaW9uKTsKKyAgfQorCisgIExPR0QoIlNlc3Npb24gZGVzdHJveSBzdWNjZXNzZnVsLiBYIik7Cit9CisKKworCisvKiogbW1fanBlZ19zZXNzaW9uX2NvbmZpZ19tYWluX2J1ZmZlcl9vZmZzZXQ6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBwX3Nlc3Npb246IGpvYiBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIE9NWCBlcnJvciB2YWx1ZXMKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDb25maWd1cmUgdGhlIGJ1ZmZlciBvZmZzZXRzCisgKgorICoqLworT01YX0VSUk9SVFlQRSBtbV9qcGVnX3Nlc3Npb25fY29uZmlnX21haW5fYnVmZmVyX29mZnNldCgKKyAgbW1fanBlZ19qb2Jfc2Vzc2lvbl90KiBwX3Nlc3Npb24pCit7CisgIE9NWF9FUlJPUlRZUEUgcmMgPSAwOworICBPTVhfSU5ERVhUWVBFIGJ1ZmZlcl9pbmRleDsKKyAgUU9NWF9ZVVZfRlJBTUVfSU5GTyBmcmFtZV9pbmZvOworICBzaXplX3QgdG90YWxTaXplID0gMDsKKyAgbW1fanBlZ19lbmNvZGVfcGFyYW1zX3QgKnBfcGFyYW1zID0gJnBfc2Vzc2lvbi0+cGFyYW1zOworCisgIG1tX2pwZWdfYnVmX3QgKnBfc3JjX2J1ZiA9CisgICAgJnBfcGFyYW1zLT5zcmNfbWFpbl9idWZbMF07CisKKyAgbWVtc2V0KCZmcmFtZV9pbmZvLCAweDAsIHNpemVvZihRT01YX1lVVl9GUkFNRV9JTkZPKSk7CisKKyAgZnJhbWVfaW5mby5jYmNyU3RhcnRPZmZzZXRbMF0gPSBwX3NyY19idWYtPm9mZnNldC5tcFswXS5sZW47CisgIGZyYW1lX2luZm8uY2JjclN0YXJ0T2Zmc2V0WzFdID0gcF9zcmNfYnVmLT5vZmZzZXQubXBbMV0ubGVuOworICBpZiAoIXBfc2Vzc2lvbi0+bGliMmRfcm90YXRpb25fZmxhZykgeworICAgIGZyYW1lX2luZm8ueU9mZnNldCA9IHBfc3JjX2J1Zi0+b2Zmc2V0Lm1wWzBdLm9mZnNldDsKKyAgICBmcmFtZV9pbmZvLmNiY3JPZmZzZXRbMF0gPSBwX3NyY19idWYtPm9mZnNldC5tcFsxXS5vZmZzZXQ7CisgICAgZnJhbWVfaW5mby5jYmNyT2Zmc2V0WzFdID0gcF9zcmNfYnVmLT5vZmZzZXQubXBbMl0ub2Zmc2V0OworICB9CisgIHRvdGFsU2l6ZSA9IHBfc3JjX2J1Zi0+YnVmX3NpemU7CisKKyAgcmMgPSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgocF9zZXNzaW9uLT5vbXhfaGFuZGxlLAorICAgIFFPTVhfSU1BR0VfRVhUX0JVRkZFUl9PRkZTRVRfTkFNRSwgJmJ1ZmZlcl9pbmRleCk7CisgIGlmIChyYyAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgTE9HRSgiRmFpbGVkIik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgTE9HRCgieU9mZnNldCA9ICVkLCBjYmNyT2Zmc2V0ID0gKCVkICVkKSwgdG90YWxTaXplID0gJXpkLCIKKyAgICAiY2JjclN0YXJ0T2Zmc2V0ID0gKCVkICVkKSIsCisgICAgKGludClmcmFtZV9pbmZvLnlPZmZzZXQsCisgICAgKGludClmcmFtZV9pbmZvLmNiY3JPZmZzZXRbMF0sCisgICAgKGludClmcmFtZV9pbmZvLmNiY3JPZmZzZXRbMV0sCisgICAgdG90YWxTaXplLAorICAgIChpbnQpZnJhbWVfaW5mby5jYmNyU3RhcnRPZmZzZXRbMF0sCisgICAgKGludClmcmFtZV9pbmZvLmNiY3JTdGFydE9mZnNldFsxXSk7CisKKyAgcmMgPSBPTVhfU2V0UGFyYW1ldGVyKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgYnVmZmVyX2luZGV4LCAmZnJhbWVfaW5mbyk7CisgIGlmIChyYyAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgTE9HRSgiRmFpbGVkIik7CisgICAgcmV0dXJuIHJjOworICB9CisgIHJldHVybiByYzsKK30KKworLyoqIG1tX2pwZWdfZW5jb2RpbmdfbW9kZToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHBfc2Vzc2lvbjogam9iIHNlc3Npb24KKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgT01YIGVycm9yIHZhbHVlcworICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIENvbmZpZ3VyZSB0aGUgc2VyaWFsIG9yIHBhcmFsbGVsIGVuY29kaW5nCisgKiAgICAgICBtb2RlCisgKgorICoqLworT01YX0VSUk9SVFlQRSBtbV9qcGVnX2VuY29kaW5nX21vZGUoCisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCogcF9zZXNzaW9uKQoreworICBPTVhfRVJST1JUWVBFIHJjID0gMDsKKyAgT01YX0lOREVYVFlQRSBpbmRleHR5cGU7CisgIFFPTVhfRU5DT0RJTkdfTU9ERSBlbmNvZGluZ19tb2RlOworCisgIHJjID0gT01YX0dldEV4dGVuc2lvbkluZGV4KHBfc2Vzc2lvbi0+b214X2hhbmRsZSwKKyAgICBRT01YX0lNQUdFX0VYVF9FTkNPRElOR19NT0RFX05BTUUsICZpbmRleHR5cGUpOworICBpZiAocmMgIT0gT01YX0Vycm9yTm9uZSkgeworICAgIExPR0UoIkZhaWxlZCIpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIGlmIChFTkNPRElOR19NT0RFX1BBUkFMTEVMKSB7CisgICAgZW5jb2RpbmdfbW9kZSA9IE9NWF9QYXJhbGxlbF9FbmNvZGluZzsKKyAgfSBlbHNlIHsKKyAgICBlbmNvZGluZ19tb2RlID0gT01YX1NlcmlhbF9FbmNvZGluZzsKKyAgfQorICBMT0dEKCJlbmNvZGluZyBtb2RlID0gJWQgIiwKKyAgICAoaW50KWVuY29kaW5nX21vZGUpOworICByYyA9IE9NWF9TZXRQYXJhbWV0ZXIocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCBpbmRleHR5cGUsICZlbmNvZGluZ19tb2RlKTsKKyAgaWYgKHJjICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICBMT0dFKCJGYWlsZWQiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ19nZXRfc3BlZWQ6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBwX3Nlc3Npb246IGpvYiBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIG9wcyBzcGVlZCB0eXBlIGZvciBqcGVnCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICBDb25maWd1cmUgbm9ybWFsIG9yIGhpZ2ggc3BlZWQganBlZworICoKKyAqKi8KK1FPTVhfSlBFR19TUEVFRF9NT0RFIG1tX2pwZWdfZ2V0X3NwZWVkKAorICBtbV9qcGVnX2pvYl9zZXNzaW9uX3QqIHBfc2Vzc2lvbikKK3sKKyAgbW1fanBlZ19lbmNvZGVfcGFyYW1zX3QgKnBfcGFyYW1zID0gJnBfc2Vzc2lvbi0+cGFyYW1zOworICBjYW1fZGltZW5zaW9uX3QgKnBfZGltID0gJnBfcGFyYW1zLT5tYWluX2RpbS5zcmNfZGltOworICBpZiAocF9wYXJhbXMtPmJ1cnN0X21vZGUgfHwKKyAgICAoTU1fSlBFR19NSU5fTk9NX1JFU09MVVRJT04gPCAocF9kaW0tPndpZHRoICogcF9kaW0tPmhlaWdodCkpKSB7CisgICAgcmV0dXJuIFFPTVhfSlBFR19TUEVFRF9NT0RFX0hJR0g7CisgIH0KKyAgcmV0dXJuIFFPTVhfSlBFR19TUEVFRF9NT0RFX05PUk1BTDsKK30KKworLyoqIG1tX2pwZWdfc3BlZWRfbW9kZToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHBfc2Vzc2lvbjogam9iIHNlc3Npb24KKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgT01YIGVycm9yIHZhbHVlcworICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgQ29uZmlndXJlIG5vcm1hbCBvciBoaWdoIHNwZWVkIGpwZWcKKyAqCisgKiovCitPTVhfRVJST1JUWVBFIG1tX2pwZWdfc3BlZWRfbW9kZSgKKyAgbW1fanBlZ19qb2Jfc2Vzc2lvbl90KiBwX3Nlc3Npb24pCit7CisgIE9NWF9FUlJPUlRZUEUgcmMgPSAwOworICBPTVhfSU5ERVhUWVBFIGluZGV4dHlwZTsKKyAgUU9NWF9KUEVHX1NQRUVEIGpwZWdfc3BlZWQ7CisKKyAgcmMgPSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgocF9zZXNzaW9uLT5vbXhfaGFuZGxlLAorICAgIFFPTVhfSU1BR0VfRVhUX0pQRUdfU1BFRURfTkFNRSwgJmluZGV4dHlwZSk7CisgIGlmIChyYyAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgTE9HRSgiRmFpbGVkIik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAganBlZ19zcGVlZC5zcGVlZE1vZGUgPSBtbV9qcGVnX2dldF9zcGVlZChwX3Nlc3Npb24pOworICBMT0dIKCJzcGVlZCAlZCIsIGpwZWdfc3BlZWQuc3BlZWRNb2RlKTsKKworICByYyA9IE9NWF9TZXRQYXJhbWV0ZXIocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCBpbmRleHR5cGUsICZqcGVnX3NwZWVkKTsKKyAgaWYgKHJjICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICBMT0dFKCJGYWlsZWQiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ19nZXRfbWVtOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAcF9vdXRfYnVmIDoganBlZyBvdXRwdXQgYnVmZmVyCisgKiAgICBAcF9qcGVnX3Nlc3Npb246IGpvYiBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIDAgZm9yIHN1Y2Nlc3MgZWxzZSBmYWlsdXJlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICBnZXRzIHRoZSBqcGVnIG91dHB1dCBidWZmZXIKKyAqCisgKiovCitzdGF0aWMgaW50MzJfdCBtbV9qcGVnX2dldF9tZW0oCisgIG9teF9qcGVnX291cHV0X2J1Zl90ICpwX291dF9idWYsIHZvaWQqIHBfanBlZ19zZXNzaW9uKQoreworICBpbnQzMl90IHJjID0gMDsKKyAgbW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24gPSAobW1fanBlZ19qb2Jfc2Vzc2lvbl90ICopcF9qcGVnX3Nlc3Npb247CisgIG1tX2pwZWdfZW5jb2RlX3BhcmFtc190ICpwX3BhcmFtcyA9IE5VTEw7CisgIG1tX2pwZWdfZW5jb2RlX2pvYl90ICpwX2VuY29kZV9qb2IgPSBOVUxMOworCisgIGlmICghcF9zZXNzaW9uKSB7CisgICAgTE9HRSgiSW52YWxpZCBpbnB1dCIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBwX3BhcmFtcyA9ICZwX3Nlc3Npb24tPnBhcmFtczsKKyAgcF9lbmNvZGVfam9iID0gJnBfc2Vzc2lvbi0+ZW5jb2RlX2pvYjsKKyAgaWYgKCFwX3BhcmFtcyB8fCAhcF9lbmNvZGVfam9iIHx8ICFwX3BhcmFtcy0+Z2V0X21lbW9yeSkgeworICAgIExPR0UoIkludmFsaWQganBlZyBlbmNvZGUgcGFyYW1zIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIHBfcGFyYW1zLT5nZXRfbWVtb3J5KHBfb3V0X2J1Zik7CisgIHBfZW5jb2RlX2pvYi0+cmVmX2NvdW50Kys7CisgIHBfZW5jb2RlX2pvYi0+YWxsb2Nfb3V0X2J1ZmZlciA9IHBfb3V0X2J1ZjsKKyAgTE9HRCgicmVmX2NvdW50ICVkIHBfb3V0X2J1ZiAlcCIsCisgICAgcF9lbmNvZGVfam9iLT5yZWZfY291bnQsIHBfb3V0X2J1Zik7CisgIHJldHVybiByYzsKK30KKworLyoqIG1tX2pwZWdfcHV0X21lbToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHBfanBlZ19zZXNzaW9uOiBqb2Igc2Vzc2lvbgorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIGZvciBzdWNjZXNzIGVsc2UgZmFpbHVyZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgcmVsZWFzZXMgdGhlIGpwZWcgb3V0cHV0IGJ1ZmZlcgorICoKKyAqKi8KK3N0YXRpYyBpbnQzMl90IG1tX2pwZWdfcHV0X21lbSh2b2lkKiBwX2pwZWdfc2Vzc2lvbikKK3sKKyAgaW50MzJfdCByYyA9IDA7CisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uID0gKG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqKXBfanBlZ19zZXNzaW9uOworICBtbV9qcGVnX2VuY29kZV9wYXJhbXNfdCAqcF9wYXJhbXMgPSBOVUxMOworICBtbV9qcGVnX2VuY29kZV9qb2JfdCAqcF9lbmNvZGVfam9iID0gTlVMTDsKKworICBpZiAoIXBfc2Vzc2lvbikgeworICAgIExPR0UoIkludmFsaWQgaW5wdXQiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcF9wYXJhbXMgPSAmcF9zZXNzaW9uLT5wYXJhbXM7CisgIHBfZW5jb2RlX2pvYiA9ICZwX3Nlc3Npb24tPmVuY29kZV9qb2I7CisKKyAgaWYgKCFwX3BhcmFtcy0+Z2V0X21lbW9yeSkgeworICAgIExPR0QoImdldF9tZW0gbm90IGRlZmluZWQsIGlnbm9yZSBwdXQgbWVtIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFwX3BhcmFtcyB8fCAhcF9lbmNvZGVfam9iIHx8ICFwX3BhcmFtcy0+cHV0X21lbW9yeSkgeworICAgIExPR0UoIkludmFsaWQganBlZyBlbmNvZGUgcGFyYW1zIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGlmICgoTU1fSlBFR19BQk9SVF9OT05FICE9IHBfc2Vzc2lvbi0+YWJvcnRfc3RhdGUpICYmCisgICAgcF9lbmNvZGVfam9iLT5yZWZfY291bnQpIHsKKyAgICBvbXhfanBlZ19vdXB1dF9idWZfdCAqcF9vdXRfYnVmID0KKyAgICAgICggb214X2pwZWdfb3VwdXRfYnVmX3QgKikgcF9lbmNvZGVfam9iLT5hbGxvY19vdXRfYnVmZmVyOworICAgIHBfcGFyYW1zLT5wdXRfbWVtb3J5KHBfb3V0X2J1Zik7CisgICAgcF9lbmNvZGVfam9iLT5yZWZfY291bnQtLTsKKyAgICBwX2VuY29kZV9qb2ItPmFsbG9jX291dF9idWZmZXIgPSBOVUxMOworICB9IGVsc2UgaWYgKHBfZW5jb2RlX2pvYi0+cmVmX2NvdW50KSB7CisgICAgcF9lbmNvZGVfam9iLT5yZWZfY291bnQtLTsKKyAgfSBlbHNlIHsKKyAgICBMT0dXKCJCdWZmZXIgYWxyZWFkeSByZWxlYXNlZCAlZCIsIHBfZW5jb2RlX2pvYi0+cmVmX2NvdW50KTsKKyAgICByYyA9IC0xOworICB9CisgIExPR0QoInJlZl9jb3VudCAlZCBwX291dF9idWYgJXAiLAorICAgIHBfZW5jb2RlX2pvYi0+cmVmX2NvdW50LCBwX2VuY29kZV9qb2ItPmFsbG9jX291dF9idWZmZXIpOworICByZXR1cm4gcmM7Cit9CisKKy8qKiBtbV9qcGVnX21lbV9vcHM6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBwX3Nlc3Npb246IGpvYiBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIE9NWCBlcnJvciB2YWx1ZXMKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDb25maWd1cmUgdGhlIHNlcmlhbCBvciBwYXJhbGxlbCBlbmNvZGluZworICogICAgICAgbW9kZQorICoKKyAqKi8KK09NWF9FUlJPUlRZUEUgbW1fanBlZ19tZW1fb3BzKAorICBtbV9qcGVnX2pvYl9zZXNzaW9uX3QqIHBfc2Vzc2lvbikKK3sKKyAgT01YX0VSUk9SVFlQRSByYyA9IDA7CisgIE9NWF9JTkRFWFRZUEUgaW5kZXh0eXBlOworICBRT01YX01FTV9PUFMgbWVtX29wczsKKyAgbW1fanBlZ19lbmNvZGVfcGFyYW1zX3QgKnBfcGFyYW1zID0gJnBfc2Vzc2lvbi0+cGFyYW1zOworCisgIGlmIChwX3BhcmFtcy0+Z2V0X21lbW9yeSkgeworICAgIG1lbV9vcHMuZ2V0X21lbW9yeSA9IG1tX2pwZWdfZ2V0X21lbTsKKyAgfSBlbHNlIHsKKyAgICBtZW1fb3BzLmdldF9tZW1vcnkgPSBOVUxMOworICAgIExPR0goIkhBTCBnZXRfbWVtIGhhbmRsZXIgdW5kZWZpbmVkIik7CisgIH0KKworICBtZW1fb3BzLnBzZXNzaW9uID0gcF9zZXNzaW9uOworICByYyA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChwX3Nlc3Npb24tPm9teF9oYW5kbGUsCisgICAgUU9NWF9JTUFHRV9FWFRfTUVNX09QU19OQU1FLCAmaW5kZXh0eXBlKTsKKyAgaWYgKHJjICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICBMT0dFKCJGYWlsZWQiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworICByYyA9IE9NWF9TZXRQYXJhbWV0ZXIocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCBpbmRleHR5cGUsICZtZW1fb3BzKTsKKyAgaWYgKHJjICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICBMT0dFKCJGYWlsZWQiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ19tZXRhZGF0YToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHBfc2Vzc2lvbjogam9iIHNlc3Npb24KKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgT01YIGVycm9yIHZhbHVlcworICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIFBhc3MgbWV0YSBkYXRhCisgKgorICoqLworT01YX0VSUk9SVFlQRSBtbV9qcGVnX21ldGFkYXRhKAorICBtbV9qcGVnX2pvYl9zZXNzaW9uX3QqIHBfc2Vzc2lvbikKK3sKKyAgT01YX0VSUk9SVFlQRSByYyA9IE9NWF9FcnJvck5vbmU7CisgIE9NWF9JTkRFWFRZUEUgaW5kZXhUeXBlOworICBRT01YX01FVEFEQVRBIGxNZXRhOworICBtbV9qcGVnX2VuY29kZV9qb2JfdCAqcF9qb2JwYXJhbXMgPSAmcF9zZXNzaW9uLT5lbmNvZGVfam9iOworICBtbV9qcGVnX29iaiAqbXlfb2JqID0gKG1tX2pwZWdfb2JqICopIHBfc2Vzc2lvbi0+anBlZ19vYmo7CisKKyAgcmMgPSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgocF9zZXNzaW9uLT5vbXhfaGFuZGxlLAorICAgICAgUU9NWF9JTUFHRV9FWFRfTUVUQURBVEFfTkFNRSwgJmluZGV4VHlwZSk7CisKKyAgaWYgKHJjICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICBMT0dFKCJGYWlsZWQiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworICBsTWV0YS5tZXRhZGF0YSA9IChPTVhfVTggKilwX2pvYnBhcmFtcy0+cF9tZXRhZGF0YTsKKyAgbE1ldGEubWV0YVBheWxvYWRTaXplID0gc2l6ZW9mKCpwX2pvYnBhcmFtcy0+cF9tZXRhZGF0YSk7CisgIGxNZXRhLm1vYmljYXRfbWFzayA9IHBfam9icGFyYW1zLT5tb2JpY2F0X21hc2s7CisgIGxNZXRhLnN0YXRpY19tZXRhZGF0YSA9IChPTVhfVTggKilteV9vYmotPmpwZWdfbWV0YWRhdGE7CisKKyAgcmMgPSBPTVhfU2V0Q29uZmlnKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgaW5kZXhUeXBlLCAmbE1ldGEpOworICBpZiAocmMgIT0gT01YX0Vycm9yTm9uZSkgeworICAgIExPR0UoIkZhaWxlZCIpOworICAgIHJldHVybiByYzsKKyAgfQorICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworLyoqIG1tX2pwZWdfbWV0YV9lbmNfa2V5OgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAcF9zZXNzaW9uOiBqb2Igc2Vzc2lvbgorICoKKyAqICBSZXR1cm46CisgKiAgICAgICBPTVggZXJyb3IgdmFsdWVzCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgUGFzcyBtZXRhZGF0YSBlbmNyeXB0IGtleQorICoKKyAqKi8KK09NWF9FUlJPUlRZUEUgbW1fanBlZ19tZXRhX2VuY19rZXkoCisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCogcF9zZXNzaW9uKQoreworICBPTVhfRVJST1JUWVBFIHJjID0gT01YX0Vycm9yTm9uZTsKKyAgT01YX0lOREVYVFlQRSBpbmRleFR5cGU7CisgIFFPTVhfTUVUQV9FTkNfS0VZIGxLZXk7CisKKyAgbEtleS5tZXRhS2V5ID0gcF9zZXNzaW9uLT5tZXRhX2VuY19rZXk7CisgIGxLZXkua2V5TGVuID0gcF9zZXNzaW9uLT5tZXRhX2VuY19rZXlsZW47CisKKyAgaWYgKCghbEtleS5tZXRhS2V5KSB8fCAoIWxLZXkua2V5TGVuKSl7CisgICAgTE9HRCgiS2V5IGlzIGludmFsaWQiKTsKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKKyAgfQorCisgIHJjID0gT01YX0dldEV4dGVuc2lvbkluZGV4KHBfc2Vzc2lvbi0+b214X2hhbmRsZSwKKyAgICAgIFFPTVhfSU1BR0VfRVhUX01FVEFfRU5DX0tFWV9OQU1FLCAmaW5kZXhUeXBlKTsKKworICBpZiAocmMgIT0gT01YX0Vycm9yTm9uZSkgeworICAgIExPR0UoIkZhaWxlZCIpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIHJjID0gT01YX1NldENvbmZpZyhwX3Nlc3Npb24tPm9teF9oYW5kbGUsIGluZGV4VHlwZSwgJmxLZXkpOworICBpZiAocmMgIT0gT01YX0Vycm9yTm9uZSkgeworICAgIExPR0UoIkZhaWxlZCIpOworICAgIHJldHVybiByYzsKKyAgfQorICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworLyoqIG1hcF9qcGVnX2Zvcm1hdDoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQGNvbG9yX2ZtdDogY29sb3IgZm9ybWF0CisgKgorICogIFJldHVybjoKKyAqICAgICAgIE9NWCBjb2xvciBmb3JtYXQKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBNYXAgbW1qcGVnIGNvbG9yIGZvcm1hdCB0byBPTVggY29sb3IgZm9ybWF0CisgKgorICoqLworaW50IG1hcF9qcGVnX2Zvcm1hdChtbV9qcGVnX2NvbG9yX2Zvcm1hdCBjb2xvcl9mbXQpCit7CisgIHN3aXRjaCAoY29sb3JfZm10KSB7CisgIGNhc2UgTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNSQ0JMUF9IMlYyOgorICAgIHJldHVybiAoaW50KU9NWF9RQ09NX0lNR19DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOworICBjYXNlIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDQkNSTFBfSDJWMjoKKyAgICByZXR1cm4gKGludClPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjsKKyAgY2FzZSBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ1JDQkxQX0gyVjE6CisgICAgcmV0dXJuIChpbnQpT01YX1FDT01fSU1HX0NPTE9SX0Zvcm1hdFlWVTQyMlNlbWlQbGFuYXI7CisgIGNhc2UgTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNCQ1JMUF9IMlYxOgorICAgIHJldHVybiAoaW50KU9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJTZW1pUGxhbmFyOworICBjYXNlIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDUkNCTFBfSDFWMjoKKyAgICByZXR1cm4gKGludClPTVhfUUNPTV9JTUdfQ09MT1JfRm9ybWF0WVZVNDIyU2VtaVBsYW5hcl9oMXYyOworICBjYXNlIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDQkNSTFBfSDFWMjoKKyAgICByZXR1cm4gKGludClPTVhfUUNPTV9JTUdfQ09MT1JfRm9ybWF0WVVWNDIyU2VtaVBsYW5hcl9oMXYyOworICBjYXNlIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDUkNCTFBfSDFWMToKKyAgICByZXR1cm4gKGludClPTVhfUUNPTV9JTUdfQ09MT1JfRm9ybWF0WVZVNDQ0U2VtaVBsYW5hcjsKKyAgY2FzZSBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gxVjE6CisgICAgcmV0dXJuIChpbnQpT01YX1FDT01fSU1HX0NPTE9SX0Zvcm1hdFlVVjQ0NFNlbWlQbGFuYXI7CisgIGNhc2UgTU1fSlBFR19DT0xPUl9GT1JNQVRfTU9OT0NIUk9NRToKKyAgICAgcmV0dXJuIChpbnQpT01YX0NPTE9SX0Zvcm1hdE1vbm9jaHJvbWU7CisgIGRlZmF1bHQ6CisgICAgTE9HVygiaW52YWxpZCBmb3JtYXQgJWQiLCBjb2xvcl9mbXQpOworICAgIHJldHVybiAoaW50KU9NWF9RQ09NX0lNR19DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOworICB9Cit9CisKKy8qKiBtbV9qcGVnX2dldF9pbWdmbXRfZnJvbV9jb2xvcmZtdDoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQGNvbG9yX2ZtdDogY29sb3IgZm9ybWF0CisgKgorICogIFJldHVybjoKKyAqICAgIGNhbSBmb3JtYXQKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBHZXQgY2FtZXJhIGltYWdlIGZvcm1hdCBmcm9tIGNvbG9yIGZvcm1hdAorICoKKyAqKi8KK2NhbV9mb3JtYXRfdCBtbV9qcGVnX2dldF9pbWdmbXRfZnJvbV9jb2xvcmZtdAorICAobW1fanBlZ19jb2xvcl9mb3JtYXQgY29sb3JfZm10KQoreworICBzd2l0Y2ggKGNvbG9yX2ZtdCkgeworICBjYXNlIE1NX0pQRUdfQ09MT1JfRk9STUFUX01PTk9DSFJPTUU6CisgICAgcmV0dXJuIENBTV9GT1JNQVRfWV9PTkxZOworICBjYXNlIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDUkNCTFBfSDJWMjoKKyAgICByZXR1cm4gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjE7CisgIGNhc2UgTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNCQ1JMUF9IMlYyOgorICAgIHJldHVybiBDQU1fRk9STUFUX1lVVl80MjBfTlYxMjsKKyAgY2FzZSBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ1JDQkxQX0gyVjE6CisgIGNhc2UgTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNSQ0JMUF9IMVYyOgorICAgIHJldHVybiBDQU1fRk9STUFUX1lVVl80MjJfTlY2MTsKKyAgY2FzZSBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gyVjE6CisgIGNhc2UgTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNCQ1JMUF9IMVYyOgorICAgIHJldHVybiBDQU1fRk9STUFUX1lVVl80MjJfTlYxNjsKKyAgY2FzZSBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ1JDQkxQX0gxVjE6CisgICAgcmV0dXJuIENBTV9GT1JNQVRfWVVWXzQ0NF9OVjQyOworICBjYXNlIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDQkNSTFBfSDFWMToKKyAgICByZXR1cm4gQ0FNX0ZPUk1BVF9ZVVZfNDQ0X05WMjQ7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIENBTV9GT1JNQVRfWV9PTkxZOworICB9Cit9CisKKy8qKiBtbV9qcGVnX3Nlc3Npb25fY29uZmlnX3BvcnQ6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBwX3Nlc3Npb246IGpvYiBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIE9NWCBlcnJvciB2YWx1ZXMKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDb25maWd1cmUgT01YIHBvcnRzCisgKgorICoqLworT01YX0VSUk9SVFlQRSBtbV9qcGVnX3Nlc3Npb25fY29uZmlnX3BvcnRzKG1tX2pwZWdfam9iX3Nlc3Npb25fdCogcF9zZXNzaW9uKQoreworICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgIG1tX2pwZWdfZW5jb2RlX3BhcmFtc190ICpwX3BhcmFtcyA9ICZwX3Nlc3Npb24tPnBhcmFtczsKKyAgT01YX0NPTkZJR19ST1RBVElPTlRZUEUgcm90YXRlOworCisgIG1tX2pwZWdfYnVmX3QgKnBfc3JjX2J1ZiA9CisgICAgJnBfcGFyYW1zLT5zcmNfbWFpbl9idWZbMF07CisKKyAgcF9zZXNzaW9uLT5pbnB1dFBvcnQublBvcnRJbmRleCA9IDA7CisgIHBfc2Vzc2lvbi0+b3V0cHV0UG9ydC5uUG9ydEluZGV4ID0gMTsKKyAgcF9zZXNzaW9uLT5pbnB1dFRtYlBvcnQublBvcnRJbmRleCA9IDI7CisKKyAgcmV0ID0gT01YX0dldFBhcmFtZXRlcihwX3Nlc3Npb24tPm9teF9oYW5kbGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sCisgICAgJnBfc2Vzc2lvbi0+aW5wdXRQb3J0KTsKKyAgaWYgKHJldCkgeworICAgIExPR0UoImZhaWxlZCIpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICByZXQgPSBPTVhfR2V0UGFyYW1ldGVyKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwKKyAgICAmcF9zZXNzaW9uLT5pbnB1dFRtYlBvcnQpOworICBpZiAocmV0KSB7CisgICAgTE9HRSgiZmFpbGVkIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHJldCA9IE9NWF9HZXRQYXJhbWV0ZXIocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLAorICAgICZwX3Nlc3Npb24tPm91dHB1dFBvcnQpOworICBpZiAocmV0KSB7CisgICAgTE9HRSgiZmFpbGVkIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGlmIChwX3Nlc3Npb24tPmxpYjJkX3JvdGF0aW9uX2ZsYWcgJiYKKyAgICAoKHBfc2Vzc2lvbi0+cGFyYW1zLnJvdGF0aW9uID09IDkwKSB8fAorICAgIChwX3Nlc3Npb24tPnBhcmFtcy5yb3RhdGlvbiA9PSAyNzApKSkgeworICAgIHBfc2Vzc2lvbi0+aW5wdXRQb3J0LmZvcm1hdC5pbWFnZS5uRnJhbWVXaWR0aCA9CisgICAgICAoT01YX1UzMilwX3BhcmFtcy0+bWFpbl9kaW0uc3JjX2RpbS5oZWlnaHQ7CisgICAgcF9zZXNzaW9uLT5pbnB1dFBvcnQuZm9ybWF0LmltYWdlLm5GcmFtZUhlaWdodCA9CisgICAgICAoT01YX1UzMilwX3BhcmFtcy0+bWFpbl9kaW0uc3JjX2RpbS53aWR0aDsKKyAgICBwX3Nlc3Npb24tPmlucHV0UG9ydC5mb3JtYXQuaW1hZ2UublN0cmlkZSA9CisgICAgICBwX3NyY19idWYtPm9mZnNldC5tcFswXS5zY2FubGluZTsKKyAgICBwX3Nlc3Npb24tPmlucHV0UG9ydC5mb3JtYXQuaW1hZ2UublNsaWNlSGVpZ2h0ID0KKyAgICAgIChPTVhfVTMyKXBfc3JjX2J1Zi0+b2Zmc2V0Lm1wWzBdLnN0cmlkZTsKKyAgfSBlbHNlIHsKKyAgICBwX3Nlc3Npb24tPmlucHV0UG9ydC5mb3JtYXQuaW1hZ2UubkZyYW1lV2lkdGggPQorICAgICAgKE9NWF9VMzIpcF9wYXJhbXMtPm1haW5fZGltLnNyY19kaW0ud2lkdGg7CisgICAgcF9zZXNzaW9uLT5pbnB1dFBvcnQuZm9ybWF0LmltYWdlLm5GcmFtZUhlaWdodCA9CisgICAgICAoT01YX1UzMilwX3BhcmFtcy0+bWFpbl9kaW0uc3JjX2RpbS5oZWlnaHQ7CisgICAgcF9zZXNzaW9uLT5pbnB1dFBvcnQuZm9ybWF0LmltYWdlLm5TdHJpZGUgPQorICAgICAgcF9zcmNfYnVmLT5vZmZzZXQubXBbMF0uc3RyaWRlOworICAgIHBfc2Vzc2lvbi0+aW5wdXRQb3J0LmZvcm1hdC5pbWFnZS5uU2xpY2VIZWlnaHQgPQorICAgICAgKE9NWF9VMzIpcF9zcmNfYnVmLT5vZmZzZXQubXBbMF0uc2NhbmxpbmU7CisgIH0KKworICBwX3Nlc3Npb24tPmlucHV0UG9ydC5mb3JtYXQuaW1hZ2UuZUNvbG9yRm9ybWF0ID0KKyAgICBtYXBfanBlZ19mb3JtYXQocF9wYXJhbXMtPmNvbG9yX2Zvcm1hdCk7CisgIHBfc2Vzc2lvbi0+aW5wdXRQb3J0Lm5CdWZmZXJTaXplID0KKyAgICBwX3BhcmFtcy0+c3JjX21haW5fYnVmWzAvKnBfam9icGFyYW1zLT5zcmNfaW5kZXgqL10uYnVmX3NpemU7CisKKyAgaWYgKHBfc2Vzc2lvbi0+bGliMmRfcm90YXRpb25fZmxhZykgeworICAgIHBfc2Vzc2lvbi0+aW5wdXRQb3J0Lm5CdWZmZXJDb3VudEFjdHVhbCA9CisgICAgICAoT01YX1UzMilwX3Nlc3Npb24tPm51bV9zcmNfcm90X2J1ZnM7CisgIH0gZWxzZSB7CisgICAgcF9zZXNzaW9uLT5pbnB1dFBvcnQubkJ1ZmZlckNvdW50QWN0dWFsID0KKyAgICAgIChPTVhfVTMyKXBfcGFyYW1zLT5udW1fc3JjX2J1ZnM7CisgIH0KKworICByZXQgPSBPTVhfU2V0UGFyYW1ldGVyKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwKKyAgICAmcF9zZXNzaW9uLT5pbnB1dFBvcnQpOworICBpZiAocmV0KSB7CisgICAgTE9HRSgiZmFpbGVkIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGlmIChwX3Nlc3Npb24tPnBhcmFtcy5lbmNvZGVfdGh1bWJuYWlsKSB7CisgICAgbW1fanBlZ19idWZfdCAqcF90bWJfYnVmID0KKyAgICAgICZwX3BhcmFtcy0+c3JjX3RodW1iX2J1ZlswXTsKKyAgICBpZiAoKHBfc2Vzc2lvbi0+bGliMmRfcm90YXRpb25fZmxhZyAmJiBwX3Nlc3Npb24tPnRodW1iX2Zyb21fbWFpbikgJiYKKyAgICAgICgocF9zZXNzaW9uLT5wYXJhbXMucm90YXRpb24gPT0gOTApIHx8CisgICAgICAocF9zZXNzaW9uLT5wYXJhbXMucm90YXRpb24gPT0gMjcwKSkpIHsKKyAgICAgIHBfc2Vzc2lvbi0+aW5wdXRUbWJQb3J0LmZvcm1hdC5pbWFnZS5uRnJhbWVXaWR0aCA9CisgICAgICAgIChPTVhfVTMyKXBfcGFyYW1zLT50aHVtYl9kaW0uc3JjX2RpbS5oZWlnaHQ7CisgICAgICBwX3Nlc3Npb24tPmlucHV0VG1iUG9ydC5mb3JtYXQuaW1hZ2UubkZyYW1lSGVpZ2h0ID0KKyAgICAgICAgKE9NWF9VMzIpcF9wYXJhbXMtPnRodW1iX2RpbS5zcmNfZGltLndpZHRoOworICAgICAgcF9zZXNzaW9uLT5pbnB1dFRtYlBvcnQuZm9ybWF0LmltYWdlLm5TdHJpZGUgPQorICAgICAgICBwX3RtYl9idWYtPm9mZnNldC5tcFswXS5zY2FubGluZTsKKyAgICAgIHBfc2Vzc2lvbi0+aW5wdXRUbWJQb3J0LmZvcm1hdC5pbWFnZS5uU2xpY2VIZWlnaHQgPQorICAgICAgICAoT01YX1UzMilwX3RtYl9idWYtPm9mZnNldC5tcFswXS5zdHJpZGU7CisgICAgfSBlbHNlIHsKKyAgICAgIHBfc2Vzc2lvbi0+aW5wdXRUbWJQb3J0LmZvcm1hdC5pbWFnZS5uRnJhbWVXaWR0aCA9CisgICAgICAgIChPTVhfVTMyKXBfcGFyYW1zLT50aHVtYl9kaW0uc3JjX2RpbS53aWR0aDsKKyAgICAgIHBfc2Vzc2lvbi0+aW5wdXRUbWJQb3J0LmZvcm1hdC5pbWFnZS5uRnJhbWVIZWlnaHQgPQorICAgICAgICAoT01YX1UzMilwX3BhcmFtcy0+dGh1bWJfZGltLnNyY19kaW0uaGVpZ2h0OworICAgICAgcF9zZXNzaW9uLT5pbnB1dFRtYlBvcnQuZm9ybWF0LmltYWdlLm5TdHJpZGUgPQorICAgICAgICBwX3RtYl9idWYtPm9mZnNldC5tcFswXS5zdHJpZGU7CisgICAgICBwX3Nlc3Npb24tPmlucHV0VG1iUG9ydC5mb3JtYXQuaW1hZ2UublNsaWNlSGVpZ2h0ID0KKyAgICAgICAgKE9NWF9VMzIpcF90bWJfYnVmLT5vZmZzZXQubXBbMF0uc2NhbmxpbmU7CisgICAgfQorCisgICAgcF9zZXNzaW9uLT5pbnB1dFRtYlBvcnQuZm9ybWF0LmltYWdlLmVDb2xvckZvcm1hdCA9CisgICAgICBtYXBfanBlZ19mb3JtYXQocF9wYXJhbXMtPnRodW1iX2NvbG9yX2Zvcm1hdCk7CisgICAgcF9zZXNzaW9uLT5pbnB1dFRtYlBvcnQubkJ1ZmZlclNpemUgPQorICAgICAgcF9wYXJhbXMtPnNyY190aHVtYl9idWZbMF0uYnVmX3NpemU7CisKKyAgICBpZiAocF9zZXNzaW9uLT5saWIyZF9yb3RhdGlvbl9mbGFnICYmIHBfc2Vzc2lvbi0+dGh1bWJfZnJvbV9tYWluKSB7CisgICAgICBwX3Nlc3Npb24tPmlucHV0VG1iUG9ydC5uQnVmZmVyQ291bnRBY3R1YWwgPQorICAgICAgICAoT01YX1UzMilwX3Nlc3Npb24tPm51bV9zcmNfcm90X2J1ZnM7CisgICAgfSBlbHNlIHsKKyAgICAgIHBfc2Vzc2lvbi0+aW5wdXRUbWJQb3J0Lm5CdWZmZXJDb3VudEFjdHVhbCA9CisgICAgICAgIChPTVhfVTMyKXBfcGFyYW1zLT5udW1fdG1iX2J1ZnM7CisgICAgfQorCisgICAgcmV0ID0gT01YX1NldFBhcmFtZXRlcihwX3Nlc3Npb24tPm9teF9oYW5kbGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sCisgICAgICAmcF9zZXNzaW9uLT5pbnB1dFRtYlBvcnQpOworCisgICAgaWYgKHJldCkgeworICAgICAgTE9HRSgiZmFpbGVkIik7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIEVuYWJsZSB0aHVtYm5haWwgcG9ydAorICAgIHJldCA9IE9NWF9TZW5kQ29tbWFuZChwX3Nlc3Npb24tPm9teF9oYW5kbGUsIE9NWF9Db21tYW5kUG9ydEVuYWJsZSwKKyAgICAgICAgcF9zZXNzaW9uLT5pbnB1dFRtYlBvcnQublBvcnRJbmRleCwgTlVMTCk7CisKKyAgICBpZiAocmV0KSB7CisgICAgICBMT0dFKCJmYWlsZWQiKTsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIERpc2FibGUgdGh1bWJuYWlsIHBvcnQKKyAgICByZXQgPSBPTVhfU2VuZENvbW1hbmQocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCBPTVhfQ29tbWFuZFBvcnREaXNhYmxlLAorICAgICAgICBwX3Nlc3Npb24tPmlucHV0VG1iUG9ydC5uUG9ydEluZGV4LCBOVUxMKTsKKworICAgIGlmIChyZXQpIHsKKyAgICAgIExPR0UoImZhaWxlZCIpOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgIH0KKworICBwX3Nlc3Npb24tPm91dHB1dFBvcnQubkJ1ZmZlclNpemUgPQorICAgIHBfcGFyYW1zLT5kZXN0X2J1ZlswXS5idWZfc2l6ZTsKKyAgcF9zZXNzaW9uLT5vdXRwdXRQb3J0Lm5CdWZmZXJDb3VudEFjdHVhbCA9IChPTVhfVTMyKXBfcGFyYW1zLT5udW1fZHN0X2J1ZnM7CisgIHJldCA9IE9NWF9TZXRQYXJhbWV0ZXIocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLAorICAgICZwX3Nlc3Npb24tPm91dHB1dFBvcnQpOworICBpZiAocmV0KSB7CisgICAgTE9HRSgiZmFpbGVkIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIC8qIHNldCByb3RhdGlvbiAqLworICBtZW1zZXQoJnJvdGF0ZSwgMCwgc2l6ZW9mKHJvdGF0ZSkpOworICByb3RhdGUublBvcnRJbmRleCA9IDE7CisKKyAgaWYgKHBfc2Vzc2lvbi0+bGliMmRfcm90YXRpb25fZmxhZykgeworICAgIHJvdGF0ZS5uUm90YXRpb24gPSAwOworICB9IGVsc2UgeworICAgIHJvdGF0ZS5uUm90YXRpb24gPSAoT01YX1MzMilwX3BhcmFtcy0+cm90YXRpb247CisgIH0KKworICByZXQgPSBPTVhfU2V0Q29uZmlnKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlLAorICAgICAgJnJvdGF0ZSk7CisgIGlmIChPTVhfRXJyb3JOb25lICE9IHJldCkgeworICAgIExPR0UoIkVycm9yICVkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIExPR0QoIlNldCByb3RhdGlvbiB0byAlZCBhdCBwb3J0X2lkeCA9ICVkIiwKKyAgICAgIChpbnQpcF9wYXJhbXMtPnJvdGF0aW9uLCAoaW50KXJvdGF0ZS5uUG9ydEluZGV4KTsKKworICByZXR1cm4gcmV0OworfQorCisvKiogbW1fanBlZ191cGRhdGVfdGh1bWJuYWlsX2Nyb3AKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHBfdGh1bWJfZGltOiB0aHVtYm5haWwgZGltZW5zaW9uCisgKiAgICBAY3JvcF93aWR0aCA6IGZsYWcgaW5kaWNhdGluZyBpZiB3aWR0aCBuZWVkcyB0byBiZSBjcm9wcGVkCisgKgorICogIFJldHVybjoKKyAqICAgIE9NWCBlcnJvciB2YWx1ZXMKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBVcGRhdGVzIHRodW1ibmFpbCBjcm9wIGFzcGVjdCByYXRpbyBiYXNlZCBvbgorICogICAgdGh1bWJuYWlsIGRlc3RpbmF0aW9uIGFzcGVjdCByYXRpby4KKyAqCisgKi8KK09NWF9FUlJPUlRZUEUgbW1fanBlZ191cGRhdGVfdGh1bWJuYWlsX2Nyb3AobW1fanBlZ19kaW1fdCAqcF90aHVtYl9kaW0sCisgIHVpbnQ4X3QgY3JvcF93aWR0aCkKK3sKKyAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworICBpbnQzMl90IGNyb3BwZWRfd2lkdGggPSAwLCBjcm9wcGVkX2hlaWdodCA9IDA7CisKKyAgaWYgKGNyb3Bfd2lkdGgpIHsKKyAgICAvLyBLZWVwIGhlaWdodCBjb25zdGFudAorICAgIGNyb3BwZWRfaGVpZ2h0ID0gcF90aHVtYl9kaW0tPmNyb3AuaGVpZ2h0OworICAgIGNyb3BwZWRfd2lkdGggPSBmbG9vcigoY3JvcHBlZF9oZWlnaHQgKiBwX3RodW1iX2RpbS0+ZHN0X2RpbS53aWR0aCkgLworICAgICAgcF90aHVtYl9kaW0tPmRzdF9kaW0uaGVpZ2h0KTsKKyAgICBpZiAoY3JvcHBlZF93aWR0aCAlIDIpIHsKKyAgICAgIGNyb3BwZWRfd2lkdGggLT0gMTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gS2VlcCB3aWR0aCBjb25zdGFudAorICAgIGNyb3BwZWRfd2lkdGggPSBwX3RodW1iX2RpbS0+Y3JvcC53aWR0aDsKKyAgICBjcm9wcGVkX2hlaWdodCA9IGZsb29yKChjcm9wcGVkX3dpZHRoICogcF90aHVtYl9kaW0tPmRzdF9kaW0uaGVpZ2h0KSAvCisgICAgICBwX3RodW1iX2RpbS0+ZHN0X2RpbS53aWR0aCk7CisgICAgaWYgKGNyb3BwZWRfaGVpZ2h0ICUgMikgeworICAgICAgY3JvcHBlZF9oZWlnaHQgLT0gMTsKKyAgICB9CisgIH0KKyAgcF90aHVtYl9kaW0tPmNyb3AubGVmdCA9IHBfdGh1bWJfZGltLT5jcm9wLmxlZnQgKworICAgIGZsb29yKChwX3RodW1iX2RpbS0+Y3JvcC53aWR0aCAtIGNyb3BwZWRfd2lkdGgpIC8gMik7CisgIGlmIChwX3RodW1iX2RpbS0+Y3JvcC5sZWZ0ICUgMikgeworICAgIHBfdGh1bWJfZGltLT5jcm9wLmxlZnQgLT0gMTsKKyAgfQorICBwX3RodW1iX2RpbS0+Y3JvcC50b3AgPSBwX3RodW1iX2RpbS0+Y3JvcC50b3AgKworICAgIGZsb29yKChwX3RodW1iX2RpbS0+Y3JvcC5oZWlnaHQgLSBjcm9wcGVkX2hlaWdodCkgLyAyKTsKKyAgaWYgKHBfdGh1bWJfZGltLT5jcm9wLnRvcCAlIDIpIHsKKyAgICBwX3RodW1iX2RpbS0+Y3JvcC50b3AgLT0gMTsKKyAgfQorICBwX3RodW1iX2RpbS0+Y3JvcC53aWR0aCA9IGNyb3BwZWRfd2lkdGg7CisgIHBfdGh1bWJfZGltLT5jcm9wLmhlaWdodCA9IGNyb3BwZWRfaGVpZ2h0OworCisgIExPR0goIk5ldyB0aHVtYm5haWwgY3JvcDogbGVmdCAlZCwgdG9wICVkLCBjcm9wIHdpZHRoICVkLCIKKyAgICAiIGNyb3AgaGVpZ2h0ICVkIiwgcF90aHVtYl9kaW0tPmNyb3AubGVmdCwKKyAgICBwX3RodW1iX2RpbS0+Y3JvcC50b3AsIHBfdGh1bWJfZGltLT5jcm9wLndpZHRoLAorICAgIHBfdGh1bWJfZGltLT5jcm9wLmhlaWdodCk7CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqIG1tX2pwZWdfb214X2NvbmZpZ190aHVtYm5haWw6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBwX3Nlc3Npb246IGpvYiBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIE9NWCBlcnJvciB2YWx1ZXMKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDb25maWd1cmUgT01YIHBvcnRzCisgKgorICoqLworT01YX0VSUk9SVFlQRSBtbV9qcGVnX3Nlc3Npb25fY29uZmlnX3RodW1ibmFpbChtbV9qcGVnX2pvYl9zZXNzaW9uX3QqIHBfc2Vzc2lvbikKK3sKKyAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworICBRT01YX1RIVU1CTkFJTF9JTkZPIHRodW1ibmFpbF9pbmZvOworICBPTVhfSU5ERVhUWVBFIHRodW1iX2luZGV4dHlwZTsKKyAgbW1fanBlZ19lbmNvZGVfcGFyYW1zX3QgKnBfcGFyYW1zID0gJnBfc2Vzc2lvbi0+cGFyYW1zOworICBtbV9qcGVnX2VuY29kZV9qb2JfdCAqcF9qb2JwYXJhbXMgPSAmcF9zZXNzaW9uLT5lbmNvZGVfam9iOworICBtbV9qcGVnX2RpbV90ICpwX3RodW1iX2RpbSA9ICZwX2pvYnBhcmFtcy0+dGh1bWJfZGltOworICBtbV9qcGVnX2RpbV90ICpwX21haW5fZGltID0gJnBfam9icGFyYW1zLT5tYWluX2RpbTsKKyAgUU9NWF9ZVVZfRlJBTUVfSU5GTyAqcF9mcmFtZV9pbmZvID0gJnRodW1ibmFpbF9pbmZvLnRtYk9mZnNldDsKKyAgbW1fanBlZ19idWZfdCAqcF90bWJfYnVmID0gJnBfcGFyYW1zLT5zcmNfdGh1bWJfYnVmW3Bfam9icGFyYW1zLT50aHVtYl9pbmRleF07CisKKyAgTE9HSCgiZW5jb2RlX3RodW1ibmFpbCAldSIsCisgICAgcF9wYXJhbXMtPmVuY29kZV90aHVtYm5haWwpOworICBpZiAoT01YX0ZBTFNFID09IHBfcGFyYW1zLT5lbmNvZGVfdGh1bWJuYWlsKSB7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIGlmICgocF90aHVtYl9kaW0tPmRzdF9kaW0ud2lkdGggPT0gMCkgfHwgKHBfdGh1bWJfZGltLT5kc3RfZGltLmhlaWdodCA9PSAwKSkgeworICAgIExPR0UoIkVycm9yIGludmFsaWQgb3V0cHV0IGRpbSBmb3IgdGh1bWJuYWlsIik7CisgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgfQorCisgIGlmICgocF90aHVtYl9kaW0tPnNyY19kaW0ud2lkdGggPT0gMCkgfHwgKHBfdGh1bWJfZGltLT5zcmNfZGltLmhlaWdodCA9PSAwKSkgeworICAgIExPR0UoIkVycm9yIGludmFsaWQgaW5wdXQgZGltIGZvciB0aHVtYm5haWwiKTsKKyAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICB9CisKKyAgaWYgKChwX3RodW1iX2RpbS0+Y3JvcC53aWR0aCA9PSAwKSB8fCAocF90aHVtYl9kaW0tPmNyb3AuaGVpZ2h0ID09IDApKSB7CisgICAgcF90aHVtYl9kaW0tPmNyb3Aud2lkdGggPSBwX3RodW1iX2RpbS0+c3JjX2RpbS53aWR0aDsKKyAgICBwX3RodW1iX2RpbS0+Y3JvcC5oZWlnaHQgPSBwX3RodW1iX2RpbS0+c3JjX2RpbS5oZWlnaHQ7CisgIH0KKworICAvKiBjaGVjayBjcm9wIGJvdW5kYXJ5ICovCisgIGlmICgocF90aHVtYl9kaW0tPmNyb3Aud2lkdGggKyBwX3RodW1iX2RpbS0+Y3JvcC5sZWZ0ID4gcF90aHVtYl9kaW0tPnNyY19kaW0ud2lkdGgpIHx8CisgICAgKHBfdGh1bWJfZGltLT5jcm9wLmhlaWdodCArIHBfdGh1bWJfZGltLT5jcm9wLnRvcCA+IHBfdGh1bWJfZGltLT5zcmNfZGltLmhlaWdodCkpIHsKKyAgICBMT0dFKCJpbnZhbGlkIGNyb3AgYm91bmRhcnkgKCVkLCAlZCkgb2Zmc2V0ICglZCwgJWQpIG91dCBvZiAoJWQsICVkKSIsCisgICAgICBwX3RodW1iX2RpbS0+Y3JvcC53aWR0aCwKKyAgICAgIHBfdGh1bWJfZGltLT5jcm9wLmhlaWdodCwKKyAgICAgIHBfdGh1bWJfZGltLT5jcm9wLmxlZnQsCisgICAgICBwX3RodW1iX2RpbS0+Y3JvcC50b3AsCisgICAgICBwX3RodW1iX2RpbS0+c3JjX2RpbS53aWR0aCwKKyAgICAgIHBfdGh1bWJfZGltLT5zcmNfZGltLmhlaWdodCk7CisgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgfQorCisgIG1lbXNldCgmdGh1bWJuYWlsX2luZm8sIDB4MCwgc2l6ZW9mKFFPTVhfVEhVTUJOQUlMX0lORk8pKTsKKyAgcmV0ID0gT01YX0dldEV4dGVuc2lvbkluZGV4KHBfc2Vzc2lvbi0+b214X2hhbmRsZSwKKyAgICBRT01YX0lNQUdFX0VYVF9USFVNQk5BSUxfTkFNRSwKKyAgICAmdGh1bWJfaW5kZXh0eXBlKTsKKyAgaWYgKHJldCkgeworICAgIExPR0UoIkVycm9yICVkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgLyogZmlsbCB0aHVtYm5haWwgaW5mbyAqLworICB0aHVtYm5haWxfaW5mby5zY2FsaW5nX2VuYWJsZWQgPSAxOworICB0aHVtYm5haWxfaW5mby5pbnB1dF93aWR0aCA9IChPTVhfVTMyKXBfdGh1bWJfZGltLT5zcmNfZGltLndpZHRoOworICB0aHVtYm5haWxfaW5mby5pbnB1dF9oZWlnaHQgPSAoT01YX1UzMilwX3RodW1iX2RpbS0+c3JjX2RpbS5oZWlnaHQ7CisgIHRodW1ibmFpbF9pbmZvLnJvdGF0aW9uID0gKE9NWF9VMzIpcF9wYXJhbXMtPnRodW1iX3JvdGF0aW9uOworICB0aHVtYm5haWxfaW5mby5xdWFsaXR5ID0gKE9NWF9VMzIpcF9wYXJhbXMtPnRodW1iX3F1YWxpdHk7CisgIHRodW1ibmFpbF9pbmZvLm91dHB1dF93aWR0aCA9IChPTVhfVTMyKXBfdGh1bWJfZGltLT5kc3RfZGltLndpZHRoOworICB0aHVtYm5haWxfaW5mby5vdXRwdXRfaGVpZ2h0ID0gKE9NWF9VMzIpcF90aHVtYl9kaW0tPmRzdF9kaW0uaGVpZ2h0OworCisgIGlmIChwX3Nlc3Npb24tPnRodW1iX2Zyb21fbWFpbikgeworCisgICAgaWYgKHBfc2Vzc2lvbi0+bGliMmRfcm90YXRpb25fZmxhZykgeworICAgICAgdGh1bWJuYWlsX2luZm8ucm90YXRpb24gPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoKHBfc2Vzc2lvbi0+cGFyYW1zLnRodW1iX3JvdGF0aW9uID09IDkwIHx8CisgICAgICAgIHBfc2Vzc2lvbi0+cGFyYW1zLnRodW1iX3JvdGF0aW9uID09IDI3MCkgJiYKKyAgICAgICAgKHBfc2Vzc2lvbi0+cGFyYW1zLnJvdGF0aW9uID09IDAgfHwKKyAgICAgICAgcF9zZXNzaW9uLT5wYXJhbXMucm90YXRpb24gPT0gMTgwKSkgeworCisgICAgICAgIHRodW1ibmFpbF9pbmZvLm91dHB1dF93aWR0aCA9IChPTVhfVTMyKXBfdGh1bWJfZGltLT5kc3RfZGltLmhlaWdodDsKKyAgICAgICAgdGh1bWJuYWlsX2luZm8ub3V0cHV0X2hlaWdodCA9IChPTVhfVTMyKXBfdGh1bWJfZGltLT5kc3RfZGltLndpZHRoOworICAgICAgICB0aHVtYm5haWxfaW5mby5yb3RhdGlvbiA9IHBfc2Vzc2lvbi0+cGFyYW1zLnJvdGF0aW9uOworICAgICAgfQorICAgIH0KKworICAgIC8vVGh1bWIgRk9WIHNob3VsZCBiZSB3aXRoaW4gbWFpbiBpbWFnZSBGT1YKKyAgICBpZiAocF90aHVtYl9kaW0tPmNyb3AubGVmdCA8IHBfbWFpbl9kaW0tPmNyb3AubGVmdCkgeworICAgICAgcF90aHVtYl9kaW0tPmNyb3AubGVmdCA9IHBfbWFpbl9kaW0tPmNyb3AubGVmdDsKKyAgICB9CisKKyAgICBpZiAocF90aHVtYl9kaW0tPmNyb3AudG9wIDwgcF9tYWluX2RpbS0+Y3JvcC50b3ApIHsKKyAgICAgIHBfdGh1bWJfZGltLT5jcm9wLnRvcCA9IHBfbWFpbl9kaW0tPmNyb3AudG9wOworICAgIH0KKworICAgIHdoaWxlICgocF90aHVtYl9kaW0tPmNyb3AubGVmdCArIHBfdGh1bWJfZGltLT5jcm9wLndpZHRoKSA+CisgICAgICAocF9tYWluX2RpbS0+Y3JvcC5sZWZ0ICsgcF9tYWluX2RpbS0+Y3JvcC53aWR0aCkpIHsKKyAgICAgIGlmIChwX3RodW1iX2RpbS0+Y3JvcC5sZWZ0ID09IHBfbWFpbl9kaW0tPmNyb3AubGVmdCkgeworICAgICAgICBwX3RodW1iX2RpbS0+Y3JvcC53aWR0aCA9IHBfbWFpbl9kaW0tPmNyb3Aud2lkdGg7CisgICAgICB9IGVsc2UgeworICAgICAgICBwX3RodW1iX2RpbS0+Y3JvcC5sZWZ0ID0gcF9tYWluX2RpbS0+Y3JvcC5sZWZ0OworICAgICAgfQorICAgIH0KKworICAgIHdoaWxlICgocF90aHVtYl9kaW0tPmNyb3AudG9wICsgcF90aHVtYl9kaW0tPmNyb3AuaGVpZ2h0KSA+CisgICAgICAocF9tYWluX2RpbS0+Y3JvcC50b3AgKyBwX21haW5fZGltLT5jcm9wLmhlaWdodCkpIHsKKyAgICAgIGlmIChwX3RodW1iX2RpbS0+Y3JvcC50b3AgPT0gcF9tYWluX2RpbS0+Y3JvcC50b3ApIHsKKyAgICAgICAgcF90aHVtYl9kaW0tPmNyb3AuaGVpZ2h0ID0gcF9tYWluX2RpbS0+Y3JvcC5oZWlnaHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBwX3RodW1iX2RpbS0+Y3JvcC50b3AgPSBwX21haW5fZGltLT5jcm9wLnRvcDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAoKHBfdGh1bWJfZGltLT5kc3RfZGltLndpZHRoID4gcF90aHVtYl9kaW0tPnNyY19kaW0ud2lkdGgpIHx8CisgICAgKHBfdGh1bWJfZGltLT5kc3RfZGltLmhlaWdodCA+IHBfdGh1bWJfZGltLT5zcmNfZGltLmhlaWdodCkpIHsKKyAgICBMT0dFKCJJbmNvcnJlY3QgdGh1bWJuYWlsIGRpbSAlZHglZCByZXNldHRpbmcgdG8gJWR4JWQiLCBwX3RodW1iX2RpbS0+ZHN0X2RpbS53aWR0aCwKKyAgICAgIHBfdGh1bWJfZGltLT5kc3RfZGltLmhlaWdodCwgcF90aHVtYl9kaW0tPnNyY19kaW0ud2lkdGgsCisgICAgICBwX3RodW1iX2RpbS0+c3JjX2RpbS5oZWlnaHQpOworICAgIHRodW1ibmFpbF9pbmZvLm91dHB1dF93aWR0aCA9IChPTVhfVTMyKXBfdGh1bWJfZGltLT5zcmNfZGltLndpZHRoOworICAgIHRodW1ibmFpbF9pbmZvLm91dHB1dF9oZWlnaHQgPSAoT01YX1UzMilwX3RodW1iX2RpbS0+c3JjX2RpbS5oZWlnaHQ7CisgIH0KKworICAvLyBJZiB0aGUgdGh1bWJuYWlsIGNyb3AgYXNwZWN0IHJhdGlvIGltYWdlIGFuZCB0aHVtYm5haWwgZGVzdCBhc3BlY3QKKyAgLy8gcmF0aW8gYXJlIGRpZmZlcmVudCwgcmVzZXQgdGhlIHRodW1ibmFpbCBjcm9wCisgIGRvdWJsZSB0aHVtYmNyb3BfYXNwZWN0X3JhdGlvID0gKGRvdWJsZSlwX3RodW1iX2RpbS0+Y3JvcC53aWR0aCAvCisgICAgKGRvdWJsZSlwX3RodW1iX2RpbS0+Y3JvcC5oZWlnaHQ7CisgIGRvdWJsZSB0aHVtYmRzdF9hc3BlY3RfcmF0aW8gPSAoZG91YmxlKXBfdGh1bWJfZGltLT5kc3RfZGltLndpZHRoIC8KKyAgICAoZG91YmxlKXBfdGh1bWJfZGltLT5kc3RfZGltLmhlaWdodDsKKyAgaWYgKCh0aHVtYmRzdF9hc3BlY3RfcmF0aW8gLSB0aHVtYmNyb3BfYXNwZWN0X3JhdGlvKSA+CisgICAgQVNQRUNUX1RPTEVSQU5DRSkgeworICAgIG1tX2pwZWdfdXBkYXRlX3RodW1ibmFpbF9jcm9wKHBfdGh1bWJfZGltLCAwKTsKKyAgfSBlbHNlIGlmICgodGh1bWJjcm9wX2FzcGVjdF9yYXRpbyAtIHRodW1iZHN0X2FzcGVjdF9yYXRpbykgPgorICAgIEFTUEVDVF9UT0xFUkFOQ0UpIHsKKyAgICBtbV9qcGVnX3VwZGF0ZV90aHVtYm5haWxfY3JvcChwX3RodW1iX2RpbSwgMSk7CisgIH0KKworICAvLyBGaWxsIHRodW1ibmFpbCBjcm9wIGluZm8KKyAgdGh1bWJuYWlsX2luZm8uY3JvcF9pbmZvLm5XaWR0aCA9IChPTVhfVTMyKXBfdGh1bWJfZGltLT5jcm9wLndpZHRoOworICB0aHVtYm5haWxfaW5mby5jcm9wX2luZm8ubkhlaWdodCA9IChPTVhfVTMyKXBfdGh1bWJfZGltLT5jcm9wLmhlaWdodDsKKyAgdGh1bWJuYWlsX2luZm8uY3JvcF9pbmZvLm5MZWZ0ID0gcF90aHVtYl9kaW0tPmNyb3AubGVmdDsKKyAgdGh1bWJuYWlsX2luZm8uY3JvcF9pbmZvLm5Ub3AgPSBwX3RodW1iX2RpbS0+Y3JvcC50b3A7CisKKyAgbWVtc2V0KHBfZnJhbWVfaW5mbywgMHgwLCBzaXplb2YoKnBfZnJhbWVfaW5mbykpOworCisgIHBfZnJhbWVfaW5mby0+Y2JjclN0YXJ0T2Zmc2V0WzBdID0gcF90bWJfYnVmLT5vZmZzZXQubXBbMF0ubGVuOworICBwX2ZyYW1lX2luZm8tPmNiY3JTdGFydE9mZnNldFsxXSA9IHBfdG1iX2J1Zi0+b2Zmc2V0Lm1wWzFdLmxlbjsKKyAgcF9mcmFtZV9pbmZvLT55T2Zmc2V0ID0gcF90bWJfYnVmLT5vZmZzZXQubXBbMF0ub2Zmc2V0OworICBwX2ZyYW1lX2luZm8tPmNiY3JPZmZzZXRbMF0gPSBwX3RtYl9idWYtPm9mZnNldC5tcFsxXS5vZmZzZXQ7CisgIHBfZnJhbWVfaW5mby0+Y2Jjck9mZnNldFsxXSA9IHBfdG1iX2J1Zi0+b2Zmc2V0Lm1wWzJdLm9mZnNldDsKKworICBpZiAocF9zZXNzaW9uLT5saWIyZF9yb3RhdGlvbl9mbGFnICYmIHBfc2Vzc2lvbi0+dGh1bWJfZnJvbV9tYWluKSB7CisgICAgcF9mcmFtZV9pbmZvLT55T2Zmc2V0ID0gMDsKKyAgICBwX2ZyYW1lX2luZm8tPmNiY3JPZmZzZXRbMF0gPSAwOworICAgIHBfZnJhbWVfaW5mby0+Y2Jjck9mZnNldFsxXSA9IDA7CisgIH0KKworICByZXQgPSBPTVhfU2V0Q29uZmlnKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgdGh1bWJfaW5kZXh0eXBlLAorICAgICZ0aHVtYm5haWxfaW5mbyk7CisgIGlmIChyZXQpIHsKKyAgICBMT0dFKCJFcnJvciIpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisvKiogbW1fanBlZ19zZXNzaW9uX2NvbmZpZ19tYWluX2Nyb3A6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBwX3Nlc3Npb246IGpvYiBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIE9NWCBlcnJvciB2YWx1ZXMKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDb25maWd1cmUgbWFpbiBpbWFnZSBjcm9wCisgKgorICoqLworT01YX0VSUk9SVFlQRSBtbV9qcGVnX3Nlc3Npb25fY29uZmlnX21haW5fY3JvcChtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKnBfc2Vzc2lvbikKK3sKKyAgT01YX0NPTkZJR19SRUNUVFlQRSByZWN0X3R5cGVfaW4sIHJlY3RfdHlwZV9vdXQ7CisgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgbW1fanBlZ19lbmNvZGVfam9iX3QgKnBfam9icGFyYW1zID0gJnBfc2Vzc2lvbi0+ZW5jb2RlX2pvYjsKKyAgbW1fanBlZ19kaW1fdCAqZGltID0gJnBfam9icGFyYW1zLT5tYWluX2RpbTsKKworICBpZiAoKGRpbS0+Y3JvcC53aWR0aCA9PSAwKSB8fCAoZGltLT5jcm9wLmhlaWdodCA9PSAwKSkgeworICAgIGRpbS0+Y3JvcC53aWR0aCA9IGRpbS0+c3JjX2RpbS53aWR0aDsKKyAgICBkaW0tPmNyb3AuaGVpZ2h0ID0gZGltLT5zcmNfZGltLmhlaWdodDsKKyAgfQorICAvKiBlcnJvciBjaGVjayBmaXJzdCAqLworICBpZiAoKGRpbS0+Y3JvcC53aWR0aCArIGRpbS0+Y3JvcC5sZWZ0ID4gZGltLT5zcmNfZGltLndpZHRoKSB8fAorICAgIChkaW0tPmNyb3AuaGVpZ2h0ICsgZGltLT5jcm9wLnRvcCA+IGRpbS0+c3JjX2RpbS5oZWlnaHQpKSB7CisgICAgTE9HRSgiaW52YWxpZCBjcm9wIGJvdW5kYXJ5ICglZCwgJWQpIG91dCBvZiAoJWQsICVkKSIsCisgICAgICBkaW0tPmNyb3Aud2lkdGggKyBkaW0tPmNyb3AubGVmdCwKKyAgICAgIGRpbS0+Y3JvcC5oZWlnaHQgKyBkaW0tPmNyb3AudG9wLAorICAgICAgZGltLT5zcmNfZGltLndpZHRoLAorICAgICAgZGltLT5zcmNfZGltLmhlaWdodCk7CisgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgfQorCisgIG1lbXNldCgmcmVjdF90eXBlX2luLCAwLCBzaXplb2YocmVjdF90eXBlX2luKSk7CisgIG1lbXNldCgmcmVjdF90eXBlX291dCwgMCwgc2l6ZW9mKHJlY3RfdHlwZV9vdXQpKTsKKyAgcmVjdF90eXBlX2luLm5Qb3J0SW5kZXggPSAwOworICByZWN0X3R5cGVfb3V0Lm5Qb3J0SW5kZXggPSAwOworCisgIGlmICgoZGltLT5zcmNfZGltLndpZHRoICE9IGRpbS0+Y3JvcC53aWR0aCkgfHwKKyAgICAoZGltLT5zcmNfZGltLmhlaWdodCAhPSBkaW0tPmNyb3AuaGVpZ2h0KSB8fAorICAgIChkaW0tPnNyY19kaW0ud2lkdGggIT0gZGltLT5kc3RfZGltLndpZHRoKSB8fAorICAgIChkaW0tPnNyY19kaW0uaGVpZ2h0ICE9IGRpbS0+ZHN0X2RpbS5oZWlnaHQpKSB7CisgICAgLyogU2NhbGVyIGluZm9ybWF0aW9uICovCisgICAgcmVjdF90eXBlX2luLm5XaWR0aCA9IENFSUxJTkcyKGRpbS0+Y3JvcC53aWR0aCk7CisgICAgcmVjdF90eXBlX2luLm5IZWlnaHQgPSBDRUlMSU5HMihkaW0tPmNyb3AuaGVpZ2h0KTsKKyAgICByZWN0X3R5cGVfaW4ubkxlZnQgPSBkaW0tPmNyb3AubGVmdDsKKyAgICByZWN0X3R5cGVfaW4ublRvcCA9IGRpbS0+Y3JvcC50b3A7CisKKyAgICBpZiAoZGltLT5kc3RfZGltLndpZHRoICYmIGRpbS0+ZHN0X2RpbS5oZWlnaHQpIHsKKyAgICAgIHJlY3RfdHlwZV9vdXQubldpZHRoID0gKE9NWF9VMzIpZGltLT5kc3RfZGltLndpZHRoOworICAgICAgcmVjdF90eXBlX291dC5uSGVpZ2h0ID0gKE9NWF9VMzIpZGltLT5kc3RfZGltLmhlaWdodDsKKyAgICB9CisgIH0KKworICByZXQgPSBPTVhfU2V0Q29uZmlnKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgT01YX0luZGV4Q29uZmlnQ29tbW9uSW5wdXRDcm9wLAorICAgICZyZWN0X3R5cGVfaW4pOworICBpZiAoT01YX0Vycm9yTm9uZSAhPSByZXQpIHsKKyAgICBMT0dFKCJFcnJvciIpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICBMT0dIKCJPTVhfSW5kZXhDb25maWdDb21tb25JbnB1dENyb3AgdyA9ICVkLCBoID0gJWQsIGwgPSAlZCwgdCA9ICVkLCIKKyAgICAiIHBvcnRfaWR4ID0gJWQiLAorICAgIChpbnQpcmVjdF90eXBlX2luLm5XaWR0aCwgKGludClyZWN0X3R5cGVfaW4ubkhlaWdodCwKKyAgICAoaW50KXJlY3RfdHlwZV9pbi5uTGVmdCwgKGludClyZWN0X3R5cGVfaW4ublRvcCwKKyAgICAoaW50KXJlY3RfdHlwZV9pbi5uUG9ydEluZGV4KTsKKworICByZXQgPSBPTVhfU2V0Q29uZmlnKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwKKyAgICAmcmVjdF90eXBlX291dCk7CisgIGlmIChPTVhfRXJyb3JOb25lICE9IHJldCkgeworICAgIExPR0UoIkVycm9yIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICBMT0dEKCJPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wIHcgPSAlZCwgaCA9ICVkLCIKKyAgICAiIHBvcnRfaWR4ID0gJWQiLAorICAgIChpbnQpcmVjdF90eXBlX291dC5uV2lkdGgsIChpbnQpcmVjdF90eXBlX291dC5uSGVpZ2h0LAorICAgIChpbnQpcmVjdF90eXBlX291dC5uUG9ydEluZGV4KTsKKworICByZXR1cm4gcmV0OworfQorCisvKiogbW1fanBlZ19zZXNzaW9uX2NvbmZpZ19tYWluOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAcF9zZXNzaW9uOiBqb2Igc2Vzc2lvbgorICoKKyAqICBSZXR1cm46CisgKiAgICAgICBPTVggZXJyb3IgdmFsdWVzCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgQ29uZmlndXJlIG1haW4gaW1hZ2UKKyAqCisgKiovCitPTVhfRVJST1JUWVBFIG1tX2pwZWdfc2Vzc2lvbl9jb25maWdfbWFpbihtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKnBfc2Vzc2lvbikKK3sKKyAgT01YX0VSUk9SVFlQRSByYyA9IE9NWF9FcnJvck5vbmU7CisKKyAgLyogY29uZmlnIHBvcnQgKi8KKyAgTE9HRCgiY29uZmlnIHBvcnQiKTsKKyAgcmMgPSBtbV9qcGVnX3Nlc3Npb25fY29uZmlnX3BvcnRzKHBfc2Vzc2lvbik7CisgIGlmIChPTVhfRXJyb3JOb25lICE9IHJjKSB7CisgICAgTE9HRSgiY29uZmlnIHBvcnQgZmFpbGVkIik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgLyogY29uZmlnIGJ1ZmZlciBvZmZzZXQgKi8KKyAgTE9HRCgiY29uZmlnIG1haW4gYnVmIG9mZnNldCIpOworICByYyA9IG1tX2pwZWdfc2Vzc2lvbl9jb25maWdfbWFpbl9idWZmZXJfb2Zmc2V0KHBfc2Vzc2lvbik7CisgIGlmIChPTVhfRXJyb3JOb25lICE9IHJjKSB7CisgICAgTE9HRSgiY29uZmlnIGJ1ZmZlciBvZmZzZXQgZmFpbGVkIik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgLyogc2V0IHRoZSBlbmNvZGluZyBtb2RlICovCisgIHJjID0gbW1fanBlZ19lbmNvZGluZ19tb2RlKHBfc2Vzc2lvbik7CisgIGlmIChPTVhfRXJyb3JOb25lICE9IHJjKSB7CisgICAgTE9HRSgiY29uZmlnIGVuY29kaW5nIG1vZGUgZmFpbGVkIik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgLyogc2V0IHRoZSBtZXRhZGF0YSBlbmNyeXB0IGtleSAqLworICByYyA9IG1tX2pwZWdfbWV0YV9lbmNfa2V5KHBfc2Vzc2lvbik7CisgIGlmIChPTVhfRXJyb3JOb25lICE9IHJjKSB7CisgICAgTE9HRSgiY29uZmlnIHNlc3Npb24gZmFpbGVkIik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgLyogc2V0IHRoZSBtZW0gb3BzICovCisgIHJjID0gbW1fanBlZ19tZW1fb3BzKHBfc2Vzc2lvbik7CisgIGlmIChPTVhfRXJyb3JOb25lICE9IHJjKSB7CisgICAgTE9HRSgiY29uZmlnIG1lbSBvcHMgZmFpbGVkIik7CisgICAgcmV0dXJuIHJjOworICB9CisgIC8qIHNldCB0aGUganBlZyBzcGVlZCBtb2RlICovCisgIHJjID0gbW1fanBlZ19zcGVlZF9tb2RlKHBfc2Vzc2lvbik7CisgIGlmIChPTVhfRXJyb3JOb25lICE9IHJjKSB7CisgICAgTE9HRSgiY29uZmlnIHNwZWVkIG1vZGUgZmFpbGVkIik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ19zZXNzaW9uX2NvbmZpZ19jb21tb246CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBwX3Nlc3Npb246IGpvYiBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIE9NWCBlcnJvciB2YWx1ZXMKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDb25maWd1cmUgY29tbW9uIHBhcmFtZXRlcnMKKyAqCisgKiovCitPTVhfRVJST1JUWVBFIG1tX2pwZWdfc2Vzc2lvbl9jb25maWdfY29tbW9uKG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uKQoreworICBPTVhfRVJST1JUWVBFIHJjID0gT01YX0Vycm9yTm9uZTsKKyAgT01YX0lOREVYVFlQRSBleGlmX2lkeDsKKyAgT01YX0NPTkZJR19ST1RBVElPTlRZUEUgcm90YXRlOworICBtbV9qcGVnX2VuY29kZV9qb2JfdCAqcF9qb2JwYXJhbXMgPSAmcF9zZXNzaW9uLT5lbmNvZGVfam9iOworICBRT01YX0VYSUZfSU5GTyBleGlmX2luZm87CisKKyAgLyogc2V0IHJvdGF0aW9uICovCisgIG1lbXNldCgmcm90YXRlLCAwLCBzaXplb2Yocm90YXRlKSk7CisgIHJvdGF0ZS5uUG9ydEluZGV4ID0gMTsKKworICBpZiAocF9zZXNzaW9uLT5saWIyZF9yb3RhdGlvbl9mbGFnKSB7CisgICAgcm90YXRlLm5Sb3RhdGlvbiA9IDA7CisgIH0gZWxzZSB7CisgICAgcm90YXRlLm5Sb3RhdGlvbiA9IChPTVhfUzMyKXBfam9icGFyYW1zLT5yb3RhdGlvbjsKKyAgfQorCisgIHJjID0gT01YX1NldENvbmZpZyhwX3Nlc3Npb24tPm9teF9oYW5kbGUsIE9NWF9JbmRleENvbmZpZ0NvbW1vblJvdGF0ZSwKKyAgICAmcm90YXRlKTsKKyAgaWYgKE9NWF9FcnJvck5vbmUgIT0gcmMpIHsKKyAgICAgIExPR0UoIkVycm9yICVkIiwgcmMpOworICAgICAgcmV0dXJuIHJjOworICB9CisgIExPR0QoIlNldCByb3RhdGlvbiB0byAlZCBhdCBwb3J0X2lkeCA9ICVkIiwKKyAgICAoaW50KXBfam9icGFyYW1zLT5yb3RhdGlvbiwgKGludClyb3RhdGUublBvcnRJbmRleCk7CisKKyAgLyogU2V0IEV4aWYgZGF0YSovCisgIG1lbXNldCgmcF9zZXNzaW9uLT5leGlmX2luZm9fbG9jYWxbMF0sIDAsIHNpemVvZihwX3Nlc3Npb24tPmV4aWZfaW5mb19sb2NhbCkpOworICByYyA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChwX3Nlc3Npb24tPm9teF9oYW5kbGUsIFFPTVhfSU1BR0VfRVhUX0VYSUZfTkFNRSwKKyAgICAmZXhpZl9pZHgpOworICBpZiAoT01YX0Vycm9yTm9uZSAhPSByYykgeworICAgIExPR0UoIkVycm9yICVkIiwgcmMpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIExPR0QoIk51bSBvZiBleGlmIGVudHJpZXMgcGFzc2VkIGZyb20gSEFMOiAlZCIsCisgICAgICAoaW50KXBfam9icGFyYW1zLT5leGlmX2luZm8ubnVtT2ZFbnRyaWVzKTsKKyAgaWYgKHBfam9icGFyYW1zLT5leGlmX2luZm8ubnVtT2ZFbnRyaWVzID4gMCkgeworICAgIHJjID0gT01YX1NldENvbmZpZyhwX3Nlc3Npb24tPm9teF9oYW5kbGUsIGV4aWZfaWR4LAorICAgICAgICAmcF9qb2JwYXJhbXMtPmV4aWZfaW5mbyk7CisgICAgaWYgKE9NWF9FcnJvck5vbmUgIT0gcmMpIHsKKyAgICAgIExPR0UoIkVycm9yICVkIiwgcmMpOworICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgfQorICAvKnBhcnNlIGFkaXRpb25hbCBleGlmIGRhdGEgZnJvbSB0aGUgbWV0YWRhdGEqLworICBleGlmX2luZm8ubnVtT2ZFbnRyaWVzID0gMDsKKyAgZXhpZl9pbmZvLmV4aWZfZGF0YSA9ICZwX3Nlc3Npb24tPmV4aWZfaW5mb19sb2NhbFswXTsKKyAgcHJvY2Vzc19tZXRhX2RhdGEocF9qb2JwYXJhbXMtPnBfbWV0YWRhdGEsICZleGlmX2luZm8sCisgICAgJnBfam9icGFyYW1zLT5jYW1fZXhpZl9wYXJhbXMsIHBfam9icGFyYW1zLT5oYWxfdmVyc2lvbik7CisgIC8qIEFmdGVyIFBhcnNlIG1ldGFkYXRhICovCisgIHBfc2Vzc2lvbi0+ZXhpZl9jb3VudF9sb2NhbCA9IChpbnQpZXhpZl9pbmZvLm51bU9mRW50cmllczsKKworICBpZiAoZXhpZl9pbmZvLm51bU9mRW50cmllcyA+IDApIHsKKyAgICAvKiBzZXQgZXhpZiB0YWdzICovCisgICAgTE9HRCgiZXhpZiB0YWdzIGZyb20gbWV0YWRhdGEgY291bnQgJWQiLAorICAgICAgKGludClleGlmX2luZm8ubnVtT2ZFbnRyaWVzKTsKKworICAgIHJjID0gT01YX1NldENvbmZpZyhwX3Nlc3Npb24tPm9teF9oYW5kbGUsIGV4aWZfaWR4LAorICAgICAgJmV4aWZfaW5mbyk7CisgICAgaWYgKE9NWF9FcnJvck5vbmUgIT0gcmMpIHsKKyAgICAgIExPR0UoIkVycm9yICVkIiwgcmMpOworICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgfQorCisgIHJldHVybiByYzsKK30KKworLyoqIG1tX2pwZWdfc2Vzc2lvbl9hYm9ydDoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHBfc2Vzc2lvbjoganBlZyBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIE9NWF9CT09MCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgQWJvcnQgb25nb2luZyBqb2IKKyAqCisgKiovCitPTVhfQk9PTCBtbV9qcGVnX3Nlc3Npb25fYWJvcnQobW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24pCit7CisgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgaW50IHJjID0gMDsKKworICBMT0dEKCJFIik7CisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKyAgaWYgKE1NX0pQRUdfQUJPUlRfTk9ORSAhPSBwX3Nlc3Npb24tPmFib3J0X3N0YXRlKSB7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgICAgTE9HSCgiKioqKiBBTFJFQURZIEFCT1JURUQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwX3Nlc3Npb24tPmFib3J0X3N0YXRlID0gTU1fSlBFR19BQk9SVF9JTklUOworICBpZiAoT01YX1RSVUUgPT0gcF9zZXNzaW9uLT5lbmNvZGluZykgeworICAgIHBfc2Vzc2lvbi0+c3RhdGVfY2hhbmdlX3BlbmRpbmcgPSBPTVhfVFJVRTsKKworICAgIExPR0goIioqKiogQUJPUlRJTkciKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKworICAgIHJldCA9IE9NWF9TZW5kQ29tbWFuZChwX3Nlc3Npb24tPm9teF9oYW5kbGUsIE9NWF9Db21tYW5kU3RhdGVTZXQsCisgICAgICBPTVhfU3RhdGVJZGxlLCBOVUxMKTsKKworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgTE9HRSgiT01YX1NlbmRDb21tYW5kIHJldHVybmVkIGVycm9yICVkIiwgcmV0KTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByYyA9IG1tX2pwZWdlbmNfZGVzdHJveV9qb2IocF9zZXNzaW9uKTsKKyAgICBpZiAocmMgIT0gMCkgeworICAgICAgTE9HRSgiRGVzdHJveSBqb2IgcmV0dXJuZWQgZXJyb3IgJWQiLCByYyk7CisgICAgfQorCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwX3Nlc3Npb24tPmxvY2spOworICAgIGlmIChNTV9KUEVHX0FCT1JUX0lOSVQgPT0gcF9zZXNzaW9uLT5hYm9ydF9zdGF0ZSkgeworICAgICAgTE9HTCgiYmVmb3JlIHdhaXQiKTsKKyAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZwX3Nlc3Npb24tPmNvbmQsICZwX3Nlc3Npb24tPmxvY2spOworICAgIH0KKyAgICBMT0dMKCJhZnRlciB3YWl0Iik7CisgIH0KKyAgcF9zZXNzaW9uLT5hYm9ydF9zdGF0ZSA9IE1NX0pQRUdfQUJPUlRfRE9ORTsKKworICBtbV9qcGVnX3B1dF9tZW0oKHZvaWQgKilwX3Nlc3Npb24pOworCisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwX3Nlc3Npb24tPmxvY2spOworCisgIC8vIEFib3J0IG5leHQgc2Vzc2lvbgorICBpZiAocF9zZXNzaW9uLT5uZXh0X3Nlc3Npb24pIHsKKyAgICBtbV9qcGVnX3Nlc3Npb25fYWJvcnQocF9zZXNzaW9uLT5uZXh0X3Nlc3Npb24pOworICB9CisKKyAgTE9HRCgiWCIpOworICByZXR1cm4gMDsKK30KKworLyoqIG1tX2pwZWdfY29uZmlnX211bHRpX2ltYWdlX2luZm8KKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHBfc2Vzc2lvbjogZW5jb2RlIHNlc3Npb24KKyAqCisgKiAgUmV0dXJuOiBPTVhfRVJST1JUWVBFCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgQ29uZmlndXJlIG11bHRpIGltYWdlIHBhcmFtZXRlcnMKKyAqCisgKiovCitzdGF0aWMgT01YX0VSUk9SVFlQRSBtbV9qcGVnX2NvbmZpZ19tdWx0aV9pbWFnZV9pbmZvKAorICBtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKnBfc2Vzc2lvbikKK3sKKyAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworICBRT01YX0pQRUdfTVVMVElfSU1BR0VfSU5GTyBtdWx0aV9pbWFnZV9pbmZvOworICBPTVhfSU5ERVhUWVBFIG11bHRpX2ltYWdlX2luZGV4OworICBtbV9qcGVnX2VuY29kZV9qb2JfdCAqcF9qb2JwYXJhbXMgPSAmcF9zZXNzaW9uLT5lbmNvZGVfam9iOworCisgIHJldCA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChwX3Nlc3Npb24tPm9teF9oYW5kbGUsCisgICAgUU9NWF9JTUFHRV9FWFRfTVVMVElfSU1BR0VfTkFNRSwgJm11bHRpX2ltYWdlX2luZGV4KTsKKyAgaWYgKHJldCkgeworICAgIExPR0UoIkVycm9yIGdldHRpbmcgbXVsdGkgaW1hZ2UgaW5mbyBleHRlbnRpb24gaW5kZXggJWQiLCByZXQpOworICAgIHJldHVybiByZXQ7CisgIH0KKyAgbWVtc2V0KCZtdWx0aV9pbWFnZV9pbmZvLCAwLCBzaXplb2YobXVsdGlfaW1hZ2VfaW5mbykpOworICBpZiAocF9qb2JwYXJhbXMtPm11bHRpX2ltYWdlX2luZm8udHlwZSA9PSBNTV9KUEVHX1RZUEVfTVBPKSB7CisgICAgbXVsdGlfaW1hZ2VfaW5mby5pbWFnZV90eXBlID0gUU9NWF9KUEVHX0lNQUdFX1RZUEVfTVBPOworICB9IGVsc2UgeworICAgIG11bHRpX2ltYWdlX2luZm8uaW1hZ2VfdHlwZSA9IFFPTVhfSlBFR19JTUFHRV9UWVBFX0pQRUc7CisgIH0KKyAgbXVsdGlfaW1hZ2VfaW5mby5pc19wcmltYXJ5X2ltYWdlID0gcF9qb2JwYXJhbXMtPm11bHRpX2ltYWdlX2luZm8uaXNfcHJpbWFyeTsKKyAgbXVsdGlfaW1hZ2VfaW5mby5udW1fb2ZfaW1hZ2VzID0gcF9qb2JwYXJhbXMtPm11bHRpX2ltYWdlX2luZm8ubnVtX29mX2ltYWdlczsKKyAgbXVsdGlfaW1hZ2VfaW5mby5lbmFibGVfbWV0YWRhdGEgPSBwX2pvYnBhcmFtcy0+bXVsdGlfaW1hZ2VfaW5mby5lbmFibGVfbWV0YWRhdGE7CisKKyAgcmV0ID0gT01YX1NldENvbmZpZyhwX3Nlc3Npb24tPm9teF9oYW5kbGUsIG11bHRpX2ltYWdlX2luZGV4LAorICAgICZtdWx0aV9pbWFnZV9pbmZvKTsKKyAgaWYgKHJldCkgeworICAgIExPR0UoIkVycm9yIHNldHRpbmcgbXVsdGkgaW1hZ2UgY29uZmlnIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gcmV0OworfQorCisvKiogbW1fanBlZ19jb25maWd1cmVfcGFyYW1zCisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBwX3Nlc3Npb246IGVuY29kZSBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIG5vbmUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDb25maWd1cmUgdGhlIGpvYiBzcGVjaWZpYyBwYXJhbXMKKyAqCisgKiovCitzdGF0aWMgT01YX0VSUk9SVFlQRSBtbV9qcGVnX2NvbmZpZ3VyZV9qb2JfcGFyYW1zKAorICBtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKnBfc2Vzc2lvbikKK3sKKyAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworICBPTVhfSU1BR0VfUEFSQU1fUUZBQ1RPUlRZUEUgcV9mYWN0b3I7CisgIFFPTVhfV09SS19CVUZGRVIgd29ya19idWZmZXI7CisgIE9NWF9JTkRFWFRZUEUgd29ya19idWZmZXJfaW5kZXg7CisgIG1tX2pwZWdfZW5jb2RlX3BhcmFtc190ICpwX3BhcmFtcyA9ICZwX3Nlc3Npb24tPnBhcmFtczsKKyAgbW1fanBlZ19lbmNvZGVfam9iX3QgKnBfam9icGFyYW1zID0gJnBfc2Vzc2lvbi0+ZW5jb2RlX2pvYjsKKyAgaW50IGk7CisKKyAgLyogY29tbW9uIGNvbmZpZyAqLworICByZXQgPSBtbV9qcGVnX3Nlc3Npb25fY29uZmlnX2NvbW1vbihwX3Nlc3Npb24pOworICBpZiAoT01YX0Vycm9yTm9uZSAhPSByZXQpIHsKKyAgICBMT0dFKCJjb25maWcgY29tbW9uIGZhaWxlZCIpOworICB9CisKKyAgLyogY29uZmlnIE1haW4gSW1hZ2UgY3JvcCAqLworICBMT0dEKCJjb25maWcgbWFpbiBjcm9wIik7CisgIHJldCA9IG1tX2pwZWdfc2Vzc2lvbl9jb25maWdfbWFpbl9jcm9wKHBfc2Vzc2lvbik7CisgIGlmIChPTVhfRXJyb3JOb25lICE9IHJldCkgeworICAgIExPR0UoImNvbmZpZyBjcm9wIGZhaWxlZCIpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICAvKiBzZXQgcXVhbGl0eSAqLworICBtZW1zZXQoJnFfZmFjdG9yLCAwLCBzaXplb2YocV9mYWN0b3IpKTsKKyAgcV9mYWN0b3IublBvcnRJbmRleCA9IDA7CisgIHFfZmFjdG9yLm5RRmFjdG9yID0gcF9wYXJhbXMtPnF1YWxpdHk7CisgIHJldCA9IE9NWF9TZXRDb25maWcocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCBPTVhfSW5kZXhQYXJhbVFGYWN0b3IsICZxX2ZhY3Rvcik7CisgIExPR0QoImNvbmZpZyBRRmFjdG9yOiAlZCIsIChpbnQpcV9mYWN0b3IublFGYWN0b3IpOworICBpZiAoT01YX0Vycm9yTm9uZSAhPSByZXQpIHsKKyAgICBMT0dFKCJFcnJvciBzZXR0aW5nIFEgZmFjdG9yICVkIiwgcmV0KTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgLyogY29uZmlnIHRodW1ibmFpbCAqLworICByZXQgPSBtbV9qcGVnX3Nlc3Npb25fY29uZmlnX3RodW1ibmFpbChwX3Nlc3Npb24pOworICBpZiAoT01YX0Vycm9yTm9uZSAhPSByZXQpIHsKKyAgICBMT0dFKCJjb25maWcgdGh1bWJuYWlsIGltZyBmYWlsZWQiKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgLy9QYXNzIHRoZSBJT04gYnVmZmVyIHRvIGJlIHVzZWQgYXMgby9wIGZvciBIVworICBtZW1zZXQoJndvcmtfYnVmZmVyLCAweDAsIHNpemVvZihRT01YX1dPUktfQlVGRkVSKSk7CisgIHJldCA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChwX3Nlc3Npb24tPm9teF9oYW5kbGUsCisgICAgUU9NWF9JTUFHRV9FWFRfV09SS19CVUZGRVJfTkFNRSwKKyAgICAmd29ya19idWZmZXJfaW5kZXgpOworICBpZiAocmV0KSB7CisgICAgTE9HRSgiRXJyb3IgZ2V0dGluZyB3b3JrIGJ1ZmZlciBpbmRleCAlZCIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICB3b3JrX2J1ZmZlci5mZCA9IHBfc2Vzc2lvbi0+d29ya19idWZmZXIucF9wbWVtX2ZkOworICB3b3JrX2J1ZmZlci52YWRkciA9IHBfc2Vzc2lvbi0+d29ya19idWZmZXIuYWRkcjsKKyAgd29ya19idWZmZXIubGVuZ3RoID0gKHVpbnQzMl90KXBfc2Vzc2lvbi0+d29ya19idWZmZXIuc2l6ZTsKKyAgTE9HSCgiV29yayBidWZmZXIgaW5mbyAlZCAlcCBXb3JrQnVmU2l6ZTogJWQgaW52YWxpZGF0ZSIsCisgICAgICB3b3JrX2J1ZmZlci5mZCwgd29ya19idWZmZXIudmFkZHIsIHdvcmtfYnVmZmVyLmxlbmd0aCk7CisKKyAgYnVmZmVyX2ludmFsaWRhdGUoJnBfc2Vzc2lvbi0+d29ya19idWZmZXIpOworCisgIHJldCA9IE9NWF9TZXRDb25maWcocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCB3b3JrX2J1ZmZlcl9pbmRleCwKKyAgICAmd29ya19idWZmZXIpOworICBpZiAocmV0KSB7CisgICAgTE9HRSgiRXJyb3IiKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgLyogc2V0IG1ldGFkYXRhICovCisgIHJldCA9IG1tX2pwZWdfbWV0YWRhdGEocF9zZXNzaW9uKTsKKyAgaWYgKE9NWF9FcnJvck5vbmUgIT0gcmV0KSB7CisgICAgTE9HRSgiY29uZmlnIG1ha2Vybm90ZSBkYXRhIGZhaWxlZCIpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICAvKiBzZXQgUVRhYmxlICovCisgIGZvciAoaSA9IDA7IGkgPCBRVEFCTEVfTUFYOyBpKyspIHsKKyAgICBpZiAocF9qb2JwYXJhbXMtPnF0YWJsZV9zZXRbaV0pIHsKKyAgICAgIHJldCA9IE9NWF9TZXRDb25maWcocF9zZXNzaW9uLT5vbXhfaGFuZGxlLAorICAgICAgICBPTVhfSW5kZXhQYXJhbVF1YW50aXphdGlvblRhYmxlLCAmcF9qb2JwYXJhbXMtPnF0YWJsZVtpXSk7CisgICAgICBpZiAoT01YX0Vycm9yTm9uZSAhPSByZXQpIHsKKyAgICAgICAgTE9HRSgic2V0IFFUYWJsZSBFcnJvciIpOworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIFNldCBtdWx0aSBpbWFnZSBkYXRhKi8KKyAgcmV0ID0gbW1fanBlZ19jb25maWdfbXVsdGlfaW1hZ2VfaW5mbyhwX3Nlc3Npb24pOworICBpZiAoT01YX0Vycm9yTm9uZSAhPSByZXQpIHsKKyAgICBMT0dFKCJjb25maWcgbXVsdGkgaW1hZ2UgZGF0YSBmYWlsZWQiKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgcmV0dXJuIHJldDsKK30KKworLyoqIG1tX2pwZWdfc2Vzc2lvbl9jb25maWd1cmU6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBkYXRhOiBlbmNvZGUgc2Vzc2lvbgorICoKKyAqICBSZXR1cm46CisgKiAgICAgICBub25lCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgQ29uZmlndXJlIHRoZSBzZXNzaW9uCisgKgorICoqLworc3RhdGljIE9NWF9FUlJPUlRZUEUgbW1fanBlZ19zZXNzaW9uX2NvbmZpZ3VyZShtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKnBfc2Vzc2lvbikKK3sKKyAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworCisgIExPR0QoIkUgIik7CisKKyAgTU1fSlBFR19DSEtfQUJPUlQocF9zZXNzaW9uLCByZXQsIGVycm9yKTsKKworICAvKiBjb25maWcgbWFpbiBpbWcgKi8KKyAgcmV0ID0gbW1fanBlZ19zZXNzaW9uX2NvbmZpZ19tYWluKHBfc2Vzc2lvbik7CisgIGlmIChPTVhfRXJyb3JOb25lICE9IHJldCkgeworICAgIExPR0UoImNvbmZpZyBtYWluIGltZyBmYWlsZWQiKTsKKyAgICBnb3RvIGVycm9yOworICB9CisgIHJldCA9IG1tX2pwZWdfc2Vzc2lvbl9jaGFuZ2Vfc3RhdGUocF9zZXNzaW9uLCBPTVhfU3RhdGVJZGxlLAorICAgIG1tX2pwZWdfc2Vzc2lvbl9zZW5kX2J1ZmZlcnMpOworICBpZiAocmV0KSB7CisgICAgTE9HRSgiY2hhbmdlIHN0YXRlIHRvIGlkbGUgZmFpbGVkICVkIiwgcmV0KTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgcmV0ID0gbW1fanBlZ19zZXNzaW9uX2NoYW5nZV9zdGF0ZShwX3Nlc3Npb24sIE9NWF9TdGF0ZUV4ZWN1dGluZywKKyAgICBOVUxMKTsKKyAgaWYgKHJldCkgeworICAgIExPR0UoImNoYW5nZSBzdGF0ZSB0byBleGVjdXRpbmcgZmFpbGVkICVkIiwgcmV0KTsKKyAgICBnb3RvIGVycm9yOworICB9CisKK2Vycm9yOgorICBMT0dEKCJYIHJldCAlZCIsIHJldCk7CisgIHJldHVybiByZXQ7Cit9CisKKworCisKKworCisvKiogbW1fanBlZ19zZXNzaW9uX2VuY29kZToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHBfc2Vzc2lvbjogZW5jb2RlIHNlc3Npb24KKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgT01YX0VSUk9SVFlQRQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIFN0YXJ0IHRoZSBlbmNvZGluZworICoKKyAqKi8KK3N0YXRpYyBPTVhfRVJST1JUWVBFIG1tX2pwZWdfc2Vzc2lvbl9lbmNvZGUobW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24pCit7CisgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgbW1fanBlZ19lbmNvZGVfam9iX3QgKnBfam9icGFyYW1zID0gJnBfc2Vzc2lvbi0+ZW5jb2RlX2pvYjsKKyAgbW1fanBlZ19vYmogKm15X29iaiA9IChtbV9qcGVnX29iaiAqKSBwX3Nlc3Npb24tPmpwZWdfb2JqOworICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9pbl9idWYgPSBOVUxMOworICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcF9pbl90aHVtYl9idWYgPSBOVUxMOworCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKyAgcF9zZXNzaW9uLT5hYm9ydF9zdGF0ZSA9IE1NX0pQRUdfQUJPUlRfTk9ORTsKKyAgcF9zZXNzaW9uLT5lbmNvZGluZyA9IE9NWF9GQUxTRTsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisKKyAgaWYgKHBfc2Vzc2lvbi0+dGh1bWJfZnJvbV9tYWluKSB7CisgICAgaWYgKDAgPiBwX2pvYnBhcmFtcy0+c3JjX2luZGV4KSB7CisgICAgICBMT0dFKCJFcnJvciIpOworICAgICAgcmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIHBfam9icGFyYW1zLT50aHVtYl9pbmRleCA9ICh1aW50MzJfdClwX2pvYnBhcmFtcy0+c3JjX2luZGV4OworICAgIHBfam9icGFyYW1zLT50aHVtYl9kaW0uY3JvcCA9IHBfam9icGFyYW1zLT5tYWluX2RpbS5jcm9wOworICB9CisKKyAgaWYgKE9NWF9GQUxTRSA9PSBwX3Nlc3Npb24tPmNvbmZpZykgeworICAgIC8qIElmIGFub3RoZXIgc2Vzc2lvbiBpbiBwcm9ncmVzcyBjbGVhciB0aGF0IHNlc3Npb25zIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBpZiAobXlfb2JqLT5wX3Nlc3Npb25faW5wcm9ncmVzcyAhPSBOVUxMKSB7CisgICAgICBPTVhfU1RBVEVUWVBFIHN0YXRlOworICAgICAgbW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb25faW5wcm9ncmVzcyA9IG15X29iai0+cF9zZXNzaW9uX2lucHJvZ3Jlc3M7CisKKyAgICAgIE9NWF9HZXRTdGF0ZShwX3Nlc3Npb25faW5wcm9ncmVzcy0+b214X2hhbmRsZSwgJnN0YXRlKTsKKworICAgICAgLy9DaGVjayBzdGF0ZSBiZWZvcmUgc3RhdGUgdHJhbnNpdGlvbgorICAgICAgaWYgKChzdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpIHx8IChzdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkpIHsKKyAgICAgICAgcmV0ID0gbW1fanBlZ19zZXNzaW9uX2NoYW5nZV9zdGF0ZShwX3Nlc3Npb25faW5wcm9ncmVzcywKKyAgICAgICAgICBPTVhfU3RhdGVJZGxlLCBOVUxMKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgIExPR0UoIkVycm9yIik7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBPTVhfR2V0U3RhdGUocF9zZXNzaW9uX2lucHJvZ3Jlc3MtPm9teF9oYW5kbGUsICZzdGF0ZSk7CisKKyAgICAgIGlmIChzdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSB7CisgICAgICAgIHJldCA9IG1tX2pwZWdfc2Vzc2lvbl9jaGFuZ2Vfc3RhdGUocF9zZXNzaW9uX2lucHJvZ3Jlc3MsCisgICAgICAgICAgT01YX1N0YXRlTG9hZGVkLCBtbV9qcGVnX3Nlc3Npb25fZnJlZV9idWZmZXJzKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgIExPR0UoIkVycm9yIik7CisgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcF9zZXNzaW9uX2lucHJvZ3Jlc3MtPmNvbmZpZyA9IE9NWF9GQUxTRTsKKyAgICAgIG15X29iai0+cF9zZXNzaW9uX2lucHJvZ3Jlc3MgPSBOVUxMOworICAgIH0KKworICAgIHJldCA9IG1tX2pwZWdfc2Vzc2lvbl9jb25maWd1cmUocF9zZXNzaW9uKTsKKyAgICBpZiAocmV0KSB7CisgICAgICBMT0dFKCJFcnJvciIpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgcF9zZXNzaW9uLT5jb25maWcgPSBPTVhfVFJVRTsKKyAgICBteV9vYmotPnBfc2Vzc2lvbl9pbnByb2dyZXNzID0gcF9zZXNzaW9uOworICB9CisKKyAgcmV0ID0gbW1fanBlZ19jb25maWd1cmVfam9iX3BhcmFtcyhwX3Nlc3Npb24pOworICBpZiAocmV0KSB7CisgICAgICBMT0dFKCJFcnJvciIpOworICAgICAgZ290byBlcnJvcjsKKyAgfQorICBwdGhyZWFkX211dGV4X2xvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgIHBfc2Vzc2lvbi0+ZW5jb2RpbmcgPSBPTVhfVFJVRTsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisKKyAgTU1fSlBFR19DSEtfQUJPUlQocF9zZXNzaW9uLCByZXQsIGVycm9yKTsKKworICBpZiAocF9zZXNzaW9uLT5saWIyZF9yb3RhdGlvbl9mbGFnKSB7CisgICAgcF9pbl9idWYgPSBwX3Nlc3Npb24tPnBfaW5fcm90X29teF9idWZbcF9qb2JwYXJhbXMtPnNyY19pbmRleF07CisgIH0gZWxzZSB7CisgICAgcF9pbl9idWYgPSBwX3Nlc3Npb24tPnBfaW5fb214X2J1ZltwX2pvYnBhcmFtcy0+c3JjX2luZGV4XTsKKyAgfQorCisjaWZkZWYgTU1fSlBFR19EVU1QX0lOUFVUCisgIGNoYXIgZmlsZW5hbWVbMjU2XTsKKyAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksCisgICAgUUNBTUVSQV9EVU1QX0ZSTV9MT0NBVElPTiJqcGVnL21tX2pwZWdfaW50JWQueXV2IiwgcF9zZXNzaW9uLT5lYmRfY291bnQpOworICBEVU1QX1RPX0ZJTEUoZmlsZW5hbWUsIHBfaW5fYnVmLT5wQnVmZmVyLCAoc2l6ZV90KXBfaW5fYnVmLT5uQWxsb2NMZW4pOworI2VuZGlmCisgIHJldCA9IE9NWF9FbXB0eVRoaXNCdWZmZXIocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCBwX2luX2J1Zik7CisgIGlmIChyZXQpIHsKKyAgICBMT0dFKCJFcnJvciIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBpZiAocF9zZXNzaW9uLT5wYXJhbXMuZW5jb2RlX3RodW1ibmFpbCkgeworCisgICAgaWYgKHBfc2Vzc2lvbi0+dGh1bWJfZnJvbV9tYWluICYmCisgICAgICBwX3Nlc3Npb24tPmxpYjJkX3JvdGF0aW9uX2ZsYWcpIHsKKyAgICAgIHBfaW5fdGh1bWJfYnVmID0gcF9zZXNzaW9uLT5wX2luX3JvdF9vbXhfdGh1bWJfYnVmW3Bfam9icGFyYW1zLT50aHVtYl9pbmRleF07CisgICAgfSBlbHNlIHsKKyAgICAgIHBfaW5fdGh1bWJfYnVmID0gcF9zZXNzaW9uLT5wX2luX29teF90aHVtYl9idWZbcF9qb2JwYXJhbXMtPnRodW1iX2luZGV4XTsKKyAgICB9CisKKyNpZmRlZiBNTV9KUEVHX0RVTVBfSU5QVVQKKyAgICBjaGFyIHRodW1iX2ZpbGVuYW1lW0ZJTEVOQU1FX01BWF07CisgICAgc25wcmludGYodGh1bWJfZmlsZW5hbWUsIHNpemVvZih0aHVtYl9maWxlbmFtZSksCisgICAgICBRQ0FNRVJBX0RVTVBfRlJNX0xPQ0FUSU9OImpwZWcvbW1fanBlZ19pbnRfdCVkLnl1diIsIHBfc2Vzc2lvbi0+ZWJkX2NvdW50KTsKKyAgICBEVU1QX1RPX0ZJTEUoZmlsZW5hbWUsIHBfaW5fdGh1bWJfYnVmLT5wQnVmZmVyLAorICAgICAgKHNpemVfdClwX2luX3RodW1iX2J1Zi0+bkFsbG9jTGVuKTsKKyNlbmRpZgorICAgIHJldCA9IE9NWF9FbXB0eVRoaXNCdWZmZXIocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCBwX2luX3RodW1iX2J1Zik7CisgICAgaWYgKHJldCkgeworICAgICAgTE9HRSgiRXJyb3IiKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICB9CisKKyAgcmV0ID0gT01YX0ZpbGxUaGlzQnVmZmVyKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwKKyAgICBwX3Nlc3Npb24tPnBfb3V0X29teF9idWZbcF9qb2JwYXJhbXMtPmRzdF9pbmRleF0pOworICBpZiAocmV0KSB7CisgICAgTE9HRSgiRXJyb3IiKTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgTU1fSlBFR19DSEtfQUJPUlQocF9zZXNzaW9uLCByZXQsIGVycm9yKTsKKworZXJyb3I6CisKKyAgTE9HRCgiWCAiKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyoqIG1tX2pwZWdfcHJvY2Vzc19lbmNvZGluZ19qb2I6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBteV9vYmo6IGpwZWcgY2xpZW50CisgKiAgICBAam9iX25vZGU6IGpvYiBub2RlCisgKgorICogIFJldHVybjoKKyAqICAgICAgIDAgZm9yIHN1Y2Nlc3MgLTEgb3RoZXJ3aXNlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgU3RhcnQgdGhlIGVuY29kaW5nIGpvYgorICoKKyAqKi8KK2ludDMyX3QgbW1fanBlZ19wcm9jZXNzX2VuY29kaW5nX2pvYihtbV9qcGVnX29iaiAqbXlfb2JqLCBtbV9qcGVnX2pvYl9xX25vZGVfdCogam9iX25vZGUpCit7CisgIG1tX2pwZWdfcV9kYXRhX3QgcWRhdGE7CisgIGludDMyX3QgcmMgPSAwOworICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uID0gTlVMTDsKKyAgdWludDMyX3QgYnVmX2lkeDsKKworICAvKiBjaGVjayBpZiB2YWxpZCBzZXNzaW9uICovCisgIHBfc2Vzc2lvbiA9IG1tX2pwZWdfZ2V0X3Nlc3Npb24obXlfb2JqLCBqb2Jfbm9kZS0+ZW5jX2luZm8uam9iX2lkKTsKKyAgaWYgKE5VTEwgPT0gcF9zZXNzaW9uKSB7CisgICAgTE9HRSgiaW52YWxpZCBqb2IgaWQgJXgiLAorICAgICAgICBqb2Jfbm9kZS0+ZW5jX2luZm8uam9iX2lkKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBMT0dEKCJiZWZvcmUgZGVxdWV1ZSBzZXNzaW9uICVkIiwgcmV0KTsKKworICAvKiBkZXF1ZXVlIGF2YWlsYWJsZSBvbXggaGFuZGxlICovCisgIHFkYXRhID0gbW1fanBlZ19xdWV1ZV9kZXEocF9zZXNzaW9uLT5zZXNzaW9uX2hhbmRsZV9xKTsKKyAgcF9zZXNzaW9uID0gcWRhdGEucDsKKworICBpZiAoTlVMTCA9PSBwX3Nlc3Npb24pIHsKKyAgICBMT0dIKCJObyBhdmFpbGFibGUgc2Vzc2lvbnMgJWQiLCByZXQpOworICAgIC8qIE5vIGF2YWlsYWJsZSBoYW5kbGVzICovCisgICAgcWRhdGEucCA9IGpvYl9ub2RlOworICAgIG1tX2pwZWdfcXVldWVfZW5xX2hlYWQoJm15X29iai0+am9iX21nci5qb2JfcXVldWUsIHFkYXRhKTsKKworICAgIExPR0goImVuZCBlbnF1ZXVlICVkIiwgcmV0KTsKKyAgICByZXR1cm4gcmM7CisKKyAgfQorCisgIHBfc2Vzc2lvbi0+YXV0b19vdXRfYnVmID0gT01YX0ZBTFNFOworICBpZiAoam9iX25vZGUtPmVuY19pbmZvLmVuY29kZV9qb2IuZHN0X2luZGV4IDwgMCkgeworICAgIC8qIGRlcXVldWUgYXZhaWxhYmxlIG91dHB1dCBidWZmZXIgaWR4ICovCisgICAgcWRhdGEgPSBtbV9qcGVnX3F1ZXVlX2RlcShwX3Nlc3Npb24tPm91dF9idWZfcSk7CisgICAgYnVmX2lkeCA9IHFkYXRhLnUzMjsKKworICAgIGlmICgwVSA9PSBidWZfaWR4KSB7CisgICAgICBMT0dFKCJObyBhdmFpbGFibGUgb3V0cHV0IGJ1ZmZlcnMgJWQiLCByZXQpOworICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisKKyAgICBidWZfaWR4LS07CisKKyAgICBqb2Jfbm9kZS0+ZW5jX2luZm8uZW5jb2RlX2pvYi5kc3RfaW5kZXggPSAoaW50MzJfdClidWZfaWR4OworICAgIHBfc2Vzc2lvbi0+YXV0b19vdXRfYnVmID0gT01YX1RSVUU7CisgIH0KKworICAvKiBzZW50IGVuY29kZSBjbWQgdG8gT01YLCBxdWV1ZSBqb2IgaW50byBvbmdvaW5nIHF1ZXVlICovCisgIHFkYXRhLnAgPSBqb2Jfbm9kZTsKKyAgcmMgPSBtbV9qcGVnX3F1ZXVlX2VucSgmbXlfb2JqLT5vbmdvaW5nX2pvYl9xLCBxZGF0YSk7CisgIGlmIChyYykgeworICAgIExPR0UoImpwZWcgZW5xdWV1ZSBmYWlsZWQgJWQiLCByZXQpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBwX3Nlc3Npb24tPmVuY29kZV9qb2IgPSBqb2Jfbm9kZS0+ZW5jX2luZm8uZW5jb2RlX2pvYjsKKyAgcF9zZXNzaW9uLT5qb2JJZCA9IGpvYl9ub2RlLT5lbmNfaW5mby5qb2JfaWQ7CisgIHJldCA9IG1tX2pwZWdfc2Vzc2lvbl9lbmNvZGUocF9zZXNzaW9uKTsKKyAgaWYgKHJldCkgeworICAgIExPR0UoImVuY29kZSBzZXNzaW9uIGZhaWxlZCIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICBMT0dIKCJTdWNjZXNzIFggIik7CisgIHJldHVybiByYzsKKworZXJyb3I6CisKKyAgaWYgKChPTVhfRXJyb3JOb25lICE9IHJldCkgJiYKKyAgICAoTlVMTCAhPSBwX3Nlc3Npb24tPnBhcmFtcy5qcGVnX2NiKSkgeworICAgIHBfc2Vzc2lvbi0+am9iX3N0YXR1cyA9IEpQRUdfSk9CX1NUQVRVU19FUlJPUjsKKyAgICBMT0dFKCJzZW5kIGpwZWcgZXJyb3IgY2FsbGJhY2sgJWQiLAorICAgICAgcF9zZXNzaW9uLT5qb2Jfc3RhdHVzKTsKKyAgICBwX3Nlc3Npb24tPnBhcmFtcy5qcGVnX2NiKHBfc2Vzc2lvbi0+am9iX3N0YXR1cywKKyAgICAgIHBfc2Vzc2lvbi0+Y2xpZW50X2hkbCwKKyAgICAgIHBfc2Vzc2lvbi0+am9iSWQsCisgICAgICBOVUxMLAorICAgICAgcF9zZXNzaW9uLT5wYXJhbXMudXNlcmRhdGEpOworICB9CisKKyAgLypyZW1vdmUgdGhlIGpvYiovCisgIG1tX2pwZWdlbmNfam9iX2RvbmUocF9zZXNzaW9uKTsKKyAgTE9HRCgiRXJyb3IgWCAiKTsKKworICByZXR1cm4gcmM7Cit9CisKKworCisvKiogbW1fanBlZ19qb2JtZ3JfdGhyZWFkOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAbXlfb2JqOiBqcGVnIG9iamVjdAorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIGZvciBzdWNjZXNzIGVsc2UgZmFpbHVyZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIGpvYiBtYW5hZ2VyIHRocmVhZCBtYWluIGZ1bmN0aW9uCisgKgorICoqLworc3RhdGljIHZvaWQgKm1tX2pwZWdfam9ibWdyX3RocmVhZCh2b2lkICpkYXRhKQoreworICBtbV9qcGVnX3FfZGF0YV90IHFkYXRhOworICBpbnQgcmMgPSAwOworICBpbnQgcnVubmluZyA9IDE7CisgIHVpbnQzMl90IG51bV9vbmdvaW5nX2pvYnMgPSAwOworICBtbV9qcGVnX29iaiAqbXlfb2JqID0gKG1tX2pwZWdfb2JqKilkYXRhOworICBtbV9qcGVnX2pvYl9jbWRfdGhyZWFkX3QgKmNtZF90aHJlYWQgPSAmbXlfb2JqLT5qb2JfbWdyOworICBtbV9qcGVnX2pvYl9xX25vZGVfdCogbm9kZSA9IE5VTEw7CisgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykibW1fanBlZ190aHJlYWQiLCAwLCAwLCAwKTsKKworICBkbyB7CisgICAgZG8geworICAgICAgcmMgPSBjYW1fc2VtX3dhaXQoJmNtZF90aHJlYWQtPmpvYl9zZW0pOworICAgICAgaWYgKHJjICE9IDAgJiYgZXJybm8gIT0gRUlOVkFMKSB7CisgICAgICAgIExPR0UoImNhbV9zZW1fd2FpdCBlcnJvciAoJXMpIiwKKyAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfSB3aGlsZSAocmMgIT0gMCk7CisKKyAgICAvKiBjaGVjayBvbmdvaW5nIHEgc2l6ZSAqLworICAgIG51bV9vbmdvaW5nX2pvYnMgPSBtbV9qcGVnX3F1ZXVlX2dldF9zaXplKCZteV9vYmotPm9uZ29pbmdfam9iX3EpOworCisgICAgTE9HRCgib25nb2luZyBqb2IgICVkICVkIiwgbnVtX29uZ29pbmdfam9icywgTU1fSlBFR19DT05DVVJSRU5UX1NFU1NJT05TX0NPVU5UKTsKKyAgICBpZiAobnVtX29uZ29pbmdfam9icyA+PSBNTV9KUEVHX0NPTkNVUlJFTlRfU0VTU0lPTlNfQ09VTlQpIHsKKyAgICAgIExPR0UoIm9uZ29pbmcgam9iIGFscmVhZHkgcmVhY2ggbWF4ICVkIiwgbnVtX29uZ29pbmdfam9icyk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+am9iX2xvY2spOworICAgIC8qIGNhbiBnbyBhaGVhZCB3aXRoIG5ldyB3b3JrICovCisgICAgcWRhdGEgPSBtbV9qcGVnX3F1ZXVlX2RlcSgmY21kX3RocmVhZC0+am9iX3F1ZXVlKTsKKyAgICBub2RlID0gKG1tX2pwZWdfam9iX3Ffbm9kZV90KilxZGF0YS5wOworICAgIGlmIChub2RlICE9IE5VTEwpIHsKKyAgICAgIHN3aXRjaCAobm9kZS0+dHlwZSkgeworICAgICAgY2FzZSBNTV9KUEVHX0NNRF9UWVBFX0pPQjoKKyAgICAgICAgcmMgPSBtbV9qcGVnX3Byb2Nlc3NfZW5jb2Rpbmdfam9iKG15X29iaiwgbm9kZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNTV9KUEVHX0NNRF9UWVBFX0RFQ09ERV9KT0I6CisgICAgICAgIHJjID0gbW1fanBlZ2RlY19wcm9jZXNzX2RlY29kaW5nX2pvYihteV9vYmosIG5vZGUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTU1fSlBFR19DTURfVFlQRV9FWElUOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgLyogZnJlZSBub2RlICovCisgICAgICAgIGZyZWUobm9kZSk7CisgICAgICAgIC8qIHNldCBydW5uaW5nIGZsYWcgdG8gZmFsc2UgKi8KKyAgICAgICAgcnVubmluZyA9IDA7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5qb2JfbG9jayk7CisKKyAgfSB3aGlsZSAocnVubmluZyk7CisgIHJldHVybiBOVUxMOworfQorCisvKiogbW1fanBlZ19qb2JtZ3JfdGhyZWFkX2xhdW5jaDoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQG15X29iajoganBlZyBvYmplY3QKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBmb3Igc3VjY2VzcyBlbHNlIGZhaWx1cmUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBsYXVuY2hlcyB0aGUgam9iIG1hbmFnZXIgdGhyZWFkCisgKgorICoqLworaW50MzJfdCBtbV9qcGVnX2pvYm1ncl90aHJlYWRfbGF1bmNoKG1tX2pwZWdfb2JqICpteV9vYmopCit7CisgIGludDMyX3QgcmMgPSAwOworICBtbV9qcGVnX2pvYl9jbWRfdGhyZWFkX3QgKmpvYl9tZ3IgPSAmbXlfb2JqLT5qb2JfbWdyOworCisgIGNhbV9zZW1faW5pdCgmam9iX21nci0+am9iX3NlbSwgMCk7CisgIG1tX2pwZWdfcXVldWVfaW5pdCgmam9iX21nci0+am9iX3F1ZXVlKTsKKworICAvKiBsYXVuY2ggdGhlIHRocmVhZCAqLworICBwdGhyZWFkX2NyZWF0ZSgmam9iX21nci0+cGlkLAorICAgIE5VTEwsCisgICAgbW1fanBlZ19qb2JtZ3JfdGhyZWFkLAorICAgICh2b2lkICopbXlfb2JqKTsKKyAgcHRocmVhZF9zZXRuYW1lX25wKGpvYl9tZ3ItPnBpZCwgIkNBTV9qcGVnX2pvYm1nciIpOworICByZXR1cm4gcmM7Cit9CisKKy8qKiBtbV9qcGVnX2pvYm1ncl90aHJlYWRfcmVsZWFzZToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQG15X29iajoganBlZyBvYmplY3QKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBmb3Igc3VjY2VzcyBlbHNlIGZhaWx1cmUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBSZWxlYXNlcyB0aGUgam9iIG1hbmFnZXIgdGhyZWFkCisgKgorICoqLworaW50MzJfdCBtbV9qcGVnX2pvYm1ncl90aHJlYWRfcmVsZWFzZShtbV9qcGVnX29iaiAqIG15X29iaikKK3sKKyAgbW1fanBlZ19xX2RhdGFfdCBxZGF0YTsKKyAgaW50MzJfdCByYyA9IDA7CisgIG1tX2pwZWdfam9iX2NtZF90aHJlYWRfdCAqIGNtZF90aHJlYWQgPSAmbXlfb2JqLT5qb2JfbWdyOworICBtbV9qcGVnX2pvYl9xX25vZGVfdCogbm9kZSA9CisgICAgKG1tX2pwZWdfam9iX3Ffbm9kZV90ICopbWFsbG9jKHNpemVvZihtbV9qcGVnX2pvYl9xX25vZGVfdCkpOworICBpZiAoTlVMTCA9PSBub2RlKSB7CisgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBtbV9qcGVnX2pvYl9xX25vZGVfdCIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIG1lbXNldChub2RlLCAwLCBzaXplb2YobW1fanBlZ19qb2JfcV9ub2RlX3QpKTsKKyAgbm9kZS0+dHlwZSA9IE1NX0pQRUdfQ01EX1RZUEVfRVhJVDsKKworICBxZGF0YS5wID0gbm9kZTsKKyAgbW1fanBlZ19xdWV1ZV9lbnEoJmNtZF90aHJlYWQtPmpvYl9xdWV1ZSwgcWRhdGEpOworICBjYW1fc2VtX3Bvc3QoJmNtZF90aHJlYWQtPmpvYl9zZW0pOworCisgIC8qIHdhaXQgdW50aWwgY21kIHRocmVhZCBleGl0cyAqLworICBpZiAocHRocmVhZF9qb2luKGNtZF90aHJlYWQtPnBpZCwgTlVMTCkgIT0gMCkgeworICAgIExPR0QoInB0aHJlYWQgZGVhZCBhbHJlYWR5Iik7CisgIH0KKyAgbW1fanBlZ19xdWV1ZV9kZWluaXQoJmNtZF90aHJlYWQtPmpvYl9xdWV1ZSk7CisKKyAgY2FtX3NlbV9kZXN0cm95KCZjbWRfdGhyZWFkLT5qb2Jfc2VtKTsKKyAgbWVtc2V0KGNtZF90aHJlYWQsIDAsIHNpemVvZihtbV9qcGVnX2pvYl9jbWRfdGhyZWFkX3QpKTsKKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ19hbGxvY193b3JrYnVmZmVyOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAbXlfb2JqOiBqcGVnIG9iamVjdAorICogICAgQHdvcmtfYnVmc19uZWVkOiBudW1iZXIgb2Ygd29yayBidWZmZXJzIHJlcXVpcmVkCisgKiAgICBAd29ya19idWZfc2l6ZTogc2l6ZSBvZiB0aGUgd29yayBidWZmZXIKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgZ3JlYXRlciBvciBlcXVhbCB0byAwIGZvciBzdWNjZXNzIGVsc2UgZmFpbHVyZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIEFsbG9jYXRlcyB3b3JrIGJ1ZmZlcgorICoKKyAqKi8KK2ludDMyX3QgbW1fanBlZ19hbGxvY193b3JrYnVmZmVyKG1tX2pwZWdfb2JqICpteV9vYmosCisgIHVpbnQzMl90IHdvcmtfYnVmc19uZWVkLAorICB1aW50MzJfdCB3b3JrX2J1Zl9zaXplKQoreworICBpbnQzMl90IHJjID0gMDsKKyAgdWludDMyX3QgaTsKKyAgTE9HSCgid29ya19idWZzX25lZWQgJWQgd29ya19idWZfY250ICVkIiwKKyAgICB3b3JrX2J1ZnNfbmVlZCwgbXlfb2JqLT53b3JrX2J1Zl9jbnQpOworICBmb3IgKGkgPSBteV9vYmotPndvcmtfYnVmX2NudDsgaSA8IHdvcmtfYnVmc19uZWVkOyBpKyspIHsKKyAgICBteV9vYmotPmlvbkJ1ZmZlcltpXS5zaXplID0gQ0VJTElORzMyKHdvcmtfYnVmX3NpemUpOworICAgIExPR0goIk1heCBwaWN0dXJlIHNpemUgJWQgeCAlZCwgV29ya0J1ZlNpemUgPSAlenUiLAorICAgICAgbXlfb2JqLT5tYXhfcGljX3csIG15X29iai0+bWF4X3BpY19oLCBteV9vYmotPmlvbkJ1ZmZlcltpXS5zaXplKTsKKyAgICBteV9vYmotPmlvbkJ1ZmZlcltpXS5hZGRyID0gKHVpbnQ4X3QgKilidWZmZXJfYWxsb2NhdGUoJm15X29iai0+aW9uQnVmZmVyW2ldLCAxKTsKKyAgICBpZiAoTlVMTCA9PSBteV9vYmotPmlvbkJ1ZmZlcltpXS5hZGRyKSB7CisgICAgICBMT0dFKCJJb24gYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgIHdoaWxlIChpLS0pIHsKKyAgICAgICAgYnVmZmVyX2RlYWxsb2NhdGUoJm15X29iai0+aW9uQnVmZmVyW2ldKTsKKyAgICAgICAgbXlfb2JqLT53b3JrX2J1Zl9jbnQtLTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgbXlfb2JqLT53b3JrX2J1Zl9jbnQrKzsKKyAgICByYyA9IGk7CisgIH0KKyBMT0dIKCJyYyAlZCAiLCByYyk7CisgIHJldHVybiByYzsKK30KKworLyoqIG1tX2pwZWdfcmVsZWFzZV93b3JrYnVmZmVyOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAbXlfb2JqOiBqcGVnIG9iamVjdAorICogICAgQHdvcmtfYnVmc19uZWVkOiBudW1iZXIgb2Ygd29yayBidWZmZXJzIGFsbG9jYXRlZAorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIGZvciBzdWNjZXNzIGVsc2UgZmFpbHVyZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIFJlbGVhc2VzIHRoZSBhbGxvY2F0ZWQgd29yayBidWZmZXIKKyAqCisgKiovCitpbnQzMl90IG1tX2pwZWdfcmVsZWFzZV93b3JrYnVmZmVyKG1tX2pwZWdfb2JqICpteV9vYmosCisgIHVpbnQzMl90IHdvcmtfYnVmc19uZWVkKQoreworICBpbnQzMl90IHJjID0gMDsKKyAgdWludDMyX3QgaTsKKyBMT0dIKCJyZWxlYXNlIHdvcmtfYnVmcyAlZCAiLCB3b3JrX2J1ZnNfbmVlZCk7CisgIGZvciAoaSA9IG15X29iai0+d29ya19idWZfY250OyBpIDwgd29ya19idWZzX25lZWQ7IGkrKykgeworICAgIGJ1ZmZlcl9kZWFsbG9jYXRlKCZteV9vYmotPmlvbkJ1ZmZlcltpXSk7CisgIH0KKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ19pbml0OgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAbXlfb2JqOiBqcGVnIG9iamVjdAorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIGZvciBzdWNjZXNzIGVsc2UgZmFpbHVyZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIEluaXRpYWxpemVzIHRoZSBqcGVnIGNsaWVudAorICoKKyAqKi8KK2ludDMyX3QgbW1fanBlZ19pbml0KG1tX2pwZWdfb2JqICpteV9vYmopCit7CisgIGludDMyX3QgcmMgPSAwOworICB1aW50MzJfdCB3b3JrX2J1Zl9zaXplOworICB1bnNpZ25lZCBpbnQgaW5pdGlhbF93b3JrYnVmc19jbnQgPSAxOworCisgIC8qIGluaXQgbG9ja3MgKi8KKyAgcHRocmVhZF9tdXRleF9pbml0KCZteV9vYmotPmpvYl9sb2NrLCBOVUxMKTsKKworICAvKiBpbml0IG9uZ29pbmcgam9iIHF1ZXVlICovCisgIHJjID0gbW1fanBlZ19xdWV1ZV9pbml0KCZteV9vYmotPm9uZ29pbmdfam9iX3EpOworICBpZiAoMCAhPSByYykgeworICAgIExPR0UoIkVycm9yIik7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZteV9vYmotPmpvYl9sb2NrKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworCisgIC8qIGluaXQgam9iIHNlbWFwaG9yZSBhbmQgbGF1bmNoIGpvYm1nciB0aHJlYWQgKi8KKyAgTE9HRCgiTGF1bmNoIGpvYm1nciB0aHJlYWQgcmMgJWQiLCByYyk7CisgIHJjID0gbW1fanBlZ19qb2JtZ3JfdGhyZWFkX2xhdW5jaChteV9vYmopOworICBpZiAoMCAhPSByYykgeworICAgIExPR0UoIkVycm9yIik7CisgICAgbW1fanBlZ19xdWV1ZV9kZWluaXQoJm15X29iai0+b25nb2luZ19qb2JfcSk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZteV9vYmotPmpvYl9sb2NrKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBzZXQgd29yayBidWYgc2l6ZSBmcm9tIG1heCBwaWN0dXJlIHNpemUgKi8KKyAgaWYgKG15X29iai0+bWF4X3BpY193IDw9IDAgfHwgbXlfb2JqLT5tYXhfcGljX2ggPD0gMCkgeworICAgIExPR0UoIldpZHRoIGFuZCBoZWlnaHQgYXJlIG5vdCB2YWxpZCAiCisgICAgICAiZGltZW5zaW9ucywgY2Fubm90IGNhbGMgd29yayBidWYgc2l6ZSIpOworICAgIG1tX2pwZWdfam9ibWdyX3RocmVhZF9yZWxlYXNlKG15X29iaik7CisgICAgbW1fanBlZ19xdWV1ZV9kZWluaXQoJm15X29iai0+b25nb2luZ19qb2JfcSk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZteV9vYmotPmpvYl9sb2NrKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBhbGxvY2F0ZSB3b3JrIGJ1ZmZlciBpZiByZXByb2Mgc291cmNlIGJ1ZmZlciBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgdXNlZCAqLworICBpZiAoIW15X29iai0+cmV1c2VfcmVwcm9jX2J1ZmZlcikgeworICAgIHdvcmtfYnVmX3NpemUgPSBDRUlMSU5HNjQoKHVpbnQzMl90KW15X29iai0+bWF4X3BpY193KSAqCisgICAgIENFSUxJTkc2NCgodWludDMyX3QpbXlfb2JqLT5tYXhfcGljX2gpICogM1UgLyAyVTsKKyAgICByYyA9IG1tX2pwZWdfYWxsb2Nfd29ya2J1ZmZlcihteV9vYmosIGluaXRpYWxfd29ya2J1ZnNfY250LCB3b3JrX2J1Zl9zaXplKTsKKyAgICBpZiAocmMgPT0gLTEpIHsKKyAgICAgIExPR0UoIldvcmsgYnVmZmVyIGFsbG9jYXRpb24gZmFpbHVyZSIpOworICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgfQorCisgIC8qIGxvYWQgT01YICovCisgIGlmIChPTVhfRXJyb3JOb25lICE9IE9NWF9Jbml0KCkpIHsKKyAgICAvKiByb2xsIGJhY2sgaW4gZXJyb3IgY2FzZSAqLworICAgIExPR0UoIk9NWF9Jbml0IGZhaWxlZCAoJWQpIiwgcmMpOworICAgIGlmICghbXlfb2JqLT5yZXVzZV9yZXByb2NfYnVmZmVyKSB7CisgICAgICBtbV9qcGVnX3JlbGVhc2Vfd29ya2J1ZmZlcihteV9vYmosIGluaXRpYWxfd29ya2J1ZnNfY250KTsKKyAgICB9CisgICAgbW1fanBlZ19qb2JtZ3JfdGhyZWFkX3JlbGVhc2UobXlfb2JqKTsKKyAgICBtbV9qcGVnX3F1ZXVlX2RlaW5pdCgmbXlfb2JqLT5vbmdvaW5nX2pvYl9xKTsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm15X29iai0+am9iX2xvY2spOworICB9CisKKyNpZmRlZiBMT0FEX0FEU1BfUlBDX0xJQgorICBteV9vYmotPmFkc3BycGNfbGliX2hhbmRsZSA9IGRsb3BlbigibGliYWRzcHJwYy5zbyIsIFJUTERfTk9XKTsKKyAgaWYgKE5VTEwgPT0gbXlfb2JqLT5hZHNwcnBjX2xpYl9oYW5kbGUpIHsKKyAgICBMT0dFKCJDYW5ub3QgbG9hZCB0aGUgbGlicmFyeSIpOworICAgIC8qIG5vdCByZXR1cm5pbmcgZXJyb3IgaGVyZSBiY296IGV2ZW4gaWYgdGhpcyBsb2FkaW5nIGZhaWxzCisgICAgICAgIHdlIGNhbiBnbyBhaGVhZCB3aXRoIFNXIEpQRUcgZW5jICovCisgIH0KKyNlbmRpZgorCisgIC8vIGNyZWF0ZSBkdW1teSBPTVggaGFuZGxlIHRvIGF2b2lkIGRsb3BlbiBsYXRlbmN5CisgIE9NWF9HZXRIYW5kbGUoJm15X29iai0+ZHVtbXlfaGFuZGxlLCBtbV9qcGVnX2dldF9jb21wX25hbWUoKSwgTlVMTCwgTlVMTCk7CisKKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ19kZWluaXQ6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBteV9vYmo6IGpwZWcgb2JqZWN0CisgKgorICogIFJldHVybjoKKyAqICAgICAgIDAgZm9yIHN1Y2Nlc3MgZWxzZSBmYWlsdXJlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgRGVpbml0cyB0aGUganBlZyBjbGllbnQKKyAqCisgKiovCitpbnQzMl90IG1tX2pwZWdfZGVpbml0KG1tX2pwZWdfb2JqICpteV9vYmopCit7CisgIGludDMyX3QgcmMgPSAwOworICB1aW50MzJfdCBpID0gMDsKKworICAvKiByZWxlYXNlIGpvYm1nciB0aHJlYWQgKi8KKyAgcmMgPSBtbV9qcGVnX2pvYm1ncl90aHJlYWRfcmVsZWFzZShteV9vYmopOworICBpZiAoMCAhPSByYykgeworICAgIExPR0UoIkVycm9yIik7CisgIH0KKworICBpZiAobXlfb2JqLT5kdW1teV9oYW5kbGUpIHsKKyAgICBPTVhfRnJlZUhhbmRsZShteV9vYmotPmR1bW15X2hhbmRsZSk7CisgIH0KKworICAvKiB1bmxvYWQgT01YIGVuZ2luZSAqLworICBPTVhfRGVpbml0KCk7CisKKyAgLyogZGVpbml0IG9uZ29pbmcgam9iIGFuZCBjYiBxdWV1ZSAqLworICByYyA9IG1tX2pwZWdfcXVldWVfZGVpbml0KCZteV9vYmotPm9uZ29pbmdfam9iX3EpOworICBpZiAoMCAhPSByYykgeworICAgIExPR0UoIkVycm9yIik7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbXlfb2JqLT53b3JrX2J1Zl9jbnQ7IGkrKykgeworICAgIC8qUmVsZWFzZSB0aGUgSU9OIGJ1ZmZlciovCisgICAgcmMgPSBidWZmZXJfZGVhbGxvY2F0ZSgmbXlfb2JqLT5pb25CdWZmZXJbaV0pOworICAgIGlmICgwICE9IHJjKSB7CisgICAgICBMT0dFKCJFcnJvciByZWxlYXNpbmcgSU9OIGJ1ZmZlciIpOworICAgIH0KKyAgfQorICBteV9vYmotPndvcmtfYnVmX2NudCA9IDA7CisgIG15X29iai0+anBlZ19tZXRhZGF0YSA9IE5VTEw7CisKKyAgLyogZGVzdHJveSBsb2NrcyAqLworICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm15X29iai0+am9iX2xvY2spOworCisgIHJldHVybiByYzsKK30KKworLyoqIG1tX2pwZWdfbmV3X2NsaWVudDoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQG15X29iajoganBlZyBvYmplY3QKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBmb3Igc3VjY2VzcyBlbHNlIGZhaWx1cmUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDcmVhdGUgbmV3IGpwZWcgY2xpZW50CisgKgorICoqLwordWludDMyX3QgbW1fanBlZ19uZXdfY2xpZW50KG1tX2pwZWdfb2JqICpteV9vYmopCit7CisgIHVpbnQzMl90IGNsaWVudF9oZGwgPSAwOworICB1aW50OF90IGlkeDsKKyAgaW50IGkgPSAwOworCisgIGlmIChteV9vYmotPm51bV9jbGllbnRzID49IE1BWF9KUEVHX0NMSUVOVF9OVU0pIHsKKyAgICBMT0dFKCJudW0gb2YgY2xpZW50cyByZWFjaGVkIGxpbWl0Iik7CisgICAgcmV0dXJuIGNsaWVudF9oZGw7CisgIH0KKworICBmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9KUEVHX0NMSUVOVF9OVU07IGlkeCsrKSB7CisgICAgaWYgKDAgPT0gbXlfb2JqLT5jbG50X21ncltpZHhdLmlzX3VzZWQpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChpZHggPCBNQVhfSlBFR19DTElFTlRfTlVNKSB7CisgICAgLyogY2xpZW50IHNlc3Npb24gYXZhaWwgKi8KKyAgICAvKiBnZW5lcmF0ZSBjbGllbnQgaGFuZGxlciBieSBpbmRleCAqLworICAgIGNsaWVudF9oZGwgPSBtbV9qcGVnX3V0aWxfZ2VuZXJhdGVfaGFuZGxlcihpZHgpOworCisgICAgLyogdXBkYXRlIGNsaWVudCBzZXNzaW9uICovCisgICAgbXlfb2JqLT5jbG50X21ncltpZHhdLmlzX3VzZWQgPSAxOworICAgIG15X29iai0+Y2xudF9tZ3JbaWR4XS5jbGllbnRfaGFuZGxlID0gY2xpZW50X2hkbDsKKworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbXlfb2JqLT5jbG50X21ncltpZHhdLmxvY2ssIE5VTEwpOworICAgIGZvciAoaSA9IDA7IGkgPCBNTV9KUEVHX01BWF9TRVNTSU9OOyBpKyspIHsKKyAgICAgIG1lbXNldCgmbXlfb2JqLT5jbG50X21ncltpZHhdLnNlc3Npb25baV0sIDB4MCwgc2l6ZW9mKG1tX2pwZWdfam9iX3Nlc3Npb25fdCkpOworICAgIH0KKworICAgIC8qIGluY3Jlc2UgY2xpZW50IGNvdW50ICovCisgICAgbXlfb2JqLT5udW1fY2xpZW50cysrOworICB9CisKKyAgcmV0dXJuIGNsaWVudF9oZGw7Cit9CisKKyNpZmRlZiBMSUIyRF9ST1RBVElPTl9FTkFCTEUKKy8qKgorICogRnVuY3Rpb246IG1tX2pwZWdfbGliMmRfcm90YXRpb25fY2IKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgb24gY29tcGxldGlvbiBvZiByZXF1ZXN0ZWQgam9iLgorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIHVzZXJkYXRhIC0gQXBwIHVzZXJkYXRhCisgKiAgIGpvYmlkIC0gam9iIGlkIHRoYXQgaXMgZmluaXNoZWQgZXhlY3V0aW9uCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgTU1fTElCMkRfU1VDQ0VTUworICogICBNTV9MSUIyRF9FUlJfR0VORVJBTAorICoKKyAqIE5vdGVzOiBub25lCisgKiovCitsaWIyZF9lcnJvciBtbV9qcGVnX2xpYjJkX3JvdGF0aW9uX2NiKHZvaWQgKnVzZXJkYXRhLCBpbnQgam9iaWQpCit7CisgIExPR0UoIl9HTV8gUmVjZWl2ZWQgQ0IgZnJvbSBsaWIyZFxuIik7CisgIHJldHVybiBNTV9MSUIyRF9TVUNDRVNTOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBtbV9qcGVnX2xpYjJkX3JvdGF0aW9uCisgKgorICogRGVzY3JpcHRpb246IGxpYjJkIHJvdGF0aW9uIGZ1bmN0aW9uLgorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIHBfc2Vzc2lvbiAtIHBvaW50ZXIgdG8gc2Vzc2lvbgorICogICBwX25vZGUgLSBwb2ludGVyIHRvIGpvYiBxdWV1ZSBub2RlCisgKiAgIHBfam9iIC0gcG9pbnRlciB0byBqb2IKKyAqICAgcF9qb2JfaWQgLSBwb2ludGVyIHRvIGpvYiBpZAorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIDAgLSBzdWNjZXNzCisgKiAgIC0xIC0gZmFpbHVyZQorICoKKyAqIE5vdGVzOiBub25lCisgKiovCitpbnQzMl90IG1tX2pwZWdfbGliMmRfcm90YXRpb24obW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24sCisgIG1tX2pwZWdfam9iX3Ffbm9kZV90KiBwX25vZGUsIG1tX2pwZWdfam9iX3QgKnBfam9iLCB1aW50MzJfdCAqcF9qb2JfaWQpCit7CisgIHZvaWQgKmxpYjJkX2hhbmRsZSA9IE5VTEw7CisgIGxpYjJkX2Vycm9yIGxpYjJkX2VyciA9IE1NX0xJQjJEX1NVQ0NFU1M7CisgIG1tX2xpYjJkX2J1ZmZlciBzcmNfYnVmZmVyOworICBtbV9saWIyZF9idWZmZXIgZHN0X2J1ZmZlcjsKKyAgbW1fanBlZ19idWZfdCAqcF9zcmNfbWFpbl9idWYgPSBwX3Nlc3Npb24tPnBhcmFtcy5zcmNfbWFpbl9idWY7CisgIG1tX2pwZWdfYnVmX3QgKnBfc3JjX3JvdF9tYWluX2J1ZiA9IHBfc2Vzc2lvbi0+c3JjX3JvdF9tYWluX2J1ZjsKKyAgbW1fanBlZ19lbmNvZGVfam9iX3QgKnBfam9icGFyYW1zICA9ICZwX2pvYi0+ZW5jb2RlX2pvYjsKKyAgbW1fanBlZ19lbmNvZGVfam9iX3QgKnBfam9icGFyYW1zX25vZGUgPSAmcF9ub2RlLT5lbmNfaW5mby5lbmNvZGVfam9iOworICBjYW1fZm9ybWF0X3QgZm9ybWF0OworICBpbnQzMl90IHNjYW5saW5lID0gMDsKKworICBtZW1zZXQoJnNyY19idWZmZXIsIDB4MCwgc2l6ZW9mKG1tX2xpYjJkX2J1ZmZlcikpOworICBtZW1zZXQoJmRzdF9idWZmZXIsIDB4MCwgc2l6ZW9mKG1tX2xpYjJkX2J1ZmZlcikpOworCisgIHN3aXRjaCAocF9zZXNzaW9uLT5wYXJhbXMucm90YXRpb24pIHsKKyAgY2FzZSAwOgorICAgIGJyZWFrOworICBjYXNlIDkwOgorICAgIHBfam9icGFyYW1zX25vZGUtPm1haW5fZGltLnNyY19kaW0ud2lkdGggPQorICAgICAgcF9qb2JwYXJhbXMtPm1haW5fZGltLnNyY19kaW0uaGVpZ2h0OworICAgIHBfam9icGFyYW1zX25vZGUtPm1haW5fZGltLnNyY19kaW0uaGVpZ2h0ID0KKyAgICAgIHBfam9icGFyYW1zLT5tYWluX2RpbS5zcmNfZGltLndpZHRoOworCisgICAgcF9qb2JwYXJhbXNfbm9kZS0+bWFpbl9kaW0uZHN0X2RpbS53aWR0aCA9CisgICAgICBwX2pvYnBhcmFtcy0+bWFpbl9kaW0uZHN0X2RpbS5oZWlnaHQ7CisgICAgcF9qb2JwYXJhbXNfbm9kZS0+bWFpbl9kaW0uZHN0X2RpbS5oZWlnaHQgPQorICAgICAgcF9qb2JwYXJhbXMtPm1haW5fZGltLmRzdF9kaW0ud2lkdGg7CisKKyAgICBwX2pvYnBhcmFtc19ub2RlLT5tYWluX2RpbS5jcm9wLndpZHRoID0KKyAgICAgIHBfam9icGFyYW1zLT5tYWluX2RpbS5jcm9wLmhlaWdodDsKKyAgICBwX2pvYnBhcmFtc19ub2RlLT5tYWluX2RpbS5jcm9wLmhlaWdodCA9CisgICAgICBwX2pvYnBhcmFtcy0+bWFpbl9kaW0uY3JvcC53aWR0aDsKKyAgICBwX2pvYnBhcmFtc19ub2RlLT5tYWluX2RpbS5jcm9wLmxlZnQgPQorICAgICAgcF9qb2JwYXJhbXMtPm1haW5fZGltLnNyY19kaW0uaGVpZ2h0IC0KKyAgICAgIChwX2pvYnBhcmFtcy0+bWFpbl9kaW0uY3JvcC50b3AgKworICAgICAgcF9qb2JwYXJhbXMtPm1haW5fZGltLmNyb3AuaGVpZ2h0KTsKKyAgICBwX2pvYnBhcmFtc19ub2RlLT5tYWluX2RpbS5jcm9wLnRvcCA9CisgICAgICBwX2pvYnBhcmFtcy0+bWFpbl9kaW0uY3JvcC5sZWZ0OworICAgIGJyZWFrOworICBjYXNlIDE4MDoKKyAgICBwX2pvYnBhcmFtc19ub2RlLT5tYWluX2RpbS5jcm9wLmxlZnQgPQorICAgICAgcF9qb2JwYXJhbXMtPm1haW5fZGltLnNyY19kaW0ud2lkdGggLQorICAgICAgKHBfam9icGFyYW1zLT5tYWluX2RpbS5jcm9wLmxlZnQgKworICAgICAgcF9qb2JwYXJhbXMtPm1haW5fZGltLmNyb3Aud2lkdGgpOworICAgIHBfam9icGFyYW1zX25vZGUtPm1haW5fZGltLmNyb3AudG9wID0KKyAgICAgIHBfam9icGFyYW1zLT5tYWluX2RpbS5zcmNfZGltLmhlaWdodCAtCisgICAgICAocF9qb2JwYXJhbXMtPm1haW5fZGltLmNyb3AudG9wICsKKyAgICAgIHBfam9icGFyYW1zLT5tYWluX2RpbS5jcm9wLmhlaWdodCk7CisgICAgYnJlYWs7CisgIGNhc2UgMjcwOgorICAgIHBfam9icGFyYW1zX25vZGUtPm1haW5fZGltLnNyY19kaW0ud2lkdGggPQorICAgICAgcF9qb2JwYXJhbXMtPm1haW5fZGltLnNyY19kaW0uaGVpZ2h0OworICAgIHBfam9icGFyYW1zX25vZGUtPm1haW5fZGltLnNyY19kaW0uaGVpZ2h0ID0KKyAgICAgIHBfam9icGFyYW1zLT5tYWluX2RpbS5zcmNfZGltLndpZHRoOworCisgICAgcF9qb2JwYXJhbXNfbm9kZS0+bWFpbl9kaW0uZHN0X2RpbS53aWR0aCA9CisgICAgICBwX2pvYnBhcmFtcy0+bWFpbl9kaW0uZHN0X2RpbS5oZWlnaHQ7CisgICAgcF9qb2JwYXJhbXNfbm9kZS0+bWFpbl9kaW0uZHN0X2RpbS5oZWlnaHQgPQorICAgICAgcF9qb2JwYXJhbXMtPm1haW5fZGltLmRzdF9kaW0ud2lkdGg7CisKKyAgICBwX2pvYnBhcmFtc19ub2RlLT5tYWluX2RpbS5jcm9wLndpZHRoID0KKyAgICAgIHBfam9icGFyYW1zLT5tYWluX2RpbS5jcm9wLmhlaWdodDsKKyAgICBwX2pvYnBhcmFtc19ub2RlLT5tYWluX2RpbS5jcm9wLmhlaWdodCA9CisgICAgICBwX2pvYnBhcmFtcy0+bWFpbl9kaW0uY3JvcC53aWR0aDsKKyAgICBwX2pvYnBhcmFtc19ub2RlLT5tYWluX2RpbS5jcm9wLmxlZnQgPQorICAgICAgcF9qb2JwYXJhbXMtPm1haW5fZGltLmNyb3AudG9wOworICAgIHBfam9icGFyYW1zX25vZGUtPm1haW5fZGltLmNyb3AudG9wID0KKyAgICAgIHBfam9icGFyYW1zLT5tYWluX2RpbS5zcmNfZGltLndpZHRoIC0KKyAgICAgIChwX2pvYnBhcmFtcy0+bWFpbl9kaW0uY3JvcC5sZWZ0ICsKKyAgICAgIHBfam9icGFyYW1zLT5tYWluX2RpbS5jcm9wLndpZHRoKTsKKyAgICBicmVhazsKKyAgfQorCisgIGZvcm1hdCA9IG1tX2pwZWdfZ2V0X2ltZ2ZtdF9mcm9tX2NvbG9yZm10KHBfc2Vzc2lvbi0+cGFyYW1zLmNvbG9yX2Zvcm1hdCk7CisgIGxpYjJkX2VyciA9IG1tX2xpYjJkX2luaXQoTU1fTElCMkRfU1lOQ19NT0RFLCBmb3JtYXQsCisgICAgZm9ybWF0LCAmbGliMmRfaGFuZGxlKTsKKyAgaWYgKGxpYjJkX2VyciAhPSBNTV9MSUIyRF9TVUNDRVNTKSB7CisgICAgTE9HRSgibGliMmQgaW5pdCBmb3Igcm90YXRpb24gZmFpbGVkXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBzcmNfYnVmZmVyLmJ1ZmZlcl90eXBlID0gTU1fTElCMkRfQlVGRkVSX1RZUEVfWVVWOworICBzcmNfYnVmZmVyLnl1dl9idWZmZXIuZmQgPQorICAgIHBfc3JjX21haW5fYnVmW3Bfam9icGFyYW1zLT5zcmNfaW5kZXhdLmZkOworICBzcmNfYnVmZmVyLnl1dl9idWZmZXIuZm9ybWF0ID0gZm9ybWF0OworICBzcmNfYnVmZmVyLnl1dl9idWZmZXIud2lkdGggPSBwX2pvYnBhcmFtcy0+bWFpbl9kaW0uc3JjX2RpbS53aWR0aDsKKyAgc3JjX2J1ZmZlci55dXZfYnVmZmVyLmhlaWdodCA9IHBfam9icGFyYW1zLT5tYWluX2RpbS5zcmNfZGltLmhlaWdodDsKKyAgc3JjX2J1ZmZlci55dXZfYnVmZmVyLnBsYW5lMCA9CisgICAgcF9zcmNfbWFpbl9idWZbcF9qb2JwYXJhbXMtPnNyY19pbmRleF0uYnVmX3ZhZGRyOworICBzcmNfYnVmZmVyLnl1dl9idWZmZXIuc3RyaWRlMCA9CisgICAgcF9zcmNfbWFpbl9idWZbcF9qb2JwYXJhbXMtPnNyY19pbmRleF0ub2Zmc2V0Lm1wWzBdLnN0cmlkZTsKKyAgc2NhbmxpbmUgPSBwX3NyY19tYWluX2J1ZltwX2pvYnBhcmFtcy0+c3JjX2luZGV4XS5vZmZzZXQubXBbMF0uc2NhbmxpbmU7CisgIHNyY19idWZmZXIueXV2X2J1ZmZlci5wbGFuZTEgPQorICAgICh1aW50OF90KilzcmNfYnVmZmVyLnl1dl9idWZmZXIucGxhbmUwICsKKyAgICAoc3JjX2J1ZmZlci55dXZfYnVmZmVyLnN0cmlkZTAgKiBzY2FubGluZSk7CisgIHNyY19idWZmZXIueXV2X2J1ZmZlci5zdHJpZGUxID0gc3JjX2J1ZmZlci55dXZfYnVmZmVyLnN0cmlkZTA7CisKKyAgTE9HRCgiIGxpYjJkIFNSQyB3eGggPSAlZHglZCAsIHN0eHNsID0gJWR4JWRcbiIsCisgICAgc3JjX2J1ZmZlci55dXZfYnVmZmVyLndpZHRoLCBzcmNfYnVmZmVyLnl1dl9idWZmZXIuaGVpZ2h0LAorICAgIHNyY19idWZmZXIueXV2X2J1ZmZlci5zdHJpZGUwLCBzY2FubGluZSk7CisKKyAgZHN0X2J1ZmZlci5idWZmZXJfdHlwZSA9IE1NX0xJQjJEX0JVRkZFUl9UWVBFX1lVVjsKKyAgZHN0X2J1ZmZlci55dXZfYnVmZmVyLmZkID0KKyAgICBwX3NyY19yb3RfbWFpbl9idWZbcF9qb2JwYXJhbXMtPnNyY19pbmRleF0uZmQ7CisgIGRzdF9idWZmZXIueXV2X2J1ZmZlci5mb3JtYXQgPSBmb3JtYXQ7CisgIGRzdF9idWZmZXIueXV2X2J1ZmZlci53aWR0aCA9IHBfam9icGFyYW1zX25vZGUtPm1haW5fZGltLnNyY19kaW0ud2lkdGg7CisgIGRzdF9idWZmZXIueXV2X2J1ZmZlci5oZWlnaHQgPSBwX2pvYnBhcmFtc19ub2RlLT5tYWluX2RpbS5zcmNfZGltLmhlaWdodDsKKyAgZHN0X2J1ZmZlci55dXZfYnVmZmVyLnBsYW5lMCA9CisgICAgcF9zcmNfcm90X21haW5fYnVmW3Bfam9icGFyYW1zLT5zcmNfaW5kZXhdLmJ1Zl92YWRkcjsKKworICBpZiAoKHBfc2Vzc2lvbi0+cGFyYW1zLnJvdGF0aW9uID09IDkwKSB8fAorICAgIChwX3Nlc3Npb24tPnBhcmFtcy5yb3RhdGlvbiA9PSAyNzApKSB7CisgICAgZHN0X2J1ZmZlci55dXZfYnVmZmVyLnN0cmlkZTAgPQorICAgICAgcF9zcmNfbWFpbl9idWZbcF9qb2JwYXJhbXMtPnNyY19pbmRleF0ub2Zmc2V0Lm1wWzBdLnNjYW5saW5lOworICAgIHNjYW5saW5lID0gcF9zcmNfbWFpbl9idWZbcF9qb2JwYXJhbXMtPnNyY19pbmRleF0ub2Zmc2V0Lm1wWzBdLnN0cmlkZTsKKyAgfSBlbHNlIHsKKyAgICBkc3RfYnVmZmVyLnl1dl9idWZmZXIuc3RyaWRlMCA9CisgICAgICBwX3NyY19tYWluX2J1ZltwX2pvYnBhcmFtcy0+c3JjX2luZGV4XS5vZmZzZXQubXBbMF0uc3RyaWRlOworICAgIHNjYW5saW5lID0gcF9zcmNfbWFpbl9idWZbcF9qb2JwYXJhbXMtPnNyY19pbmRleF0ub2Zmc2V0Lm1wWzBdLnNjYW5saW5lOworICB9CisKKyAgZHN0X2J1ZmZlci55dXZfYnVmZmVyLnBsYW5lMSA9CisgICAgKHVpbnQ4X3QqKSBkc3RfYnVmZmVyLnl1dl9idWZmZXIucGxhbmUwICsKKyAgICAoZHN0X2J1ZmZlci55dXZfYnVmZmVyLnN0cmlkZTAgKiBzY2FubGluZSk7CisgIGRzdF9idWZmZXIueXV2X2J1ZmZlci5zdHJpZGUxID0gZHN0X2J1ZmZlci55dXZfYnVmZmVyLnN0cmlkZTA7CisKKyAgTE9HRCgiIGxpYjJkIERFU1Qgd3hoID0gJWR4JWQgLCBzdHhzbCA9ICVkeCVkXG4iLAorICAgIGRzdF9idWZmZXIueXV2X2J1ZmZlci53aWR0aCwgZHN0X2J1ZmZlci55dXZfYnVmZmVyLmhlaWdodCwKKyAgICBkc3RfYnVmZmVyLnl1dl9idWZmZXIuc3RyaWRlMCwgc2NhbmxpbmUpOworCisgIExPR0QoIiBsaWIyZCByb3RhdGlvbiA9ICVkXG4iLCBwX3Nlc3Npb24tPnBhcmFtcy5yb3RhdGlvbik7CisKKyAgbGliMmRfZXJyID0gbW1fbGliMmRfc3RhcnRfam9iKGxpYjJkX2hhbmRsZSwgJnNyY19idWZmZXIsICZkc3RfYnVmZmVyLAorICAgICpwX2pvYl9pZCwgTlVMTCwgbW1fanBlZ19saWIyZF9yb3RhdGlvbl9jYiwgcF9zZXNzaW9uLT5wYXJhbXMucm90YXRpb24pOworICBpZiAobGliMmRfZXJyICE9IE1NX0xJQjJEX1NVQ0NFU1MpIHsKKyAgICBMT0dFKCJFcnJvciBpbiBtbV9saWIyZF9zdGFydF9qb2IgXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBidWZmZXJfY2xlYW4oJnBfc2Vzc2lvbi0+c3JjX3JvdF9pb25fYnVmZmVyW3Bfam9icGFyYW1zLT5zcmNfaW5kZXhdKTsKKworICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiogbW1fanBlZ19zdGFydF9qb2I6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBteV9vYmo6IGpwZWcgb2JqZWN0CisgKiAgICBAY2xpZW50X2hkbDogY2xpZW50IGhhbmRsZQorICogICAgQGpvYjogcG9pbnRlciB0byBlbmNvZGUgam9iCisgKiAgICBAam9iSWQ6IGpvYiBpZAorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIGZvciBzdWNjZXNzIGVsc2UgZmFpbHVyZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIFN0YXJ0IHRoZSBlbmNvZGluZyBqb2IKKyAqCisgKiovCitpbnQzMl90IG1tX2pwZWdfc3RhcnRfam9iKG1tX2pwZWdfb2JqICpteV9vYmosCisgIG1tX2pwZWdfam9iX3QgKmpvYiwKKyAgdWludDMyX3QgKmpvYl9pZCkKK3sKKyAgbW1fanBlZ19xX2RhdGFfdCBxZGF0YTsKKyAgaW50MzJfdCByYyA9IC0xOworICB1aW50OF90IHNlc3Npb25faWR4ID0gMDsKKyAgdWludDhfdCBjbGllbnRfaWR4ID0gMDsKKyAgbW1fanBlZ19qb2JfcV9ub2RlX3QqIG5vZGUgPSBOVUxMOworICBtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKnBfc2Vzc2lvbiA9IE5VTEw7CisgIG1tX2pwZWdfZW5jb2RlX2pvYl90ICpwX2pvYnBhcmFtcyAgPSBOVUxMOworICB1aW50MzJfdCB3b3JrX2J1ZnNfbmVlZDsKKyAgdWludDMyX3Qgd29ya19idWZfc2l6ZTsKKworICAqam9iX2lkID0gMDsKKworICBpZiAoIWpvYikgeworICAgIExPR0UoImludmFsaWQgam9iICEhISIpOworICAgIHJldHVybiByYzsKKyAgfQorICBwX2pvYnBhcmFtcyA9ICZqb2ItPmVuY29kZV9qb2I7CisKKyAgLyogY2hlY2sgaWYgdmFsaWQgc2Vzc2lvbiAqLworICBzZXNzaW9uX2lkeCA9IEdFVF9TRVNTSU9OX0lEWChwX2pvYnBhcmFtcy0+c2Vzc2lvbl9pZCk7CisgIGNsaWVudF9pZHggPSBHRVRfQ0xJRU5UX0lEWChwX2pvYnBhcmFtcy0+c2Vzc2lvbl9pZCk7CisgIExPR0QoInNlc3Npb25faWR4ICVkIGNsaWVudCBpZHggJWQiLAorICAgIHNlc3Npb25faWR4LCBjbGllbnRfaWR4KTsKKworICBpZiAoKHNlc3Npb25faWR4ID49IE1NX0pQRUdfTUFYX1NFU1NJT04pIHx8CisgICAgKGNsaWVudF9pZHggPj0gTUFYX0pQRUdfQ0xJRU5UX05VTSkpIHsKKyAgICBMT0dFKCJpbnZhbGlkIHNlc3Npb24gaWQgJXgiLAorICAgICAgam9iLT5lbmNvZGVfam9iLnNlc3Npb25faWQpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIHBfc2Vzc2lvbiA9ICZteV9vYmotPmNsbnRfbWdyW2NsaWVudF9pZHhdLnNlc3Npb25bc2Vzc2lvbl9pZHhdOworCisgIGlmIChteV9vYmotPnJldXNlX3JlcHJvY19idWZmZXIpIHsKKyAgICBwX3Nlc3Npb24tPndvcmtfYnVmZmVyLmFkZHIgICAgICAgICAgID0gcF9qb2JwYXJhbXMtPndvcmtfYnVmLmJ1Zl92YWRkcjsKKyAgICBwX3Nlc3Npb24tPndvcmtfYnVmZmVyLnNpemUgICAgICAgICAgID0gcF9qb2JwYXJhbXMtPndvcmtfYnVmLmJ1Zl9zaXplOworICAgIHBfc2Vzc2lvbi0+d29ya19idWZmZXIuaW9uX2luZm9fZmQuZmQgPSBwX2pvYnBhcmFtcy0+d29ya19idWYuZmQ7CisgICAgcF9zZXNzaW9uLT53b3JrX2J1ZmZlci5wX3BtZW1fZmQgICAgICA9IHBfam9icGFyYW1zLT53b3JrX2J1Zi5mZDsKKworICAgIHdvcmtfYnVmc19uZWVkID0gbXlfb2JqLT5udW1fc2Vzc2lvbnMgKyAxOworICAgIGlmICh3b3JrX2J1ZnNfbmVlZCA+IE1NX0pQRUdfQ09OQ1VSUkVOVF9TRVNTSU9OU19DT1VOVCkgeworICAgICAgd29ya19idWZzX25lZWQgPSBNTV9KUEVHX0NPTkNVUlJFTlRfU0VTU0lPTlNfQ09VTlQ7CisgICAgfQorCisgICAgaWYgKHBfc2Vzc2lvbi0+d29ya19idWZmZXIuYWRkcikgeworICAgICAgd29ya19idWZzX25lZWQtLTsKKyAgICAgIExPR0QoIkhBTCBwYXNzZWQgdGhlIHdvcmsgYnVmZmVyIG9mIHNpemUgPSAlZDsgZG9uJ3QgYWxsb2MgaW50ZXJuYWxseSIsCisgICAgICAgICAgcF9zZXNzaW9uLT53b3JrX2J1ZmZlci5zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgcF9zZXNzaW9uLT53b3JrX2J1ZmZlciA9IG15X29iai0+aW9uQnVmZmVyWzBdOworICAgIH0KKworICAgIExPR0QoIj4+Pj4gV29yayBidWZzIG5lZWQgJWQsICVkIiwKKyAgICAgIHdvcmtfYnVmc19uZWVkLCBteV9vYmotPndvcmtfYnVmX2NudCk7CisgICAgaWYgKHdvcmtfYnVmc19uZWVkKSB7CisgICAgICB3b3JrX2J1Zl9zaXplID0gQ0VJTElORzY0KG15X29iai0+bWF4X3BpY193KSAqCisgICAgICAgIENFSUxJTkc2NChteV9vYmotPm1heF9waWNfaCkgKiAzIC8gMjsKKyAgICAgIHJjID0gbW1fanBlZ19hbGxvY193b3JrYnVmZmVyKG15X29iaiwgd29ya19idWZzX25lZWQsIHdvcmtfYnVmX3NpemUpOworICAgICAgaWYgKHJjID09IC0xKSB7CisgICAgICAgIExPR0UoIldvcmsgYnVmZmVyIGFsbG9jYXRpb24gZmFpbHVyZSIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgICB9IGVsc2UgeworICAgICAgICBwX3Nlc3Npb24tPndvcmtfYnVmZmVyID0gbXlfb2JqLT5pb25CdWZmZXJbcmNdOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChPTVhfRkFMU0UgPT0gcF9zZXNzaW9uLT5hY3RpdmUpIHsKKyAgICBMT0dFKCJzZXNzaW9uIG5vdCBhY3RpdmUgJXgiLAorICAgICAgam9iLT5lbmNvZGVfam9iLnNlc3Npb25faWQpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIGlmICgocF9qb2JwYXJhbXMtPnNyY19pbmRleCA+PSAoaW50MzJfdClwX3Nlc3Npb24tPnBhcmFtcy5udW1fc3JjX2J1ZnMpIHx8CisgICAgKHBfam9icGFyYW1zLT5kc3RfaW5kZXggPj0gKGludDMyX3QpcF9zZXNzaW9uLT5wYXJhbXMubnVtX2RzdF9idWZzKSkgeworICAgIExPR0UoImludmFsaWQgYnVmZmVyIGluZGljZXMiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworICAvKiBlbnF1ZXVlIG5ldyBqb2IgaW50byB0b2RvIGpvYiBxdWV1ZSAqLworICBub2RlID0gKG1tX2pwZWdfam9iX3Ffbm9kZV90ICopbWFsbG9jKHNpemVvZihtbV9qcGVnX2pvYl9xX25vZGVfdCkpOworICBpZiAoTlVMTCA9PSBub2RlKSB7CisgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBtbV9qcGVnX2pvYl9xX25vZGVfdCIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIEtQSV9BVFJBQ0VfSU5UKCJDYW1lcmE6SlBFRyIsCisgICAgICAoaW50MzJfdCkoKHVpbnQzMl90KXNlc3Npb25faWR4PDwxNiB8ICsrcF9zZXNzaW9uLT5qb2JfaW5kZXgpKTsKKworICAqam9iX2lkID0gam9iLT5lbmNvZGVfam9iLnNlc3Npb25faWQgfAorICAgICgoKHVpbnQzMl90KXBfc2Vzc2lvbi0+am9iX2hpc3QrKyAlIEpPQl9ISVNUX01BWCkgPDwgMTYpOworCisgIG1lbXNldChub2RlLCAwLCBzaXplb2YobW1fanBlZ19qb2JfcV9ub2RlX3QpKTsKKyAgbm9kZS0+ZW5jX2luZm8uZW5jb2RlX2pvYiA9IGpvYi0+ZW5jb2RlX2pvYjsKKworI2lmZGVmIExJQjJEX1JPVEFUSU9OX0VOQUJMRQorICBpZiAocF9zZXNzaW9uLT5saWIyZF9yb3RhdGlvbl9mbGFnKSB7CisgICAgcmMgPSBtbV9qcGVnX2xpYjJkX3JvdGF0aW9uKHBfc2Vzc2lvbiwgbm9kZSwgam9iLCBqb2JfaWQpOworICAgIGlmIChyYyA8IDApIHsKKyAgICAgIExPR0UoIkxpYjJkIHJvdGF0aW9uIGZhaWxlZCIpOworICAgICAgcmV0dXJuIHJjOworICAgIH0KKyAgfQorI2VuZGlmCisKKyAgaWYgKHBfc2Vzc2lvbi0+dGh1bWJfZnJvbV9tYWluKSB7CisgICAgbm9kZS0+ZW5jX2luZm8uZW5jb2RlX2pvYi50aHVtYl9kaW0uc3JjX2RpbSA9CisgICAgICBub2RlLT5lbmNfaW5mby5lbmNvZGVfam9iLm1haW5fZGltLnNyY19kaW07CisgICAgbm9kZS0+ZW5jX2luZm8uZW5jb2RlX2pvYi50aHVtYl9kaW0uY3JvcCA9CisgICAgICBub2RlLT5lbmNfaW5mby5lbmNvZGVfam9iLm1haW5fZGltLmNyb3A7CisgICAgaWYgKHBfc2Vzc2lvbi0+bGliMmRfcm90YXRpb25fZmxhZykgeworICAgICAgaWYgKChwX3Nlc3Npb24tPnBhcmFtcy5yb3RhdGlvbiA9PSA5MCkgfHwKKyAgICAgICAgKHBfc2Vzc2lvbi0+cGFyYW1zLnJvdGF0aW9uID09IDI3MCkpIHsKKyAgICAgICAgbm9kZS0+ZW5jX2luZm8uZW5jb2RlX2pvYi50aHVtYl9kaW0uZHN0X2RpbS53aWR0aCA9CisgICAgICAgICAgam9iLT5lbmNvZGVfam9iLnRodW1iX2RpbS5kc3RfZGltLmhlaWdodDsKKyAgICAgICAgbm9kZS0+ZW5jX2luZm8uZW5jb2RlX2pvYi50aHVtYl9kaW0uZHN0X2RpbS5oZWlnaHQgPQorICAgICAgICAgIGpvYi0+ZW5jb2RlX2pvYi50aHVtYl9kaW0uZHN0X2RpbS53aWR0aDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgbm9kZS0+ZW5jX2luZm8uam9iX2lkID0gKmpvYl9pZDsKKyAgbm9kZS0+ZW5jX2luZm8uY2xpZW50X2hhbmRsZSA9IHBfc2Vzc2lvbi0+Y2xpZW50X2hkbDsKKyAgbm9kZS0+dHlwZSA9IE1NX0pQRUdfQ01EX1RZUEVfSk9COworCisgIHFkYXRhLnAgPSBub2RlOworICByYyA9IG1tX2pwZWdfcXVldWVfZW5xKCZteV9vYmotPmpvYl9tZ3Iuam9iX3F1ZXVlLCBxZGF0YSk7CisgIGlmICgwID09IHJjKSB7CisgICAgICBjYW1fc2VtX3Bvc3QoJm15X29iai0+am9iX21nci5qb2Jfc2VtKTsKKyAgfQorCisgIExPR0goInNlc3Npb25faWR4ICV1IGNsaWVudF9pZHggJXUgam9iX2lkICVkIFgiLAorICAgIHNlc3Npb25faWR4LCBjbGllbnRfaWR4LCAqam9iX2lkKTsKKworICByZXR1cm4gcmM7Cit9CisKKworCisvKiogbW1fanBlZ19hYm9ydF9qb2I6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBteV9vYmo6IGpwZWcgb2JqZWN0CisgKiAgICBAY2xpZW50X2hkbDogY2xpZW50IGhhbmRsZQorICogICAgQGpvYklkOiBqb2IgaWQKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBmb3Igc3VjY2VzcyBlbHNlIGZhaWx1cmUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBBYm9ydCB0aGUgZW5jb2Rpbmcgc2Vzc2lvbgorICoKKyAqKi8KK2ludDMyX3QgbW1fanBlZ19hYm9ydF9qb2IobW1fanBlZ19vYmogKm15X29iaiwKKyAgdWludDMyX3Qgam9iSWQpCit7CisgIGludDMyX3QgcmMgPSAtMTsKKyAgbW1fanBlZ19qb2JfcV9ub2RlX3QgKm5vZGUgPSBOVUxMOworICBtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKnBfc2Vzc2lvbiA9IE5VTEw7CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmpvYl9sb2NrKTsKKworICAvKiBhYm9ydCBqb2IgaWYgaW4gdG9kbyBxdWV1ZSAqLworICBub2RlID0gbW1fanBlZ19xdWV1ZV9yZW1vdmVfam9iX2J5X2pvYl9pZCgmbXlfb2JqLT5qb2JfbWdyLmpvYl9xdWV1ZSwgam9iSWQpOworICBpZiAoTlVMTCAhPSBub2RlKSB7CisgICAgZnJlZShub2RlKTsKKyAgICBnb3RvIGFib3J0X2RvbmU7CisgIH0KKworICAvKiBhYm9ydCBqb2IgaWYgaW4gb25nb2luZyBxdWV1ZSAqLworICBub2RlID0gbW1fanBlZ19xdWV1ZV9yZW1vdmVfam9iX2J5X2pvYl9pZCgmbXlfb2JqLT5vbmdvaW5nX2pvYl9xLCBqb2JJZCk7CisgIGlmIChOVUxMICE9IG5vZGUpIHsKKyAgICAvKiBmaW5kIGpvYiB0aGF0IGlzIE9NWCBvbmdvaW5nLCBhc2sgT01YIHRvIGFib3J0IHRoZSBqb2IgKi8KKyAgICBwX3Nlc3Npb24gPSBtbV9qcGVnX2dldF9zZXNzaW9uKG15X29iaiwgbm9kZS0+ZW5jX2luZm8uam9iX2lkKTsKKyAgICBpZiAocF9zZXNzaW9uKSB7CisgICAgICBtbV9qcGVnX3Nlc3Npb25fYWJvcnQocF9zZXNzaW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgTE9HRSgiSW52YWxpZCBqb2IgaWQgMHgleCIsCisgICAgICAgIG5vZGUtPmVuY19pbmZvLmpvYl9pZCk7CisgICAgfQorICAgIGZyZWUobm9kZSk7CisgICAgZ290byBhYm9ydF9kb25lOworICB9CisKK2Fib3J0X2RvbmU6CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmpvYl9sb2NrKTsKKworICByZXR1cm4gcmM7Cit9CisKKworI2lmZGVmIE1NX0pQRUdfUkVBRF9NRVRBX0tFWUZJTEUKK3N0YXRpYyBpbnQzMl90IG1tX2pwZWdfcmVhZF9tZXRhX2tleWZpbGUobW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24sCisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgIGludCByYyA9IDA7CisgIEZJTEUgKmZwID0gTlVMTDsKKyAgc2l6ZV90IGZpbGVfc2l6ZSA9IDA7CisgIGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgIGlmICghZnApIHsKKyAgICBMT0dFKCJLZXkgbm90IHByZXNlbnQiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgZnNlZWsoZnAsIDAsIFNFRUtfRU5EKTsKKyAgZmlsZV9zaXplID0gKHNpemVfdClmdGVsbChmcCk7CisgIGZzZWVrKGZwLCAwLCBTRUVLX1NFVCk7CisKKyAgcF9zZXNzaW9uLT5tZXRhX2VuY19rZXkgPSAodWludDhfdCAqKSBtYWxsb2MoKGZpbGVfc2l6ZSArIDEpICogc2l6ZW9mKHVpbnQ4X3QpKTsKKworICBpZiAoIXBfc2Vzc2lvbi0+bWV0YV9lbmNfa2V5KSB7CisgICAgTE9HRSgiZXJyb3IiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBmcmVhZChwX3Nlc3Npb24tPm1ldGFfZW5jX2tleSwgMSwgZmlsZV9zaXplLCBmcCk7CisgIGZjbG9zZShmcCk7CisKKyAgcF9zZXNzaW9uLT5tZXRhX2VuY19rZXlsZW4gPSBmaWxlX3NpemU7CisKKyAgcmV0dXJuIHJjOworfQorI2VuZGlmIC8vIE1NX0pQRUdfUkVBRF9NRVRBX0tFWUZJTEUKKworLyoqIG1tX2pwZWdfY3JlYXRlX3Nlc3Npb246CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBteV9vYmo6IGpwZWcgb2JqZWN0CisgKiAgICBAY2xpZW50X2hkbDogY2xpZW50IGhhbmRsZQorICogICAgQHBfcGFyYW1zOiBwb2ludGVyIHRvIGVuY29kZSBwYXJhbXMKKyAqICAgIEBwX3Nlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBmb3Igc3VjY2VzcyBlbHNlIGZhaWx1cmUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBTdGFydCB0aGUgZW5jb2Rpbmcgc2Vzc2lvbgorICoKKyAqKi8KK2ludDMyX3QgbW1fanBlZ19jcmVhdGVfc2Vzc2lvbihtbV9qcGVnX29iaiAqbXlfb2JqLAorICB1aW50MzJfdCBjbGllbnRfaGRsLAorICBtbV9qcGVnX2VuY29kZV9wYXJhbXNfdCAqcF9wYXJhbXMsCisgIHVpbnQzMl90KiBwX3Nlc3Npb25faWQpCit7CisgIG1tX2pwZWdfcV9kYXRhX3QgcWRhdGE7CisgIGludDMyX3QgcmMgPSAwOworICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgIHVpbnQ4X3QgY2xudF9pZHggPSAwOworICBpbnQgc2Vzc2lvbl9pZHggPSAtMTsKKyAgbW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24gPSBOVUxMOworICBtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKiBwX3ByZXZfc2Vzc2lvbiA9IE5VTEw7CisgICpwX3Nlc3Npb25faWQgPSAwOworICB1aW50MzJfdCBpID0gMDsKKyAgdWludDMyX3QgaiA9IDA7CisgIHVpbnQzMl90IG51bV9vbXhfc2Vzc2lvbnMgPSAxOworICB1aW50MzJfdCB3b3JrX2J1Zl9zaXplOworICBtbV9qcGVnX3F1ZXVlX3QgKnBfc2Vzc2lvbl9oYW5kbGVfcSwgKnBfb3V0X2J1Zl9xOworICB1aW50MzJfdCB3b3JrX2J1ZnNfbmVlZDsKKyAgY2hhciB0cmFjZV90YWdbMzJdOworCisgIC8qIHZhbGlkYXRlIHRoZSBwYXJhbWV0ZXJzICovCisgIGlmICgocF9wYXJhbXMtPm51bV9zcmNfYnVmcyA+IE1NX0pQRUdfTUFYX0JVRikKKyAgICB8fCAocF9wYXJhbXMtPm51bV9kc3RfYnVmcyA+IE1NX0pQRUdfTUFYX0JVRikpIHsKKyAgICBMT0dFKCJpbnZhbGlkIG51bSBidWZmZXJzIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogY2hlY2sgaWYgdmFsaWQgY2xpZW50ICovCisgIGNsbnRfaWR4ID0gbW1fanBlZ191dGlsX2dldF9pbmRleF9ieV9oYW5kbGVyKGNsaWVudF9oZGwpOworICBpZiAoY2xudF9pZHggPj0gTUFYX0pQRUdfQ0xJRU5UX05VTSkgeworICAgIExPR0UoImludmFsaWQgY2xpZW50IHdpdGggaGFuZGxlciAoJWQpIiwgY2xpZW50X2hkbCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHBfcGFyYW1zLT5idXJzdF9tb2RlKSB7CisgICAgbnVtX29teF9zZXNzaW9ucyA9IE1NX0pQRUdfQ09OQ1VSUkVOVF9TRVNTSU9OU19DT1VOVDsKKyAgfQorCisgIGlmICghbXlfb2JqLT5yZXVzZV9yZXByb2NfYnVmZmVyKSB7CisgICAgd29ya19idWZzX25lZWQgPSBudW1fb214X3Nlc3Npb25zOworICAgIGlmICh3b3JrX2J1ZnNfbmVlZCA+IE1NX0pQRUdfQ09OQ1VSUkVOVF9TRVNTSU9OU19DT1VOVCkgeworICAgICAgd29ya19idWZzX25lZWQgPSBNTV9KUEVHX0NPTkNVUlJFTlRfU0VTU0lPTlNfQ09VTlQ7CisgICAgfQorICAgIExPR0QoIj4+Pj4gV29yayBidWZzIG5lZWQgJWQiLCB3b3JrX2J1ZnNfbmVlZCk7CisgICAgd29ya19idWZfc2l6ZSA9IENFSUxJTkc2NChteV9vYmotPm1heF9waWNfdykgKgorICAgICAgQ0VJTElORzY0KG15X29iai0+bWF4X3BpY19oKSAqIDMgLyAyOworICAgIHJjID0gbW1fanBlZ19hbGxvY193b3JrYnVmZmVyKG15X29iaiwgd29ya19idWZzX25lZWQsIHdvcmtfYnVmX3NpemUpOworICAgIGlmIChyYyA9PSAtMSkgeworICAgICAgTE9HRSgiV29yayBidWZmZXIgYWxsb2NhdGlvbiBmYWlsdXJlIik7CisgICAgICByZXR1cm4gcmM7CisgICAgfQorICB9CisKKworICAvKiBpbml0IG9teCBoYW5kbGUgcXVldWUgKi8KKyAgcF9zZXNzaW9uX2hhbmRsZV9xID0gKG1tX2pwZWdfcXVldWVfdCAqKSBtYWxsb2Moc2l6ZW9mKCpwX3Nlc3Npb25faGFuZGxlX3EpKTsKKyAgaWYgKE5VTEwgPT0gcF9zZXNzaW9uX2hhbmRsZV9xKSB7CisgICAgTE9HRSgiRXJyb3IiKTsKKyAgICBnb3RvIGVycm9yMTsKKyAgfQorICByYyA9IG1tX2pwZWdfcXVldWVfaW5pdChwX3Nlc3Npb25faGFuZGxlX3EpOworICBpZiAoMCAhPSByYykgeworICAgIExPR0UoIkVycm9yIik7CisgICAgZnJlZShwX3Nlc3Npb25faGFuZGxlX3EpOworICAgIGdvdG8gZXJyb3IxOworICB9CisKKyAgLyogaW5pdCBvdXRwdXQgYnVmIHF1ZXVlICovCisgIHBfb3V0X2J1Zl9xID0gKG1tX2pwZWdfcXVldWVfdCAqKSBtYWxsb2Moc2l6ZW9mKCpwX291dF9idWZfcSkpOworICBpZiAoTlVMTCA9PSBwX291dF9idWZfcSkgeworICAgIExPR0UoIkVycm9yOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBpbml0IG9teCBoYW5kbGUgcXVldWUgKi8KKyAgcmMgPSBtbV9qcGVnX3F1ZXVlX2luaXQocF9vdXRfYnVmX3EpOworICBpZiAoMCAhPSByYykgeworICAgIExPR0UoIkVycm9yIik7CisgICAgZnJlZShwX291dF9idWZfcSk7CisgICAgZ290byBlcnJvcjE7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgbnVtX29teF9zZXNzaW9uczsgaSsrKSB7CisgICAgdWludDMyX3QgYnVmX2lkeCA9IDBVOworICAgIHNlc3Npb25faWR4ID0gbW1fanBlZ19nZXRfbmV3X3Nlc3Npb25faWR4KG15X29iaiwgY2xudF9pZHgsICZwX3Nlc3Npb24pOworICAgIGlmIChzZXNzaW9uX2lkeCA8IDAgfHwgTlVMTCA9PSBwX3Nlc3Npb24pIHsKKyAgICAgIExPR0UoImludmFsaWQgc2Vzc2lvbiBpZCAoJWQpIiwgc2Vzc2lvbl9pZHgpOworICAgICAgZ290byBlcnJvcjI7CisgICAgfQorCisgICAgc25wcmludGYodHJhY2VfdGFnLCBzaXplb2YodHJhY2VfdGFnKSwgIkNhbWVyYTpKUEVHc2Vzc2lvbiVkIiwgc2Vzc2lvbl9pZHgpOworICAgIEFUUkFDRV9JTlQodHJhY2VfdGFnLCAxKTsKKworICAgIHBfc2Vzc2lvbi0+am9iX2luZGV4ID0gMDsKKworICAgIHBfc2Vzc2lvbi0+bmV4dF9zZXNzaW9uID0gTlVMTDsKKworICAgIGlmIChwX3ByZXZfc2Vzc2lvbikgeworICAgICAgcF9wcmV2X3Nlc3Npb24tPm5leHRfc2Vzc2lvbiA9IHBfc2Vzc2lvbjsKKyAgICB9CisgICAgcF9wcmV2X3Nlc3Npb24gPSBwX3Nlc3Npb247CisKKyAgICBidWZfaWR4ID0gaTsKKyAgICBpZiAoYnVmX2lkeCA8IE1NX0pQRUdfQ09OQ1VSUkVOVF9TRVNTSU9OU19DT1VOVCkgeworICAgICAgcF9zZXNzaW9uLT53b3JrX2J1ZmZlciA9IG15X29iai0+aW9uQnVmZmVyW2J1Zl9pZHhdOworICAgIH0gZWxzZSB7CisgICAgICBMT0dFKCJJbnZhbGlkIEluZGV4LCBTZXR0aW5nIGJ1ZmZlciBhZGQgdG8gbnVsbCIpOworICAgICAgcF9zZXNzaW9uLT53b3JrX2J1ZmZlci5hZGRyID0gTlVMTDsKKyAgICAgIHBfc2Vzc2lvbi0+d29ya19idWZmZXIuaW9uX2ZkID0gLTE7CisgICAgICBwX3Nlc3Npb24tPndvcmtfYnVmZmVyLnBfcG1lbV9mZCA9IC0xOworICAgIH0KKworICAgIHBfc2Vzc2lvbi0+anBlZ19vYmogPSAodm9pZCopbXlfb2JqOyAvKiBzYXZlIGEgcHRyIHRvIGpwZWdfb2JqICovCisKKyAgICAvKmNvcHkgdGhlIHBhcmFtcyovCisgICAgcF9zZXNzaW9uLT5wYXJhbXMgPSAqcF9wYXJhbXM7CisgICAgcmV0ID0gbW1fanBlZ19zZXNzaW9uX2NyZWF0ZShwX3Nlc3Npb24pOworICAgIGlmIChPTVhfRXJyb3JOb25lICE9IHJldCkgeworICAgICAgcF9zZXNzaW9uLT5hY3RpdmUgPSBPTVhfRkFMU0U7CisgICAgICBMT0dFKCJqcGVnIHNlc3Npb24gY3JlYXRlIGZhaWxlZCIpOworICAgICAgZ290byBlcnJvcjI7CisgICAgfQorCisgICAgdWludDMyX3Qgc2Vzc2lvbl9pZCA9IChKT0JfSURfTUFHSUNWQUwgPDwgMjQpIHwKKyAgICAgICAgKCh1aW50MzJfdClzZXNzaW9uX2lkeCA8PCA4KSB8IGNsbnRfaWR4OworCisgICAgaWYgKCEqcF9zZXNzaW9uX2lkKSB7CisgICAgICAqcF9zZXNzaW9uX2lkID0gc2Vzc2lvbl9pZDsKKyAgICB9CisKKyAgICBpZiAocF9zZXNzaW9uLT50aHVtYl9mcm9tX21haW4pIHsKKyAgICAgIG1lbWNweShwX3Nlc3Npb24tPnBhcmFtcy5zcmNfdGh1bWJfYnVmLCBwX3Nlc3Npb24tPnBhcmFtcy5zcmNfbWFpbl9idWYsCisgICAgICAgIHNpemVvZihwX3Nlc3Npb24tPnBhcmFtcy5zcmNfdGh1bWJfYnVmKSk7CisgICAgICBwX3Nlc3Npb24tPnBhcmFtcy5udW1fdG1iX2J1ZnMgPSAgcF9zZXNzaW9uLT5wYXJhbXMubnVtX3NyY19idWZzOworICAgICAgaWYgKCFwX3Nlc3Npb24tPnBhcmFtcy5lbmNvZGVfdGh1bWJuYWlsKSB7CisgICAgICAgICBwX3Nlc3Npb24tPnBhcmFtcy5udW1fdG1iX2J1ZnMgPSAwOworICAgICAgfQorICAgICAgcF9zZXNzaW9uLT5wYXJhbXMudGh1bWJfZGltLnNyY19kaW0gPSBwX3Nlc3Npb24tPnBhcmFtcy5tYWluX2RpbS5zcmNfZGltOworICAgICAgcF9zZXNzaW9uLT5wYXJhbXMudGh1bWJfZGltLmNyb3AgPSBwX3Nlc3Npb24tPnBhcmFtcy5tYWluX2RpbS5jcm9wOworICAgIH0KKyNpZmRlZiBMSUIyRF9ST1RBVElPTl9FTkFCTEUKKyAgICBpZiAocF9zZXNzaW9uLT5wYXJhbXMucm90YXRpb24pIHsKKyAgICAgIExPR0QoIkVuYWJsZSBsaWIyZCByb3RhdGlvbiIpOworICAgICAgcF9zZXNzaW9uLT5saWIyZF9yb3RhdGlvbl9mbGFnID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgTE9HRCgiRGlzYWJsZSBsaWIyZCByb3RhdGlvbiIpOworICAgICAgcF9zZXNzaW9uLT5saWIyZF9yb3RhdGlvbl9mbGFnID0gMDsKKyAgICB9CisjZWxzZQorICAgIHBfc2Vzc2lvbi0+bGliMmRfcm90YXRpb25fZmxhZyA9IDA7CisjZW5kaWYKKworICAgIGlmIChwX3Nlc3Npb24tPmxpYjJkX3JvdGF0aW9uX2ZsYWcpIHsKKyAgICAgIHBfc2Vzc2lvbi0+bnVtX3NyY19yb3RfYnVmcyA9IHBfc2Vzc2lvbi0+cGFyYW1zLm51bV9zcmNfYnVmczsKKyAgICAgIG1lbXNldChwX3Nlc3Npb24tPnNyY19yb3RfbWFpbl9idWYsIDAsCisgICAgICAgIHNpemVvZihwX3Nlc3Npb24tPnNyY19yb3RfbWFpbl9idWYpKTsKKworICAgICAgZm9yIChqID0gMDsgaiA8IHBfc2Vzc2lvbi0+bnVtX3NyY19yb3RfYnVmczsgaisrKSB7CisgICAgICAgIHBfc2Vzc2lvbi0+c3JjX3JvdF9tYWluX2J1ZltqXS5idWZfc2l6ZSA9CisgICAgICAgICAgcF9zZXNzaW9uLT5wYXJhbXMuc3JjX21haW5fYnVmW2pdLmJ1Zl9zaXplOworICAgICAgICBwX3Nlc3Npb24tPnNyY19yb3RfbWFpbl9idWZbal0uZm9ybWF0ID0KKyAgICAgICAgICBwX3Nlc3Npb24tPnBhcmFtcy5zcmNfbWFpbl9idWZbal0uZm9ybWF0OworICAgICAgICBwX3Nlc3Npb24tPnNyY19yb3RfbWFpbl9idWZbal0uaW5kZXggPSBqOworCisgICAgICAgIG1lbXNldCgmcF9zZXNzaW9uLT5zcmNfcm90X2lvbl9idWZmZXJbal0sIDAsIHNpemVvZihidWZmZXJfdCkpOworICAgICAgICBwX3Nlc3Npb24tPnNyY19yb3RfaW9uX2J1ZmZlcltqXS5zaXplID0KKyAgICAgICAgICBwX3Nlc3Npb24tPnNyY19yb3RfbWFpbl9idWZbal0uYnVmX3NpemU7CisgICAgICAgIHBfc2Vzc2lvbi0+c3JjX3JvdF9pb25fYnVmZmVyW2pdLmFkZHIgPQorICAgICAgICAgICh1aW50OF90ICopYnVmZmVyX2FsbG9jYXRlKCZwX3Nlc3Npb24tPnNyY19yb3RfaW9uX2J1ZmZlcltqXSwgMSk7CisKKyAgICAgICAgaWYgKE5VTEwgPT0gcF9zZXNzaW9uLT5zcmNfcm90X2lvbl9idWZmZXJbal0uYWRkcikgeworICAgICAgICAgIExPR0UoIklvbiBidWZmIGFsbG9jIGZvciByb3RhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAvLyBkZWFsbG9jYXRlIGFsbCBwcmV2aW91c2x5IGFsbG9jYXRlZCByb3RhdGlvbiBpb24gYnVmZnMKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcF9zZXNzaW9uLT5udW1fc3JjX3JvdF9idWZzOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChwX3Nlc3Npb24tPnNyY19yb3RfaW9uX2J1ZmZlcltqXS5hZGRyKSB7CisgICAgICAgICAgICAgIGJ1ZmZlcl9kZWFsbG9jYXRlKCZwX3Nlc3Npb24tPnNyY19yb3RfaW9uX2J1ZmZlcltqXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIC8vZmFsbCBiYWNrIHRvIFNXIGVuY29kaW5nIGZvciByb3RhdGlvbgorICAgICAgICAgIHBfc2Vzc2lvbi0+bGliMmRfcm90YXRpb25fZmxhZyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcF9zZXNzaW9uLT5zcmNfcm90X21haW5fYnVmW2pdLmJ1Zl92YWRkciA9CisgICAgICAgICAgICBwX3Nlc3Npb24tPnNyY19yb3RfaW9uX2J1ZmZlcltqXS5hZGRyOworICAgICAgICAgIHBfc2Vzc2lvbi0+c3JjX3JvdF9tYWluX2J1ZltqXS5mZCA9CisgICAgICAgICAgICBwX3Nlc3Npb24tPnNyY19yb3RfaW9uX2J1ZmZlcltqXS5wX3BtZW1fZmQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBwX3Nlc3Npb24tPmNsaWVudF9oZGwgPSBjbGllbnRfaGRsOworICAgIHBfc2Vzc2lvbi0+c2Vzc2lvbklkID0gc2Vzc2lvbl9pZDsKKyAgICBwX3Nlc3Npb24tPnNlc3Npb25faGFuZGxlX3EgPSBwX3Nlc3Npb25faGFuZGxlX3E7CisgICAgcF9zZXNzaW9uLT5vdXRfYnVmX3EgPSBwX291dF9idWZfcTsKKworICAgIHFkYXRhLnAgPSBwX3Nlc3Npb247CisgICAgbW1fanBlZ19xdWV1ZV9lbnEocF9zZXNzaW9uX2hhbmRsZV9xLCBxZGF0YSk7CisKKyAgICBwX3Nlc3Npb24tPm1ldGFfZW5jX2tleSA9IE5VTEw7CisgICAgcF9zZXNzaW9uLT5tZXRhX2VuY19rZXlsZW4gPSAwOworCisjaWZkZWYgTU1fSlBFR19SRUFEX01FVEFfS0VZRklMRQorICAgIG1tX2pwZWdfcmVhZF9tZXRhX2tleWZpbGUocF9zZXNzaW9uLCBNRVRBX0tFWUZJTEUpOworI2VuZGlmCisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+am9iX2xvY2spOworICAgIC8qIENvbmZpZ3VyZSBzZXNzaW9uIGlmIG5vdCBhbHJlYWR5IGNvbmZpZ3VyZWQgYW5kIGlmCisgICAgICAgbm8gb3RoZXIgc2Vzc2lvbiBjb25maWd1cmVkKi8KKyAgICBpZiAoKE9NWF9GQUxTRSA9PSBwX3Nlc3Npb24tPmNvbmZpZykgJiYKKyAgICAgIChteV9vYmotPnBfc2Vzc2lvbl9pbnByb2dyZXNzID09IE5VTEwpKSB7CisgICAgICByYyA9IG1tX2pwZWdfc2Vzc2lvbl9jb25maWd1cmUocF9zZXNzaW9uKTsKKyAgICAgIGlmIChyYykgeworICAgICAgICBMT0dFKCJFcnJvciIpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5qb2JfbG9jayk7CisgICAgICAgIGdvdG8gZXJyb3IyOworICAgICAgfQorICAgICAgcF9zZXNzaW9uLT5jb25maWcgPSBPTVhfVFJVRTsKKyAgICAgIG15X29iai0+cF9zZXNzaW9uX2lucHJvZ3Jlc3MgPSBwX3Nlc3Npb247CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmpvYl9sb2NrKTsKKyAgICBwX3Nlc3Npb24tPm51bV9vbXhfc2Vzc2lvbnMgPSBudW1fb214X3Nlc3Npb25zOworCisgICAgTE9HSCgic2Vzc2lvbiBpZCAleCB0aHVtYl9mcm9tX21haW4gJWQiLAorICAgICAgc2Vzc2lvbl9pZCwgcF9zZXNzaW9uLT50aHVtYl9mcm9tX21haW4pOworICB9CisKKyAgLy8gUXVldWUgdGhlIG91dHB1dCBidWYgaW5kZXhlcworICBmb3IgKGkgPSAwOyBpIDwgcF9wYXJhbXMtPm51bV9kc3RfYnVmczsgaSsrKSB7CisgICAgcWRhdGEudTMyID0gaSArIDE7CisgICAgbW1fanBlZ19xdWV1ZV9lbnEocF9vdXRfYnVmX3EsIHFkYXRhKTsKKyAgfQorCisgIHJldHVybiByYzsKKworZXJyb3IxOgorICByYyA9IC0xOworZXJyb3IyOgorICBpZiAoTlVMTCAhPSBwX3Nlc3Npb24pIHsKKyAgICBBVFJBQ0VfSU5UKHRyYWNlX3RhZywgMCk7CisgIH0KKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ2VuY19kZXN0cm95X2pvYgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAcF9zZXNzaW9uOiBTZXNzaW9uIG9iagorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIGZvciBzdWNjZXNzIGVsc2UgZmFpbHVyZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIERlc3Ryb3kgdGhlIGpvYiBiYXNlZCBwYXJhbWVudGVycworICoKKyAqKi8KK3N0YXRpYyBpbnQzMl90IG1tX2pwZWdlbmNfZGVzdHJveV9qb2IobW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24pCit7CisgIG1tX2pwZWdfZW5jb2RlX2pvYl90ICpwX2pvYnBhcmFtcyA9ICZwX3Nlc3Npb24tPmVuY29kZV9qb2I7CisgIGludCBpID0gMCwgcmMgPSAwOworCisgIExPR0QoIkV4aWYgZW50cnkgY291bnQgJWQgJWQiLAorICAgIChpbnQpcF9qb2JwYXJhbXMtPmV4aWZfaW5mby5udW1PZkVudHJpZXMsCisgICAgKGludClwX3Nlc3Npb24tPmV4aWZfY291bnRfbG9jYWwpOworICBmb3IgKGkgPSAwOyBpIDwgcF9zZXNzaW9uLT5leGlmX2NvdW50X2xvY2FsOyBpKyspIHsKKyAgICByYyA9IHJlbGVhc2VFeGlmRW50cnkoJnBfc2Vzc2lvbi0+ZXhpZl9pbmZvX2xvY2FsW2ldKTsKKyAgICBpZiAocmMpIHsKKyAgICAgIExPR0UoIkV4aWYgcmVsZWFzZSBmYWlsZWQgKCVkKSIsIHJjKTsKKyAgICB9CisgIH0KKyAgcF9zZXNzaW9uLT5leGlmX2NvdW50X2xvY2FsID0gMDsKKworICByZXR1cm4gcmM7Cit9CisKKy8qKiBtbV9qcGVnX3Nlc3Npb25fZW5jb2RlOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAcF9zZXNzaW9uOiBlbmNvZGUgc2Vzc2lvbgorICoKKyAqICBSZXR1cm46CisgKiAgICAgICBPTVhfRVJST1JUWVBFCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgU3RhcnQgdGhlIGVuY29kaW5nCisgKgorICoqLworc3RhdGljIHZvaWQgbW1fanBlZ2VuY19qb2JfZG9uZShtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKnBfc2Vzc2lvbikKK3sKKyAgbW1fanBlZ19xX2RhdGFfdCBxZGF0YTsKKyAgbW1fanBlZ19vYmogKm15X29iaiA9IChtbV9qcGVnX29iaiAqKXBfc2Vzc2lvbi0+anBlZ19vYmo7CisgIG1tX2pwZWdfam9iX3Ffbm9kZV90ICpub2RlID0gTlVMTDsKKworICAvKkRlc3Ryb3kgam9iIHJlbGF0ZWQgcGFyYW1zKi8KKyAgbW1fanBlZ2VuY19kZXN0cm95X2pvYihwX3Nlc3Npb24pOworCisgIC8qcmVtb3ZlIHRoZSBqb2IqLworICBub2RlID0gbW1fanBlZ19xdWV1ZV9yZW1vdmVfam9iX2J5X2pvYl9pZCgmbXlfb2JqLT5vbmdvaW5nX2pvYl9xLAorICAgIHBfc2Vzc2lvbi0+am9iSWQpOworICBpZiAobm9kZSkgeworICAgIGZyZWUobm9kZSk7CisgIH0KKyAgcF9zZXNzaW9uLT5lbmNvZGluZyA9IE9NWF9GQUxTRTsKKworICAvLyBRdWV1ZSB0byBhdmFpbGFibGUgc2Vzc2lvbnMKKyAgcWRhdGEucCA9IHBfc2Vzc2lvbjsKKyAgbW1fanBlZ19xdWV1ZV9lbnEocF9zZXNzaW9uLT5zZXNzaW9uX2hhbmRsZV9xLCBxZGF0YSk7CisKKyAgaWYgKHBfc2Vzc2lvbi0+YXV0b19vdXRfYnVmKSB7CisgICAgLy9RdWV1ZSBvdXQgYnVmIGluZGV4CisgICAgcWRhdGEudTMyID0gKHVpbnQzMl90KShwX3Nlc3Npb24tPmVuY29kZV9qb2IuZHN0X2luZGV4ICsgMSk7CisgICAgbW1fanBlZ19xdWV1ZV9lbnEocF9zZXNzaW9uLT5vdXRfYnVmX3EsIHFkYXRhKTsKKyAgfQorCisgIC8qIHdha2UgdXAgam9iTWdyIHRocmVhZCB0byB3b3JrIG9uIG5ldyBqb2IgaWYgdGhlcmUgaXMgYW55ICovCisgIGNhbV9zZW1fcG9zdCgmbXlfb2JqLT5qb2JfbWdyLmpvYl9zZW0pOworfQorCisvKiogbW1fanBlZ19kZXN0cm95X3Nlc3Npb246CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBteV9vYmo6IGpwZWcgb2JqZWN0CisgKiAgICBAc2Vzc2lvbl9pZDogc2Vzc2lvbiBpbmRleAorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIGZvciBzdWNjZXNzIGVsc2UgZmFpbHVyZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIERlc3Ryb3kgdGhlIGVuY29kaW5nIHNlc3Npb24KKyAqCisgKiovCitpbnQzMl90IG1tX2pwZWdfZGVzdHJveV9zZXNzaW9uKG1tX2pwZWdfb2JqICpteV9vYmosCisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uKQoreworICBtbV9qcGVnX3FfZGF0YV90IHFkYXRhOworICBpbnQzMl90IHJjID0gMDsKKyAgbW1fanBlZ19qb2JfcV9ub2RlX3QgKm5vZGUgPSBOVUxMOworICB1aW50MzJfdCBzZXNzaW9uX2lkID0gMDsKKyAgbW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX2N1cl9zZXNzOworICBjaGFyIHRyYWNlX3RhZ1szMl07CisKKyAgaWYgKE5VTEwgPT0gcF9zZXNzaW9uKSB7CisgICAgTE9HRSgiaW52YWxpZCBzZXNzaW9uIik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgc2Vzc2lvbl9pZCA9IHBfc2Vzc2lvbi0+c2Vzc2lvbklkOworCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXlfb2JqLT5qb2JfbG9jayk7CisKKyAgLyogYWJvcnQgam9iIGlmIGluIHRvZG8gcXVldWUgKi8KKyAgTE9HRCgiYWJvcnQgdG9kbyBqb2JzIik7CisgIG5vZGUgPSBtbV9qcGVnX3F1ZXVlX3JlbW92ZV9qb2JfYnlfc2Vzc2lvbl9pZCgmbXlfb2JqLT5qb2JfbWdyLmpvYl9xdWV1ZSwgc2Vzc2lvbl9pZCk7CisgIHdoaWxlIChOVUxMICE9IG5vZGUpIHsKKyAgICBmcmVlKG5vZGUpOworICAgIG5vZGUgPSBtbV9qcGVnX3F1ZXVlX3JlbW92ZV9qb2JfYnlfc2Vzc2lvbl9pZCgmbXlfb2JqLT5qb2JfbWdyLmpvYl9xdWV1ZSwgc2Vzc2lvbl9pZCk7CisgIH0KKworICAvKiBhYm9ydCBqb2IgaWYgaW4gb25nb2luZyBxdWV1ZSAqLworICBMT0dEKCJhYm9ydCBvbmdvaW5nIGpvYnMiKTsKKyAgbm9kZSA9IG1tX2pwZWdfcXVldWVfcmVtb3ZlX2pvYl9ieV9zZXNzaW9uX2lkKCZteV9vYmotPm9uZ29pbmdfam9iX3EsIHNlc3Npb25faWQpOworICB3aGlsZSAoTlVMTCAhPSBub2RlKSB7CisgICAgZnJlZShub2RlKTsKKyAgICBub2RlID0gbW1fanBlZ19xdWV1ZV9yZW1vdmVfam9iX2J5X3Nlc3Npb25faWQoJm15X29iai0+b25nb2luZ19qb2JfcSwgc2Vzc2lvbl9pZCk7CisgIH0KKworICAvKiBhYm9ydCB0aGUgY3VycmVudCBzZXNzaW9uICovCisgIG1tX2pwZWdfc2Vzc2lvbl9hYm9ydChwX3Nlc3Npb24pOworICBtbV9qcGVnX3Nlc3Npb25fZGVzdHJveShwX3Nlc3Npb24pOworCisgIHBfY3VyX3Nlc3MgPSBwX3Nlc3Npb247CisKKyAgZG8geworICAgIG1tX2pwZWdfcmVtb3ZlX3Nlc3Npb25faWR4KG15X29iaiwgcF9jdXJfc2Vzcy0+c2Vzc2lvbklkKTsKKyAgfSB3aGlsZSAoTlVMTCAhPSAocF9jdXJfc2VzcyA9IHBfY3VyX3Nlc3MtPm5leHRfc2Vzc2lvbikpOworCisKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+am9iX2xvY2spOworCisgIHdoaWxlICgxKSB7CisgICAgcWRhdGEgPSBtbV9qcGVnX3F1ZXVlX2RlcShwX3Nlc3Npb24tPnNlc3Npb25faGFuZGxlX3EpOworICAgIGlmIChOVUxMID09IHFkYXRhLnApCisgICAgICBicmVhazsKKyAgfQorICBtbV9qcGVnX3F1ZXVlX2RlaW5pdChwX3Nlc3Npb24tPnNlc3Npb25faGFuZGxlX3EpOworICBmcmVlKHBfc2Vzc2lvbi0+c2Vzc2lvbl9oYW5kbGVfcSk7CisgIHBfc2Vzc2lvbi0+c2Vzc2lvbl9oYW5kbGVfcSA9IE5VTEw7CisKKyAgd2hpbGUgKDEpIHsKKyAgICBxZGF0YSA9IG1tX2pwZWdfcXVldWVfZGVxKHBfc2Vzc2lvbi0+b3V0X2J1Zl9xKTsKKyAgICBpZiAoMFUgPT0gcWRhdGEudTMyKQorICAgICAgYnJlYWs7CisgIH0KKyAgbW1fanBlZ19xdWV1ZV9kZWluaXQocF9zZXNzaW9uLT5vdXRfYnVmX3EpOworICBmcmVlKHBfc2Vzc2lvbi0+b3V0X2J1Zl9xKTsKKyAgcF9zZXNzaW9uLT5vdXRfYnVmX3EgPSBOVUxMOworCisKKyAgLyogd2FrZSB1cCBqb2JNZ3IgdGhyZWFkIHRvIHdvcmsgb24gbmV3IGpvYiBpZiB0aGVyZSBpcyBhbnkgKi8KKyAgY2FtX3NlbV9wb3N0KCZteV9vYmotPmpvYl9tZ3Iuam9iX3NlbSk7CisKKyAgc25wcmludGYodHJhY2VfdGFnLCBzaXplb2YodHJhY2VfdGFnKSwgIkNhbWVyYTpKUEVHc2Vzc2lvbiVkIiwgR0VUX1NFU1NJT05fSURYKHNlc3Npb25faWQpKTsKKyAgQVRSQUNFX0lOVCh0cmFjZV90YWcsIDApOworCisgIExPR0goImRlc3Ryb3kgc2Vzc2lvbiBzdWNjZXNzZnVsLiBYIik7CisKKyAgcmV0dXJuIHJjOworfQorCisKKworCisvKiogbW1fanBlZ19kZXN0cm95X3Nlc3Npb246CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBteV9vYmo6IGpwZWcgb2JqZWN0CisgKiAgICBAc2Vzc2lvbl9pZDogc2Vzc2lvbiBpbmRleAorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIGZvciBzdWNjZXNzIGVsc2UgZmFpbHVyZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIERlc3Ryb3kgdGhlIGVuY29kaW5nIHNlc3Npb24KKyAqCisgKiovCitpbnQzMl90IG1tX2pwZWdfZGVzdHJveV9zZXNzaW9uX3VubG9ja2VkKG1tX2pwZWdfb2JqICpteV9vYmosCisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uKQoreworICBpbnQzMl90IHJjID0gLTE7CisgIG1tX2pwZWdfam9iX3Ffbm9kZV90ICpub2RlID0gTlVMTDsKKyAgdWludDMyX3Qgc2Vzc2lvbl9pZCA9IDA7CisgIGlmIChOVUxMID09IHBfc2Vzc2lvbikgeworICAgIExPR0UoImludmFsaWQgc2Vzc2lvbiIpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIHNlc3Npb25faWQgPSBwX3Nlc3Npb24tPnNlc3Npb25JZDsKKworICAvKiBhYm9ydCBqb2IgaWYgaW4gdG9kbyBxdWV1ZSAqLworICBMT0dEKCJhYm9ydCB0b2RvIGpvYnMiKTsKKyAgbm9kZSA9IG1tX2pwZWdfcXVldWVfcmVtb3ZlX2pvYl9ieV9zZXNzaW9uX2lkKCZteV9vYmotPmpvYl9tZ3Iuam9iX3F1ZXVlLCBzZXNzaW9uX2lkKTsKKyAgd2hpbGUgKE5VTEwgIT0gbm9kZSkgeworICAgIGZyZWUobm9kZSk7CisgICAgbm9kZSA9IG1tX2pwZWdfcXVldWVfcmVtb3ZlX2pvYl9ieV9zZXNzaW9uX2lkKCZteV9vYmotPmpvYl9tZ3Iuam9iX3F1ZXVlLCBzZXNzaW9uX2lkKTsKKyAgfQorCisgIC8qIGFib3J0IGpvYiBpZiBpbiBvbmdvaW5nIHF1ZXVlICovCisgIExPR0QoImFib3J0IG9uZ29pbmcgam9icyIpOworICBub2RlID0gbW1fanBlZ19xdWV1ZV9yZW1vdmVfam9iX2J5X3Nlc3Npb25faWQoJm15X29iai0+b25nb2luZ19qb2JfcSwgc2Vzc2lvbl9pZCk7CisgIHdoaWxlIChOVUxMICE9IG5vZGUpIHsKKyAgICBmcmVlKG5vZGUpOworICAgIG5vZGUgPSBtbV9qcGVnX3F1ZXVlX3JlbW92ZV9qb2JfYnlfc2Vzc2lvbl9pZCgmbXlfb2JqLT5vbmdvaW5nX2pvYl9xLCBzZXNzaW9uX2lkKTsKKyAgfQorCisgIC8qIGFib3J0IHRoZSBjdXJyZW50IHNlc3Npb24gKi8KKyAgbW1fanBlZ19zZXNzaW9uX2Fib3J0KHBfc2Vzc2lvbik7CisgIC8vbW1fanBlZ19yZW1vdmVfc2Vzc2lvbl9pZHgobXlfb2JqLCBzZXNzaW9uX2lkKTsKKworICByZXR1cm4gcmM7Cit9CisKKy8qKiBtbV9qcGVnX2Rlc3Ryb3lfc2Vzc2lvbjoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQG15X29iajoganBlZyBvYmplY3QKKyAqICAgIEBzZXNzaW9uX2lkOiBzZXNzaW9uIGluZGV4CisgKgorICogIFJldHVybjoKKyAqICAgICAgIDAgZm9yIHN1Y2Nlc3MgZWxzZSBmYWlsdXJlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgRGVzdHJveSB0aGUgZW5jb2Rpbmcgc2Vzc2lvbgorICoKKyAqKi8KK2ludDMyX3QgbW1fanBlZ19kZXN0cm95X3Nlc3Npb25fYnlfaWQobW1fanBlZ19vYmogKm15X29iaiwgdWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKyAgbW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24gPSBtbV9qcGVnX2dldF9zZXNzaW9uKG15X29iaiwgc2Vzc2lvbl9pZCk7CisKKyAgcmV0dXJuIG1tX2pwZWdfZGVzdHJveV9zZXNzaW9uKG15X29iaiwgcF9zZXNzaW9uKTsKK30KKworCisKKy8qKiBtbV9qcGVnX2Nsb3NlOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAbXlfb2JqOiBqcGVnIG9iamVjdAorICogICAgQGNsaWVudF9oZGw6IGNsaWVudCBoYW5kbGUKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBmb3Igc3VjY2VzcyBlbHNlIGZhaWx1cmUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDbG9zZSB0aGUganBlZyBjbGllbnQKKyAqCisgKiovCitpbnQzMl90IG1tX2pwZWdfY2xvc2UobW1fanBlZ19vYmogKm15X29iaiwgdWludDMyX3QgY2xpZW50X2hkbCkKK3sKKyAgaW50MzJfdCByYyA9IC0xOworICB1aW50OF90IGNsbnRfaWR4ID0gMDsKKyAgaW50IGkgPSAwOworCisgIC8qIGNoZWNrIGlmIHZhbGlkIGNsaWVudCAqLworICBjbG50X2lkeCA9IG1tX2pwZWdfdXRpbF9nZXRfaW5kZXhfYnlfaGFuZGxlcihjbGllbnRfaGRsKTsKKyAgaWYgKGNsbnRfaWR4ID49IE1BWF9KUEVHX0NMSUVOVF9OVU0pIHsKKyAgICBMT0dFKCJpbnZhbGlkIGNsaWVudCB3aXRoIGhhbmRsZXIgKCVkKSIsIGNsaWVudF9oZGwpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIExPR0QoIkUiKTsKKworICAvKiBhYm9ydCBhbGwgam9icyBmcm9tIHRoZSBjbGllbnQgKi8KKyAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmpvYl9sb2NrKTsKKworICBmb3IgKGkgPSAwOyBpIDwgTU1fSlBFR19NQVhfU0VTU0lPTjsgaSsrKSB7CisgICAgaWYgKE9NWF9UUlVFID09IG15X29iai0+Y2xudF9tZ3JbY2xudF9pZHhdLnNlc3Npb25baV0uYWN0aXZlKQorICAgICAgbW1fanBlZ19kZXN0cm95X3Nlc3Npb25fdW5sb2NrZWQobXlfb2JqLAorICAgICAgICAmbXlfb2JqLT5jbG50X21ncltjbG50X2lkeF0uc2Vzc2lvbltpXSk7CisgIH0KKworI2lmZGVmIExPQURfQURTUF9SUENfTElCCisgIGlmIChOVUxMICE9IG15X29iai0+YWRzcHJwY19saWJfaGFuZGxlKSB7CisgICAgZGxjbG9zZShteV9vYmotPmFkc3BycGNfbGliX2hhbmRsZSk7CisgICAgbXlfb2JqLT5hZHNwcnBjX2xpYl9oYW5kbGUgPSBOVUxMOworICB9CisjZW5kaWYKKworICBwdGhyZWFkX211dGV4X3VubG9jaygmbXlfb2JqLT5qb2JfbG9jayk7CisKKyAgLyogaW52YWxpZGF0ZSBjbGllbnQgc2Vzc2lvbiAqLworICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm15X29iai0+Y2xudF9tZ3JbY2xudF9pZHhdLmxvY2spOworICBtZW1zZXQoJm15X29iai0+Y2xudF9tZ3JbY2xudF9pZHhdLCAwLCBzaXplb2YobW1fanBlZ19jbGllbnRfdCkpOworCisgIHJjID0gMDsKKyAgTE9HRCgiWCIpOworICByZXR1cm4gcmM7Cit9CisKK09NWF9FUlJPUlRZUEUgbW1fanBlZ19lYmQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgT01YX1BUUiBwQXBwRGF0YSwKKyAgT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpCit7CisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uID0gKG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqKSBwQXBwRGF0YTsKKworICBMT0dIKCJjb3VudCAlZCAiLCBwX3Nlc3Npb24tPmViZF9jb3VudCk7CisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKyAgcF9zZXNzaW9uLT5lYmRfY291bnQrKzsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgIHJldHVybiAwOworfQorCitPTVhfRVJST1JUWVBFIG1tX2pwZWdfZmJkKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgIE9NWF9QVFIgcEFwcERhdGEsCisgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKQoreworICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uID0gKG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqKSBwQXBwRGF0YTsKKyAgbW1fanBlZ19vdXRwdXRfdCBvdXRwdXRfYnVmOworICBMT0dJKCJjb3VudCAlZCAiLCBwX3Nlc3Npb24tPmZiZF9jb3VudCk7CisgIExPR0koIktQSSBQZXJmXSA6IFBST0ZJTEVfSlBFR19GQkQiKTsKKworICBwdGhyZWFkX211dGV4X2xvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgIEtQSV9BVFJBQ0VfSU5UKCJDYW1lcmE6SlBFRyIsCisgICAgICAoaW50MzJfdCkoKHVpbnQzMl90KUdFVF9TRVNTSU9OX0lEWCgKKyAgICAgICAgcF9zZXNzaW9uLT5zZXNzaW9uSWQpPDwxNiB8IC0tcF9zZXNzaW9uLT5qb2JfaW5kZXgpKTsKKyAgaWYgKE1NX0pQRUdfQUJPUlRfTk9ORSAhPSBwX3Nlc3Npb24tPmFib3J0X3N0YXRlKSB7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgICAgcmV0dXJuIHJldDsKKyAgfQorI2lmZGVmIE1NX0pQRUdfRFVNUF9PVVRfQlMKKyAgY2hhciBmaWxlbmFtZVsyNTZdOworICBzdGF0aWMgaW50IGJzYzsKKyAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksCisgICAgICBRQ0FNRVJBX0RVTVBfRlJNX0xPQ0FUSU9OImpwZWcvbW1fanBlZ19icyVkLmpwZyIsIGJzYysrKTsKKyAgRFVNUF9UT19GSUxFKGZpbGVuYW1lLAorICAgIHBCdWZmZXItPnBCdWZmZXIsCisgICAgKHNpemVfdCkodWludDMyX3QpcEJ1ZmZlci0+bkZpbGxlZExlbik7CisjZW5kaWYKKworICBwX3Nlc3Npb24tPmZiZF9jb3VudCsrOworICBpZiAoTlVMTCAhPSBwX3Nlc3Npb24tPnBhcmFtcy5qcGVnX2NiKSB7CisKKyAgICBwX3Nlc3Npb24tPmpvYl9zdGF0dXMgPSBKUEVHX0pPQl9TVEFUVVNfRE9ORTsKKyAgICBvdXRwdXRfYnVmLmJ1Zl9maWxsZWRfbGVuID0gKHVpbnQzMl90KXBCdWZmZXItPm5GaWxsZWRMZW47CisgICAgb3V0cHV0X2J1Zi5idWZfdmFkZHIgPSBwQnVmZmVyLT5wQnVmZmVyOworICAgIG91dHB1dF9idWYuZmQgPSAtMTsKKyAgICBMT0dIKCJzZW5kIGpwZWcgY2FsbGJhY2sgJWQgYnVmIDB4JXAgbGVuICV1IEpvYklEICV1IiwKKyAgICAgIHBfc2Vzc2lvbi0+am9iX3N0YXR1cywgcEJ1ZmZlci0+cEJ1ZmZlciwKKyAgICAgICh1bnNpZ25lZCBpbnQpcEJ1ZmZlci0+bkZpbGxlZExlbiwgcF9zZXNzaW9uLT5qb2JJZCk7CisgICAgcF9zZXNzaW9uLT5wYXJhbXMuanBlZ19jYihwX3Nlc3Npb24tPmpvYl9zdGF0dXMsCisgICAgICBwX3Nlc3Npb24tPmNsaWVudF9oZGwsCisgICAgICBwX3Nlc3Npb24tPmpvYklkLAorICAgICAgJm91dHB1dF9idWYsCisgICAgICBwX3Nlc3Npb24tPnBhcmFtcy51c2VyZGF0YSk7CisKKyAgICBtbV9qcGVnZW5jX2pvYl9kb25lKHBfc2Vzc2lvbik7CisKKyAgICBtbV9qcGVnX3B1dF9tZW0oKHZvaWQgKilwX3Nlc3Npb24pOworICB9CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwX3Nlc3Npb24tPmxvY2spOworCisgIHJldHVybiByZXQ7Cit9CisKKworCitPTVhfRVJST1JUWVBFIG1tX2pwZWdfZXZlbnRfaGFuZGxlcihPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICBPTVhfUFRSIHBBcHBEYXRhLAorICBPTVhfRVZFTlRUWVBFIGVFdmVudCwKKyAgT01YX1UzMiBuRGF0YTEsCisgIE9NWF9VMzIgbkRhdGEyLAorICBPTVhfUFRSIHBFdmVudERhdGEpCit7CisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uID0gKG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqKSBwQXBwRGF0YTsKKworICBMT0dEKCIlZCAlZCAlZCBzdGF0ZSAlZCIsIGVFdmVudCwgKGludCluRGF0YTEsCisgICAgKGludCluRGF0YTIsIHBfc2Vzc2lvbi0+YWJvcnRfc3RhdGUpOworCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKworICBpZiAoTU1fSlBFR19BQk9SVF9JTklUID09IHBfc2Vzc2lvbi0+YWJvcnRfc3RhdGUpIHsKKyAgICBwX3Nlc3Npb24tPmFib3J0X3N0YXRlID0gTU1fSlBFR19BQk9SVF9ET05FOworICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJnBfc2Vzc2lvbi0+Y29uZCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgIH0KKworICBpZiAoZUV2ZW50ID09IE9NWF9FdmVudEVycm9yKSB7CisgICAgcF9zZXNzaW9uLT5lcnJvcl9mbGFnID0gbkRhdGEyOworICAgIGlmIChwX3Nlc3Npb24tPmVuY29kaW5nID09IE9NWF9UUlVFKSB7CisgICAgICBMT0dFKCJFcnJvciBkdXJpbmcgZW5jb2RpbmciKTsKKworICAgICAgLyogc2VuZCBqcGVnIGNhbGxiYWNrICovCisgICAgICBpZiAoTlVMTCAhPSBwX3Nlc3Npb24tPnBhcmFtcy5qcGVnX2NiKSB7CisgICAgICAgIHBfc2Vzc2lvbi0+am9iX3N0YXR1cyA9IEpQRUdfSk9CX1NUQVRVU19FUlJPUjsKKyAgICAgICAgTE9HRSgic2VuZCBqcGVnIGVycm9yIGNhbGxiYWNrICVkIiwKKyAgICAgICAgICBwX3Nlc3Npb24tPmpvYl9zdGF0dXMpOworICAgICAgICBwX3Nlc3Npb24tPnBhcmFtcy5qcGVnX2NiKHBfc2Vzc2lvbi0+am9iX3N0YXR1cywKKyAgICAgICAgICBwX3Nlc3Npb24tPmNsaWVudF9oZGwsCisgICAgICAgICAgcF9zZXNzaW9uLT5qb2JJZCwKKyAgICAgICAgICBOVUxMLAorICAgICAgICAgIHBfc2Vzc2lvbi0+cGFyYW1zLnVzZXJkYXRhKTsKKyAgICAgIH0KKworICAgICAgLyogcmVtb3ZlIGZyb20gcmVhZHkgcXVldWUgKi8KKyAgICAgIG1tX2pwZWdlbmNfam9iX2RvbmUocF9zZXNzaW9uKTsKKyAgICB9CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcF9zZXNzaW9uLT5jb25kKTsKKyAgfSBlbHNlIGlmIChlRXZlbnQgPT0gT01YX0V2ZW50Q21kQ29tcGxldGUpIHsKKyAgICBpZiAocF9zZXNzaW9uLT5zdGF0ZV9jaGFuZ2VfcGVuZGluZyA9PSBPTVhfVFJVRSkgeworICAgICAgcF9zZXNzaW9uLT5zdGF0ZV9jaGFuZ2VfcGVuZGluZyA9IE9NWF9GQUxTRTsKKyAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJnBfc2Vzc2lvbi0+Y29uZCk7CisgICAgfQorICB9CisKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCisKKworLyogcmVtb3ZlIHRoZSBmaXJzdCBqb2IgZnJvbSB0aGUgcXVldWUgd2l0aCBtYXRjaGluZyBjbGllbnQgaGFuZGxlICovCittbV9qcGVnX2pvYl9xX25vZGVfdCogbW1fanBlZ19xdWV1ZV9yZW1vdmVfam9iX2J5X2NsaWVudF9pZCgKKyAgbW1fanBlZ19xdWV1ZV90KiBxdWV1ZSwgdWludDMyX3QgY2xpZW50X2hkbCkKK3sKKyAgbW1fanBlZ19xX25vZGVfdCogbm9kZSA9IE5VTEw7CisgIG1tX2pwZWdfam9iX3Ffbm9kZV90KiBkYXRhID0gTlVMTDsKKyAgbW1fanBlZ19qb2JfcV9ub2RlX3QqIGpvYl9ub2RlID0gTlVMTDsKKyAgc3RydWN0IGNhbV9saXN0ICpoZWFkID0gTlVMTDsKKyAgc3RydWN0IGNhbV9saXN0ICpwb3MgPSBOVUxMOworCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcXVldWUtPmxvY2spOworICBoZWFkID0gJnF1ZXVlLT5oZWFkLmxpc3Q7CisgIHBvcyA9IGhlYWQtPm5leHQ7CisgIHdoaWxlKHBvcyAhPSBoZWFkKSB7CisgICAgbm9kZSA9IG1lbWJlcl9vZihwb3MsIG1tX2pwZWdfcV9ub2RlX3QsIGxpc3QpOworICAgIGRhdGEgPSAobW1fanBlZ19qb2JfcV9ub2RlX3QgKilub2RlLT5kYXRhLnA7CisKKyAgICBpZiAoZGF0YSAmJiAoZGF0YS0+ZW5jX2luZm8uY2xpZW50X2hhbmRsZSA9PSBjbGllbnRfaGRsKSkgeworICAgICAgTE9HSCgiZm91bmQgbWF0Y2hpbmcgY2xpZW50IGhhbmRsZSIpOworICAgICAgam9iX25vZGUgPSBkYXRhOworICAgICAgY2FtX2xpc3RfZGVsX25vZGUoJm5vZGUtPmxpc3QpOworICAgICAgcXVldWUtPnNpemUtLTsKKyAgICAgIGZyZWUobm9kZSk7CisgICAgICBMT0dIKCJxdWV1ZSBzaXplID0gJWQiLCBxdWV1ZS0+c2l6ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgcG9zID0gcG9zLT5uZXh0OworICB9CisKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKworICByZXR1cm4gam9iX25vZGU7Cit9CisKKy8qIHJlbW92ZSB0aGUgZmlyc3Qgam9iIGZyb20gdGhlIHF1ZXVlIHdpdGggbWF0Y2hpbmcgc2Vzc2lvbiBpZCAqLworbW1fanBlZ19qb2JfcV9ub2RlX3QqIG1tX2pwZWdfcXVldWVfcmVtb3ZlX2pvYl9ieV9zZXNzaW9uX2lkKAorICBtbV9qcGVnX3F1ZXVlX3QqIHF1ZXVlLCB1aW50MzJfdCBzZXNzaW9uX2lkKQoreworICBtbV9qcGVnX3Ffbm9kZV90KiBub2RlID0gTlVMTDsKKyAgbW1fanBlZ19qb2JfcV9ub2RlX3QqIGRhdGEgPSBOVUxMOworICBtbV9qcGVnX2pvYl9xX25vZGVfdCogam9iX25vZGUgPSBOVUxMOworICBzdHJ1Y3QgY2FtX2xpc3QgKmhlYWQgPSBOVUxMOworICBzdHJ1Y3QgY2FtX2xpc3QgKnBvcyA9IE5VTEw7CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZxdWV1ZS0+bG9jayk7CisgIGhlYWQgPSAmcXVldWUtPmhlYWQubGlzdDsKKyAgcG9zID0gaGVhZC0+bmV4dDsKKyAgd2hpbGUocG9zICE9IGhlYWQpIHsKKyAgICBub2RlID0gbWVtYmVyX29mKHBvcywgbW1fanBlZ19xX25vZGVfdCwgbGlzdCk7CisgICAgZGF0YSA9IChtbV9qcGVnX2pvYl9xX25vZGVfdCAqKW5vZGUtPmRhdGEucDsKKworICAgIGlmIChkYXRhICYmIChkYXRhLT5lbmNfaW5mby5lbmNvZGVfam9iLnNlc3Npb25faWQgPT0gc2Vzc2lvbl9pZCkpIHsKKyAgICAgIExPR0goImZvdW5kIG1hdGNoaW5nIHNlc3Npb24gaWQiKTsKKyAgICAgIGpvYl9ub2RlID0gZGF0YTsKKyAgICAgIGNhbV9saXN0X2RlbF9ub2RlKCZub2RlLT5saXN0KTsKKyAgICAgIHF1ZXVlLT5zaXplLS07CisgICAgICBmcmVlKG5vZGUpOworICAgICAgTE9HSCgicXVldWUgc2l6ZSA9ICVkIiwgcXVldWUtPnNpemUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBvcyA9IHBvcy0+bmV4dDsKKyAgfQorCisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+bG9jayk7CisKKyAgcmV0dXJuIGpvYl9ub2RlOworfQorCisvKiByZW1vdmUgam9iIGZyb20gdGhlIHF1ZXVlIHdpdGggbWF0Y2hpbmcgam9iIGlkICovCittbV9qcGVnX2pvYl9xX25vZGVfdCogbW1fanBlZ19xdWV1ZV9yZW1vdmVfam9iX2J5X2pvYl9pZCgKKyAgbW1fanBlZ19xdWV1ZV90KiBxdWV1ZSwgdWludDMyX3Qgam9iX2lkKQoreworICBtbV9qcGVnX3Ffbm9kZV90KiBub2RlID0gTlVMTDsKKyAgbW1fanBlZ19qb2JfcV9ub2RlX3QqIGRhdGEgPSBOVUxMOworICBtbV9qcGVnX2pvYl9xX25vZGVfdCogam9iX25vZGUgPSBOVUxMOworICBzdHJ1Y3QgY2FtX2xpc3QgKmhlYWQgPSBOVUxMOworICBzdHJ1Y3QgY2FtX2xpc3QgKnBvcyA9IE5VTEw7CisgIHVpbnQzMl90IGxxX2pvYl9pZDsKKworICBwdGhyZWFkX211dGV4X2xvY2soJnF1ZXVlLT5sb2NrKTsKKyAgaGVhZCA9ICZxdWV1ZS0+aGVhZC5saXN0OworICBwb3MgPSBoZWFkLT5uZXh0OworICB3aGlsZShwb3MgIT0gaGVhZCkgeworICAgIG5vZGUgPSBtZW1iZXJfb2YocG9zLCBtbV9qcGVnX3Ffbm9kZV90LCBsaXN0KTsKKyAgICBkYXRhID0gKG1tX2pwZWdfam9iX3Ffbm9kZV90ICopbm9kZS0+ZGF0YS5wOworCisgICAgaWYoTlVMTCA9PSBkYXRhKSB7CisgICAgICBMT0dFKCJEYXRhIGlzIE5VTEwiKTsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+bG9jayk7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoZGF0YS0+dHlwZSA9PSBNTV9KUEVHX0NNRF9UWVBFX0RFQ09ERV9KT0IpIHsKKyAgICAgIGxxX2pvYl9pZCA9IGRhdGEtPmRlY19pbmZvLmpvYl9pZDsKKyAgICB9IGVsc2UgeworICAgICAgbHFfam9iX2lkID0gZGF0YS0+ZW5jX2luZm8uam9iX2lkOworICAgIH0KKworICAgIGlmIChkYXRhICYmIChscV9qb2JfaWQgPT0gam9iX2lkKSkgeworICAgICAgTE9HRCgiZm91bmQgbWF0Y2hpbmcgam9iIGlkIik7CisgICAgICBqb2Jfbm9kZSA9IGRhdGE7CisgICAgICBjYW1fbGlzdF9kZWxfbm9kZSgmbm9kZS0+bGlzdCk7CisgICAgICBxdWV1ZS0+c2l6ZS0tOworICAgICAgZnJlZShub2RlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwb3MgPSBwb3MtPm5leHQ7CisgIH0KKworICBwdGhyZWFkX211dGV4X3VubG9jaygmcXVldWUtPmxvY2spOworCisgIHJldHVybiBqb2Jfbm9kZTsKK30KKworLyogcmVtb3ZlIGpvYiBmcm9tIHRoZSBxdWV1ZSB3aXRoIG1hdGNoaW5nIGpvYiBpZCAqLworbW1fanBlZ19qb2JfcV9ub2RlX3QqIG1tX2pwZWdfcXVldWVfcmVtb3ZlX2pvYl91bmxrKAorICBtbV9qcGVnX3F1ZXVlX3QqIHF1ZXVlLCB1aW50MzJfdCBqb2JfaWQpCit7CisgIG1tX2pwZWdfcV9ub2RlX3QqIG5vZGUgPSBOVUxMOworICBtbV9qcGVnX2pvYl9xX25vZGVfdCogZGF0YSA9IE5VTEw7CisgIG1tX2pwZWdfam9iX3Ffbm9kZV90KiBqb2Jfbm9kZSA9IE5VTEw7CisgIHN0cnVjdCBjYW1fbGlzdCAqaGVhZCA9IE5VTEw7CisgIHN0cnVjdCBjYW1fbGlzdCAqcG9zID0gTlVMTDsKKworICBoZWFkID0gJnF1ZXVlLT5oZWFkLmxpc3Q7CisgIHBvcyA9IGhlYWQtPm5leHQ7CisgIHdoaWxlKHBvcyAhPSBoZWFkKSB7CisgICAgbm9kZSA9IG1lbWJlcl9vZihwb3MsIG1tX2pwZWdfcV9ub2RlX3QsIGxpc3QpOworICAgIGRhdGEgPSAobW1fanBlZ19qb2JfcV9ub2RlX3QgKilub2RlLT5kYXRhLnA7CisKKyAgICBpZiAoZGF0YSAmJiAoZGF0YS0+ZW5jX2luZm8uam9iX2lkID09IGpvYl9pZCkpIHsKKyAgICAgIGpvYl9ub2RlID0gZGF0YTsKKyAgICAgIGNhbV9saXN0X2RlbF9ub2RlKCZub2RlLT5saXN0KTsKKyAgICAgIHF1ZXVlLT5zaXplLS07CisgICAgICBmcmVlKG5vZGUpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBvcyA9IHBvcy0+bmV4dDsKKyAgfQorCisgIHJldHVybiBqb2Jfbm9kZTsKK30KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9zcmMvbW1fanBlZ19leGlmLmMgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2Uvc3JjL21tX2pwZWdfZXhpZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NmZjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2Uvc3JjL21tX2pwZWdfZXhpZi5jCkBAIC0wLDAgKzEsNjUyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisvLyBKUEVHIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX2pwZWdfZGJnLmgiCisjaW5jbHVkZSAibW1fanBlZy5oIgorCisKKyNkZWZpbmUgTE9XRVIoYSkgICAgICAgICAgICAgICAoKGEpICYgMHhGRkZGKQorI2RlZmluZSBVUFBFUihhKSAgICAgICAgICAgICAgICgoKGEpPj4xNikgJiAweEZGRkYpCisjZGVmaW5lIENIQU5HRV9FTkRJQU5fMTYoYSkgICgoMHgwMEZGICYgKChhKT4+OCkpIHwgKDB4RkYwMCAmICgoYSk8PDgpKSkKKyNkZWZpbmUgUk9VTkQoYSkgXAorICAgICAgICAoKGEgPj0gMCkgPyAodWludDMyX3QpKGEgKyAwLjUpIDogKHVpbnQzMl90KShhIC0gMC41KSkKKworCisvKiogYWRkRXhpZkVudHJ5OgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgIEBleGlmX2luZm8gOiBFeGlmIGluZm8gc3RydWN0CisgKiAgIEBwX3Nlc3Npb246IGpvYiBzZXNzaW9uCisgKiAgIEB0YWdpZCAgIDogZXhpZiB0YWcgSUQKKyAqICAgQHR5cGUgICAgOiBkYXRhIHR5cGUKKyAqICAgQGNvdW50ICAgOiBudW1iZXIgb2YgZGF0YSBpbiB1aW50IG9mIGl0cyB0eXBlCisgKiAgIEBkYXRhICAgIDogaW5wdXQgZGF0YSBwdHIKKyAqCisgKiAgUmV0cnVuICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBGdW5jdGlvbiB0byBhZGQgYW4gZW50cnkgdG8gZXhpZiBkYXRhCisgKgorICoqLworaW50MzJfdCBhZGRFeGlmRW50cnkoUU9NWF9FWElGX0lORk8gKnBfZXhpZl9pbmZvLCBleGlmX3RhZ19pZF90IHRhZ2lkLAorICBleGlmX3RhZ190eXBlX3QgdHlwZSwgdWludDMyX3QgY291bnQsIHZvaWQgKmRhdGEpCit7CisgICAgaW50MzJfdCByYyA9IDA7CisgICAgdWludDMyX3QgbnVtT2ZFbnRyaWVzID0gKHVpbnQzMl90KXBfZXhpZl9pbmZvLT5udW1PZkVudHJpZXM7CisgICAgUUVYSUZfSU5GT19EQVRBICpwX2luZm9fZGF0YSA9IHBfZXhpZl9pbmZvLT5leGlmX2RhdGE7CisgICAgaWYobnVtT2ZFbnRyaWVzID49IE1BWF9FWElGX1RBQkxFX0VOVFJJRVMpIHsKKyAgICAgICAgTE9HRSgiTnVtYmVyIG9mIGVudHJpZXMgZXhjZWVkZWQgbGltaXQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHBfaW5mb19kYXRhW251bU9mRW50cmllc10udGFnX2lkID0gdGFnaWQ7CisgICAgcF9pbmZvX2RhdGFbbnVtT2ZFbnRyaWVzXS50YWdfZW50cnkudHlwZSA9IHR5cGU7CisgICAgcF9pbmZvX2RhdGFbbnVtT2ZFbnRyaWVzXS50YWdfZW50cnkuY291bnQgPSBjb3VudDsKKyAgICBwX2luZm9fZGF0YVtudW1PZkVudHJpZXNdLnRhZ19lbnRyeS5jb3B5ID0gMTsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEVYSUZfQllURTogeworICAgICAgaWYgKGNvdW50ID4gMSkgeworICAgICAgICB1aW50OF90ICp2YWx1ZXMgPSAodWludDhfdCAqKW1hbGxvYyhjb3VudCk7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgYnl0ZSBhcnJheSIpOworICAgICAgICAgIHJjID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWVtY3B5KHZhbHVlcywgZGF0YSwgY291bnQpOworICAgICAgICAgIHBfaW5mb19kYXRhW251bU9mRW50cmllc10udGFnX2VudHJ5LmRhdGEuX2J5dGVzID0gdmFsdWVzOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwX2luZm9fZGF0YVtudW1PZkVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9ieXRlID0gKih1aW50OF90ICopZGF0YTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBFWElGX0FTQ0lJOiB7CisgICAgICBjaGFyICpzdHIgPSBOVUxMOworICAgICAgc3RyID0gKGNoYXIgKiltYWxsb2MoY291bnQgKyAxKTsKKyAgICAgIGlmIChzdHIgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIGFzY2lpIHN0cmluZyIpOworICAgICAgICByYyA9IC0xOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0KHN0ciwgMCwgY291bnQgKyAxKTsKKyAgICAgICAgbWVtY3B5KHN0ciwgZGF0YSwgY291bnQpOworICAgICAgICBwX2luZm9fZGF0YVtudW1PZkVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9hc2NpaSA9IHN0cjsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBFWElGX1NIT1JUOiB7CisgICAgICBpZiAoY291bnQgPiAxKSB7CisgICAgICAgIHVpbnQxNl90ICp2YWx1ZXMgPSAodWludDE2X3QgKiltYWxsb2MoY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBOVUxMKSB7CisgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBzaG9ydCBhcnJheSIpOworICAgICAgICAgIHJjID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbWVtY3B5KHZhbHVlcywgZGF0YSwgY291bnQgKiBzaXplb2YodWludDE2X3QpKTsKKyAgICAgICAgICBwX2luZm9fZGF0YVtudW1PZkVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9zaG9ydHMgPSB2YWx1ZXM7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBfaW5mb19kYXRhW251bU9mRW50cmllc10udGFnX2VudHJ5LmRhdGEuX3Nob3J0ID0gKih1aW50MTZfdCAqKWRhdGE7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgRVhJRl9MT05HOiB7CisgICAgICBpZiAoY291bnQgPiAxKSB7CisgICAgICAgIHVpbnQzMl90ICp2YWx1ZXMgPSAodWludDMyX3QgKiltYWxsb2MoY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBOVUxMKSB7CisgICAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBsb25nIGFycmF5Iik7CisgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtZW1jcHkodmFsdWVzLCBkYXRhLCBjb3VudCAqIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICAgIHBfaW5mb19kYXRhW251bU9mRW50cmllc10udGFnX2VudHJ5LmRhdGEuX2xvbmdzID0gdmFsdWVzOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwX2luZm9fZGF0YVtudW1PZkVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9sb25nID0gKih1aW50MzJfdCAqKWRhdGE7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgRVhJRl9SQVRJT05BTDogeworICAgICAgaWYgKGNvdW50ID4gMSkgeworICAgICAgICByYXRfdCAqdmFsdWVzID0gKHJhdF90ICopbWFsbG9jKGNvdW50ICogc2l6ZW9mKHJhdF90KSk7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgcmF0aW9uYWwgYXJyYXkiKTsKKyAgICAgICAgICByYyA9IC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1lbWNweSh2YWx1ZXMsIGRhdGEsIGNvdW50ICogc2l6ZW9mKHJhdF90KSk7CisgICAgICAgICAgcF9pbmZvX2RhdGFbbnVtT2ZFbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fcmF0cyA9IHZhbHVlczsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcF9pbmZvX2RhdGFbbnVtT2ZFbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fcmF0ID0gKihyYXRfdCAqKWRhdGE7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgRVhJRl9VTkRFRklORUQ6IHsKKyAgICAgIHVpbnQ4X3QgKnZhbHVlcyA9ICh1aW50OF90ICopbWFsbG9jKGNvdW50KTsKKyAgICAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIHVuZGVmaW5lZCBhcnJheSIpOworICAgICAgICByYyA9IC0xOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtY3B5KHZhbHVlcywgZGF0YSwgY291bnQpOworICAgICAgICBwX2luZm9fZGF0YVtudW1PZkVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl91bmRlZmluZWQgPSB2YWx1ZXM7CisgICAgICB9CisgICAgfQorICAgIGJyZWFrOworICAgIGNhc2UgRVhJRl9TTE9ORzogeworICAgICAgaWYgKGNvdW50ID4gMSkgeworICAgICAgICBpbnQzMl90ICp2YWx1ZXMgPSAoaW50MzJfdCAqKW1hbGxvYyhjb3VudCAqIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3Igc2lnbmVkIGxvbmcgYXJyYXkiKTsKKyAgICAgICAgICByYyA9IC0xOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1lbWNweSh2YWx1ZXMsIGRhdGEsIGNvdW50ICogc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgICBwX2luZm9fZGF0YVtudW1PZkVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9zbG9uZ3MgPSB2YWx1ZXM7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBfaW5mb19kYXRhW251bU9mRW50cmllc10udGFnX2VudHJ5LmRhdGEuX3Nsb25nID0gKihpbnQzMl90ICopZGF0YTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgICAgY2FzZSBFWElGX1NSQVRJT05BTDogeworICAgICAgaWYgKGNvdW50ID4gMSkgeworICAgICAgICBzcmF0X3QgKnZhbHVlcyA9IChzcmF0X3QgKiltYWxsb2MoY291bnQgKiBzaXplb2Yoc3JhdF90KSk7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gTlVMTCkgeworICAgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3Igc2lnbmVkIHJhdGlvbmFsIGFycmF5Iik7CisgICAgICAgICAgcmMgPSAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtZW1jcHkodmFsdWVzLCBkYXRhLCBjb3VudCAqIHNpemVvZihzcmF0X3QpKTsKKyAgICAgICAgICBwX2luZm9fZGF0YVtudW1PZkVudHJpZXNdLnRhZ19lbnRyeS5kYXRhLl9zcmF0cyA9IHZhbHVlczsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcF9pbmZvX2RhdGFbbnVtT2ZFbnRyaWVzXS50YWdfZW50cnkuZGF0YS5fc3JhdCA9ICooc3JhdF90ICopZGF0YTsKKyAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gSW5jcmVhc2UgbnVtYmVyIG9mIGVudHJpZXMKKyAgICBwX2V4aWZfaW5mby0+bnVtT2ZFbnRyaWVzKys7CisgICAgcmV0dXJuIHJjOworfQorCisvKiogcmVsZWFzZUV4aWZFbnRyeQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgIEBwX2V4aWZfZGF0YSA6IEV4aWYgaW5mbyBzdHJ1Y3QKKyAqCisgKiAgUmV0cnVuICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAgMCAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgIG5vbmUtemVybyBmYWlsdXJlIGNvZGUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBGdW5jdGlvbiB0byByZWxlYXNlIGFuIGVudHJ5IGZyb20gZXhpZiBkYXRhCisgKgorICoqLworaW50MzJfdCByZWxlYXNlRXhpZkVudHJ5KFFFWElGX0lORk9fREFUQSAqcF9leGlmX2RhdGEpCit7Cisgc3dpdGNoIChwX2V4aWZfZGF0YS0+dGFnX2VudHJ5LnR5cGUpIHsKKyAgY2FzZSBFWElGX0JZVEU6IHsKKyAgICBpZiAocF9leGlmX2RhdGEtPnRhZ19lbnRyeS5jb3VudCA+IDEgJiYKKyAgICAgIHBfZXhpZl9kYXRhLT50YWdfZW50cnkuZGF0YS5fYnl0ZXMgIT0gTlVMTCkgeworICAgICAgZnJlZShwX2V4aWZfZGF0YS0+dGFnX2VudHJ5LmRhdGEuX2J5dGVzKTsKKyAgICAgIHBfZXhpZl9kYXRhLT50YWdfZW50cnkuZGF0YS5fYnl0ZXMgPSBOVUxMOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBFWElGX0FTQ0lJOiB7CisgICAgaWYgKHBfZXhpZl9kYXRhLT50YWdfZW50cnkuZGF0YS5fYXNjaWkgIT0gTlVMTCkgeworICAgICAgZnJlZShwX2V4aWZfZGF0YS0+dGFnX2VudHJ5LmRhdGEuX2FzY2lpKTsKKyAgICAgIHBfZXhpZl9kYXRhLT50YWdfZW50cnkuZGF0YS5fYXNjaWkgPSBOVUxMOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBFWElGX1NIT1JUOiB7CisgICAgaWYgKHBfZXhpZl9kYXRhLT50YWdfZW50cnkuY291bnQgPiAxICYmCisgICAgICBwX2V4aWZfZGF0YS0+dGFnX2VudHJ5LmRhdGEuX3Nob3J0cyAhPSBOVUxMKSB7CisgICAgICBmcmVlKHBfZXhpZl9kYXRhLT50YWdfZW50cnkuZGF0YS5fc2hvcnRzKTsKKyAgICAgIHBfZXhpZl9kYXRhLT50YWdfZW50cnkuZGF0YS5fc2hvcnRzID0gTlVMTDsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgRVhJRl9MT05HOiB7CisgICAgaWYgKHBfZXhpZl9kYXRhLT50YWdfZW50cnkuY291bnQgPiAxICYmCisgICAgICBwX2V4aWZfZGF0YS0+dGFnX2VudHJ5LmRhdGEuX2xvbmdzICE9IE5VTEwpIHsKKyAgICAgIGZyZWUocF9leGlmX2RhdGEtPnRhZ19lbnRyeS5kYXRhLl9sb25ncyk7CisgICAgICBwX2V4aWZfZGF0YS0+dGFnX2VudHJ5LmRhdGEuX2xvbmdzID0gTlVMTDsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgRVhJRl9SQVRJT05BTDogeworICAgIGlmIChwX2V4aWZfZGF0YS0+dGFnX2VudHJ5LmNvdW50ID4gMSAmJgorICAgICAgcF9leGlmX2RhdGEtPnRhZ19lbnRyeS5kYXRhLl9yYXRzICE9IE5VTEwpIHsKKyAgICAgIGZyZWUocF9leGlmX2RhdGEtPnRhZ19lbnRyeS5kYXRhLl9yYXRzKTsKKyAgICAgIHBfZXhpZl9kYXRhLT50YWdfZW50cnkuZGF0YS5fcmF0cyA9IE5VTEw7CisgICAgfQorICB9CisgIGJyZWFrOworICBjYXNlIEVYSUZfVU5ERUZJTkVEOiB7CisgICAgaWYgKHBfZXhpZl9kYXRhLT50YWdfZW50cnkuZGF0YS5fdW5kZWZpbmVkICE9IE5VTEwpIHsKKyAgICAgIGZyZWUocF9leGlmX2RhdGEtPnRhZ19lbnRyeS5kYXRhLl91bmRlZmluZWQpOworICAgICAgcF9leGlmX2RhdGEtPnRhZ19lbnRyeS5kYXRhLl91bmRlZmluZWQgPSBOVUxMOworICAgIH0KKyAgfQorICBicmVhazsKKyAgY2FzZSBFWElGX1NMT05HOiB7CisgICAgaWYgKHBfZXhpZl9kYXRhLT50YWdfZW50cnkuY291bnQgPiAxICYmCisgICAgICBwX2V4aWZfZGF0YS0+dGFnX2VudHJ5LmRhdGEuX3Nsb25ncyAhPSBOVUxMKSB7CisgICAgICBmcmVlKHBfZXhpZl9kYXRhLT50YWdfZW50cnkuZGF0YS5fc2xvbmdzKTsKKyAgICAgIHBfZXhpZl9kYXRhLT50YWdfZW50cnkuZGF0YS5fc2xvbmdzID0gTlVMTDsKKyAgICB9CisgIH0KKyAgYnJlYWs7CisgIGNhc2UgRVhJRl9TUkFUSU9OQUw6IHsKKyAgICBpZiAocF9leGlmX2RhdGEtPnRhZ19lbnRyeS5jb3VudCA+IDEgJiYKKyAgICAgIHBfZXhpZl9kYXRhLT50YWdfZW50cnkuZGF0YS5fc3JhdHMgIT0gTlVMTCkgeworICAgICAgZnJlZShwX2V4aWZfZGF0YS0+dGFnX2VudHJ5LmRhdGEuX3NyYXRzKTsKKyAgICAgIHBfZXhpZl9kYXRhLT50YWdfZW50cnkuZGF0YS5fc3JhdHMgPSBOVUxMOworICAgIH0KKyAgfQorICBicmVhazsKKyAgfSAvKmVuZCBvZiBzd2l0Y2gqLworCisgIHJldHVybiAwOworfQorCisvKiogcHJvY2Vzc19zZW5zb3JfZGF0YToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICBAcF9zZW5zb3JfcGFyYW1zIDogcHRyIHRvIHNlbnNvciBkYXRhCisgKgorICogIFJldHVybiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIHByb2Nlc3Mgc2Vuc29yIGRhdGEKKyAqCisgKiAgTm90ZXM6IHRoaXMgbmVlZHMgdG8gYmUgZmlsbGVkIGZvciB0aGUgbWV0YWRhdGEKKyAqKi8KK2ludCBwcm9jZXNzX3NlbnNvcl9kYXRhKGNhbV9zZW5zb3JfcGFyYW1zX3QgKnBfc2Vuc29yX3BhcmFtcywKKyAgUU9NWF9FWElGX0lORk8gKmV4aWZfaW5mbykKK3sKKyAgaW50IHJjID0gMDsKKyAgcmF0X3QgdmFsX3JhdDsKKworICBpZiAoTlVMTCA9PSBwX3NlbnNvcl9wYXJhbXMpIHsKKyAgICBMT0dFKCJTZW5zb3IgcGFyYW1zIGFyZSBudWxsIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBMT0dEKCJGcm9tIG1ldGFkYXRhIGFwZXJ0dXJlID0gJWYgIiwKKyAgICBwX3NlbnNvcl9wYXJhbXMtPmFwZXJ0dXJlX3ZhbHVlICk7CisKKyAgaWYgKHBfc2Vuc29yX3BhcmFtcy0+YXBlcnR1cmVfdmFsdWUgPj0gMS4wKSB7CisgICAgZG91YmxlIGFwZXhfdmFsdWU7CisgICAgYXBleF92YWx1ZSA9IChkb3VibGUpMi4wICogbG9nKHBfc2Vuc29yX3BhcmFtcy0+YXBlcnR1cmVfdmFsdWUpIC8gbG9nKDIuMCk7CisgICAgdmFsX3JhdC5udW0gPSAodWludDMyX3QpKGFwZXhfdmFsdWUgKiAxMDApOworICAgIHZhbF9yYXQuZGVub20gPSAxMDA7CisgICAgcmMgPSBhZGRFeGlmRW50cnkoZXhpZl9pbmZvLCBFWElGVEFHSURfQVBFUlRVUkUsIEVYSUZfUkFUSU9OQUwsIDEsICZ2YWxfcmF0KTsKKyAgICBpZiAocmMpIHsKKyAgICAgIExPR0UoIjogRXJyb3IgYWRkaW5nIEV4aWYgRW50cnkiKTsKKyAgICB9CisKKyAgICB2YWxfcmF0Lm51bSA9ICh1aW50MzJfdCkocF9zZW5zb3JfcGFyYW1zLT5hcGVydHVyZV92YWx1ZSAqIDEwMCk7CisgICAgdmFsX3JhdC5kZW5vbSA9IDEwMDsKKyAgICByYyA9IGFkZEV4aWZFbnRyeShleGlmX2luZm8sIEVYSUZUQUdJRF9GX05VTUJFUiwgRVhJRl9SQVRJT05BTCwgMSwgJnZhbF9yYXQpOworICAgIGlmIChyYykgeworICAgICAgTE9HRSgiOiBFcnJvciBhZGRpbmcgRXhpZiBFbnRyeSIpOworICAgIH0KKyAgfQorCisgIC8qRmxhc2gqLworICBzaG9ydCB2YWxfc2hvcnQgPSAwOworICBpbnQgZmxhc2hfbW9kZV9leGlmLCBmbGFzaF9maXJlZDsKKyAgaWYgKHBfc2Vuc29yX3BhcmFtcy0+Zmxhc2hfc3RhdGUgPT0gQ0FNX0ZMQVNIX1NUQVRFX0ZJUkVEKSB7CisgICAgZmxhc2hfZmlyZWQgPSAxOworICB9IGVsc2UgeworICAgIGZsYXNoX2ZpcmVkID0gMDsKKyAgfQorICBMT0dEKCJGbGFzaCBtb2RlICVkIGZsYXNoIHN0YXRlICVkIiwKKyAgICBwX3NlbnNvcl9wYXJhbXMtPmZsYXNoX21vZGUsIHBfc2Vuc29yX3BhcmFtcy0+Zmxhc2hfc3RhdGUpOworCisgIHN3aXRjaChwX3NlbnNvcl9wYXJhbXMtPmZsYXNoX21vZGUpIHsKKyAgY2FzZSAgQ0FNX0ZMQVNIX01PREVfT0ZGOgorICAgIGZsYXNoX21vZGVfZXhpZiA9IE1NX0pQRUdfRVhJRl9GTEFTSF9NT0RFX09GRjsKKyAgICBicmVhazsKKyAgY2FzZSBDQU1fRkxBU0hfTU9ERV9PTjoKKyAgICBmbGFzaF9tb2RlX2V4aWYgPSBNTV9KUEVHX0VYSUZfRkxBU0hfTU9ERV9PTjsKKyAgICBicmVhazsKKyAgY2FzZSBDQU1fRkxBU0hfTU9ERV9BVVRPOgorICAgIGZsYXNoX21vZGVfZXhpZiA9IE1NX0pQRUdfRVhJRl9GTEFTSF9NT0RFX0FVVE87CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgZmxhc2hfbW9kZV9leGlmID0gTU1fSlBFR19FWElGX0ZMQVNIX01PREVfQVVUTzsKKyAgICBMT0dFKCI6IFVuc3VwcG9ydGVkIGZsYXNoIG1vZGUiKTsKKyAgfQorICB2YWxfc2hvcnQgPSAoc2hvcnQpKGZsYXNoX2ZpcmVkIHwgKGZsYXNoX21vZGVfZXhpZiA8PCAzKSk7CisKKyAgcmMgPSBhZGRFeGlmRW50cnkoZXhpZl9pbmZvLCBFWElGVEFHSURfRkxBU0gsIEVYSUZfU0hPUlQsIDEsICZ2YWxfc2hvcnQpOworICBpZiAocmMpIHsKKyAgICBMT0dFKCI6IEVycm9yIGFkZGluZyBmbGFzaCBleGlmIGVudHJ5Iik7CisgIH0KKyAgLyogU2Vuc2luZyBNZXRob2QgKi8KKyAgdmFsX3Nob3J0ID0gKHNob3J0KSBwX3NlbnNvcl9wYXJhbXMtPnNlbnNpbmdfbWV0aG9kOworICByYyA9IGFkZEV4aWZFbnRyeShleGlmX2luZm8sIEVYSUZUQUdJRF9TRU5TSU5HX01FVEhPRCwgRVhJRl9TSE9SVCwKKyAgICBzaXplb2YodmFsX3Nob3J0KS8yLCAmdmFsX3Nob3J0KTsKKyAgaWYgKHJjKSB7CisgICAgTE9HRSgiOiBFcnJvciBhZGRpbmcgZmxhc2ggRXhpZiBFbnRyeSIpOworICB9CisKKyAgLyogRm9jYWwgTGVuZ3RoIGluIDM1IE1NIEZpbG0gKi8KKyAgdmFsX3Nob3J0ID0gKHNob3J0KQorICAgICgocF9zZW5zb3JfcGFyYW1zLT5mb2NhbF9sZW5ndGggKiBwX3NlbnNvcl9wYXJhbXMtPmNyb3BfZmFjdG9yKSArIDAuNWYpOworICByYyA9IGFkZEV4aWZFbnRyeShleGlmX2luZm8sIEVYSUZUQUdJRF9GT0NBTF9MRU5HVEhfMzVNTSwgRVhJRl9TSE9SVCwKKyAgICAxLCAmdmFsX3Nob3J0KTsKKyAgaWYgKHJjKSB7CisgICAgTE9HRSgiOiBFcnJvciBhZGRpbmcgRXhpZiBFbnRyeSIpOworICB9CisKKyAgLyogRiBOdW1iZXIgKi8KKyAgdmFsX3JhdC5udW0gPSAodWludDMyX3QpKHBfc2Vuc29yX3BhcmFtcy0+Zl9udW1iZXIgKiAxMDApOworICB2YWxfcmF0LmRlbm9tID0gMTAwOworICByYyA9IGFkZEV4aWZFbnRyeShleGlmX2luZm8sIEVYSUZUQUdUWVBFX0ZfTlVNQkVSLCBFWElGX1JBVElPTkFMLCAxLCAmdmFsX3JhdCk7CisgIGlmIChyYykgeworICAgIExPR0UoIjogRXJyb3IgYWRkaW5nIEV4aWYgRW50cnkiKTsKKyAgfQorICByZXR1cm4gcmM7Cit9CisKKworLyoqIHByb2Nlc3NfM2FfZGF0YToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICBAcF8zYV9wYXJhbXMgOiBwdHIgdG8gM2EgZGF0YQorICogICBAZXhpZl9pbmZvIDogRXhpZiBpbmZvIHN0cnVjdAorICoKKyAqICBSZXR1cm4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgICBOT19FUlJPUiAgLS0gc3VjY2VzcworICogICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgcHJvY2VzcyAzYSBkYXRhCisgKgorICogIE5vdGVzOiB0aGlzIG5lZWRzIHRvIGJlIGZpbGxlZCBmb3IgdGhlIG1ldGFkYXRhCisgKiovCitpbnQgcHJvY2Vzc18zYV9kYXRhKGNhbV8zYV9wYXJhbXNfdCAqcF8zYV9wYXJhbXMsIFFPTVhfRVhJRl9JTkZPICpleGlmX2luZm8pCit7CisgIGludCByYyA9IDA7CisgIHNyYXRfdCB2YWxfc3JhdDsKKyAgcmF0X3QgdmFsX3JhdDsKKyAgZG91YmxlIHNodXR0ZXJfc3BlZWRfdmFsdWU7CisKKyAgaWYgKE5VTEwgPT0gcF8zYV9wYXJhbXMpIHsKKyAgICBMT0dFKCIzQSBwYXJhbXMgYXJlIG51bGwiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIExPR0QoImV4cF90aW1lICVmLCBpc29fdmFsdWUgJWQsIHdiX21vZGUgJWQiLAorICAgIHBfM2FfcGFyYW1zLT5leHBfdGltZSwgcF8zYV9wYXJhbXMtPmlzb192YWx1ZSwgcF8zYV9wYXJhbXMtPndiX21vZGUpOworCisgIC8qIEV4cG9zdXJlIHRpbWUgKi8KKyAgaWYgKHBfM2FfcGFyYW1zLT5leHBfdGltZSA8PSAwLjBmKSB7CisgICAgdmFsX3JhdC5udW0gPSAwOworICAgIHZhbF9yYXQuZGVub20gPSAwOworICB9IGVsc2UgaWYgKHBfM2FfcGFyYW1zLT5leHBfdGltZSA8IDEuMGYpIHsKKyAgICB2YWxfcmF0Lm51bSA9IDE7CisgICAgdmFsX3JhdC5kZW5vbSA9IFJPVU5EKDEuMC9wXzNhX3BhcmFtcy0+ZXhwX3RpbWUpOworICB9IGVsc2UgeworICAgIHZhbF9yYXQubnVtID0gUk9VTkQocF8zYV9wYXJhbXMtPmV4cF90aW1lKTsKKyAgICB2YWxfcmF0LmRlbm9tID0gMTsKKyAgfQorICBMT0dEKCJudW1lciAlZCBkZW5vbSAlZCAlemQiLCB2YWxfcmF0Lm51bSwgdmFsX3JhdC5kZW5vbSwKKyAgICBzaXplb2YodmFsX3JhdCkgLyAoOCkpOworCisgIHJjID0gYWRkRXhpZkVudHJ5KGV4aWZfaW5mbywgRVhJRlRBR0lEX0VYUE9TVVJFX1RJTUUsIEVYSUZfUkFUSU9OQUwsCisgICAgKHNpemVvZih2YWxfcmF0KS8oOCkpLCAmdmFsX3JhdCk7CisgIGlmIChyYykgeworICAgIExPR0UoIjogRXJyb3IgYWRkaW5nIEV4aWYgRW50cnkgRXhwb3N1cmUgdGltZSIpOworICB9CisKKyAgLyogU2h1dHRlciBTcGVlZCovCisgIGlmIChwXzNhX3BhcmFtcy0+ZXhwX3RpbWUgPiAwKSB7CisgICAgc2h1dHRlcl9zcGVlZF92YWx1ZSA9IGxvZzEwKDEvcF8zYV9wYXJhbXMtPmV4cF90aW1lKS9sb2cxMCgyKTsKKyAgICB2YWxfc3JhdC5udW0gPSAoaW50MzJfdCkoc2h1dHRlcl9zcGVlZF92YWx1ZSAqIDEwMDApOworICAgIHZhbF9zcmF0LmRlbm9tID0gMTAwMDsKKyAgfSBlbHNlIHsKKyAgICB2YWxfc3JhdC5udW0gPSAwOworICAgIHZhbF9zcmF0LmRlbm9tID0gMDsKKyAgfQorICByYyA9IGFkZEV4aWZFbnRyeShleGlmX2luZm8sIEVYSUZUQUdJRF9TSFVUVEVSX1NQRUVELCBFWElGX1NSQVRJT05BTCwKKyAgICAoc2l6ZW9mKHZhbF9zcmF0KS8oOCkpLCAmdmFsX3NyYXQpOworICBpZiAocmMpIHsKKyAgICBMT0dFKCI6IEVycm9yIGFkZGluZyBFeGlmIEVudHJ5Iik7CisgIH0KKworICAvKklTTyovCisgIHNob3J0IHZhbF9zaG9ydDsKKyAgdmFsX3Nob3J0ID0gKHNob3J0KXBfM2FfcGFyYW1zLT5pc29fdmFsdWU7CisgIHJjID0gYWRkRXhpZkVudHJ5KGV4aWZfaW5mbywgRVhJRlRBR0lEX0lTT19TUEVFRF9SQVRJTkcsIEVYSUZfU0hPUlQsCisgICAgc2l6ZW9mKHZhbF9zaG9ydCkvMiwgJnZhbF9zaG9ydCk7CisgIGlmIChyYykgeworICAgICBMT0dFKCI6IEVycm9yIGFkZGluZyBFeGlmIEVudHJ5Iik7CisgIH0KKworICAvKldCIG1vZGUqLworICBpZiAocF8zYV9wYXJhbXMtPndiX21vZGUgPT0gQ0FNX1dCX01PREVfQVVUTykKKyAgICB2YWxfc2hvcnQgPSAwOworICBlbHNlCisgICAgdmFsX3Nob3J0ID0gMTsKKyAgcmMgPSBhZGRFeGlmRW50cnkoZXhpZl9pbmZvLCBFWElGVEFHSURfV0hJVEVfQkFMQU5DRSwgRVhJRl9TSE9SVCwKKyAgICBzaXplb2YodmFsX3Nob3J0KS8yLCAmdmFsX3Nob3J0KTsKKyAgaWYgKHJjKSB7CisgICAgTE9HRSgiOiBFcnJvciBhZGRpbmcgRXhpZiBFbnRyeSIpOworICB9CisKKyAgLyogTWV0ZXJpbmcgTW9kZSAgICovCisgIHZhbF9zaG9ydCA9IChzaG9ydCkgcF8zYV9wYXJhbXMtPm1ldGVyaW5nX21vZGU7CisgIHJjID0gYWRkRXhpZkVudHJ5KGV4aWZfaW5mbyxFWElGVEFHSURfTUVURVJJTkdfTU9ERSwgRVhJRl9TSE9SVCwKKyAgICAgc2l6ZW9mKHZhbF9zaG9ydCkvMiwgJnZhbF9zaG9ydCk7CisgIGlmIChyYykgeworICAgICBMT0dFKCI6IEVycm9yIGFkZGluZyBFeGlmIEVudHJ5Iik7CisgICB9CisKKyAgLypFeHBvc3VyZSBQcm9ncmFtKi8KKyAgIHZhbF9zaG9ydCA9IChzaG9ydCkgcF8zYV9wYXJhbXMtPmV4cG9zdXJlX3Byb2dyYW07CisgICByYyA9IGFkZEV4aWZFbnRyeShleGlmX2luZm8sRVhJRlRBR0lEX0VYUE9TVVJFX1BST0dSQU0sIEVYSUZfU0hPUlQsCisgICAgICBzaXplb2YodmFsX3Nob3J0KS8yLCAmdmFsX3Nob3J0KTsKKyAgIGlmIChyYykgeworICAgICAgTE9HRSgiOiBFcnJvciBhZGRpbmcgRXhpZiBFbnRyeSIpOworICAgIH0KKworICAgLypFeHBvc3VyZSBNb2RlICovCisgICAgdmFsX3Nob3J0ID0gKHNob3J0KSBwXzNhX3BhcmFtcy0+ZXhwb3N1cmVfbW9kZTsKKyAgICByYyA9IGFkZEV4aWZFbnRyeShleGlmX2luZm8sRVhJRlRBR0lEX0VYUE9TVVJFX01PREUsIEVYSUZfU0hPUlQsCisgICAgICAgc2l6ZW9mKHZhbF9zaG9ydCkvMiwgJnZhbF9zaG9ydCk7CisgICAgaWYgKHJjKSB7CisgICAgICAgTE9HRSgiOiBFcnJvciBhZGRpbmcgRXhpZiBFbnRyeSIpOworICAgICB9CisKKyAgICAvKlNjZW5ldHlwZSovCisgICAgIHVpbnQ4X3QgdmFsX3VuZGVmOworICAgICB2YWxfdW5kZWYgPSAodWludDhfdCkgcF8zYV9wYXJhbXMtPnNjZW5ldHlwZTsKKyAgICAgcmMgPSBhZGRFeGlmRW50cnkoZXhpZl9pbmZvLEVYSUZUQUdJRF9TQ0VORV9UWVBFLCBFWElGX1VOREVGSU5FRCwKKyAgICAgICAgc2l6ZW9mKHZhbF91bmRlZiksICZ2YWxfdW5kZWYpOworICAgICBpZiAocmMpIHsKKyAgICAgICAgTE9HRSgiOiBFcnJvciBhZGRpbmcgRXhpZiBFbnRyeSIpOworICAgICAgfQorCisgICAgIExPR0QoImJyaWdodG5lc3MgJWYiLAorICAgICAgIHBfM2FfcGFyYW1zLT5icmlnaHRuZXNzKTsKKworICAgIC8qIEJyaWdodG5lc3MgVmFsdWUqLworICAgICB2YWxfc3JhdC5udW0gPSAoaW50MzJfdCkgKHBfM2FfcGFyYW1zLT5icmlnaHRuZXNzICogMTAwLjBmKTsKKyAgICAgdmFsX3NyYXQuZGVub20gPSAxMDA7CisgICAgIHJjID0gYWRkRXhpZkVudHJ5KGV4aWZfaW5mbyxFWElGVEFHSURfQlJJR0hUTkVTUywgRVhJRl9TUkFUSU9OQUwsCisgICAgICAgICAgICAgICAgIChzaXplb2YodmFsX3NyYXQpLyg4KSksICZ2YWxfc3JhdCk7CisgICAgIGlmIChyYykgeworICAgICAgICBMT0dFKCI6IEVycm9yIGFkZGluZyBFeGlmIEVudHJ5Iik7CisgICAgIH0KKworICByZXR1cm4gcmM7Cit9CisKKy8qKiBwcm9jZXNzX21ldGFfZGF0YQorICoKKyAqICBBcmd1bWVudHM6CisgKiAgIEBwX21ldGEgOiBwdHIgdG8gbWV0YWRhdGEKKyAqICAgQGV4aWZfaW5mbzogRXhpZiBpbmZvIHN0cnVjdAorICogICBAbW1fanBlZ19leGlmX3BhcmFtczogZXhpZiBwYXJhbXMKKyAqCisgKiAgUmV0dXJuICAgICA6IGludDMyX3QgdHlwZSBvZiBzdGF0dXMKKyAqICAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgRXh0cmFjdCBleGlmIGRhdGEgZnJvbSB0aGUgbWV0YWRhdGEKKyAqKi8KK2ludCBwcm9jZXNzX21ldGFfZGF0YShtZXRhZGF0YV9idWZmZXJfdCAqcF9tZXRhLCBRT01YX0VYSUZfSU5GTyAqZXhpZl9pbmZvLAorICBtbV9qcGVnX2V4aWZfcGFyYW1zX3QgKnBfY2FtX2V4aWZfcGFyYW1zLCBjYW1faGFsX3ZlcnNpb25fdCBoYWxfdmVyc2lvbikKK3sKKyAgaW50IHJjID0gMDsKKyAgY2FtX3NlbnNvcl9wYXJhbXNfdCBwX3NlbnNvcl9wYXJhbXM7CisgIGNhbV8zYV9wYXJhbXNfdCBwXzNhX3BhcmFtczsKKyAgYm9vbCBpc18zYV9tZXRhX3ZhbGlkID0gZmFsc2UsIGlzX3NlbnNvcl9tZXRhX3ZhbGlkID0gZmFsc2U7CisKKyAgbWVtc2V0KCZwXzNhX3BhcmFtcywgIDAsICBzaXplb2YoY2FtXzNhX3BhcmFtc190KSk7CisgIG1lbXNldCgmcF9zZW5zb3JfcGFyYW1zLCAwLCBzaXplb2YoY2FtX3NlbnNvcl9wYXJhbXNfdCkpOworCisgIGlmIChwX21ldGEpIHsKKyAgICAvKiBmb3IgSEFMIFYxKi8KKyAgICBpZiAoaGFsX3ZlcnNpb24gPT0gQ0FNX0hBTF9WMSkgeworCisgICAgICBJRl9NRVRBX0FWQUlMQUJMRShjYW1fM2FfcGFyYW1zX3QsIGxfM2FfcGFyYW1zLCBDQU1fSU5URl9NRVRBX0FFQ19JTkZPLAorICAgICAgICAgIHBfbWV0YSkgeworICAgICAgICBwXzNhX3BhcmFtcyA9ICpsXzNhX3BhcmFtczsKKyAgICAgICAgaXNfM2FfbWV0YV92YWxpZCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIElGX01FVEFfQVZBSUxBQkxFKGludDMyX3QsIHdiX21vZGUsIENBTV9JTlRGX1BBUk1fV0hJVEVfQkFMQU5DRSwgcF9tZXRhKSB7CisgICAgICAgIHBfM2FfcGFyYW1zLndiX21vZGUgPSAqd2JfbW9kZTsKKyAgICAgIH0KKworICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX3NlbnNvcl9wYXJhbXNfdCwgbF9zZW5zb3JfcGFyYW1zLAorICAgICAgICAgIENBTV9JTlRGX01FVEFfU0VOU09SX0lORk8sIHBfbWV0YSkgeworICAgICAgICBwX3NlbnNvcl9wYXJhbXMgPSAqbF9zZW5zb3JfcGFyYW1zOworICAgICAgICBpc19zZW5zb3JfbWV0YV92YWxpZCA9IHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8qIEhBTCBWMyAqLworICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgaXNvLCBDQU1fSU5URl9NRVRBX1NFTlNPUl9TRU5TSVRJVklUWSwgcF9tZXRhKSB7CisgICAgICAgIHBfM2FfcGFyYW1zLmlzb192YWx1ZT0gKmlzbzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBleHRyYWN0IElzbyB2YWx1ZSIpOworICAgICAgfQorCisgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQ2NF90LCBzZW5zb3JfZXhwb3N1cmVfdGltZSwKKyAgICAgICAgICBDQU1fSU5URl9NRVRBX1NFTlNPUl9FWFBPU1VSRV9USU1FLCBwX21ldGEpIHsKKyAgICAgICAgcF8zYV9wYXJhbXMuZXhwX3RpbWUgPQorICAgICAgICAgIChmbG9hdCkoKGRvdWJsZSkoKnNlbnNvcl9leHBvc3VyZV90aW1lKSAvIDEwMDAwMDAwMDAuMCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJDYW5ub3QgZXh0cmFjdCBFeHAgdGltZSB2YWx1ZSIpOworICAgICAgfQorCisgICAgICBJRl9NRVRBX0FWQUlMQUJMRShpbnQzMl90LCB3Yl9tb2RlLCBDQU1fSU5URl9QQVJNX1dISVRFX0JBTEFOQ0UsIHBfbWV0YSkgeworICAgICAgICBwXzNhX3BhcmFtcy53Yl9tb2RlID0gKndiX21vZGU7CisgICAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJDYW5ub3QgZXh0cmFjdCB3aGl0ZSBiYWxhbmNlIG1vZGUiKTsKKyAgICAgIH0KKworICAgICAgLyogUHJvY2VzcyBzZW5zb3IgZGF0YSAqLworICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoZmxvYXQsIGFwZXJ0dXJlLCBDQU1fSU5URl9NRVRBX0xFTlNfQVBFUlRVUkUsIHBfbWV0YSkgeworICAgICAgICBwX3NlbnNvcl9wYXJhbXMuYXBlcnR1cmVfdmFsdWUgPSAqYXBlcnR1cmU7CisgICAgICB9IGVsc2UgeworICAgICAgICBMT0dFKCJDYW5ub3QgZXh0cmFjdCBBcGVydHVyZSB2YWx1ZSIpOworICAgICAgfQorCisgICAgICBJRl9NRVRBX0FWQUlMQUJMRSh1aW50MzJfdCwgZmxhc2hfbW9kZSwgQ0FNX0lOVEZfTUVUQV9GTEFTSF9NT0RFLCBwX21ldGEpIHsKKyAgICAgICAgcF9zZW5zb3JfcGFyYW1zLmZsYXNoX21vZGUgPSAqZmxhc2hfbW9kZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBleHRyYWN0IGZsYXNoIG1vZGUgdmFsdWUiKTsKKyAgICAgIH0KKworICAgICAgSUZfTUVUQV9BVkFJTEFCTEUoaW50MzJfdCwgZmxhc2hfc3RhdGUsIENBTV9JTlRGX01FVEFfRkxBU0hfU1RBVEUsIHBfbWV0YSkgeworICAgICAgICBwX3NlbnNvcl9wYXJhbXMuZmxhc2hfc3RhdGUgPSAoY2FtX2ZsYXNoX3N0YXRlX3QpICpmbGFzaF9zdGF0ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExPR0UoIkNhbm5vdCBleHRyYWN0IGZsYXNoIHN0YXRlIHZhbHVlIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyogdGFrZSB0aGUgY2FjaGVkIHZhbHVlcyBpZiBtZXRhIGlzIGludmFsaWQgKi8KKyAgaWYgKCghaXNfM2FfbWV0YV92YWxpZCkgJiYgKGhhbF92ZXJzaW9uID09IENBTV9IQUxfVjEpKSB7CisgICAgcF8zYV9wYXJhbXMgPSBwX2NhbV9leGlmX3BhcmFtcy0+Y2FtXzNhX3BhcmFtczsKKyAgICBMT0dXKCJXYXJuaW5nIHVzaW5nIGNhY2hlZCB2YWx1ZXMgZm9yIDNhIik7CisgIH0KKworICBpZiAoKCFpc19zZW5zb3JfbWV0YV92YWxpZCkgJiYgKGhhbF92ZXJzaW9uID09IENBTV9IQUxfVjEpKSB7CisgICAgcF9zZW5zb3JfcGFyYW1zID0gcF9jYW1fZXhpZl9wYXJhbXMtPnNlbnNvcl9wYXJhbXM7CisgICAgTE9HVygiV2FybmluZyB1c2luZyBjYWNoZWQgdmFsdWVzIGZvciBzZW5zb3IiKTsKKyAgfQorCisgIGlmICgoaGFsX3ZlcnNpb24gIT0gQ0FNX0hBTF9WMSkgfHwgKHBfc2Vuc29yX3BhcmFtcy5zZW5zX3R5cGUgIT0gQ0FNX1NFTlNPUl9ZVVYpKSB7CisgICAgcmMgPSBwcm9jZXNzXzNhX2RhdGEoJnBfM2FfcGFyYW1zLCBleGlmX2luZm8pOworICAgIGlmIChyYykgeworICAgICAgTE9HRSgiRmFpbGVkIHRvIGFkZCAzYSBleGlmIHBhcmFtcyIpOworICAgIH0KKyAgfQorCisgIHJjID0gcHJvY2Vzc19zZW5zb3JfZGF0YSgmcF9zZW5zb3JfcGFyYW1zLCBleGlmX2luZm8pOworICBpZiAocmMpIHsKKyAgICBMT0dFKCJGYWlsZWQgdG8gZXh0cmFjdCBzZW5zb3IgcGFyYW1zIik7CisgIH0KKworICBpZiAocF9tZXRhKSB7CisgICAgc2hvcnQgdmFsX3Nob3J0ID0gMDsKKyAgICBjYW1fYXNkX2RlY2lzaW9uX3QgKnNjZW5lX2luZm8gPSBOVUxMOworCisgICAgSUZfTUVUQV9BVkFJTEFCTEUoY2FtX2FzZF9kZWNpc2lvbl90LCBzY2VuZV9jYXBfdHlwZSwKKyAgICAgICAgQ0FNX0lOVEZfTUVUQV9BU0RfU0NFTkVfSU5GTywgcF9tZXRhKSB7CisgICAgICBzY2VuZV9pbmZvID0gKGNhbV9hc2RfZGVjaXNpb25fdCopc2NlbmVfY2FwX3R5cGU7CisgICAgICB2YWxfc2hvcnQgPSAoc2hvcnQpIHNjZW5lX2luZm8tPmRldGVjdGVkX3NjZW5lOworICAgIH0KKworICAgIHJjID0gYWRkRXhpZkVudHJ5KGV4aWZfaW5mbywgRVhJRlRBR0lEX1NDRU5FX0NBUFRVUkVfVFlQRSwgRVhJRl9TSE9SVCwKKyAgICAgIHNpemVvZih2YWxfc2hvcnQpLzIsICZ2YWxfc2hvcnQpOworICAgIGlmIChyYykgeworICAgICAgTE9HRSgiOiBFcnJvciBhZGRpbmcgQVNEIEV4aWYgRW50cnkiKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgTE9HRSgiOiBFcnJvciBhZGRpbmcgQVNEIEV4aWYgRW50cnksIG5vIG1ldGEiKTsKKyAgfQorICByZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2Uvc3JjL21tX2pwZWdfaW50ZXJmYWNlLmMgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2Uvc3JjL21tX2pwZWdfaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1NWM0OQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9zcmMvbW1fanBlZ19pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDQwOSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvLyBUbyByZW1vdmUKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisvLyBKUEVHIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX2pwZWdfZGJnLmgiCisjaW5jbHVkZSAibW1fanBlZ19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJtbV9qcGVnLmgiCisjaW5jbHVkZSAibW1fanBlZ19tcG8uaCIKKworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBnX2ludGZfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgbW1fanBlZ19vYmoqIGdfanBlZ19vYmogPSBOVUxMOworCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdfaGFuZGxlcl9sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyB1aW50MTZfdCBnX2hhbmRsZXJfaGlzdG9yeV9jb3VudCA9IDA7IC8qIGhpc3RvcnkgY291bnQgZm9yIGhhbmRsZXIgKi8KK3ZvbGF0aWxlIHVpbnQzMl90IGdLcGlEZWJ1Z0xldmVsID0gMDsKKworLyoqIG1tX2pwZWdfdXRpbF9nZW5lcmF0ZV9oYW5kbGVyOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAaW5kZXg6IGNsaWVudCBpbmRleAorICoKKyAqICBSZXR1cm46CisgKiAgICAgICBoYW5kbGUgdmFsdWUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICB1dGlsaXR5IGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGhhbmRsZXIKKyAqCisgKiovCit1aW50MzJfdCBtbV9qcGVnX3V0aWxfZ2VuZXJhdGVfaGFuZGxlcih1aW50OF90IGluZGV4KQoreworICB1aW50MzJfdCBoYW5kbGVyID0gMDsKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2hhbmRsZXJfbG9jayk7CisgIGdfaGFuZGxlcl9oaXN0b3J5X2NvdW50Kys7CisgIGlmICgwID09IGdfaGFuZGxlcl9oaXN0b3J5X2NvdW50KSB7CisgICAgZ19oYW5kbGVyX2hpc3RvcnlfY291bnQrKzsKKyAgfQorICBoYW5kbGVyID0gZ19oYW5kbGVyX2hpc3RvcnlfY291bnQ7CisgIGhhbmRsZXIgPSAoaGFuZGxlcjw8OCkgfCBpbmRleDsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaGFuZGxlcl9sb2NrKTsKKyAgcmV0dXJuIGhhbmRsZXI7Cit9CisKKy8qKiBtbV9qcGVnX3V0aWxfZ2V0X2luZGV4X2J5X2hhbmRsZXI6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBoYW5kbGVyOiBoYW5kbGUgdmFsdWUKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgY2xpZW50IGluZGV4CisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgZ2V0IGNsaWVudCBpbmRleAorICoKKyAqKi8KK3VpbnQ4X3QgbW1fanBlZ191dGlsX2dldF9pbmRleF9ieV9oYW5kbGVyKHVpbnQzMl90IGhhbmRsZXIpCit7CisgIHJldHVybiAoaGFuZGxlciAmIDB4MDAwMDAwZmYpOworfQorCisvKiogbW1fanBlZ19pbnRmX3N0YXJ0X2pvYjoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQGNsaWVudF9oZGw6IGNsaWVudCBoYW5kbGUKKyAqICAgIEBqb2I6IGpwZWcgam9iIG9iamVjdAorICogICAgQGpvYklkOiBqb2IgaWQKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBzdWNjZXNzLCBmYWlsdXJlIG90aGVyd2lzZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIHN0YXJ0IHRoZSBqcGVnIGpvYgorICoKKyAqKi8KK3N0YXRpYyBpbnQzMl90IG1tX2pwZWdfaW50Zl9zdGFydF9qb2IobW1fanBlZ19qb2JfdCogam9iLCB1aW50MzJfdCogam9iX2lkKQoreworICBpbnQzMl90IHJjID0gLTE7CisKKyAgaWYgKE5VTEwgPT0gam9iIHx8CisgICAgTlVMTCA9PSBqb2JfaWQpIHsKKyAgICBMT0dFKCJpbnZhbGlkIHBhcmFtZXRlcnMgZm9yIGpvYiBvciBqb2JJZCIpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworICBpZiAoTlVMTCA9PSBnX2pwZWdfb2JqKSB7CisgICAgLyogbW1fanBlZyBvYmogbm90IGV4aXN0cywgcmV0dXJuIGVycm9yICovCisgICAgTE9HRSgibW1fanBlZyBpcyBub3Qgb3BlbmVkIHlldCIpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgcmV0dXJuIHJjOworICB9CisgIHJjID0gbW1fanBlZ19zdGFydF9qb2IoZ19qcGVnX29iaiwgam9iLCBqb2JfaWQpOworICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICByZXR1cm4gcmM7Cit9CisKKy8qKiBtbV9qcGVnX2ludGZfY3JlYXRlX3Nlc3Npb246CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBjbGllbnRfaGRsOiBjbGllbnQgaGFuZGxlCisgKiAgICBAcF9wYXJhbXM6IGVuY29kZSBwYXJhbWV0ZXJzCisgKiAgICBAcF9zZXNzaW9uX2lkOiBzZXNzaW9uIGlkCisgKgorICogIFJldHVybjoKKyAqICAgICAgIDAgc3VjY2VzcywgZmFpbHVyZSBvdGhlcndpc2UKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDcmVhdGUgbmV3IGpwZWcgc2Vzc2lvbgorICoKKyAqKi8KK3N0YXRpYyBpbnQzMl90IG1tX2pwZWdfaW50Zl9jcmVhdGVfc2Vzc2lvbih1aW50MzJfdCBjbGllbnRfaGRsLAorICAgIG1tX2pwZWdfZW5jb2RlX3BhcmFtc190ICpwX3BhcmFtcywKKyAgICB1aW50MzJfdCAqcF9zZXNzaW9uX2lkKQoreworICBpbnQzMl90IHJjID0gLTE7CisKKyAgaWYgKDAgPT0gY2xpZW50X2hkbCB8fCBOVUxMID09IHBfcGFyYW1zIHx8IE5VTEwgPT0gcF9zZXNzaW9uX2lkKSB7CisgICAgTE9HRSgiaW52YWxpZCBjbGllbnRfaGRsIG9yIGpvYklkIik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgIGlmIChOVUxMID09IGdfanBlZ19vYmopIHsKKyAgICAvKiBtbV9qcGVnIG9iaiBub3QgZXhpc3RzLCByZXR1cm4gZXJyb3IgKi8KKyAgICBMT0dFKCJtbV9qcGVnIGlzIG5vdCBvcGVuZWQgeWV0Iik7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworIHJjID0gbW1fanBlZ19jcmVhdGVfc2Vzc2lvbihnX2pwZWdfb2JqLCBjbGllbnRfaGRsLCBwX3BhcmFtcywgcF9zZXNzaW9uX2lkKTsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ19pbnRmX2Rlc3Ryb3lfc2Vzc2lvbjoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHNlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBzdWNjZXNzLCBmYWlsdXJlIG90aGVyd2lzZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIERlc3Ryb3kganBlZyBzZXNzaW9uCisgKgorICoqLworc3RhdGljIGludDMyX3QgbW1fanBlZ19pbnRmX2Rlc3Ryb3lfc2Vzc2lvbih1aW50MzJfdCBzZXNzaW9uX2lkKQoreworICBpbnQzMl90IHJjID0gLTE7CisKKyAgaWYgKDAgPT0gc2Vzc2lvbl9pZCkgeworICAgIExPR0UoImludmFsaWQgY2xpZW50X2hkbCBvciBqb2JJZCIpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworICBpZiAoTlVMTCA9PSBnX2pwZWdfb2JqKSB7CisgICAgLyogbW1fanBlZyBvYmogbm90IGV4aXN0cywgcmV0dXJuIGVycm9yICovCisgICAgTE9HRSgibW1fanBlZyBpcyBub3Qgb3BlbmVkIHlldCIpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgcmMgPSBtbV9qcGVnX2Rlc3Ryb3lfc2Vzc2lvbl9ieV9pZChnX2pwZWdfb2JqLCBzZXNzaW9uX2lkKTsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ19pbnRmX2Fib3J0X2pvYjoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQGpvYklkOiBqb2IgaWQKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBzdWNjZXNzLCBmYWlsdXJlIG90aGVyd2lzZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIEFib3J0IHRoZSBqcGVnIGpvYgorICoKKyAqKi8KK3N0YXRpYyBpbnQzMl90IG1tX2pwZWdfaW50Zl9hYm9ydF9qb2IodWludDMyX3Qgam9iX2lkKQoreworICBpbnQzMl90IHJjID0gLTE7CisKKyAgaWYgKDAgPT0gam9iX2lkKSB7CisgICAgTE9HRSgiaW52YWxpZCBqb2JJZCIpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19pbnRmX2xvY2spOworICBpZiAoTlVMTCA9PSBnX2pwZWdfb2JqKSB7CisgICAgLyogbW1fanBlZyBvYmogbm90IGV4aXN0cywgcmV0dXJuIGVycm9yICovCisgICAgTE9HRSgibW1fanBlZyBpcyBub3Qgb3BlbmVkIHlldCIpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgcmMgPSBtbV9qcGVnX2Fib3J0X2pvYihnX2pwZWdfb2JqLCBqb2JfaWQpOworICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICByZXR1cm4gcmM7Cit9CisKKy8qKiBtbV9qcGVnX2ludGZfY2xvc2U6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBjbGllbnRfaGRsOiBjbGllbnQgaGFuZGxlCisgKgorICogIFJldHVybjoKKyAqICAgICAgIDAgc3VjY2VzcywgZmFpbHVyZSBvdGhlcndpc2UKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDbG9zZSB0aGUganBlZyBqb2IKKyAqCisgKiovCitzdGF0aWMgaW50MzJfdCBtbV9qcGVnX2ludGZfY2xvc2UodWludDMyX3QgY2xpZW50X2hkbCkKK3sKKyAgaW50MzJfdCByYyA9IC0xOworCisgIGlmICgwID09IGNsaWVudF9oZGwpIHsKKyAgICBMT0dFKCJpbnZhbGlkIGNsaWVudF9oZGwiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworICBwdGhyZWFkX211dGV4X2xvY2soJmdfaW50Zl9sb2NrKTsKKyAgaWYgKE5VTEwgPT0gZ19qcGVnX29iaikgeworICAgIC8qIG1tX2pwZWcgb2JqIG5vdCBleGlzdHMsIHJldHVybiBlcnJvciAqLworICAgIExPR0UoIm1tX2pwZWcgaXMgbm90IG9wZW5lZCB5ZXQiKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICAgIHJldHVybiByYzsKKyAgfQorCisgIHJjID0gbW1fanBlZ19jbG9zZShnX2pwZWdfb2JqLCBjbGllbnRfaGRsKTsKKyAgZ19qcGVnX29iai0+bnVtX2NsaWVudHMtLTsKKyAgaWYoMCA9PSByYykgeworICAgIGlmICgwID09IGdfanBlZ19vYmotPm51bV9jbGllbnRzKSB7CisgICAgICAvKiBObyBjbGllbnQsIGNsb3NlIGpwZWcgaW50ZXJuYWxseSAqLworICAgICAgcmMgPSBtbV9qcGVnX2RlaW5pdChnX2pwZWdfb2JqKTsKKyAgICAgIGZyZWUoZ19qcGVnX29iaik7CisgICAgICBnX2pwZWdfb2JqID0gTlVMTDsKKyAgICB9CisgIH0KKworICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICByZXR1cm4gcmM7Cit9CisKKy8qKiBtbV9qcGVnX2ludGZfY29tcG9zZV9tcG86CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBtcG9faW5mbyA6IE1QTyBJbmZvcm1hdGlvbgorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIHN1Y2Nlc3MsIGZhaWx1cmUgb3RoZXJ3aXNlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgQ29tcG9zZSBNUE8gaW1hZ2UgZnJvbSBqcGVnIGltYWdlcworICoKKyAqKi8KK3N0YXRpYyBpbnQzMl90IG1tX2pwZWdfaW50Zl9jb21wb3NlX21wbyhtbV9qcGVnX21wb19pbmZvX3QgKm1wb19pbmZvKQoreworICBpbnQzMl90IHJjID0gLTE7CisgIGlmICghbXBvX2luZm8pIHsKKyAgICBMT0dFKCJJbnZhbGlkIGlucHV0Iik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgaWYgKG1wb19pbmZvLT5udW1fb2ZfaW1hZ2VzID4gTU1fSlBFR19NQVhfTVBPX0lNQUdFUykgeworICAgIExPR0UoIk51bSBvZiBpbWFnZXMgZXhjZWVkcyBtYXggc3VwcG9ydGVkIGltYWdlcyBpbiBNUE8iKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKyAgLy9DYWxsIE1QbyBjb21wb3NpdGlvbgorICByYyA9IG1tX2pwZWdfbXBvX2NvbXBvc2UobXBvX2luZm8pOworCisgIHJldHVybiByYzsKK30KKworLyoqIGpwZWdfb3BlbjoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQG9wczogb3BzIHRhYmxlIHBvaW50ZXIKKyAqICAgIEBtcG9fb3BzOiBtcG8gb3BzIHRhYmxlIHB0cgorICogICAgQHBpY3R1cmVfc2l6ZTogTWF4IGF2YWlsYWJsZSBkaW0KKyAqICAgIEBqcGVnX21ldGFkYXRhOiBKcGVnIG1ldGEgZGF0YQorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIGZhaWx1cmUsIHN1Y2Nlc3Mgb3RoZXJ3aXNlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgT3BlbiBhIGpwZWcgY2xpZW50LiBKcGVnIG1ldGEgZGF0YSB3aWxsIGJlIGNhY2hlZAorICogICAgICAgYnV0IG1lbW9yeSBtYW5lZ2VtZW50IGhhcyB0byBiZSBkb25lIGJ5IHRoZSBjaWVudC4KKyAqCisgKiovCit1aW50MzJfdCBqcGVnX29wZW4obW1fanBlZ19vcHNfdCAqb3BzLCBtbV9qcGVnX21wb19vcHNfdCAqbXBvX29wcywKKyAgbW1fZGltZW5zaW9uIHBpY3R1cmVfc2l6ZSwKKyAgY2FtX2pwZWdfbWV0YWRhdGFfdCAqanBlZ19tZXRhZGF0YSkKK3sKKyAgaW50MzJfdCByYyA9IDA7CisgIHVpbnQzMl90IGNsbnRfaGRsID0gMDsKKyAgbW1fanBlZ19vYmoqIGpwZWdfb2JqID0gTlVMTDsKKyAgY2hhciBwcm9wW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5rcGkuZGVidWciLCBwcm9wLCAiMCIpOworICBnS3BpRGVidWdMZXZlbCA9IGF0b2kocHJvcCk7CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2ludGZfbG9jayk7CisgIC8qIGZpcnN0IHRpbWUgb3BlbiAqLworICBpZihOVUxMID09IGdfanBlZ19vYmopIHsKKyAgICBqcGVnX29iaiA9IChtbV9qcGVnX29iaiAqKW1hbGxvYyhzaXplb2YobW1fanBlZ19vYmopKTsKKyAgICBpZihOVUxMID09IGpwZWdfb2JqKSB7CisgICAgICBMT0dFKCJubyBtZW0iKTsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2ludGZfbG9jayk7CisgICAgICByZXR1cm4gY2xudF9oZGw7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBqcGVnIG9iaiAqLworICAgIG1lbXNldChqcGVnX29iaiwgMCwgc2l6ZW9mKG1tX2pwZWdfb2JqKSk7CisKKyAgICAvKiBieSBkZWZhdWx0IHJldXNlIHJlcHJvYyBzb3VyY2UgYnVmZmVyIGlmIGF2YWlsYWJsZSAqLworICAgIGlmIChtcG9fb3BzID09IE5VTEwpIHsKKyAgICAgIGpwZWdfb2JqLT5yZXVzZV9yZXByb2NfYnVmZmVyID0gMTsKKyAgICB9IGVsc2UgeworICAgICAganBlZ19vYmotPnJldXNlX3JlcHJvY19idWZmZXIgPSAwOworICAgIH0KKyAgIExPR0goInJldXNlX3JlcHJvY19idWZmZXIgJWQgIiwKKyAgICAgIGpwZWdfb2JqLT5yZXVzZV9yZXByb2NfYnVmZmVyKTsKKworICAgIC8qIHVzZWQgZm9yIHdvcmsgYnVmIGNhbGN1bGF0aW9uICovCisgICAganBlZ19vYmotPm1heF9waWNfdyA9IHBpY3R1cmVfc2l6ZS53OworICAgIGpwZWdfb2JqLT5tYXhfcGljX2ggPSBwaWN0dXJlX3NpemUuaDsKKworICAgIC8qQ2FjaGUgT1RQIERhdGEgZm9yIHRoZSBzZXNzaW9uKi8KKyAgICBpZiAoTlVMTCAhPSBqcGVnX21ldGFkYXRhKSB7CisgICAgICBqcGVnX29iai0+anBlZ19tZXRhZGF0YSA9IGpwZWdfbWV0YWRhdGE7CisgICAgfQorCisgICAgcmMgPSBtbV9qcGVnX2luaXQoanBlZ19vYmopOworICAgIGlmKDAgIT0gcmMpIHsKKyAgICAgIExPR0UoIm1tX2pwZWdfaW5pdCBlcnIgPSAlZCIsIHJjKTsKKyAgICAgIGZyZWUoanBlZ19vYmopOworICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfaW50Zl9sb2NrKTsKKyAgICAgIHJldHVybiBjbG50X2hkbDsKKyAgICB9CisKKyAgICAvKiByZW1lbWJlciBpbiBnbG9iYWwgdmFyaWFibGUgKi8KKyAgICBnX2pwZWdfb2JqID0ganBlZ19vYmo7CisgIH0KKworICAvKiBvcGVuIG5ldyBjbGllbnQgKi8KKyAgY2xudF9oZGwgPSBtbV9qcGVnX25ld19jbGllbnQoZ19qcGVnX29iaik7CisgIGlmIChjbG50X2hkbCA+IDApIHsKKyAgICAvKiB2YWxpZCBjbGllbnQgKi8KKyAgICBpZiAoTlVMTCAhPSBvcHMpIHsKKyAgICAgIC8qIGZpbGwgaW4gb3BzIHRibCBpZiBwdHIgbm90IE5VTEwgKi8KKyAgICAgIG9wcy0+c3RhcnRfam9iID0gbW1fanBlZ19pbnRmX3N0YXJ0X2pvYjsKKyAgICAgIG9wcy0+YWJvcnRfam9iID0gbW1fanBlZ19pbnRmX2Fib3J0X2pvYjsKKyAgICAgIG9wcy0+Y3JlYXRlX3Nlc3Npb24gPSBtbV9qcGVnX2ludGZfY3JlYXRlX3Nlc3Npb247CisgICAgICBvcHMtPmRlc3Ryb3lfc2Vzc2lvbiA9IG1tX2pwZWdfaW50Zl9kZXN0cm95X3Nlc3Npb247CisgICAgICBvcHMtPmNsb3NlID0gbW1fanBlZ19pbnRmX2Nsb3NlOworICAgIH0KKyAgICBpZiAoTlVMTCAhPSBtcG9fb3BzKSB7CisgICAgICBtcG9fb3BzLT5jb21wb3NlX21wbyA9IG1tX2pwZWdfaW50Zl9jb21wb3NlX21wbzsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogZmFpbGVkIG5ldyBjbGllbnQgKi8KKyAgICBMT0dFKCJtbV9qcGVnX25ld19jbGllbnQgZmFpbGVkIik7CisKKyAgICBpZiAoMCA9PSBnX2pwZWdfb2JqLT5udW1fY2xpZW50cykgeworICAgICAgLyogbm8gY2xpZW50LCBjbG9zZSBqcGVnICovCisgICAgICBtbV9qcGVnX2RlaW5pdChnX2pwZWdfb2JqKTsKKyAgICAgIGZyZWUoZ19qcGVnX29iaik7CisgICAgICBnX2pwZWdfb2JqID0gTlVMTDsKKyAgICB9CisgIH0KKworICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19pbnRmX2xvY2spOworICByZXR1cm4gY2xudF9oZGw7Cit9CmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2Uvc3JjL21tX2pwZWdfaW9uYnVmLmMgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2Uvc3JjL21tX2pwZWdfaW9uYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3MDJlNwotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9zcmMvbW1fanBlZ19pb25idWYuYwpAQCAtMCwwICsxLDIwNiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQsIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbXNtX2lvbi5oPgorI2RlZmluZSBNTUFOX0ggPFNZU1RFTV9IRUFERVJfUFJFRklYL21tYW4uaD4KKyNpbmNsdWRlIE1NQU5fSAorCisvLyBKUEVHIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX2pwZWdfaW9uYnVmLmgiCisKKy8qKiBidWZmZXJfYWxsb2NhdGU6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgICBAcF9idWZmZXI6IElPTiBidWZmZXIKKyAqCisgKiAgUmV0dXJuOgorICogICAgIGJ1ZmZlciBhZGRyZXNzCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICBhbGxvY2F0ZXMgSU9OIGJ1ZmZlcgorICoKKyAqKi8KK3ZvaWQgKmJ1ZmZlcl9hbGxvY2F0ZShidWZmZXJfdCAqcF9idWZmZXIsIGludCBjYWNoZWQpCit7CisgIHZvaWQgKmxfYnVmZmVyID0gTlVMTDsKKworICBpbnQgbHJjID0gMDsKKyAgc3RydWN0IGlvbl9oYW5kbGVfZGF0YSBsaGFuZGxlX2RhdGE7CisKKyAgIHBfYnVmZmVyLT5hbGxvYy5sZW4gPSBwX2J1ZmZlci0+c2l6ZTsKKyAgIHBfYnVmZmVyLT5hbGxvYy5hbGlnbiA9IDQwOTY7CisgICBwX2J1ZmZlci0+YWxsb2MuZmxhZ3MgPSAoY2FjaGVkKSA/IElPTl9GTEFHX0NBQ0hFRCA6IDA7CisgICBwX2J1ZmZlci0+YWxsb2MuaGVhcF9pZF9tYXNrID0gMHgxIDw8IElPTl9JT01NVV9IRUFQX0lEOworCisgICBwX2J1ZmZlci0+aW9uX2ZkID0gb3BlbigiL2Rldi9pb24iLCBPX1JET05MWSk7CisgICBpZihwX2J1ZmZlci0+aW9uX2ZkIDwgMCkgeworICAgIExPR0UoIklvbiBvcGVuIGZhaWxlZCIpOworICAgIGdvdG8gSU9OX0FMTE9DX0ZBSUxFRDsKKyAgfQorCisgIC8qIE1ha2UgaXQgcGFnZSBzaXplIGFsaWduZWQgKi8KKyAgcF9idWZmZXItPmFsbG9jLmxlbiA9IChwX2J1ZmZlci0+YWxsb2MubGVuICsgNDA5NVUpICYgKH40MDk1VSk7CisgIGxyYyA9IGlvY3RsKHBfYnVmZmVyLT5pb25fZmQsIElPTl9JT0NfQUxMT0MsICZwX2J1ZmZlci0+YWxsb2MpOworICBpZiAobHJjIDwgMCkgeworICAgIExPR0UoIklPTiBhbGxvY2F0aW9uIGZhaWxlZCBsZW4gJXp1IiwKKyAgICAgIHBfYnVmZmVyLT5hbGxvYy5sZW4pOworICAgIGdvdG8gSU9OX0FMTE9DX0ZBSUxFRDsKKyAgfQorCisgIHBfYnVmZmVyLT5pb25faW5mb19mZC5oYW5kbGUgPSBwX2J1ZmZlci0+YWxsb2MuaGFuZGxlOworICBscmMgPSBpb2N0bChwX2J1ZmZlci0+aW9uX2ZkLCBJT05fSU9DX1NIQVJFLAorICAgICZwX2J1ZmZlci0+aW9uX2luZm9fZmQpOworICBpZiAobHJjIDwgMCkgeworICAgIExPR0UoIklPTiBtYXAgZmFpbGVkICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICBnb3RvIElPTl9NQVBfRkFJTEVEOworICB9CisKKyAgcF9idWZmZXItPnBfcG1lbV9mZCA9IHBfYnVmZmVyLT5pb25faW5mb19mZC5mZDsKKworICBsX2J1ZmZlciA9IG1tYXAoTlVMTCwgcF9idWZmZXItPmFsbG9jLmxlbiwgUFJPVF9SRUFEICB8IFBST1RfV1JJVEUsCisgICAgTUFQX1NIQVJFRCxwX2J1ZmZlci0+cF9wbWVtX2ZkLCAwKTsKKworICBpZiAobF9idWZmZXIgPT0gTUFQX0ZBSUxFRCkgeworICAgIExPR0UoIklPTl9NTUFQX0ZBSUxFRDogJXMgKCVkKSIsCisgICAgICBzdHJlcnJvcihlcnJubyksIGVycm5vKTsKKyAgICBnb3RvIElPTl9NQVBfRkFJTEVEOworICB9CisKKyAgcmV0dXJuIGxfYnVmZmVyOworCitJT05fTUFQX0ZBSUxFRDoKKyAgbGhhbmRsZV9kYXRhLmhhbmRsZSA9IHBfYnVmZmVyLT5pb25faW5mb19mZC5oYW5kbGU7CisgIGlvY3RsKHBfYnVmZmVyLT5pb25fZmQsIElPTl9JT0NfRlJFRSwgJmxoYW5kbGVfZGF0YSk7CisgIHJldHVybiBOVUxMOworSU9OX0FMTE9DX0ZBSUxFRDoKKyAgcmV0dXJuIE5VTEw7CisKK30KKworLyoqIGJ1ZmZlcl9kZWFsbG9jYXRlOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgQHBfYnVmZmVyOiBJT04gYnVmZmVyCisgKgorICogIFJldHVybjoKKyAqICAgICBidWZmZXIgYWRkcmVzcworICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgZGVhbGxvY2F0ZXMgSU9OIGJ1ZmZlcgorICoKKyAqKi8KK2ludCBidWZmZXJfZGVhbGxvY2F0ZShidWZmZXJfdCAqcF9idWZmZXIpCit7CisgIGludCBscmMgPSAwOworICBzaXplX3QgbHNpemUgPSAocF9idWZmZXItPnNpemUgKyA0MDk1VSkgJiAofjQwOTVVKTsKKworICBzdHJ1Y3QgaW9uX2hhbmRsZV9kYXRhIGxoYW5kbGVfZGF0YTsKKyAgbHJjID0gbXVubWFwKHBfYnVmZmVyLT5hZGRyLCBsc2l6ZSk7CisKKyAgY2xvc2UocF9idWZmZXItPmlvbl9pbmZvX2ZkLmZkKTsKKworICBsaGFuZGxlX2RhdGEuaGFuZGxlID0gcF9idWZmZXItPmlvbl9pbmZvX2ZkLmhhbmRsZTsKKyAgaW9jdGwocF9idWZmZXItPmlvbl9mZCwgSU9OX0lPQ19GUkVFLCAmbGhhbmRsZV9kYXRhKTsKKworICBjbG9zZShwX2J1ZmZlci0+aW9uX2ZkKTsKKyAgcmV0dXJuIGxyYzsKK30KKworLyoqIGJ1ZmZlcl9pbnZhbGlkYXRlOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICAgQHBfYnVmZmVyOiBJT04gYnVmZmVyCisgKgorICogIFJldHVybjoKKyAqICAgICBlcnJvciB2YWwKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgIEludmFsaWRhdGVzIHRoZSBjYWNoZWQgYnVmZmVyCisgKgorICoqLworaW50IGJ1ZmZlcl9pbnZhbGlkYXRlKGJ1ZmZlcl90ICpwX2J1ZmZlcikKK3sKKyAgaW50IGxyYyA9IDA7CisgIHN0cnVjdCBpb25fZmx1c2hfZGF0YSBjYWNoZV9pbnZfZGF0YTsKKyAgc3RydWN0IGlvbl9jdXN0b21fZGF0YSBjdXN0b21fZGF0YTsKKworICBtZW1zZXQoJmNhY2hlX2ludl9kYXRhLCAwLCBzaXplb2YoY2FjaGVfaW52X2RhdGEpKTsKKyAgbWVtc2V0KCZjdXN0b21fZGF0YSwgMCwgc2l6ZW9mKGN1c3RvbV9kYXRhKSk7CisgIGNhY2hlX2ludl9kYXRhLnZhZGRyID0gcF9idWZmZXItPmFkZHI7CisgIGNhY2hlX2ludl9kYXRhLmZkID0gcF9idWZmZXItPmlvbl9pbmZvX2ZkLmZkOworICBjYWNoZV9pbnZfZGF0YS5oYW5kbGUgPSBwX2J1ZmZlci0+aW9uX2luZm9fZmQuaGFuZGxlOworICBjYWNoZV9pbnZfZGF0YS5sZW5ndGggPSAodW5zaWduZWQgaW50KXBfYnVmZmVyLT5zaXplOworICBjdXN0b21fZGF0YS5jbWQgPSAodW5zaWduZWQgaW50KUlPTl9JT0NfSU5WX0NBQ0hFUzsKKyAgY3VzdG9tX2RhdGEuYXJnID0gKHVuc2lnbmVkIGxvbmcpJmNhY2hlX2ludl9kYXRhOworCisgIGxyYyA9IGlvY3RsKHBfYnVmZmVyLT5pb25fZmQsIElPTl9JT0NfQ1VTVE9NLCAmY3VzdG9tX2RhdGEpOworICBpZiAobHJjIDwgMCkKKyAgICBMT0dXKCJDYWNoZSBJbnZhbGlkYXRlIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisKKyAgcmV0dXJuIGxyYzsKK30KKworLyoqIGJ1ZmZlcl9jbGVhbjoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgIEBwX2J1ZmZlcjogSU9OIGJ1ZmZlcgorICoKKyAqICBSZXR1cm46CisgKiAgICAgZXJyb3IgdmFsCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICBDbGVhbiB0aGUgY2FjaGVkIGJ1ZmZlcgorICoKKyAqKi8KK2ludCBidWZmZXJfY2xlYW4oYnVmZmVyX3QgKnBfYnVmZmVyKQoreworICBpbnQgbHJjID0gMDsKKyAgc3RydWN0IGlvbl9mbHVzaF9kYXRhIGNhY2hlX2NsZWFuX2RhdGE7CisgIHN0cnVjdCBpb25fY3VzdG9tX2RhdGEgY3VzdG9tX2RhdGE7CisKKyAgbWVtc2V0KCZjYWNoZV9jbGVhbl9kYXRhLCAwLCBzaXplb2YoY2FjaGVfY2xlYW5fZGF0YSkpOworICBtZW1zZXQoJmN1c3RvbV9kYXRhLCAwLCBzaXplb2YoY3VzdG9tX2RhdGEpKTsKKyAgY2FjaGVfY2xlYW5fZGF0YS52YWRkciA9IHBfYnVmZmVyLT5hZGRyOworICBjYWNoZV9jbGVhbl9kYXRhLmZkID0gcF9idWZmZXItPmlvbl9pbmZvX2ZkLmZkOworICBjYWNoZV9jbGVhbl9kYXRhLmhhbmRsZSA9IHBfYnVmZmVyLT5pb25faW5mb19mZC5oYW5kbGU7CisgIGNhY2hlX2NsZWFuX2RhdGEubGVuZ3RoID0gKHVuc2lnbmVkIGludClwX2J1ZmZlci0+c2l6ZTsKKyAgY3VzdG9tX2RhdGEuY21kID0gKHVuc2lnbmVkIGludClJT05fSU9DX0NMRUFOX0NBQ0hFUzsKKyAgY3VzdG9tX2RhdGEuYXJnID0gKHVuc2lnbmVkIGxvbmcpJmNhY2hlX2NsZWFuX2RhdGE7CisKKyAgbHJjID0gaW9jdGwocF9idWZmZXItPmlvbl9mZCwgSU9OX0lPQ19DVVNUT00sICZjdXN0b21fZGF0YSk7CisgIGlmIChscmMgPCAwKQorICAgIExPR1coIkNhY2hlIGNsZWFuIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisKKyAgcmV0dXJuIGxyYzsKK30KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9zcmMvbW1fanBlZ19tcG9fY29tcG9zZXIuYyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9zcmMvbW1fanBlZ19tcG9fY29tcG9zZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjljMjIyCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3NyYy9tbV9qcGVnX21wb19jb21wb3Nlci5jCkBAIC0wLDAgKzEsNDE0IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisvLyBKUEVHIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIm1tX2pwZWdfZGJnLmgiCisjaW5jbHVkZSAibW1fanBlZ19tcG8uaCIKKworI2RlZmluZSBNX0FQUDAgICAgMHhlMAorI2RlZmluZSBNX0FQUDEgICAgMHhlMQorI2RlZmluZSBNX0FQUDIgICAgMHhlMgorI2RlZmluZSBNX0VPSSAgICAgMHhkOQorI2RlZmluZSBNX1NPSSAgICAgMHhkOAorCisvKiogUkVBRF9MT05HOgorICogIEBiOiBCdWZmZXIgc3RhcnQgYWRkcgorICogIEBvOiBCdWZmZXIgb2Zmc2V0IHRvIHN0YXJ0IHJlYWRpbmcKKyAqCisgKiAgUmVhZCBsb25nIHZhbHVlIGZyb20gdGhlIHNwZWNpZmllZCBidWZmIGFkZHIgYXQgZ2l2ZW4gb2Zmc2V0CisgKiovCisjZGVmaW5lIFJFQURfTE9ORyhiLCBvKSAgXAorICAodWludDMyX3QpKCgodWludDMyX3QpYltvXSA8PCAyNCkgKyBcCisgICgodWludDMyX3QpYltvKzFdIDw8IDE2KSArIFwKKyAgKCh1aW50MzJfdCliW28rMl0gPDwgOCkgKyBcCisgICgodWludDMyX3QpYltvKzNdKSkKKworLyoqIFJFQURfTE9OR19MSVRUTEU6CisgKiAgQGI6IEJ1ZmZlciBzdGFydCBhZGRyCisgKiAgQG86IEJ1ZmZlciBvZmZzZXQgdG8gc3RhcnQgcmVhZGluZworICoKKyAqICBSZWFkIGxvbmcgdmFsdWUgZnJvbSB0aGUgc3BlY2lmaWVkIGJ1ZmYgYWRkciBhdCBnaXZlbiBvZmZzZXQKKyAqICBpbiBMaXR0bGUgRW5kaWFuCisgKiovCisjZGVmaW5lIFJFQURfTE9OR19MSVRUTEUoYiwgbykgIFwKKyAgKHVpbnQzMl90KSgoKHVpbnQzMl90KWJbbyArIDNdIDw8IDI0KSArIFwKKyAgKCh1aW50MzJfdCkgYltvICsgMl0gPDwgMTYpICsgXAorICAoKHVpbnQzMl90KSBiW28gKyAxXSA8PCA4KSArIFwKKyAgKHVpbnQzMl90KSBiW29dKTsKKworLyoqIFJFQURfTE9ORzoKKyAqICBAYjogQnVmZmVyIHN0YXJ0IGFkZHIKKyAqICBAbzogQnVmZmVyIG9mZnNldCB0byBzdGFydCByZWFkaW5nCisgKgorICogIFJlYWQgc2hvcnQgdmFsdWUgZnJvbSB0aGUgc3BlY2lmaWVkIGJ1ZmYgYWRkciBhdCBnaXZlbgorICogIG9mZnNldAorICoqLworI2RlZmluZSBSRUFEX1NIT1JUKGIsIG8pICBcCisgICh1aW50MTZfdCkgKCgodWludDE2X3QpYltvXSA8PCA4KSArIFwKKyAgKHVpbnQxNl90KSBiW28gKyAxXSk7CisKKy8qTXV0ZXggdG8gc2VyaWFsaXphIE1QTyBjb21wb3NpdGlvbiovCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdfbXBvX2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworCisvKiogbW1fanBlZ19tcG9fd3JpdGVfbG9uZ19saXR0bGVfZW5kaWFuCisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBidWZmZXJfYWRkcjogaW1hZ2Ugc3RhcnQgYWRkcgorICogICAgQGJ1ZmZfb2Zmc2V0OiBvZmZzZXQgaW4gdGhlIGJ1ZmZlcgorICogICAgQGJ1ZmZlcl9zaXplOiBTaXplIG9mIHRoZSBidWZmZXIKKyAqICAgIEB2YWx1ZTogVmFsdWUgdG8gd3JpdGUKKyAqICAgIEBvdmVyZmxvdyA6IE92ZXJmbG93IGZsYWcKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgTm9uZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIFdyaXRlIHZhbHVlIGF0IHRoZSBnaXZlbiBvZmZzZXQKKyAqCisgKiovCit2b2lkIG1tX2pwZWdfbXBvX3dyaXRlX2xvbmdfbGl0dGxlX2VuZGlhbih1aW50OF90ICpidWZmX2FkZHIsIHVpbnQzMl90IGJ1ZmZfb2Zmc2V0LAorICB1aW50MzJfdCBidWZmZXJfc2l6ZSwgaW50IHZhbHVlLCB1aW50OF90ICpvdmVyZmxvdykKK3sKKyAgaWYgKGJ1ZmZfb2Zmc2V0ICsgMyA+PSBidWZmZXJfc2l6ZSkgeworICAgICpvdmVyZmxvdyA9IFRSVUU7CisgIH0KKworICBpZiAoISgqb3ZlcmZsb3cpKSB7CisgICAgYnVmZl9hZGRyW2J1ZmZfb2Zmc2V0ICsgM10gPSAodWludDhfdCkoKHZhbHVlID4+IDI0KSAmIDB4RkYpOworICAgIGJ1ZmZfYWRkcltidWZmX29mZnNldCArIDJdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKKyAgICBidWZmX2FkZHJbYnVmZl9vZmZzZXQgKyAxXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBidWZmX2FkZHJbYnVmZl9vZmZzZXRdID0gKHVpbnQ4X3QpKHZhbHVlICYgMHhGRik7CisgIH0KK30KKworLyoqIG1tX2pwZWdfbXBvX3dyaXRlX2xvbmcKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQGJ1ZmZlcl9hZGRyOiBpbWFnZSBzdGFydCBhZGRyCisgKiAgICBAYnVmZl9vZmZzZXQ6IG9mZnNldCBpbiB0aGUgYnVmZmVyCisgKiAgICBAYnVmZmVyX3NpemU6IFNpemUgb2YgdGhlIGJ1ZmZlcgorICogICAgQHZhbHVlOiBWYWx1ZSB0byB3cml0ZQorICogICAgQG92ZXJmbG93IDogT3ZlcmZsb3cgZmxhZworICoKKyAqICBSZXR1cm46CisgKiAgICAgICBOb25lCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgV3JpdGUgdmFsdWUgYXQgdGhlIGdpdmVuIG9mZnNldAorICoKKyAqKi8KK3ZvaWQgbW1fanBlZ19tcG9fd3JpdGVfbG9uZyh1aW50OF90ICpidWZmX2FkZHIsIHVpbnQzMl90IGJ1ZmZfb2Zmc2V0LAorICB1aW50MzJfdCBidWZmZXJfc2l6ZSwgaW50IHZhbHVlLCB1aW50OF90ICpvdmVyZmxvdykKK3sKKyAgaWYgKChidWZmX29mZnNldCArIDMpID49IGJ1ZmZlcl9zaXplKSB7CisgICAgKm92ZXJmbG93ID0gVFJVRTsKKyAgfQorCisgIGlmICghKCpvdmVyZmxvdykpIHsKKyAgICBidWZmX2FkZHJbYnVmZl9vZmZzZXRdID0gKHVpbnQ4X3QpKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKKyAgICBidWZmX2FkZHJbYnVmZl9vZmZzZXQrMV0gPSAodWludDhfdCkoKHZhbHVlID4+IDE2KSAmIDB4RkYpOworICAgIGJ1ZmZfYWRkcltidWZmX29mZnNldCsyXSA9ICh1aW50OF90KSgodmFsdWUgPj4gOCkgJiAweEZGKTsKKyAgICBidWZmX2FkZHJbYnVmZl9vZmZzZXQrM10gPSAodWludDhfdCkodmFsdWUgJiAweEZGKTsKKyAgfQorfQorCisvKiogbW1fanBlZ19tcG9fZ2V0X2FwcF9tYXJrZXIKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQGJ1ZmZlcl9hZGRyOiBKcGVnIGltYWdlIHN0YXJ0IGFkZHIKKyAqICAgIEBidWZmZXJfc2l6ZTogU2l6ZSBvZiB0aGUgQnVmZmVyCisgKiAgICBAYXBwX21hcmtlcjogYXBwX21hcmtlciB0byBmaW5kCisgKgorICogIFJldHVybjoKKyAqICAgICAgIFN0YXJ0IG9mZnNldCBvZiB0aGUgc3BlY2lmaWVkIGFwcCBtYXJrZXIKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBHZXRzIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGdpdmVuIGFwcCBtYXJrZXIKKyAqCisgKiovCit1aW50OF90ICptbV9qcGVnX21wb19nZXRfYXBwX21hcmtlcih1aW50OF90ICpidWZmZXJfYWRkciwgaW50IGJ1ZmZlcl9zaXplLAorICBpbnQgYXBwX21hcmtlcikKK3sKKyAgaW50MzJfdCBieXRlOworICB1aW50OF90ICpwX2N1cnJlbnRfYWRkciA9IE5VTEwsICpwX3N0YXJ0X29mZnNldCA9IE5VTEw7CisgIHVpbnQxNl90IGFwcF9tYXJrZXJfc2l6ZSA9IDA7CisKKyAgcF9jdXJyZW50X2FkZHIgPSBidWZmZXJfYWRkcjsKKyAgZG8geworICAgIGRvIHsKKyAgICAgIGJ5dGUgPSAqKHBfY3VycmVudF9hZGRyKTsKKyAgICAgIHBfY3VycmVudF9hZGRyKys7CisgICAgfQorICAgIHdoaWxlICgoYnl0ZSAhPSAweEZGKSAmJgorICAgICAgKHBfY3VycmVudF9hZGRyIDwgKGJ1ZmZlcl9hZGRyICsgKGJ1ZmZlcl9zaXplIC0gMSkpKSk7CisKKyAgICAvL0lmIDB4RkYgaXMgbm90IGZvdW5kIGF0IGFsbCwgYnJlYWsKKyAgICBpZiAoYnl0ZSAhPSAweEZGKSB7CisgICAgICBMT0dEKCIweEZGIG5vdCBmb3VuZCIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy9SZWFkIHRoZSBuZXh0IGJ5dGUgYWZ0ZXIgMHhGRgorICAgIGJ5dGUgPSAqKHBfY3VycmVudF9hZGRyKTsKKyAgICBMT0dEKCJCeXRlICV4IiwgYnl0ZSk7CisgICAgaWYgKGJ5dGUgPT0gYXBwX21hcmtlcikgeworICAgICAgTE9HRCgiQnl0ZSAleCIsIGJ5dGUpOworICAgICAgcF9zdGFydF9vZmZzZXQgPSArK3BfY3VycmVudF9hZGRyOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChieXRlICE9IE1fU09JKSB7CisgICAgICBhcHBfbWFya2VyX3NpemUgPSBSRUFEX1NIT1JUKHBfY3VycmVudF9hZGRyLCAxKTsKKyAgICAgIExPR0QoInNpemUgJWQiLCBhcHBfbWFya2VyX3NpemUpOworICAgICAgcF9jdXJyZW50X2FkZHIgKz0gYXBwX21hcmtlcl9zaXplOworICAgIH0KKyAgfQorICB3aGlsZSAoKGJ5dGUgIT0gTV9FT0kpICYmCisgICAgKHBfY3VycmVudF9hZGRyIDwgKGJ1ZmZlcl9hZGRyICsgKGJ1ZmZlcl9zaXplIC0gMSkpKSk7CisKKyAgcmV0dXJuIHBfc3RhcnRfb2Zmc2V0OworfQorCisvKiogbW1fanBlZ19tcG9fZ2V0X21wX2hlYWRlcgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAYXBwMl9tYXJrZXI6IGFwcDJfbWFya2VyIHN0YXJ0IG9mZnNldAorICoKKyAqICBSZXR1cm46CisgKiAgICAgICBTdGFydCBvZmZzZXQgb2YgdGhlIE1QIGhlYWRlcgorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIEdldCB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBNUCBoZWFkZXIgKGJlZm9yZSB0aGUgTVAKKyAqICAgICAgIEVuZGlhbiBmaWVsZCkuIEFsbCBvZmZzZXRzIGluIHRoZSBNUCBoZWFkZXIgbmVlZCB0byBiZQorICogICAgICAgc3BlY2lmaWVkIHdydCB0aGlzIHN0YXJ0IG9mZnNldC4KKyAqCisgKiovCit1aW50OF90ICptbV9qcGVnX21wb19nZXRfbXBfaGVhZGVyKHVpbnQ4X3QgKmFwcDJfc3RhcnRfb2Zmc2V0KQoreworICB1aW50OF90ICptcF9oZWFkcl9zdGFydF9vZmZzZXQgPSBOVUxMOworCisgIGlmIChhcHAyX3N0YXJ0X29mZnNldCAhPSBOVUxMKSB7CisgICAgbXBfaGVhZHJfc3RhcnRfb2Zmc2V0ID0gYXBwMl9zdGFydF9vZmZzZXQgKyBNUF9BUFAyX0ZJRUxEX0xFTkdUSF9CWVRFUyArCisgICAgICBNUF9GT1JNQVRfSURFTlRJRklFUl9CWVRFUzsKKyAgfQorCisgIHJldHVybiBtcF9oZWFkcl9zdGFydF9vZmZzZXQ7Cit9CisKKy8qKiBtbV9qcGVnX21wb191cGRhdGVfaGVhZGVyCisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBtcG9faW5mbzogTVBPIEluZm8KKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCAtIFN1Y2Nlc3MKKyAqICAgICAgIC0xIC0gb3RoZXJ3aXNlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICBVcGRhdGUgdGhlIE1QIEluZGV4IElGRCBvZiB0aGUgZmlyc3QgaW1hZ2Ugd2l0aCBpbmZvCisgKiAgICAgIGFib3V0IGFib3V0IGFsbCBvdGhlciBpbWFnZXMuCisgKgorICoqLworaW50IG1tX2pwZWdfbXBvX3VwZGF0ZV9oZWFkZXIobW1fanBlZ19tcG9faW5mb190ICptcG9faW5mbykKK3sKKyAgdWludDhfdCAqYXBwMl9zdGFydF9vZmZfYWRkciA9IE5VTEwsICptcF9oZWFkcl9zdGFydF9vZmZfYWRkciA9IE5VTEw7CisgIHVpbnQzMl90IG1wX2luZGV4X2lmZF9vZmZzZXQgPSAwLCBjdXJyZW50X29mZnNldCA9IDAsIG1wX2VudHJ5X3ZhbF9vZmZzZXQgPSAwOworICB1aW50OF90ICphdXhfc3RhcnRfYWRkciA9IE5VTEw7CisgIHVpbnQ4X3Qgb3ZlcmZsb3dfZmxhZyA9IDA7CisgIGludCBpID0gMCwgcmMgPSAtMTsKKyAgdWludDMyX3QgZW5kaWFuZXNzID0gTVBPX0xJVFRMRV9FTkRJQU4sIG9mZnNldF90b19ueHRfaWZkID0gODsKKyAgdWludDE2X3QgaWZkX3RhZ19jb3VudCA9IDA7CisKKyAgLy9HZXQgdGhlIGFkZHIgb2YgdGhlIEFwcCBNYXJrZXIKKyAgYXBwMl9zdGFydF9vZmZfYWRkciA9IG1tX2pwZWdfbXBvX2dldF9hcHBfbWFya2VyKAorICAgIG1wb19pbmZvLT5vdXRwdXRfYnVmZi5idWZfdmFkZHIsIG1wb19pbmZvLT5wcmltYXJ5X2ltYWdlLmJ1Zl9maWxsZWRfbGVuLCBNX0FQUDIpOworICBpZiAoIWFwcDJfc3RhcnRfb2ZmX2FkZHIpIHsKKyAgICBMT0dFKCJDYW5ub3QgZmluZCBBcHAyIG1hcmtlci4gTVBPIGNvbXBvc2l0aW9uIGZhaWxlZCIgKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKyAgTE9HRCgiYXBwMl9zdGFydF9vZmZfYWRkciAlcCA9ICV4IiwKKyAgICBhcHAyX3N0YXJ0X29mZl9hZGRyLCAqYXBwMl9zdGFydF9vZmZfYWRkcik7CisKKyAgLy9HZXQgdGhlIGFkZHIgb2YgdGhlIE1QIEhlYWRyIHN0YXJ0IG9mZnNldC4KKyAgLy9BbGwgb2Zmc2V0cyBpbiB0aGUgTVAgaGVhZGVyIGFyZSB3cnQgdG8gdGhpcyBhZGRyCisgIG1wX2hlYWRyX3N0YXJ0X29mZl9hZGRyID0gbW1fanBlZ19tcG9fZ2V0X21wX2hlYWRlcihhcHAyX3N0YXJ0X29mZl9hZGRyKTsKKyAgaWYgKCFtcF9oZWFkcl9zdGFydF9vZmZfYWRkcikgeworICAgIExPR0UoIm1wIGhlYWRyIHN0YXJ0IG9mZnNldCBpcyBOVUxMLiBNUE8gY29tcG9zaXRpb24gZmFpbGVkIiApOworICAgIHJldHVybiByYzsKKyAgfQorICBMT0dEKCJtcF9oZWFkcl9zdGFydF9vZmZfYWRkciAleCIsCisgICAgKm1wX2hlYWRyX3N0YXJ0X29mZl9hZGRyKTsKKworICBjdXJyZW50X29mZnNldCA9IG1wX2hlYWRyX3N0YXJ0X29mZl9hZGRyIC0gbXBvX2luZm8tPm91dHB1dF9idWZmLmJ1Zl92YWRkcjsKKworICBlbmRpYW5lc3MgPSBSRUFEX0xPTkcobXBvX2luZm8tPm91dHB1dF9idWZmLmJ1Zl92YWRkciwgY3VycmVudF9vZmZzZXQpOworICBMT0dEKCJFbmRpYW5lc3MgJWQiLCBlbmRpYW5lc3MpOworCisgIC8vQWRkIG9mZnNldCB0byBmaXJzdCBpZmQKKyAgY3VycmVudF9vZmZzZXQgKz0gTVBfRU5ESUFOX0JZVEVTOworCisgIC8vUmVhZCB0aGUgdmFsdWUgdG8gZ2V0IE1QIEluZGV4IElGRC4KKyAgaWYgKGVuZGlhbmVzcyA9PSBNUE9fTElUVExFX0VORElBTikgeworICAgIG9mZnNldF90b19ueHRfaWZkID0gUkVBRF9MT05HX0xJVFRMRShtcG9faW5mby0+b3V0cHV0X2J1ZmYuYnVmX3ZhZGRyLAorICAgICAgY3VycmVudF9vZmZzZXQpOworICB9IGVsc2UgeworICAgIG9mZnNldF90b19ueHRfaWZkID0gUkVBRF9MT05HKG1wb19pbmZvLT5vdXRwdXRfYnVmZi5idWZfdmFkZHIsCisgICAgICBjdXJyZW50X29mZnNldCk7CisgIH0KKyAgTE9HRCgib2Zmc2V0X3RvX254dF9pZmQgJWQiLCBvZmZzZXRfdG9fbnh0X2lmZCk7CisKKyAgY3VycmVudF9vZmZzZXQgPSAoKG1wX2hlYWRyX3N0YXJ0X29mZl9hZGRyICsgb2Zmc2V0X3RvX254dF9pZmQpIC0KKyAgICBtcG9faW5mby0+b3V0cHV0X2J1ZmYuYnVmX3ZhZGRyKTsKKyAgbXBfaW5kZXhfaWZkX29mZnNldCA9IGN1cnJlbnRfb2Zmc2V0OworICBMT0dEKCJtcF9pbmRleF9pZmRfb2Zmc2V0ICVkIiwKKyAgICBtcF9pbmRleF9pZmRfb2Zmc2V0KTsKKworICAvL1RyYXZlcnNlIHRvIE1QIEVudHJ5IHZhbHVlCisgIGlmZF90YWdfY291bnQgPSBSRUFEX1NIT1JUKG1wb19pbmZvLT5vdXRwdXRfYnVmZi5idWZfdmFkZHIsIGN1cnJlbnRfb2Zmc2V0KTsKKyAgTE9HRCgiVGFnIGNvdW50IGluIE1QIGVudHJ5ICVkIiwgaWZkX3RhZ19jb3VudCk7CisgIGN1cnJlbnRfb2Zmc2V0ICs9IE1QX0lOREVYX0NPVU5UX0JZVEVTOworCisgIC8qIEdldCBNUCBFbnRyeSBWYWx1ZSBvZmZzZXQgLSBDb3VudCAqIDEyIChFYWNoIHRhZyBpcyAxMiBieXRlcykqLworICBjdXJyZW50X29mZnNldCArPSAoaWZkX3RhZ19jb3VudCAqIDEyKTsKKyAgLypBZGQgT2Zmc2V0IHRvIG5leHQgSUZEKi8KKyAgY3VycmVudF9vZmZzZXQgKz0gTVBfSU5ERVhfT0ZGU0VUX09GX05FWFRfSUZEX0JZVEVTOworCisgIG1wX2VudHJ5X3ZhbF9vZmZzZXQgPSBjdXJyZW50X29mZnNldDsKKyAgTE9HRCgiTVAgRW50cnkgdmFsdWUgb2Zmc2V0ICVkIiwKKyAgICBtcF9lbnRyeV92YWxfb2Zmc2V0KTsKKworICAvL1VwZGF0ZSBpbWFnZSBzaXplIGZvciBwcmltYXJ5IGltYWdlCisgIGN1cnJlbnRfb2Zmc2V0ICs9IE1QX0lOREVYX0VOVFJZX0lORElWSURVQUxfSU1BR0VfQVRUUklCVVRFX0JZVEVTOworICBpZiAoZW5kaWFuZXNzID09IE1QT19MSVRUTEVfRU5ESUFOKSB7CisgICAgbW1fanBlZ19tcG9fd3JpdGVfbG9uZ19saXR0bGVfZW5kaWFuKG1wb19pbmZvLT5vdXRwdXRfYnVmZi5idWZfdmFkZHIsCisgICAgICBjdXJyZW50X29mZnNldCwgbXBvX2luZm8tPm91dHB1dF9idWZmX3NpemUsCisgICAgICBtcG9faW5mby0+cHJpbWFyeV9pbWFnZS5idWZfZmlsbGVkX2xlbiwgJm92ZXJmbG93X2ZsYWcpOworICB9IGVsc2UgeworICAgIG1tX2pwZWdfbXBvX3dyaXRlX2xvbmcobXBvX2luZm8tPm91dHB1dF9idWZmLmJ1Zl92YWRkciwKKyAgICAgIGN1cnJlbnRfb2Zmc2V0LCBtcG9faW5mby0+b3V0cHV0X2J1ZmZfc2l6ZSwKKyAgICAgIG1wb19pbmZvLT5wcmltYXJ5X2ltYWdlLmJ1Zl9maWxsZWRfbGVuLCAmb3ZlcmZsb3dfZmxhZyk7CisgIH0KKworICBhdXhfc3RhcnRfYWRkciA9IG1wb19pbmZvLT5vdXRwdXRfYnVmZi5idWZfdmFkZHIgKworICAgIG1wb19pbmZvLT5wcmltYXJ5X2ltYWdlLmJ1Zl9maWxsZWRfbGVuOworCisgIGZvciAoaSA9IDA7IGkgPCBtcG9faW5mby0+bnVtX29mX2ltYWdlcyAtIDE7IGkrKykgeworICAgIC8vR28gdG8gTVAgRW50cnkgdmFsIGZvciBlYWNoIGltYWdlCisgICAgbXBfZW50cnlfdmFsX29mZnNldCArPSBNUF9JTkRFWF9FTlRSWV9WQUxVRV9CWVRFUzsKKyAgICBjdXJyZW50X29mZnNldCA9IG1wX2VudHJ5X3ZhbF9vZmZzZXQ7CisKKyAgICAvL1VwZGF0ZSBpbWFnZSBzaXplCisgICAgY3VycmVudF9vZmZzZXQgKz0gTVBfSU5ERVhfRU5UUllfSU5ESVZJRFVBTF9JTUFHRV9BVFRSSUJVVEVfQllURVM7CisgICAgaWYgKGVuZGlhbmVzcyA9PSBNUE9fTElUVExFX0VORElBTikgeworICAgICAgbW1fanBlZ19tcG9fd3JpdGVfbG9uZ19saXR0bGVfZW5kaWFuKG1wb19pbmZvLT5vdXRwdXRfYnVmZi5idWZfdmFkZHIsCisgICAgICAgIGN1cnJlbnRfb2Zmc2V0LCBtcG9faW5mby0+b3V0cHV0X2J1ZmZfc2l6ZSwKKyAgICAgICAgbXBvX2luZm8tPmF1eF9pbWFnZXNbaV0uYnVmX2ZpbGxlZF9sZW4sICZvdmVyZmxvd19mbGFnKTsKKyAgICB9IGVsc2UgeworICAgICAgbW1fanBlZ19tcG9fd3JpdGVfbG9uZyhtcG9faW5mby0+b3V0cHV0X2J1ZmYuYnVmX3ZhZGRyLAorICAgICAgICBjdXJyZW50X29mZnNldCwgbXBvX2luZm8tPm91dHB1dF9idWZmX3NpemUsCisgICAgICAgIG1wb19pbmZvLT5hdXhfaW1hZ2VzW2ldLmJ1Zl9maWxsZWRfbGVuLCAmb3ZlcmZsb3dfZmxhZyk7CisgICAgfQorICAgIExPR0QoImF1eFtzdGFydF9hZGRyICV4IiwgKmF1eF9zdGFydF9hZGRyKTsKKyAgICAvL1VwZGF0ZSB0aGUgb2Zmc2V0CisgICAgY3VycmVudF9vZmZzZXQgKz0gTVBfSU5ERVhfRU5UUllfSU5ESVZJRFVBTF9JTUFHRV9TSVpFX0JZVEVTOworICAgIGlmIChlbmRpYW5lc3MgPT0gTVBPX0xJVFRMRV9FTkRJQU4pIHsKKyAgICAgIG1tX2pwZWdfbXBvX3dyaXRlX2xvbmdfbGl0dGxlX2VuZGlhbihtcG9faW5mby0+b3V0cHV0X2J1ZmYuYnVmX3ZhZGRyLAorICAgICAgICBjdXJyZW50X29mZnNldCwgbXBvX2luZm8tPm91dHB1dF9idWZmX3NpemUsCisgICAgICAgIGF1eF9zdGFydF9hZGRyIC0gbXBfaGVhZHJfc3RhcnRfb2ZmX2FkZHIsICZvdmVyZmxvd19mbGFnKTsKKyAgICB9IGVsc2UgeworICAgICAgbW1fanBlZ19tcG9fd3JpdGVfbG9uZyhtcG9faW5mby0+b3V0cHV0X2J1ZmYuYnVmX3ZhZGRyLAorICAgICAgICBjdXJyZW50X29mZnNldCwgbXBvX2luZm8tPm91dHB1dF9idWZmX3NpemUsCisgICAgICAgIGF1eF9zdGFydF9hZGRyIC0gbXBfaGVhZHJfc3RhcnRfb2ZmX2FkZHIsICZvdmVyZmxvd19mbGFnKTsKKyAgICB9CisgICAgYXV4X3N0YXJ0X2FkZHIgKz0gbXBvX2luZm8tPmF1eF9pbWFnZXNbaV0uYnVmX2ZpbGxlZF9sZW47CisgIH0KKyAgaWYgKCFvdmVyZmxvd19mbGFnKSB7CisgICAgcmMgPSAwOworICB9CisgIHJldHVybiByYzsKK30KKworLyoqIG1tX2pwZWdfbXBvX2NvbXBvc2UKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQG1wb19pbmZvOiBNUE8gSW5mbworICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIC0gU3VjY2VzcworICogICAgICAtMSAtIG90aGVyd2lzZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgQ29tcG9zZSBNUE8gaW1hZ2UgZnJvbSBtdWx0aXBsZSBKUEVHIGltYWdlcworICoKKyAqKi8KK2ludCBtbV9qcGVnX21wb19jb21wb3NlKG1tX2pwZWdfbXBvX2luZm9fdCAqbXBvX2luZm8pCit7CisgIHVpbnQ4X3QgKmF1eF93cml0ZV9vZmZzZXQgPSBOVUxMOworICBpbnQgaSA9IDAsIHJjID0gLTE7CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZnX21wb19sb2NrKTsKKworICAvL1ByaW1hcnkgaW1hZ2UgbmVlZHMgdG8gYmUgY29waWVkIHRvIHRoZSBvL3AgYnVmZmVyIGlmIGl0cyBub3QgYWxyZWFkeQorICBpZiAobXBvX2luZm8tPm91dHB1dF9idWZmLmJ1Zl9maWxsZWRfbGVuID09IDApIHsKKyAgICBpZiAobXBvX2luZm8tPnByaW1hcnlfaW1hZ2UuYnVmX2ZpbGxlZF9sZW4gPCBtcG9faW5mby0+b3V0cHV0X2J1ZmZfc2l6ZSkgeworICAgICAgbWVtY3B5KG1wb19pbmZvLT5vdXRwdXRfYnVmZi5idWZfdmFkZHIsIG1wb19pbmZvLT5wcmltYXJ5X2ltYWdlLmJ1Zl92YWRkciwKKyAgICAgICAgbXBvX2luZm8tPnByaW1hcnlfaW1hZ2UuYnVmX2ZpbGxlZF9sZW4pOworICAgICAgbXBvX2luZm8tPm91dHB1dF9idWZmLmJ1Zl9maWxsZWRfbGVuICs9CisgICAgICAgIG1wb19pbmZvLT5wcmltYXJ5X2ltYWdlLmJ1Zl9maWxsZWRfbGVuOworICAgIH0gZWxzZSB7CisgICAgICBMT0dFKCJPL1AgYnVmZmVyIG5vdCBsYXJnZSBlbm91Z2guIE1QTyBjb21wb3NpdGlvbiBmYWlsZWQiKTsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX21wb19sb2NrKTsKKyAgICAgIHJldHVybiByYzsKKyAgICB9CisgIH0KKyAgLy9BcHBlbmQgZWFjaCBBdXggaW1hZ2UgdG8gdGhlIGJ1ZmZlcgorICBmb3IgKGkgPSAwOyBpIDwgbXBvX2luZm8tPm51bV9vZl9pbWFnZXMgLSAxOyBpKyspIHsKKyAgICBpZiAoKG1wb19pbmZvLT5vdXRwdXRfYnVmZi5idWZfZmlsbGVkX2xlbiArCisgICAgICBtcG9faW5mby0+YXV4X2ltYWdlc1tpXS5idWZfZmlsbGVkX2xlbikgPD0gbXBvX2luZm8tPm91dHB1dF9idWZmX3NpemUpIHsKKyAgICAgIGF1eF93cml0ZV9vZmZzZXQgPSBtcG9faW5mby0+b3V0cHV0X2J1ZmYuYnVmX3ZhZGRyICsKKyAgICAgICAgbXBvX2luZm8tPm91dHB1dF9idWZmLmJ1Zl9maWxsZWRfbGVuOworICAgICAgbWVtY3B5KGF1eF93cml0ZV9vZmZzZXQsIG1wb19pbmZvLT5hdXhfaW1hZ2VzW2ldLmJ1Zl92YWRkciwKKyAgICAgICAgbXBvX2luZm8tPmF1eF9pbWFnZXNbaV0uYnVmX2ZpbGxlZF9sZW4pOworICAgICAgbXBvX2luZm8tPm91dHB1dF9idWZmLmJ1Zl9maWxsZWRfbGVuICs9CisgICAgICAgIG1wb19pbmZvLT5hdXhfaW1hZ2VzW2ldLmJ1Zl9maWxsZWRfbGVuOworICAgIH0gZWxzZSB7CisgICAgICBMT0dFKCJPL1AgYnVmZmVyIG5vdCBsYXJnZSBlbm91Z2guIE1QTyBjb21wb3NpdGlvbiBmYWlsZWQiKTsKKyAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX21wb19sb2NrKTsKKyAgICAgIHJldHVybiByYzsKKyAgICB9CisgIH0KKworICByYyA9IG1tX2pwZWdfbXBvX3VwZGF0ZV9oZWFkZXIobXBvX2luZm8pOworICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19tcG9fbG9jayk7CisKKyAgcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3NyYy9tbV9qcGVnX3F1ZXVlLmMgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2Uvc3JjL21tX2pwZWdfcXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWViNzhmCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3NyYy9tbV9qcGVnX3F1ZXVlLmMKQEAgLTAsMCArMSwxODYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE0LCAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworLy8gSlBFRyBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJtbV9qcGVnX2RiZy5oIgorI2luY2x1ZGUgIm1tX2pwZWcuaCIKKworaW50MzJfdCBtbV9qcGVnX3F1ZXVlX2luaXQobW1fanBlZ19xdWV1ZV90KiBxdWV1ZSkKK3sKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJnF1ZXVlLT5sb2NrLCBOVUxMKTsKKyAgICBjYW1fbGlzdF9pbml0KCZxdWV1ZS0+aGVhZC5saXN0KTsKKyAgICBxdWV1ZS0+c2l6ZSA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgbW1fanBlZ19xdWV1ZV9lbnEobW1fanBlZ19xdWV1ZV90KiBxdWV1ZSwgbW1fanBlZ19xX2RhdGFfdCBkYXRhKQoreworICAgIG1tX2pwZWdfcV9ub2RlX3QqIG5vZGUgPQorICAgICAgICAobW1fanBlZ19xX25vZGVfdCAqKW1hbGxvYyhzaXplb2YobW1fanBlZ19xX25vZGVfdCkpOworICAgIGlmIChOVUxMID09IG5vZGUpIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBtbV9qcGVnX3Ffbm9kZV90Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZW1zZXQobm9kZSwgMCwgc2l6ZW9mKG1tX2pwZWdfcV9ub2RlX3QpKTsKKyAgICBub2RlLT5kYXRhID0gZGF0YTsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcXVldWUtPmxvY2spOworICAgIGNhbV9saXN0X2FkZF90YWlsX25vZGUoJm5vZGUtPmxpc3QsICZxdWV1ZS0+aGVhZC5saXN0KTsKKyAgICBxdWV1ZS0+c2l6ZSsrOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+bG9jayk7CisKKyAgICByZXR1cm4gMDsKKworfQorCitpbnQzMl90IG1tX2pwZWdfcXVldWVfZW5xX2hlYWQobW1fanBlZ19xdWV1ZV90KiBxdWV1ZSwgbW1fanBlZ19xX2RhdGFfdCBkYXRhKQoreworICBzdHJ1Y3QgY2FtX2xpc3QgKmhlYWQgPSBOVUxMOworICBzdHJ1Y3QgY2FtX2xpc3QgKnBvcyA9IE5VTEw7CisgIG1tX2pwZWdfcV9ub2RlX3QqIG5vZGUgPQorICAgICAgICAobW1fanBlZ19xX25vZGVfdCAqKW1hbGxvYyhzaXplb2YobW1fanBlZ19xX25vZGVfdCkpOworICAgIGlmIChOVUxMID09IG5vZGUpIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBtbV9qcGVnX3Ffbm9kZV90Iik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZW1zZXQobm9kZSwgMCwgc2l6ZW9mKG1tX2pwZWdfcV9ub2RlX3QpKTsKKyAgICBub2RlLT5kYXRhID0gZGF0YTsKKworICAgIGhlYWQgPSAmcXVldWUtPmhlYWQubGlzdDsKKyAgICBwb3MgPSBoZWFkLT5uZXh0OworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZxdWV1ZS0+bG9jayk7CisgICAgY2FtX2xpc3RfaW5zZXJ0X2JlZm9yZV9ub2RlKCZub2RlLT5saXN0LCBwb3MpOworICAgIHF1ZXVlLT5zaXplKys7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKworICAgIHJldHVybiAwOworfQorCittbV9qcGVnX3FfZGF0YV90IG1tX2pwZWdfcXVldWVfZGVxKG1tX2pwZWdfcXVldWVfdCogcXVldWUpCit7CisgICAgbW1fanBlZ19xX2RhdGFfdCBkYXRhOworICAgIG1tX2pwZWdfcV9ub2RlX3QqIG5vZGUgPSBOVUxMOworICAgIHN0cnVjdCBjYW1fbGlzdCAqaGVhZCA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpwb3MgPSBOVUxMOworCisgICAgbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZxdWV1ZS0+bG9jayk7CisgICAgaGVhZCA9ICZxdWV1ZS0+aGVhZC5saXN0OworICAgIHBvcyA9IGhlYWQtPm5leHQ7CisgICAgaWYgKHBvcyAhPSBoZWFkKSB7CisgICAgICAgIG5vZGUgPSBtZW1iZXJfb2YocG9zLCBtbV9qcGVnX3Ffbm9kZV90LCBsaXN0KTsKKyAgICAgICAgY2FtX2xpc3RfZGVsX25vZGUoJm5vZGUtPmxpc3QpOworICAgICAgICBxdWV1ZS0+c2l6ZS0tOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcXVldWUtPmxvY2spOworCisgICAgaWYgKE5VTEwgIT0gbm9kZSkgeworICAgICAgICBkYXRhID0gbm9kZS0+ZGF0YTsKKyAgICAgICAgZnJlZShub2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gZGF0YTsKK30KKwordWludDMyX3QgbW1fanBlZ19xdWV1ZV9nZXRfc2l6ZShtbV9qcGVnX3F1ZXVlX3QqIHF1ZXVlKQoreworICAgIHVpbnQzMl90IHNpemUgPSAwOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZxdWV1ZS0+bG9jayk7CisgICAgc2l6ZSA9IHF1ZXVlLT5zaXplOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZxdWV1ZS0+bG9jayk7CisKKyAgICByZXR1cm4gc2l6ZTsKKworfQorCitpbnQzMl90IG1tX2pwZWdfcXVldWVfZGVpbml0KG1tX2pwZWdfcXVldWVfdCogcXVldWUpCit7CisgICAgbW1fanBlZ19xdWV1ZV9mbHVzaChxdWV1ZSk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZxdWV1ZS0+bG9jayk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgbW1fanBlZ19xdWV1ZV9mbHVzaChtbV9qcGVnX3F1ZXVlX3QqIHF1ZXVlKQoreworICAgIG1tX2pwZWdfcV9ub2RlX3QqIG5vZGUgPSBOVUxMOworICAgIHN0cnVjdCBjYW1fbGlzdCAqaGVhZCA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpwb3MgPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZxdWV1ZS0+bG9jayk7CisgICAgaGVhZCA9ICZxdWV1ZS0+aGVhZC5saXN0OworICAgIHBvcyA9IGhlYWQtPm5leHQ7CisKKyAgICB3aGlsZShwb3MgIT0gaGVhZCkgeworICAgICAgICBub2RlID0gbWVtYmVyX29mKHBvcywgbW1fanBlZ19xX25vZGVfdCwgbGlzdCk7CisgICAgICAgIGNhbV9saXN0X2RlbF9ub2RlKCZub2RlLT5saXN0KTsKKyAgICAgICAgcXVldWUtPnNpemUtLTsKKworICAgICAgICAvKiBmb3Igbm93IHdlIG9ubHkgYXNzdW1lIHRoZXJlIGlzIG5vIHB0ciBpbnNpZGUgZGF0YQorICAgICAgICAgKiBzbyB3ZSBmcmVlIGRhdGEgZGlyZWN0bHkgKi8KKyAgICAgICAgaWYgKE5VTEwgIT0gbm9kZS0+ZGF0YS5wKSB7CisgICAgICAgICAgICBmcmVlKG5vZGUtPmRhdGEucCk7CisgICAgICAgIH0KKyAgICAgICAgZnJlZShub2RlKTsKKyAgICAgICAgcG9zID0gcG9zLT5uZXh0OworICAgIH0KKyAgICBxdWV1ZS0+c2l6ZSA9IDA7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnF1ZXVlLT5sb2NrKTsKKyAgICByZXR1cm4gMDsKK30KKworbW1fanBlZ19xX2RhdGFfdCBtbV9qcGVnX3F1ZXVlX3BlZWsobW1fanBlZ19xdWV1ZV90KiBxdWV1ZSkKK3sKKyAgICBtbV9qcGVnX3FfZGF0YV90IGRhdGE7CisgICAgbW1fanBlZ19xX25vZGVfdCogbm9kZSA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpoZWFkID0gTlVMTDsKKyAgICBzdHJ1Y3QgY2FtX2xpc3QgKnBvcyA9IE5VTEw7CisKKyAgICBtZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnF1ZXVlLT5sb2NrKTsKKyAgICBoZWFkID0gJnF1ZXVlLT5oZWFkLmxpc3Q7CisgICAgcG9zID0gaGVhZC0+bmV4dDsKKyAgICBpZiAocG9zICE9IGhlYWQpIHsKKyAgICAgICAgbm9kZSA9IG1lbWJlcl9vZihwb3MsIG1tX2pwZWdfcV9ub2RlX3QsIGxpc3QpOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcXVldWUtPmxvY2spOworCisgICAgaWYgKE5VTEwgIT0gbm9kZSkgeworICAgICAgICBkYXRhID0gbm9kZS0+ZGF0YTsKKyAgICB9CisgICAgcmV0dXJuIGRhdGE7Cit9CmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2Uvc3JjL21tX2pwZWdkZWMuYyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS9zcmMvbW1fanBlZ2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZWUxZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2Uvc3JjL21tX2pwZWdkZWMuYwpAQCAtMCwwICsxLDExODUgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworLy8gSlBFRyBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJtbV9qcGVnX2RiZy5oIgorI2luY2x1ZGUgIm1tX2pwZWdfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibW1fanBlZy5oIgorI2luY2x1ZGUgIm1tX2pwZWdfaW5saW5lcy5oIgorCitPTVhfRVJST1JUWVBFIG1tX2pwZWdkZWNfZWJkKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgIE9NWF9QVFIgcEFwcERhdGEsCisgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKK09NWF9FUlJPUlRZUEUgbW1fanBlZ2RlY19mYmQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfUFRSIHBBcHBEYXRhLAorICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKK09NWF9FUlJPUlRZUEUgbW1fanBlZ2RlY19ldmVudF9oYW5kbGVyKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX1BUUiBwQXBwRGF0YSwKKyAgICBPTVhfRVZFTlRUWVBFIGVFdmVudCwKKyAgICBPTVhfVTMyIG5EYXRhMSwKKyAgICBPTVhfVTMyIG5EYXRhMiwKKyAgICBPTVhfUFRSIHBFdmVudERhdGEpOworCisKKy8qKiBtbV9qcGVnZGVjX2Rlc3Ryb3lfam9iCisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBwX3Nlc3Npb246IFNlc3Npb24gb2JqCisgKgorICogIFJldHVybjoKKyAqICAgICAgIDAgZm9yIHN1Y2Nlc3MgZWxzZSBmYWlsdXJlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgRGVzdHJveSB0aGUgam9iIGJhc2VkIHBhcmFtZW50ZXJzCisgKgorICoqLworc3RhdGljIGludDMyX3QgbW1fanBlZ2RlY19kZXN0cm95X2pvYihtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKnBfc2Vzc2lvbikKK3sKKyAgaW50MzJfdCByYyA9IDA7CisKKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ19qb2JfZG9uZToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHBfc2Vzc2lvbjogZGVjb2RlIHNlc3Npb24KKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgT01YX0VSUk9SVFlQRQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIEZpbmFsaXplIHRoZSBqb2IKKyAqCisgKiovCitzdGF0aWMgdm9pZCBtbV9qcGVnZGVjX2pvYl9kb25lKG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uKQoreworICBtbV9qcGVnX29iaiAqbXlfb2JqID0gKG1tX2pwZWdfb2JqICopcF9zZXNzaW9uLT5qcGVnX29iajsKKyAgbW1fanBlZ19qb2JfcV9ub2RlX3QgKm5vZGUgPSBOVUxMOworCisgIC8qRGVzdHJveSBqb2IgcmVsYXRlZCBwYXJhbXMqLworICBtbV9qcGVnZGVjX2Rlc3Ryb3lfam9iKHBfc2Vzc2lvbik7CisKKyAgLypyZW1vdmUgdGhlIGpvYiovCisgIG5vZGUgPSBtbV9qcGVnX3F1ZXVlX3JlbW92ZV9qb2JfYnlfam9iX2lkKCZteV9vYmotPm9uZ29pbmdfam9iX3EsCisgICAgcF9zZXNzaW9uLT5qb2JJZCk7CisgIGlmIChub2RlKSB7CisgICAgZnJlZShub2RlKTsKKyAgfQorICBwX3Nlc3Npb24tPmVuY29kaW5nID0gT01YX0ZBTFNFOworCisgIC8qIHdha2UgdXAgam9iTWdyIHRocmVhZCB0byB3b3JrIG9uIG5ldyBqb2IgaWYgdGhlcmUgaXMgYW55ICovCisgIGNhbV9zZW1fcG9zdCgmbXlfb2JqLT5qb2JfbWdyLmpvYl9zZW0pOworfQorCisKKy8qKiBtbV9qcGVnZGVjX3Nlc3Npb25fc2VuZF9idWZmZXJzOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAZGF0YTogam9iIHNlc3Npb24KKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgT01YIGVycm9yIHZhbHVlcworICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIFNlbmQgdGhlIGJ1ZmZlcnMgdG8gT01YIGxheWVyCisgKgorICoqLworT01YX0VSUk9SVFlQRSBtbV9qcGVnZGVjX3Nlc3Npb25fc2VuZF9idWZmZXJzKHZvaWQgKmRhdGEpCit7CisgIHVpbnQzMl90IGkgPSAwOworICBtbV9qcGVnX2pvYl9zZXNzaW9uX3QqIHBfc2Vzc2lvbiA9IChtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKilkYXRhOworICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgIFFPTVhfQlVGRkVSX0lORk8gbGJ1ZmZlcl9pbmZvOworICBtbV9qcGVnX2RlY29kZV9wYXJhbXNfdCAqcF9wYXJhbXMgPSAmcF9zZXNzaW9uLT5kZWNfcGFyYW1zOworCisgIG1lbXNldCgmbGJ1ZmZlcl9pbmZvLCAweDAsIHNpemVvZihRT01YX0JVRkZFUl9JTkZPKSk7CisgIGZvciAoaSA9IDA7IGkgPCBwX3BhcmFtcy0+bnVtX3NyY19idWZzOyBpKyspIHsKKyAgICBMT0dEKCJTb3VyY2UgYnVmZmVyICVkIiwgaSk7CisgICAgbGJ1ZmZlcl9pbmZvLmZkID0gKE9NWF9VMzIpcF9wYXJhbXMtPnNyY19tYWluX2J1ZltpXS5mZDsKKyAgICByZXQgPSBPTVhfVXNlQnVmZmVyKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgJihwX3Nlc3Npb24tPnBfaW5fb214X2J1ZltpXSksIDAsCisgICAgICAmbGJ1ZmZlcl9pbmZvLCBwX3BhcmFtcy0+c3JjX21haW5fYnVmW2ldLmJ1Zl9zaXplLAorICAgICAgcF9wYXJhbXMtPnNyY19tYWluX2J1ZltpXS5idWZfdmFkZHIpOworICAgIGlmIChyZXQpIHsKKyAgICAgIExPR0UoIkVycm9yICVkIiwgcmV0KTsKKyAgICAgIHJldHVybiByZXQ7CisgICAgfQorICB9CisKKyAgTE9HRCgiRXhpdCIpOworICByZXR1cm4gcmV0OworfQorCisvKiogbW1fanBlZ19zZXNzaW9uX2ZyZWVfYnVmZmVyczoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQGRhdGE6IGpvYiBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIE9NWCBlcnJvciB2YWx1ZXMKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBGcmVlIHRoZSBidWZmZXJzIGZyb20gT01YIGxheWVyCisgKgorICoqLworT01YX0VSUk9SVFlQRSBtbV9qcGVnZGVjX3Nlc3Npb25fZnJlZV9idWZmZXJzKHZvaWQgKmRhdGEpCit7CisgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgdWludDMyX3QgaSA9IDA7CisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCogcF9zZXNzaW9uID0gKG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqKWRhdGE7CisgIG1tX2pwZWdfZGVjb2RlX3BhcmFtc190ICpwX3BhcmFtcyA9ICZwX3Nlc3Npb24tPmRlY19wYXJhbXM7CisKKyAgZm9yIChpID0gMDsgaSA8IHBfcGFyYW1zLT5udW1fc3JjX2J1ZnM7IGkrKykgeworICAgIExPR0QoIlNvdXJjZSBidWZmZXIgJWQiLCBpKTsKKyAgICByZXQgPSBPTVhfRnJlZUJ1ZmZlcihwX3Nlc3Npb24tPm9teF9oYW5kbGUsIDAsIHBfc2Vzc2lvbi0+cF9pbl9vbXhfYnVmW2ldKTsKKyAgICBpZiAocmV0KSB7CisgICAgICBMT0dFKCJFcnJvciAlZCIsIHJldCk7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBwX3BhcmFtcy0+bnVtX2RzdF9idWZzOyBpKyspIHsKKyAgICBMT0dEKCJEZXN0IGJ1ZmZlciAlZCIsIGkpOworICAgIHJldCA9IE9NWF9GcmVlQnVmZmVyKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgMSwgcF9zZXNzaW9uLT5wX291dF9vbXhfYnVmW2ldKTsKKyAgICBpZiAocmV0KSB7CisgICAgICBMT0dFKCJFcnJvciIpOworICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgIH0KKyAgTE9HRCgiRXhpdCIpOworICByZXR1cm4gcmV0OworfQorCisvKiogbW1fanBlZ2RlY19zZXNzaW9uX2NyZWF0ZToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQHBfc2Vzc2lvbjogam9iIHNlc3Npb24KKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgT01YIGVycm9yIHR5cGVzCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgQ3JlYXRlIGEganBlZyBlbmNvZGUgc2Vzc2lvbgorICoKKyAqKi8KK09NWF9FUlJPUlRZUEUgbW1fanBlZ2RlY19zZXNzaW9uX2NyZWF0ZShtbV9qcGVnX2pvYl9zZXNzaW9uX3QqIHBfc2Vzc2lvbikKK3sKKyAgT01YX0VSUk9SVFlQRSByYyA9IE9NWF9FcnJvck5vbmU7CisKKyAgcHRocmVhZF9tdXRleF9pbml0KCZwX3Nlc3Npb24tPmxvY2ssIE5VTEwpOworICBwdGhyZWFkX2NvbmRfaW5pdCgmcF9zZXNzaW9uLT5jb25kLCBOVUxMKTsKKyAgY2lycV9yZXNldCgmcF9zZXNzaW9uLT5jYl9xKTsKKyAgcF9zZXNzaW9uLT5zdGF0ZV9jaGFuZ2VfcGVuZGluZyA9IE9NWF9GQUxTRTsKKyAgcF9zZXNzaW9uLT5hYm9ydF9zdGF0ZSA9IE1NX0pQRUdfQUJPUlRfTk9ORTsKKyAgcF9zZXNzaW9uLT5lcnJvcl9mbGFnID0gT01YX0Vycm9yTm9uZTsKKyAgcF9zZXNzaW9uLT5lYmRfY291bnQgPSAwOworICBwX3Nlc3Npb24tPmZiZF9jb3VudCA9IDA7CisgIHBfc2Vzc2lvbi0+ZW5jb2RlX3BpZCA9IC0xOworICBwX3Nlc3Npb24tPmNvbmZpZyA9IE9NWF9GQUxTRTsKKworICBwX3Nlc3Npb24tPm9teF9jYWxsYmFja3MuRW1wdHlCdWZmZXJEb25lID0gbW1fanBlZ2RlY19lYmQ7CisgIHBfc2Vzc2lvbi0+b214X2NhbGxiYWNrcy5GaWxsQnVmZmVyRG9uZSA9IG1tX2pwZWdkZWNfZmJkOworICBwX3Nlc3Npb24tPm9teF9jYWxsYmFja3MuRXZlbnRIYW5kbGVyID0gbW1fanBlZ2RlY19ldmVudF9oYW5kbGVyOworICBwX3Nlc3Npb24tPmV4aWZfY291bnRfbG9jYWwgPSAwOworCisgIHJjID0gT01YX0dldEhhbmRsZSgmcF9zZXNzaW9uLT5vbXhfaGFuZGxlLAorICAgICJPTVgucWNvbS5pbWFnZS5qcGVnLmRlY29kZXIiLAorICAgICh2b2lkICopcF9zZXNzaW9uLAorICAgICZwX3Nlc3Npb24tPm9teF9jYWxsYmFja3MpOworCisgIGlmIChPTVhfRXJyb3JOb25lICE9IHJjKSB7CisgICAgTE9HRSgiT01YX0dldEhhbmRsZSBmYWlsZWQgKCVkKSIsIHJjKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ2RlY19zZXNzaW9uX2Rlc3Ryb3k6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBwX3Nlc3Npb246IGpvYiBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIG5vbmUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBEZXN0cm95IGEganBlZyBlbmNvZGUgc2Vzc2lvbgorICoKKyAqKi8KK3ZvaWQgbW1fanBlZ2RlY19zZXNzaW9uX2Rlc3Ryb3kobW1fanBlZ19qb2Jfc2Vzc2lvbl90KiBwX3Nlc3Npb24pCit7CisgIE9NWF9FUlJPUlRZUEUgcmMgPSBPTVhfRXJyb3JOb25lOworCisgIExPR0QoIkUiKTsKKyAgaWYgKE5VTEwgPT0gcF9zZXNzaW9uLT5vbXhfaGFuZGxlKSB7CisgICAgTE9HRSgiaW52YWxpZCBoYW5kbGUiKTsKKyAgICByZXR1cm47CisgIH0KKworICByYyA9IG1tX2pwZWdfc2Vzc2lvbl9jaGFuZ2Vfc3RhdGUocF9zZXNzaW9uLCBPTVhfU3RhdGVJZGxlLCBOVUxMKTsKKyAgaWYgKHJjKSB7CisgICAgTE9HRSgiRXJyb3IiKTsKKyAgfQorCisgIHJjID0gbW1fanBlZ19zZXNzaW9uX2NoYW5nZV9zdGF0ZShwX3Nlc3Npb24sIE9NWF9TdGF0ZUxvYWRlZCwKKyAgICBtbV9qcGVnZGVjX3Nlc3Npb25fZnJlZV9idWZmZXJzKTsKKyAgaWYgKHJjKSB7CisgICAgTE9HRSgiRXJyb3IiKTsKKyAgfQorCisgIHJjID0gT01YX0ZyZWVIYW5kbGUocF9zZXNzaW9uLT5vbXhfaGFuZGxlKTsKKyAgaWYgKDAgIT0gcmMpIHsKKyAgICBMT0dFKCJPTVhfRnJlZUhhbmRsZSBmYWlsZWQgKCVkKSIsIHJjKTsKKyAgfQorICBwX3Nlc3Npb24tPm9teF9oYW5kbGUgPSBOVUxMOworCisKKyAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZwX3Nlc3Npb24tPmxvY2spOworICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmcF9zZXNzaW9uLT5jb25kKTsKKyAgTE9HRCgiWCIpOworfQorCisvKiogbW1fanBlZ19zZXNzaW9uX2NvbmZpZ19wb3J0OgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAcF9zZXNzaW9uOiBqb2Igc2Vzc2lvbgorICoKKyAqICBSZXR1cm46CisgKiAgICAgICBPTVggZXJyb3IgdmFsdWVzCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgQ29uZmlndXJlIE9NWCBwb3J0cworICoKKyAqKi8KK09NWF9FUlJPUlRZUEUgbW1fanBlZ2RlY19zZXNzaW9uX2NvbmZpZ19wb3J0cyhtbV9qcGVnX2pvYl9zZXNzaW9uX3QqIHBfc2Vzc2lvbikKK3sKKyAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworICBtbV9qcGVnX2RlY29kZV9wYXJhbXNfdCAqcF9wYXJhbXMgPSAmcF9zZXNzaW9uLT5kZWNfcGFyYW1zOworICBtbV9qcGVnX2RlY29kZV9qb2JfdCAqcF9qb2JwYXJhbXMgPSAmcF9zZXNzaW9uLT5kZWNvZGVfam9iOworCisgIG1tX2pwZWdfYnVmX3QgKnBfc3JjX2J1ZiA9CisgICAgJnBfcGFyYW1zLT5zcmNfbWFpbl9idWZbcF9qb2JwYXJhbXMtPnNyY19pbmRleF07CisKKyAgcF9zZXNzaW9uLT5pbnB1dFBvcnQublBvcnRJbmRleCA9IDA7CisgIHBfc2Vzc2lvbi0+b3V0cHV0UG9ydC5uUG9ydEluZGV4ID0gMTsKKworCisgIHJldCA9IE9NWF9HZXRQYXJhbWV0ZXIocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLAorICAgICZwX3Nlc3Npb24tPmlucHV0UG9ydCk7CisgIGlmIChyZXQpIHsKKyAgICBMT0dFKCJmYWlsZWQiKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgcmV0ID0gT01YX0dldFBhcmFtZXRlcihwX3Nlc3Npb24tPm9teF9oYW5kbGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sCisgICAgJnBfc2Vzc2lvbi0+b3V0cHV0UG9ydCk7CisgIGlmIChyZXQpIHsKKyAgICBMT0dFKCJmYWlsZWQiKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgcF9zZXNzaW9uLT5pbnB1dFBvcnQuZm9ybWF0LmltYWdlLm5GcmFtZVdpZHRoID0KKyAgICAoT01YX1UzMilwX2pvYnBhcmFtcy0+bWFpbl9kaW0uc3JjX2RpbS53aWR0aDsKKyAgcF9zZXNzaW9uLT5pbnB1dFBvcnQuZm9ybWF0LmltYWdlLm5GcmFtZUhlaWdodCA9CisgICAgKE9NWF9VMzIpcF9qb2JwYXJhbXMtPm1haW5fZGltLnNyY19kaW0uaGVpZ2h0OworICBwX3Nlc3Npb24tPmlucHV0UG9ydC5mb3JtYXQuaW1hZ2UublN0cmlkZSA9CisgICAgcF9zcmNfYnVmLT5vZmZzZXQubXBbMF0uc3RyaWRlOworICBwX3Nlc3Npb24tPmlucHV0UG9ydC5mb3JtYXQuaW1hZ2UublNsaWNlSGVpZ2h0ID0KKyAgICAoT01YX1UzMilwX3NyY19idWYtPm9mZnNldC5tcFswXS5zY2FubGluZTsKKyAgcF9zZXNzaW9uLT5pbnB1dFBvcnQuZm9ybWF0LmltYWdlLmVDb2xvckZvcm1hdCA9CisgICAgbWFwX2pwZWdfZm9ybWF0KHBfcGFyYW1zLT5jb2xvcl9mb3JtYXQpOworICBwX3Nlc3Npb24tPmlucHV0UG9ydC5uQnVmZmVyU2l6ZSA9CisgICAgcF9wYXJhbXMtPnNyY19tYWluX2J1ZltwX2pvYnBhcmFtcy0+c3JjX2luZGV4XS5idWZfc2l6ZTsKKyAgcF9zZXNzaW9uLT5pbnB1dFBvcnQubkJ1ZmZlckNvdW50QWN0dWFsID0gKE9NWF9VMzIpcF9wYXJhbXMtPm51bV9zcmNfYnVmczsKKyAgcmV0ID0gT01YX1NldFBhcmFtZXRlcihwX3Nlc3Npb24tPm9teF9oYW5kbGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sCisgICAgJnBfc2Vzc2lvbi0+aW5wdXRQb3J0KTsKKyAgaWYgKHJldCkgeworICAgIExPR0UoImZhaWxlZCIpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisKKy8qKiBtbV9qcGVnZGVjX3Nlc3Npb25fY29uZmlnX21haW46CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBwX3Nlc3Npb246IGpvYiBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIE9NWCBlcnJvciB2YWx1ZXMKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDb25maWd1cmUgbWFpbiBpbWFnZQorICoKKyAqKi8KK09NWF9FUlJPUlRZUEUgbW1fanBlZ2RlY19zZXNzaW9uX2NvbmZpZ19tYWluKG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uKQoreworICBPTVhfRVJST1JUWVBFIHJjID0gT01YX0Vycm9yTm9uZTsKKworICAvKiBjb25maWcgcG9ydCAqLworICBMT0dEKCJjb25maWcgcG9ydCIpOworICByYyA9IG1tX2pwZWdkZWNfc2Vzc2lvbl9jb25maWdfcG9ydHMocF9zZXNzaW9uKTsKKyAgaWYgKE9NWF9FcnJvck5vbmUgIT0gcmMpIHsKKyAgICBMT0dFKCJjb25maWcgcG9ydCBmYWlsZWQiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworCisgIC8qIFRPRE86IGNvbmZpZyBjcm9wICovCisKKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ19zZXNzaW9uX2NvbmZpZ3VyZToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQGRhdGE6IGVuY29kZSBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIG5vbmUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDb25maWd1cmUgdGhlIHNlc3Npb24KKyAqCisgKiovCitzdGF0aWMgT01YX0VSUk9SVFlQRSBtbV9qcGVnZGVjX3Nlc3Npb25fY29uZmlndXJlKG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uKQoreworICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgTE9HRCgiRSAiKTsKKworICBNTV9KUEVHX0NIS19BQk9SVChwX3Nlc3Npb24sIHJldCwgZXJyb3IpOworCisgIC8qIGNvbmZpZyBtYWluIGltZyAqLworICByZXQgPSBtbV9qcGVnZGVjX3Nlc3Npb25fY29uZmlnX21haW4ocF9zZXNzaW9uKTsKKyAgaWYgKE9NWF9FcnJvck5vbmUgIT0gcmV0KSB7CisgICAgTE9HRSgiY29uZmlnIG1haW4gaW1nIGZhaWxlZCIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBUT0RPOiBjb21tb24gY29uZmlnIChpZiBuZWVkZWQpICovCisKKyAgcmV0ID0gbW1fanBlZ19zZXNzaW9uX2NoYW5nZV9zdGF0ZShwX3Nlc3Npb24sIE9NWF9TdGF0ZUlkbGUsCisgICAgbW1fanBlZ2RlY19zZXNzaW9uX3NlbmRfYnVmZmVycyk7CisgIGlmIChyZXQpIHsKKyAgICBMT0dFKCJjaGFuZ2Ugc3RhdGUgdG8gaWRsZSBmYWlsZWQgJWQiLCByZXQpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICByZXQgPSBtbV9qcGVnX3Nlc3Npb25fY2hhbmdlX3N0YXRlKHBfc2Vzc2lvbiwgT01YX1N0YXRlRXhlY3V0aW5nLAorICAgIE5VTEwpOworICBpZiAocmV0KSB7CisgICAgTE9HRSgiY2hhbmdlIHN0YXRlIHRvIGV4ZWN1dGluZyBmYWlsZWQgJWQiLCByZXQpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworZXJyb3I6CisgIExPR0QoIlggcmV0ICVkIiwgcmV0KTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIE9NWF9FUlJPUlRZUEUgbW1fanBlZ19zZXNzaW9uX3BvcnRfZW5hYmxlKAorICAgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uLAorICAgIE9NWF9VMzIgblBvcnRJbmRleCwKKyAgICBPTVhfQk9PTCB3YWl0KQoreworICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgIE9NWF9FVkVOVFRZUEUgbEV2ZW50OworCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKyAgcF9zZXNzaW9uLT5ldmVudF9wZW5kaW5nID0gT01YX1RSVUU7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwX3Nlc3Npb24tPmxvY2spOworCisgIHJldCA9IE9NWF9TZW5kQ29tbWFuZChwX3Nlc3Npb24tPm9teF9oYW5kbGUsIE9NWF9Db21tYW5kUG9ydEVuYWJsZSwKKyAgICAgIG5Qb3J0SW5kZXgsIE5VTEwpOworCisgIGlmIChyZXQpIHsKKyAgICBMT0dFKCJmYWlsZWQiKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgaWYgKHdhaXQgPT0gT01YX1RSVUUpIHsKKyAgICAvLyBXYWl0IGZvciBjbWQgY29tcGxldGUKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgICAgaWYgKHBfc2Vzc2lvbi0+ZXZlbnRfcGVuZGluZyA9PSBPTVhfVFJVRSkgeworICAgICAgTE9HRCgiYmVmb3JlIHdhaXQiKTsKKyAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZwX3Nlc3Npb24tPmNvbmQsICZwX3Nlc3Npb24tPmxvY2spOworICAgICAgbEV2ZW50ID0gcF9zZXNzaW9uLT5vbXhFdmVudDsKKyAgICAgIExPR0QoImFmdGVyIHdhaXQiKTsKKyAgICB9CisgICAgbEV2ZW50ID0gcF9zZXNzaW9uLT5vbXhFdmVudDsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKworICAgIGlmIChsRXZlbnQgIT0gT01YX0V2ZW50Q21kQ29tcGxldGUpIHsKKyAgICAgIExPR0QoIlVuZXhwZWN0ZWQgZXZlbnQgJWQiLGxFdmVudCk7CisgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKyAgfQorICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworc3RhdGljIE9NWF9FUlJPUlRZUEUgbW1fanBlZ19zZXNzaW9uX3BvcnRfZGlzYWJsZSgKKyAgICBtbV9qcGVnX2pvYl9zZXNzaW9uX3QgKnBfc2Vzc2lvbiwKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXgsCisgICAgT01YX0JPT0wgd2FpdCkKK3sKKyAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworICBPTVhfRVZFTlRUWVBFIGxFdmVudDsKKworICBwdGhyZWFkX211dGV4X2xvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgIHBfc2Vzc2lvbi0+ZXZlbnRfcGVuZGluZyA9IE9NWF9UUlVFOworICBwdGhyZWFkX211dGV4X3VubG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKworICByZXQgPSBPTVhfU2VuZENvbW1hbmQocF9zZXNzaW9uLT5vbXhfaGFuZGxlLCBPTVhfQ29tbWFuZFBvcnREaXNhYmxlLAorICAgICAgblBvcnRJbmRleCwgTlVMTCk7CisKKyAgaWYgKHJldCkgeworICAgIExPR0UoImZhaWxlZCIpOworICAgIHJldHVybiByZXQ7CisgIH0KKyAgaWYgKHdhaXQgPT0gT01YX1RSVUUpIHsKKyAgICAvLyBXYWl0IGZvciBjbWQgY29tcGxldGUKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgICAgaWYgKHBfc2Vzc2lvbi0+ZXZlbnRfcGVuZGluZyA9PSBPTVhfVFJVRSkgeworICAgICAgTE9HRCgiYmVmb3JlIHdhaXQiKTsKKyAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZwX3Nlc3Npb24tPmNvbmQsICZwX3Nlc3Npb24tPmxvY2spOworCisgICAgICBMT0dEKCJhZnRlciB3YWl0Iik7CisgICAgfQorICAgIGxFdmVudCA9IHBfc2Vzc2lvbi0+b214RXZlbnQ7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisKKyAgICBpZiAobEV2ZW50ICE9IE9NWF9FdmVudENtZENvbXBsZXRlKSB7CisgICAgICBMT0dEKCJVbmV4cGVjdGVkIGV2ZW50ICVkIixsRXZlbnQpOworICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKKworLyoqIG1tX2pwZWdkZWNfc2Vzc2lvbl9kZWNvZGU6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBwX3Nlc3Npb246IGVuY29kZSBzZXNzaW9uCisgKgorICogIFJldHVybjoKKyAqICAgICAgIE9NWF9FUlJPUlRZUEUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBTdGFydCB0aGUgZW5jb2RpbmcKKyAqCisgKiovCitzdGF0aWMgT01YX0VSUk9SVFlQRSBtbV9qcGVnZGVjX3Nlc3Npb25fZGVjb2RlKG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uKQoreworICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgIG1tX2pwZWdfZGVjb2RlX3BhcmFtc190ICpwX3BhcmFtcyA9ICZwX3Nlc3Npb24tPmRlY19wYXJhbXM7CisgIG1tX2pwZWdfZGVjb2RlX2pvYl90ICpwX2pvYnBhcmFtcyA9ICZwX3Nlc3Npb24tPmRlY29kZV9qb2I7CisgIE9NWF9FVkVOVFRZUEUgbEV2ZW50OworICB1aW50MzJfdCBpOworICBRT01YX0JVRkZFUl9JTkZPIGxidWZmZXJfaW5mbzsKKworICBwdGhyZWFkX211dGV4X2xvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgIHBfc2Vzc2lvbi0+YWJvcnRfc3RhdGUgPSBNTV9KUEVHX0FCT1JUX05PTkU7CisgIHBfc2Vzc2lvbi0+ZW5jb2RpbmcgPSBPTVhfRkFMU0U7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwX3Nlc3Npb24tPmxvY2spOworCisgIGlmIChPTVhfRkFMU0UgPT0gcF9zZXNzaW9uLT5jb25maWcpIHsKKyAgICByZXQgPSBtbV9qcGVnZGVjX3Nlc3Npb25fY29uZmlndXJlKHBfc2Vzc2lvbik7CisgICAgaWYgKHJldCkgeworICAgICAgTE9HRSgiRXJyb3IiKTsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICAgIHBfc2Vzc2lvbi0+Y29uZmlnID0gT01YX1RSVUU7CisgIH0KKworICBwdGhyZWFkX211dGV4X2xvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgIHBfc2Vzc2lvbi0+ZW5jb2RpbmcgPSBPTVhfVFJVRTsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisKKyAgTU1fSlBFR19DSEtfQUJPUlQocF9zZXNzaW9uLCByZXQsIGVycm9yKTsKKworICBwX3Nlc3Npb24tPmV2ZW50X3BlbmRpbmcgPSBPTVhfVFJVRTsKKworICByZXQgPSBPTVhfRW1wdHlUaGlzQnVmZmVyKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwKKyAgICBwX3Nlc3Npb24tPnBfaW5fb214X2J1ZltwX2pvYnBhcmFtcy0+c3JjX2luZGV4XSk7CisgIGlmIChyZXQpIHsKKyAgICBMT0dFKCJFcnJvciIpOworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvLyBXYWl0IGZvciBwb3J0IHNldHRpbmdzIGNoYW5nZWQKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZwX3Nlc3Npb24tPmxvY2spOworICBpZiAocF9zZXNzaW9uLT5ldmVudF9wZW5kaW5nID09IE9NWF9UUlVFKSB7CisgICAgTE9HRCgiYmVmb3JlIHdhaXQiKTsKKyAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcF9zZXNzaW9uLT5jb25kLCAmcF9zZXNzaW9uLT5sb2NrKTsKKyAgfQorICBsRXZlbnQgPSBwX3Nlc3Npb24tPm9teEV2ZW50OworICBMT0dEKCJhZnRlciB3YWl0Iik7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwX3Nlc3Npb24tPmxvY2spOworCisgIGlmIChsRXZlbnQgIT0gT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCkgeworICAgIExPR0QoIlVuZXhwZWN0ZWQgZXZlbnQgJWQiLGxFdmVudCk7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIC8vIERpc2FibGUgb3V0cHV0IHBvcnQgKHdhaXQpCisgIG1tX2pwZWdfc2Vzc2lvbl9wb3J0X2Rpc2FibGUocF9zZXNzaW9uLAorICAgICAgcF9zZXNzaW9uLT5vdXRwdXRQb3J0Lm5Qb3J0SW5kZXgsCisgICAgICBPTVhfVFJVRSk7CisKKyAgLy8gR2V0IHBvcnQgZGVmaW5pdGlvbgorICByZXQgPSBPTVhfR2V0UGFyYW1ldGVyKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwKKyAgICAgICZwX3Nlc3Npb24tPm91dHB1dFBvcnQpOworICBpZiAocmV0KSB7CisgICAgTE9HRSgiZmFpbGVkIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIC8vIFNldCBwb3J0IGRlZmluaXRpb24KKyAgcF9zZXNzaW9uLT5vdXRwdXRQb3J0LmZvcm1hdC5pbWFnZS5uRnJhbWVXaWR0aCA9CisgICAgKE9NWF9VMzIpcF9qb2JwYXJhbXMtPm1haW5fZGltLmRzdF9kaW0ud2lkdGg7CisgIHBfc2Vzc2lvbi0+b3V0cHV0UG9ydC5mb3JtYXQuaW1hZ2UubkZyYW1lSGVpZ2h0ID0KKyAgICAoT01YX1UzMilwX2pvYnBhcmFtcy0+bWFpbl9kaW0uZHN0X2RpbS5oZWlnaHQ7CisgIHBfc2Vzc2lvbi0+b3V0cHV0UG9ydC5mb3JtYXQuaW1hZ2UuZUNvbG9yRm9ybWF0ID0KKyAgICBtYXBfanBlZ19mb3JtYXQocF9wYXJhbXMtPmNvbG9yX2Zvcm1hdCk7CisKKyAgcF9zZXNzaW9uLT5vdXRwdXRQb3J0Lm5CdWZmZXJTaXplID0KKyAgICAgcF9wYXJhbXMtPmRlc3RfYnVmW3Bfam9icGFyYW1zLT5kc3RfaW5kZXhdLmJ1Zl9zaXplOworICAgcF9zZXNzaW9uLT5vdXRwdXRQb3J0Lm5CdWZmZXJDb3VudEFjdHVhbCA9IChPTVhfVTMyKXBfcGFyYW1zLT5udW1fZHN0X2J1ZnM7CisKKyAgIHBfc2Vzc2lvbi0+b3V0cHV0UG9ydC5mb3JtYXQuaW1hZ2UublNsaWNlSGVpZ2h0ID0KKyAgICAgICAoT01YX1UzMikKKyAgICAgICBwX3BhcmFtcy0+ZGVzdF9idWZbcF9qb2JwYXJhbXMtPmRzdF9pbmRleF0ub2Zmc2V0Lm1wWzBdLnNjYW5saW5lOworICAgcF9zZXNzaW9uLT5vdXRwdXRQb3J0LmZvcm1hdC5pbWFnZS5uU3RyaWRlID0KKyAgICAgICBwX3BhcmFtcy0+ZGVzdF9idWZbcF9qb2JwYXJhbXMtPmRzdF9pbmRleF0ub2Zmc2V0Lm1wWzBdLnN0cmlkZTsKKworICAgcmV0ID0gT01YX1NldFBhcmFtZXRlcihwX3Nlc3Npb24tPm9teF9oYW5kbGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sCisgICAgICZwX3Nlc3Npb24tPm91dHB1dFBvcnQpOworICAgaWYgKHJldCkgeworICAgICBMT0dFKCJmYWlsZWQiKTsKKyAgICAgcmV0dXJuIHJldDsKKyAgIH0KKworICAvLyBFbmFibGUgcG9ydCAobm8gd2FpdCkKKyAgbW1fanBlZ19zZXNzaW9uX3BvcnRfZW5hYmxlKHBfc2Vzc2lvbiwKKyAgICAgIHBfc2Vzc2lvbi0+b3V0cHV0UG9ydC5uUG9ydEluZGV4LAorICAgICAgT01YX0ZBTFNFKTsKKworICBtZW1zZXQoJmxidWZmZXJfaW5mbywgMHgwLCBzaXplb2YoUU9NWF9CVUZGRVJfSU5GTykpOworICAvLyBVc2UgYnVmZmVycworICBmb3IgKGkgPSAwOyBpIDwgcF9wYXJhbXMtPm51bV9kc3RfYnVmczsgaSsrKSB7CisgICAgbGJ1ZmZlcl9pbmZvLmZkID0gKE9NWF9VMzIpcF9wYXJhbXMtPmRlc3RfYnVmW2ldLmZkOworICAgIExPR0QoIkRlc3QgYnVmZmVyICVkIiwgKHVuc2lnbmVkIGludClpKTsKKyAgICByZXQgPSBPTVhfVXNlQnVmZmVyKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwgJihwX3Nlc3Npb24tPnBfb3V0X29teF9idWZbaV0pLAorICAgICAgICAxLCAmbGJ1ZmZlcl9pbmZvLCBwX3BhcmFtcy0+ZGVzdF9idWZbaV0uYnVmX3NpemUsCisgICAgICAgIHBfcGFyYW1zLT5kZXN0X2J1ZltpXS5idWZfdmFkZHIpOworICAgIGlmIChyZXQpIHsKKyAgICAgIExPR0UoIkVycm9yIik7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgfQorCisgIC8vIFdhaXQgZm9yIHBvcnQgZW5hYmxlIGNvbXBsZXRpb24KKyAgcHRocmVhZF9tdXRleF9sb2NrKCZwX3Nlc3Npb24tPmxvY2spOworICBpZiAocF9zZXNzaW9uLT5ldmVudF9wZW5kaW5nID09IE9NWF9UUlVFKSB7CisgICAgTE9HRCgiYmVmb3JlIHdhaXQiKTsKKyAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcF9zZXNzaW9uLT5jb25kLCAmcF9zZXNzaW9uLT5sb2NrKTsKKyAgICBsRXZlbnQgPSBwX3Nlc3Npb24tPm9teEV2ZW50OworICAgIExPR0QoImFmdGVyIHdhaXQiKTsKKyAgfQorICBsRXZlbnQgPSBwX3Nlc3Npb24tPm9teEV2ZW50OworICBwdGhyZWFkX211dGV4X3VubG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKworICBpZiAobEV2ZW50ICE9IE9NWF9FdmVudENtZENvbXBsZXRlKSB7CisgICAgTE9HRCgiVW5leHBlY3RlZCBldmVudCAlZCIsbEV2ZW50KTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgcmV0ID0gT01YX0ZpbGxUaGlzQnVmZmVyKHBfc2Vzc2lvbi0+b214X2hhbmRsZSwKKyAgICBwX3Nlc3Npb24tPnBfb3V0X29teF9idWZbcF9qb2JwYXJhbXMtPmRzdF9pbmRleF0pOworICBpZiAocmV0KSB7CisgICAgTE9HRSgiRXJyb3IiKTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgTU1fSlBFR19DSEtfQUJPUlQocF9zZXNzaW9uLCByZXQsIGVycm9yKTsKKworZXJyb3I6CisKKyAgTE9HRCgiWCAiKTsKKyAgcmV0dXJuIHJldDsKK30KKworLyoqIG1tX2pwZWdkZWNfcHJvY2Vzc19kZWNvZGluZ19qb2I6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBteV9vYmo6IGpwZWcgY2xpZW50CisgKiAgICBAam9iX25vZGU6IGpvYiBub2RlCisgKgorICogIFJldHVybjoKKyAqICAgICAgIDAgZm9yIHN1Y2Nlc3MgLTEgb3RoZXJ3aXNlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgU3RhcnQgdGhlIGVuY29kaW5nIGpvYgorICoKKyAqKi8KK2ludDMyX3QgbW1fanBlZ2RlY19wcm9jZXNzX2RlY29kaW5nX2pvYihtbV9qcGVnX29iaiAqbXlfb2JqLCBtbV9qcGVnX2pvYl9xX25vZGVfdCogam9iX25vZGUpCit7CisgIG1tX2pwZWdfcV9kYXRhX3QgcWRhdGE7CisgIGludDMyX3QgcmMgPSAwOworICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uID0gTlVMTDsKKworICAvKiBjaGVjayBpZiB2YWxpZCBzZXNzaW9uICovCisgIHBfc2Vzc2lvbiA9IG1tX2pwZWdfZ2V0X3Nlc3Npb24obXlfb2JqLCBqb2Jfbm9kZS0+ZGVjX2luZm8uam9iX2lkKTsKKyAgaWYgKE5VTEwgPT0gcF9zZXNzaW9uKSB7CisgICAgTE9HRSgiaW52YWxpZCBqb2IgaWQgJXgiLAorICAgICAgam9iX25vZGUtPmRlY19pbmZvLmpvYl9pZCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogc2VudCBlbmNvZGUgY21kIHRvIE9NWCwgcXVldWUgam9iIGludG8gb25nb2luZyBxdWV1ZSAqLworICBxZGF0YS5wID0gam9iX25vZGU7CisgIHJjID0gbW1fanBlZ19xdWV1ZV9lbnEoJm15X29iai0+b25nb2luZ19qb2JfcSwgcWRhdGEpOworICBpZiAocmMpIHsKKyAgICBMT0dFKCJqcGVnIGVucXVldWUgZmFpbGVkICVkIiwgcmV0KTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgcF9zZXNzaW9uLT5kZWNvZGVfam9iID0gam9iX25vZGUtPmRlY19pbmZvLmRlY29kZV9qb2I7CisgIHBfc2Vzc2lvbi0+am9iSWQgPSBqb2Jfbm9kZS0+ZGVjX2luZm8uam9iX2lkOworICByZXQgPSBtbV9qcGVnZGVjX3Nlc3Npb25fZGVjb2RlKHBfc2Vzc2lvbik7CisgIGlmIChyZXQpIHsKKyAgICBMT0dFKCJlbmNvZGUgc2Vzc2lvbiBmYWlsZWQiKTsKKyAgICBnb3RvIGVycm9yOworICB9CisKKyAgTE9HRCgiU3VjY2VzcyBYICIpOworICByZXR1cm4gcmM7CisKK2Vycm9yOgorCisgIGlmICgoT01YX0Vycm9yTm9uZSAhPSByZXQpICYmCisgICAgKE5VTEwgIT0gcF9zZXNzaW9uLT5kZWNfcGFyYW1zLmpwZWdfY2IpKSB7CisgICAgcF9zZXNzaW9uLT5qb2Jfc3RhdHVzID0gSlBFR19KT0JfU1RBVFVTX0VSUk9SOworICAgIExPR0QoInNlbmQganBlZyBlcnJvciBjYWxsYmFjayAlZCIsCisgICAgICBwX3Nlc3Npb24tPmpvYl9zdGF0dXMpOworICAgIHBfc2Vzc2lvbi0+ZGVjX3BhcmFtcy5qcGVnX2NiKHBfc2Vzc2lvbi0+am9iX3N0YXR1cywKKyAgICAgIHBfc2Vzc2lvbi0+Y2xpZW50X2hkbCwKKyAgICAgIHBfc2Vzc2lvbi0+am9iSWQsCisgICAgICBOVUxMLAorICAgICAgcF9zZXNzaW9uLT5kZWNfcGFyYW1zLnVzZXJkYXRhKTsKKyAgfQorCisgIC8qcmVtb3ZlIHRoZSBqb2IqLworICBtbV9qcGVnZGVjX2pvYl9kb25lKHBfc2Vzc2lvbik7CisgIExPR0QoIkVycm9yIFggIik7CisKKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ19zdGFydF9kZWNvZGVfam9iOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAbXlfb2JqOiBqcGVnIG9iamVjdAorICogICAgQGNsaWVudF9oZGw6IGNsaWVudCBoYW5kbGUKKyAqICAgIEBqb2I6IHBvaW50ZXIgdG8gZW5jb2RlIGpvYgorICogICAgQGpvYklkOiBqb2IgaWQKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBmb3Igc3VjY2VzcyBlbHNlIGZhaWx1cmUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBTdGFydCB0aGUgZW5jb2Rpbmcgam9iCisgKgorICoqLworaW50MzJfdCBtbV9qcGVnZGVjX3N0YXJ0X2RlY29kZV9qb2IobW1fanBlZ19vYmogKm15X29iaiwKKyAgbW1fanBlZ19qb2JfdCAqam9iLAorICB1aW50MzJfdCAqam9iX2lkKQoreworICBtbV9qcGVnX3FfZGF0YV90IHFkYXRhOworICBpbnQzMl90IHJjID0gLTE7CisgIHVpbnQ4X3Qgc2Vzc2lvbl9pZHggPSAwOworICB1aW50OF90IGNsaWVudF9pZHggPSAwOworICBtbV9qcGVnX2pvYl9xX25vZGVfdCogbm9kZSA9IE5VTEw7CisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uID0gTlVMTDsKKyAgbW1fanBlZ19kZWNvZGVfam9iX3QgKnBfam9icGFyYW1zICA9ICZqb2ItPmRlY29kZV9qb2I7CisKKyAgKmpvYl9pZCA9IDA7CisKKyAgLyogY2hlY2sgaWYgdmFsaWQgc2Vzc2lvbiAqLworICBzZXNzaW9uX2lkeCA9IEdFVF9TRVNTSU9OX0lEWChwX2pvYnBhcmFtcy0+c2Vzc2lvbl9pZCk7CisgIGNsaWVudF9pZHggPSBHRVRfQ0xJRU5UX0lEWChwX2pvYnBhcmFtcy0+c2Vzc2lvbl9pZCk7CisgIExPR0QoInNlc3Npb25faWR4ICVkIGNsaWVudCBpZHggJWQiLAorICAgIHNlc3Npb25faWR4LCBjbGllbnRfaWR4KTsKKworICBpZiAoKHNlc3Npb25faWR4ID49IE1NX0pQRUdfTUFYX1NFU1NJT04pIHx8CisgICAgKGNsaWVudF9pZHggPj0gTUFYX0pQRUdfQ0xJRU5UX05VTSkpIHsKKyAgICBMT0dFKCJpbnZhbGlkIHNlc3Npb24gaWQgJXgiLAorICAgICAgam9iLT5kZWNvZGVfam9iLnNlc3Npb25faWQpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIHBfc2Vzc2lvbiA9ICZteV9vYmotPmNsbnRfbWdyW2NsaWVudF9pZHhdLnNlc3Npb25bc2Vzc2lvbl9pZHhdOworICBpZiAoT01YX0ZBTFNFID09IHBfc2Vzc2lvbi0+YWN0aXZlKSB7CisgICAgTE9HRSgic2Vzc2lvbiBub3QgYWN0aXZlICV4IiwKKyAgICAgIGpvYi0+ZGVjb2RlX2pvYi5zZXNzaW9uX2lkKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworICBpZiAoKHBfam9icGFyYW1zLT5zcmNfaW5kZXggPj0gKGludDMyX3QpcF9zZXNzaW9uLT5kZWNfcGFyYW1zLm51bV9zcmNfYnVmcykgfHwKKyAgICAocF9qb2JwYXJhbXMtPmRzdF9pbmRleCA+PSAoaW50MzJfdClwX3Nlc3Npb24tPmRlY19wYXJhbXMubnVtX2RzdF9idWZzKSkgeworICAgIExPR0UoImludmFsaWQgYnVmZmVyIGluZGljZXMiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworICAvKiBlbnF1ZXVlIG5ldyBqb2IgaW50byB0b2RvIGpvYiBxdWV1ZSAqLworICBub2RlID0gKG1tX2pwZWdfam9iX3Ffbm9kZV90ICopbWFsbG9jKHNpemVvZihtbV9qcGVnX2pvYl9xX25vZGVfdCkpOworICBpZiAoTlVMTCA9PSBub2RlKSB7CisgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBtbV9qcGVnX2pvYl9xX25vZGVfdCIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgICpqb2JfaWQgPSBqb2ItPmRlY29kZV9qb2Iuc2Vzc2lvbl9pZCB8CisgICAgKChwX3Nlc3Npb24tPmpvYl9oaXN0KysgJSBKT0JfSElTVF9NQVgpIDw8IDE2KTsKKworICBtZW1zZXQobm9kZSwgMCwgc2l6ZW9mKG1tX2pwZWdfam9iX3Ffbm9kZV90KSk7CisgIG5vZGUtPmRlY19pbmZvLmRlY29kZV9qb2IgPSBqb2ItPmRlY29kZV9qb2I7CisgIG5vZGUtPmRlY19pbmZvLmpvYl9pZCA9ICpqb2JfaWQ7CisgIG5vZGUtPmRlY19pbmZvLmNsaWVudF9oYW5kbGUgPSBwX3Nlc3Npb24tPmNsaWVudF9oZGw7CisgIG5vZGUtPnR5cGUgPSBNTV9KUEVHX0NNRF9UWVBFX0RFQ09ERV9KT0I7CisKKyAgcWRhdGEucCA9IG5vZGU7CisgIHJjID0gbW1fanBlZ19xdWV1ZV9lbnEoJm15X29iai0+am9iX21nci5qb2JfcXVldWUsIHFkYXRhKTsKKyAgaWYgKDAgPT0gcmMpIHsKKyAgICBjYW1fc2VtX3Bvc3QoJm15X29iai0+am9iX21nci5qb2Jfc2VtKTsKKyAgfQorCisgIHJldHVybiByYzsKK30KKworLyoqIG1tX2pwZWdkZWNfY3JlYXRlX3Nlc3Npb246CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBteV9vYmo6IGpwZWcgb2JqZWN0CisgKiAgICBAY2xpZW50X2hkbDogY2xpZW50IGhhbmRsZQorICogICAgQHBfcGFyYW1zOiBwb2ludGVyIHRvIGVuY29kZSBwYXJhbXMKKyAqICAgIEBwX3Nlc3Npb25faWQ6IHNlc3Npb24gaWQKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBmb3Igc3VjY2VzcyBlbHNlIGZhaWx1cmUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBTdGFydCB0aGUgZW5jb2Rpbmcgc2Vzc2lvbgorICoKKyAqKi8KK2ludDMyX3QgbW1fanBlZ2RlY19jcmVhdGVfc2Vzc2lvbihtbV9qcGVnX29iaiAqbXlfb2JqLAorICB1aW50MzJfdCBjbGllbnRfaGRsLAorICBtbV9qcGVnX2RlY29kZV9wYXJhbXNfdCAqcF9wYXJhbXMsCisgIHVpbnQzMl90KiBwX3Nlc3Npb25faWQpCit7CisgIGludDMyX3QgcmMgPSAwOworICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgIHVpbnQ4X3QgY2xudF9pZHggPSAwOworICBpbnQgc2Vzc2lvbl9pZHggPSAtMTsKKyAgbW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24gPSBOVUxMOworICAqcF9zZXNzaW9uX2lkID0gMDsKKworICAvKiB2YWxpZGF0ZSB0aGUgcGFyYW1ldGVycyAqLworICBpZiAoKHBfcGFyYW1zLT5udW1fc3JjX2J1ZnMgPiBNTV9KUEVHX01BWF9CVUYpCisgICAgfHwgKHBfcGFyYW1zLT5udW1fZHN0X2J1ZnMgPiBNTV9KUEVHX01BWF9CVUYpKSB7CisgICAgTE9HRSgiaW52YWxpZCBudW0gYnVmZmVycyIpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIC8qIGNoZWNrIGlmIHZhbGlkIGNsaWVudCAqLworICBjbG50X2lkeCA9IG1tX2pwZWdfdXRpbF9nZXRfaW5kZXhfYnlfaGFuZGxlcihjbGllbnRfaGRsKTsKKyAgaWYgKGNsbnRfaWR4ID49IE1BWF9KUEVHX0NMSUVOVF9OVU0pIHsKKyAgICBMT0dFKCJpbnZhbGlkIGNsaWVudCB3aXRoIGhhbmRsZXIgKCVkKSIsIGNsaWVudF9oZGwpOworICAgIHJldHVybiByYzsKKyAgfQorCisgIHNlc3Npb25faWR4ID0gbW1fanBlZ19nZXRfbmV3X3Nlc3Npb25faWR4KG15X29iaiwgY2xudF9pZHgsICZwX3Nlc3Npb24pOworICBpZiAoc2Vzc2lvbl9pZHggPCAwKSB7CisgICAgTE9HRSgiaW52YWxpZCBzZXNzaW9uIGlkICglZCkiLCBzZXNzaW9uX2lkeCk7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgcmV0ID0gbW1fanBlZ2RlY19zZXNzaW9uX2NyZWF0ZShwX3Nlc3Npb24pOworICBpZiAoT01YX0Vycm9yTm9uZSAhPSByZXQpIHsKKyAgICBwX3Nlc3Npb24tPmFjdGl2ZSA9IE9NWF9GQUxTRTsKKyAgICBMT0dFKCJqcGVnIHNlc3Npb24gY3JlYXRlIGZhaWxlZCIpOworICAgIHJldHVybiByYzsKKyAgfQorCisgICpwX3Nlc3Npb25faWQgPSAoSk9CX0lEX01BR0lDVkFMIDw8IDI0KSB8CisgICAgKCh1bnNpZ25lZClzZXNzaW9uX2lkeCA8PCA4KSB8IGNsbnRfaWR4OworCisgIC8qY29weSB0aGUgcGFyYW1zKi8KKyAgcF9zZXNzaW9uLT5kZWNfcGFyYW1zID0gKnBfcGFyYW1zOworICBwX3Nlc3Npb24tPmNsaWVudF9oZGwgPSBjbGllbnRfaGRsOworICBwX3Nlc3Npb24tPnNlc3Npb25JZCA9ICpwX3Nlc3Npb25faWQ7CisgIHBfc2Vzc2lvbi0+anBlZ19vYmogPSAodm9pZCopbXlfb2JqOyAvKiBzYXZlIGEgcHRyIHRvIGpwZWdfb2JqICovCisgIExPR0QoInNlc3Npb24gaWQgJXgiLCAqcF9zZXNzaW9uX2lkKTsKKworICByZXR1cm4gcmM7Cit9CisKKy8qKiBtbV9qcGVnZGVjX2Rlc3Ryb3lfc2Vzc2lvbjoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQG15X29iajoganBlZyBvYmplY3QKKyAqICAgIEBzZXNzaW9uX2lkOiBzZXNzaW9uIGluZGV4CisgKgorICogIFJldHVybjoKKyAqICAgICAgIDAgZm9yIHN1Y2Nlc3MgZWxzZSBmYWlsdXJlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgRGVzdHJveSB0aGUgZW5jb2Rpbmcgc2Vzc2lvbgorICoKKyAqKi8KK2ludDMyX3QgbW1fanBlZ2RlY19kZXN0cm95X3Nlc3Npb24obW1fanBlZ19vYmogKm15X29iaiwKKyAgbW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24pCit7CisgIGludDMyX3QgcmMgPSAwOworICBtbV9qcGVnX2pvYl9xX25vZGVfdCAqbm9kZSA9IE5VTEw7CisKKyAgaWYgKE5VTEwgPT0gcF9zZXNzaW9uKSB7CisgICAgTE9HRSgiaW52YWxpZCBzZXNzaW9uIik7CisgICAgcmV0dXJuIHJjOworICB9CisgIHVpbnQzMl90IHNlc3Npb25faWQgPSBwX3Nlc3Npb24tPnNlc3Npb25JZDsKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZteV9vYmotPmpvYl9sb2NrKTsKKworICAvKiBhYm9ydCBqb2IgaWYgaW4gdG9kbyBxdWV1ZSAqLworICBMT0dEKCJhYm9ydCB0b2RvIGpvYnMiKTsKKyAgbm9kZSA9IG1tX2pwZWdfcXVldWVfcmVtb3ZlX2pvYl9ieV9zZXNzaW9uX2lkKCZteV9vYmotPmpvYl9tZ3Iuam9iX3F1ZXVlLCBzZXNzaW9uX2lkKTsKKyAgd2hpbGUgKE5VTEwgIT0gbm9kZSkgeworICAgIGZyZWUobm9kZSk7CisgICAgbm9kZSA9IG1tX2pwZWdfcXVldWVfcmVtb3ZlX2pvYl9ieV9zZXNzaW9uX2lkKCZteV9vYmotPmpvYl9tZ3Iuam9iX3F1ZXVlLCBzZXNzaW9uX2lkKTsKKyAgfQorCisgIC8qIGFib3J0IGpvYiBpZiBpbiBvbmdvaW5nIHF1ZXVlICovCisgIExPR0QoImFib3J0IG9uZ29pbmcgam9icyIpOworICBub2RlID0gbW1fanBlZ19xdWV1ZV9yZW1vdmVfam9iX2J5X3Nlc3Npb25faWQoJm15X29iai0+b25nb2luZ19qb2JfcSwgc2Vzc2lvbl9pZCk7CisgIHdoaWxlIChOVUxMICE9IG5vZGUpIHsKKyAgICBmcmVlKG5vZGUpOworICAgIG5vZGUgPSBtbV9qcGVnX3F1ZXVlX3JlbW92ZV9qb2JfYnlfc2Vzc2lvbl9pZCgmbXlfb2JqLT5vbmdvaW5nX2pvYl9xLCBzZXNzaW9uX2lkKTsKKyAgfQorCisgIC8qIGFib3J0IHRoZSBjdXJyZW50IHNlc3Npb24gKi8KKyAgbW1fanBlZ19zZXNzaW9uX2Fib3J0KHBfc2Vzc2lvbik7CisgIG1tX2pwZWdkZWNfc2Vzc2lvbl9kZXN0cm95KHBfc2Vzc2lvbik7CisgIG1tX2pwZWdfcmVtb3ZlX3Nlc3Npb25faWR4KG15X29iaiwgc2Vzc2lvbl9pZCk7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZteV9vYmotPmpvYl9sb2NrKTsKKworICAvKiB3YWtlIHVwIGpvYk1nciB0aHJlYWQgdG8gd29yayBvbiBuZXcgam9iIGlmIHRoZXJlIGlzIGFueSAqLworICBjYW1fc2VtX3Bvc3QoJm15X29iai0+am9iX21nci5qb2Jfc2VtKTsKKyAgTE9HRCgiWCIpOworCisgIHJldHVybiByYzsKK30KKworLyoqIG1tX2pwZWdkZWNfZGVzdHJveV9zZXNzaW9uX2J5X2lkOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAbXlfb2JqOiBqcGVnIG9iamVjdAorICogICAgQHNlc3Npb25faWQ6IHNlc3Npb24gaW5kZXgKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBmb3Igc3VjY2VzcyBlbHNlIGZhaWx1cmUKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBEZXN0cm95IHRoZSBlbmNvZGluZyBzZXNzaW9uCisgKgorICoqLworaW50MzJfdCBtbV9qcGVnZGVjX2Rlc3Ryb3lfc2Vzc2lvbl9ieV9pZChtbV9qcGVnX29iaiAqbXlfb2JqLCB1aW50MzJfdCBzZXNzaW9uX2lkKQoreworICBpbnQzMl90IHJjID0gMDsKKyAgbW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24gPSBtbV9qcGVnX2dldF9zZXNzaW9uKG15X29iaiwgc2Vzc2lvbl9pZCk7CisKKyAgaWYgKE5VTEwgPT0gcF9zZXNzaW9uKSB7CisgICAgTE9HRSgic2Vzc2lvbiBpcyBub3QgdmFsaWQiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworICByZXR1cm4gbW1fanBlZ2RlY19kZXN0cm95X3Nlc3Npb24obXlfb2JqLCBwX3Nlc3Npb24pOworfQorCisKKworT01YX0VSUk9SVFlQRSBtbV9qcGVnZGVjX2ViZChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICBPTVhfUFRSIHBBcHBEYXRhLAorICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcikKK3sKKyAgbW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24gPSAobW1fanBlZ19qb2Jfc2Vzc2lvbl90ICopIHBBcHBEYXRhOworCisgIExPR0QoImNvdW50ICVkICIsIHBfc2Vzc2lvbi0+ZWJkX2NvdW50KTsKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZwX3Nlc3Npb24tPmxvY2spOworICBwX3Nlc3Npb24tPmViZF9jb3VudCsrOworICBwdGhyZWFkX211dGV4X3VubG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKyAgcmV0dXJuIDA7Cit9CisKK09NWF9FUlJPUlRZUEUgbW1fanBlZ2RlY19mYmQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgT01YX1BUUiBwQXBwRGF0YSwKKyAgT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpCit7CisgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgbW1fanBlZ19qb2Jfc2Vzc2lvbl90ICpwX3Nlc3Npb24gPSAobW1fanBlZ19qb2Jfc2Vzc2lvbl90ICopIHBBcHBEYXRhOworICBtbV9qcGVnX291dHB1dF90IG91dHB1dF9idWY7CisKKyAgTE9HRCgiY291bnQgJWQgIiwgcF9zZXNzaW9uLT5mYmRfY291bnQpOworCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKworICBpZiAoTU1fSlBFR19BQk9SVF9OT05FICE9IHBfc2Vzc2lvbi0+YWJvcnRfc3RhdGUpIHsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgcF9zZXNzaW9uLT5mYmRfY291bnQrKzsKKyAgaWYgKE5VTEwgIT0gcF9zZXNzaW9uLT5kZWNfcGFyYW1zLmpwZWdfY2IpIHsKKyAgICBwX3Nlc3Npb24tPmpvYl9zdGF0dXMgPSBKUEVHX0pPQl9TVEFUVVNfRE9ORTsKKyAgICBvdXRwdXRfYnVmLmJ1Zl9maWxsZWRfbGVuID0gKHVpbnQzMl90KXBCdWZmZXItPm5GaWxsZWRMZW47CisgICAgb3V0cHV0X2J1Zi5idWZfdmFkZHIgPSBwQnVmZmVyLT5wQnVmZmVyOworICAgIG91dHB1dF9idWYuZmQgPSAtMTsKKyAgICBMT0dEKCJzZW5kIGpwZWcgY2FsbGJhY2sgJWQiLAorICAgICAgcF9zZXNzaW9uLT5qb2Jfc3RhdHVzKTsKKyAgICBwX3Nlc3Npb24tPmRlY19wYXJhbXMuanBlZ19jYihwX3Nlc3Npb24tPmpvYl9zdGF0dXMsCisgICAgICBwX3Nlc3Npb24tPmNsaWVudF9oZGwsCisgICAgICBwX3Nlc3Npb24tPmpvYklkLAorICAgICAgJm91dHB1dF9idWYsCisgICAgICBwX3Nlc3Npb24tPmRlY19wYXJhbXMudXNlcmRhdGEpOworCisgICAgLyogcmVtb3ZlIGZyb20gcmVhZHkgcXVldWUgKi8KKyAgICBtbV9qcGVnZGVjX2pvYl9kb25lKHBfc2Vzc2lvbik7CisgIH0KKyAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgIExPR0QoIkV4aXQiKTsKKworICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIG1tX2pwZWdkZWNfZXZlbnRfaGFuZGxlcihPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICBPTVhfUFRSIHBBcHBEYXRhLAorICBPTVhfRVZFTlRUWVBFIGVFdmVudCwKKyAgT01YX1UzMiBuRGF0YTEsCisgIE9NWF9VMzIgbkRhdGEyLAorICBPTVhfUFRSIHBFdmVudERhdGEpCit7CisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uID0gKG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqKSBwQXBwRGF0YTsKKworICBMT0dEKCIlZCAlZCAlZCBzdGF0ZSAlZCIsIGVFdmVudCwgKGludCluRGF0YTEsCisgICAgKGludCluRGF0YTIsIHBfc2Vzc2lvbi0+YWJvcnRfc3RhdGUpOworCisgIExPR0QoIkFwcERhdGE9JXAgIiwgcEFwcERhdGEpOworCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcF9zZXNzaW9uLT5sb2NrKTsKKyAgcF9zZXNzaW9uLT5vbXhFdmVudCA9IGVFdmVudDsKKyAgaWYgKE1NX0pQRUdfQUJPUlRfSU5JVCA9PSBwX3Nlc3Npb24tPmFib3J0X3N0YXRlKSB7CisgICAgcF9zZXNzaW9uLT5hYm9ydF9zdGF0ZSA9IE1NX0pQRUdfQUJPUlRfRE9ORTsKKyAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZwX3Nlc3Npb24tPmNvbmQpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwX3Nlc3Npb24tPmxvY2spOworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICB9CisKKyAgaWYgKGVFdmVudCA9PSBPTVhfRXZlbnRFcnJvcikgeworICAgIGlmIChwX3Nlc3Npb24tPmVuY29kaW5nID09IE9NWF9UUlVFKSB7CisgICAgICBMT0dEKCJFcnJvciBkdXJpbmcgZW5jb2RpbmciKTsKKworICAgICAgLyogc2VuZCBqcGVnIGNhbGxiYWNrICovCisgICAgICBpZiAoTlVMTCAhPSBwX3Nlc3Npb24tPmRlY19wYXJhbXMuanBlZ19jYikgeworICAgICAgICBwX3Nlc3Npb24tPmpvYl9zdGF0dXMgPSBKUEVHX0pPQl9TVEFUVVNfRVJST1I7CisgICAgICAgIExPR0QoInNlbmQganBlZyBlcnJvciBjYWxsYmFjayAlZCIsCisgICAgICAgICAgcF9zZXNzaW9uLT5qb2Jfc3RhdHVzKTsKKyAgICAgICAgcF9zZXNzaW9uLT5kZWNfcGFyYW1zLmpwZWdfY2IocF9zZXNzaW9uLT5qb2Jfc3RhdHVzLAorICAgICAgICAgIHBfc2Vzc2lvbi0+Y2xpZW50X2hkbCwKKyAgICAgICAgICBwX3Nlc3Npb24tPmpvYklkLAorICAgICAgICAgIE5VTEwsCisgICAgICAgICAgcF9zZXNzaW9uLT5kZWNfcGFyYW1zLnVzZXJkYXRhKTsKKyAgICAgIH0KKworICAgICAgLyogcmVtb3ZlIGZyb20gcmVhZHkgcXVldWUgKi8KKyAgICAgIG1tX2pwZWdkZWNfam9iX2RvbmUocF9zZXNzaW9uKTsKKyAgICB9CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcF9zZXNzaW9uLT5jb25kKTsKKyAgfSBlbHNlIGlmIChlRXZlbnQgPT0gT01YX0V2ZW50Q21kQ29tcGxldGUpIHsKKyAgICBwX3Nlc3Npb24tPnN0YXRlX2NoYW5nZV9wZW5kaW5nID0gT01YX0ZBTFNFOworICAgIHBfc2Vzc2lvbi0+ZXZlbnRfcGVuZGluZyA9IE9NWF9GQUxTRTsKKyAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZwX3Nlc3Npb24tPmNvbmQpOworICB9ICBlbHNlIGlmIChlRXZlbnQgPT0gT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCkgeworICAgIHBfc2Vzc2lvbi0+ZXZlbnRfcGVuZGluZyA9IE9NWF9GQUxTRTsKKyAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZwX3Nlc3Npb24tPmNvbmQpOworICB9CisKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJnBfc2Vzc2lvbi0+bG9jayk7CisgIExPR0QoIkV4aXQiKTsKKyAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKKy8qKiBtbV9qcGVnZGVjX2Fib3J0X2pvYjoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQG15X29iajoganBlZyBvYmplY3QKKyAqICAgIEBjbGllbnRfaGRsOiBjbGllbnQgaGFuZGxlCisgKiAgICBAam9iSWQ6IGpvYiBpZAorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIGZvciBzdWNjZXNzIGVsc2UgZmFpbHVyZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIEFib3J0IHRoZSBlbmNvZGluZyBzZXNzaW9uCisgKgorICoqLworaW50MzJfdCBtbV9qcGVnZGVjX2Fib3J0X2pvYihtbV9qcGVnX29iaiAqbXlfb2JqLAorICB1aW50MzJfdCBqb2JJZCkKK3sKKyAgaW50MzJfdCByYyA9IC0xOworICBtbV9qcGVnX2pvYl9xX25vZGVfdCAqbm9kZSA9IE5VTEw7CisgIG1tX2pwZWdfam9iX3Nlc3Npb25fdCAqcF9zZXNzaW9uID0gTlVMTDsKKworICBMT0dEKCJFbnRlciIpOworICBwdGhyZWFkX211dGV4X2xvY2soJm15X29iai0+am9iX2xvY2spOworCisgIC8qIGFib3J0IGpvYiBpZiBpbiB0b2RvIHF1ZXVlICovCisgIG5vZGUgPSBtbV9qcGVnX3F1ZXVlX3JlbW92ZV9qb2JfYnlfam9iX2lkKCZteV9vYmotPmpvYl9tZ3Iuam9iX3F1ZXVlLCBqb2JJZCk7CisgIGlmIChOVUxMICE9IG5vZGUpIHsKKyAgICBmcmVlKG5vZGUpOworICAgIGdvdG8gYWJvcnRfZG9uZTsKKyAgfQorCisgIC8qIGFib3J0IGpvYiBpZiBpbiBvbmdvaW5nIHF1ZXVlICovCisgIG5vZGUgPSBtbV9qcGVnX3F1ZXVlX3JlbW92ZV9qb2JfYnlfam9iX2lkKCZteV9vYmotPm9uZ29pbmdfam9iX3EsIGpvYklkKTsKKyAgaWYgKE5VTEwgIT0gbm9kZSkgeworICAgIC8qIGZpbmQgam9iIHRoYXQgaXMgT01YIG9uZ29pbmcsIGFzayBPTVggdG8gYWJvcnQgdGhlIGpvYiAqLworICAgIHBfc2Vzc2lvbiA9IG1tX2pwZWdfZ2V0X3Nlc3Npb24obXlfb2JqLCBub2RlLT5kZWNfaW5mby5qb2JfaWQpOworICAgIGlmIChwX3Nlc3Npb24pIHsKKyAgICAgIG1tX2pwZWdfc2Vzc2lvbl9hYm9ydChwX3Nlc3Npb24pOworICAgIH0gZWxzZSB7CisgICAgICBMT0dFKCJJbnZhbGlkIGpvYiBpZCAweCV4IiwKKyAgICAgICAgbm9kZS0+ZGVjX2luZm8uam9iX2lkKTsKKyAgICB9CisgICAgZnJlZShub2RlKTsKKyAgICBnb3RvIGFib3J0X2RvbmU7CisgIH0KKworYWJvcnRfZG9uZToKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJm15X29iai0+am9iX2xvY2spOworCisgIHJldHVybiByYzsKK30KKy8qKiBtbV9qcGVnZGVjX2luaXQ6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBteV9vYmo6IGpwZWcgb2JqZWN0CisgKgorICogIFJldHVybjoKKyAqICAgICAgIDAgZm9yIHN1Y2Nlc3MgZWxzZSBmYWlsdXJlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgSW5pdGlhbGl6ZXMgdGhlIGpwZWcgY2xpZW50CisgKgorICoqLworaW50MzJfdCBtbV9qcGVnZGVjX2luaXQobW1fanBlZ19vYmogKm15X29iaikKK3sKKyAgaW50MzJfdCByYyA9IDA7CisKKyAgLyogaW5pdCBsb2NrcyAqLworICBwdGhyZWFkX211dGV4X2luaXQoJm15X29iai0+am9iX2xvY2ssIE5VTEwpOworCisgIC8qIGluaXQgb25nb2luZyBqb2IgcXVldWUgKi8KKyAgcmMgPSBtbV9qcGVnX3F1ZXVlX2luaXQoJm15X29iai0+b25nb2luZ19qb2JfcSk7CisgIGlmICgwICE9IHJjKSB7CisgICAgTE9HRSgiRXJyb3IiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvKiBpbml0IGpvYiBzZW1hcGhvcmUgYW5kIGxhdW5jaCBqb2JtZ3IgdGhyZWFkICovCisgIExPR0QoIkxhdW5jaCBqb2JtZ3IgdGhyZWFkIHJjICVkIiwgcmMpOworICByYyA9IG1tX2pwZWdfam9ibWdyX3RocmVhZF9sYXVuY2gobXlfb2JqKTsKKyAgaWYgKDAgIT0gcmMpIHsKKyAgICBMT0dFKCJFcnJvciIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIGxvYWQgT01YICovCisgIGlmIChPTVhfRXJyb3JOb25lICE9IE9NWF9Jbml0KCkpIHsKKyAgICAvKiByb2xsIGJhY2sgaW4gZXJyb3IgY2FzZSAqLworICAgIExPR0UoIk9NWF9Jbml0IGZhaWxlZCAoJWQpIiwgcmMpOworICAgIG1tX2pwZWdfam9ibWdyX3RocmVhZF9yZWxlYXNlKG15X29iaik7CisgICAgbW1fanBlZ19xdWV1ZV9kZWluaXQoJm15X29iai0+b25nb2luZ19qb2JfcSk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZteV9vYmotPmpvYl9sb2NrKTsKKyAgfQorCisgIHJldHVybiByYzsKK30KKworLyoqIG1tX2pwZWdkZWNfZGVpbml0OgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAbXlfb2JqOiBqcGVnIG9iamVjdAorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIGZvciBzdWNjZXNzIGVsc2UgZmFpbHVyZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIERlaW5pdHMgdGhlIGpwZWcgY2xpZW50CisgKgorICoqLworaW50MzJfdCBtbV9qcGVnZGVjX2RlaW5pdChtbV9qcGVnX29iaiAqbXlfb2JqKQoreworICBpbnQzMl90IHJjID0gMDsKKworICAvKiByZWxlYXNlIGpvYm1nciB0aHJlYWQgKi8KKyAgcmMgPSBtbV9qcGVnX2pvYm1ncl90aHJlYWRfcmVsZWFzZShteV9vYmopOworICBpZiAoMCAhPSByYykgeworICAgIExPR0UoIkVycm9yIik7CisgIH0KKworICAvKiB1bmxvYWQgT01YIGVuZ2luZSAqLworICBPTVhfRGVpbml0KCk7CisKKyAgLyogZGVpbml0IG9uZ29pbmcgam9iIGFuZCBjYiBxdWV1ZSAqLworICByYyA9IG1tX2pwZWdfcXVldWVfZGVpbml0KCZteV9vYmotPm9uZ29pbmdfam9iX3EpOworICBpZiAoMCAhPSByYykgeworICAgIExPR0UoIkVycm9yIik7CisgIH0KKworICAvKiBkZXN0cm95IGxvY2tzICovCisgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbXlfb2JqLT5qb2JfbG9jayk7CisKKyAgcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3NyYy9tbV9qcGVnZGVjX2ludGVyZmFjZS5jIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3NyYy9tbV9qcGVnZGVjX2ludGVyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjY1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2Uvc3JjL21tX2pwZWdkZWNfaW50ZXJmYWNlLmMKQEAgLTAsMCArMSwzMDEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworLy8gSlBFRyBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJtbV9qcGVnX2RiZy5oIgorI2luY2x1ZGUgIm1tX2pwZWdfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAibW1fanBlZy5oIgorCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdfZGVjX2ludGZfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKK3N0YXRpYyBtbV9qcGVnX29iaiogZ19qcGVnZGVjX29iaiA9IE5VTEw7CisKKy8qKiBtbV9qcGVnX2ludGZfc3RhcnRfam9iOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAY2xpZW50X2hkbDogY2xpZW50IGhhbmRsZQorICogICAgQGpvYjoganBlZyBqb2Igb2JqZWN0CisgKiAgICBAam9iSWQ6IGpvYiBpZAorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIHN1Y2Nlc3MsIGZhaWx1cmUgb3RoZXJ3aXNlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgc3RhcnQgdGhlIGpwZWcgam9iCisgKgorICoqLworc3RhdGljIGludDMyX3QgbW1fanBlZ2RlY19pbnRmX3N0YXJ0X2pvYihtbV9qcGVnX2pvYl90KiBqb2IsIHVpbnQzMl90KiBqb2JfaWQpCit7CisgIGludDMyX3QgcmMgPSAtMTsKKworICBpZiAoTlVMTCA9PSBqb2IgfHwKKyAgICBOVUxMID09IGpvYl9pZCkgeworICAgIExPR0UoImludmFsaWQgcGFyYW1ldGVycyBmb3Igam9iIG9yIGpvYklkIik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2RlY19pbnRmX2xvY2spOworICBpZiAoTlVMTCA9PSBnX2pwZWdkZWNfb2JqKSB7CisgICAgLyogbW1fanBlZyBvYmogbm90IGV4aXN0cywgcmV0dXJuIGVycm9yICovCisgICAgTE9HRSgibW1fanBlZyBpcyBub3Qgb3BlbmVkIHlldCIpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2RlY19pbnRmX2xvY2spOworICAgIHJldHVybiByYzsKKyAgfQorICByYyA9IG1tX2pwZWdkZWNfc3RhcnRfZGVjb2RlX2pvYihnX2pwZWdkZWNfb2JqLCBqb2IsIGpvYl9pZCk7CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2RlY19pbnRmX2xvY2spOworICByZXR1cm4gcmM7Cit9CisKKy8qKiBtbV9qcGVnX2ludGZfY3JlYXRlX3Nlc3Npb246CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBjbGllbnRfaGRsOiBjbGllbnQgaGFuZGxlCisgKiAgICBAcF9wYXJhbXM6IGVuY29kZSBwYXJhbWV0ZXJzCisgKiAgICBAcF9zZXNzaW9uX2lkOiBzZXNzaW9uIGlkCisgKgorICogIFJldHVybjoKKyAqICAgICAgIDAgc3VjY2VzcywgZmFpbHVyZSBvdGhlcndpc2UKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBDcmVhdGUgbmV3IGpwZWcgc2Vzc2lvbgorICoKKyAqKi8KK3N0YXRpYyBpbnQzMl90IG1tX2pwZWdkZWNfaW50Zl9jcmVhdGVfc2Vzc2lvbih1aW50MzJfdCBjbGllbnRfaGRsLAorICAgIG1tX2pwZWdfZGVjb2RlX3BhcmFtc190ICpwX3BhcmFtcywKKyAgICB1aW50MzJfdCAqcF9zZXNzaW9uX2lkKQoreworICBpbnQzMl90IHJjID0gLTE7CisKKyAgaWYgKDAgPT0gY2xpZW50X2hkbCB8fCBOVUxMID09IHBfcGFyYW1zIHx8IE5VTEwgPT0gcF9zZXNzaW9uX2lkKSB7CisgICAgTE9HRSgiaW52YWxpZCBjbGllbnRfaGRsIG9yIGpvYklkIik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2RlY19pbnRmX2xvY2spOworICBpZiAoTlVMTCA9PSBnX2pwZWdkZWNfb2JqKSB7CisgICAgLyogbW1fanBlZyBvYmogbm90IGV4aXN0cywgcmV0dXJuIGVycm9yICovCisgICAgTE9HRSgibW1fanBlZyBpcyBub3Qgb3BlbmVkIHlldCIpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2RlY19pbnRmX2xvY2spOworICAgIHJldHVybiByYzsKKyAgfQorCisgIHJjID0gbW1fanBlZ2RlY19jcmVhdGVfc2Vzc2lvbihnX2pwZWdkZWNfb2JqLCBjbGllbnRfaGRsLCBwX3BhcmFtcywgcF9zZXNzaW9uX2lkKTsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfZGVjX2ludGZfbG9jayk7CisgIHJldHVybiByYzsKK30KKworLyoqIG1tX2pwZWdfaW50Zl9kZXN0cm95X3Nlc3Npb246CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBzZXNzaW9uX2lkOiBzZXNzaW9uIGlkCisgKgorICogIFJldHVybjoKKyAqICAgICAgIDAgc3VjY2VzcywgZmFpbHVyZSBvdGhlcndpc2UKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBEZXN0cm95IGpwZWcgc2Vzc2lvbgorICoKKyAqKi8KK3N0YXRpYyBpbnQzMl90IG1tX2pwZWdkZWNfaW50Zl9kZXN0cm95X3Nlc3Npb24odWludDMyX3Qgc2Vzc2lvbl9pZCkKK3sKKyAgaW50MzJfdCByYyA9IC0xOworCisgIGlmICgwID09IHNlc3Npb25faWQpIHsKKyAgICBMT0dFKCJpbnZhbGlkIGNsaWVudF9oZGwgb3Igam9iSWQiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworICBwdGhyZWFkX211dGV4X2xvY2soJmdfZGVjX2ludGZfbG9jayk7CisgIGlmIChOVUxMID09IGdfanBlZ2RlY19vYmopIHsKKyAgICAvKiBtbV9qcGVnIG9iaiBub3QgZXhpc3RzLCByZXR1cm4gZXJyb3IgKi8KKyAgICBMT0dFKCJtbV9qcGVnIGlzIG5vdCBvcGVuZWQgeWV0Iik7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfZGVjX2ludGZfbG9jayk7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgcmMgPSBtbV9qcGVnZGVjX2Rlc3Ryb3lfc2Vzc2lvbl9ieV9pZChnX2pwZWdkZWNfb2JqLCBzZXNzaW9uX2lkKTsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfZGVjX2ludGZfbG9jayk7CisgIHJldHVybiByYzsKK30KKworLyoqIG1tX2pwZWdkZWNfaW50Zl9hYm9ydF9qb2I6CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBqb2JJZDogam9iIGlkCisgKgorICogIFJldHVybjoKKyAqICAgICAgIDAgc3VjY2VzcywgZmFpbHVyZSBvdGhlcndpc2UKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBBYm9ydCB0aGUganBlZyBqb2IKKyAqCisgKiovCitzdGF0aWMgaW50MzJfdCBtbV9qcGVnZGVjX2ludGZfYWJvcnRfam9iKHVpbnQzMl90IGpvYl9pZCkKK3sKKyAgaW50MzJfdCByYyA9IC0xOworCisgIGlmICgwID09IGpvYl9pZCkgeworICAgIExPR0UoImludmFsaWQgam9iSWQiKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworICBwdGhyZWFkX211dGV4X2xvY2soJmdfZGVjX2ludGZfbG9jayk7CisgIGlmIChOVUxMID09IGdfanBlZ2RlY19vYmopIHsKKyAgICAvKiBtbV9qcGVnIG9iaiBub3QgZXhpc3RzLCByZXR1cm4gZXJyb3IgKi8KKyAgICBMT0dFKCJtbV9qcGVnIGlzIG5vdCBvcGVuZWQgeWV0Iik7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfZGVjX2ludGZfbG9jayk7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgcmMgPSBtbV9qcGVnZGVjX2Fib3J0X2pvYihnX2pwZWdkZWNfb2JqLCBqb2JfaWQpOworICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19kZWNfaW50Zl9sb2NrKTsKKyAgcmV0dXJuIHJjOworfQorCisvKiogbW1fanBlZ19pbnRmX2Nsb3NlOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAY2xpZW50X2hkbDogY2xpZW50IGhhbmRsZQorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIHN1Y2Nlc3MsIGZhaWx1cmUgb3RoZXJ3aXNlCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgQ2xvc2UgdGhlIGpwZWcgam9iCisgKgorICoqLworc3RhdGljIGludDMyX3QgbW1fanBlZ2RlY19pbnRmX2Nsb3NlKHVpbnQzMl90IGNsaWVudF9oZGwpCit7CisgIGludDMyX3QgcmMgPSAtMTsKKworICBpZiAoMCA9PSBjbGllbnRfaGRsKSB7CisgICAgTE9HRSgiaW52YWxpZCBjbGllbnRfaGRsIik7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2RlY19pbnRmX2xvY2spOworICBpZiAoTlVMTCA9PSBnX2pwZWdkZWNfb2JqKSB7CisgICAgLyogbW1fanBlZyBvYmogbm90IGV4aXN0cywgcmV0dXJuIGVycm9yICovCisgICAgTE9HRSgibW1fanBlZyBpcyBub3Qgb3BlbmVkIHlldCIpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2RlY19pbnRmX2xvY2spOworICAgIHJldHVybiByYzsKKyAgfQorCisgIHJjID0gbW1fanBlZ19jbG9zZShnX2pwZWdkZWNfb2JqLCBjbGllbnRfaGRsKTsKKyAgZ19qcGVnZGVjX29iai0+bnVtX2NsaWVudHMtLTsKKyAgaWYoMCA9PSByYykgeworICAgIGlmICgwID09IGdfanBlZ2RlY19vYmotPm51bV9jbGllbnRzKSB7CisgICAgICAvKiBObyBjbGllbnQsIGNsb3NlIGpwZWcgaW50ZXJuYWxseSAqLworICAgICAgcmMgPSBtbV9qcGVnZGVjX2RlaW5pdChnX2pwZWdkZWNfb2JqKTsKKyAgICAgIGZyZWUoZ19qcGVnZGVjX29iaik7CisgICAgICBnX2pwZWdkZWNfb2JqID0gTlVMTDsKKyAgICB9CisgIH0KKworICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19kZWNfaW50Zl9sb2NrKTsKKyAgcmV0dXJuIHJjOworfQorCisKKworLyoqIGpwZWdkZWNfb3BlbjoKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQG9wczogb3BzIHRhYmxlIHBvaW50ZXIKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBmYWlsdXJlLCBzdWNjZXNzIG90aGVyd2lzZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgICAgIE9wZW4gYSBqcGVnIGNsaWVudAorICoKKyAqKi8KK3VpbnQzMl90IGpwZWdkZWNfb3BlbihtbV9qcGVnZGVjX29wc190ICpvcHMpCit7CisgIGludDMyX3QgcmMgPSAwOworICB1aW50MzJfdCBjbG50X2hkbCA9IDA7CisgIG1tX2pwZWdfb2JqKiBqcGVnX29iaiA9IE5VTEw7CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZnX2RlY19pbnRmX2xvY2spOworICAvKiBmaXJzdCB0aW1lIG9wZW4gKi8KKyAgaWYoTlVMTCA9PSBnX2pwZWdkZWNfb2JqKSB7CisgICAganBlZ19vYmogPSAobW1fanBlZ19vYmogKiltYWxsb2Moc2l6ZW9mKG1tX2pwZWdfb2JqKSk7CisgICAgaWYoTlVMTCA9PSBqcGVnX29iaikgeworICAgICAgTE9HRSgibm8gbWVtIik7CisgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19kZWNfaW50Zl9sb2NrKTsKKyAgICAgIHJldHVybiBjbG50X2hkbDsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIGpwZWcgb2JqICovCisgICAgbWVtc2V0KGpwZWdfb2JqLCAwLCBzaXplb2YobW1fanBlZ19vYmopKTsKKyAgICByYyA9IG1tX2pwZWdkZWNfaW5pdChqcGVnX29iaik7CisgICAgaWYoMCAhPSByYykgeworICAgICAgTE9HRSgibW1fanBlZ19pbml0IGVyciA9ICVkIiwgcmMpOworICAgICAgZnJlZShqcGVnX29iaik7CisgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19kZWNfaW50Zl9sb2NrKTsKKyAgICAgIHJldHVybiBjbG50X2hkbDsKKyAgICB9CisKKyAgICAvKiByZW1lbWJlciBpbiBnbG9iYWwgdmFyaWFibGUgKi8KKyAgICBnX2pwZWdkZWNfb2JqID0ganBlZ19vYmo7CisgIH0KKworICAvKiBvcGVuIG5ldyBjbGllbnQgKi8KKyAgY2xudF9oZGwgPSBtbV9qcGVnX25ld19jbGllbnQoZ19qcGVnZGVjX29iaik7CisgIGlmIChjbG50X2hkbCA+IDApIHsKKyAgICAvKiB2YWxpZCBjbGllbnQgKi8KKyAgICBpZiAoTlVMTCAhPSBvcHMpIHsKKyAgICAgIC8qIGZpbGwgaW4gb3BzIHRibCBpZiBwdHIgbm90IE5VTEwgKi8KKyAgICAgIG9wcy0+c3RhcnRfam9iID0gbW1fanBlZ2RlY19pbnRmX3N0YXJ0X2pvYjsKKyAgICAgIG9wcy0+YWJvcnRfam9iID0gbW1fanBlZ2RlY19pbnRmX2Fib3J0X2pvYjsKKyAgICAgIG9wcy0+Y3JlYXRlX3Nlc3Npb24gPSBtbV9qcGVnZGVjX2ludGZfY3JlYXRlX3Nlc3Npb247CisgICAgICBvcHMtPmRlc3Ryb3lfc2Vzc2lvbiA9IG1tX2pwZWdkZWNfaW50Zl9kZXN0cm95X3Nlc3Npb247CisgICAgICBvcHMtPmNsb3NlID0gbW1fanBlZ2RlY19pbnRmX2Nsb3NlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBmYWlsZWQgbmV3IGNsaWVudCAqLworICAgIExPR0UoIm1tX2pwZWdfbmV3X2NsaWVudCBmYWlsZWQiKTsKKworICAgIGlmICgwID09IGdfanBlZ2RlY19vYmotPm51bV9jbGllbnRzKSB7CisgICAgICAvKiBubyBjbGllbnQsIGNsb3NlIGpwZWcgKi8KKyAgICAgIG1tX2pwZWdkZWNfZGVpbml0KGdfanBlZ2RlY19vYmopOworICAgICAgZnJlZShnX2pwZWdkZWNfb2JqKTsKKyAgICAgIGdfanBlZ2RlY19vYmogPSBOVUxMOworICAgIH0KKyAgfQorCisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX2RlY19pbnRmX2xvY2spOworICByZXR1cm4gY2xudF9oZGw7Cit9CisKKworCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2UvdGVzdC9BbmRyb2lkLm1rIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3Rlc3QvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTVjMTU4Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3Rlc3QvQW5kcm9pZC5tawpAQCAtMCwwICsxLDg3IEBACisjZW5jb2RlciBpbnQgdGVzdAorT0xEX0xPQ0FMX1BBVEggOj0gJChMT0NBTF9QQVRIKQorTU1fSlBFR19URVNUX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKExPQ0FMX1BBVEgpLy4uLy4uL2NvbW1vbi5taworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9QQVRIIDo9ICQoTU1fSlBFR19URVNUX1BBVEgpCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9DRkxBR1MgOj0gLURDQU1FUkFfSU9OX0hFQVBfSUQ9SU9OX0lPTU1VX0hFQVBfSUQKK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IgLVduby11bnVzZWQtcGFyYW1ldGVyCitMT0NBTF9DRkxBR1MgKz0gLURfQU5EUk9JRF8KKworaWZlcSAoJChzdHJpcCAkKFRBUkdFVF9VU0VTX0lPTikpLHRydWUpCitMT0NBTF9DRkxBR1MgKz0gLURVU0VfSU9OCitlbmRpZgorCisjIFN5c3RlbSBoZWFkZXIgZmlsZSBwYXRoIHByZWZpeAorTE9DQUxfQ0ZMQUdTICs9IC1EU1lTVEVNX0hFQURFUl9QUkVGSVg9c3lzCisKK09NWF9IRUFERVJfRElSIDo9IGZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAorT01YX0NPUkVfRElSIDo9ICQoTU1fSlBFR19URVNUX1BBVEgpLy4uLy4uLy4uLy4uL21tLWltYWdlLWNvZGVjCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChNTV9KUEVHX1RFU1RfUEFUSCkKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChNTV9KUEVHX1RFU1RfUEFUSCkvLi4vaW5jCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTU1fSlBFR19URVNUX1BBVEgpLy4uLy4uL2NvbW1vbgorTE9DQUxfQ19JTkNMVURFUyArPSAkKE1NX0pQRUdfVEVTVF9QQVRIKS8uLi8uLi9tbS1jYW1lcmEtaW50ZXJmYWNlL2luYworTE9DQUxfQ19JTkNMVURFUyArPSAkKE9NWF9IRUFERVJfRElSKQorTE9DQUxfQ19JTkNMVURFUyArPSAkKE9NWF9DT1JFX0RJUikvcWV4aWYKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChPTVhfQ09SRV9ESVIpL3FvbXhfY29yZQorCitMT0NBTF9DX0lOQ0xVREVTKz0gJChrZXJuZWxfaW5jbHVkZXMpCitMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKGNvbW1vbl9kZXBzKQorCitMT0NBTF9TUkNfRklMRVMgOj0gbW1fanBlZ190ZXN0LmMKKworTE9DQUxfMzJfQklUX09OTFkgOj0gJChCT0FSRF9RVElfQ0FNRVJBXzMyQklUX09OTFkpCitMT0NBTF9NT0RVTEUgICAgICAgICAgIDo9IG1tLWpwZWctaW50ZXJmYWNlLXRlc3QKK0xPQ0FMX1BSRUxJTktfTU9EVUxFICAgOj0gZmFsc2UKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYmRsIGxpYm1tanBlZ19pbnRlcmZhY2UKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKworCisjZGVjb2RlciBpbnQgdGVzdAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1BBVEggOj0gJChNTV9KUEVHX1RFU1RfUEFUSCkKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NGTEFHUyA6PSAtRENBTUVSQV9JT05fSEVBUF9JRD1JT05fSU9NTVVfSEVBUF9JRAorTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKKworTE9DQUxfQ0ZMQUdTICs9IC1EX0FORFJPSURfCisKK2lmZXEgKCQoc3RyaXAgJChUQVJHRVRfVVNFU19JT04pKSx0cnVlKQorTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0lPTgorZW5kaWYKKworIyBTeXN0ZW0gaGVhZGVyIGZpbGUgcGF0aCBwcmVmaXgKK0xPQ0FMX0NGTEFHUyArPSAtRFNZU1RFTV9IRUFERVJfUFJFRklYPXN5cworCitPTVhfSEVBREVSX0RJUiA6PSBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKK09NWF9DT1JFX0RJUiA6PSAkKE1NX0pQRUdfVEVTVF9QQVRIKS8uLi8uLi8uLi8uLi9tbS1pbWFnZS1jb2RlYworCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTU1fSlBFR19URVNUX1BBVEgpCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTU1fSlBFR19URVNUX1BBVEgpLy4uL2luYworTE9DQUxfQ19JTkNMVURFUyArPSAkKE1NX0pQRUdfVEVTVF9QQVRIKS8uLi8uLi9jb21tb24KK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChNTV9KUEVHX1RFU1RfUEFUSCkvLi4vLi4vbW0tY2FtZXJhLWludGVyZmFjZS9pbmMKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChPTVhfSEVBREVSX0RJUikKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChPTVhfQ09SRV9ESVIpL3FleGlmCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoT01YX0NPUkVfRElSKS9xb214X2NvcmUKKworTE9DQUxfQ19JTkNMVURFUys9ICQoa2VybmVsX2luY2x1ZGVzKQorTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChjb21tb25fZGVwcykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IG1tX2pwZWdkZWNfdGVzdC5jCisKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9ICQoQk9BUkRfUVRJX0NBTUVSQV8zMkJJVF9PTkxZKQorTE9DQUxfTU9EVUxFICAgICAgICAgICA6PSBtbS1qcGVnZGVjLWludGVyZmFjZS10ZXN0CitMT0NBTF9QUkVMSU5LX01PRFVMRSAgIDo9IGZhbHNlCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJkbCBsaWJtbWpwZWdfaW50ZXJmYWNlCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCitMT0NBTF9QQVRIIDo9ICQoT0xEX0xPQ0FMX1BBVEgpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3Rlc3QvbW1fanBlZ190ZXN0LmMgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tanBlZy1pbnRlcmZhY2UvdGVzdC9tbV9qcGVnX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWRkYWZjCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3Rlc3QvbW1fanBlZ190ZXN0LmMKQEAgLTAsMCArMSw3NzYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMy0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgVElNRV9IIDxTWVNURU1fSEVBREVSX1BSRUZJWC90aW1lLmg+CisjaW5jbHVkZSBUSU1FX0gKKworLy8gSlBFRyBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJtbV9qcGVnX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgIm1tX2pwZWdfaW9uYnVmLmgiCisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJtbV9jYW1lcmFfZGJnLmgiCisKKyNkZWZpbmUgTUFYX05VTV9CVUZTICgxMikKKyNkZWZpbmUgTUFYX05VTV9DTElFTlQgKDgpCisKKy8qKiBEVU1QX1RPX0ZJTEU6CisgKiAgQGZpbGVuYW1lOiBmaWxlIG5hbWUKKyAqICBAcF9hZGRyOiBhZGRyZXNzIG9mIHRoZSBidWZmZXIKKyAqICBAbGVuOiBidWZmZXIgbGVuZ3RoCisgKgorICogIGR1bXAgdGhlIGltYWdlIHRvIHRoZSBmaWxlCisgKiovCisjZGVmaW5lIERVTVBfVE9fRklMRShmaWxlbmFtZSwgcF9hZGRyLCBsZW4pICh7IFwKKyAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZSwgIncrIik7IFwKKyAgaWYgKGZwKSB7IFwKKyAgICBmd3JpdGUocF9hZGRyLCAxLCBsZW4sIGZwKTsgXAorICAgIGZjbG9zZShmcCk7IFwKKyAgfSBlbHNlIHsgXAorICAgIExPR0UoImNhbm5vdCBkdW1wIGltYWdlIik7IFwKKyAgfSBcCit9KQorCitzdGF0aWMgdWludDMyX3QgZ19jb3VudCA9IDFVLCBnX2k7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgbW1fanBlZ19jb2xvcl9mb3JtYXQgZm10OworICBjYW1fcmF0aW9uYWxfdHlwZV90IG11bHQ7CisgIGNvbnN0IGNoYXIgKnN0cjsKK30gbW1fanBlZ19pbnRmX3Rlc3RfY29sZm10X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciAqZmlsZW5hbWU7CisgIGludCB3aWR0aDsKKyAgaW50IGhlaWdodDsKKyAgY2hhciAqb3V0X2ZpbGVuYW1lOworICB1aW50MzJfdCBidXJzdF9tb2RlOworICB1aW50MzJfdCBtaW5fb3V0X2J1ZnM7CisgIG1tX2pwZWdfaW50Zl90ZXN0X2NvbGZtdF90IGNvbF9mbXQ7CisgIHVpbnQzMl90IGVuY29kZV90aHVtYm5haWw7CisgIGludCB0bWJfd2lkdGg7CisgIGludCB0bWJfaGVpZ2h0OworICBpbnQgbWFpbl9xdWFsaXR5OworICBpbnQgdGh1bWJfcXVhbGl0eTsKKyAgY2hhciAqcXRhYmxlX2x1bWFfZmlsZTsKKyAgY2hhciAqcXRhYmxlX2Nocm9tYV9maWxlOworICBpbnQgY2xpZW50X2NudDsKK30ganBlZ190ZXN0X2lucHV0X3Q7CisKKy8qIFN0YXRpYyBjb25zdGFudHMgKi8KKy8qICBkZWZhdWx0IEx1bWEgUXRhYmxlICovCit1aW50OF90IERFRkFVTFRfUVRBQkxFXzBbUVVBTlRfU0laRV0gPSB7CisgIDE2LCAxMSwgMTAsIDE2LCAyNCwgNDAsIDUxLCA2MSwKKyAgMTIsIDEyLCAxNCwgMTksIDI2LCA1OCwgNjAsIDU1LAorICAxNCwgMTMsIDE2LCAyNCwgNDAsIDU3LCA2OSwgNTYsCisgIDE0LCAxNywgMjIsIDI5LCA1MSwgODcsIDgwLCA2MiwKKyAgMTgsIDIyLCAzNywgNTYsIDY4LCAxMDksIDEwMywgNzcsCisgIDI0LCAzNSwgNTUsIDY0LCA4MSwgMTA0LCAxMTMsIDkyLAorICA0OSwgNjQsIDc4LCA4NywgMTAzLCAxMjEsIDEyMCwgMTAxLAorICA3MiwgOTIsIDk1LCA5OCwgMTEyLCAxMDAsIDEwMywgOTkKK307CisKKy8qICBkZWZhdWx0IENocm9tYSBRdGFibGUgKi8KK3VpbnQ4X3QgREVGQVVMVF9RVEFCTEVfMVtRVUFOVF9TSVpFXSA9IHsKKyAgMTcsIDE4LCAyNCwgNDcsIDk5LCA5OSwgOTksIDk5LAorICAxOCwgMjEsIDI2LCA2NiwgOTksIDk5LCA5OSwgOTksCisgIDI0LCAyNiwgNTYsIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgNDcsIDY2LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksCisgIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTkKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciAqZmlsZW5hbWVbTUFYX05VTV9CVUZTXTsKKyAgaW50IHdpZHRoOworICBpbnQgaGVpZ2h0OworICBjaGFyICpvdXRfZmlsZW5hbWVbTUFYX05VTV9CVUZTXTsKKyAgcHRocmVhZF9tdXRleF90IGxvY2s7CisgIHB0aHJlYWRfY29uZF90IGNvbmQ7CisgIHB0aHJlYWRfdCB0aHJlYWRfaWQ7CisgIGJ1ZmZlcl90IGlucHV0W01BWF9OVU1fQlVGU107CisgIGJ1ZmZlcl90IG91dHB1dFtNQVhfTlVNX0JVRlNdOworICBpbnQgdXNlX2lvbjsKKyAgdWludDMyX3QgaGFuZGxlOworICBtbV9qcGVnX29wc190IG9wczsKKyAgdWludDMyX3Qgam9iX2lkW01BWF9OVU1fQlVGU107CisgIG1tX2pwZWdfZW5jb2RlX3BhcmFtc190IHBhcmFtczsKKyAgbW1fanBlZ19qb2JfdCBqb2I7CisgIHVpbnQzMl90IHNlc3Npb25faWQ7CisgIHVpbnQzMl90IG51bV9idWZzOworICB1aW50MzJfdCBtaW5fb3V0X2J1ZnM7CisgIHNpemVfdCBidWZfZmlsbGVkX2xlbltNQVhfTlVNX0JVRlNdOworICBtbV9kaW1lbnNpb24gcGljX3NpemU7CisgIGludCByZXQ7CisgIGludCBjbGluZXRfaWQ7Cit9IG1tX2pwZWdfaW50Zl90ZXN0X3Q7CisKKworCitzdGF0aWMgY29uc3QgbW1fanBlZ19pbnRmX3Rlc3RfY29sZm10X3QgY29sb3JfZm9ybWF0c1tdID0KK3sKKyAgeyBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ1JDQkxQX0gyVjIsIHszLCAyfSwgIllDUkNCTFBfSDJWMiIgfSwKKyAgeyBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gyVjIsIHszLCAyfSwgIllDQkNSTFBfSDJWMiIgfSwKKyAgeyBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ1JDQkxQX0gyVjEsIHsyLCAxfSwgIllDUkNCTFBfSDJWMSIgfSwKKyAgeyBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gyVjEsIHsyLCAxfSwgIllDQkNSTFBfSDJWMSIgfSwKKyAgeyBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ1JDQkxQX0gxVjIsIHsyLCAxfSwgIllDUkNCTFBfSDFWMiIgfSwKKyAgeyBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gxVjIsIHsyLCAxfSwgIllDQkNSTFBfSDFWMiIgfSwKKyAgeyBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ1JDQkxQX0gxVjEsIHszLCAxfSwgIllDUkNCTFBfSDFWMSIgfSwKKyAgeyBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gxVjEsIHszLCAxfSwgIllDQkNSTFBfSDFWMSIgfQorfTsKKworc3RhdGljIGpwZWdfdGVzdF9pbnB1dF90IGpwZWdfaW5wdXRbXSA9IHsKKyAgeyBRQ0FNRVJBX0RVTVBfRlJNX0xPQ0FUSU9OInRlc3RfMS55dXYiLCA0MDAwLCAzMDA4LCBRQ0FNRVJBX0RVTVBfRlJNX0xPQ0FUSU9OInRlc3RfMS5qcGciLCAwLCAwLAorICAgIHsgTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNSQ0JMUF9IMlYyLCB7MywgMn0sICJZQ1JDQkxQX0gyVjIiIH0sCisgICAgICAwLCAzMjAsIDI0MCwgODAsIDgwLCBOVUxMLCBOVUxMLCAxfQorfTsKKworc3RhdGljIHZvaWQgbW1fanBlZ19lbmNvZGVfY2FsbGJhY2soanBlZ19qb2Jfc3RhdHVzX3Qgc3RhdHVzLAorICB1aW50MzJfdCBjbGllbnRfaGRsLAorICB1aW50MzJfdCBqb2JJZCwKKyAgbW1fanBlZ19vdXRwdXRfdCAqcF9vdXRwdXQsCisgIHZvaWQgKnVzZXJEYXRhKQoreworICBtbV9qcGVnX2ludGZfdGVzdF90ICpwX29iaiA9IChtbV9qcGVnX2ludGZfdGVzdF90ICopdXNlckRhdGE7CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZwX29iai0+bG9jayk7CisKKyAgaWYgKHN0YXR1cyA9PSBKUEVHX0pPQl9TVEFUVVNfRVJST1IpIHsKKyAgICBMT0dFKCJFbmNvZGUgZXJyb3IiKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChpID0gMDsgcF9vYmotPmpvYl9pZFtpXSAmJiAoam9iSWQgIT0gcF9vYmotPmpvYl9pZFtpXSk7IGkrKykKKyAgICAgIDsKKyAgICBpZiAoIXBfb2JqLT5qb2JfaWRbaV0pIHsKKyAgICAgIExPR0UoIkNhbm5vdCBmaW5kIGpvYiBJRCEhISIpOworICAgICAgZ290byBlcnJvcjsKKyAgICB9CisgICAgTE9HRSgiRW5jb2RlIHN1Y2Nlc3MgYWRkciAlcCBsZW4gJXp1IGlkeCAlZCIsCisgICAgICAgcF9vdXRwdXQtPmJ1Zl92YWRkciwgcF9vdXRwdXQtPmJ1Zl9maWxsZWRfbGVuLCBpKTsKKworICAgIHBfb2JqLT5idWZfZmlsbGVkX2xlbltpXSA9IHBfb3V0cHV0LT5idWZfZmlsbGVkX2xlbjsKKyAgICBpZiAocF9vYmotPm1pbl9vdXRfYnVmcykgeworICAgICAgTE9HRSgiU2F2aW5nIGZpbGUlcyBhZGRyICVwIGxlbiAlenUiLAorICAgICAgICAgICBwX29iai0+b3V0X2ZpbGVuYW1lW2ldLAorICAgICAgICAgIHBfb3V0cHV0LT5idWZfdmFkZHIsIHBfb3V0cHV0LT5idWZfZmlsbGVkX2xlbik7CisgICAgICBEVU1QX1RPX0ZJTEUocF9vYmotPm91dF9maWxlbmFtZVtpXSwgcF9vdXRwdXQtPmJ1Zl92YWRkciwKKyAgICAgICAgcF9vdXRwdXQtPmJ1Zl9maWxsZWRfbGVuKTsKKyAgICB9CisgIH0KKyAgZ19pKys7CisKK2Vycm9yOgorCisgIGlmIChnX2kgPj0gZ19jb3VudCkgeworICAgIExPR0UoIlNpZ25hbCB0aGUgdGhyZWFkIik7CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcF9vYmotPmNvbmQpOworICB9CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwX29iai0+bG9jayk7Cit9CisKK2ludCBtbV9qcGVnX3Rlc3RfYWxsb2MoYnVmZmVyX3QgKnBfYnVmZmVyLCBpbnQgdXNlX3BtZW0pCit7CisgIGludCByZXQgPSAwOworICAvKkFsbG9jYXRlIGJ1ZmZlcnMqLworICBpZiAodXNlX3BtZW0pIHsKKyAgICBwX2J1ZmZlci0+YWRkciA9ICh1aW50OF90ICopYnVmZmVyX2FsbG9jYXRlKHBfYnVmZmVyLCAwKTsKKyAgICBpZiAoTlVMTCA9PSBwX2J1ZmZlci0+YWRkcikgeworICAgICAgTE9HRSgiRXJyb3IiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogQWxsb2NhdGUgaGVhcCBtZW1vcnkgKi8KKyAgICBwX2J1ZmZlci0+YWRkciA9ICh1aW50OF90ICopbWFsbG9jKHBfYnVmZmVyLT5zaXplKTsKKyAgICBpZiAoTlVMTCA9PSBwX2J1ZmZlci0+YWRkcikgeworICAgICAgTE9HRSgiRXJyb3IiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBtbV9qcGVnX3Rlc3RfZnJlZShidWZmZXJfdCAqcF9idWZmZXIpCit7CisgIGlmIChwX2J1ZmZlci0+YWRkciA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAocF9idWZmZXItPnBfcG1lbV9mZCA+PSAwKQorICAgIGJ1ZmZlcl9kZWFsbG9jYXRlKHBfYnVmZmVyKTsKKyAgZWxzZQorICAgIGZyZWUocF9idWZmZXItPmFkZHIpOworCisgIG1lbXNldChwX2J1ZmZlciwgMHgwLCBzaXplb2YoYnVmZmVyX3QpKTsKK30KKworaW50IG1tX2pwZWdfdGVzdF9yZWFkKG1tX2pwZWdfaW50Zl90ZXN0X3QgKnBfb2JqLCB1aW50MzJfdCBpZHgpCit7CisgIEZJTEUgKmZwID0gTlVMTDsKKyAgc2l6ZV90IGZpbGVfc2l6ZSA9IDA7CisgIGZwID0gZm9wZW4ocF9vYmotPmZpbGVuYW1lW2lkeF0sICJyYiIpOworICBpZiAoIWZwKSB7CisgICAgTE9HRSgiZXJyb3IiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgZnNlZWsoZnAsIDAsIFNFRUtfRU5EKTsKKyAgZmlsZV9zaXplID0gKHNpemVfdClmdGVsbChmcCk7CisgIGZzZWVrKGZwLCAwLCBTRUVLX1NFVCk7CisgIExPR0UoImlucHV0IGZpbGUgc2l6ZSBpcyAlenUgYnVmX3NpemUgJXp1IiwKKyAgICAgZmlsZV9zaXplLCBwX29iai0+aW5wdXRbaWR4XS5zaXplKTsKKworICBpZiAocF9vYmotPmlucHV0W2lkeF0uc2l6ZSA+IGZpbGVfc2l6ZSkgeworICAgIExPR0UoImVycm9yIik7CisgICAgZmNsb3NlKGZwKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgZnJlYWQocF9vYmotPmlucHV0W2lkeF0uYWRkciwgMSwgcF9vYmotPmlucHV0W2lkeF0uc2l6ZSwgZnApOworICBmY2xvc2UoZnApOworICByZXR1cm4gMDsKK30KKworLyoqIG1tX2pwZWdfdGVzdF9yZWFkX3F0YWJsZToKKyAqCisgKiAgQXJndW1lbnRzOgorICogICAgQGZpbGVuYW1lOiBRdGFibGUgZmlsZW5hbWUKKyAqICAgIEBjaHJvbWFfZmxhZzogRmxhZyBpbmRpY2F0aW5nIGNocm9tYSBxdGFibGUKKyAqCisgKiAgUmV0dXJuOgorICogICAgMCBzdWNjZXNzLCBmYWlsdXJlIG90aGVyd2lzZQorICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIFJlYWRzIHF0YWJsZSBmcm9tIGZpbGUgYW5kIHNldHMgaXQgaW4gYXBwcm9wcmlhdGUgcXRhYmxlCisgKiAgICBiYXNlZCBvbiBmbGFnLgorICoqLworaW50IG1tX2pwZWdfdGVzdF9yZWFkX3F0YWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgYm9vbCBjaHJvbWFfZmxhZykKK3sKKyAgRklMRSAqZnAgPSBOVUxMOworICBpbnQgaTsKKworICBpZiAoZmlsZW5hbWUgPT0gTlVMTCkKKyAgICByZXR1cm4gMDsKKworICBmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworICBpZiAoIWZwKSB7CisgICAgTE9HRSgiZXJyb3IgY2Fubm90IG9wZW4gZmlsZSIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmIChjaHJvbWFfZmxhZykgeworICAgIGZvciAoaSA9IDA7IGkgPCBRVUFOVF9TSVpFOyBpKyspCisgICAgICBmc2NhbmYoZnAsICIlaGh1LCIsICZERUZBVUxUX1FUQUJMRV8xW2ldKTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUVVBTlRfU0laRTsgaSsrKQorICAgICAgZnNjYW5mKGZwLCAiJWhodSwiLCAmREVGQVVMVF9RVEFCTEVfMFtpXSk7CisgIH0KKworICBmY2xvc2UoZnApOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfaW5pdChqcGVnX3Rlc3RfaW5wdXRfdCAqcF9pbnB1dCwgbW1fanBlZ19pbnRmX3Rlc3RfdCAqcF9vYmosCisgIGludCBjbGllbnRfaWQpCit7CisgIGludCByYyA9IC0xOworICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpKHBfaW5wdXQtPndpZHRoICogcF9pbnB1dC0+aGVpZ2h0KTsKKyAgbW1fanBlZ19lbmNvZGVfcGFyYW1zX3QgKnBfcGFyYW1zID0gJnBfb2JqLT5wYXJhbXM7CisgIG1tX2pwZWdfZW5jb2RlX2pvYl90ICpwX2pvYl9wYXJhbXMgPSAmcF9vYmotPmpvYi5lbmNvZGVfam9iOworICB1aW50MzJfdCBpID0gMDsKKyAgdWludDMyX3QgYnVyc3RfbW9kZSA9IHBfaW5wdXQtPmJ1cnN0X21vZGU7CisgIGpwZWdfdGVzdF9pbnB1dF90ICpwX2luID0gcF9pbnB1dDsKKworICBkbyB7CisgICAgcF9vYmotPmZpbGVuYW1lW2ldID0gcF9pbi0+ZmlsZW5hbWU7CisgICAgcF9vYmotPndpZHRoID0gcF9pbnB1dC0+d2lkdGg7CisgICAgcF9vYmotPmhlaWdodCA9IHBfaW5wdXQtPmhlaWdodDsKKyAgICBwX29iai0+b3V0X2ZpbGVuYW1lW2ldID0gcF9pbi0+b3V0X2ZpbGVuYW1lOworICAgIHBfb2JqLT51c2VfaW9uID0gMTsKKyAgICBwX29iai0+bWluX291dF9idWZzID0gcF9pbnB1dC0+bWluX291dF9idWZzOworCisgICAgLyogYWxsb2NhdGUgYnVmZmVycyAqLworICAgIHBfb2JqLT5pbnB1dFtpXS5zaXplID0gc2l6ZSAqIChzaXplX3QpcF9pbnB1dC0+Y29sX2ZtdC5tdWx0Lm51bWVyYXRvciAvCisgICAgICAgIChzaXplX3QpcF9pbnB1dC0+Y29sX2ZtdC5tdWx0LmRlbm9taW5hdG9yOworICAgIHJjID0gbW1fanBlZ190ZXN0X2FsbG9jKCZwX29iai0+aW5wdXRbaV0sIHBfb2JqLT51c2VfaW9uKTsKKyAgICBpZiAocmMpIHsKKyAgICAgIExPR0UoIkVycm9yIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisKKyAgICByYyA9IG1tX2pwZWdfdGVzdF9yZWFkKHBfb2JqLCBpKTsKKyAgICBpZiAocmMpIHsKKyAgICAgIExPR0UoIkVycm9yLCB1bmFibGUgdG8gcmVhZCBpbnB1dCBpbWFnZSIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1tX2pwZWdfdGVzdF9yZWFkX3F0YWJsZShwX2lucHV0LT5xdGFibGVfbHVtYV9maWxlLCBmYWxzZSk7CisgICAgaWYgKHJjKSB7CisgICAgICBMT0dFKCJFcnJvciwgdW5hYmxlIHRvIHJlYWQgbHVtYSBxdGFibGUiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtbV9qcGVnX3Rlc3RfcmVhZF9xdGFibGUocF9pbnB1dC0+cXRhYmxlX2Nocm9tYV9maWxlLCB0cnVlKTsKKyAgICBpZiAocmMpIHsKKyAgICAgIExPR0UoIkVycm9yLCB1bmFibGUgdG8gcmVhZCBjaHJvbWUgcXRhYmxlIik7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogc3JjIGJ1ZmZlciBjb25maWcqLworICAgIHBfcGFyYW1zLT5zcmNfbWFpbl9idWZbaV0uYnVmX3NpemUgPSBwX29iai0+aW5wdXRbaV0uc2l6ZTsKKyAgICBwX3BhcmFtcy0+c3JjX21haW5fYnVmW2ldLmJ1Zl92YWRkciA9IHBfb2JqLT5pbnB1dFtpXS5hZGRyOworICAgIHBfcGFyYW1zLT5zcmNfbWFpbl9idWZbaV0uZmQgPSBwX29iai0+aW5wdXRbaV0ucF9wbWVtX2ZkOworICAgIHBfcGFyYW1zLT5zcmNfbWFpbl9idWZbaV0uaW5kZXggPSBpOworICAgIHBfcGFyYW1zLT5zcmNfbWFpbl9idWZbaV0uZm9ybWF0ID0gTU1fSlBFR19GTVRfWVVWOworICAgIHBfcGFyYW1zLT5zcmNfbWFpbl9idWZbaV0ub2Zmc2V0Lm1wWzBdLmxlbiA9ICh1aW50MzJfdClzaXplOworICAgIHBfcGFyYW1zLT5zcmNfbWFpbl9idWZbaV0ub2Zmc2V0Lm1wWzBdLnN0cmlkZSA9IHBfaW5wdXQtPndpZHRoOworICAgIHBfcGFyYW1zLT5zcmNfbWFpbl9idWZbaV0ub2Zmc2V0Lm1wWzBdLnNjYW5saW5lID0gcF9pbnB1dC0+aGVpZ2h0OworICAgIHBfcGFyYW1zLT5zcmNfbWFpbl9idWZbaV0ub2Zmc2V0Lm1wWzFdLmxlbiA9ICh1aW50MzJfdCkoc2l6ZSA+PiAxKTsKKworICAgIC8qIHNyYyBidWZmZXIgY29uZmlnKi8KKyAgICBwX3BhcmFtcy0+c3JjX3RodW1iX2J1ZltpXS5idWZfc2l6ZSA9IHBfb2JqLT5pbnB1dFtpXS5zaXplOworICAgIHBfcGFyYW1zLT5zcmNfdGh1bWJfYnVmW2ldLmJ1Zl92YWRkciA9IHBfb2JqLT5pbnB1dFtpXS5hZGRyOworICAgIHBfcGFyYW1zLT5zcmNfdGh1bWJfYnVmW2ldLmZkID0gcF9vYmotPmlucHV0W2ldLnBfcG1lbV9mZDsKKyAgICBwX3BhcmFtcy0+c3JjX3RodW1iX2J1ZltpXS5pbmRleCA9IGk7CisgICAgcF9wYXJhbXMtPnNyY190aHVtYl9idWZbaV0uZm9ybWF0ID0gTU1fSlBFR19GTVRfWVVWOworICAgIHBfcGFyYW1zLT5zcmNfdGh1bWJfYnVmW2ldLm9mZnNldC5tcFswXS5sZW4gPSAodWludDMyX3Qpc2l6ZTsKKyAgICBwX3BhcmFtcy0+c3JjX3RodW1iX2J1ZltpXS5vZmZzZXQubXBbMF0uc3RyaWRlID0gcF9pbnB1dC0+d2lkdGg7CisgICAgcF9wYXJhbXMtPnNyY190aHVtYl9idWZbaV0ub2Zmc2V0Lm1wWzBdLnNjYW5saW5lID0gcF9pbnB1dC0+aGVpZ2h0OworICAgIHBfcGFyYW1zLT5zcmNfdGh1bWJfYnVmW2ldLm9mZnNldC5tcFsxXS5sZW4gPSAodWludDMyX3QpKHNpemUgPj4gMSk7CisKKworICAgIGkrKzsKKyAgfSB3aGlsZSgoKytwX2luKS0+ZmlsZW5hbWUpOworCisgIHBfb2JqLT5udW1fYnVmcyA9IGk7CisKKyAgcHRocmVhZF9tdXRleF9pbml0KCZwX29iai0+bG9jaywgTlVMTCk7CisgIHB0aHJlYWRfY29uZF9pbml0KCZwX29iai0+Y29uZCwgTlVMTCk7CisKKworICAvKiBzZXQgZW5jb2RlIHBhcmFtZXRlcnMgKi8KKyAgcF9wYXJhbXMtPmpwZWdfY2IgPSBtbV9qcGVnX2VuY29kZV9jYWxsYmFjazsKKyAgcF9wYXJhbXMtPnVzZXJkYXRhID0gcF9vYmo7CisgIHBfcGFyYW1zLT5jb2xvcl9mb3JtYXQgPSBwX2lucHV0LT5jb2xfZm10LmZtdDsKKyAgcF9wYXJhbXMtPnRodW1iX2NvbG9yX2Zvcm1hdCA9IHBfaW5wdXQtPmNvbF9mbXQuZm10OworCisgIGlmIChwX29iai0+bWluX291dF9idWZzKSB7CisgICAgcF9wYXJhbXMtPm51bV9kc3RfYnVmcyA9IDI7CisgIH0gZWxzZSB7CisgICAgcF9wYXJhbXMtPm51bV9kc3RfYnVmcyA9IHBfb2JqLT5udW1fYnVmczsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCAodWludDMyX3QpcF9wYXJhbXMtPm51bV9kc3RfYnVmczsgaSsrKSB7CisgICAgcF9vYmotPm91dHB1dFtpXS5zaXplID0gc2l6ZSAqIDMvMjsKKyAgICByYyA9IG1tX2pwZWdfdGVzdF9hbGxvYygmcF9vYmotPm91dHB1dFtpXSwgMCk7CisgICAgaWYgKHJjKSB7CisgICAgICBMT0dFKCJFcnJvciIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvKiBkZXN0IGJ1ZmZlciBjb25maWcgKi8KKyAgICBwX3BhcmFtcy0+ZGVzdF9idWZbaV0uYnVmX3NpemUgPSBwX29iai0+b3V0cHV0W2ldLnNpemU7CisgICAgcF9wYXJhbXMtPmRlc3RfYnVmW2ldLmJ1Zl92YWRkciA9IHBfb2JqLT5vdXRwdXRbaV0uYWRkcjsKKyAgICBwX3BhcmFtcy0+ZGVzdF9idWZbaV0uZmQgPSBwX29iai0+b3V0cHV0W2ldLnBfcG1lbV9mZDsKKyAgICBwX3BhcmFtcy0+ZGVzdF9idWZbaV0uaW5kZXggPSBpOworICB9CisKKworICBwX3BhcmFtcy0+bnVtX3NyY19idWZzID0gcF9vYmotPm51bV9idWZzOworICBwX3BhcmFtcy0+bnVtX3RtYl9idWZzID0gMDsKKyAgZ19jb3VudCA9IHBfcGFyYW1zLT5udW1fc3JjX2J1ZnM7CisKKyAgcF9wYXJhbXMtPmVuY29kZV90aHVtYm5haWwgPSBwX2lucHV0LT5lbmNvZGVfdGh1bWJuYWlsOworICBpZiAocF9wYXJhbXMtPmVuY29kZV90aHVtYm5haWwpIHsKKyAgICAgIHBfcGFyYW1zLT5udW1fdG1iX2J1ZnMgPSBwX29iai0+bnVtX2J1ZnM7CisgIH0KKyAgcF9wYXJhbXMtPnF1YWxpdHkgPSAodWludDMyX3QpcF9pbnB1dC0+bWFpbl9xdWFsaXR5OworICBwX3BhcmFtcy0+dGh1bWJfcXVhbGl0eSA9ICh1aW50MzJfdClwX2lucHV0LT50aHVtYl9xdWFsaXR5OworCisgIHBfam9iX3BhcmFtcy0+ZHN0X2luZGV4ID0gMDsKKyAgcF9qb2JfcGFyYW1zLT5zcmNfaW5kZXggPSAwOworICBwX2pvYl9wYXJhbXMtPnJvdGF0aW9uID0gMDsKKworICAvKiBtYWluIGRpbWVuc2lvbiAqLworICBwX2pvYl9wYXJhbXMtPm1haW5fZGltLnNyY19kaW0ud2lkdGggPSBwX29iai0+d2lkdGg7CisgIHBfam9iX3BhcmFtcy0+bWFpbl9kaW0uc3JjX2RpbS5oZWlnaHQgPSBwX29iai0+aGVpZ2h0OworICBwX2pvYl9wYXJhbXMtPm1haW5fZGltLmRzdF9kaW0ud2lkdGggPSBwX29iai0+d2lkdGg7CisgIHBfam9iX3BhcmFtcy0+bWFpbl9kaW0uZHN0X2RpbS5oZWlnaHQgPSBwX29iai0+aGVpZ2h0OworICBwX2pvYl9wYXJhbXMtPm1haW5fZGltLmNyb3AudG9wID0gMDsKKyAgcF9qb2JfcGFyYW1zLT5tYWluX2RpbS5jcm9wLmxlZnQgPSAwOworICBwX2pvYl9wYXJhbXMtPm1haW5fZGltLmNyb3Aud2lkdGggPSBwX29iai0+d2lkdGg7CisgIHBfam9iX3BhcmFtcy0+bWFpbl9kaW0uY3JvcC5oZWlnaHQgPSBwX29iai0+aGVpZ2h0OworCisgIHBfcGFyYW1zLT5tYWluX2RpbSAgPSBwX2pvYl9wYXJhbXMtPm1haW5fZGltOworCisgIC8qIHRodW1iIGRpbWVuc2lvbiAqLworICBwX2pvYl9wYXJhbXMtPnRodW1iX2RpbS5zcmNfZGltLndpZHRoID0gcF9vYmotPndpZHRoOworICBwX2pvYl9wYXJhbXMtPnRodW1iX2RpbS5zcmNfZGltLmhlaWdodCA9IHBfb2JqLT5oZWlnaHQ7CisgIHBfam9iX3BhcmFtcy0+dGh1bWJfZGltLmRzdF9kaW0ud2lkdGggPSBwX2lucHV0LT50bWJfd2lkdGg7CisgIHBfam9iX3BhcmFtcy0+dGh1bWJfZGltLmRzdF9kaW0uaGVpZ2h0ID0gcF9pbnB1dC0+dG1iX2hlaWdodDsKKyAgcF9qb2JfcGFyYW1zLT50aHVtYl9kaW0uY3JvcC50b3AgPSAwOworICBwX2pvYl9wYXJhbXMtPnRodW1iX2RpbS5jcm9wLmxlZnQgPSAwOworICBwX2pvYl9wYXJhbXMtPnRodW1iX2RpbS5jcm9wLndpZHRoID0gMDsKKyAgcF9qb2JfcGFyYW1zLT50aHVtYl9kaW0uY3JvcC5oZWlnaHQgPSAwOworCisgIHBfcGFyYW1zLT50aHVtYl9kaW0gID0gcF9qb2JfcGFyYW1zLT50aHVtYl9kaW07CisKKyAgcF9qb2JfcGFyYW1zLT5leGlmX2luZm8ubnVtT2ZFbnRyaWVzID0gMDsKKyAgcF9wYXJhbXMtPmJ1cnN0X21vZGUgPSBidXJzdF9tb2RlOworCisgIC8qIFF0YWJsZSAqLworICBwX2pvYl9wYXJhbXMtPnF0YWJsZVswXS5lUXVhbnRpemF0aW9uVGFibGUgPQorICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZUx1bWE7CisgIHBfam9iX3BhcmFtcy0+cXRhYmxlWzFdLmVRdWFudGl6YXRpb25UYWJsZSA9CisgICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlQ2hyb21hOworICBwX2pvYl9wYXJhbXMtPnF0YWJsZV9zZXRbMF0gPSAxOworICBwX2pvYl9wYXJhbXMtPnF0YWJsZV9zZXRbMV0gPSAxOworCisgIGZvciAoaSA9IDA7IGkgPCBRVUFOVF9TSVpFOyBpKyspIHsKKyAgICBwX2pvYl9wYXJhbXMtPnF0YWJsZVswXS5uUXVhbnRpemF0aW9uTWF0cml4W2ldID0gREVGQVVMVF9RVEFCTEVfMFtpXTsKKyAgICBwX2pvYl9wYXJhbXMtPnF0YWJsZVsxXS5uUXVhbnRpemF0aW9uTWF0cml4W2ldID0gREVGQVVMVF9RVEFCTEVfMVtpXTsKKyAgfQorCisgIHBfb2JqLT5waWNfc2l6ZS53ID0gKHVpbnQzMl90KXBfaW5wdXQtPndpZHRoOworICBwX29iai0+cGljX3NpemUuaCA9ICh1aW50MzJfdClwX2lucHV0LT5oZWlnaHQ7CisKKyAgcF9vYmotPmNsaW5ldF9pZCA9IGNsaWVudF9pZDsKKworICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKmVuY29kZV90ZXN0KHZvaWQgKmRhdGEpCit7CisgIGludCByYyA9IDA7CisgIG1tX2pwZWdfaW50Zl90ZXN0X3QgKmpwZWdfb2JqID0gKG1tX2pwZWdfaW50Zl90ZXN0X3QgKilkYXRhOworICBjaGFyIGZpbGVfbmFtZVs2NF07CisKKyAgdWludDMyX3QgaSA9IDA7CisgIGpwZWdfb2JqLT5oYW5kbGUgPSBqcGVnX29wZW4oJmpwZWdfb2JqLT5vcHMsIE5VTEwsIGpwZWdfb2JqLT5waWNfc2l6ZSwgTlVMTCk7CisgIGlmIChqcGVnX29iai0+aGFuZGxlID09IDApIHsKKyAgICBMT0dFKCJFcnJvciIpOworICAgIGpwZWdfb2JqLT5yZXQgPSAtMTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIHJjID0ganBlZ19vYmotPm9wcy5jcmVhdGVfc2Vzc2lvbihqcGVnX29iai0+aGFuZGxlLCAmanBlZ19vYmotPnBhcmFtcywKKyAgICAmanBlZ19vYmotPmpvYi5lbmNvZGVfam9iLnNlc3Npb25faWQpOworICBpZiAoanBlZ19vYmotPmpvYi5lbmNvZGVfam9iLnNlc3Npb25faWQgPT0gMCkgeworICAgIExPR0UoIkVycm9yIik7CisgICAganBlZ19vYmotPnJldCA9IC0xOworICAgIGdvdG8gZW5kOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGpwZWdfb2JqLT5udW1fYnVmczsgaSsrKSB7CisgICAganBlZ19vYmotPmpvYi5qb2JfdHlwZSA9IEpQRUdfSk9CX1RZUEVfRU5DT0RFOworICAgIGpwZWdfb2JqLT5qb2IuZW5jb2RlX2pvYi5zcmNfaW5kZXggPSAoaW50MzJfdCkgaTsKKyAgICBqcGVnX29iai0+am9iLmVuY29kZV9qb2IuZHN0X2luZGV4ID0gKGludDMyX3QpIGk7CisgICAganBlZ19vYmotPmpvYi5lbmNvZGVfam9iLnRodW1iX2luZGV4ID0gKHVpbnQzMl90KSBpOworCisgICAgaWYgKGpwZWdfb2JqLT5wYXJhbXMuYnVyc3RfbW9kZSAmJiBqcGVnX29iai0+bWluX291dF9idWZzKSB7CisgICAgICBqcGVnX29iai0+am9iLmVuY29kZV9qb2IuZHN0X2luZGV4ID0gLTE7CisgICAgfQorCisgICAgcmMgPSBqcGVnX29iai0+b3BzLnN0YXJ0X2pvYigmanBlZ19vYmotPmpvYiwgJmpwZWdfb2JqLT5qb2JfaWRbaV0pOworICAgIGlmIChyYykgeworICAgICAgTE9HRSgiRXJyb3IiKTsKKyAgICAgIGpwZWdfb2JqLT5yZXQgPSByYzsKKyAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgfQorICBqcGVnX29iai0+am9iX2lkW2ldID0gMDsKKworICAvKgorICB1c2xlZXAoNSk7CisgIGpwZWdfb2JqLT5vcHMuYWJvcnRfam9iKGpwZWdfb2JqLT5qb2JfaWRbMF0pOworICAqLworICBwdGhyZWFkX211dGV4X2xvY2soJmpwZWdfb2JqLT5sb2NrKTsKKyAgcHRocmVhZF9jb25kX3dhaXQoJmpwZWdfb2JqLT5jb25kLCAmanBlZ19vYmotPmxvY2spOworICBwdGhyZWFkX211dGV4X3VubG9jaygmanBlZ19vYmotPmxvY2spOworCisgIGpwZWdfb2JqLT5vcHMuZGVzdHJveV9zZXNzaW9uKGpwZWdfb2JqLT5qb2IuZW5jb2RlX2pvYi5zZXNzaW9uX2lkKTsKKyAganBlZ19vYmotPm9wcy5jbG9zZShqcGVnX29iai0+aGFuZGxlKTsKKworZW5kOgorICBmb3IgKGkgPSAwOyBpIDwganBlZ19vYmotPm51bV9idWZzOyBpKyspIHsKKyAgICBpZiAoIWpwZWdfb2JqLT5taW5fb3V0X2J1ZnMpIHsKKyAgICAgIC8vIFNhdmUgb3V0cHV0IGZpbGVzCisgICAgICBMT0dFKCJTYXZpbmcgZmlsZSVzIGFkZHIgJXAgbGVuICV6dSIsCisgICAgICAgICAganBlZ19vYmotPm91dF9maWxlbmFtZVtpXSwKKyAgICAgICAgICBqcGVnX29iai0+b3V0cHV0W2ldLmFkZHIsIGpwZWdfb2JqLT5idWZfZmlsbGVkX2xlbltpXSk7CisKKyAgICAgIHNucHJpbnRmKGZpbGVfbmFtZSwgc2l6ZW9mKGZpbGVfbmFtZSksICIlc18lZC5qcGciLAorICAgICAgICBqcGVnX29iai0+b3V0X2ZpbGVuYW1lW2ldLCBqcGVnX29iai0+Y2xpbmV0X2lkKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiT3V0cHV0IGZpbGUgZm9yIGNsaWVudCAlZCA9ICVzXG4iLAorICAgICAgICBqcGVnX29iai0+Y2xpbmV0X2lkLCBmaWxlX25hbWUpOworCisgICAgICBEVU1QX1RPX0ZJTEUoZmlsZV9uYW1lLCBqcGVnX29iai0+b3V0cHV0W2ldLmFkZHIsCisgICAgICAgIGpwZWdfb2JqLT5idWZfZmlsbGVkX2xlbltpXSk7CisgICAgfQorICAgIG1tX2pwZWdfdGVzdF9mcmVlKCZqcGVnX29iai0+aW5wdXRbaV0pOworICAgIG1tX2pwZWdfdGVzdF9mcmVlKCZqcGVnX29iai0+b3V0cHV0W2ldKTsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBNQVhfRklMRV9DTlQgKDIwKQorc3RhdGljIGludCBtbV9qcGVnX3Rlc3RfZ2V0X2lucHV0KGludCBhcmdjLCBjaGFyICphcmd2W10sCisgICAganBlZ190ZXN0X2lucHV0X3QgKnBfdGVzdCkKK3sKKyAgaW50IGM7CisgIHNpemVfdCBpbl9maWxlX2NudCA9IDAsIG91dF9maWxlX2NudCA9IDAsIGk7CisgIGludCBpZHggPSAwOworICBqcGVnX3Rlc3RfaW5wdXRfdCAqcF90ZXN0X2Jhc2UgPSBwX3Rlc3Q7CisKKyAgY2hhciAqaW5fZmlsZXNbTUFYX0ZJTEVfQ05UXTsKKyAgY2hhciAqb3V0X2ZpbGVzW01BWF9GSUxFX0NOVF07CisKKyAgd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICItSTpPOlc6SDpGOkJUeDp5OlE6SjpLOkM6cToiKSkgIT0gLTEpIHsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICBjYXNlICdCJzoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJS0yNXNcbiIsICJVc2luZyBidXJzdCBtb2RlIik7CisgICAgICBwX3Rlc3QtPmJ1cnN0X21vZGUgPSAxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnSSc6CisgICAgICBmb3IgKGlkeCA9IG9wdGluZCAtIDE7IGlkeCA8IGFyZ2M7IGlkeCsrKSB7CisgICAgICAgIGlmIChhcmd2W2lkeF1bMF0gPT0gJy0nKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW5fZmlsZXNbaW5fZmlsZV9jbnQrK10gPSBhcmd2W2lkeF07CisgICAgICB9CisgICAgICBvcHRpbmQgPSBpZHggLTE7CisKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ08nOgorICAgICAgZm9yIChpZHggPSBvcHRpbmQgLSAxOyBpZHggPCBhcmdjOyBpZHgrKykgeworICAgICAgICBpZiAoYXJndltpZHhdWzBdID09ICctJykgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG91dF9maWxlc1tvdXRfZmlsZV9jbnQrK10gPSBhcmd2W2lkeF07CisgICAgICB9CisgICAgICBvcHRpbmQgPSBpZHggLTE7CisKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1cnOgorICAgICAgcF90ZXN0LT53aWR0aCA9IGF0b2kob3B0YXJnKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJS0yNXMlZFxuIiwgIldpZHRoOiAiLCBwX3Rlc3QtPndpZHRoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0gnOgorICAgICAgcF90ZXN0LT5oZWlnaHQgPSBhdG9pKG9wdGFyZyk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUtMjVzJWRcbiIsICJIZWlnaHQ6ICIsIHBfdGVzdC0+aGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0YnOgorICAgICAgcF90ZXN0LT5jb2xfZm10ID0gY29sb3JfZm9ybWF0c1thdG9pKG9wdGFyZyldOworICAgICAgZnByaW50ZihzdGRlcnIsICIlLTI1cyVzXG4iLCAiRm9ybWF0OiAiLCBwX3Rlc3QtPmNvbF9mbXQuc3RyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ00nOgorICAgICAgcF90ZXN0LT5taW5fb3V0X2J1ZnMgPSAxOworICAgICAgZnByaW50ZihzdGRlcnIsICIlLTI1c1xuIiwgIlVzaW5nIG1pbmltdW0gbnVtYmVyIG9mIG91dHB1dCBidWZmZXJzIik7CisgICAgICBicmVhazsKKyAgICBjYXNlICdUJzoKKyAgICAgIHBfdGVzdC0+ZW5jb2RlX3RodW1ibmFpbCA9IDE7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUtMjVzXG4iLCAiRW5jb2RlIHRodW1ibmFpbCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAneCc6CisgICAgICBwX3Rlc3QtPnRtYl93aWR0aCA9IGF0b2kob3B0YXJnKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJS0yNXMlZFxuIiwgIlRtYiBXaWR0aDogIiwgcF90ZXN0LT50bWJfd2lkdGgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAneSc6CisgICAgICBwX3Rlc3QtPnRtYl9oZWlnaHQgPSBhdG9pKG9wdGFyZyk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUtMjVzJWRcbiIsICJUbWIgSGVpZ2h0OiAiLCBwX3Rlc3QtPnRtYl9oZWlnaHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnUSc6CisgICAgICBwX3Rlc3QtPm1haW5fcXVhbGl0eSA9IGF0b2kob3B0YXJnKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJS0yNXMlZFxuIiwgIk1haW4gcXVhbGl0eTogIiwgcF90ZXN0LT5tYWluX3F1YWxpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAncSc6CisgICAgICBwX3Rlc3QtPnRodW1iX3F1YWxpdHkgPSBhdG9pKG9wdGFyZyk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUtMjVzJWRcbiIsICJUaHVtYiBxdWFsaXR5OiAiLCBwX3Rlc3QtPnRodW1iX3F1YWxpdHkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAnSic6CisgICAgICBwX3Rlc3QtPnF0YWJsZV9sdW1hX2ZpbGUgPSBvcHRhcmc7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUtMjVzJXNcbiIsICJRdGFibGUgbHVtYSBwYXRoIiwKKyAgICAgICAgcF90ZXN0LT5xdGFibGVfbHVtYV9maWxlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0snOgorICAgICAgcF90ZXN0LT5xdGFibGVfY2hyb21hX2ZpbGUgPSBvcHRhcmc7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUtMjVzJXNcbiIsICJRdGFibGUgY2hyb21hIHBhdGgiLAorICAgICAgICBwX3Rlc3QtPnF0YWJsZV9jaHJvbWFfZmlsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICdDJzoKKyAgICAgIHBfdGVzdC0+Y2xpZW50X2NudCA9IGF0b2kob3B0YXJnKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJS0yNXMlZFxuIiwgIk51bWJlciBvZiBjbGllbnRzICIsCisgICAgICAgIHBfdGVzdC0+Y2xpZW50X2NudCk7CisgICAgZGVmYXVsdDo7CisgICAgfQorICB9CisgIGZwcmludGYoc3RkZXJyLCAiSW5maWxlczogJXp1IE91dGZpbGVzOiAlenVcbiIsIGluX2ZpbGVfY250LCBvdXRfZmlsZV9jbnQpOworCisgIGlmIChwX3Rlc3QtPmNsaWVudF9jbnQgPiBNQVhfTlVNX0NMSUVOVCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ2xpZW50cyByZXF1ZXN0ZWQgZXhjZWVkcyBtYXggbGltaXQgJWRcbiIsCisgICAgICBNQVhfTlVNX0NMSUVOVCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGluX2ZpbGVfY250ID4gb3V0X2ZpbGVfY250KSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlLTI1c1xuIiwgIkluc3VmZmljaWVudCBudW1iZXIgb2Ygb3V0cHV0IGZpbGVzISIpOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8gRGlzY2FyZCB0aGUgZXh0cmEgb3V0IGZpbGVzCisgIG91dF9maWxlX2NudCA9IGluX2ZpbGVfY250OworCisgIHBfdGVzdCA9IHJlYWxsb2MocF90ZXN0LCAoaW5fZmlsZV9jbnQgKyAxKSAqIHNpemVvZigqcF90ZXN0KSk7CisgIGlmICghcF90ZXN0KSB7CisgICAgTE9HRSgiRXJyb3IiKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBtZW1zZXQocF90ZXN0KzEsIDAsIChpbl9maWxlX2NudCkgKiBzaXplb2YoKnBfdGVzdCkpOworCisgIGZvciAoaSA9IDA7IGkgPCBpbl9maWxlX2NudDsgaSsrLCBwX3Rlc3QrKykgeworICAgIG1lbWNweShwX3Rlc3QsIHBfdGVzdF9iYXNlLCBzaXplb2YoKnBfdGVzdCkpOworICAgIHBfdGVzdC0+ZmlsZW5hbWUgPSBpbl9maWxlc1tpXTsKKyAgICBwX3Rlc3QtPm91dF9maWxlbmFtZSA9IG91dF9maWxlc1tpXTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkluZjogJXMgT3V0ZjogJXNcbiIsIGluX2ZpbGVzW2ldLCBvdXRfZmlsZXNbaV0pOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1tX2pwZWdfdGVzdF9wcmludF91c2FnZSgpCit7CisgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IHByb2dyYW1fbmFtZSBbb3B0aW9uc11cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIk1hbmRhdG9yeSBvcHRpb25zOlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtSSBGSUxFMSBbRklMRTJdIFtGSUxFTl1cdExpc3Qgb2YgaW5wdXQgZmlsZXNcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLU8gRklMRTEgW0ZJTEUyXSBbRklMRU5dXHRMaXN0IG9mIG91dHB1dCBmaWxlc1xuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtVyBXSURUSFx0XHRPdXRwdXQgaW1hZ2Ugd2lkdGhcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLUggSEVJR0hUXHRcdE91dHB1dCBpbWFnZSBoZWlnaHRcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLUYgXHRcdENvbG9yIGZvcm1hdDogXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJcdFx0XHRcdCVzICgwKSwgJXMgKDEpLCAlcyAoMikgJXMgKDMpXG4iCisgICAgICAiXHRcdFx0XHQlcyAoNCksICVzICg1KSwgJXMgKDYpICVzICg3KVxuICIsCisgICAgICBjb2xvcl9mb3JtYXRzWzBdLnN0ciwgY29sb3JfZm9ybWF0c1sxXS5zdHIsCisgICAgICBjb2xvcl9mb3JtYXRzWzJdLnN0ciwgY29sb3JfZm9ybWF0c1szXS5zdHIsCisgICAgICBjb2xvcl9mb3JtYXRzWzRdLnN0ciwgY29sb3JfZm9ybWF0c1s1XS5zdHIsCisgICAgICBjb2xvcl9mb3JtYXRzWzZdLnN0ciwgY29sb3JfZm9ybWF0c1s3XS5zdHIpOworICBmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbmFsOlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtVCBcdFxFbmNvZGUgdGh1bWJuYWlsXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC14IFRNQl9XSURUSFx0XHRUaHVtYm5haWwgd2lkdGhcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXkgVE1CX0hFSUdIVFx0XHRUaHVtYm5haWwgaGVpZ2h0XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1RIE1BSU5fUVVBTElUWVx0XHRNYWluIGltYWdlIHF1YWxpdHlcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLXEgVE1CX1FVQUxJVFlcdFx0VGh1bWJuYWlsIGltYWdlIHF1YWxpdHlcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLUIgXHRcdEJ1cnN0IG1vZGUuIFV0aWxpemUgYm90aCBlbmNvZGVyIGVuZ2luZXMgb24iCisgICAgICAgICAgInN1cHBvcnRlZCB0YXJnZXRzXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1NIFx0XHRVc2UgbWluaW11bSBudW1iZXIgb2Ygb3V0cHV0IGJ1ZmZlcnMgXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1KIFx0XHRMdW1hIFFUYWJsZSBmaWxlbmFtZS4gQ29tbWEgc2VwYXJhdGVkIDh4OCIKKyAgICAiIG1hdHJpeFxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtSyBcdFx0Q2hyb21hIFFUYWJsZSBmaWxlbmFtZS4gQ29tbWEgc2VwYXJhdGVkIgorICAgICIgOHg4IG1hdHJpeFxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtQyBcdFx0TnVtYmVyIG9mIGNsaWVudHMgdG8gcnVuIGluIHBhcmxsZWxcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKKy8qKiBtYWluOgorICoKKyAqICBBcmd1bWVudHM6CisgKiAgICBAYXJnYworICogICAgQGFyZ3YKKyAqCisgKiAgUmV0dXJuOgorICogICAgICAgMCBvciAtdmUgdmFsdWVzCisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgICAgbWFpbiBmdW5jdGlvbgorICoKKyAqKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCit7CisgIGpwZWdfdGVzdF9pbnB1dF90ICpwX3Rlc3RfaW5wdXQ7CisgIG1tX2pwZWdfaW50Zl90ZXN0X3QgY2xpZW50W01BWF9OVU1fQ0xJRU5UXTsKKyAgaW50IHJldCA9IDA7CisgIGludCBpID0gMDsKKyAgaW50IHRocmVhZF9jbnQgPSAwOworCisgIGlmIChhcmdjID4gMSkgeworICAgIHBfdGVzdF9pbnB1dCA9IGNhbGxvYygyLCBzaXplb2YoKnBfdGVzdF9pbnB1dCkpOworICAgIGlmICghcF90ZXN0X2lucHV0KSB7CisgICAgICBMT0dFKCJFcnJvciIpOworICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBtZW1jcHkocF90ZXN0X2lucHV0LCAmanBlZ19pbnB1dFswXSwgc2l6ZW9mKCpwX3Rlc3RfaW5wdXQpKTsKKyAgICByZXQgPSBtbV9qcGVnX3Rlc3RfZ2V0X2lucHV0KGFyZ2MsIGFyZ3YsIHBfdGVzdF9pbnB1dCk7CisgICAgaWYgKHJldCkgeworICAgICAgTE9HRSgiRXJyb3IiKTsKKyAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbW1fanBlZ190ZXN0X3ByaW50X3VzYWdlKCk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgcF90ZXN0X2lucHV0LT5jbGllbnRfY250OyBpKyspIHsKKyAgICBtZW1zZXQoJmNsaWVudFtpXSwgMHgwLCBzaXplb2YobW1fanBlZ19pbnRmX3Rlc3RfdCkpOworICAgIHJldCA9IGVuY29kZV9pbml0KHBfdGVzdF9pbnB1dCwgJmNsaWVudFtpXSwgaSk7CisgICAgaWYgKHJldCkgeworICAgICAgTE9HRSgiRXJyb3IiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXQgPSBwdGhyZWFkX2NyZWF0ZSgmY2xpZW50W2ldLnRocmVhZF9pZCwgTlVMTCwgZW5jb2RlX3Rlc3QsCisgICAgICAmY2xpZW50W2ldKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGluIHRocmVhZCBjcmVhdGlvblxuIik7CisgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgdGhyZWFkX2NudCA9IGk7CisgIGZvciAoaSA9IDA7IGkgPCB0aHJlYWRfY250OyBpKyspIHsKKyAgICBwdGhyZWFkX2pvaW4oY2xpZW50W2ldLnRocmVhZF9pZCwgTlVMTCk7CisgIH0KKworZXhpdDoKKyAgZm9yIChpID0gMDsgaSA8IHRocmVhZF9jbnQ7IGkrKykgeworICAgIGlmICghY2xpZW50W2ldLnJldCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICIlLTI1cyAlZCAlc1xuIiwgIkNsaWVudCIsIGksICJTdWNjZXNzISIpOworICAgIH0gZWxzZSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUtMjVzICVkICVzXG4iLCAiQ2xpZW50IiwgaSwgIkZhaWwhIik7CisgICAgfQorICB9CisKKyAgaWYgKGFyZ2MgPiAxKSB7CisgICAgaWYgKHBfdGVzdF9pbnB1dCkgeworICAgICAgZnJlZShwX3Rlc3RfaW5wdXQpOworICAgICAgcF90ZXN0X2lucHV0ID0gTlVMTDsKKyAgICB9CisgIH0KKworICByZXR1cm4gcmV0OworfQorCisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS90ZXN0L21tX2pwZWdkZWNfdGVzdC5jIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWpwZWctaW50ZXJmYWNlL3Rlc3QvbW1fanBlZ2RlY190ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViNjJmNQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1qcGVnLWludGVyZmFjZS90ZXN0L21tX2pwZWdkZWNfdGVzdC5jCkBAIC0wLDAgKzEsNDc5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZGVmaW5lIFRJTUVfSCA8U1lTVEVNX0hFQURFUl9QUkVGSVgvdGltZS5oPgorI2luY2x1ZGUgVElNRV9ICisKKy8vIEpQRUcgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAibW1fanBlZ19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJtbV9qcGVnX2lvbmJ1Zi5oIgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorCisjZGVmaW5lIE1JTihhLGIpICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIE1BWChhLGIpICAoKChhKSA+IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIENMQU1QKHgsIG1pbiwgbWF4KSBNSU4oTUFYKCh4KSwgKG1pbikpLCAobWF4KSkKKworI2RlZmluZSBUSU1FX0lOX1VTKHIpICgodWludDY0X3Qpci50dl9zZWMgKiAxMDAwMDAwTEwgKyAodWludDY0X3Qpci50dl91c2VjKQorc3RydWN0IHRpbWV2YWwgZHRpbWVbMl07CisKKworLyoqIERVTVBfVE9fRklMRToKKyAqICBAZmlsZW5hbWU6IGZpbGUgbmFtZQorICogIEBwX2FkZHI6IGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorICogIEBsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCisgKiAgZHVtcCB0aGUgaW1hZ2UgdG8gdGhlIGZpbGUKKyAqKi8KKyNkZWZpbmUgRFVNUF9UT19GSUxFKGZpbGVuYW1lLCBwX2FkZHIsIGxlbikgKHsgXAorICBzaXplX3QgcmMgPSAwOyBcCisgIEZJTEUgKmZwID0gZm9wZW4oZmlsZW5hbWUsICJ3KyIpOyBcCisgIGlmIChmcCkgeyBcCisgICAgcmMgPSBmd3JpdGUocF9hZGRyLCAxLCBsZW4sIGZwKTsgXAorICAgIGZjbG9zZShmcCk7IFwKKyAgfSBlbHNlIHsgXAorICAgIExPR0UoImNhbm5vdCBkdW1wIGltYWdlIik7IFwKKyAgfSBcCit9KQorCitzdGF0aWMgaW50IGdfY291bnQgPSAxLCBnX2k7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY2hhciAqZmlsZW5hbWU7CisgIGludCB3aWR0aDsKKyAgaW50IGhlaWdodDsKKyAgY2hhciAqb3V0X2ZpbGVuYW1lOworICBpbnQgZm9ybWF0OworfSBqcGVnX3Rlc3RfaW5wdXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjaGFyICpmaWxlbmFtZTsKKyAgaW50IHdpZHRoOworICBpbnQgaGVpZ2h0OworICBjaGFyICpvdXRfZmlsZW5hbWU7CisgIHB0aHJlYWRfbXV0ZXhfdCBsb2NrOworICBwdGhyZWFkX2NvbmRfdCBjb25kOworICBidWZmZXJfdCBpbnB1dDsKKyAgYnVmZmVyX3Qgb3V0cHV0OworICBpbnQgdXNlX2lvbjsKKyAgdWludDMyX3QgaGFuZGxlOworICBtbV9qcGVnZGVjX29wc190IG9wczsKKyAgdWludDMyX3Qgam9iX2lkWzVdOworICBtbV9qcGVnX2RlY29kZV9wYXJhbXNfdCBwYXJhbXM7CisgIG1tX2pwZWdfam9iX3Qgam9iOworICB1aW50MzJfdCBzZXNzaW9uX2lkOworfSBtbV9qcGVnZGVjX2ludGZfdGVzdF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGNoYXIgKmZvcm1hdF9zdHI7CisgIGludCBlQ29sb3JGb3JtYXQ7Cit9IG1tX2pwZWdkZWNfY29sX2ZtdF90OworCisjZGVmaW5lIEFSUl9TWihhKSAoc2l6ZW9mKGEpL3NpemVvZihhWzBdKSkKKworc3RhdGljIGNvbnN0IG1tX2pwZWdkZWNfY29sX2ZtdF90IGNvbF9mb3JtYXRzW10gPQoreworICB7ICJZQ1JDQkxQX0gyVjIiLCAgICAgIChpbnQpTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNSQ0JMUF9IMlYyIH0sCisgIHsgIllDQkNSTFBfSDJWMiIsICAgICAgKGludClNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gyVjIgfSwKKyAgeyAiWUNSQ0JMUF9IMlYxIiwgICAgICAoaW50KU1NX0pQRUdfQ09MT1JfRk9STUFUX1lDUkNCTFBfSDJWMSB9LAorICB7ICJZQ0JDUkxQX0gyVjEiLCAgICAgIChpbnQpTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNCQ1JMUF9IMlYxIH0sCisgIHsgIllDUkNCTFBfSDFWMiIsICAgICAgKGludClNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ1JDQkxQX0gxVjIgfSwKKyAgeyAiWUNCQ1JMUF9IMVYyIiwgICAgICAoaW50KU1NX0pQRUdfQ09MT1JfRk9STUFUX1lDQkNSTFBfSDFWMiB9LAorICB7ICJZQ1JDQkxQX0gxVjEiLCAgICAgIChpbnQpTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNSQ0JMUF9IMVYxIH0sCisgIHsgIllDQkNSTFBfSDFWMSIsICAgICAgKGludClNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gxVjEgfQorfTsKKworc3RhdGljIHZvaWQgbW1fanBlZ2RlY19kZWNvZGVfY2FsbGJhY2soanBlZ19qb2Jfc3RhdHVzX3Qgc3RhdHVzLAorICB1aW50MzJfdCBjbGllbnRfaGRsLAorICB1aW50MzJfdCBqb2JJZCwKKyAgbW1fanBlZ19vdXRwdXRfdCAqcF9vdXRwdXQsCisgIHZvaWQgKnVzZXJEYXRhKQoreworICBtbV9qcGVnZGVjX2ludGZfdGVzdF90ICpwX29iaiA9IChtbV9qcGVnZGVjX2ludGZfdGVzdF90ICopdXNlckRhdGE7CisKKyAgaWYgKHN0YXR1cyA9PSBKUEVHX0pPQl9TVEFUVVNfRVJST1IpIHsKKyAgICBMT0dFKCJEZWNvZGUgZXJyb3IiKTsKKyAgfSBlbHNlIHsKKyAgICBnZXR0aW1lb2ZkYXkoJmR0aW1lWzFdLCBOVUxMKTsKKyAgICBMT0dFKCJEZWNvZGUgdGltZSAlbGx1IG1zIiwKKyAgICAgICgoVElNRV9JTl9VUyhkdGltZVsxXSkgLSBUSU1FX0lOX1VTKGR0aW1lWzBdKSkvMTAwMCkpOworCisgICAgTE9HRSgiRGVjb2RlIHN1Y2Nlc3MgZmlsZSVzIGFkZHIgJXAgbGVuICV6dSIsCisgICAgICAgcF9vYmotPm91dF9maWxlbmFtZSwKKyAgICAgIHBfb3V0cHV0LT5idWZfdmFkZHIsIHBfb3V0cHV0LT5idWZfZmlsbGVkX2xlbik7CisgICAgRFVNUF9UT19GSUxFKHBfb2JqLT5vdXRfZmlsZW5hbWUsIHBfb3V0cHV0LT5idWZfdmFkZHIsIHBfb3V0cHV0LT5idWZfZmlsbGVkX2xlbik7CisgIH0KKyAgZ19pKys7CisgIGlmIChnX2kgPj0gZ19jb3VudCkgeworICAgIExPR0UoIlNpZ25hbCB0aGUgdGhyZWFkIik7CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcF9vYmotPmNvbmQpOworICB9Cit9CisKK2ludCBtbV9qcGVnZGVjX3Rlc3RfYWxsb2MoYnVmZmVyX3QgKnBfYnVmZmVyLCBpbnQgdXNlX3BtZW0pCit7CisgIGludCByZXQgPSAwOworICAvKkFsbG9jYXRlIGJ1ZmZlcnMqLworICBpZiAodXNlX3BtZW0pIHsKKyAgICBwX2J1ZmZlci0+YWRkciA9ICh1aW50OF90ICopYnVmZmVyX2FsbG9jYXRlKHBfYnVmZmVyLCAwKTsKKyAgICBpZiAoTlVMTCA9PSBwX2J1ZmZlci0+YWRkcikgeworICAgICAgTE9HRSgiRXJyb3IiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLyogQWxsb2NhdGUgaGVhcCBtZW1vcnkgKi8KKyAgICBwX2J1ZmZlci0+YWRkciA9ICh1aW50OF90ICopbWFsbG9jKHBfYnVmZmVyLT5zaXplKTsKKyAgICBpZiAoTlVMTCA9PSBwX2J1ZmZlci0+YWRkcikgeworICAgICAgTE9HRSgiRXJyb3IiKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKwordm9pZCBtbV9qcGVnZGVjX3Rlc3RfZnJlZShidWZmZXJfdCAqcF9idWZmZXIpCit7CisgIGlmIChwX2J1ZmZlci0+YWRkciA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBpZiAocF9idWZmZXItPnBfcG1lbV9mZCA+PSAwKQorICAgIGJ1ZmZlcl9kZWFsbG9jYXRlKHBfYnVmZmVyKTsKKyAgZWxzZQorICAgIGZyZWUocF9idWZmZXItPmFkZHIpOworCisgIG1lbXNldChwX2J1ZmZlciwgMHgwLCBzaXplb2YoYnVmZmVyX3QpKTsKK30KKworaW50IG1tX2pwZWdkZWNfdGVzdF9yZWFkKG1tX2pwZWdkZWNfaW50Zl90ZXN0X3QgKnBfb2JqKQoreworICBpbnQgcmMgPSAwOworICBGSUxFICpmcCA9IE5VTEw7CisgIHNpemVfdCBmaWxlX3NpemUgPSAwOworICBmcCA9IGZvcGVuKHBfb2JqLT5maWxlbmFtZSwgInJiIik7CisgIGlmICghZnApIHsKKyAgICBMT0dFKCJlcnJvciIpOworICAgIHJldHVybiAtMTsKKyAgfQorICBmc2VlayhmcCwgMCwgU0VFS19FTkQpOworICBmaWxlX3NpemUgPSAoc2l6ZV90KWZ0ZWxsKGZwKTsKKyAgZnNlZWsoZnAsIDAsIFNFRUtfU0VUKTsKKworICBMT0dFKCJpbnB1dCBmaWxlIHNpemUgaXMgJXp1IiwKKyAgICAgZmlsZV9zaXplKTsKKworICBwX29iai0+aW5wdXQuc2l6ZSA9IGZpbGVfc2l6ZTsKKworICAvKiBhbGxvY2F0ZSBidWZmZXJzICovCisgIHJjID0gbW1fanBlZ2RlY190ZXN0X2FsbG9jKCZwX29iai0+aW5wdXQsIHBfb2JqLT51c2VfaW9uKTsKKyAgaWYgKHJjKSB7CisgICAgTE9HRSgiRXJyb3IiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBmcmVhZChwX29iai0+aW5wdXQuYWRkciwgMSwgcF9vYmotPmlucHV0LnNpemUsIGZwKTsKKyAgZmNsb3NlKGZwKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2hyb21hU2NhbGUobW1fanBlZ19jb2xvcl9mb3JtYXQgZm9ybWF0LCBkb3VibGUgKmNTY2FsZSkKK3sKKyAgZG91YmxlIHNjYWxlOworCisgIHN3aXRjaChmb3JtYXQpIHsKKyAgICBjYXNlIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDUkNCTFBfSDJWMjoKKyAgICBjYXNlIE1NX0pQRUdfQ09MT1JfRk9STUFUX1lDQkNSTFBfSDJWMjoKKyAgICAgIHNjYWxlID0gMS41OworICAgICAgYnJlYWs7CisgICAgY2FzZSBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ1JDQkxQX0gyVjE6CisgICAgY2FzZSBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gyVjE6CisgICAgY2FzZSBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ1JDQkxQX0gxVjI6CisgICAgY2FzZSBNTV9KUEVHX0NPTE9SX0ZPUk1BVF9ZQ0JDUkxQX0gxVjI6CisgICAgICBzY2FsZSA9IDIuMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNSQ0JMUF9IMVYxOgorICAgIGNhc2UgTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNCQ1JMUF9IMVYxOgorICAgICAgc2NhbGUgPSAzLjA7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1NX0pQRUdfQ09MT1JfRk9STUFUX01PTk9DSFJPTUU6CisgICAgICBzY2FsZSA9IDEuMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBzY2FsZSA9IDA7CisgICAgICBMT0dFKCJjb2xvciBmb3JtYXQgRXJyb3IiKTsKKyAgICB9CisKKyAgKmNTY2FsZSA9IHNjYWxlOworfQorCitzdGF0aWMgaW50IGRlY29kZV9pbml0KGpwZWdfdGVzdF9pbnB1dF90ICpwX2lucHV0LCBtbV9qcGVnZGVjX2ludGZfdGVzdF90ICpwX29iaikKK3sKKyAgaW50IHJjID0gLTE7CisgIHNpemVfdCBzaXplID0gKHNpemVfdCkoQ0VJTElORzE2KHBfaW5wdXQtPndpZHRoKSAqIENFSUxJTkcxNihwX2lucHV0LT5oZWlnaHQpKTsKKyAgZG91YmxlIGNTY2FsZTsKKyAgbW1fanBlZ19kZWNvZGVfcGFyYW1zX3QgKnBfcGFyYW1zID0gJnBfb2JqLT5wYXJhbXM7CisgIG1tX2pwZWdfZGVjb2RlX2pvYl90ICpwX2pvYl9wYXJhbXMgPSAmcF9vYmotPmpvYi5kZWNvZGVfam9iOworCisgIHBfb2JqLT5maWxlbmFtZSA9IHBfaW5wdXQtPmZpbGVuYW1lOworICBwX29iai0+d2lkdGggPSBwX2lucHV0LT53aWR0aDsKKyAgcF9vYmotPmhlaWdodCA9IHBfaW5wdXQtPmhlaWdodDsKKyAgcF9vYmotPm91dF9maWxlbmFtZSA9IHBfaW5wdXQtPm91dF9maWxlbmFtZTsKKyAgcF9vYmotPnVzZV9pb24gPSAxOworCisgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmcF9vYmotPmxvY2ssIE5VTEwpOworICBwdGhyZWFkX2NvbmRfaW5pdCgmcF9vYmotPmNvbmQsIE5VTEwpOworCisgIGNocm9tYVNjYWxlKHBfaW5wdXQtPmZvcm1hdCwgJmNTY2FsZSk7CisgIHBfb2JqLT5vdXRwdXQuc2l6ZSA9IChzaXplX3QpKChkb3VibGUpc2l6ZSAqIGNTY2FsZSk7CisgIHJjID0gbW1fanBlZ2RlY190ZXN0X2FsbG9jKCZwX29iai0+b3V0cHV0LCBwX29iai0+dXNlX2lvbik7CisgIGlmIChyYykgeworICAgIExPR0UoIkVycm9yIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmMgPSBtbV9qcGVnZGVjX3Rlc3RfcmVhZChwX29iaik7CisgIGlmIChyYykgeworICAgIExPR0UoIkVycm9yIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLyogc2V0IGVuY29kZSBwYXJhbWV0ZXJzICovCisgIHBfcGFyYW1zLT5qcGVnX2NiID0gbW1fanBlZ2RlY19kZWNvZGVfY2FsbGJhY2s7CisgIHBfcGFyYW1zLT51c2VyZGF0YSA9IHBfb2JqOworICBwX3BhcmFtcy0+Y29sb3JfZm9ybWF0ID0gcF9pbnB1dC0+Zm9ybWF0OworCisgIC8qIGRlc3QgYnVmZmVyIGNvbmZpZyAqLworICBwX3BhcmFtcy0+ZGVzdF9idWZbMF0uYnVmX3NpemUgPSBwX29iai0+b3V0cHV0LnNpemU7CisgIHBfcGFyYW1zLT5kZXN0X2J1ZlswXS5idWZfdmFkZHIgPSBwX29iai0+b3V0cHV0LmFkZHI7CisgIHBfcGFyYW1zLT5kZXN0X2J1ZlswXS5mZCA9IHBfb2JqLT5vdXRwdXQucF9wbWVtX2ZkOworICBwX3BhcmFtcy0+ZGVzdF9idWZbMF0uZm9ybWF0ID0gTU1fSlBFR19GTVRfWVVWOworICBwX3BhcmFtcy0+ZGVzdF9idWZbMF0ub2Zmc2V0Lm1wWzBdLmxlbiA9ICh1aW50MzJfdClzaXplOworICBwX3BhcmFtcy0+ZGVzdF9idWZbMF0ub2Zmc2V0Lm1wWzFdLmxlbiA9CisgICAgKHVpbnQzMl90KSgoZG91YmxlKXNpemUgKiAoY1NjYWxlIC0gMS4wKSk7CisgIHBfcGFyYW1zLT5kZXN0X2J1ZlswXS5vZmZzZXQubXBbMF0uc3RyaWRlID0gQ0VJTElORzE2KHBfaW5wdXQtPndpZHRoKTsKKyAgcF9wYXJhbXMtPmRlc3RfYnVmWzBdLm9mZnNldC5tcFswXS5zY2FubGluZSA9IENFSUxJTkcxNihwX2lucHV0LT5oZWlnaHQpOworICBwX3BhcmFtcy0+ZGVzdF9idWZbMF0ub2Zmc2V0Lm1wWzFdLnN0cmlkZSA9IENFSUxJTkcxNihwX2lucHV0LT53aWR0aCk7CisgIHBfcGFyYW1zLT5kZXN0X2J1ZlswXS5vZmZzZXQubXBbMV0uc2NhbmxpbmUgPSBDRUlMSU5HMTYocF9pbnB1dC0+aGVpZ2h0KTsKKyAgcF9wYXJhbXMtPmRlc3RfYnVmWzBdLmluZGV4ID0gMDsKKyAgcF9wYXJhbXMtPm51bV9kc3RfYnVmcyA9IDE7CisKKyAgLyogc3JjIGJ1ZmZlciBjb25maWcqLworICBwX3BhcmFtcy0+c3JjX21haW5fYnVmWzBdLmJ1Zl9zaXplID0gcF9vYmotPmlucHV0LnNpemU7CisgIHBfcGFyYW1zLT5zcmNfbWFpbl9idWZbMF0uYnVmX3ZhZGRyID0gcF9vYmotPmlucHV0LmFkZHI7CisgIHBfcGFyYW1zLT5zcmNfbWFpbl9idWZbMF0uZmQgPSBwX29iai0+aW5wdXQucF9wbWVtX2ZkOworICBwX3BhcmFtcy0+c3JjX21haW5fYnVmWzBdLmluZGV4ID0gMDsKKyAgcF9wYXJhbXMtPnNyY19tYWluX2J1ZlswXS5mb3JtYXQgPSBNTV9KUEVHX0ZNVF9CSVRTVFJFQU07CisgIC8qCisgIHBfcGFyYW1zLT5zcmNfbWFpbl9idWZbMF0ub2Zmc2V0Lm1wWzBdLmxlbiA9IHNpemU7CisgIHBfcGFyYW1zLT5zcmNfbWFpbl9idWZbMF0ub2Zmc2V0Lm1wWzFdLmxlbiA9IHNpemUgPj4gMTsKKyAgKi8KKyAgcF9wYXJhbXMtPm51bV9zcmNfYnVmcyA9IDE7CisKKyAgcF9qb2JfcGFyYW1zLT5kc3RfaW5kZXggPSAwOworICBwX2pvYl9wYXJhbXMtPnNyY19pbmRleCA9IDA7CisgIHBfam9iX3BhcmFtcy0+cm90YXRpb24gPSAwOworCisgIC8qIG1haW4gZGltZW5zaW9uICovCisgIHBfam9iX3BhcmFtcy0+bWFpbl9kaW0uc3JjX2RpbS53aWR0aCA9IHBfb2JqLT53aWR0aDsKKyAgcF9qb2JfcGFyYW1zLT5tYWluX2RpbS5zcmNfZGltLmhlaWdodCA9IHBfb2JqLT5oZWlnaHQ7CisgIHBfam9iX3BhcmFtcy0+bWFpbl9kaW0uZHN0X2RpbS53aWR0aCA9IHBfb2JqLT53aWR0aDsKKyAgcF9qb2JfcGFyYW1zLT5tYWluX2RpbS5kc3RfZGltLmhlaWdodCA9IHBfb2JqLT5oZWlnaHQ7CisgIHBfam9iX3BhcmFtcy0+bWFpbl9kaW0uY3JvcC50b3AgPSAwOworICBwX2pvYl9wYXJhbXMtPm1haW5fZGltLmNyb3AubGVmdCA9IDA7CisgIHBfam9iX3BhcmFtcy0+bWFpbl9kaW0uY3JvcC53aWR0aCA9IHBfb2JqLT53aWR0aDsKKyAgcF9qb2JfcGFyYW1zLT5tYWluX2RpbS5jcm9wLmhlaWdodCA9IHBfb2JqLT5oZWlnaHQ7CisKKworICByZXR1cm4gMDsKK30KKwordm9pZCBvbXhfdGVzdF9kZWNfcHJpbnRfdXNhZ2UoKQoreworICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBwcm9ncmFtX25hbWUgW29wdGlvbnNdXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJNYW5kYXRvcnkgb3B0aW9uczpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLUkgRklMRVx0XHRQYXRoIHRvIHRoZSBpbnB1dCBmaWxlLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiICAtTyBGSUxFXHRcdFBhdGggZm9yIHRoZSBvdXRwdXQgZmlsZS5cbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLVcgV0lEVEhcdFx0T3V0cHV0IGltYWdlIHdpZHRoXG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICIgIC1IIEhFSUdIVFx0XHRPdXRwdXQgaW1hZ2UgaGVpZ2h0XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJPcHRpb25hbDpcbiIpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgLUYgRk9STUFUXHRcdERlZmF1bHQgaW1hZ2UgZm9ybWF0OlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiXHRcdFx0XHQlcyAoMCksICVzICgxKSwgJXMgKDIpICVzICgzKVxuIgorICAgICIlcyAoNCksICVzICg1KSwgJXMgKDYpICVzICg3KVxuIiwKKyAgICBjb2xfZm9ybWF0c1swXS5mb3JtYXRfc3RyLCBjb2xfZm9ybWF0c1sxXS5mb3JtYXRfc3RyLAorICAgIGNvbF9mb3JtYXRzWzJdLmZvcm1hdF9zdHIsIGNvbF9mb3JtYXRzWzNdLmZvcm1hdF9zdHIsCisgICAgY29sX2Zvcm1hdHNbNF0uZm9ybWF0X3N0ciwgY29sX2Zvcm1hdHNbNV0uZm9ybWF0X3N0ciwKKyAgICBjb2xfZm9ybWF0c1s2XS5mb3JtYXRfc3RyLCBjb2xfZm9ybWF0c1s3XS5mb3JtYXRfc3RyCisgICAgKTsKKworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKK3N0YXRpYyBpbnQgbW1fanBlZ2RlY190ZXN0X2dldF9pbnB1dChpbnQgYXJnYywgY2hhciAqYXJndltdLAorICAgIGpwZWdfdGVzdF9pbnB1dF90ICpwX3Rlc3QpCit7CisgIGludCBjOworCisgIHdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiSTpPOlc6SDpGOiIpKSAhPSAtMSkgeworICAgIHN3aXRjaCAoYykgeworICAgIGNhc2UgJ08nOgorICAgICAgcF90ZXN0LT5vdXRfZmlsZW5hbWUgPSBvcHRhcmc7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUtMjVzJXNcbiIsICJPdXRwdXQgaW1hZ2UgcGF0aCIsCisgICAgICAgIHBfdGVzdC0+b3V0X2ZpbGVuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0knOgorICAgICAgcF90ZXN0LT5maWxlbmFtZSA9IG9wdGFyZzsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJS0yNXMlc1xuIiwgIklucHV0IGltYWdlIHBhdGgiLCBwX3Rlc3QtPmZpbGVuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1cnOgorICAgICAgcF90ZXN0LT53aWR0aCA9IGF0b2kob3B0YXJnKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJS0yNXMlZFxuIiwgIkRlZmF1bHQgd2lkdGgiLCBwX3Rlc3QtPndpZHRoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0gnOgorICAgICAgcF90ZXN0LT5oZWlnaHQgPSBhdG9pKG9wdGFyZyk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUtMjVzJWRcbiIsICJEZWZhdWx0IGhlaWdodCIsIHBfdGVzdC0+aGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ0YnOiB7CisgICAgICBpbnQgZm9ybWF0ID0gMDsKKyAgICAgIGZvcm1hdCA9IGF0b2kob3B0YXJnKTsKKyAgICAgIGludCBudW1fZm9ybWF0cyA9IEFSUl9TWihjb2xfZm9ybWF0cyk7CisgICAgICBmb3JtYXQgPSBDTEFNUChmb3JtYXQsIDAsIG51bV9mb3JtYXRzKTsKKyAgICAgIHBfdGVzdC0+Zm9ybWF0ID0gY29sX2Zvcm1hdHNbZm9ybWF0XS5lQ29sb3JGb3JtYXQ7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUtMjVzJXNcbiIsICJEZWZhdWx0IGltYWdlIGZvcm1hdCIsCisgICAgICAgIGNvbF9mb3JtYXRzW2Zvcm1hdF0uZm9ybWF0X3N0cik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDo7CisgICAgfQorICB9CisgIGlmICghcF90ZXN0LT5maWxlbmFtZSB8fCAhcF90ZXN0LT5maWxlbmFtZSB8fCAhcF90ZXN0LT53aWR0aCB8fAorICAgICAgIXBfdGVzdC0+aGVpZ2h0KSB7CisgICAgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50cy5cbiIpOworICAgIG9teF90ZXN0X2RlY19wcmludF91c2FnZSgpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfdGVzdChqcGVnX3Rlc3RfaW5wdXRfdCAqcF9pbnB1dCkKK3sKKyAgaW50IHJjID0gMDsKKyAgbW1fanBlZ2RlY19pbnRmX3Rlc3RfdCBqcGVnX29iajsKKyAgaW50IGkgPSAwOworCisgIG1lbXNldCgmanBlZ19vYmosIDB4MCwgc2l6ZW9mKGpwZWdfb2JqKSk7CisgIHJjID0gZGVjb2RlX2luaXQocF9pbnB1dCwgJmpwZWdfb2JqKTsKKyAgaWYgKHJjKSB7CisgICAgTE9HRSgiRXJyb3IiKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBqcGVnX29iai5oYW5kbGUgPSBqcGVnZGVjX29wZW4oJmpwZWdfb2JqLm9wcyk7CisgIGlmIChqcGVnX29iai5oYW5kbGUgPT0gMCkgeworICAgIExPR0UoIkVycm9yIik7CisgICAgZ290byBlbmQ7CisgIH0KKworICByYyA9IGpwZWdfb2JqLm9wcy5jcmVhdGVfc2Vzc2lvbihqcGVnX29iai5oYW5kbGUsICZqcGVnX29iai5wYXJhbXMsCisgICAgJmpwZWdfb2JqLmpvYi5kZWNvZGVfam9iLnNlc3Npb25faWQpOworICBpZiAoanBlZ19vYmouam9iLmRlY29kZV9qb2Iuc2Vzc2lvbl9pZCA9PSAwKSB7CisgICAgTE9HRSgiRXJyb3IiKTsKKyAgICBnb3RvIGVuZDsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBnX2NvdW50OyBpKyspIHsKKyAgICBqcGVnX29iai5qb2Iuam9iX3R5cGUgPSBKUEVHX0pPQl9UWVBFX0RFQ09ERTsKKworICAgIExPR0UoIlN0YXJ0aW5nIGRlY29kZSBqb2IiKTsKKyAgICBnZXR0aW1lb2ZkYXkoJmR0aW1lWzBdLCBOVUxMKTsKKworICAgIGZwcmludGYoc3RkZXJyLCAiU3RhcnRpbmcgZGVjb2RlIG9mICVzIGludG8gJXMgb3V0dyAlZCBvdXRoICVkXG5cbiIsCisgICAgICAgIHBfaW5wdXQtPmZpbGVuYW1lLCBwX2lucHV0LT5vdXRfZmlsZW5hbWUsCisgICAgICAgIHBfaW5wdXQtPndpZHRoLCBwX2lucHV0LT5oZWlnaHQpOworICAgIHJjID0ganBlZ19vYmoub3BzLnN0YXJ0X2pvYigmanBlZ19vYmouam9iLCAmanBlZ19vYmouam9iX2lkW2ldKTsKKyAgICBpZiAocmMpIHsKKyAgICAgIExPR0UoIkVycm9yIik7CisgICAgICBnb3RvIGVuZDsKKyAgICB9CisgIH0KKworICAvKgorICB1c2xlZXAoNSk7CisgIGpwZWdfb2JqLm9wcy5hYm9ydF9qb2IoanBlZ19vYmouam9iX2lkWzBdKTsKKyAgKi8KKyAgcHRocmVhZF9tdXRleF9sb2NrKCZqcGVnX29iai5sb2NrKTsKKyAgcHRocmVhZF9jb25kX3dhaXQoJmpwZWdfb2JqLmNvbmQsICZqcGVnX29iai5sb2NrKTsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJmpwZWdfb2JqLmxvY2spOworCisgIGZwcmludGYoc3RkZXJyLCAiRGVjb2RlIHRpbWUgJWxsdSBtc1xuIiwKKyAgICAgICgoVElNRV9JTl9VUyhkdGltZVsxXSkgLSBUSU1FX0lOX1VTKGR0aW1lWzBdKSkvMTAwMCkpOworCisKKyAganBlZ19vYmoub3BzLmRlc3Ryb3lfc2Vzc2lvbihqcGVnX29iai5qb2IuZGVjb2RlX2pvYi5zZXNzaW9uX2lkKTsKKworICBqcGVnX29iai5vcHMuY2xvc2UoanBlZ19vYmouaGFuZGxlKTsKKworCitlbmQ6CisgIG1tX2pwZWdkZWNfdGVzdF9mcmVlKCZqcGVnX29iai5pbnB1dCk7CisgIG1tX2pwZWdkZWNfdGVzdF9mcmVlKCZqcGVnX29iai5vdXRwdXQpOworICByZXR1cm4gMDsKK30KKworLyoqIG1haW46CisgKgorICogIEFyZ3VtZW50czoKKyAqICAgIEBhcmdjCisgKiAgICBAYXJndgorICoKKyAqICBSZXR1cm46CisgKiAgICAgICAwIG9yIC12ZSB2YWx1ZXMKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICAgICBtYWluIGZ1bmN0aW9uCisgKgorICoqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkKK3sKKyAganBlZ190ZXN0X2lucHV0X3QgZGVjX3Rlc3RfaW5wdXQ7CisgIGludCByZXQ7CisKKyAgbWVtc2V0KCZkZWNfdGVzdF9pbnB1dCwgMCwgc2l6ZW9mKGRlY190ZXN0X2lucHV0KSk7CisgIHJldCA9IG1tX2pwZWdkZWNfdGVzdF9nZXRfaW5wdXQoYXJnYywgYXJndiwgJmRlY190ZXN0X2lucHV0KTsKKworICBpZiAocmV0KSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIGRlY29kZV90ZXN0KCZkZWNfdGVzdF9pbnB1dCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWxpYjJkLWludGVyZmFjZS9BbmRyb2lkLm1rIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWxpYjJkLWludGVyZmFjZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NmYwNGEKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tbGliMmQtaW50ZXJmYWNlL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzOSBAQAorT0xEX0xPQ0FMX1BBVEggOj0gJChMT0NBTF9QQVRIKQorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoTE9DQUxfUEFUSCkvLi4vLi4vLi4vY29tbW9uLm1rCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfMzJfQklUX09OTFkgOj0gJChCT0FSRF9RVElfQ0FNRVJBXzMyQklUX09OTFkpCitMT0NBTF9DRkxBR1MrPSAtRF9BTkRST0lEXyAtRFFDQU1FUkFfUkVERUZJTkVfTE9HCisKK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IgLVduby11bnVzZWQtcGFyYW1ldGVyCisKK0xPQ0FMX0NfSU5DTFVERVMrPSAkKGtlcm5lbF9pbmNsdWRlcykKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoY29tbW9uX2RlcHMpCisKK0lNR0xJQl9IRUFERVJfUEFUSCA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvaW5jbHVkZS9tbS1jYW1lcmEvaW1nbGliCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoSU1HTElCX0hFQURFUl9QQVRIKSBcCisgICAgJChMT0NBTF9QQVRIKS9pbmMgXAorICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uIFwKKyAgICAkKExPQ0FMX1BBVEgpLy4uL21tLWNhbWVyYS1pbnRlcmZhY2UvaW5jIFwKKworaWZlcSAoJChzdHJpcCAkKFRBUkdFVF9VU0VTX0lPTikpLHRydWUpCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1EVVNFX0lPTgorZW5kaWYKKworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIHNyYy9tbV9saWIyZC5jCisKK0xPQ0FMX01PRFVMRSAgICAgICAgICAgOj0gbGlibW1saWIyZF9pbnRlcmZhY2UKK0xPQ0FMX1BSRUxJTktfTU9EVUxFICAgOj0gZmFsc2UKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliZGwgbGliY3V0aWxzIGxpYmxvZyBsaWJtbWNhbWVyYV9pbnRlcmZhY2UKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9ICQoQk9BUkRfUVRJX0NBTUVSQV8zMkJJVF9PTkxZKQoraW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCitMT0NBTF9QQVRIIDo9ICQoT0xEX0xPQ0FMX1BBVEgpCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvc3RhY2svbW0tbGliMmQtaW50ZXJmYWNlL2luYy9tbV9saWIyZC5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWxpYjJkLWludGVyZmFjZS9pbmMvbW1fbGliMmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWU2OWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWxpYjJkLWludGVyZmFjZS9pbmMvbW1fbGliMmQuaApAQCAtMCwwICsxLDIwOSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIE1NX0xJQjJEX0hfCisjZGVmaW5lIE1NX0xJQjJEX0hfCisKKyNpbmNsdWRlICJjYW1fdHlwZXMuaCIKKyNpZmRlZiBRQ0FNRVJBX1JFREVGSU5FX0xPRworI2lmbmRlZiBDQU1fTU9EVUxFCisjZGVmaW5lIENBTV9NT0RVTEUgQ0FNX05PX01PRFVMRQorI2VuZGlmCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorI2VuZGlmCisKKy8qKiBsaWIyZF9lcnJvcgorICogQE1NX0xJQjJEX1NVQ0NFU1M6IFN1Y2Nlc3MKKyAqIEBNTV9MSUIyRF9FUlJfR0VORVJBTDogR2VuZXJhbCBFcnJvcgorICogQE1NX0xJQjJEX0VSUl9NRU1PUlk6IEluc3VmZmljaWVudCBtZW1vcnkgZXJyb3IKKyAqIEBNTV9MSUIyRF9FUlJfQkFEX1BBUkFNOiBCYWQgcGFyYW1zIGVycm9yCisqKi8KK3R5cGVkZWYgZW51bSBsaWIyZF9lcnJvcl90IHsKKyAgTU1fTElCMkRfU1VDQ0VTUywKKyAgTU1fTElCMkRfRVJSX0dFTkVSQUwsCisgIE1NX0xJQjJEX0VSUl9NRU1PUlksCisgIE1NX0xJQjJEX0VSUl9CQURfUEFSQU0sCit9IGxpYjJkX2Vycm9yOworCisvKiogbGliMmRfbW9kZQorICogQE1NX0xJQjJEX1NZTkNfTU9ERTogU3luY2hyb25vdXMgbW9kZQorICogQE1NX0xJQjJEX0FTWU5DX01PREU6IEFzeW5jaHJvbm91cyBtb2RlCisqKi8KK3R5cGVkZWYgZW51bSBtbV9saWIyZF9tb2RlX3QgeworICBNTV9MSUIyRF9TWU5DX01PREUsCisgIE1NX0xJQjJEX0FTWU5DX01PREUsCit9IGxpYjJkX21vZGU7CisKKy8qKiBtbV9saWIyZF9idWZmZXJfdHlwZQorICogQE1NX0xJQjJEX0JVRkZFUl9UWVBFX1JHQjogUkdCIEJ1ZmZlciB0eXBlCisgKiBATU1fTElCMkRfQlVGRkVSX1RZUEVfWVVWOiBZVVYgYnVmZmVyIHR5cGUKKyoqLwordHlwZWRlZiBlbnVtIG1tX2xpYjJkX2J1ZmZlcl90eXBlX3QgeworICBNTV9MSUIyRF9CVUZGRVJfVFlQRV9SR0IsCisgIE1NX0xJQjJEX0JVRkZFUl9UWVBFX1lVViwKK30gbW1fbGliMmRfYnVmZmVyX3R5cGU7CisKKy8qKiBtbV9saWIyZF9yZ2JfYnVmZmVyCisgKiBAZmQ6IGhhbmRsZSB0byB0aGUgYnVmZmVyIG1lbW9yeQorICogQGZvcm1hdDogUkdCIGNvbG9yIGZvcm1hdAorICogQHdpZHRoOiBkZWZpbmVzIHdpZHRoIGluIHBpeGVscworICogQGhlaWdodDogZGVmaW5lcyBoZWlnaHQgaW4gcGl4ZWxzCisgKiBAYnVmZmVyOiBwb2ludGVyIHRvIHRoZSBSR0IgYnVmZmVyCisgKiBAcGh5czogZ3B1IG1hcHBlZCBwaHlzaWNhbCBhZGRyZXNzCisgKiBAc3RyaWRlOiBkZWZpbmVzIHN0cmlkZSBpbiBieXRlcworKiovCit0eXBlZGVmIHN0cnVjdCBtbV9saWIyZF9yZ2JfYnVmZmVyX3QgeworICBpbnQzMl90ICAgICAgZmQ7CisgIGNhbV9mb3JtYXRfdCBmb3JtYXQ7CisgIHVpbnQzMl90ICAgICB3aWR0aDsKKyAgdWludDMyX3QgICAgIGhlaWdodDsKKyAgdm9pZCAgICAgICAgKmJ1ZmZlcjsKKyAgdm9pZCAgICAgICAgKnBoeXM7CisgIGludDMyX3QgICAgICBzdHJpZGU7Cit9IG1tX2xpYjJkX3JnYl9idWZmZXI7CisKKy8qKiBtbV9saWIyZF95dXZfYnVmZmVyCisgKiBAZmQ6IGhhbmRsZSB0byB0aGUgYnVmZmVyIG1lbW9yeQorICogQGZvcm1hdDogWVVWIGNvbG9yIGZvcm1hdAorICogQHdpZHRoOiBkZWZpbmVzIHdpZHRoIGluIHBpeGVscworICogQGhlaWdodDogZGVmaW5lcyBoZWlnaHQgaW4gcGl4ZWxzCisgKiBAcGxhbmUwOiBob2xkcyB0aGUgd2hvbGUgYnVmZmVyIGlmIFlVViBmb3JtYXQgaXMgbm90IHBsYW5hcgorICogQHBoeXMwOiBncHUgbWFwcGVkIHBoeXNpY2FsIGFkZHJlc3MKKyAqIEBzdHJpZGUwOiBzdHJpZGUgaW4gYnl0ZXMKKyAqIEBwbGFuZTE6IGhvbGRzIFVWIG9yIFZVIHBsYW5lIGZvciBwbGFuYXIgaW50ZXJsZWF2ZWQKKyAqIEBwaHlzMjogZ3B1IG1hcHBlZCBwaHlzaWNhbCBhZGRyZXNzCisgKiBAc3RyaWRlMTogc3RyaWRlIGluIGJ5dGVzCisgKiBAcGxhbmUyOiBob2xkcyB0aGUgMy4gcGxhbmUsIGlnbm9yZWQgaWYgWVVWIGZvcm1hdCBpcyBub3QgcGxhbmFyCisgKiBAcGh5czI6IGdwdSBtYXBwZWQgcGh5c2ljYWwgYWRkcmVzcworICogQHN0cmlkZTI6IHN0cmlkZSBpbiBieXRlcworKiovCit0eXBlZGVmIHN0cnVjdCBtbV9saWIyZF95dXZfYnVmZmVyX3QgeworICBpbnQzMl90ICAgICAgZmQ7CisgIGNhbV9mb3JtYXRfdCBmb3JtYXQ7CisgIHVpbnQzMl90ICAgICB3aWR0aDsKKyAgdWludDMyX3QgICAgIGhlaWdodDsKKyAgdm9pZCAgICAgICAgKnBsYW5lMDsKKyAgdm9pZCAgICAgICAgKnBoeXMwOworICBpbnQzMl90ICAgICAgc3RyaWRlMDsKKyAgdm9pZCAgICAgICAgKnBsYW5lMTsKKyAgdm9pZCAgICAgICAgKnBoeXMxOworICBpbnQzMl90ICAgICAgc3RyaWRlMTsKKyAgdm9pZCAgICAgICAgKnBsYW5lMjsKKyAgdm9pZCAgICAgICAgKnBoeXMyOworICBpbnQzMl90ICAgICAgc3RyaWRlMjsKK30gbW1fbGliMmRfeXV2X2J1ZmZlcjsKKworLyoqIG1tX2xpYjJkX2J1ZmZlcgorICogQGJ1ZmZlcl90eXBlOiBCdWZmZXIgdHlwZS4gd2hldGhlciBSR0Igb3IgWVVWCisgKiBAcmdiX2J1ZmZlcjogUkdCIGJ1ZmZlciBoYW5kbGUKKyAqIEB5dXZfYnVmZmVyOiBZVVYgYnVmZmVyIGhhbmRsZQorKiovCit0eXBlZGVmIHN0cnVjdCBtbV9saWIyZF9idWZmZXJfdCB7CisgIG1tX2xpYjJkX2J1ZmZlcl90eXBlIGJ1ZmZlcl90eXBlOworICB1bmlvbiB7CisgICAgbW1fbGliMmRfcmdiX2J1ZmZlciByZ2JfYnVmZmVyOworICAgIG1tX2xpYjJkX3l1dl9idWZmZXIgeXV2X2J1ZmZlcjsKKyAgfTsKK30gbW1fbGliMmRfYnVmZmVyOworCisvKiogbGliMmRfY2xpZW50X2NiCisgKiBAdXNlcmRhdGE6IEFwcCB1c2VyZGF0YQorICogQGpvYmlkOiBqb2IgaWQKKyoqLwordHlwZWRlZiBsaWIyZF9lcnJvciAoKmxpYjJkX2NsaWVudF9jYikgKHZvaWQgKnVzZXJkYXRhLCBpbnQgam9iaWQpOworCisvKioKKyAqIEZ1bmN0aW9uOiBtbV9saWIyZF9pbml0CisgKgorICogRGVzY3JpcHRpb246IEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciBMaWIyRC4gc3JjX2Zvcm1hdCwgZHN0X2Zvcm1hdAorICogICAgIGFyZSBoaW50cyB0byB0aGUgdW5kZXJseWluZyBjb21wb25lbnQgdG8gaW5pdGlhbGl6ZS4KKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogICBtb2RlIC0gTW9kZSAoc3luYy9hc3luYykgaW4gd2hpY2ggQXBwIHdhbnRzIGxpYjJkIHRvIHJ1bi4KKyAqICAgc3JjX2Zvcm1hdCAtIHNvdXJjZSBzdXJmYWNlIGZvcm1hdAorICogICBkc3RfZm9ybWF0IC0gRGVzdGluYXRpb24gc3VyZmFjZSBmb3JtYXQKKyAqICAgbXlfb2JqIC0gaGFuZGxlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBvbiBzdWNjZXNmdWwgSW5pdC4gQXBwIGhhcyB0bworICogICAgICAgY2FsbCBvdGhlciBsaWIyZCBmdW5jdGlvbnMgYnkgcGFzc2luZyB0aGlzIGhhbmRsZS4KKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogICBNTV9MSUIyRF9TVUNDRVNTCisgKiAgIE1NX0xJQjJEX0VSUl9NRU1PUlkKKyAqICAgTU1fTElCMkRfRVJSX0JBRF9QQVJBTQorICogICBNTV9MSUIyRF9FUlJfR0VORVJBTAorICoKKyAqIE5vdGVzOiBub25lCisgKiovCitsaWIyZF9lcnJvciBtbV9saWIyZF9pbml0KGxpYjJkX21vZGUgbW9kZSwgY2FtX2Zvcm1hdF90IHNyY19mb3JtYXQsCisgIGNhbV9mb3JtYXRfdCBkc3RfZm9ybWF0LCB2b2lkICoqbGliMmRfb2JqX2hhbmRsZSk7CisKKy8qKgorICogRnVuY3Rpb246IG1tX2xpYjJkX2RlaW5pdAorICoKKyAqIERlc2NyaXB0aW9uOiBEZS1Jbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgTGliMkQKKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogICBsaWIyZF9vYmpfaGFuZGxlIC0gaGFuZGxlIHR0byB0aGUgbGliMmQgb2JqZWN0CisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgTU1fTElCMkRfU1VDQ0VTUworICogICBNTV9MSUIyRF9FUlJfR0VORVJBTAorICoKKyAqIE5vdGVzOiBub25lCisgKiovCitsaWIyZF9lcnJvciBtbV9saWIyZF9kZWluaXQodm9pZCAqbGliMmRfb2JqX2hhbmRsZSk7CisKKy8qKgorICogRnVuY3Rpb246IG1tX2xpYjJkX3N0YXJ0X2pvYgorICoKKyAqIERlc2NyaXB0aW9uOiBTdGFydCBleGVjdXRpbmcgdGhlIGpvYgorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIGxpYjJkX29ial9oYW5kbGUgLSBoYW5kbGUgdHRvIHRoZSBsaWIyZCBvYmplY3QKKyAqICAgc3JjX2J1ZmZlciAtIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBidWZmZXIKKyAqICAgZHN0X2J1ZmZlciAtIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICogICBqb2JpZCAtIGpvYiBpZCBvZiB0aGlzIHJlcXVlc3QKKyAqICAgdXNlcmRhdGEgLSB1c2VyZGF0YSB0aGF0IHdpbGwgYmUgcGFzcyB0aHJvdWdoIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiAgIGNiIC0gY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBvbiBjb21wbGV0aW9uIG9mIHRoaXMgam9iCisgKiAgIHJvdGF0aW9uIC0gcm90YXRpb24gdG8gYmUgYXBwbGllZAorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIE1NX0xJQjJEX1NVQ0NFU1MKKyAqICAgTU1fTElCMkRfRVJSX01FTU9SWQorICogICBNTV9MSUIyRF9FUlJfR0VORVJBTAorICoKKyAqIE5vdGVzOiBub25lCisgKiovCitsaWIyZF9lcnJvciBtbV9saWIyZF9zdGFydF9qb2Iodm9pZCAqbGliMmRfb2JqX2hhbmRsZSwKKyAgICBtbV9saWIyZF9idWZmZXIqIHNyY19idWZmZXIsIG1tX2xpYjJkX2J1ZmZlciogZHN0X2J1ZmZlciwKKyAgICBpbnQgam9iaWQsIHZvaWQgKnVzZXJkYXRhLCBsaWIyZF9jbGllbnRfY2IgY2IsIHVpbnQzMl90IHJvdGF0aW9uKTsKKworI2VuZGlmIC8qIE1NX0xJQjJEX0hfICovCisKKwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWxpYjJkLWludGVyZmFjZS9zcmMvbW1fbGliMmQuYyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1saWIyZC1pbnRlcmZhY2Uvc3JjL21tX2xpYjJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzMjJkMgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1saWIyZC1pbnRlcmZhY2Uvc3JjL21tX2xpYjJkLmMKQEAgLTAsMCArMSw2MDYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLy8gVG8gcmVtb3ZlCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiaW1nX2NvbW1vbi5oIgorI2luY2x1ZGUgImltZ19jb21wLmgiCisjaW5jbHVkZSAiaW1nX2NvbXBfZmFjdG9yeS5oIgorI2luY2x1ZGUgImltZ19idWZmZXIuaCIKKyNpbmNsdWRlICJsaWIyZC5oIgorI2luY2x1ZGUgIm1tX2xpYjJkLmgiCisjaW5jbHVkZSAiaW1nX21ldGEuaCIKKworLyoqIGxpYjJkX2pvYl9wcml2YXRlX2luZm8KKyAqIEBqb2JpZDogSm9iIGlkIG9mIHRoaXMgcHJvY2VzcyByZXF1ZXN0CisgKiBAdXNlcmRhdGE6IENsaWVudCB1c2VyZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIGNhbGxiYWNrCisgKiBAbGliMmRfY2xpZW50X2NiOiBBcHBsaWNhdGlvbidzIGNhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKKyAqICAgICB3aGljaCB3aWxsIGJlIGNhbGxlZCB1cG9uIGNvbXBsZXRpb24gb2YgY3VycmVudCBqb2IuCisqKi8KK3R5cGVkZWYgc3RydWN0IGxpYjJkX2pvYl9wcml2YXRlX2luZm9fdCB7CisgIGludCAgIGpvYmlkOworICB2b2lkICp1c2VyZGF0YTsKKyAgbGliMmRfZXJyb3IgKCpsaWIyZF9jbGllbnRfY2IpICh2b2lkICp1c2VyZGF0YSwgaW50IGpvYmlkKTsKK30gbGliMmRfam9iX3ByaXZhdGVfaW5mbzsKKworLyoqIGltZ19saWJfdAorICogQHB0cjogaGFuZGxlIHRvIGltZ2xpYiBsaWJyYXJ5CisgKiBAaW1nX2NvcmVfZ2V0X2NvbXA6IGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGltZ19jb3JlX2dldF9jb21wCisgKiBAaW1nX3dhaXRfZm9yX2NvbXBsZXRpb246IGZ1bmN0aW9uIHBvaW50ZXIgZm9yIGltZ193YWl0X2Zvcl9jb21wbGV0aW9uCisqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdm9pZCAqcHRyOworICBpbnQgKCppbWdfY29yZV9nZXRfY29tcCkgKGltZ19jb21wX3JvbGVfdCByb2xlLCBjaGFyICpuYW1lLAorICAgIGltZ19jb3JlX29wc190ICpwX29wcyk7CisgIGludCAoKmltZ193YWl0X2Zvcl9jb21wbGV0aW9uKSAocHRocmVhZF9jb25kX3QgKnBfY29uZCwKKyAgICBwdGhyZWFkX211dGV4X3QgKnBfbXV0ZXgsIGludDMyX3QgbXMpOworfSBpbWdfbGliX3Q7CisKKy8qKiBtbV9saWIyZF9vYmoKKyAqIEBjb3JlX29wczogaW1hZ2UgY29yZSBvcHMgc3RydWN0dXJlIGhhbmRsZQorICogQGNvbXA6IGNvbXBvbmVudCBzdHJ1Y3R1cmUgaGFuZGxlCisgKiBAY29tcF9tb2RlOiB1bmRlcmx5aW5nIGNvbXBvbmVudCBtb2RlCisgKiBAbGliMmRfbW9kZTogbGliMmQgbW9kZSByZXF1ZXN0ZWQgYnkgY2xpZW50CisgKiBAaW1nX2xpYjogaW1nbGliIGxpYnJhcnksIGZ1bmN0aW9uIHB0cnMgaGFuZGxlCisgKiBAbXV0ZXg6IGxpYjJkIG11dGV4IHVzZWQgZm9yIHN5bmNocm9uaXphdGlvbgorICogQGNvbmQ6IGxpYnJkIGNvbmQgdXNlZCBmb3Igc3luY2hyb25pemF0aW9uCisqKi8KK3R5cGVkZWYgc3RydWN0IG1tX2xpYjJkX29ial90IHsKKyAgaW1nX2NvcmVfb3BzX3QgICAgICBjb3JlX29wczsKKyAgaW1nX2NvbXBvbmVudF9vcHNfdCBjb21wOworICBpbWdfY29tcF9tb2RlX3QgICAgIGNvbXBfbW9kZTsKKyAgbGliMmRfbW9kZSAgICAgICAgICBsaWIyZF9tb2RlOworICBpbWdfbGliX3QgICAgICAgICAgIGltZ19saWI7CisgIHB0aHJlYWRfbXV0ZXhfdCAgICAgbXV0ZXg7CisgIHB0aHJlYWRfY29uZF90ICAgICAgY29uZDsKK30gbW1fbGliMmRfb2JqOworCisKKy8qKgorICogRnVuY3Rpb246IGxpYjJkX2V2ZW50X2hhbmRsZXIKKyAqCisgKiBEZXNjcmlwdGlvbjogRXZlbnQgaGFuZGxlci4gQWxsIHRoZSBjb21wb25lbnQgZXZlbnRzCisgKiAgICAgYXJlIHJlY2VpdmVkIGhlcmUuCisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICAgcF9hcHBkYXRhIC0gbGliMmQgdGVzdCBvYmplY3QKKyAqICAgcF9ldmVudCAtIHBvaW50ZXIgdG8gdGhlIGV2ZW50CisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgSU1HX1NVQ0NFU1MKKyAqICAgSU1HX0VSUl9JTlZBTElEX0lOUFVUCisgKgorICogTm90ZXM6IG5vbmUKKyAqKi8KK2ludCBsaWIyZF9ldmVudF9oYW5kbGVyKHZvaWQqIHBfYXBwZGF0YSwgaW1nX2V2ZW50X3QgKnBfZXZlbnQpCit7CisgIG1tX2xpYjJkX29iaiAqbGliMmRfb2JqID0gKG1tX2xpYjJkX29iaiAqKXBfYXBwZGF0YTsKKworICBpZiAoKE5VTEwgPT0gcF9ldmVudCkgfHwgKE5VTEwgPT0gcF9hcHBkYXRhKSkgeworICAgIExPR0UoImludmFsaWQgZXZlbnQiKTsKKyAgICByZXR1cm4gSU1HX0VSUl9JTlZBTElEX0lOUFVUOworICB9CisKKyAgTE9HRCgidHlwZSAlZCIsIHBfZXZlbnQtPnR5cGUpOworCisgIHN3aXRjaCAocF9ldmVudC0+dHlwZSkgeworICAgIGNhc2UgUUlNR19FVlRfRE9ORToKKyAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmxpYjJkX29iai0+Y29uZCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OjsKKyAgfQorICByZXR1cm4gSU1HX1NVQ0NFU1M7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGxpYjJkX2NhbGxiYWNrX2hhbmRsZXIKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2FsbGJhY2sgaGFuZGxlci4gUmVnaXN0ZXJlZCB3aXRoIENvbXBvbmVudAorICogICAgIG9uIElNR19DT01QX0lOSVQuIFdpbGwgYmUgY2FsbGVkIHdoZW4gcHJvY2Vzc2luZworICogICAgIG9mIGN1cnJlbnQgcmVxdWVzdCBpcyBjb21wbGV0ZWQuIElmIGNvbXBvbmVudCBydW5uaW5nIGluCisgKiAgICAgYXN5bmMgbW9kZSwgdGhpcyBpcyB3aGVyZSBjbGllbnQgd2lsbCBrbm93IHRoZSBleGVjdXRpb24KKyAqICAgICBpcyBmaW5pc2hlZCBmb3IgaW4sIG91dCBmcmFtZXMuCisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICAgcF9hcHBkYXRhIC0gbGliMmQgdGVzdCBvYmplY3QKKyAqICAgcF9pbl9mcmFtZSAtIHBvaW50ZXIgdG8gaW5wdXQgZnJhbWUKKyAqICAgcF9vdXRfZnJhbWUgLSBwb2ludGVyIHRvIG91dHB1dCBmcmFtZQorICogICBwX21ldGEgLSBwb2ludGVyIHRvIG1ldGEgZGF0YQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIElNR19TVUNDRVNTCisgKiAgIElNR19FUlJfR0VORVJBTAorICoKKyAqIE5vdGVzOiBub25lCisgKiovCitpbnQgbGliMmRfY2FsbGJhY2tfaGFuZGxlcih2b2lkICp1c2VyZGF0YSwgaW1nX2ZyYW1lX3QgKnBfaW5fZnJhbWUsCisgIGltZ19mcmFtZV90ICpwX291dF9mcmFtZSwgaW1nX21ldGFfdCAqcF9tZXRhKQoreworICBtbV9saWIyZF9vYmogKmxpYjJkX29iaiA9IChtbV9saWIyZF9vYmogKil1c2VyZGF0YTsKKyAgbGliMmRfam9iX3ByaXZhdGVfaW5mbyAqam9iX2luZm8gPSBOVUxMOworCisgIGlmIChOVUxMID09IHVzZXJkYXRhKSB7CisgICAgTE9HRSgiaW52YWxpZCBldmVudCIpOworICAgIHJldHVybiBJTUdfRVJSX0lOVkFMSURfSU5QVVQ7CisgIH0KKworICAvLyBhc3NlcnQocF9pbl9mcmFtZS0+cHJpdmF0ZV9kYXRhID09IHBfb3V0X2ZyYW1lLT5wcml2YXRlX2RhdGEpOworCisgIGpvYl9pbmZvID0gKGxpYjJkX2pvYl9wcml2YXRlX2luZm8gKilwX2luX2ZyYW1lLT5wcml2YXRlX2RhdGE7CisgIGlmIChqb2JfaW5mby0+bGliMmRfY2xpZW50X2NiICE9IE5VTEwpIHsKKyAgICBqb2JfaW5mby0+bGliMmRfY2xpZW50X2NiKGpvYl9pbmZvLT51c2VyZGF0YSwgam9iX2luZm8tPmpvYmlkKTsKKyAgfQorCisgIGZyZWUocF9pbl9mcmFtZS0+cHJpdmF0ZV9kYXRhKTsKKyAgZnJlZShwX2luX2ZyYW1lKTsKKyAgZnJlZShwX291dF9mcmFtZSk7CisgIGZyZWUocF9tZXRhKTsKKworICByZXR1cm4gSU1HX1NVQ0NFU1M7Cit9CisKKy8qKgorICogRnVuY3Rpb246IGxpYjJkX2ZpbGxfaW1nX2ZyYW1lCisgKgorICogRGVzY3JpcHRpb246IFNldHVwIGltZ19mcmFtZV90IGZvciBnaXZlbiBidWZmZXIKKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogICBwX2ZyYW1lIC0gcG9pbnRlciB0byBpbWdfZnJhbWVfdCB0aGF0IG5lZWRzIHRvIGJlIHNldHVwCisgKiAgIGxpYjJkX2J1ZmZlciAtIHBvaW50ZXIgdG8gaW5wdXQgYnVmZmVyCisgKiAgIGpvYmlkIC0gam9iIGlkCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgTU1fTElCMkRfU1VDQ0VTUworICogICBNTV9MSUIyRF9FUlJfR0VORVJBTAorICoKKyAqIE5vdGVzOiBub25lCisgKiovCitsaWIyZF9lcnJvciBsaWIyZF9maWxsX2ltZ19mcmFtZShpbWdfZnJhbWVfdCAqcF9mcmFtZSwKKyAgbW1fbGliMmRfYnVmZmVyKiBsaWIyZF9idWZmZXIsIGludCBqb2JpZCkKK3sKKyAgLy8gdXNlIGpvYiBpZCBmb3Igbm93CisgIHBfZnJhbWUtPmZyYW1lX2NudCA9IGpvYmlkOworICBwX2ZyYW1lLT5pZHggICAgICAgPSBqb2JpZDsKKyAgcF9mcmFtZS0+ZnJhbWVfaWQgID0gam9iaWQ7CisKKyAgaWYgKGxpYjJkX2J1ZmZlci0+YnVmZmVyX3R5cGUgPT0gTU1fTElCMkRfQlVGRkVSX1RZUEVfUkdCKSB7CisgICAgbW1fbGliMmRfcmdiX2J1ZmZlciAqcmdiX2J1ZmZlciA9ICZsaWIyZF9idWZmZXItPnJnYl9idWZmZXI7CisKKyAgICBwX2ZyYW1lLT5pbmZvLm51bV9wbGFuZXMgPSAxOworICAgIHBfZnJhbWUtPmluZm8ud2lkdGggICAgICA9IHJnYl9idWZmZXItPndpZHRoOworICAgIHBfZnJhbWUtPmluZm8uaGVpZ2h0ICAgICA9IHJnYl9idWZmZXItPmhlaWdodDsKKworICAgIHBfZnJhbWUtPmZyYW1lWzBdLnBsYW5lX2NudCA9IDE7CisgICAgcF9mcmFtZS0+ZnJhbWVbMF0ucGxhbmVbMF0ucGxhbmVfdHlwZSA9IFBMQU5FX0FSR0I7CisgICAgcF9mcmFtZS0+ZnJhbWVbMF0ucGxhbmVbMF0uYWRkciAgICAgICA9IHJnYl9idWZmZXItPmJ1ZmZlcjsKKyAgICBwX2ZyYW1lLT5mcmFtZVswXS5wbGFuZVswXS5zdHJpZGUgICAgID0gcmdiX2J1ZmZlci0+c3RyaWRlOworICAgIHBfZnJhbWUtPmZyYW1lWzBdLnBsYW5lWzBdLmxlbmd0aCAgICAgPSAocmdiX2J1ZmZlci0+c3RyaWRlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJnYl9idWZmZXItPmhlaWdodCk7CisgICAgcF9mcmFtZS0+ZnJhbWVbMF0ucGxhbmVbMF0uZmQgICAgICAgICA9IHJnYl9idWZmZXItPmZkOworICAgIHBfZnJhbWUtPmZyYW1lWzBdLnBsYW5lWzBdLmhlaWdodCAgICAgPSByZ2JfYnVmZmVyLT5oZWlnaHQ7CisgICAgcF9mcmFtZS0+ZnJhbWVbMF0ucGxhbmVbMF0ud2lkdGggICAgICA9IHJnYl9idWZmZXItPndpZHRoOworICAgIHBfZnJhbWUtPmZyYW1lWzBdLnBsYW5lWzBdLm9mZnNldCAgICAgPSAwOworICAgIHBfZnJhbWUtPmZyYW1lWzBdLnBsYW5lWzBdLnNjYW5saW5lICAgPSByZ2JfYnVmZmVyLT5oZWlnaHQ7CisgIH0gZWxzZSBpZiAobGliMmRfYnVmZmVyLT5idWZmZXJfdHlwZSA9PSBNTV9MSUIyRF9CVUZGRVJfVFlQRV9ZVVYpIHsKKyAgICBtbV9saWIyZF95dXZfYnVmZmVyICp5dXZfYnVmZmVyID0gJmxpYjJkX2J1ZmZlci0+eXV2X2J1ZmZlcjsKKworICAgIHBfZnJhbWUtPmluZm8ubnVtX3BsYW5lcyA9IDI7CisgICAgcF9mcmFtZS0+aW5mby53aWR0aCAgICAgID0geXV2X2J1ZmZlci0+d2lkdGg7CisgICAgcF9mcmFtZS0+aW5mby5oZWlnaHQgICAgID0geXV2X2J1ZmZlci0+aGVpZ2h0OworCisgICAgcF9mcmFtZS0+ZnJhbWVbMF0ucGxhbmVfY250ID0gMjsKKyAgICBwX2ZyYW1lLT5mcmFtZVswXS5wbGFuZVswXS5wbGFuZV90eXBlID0gUExBTkVfWTsKKyAgICBwX2ZyYW1lLT5mcmFtZVswXS5wbGFuZVswXS5hZGRyICAgICAgID0geXV2X2J1ZmZlci0+cGxhbmUwOworICAgIHBfZnJhbWUtPmZyYW1lWzBdLnBsYW5lWzBdLnN0cmlkZSAgICAgPSB5dXZfYnVmZmVyLT5zdHJpZGUwOworICAgIHBfZnJhbWUtPmZyYW1lWzBdLnBsYW5lWzBdLmxlbmd0aCAgICAgPSAoeXV2X2J1ZmZlci0+c3RyaWRlMCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXZfYnVmZmVyLT5oZWlnaHQpOworICAgIHBfZnJhbWUtPmZyYW1lWzBdLnBsYW5lWzBdLmZkICAgICAgICAgPSB5dXZfYnVmZmVyLT5mZDsKKyAgICBwX2ZyYW1lLT5mcmFtZVswXS5wbGFuZVswXS5oZWlnaHQgICAgID0geXV2X2J1ZmZlci0+aGVpZ2h0OworICAgIHBfZnJhbWUtPmZyYW1lWzBdLnBsYW5lWzBdLndpZHRoICAgICAgPSB5dXZfYnVmZmVyLT53aWR0aDsKKyAgICBwX2ZyYW1lLT5mcmFtZVswXS5wbGFuZVswXS5vZmZzZXQgICAgID0gMDsKKyAgICBwX2ZyYW1lLT5mcmFtZVswXS5wbGFuZVswXS5zY2FubGluZSAgID0geXV2X2J1ZmZlci0+aGVpZ2h0OworCisgICAgaWYgKHl1dl9idWZmZXItPmZvcm1hdCA9PSBDQU1fRk9STUFUX1lVVl80MjBfTlYxMikgeworICAgICAgcF9mcmFtZS0+ZnJhbWVbMF0ucGxhbmVbMV0ucGxhbmVfdHlwZSA9IFBMQU5FX0NCX0NSOworICAgIH0gZWxzZSBpZih5dXZfYnVmZmVyLT5mb3JtYXQgPT0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjEpIHsKKyAgICAgIHBfZnJhbWUtPmZyYW1lWzBdLnBsYW5lWzFdLnBsYW5lX3R5cGUgPSBQTEFORV9DUl9DQjsKKyAgICB9CisgICAgcF9mcmFtZS0+ZnJhbWVbMF0ucGxhbmVbMV0uYWRkciAgICAgICA9IHl1dl9idWZmZXItPnBsYW5lMTsKKyAgICBwX2ZyYW1lLT5mcmFtZVswXS5wbGFuZVsxXS5zdHJpZGUgICAgID0geXV2X2J1ZmZlci0+c3RyaWRlMTsKKyAgICBwX2ZyYW1lLT5mcmFtZVswXS5wbGFuZVsxXS5sZW5ndGggICAgID0gKHl1dl9idWZmZXItPnN0cmlkZTEgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2X2J1ZmZlci0+aGVpZ2h0IC8gMik7CisgICAgcF9mcmFtZS0+ZnJhbWVbMF0ucGxhbmVbMV0uZmQgICAgICAgICA9IHl1dl9idWZmZXItPmZkOworICAgIHBfZnJhbWUtPmZyYW1lWzBdLnBsYW5lWzFdLmhlaWdodCAgICAgPSB5dXZfYnVmZmVyLT5oZWlnaHQ7CisgICAgcF9mcmFtZS0+ZnJhbWVbMF0ucGxhbmVbMV0ud2lkdGggICAgICA9IHl1dl9idWZmZXItPndpZHRoOworICAgIHBfZnJhbWUtPmZyYW1lWzBdLnBsYW5lWzFdLm9mZnNldCAgICAgPSAwOworICAgIHBfZnJhbWUtPmZyYW1lWzBdLnBsYW5lWzFdLnNjYW5saW5lICAgPSB5dXZfYnVmZmVyLT5oZWlnaHQ7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE1NX0xJQjJEX0VSUl9HRU5FUkFMOworICB9CisKKyAgcmV0dXJuIE1NX0xJQjJEX1NVQ0NFU1M7Cit9CisKKy8qKgorICogRnVuY3Rpb246IG1tX2xpYjJkX2luaXQKKyAqCisgKiBEZXNjcmlwdGlvbjogSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gZm9yIExpYjJELiBzcmNfZm9ybWF0LCBkc3RfZm9ybWF0CisgKiAgICAgYXJlIGhpbnRzIHRvIHRoZSB1bmRlcmx5aW5nIGNvbXBvbmVudCB0byBpbml0aWFsaXplLgorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIG1vZGUgLSBNb2RlIChzeW5jL2FzeW5jKSBpbiB3aGljaCBBcHAgd2FudHMgbGliMmQgdG8gcnVuLgorICogICBzcmNfZm9ybWF0IC0gc291cmNlIHN1cmZhY2UgZm9ybWF0CisgKiAgIGRzdF9mb3JtYXQgLSBEZXN0aW5hdGlvbiBzdXJmYWNlIGZvcm1hdAorICogICBteV9vYmogLSBoYW5kbGUgdGhhdCB3aWxsIGJlIHJldHVybmVkIG9uIHN1Y2Nlc2Z1bCBJbml0LiBBcHAgaGFzIHRvCisgKiAgICAgICBjYWxsIG90aGVyIGxpYjJkIGZ1bmN0aW9ucyBieSBwYXNzaW5nIHRoaXMgaGFuZGxlLgorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIE1NX0xJQjJEX1NVQ0NFU1MKKyAqICAgTU1fTElCMkRfRVJSX01FTU9SWQorICogICBNTV9MSUIyRF9FUlJfQkFEX1BBUkFNCisgKiAgIE1NX0xJQjJEX0VSUl9HRU5FUkFMCisgKgorICogTm90ZXM6IG5vbmUKKyAqKi8KKworbGliMmRfZXJyb3IgbW1fbGliMmRfaW5pdChsaWIyZF9tb2RlIG1vZGUsIGNhbV9mb3JtYXRfdCBzcmNfZm9ybWF0LAorICBjYW1fZm9ybWF0X3QgZHN0X2Zvcm1hdCwgdm9pZCAqKm15X29iaikKK3sKKyAgaW50MzJfdCAgICAgICAgICAgICAgcmMgICAgICAgICA9IElNR19TVUNDRVNTOworICBtbV9saWIyZF9vYmogICAgICAgICpsaWIyZF9vYmogID0gTlVMTDsKKyAgaW1nX2NvcmVfb3BzX3QgICAgICAqcF9jb3JlX29wcyA9IE5VTEw7CisgIGltZ19jb21wb25lbnRfb3BzX3QgKnBfY29tcCAgICAgPSBOVUxMOworCisgIGlmIChteV9vYmogPT0gTlVMTCkgeworICAgIHJldHVybiBNTV9MSUIyRF9FUlJfQkFEX1BBUkFNOworICB9CisKKyAgLy8gdmFsaWRhdGUgc3JjX2Zvcm1hdCwgZHN0X2Zvcm1hdCB0byBjaGVjayB3aGV0aGVyIHdlIHN1cHBvcnQgdGhlc2UuCisgIC8vIEN1cnJlbnRseSBzdXBwb3J0IE5WMjEgdG8gQVJHQiBjb252ZXJzaW9ucyBvbmx5LiBPdGhlcnMgbm90IHRlc3RlZC4KKyAgaWYgKChzcmNfZm9ybWF0ICE9IENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxKSB8fAorICAgIChkc3RfZm9ybWF0ICE9IENBTV9GT1JNQVRfODg4OF9BUkdCKSkgeworICAgIExPR0UoIkZvcm1hdHMgY29udmVyc2lvbiBmcm9tICVkIHRvICVkIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICBzcmNfZm9ybWF0LCBkc3RfZm9ybWF0KTsKKyAgfQorCisgIGxpYjJkX29iaiA9IG1hbGxvYyhzaXplb2YobW1fbGliMmRfb2JqKSk7CisgIGlmIChsaWIyZF9vYmogPT0gTlVMTCkgeworICAgIHJldHVybiBNTV9MSUIyRF9FUlJfTUVNT1JZOworICB9CisKKyAgLy8gT3BlbiBsaWJtbWNhbWVyYV9pbWdsaWIKKyAgbGliMmRfb2JqLT5pbWdfbGliLnB0ciA9IGRsb3BlbigibGlibW1jYW1lcmFfaW1nbGliLnNvIiwgUlRMRF9OT1cpOworICBpZiAoIWxpYjJkX29iai0+aW1nX2xpYi5wdHIpIHsKKyAgICBMT0dFKCJFUlJPUjogY291bGRuJ3QgZGxvcGVuIGxpYm1tY2FtZXJhX2ltZ2xpYi5zbzogJXMiLAorICAgICAgIGRsZXJyb3IoKSk7CisgICAgZ290byBGUkVFX0xJQjJEX09CSjsKKyAgfQorCisgIC8qIEdldCBmdW5jdGlvbiBwb2ludGVyIGZvciBmdW5jdGlvbnMgc3VwcG9ydGVkIGJ5IEMyRCAqLworICAqKHZvaWQgKiopJmxpYjJkX29iai0+aW1nX2xpYi5pbWdfY29yZV9nZXRfY29tcCA9CisgICAgICBkbHN5bShsaWIyZF9vYmotPmltZ19saWIucHRyLCAiaW1nX2NvcmVfZ2V0X2NvbXAiKTsKKyAgKih2b2lkICoqKSZsaWIyZF9vYmotPmltZ19saWIuaW1nX3dhaXRfZm9yX2NvbXBsZXRpb24gPQorICAgICAgZGxzeW0obGliMmRfb2JqLT5pbWdfbGliLnB0ciwgImltZ193YWl0X2Zvcl9jb21wbGV0aW9uIik7CisKKyAgLyogVmFsaWRhdGUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgaWYgKChsaWIyZF9vYmotPmltZ19saWIuaW1nX2NvcmVfZ2V0X2NvbXAgPT0gTlVMTCkgfHwKKyAgICAobGliMmRfb2JqLT5pbWdfbGliLmltZ193YWl0X2Zvcl9jb21wbGV0aW9uID09IE5VTEwpKSB7CisgICAgTE9HRSgiIEVSUk9SIG1hcHBpbmcgc3ltYm9scyBmcm9tIGxpYmMyZDIuc28iKTsKKyAgICBnb3RvIEZSRUVfTElCMkRfT0JKOworICB9CisKKyAgcF9jb3JlX29wcyA9ICZsaWIyZF9vYmotPmNvcmVfb3BzOworICBwX2NvbXAgICAgID0gJmxpYjJkX29iai0+Y29tcDsKKworICBwdGhyZWFkX211dGV4X2luaXQoJmxpYjJkX29iai0+bXV0ZXgsIE5VTEwpOworICBwdGhyZWFkX2NvbmRfaW5pdCgmbGliMmRfb2JqLT5jb25kLCBOVUxMKTsKKworICByYyA9IGxpYjJkX29iai0+aW1nX2xpYi5pbWdfY29yZV9nZXRfY29tcChJTUdfQ09NUF9MSUIyRCwKKyAgICAicXRpLmxpYjJkIiwgcF9jb3JlX29wcyk7CisgIGlmIChyYyAhPSBJTUdfU1VDQ0VTUykgeworICAgIExPR0UoInJjICVkIiwgcmMpOworICAgIGdvdG8gRlJFRV9MSUIyRF9PQko7CisgIH0KKworICByYyA9IElNR19DT01QX0xPQUQocF9jb3JlX29wcywgTlVMTCk7CisgIGlmIChyYyAhPSBJTUdfU1VDQ0VTUykgeworICAgIExPR0UoInJjICVkIiwgcmMpOworICAgIGdvdG8gRlJFRV9MSUIyRF9PQko7CisgIH0KKworICByYyA9IElNR19DT01QX0NSRUFURShwX2NvcmVfb3BzLCBwX2NvbXApOworICBpZiAocmMgIT0gSU1HX1NVQ0NFU1MpIHsKKyAgICBMT0dFKCJyYyAlZCIsIHJjKTsKKyAgICBnb3RvIENPTVBfVU5MT0FEOworICB9CisKKyAgcmMgPSBJTUdfQ09NUF9JTklUKHBfY29tcCwgKHZvaWQgKilsaWIyZF9vYmosIGxpYjJkX2NhbGxiYWNrX2hhbmRsZXIpOworICBpZiAocmMgIT0gSU1HX1NVQ0NFU1MpIHsKKyAgICBMT0dFKCJyYyAlZCIsIHJjKTsKKyAgICBnb3RvIENPTVBfVU5MT0FEOworICB9CisKKyAgcmMgPSBJTUdfQ09NUF9TRVRfQ0IocF9jb21wLCBsaWIyZF9ldmVudF9oYW5kbGVyKTsKKyAgaWYgKHJjICE9IElNR19TVUNDRVNTKSB7CisgICAgTE9HRSgicmMgJWQiLCByYyk7CisgICAgZ290byBDT01QX0RFSU5JVDsKKyAgfQorCisgIGxpYjJkX29iai0+bGliMmRfbW9kZSA9IG1vZGU7CisgIGltZ19jb21wX21vZGVfdCBjb21wX21vZGU7CisgIGlmIChsaWIyZF9vYmotPmxpYjJkX21vZGUgPT0gTU1fTElCMkRfU1lOQ19NT0RFKSB7CisgICAgY29tcF9tb2RlID0gSU1HX1NZTkNfTU9ERTsKKyAgfSBlbHNlIHsKKyAgICBjb21wX21vZGUgPSBJTUdfQVNZTkNfTU9ERTsKKyAgfQorCisgIC8vIFNldCBzb3VyY2UgZm9ybWF0CisgIHJjID0gSU1HX0NPTVBfU0VUX1BBUkFNKHBfY29tcCwgUUxJQjJEX1NPVVJDRV9GT1JNQVQsICh2b2lkICopJnNyY19mb3JtYXQpOworICBpZiAocmMgIT0gSU1HX1NVQ0NFU1MpIHsKKyAgICBMT0dFKCJyYyAlZCIsIHJjKTsKKyAgICBnb3RvIENPTVBfREVJTklUOworICB9CisKKyAgLy8gU2V0IGRlc3RpbmF0aW9uIGZvcm1hdAorICByYyA9IElNR19DT01QX1NFVF9QQVJBTShwX2NvbXAsIFFMSUIyRF9ERVNUSU5BVElPTl9GT1JNQVQsCisgICAgKHZvaWQgKikmZHN0X2Zvcm1hdCk7CisgIGlmIChyYyAhPSBJTUdfU1VDQ0VTUykgeworICAgIExPR0UoInJjICVkIiwgcmMpOworICAgIGdvdG8gQ09NUF9ERUlOSVQ7CisgIH0KKworICAvLyBUcnkgc2V0dGluZyB0aGUgcmVxdWlyZWQgbW9kZS4KKyAgcmMgPSBJTUdfQ09NUF9TRVRfUEFSQU0ocF9jb21wLCBRSU1HX1BBUkFNX01PREUsICh2b2lkICopJmNvbXBfbW9kZSk7CisgIGlmIChyYyAhPSBJTUdfU1VDQ0VTUykgeworICAgIExPR0UoInJjICVkIiwgcmMpOworICAgIGdvdG8gQ09NUF9ERUlOSVQ7CisgIH0KKworICAvLyBHZXQgdGhlIG1vZGUgdG8gbWFrZSBzdXJlIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyByZWFsbHkgcnVubmluZworICAvLyBpbiB0aGUgbW9kZSB3aGF0IHdlIHNldC4KKyAgcmMgPSBJTUdfQ09NUF9HRVRfUEFSQU0ocF9jb21wLCBRSU1HX1BBUkFNX01PREUsCisgICAgKHZvaWQgKikmbGliMmRfb2JqLT5jb21wX21vZGUpOworICBpZiAocmMgIT0gSU1HX1NVQ0NFU1MpIHsKKyAgICBMT0dFKCJyYyAlZCIsIHJjKTsKKyAgICBnb3RvIENPTVBfREVJTklUOworICB9CisKKyAgaWYgKGNvbXBfbW9kZSAhPSBsaWIyZF9vYmotPmNvbXBfbW9kZSkgeworICAgIExPR0QoIkNvbXBvbmVudCBpcyBydW5uaW5nIGluICVkIG1vZGUiLAorICAgICAgbGliMmRfb2JqLT5jb21wX21vZGUpOworICB9CisKKyAgKm15X29iaiA9ICh2b2lkICopbGliMmRfb2JqOworCisgIHJldHVybiBNTV9MSUIyRF9TVUNDRVNTOworCitDT01QX0RFSU5JVCA6CisgIHJjID0gSU1HX0NPTVBfREVJTklUKHBfY29tcCk7CisgIGlmIChyYyAhPSBJTUdfU1VDQ0VTUykgeworICAgIExPR0UoInJjICVkIiwgcmMpOworICAgIHJldHVybiBNTV9MSUIyRF9FUlJfR0VORVJBTDsKKyAgfQorCitDT01QX1VOTE9BRCA6CisgIHJjID0gSU1HX0NPTVBfVU5MT0FEKHBfY29yZV9vcHMpOworICBpZiAocmMgIT0gSU1HX1NVQ0NFU1MpIHsKKyAgICBMT0dFKCJyYyAlZCIsIHJjKTsKKyAgICByZXR1cm4gTU1fTElCMkRfRVJSX0dFTkVSQUw7CisgIH0KKworRlJFRV9MSUIyRF9PQkogOgorICBmcmVlKGxpYjJkX29iaik7CisgIHJldHVybiBNTV9MSUIyRF9FUlJfR0VORVJBTDsKK30KKworLyoqCisgKiBGdW5jdGlvbjogbW1fbGliMmRfZGVpbml0CisgKgorICogRGVzY3JpcHRpb246IERlLUluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciBMaWIyRAorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIGxpYjJkX29ial9oYW5kbGUgLSBoYW5kbGUgdHRvIHRoZSBsaWIyZCBvYmplY3QKKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogICBNTV9MSUIyRF9TVUNDRVNTCisgKiAgIE1NX0xJQjJEX0VSUl9HRU5FUkFMCisgKgorICogTm90ZXM6IG5vbmUKKyAqKi8KK2xpYjJkX2Vycm9yIG1tX2xpYjJkX2RlaW5pdCh2b2lkICpsaWIyZF9vYmpfaGFuZGxlKQoreworICBtbV9saWIyZF9vYmogICAgICAgICpsaWIyZF9vYmogID0gKG1tX2xpYjJkX29iaiAqKWxpYjJkX29ial9oYW5kbGU7CisgIGludCAgICAgICAgICAgICAgICAgIHJjICAgICAgICAgPSBJTUdfU1VDQ0VTUzsKKyAgaW1nX2NvcmVfb3BzX3QgICAgICAqcF9jb3JlX29wcyA9ICZsaWIyZF9vYmotPmNvcmVfb3BzOworICBpbWdfY29tcG9uZW50X29wc190ICpwX2NvbXAgICAgID0gJmxpYjJkX29iai0+Y29tcDsKKworICByYyA9IElNR19DT01QX0RFSU5JVChwX2NvbXApOworICBpZiAocmMgIT0gSU1HX1NVQ0NFU1MpIHsKKyAgICBMT0dFKCJyYyAlZCIsIHJjKTsKKyAgICByZXR1cm4gTU1fTElCMkRfRVJSX0dFTkVSQUw7CisgIH0KKworICByYyA9IElNR19DT01QX1VOTE9BRChwX2NvcmVfb3BzKTsKKyAgaWYgKHJjICE9IElNR19TVUNDRVNTKSB7CisgICAgTE9HRSgicmMgJWQiLCByYyk7CisgICAgcmV0dXJuIE1NX0xJQjJEX0VSUl9HRU5FUkFMOworICB9CisKKyAgZGxjbG9zZShsaWIyZF9vYmotPmltZ19saWIucHRyKTsKKyAgZnJlZShsaWIyZF9vYmopOworCisgIHJldHVybiBNTV9MSUIyRF9TVUNDRVNTOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBtbV9saWIyZF9zdGFydF9qb2IKKyAqCisgKiBEZXNjcmlwdGlvbjogU3RhcnQgZXhlY3V0aW5nIHRoZSBqb2IKKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogICBsaWIyZF9vYmpfaGFuZGxlIC0gaGFuZGxlIHR0byB0aGUgbGliMmQgb2JqZWN0CisgKiAgIHNyY19idWZmZXIgLSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgYnVmZmVyCisgKiAgIGRzdF9idWZmZXIgLSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqICAgam9iaWQgLSBqb2IgaWQgb2YgdGhpcyByZXF1ZXN0CisgKiAgIHVzZXJkYXRhIC0gdXNlcmRhdGEgdGhhdCB3aWxsIGJlIHBhc3MgdGhyb3VnaCBjYWxsYmFjayBmdW5jdGlvbgorICogICBjYiAtIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgb24gY29tcGxldGlvbiBvZiB0aGlzIGpvYgorICogICByb3RhdGlvbiAtIHJvdGF0aW9uIHRvIGJlIGFwcGxpZWQKKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogICBNTV9MSUIyRF9TVUNDRVNTCisgKiAgIE1NX0xJQjJEX0VSUl9NRU1PUlkKKyAqICAgTU1fTElCMkRfRVJSX0dFTkVSQUwKKyAqCisgKiBOb3Rlczogbm9uZQorICoqLworbGliMmRfZXJyb3IgbW1fbGliMmRfc3RhcnRfam9iKHZvaWQgKmxpYjJkX29ial9oYW5kbGUsCisgIG1tX2xpYjJkX2J1ZmZlciogc3JjX2J1ZmZlciwgbW1fbGliMmRfYnVmZmVyKiBkc3RfYnVmZmVyLAorICBpbnQgam9iaWQsIHZvaWQgKnVzZXJkYXRhLCBsaWIyZF9jbGllbnRfY2IgY2IsIHVpbnQzMl90IHJvdGF0aW9uKQoreworICBtbV9saWIyZF9vYmogICAgICAgICpsaWIyZF9vYmogID0gKG1tX2xpYjJkX29iaiAqKWxpYjJkX29ial9oYW5kbGU7CisgIGludCAgICAgICAgICAgICAgICAgIHJjICAgICAgICAgPSBJTUdfU1VDQ0VTUzsKKyAgaW1nX2NvcmVfb3BzX3QgICAgICAqcF9jb3JlX29wcyA9ICZsaWIyZF9vYmotPmNvcmVfb3BzOworICBpbWdfY29tcG9uZW50X29wc190ICpwX2NvbXAgICAgID0gJmxpYjJkX29iai0+Y29tcDsKKworICBpbWdfZnJhbWVfdCAqcF9pbl9mcmFtZSA9IG1hbGxvYyhzaXplb2YoaW1nX2ZyYW1lX3QpKTsKKyAgaWYgKHBfaW5fZnJhbWUgPT0gTlVMTCkgeworICAgIHJldHVybiBNTV9MSUIyRF9FUlJfTUVNT1JZOworICB9CisKKyAgaW1nX2ZyYW1lX3QgKnBfb3V0X2ZyYW1lID0gbWFsbG9jKHNpemVvZihpbWdfZnJhbWVfdCkpOworICBpZiAocF9vdXRfZnJhbWUgPT0gTlVMTCkgeworICAgIGZyZWUocF9pbl9mcmFtZSk7CisgICAgcmV0dXJuIE1NX0xJQjJEX0VSUl9NRU1PUlk7CisgIH0KKworICBpbWdfbWV0YV90ICpwX21ldGEgPSBtYWxsb2Moc2l6ZW9mKGltZ19tZXRhX3QpKTsKKyAgaWYgKHBfbWV0YSA9PSBOVUxMKSB7CisgICAgZnJlZShwX2luX2ZyYW1lKTsKKyAgICBmcmVlKHBfb3V0X2ZyYW1lKTsKKyAgICByZXR1cm4gTU1fTElCMkRfRVJSX01FTU9SWTsKKyAgfQorCisgIGxpYjJkX2pvYl9wcml2YXRlX2luZm8gKnBfam9iX2luZm8gPSBtYWxsb2Moc2l6ZW9mKGxpYjJkX2pvYl9wcml2YXRlX2luZm8pKTsKKyAgaWYgKHBfb3V0X2ZyYW1lID09IE5VTEwpIHsKKyAgICBmcmVlKHBfaW5fZnJhbWUpOworICAgIGZyZWUocF9vdXRfZnJhbWUpOworICAgIGZyZWUocF9tZXRhKTsKKyAgICByZXR1cm4gTU1fTElCMkRfRVJSX01FTU9SWTsKKyAgfQorCisgIG1lbXNldChwX2luX2ZyYW1lLCAgMHgwLCBzaXplb2YoaW1nX2ZyYW1lX3QpKTsKKyAgbWVtc2V0KHBfb3V0X2ZyYW1lLCAweDAsIHNpemVvZihpbWdfZnJhbWVfdCkpOworICBtZW1zZXQocF9tZXRhLCAweDAsIHNpemVvZihpbWdfbWV0YV90KSk7CisgIG1lbXNldChwX2pvYl9pbmZvLCAgMHgwLCBzaXplb2YobGliMmRfam9iX3ByaXZhdGVfaW5mbykpOworCisgIC8vIEZpbGwgdXAgam9iIGluZm8gcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNhbiBiZSB1c2VkIGluIGNhbGxiYWNrIHRvCisgIC8vIGluZm9ybSBiYWNrIHRvIHRoZSBjbGllbnQuCisgIHBfam9iX2luZm8tPmpvYmlkICAgICAgICAgICA9IGpvYmlkOworICBwX2pvYl9pbmZvLT51c2VyZGF0YSAgICAgICAgPSB1c2VyZGF0YTsKKyAgcF9qb2JfaW5mby0+bGliMmRfY2xpZW50X2NiID0gY2I7CisKKyAgcF9pbl9mcmFtZS0+cHJpdmF0ZV9kYXRhICA9ICh2b2lkICopcF9qb2JfaW5mbzsKKyAgcF9vdXRfZnJhbWUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopcF9qb2JfaW5mbzsKKworICAvLyBjb252ZXJ0IHRoZSBpbnB1dCBpbmZvIGludG8gY29tcG9uZW50IHVuZGVyc3RhbmRibGUgZGF0YSBzdHJ1Y3R1cmVzCisKKyAgLy8gUHJlcGFyZSBJbnB1dCwgb3V0cHV0IGZyYW1lcworICBsaWIyZF9maWxsX2ltZ19mcmFtZShwX2luX2ZyYW1lLCBzcmNfYnVmZmVyLCBqb2JpZCk7CisgIGxpYjJkX2ZpbGxfaW1nX2ZyYW1lKHBfb3V0X2ZyYW1lLCBkc3RfYnVmZmVyLCBqb2JpZCk7CisKKyAgcF9tZXRhLT5mcmFtZV9pZCA9IGpvYmlkOworICBwX21ldGEtPnJvdGF0aW9uLmRldmljZV9yb3RhdGlvbiA9IChpbnQzMl90KXJvdGF0aW9uOworICBwX21ldGEtPnJvdGF0aW9uLmZyYW1lX3JvdGF0aW9uID0gKGludDMyX3Qpcm90YXRpb247CisKKyAgLy8gY2FsbCBzZXRfcGFyYW0gdG8gc2V0IHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uIGZvcm1hdHMKKworICByYyA9IElNR19DT01QX1FfQlVGKHBfY29tcCwgcF9pbl9mcmFtZSwgSU1HX0lOKTsKKyAgaWYgKHJjICE9IElNR19TVUNDRVNTKSB7CisgICAgTE9HRSgicmMgJWQiLCByYyk7CisgICAgZ290byBFUlJPUjsKKyAgfQorCisgIHJjID0gSU1HX0NPTVBfUV9CVUYocF9jb21wLCBwX291dF9mcmFtZSwgSU1HX09VVCk7CisgIGlmIChyYyAhPSBJTUdfU1VDQ0VTUykgeworICAgIExPR0UoInJjICVkIiwgcmMpOworICAgIGdvdG8gRVJST1I7CisgIH0KKworICByYyA9IElNR19DT01QX1FfTUVUQV9CVUYocF9jb21wLCBwX21ldGEpOworICBpZiAocmMgIT0gSU1HX1NVQ0NFU1MpIHsKKyAgICBMT0dFKCJyYyAlZCIsIHJjKTsKKyAgICBnb3RvIEVSUk9SOworICB9CisKKyAgcmMgPSBJTUdfQ09NUF9TVEFSVChwX2NvbXAsIE5VTEwpOworICBpZiAocmMgIT0gSU1HX1NVQ0NFU1MpIHsKKyAgICBMT0dFKCJyYyAlZCIsIHJjKTsKKyAgICBnb3RvIEVSUk9SOworICB9CisKKyAgaWYgKGxpYjJkX29iai0+bGliMmRfbW9kZSA9PSBNTV9MSUIyRF9TWU5DX01PREUpIHsKKyAgICBpZiAobGliMmRfb2JqLT5jb21wX21vZGUgPT0gSU1HX0FTWU5DX01PREUpIHsKKyAgICAgIExPR0QoImJlZm9yZSB3YWl0IHJjICVkIiwgcmMpOworICAgICAgcmMgPSBsaWIyZF9vYmotPmltZ19saWIuaW1nX3dhaXRfZm9yX2NvbXBsZXRpb24oJmxpYjJkX29iai0+Y29uZCwKKyAgICAgICAgJmxpYjJkX29iai0+bXV0ZXgsIDEwMDAwKTsKKyAgICAgIGlmIChyYyAhPSBJTUdfU1VDQ0VTUykgeworICAgICAgICBMT0dFKCJyYyAlZCIsIHJjKTsKKyAgICAgICAgZ290byBFUlJPUjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByYyA9IElNR19DT01QX0FCT1JUKHBfY29tcCwgTlVMTCk7CisgIGlmIChJTUdfRVJST1IocmMpKSB7CisgICAgTE9HRSgiY29tcCBhYm9ydCBmYWlsZWQgJWQiLCByYyk7CisgICAgcmV0dXJuIHJjOworICB9CisKKyAgcmV0dXJuIE1NX0xJQjJEX1NVQ0NFU1M7CitFUlJPUjoKKyAgZnJlZShwX2luX2ZyYW1lKTsKKyAgZnJlZShwX291dF9mcmFtZSk7CisgIGZyZWUocF9tZXRhKTsKKyAgZnJlZShwX2pvYl9pbmZvKTsKKworICByZXR1cm4gTU1fTElCMkRfRVJSX0dFTkVSQUw7Cit9CisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1saWIyZC1pbnRlcmZhY2UvdGVzdC9BbmRyb2lkLm1rIGIvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWxpYjJkLWludGVyZmFjZS90ZXN0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNjZDViNwotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1saWIyZC1pbnRlcmZhY2UvdGVzdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzcgQEAKKyNsaWIyZCBzYW1wbGUgdGVzdAorT0xEX0xPQ0FMX1BBVEggOj0gJChMT0NBTF9QQVRIKQorTU1fTElCMkRfVEVTVF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS8uLi8uLi9jb21tb24ubWsKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfUEFUSCA6PSAkKE1NX0xJQjJEX1RFU1RfUEFUSCkKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NGTEFHUyA6PSAtRENBTUVSQV9JT05fSEVBUF9JRD1JT05fSU9NTVVfSEVBUF9JRAorTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXh0cmEgLVdlcnJvciAtV25vLXVudXNlZC1wYXJhbWV0ZXIKK0xPQ0FMX0NGTEFHUyArPSAtRF9BTkRST0lEXworCitpZmVxICgkKHN0cmlwICQoVEFSR0VUX1VTRVNfSU9OKSksdHJ1ZSkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9JT04KK2VuZGlmCisKK0lNR0xJQl9IRUFERVJfUEFUSCA6PSAkKFRBUkdFVF9PVVRfSU5URVJNRURJQVRFUykvaW5jbHVkZS9tbS1jYW1lcmEvaW1nbGliCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoSU1HTElCX0hFQURFUl9QQVRIKSBcCisgICAgJChMT0NBTF9QQVRIKS8uLi8uLi9jb21tb24gXAorICAgICQoTE9DQUxfUEFUSCkvLi4vaW5jCisKK0xPQ0FMX0NfSU5DTFVERVMrPSAkKGtlcm5lbF9pbmNsdWRlcykKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoY29tbW9uX2RlcHMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBtbV9saWIyZF90ZXN0LmMKKworTE9DQUxfMzJfQklUX09OTFkgOj0gJChCT0FSRF9RVElfQ0FNRVJBXzMyQklUX09OTFkpCitMT0NBTF9NT0RVTEUgICAgICAgICAgIDo9IG1tLWxpYjJkLWludGVyZmFjZS10ZXN0CitMT0NBTF9QUkVMSU5LX01PRFVMRSAgIDo9IGZhbHNlCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmN1dGlscyBsaWJkbCBsaWJtbWxpYjJkX2ludGVyZmFjZQorCitpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworTE9DQUxfUEFUSCA6PSAkKE9MRF9MT0NBTF9QQVRIKQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3N0YWNrL21tLWxpYjJkLWludGVyZmFjZS90ZXN0L21tX2xpYjJkX3Rlc3QuYyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1saWIyZC1pbnRlcmZhY2UvdGVzdC9tbV9saWIyZF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA4YTRhNgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi9zdGFjay9tbS1saWIyZC1pbnRlcmZhY2UvdGVzdC9tbV9saWIyZF90ZXN0LmMKQEAgLTAsMCArMSw1NDMgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJpbWdfYnVmZmVyLmgiCisjaW5jbHVkZSAibW1fbGliMmQuaCIKKworCisjZGVmaW5lIEVOQUJMRV9PVVRQVVRfRFVNUCAxCisjZGVmaW5lIEFMSUdONEsgNDAzMgorI2RlZmluZSBBTElHTihhLCBiKSAoKChhKSArIChiKSkgJiB+KGIpKQorCisKKy8qKiBEVU1QX1RPX0ZJTEU6CisgKiAgQGZpbGVuYW1lOiBmaWxlIG5hbWUKKyAqICBAcF9hZGRyOiBhZGRyZXNzIG9mIHRoZSBidWZmZXIKKyAqICBAbGVuOiBidWZmZXIgbGVuZ3RoCisgKgorICogIGR1bXAgdGhlIGltYWdlIHRvIHRoZSBmaWxlCisgKiovCisjZGVmaW5lIERVTVBfVE9fRklMRShmaWxlbmFtZSwgcF9hZGRyLCBsZW4pICh7IFwKKyAgc2l6ZV90IHJjID0gMDsgXAorICBGSUxFICpmcCA9IGZvcGVuKGZpbGVuYW1lLCAidysiKTsgXAorICBpZiAoZnApIHsgXAorICAgIHJjID0gZndyaXRlKHBfYWRkciwgMSwgbGVuLCBmcCk7IFwKKyAgICBwcmludGYoIiBdIHdyaXR0ZW4gc2l6ZSAlenUgXG4iLCAgX19MSU5FX18sIGxlbik7IFwKKyAgICBmY2xvc2UoZnApOyBcCisgIH0gZWxzZSB7IFwKKyAgICBwcmludGYoIiBdIG9wZW4gJXMgZmFpbGVkIFxuIiwgIF9fTElORV9fLCBmaWxlbmFtZSk7IFwKKyAgfSBcCit9KQorCisvKiogRFVNUF9UT19GSUxFMjoKKyAqICBAZmlsZW5hbWU6IGZpbGUgbmFtZQorICogIEBwX2FkZHI6IGFkZHJlc3Mgb2YgdGhlIGJ1ZmZlcgorICogIEBsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCisgKiAgZHVtcCB0aGUgaW1hZ2UgdG8gdGhlIGZpbGUgaWYgdGhlIG1lbW9yeSBpcyBub24tY29udGlndW91cworICoqLworI2RlZmluZSBEVU1QX1RPX0ZJTEUyKGZpbGVuYW1lLCBwX2FkZHIxLCBsZW4xLCBwX2FkZHIyLCBsZW4yKSAoeyBcCisgIHNpemVfdCByYyA9IDA7IFwKKyAgRklMRSAqZnAgPSBmb3BlbihmaWxlbmFtZSwgIncrIik7IFwKKyAgaWYgKGZwKSB7IFwKKyAgICByYyA9IGZ3cml0ZShwX2FkZHIxLCAxLCBsZW4xLCBmcCk7IFwKKyAgICByYyA9IGZ3cml0ZShwX2FkZHIyLCAxLCBsZW4yLCBmcCk7IFwKKyAgICBwcmludGYoIiBdIHdyaXR0ZW4gJXp1ICV6dSBcbiIsICBfX0xJTkVfXywgbGVuMSwgbGVuMik7IFwKKyAgICBmY2xvc2UoZnApOyBcCisgIH0gZWxzZSB7IFwKKyAgICBwcmludGYoIiBdIG9wZW4gJXMgZmFpbGVkIFxuIiwgIF9fTElORV9fLCBmaWxlbmFtZSk7IFwKKyAgfSBcCit9KQorCisvKiogaW1nX2xpYl9idWZmZXJ0CisgKiBAcHRyOiBoYW5kbGUgdG8gdGhlIGltZ2xpYiBsaWJyYXJ5CisgKiBAaW1nX2J1ZmZlcl9nZXQ6IGZ1bmN0aW9uIHBvaW50ZXIgdG8gaW1nX2J1ZmZlcl9nZXQKKyAqIEBpbWdfYnVmZmVyX3JlbGVhc2U6IGZ1bmN0aW9uIHBvaW50ZXIgdG8gaW1nX2J1ZmZlcl9yZWxlYXNlCisgKiBAaW1nX2J1ZmZlcl9jYWNoZW9wczogZnVuY3Rpb24gcG9pbnRlciB0byBpbWdfYnVmZmVyX2NhY2hlb3BzCisqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgdm9pZCAqcHRyOworICBpbnQgKCppbWdfYnVmZmVyX2dldCkoaW1nX2J1Zl90eXBlX3QgdHlwZSwgaW50IGhlYXBpZCwgaW50OF90IGNhY2hlZCwgaW50IGxlbmd0aCwKKyAgICBpbWdfbWVtX2hhbmRsZV90ICpwX2hhbmRsZSk7CisgIGludCAoKmltZ19idWZmZXJfcmVsZWFzZSkoaW1nX21lbV9oYW5kbGVfdCAqcF9oYW5kbGUpOworICBpbnQgKCppbWdfYnVmZmVyX2NhY2hlb3BzKShpbWdfbWVtX2hhbmRsZV90ICpwX2hhbmRsZSwgaW1nX2NhY2hlX29wc190IG9wcywKKyAgaW1nX21lbV9hbGxvY190eXBlX3QgbWVtX2FsbG9jX3R5cGUpOworfSBpbWdfbGliX2J1ZmZlcnQ7CisKKy8qKiBpbnB1dF95dXZfZGF0YQorICogQGZpbGVuYW1lOiBpbnB1dCB0ZXN0IGZpbGVuYW1lCisgKiBAZm9ybWF0OiBmb3JtYXQgb2YgdGhlIGlucHV0IHl1diBmcmFtZQorICogQHdkaXRoOiB3ZGl0aCBvZiB0aGUgaW5wdXQgeXV2IGZyYW1lCisgKiBAaGVpZ2h0OiBoZWlnaHQgb2YgdGhlIGlucHV0IHl1diBmcmFtZQorICogQHN0cmlkZTogc3RyaWRlIG9mIHRoZSBpbnB1dCB5dXYgZnJhbWUKKyAqIEBvZmZzZXQ6IG9mZnNldCB0byB0aGUgeXV2IGRhdGEgaW4gdGhlIGlucHV0IGZpbGUKKyoqLwordHlwZWRlZiBzdHJ1Y3QgaW5wdXRfeXV2X2RhdGFfdCB7CisgIGNoYXIgZmlsZW5hbWVbNTEyXTsKKyAgY2FtX2Zvcm1hdF90IGZvcm1hdDsKKyAgaW50MzJfdCB3ZGl0aDsKKyAgaW50MzJfdCBoZWlnaHQ7CisgIGludDMyX3Qgc3RyaWRlOworICBpbnQzMl90IG9mZnNldDsKK30gaW5wdXRfeXV2X2RhdGE7CisKK2lucHV0X3l1dl9kYXRhIGlucHV0X252MjFbXSA9IHsKKyAgeyJzYW1wbGUwXzc2OHg1MTIueXV2IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCA3NjgsICA1MTIsICA3NjgsICAwfSwKKyAgeyJzYW1wbGUxXzMyMDB4MjQwMC55dXYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAzMjAwLCAyNDAwLCAzMjAwLCAwfSwKKyAgeyJzYW1wbGUyXzE5MjB4MTA4MC55dXYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAxOTIwLCAxMDgwLCAxOTIwLCAwfSwKKyAgeyJzYW1wbGUzXzMyMDB4MjQwMC55dXYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAzMjAwLCAyNDAwLCAzMjAwLCAwfSwKKyAgeyJzYW1wbGU0XzQyMDh4MzEyMC55dXYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCA0MjA4LCAzMTIwLCA0MjA4LCAwfSwKKyAgeyJzYW1wbGU1XzE5ODR4MjU5Mi55dXYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAxOTg0LCAyNTkyLCAxOTg0LCAwfSwKKyAgeyJzYW1wbGU2XzQwMDBfMzAwMC55dXYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCA0MDAwLCAzMDAwLCA0MDAwLCAwfSwKKyAgeyJzYW1wbGU3XzMyMDBfMjQwMC55dXYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAzMjAwLCAyNDAwLCAzMjAwLCAwfSwKKyAgeyJzYW1wbGU4XzMwMDhfNDAwMC55dXYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAzMDA4LCA0MDAwLCAzMDA4LCAwfSwKKyAgeyJzYW1wbGU5XzUzMTJ4Mjk4OC55dXYiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCA1MzEyLCAyOTg4LCA1MzEyLCAwfSwKKyAgeyJzYW1wbGUxMF80MTI4eDMwOTYueXV2IiwgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCA0MTI4LCAzMDk2LCA0MTI4LCAwfSwKKyAgeyJzYW1wbGUxMV80MjA4eDMxMjAueXV2IiwgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCA0MjA4LCAzMTIwLCA0MjA4LCAwfSwKKyAgeyJzYW1wbGUxMl8zMjAweDI0MDAueXV2IiwgICAgICAgICAgICAgICAgICAgICAgICAgIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAzMjAwLCAyNDAwLCAzMjAwLCAwfSwKKyAgeyJzYW1wbGUxM193aWR0aF8xMDgwX2hlaWdodF8xNDQwX3N0cmlkZV8xMDg4Lnl1diIsIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAxMDgwLCAxNDQwLCAxMDg4LCAwfSwKKyAgeyJzYW1wbGUxNF93aWR0aF8xMDgwX2hlaWdodF8xOTIwX3N0cmlkZV8xMDg4Lnl1diIsIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAxMDgwLCAxOTIwLCAxMDg4LCAwfSwKKyAgeyJzYW1wbGUxNV93aWR0aF8xOTQ0X2hlaWdodF8yNTkyX3N0cmlkZV8xOTg0Lnl1diIsIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAxOTQ0LCAyNTkyLCAxOTg0LCAwfSwKKyAgeyJzYW1wbGUxNl93aWR0aF8zMDAwX2hlaWdodF80MDAwX3N0cmlkZV8zMDA4Lnl1diIsIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAzMDAwLCA0MDAwLCAzMDA4LCAwfSwKKyAgeyJzYW1wbGUxN193aWR0aF8zMTIwX2hlaWdodF80MjA4X3N0cmlkZV8zMTM2Lnl1diIsIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAzMTIwLCA0MjA4LCAzMTM2LCAwfSwKKyAgeyJzYW1wbGUxOF93aWR0aF8zMjAwX2hlaWdodF8yNDAwX3N0cmlkZV8zMjAwLnl1diIsIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAzMjAwLCAyNDAwLCAzMjAwLCAwfSwKKyAgeyJzYW1wbGUxOV93aWR0aF8xOTQ0X2hlaWdodF8yNTkyX3N0cmlkZV8xOTg0Lnl1diIsIENBTV9GT1JNQVRfWVVWXzQyMF9OVjIxLCAxOTQ0LCAyNTkyLCAxOTg0LCAwfSwKK307CisKKy8vIGFzc3VtaW5nIGJ1ZmZlciBmb3JtYXQgaXMgYWx3YXlzIEFSR0IKK3ZvaWQgbGliMmRfZHVtcF90Z2Eodm9pZCAqYWRkciwgY2FtX2Zvcm1hdF90IGZvcm1hdCwgaW50IHdpZHRoLAorICBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBjaGFyICpmbmFtZSkKK3sKKyAgaW50IGksIGo7CisgIEZJTEUgKmY7CisgIHVuc2lnbmVkIGNoYXIgKnBiID0gKHVuc2lnbmVkIGNoYXIgKilhZGRyOworICB1aW50MzJfdCAqcGQgPSAodWludDMyX3QgKilhZGRyOworICBpbnQgYnBwID0gMzI7CisKKyAgZiA9IGZvcGVuKGZuYW1lLCAid2IiKTsKKyAgaWYgKGYpIHsKKyAgICAvLyBoZWFkZXIKKyAgICBmcHJpbnRmKGYsICIlYyVjJWMlYyIsIDAsIDAsIDIsIDApOworICAgIGZwcmludGYoZiwgIiVjJWMlYyVjIiwgMCwgMCwgMCwgMCk7CisgICAgZnByaW50ZihmLCAiJWMlYyVjJWMiLCAwLCAwLCAwLCAwKTsKKyAgICBmcHJpbnRmKGYsICIlYyVjJWMlYyIsIHdpZHRoICYgMHhmZiwgd2lkdGggPj4gOCwgaGVpZ2h0ICYgMHhmZiwgaGVpZ2h0ID4+IDgpOworICAgIGZwcmludGYoZiwgIiVjJWMiLCBicHAsIDMyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgZnByaW50ZihmLCAiJWMlYyVjJWMiLAorICAgICAgICAgIHBkWyhpKnN0cmlkZT4+Mikral0gJiAweGZmLCAgICAgICAgICAgLy8gYgorICAgICAgICAgIChwZFsoaSpzdHJpZGU+PjIpK2pdID4+IDgpICYgMHhmZiwgICAgLy8gZworICAgICAgICAgIChwZFsoaSpzdHJpZGU+PjIpK2pdID4+IDE2KSAmIDB4ZmYsICAgLy8gcgorICAgICAgICAgIChwZFsoaSpzdHJpZGU+PjIpK2pdID4+IDI0KSAmIDB4ZmYpOyAgLy8gYQorICAgICAgfQorICAgIH0KKyAgICBmY2xvc2UoZik7CisgIH0KK30KKworLyoqCisgKiBGdW5jdGlvbjogbGliMmRfdGVzdF9jbGllbnRfY2IKKyAqCisgKiBEZXNjcmlwdGlvbjogQ2FsbGJhY2sgdGhhdCBpcyBjYWxsZWQgb24gY29tcGxldGlvbiBvZiByZXF1ZXN0ZWQgam9iLgorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIHVzZXJkYXRhIC0gQXBwIHVzZXJkYXRhCisgKiAgIGpvYmlkIC0gam9iIGlkIHRoYXQgaXMgZmluaXNoZWQgZXhlY3V0aW9uCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgTU1fTElCMkRfU1VDQ0VTUworICogICBNTV9MSUIyRF9FUlJfR0VORVJBTAorICoKKyAqIE5vdGVzOiBub25lCisgKiovCitsaWIyZF9lcnJvciBsaWIyZF90ZXN0X2NsaWVudF9jYih2b2lkICp1c2VyZGF0YSwgaW50IGpvYmlkKQoreworICBwcmludGYoIiVzICVkLCBqb2JpZD0lZCBcbiIsICBfX0xJTkVfXywgam9iaWQpOworICByZXR1cm4gTU1fTElCMkRfU1VDQ0VTUzsKK30KKworLyoqCisgKiBGdW5jdGlvbjogbGliMmRfdGVzdF9sb2FkX2lucHV0X3l1dl9kYXRhCisgKgorICogRGVzY3JpcHRpb246IExvYWRzIHl1diBkYXRhIGZyb20gaW5wdXQgZmlsZS4KKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogICBmaWxlTmFtZSAtIGlucHV0IHl1diBmaWxlbmFtZQorICogICBvZmZzZXQgLSBvZmZzZXQgdG8gdGhlIHl1diBkYXRhIGluIHRoZSBpbnB1dCBmaWxlCisgKiAgIHlfc2l6ZSAtIHkgcGxhbmUgc2l6ZSBpbiBpbnB1dCB5dXYgZmlsZQorICogICBjcmNiX3NpemUgLSBjcmNiIHBsYW5lIHNpemUgaW4gaW5wdXQgeXV2IGZpbGUKKyAqICAgY3JjYl9vZmZzZXQgLSBjcmNiIG9mZnNldCBpbiB0aGUgbWVtb3J5IGF0CisgKiAgICAgICB3aGljaCBjcmNiIGRhdGEgbmVlZCB0byBiZSBsb2FkZWQKKyAqICAgYWRkciAtIHkgcGxhbmUgbWVtb3J5IGFkZHJlc3Mgd2hlcmUgeSBwbGFuZQorICogICAgICAgZGF0YSBuZWVkIHRvIGJlIGxvYWRlZC4KKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogICBNTV9MSUIyRF9TVUNDRVNTCisgKiAgIE1NX0xJQjJEX0VSUl9HRU5FUkFMCisgKgorICogTm90ZXM6IG5vbmUKKyAqKi8KK2xpYjJkX2Vycm9yIGxpYjJkX3Rlc3RfbG9hZF9pbnB1dF95dXZfZGF0YShjaGFyICpmaWxlTmFtZSwgaW50IG9mZnNldCwKKyAgICBpbnQzMl90IHlfc2l6ZSwgaW50MzJfdCBjcmNiX3NpemUsIGludDMyX3QgY3JjYl9vZmZzZXQsCisgICAgdm9pZCAqYWRkcikKK3sKKyAgc2l6ZV90IGk7CisgIEZJTEUgICpmcCAgICAgICA9IDA7CisgIHZvaWQgICp5X3B0ciAgICA9IGFkZHI7CisgIHZvaWQgICpjcmNiX3B0ciA9ICh1aW50OF90ICopYWRkciArIGNyY2Jfb2Zmc2V0OworCisgIHByaW50ZigieV9wdHI9JXAsIGNyY2JfcHRyPSVwIFxuIiwgeV9wdHIsIGNyY2JfcHRyKTsKKworICBmcCA9IGZvcGVuKGZpbGVOYW1lLCAicmIiKTsKKyAgaWYoZnApIHsKKyAgICBpZihvZmZzZXQpIHsKKyAgICAgIGZzZWVrKGZwLCBvZmZzZXQsIFNFRUtfU0VUKTsKKyAgICB9CisgICAgaSA9IGZyZWFkKHlfcHRyLCAxLCB5X3NpemUsIGZwKTsKKyAgICBpID0gZnJlYWQoY3JjYl9wdHIsIDEsIGNyY2Jfc2l6ZSwgZnApOworCisgICAgZmNsb3NlKCBmcCApOworICB9IGVsc2UgeworICAgIHByaW50ZigiZmFpbGVkIHRvIG9wZW4gZmlsZSAlcyBcbiIsIGZpbGVOYW1lKTsKKyAgICByZXR1cm4gTU1fTElCMkRfRVJSX0dFTkVSQUw7CisgIH0KKworICByZXR1cm4gTU1fTElCMkRfU1VDQ0VTUzsKK30KKworLyoqCisgKiBGdW5jdGlvbjogbGliMmRfdGVzdF9sb2FkX2lucHV0X3l1dl9kYXRhCisgKgorICogRGVzY3JpcHRpb246IExvYWRzIHl1diBkYXRhIGZyb20gaW5wdXQgZmlsZS4KKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogICBmaWxlTmFtZSAtIGlucHV0IHl1diBmaWxlbmFtZQorICogICBvZmZzZXQgLSBvZmZzZXQgdG8gdGhlIHl1diBkYXRhIGluIHRoZSBpbnB1dCBmaWxlCisgKiAgIGlucHV0X3l1dl9zdHJpZGUgLSB5IHBsYW5lIHN0cmlkZSBpbiBpbnB1dCB5dXYgZmlsZQorICogICB5X3BsYW5lX3N0cmlkZSAtIHkgcGxhbmUgc3RyaWRlIGluIGJ1ZmZlciBtZW1vcnkKKyAqICAgaGVpZ2h0IC0gaGVpZ2h0IG9mIHl1diBpbWFnZQorICogICBjcmNiX29mZnNldCAtIGNyY2Igb2Zmc2V0IGluIHRoZSBtZW1vcnkgYXQKKyAqICAgICAgIHdoaWNoIGNyY2IgZGF0YSBuZWVkIHRvIGJlIGxvYWRlZAorICogICBhZGRyIC0geSBwbGFuZSBtZW1vcnkgYWRkcmVzcyB3aGVyZSB5IHBsYW5lCisgKiAgICAgICBkYXRhIG5lZWQgdG8gYmUgbG9hZGVkLgorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIE1NX0xJQjJEX1NVQ0NFU1MKKyAqICAgTU1fTElCMkRfRVJSX0dFTkVSQUwKKyAqCisgKiBOb3Rlczogbm9uZQorICoqLworbGliMmRfZXJyb3IgbGliMmRfdGVzdF9sb2FkX2lucHV0X3l1dl9kYXRhX2xpbmVieWxpbmUoY2hhciAqZmlsZU5hbWUsCisgICAgaW50IG9mZnNldCwgaW50MzJfdCBpbnB1dF95dXZfc3RyaWRlLCBpbnQzMl90IHlfcGxhbmVfc3RyaWRlLAorICAgIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGNyY2Jfb2Zmc2V0LCB2b2lkICphZGRyKQoreworICBzaXplX3QgaTsKKyAgRklMRSAgKmZwICAgICAgID0gMDsKKyAgdm9pZCAgKnlfcHRyICAgID0gYWRkcjsKKyAgdm9pZCAgKmNyY2JfcHRyID0gKHVpbnQ4X3QgKilhZGRyICsgY3JjYl9vZmZzZXQ7CisKKyAgcHJpbnRmKCJ5X3B0cj0lcCwgY3JjYl9wdHI9JXAgXG4iLCB5X3B0ciwgY3JjYl9wdHIpOworCisgIGZwID0gZm9wZW4oZmlsZU5hbWUsICJyYiIpOworICBpZihmcCkgeworICAgIGlmKG9mZnNldCkgeworICAgICAgZnNlZWsoZnAsIG9mZnNldCwgU0VFS19TRVQpOworICAgIH0KKyAgICBpZiAoaW5wdXRfeXV2X3N0cmlkZSA9PSB5X3BsYW5lX3N0cmlkZSkgeworICAgICAgLy9sb2FkIHkgcGxhbmUKKyAgICAgIGkgPSBmcmVhZCh5X3B0ciwgMSwgKGlucHV0X3l1dl9zdHJpZGUgKiBoZWlnaHQpLCBmcCk7CisgICAgICAvLyBsb2FkIFVWIHBsYW5lCisgICAgICBpID0gZnJlYWQoY3JjYl9wdHIsIDEsIChpbnB1dF95dXZfc3RyaWRlICogaGVpZ2h0IC8gMiksIGZwKTsKKyAgICB9IGVsc2UgeworICAgICAgaW50IGxpbmUgPSAwOworICAgICAgLy8gbG9hZCBZIHBsYW5lCisgICAgICBmb3IgKGxpbmUgPSAwO2xpbmUgPCBoZWlnaHQ7IGxpbmUrKykgeworICAgICAgICBpID0gZnJlYWQoeV9wdHIsIDEsIGlucHV0X3l1dl9zdHJpZGUsIGZwKTsKKyAgICAgICAgeV9wdHIgPSAodm9pZCAqKSgodWludDhfdCAqKXlfcHRyICsgeV9wbGFuZV9zdHJpZGUpOworICAgICAgfQorICAgICAgZm9yIChsaW5lID0gMDtsaW5lIDwgaGVpZ2h0OyBsaW5lKyspIHsKKyAgICAgICAgaSA9IGZyZWFkKGNyY2JfcHRyLCAxLCBpbnB1dF95dXZfc3RyaWRlLCBmcCk7CisgICAgICAgIGNyY2JfcHRyID0gKHZvaWQgKikoKHVpbnQ4X3QgKiljcmNiX3B0ciArIHlfcGxhbmVfc3RyaWRlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmY2xvc2UoIGZwICk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJmYWlsZWQgdG8gb3BlbiBmaWxlICVzIFxuIiwgZmlsZU5hbWUpOworICAgIHJldHVybiBNTV9MSUIyRF9FUlJfR0VORVJBTDsKKyAgfQorCisgIHJldHVybiBNTV9MSUIyRF9TVUNDRVNTOworfQorCisvKioKKyAqIEZ1bmN0aW9uOiBtYWluCisgKgorICogRGVzY3JpcHRpb246IG1haW4gZnVuY3Rpb24gZm9yIGV4ZWN1dGlvbgorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIGFyZ2MgLSBuby5vZiBpbnB1dCBhcmd1bWVudHMKKyAqICAgYXJndiAtIGxpc3Qgb2YgYXJndW1lbnRzCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgMCBvbiBzdWNjZXNzCisgKiAgIC0xIG9uIGZhaWx1cmUKKyAqCisgKiBOb3Rlczogbm9uZQorICoqLworaW50IG1haW4oaW50MzJfdCBhcmdjLCBjb25zdCBjaGFyICogYXJndltdKQoreworICB2b2lkICAgICAgICAgICAgKmxpYjJkX2hhbmRsZSAgICAgICA9IE5VTEw7CisgIGxpYjJkX2Vycm9yICAgICAgbGliMmRfZXJyICAgICAgICAgID0gTU1fTElCMkRfU1VDQ0VTUzsKKyAgbW1fbGliMmRfYnVmZmVyICBzcmNfYnVmZmVyICAgICAgICAgPSB7MH07CisgIG1tX2xpYjJkX2J1ZmZlciAgZHN0X2J1ZmZlciAgICAgICAgID0gezB9OworICBpbnQ4X3QgICAgICAgICAgIHJldCAgICAgICAgICAgICAgICA9IElNR19TVUNDRVNTOworICBpbnQzMl90ICAgICAgICAgIHdpZHRoICAgICAgICAgICAgICA9IDA7CisgIGludDMyX3QgICAgICAgICAgaGVpZ2h0ICAgICAgICAgICAgID0gMDsKKyAgaW50MzJfdCAgICAgICAgICBpbnB1dF95dXZfc3RyaWRlICAgPSAwOworICBpbnQzMl90ICAgICAgICAgIHN0cmlkZSAgICAgICAgICAgICA9IDA7CisgIGludDMyX3QgICAgICAgICAgeV9wbGFuZV9zdHJpZGUgICAgID0gMDsKKyAgaW50MzJfdCAgICAgICAgICBjcmNiX3BsYW5lX3N0cmlkZSAgPSAwOworICBpbnQzMl90ICAgICAgICAgIHlfcGxhbmVfc2l6ZSAgICAgICA9IDA7CisgIGludDMyX3QgICAgICAgICAgeV9wbGFuZV9zaXplX2FsaWduID0gMDsKKyAgaW50MzJfdCAgICAgICAgICBjcmNiX3BsYW5lX3NpemUgICAgPSAwOworICBpbnQzMl90ICAgICAgICAgIHl1dl9zaXplICAgICAgICAgICA9IDA7CisgIGludDMyX3QgICAgICAgICAgcmdiX3NpemUgICAgICAgICAgID0gMDsKKyAgaW1nX21lbV9oYW5kbGVfdCBtX3l1dl9tZW1IYW5kbGUgICAgPSB7IDAgfTsKKyAgaW1nX21lbV9oYW5kbGVfdCBtX3JnYl9tZW1IYW5kbGUgICAgPSB7IDAgfTsKKyAgY2hhciAgICAgICAgICAgICBmaWxlbmFtZV9pbls1MTJdICAgPSB7IDAgfTsKKyAgY2hhciAgICAgICAgICAgICBmaWxlbmFtZV9vdXRbNTEyXSAgPSB7IDAgfTsKKyAgY2hhciAgICAgICAgICAgICBmaWxlbmFtZV9yYXdbNTEyXSAgPSB7IDAgfTsKKyAgaW50MzJfdCAgICAgICAgICBvZmZzZXQgICAgICAgICAgICAgPSAwOworICB1bnNpZ25lZCBpbnQgICAgIHRvdGFsX3Rlc3RzICAgICAgICA9IDE7CisgIGNhbV9mb3JtYXRfdCAgICAgZm9ybWF0ICAgICAgICAgICAgID0gQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjE7CisgIHVuc2lnbmVkIGludCAgICAgaW5kZXg7CisgIGNvbnN0IGNoYXIgICAgICAqZmlsZW5hbWU7CisKKyAgLy8gT3BlbiBJbWdsaWIgbGlicmFyeSBhbmQgZ2V0IHRoZSBmdW5jdGlvbiBwb2ludGVycyBmb3IKKyAgLy8gYnVmZmVyIGFsbG9jYXRpb24sIGZyZWUsIGNhY2hlb3BzCisgIGltZ19saWJfYnVmZmVydCAgaW1nX2xpYjsKKyAgaW1nX2xpYi5wdHIgPSBkbG9wZW4oImxpYm1tY2FtZXJhX2ltZ2xpYi5zbyIsIFJUTERfTk9XKTsKKyAgaWYgKCFpbWdfbGliLnB0cikgeworICAgIHByaW50ZigiJXMgRVJST1I6IGNvdWxkbid0IGRsb3BlbiBsaWJtbWNhbWVyYV9pbWdsaWIuc286ICVzIiwKKyAgICAgICBkbGVycm9yKCkpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8qIEdldCBmdW5jdGlvbiBwb2ludGVyIGZvciBmdW5jdGlvbnMgdG8gYWxsb2NhdGUgaW9uIG1lbW9yeSAqLworICAqKHZvaWQgKiopJmltZ19saWIuaW1nX2J1ZmZlcl9nZXQgPQorICAgICAgZGxzeW0oaW1nX2xpYi5wdHIsICJpbWdfYnVmZmVyX2dldCIpOworICAqKHZvaWQgKiopJmltZ19saWIuaW1nX2J1ZmZlcl9yZWxlYXNlID0KKyAgICAgIGRsc3ltKGltZ19saWIucHRyLCAiaW1nX2J1ZmZlcl9yZWxlYXNlIik7CisgICoodm9pZCAqKikmaW1nX2xpYi5pbWdfYnVmZmVyX2NhY2hlb3BzID0KKyAgICAgIGRsc3ltKGltZ19saWIucHRyLCAiaW1nX2J1ZmZlcl9jYWNoZW9wcyIpOworCisgIC8qIFZhbGlkYXRlIGZ1bmN0aW9uIHBvaW50ZXJzICovCisgIGlmICgoaW1nX2xpYi5pbWdfYnVmZmVyX2dldCA9PSBOVUxMKSB8fAorICAgIChpbWdfbGliLmltZ19idWZmZXJfcmVsZWFzZSA9PSBOVUxMKSB8fAorICAgIChpbWdfbGliLmltZ19idWZmZXJfY2FjaGVvcHMgPT0gTlVMTCkpIHsKKyAgICBwcmludGYoIiBFUlJPUiBtYXBwaW5nIHN5bWJvbHMgZnJvbSBsaWJtbWNhbWVyYV9pbWdsaWIuc28iKTsKKyAgICBkbGNsb3NlKGltZ19saWIucHRyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBsaWIyZF9lcnIgPSBtbV9saWIyZF9pbml0KE1NX0xJQjJEX1NZTkNfTU9ERSwgQ0FNX0ZPUk1BVF9ZVVZfNDIwX05WMjEsCisgICAgQ0FNX0ZPUk1BVF84ODg4X0FSR0IsICZsaWIyZF9oYW5kbGUpOworICBpZiAoKGxpYjJkX2VyciAhPSBNTV9MSUIyRF9TVUNDRVNTKSB8fCAobGliMmRfaGFuZGxlID09IE5VTEwpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgYm9vbCBydW5fZGVmYXVsdCA9IEZBTFNFOworCisgIGlmICggYXJnYyA9PSA3KSB7CisgICAgZmlsZW5hbWUgICAgICAgICA9IGFyZ3ZbMV07CisgICAgd2lkdGggICAgICAgICAgICA9ICh1aW50MzJfdClhdG9pKGFyZ3ZbMl0pOworICAgIGhlaWdodCAgICAgICAgICAgPSAodWludDMyX3QpYXRvaShhcmd2WzNdKTsKKyAgICBpbnB1dF95dXZfc3RyaWRlID0gKHVpbnQzMl90KWF0b2koYXJndls0XSk7CisgICAgb2Zmc2V0ICAgICAgICAgICA9ICh1aW50MzJfdClhdG9pKGFyZ3ZbNV0pOworICAgIGZvcm1hdCAgICAgICAgICAgPSAodWludDMyX3QpYXRvaShhcmd2WzZdKTsKKyAgICBydW5fZGVmYXVsdCAgICAgID0gVFJVRTsKKyAgICBwcmludGYoIlJ1bm5pbmcgdXNlciBwcm92aWRlZCBjb252ZXJzaW9uIFxuIik7CisgIH0KKyAgZWxzZSB7CisgICAgdG90YWxfdGVzdHMgPSBzaXplb2YoaW5wdXRfbnYyMSkvc2l6ZW9mKGlucHV0X3l1dl9kYXRhKTsKKyAgICBwcmludGYoInVzYWdlOiA8YmluYXJ5PiA8ZmlsbmFtZT4gPHdpZHRoPiA8aGVpZ2h0PiAiCisgICAgICAiPHN0cmlkZT4gPG9mZnNldD4gPGZvcm1hdD4gXG4iKTsKKyAgfQorCisgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHRvdGFsX3Rlc3RzOyBpbmRleCsrKQorICB7CisgICAgaWYocnVuX2RlZmF1bHQgPT0gRkFMU0UpIHsKKyAgICAgIGZpbGVuYW1lICAgICAgICAgPSBpbnB1dF9udjIxW2luZGV4XS5maWxlbmFtZTsKKyAgICAgIHdpZHRoICAgICAgICAgICAgPSBpbnB1dF9udjIxW2luZGV4XS53ZGl0aDsKKyAgICAgIGhlaWdodCAgICAgICAgICAgPSBpbnB1dF9udjIxW2luZGV4XS5oZWlnaHQ7CisgICAgICBpbnB1dF95dXZfc3RyaWRlID0gaW5wdXRfbnYyMVtpbmRleF0uc3RyaWRlOworICAgICAgb2Zmc2V0ICAgICAgICAgICA9IGlucHV0X252MjFbaW5kZXhdLm9mZnNldDsKKyAgICAgIGZvcm1hdCAgICAgICAgICAgPSBpbnB1dF9udjIxW2luZGV4XS5mb3JtYXQ7CisgICAgfQorCisgICAgc25wcmludGYoZmlsZW5hbWVfaW4sIDUxMiwgIi9kYXRhL2xpYjJkL2lucHV0LyVzIiwgZmlsZW5hbWUpOworICAgIHNucHJpbnRmKGZpbGVuYW1lX291dCwgNTEyLCAiL2RhdGEvbGliMmQvb3V0cHV0LyVzLnRnYSIsIGZpbGVuYW1lKTsKKyAgICBzbnByaW50ZihmaWxlbmFtZV9yYXcsIDUxMiwgIi9kYXRhL2xpYjJkL291dHB1dC8lcy5yZ2JhIiwgZmlsZW5hbWUpOworCisgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLVJ1bm5pbmcgdGVzdD0lZC8lZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gXG4iLAorICAgICAgaW5kZXgrMSwgdG90YWxfdGVzdHMpOworICAgIHByaW50ZigiZmlsZW5hbWU9JXMsIGZ1bGwgcGF0aD0lcywgd2lkdGg9JWQsIGhlaWdodD0lZCwgc3RyaWRlPSVkIFxuIiwKKyAgICAgIGZpbGVuYW1lLCBmaWxlbmFtZV9pbiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlKTsKKworICAgIC8vIEFsbG9jYXRlIE5WMTIgYnVmZmVyCisgICAgeV9wbGFuZV9zdHJpZGUgICAgID0gQUxJR04od2lkdGgsIDMyKTsKKyAgICB5X3BsYW5lX3NpemUgICAgICAgPSB5X3BsYW5lX3N0cmlkZSAqIGhlaWdodDsKKyAgICB5X3BsYW5lX3NpemVfYWxpZ24gPSBBTElHTih5X3BsYW5lX3NpemUsIEFMSUdONEspOworICAgIGNyY2JfcGxhbmVfc3RyaWRlICA9IHlfcGxhbmVfc3RyaWRlOworICAgIGNyY2JfcGxhbmVfc2l6ZSAgICA9IGNyY2JfcGxhbmVfc3RyaWRlICogaGVpZ2h0IC8gMjsKKyAgICB5dXZfc2l6ZSAgICAgICAgICAgPSB5X3BsYW5lX3NpemVfYWxpZ24gKyBjcmNiX3BsYW5lX3NpemU7CisgICAgcmV0ID0gaW1nX2xpYi5pbWdfYnVmZmVyX2dldChJTUdfQlVGRkVSX0lPTl9JT01NVSwgLTEsIFRSVUUsCisgICAgICAgICAgeXV2X3NpemUsICZtX3l1dl9tZW1IYW5kbGUpOworICAgIGlmIChyZXQgIT0gSU1HX1NVQ0NFU1MpIHsKKyAgICAgIHByaW50ZigiIF0gRXJyb3IsIGltZyBidWYgZ2V0IGZhaWxlZCBcbiIpOworICAgICAgZ290byBkZWluaXQ7CisgICAgfQorCisgICAgcHJpbnRmKCIlcyAlZCB5dXYgYnVmZmVyIHByb3BlcnRpZXMgOiB3PSVkLCBoPSVkLCB5X3N0cmlkZT0lZCwgIgorICAgICAgImNyY2Jfc3RyaWRlPSVkLCB5X3NpemU9JWQsIGNyY2Jfc2l6ZT0lZCwgeXV2X3NpemU9JWQsICIKKyAgICAgICJjcmNiX29mZnNldD0lZCBcbiIsCisgICAgICAgX19MSU5FX18sCisgICAgICB3aWR0aCwgaGVpZ2h0LCB5X3BsYW5lX3N0cmlkZSwgY3JjYl9wbGFuZV9zdHJpZGUsIHlfcGxhbmVfc2l6ZSwKKyAgICAgIGNyY2JfcGxhbmVfc2l6ZSwgeXV2X3NpemUsIHlfcGxhbmVfc2l6ZV9hbGlnbik7CisgICAgcHJpbnRmKCIlcyAlZCB5dXYgYnVmZmVyIHByb3BlcnRpZXMgOiBmZD0lZCwgcHRyPSVwLCBzaXplPSVkIFxuIiwKKyAgICAgICBfX0xJTkVfXywgbV95dXZfbWVtSGFuZGxlLmZkLCBtX3l1dl9tZW1IYW5kbGUudmFkZHIsCisgICAgICBtX3l1dl9tZW1IYW5kbGUubGVuZ3RoKTsKKworICAgIC8vIEFsbG9jYXRlIEFSR0IgYnVmZmVyCisgICAgc3RyaWRlICAgPSB3aWR0aCAqIDQ7CisgICAgc3RyaWRlICAgPSBBTElHTihzdHJpZGUsIDMyKTsKKyAgICByZ2Jfc2l6ZSA9IHN0cmlkZSAqIGhlaWdodDsKKyAgICByZXQgPSBpbWdfbGliLmltZ19idWZmZXJfZ2V0KElNR19CVUZGRVJfSU9OX0lPTU1VLCAtMSwgVFJVRSwKKyAgICAgICAgICByZ2Jfc2l6ZSwgJm1fcmdiX21lbUhhbmRsZSk7CisgICAgaWYgKHJldCAhPSBJTUdfU1VDQ0VTUykgeworICAgICAgcHJpbnRmKCIgXSBFcnJvciwgaW1nIGJ1ZiBnZXQgZmFpbGVkIik7CisgICAgICBpbWdfbGliLmltZ19idWZmZXJfcmVsZWFzZSgmbV95dXZfbWVtSGFuZGxlKTsKKyAgICAgIGdvdG8gZGVpbml0OworICAgIH0KKworICAgIHByaW50ZigiJXMgJWQgcmdiIGJ1ZmZlciBwcm9wZXJ0aWVzIDogdz0lZCwgaD0lZCwgc3RyaWRlPSVkLCBzaXplPSVkIFxuIiwKKyAgICAgICBfX0xJTkVfXywgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCByZ2Jfc2l6ZSk7CisgICAgcHJpbnRmKCIlcyAlZCByZ2IgYnVmZmVyIHByb3BlcnRpZXMgOiBmZD0lZCwgcHRyPSVwLCBzaXplPSVkIFxuIiwKKyAgICAgICBfX0xJTkVfXywgbV9yZ2JfbWVtSGFuZGxlLmZkLCBtX3JnYl9tZW1IYW5kbGUudmFkZHIsCisgICAgICBtX3JnYl9tZW1IYW5kbGUubGVuZ3RoKTsKKworI2lmIDAKKyAgICBsaWIyZF9lcnIgPSBsaWIyZF90ZXN0X2xvYWRfaW5wdXRfeXV2X2RhdGEoZmlsZW5hbWVfaW4sIG9mZnNldCwKKyAgICAgIChpbnB1dF95dXZfc3RyaWRlICogaGVpZ2h0KSwgKGlucHV0X3l1dl9zdHJpZGUgKiBoZWlnaHQgLyAyKSwgeV9wbGFuZV9zaXplX2FsaWduLAorICAgICAgbV95dXZfbWVtSGFuZGxlLnZhZGRyKTsKKyAgICBpZiAobGliMmRfZXJyICE9IE1NX0xJQjJEX1NVQ0NFU1MpIHsKKyAgICAgIHByaW50ZigiIF0gRXJyb3IgbG9hZGluZyB0aGUgaW5wdXQgYnVmZmVyIFxuIik7CisgICAgICBnb3RvIHJlbGVhc2U7CisgICAgfQorI2Vsc2UKKyAgICBsaWIyZF9lcnIgPSBsaWIyZF90ZXN0X2xvYWRfaW5wdXRfeXV2X2RhdGFfbGluZWJ5bGluZShmaWxlbmFtZV9pbiwgb2Zmc2V0LAorICAgICAgaW5wdXRfeXV2X3N0cmlkZSwgeV9wbGFuZV9zdHJpZGUsaGVpZ2h0LCB5X3BsYW5lX3NpemVfYWxpZ24sCisgICAgICBtX3l1dl9tZW1IYW5kbGUudmFkZHIpOworICAgIGlmIChsaWIyZF9lcnIgIT0gTU1fTElCMkRfU1VDQ0VTUykgeworICAgICAgcHJpbnRmKCIgXSBFcnJvciBsb2FkaW5nIHRoZSBpbnB1dCBidWZmZXIgXG4iKTsKKyAgICAgIGdvdG8gcmVsZWFzZTsKKyAgICB9CisjZW5kaWYKKyAgICAvLyBTZXR1cCBzb3VyY2UgYnVmZmVyCisgICAgc3JjX2J1ZmZlci5idWZmZXJfdHlwZSA9IE1NX0xJQjJEX0JVRkZFUl9UWVBFX1lVVjsKKyAgICBzcmNfYnVmZmVyLnl1dl9idWZmZXIuZmQgICAgICA9IG1feXV2X21lbUhhbmRsZS5mZDsKKyAgICBzcmNfYnVmZmVyLnl1dl9idWZmZXIuZm9ybWF0ICA9IGZvcm1hdDsKKyAgICBzcmNfYnVmZmVyLnl1dl9idWZmZXIud2lkdGggICA9IHdpZHRoOworICAgIHNyY19idWZmZXIueXV2X2J1ZmZlci5oZWlnaHQgID0gaGVpZ2h0OworICAgIHNyY19idWZmZXIueXV2X2J1ZmZlci5wbGFuZTAgID0gbV95dXZfbWVtSGFuZGxlLnZhZGRyOworICAgIHNyY19idWZmZXIueXV2X2J1ZmZlci5zdHJpZGUwID0geV9wbGFuZV9zdHJpZGU7CisgICAgc3JjX2J1ZmZlci55dXZfYnVmZmVyLnBsYW5lMSAgPSAoaW50OF90ICopbV95dXZfbWVtSGFuZGxlLnZhZGRyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfcGxhbmVfc2l6ZV9hbGlnbjsKKyAgICBzcmNfYnVmZmVyLnl1dl9idWZmZXIuc3RyaWRlMSA9IGNyY2JfcGxhbmVfc3RyaWRlOworCisgICAgLy8gU2V0dXAgZHN0IGJ1ZmZlcgorICAgIGRzdF9idWZmZXIuYnVmZmVyX3R5cGUgPSBNTV9MSUIyRF9CVUZGRVJfVFlQRV9SR0I7CisgICAgZHN0X2J1ZmZlci5yZ2JfYnVmZmVyLmZkICAgICA9IG1fcmdiX21lbUhhbmRsZS5mZDsKKyAgICBkc3RfYnVmZmVyLnJnYl9idWZmZXIuZm9ybWF0ID0gQ0FNX0ZPUk1BVF84ODg4X0FSR0I7CisgICAgZHN0X2J1ZmZlci5yZ2JfYnVmZmVyLndpZHRoICA9IHdpZHRoOworICAgIGRzdF9idWZmZXIucmdiX2J1ZmZlci5oZWlnaHQgPSBoZWlnaHQ7CisgICAgZHN0X2J1ZmZlci5yZ2JfYnVmZmVyLmJ1ZmZlciA9IG1fcmdiX21lbUhhbmRsZS52YWRkcjsKKyAgICBkc3RfYnVmZmVyLnJnYl9idWZmZXIuc3RyaWRlID0gc3RyaWRlOworCisgICAgaW1nX2xpYi5pbWdfYnVmZmVyX2NhY2hlb3BzKCZtX3l1dl9tZW1IYW5kbGUsCisgICAgICBJTUdfQ0FDSEVfQ0xFQU5fSU5WLCBJTUdfSU5URVJOQUwpOworCisgICAgbGliMmRfZXJyID0gbW1fbGliMmRfc3RhcnRfam9iKGxpYjJkX2hhbmRsZSwgJnNyY19idWZmZXIsICZkc3RfYnVmZmVyLAorICAgICAgaW5kZXgsIE5VTEwsIGxpYjJkX3Rlc3RfY2xpZW50X2NiLCAwKTsKKyAgICBpZiAobGliMmRfZXJyICE9IE1NX0xJQjJEX1NVQ0NFU1MpIHsKKyAgICAgIHByaW50ZigiIF0gRXJyb3IgaW4gbW1fbGliMmRfc3RhcnRfam9iIFxuIik7CisgICAgICBnb3RvIHJlbGVhc2U7CisgICAgfQorCisgICAgaW1nX2xpYi5pbWdfYnVmZmVyX2NhY2hlb3BzKCZtX3JnYl9tZW1IYW5kbGUsCisgICAgICBJTUdfQ0FDSEVfQ0xFQU5fSU5WLCBJTUdfSU5URVJOQUwpOworCisjaWZkZWYgRU5BQkxFX09VVFBVVF9EVU1QCisgICAgLy8gRHVtcCBvdXRwdXQgZmlsZXMKKyAgICAvLyBzbnByaW50ZihmaWxlbmFtZV9pbiwgNTEyLCAiL2RhdGEvbGliMmQvb3V0cHV0LyVzIiwgZmlsZW5hbWUpOworICAgIC8vIERVTVBfVE9fRklMRTIoZmlsZW5hbWVfaW4sIHNyY19idWZmZXIueXV2X2J1ZmZlci5wbGFuZTAsIHlfcGxhbmVfc2l6ZSwgc3JjX2J1ZmZlci55dXZfYnVmZmVyLnBsYW5lMSwgY3JjYl9wbGFuZV9zaXplKTsKKyAgICAvLyBEVU1QX1RPX0ZJTEUoZmlsZW5hbWVfcmF3LCBkc3RfYnVmZmVyLnJnYl9idWZmZXIuYnVmZmVyLCByZ2Jfc2l6ZSk7CisgICAgcHJpbnRmKCJEdW1waW5nIG91dHB1dCBmaWxlICVzIFxuIiwgZmlsZW5hbWVfb3V0KTsKKyAgICBsaWIyZF9kdW1wX3RnYShkc3RfYnVmZmVyLnJnYl9idWZmZXIuYnVmZmVyLCAxLAorICAgICAgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBmaWxlbmFtZV9vdXQpOworI2VuZGlmCisKKyAgICBpbWdfbGliLmltZ19idWZmZXJfcmVsZWFzZSgmbV9yZ2JfbWVtSGFuZGxlKTsKKyAgICBpbWdfbGliLmltZ19idWZmZXJfcmVsZWFzZSgmbV95dXZfbWVtSGFuZGxlKTsKKyAgfQorCisgIG1tX2xpYjJkX2RlaW5pdChsaWIyZF9oYW5kbGUpOworCisgIHJldHVybiAwOworCityZWxlYXNlOgorICBpbWdfbGliLmltZ19idWZmZXJfcmVsZWFzZSgmbV9yZ2JfbWVtSGFuZGxlKTsKKyAgaW1nX2xpYi5pbWdfYnVmZmVyX3JlbGVhc2UoJm1feXV2X21lbUhhbmRsZSk7CitkZWluaXQ6CisgIG1tX2xpYjJkX2RlaW5pdChsaWIyZF9oYW5kbGUpOworICBwcmludGYoIiVzICVkIHNvbWUgZXJyb3IgaGFwcGVuZWQsIHRlc3RzIGNvbXBsZXRlZCA9ICVkLyVkIFxuIiwKKyAgICAgX19MSU5FX18sIGluZGV4IC0gMSwgdG90YWxfdGVzdHMpOworICByZXR1cm4gLTE7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYUJ1ZmZlck1hcHMuY3BwIGIvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYUJ1ZmZlck1hcHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDgxNTkKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhQnVmZmVyTWFwcy5jcHAKQEAgLTAsMCArMSwyNTEgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyogbWV0OgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKi8KKworI2RlZmluZSBMT0dfVEFHICJRQ2FtZXJhQnVmZmVyTWFwcyIKKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiUUNhbWVyYUJ1ZmZlck1hcHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhQnVmZmVyTWFwcworICoKKyAqIERFU0NSSVBUSU9OOiBkZWZhdWx0IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmFCdWZmZXJNYXBzCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhQnVmZmVyTWFwczo6UUNhbWVyYUJ1ZmZlck1hcHMoKQoreworICAgIG1lbXNldCgmbUJ1Zk1hcExpc3QsIDAsIHNpemVvZihtQnVmTWFwTGlzdCkpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmFCdWZmZXJNYXBzCisgKgorICogREVTQ1JJUFRJT046IGNvcHkgY29uc3RydWN0b3Igb2YgUUNhbWVyYUJ1ZmZlck1hcHMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBCdWZmZXJNYXBzIDogb2JqZWN0IHRvIGJlIGNvcGllZAorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFCdWZmZXJNYXBzOjpRQ2FtZXJhQnVmZmVyTWFwcyhjb25zdCBRQ2FtZXJhQnVmZmVyTWFwcyYgcEJ1ZmZlck1hcHMpCit7CisgICAgbWVtY3B5KCZtQnVmTWFwTGlzdCwgJnBCdWZmZXJNYXBzLm1CdWZNYXBMaXN0LCBzaXplb2YobUJ1Zk1hcExpc3QpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhQnVmZmVyTWFwcworICoKKyAqIERFU0NSSVBUSU9OOiBjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhQnVmZmVyTWFwcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcEJ1Zk1hcExpc3QgOiBsaXN0IG9mIGJ1ZmZlciBtYXBzCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYUJ1ZmZlck1hcHM6OlFDYW1lcmFCdWZmZXJNYXBzKGNvbnN0IGNhbV9idWZfbWFwX3R5cGVfbGlzdCYgcEJ1Zk1hcExpc3QpCit7CisgICAgbWVtY3B5KCZtQnVmTWFwTGlzdCwgJnBCdWZNYXBMaXN0LCBzaXplb2YobUJ1Zk1hcExpc3QpKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhQnVmZmVyTWFwcworICoKKyAqIERFU0NSSVBUSU9OOiBjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhQnVmZmVyTWFwcworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAcFR5cGUgICA6IFR5cGUgb2YgYnVmZmVyCisgKiAgIEBwU3RyZWFtSWQgOiBTdHJlYW0gaWQKKyAqICAgQHBGcmFtZUluZGV4IDogRnJhbWUgaW5kZXgKKyAqICAgQHBQbGFuZUluZGV4IDogUGxhbmUgaW5kZXgKKyAqICAgQHBDb29raWUgICA6IENvdWxkIGJlIGpvYl9pZCB0byBpZGVudGlmeSBtYXBwaW5nIGpvYgorICogICBAcEZkICAgOiBPcmlnaW4gZmlsZSBkZXNjcmlwdG9yCisgKiAgIEBwU2l6ZSAgIDogU2l6ZSBvZiB0aGUgYnVmZmVyCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYUJ1ZmZlck1hcHM6OlFDYW1lcmFCdWZmZXJNYXBzKGNhbV9tYXBwaW5nX2J1Zl90eXBlIHBUeXBlLAorICAgICAgICB1aW50MzJfdCBwU3RyZWFtSWQsCisgICAgICAgIHVpbnQzMl90IHBGcmFtZUluZGV4LAorICAgICAgICBpbnQzMl90IHBQbGFuZUluZGV4LAorICAgICAgICB1aW50MzJfdCBwQ29va2llLAorICAgICAgICBpbnQzMl90IHBGZCwKKyAgICAgICAgc2l6ZV90IHBTaXplLAorICAgICAgICB2b2lkICpidWZmZXIpCit7CisgICAgbWVtc2V0KCZtQnVmTWFwTGlzdCwgMCwgc2l6ZW9mKG1CdWZNYXBMaXN0KSk7CisgICAgZW5xdWV1ZShwVHlwZSwgcFN0cmVhbUlkLCBwRnJhbWVJbmRleCwgcFBsYW5lSW5kZXgsIHBDb29raWUsIHBGZCwgcFNpemUsIGJ1ZmZlcik7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogflFDYW1lcmFCdWZmZXJNYXBzCisgKgorICogREVTQ1JJUFRJT046IGRlc3RydWN0b3Igb2YgUUNhbWVyYUJ1ZmZlck1hcHMKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFCdWZmZXJNYXBzOjp+UUNhbWVyYUJ1ZmZlck1hcHMoKQoreworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IG9wZXJhdG9yPQorICoKKyAqIERFU0NSSVBUSU9OOiBhc3NpZ25tZW50IG9wZXJhdG9yIG9mIFFDYW1lcmFCdWZmZXJNYXBzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwQnVmZmVyTWFwcyA6IG9iamVjdCB0byBiZSBjb3BpZWQKKyAqCisgKiBSRVRVUk4gICAgIDogKnRoaXMsIHdpdGggdXBkYXRlZCBjb250ZW50cworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhQnVmZmVyTWFwcyYgUUNhbWVyYUJ1ZmZlck1hcHM6Om9wZXJhdG9yPShjb25zdCBRQ2FtZXJhQnVmZmVyTWFwcyYgcEJ1ZmZlck1hcHMpCit7CisgICAgaWYgKCZwQnVmZmVyTWFwcyAhPSB0aGlzKSB7CisgICAgICAgIG1lbWNweSgmbUJ1Zk1hcExpc3QsICZwQnVmZmVyTWFwcy5tQnVmTWFwTGlzdCwgc2l6ZW9mKG1CdWZNYXBMaXN0KSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBlbnF1ZXVlCisgKgorICogREVTQ1JJUFRJT046IEFkZCBhIGJ1ZmZlciBtYXAKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBUeXBlICAgOiBUeXBlIG9mIGJ1ZmZlcgorICogICBAcFN0cmVhbUlkIDogU3RyZWFtIGlkCisgKiAgIEBwRnJhbWVJbmRleCA6IEZyYW1lIGluZGV4CisgKiAgIEBwUGxhbmVJbmRleCA6IFBsYW5lIGluZGV4CisgKiAgIEBwQ29va2llICAgOiBDb3VsZCBiZSBqb2JfaWQgdG8gaWRlbnRpZnkgbWFwcGluZyBqb2IKKyAqICAgQHBGZCAgIDogT3JpZ2luIGZpbGUgZGVzY3JpcHRvcgorICogICBAcFNpemUgICA6IFNpemUgb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQzMl90IFFDYW1lcmFCdWZmZXJNYXBzOjplbnF1ZXVlKGNhbV9tYXBwaW5nX2J1Zl90eXBlIHBUeXBlLAorICAgICAgICB1aW50MzJfdCBwU3RyZWFtSWQsCisgICAgICAgIHVpbnQzMl90IHBGcmFtZUluZGV4LAorICAgICAgICBpbnQzMl90IHBQbGFuZUluZGV4LAorICAgICAgICB1aW50MzJfdCBwQ29va2llLAorICAgICAgICBpbnQzMl90IHBGZCwKKyAgICAgICAgc2l6ZV90IHBTaXplLAorICAgICAgICB2b2lkICpidWZmZXIpCit7CisgICAgdWludDMyX3QgcG9zID0gbUJ1Zk1hcExpc3QubGVuZ3RoKys7CisgICAgbUJ1Zk1hcExpc3QuYnVmX21hcHNbcG9zXS50eXBlID0gcFR5cGU7CisgICAgbUJ1Zk1hcExpc3QuYnVmX21hcHNbcG9zXS5zdHJlYW1faWQgPSBwU3RyZWFtSWQ7CisgICAgbUJ1Zk1hcExpc3QuYnVmX21hcHNbcG9zXS5mcmFtZV9pZHggPSBwRnJhbWVJbmRleDsKKyAgICBtQnVmTWFwTGlzdC5idWZfbWFwc1twb3NdLnBsYW5lX2lkeCA9IHBQbGFuZUluZGV4OworICAgIG1CdWZNYXBMaXN0LmJ1Zl9tYXBzW3Bvc10uY29va2llID0gcENvb2tpZTsKKyAgICBtQnVmTWFwTGlzdC5idWZfbWFwc1twb3NdLmZkID0gcEZkOworICAgIG1CdWZNYXBMaXN0LmJ1Zl9tYXBzW3Bvc10uc2l6ZSA9IHBTaXplOworICAgIG1CdWZNYXBMaXN0LmJ1Zl9tYXBzW3Bvc10uYnVmZmVyID0gYnVmZmVyOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldENhbUJ1Zk1hcExpc3QKKyAqCisgKiBERVNDUklQVElPTjogUG9wdWxhdGUgdGhlIGxpc3QKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBCdWZNYXBMaXN0IDogW291dHB1dF0gdGhlIGxpc3Qgb2YgYnVmZmVyIG1hcHMKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit1aW50MzJfdCBRQ2FtZXJhQnVmZmVyTWFwczo6Z2V0Q2FtQnVmTWFwTGlzdChjYW1fYnVmX21hcF90eXBlX2xpc3QmIHBCdWZNYXBMaXN0KSBjb25zdAoreworICAgIG1lbWNweSgmcEJ1Zk1hcExpc3QsICZtQnVmTWFwTGlzdCwgc2l6ZW9mKHBCdWZNYXBMaXN0KSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbWFrZVNpbmdsZXRvbkJ1Zk1hcExpc3QKKyAqCisgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgYnVmZmVyIG1hcCBsaXN0IG9mIGEgc2luZ2xlIGVsZW1lbnQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQHBUeXBlICAgOiBUeXBlIG9mIGJ1ZmZlcgorICogICBAcFN0cmVhbUlkIDogU3RyZWFtIGlkCisgKiAgIEBwRnJhbWVJbmRleCA6IEZyYW1lIGluZGV4CisgKiAgIEBwUGxhbmVJbmRleCA6IFBsYW5lIGluZGV4CisgKiAgIEBwQ29va2llICAgOiBDb3VsZCBiZSBqb2JfaWQgdG8gaWRlbnRpZnkgbWFwcGluZyBqb2IKKyAqICAgQHBGZCAgIDogT3JpZ2luIGZpbGUgZGVzY3JpcHRvcgorICogICBAcFNpemUgICA6IFNpemUgb2YgdGhlIGJ1ZmZlcgorICogICBAcEJ1Zk1hcExpc3QgOiBbb3V0cHV0XSB0aGUgbGlzdCBvZiBidWZmZXIgbWFwcworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3VpbnQzMl90IFFDYW1lcmFCdWZmZXJNYXBzOjptYWtlU2luZ2xldG9uQnVmTWFwTGlzdChjYW1fbWFwcGluZ19idWZfdHlwZSBwVHlwZSwKKyAgICAgICAgdWludDMyX3QgcFN0cmVhbUlkLAorICAgICAgICB1aW50MzJfdCBwRnJhbWVJbmRleCwKKyAgICAgICAgaW50MzJfdCBwUGxhbmVJbmRleCwKKyAgICAgICAgdWludDMyX3QgcENvb2tpZSwKKyAgICAgICAgaW50MzJfdCBwRmQsCisgICAgICAgIHNpemVfdCBwU2l6ZSwKKyAgICAgICAgY2FtX2J1Zl9tYXBfdHlwZV9saXN0JiBwQnVmTWFwTGlzdCwKKyAgICAgICAgdm9pZCAqYnVmZmVyKQoreworICAgIHVpbnQzMl90IHJjID0gTk9fRVJST1I7CisKKyAgICBRQ2FtZXJhQnVmZmVyTWFwcyBidWZmZXJNYXBzKHBUeXBlLAorICAgICAgICAgICAgcFN0cmVhbUlkLAorICAgICAgICAgICAgcEZyYW1lSW5kZXgsCisgICAgICAgICAgICBwUGxhbmVJbmRleCwKKyAgICAgICAgICAgIHBDb29raWUsCisgICAgICAgICAgICBwRmQsCisgICAgICAgICAgICBwU2l6ZSwKKyAgICAgICAgICAgIGJ1ZmZlcik7CisgICAgcmMgPSBidWZmZXJNYXBzLmdldENhbUJ1Zk1hcExpc3QocEJ1Zk1hcExpc3QpOworCisgICAgcmV0dXJuIHJjOworfQorCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYUJ1ZmZlck1hcHMuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi91dGlsL1FDYW1lcmFCdWZmZXJNYXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiZGZjZQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi91dGlsL1FDYW1lcmFCdWZmZXJNYXBzLmgKQEAgLTAsMCArMSw4MyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqLworCisjaWZuZGVmIF9fUUNBTUVSQV9CVUZGRVJNQVBTX0hfXworI2RlZmluZSBfX1FDQU1FUkFfQlVGRkVSTUFQU19IX18KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgImNhbV90eXBlcy5oIgorCituYW1lc3BhY2UgcWNhbWVyYSB7CisKK2NsYXNzIFFDYW1lcmFCdWZmZXJNYXBzIHsKK3B1YmxpYzoKKyAgICBRQ2FtZXJhQnVmZmVyTWFwcygpOworICAgIFFDYW1lcmFCdWZmZXJNYXBzKGNvbnN0IFFDYW1lcmFCdWZmZXJNYXBzJiBwQnVmZmVyTWFwcyk7CisgICAgUUNhbWVyYUJ1ZmZlck1hcHMoY29uc3QgY2FtX2J1Zl9tYXBfdHlwZV9saXN0JiBwQnVmTWFwTGlzdCk7CisgICAgUUNhbWVyYUJ1ZmZlck1hcHMoY2FtX21hcHBpbmdfYnVmX3R5cGUgcFR5cGUsCisgICAgICAgICAgICB1aW50MzJfdCBwU3RyZWFtSWQsCisgICAgICAgICAgICB1aW50MzJfdCBwRnJhbWVJbmRleCwKKyAgICAgICAgICAgIGludDMyX3QgcFBsYW5lSW5kZXgsCisgICAgICAgICAgICB1aW50MzJfdCBwQ29va2llLAorICAgICAgICAgICAgaW50MzJfdCBwRmQsCisgICAgICAgICAgICBzaXplX3QgcFNpemUsCisgICAgICAgICAgICB2b2lkICpidWZmZXIpOworCisgICAgflFDYW1lcmFCdWZmZXJNYXBzKCk7CisKKyAgICBRQ2FtZXJhQnVmZmVyTWFwcyYgb3BlcmF0b3I9KGNvbnN0IFFDYW1lcmFCdWZmZXJNYXBzJiBwQnVmZmVyTWFwcyk7CisKKyAgICB1aW50MzJfdCBlbnF1ZXVlKGNhbV9tYXBwaW5nX2J1Zl90eXBlIHBUeXBlLAorICAgICAgICAgICAgdWludDMyX3QgcFN0cmVhbUlkLAorICAgICAgICAgICAgdWludDMyX3QgcEZyYW1lSW5kZXgsCisgICAgICAgICAgICBpbnQzMl90IHBQbGFuZUluZGV4LAorICAgICAgICAgICAgdWludDMyX3QgcENvb2tpZSwKKyAgICAgICAgICAgIGludDMyX3QgcEZkLAorICAgICAgICAgICAgc2l6ZV90IHBTaXplLAorICAgICAgICAgICAgdm9pZCAqYnVmZmVyKTsKKworICAgIHVpbnQzMl90IGdldENhbUJ1Zk1hcExpc3QoY2FtX2J1Zl9tYXBfdHlwZV9saXN0JiBwQnVmTWFwTGlzdCkgY29uc3Q7CisKKyAgICBzdGF0aWMgdWludDMyX3QgbWFrZVNpbmdsZXRvbkJ1Zk1hcExpc3QoY2FtX21hcHBpbmdfYnVmX3R5cGUgcFR5cGUsCisgICAgICAgICAgICB1aW50MzJfdCBwU3RyZWFtSWQsCisgICAgICAgICAgICB1aW50MzJfdCBwRnJhbWVJbmRleCwKKyAgICAgICAgICAgIGludDMyX3QgcFBsYW5lSW5kZXgsCisgICAgICAgICAgICB1aW50MzJfdCBwQ29va2llLAorICAgICAgICAgICAgaW50MzJfdCBwRmQsCisgICAgICAgICAgICBzaXplX3QgcFNpemUsCisgICAgICAgICAgICBjYW1fYnVmX21hcF90eXBlX2xpc3QmIHBCdWZNYXBMaXN0LAorICAgICAgICAgICAgdm9pZCAqYnVmZmVyKTsKKworcHJpdmF0ZToKKyAgICBjYW1fYnVmX21hcF90eXBlX2xpc3QgbUJ1Zk1hcExpc3Q7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQorI2VuZGlmIC8qIF9fUUNBTUVSQV9CVUZGRVJNQVBTX0hfXyAqLworCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhQ21kVGhyZWFkLmNwcCBiL21zbWNvYmFsdC9RQ2FtZXJhMi91dGlsL1FDYW1lcmFDbWRUaHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTkxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhQ21kVGhyZWFkLmNwcApAQCAtMCwwICsxLDIyNSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorKiBtZXQ6CisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjZGVmaW5lIFBSQ1RMX0ggPFNZU1RFTV9IRUFERVJfUFJFRklYL3ByY3RsLmg+CisjaW5jbHVkZSBQUkNUTF9ICisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJRQ2FtZXJhQ21kVGhyZWFkLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKK30KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhQ21kVGhyZWFkCisgKgorICogREVTQ1JJUFRJT046IGRlZmF1bHQgY29uc3RydWN0b3Igb2YgUUNhbWVyYUNtZFRocmVhZAorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYUNtZFRocmVhZDo6UUNhbWVyYUNtZFRocmVhZCgpIDoKKyAgICBjbWRfcXVldWUoKQoreworICAgIGNtZF9waWQgPSAwOworICAgIGNhbV9zZW1faW5pdCgmc3luY19zZW0sIDApOworICAgIGNhbV9zZW1faW5pdCgmY21kX3NlbSwgMCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogflFDYW1lcmFDbWRUaHJlYWQKKyAqCisgKiBERVNDUklQVElPTjogZGVjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhQ21kVGhyZWFkCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhQ21kVGhyZWFkOjp+UUNhbWVyYUNtZFRocmVhZCgpCit7CisgICAgZXhpdCgpOworICAgIGNhbV9zZW1fZGVzdHJveSgmc3luY19zZW0pOworICAgIGNhbV9zZW1fZGVzdHJveSgmY21kX3NlbSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbGF1bmNoCisgKgorICogREVTQ1JJUFRJT046IGxhdW5jaCBDbWQgVGhyZWFkCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBzdGFydF9yb3V0aW5lIDogdGhyZWFkIHJvdXRpbmUgZnVuY3Rpb24gcHRyCisgKiAgIEB1c2VyX2RhdGEgICAgIDogdXNlciBkYXRhIHB0cgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYUNtZFRocmVhZDo6bGF1bmNoKHZvaWQgKigqc3RhcnRfcm91dGluZSkodm9pZCAqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJfZGF0YSkKK3sKKyAgICAvKiBsYXVuY2ggdGhlIHRocmVhZCAqLworICAgIHB0aHJlYWRfY3JlYXRlKCZjbWRfcGlkLAorICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgc3RhcnRfcm91dGluZSwKKyAgICAgICAgICAgICAgICAgICB1c2VyX2RhdGEpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXROYW1lCisgKgorICogREVTQ1JJUFRJT046IG5hbWUgdGhlIGNtZCB0aHJlYWQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQG5hbWUgOiBkZXNpcmVkIG5hbWUgZm9yIHRoZSB0aHJlYWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFDbWRUaHJlYWQ6OnNldE5hbWUoY29uc3QgY2hhciogbmFtZSkKK3sKKyAgICAvKiBuYW1lIHRoZSB0aHJlYWQgKi8KKyAgICBwcmN0bChQUl9TRVRfTkFNRSwgKHVuc2lnbmVkIGxvbmcpbmFtZSwgMCwgMCwgMCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHNlbmRDbWQKKyAqCisgKiBERVNDUklQVElPTjogc2VuZCBhIGNvbW1hbmQgdG8gdGhlIENtZCBUaHJlYWQKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNtZCAgICAgOiBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkLgorICogICBAc3luY19jbWQ6IGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhpcyBpcyBhIHN5bmNob3JpbnplZCBjbWQuIElmIHRydWUsIHRoaXMgY2FsbAorICogICAgICAgICAgICAgIHdpbGwgd2FpdCB1bnRpbCBzaWduYWwgaXMgc2V0IGFmdGVyIHRoZSBjb21tYW5kIGlzIGNvbXBsZXRlZC4KKyAqICAgQHByaW9yaXR5OiBmbGFnIHRvIGluZGljYXRlIGlmIHRoaXMgaXMgYSBjbWQgd2l0aCBwcmlvcml0eS4gSWYgdHJ1ZSwgdGhlIGNtZAorICogICAgICAgICAgICAgIHdpbGwgYmUgZW5xdWV1ZWQgdG8gdGhlIGhlYWQgd2l0aCBwcmlvcml0eS4KKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFDbWRUaHJlYWQ6OnNlbmRDbWQoY2FtZXJhX2NtZF90eXBlX3QgY21kLCB1aW50OF90IHN5bmNfY21kLCB1aW50OF90IHByaW9yaXR5KQoreworICAgIGNhbWVyYV9jbWRfdCAqbm9kZSA9IChjYW1lcmFfY21kX3QgKiltYWxsb2Moc2l6ZW9mKGNhbWVyYV9jbWRfdCkpOworICAgIGlmIChOVUxMID09IG5vZGUpIHsKKyAgICAgICAgTE9HRSgiTm8gbWVtb3J5IGZvciBjYW1lcmFfY21kX3QiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KG5vZGUsIDAsIHNpemVvZihjYW1lcmFfY21kX3QpKTsKKyAgICBub2RlLT5jbWQgPSBjbWQ7CisKKyAgICBpZiAocHJpb3JpdHkpIHsKKyAgICAgICAgaWYgKCFjbWRfcXVldWUuZW5xdWV1ZVdpdGhQcmlvcml0eSgodm9pZCAqKW5vZGUpKSB7CisgICAgICAgICAgICBmcmVlKG5vZGUpOworICAgICAgICAgICAgbm9kZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWNtZF9xdWV1ZS5lbnF1ZXVlKCh2b2lkICopbm9kZSkpIHsKKyAgICAgICAgICAgIGZyZWUobm9kZSk7CisgICAgICAgICAgICBub2RlID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBjYW1fc2VtX3Bvc3QoJmNtZF9zZW0pOworCisgICAgLyogaWYgaXMgYSBzeW5jIGNhbGwsIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCByZXR1cm5zICovCisgICAgaWYgKHN5bmNfY21kKSB7CisgICAgICAgIGNhbV9zZW1fd2FpdCgmc3luY19zZW0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZ2V0Q21kCisgKgorICogREVTQ1JJUFRJT046IGRlcXVldWUgYSBjbW9tbWFuZCBmcm9tIGNtZCBxdWV1ZQorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IGNtZCBkZXF1ZXVlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitjYW1lcmFfY21kX3R5cGVfdCBRQ2FtZXJhQ21kVGhyZWFkOjpnZXRDbWQoKQoreworICAgIGNhbWVyYV9jbWRfdHlwZV90IGNtZCA9IENBTUVSQV9DTURfVFlQRV9OT05FOworICAgIGNhbWVyYV9jbWRfdCAqbm9kZSA9IChjYW1lcmFfY21kX3QgKiljbWRfcXVldWUuZGVxdWV1ZSgpOworICAgIGlmIChOVUxMID09IG5vZGUpIHsKKyAgICAgICAgTE9HRCgiTm8gbm90aWZ5IGF2YWlsIik7CisgICAgICAgIHJldHVybiBDQU1FUkFfQ01EX1RZUEVfTk9ORTsKKyAgICB9IGVsc2UgeworICAgICAgICBjbWQgPSBub2RlLT5jbWQ7CisgICAgICAgIGZyZWUobm9kZSk7CisgICAgfQorICAgIHJldHVybiBjbWQ7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZXhpdAorICoKKyAqIERFU0NSSVBUSU9OOiBleGl0IHRoZSBDTUQgdGhyZWFkCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFDbWRUaHJlYWQ6OmV4aXQoKQoreworICAgIGludDMyX3QgcmMgPSBOT19FUlJPUjsKKworICAgIGlmIChjbWRfcGlkID09IDApIHsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHJjID0gc2VuZENtZChDQU1FUkFfQ01EX1RZUEVfRVhJVCwgMCwgMSk7CisgICAgaWYgKE5PX0VSUk9SICE9IHJjKSB7CisgICAgICAgIExPR0UoIkVycm9yIGR1cmluZyBleGl0LCByYyA9ICVkIiwgcmMpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgLyogd2FpdCB1bnRpbCBjbWQgdGhyZWFkIGV4aXRzICovCisgICAgaWYgKHB0aHJlYWRfam9pbihjbWRfcGlkLCBOVUxMKSAhPSAwKSB7CisgICAgICAgIExPR0QoInB0aHJlYWQgZGVhZCBhbHJlYWR5XG4iKTsKKyAgICB9CisgICAgY21kX3BpZCA9IDA7CisgICAgcmV0dXJuIHJjOworfQorCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYUNtZFRocmVhZC5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYUNtZFRocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzY0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhQ21kVGhyZWFkLmgKQEAgLTAsMCArMSw3NiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1FDQU1FUkFfQ01EX1RIUkVBRF9IX18KKyNkZWZpbmUgX19RQ0FNRVJBX0NNRF9USFJFQURfSF9fCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJjYW1fc2VtYXBob3JlLmgiCisjaW5jbHVkZSAiY2FtX3R5cGVzLmgiCisjaW5jbHVkZSAiUUNhbWVyYVF1ZXVlLmgiCisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKwordHlwZWRlZiBlbnVtCit7CisgICAgQ0FNRVJBX0NNRF9UWVBFX05PTkUsCisgICAgQ0FNRVJBX0NNRF9UWVBFX1NUQVJUX0RBVEFfUFJPQywKKyAgICBDQU1FUkFfQ01EX1RZUEVfU1RPUF9EQVRBX1BST0MsCisgICAgQ0FNRVJBX0NNRF9UWVBFX0RPX05FWFRfSk9CLAorICAgIENBTUVSQV9DTURfVFlQRV9FWElULAorICAgIENBTUVSQV9DTURfVFlQRV9NQVgKK30gY2FtZXJhX2NtZF90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1lcmFfY21kX3R5cGVfdCBjbWQ7Cit9IGNhbWVyYV9jbWRfdDsKKworY2xhc3MgUUNhbWVyYUNtZFRocmVhZCB7CitwdWJsaWM6CisgICAgUUNhbWVyYUNtZFRocmVhZCgpOworICAgIH5RQ2FtZXJhQ21kVGhyZWFkKCk7CisKKyAgICBpbnQzMl90IGxhdW5jaCh2b2lkICooKnN0YXJ0X3JvdXRpbmUpKHZvaWQgKiksIHZvaWQqIHVzZXJfZGF0YSk7CisgICAgaW50MzJfdCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOworICAgIGludDMyX3QgZXhpdCgpOworICAgIGludDMyX3Qgc2VuZENtZChjYW1lcmFfY21kX3R5cGVfdCBjbWQsIHVpbnQ4X3Qgc3luY19jbWQsIHVpbnQ4X3QgcHJpb3JpdHkpOworICAgIGNhbWVyYV9jbWRfdHlwZV90IGdldENtZCgpOworCisgICAgUUNhbWVyYVF1ZXVlIGNtZF9xdWV1ZTsgICAgICAvKiBjbWQgcXVldWUgKi8KKyAgICBwdGhyZWFkX3QgY21kX3BpZDsgICAgICAgICAgIC8qIGNtZCB0aHJlYWQgSUQgKi8KKyAgICBjYW1fc2VtYXBob3JlX3QgY21kX3NlbTsgICAgICAgICAgICAgICAvKiBzZW1hcGhvcmUgZm9yIGNtZCB0aHJlYWQgKi8KKyAgICBjYW1fc2VtYXBob3JlX3Qgc3luY19zZW07ICAgICAgICAgICAgICAvKiBzZW1hcGhvcmUgZm9yIHN5bmNocm9uaXplZCBjYWxsIHNpZ25hbCAqLworfTsKKworfTsgLy8gbmFtZXNwYWNlIHFjYW1lcmEKKworI2VuZGlmIC8qIF9fUUNBTUVSQV9DTURfVEhSRUFEX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYUNvbW1vbi5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhQ29tbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2MyNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYUNvbW1vbi5jcHAKQEAgLTAsMCArMSwyMjYgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYUNvbW1vbiIKKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiUUNhbWVyYUNvbW1vbi5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhQ29tbW9uCisgKgorICogREVTQ1JJUFRJT046IGRlZmF1bHQgY29uc3RydWN0b3Igb2YgUUNhbWVyYUNvbW1vbgorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYUNvbW1vbjo6UUNhbWVyYUNvbW1vbigpIDoKKyAgICBtX3BDYXBhYmlsaXR5KE5VTEwpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogflFDYW1lcmFDb21tb24KKyAqCisgKiBERVNDUklQVElPTjogZGVzdHJ1Y3RvciBvZiBRQ2FtZXJhQ29tbW9uCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhQ29tbW9uOjp+UUNhbWVyYUNvbW1vbigpCit7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogaW5pdAorICoKKyAqIERFU0NSSVBUSU9OOiBJbml0IGZ1bmN0aW9uIGZvciBRQ2FtZXJhQ29tbW9uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBwQ2FwYWJpbGl0eSA6IENhcGFiaWxpdGllcworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYUNvbW1vbjo6aW5pdChjYW1fY2FwYWJpbGl0eV90ICpwQ2FwYWJpbGl0eSkKK3sKKyAgICBtX3BDYXBhYmlsaXR5ID0gcENhcGFiaWxpdHk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY2FsY3VsYXRlTENNCisgKgorICogREVTQ1JJUFRJT046IEdldCB0aGUgTENNIG9mIDIgbnVtYmVycworICoKKyAqIFBBUkFNRVRFUlMgOgorICogICBAbnVtMSAgIDogRmlyc3QgbnVtYmVyCisgKiAgIEBudW0yICAgOiBzZWNvbmQgbnVtYmVyCisgKgorICogUkVUVVJOICAgICA6IGludDMyX3QgdHlwZSAoTENNKQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordWludDMyX3QgUUNhbWVyYUNvbW1vbjo6Y2FsY3VsYXRlTENNKGludDMyX3QgbnVtMSwgaW50MzJfdCBudW0yKQoreworICAgdWludDMyX3QgbGNtID0gMDsKKyAgIHVpbnQzMl90IHRlbXAgPSAwOworCisgICBpZiAoKG51bTEgPCAxKSAmJiAobnVtMiA8IDEpKSB7CisgICAgICAgcmV0dXJuIDA7CisgICB9IGVsc2UgaWYgKG51bTEgPCAxKSB7CisgICAgICAgcmV0dXJuIG51bTI7CisgICB9IGVsc2UgaWYgKG51bTIgPCAxKSB7CisgICAgICAgcmV0dXJuIG51bTE7CisgICB9CisKKyAgIGlmIChudW0xID4gbnVtMikgeworICAgICAgIGxjbSA9IG51bTE7CisgICB9IGVsc2UgeworICAgICAgIGxjbSA9IG51bTI7CisgICB9CisgICB0ZW1wID0gbGNtOworCisgICB3aGlsZSAoMSkgeworICAgICAgIGlmICgoKGxjbSAlIG51bTEpID09IDApICYmICgobGNtICUgbnVtMikgPT0gMCkpIHsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgfQorICAgICAgIGxjbSArPSB0ZW1wOworICAgfQorICAgcmV0dXJuIGxjbTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBnZXRBbmFseXNpc0luZm8KKyAqCisgKiBERVNDUklQVElPTjogR2V0IHRoZSBBbmFseXNpcyBpbmZvcm1hdGlvbiBiYXNlZCBvbgorICogICAgIGN1cnJlbnQgbW9kZSBhbmQgZmVhdHVyZSBtYXNrCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBmZFZpZGVvRW5hYmxlZCA6IFdoZXRoZXIgZmRWaWRlbyBlbmFibGVkIGN1cnJlbnRseQorICogICBAaGFsMyAgICAgICAgICAgOiBXaGV0aGVyIGhhbDMgb3IgaGFsMQorICogICBAZmVhdHVyZU1hc2sgICAgOiBGZWF0dXJlIG1hc2sKKyAqICAgQHBBbmFseXNpc19pbmZvIDogQW5hbHlzaXMgaW5mbyB0byBiZSBmaWxsZWQKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFDb21tb246OmdldEFuYWx5c2lzSW5mbygKKyAgICAgICAgYm9vbCBmZFZpZGVvRW5hYmxlZCwKKyAgICAgICAgYm9vbCBoYWwzLAorICAgICAgICBjYW1fZmVhdHVyZV9tYXNrX3QgZmVhdHVyZU1hc2ssCisgICAgICAgIGNhbV9hbmFseXNpc19pbmZvX3QgKnBBbmFseXNpc0luZm8pCit7CisgICAgaWYgKCFwQW5hbHlzaXNJbmZvKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcEFuYWx5c2lzSW5mby0+dmFsaWQgPSAwOworCisgICAgaWYgKChmZFZpZGVvRW5hYmxlZCA9PSBUUlVFKSAmJiAoaGFsMyA9PSBGQUxTRSkgJiYKKyAgICAgICAgICAgIChtX3BDYXBhYmlsaXR5LT5hbmFseXNpc19pbmZvW0NBTV9BTkFMWVNJU19JTkZPX0ZEX1ZJREVPXS5od19hbmFseXNpc19zdXBwb3J0ZWQpICYmCisgICAgICAgICAgICAobV9wQ2FwYWJpbGl0eS0+YW5hbHlzaXNfaW5mb1tDQU1fQU5BTFlTSVNfSU5GT19GRF9WSURFT10udmFsaWQpKSB7CisgICAgICAgICpwQW5hbHlzaXNJbmZvID0KKyAgICAgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5hbmFseXNpc19pbmZvW0NBTV9BTkFMWVNJU19JTkZPX0ZEX1ZJREVPXTsKKyAgICB9IGVsc2UgaWYgKG1fcENhcGFiaWxpdHktPmFuYWx5c2lzX2luZm9bQ0FNX0FOQUxZU0lTX0lORk9fRkRfU1RJTExdLnZhbGlkKSB7CisgICAgICAgICpwQW5hbHlzaXNJbmZvID0KKyAgICAgICAgICAgICAgICBtX3BDYXBhYmlsaXR5LT5hbmFseXNpc19pbmZvW0NBTV9BTkFMWVNJU19JTkZPX0ZEX1NUSUxMXTsKKyAgICAgICAgaWYgKGhhbDMgPT0gVFJVRSkgeworICAgICAgICAgICAgcEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfbWF4X3JlcyA9IHBBbmFseXNpc0luZm8tPmFuYWx5c2lzX3JlY29tbWVuZGVkX3JlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmVhdHVyZU1hc2sgJiBDQU1fUUNPTV9GRUFUVVJFX1BBQUYpICYmCisgICAgICAobV9wQ2FwYWJpbGl0eS0+YW5hbHlzaXNfaW5mb1tDQU1fQU5BTFlTSVNfSU5GT19QQUFGXS52YWxpZCkpIHsKKyAgICAgICAgY2FtX2FuYWx5c2lzX2luZm9fdCAqcFBhYWZJbmZvID0KKyAgICAgICAgICAmbV9wQ2FwYWJpbGl0eS0+YW5hbHlzaXNfaW5mb1tDQU1fQU5BTFlTSVNfSU5GT19QQUFGXTsKKworICAgICAgICBpZiAoIXBBbmFseXNpc0luZm8tPnZhbGlkKSB7CisgICAgICAgICAgICAqcEFuYWx5c2lzSW5mbyA9ICpwUGFhZkluZm87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19tYXhfcmVzLndpZHRoID0KKyAgICAgICAgICAgICAgICBNQVgocEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfbWF4X3Jlcy53aWR0aCwKKyAgICAgICAgICAgICAgICBwUGFhZkluZm8tPmFuYWx5c2lzX21heF9yZXMud2lkdGgpOworICAgICAgICAgICAgcEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfbWF4X3Jlcy5oZWlnaHQgPQorICAgICAgICAgICAgICAgIE1BWChwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19tYXhfcmVzLmhlaWdodCwKKyAgICAgICAgICAgICAgICBwUGFhZkluZm8tPmFuYWx5c2lzX21heF9yZXMuaGVpZ2h0KTsKKyAgICAgICAgICAgIHBBbmFseXNpc0luZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5oZWlnaHRfcGFkZGluZyA9CisgICAgICAgICAgICAgICAgY2FsY3VsYXRlTENNKHBBbmFseXNpc0luZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5oZWlnaHRfcGFkZGluZywKKyAgICAgICAgICAgICAgICBwUGFhZkluZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5oZWlnaHRfcGFkZGluZyk7CisgICAgICAgICAgICBwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8ud2lkdGhfcGFkZGluZyA9CisgICAgICAgICAgICAgICAgY2FsY3VsYXRlTENNKHBBbmFseXNpc0luZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby53aWR0aF9wYWRkaW5nLAorICAgICAgICAgICAgICAgIHBQYWFmSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLndpZHRoX3BhZGRpbmcpOworICAgICAgICAgICAgcEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLnBsYW5lX3BhZGRpbmcgPQorICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUxDTShwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8ucGxhbmVfcGFkZGluZywKKyAgICAgICAgICAgICAgICBwUGFhZkluZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5wbGFuZV9wYWRkaW5nKTsKKyAgICAgICAgICAgIHBBbmFseXNpc0luZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5taW5fc3RyaWRlID0KKyAgICAgICAgICAgICAgICBNQVgocEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLm1pbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgcFBhYWZJbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8ubWluX3N0cmlkZSk7CisgICAgICAgICAgICBwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8ubWluX3N0cmlkZSA9CisgICAgICAgICAgICAgICAgQUxJR04ocEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLm1pbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgcEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLndpZHRoX3BhZGRpbmcpOworCisgICAgICAgICAgICBwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8ubWluX3NjYW5saW5lID0KKyAgICAgICAgICAgICAgICBNQVgocEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLm1pbl9zY2FubGluZSwKKyAgICAgICAgICAgICAgICBwUGFhZkluZm8tPmFuYWx5c2lzX3BhZGRpbmdfaW5mby5taW5fc2NhbmxpbmUpOworICAgICAgICAgICAgcEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLm1pbl9zY2FubGluZSA9CisgICAgICAgICAgICAgICAgQUxJR04ocEFuYWx5c2lzSW5mby0+YW5hbHlzaXNfcGFkZGluZ19pbmZvLm1pbl9zY2FubGluZSwKKyAgICAgICAgICAgICAgICBwQW5hbHlzaXNJbmZvLT5hbmFseXNpc19wYWRkaW5nX2luZm8uaGVpZ2h0X3BhZGRpbmcpOworCisgICAgICAgICAgICBwQW5hbHlzaXNJbmZvLT5od19hbmFseXNpc19zdXBwb3J0ZWQgfD0KKyAgICAgICAgICAgICAgICBwUGFhZkluZm8tPmh3X2FuYWx5c2lzX3N1cHBvcnRlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwQW5hbHlzaXNJbmZvLT52YWxpZCA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworfQorCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYUNvbW1vbi5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYUNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NGIwODcKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhQ29tbW9uLmgKQEAgLTAsMCArMSw2MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1FDQU1FUkFfQ09NTU9OX0hfXworI2RlZmluZSBfX1FDQU1FUkFfQ09NTU9OX0hfXworCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiY2FtX3R5cGVzLmgiCisjaW5jbHVkZSAiY2FtX2ludGYuaCIKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisjZGVmaW5lIEFMSUdOKGEsIGIpICgoKGEpICsgKGIpKSAmIH4oYikpCisjZGVmaW5lIE1BWChhLCBiKSAoKGEpID4gKGIpID8gKGEpIDogKGIpKQorCitjbGFzcyBRQ2FtZXJhQ29tbW9uIHsKK3B1YmxpYzoKKyAgICBRQ2FtZXJhQ29tbW9uKCk7CisgICAgflFDYW1lcmFDb21tb24oKTsKKworICAgIGludDMyX3QgaW5pdChjYW1fY2FwYWJpbGl0eV90ICpjYXApOworCisgICAgaW50MzJfdCBnZXRBbmFseXNpc0luZm8oCisgICAgICAgIGJvb2wgZmRWaWRlb0VuYWJsZWQsIGJvb2wgaGFsMywgY2FtX2ZlYXR1cmVfbWFza190IGZlYXR1cmVNYXNrLAorICAgICAgICBjYW1fYW5hbHlzaXNfaW5mb190ICpwQW5hbHlzaXNJbmZvKTsKKyAgICBzdGF0aWMgdWludDMyX3QgY2FsY3VsYXRlTENNKGludDMyX3QgbnVtMSwgaW50MzJfdCBudW0yKTsKKworcHJpdmF0ZToKKyAgICBjYW1fY2FwYWJpbGl0eV90ICptX3BDYXBhYmlsaXR5OworCit9OworCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQorI2VuZGlmIC8qIF9fUUNBTUVSQV9DT01NT05fSF9fICovCisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi91dGlsL1FDYW1lcmFEaXNwbGF5LmNwcCBiL21zbWNvYmFsdC9RQ2FtZXJhMi91dGlsL1FDYW1lcmFEaXNwbGF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzdmNjQyCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYURpc3BsYXkuY3BwCkBAIC0wLDAgKzEsMjgyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYURpc3BsYXkiCisKKy8vIFRvIHJlbW92ZQorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJRQ2FtZXJhMkhXSS5oIgorI2luY2x1ZGUgIlFDYW1lcmFEaXNwbGF5LmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKK30KKworI2RlZmluZSBDQU1FUkFfVlNZTkNfV0FJVF9NUyAgICAgICAgICAgICAgIDMzIC8vIFVzZWQgYnkgdnN5bmMgdGhyZWFkIHRvIHdhaXQgZm9yIHZzeW5jIHRpbWVvdXQuCisjZGVmaW5lIERJU1BMQVlfRVZFTlRfUkVDRUlWRVJfQVJSQVlfU0laRSAgMQorI2RlZmluZSBESVNQTEFZX0RFRkFVTFRfRlBTICAgICAgICAgICAgICAgIDYwCisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB2c3luY0V2ZW50UmVjZWl2ZXJDYW1lcmEKKyAqCisgKiBERVNDUklQVElPTjogQ29tcHV0ZXMgYXZlcmFnZSB2c3luYyBpbnRlcnZhbC4gQ2FsbGVkIGJ5IGRpc3BsYXkKKyAqICAgICAgICAgICAgICBldmVudCBoYW5kbGVyIGZvciBldmVyeSB2c3luYyBldmVudC4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGZkICAgICAgOiBmaWxlIGRlc2NyaXB0b3IKKyAqICAgQGV2ZW50cyAgOiBldmVudHMKKyAqICAgQGRhdGEgICAgOiBwb2ludGVyIHRvIHVzZXIgZGF0YSBwcm92aWRlZCBkdXJpbmcgY2FsbCBiYWNrIHJlZ2lzdHJhdGlvbi4KKyAqCisgKiBSRVRVUk4gICAgIDogYWx3YXlzIHJldHVybnMgMQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgUUNhbWVyYURpc3BsYXk6OnZzeW5jRXZlbnRSZWNlaXZlckNhbWVyYShfX3VudXNlZCBpbnQgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3VudXNlZCBpbnQgZXZlbnRzLCB2b2lkKiBkYXRhKSB7CisgICAgYW5kcm9pZDo6RGlzcGxheUV2ZW50UmVjZWl2ZXI6OkV2ZW50IGJ1ZmZlcltESVNQTEFZX0VWRU5UX1JFQ0VJVkVSX0FSUkFZX1NJWkVdOworICAgIFFDYW1lcmFEaXNwbGF5KiBwUUNhbWVyYURpc3BsYXkgPSAoUUNhbWVyYURpc3BsYXkgKikgZGF0YTsKKyAgICBzc2l6ZV90IG47CisKKyAgICB3aGlsZSAoKG4gPSBwUUNhbWVyYURpc3BsYXktPm1EaXNwbGF5RXZlbnRSZWNlaXZlci5nZXRFdmVudHMoYnVmZmVyLAorICAgICAgICAgICAgRElTUExBWV9FVkVOVF9SRUNFSVZFUl9BUlJBWV9TSVpFKSkgPiAwKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG4gOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJbaV0uaGVhZGVyLnR5cGUgPT0gRGlzcGxheUV2ZW50UmVjZWl2ZXI6OkRJU1BMQVlfRVZFTlRfVlNZTkMpIHsKKyAgICAgICAgICAgICAgICBwUUNhbWVyYURpc3BsYXktPmNvbXB1dGVBdmVyYWdlVnN5bmNJbnRlcnZhbChidWZmZXJbaV0uaGVhZGVyLnRpbWVzdGFtcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogdnN5bmNUaHJlYWRDYW1lcmEKKyAqCisgKiBERVNDUklQVElPTjogVGhyZWFkIHJlZ2lzdGVycyBhIGNhbGwgYmFjayBmdW5jdGlvbiBmb3IgZXZlcnkgdnN5bmMgZXZlbnQKKyAqICAgICAgICAgICAgICB3YWl0cyBvbiB0aGUgbG9vcGVyIGZvciB0aGUgbmV4dCB2c3luYy4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRhdGEgICAgOiByZWNlaXZlcyB2c3luY19pbmZvX3Qgc3RydWN0dXJlLgorICoKKyAqIFJFVFVSTiAgICAgOiBOVUxMLkp1c3QgdG8gZnVsbGZpbGwgdGhlIHR5cGUgcmVxdWlyZW1lbnQgb2YgdGhyZWFkIGZ1bmN0aW9uLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkKiBRQ2FtZXJhRGlzcGxheTo6dnN5bmNUaHJlYWRDYW1lcmEodm9pZCAqIGRhdGEpCit7CisgICAgUUNhbWVyYURpc3BsYXkqIHBRQ2FtZXJhRGlzcGxheSA9IChRQ2FtZXJhRGlzcGxheSAqKSBkYXRhOworICAgIGFuZHJvaWQ6OnNwPExvb3Blcj4gbG9vcGVyOworCisgICAgbG9vcGVyID0gbmV3IGFuZHJvaWQ6Okxvb3BlcihmYWxzZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcFFDYW1lcmFEaXNwbGF5LT5tRGlzcGxheUV2ZW50UmVjZWl2ZXIuaW5pdENoZWNrKCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBMT0dFKCJJbml0aWFsaXphdGlvbiBvZiBEaXNwbGF5RXZlbnRSZWNlaXZlciBmYWlsZWQgd2l0aCBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGxvb3Blci0+YWRkRmQocFFDYW1lcmFEaXNwbGF5LT5tRGlzcGxheUV2ZW50UmVjZWl2ZXIuZ2V0RmQoKSwgMCwgQUxPT1BFUl9FVkVOVF9JTlBVVCwKKyAgICAgICAgICAgIFFDYW1lcmFEaXNwbGF5Ojp2c3luY0V2ZW50UmVjZWl2ZXJDYW1lcmEsIHBRQ2FtZXJhRGlzcGxheSk7CisgICAgcFFDYW1lcmFEaXNwbGF5LT5tRGlzcGxheUV2ZW50UmVjZWl2ZXIuc2V0VnN5bmNSYXRlKDEpOworICAgIHdoaWxlKHBRQ2FtZXJhRGlzcGxheS0+bVRocmVhZEV4aXQgPT0gMCkKKyAgICB7CisgICAgICAgIGxvb3Blci0+cG9sbE9uY2UoQ0FNRVJBX1ZTWU5DX1dBSVRfTVMpOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYURpc3BsYXkKKyAqCisgKiBERVNDUklQVElPTjogY29uc3RydWN0b3Igb2YgUUNhbWVyYURpc3BsYXkKKyAqCisgKiBQQVJBTUVURVJTIDogbm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBub25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFEaXNwbGF5OjpRQ2FtZXJhRGlzcGxheSgpCisgICAgOiBtVnN5bmNUaW1lU3RhbXAoMCksCisgICAgICBtQXZnVnN5bmNJbnRlcnZhbCgwKSwKKyAgICAgIG1PbGRUaW1lU3RhbXAoMCksCisgICAgICBtVnN5bmNIaXN0b3J5SW5kZXgoMCksCisgICAgICBtQWRkaXRpb25hbFZzeW5jT2Zmc2V0Rm9yV2lnZ2xlKDApLAorICAgICAgbVRocmVhZEV4aXQoMCksCisgICAgICBtTnVtX3ZzeW5jX2Zyb21fdmZlX2lzcl90b19wcmVzZW50YXRpb25fdGltZXN0YW1wKDApLAorICAgICAgbVNldF90aW1lc3RhbXBfbnVtX25zX3ByaW9yX3RvX3ZzeW5jKDApLAorICAgICAgbVZmZV9hbmRfbWRwX2ZyZXFfd2lnZ2xlX2ZpbHRlcl9tYXhfbnMoMCksCisgICAgICBtVmZlX2FuZF9tZHBfZnJlcV93aWdnbGVfZmlsdGVyX21pbl9ucygwKQoreworICAgIGludCByYyA9IE5PX0VSUk9SOworCisgICAgbWVtc2V0KCZtVnN5bmNJbnRlcnZhbEhpc3RvcnksIDAsIHNpemVvZihtVnN5bmNJbnRlcnZhbEhpc3RvcnkpKTsKKyAgICByYyA9IHB0aHJlYWRfY3JlYXRlKCZtVnN5bmNUaHJlYWRDYW1lcmFIYW5kbGUsIE5VTEwsIHZzeW5jVGhyZWFkQ2FtZXJhLCAodm9pZCAqKXRoaXMpOworICAgIGlmIChyYyA9PSBOT19FUlJPUikgeworICAgICAgICBjaGFyICAgIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgIG5zZWNzX3QgZGVmYXVsdF92c3luY19pbnRlcnZhbDsKKyAgICAgICAgcHRocmVhZF9zZXRuYW1lX25wKG1Wc3luY1RocmVhZENhbWVyYUhhbmRsZSwgIkNBTV9Wc3luYyIpOworICAgICAgICAvLyBSZWFkIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIHVzZWQgZm9yIHR1bmluZworICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmRpc3AubnVtX3ZzeW5jIiwgdmFsdWUsICI0Iik7CisgICAgICAgIG1OdW1fdnN5bmNfZnJvbV92ZmVfaXNyX3RvX3ByZXNlbnRhdGlvbl90aW1lc3RhbXAgPSBhdG9pKHZhbHVlKTsKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5kaXNwLm1zX3RvX3ZzeW5jIiwgdmFsdWUsICIyIik7CisgICAgICAgIG1TZXRfdGltZXN0YW1wX251bV9uc19wcmlvcl90b192c3luYyA9IGF0b2kodmFsdWUpICogTlNFQ19QRVJfTVNFQzsKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJwZXJzaXN0LmNhbWVyYS5kaXNwLmZpbHRlcl9tYXgiLCB2YWx1ZSwgIjIiKTsKKyAgICAgICAgbVZmZV9hbmRfbWRwX2ZyZXFfd2lnZ2xlX2ZpbHRlcl9tYXhfbnMgPSBhdG9pKHZhbHVlKSAqIE5TRUNfUEVSX01TRUM7CisgICAgICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEuZGlzcC5maWx0ZXJfbWluIiwgdmFsdWUsICI0Iik7CisgICAgICAgIG1WZmVfYW5kX21kcF9mcmVxX3dpZ2dsZV9maWx0ZXJfbWluX25zID0gYXRvaSh2YWx1ZSkgKiBOU0VDX1BFUl9NU0VDOworICAgICAgICBwcm9wZXJ0eV9nZXQoInBlcnNpc3QuY2FtZXJhLmRpc3AuZnBzIiwgdmFsdWUsICI2MCIpOworICAgICAgICBpZiAoYXRvaSh2YWx1ZSkgPiAwKSB7CisgICAgICAgICAgICBkZWZhdWx0X3ZzeW5jX2ludGVydmFsPSBzMm5zKDEpIC8gYXRvaSh2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWZhdWx0X3ZzeW5jX2ludGVydmFsPSBzMm5zKDEpIC8gRElTUExBWV9ERUZBVUxUX0ZQUzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBDQU1FUkFfTlVNX1ZTWU5DX0lOVEVSVkFMX0hJU1RPUlk7IGkrKykgeworICAgICAgICAgICAgbVZzeW5jSW50ZXJ2YWxIaXN0b3J5W2ldID0gZGVmYXVsdF92c3luY19pbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJkaXNwbGF5IGppdHRlciBudW1fdnN5bmNfZnJvbV92ZmVfaXNyX3RvX3ByZXNlbnRhdGlvbl90aW1lc3RhbXAgJXUgXAorICAgICAgICAgICAgICAgIHNldF90aW1lc3RhbXBfbnVtX25zX3ByaW9yX3RvX3ZzeW5jICVsbHUiLAorICAgICAgICAgICAgICAgIG1OdW1fdnN5bmNfZnJvbV92ZmVfaXNyX3RvX3ByZXNlbnRhdGlvbl90aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgbVNldF90aW1lc3RhbXBfbnVtX25zX3ByaW9yX3RvX3ZzeW5jKTsKKyAgICAgICAgTE9HRCgiZGlzcGxheSBqaXR0ZXIgdmZlX2FuZF9tZHBfZnJlcV93aWdnbGVfZmlsdGVyX21heF9ucyAlbGx1IFwKKyAgICAgICAgICAgICAgICB2ZmVfYW5kX21kcF9mcmVxX3dpZ2dsZV9maWx0ZXJfbWluX25zICVsbHUiLAorICAgICAgICAgICAgICAgIG1WZmVfYW5kX21kcF9mcmVxX3dpZ2dsZV9maWx0ZXJfbWF4X25zLAorICAgICAgICAgICAgICAgIG1WZmVfYW5kX21kcF9mcmVxX3dpZ2dsZV9maWx0ZXJfbWluX25zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtVnN5bmNUaHJlYWRDYW1lcmFIYW5kbGUgPSAwOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYURpc3BsYXkKKyAqCisgKiBERVNDUklQVElPTjogZGVzdHJ1Y3RvciBvZiBRQ2FtZXJhRGlzcGxheQorICoKKyAqIFBBUkFNRVRFUlMgOiBub25lCisgKgorICogUkVUVVJOICAgICA6IG5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYURpc3BsYXk6On5RQ2FtZXJhRGlzcGxheSgpCit7CisgICAgbVRocmVhZEV4aXQgPSAxOworICAgIGlmIChtVnN5bmNUaHJlYWRDYW1lcmFIYW5kbGUgIT0gMCkgeworICAgICAgICBwdGhyZWFkX2pvaW4obVZzeW5jVGhyZWFkQ2FtZXJhSGFuZGxlLCBOVUxMKTsKKyAgICB9Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogY29tcHV0ZUF2ZXJhZ2VWc3luY0ludGVydmFsCisgKgorICogREVTQ1JJUFRJT046IENvbXB1dGVzIGF2ZXJhZ2UgdnN5bmMgaW50ZXJ2YWwgdXNpbmcgY3VycmVudCBhbmQgcHJldmlvdXNseQorICogICAgICAgICAgICAgIHN0b3JlZCB2c3luYyBkYXRhLgorICoKKyAqIFBBUkFNRVRFUlMgOiBjdXJyZW50IHZzeW5jIHRpbWUgc3RhbXAKKyAqCisgKiBSRVRVUk4gICAgIDogbm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFEaXNwbGF5Ojpjb21wdXRlQXZlcmFnZVZzeW5jSW50ZXJ2YWwobnNlY3NfdCBjdXJyZW50VnN5bmNUaW1lU3RhbXApCit7CisgICAgbnNlY3NfdCBzdW07CisgICAgbnNlY3NfdCB2c3luY01heE91dGxpZXI7CisgICAgbnNlY3NfdCB2c3luY01pbk91dGxpZXI7CisKKyAgICBtVnN5bmNUaW1lU3RhbXAgPSBjdXJyZW50VnN5bmNUaW1lU3RhbXA7CisgICAgaWYgKG1PbGRUaW1lU3RhbXApIHsKKyAgICAgICAgLy8gQ29tcHV0ZSBhdmVyYWdlIHZzeW5jIGludGVydmFsIHVzaW5nIGN1cnJlbnQgYW5kIHByZXZpb3VzbHkgc3RvcmVkIHZzeW5jIGRhdGEuCisgICAgICAgIC8vIExlYXZlIHRoZSBtYXggYW5kIG1pbiB2c3luYyBpbnRlcnZhbCBmcm9tIGhpc3RvcnkgaW4gY29tcHV0aW5nIHRoZSBhdmVyYWdlLgorICAgICAgICBtVnN5bmNJbnRlcnZhbEhpc3RvcnlbbVZzeW5jSGlzdG9yeUluZGV4XSA9IGN1cnJlbnRWc3luY1RpbWVTdGFtcCAtIG1PbGRUaW1lU3RhbXA7CisgICAgICAgIG1Wc3luY0hpc3RvcnlJbmRleCsrOworICAgICAgICBtVnN5bmNIaXN0b3J5SW5kZXggPSBtVnN5bmNIaXN0b3J5SW5kZXggJSBDQU1FUkFfTlVNX1ZTWU5DX0lOVEVSVkFMX0hJU1RPUlk7CisgICAgICAgIHN1bSA9IG1Wc3luY0ludGVydmFsSGlzdG9yeVswXTsKKyAgICAgICAgdnN5bmNNYXhPdXRsaWVyID0gbVZzeW5jSW50ZXJ2YWxIaXN0b3J5WzBdOworICAgICAgICB2c3luY01pbk91dGxpZXIgPSBtVnN5bmNJbnRlcnZhbEhpc3RvcnlbMF07CisgICAgICAgIGZvciAoaW50IGo9MTsgajxDQU1FUkFfTlVNX1ZTWU5DX0lOVEVSVkFMX0hJU1RPUlk7IGorKykgeworICAgICAgICAgICAgc3VtICs9IG1Wc3luY0ludGVydmFsSGlzdG9yeVtqXTsKKyAgICAgICAgICAgIGlmICh2c3luY01heE91dGxpZXIgPCBtVnN5bmNJbnRlcnZhbEhpc3Rvcnlbal0pIHsKKyAgICAgICAgICAgICAgICB2c3luY01heE91dGxpZXIgPSBtVnN5bmNJbnRlcnZhbEhpc3Rvcnlbal07CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZzeW5jTWluT3V0bGllciA+IG1Wc3luY0ludGVydmFsSGlzdG9yeVtqXSkgeworICAgICAgICAgICAgICAgIHZzeW5jTWluT3V0bGllciA9IG1Wc3luY0ludGVydmFsSGlzdG9yeVtqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdW0gPSBzdW0gLSB2c3luY01heE91dGxpZXIgLSB2c3luY01pbk91dGxpZXI7CisgICAgICAgIG1BdmdWc3luY0ludGVydmFsID0gc3VtIC8gKENBTUVSQV9OVU1fVlNZTkNfSU5URVJWQUxfSElTVE9SWSAtIDIpOworICAgIH0KKyAgICBtT2xkVGltZVN0YW1wID0gY3VycmVudFZzeW5jVGltZVN0YW1wOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGNvbXB1dGVQcmVzZW50YXRpb25UaW1lU3RhbXAKKyAqCisgKiBERVNDUklQVElPTjogQ29tcHV0ZXMgcHJlc2VudGF0aW9uIHRpbWUgc3RhbXAgdXNpbmcgdnN5bmMgaW50ZXJ2YWwKKyAqICAgICAgICAgICAgICBhbmQgbGFzdCB2c3luYyB0aW1lIHN0YW1wIGFuZCBmZXcgb3RoZXIgdHVuYWJsZSB2YXJpYWJsZXMKKyAqICAgICAgICAgICAgICB0byBwbGFjZSB0aGUgdGltZSBzdGFtcCBhdCB0aGUgZXhwZWN0ZWQgZnV0dXJlIHZzeW5jCisgKgorICogUEFSQU1FVEVSUyA6IGN1cnJlbnQgZnJhbWUgdGltZSBzdGFtcCBzZXQgYnkgVkZFIHdoZW4gYnVmZmVyIGNvcHkgZG9uZS4KKyAqCisgKiBSRVRVUk4gICAgIDogdGltZSBzdGFtcCBpbiBmdXR1cmUgb3IgMCBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK25zZWNzX3QgUUNhbWVyYURpc3BsYXk6OmNvbXB1dGVQcmVzZW50YXRpb25UaW1lU3RhbXAobnNlY3NfdCBmcmFtZVRpbWVTdGFtcCkKK3sKKyAgICBuc2Vjc190IG1vdmVUb05leHRWc3luYzsKKyAgICBuc2Vjc190IGtlZXBJbkN1cnJlbnRWc3luYzsKKyAgICBuc2Vjc190IHRpbWVEaWZmZXJlbmNlICAgICAgICA9IDA7CisgICAgbnNlY3NfdCBwcmVzZW50YXRpb25UaW1lU3RhbXAgPSAwOworICAgIGludCAgICAgZXhwZWN0ZWRWc3luY09mZnNldCAgID0gMDsKKyAgICBpbnQgICAgIHZzeW5jT2Zmc2V0OworCisgICAgaWYgKCAobUF2Z1ZzeW5jSW50ZXJ2YWwgIT0gMCkgJiYgKG1Wc3luY1RpbWVTdGFtcCAhPSAwKSApIHsKKyAgICAgICAgLy8gQ29tcHV0ZSBwcmVzZW50YXRpb24gdGltZSBzdGFtcCBpbiBmdXR1cmUgYXMgcGVyIHRoZSBmb2xsb3dpbmcgZm9ybXVsYQorICAgICAgICAvLyBmdXR1cmUgdGltZSBzdGFtcCA9IHZmZSB0aW1lIHN0YW1wICsgIE4gKiAgYXZlcmFnZSB2c3luYyBpbnRlcnZhbAorICAgICAgICAvLyBBZGp1c3QgdGhlIHRpbWUgc3RhbXAgc28gdGhhdCBpdCBpcyBwbGFjZWQgZmV3IG1pbGxpc2Vjb25kcyBiZWZvcmUKKyAgICAgICAgLy8gdGhlIGV4cGVjdGVkIHZzeW5jLgorICAgICAgICAvLyBBZGp1c3QgdGhlIHRpbWUgc3RhbXAgZm9yIHRoZSBwZXJpb2Qgd2hlcmUgdnN5bmMgdGltZSBzdGFtcCBhbmQgVkZFCisgICAgICAgIC8vIHRpbXN0YW1wIGNyb3NzIG92ZXIgZHVlIGRpZmZlcmVuY2UgaW4gZnBzLgorICAgICAgICBwcmVzZW50YXRpb25UaW1lU3RhbXAgPSBmcmFtZVRpbWVTdGFtcCArCisgICAgICAgICAgICAgICAgKG1OdW1fdnN5bmNfZnJvbV92ZmVfaXNyX3RvX3ByZXNlbnRhdGlvbl90aW1lc3RhbXAgKiBtQXZnVnN5bmNJbnRlcnZhbCk7CisgICAgICAgIGlmIChwcmVzZW50YXRpb25UaW1lU3RhbXAgPiBtVnN5bmNUaW1lU3RhbXApIHsKKyAgICAgICAgICAgIHRpbWVEaWZmZXJlbmNlICAgICAgPSBwcmVzZW50YXRpb25UaW1lU3RhbXAgLSBtVnN5bmNUaW1lU3RhbXA7CisgICAgICAgICAgICBtb3ZlVG9OZXh0VnN5bmMgICAgID0gbUF2Z1ZzeW5jSW50ZXJ2YWwgLSBtVmZlX2FuZF9tZHBfZnJlcV93aWdnbGVfZmlsdGVyX21pbl9uczsKKyAgICAgICAgICAgIGtlZXBJbkN1cnJlbnRWc3luYyAgPSBtQXZnVnN5bmNJbnRlcnZhbCAtIG1WZmVfYW5kX21kcF9mcmVxX3dpZ2dsZV9maWx0ZXJfbWF4X25zOworICAgICAgICAgICAgdnN5bmNPZmZzZXQgICAgICAgICA9IHRpbWVEaWZmZXJlbmNlICUgbUF2Z1ZzeW5jSW50ZXJ2YWw7CisgICAgICAgICAgICBleHBlY3RlZFZzeW5jT2Zmc2V0ID0gbUF2Z1ZzeW5jSW50ZXJ2YWwgLQorICAgICAgICAgICAgICAgICAgICBtU2V0X3RpbWVzdGFtcF9udW1fbnNfcHJpb3JfdG9fdnN5bmMgLSB2c3luY09mZnNldDsKKyAgICAgICAgICAgIGlmICh2c3luY09mZnNldCA+IG1vdmVUb05leHRWc3luYykgeworICAgICAgICAgICAgICAgIG1BZGRpdGlvbmFsVnN5bmNPZmZzZXRGb3JXaWdnbGUgPSBtQXZnVnN5bmNJbnRlcnZhbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodnN5bmNPZmZzZXQgPCBrZWVwSW5DdXJyZW50VnN5bmMpIHsKKyAgICAgICAgICAgICAgICBtQWRkaXRpb25hbFZzeW5jT2Zmc2V0Rm9yV2lnZ2xlID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR0QoInZzeW5jVGltZVN0YW1wOiAlbGx1IHByZXNlbnRhdGlvblRpbWVTdGFtcDogJWxsdSBleHBlY3RlZFZzeW5jT2Zmc2V0OiAlZCBcCisgICAgICAgICAgICAgICAgICAgIHRpbWVEaWZmZXJlbmNlOiAlbGx1IHZzeW5jZmZzZXQ6ICVkIGF2Z3ZzeW5jOiAlbGx1IFwKKyAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbHZzeW5jT2Zmc2V0Rm9yV2lnZ2xlOiAlbGx1IiwKKyAgICAgICAgICAgICAgICAgICAgbVZzeW5jVGltZVN0YW1wLCBwcmVzZW50YXRpb25UaW1lU3RhbXAsIGV4cGVjdGVkVnN5bmNPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHRpbWVEaWZmZXJlbmNlLCB2c3luY09mZnNldCwgbUF2Z1ZzeW5jSW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgICAgIG1BZGRpdGlvbmFsVnN5bmNPZmZzZXRGb3JXaWdnbGUpOworICAgICAgICB9CisgICAgICAgIHByZXNlbnRhdGlvblRpbWVTdGFtcCA9IHByZXNlbnRhdGlvblRpbWVTdGFtcCArIGV4cGVjdGVkVnN5bmNPZmZzZXQgKworICAgICAgICAgICAgICAgIG1BZGRpdGlvbmFsVnN5bmNPZmZzZXRGb3JXaWdnbGU7CisgICAgfQorICAgIHJldHVybiBwcmVzZW50YXRpb25UaW1lU3RhbXA7Cit9CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhRGlzcGxheS5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYURpc3BsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2E0MDAzCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYURpc3BsYXkuaApAQCAtMCwwICsxLDc3IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19RQ0FNRVJBRElTUExBWV9IX18KKyNkZWZpbmUgX19RQ0FNRVJBRElTUExBWV9IX18KKworI2luY2x1ZGUgPGd1aS9EaXNwbGF5RXZlbnRSZWNlaXZlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvbG9vcGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9vcGVyLmg+CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworI2RlZmluZSBDQU1FUkFfTlVNX1ZTWU5DX0lOVEVSVkFMX0hJU1RPUlkgIDgKKyNkZWZpbmUgTlNFQ19QRVJfTVNFQyAxMDAwMDAwTExVCisKK2NsYXNzIFFDYW1lcmFEaXNwbGF5IHsKK3B1YmxpYzoKKyAgICBRQ2FtZXJhRGlzcGxheSgpOworICAgIH5RQ2FtZXJhRGlzcGxheSgpOworICAgIHN0YXRpYyBpbnQgICB2c3luY0V2ZW50UmVjZWl2ZXJDYW1lcmEoaW50IGZkLCBpbnQgZXZlbnRzLCB2b2lkKiBkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCogdnN5bmNUaHJlYWRDYW1lcmEodm9pZCAqIGRhdGEpOworICAgIHZvaWQgICAgICAgICBjb21wdXRlQXZlcmFnZVZzeW5jSW50ZXJ2YWwobnNlY3NfdCBjdXJyZW50VnN5bmNUaW1lU3RhbXApOworICAgIG5zZWNzX3QgICAgICBjb21wdXRlUHJlc2VudGF0aW9uVGltZVN0YW1wKG5zZWNzX3QgZnJhbWVUaW1lU3RhbXApOworCitwcml2YXRlOgorICAgIHB0aHJlYWRfdCBtVnN5bmNUaHJlYWRDYW1lcmFIYW5kbGU7CisgICAgbnNlY3NfdCAgIG1Wc3luY1RpbWVTdGFtcDsKKyAgICBuc2Vjc190ICAgbUF2Z1ZzeW5jSW50ZXJ2YWw7CisgICAgbnNlY3NfdCAgIG1PbGRUaW1lU3RhbXA7CisgICAgbnNlY3NfdCAgIG1Wc3luY0ludGVydmFsSGlzdG9yeVtDQU1FUkFfTlVNX1ZTWU5DX0lOVEVSVkFMX0hJU1RPUlldOworICAgIG5zZWNzX3QgICBtVnN5bmNIaXN0b3J5SW5kZXg7CisgICAgbnNlY3NfdCAgIG1BZGRpdGlvbmFsVnN5bmNPZmZzZXRGb3JXaWdnbGU7CisgICAgdWludDMyX3QgIG1UaHJlYWRFeGl0OworICAgIC8vIFR1bmFibGUgcHJvcGVydHkuIEluY3JlYXNpbmcgdGhpcyB3aWxsIGluY3JlYXNlIHRoZSBmcmFtZSBkZWxheSBhbmQgd2lsbCBsb29zZQorICAgIC8vIHRoZSByZWFsIHRpbWUgZGlzcGxheS4KKyAgICB1aW50MzJfdCAgbU51bV92c3luY19mcm9tX3ZmZV9pc3JfdG9fcHJlc2VudGF0aW9uX3RpbWVzdGFtcDsKKyAgICAvLyBUdW5hYmxlIHByb3BlcnR5LiBTZXQgdGhlIHRpbWUgc3RhbXAgeCBucyBwcmlvciB0byBleHBlY3RlZCB2c3luYyBzbyB0aGF0CisgICAgLy8gaXQgd2lsbCBiZSBwaWNrZWQgaW4gdGhhdCB2c3luYworICAgIG5zZWNzX3QgIG1TZXRfdGltZXN0YW1wX251bV9uc19wcmlvcl90b192c3luYzsKKyAgICAvLyBUdW5hYmxlIHByb3BlcnR5IGZvciBmaWx0ZXJpbmcgdGltZXN0YW1wIHdpZ2dsZSB3aGVuIFZGRSBJU1IgY3Jvc3NlcworICAgIC8vIG92ZXIgTURQIElTUiBvdmVyIGEgcGVyaW9kLiBUeXBpY2FsIHNjZW5hcmlvIGlzIFZGRSBpcyBydW5uaW5nIGF0CisgICAgLy8gMzAuMiBmcHMgdnMgZGlzcGxheSBydW5uaW5nIGF0IDYwIGZwcy4KKyAgICBuc2Vjc190ICBtVmZlX2FuZF9tZHBfZnJlcV93aWdnbGVfZmlsdGVyX21heF9uczsKKyAgICBuc2Vjc190ICBtVmZlX2FuZF9tZHBfZnJlcV93aWdnbGVfZmlsdGVyX21pbl9uczsKKworICAgIGFuZHJvaWQ6OkRpc3BsYXlFdmVudFJlY2VpdmVyICBtRGlzcGxheUV2ZW50UmVjZWl2ZXI7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgcWNhbWVyYQorCisjZW5kaWYgLyogX19RQ0FNRVJBRElTUExBWV9IX18gKi8KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi91dGlsL1FDYW1lcmFGbGFzaC5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhRmxhc2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNTE3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhRmxhc2guY3BwCkBAIC0wLDAgKzEsNDEzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisqIG1ldDoKKyogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyoKKyovCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWVkaWEvbXNtX2NhbV9zZW5zb3IuaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgIkhBTDMvUUNhbWVyYTNIV0kuaCIKKyNpbmNsdWRlICJRQ2FtZXJhRmxhc2guaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSAibW1fY2FtZXJhX2RiZy5oIgorfQorCisjZGVmaW5lIFNUUklOR19MRU5HVEhfT0ZfNjRfQklUX05VTUJFUiAyMQorCit2b2xhdGlsZSB1aW50MzJfdCBnQ2FtSGFsM0xvZ0xldmVsID0gMTsKKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGdldEluc3RhbmNlCisgKgorICogREVTQ1JJUFRJT046IEdldCBhbmQgY3JlYXRlIHRoZSBRQ2FtZXJhRmxhc2ggc2luZ2xldG9uLgorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYUZsYXNoJiBRQ2FtZXJhRmxhc2g6OmdldEluc3RhbmNlKCkKK3sKKyAgICBzdGF0aWMgUUNhbWVyYUZsYXNoIGZsYXNoSW5zdGFuY2U7CisgICAgcmV0dXJuIGZsYXNoSW5zdGFuY2U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogUUNhbWVyYUZsYXNoCisgKgorICogREVTQ1JJUFRJT046IGRlZmF1bHQgY29uc3RydWN0b3Igb2YgUUNhbWVyYUZsYXNoCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhRmxhc2g6OlFDYW1lcmFGbGFzaCgpIDogbV9jYWxsYmFja3MoTlVMTCkKK3sKKyAgICBtZW1zZXQoJm1fZmxhc2hPbiwgMCwgc2l6ZW9mKG1fZmxhc2hPbikpOworICAgIG1lbXNldCgmbV9jYW1lcmFPcGVuLCAwLCBzaXplb2YobV9jYW1lcmFPcGVuKSk7CisgICAgZm9yIChpbnQgcG9zID0gMDsgcG9zIDwgTU1fQ0FNRVJBX01BWF9OVU1fU0VOU09SUzsgcG9zKyspIHsKKyAgICAgICAgbV9mbGFzaEZkc1twb3NdID0gLTE7CisgICAgfQorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IH5RQ2FtZXJhRmxhc2gKKyAqCisgKiBERVNDUklQVElPTjogZGVjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhRmxhc2gKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBOb25lCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK1FDYW1lcmFGbGFzaDo6flFDYW1lcmFGbGFzaCgpCit7CisgICAgZm9yIChpbnQgcG9zID0gMDsgcG9zIDwgTU1fQ0FNRVJBX01BWF9OVU1fU0VOU09SUzsgcG9zKyspIHsKKyAgICAgICAgaWYgKG1fZmxhc2hGZHNbcG9zXSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNldEZsYXNoTW9kZShwb3MsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBjbG9zZShtX2ZsYXNoRmRzW3Bvc10pOworICAgICAgICAgICAgICAgIG1fZmxhc2hGZHNbcG9zXSA9IC0xOworICAgICAgICAgICAgfQorICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZWdpc3RlckNhbGxiYWNrcworICoKKyAqIERFU0NSSVBUSU9OOiBwcm92aWRlIGZsYXNoIG1vZHVsZSB3aXRoIHJlZmVyZW5jZSB0byBjYWxsYmFja3MgdG8gZnJhbWV3b3JrCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFGbGFzaDo6cmVnaXN0ZXJDYWxsYmFja3MoCisgICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QqIGNhbGxiYWNrcykKK3sKKyAgICBpbnQzMl90IHJldFZhbCA9IDA7CisgICAgbV9jYWxsYmFja3MgPSBjYWxsYmFja3M7CisgICAgcmV0dXJuIHJldFZhbDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpbml0Rmxhc2gKKyAqCisgKiBERVNDUklQVElPTjogUmVzZXJ2ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZmxhc2ggdW5pdCBhc3NvY2lhdGVkIHdpdGggYQorICogICAgICAgICAgICAgIGdpdmVuIGNhbWVyYSBpZC4gVGhpcyBmdW5jdGlvbiBpcyBibG9ja2luZyB1bnRpbCB0aGUKKyAqICAgICAgICAgICAgICBvcGVyYXRpb24gY29tcGxldGVzIG9yIGZhaWxzLiBFYWNoIGZsYXNoIHVuaXQgY2FuIGJlICJpbml0ZWQiCisgKiAgICAgICAgICAgICAgYnkgb25seSBvbmUgcHJvY2VzcyBhdCBhIHRpbWUuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaWQgOiBDYW1lcmEgaWQgb2YgdGhlIGZsYXNoLgorICoKKyAqIFJFVFVSTiAgICAgOgorICogICAwICAgICAgICA6IHN1Y2Nlc3MKKyAqICAgLUVCVVNZICAgOiBUaGUgZmxhc2ggdW5pdCBvciB0aGUgcmVzb3VyY2UgbmVlZGVkIHRvIHR1cm4gb24gdGhlCisgKiAgICAgICAgICAgICAgdGhlIGZsYXNoIGlzIGJ1c3ksIHR5cGljYWxseSBiZWNhdXNlIHRoZSBmbGFzaCBpcworICogICAgICAgICAgICAgIGFscmVhZHkgaW4gdXNlLgorICogICAtRUlOVkFMICA6IE5vIGZsYXNoIHByZXNlbnQgYXQgY2FtZXJhX2lkLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFGbGFzaDo6aW5pdEZsYXNoKGNvbnN0IGludCBjYW1lcmFfaWQpCit7CisgICAgaW50MzJfdCByZXRWYWwgPSAwOworICAgIGJvb2wgaGFzRmxhc2ggPSBmYWxzZTsKKyAgICBjaGFyIGZsYXNoTm9kZVtRQ0FNRVJBX01BWF9GSUxFUEFUSF9MRU5HVEhdOworICAgIGNoYXIgZmxhc2hQYXRoW1FDQU1FUkFfTUFYX0ZJTEVQQVRIX0xFTkdUSF0gPSAiL2Rldi8iOworCisgICAgaWYgKGNhbWVyYV9pZCA8IDAgfHwgY2FtZXJhX2lkID49IE1NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlMpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBjYW1lcmEgaWQ6ICVkIiwgY2FtZXJhX2lkKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgUUNhbWVyYTNIYXJkd2FyZUludGVyZmFjZTo6Z2V0Rmxhc2hJbmZvKGNhbWVyYV9pZCwKKyAgICAgICAgICAgIGhhc0ZsYXNoLAorICAgICAgICAgICAgZmxhc2hOb2RlKTsKKworICAgIHN0cmxjYXQoZmxhc2hQYXRoLAorICAgICAgICAgICAgZmxhc2hOb2RlLAorICAgICAgICAgICAgc2l6ZW9mKGZsYXNoUGF0aCkpOworCisgICAgaWYgKCFoYXNGbGFzaCkgeworICAgICAgICBMT0dFKCJObyBmbGFzaCBhdmFpbGFibGUgZm9yIGNhbWVyYSBpZDogJWQiLAorICAgICAgICAgICAgICAgIGNhbWVyYV9pZCk7CisgICAgICAgIHJldFZhbCA9IC1FSU5WQUw7CisgICAgfSBlbHNlIGlmIChtX2NhbWVyYU9wZW5bY2FtZXJhX2lkXSkgeworICAgICAgICBMT0dFKCJDYW1lcmEgaW4gdXNlIGZvciBjYW1lcmEgaWQ6ICVkIiwKKyAgICAgICAgICAgICAgICBjYW1lcmFfaWQpOworICAgICAgICByZXRWYWwgPSAtRUJVU1k7CisgICAgfSBlbHNlIGlmIChtX2ZsYXNoRmRzW2NhbWVyYV9pZF0gPj0gMCkgeworICAgICAgICBMT0dEKCJGbGFzaCBpcyBhbHJlYWR5IGluaXRlZCBmb3IgY2FtZXJhIGlkOiAlZCIsCisgICAgICAgICAgICAgICAgY2FtZXJhX2lkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtX2ZsYXNoRmRzW2NhbWVyYV9pZF0gPSBvcGVuKGZsYXNoUGF0aCwgT19SRFdSIHwgT19OT05CTE9DSyk7CisKKyAgICAgICAgaWYgKG1fZmxhc2hGZHNbY2FtZXJhX2lkXSA8IDApIHsKKyAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBvcGVuIG5vZGUgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgIGZsYXNoUGF0aCk7CisgICAgICAgICAgICByZXRWYWwgPSAtRUJVU1k7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJ1Y3QgbXNtX2ZsYXNoX2NmZ19kYXRhX3QgY2ZnOworICAgICAgICAgICAgc3RydWN0IG1zbV9mbGFzaF9pbml0X2luZm9fdCBpbml0X2luZm87CisgICAgICAgICAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKHN0cnVjdCBtc21fZmxhc2hfY2ZnX2RhdGFfdCkpOworICAgICAgICAgICAgbWVtc2V0KCZpbml0X2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgbXNtX2ZsYXNoX2luaXRfaW5mb190KSk7CisgICAgICAgICAgICBpbml0X2luZm8uZmxhc2hfZHJpdmVyX3R5cGUgPSBGTEFTSF9EUklWRVJfREVGQVVMVDsKKyAgICAgICAgICAgIGNmZy5jZmcuZmxhc2hfaW5pdF9pbmZvID0gJmluaXRfaW5mbzsKKyAgICAgICAgICAgIGNmZy5jZmdfdHlwZSA9IENGR19GTEFTSF9JTklUOworICAgICAgICAgICAgcmV0VmFsID0gaW9jdGwobV9mbGFzaEZkc1tjYW1lcmFfaWRdLAorICAgICAgICAgICAgICAgICAgICBWSURJT0NfTVNNX0ZMQVNIX0NGRywKKyAgICAgICAgICAgICAgICAgICAgJmNmZyk7CisgICAgICAgICAgICBpZiAocmV0VmFsIDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoIlVuYWJsZSB0byBpbml0IGZsYXNoIGZvciBjYW1lcmEgaWQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9pZCk7CisgICAgICAgICAgICAgICAgY2xvc2UobV9mbGFzaEZkc1tjYW1lcmFfaWRdKTsKKyAgICAgICAgICAgICAgICBtX2ZsYXNoRmRzW2NhbWVyYV9pZF0gPSAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogd2FpdCBmb3IgUE1JQyB0byBpbml0ICovCisgICAgICAgICAgICB1c2xlZXAoNTAwMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMT0dEKCJYLCByZXRWYWwgPSAlZCIsIHJldFZhbCk7CisgICAgcmV0dXJuIHJldFZhbDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzZXRGbGFzaE1vZGUKKyAqCisgKiBERVNDUklQVElPTjogVHVybiBvbiBvciBvZmYgdGhlIGZsYXNoIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGhhbmRsZS4KKyAqICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGJsb2NraW5nIHVudGlsIHRoZSBvcGVyYXRpb24gY29tcGxldGVzIG9yCisgKiAgICAgICAgICAgICAgZmFpbHMuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaWQgIDogQ2FtZXJhIGlkIG9mIHRoZSBmbGFzaAorICogICBAb24gICAgICAgICA6IFdoZXRoZXIgdG8gdHVybiBmbGFzaCBvbiAodHJ1ZSkgb3Igb2ZmIChmYWxzZSkKKyAqCisgKiBSRVRVUk4gICAgIDoKKyAqICAgMCAgICAgICAgOiBzdWNjZXNzCisgKiAgIC1FSU5WQUwgIDogTm8gY2FtZXJhIHByZXNlbnQgYXQgY2FtZXJhX2lkLCBvciBpdCBpcyBub3QgaW5pdGVkLgorICogICAtRUFMUkVBRFk6IEZsYXNoIGlzIGFscmVhZHkgaW4gcmVxdWVzdGVkIHN0YXRlCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludDMyX3QgUUNhbWVyYUZsYXNoOjpzZXRGbGFzaE1vZGUoY29uc3QgaW50IGNhbWVyYV9pZCwgY29uc3QgYm9vbCBtb2RlKQoreworICAgIGludDMyX3QgcmV0VmFsID0gMDsKKyAgICBzdHJ1Y3QgbXNtX2ZsYXNoX2NmZ19kYXRhX3QgY2ZnOworCisgICAgaWYgKGNhbWVyYV9pZCA8IDAgfHwgY2FtZXJhX2lkID49IE1NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlMpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBjYW1lcmEgaWQ6ICVkIiwgY2FtZXJhX2lkKTsKKyAgICAgICAgcmV0VmFsID0gLUVJTlZBTDsKKyAgICB9IGVsc2UgaWYgKG1vZGUgPT0gbV9mbGFzaE9uW2NhbWVyYV9pZF0pIHsKKyAgICAgICAgTE9HRCgiZmxhc2ggJWQgaXMgYWxyZWFkeSBpbiByZXF1ZXN0ZWQgc3RhdGU6ICVkIiwKKyAgICAgICAgICAgICAgICBjYW1lcmFfaWQsCisgICAgICAgICAgICAgICAgbW9kZSk7CisgICAgICAgIHJldFZhbCA9IC1FQUxSRUFEWTsKKyAgICB9IGVsc2UgaWYgKG1fZmxhc2hGZHNbY2FtZXJhX2lkXSA8IDApIHsKKyAgICAgICAgTE9HRSgiY2FsbGVkIGZvciB1bmluaXRlZCBmbGFzaDogJWQiLCBjYW1lcmFfaWQpOworICAgICAgICByZXRWYWwgPSAtRUlOVkFMOworICAgIH0gIGVsc2UgeworICAgICAgICBtZW1zZXQoJmNmZywgMCwgc2l6ZW9mKHN0cnVjdCBtc21fZmxhc2hfY2ZnX2RhdGFfdCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9MRURfVFJJR0dFUlM7IGkrKykKKyAgICAgICAgICAgIGNmZy5mbGFzaF9jdXJyZW50W2ldID0gUUNBTUVSQV9UT1JDSF9DVVJSRU5UX1ZBTFVFOworICAgICAgICBjZmcuY2ZnX3R5cGUgPSBtb2RlID8gQ0ZHX0ZMQVNIX0xPVzogQ0ZHX0ZMQVNIX09GRjsKKworICAgICAgICByZXRWYWwgPSBpb2N0bChtX2ZsYXNoRmRzW2NhbWVyYV9pZF0sCisgICAgICAgICAgICAgICAgICAgICAgICBWSURJT0NfTVNNX0ZMQVNIX0NGRywKKyAgICAgICAgICAgICAgICAgICAgICAgICZjZmcpOworICAgICAgICBpZiAocmV0VmFsIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiVW5hYmxlIHRvIGNoYW5nZSBmbGFzaCBtb2RlIHRvICVkIGZvciBjYW1lcmEgaWQ6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgIG1vZGUsIGNhbWVyYV9pZCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtX2ZsYXNoT25bY2FtZXJhX2lkXSA9IG1vZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldFZhbDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBkZWluaXRGbGFzaAorICoKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIHRoZSBmbGFzaCB1bml0IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGNhbWVyYQorICogICAgICAgICAgICAgIHBvc2l0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIGJsb2NraW5nIHVudGlsIHRoZSBvcGVyYXRpb24KKyAqICAgICAgICAgICAgICBjb21wbGV0ZXMgb3IgZmFpbHMuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaWQgOiBDYW1lcmEgaWQgb2YgdGhlIGZsYXNoLgorICoKKyAqIFJFVFVSTiAgICAgOgorICogICAwICAgICAgICA6IHN1Y2Nlc3MKKyAqICAgLUVJTlZBTCAgOiBObyBjYW1lcmEgcHJlc2VudCBhdCBjYW1lcmFfaWQgb3Igbm90IGluaXRlZC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhRmxhc2g6OmRlaW5pdEZsYXNoKGNvbnN0IGludCBjYW1lcmFfaWQpCit7CisgICAgaW50MzJfdCByZXRWYWwgPSAwOworCisgICAgaWYgKGNhbWVyYV9pZCA8IDAgfHwgY2FtZXJhX2lkID49IE1NX0NBTUVSQV9NQVhfTlVNX1NFTlNPUlMpIHsKKyAgICAgICAgTE9HRSgiSW52YWxpZCBjYW1lcmEgaWQ6ICVkIiwgY2FtZXJhX2lkKTsKKyAgICAgICAgcmV0VmFsID0gLUVJTlZBTDsKKyAgICB9IGVsc2UgaWYgKG1fZmxhc2hGZHNbY2FtZXJhX2lkXSA8IDApIHsKKyAgICAgICAgTE9HRSgiY2FsbGVkIGRlaW5pdEZsYXNoIGZvciB1bmluaXRlZCBmbGFzaCIpOworICAgICAgICByZXRWYWwgPSAtRUlOVkFMOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldEZsYXNoTW9kZShjYW1lcmFfaWQsIGZhbHNlKTsKKworICAgICAgICBzdHJ1Y3QgbXNtX2ZsYXNoX2NmZ19kYXRhX3QgY2ZnOworICAgICAgICBjZmcuY2ZnX3R5cGUgPSBDRkdfRkxBU0hfUkVMRUFTRTsKKyAgICAgICAgcmV0VmFsID0gaW9jdGwobV9mbGFzaEZkc1tjYW1lcmFfaWRdLAorICAgICAgICAgICAgICAgIFZJRElPQ19NU01fRkxBU0hfQ0ZHLAorICAgICAgICAgICAgICAgICZjZmcpOworICAgICAgICBpZiAocmV0VmFsIDwgMCkgeworICAgICAgICAgICAgTE9HRSgiRmFpbGVkIHRvIHJlbGVhc2UgZmxhc2ggZm9yIGNhbWVyYSBpZDogJWQiLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmFfaWQpOworICAgICAgICB9CisKKyAgICAgICAgY2xvc2UobV9mbGFzaEZkc1tjYW1lcmFfaWRdKTsKKyAgICAgICAgbV9mbGFzaEZkc1tjYW1lcmFfaWRdID0gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHJldFZhbDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiByZXNlcnZlRmxhc2hGb3JDYW1lcmEKKyAqCisgKiBERVNDUklQVElPTjogR2l2ZSBjb250cm9sIG9mIHRoZSBmbGFzaCB0byB0aGUgY2FtZXJhLCBhbmQgbm90aWZ5CisgKiAgICAgICAgICAgICAgZnJhbWV3b3JrIHRoYXQgdGhlIGZsYXNoIGhhcyBiZWNvbWUgdW5hdmFpbGFibGUuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBjYW1lcmFfaWQgOiBDYW1lcmEgaWQgb2YgdGhlIGZsYXNoLgorICoKKyAqIFJFVFVSTiAgICAgOgorICogICAwICAgICAgICA6IHN1Y2Nlc3MKKyAqICAgLUVJTlZBTCAgOiBObyBjYW1lcmEgcHJlc2VudCBhdCBjYW1lcmFfaWQgb3Igbm90IGluaXRlZC4KKyAqICAgLUVOT1NZUyAgOiBObyBjYWxsYmFjayBhdmFpbGFibGUgZm9yIHRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhRmxhc2g6OnJlc2VydmVGbGFzaEZvckNhbWVyYShjb25zdCBpbnQgY2FtZXJhX2lkKQoreworICAgIGludDMyX3QgcmV0VmFsID0gMDsKKworICAgIGlmIChjYW1lcmFfaWQgPCAwIHx8IGNhbWVyYV9pZCA+PSBNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgY2FtZXJhIGlkOiAlZCIsIGNhbWVyYV9pZCk7CisgICAgICAgIHJldFZhbCA9IC1FSU5WQUw7CisgICAgfSBlbHNlIGlmIChtX2NhbWVyYU9wZW5bY2FtZXJhX2lkXSkgeworICAgICAgICBMT0dEKCJGbGFzaCBhbHJlYWR5IHJlc2VydmVkIGZvciBjYW1lcmEgaWQ6ICVkIiwKKyAgICAgICAgICAgICAgICBjYW1lcmFfaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtX2ZsYXNoT25bY2FtZXJhX2lkXSkgeworICAgICAgICAgICAgc2V0Rmxhc2hNb2RlKGNhbWVyYV9pZCwgZmFsc2UpOworICAgICAgICAgICAgZGVpbml0Rmxhc2goY2FtZXJhX2lkKTsKKyAgICAgICAgfQorICAgICAgICBtX2NhbWVyYU9wZW5bY2FtZXJhX2lkXSA9IHRydWU7CisKKyAgICAgICAgYm9vbCBoYXNGbGFzaCA9IGZhbHNlOworICAgICAgICBjaGFyIGZsYXNoTm9kZVtRQ0FNRVJBX01BWF9GSUxFUEFUSF9MRU5HVEhdOworCisgICAgICAgIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmdldEZsYXNoSW5mbyhjYW1lcmFfaWQsCisgICAgICAgICAgICAgICAgaGFzRmxhc2gsCisgICAgICAgICAgICAgICAgZmxhc2hOb2RlKTsKKworICAgICAgICBpZiAobV9jYWxsYmFja3MgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIG1fY2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiQ2FsbGJhY2sgaXMgbm90IGRlZmluZWQhIik7CisgICAgICAgICAgICByZXRWYWwgPSAtRU5PU1lTOworICAgICAgICB9IGVsc2UgaWYgKCFoYXNGbGFzaCkgeworICAgICAgICAgICAgTE9HRCgiU3VwcHJlc3NpbmcgY2FsbGJhY2sgIgorICAgICAgICAgICAgICAgICAgICAiYmVjYXVzZSBubyBmbGFzaCBleGlzdHMgZm9yIGNhbWVyYSBpZDogJWQiLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmFfaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciBjYW1lcmFJZFN0cltTVFJJTkdfTEVOR1RIX09GXzY0X0JJVF9OVU1CRVJdOworICAgICAgICAgICAgc25wcmludGYoY2FtZXJhSWRTdHIsIFNUUklOR19MRU5HVEhfT0ZfNjRfQklUX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgIiVkIiwgY2FtZXJhX2lkKTsKKyAgICAgICAgICAgIG1fY2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobV9jYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgICAgICBUT1JDSF9NT0RFX1NUQVRVU19OT1RfQVZBSUxBQkxFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXRWYWw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVsZWFzZUZsYXNoRnJvbUNhbWVyYQorICoKKyAqIERFU0NSSVBUSU9OOiBSZWxlYXNlIGNvbnRyb2wgb2YgdGhlIGZsYXNoIGZyb20gdGhlIGNhbWVyYSwgYW5kIG5vdGlmeQorICogICAgICAgICAgICAgIGZyYW1ld29yayB0aGF0IHRoZSBmbGFzaCBoYXMgYmVjb21lIGF2YWlsYWJsZS4KKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGNhbWVyYV9pZCA6IENhbWVyYSBpZCBvZiB0aGUgZmxhc2guCisgKgorICogUkVUVVJOICAgICA6CisgKiAgIDAgICAgICAgIDogc3VjY2VzcworICogICAtRUlOVkFMICA6IE5vIGNhbWVyYSBwcmVzZW50IGF0IGNhbWVyYV9pZCBvciBub3QgaW5pdGVkLgorICogICAtRU5PU1lTICA6IE5vIGNhbGxiYWNrIGF2YWlsYWJsZSBmb3IgdG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFGbGFzaDo6cmVsZWFzZUZsYXNoRnJvbUNhbWVyYShjb25zdCBpbnQgY2FtZXJhX2lkKQoreworICAgIGludDMyX3QgcmV0VmFsID0gMDsKKworICAgIGlmIChjYW1lcmFfaWQgPCAwIHx8IGNhbWVyYV9pZCA+PSBNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTKSB7CisgICAgICAgIExPR0UoIkludmFsaWQgY2FtZXJhIGlkOiAlZCIsIGNhbWVyYV9pZCk7CisgICAgICAgIHJldFZhbCA9IC1FSU5WQUw7CisgICAgfSBlbHNlIGlmICghbV9jYW1lcmFPcGVuW2NhbWVyYV9pZF0pIHsKKyAgICAgICAgTE9HRCgiRmxhc2ggbm90IHJlc2VydmVkIGZvciBjYW1lcmEgaWQ6ICVkIiwKKyAgICAgICAgICAgICAgICBjYW1lcmFfaWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1fY2FtZXJhT3BlbltjYW1lcmFfaWRdID0gZmFsc2U7CisKKyAgICAgICAgYm9vbCBoYXNGbGFzaCA9IGZhbHNlOworICAgICAgICBjaGFyIGZsYXNoTm9kZVtRQ0FNRVJBX01BWF9GSUxFUEFUSF9MRU5HVEhdOworCisgICAgICAgIFFDYW1lcmEzSGFyZHdhcmVJbnRlcmZhY2U6OmdldEZsYXNoSW5mbyhjYW1lcmFfaWQsCisgICAgICAgICAgICAgICAgaGFzRmxhc2gsCisgICAgICAgICAgICAgICAgZmxhc2hOb2RlKTsKKworICAgICAgICBpZiAobV9jYWxsYmFja3MgPT0gTlVMTCB8fAorICAgICAgICAgICAgICAgIG1fY2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiQ2FsbGJhY2sgaXMgbm90IGRlZmluZWQhIik7CisgICAgICAgICAgICByZXRWYWwgPSAtRU5PU1lTOworICAgICAgICB9IGVsc2UgaWYgKCFoYXNGbGFzaCkgeworICAgICAgICAgICAgTE9HRCgiU3VwcHJlc3NpbmcgY2FsbGJhY2sgIgorICAgICAgICAgICAgICAgICAgICAiYmVjYXVzZSBubyBmbGFzaCBleGlzdHMgZm9yIGNhbWVyYSBpZDogJWQiLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmFfaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciBjYW1lcmFJZFN0cltTVFJJTkdfTEVOR1RIX09GXzY0X0JJVF9OVU1CRVJdOworICAgICAgICAgICAgc25wcmludGYoY2FtZXJhSWRTdHIsIFNUUklOR19MRU5HVEhfT0ZfNjRfQklUX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgIiVkIiwgY2FtZXJhX2lkKTsKKyAgICAgICAgICAgIG1fY2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobV9jYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgICAgICBUT1JDSF9NT0RFX1NUQVRVU19BVkFJTEFCTEVfT0ZGKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXRWYWw7Cit9CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhRmxhc2guaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi91dGlsL1FDYW1lcmFGbGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZTY4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhRmxhc2guaApAQCAtMCwwICsxLDY5IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19RQ0FNRVJBX0ZMQVNIX0hfXworI2RlZmluZSBfX1FDQU1FUkFfRkxBU0hfSF9fCisKKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmFfY29tbW9uLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9pbnRlcmZhY2UuaCIKK30KKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisjZGVmaW5lIFFDQU1FUkFfVE9SQ0hfQ1VSUkVOVF9WQUxVRSAyMDAKKworY2xhc3MgUUNhbWVyYUZsYXNoIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUUNhbWVyYUZsYXNoJiBnZXRJbnN0YW5jZSgpOworCisgICAgaW50MzJfdCByZWdpc3RlckNhbGxiYWNrcyhjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190KiBjYWxsYmFja3MpOworICAgIGludDMyX3QgaW5pdEZsYXNoKGNvbnN0IGludCBjYW1lcmFfaWQpOworICAgIGludDMyX3Qgc2V0Rmxhc2hNb2RlKGNvbnN0IGludCBjYW1lcmFfaWQsIGNvbnN0IGJvb2wgb24pOworICAgIGludDMyX3QgZGVpbml0Rmxhc2goY29uc3QgaW50IGNhbWVyYV9pZCk7CisgICAgaW50MzJfdCByZXNlcnZlRmxhc2hGb3JDYW1lcmEoY29uc3QgaW50IGNhbWVyYV9pZCk7CisgICAgaW50MzJfdCByZWxlYXNlRmxhc2hGcm9tQ2FtZXJhKGNvbnN0IGludCBjYW1lcmFfaWQpOworCitwcml2YXRlOgorICAgIFFDYW1lcmFGbGFzaCgpOworICAgIHZpcnR1YWwgflFDYW1lcmFGbGFzaCgpOworICAgIFFDYW1lcmFGbGFzaChjb25zdCBRQ2FtZXJhRmxhc2gmKTsKKyAgICBRQ2FtZXJhRmxhc2gmIG9wZXJhdG9yPShjb25zdCBRQ2FtZXJhRmxhc2gmKTsKKworICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QgKm1fY2FsbGJhY2tzOworICAgIGludDMyX3QgbV9mbGFzaEZkc1tNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTXTsKKyAgICBib29sIG1fZmxhc2hPbltNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTXTsKKyAgICBib29sIG1fY2FtZXJhT3BlbltNTV9DQU1FUkFfTUFYX05VTV9TRU5TT1JTXTsKK307CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCisKKyNlbmRpZiAvKiBfX1FDQU1FUkFfRkxBU0hfSF9fICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhUGVyZi5jcHAgYi9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhUGVyZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE0M2YwZgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi91dGlsL1FDYW1lcmFQZXJmLmNwcApAQCAtMCwwICsxLDU0NSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorKiBtZXQ6CisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisjZGVmaW5lIExPR19UQUcgIlFDYW1lcmFQZXJmIgorCisvLyBUbyByZW1vdmUKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKy8vIENhbWVyYSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlICJRQ2FtZXJhUGVyZi5oIgorI2luY2x1ZGUgIlFDYW1lcmFUcmFjZS5oIgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJtbV9jYW1lcmFfZGJnLmgiCit9CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBRQ2FtZXJhUGVyZkxvY2sgY29uc3RydWN0b3IKKyAqCisgKiBERVNDUklQVElPTjogaW5pdGlhbGl6ZSBtZW1iZXIgdmFyaWFibGVzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdm9pZAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYVBlcmZMb2NrOjpRQ2FtZXJhUGVyZkxvY2soKSA6CisgICAgICAgIHBlcmZfbG9ja19hY3EoTlVMTCksCisgICAgICAgIHBlcmZfbG9ja19yZWwoTlVMTCksCisgICAgICAgIG1EbEhhbmRsZShOVUxMKSwKKyAgICAgICAgbVBlcmZMb2NrRW5hYmxlKDApLAorICAgICAgICBtUGVyZkxvY2tIYW5kbGUoLTEpLAorICAgICAgICBtUGVyZkxvY2tIYW5kbGVUaW1lZCgtMSksCisgICAgICAgIG1UaW1lclNldCgwKSwKKyAgICAgICAgbVBlcmZMb2NrVGltZW91dCgwKSwKKyAgICAgICAgbVN0YXJ0VGltZW9mTG9jaygwKQoreworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmFQZXJmTG9jayBkZXN0cnVjdG9yCisgKgorICogREVTQ1JJUFRJT046IGNsYXNzIGRlc2N0cnVjdG9yCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdm9pZAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYVBlcmZMb2NrOjp+UUNhbWVyYVBlcmZMb2NrKCkKK3sKKyAgICBsb2NrX2RlaW5pdCgpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbG9ja19pbml0CisgKgorICogREVTQ1JJUFRJT046IG9wZW5zIHRoZSBwZXJmb3JtYW5jZSBsaWIgYW5kIGluaXRpbGl6ZXMgdGhlIHBlcmYgbG9jayBmdW5jdGlvbnMKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiB2b2lkCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFQZXJmTG9jazo6bG9ja19pbml0KCkKK3sKKyAgICBjb25zdCBjaGFyICpyYzsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisKKyAgICBMT0dEKCJFIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgLy8gQ2xlYXIgdGhlIGxpc3Qgb2YgYWN0aXZlIHBvd2VyIGhpbnRzCisgICAgbUFjdGl2ZVBvd2VySGludHMuY2xlYXIoKTsKKyAgICBtQ3VycmVudFBvd2VySGludCAgICAgICA9IHN0YXRpY19jYXN0PHBvd2VyX2hpbnRfdD4oMCk7CisgICAgbUN1cnJlbnRQb3dlckhpbnRFbmFibGUgPSBmYWxzZTsKKworICAgIHByb3BlcnR5X2dldCgicGVyc2lzdC5jYW1lcmEucGVyZmxvY2suZW5hYmxlIiwgdmFsdWUsICIxIik7CisgICAgbVBlcmZMb2NrRW5hYmxlID0gYXRvaSh2YWx1ZSk7CisjaWZkZWYgSEFTX01VTFRJTUVESUFfSElOVFMKKyAgICBpZiAoaHdfZ2V0X21vZHVsZShQT1dFUl9IQVJEV0FSRV9NT0RVTEVfSUQsIChjb25zdCBod19tb2R1bGVfdCAqKikmbV9wUG93ZXJNb2R1bGUpKSB7CisgICAgICAgIExPR0UoIiVzIG1vZHVsZSBub3QgZm91bmQiLCBQT1dFUl9IQVJEV0FSRV9NT0RVTEVfSUQpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKG1QZXJmTG9ja0VuYWJsZSkgeworICAgICAgICBwZXJmX2xvY2tfYWNxID0gTlVMTDsKKyAgICAgICAgcGVyZl9sb2NrX3JlbCA9IE5VTEw7CisgICAgICAgIG1QZXJmTG9ja0hhbmRsZSA9IC0xOworICAgICAgICAvKiBSZXRyaWV2ZSBuYW1lIG9mIHZlbmRvciBleHRlbnNpb24gbGlicmFyeSAqLworICAgICAgICBpZiAocHJvcGVydHlfZ2V0KCJyby52ZW5kb3IuZXh0ZW5zaW9uX2xpYnJhcnkiLCB2YWx1ZSwgTlVMTCkgPD0gMCkgeworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgbURsSGFuZGxlID0gZGxvcGVuKHZhbHVlLCBSVExEX05PVyB8IFJUTERfTE9DQUwpOworICAgICAgICBpZiAobURsSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIGRsZXJyb3IoKTsKKworICAgICAgICBwZXJmX2xvY2tfYWNxID0gKGludCAoKikgKGludCwgaW50LCBpbnRbXSwgaW50KSlkbHN5bShtRGxIYW5kbGUsICJwZXJmX2xvY2tfYWNxIik7CisgICAgICAgIGlmICgocmMgPSBkbGVycm9yKCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIExPR0UoImZhaWxlZCB0byBwZXJmX2xvY2tfYWNxIGZ1bmN0aW9uIGhhbmRsZSIpOworICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICB9CisKKyAgICAgICAgcGVyZl9sb2NrX3JlbCA9IChpbnQgKCopIChpbnQpKWRsc3ltKG1EbEhhbmRsZSwgInBlcmZfbG9ja19yZWwiKTsKKyAgICAgICAgaWYgKChyYyA9IGRsZXJyb3IoKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIHBlcmZfbG9ja19yZWwgZnVuY3Rpb24gaGFuZGxlIik7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKyAgICAgICAgTE9HRCgiWCIpOworICAgICAgICByZXR1cm47CisKK2NsZWFudXA6CisgICAgICAgIHBlcmZfbG9ja19hY3EgID0gTlVMTDsKKyAgICAgICAgcGVyZl9sb2NrX3JlbCAgPSBOVUxMOworICAgICAgICBtUGVyZkxvY2tFbmFibGUgPSAwOworICAgICAgICBpZiAobURsSGFuZGxlKSB7CisgICAgICAgICAgICBkbGNsb3NlKG1EbEhhbmRsZSk7CisgICAgICAgICAgICBtRGxIYW5kbGUgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIExPR0QoIlgiKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBsb2NrX2RlaW5pdAorICoKKyAqIERFU0NSSVBUSU9OOiBkZWluaXRpYWxpemUgdGhlIHBlcmYgbG9jayBwYXJhbWV0ZXJzCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdm9pZAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhUGVyZkxvY2s6OmxvY2tfZGVpbml0KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1QZXJmTG9ja0VuYWJsZSkgeworICAgICAgICBMT0dEKCJFIik7CisKKyAgICAgICAgaWYgKG1BY3RpdmVQb3dlckhpbnRzLmVtcHR5KCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGFjdGl2ZSBwb3dlciBoaW50CisgICAgICAgICAgICBtQ3VycmVudFBvd2VySGludCA9ICptQWN0aXZlUG93ZXJIaW50cy5iZWdpbigpOworICAgICAgICAgICAgcG93ZXJIaW50SW50ZXJuYWwobUN1cnJlbnRQb3dlckhpbnQsIGZhbHNlKTsKKyAgICAgICAgICAgIG1BY3RpdmVQb3dlckhpbnRzLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKE5VTEwgIT0gcGVyZl9sb2NrX3JlbCkgJiYgKG1QZXJmTG9ja0hhbmRsZVRpbWVkID49IDApKSB7CisgICAgICAgICAgICAoKnBlcmZfbG9ja19yZWwpKG1QZXJmTG9ja0hhbmRsZVRpbWVkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoTlVMTCAhPSBwZXJmX2xvY2tfcmVsKSAmJiAobVBlcmZMb2NrSGFuZGxlID49IDApKSB7CisgICAgICAgICAgICAoKnBlcmZfbG9ja19yZWwpKG1QZXJmTG9ja0hhbmRsZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobURsSGFuZGxlKSB7CisgICAgICAgICAgICBwZXJmX2xvY2tfYWNxICA9IE5VTEw7CisgICAgICAgICAgICBwZXJmX2xvY2tfcmVsICA9IE5VTEw7CisKKyAgICAgICAgICAgIGRsY2xvc2UobURsSGFuZGxlKTsKKyAgICAgICAgICAgIG1EbEhhbmRsZSAgICAgICA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgbVBlcmZMb2NrRW5hYmxlID0gMDsKKyAgICAgICAgTE9HRCgiWCIpOworICAgIH0KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc1RpbWVyUmVzZXQKKyAqCisgKiBERVNDUklQVElPTjogQ2hlY2sgaWYgdGltb3V0IGR1cmF0aW9uIGlzIHJlYWNoZWQKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlIGlmIHRpbWVvdXQgcmVhY2hlZAorICogICAgICAgICAgICAgIGZhbHNlIGlmIHRpbWVvdXQgbm90IHJlYWNoZWQKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVBlcmZMb2NrOjppc1RpbWVyUmVzZXQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVBlcmZMb2NrRW5hYmxlICYmIG1UaW1lclNldCkgeworICAgICAgICBuc2Vjc190IHRpbWVEaWZmID0gc3lzdGVtVGltZSgpIC0gbVN0YXJ0VGltZW9mTG9jazsKKyAgICAgICAgaWYgKG5zMm1zKHRpbWVEaWZmKSA+ICh1aW50MzJfdCltUGVyZkxvY2tUaW1lb3V0KSB7CisgICAgICAgICAgICByZXNldFRpbWVyKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogcmVzZXRUaW1lcgorICoKKyAqIERFU0NSSVBUSU9OOiBSZXNldCB0aGUgdGltZXIgdXNlZCBpbiB0aW1lZCBwZXJmIGxvY2sKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiB2b2lkCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFQZXJmTG9jazo6cmVzZXRUaW1lcigpCit7CisgICAgbVBlcmZMb2NrVGltZW91dCA9IDA7CisgICAgbVRpbWVyU2V0ID0gMDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBzdGFydF90aW1lcgorICoKKyAqIERFU0NSSVBUSU9OOiBnZXQgdGhlIHN0YXJ0IG9mIHRoZSB0aW1lcgorICoKKyAqIFBBUkFNRVRFUlMgOgorICogIEB0aW1lcl92YWw6IHRpbWVyIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcworICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFQZXJmTG9jazo6c3RhcnRUaW1lcih1aW50MzJfdCB0aW1lcl92YWwpCit7CisgICAgbVN0YXJ0VGltZW9mTG9jayA9IHN5c3RlbVRpbWUoKTsKKyAgICBtVGltZXJTZXQgPSAxOworICAgIG1QZXJmTG9ja1RpbWVvdXQgPSB0aW1lcl92YWw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogbG9ja19hY3FfdGltZWQKKyAqCisgKiBERVNDUklQVElPTjogQWNxdWlyZSB0aGUgcGVyZm9ybWFuY2UgbG9jayBmb3IgdGhlIHNwZWNpZmllZCBkdXJhdGlvbi4KKyAqICAgICAgICAgICAgICBJZiBhbiBleGlzdGluZyBsb2NrIHRpbWVvdXQgaGFzIG5vdCBlbGFwc2VkLCBleHRlbmQgdGhlCisgKiAgICAgICAgICAgICAgbG9jayBmdXJ0aGVyIGZvciB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgQHRpbWVyX3ZhbDogbG9jayBkdXJhdGlvbgorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQZXJmTG9jazo6bG9ja19hY3FfdGltZWQoaW50MzJfdCB0aW1lcl92YWwpCit7CisgICAgaW50MzJfdCByZXQgPSAtMTsKKworICAgIExPR0QoIkUiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBpZiAobVBlcmZMb2NrRW5hYmxlKSB7CisgICAgICAgIGludDMyX3QgcGVyZl9sb2NrX3BhcmFtc1tdID0geworICAgICAgICAgICAgICAgIEFMTF9DUFVTX1BXUl9DTFBTX0RJUywKKyAgICAgICAgICAgICAgICBDUFUwX01JTl9GUkVRX1RVUkJPX01BWCwKKyAgICAgICAgICAgICAgICBDUFU0X01JTl9GUkVRX1RVUkJPX01BWAorICAgICAgICB9OworICAgICAgICBpZiAobVRpbWVyU2V0KSB7CisgICAgICAgICAgICBuc2Vjc190IGN1ckVsYXBzZWRUaW1lID0gc3lzdGVtVGltZSgpIC0gbVN0YXJ0VGltZW9mTG9jazsKKyAgICAgICAgICAgIGludDMyX3QgcGVuZGluZ1RpbWVvdXQgPSBtUGVyZkxvY2tUaW1lb3V0IC0gbnMybXMoY3VyRWxhcHNlZFRpbWUpOworICAgICAgICAgICAgdGltZXJfdmFsICs9IHBlbmRpbmdUaW1lb3V0OworICAgICAgICB9CisgICAgICAgIHN0YXJ0VGltZXIodGltZXJfdmFsKTsKKworICAgICAgICAvLyBEaXNhYmxlIHBvd2VyIGhpbnQgd2hlbiBhY3F1aXJpbmcgdGhlIHBlcmYgbG9jaworICAgICAgICBpZiAobUN1cnJlbnRQb3dlckhpbnRFbmFibGUpIHsKKyAgICAgICAgICAgIExPR0QoIm1DdXJyZW50UG93ZXJIaW50RW5hYmxlICVkIiAsbUN1cnJlbnRQb3dlckhpbnRFbmFibGUpOworICAgICAgICAgICAgcG93ZXJIaW50SW50ZXJuYWwobUN1cnJlbnRQb3dlckhpbnQsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoTlVMTCAhPSBwZXJmX2xvY2tfYWNxKSAmJiAobVBlcmZMb2NrSGFuZGxlVGltZWQgPCAwKSkgeworICAgICAgICAgICAgcmV0ID0gKCpwZXJmX2xvY2tfYWNxKShtUGVyZkxvY2tIYW5kbGVUaW1lZCwgdGltZXJfdmFsLCBwZXJmX2xvY2tfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YocGVyZl9sb2NrX3BhcmFtcykgLyBzaXplb2YoaW50MzJfdCkpOworICAgICAgICAgICAgTE9HRCgicmV0ICVkIiwgcmV0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgTE9HRSgiZmFpbGVkIHRvIGFjcXVpcmUgbG9jayIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUGVyZkxvY2tIYW5kbGVUaW1lZCA9IHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBMT0dEKCJwZXJmX2hhbmRsZV9hY3EgJWQgIiwgbVBlcmZMb2NrSGFuZGxlVGltZWQpOworICAgIH0KKworICAgIExPR0QoIlgiKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGxvY2tfYWNxCisgKgorICogREVTQ1JJUFRJT046IGFjcXVpcmUgdGhlIHBlcmZvcm1hbmNlIGxvY2sKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQZXJmTG9jazo6bG9ja19hY3EoKQoreworICAgIGludDMyX3QgcmV0ID0gLTE7CisKKyAgICBMT0dEKCJFIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgaWYgKG1QZXJmTG9ja0VuYWJsZSkgeworICAgICAgICBpbnQzMl90IHBlcmZfbG9ja19wYXJhbXNbXSA9IHsKKyAgICAgICAgICAgICAgICBBTExfQ1BVU19QV1JfQ0xQU19ESVMsCisgICAgICAgICAgICAgICAgQ1BVMF9NSU5fRlJFUV9UVVJCT19NQVgsCisgICAgICAgICAgICAgICAgQ1BVNF9NSU5fRlJFUV9UVVJCT19NQVgKKyAgICAgICAgfTsKKworICAgICAgICAvLyBEaXNhYmxlIHBvd2VyIGhpbnQgd2hlbiBhY3F1aXJpbmcgdGhlIHBlcmYgbG9jaworICAgICAgICBpZiAobUN1cnJlbnRQb3dlckhpbnRFbmFibGUpIHsKKyAgICAgICAgICAgIHBvd2VySGludEludGVybmFsKG1DdXJyZW50UG93ZXJIaW50LCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKE5VTEwgIT0gcGVyZl9sb2NrX2FjcSkgJiYgKG1QZXJmTG9ja0hhbmRsZSA8IDApKSB7CisgICAgICAgICAgICByZXQgPSAoKnBlcmZfbG9ja19hY3EpKG1QZXJmTG9ja0hhbmRsZSwgT05FX1NFQywgcGVyZl9sb2NrX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBlcmZfbG9ja19wYXJhbXMpIC8gc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgICAgIExPR0QoInJldCAlZCIsIHJldCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoImZhaWxlZCB0byBhY3F1aXJlIGxvY2siKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVBlcmZMb2NrSGFuZGxlID0gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIExPR0QoInBlcmZfaGFuZGxlX2FjcSAlZCAiLCBtUGVyZkxvY2tIYW5kbGUpOworICAgIH0KKworICAgIExPR0QoIlgiKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGxvY2tfcmVsX3RpbWVkCisgKgorICogREVTQ1JJUFRJT046IHJlbGVhc2UgdGhlIHBlcmZvcm1hbmNlIGxvY2sKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBpbnQzMl90IHR5cGUgb2Ygc3RhdHVzCisgKiAgICAgICAgICAgICAgTk9fRVJST1IgIC0tIHN1Y2Nlc3MKKyAqICAgICAgICAgICAgICBub25lLXplcm8gZmFpbHVyZSBjb2RlCisgKgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQzMl90IFFDYW1lcmFQZXJmTG9jazo6bG9ja19yZWxfdGltZWQoKQoreworICAgIGludCByZXQgPSAtMTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1QZXJmTG9ja0VuYWJsZSkgeworICAgICAgICBMT0dEKCJFIik7CisgICAgICAgIGlmIChtUGVyZkxvY2tIYW5kbGVUaW1lZCA8IDApIHsKKyAgICAgICAgICAgIExPR1coIm1QZXJmTG9ja0hhbmRsZSA8IDAsY2hlY2sgaWYgbG9jayBpcyBhY3F1aXJlZCIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBMT0dEKCJwZXJmX2hhbmRsZV9yZWwgJWQgIiwgbVBlcmZMb2NrSGFuZGxlVGltZWQpOworCisgICAgICAgIGlmICgoTlVMTCAhPSBwZXJmX2xvY2tfcmVsKSAmJiAoMCA8PSBtUGVyZkxvY2tIYW5kbGVUaW1lZCkpIHsKKyAgICAgICAgICAgIHJldCA9ICgqcGVyZl9sb2NrX3JlbCkobVBlcmZMb2NrSGFuZGxlVGltZWQpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBMT0dFKCJmYWlsZWQgdG8gcmVsZWFzZSBsb2NrIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVyZkxvY2tIYW5kbGVUaW1lZCA9IC0xOworICAgICAgICAgICAgcmVzZXRUaW1lcigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChtQ3VycmVudFBvd2VySGludEVuYWJsZSA9PSAxKSAmJiAobVRpbWVyU2V0ID09IDApKSB7CisgICAgICAgICAgICBwb3dlckhpbnRJbnRlcm5hbChtQ3VycmVudFBvd2VySGludCwgbUN1cnJlbnRQb3dlckhpbnRFbmFibGUpOworICAgICAgICB9CisgICAgICAgIExPR0QoIlgiKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBsb2NrX3JlbAorICoKKyAqIERFU0NSSVBUSU9OOiByZWxlYXNlIHRoZSBwZXJmb3JtYW5jZSBsb2NrCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogaW50MzJfdCB0eXBlIG9mIHN0YXR1cworICogICAgICAgICAgICAgIE5PX0VSUk9SICAtLSBzdWNjZXNzCisgKiAgICAgICAgICAgICAgbm9uZS16ZXJvIGZhaWx1cmUgY29kZQorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50MzJfdCBRQ2FtZXJhUGVyZkxvY2s6OmxvY2tfcmVsKCkKK3sKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtUGVyZkxvY2tFbmFibGUpIHsKKyAgICAgICAgTE9HRCgiRSIpOworICAgICAgICBpZiAobVBlcmZMb2NrSGFuZGxlIDwgMCkgeworICAgICAgICAgICAgTE9HVygibVBlcmZMb2NrSGFuZGxlIDwgMCxjaGVjayBpZiBsb2NrIGlzIGFjcXVpcmVkIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIExPR0QoInBlcmZfaGFuZGxlX3JlbCAlZCAiLCBtUGVyZkxvY2tIYW5kbGUpOworCisgICAgICAgIGlmICgoTlVMTCAhPSBwZXJmX2xvY2tfcmVsKSAmJiAoMCA8PSBtUGVyZkxvY2tIYW5kbGUpKSB7CisgICAgICAgICAgICByZXQgPSAoKnBlcmZfbG9ja19yZWwpKG1QZXJmTG9ja0hhbmRsZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIExPR0UoImZhaWxlZCB0byByZWxlYXNlIGxvY2siKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QZXJmTG9ja0hhbmRsZSA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1DdXJyZW50UG93ZXJIaW50RW5hYmxlID09IDEpIHsKKyAgICAgICAgICAgIHBvd2VySGludEludGVybmFsKG1DdXJyZW50UG93ZXJIaW50LCBtQ3VycmVudFBvd2VySGludEVuYWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgTE9HRCgiWCIpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHBvd2VySGludEludGVybmFsCisgKgorICogREVTQ1JJUFRJT046IFNldHMgdGhlIHJlcXVlc3RlZCBwb3dlciBoaW50IGFuZCBzdGF0ZSB0byBwb3dlciBIQUwuCisgKgorICogUEFSQU1FVEVSUyA6CisgKiBoaW50ICAgICAgIDogUG93ZXIgaGludAorICogZW5hYmxlICAgICA6IEVuYWJsZSBwb3dlciBoaW50IGlmIHNldCB0byAxLiBEaXNhYmxlIGlmIHNldCB0byAwLgorICogUkVUVVJOICAgICA6IHZvaWQKKyAqCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgUUNhbWVyYVBlcmZMb2NrOjpwb3dlckhpbnRJbnRlcm5hbChwb3dlcl9oaW50X3QgaGludCwgYm9vbCBlbmFibGUpCit7CisjaWZkZWYgSEFTX01VTFRJTUVESUFfSElOVFMKKyAgICBpZiAobV9wUG93ZXJNb2R1bGUgIT0gTlVMTCkgeworICAgICAgICBpZiAoZW5hYmxlID09IHRydWUpIHsKKyAgICAgICAgICAgIG1fcFBvd2VyTW9kdWxlLT5wb3dlckhpbnQobV9wUG93ZXJNb2R1bGUsIGhpbnQsICh2b2lkICopInN0YXRlPTEiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fcFBvd2VyTW9kdWxlLT5wb3dlckhpbnQobV9wUG93ZXJNb2R1bGUsIGhpbnQsICh2b2lkICopInN0YXRlPTAiKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IHBvd2VySGludAorICoKKyAqIERFU0NSSVBUSU9OOiBVcGRhdGVzIHRoZSBsaXN0IGNvbnRhaW5pbmcgYWN0aXZlL2VuYWJsZWQgcG93ZXIgaGludHMuCisgKiAgICAgICAgICAgICAgSWYgbmVlZGVkLCBjYWxscyB0aGUgaW50ZXJuYWwgcG93ZXJIaW50IGZ1bmN0aW9uIHdpdGgKKyAqICAgICAgICAgICAgICByZXF1ZXN0ZWQgcG93ZXIgaGludCBhbmQgc3RhdGUuCisgKiBQQVJBTUVURVJTIDoKKyAqIGhpbnQgICAgICAgOiBQb3dlciBoaW50CisgKiBlbmFibGUgICAgIDogRW5hYmxlIHBvd2VyIGhpbnQgaWYgc2V0IHRvIDEuIERpc2FibGUgaWYgc2V0IHRvIDAuCisgKiBSRVRVUk4gICAgIDogdm9pZAorICoKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBRQ2FtZXJhUGVyZkxvY2s6OnBvd2VySGludChwb3dlcl9oaW50X3QgaGludCwgYm9vbCBlbmFibGUpCit7CisjaWZkZWYgSEFTX01VTFRJTUVESUFfSElOVFMKKyAgICBpZiAoZW5hYmxlID09IHRydWUpIHsKKyAgICAgICAgaWYgKChoaW50ICE9IG1DdXJyZW50UG93ZXJIaW50KSB8fCAoZW5hYmxlICE9IG1DdXJyZW50UG93ZXJIaW50RW5hYmxlKSkgeworICAgICAgICAgICAgLy8gRGlzYWJsZSB0aGUgY3VycmVudCBhY3RpdmUgcG93ZXIgaGludAorICAgICAgICAgICAgaWYgKG1DdXJyZW50UG93ZXJIaW50RW5hYmxlID09IHRydWUpIHsKKyAgICAgICAgICAgICAgICBwb3dlckhpbnRJbnRlcm5hbChtQ3VycmVudFBvd2VySGludCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUHVzaCB0aGUgbmV3IHBvd2VyIGhpbnQgYXQgdGhlIGhlYWQgb2YgdGhlIGFjdGl2ZSBwb3dlciBoaW50IGxpc3QKKyAgICAgICAgICAgIG1BY3RpdmVQb3dlckhpbnRzLnB1c2hfZnJvbnQoaGludCk7CisKKyAgICAgICAgICAgIC8vIFNldCB0aGUgbmV3IHBvd2VyIGhpbnQKKyAgICAgICAgICAgIG1DdXJyZW50UG93ZXJIaW50ICAgICAgID0gaGludDsKKyAgICAgICAgICAgIG1DdXJyZW50UG93ZXJIaW50RW5hYmxlID0gZW5hYmxlOworICAgICAgICAgICAgcG93ZXJIaW50SW50ZXJuYWwoaGludCwgZW5hYmxlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgcG93ZXIgaGludCBmcm9tIHRoZSBsaXN0CisgICAgICAgIGZvciAoTGlzdDxwb3dlcl9oaW50X3Q+OjppdGVyYXRvciBpdCA9IG1BY3RpdmVQb3dlckhpbnRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gbUFjdGl2ZVBvd2VySGludHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmICgqaXQgPT0gaGludCkgeworICAgICAgICAgICAgICAgIGlmIChpdCAhPSBtQWN0aXZlUG93ZXJIaW50cy5iZWdpbigpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR1coIlJlcXVlc3QgdG8gcmVtb3ZlIHRoZSBwcmV2aW91cyBwb3dlciBoaW50OiAlZCBpbnN0ZWFkIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3VycmVudGx5IGFjdGl2ZSBwb3dlciBoaW50OiAlZCIsIHN0YXRpY19jYXN0PGludD4oaGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KG1DdXJyZW50UG93ZXJIaW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BY3RpdmVQb3dlckhpbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChoaW50ID09IG1DdXJyZW50UG93ZXJIaW50KSB7CisgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBwb3dlciBoaW50CisgICAgICAgICAgICBwb3dlckhpbnRJbnRlcm5hbChoaW50LCBmYWxzZSk7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBhY3RpdmUgcG93ZXIgaGludCBsaXN0IGlzIG5vdCBlbXB0eSwKKyAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIHByZXZpb3VzIHBvd2VyIGhpbnQgZnJvbSB0aGUgaGVhZCBvZiB0aGUgbGlzdAorICAgICAgICAgICAgaWYgKG1BY3RpdmVQb3dlckhpbnRzLmVtcHR5KCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFBvd2VySGludCAgICAgICA9ICptQWN0aXZlUG93ZXJIaW50cy5iZWdpbigpOworICAgICAgICAgICAgICAgIG1DdXJyZW50UG93ZXJIaW50RW5hYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwb3dlckhpbnRJbnRlcm5hbChtQ3VycmVudFBvd2VySGludCwgdHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1DdXJyZW50UG93ZXJIaW50ICAgICAgID0gc3RhdGljX2Nhc3Q8cG93ZXJfaGludF90PigwKTsKKyAgICAgICAgICAgICAgICBtQ3VycmVudFBvd2VySGludEVuYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCit9CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhUGVyZi5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYVBlcmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjEwMzRlCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYVBlcmYuaApAQCAtMCwwICsxLDkyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICovCisKKyNpZm5kZWYgX19RQ0FNRVJBUEVSRl9IX18KKyNkZWZpbmUgX19RQ0FNRVJBUEVSRl9IX18KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiaGFyZHdhcmUvcG93ZXIuaCIKKwordHlwZWRlZiBlbnVtIHsKKyAgICBBTExfQ09SRVNfT05MSU5FID0gMHg3RkUsCisgICAgQUxMX0NQVVNfUFdSX0NMUFNfRElTID0gMHgxMDEsCisgICAgQ1BVMF9NSU5fRlJFUV9UVVJCT19NQVggPSAweDJGRSwKKyAgICBDUFU0X01JTl9GUkVRX1RVUkJPX01BWCA9IDB4MUZGRSwKK31wZXJmX2xvY2tfcGFyYW1zX3Q7CisKKy8qIFRpbWUgcmVsYXRlZCBtYWNyb3MgKi8KKyNkZWZpbmUgT05FX1NFQyAxMDAwCit0eXBlZGVmIGludDY0X3QgbnNlY3NfdDsKKyNkZWZpbmUgTlNFQ19QRVJfU0VDIDEwMDAwMDAwMDBMTFUKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKworY2xhc3MgUUNhbWVyYVBlcmZMb2NrIHsKK3B1YmxpYzoKKyAgICBRQ2FtZXJhUGVyZkxvY2soKTsKKyAgICB+UUNhbWVyYVBlcmZMb2NrKCk7CisKKyAgICB2b2lkICAgIGxvY2tfaW5pdCgpOworICAgIHZvaWQgICAgbG9ja19kZWluaXQoKTsKKyAgICBpbnQzMl90IGxvY2tfcmVsKCk7CisgICAgaW50MzJfdCBsb2NrX2FjcSgpOworICAgIGludDMyX3QgbG9ja19hY3FfdGltZWQoaW50MzJfdCB0aW1lcl92YWwpOworICAgIGludDMyX3QgbG9ja19yZWxfdGltZWQoKTsKKyAgICBib29sICAgIGlzVGltZXJSZXNldCgpOworICAgIHZvaWQgICAgcG93ZXJIaW50SW50ZXJuYWwocG93ZXJfaGludF90IGhpbnQsIGJvb2wgZW5hYmxlKTsKKyAgICB2b2lkICAgIHBvd2VySGludChwb3dlcl9oaW50X3QgaGludCwgYm9vbCBlbmFibGUpOworCitwcml2YXRlOgorICAgIGludDMyX3QgICAgICAgICgqcGVyZl9sb2NrX2FjcSkoaW50LCBpbnQsIGludFtdLCBpbnQpOworICAgIGludDMyX3QgICAgICAgICgqcGVyZl9sb2NrX3JlbCkoaW50KTsKKyAgICB2b2lkICAgICAgICAgICAgc3RhcnRUaW1lcih1aW50MzJfdCB0aW1lcl92YWwpOworICAgIHZvaWQgICAgICAgICAgICByZXNldFRpbWVyKCk7CisgICAgdm9pZCAgICAgICAgICAgKm1EbEhhbmRsZTsKKyAgICB1aW50MzJfdCAgICAgICAgbVBlcmZMb2NrRW5hYmxlOworICAgIE11dGV4ICAgICAgICAgICBtTG9jazsKKyAgICBpbnQzMl90ICAgICAgICAgbVBlcmZMb2NrSGFuZGxlOyAgICAgICAgLy8gUGVyZm9ybWFuY2UgbG9jayBsaWJyYXJ5IGhhbmRsZQorICAgIGludDMyX3QgICAgICAgICBtUGVyZkxvY2tIYW5kbGVUaW1lZDsgICAvLyBQZXJmb3JtYW5jZSBsb2NrIGxpYnJhcnkgaGFuZGxlCisgICAgcG93ZXJfbW9kdWxlX3QgKm1fcFBvd2VyTW9kdWxlOyAgICAgICAgIC8vIHBvd2VyIG1vZHVsZSBIYW5kbGUKKyAgICBwb3dlcl9oaW50X3QgICAgbUN1cnJlbnRQb3dlckhpbnQ7CisgICAgYm9vbCAgICAgICAgICAgIG1DdXJyZW50UG93ZXJIaW50RW5hYmxlOworICAgIHVpbnQzMl90ICAgICAgICBtVGltZXJTZXQ7CisgICAgdWludDMyX3QgICAgICAgIG1QZXJmTG9ja1RpbWVvdXQ7CisgICAgbnNlY3NfdCAgICAgICAgIG1TdGFydFRpbWVvZkxvY2s7CisgICAgTGlzdDxwb3dlcl9oaW50X3Q+IG1BY3RpdmVQb3dlckhpbnRzOyAgIC8vIEFjdGl2ZS9lbmFibGVkIHBvd2VyIGhpbnRzIGxpc3QKK307CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCisKKyNlbmRpZiAvKiBfX1FDQU1SRUFQRVJGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYVF1ZXVlLmNwcCBiL21zbWNvYmFsdC9RQ2FtZXJhMi91dGlsL1FDYW1lcmFRdWV1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5ZDIzOQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi91dGlsL1FDYW1lcmFRdWV1ZS5jcHAKQEAgLTAsMCArMSw0NjQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyogbWV0OgorKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKgorKi8KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiUUNhbWVyYVF1ZXVlLmgiCisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgIm1tX2NhbWVyYV9kYmcuaCIKK30KKworbmFtZXNwYWNlIHFjYW1lcmEgeworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmFRdWV1ZQorICoKKyAqIERFU0NSSVBUSU9OOiBkZWZhdWx0IGNvbnN0cnVjdG9yIG9mIFFDYW1lcmFRdWV1ZQorICoKKyAqIFBBUkFNRVRFUlMgOiBOb25lCisgKgorICogUkVUVVJOICAgICA6IE5vbmUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworUUNhbWVyYVF1ZXVlOjpRQ2FtZXJhUXVldWUoKQoreworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbV9sb2NrLCBOVUxMKTsKKyAgICBjYW1fbGlzdF9pbml0KCZtX2hlYWQubGlzdCk7CisgICAgbV9zaXplID0gMDsKKyAgICBtX2RhdGFGbiA9IE5VTEw7CisgICAgbV91c2VyRGF0YSA9IE5VTEw7CisgICAgbV9hY3RpdmUgPSB0cnVlOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IFFDYW1lcmFRdWV1ZQorICoKKyAqIERFU0NSSVBUSU9OOiBjb25zdHJ1Y3RvciBvZiBRQ2FtZXJhUXVldWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRhdGFfcmVsX2ZuIDogZnVuY3Rpb24gcHRyIHRvIHJlbGVhc2Ugbm9kZSBkYXRhIGludGVybmFsIHJlc291cmNlCisgKiAgIEB1c2VyX2RhdGEgICA6IHVzZXIgZGF0YSBwdHIKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhUXVldWU6OlFDYW1lcmFRdWV1ZShyZWxlYXNlX2RhdGFfZm4gZGF0YV9yZWxfZm4sIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJm1fbG9jaywgTlVMTCk7CisgICAgY2FtX2xpc3RfaW5pdCgmbV9oZWFkLmxpc3QpOworICAgIG1fc2l6ZSA9IDA7CisgICAgbV9kYXRhRm4gPSBkYXRhX3JlbF9mbjsKKyAgICBtX3VzZXJEYXRhID0gdXNlcl9kYXRhOworICAgIG1fYWN0aXZlID0gdHJ1ZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiB+UUNhbWVyYVF1ZXVlCisgKgorICogREVTQ1JJUFRJT046IGRlY29uc3RydWN0b3Igb2YgUUNhbWVyYVF1ZXVlCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitRQ2FtZXJhUXVldWU6On5RQ2FtZXJhUXVldWUoKQoreworICAgIGZsdXNoKCk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtX2xvY2spOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGluaXQKKyAqCisgKiBERVNDUklQVElPTjogUHV0IHRoZSBxdWV1ZSB0byBhY3RpdmUgc3RhdGUgKHJlYWR5IHRvIGVucXVldWUgYW5kIGRlcXVldWUpCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFRdWV1ZTo6aW5pdCgpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOworICAgIG1fYWN0aXZlID0gdHJ1ZTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9sb2NrKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBpc0VtcHR5CisgKgorICogREVTQ1JJUFRJT046IHJldHVybiBpZiB0aGUgcXVldWUgaXMgZW1wdHkgb3Igbm90CisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogdHJ1ZSAtLSBxdWV1ZSBpcyBlbXB0eTsgZmFsc2UgLS0gbm90IGVtcHR5CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVF1ZXVlOjppc0VtcHR5KCkKK3sKKyAgICBib29sIGZsYWcgPSB0cnVlOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9sb2NrKTsKKyAgICBpZiAobV9zaXplID4gMCkgeworICAgICAgICBmbGFnID0gZmFsc2U7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOworICAgIHJldHVybiBmbGFnOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGVucXVldWUKKyAqCisgKiBERVNDUklQVElPTjogZW5xdWV1ZSBkYXRhIGludG8gdGhlIHF1ZXVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBkYXRhICAgIDogZGF0YSB0byBiZSBlbnF1ZXVlZAorICoKKyAqIFJFVFVSTiAgICAgOiB0cnVlIC0tIHN1Y2Nlc3M7IGZhbHNlIC0tIGZhaWxlZAorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitib29sIFFDYW1lcmFRdWV1ZTo6ZW5xdWV1ZSh2b2lkICpkYXRhKQoreworICAgIGJvb2wgcmM7CisgICAgY2FtZXJhX3Ffbm9kZSAqbm9kZSA9CisgICAgICAgIChjYW1lcmFfcV9ub2RlICopbWFsbG9jKHNpemVvZihjYW1lcmFfcV9ub2RlKSk7CisgICAgaWYgKE5VTEwgPT0gbm9kZSkgeworICAgICAgICBMT0dFKCJObyBtZW1vcnkgZm9yIGNhbWVyYV9xX25vZGUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1lbXNldChub2RlLCAwLCBzaXplb2YoY2FtZXJhX3Ffbm9kZSkpOworICAgIG5vZGUtPmRhdGEgPSBkYXRhOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOworICAgIGlmIChtX2FjdGl2ZSkgeworICAgICAgICBjYW1fbGlzdF9hZGRfdGFpbF9ub2RlKCZub2RlLT5saXN0LCAmbV9oZWFkLmxpc3QpOworICAgICAgICBtX3NpemUrKzsKKyAgICAgICAgcmMgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIGZyZWUobm9kZSk7CisgICAgICAgIHJjID0gZmFsc2U7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBlbnF1ZXVlV2l0aFByaW9yaXR5CisgKgorICogREVTQ1JJUFRJT046IGVucXVldWUgZGF0YSBpbnRvIHF1ZXVlIHdpdGggcHJpb3JpdHksIHdpbGwgaW5zZXJ0IGludG8gdGhlCisgKiAgICAgICAgICAgICAgaGVhZCBvZiB0aGUgcXVldWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGRhdGEgICAgOiBkYXRhIHRvIGJlIGVucXVldWVkCisgKgorICogUkVUVVJOICAgICA6IHRydWUgLS0gc3VjY2VzczsgZmFsc2UgLS0gZmFpbGVkCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2Jvb2wgUUNhbWVyYVF1ZXVlOjplbnF1ZXVlV2l0aFByaW9yaXR5KHZvaWQgKmRhdGEpCit7CisgICAgYm9vbCByYzsKKyAgICBjYW1lcmFfcV9ub2RlICpub2RlID0KKyAgICAgICAgKGNhbWVyYV9xX25vZGUgKiltYWxsb2Moc2l6ZW9mKGNhbWVyYV9xX25vZGUpKTsKKyAgICBpZiAoTlVMTCA9PSBub2RlKSB7CisgICAgICAgIExPR0UoIk5vIG1lbW9yeSBmb3IgY2FtZXJhX3Ffbm9kZSIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbWVtc2V0KG5vZGUsIDAsIHNpemVvZihjYW1lcmFfcV9ub2RlKSk7CisgICAgbm9kZS0+ZGF0YSA9IGRhdGE7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbG9jayk7CisgICAgaWYgKG1fYWN0aXZlKSB7CisgICAgICAgIHN0cnVjdCBjYW1fbGlzdCAqcF9uZXh0ID0gbV9oZWFkLmxpc3QubmV4dDsKKworICAgICAgICBtX2hlYWQubGlzdC5uZXh0ID0gJm5vZGUtPmxpc3Q7CisgICAgICAgIHBfbmV4dC0+cHJldiA9ICZub2RlLT5saXN0OworICAgICAgICBub2RlLT5saXN0Lm5leHQgPSBwX25leHQ7CisgICAgICAgIG5vZGUtPmxpc3QucHJldiA9ICZtX2hlYWQubGlzdDsKKworICAgICAgICBtX3NpemUrKzsKKyAgICAgICAgcmMgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIGZyZWUobm9kZSk7CisgICAgICAgIHJjID0gZmFsc2U7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOworICAgIHJldHVybiByYzsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZVTkNUSU9OICAgOiBwZWVrCisgKgorICogREVTQ1JJUFRJT046IHJldHVybiB0aGUgaGVhZCBlbGVtZW50IHdpdGhvdXQgcmVtb3ZpbmcgaXQKKyAqCisgKiBQQVJBTUVURVJTIDogTm9uZQorICoKKyAqIFJFVFVSTiAgICAgOiBkYXRhIHB0ci4gTlVMTCBpZiBub3QgYW55IGRhdGEgaW4gdGhlIHF1ZXVlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkKiBRQ2FtZXJhUXVldWU6OnBlZWsoKQoreworICAgIGNhbWVyYV9xX25vZGUqIG5vZGUgPSBOVUxMOworICAgIHZvaWQqIGRhdGEgPSBOVUxMOworICAgIHN0cnVjdCBjYW1fbGlzdCAqaGVhZCA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpwb3MgPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOworICAgIGlmIChtX2FjdGl2ZSkgeworICAgICAgICBoZWFkID0gJm1faGVhZC5saXN0OworICAgICAgICBwb3MgPSBoZWFkLT5uZXh0OworICAgICAgICBpZiAocG9zICE9IGhlYWQpIHsKKyAgICAgICAgICAgIG5vZGUgPSBtZW1iZXJfb2YocG9zLCBjYW1lcmFfcV9ub2RlLCBsaXN0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9sb2NrKTsKKworICAgIGlmIChOVUxMICE9IG5vZGUpIHsKKyAgICAgICAgZGF0YSA9IG5vZGUtPmRhdGE7CisgICAgfQorCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZGVxdWV1ZQorICoKKyAqIERFU0NSSVBUSU9OOiBkZXF1ZXVlIGRhdGEgZnJvbSB0aGUgcXVldWUKKyAqCisgKiBQQVJBTUVURVJTIDoKKyAqICAgQGJGcm9tSGVhZCA6IGlmIHRydWUsIGRlcXVldWUgZnJvbSB0aGUgaGVhZAorICogICAgICAgICAgICAgICAgaWYgZmFsc2UsIGRlcXVldWUgZnJvbSB0aGUgdGFpbAorICoKKyAqIFJFVFVSTiAgICAgOiBkYXRhIHB0ci4gTlVMTCBpZiBub3QgYW55IGRhdGEgaW4gdGhlIHF1ZXVlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkKiBRQ2FtZXJhUXVldWU6OmRlcXVldWUoYm9vbCBiRnJvbUhlYWQpCit7CisgICAgY2FtZXJhX3Ffbm9kZSogbm9kZSA9IE5VTEw7CisgICAgdm9pZCogZGF0YSA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpoZWFkID0gTlVMTDsKKyAgICBzdHJ1Y3QgY2FtX2xpc3QgKnBvcyA9IE5VTEw7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbG9jayk7CisgICAgaWYgKG1fYWN0aXZlKSB7CisgICAgICAgIGhlYWQgPSAmbV9oZWFkLmxpc3Q7CisgICAgICAgIGlmIChiRnJvbUhlYWQpIHsKKyAgICAgICAgICAgIHBvcyA9IGhlYWQtPm5leHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwb3MgPSBoZWFkLT5wcmV2OworICAgICAgICB9CisgICAgICAgIGlmIChwb3MgIT0gaGVhZCkgeworICAgICAgICAgICAgbm9kZSA9IG1lbWJlcl9vZihwb3MsIGNhbWVyYV9xX25vZGUsIGxpc3QpOworICAgICAgICAgICAgY2FtX2xpc3RfZGVsX25vZGUoJm5vZGUtPmxpc3QpOworICAgICAgICAgICAgbV9zaXplLS07CisgICAgICAgIH0KKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbG9jayk7CisKKyAgICBpZiAoTlVMTCAhPSBub2RlKSB7CisgICAgICAgIGRhdGEgPSBub2RlLT5kYXRhOworICAgICAgICBmcmVlKG5vZGUpOworICAgIH0KKworICAgIHJldHVybiBkYXRhOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRlVOQ1RJT04gICA6IGRlcXVldWUKKyAqCisgKiBERVNDUklQVElPTjogZGVxdWV1ZSBkYXRhIGZyb20gdGhlIHF1ZXVlCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtYXRjaCA6IG1hdGNoaW5nIGZ1bmN0aW9uIGNhbGxiYWNrCisgKiAgIEBtYXRjaF9kYXRhIDogdGhlIGFjdHVhbCBkYXRhIHRvIGJlIG1hdGNoZWQKKyAqCisgKiBSRVRVUk4gICAgIDogZGF0YSBwdHIuIE5VTEwgaWYgbm90IGFueSBkYXRhIGluIHRoZSBxdWV1ZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCogUUNhbWVyYVF1ZXVlOjpkZXF1ZXVlKG1hdGNoX2ZuX2RhdGEgbWF0Y2gsIHZvaWQgKm1hdGNoX2RhdGEpeworICAgIGNhbWVyYV9xX25vZGUqIG5vZGUgPSBOVUxMOworICAgIHN0cnVjdCBjYW1fbGlzdCAqaGVhZCA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpwb3MgPSBOVUxMOworICAgIHZvaWQqIGRhdGEgPSBOVUxMOworCisgICAgaWYgKCBOVUxMID09IG1hdGNoIHx8IE5VTEwgPT0gbWF0Y2hfZGF0YSApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2xvY2spOworICAgIGlmIChtX2FjdGl2ZSkgeworICAgICAgICBoZWFkID0gJm1faGVhZC5saXN0OworICAgICAgICBwb3MgPSBoZWFkLT5uZXh0OworCisgICAgICAgIHdoaWxlKHBvcyAhPSBoZWFkKSB7CisgICAgICAgICAgICBub2RlID0gbWVtYmVyX29mKHBvcywgY2FtZXJhX3Ffbm9kZSwgbGlzdCk7CisgICAgICAgICAgICBwb3MgPSBwb3MtPm5leHQ7CisgICAgICAgICAgICBpZiAoTlVMTCAhPSBub2RlKSB7CisgICAgICAgICAgICAgICAgaWYgKCBtYXRjaChub2RlLT5kYXRhLCBtX3VzZXJEYXRhLCBtYXRjaF9kYXRhKSApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FtX2xpc3RfZGVsX25vZGUoJm5vZGUtPmxpc3QpOworICAgICAgICAgICAgICAgICAgICBtX3NpemUtLTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5vZGUtPmRhdGE7CisgICAgICAgICAgICAgICAgICAgIGZyZWUobm9kZSk7CisgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbG9jayk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZmx1c2gKKyAqCisgKiBERVNDUklQVElPTjogZmx1c2ggYWxsIG5vZGVzIGZyb20gdGhlIHF1ZXVlLCBxdWV1ZSB3aWxsIGJlIGVtcHR5IGFmdGVyIHRoaXMKKyAqICAgICAgICAgICAgICBvcGVyYXRpb24uCisgKgorICogUEFSQU1FVEVSUyA6IE5vbmUKKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFRdWV1ZTo6Zmx1c2goKXsKKyAgICBjYW1lcmFfcV9ub2RlKiBub2RlID0gTlVMTDsKKyAgICBzdHJ1Y3QgY2FtX2xpc3QgKmhlYWQgPSBOVUxMOworICAgIHN0cnVjdCBjYW1fbGlzdCAqcG9zID0gTlVMTDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9sb2NrKTsKKyAgICBpZiAobV9hY3RpdmUpIHsKKyAgICAgICAgaGVhZCA9ICZtX2hlYWQubGlzdDsKKyAgICAgICAgcG9zID0gaGVhZC0+bmV4dDsKKworICAgICAgICB3aGlsZShwb3MgIT0gaGVhZCkgeworICAgICAgICAgICAgbm9kZSA9IG1lbWJlcl9vZihwb3MsIGNhbWVyYV9xX25vZGUsIGxpc3QpOworICAgICAgICAgICAgcG9zID0gcG9zLT5uZXh0OworICAgICAgICAgICAgY2FtX2xpc3RfZGVsX25vZGUoJm5vZGUtPmxpc3QpOworICAgICAgICAgICAgbV9zaXplLS07CisKKyAgICAgICAgICAgIGlmIChOVUxMICE9IG5vZGUtPmRhdGEpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9kYXRhRm4pIHsKKyAgICAgICAgICAgICAgICAgICAgbV9kYXRhRm4obm9kZS0+ZGF0YSwgbV91c2VyRGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyZWUobm9kZS0+ZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKG5vZGUpOworCisgICAgICAgIH0KKyAgICAgICAgbV9zaXplID0gMDsKKyAgICAgICAgbV9hY3RpdmUgPSBmYWxzZTsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbG9jayk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZmx1c2hOb2RlcworICoKKyAqIERFU0NSSVBUSU9OOiBmbHVzaCBvbmx5IHNwZWNpZmljIG5vZGVzLCBkZXBlbmRpbmcgb24KKyAqICAgICAgICAgICAgICB0aGUgZ2l2ZW4gbWF0Y2hpbmcgZnVuY3Rpb24uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtYXRjaCAgIDogbWF0Y2hpbmcgZnVuY3Rpb24KKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFRdWV1ZTo6Zmx1c2hOb2RlcyhtYXRjaF9mbiBtYXRjaCl7CisgICAgY2FtZXJhX3Ffbm9kZSogbm9kZSA9IE5VTEw7CisgICAgc3RydWN0IGNhbV9saXN0ICpoZWFkID0gTlVMTDsKKyAgICBzdHJ1Y3QgY2FtX2xpc3QgKnBvcyA9IE5VTEw7CisKKyAgICBpZiAoIE5VTEwgPT0gbWF0Y2ggKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbG9jayk7CisgICAgaWYgKG1fYWN0aXZlKSB7CisgICAgICAgIGhlYWQgPSAmbV9oZWFkLmxpc3Q7CisgICAgICAgIHBvcyA9IGhlYWQtPm5leHQ7CisKKyAgICAgICAgd2hpbGUocG9zICE9IGhlYWQpIHsKKyAgICAgICAgICAgIG5vZGUgPSBtZW1iZXJfb2YocG9zLCBjYW1lcmFfcV9ub2RlLCBsaXN0KTsKKyAgICAgICAgICAgIHBvcyA9IHBvcy0+bmV4dDsKKyAgICAgICAgICAgIGlmICggbWF0Y2gobm9kZS0+ZGF0YSwgbV91c2VyRGF0YSkgKSB7CisgICAgICAgICAgICAgICAgY2FtX2xpc3RfZGVsX25vZGUoJm5vZGUtPmxpc3QpOworICAgICAgICAgICAgICAgIG1fc2l6ZS0tOworCisgICAgICAgICAgICAgICAgaWYgKE5VTEwgIT0gbm9kZS0+ZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobV9kYXRhRm4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fZGF0YUZuKG5vZGUtPmRhdGEsIG1fdXNlckRhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyZWUobm9kZS0+ZGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyZWUobm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fbG9jayk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGVU5DVElPTiAgIDogZmx1c2hOb2RlcworICoKKyAqIERFU0NSSVBUSU9OOiBmbHVzaCBvbmx5IHNwZWNpZmljIG5vZGVzLCBkZXBlbmRpbmcgb24KKyAqICAgICAgICAgICAgICB0aGUgZ2l2ZW4gbWF0Y2hpbmcgZnVuY3Rpb24uCisgKgorICogUEFSQU1FVEVSUyA6CisgKiAgIEBtYXRjaCAgIDogbWF0Y2hpbmcgZnVuY3Rpb24KKyAqCisgKiBSRVRVUk4gICAgIDogTm9uZQorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIFFDYW1lcmFRdWV1ZTo6Zmx1c2hOb2RlcyhtYXRjaF9mbl9kYXRhIG1hdGNoLCB2b2lkICptYXRjaF9kYXRhKXsKKyAgICBjYW1lcmFfcV9ub2RlKiBub2RlID0gTlVMTDsKKyAgICBzdHJ1Y3QgY2FtX2xpc3QgKmhlYWQgPSBOVUxMOworICAgIHN0cnVjdCBjYW1fbGlzdCAqcG9zID0gTlVMTDsKKworICAgIGlmICggTlVMTCA9PSBtYXRjaCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9sb2NrKTsKKyAgICBpZiAobV9hY3RpdmUpIHsKKyAgICAgICAgaGVhZCA9ICZtX2hlYWQubGlzdDsKKyAgICAgICAgcG9zID0gaGVhZC0+bmV4dDsKKworICAgICAgICB3aGlsZShwb3MgIT0gaGVhZCkgeworICAgICAgICAgICAgbm9kZSA9IG1lbWJlcl9vZihwb3MsIGNhbWVyYV9xX25vZGUsIGxpc3QpOworICAgICAgICAgICAgcG9zID0gcG9zLT5uZXh0OworICAgICAgICAgICAgaWYgKCBtYXRjaChub2RlLT5kYXRhLCBtX3VzZXJEYXRhLCBtYXRjaF9kYXRhKSApIHsKKyAgICAgICAgICAgICAgICBjYW1fbGlzdF9kZWxfbm9kZSgmbm9kZS0+bGlzdCk7CisgICAgICAgICAgICAgICAgbV9zaXplLS07CisKKyAgICAgICAgICAgICAgICBpZiAoTlVMTCAhPSBub2RlLT5kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX2RhdGFGbikgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9kYXRhRm4obm9kZS0+ZGF0YSwgbV91c2VyRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZnJlZShub2RlLT5kYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJlZShub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9sb2NrKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIHFjYW1lcmEKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhMi91dGlsL1FDYW1lcmFRdWV1ZS5oIGIvbXNtY29iYWx0L1FDYW1lcmEyL3V0aWwvUUNhbWVyYVF1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhMjIxZQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9RQ2FtZXJhMi91dGlsL1FDYW1lcmFRdWV1ZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMi0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX1FDQU1FUkFfUVVFVUVfSF9fCisjZGVmaW5lIF9fUUNBTUVSQV9RVUVVRV9IX18KKworLy8gU3lzdGVtIGRlcGVuZGVuY2llcworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworLy8gQ2FtZXJhIGRlcGVuZGVuY2llcworI2luY2x1ZGUgImNhbV9saXN0LmgiCisKK25hbWVzcGFjZSBxY2FtZXJhIHsKKwordHlwZWRlZiBib29sICgqbWF0Y2hfZm5fZGF0YSkodm9pZCAqZGF0YSwgdm9pZCAqdXNlcl9kYXRhLCB2b2lkICptYXRjaF9kYXRhKTsKK3R5cGVkZWYgdm9pZCAoKnJlbGVhc2VfZGF0YV9mbikodm9pZCogZGF0YSwgdm9pZCAqdXNlcl9kYXRhKTsKK3R5cGVkZWYgYm9vbCAoKm1hdGNoX2ZuKSh2b2lkICpkYXRhLCB2b2lkICp1c2VyX2RhdGEpOworCitjbGFzcyBRQ2FtZXJhUXVldWUgeworcHVibGljOgorICAgIFFDYW1lcmFRdWV1ZSgpOworICAgIFFDYW1lcmFRdWV1ZShyZWxlYXNlX2RhdGFfZm4gZGF0YV9yZWxfZm4sIHZvaWQgKnVzZXJfZGF0YSk7CisgICAgdmlydHVhbCB+UUNhbWVyYVF1ZXVlKCk7CisgICAgdm9pZCBpbml0KCk7CisgICAgYm9vbCBlbnF1ZXVlKHZvaWQgKmRhdGEpOworICAgIGJvb2wgZW5xdWV1ZVdpdGhQcmlvcml0eSh2b2lkICpkYXRhKTsKKyAgICAvKiBUaGlzIGNhbGwgd2lsbCBwdXQgcXVldWUgaW50byB1bmluaXRpYWxpemVkIHN0YXRlLgorICAgICAqIE5lZWQgdG8gY2FsbCBpbml0KCkgaW4gb3JkZXIgdG8gdXNlIHRoZSBxdWV1ZSBhZ2FpbiAqLworICAgIHZvaWQgZmx1c2goKTsKKyAgICB2b2lkIGZsdXNoTm9kZXMobWF0Y2hfZm4gbWF0Y2gpOworICAgIHZvaWQgZmx1c2hOb2RlcyhtYXRjaF9mbl9kYXRhIG1hdGNoLCB2b2lkICpzcGVjX2RhdGEpOworICAgIHZvaWQqIGRlcXVldWUoYm9vbCBiRnJvbUhlYWQgPSB0cnVlKTsKKyAgICB2b2lkKiBkZXF1ZXVlKG1hdGNoX2ZuX2RhdGEgbWF0Y2gsIHZvaWQgKnNwZWNfZGF0YSk7CisgICAgdm9pZCogcGVlaygpOworICAgIGJvb2wgaXNFbXB0eSgpOworICAgIGludCBnZXRDdXJyZW50U2l6ZSgpIHtyZXR1cm4gbV9zaXplO30KK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBzdHJ1Y3QgY2FtX2xpc3QgbGlzdDsKKyAgICAgICAgdm9pZCogZGF0YTsKKyAgICB9IGNhbWVyYV9xX25vZGU7CisKKyAgICBjYW1lcmFfcV9ub2RlIG1faGVhZDsgLy8gZHVtbXkgaGVhZAorICAgIGludCBtX3NpemU7CisgICAgYm9vbCBtX2FjdGl2ZTsKKyAgICBwdGhyZWFkX211dGV4X3QgbV9sb2NrOworICAgIHJlbGVhc2VfZGF0YV9mbiBtX2RhdGFGbjsKKyAgICB2b2lkICogbV91c2VyRGF0YTsKK307CisKK307IC8vIG5hbWVzcGFjZSBxY2FtZXJhCisKKyNlbmRpZiAvKiBfX1FDQU1FUkFfUVVFVUVfSF9fICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhVHJhY2UuaCBiL21zbWNvYmFsdC9RQ2FtZXJhMi91dGlsL1FDYW1lcmFUcmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZWViOGYKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYTIvdXRpbC9RQ2FtZXJhVHJhY2UuaApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIE5vdCBhIENvbnRyaWJ1dGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fUUNBTUVSQVRSQUNFX0hfXworI2RlZmluZSBfX1FDQU1FUkFUUkFDRV9IX18KKworI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpZmRlZiBRQ0FNRVJBX1JFREVGSU5FX0xPRworI2RlZmluZSBDQU1fTU9EVUxFIENBTV9IQUxfTU9EVUxFCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJtbV9jYW1lcmFfZGJnLmgiCit9CisjZW5kaWYKKworI3VuZGVmIEFUUkFDRV9DQUxMCisjdW5kZWYgQVRSQUNFX05BTUUKKyN1bmRlZiBBVFJBQ0VfQkVHSU4KKyN1bmRlZiBBVFJBQ0VfSU5UCisjdW5kZWYgQVRSQUNFX0VORAorI3VuZGVmIEFUUkFDRV9CRUdJTl9TTlBSSU5URgorI3VuZGVmIEtQSV9BVFJBQ0VfQkVHSU4KKyN1bmRlZiBLUElfQVRSQUNFX0VORAorI3VuZGVmIEtQSV9BVFJBQ0VfSU5UCisjdW5kZWYgQVRSQUNFX1RBRworI3VuZGVmIEFUUkFDRV9CRUdJTl9EQkcKKyN1bmRlZiBBVFJBQ0VfSU5UX0RCRworI3VuZGVmIEFUUkFDRV9FTkRfREJHCisKKyNkZWZpbmUgS1BJX09OTFkgMQorI2RlZmluZSBLUElfREJHIDIKKworI2RlZmluZSBDQU1FUkFfVFJBQ0VfQlVGIDMyCisKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorCisvL3RvIGVuYWJsZSBvbmx5IEtQSSBsb2dzCisjZGVmaW5lIEtQSV9BVFJBQ0VfQkVHSU4obmFtZSkgKHtcCitpZiAoZ0twaURlYnVnTGV2ZWwgPj0gS1BJX09OTFkpIHsgXAorICAgICBhdHJhY2VfYmVnaW4oQVRSQUNFX1RBRywgbmFtZSk7IFwKK31cCit9KQorCisjZGVmaW5lIEtQSV9BVFJBQ0VfRU5EKCkgKHtcCitpZiAoZ0twaURlYnVnTGV2ZWwgPj0gS1BJX09OTFkpIHsgXAorICAgICBhdHJhY2VfZW5kKEFUUkFDRV9UQUcpOyBcCit9XAorfSkKKworI2RlZmluZSBLUElfQVRSQUNFX0lOVChuYW1lLHZhbCkgKHtcCitpZiAoZ0twaURlYnVnTGV2ZWwgPj0gS1BJX09OTFkpIHsgXAorICAgICBhdHJhY2VfaW50KEFUUkFDRV9UQUcsIG5hbWUsIHZhbCk7IFwKK31cCit9KQorCisKKyNkZWZpbmUgQVRSQUNFX0JFR0lOX1NOUFJJTlRGKGZtdF9zdHIsIC4uLikgXAorIGlmIChnS3BpRGVidWdMZXZlbCA+PSBLUElfREJHKSB7IFwKKyAgIGNoYXIgdHJhY2VfdGFnW0NBTUVSQV9UUkFDRV9CVUZdOyBcCisgICBzbnByaW50Zih0cmFjZV90YWcsIENBTUVSQV9UUkFDRV9CVUYsIGZtdF9zdHIsICMjX19WQV9BUkdTX18pOyBcCisgICBBVFJBQ0VfQkVHSU4odHJhY2VfdGFnKTsgXAorfQorCisjZGVmaW5lIEFUUkFDRV9CRUdJTl9EQkcobmFtZSkgKHtcCitpZiAoZ0twaURlYnVnTGV2ZWwgPj0gS1BJX0RCRykgeyBcCisgICAgIGF0cmFjZV9iZWdpbihBVFJBQ0VfVEFHLCBuYW1lKTsgXAorfVwKK30pCisKKyNkZWZpbmUgQVRSQUNFX0VORF9EQkcoKSAoe1wKK2lmIChnS3BpRGVidWdMZXZlbCA+PSBLUElfREJHKSB7IFwKKyAgICAgYXRyYWNlX2VuZChBVFJBQ0VfVEFHKTsgXAorfVwKK30pCisKKyNkZWZpbmUgQVRSQUNFX0lOVF9EQkcobmFtZSx2YWwpICh7XAoraWYgKGdLcGlEZWJ1Z0xldmVsID49IEtQSV9EQkcpIHsgXAorICAgICBhdHJhY2VfaW50KEFUUkFDRV9UQUcsIG5hbWUsIHZhbCk7IFwKK31cCit9KQorCisjZGVmaW5lIEFUUkFDRV9CRUdJTiBBVFJBQ0VfQkVHSU5fREJHCisjZGVmaW5lIEFUUkFDRV9JTlQgQVRSQUNFX0lOVF9EQkcKKyNkZWZpbmUgQVRSQUNFX0VORCBBVFJBQ0VfRU5EX0RCRworCisjZGVmaW5lIEtQSV9BVFJBQ0VfTkFNRShuYW1lKSBxY2FtZXJhOjpTY29wZWRUcmFjZUtwaSBfX190cmFjZXIoQVRSQUNFX1RBRywgbmFtZSkKKyNkZWZpbmUgQVRSQUNFX05BTUUobmFtZSkgcWNhbWVyYTo6U2NvcGVkVHJhY2VEYmcgX19fdHJhY2VyKEFUUkFDRV9UQUcsIG5hbWUpCisjZGVmaW5lIEtQSV9BVFJBQ0VfQ0FMTCgpIEtQSV9BVFJBQ0VfTkFNRShfX0ZVTkNUSU9OX18pCisjZGVmaW5lIEFUUkFDRV9DQUxMKCkgQVRSQUNFX05BTUUoX19GVU5DVElPTl9fKQorCituYW1lc3BhY2UgcWNhbWVyYSB7CitleHRlcm4gdm9sYXRpbGUgdWludDMyX3QgZ0twaURlYnVnTGV2ZWw7CitjbGFzcyBTY29wZWRUcmFjZUtwaSB7CitwdWJsaWM6CisgICAgaW5saW5lIFNjb3BlZFRyYWNlS3BpKHVpbnQ2NF90IHRhZywgY29uc3QgY2hhciAqbmFtZSkKKyAgICA6IG1UYWcodGFnKSB7CisgICAgICAgIGlmIChnS3BpRGVidWdMZXZlbCA+PSBLUElfT05MWSkgeworICAgICAgICAgICAgYXRyYWNlX2JlZ2luKG1UYWcsbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgflNjb3BlZFRyYWNlS3BpKCkgeworICAgICAgICBpZiAoZ0twaURlYnVnTGV2ZWwgPj0gS1BJX09OTFkpIHsKKyAgICAgICAgICAgIGF0cmFjZV9lbmQobVRhZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICB1aW50NjRfdCBtVGFnOworfTsKKworY2xhc3MgU2NvcGVkVHJhY2VEYmcgeworcHVibGljOgorICAgIGlubGluZSBTY29wZWRUcmFjZURiZyh1aW50NjRfdCB0YWcsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgOiBtVGFnKHRhZykgeworICAgICAgICBpZiAoZ0twaURlYnVnTGV2ZWwgPj0gS1BJX0RCRykgeworICAgICAgICAgICAgYXRyYWNlX2JlZ2luKG1UYWcsbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgflNjb3BlZFRyYWNlRGJnKCkgeworICAgICAgICBpZiAoZ0twaURlYnVnTGV2ZWwgPj0gS1BJX0RCRykgeworICAgICAgICAgICAgYXRyYWNlX2VuZChtVGFnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHVpbnQ2NF90IG1UYWc7Cit9OworfTsKKworZXh0ZXJuIHZvbGF0aWxlIHVpbnQzMl90IGdLcGlEZWJ1Z0xldmVsOworCisjZW5kaWYgLyogX19RQ0FNUkVBVFJBQ0VfSF9fICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvUUNhbWVyYVBhcmFtZXRlcnMuaCBiL21zbWNvYmFsdC9RQ2FtZXJhUGFyYW1ldGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MWNhNDQKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvUUNhbWVyYVBhcmFtZXRlcnMuaApAQCAtMCwwICsxLDI1NiBAQAorLyoKKyoqIENvcHlyaWdodCAyMDA4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUUNBTUVSQV9QQVJBTUVURVJTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9RQ0FNRVJBX1BBUkFNRVRFUlNfSAorCisvLyBDYW1lcmEgZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgRlBTUmFuZ2V7CisgICAgaW50IG1pbkZQUzsKKyAgICBpbnQgbWF4RlBTOworICAgIEZQU1JhbmdlKCl7CisgICAgICAgIG1pbkZQUz0wOworICAgICAgICBtYXhGUFM9MDsKKyAgICB9OworICAgIEZQU1JhbmdlKGludCBtaW4saW50IG1heCl7CisgICAgICAgIG1pbkZQUz1taW47CisgICAgICAgIG1heEZQUz1tYXg7CisgICAgfTsKK307CitjbGFzcyBRQ2FtZXJhUGFyYW1ldGVyczogcHVibGljIENhbWVyYVBhcmFtZXRlcnMKK3sKK3B1YmxpYzoKKyNpZiAxCisgICAgUUNhbWVyYVBhcmFtZXRlcnMoKSA6IENhbWVyYVBhcmFtZXRlcnMoKSB7fTsKKyAgICBRQ2FtZXJhUGFyYW1ldGVycyhjb25zdCBTdHJpbmc4ICZwYXJhbXMpOiBDYW1lcmFQYXJhbWV0ZXJzKHBhcmFtcykge307CisgICAgI2Vsc2UKKyAgICBRQ2FtZXJhUGFyYW1ldGVycygpIDogQ2FtZXJhUGFyYW1ldGVycygpIHt9OworICAgIFFDYW1lcmFQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzggJnBhcmFtcykgeyB1bmZsYXR0ZW4ocGFyYW1zKTsgfQorI2VuZGlmCisgICAgflFDYW1lcmFQYXJhbWV0ZXJzKCk7CisKKyAgICAvLyBTdXBwb3J0ZWQgUFJFVklFVy9SRUNPUkRJTkcgU0laRVMgSU4gSElHSCBGUkFNRSBSQVRFIHJlY29yZGluZywgc2l6ZXMgaW4gcGl4ZWxzLgorICAgIC8vIEV4YW1wbGUgdmFsdWU6ICI4MDB4NDgwLDQzMngzMjAiLiBSZWFkIG9ubHkuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1NVUFBPUlRFRF9IRlJfU0laRVNbXTsKKyAgICAvLyBUaGUgbW9kZSBvZiBwcmV2aWV3IGZyYW1lIHJhdGUuCisgICAgLy8gRXhhbXBsZSB2YWx1ZTogImZyYW1lLXJhdGUtYXV0bywgZnJhbWUtcmF0ZS1maXhlZCIuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1BSRVZJRVdfRlJBTUVfUkFURV9NT0RFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1NVUFBPUlRFRF9QUkVWSUVXX0ZSQU1FX1JBVEVfTU9ERVNbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfUFJFVklFV19GUkFNRV9SQVRFX0FVVE9fTU9ERVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9QUkVWSUVXX0ZSQU1FX1JBVEVfRklYRURfTU9ERVtdOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1NLSU5fVE9ORV9FTkhBTkNFTUVOVFtdIDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU1VQUE9SVEVEX1NLSU5fVE9ORV9FTkhBTkNFTUVOVF9NT0RFU1tdIDsKKworICAgIC8vVG91Y2ggQWYvQUVDIHNldHRpbmdzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9UT1VDSF9BRl9BRUNbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU1VQUE9SVEVEX1RPVUNIX0FGX0FFQ1tdOworICAgIC8vVG91Y2ggSW5kZXggZm9yIEFFQy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfVE9VQ0hfSU5ERVhfQUVDW107CisgICAgLy9Ub3VjaCBJbmRleCBmb3IgQUYuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1RPVUNIX0lOREVYX0FGW107CisgICAgLy8gQ3VycmVudCBhdXRvIHNjZW5lIGRldGVjdGlvbiBtb2RlLgorICAgIC8vIEV4YW1wbGUgdmFsdWU6ICJvZmYiIG9yIFNDRU5FX0RFVEVDVF9YWFggY29uc3RhbnRzLiBSZWFkL3dyaXRlLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TQ0VORV9ERVRFQ1RbXTsKKyAgICAvLyBTdXBwb3J0ZWQgYXV0byBzY2VuZSBkZXRlY3Rpb24gc2V0dGluZ3MuCisgICAgLy8gRXhhbXBsZSB2YWx1ZTogIm9mZixiYWNrbGlnaHQsc25vdy9jbG91ZHkiLiBSZWFkIG9ubHkuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1NVUFBPUlRFRF9TQ0VORV9ERVRFQ1RbXTsKKwkgICAvLyBSZXR1cm5zIHRydWUgaWYgdmlkZW8gc25hcHNob3QgaXMgc3VwcG9ydGVkLiBUaGF0IGlzLCBhcHBsaWNhdGlvbnMKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfRlVMTF9WSURFT19TTkFQX1NVUFBPUlRFRFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9QT1dFUl9NT0RFX1NVUFBPUlRFRFtdOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0lTT19NT0RFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1NVUFBPUlRFRF9JU09fTU9ERVNbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfTEVOU1NIQURFW10gOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TVVBQT1JURURfTEVOU1NIQURFX01PREVTW10gOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0FVVE9fRVhQT1NVUkVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU1VQUE9SVEVEX0FVVE9fRVhQT1NVUkVbXTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9HUFNfTEFUSVRVREVfUkVGW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0dQU19MT05HSVRVREVfUkVGW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0dQU19BTFRJVFVERV9SRUZbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfR1BTX1NUQVRVU1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9FWElGX0RBVEVUSU1FW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX01FTU9SWV9DT0xPUl9FTkhBTkNFTUVOVFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TVVBQT1JURURfTUVNX0NPTE9SX0VOSEFOQ0VfTU9ERVNbXTsKKworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1BPV0VSX01PREVbXTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9aU0xbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU1VQUE9SVEVEX1pTTF9NT0RFU1tdOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0NBTUVSQV9NT0RFW107CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfVklERU9fSElHSF9GUkFNRV9SQVRFW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1NVUFBPUlRFRF9WSURFT19ISUdIX0ZSQU1FX1JBVEVfTU9ERVNbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfSElHSF9EWU5BTUlDX1JBTkdFX0lNQUdJTkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU1VQUE9SVEVEX0hEUl9JTUFHSU5HX01PREVTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0FFX0JSQUNLRVRfSERSW107CisKKworICAgIC8vIERFTk9JU0UKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfREVOT0lTRVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TVVBQT1JURURfREVOT0lTRVtdOworCisgICAgLy9TZWxlY3RhYmxlIHpvbmUgQUYuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1NFTEVDVEFCTEVfWk9ORV9BRltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TVVBQT1JURURfU0VMRUNUQUJMRV9aT05FX0FGW107CisKKyAgICAvL0ZhY2UgRGV0ZWN0aW9uCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0ZBQ0VfREVURUNUSU9OW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1NVUFBPUlRFRF9GQUNFX0RFVEVDVElPTltdOworCisgICAgLy9SZWRleWUgUmVkdWN0aW9uCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1JFREVZRV9SRURVQ1RJT05bXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU1VQUE9SVEVEX1JFREVZRV9SRURVQ1RJT05bXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBFRkZFQ1RfRU1CT1NTW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgRUZGRUNUX1NLRVRDSFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEVGRkVDVF9ORU9OW107CisKKyAgICAvLyBWYWx1ZXMgZm9yIFRvdWNoIEFGL0FFQworICAgIHN0YXRpYyBjb25zdCBjaGFyIFRPVUNIX0FGX0FFQ19PRkZbXSA7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgVE9VQ0hfQUZfQUVDX09OW10gOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFNDRU5FX01PREVfQVNEW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgU0NFTkVfTU9ERV9CQUNLTElHSFRbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBTQ0VORV9NT0RFX0ZMT1dFUlNbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBTQ0VORV9NT0RFX0FSW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgU0NFTkVfTU9ERV9IRFJbXTsKKwlzdGF0aWMgY29uc3QgY2hhciBTQ0VORV9ERVRFQ1RfT0ZGW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgU0NFTkVfREVURUNUX09OW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUElYRUxfRk9STUFUX1lVVjQyMFNQX0FEUkVOT1tdOyAvLyBBRFJFTk8KKwlzdGF0aWMgY29uc3QgY2hhciBQSVhFTF9GT1JNQVRfUkFXW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgUElYRUxfRk9STUFUX1lWMTJbXTsgLy8gTlYxMgorICAgIHN0YXRpYyBjb25zdCBjaGFyIFBJWEVMX0ZPUk1BVF9OVjEyW107IC8vTlYxMgorICAgIC8vIE5vcm1hbCBmb2N1cyBtb2RlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIGNhbGwKKyAgICAvLyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZS5hdXRvRm9jdXMgdG8gc3RhcnQgdGhlIGZvY3VzIGluIHRoaXMgbW9kZS4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBGT0NVU19NT0RFX05PUk1BTFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIElTT19BVVRPW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgSVNPX0hKUltdIDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBJU09fMTAwW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgSVNPXzIwMFtdIDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBJU09fNDAwW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgSVNPXzgwMFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIElTT18xNjAwW107CisgICAgLy8gVmFsdWVzIGZvciBMZW5zIFNoYWRpbmcKKyAgICBzdGF0aWMgY29uc3QgY2hhciBMRU5TU0hBREVfRU5BQkxFW10gOworICAgIHN0YXRpYyBjb25zdCBjaGFyIExFTlNTSEFERV9ESVNBQkxFW10gOworCisgICAgLy8gVmFsdWVzIGZvciBhdXRvIGV4cG9zdXJlIHNldHRpbmdzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEFVVE9fRVhQT1NVUkVfRlJBTUVfQVZHW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgQVVUT19FWFBPU1VSRV9DRU5URVJfV0VJR0hURURbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBBVVRPX0VYUE9TVVJFX1NQT1RfTUVURVJJTkdbXTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TSEFSUE5FU1NbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfTUFYX1NIQVJQTkVTU1tdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9DT05UUkFTVFtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9NQVhfQ09OVFJBU1RbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU0FUVVJBVElPTltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9NQVhfU0FUVVJBVElPTltdOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX0hJU1RPR1JBTVtdIDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfU1VQUE9SVEVEX0hJU1RPR1JBTV9NT0RFU1tdIDsKKyAgICAvLyBWYWx1ZXMgZm9yIEhJU1RPR1JBTQorICAgIHN0YXRpYyBjb25zdCBjaGFyIEhJU1RPR1JBTV9FTkFCTEVbXSA7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgSElTVE9HUkFNX0RJU0FCTEVbXSA7CisKKyAgICAvLyBWYWx1ZXMgZm9yIFNLSU4gVE9ORSBFTkhBTkNFTUVOVAorICAgIHN0YXRpYyBjb25zdCBjaGFyIFNLSU5fVE9ORV9FTkhBTkNFTUVOVF9FTkFCTEVbXSA7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgU0tJTl9UT05FX0VOSEFOQ0VNRU5UX0RJU0FCTEVbXSA7CisKKyAgICAvLyBWYWx1ZXMgZm9yIERlbm9pc2UKKyAgICBzdGF0aWMgY29uc3QgY2hhciBERU5PSVNFX09GRltdIDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBERU5PSVNFX09OW10gOworCisgICAgLy8gVmFsdWVzIGZvciBhdXRvIGV4cG9zdXJlIHNldHRpbmdzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIFNFTEVDVEFCTEVfWk9ORV9BRl9BVVRPW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgU0VMRUNUQUJMRV9aT05FX0FGX1NQT1RfTUVURVJJTkdbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBTRUxFQ1RBQkxFX1pPTkVfQUZfQ0VOVEVSX1dFSUdIVEVEW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgU0VMRUNUQUJMRV9aT05FX0FGX0ZSQU1FX0FWRVJBR0VbXTsKKworICAgIC8vIFZhbHVlcyBmb3IgRmFjZSBEZXRlY3Rpb24gc2V0dGluZ3MuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgRkFDRV9ERVRFQ1RJT05fT0ZGW107CisgICAgc3RhdGljIGNvbnN0IGNoYXIgRkFDRV9ERVRFQ1RJT05fT05bXTsKKworICAgIC8vIFZhbHVlcyBmb3IgTUNFIHNldHRpbmdzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIE1DRV9FTkFCTEVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBNQ0VfRElTQUJMRVtdOworCisgICAgLy8gVmFsdWVzIGZvciBaU0wgc2V0dGluZ3MuCisgICAgc3RhdGljIGNvbnN0IGNoYXIgWlNMX09GRltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFpTTF9PTltdOworCisgICAgLy8gVmFsdWVzIGZvciBIRFIgQnJhY2tldGluZyBzZXR0aW5ncy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBBRV9CUkFDS0VUX0hEUl9PRkZbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBBRV9CUkFDS0VUX0hEUltdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIEFFX0JSQUNLRVRbXTsKKworICAgIC8vIFZhbHVlcyBmb3IgUG93ZXIgbW9kZSBzZXR0aW5ncy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBMT1dfUE9XRVJbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBOT1JNQUxfUE9XRVJbXTsKKworICAgIC8vIFZhbHVlcyBmb3IgSEZSIHNldHRpbmdzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIFZJREVPX0hGUl9PRkZbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBWSURFT19IRlJfMlhbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBWSURFT19IRlJfM1hbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBWSURFT19IRlJfNFhbXTsKKworICAgIC8vIFZhbHVlcyBmb3IgUmVkZXllIFJlZHVjdGlvbiBzZXR0aW5ncy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciBSRURFWUVfUkVEVUNUSU9OX0VOQUJMRVtdOworICAgIHN0YXRpYyBjb25zdCBjaGFyIFJFREVZRV9SRURVQ1RJT05fRElTQUJMRVtdOworICAgIC8vIFZhbHVlcyBmb3IgSERSIHNldHRpbmdzLgorICAgIHN0YXRpYyBjb25zdCBjaGFyIEhEUl9FTkFCTEVbXTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciBIRFJfRElTQUJMRVtdOworCisgICAvLyBWYWx1ZXMgZm9yIFJlZGV5ZSBSZWR1Y3Rpb24gc2V0dGluZ3MuCisgICAvLyBzdGF0aWMgY29uc3QgY2hhciBSRURFWUVfUkVEVUNUSU9OX0VOQUJMRVtdOworICAgLy8gc3RhdGljIGNvbnN0IGNoYXIgUkVERVlFX1JFRFVDVElPTl9ESVNBQkxFW107CisgICAvLyBWYWx1ZXMgZm9yIEhEUiBzZXR0aW5ncy4KKyAgIC8vICAgIHN0YXRpYyBjb25zdCBjaGFyIEhEUl9FTkFCTEVbXTsKKyAgIC8vICAgIHN0YXRpYyBjb25zdCBjaGFyIEhEUl9ESVNBQkxFW107CisKKworICAgc3RhdGljIGNvbnN0IGNoYXIgS0VZX1NJTkdMRV9JU1BfT1VUUFVUX0VOQUJMRURbXTsKKyAgIHN0YXRpYyBjb25zdCBjaGFyIEtFWV9TVVBQT1JURURfQ0FNRVJBX0ZFQVRVUkVTW107CisgICBzdGF0aWMgY29uc3QgY2hhciBLRVlfTUFYX05VTV9SRVFVRVNURURfRkFDRVNbXTsKKworICAgIGVudW0geworICAgICAgICBDQU1FUkFfT1JJRU5UQVRJT05fVU5LTk9XTiA9IDAsCisgICAgICAgIENBTUVSQV9PUklFTlRBVElPTl9QT1JUUkFJVCA9IDEsCisgICAgICAgIENBTUVSQV9PUklFTlRBVElPTl9MQU5EU0NBUEUgPSAyLAorICAgIH07CisgICAgaW50IGdldE9yaWVudGF0aW9uKCkgY29uc3Q7CisgICAgdm9pZCBzZXRPcmllbnRhdGlvbihpbnQgb3JpZW50YXRpb24pOworICAgIHZvaWQgZ2V0U3VwcG9ydGVkSGZyU2l6ZXMoVmVjdG9yPFNpemU+ICZzaXplcykgY29uc3Q7CisgICAgdm9pZCBzZXRQcmV2aWV3RnBzUmFuZ2UoaW50IG1pbkZQUyxpbnQgbWF4RlBTKTsKKwl2b2lkIHNldFByZXZpZXdGcmFtZVJhdGVNb2RlKGNvbnN0IGNoYXIgKm1vZGUpOworICAgIGNvbnN0IGNoYXIgKmdldFByZXZpZXdGcmFtZVJhdGVNb2RlKCkgY29uc3Q7CisgICAgdm9pZCBzZXRUb3VjaEluZGV4QWVjKGludCB4LCBpbnQgeSk7CisgICAgdm9pZCBnZXRUb3VjaEluZGV4QWVjKGludCAqeCwgaW50ICp5KSBjb25zdDsKKyAgICB2b2lkIHNldFRvdWNoSW5kZXhBZihpbnQgeCwgaW50IHkpOworICAgIHZvaWQgZ2V0VG91Y2hJbmRleEFmKGludCAqeCwgaW50ICp5KSBjb25zdDsKKyAgICB2b2lkIGdldE1ldGVyaW5nQXJlYUNlbnRlcihpbnQgKiB4LCBpbnQgKnkpIGNvbnN0OworCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9RQ2FtZXJhX0ludGYuaCBiL21zbWNvYmFsdC9RQ2FtZXJhX0ludGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDQzNDk0Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L1FDYW1lcmFfSW50Zi5oCkBAIC0wLDAgKzEsMTE0NyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKy8qZm9yIHRlc3QgKi8KKyNpZm5kZWYgX19RQ0FNRVJBX0lOVEZfSF9fCisjZGVmaW5lIF9fUUNBTUVSQV9JTlRGX0hfXworCisvLyBTeXN0ZW0gZGVwZW5kZW5jaWVzCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIFBBRF9UT19XT1JEKGEpICAgICAgICAgICAgICAgKCgoYSkrMykmfjMpCisjZGVmaW5lIFBBRF9UT18ySyhhKSAgICAgICAgICAgICAgICAgKCgoYSkrMjA0NykmfjIwNDcpCisjZGVmaW5lIFBBRF9UT180SyhhKSAgICAgICAgICAgICAgICAgKCgoYSkrNDA5NSkmfjQwOTUpCisjZGVmaW5lIFBBRF9UT184SyhhKSAgICAgICAgICAgICAgICAgKCgoYSkrODE5MSkmfjgxOTEpCisKKyNkZWZpbmUgQ0VJTElORzMyKFgpICgoKFgpICsgMHgwMDAxRikgJiAweEZGRkZGRkUwKQorI2RlZmluZSBDRUlMSU5HMTYoWCkgKCgoWCkgKyAweDAwMEYpICYgMHhGRkYwKQorI2RlZmluZSBDRUlMSU5HNChYKSAgKCgoWCkgKyAweDAwMDMpICYgMHhGRkZDKQorI2RlZmluZSBDRUlMSU5HMihYKSAgKCgoWCkgKyAweDAwMDEpICYgMHhGRkZFKQorCisjZGVmaW5lIE1BWF9ST0kgMgorI2RlZmluZSBNQVhfTlVNX1BBUk0gNQorI2RlZmluZSBNQVhfTlVNX09QUyAyCisjZGVmaW5lIFZJREVPX01BWF9QTEFORVMgOAorI2RlZmluZSBNQVhfU05BUFNIT1RfQlVGRkVSUyA1CisjZGVmaW5lIE1BWF9FWFBfQlJBQ0tFVElOR19MRU5HVEggMzIKKworCisvKiBFeGlmIFRhZyBJRCAqLwordHlwZWRlZiB1aW50MzJfdCBleGlmX3RhZ19pZF90OworCisvKiBFeGlmIEluZm8gKG9wYXF1ZSBkZWZpbml0aW9uKSAqLworc3RydWN0IGV4aWZfaW5mb190OwordHlwZWRlZiBzdHJ1Y3QgZXhpZl9pbmZvX3QgKiBleGlmX2luZm9fb2JqX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgIEJBQ0tfQ0FNRVJBLAorICBGUk9OVF9DQU1FUkEsCit9Y2FtX3Bvc2l0aW9uX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgIENBTV9DVFJMX0ZBSUxFRCwgICAgICAgIC8qIEZhaWx1cmUgaW4gZG9pbmcgb3BlcmF0aW9uICovCisgIENBTV9DVFJMX1NVQ0NFU1MsICAgICAgIC8qIE9wZXJhdGlvbiBTdWNjZWRlZCAqLworICBDQU1fQ1RSTF9JTlZBTElEX1BBUk0sICAvKiBJbmF2bGlkIHBhcmFtZXRlciBwcm92aWRlZCAqLworICBDQU1fQ1RSTF9OT1RfU1VQUE9SVEVELCAvKiBQYXJhbWV0ZXIvb3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgKi8KKyAgQ0FNX0NUUkxfQUNDRVBURUQsICAgICAgLyogUGFyYW1ldGVyIGFjY2VwdGVkICovCisgIENBTV9DVFJMX01BWCwKK30gY2FtX2N0cmxfc3RhdHVzX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgIENBTUVSQV9ZVVZfNDIwX05WMTIsCisgIENBTUVSQV9ZVVZfNDIwX05WMjEsCisgIENBTUVSQV9ZVVZfNDIwX05WMjFfQURSRU5PLAorICBDQU1FUkFfQkFZRVJfU0JHR1IxMCwKKyAgQ0FNRVJBX1JESSwKKyAgQ0FNRVJBX1lVVl80MjBfWVYxMiwKKyAgQ0FNRVJBX1lVVl80MjJfTlYxNiwKKyAgQ0FNRVJBX1lVVl80MjJfTlY2MSwKKyAgQ0FNRVJBX1lVVl80MjJfWVVZViwKKyAgQ0FNRVJBX1NBRUMsCisgIENBTUVSQV9TQVdCLAorICBDQU1FUkFfU0FGQywKKyAgQ0FNRVJBX1NIU1QsCit9IGNhbV9mb3JtYXRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgQ0FNRVJBX1BBRF9OT05FLAorICBDQU1FUkFfUEFEX1RPX1dPUkQsICAgLyoyIGJ5dGVzKi8KKyAgQ0FNRVJBX1BBRF9UT19MT05HX1dPUkQsIC8qNCBieXRlcyovCisgIENBTUVSQV9QQURfVE9fOCwgLyo4IGJ5dGVzKi8KKyAgQ0FNRVJBX1BBRF9UT18xNiwgLyoxNiBieXRlcyovCisKKyAgQ0FNRVJBX1BBRF9UT18xSywgLyoxayBieXRlcyovCisgIENBTUVSQV9QQURfVE9fMkssIC8qMmsgYnl0ZXMqLworICBDQU1FUkFfUEFEX1RPXzRLLAorICBDQU1FUkFfUEFEX1RPXzhLCit9IGNhbV9wYWRfZm9ybWF0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGV4dF9tb2RlOyAgIC8qIHByZXZpZXcsIG1haW4sIHRodW1ibmFpbCwgdmlkZW8sIHJhdywgZXRjICovCisgIGludCBmcmFtZV9pZHg7ICAvKiBmcmFtZSBpbmRleCAqLworICBpbnQgZmQ7ICAgICAgICAgLyogb3JpZ2luIGZkICovCisgIHVpbnQzMl90IHNpemU7CisgIHVpbnQ4X3QgaXNfaGlzdDsgLyogaXMgaGlzdCBtYXBwaW5nPyAqLworfSBtbV9jYW1lcmFfZnJhbWVfbWFwX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGV4dF9tb2RlOyAgIC8qIHByZXZpZXcsIG1haW4sIHRodW1ibmFpbCwgdmlkZW8sIHJhdywgZXRjICovCisgIGludCBmcmFtZV9pZHg7ICAvKiBmcmFtZSBpbmRleCAqLworICB1aW50OF90IGlzX2hpc3Q7IC8qIGlzIGhpc3QgdW5tYXBwaW5nPyAqLworfSBtbV9jYW1lcmFfZnJhbWVfdW5tYXBfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgQ0FNX1NPQ0tfTVNHX1RZUEVfRkRfTUFQUElORywKKyAgQ0FNX1NPQ0tfTVNHX1RZUEVfRkRfVU5NQVBQSU5HLAorICBDQU1fU09DS19NU0dfVFlQRV9XRE5fU1RBUlQsCisgIENBTV9TT0NLX01TR19UWVBFX0hEUl9TVEFSVCwKKyAgQ0FNX1NPQ0tfTVNHX1RZUEVfSElTVF9NQVBQSU5HLAorICBDQU1fU09DS19NU0dfVFlQRV9ISVNUX1VOTUFQUElORywKKyAgQ0FNX1NPQ0tfTVNHX1RZUEVfTUFYCit9bW1fY2FtZXJhX3NvY2tldF9tc2dfdHlwZTsKKyNkZWZpbmUgTUFYX0hEUl9FWFBfRlJBTUVfTlVNIDUKK3R5cGVkZWYgc3RydWN0IHsKKyAgdW5zaWduZWQgbG9uZyBjb29raWU7CisgIGludCBudW1faGRyX2ZyYW1lczsKKyAgaW50IGhkcl9tYWluX2lkeFtNQVhfSERSX0VYUF9GUkFNRV9OVU1dOworICBpbnQgaGRyX3RobV9pZHhbTUFYX0hEUl9FWFBfRlJBTUVfTlVNXTsKKyAgaW50IGV4cFtNQVhfSERSX0VYUF9GUkFNRV9OVU1dOworfSBtbV9jYW1lcmFfaGRyX3N0YXJ0X3R5cGU7CisKKyNkZWZpbmUgTU1fTUFYX1dETl9OVU0gMgordHlwZWRlZiBzdHJ1Y3QgeworICB1bnNpZ25lZCBsb25nIGNvb2tpZTsKKyAgaW50IG51bV9mcmFtZXM7CisgIGludCBleHRfbW9kZVtNTV9NQVhfV0ROX05VTV07CisgIGludCBmcmFtZV9pZHhbTU1fTUFYX1dETl9OVU1dOworfSBtbV9jYW1lcmFfd2RuX3N0YXJ0X3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgbW1fY2FtZXJhX3NvY2tldF9tc2dfdHlwZSBtc2dfdHlwZTsKKyAgdW5pb24geworICAgIG1tX2NhbWVyYV9mcmFtZV9tYXBfdHlwZSBmcmFtZV9mZF9tYXA7CisgICAgbW1fY2FtZXJhX2ZyYW1lX3VubWFwX3R5cGUgZnJhbWVfZmRfdW5tYXA7CisgICAgbW1fY2FtZXJhX3dkbl9zdGFydF90eXBlIHdkbl9zdGFydDsKKyAgICBtbV9jYW1lcmFfaGRyX3N0YXJ0X3R5cGUgaGRyX3BrZzsKKyAgfSBwYXlsb2FkOworfSBjYW1fc29ja19wYWNrZXRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgQ0FNX1ZJREVPX0ZSQU1FLAorICBDQU1fU05BUFNIT1RfRlJBTUUsCisgIENBTV9QUkVWSUVXX0ZSQU1FLAorfWNhbV9mcmFtZV90eXBlX3Q7CisKKwordHlwZWRlZiBlbnVtIHsKKyAgQ0FNRVJBX01PREVfMkQgPSAoMTw8MCksCisgIENBTUVSQV9NT0RFXzNEID0gKDE8PDEpLAorICBDQU1FUkFfTk9OWlNMX01PREUgPSAoMTw8MiksCisgIENBTUVSQV9aU0xfTU9ERSA9ICgxPDwzKSwKKyAgQ0FNRVJBX01PREVfTUFYID0gQ0FNRVJBX1pTTF9NT0RFLAorfSBjYW1lcmFfbW9kZV90OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50ICBtb2Rlc19zdXBwb3J0ZWQ7CisgIGludDhfdCBjYW1lcmFfaWQ7CisgIGNhbV9wb3NpdGlvbl90IHBvc2l0aW9uOworICB1aW50MzJfdCBzZW5zb3JfbW91bnRfYW5nbGU7Cit9Y2FtZXJhX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjYW1lcmFfbW9kZV90IG1vZGU7CisgIGludDhfdCBjYW1lcmFfaWQ7CisgIGNhbWVyYV9tb2RlX3QgY2FtbW9kZTsKK31jb25maWdfcGFyYW1zX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgbGVuOworICB1aW50MzJfdCB5X29mZnNldDsKKyAgdWludDMyX3QgY2Jjcl9vZmZzZXQ7Cit9IGNhbV9zcF9sZW5fb2Zmc2V0X3Q7CisKK3R5cGVkZWYgc3RydWN0eworICB1aW50MzJfdCBsZW47CisgIHVpbnQzMl90IG9mZnNldDsKK30gY2FtX21wX2xlbl9vZmZzZXRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgbnVtX3BsYW5lczsKKyAgdW5pb24geworICAgIGNhbV9zcF9sZW5fb2Zmc2V0X3Qgc3A7CisgICAgY2FtX21wX2xlbl9vZmZzZXRfdCBtcFs4XTsKKyAgfTsKKyAgdWludDMyX3QgZnJhbWVfbGVuOworfSBjYW1fZnJhbWVfbGVuX29mZnNldF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IHBhcm1bTUFYX05VTV9QQVJNXTsKKyAgdWludDMyX3Qgb3BzW01BWF9OVU1fT1BTXTsKKyAgdWludDhfdCB5dXZfb3V0cHV0OworICB1aW50OF90IGpwZWdfY2FwdHVyZTsKKyAgdWludDMyX3QgbWF4X3BpY3Rfd2lkdGg7CisgIHVpbnQzMl90IG1heF9waWN0X2hlaWdodDsKKyAgdWludDMyX3QgbWF4X3ByZXZpZXdfd2lkdGg7CisgIHVpbnQzMl90IG1heF9wcmV2aWV3X2hlaWdodDsKKyAgdWludDMyX3QgbWF4X3ZpZGVvX3dpZHRoOworICB1aW50MzJfdCBtYXhfdmlkZW9faGVpZ2h0OworICB1aW50MzJfdCBlZmZlY3Q7CisgIGNhbWVyYV9tb2RlX3QgbW9kZXM7CisgIHVpbnQ4X3QgcHJldmlld19mb3JtYXQ7CisgIHVpbnQzMl90IHByZXZpZXdfc2l6ZXNfY250OworICB1aW50MzJfdCB0aHVtYl9zaXplc19jbnQ7CisgIHVpbnQzMl90IHZpZGVvX3NpemVzX2NudDsKKyAgdWludDMyX3QgaGZyX3NpemVzX2NudDsKKyAgdWludDhfdCB2ZmVfb3V0cHV0X2VuYWJsZTsKKyAgdWludDhfdCBoZnJfZnJhbWVfc2tpcDsKKyAgdWludDMyX3QgZGVmYXVsdF9wcmV2aWV3X3dpZHRoOworICB1aW50MzJfdCBkZWZhdWx0X3ByZXZpZXdfaGVpZ2h0OworICB1aW50MzJfdCBiZXN0c2hvdF9yZWNvbmZpZ3VyZTsKKyAgdWludDMyX3QgcHhsY29kZTsKK31jYW1fcHJvcF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQxNl90IHZpZGVvX3dpZHRoOyAgICAgICAgIC8qIFZpZGVvIHdpZHRoIHNlZW4gYnkgVkZFIGNvdWxkIGJlIGRpZmZlcmVudCB0aGFuIG9yaWcuIEV4LiBESVMgKi8KKyAgdWludDE2X3QgdmlkZW9faGVpZ2h0OyAgICAgICAgLyogVmlkZW8gaGVpZ2h0IHNlZW4gYnkgVkZFICovCisgIHVpbnQxNl90IHBpY3R1cmVfd2lkdGg7ICAgICAgIC8qIFBpY3R1cmUgd2lkdGggc2VlbiBieSBWRkUgKi8KKyAgdWludDE2X3QgcGljdHVyZV9oZWlnaHQ7ICAgICAgLyogUGljdHVyZSBoZWlnaHQgc2VlbiBieSBWRkUgKi8KKyAgdWludDE2X3QgZGlzcGxheV93aWR0aDsgICAgICAgLyogd2lkdGggb2YgZGlzcGxheSAqLworICB1aW50MTZfdCBkaXNwbGF5X2hlaWdodDsgICAgICAvKiBoZWlnaHQgb2YgZGlzcGxheSAqLworICB1aW50MTZfdCBvcmlnX3ZpZGVvX3dpZHRoOyAgICAvKiBvcmlnaW5hbCB2aWRlbyB3aWR0aCByZWNlaXZlZCAqLworICB1aW50MTZfdCBvcmlnX3ZpZGVvX2hlaWdodDsgICAvKiBvcmlnaW5hbCB2aWRlbyBoZWlnaHQgcmVjZWl2ZWQgKi8KKyAgdWludDE2X3Qgb3JpZ19waWN0dXJlX2R4OyAgICAgLyogb3JpZ2luYWwgcGljdHVyZSB3aWR0aCByZWNlaXZlZCAqLworICB1aW50MTZfdCBvcmlnX3BpY3R1cmVfZHk7ICAgICAvKiBvcmlnaW5hbCBwaWN0dXJlIGhlaWdodCByZWNlaXZlZCAqLworICB1aW50MTZfdCB1aV90aHVtYm5haWxfaGVpZ2h0OyAvKiBKdXN0IGxpa2Ugb3JpZ19waWN0dXJlX2R4ICovCisgIHVpbnQxNl90IHVpX3RodW1ibmFpbF93aWR0aDsgIC8qIEp1c3QgbGlrZSBvcmlnX3BpY3R1cmVfZHkgKi8KKyAgdWludDE2X3QgdGh1bWJuYWlsX2hlaWdodDsKKyAgdWludDE2X3QgdGh1bWJuYWlsX3dpZHRoOworICB1aW50MTZfdCBvcmlnX3BpY3R1cmVfd2lkdGg7CisgIHVpbnQxNl90IG9yaWdfcGljdHVyZV9oZWlnaHQ7CisgIHVpbnQxNl90IG9yaWdfdGh1bWJfd2lkdGg7CisgIHVpbnQxNl90IG9yaWdfdGh1bWJfaGVpZ2h0OworICB1aW50MTZfdCByYXdfcGljdHVyZV9oZWlnaHQ7CisgIHVpbnQxNl90IHJhd19waWN0dXJlX3dpZHRoOworICB1aW50MTZfdCByZGkwX2hlaWdodDsKKyAgdWludDE2X3QgcmRpMF93aWR0aDsKKyAgdWludDE2X3QgcmRpMV9oZWlnaHQ7CisgIHVpbnQxNl90IHJkaTFfd2lkdGg7CisgIHVpbnQzMl90IGhqcl94dHJhX2J1ZmZfZm9yX2JheWVyX2ZpbHRlcmluZzsKKyAgY2FtX2Zvcm1hdF90ICAgIHByZXZfZm9ybWF0OworICBjYW1fZm9ybWF0X3QgICAgZW5jX2Zvcm1hdDsKKyAgY2FtX2Zvcm1hdF90ICAgIHRodW1iX2Zvcm1hdDsKKyAgY2FtX2Zvcm1hdF90ICAgIG1haW5faW1nX2Zvcm1hdDsKKyAgY2FtX2Zvcm1hdF90ICAgIHJkaTBfZm9ybWF0OworICBjYW1fZm9ybWF0X3QgICAgcmRpMV9mb3JtYXQ7CisgIGNhbV9mb3JtYXRfdCAgICByYXdfaW1nX2Zvcm1hdDsKKyAgY2FtX3BhZF9mb3JtYXRfdCBwcmV2X3BhZGRpbmdfZm9ybWF0OworICBjYW1fcGFkX2Zvcm1hdF90IGVuY19wYWRkaW5nX2Zvcm1hdDsKKyAgY2FtX3BhZF9mb3JtYXRfdCB0aHVtYl9wYWRkaW5nX2Zvcm1hdDsKKyAgY2FtX3BhZF9mb3JtYXRfdCBtYWluX3BhZGRpbmdfZm9ybWF0OworICB1aW50MTZfdCBkaXNwbGF5X2x1bWFfd2lkdGg7CisgIHVpbnQxNl90IGRpc3BsYXlfbHVtYV9oZWlnaHQ7CisgIHVpbnQxNl90IGRpc3BsYXlfY2hyb21hX3dpZHRoOworICB1aW50MTZfdCBkaXNwbGF5X2Nocm9tYV9oZWlnaHQ7CisgIHVpbnQxNl90IHZpZGVvX2x1bWFfd2lkdGg7CisgIHVpbnQxNl90IHZpZGVvX2x1bWFfaGVpZ2h0OworICB1aW50MTZfdCB2aWRlb19jaHJvbWFfd2lkdGg7CisgIHVpbnQxNl90IHZpZGVvX2Nocm9tYV9oZWlnaHQ7CisgIHVpbnQxNl90IHRodW1ibmFpbF9sdW1hX3dpZHRoOworICB1aW50MTZfdCB0aHVtYm5haWxfbHVtYV9oZWlnaHQ7CisgIHVpbnQxNl90IHRodW1ibmFpbF9jaHJvbWFfd2lkdGg7CisgIHVpbnQxNl90IHRodW1ibmFpbF9jaHJvbWFfaGVpZ2h0OworICB1aW50MTZfdCBtYWluX2ltZ19sdW1hX3dpZHRoOworICB1aW50MTZfdCBtYWluX2ltZ19sdW1hX2hlaWdodDsKKyAgdWludDE2X3QgbWFpbl9pbWdfY2hyb21hX3dpZHRoOworICB1aW50MTZfdCBtYWluX2ltZ19jaHJvbWFfaGVpZ2h0OworICBpbnQgcm90YXRpb247CisgIGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QgZGlzcGxheV9mcmFtZV9vZmZzZXQ7CisgIGNhbV9mcmFtZV9sZW5fb2Zmc2V0X3QgdmlkZW9fZnJhbWVfb2Zmc2V0OworICBjYW1fZnJhbWVfbGVuX29mZnNldF90IHBpY3R1cmVfZnJhbWVfb2Zmc2V0OworICBjYW1fZnJhbWVfbGVuX29mZnNldF90IHRodW1iX2ZyYW1lX29mZnNldDsKKyAgdWludDMyX3QgY2hhbm5lbF9pbnRlcmZhY2VfbWFzazsKK30gY2FtX2N0cmxfZGltZW5zaW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDE2X3QgdHlwZTsKKyAgdWludDE2X3Qgd2lkdGg7CisgIHVpbnQxNl90IGhlaWdodDsKK30gY2FtX3N0YXRzX2J1Zl9kaW1lbnNpb25fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90IGNpZDsKKyAgdWludDhfdCBkdDsKKyAgdWludDMyX3QgaW5zdF9oYW5kbGU7Cit9IGNhbV9jaWRfZW50cnlfdDsKKworI2RlZmluZSBDQU1fTUFYX0NJRF9OVU0gICAgOAordHlwZWRlZiBzdHJ1Y3QgeworICAvKnNob3VsZCB3ZSBoYXJkIGNvZGUgbWF4IENJRHM/IGlmIG5vdCB3ZSBuZWVkIHRvIGhhdmUgdHdvIENNRCovCisgIHVpbnQ4X3QgbnVtX2NpZHM7CisgIGNhbV9jaWRfZW50cnlfdCBjaWRfZW50cmllc1tDQU1fTUFYX0NJRF9OVU1dOworfSBjYW1fY2lkX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKiB3ZSBzdGlsbCB1c2UgcHJldiwgdmlkZW8sIG1haW4sCisgICAqIHRodW1iIHRvIGludGVycHJldGUgaW1hZ2UgdHlwZXMgKi8KKyAgdWludDMyX3QgaW1hZ2VfbW9kZTsgICAgICAgICAgICAgICAgIC8qIGlucHV0ICovCisgIGNhbV9mb3JtYXRfdCBmb3JtYXQ7ICAgICAgICAgICAgICAgICAvKiBpbnB1dCAqLworICBjYW1fcGFkX2Zvcm1hdF90IHBhZGRpbmdfZm9ybWF0OyAgICAgLyogaW5wdXQgKi8KKyAgaW50IHJvdGF0aW9uOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0ICovCisgIHVpbnQxNl90IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgKi8KKyAgdWludDE2X3QgaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCAqLworICBjYW1fZnJhbWVfbGVuX29mZnNldF90IGZyYW1lX29mZnNldDsgLyogb3V0cHV0ICovCit9IGNhbV9mcmFtZV9yZXNvbHV0aW9uX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgaW5zdGFuY2VfaGRsOyAvKiBpbnN0YW5jZSBoYW5kbGVyIG9mIHRoZSBzdHJlYW0gKi8KKyAgdWludDMyX3QgZnJhbWVfaWR4OyAgICAvKiBmcmFtZSBpbmRleCAqLworICB1aW50MTZfdCBmcmFtZV93aWR0aDsKKyAgdWludDE2X3QgZnJhbWVfaGVpZ2h0OworICBjYW1fZnJhbWVfbGVuX29mZnNldF90IGZyYW1lX29mZnNldDsKK30gbW1fY2FtZXJhX3ducl9mcmFtZV9pbmZvX3Q7CisKKyNkZWZpbmUgTU1fQ0FNRUFSX01BWF9TVFJBRU1fQlVORExFIDQKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90IG51bV9mcmFtZXM7CisgICAgbW1fY2FtZXJhX3ducl9mcmFtZV9pbmZvX3QgZnJhbWVzW01NX0NBTUVBUl9NQVhfU1RSQUVNX0JVTkRMRV07Cit9IG1tX2NhbWVyYV93bnJfaW5mb190OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgbnVtOworICB1aW50MzJfdCBzdHJlYW1faGFuZGxlc1tNTV9DQU1FQVJfTUFYX1NUUkFFTV9CVU5ETEVdOyAvKiBpbnN0YW5jZSBoYW5kbGVyICovCit9IGNhbV9zdHJlYW1fYnVuZGxlX3Q7CisKKy8qIEFkZCBlbnVtZW5yYXRpb25zIGF0IHRoZSBib3R0b20gYnV0IGJlZm9yZSBNTV9DQU1FUkFfUEFSTV9NQVggKi8KK3R5cGVkZWYgZW51bSB7CisgICAgTU1fQ0FNRVJBX1BBUk1fUElDVF9TSVpFLAorICAgIE1NX0NBTUVSQV9QQVJNX1pPT01fUkFUSU8sCisgICAgTU1fQ0FNRVJBX1BBUk1fSElTVE9HUkFNLAorICAgIE1NX0NBTUVSQV9QQVJNX0RJTUVOU0lPTiwKKyAgICBNTV9DQU1FUkFfUEFSTV9GUFMsCisgICAgTU1fQ0FNRVJBX1BBUk1fRlBTX01PREUsIC8qNSovCisgICAgTU1fQ0FNRVJBX1BBUk1fRUZGRUNULAorICAgIE1NX0NBTUVSQV9QQVJNX0VYUE9TVVJFX0NPTVBFTlNBVElPTiwKKyAgICBNTV9DQU1FUkFfUEFSTV9FWFBPU1VSRSwKKyAgICBNTV9DQU1FUkFfUEFSTV9TSEFSUE5FU1MsCisgICAgTU1fQ0FNRVJBX1BBUk1fQ09OVFJBU1QsIC8qMTAqLworICAgIE1NX0NBTUVSQV9QQVJNX1NBVFVSQVRJT04sCisgICAgTU1fQ0FNRVJBX1BBUk1fQlJJR0hUTkVTUywKKyAgICBNTV9DQU1FUkFfUEFSTV9XSElURV9CQUxBTkNFLAorICAgIE1NX0NBTUVSQV9QQVJNX0xFRF9NT0RFLAorICAgIE1NX0NBTUVSQV9QQVJNX0FOVElCQU5ESU5HLCAvKjE1Ki8KKyAgICBNTV9DQU1FUkFfUEFSTV9ST0xMT0ZGLAorICAgIE1NX0NBTUVSQV9QQVJNX0NPTlRJTlVPVVNfQUYsCisgICAgTU1fQ0FNRVJBX1BBUk1fRk9DVVNfUkVDVCwKKyAgICBNTV9DQU1FUkFfUEFSTV9BRUNfUk9JLAorICAgIE1NX0NBTUVSQV9QQVJNX0FGX1JPSSwgLyoyMCovCisgICAgTU1fQ0FNRVJBX1BBUk1fSEpSLAorICAgIE1NX0NBTUVSQV9QQVJNX0lTTywKKyAgICBNTV9DQU1FUkFfUEFSTV9CTF9ERVRFQ1RJT04sCisgICAgTU1fQ0FNRVJBX1BBUk1fU05PV19ERVRFQ1RJT04sCisgICAgTU1fQ0FNRVJBX1BBUk1fQkVTVFNIT1RfTU9ERSwgLyoyNSovCisgICAgTU1fQ0FNRVJBX1BBUk1fWk9PTSwKKyAgICBNTV9DQU1FUkFfUEFSTV9WSURFT19ESVMsCisgICAgTU1fQ0FNRVJBX1BBUk1fVklERU9fUk9ULAorICAgIE1NX0NBTUVSQV9QQVJNX1NDRV9GQUNUT1IsCisgICAgTU1fQ0FNRVJBX1BBUk1fRkQsIC8qMzAqLworICAgIE1NX0NBTUVSQV9QQVJNX01PREUsCisgICAgLyogMm5kIDMyIGJpdHMgKi8KKyAgICBNTV9DQU1FUkFfUEFSTV8zRF9GUkFNRV9GT1JNQVQsCisgICAgTU1fQ0FNRVJBX1BBUk1fQ0FNRVJBX0lELAorICAgIE1NX0NBTUVSQV9QQVJNX0NBTUVSQV9JTkZPLAorICAgIE1NX0NBTUVSQV9QQVJNX1BSRVZJRVdfU0laRSwgLyozNSovCisgICAgTU1fQ0FNRVJBX1BBUk1fUVVFUllfRkFMU0g0U05BUCwKKyAgICBNTV9DQU1FUkFfUEFSTV9GT0NVU19ESVNUQU5DRVMsCisgICAgTU1fQ0FNRVJBX1BBUk1fQlVGRkVSX0lORk8sCisgICAgTU1fQ0FNRVJBX1BBUk1fSlBFR19ST1RBVElPTiwKKyAgICBNTV9DQU1FUkFfUEFSTV9KUEVHX01BSU5JTUdfUVVBTElUWSwgLyogNDAgKi8KKyAgICBNTV9DQU1FUkFfUEFSTV9KUEVHX1RIVU1CX1FVQUxJVFksCisgICAgTU1fQ0FNRVJBX1BBUk1fWlNMX0VOQUJMRSwKKyAgICBNTV9DQU1FUkFfUEFSTV9GT0NBTF9MRU5HVEgsCisgICAgTU1fQ0FNRVJBX1BBUk1fSE9SSVpPTlRBTF9WSUVXX0FOR0xFLAorICAgIE1NX0NBTUVSQV9QQVJNX1ZFUlRJQ0FMX1ZJRVdfQU5HTEUsIC8qIDQ1ICovCisgICAgTU1fQ0FNRVJBX1BBUk1fTUNFLAorICAgIE1NX0NBTUVSQV9QQVJNX1JFU0VUX0xFTlNfVE9fSU5GSU5JVFksCisgICAgTU1fQ0FNRVJBX1BBUk1fU05BUFNIT1REQVRBLAorICAgIE1NX0NBTUVSQV9QQVJNX0hGUiwKKyAgICBNTV9DQU1FUkFfUEFSTV9SRURFWUVfUkVEVUNUSU9OLCAvKiA1MCAqLworICAgIE1NX0NBTUVSQV9QQVJNX1dBVkVMRVRfREVOT0lTRSwKKyAgICBNTV9DQU1FUkFfUEFSTV8zRF9ESVNQTEFZX0RJU1RBTkNFLAorICAgIE1NX0NBTUVSQV9QQVJNXzNEX1ZJRVdfQU5HTEUsCisgICAgTU1fQ0FNRVJBX1BBUk1fUFJFVklFV19GT1JNQVQsCisgICAgTU1fQ0FNRVJBX1BBUk1fUkRJX0ZPUk1BVCwKKyAgICBNTV9DQU1FUkFfUEFSTV9IRlJfU0laRSwgLyogNTUgKi8KKyAgICBNTV9DQU1FUkFfUEFSTV8zRF9FRkZFQ1QsCisgICAgTU1fQ0FNRVJBX1BBUk1fM0RfTUFOVUFMX0NPTlZfUkFOR0UsCisgICAgTU1fQ0FNRVJBX1BBUk1fM0RfTUFOVUFMX0NPTlZfVkFMVUUsCisgICAgTU1fQ0FNRVJBX1BBUk1fRU5BQkxFXzNEX01BTlVBTF9DT05WRVJHRU5DRSwKKyAgICAvKiBUaGVzZSBhcmUgbmV3IHBhcmFtZXRlcnMgZGVmaW5lZCBoZXJlICovCisgICAgTU1fQ0FNRVJBX1BBUk1fQ0hfSU1BR0VfRk1ULCAvKiA2MCAqLyAgICAgICAvLyBtbV9jYW1lcmFfY2hfaW1hZ2VfZm10X3Bhcm1fdAorICAgIE1NX0NBTUVSQV9QQVJNX09QX01PREUsICAgICAgICAgICAgIC8vIGNhbWVyYSBzdGF0ZSwgc3ViIHN0YXRlIGFsc28KKyAgICBNTV9DQU1FUkFfUEFSTV9TSEFSUE5FU1NfQ0FQLCAgICAgICAvLworICAgIE1NX0NBTUVSQV9QQVJNX1NOQVBTSE9UX0JVUlNUX05VTSwgIC8vIG51bSBzaG90cyBwZXIgc25hcHNob3QgYWN0aW9uCisgICAgTU1fQ0FNRVJBX1BBUk1fTElWRVNIT1RfTUFJTiwgICAgICAgLy8gZW5hYmxlL2Rpc2FibGUgZnVsbCBzaXplIGxpdmUgc2hvdAorICAgIE1NX0NBTUVSQV9QQVJNX01BWFpPT00sIC8qIDY1ICovCisgICAgTU1fQ0FNRVJBX1BBUk1fTFVNQV9BREFQVEFUSU9OLCAgICAgLy8gZW5hYmxlL2Rpc2FibGUKKyAgICBNTV9DQU1FUkFfUEFSTV9IRFIsCisgICAgTU1fQ0FNRVJBX1BBUk1fQ1JPUCwKKyAgICBNTV9DQU1FUkFfUEFSTV9NQVhfUElDVFVSRV9TSVpFLAorICAgIE1NX0NBTUVSQV9QQVJNX01BWF9QUkVWSUVXX1NJWkUsIC8qIDcwICovCisgICAgTU1fQ0FNRVJBX1BBUk1fQVNEX0VOQUJMRSwKKyAgICBNTV9DQU1FUkFfUEFSTV9SRUNPUkRJTkdfSElOVCwKKyAgICBNTV9DQU1FUkFfUEFSTV9DQUZfRU5BQkxFLAorICAgIE1NX0NBTUVSQV9QQVJNX0ZVTExfTElWRVNIT1QsCisgICAgTU1fQ0FNRVJBX1BBUk1fRElTX0VOQUJMRSwgLyogNzUgKi8KKyAgICBNTV9DQU1FUkFfUEFSTV9BRUNfTE9DSywKKyAgICBNTV9DQU1FUkFfUEFSTV9BV0JfTE9DSywKKyAgICBNTV9DQU1FUkFfUEFSTV9BRl9NVFJfQVJFQSwKKyAgICBNTV9DQU1FUkFfUEFSTV9BRUNfTVRSX0FSRUEsCisgICAgTU1fQ0FNRVJBX1BBUk1fTE9XX1BPV0VSX01PREUsCisgICAgTU1fQ0FNRVJBX1BBUk1fTUFYX0hGUl9NT0RFLCAvKiA4MCAqLworICAgIE1NX0NBTUVSQV9QQVJNX01BWF9WSURFT19TSVpFLAorICAgIE1NX0NBTUVSQV9QQVJNX0RFRl9QUkVWSUVXX1NJWkVTLAorICAgIE1NX0NBTUVSQV9QQVJNX0RFRl9WSURFT19TSVpFUywKKyAgICBNTV9DQU1FUkFfUEFSTV9ERUZfVEhVTUJfU0laRVMsCisgICAgTU1fQ0FNRVJBX1BBUk1fREVGX0hGUl9TSVpFUywKKyAgICBNTV9DQU1FUkFfUEFSTV9QUkVWSUVXX1NJWkVTX0NOVCwKKyAgICBNTV9DQU1FUkFfUEFSTV9WSURFT19TSVpFU19DTlQsCisgICAgTU1fQ0FNRVJBX1BBUk1fVEhVTUJfU0laRVNfQ05ULAorICAgIE1NX0NBTUVSQV9QQVJNX0hGUl9TSVpFU19DTlQsCisgICAgTU1fQ0FNRVJBX1BBUk1fR1JBTExPQ19VU0FHRSwKKyAgICBNTV9DQU1FUkFfUEFSTV9WRkVfT1VUUFVUX0VOQUJMRSwgLy90byBjaGVjayB3aGV0aGVyIGJvdGggb3B1dHB1dHMgYXJlCisgICAgTU1fQ0FNRVJBX1BBUk1fREVGQVVMVF9QUkVWSUVXX1dJRFRILAorICAgIE1NX0NBTUVSQV9QQVJNX0RFRkFVTFRfUFJFVklFV19IRUlHSFQsCisgICAgTU1fQ0FNRVJBX1BBUk1fRk9DVVNfTU9ERSwKKyAgICBNTV9DQU1FUkFfUEFSTV9IRlJfRlJBTUVfU0tJUCwKKyAgICBNTV9DQU1FUkFfUEFSTV9DSF9JTlRFUkZBQ0UsCisgICAgLy9vciBzaW5nbGUgb3V0cHV0IGVuYWJsZWQgdG8gZGlmZmVyZW50aWF0ZSA3eDI3YSB3aXRoIG90aGVycworICAgIE1NX0NBTUVSQV9QQVJNX0JFU1RTSE9UX1JFQ09ORklHVVJFLAorICAgIE1NX0NBTUVSQV9QQVJNX01BWF9OVU1fRkFDRVNfREVDVCwKKyAgICBNTV9DQU1FUkFfUEFSTV9GUFNfUkFOR0UsCisgICAgTU1fQ0FNRVJBX1BBUk1fQ0lELAorICAgIE1NX0NBTUVSQV9QQVJNX0ZSQU1FX1JFU09MVVRJT04sCisgICAgTU1fQ0FNRVJBX1BBUk1fUkFXX1NOQVBTSE9UX0ZNVCwKKyAgICBNTV9DQU1FUkFfUEFSTV9GQUNJQUxfRkVBVFVSRV9JTkZPLAorICAgIE1NX0NBTUVSQV9QQVJNX01PQklDQVQsCisgICAgTU1fQ0FNRVJBX1BBUk1fTUFYCit9IG1tX2NhbWVyYV9wYXJtX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgU1RSRUFNX05PTkUgICAgICAgICAgID0gIDB4MCwKKyAgU1RSRUFNX0lNQUdFICAgICAgICAgID0gIDB4MSwKKyAgU1RSRUFNX1JBVyAgICAgICAgICAgID0gIDB4MiwKKyAgU1RSRUFNX1JBVzEgICAgICAgICAgID0gIDB4NCwKKyAgU1RSRUFNX1JBVzIgICAgICAgICAgID0gIDB4OCwKK30gbW1fY2FtZXJhX2NoYW5uZWxfc3RyZWFtX2luZm9fdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgQ0FNRVJBX1NFVF9QQVJNX0RJU1BMQVlfSU5GTywKKyAgQ0FNRVJBX1NFVF9QQVJNX0RJTUVOU0lPTiwKKworICBDQU1FUkFfU0VUX1BBUk1fWk9PTSwKKyAgQ0FNRVJBX1NFVF9QQVJNX1NFTlNPUl9QT1NJVElPTiwKKyAgQ0FNRVJBX1NFVF9QQVJNX0ZPQ1VTX1JFQ1QsCisgIENBTUVSQV9TRVRfUEFSTV9MVU1BX0FEQVBUQVRJT04sCisgIENBTUVSQV9TRVRfUEFSTV9DT05UUkFTVCwKKyAgQ0FNRVJBX1NFVF9QQVJNX0JSSUdIVE5FU1MsCisgIENBTUVSQV9TRVRfUEFSTV9FWFBPU1VSRV9DT01QRU5TQVRJT04sCisgIENBTUVSQV9TRVRfUEFSTV9TSEFSUE5FU1MsCisgIENBTUVSQV9TRVRfUEFSTV9IVUUsICAvKiAxMCAqLworICBDQU1FUkFfU0VUX1BBUk1fU0FUVVJBVElPTiwKKyAgQ0FNRVJBX1NFVF9QQVJNX0VYUE9TVVJFLAorICBDQU1FUkFfU0VUX1BBUk1fQVVUT19GT0NVUywKKyAgQ0FNRVJBX1NFVF9QQVJNX1dCLAorICBDQU1FUkFfU0VUX1BBUk1fRUZGRUNULAorICBDQU1FUkFfU0VUX1BBUk1fRlBTLAorICBDQU1FUkFfU0VUX1BBUk1fRkxBU0gsCisgIENBTUVSQV9TRVRfUEFSTV9OSUdIVFNIT1RfTU9ERSwKKyAgQ0FNRVJBX1NFVF9QQVJNX1JFRkxFQ1QsCisgIENBTUVSQV9TRVRfUEFSTV9QUkVWSUVXX01PREUsICAvKiAyMCAqLworICBDQU1FUkFfU0VUX1BBUk1fQU5USUJBTkRJTkcsCisgIENBTUVSQV9TRVRfUEFSTV9SRURfRVlFX1JFRFVDVElPTiwKKyAgQ0FNRVJBX1NFVF9QQVJNX0ZPQ1VTX1NURVAsCisgIENBTUVSQV9TRVRfUEFSTV9FWFBPU1VSRV9NRVRFUklORywKKyAgQ0FNRVJBX1NFVF9QQVJNX0FVVE9fRVhQT1NVUkVfTU9ERSwKKyAgQ0FNRVJBX1NFVF9QQVJNX0lTTywKKyAgQ0FNRVJBX1NFVF9QQVJNX0JFU1RTSE9UX01PREUsCisgIENBTUVSQV9TRVRfUEFSTV9FTkNPREVfUk9UQVRJT04sCisKKyAgQ0FNRVJBX1NFVF9QQVJNX1BSRVZJRVdfRlBTLAorICBDQU1FUkFfU0VUX1BBUk1fQUZfTU9ERSwgIC8qIDMwICovCisgIENBTUVSQV9TRVRfUEFSTV9ISVNUT0dSQU0sCisgIENBTUVSQV9TRVRfUEFSTV9GTEFTSF9TVEFURSwKKyAgQ0FNRVJBX1NFVF9QQVJNX0ZSQU1FX1RJTUVTVEFNUCwKKyAgQ0FNRVJBX1NFVF9QQVJNX1NUUk9CRV9GTEFTSCwKKyAgQ0FNRVJBX1NFVF9QQVJNX0ZQU19MSVNULAorICBDQU1FUkFfU0VUX1BBUk1fSEpSLAorICBDQU1FUkFfU0VUX1BBUk1fUk9MTE9GRiwKKworICBDQU1FUkFfU1RPUF9QUkVWSUVXLAorICBDQU1FUkFfU1RBUlRfUFJFVklFVywKKyAgQ0FNRVJBX1NUQVJUX1NOQVBTSE9ULCAvKiA0MCAqLworICBDQU1FUkFfU1RBUlRfUkFXX1NOQVBTSE9ULAorICBDQU1FUkFfU1RPUF9TTkFQU0hPVCwKKyAgQ0FNRVJBX0VYSVQsCisgIENBTUVSQV9FTkFCTEVfQlNNLAorICBDQU1FUkFfRElTQUJMRV9CU00sCisgIENBTUVSQV9HRVRfUEFSTV9aT09NLAorICBDQU1FUkFfR0VUX1BBUk1fTUFYWk9PTSwKKyAgQ0FNRVJBX0dFVF9QQVJNX1pPT01SQVRJT1MsCisgIENBTUVSQV9HRVRfUEFSTV9BRl9TSEFSUE5FU1MsCisgIENBTUVSQV9TRVRfUEFSTV9MRURfTU9ERSwgLyogNTAgKi8KKyAgQ0FNRVJBX1NFVF9NT1RJT05fSVNPLAorICBDQU1FUkFfQVVUT19GT0NVU19DQU5DRUwsCisgIENBTUVSQV9HRVRfUEFSTV9GT0NVU19TVEVQLAorICBDQU1FUkFfRU5BQkxFX0FGRCwKKyAgQ0FNRVJBX1BSRVBBUkVfU05BUFNIT1QsCisgIENBTUVSQV9TRVRfRlBTX01PREUsCisgIENBTUVSQV9TVEFSVF9WSURFTywKKyAgQ0FNRVJBX1NUT1BfVklERU8sCisgIENBTUVSQV9TVEFSVF9SRUNPUkRJTkcsCisgIENBTUVSQV9TVE9QX1JFQ09SRElORywgLyogNjAgKi8KKyAgQ0FNRVJBX1NFVF9WSURFT19ESVNfUEFSQU1TLAorICBDQU1FUkFfU0VUX1ZJREVPX1JPVF9QQVJBTVMsCisgIENBTUVSQV9TRVRfUEFSTV9BRUNfUk9JLAorICBDQU1FUkFfU0VUX0NBRiwKKyAgQ0FNRVJBX1NFVF9QQVJNX0JMX0RFVEVDVElPTl9FTkFCTEUsCisgIENBTUVSQV9TRVRfUEFSTV9TTk9XX0RFVEVDVElPTl9FTkFCTEUsCisgIENBTUVSQV9TRVRfUEFSTV9TVFJPQkVfRkxBU0hfTU9ERSwKKyAgQ0FNRVJBX1NFVF9QQVJNX0FGX1JPSSwKKyAgQ0FNRVJBX1NUQVJUX0xJVkVTSE9ULAorICBDQU1FUkFfU0VUX1NDRV9GQUNUT1IsIC8qIDcwICovCisgIENBTUVSQV9HRVRfQ0FQQUJJTElUSUVTLAorICBDQU1FUkFfR0VUX1BBUk1fRElNRU5TSU9OLAorICBDQU1FUkFfR0VUX1BBUk1fTEVEX01PREUsCisgIENBTUVSQV9TRVRfUEFSTV9GRCwKKyAgQ0FNRVJBX0dFVF9QQVJNXzNEX0ZSQU1FX0ZPUk1BVCwKKyAgQ0FNRVJBX1FVRVJZX0ZMQVNIX0ZPUl9TTkFQU0hPVCwKKyAgQ0FNRVJBX0dFVF9QQVJNX0ZPQ1VTX0RJU1RBTkNFUywKKyAgQ0FNRVJBX1NUQVJUX1pTTCwKKyAgQ0FNRVJBX1NUT1BfWlNMLAorICBDQU1FUkFfRU5BQkxFX1pTTCwgLyogODAgKi8KKyAgQ0FNRVJBX0dFVF9QQVJNX0ZPQ0FMX0xFTkdUSCwKKyAgQ0FNRVJBX0dFVF9QQVJNX0hPUklaT05UQUxfVklFV19BTkdMRSwKKyAgQ0FNRVJBX0dFVF9QQVJNX1ZFUlRJQ0FMX1ZJRVdfQU5HTEUsCisgIENBTUVSQV9TRVRfUEFSTV9XQVZFTEVUX0RFTk9JU0UsCisgIENBTUVSQV9TRVRfUEFSTV9NQ0UsCisgIENBTUVSQV9FTkFCTEVfU1RFUkVPX0NBTSwKKyAgQ0FNRVJBX1NFVF9QQVJNX1JFU0VUX0xFTlNfVE9fSU5GSU5JVFksCisgIENBTUVSQV9HRVRfUEFSTV9TTkFQU0hPVERBVEEsCisgIENBTUVSQV9TRVRfUEFSTV9IRlIsCisgIENBTUVSQV9TRVRfUkVERVlFX1JFRFVDVElPTiwgLyogOTAgKi8KKyAgQ0FNRVJBX1NFVF9QQVJNXzNEX0RJU1BMQVlfRElTVEFOQ0UsCisgIENBTUVSQV9TRVRfUEFSTV8zRF9WSUVXX0FOR0xFLAorICBDQU1FUkFfU0VUX1BBUk1fM0RfRUZGRUNULAorICBDQU1FUkFfU0VUX1BBUk1fUFJFVklFV19GT1JNQVQsCisgIENBTUVSQV9HRVRfUEFSTV8zRF9ESVNQTEFZX0RJU1RBTkNFLCAvKiA5NSAqLworICBDQU1FUkFfR0VUX1BBUk1fM0RfVklFV19BTkdMRSwKKyAgQ0FNRVJBX0dFVF9QQVJNXzNEX0VGRkVDVCwKKyAgQ0FNRVJBX0dFVF9QQVJNXzNEX01BTlVBTF9DT05WX1JBTkdFLAorICBDQU1FUkFfU0VUX1BBUk1fM0RfTUFOVUFMX0NPTlZfVkFMVUUsCisgIENBTUVSQV9FTkFCTEVfM0RfTUFOVUFMX0NPTlZFUkdFTkNFLCAvKiAxMDAgKi8KKyAgQ0FNRVJBX1NFVF9QQVJNX0hEUiwKKyAgQ0FNRVJBX1NFVF9BU0RfRU5BQkxFLAorICBDQU1FUkFfUE9TVFBST0NfQUJPUlQsCisgIENBTUVSQV9TRVRfQUVDX01UUl9BUkVBLAorICBDQU1FUkFfU0VUX0FFQ19MT0NLLCAgICAgICAvKjEwNSovCisgIENBTUVSQV9TRVRfQVdCX0xPQ0ssCisgIENBTUVSQV9TRVRfUkVDT1JESU5HX0hJTlQsCisgIENBTUVSQV9TRVRfUEFSTV9DQUYsCisgIENBTUVSQV9TRVRfRlVMTF9MSVZFU0hPVCwKKyAgQ0FNRVJBX1NFVF9ESVNfRU5BQkxFLCAgLyoxMTAqLworICBDQU1FUkFfR0VUX1BBUk1fTUFYX0hGUl9NT0RFLAorICBDQU1FUkFfU0VUX0xPV19QT1dFUl9NT0RFLAorICBDQU1FUkFfR0VUX1BBUk1fREVGX1BSRVZJRVdfU0laRVMsCisgIENBTUVSQV9HRVRfUEFSTV9ERUZfVklERU9fU0laRVMsCisgIENBTUVSQV9HRVRfUEFSTV9ERUZfVEhVTUJfU0laRVMsIC8qMTE1Ki8KKyAgQ0FNRVJBX0dFVF9QQVJNX0RFRl9IRlJfU0laRVMsCisgIENBTUVSQV9HRVRfUEFSTV9NQVhfTElWRVNIT1RfU0laRSwKKyAgQ0FNRVJBX0dFVF9QQVJNX0ZQU19SQU5HRSwKKyAgQ0FNRVJBX1NFVF8zQV9DT05WRVJHRU5DRSwKKyAgQ0FNRVJBX1NFVF9QUkVWSUVXX0hGUiwgLyoxMjAqLworICBDQU1FUkFfR0VUX01BWF9ESU1FTlNJT04sCisgIENBTUVSQV9HRVRfTUFYX05VTV9GQUNFU19ERUNULAorICBDQU1FUkFfU0VUX0NIQU5ORUxfU1RSRUFNLAorICBDQU1FUkFfR0VUX0NIQU5ORUxfU1RSRUFNLAorICBDQU1FUkFfU0VUX1BBUk1fQ0lELCAvKjEyNSovCisgIENBTUVSQV9HRVRfUEFSTV9GUkFNRV9SRVNPTFVUSU9OLAorICBDQU1FUkFfR0VUX0ZBQ0lBTF9GRUFUVVJFX0lORk8sCisgIENBTUVSQV9HRVRfUFBfTUFTSywgLyogZ2V0IHBvc3QtcHJvY2Vzc2luZyBtYXNrICovCisgIENBTUVSQV9ET19QUF9XTlIsICAgLyogZG8gcG9zdC1wcm9jZXNzIFdOUiAqLworICBDQU1FUkFfR0VUX1BBUk1fSERSLAorICBDQU1FUkFfU0VORF9QUF9QSVBFTElORV9DTUQsIC8qIHNlbmQgb2ZmbGluZSBwcCBjbWQgKi8KKyAgQ0FNRVJBX1NFVF9CVU5ETEUsIC8qIHNldCBzdHJlYW0gYnVuZGxlICovCisgIENBTUVSQV9FTkFCTEVfTU9CSUNBVCwKKyAgQ0FNRVJBX0dFVF9QQVJNX01PQklDQVQsCisgIENBTUVSQV9DVFJMX1BBUk1fTUFYCit9IGNhbV9jdHJsX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgIENBTUVSQV9FUlJPUl9OT19NRU1PUlksCisgIENBTUVSQV9FUlJPUl9FRlNfRkFJTCwgICAgICAgICAgICAgICAgLyogTG93LWxldmVsIG9wZXJhdGlvbiBmYWlsZWQgKi8KKyAgQ0FNRVJBX0VSUk9SX0VGU19GSUxFX09QRU4sICAgICAgICAgICAvKiBGaWxlIGFscmVhZHkgb3BlbmVkICovCisgIENBTUVSQV9FUlJPUl9FRlNfRklMRV9OT1RfT1BFTiwgICAgICAgLyogRmlsZSBub3Qgb3BlbmVkICovCisgIENBTUVSQV9FUlJPUl9FRlNfRklMRV9BTFJFQURZX0VYSVNUUywgLyogRmlsZSBhbHJlYWR5IGV4aXN0cyAqLworICBDQU1FUkFfRVJST1JfRUZTX05PTkVYSVNURU5UX0RJUiwgICAgIC8qIFVzZXIgZGlyZWN0b3J5IGRvZXNuJ3QgZXhpc3QgKi8KKyAgQ0FNRVJBX0VSUk9SX0VGU19OT05FWElTVEVOVF9GSUxFLCAgICAvKiBVc2VyIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0ICovCisgIENBTUVSQV9FUlJPUl9FRlNfQkFEX0ZJTEVfTkFNRSwgICAgICAgLyogQ2xpZW50IHNwZWNpZmllZCBpbnZhbGlkIGZpbGUvZGlyZWN0b3J5IG5hbWUqLworICBDQU1FUkFfRVJST1JfRUZTX0JBRF9GSUxFX0hBTkRMRSwgICAgIC8qIENsaWVudCBzcGVjaWZpZWQgaW52YWxpZCBmaWxlL2RpcmVjdG9yeSBuYW1lKi8KKyAgQ0FNRVJBX0VSUk9SX0VGU19TUEFDRV9FWEhBVVNURUQsICAgICAvKiBPdXQgb2YgZmlsZSBzeXN0ZW0gc3BhY2UgKi8KKyAgQ0FNRVJBX0VSUk9SX0VGU19PUEVOX1RBQkxFX0ZVTEwsICAgICAvKiBPdXQgb2Ygb3Blbi1maWxlIHRhYmxlIHNsb3RzICAgICAgICAgICAgICAgICovCisgIENBTUVSQV9FUlJPUl9FRlNfT1RIRVJfRVJST1IsICAgICAgICAgLyogT3RoZXIgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICBDQU1FUkFfRVJST1JfQ09ORklHLAorICBDQU1FUkFfRVJST1JfRVhJRl9FTkNPREUsCisgIENBTUVSQV9FUlJPUl9WSURFT19FTkdJTkUsCisgIENBTUVSQV9FUlJPUl9JUEwsCisgIENBTUVSQV9FUlJPUl9JTlZBTElEX0ZPUk1BVCwKKyAgQ0FNRVJBX0VSUk9SX1RJTUVPVVQsCisgIENBTUVSQV9FUlJPUl9FU0QsCisgIENBTUVSQV9FUlJPUl9NQVgKK30gY2FtZXJhX2Vycm9yX3R5cGU7CisKKyNpZiBkZWZpbmVkIENBTUVSQV9BTlRJQkFORElOR19PRkYKKyN1bmRlZiBDQU1FUkFfQU5USUJBTkRJTkdfT0ZGCisjZW5kaWYKKworI2lmIGRlZmluZWQgQ0FNRVJBX0FOVElCQU5ESU5HXzYwSFoKKyN1bmRlZiBDQU1FUkFfQU5USUJBTkRJTkdfNjBIWgorI2VuZGlmCisKKyNpZiBkZWZpbmVkIENBTUVSQV9BTlRJQkFORElOR181MEhaCisjdW5kZWYgQ0FNRVJBX0FOVElCQU5ESU5HXzUwSFoKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBDQU1FUkFfQU5USUJBTkRJTkdfQVVUTworI3VuZGVmIENBTUVSQV9BTlRJQkFORElOR19BVVRPCisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKyAgQ0FNRVJBX1BQX01BU0tfVFlQRV9XTlIgPSAweDAxCit9IGNhbWVyYV9wcF9tYXNrX3R5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgIENBTUVSQV9BTlRJQkFORElOR19PRkYsCisgIENBTUVSQV9BTlRJQkFORElOR182MEhaLAorICBDQU1FUkFfQU5USUJBTkRJTkdfNTBIWiwKKyAgQ0FNRVJBX0FOVElCQU5ESU5HX0FVVE8sCisgIENBTUVSQV9BTlRJQkFORElOR19BVVRPXzUwSFosCisgIENBTUVSQV9BTlRJQkFORElOR19BVVRPXzYwSFosCisgIENBTUVSQV9NQVhfQU5USUJBTkRJTkcsCit9IGNhbWVyYV9hbnRpYmFuZGluZ190eXBlOworCisvKiBFbnVtIFR5cGUgZm9yIGRpZmZlcmVudCBJU08gTW9kZSBzdXBwb3J0ZWQgKi8KK3R5cGVkZWYgZW51bSB7CisgIENBTUVSQV9JU09fQVVUTyA9IDAsCisgIENBTUVSQV9JU09fREVCTFVSLAorICBDQU1FUkFfSVNPXzEwMCwKKyAgQ0FNRVJBX0lTT18yMDAsCisgIENBTUVSQV9JU09fNDAwLAorICBDQU1FUkFfSVNPXzgwMCwKKyAgQ0FNRVJBX0lTT18xNjAwLAorICBDQU1FUkFfSVNPX01BWAorfSBjYW1lcmFfaXNvX21vZGVfdHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgTU1fQ0FNRVJBX0ZBQ0lBTF9GRUFUVVJFX0ZELCAvLyBmYWNpYWwgZGV0ZWN0aW9uCisgIE1NX0NBTUVSQV9GQUNJQUxfRkVBVFVSRV9NQVgKK30gY2FtZXJhX2ZhY2lhbF9mZWF0dXJlczsKKwordHlwZWRlZiBlbnVtIHsKKyAgQUVDX1JPSV9PRkYsCisgIEFFQ19ST0lfT04KK30gYWVjX3JvaV9jdHJsX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgIEFFQ19ST0lfQllfSU5ERVgsCisgIEFFQ19ST0lfQllfQ09PUkRJTkFURSwKK30gYWVjX3JvaV90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgeDsKKyAgdWludDMyX3QgeTsKK30gY2FtX2Nvb3JkaW5hdGVfdHlwZV90OworCisvKgorICogRGVmaW5lIERSQVdfUkVDVEFOR0xFUyB0byBkcmF3IHJlY3RhbmdsZXMgb24gc2NyZWVuLiBKdXN0IGZvciB0ZXN0IHB1cnBvc2UuCisgKi8KKy8vI2RlZmluZSBEUkFXX1JFQ1RBTkdMRVMKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MTZfdCB4OworICB1aW50MTZfdCB5OworICB1aW50MTZfdCBkeDsKKyAgdWludDE2X3QgZHk7Cit9IHJvaV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGFlY19yb2lfY3RybF90IGFlY19yb2lfZW5hYmxlOworICBhZWNfcm9pX3R5cGVfdCBhZWNfcm9pX3R5cGU7CisgIHVuaW9uIHsKKyAgICBjYW1fY29vcmRpbmF0ZV90eXBlX3QgY29vcmRpbmF0ZTsKKyAgICB1aW50MzJfdCBhZWNfcm9pX2lkeDsKKyAgfSBhZWNfcm9pX3Bvc2l0aW9uOworfSBjYW1fc2V0X2FlY19yb2lfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBmcm1faWQ7CisgIHVpbnQ4X3QgbnVtX3JvaTsKKyAgcm9pX3Qgcm9pW01BWF9ST0ldOworICB1aW50OF90IGlzX211bHRpd2luZG93OworfSByb2lfaW5mb190OworCisvKiBFeGlmIFRhZyBEYXRhIFR5cGUgKi8KK3R5cGVkZWYgZW51bQoreworICAgIEVYSUZfQllURSAgICAgID0gMSwKKyAgICBFWElGX0FTQ0lJICAgICA9IDIsCisgICAgRVhJRl9TSE9SVCAgICAgPSAzLAorICAgIEVYSUZfTE9ORyAgICAgID0gNCwKKyAgICBFWElGX1JBVElPTkFMICA9IDUsCisgICAgRVhJRl9VTkRFRklORUQgPSA3LAorICAgIEVYSUZfU0xPTkcgICAgID0gOSwKKyAgICBFWElGX1NSQVRJT05BTCA9IDEwCit9IGV4aWZfdGFnX3R5cGVfdDsKKworCisvKiBFeGlmIFJhdGlvbmFsIERhdGEgVHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1aW50MzJfdCAgbnVtOyAgICAvLyBOdW1lcmF0b3IKKyAgICB1aW50MzJfdCAgZGVub207ICAvLyBEZW5vbWluYXRvcgorCit9IHJhdF90OworCisvKiBFeGlmIFNpZ25lZCBSYXRpb25hbCBEYXRhIFR5cGUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50MzJfdCAgbnVtOyAgICAvLyBOdW1lcmF0b3IKKyAgICBpbnQzMl90ICBkZW5vbTsgIC8vIERlbm9taW5hdG9yCisKK30gc3JhdF90OworCit0eXBlZGVmIHN0cnVjdAoreworICBleGlmX3RhZ190eXBlX3QgdHlwZTsKKyAgdWludDhfdCBjb3B5OworICB1aW50MzJfdCBjb3VudDsKKyAgdW5pb24KKyAgeworICAgIGNoYXIgICAgICAqX2FzY2lpOworICAgIHVpbnQ4X3QgICAqX2J5dGVzOworICAgIHVpbnQ4X3QgICAgX2J5dGU7CisgICAgdWludDE2X3QgICpfc2hvcnRzOworICAgIHVpbnQxNl90ICAgX3Nob3J0OworICAgIHVpbnQzMl90ICAqX2xvbmdzOworICAgIHVpbnQzMl90ICAgX2xvbmc7CisgICAgcmF0X3QgICAgICpfcmF0czsKKyAgICByYXRfdCAgICAgIF9yYXQ7CisgICAgdWludDhfdCAgICpfdW5kZWZpbmVkOworICAgIGludDMyX3QgICAqX3Nsb25nczsKKyAgICBpbnQzMl90ICAgIF9zbG9uZzsKKyAgICBzcmF0X3QgICAgKl9zcmF0czsKKyAgICBzcmF0X3QgICAgIF9zcmF0OworICB9IGRhdGE7Cit9IGV4aWZfdGFnX2VudHJ5X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MzJfdCAgICAgIHRhZ19pZDsKKyAgICBleGlmX3RhZ19lbnRyeV90ICB0YWdfZW50cnk7Cit9IGV4aWZfdGFnc19pbmZvX3Q7CisKKwordHlwZWRlZiBlbnVtIHsKKyBIRFJfQlJBQ0tFVElOR19PRkYsCisgSERSX01PREUsCisgRVhQX0JSQUNLRVRJTkdfTU9ERQorIH0gaGRyX21vZGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaGRyX21vZGUgbW9kZTsKKyAgdWludDMyX3QgaGRyX2VuYWJsZTsKKyAgdWludDMyX3QgdG90YWxfZnJhbWVzOworICB1aW50MzJfdCB0b3RhbF9oYWxfZnJhbWVzOworICBjaGFyIHZhbHVlc1tNQVhfRVhQX0JSQUNLRVRJTkdfTEVOR1RIXTsgIC8qIHVzZXIgZGVmaW5lZCB2YWx1ZXMgKi8KK30gZXhwX2JyYWNrZXRpbmdfdDsKK3R5cGVkZWYgc3RydWN0IHsKKyAgcm9pX3QgICAgICBtdHJfYXJlYVtNQVhfUk9JXTsKKyAgdWludDMyX3QgICBudW1fYXJlYTsKKyAgaW50ICAgICAgICB3ZWlnaHRbTUFYX1JPSV07Cit9IGFlY19tdHJfYXJlYV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBkZW5vaXNlX2VuYWJsZTsKKyAgaW50IHByb2Nlc3NfcGxhdGVzOworfSBkZW5vaXNlX3BhcmFtX3Q7CisKKyNpZm5kZWYgSEFWRV9DQU1FUkFfU0laRV9UWVBFCisgICNkZWZpbmUgSEFWRV9DQU1FUkFfU0laRV9UWVBFCitzdHJ1Y3QgY2FtZXJhX3NpemVfdHlwZSB7CisgIGludCB3aWR0aDsKKyAgaW50IGhlaWdodDsKK307CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCB5b2Zmc2V0OworICB1aW50MzJfdCBjYmNyX29mZnNldDsKKyAgdWludDMyX3Qgc2l6ZTsKKyAgc3RydWN0IGNhbWVyYV9zaXplX3R5cGUgcmVzb2x1dGlvbjsKK31jYW1fYnVmX2luZm9fdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgeDsKKyAgaW50IHk7Cit9Y2FtX3BvaW50X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLyogQUYgcGFyYW1ldGVycyAqLworICB1aW50OF90IGZvY3VzX3Bvc2l0aW9uOworICAvKiBBRUMgcGFyYW1ldGVycyAqLworICB1aW50MzJfdCBsaW5lX2NvdW50OworICB1aW50OF90IGx1bWFfdGFyZ2V0OworICAvKiBBV0IgcGFyYW1ldGVycyAqLworICBpbnQzMl90IHJfZ2FpbjsKKyAgaW50MzJfdCBiX2dhaW47CisgIGludDMyX3QgZ19nYWluOworICB1aW50OF90IGV4cG9zdXJlX21vZGU7CisgIHVpbnQ4X3QgZXhwb3N1cmVfcHJvZ3JhbTsKKyAgZmxvYXQgZXhwb3N1cmVfdGltZTsKKyAgdWludDMyX3QgaXNvX3NwZWVkOworfSBzbmFwc2hvdERhdGFfaW5mb190OworCisKK3R5cGVkZWYgZW51bSB7CisgIENBTUVSQV9IRlJfTU9ERV9PRkYgPSAxLAorICBDQU1FUkFfSEZSX01PREVfNjBGUFMsCisgIENBTUVSQV9IRlJfTU9ERV85MEZQUywKKyAgQ0FNRVJBX0hGUl9NT0RFXzEyMEZQUywKKyAgQ0FNRVJBX0hGUl9NT0RFXzE1MEZQUywKK30gY2FtZXJhX2hmcl9tb2RlX3Q7CisKKy8qIGZyYW1lIFEqLworc3RydWN0IGZpZm9fbm9kZQoreworICBzdHJ1Y3QgZmlmb19ub2RlICpuZXh0OworICB2b2lkICpmOworfTsKKworc3RydWN0IGZpZm9fcXVldWUKK3sKKyAgaW50IG51bV9vZl9mcmFtZXM7CisgIHN0cnVjdCBmaWZvX25vZGUgKmZyb250OworICBzdHJ1Y3QgZmlmb19ub2RlICpiYWNrOworICBwdGhyZWFkX211dGV4X3QgbXV0OworICBwdGhyZWFkX2NvbmRfdCB3YWl0OworICBjaGFyKiBuYW1lOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBidWZfbGVuOworICB1aW50OF90IG51bTsKKyAgdWludDhfdCBwbWVtX3R5cGU7CisgIHVpbnQzMl90IHZhZGRyWzhdOworfSBtbV9jYW1lcmFfaGlzdG9fbWVtX2luZm9fdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgTU1fQ0FNRVJBX0NUUkxfRVZUX1pPT01fRE9ORSwKKyAgTU1fQ0FNRVJBX0NUUkxfRVZUX0FVVE9fRk9DVVNfRE9ORSwKKyAgTU1fQ0FNRVJBX0NUUkxfRVZUX1BSRVBfU05BUFNIT1QsCisgIE1NX0NBTUVSQV9DVFJMX0VWVF9TTkFQU0hPVF9DT05GSUdfRE9ORSwKKyAgTU1fQ0FNRVJBX0NUUkxfRVZUX1dETl9ET05FLCAvLyB3YXZlbGV0IGRlbm9pc2UgZG9uZQorICBNTV9DQU1FUkFfQ1RSTF9FVlRfSERSX0RPTkUsCisgIE1NX0NBTUVSQV9DVFJMX0VWVF9FUlJPUiwKKyAgTU1fQ0FNRVJBX0NUUkxfRVZUX01BWAorfW1tX2NhbWVyYV9jdHJsX2V2ZW50X3R5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBtbV9jYW1lcmFfY3RybF9ldmVudF90eXBlX3QgZXZ0OworICBjYW1fY3RybF9zdGF0dXNfdCBzdGF0dXM7CisgIHVuc2lnbmVkIGxvbmcgY29va2llOworfSBtbV9jYW1lcmFfY3RybF9ldmVudF90OworCit0eXBlZGVmIGVudW0geworICBNTV9DQU1FUkFfQ0hfRVZUX1NUUkVBTUlOR19PTiwKKyAgTU1fQ0FNRVJBX0NIX0VWVF9TVFJFQU1JTkdfT0ZGLAorICBNTV9DQU1FUkFfQ0hfRVZUX1NUUkVBTUlOR19FUlIsCisgIE1NX0NBTUVSQV9DSF9FVlRfREFUQV9ERUxJVkVSWV9ET05FLAorICBNTV9DQU1FUkFfQ0hfRVZUX0RBVEFfUkVRVUVTVF9NT1JFLAorICBNTV9DQU1FUkFfQ0hfRVZUX01BWAorfW1tX2NhbWVyYV9jaF9ldmVudF90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgY2g7CisgIG1tX2NhbWVyYV9jaF9ldmVudF90eXBlX3QgZXZ0OworfSBtbV9jYW1lcmFfY2hfZXZlbnRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCBpbmRleDsKKyAgLyogVEJEOiBuZWVkIG1vcmUgZmllbGRzIGZvciBoaXN0byBzdGF0cz8gKi8KK30gbW1fY2FtZXJhX3N0YXRzX2hpc3RvX3Q7CisKK3R5cGVkZWYgc3RydWN0ICB7CisgIHVpbnQzMl90IGV2ZW50X2lkOworICB1bmlvbiB7CisgICAgbW1fY2FtZXJhX3N0YXRzX2hpc3RvX3QgICAgc3RhdHNfaGlzdG87CisgIH0gZTsKK30gbW1fY2FtZXJhX3N0YXRzX2V2ZW50X3Q7CisKK3R5cGVkZWYgZW51bSB7CisgIEZEX1JPSV9UWVBFX0hFQURFUiwKKyAgRkRfUk9JX1RZUEVfREFUQQorfSBmZF9yb2lfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBmZF9tb2RlOworICBpbnQgbnVtX2ZkOworfSBmZF9zZXRfcGFybV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IGZyYW1lX2lkOworICBpbnQxNl90IG51bV9mYWNlX2RldGVjdGVkOworfSBmZF9yb2lfaGVhZGVyX3R5cGU7CisKK3N0cnVjdCBmZF9yZWN0X3QgeworICB1aW50MTZfdCB4OworICB1aW50MTZfdCB5OworICB1aW50MTZfdCBkeDsKKyAgdWludDE2X3QgZHk7Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHN0cnVjdCBmZF9yZWN0X3QgZmFjZV9ib3VuZGFyeTsKKyAgdWludDE2X3QgbGVmdF9leWVfY2VudGVyWzJdOworICB1aW50MTZfdCByaWdodF9leWVfY2VudGVyWzJdOworICB1aW50MTZfdCBtb3V0aF9jZW50ZXJbMl07CisgIHVpbnQ4X3Qgc21pbGVfZGVncmVlOyAgLy8wIC0xMDAKKyAgdWludDhfdCBzbWlsZV9jb25maWRlbmNlOyAgLy8KKyAgdWludDhfdCBibGlua19kZXRlY3RlZDsgIC8vIDAgb3IgMQorICB1aW50OF90IGlzX2ZhY2VfcmVjb2duaXNlZDsgIC8vIDAgb3IgMQorICBpbnQ4X3QgZ2F6ZV9hbmdsZTsgIC8vIC05MCAtNDUgMCA0NSA5MCBmb3IgaGVhZCBsZWZ0IHRvIHJpZ3RoIHRpbHQKKyAgaW50OF90IHVwZG93bl9kaXI7ICAvLyAtOTAgdG8gOTAKKyAgaW50OF90IGxlZnRyaWdodF9kaXI7ICAvLy05MCB0byA5MAorICBpbnQ4X3Qgcm9sbF9kaXI7ICAvLyAtOTAgdG8gOTAKKyAgaW50OF90IGxlZnRfcmlnaHRfZ2F6ZTsgIC8vIC01MCB0byA1MAorICBpbnQ4X3QgdG9wX2JvdHRvbV9nYXplOyAgLy8gLTUwIHRvIDUwCisgIHVpbnQ4X3QgbGVmdF9ibGluazsgIC8vIDAgLSAxMDAKKyAgdWludDhfdCByaWdodF9ibGluazsgIC8vIDAgLSAxMDAKKyAgaW50OF90IGlkOyAgLy8gdW5pcXVlIGlkIGZvciBmYWNlIHRyYWNraW5nIHdpdGhpbiB2aWV3IHVubGVzcyB2aWV3IGNoYW5nZXMKKyAgaW50OF90IHNjb3JlOyAgLy8gc2NvcmUgb2YgY29uZmlkZW5jZSggMCAtMTAwKQorfSBmZF9mYWNlX3R5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgZnJhbWVfaWQ7CisgIHVpbnQ4X3QgaWR4OworICBmZF9mYWNlX3R5cGUgZmFjZTsKK30gZmRfcm9pX2RhdGFfdHlwZTsKKworc3RydWN0IGZkX3JvaV90IHsKKyAgZmRfcm9pX3R5cGVfdCB0eXBlOworICB1bmlvbiB7CisgICAgZmRfcm9pX2hlYWRlcl90eXBlIGhkcjsKKyAgICBmZF9yb2lfZGF0YV90eXBlIGRhdGE7CisgIH0gZDsKK307CisKK3R5cGVkZWYgc3RydWN0ICB7CisgIHVpbnQzMl90IGV2ZW50X2lkOworICB1bmlvbiB7CisgICAgbW1fY2FtZXJhX2hpc3RvX21lbV9pbmZvX3QgaGlzdG9fbWVtX2luZm87CisgICAgc3RydWN0IGZkX3JvaV90IHJvaTsKKyAgfSBlOworfSBtbV9jYW1lcmFfaW5mb19ldmVudF90OworCit0eXBlZGVmIHN0cnVjdCAgeworICB1aW50MzJfdCB0cmFuc19pZDsgICAvKiB0cmFuc2FjdGlvbiBpZCAqLworICB1aW50MzJfdCBldnRfdHlwZTsgICAvKiBldmVudCB0eXBlICovCisgIGludDMyX3QgZGF0YV9sZW5ndGg7IC8qIHRoZSBsZW5ndGggb2YgdmFsaWQgZGF0YSAqLworICB1aW50OF90IGV2dF9kYXRhWzFdOyAvKiBidWZmZXIgdGhhdCBob2xkcyB0aGUgY29udGVudCBvZiBwcml2YXRlIGV2ZW50LCBtdXN0IGJlIGZsYXR0ZW4gKi8KK30gbW1fY2FtZXJhX3ByaXZhdGVfZXZlbnRfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgTU1fQ0FNRVJBX0VWVF9UWVBFX0NILAorICBNTV9DQU1FUkFfRVZUX1RZUEVfQ1RSTCwKKyAgTU1fQ0FNRVJBX0VWVF9UWVBFX1NUQVRTLAorICBNTV9DQU1FUkFfRVZUX1RZUEVfSU5GTywKKyAgTU1fQ0FNRVJBX0VWVF9UWVBFX1BSSVZBVEVfRVZULAorICBNTV9DQU1FUkFfRVZUX1RZUEVfTUFYCit9IG1tX2NhbWVyYV9ldmVudF90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgbW1fY2FtZXJhX2V2ZW50X3R5cGVfdCBldmVudF90eXBlOworICB1bmlvbiB7CisgICAgbW1fY2FtZXJhX2NoX2V2ZW50X3QgY2g7CisgICAgbW1fY2FtZXJhX2N0cmxfZXZlbnRfdCBjdHJsOworICAgIG1tX2NhbWVyYV9zdGF0c19ldmVudF90IHN0YXRzOworICAgIG1tX2NhbWVyYV9pbmZvX2V2ZW50X3QgaW5mbzsKKyAgICBtbV9jYW1lcmFfcHJpdmF0ZV9ldmVudF90IHByaV9ldnQ7CisgIH0gZTsKK30gbW1fY2FtZXJhX2V2ZW50X3Q7CisKK3R5cGVkZWYgZW51bSB7CisgIE1NX0NBTUVSQV9SRVBST19DTURfSU5WQUxJRCwKKyAgTU1fQ0FNRVJBX1JFUFJPX0NNRF9PUEVOLAorICBNTV9DQU1FUkFfUkVQUk9fQ01EX0NPTkZJRywKKyAgTU1fQ0FNRVJBX1JFUFJPX0NNRF9BVFRBQ0hfREVUQUNILAorICBNTV9DQU1FUkFfUkVQUk9fQ01EX1NUQVJUX1NUT1AsCisgIE1NX0NBTUVSQV9SRVBST19DTURfUkVQUk9DRVNTLAorICBNTV9DQU1FUkFfUkVQUk9fQ01EX0NMT1NFLAorICBNTV9DQU1FUkFfUkVQUk9fQ01EX01BWAorfSBtbWNhbV9yZXByb19jbWRfdHlwZV90OworCisvKiByZS1wcm9jZXNzIGlzcCB0eXBlIGRlZmludGlvbiAqLwordHlwZWRlZiBlbnVtIHsKKyAgTU1fQ0FNRVJBX1JFUFJPX0lTUF9OT1RfVVNFRCwKKyAgTU1fQ0FNRVJBX1JFUFJPX0lTUF9QSVgsCisgIE1NX0NBTUVSQV9SRVBST19JU1BfQ1JPUF9BTkRfU0NBTElORywKKyAgTU1fQ0FNRVJBX1JFUFJPX0lTUF9DT0xPUl9DT05WRVJTSU9OLAorICBNTV9DQU1FUkFfUkVQUk9fSVNQX0ROT0lTRV9BTkRfU0hBUlBORVNTLAorICBNTV9DQU1FUkFfUkVQUk9fSVNQX01BWF9OVU0KK30gbW1fY2FtZXJhX3JlcHJvX2lzcF90eXBlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgYWRkcl9vZmZzZXQ7CisgIHVpbnQzMl90IGxlbmd0aDsKKyAgdWludDMyX3QgZGF0YV9vZmZzZXQ7Cit9IG1tX2NhbWVyYV9yZXByb19wbGFuZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IHJlcHJvX2hhbmRsZTsgIC8qIHJlcG8gaXNwIGhhbmRsZSAqLworICB1aW50MzJfdCBpbnN0X2hhbmRsZTsgLyogaW5zdGFuY2UgaGFuZGxlICovCisgIGludDhfdCAgIGJ1Zl9pZHg7ICAgICAvKiBidWZmZXIgaW5kZXggICAgKi8KKyAgdWludDMyX3QgZnJhbWVfaWQ7ICAgIC8qIGZyYW1lIGlkICAgICAgICAqLworICB1aW50MzJfdCBmcmFtZV9sZW47ICAgLyogZnJhbWUgbGVuZ3RoICAgICovCisgIGludDhfdCAgIG51bV9wbGFuZXM7CisgIG1tX2NhbWVyYV9yZXByb19wbGFuZV90IHBsYW5lc1tWSURFT19NQVhfUExBTkVTXTsKKyAgc3RydWN0IHRpbWV2YWwgdGltZXN0YW1wOworfSBtbV9jYW1lcmFfcmVwcm9fY21kX3JlcHJvY2Vzc190OworCisjZGVmaW5lIE1NX0NBTUVSQV9NQVhfTlVNX1JFUFJPQ0VTU19ERVNUIDIKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90ICBpc3BfdHlwZTsgICAgICAvKiBpbjogbW1fY2FtZXJhX3JlcHJvX2lzcF90eXBlX3QgKi8KKyAgdWludDMyX3QgcmVwcm9faGFuZGxlOyAgLyogb3V0ICovCit9IG1tX2NhbWVyYV9yZXByb19jbWRfb3Blbl90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBpbWFnZV9tb2RlOworICBpbnQgd2lkdGg7CisgIGludCBoZWlnaHQ7CisgIGNhbV9mb3JtYXRfdCBmb3JtYXQ7CisgIHVpbnQzMl90IGluc3RfaGFuZGxlOyAvKiBzdHJlYW0gaGFuZGxlciAqLworfSBtbV9jYW1lcmFfcmVwcm9fY29uZmlnX2RhdGFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCByZXByb19oYW5kbGU7CisgIGludCBudW1fZGVzdDsKKyAgbW1fY2FtZXJhX3JlcHJvX2NvbmZpZ19kYXRhX3Qgc3JjOworICBtbV9jYW1lcmFfcmVwcm9fY29uZmlnX2RhdGFfdCBkZXN0W01NX0NBTUVSQV9NQVhfTlVNX1JFUFJPQ0VTU19ERVNUXTsKK30gbW1fY2FtZXJhX3JlcHJvX2NtZF9jb25maWdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCByZXByb19oYW5kbGU7ICAgLyogcmVwcm8gaXNwIGhhbmRsZSAqLworICB1aW50MzJfdCBpbnN0X2hhbmRsZTsgICAgLyogaW5zdGFuY2UgaGFuZGxlIG9mIGRlc3Qgc3RyZWFtICovCisgIHVpbnQ4X3QgIGF0dGFjaF9mbGFnOyAgICAvKiBmbGFnOiBhdHRhY2goVFJVRSkvZGV0YWNoKEZBTFNFKSAqLworfSBtbV9jYW1lcmFfcmVwcm9fY21kX2F0dGFjaF9kZXRhY2hfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCByZXByb19oYW5kbGU7ICAgLyogcmVwbyBpc3AgaGFuZGxlICovCisgIHVpbnQzMl90IGRlc3RfaGFuZGxlOyAgICAvKiBXaGljaCBkZXN0aW5hdGlvbiB0byBzdGFydC9zdG9wICovCisgIHVpbnQ4X3QgIHN0YXJ0X2ZsYWc7ICAgICAvKiBmbGFnOiBzdGFydCBpc3AoVFJVRSkvc3RvcCBpc3AoRkFMU0UpICovCit9IG1tX2NhbWVyYV9yZXByb19jbWRfc3RhcnRfc3RvcF90OworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8qIG1tX2NhbWVyYV9yZXByb19jbWRfdHlwZV90ICovCisgIGludCBjbWQ7CisgIC8qIFVuaW9uIG9mIHRoZSBwb3NzaWJsZSBwYXlsb2FkcyBmb3IKKyAgICogdGhpcyByZXByb2Nlc3MgY29tbWFuZC4gKi8KKyAgdW5pb24geworICAgIC8qIE1NX0NBTUVSQV9SRVBST19DTURfT1BFTiAqLworICAgIG1tX2NhbWVyYV9yZXByb19jbWRfb3Blbl90IG9wZW47CisgICAgLyogTU1fQ0FNRVJBX1JFUFJPX0NNRF9DT05GSUcgKi8KKyAgICBtbV9jYW1lcmFfcmVwcm9fY21kX2NvbmZpZ190IGNvbmZpZzsKKyAgICAvKiBNTV9DQU1FUkFfUkVQUk9fQ01EX0FUVEFDSF9ERVRBQ0ggKi8KKyAgICBtbV9jYW1lcmFfcmVwcm9fY21kX2F0dGFjaF9kZXRhY2hfdCBhdHRhY2hfZGV0YWNoOworICAgIC8qIE1NX0NBTUVSQV9SRVBST19DTURfUkVQUk9DRVNTICovCisgICAgbW1fY2FtZXJhX3JlcHJvX2NtZF9yZXByb2Nlc3NfdCByZXByb2Nlc3M7CisgICAgLyogTU1fQ0FNRVJBX1JFUFJPX0NNRF9TVEFSVF9TVE9QICovCisgICAgbW1fY2FtZXJhX3JlcHJvX2NtZF9zdGFydF9zdG9wX3Qgc3RhcnRfc3RvcDsKKyAgICAvKiBNTV9DQU1FUkFfUkVQUk9fQ01EX0NMT1NFICovCisgICAgdWludDMyX3QgcmVwcm9faGFuZGxlOworICB9IHBheWxvYWQ7Cit9IG1tX2NhbWVyYV9yZXByb19jbWRfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvKmlucHV0IHBhcmFtZXRlciovCisgIGludCBlbmFibGU7CisgIC8qb3V0cHV0IHBhcmFtZXRlciovCisgIHVpbnQzMl90IG1vYmljYXRfc2l6ZTsKK31tbV9jYW1fbW9iaWNhdF9pbmZvX3Q7CisKKyNkZWZpbmUgTUFYX01PQklDQVRfU0laRSA4MDkyCisKKy8qCisgIFdBUk5JTkc6IFNpbmNlIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgaHVnZSwKKyAgbmV2ZXIgdXNlIGl0IGFzIGxvY2FsIHZhcmlhYmxlLCBvdGhlcndpc2UsIGl0IHNvIGVhc3kgdG8gY2F1c2UKKyAgc3RhY2sgb3ZlcmZsb3cKKyAgQWx3YXlzIHVzZSBtYWxsb2MgdG8gYWxsb2NhdGUgaGVhcCBtZW1vcnkgZm9yIGl0CisqLwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgbWF4X2xlbjsgICAvL3RlbGxpbmcgdGhlIGNsaWVudCBtYXggc2l6ZW4gb2YgdGFncywgaGVyZSAxMGsuCisgIGludCBkYXRhX2xlbjsgIC8vY2xpZW50IHJldHVybiByZWFsIHNpemUgaW5jbHVkaW5nIG51bGwgIlwwIi4KKyAgY2hhciB0YWdzW01BWF9NT0JJQ0FUX1NJWkVdOworfSBjYW1fZXhpZl90YWdzX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiBleGlmX3NldF90YWcKKyAqIERlc2NyaXB0aW9uOiBJbnNlcnRzIG9yIG1vZGlmaWVzIGFuIEV4aWYgdGFnIHRvIHRoZSBFeGlmIEluZm8gb2JqZWN0LiBUeXBpY2FsCisgKiAgICAgICAgICAgICAgdXNlIGlzIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcyAtIHRvIGluc2VydCBhbGwgdGhlCisgKiAgICAgICAgICAgICAgZGVzaXJlZCBFeGlmIFRhZ3MgaW5kaXZpZHVhbGx5IHRvIHRoZSBFeGlmIEluZm8gb2JqZWN0IGFuZAorICogICAgICAgICAgICAgIHRoZW4gcGFzcyB0aGUgaW5mbyBvYmplY3QgdG8gdGhlIEpwZWcgRW5jb2RlciBvYmplY3Qgc28KKyAqICAgICAgICAgICAgICB0aGUgaW5zZXJ0ZWQgdGFncyB3b3VsZCBiZSBlbWl0dGVkIGFzIHRhZ3MgaW4gdGhlIEV4aWYgaGVhZGVyLgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICAgb2JqICAgICAgIC0gVGhlIEV4aWYgSW5mbyBvYmplY3Qgd2hlcmUgdGhlIHRhZyB3b3VsZCBiZSBpbnNlcnRlZCB0byBvcgorICogICAgICAgICAgICAgICBtb2RpZmllZCBmcm9tLgorICogICB0YWdfaWQgICAgLSBUaGUgRXhpZiBUYWcgSUQgb2YgdGhlIHRhZyB0byBiZSBpbnNlcnRlZC9tb2RpZmllZC4KKyAqICAgcF9lbnRyeSAgIC0gVGhlIHBvaW50ZXIgdG8gdGhlIHRhZyBlbnRyeSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgdGhlCisgKiAgICAgICAgICAgICAgIGRldGFpbHMgb2YgdGFnLiBUaGUgcG9pbnRlciBjYW4gYmUgc2V0IHRvIE5VTEwgdG8gdW4tZG8KKyAqICAgICAgICAgICAgICAgcHJldmlvdXMgaW5zZXJ0aW9uIGZvciBhIGNlcnRhaW4gdGFnLgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgICBKUEVHRVJSX1NVQ0NFU1MKKyAqICAgICBKUEVHRVJSX0VOVUxMUFRSCisgKiAgICAgSlBFR0VSUl9FRkFJTEVECisgKiAoU2VlIGpwZWdlcnIuaCBmb3IgZGVzY3JpcHRpb24gb2YgZXJyb3IgdmFsdWVzLikKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgZXhpZl9zZXRfdGFnKGV4aWZfaW5mb19vYmpfdCAgICBvYmosCisgICAgICAgICAgICAgICAgIGV4aWZfdGFnX2lkX3QgICAgICB0YWdfaWQsCisgICAgICAgICAgICAgICAgIGV4aWZfdGFnX2VudHJ5X3QgICpwX2VudHJ5KTsKKworCisjZW5kaWYgLyogX19RQ0FNRVJBX0lOVEZfSF9fICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvY29tbW9uLm1rIGIvbXNtY29iYWx0L2NvbW1vbi5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODcyNjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L2NvbW1vbi5tawpAQCAtMCwwICsxLDkgQEAKK2NvbW1vbl9kZXBzIDo9CitrZXJuZWxfaW5jbHVkZXMgOj0KKworaWZlcSAoJChjYWxsIGlzLXZlbmRvci1ib2FyZC1wbGF0Zm9ybSxRQ09NKSx0cnVlKQoraWZlcSAoJChUQVJHRVRfQ09NUElMRV9XSVRIX01TTV9LRVJORUwpLHRydWUpCisgICAgY29tbW9uX2RlcHMgKz0gJChUQVJHRVRfT1VUX0lOVEVSTUVESUFURVMpL0tFUk5FTF9PQkovdXNyCisgICAga2VybmVsX2luY2x1ZGVzICs9ICQoVEFSR0VUX09VVF9JTlRFUk1FRElBVEVTKS9LRVJORUxfT0JKL3Vzci9pbmNsdWRlCitlbmRpZgorZW5kaWYKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9tbS1pbWFnZS1jb2RlYy9BbmRyb2lkLm1rIGIvbXNtY29iYWx0L21tLWltYWdlLWNvZGVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliMTM0NgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9tbS1pbWFnZS1jb2RlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMyBAQAoraWZlcSAoJChUQVJHRVRfQVJDSCksJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksYXJtIGFybTY0KSkKK2luY2x1ZGUgJChjYWxsIGFsbC1zdWJkaXItbWFrZWZpbGVzKQorZW5kaWYKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9tbS1pbWFnZS1jb2RlYy9xZXhpZi9xZXhpZi5oIGIvbXNtY29iYWx0L21tLWltYWdlLWNvZGVjL3FleGlmL3FleGlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhZWRkZQotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9tbS1pbWFnZS1jb2RlYy9xZXhpZi9xZXhpZi5oCkBAIC0wLDAgKzEsMTcyOCBAQAorLypDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKK21ldDoKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKK1NVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuKi8KKworCisjaWZuZGVmIF9fUUVYSUZfSF9fCisjZGVmaW5lIF9fUUVYSUZfSF9fCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBFeGlmIEluZm8gKG9wYXF1ZSBkZWZpbml0aW9uKSAqLworc3RydWN0IGV4aWZfaW5mb190OwordHlwZWRlZiBzdHJ1Y3QgZXhpZl9pbmZvX3QgKiBleGlmX2luZm9fb2JqX3Q7CisKKy8qIEV4aWYgVGFnIElEICovCit0eXBlZGVmIHVpbnQzMl90IGV4aWZfdGFnX2lkX3Q7CisKKworLyogRXhpZiBSYXRpb25hbCBEYXRhIFR5cGUgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgIG51bTsgICAgLy8gTnVtZXJhdG9yCisgICAgdWludDMyX3QgIGRlbm9tOyAgLy8gRGVub21pbmF0b3IKKworfSByYXRfdDsKKworLyogRXhpZiBTaWduZWQgUmF0aW9uYWwgRGF0YSBUeXBlICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludDMyX3QgIG51bTsgICAgLy8gTnVtZXJhdG9yCisgICAgaW50MzJfdCAgZGVub207ICAvLyBEZW5vbWluYXRvcgorCit9IHNyYXRfdDsKKworLyogRXhpZiBUYWcgRGF0YSBUeXBlICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBFWElGX0JZVEUgICAgICA9IDEsCisgICAgRVhJRl9BU0NJSSAgICAgPSAyLAorICAgIEVYSUZfU0hPUlQgICAgID0gMywKKyAgICBFWElGX0xPTkcgICAgICA9IDQsCisgICAgRVhJRl9SQVRJT05BTCAgPSA1LAorICAgIEVYSUZfVU5ERUZJTkVEID0gNywKKyAgICBFWElGX1NMT05HICAgICA9IDksCisgICAgRVhJRl9TUkFUSU9OQUwgPSAxMAorfSBleGlmX3RhZ190eXBlX3Q7CisKKy8qIEV4aWYgVGFnIEVudHJ5CisgKiBVc2VkIGluIGV4aWZfc2V0X3RhZyBhcyBhbiBpbnB1dCBhcmd1bWVudCBhbmQKKyAqIGluIGV4aWZfZ2V0X3RhZyBhcyBhbiBvdXRwdXQgYXJndW1lbnQuICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIC8qIFRoZSBEYXRhIFR5cGUgb2YgdGhlIFRhZyAqCisgICAgICogUmF0aW9uYWwsIGV0YyAqLworICAgIGV4aWZfdGFnX3R5cGVfdCB0eXBlOworCisgICAgLyogQ29weQorICAgICAqIFRoaXMgZmllbGQgaXMgdXNlZCB3aGVuIGEgdXNlciBwYXNzIHRoaXMgc3RydWN0dXJlIHRvCisgICAgICogYmUgc3RvcmVkIGluIGFuIGV4aWZfaW5mb190IHZpYSB0aGUgZXhpZl9zZXRfdGFnIG1ldGhvZC4KKyAgICAgKiBUaGUgcm91dGluZSB3b3VsZCBsb29rIGxpa2UgdGhpcyBmaWVsZCBhbmQgZGVjaWRlIHdoZXRoZXIKKyAgICAgKiBpdCBpcyBuZWNlc3NhcnkgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGRhdGEgcG9pbnRlZCBieSB0aGlzCisgICAgICogc3RydWN0dXJlIChhbGwgc3RyaW5nIGFuZCBhcnJheSB0eXBlcykuCisgICAgICogSWYgdGhpcyBmaWVsZCBpcyBzZXQgdG8gZmFsc2UsIG9ubHkgYSBwb2ludGVyIHRvIHRoZSBhY3R1YWwKKyAgICAgKiBkYXRhIGlzIHJldGFpbmVkIGFuZCBpdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8KKyAgICAgKiBlbnN1cmUgdGhlIHZhbGlkaXR5IG9mIHRoZSBkYXRhIGJlZm9yZSB0aGUgZXhpZl9pbmZvX3Qgb2JqZWN0CisgICAgICogaXMgZGVzdHJveWVkLgorICAgICAqLworICAgIHVpbnQ4X3QgY29weTsKKworICAgIC8qIERhdGEgY291bnQKKyAgICAgKiBUaGlzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHRoZSBkYXRhLiBGb3IgZXhhbXBsZSwgaWYKKyAgICAgKiB0aGUgdHlwZSBpcyBFWElGX0JZVEUgYW5kIHRoZSBjb3VudCBpcyAxLCB0aGF0IG1lYW5zIHRoZSBhY3R1YWwgZGF0YQorICAgICAqIGlzIG9uZSBieXRlIGFuZCBpcyBhY2Nlc3NpYmxlIGJ5IGRhdGEuX2J5dGUuIElmIHRoZSB0eXBlIGlzIEVYSUZfQllURQorICAgICAqIGFuZCB0aGUgY291bnQgaXMgbW9yZSB0aGFuIG9uZSwgdGhlIGFjdHVhbCBkYXRhIGlzIGNvbnRhaW5lZCBpbiBhbgorICAgICAqIGFycmF5IGFuZCBpcyBhY2Nlc3NpYmxlIGJ5IGRhdGEuX2J5dGVzLiBJbiBjYXNlIG9mIEVYSUZfQVNDSUksIGl0CisgICAgICogaW5kaWNhdGVzIHRoZSBzdHJpbmcgbGVuZ3RoIGFuZCBpbiBjYXNlIG9mIEVYSUZfVU5ERUZJTkVELCBpdCBpbmRpY2F0ZXMKKyAgICAgKiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheS4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBjb3VudDsKKworICAgIC8qIERhdGEKKyAgICAgKiBBIHVuaW9uIHdoaWNoIGNvdmVycyBhbGwgcG9zc2libGUgZGF0YSB0eXBlcy4gVGhlIHVzZXIgc2hvdWxkIHBpY2sKKyAgICAgKiB0aGUgcmlnaHQgZmllbGQgdG8gdXNlIGRlcGVuZGluZyBvbiB0aGUgZGF0YSB0eXBlIGFuZCB0aGUgY291bnQuCisgICAgICogU2VlIGluLWxpbmUgY29tbWVudCBiZWxvdy4KKyAgICAgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgY2hhciAgICAgICpfYXNjaWk7ICAgICAgLy8gRVhJRl9BU0NJSSAoY291bnQgaW5kaWNhdGVzIHN0cmluZyBsZW5ndGgpCisgICAgICAgIHVpbnQ4X3QgICAqX2J5dGVzOyAgICAgIC8vIEVYSUZfQllURSAgKGNvdW50ID4gMSkKKyAgICAgICAgdWludDhfdCAgICBfYnl0ZTsgICAgICAgLy8gRVhJRl9CWVRFICAoY291bnQgPSAxKQorICAgICAgICB1aW50MTZfdCAgKl9zaG9ydHM7ICAgICAvLyBFWElGX1NIT1JUIChjb3VudCA+IDEpCisgICAgICAgIHVpbnQxNl90ICAgX3Nob3J0OyAgICAgIC8vIEVYSUZfU0hPUlQgKGNvdW50ID0gMSkKKyAgICAgICAgdWludDMyX3QgICpfbG9uZ3M7ICAgICAgLy8gRVhJRl9MT05HICAoY291bnQgPiAxKQorICAgICAgICB1aW50MzJfdCAgIF9sb25nOyAgICAgICAvLyBFWElGX0xPTkcgIChjb3VudCA9IDEpCisgICAgICAgIHJhdF90ICAgICAqX3JhdHM7ICAgICAgIC8vIEVYSUZfUkFUSU9OQUwgIChjb3VudCA+IDEpCisgICAgICAgIHJhdF90ICAgICAgX3JhdDsgICAgICAgIC8vIEVYSUZfUkFUSU9OQUwgIChjb3VudCA9IDEpCisgICAgICAgIHVpbnQ4X3QgICAqX3VuZGVmaW5lZDsgIC8vIEVYSUZfVU5ERUZJTkVEIChjb3VudCBpbmRpY2F0ZXMgbGVuZ3RoKQorICAgICAgICBpbnQzMl90ICAgKl9zbG9uZ3M7ICAgICAvLyBFWElGX1NMT05HIChjb3VudCA+IDEpCisgICAgICAgIGludDMyX3QgICAgX3Nsb25nOyAgICAgIC8vIEVYSUZfU0xPTkcgKGNvdW50ID0gMSkKKyAgICAgICAgc3JhdF90ICAgICpfc3JhdHM7ICAgICAgLy8gRVhJRl9TUkFUSU9OQUwgKGNvdW50ID4gMSkKKyAgICAgICAgc3JhdF90ICAgICBfc3JhdDsgICAgICAgLy8gRVhJRl9TUkFUSU9OQUwgKGNvdW50ID0gMSkKKworICAgIH0gZGF0YTsKKworfSBleGlmX3RhZ19lbnRyeV90OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiogICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvIERlZmluaXRpb25zCisqKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogRW51bSBkZWZpbmVkIHRvIGxldCBjb21waWxlciBnZW5lcmF0ZSB1bmlxdWUgb2Zmc2V0IG51bWJlcnMgZm9yIGRpZmZlcmVudAorICogdGFncyAtIG9yZGVyaW5nIG1hdHRlcnMhIE5PVCBJTlRFTkRFRCB0byBiZSB1c2VkIGJ5IGFueSBhcHBsaWNhdGlvbi4gKi8KK3R5cGVkZWYgZW51bQoreworICAgIC8vIEdQUyBJRkQKKyAgICBHUFNfVkVSU0lPTl9JRCA9IDAsCisgICAgR1BTX0xBVElUVURFX1JFRiwKKyAgICBHUFNfTEFUSVRVREUsCisgICAgR1BTX0xPTkdJVFVERV9SRUYsCisgICAgR1BTX0xPTkdJVFVERSwKKyAgICBHUFNfQUxUSVRVREVfUkVGLAorICAgIEdQU19BTFRJVFVERSwKKyAgICBHUFNfVElNRVNUQU1QLAorICAgIEdQU19TQVRFTExJVEVTLAorICAgIEdQU19TVEFUVVMsCisgICAgR1BTX01FQVNVUkVNT0RFLAorICAgIEdQU19ET1AsCisgICAgR1BTX1NQRUVEX1JFRiwKKyAgICBHUFNfU1BFRUQsCisgICAgR1BTX1RSQUNLX1JFRiwKKyAgICBHUFNfVFJBQ0ssCisgICAgR1BTX0lNR0RJUkVDVElPTl9SRUYsCisgICAgR1BTX0lNR0RJUkVDVElPTiwKKyAgICBHUFNfTUFQREFUVU0sCisgICAgR1BTX0RFU1RMQVRJVFVERV9SRUYsCisgICAgR1BTX0RFU1RMQVRJVFVERSwKKyAgICBHUFNfREVTVExPTkdJVFVERV9SRUYsCisgICAgR1BTX0RFU1RMT05HSVRVREUsCisgICAgR1BTX0RFU1RCRUFSSU5HX1JFRiwKKyAgICBHUFNfREVTVEJFQVJJTkcsCisgICAgR1BTX0RFU1RESVNUQU5DRV9SRUYsCisgICAgR1BTX0RFU1RESVNUQU5DRSwKKyAgICBHUFNfUFJPQ0VTU0lOR01FVEhPRCwKKyAgICBHUFNfQVJFQUlORk9STUFUSU9OLAorICAgIEdQU19EQVRFU1RBTVAsCisgICAgR1BTX0RJRkZFUkVOVElBTCwKKworICAgIC8vIFRJRkYgSUZECisgICAgTkVXX1NVQkZJTEVfVFlQRSwKKyAgICBTVUJGSUxFX1RZUEUsCisgICAgSU1BR0VfV0lEVEgsCisgICAgSU1BR0VfTEVOR1RILAorICAgIEJJVFNfUEVSX1NBTVBMRSwKKyAgICBDT01QUkVTU0lPTiwKKyAgICBQSE9UT01FVFJJQ19JTlRFUlBSRVRBVElPTiwKKyAgICBUSFJFU0hfSE9MRElORywKKyAgICBDRUxMX1dJRFRILAorICAgIENFTExfSEVJR0hULAorICAgIEZJTExfT1JERVIsCisgICAgRE9DVU1FTlRfTkFNRSwKKyAgICBJTUFHRV9ERVNDUklQVElPTiwKKyAgICBNQUtFLAorICAgIE1PREVMLAorICAgIFNUUklQX09GRlNFVFMsCisgICAgT1JJRU5UQVRJT04sCisgICAgU0FNUExFU19QRVJfUElYRUwsCisgICAgUk9XU19QRVJfU1RSSVAsCisgICAgU1RSSVBfQllURV9DT1VOVFMsCisgICAgTUlOX1NBTVBMRV9WQUxVRSwKKyAgICBNQVhfU0FNUExFX1ZBTFVFLAorICAgIFhfUkVTT0xVVElPTiwKKyAgICBZX1JFU09MVVRJT04sCisgICAgUExBTkFSX0NPTkZJR1VSQVRJT04sCisgICAgUEFHRV9OQU1FLAorICAgIFhfUE9TSVRJT04sCisgICAgWV9QT1NJVElPTiwKKyAgICBGUkVFX09GRlNFVCwKKyAgICBGUkVFX0JZVEVfQ09VTlRTLAorICAgIEdSQVlfUkVTUE9OU0VfVU5JVCwKKyAgICBHUkFZX1JFU1BPTlNFX0NVUlZFLAorICAgIFQ0X09QVElPTiwKKyAgICBUNl9PUFRJT04sCisgICAgUkVTT0xVVElPTl9VTklULAorICAgIFBBR0VfTlVNQkVSLAorICAgIFRSQU5TRkVSX0ZVTkNUSU9OLAorICAgIFNPRlRXQVJFLAorICAgIERBVEVfVElNRSwKKyAgICBBUlRJU1QsCisgICAgSE9TVF9DT01QVVRFUiwKKyAgICBQUkVESUNUT1IsCisgICAgV0hJVEVfUE9JTlQsCisgICAgUFJJTUFSWV9DSFJPTUFUSUNJVElFUywKKyAgICBDT0xPUl9NQVAsCisgICAgSEFMRlRPTkVfSElOVFMsCisgICAgVElMRV9XSURUSCwKKyAgICBUSUxFX0xFTkdUSCwKKyAgICBUSUxFX09GRlNFVCwKKyAgICBUSUxFX0JZVEVfQ09VTlRTLAorICAgIElOS19TRVQsCisgICAgSU5LX05BTUVTLAorICAgIE5VTUJFUl9PRl9JTktTLAorICAgIERPVF9SQU5HRSwKKyAgICBUQVJHRVRfUFJJTlRFUiwKKyAgICBFWFRSQV9TQU1QTEVTLAorICAgIFNBTVBMRV9GT1JNQVQsCisgICAgVFJBTlNGRVJfUkFOR0UsCisgICAgSlBFR19QUk9DLAorICAgIEpQRUdfSU5URVJDSEFOR0VfRk9STUFULAorICAgIEpQRUdfSU5URVJDSEFOR0VfRk9STUFUX0xFTkdUSCwKKyAgICBKUEVHX1JFU1RBUlRfSU5URVJWQUwsCisgICAgSlBFR19MT1NTTEVTU19QUkVESUNUT1JTLAorICAgIEpQRUdfUE9JTlRfVFJBTlNGT1JNUywKKyAgICBKUEVHX1FfVEFCTEVTLAorICAgIEpQRUdfRENfVEFCTEVTLAorICAgIEpQRUdfQUNfVEFCTEVTLAorICAgIFlDQkNSX0NPRUZGSUNJRU5UUywKKyAgICBZQ0JDUl9TVUJfU0FNUExJTkcsCisgICAgWUNCQ1JfUE9TSVRJT05JTkcsCisgICAgUkVGRVJFTkNFX0JMQUNLX1dISVRFLAorICAgIEdBTU1BLAorICAgIElDQ19QUk9GSUxFX0RFU0NSSVBUT1IsCisgICAgU1JHQl9SRU5ERVJJTkdfSU5URU5ULAorICAgIElNQUdFX1RJVExFLAorICAgIENPUFlSSUdIVCwKKyAgICBFWElGX0lGRCwKKyAgICBJQ0NfUFJPRklMRSwKKyAgICBHUFNfSUZELAorCisKKyAgICAvLyBUSUZGIElGRCAoVGh1bWJuYWlsKQorICAgIFROX0lNQUdFX1dJRFRILAorICAgIFROX0lNQUdFX0xFTkdUSCwKKyAgICBUTl9CSVRTX1BFUl9TQU1QTEUsCisgICAgVE5fQ09NUFJFU1NJT04sCisgICAgVE5fUEhPVE9NRVRSSUNfSU5URVJQUkVUQVRJT04sCisgICAgVE5fSU1BR0VfREVTQ1JJUFRJT04sCisgICAgVE5fTUFLRSwKKyAgICBUTl9NT0RFTCwKKyAgICBUTl9TVFJJUF9PRkZTRVRTLAorICAgIFROX09SSUVOVEFUSU9OLAorICAgIFROX1NBTVBMRVNfUEVSX1BJWEVMLAorICAgIFROX1JPV1NfUEVSX1NUUklQLAorICAgIFROX1NUUklQX0JZVEVfQ09VTlRTLAorICAgIFROX1hfUkVTT0xVVElPTiwKKyAgICBUTl9ZX1JFU09MVVRJT04sCisgICAgVE5fUExBTkFSX0NPTkZJR1VSQVRJT04sCisgICAgVE5fUkVTT0xVVElPTl9VTklULAorICAgIFROX1RSQU5TRkVSX0ZVTkNUSU9OLAorICAgIFROX1NPRlRXQVJFLAorICAgIFROX0RBVEVfVElNRSwKKyAgICBUTl9BUlRJU1QsCisgICAgVE5fV0hJVEVfUE9JTlQsCisgICAgVE5fUFJJTUFSWV9DSFJPTUFUSUNJVElFUywKKyAgICBUTl9KUEVHSU5URVJDSEFOR0VfRk9STUFULAorICAgIFROX0pQRUdJTlRFUkNIQU5HRV9GT1JNQVRfTCwKKyAgICBUTl9ZQ0JDUl9DT0VGRklDSUVOVFMsCisgICAgVE5fWUNCQ1JfU1VCX1NBTVBMSU5HLAorICAgIFROX1lDQkNSX1BPU0lUSU9OSU5HLAorICAgIFROX1JFRkVSRU5DRV9CTEFDS19XSElURSwKKyAgICBUTl9DT1BZUklHSFQsCisKKyAgICAvLyBFWElGIElGRAorICAgIEVYUE9TVVJFX1RJTUUsCisgICAgRl9OVU1CRVIsCisgICAgRVhQT1NVUkVfUFJPR1JBTSwKKyAgICBTUEVDVFJBTF9TRU5TSVRJVklUWSwKKyAgICBJU09fU1BFRURfUkFUSU5HLAorICAgIE9FQ0YsCisgICAgRVhJRl9WRVJTSU9OLAorICAgIEVYSUZfREFURV9USU1FX09SSUdJTkFMLAorICAgIEVYSUZfREFURV9USU1FX0RJR0lUSVpFRCwKKyAgICBFWElGX0NPTVBPTkVOVFNfQ09ORklHLAorICAgIEVYSUZfQ09NUFJFU1NFRF9CSVRTX1BFUl9QSVhFTCwKKyAgICBTSFVUVEVSX1NQRUVELAorICAgIEFQRVJUVVJFLAorICAgIEJSSUdIVE5FU1MsCisgICAgRVhQT1NVUkVfQklBU19WQUxVRSwKKyAgICBNQVhfQVBFUlRVUkUsCisgICAgU1VCSkVDVF9ESVNUQU5DRSwKKyAgICBNRVRFUklOR19NT0RFLAorICAgIExJR0hUX1NPVVJDRSwKKyAgICBGTEFTSCwKKyAgICBGT0NBTF9MRU5HVEgsCisgICAgU1VCSkVDVF9BUkVBLAorICAgIEVYSUZfTUFLRVJfTk9URSwKKyAgICBFWElGX1VTRVJfQ09NTUVOVCwKKyAgICBTVUJTRUNfVElNRSwKKyAgICBTVUJTRUNfVElNRV9PUklHSU5BTCwKKyAgICBTVUJTRUNfVElNRV9ESUdJVElaRUQsCisgICAgRVhJRl9GTEFTSFBJWF9WRVJTSU9OLAorICAgIEVYSUZfQ09MT1JfU1BBQ0UsCisgICAgRVhJRl9QSVhFTF9YX0RJTUVOU0lPTiwKKyAgICBFWElGX1BJWEVMX1lfRElNRU5TSU9OLAorICAgIFJFTEFURURfU09VTkRfRklMRSwKKyAgICBJTlRFUk9QLAorICAgIEZMQVNIX0VORVJHWSwKKyAgICBTUEFUSUFMX0ZSRVFfUkVTUE9OU0UsCisgICAgRk9DQUxfUExBTkVfWF9SRVNPTFVUSU9OLAorICAgIEZPQ0FMX1BMQU5FX1lfUkVTT0xVVElPTiwKKyAgICBGT0NBTF9QTEFORV9SRVNPTFVUSU9OX1VOSVQsCisgICAgU1VCSkVDVF9MT0NBVElPTiwKKyAgICBFWFBPU1VSRV9JTkRFWCwKKyAgICBTRU5TSU5HX01FVEhPRCwKKyAgICBGSUxFX1NPVVJDRSwKKyAgICBTQ0VORV9UWVBFLAorICAgIENGQV9QQVRURVJOLAorICAgIENVU1RPTV9SRU5ERVJFRCwKKyAgICBFWFBPU1VSRV9NT0RFLAorICAgIFdISVRFX0JBTEFOQ0UsCisgICAgRElHSVRBTF9aT09NX1JBVElPLAorICAgIEZPQ0FMX0xFTkdUSF8zNU1NLAorICAgIFNDRU5FX0NBUFRVUkVfVFlQRSwKKyAgICBHQUlOX0NPTlRST0wsCisgICAgQ09OVFJBU1QsCisgICAgU0FUVVJBVElPTiwKKyAgICBTSEFSUE5FU1MsCisgICAgREVWSUNFX1NFVFRJTkdTX0RFU0NSSVBUSU9OLAorICAgIFNVQkpFQ1RfRElTVEFOQ0VfUkFOR0UsCisgICAgSU1BR0VfVUlELAorICAgIFBJTSwKKworICAgIEVYSUZfVEFHX01BWF9PRkZTRVQKKworfSBleGlmX3RhZ19vZmZzZXRfdDsKKworLyogQmVsb3cgYXJlIHRoZSBzdXBwb3J0ZWQgVGFncyAoSUQgYW5kIHN0cnVjdHVyZSBmb3IgdGhlaXIgZGF0YSkgKi8KKyNkZWZpbmUgQ09OU1RSVUNUX1RBR0lEKG9mZnNldCxJRCkgKG9mZnNldCA8PCAxNiB8IElEKQorCisvLyBHUFMgdGFnIHZlcnNpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9HUFNfVkVSU0lPTl9JRCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9CWVRFKQorLy8gQ291bnQgc2hvdWxkIGJlIDQKKyNkZWZpbmUgX0lEX0dQU19WRVJTSU9OX0lEIDB4MDAwMAorI2RlZmluZSBFWElGVEFHSURfR1BTX1ZFUlNJT05fSUQgXAorICBDT05TVFJVQ1RfVEFHSUQoR1BTX1ZFUlNJT05fSUQsIF9JRF9HUFNfVkVSU0lPTl9JRCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfR1BTX1ZFUlNJT05fSUQgRVhJRl9CWVRFCisvLyBOb3J0aCBvciBTb3V0aCBMYXRpdHVkZQorLy8gVXNlIEVYSUZUQUdUWVBFX0dQU19MQVRJVFVERV9SRUYgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBJdCBzaG91bGQgYmUgMiBjaGFyYWN0ZXJzIGxvbmcgaW5jbHVkaW5nIHRoZSBudWxsLXRlcm1pbmF0aW5nIGNoYXJhY3Rlci4KKyNkZWZpbmUgX0lEX0dQU19MQVRJVFVERV9SRUYgMHgwMDAxCisjZGVmaW5lIEVYSUZUQUdJRF9HUFNfTEFUSVRVREVfUkVGIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEdQU19MQVRJVFVERV9SRUYsIF9JRF9HUFNfTEFUSVRVREVfUkVGKQorI2RlZmluZSBFWElGVEFHVFlQRV9HUFNfTEFUSVRVREVfUkVGIEVYSUZfQVNDSUkKKy8vIExhdGl0dWRlCisvLyBVc2UgRVhJRlRBR1RZUEVfR1BTX0xBVElUVURFIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1JBVElPTkFMKQorLy8gQ291bnQgc2hvdWxkIGJlIDMKKyNkZWZpbmUgX0lEX0dQU19MQVRJVFVERSAweDAwMDIKKyNkZWZpbmUgRVhJRlRBR0lEX0dQU19MQVRJVFVERSBDT05TVFJVQ1RfVEFHSUQoR1BTX0xBVElUVURFLCBfSURfR1BTX0xBVElUVURFKQorI2RlZmluZSBFWElGVEFHVFlQRV9HUFNfTEFUSVRVREUgRVhJRl9SQVRJT05BTAorLy8gRWFzdCBvciBXZXN0IExvbmdpdHVkZQorLy8gVXNlIEVYSUZUQUdUWVBFX0dQU19MT05HSVRVREVfUkVGIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0FTQ0lJKQorLy8gSXQgc2hvdWxkIGJlIDIgY2hhcmFjdGVycyBsb25nIGluY2x1ZGluZyB0aGUgbnVsbC10ZXJtaW5hdGluZyBjaGFyYWN0ZXIuCisjZGVmaW5lIF9JRF9HUFNfTE9OR0lUVURFX1JFRiAweDAwMDMKKyNkZWZpbmUgRVhJRlRBR0lEX0dQU19MT05HSVRVREVfUkVGIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEdQU19MT05HSVRVREVfUkVGLCBfSURfR1BTX0xPTkdJVFVERV9SRUYpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0dQU19MT05HSVRVREVfUkVGIEVYSUZfQVNDSUkKKy8vIExvbmdpdHVkZQorLy8gVXNlIEVYSUZUQUdUWVBFX0dQU19MT05HSVRVREUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfUkFUSU9OQUwpCisvLyBDb3VudCBzaG91bGQgYmUgMworI2RlZmluZSBfSURfR1BTX0xPTkdJVFVERSAweDAwMDQKKyNkZWZpbmUgRVhJRlRBR0lEX0dQU19MT05HSVRVREUgXAorICBDT05TVFJVQ1RfVEFHSUQoR1BTX0xPTkdJVFVERSwgX0lEX0dQU19MT05HSVRVREUpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0dQU19MT05HSVRVREUgRVhJRl9SQVRJT05BTAorLy8gQWx0aXR1ZGUgcmVmZXJlbmNlCisvLyBVc2UgRVhJRlRBR1RZUEVfR1BTX0FMVElUVURFX1JFRiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9CWVRFKQorI2RlZmluZSBfSURfR1BTX0FMVElUVURFX1JFRiAweDAwMDUKKyNkZWZpbmUgRVhJRlRBR0lEX0dQU19BTFRJVFVERV9SRUYgXAorICBDT05TVFJVQ1RfVEFHSUQoR1BTX0FMVElUVURFX1JFRiwgX0lEX0dQU19BTFRJVFVERV9SRUYpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0dQU19BTFRJVFVERV9SRUYgRVhJRl9CWVRFCisvLyBBbHRpdHVkZQorLy8gVXNlIEVYSUZUQUdUWVBFX0dQU19BTFRJVFVERSBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKyNkZWZpbmUgX0lEX0dQU19BTFRJVFVERSAweDAwMDYKKyNkZWZpbmUgRVhJRlRBR0lEX0dQU19BTFRJVFVERSBDT05TVFJVQ1RfVEFHSUQoR1BTX0FMVElUVURFLCBfSURfR1BTX0FMVElUVURFKQorI2RlZmluZSBFWElGVEFHVFlQRV9HUFNfQUxUSVRVRSBFWElGX1JBVElPTkFMCisvLyBHUFMgdGltZSAoYXRvbWljIGNsb2NrKQorLy8gVXNlIEVYSUZUQUdUWVBFX0dQU19USU1FU1RBTVAgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfUkFUSU9OQUwpCisvLyBDb3VudCBzaG91bGQgYmUgMworI2RlZmluZSBfSURfR1BTX1RJTUVTVEFNUCAweDAwMDcKKyNkZWZpbmUgRVhJRlRBR0lEX0dQU19USU1FU1RBTVAgXAorICBDT05TVFJVQ1RfVEFHSUQoR1BTX1RJTUVTVEFNUCwgX0lEX0dQU19USU1FU1RBTVApCisjZGVmaW5lIEVYSUZUQUdUWVBFX0dQU19USU1FU1RBTVAgRVhJRl9SQVRJT05BTAorLy8gR1BTIFNhdGVsbGl0ZXMKKy8vIFVzZSBFWElGVEFHVFlQRV9HUFNfU0FURUxMSVRFUyBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9BU0NJSSkKKy8vIENvdW50IGNhbiBiZSBhbnl0aGluZy4KKyNkZWZpbmUgX0lEX0dQU19TQVRFTExJVEVTIDB4MDAwOAorI2RlZmluZSBFWElGVEFHSURfR1BTX1NBVEVMTElURVMgXAorIENPTlNUUlVDVF9UQUdJRChHUFNfU0FURUxMSVRFUywgX0lEX0dQU19TQVRFTExJVEVTKQorI2RlZmluZSBFWElGVEFHVFlQRV9HUFNfU0FURUxMSVRFUyBFWElGX0FTQ0lJCisvLyBHUFMgU3RhdHVzCisvLyBVc2UgRVhJRlRBR1RZUEVfR1BTX1NUQVRVUyBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9BU0NJSSkKKy8vIEl0IHNob3VsZCBiZSAyIGNoYXJhY3RlcnMgbG9uZyBpbmNsdWRpbmcgdGhlIG51bGwtdGVybWluYXRpbmcgY2hhcmFjdGVyLgorLy8gIkEiIC0gTWVhc3VyZW1lbnQgaW4gcHJvZ3Jlc3MKKy8vICJWIiAtIE1lYXN1cmVtZW50IEludGVyb3BlcmFiaWxpdHkKKy8vIE90aGVyIC0gUmVzZXJ2ZWQKKyNkZWZpbmUgX0lEX0dQU19TVEFUVVMgMHgwMDA5CisjZGVmaW5lIEVYSUZUQUdJRF9HUFNfU1RBVFVTIENPTlNUUlVDVF9UQUdJRChHUFNfU1RBVFVTLCBfSURfR1BTX1NUQVRVUykKKyNkZWZpbmUgRVhJRlRBVFRZUEVfR1BTX1NUQVRVUyBFWElGX0FTQ0lJCisvLyBHUFMgTWVhc3VyZSBNb2RlCisvLyBVc2UgRVhJRlRBR1RZUEVfR1BTX01FQVNVUkVNT0RFIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0FTQ0lJKQorLy8gSXQgc2hvdWxkIGJlIDIgY2hhcmFjdGVycyBsb25nIGluY2x1ZGluZyB0aGUgbnVsbC10ZXJtaW5hdGluZyBjaGFyYWN0ZXIuCisvLyAiMiIgLSAyLWRpbWVuc2lvbmFsIG1lYXN1cmVtZW50CisvLyAiMyIgLSAzLWRpbWVuc2lvbmFsIG1lYXN1cmVtZW50CisvLyBPdGhlciAtIFJlc2VydmVkCisjZGVmaW5lIF9JRF9HUFNfTUVBU1VSRU1PREUgMHgwMDBhCisjZGVmaW5lIEVYSUZUQUdJRF9HUFNfTUVBU1VSRU1PREUgXAorICBDT05TVFJVQ1RfVEFHSUQoR1BTX01FQVNVUkVNT0RFLCBfSURfR1BTX01FQVNVUkVNT0RFKQorI2RlZmluZSBFWElGVEFHVFlQRV9HUFNfTUVBU1VSRU1PREUgRVhJRl9BU0NJSQorLy8gR1BTIE1lYXN1cmVtZW50IHByZWNpc2lvbiAoRE9QKQorLy8gVXNlIEVYSUZUQUdUWVBFX0dQU19ET1AgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfUkFUSU9OQUwpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfR1BTX0RPUCAweDAwMGIKKyNkZWZpbmUgRVhJRlRBR0lEX0dQU19ET1AgQ09OU1RSVUNUX1RBR0lEKEdQU19ET1AsIF9JRF9HUFNfRE9QKQorI2RlZmluZSBFWElGVEFHVFlQRV9HUFNfRE9QIEVYSUZfUkFUSU9OQUwKKy8vIFNwZWVkIFVuaXQKKy8vIFVzZSBFWElGVEFHVFlQRV9HUFNfU1BFRURfUkVGIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0FTQ0lJKQorLy8gSXQgc2hvdWxkIGJlIDIgY2hhcmFjdGVycyBsb25nIGluY2x1ZGluZyB0aGUgbnVsbC10ZXJtaW5hdGluZyBjaGFyYWN0ZXIuCisvLyAiSyIgLSBLaWxvbWV0ZXJzIHBlciBob3VyCisvLyAiTSIgLSBNaWxlcyBwZXIgaG91cgorLy8gIk4iIC0gS25vdHMKKy8vIE90aGVyIC0gUmVzZXJ2ZWQKKyNkZWZpbmUgX0lEX0dQU19TUEVFRF9SRUYgMHgwMDBjCisjZGVmaW5lIEVYSUZUQUdJRF9HUFNfU1BFRURfUkVGIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEdQU19TUEVFRF9SRUYsIF9JRF9HUFNfU1BFRURfUkVGKQorI2RlZmluZSBFWElGVEFHVFlQRV9HUFNfU1BFRURfUkVGIEVYSUZfQVNDSUkKKy8vIFNwZWVkIG9mIEdQUyByZWNlaXZlcgorLy8gVXNlIEVYSUZUQUdUWVBFX0dQU19TUEVFRCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9HUFNfU1BFRUQgMHgwMDBkCisjZGVmaW5lIEVYSUZUQUdJRF9HUFNfU1BFRUQgQ09OU1RSVUNUX1RBR0lEKEdQU19TUEVFRCwgX0lEX0dQU19TUEVFRCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfR1BTX1NQRUVEIEVYSUZfUkFUSU9OQUwKKy8vIFJlZmVyZW5jZSBvZiBkaXJlY3Rpb24gb2YgbW92ZW1lbnQKKy8vIFVzZSBFWElGVEFHVFlQRV9HUFNfVFJBQ0tfUkVGIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0FTQ0lJKQorLy8gSXQgc2hvdWxkIGJlIDIgY2hhcmFjdGVycyBsb25nIGluY2x1ZGluZyB0aGUgbnVsbC10ZXJtaW5hdGluZyBjaGFyYWN0ZXIuCisvLyAiVCIgLSBUcnVlIGRpcmVjdGlvbgorLy8gIk0iIC0gTWFnbmV0aWMgZGlyZWN0aW9uCisvLyBPdGhlciAtIFJlc2VydmVkCisjZGVmaW5lIF9JRF9HUFNfVFJBQ0tfUkVGIDB4MDAwZQorI2RlZmluZSBFWElGVEFHSURfR1BTX1RSQUNLX1JFRiBcCisgIENPTlNUUlVDVF9UQUdJRChHUFNfVFJBQ0tfUkVGLCBfSURfR1BTX1RSQUNLX1JFRikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfR1BTX1RSQUNLX1JFRiBFWElGX0FTQ0lJCisvLyBEaXJlY3Rpb24gb2YgbW92ZW1lbnQKKy8vIFVzZSBFWElGVEFHVFlQRV9HUFNfVFJBQ0sgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfUkFUSU9OQUwpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfR1BTX1RSQUNLIDB4MDAwZgorI2RlZmluZSBFWElGVEFHSURfR1BTX1RSQUNLIENPTlNUUlVDVF9UQUdJRChHUFNfVFJBQ0ssIF9JRF9HUFNfVFJBQ0spCisjZGVmaW5lIEVYSUZUQUdUWVBFX0dQU19UUkFDSyBFWElGX1JBVElPTkFMCisvLyBSZWZlcmVuY2Ugb2YgZGlyZWN0aW9uIG9mIGltYWdlCisvLyBVc2UgRVhJRlRBR1RZUEVfR1BTX0lNR0RJUkVDVElPTl9SRUYgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBJdCBzaG91bGQgYmUgMiBjaGFyYWN0ZXJzIGxvbmcgaW5jbHVkaW5nIHRoZSBudWxsLXRlcm1pbmF0aW5nIGNoYXJhY3Rlci4KKy8vICJUIiAtIFRydWUgZGlyZWN0aW9uCisvLyAiTSIgLSBNYWduZXRpYyBkaXJlY3Rpb24KKy8vIE90aGVyIC0gUmVzZXJ2ZWQKKyNkZWZpbmUgX0lEX0dQU19JTUdESVJFQ1RJT05fUkVGIDB4MDAxMAorI2RlZmluZSBFWElGVEFHSURfR1BTX0lNR0RJUkVDVElPTl9SRUYgXAorICBDT05TVFJVQ1RfVEFHSUQoR1BTX0lNR0RJUkVDVElPTl9SRUYsIF9JRF9HUFNfSU1HRElSRUNUSU9OX1JFRikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfR1BTX0lNR0RJUkVDVElPTl9SRUYgRVhJRl9BU0NJSQorLy8gRGlyZWN0aW9uIG9mIGltYWdlCisvLyBVc2UgRVhJRlRBR1RZUEVfR1BTX0lNR0RJUkVDVElPTiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9HUFNfSU1HRElSRUNUSU9OIDB4MDAxMQorI2RlZmluZSBFWElGVEFHSURfR1BTX0lNR0RJUkVDVElPTiBcCisgIENPTlNUUlVDVF9UQUdJRChHUFNfSU1HRElSRUNUSU9OLCBfSURfR1BTX0lNR0RJUkVDVElPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfR1BTX0lNR0RJUkVDVElPTiBFWElGX1JBVElPTkFMCisvLyBHZW9kZXRpYyBzdXJ2ZXkgZGF0YSB1c2VkCisvLyBVc2UgRVhJRlRBR1RZUEVfR1BTX01BUERBVFVNIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0FTQ0lJKQorLy8gQ291bnQgY2FuIGJlIGFueQorI2RlZmluZSBfSURfR1BTX01BUERBVFVNIDB4MDAxMgorI2RlZmluZSBFWElGVEFHSURfR1BTX01BUERBVFVNIENPTlNUUlVDVF9UQUdJRChHUFNfTUFQREFUVU0sIF9JRF9HUFNfTUFQREFUVU0pCisjZGVmaW5lIEVYSUZUQUdUWVBFX0dQU19NQVBEQVRVTSBFWElGX0FTQ0lJCisvLyBSZWZlcmVuY2UgZm9yIGxhdGl0dWRlIG9mIGRlc3RpbmF0aW9uCisvLyBVc2UgRVhJRlRBR1RZUEVfR1BTX0RFU1RMQVRJVFVERV9SRUYgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBJdCBzaG91bGQgYmUgMiBjaGFyYWN0ZXJzIGxvbmcgaW5jbHVkaW5nIHRoZSBudWxsLXRlcm1pbmF0aW5nIGNoYXJhY3Rlci4KKy8vICJOIiAtIE5vcnRoIGxhdGl0dWRlCisvLyAiUyIgLSBTb3V0aCBsYXRpdHVkZQorLy8gT3RoZXIgLSBSZXNlcnZlZAorI2RlZmluZSBfSURfR1BTX0RFU1RMQVRJVFVERV9SRUYgMHgwMDEzCisjZGVmaW5lIEVYSUZUQUdJRF9HUFNfREVTVExBVElUVURFX1JFRiBcCisgIENPTlNUUlVDVF9UQUdJRChHUFNfREVTVExBVElUVURFX1JFRiwgX0lEX0dQU19ERVNUTEFUSVRVREVfUkVGKQorI2RlZmluZSBFWElGVEFHVFlQRV9HUFNfREVTVExBVElUVURFX1JFRiBFWElGX0FTQ0lJCisvLyBMYXRpdHVkZSBvZiBkZXN0aW5hdGlvbgorLy8gVXNlIEVYSUZUQUdUWVBFX0dQU19ERVNUTEFUSVRVREUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfUkFUSU9OQUwpCisvLyBDb3VudCBzaG91bGQgYmUgMworI2RlZmluZSBfSURfR1BTX0RFU1RMQVRJVFVERSAweDAwMTQKKyNkZWZpbmUgRVhJRlRBR0lEX0dQU19ERVNUTEFUSVRVREUgXAorICBDT05TVFJVQ1RfVEFHSUQoR1BTX0RFU1RMQVRJVFVERSwgX0lEX0dQU19ERVNUTEFUSVRVREUpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0dQU19ERVNUTEFUSVRVREUgRVhJRl9SQVRJT05BTAorLy8gUmVmZXJlbmNlIGZvciBsb25naXR1ZGUgb2YgZGVzdGluYXRpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9HUFNfREVTVExPTkdJVFVERV9SRUYgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBJdCBzaG91bGQgYmUgMiBjaGFyYWN0ZXJzIGxvbmcgaW5jbHVkaW5nIHRoZSBudWxsLXRlcm1pbmF0aW5nIGNoYXJhY3Rlci4KKy8vICJFIiAtIEVhc3QgbG9uZ2l0dWRlCisvLyAiVyIgLSBXZXN0IGxvbmdpdHVkZQorLy8gT3RoZXIgLSBSZXNlcnZlZAorI2RlZmluZSBfSURfR1BTX0RFU1RMT05HSVRVREVfUkVGIDB4MDAxNQorI2RlZmluZSBFWElGVEFHSURfR1BTX0RFU1RMT05HSVRVREVfUkVGIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEdQU19ERVNUTE9OR0lUVURFX1JFRiwgX0lEX0dQU19ERVNUTE9OR0lUVURFX1JFRikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfR1BTX0RFU1RMT05HSVRVREVfUkVGIEVYSUZfQVNDSUkKKy8vIExvbmdpdHVkZSBvZiBkZXN0aW5hdGlvbgorLy8gVXNlIEVYSUZUQUdUWVBFX0dQU19ERVNUTE9OR0lUVURFIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1JBVElPTkFMKQorLy8gQ291bnQgc2hvdWxkIGJlIDMKKyNkZWZpbmUgX0lEX0dQU19ERVNUTE9OR0lUVURFIDB4MDAxNgorI2RlZmluZSBFWElGVEFHSURfR1BTX0RFU1RMT05HSVRVREUgQ09OU1RSVUNUX1RBR0lEKEdQU19ERVNUTE9OR0lUVURFLCBfSURfR1BTX0RFU1RMT05HSVRVREUpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0dQU19ERVNUTE9OR0lUVURFIEVYSUZfUkFUSU9OQUwKKy8vIFJlZmVyZW5jZSBmb3IgYmVhcmluZyBvZiBkZXN0aW5hdGlvbgorLy8gVXNlIEVYSUZUQUdUWVBFX0dQU19ERVNUQkVBUklOR19SRUYgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBJdCBzaG91bGQgYmUgMiBjaGFyYWN0ZXJzIGxvbmcgaW5jbHVkaW5nIHRoZSBudWxsLXRlcm1pbmF0aW5nIGNoYXJhY3Rlci4KKy8vICJUIiAtIFRydWUgZGlyZWN0aW9uCisvLyAiTSIgLSBNYWduZXRpYyBkaXJlY3Rpb24KKy8vIE90aGVyIC0gUmVzZXJ2ZWQKKyNkZWZpbmUgX0lEX0dQU19ERVNUQkVBUklOR19SRUYgMHgwMDE3CisjZGVmaW5lIEVYSUZUQUdJRF9HUFNfREVTVEJFQVJJTkdfUkVGIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEdQU19ERVNUQkVBUklOR19SRUYsIF9JRF9HUFNfREVTVEJFQVJJTkdfUkVGKQorI2RlZmluZSBFWElGVEFHVFlQRV9HUFNfREVTVEJFQVJJTkdfUkVGIEVYSUZfQVNDSUkKKy8vIEJlYXJpbmcgb2YgZGVzdGluYXRpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9HUFNfREVTVEJFQVJJTkcgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfUkFUSU9OQUwpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfR1BTX0RFU1RCRUFSSU5HIDB4MDAxOAorI2RlZmluZSBFWElGVEFHSURfR1BTX0RFU1RCRUFSSU5HIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEdQU19ERVNUQkVBUklORywgX0lEX0dQU19ERVNUQkVBUklORykKKyNkZWZpbmUgRVhJRlRBR1RZUEVfR1BTX0RFU1RCRUFSSU5HIEVYSUZfUkFUSU9OQUwKKy8vIFJlZmVyZW5jZSBmb3IgZGlzdGFuY2UgdG8gZGVzdGluYXRpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9HUFNfREVTVERJU1RBTkNFX1JFRiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9BU0NJSSkKKy8vIEl0IHNob3VsZCBiZSAyIGNoYXJhY3RlcnMgbG9uZyBpbmNsdWRpbmcgdGhlIG51bGwtdGVybWluYXRpbmcgY2hhcmFjdGVyLgorLy8gIksiIC0gS2lsb21ldGVycyBwZXIgaG91cgorLy8gIk0iIC0gTWlsZXMgcGVyIGhvdXIKKy8vICJOIiAtIEtub3RzCisvLyBPdGhlciAtIFJlc2VydmVkCisjZGVmaW5lIF9JRF9HUFNfREVTVERJU1RBTkNFX1JFRiAweDAwMTkKKyNkZWZpbmUgRVhJRlRBR0lEX0dQU19ERVNURElTVEFOQ0VfUkVGIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEdQU19ERVNURElTVEFOQ0VfUkVGLCBfSURfR1BTX0RFU1RESVNUQU5DRV9SRUYpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0dQU19ERVNURElTVEFOQ0VfUkVGIEVYSUZfQVNDSUkKKy8vIERpc3RhbmNlIHRvIGRlc3RpbmF0aW9uCisvLyBVc2UgRVhJRlRBR1RZUEVfR1BTX0RFU1RESVNUQU5DRSBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9HUFNfREVTVERJU1RBTkNFIDB4MDAxYQorI2RlZmluZSBFWElGVEFHSURfR1BTX0RFU1RESVNUQU5DRSBcCisgIENPTlNUUlVDVF9UQUdJRChHUFNfREVTVERJU1RBTkNFLCBfSURfR1BTX0RFU1RESVNUQU5DRSkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfR1BTX0RFU1RESVNUQU5DRSBFWElGX1JBVElPTkFMCisvLyBOYW1lIG9mIEdQUyBwcm9jZXNzaW5nIG1ldGhvZAorLy8gVXNlIEVYSUZUQUdUWVBFX0dQU19QUk9DRVNTSU5HTUVUSE9EIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1VOREVGSU5FRCkKKy8vIENvdW50IGNhbiBiZSBhbnkKKyNkZWZpbmUgX0lEX0dQU19QUk9DRVNTSU5HTUVUSE9EIDB4MDAxYgorI2RlZmluZSBFWElGVEFHSURfR1BTX1BST0NFU1NJTkdNRVRIT0QgXAorICBDT05TVFJVQ1RfVEFHSUQoR1BTX1BST0NFU1NJTkdNRVRIT0QsIF9JRF9HUFNfUFJPQ0VTU0lOR01FVEhPRCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfR1BTX1BST0NFU1NJTkdNRVRIT0QgRVhJRl9VTkRFRklORUQKKy8vIE5hbWUgb2YgR1BTIGFyZWEKKy8vIFVzZSBFWElGVEFHVFlQRV9HUFNfQVJFQUlORk9STUFUSU9OIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1VOREVGSU5FRCkKKy8vIENvdW50IGNhbiBiZSBhbnkKKyNkZWZpbmUgX0lEX0dQU19BUkVBSU5GT1JNQVRJT04gMHgwMDFjCisjZGVmaW5lIEVYSUZUQUdJRF9HUFNfQVJFQUlORk9STUFUSU9OIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEdQU19BUkVBSU5GT1JNQVRJT04sIF9JRF9HUFNfQVJFQUlORk9STUFUSU9OKQorI2RlZmluZSBFWElGVEFHVFlQRV9HUFNfQVJFQUlORk9STUFUSU9OIEVYSUZfVU5ERUZJTkVECisvLyBHUFMgZGF0ZQorLy8gVXNlIEVYSUZUQUdUWVBFX0dQU19EQVRFU1RBTVAgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBJdCBzaG91bGQgYmUgMTEgY2hhcmFjdGVycyBsb25nIGluY2x1ZGluZyB0aGUgbnVsbC10ZXJtaW5hdGluZyBjaGFyYWN0ZXIuCisjZGVmaW5lIF9JRF9HUFNfREFURVNUQU1QIDB4MDAxZAorI2RlZmluZSBFWElGVEFHSURfR1BTX0RBVEVTVEFNUCBcCisgIENPTlNUUlVDVF9UQUdJRChHUFNfREFURVNUQU1QLCBfSURfR1BTX0RBVEVTVEFNUCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfR1BTX0RBVEVTVEFNUCBFWElGX0FTQ0lJCisvLyBHUFMgZGlmZmVyZW50aWFsIGNvcnJlY3Rpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9HUFNfRElGRkVSRU5USUFMIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKy8vIDAgLSBNZWFzdXJlbWVudCB3aXRob3V0IGRpZmZlcmVudGlhbCBjb3JyZWN0aW9uCisvLyAxIC0gRGlmZmVyZW50aWFsIGNvcnJlY3Rpb24gYXBwbGllZAorLy8gT3RoZXIgLSBSZXNlcnZlZAorI2RlZmluZSBfSURfR1BTX0RJRkZFUkVOVElBTCAweDAwMWUKKyNkZWZpbmUgRVhJRlRBR0lEX0dQU19ESUZGRVJFTlRJQUwgXAorICBDT05TVFJVQ1RfVEFHSUQoR1BTX0RJRkZFUkVOVElBTCwgX0lEX0dQU19ESUZGRVJFTlRJQUwpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0dQU19ESUZGRVJFTlRJQUwgRVhJRl9TSE9SVAorLy8gSW1hZ2Ugd2lkdGgKKy8vIFVzZSBFWElGVEFHVFlQRV9JTUFHRV9XSURUSCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9MT05HKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX0lNQUdFX1dJRFRIIDB4MDEwMAorI2RlZmluZSBFWElGVEFHSURfSU1BR0VfV0lEVEggQ09OU1RSVUNUX1RBR0lEKElNQUdFX1dJRFRILCBfSURfSU1BR0VfV0lEVEgpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0lNQUdFX1dJRFRIIEVYSUZfTE9ORworLy8gSW1hZ2UgaGVpZ2h0CisvLyBVc2UgRVhJRlRBR1RZUEVfSU1BR0VfTEVOR1RIIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUX09SX0xPTkcpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfSU1BR0VfTEVOR1RIIDB4MDEwMQorI2RlZmluZSBFWElGVEFHSURfSU1BR0VfTEVOR1RIIENPTlNUUlVDVF9UQUdJRChJTUFHRV9MRU5HVEgsIF9JRF9JTUFHRV9MRU5HVEgpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0lNQUdFX0xFTkdUSCBFWElGX0xPTkcKKy8vIE51bWJlciBvZiBiaXRzIHBlciBjb21wb25lbnQKKy8vIFVzZSBFWElGVEFHVFlQRV9CSVRTX1BFUl9TQU1QTEUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfQklUU19QRVJfU0FNUExFIDB4MDEwMgorI2RlZmluZSBFWElGVEFHSURfQklUU19QRVJfU0FNUExFIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEJJVFNfUEVSX1NBTVBMRSwgX0lEX0JJVFNfUEVSX1NBTVBMRSkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfQklUU19QRVJfU0FNUExFIEVYSUZfU0hPUlQKKy8vIENvbXByZXNzaW9uIHNjaGVtZQorLy8gVXNlIEVYSUZUQUdUWVBFX0NPTVBSRVNTSU9OIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX0NPTVBSRVNTSU9OIDB4MDEwMworI2RlZmluZSBFWElGVEFHSURfQ09NUFJFU1NJT04gQ09OU1RSVUNUX1RBR0lEKENPTVBSRVNTSU9OLCBfSURfQ09NUFJFU1NJT04pCisjZGVmaW5lIEVYSUZUQUdUWVBFX0NPTVBSRVNTSU9OIEVYSUZfU0hPUlQKKy8vIFBpeGVsIGNvbXBvc2l0aW9uCisvLyBVc2UgRVhJRlRBR1RZUEVfUEhPVE9NRVRSSUNfSU5URVJQUkVUQVRJT04gYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfUEhPVE9NRVRSSUNfSU5URVJQUkVUQVRJT04gMHgwMTA2CisjZGVmaW5lIEVYSUZUQUdJRF9QSE9UT01FVFJJQ19JTlRFUlBSRVRBVElPTiBcCisgIENPTlNUUlVDVF9UQUdJRChQSE9UT01FVFJJQ19JTlRFUlBSRVRBVElPTiwgX0lEX1BIT1RPTUVUUklDX0lOVEVSUFJFVEFUSU9OKQorI2RlZmluZSBFWElGVEFHVFlQRV9QSE9UT01FVFJJQ19JTlRFUlBSRVRBVElPTiBFWElGX1NIT1JUCisKKy8vIFRocmVzaG9sZGluZworLy8gVXNlIEVYSUZUQUdUWVBFX1RIUkVTSF9IT0xESU5HIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8KKy8vMSA9IE5vIGRpdGhlcmluZyBvciBoYWxmdG9uaW5nCisvLzIgPSBPcmRlcmVkIGRpdGhlciBvciBoYWxmdG9uZQorLy8zID0gUmFuZG9taXplZCBkaXRoZXIKKyNkZWZpbmUgX0lEX1RIUkVTSF9IT0xESU5HIDB4MDEwNworI2RlZmluZSBFWElGVEFHSURfVEhSRVNIX0hPTERJTkcgXAorICBDT05TVFJVQ1RfVEFHSUQoVEhSRVNIX0hPTERJTkcsIF9JRF9USFJFU0hfSE9MRElORykKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVEhSRVNIX0hPTERJTkcgRVhJRl9TSE9SVAorCisvLyBDZWxsIFdpZHRoCisvLyBVc2UgRVhJRlRBR1RZUEVfQ0VMTF9XSURUSCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vCisjZGVmaW5lIF9JRF9DRUxMX1dJRFRIIDB4MDEwOAorI2RlZmluZSBFWElGVEFHSURfQ0VMTF9XSURUSCBDT05TVFJVQ1RfVEFHSUQoQ0VMTF9XSURUSCwgX0lEX0NFTExfV0lEVEgpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0NFTExfV0lEVEggRVhJRl9TSE9SVAorLy8gQ2VsbCBIZWlnaHQKKy8vIFVzZSBFWElGVEFHVFlQRV9DRUxMX0hFSUdIVCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9DRUxMX0hFSUdIVCAweDAxMDkKKyNkZWZpbmUgRVhJRlRBR0lEX0NFTExfSEVJR0hUIENPTlNUUlVDVF9UQUdJRChDRUxMX0hFSUdIVCwgX0lEX0NFTExfSEVJR0hUKQorI2RlZmluZSBFWElGVEFHVFlQRV9DRUxMX0hFSUdIVCBFWElGX1NIT1JUCisvLyBGaWxsIE9yZGVyCisvLyBVc2UgRVhJRlRBR1RZUEVfRklMTF9PUkRFUiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIAkxID0gTm9ybWFsCisvLyAgMiA9IFJldmVyc2VkCisjZGVmaW5lIF9JRF9GSUxMX09SREVSIDB4MDEwQQorI2RlZmluZSBFWElGVEFHSURfRklMTF9PUkRFUiBDT05TVFJVQ1RfVEFHSUQoRklMTF9PUkRFUiwgX0lEX0ZJTExfT1JERVIpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0ZJTExfT1JERVIgRVhJRl9TSE9SVAorCisvLyBET0NVTUVOVCBOQU1FCisvLyBVc2UgRVhJRlRBR1RZUEVfRE9DVU1FTlRfTkFNRSBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9BU0NJSSkKKy8vCisjZGVmaW5lIF9JRF9ET0NVTUVOVF9OQU1FIDB4MDEwRAorI2RlZmluZSBFWElGVEFHSURfRE9DVU1FTlRfTkFNRSBDT05TVFJVQ1RfVEFHSUQoRE9DVU1FTlRfTkFNRSwgX0lEX0RPQ1VNRU5UX05BTUUpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0RPQ1VNRU5UX05BTUUgRVhJRl9BU0NJSQorCisvLyBJbWFnZSB0aXRsZQorLy8gVXNlIEVYSUZUQUdUWVBFX0lNQUdFX0RFU0NSSVBUSU9OIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0FTQ0lJKQorLy8gQ291bnQgY2FuIGJlIGFueQorI2RlZmluZSBfSURfSU1BR0VfREVTQ1JJUFRJT04gMHgwMTBlCisjZGVmaW5lIEVYSUZUQUdJRF9JTUFHRV9ERVNDUklQVElPTiBcCisgIENPTlNUUlVDVF9UQUdJRChJTUFHRV9ERVNDUklQVElPTiwgX0lEX0lNQUdFX0RFU0NSSVBUSU9OKQorI2RlZmluZSBFWElGVEFHVFlQRV9JTUFHRV9ERVNDUklQVElPTiBFWElGX0FTQ0lJCisvLyBJbWFnZSBpbnB1dCBlcXVpcG1lbnQgbWFudWZhY3R1cmVyCisvLyBVc2UgRVhJRlRBR1RZUEVfTUFLRSBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9BU0NJSSkKKy8vIENvdW50IGNhbiBiZSBhbnkKKyNkZWZpbmUgX0lEX01BS0UgMHgwMTBmCisjZGVmaW5lIEVYSUZUQUdJRF9NQUtFIENPTlNUUlVDVF9UQUdJRChNQUtFLCBfSURfTUFLRSkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfTUFLRSBFWElGX0FTQ0lJCisvLyBJbWFnZSBpbnB1dCBlcXVpcG1lbnQgbW9kZWwKKy8vIFVzZSBFWElGVEFHVFlQRV9NT0RFTCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9BU0NJSSkKKy8vIENvdW50IGNhbiBiZSBhbnkKKyNkZWZpbmUgX0lEX01PREVMIDB4MDExMAorI2RlZmluZSBFWElGVEFHSURfTU9ERUwgQ09OU1RSVUNUX1RBR0lEKE1PREVMLCBfSURfTU9ERUwpCisjZGVmaW5lIEVYSUZUQUdUWVBFX01PREVMIEVYSUZfQVNDSUkKKy8vIEltYWdlIGRhdGEgbG9jYXRpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9TVFJJUF9PRkZTRVRTIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0xPTkcpCisvLyBDb3VudCA9IFN0cmlwc1BlckltYWdlICAgICAgICAgICAgICAgICAgICB3aGVuIFBsYW5hckNvbmZpZ3VyYXRpb24gPSAxCisvLyAgICAgICA9IFNhbXBsZXNQZXJQaXhlbCAqIFN0cmlwc1BlckltYWdlICB3aGVuIFBsYW5hckNvbmZpZ3VyYXRpb24gPSAyCisjZGVmaW5lIF9JRF9TVFJJUF9PRkZTRVRTIDB4MDExMQorI2RlZmluZSBFWElGVEFHSURfU1RSSVBfT0ZGU0VUUyBcCisgIENPTlNUUlVDVF9UQUdJRChTVFJJUF9PRkZTRVRTLCBfSURfU1RSSVBfT0ZGU0VUUykKKyNkZWZpbmUgRVhJRlRBR1RZUEVfU1RSSVBfT0ZGU0VUUyBFWElGX0xPTkcKKy8vIE9yaWVudGF0aW9uIG9mIGltYWdlCisvLyBVc2UgRVhJRlRBR1RZUEVfT1JJRU5UQVRJT04gYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfT1JJRU5UQVRJT04gMHgwMTEyCisjZGVmaW5lIEVYSUZUQUdJRF9PUklFTlRBVElPTiBDT05TVFJVQ1RfVEFHSUQoT1JJRU5UQVRJT04sIF9JRF9PUklFTlRBVElPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfT1JJRU5UQVRJT04gRVhJRl9TSE9SVAorLy8gTnVtYmVyIG9mIGNvbXBvbmVudHMKKy8vIFVzZSBFWElGVEFHVFlQRV9TQU1QTEVTX1BFUl9QSVhFTCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9TQU1QTEVTX1BFUl9QSVhFTCAweDAxMTUKKyNkZWZpbmUgRVhJRlRBR0lEX1NBTVBMRVNfUEVSX1BJWEVMIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFNBTVBMRVNfUEVSX1BJWEVMLCBfSURfU0FNUExFU19QRVJfUElYRUwpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1NBTVBMRVNfUEVSX1BJWEVMIEVYSUZfU0hPUlQKKy8vIE51bWJlciBvZiByb3dzIHBlciBzdHJpcAorLy8gVXNlIEVYSUZUQUdUWVBFX1JPV1NfUEVSX1NUUklQIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0xPTkcpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfUk9XU19QRVJfU1RSSVAgMHgwMTE2CisjZGVmaW5lIEVYSUZUQUdJRF9ST1dTX1BFUl9TVFJJUCBcCisgIENPTlNUUlVDVF9UQUdJRChST1dTX1BFUl9TVFJJUCwgX0lEX1JPV1NfUEVSX1NUUklQKQorI2RlZmluZSBFWElGVEFHVFlQRV9ST1dTX1BFUl9TVFJJUCBFWElGX0xPTkcKKy8vIEJ5dGVzIHBlciBjb21wcmVzc2VkIHN0cmlwCisvLyBVc2UgRVhJRlRBR1RZUEVfU1RSSVBfQllURV9DT1VOVFMgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfTE9ORykKKy8vIENvdW50ID0gU3RyaXBzUGVySW1hZ2UgICAgICAgICAgICAgICAgICAgIHdoZW4gUGxhbmFyQ29uZmlndXJhdGlvbiA9IDEKKy8vICAgICAgID0gU2FtcGxlc1BlclBpeGVsICogU3RyaXBzUGVySW1hZ2UgIHdoZW4gUGxhbmFyQ29uZmlndXJhdGlvbiA9IDIKKyNkZWZpbmUgX0lEX1NUUklQX0JZVEVfQ09VTlRTIDB4MDExNworI2RlZmluZSBFWElGVEFHSURfU1RSSVBfQllURV9DT1VOVFMgXAorICBDT05TVFJVQ1RfVEFHSUQoU1RSSVBfQllURV9DT1VOVFMsIF9JRF9TVFJJUF9CWVRFX0NPVU5UUykKKyNkZWZpbmUgRVhJRlRBR1RZUEVfU1RSSVBfQllURV9DT1VOVFMgRVhJRl9MT05HCisvLyBNaW5TYW1wbGVWYWx1ZQorLy8gVXNlIEVYSUZUQUdUWVBFX01JTl9TQU1QTEVfVkFMVUUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisjZGVmaW5lIF9JRF9NSU5fU0FNUExFX1ZBTFVFIDB4MDExOAorI2RlZmluZSBFWElGVEFHSURfTUlOX1NBTVBMRV9WQUxVRSAgXAorICBDT05TVFJVQ1RfVEFHSUQoTUlOX1NBTVBMRV9WQUxVRSwgX0lEX01JTl9TQU1QTEVfVkFMVUUpCisjZGVmaW5lIEVYSUZUQUdUWVBFX01JTl9TQU1QTEVfVkFMVUUgRVhJRl9TSE9SVAorLy8gTWF4U2FtcGxlVmFsdWUKKy8vIFVzZSBFWElGVEFHVFlQRV9NQVhfU0FNUExFX1ZBTFVFIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorI2RlZmluZSBfSURfTUFYX1NBTVBMRV9WQUxVRSAweDAxMTkKKyNkZWZpbmUgRVhJRlRBR0lEX01BWF9TQU1QTEVfVkFMVUUgQ09OU1RSVUNUX1RBR0lEKE1BWF9TQU1QTEVfVkFMVUUsIF9JRF9NQVhfU0FNUExFX1ZBTFVFKQorI2RlZmluZSBFWElGVEFHVFlQRV9NQVhfU0FNUExFX1ZBTFVFIEVYSUZfU0hPUlQKKworLy8gSW1hZ2UgcmVzb2x1dGlvbiBpbiB3aWR0aCBkaXJlY3Rpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9YX1JFU09MVVRJT04gYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfUkFUSU9OQUwpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfWF9SRVNPTFVUSU9OIDB4MDExYQorI2RlZmluZSBFWElGVEFHSURfWF9SRVNPTFVUSU9OIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFhfUkVTT0xVVElPTiwgX0lEX1hfUkVTT0xVVElPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfWF9SRVNPTFVUSU9OIEVYSUZfUkFUSU9OQUwKKy8vIEltYWdlIHJlc29sdXRpb24gaW4gaGVpZ2h0IGRpcmVjdGlvbgorLy8gVXNlIEVYSUZUQUdUWVBFX1lfUkVTT0xVVElPTiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9ZX1JFU09MVVRJT04gMHgwMTFiCisjZGVmaW5lIEVYSUZUQUdJRF9ZX1JFU09MVVRJT04gXAorICBDT05TVFJVQ1RfVEFHSUQoWV9SRVNPTFVUSU9OLCBfSURfWV9SRVNPTFVUSU9OKQorI2RlZmluZSBFWElGVEFHVFlQRV9ZX1JFU09MVVRJT04gRVhJRl9SQVRJT05BTAorLy8gSW1hZ2UgZGF0YSBhcnJhbmdlbWVudAorLy8gVXNlIEVYSUZUQUdUWVBFX1BMQU5BUl9DT05GSUdVUkFUSU9OIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX1BMQU5BUl9DT05GSUdVUkFUSU9OIDB4MDExYworI2RlZmluZSBFWElGVEFHSURfUExBTkFSX0NPTkZJR1VSQVRJT04gXAorICBDT05TVFJVQ1RfVEFHSUQoUExBTkFSX0NPTkZJR1VSQVRJT04sIF9JRF9QTEFOQVJfQ09ORklHVVJBVElPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfUExBTkFSX0NPTkZJR1VSQVRJT04gRVhJRl9TSE9SVAorLy8gUGFnZU5hbWUKKy8vIFVzZSBFWElGVEFHVFlQRV9QQUdFX05BTUUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfUEFHRV9OQU1FIDB4MDExZAorI2RlZmluZSBFWElGVEFHSURfUEFHRV9OQU1FIENPTlNUUlVDVF9UQUdJRChQQUdFX05BTUUsIF9JRF9QQUdFX05BTUUpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1BBR0VfTkFNRSBFWElGX0FTQ0lJCisvLyBYUG9zaXRpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9YX1BPU0lUSU9OIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1JBVElPTkFMKQorLy8KKyNkZWZpbmUgX0lEX1hfUE9TSVRJT04gMHgwMTFlCisjZGVmaW5lIEVYSUZUQUdJRF9YX1BPU0lUSU9OIENPTlNUUlVDVF9UQUdJRChYX1BPU0lUSU9OLCBfSURfWF9QT1NJVElPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfWF9QT1NJVElPTiBFWElGX1JBVElPTkFMCisvLyBZUG9zaXRpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9ZX1BPU0lUSU9OIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1JBVElPTkFMKQorLy8KKyNkZWZpbmUgX0lEX1lfUE9TSVRJT04gMHgwMTFmCisjZGVmaW5lIEVYSUZUQUdJRF9ZX1BPU0lUSU9OIENPTlNUUlVDVF9UQUdJRChZX1BPU0lUSU9OLCBfSURfWV9QT1NJVElPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfWV9QT1NJVElPTiBFWElGX1JBVElPTkFMCisKKy8vIEZSRUVfT0ZGU0VUCisvLyBVc2UgRVhJRlRBR1RZUEVfRlJFRV9PRkZTRVQgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfTE9ORykKKy8vCisjZGVmaW5lIF9JRF9GUkVFX09GRlNFVCAweDAxMjAKKyNkZWZpbmUgRVhJRlRBR0lEX0ZSRUVfT0ZGU0VUIENPTlNUUlVDVF9UQUdJRChGUkVFX09GRlNFVCwgX0lEX0ZSRUVfT0ZGU0VUKQorI2RlZmluZSBFWElGVEFHVFlQRV9GUkVFX09GRlNFVCBFWElGX0xPTkcKKy8vIEZSRUVfQllURV9DT1VOVFMKKy8vIFVzZSBFWElGVEFHVFlQRV9GUkVFX0JZVEVfQ09VTlRTIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0xPTkcpCisvLworI2RlZmluZSBfSURfRlJFRV9CWVRFX0NPVU5UUyAweDAxMjEKKyNkZWZpbmUgRVhJRlRBR0lEX0ZSRUVfQllURV9DT1VOVFMgXAorICBDT05TVFJVQ1RfVEFHSUQoRlJFRV9CWVRFX0NPVU5UUywgX0lEX0ZSRUVfQllURV9DT1VOVFMpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0ZSRUVfQllURV9DT1VOVFMgRVhJRl9MT05HCisKKy8vIEdyYXlSZXNwb25zZVVuaXQKKy8vIFVzZSBFWElGVEFHVFlQRV9HUkFZX1JFU1BPTlNFX1VOSVQgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLworI2RlZmluZSBfSURfR1JBWV9SRVNQT05TRV9VTklUIDB4MDEyMgorI2RlZmluZSBFWElGVEFHSURfR1JBWV9SRVNQT05TRV9VTklUIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEdSQVlfUkVTUE9OU0VfVU5JVCwgX0lEX0dSQVlfUkVTUE9OU0VfVU5JVCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfR1JBWV9SRVNQT05TRV9VTklUIEVYSUZfU0hPUlQKKy8vIEdyYXlSZXNwb25zZUN1cnZlCisvLyBVc2UgRVhJRlRBR1RZUEVfR1JBWV9SRVNQT05TRV9DVVJWRSAgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLworI2RlZmluZSBfSURfR1JBWV9SRVNQT05TRV9DVVJWRSAweDAxMjMKKyNkZWZpbmUgRVhJRlRBR0lEX0dSQVlfUkVTUE9OU0VfQ1VSVkUgXAorICBDT05TVFJVQ1RfVEFHSUQoR1JBWV9SRVNQT05TRV9DVVJWRSAsIF9JRF9HUkFZX1JFU1BPTlNFX0NVUlZFICkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfR1JBWV9SRVNQT05TRV9DVVJWRSBFWElGX1NIT1JUCisKKy8vIFQ0X09QVElPTgorLy8gVXNlIEVYSUZUQUdUWVBFX1Q0X09QVElPTiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9MT05HKQorLy8KKyNkZWZpbmUgX0lEX1Q0X09QVElPTiAgMHgwMTI0CisjZGVmaW5lIEVYSUZUQUdJRF9UNF9PUFRJT04gQ09OU1RSVUNUX1RBR0lEKFQ0X09QVElPTiwgX0lEX1Q0X09QVElPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVDRfT1BUSU9OIEVYSUZfTE9ORworLy8gVDZfT1BUSU9OCisvLyBVc2UgRVhJRlRBR1RZUEVfVDZfT1BUSU9OIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0xPTkcpCisvLworI2RlZmluZSBfSURfVDZfT1BUSU9OIDB4MDEyNQorI2RlZmluZSBFWElGVEFHSURfVDZfT1BUSU9OIENPTlNUUlVDVF9UQUdJRChUNl9PUFRJT04sIF9JRF9UNl9PUFRJT04pCisjZGVmaW5lIEVYSUZUQUdUWVBFX1Q2X09QVElPTiBFWElGX0xPTkcKKworLy8gVW5pdCBvZiBYIGFuZCBZIHJlc29sdXRpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9SRVNPTFVUSU9OX1VOSVQgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfUkVTT0xVVElPTl9VTklUIDB4MDEyOAorI2RlZmluZSBFWElGVEFHSURfUkVTT0xVVElPTl9VTklUIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFJFU09MVVRJT05fVU5JVCwgX0lEX1JFU09MVVRJT05fVU5JVCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfUkVTT0xVVElPTl9VTklUIEVYSUZfU0hPUlQKKworLy8gUGFnZSBOdW1iZXIKKy8vIFVzZSBFWElGVEFHVFlQRV9QQUdFX05VTUJFUiAgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfUEFHRV9OVU1CRVIgMHgwMTI5CisjZGVmaW5lIEVYSUZUQUdJRF9QQUdFX05VTUJFUiBDT05TVFJVQ1RfVEFHSUQoUEFHRV9OVU1CRVIsIF9JRF9QQUdFX05VTUJFUikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfUEFHRV9OVU1CRVIgRVhJRl9TSE9SVAorLy8gVHJhbnNmZXIgZnVuY3Rpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9UUkFOU0ZFUl9GVU5DVElPTiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSAzKjI1NgorI2RlZmluZSBfSURfVFJBTlNGRVJfRlVOQ1RJT04gMHgwMTJkCisjZGVmaW5lIEVYSUZUQUdJRF9UUkFOU0ZFUl9GVU5DVElPTiBcCisgIENPTlNUUlVDVF9UQUdJRChUUkFOU0ZFUl9GVU5DVElPTiwgX0lEX1RSQU5TRkVSX0ZVTkNUSU9OKQorI2RlZmluZSBFWElGVEFHVFlQRV9UUkFOU0ZFUl9GVU5DVElPTiBFWElGX1NIT1JUCisvLyBTb2Z0d2FyZSB1c2VkCisvLyBVc2UgRVhJRlRBR1RZUEVfU09GVFdBUkUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBDb3VudCBjYW4gYmUgYW55CisjZGVmaW5lIF9JRF9TT0ZUV0FSRSAweDAxMzEKKyNkZWZpbmUgRVhJRlRBR0lEX1NPRlRXQVJFIENPTlNUUlVDVF9UQUdJRChTT0ZUV0FSRSwgX0lEX1NPRlRXQVJFKQorI2RlZmluZSBFWElGVEFHVFlQRV9TT0ZUV0FSRSBFWElGX0FTQ0lJCisvLyBGaWxlIGNoYW5nZSBkYXRlIGFuZCB0aW1lCisvLyBVc2UgRVhJRlRBR1RZUEVfREFURV9USU1FIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0FTQ0lJKQorLy8gQ291bnQgc2hvdWxkIGJlIDIwCisjZGVmaW5lIF9JRF9EQVRFX1RJTUUgMHgwMTMyCisjZGVmaW5lIEVYSUZUQUdJRF9EQVRFX1RJTUUgQ09OU1RSVUNUX1RBR0lEKERBVEVfVElNRSwgX0lEX0RBVEVfVElNRSkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfREFURV9USU1FIEVYSUZfQVNDSUkKKy8vIEFSVElTVCwgcGVyc29uIHdobyBjcmVhdGVkIHRoaXMgaW1hZ2UKKy8vIFVzZSBFWElGVEFHVFlQRV9BUlRJU1QgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBDb3VudCBjYW4gYmUgYW55CisjZGVmaW5lIF9JRF9BUlRJU1QgMHgwMTNiCisjZGVmaW5lIEVYSUZUQUdJRF9BUlRJU1QgQ09OU1RSVUNUX1RBR0lEKEFSVElTVCwgX0lEX0FSVElTVCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfQVJUSVNUIEVYSUZfQVNDSUkKKy8vIEhvc3QgQ29tcHV0ZXIgTmFtZQorLy8gVXNlIEVYSUZUQUdUWVBFX0hPU1RfQ09NUFVURVIgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBDb3VudCBjYW4gYmUgYW55CisjZGVmaW5lIF9JRF9IT1NUX0NPTVBVVEVSIDB4MDEzYworI2RlZmluZSBFWElGVEFHSURfSE9TVF9DT01QVVRFUiBcCisgIENPTlNUUlVDVF9UQUdJRChIT1NUX0NPTVBVVEVSICwgX0lEX0hPU1RfQ09NUFVURVIgKQorI2RlZmluZSBFWElGVEFHVFlQRV9IT1NUX0NPTVBVVEVSIEVYSUZfQVNDSUkKKy8vIFByZWRpY3RvcgorLy8gVXNlIEVYSUZUQUdUWVBFX1BSRURJQ1RPUiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IGNhbiBiZSBhbnkKKyNkZWZpbmUgX0lEX1BSRURJQ1RPUiAweDAxM2QKKyNkZWZpbmUgRVhJRlRBR0lEX1BSRURJQ1RPUiBDT05TVFJVQ1RfVEFHSUQoUFJFRElDVE9SICwgX0lEX1BSRURJQ1RPUiApCisjZGVmaW5lIEVYSUZUQUdUWVBFX1BSRURJQ1RPUiBFWElGX1NIT1JUCisvLyBXaGl0ZSBwb2ludCBjaHJvbWF0aWNpdHkKKy8vIFVzZSBFWElGVEFHVFlQRV9XSElURV9QT0lOVCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAyCisjZGVmaW5lIF9JRF9XSElURV9QT0lOVCAweDAxM2UKKyNkZWZpbmUgRVhJRlRBR0lEX1dISVRFX1BPSU5UIENPTlNUUlVDVF9UQUdJRChXSElURV9QT0lOVCwgX0lEX1dISVRFX1BPSU5UKQorI2RlZmluZSBFWElGVEFHVFlQRV9XSElURV9QT0lOVCBFWElGX1JBVElPTkFMCisvLyBDaHJvbWF0aWNpdGllcyBvZiBwcmltYXJpZXMKKy8vIFVzZSBFWElGVEFHVFlQRV9QUklNQVJZX0NIUk9NQVRJQ0lUSUVTIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1JBVElPTkFMKQorLy8gQ291bnQgc2hvdWxkIGJlIDYKKyNkZWZpbmUgX0lEX1BSSU1BUllfQ0hST01BVElDSVRJRVMgMHgwMTNmCisjZGVmaW5lIEVYSUZUQUdJRF9QUklNQVJZX0NIUk9NQVRJQ0lUSUVTIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFBSSU1BUllfQ0hST01BVElDSVRJRVMsIF9JRF9QUklNQVJZX0NIUk9NQVRJQ0lUSUVTKQorI2RlZmluZSBFWElGVEFHVFlQRV9QUklNQVJZX0NIUk9NQVRJQ0lUSUVTIEVYSUZfUkFUSU9OQUwKKworLy8gQ09MT1JfTUFQCisvLyBVc2UgRVhJRlRBR1RZUEVfQ09MT1JfTUFQIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDYKKyNkZWZpbmUgX0lEX0NPTE9SX01BUCAweDAxNDAKKyNkZWZpbmUgRVhJRlRBR0lEX0NPTE9SX01BUCBDT05TVFJVQ1RfVEFHSUQoQ09MT1JfTUFQLCBfSURfQ09MT1JfTUFQKQorI2RlZmluZSBFWElGVEFHVFlQRV9DT0xPUl9NQVAgRVhJRl9TSE9SVAorLy8gSEFMRlRPTkVfSElOVFMKKy8vIFVzZSBFWElGVEFHVFlQRV9IQUxGVE9ORV9ISU5UUyBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSA2CisjZGVmaW5lIF9JRF9IQUxGVE9ORV9ISU5UUyAweDAxNDEKKyNkZWZpbmUgRVhJRlRBR0lEX0hBTEZUT05FX0hJTlRTIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEhBTEZUT05FX0hJTlRTLCBfSURfSEFMRlRPTkVfSElOVFMpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0hBTEZUT05FX0hJTlRTIEVYSUZfU0hPUlQKKworLy8gVElMRV9XSURUSAorLy8gVXNlIEVYSUZUQUdUWVBFX1RJTEVfV0lEVEggYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfTE9ORykKKy8vIENvdW50IHNob3VsZCBiZSA2CisjZGVmaW5lIF9JRF9USUxFX1dJRFRIIDB4MDE0MgorI2RlZmluZSBFWElGVEFHSURfVElMRV9XSURUSCBDT05TVFJVQ1RfVEFHSUQoVElMRV9XSURUSCwgX0lEX1RJTEVfV0lEVEgpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1RJTEVfV0lEVEggRVhJRl9MT05HCisvLyBUSUxFX0xFTkdUSAorLy8gVXNlIEVYSUZUQUdUWVBFX1RJTEVfTEVOR1RIICBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9MT05HKQorLy8gQ291bnQgc2hvdWxkIGJlIDYKKyNkZWZpbmUgX0lEX1RJTEVfTEVOR1RIIDB4MDE0MworI2RlZmluZSBFWElGVEFHSURfVElMRV9MRU5HVEggQ09OU1RSVUNUX1RBR0lEKFRJTEVfTEVOR1RIICwgX0lEX1RJTEVfTEVOR1RIICkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVElMRV9MRU5HVEggRVhJRl9MT05HCisvLyBUSUxFX09GRlNFVAorLy8gVXNlIEVYSUZUQUdUWVBFX1RJTEVfT0ZGU0VUIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0xPTkcpCisvLworI2RlZmluZSBfSURfVElMRV9PRkZTRVQgMHgwMTQ0CisjZGVmaW5lIEVYSUZUQUdJRF9USUxFX09GRlNFVCBDT05TVFJVQ1RfVEFHSUQoVElMRV9PRkZTRVQgLCBfSURfVElMRV9PRkZTRVQgKQorI2RlZmluZSBFWElGVEFHVFlQRV9USUxFX09GRlNFVCBFWElGX0xPTkcKKy8vIHRpbGUgQnl0ZSBDb3VudHMKKy8vIFVzZSBFWElGVEFHVFlQRV9USUxFX09GRlNFVCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9MT05HKQorLy8KKyNkZWZpbmUgX0lEX1RJTEVfQllURV9DT1VOVFMgMHgwMTQ1CisjZGVmaW5lIEVYSUZUQUdJRF9USUxFX0JZVEVfQ09VTlRTICBcCisgIENPTlNUUlVDVF9UQUdJRChUSUxFX0JZVEVfQ09VTlRTICAsIF9JRF9USUxFX0JZVEVfQ09VTlRTICApCisjZGVmaW5lIEVYSUZUQUdUWVBFX1RJTEVfQllURV9DT1VOVFMgRVhJRl9MT05HCisKKy8vIElOS19TRVQKKy8vIFVzZSBFWElGVEFHVFlQRV9USUxFX0xFTkdUSCAgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgNgorI2RlZmluZSBfSURfSU5LX1NFVCAweDAxNGMKKyNkZWZpbmUgRVhJRlRBR0lEX0lOS19TRVQgQ09OU1RSVUNUX1RBR0lEKElOS19TRVQgLCBfSURfSU5LX1NFVCApCisjZGVmaW5lIEVYSUZUQUdUWVBFX0lOS19TRVQgRVhJRl9TSE9SVAorLy8gSU5LX05BTUVTCisvLyBVc2UgRVhJRlRBR1RZUEVfSU5LX05BTUVTICBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9BU0NJSSkKKy8vIENvdW50IHNob3VsZCBiZSA2CisjZGVmaW5lIF9JRF9JTktfTkFNRVMgMHgwMTRECisjZGVmaW5lIEVYSUZUQUdJRF9JTktfTkFNRVMgQ09OU1RSVUNUX1RBR0lEKElOS19OQU1FUyAsIF9JRF9JTktfTkFNRVMpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0lOS19OQU1FUyBFWElGX0FTQ0lJCisvLyBOVU1CRVJfT0ZfSU5LUworLy8gVXNlIEVYSUZUQUdUWVBFX05VTUJFUl9PRl9JTktTICBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSA2CisjZGVmaW5lIF9JRF9OVU1CRVJfT0ZfSU5LUyAweDAxNGUKKyNkZWZpbmUgRVhJRlRBR0lEX05VTUJFUl9PRl9JTktTIFwKKyAgQ09OU1RSVUNUX1RBR0lEKE5VTUJFUl9PRl9JTktTICwgX0lEX05VTUJFUl9PRl9JTktTICkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfTlVNQkVSX09GX0lOS1MgRVhJRl9TSE9SVAorCisvLyBET1RfUkFOR0UKKy8vIFVzZSBFWElGVEFHVFlQRV9ET1RfUkFOR0UgIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0FTQ0lJKQorLy8gQ291bnQgc2hvdWxkIGJlIDYKKyNkZWZpbmUgX0lEX0RPVF9SQU5HRSAweDAxNTAKKyNkZWZpbmUgRVhJRlRBR0lEX0RPVF9SQU5HRSBDT05TVFJVQ1RfVEFHSUQoRE9UX1JBTkdFICwgX0lEX0RPVF9SQU5HRSApCisjZGVmaW5lIEVYSUZUQUdUWVBFX0RPVF9SQU5HRSBFWElGX0FTQ0lJCisKKy8vIFRBUkdFVF9QUklOVEVSCisvLyBVc2UgRVhJRlRBR1RZUEVfVEFSR0VUX1BSSU5URVIgIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0FTQ0lJKQorLy8gQ291bnQgc2hvdWxkIGJlIDYKKyNkZWZpbmUgX0lEX1RBUkdFVF9QUklOVEVSIDB4MDE1MQorI2RlZmluZSBFWElGVEFHSURfVEFSR0VUX1BSSU5URVIgXAorICBDT05TVFJVQ1RfVEFHSUQoVEFSR0VUX1BSSU5URVIgLCBfSURfVEFSR0VUX1BSSU5URVIpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1RBUkdFVF9QUklOVEVSIEVYSUZfQVNDSUkKKy8vIEVYVFJBX1NBTVBMRVMKKy8vIFVzZSBFWElGVEFHVFlQRV9FWFRSQV9TQU1QTEVTIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDYKKyNkZWZpbmUgX0lEX0VYVFJBX1NBTVBMRVMgMHgwMTUyCisjZGVmaW5lIEVYSUZUQUdJRF9FWFRSQV9TQU1QTEVTIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEVYVFJBX1NBTVBMRVMgLCBfSURfRVhUUkFfU0FNUExFUyApCisjZGVmaW5lIEVYSUZUQUdUWVBFX0VYVFJBX1NBTVBMRVMgRVhJRl9TSE9SVAorCisvLyBTQU1QTEVfRk9STUFUCisvLyBVc2UgRVhJRlRBR1RZUEVfU0FNUExFX0ZPUk1BVCAgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgNgorI2RlZmluZSBfSURfU0FNUExFX0ZPUk1BVCAweDAxNTMKKyNkZWZpbmUgRVhJRlRBR0lEX1NBTVBMRV9GT1JNQVQgXAorICBDT05TVFJVQ1RfVEFHSUQoU0FNUExFX0ZPUk1BVCAsIF9JRF9TQU1QTEVfRk9STUFUICkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfU0FNUExFX0ZPUk1BVCBFWElGX1NIT1JUCisKKy8vIFRhYmxlIG9mIHZhbHVlcyB0aGF0IGV4dGVuZHMgdGhlIHJhbmdlIG9mIHRoZSB0cmFuc2ZlciBmdW5jdGlvbi4KKy8vIFVzZSBFWElGVEFHVFlQRV9UUkFOU0ZFUl9SQU5HRSBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSA2CisjZGVmaW5lIF9JRF9UUkFOU0ZFUl9SQU5HRSAweDAxNTYKKyNkZWZpbmUgRVhJRlRBR0lEX1RSQU5TRkVSX1JBTkdFIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFRSQU5TRkVSX1JBTkdFICwgX0lEX1RSQU5TRkVSX1JBTkdFICkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVFJBTlNGRVJfUkFOR0UgRVhJRl9TSE9SVAorCisvLyBKUEVHIGNvbXByZXNzaW9uIHByb2Nlc3MuCisvLyBVc2UgRVhJRlRBR1RZUEVfSlBFR19QUk9DIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8KKyNkZWZpbmUgX0lEX0pQRUdfUFJPQyAweDAyMDAKKyNkZWZpbmUgRVhJRlRBR0lEX0pQRUdfUFJPQyBDT05TVFJVQ1RfVEFHSUQoSlBFR19QUk9DICwgX0lEX0pQRUdfUFJPQyApCisjZGVmaW5lIEVYSUZUQUdUWVBFX0pQRUdfUFJPQyBFWElGX1NIT1JUCisKKworLy8gT2Zmc2V0IHRvIEpQRUcgU09JCisvLyBVc2UgRVhJRlRBR1RZUEVfSlBFR19JTlRFUkNIQU5HRV9GT1JNQVQgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfTE9ORykKKy8vIENvdW50IGlzIHVuZGVmaW5lZAorI2RlZmluZSBfSURfSlBFR19JTlRFUkNIQU5HRV9GT1JNQVQgMHgwMjAxCisjZGVmaW5lIEVYSUZUQUdJRF9KUEVHX0lOVEVSQ0hBTkdFX0ZPUk1BVCBcCisgIENPTlNUUlVDVF9UQUdJRChKUEVHX0lOVEVSQ0hBTkdFX0ZPUk1BVCwgX0lEX0pQRUdfSU5URVJDSEFOR0VfRk9STUFUKQorI2RlZmluZSBFWElGVEFHVFlQRV9KUEVHX0lOVEVSQ0hBTkdFX0ZPUk1BVCBFWElGX0xPTkcKKy8vIEJ5dGVzIG9mIEpQRUcgZGF0YQorLy8gVXNlIEVYSUZUQUdUWVBFX0pQRUdfSU5URVJDSEFOR0VfRk9STUFUX0xFTkdUSCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9MT05HKQorLy8gQ291bnQgaXMgdW5kZWZpbmVkCisjZGVmaW5lIF9JRF9KUEVHX0lOVEVSQ0hBTkdFX0ZPUk1BVF9MRU5HVEggMHgwMjAyCisjZGVmaW5lIEVYSUZUQUdJRF9KUEVHX0lOVEVSQ0hBTkdFX0ZPUk1BVF9MRU5HVEggXAorICBDT05TVFJVQ1RfVEFHSUQoSlBFR19JTlRFUkNIQU5HRV9GT1JNQVRfTEVOR1RILCBcCisgIF9JRF9KUEVHX0lOVEVSQ0hBTkdFX0ZPUk1BVF9MRU5HVEgpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0pQRUdfSU5URVJDSEFOR0VfRk9STUFUX0xFTkdUSCBFWElGX0xPTkcKKworLy8gTGVuZ3RoIG9mIHRoZSByZXN0YXJ0IGludGVydmFsLgorLy8gVXNlIEVYSUZUQUdUWVBFX0pQRUdfUkVTVEFSVF9JTlRFUlZBTCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IGlzIHVuZGVmaW5lZAorI2RlZmluZSBfSURfSlBFR19SRVNUQVJUX0lOVEVSVkFMIDB4MDIwMworI2RlZmluZSBFWElGVEFHSURfSlBFR19SRVNUQVJUX0lOVEVSVkFMIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEpQRUdfUkVTVEFSVF9JTlRFUlZBTCwgX0lEX0pQRUdfUkVTVEFSVF9JTlRFUlZBTCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfSlBFR19SRVNUQVJUX0lOVEVSVkFMIEVYSUZfU0hPUlQKKworLy8gSlBFR0xvc3NsZXNzUHJlZGljdG9ycworLy8gVXNlIEVYSUZUQUdUWVBFX0pQRUdfTE9TU0xFU1NfUFJFRElDVE9SUyBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IGlzIHVuZGVmaW5lZAorI2RlZmluZSBfSURfSlBFR19MT1NTTEVTU19QUkVESUNUT1JTIDB4MDIwNQorI2RlZmluZSBFWElGVEFHSURfSlBFR19MT1NTTEVTU19QUkVESUNUT1JTICBcCisgIENPTlNUUlVDVF9UQUdJRChKUEVHX0xPU1NMRVNTX1BSRURJQ1RPUlMsIF9JRF9KUEVHX0xPU1NMRVNTX1BSRURJQ1RPUlMpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0pQRUdfTE9TU0xFU1NfUFJFRElDVE9SUyBFWElGX1NIT1JUCisKKy8vIEpQRUdQb2ludFRyYW5zZm9ybXMKKy8vIFVzZSBFWElGVEFHVFlQRV9KUEVHX1BPSU5UX1RSQU5TRk9STVMgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBpcyB1bmRlZmluZWQKKyNkZWZpbmUgX0lEX0pQRUdfUE9JTlRfVFJBTlNGT1JNUyAweDAyMDYKKyNkZWZpbmUgRVhJRlRBR0lEX0pQRUdfUE9JTlRfVFJBTlNGT1JNUyAgXAorICBDT05TVFJVQ1RfVEFHSUQoSlBFR19QT0lOVF9UUkFOU0ZPUk1TLCBfSURfSlBFR19QT0lOVF9UUkFOU0ZPUk1TKQorI2RlZmluZSBFWElGVEFHVFlQRV9KUEVHX1BPSU5UX1RSQU5TRk9STVMgRVhJRl9TSE9SVAorCisvLyBKUEVHX1FfVEFCTEVTCisvLyBVc2UgRVhJRlRBR1RZUEVfSlBFR19RX1RBQkxFUyBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9MT05HKQorLy8gQ291bnQgaXMgdW5kZWZpbmVkCisjZGVmaW5lIF9JRF9KUEVHX1FfVEFCTEVTIDB4MDIwNworI2RlZmluZSBFWElGVEFHSURfSlBFR19RX1RBQkxFUyBcCisgIENPTlNUUlVDVF9UQUdJRChKUEVHX1FfVEFCTEVTLCBfSURfSlBFR19RX1RBQkxFUykKKyNkZWZpbmUgRVhJRlRBR1RZUEVfSlBFR19RX1RBQkxFUyBFWElGX0xPTkcKKy8vIEpQRUdfRENfVEFCTEVTCisvLyBVc2UgRVhJRlRBR1RZUEVfSlBFR19EQ19UQUJMRVMgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfTE9ORykKKy8vIENvdW50IGlzIHVuZGVmaW5lZAorI2RlZmluZSBfSURfSlBFR19EQ19UQUJMRVMgMHgwMjA4CisjZGVmaW5lIEVYSUZUQUdJRF9KUEVHX0RDX1RBQkxFUyBcCisgIENPTlNUUlVDVF9UQUdJRChKUEVHX0RDX1RBQkxFUywgX0lEX0pQRUdfRENfVEFCTEVTKQorI2RlZmluZSBFWElGVEFHVFlQRV9KUEVHX0RDX1RBQkxFUyBFWElGX0xPTkcKKy8vIEpQRUdfQUNfVEFCTEVTCisvLyBVc2UgRVhJRlRBR1RZUEVfSlBFR19BQ19UQUJMRVMgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfTE9ORykKKy8vIENvdW50IGlzIHVuZGVmaW5lZAorI2RlZmluZSBfSURfSlBFR19BQ19UQUJMRVMgMHgwMjA5CisjZGVmaW5lIEVYSUZUQUdJRF9KUEVHX0FDX1RBQkxFUyBcCisgIENPTlNUUlVDVF9UQUdJRChKUEVHX0FDX1RBQkxFUywgX0lEX0pQRUdfQUNfVEFCTEVTKQorI2RlZmluZSBFWElGVEFHVFlQRV9KUEVHX0FDX1RBQkxFUyBFWElGX0xPTkcKKworLy8gQ29sb3Igc3BhY2UgdHJhbnNmb3JtYXRpb24gbWF0cml4IGNvZWZmaWNpZW50cworLy8gVXNlIEVYSUZUQUdUWVBFX1lDQkNSX0NPRUZGSUNJRU5UUyBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAzCisjZGVmaW5lIF9JRF9ZQ0JDUl9DT0VGRklDSUVOVFMgMHgwMjExCisjZGVmaW5lIEVYSUZUQUdJRF9ZQ0JDUl9DT0VGRklDSUVOVFMgXAorICBDT05TVFJVQ1RfVEFHSUQoWUNCQ1JfQ09FRkZJQ0lFTlRTLCBfSURfWUNCQ1JfQ09FRkZJQ0lFTlRTKQorI2RlZmluZSBFWElGVEFHVFlQRV9ZQ0JDUl9DT0VGRklDSUVOVFMgRVhJRl9SQVRJT05BTAorLy8gU3Vic2FtcGxpbmcgcmF0aW8gb2YgWSB0byBDCisvLyBVc2UgRVhJRlRBR1RZUEVfWUNCQ1JfU1VCX1NBTVBMSU5HIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDIKKyNkZWZpbmUgX0lEX1lDQkNSX1NVQl9TQU1QTElORyAweDAyMTIKKyNkZWZpbmUgRVhJRlRBR0lEX1lDQkNSX1NVQl9TQU1QTElORyAgXAorICBDT05TVFJVQ1RfVEFHSUQoWUNCQ1JfU1VCX1NBTVBMSU5HLCBfSURfWUNCQ1JfU1VCX1NBTVBMSU5HKQorI2RlZmluZSBFWElGVEFHVFlQRV9ZQ0JDUl9TVUJfU0FNUExJTkcgRVhJRl9TSE9SVAorLy8gWSBhbmQgQyBwb3NpdGlvbmluZworLy8gVXNlIEVYSUZUQUdUWVBFX1lDQkNSX1BPU0lUSU9OSU5HIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX1lDQkNSX1BPU0lUSU9OSU5HIDB4MDIxMworI2RlZmluZSBFWElGVEFHSURfWUNCQ1JfUE9TSVRJT05JTkcgIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFlDQkNSX1BPU0lUSU9OSU5HLCBfSURfWUNCQ1JfUE9TSVRJT05JTkcpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1lDQkNSX1BPU0lUSU9OSU5HIEVYSUZfU0hPUlQKKy8vIFBhaXIgb2YgYmxhY2sgYW5kIHdoaXRlIHJlZmVyZW5jZSB2YWx1ZXMKKy8vIFVzZSBFWElGVEFHVFlQRV9SRUZFUkVOQ0VfQkxBQ0tfV0hJVEUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfUkFUSU9OQUwpCisvLyBDb3VudCBzaG91bGQgYmUgNgorI2RlZmluZSBfSURfUkVGRVJFTkNFX0JMQUNLX1dISVRFIDB4MDIxNAorI2RlZmluZSBFWElGVEFHSURfUkVGRVJFTkNFX0JMQUNLX1dISVRFIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFJFRkVSRU5DRV9CTEFDS19XSElURSwgX0lEX1JFRkVSRU5DRV9CTEFDS19XSElURSkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfUkVGRVJFTkNFX0JMQUNLX1dISVRFIEVYSUZfUkFUSU9OQUwKKy8vIEdBTU1BCisvLyBVc2UgRVhJRlRBR1RZUEVfR0FNTUEgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfUkFUSU9OQUwpCisvLyBDb3VudCBzaG91bGQgYmUgNgorI2RlZmluZSBfSURfR0FNTUEgMHgwMzAxCisjZGVmaW5lIEVYSUZUQUdJRF9HQU1NQSBDT05TVFJVQ1RfVEFHSUQoR0FNTUEsIF9JRF9HQU1NQSkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfR0FNTUEgRVhJRl9SQVRJT05BTAorLy8gTnVsbC10ZXJtaW5hdGVkIGNoYXJhY3RlciBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGFuIElDQyBwcm9maWxlLgorLy8gVXNlIEVYSUZUQUdUWVBFX0lDQ19QUk9GSUxFX0RFU0NSSVBUT1IgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBDb3VudCBzaG91bGQgYmUgNgorI2RlZmluZSBfSURfSUNDX1BST0ZJTEVfREVTQ1JJUFRPUiAweDAzMDIKKyNkZWZpbmUgRVhJRlRBR0lEX0lDQ19QUk9GSUxFX0RFU0NSSVBUT1IgXAorICBDT05TVFJVQ1RfVEFHSUQoSUNDX1BST0ZJTEVfREVTQ1JJUFRPUiwgX0lEX0lDQ19QUk9GSUxFX0RFU0NSSVBUT1IpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0lDQ19QUk9GSUxFX0RFU0NSSVBUT1IgRVhJRl9BU0NJSQorLy8gU1JHQl9SRU5ERVJJTkdfSU5URU5UCisvLyBVc2UgRVhJRlRBR1RZUEVfU1JHQl9SRU5ERVJJTkdfSU5URU5UIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0JZVEUpCisvLyBDb3VudCBzaG91bGQgYmUgNgorI2RlZmluZSBfSURfU1JHQl9SRU5ERVJJTkdfSU5URU5UIDB4MDMwMworI2RlZmluZSBFWElGVEFHSURfU1JHQl9SRU5ERVJJTkdfSU5URU5UIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFNSR0JfUkVOREVSSU5HX0lOVEVOVCwgX0lEX1NSR0JfUkVOREVSSU5HX0lOVEVOVCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfU1JHQl9SRU5ERVJJTkdfSU5URU5UIEVYSUZfQllURQorCisvLyBOdWxsLXRlcm1pbmF0ZWQgY2hhcmFjdGVyIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgdGl0bGUgb2YgdGhlIGltYWdlLgorLy8gVXNlIEVYSUZUQUdUWVBFX0lNQUdFX1RJVExFIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0FTQ0lJCQkpCisvLworI2RlZmluZSBfSURfSU1BR0VfVElUTEUgMHgwMzIwCisjZGVmaW5lIEVYSUZUQUdJRF9JTUFHRV9USVRMRSBDT05TVFJVQ1RfVEFHSUQoSU1BR0VfVElUTEUsIF9JRF9JTUFHRV9USVRMRSkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfSU1BR0VfVElUTEUgRVhJRl9BU0NJSQorCisvLyBDb3B5cmlnaHQgaG9sZGVyCisvLyBVc2UgRVhJRlRBR1RZUEVfQ09QWVJJR0hUIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0FTQ0lJKQorLy8gQ291bnQgY2FuIGJlIGFueQorI2RlZmluZSBfSURfQ09QWVJJR0hUIDB4ODI5OAorI2RlZmluZSBFWElGVEFHSURfQ09QWVJJR0hUIENPTlNUUlVDVF9UQUdJRChDT1BZUklHSFQsIF9JRF9DT1BZUklHSFQpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0NPUFlSSUdIVCBFWElGX0FTQ0lJCisvLyBPbGQgU3ViZmlsZSBUeXBlCisvLyBVc2UgRVhJRlRBR1RZUEVfTkVXX1NVQkZJTEVfVFlQRSBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IGNhbiBiZSBhbnkKKyNkZWZpbmUgX0lEX05FV19TVUJGSUxFX1RZUEUgMHgwMGZlCisjZGVmaW5lIEVYSUZUQUdJRF9ORVdfU1VCRklMRV9UWVBFIFwKKyAgQ09OU1RSVUNUX1RBR0lEKE5FV19TVUJGSUxFX1RZUEUsIF9JRF9ORVdfU1VCRklMRV9UWVBFKQorI2RlZmluZSBFWElGVEFHVFlQRV9ORVdfU1VCRklMRV9UWVBFIEVYSUZfU0hPUlQKKworLy8gTmV3IFN1YmZpbGUgVHlwZQorLy8gVXNlIEVYSUZUQUdUWVBFX05FV19TVUJGSUxFX1RZUEUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfTE9ORykKKy8vIENvdW50IGNhbiBiZSBhbnkKKyNkZWZpbmUgX0lEX1NVQkZJTEVfVFlQRSAweDAwZmYKKyNkZWZpbmUgRVhJRlRBR0lEX1NVQkZJTEVfVFlQRSBDT05TVFJVQ1RfVEFHSUQoU1VCRklMRV9UWVBFLCBfSURfU1VCRklMRV9UWVBFKQorI2RlZmluZSBFWElGVEFHVFlQRV9TVUJGSUxFX1RZUEUgRVhJRl9MT05HCisKKy8vIEltYWdlIHdpZHRoIChvZiB0aHVtYm5haWwpCisvLyBVc2UgRVhJRlRBR1RZUEVfVE5fSU1BR0VfV0lEVEggYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfTE9ORykKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9UTl9JTUFHRV9XSURUSCAweDAxMDAKKyNkZWZpbmUgRVhJRlRBR0lEX1ROX0lNQUdFX1dJRFRIIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFROX0lNQUdFX1dJRFRILCBfSURfVE5fSU1BR0VfV0lEVEgpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1ROX0lNQUdFX1dJRFRIIEVYSUZfTE9ORworLy8gSW1hZ2UgaGVpZ2h0IChvZiB0aHVtYm5haWwpCisvLyBVc2UgRVhJRlRBR1RZUEVfVE5fSU1BR0VfTEVOR1RIIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUX09SX0xPTkcpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfVE5fSU1BR0VfTEVOR1RIIDB4MDEwMQorI2RlZmluZSBFWElGVEFHSURfVE5fSU1BR0VfTEVOR1RIIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFROX0lNQUdFX0xFTkdUSCwgX0lEX1ROX0lNQUdFX0xFTkdUSCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVE5fSU1BR0VfTEVOR1RIIEVYSUZfTE9ORworLy8gTnVtYmVyIG9mIGJpdHMgcGVyIGNvbXBvbmVudCAob2YgdGh1bWJuYWlsKQorLy8gVXNlIEVYSUZUQUdUWVBFX1ROX0JJVFNfUEVSX1NBTVBMRSBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9UTl9CSVRTX1BFUl9TQU1QTEUgMHgwMTAyCisjZGVmaW5lIEVYSUZUQUdJRF9UTl9CSVRTX1BFUl9TQU1QTEUgXAorICBDT05TVFJVQ1RfVEFHSUQoVE5fQklUU19QRVJfU0FNUExFLCBfSURfVE5fQklUU19QRVJfU0FNUExFKQorI2RlZmluZSBFWElGVEFHVFlQRV9UTl9CSVRTX1BFUl9TQU1QTEUgRVhJRl9TSE9SVAorLy8gQ29tcHJlc3Npb24gc2NoZW1lIChvZiB0aHVtYm5haWwpCisvLyBVc2UgRVhJRlRBR1RZUEVfVE5fQ09NUFJFU1NJT04gYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfVE5fQ09NUFJFU1NJT04gMHgwMTAzCisjZGVmaW5lIEVYSUZUQUdJRF9UTl9DT01QUkVTU0lPTiBcCisgIENPTlNUUlVDVF9UQUdJRChUTl9DT01QUkVTU0lPTiwgX0lEX1ROX0NPTVBSRVNTSU9OKQorI2RlZmluZSBFWElGVEFHVFlQRV9UTl9DT01QUkVTU0lPTiBFWElGX1NIT1JUCisvLyBQaXhlbCBjb21wb3NpdGlvbiAob2YgdGh1bWJuYWlsKQorLy8gVXNlIEVYSUZUQUdUWVBFX1ROX1BIT1RPTUVUUklDX0lOVEVSUFJFVEFUSU9OIGFzIHRoZQorLy8gZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9UTl9QSE9UT01FVFJJQ19JTlRFUlBSRVRBVElPTiAweDAxMDYKKyNkZWZpbmUgRVhJRlRBR0lEX1ROX1BIT1RPTUVUUklDX0lOVEVSUFJFVEFUSU9OIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFROX1BIT1RPTUVUUklDX0lOVEVSUFJFVEFUSU9OLCBcCisgIF9JRF9UTl9QSE9UT01FVFJJQ19JTlRFUlBSRVRBVElPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVE5fUEhPVE9NRVRSSUNfSU5URVJQUkVUQVRJT04gRVhJRl9TSE9SVAorLy8gSW1hZ2UgdGl0bGUgKG9mIHRodW1ibmFpbCkKKy8vIFVzZSBFWElGVEFHVFlQRV9UTl9JTUFHRV9ERVNDUklQVElPTiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9BU0NJSSkKKy8vIENvdW50IGNhbiBiZSBhbnkKKyNkZWZpbmUgX0lEX1ROX0lNQUdFX0RFU0NSSVBUSU9OIDB4MDEwZQorI2RlZmluZSBFWElGVEFHSURfVE5fSU1BR0VfREVTQ1JJUFRJT04gXAorICBDT05TVFJVQ1RfVEFHSUQoVE5fSU1BR0VfREVTQ1JJUFRJT04sIF9JRF9UTl9JTUFHRV9ERVNDUklQVElPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVE5fSU1BR0VfREVTQ1JJUFRJT04gRVhJRl9BU0NJSQorLy8gSW1hZ2UgaW5wdXQgZXF1aXBtZW50IG1hbnVmYWN0dXJlciAob2YgdGh1bWJuYWlsKQorLy8gVXNlIEVYSUZUQUdUWVBFX1ROX01BS0UgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBDb3VudCBjYW4gYmUgYW55CisjZGVmaW5lIF9JRF9UTl9NQUtFIDB4MDEwZgorI2RlZmluZSBFWElGVEFHSURfVE5fTUFLRSBDT05TVFJVQ1RfVEFHSUQoVE5fTUFLRSwgX0lEX1ROX01BS0UpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1ROX01BS0UgRVhJRl9BU0NJSQorLy8gSW1hZ2UgaW5wdXQgZXF1aXBtZW50IG1vZGVsIChvZiB0aHVtYm5haWwpCisvLyBVc2UgRVhJRlRBR1RZUEVfVE5fTU9ERUwgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBDb3VudCBjYW4gYmUgYW55CisjZGVmaW5lIF9JRF9UTl9NT0RFTCAweDAxMTAKKyNkZWZpbmUgRVhJRlRBR0lEX1ROX01PREVMIENPTlNUUlVDVF9UQUdJRChUTl9NT0RFTCwgX0lEX1ROX01PREVMKQorI2RlZmluZSBFWElGVEFHVFlQRV9UTl9NT0RFTCBFWElGX0FTQ0lJCisvLyBJbWFnZSBkYXRhIGxvY2F0aW9uIChvZiB0aHVtYm5haWwpCisvLyBVc2UgRVhJRlRBR1RZUEVfVE5fU1RSSVBfT0ZGU0VUUyBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9MT05HKQorLy8gQ291bnQgPSBTdHJpcHNQZXJJbWFnZSAgICAgICAgICAgICAgICAgICAgd2hlbiBQbGFuYXJDb25maWd1cmF0aW9uID0gMQorLy8gICAgICAgPSBTYW1wbGVzUGVyUGl4ZWwgKiBTdHJpcHNQZXJJbWFnZSAgd2hlbiBQbGFuYXJDb25maWd1cmF0aW9uID0gMgorI2RlZmluZSBfSURfVE5fU1RSSVBfT0ZGU0VUUyAweDAxMTEKKyNkZWZpbmUgRVhJRlRBR0lEX1ROX1NUUklQX09GRlNFVFMgXAorICBDT05TVFJVQ1RfVEFHSUQoU1RSSVBfVE5fT0ZGU0VUUywgX0lEX1ROX1NUUklQX09GRlNFVFMpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1ROX1NUUklQX09GRlNFVFMgRVhJRl9MT05HCisvLyBPcmllbnRhdGlvbiBvZiBpbWFnZSAob2YgdGh1bWJuYWlsKQorLy8gVXNlIEVYSUZUQUdUWVBFX1ROX09SSUVOVEFUSU9OIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX1ROX09SSUVOVEFUSU9OIDB4MDExMgorI2RlZmluZSBFWElGVEFHSURfVE5fT1JJRU5UQVRJT04gXAorICBDT05TVFJVQ1RfVEFHSUQoVE5fT1JJRU5UQVRJT04sIF9JRF9UTl9PUklFTlRBVElPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVE5fT1JJRU5UQVRJT04gRVhJRl9TSE9SVAorLy8gTnVtYmVyIG9mIGNvbXBvbmVudHMgKG9mIHRodW1ibmFpbCkKKy8vIFVzZSBFWElGVEFHVFlQRV9UTl9TQU1QTEVTX1BFUl9QSVhFTCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9UTl9TQU1QTEVTX1BFUl9QSVhFTCAweDAxMTUKKyNkZWZpbmUgRVhJRlRBR0lEX1ROX1NBTVBMRVNfUEVSX1BJWEVMIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFROX1NBTVBMRVNfUEVSX1BJWEVMLCBfSURfVE5fU0FNUExFU19QRVJfUElYRUwpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1ROX1NBTVBMRVNfUEVSX1BJWEVMIEVYSUZfU0hPUlQKKy8vIE51bWJlciBvZiByb3dzIHBlciBzdHJpcCAob2YgdGh1bWJuYWlsKQorLy8gVXNlIEVYSUZUQUdUWVBFX1ROX1JPV1NfUEVSX1NUUklQIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0xPTkcpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfVE5fUk9XU19QRVJfU1RSSVAgMHgwMTE2CisjZGVmaW5lIEVYSUZUQUdJRF9UTl9ST1dTX1BFUl9TVFJJUCBcCisgIENPTlNUUlVDVF9UQUdJRChUTl9ST1dTX1BFUl9TVFJJUCwgX0lEX1ROX1JPV1NfUEVSX1NUUklQKQorI2RlZmluZSBFWElGVEFHVFlQRV9UTl9ST1dTX1BFUl9TVFJJUCBFWElGX0xPTkcKKy8vIEJ5dGVzIHBlciBjb21wcmVzc2VkIHN0cmlwIChvZiB0aHVtYm5haWwpCisvLyBVc2UgRVhJRlRBR1RZUEVfVE5fU1RSSVBfQllURV9DT1VOVFMgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfTE9ORykKKy8vIENvdW50ID0gU3RyaXBzUGVySW1hZ2UgICAgICAgICAgICAgICAgICAgIHdoZW4gUGxhbmFyQ29uZmlndXJhdGlvbiA9IDEKKy8vICAgICAgID0gU2FtcGxlc1BlclBpeGVsICogU3RyaXBzUGVySW1hZ2UgIHdoZW4gUGxhbmFyQ29uZmlndXJhdGlvbiA9IDIKKyNkZWZpbmUgX0lEX1ROX1NUUklQX0JZVEVfQ09VTlRTIDB4MDExNworI2RlZmluZSBFWElGVEFHSURfVE5fU1RSSVBfQllURV9DT1VOVFMgXAorICBDT05TVFJVQ1RfVEFHSUQoVE5fU1RSSVBfQllURV9DT1VOVFMsIF9JRF9UTl9TVFJJUF9CWVRFX0NPVU5UUykKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVE5fU1RSSVBfQllURV9DT1VOVFMgRVhJRl9MT05HCisvLyBJbWFnZSByZXNvbHV0aW9uIGluIHdpZHRoIGRpcmVjdGlvbiAob2YgdGh1bWJuYWlsKQorLy8gVXNlIEVYSUZUQUdUWVBFX1ROX1hfUkVTT0xVVElPTiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9UTl9YX1JFU09MVVRJT04gMHgwMTFhCisjZGVmaW5lIEVYSUZUQUdJRF9UTl9YX1JFU09MVVRJT04gXAorICBDT05TVFJVQ1RfVEFHSUQoVE5fWF9SRVNPTFVUSU9OLCBfSURfVE5fWF9SRVNPTFVUSU9OKQorI2RlZmluZSBFWElGVEFHVFlQRV9UTl9YX1JFU09MVVRJT04gRVhJRl9SQVRJT05BTAorLy8gSW1hZ2UgcmVzb2x1dGlvbiBpbiBoZWlnaHQgZGlyZWN0aW9uICAob2YgdGh1bWJuYWlsKQorLy8gVXNlIEVYSUZUQUdUWVBFX1ROX1lfUkVTT0xVVElPTiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9UTl9ZX1JFU09MVVRJT04gMHgwMTFiCisjZGVmaW5lIEVYSUZUQUdJRF9UTl9ZX1JFU09MVVRJT04gXAorICBDT05TVFJVQ1RfVEFHSUQoVE5fWV9SRVNPTFVUSU9OLCBfSURfVE5fWV9SRVNPTFVUSU9OKQorI2RlZmluZSBFWElGVEFHVFlQRV9UTl9ZX1JFU09MVVRJT04gRVhJRl9SQVRJT05BTAorLy8gSW1hZ2UgZGF0YSBhcnJhbmdlbWVudCAob2YgdGh1bWJuYWlsKQorLy8gVXNlIEVYSUZUQUdUWVBFX1ROX1BMQU5BUl9DT05GSUdVUkFUSU9OIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX1ROX1BMQU5BUl9DT05GSUdVUkFUSU9OIDB4MDExYworI2RlZmluZSBFWElGVEFHSURfVE5fUExBTkFSX0NPTkZJR1VSQVRJT04gXAorICBDT05TVFJVQ1RfVEFHSUQoVE5fUExBTkFSX0NPTkZJR1VSQVRJT04sIF9JRF9UTl9QTEFOQVJfQ09ORklHVVJBVElPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVE5fUExBTkFSX0NPTkZJR1VSQVRJT04gRVhJRl9TSE9SVAorLy8gVW5pdCBvZiBYIGFuZCBZIHJlc29sdXRpb24gKG9mIHRodW1ibmFpbCkKKy8vIFVzZSBFWElGVEFHVFlQRV9UTl9SRVNPTFVUSU9OX1VOSVQgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfVE5fUkVTT0xVVElPTl9VTklUIDB4MTI4CisjZGVmaW5lIEVYSUZUQUdJRF9UTl9SRVNPTFVUSU9OX1VOSVQgXAorICBDT05TVFJVQ1RfVEFHSUQoVE5fUkVTT0xVVElPTl9VTklULCBfSURfVE5fUkVTT0xVVElPTl9VTklUKQorI2RlZmluZSBFWElGVEFHVFlQRV9UTl9SRVNPTFVUSU9OX1VOSVQgRVhJRl9TSE9SVAorLy8gVHJhbnNmZXIgZnVuY3Rpb24gKG9mIHRodW1ibmFpbCkKKy8vIFVzZSBFWElGVEFHVFlQRV9UTl9UUkFOU0ZFUl9GVU5DVElPTiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSAzKjI1NgorI2RlZmluZSBfSURfVE5fVFJBTlNGRVJfRlVOQ1RJT04gMHgwMTJkCisjZGVmaW5lIEVYSUZUQUdJRF9UTl9UUkFOU0ZFUl9GVU5DVElPTiBcCisgIENPTlNUUlVDVF9UQUdJRChUTl9UUkFOU0ZFUl9GVU5DVElPTiwgX0lEX1ROX1RSQU5TRkVSX0ZVTkNUSU9OKQorI2RlZmluZSBFWElGVEFHVFlQRV9UTl9UUkFOU0ZFUl9GVU5DVElPTiBFWElGX1NIT1JUCisvLyBTb2Z0d2FyZSB1c2VkIChvZiB0aHVtYm5haWwpCisvLyBVc2UgRVhJRlRBR1RZUEVfVE5fU09GVFdBUkUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBDb3VudCBjYW4gYmUgYW55CisjZGVmaW5lIF9JRF9UTl9TT0ZUV0FSRSAweDAxMzEKKyNkZWZpbmUgRVhJRlRBR0lEX1ROX1NPRlRXQVJFIENPTlNUUlVDVF9UQUdJRChUTl9TT0ZUV0FSRSwgX0lEX1ROX1NPRlRXQVJFKQorI2RlZmluZSBFWElGVEFHVFlQRV9UTl9TT0ZUV0FSRSBFWElGX0FTQ0lJCisvLyBGaWxlIGNoYW5nZSBkYXRlIGFuZCB0aW1lIChvZiB0aHVtYm5haWwpCisvLyBVc2UgRVhJRlRBR1RZUEVfVE5fREFURV9USU1FIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0FTQ0lJKQorLy8gQ291bnQgc2hvdWxkIGJlIDIwCisjZGVmaW5lIF9JRF9UTl9EQVRFX1RJTUUgMHgwMTMyCisjZGVmaW5lIEVYSUZUQUdJRF9UTl9EQVRFX1RJTUUgQ09OU1RSVUNUX1RBR0lEKFROX0RBVEVfVElNRSwgX0lEX1ROX0RBVEVfVElNRSkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVE5fREFURV9USU1FIEVYSUZfQVNDSUkKKy8vIEFSVElTVCwgcGVyc29uIHdobyBjcmVhdGVkIHRoaXMgaW1hZ2UgKG9mIHRodW1ibmFpbCkKKy8vIFVzZSBFWElGVEFHVFlQRV9UTl9BUlRJU1QgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBDb3VudCBjYW4gYmUgYW55CisjZGVmaW5lIF9JRF9UTl9BUlRJU1QgMHgwMTNiCisjZGVmaW5lIEVYSUZUQUdJRF9UTl9BUlRJU1QgQ09OU1RSVUNUX1RBR0lEKFROX0FSVElTVCwgX0lEX1ROX0FSVElTVCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVE5fQVJUSVNUIEVYSUZfQVNDSUkKKy8vIFdoaXRlIHBvaW50IGNocm9tYXRpY2l0eSAob2YgdGh1bWJuYWlsKQorLy8gVXNlIEVYSUZUQUdUWVBFX1ROX1dISVRFX1BPSU5UIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1JBVElPTkFMKQorLy8gQ291bnQgc2hvdWxkIGJlIDIKKyNkZWZpbmUgX0lEX1ROX1dISVRFX1BPSU5UIDB4MDEzZQorI2RlZmluZSBFWElGVEFHSURfVE5fV0hJVEVfUE9JTlQgXAorICBDT05TVFJVQ1RfVEFHSUQoVE5fV0hJVEVfUE9JTlQsIF9JRF9UTl9XSElURV9QT0lOVCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVE5fV0hJVEVfUE9JTlQgRVhJRl9SQVRJT05BTAorLy8gQ2hyb21hdGljaXRpZXMgb2YgcHJpbWFyaWVzIChvZiB0aHVtYm5haWwpCisvLyBVc2UgRVhJRlRBR1RZUEVfVE5fUFJJTUFSWV9DSFJPTUFUSUNJVElFUyBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSA2CisjZGVmaW5lIF9JRF9UTl9QUklNQVJZX0NIUk9NQVRJQ0lUSUVTIDB4MDEzZgorI2RlZmluZSBFWElGVEFHSURfVE5fUFJJTUFSWV9DSFJPTUFUSUNJVElFUyBcCisgIENPTlNUUlVDVF9UQUdJRChUTl9QUklNQVJZX0NIUk9NQVRJQ0lUSUVTLCBfSURfVE5fUFJJTUFSWV9DSFJPTUFUSUNJVElFUykKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVE5fUFJJTUFSWV9DSFJPTUFUSUNJVElFUyBFWElGX1JBVElPTkFMCisvLyBPZmZzZXQgdG8gSlBFRyBTT0kgKG9mIHRodW1ibmFpbCkKKy8vIFVzZSBFWElGVEFHVFlQRV9UTl9KUEVHSU5URVJDSEFOR0VfRk9STUFUIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0xPTkcpCisvLyBDb3VudCBpcyB1bmRlZmluZWQKKyNkZWZpbmUgX0lEX1ROX0pQRUdJTlRFUkNIQU5HRV9GT1JNQVQgMHgwMjAxCisjZGVmaW5lIEVYSUZUQUdJRF9UTl9KUEVHSU5URVJDSEFOR0VfRk9STUFUIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFROX0pQRUdJTlRFUkNIQU5HRV9GT1JNQVQsIF9JRF9UTl9KUEVHSU5URVJDSEFOR0VfRk9STUFUKQorI2RlZmluZSBFWElGVEFHVFlQRV9UTl9KUEVHSU5URVJDSEFOR0VfRk9STUFUIEVYSUZfTE9ORworLy8gQnl0ZXMgb2YgSlBFRyBkYXRhIChvZiB0aHVtYm5haWwpCisvLyBVc2UgRVhJRlRBR1RZUEVfVE5fSlBFR0lOVEVSQ0hBTkdFX0ZPUk1BVF9MIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0xPTkcpCisvLyBDb3VudCBpcyB1bmRlZmluZWQKKyNkZWZpbmUgX0lEX1ROX0pQRUdJTlRFUkNIQU5HRV9GT1JNQVRfTCAweDAyMDIKKyNkZWZpbmUgRVhJRlRBR0lEX1ROX0pQRUdJTlRFUkNIQU5HRV9GT1JNQVRfTCBcCisgIENPTlNUUlVDVF9UQUdJRChUTl9KUEVHSU5URVJDSEFOR0VfRk9STUFUX0wsIF9JRF9UTl9KUEVHSU5URVJDSEFOR0VfRk9STUFUX0wpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1ROX0pQRUdJTlRFUkNIQU5HRV9GT1JNQVRfTCBFWElGX0xPTkcKKy8vIENvbG9yIHNwYWNlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBjb2VmZmljaWVudHMgKG9mIHRodW1ibmFpbCkKKy8vIFVzZSBFWElGVEFHVFlQRV9UTl9ZQ0JDUl9DT0VGRklDSUVOVFMgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfUkFUSU9OQUwpCisvLyBDb3VudCBzaG91bGQgYmUgMworI2RlZmluZSBfSURfVE5fWUNCQ1JfQ09FRkZJQ0lFTlRTIDB4MDIxMQorI2RlZmluZSBFWElGVEFHSURfVE5fWUNCQ1JfQ09FRkZJQ0lFTlRTIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFROX1lDQkNSX0NPRUZGSUNJRU5UUywgX0lEX1ROX1lDQkNSX0NPRUZGSUNJRU5UUykKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVE5fWUNCQ1JfQ09FRkZJQ0lFTlRTIEVYSUZfUkFUSU9OQUwKKy8vIFN1YnNhbXBsaW5nIHJhdGlvIG9mIFkgdG8gQyAob2YgdGh1bWJuYWlsKQorLy8gVXNlIEVYSUZUQUdUWVBFX1ROX1lDQkNSX1NVQl9TQU1QTElORyBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSAyCisjZGVmaW5lIF9JRF9UTl9ZQ0JDUl9TVUJfU0FNUExJTkcgMHgwMjEyCisjZGVmaW5lIEVYSUZUQUdJRF9UTl9ZQ0JDUl9TVUJfU0FNUExJTkcgXAorICBDT05TVFJVQ1RfVEFHSUQoVE5fWUNCQ1JfU1VCX1NBTVBMSU5HLCBfSURfVE5fWUNCQ1JfU1VCX1NBTVBMSU5HKQorI2RlZmluZSBFWElGVEFHVFlQRV9UTl9ZQ0JDUl9TVUJfU0FNUExJTkcgRVhJRl9TSE9SVAorLy8gWSBhbmQgQyBwb3NpdGlvbmluZyAob2YgdGh1bWJuYWlsKQorLy8gVXNlIEVYSUZUQUdUWVBFX1ROX1lDQkNSX1BPU0lUSU9OSU5HIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX1ROX1lDQkNSX1BPU0lUSU9OSU5HIDB4MDIxMworI2RlZmluZSBFWElGVEFHSURfVE5fWUNCQ1JfUE9TSVRJT05JTkcgXAorICBDT05TVFJVQ1RfVEFHSUQoVE5fWUNCQ1JfUE9TSVRJT05JTkcsIF9JRF9UTl9ZQ0JDUl9QT1NJVElPTklORykKKyNkZWZpbmUgRVhJRlRBR1RZUEVfVE5fWUNCQ1JfUE9TSVRJT05JTkcgICAgRVhJRl9TSE9SVAorLy8gUGFpciBvZiBibGFjayBhbmQgd2hpdGUgcmVmZXJlbmNlIHZhbHVlcyAob2YgdGh1bWJuYWlsKQorLy8gVXNlIEVYSUZUQUdUWVBFX1ROX1JFRkVSRU5DRV9CTEFDS19XSElURSBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSA2CisjZGVmaW5lIF9JRF9UTl9SRUZFUkVOQ0VfQkxBQ0tfV0hJVEUgMHgwMjE0CisjZGVmaW5lIEVYSUZUQUdJRF9UTl9SRUZFUkVOQ0VfQkxBQ0tfV0hJVEUgXAorICBDT05TVFJVQ1RfVEFHSUQoVE5fUkVGRVJFTkNFX0JMQUNLX1dISVRFLCBfSURfVE5fUkVGRVJFTkNFX0JMQUNLX1dISVRFKQorI2RlZmluZSBFWElGVEFHVFlQRV9UTl9SRUZFUkVOQ0VfQkxBQ0tfV0hJVEUgRVhJRl9SQVRJT05BTAorLy8gQ29weXJpZ2h0IGhvbGRlciAob2YgdGh1bWJuYWlsKQorLy8gVXNlIEVYSUZUQUdUWVBFX1ROX0NPUFlSSUdIVCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9BU0NJSSkKKy8vIENvdW50IGNhbiBiZSBhbnkKKyNkZWZpbmUgX0lEX1ROX0NPUFlSSUdIVCAweDgyOTgKKyNkZWZpbmUgRVhJRlRBR0lEX1ROX0NPUFlSSUdIVCBDT05TVFJVQ1RfVEFHSUQoVE5fQ09QWVJJR0hULCBfSURfVE5fQ09QWVJJR0hUKQorI2RlZmluZSBFWElGVEFHVFlQRV9UTl9DT1BZUklHSFQgRVhJRl9BU0NJSQorLy8gRXhwb3N1cmUgdGltZQorLy8gVXNlIEVYSUZUQUdUWVBFX0VYUE9TVVJFX1RJTUUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfUkFUSU9OQUwpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfRVhQT1NVUkVfVElNRSAweDgyOWEKKyNkZWZpbmUgRVhJRlRBR0lEX0VYUE9TVVJFX1RJTUUgXAorICBDT05TVFJVQ1RfVEFHSUQoRVhQT1NVUkVfVElNRSwgX0lEX0VYUE9TVVJFX1RJTUUpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0VYUE9TVVJFX1RJTUUgRVhJRl9SQVRJT05BTAorLy8gRiBudW1iZXIKKy8vIFVzZSBFWElGVEFHVFlQRV9GX05VTUJFUiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9GX05VTUJFUiAweDgyOWQKKyNkZWZpbmUgRVhJRlRBR0lEX0ZfTlVNQkVSIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEZfTlVNQkVSLCBfSURfRl9OVU1CRVIpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0ZfTlVNQkVSIEVYSUZfUkFUSU9OQUwKKy8vIEV4aWYgSUZEIHBvaW50ZXIgKE5PVCBJTlRFTkRFRCB0byBiZSBhY2Nlc3NpYmxlIHRvIHVzZXIpCisjZGVmaW5lIF9JRF9FWElGX0lGRF9QVFIgMHg4NzY5CisjZGVmaW5lIEVYSUZUQUdJRF9FWElGX0lGRF9QVFIgXAorICBDT05TVFJVQ1RfVEFHSUQoRVhJRl9JRkQsIF9JRF9FWElGX0lGRF9QVFIpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0VYSUZfSUZEX1BUUiBFWElGX0xPTkcKKworLy8gSUNDX1BST0ZJTEUgKE5PVCBJTlRFTkRFRCB0byBiZSBhY2Nlc3NpYmxlIHRvIHVzZXIpCisjZGVmaW5lIF9JRF9JQ0NfUFJPRklMRSAweDg3NzMKKyNkZWZpbmUgRVhJRlRBR0lEX0lDQ19QUk9GSUxFIENPTlNUUlVDVF9UQUdJRChJQ0NfUFJPRklMRSwgX0lEX0lDQ19QUk9GSUxFKQorI2RlZmluZSBFWElGVEFHVFlQRV9JQ0NfUFJPRklMRSBFWElGX0xPTkcKKy8vIEV4cG9zdXJlIHByb2dyYW0KKy8vIFVzZSBFWElGVEFHVFlQRV9FWFBPU1VSRV9QUk9HUkFNIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX0VYUE9TVVJFX1BST0dSQU0gMHg4ODIyCisjZGVmaW5lIEVYSUZUQUdJRF9FWFBPU1VSRV9QUk9HUkFNIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEVYUE9TVVJFX1BST0dSQU0sIF9JRF9FWFBPU1VSRV9QUk9HUkFNKQorI2RlZmluZSBFWElGVEFHVFlQRV9FWFBPU1VSRV9QUk9HUkFNIEVYSUZfU0hPUlQKKy8vIFNwZWN0cmFsIHNlbnNpdGl2aXR5CisvLyBVc2UgRVhJRlRBR1RZUEVfU1BFQ1RSQUxfU0VOU0lUSVZJVFkgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBDb3VudCBjYW4gYmUgYW55CisjZGVmaW5lIF9JRF9TUEVDVFJBTF9TRU5TSVRJVklUWSAweDg4MjQKKyNkZWZpbmUgRVhJRlRBR0lEX1NQRUNUUkFMX1NFTlNJVElWSVRZIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFNQRUNUUkFMX1NFTlNJVElWSVRZLCBfSURfU1BFQ1RSQUxfU0VOU0lUSVZJVFkpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1NQRUNUUkFMX1NFTlNJVElWSVRZIEVYSUZfQVNDSUkKKy8vIEdQUyBJRkQgcG9pbnRlciAoTk9UIElOVEVOREVEIHRvIGJlIGFjY2Vzc2libGUgdG8gdXNlcikKKyNkZWZpbmUgX0lEX0dQU19JRkRfUFRSIDB4ODgyNQorI2RlZmluZSBFWElGVEFHSURfR1BTX0lGRF9QVFIgXAorICBDT05TVFJVQ1RfVEFHSUQoR1BTX0lGRCwgX0lEX0dQU19JRkRfUFRSKQorI2RlZmluZSBFWElGVEFHVFlQRV9HUFNfSUZEX1BUUiBFWElGX0xPTkcKKy8vIElTTyBTcGVlZCBSYXRpbmcKKy8vIFVzZSBFWElGVEFHVFlQRV9JU09fU1BFRURfUkFUSU5HIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgY2FuIGJlIGFueQorI2RlZmluZSBfSURfSVNPX1NQRUVEX1JBVElORyAweDg4MjcKKyNkZWZpbmUgRVhJRlRBR0lEX0lTT19TUEVFRF9SQVRJTkcgXAorICBDT05TVFJVQ1RfVEFHSUQoSVNPX1NQRUVEX1JBVElORywgX0lEX0lTT19TUEVFRF9SQVRJTkcpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0lTT19TUEVFRF9SQVRJTkcgRVhJRl9TSE9SVAorLy8gT3B0b2VsZWN0cmljIGNvbnZlcnNpb24gZmFjdG9yCisvLyBVc2UgRVhJRlRBR1RZUEVfT0VDRiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9VTkRFRklORUQpCisvLyBDb3VudCBjYW4gYmUgYW55CisjZGVmaW5lIF9JRF9PRUNGIDB4ODgyOAorI2RlZmluZSBFWElGVEFHSURfT0VDRiBDT05TVFJVQ1RfVEFHSUQoT0VDRiwgX0lEX09FQ0YpCisjZGVmaW5lIEVYSUZUQUdUWVBFX09FQ0YgRVhJRl9VTkRFRklORUQKKy8vIEV4aWYgdmVyc2lvbgorLy8gVXNlIEVYSUZUQUdUWVBFX0VYSUZfVkVSU0lPTiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9VTkRFRklORUQpCisvLyBDb3VudCBzaG91bGQgYmUgNAorI2RlZmluZSBfSURfRVhJRl9WRVJTSU9OIDB4OTAwMAorI2RlZmluZSBFWElGVEFHSURfRVhJRl9WRVJTSU9OIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEVYSUZfVkVSU0lPTiwgX0lEX0VYSUZfVkVSU0lPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfRVhJRl9WRVJTSU9OIEVYSUZfVU5ERUZJTkVECisvLyBEYXRlIGFuZCB0aW1lIG9mIG9yaWdpbmFsIGRhdGEgZ2VybmVyYXRpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9FWElGX0RBVEVfVElNRV9PUklHSU5BTCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9BU0NJSSkKKy8vIEl0IHNob3VsZCBiZSAyMCBjaGFyYWN0ZXJzIGxvbmcgaW5jbHVkaW5nIHRoZSBudWxsLXRlcm1pbmF0aW5nIGNoYXJhY3Rlci4KKyNkZWZpbmUgX0lEX0VYSUZfREFURV9USU1FX09SSUdJTkFMIDB4OTAwMworI2RlZmluZSBFWElGVEFHSURfRVhJRl9EQVRFX1RJTUVfT1JJR0lOQUwgXAorICBDT05TVFJVQ1RfVEFHSUQoRVhJRl9EQVRFX1RJTUVfT1JJR0lOQUwsIF9JRF9FWElGX0RBVEVfVElNRV9PUklHSU5BTCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfRVhJRl9EQVRFX1RJTUVfT1JJR0lOQUwgRVhJRl9BU0NJSQorLy8gRGF0ZSBhbmQgdGltZSBvZiBkaWdpdGFsIGRhdGEgZ2VuZXJhdGlvbgorLy8gVXNlIEVYSUZUQUdUWVBFX0VYSUZfREFURV9USU1FX0RJR0lUSVpFRCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9BU0NJSSkKKy8vIEl0IHNob3VsZCBiZSAyMCBjaGFyYWN0ZXJzIGxvbmcgaW5jbHVkaW5nIHRoZSBudWxsLXRlcm1pbmF0aW5nIGNoYXJhY3Rlci4KKyNkZWZpbmUgX0lEX0VYSUZfREFURV9USU1FX0RJR0lUSVpFRCAweDkwMDQKKyNkZWZpbmUgRVhJRlRBR0lEX0VYSUZfREFURV9USU1FX0RJR0lUSVpFRCBcCisgIENPTlNUUlVDVF9UQUdJRChFWElGX0RBVEVfVElNRV9ESUdJVElaRUQsIF9JRF9FWElGX0RBVEVfVElNRV9ESUdJVElaRUQpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0VYSUZfREFURV9USU1FX0RJR0lUSVpFRCBFWElGX0FTQ0lJCisvLyBNZWFuaW5nIG9mIGVhY2ggY29tcG9uZW50CisvLyBVc2UgRVhJRlRBR1RZUEVfRVhJRl9DT01QT05FTlRTX0NPTkZJRyBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9VTkRFRklORUQpCisvLyBDb3VudCBzaG91bGQgYmUgNAorI2RlZmluZSBfSURfRVhJRl9DT01QT05FTlRTX0NPTkZJRyAweDkxMDEKKyNkZWZpbmUgRVhJRlRBR0lEX0VYSUZfQ09NUE9ORU5UU19DT05GSUcgXAorICBDT05TVFJVQ1RfVEFHSUQoRVhJRl9DT01QT05FTlRTX0NPTkZJRywgX0lEX0VYSUZfQ09NUE9ORU5UU19DT05GSUcpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0VYSUZfQ09NUE9ORU5UU19DT05GSUcgRVhJRl9VTkRFRklORUQKKy8vIE1lYW5pbmcgb2YgSW1hZ2UgY29tcHJlc3Npb24gbW9kZQorLy8gVXNlIEVYSUZUQUdUWVBFX0VYSUZfQ09NUFJFU1NFRF9CSVRTX1BFUl9QSVhFTCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9FWElGX0NPTVBSRVNTRURfQklUU19QRVJfUElYRUwgMHg5MTAyCisjZGVmaW5lIEVYSUZUQUdJRF9FWElGX0NPTVBSRVNTRURfQklUU19QRVJfUElYRUwgXAorICBDT05TVFJVQ1RfVEFHSUQoRVhJRl9DT01QUkVTU0VEX0JJVFNfUEVSX1BJWEVMLCBfSURfRVhJRl9DT01QUkVTU0VEX0JJVFNfUEVSX1BJWEVMKQorI2RlZmluZSBFWElGVEFHVFlQRV9FWElGX0NPTVBSRVNTRURfQklUU19QRVJfUElYRUwgRVhJRl9SQVRJT05BTAorLy8gU2h1dHRlciBzcGVlZAorLy8gVXNlIEVYSUZUQUdUWVBFX1NIVVRURVJfU1BFRUQgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU1JBVElPTkFMKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX1NIVVRURVJfU1BFRUQgMHg5MjAxCisjZGVmaW5lIEVYSUZUQUdJRF9TSFVUVEVSX1NQRUVEIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFNIVVRURVJfU1BFRUQsIF9JRF9TSFVUVEVSX1NQRUVEKQorI2RlZmluZSBFWElGVEFHVFlQRV9TSFVUVEVSX1NQRUVEIEVYSUZfU1JBVElPTkFMCisvLyBBcGVydHVyZQorLy8gVXNlIEVYSUZUQUdUWVBFX0FQRVJUVVJFIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1JBVElPTkFMKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX0FQRVJUVVJFIDB4OTIwMgorI2RlZmluZSBFWElGVEFHSURfQVBFUlRVUkUgQ09OU1RSVUNUX1RBR0lEKEFQRVJUVVJFLCBfSURfQVBFUlRVUkUpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0FQRVJUVVJFIEVYSUZfUkFUSU9OQUwKKy8vIEJyaWd0aG5lc3MKKy8vIFVzZSBFWElGVEFHVFlQRV9CUklHSFRORVNTIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NSQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9CUklHSFRORVNTIDB4OTIwMworI2RlZmluZSBFWElGVEFHSURfQlJJR0hUTkVTUyBDT05TVFJVQ1RfVEFHSUQoQlJJR0hUTkVTUywgX0lEX0JSSUdIVE5FU1MpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0JSSUdIVE5FU1MgRVhJRl9TUkFUSU9OQUwKKy8vIEV4cG9zdXJlIGJpYXMKKy8vIFVzZSBFWElGVEFHVFlQRV9FWFBPU1VSRV9CSUFTX1ZBTFVFIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NSQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9FWFBPU1VSRV9CSUFTX1ZBTFVFIDB4OTIwNAorI2RlZmluZSBFWElGVEFHSURfRVhQT1NVUkVfQklBU19WQUxVRSBcCisgIENPTlNUUlVDVF9UQUdJRChFWFBPU1VSRV9CSUFTX1ZBTFVFLCBfSURfRVhQT1NVUkVfQklBU19WQUxVRSkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfRVhQT1NVUkVfQklBU19WQUxVRSBFWElGX1NSQVRJT05BTAorLy8gTWF4aW11bSBsZW5zIGFwZXJ0dXJlCisvLyBVc2UgRVhJRlRBR1RZUEVfTUFYX0FQRVJUVVJFIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1JBVElPTkFMKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX01BWF9BUEVSVFVSRSAweDkyMDUKKyNkZWZpbmUgRVhJRlRBR0lEX01BWF9BUEVSVFVSRSBDT05TVFJVQ1RfVEFHSUQoTUFYX0FQRVJUVVJFLCBfSURfTUFYX0FQRVJUVVJFKQorI2RlZmluZSBFWElGVEFHVFlQRV9NQVhfQVBFUlRVUkUgRVhJRl9SQVRJT05BTAorLy8gU3ViamVjdCBkaXN0YW5jZQorLy8gVXNlIEVYSUZUQUdUWVBFX1NVQkpFQ1RfRElTVEFOQ0UgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfUkFUSU9OQUwpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfU1VCSkVDVF9ESVNUQU5DRSAweDkyMDYKKyNkZWZpbmUgRVhJRlRBR0lEX1NVQkpFQ1RfRElTVEFOQ0UgXAorICBDT05TVFJVQ1RfVEFHSUQoU1VCSkVDVF9ESVNUQU5DRSwgX0lEX1NVQkpFQ1RfRElTVEFOQ0UpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1NVQkpFQ1RfRElTVEFOQ0UgRVhJRl9SQVRJT05BTAorLy8gTWV0ZXJpbmcgbW9kZQorLy8gVXNlIEVYSUZUQUdUWVBFX01FVEVSSU5HX01PREUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfTUVURVJJTkdfTU9ERSAweDkyMDcKKyNkZWZpbmUgRVhJRlRBR0lEX01FVEVSSU5HX01PREUgXAorICBDT05TVFJVQ1RfVEFHSUQoTUVURVJJTkdfTU9ERSwgX0lEX01FVEVSSU5HX01PREUpCisjZGVmaW5lIEVYSUZUQUdUWVBFX01FVEVSSU5HX01PREUgRVhJRl9TSE9SVAorLy8gTGlnaHQgc291cmNlCisvLyBVc2UgRVhJRlRBR1RZUEVfTElHSFRfU09VUkNFIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX0xJR0hUX1NPVVJDRSAweDkyMDgKKyNkZWZpbmUgRVhJRlRBR0lEX0xJR0hUX1NPVVJDRSBDT05TVFJVQ1RfVEFHSUQoTElHSFRfU09VUkNFLCBfSURfTElHSFRfU09VUkNFKQorI2RlZmluZSBFWElGVEFHVFlQRV9MSUdIVF9TT1VSQ0UgRVhJRl9TSE9SVAorLy8gRmxhc2gKKy8vIFVzZSBFWElGVEFHVFlQRV9GTEFTSCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9GTEFTSCAweDkyMDkKKyNkZWZpbmUgRVhJRlRBR0lEX0ZMQVNIIENPTlNUUlVDVF9UQUdJRChGTEFTSCwgX0lEX0ZMQVNIKQorI2RlZmluZSBFWElGVEFHVFlQRV9GTEFTSCBFWElGX1NIT1JUCisvLyBMZW5zIGZvY2FsIGxlbmd0aAorLy8gVXNlIEVYSUZUQUdUWVBFX0ZPQ0FMX0xFTkdUSCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9GT0NBTF9MRU5HVEggMHg5MjBhCisjZGVmaW5lIEVYSUZUQUdJRF9GT0NBTF9MRU5HVEggQ09OU1RSVUNUX1RBR0lEKEZPQ0FMX0xFTkdUSCwgX0lEX0ZPQ0FMX0xFTkdUSCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfRk9DQUxfTEVOR1RIIEVYSUZfUkFUSU9OQUwKKy8vIFN1YmplY3QgYXJlYQorLy8gVXNlIEVYSUZUQUdUWVBFX1NVQkpFQ1RfQVJFQSBhcyBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDIgb3IgMyBvciA0CisjZGVmaW5lIF9JRF9TVUJKRUNUX0FSRUEgMHg5MjE0CisjZGVmaW5lIEVYSUZUQUdJRF9TVUJKRUNUX0FSRUEgQ09OU1RSVUNUX1RBR0lEKFNVQkpFQ1RfQVJFQSwgX0lEX1NVQkpFQ1RfQVJFQSkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfU1VCSkVDVF9BUkVBIEVYSUZfU0hPUlQKKy8vIE1ha2VyIG5vdGUKKy8vIFVzZSBFWElGVEFHVFlQRV9FWElGX01BS0VSX05PVEUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfVU5ERUZJTkVEKQorLy8gQ291bnQgY2FuIGJlIGFueQorI2RlZmluZSBfSURfRVhJRl9NQUtFUl9OT1RFIDB4OTI3YworI2RlZmluZSBFWElGVEFHSURfRVhJRl9NQUtFUl9OT1RFIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEVYSUZfTUFLRVJfTk9URSwgX0lEX0VYSUZfTUFLRVJfTk9URSkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfRVhJRl9NQUtFUl9OT1RFIEVYSUZfVU5ERUZJTkVECisvLyBVc2VyIGNvbW1lbnRzCisvLyBVc2UgRVhJRlRBR1RZUEVfRVhJRl9VU0VSX0NPTU1FTlQgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfVU5ERUZJTkVEKQorLy8gQ291bnQgY2FuIGJlIGFueQorI2RlZmluZSBfSURfRVhJRl9VU0VSX0NPTU1FTlQgMHg5Mjg2CisjZGVmaW5lIEVYSUZUQUdJRF9FWElGX1VTRVJfQ09NTUVOVCBcCisgIENPTlNUUlVDVF9UQUdJRChFWElGX1VTRVJfQ09NTUVOVCwgX0lEX0VYSUZfVVNFUl9DT01NRU5UKQorI2RlZmluZSBFWElGVEFHVFlQRV9FWElGX1VTRVJfQ09NTUVOVCBFWElGX1VOREVGSU5FRAorLy8gRGF0ZSB0aW1lIHN1Yi1zZWNvbmRzCisvLyBVc2UgRVhJRlRBR1RZUEVfU1VCU0VDX1RJTUUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBDb3VudCBjb3VsZCBiZSBhbnkKKyNkZWZpbmUgX0lEX1NVQlNFQ19USU1FIDB4OTI5MAorI2RlZmluZSBFWElGVEFHSURfU1VCU0VDX1RJTUUgQ09OU1RSVUNUX1RBR0lEKFNVQlNFQ19USU1FLCBfSURfU1VCU0VDX1RJTUUpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1NFQlNFQ19USU1FIEVYSUZfQVNDSUkKKy8vIERhdGUgdGltZSBvcmlnaW5hbCBzdWItc2Vjb25kcworLy8gdXNlIEVYSUZUQUdUWVBFX1NVQlNFQ19USU1FX09SSUdJTkFMIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX0FTQ0lJKQorLy8gQ291bnQgY291bGQgYmUgYW55CisjZGVmaW5lIF9JRF9TVUJTRUNfVElNRV9PUklHSU5BTCAweDkyOTEKKyNkZWZpbmUgRVhJRlRBR0lEX1NVQlNFQ19USU1FX09SSUdJTkFMIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFNVQlNFQ19USU1FX09SSUdJTkFMLCBfSURfU1VCU0VDX1RJTUVfT1JJR0lOQUwpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1NVQlNFQ19USU1FX09SSUdJTkFMIEVYSUZfQVNDSUkKKy8vIERhdGUgdGltZSBkaWdpdGl6ZWQgc3ViLXNlY29uZHMKKy8vIHVzZSBFWElGVEFHVFlQRV9TVUJTRUNfVElNRV9ESUdJVElaRUQgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBDb3VudCBjb3VsZCBiZSBhbnkKKyNkZWZpbmUgX0lEX1NVQlNFQ19USU1FX0RJR0lUSVpFRCAweDkyOTIKKyNkZWZpbmUgRVhJRlRBR0lEX1NVQlNFQ19USU1FX0RJR0lUSVpFRCBcCisgIENPTlNUUlVDVF9UQUdJRChTVUJTRUNfVElNRV9ESUdJVElaRUQsIF9JRF9TVUJTRUNfVElNRV9ESUdJVElaRUQpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1NVQlNFQ19USU1FX0RJR0lUSVpFRCBFWElGX0FTQ0lJCisvLyBTdXBwb3J0ZWQgRmxhc2hwaXggdmVyc2lvbgorLy8gVXNlIEVYSUZUQUdUWVBFX0VYSUZfRkxBU0hQSVhfVkVSU0lPTiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9VTkRFRklORUQpCisvLyBDb3VudCBzaG91bGQgYmUgNAorI2RlZmluZSBfSURfRVhJRl9GTEFTSFBJWF9WRVJTSU9OIDB4YTAwMAorI2RlZmluZSBFWElGVEFHSURfRVhJRl9GTEFTSFBJWF9WRVJTSU9OIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEVYSUZfRkxBU0hQSVhfVkVSU0lPTiwgX0lEX0VYSUZfRkxBU0hQSVhfVkVSU0lPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfRVhJRl9GTEFTSFBJWF9WRVJTSU9OIEVYSUZfVU5ERUZJTkVECisvLyAgQ29sb3Igc3BhY2UgaW5mb3JtYXRpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9FWElGX0NPTE9SX1NQQUNFIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX0VYSUZfQ09MT1JfU1BBQ0UgMHhhMDAxCisjZGVmaW5lIEVYSUZUQUdJRF9FWElGX0NPTE9SX1NQQUNFIFwKKyAgQ09OU1RSVUNUX1RBR0lEKEVYSUZfQ09MT1JfU1BBQ0UsIF9JRF9FWElGX0NPTE9SX1NQQUNFKQorI2RlZmluZSBFWElGVEFHVFlQRV9FWElGX0NPTE9SX1NQQUNFIEVYSUZfU0hPUlQKKy8vICBWYWxpZCBpbWFnZSB3aWR0aAorLy8gVXNlIEVYSUZUQUdUWVBFX0VYSUZfUElYRUxfWF9ESU1FTlNJT04gYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfRVhJRl9QSVhFTF9YX0RJTUVOU0lPTiAweGEwMDIKKyNkZWZpbmUgRVhJRlRBR0lEX0VYSUZfUElYRUxfWF9ESU1FTlNJT04gXAorICBDT05TVFJVQ1RfVEFHSUQoRVhJRl9QSVhFTF9YX0RJTUVOU0lPTiwgX0lEX0VYSUZfUElYRUxfWF9ESU1FTlNJT04pCisjZGVmaW5lIEVYSUZUQUdUWVBFX0VYSUZfUElYRUxfWF9ESU1FTlNJT04gRVhJRl9TSE9SVAorLy8gVmFsaWQgaW1hZ2UgaGVpZ2h0CisvLyBVc2UgRVhJRlRBR1RZUEVfRVhJRl9QSVhFTF9ZX0RJTUVOU0lPTiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9FWElGX1BJWEVMX1lfRElNRU5TSU9OIDB4YTAwMworI2RlZmluZSBFWElGVEFHSURfRVhJRl9QSVhFTF9ZX0RJTUVOU0lPTiBcCisgIENPTlNUUlVDVF9UQUdJRChFWElGX1BJWEVMX1lfRElNRU5TSU9OLCBfSURfRVhJRl9QSVhFTF9ZX0RJTUVOU0lPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfRVhJRl9QSVhFTF9ZX0RJTUVOU0lPTiAgRVhJRl9TSE9SVAorLy8gUmVsYXRlZCBhdWRpbyBmaWxlCisvLyBVc2UgRVhJRlRBR1RZUEVfRVhJRl9SRUxBVEVEX1NPVU5EX0ZJTEUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfQVNDSUkpCisvLyBDb3VudCBzaG91bGQgYmUgMTMKKyNkZWZpbmUgX0lEX1JFTEFURURfU09VTkRfRklMRSAweGEwMDQKKyNkZWZpbmUgRVhJRlRBR0lEX1JFTEFURURfU09VTkRfRklMRSBcCisgIENPTlNUUlVDVF9UQUdJRChSRUxBVEVEX1NPVU5EX0ZJTEUsIF9JRF9SRUxBVEVEX1NPVU5EX0ZJTEUpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1JFTEFURURfU09VTkRfRklMRSBFWElGX0FTQ0lJCisvLyBJbnRlcm9wIElGRCBwb2ludGVyIChOT1QgSU5URU5ERUQgdG8gYmUgYWNjZXNzaWJsZSB0byB1c2VyKQorI2RlZmluZSBfSURfSU5URVJPUF9JRkRfUFRSIDB4YTAwNQorI2RlZmluZSBFWElGVEFHSURfSU5URVJPUF9JRkRfUFRSIENPTlNUUlVDVF9UQUdJRChJTlRFUk9QLCBfSURfSU5URVJPUF9JRkRfUFRSKQorI2RlZmluZSBFWElGVEFHVFlQRV9JTlRFUk9QX0lGRF9QVFIgRVhJRl9MT05HCisvLyBGbGFzaCBlbmVyZ3kKKy8vIFVzZSBFWElGVEFHVFlQRV9FWElGX0ZMQVNIX0VORVJHWSBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9GTEFTSF9FTkVSR1kgMHhhMjBiCisjZGVmaW5lIEVYSUZUQUdJRF9GTEFTSF9FTkVSR1kgQ09OU1RSVUNUX1RBR0lEKEZMQVNIX0VORVJHWSwgX0lEX0ZMQVNIX0VORVJHWSkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfRkxBU0hfRU5FUkdZIEVYSUZfUkFUSU9OQUwKKy8vIFNwYXRpYWwgZnJlcXVlbmN5IHJlc3BvbnNlCisvLyBVc2UgRVhJRlRBR1RZUEVfU1BBVElBTF9GUkVRX1JFU1BPTlNFIGFzIGV4aWZfdGFnX3R5cGUgKEVYSUZfVU5ERUZJTkVEKQorLy8gQ291bnQgd291bGQgYmUgYW55CisjZGVmaW5lIF9JRF9TUEFUSUFMX0ZSRVFfUkVTUE9OU0UgMHhhMjBjCisjZGVmaW5lIEVYSUZUQUdJRF9TUEFUSUFMX0ZSRVFfUkVTUE9OU0UgXAorICBDT05TVFJVQ1RfVEFHSUQoU1BBVElBTF9GUkVRX1JFU1BPTlNFLCBfSURfU1BBVElBTF9GUkVRX1JFU1BPTlNFKQorI2RlZmluZSBFWElGVEFHVFlQRV9TUEFUSUFMX0ZSRVFfUkVTUE9OU0UgRVhJRl9VTkRFRklORUQKKy8vIEZvY2FsIHBsYW5lIHggcmVzb2x1dGlvbgorLy8gVXNlIEVYSUZUQUdUWVBFX0ZPQ0FMX1BMQU5FX1hfUkVTT0xVVElPTiBhcyBleGlmX3RhZ190eXBlIChFWElGX1JBVElPTkFMKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX0ZPQ0FMX1BMQU5FX1hfUkVTT0xVVElPTiAweGEyMGUKKyNkZWZpbmUgRVhJRlRBR0lEX0ZPQ0FMX1BMQU5FX1hfUkVTT0xVVElPTiBcCisgIENPTlNUUlVDVF9UQUdJRChGT0NBTF9QTEFORV9YX1JFU09MVVRJT04sIF9JRF9GT0NBTF9QTEFORV9YX1JFU09MVVRJT04pCisjZGVmaW5lIEVYSUZUQUdUWVBFX0ZPQ0FMX1BMQU5FX1hfUkVTT0xVVElPTiBFWElGX1JBVElPTkFMCisvLyBGb2NhbCBwbGFuZSB5IHJlc29sdXRpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9GT0NBTF9QTEFORV9ZX1JFU09MVVRJT04gYXMgZXhpZl90YWdfdHlwZSAoRVhJRl9SQVRJT05BTCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9GT0NBTF9QTEFORV9ZX1JFU09MVVRJT04gMHhhMjBmCisjZGVmaW5lIEVYSUZUQUdJRF9GT0NBTF9QTEFORV9ZX1JFU09MVVRJT04gXAorICBDT05TVFJVQ1RfVEFHSUQoRk9DQUxfUExBTkVfWV9SRVNPTFVUSU9OLCBfSURfRk9DQUxfUExBTkVfWV9SRVNPTFVUSU9OKQorI2RlZmluZSBFWElGVEFHVFlQRV9GT0NBTF9QTEFORV9ZX1JFU09MVVRJT04gRVhJRl9SQVRJT05BTAorLy8gRm9jYWwgcGxhbmUgIHJlc29sdXRpb24gdW5pdAorLy8gVXNlIEVYSUZUQUdUWVBFX0ZPQ0FMX1BMQU5FX1JFU09MVVRJT05fVU5JVCBhcyBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX0ZPQ0FMX1BMQU5FX1JFU09MVVRJT05fVU5JVCAweGEyMTAKKyNkZWZpbmUgRVhJRlRBR0lEX0ZPQ0FMX1BMQU5FX1JFU09MVVRJT05fVU5JVCBcCisgIENPTlNUUlVDVF9UQUdJRChGT0NBTF9QTEFORV9SRVNPTFVUSU9OX1VOSVQsIF9JRF9GT0NBTF9QTEFORV9SRVNPTFVUSU9OX1VOSVQpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0ZPQ0FMX1BMQU5FX1JFU09MVVRJT05fVU5JVCBFWElGX1NIT1JUCisvLyBTdWJqZWN0IGxvY2F0aW9uCisvLyBVc2UgRVhJRlRBR1RZUEVfU1VCSkVDVF9MT0NBVElPTiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSAyCisjZGVmaW5lIF9JRF9TVUJKRUNUX0xPQ0FUSU9OIDB4YTIxNAorI2RlZmluZSBFWElGVEFHSURfU1VCSkVDVF9MT0NBVElPTiBcCisgIENPTlNUUlVDVF9UQUdJRChTVUJKRUNUX0xPQ0FUSU9OLCBfSURfU1VCSkVDVF9MT0NBVElPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfU1VCSkVDVF9MT0NBVElPTiBFWElGX1NIT1JUCisvLyBFeHBvc3VyZSBpbmRleAorLy8gVXNlIEVYSUZUQUdUWVBFX0VYUE9TVVJFX0lOREVYIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1JBVElPTkFMKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX0VYUE9TVVJFX0lOREVYIDB4YTIxNQorI2RlZmluZSBFWElGVEFHSURfRVhQT1NVUkVfSU5ERVggXAorICBDT05TVFJVQ1RfVEFHSUQoRVhQT1NVUkVfSU5ERVgsIF9JRF9FWFBPU1VSRV9JTkRFWCkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfRVhQT1NVUkVfSU5ERVggRVhJRl9SQVRJT05BTAorLy8gU2Vuc2luZyBtZXRob2QKKy8vIFVzZSBFWElGVEFHVFlQRV9TRU5TSU5HX01FVEhPRCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9TRU5TSU5HX01FVEhPRCAweGEyMTcKKyNkZWZpbmUgRVhJRlRBR0lEX1NFTlNJTkdfTUVUSE9EIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFNFTlNJTkdfTUVUSE9ELCBfSURfU0VOU0lOR19NRVRIT0QpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1NFTlNJTkdfTUVUSE9EIEVYSUZfU0hPUlQKKy8vIEZpbGUgc291cmNlCisvLyBVc2UgRVhJRlRBR1RZUEVfRklMRV9TT1VSQ0UgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfVU5ERUZJTkVEKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX0ZJTEVfU09VUkNFIDB4YTMwMAorI2RlZmluZSBFWElGVEFHSURfRklMRV9TT1VSQ0UgQ09OU1RSVUNUX1RBR0lEKEZJTEVfU09VUkNFLCBfSURfRklMRV9TT1VSQ0UpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0ZJTEVfU09VUkNFIEVYSUZfVU5ERUZJTkVECisvLyBTY2VuZSB0eXBlCisvLyBVc2UgRVhJRlRBR1RZUEVfU0NFTkVfVFlQRSBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9VTkRFRklORUQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfU0NFTkVfVFlQRSAweGEzMDEKKyNkZWZpbmUgRVhJRlRBR0lEX1NDRU5FX1RZUEUgQ09OU1RSVUNUX1RBR0lEKFNDRU5FX1RZUEUsIF9JRF9TQ0VORV9UWVBFKQorI2RlZmluZSBFWElGVEFHVFlQRV9TQ0VORV9UWVBFIEVYSUZfVU5ERUZJTkVECisvLyBDRkEgcGF0dGVybgorLy8gVXNlIEVYSUZUQUdUWVBFX0NGQV9QQVRURVJOIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1VOREVGSU5FRCkKKy8vIENvdW50IGNhbiBiZSBhbnkKKyNkZWZpbmUgX0lEX0NGQV9QQVRURVJOIDB4YTMwMgorI2RlZmluZSBFWElGVEFHSURfQ0ZBX1BBVFRFUk4gQ09OU1RSVUNUX1RBR0lEKENGQV9QQVRURVJOLCBfSURfQ0ZBX1BBVFRFUk4pCisjZGVmaW5lIEVYSUZUQUdUWVBFX0NGQV9QQVRURVJOIEVYSUZfVU5ERUZJTkVECisvLyBDdXN0b20gaW1hZ2UgcHJvY2Vzc2luZworLy8gVXNlIEVYSUZUQUdUWVBFX0NVU1RPTV9SRU5ERVJFRCBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9TSE9SVCkKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9DVVNUT01fUkVOREVSRUQgMHhhNDAxCisjZGVmaW5lIEVYSUZUQUdJRF9DVVNUT01fUkVOREVSRUQgXAorICBDT05TVFJVQ1RfVEFHSUQoQ1VTVE9NX1JFTkRFUkVELCBfSURfQ1VTVE9NX1JFTkRFUkVEKQorI2RlZmluZSBFWElGVEFHVFlQRV9DVVNUT01fUkVOREVSRUQgRVhJRl9TSE9SVAorLy8gRXhwb3N1cmUgbW9kZQorLy8gVXNlIEVYSUZUQUdUWVBFX0VYUE9TVVJFX01PREUgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfRVhQT1NVUkVfTU9ERSAweGE0MDIKKyNkZWZpbmUgRVhJRlRBR0lEX0VYUE9TVVJFX01PREUgXAorICBDT05TVFJVQ1RfVEFHSUQoRVhQT1NVUkVfTU9ERSwgX0lEX0VYUE9TVVJFX01PREUpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0VYUE9TVVJFX01PREUgRVhJRl9TSE9SVAorLy8gV2hpdGUgYmFsYW5jZQorLy8gVXNlIEVYSUZUQUdUWVBFX1dISVRFX0JBTEFOQ0UgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfV0hJVEVfQkFMQU5DRSAweGE0MDMKKyNkZWZpbmUgRVhJRlRBR0lEX1dISVRFX0JBTEFOQ0UgXAorICBDT05TVFJVQ1RfVEFHSUQoV0hJVEVfQkFMQU5DRSwgX0lEX1dISVRFX0JBTEFOQ0UpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1dISVRFX0JBTEFOQ0UgRVhJRl9TSE9SVAorLy8gRGlnaXRhbCB6b29tIHJhdGlvCisvLyBVc2UgRVhJRlRBR1RZUEVfRElHSVRBTF9aT09NX1JBVElPIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1JBVElPTkFMKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX0RJR0lUQUxfWk9PTV9SQVRJTyAweGE0MDQKKyNkZWZpbmUgRVhJRlRBR0lEX0RJR0lUQUxfWk9PTV9SQVRJTyBcCisgIENPTlNUUlVDVF9UQUdJRChESUdJVEFMX1pPT01fUkFUSU8sIF9JRF9ESUdJVEFMX1pPT01fUkFUSU8pCisjZGVmaW5lIEVYSUZUQUdUWVBFX0RJR0lUQUxfWk9PTV9SQVRJTyBFWElGX1JBVElPTkFMCisvLyBGb2NhbCBsZW5ndGggaW4gMzVtbSBmaWxtCisvLyBVc2UgRVhJRlRBR1RZUEVfRk9DQUxfTEVOR1RIXzM1TU0gYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfRk9DQUxfTEVOR1RIXzM1TU0gMHhhNDA1CisjZGVmaW5lIEVYSUZUQUdJRF9GT0NBTF9MRU5HVEhfMzVNTSBDT05TVFJVQ1RfVEFHSUQoRk9DQUxfTEVOR1RIXzM1TU0sIF9JRF9GT0NBTF9MRU5HVEhfMzVNTSkKKyNkZWZpbmUgRVhJRlRBR1RZUEVfRk9DQUxfTEVOR1RIXzM1TU0gRVhJRl9TSE9SVAorLy8gU2NlbmUgY2FwdHVyZSB0eXBlCisvLyBVc2UgRVhJRlRBR1RZUEVfU0NFTkVfQ0FQVFVSRV9UWVBFIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX1NDRU5FX0NBUFRVUkVfVFlQRSAweGE0MDYKKyNkZWZpbmUgRVhJRlRBR0lEX1NDRU5FX0NBUFRVUkVfVFlQRSBcCisgIENPTlNUUlVDVF9UQUdJRChTQ0VORV9DQVBUVVJFX1RZUEUsIF9JRF9TQ0VORV9DQVBUVVJFX1RZUEUpCisjZGVmaW5lIEVYSUZUQUdUWVBFX1NDRU5FX0NBUFRVUkVfVFlQRSBFWElGX1NIT1JUCisvLyBHYWluIGNvbnRyb2wKKy8vIFVzZSBFWElGVEFHVFlQRV9HQUlOX0NPTlRST0wgYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfU0hPUlQpCisvLyBDb3VudCBzaG91bGQgYmUgMQorI2RlZmluZSBfSURfR0FJTl9DT05UUk9MIDB4YTQwNworI2RlZmluZSBFWElGVEFHSURfR0FJTl9DT05UUk9MIENPTlNUUlVDVF9UQUdJRChHQUlOX0NPTlRST0wsIF9JRF9HQUlOX0NPTlRST0wpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0dBSU5fQ09OVFJPTCBFWElGX1NIT1JUCisvLyBDb250cmFzdAorLy8gVXNlIEVYSUZUQUdUWVBFX0NPTlRSQVNUIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX0NPTlRSQVNUIDB4YTQwOAorI2RlZmluZSBFWElGVEFHSURfQ09OVFJBU1QgQ09OU1RSVUNUX1RBR0lEKENPTlRSQVNULCBfSURfQ09OVFJBU1QpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0NPTlRSQVNUIEVYSUZfU0hPUlQKKy8vIFNhdHVyYXRpb24KKy8vIFVzZSBFWElGVEFHVFlQRV9TQVRVUkFUSU9OIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX1NBVFVSQVRJT04gIDB4YTQwOQorI2RlZmluZSBFWElGVEFHSURfU0FUVVJBVElPTiBDT05TVFJVQ1RfVEFHSUQoU0FUVVJBVElPTiwgX0lEX1NBVFVSQVRJT04pCisjZGVmaW5lIEVYSUZUQUdUWVBFX1NBVFVSQVRJT04gRVhJRl9TSE9SVAorLy8gU2hhcnBuZXNzCisvLyBVc2UgRVhJRlRBR1RZUEVfU0hBUlBORVNTIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX1NIQVJQTkVTUyAweGE0MGEKKyNkZWZpbmUgRVhJRlRBR0lEX1NIQVJQTkVTUyBDT05TVFJVQ1RfVEFHSUQoU0hBUlBORVNTLCBfSURfU0hBUlBORVNTKQorI2RlZmluZSBFWElGVEFHVFlQRV9TSEFSUE5FU1MgRVhJRl9TSE9SVAorLy8gRGV2aWNlIHNldHRpbmdzIGRlc2NyaXB0aW9uCisvLyBVc2UgRVhJRlRBR0lEX0RFVklDRV9TRVRUSU5HU19ERVNDUklQVElPTiBhcyBleGlmX3RhZ190eXBlIChFWElGX1VOREVGSU5FRCkKKy8vIENvdW50IGNvdWxkIGJlIGFueQorI2RlZmluZSBfSURfREVWSUNFX1NFVFRJTkdTX0RFU0NSSVBUSU9OIDB4YTQwYgorI2RlZmluZSBFWElGVEFHSURfREVWSUNFX1NFVFRJTkdTX0RFU0NSSVBUSU9OIFwKKyAgQ09OU1RSVUNUX1RBR0lEKERFVklDRV9TRVRUSU5HU19ERVNDUklQVElPTiwgX0lEX0RFVklDRV9TRVRUSU5HU19ERVNDUklQVElPTikKKyNkZWZpbmUgRVhJRlRBR1RZUEVfREVWSUNfU0VUVElHTlNfREVTQ1JJUFRJT04gRVhJRl9VTkRFRklORUQKKy8vIFN1YmplY3QgZGlzdGFuY2UgcmFuZ2UKKy8vIFVzZSBFWElGVEFHVFlQRV9TVUJKRUNUX0RJU1RBTkNFX1JBTkdFIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1NIT1JUKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX1NVQkpFQ1RfRElTVEFOQ0VfUkFOR0UgMHhhNDBjCisjZGVmaW5lIEVYSUZUQUdJRF9TVUJKRUNUX0RJU1RBTkNFX1JBTkdFIFwKKyAgQ09OU1RSVUNUX1RBR0lEKFNVQkpFQ1RfRElTVEFOQ0VfUkFOR0UsIF9JRF9TVUJKRUNUX0RJU1RBTkNFX1JBTkdFKQorI2RlZmluZSBFWElGVEFHVFlQRV9TVUJKRUNUX0RJU1RBTkNFX1JBTkdFIEVYSUZfU0hPUlQKKy8vIFVuaXF1ZSBpbWFnZSBpZAorLy8gVXNlIEVYSUZUQUdfVFlQRV9JTUFHRV9VSURhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9BU0NJSSkKKy8vIENvdW50IHNob3VsZCBiZSAzMworI2RlZmluZSBfSURfSU1BR0VfVUlEIDB4YTQyMAorI2RlZmluZSBFWElGVEFHSURfSU1BR0VfVUlEIENPTlNUUlVDVF9UQUdJRChJTUFHRV9VSUQsIF9JRF9JTUFHRV9VSUQpCisjZGVmaW5lIEVYSUZUQUdUWVBFX0lNQUdFX1VJRCBFWElGX0FTQ0lJCisvLyBQSU0gdGFnCisvLyBVc2UgRVhJRlRBR1RZUEVfUElNX1RBRyBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9VTkRFRklORUQpCisvLyBDb3VudCBjYW4gYmUgYW55CisjZGVmaW5lIF9JRF9QSU0gMHhjNGE1CisjZGVmaW5lIEVYSUZUQUdJRF9QSU1fVEFHIENPTlNUUlVDVF9UQUdJRChQSU0sIF9JRF9QSU0pCisjZGVmaW5lIEVYSUZUQUdUWVBFX1BJTV9UQUcgRVhJRl9VTkRFRklORUQKKyNlbmRpZiAvLyBfX1FFWElGX0hfXworCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvbW0taW1hZ2UtY29kZWMvcWV4aWYvcW1wby5oIGIvbXNtY29iYWx0L21tLWltYWdlLWNvZGVjL3FleGlmL3FtcG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2ZkNTliCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L21tLWltYWdlLWNvZGVjL3FleGlmL3FtcG8uaApAQCAtMCwwICsxLDE1MCBAQAorLypDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKK21ldDoKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKK1NVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuKi8KKworI2lmbmRlZiBfX1FNUE9fSF9fCisjZGVmaW5lIF9fUU1QT19IX18KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8cWV4aWYuaD4KKworLy9MZW5ndGggb2YgTVBPIGhlYWRlciBmaWVsZHMKKyNkZWZpbmUgTVBfQVBQMl9GSUVMRF9MRU5HVEhfQllURVMgMgorI2RlZmluZSBNUF9GT1JNQVRfSURFTlRJRklFUl9CWVRFUyA0CisjZGVmaW5lIE1QX0VORElBTl9CWVRFUyA0CisjZGVmaW5lIE1QX0hFQURFUl9PRkZTRVRfVE9fRklSU1RfSUZEX0JZVEVTIDQKKyNkZWZpbmUgTVBfSU5ERVhfQ09VTlRfQllURVMgMgorI2RlZmluZSBNUF9JTkRFWF9WRVJTSU9OX0JZVEVTIDEyCisjZGVmaW5lIE1QX0lOREVYX05VTUJFUl9PRl9JTUFHRVNfQllURVMgMTIKKyNkZWZpbmUgTVBfSU5ERVhfRU5UUllfQllURVMgMTIKKyNkZWZpbmUgTVBfSU5ERVhfSU1BR0VfVU5JUVVFX0lEX0xJU1RfQllURVMgMTIKKyNkZWZpbmUgTVBfSU5ERVhfVE9UQUxfQ0FQVVJFRF9GUkFNRVMgMTIKKyNkZWZpbmUgTVBfSU5ERVhfT0ZGU0VUX09GX05FWFRfSUZEX0JZVEVTIDQKKyNkZWZpbmUgTVBfSU5ERVhfRU5UUllfVkFMVUVfQllURVMgMTYKKyNkZWZpbmUgTVBfSU5ERVhfRU5UUllfSU5ESVZJRFVBTF9JTUFHRV9BVFRSSUJVVEVfQllURVMgNAorI2RlZmluZSBNUF9JTkRFWF9FTlRSWV9JTkRJVklEVUFMX0lNQUdFX1NJWkVfQllURVMgNAorI2RlZmluZSBNUF9JTkRFWF9FTlRSWV9JTkRJVklEVUFMX0lNQUdFX0RBVEFfT0ZGU0VUX0JZVEVTIDQKKyNkZWZpbmUgTVBfQVRUUklCVVRFX0NPVU5UX0JZVEVTIDIKKyNkZWZpbmUgTVBfQVRUUklCVVRFX09GRlNFVF9PRl9ORVhUX0lGRF9CWVRFUyA0CisjZGVmaW5lIE1QX1RBR19CWVRFUyAxMgorI2RlZmluZSBNUF9JTkRJVklEVUFMX0lNQUdFX0lEX0JZVEVTIDMzCisjZGVmaW5lIE1QX0lOREVYX0lGRF9TVEFSVCAyCisKKyNkZWZpbmUgTVBPX0JJR19FTkRJQU4gMHg0RDREMDAyQQorI2RlZmluZSBNUE9fTElUVExFX0VORElBTiAweDQ5NDkyQTAwCisKKy8qIE1QTyBEZXBlbmRlbnQgVHlwZSAqLwordHlwZWRlZiBlbnVtCit7CisgICBOT05fREVQRU5ERU5UX0lNQUdFICAgID0gMHgwMDAwMDAwMCwgICAvLyBOb24gZGVwZW5kZW50IGltYWdlCisgICBERVBFTkRFTlRfQ0hJTERfSU1BR0UgID0gMHg0MDAwMDAwMCwgICAvLyBEZXBlbmRlbnQgY2hpbGQgaW1hZ2UgZmxhZworICAgREVQRU5ERU5UX1BBUkVOVF9JTUFHRSA9IDB4ODAwMDAwMDAsICAgLy8gRGVwZW5kZW50IHBhcmVudCBpbWFnZSBmbGFnCisgICBERVBFTkRFTlRfTUFTSyAgICAgICAgID0gMHhjMDAwMDAwMCwgICAvLyBEZXBlbmRlbnQgbWFzaworICAgREVQRU5ERU5UX01BWCwKK30gcW1wb19kZXBlbmRlbnRfdDsKKworLyogTVBPIFJlcHJlc2VudGF0aXZlIFR5cGUgKi8KK3R5cGVkZWYgZW51bQoreworICBOT1RfUkVQUkVTRU5UQVRJVkVfSU1BR0UgPSAweDAwMDAwMDAwLCAgIC8vIE5vdCBhIHJlcHJlc2VudGF0aXZlIGltYWdlCisgIFJFUFJFU0VOVEFUSVZFX0lNQUdFICAgICA9IDB4MjAwMDAwMDAsICAgLy8gUmVwcmVzZW50YXRpdmUgaW1hZ2UgZmxhZworICBSRVBSRVNFTlRBVElWRV9NQVNLICAgICAgPSAweDIwMDAwMDAwLCAgIC8vIFJlcHJlc2VudGF0aXZlIG1hc2sKKyAgUkVQUkVTRU5UQVRJVkVfTUFYLAorfSBxbXBvX3JlcHJlc2VudGF0aXZlX3Q7CisKKy8qIE1QTyBJbWFnZSBEYXRhIEZvcm1hdCBUeXBlICovCit0eXBlZGVmIGVudW0KK3sKKyAgSlBFRyAgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsICAgLy8gSW1hZ2UgaXMgaW4gSlBFRyBmb3JtYXQKKyAgTk9OX0pQRUcgICAgICAgICAgICAgICA9IDB4MDcwMDAwMDAsICAgLy8gSW1hZ2UgaXMgbm90IEpQRUcKKyAgSU1BR0VfREFUQV9GT1JNQVRfTUFTSyA9IDB4MDcwMDAwMDAsICAgLy8gSW1hZ2UgbWFzaworICBJTUFHRV9EQVRBX0ZPUk1BVF9NQVgsCit9IHFtcG9faW1hZ2VfZGF0YV9mb3JtYXRfdDsKKworLyogTVBPIFR5cGUgKi8KK3R5cGVkZWYgZW51bQoreworICBVTkRFRklORUQgICAgICAgICAgICAgID0gMHgwMDAwMDAwMCwgICAvLyBNUCB0eXBlcyB1bmRlZmluZWQKKyAgTEFSR0VfVE5fQ0xBU1NfMSAgICAgICA9IDB4MDAwMTAwMDEsICAgLy8gTGFyZ2UgdGh1bWJuYWlsIGNsYXNzIDEgaW1hZ2UKKyAgTEFSR0VfVE5fQ0xBU1NfMiAgICAgICA9IDB4MDAwMTAwMDIsICAgLy8gTGFyZ2UgdGh1bWJuYWlsIGNsYXNzIDIgaW1hZ2UKKyAgTVVMVElfVklFV19QQU5PUkFNQSAgICA9IDB4MDAwMjAwMDEsICAgLy8gTXVsdGktdmlldyBQYW5vcmFtYSBpbWFnZQorICBNVUxUSV9WSUVXX0RJU1BBUklUWSAgID0gMHgwMDAyMDAwMiwgICAvLyBNdWx0aS12aWV3IERpc3Bhcml0eSBpbWFnZQorICBNVUxUSV9WSUVXX01VTFRJX0FOR0xFID0gMHgwMDAyMDAwMywgICAvLyBNdWx0aS12aWV3IE11bHRpLWFuZ2xlIGltYWdlCisgIEJBU0VMSU5FX1BSSU1BUlkgICAgICAgPSAweDAwMDMwMDAwLCAgIC8vIEJhc2VsaW5lIE1QIFByaW1hcnkgaW1hZ2UKKyAgVFlQRV9NQVNLICAgICAgICAgICAgICA9IDB4MDBmZmZmZmYsICAgLy8gVHlwZSBtYXNrCisgIFRZUEVfTUFYLAorfSBxbXBvX3R5cGVfdDsKKworLy8gTVAgRm9ybWF0IFZlcnNpb24KKy8vIFVzZSBNUE9UQUdUWVBFX01QX0ZfVkVSU0lPTiBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9VTkRFRklORUQpCisvLyBDb3VudCBzaG91bGQgYmUgNAorI2RlZmluZSBfSURfTVBfRl9WRVJTSU9OX0ZJUlNUICAgICAgICAgICAweGIwMDAKKyNkZWZpbmUgTVBPVEFHSURfTVBfRl9WRVJTSU9OX0ZJUlNUICAgICAgQ09OU1RSVUNUX1RBR0lEKE1QX0ZfVkVSU0lPTl9GSVJTVCwgX0lEX01QX0ZfVkVSU0lPTl9GSVJTVCkKKyNkZWZpbmUgTVBPVEFHVFlQRV9NUF9GX1ZFUlNJT05fRklSU1QgICAgRVhJRl9VTkRFRklORUQKKworLy8gTnVtYmVyIG9mIEltYWdlcworLy8gVXNlIE1QT1RBR1RZUEVfTlVNQkVSX09GX0lNQUdFUyBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9MT05HKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX05VTUJFUl9PRl9JTUFHRVMgICAgICAgICAgICAgMHhiMDAxCisjZGVmaW5lIE1QT1RBR0lEX05VTUJFUl9PRl9JTUFHRVMgICAgICAgIENPTlNUUlVDVF9UQUdJRChOVU1CRVJfT0ZfSU1BR0VTLCBfSURfTlVNQkVSX09GX0lNQUdFUykKKyNkZWZpbmUgTVBPVEFHVFlQRV9OVU1CRVJfT0ZfSU1BR0VTICAgICAgRVhJRl9MT05HCisKKy8vIE1QIEVudHJ5CisvLyBVc2UgTVBPVEFHVFlQRV9NUF9FTlRSWSBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9VTkRFRklORUQpCisvLyBDb3VudCBzaG91bGQgYmUgMTYgeCBOdW1iZXJPZkltYWdlcworI2RlZmluZSBfSURfTVBfRU5UUlkgICAgICAgICAgICAgICAgICAgICAweGIwMDIKKyNkZWZpbmUgTVBPVEFHSURfTVBfRU5UUlkgICAgICAgICAgICAgICAgQ09OU1RSVUNUX1RBR0lEKE1QX0VOVFJZLCBfSURfTVBfRU5UUlkpCisjZGVmaW5lIE1QT1RBR1RZUEVfTVBfRU5UUlkgICAgICAgICAgICAgIEVYSUZfVU5ERUZJTkVECisKKy8vIEluZGl2aWR1YWwgSW1hZ2UgVW5pcXVlIElEIExpc3QKKy8vIFVzZSBNUE9UQUdUWVBFX0lNQUdFX1VJRF9MSVNUIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1VOREVGSU5FRCkKKy8vIENvdW50IHNob3VsZCBiZSAzMyB4IE51bWJlck9mSW1hZ2VzCisjZGVmaW5lIF9JRF9JTUFHRV9VSURfTElTVCAgICAgICAgICAgICAgIDB4YjAwMworI2RlZmluZSBNUE9UQUdJRF9JTUFHRV9VSURfTElTVCAgICAgICAgICBDT05TVFJVQ1RfVEFHSUQoSU1BR0VfVUlEX0xJU1QsIF9JRF9JTUFHRV9VSURfTElTVCkKKyNkZWZpbmUgTVBPVEFHVFlQRV9JTUFHRV9VSURfTElTVCAgICAgICAgRVhJRl9VTkRFRklORUQKKworLy8gVG90YWwgTnVtYmVyIG9mIENhbXB0dXJlZCBGcmFtZXMKKy8vIFVzZSBNUE9UQUdUWVBFX1RPVEFMX0ZSQU1FUyBhcyB0aGUgZXhpZl90YWdfdHlwZSAoRVhJRl9MT05HKQorLy8gQ291bnQgc2hvdWxkIGJlIDEKKyNkZWZpbmUgX0lEX1RPVEFMX0ZSQU1FUyAgICAgICAgICAgICAgICAgMHhiMDA0CisjZGVmaW5lIE1QT1RBR0lEX1RPVEFMX0ZSQU1FUyAgICAgICAgICAgIENPTlNUUlVDVF9UQUdJRChUT1RBTF9GUkFNRVMsIF9JRF9UT1RBTF9GUkFNRVMpCisjZGVmaW5lIE1QT1RBR1RZUEVfVE9UQUxfRlJBTUVTICAgICAgICAgIEVYSUZfTE9ORworCisvLyBNUCBGb3JtYXQgVmVyc2lvbgorLy8gVXNlIE1QT1RBR1RZUEVfTVBfRl9WRVJTSU9OIGFzIHRoZSBleGlmX3RhZ190eXBlIChFWElGX1VOREVGSU5FRCkKKy8vIENvdW50IHNob3VsZCBiZSA0CisjZGVmaW5lIF9JRF9NUF9GX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4YjAwMAorI2RlZmluZSBNUE9UQUdJRF9NUF9GX1ZFUlNJT04gICAgICAgICAgICBDT05TVFJVQ1RfVEFHSUQoTVBfRl9WRVJTSU9OLCBfSURfTVBfRl9WRVJTSU9OKQorI2RlZmluZSBNUE9UQUdUWVBFX01QX0ZfVkVSU0lPTiAgICAgICAgICBFWElGX1VOREVGSU5FRAorCisvLyBNUCBJbmRpdmlkdWFsIEltYWdlIE51bWJlcgorLy8gVXNlIE1QT1RBR1RZUEVfTVBfSU5ESVZJRFVBTF9OVU0gYXMgdGhlIGV4aWZfdGFnX3R5cGUgKEVYSUZfTE9ORykKKy8vIENvdW50IHNob3VsZCBiZSAxCisjZGVmaW5lIF9JRF9NUF9JTkRJVklEVUFMX05VTSAgICAgICAgICAgIDB4YjEwMQorI2RlZmluZSBNUE9UQUdJRF9NUF9JTkRJVklEVUFMX05VTSAgICAgICBDT05TVFJVQ1RfVEFHSUQoTVBfSU5ESVZJRFVBTF9OVU0sIF9JRF9NUF9JTkRJVklEVUFMX05VTSkKKyNkZWZpbmUgTVBPVEFHVFlQRV9NUF9JTkRJVklEVUFMX05VTSAgICAgRVhJRl9MT05HCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L21tLWltYWdlLWNvZGVjL3FvbXhfY29yZS9BbmRyb2lkLm1rIGIvbXNtY29iYWx0L21tLWltYWdlLWNvZGVjL3FvbXhfY29yZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNzI0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvbW0taW1hZ2UtY29kZWMvcW9teF9jb3JlL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNiBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgICAgICAgICAgICBNYWtlIHRoZSBzaGFyZWQgbGlicmFyeSAobGlicW9teF9jb3JlKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9DRkxBR1MgOj0gLVdlcnJvciBcCisgICAgICAgICAgICAgICAgICAgLWcgLU8wCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IFwKKyAgICAgICAgICAgICAgICAgICAgJChMT0NBTF9QQVRIKS8uLi9xZXhpZgorCitMT0NBTF9JTkNfRklMRVMgOj0gcW9teF9jb3JlLmggXAorICAgICAgICAgICAgICAgICAgIFFPTVhfSnBlZ0V4dGVuc2lvbnMuaAorCitMT0NBTF9TUkNfRklMRVMgOj0gcW9teF9jb3JlLmMKKworTE9DQUxfTU9EVUxFICAgICAgICAgICA6PSBsaWJxb214X2NvcmUKK0xPQ0FMX1BSRUxJTktfTU9EVUxFICAgOj0gZmFsc2UKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYmRsCisKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9tbS1pbWFnZS1jb2RlYy9xb214X2NvcmUvUU9NWF9KcGVnRXh0ZW5zaW9ucy5oIGIvbXNtY29iYWx0L21tLWltYWdlLWNvZGVjL3FvbXhfY29yZS9RT01YX0pwZWdFeHRlbnNpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1NzIzYgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9tbS1pbWFnZS1jb2RlYy9xb214X2NvcmUvUU9NWF9KcGVnRXh0ZW5zaW9ucy5oCkBAIC0wLDAgKzEsMzY1IEBACisvKkNvcHlyaWdodCAoYykgMjAxMi0yMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKK0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKK0JFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCitTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKK0JVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKK09SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KK0lGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiovCisKKyNpZm5kZWYgX19RT01YX0VYVEVOU0lPTlNfSF9fCisjZGVmaW5lIF9fUU9NWF9FWFRFTlNJT05TX0hfXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxPTVhfSW1hZ2UuaD4KKyNpbmNsdWRlIDxxZXhpZi5oPgorCisvKiogcW9teF9pbWFnZV9ldmVudGQKKyogIFFjb20gc3BlY2lmaWMgZXZlbnRzIGV4dGVuZGVkIGZyb20gT01YX0VWRU5UCisqICBAIE9NWF9FVkVOVF9USFVNQk5BSUxfRFJPUFBFRCAtIEluZGljYXRlcyB0aGF0IHRoZSB0aHVtYm5haWwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIGlkIHRvbyBiaWcgdG8gYmUgaW5jbHVkZWQKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgZXhpZiBhbmQgd2lsbCBiZQorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQKKyoqLwordHlwZWRlZiBlbnVtIHsKKyBPTVhfRVZFTlRfVEhVTUJOQUlMX0RST1BQRUQgPSBPTVhfRXZlbnRWZW5kb3JTdGFydFVudXNlZCsxCit9IFFPTVhfSU1BR0VfRVhUX0VWRU5UUzsKKworLyoqCisqICBUaGUgZm9sbG93aW5nIG1hY3JvcyBkZWZpbmVzIHRoZSBzdHJpbmcgdG8gYmUgdXNlZCBmb3IKKyogIGdldHRpbmcgdGhlIGV4dGVuc2lvbiBpbmRpY2VzLgorKiovCisjZGVmaW5lIFFPTVhfSU1BR0VfRVhUX0VYSUZfTkFNRSAgICAgICAgICAgICAgICAgICJPTVguUUNPTS5pbWFnZS5leHR0eXBlLmV4aWYiCisjZGVmaW5lIFFPTVhfSU1BR0VfRVhUX1RIVU1CTkFJTF9OQU1FICAgICAgICAiT01YLlFDT00uaW1hZ2UuZXh0dHlwZS50aHVtYm5haWwiCisjZGVmaW5lIFFPTVhfSU1BR0VfRVhUX0JVRkZFUl9PRkZTRVRfTkFNRSAiT01YLlFDT00uaW1hZ2UuZXh0dHlwZS5idWZmZXJPZmZzZXQiCisjZGVmaW5lIFFPTVhfSU1BR0VfRVhUX01PQklDQVRfTkFNRSAgICAgICAgICAgICJPTVguUUNPTS5pbWFnZS5leHR0eXBlLm1vYmljYXQiCisjZGVmaW5lIFFPTVhfSU1BR0VfRVhUX0VOQ09ESU5HX01PREVfTkFNRSAgICAgICAgIk9NWC5RQ09NLmltYWdlLmVuY29kaW5nLm1vZGUiCisjZGVmaW5lIFFPTVhfSU1BR0VfRVhUX1dPUktfQlVGRkVSX05BTUUgICAgICAiT01YLlFDT00uaW1hZ2UuZXh0dHlwZS53b3JrYnVmZmVyIgorI2RlZmluZSBRT01YX0lNQUdFX0VYVF9NRVRBREFUQV9OQU1FICAgICAgIk9NWC5RQ09NLmltYWdlLmV4dHR5cGUubWV0YWRhdGEiCisjZGVmaW5lIFFPTVhfSU1BR0VfRVhUX01FVEFfRU5DX0tFWV9OQU1FICAgICAgIk9NWC5RQ09NLmltYWdlLmV4dHR5cGUubWV0YUVuY0tleSIKKyNkZWZpbmUgUU9NWF9JTUFHRV9FWFRfTUVNX09QU19OQU1FICAgICAgIk9NWC5RQ09NLmltYWdlLmV4dHR5cGUubWVtX29wcyIKKyNkZWZpbmUgUU9NWF9JTUFHRV9FWFRfSlBFR19TUEVFRF9OQU1FICAgICAgIk9NWC5RQ09NLmltYWdlLmV4dHR5cGUuanBlZy5zcGVlZCIKKyNkZWZpbmUgUU9NWF9JTUFHRV9FWFRfTVVMVElfSU1BR0VfTkFNRSAgIk9NWC5RQ09NLmltYWdlLmV4dHR5cGUubXVsdGkuaW1hZ2UiCisKKy8qKiBRT01YX0lNQUdFX0VYVF9JTkRFWFRZUEUKKyogIFRoaXMgZW51bSBpcyBhbiBleHRlbnNpb24gb2YgdGhlIE9NWF9JTkRFWFRZUEUgZW51bSBhbmQKKyogIHNwZWNpZmllcyBRY29tIHN1cHBvcnRlZCBleHRlbnRpb24gaW5kZXhlcy4gVGhlc2UgaW5kZXhlcyBhcmUKKyogIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXh0ZW5zaW9uIG5hbWVzIGFuZCBjYW4gYmUgdXNlZCBhcworKiAgSW5kZXhlcyBpbiB0aGUgU2V0UGFyYW1ldGVyIGFuZCBHZXRwYXJhbWV0ZXIgZnVuY3RpbnMgdG8gc2V0CisqICBvciBnZXQgdmFsdWVzIGZyb20gcWNvbSBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZXMKKyoqLwordHlwZWRlZiBlbnVtIHsKKyAgLy9OYW1lOiBPTVguUUNPTS5pbWFnZS5leHR0eXBlLmV4aWYKKyAgUU9NWF9JTUFHRV9FWFRfRVhJRiA9IDB4MDdGMDAwMDAsCisKKyAgLy9OYW1lOiBPTVguUUNPTS5pbWFnZS5leHR0eXBlLnRodW1ibmFpbAorICBRT01YX0lNQUdFX0VYVF9USFVNQk5BSUwgPSAweDA3RjAwMDAxLAorCisgIC8vTmFtZTogT01YLlFDT00uaW1hZ2UuZXh0dHlwZS5idWZmZXJPZmZzZXQKKyAgUU9NWF9JTUFHRV9FWFRfQlVGRkVSX09GRlNFVCA9IDB4MDdGMDAwMDIsCisKKyAgLy9OYW1lOiBPTVguUUNPTS5pbWFnZS5leHR0eXBlLm1vYmljYXQKKyAgUU9NWF9JTUFHRV9FWFRfTU9CSUNBVCA9IDB4MDdGMDAwMDMsCisKKyAgLy9OYW1lOiBPTVguUUNPTS5pbWFnZS5lbmNvZGluZy5hcHByb2FjaAorICBRT01YX0lNQUdFX0VYVF9FTkNPRElOR19NT0RFID0gMHgwN0YwMDAwNCwKKworICAvL05hbWU6IE9NWC5RQ09NLmltYWdlLmV4dHR5cGUud29ya2J1ZmZlcgorICBRT01YX0lNQUdFX0VYVF9XT1JLX0JVRkZFUiA9IDB4MDdGMDAwMDUsCisKKyAgLy9OYW1lOiBPTVguUUNPTS5pbWFnZS5leHR0eXBlLm1ldGFkYXRhCisgIFFPTVhfSU1BR0VfRVhUX01FVEFEQVRBID0gMHgwN0YwMDAwOCwKKworICAvL05hbWU6IE9NWC5RQ09NLmltYWdlLmV4dHR5cGUubWV0YUVuY0tleQorICBRT01YX0lNQUdFX0VYVF9NRVRBX0VOQ19LRVkgPSAweDA3RjAwMDA5LAorCisgIC8vTmFtZTogT01YLlFDT00uaW1hZ2UuZXh0dHlwZS5tZW1PcHMKKyAgUU9NWF9JTUFHRV9FWFRfTUVNX09QUyA9IDB4MDdGMDAwMEEsCisKKyAgLy9OYW1lOiBPTVguUUNPTS5pbWFnZS5leHR0eXBlLmpwZWcuc3BlZWQKKyAgUU9NWF9JTUFHRV9FWFRfSlBFR19TUEVFRCA9IDB4MDdGMDAwQiwKKworICAvL05hbWU6IE9NWC5RQ09NLmltYWdlLmV4dHR5cGUubXVsdGkuaW1hZ2UKKyAgUU9NWF9JTUFHRV9FWFRfTVVMVElfSU1BR0UgPSAweDA3RjAwMEMsCisKK30gUU9NWF9JTUFHRV9FWFRfSU5ERVhUWVBFOworCisvKiogUU9NWF9CVUZGRVJfSU5GTworKiAgVGhlIHN0cnVjdHVyZSBzcGVjaWZpZXMgaW5mb3JtYXRvbgorKiAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmZmVycyBhbmQgc2hvdWxkIGJlIHBhc3NlZCBhcyBhcHBEYXRhCisqICAgaW4gVXNlQnVmZmVyIGNhbGxzIHRvIHRoZSBPTVggY29tcG9uZW50IHdpdGggYnVmZmVyIHNwZWNpZmljCisqICAgZGF0YS4gQCBmZCAtIEZEIG9mIHRoZSBidWZmZXIgYWxsb2NhdGVkLiBJZiB0aGUgYnVmZmVyIGlzCisqICAgICAgICAgIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCwgaXQgY2FuIGJlIHplcm8uCisqICAgQG9mZnNldCAtIEJ1ZmZlciBvZmZzZXQKKyoqLworCit0eXBlZGVmIHN0cnVjdCB7CisgIE9NWF9VMzIgZmQ7CisgIE9NWF9VMzIgb2Zmc2V0OworfSBRT01YX0JVRkZFUl9JTkZPOworCisvKiogUUVYSUZfSU5GT19EQVRBCisqICAgVGhlIGJhc2ljIGV4aWYgc3RydWN0dXJlIHVzZWQgdG8gY29uc3RydWN0CisqICAgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIGV4aWYgdGFnLgorKiAgIEB0YWdfZW50cnkKKyogICBAdGFnX2lkCisqKi8KK3R5cGVkZWYgc3RydWN0eworICBleGlmX3RhZ19lbnRyeV90IHRhZ19lbnRyeTsKKyAgZXhpZl90YWdfaWRfdCB0YWdfaWQ7Cit9IFFFWElGX0lORk9fREFUQTsKKworLyoqIFFFWFROX0RBVEEKKyogICBUaGUgc3RydWN0dXJlIHVzZWQgdG8gY2FycnkgYWRkdGlvbmFsIHBheWxvYWQKKyogICBtZWFudCB0byBiZSBpbiBFWElGIEFwcHggbWFya2VyIGZpZWxkcy4KKyogICBAc3dfM2FfdmVyc2lvbgorKiovCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQxNl90IHN3XzNhX3ZlcnNpb25bNF07Cit9IFFFWFROX0RBVEE7CisKKy8qKlFPTVhfRVhJRl9JTkZPCisqICBUaGUgc3RydWN0dXJlIGNvbnRhaW5zIGFuIGFycmF5IG9mIGV4aWYgdGFnCisqICBzdHJ1Y3R1cmVzKHFleGlmX2luZm9fZGF0YSkgYW5kIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIE9NWAorKiAgbGF5ZXIgYnkgdGhlIE9NWCBjbGllbnQgdXNpbmcgdGhlIGV4dGVuc2lvbiBpbmRleC4KKyogIEBleGlmX2RhdGEgLSBBcnJheSBvZiBleGlmIHRhZ3MKKyogIEBudW1PZkVudHJpZXMgLSBOdW1iZXIgb2YgZXhpZiB0YWdzIGVudHJpZXMgYmVpbmcgcGFzc2VkIGluCisqICAgICAgICAgICAgICAgICAgdGhlIGFycmF5CisqICBAZGVidWdfZGF0YSAtIHNwZWNpZmljIGRlYnVnIGluZm9ybWF0aW9uIGZvciBpbnRlcm5hbCB1c2UKKyoqLwordHlwZWRlZiBzdHJ1Y3QgeworICBRRVhJRl9JTkZPX0RBVEEgKmV4aWZfZGF0YTsKKyAgT01YX1UzMiBudW1PZkVudHJpZXM7CisgIFFFWFROX0RBVEEgZGVidWdfZGF0YTsKK30gUU9NWF9FWElGX0lORk87CisKKy8qKlFPTVhfWVVWX0ZSQU1FX0lORk8KKyogIFRoZSBzdHJ1Y3RyZSBjb250YWlucyBhbGwgdGhlIG9mZnNldHMKKyogIGFzc29jaWF0ZWQgd2l0aCB0aGUgWSBhbmQgY2JjciBidWZmZXJzLgorKiAgQHlPZmZzZXQgLSBPZmZzZXQgd2l0aGluIHRoZSBZIGJ1ZmZlcgorKiAgQGNiY3JPZmZzZXQgLSBPZmZzZXQgd2l0aGluIHRoZSBjYi9jciBidWZmZXIuIFRoZSBhcnJheQorKiAgICAgICAgICAgICAgICBzaG91bGQgYmUgcG9wdWxhdGVkIGluIG9yZGVyIGRlcGVuZGluZyBvbiBjYgorKiAgICAgICAgICAgICAgICBmaXJzdCBvciBjciBmaXJzdCBpbiBjYXNlIG9mIHBsYW5hciBkYXRhLiBGb3IKKyogICAgICAgICAgICAgICAgcHNldXNvcGxhbmFyLCBvbmx5IHRoZSBmaXJzdCBhcnJheSBlbGVtZW50CisqICAgICAgICAgICAgICAgIG5lZWRzIHRvIGJlIGZpbGxlZCBhbmQgdGhlIHNlY25kIGVsZW1lbnQgc2hvdWxkCisqICAgICAgICAgICAgICAgIGJlIHNldCB0byB6ZXJvLgorKiAgQGNiY3JTdGFydE9mZnNldCAtIFN0YXJ0IG9mZnNldCBvZiB0aGUgY2IvY3IgYnVmZmVyIHN0YXJ0aW5nCisqICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgZnJvbSB0aGUgWSBidWZmZXIuIFRoZSBhcnJheQorKiAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBwb3B1bGF0ZWQgaW4gb3JkZXIgZGVwZW5kaW5nIG9uCisqICAgICAgICAgICAgICAgICAgICAgY2IgZmlyc3Qgb3IgY3IgZmlyc3QgaW4gY2FzZSBvZiBwbGFuYXIKKyogICAgICAgICAgICAgICAgICAgICBkYXRhLiBGb3IgcHNldXNvcGxhbmFyLCBvbmx5IHRoZSBmaXJzdAorKiAgICAgICAgICAgICAgICAgICAgIGFycmF5IGVsZW1lbnQgbmVlZHMgdG8gYmUgZmlsbGVkIGFuZCB0aGUKKyogICAgICAgICAgICAgICAgICAgICBzZWNuZCBlbGVtZW50IHNob3VsZCBiZSBzZXQgdG8gemVyby4KKyoqLwordHlwZWRlZiBzdHJ1Y3QgeworICBPTVhfVTMyIHlPZmZzZXQ7CisgIE9NWF9VMzIgY2Jjck9mZnNldFsyXTsKKyAgT01YX1UzMiBjYmNyU3RhcnRPZmZzZXRbMl07Cit9IFFPTVhfWVVWX0ZSQU1FX0lORk87CisKKy8qKiBxb214X3RodW1ibmFpbF9pbmZvCisqICBJbmNsdWRlcyBhbGwgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB0aHVtYm5haWwKKyogIEBpbnB1dF93aWR0aCAtIFdpZHRoIG9mIHRoZSBpbnB1dCB0aHVtYm5haWwgYnVmZmVyCisqICBAaW5wdXRfaGVpZ2h0IC0gSGVpZ2hyIG9mIHRoZSBpbnB1dCB0aHVtYm5haWwgYnVmZmVyCisqICBAc2NhbGluZ19lbmFibGVkIC0gRmxhZyBpbmRpY2F0aW5nIGlmIHRodW1ibmFpbCBzY2FsaW5nIGlzCisqICBlbmFibGVkLgorKiAgQHF1YWxpdHkgLSBKUEVHIFEgZmFjdG9yIHZhbHVlIGluIHRoZSByYW5nZSBvZiAxLTEwMC4gQSBmYWN0b3Igb2YgMQorICogICAgICAgICAgICAgICBwcm9kdWNlcyB0aGUgc21hbGxlc3QsIHdvcnN0IHF1YWxpdHkgaW1hZ2VzLCBhbmQgYSBmYWN0b3IKKyAqICAgICAgICAgICAgICAgb2YgMTAwIHByb2R1Y2VzIHRoZSBsYXJnZXN0LCBiZXN0IHF1YWxpdHkgaW1hZ2VzLiAgQQorICogICAgICAgICAgICAgICB0eXBpY2FsIGRlZmF1bHQgaXMgNzUgZm9yIHNtYWxsIGdvb2QgcXVhbGl0eSBpbWFnZXMuCisqICBAY3JvcF9pbmZvIC0gSW5jbHVkZXMgdGhlIGNyb3Agd2lkdGgsIGNyb3AgaGVpZ2h0LAorKiAgICAgICAgICAgICAgIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIG9mZnNldHMuCisqICBAb3V0cHV0X3dpZHRoIC0gT3V0cHV0IFdpZHRoIG9mIHRoZSB0aGUgdGh1bWJuYWlsLiBUaGlzIGlzCisqICAgICAgICAgICAgICAgIHRoZSB3aWR0aCBhZnRlciBzY2FsaW5nIGlmIHNjYWxpbmcgaXMgZW5hYmxlZAorKiAgICAgICAgICAgICAgICBvciB3aWR0aCBhZnRlciBjcm9wcGluZyBpZiBvbmx5IGNyb3BwaW5nIGlzCisqICAgICAgICAgICAgICAgIGVuYWJsZWQgb3Igc2FtZSBzYW1lIGlucHV0IHdpZHRoIG90aGVyd2lzZQorKiAgQG91dHB1dF9oZWlnaHQgLSBPdXRwdXQgaGVpZ2h0IG9mIHRoZSB0aHVtYm5haWwuIFRoaXMgaXMKKyogICAgICAgICAgICAgICAgdGhlIGhlaWdodCBhZnRlciBzY2FsaW5nIGlmIHNjYWxpbmcgaXMgZW5hYmxlZAorKiAgICAgICAgICAgICAgICBvciBoZWlnaHQgYWZ0ZXIgY3JvcHBpbmcgaWYgb25seSBjcm9wcGluZyBpcworKiAgICAgICAgICAgICAgICBlbmFibGVkIG9yIHNhbWUgc2FtZSBpbnB1dCBoZWlnaHQgb3RoZXJ3aXNlCisqKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgT01YX1UzMiBpbnB1dF93aWR0aDsKKyAgT01YX1UzMiBpbnB1dF9oZWlnaHQ7CisgIE9NWF9VOCBzY2FsaW5nX2VuYWJsZWQ7CisgIE9NWF9VMzIgcXVhbGl0eTsKKyAgT01YX0NPTkZJR19SRUNUVFlQRSBjcm9wX2luZm87CisgIE9NWF9VMzIgb3V0cHV0X3dpZHRoOworICBPTVhfVTMyIG91dHB1dF9oZWlnaHQ7CisgIFFPTVhfWVVWX0ZSQU1FX0lORk8gdG1iT2Zmc2V0OworICBPTVhfVTMyIHJvdGF0aW9uOworfSBRT01YX1RIVU1CTkFJTF9JTkZPOworCisvKipxb214X21vYmljYXQKKyogIE1vYmljYXQgZGF0YSB0byBwYWRkZWQgdG90IGhlIE9NWCBsYXllcgorKiAgQG1vYmljYXREYXRhIC0gTW9iaWNhdGUgZGF0YQorKiAgQG1vYmljYXREYXRhTGVuZ3RoIC0gbGVuZ3RoIG9mIHRoZSBtb2JpY2F0IGRhdGEKKyoqLwordHlwZWRlZiBzdHJ1Y3QgeworICBPTVhfVTggKm1vYmljYXREYXRhOworICBPTVhfVTMyIG1vYmljYXREYXRhTGVuZ3RoOworfSBRT01YX01PQklDQVQ7CisKKy8qKnFvbXhfd29ya2J1ZmZlcgorKiAgSW9uIGJ1ZmZlciB0byBiZSB1c2VkIGZvciB0aGUgSC9XIGVuY29kZXIKKyogIEBmZCAtIEZEIG9mIHRoZSBidWZmZXIgYWxsb2NhdGVkCisqICBAdmFkZHIgLSBCdWZmZXIgYWRkcmVzcworKiovCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBmZDsKKyAgdWludDhfdCAqdmFkZHI7CisgIHVpbnQzMl90IGxlbmd0aDsKK30gUU9NWF9XT1JLX0JVRkZFUjsKKworLyoqUU9NWF9NRVRBREFUQQorICoKKyAqIG1ldGEgZGF0YSB0byBiZSBzZXQgaW4gRVhJRgorICogQG1ldGFkYXRhOiBEeW5hbWljIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIGltYWdlCisgKiBAbWV0YVBheWxvYWRTaXplIDogU2l6ZSBvZiBkeW5hbWljIG1ldGFkYXRhCisgKiBAbW9iaWNhdF9tYXNrIDogTW9iaWNhdCBNQVNrCisgKiBAc3RhdGljX21ldGFkYXRhOiBTdGF0aWMgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGVhY2ggaW1hZ2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworICBPTVhfVTggICptZXRhZGF0YTsKKyAgT01YX1UzMiBtZXRhUGF5bG9hZFNpemU7CisgIE9NWF9VOCBtb2JpY2F0X21hc2s7CisgIE9NWF9VOCAqc3RhdGljX21ldGFkYXRhOworfSBRT01YX01FVEFEQVRBOworCisvKipRT01YX01FVEFfRU5DX0tFWQorICoKKyAqIG1ldGEgZGF0YSBlbmNyeXB0aW9uIGtleQorICovCit0eXBlZGVmIHN0cnVjdCB7CisgIE9NWF9VOCAgKm1ldGFLZXk7CisgIE9NWF9VMzIga2V5TGVuOworfSBRT01YX01FVEFfRU5DX0tFWTsKKworLyoqIFFPTVhfSU1HX0NPTE9SX0ZPUk1BVFRZUEUKKyogIFRoaXMgZW51bSBpcyBhbiBleHRlbnNpb24gb2YgdGhlIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVudW0uCisqICBJdCBzcGVjaWZpZXMgUWNvbSBzdXBwb3J0ZWQgY29sb3IgZm9ybWF0cy4KKyoqLwordHlwZWRlZiBlbnVtIFFPTVhfSU1HX0NPTE9SX0ZPUk1BVFRZUEUgeworICBPTVhfUUNPTV9JTUdfQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hciA9IE9NWF9DT0xPUl9Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCArIDB4MzAwLAorICBPTVhfUUNPTV9JTUdfQ09MT1JfRm9ybWF0WVZVNDIyU2VtaVBsYW5hciwKKyAgT01YX1FDT01fSU1HX0NPTE9SX0Zvcm1hdFlWVTQyMlNlbWlQbGFuYXJfaDF2MiwKKyAgT01YX1FDT01fSU1HX0NPTE9SX0Zvcm1hdFlVVjQyMlNlbWlQbGFuYXJfaDF2MiwKKyAgT01YX1FDT01fSU1HX0NPTE9SX0Zvcm1hdFlWVTQ0NFNlbWlQbGFuYXIsCisgIE9NWF9RQ09NX0lNR19DT0xPUl9Gb3JtYXRZVVY0NDRTZW1pUGxhbmFyLAorICBPTVhfUUNPTV9JTUdfQ09MT1JfRm9ybWF0WVZVNDIwUGxhbmFyLAorICBPTVhfUUNPTV9JTUdfQ09MT1JfRm9ybWF0WVZVNDIyUGxhbmFyLAorICBPTVhfUUNPTV9JTUdfQ09MT1JfRm9ybWF0WVZVNDIyUGxhbmFyX2gxdjIsCisgIE9NWF9RQ09NX0lNR19DT0xPUl9Gb3JtYXRZVVY0MjJQbGFuYXJfaDF2MiwKKyAgT01YX1FDT01fSU1HX0NPTE9SX0Zvcm1hdFlWVTQ0NFBsYW5hciwKKyAgT01YX1FDT01fSU1HX0NPTE9SX0Zvcm1hdFlVVjQ0NFBsYW5hcgorfSBRT01YX0lNR19DT0xPUl9GT1JNQVRUWVBFOworCisvKiogUU9NWF9FTkNPRElOR19NT0RFCisqICBUaGlzIGVudW0gaXMgdXNlZCB0byBzZWxlY3QgcGFyYWxsZWwgZW5jb2RpbmcKKyogIG9yIHNlcXVlbnRpYWwgZW5jb2RpbmcgZm9yIHRoZSB0aHVtYm5haWwgYW5kCisqICBtYWluIGltYWdlCisqKi8KK3R5cGVkZWYgZW51bSB7CisgIE9NWF9TZXJpYWxfRW5jb2RpbmcsCisgIE9NWF9QYXJhbGxlbF9FbmNvZGluZworfSBRT01YX0VOQ09ESU5HX01PREU7CisKKworLyoqb214X2pwZWdfb3VwdXRfYnVmX3QKKyogIFN0cnVjdHVyZSBkZXNjcmliaW5nIGpwZWcgb3V0cHV0IGJ1ZmZlcgorKiAgQGhhbmRsZSAtIEhhbmRsZSB0byB0aGUgY29udGFpbmluZyBjbGFzcworKiAgQG1lbV9oZGwgLSBIYW5kbGUgdG8gY2FtZXJhIG1lbW9yeSBzdHJ1Y3QKKyogIEB2YWRkciAtIEJ1ZmZlciBhZGRyZXNzCisqICBAc2l6ZSAtIEJ1ZmZlciBzaXplCisqICBAZmQgLSBmaWxlIGRlc2NyaXB0b3IKKyoqLwordHlwZWRlZiBzdHJ1Y3QgeworICB2b2lkICpoYW5kbGU7CisgIHZvaWQgKm1lbV9oZGw7CisgIGludDhfdCBpc2hlYXA7CisgIHNpemVfdCBzaXplOyAvKmlucHV0Ki8KKyAgdm9pZCAqdmFkZHI7CisgIGludCBmZDsKK30gb214X2pwZWdfb3VwdXRfYnVmX3Q7CisKKy8qKiBRT01YX01FTV9PUFMKKyogU3RydWN0dXJlIGhvbGRpbmcgdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIHRvCisqIGJ1ZmZlciBtZW1vcnkgb3BlcmF0aW9ucworKiBAZ2V0X21lbW9yeSAtIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGJ1ZmZlciBtZW1vcnkKKyogQHBzZXNzaW9uIC0gcmVmZXJlbmNlIHRvIGpwZWcgc2Vzc2lvbiBwdHIKKyoqLwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgKCpnZXRfbWVtb3J5KSggb214X2pwZWdfb3VwdXRfYnVmX3QgKnBfb3V0X2J1Ziwgdm9pZCAqcF9qcGVnX3Nlc3Npb24pOworICB2b2lkICpwc2Vzc2lvbjsKK30gUU9NWF9NRU1fT1BTOworCisvKiogUU9NWF9KUEVHX1NQRUVEX01PREUKKyogRW51bSBzcGVjaWZ5aW5nIHRoZSB2YWx1ZXMgZm9yIHRoZSBqcGVnCisqIHNwZWVkIG1vZGUgc2V0dGluZworKiovCit0eXBlZGVmIGVudW0geworICBRT01YX0pQRUdfU1BFRURfTU9ERV9OT1JNQUwsCisgIFFPTVhfSlBFR19TUEVFRF9NT0RFX0hJR0gKK30gUU9NWF9KUEVHX1NQRUVEX01PREU7CisKKy8qKiBRT01YX0pQRUdfU1BFRUQKKyogU3RydWN0dXJlIHVzZWQgdG8gc2V0IHRoZSBqcGVnIHNwZWVkIG1vZGUKKyogcGFyYW1ldGVyCisqIEBzcGVlZE1vZGUgLSBqcGVnIHNwZWVkIG1vZGUKKyoqLwordHlwZWRlZiBzdHJ1Y3QgeworICBRT01YX0pQRUdfU1BFRURfTU9ERSBzcGVlZE1vZGU7Cit9IFFPTVhfSlBFR19TUEVFRDsKKworLyoqIE9NWF9JTUFHRV9UWVBFCisqIEVudW0gc3BlY2lmeWluZyB0aGUgdmFsdWVzIGZvciB0aGUganBlZworKiBpbWFnZSB0eXBlIHNldHRpbmcKKyoqLwordHlwZWRlZiBlbnVtIHsKKyAgUU9NWF9KUEVHX0lNQUdFX1RZUEVfSlBFRywKKyAgUU9NWF9KUEVHX0lNQUdFX1RZUEVfTVBPCit9IE9NWF9JTUFHRV9UWVBFOworCisvKiogUU9NWF9KUEVHX0lNQUdFX1NFUVVFTkNFX0lORk8KKyogU3RydWN0IHNwZWNpZnlpbmcgdGhlIHBhcmFtZXRlcnMgZm9yCisqIHNlcXVlbmNlIG9mIGpwZWcgaW1hZ2VzCisqIEBpbWFnZV90eXBlIDoganBlZyBpbWFnZSB0eXBlCisqIEBpc19wcmltYXJ5X2ltYWdlOiBGbGFnIGluZGljYXRpbmcgaWYgdGhlIGltYWdlIGlzIGEKKyAgICBwcmltYXJ5IGltYWdlIGluIHRoZSBzZXF1ZW5jZQorKiBAbnVtX29mX2ltYWdlczogTnVtYmVyIG9mIGltYWdlcyBpbiB0aGUgc2VxdWVuY2UKKyogQGVuYWJsZV9tZXRhZGF0YTogRmxhZyBpbmRpY2F0aW5nIGlmIG11bHRpIGltYWdlCisgICAgbWV0YWRhdGEgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgaW1hZ2UKKyoqLwordHlwZWRlZiBzdHJ1Y3QgeworICBPTVhfSU1BR0VfVFlQRSBpbWFnZV90eXBlOworICBPTVhfVTggaXNfcHJpbWFyeV9pbWFnZTsKKyAgT01YX1UzMiBudW1fb2ZfaW1hZ2VzOworICBPTVhfVTggZW5hYmxlX21ldGFkYXRhOworfSBRT01YX0pQRUdfTVVMVElfSU1BR0VfSU5GTzsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L21tLWltYWdlLWNvZGVjL3FvbXhfY29yZS9xb214X2NvcmUuYyBiL21zbWNvYmFsdC9tbS1pbWFnZS1jb2RlYy9xb214X2NvcmUvcW9teF9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyNjg1ZAotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC9tbS1pbWFnZS1jb2RlYy9xb214X2NvcmUvcW9teF9jb3JlLmMKQEAgLTAsMCArMSwzNzUgQEAKKy8qQ29weXJpZ2h0IChjKSAyMDEyLTIwMTQsIDIwMTYsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKK21ldDoKKyAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKK1NVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX05JREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJxb214X2ltYWdlX2NvcmUiCisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisvLyBPcGVuTUFYIGRlcGVuZGVuY2llcworI2luY2x1ZGUgInFvbXhfY29yZS5oIgorCisjZGVmaW5lIEJVRkZfU0laRSAyNTUKKworc3RhdGljIG9teF9jb3JlX3QgKmdfb214Y29yZTsKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgZ19vbXhjb3JlX2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworc3RhdGljIGludCBnX29teGNvcmVfY250ID0gMDsKKworLy9NYXAgdGhlIGxpYnJhcnkgbmFtZSB3aXRoIHRoZSBjb21wb25lbnQgbmFtZQorc3RhdGljIGNvbnN0IGNvbXBfaW5mb190IGdfY29tcF9pbmZvW10gPQoreworICB7ICJPTVgucWNvbS5pbWFnZS5qcGVnLmVuY29kZXIiLCAibGlicW9teF9qcGVnZW5jLnNvIiB9LAorICB7ICJPTVgucWNvbS5pbWFnZS5qcGVnLmRlY29kZXIiLCAibGlicW9teF9qcGVnZGVjLnNvIiB9LAorICB7ICJPTVgucWNvbS5pbWFnZS5qcGVnLmVuY29kZXJfcGlwZWxpbmUiLCAibGlicW9teF9qcGVnZW5jX3BpcGUuc28iIH0KK307CisKK3N0YXRpYyBpbnQgZ2V0X2lkeF9mcm9tX2hhbmRsZShPTVhfSU4gT01YX0hBTkRMRVRZUEUgKmFoQ29tcCwgaW50ICphY29tcEluZGV4LAorICBpbnQgKmFpbnN0YW5jZUluZGV4KTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRnVuY3Rpb24gOiBPTVhfSW5pdAorKiBQYXJhbWV0ZXJzOiBOb25lCisqIERlc2NyaXB0aW9uOiBUaGlzIGlzIHRoZSBmaXJzdCBjYWxsIHRoYXQgaXMgbWFkZSB0byB0aGUgT01YIENvcmUKKyogYW5kIGluaXRpYWxpemVzIHRoZSBPTVggSUwgY29yZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX0luaXQoKQoreworICBPTVhfRVJST1JUWVBFIHJjID0gT01YX0Vycm9yTm9uZTsKKyAgaW50IGkgPSAwOworICBpbnQgY29tcF9jbnQgPSBzaXplb2YoZ19jb21wX2luZm8pL3NpemVvZihnX2NvbXBfaW5mb1swXSk7CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZnX29teGNvcmVfbG9jayk7CisKKyAgLyogY2hlY2sgaWYgY29yZSBpcyBjcmVhdGVkICovCisgIGlmIChnX29teGNvcmUpIHsKKyAgICBnX29teGNvcmVfY250Kys7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfb214Y29yZV9sb2NrKTsKKyAgICByZXR1cm4gcmM7CisgIH0KKworICBpZiAoY29tcF9jbnQgPiBPTVhfQ09NUF9NQVhfTlVNKSB7CisgICAgQUxPR0UoIiVzOiVkXSBjYW5ub3QgZXhjZWVkIG1heCBudW1iZXIgb2YgY29tcG9uZW50cyIsCisgICAgICBfX2Z1bmNfXywgX19MSU5FX18pOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX29teGNvcmVfbG9jayk7CisgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgfQorICAvKiBjcmVhdGUgbmV3IGdsb2JhbCBvYmplY3QgKi8KKyAgZ19vbXhjb3JlID0gbWFsbG9jKHNpemVvZihvbXhfY29yZV90KSk7CisgIGlmIChnX29teGNvcmUpIHsKKyAgICBtZW1zZXQoZ19vbXhjb3JlLCAweDAsIHNpemVvZihvbXhfY29yZV90KSk7CisKKyAgICAvKiBwb3B1bGF0ZSB0aGUgbGlicmFyeSBuYW1lIGFuZCBjb21wb25lbnQgbmFtZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjb21wX2NudDsgaSsrKSB7CisgICAgICBnX29teGNvcmUtPmNvbXBvbmVudFtpXS5jb21wX25hbWUgPSBnX2NvbXBfaW5mb1tpXS5jb21wX25hbWU7CisgICAgICBnX29teGNvcmUtPmNvbXBvbmVudFtpXS5saWJfbmFtZSA9IGdfY29tcF9pbmZvW2ldLmxpYl9uYW1lOworICAgIH0KKyAgICBnX29teGNvcmUtPmNvbXBfY250ID0gY29tcF9jbnQ7CisgICAgZ19vbXhjb3JlX2NudCsrOworICB9IGVsc2UgeworICAgIHJjID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICB9CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX29teGNvcmVfbG9jayk7CisgIEFMT0dJKCIlczolZF0gQ29tcGxldGUgJWQiLCBfX2Z1bmNfXywgX19MSU5FX18sIGNvbXBfY250KTsKKyAgcmV0dXJuIHJjOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBGdW5jdGlvbiA6IE9NWF9EZWluaXQKKyogUGFyYW1ldGVyczogTm9uZQorKiBSZXR1cm4gVmFsdWUgOiBPTVhfRVJST1JUWVBFCisqIERlc2NyaXB0aW9uOiBEZWluaXQgYWxsIHRoZSBPTVggY29tcG9uZW50cworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX0RlaW5pdCgpCit7CisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19vbXhjb3JlX2xvY2spOworCisgIGlmIChnX29teGNvcmVfY250ID09IDEpIHsKKyAgICBpZiAoZ19vbXhjb3JlKSB7CisgICAgICBmcmVlKGdfb214Y29yZSk7CisgICAgICBnX29teGNvcmUgPSBOVUxMOworICAgIH0KKyAgfQorICBpZiAoZ19vbXhjb3JlX2NudCkgeworICAgIGdfb214Y29yZV9jbnQtLTsKKyAgfQorCisgIEFMT0dJKCIlczolZF0gQ29tcGxldGUiLCBfX2Z1bmNfXywgX19MSU5FX18pOworICBwdGhyZWFkX211dGV4X3VubG9jaygmZ19vbXhjb3JlX2xvY2spOworICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRnVuY3Rpb24gOiBnZXRfY29tcF9mcm9tX2xpc3QKKyogUGFyYW1ldGVyczogY29tcG9uZW50TmFtZQorKiBSZXR1cm4gVmFsdWUgOiBjb21wb25lbnRfaW5kZXgKKyogRGVzY3JpcHRpb246IElmIHRoZSBjb21wb25udCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGxpc3QsIHJldHVybiB0aGUKKyogY29tcG9uZW50IGluZGV4LiBJZiBub3QgcmV0dXJuIHRoZSBuZXh0IGluZGV4IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50LgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyBpbnQgZ2V0X2NvbXBfZnJvbV9saXN0KGNoYXIgKmNvbXBfbmFtZSkKK3sKKyAgaW50IGluZGV4ID0gLTEsIGkgPSAwOworCisgIGlmIChOVUxMID09IGNvbXBfbmFtZSkKKyAgICByZXR1cm4gLTE7CisKKyAgZm9yIChpID0gMDsgaSA8IGdfb214Y29yZS0+Y29tcF9jbnQ7IGkrKykgeworICAgIGlmICghc3RyY21wKGdfb214Y29yZS0+Y29tcG9uZW50W2ldLmNvbXBfbmFtZSwgY29tcF9uYW1lKSkgeworICAgICAgaW5kZXggPSBpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBpbmRleDsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyogRnVuY3Rpb24gOiBnZXRfZnJlZV9pbnN0X2lkeAorKiBQYXJhbWV0ZXJzOiBwX2NvbXAKKyogUmV0dXJuIFZhbHVlIDogVGhlIG5leHQgaW5zdGFuY2UgaW5kZXggaWYgYXZhaWxhYmxlCisqIERlc2NyaXB0aW9uOiBHZXQgdGhlIG5leHQgYXZhaWxhYmxlIGluZGV4IGZvciB0byBzdG9yZSB0aGUgbmV3IGluc3RhbmNlIG9mIHRoZQorKiAgICAgICAgICAgIGNvbXBvbmVudCBiZWluZyBjcmVhdGVkLgorKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBnZXRfZnJlZV9pbnN0X2lkeChvbXhfY29yZV9jb21wb25lbnRfdCAqcF9jb21wKQoreworICBpbnQgaWR4ID0gLTEsIGkgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBPTVhfQ09NUF9NQVhfSU5TVEFOQ0VTOyBpKyspIHsKKyAgICBpZiAoTlVMTCA9PSBwX2NvbXAtPmhhbmRsZVtpXSkgeworICAgICAgaWR4ID0gaTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gaWR4OworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKiBGdW5jdGlvbiA6IE9NWF9HZXRIYW5kbGUKKyogUGFyYW1ldGVyczogaGFuZGxlLCBjb21wb25lbnROYW1lLCBhcHBEYXRhLCBjYWxsYmFja3MKKyogUmV0dXJuIFZhbHVlIDogT01YX0VSUk9SVFlQRQorKiBEZXNjcmlwdGlvbjogQ29uc3RydWN0IGFuZCBsb2FkIHRoZSByZXF1ZXN0ZWQgb214IGxpYnJhcnkKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9HZXRIYW5kbGUoCisgIE9NWF9PVVQgT01YX0hBTkRMRVRZUEUqIGhhbmRsZSwKKyAgT01YX0lOIE9NWF9TVFJJTkcgY29tcG9uZW50TmFtZSwKKyAgT01YX0lOIE9NWF9QVFIgYXBwRGF0YSwKKyAgT01YX0lOIE9NWF9DQUxMQkFDS1RZUEUqIGNhbGxCYWNrcykKK3sKKyAgT01YX0VSUk9SVFlQRSByYyA9IE9NWF9FcnJvck5vbmU7CisgIGludCBjb21wX2lkeCA9IDAsIGluc3RfaWR4ID0gMDsKKyAgY2hhciBsaWJOYW1lW0JVRkZfU0laRV0gPSB7MH07CisgIHZvaWQgKnBfb2JqID0gTlVMTDsKKyAgT01YX0NPTVBPTkVOVFRZUEUgKnBfY29tcCA9IE5VTEw7CisgIG9teF9jb3JlX2NvbXBvbmVudF90ICpwX2NvcmVfY29tcCA9IE5VTEw7CisgIE9NWF9CT09MIGNsb3NlX2hhbmRsZSA9IE9NWF9GQUxTRTsKKworICBpZiAoTlVMTCA9PSBoYW5kbGUpIHsKKyAgICBBTE9HRSgiJXM6JWRdIEVycm9yIGludmFsaWQgaW5wdXQgIiwgX19mdW5jX18sIF9fTElORV9fKTsKKyAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICB9CisKKyAgcHRocmVhZF9tdXRleF9sb2NrKCZnX29teGNvcmVfbG9jayk7CisKKyAgY29tcF9pZHggPSBnZXRfY29tcF9mcm9tX2xpc3QoY29tcG9uZW50TmFtZSk7CisgIGlmIChjb21wX2lkeCA8IDApIHsKKyAgICBBTE9HRSgiJXM6JWRdIENhbm5vdCBmaW5kIHRoZSBjb21wb25lbnQiLCBfX2Z1bmNfXywgX19MSU5FX18pOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX29teGNvcmVfbG9jayk7CisgICAgcmV0dXJuIE9NWF9FcnJvckludmFsaWRDb21wb25lbnQ7CisgIH0KKyAgcF9jb3JlX2NvbXAgPSAmZ19vbXhjb3JlLT5jb21wb25lbnRbY29tcF9pZHhdOworCisgICpoYW5kbGUgPSBOVUxMOworCisgIC8vSWYgY29tcG9uZW50IGFscmVhZHkgcHJlc2VudCBnZXQgdGhlIGluc3RhbmNlIGluZGV4CisgIGluc3RfaWR4ID0gZ2V0X2ZyZWVfaW5zdF9pZHgocF9jb3JlX2NvbXApOworICBpZiAoaW5zdF9pZHggPCAwKSB7CisgICAgQUxPR0UoIiVzOiVkXSBDYW5ub3QgYWxsb2MgbmV3IGluc3RhbmNlIiwgX19mdW5jX18sIF9fTElORV9fKTsKKyAgICByYyA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnQ7CisgICAgZ290byBlcnJvcjsKKyAgfQorCisgIGlmIChGQUxTRSA9PSBwX2NvcmVfY29tcC0+b3BlbikgeworICAgIC8qIGxvYWQgdGhlIGxpYnJhcnkgKi8KKyAgICBwX2NvcmVfY29tcC0+bGliX2hhbmRsZSA9IGRsb3BlbihwX2NvcmVfY29tcC0+bGliX25hbWUsIFJUTERfTk9XKTsKKyAgICBpZiAoTlVMTCA9PSBwX2NvcmVfY29tcC0+bGliX2hhbmRsZSkgeworICAgICAgQUxPR0UoIiVzOiVkXSBDYW5ub3QgbG9hZCB0aGUgbGlicmFyeSIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisgICAgICByYyA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnQ7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHBfY29yZV9jb21wLT5vcGVuID0gVFJVRTsKKyAgICAvKiBJbml0IHRoZSBjb21wb25lbnQgYW5kIGdldCBjb21wb25lbnQgZnVuY3Rpb25zICovCisgICAgcF9jb3JlX2NvbXAtPmNyZWF0ZV9jb21wX2Z1bmMgPSBkbHN5bShwX2NvcmVfY29tcC0+bGliX2hhbmRsZSwKKyAgICAgICJjcmVhdGVfY29tcG9uZW50X2ZucyIpOworICAgIHBfY29yZV9jb21wLT5nZXRfaW5zdGFuY2UgPSBkbHN5bShwX2NvcmVfY29tcC0+bGliX2hhbmRsZSwgImdldEluc3RhbmNlIik7CisKKyAgICBjbG9zZV9oYW5kbGUgPSBPTVhfVFJVRTsKKyAgICBpZiAoIXBfY29yZV9jb21wLT5jcmVhdGVfY29tcF9mdW5jIHx8ICFwX2NvcmVfY29tcC0+Z2V0X2luc3RhbmNlKSB7CisgICAgICBBTE9HRSgiJXM6JWRdIENhbm5vdCBtYXBzIHRoZSBzeW1ib2xzIiwgX19mdW5jX18sIF9fTElORV9fKTsKKyAgICAgIHJjID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudDsKKyAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorICB9CisKKyAgLyogQ2FsbCB0aGUgZnVuY3Rpb24gZnJvbSB0aGUgYWRkcmVzcyB0byBjcmVhdGUgdGhlIG9iaiAqLworICBwX29iaiA9ICgqcF9jb3JlX2NvbXAtPmdldF9pbnN0YW5jZSkoKTsKKyAgQUxPR0koIiVzOiVkXSBnZXQgaW5zdGFuY2UgcHRzIGlzICVwIiwgX19mdW5jX18sIF9fTElORV9fLCBwX29iaik7CisgIGlmIChOVUxMID09IHBfb2JqKSB7CisgICAgQUxPR0UoIiVzOiVkXSBFcnJvciBjYW5ub3QgY3JlYXRlIG9iamVjdCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisgICAgcmMgPSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50OworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAvKiBDYWxsIHRoZSBmdW5jdGlvbiBmcm9tIHRoZSBhZGRyZXNzIHRvIGdldCB0aGUgZnVuYyBwdHJzICovCisgIHBfY29tcCA9ICgqcF9jb3JlX2NvbXAtPmNyZWF0ZV9jb21wX2Z1bmMpKHBfb2JqKTsKKyAgaWYgKE5VTEwgPT0gcF9jb21wKSB7CisgICAgQUxPR0UoIiVzOiVkXSBFcnJvciBjYW5ub3QgY3JlYXRlIGNvbXBvbmVudCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisgICAgcmMgPSBPTVhfRXJyb3JJbnZhbGlkQ29tcG9uZW50OworICAgIGdvdG8gZXJyb3I7CisgIH0KKworICAqaGFuZGxlID0gcF9jb3JlX2NvbXAtPmhhbmRsZVtpbnN0X2lkeF0gPSAoT01YX0hBTkRMRVRZUEUpcF9jb21wOworCisgIEFMT0dEKCIlczolZF0gaGFuZGxlID0gJXAgSW5zdGFuY2VpbmRleCA9ICVkLCIKKyAgICAiY29tcF9pZHggJWQgZ19wdHIgJXAiLCBfX2Z1bmNfXywgX19MSU5FX18sCisgICAgcF9jb3JlX2NvbXAtPmhhbmRsZVtpbnN0X2lkeF0sIGluc3RfaWR4LAorICAgIGNvbXBfaWR4LCBnX29teGNvcmUpOworCisgIHBfY29tcC0+U2V0Q2FsbGJhY2tzKHBfY29tcCwgY2FsbEJhY2tzLCBhcHBEYXRhKTsKKyAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfb214Y29yZV9sb2NrKTsKKyAgQUxPR0koIiVzOiVkXSBTdWNjZXNzIiwgX19mdW5jX18sIF9fTElORV9fKTsKKyAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisKK2Vycm9yOgorCisgIGlmIChPTVhfVFJVRSA9PSBjbG9zZV9oYW5kbGUpIHsKKyAgICBkbGNsb3NlKHBfY29yZV9jb21wLT5saWJfaGFuZGxlKTsKKyAgICBwX2NvcmVfY29tcC0+bGliX2hhbmRsZSA9IE5VTEw7CisgIH0KKyAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfb214Y29yZV9sb2NrKTsKKyAgQUxPR0UoIiVzOiVkXSBFcnJvciAlZCIsIF9fZnVuY19fLCBfX0xJTkVfXywgcmMpOworICByZXR1cm4gcmM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIEZ1bmN0aW9uIDogZ2V0SW5kZXhGcm9tQ29tcG9uZW50CisqIFBhcmFtZXRlcnM6IGhhbmRsZSwKKyogUmV0dXJuIFZhbHVlIDogQ29tcG9uZW50IHByZXNlbnQgLSB0cnVlIG9yIGZhbHNlLCBJbnN0YW5jZSBJbmRleCwgQ29tcG9uZW50CisqIEluZGV4CisqIERlc2NyaXB0aW9uOiBDaGVjayBpZiB0aGUgaGFuZGxlIGlzIHByZXNlbnQgaW4gdGhlIGxpc3QgYW5kIGdldCB0aGUgY29tcG9uZW50CisqIGluZGV4IGFuZCBpbnN0YW5jZSBpbmRleCBmb3IgdGhlIGNvbXBvbmVudCBoYW5kbGUuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworc3RhdGljIGludCBnZXRfaWR4X2Zyb21faGFuZGxlKE9NWF9JTiBPTVhfSEFORExFVFlQRSAqYWhDb21wLCBpbnQgKmFDb21wSWR4LAorICBpbnQgKmFJbnN0SWR4KQoreworICBpbnQgaSA9IDAsIGogPSAwOworICBmb3IgKGkgPSAwOyBpIDwgZ19vbXhjb3JlLT5jb21wX2NudDsgaSsrKSB7CisgICAgZm9yIChqID0gMDsgaiA8IE9NWF9DT01QX01BWF9JTlNUQU5DRVM7IGorKykgeworICAgICAgaWYgKChPTVhfQ09NUE9ORU5UVFlQRSAqKWdfb214Y29yZS0+Y29tcG9uZW50W2ldLmhhbmRsZVtqXSA9PQorICAgICAgICAoT01YX0NPTVBPTkVOVFRZUEUgKilhaENvbXApIHsKKyAgICAgICAgQUxPR0QoIiVzOiVkXSBjb21wX2lkeCAlZCBpbnN0X2lkeCAlZCIsIF9fZnVuY19fLCBfX0xJTkVfXywgaSwgaik7CisgICAgICAgICphQ29tcElkeCA9IGk7CisgICAgICAgICphSW5zdElkeCA9IGo7CisgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIEZ1bmN0aW9uIDogaXNfY29tcF9hY3RpdmUKKyogUGFyYW1ldGVyczogcF9jb3JlX2NvbXAKKyogUmV0dXJuIFZhbHVlIDogaW50CisqIERlc2NyaXB0aW9uOiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGhhcyBhbnkgYWN0aXZlIGluc3RhbmNlcworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3N0YXRpYyB1aW50OF90IGlzX2NvbXBfYWN0aXZlKG9teF9jb3JlX2NvbXBvbmVudF90ICpwX2NvcmVfY29tcCkKK3sKKyAgdWludDhfdCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IE9NWF9DT01QX01BWF9JTlNUQU5DRVM7IGkrKykgeworICAgIGlmIChOVUxMICE9IHBfY29yZV9jb21wLT5oYW5kbGVbaV0pIHsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqIEZ1bmN0aW9uIDogT01YX0ZyZWVIYW5kbGUKKyogUGFyYW1ldGVyczogaENvbXAKKyogUmV0dXJuIFZhbHVlIDogT01YX0VSUk9SVFlQRQorKiBEZXNjcmlwdGlvbjogRGVpbml0IHRoZSBvbXggY29tcG9uZW50IGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZ2xvYmFsIGxpc3QKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9GcmVlSGFuZGxlKAorICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXApCit7CisgIE9NWF9FUlJPUlRZUEUgcmMgPSBPTVhfRXJyb3JOb25lOworICBpbnQgY29tcF9pZHgsIGluc3RfaWR4OworICBPTVhfQ09NUE9ORU5UVFlQRSAqcF9jb21wID0gTlVMTDsKKyAgb214X2NvcmVfY29tcG9uZW50X3QgKnBfY29yZV9jb21wID0gTlVMTDsKKworICBBTE9HVigiJXM6JWRdICIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisgIGlmIChoQ29tcCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgfQorCisgIHB0aHJlYWRfbXV0ZXhfbG9jaygmZ19vbXhjb3JlX2xvY2spOworCisgIHBfY29tcCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wOworICBpZiAoRkFMU0UgPT0gZ2V0X2lkeF9mcm9tX2hhbmRsZShoQ29tcCwgJmNvbXBfaWR4LCAmaW5zdF9pZHgpKSB7CisgICAgQUxPR0UoIiVzOiVkXSBFcnJvciBpbnZhbGlkIGNvbXBvbmVudCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfb214Y29yZV9sb2NrKTsKKyAgICByZXR1cm4gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudDsKKyAgfQorCisKKyAgLy9EZWluaXQgdGhlIGNvbXBvbmVudDsKKyAgcmMgPSBwX2NvbXAtPkNvbXBvbmVudERlSW5pdChoQ29tcCk7CisgIGlmIChyYyAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgLyogUmVtb3ZlIHRoZSBoYW5kbGUgZnJvbSB0aGUgY29tcCBzdHJ1Y3R1cmUgKi8KKyAgICBBTE9HRSgiJXM6JWRdIEVycm9yIGNvbXAgZGVpbml0IGZhaWxlZCIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdfb214Y29yZV9sb2NrKTsKKyAgICByZXR1cm4gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudDsKKyAgfQorICBwX2NvcmVfY29tcCA9ICZnX29teGNvcmUtPmNvbXBvbmVudFtjb21wX2lkeF07CisgIHBfY29yZV9jb21wLT5oYW5kbGVbaW5zdF9pZHhdID0gTlVMTDsKKyAgaWYgKCFpc19jb21wX2FjdGl2ZShwX2NvcmVfY29tcCkpIHsKKyAgICByYyA9IGRsY2xvc2UocF9jb3JlX2NvbXAtPmxpYl9oYW5kbGUpOworICAgIHBfY29yZV9jb21wLT5saWJfaGFuZGxlID0gTlVMTDsKKyAgICBwX2NvcmVfY29tcC0+Z2V0X2luc3RhbmNlID0gTlVMTDsKKyAgICBwX2NvcmVfY29tcC0+Y3JlYXRlX2NvbXBfZnVuYyA9IE5VTEw7CisgICAgcF9jb3JlX2NvbXAtPm9wZW4gPSBGQUxTRTsKKyAgfSBlbHNlIHsKKyAgICBBTE9HSSgiJXM6JWRdIEVycm9yIENvbXBvbmVudCBpcyBzdGlsbCBBY3RpdmUiLCBfX2Z1bmNfXywgX19MSU5FX18pOworICB9CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnX29teGNvcmVfbG9jayk7CisgIEFMT0dWKCIlczolZF0gU3VjY2VzcyIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisgIHJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL21zbWNvYmFsdC9tbS1pbWFnZS1jb2RlYy9xb214X2NvcmUvcW9teF9jb3JlLmggYi9tc21jb2JhbHQvbW0taW1hZ2UtY29kZWMvcW9teF9jb3JlL3FvbXhfY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYWM4MGYKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvbW0taW1hZ2UtY29kZWMvcW9teF9jb3JlL3FvbXhfY29yZS5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKK0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKK0JFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKK0NPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCitTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKK0JVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKK09SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KK0lGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiovCisKKyNpZm5kZWYgUU9NWF9DT1JFX0gKKyNkZWZpbmUgUU9NWF9DT1JFX0gKKworLy8gVG8gcmVtb3ZlIChhZnRlciBQYW5vTmF0aXZlIGlzIHVwZGF0ZWQpCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIFN5c3RlbSBkZXBlbmRlbmNpZXMKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKy8vIE9wZW5NQVggZGVwZW5kZW5jaWVzCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorCisjZGVmaW5lIFRSVUUgMQorI2RlZmluZSBGQUxTRSAwCisjZGVmaW5lIE9NWF9DT01QX01BWF9JTlNUQU5DRVMgMworI2RlZmluZSBPTVhfQ09SRV9NQVhfUk9MRVMgMQorI2RlZmluZSBPTVhfQ09NUF9NQVhfTlVNIDMKKyNkZWZpbmUgT01YX1NQRUNfVkVSU0lPTiAweDAwMDAwMTAxCisKK3R5cGVkZWYgdm9pZCAqKCpnZXRfaW5zdGFuY2VfdCkodm9pZCk7Cit0eXBlZGVmIHZvaWQgKigqY3JlYXRlX2NvbXBfZnVuY190KShPTVhfUFRSIGFvYmopOworCisvKiogY29tcF9pbmZvX3Q6IFN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBtYXBwaW5nCisqICAgIGJldHdlZW4gdGhlIGxpYnJhcnkgbmFtZSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgLnNvIG5hbWUKKyogICAgQGNvbXBfbmFtZTogbmFtZSBvZiB0aGUgY29tcG9uZW50CisgICAgIEBsaWJfbmFtZTogTmFtZSBvZiB0aGUgLnNvIGxpYnJhcnkKKyoqLwordHlwZWRlZiBzdHJ1Y3QgY29tcF9pbmZvX3QgeworICBjaGFyICpjb21wX25hbWU7CisgIGNoYXIgKmxpYl9uYW1lOworfSBjb21wX2luZm9fdDsKKworLyoqIG9teF9jb3JlX2NvbXBvbmVudF90OiBPTVggQ29tcG9uZW50IHN0cnVjdHVyZQorKiAgICBAaGFuZGxlOiBhcnJheSBvZiBudW1iZXIgb2YgaW5zdGFuY2VzIG9mIHRoZSBjb21wb25lbnQKKyogICAgQHJvbGVzOiBhcnJheSBvZiByb2xlcyBwbGF5ZWQgYnkgdGhlIGNvbXBvbmVudAorKiAgICBAY29tcF9pbmZvOiBDb21wb25lbnQgaW5mb3JtYXRpb24gc3VjaCBhcyBsaWJuYW1lLAorKiAgICAgICAgICAgICAgY29tcG9uZW50IG5hbWUKKyogICAgQG9wZW46IElzIHRoZSBjb21wb25lbnQgYWN0aXZlCisqICAgIEBsaWJfaGFuZGxlOiBMaWJyYXJ5IGhhbmRsZSBhZnRlciBkbG9wZW4KKyogICAgQG9ial9wdHI6IEZ1bmN0aW9uIHB0ciB0byBnZXQgdGhlIGluc3RhbmNlIG9mIHRoZSBjb21wb25lbnQKKyogICAgQGNvbXBfZnVuY19wdHI6IEZ1bmN0aW9uIHB0ciB0byBtYXAgdGhlIGZ1bmN0aW9ucyBpbiB0aGUKKyogICAgIE9NWCBoYW5kbGUgdG8gaXRzIHJlc3BlY3RpdmUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gaW4KKyogICAgIHRoZSBjb21wb25lbnQKKyoqLwordHlwZWRlZiBzdHJ1Y3QgX29teF9jb3JlX2NvbXBvbmVudF90IHsKKyAgT01YX0hBTkRMRVRZUEUgKmhhbmRsZVtPTVhfQ09NUF9NQVhfSU5TVEFOQ0VTXTsgIC8vSW5zdGFuY2UgaGFuZGxlCisgIGNoYXIgKnJvbGVzW09NWF9DT1JFX01BWF9ST0xFU107ICAvL1JvbGVzIHBsYXllZCBieSB0aGUgY29tcG9uZW50CisgIGNoYXIgKm5hbWU7ICAvL0NvbXBvbmVudCBOYW1lCisgIHVpbnQ4X3Qgb3BlbjsgIC8vSXMgY29tcG9uZW50IGFjdGl2ZQorICB2b2lkICpsaWJfaGFuZGxlOworICBnZXRfaW5zdGFuY2VfdCBnZXRfaW5zdGFuY2U7CisgIGNyZWF0ZV9jb21wX2Z1bmNfdCBjcmVhdGVfY29tcF9mdW5jOworICBjaGFyICpjb21wX25hbWU7CisgIGNoYXIgKmxpYl9uYW1lOworfSBvbXhfY29yZV9jb21wb25lbnRfdDsKKworLyoqIG9teF9jb3JlX3Q6IEdsb2JhbCBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgdGhlIGFjdGl2ZQorKiAgIGNvbXBvbmVudHMKKyogICAgQGNvbXBvbmVudDogYXJyYXkgb2YgYWN0aXZlIGNvbXBvbmVudHMKKyogICAgQGlzX2luaXRpYWxpemVkOiBGbGFnIHRvIGNoZWNrIGlmIHRoZSBPTVggY29yZSBoYXMgYmVlbgorKiAgICBpbml0aWFsaXplZAorKiAgICBAY29yZV9sb2NrOiBMb2NrIHRvIHN5bmNyb25pemUgdGhlIG9teCBjb3JlIG9wZXJhdGlvbnMKKyoqLwordHlwZWRlZiBzdHJ1Y3QgX29teF9jb3JlX3QgeworICBvbXhfY29yZV9jb21wb25lbnRfdCBjb21wb25lbnRbT01YX0NPTVBfTUFYX05VTV07ICAvL0FycmF5IG9mIHBvaW50ZXJzIHRvIGNvbXBvbmVudHMKKyAgaW50IGNvbXBfY250OworICBwdGhyZWFkX211dGV4X3QgY29yZV9sb2NrOworfSBvbXhfY29yZV90OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC91c2JjYW1jb3JlL2luYy9RQ2FtZXJhTWpwZWdEZWNvZGUuaCBiL21zbWNvYmFsdC91c2JjYW1jb3JlL2luYy9RQ2FtZXJhTWpwZWdEZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMDQxODJiCi0tLSAvZGV2L251bGwKKysrIGIvbXNtY29iYWx0L3VzYmNhbWNvcmUvaW5jL1FDYW1lcmFNanBlZ0RlY29kZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9fUUNBTUVSQV9NSlBFR19ERUNPREVfSAorI2RlZmluZSBfX1FDQU1FUkFfTUpQRUdfREVDT0RFX0gKKwordHlwZWRlZiBpbnQgTUpQRUdEX0VSUjsKKyNkZWZpbmUgTUpQRUdEX05PX0VSUk9SICAgICAgICAgIDAKKyNkZWZpbmUgTUpQRUdEX0VSUk9SICAgICAgICAgICAgLTEKKyNkZWZpbmUgTUpQRUdEX0lOU1VGRklDSUVOVF9NRU0gLTIKKworTUpQRUdEX0VSUiBtanBlZ0RlY29kZXJJbml0KHZvaWQqKik7CisKK01KUEVHRF9FUlIgbWpwZWdEZWNvZGVyRGVzdHJveSh2b2lkKiBtanBlZ2QpOworCitNSlBFR0RfRVJSIG1qcGVnRGVjb2RlKAorICAgICAgICAgICAgdm9pZCogICBtanBlZ2QsCisgICAgICAgICAgICBjaGFyKiAgIG1qcGVnQnVmZmVyLAorICAgICAgICAgICAgaW50ICAgICBtanBlZ0J1ZmZlclNpemUsCisgICAgICAgICAgICBjaGFyKiAgIG91dHB1dFlwdHIsCisgICAgICAgICAgICBjaGFyKiAgIG91dHB1dFVWcHRyLAorICAgICAgICAgICAgaW50ICAgICBvdXRwdXRGb3JtYXQpOworCisjZW5kaWYgLyogX19RQ0FNRVJBX01KUEVHX0RFQ09ERV9IICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvdXNiY2FtY29yZS9pbmMvUUNhbWVyYVVzYlBhcm0uaCBiL21zbWNvYmFsdC91c2JjYW1jb3JlL2luYy9RQ2FtZXJhVXNiUGFybS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5NWJmNDIKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvdXNiY2FtY29yZS9pbmMvUUNhbWVyYVVzYlBhcm0uaApAQCAtMCwwICsxLDE3OCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUUNBTUVSQV9VU0JfUEFSTV9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUUNBTUVSQV9VU0JfUEFSTV9ICisKKworI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvUUNhbWVyYVBhcmFtZXRlcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2NhbWVyYS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgorI2luY2x1ZGUgPGdyYWxsb2NfcHJpdi5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL3Bvd2VyLmg+CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPGxpbnV4L2FuZHJvaWRfcG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21zbV9pb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEuaD4KKyNpbmNsdWRlIDxjYW1lcmFfZGVmc19pLmg+Cit9IC8vZXh0ZXJuIEMKKworLy9FcnJvciBjb2RlcworI2RlZmluZSBOT1RfRk9VTkQgICAgICAgLTEKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBNYWNybyBkZWZpbml0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZW51bSBkZWZpbml0aW9ucyBmb3IgcGljdHVyZSBmb3JtYXRzICovCitzdGF0aWMgY29uc3QgaW50IFBJQ1RVUkVfRk9STUFUX0pQRUcgPSAxOworc3RhdGljIGNvbnN0IGludCBQSUNUVVJFX0ZPUk1BVF9SQVcgPSAyOworCisvKiBEZWZhdWx0IHByZXZpZXcgd2lkdGggaW4gcGl4ZWxzICovCisjZGVmaW5lIERFRkFVTFRfVVNCQ0FNX1BSVldfV0QgIDEyODAvLzY0MAorCisvKiBEZWZhdWx0IHByZXZpZXcgaGVpZ2h0IGluIHBpeGVscyAqLworI2RlZmluZSBERUZBVUxUX1VTQkNBTV9QUlZXX0hUICA3MjAvLzQ4MAorCisvKiBEZWZhdWx0IHBpY3R1cmUgZm9ybWF0ICovCisjZGVmaW5lIERFRkFVTFRfVVNCQ0FNX1BJQ1RfRk1UICAgICBQSUNUVVJFX0ZPUk1BVF9KUEVHCisKKy8qIERlZmF1bHQgcGljdHVyZSB3aWR0aCBpbiBwaXhlbHMgKi8KKyNkZWZpbmUgREVGQVVMVF9VU0JDQU1fUElDVF9XRCAgNjQwCisKKy8qIERlZmF1bHQgcGljdHVyZSBoZWlnaHQgaW4gcGl4ZWxzICovCisjZGVmaW5lIERFRkFVTFRfVVNCQ0FNX1BJQ1RfSFQgIDQ4MAorCisvKiBEZWZhdWx0IHBpY3R1cmUgSlBFRyBxdWFsaXR5IDAtMTAwICovCisjZGVmaW5lIERFRkFVTFRfVVNCQ0FNX1BJQ1RfUUxUWSAgODUKKworLyogRGVmYXVsdCB0aHVtYm5haWwgd2lkdGggaW4gcGl4ZWxzICovCisjZGVmaW5lIERFRkFVTFRfVVNCQ0FNX1RIVU1CTkFJTF9XRCAgICA0MzIKKworLyogRGVmYXVsdCB0aHVtYm5haWwgaGVpZ2h0IGluIHBpeGVscyAqLworI2RlZmluZSBERUZBVUxUX1VTQkNBTV9USFVNQk5BSUxfSFQgICAgMjg4CisKKy8qIERlZmF1bHQgdGh1bWJuYWlsIEpQRUcgcXVhbGl0eSAwLTEwMCAqLworI2RlZmluZSBERUZBVUxUX1VTQkNBTV9USFVNQk5BSUxfUUxUWSAgODUKKworLyogRGVmYXVsdCBwcmV2aWV3IGZvcm1hdCAqLworI2RlZmluZSBERUZBVUxUX1VTQkNBTV9QUlZXX0ZNVCBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUAorCisvKiBtaW5pbXVtIG9mIHRoZSBkZWZhdWx0IHByZXZpZXcgZnBzIHJhbmdlIGluIG1pbGxpLUh6ICovCisjZGVmaW5lIE1JTl9QUkVWX0ZQUyAgICAgICAgICAgIDUwMDAKKworLyogbWF4aW11bSBvZiB0aGUgZGVmYXVsdCBwcmV2aWV3IGZwcyByYW5nZSBpbiBtaWxsaS1IeiAqLworI2RlZmluZSBNQVhfUFJFVl9GUFMgICAgICAgICAgICAxMjEwMDAKKworLy9mb3IgaGlzdG9ncmFtIHN0YXRzCisjZGVmaW5lIEhJU1RPR1JBTV9TVEFUU19TSVpFIDI1NworI2RlZmluZSBOVU1fSElTVE9HUkFNX0JVRkZFUlMgMworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogU3RydWN0dXJlIGRlZmluaXRpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgYXNwZWN0X3JhdGlvOworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKK30gdGh1bWJuYWlsX3NpemVfdHlwZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHVzYkNhbUluaXREZWZhdWx0UGFyYW1ldGVycworICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gc2V0cyBkZWZhdWx0IHBhcmFtZXRlcnMgdG8gY2FtZXJhIEhBTCBjb250ZXh0CisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICAgY2FtSGFsICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgICAgMCAgIE5vIGVycm9yCisgKiAgICAgIC0xICBFcnJvcgorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdXNiQ2FtSW5pdERlZmF1bHRQYXJhbWV0ZXJzKGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWwpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogdXNiQ2FtU2V0UGFyYW1ldGVycworICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBwYXJhbWV0ZXIgc3RyaW5nIGFuZCBzdG9yZXMgdGhlCisgKiAgICAgICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgY2FtZXJhIEhBTCBoYW5kbGUKKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogIGNhbUhhbCAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICogIHBhcmFtcyAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIHBhcmFtZXRlciBzdHJpbmcKKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogICAgICAwICAgU3VjY2VzcworICogICAgICAtMSAgRXJyb3IKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgdXNiQ2FtU2V0UGFyYW1ldGVycyhjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsLCBjb25zdCBjaGFyICpwYXJhbXMpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogdXNiQ2FtR2V0UGFyYW1ldGVycworICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3IgcGFyYW1ldGVyIHN0cmluZywKKyAqICAgICAgICAgICAgICBjb21wb3NlcyBhbmQgcmV0dXJucyB0aGUgcGFyYW1ldGVyIHN0cmluZworICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIGNhbUhhbCAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgICAgQWRkcmVzcyB0byB0aGUgcGFyYW1ldGVyIHN0cmluZworICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyKiB1c2JDYW1HZXRQYXJhbWV0ZXJzKGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWwpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogdXNiQ2FtUHV0UGFyYW1ldGVycworICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHBhcmFtZXRlciBzdHJpbmcKKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogIGNhbUhhbCAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICogIHBhcm1zICAgICAgICAgICAgICAgLSBQYXJhbWV0ZXIgc3RyaW5nCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgICAgMCAgIFN1Y2Nlc3MKKyAqICAgICAgLTEgIEVycm9yCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB1c2JDYW1QdXRQYXJhbWV0ZXJzKGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWwsIGNoYXIgKnBhcm1zKTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qIEFORFJPSURfSEFSRFdBUkVfUUNBTUVSQV9VU0JfUEFSTV9IICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvdXNiY2FtY29yZS9pbmMvUUNhbWVyYVVzYlByaXYuaCBiL21zbWNvYmFsdC91c2JjYW1jb3JlL2luYy9RQ2FtZXJhVXNiUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjliNjBjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvdXNiY2FtY29yZS9pbmMvUUNhbWVyYVVzYlByaXYuaApAQCAtMCwwICsxLDIwMiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEyLCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisgKiAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIFRoZSBMaW51eCBGb3VuZGF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAqIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOCisgKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfUUNBTUVSQV9VU0JfUFJJVl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfUUNBTUVSQV9VU0JfUFJJVl9ICisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyogRmlsZSBuYW1lIGxlbmd0aCBpbiBudW1iZXIgb2YgY2hhcmFjdGVycyAqLworI2RlZmluZSBGSUxFTkFNRV9MRU5HVEggICAgICgyNTYpCisKKy8qIE51bWJlciBvZiBkaXNwbGF5IGJ1ZmZlcnMgKGluIGFkZGl0aW9uIHRvIG1pbmltdW0gbnVtYmVyIG9mIHVuZGVxdWVkIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgUFJWV19ESVNQX0JVRl9DTlQgICAyCisKKy8qIE51bWJlciBvZiBWNEwyIGNhcHR1cmUgIGJ1ZmZlcnMuICovCisjZGVmaW5lIFBSVldfQ0FQX0JVRl9DTlQgICAgNAorCisvKiBNYXhpbXVtIGJ1ZmZlciBzaXplIGZvciBKUEVHIG91dHB1dCBpbiBudW1iZXIgb2YgYnl0ZXMgKi8KKyNkZWZpbmUgTUFYX0pQRUdfQlVGRkVSX1NJWkUgICAgKDEwMjQgKiAxMDI0KQorCisvKiBQcmV2aWV3IGxvb3AgY29tbWFuZHMgKi8KKyNkZWZpbmUgVVNCX0NBTV9QUkVWSUVXX0VYSVQgICAgKDB4MTAwKQorI2RlZmluZSBVU0JfQ0FNX1BSRVZJRVdfUEFVU0UgICAoMHgxMDEpCisjZGVmaW5lIFVTQl9DQU1fUFJFVklFV19UQUtFUElDICgweDIwMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWFjcm8gZnVuY3Rpb24gdG8gaW5wdXQgdmFsaWRhdGUgZGV2aWNlIGhhbmRsZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBWQUxJREFURV9ERVZJQ0VfSERMKGNhbUhhbCwgZGV2aWNlLCByZXRfZXJyX2NvZGUpICAgICB7XAorICAgIGlmKGRldmljZSAmJiBkZXZpY2UtPnByaXYpe1wKKyAgICAgICAgY2FtSGFsID0gKGNhbWVyYV9oYXJkd2FyZV90ICopZGV2aWNlLT5wcml2O1wKKyAgICB9ZWxzZXtcCisgICAgICAgIEFMT0dFKCIlczogTnVsbCBkZXZpY2Ugb3IgZGV2aWNlLT5wcml2IiwgX19mdW5jX18pO1wKKyAgICAgICAgcmV0dXJuIHJldF9lcnJfY29kZTtcCisgICAgfVwKK31cCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1hY3JvIGZ1bmN0aW9uIHRvIGNoZWNrIHJldHVybiBzdGF0dXMgb2YgYSBmdW5jdGlvbiwgbG9nIGFuZCBleGl0IHRoZSB0aHJlYWQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRVJST1JfQ0hFQ0tfRVhJVF9USFJFQUQocmMsIHN0cmluZykgICAge1wKKyAgICBpZihyYyA8IDApIHtcCisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgJXMiLCBfX2Z1bmNfXywgc3RyaW5nKTtcCisgICAgICAgIHJldHVybiAodm9pZCAqKS0xO1wKKyAgICB9XAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYWNybyBmdW5jdGlvbiB0byBjaGVjayByZXR1cm4gc3RhdHVzIG9mIGEgZnVuY3Rpb24sIGxvZyBhbmQgZXhpdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBFUlJPUl9DSEVDS19FWElUKHJjLCBzdHJpbmcpICAgIHtcCisgICAgaWYocmMgPCAwKSB7XAorICAgICAgICBBTE9HRSgiJXM6IEVycm9yICVzIiwgX19mdW5jX18sIHN0cmluZyk7XAorICAgICAgICByZXR1cm4gLTE7XAorICAgIH1cCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTWFjcm8gZnVuY3Rpb24gdG8gUHJpbnQgdGhlIHBhcmFtZXRlciBzdHJpbmcgMTAwMCBjaGFyYWN0ZXJzIGF0IGEgdGltZQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBQUklOVF9QQVJBTV9TVFIocGFybXMpICAgIHtcCisgICAgICAgIGNoYXIgdGVtcFsxMDAxXSA9IHswfTtcCisgICAgICAgIGludCBuPTA7XAorICAgICAgICB3aGlsZSgxKSB7XAorICAgICAgICAgICAgc3RybGNweSh0ZW1wLHBhcm1zK24sMTAwMCk7XAorICAgICAgICAgICAgQUxPR0QoInBhcm1zID0gJXMiLCB0ZW1wKTtcCisgICAgICAgICAgICBpZiAoc3RybGVuKHRlbXApIDwgMTAwMCkgYnJlYWs7XAorICAgICAgICAgICAgbiArPSAxMDAwO1wKKyAgICAgICAgfVwKKyAgICB9XAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYWNybyBmdW5jdGlvbiB0byBvcGVuIGNhbWVyYQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBVU0JfQ0FNX09QRU4oY2FtSGFsKSAgICB7XAorICAgICAgICBjYW1IYWwtPmZkID0gb3BlbihjYW1IYWwtPmRldl9uYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLLCAwKTtcCisgICAgICAgIGlmKCFjYW1IYWwtPmZkKVwKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW4gb3BlbiIsIF9fZnVuY19fKTtcCisgICAgICAgIGVsc2VcCisgICAgICAgICAgICBBTE9HRCgiJXM6IFN1Y2Nlc3NmdWxseSBvcGVuZWQiLCBfX2Z1bmNfXyk7XAorICAgICAgICB9XAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBNYWNybyBmdW5jdGlvbiB0byBjbG9zZSBjYW1lcmEKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVVNCX0NBTV9DTE9TRShjYW1IYWwpIHtcCisgICAgICAgIGludCByYztcCisgICAgICAgIGlmKGNhbUhhbC0+ZmQpe1wKKyAgICAgICAgICAgIHJjID0gY2xvc2UoY2FtSGFsLT5mZCk7XAorICAgICAgICAgICAgaWYoMCA+IHJjKXtcCisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjbG9zZSBmYWlsZWQgIiwgX19mdW5jX18pO1wKKyAgICAgICAgICAgIH1cCisgICAgICAgICAgICBlbHNle1wKKyAgICAgICAgICAgICAgICBjYW1IYWwtPmZkID0gMDtcCisgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiBjbG9zZSBzdWNjZXNzZnVsIiwgX19mdW5jX18pO1wKKyAgICAgICAgICAgIH1cCisgICAgICAgIH1cCisgICAgfVwKKworc3RydWN0IGJ1Zk9iaiB7CisgICAgdm9pZCAgICAqZGF0YTsKKyAgICBpbnQgICAgIGxlbjsKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjYW1lcmFfZGV2aWNlICAgICAgICAgICAgICAgICAgICAgICBod19kZXY7CisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jazsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aWV3RW5hYmxlZEZsYWc7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJ2d1N0b3BwZWRGb3JQaWN0dXJlOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ0VuYWJsZWRGbGFnOworICAgIHZvbGF0aWxlIGludCAgICAgICAgICAgICAgICAgICAgICAgIHBydndDbWRQZW5kaW5nOworICAgIHZvbGF0aWxlIGludCAgICAgICAgICAgICAgICAgICAgICAgIHBydndDbWQ7CisgICAgcHRocmVhZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlld1RocmVhZDsKKyAgICBwdGhyZWFkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlUGljdHVyZVRocmVhZDsKKworICAgIGNhbWVyYV9ub3RpZnlfY2FsbGJhY2sgICAgICAgICAgICAgIG5vdGlmeV9jYjsKKyAgICBjYW1lcmFfZGF0YV9jYWxsYmFjayAgICAgICAgICAgICAgICBkYXRhX2NiOworICAgIGNhbWVyYV9kYXRhX3RpbWVzdGFtcF9jYWxsYmFjayAgICAgIGRhdGFfY2JfdGltZXN0YW1wOworICAgIGNhbWVyYV9yZXF1ZXN0X21lbW9yeSAgICAgICAgICAgICAgIGdldF9tZW1vcnk7CisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JfY3R4dDsKKworICAgIC8qIGNhcHR1cmUgcmVsYXRlZCBtZW1iZXJzICovCisgICAgLyogcHJldkZvcm1hdCBpcyBwaXhlbCBmb3JtYXQgb2YgcHJldmlldyBidWZmZXJzIHRoYXQgYXJlIGV4cG9ydGVkICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkZvcm1hdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2RnBzOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZXaWR0aDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2SGVpZ2h0OworICAgIC8qIGNhcHR1cmVGb3JtYXQgaXMgaW50ZXJuYWwgc2V0dGluZyBmb3IgVVNCIGNhbWVyYSBidWZmZXJzICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZUZvcm1hdDsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfbmFtZVtGSUxFTkFNRV9MRU5HVEhdOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkOworICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICAgICAgICAgIG5fYnVmZmVyczsKKyAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgICAgICAgICAgICAgICAgICBjdXJDYXB0dXJlQnVmOworICAgIHN0cnVjdCBidWZPYmogICAgICAgICAgICAgICAgICAgICAgICpidWZmZXJzOworCisgICAgLyogRGlzcGxheSByZWxhdGVkIG1lbWJlcnMgKi8KKyAgICBwcmV2aWV3X3N0cmVhbV9vcHMqICAgICAgICAgICAgICAgICB3aW5kb3c7CisgICAgUUNhbWVyYUhhbE1lbW9yeV90ICAgICAgICAgICAgICAgICAgcHJldmlld01lbTsKKyAgICAvKiBkaXNwRm9ybWF0IGlzIHByZXZpZXcgZGlzcGxheSBmb3JtYXQuU2FtZSBhcyBwcmV2aWV3IGJ1ZmZlciBmb3JtYXQqLworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BGb3JtYXQ7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcFdpZHRoOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BIZWlnaHQ7CisKKyAgICAvKiBNSlBFRyBkZWNvZGVyIHJlbGF0ZWQgbWVtYmVycyAqLworICAgIC8qIE1KUEVHIGRlY29kZXIgb2JqZWN0ICovCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWpwZWdkOworCisgICAgLyogSlBFRyBwaWN0dXJlIGFuZCB0aHVtYm5haWwgcmVsYXRlZCBtZW1iZXJzICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdEZvcm1hdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0V2lkdGg7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdEhlaWdodDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0SnBlZ1FsdHk7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsV2lkdGg7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsSGVpZ2h0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRodW1ibmFpbEpwZWdRbHR5OworICAgIFFDYW1lcmFIYWxNZW1vcnlfdCAgICAgICAgICAgICAgICAgIHBpY3RNZW07CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVBpY3RJblByb2dyZXNzOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdFbmNJblByb2dyZXNzOworICAgIHB0aHJlYWRfbXV0ZXhfdCAgICAgICAgICAgICAgICAgICAgIGpwZWdFbmNNdXRleDsKKyAgICBwdGhyZWFkX2NvbmRfdCAgICAgICAgICAgICAgICAgICAgICBqcGVnRW5jQ29uZDsKKworICAgIC8qICovCisgICAgUUNhbWVyYVBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgcUNhbVBhcmFtczsKKyAgICBTdHJpbmc4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2U2l6ZVZhbHVlczsKKyAgICBTdHJpbmc4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0U2l6ZVZhbHVlczsKKyAgICBTdHJpbmc4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHVtYm5haWxTaXplVmFsdWVzOworICAgIFN0cmluZzggICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZFNpemVWYWx1ZXM7CisgICAgU3RyaW5nOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdEZvcm1hdFZhbHVlczsKKyAgICBTdHJpbmc4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Rm9ybWF0VmFsdWVzOworICAgIFN0cmluZzggICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZGcHNSYW5nZXNWYWx1ZXM7CisKK30gY2FtZXJhX2hhcmR3YXJlX3Q7CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8qIEFORFJPSURfSEFSRFdBUkVfUUNBTUVSQV9VU0JfUFJJVl9IICovCmRpZmYgLS1naXQgYS9tc21jb2JhbHQvdXNiY2FtY29yZS9pbmMvUXVhbGNvbW1Vc2JDYW1lcmEuaCBiL21zbWNvYmFsdC91c2JjYW1jb3JlL2luYy9RdWFsY29tbVVzYkNhbWVyYS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzODljNzYKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvdXNiY2FtY29yZS9pbmMvUXVhbGNvbW1Vc2JDYW1lcmEuaApAQCAtMCwwICsxLDI0MyBAQAorLyogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9RVUFMQ09NTV9DQU1FUkFfVVNCQ0FNX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9RVUFMQ09NTV9DQU1FUkFfVVNCQ0FNX0gKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KK30KKworI2luY2x1ZGUgIlFDYW1lcmFIV0kuaCIKKworZXh0ZXJuICJDIiB7CisKKy8qI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPiovCisKKyAgICBpbnQgdXNiY2FtX2dldF9udW1iZXJfb2ZfY2FtZXJhcygpOworICAgIGludCB1c2JjYW1fZ2V0X2NhbWVyYV9pbmZvKGludCBjYW1lcmFfaWQsIHN0cnVjdCBjYW1lcmFfaW5mbyAqaW5mbyk7CisKKyAgICBpbnQgdXNiY2FtX2NhbWVyYV9kZXZpY2Vfb3Blbihjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QqIG1vZHVsZSwgY29uc3QgY2hhciogaWQsCisgICAgICAgICAgc3RydWN0IGh3X2RldmljZV90KiogZGV2aWNlKTsKKworICAgIGh3X2RldmljZV90ICogdXNiY2FtX29wZW5fY2FtZXJhX2RldmljZShpbnQgY2FtZXJhSWQpOworCisgICAgaW50IHVzYmNhbV9jbG9zZV9jYW1lcmFfZGV2aWNlKCBod19kZXZpY2VfdCAqKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisgICAgLyoqIFNldCB0aGUgQU5hdGl2ZVdpbmRvdyB0byB3aGljaCBwcmV2aWV3IGZyYW1lcyBhcmUgc2VudCAqLworICAgIGludCB1c2JjYW1fc2V0X3ByZXZpZXdfd2luZG93KHN0cnVjdCBjYW1lcmFfZGV2aWNlICosCisgICAgICAgICAgc3RydWN0IHByZXZpZXdfc3RyZWFtX29wcyAqd2luZG93KTsKKworICAgIC8qKiBTZXQgdGhlIG5vdGlmaWNhdGlvbiBhbmQgZGF0YSBjYWxsYmFja3MgKi8KKyAgICB2b2lkIHVzYmNhbV9zZXRfQ2FsbEJhY2tzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICosCisgICAgICAgICAgY2FtZXJhX25vdGlmeV9jYWxsYmFjayBub3RpZnlfY2IsCisgICAgICAgICAgY2FtZXJhX2RhdGFfY2FsbGJhY2sgZGF0YV9jYiwKKyAgICAgICAgICBjYW1lcmFfZGF0YV90aW1lc3RhbXBfY2FsbGJhY2sgZGF0YV9jYl90aW1lc3RhbXAsCisgICAgICAgICAgY2FtZXJhX3JlcXVlc3RfbWVtb3J5IGdldF9tZW1vcnksCisgICAgICAgICAgdm9pZCAqdXNlcik7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBhbGwgdGFrZSBhIG1zZ190eXBlLCB3aGljaCBpcyBhIGJpdG1hc2sgb2YKKyAgICAgKiB0aGUgbWVzc2FnZXMgZGVmaW5lZCBpbiBpbmNsdWRlL3VpL0NhbWVyYS5oCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgYSBtZXNzYWdlLCBvciBzZXQgb2YgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCB1c2JjYW1fZW5hYmxlX21zZ190eXBlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICosIGludDMyX3QgbXNnX3R5cGUpOworCisgICAgLyoqCisgICAgICogRGlzYWJsZSBhIG1lc3NhZ2UsIG9yIGEgc2V0IG9mIG1lc3NhZ2VzLgorICAgICAqCisgICAgICogT25jZSByZWNlaXZlZCBhIGNhbGwgdG8gZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSksIGNhbWVyYQorICAgICAqIEhBTCBzaG91bGQgbm90IHJlbHkgb24gaXRzIGNsaWVudCB0byBjYWxsIHJlbGVhc2VSZWNvcmRpbmdGcmFtZSgpIHRvCisgICAgICogcmVsZWFzZSB2aWRlbyByZWNvcmRpbmcgZnJhbWVzIHNlbnQgb3V0IGJ5IHRoZSBjYW1lcmFsIEhBTCBiZWZvcmUgYW5kCisgICAgICogYWZ0ZXIgdGhlIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpIGNhbGwuIENhbWVyYSBIQUwKKyAgICAgKiBjbGllbnRzIG11c3Qgbm90IG1vZGlmeS9hY2Nlc3MgYW55IHZpZGVvIHJlY29yZGluZyBmcmFtZSBhZnRlciBjYWxsaW5nCisgICAgICogZGlzYWJsZU1zZ1R5cGUoQ0FNRVJBX01TR19WSURFT19GUkFNRSkuCisgICAgICovCisgICAgdm9pZCB1c2JjYW1fZGlzYWJsZV9tc2dfdHlwZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBpbnQzMl90IG1zZ190eXBlKTsKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IHdoZXRoZXIgYSBtZXNzYWdlLCBvciBhIHNldCBvZiBtZXNzYWdlcywgaXMgZW5hYmxlZC4gIE5vdGUgdGhhdAorICAgICAqIHRoaXMgaXMgb3BlcmF0ZXMgYXMgYW4gQU5ELCBpZiBhbnkgb2YgdGhlIG1lc3NhZ2VzIHF1ZXJpZWQgYXJlIG9mZiwgdGhpcworICAgICAqIHdpbGwgcmV0dXJuIGZhbHNlLgorICAgICAqLworICAgIGludCB1c2JjYW1fbXNnX3R5cGVfZW5hYmxlZChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBpbnQzMl90IG1zZ190eXBlKTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IHByZXZpZXcgbW9kZS4KKyAgICAgKi8KKyAgICBpbnQgdXNiY2FtX3N0YXJ0X3ByZXZpZXcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIGEgcHJldmlvdXNseSBzdGFydGVkIHByZXZpZXcuCisgICAgICovCisgICAgdm9pZCB1c2JjYW1fc3RvcF9wcmV2aWV3KHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHByZXZpZXcgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBpbnQgdXNiY2FtX3ByZXZpZXdfZW5hYmxlZChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgdGhlIGNhbWVyYSBIQUwgdG8gc3RvcmUgbWV0YSBkYXRhIG9yIHJlYWwgWVVWIGRhdGEgaW4gdGhlIHZpZGVvCisgICAgICogYnVmZmVycyBzZW50IG91dCB2aWEgQ0FNRVJBX01TR19WSURFT19GUkFNRSBmb3IgYSByZWNvcmRpbmcgc2Vzc2lvbi4gSWYKKyAgICAgKiBpdCBpcyBub3QgY2FsbGVkLCB0aGUgZGVmYXVsdCBjYW1lcmEgSEFMIGJlaGF2aW9yIGlzIHRvIHN0b3JlIHJlYWwgWVVWCisgICAgICogZGF0YSBpbiB0aGUgdmlkZW8gYnVmZmVycy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0UmVjb3JkaW5nKCkgaW4gb3JkZXIgdG8gYmUKKyAgICAgKiBlZmZlY3RpdmUuCisgICAgICoKKyAgICAgKiBJZiBtZXRhIGRhdGEgaXMgc3RvcmVkIGluIHRoZSB2aWRlbyBidWZmZXJzLCBpdCBpcyB1cCB0byB0aGUgcmVjZWl2ZXIgb2YKKyAgICAgKiB0aGUgdmlkZW8gYnVmZmVycyB0byBpbnRlcnByZXQgdGhlIGNvbnRlbnRzIGFuZCB0byBmaW5kIHRoZSBhY3R1YWwgZnJhbWUKKyAgICAgKiBkYXRhIHdpdGggdGhlIGhlbHAgb2YgdGhlIG1ldGEgZGF0YSBpbiB0aGUgYnVmZmVyLiBIb3cgdGhpcyBpcyBkb25lIGlzCisgICAgICogb3V0c2lkZSBvZiB0aGUgc2NvcGUgb2YgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBTb21lIGNhbWVyYSBIQUxzIG1heSBub3Qgc3VwcG9ydCBzdG9yaW5nIG1ldGEgZGF0YSBpbiB0aGUgdmlkZW8gYnVmZmVycywKKyAgICAgKiBidXQgYWxsIGNhbWVyYSBIQUxzIHNob3VsZCBzdXBwb3J0IHN0b3JpbmcgcmVhbCBZVVYgZGF0YSBpbiB0aGUgdmlkZW8KKyAgICAgKiBidWZmZXJzLiBJZiB0aGUgY2FtZXJhIEhBTCBkb2VzIG5vdCBzdXBwb3J0IHN0b3JpbmcgdGhlIG1ldGEgZGF0YSBpbiB0aGUKKyAgICAgKiB2aWRlbyBidWZmZXJzIHdoZW4gaXQgaXMgcmVxdWVzdGVkIHRvIGRvIGRvLCBJTlZBTElEX09QRVJBVElPTiBtdXN0IGJlCisgICAgICogcmV0dXJuZWQuIEl0IGlzIHZlcnkgdXNlZnVsIGZvciB0aGUgY2FtZXJhIEhBTCB0byBwYXNzIG1ldGEgZGF0YSByYXRoZXIKKyAgICAgKiB0aGFuIHRoZSBhY3R1YWwgZnJhbWUgZGF0YSBkaXJlY3RseSB0byB0aGUgdmlkZW8gZW5jb2Rlciwgc2luY2UgdGhlCisgICAgICogYW1vdW50IG9mIHRoZSB1bmNvbXByZXNzZWQgZnJhbWUgZGF0YSBjYW4gYmUgdmVyeSBsYXJnZSBpZiB2aWRlbyBzaXplIGlzCisgICAgICogbGFyZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlIGlmIHRydWUgdG8gaW5zdHJ1Y3QgdGhlIGNhbWVyYSBIQUwgdG8gc3RvcmUKKyAgICAgKiAgICAgICAgbWV0YSBkYXRhIGluIHRoZSB2aWRlbyBidWZmZXJzOyBmYWxzZSB0byBpbnN0cnVjdAorICAgICAqICAgICAgICB0aGUgY2FtZXJhIEhBTCB0byBzdG9yZSByZWFsIFlVViBkYXRhIGluIHRoZSB2aWRlbworICAgICAqICAgICAgICBidWZmZXJzLgorICAgICAqCisgICAgICogQHJldHVybiBPSyBvbiBzdWNjZXNzLgorICAgICAqLworICAgIGludCB1c2JjYW1fc3RvcmVfbWV0YV9kYXRhX2luX2J1ZmZlcnMoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiwgaW50IGVuYWJsZSk7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCByZWNvcmQgbW9kZS4gV2hlbiBhIHJlY29yZCBpbWFnZSBpcyBhdmFpbGFibGUsIGEKKyAgICAgKiBDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FIG1lc3NhZ2UgaXMgc2VudCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICogZnJhbWUuIEV2ZXJ5IHJlY29yZCBmcmFtZSBtdXN0IGJlIHJlbGVhc2VkIGJ5IGEgY2FtZXJhIEhBTCBjbGllbnQgdmlhCisgICAgICogcmVsZWFzZVJlY29yZGluZ0ZyYW1lKCkgYmVmb3JlIHRoZSBjbGllbnQgY2FsbHMKKyAgICAgKiBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKS4gQWZ0ZXIgdGhlIGNsaWVudCBjYWxscworICAgICAqIGRpc2FibGVNc2dUeXBlKENBTUVSQV9NU0dfVklERU9fRlJBTUUpLCBpdCBpcyB0aGUgY2FtZXJhIEhBTCdzCisgICAgICogcmVzcG9uc2liaWxpdHkgdG8gbWFuYWdlIHRoZSBsaWZlLWN5Y2xlIG9mIHRoZSB2aWRlbyByZWNvcmRpbmcgZnJhbWVzLAorICAgICAqIGFuZCB0aGUgY2xpZW50IG11c3Qgbm90IG1vZGlmeS9hY2Nlc3MgYW55IHZpZGVvIHJlY29yZGluZyBmcmFtZXMuCisgICAgICovCisgICAgaW50IHVzYmNhbV9zdGFydF9yZWNvcmRpbmcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIGEgcHJldmlvdXNseSBzdGFydGVkIHJlY29yZGluZy4KKyAgICAgKi8KKyAgICB2b2lkIHVzYmNhbV9zdG9wX3JlY29yZGluZyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiByZWNvcmRpbmcgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBpbnQgdXNiY2FtX3JlY29yZGluZ19lbmFibGVkKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSBhIHJlY29yZCBmcmFtZSBwcmV2aW91c2x5IHJldHVybmVkIGJ5IENBTUVSQV9NU0dfVklERU9fRlJBTUUuCisgICAgICoKKyAgICAgKiBJdCBpcyBjYW1lcmEgSEFMIGNsaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIHJlbGVhc2UgdmlkZW8gcmVjb3JkaW5nCisgICAgICogZnJhbWVzIHNlbnQgb3V0IGJ5IHRoZSBjYW1lcmEgSEFMIGJlZm9yZSB0aGUgY2FtZXJhIEhBTCByZWNlaXZlcyBhIGNhbGwKKyAgICAgKiB0byBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKS4gQWZ0ZXIgaXQgcmVjZWl2ZXMgdGhlIGNhbGwgdG8KKyAgICAgKiBkaXNhYmxlTXNnVHlwZShDQU1FUkFfTVNHX1ZJREVPX0ZSQU1FKSwgaXQgaXMgdGhlIGNhbWVyYSBIQUwncworICAgICAqIHJlc3BvbnNpYmlsaXR5IHRvIG1hbmFnZSB0aGUgbGlmZS1jeWNsZSBvZiB0aGUgdmlkZW8gcmVjb3JkaW5nIGZyYW1lcy4KKyAgICAgKi8KKyAgICB2b2lkIHVzYmNhbV9yZWxlYXNlX3JlY29yZGluZ19mcmFtZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLAorICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqb3BhcXVlKTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0IGF1dG8gZm9jdXMsIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sgcm91dGluZSBpcyBjYWxsZWQgd2l0aAorICAgICAqIENBTUVSQV9NU0dfRk9DVVMgb25jZSB3aGVuIGZvY3VzaW5nIGlzIGNvbXBsZXRlLiBhdXRvRm9jdXMoKSB3aWxsIGJlCisgICAgICogY2FsbGVkIGFnYWluIGlmIGFub3RoZXIgYXV0byBmb2N1cyBpcyBuZWVkZWQuCisgICAgICovCisgICAgaW50IHVzYmNhbV9hdXRvX2ZvY3VzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworCisgICAgLyoqCisgICAgICogQ2FuY2VscyBhdXRvLWZvY3VzIGZ1bmN0aW9uLiBJZiB0aGUgYXV0by1mb2N1cyBpcyBzdGlsbCBpbiBwcm9ncmVzcywKKyAgICAgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgY2FuY2VsIGl0LiBXaGV0aGVyIHRoZSBhdXRvLWZvY3VzIGlzIGluIHByb2dyZXNzIG9yCisgICAgICogbm90LCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBmb2N1cyBwb3NpdGlvbiB0byB0aGUgZGVmYXVsdC4gIElmCisgICAgICogdGhlIGNhbWVyYSBkb2VzIG5vdCBzdXBwb3J0IGF1dG8tZm9jdXMsIHRoaXMgaXMgYSBuby1vcC4KKyAgICAgKi8KKyAgICBpbnQgdXNiY2FtX2NhbmNlbF9hdXRvX2ZvY3VzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICopOworCisgICAgLyoqCisgICAgICogVGFrZSBhIHBpY3R1cmUuCisgICAgICovCisgICAgaW50IHVzYmNhbV90YWtlX3BpY3R1cmUoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgYSBwaWN0dXJlIHRoYXQgd2FzIHN0YXJ0ZWQgd2l0aCB0YWtlUGljdHVyZS4gQ2FsbGluZyB0aGlzIG1ldGhvZAorICAgICAqIHdoZW4gbm8gcGljdHVyZSBpcyBiZWluZyB0YWtlbiBpcyBhIG5vLW9wLgorICAgICAqLworICAgIGludCB1c2JjYW1fY2FuY2VsX3BpY3R1cmUoc3RydWN0IGNhbWVyYV9kZXZpY2UgKik7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNhbWVyYSBwYXJhbWV0ZXJzLiBUaGlzIHJldHVybnMgQkFEX1ZBTFVFIGlmIGFueSBwYXJhbWV0ZXIgaXMKKyAgICAgKiBpbnZhbGlkIG9yIG5vdCBzdXBwb3J0ZWQuCisgICAgICovCisgICAgaW50IHVzYmNhbV9zZXRfcGFyYW1ldGVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBjb25zdCBjaGFyICpwYXJtcyk7CisKKyAgICAvL3N0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcyk7CisgICAgLyoqIFJldHJpZXZlIHRoZSBjYW1lcmEgcGFyYW1ldGVycy4gIFRoZSBidWZmZXIgcmV0dXJuZWQgYnkgdGhlIGNhbWVyYSBIQUwKKyAgICAgICAgbXVzdCBiZSByZXR1cm5lZCBiYWNrIHRvIGl0IHdpdGggcHV0X3BhcmFtZXRlcnMsIGlmIHB1dF9wYXJhbWV0ZXJzCisgICAgICAgIGlzIG5vdCBOVUxMLgorICAgICAqLworICAgIGNoYXIqIHVzYmNhbV9nZXRfcGFyYW1ldGVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKworICAgIC8qKiBUaGUgY2FtZXJhIEhBTCB1c2VzIGl0cyBvd24gbWVtb3J5IHRvIHBhc3MgdXMgdGhlIHBhcmFtZXRlcnMgd2hlbiB3ZQorICAgICAgICBjYWxsIGdldF9wYXJhbWV0ZXJzLiAgVXNlIHRoaXMgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBtZW1vcnkgYmFjayB0bworICAgICAgICB0aGUgY2FtZXJhIEhBTCwgaWYgcHV0X3BhcmFtZXRlcnMgaXMgbm90IE5VTEwuICBJZiBwdXRfcGFyYW1ldGVycworICAgICAgICBpcyBOVUxMLCB0aGVuIHlvdSBoYXZlIHRvIHVzZSBmcmVlKCkgdG8gcmVsZWFzZSB0aGUgbWVtb3J5LgorICAgICovCisgICAgdm9pZCB1c2JjYW1fcHV0X3BhcmFtZXRlcnMoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiwgY2hhciAqKTsKKworICAgIC8qKgorICAgICAqIFNlbmQgY29tbWFuZCB0byBjYW1lcmEgZHJpdmVyLgorICAgICAqLworICAgIGludCB1c2JjYW1fc2VuZF9jb21tYW5kKHN0cnVjdCBjYW1lcmFfZGV2aWNlICosCisgICAgICAgICAgICAgIGludDMyX3QgY21kLCBpbnQzMl90IGFyZzEsIGludDMyX3QgYXJnMik7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBoYXJkd2FyZSByZXNvdXJjZXMgb3duZWQgYnkgdGhpcyBvYmplY3QuICBOb3RlIHRoYXQgdGhpcyBpcworICAgICAqICpub3QqIGRvbmUgaW4gdGhlIGRlc3RydWN0b3IuCisgICAgICovCisgICAgdm9pZCB1c2JjYW1fcmVsZWFzZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqKTsKKworICAgIC8qKgorICAgICAqIER1bXAgc3RhdGUgb2YgdGhlIGNhbWVyYSBoYXJkd2FyZQorICAgICAqLworICAgIGludCB1c2JjYW1fZHVtcChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqLCBpbnQgZmQpOworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCit9IC8vZXh0ZXJuICJDIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC91c2JjYW1jb3JlL3NyYy9RQ2FtZXJhTWpwZWdEZWNvZGUuY3BwIGIvbXNtY29iYWx0L3VzYmNhbWNvcmUvc3JjL1FDYW1lcmFNanBlZ0RlY29kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGNmMGFhMgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC91c2JjYW1jb3JlL3NyYy9RQ2FtZXJhTWpwZWdEZWNvZGUuY3BwCkBAIC0wLDAgKzEsNzAxIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLy8jZGVmaW5lIEFMT0dfTkRFQlVHIDAKKyNkZWZpbmUgQUxPR19OSURFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUUNhbWVyYU1qcGVnRGVjb2RlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKK2V4dGVybiAiQyIgeworI2luY2x1ZGUgImpwZWdfYnVmZmVyLmgiCisjaW5jbHVkZSAianBlZ19jb21tb24uaCIKKyNpbmNsdWRlICJqcGVnZC5oIgorfQorCisjaW5jbHVkZSAiUUNhbWVyYU1qcGVnRGVjb2RlLmgiCisKKy8qIFRCREo6IENhbiBiZSByZW1vdmVkICovCisjZGVmaW5lIE1JTihhLGIpICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisKKy8vIEFic3RyYWN0IHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24gdG8gYmUgcnVuIGFzIGEgdGhyZWFkCisjZGVmaW5lIE9TX1RIUkVBRF9GVU5DX1JFVF9UICAgICAgICAgICAgdm9pZCAqCisKKy8vIEFic3RyYWN0IHRoZSBhcmd1bWVudCB0eXBlIHRvIHRoZSB0aHJlYWQgZnVuY3Rpb24KKyNkZWZpbmUgT1NfVEhSRUFEX0ZVTkNfQVJHX1QgICAgICAgICAgICB2b2lkICoKKworLy8gSGVscGZ1bCBjb25zdGFudHMgZm9yIHJldHVybiB2YWx1ZXMgaW4gdGhlIHRocmVhZCBmdW5jdGlvbnMKKyNkZWZpbmUgT1NfVEhSRUFEX0ZVTkNfUkVUX1NVQ0NFRURFRCAgICAoT1NfVEhSRUFEX0ZVTkNfUkVUX1QpMAorI2RlZmluZSBPU19USFJFQURfRlVOQ19SRVRfRkFJTEVEICAgICAgIChPU19USFJFQURfRlVOQ19SRVRfVCkxCisKKy8vIEFic3RyYWN0IHRoZSBmdW5jdGlvbiBtb2RpZmllciBwbGFjZWQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgdGhyZWFkCisvLyBkZWNsYXJhdGlvbiAoZW1wdHkgZm9yIExpbnV4KQorI2RlZmluZSBPU19USFJFQURfRlVOQ19NT0RJRklFUgorCisjZGVmaW5lIG9zX211dGV4X2luaXQoYSkgcHRocmVhZF9tdXRleF9pbml0KGEsIE5VTEwpCisjZGVmaW5lIG9zX2NvbmRfaW5pdChhKSAgcHRocmVhZF9jb25kX2luaXQoYSwgTlVMTCkKKyNkZWZpbmUgb3NfbXV0ZXhfbG9jayAgICBwdGhyZWFkX211dGV4X2xvY2sKKyNkZWZpbmUgb3NfbXV0ZXhfdW5sb2NrICBwdGhyZWFkX211dGV4X3VubG9jaworI2RlZmluZSBvc19jb25kX3dhaXQgICAgIHB0aHJlYWRfY29uZF93YWl0CisjZGVmaW5lIG9zX2NvbmRfc2lnbmFsICAgcHRocmVhZF9jb25kX3NpZ25hbAorCitjb25zdCBjaGFyIGV2ZW50X3RvX3N0cmluZ1s0XVsxNF0gPQoreworICAgICJFVkVOVF9ET05FIiwKKyAgICAiRVZFTlRfV0FSTklORyIsCisgICAgIkVWRU5UX0VSUk9SIiwKK307CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgdWludDMyX3QgICB3aWR0aDsKKyAgICB1aW50MzJfdCAgIGhlaWdodDsKKyAgICB1aW50MzJfdCAgIGZvcm1hdDsKKyAgICB1aW50MzJfdCAgIHByZWZlcmVuY2U7CisgICAgdWludDMyX3QgICBhYm9ydF90aW1lOworICAgIHVpbnQxNl90ICAgYmFja190b19iYWNrX2NvdW50OworICAgIC8qIFRCREo6IElzIHRoaXMgcmVxdWlyZWQgKi8KKyAgICBpbnQzMl90ICAgIHJvdGF0aW9uOworICAgIC8qIFRCREo6IElzIHRoaXMgcmVxdWlyZWQgKi8KKyAgICBqcGVnX3JlY3RhbmdsZV90IHJlZ2lvbjsKKyAgICAvKiBUQkRKOiBJcyB0aGlzIHJlcXVpcmVkICovCisgICAganBlZ2Rfc2NhbGVfdHlwZV90IHNjYWxlX2ZhY3RvcjsKKyAgICB1aW50MzJfdCAgIGh3X3JvdGF0aW9uOworCisgICAgY2hhciogICAgICAgaW5wdXRNanBlZ0J1ZmZlcjsKKyAgICBpbnQgICAgICAgICBpbnB1dE1qcGVnQnVmZmVyU2l6ZTsKKyAgICBjaGFyKiAgICAgICBvdXRwdXRZcHRyOworICAgIGNoYXIqICAgICAgIG91dHB1dFVWcHRyOworCit9IHRlc3RfYXJnc190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCAgICAgICAgICAgICAgICAgICB0aWQ7CisgICAgcHRocmVhZF90ICAgICAgICAgICAgIHRocmVhZDsKKyAgICBqcGVnZF9vYmpfdCAgICAgICAgICAgZGVjb2RlcjsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgZGVjb2Rpbmc7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIGRlY29kZV9zdWNjZXNzOworICAgIHB0aHJlYWRfbXV0ZXhfdCAgICAgICBtdXRleDsKKyAgICBwdGhyZWFkX2NvbmRfdCAgICAgICAgY29uZDsKKyAgICB0ZXN0X2FyZ3NfdCAgICAgICAgICAgKnBfYXJnczsKKyAgICBqcGVnZF9vdXRwdXRfYnVmX3QgICAgKnBfd2hvbGVfb3V0cHV0X2J1ZjsKKworfSB0aHJlYWRfY3RybF9ibGtfdDsKKworT1NfVEhSRUFEX0ZVTkNfUkVUX1QgT1NfVEhSRUFEX0ZVTkNfTU9ESUZJRVIgZGVjb2Rlcl90ZXN0KE9TX1RIUkVBRF9GVU5DX0FSR19UIHBfdGhyZWFkX2FyZ3MpOwordm9pZCBkZWNvZGVyX2V2ZW50X2hhbmRsZXIodm9pZCAgICAgICAgKnBfdXNlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19ldmVudF90IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgKnBfYXJnKTsKK2ludCBkZWNvZGVyX291dHB1dF9oYW5kbGVyKHZvaWQgICAgICAgICAgICAgICAqcF91c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnZF9vdXRwdXRfYnVmX3QgKnBfb3V0cHV0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgZmlyc3Rfcm93X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgICAgICBpc19sYXN0X2J1ZmZlcik7Cit1aW50MzJfdCBkZWNvZGVyX2lucHV0X3JlcV9oYW5kbGVyKHZvaWQgICAgICAgICAgICpwX3VzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganBlZ19idWZmZXJfdCAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHN0YXJ0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIGxlbmd0aCk7CitzdGF0aWMgdm9pZCogaW5zZXJ0SHVmZm1hblRhYmxlKHZvaWQgKnAsIGludCBzaXplKTsKKworc3RhdGljIGludCBtanBlZ2RfdGltZXJfc3RhcnQodGltZXNwZWMgKnBfdGltZXIpOworc3RhdGljIGludCBtanBlZ2RfdGltZXJfZ2V0X2VsYXBzZWQodGltZXNwZWMgKnBfdGltZXIsIGludCAqZWxhcHNlZF9pbl9tcywgdWludDhfdCByZXNldF9zdGFydCk7CitzdGF0aWMgaW50IG1qcGVnZF9jb25kX3RpbWVkd2FpdChwdGhyZWFkX2NvbmRfdCAqcF9jb25kLCBwdGhyZWFkX211dGV4X3QgKnBfbXV0ZXgsIHVpbnQzMl90IG1zKTsKKworLy8gR2xvYmFsIHZhcmlhYmxlcworLyogVEJESjogY2FuIGJlIHJlbW92ZWQgKi8KK3RocmVhZF9jdHJsX2Jsa190ICp0aHJlYWRfY3RybF9ibGtzID0gTlVMTDsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIG1qcGVnIGRlY29kZXIgYW5kIHJldHVybnMgdGhlIG9iamVjdAorICovCitNSlBFR0RfRVJSIG1qcGVnRGVjb2RlckluaXQodm9pZCoqIG1qcGVnZF9vYmopCit7CisgICAgdGVzdF9hcmdzX3QqIG1qcGVnZDsKKworICAgIEFMT0dEKCIlczogRSIsIF9fZnVuY19fKTsKKworICAgIG1qcGVnZCA9ICh0ZXN0X2FyZ3NfdCAqKW1hbGxvYyhzaXplb2YodGVzdF9hcmdzX3QpKTsKKyAgICBpZighbWpwZWdkKQorICAgICAgICByZXR1cm4gTUpQRUdEX0lOU1VGRklDSUVOVF9NRU07CisKKyAgICBtZW1zZXQobWpwZWdkLCAwLCBzaXplb2YodGVzdF9hcmdzX3QpKTsKKworICAgIC8qIERlZmF1bHRzICovCisgICAgLyogRHVlIHRvIGN1cnJlbnQgbGltaXRhdGlvbiwgcy93IGRlY29kZXIgaXMgc2VsZWN0ZWQgYWx3YXlzICovCisgICAgbWpwZWdkLT5wcmVmZXJlbmNlICAgICAgICAgID0gSlBFR19ERUNPREVSX1BSRUZfSFdfQUNDRUxFUkFURURfUFJFRkVSUkVEOworICAgIG1qcGVnZC0+YmFja190b19iYWNrX2NvdW50ICA9IDE7CisgICAgbWpwZWdkLT5yb3RhdGlvbiAgICAgICAgICAgID0gMDsKKyAgICBtanBlZ2QtPmh3X3JvdGF0aW9uICAgICAgICAgPSAwOworICAgIG1qcGVnZC0+c2NhbGVfZmFjdG9yICAgICAgICA9IChqcGVnZF9zY2FsZV90eXBlX3QpMTsKKworICAgIC8qIFRCREo6IGNhbiBiZSByZW1vdmVkICovCisgICAgbWpwZWdkLT53aWR0aCAgICAgICAgICAgICAgICAgPSA2NDA7CisgICAgbWpwZWdkLT5oZWlnaHQgICAgICAgICAgICAgICAgPSA0ODA7CisgICAgbWpwZWdkLT5hYm9ydF90aW1lICAgICAgICAgICAgPSAwOworCisgICAgKm1qcGVnZF9vYmogPSAodm9pZCAqKW1qcGVnZDsKKworICAgIEFMT0dEKCIlczogWCIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gIE1KUEVHRF9OT19FUlJPUjsKK30KKworTUpQRUdEX0VSUiBtanBlZ0RlY29kZSgKKyAgICAgICAgICAgIHZvaWQqICAgbWpwZWdkX29iaiwKKyAgICAgICAgICAgIGNoYXIqICAgaW5wdXRNanBlZ0J1ZmZlciwKKyAgICAgICAgICAgIGludCAgICAgaW5wdXRNanBlZ0J1ZmZlclNpemUsCisgICAgICAgICAgICBjaGFyKiAgIG91dHB1dFlwdHIsCisgICAgICAgICAgICBjaGFyKiAgIG91dHB1dFVWcHRyLAorICAgICAgICAgICAgaW50ICAgICBvdXRwdXRGb3JtYXQpCit7CisgICAgaW50IHJjLCBjLCBpOworICAgIHRlc3RfYXJnc190KiBtanBlZ2Q7CisgICAgdGVzdF9hcmdzX3QgIHRlc3RfYXJnczsKKworICAgIEFMT0dEKCIlczogRSIsIF9fZnVuY19fKTsKKyAgICAvKiBzdG9yZSBpbnB1dCBhcmd1bWVudHMgaW4gdGhlIGNvbnRleHQgKi8KKyAgICBtanBlZ2QgPSAodGVzdF9hcmdzX3QqKSBtanBlZ2Rfb2JqOworICAgIG1qcGVnZC0+aW5wdXRNanBlZ0J1ZmZlciAgICAgICAgPSBpbnB1dE1qcGVnQnVmZmVyOworICAgIG1qcGVnZC0+aW5wdXRNanBlZ0J1ZmZlclNpemUgICAgPSBpbnB1dE1qcGVnQnVmZmVyU2l6ZTsKKyAgICBtanBlZ2QtPm91dHB1dFlwdHIgICAgICAgICAgICAgID0gb3V0cHV0WXB0cjsKKyAgICBtanBlZ2QtPm91dHB1dFVWcHRyICAgICAgICAgICAgID0gb3V0cHV0VVZwdHI7CisgICAgbWpwZWdkLT5mb3JtYXQgICAgICAgICAgICAgICAgICA9IG91dHB1dEZvcm1hdDsKKworICAgIC8qIFRCREo6IGNhbiBiZSByZW1vdmVkICovCisgICAgbWVtY3B5KCZ0ZXN0X2FyZ3MsIG1qcGVnZCwgc2l6ZW9mKHRlc3RfYXJnc190KSk7CisKKyAgICAvLyBjaGVjayB0aGUgZm9ybWF0cworICAgIGlmICgoKHRlc3RfYXJncy5mb3JtYXQgPT0gWUNSQ0JMUF9IMVYyKSB8fCAodGVzdF9hcmdzLmZvcm1hdCA9PSBZQ0JDUkxQX0gxVjIpIHx8CisgICAgICAodGVzdF9hcmdzLmZvcm1hdCA9PSBZQ1JDQkxQX0gxVjEpIHx8ICh0ZXN0X2FyZ3MuZm9ybWF0ID09IFlDQkNSTFBfSDFWMSkpICYmCisgICAgICAhKHRlc3RfYXJncy5wcmVmZXJlbmNlID09IEpQRUdfREVDT0RFUl9QUkVGX0hXX0FDQ0VMRVJBVEVEX09OTFkpKSB7CisgICAgICAgIEFMT0dFKCIlczpUaGVzZSBmb3JtYXRzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IFNXIGZvcm1hdCAlZCIsIF9fZnVuY19fLCB0ZXN0X2FyZ3MuZm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHRocmVhZCBjb250cm9sIGJsb2NrcworICAgIHRocmVhZF9jdHJsX2Jsa3MgPSAodGhyZWFkX2N0cmxfYmxrX3QgKiltYWxsb2MoIHNpemVvZih0aHJlYWRfY3RybF9ibGtfdCkpOworICAgIGlmICghdGhyZWFkX2N0cmxfYmxrcykKKyAgICB7CisgICAgICAgIEFMT0dFKCIlczogZGVjb2Rlcl90ZXN0IGZhaWxlZDogaW5zdWZmaWNpZW50IG1lbW9yeSBpbiBjcmVhdGluZyB0aHJlYWQgY29udHJvbCBibG9ja3MiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBtZW1zZXQodGhyZWFkX2N0cmxfYmxrcywgMCwgc2l6ZW9mKHRocmVhZF9jdHJsX2Jsa190KSk7CisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgYmxvY2tzIGFuZCBraWNrIG9mZiB0aGUgdGhyZWFkcworICAgICAgICB0aHJlYWRfY3RybF9ibGtzW2ldLnRpZCA9IGk7CisgICAgICAgIHRocmVhZF9jdHJsX2Jsa3NbaV0ucF9hcmdzID0gJnRlc3RfYXJnczsKKyAgICAgICAgb3NfbXV0ZXhfaW5pdCgmdGhyZWFkX2N0cmxfYmxrc1tpXS5tdXRleCk7CisgICAgICAgIG9zX2NvbmRfaW5pdCgmdGhyZWFkX2N0cmxfYmxrc1tpXS5jb25kKTsKKworICAgIHJjID0gKGludClkZWNvZGVyX3Rlc3QoJnRocmVhZF9jdHJsX2Jsa3NbaV0pOworCisgICAgaWYgKCFyYykKKyAgICAgICAgQUxPR0QoIiVzOiBkZWNvZGVyX3Rlc3QgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5ICIsIF9fZnVuY19fKTsKKyAgICBlbHNlCisgICAgICAgIEFMT0dFKCIlczogZGVjb2Rlcl90ZXN0IGZhaWxlZCIsX19mdW5jX18pOworCisgICAgQUxPR0QoIiVzOiBYIHJjOiAlZCIsIF9fZnVuY19fLCByYyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK09TX1RIUkVBRF9GVU5DX1JFVF9UIE9TX1RIUkVBRF9GVU5DX01PRElGSUVSIGRlY29kZXJfdGVzdChPU19USFJFQURfRlVOQ19BUkdfVCBhcmcpCit7CisgICAgaW50IHJjLCBpOworICAgIGpwZWdkX29ial90ICAgICAgICAgZGVjb2RlcjsKKyAgICBqcGVnZF9zcmNfdCAgICAgICAgIHNvdXJjZTsKKyAgICBqcGVnZF9kc3RfdCAgICAgICAgIGRlc3Q7CisgICAganBlZ2RfY2ZnX3QgICAgICAgICBjb25maWc7CisgICAganBlZ19oZHJfdCAgICAgICAgICBoZWFkZXI7CisgICAganBlZ2Rfb3V0cHV0X2J1Zl90ICBwX291dHB1dF9idWZmZXJzOworICAgIHVpbnQzMl90ICAgICAgICAgICAgb3V0cHV0X2J1ZmZlcnNfY291bnQgPSAxOyAvLyBjdXJyZW50bHkgb25seSAxIGJ1ZmZlciBhIHRpbWUgaXMgc3VwcG9ydGVkCisgICAgdWludDhfdCB1c2VfcG1lbSA9IHRydWU7CisgICAgdGltZXNwZWMgb3NfdGltZXI7CisgICAgdGhyZWFkX2N0cmxfYmxrX3QgKnBfdGhyZWFkX2FyZyA9ICh0aHJlYWRfY3RybF9ibGtfdCAqKWFyZzsKKyAgICB0ZXN0X2FyZ3NfdCAqcF9hcmdzID0gcF90aHJlYWRfYXJnLT5wX2FyZ3M7CisgICAgdWludDMyX3QgICAgICAgICAgICBvdXRwdXRfd2lkdGg7CisgICAgdWludDMyX3QgICAgICAgICAgICBvdXRwdXRfaGVpZ2h0OworICAgIHVpbnQzMl90IHRvdGFsX3RpbWUgPSAwOworCisgICAgQUxPR0QoIiVzOiBFIiwgX19mdW5jX18pOworCisgICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgcG1lbSBzaG91bGQgYmUgdXNlZCAodXNlZnVsIGZvciBwYyBlbnZpcm9ubWVudCB0ZXN0aW5nIHdoZXJlCisgICAgLy8gcG1lbSBpcyBub3QgYXZhaWxhYmxlKQorICAgIGlmICgoanBlZ2RfcHJlZmVyZW5jZV90KXBfYXJncy0+cHJlZmVyZW5jZSA9PSBKUEVHX0RFQ09ERVJfUFJFRl9TT0ZUV0FSRV9QUkVGRVJSRUQgfHwKKyAgICAgICAgKGpwZWdkX3ByZWZlcmVuY2VfdClwX2FyZ3MtPnByZWZlcmVuY2UgPT0gSlBFR19ERUNPREVSX1BSRUZfU09GVFdBUkVfT05MWSkgeworICAgICAgICB1c2VfcG1lbSA9IGZhbHNlOworICAgIH0KKworICAgIGlmICgoKGpwZWdkX3ByZWZlcmVuY2VfdClwX2FyZ3MtPnByZWZlcmVuY2UgIT0KKyAgICAgIEpQRUdfREVDT0RFUl9QUkVGX0hXX0FDQ0VMRVJBVEVEX09OTFkpICYmCisgICAgICAoKGpwZWdkX3ByZWZlcmVuY2VfdClwX2FyZ3MtPnNjYWxlX2ZhY3RvciA+IDApKSB7CisgICAgICAgIEFMT0dJKCIlczogU2V0dGluZyBzY2FsZSBmYWN0b3IgdG8gMXgiLCBfX2Z1bmNfXyk7CisgICAgfQorCisgICAgQUxPR0QoIiVzOiBiZWZvcmUganBlZ2RfaW5pdCBwX3RocmVhZF9hcmc6ICVwIiwgX19mdW5jX18sIHBfdGhyZWFkX2FyZyk7CisKKyAgICAvLyBJbml0aWFsaXplIGRlY29kZXIKKyAgICByYyA9IGpwZWdkX2luaXQoJmRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICZkZWNvZGVyX2V2ZW50X2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICZkZWNvZGVyX291dHB1dF9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICBwX3RocmVhZF9hcmcpOworCisgICAgaWYgKEpQRUdfRkFJTEVEKHJjKSkgeworICAgICAgICBBTE9HRSgiJXM6IGRlY29kZXJfdGVzdDoganBlZ2RfaW5pdCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcF90aHJlYWRfYXJnLT5kZWNvZGVyID0gZGVjb2RlcjsKKworICAgIC8vIFNldCBzb3VyY2UgaW5mb3JtYXRpb24KKyAgICBzb3VyY2UucF9pbnB1dF9yZXFfaGFuZGxlciA9ICZkZWNvZGVyX2lucHV0X3JlcV9oYW5kbGVyOworICAgIHNvdXJjZS50b3RhbF9sZW5ndGggICAgICAgID0gcF9hcmdzLT5pbnB1dE1qcGVnQnVmZmVyU2l6ZSAmIDB4ZmZmZmZmZmY7CisKKyAgICByYyA9IGpwZWdfYnVmZmVyX2luaXQoJnNvdXJjZS5idWZmZXJzWzBdKTsKKyAgICBpZiAoSlBFR19TVUNDRUVERUQocmMpKSB7CisgICAgICAgIC8qIFRCREo6IHdoeSBidWZmZXIgWzFdICovCisgICAgICAgIHJjID0ganBlZ19idWZmZXJfaW5pdCgmc291cmNlLmJ1ZmZlcnNbMV0pOworICAgIH0KKyAgICBpZiAoSlBFR19TVUNDRUVERUQocmMpKSB7CisjaWYgMQorICAgICAgICByYyA9IGpwZWdfYnVmZmVyX2FsbG9jYXRlKHNvdXJjZS5idWZmZXJzWzBdLCAweEEwMDAsIHVzZV9wbWVtKTsKKyNlbHNlCisgICAgICAgIHJjID0ganBlZ19idWZmZXJfdXNlX2V4dGVybmFsX2J1ZmZlcihzb3VyY2UuYnVmZmVyc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopcF9hcmdzLT5pbnB1dE1qcGVnQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hcmdzLT5pbnB1dE1qcGVnQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworI2VuZGlmCisgICAgICAgIEFMT0dEKCIlczogc291cmNlLmJ1ZmZlcnNbMF06JXAgY29tcHJlc3NlZCBidWZmZXIgcHRyID0gJXAiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc291cmNlLmJ1ZmZlcnNbMF0sIHBfYXJncy0+aW5wdXRNanBlZ0J1ZmZlcik7CisgICAgfQorICAgIGlmIChKUEVHX1NVQ0NFRURFRChyYykpIHsKKyNpZiAxCisgICAgICAgIHJjID0ganBlZ19idWZmZXJfYWxsb2NhdGUoc291cmNlLmJ1ZmZlcnNbMV0sIDB4QTAwMCwgdXNlX3BtZW0pOworI2Vsc2UKKyAgICAgICAgIHJjID0ganBlZ19idWZmZXJfdXNlX2V4dGVybmFsX2J1ZmZlcihzb3VyY2UuYnVmZmVyc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90ICopcF9hcmdzLT5pbnB1dE1qcGVnQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9hcmdzLT5pbnB1dE1qcGVnQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworI2VuZGlmCisgICAgICAgIEFMT0dEKCIlczogc291cmNlLmJ1ZmZlcnNbMV06JXAgY29tcHJlc3NlZCBidWZmZXIgcHRyICA9ICVwIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNvdXJjZS5idWZmZXJzWzFdLCBwX2FyZ3MtPmlucHV0TWpwZWdCdWZmZXIpOworICAgfQorICAgIGlmIChKUEVHX0ZBSUxFRChyYykpIHsKKyAgICAgICAganBlZ19idWZmZXJfZGVzdHJveSgmc291cmNlLmJ1ZmZlcnNbMF0pOworICAgICAgICBqcGVnX2J1ZmZlcl9kZXN0cm95KCZzb3VyY2UuYnVmZmVyc1sxXSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgIEFMT0dJKCIlczogKioqIFN0YXJ0aW5nIGJhY2stdG8tYmFjayBkZWNvZGluZyBvZiAlZCBmcmFtZShzKSoqKlxuIiwKKyAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBfYXJncy0+YmFja190b19iYWNrX2NvdW50KTsKKworCSAvLyBMb29wIHRvIHBlcmZvcm0gbiBiYWNrLXRvLWJhY2sgZGVjb2RpbmcgKHRvIHRoZSBzYW1lIG91dHB1dCBmaWxlKQorICAgIGZvcihpID0gMDsgaSA8IHBfYXJncy0+YmFja190b19iYWNrX2NvdW50OyBpKyspIHsKKyAgICAgICAgaWYobWpwZWdkX3RpbWVyX3N0YXJ0KCZvc190aW1lcikgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBnZXQgc3RhcnQgdGltZSIsIF9fZnVuY19fKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRCREo6IEV2ZXJ5IGZyYW1lPyAqLworICAgICAgICBBTE9HRCgiJXM6IGJlZm9yZSBqcGVnZF9zZXRfc291cmNlIHNvdXJjZS5wX2FyZzolcCIsIF9fZnVuY19fLCBzb3VyY2UucF9hcmcpOworICAgICAgICByYyA9IGpwZWdkX3NldF9zb3VyY2UoZGVjb2RlciwgJnNvdXJjZSk7CisgICAgICAgIGlmIChKUEVHX0ZBSUxFRChyYykpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczoganBlZ2Rfc2V0X3NvdXJjZSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICByYyA9IGpwZWdkX3JlYWRfaGVhZGVyKGRlY29kZXIsICZoZWFkZXIpOworICAgICAgICBpZiAoSlBFR19GQUlMRUQocmMpKQorICAgICAgICB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGpwZWdkX3JlYWRfaGVhZGVyIGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBwX2FyZ3MtPndpZHRoID0gaGVhZGVyLm1haW4ud2lkdGg7CisgICAgICAgIHBfYXJncy0+aGVpZ2h0ID0gaGVhZGVyLm1haW4uaGVpZ2h0OworICAgICAgICBBTE9HRCgiJXM6IG1haW4gZGltZW5zaW9uOiAoJWR4JWQpIHN1YnNhbXBsaW5nOiAoJWQpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgaGVhZGVyLm1haW4ud2lkdGgsIGhlYWRlci5tYWluLmhlaWdodCwgKGludCloZWFkZXIubWFpbi5zdWJzYW1wbGluZyk7CisKKyAgICAgICAgLy8gbWFpbiBpbWFnZSBkZWNvZGluZzoKKyAgICAgICAgLy8gU2V0IGRlc3RpbmF0aW9uIGluZm9ybWF0aW9uCisgICAgICAgIGRlc3Qud2lkdGggPSAocF9hcmdzLT53aWR0aCkgPyAocF9hcmdzLT53aWR0aCkgOiBoZWFkZXIubWFpbi53aWR0aDsKKyAgICAgICAgZGVzdC5oZWlnaHQgPSAocF9hcmdzLT5oZWlnaHQpID8gKHBfYXJncy0+aGVpZ2h0KSA6IGhlYWRlci5tYWluLmhlaWdodDsKKyAgICAgICAgZGVzdC5vdXRwdXRfZm9ybWF0ID0gKGpwZWdfY29sb3JfZm9ybWF0X3QpIHBfYXJncy0+Zm9ybWF0OworICAgICAgICBkZXN0LnJlZ2lvbiA9IHBfYXJncy0+cmVnaW9uOworCisgICAgICAgIC8vIGlmIHJlZ2lvbiBpcyBkZWZpbmVkLCByZS1hc3NpZ24gdGhlIG91dHB1dCB3aWR0aC9oZWlnaHQKKyAgICAgICAgb3V0cHV0X3dpZHRoICA9IGRlc3Qud2lkdGg7CisgICAgICAgIG91dHB1dF9oZWlnaHQgPSBkZXN0LmhlaWdodDsKKworICAgICAgICBpZiAocF9hcmdzLT5yZWdpb24ucmlnaHQgfHwgcF9hcmdzLT5yZWdpb24uYm90dG9tKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoMCA9PSBwX2FyZ3MtPnJvdGF0aW9uIHx8IDE4MCA9PSBwX2FyZ3MtPnJvdGF0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dHB1dF93aWR0aCAgPSBNSU4oKGRlc3Qud2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShkZXN0LnJlZ2lvbi5yaWdodCAgLSBkZXN0LnJlZ2lvbi5sZWZ0ICsgMSkpOworICAgICAgICAgICAgICAgIG91dHB1dF9oZWlnaHQgPSBNSU4oKGRlc3QuaGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkoZGVzdC5yZWdpb24uYm90dG9tIC0gZGVzdC5yZWdpb24udG9wICArIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFN3YXAgb3V0cHV0IHdpZHRoL2hlaWdodCBmb3IgOTAvMjcwIHJvdGF0aW9uIGNhc2VzCisgICAgICAgICAgICBlbHNlIGlmICg5MCA9PSBwX2FyZ3MtPnJvdGF0aW9uIHx8IDI3MCA9PSBwX2FyZ3MtPnJvdGF0aW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dHB1dF9oZWlnaHQgID0gTUlOKChkZXN0LmhlaWdodCksCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKGRlc3QucmVnaW9uLnJpZ2h0ICAtIGRlc3QucmVnaW9uLmxlZnQgKyAxKSk7CisgICAgICAgICAgICAgICAgb3V0cHV0X3dpZHRoICAgPSBNSU4oKGRlc3Qud2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShkZXN0LnJlZ2lvbi5ib3R0b20gLSBkZXN0LnJlZ2lvbi50b3AgICsgMSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVW5zdXBwb3J0ZWQgcm90YXRpb24gY2FzZXMKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGVzdC5vdXRwdXRfZm9ybWF0ID09IFlDUkNCTFBfSDJWMiB8fCBkZXN0Lm91dHB1dF9mb3JtYXQgPT0gWUNCQ1JMUF9IMlYyIHx8CisgICAgICAgICAgICBkZXN0Lm91dHB1dF9mb3JtYXQgPT0gWUNSQ0JMUF9IMlYxIHx8IGRlc3Qub3V0cHV0X2Zvcm1hdCA9PSBZQ0JDUkxQX0gyVjEgfHwKKyAgICAgICAgICAgIGRlc3Qub3V0cHV0X2Zvcm1hdCA9PSBZQ1JDQkxQX0gxVjIgfHwgZGVzdC5vdXRwdXRfZm9ybWF0ID09IFlDQkNSTFBfSDFWMiB8fAorICAgICAgICAgICAgZGVzdC5vdXRwdXRfZm9ybWF0ID09IFlDUkNCTFBfSDFWMSB8fCBkZXN0Lm91dHB1dF9mb3JtYXQgPT0gWUNCQ1JMUF9IMVYxKSB7CisgICAgICAgICAgICBqcGVnX2J1ZmZlcl9pbml0KCZwX291dHB1dF9idWZmZXJzLmRhdGEueXV2Lmx1bWFfYnVmKTsKKyAgICAgICAgICAgIGpwZWdfYnVmZmVyX2luaXQoJnBfb3V0cHV0X2J1ZmZlcnMuZGF0YS55dXYuY2hyb21hX2J1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqcGVnX2J1ZmZlcl9pbml0KCZwX291dHB1dF9idWZmZXJzLmRhdGEucmdiLnJnYl9idWYpOworCisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICAvLyBBc3NpZ24gMCB0byB0aWxlIHdpZHRoIGFuZCBoZWlnaHQKKyAgICAgICAgICAgIC8vIHRvIGluZGljYXRlIHRoYXQgbm8gdGlsaW5nIGlzIHJlcXVlc3RlZC4KKyAgICAgICAgICAgIHBfb3V0cHV0X2J1ZmZlcnMudGlsZV93aWR0aCAgPSAwOworICAgICAgICAgICAgcF9vdXRwdXRfYnVmZmVycy50aWxlX2hlaWdodCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcF9vdXRwdXRfYnVmZmVycy5pc19pbl9xID0gMDsKKworICAgICAgICBzd2l0Y2ggKGRlc3Qub3V0cHV0X2Zvcm1hdCkKKyAgICAgICAgeworICAgICAgICBjYXNlIFlDUkNCTFBfSDJWMjoKKyAgICAgICAgY2FzZSBZQ0JDUkxQX0gyVjI6CisvLyAgICAgICAgY2FzZSBZQ1JDQkxQX0gyVjE6CisvLyAgICAgICAgY2FzZSBZQ0JDUkxQX0gyVjE6CisvLyAgICAgICAgY2FzZSBZQ1JDQkxQX0gxVjI6CisvLyAgICAgICAgY2FzZSBZQ0JDUkxQX0gxVjI6CisvLyAgICAgICAgY2FzZSBZQ1JDQkxQX0gxVjE6CisvLyAgICAgICAgY2FzZSBZQ0JDUkxQX0gxVjE6CisgICAgICAgICAgICBqcGVnX2J1ZmZlcl91c2VfZXh0ZXJuYWxfYnVmZmVyKAorICAgICAgICAgICAgICAgcF9vdXRwdXRfYnVmZmVycy5kYXRhLnl1di5sdW1hX2J1ZiwKKyAgICAgICAgICAgICAgICh1aW50OF90KilwX2FyZ3MtPm91dHB1dFlwdHIsCisgICAgICAgICAgICAgICBwX2FyZ3MtPndpZHRoICogcF9hcmdzLT5oZWlnaHQgKiBTUVVBUkUocF9hcmdzLT5zY2FsZV9mYWN0b3IpLAorICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBqcGVnX2J1ZmZlcl91c2VfZXh0ZXJuYWxfYnVmZmVyKAorICAgICAgICAgICAgICAgIHBfb3V0cHV0X2J1ZmZlcnMuZGF0YS55dXYuY2hyb21hX2J1ZiwKKyAgICAgICAgICAgICAgICAodWludDhfdCopcF9hcmdzLT5vdXRwdXRVVnB0ciwKKyAgICAgICAgICAgICAgICBwX2FyZ3MtPndpZHRoICogcF9hcmdzLT5oZWlnaHQgLyAyICogU1FVQVJFKHBfYXJncy0+c2NhbGVfZmFjdG9yKSwKKyAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IGRlY29kZXJfdGVzdDogdW5zdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB1cCBjb25maWd1cmF0aW9uCisgICAgICAgIG1lbXNldCgmY29uZmlnLCAwLCBzaXplb2YoanBlZ2RfY2ZnX3QpKTsKKyAgICAgICAgY29uZmlnLnByZWZlcmVuY2UgPSAoanBlZ2RfcHJlZmVyZW5jZV90KSBwX2FyZ3MtPnByZWZlcmVuY2U7CisgICAgICAgIGNvbmZpZy5kZWNvZGVfZnJvbSA9IEpQRUdEX0RFQ09ERV9GUk9NX0FVVE87CisgICAgICAgIGNvbmZpZy5yb3RhdGlvbiA9IHBfYXJncy0+cm90YXRpb247CisgICAgICAgIGNvbmZpZy5zY2FsZV9mYWN0b3IgPSBwX2FyZ3MtPnNjYWxlX2ZhY3RvcjsKKyAgICAgICAgY29uZmlnLmh3X3JvdGF0aW9uID0gcF9hcmdzLT5od19yb3RhdGlvbjsKKyAgICAgICAgZGVzdC5iYWNrX3RvX2JhY2tfY291bnQgPSBwX2FyZ3MtPmJhY2tfdG9fYmFja19jb3VudDsKKworICAgICAgICAvLyBTdGFydCBkZWNvZGluZworICAgICAgICBwX3RocmVhZF9hcmctPmRlY29kaW5nID0gdHJ1ZTsKKworICAgICAgICByYyA9IGpwZWdkX3N0YXJ0KGRlY29kZXIsICZjb25maWcsICZkZXN0LCAmcF9vdXRwdXRfYnVmZmVycywgb3V0cHV0X2J1ZmZlcnNfY291bnQpOworICAgICAgICBkZXN0LmJhY2tfdG9fYmFja19jb3VudC0tOworCisgICAgICAgIGlmKEpQRUdfRkFJTEVEKHJjKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBkZWNvZGVyX3Rlc3Q6IGpwZWdkX3N0YXJ0IGZhaWxlZCAocmM9JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmMpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgQUxPR0QoIiVzOiBkZWNvZGVyX3Rlc3Q6IGpwZWdkX3N0YXJ0IHN1Y2NlZWRlZCIsIF9fZnVuY19fKTsKKworICAgICAgICAvLyBEbyBhYm9ydAorICAgICAgICBpZiAocF9hcmdzLT5hYm9ydF90aW1lKSB7CisgICAgICAgICAgICBvc19tdXRleF9sb2NrKCZwX3RocmVhZF9hcmctPm11dGV4KTsKKyAgICAgICAgICAgIHdoaWxlIChwX3RocmVhZF9hcmctPmRlY29kaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gbWpwZWdkX2NvbmRfdGltZWR3YWl0KCZwX3RocmVhZF9hcmctPmNvbmQsICZwX3RocmVhZF9hcmctPm11dGV4LCBwX2FyZ3MtPmFib3J0X3RpbWUpOworICAgICAgICAgICAgICAgIGlmIChyYyA9PSBKUEVHRVJSX0VUSU1FRE9VVCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIERvIGFib3J0CisgICAgICAgICAgICAgICAgICAgIG9zX211dGV4X3VubG9jaygmcF90aHJlYWRfYXJnLT5tdXRleCk7CisgICAgICAgICAgICAgICAgICAgIHJjID0ganBlZ2RfYWJvcnQoZGVjb2Rlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBkZWNvZGVyX3Rlc3Q6IGpwZWdkX2Fib3J0IGZhaWxlZDogJWQiLCBfX2Z1bmNfXywgcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwX3RocmVhZF9hcmctPmRlY29kaW5nKQorICAgICAgICAgICAgICAgIG9zX211dGV4X3VubG9jaygmcF90aHJlYWRfYXJnLT5tdXRleCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXYWl0IHVudGlsIGRlY29kaW5nIGlzIGRvbmUgb3Igc3RvcHBlZCBkdWUgdG8gZXJyb3IKKyAgICAgICAgICAgIG9zX211dGV4X2xvY2soJnBfdGhyZWFkX2FyZy0+bXV0ZXgpOworICAgICAgICAgICAgd2hpbGUgKHBfdGhyZWFkX2FyZy0+ZGVjb2RpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3NfY29uZF93YWl0KCZwX3RocmVhZF9hcmctPmNvbmQsICZwX3RocmVhZF9hcmctPm11dGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9zX211dGV4X3VubG9jaygmcF90aHJlYWRfYXJnLT5tdXRleCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZGlmZjsKKyAgICAgICAgLy8gRGlzcGxheSB0aGUgdGltZSBlbGFwc2VkCisgICAgICAgIGlmIChtanBlZ2RfdGltZXJfZ2V0X2VsYXBzZWQoJm9zX3RpbWVyLCAmZGlmZiwgMCkgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGRlY29kZXJfdGVzdDogZmFpbGVkIHRvIGdldCBlbGFwc2VkIHRpbWUiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZihwX2FyZ3MtPmFib3J0X3RpbWUpIHsKKyAgICAgICAgICAgICAgICBpZihwX3RocmVhZF9hcmctPmRlY29kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCIlczogZGVjb2Rlcl90ZXN0OiBkZWNvZGluZyBhYm9ydGVkIHN1Y2Nlc3NmdWxseSBhZnRlciAlZCBtcyIsIF9fZnVuY19fLCBkaWZmKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBidWZmZXJfY2xlYW5fdXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCIlczogZGVjb2Rlcl90ZXN0OiBkZWNvZGluZyBzdG9wcGVkIGJlZm9yZSBhYm9ydCBpcyBpc3N1ZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWNvZGUgdGltZTogJWQgbXMiLCBfX2Z1bmNfXywgZGlmZik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYocF90aHJlYWRfYXJnLT5kZWNvZGVfc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICB0b3RhbF90aW1lICs9IGRpZmY7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCIlczogZGVjb2RlIHRpbWU6ICVkIG1zICglZCBmcmFtZShzKSwgdG90YWw9JWRtcywgYXZnPSVkbXMvZnJhbWUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGlmZiwgaSsxLCB0b3RhbF90aW1lLCB0b3RhbF90aW1lLyhpKzEpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJkZWNvZGVyX3Rlc3Q6IGRlY29kZSBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKHBfdGhyZWFkX2FyZy0+ZGVjb2RlX3N1Y2Nlc3MpIHsKKyAgICAgICAgQUxPR0QoIiVzOiBGcmFtZShzKSA9ICVkLCBUb3RhbCBUaW1lID0gJWRtcywgQXZnLiBkZWNvZGUgdGltZSA9ICVkbXMvZnJhbWUpXG4iLAorICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcF9hcmdzLT5iYWNrX3RvX2JhY2tfY291bnQsIHRvdGFsX3RpbWUsIHRvdGFsX3RpbWUvcF9hcmdzLT5iYWNrX3RvX2JhY2tfY291bnQpOworICAgIH0KKworYnVmZmVyX2NsZWFuX3VwOgorICAgIC8vIENsZWFuIHVwIGRlY29kZXIgYW5kIGFsbG9jYXRlIGJ1ZmZlcnMKKyAgICBqcGVnX2J1ZmZlcl9kZXN0cm95KCZzb3VyY2UuYnVmZmVyc1swXSk7CisgICAganBlZ19idWZmZXJfZGVzdHJveSgmc291cmNlLmJ1ZmZlcnNbMV0pOworICAgIHN3aXRjaCAoZGVzdC5vdXRwdXRfZm9ybWF0KQorICAgIHsKKyAgICBjYXNlIFlDUkNCTFBfSDJWMjoKKyAgICBjYXNlIFlDQkNSTFBfSDJWMjoKKyAgICBjYXNlIFlDUkNCTFBfSDJWMToKKyAgICBjYXNlIFlDQkNSTFBfSDJWMToKKyAgICBjYXNlIFlDUkNCTFBfSDFWMjoKKyAgICBjYXNlIFlDQkNSTFBfSDFWMjoKKyAgICBjYXNlIFlDUkNCTFBfSDFWMToKKyAgICBjYXNlIFlDQkNSTFBfSDFWMToKKyAgICAgICAganBlZ19idWZmZXJfZGVzdHJveSgmcF9vdXRwdXRfYnVmZmVycy5kYXRhLnl1di5sdW1hX2J1Zik7CisgICAgICAgIGpwZWdfYnVmZmVyX2Rlc3Ryb3koJnBfb3V0cHV0X2J1ZmZlcnMuZGF0YS55dXYuY2hyb21hX2J1Zik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBqcGVnZF9kZXN0cm95KCZkZWNvZGVyKTsKKworICAgIGlmICghcF90aHJlYWRfYXJnLT5kZWNvZGVfc3VjY2VzcykKKyAgICB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBBTE9HRCgiJXM6IFgiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIE9TX1RIUkVBRF9GVU5DX1JFVF9TVUNDRUVERUQ7CitmYWlsOgorCisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiBPU19USFJFQURfRlVOQ19SRVRfRkFJTEVEOworfQorCit2b2lkIGRlY29kZXJfZXZlbnRfaGFuZGxlcih2b2lkICAgICAgICAqcF91c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBqcGVnX2V2ZW50X3QgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqcF9hcmcpCit7CisgICAgdGhyZWFkX2N0cmxfYmxrX3QgKnBfdGhyZWFkX2FyZyA9ICh0aHJlYWRfY3RybF9ibGtfdCAqKXBfdXNlcl9kYXRhOworCisgICAgQUxPR0QoIiVzOiBFIiwgX19mdW5jX18pOworCisgICAgQUxPR0QoIiVzOiBFdmVudDogJXNcbiIsIF9fZnVuY19fLCBldmVudF90b19zdHJpbmdbZXZlbnRdKTsKKyAgICBpZiAoZXZlbnQgPT0gSlBFR19FVkVOVF9ET05FKQorICAgIHsKKyAgICAgICAgcF90aHJlYWRfYXJnLT5kZWNvZGVfc3VjY2VzcyA9IHRydWU7CisgICAgICAgIEFMT0dEKCIlczogZGVjb2RlX3N1Y2Nlc3M6ICVkXG4iLCBfX2Z1bmNfXywgcF90aHJlYWRfYXJnLT5kZWNvZGVfc3VjY2Vzcyk7CisgICAgfQorICAgIC8vIElmIGl0IGlzIG5vdCBhIHdhcm5pbmcgZXZlbnQsIGRlY29kZXIgaGFzIHN0b3BwZWQ7IFNpZ25hbAorICAgIC8vIG1haW4gdGhyZWFkIHRvIGNsZWFuIHVwCisgICAgaWYgKGV2ZW50ICE9IEpQRUdfRVZFTlRfV0FSTklORykKKyAgICB7CisgICAgICAgIG9zX211dGV4X2xvY2soJnBfdGhyZWFkX2FyZy0+bXV0ZXgpOworICAgICAgICBwX3RocmVhZF9hcmctPmRlY29kaW5nID0gZmFsc2U7CisgICAgICAgIG9zX2NvbmRfc2lnbmFsKCZwX3RocmVhZF9hcmctPmNvbmQpOworICAgICAgICBvc19tdXRleF91bmxvY2soJnBfdGhyZWFkX2FyZy0+bXV0ZXgpOworICAgIH0KKyAgICBBTE9HRCgiJXM6IFgiLCBfX2Z1bmNfXyk7CisKK30KKworLy8gY29uc3VtZXMgdGhlIG91dHB1dCBidWZmZXIuCisvKlRCREo6IENhbiBiZSByZW1vdmVkLiBJcyB0aGlzIHJlbGF0ZWQgdG8gdGlsaW5nICovCitpbnQgZGVjb2Rlcl9vdXRwdXRfaGFuZGxlcih2b2lkICpwX3VzZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdkX291dHB1dF9idWZfdCAqcF9vdXRwdXRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3Rfcm93X2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpc19sYXN0X2J1ZmZlcikKK3sKKyAgICB1aW50OF90KiB3aG9sZV9vdXRwdXRfYnVmX3B0ciwgKnRpbGluZ19idWZfcHRyOworCisgICAgQUxPR0QoIiVzOiBFIiwgX19mdW5jX18pOworCisgICAgdGhyZWFkX2N0cmxfYmxrX3QgKnBfdGhyZWFkX2FyZyA9ICh0aHJlYWRfY3RybF9ibGtfdCAqKXBfdXNlcl9kYXRhOworCisgICAganBlZ19idWZmZXJfZ2V0X2FkZHIocF90aHJlYWRfYXJnLT5wX3dob2xlX291dHB1dF9idWYtPmRhdGEucmdiLnJnYl9idWYsICZ3aG9sZV9vdXRwdXRfYnVmX3B0cik7CisgICAganBlZ19idWZmZXJfZ2V0X2FkZHIocF9vdXRwdXRfYnVmZmVyLT5kYXRhLnJnYi5yZ2JfYnVmLCAmdGlsaW5nX2J1Zl9wdHIpOworCisgICAgaWYgKHBfb3V0cHV0X2J1ZmZlci0+dGlsZV9oZWlnaHQgIT0gMSkKKyAgICAgICAgcmV0dXJuIEpQRUdFUlJfRVVOU1VQUE9SVEVEOworCisgICAgLy8gdGVzdGluZyBwdXJwb3NlIG9ubHkKKyAgICAvLyBUaGlzIGlzIHRvIHNpbXVsYXRlIHRoYXQgdGhlIHVzZXIgbmVlZHMgdG8gYmFpbCBvdXQgd2hlbiBlcnJvciBoYXBwZW5zCisgICAgLy8gaW4gdGhlIG1pZGRsZSBvZiBkZWNvZGluZworICAgIC8vaWYgKGZpcnN0X3Jvd19pZCA9PSAxNjIpCisgICAgIC8vICAgcmV0dXJuIEpQRUdFUlJfRUZBSUxFRDsKKworICAgIC8vIGRvIG5vdCBlbnF1ZXVlIGFueSBidWZmZXIgaWYgaXQgcmVhY2hlcyB0aGUgbGFzdCBidWZmZXIKKyAgICBpZiAoIWlzX2xhc3RfYnVmZmVyKQorICAgIHsKKyAgICAgICAganBlZ2RfZW5xdWV1ZV9vdXRwdXRfYnVmKHBfdGhyZWFkX2FyZy0+ZGVjb2RlciwgcF9vdXRwdXRfYnVmZmVyLCAxKTsKKyAgICB9CisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworCisgICAgcmV0dXJuIEpQRUdFUlJfU1VDQ0VTUzsKK30KKworLy8gICAgICBwX3JlYWRlci0+cF9pbnB1dF9yZXFfaGFuZGxlcihwX3JlYWRlci0+ZGVjb2RlciwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9yZWFkZXItPnBfaW5wdXRfYnVmLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3JlYWRlci0+bmV4dF9ieXRlX29mZnNldCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0JZVEVTX1RPX0ZFVENIKTsKKwordWludDMyX3QgZGVjb2Rlcl9pbnB1dF9yZXFfaGFuZGxlcih2b2lkICAgICAgICAgICAqcF91c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpwZWdfYnVmZmVyX3QgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBzdGFydF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBsZW5ndGgpCit7CisgICAgdWludDMyX3QgYnVmX3NpemU7CisgICAgdWludDhfdCAqYnVmX3B0cjsKKyAgICBpbnQgYnl0ZXNfdG9fcmVhZCwgYnl0ZXNfcmVhZCwgcmM7CisgICAgdGhyZWFkX2N0cmxfYmxrX3QgKnBfdGhyZWFkX2FyZyA9ICh0aHJlYWRfY3RybF9ibGtfdCAqKXBfdXNlcl9kYXRhOworICAgIHRocmVhZF9jdHJsX2Jsa190ICp0aHJlYWRfY3RybF9ibGsgPSAodGhyZWFkX2N0cmxfYmxrX3QgKilwX3VzZXJfZGF0YTsKKyAgICB0ZXN0X2FyZ3NfdCogICAgbWpwZWdkID0gKHRlc3RfYXJnc190KikgdGhyZWFkX2N0cmxfYmxrLT5wX2FyZ3M7CisKKyAgICBBTE9HRCgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICBqcGVnX2J1ZmZlcl9nZXRfbWF4X3NpemUoYnVmZmVyLCAmYnVmX3NpemUpOworICAgIGpwZWdfYnVmZmVyX2dldF9hZGRyKGJ1ZmZlciwgJmJ1Zl9wdHIpOworICAgIGJ5dGVzX3RvX3JlYWQgPSAobGVuZ3RoIDwgYnVmX3NpemUpID8gbGVuZ3RoIDogYnVmX3NpemU7CisgICAgYnl0ZXNfcmVhZCA9IDA7CisKKyAgICBBTE9HRCgiJXM6IGJ1Zl9wdHIgPSAlcCwgc3RhcnRfb2Zmc2V0ID0gJWQsIGxlbmd0aCA9ICVkIGJ1Zl9zaXplID0gJWQgYnl0ZXNfdG9fcmVhZCA9ICVkIiwgX19mdW5jX18sIGJ1Zl9wdHIsIHN0YXJ0X29mZnNldCwgbGVuZ3RoLCBidWZfc2l6ZSwgYnl0ZXNfdG9fcmVhZCk7CisgICAgaWYgKGJ5dGVzX3RvX3JlYWQpCisgICAgeworICAgICAgICAvKiBUQkRKOiBTaG91bGQgYXZvaWQgdGhpcyBNZW0gY29weSAqLworI2lmIDEKKyAgICAgICAgbWVtY3B5KGJ1Zl9wdHIsIChjaGFyICopbWpwZWdkLT5pbnB1dE1qcGVnQnVmZmVyICsgc3RhcnRfb2Zmc2V0LCBieXRlc190b19yZWFkKTsKKyNlbHNlCisgICAgICAgIGlmKEpQRUdFUlJfU1VDQ0VTUyAhPSBqcGVnX2J1ZmZlcl9zZXRfc3RhcnRfb2Zmc2V0KGJ1ZmZlciwgc3RhcnRfb2Zmc2V0KSkKKyAgICAgICAgICAgIEFMT0dFKCIlczoganBlZ19idWZmZXJfc2V0X3N0YXJ0X29mZnNldCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisjZW5kaWYKKyAgICAgICAgYnl0ZXNfcmVhZCA9IGJ5dGVzX3RvX3JlYWQ7CisgICAgfQorCisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiBieXRlc19yZWFkOworfQorCitzdGF0aWMgaW50IG1qcGVnZF90aW1lcl9zdGFydCh0aW1lc3BlYyAqcF90aW1lcikKK3sKKyAgICBpZiAoIXBfdGltZXIpCisgICAgICAgIHJldHVybiBKUEVHRVJSX0VOVUxMUFRSOworCisgICAgaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsIHBfdGltZXIpKQorICAgICAgICByZXR1cm4gSlBFR0VSUl9FRkFJTEVEOworCisgICAgcmV0dXJuIEpQRUdFUlJfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtanBlZ2RfdGltZXJfZ2V0X2VsYXBzZWQodGltZXNwZWMgKnBfdGltZXIsIGludCAqZWxhcHNlZF9pbl9tcywgdWludDhfdCByZXNldF9zdGFydCkKK3sKKyAgICB0aW1lc3BlYyBub3c7CisgICAgbG9uZyBkaWZmOworICAgIGludCByYyA9IG1qcGVnZF90aW1lcl9zdGFydCgmbm93KTsKKworICAgIGlmIChKUEVHX0ZBSUxFRChyYykpCisgICAgICAgIHJldHVybiByYzsKKworICAgIGRpZmYgPSAobG9uZykobm93LnR2X3NlYyAtIHBfdGltZXItPnR2X3NlYykgKiAxMDAwOworICAgIGRpZmYgKz0gKGxvbmcpKG5vdy50dl9uc2VjIC0gcF90aW1lci0+dHZfbnNlYykgLyAxMDAwMDAwOworICAgICplbGFwc2VkX2luX21zID0gKGludClkaWZmOworCisgICAgaWYgKHJlc2V0X3N0YXJ0KQorICAgICAgICAqcF90aW1lciA9IG5vdzsKKworICAgIHJldHVybiBKUEVHRVJSX1NVQ0NFU1M7Cit9CisKK2ludCBtanBlZ2RfY29uZF90aW1lZHdhaXQocHRocmVhZF9jb25kX3QgKnBfY29uZCwgcHRocmVhZF9tdXRleF90ICpwX211dGV4LCB1aW50MzJfdCBtcykKK3sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgaW50IHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKTsKKyAgICBpZiAocmMgPCAwKSByZXR1cm4gcmM7CisKKyAgICBpZiAobXMgPj0gMTAwMCkgeworICAgICAgIHRzLnR2X3NlYyArPSAobXMvMTAwMCk7CisgICAgICAgdHMudHZfbnNlYyArPSAoKG1zJTEwMDApICogMTAwMDAwMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHMudHZfbnNlYyArPSAobXMgKiAxMDAwMDAwKTsKKyAgICB9CisKKyAgICByYyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQocF9jb25kLCBwX211dGV4LCAmdHMpOworICAgIGlmIChyYyA9PSBFVElNRURPVVQpCisgICAgeworICAgICAgICByYyA9IEpQRUdFUlJfRVRJTUVET1VUOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKZGlmZiAtLWdpdCBhL21zbWNvYmFsdC91c2JjYW1jb3JlL3NyYy9RQ2FtZXJhVXNiUGFybS5jcHAgYi9tc21jb2JhbHQvdXNiY2FtY29yZS9zcmMvUUNhbWVyYVVzYlBhcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZkYTZlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9tc21jb2JhbHQvdXNiY2FtY29yZS9zcmMvUUNhbWVyYVVzYlBhcm0uY3BwCkBAIC0wLDAgKzEsNjgzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgVGhlIExpbnV4IEZvdW5kYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8vI2RlZmluZSBBTE9HX05ERUJVRyAwCisjZGVmaW5lIEFMT0dfTklERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlFDYW1lcmFVc2JQYXJtIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2lmIEhBVkVfQU5EUk9JRF9PUworI2luY2x1ZGUgPGxpbnV4L2FuZHJvaWRfcG1lbS5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxjYW1lcmEvUUNhbWVyYVBhcmFtZXRlcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CisjaW5jbHVkZSA8Z3JhbGxvY19wcml2Lmg+CisKKyNpbmNsdWRlICJsaW51eC9tc21fbWRwLmgiCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3N5c3RlbV9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tc21faW9uLmg+CisjaW5jbHVkZSA8Y2FtZXJhLmg+CisjaW5jbHVkZSA8Y2FtX2ZpZm8uaD4KKyNpbmNsdWRlIDxqcGVnZS5oPgorCit9IC8vIGV4dGVybiAiQyIKKworI2luY2x1ZGUgIlFDYW1lcmFIV0kuaCIKKyNpbmNsdWRlICJRdWFsY29tbVVzYkNhbWVyYS5oIgorI2luY2x1ZGUgIlFDYW1lcmFVc2JQcml2LmgiCisjaW5jbHVkZSAiUUNhbWVyYVVzYlBhcm0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3Qgc3RyX21hcCBwcmV2aWV3X2Zvcm1hdHNbXSA9IHsKKyAgICB7UUNhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9ZVVY0MjBTUCwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1B9LAorfTsKKworc3RhdGljIGNvbnN0IHByZXZpZXdfZm9ybWF0X2luZm9fdCBwcmV2aWV3X2Zvcm1hdF9pbmZvX2xpc3RbXSA9IHsKKyAgICB7SEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLCBDQU1FUkFfWVVWXzQyMF9ZVjEyLCBDQU1FUkFfUEFEX1RPX1dPUkQsIDN9Cit9OworCitzdGF0aWMgc3RydWN0IGNhbWVyYV9zaXplX3R5cGUgcHJldmlld1NpemVzW10gPSB7CisgICAgeyAxOTIwLCAxMDg4fSwgLy8xMDgwcAorICAgIHsgMTI4MCwgNzIwfSwgLy8gNzIwUCwKKyAgICB7IDY0MCwgNDgwfSwgLy8gVkdBCisgICAgeyA1MTIsIDM4NH0sCisgICAgeyA0ODAsIDMyMH0sCisgICAgeyAzMjAsIDI0MH0sIC8vIFFWR0EKK307CisKKy8vIEFsbCBmcHMgcmFuZ2VzIHdoaWNoIGNhbiBiZSBzdXBwb3J0ZWQuIFRoaXMgbGlzdCB3aWxsIGJlIGZpbHRlcmVkIGFjY29yZGluZworLy8gdG8gdGhlIG1pbiBhbmQgbWF4IGZwcyBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUKKy8vIHRoaXMgbGlzdCBtdXN0IGJlIHNvcnRlZCBmaXJzdCBieSBtYXhfZnBzIGFuZCB0aGVuIG1pbl9mcHMKKy8vIGZwcyB2YWx1ZXMgYXJlIG11bHRpcGxpZWQgYnkgMTAwMAorc3RhdGljIGFuZHJvaWQ6OkZQU1JhbmdlIHByZXZGcHNSYW5nZXNbXSA9IHsKKyAgICBhbmRyb2lkOjpGUFNSYW5nZSg1MDAwLCAxMjEwMDApLAorfTsKKworLyogVEJSOiBJcyBmcmFtZSByYXRlIG1vZGUgbWFuZGF0b3J5ICovCitzdGF0aWMgY29uc3Qgc3RyX21hcCBmcmFtZV9yYXRlX21vZGVzW10gPSB7CisgICAge1FDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfUFJFVklFV19GUkFNRV9SQVRFX0FVVE9fTU9ERSwgRlBTX01PREVfQVVUT30sCisgICAge1FDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfUUNfUFJFVklFV19GUkFNRV9SQVRFX0ZJWEVEX01PREUsIEZQU19NT0RFX0ZJWEVEfQorfTsKKworc3RhdGljIGNvbnN0IHN0cl9tYXAgcGljdHVyZV9mb3JtYXRzW10gPSB7CisgICAge1FDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfSlBFRywgUElDVFVSRV9GT1JNQVRfSlBFR30sCisgICAgLy97UUNhbWVyYVBhcmFtZXRlcnM6OlBJWEVMX0ZPUk1BVF9SQVcsIFBJQ1RVUkVfRk9STUFUX1JBV30KK307CisKK3N0YXRpYyBjYW1lcmFfc2l6ZV90eXBlIHBpY3R1cmVfc2l6ZXNbXSA9IHsKKyAgICB7IDE5MjAsIDEwODh9LCAvL0hEMTA4MAorICAgIHsgMTI4MCwgNzIwfSwgLy9IRDcyMAorICAgIHsgNjQwLCA0ODB9LCAvLyBWR0EKKyAgICB7IDMyMCwgMjQwfSwgLy8gUVZHQQorfTsKKworLyogYXNwZWN0IHJhdGlvIHJlbW92ZWQgKi8KK3N0YXRpYyBjYW1lcmFfc2l6ZV90eXBlIHRodW1ibmFpbF9zaXplc1tdID0geworICAgIHsgNTEyLCAyODggfSwgLy8xLjc3Nzc3OAorICAgIHsgNDgwLCAyODggfSwgLy8xLjY2NjY2NworICAgIHsgMjU2LCAxNTQgfSwgLy8xLjY2MjMzCisgICAgeyA0MzIsIDI4OCB9LCAvLzEuNQorICAgIHsgNTEyLCAzODQgfSwgLy8xLjMzMzMzMworICAgIHsgMzUyLCAyODggfSwgLy8xLjIyMjIyMgorICAgIHsgMzIwLCAyNDAgfSwgLy8xLjMzMzMzCisgICAgeyAxNzYsIDE0NCB9LCAvLzEuMjIyMjIyCit9OworCitzdGF0aWMgY29uc3Qgc3RyX21hcCByZWNvcmRpbmdfSGludHNbXSA9IHsKKyAgICB7ImZhbHNlIiwgRkFMU0V9LAorICAgIHsidHJ1ZSIsICBUUlVFfQorfTsKKworLyogU3RhdGljIGZ1bmN0aW9ucyBsaXN0ICovCitzdGF0aWMgU3RyaW5nOCBjcmVhdGVfc2l6ZXNfc3RyKGNvbnN0IGNhbWVyYV9zaXplX3R5cGUgKnNpemVzLCBpbnQgbGVuKTsKK3N0YXRpYyBTdHJpbmc4IGNyZWF0ZV92YWx1ZXNfc3RyKGNvbnN0IHN0cl9tYXAgKnZhbHVlcywgaW50IGxlbik7CitzdGF0aWMgU3RyaW5nOCBjcmVhdGVfZnBzX3N0cihjb25zdCBhbmRyb2lkOjogRlBTUmFuZ2UqIGZwcywgaW50IGxlbik7CitzdGF0aWMgU3RyaW5nOCBjcmVhdGVfdmFsdWVzX3JhbmdlX3N0cihpbnQgbWluLCBpbnQgbWF4KTsKK3N0YXRpYyBpbnQgdXNiQ2FtU2V0UHJ2d1NpemUoICAgY2FtZXJhX2hhcmR3YXJlX3QgICAgICAgICAgICpjYW1IYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiAgICBwYXJhbXMpOworc3RhdGljIGludCB1c2JDYW1TZXRQaWN0U2l6ZSggICBjYW1lcmFfaGFyZHdhcmVfdCAgICAgICAgICAgKmNhbUhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICAgIHBhcmFtcyk7CitzdGF0aWMgaW50IHVzYkNhbVNldFRodW1ibmFpbFNpemUoICBjYW1lcmFfaGFyZHdhcmVfdCAgICAgICAgICAgKmNhbUhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiAgICBwYXJhbXMpOworc3RhdGljIGludCB1c2JDYW1TZXRKcGVnUWx0eSggICBjYW1lcmFfaGFyZHdhcmVfdCAgICAgICAgICAgKmNhbUhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUUNhbWVyYVBhcmFtZXRlcnMmICAgIHBhcmFtcyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiB1c2JDYW1Jbml0RGVmYXVsdFBhcmFtZXRlcnMKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHNldHMgZGVmYXVsdCBwYXJhbWV0ZXJzIHRvIGNhbWVyYSBIQUwgY29udGV4dAorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIGNhbUhhbCAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgICAgIE5vbmUKKyAqCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IHVzYkNhbUluaXREZWZhdWx0UGFyYW1ldGVycyhjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKQoreworICAgIEFMT0dEKCIlczogRSIsIF9fZnVuY19fKTsKKyAgICBpbnQgcmMgPSAwOworICAgIGNoYXIgdGVtcFN0cltGSUxFTkFNRV9MRU5HVEhdOworCisgICAgLyogRGVmYXVsdCBpbml0aWFsaXphdGlvbnMgKi8KKyAgICBjYW1IYWwtPnByZXZGb3JtYXQgICAgICAgICAgPSBERUZBVUxUX1VTQkNBTV9QUlZXX0ZNVDsKKyAgICBjYW1IYWwtPnByZXZXaWR0aCAgICAgICAgICAgPSBERUZBVUxUX1VTQkNBTV9QUlZXX1dEOworICAgIGNhbUhhbC0+cHJldkhlaWdodCAgICAgICAgICA9IERFRkFVTFRfVVNCQ0FNX1BSVldfSFQ7CisgICAgY2FtSGFsLT5kaXNwRm9ybWF0ICAgICAgICAgID0gY2FtSGFsLT5wcmV2Rm9ybWF0OworICAgIGNhbUhhbC0+ZGlzcFdpZHRoICAgICAgICAgICA9IGNhbUhhbC0+cHJldldpZHRoOworICAgIGNhbUhhbC0+ZGlzcEhlaWdodCAgICAgICAgICA9IGNhbUhhbC0+cHJldkhlaWdodDsKKyAgICBjYW1IYWwtPnBpY3RGb3JtYXQgICAgICAgICAgPSBERUZBVUxUX1VTQkNBTV9QSUNUX0ZNVDsKKyAgICBjYW1IYWwtPnBpY3RXaWR0aCAgICAgICAgICAgPSBERUZBVUxUX1VTQkNBTV9QSUNUX1dEOworICAgIGNhbUhhbC0+cGljdEhlaWdodCAgICAgICAgICA9IERFRkFVTFRfVVNCQ0FNX1BJQ1RfSFQ7CisgICAgY2FtSGFsLT5waWN0SnBlZ1FsdHkgICAgICAgID0gREVGQVVMVF9VU0JDQU1fUElDVF9RTFRZOworICAgIGNhbUhhbC0+dGh1bWJuYWlsV2lkdGggICAgICA9IERFRkFVTFRfVVNCQ0FNX1RIVU1CTkFJTF9XRDsKKyAgICBjYW1IYWwtPnRodW1ibmFpbEhlaWdodCAgICAgPSBERUZBVUxUX1VTQkNBTV9USFVNQk5BSUxfSFQ7CisgICAgY2FtSGFsLT50aHVtYm5haWxKcGVnUWx0eSAgID0gREVGQVVMVF9VU0JDQU1fVEhVTUJOQUlMX1FMVFk7CisgICAgY2FtSGFsLT5wcmV2aWV3RW5hYmxlZEZsYWcgID0gMDsKKyAgICBjYW1IYWwtPnBydndTdG9wcGVkRm9yUGljdHVyZSA9IDA7CisgICAgY2FtSGFsLT5wcnZ3Q21kUGVuZGluZyAgICAgID0gMDsKKyAgICBjYW1IYWwtPnRha2VQaWN0SW5Qcm9ncmVzcyAgPSAwOworCisgICAgLy9TZXQgcGljdHVyZSBzaXplIHZhbHVlcworICAgIGNhbUhhbC0+cGljdFNpemVWYWx1ZXMgPSBjcmVhdGVfc2l6ZXNfc3RyKAorICAgICAgICBwaWN0dXJlX3NpemVzLCBzaXplb2YocGljdHVyZV9zaXplcykgLyBzaXplb2YoY2FtZXJhX3NpemVfdHlwZSkpOworICAgIGNhbUhhbC0+cUNhbVBhcmFtcy5zZXQoUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9TVVBQT1JURURfUElDVFVSRV9TSVpFUywKKyAgICAgICAgY2FtSGFsLT5waWN0U2l6ZVZhbHVlcy5zdHJpbmcoKSk7CisgICAgY2FtSGFsLT5xQ2FtUGFyYW1zLnNldFBpY3R1cmVTaXplKGNhbUhhbC0+cGljdFdpZHRoLCBjYW1IYWwtPnBpY3RIZWlnaHQpOworCisgICAgLy9TZXQgcGljdHVyZSBmb3JtYXQKKyAgICBjYW1IYWwtPnBpY3RGb3JtYXRWYWx1ZXMgPSBjcmVhdGVfdmFsdWVzX3N0cigKKyAgICAgICAgcGljdHVyZV9mb3JtYXRzLCBzaXplb2YocGljdHVyZV9mb3JtYXRzKSAvIHNpemVvZihzdHJfbWFwKSk7CisgICAgY2FtSGFsLT5xQ2FtUGFyYW1zLnNldChRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9QSUNUVVJFX0ZPUk1BVFMsCisgICAgICAgICAgICAgICAgICAgIGNhbUhhbC0+cGljdEZvcm1hdFZhbHVlcy5zdHJpbmcoKSk7CisgICAgaWYoUElDVFVSRV9GT1JNQVRfSlBFRyA9PSBjYW1IYWwtPnBpY3RGb3JtYXQpCisgICAgICAgIGNhbUhhbC0+cUNhbVBhcmFtcy5zZXRQaWN0dXJlRm9ybWF0KFFDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfSlBFRyk7CisKKyAgICAvL1NldCBwaWN0dXJlIHF1YWxpdHkKKyAgICBzcHJpbnRmKHRlbXBTdHIsICIlZCIsIGNhbUhhbC0+cGljdEpwZWdRbHR5KTsKKyAgICBjYW1IYWwtPnFDYW1QYXJhbXMuc2V0KFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfSlBFR19RVUFMSVRZLCB0ZW1wU3RyKTsKKworICAgIC8vU2V0IFRodW1ibmFpbCBzaXplCisgICAgY2FtSGFsLT50aHVtYm5haWxTaXplVmFsdWVzID0gY3JlYXRlX3NpemVzX3N0cigKKyAgICAgICAgdGh1bWJuYWlsX3NpemVzLCBzaXplb2YodGh1bWJuYWlsX3NpemVzKSAvc2l6ZW9mKGNhbWVyYV9zaXplX3R5cGUpKTsKKyAgICBjYW1IYWwtPnFDYW1QYXJhbXMuc2V0KFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX0pQRUdfVEhVTUJOQUlMX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBjYW1IYWwtPnRodW1ibmFpbFNpemVWYWx1ZXMuc3RyaW5nKCkpOworICAgIHNwcmludGYodGVtcFN0ciwgIiVkIiwgY2FtSGFsLT50aHVtYm5haWxXaWR0aCk7CisgICAgY2FtSGFsLT5xQ2FtUGFyYW1zLnNldChRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0pQRUdfVEhVTUJOQUlMX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFN0cik7CisgICAgc3ByaW50Zih0ZW1wU3RyLCAiJWQiLCBjYW1IYWwtPnRodW1ibmFpbEhlaWdodCk7CisgICAgY2FtSGFsLT5xQ2FtUGFyYW1zLnNldChRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0pQRUdfVEhVTUJOQUlMX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBTdHIpOworCisgICAgLy9TZXQgVGh1bWJuYWlsIHF1YWxpdHkKKyAgICBzcHJpbnRmKHRlbXBTdHIsICIlZCIsIGNhbUhhbC0+dGh1bWJuYWlsSnBlZ1FsdHkpOworICAgIGNhbUhhbC0+cUNhbVBhcmFtcy5zZXQoUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9KUEVHX1RIVU1CTkFJTF9RVUFMSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFN0cik7CisKKyAgICAvL1NldCBQcmV2aWV3IEZvcm1hdAorICAgIGNhbUhhbC0+cHJldkZvcm1hdFZhbHVlcyA9IGNyZWF0ZV92YWx1ZXNfc3RyKAorICAgICAgICBwcmV2aWV3X2Zvcm1hdHMsIHNpemVvZihwcmV2aWV3X2Zvcm1hdHMpIC8gc2l6ZW9mKHN0cl9tYXApKTsKKyAgICBjYW1IYWwtPnFDYW1QYXJhbXMuc2V0KFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfRk9STUFUUywKKyAgICAgICAgY2FtSGFsLT5wcmV2Rm9ybWF0VmFsdWVzLnN0cmluZygpKTsKKyAgICBpZihIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCA9PSBjYW1IYWwtPnByZXZGb3JtYXQpCisgICAgICAgIGNhbUhhbC0+cUNhbVBhcmFtcy5zZXRQcmV2aWV3Rm9ybWF0KFFDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIwU1ApOworCisgICAgLy9TZXQgUHJldmlldyBzaXplCisgICAgY2FtSGFsLT5wcmV2U2l6ZVZhbHVlcyA9IGNyZWF0ZV9zaXplc19zdHIoCisgICAgICAgIHByZXZpZXdTaXplcywgIHNpemVvZihwcmV2aWV3U2l6ZXMpIC8gc2l6ZW9mKGNhbWVyYV9zaXplX3R5cGUpKTsKKyAgICBjYW1IYWwtPnFDYW1QYXJhbXMuc2V0KFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfU0laRVMsCisgICAgICAgICAgICAgICAgICAgIGNhbUhhbC0+cHJldlNpemVWYWx1ZXMuc3RyaW5nKCkpOworICAgIGNhbUhhbC0+cUNhbVBhcmFtcy5zZXRQcmV2aWV3U2l6ZShjYW1IYWwtPnByZXZXaWR0aCwgY2FtSGFsLT5wcmV2SGVpZ2h0KTsKKworICAgIC8vU2V0IFByZWl2ZXcgZnBzIHJhbmdlCisgICAgY2FtSGFsLT5wcmV2RnBzUmFuZ2VzVmFsdWVzID0gY3JlYXRlX2Zwc19zdHIoCisgICAgICAgIHByZXZGcHNSYW5nZXMsIHNpemVvZihwcmV2RnBzUmFuZ2VzKSAvIHNpemVvZihhbmRyb2lkOjpGUFNSYW5nZSkpOworCisgICAgY2FtSGFsLT5xQ2FtUGFyYW1zLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfU1VQUE9SVEVEX1BSRVZJRVdfRlBTX1JBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtSGFsLT5wcmV2RnBzUmFuZ2VzVmFsdWVzKTsKKyAgICBjYW1IYWwtPnFDYW1QYXJhbXMuc2V0UHJldmlld0Zwc1JhbmdlKE1JTl9QUkVWX0ZQUywgTUFYX1BSRVZfRlBTKTsKKworICAgIEFMT0dEKCIlczogWCIsIF9fZnVuY19fKTsKKworICAgIHJldHVybiByYzsKK30gLyogdXNiQ2FtSW5pdERlZmF1bHRQYXJhbWV0ZXJzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiB1c2JDYW1TZXRQYXJhbWV0ZXJzCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIHBhcmFtZXRlciBzdHJpbmcgYW5kIHN0b3JlcyB0aGUKKyAqICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBjYW1lcmEgSEFMIGhhbmRsZQorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgY2FtSGFsICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKiAgcGFyYW1zICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gcGFyYW1ldGVyIHN0cmluZworICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgICAgIDAgICBTdWNjZXNzCisgKiAgICAgIC0xICBFcnJvcgorICogTm90ZXM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCB1c2JDYW1TZXRQYXJhbWV0ZXJzKGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWwsIGNvbnN0IGNoYXIgKnBhcmFtcykKK3sKKyAgICBpbnQgICAgICAgICAgICAgcmMgICAgICA9IDA7CisgICAgU3RyaW5nOCAgICAgICAgIHN0ciAgICAgPSBTdHJpbmc4KHBhcmFtcyk7CisgICAgUUNhbWVyYVBhcmFtZXRlcnMgcVBhcmFtOworCisgICAgQUxPR0QoIiVzOiBFIiwgX19mdW5jX18pOworCisgICAgaWYocGFyYW1zKQorICAgICAgICBQUklOVF9QQVJBTV9TVFIocGFyYW1zKTsKKworICAgIHFQYXJhbS51bmZsYXR0ZW4oc3RyKTsKKworICAgIGlmKHVzYkNhbVNldFBydndTaXplKGNhbUhhbCwgcVBhcmFtKSkKKyAgICAgICAgcmMgPSAtMTsKKyAgICBpZih1c2JDYW1TZXRQaWN0U2l6ZShjYW1IYWwsIHFQYXJhbSkpCisgICAgICAgIHJjID0gLTE7CisgICAgaWYodXNiQ2FtU2V0VGh1bWJuYWlsU2l6ZShjYW1IYWwsIHFQYXJhbSkpCisgICAgICAgIHJjID0gLTE7CisgICAgaWYodXNiQ2FtU2V0SnBlZ1FsdHkoY2FtSGFsLCBxUGFyYW0pKQorICAgICAgICByYyA9IC0xOworCisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiByYzsKK30gLyogdXNiQ2FtU2V0UGFyYW1ldGVycyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogdXNiQ2FtR2V0UGFyYW1ldGVycworICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3IgcGFyYW1ldGVyIHN0cmluZywKKyAqICAgICAgICAgICAgICBjb21wb3NlcyBhbmQgcmV0dXJucyB0aGUgcGFyYW1ldGVyIHN0cmluZworICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIGNhbUhhbCAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgICAgQWRkcmVzcyB0byB0aGUgcGFyYW1ldGVyIHN0cmluZworICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjaGFyKiB1c2JDYW1HZXRQYXJhbWV0ZXJzKGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWwpCit7CisgICAgQUxPR0QoIiVzOiBFIiwgX19mdW5jX18pOworICAgIGNoYXIgKnBhcm1zID0gTlVMTDsKKyAgICBjaGFyKiByYyA9IE5VTEw7CisgICAgU3RyaW5nOCBzdHI7CisKKyAgICBRQ2FtZXJhUGFyYW1ldGVycyBxUGFyYW0gPSBjYW1IYWwtPnFDYW1QYXJhbXM7CisgICAgLy9xUGFyYW0uZHVtcCgpOworICAgIHN0ciA9IHFQYXJhbS5mbGF0dGVuKCApOworICAgIHJjID0gKGNoYXIgKiltYWxsb2Moc2l6ZW9mKGNoYXIpKihzdHIubGVuZ3RoKCkrMSkpOworICAgIGlmKHJjICE9IE5VTEwpeworICAgICAgICBtZW1zZXQocmMsIDAsIHNpemVvZihjaGFyKSooc3RyLmxlbmd0aCgpKzEpKTsKKyAgICAgICAgc3RybmNweShyYywgc3RyLnN0cmluZygpLCBzdHIubGVuZ3RoKCkpOworICAgIHJjW3N0ci5sZW5ndGgoKV0gPSAwOworICAgIHBhcm1zID0gcmM7CisgICAgfQorCisgICAgUFJJTlRfUEFSQU1fU1RSKHBhcm1zKTsKKworICAgIEFMT0dEKCIlczogWCIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gKHBhcm1zKTsKK30gLyogdXNiQ2FtR2V0UGFyYW1ldGVycyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogdXNiQ2FtUHV0UGFyYW1ldGVycworICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gZnJlZXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHBhcmFtZXRlciBzdHJpbmcKKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogIGNhbUhhbCAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICogIHBhcm1zICAgICAgICAgICAgICAgLSBQYXJhbWV0ZXIgc3RyaW5nCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgICAgTm9uZQorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHVzYkNhbVB1dFBhcmFtZXRlcnMoY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbCwgY2hhciAqcGFybXMpCit7CisgICAgQUxPR0QoIiVzOiBFIiwgX19mdW5jX18pOworICAgIGlmKHBhcm1zKQorICAgICAgICBmcmVlKHBhcm1zKTsKKyAgICBwYXJtcyA9IE5VTEw7CisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworfSAvKiB1c2JDYW1QdXRQYXJhbWV0ZXJzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiBjcmVhdGVfc2l6ZXNfc3RyCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBsb29wcyB0aHJvdWdoIC9kZXYvdmlkZW8gZW50cmllcyBhbmQgcHJvYmVzIHdpdGgKKyAqICAgICAgICAgICAgICBVVkNJT0MgcXVlcnkuIElmIHRoZSBkZXZpY2UgcmVzcG9uZHMgdG8gdGhlIHF1ZXJ5LCB0aGVuIGl0IGlzCisgKiAgICAgICAgICAgICAgZGV0ZWN0ZWQgYXMgVVZDIHdlYmNhbQorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICAgZGV2bmFtZSAgICAgICAgICAgICAtIFN0cmluZyBwb2ludGVyLiBUaGUgZnVuY3Rpb24gcmV0dXJuIGRldiBlbnRyeQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgaW4gdGhpcyBzdHJpbmcKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgICAgIDAgICBTdWNjZXNzCisgKiAgICAgIC0xICBFcnJvcgorICogTm90ZXM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBTdHJpbmc4IGNyZWF0ZV9zaXplc19zdHIoY29uc3QgY2FtZXJhX3NpemVfdHlwZSAqc2l6ZXMsIGludCBsZW4pIHsKKyAgICBTdHJpbmc4IHN0cjsKKyAgICBjaGFyIGJ1ZmZlclszMl07CisKKyAgICBpZiAobGVuID4gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJWR4JWQiLCBzaXplc1swXS53aWR0aCwgc2l6ZXNbMF0uaGVpZ2h0KTsKKyAgICAgICAgc3RyLmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIsJWR4JWQiLCBzaXplc1tpXS53aWR0aCwgc2l6ZXNbaV0uaGVpZ2h0KTsKKyAgICAgICAgc3RyLmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogY3JlYXRlX3ZhbHVlc19zdHIKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGxvb3BzIHRocm91Z2ggL2Rldi92aWRlbyBlbnRyaWVzIGFuZCBwcm9iZXMgd2l0aAorICogICAgICAgICAgICAgIFVWQ0lPQyBxdWVyeS4gSWYgdGhlIGRldmljZSByZXNwb25kcyB0byB0aGUgcXVlcnksIHRoZW4gaXQgaXMKKyAqICAgICAgICAgICAgICBkZXRlY3RlZCBhcyBVVkMgd2ViY2FtCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogICBkZXZuYW1lICAgICAgICAgICAgIC0gU3RyaW5nIHBvaW50ZXIuIFRoZSBmdW5jdGlvbiByZXR1cm4gZGV2IGVudHJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSBpbiB0aGlzIHN0cmluZworICogUmV0dXJuIHZhbHVlczoKKyAqICAgICAgMCAgIFN1Y2Nlc3MKKyAqICAgICAgLTEgIEVycm9yCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFN0cmluZzggY3JlYXRlX3ZhbHVlc19zdHIoY29uc3Qgc3RyX21hcCAqdmFsdWVzLCBpbnQgbGVuKSB7CisgICAgU3RyaW5nOCBzdHI7CisKKyAgICBpZiAobGVuID4gMCkgeworICAgICAgICBzdHIuYXBwZW5kKHZhbHVlc1swXS5kZXNjKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW47IGkrKykgeworICAgICAgICBzdHIuYXBwZW5kKCIsIik7CisgICAgICAgIHN0ci5hcHBlbmQodmFsdWVzW2ldLmRlc2MpOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogY3JlYXRlX2Zwc19zdHIKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGxvb3BzIHRocm91Z2ggL2Rldi92aWRlbyBlbnRyaWVzIGFuZCBwcm9iZXMgd2l0aAorICogICAgICAgICAgICAgIFVWQ0lPQyBxdWVyeS4gSWYgdGhlIGRldmljZSByZXNwb25kcyB0byB0aGUgcXVlcnksIHRoZW4gaXQgaXMKKyAqICAgICAgICAgICAgICBkZXRlY3RlZCBhcyBVVkMgd2ViY2FtCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogICBkZXZuYW1lICAgICAgICAgICAgIC0gU3RyaW5nIHBvaW50ZXIuIFRoZSBmdW5jdGlvbiByZXR1cm4gZGV2IGVudHJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSBpbiB0aGlzIHN0cmluZworICogUmV0dXJuIHZhbHVlczoKKyAqICAgICAgMCAgIFN1Y2Nlc3MKKyAqICAgICAgLTEgIEVycm9yCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIFN0cmluZzggY3JlYXRlX2Zwc19zdHIoY29uc3QgYW5kcm9pZDo6IEZQU1JhbmdlKiBmcHMsIGludCBsZW4pIHsKKyAgICBTdHJpbmc4IHN0cjsKKyAgICBjaGFyIGJ1ZmZlclszMl07CisKKyAgICBpZiAobGVuID4gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiKCVkLCVkKSIsIGZwc1swXS5taW5GUFMsIGZwc1swXS5tYXhGUFMpOworICAgICAgICBzdHIuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiwoJWQsJWQpIiwgZnBzW2ldLm1pbkZQUywgZnBzW2ldLm1heEZQUyk7CisgICAgICAgIHN0ci5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIHN0cjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IGNyZWF0ZV92YWx1ZXNfcmFuZ2Vfc3RyCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBsb29wcyB0aHJvdWdoIC9kZXYvdmlkZW8gZW50cmllcyBhbmQgcHJvYmVzIHdpdGgKKyAqICAgICAgICAgICAgICBVVkNJT0MgcXVlcnkuIElmIHRoZSBkZXZpY2UgcmVzcG9uZHMgdG8gdGhlIHF1ZXJ5LCB0aGVuIGl0IGlzCisgKiAgICAgICAgICAgICAgZGV0ZWN0ZWQgYXMgVVZDIHdlYmNhbQorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICAgZGV2bmFtZSAgICAgICAgICAgICAtIFN0cmluZyBwb2ludGVyLiBUaGUgZnVuY3Rpb24gcmV0dXJuIGRldiBlbnRyeQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgaW4gdGhpcyBzdHJpbmcKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgICAgIDAgICBTdWNjZXNzCisgKiAgICAgIC0xICBFcnJvcgorICogTm90ZXM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBTdHJpbmc4IGNyZWF0ZV92YWx1ZXNfcmFuZ2Vfc3RyKGludCBtaW4sIGludCBtYXgpeworICAgIFN0cmluZzggc3RyOworICAgIGNoYXIgYnVmZmVyWzMyXTsKKworICAgIGlmKG1pbiA8PSBtYXgpeworICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJWQiLCBtaW4pOworICAgICAgICBzdHIuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IG1pbiArIDE7IGkgPD0gbWF4OyBpKyspIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIsJWQiLCBpKTsKKyAgICAgICAgICAgIHN0ci5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogdXNiQ2FtU2V0UHJ2d1NpemUKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBwcmV2aWV3IHdpZHRoIGFuZCBoZWlnaHQgZnJvbSB0aGUgaW5wdXQKKyAqICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGFuZCBzdG9yZXMgaW50byB0aGUgY29udGV4dAorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgY2FtSGFsICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKiAgcGFyYW1zICAgICAgICAgICAgICAtIFFDYW1lcmFQYXJhbWV0ZXJzIHJlZmVyZW5jZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgICAgIDAgICBJZiBwYXJhbWV0ZXJzIGFyZSB2YWxpZAorICogICAgICAtMSAgSWYgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHVzYkNhbVNldFBydndTaXplKCAgIGNhbWVyYV9oYXJkd2FyZV90ICAgICAgICAgICAqY2FtSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgICAgcGFyYW1zKQoreworICAgIGludCByYyA9IDAsIHdpZHRoLCBoZWlnaHQsIGksIG51bVBydndTaXplcywgdmFsaWRTaXplOworICAgIEFMT0dEKCIlczogRSIsIF9fZnVuY19fKTsKKworICAgIHBhcmFtcy5nZXRQcmV2aWV3U2l6ZSgmd2lkdGgsICZoZWlnaHQpOworICAgIEFMT0dJKCIlczogUmVxdWVzdGVkIHByZXZpZXcgc2l6ZSAlZCB4ICVkIiwgX19mdW5jX18sIHdpZHRoLCBoZWlnaHQpOworCisgICAgLy8gVmFsaWRhdGUgdGhlIHByZXZpZXcgc2l6ZQorICAgIG51bVBydndTaXplcyA9IHNpemVvZihwcmV2aWV3U2l6ZXMpIC8gc2l6ZW9mKGNhbWVyYV9zaXplX3R5cGUpOworICAgIGZvciAoaSA9IDAsIHZhbGlkU2l6ZSA9IDA7IGkgPCAgbnVtUHJ2d1NpemVzOyBpKyspIHsKKyAgICAgICAgaWYgKHdpZHRoID09ICBwcmV2aWV3U2l6ZXNbaV0ud2lkdGgKKyAgICAgICAgICAgJiYgaGVpZ2h0ID09ICBwcmV2aWV3U2l6ZXNbaV0uaGVpZ2h0KSB7CisgICAgICAgICAgICB2YWxpZFNpemUgPSAxOworCisgICAgICAgICAgICBjYW1IYWwtPnFDYW1QYXJhbXMuc2V0UHJldmlld1NpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBBTE9HRCgiJXM6IHNldFByZXZpZXdTaXplOiAgd2lkdGg6ICVkICAgaGVpZ2h0OiAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHdpZHRoLCBoZWlnaHQpOworCisgICAgICAgICAgICBjYW1IYWwtPnByZXZXaWR0aCAgID0gd2lkdGg7CisgICAgICAgICAgICBjYW1IYWwtPnByZXZIZWlnaHQgID0gaGVpZ2h0OworICAgICAgICAgICAgY2FtSGFsLT5kaXNwV2lkdGggICA9IHdpZHRoOworICAgICAgICAgICAgY2FtSGFsLT5kaXNwSGVpZ2h0ICA9IGhlaWdodDsKKworICAgICAgICAgICAgLyogVEJEOiByZXN0cmljdCBwaWN0dXJlcyBzaXplIGFuZCB2aWRlbyB0byBwcmV2aWV3IHNpemUgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBpZighdmFsaWRTaXplKQorICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcHJldmlldyBzaXplICVkeCVkIHJlcXVlc3RlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CisKKyAgICByYyA9ICh2YWxpZFNpemUgPT0gMCk/IC0xOjA7CisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworCisgICAgcmV0dXJuIHJjOworfSAvKiB1c2JDYW1TZXRQcnZ3U2l6ZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogdXNiQ2FtU2V0UGljdFNpemUKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBwaWN0dXJlIHdpZHRoIGFuZCBoZWlnaHQgZnJvbSB0aGUgaW5wdXQKKyAqICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGFuZCBzdG9yZXMgaW50byB0aGUgY29udGV4dAorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgY2FtSGFsICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKiAgcGFyYW1zICAgICAgICAgICAgICAtIFFDYW1lcmFQYXJhbWV0ZXJzIHJlZmVyZW5jZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgICAgIDAgICBJZiBwYXJhbWV0ZXJzIGFyZSB2YWxpZAorICogICAgICAtMSAgSWYgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHVzYkNhbVNldFBpY3RTaXplKCAgIGNhbWVyYV9oYXJkd2FyZV90ICAgICAgICAgICAqY2FtSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgICAgcGFyYW1zKQoreworICAgIGludCByYyA9IDAsIHdpZHRoLCBoZWlnaHQsIGksIG51bVBpY3RTaXplcywgdmFsaWRTaXplOworICAgIEFMT0dEKCIlczogRSIsIF9fZnVuY19fKTsKKworICAgIC8qIHBhcnNlIGZvciBwaWN0dXJlIHdpZHRoIGFuZCBoZWlnaHQgKi8KKyAgICBwYXJhbXMuZ2V0UGljdHVyZVNpemUoJndpZHRoLCAmaGVpZ2h0KTsKKyAgICBBTE9HSSgiJXM6IFJlcXVlc3RlZCBwaWN0dXJlIHNpemUgJWQgeCAlZCIsIF9fZnVuY19fLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIC8vIFZhbGlkYXRlIHRoZSBwaWN0dXJlIHNpemUKKyAgICBudW1QaWN0U2l6ZXMgPSBzaXplb2YocGljdHVyZV9zaXplcykgLyBzaXplb2YoY2FtZXJhX3NpemVfdHlwZSk7CisgICAgZm9yIChpID0gMCwgdmFsaWRTaXplID0gMDsgaSA8ICBudW1QaWN0U2l6ZXM7IGkrKykgeworICAgICAgICBpZiAod2lkdGggPT0gIHBpY3R1cmVfc2l6ZXNbaV0ud2lkdGgKKyAgICAgICAgICAgJiYgaGVpZ2h0ID09ICBwaWN0dXJlX3NpemVzW2ldLmhlaWdodCkgeworICAgICAgICAgICAgdmFsaWRTaXplID0gMTsKKworICAgICAgICAgICAgY2FtSGFsLT5xQ2FtUGFyYW1zLnNldFBpY3R1cmVTaXplKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgQUxPR0QoIiVzOiBzZXRQaWN0dXJlU2l6ZTogIHdpZHRoOiAlZCAgIGhlaWdodDogJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgICAgICAgICAgLyogVEJEOiBJZiBuZXcgcGljdFNpemUgaXMgZGlmZmVyZW50IGZyb20gb2xkIHNpemUsIHJlc3RhcnQgcHJ2dyAqLworICAgICAgICAgICAgY2FtSGFsLT5waWN0V2lkdGggICA9IHdpZHRoOworICAgICAgICAgICAgY2FtSGFsLT5waWN0SGVpZ2h0ICA9IGhlaWdodDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZighdmFsaWRTaXplKQorICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcGljdHVyZSBzaXplICVkeCVkIHJlcXVlc3RlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CisgICAgcmMgPSAodmFsaWRTaXplID09IDApPyAtMTowOworICAgIEFMT0dEKCIlczogWCIsIF9fZnVuY19fKTsKKworICAgIHJldHVybiByYzsKK30gLyogdXNiQ2FtU2V0UGljdFNpemUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHVzYkNhbVNldFRodW1ibmFpbFNpemUKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBwaWN0dXJlIHdpZHRoIGFuZCBoZWlnaHQgZnJvbSB0aGUgaW5wdXQKKyAqICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGFuZCBzdG9yZXMgaW50byB0aGUgY29udGV4dAorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgY2FtSGFsICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKiAgcGFyYW1zICAgICAgICAgICAgICAtIFFDYW1lcmFQYXJhbWV0ZXJzIHJlZmVyZW5jZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgICAgIDAgICBJZiBwYXJhbWV0ZXJzIGFyZSB2YWxpZAorICogICAgICAtMSAgSWYgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHVzYkNhbVNldFRodW1ibmFpbFNpemUoICBjYW1lcmFfaGFyZHdhcmVfdCAgICAgICAgICAgKmNhbUhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFDYW1lcmFQYXJhbWV0ZXJzJiAgICBwYXJhbXMpCit7CisgICAgaW50IHJjID0gMCwgd2lkdGgsIGhlaWdodCwgaSwgbnVtVGh1bWJuYWlsU2l6ZXMsIHZhbGlkU2l6ZTsKKyAgICBjaGFyIHRlbXBTdHJbRklMRU5BTUVfTEVOR1RIXTsKKyAgICBBTE9HRCgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICAvKiBwYXJzZSBmb3IgdGh1bWJuYWlsIHdpZHRoIGFuZCBoZWlnaHQgKi8KKyAgICB3aWR0aCA9IHBhcmFtcy5nZXRJbnQoUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9KUEVHX1RIVU1CTkFJTF9XSURUSCk7CisgICAgaGVpZ2h0ID0gcGFyYW1zLmdldEludChRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0pQRUdfVEhVTUJOQUlMX0hFSUdIVCk7CisgICAgQUxPR0koIiVzOiBSZXF1ZXN0ZWQgdGh1bWJuYWlsIHNpemUgJWQgeCAlZCIsIF9fZnVuY19fLCB3aWR0aCwgaGVpZ2h0KTsKKworICAgIC8vIFZhbGlkYXRlIHRoZSB0aHVtYm5haWwgc2l6ZQorICAgIG51bVRodW1ibmFpbFNpemVzID0gc2l6ZW9mKHRodW1ibmFpbF9zaXplcykgLyBzaXplb2YoY2FtZXJhX3NpemVfdHlwZSk7CisgICAgZm9yIChpID0gMCwgdmFsaWRTaXplID0gMDsgaSA8ICBudW1UaHVtYm5haWxTaXplczsgaSsrKSB7CisgICAgICAgIGlmICh3aWR0aCA9PSAgdGh1bWJuYWlsX3NpemVzW2ldLndpZHRoCisgICAgICAgICAgICYmIGhlaWdodCA9PSAgdGh1bWJuYWlsX3NpemVzW2ldLmhlaWdodCkgeworICAgICAgICAgICAgdmFsaWRTaXplID0gMTsKKworICAgICAgICAgICAgY2FtSGFsLT50aHVtYm5haWxXaWR0aCAgID0gd2lkdGg7CisgICAgICAgICAgICBjYW1IYWwtPnRodW1ibmFpbEhlaWdodCAgPSBoZWlnaHQ7CisgICAgICAgICAgICBzcHJpbnRmKHRlbXBTdHIsICIlZCIsIGNhbUhhbC0+dGh1bWJuYWlsV2lkdGgpOworICAgICAgICAgICAgY2FtSGFsLT5xQ2FtUGFyYW1zLnNldChRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0pQRUdfVEhVTUJOQUlMX1dJRFRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7CisgICAgICAgICAgICBzcHJpbnRmKHRlbXBTdHIsICIlZCIsIGNhbUhhbC0+dGh1bWJuYWlsSGVpZ2h0KTsKKyAgICAgICAgICAgIGNhbUhhbC0+cUNhbVBhcmFtcy5zZXQoUUNhbWVyYVBhcmFtZXRlcnM6OktFWV9KUEVHX1RIVU1CTkFJTF9IRUlHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CisKKyAgICAgICAgfQorICAgIH0KKyAgICBpZighdmFsaWRTaXplKQorICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcGljdHVyZSBzaXplICVkeCVkIHJlcXVlc3RlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CisgICAgcmMgPSAodmFsaWRTaXplID09IDApPyAtMTowOworICAgIEFMT0dEKCIlczogWCIsIF9fZnVuY19fKTsKKworICAgIHJldHVybiByYzsKK30gLyogdXNiQ2FtU2V0VGh1bWJuYWlsU2l6ZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogdXNiQ2FtU2V0SnBlZ1FsdHkKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyBwaWN0dXJlIGFuZCB0aHVtYm5haWwgSlBFRyBxdWFsaXR5IGFuZAorICogICAgICAgICAgICAgIHZhbGlkYXRlcyBiZWZvcmUgc3RvcmluZyBpbiB0aGUgY29udGV4dAorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgY2FtSGFsICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKiAgcGFyYW1zICAgICAgICAgICAgICAtIFFDYW1lcmFQYXJhbWV0ZXJzIHJlZmVyZW5jZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgICAgIDAgICBJZiBwYXJhbWV0ZXJzIGFyZSB2YWxpZAorICogICAgICAtMSAgSWYgcGFyYW1ldGVycyBhcmUgaW52YWxpZAorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHVzYkNhbVNldEpwZWdRbHR5KCAgIGNhbWVyYV9oYXJkd2FyZV90ICAgICAgICAgICAqY2FtSGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRQ2FtZXJhUGFyYW1ldGVycyYgICAgcGFyYW1zKQoreworICAgIGludCByYyA9IDAsIHF1YWxpdHkgPSAwOworICAgIGNoYXIgdGVtcFN0cltGSUxFTkFNRV9MRU5HVEhdOworICAgIEFMT0dEKCIlczogRSIsIF9fZnVuY19fKTsKKworICAgIC8qKi8KKyAgICBxdWFsaXR5ID0gcGFyYW1zLmdldEludChRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0pQRUdfUVVBTElUWSk7CisgICAgQUxPR0koIiVzOiBSZXF1ZXN0ZWQgcGljdHVyZSBxbHR5ICVkIiwgX19mdW5jX18sIHF1YWxpdHkpOworCisgICAgaWYgKHF1YWxpdHkgPj0gMCAmJiBxdWFsaXR5IDw9IDEwMCkgeworICAgICAgICBjYW1IYWwtPnBpY3RKcGVnUWx0eSA9IHF1YWxpdHk7CisgICAgICAgIHNwcmludGYodGVtcFN0ciwgIiVkIiwgY2FtSGFsLT5waWN0SnBlZ1FsdHkpOworICAgICAgICBjYW1IYWwtPnFDYW1QYXJhbXMuc2V0KFFDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfSlBFR19RVUFMSVRZLCBxdWFsaXR5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBqcGVnIHF1YWxpdHk9JWQiLCBxdWFsaXR5KTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9CisKKyAgICBxdWFsaXR5ID0gcGFyYW1zLmdldEludChRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0pQRUdfVEhVTUJOQUlMX1FVQUxJVFkpOworICAgIEFMT0dJKCIlczogUmVxdWVzdGVkIHRodW1ibmFpbCBxbHR5ICVkIiwgX19mdW5jX18sIHF1YWxpdHkpOworCisgICAgaWYgKHF1YWxpdHkgPj0gMCAmJiBxdWFsaXR5IDw9IDEwMCkgeworICAgICAgICBjYW1IYWwtPnRodW1ibmFpbEpwZWdRbHR5ID0gcXVhbGl0eTsKKyAgICAgICAgc3ByaW50Zih0ZW1wU3RyLCAiJWQiLCBjYW1IYWwtPnRodW1ibmFpbEpwZWdRbHR5KTsKKyAgICAgICAgY2FtSGFsLT5xQ2FtUGFyYW1zLnNldChRQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0pQRUdfVEhVTUJOQUlMX1FVQUxJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wU3RyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBqcGVnIHRodW1ibmFpbCBxdWFsaXR5PSVkIiwgcXVhbGl0eSk7CisgICAgICAgIHJjID0gLTE7CisgICAgfQorCisgICAgQUxPR0QoIiVzOiBYIHJjOiVkIiwgX19mdW5jX18sIHJjKTsKKworICAgIHJldHVybiByYzsKK30KKworfTsgLypuYW1lc3BhY2UgYW5kcm9pZCAqLwpkaWZmIC0tZ2l0IGEvbXNtY29iYWx0L3VzYmNhbWNvcmUvc3JjL1F1YWxjb21tVXNiQ2FtZXJhLmNwcCBiL21zbWNvYmFsdC91c2JjYW1jb3JlL3NyYy9RdWFsY29tbVVzYkNhbWVyYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjI3NDYyNgotLS0gL2Rldi9udWxsCisrKyBiL21zbWNvYmFsdC91c2JjYW1jb3JlL3NyYy9RdWFsY29tbVVzYkNhbWVyYS5jcHAKQEAgLTAsMCArMSwyOTYzIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVAorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRQorICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyAvKiNlcnJvciB1bmNvbW1lbnQgdGhpcyBmb3IgY29tcGlsZXIgdGVzdCEqLworLy8jZGVmaW5lIEFMT0dfTkRFQlVHIDAKKyNkZWZpbmUgQUxPR19OSURFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUXVhbGNvbW1Vc2JDYW1lcmEiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3V2Y3ZpZGVvLmg+CisKKyNpbmNsdWRlICJRQ2FtZXJhSEFMLmgiCisjaW5jbHVkZSAiUXVhbGNvbW1Vc2JDYW1lcmEuaCIKKyNpbmNsdWRlICJRQ2FtZXJhVXNiUHJpdi5oIgorI2luY2x1ZGUgIlFDYW1lcmFNanBlZ0RlY29kZS5oIgorI2luY2x1ZGUgIlFDYW1lcmFVc2JQYXJtLmgiCisjaW5jbHVkZSA8Z3JhbGxvY19wcml2Lmg+CisjaW5jbHVkZSA8Z2VubG9jay5oPgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorfQorCitjYW1lcmFfZGV2aWNlX29wc190IHVzYmNhbV9jYW1lcmFfb3BzID0geworICBzZXRfcHJldmlld193aW5kb3c6ICAgICAgICAgYW5kcm9pZDo6dXNiY2FtX3NldF9wcmV2aWV3X3dpbmRvdywKKyAgc2V0X2NhbGxiYWNrczogICAgICAgICAgICAgIGFuZHJvaWQ6OnVzYmNhbV9zZXRfQ2FsbEJhY2tzLAorICBlbmFibGVfbXNnX3R5cGU6ICAgICAgICAgICAgYW5kcm9pZDo6dXNiY2FtX2VuYWJsZV9tc2dfdHlwZSwKKyAgZGlzYWJsZV9tc2dfdHlwZTogICAgICAgICAgIGFuZHJvaWQ6OnVzYmNhbV9kaXNhYmxlX21zZ190eXBlLAorICBtc2dfdHlwZV9lbmFibGVkOiAgICAgICAgICAgYW5kcm9pZDo6dXNiY2FtX21zZ190eXBlX2VuYWJsZWQsCisKKyAgc3RhcnRfcHJldmlldzogICAgICAgICAgICAgIGFuZHJvaWQ6OnVzYmNhbV9zdGFydF9wcmV2aWV3LAorICBzdG9wX3ByZXZpZXc6ICAgICAgICAgICAgICAgYW5kcm9pZDo6dXNiY2FtX3N0b3BfcHJldmlldywKKyAgcHJldmlld19lbmFibGVkOiAgICAgICAgICAgIGFuZHJvaWQ6OnVzYmNhbV9wcmV2aWV3X2VuYWJsZWQsCisgIHN0b3JlX21ldGFfZGF0YV9pbl9idWZmZXJzOiBhbmRyb2lkOjp1c2JjYW1fc3RvcmVfbWV0YV9kYXRhX2luX2J1ZmZlcnMsCisKKyAgc3RhcnRfcmVjb3JkaW5nOiAgICAgICAgICAgIGFuZHJvaWQ6OnVzYmNhbV9zdGFydF9yZWNvcmRpbmcsCisgIHN0b3BfcmVjb3JkaW5nOiAgICAgICAgICAgICBhbmRyb2lkOjp1c2JjYW1fc3RvcF9yZWNvcmRpbmcsCisgIHJlY29yZGluZ19lbmFibGVkOiAgICAgICAgICBhbmRyb2lkOjp1c2JjYW1fcmVjb3JkaW5nX2VuYWJsZWQsCisgIHJlbGVhc2VfcmVjb3JkaW5nX2ZyYW1lOiAgICBhbmRyb2lkOjp1c2JjYW1fcmVsZWFzZV9yZWNvcmRpbmdfZnJhbWUsCisKKyAgYXV0b19mb2N1czogICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnVzYmNhbV9hdXRvX2ZvY3VzLAorICBjYW5jZWxfYXV0b19mb2N1czogICAgICAgICAgYW5kcm9pZDo6dXNiY2FtX2NhbmNlbF9hdXRvX2ZvY3VzLAorCisgIHRha2VfcGljdHVyZTogICAgICAgICAgICAgICBhbmRyb2lkOjp1c2JjYW1fdGFrZV9waWN0dXJlLAorICBjYW5jZWxfcGljdHVyZTogICAgICAgICAgICAgYW5kcm9pZDo6dXNiY2FtX2NhbmNlbF9waWN0dXJlLAorCisgIHNldF9wYXJhbWV0ZXJzOiAgICAgICAgICAgICBhbmRyb2lkOjp1c2JjYW1fc2V0X3BhcmFtZXRlcnMsCisgIGdldF9wYXJhbWV0ZXJzOiAgICAgICAgICAgICBhbmRyb2lkOjp1c2JjYW1fZ2V0X3BhcmFtZXRlcnMsCisgIHB1dF9wYXJhbWV0ZXJzOiAgICAgICAgICAgICBhbmRyb2lkOjp1c2JjYW1fcHV0X3BhcmFtZXRlcnMsCisgIHNlbmRfY29tbWFuZDogICAgICAgICAgICAgICBhbmRyb2lkOjp1c2JjYW1fc2VuZF9jb21tYW5kLAorCisgIHJlbGVhc2U6ICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjp1c2JjYW1fcmVsZWFzZSwKKyAgZHVtcDogICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnVzYmNhbV9kdW1wLAorfTsKKworI2RlZmluZSBDQVBUVVJFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERJU1BMQVkgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ0FMTF9CQUNLICAgICAgICAgICAgICAgMQorI2RlZmluZSBNRU1TRVQgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEZSRUFEX0pQRUdfUElDVFVSRSAgICAgIDAKKyNkZWZpbmUgSlBFR19PTl9VU0JfQ0FNRVJBICAgICAgMQorI2RlZmluZSBGSUxFX0RVTVBfQ0FNRVJBICAgICAgICAwCisjZGVmaW5lIEZJTEVfRFVNUF9CNF9ESVNQICAgICAgIDAKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgaW50IGluaXRVc2JDYW1lcmEoICAgICAgICAgICAgICAgY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsRm9ybWF0KTsKK3N0YXRpYyBpbnQgc3RhcnRVc2JDYW1DYXB0dXJlKCAgICAgICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKTsKK3N0YXRpYyBpbnQgc3RvcFVzYkNhbUNhcHR1cmUoICAgICAgICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKTsKK3N0YXRpYyBpbnQgaW5pdFY0TDJtbWFwKCAgICAgICAgICAgICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKTsKK3N0YXRpYyBpbnQgdW5Jbml0VjRMMm1tYXAoICAgICAgICAgICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKTsKK3N0YXRpYyBpbnQgbGF1bmNoX3ByZXZpZXdfdGhyZWFkKCAgICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKTsKK3N0YXRpYyBpbnQgbGF1bmNoVGFrZVBpY3R1cmVUaHJlYWQoICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKTsKK3N0YXRpYyBpbnQgaW5pdERpc3BsYXlCdWZmZXJzKCAgICAgICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKTsKK3N0YXRpYyBpbnQgZGVJbml0RGlzcGxheUJ1ZmZlcnMoICAgICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKTsKK3N0YXRpYyBpbnQgc3RvcFByZXZpZXdJbnRlcm5hbCggICAgICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKTsKK3N0YXRpYyBpbnQgZ2V0X2J1Zl9mcm9tX2NhbSggICAgICAgICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKTsKK3N0YXRpYyBpbnQgcHV0X2J1Zl90b19jYW0oICAgICAgICAgICAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKTsKK3N0YXRpYyBpbnQgcHJ2d1RocmVhZFRha2VQaWN0dXJlSW50ZXJuYWwoY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbCk7CitzdGF0aWMgaW50IGdldF9idWZfZnJvbV9kaXNwbGF5KCBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsLCBpbnQgKmJ1ZmZlcl9pZCk7CitzdGF0aWMgaW50IHB1dF9idWZfdG9fZGlzcGxheSggICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsLCBpbnQgYnVmZmVyX2lkKTsKK3N0YXRpYyBpbnQgY29udmVydF9kYXRhX2ZybV9jYW1fdG9fZGlzcChjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsLCBpbnQgYnVmZmVyX2lkKTsKK3N0YXRpYyB2b2lkICogcHJldmlld2xvb3Aodm9pZCAqKTsKK3N0YXRpYyB2b2lkICogdGFrZVBpY3R1cmVUaHJlYWQodm9pZCAqKTsKK3N0YXRpYyBpbnQgY29udmVydF9ZVVlWX3RvXzQyMF9OVjEyKGNoYXIgKmluX2J1ZiwgY2hhciAqb3V0X2J1ZiwgaW50IHdkLCBpbnQgaHQpOworc3RhdGljIGludCBnZXRfdXZjX2RldmljZShjaGFyICpkZXZuYW1lKTsKK3N0YXRpYyBpbnQgZ2V0UHJldmlld0NhcHR1cmVGbXQoY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbCk7CitzdGF0aWMgaW50IGFsbG9jYXRlX2lvbl9tZW1vcnkoUUNhbWVyYUhhbE1lbUluZm9fdCAqbWVtX2luZm8sIGludCBpb25fdHlwZSk7CitzdGF0aWMgaW50IGRlYWxsb2NhdGVfaW9uX21lbW9yeShRQ2FtZXJhSGFsTWVtSW5mb190ICptZW1faW5mbyk7CitzdGF0aWMgaW50IGlvY3RsTG9vcChpbnQgZmQsIGludCBpb2N0bENtZCwgdm9pZCAqYXJncyk7CitzdGF0aWMgaW50IHJlYWRGcm9tRmlsZShjaGFyKiBmaWxlTmFtZSwgY2hhciogYnVmZmVyLCBpbnQgYnVmZmVyU2l6ZSk7CitzdGF0aWMgaW50IGZpbGVEdW1wKGNvbnN0IGNoYXIqIGZpbGVOYW1lLCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoLCBpbnQqIGZybV9jbnQpOworc3RhdGljIGludCBlbmNvZGVKcGVnKCAgICAgICAgICAgICAgICAgIGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWwpOwordm9pZCBqcGVnRW5jb2RlQ2IgICAoanBlZ19qb2Jfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRodW1ibmFpbERyb3BwZWRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbGllbnRfaGRsLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBqb2JJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEpOworCisvKiBIQUwgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gZ29lcyBoZXJlKi8KKworLyoqCisgKiBUaGUgZnVuY3Rpb25zIG5lZWQgdG8gYmUgcHJvdmlkZWQgYnkgdGhlIGNhbWVyYSBIQUwuCisgKgorICogSWYgZ2V0TnVtYmVyT2ZDYW1lcmFzKCkgcmV0dXJucyBOLCB0aGUgdmFsaWQgY2FtZXJhSWQgZm9yIGdldENhbWVyYUluZm8oKQorICogYW5kIG9wZW5DYW1lcmFIYXJkd2FyZSgpIGlzIDAgdG8gTi0xLgorICovCisKK2V4dGVybiAiQyIgaW50IHVzYmNhbV9nZXRfbnVtYmVyX29mX2NhbWVyYXMoKQoreworICAgIC8qIFRCUjogVGhpcyBpcyBoYXJkY29kZWQgY3VycmVudGx5IHRvIDEgVVNCIGNhbWVyYSAqLworICAgIGludCBudW1DYW1lcmFzID0gMTsKKyAgICBBTE9HSSgiJXM6IEUiLCBfX2Z1bmNfXyk7CisgICAgQUxPR0koIiVzOiBYIiwgX19mdW5jX18pOworCisgICAgcmV0dXJuIG51bUNhbWVyYXM7Cit9CisKK2V4dGVybiAiQyIgaW50IHVzYmNhbV9nZXRfY2FtZXJhX2luZm8oaW50IGNhbWVyYV9pZCwgc3RydWN0IGNhbWVyYV9pbmZvICppbmZvKQoreworICAgIGludCByYyA9IC0xOworICAgIEFMT0dJKCIlczogRSIsIF9fZnVuY19fKTsKKworICAgIC8qIFRCUjogVGhpcyBpbmZvIGlzIGhhcmRjb2RlZCBjdXJyZW50bHkgaXJyZXNwZWN0aXZlIG9mIGNhbWVyYV9pZCAqLworICAgIGlmKGluZm8pIHsKKyAgICAgICAgc3RydWN0IENhbWVyYUluZm8gY2FtSW5mbzsKKyAgICAgICAgbWVtc2V0KCZjYW1JbmZvLCAtMSwgc2l6ZW9mIChzdHJ1Y3QgQ2FtZXJhSW5mbykpOworCisgICAgICAgIGluZm8tPmZhY2luZyA9IENBTUVSQV9GQUNJTkdfRlJPTlQ7Ly9DQU1FUkFfRkFDSU5HX0JBQ0s7CisgICAgICAgIGluZm8tPm9yaWVudGF0aW9uID0gMDsKKyAgICAgICAgcmMgPSAwOworICAgIH0KKyAgICBBTE9HSSgiJXM6IFgiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKiBIQUwgc2hvdWxkIHJldHVybiBOVUxMIGhhbmRsZSBpZiBpdCBmYWlscyB0byBvcGVuIGNhbWVyYSBoYXJkd2FyZS4gKi8KK2V4dGVybiAiQyIgaW50ICB1c2JjYW1fY2FtZXJhX2RldmljZV9vcGVuKAorICBjb25zdCBzdHJ1Y3QgaHdfbW9kdWxlX3QqIG1vZHVsZSwgY29uc3QgY2hhciogaWQsCisgICAgICAgICAgc3RydWN0IGh3X2RldmljZV90KiogaHdfZGV2aWNlKQoreworICAgIGludCByYyA9IC0xOworICAgIGNhbWVyYV9kZXZpY2UgICAgICAgKmRldmljZSA9IE5VTEw7CisgICAgY2FtZXJhX2hhcmR3YXJlX3QgICAqY2FtSGFsOworICAgIGNoYXIgICAgICAgICAgICAgICAgKmRldl9uYW1lOworCisgICAgQUxPR0koIiVzOiBFIiwgX19mdW5jX18pOworCisgICAgLyogaW5pdGlhbGl6ZSByZXR1cm4gaGFuZGxlIHZhbHVlIHRvIE5VTEwgKi8KKyAgICAqaHdfZGV2aWNlID0gTlVMTDsKKworICAgIGNhbUhhbCA9IG5ldyBjYW1lcmFfaGFyZHdhcmVfdCgpOworICAgIGlmKCFjYW1IYWwpIHsKKworICAgICAgICAgICAgQUxPR0UoIiVzOiAgZW5kIGluIG5vIG1lbSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByYyA9IHVzYkNhbUluaXREZWZhdWx0UGFyYW1ldGVycyhjYW1IYWwpOworICAgIGlmKDAgIT0gcmMpCisgICAgeworICAgICAgICBBTE9HRSgiJXM6IHVzYkNhbUluaXREZWZhdWx0UGFyYW1ldGVycyBlcnJvciIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKyNpZiBDQVBUVVJFCisKKyAgICBkZXZfbmFtZSA9IGNhbUhhbC0+ZGV2X25hbWU7CisKKyAgICByYyA9IGdldF91dmNfZGV2aWNlKGRldl9uYW1lKTsKKyAgICBpZihyYyB8fCAqZGV2X25hbWUgPT0gJ1wwJyl7CisgICAgICAgIEFMT0dFKCIlczogTm8gVVZDIG5vZGUgZm91bmQgXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBjYW1IYWwtPmZkID0gb3BlbihkZXZfbmFtZSwgT19SRFdSIC8qIHJlcXVpcmVkICovIHwgT19OT05CTE9DSywgMCk7CisKKyAgICBpZiAoY2FtSGFsLT5mZCA8ICAwKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IG9wZW4gJyVzJyIsIF9fZnVuY19fLCBkZXZfbmFtZSk7CisgICAgICAgIGZyZWUoY2FtSGFsKTsKKyAgICAgICAgcmMgPSAtMTsKKyAgICB9ZWxzZXsKKyAgICAgICAgcmMgPSAwOworICAgIH0KKworI2Vsc2UgLyogQ0FQVFVSRSAqLworICAgIHJjID0gMDsKKyNlbmRpZiAvKiBDQVBUVVJFICovCisKKyAgICBkZXZpY2UgICAgICAgICAgICAgICAgICA9ICZjYW1IYWwtPmh3X2RldjsKKyAgICBkZXZpY2UtPmNvbW1vbi5jbG9zZSAgICA9IHVzYmNhbV9jbG9zZV9jYW1lcmFfZGV2aWNlOworICAgIGRldmljZS0+b3BzICAgICAgICAgICAgID0gJnVzYmNhbV9jYW1lcmFfb3BzOworICAgIGRldmljZS0+cHJpdiAgICAgICAgICAgID0gKHZvaWQgKiljYW1IYWw7CisgICAgKmh3X2RldmljZSAgICAgICAgICAgICAgPSAmKGRldmljZS0+Y29tbW9uKTsKKworICAgIEFMT0dEKCIlczogY2FtSGFsOiAlcCIsIF9fZnVuY19fLCBjYW1IYWwpOworICAgIEFMT0dJKCIlczogWCAlZCIsIF9fZnVuY19fLCByYyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKK2V4dGVybiAiQyIgIGludCB1c2JjYW1fY2xvc2VfY2FtZXJhX2RldmljZSggaHdfZGV2aWNlX3QgKmh3X2RldikKK3sKKyAgICBBTE9HSSgiJXM6IGRldmljZSA9JXAgRSIsIF9fZnVuY19fLCBod19kZXYpOworICAgIGludCByYyA9ICAtMTsKKyAgICBjYW1lcmFfZGV2aWNlX3QgKmRldmljZSAgICAgPSAoY2FtZXJhX2RldmljZV90ICopaHdfZGV2OworCisgICAgaWYoZGV2aWNlKSB7CisgICAgICAgIGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWwgICA9IChjYW1lcmFfaGFyZHdhcmVfdCAqKWRldmljZS0+cHJpdjsKKyAgICAgICAgaWYoY2FtSGFsKSB7CisgICAgICAgICAgICByYyA9IGNsb3NlKGNhbUhhbC0+ZmQpOworICAgICAgICAgICAgaWYocmMgPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjbG9zZSBmYWlsZWQgIiwgX19mdW5jX18pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FtSGFsLT5mZCA9IDA7CisgICAgICAgICAgICBkZWxldGUgY2FtSGFsOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbUhhbCBpcyBOVUxMIHBvaW50ZXIgIiwgX19mdW5jX18pOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dJKCIlczogWCBkZXZpY2UgPSVwLCByYyA9ICVkIiwgX19mdW5jX18sIGh3X2RldiwgcmMpOworICAgIHJldHVybiByYzsKK30KKworaW50IHVzYmNhbV9zZXRfcHJldmlld193aW5kb3coc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UsCisgICAgICAgIHN0cnVjdCBwcmV2aWV3X3N0cmVhbV9vcHMgKndpbmRvdykKK3sKKyAgICBBTE9HSSgiJXM6IEUiLCBfX2Z1bmNfXyk7CisgICAgaW50IHJjID0gMDsKKyAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsOworCisgICAgVkFMSURBVEVfREVWSUNFX0hETChjYW1IYWwsIGRldmljZSwgLTEpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhjYW1IYWwtPmxvY2spOworCisgICAgLyogaWYgd2luZG93IGlzIGFscmVhZHkgc2V0LCB0aGVuIGRlLWluaXQgcHJldmlvdXMgYnVmZmVycyAqLworICAgIGlmKGNhbUhhbC0+d2luZG93KXsKKyAgICAgICAgcmMgPSBkZUluaXREaXNwbGF5QnVmZmVycyhjYW1IYWwpOworICAgICAgICBpZihyYyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogZGVJbml0RGlzcGxheUJ1ZmZlcnMgcmV0dXJuZWQgZXJyb3IiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2FtSGFsLT53aW5kb3cgPSB3aW5kb3c7CisKKyAgICBpZihjYW1IYWwtPndpbmRvdyl7CisgICAgICAgIHJjID0gaW5pdERpc3BsYXlCdWZmZXJzKGNhbUhhbCk7CisgICAgICAgIGlmKHJjIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBpbml0RGlzcGxheUJ1ZmZlcnMgcmV0dXJuZWQgZXJyb3IiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0koIiVzOiBYLiByYyA9ICVkIiwgX19mdW5jX18sIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK3ZvaWQgdXNiY2FtX3NldF9DYWxsQmFja3Moc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UsCisgICAgICAgIGNhbWVyYV9ub3RpZnlfY2FsbGJhY2sgbm90aWZ5X2NiLAorICAgICAgICBjYW1lcmFfZGF0YV9jYWxsYmFjayBkYXRhX2NiLAorICAgICAgICBjYW1lcmFfZGF0YV90aW1lc3RhbXBfY2FsbGJhY2sgZGF0YV9jYl90aW1lc3RhbXAsCisgICAgICAgIGNhbWVyYV9yZXF1ZXN0X21lbW9yeSBnZXRfbWVtb3J5LAorICAgICAgICB2b2lkICp1c2VyKQoreworICAgIEFMT0dJKCIlczogRSIsIF9fZnVuY19fKTsKKyAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsOworCisgICAgaWYoZGV2aWNlICYmIGRldmljZS0+cHJpdil7CisgICAgICAgIGNhbUhhbCA9IChjYW1lcmFfaGFyZHdhcmVfdCAqKWRldmljZS0+cHJpdjsKKyAgICB9ZWxzZXsKKyAgICAgICAgQUxPR0UoIiVzOiBOdWxsIGRldmljZSBvciBkZXZpY2UtPnByaXYiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soY2FtSGFsLT5sb2NrKTsKKworICAgIGNhbUhhbC0+bm90aWZ5X2NiICAgICAgICAgICA9IG5vdGlmeV9jYjsKKyAgICBjYW1IYWwtPmRhdGFfY2IgICAgICAgICAgICAgPSBkYXRhX2NiOworICAgIGNhbUhhbC0+ZGF0YV9jYl90aW1lc3RhbXAgICA9IGRhdGFfY2JfdGltZXN0YW1wOworICAgIGNhbUhhbC0+Z2V0X21lbW9yeSAgICAgICAgICA9IGdldF9tZW1vcnk7CisgICAgY2FtSGFsLT5jYl9jdHh0ICAgICAgICAgICAgID0gdXNlcjsKKworICAgIEFMT0dJKCIlczogWCIsIF9fZnVuY19fKTsKK30KKwordm9pZCB1c2JjYW1fZW5hYmxlX21zZ190eXBlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlLCBpbnQzMl90IG1zZ190eXBlKQoreworICAgIEFMT0dJKCIlczogRSIsIF9fZnVuY19fKTsKKyAgICBBTE9HSSgiJXM6IG1zZ190eXBlOiAlZCIsIF9fZnVuY19fLCBtc2dfdHlwZSk7CisKKyAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsOworCisgICAgaWYoZGV2aWNlICYmIGRldmljZS0+cHJpdil7CisgICAgICAgIGNhbUhhbCA9IChjYW1lcmFfaGFyZHdhcmVfdCAqKWRldmljZS0+cHJpdjsKKyAgICB9ZWxzZXsKKyAgICAgICAgQUxPR0UoIiVzOiBOdWxsIGRldmljZSBvciBkZXZpY2UtPnByaXYiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soY2FtSGFsLT5sb2NrKTsKKworICAgIGNhbUhhbC0+bXNnRW5hYmxlZEZsYWcgfD0gbXNnX3R5cGU7CisKKyAgICBBTE9HSSgiJXM6IFgiLCBfX2Z1bmNfXyk7Cit9CisKK3ZvaWQgdXNiY2FtX2Rpc2FibGVfbXNnX3R5cGUoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UsIGludDMyX3QgbXNnX3R5cGUpCit7CisgICAgQUxPR0koIiVzOiBFIiwgX19mdW5jX18pOworICAgIEFMT0dJKCIlczogbXNnX3R5cGU6ICVkIiwgX19mdW5jX18sIG1zZ190eXBlKTsKKworICAgIGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWw7CisgICAgaWYoZGV2aWNlICYmIGRldmljZS0+cHJpdil7CisgICAgICAgIGNhbUhhbCA9IChjYW1lcmFfaGFyZHdhcmVfdCAqKWRldmljZS0+cHJpdjsKKyAgICB9ZWxzZXsKKyAgICAgICAgQUxPR0UoIiVzOiBOdWxsIGRldmljZSBvciBkZXZpY2UtPnByaXYiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soY2FtSGFsLT5sb2NrKTsKKworICAgIGNhbUhhbC0+bXNnRW5hYmxlZEZsYWcgJj0gfm1zZ190eXBlOworCisgICAgQUxPR0koIiVzOiBYIiwgX19mdW5jX18pOworfQorCitpbnQgdXNiY2FtX21zZ190eXBlX2VuYWJsZWQoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UsIGludDMyX3QgbXNnX3R5cGUpCit7CisgICAgQUxPR0koIiVzOiBFIiwgX19mdW5jX18pOworCisgICAgY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbDsKKyAgICBpZihkZXZpY2UgJiYgZGV2aWNlLT5wcml2KXsKKyAgICAgICAgY2FtSGFsID0gKGNhbWVyYV9oYXJkd2FyZV90ICopZGV2aWNlLT5wcml2OworICAgIH1lbHNleworICAgICAgICBBTE9HRSgiJXM6IE51bGwgZGV2aWNlIG9yIGRldmljZS0+cHJpdiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhjYW1IYWwtPmxvY2spOworCisgICAgQUxPR0koIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiAoY2FtSGFsLT5tc2dFbmFibGVkRmxhZyAmIG1zZ190eXBlKTsKK30KKworaW50IHVzYmNhbV9zdGFydF9wcmV2aWV3KHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIEFMT0dJKCIlczogRSIsIF9fZnVuY19fKTsKKworICAgIGludCByYyA9IC0xOworICAgIGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWwgPSBOVUxMOworCisgICAgVkFMSURBVEVfREVWSUNFX0hETChjYW1IYWwsIGRldmljZSwgLTEpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhjYW1IYWwtPmxvY2spOworCisgICAgLyogSWYgcHJlaXZldyBpcyBhbHJlYWR5IHJ1bm5pbmcsIG5vdGhpbmcgdG8gYmUgZG9uZSAqLworICAgIGlmKGNhbUhhbC0+cHJldmlld0VuYWJsZWRGbGFnKXsKKyAgICAgICAgQUxPR0koIiVzOiBQcmV2aWV3IGlzIGFscmVhZHkgcnVubmluZyIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisjaWYgQ0FQVFVSRQorICAgIHJjID0gaW5pdFVzYkNhbWVyYShjYW1IYWwsIGNhbUhhbC0+cHJldldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtSGFsLT5wcmV2SGVpZ2h0LCBnZXRQcmV2aWV3Q2FwdHVyZUZtdChjYW1IYWwpKTsKKyAgICBpZihyYyA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW50aWFsaXplIHRoZSBkZXZpY2UiLCBfX2Z1bmNfXyk7CisgICAgfWVsc2V7CisgICAgICAgIHJjID0gc3RhcnRVc2JDYW1DYXB0dXJlKGNhbUhhbCk7CisgICAgICAgIGlmKHJjIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc3RhcnRVc2JDYW1DYXB0dXJlIiwgX19mdW5jX18pOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHJjID0gbGF1bmNoX3ByZXZpZXdfdGhyZWFkKGNhbUhhbCk7CisgICAgICAgICAgICBpZihyYyA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBsYXVuY2hfcHJldmlld190aHJlYWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZWxzZSAvKiBDQVBUVVJFICovCisgICAgcmMgPSBsYXVuY2hfcHJldmlld190aHJlYWQoY2FtSGFsKTsKKyAgICBpZihyYyA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbGF1bmNoX3ByZXZpZXdfdGhyZWFkIiwgX19mdW5jX18pOworICAgIH0KKyNlbmRpZiAvKiBDQVBUVVJFICovCisgICAgLyogaWYgbm8gZXJyb3JzLCB0aGVuIHNldCB0aGUgZmxhZyAqLworICAgIGlmKCFyYykKKyAgICAgICAgY2FtSGFsLT5wcmV2aWV3RW5hYmxlZEZsYWcgPSAxOworCisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiByYzsKK30KKwordm9pZCB1c2JjYW1fc3RvcF9wcmV2aWV3KHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIEFMT0dEKCIlczogRSIsIF9fZnVuY19fKTsKKworICAgIGludCByYyA9IDA7CisgICAgY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbDsKKworICAgIGlmKGRldmljZSAmJiBkZXZpY2UtPnByaXYpeworICAgICAgICBjYW1IYWwgPSAoY2FtZXJhX2hhcmR3YXJlX3QgKilkZXZpY2UtPnByaXY7CisgICAgfWVsc2V7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBkZXZpY2Ugb3IgZGV2aWNlLT5wcml2IiwgX19mdW5jX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGNhbUhhbC0+bG9jayk7CisKKyAgICByYyA9IHN0b3BQcmV2aWV3SW50ZXJuYWwoY2FtSGFsKTsKKyAgICBpZihyYykKKyAgICAgICAgQUxPR0UoIiVzOiBzdG9wUHJldmlld0ludGVybmFsIHJldHVybmVkIGVycm9yIiwgX19mdW5jX18pOworCisgICAgQUxPR0koIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybjsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGlzX3ByZXZpZXdfZW5hYmxlZCAqLworaW50IHVzYmNhbV9wcmV2aWV3X2VuYWJsZWQoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisgICAgQUxPR0koIiVzOiBFIiwgX19mdW5jX18pOworICAgIGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWw7CisKKyAgICBpZihkZXZpY2UgJiYgZGV2aWNlLT5wcml2KXsKKyAgICAgICAgY2FtSGFsID0gKGNhbWVyYV9oYXJkd2FyZV90ICopZGV2aWNlLT5wcml2OworICAgIH1lbHNleworICAgICAgICBBTE9HRSgiJXM6IE51bGwgZGV2aWNlIG9yIGRldmljZS0+cHJpdiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soY2FtSGFsLT5sb2NrKTsKKworICAgIEFMT0dJKCIlczogWCIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gY2FtSGFsLT5wcmV2aWV3RW5hYmxlZEZsYWc7Cit9CisKKy8qIFRCRCAqLworaW50IHVzYmNhbV9zdG9yZV9tZXRhX2RhdGFfaW5fYnVmZmVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSwgaW50IGVuYWJsZSkKK3sKKyAgICBBTE9HSSgiJXM6IEUiLCBfX2Z1bmNfXyk7CisgICAgaW50IHJjID0gMDsKKworICAgIEFMT0dJKCIlczogWCIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFRCRCAqLworaW50IHVzYmNhbV9zdGFydF9yZWNvcmRpbmcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisgICAgaW50IHJjID0gMDsKKyAgICBBTE9HRCgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICBBTE9HRCgiJXM6IFgiLCBfX2Z1bmNfXyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFRCRCAqLwordm9pZCB1c2JjYW1fc3RvcF9yZWNvcmRpbmcoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisgICAgQUxPR0QoIiVzOiBFIiwgX19mdW5jX18pOworCisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworfQorCisvKiBUQkQgKi8KK2ludCB1c2JjYW1fcmVjb3JkaW5nX2VuYWJsZWQoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisgICAgaW50IHJjID0gMDsKKyAgICBBTE9HRCgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICBBTE9HRCgiJXM6IFgiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKiBUQkQgKi8KK3ZvaWQgdXNiY2FtX3JlbGVhc2VfcmVjb3JkaW5nX2ZyYW1lKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm9wYXF1ZSkKK3sKKyAgICBBTE9HVigiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICBBTE9HRCgiJXM6IFgiLCBfX2Z1bmNfXyk7Cit9CisKKy8qIFRCRCAqLworaW50IHVzYmNhbV9hdXRvX2ZvY3VzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIEFMT0dEKCIlczogRSIsIF9fZnVuY19fKTsKKyAgICBpbnQgcmMgPSAwOworCisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiByYzsKK30KKworLyogVEJEICovCitpbnQgdXNiY2FtX2NhbmNlbF9hdXRvX2ZvY3VzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIGludCByYyA9IDA7CisgICAgQUxPR0QoIiVzOiBFIiwgX19mdW5jX18pOworCisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiByYzsKK30KKworaW50IHVzYmNhbV90YWtlX3BpY3R1cmUoc3RydWN0IGNhbWVyYV9kZXZpY2UgKiBkZXZpY2UpCit7CisgICAgQUxPR0koIiVzOiBFIiwgX19mdW5jX18pOworICAgIGludCByYyA9IDA7CisgICAgY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbDsKKworICAgIFZBTElEQVRFX0RFVklDRV9IREwoY2FtSGFsLCBkZXZpY2UsIC0xKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhjYW1IYWwtPmxvY2spOworCisgICAgLyogSWYgdGFrZSBwaWN0dXJlIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MsIG5vdGhpbmcgdCBiZSBkb25lICovCisgICAgaWYoY2FtSGFsLT50YWtlUGljdEluUHJvZ3Jlc3MpeworICAgICAgICBBTE9HSSgiJXM6IFRha2UgcGljdHVyZSBhbHJlYWR5IGluIHByb2dyZXNzIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZihjYW1IYWwtPnByZXZpZXdFbmFibGVkRmxhZykKKyAgICB7CisgICAgICAgIHJjID0gc3RvcFByZXZpZXdJbnRlcm5hbChjYW1IYWwpOworICAgICAgICBpZihyYyl7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHN0b3BQcmV2aWV3SW50ZXJuYWwgcmV0dXJuZWQgZXJyb3IiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICAgICAgVVNCX0NBTV9DTE9TRShjYW1IYWwpOworICAgICAgICBjYW1IYWwtPnBydndTdG9wcGVkRm9yUGljdHVyZSA9IDE7CisgICAgfQorICAgIC8qIFRCRDogTmVlZCB0byBoYW5kbGUgYW55IGRlcGVuZGVuY2llcyBvbiB2aWRlbyByZWNvcmRpbmcgc3RhdGUgKi8KKyAgICByYyA9IGxhdW5jaFRha2VQaWN0dXJlVGhyZWFkKGNhbUhhbCk7CisgICAgaWYocmMpCisgICAgICAgIEFMT0dFKCIlczogbGF1bmNoVGFrZVBpY3R1cmVUaHJlYWQgZXJyb3IiLCBfX2Z1bmNfXyk7CisKKyNpZiAwCisgICAgLyogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXF1ZXN0cyBwcmV2aWV3IHRocmVhZCB0byB0YWtlIHBpY3R1cmUgKi8KKyAgICBpZihjYW1IYWwtPnByZXZpZXdFbmFibGVkRmxhZykKKyAgICB7CisgICAgICAgIGNhbUhhbC0+cHJ2d0NtZFBlbmRpbmcrKzsKKyAgICAgICAgY2FtSGFsLT5wcnZ3Q21kICAgICAgICAgPSBVU0JfQ0FNX1BSRVZJRVdfVEFLRVBJQzsKKyAgICAgICAgQUxPR0QoIiVzOiBUYWtlIHBpY3R1cmUgY29tbWFuZCBzZXQgIiwgX19mdW5jX18pOworICAgIH1lbHNleworICAgICAgICBBTE9HRSgiJXM6IFRha2UgcGljdHVyZSB3aXRob3V0IHByZXZpZXcgc3RhcnRlZCEiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJjID0gLTE7CisgICAgfQorI2VuZGlmCisKKyAgICBpZighcmMpCisgICAgICAgIGNhbUhhbC0+dGFrZVBpY3RJblByb2dyZXNzID0gMTsKKworICAgIEFMT0dJKCIlczogWCIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIFRCRCAqLworaW50IHVzYmNhbV9jYW5jZWxfcGljdHVyZShzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSkKKworeworICAgIEFMT0dJKCIlczogRSIsIF9fZnVuY19fKTsKKyAgICBpbnQgcmMgPSAwOworCisgICAgQUxPR0koIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiByYzsKK30KKworaW50IHVzYmNhbV9zZXRfcGFyYW1ldGVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSwgY29uc3QgY2hhciAqcGFyYW1zKQorCit7CisgICAgQUxPR0koIiVzOiBFIiwgX19mdW5jX18pOworICAgIGludCByYyA9IDA7CisgICAgY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbDsKKworICAgIFZBTElEQVRFX0RFVklDRV9IREwoY2FtSGFsLCBkZXZpY2UsIC0xKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhjYW1IYWwtPmxvY2spOworCisgICAgcmMgPSB1c2JDYW1TZXRQYXJhbWV0ZXJzKGNhbUhhbCwgcGFyYW1zKTsKKworICAgIEFMT0dJKCIlczogWCIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2NoYXIqIHVzYmNhbV9nZXRfcGFyYW1ldGVycyhzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSkKK3sKKyAgICBjaGFyICpwYXJtczsKKyAgICBBTE9HSSgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsOworICAgIFZBTElEQVRFX0RFVklDRV9IREwoY2FtSGFsLCBkZXZpY2UsIE5VTEwpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGNhbUhhbC0+bG9jayk7CisKKyAgICBwYXJtcyA9IHVzYkNhbUdldFBhcmFtZXRlcnMoY2FtSGFsKTsKKworICAgIEFMT0dJKCIlczogWCIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gcGFybXM7Cit9CisKK3ZvaWQgdXNiY2FtX3B1dF9wYXJhbWV0ZXJzKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlLCBjaGFyICpwYXJtKQorCit7CisgICAgQUxPR0koIiVzOiBFIiwgX19mdW5jX18pOworCisgICAgY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbDsKKworICAgIGlmKGRldmljZSAmJiBkZXZpY2UtPnByaXYpeworICAgICAgICBjYW1IYWwgPSAoY2FtZXJhX2hhcmR3YXJlX3QgKilkZXZpY2UtPnByaXY7CisgICAgfWVsc2V7CisgICAgICAgIEFMT0dFKCIlczogTnVsbCBkZXZpY2Ugb3IgZGV2aWNlLT5wcml2IiwgX19mdW5jX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdXNiQ2FtUHV0UGFyYW1ldGVycyhjYW1IYWwsIHBhcm0pOworCisgICAgQUxPR0koIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybjsKK30KKworLyogVEJEICovCitpbnQgdXNiY2FtX3NlbmRfY29tbWFuZChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSwKKyAgICAgICAgICAgIGludDMyX3QgY21kLCBpbnQzMl90IGFyZzEsIGludDMyX3QgYXJnMikKK3sKKyAgICBpbnQgcmMgPSAwOworICAgIEFMT0dJKCIlczogRSIsIF9fZnVuY19fKTsKKyAgICBBTE9HSSgiJWQiLCBjbWQpOworCisgICAgQUxPR0koIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiByYzsKK30KKworLyogVEJEICovCit2b2lkIHVzYmNhbV9yZWxlYXNlKHN0cnVjdCBjYW1lcmFfZGV2aWNlICogZGV2aWNlKQoreworICAgIEFMT0dJKCIlczogRSIsIF9fZnVuY19fKTsKKyNpZiAwCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwoJm1Mb2NrKTsKKworICAgIHN3aXRjaChtUHJldmlld1N0YXRlKSB7CisgICAgY2FzZSBRQ0FNRVJBX0hBTF9QUkVWSUVXX1NUT1BQRUQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUNBTUVSQV9IQUxfUFJFVklFV19TVEFSVDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRQ0FNRVJBX0hBTF9QUkVWSUVXX1NUQVJURUQ6CisgICAgICAgIHN0b3BQcmV2aWV3SW50ZXJuYWwoKTsKKyAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfSEFMX1JFQ09SRElOR19TVEFSVEVEOgorICAgICAgICBzdG9wUmVjb3JkaW5nSW50ZXJuYWwoKTsKKyAgICAgICAgc3RvcFByZXZpZXdJbnRlcm5hbCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFDQU1FUkFfSEFMX1RBS0VfUElDVFVSRToKKyAgICAgICAgY2FuY2VsUGljdHVyZUludGVybmFsKCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtUHJldmlld1N0YXRlID0gUUNBTUVSQV9IQUxfUFJFVklFV19TVE9QUEVEOworI2VuZGlmCisgICAgQUxPR0koIiVzOiBYIiwgX19mdW5jX18pOworfQorCisvKiBUQkQgKi8KK2ludCB1c2JjYW1fZHVtcChzdHJ1Y3QgY2FtZXJhX2RldmljZSAqIGRldmljZSwgaW50IGZkKQoreworICAgIEFMT0dJKCIlczogRSIsIF9fZnVuY19fKTsKKyAgICBpbnQgcmMgPSAwOworCisgICAgQUxPR0koIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiByYzsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgU3RhdGljIGZ1bmN0aW9uIGRlZmluaXRpb25zIGJlbG93CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5vIGluIHBsYWNlIGNvbnZlcnNpb24gc3VwcG9ydGVkLiBPdXRwdXQgYnVmZmVyIGFuZCBpbnB1dCBNVVNUIHNob3VsZCBiZSAgICovCisvKiBkaWZmZXJlbnQgaW5wdXQgYnVmZmVyIGZvciBhIDR4NCBwaXhlbCB2aWRlbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLworLyoqKioqKiAgICAgICAgICAgICAgICAgIFlVWVZZVVlWICAgICAgICAgIDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3ICoqKioqKioqKioqKi8KKy8qKioqKiogICAgICAgICAgICAgICAgICBZVVlWWVVZViAgICAgICAgICAwOCAwOSAxMCAxMSAxMiAxMyAxNCAxNSAqKioqKioqKioqKiovCisvKioqKioqICAgICAgICAgICAgICAgICAgWVVZVllVWVYgICAgICAgICAgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgKioqKioqKioqKioqLworLyoqKioqKiAgICAgICAgICAgICAgICAgIFlVWVZZVVlWICAgICAgICAgIDI0IDI1IDI2IDI3IDI4IDI5IDMwIDMxICoqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFlZWVkgICAgICAgICAgICAwMCAwMiAwNCAwNiAgICAgICAgICAgICoqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBZWVlZICAgICAgICAgICAgMDggMTAgMTIgMTQgICAgICAgICAgICAqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogWVlZWSAgICAgICAgICAgIDE2IDE4IDIwIDIyICAgICAgICAgICAgKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFlZWVkgICAgICAgICAgICAyNCAyNiAyOCAzMCAgICAgICAgICAgICoqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBWVVZVICAgICAgICAgICAgMDMgMDEgMDcgMDUgICAgICAgICAgICAqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogVlVWVSAgICAgICAgICAgIDE5IDE3IDIzIDIxICAgICAgICAgICAgKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBjb252ZXJ0X1lVWVZfdG9fNDIwX05WMTIoY2hhciAqaW5fYnVmLCBjaGFyICpvdXRfYnVmLCBpbnQgd2QsIGludCBodCkKK3sKKyAgICBpbnQgcmMgPTA7CisgICAgaW50IHJvdywgY29sLCB1dl9yb3c7CisKKyAgICBBTE9HRCgiJXM6IEUiLCBfX2Z1bmNfXyk7CisgICAgLyogQXJyYW5nZSBZICovCisgICAgZm9yKHJvdyA9IDA7IHJvdyA8IGh0OyByb3crKykKKyAgICAgICAgZm9yKGNvbCA9IDA7IGNvbCA8IHdkICogMjsgY29sICs9IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dF9idWZbcm93ICogd2QgKyBjb2wgLyAyXSA9IGluX2J1Zltyb3cgKiB3ZCAqIDIgKyBjb2xdOworICAgICAgICB9CisKKyAgICAvKiBBcnJhbmdlIFVWICovCisgICAgZm9yKHJvdyA9IDAsIHV2X3JvdyA9IGh0OyByb3cgPCBodDsgcm93ICs9IDIsIHV2X3JvdysrKQorICAgICAgICBmb3IoY29sID0gMTsgY29sIDwgd2QgKiAyOyBjb2wgKz0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0X2J1Zlt1dl9yb3cgKiB3ZCArIGNvbCAvIDJdPSBpbl9idWZbcm93ICogd2QgKiAyICsgY29sICsgMl07CisgICAgICAgICAgICBvdXRfYnVmW3V2X3JvdyAqIHdkICsgY29sIC8gMiArIDFdICA9IGluX2J1Zltyb3cgKiB3ZCAqIDIgKyBjb2xdOworICAgICAgICB9CisKKyAgICBBTE9HRCgiJXM6IFgiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogaW5pdERpc3BsYXlCdWZmZXJzCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgcHJldmlldyBidWZmZXJzCisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICAgY2FtSGFsICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgICAgMCAgIFN1Y2Nlc3MKKyAqICAgICAgLTEgIEVycm9yCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBpbml0RGlzcGxheUJ1ZmZlcnMoY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbCkKK3sKKyAgICBwcmV2aWV3X3N0cmVhbV9vcHMgICAgKm1QcmV2aWV3V2luZG93OworICAgIHN0cnVjdCBpb25fZmRfZGF0YSAgICBpb25faW5mb19mZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgbnVtTWluVW5kZXF1ZXVlZEJ1ZnMgPSAwOworICAgIGludCAgICAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIGdyYWxsb2NfdXNhZ2UgPSAwOworICAgIGludCAgICAgICAgICAgICAgICAgICBlcnI7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIGNvbG9yPTMwOworCisgICAgQUxPR0QoIiVzOiBFIiwgX19mdW5jX18pOworCisjaWYgRElTUExBWQorICAgIGlmKGNhbUhhbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogY2FtSGFsID0gTlVMTCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1QcmV2aWV3V2luZG93ID0gY2FtSGFsLT53aW5kb3c7CisgICAgaWYoIW1QcmV2aWV3V2luZG93KSB7CisgICAgICAgIEFMT0dFKCIlczogbVByZXZpZXdXaW5kb3cgPSBOVUxMIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIGdldF9taW5fdW5kZXF1ZXVlZF9idWZmZXJfY291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0gc2V0X2J1ZmZlcl9jb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBzZXRfYnVmZmVyc19nZW9tZXRyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtIHNldF91c2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0gZGVxdWV1ZSBhbGwgdGhlIGRpc3BsYXkgYnVmZmVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBjYW5jZWwgYnVmZmVyczogcmVsZWFzZSB3L28gZGlzcGxheWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIGdldF9taW5fdW5kZXF1ZXVlZF9idWZmZXJfY291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYobVByZXZpZXdXaW5kb3ctPmdldF9taW5fdW5kZXF1ZXVlZF9idWZmZXJfY291bnQpIHsKKyAgICAgICAgcmMgPSBtUHJldmlld1dpbmRvdy0+Z2V0X21pbl91bmRlcXVldWVkX2J1ZmZlcl9jb3VudCgKKyAgICAgICAgICAgIG1QcmV2aWV3V2luZG93LCAmbnVtTWluVW5kZXF1ZXVlZEJ1ZnMpOworICAgICAgICBpZiAoMCAhPSByYykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBnZXRfbWluX3VuZGVxdWV1ZWRfYnVmZmVyX2NvdW50IHJldHVybmVkIGVycm9yIiwgX19mdW5jX18pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFMT0dEKCIlczogZ2V0X21pbl91bmRlcXVldWVkX2J1ZmZlcl9jb3VudCByZXR1cm5lZDogJWQgIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBudW1NaW5VbmRlcXVldWVkQnVmcyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQUxPR0UoIiVzOiBnZXRfbWluX3VuZGVxdWV1ZWRfYnVmZmVyX2NvdW50IGlzIE5VTEwgcG9pbnRlciIsIF9fZnVuY19fKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogLSBzZXRfYnVmZmVyX2NvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmKG1QcmV2aWV3V2luZG93LT5zZXRfYnVmZmVyX2NvdW50KSB7CisgICAgICAgIGNhbUhhbC0+cHJldmlld01lbS5idWZmZXJfY291bnQgPSBudW1NaW5VbmRlcXVldWVkQnVmcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFBSVldfRElTUF9CVUZfQ05UOworICAgICAgICByYyA9IG1QcmV2aWV3V2luZG93LT5zZXRfYnVmZmVyX2NvdW50KAorICAgICAgICAgICAgbVByZXZpZXdXaW5kb3csCisgICAgICAgICAgICBjYW1IYWwtPnByZXZpZXdNZW0uYnVmZmVyX2NvdW50KTsKKyAgICAgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0X2J1ZmZlcl9jb3VudCByZXR1cm5lZCBlcnJvciIsIF9fZnVuY19fKTsKKyAgICAgICAgfWVsc2UKKyAgICAgICAgICAgIEFMT0dEKCIlczogc2V0X2J1ZmZlcl9jb3VudCByZXR1cm5lZCBzdWNjZXNzIiwgX19mdW5jX18pOworICAgIH1lbHNlCisgICAgICAgIEFMT0dFKCIlczogc2V0X2J1ZmZlcl9jb3VudCBpcyBOVUxMIHBvaW50ZXIiLCBfX2Z1bmNfXyk7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gc2V0X2J1ZmZlcnNfZ2VvbWV0cnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZihtUHJldmlld1dpbmRvdy0+c2V0X2J1ZmZlcnNfZ2VvbWV0cnkpIHsKKyAgICAgICAgcmMgPSBtUHJldmlld1dpbmRvdy0+c2V0X2J1ZmZlcnNfZ2VvbWV0cnkobVByZXZpZXdXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1IYWwtPmRpc3BXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbUhhbC0+ZGlzcEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbUhhbC0+ZGlzcEZvcm1hdCk7CisgICAgICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldF9idWZmZXJzX2dlb21ldHJ5IHJldHVybmVkIGVycm9yLiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlcnJvcigtcmMpLCAtcmMpOworICAgICAgICB9ZWxzZQorICAgICAgICAgICAgQUxPR0QoIiVzOiBzZXRfYnVmZmVyc19nZW9tZXRyeSByZXR1cm5lZCBzdWNjZXNzIiwgX19mdW5jX18pOworICAgIH1lbHNlCisgICAgICAgIEFMT0dFKCIlczogc2V0X2J1ZmZlcnNfZ2VvbWV0cnkgaXMgTlVMTCBwb2ludGVyIiwgX19mdW5jX18pOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIHNldF91c2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgZ3JhbGxvY191c2FnZSA9IENBTUVSQV9HUkFMTE9DX0hFQVBfSUQgfCBDQU1FUkFfR1JBTExPQ19GQUxMQkFDS19IRUFQX0lEIHwKKyAgICAgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9QUklWQVRFX1VOQ0FDSEVEOworCisgICAgaWYobVByZXZpZXdXaW5kb3ctPnNldF91c2FnZSkgeworICAgICAgICByYyA9IG1QcmV2aWV3V2luZG93LT5zZXRfdXNhZ2UobVByZXZpZXdXaW5kb3csIGdyYWxsb2NfdXNhZ2UpOworICAgICAgICBpZiAocmMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXRfdXNhZ2UgcmV0dXJuZWQgZXJyb3IiLCBfX2Z1bmNfXyk7CisgICAgICAgIH1lbHNlCisgICAgICAgICAgICBBTE9HRCgiJXM6IHNldF91c2FnZSByZXR1cm5lZCBzdWNjZXNzIiwgX19mdW5jX18pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIEFMT0dFKCIlczogc2V0X3VzYWdlIGlzIE5VTEwgcG9pbnRlciIsIF9fZnVuY19fKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogLSBkZXF1ZXVlIGFsbCB0aGUgZGlzcGxheSBidWZmZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGZvciAoaW50IGNudCA9IDA7IGNudCA8IGNhbUhhbC0+cHJldmlld01lbS5idWZmZXJfY291bnQ7IGNudCsrKSB7CisgICAgICAgIGludCBzdHJpZGU7CisgICAgICAgIGVyciA9IG1QcmV2aWV3V2luZG93LT5kZXF1ZXVlX2J1ZmZlcigKKyAgICAgICAgICAgICAgICBtUHJldmlld1dpbmRvdywKKyAgICAgICAgICAgICAgICAmY2FtSGFsLT5wcmV2aWV3TWVtLmJ1ZmZlcl9oYW5kbGVbY250XSwKKyAgICAgICAgICAgICAgICAmY2FtSGFsLT5wcmV2aWV3TWVtLnN0cmlkZVtjbnRdKTsKKyAgICAgICAgaWYoIWVycikgeworICAgICAgICAgICAgQUxPR0QoIiVzOiBkZXF1ZXVlIGJ1ZjogJXBcbiIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjYW1IYWwtPnByZXZpZXdNZW0uYnVmZmVyX2hhbmRsZVtjbnRdKTsKKworICAgICAgICAgICAgaWYobVByZXZpZXdXaW5kb3ctPmxvY2tfYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVByZXZpZXdXaW5kb3ctPmxvY2tfYnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBtUHJldmlld1dpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgY2FtSGFsLT5wcmV2aWV3TWVtLmJ1ZmZlcl9oYW5kbGVbY250XSk7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiBtUHJldmlld1dpbmRvdy0+bG9ja19idWZmZXIgc3VjY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxvY2sgdGhlIGJ1ZmZlciB1c2luZyBnZW5sb2NrCisgICAgICAgICAgICBBTE9HRCgiJXM6IGNhbWVyYSBjYWxsIGdlbmxvY2tfbG9jaywgaGRsPSVwIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKCpjYW1IYWwtPnByZXZpZXdNZW0uYnVmZmVyX2hhbmRsZVtjbnRdKSk7CisKKyAgICAgICAgICAgIGlmIChHRU5MT0NLX05PX0VSUk9SICE9CisgICAgICAgICAgICAgICAgZ2VubG9ja19sb2NrX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgKG5hdGl2ZV9oYW5kbGVfdCAqKSAoKmNhbUhhbC0+cHJldmlld01lbS5idWZmZXJfaGFuZGxlW2NudF0pLAorICAgICAgICAgICAgICAgICAgICBHRU5MT0NLX1dSSVRFX0xPQ0ssIEdFTkxPQ0tfTUFYX1RJTUVPVVQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZ2VubG9ja19sb2NrX2J1ZmZlcihXUklURSkgZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOworICAgICAgICAgICAgICAgIGNhbUhhbC0+cHJldmlld01lbS5sb2NhbF9mbGFnW2NudF0gPSBCVUZGRVJfVU5MT0NLRUQ7CisgICAgICAgICAgICB9ZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiBnZW5sb2NrX2xvY2tfYnVmZmVyIGhkbCA9JXAiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sICpjYW1IYWwtPnByZXZpZXdNZW0uYnVmZmVyX2hhbmRsZVtjbnRdKTsKKyAgICAgICAgICAgICAgICBjYW1IYWwtPnByZXZpZXdNZW0ubG9jYWxfZmxhZ1tjbnRdID0gQlVGRkVSX0xPQ0tFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU3RvcmUgdGhpcyBidWZmZXIgZGV0YWlscyBpbiB0aGUgY29udGV4dCAqLworICAgICAgICAgICAgY2FtSGFsLT5wcmV2aWV3TWVtLnByaXZhdGVfYnVmZmVyX2hhbmRsZVtjbnRdID0KKyAgICAgICAgICAgICAgICAoc3RydWN0IHByaXZhdGVfaGFuZGxlX3QgKikgKCpjYW1IYWwtPnByZXZpZXdNZW0uYnVmZmVyX2hhbmRsZVtjbnRdKTsKKworICAgICAgICAgICAgQUxPR0QoIiVzOiBpZHggPSAlZCwgZmQgPSAlZCwgc2l6ZSA9ICVkLCBvZmZzZXQgPSAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIGNudCwgY2FtSGFsLT5wcmV2aWV3TWVtLnByaXZhdGVfYnVmZmVyX2hhbmRsZVtjbnRdLT5mZCwKKyAgICAgICAgICAgICAgICBjYW1IYWwtPnByZXZpZXdNZW0ucHJpdmF0ZV9idWZmZXJfaGFuZGxlW2NudF0tPnNpemUsCisgICAgICAgICAgICAgICAgY2FtSGFsLT5wcmV2aWV3TWVtLnByaXZhdGVfYnVmZmVyX2hhbmRsZVtjbnRdLT5vZmZzZXQpOworCisgICAgICAgICAgICBjYW1IYWwtPnByZXZpZXdNZW0uY2FtZXJhX21lbW9yeVtjbnRdID0KKyAgICAgICAgICAgICAgICBjYW1IYWwtPmdldF9tZW1vcnkoCisgICAgICAgICAgICAgICAgICAgIGNhbUhhbC0+cHJldmlld01lbS5wcml2YXRlX2J1ZmZlcl9oYW5kbGVbY250XS0+ZmQsCisgICAgICAgICAgICAgICAgICAgIGNhbUhhbC0+cHJldmlld01lbS5wcml2YXRlX2J1ZmZlcl9oYW5kbGVbY250XS0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgMSwgY2FtSGFsLT5jYl9jdHh0KTsKKworICAgICAgICAgICAgQUxPR0QoIiVzOiBkYXRhID0gJXAsIHNpemUgPSAlZCwgaGFuZGxlID0gJXAiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBjYW1IYWwtPnByZXZpZXdNZW0uY2FtZXJhX21lbW9yeVtjbnRdLT5kYXRhLAorICAgICAgICAgICAgICAgIGNhbUhhbC0+cHJldmlld01lbS5jYW1lcmFfbWVtb3J5W2NudF0tPnNpemUsCisgICAgICAgICAgICAgICAgY2FtSGFsLT5wcmV2aWV3TWVtLmNhbWVyYV9tZW1vcnlbY250XS0+aGFuZGxlKTsKKworI2lmZGVmIFVTRV9JT04KKyAgICAgICAgICAgIC8qIEluIGNhc2Ugb2YgSU9OIHVzYWdlLCBvcGVuIElPTiBmZCAqLworICAgICAgICAgICAgY2FtSGFsLT5wcmV2aWV3TWVtLm1lbV9pbmZvW2NudF0ubWFpbl9pb25fZmQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbigiL2Rldi9pb24iLCBPX1JET05MWSk7CisgICAgICAgICAgICBpZiAoY2FtSGFsLT5wcmV2aWV3TWVtLm1lbV9pbmZvW2NudF0ubWFpbl9pb25fZmQgPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQ6IGNvdWxkIG5vdCBvcGVuIGlvbiBkZXZpY2VcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIG1lbXNldCgmaW9uX2luZm9fZmQsIDAsIHNpemVvZihpb25faW5mb19mZCkpOworICAgICAgICAgICAgICAgIGlvbl9pbmZvX2ZkLmZkID0KKyAgICAgICAgICAgICAgICAgICAgY2FtSGFsLT5wcmV2aWV3TWVtLnByaXZhdGVfYnVmZmVyX2hhbmRsZVtjbnRdLT5mZDsKKyAgICAgICAgICAgICAgICBpZiAoaW9jdGwoY2FtSGFsLT5wcmV2aWV3TWVtLm1lbV9pbmZvW2NudF0ubWFpbl9pb25fZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElPTl9JT0NfSU1QT1JULCAmaW9uX2luZm9fZmQpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiSU9OIGltcG9ydCBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhbUhhbC0+cHJldmlld01lbS5tZW1faW5mb1tjbnRdLmZkID0KKyAgICAgICAgICAgICAgICBjYW1IYWwtPnByZXZpZXdNZW0ucHJpdmF0ZV9idWZmZXJfaGFuZGxlW2NudF0tPmZkOworICAgICAgICAgICAgY2FtSGFsLT5wcmV2aWV3TWVtLm1lbV9pbmZvW2NudF0uc2l6ZSA9CisgICAgICAgICAgICAgICAgY2FtSGFsLT5wcmV2aWV3TWVtLnByaXZhdGVfYnVmZmVyX2hhbmRsZVtjbnRdLT5zaXplOworICAgICAgICAgICAgY2FtSGFsLT5wcmV2aWV3TWVtLm1lbV9pbmZvW2NudF0uaGFuZGxlID0gaW9uX2luZm9fZmQuaGFuZGxlOworCisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBBTE9HRSgiJXM6IGRlcXVldWUgYnVmICVkIGZhaWxlZCBcbiIsIF9fZnVuY19fLCBjbnQpOworICAgIH0KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gY2FuY2VsIGJ1ZmZlcnM6IHF1ZXVlIHcvbyBkaXNwbGF5aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBmb3IgKGludCBjbnQgPSAwOyBjbnQgPCBjYW1IYWwtPnByZXZpZXdNZW0uYnVmZmVyX2NvdW50OyBjbnQrKykgeworICAgICAgICBpZiAoR0VOTE9DS19GQUlMVVJFID09IGdlbmxvY2tfdW5sb2NrX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAobmF0aXZlX2hhbmRsZV90ICopKCooY2FtSGFsLT5wcmV2aWV3TWVtLmJ1ZmZlcl9oYW5kbGVbY250XSkpKSl7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGdlbmxvY2tfdW5sb2NrX2J1ZmZlciBmYWlsZWQ6IGhkbCA9JXAiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAoKihjYW1IYWwtPnByZXZpZXdNZW0uYnVmZmVyX2hhbmRsZVtjbnRdKSkgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhbUhhbC0+cHJldmlld01lbS5sb2NhbF9mbGFnW2NudF0gPSBCVUZGRVJfVU5MT0NLRUQ7CisgICAgICAgICAgICBBTE9HRCgiJXM6IGdlbmxvY2tfdW5sb2NrX2J1ZmZlciBzdWNjZXNzOiBoZGwgPSAlcCIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgKCooY2FtSGFsLT5wcmV2aWV3TWVtLmJ1ZmZlcl9oYW5kbGVbY250XSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IG1QcmV2aWV3V2luZG93LT5jYW5jZWxfYnVmZmVyKG1QcmV2aWV3V2luZG93LAorICAgICAgICAgICAgKGJ1ZmZlcl9oYW5kbGVfdCAqKWNhbUhhbC0+cHJldmlld01lbS5idWZmZXJfaGFuZGxlW2NudF0pOworICAgICAgICBpZighZXJyKSB7CisgICAgICAgICAgICBBTE9HRCgiJXM6IGNhbmNlbF9idWZmZXIgc3VjY2Vzc2Z1bDogJXBcbiIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjYW1IYWwtPnByZXZpZXdNZW0uYnVmZmVyX2hhbmRsZVtjbnRdKTsKKyAgICAgICAgfWVsc2UKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2FuY2VsX2J1ZmZlciBmYWlsZWQ6ICVwXG4iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgY2FtSGFsLT5wcmV2aWV3TWVtLmJ1ZmZlcl9oYW5kbGVbY250XSk7CisgICAgfQorI2Vsc2UKKyAgICByYyA9IDA7CisjZW5kaWYgLyogI2lmIERJU1BMQVkgKi8KKyAgICBBTE9HRCgiJXM6IFgiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogZGVJbml0RGlzcGxheUJ1ZmZlcnMKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGRlLWluaXRpYWxpemVzIGFsbCB0aGUgZGlzcGxheSBidWZmZXJzIGFsbG9jYXRlZAorICogICAgICAgICAgICAgIGluIGluaXREaXNwbGF5QnVmZmVycworICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIGNhbUhhbCAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgICAgIDAgICBTdWNjZXNzCisgKiAgICAgIC0xICBFcnJvcgorICogTm90ZXM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZGVJbml0RGlzcGxheUJ1ZmZlcnMoY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbCkKK3sKKyAgICBpbnQgcmMgPSAwOworICAgIHByZXZpZXdfc3RyZWFtX29wcyAgICAqcHJldmlld1dpbmRvdzsKKworICAgIEFMT0dEKCIlczogRSIsIF9fZnVuY19fKTsKKworICAgIGlmKCFjYW1IYWwgfHwgIWNhbUhhbC0+d2luZG93KSB7CisgICAgICBBTE9HRSgiJXM6IGNhbUhhbCA9IE5VTEwgb3Igd2luZG93ID0gTlVMTCAiLCBfX2Z1bmNfXyk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJldmlld1dpbmRvdyA9IGNhbUhhbC0+d2luZG93OworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIFJlbGVhc2UgYWxsIGJ1ZmZlcnMgdGhhdCB3ZXJlIGFjcXVpcmVkIHVzaW5nIGdldF9tZW1vcnkgICAgICAgICAgICAqLworICAgIC8qIC0gSWYgdXNpbmcgSU9OIG1lbW9yeSwgZnJlZSBJT04gcmVsYXRlZCByZXNvdXJjZXMgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBnZW5VbmxvY2sgaWYgYnVmZmVyIGlzIGdlbkxvY2tlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtIENhbmNlbCBidWZmZXJzOiBxdWV1ZSB3L28gZGlzcGxheWluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiBESVNQTEFZCisgICAgZm9yIChpbnQgY250ID0gMDsgY250IDwgY2FtSGFsLT5wcmV2aWV3TWVtLmJ1ZmZlcl9jb3VudDsgY250KyspIHsKKworICAgICAgICAvKiBSZWxlYXNlIGFsbCBidWZmZXJzIHRoYXQgd2VyZSBhY3F1aXJlZCB1c2luZyBnZXRfbWVtb3J5ICovCisgICAgICAgIGNhbUhhbC0+cHJldmlld01lbS5jYW1lcmFfbWVtb3J5W2NudF0tPnJlbGVhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbUhhbC0+cHJldmlld01lbS5jYW1lcmFfbWVtb3J5W2NudF0pOworCisjaWZkZWYgVVNFX0lPTgorICAgICAgICAvKiBJZiB1c2luZyBJT04gbWVtb3J5LCBmcmVlIElPTiByZWxhdGVkIHJlc291cmNlcyAqLworICAgICAgICBzdHJ1Y3QgaW9uX2hhbmRsZV9kYXRhIGlvbl9oYW5kbGU7CisgICAgICAgIG1lbXNldCgmaW9uX2hhbmRsZSwgMCwgc2l6ZW9mKGlvbl9oYW5kbGUpKTsKKyAgICAgICAgaW9uX2hhbmRsZS5oYW5kbGUgPSBjYW1IYWwtPnByZXZpZXdNZW0ubWVtX2luZm9bY250XS5oYW5kbGU7CisgICAgICAgIGlmIChpb2N0bChjYW1IYWwtPnByZXZpZXdNZW0ubWVtX2luZm9bY250XS5tYWluX2lvbl9mZCwKKyAgICAgICAgICAgIElPTl9JT0NfRlJFRSwgJmlvbl9oYW5kbGUpIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBpb24gZnJlZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgfQorICAgICAgICBjbG9zZShjYW1IYWwtPnByZXZpZXdNZW0ubWVtX2luZm9bY250XS5tYWluX2lvbl9mZCk7CisjZW5kaWYKKworICAgICAgICAvKiBnZW5VbmxvY2sgaWYgYnVmZmVyIGlzIGdlbkxvY2tlZCAqLworICAgICAgICBpZihjYW1IYWwtPnByZXZpZXdNZW0ubG9jYWxfZmxhZ1tjbnRdID09IEJVRkZFUl9MT0NLRUQpeworICAgICAgICAgICAgaWYgKEdFTkxPQ0tfRkFJTFVSRSA9PSBnZW5sb2NrX3VubG9ja19idWZmZXIoCisgICAgICAgICAgICAgICAgICAgIChuYXRpdmVfaGFuZGxlX3QgKikoKihjYW1IYWwtPnByZXZpZXdNZW0uYnVmZmVyX2hhbmRsZVtjbnRdKSkpKXsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGdlbmxvY2tfdW5sb2NrX2J1ZmZlciBmYWlsZWQ6IGhkbCA9JXAiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgKCooY2FtSGFsLT5wcmV2aWV3TWVtLmJ1ZmZlcl9oYW5kbGVbY250XSkpICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhbUhhbC0+cHJldmlld01lbS5sb2NhbF9mbGFnW2NudF0gPSBCVUZGRVJfVU5MT0NLRUQ7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiBnZW5sb2NrX3VubG9ja19idWZmZXIgc3VjY2VzczogaGRsID0gJXAiLAorICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAoKihjYW1IYWwtPnByZXZpZXdNZW0uYnVmZmVyX2hhbmRsZVtjbnRdKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIGNhbmNlbCBidWZmZXJzOiBlbnF1ZXVlIHcvbyBkaXNwbGF5aW5nICovCisgICAgICAgIHJjID0gcHJldmlld1dpbmRvdy0+Y2FuY2VsX2J1ZmZlcihwcmV2aWV3V2luZG93LAorICAgICAgICAgICAgKGJ1ZmZlcl9oYW5kbGVfdCAqKWNhbUhhbC0+cHJldmlld01lbS5idWZmZXJfaGFuZGxlW2NudF0pOworICAgICAgICBpZighcmMpIHsKKyAgICAgICAgICAgIEFMT0dEKCIlczogY2FuY2VsX2J1ZmZlciBzdWNjZXNzZnVsOiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbUhhbC0+cHJldmlld01lbS5idWZmZXJfaGFuZGxlW2NudF0pOworICAgICAgICB9ZWxzZQorICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5jZWxfYnVmZmVyIGZhaWxlZDogJXBcbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICBjYW1IYWwtPnByZXZpZXdNZW0uYnVmZmVyX2hhbmRsZVtjbnRdKTsKKyAgICB9CisjZW5kaWYgLyogI2lmIERJU1BMQVkgKi8KKyAgICBtZW1zZXQoJmNhbUhhbC0+cHJldmlld01lbSwgMCwgc2l6ZW9mKGNhbUhhbC0+cHJldmlld01lbSkpOworCisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IGdldFByZXZpZXdDYXB0dXJlRm10CisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBsb2dpYyB0byBkZWNpZGUgYXBwcm9wcmlhdGUKKyAqICAgICAgICAgICAgICBjYXB0dXJlIGZvcm1hdCBmcm9tIHRoZSBVU0IgY2FtZXJhCisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICAgY2FtSGFsICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgICAgQ2FwdHVyZSBmb3JtYXQuIERlZmF1bHQgKFY0TDJfUElYX0ZNVF9NSlBFRykKKyAqCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBnZXRQcmV2aWV3Q2FwdHVyZUZtdChjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKQoreworICAgIGludCAgICAgaSA9IDAsIG1qcGVnU3VwcG9ydGVkID0gMCwgaDI2NFN1cHBvcnRlZCA9IDA7CisgICAgc3RydWN0IHY0bDJfZm10ZGVzYyBmbXRkZXNjOworCisgICAgbWVtc2V0KCZmbXRkZXNjLCAwLCBzaXplb2YodjRsMl9mbXRkZXNjKSk7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gUXVlcnkgdGhlIGNhbWVyYSBmb3IgYWxsIHN1cHBvcnRlZCBmb3JtYXRzICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBCYXNlZCBvbiB0aGUgcmVzb2x1dGlvbiwgcGljayBhbiBhcHBvcnByaWF0ZSBmb3JtYXQgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIFF1ZXJ5IHRoZSBjYW1lcmEgZm9yIGFsbCBzdXBwb3J0ZWQgZm9ybWF0cyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgZm9yKGkgPSAwOyA7IGkrKykgeworICAgICAgICBmbXRkZXNjLmluZGV4ID0gaTsKKyAgICAgICAgZm10ZGVzYy50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworICAgICAgICBpZiAoLTEgPT0gaW9jdGxMb29wKGNhbUhhbC0+ZmQsIFZJRElPQ19FTlVNX0ZNVCwgJmZtdGRlc2MpKSB7CisgICAgICAgICAgICBpZiAoRUlOVkFMID09IGVycm5vKSB7CisgICAgICAgICAgICAgICAgQUxPR0koIiVzOiBRdWVyaWVkIGFsbCBmb3JtYXRzIHRpbGwgaW5kZXggJWRcbiIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBWSURJT0NfRU5VTV9GTVQgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKFY0TDJfUElYX0ZNVF9NSlBFRyA9PSBmbXRkZXNjLnBpeGVsZm9ybWF0KXsKKyAgICAgICAgICAgIG1qcGVnU3VwcG9ydGVkID0gMTsKKyAgICAgICAgICAgIEFMT0dJKCIlczogVjRMMl9QSVhfRk1UX01KUEVHIGlzIHN1cHBvcnRlZCIsIF9fZnVuY19fICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoVjRMMl9QSVhfRk1UX0gyNjQgPT0gZm10ZGVzYy5waXhlbGZvcm1hdCl7CisgICAgICAgICAgICBoMjY0U3VwcG9ydGVkID0gMTsKKyAgICAgICAgICAgIEFMT0dJKCIlczogVjRMMl9QSVhfRk1UX0gyNjQgaXMgc3VwcG9ydGVkIiwgX19mdW5jX18gKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIEJhc2VkIG9uIHRoZSByZXNvbHV0aW9uLCBwaWNrIGFuIGFwcG9ycHJpYXRlIGZvcm1hdCAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLy9WNEwyX1BJWF9GTVRfTUpQRUc7IFY0TDJfUElYX0ZNVF9ZVVlWOyBWNEwyX1BJWF9GTVRfSDI2NCA9IDB4MzQzNjMyNDg7CisgICAgY2FtSGFsLT5jYXB0dXJlRm9ybWF0ID0gVjRMMl9QSVhfRk1UX1lVWVY7CisgICAgaWYoY2FtSGFsLT5wcmV2V2lkdGggPiA2NDApeworICAgICAgICBpZigxID09IG1qcGVnU3VwcG9ydGVkKQorICAgICAgICAgICAgY2FtSGFsLT5jYXB0dXJlRm9ybWF0ID0gVjRMMl9QSVhfRk1UX01KUEVHOworICAgICAgICBlbHNlIGlmKDEgPT0gaDI2NFN1cHBvcnRlZCkKKyAgICAgICAgICAgIGNhbUhhbC0+Y2FwdHVyZUZvcm1hdCA9IFY0TDJfUElYX0ZNVF9IMjY0OworICAgIH0KKyAgICBBTE9HSSgiJXM6IENhcHR1cmUgZm9ybWF0IGNob3NlbjogMHgleC4gMHgleDpZVVlWLiAweCV4Ok1KUEVHLiAweCV4OiBIMjY0IiwKKyAgICAgICAgX19mdW5jX18sIGNhbUhhbC0+Y2FwdHVyZUZvcm1hdCwgVjRMMl9QSVhfRk1UX1lVWVYsCisgICAgICAgIFY0TDJfUElYX0ZNVF9NSlBFRywgVjRMMl9QSVhfRk1UX0gyNjQpOworCisgICAgcmV0dXJuIGNhbUhhbC0+Y2FwdHVyZUZvcm1hdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IGdldE1qcGVnZE91dHB1dEZvcm1hdAorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gbWFwcyBkaXNwbGF5IHBpeGVsIGZvcm1hdCBlbnVtIHRvIEpQRUcgb3V0cHV0CisgKiAgICAgICAgICAgICAgZm9ybWF0IGVudW0KKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogICBkaXNwRm9ybWF0ICAgICAgICAgICAgICAtIERpc3BsYXkgcGl4ZWwgZm9ybWF0CisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgICAgKGludCltanBlZ091dHB1dEZvcm1hdAorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGdldE1qcGVnZE91dHB1dEZvcm1hdChpbnQgZGlzcEZvcm1hdCkKK3sKKyAgICBpbnQgbWpwZWdPdXRwdXRGb3JtYXQgPSBZQ1JDQkxQX0gyVjI7CisKKyAgICBpZihIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCA9PSBkaXNwRm9ybWF0KQorICAgICAgICBtanBlZ091dHB1dEZvcm1hdCA9IFlDUkNCTFBfSDJWMjsKKworICAgIHJldHVybiBtanBlZ091dHB1dEZvcm1hdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IGlvY3RsTG9vcAorICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaXMgYSBibG9ja2luZyBjYWxsIGFyb3VuZCBpb2N0bAorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIGZkICAgICAgICAgICAgIC0gSU9DVEwgZmQKKyAqICAgaW9jdGxDbWQgICAgICAgLSBJT0NUTCBjb21tYW5kCisgKiAgIGFyZ3MgICAgICAgICAgIC0gSU9DVEwgYXJndW1lbnRzCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgICAgKGludCltanBlZ091dHB1dEZvcm1hdAorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGlvY3RsTG9vcChpbnQgZmQsIGludCBpb2N0bENtZCwgdm9pZCAqYXJncykKK3sKKyAgICBpbnQgcmMgPSAtMTsKKworICAgIHdoaWxlKDEpCisgICAgeworICAgICAgICByYyA9IGlvY3RsKGZkLCBpb2N0bENtZCwgYXJncyk7CisgICAgICAgIGlmKCEoKC0xID09IHJjKSAmJiAoRUlOVFIgPT0gZXJybm8pKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiBpbml0VjRMMm1tYXAKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHJlcXVlc3RzIGZvciBWNEwyIGRyaXZlciBhbGxvY2F0ZWQgYnVmZmVycworICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIGNhbUhhbCAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIDAgICAgICBObyBlcnJvcgorICogICAtMSAgICAgRXJyb3IKKyAqCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBpbml0VjRMMm1tYXAoY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbCkKK3sKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAgcmVxQnVmczsKKyAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgICAgICAgICAgdGVtcEJ1ZjsKKworICAgIEFMT0dEKCIlczogRSIsIF9fZnVuY19fKTsKKyAgICBtZW1zZXQoJnJlcUJ1ZnMsIDAsIHNpemVvZih2NGwyX3JlcXVlc3RidWZmZXJzKSk7CisgICAgcmVxQnVmcy50eXBlICAgID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworICAgIHJlcUJ1ZnMubWVtb3J5ICA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgcmVxQnVmcy5jb3VudCAgID0gUFJWV19DQVBfQlVGX0NOVDsKKworICAgIGlmICgtMSA9PSBpb2N0bExvb3AoY2FtSGFsLT5mZCwgVklESU9DX1JFUUJVRlMsICZyZXFCdWZzKSkgeworICAgICAgICBpZiAoRUlOVkFMID09IGVycm5vKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGRvZXMgbm90IHN1cHBvcnQgbWVtb3J5IG1hcHBpbmdcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVklESU9DX1JFUUJVRlMgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dEKCIlczogVklESU9DX1JFUUJVRlMgc3VjY2VzcyIsIF9fZnVuY19fKTsKKworICAgIGlmIChyZXFCdWZzLmNvdW50IDwgUFJWV19DQVBfQlVGX0NOVCkgeworICAgICAgICBBTE9HRSgiJXM6IEluc3VmZmljaWVudCBidWZmZXIgbWVtb3J5IG9uXG4iLCBfX2Z1bmNfXyk7CisgICAgfQorCisgICAgY2FtSGFsLT5idWZmZXJzID0KKyAgICAgICAgKCBidWZPYmoqICkgY2FsbG9jKHJlcUJ1ZnMuY291bnQsIHNpemVvZihidWZPYmopKTsKKworICAgIGlmICghY2FtSGFsLT5idWZmZXJzKSB7CisgICAgICAgIEFMT0dFKCIlczogT3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pOworICAgIH0KKworICAgIC8qIFN0b3JlIHRoZSBpbmRleGVzIGluIHRoZSBjb250ZXh0LiBVc2VmdWwgZHVyaW5nIHJlbGVhc2luZyAqLworICAgIGZvciAoY2FtSGFsLT5uX2J1ZmZlcnMgPSAwOworICAgICAgICAgY2FtSGFsLT5uX2J1ZmZlcnMgPCByZXFCdWZzLmNvdW50OworICAgICAgICAgY2FtSGFsLT5uX2J1ZmZlcnMrKykgeworCisgICAgICAgIG1lbXNldCgmdGVtcEJ1ZiwgMCwgc2l6ZW9mKHRlbXBCdWYpKTsKKworICAgICAgICB0ZW1wQnVmLmluZGV4ICAgICAgID0gY2FtSGFsLT5uX2J1ZmZlcnM7CisgICAgICAgIHRlbXBCdWYudHlwZSAgICAgICAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgICAgICAgIHRlbXBCdWYubWVtb3J5ICAgICAgPSBWNEwyX01FTU9SWV9NTUFQOworCisgICAgICAgIGlmICgtMSA9PSBpb2N0bExvb3AoY2FtSGFsLT5mZCwgVklESU9DX1FVRVJZQlVGLCAmdGVtcEJ1ZikpCisgICAgICAgICAgICBBTE9HRSgiJXM6IFZJRElPQ19RVUVSWUJVRiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisKKyAgICAgICAgQUxPR0QoIiVzOiBWSURJT0NfUVVFUllCVUYgc3VjY2VzcyIsIF9fZnVuY19fKTsKKworICAgICAgICBjYW1IYWwtPmJ1ZmZlcnNbY2FtSGFsLT5uX2J1ZmZlcnNdLmxlbiA9IHRlbXBCdWYubGVuZ3RoOworICAgICAgICBjYW1IYWwtPmJ1ZmZlcnNbY2FtSGFsLT5uX2J1ZmZlcnNdLmRhdGEgPQorICAgICAgICBtbWFwKE5VTEwgLyogc3RhcnQgYW55d2hlcmUgKi8sCisgICAgICAgICAgICAgICAgICB0ZW1wQnVmLmxlbmd0aCwKKyAgICAgICAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICAgICBNQVBfU0hBUkVELAorICAgICAgICAgICAgICAgICAgY2FtSGFsLT5mZCwgdGVtcEJ1Zi5tLm9mZnNldCk7CisKKyAgICAgICAgaWYgKE1BUF9GQUlMRUQgPT0gY2FtSGFsLT5idWZmZXJzW2NhbUhhbC0+bl9idWZmZXJzXS5kYXRhKQorICAgICAgICAgICAgQUxPR0UoIiVzOiBtbWFwIGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICB9CisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogdW5Jbml0VjRMMm1tYXAKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHVubWFwcyB0aGUgVjRMMiBkcml2ZXIgYnVmZmVycworICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIGNhbUhhbCAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIDAgICAgICBObyBlcnJvcgorICogICAtMSAgICAgRXJyb3IKKyAqCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCB1bkluaXRWNEwybW1hcChjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKQoreworICAgIGludCBpLCByYyA9IDA7CisgICAgQUxPR0QoIiVzOiBFIiwgX19mdW5jX18pOworCisgICAgZm9yIChpID0gMDsgaSA8IGNhbUhhbC0+bl9idWZmZXJzOyBpKyspCisgICAgICAgIGlmICgtMSA9PSBtdW5tYXAoY2FtSGFsLT5idWZmZXJzW2ldLmRhdGEsIGNhbUhhbC0+YnVmZmVyc1tpXS5sZW4pKXsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbXVubWFwIGZhaWxlZCBmb3IgYnVmZmVyOiAlZCIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgIH0KKworICAgIEFMT0dEKCIlczogWCIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiBpbml0VXNiQ2FtZXJhCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSByZXNvbHV0aW9uIGFuZCBwaXhlbCBmb3JtYXQgb2YgdGhlCisgKiAgICAgICAgICAgICAgVVNCIGNhbWVyYQorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgY2FtSGFsICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKiAgd2lkdGggICAgICAgICAgICAgICAtIHBpY3R1cmUgd2lkdGggaW4gcGl4ZWxzCisgKiAgaGVpZ2h0ICAgICAgICAgICAgICAtIHBpY3R1cmUgaGVpZ2h0IGluIHBpeGVscworICogIHBpeGVsRm9ybWF0ICAgICAgICAgLSBjYXB0dXJlIGZvcm1hdCBmb3IgdGhlIGNhbWVyYQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIDAgICAgICBObyBlcnJvcgorICogICAtMSAgICAgRXJyb3IKKyAqCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBpbml0VXNiQ2FtZXJhKGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWwsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbEZvcm1hdCkKK3sKKyAgICBpbnQgICAgIHJjID0gLTE7CisgICAgc3RydWN0ICB2NGwyX2NhcGFiaWxpdHkgICAgIGNhcDsKKyAgICBzdHJ1Y3QgIHY0bDJfY3JvcGNhcCAgICAgICAgY3JvcGNhcDsKKyAgICBzdHJ1Y3QgIHY0bDJfY3JvcCAgICAgICAgICAgY3JvcDsKKyAgICBzdHJ1Y3QgIHY0bDJfZm9ybWF0ICAgICAgICAgdjRsMmZvcm1hdDsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICAgbWluOworCisgICAgQUxPR0koIiVzOiBFIiwgX19mdW5jX18pOworCisgICAgaWYgKC0xID09IGlvY3RsTG9vcChjYW1IYWwtPmZkLCBWSURJT0NfUVVFUllDQVAsICZjYXApKSB7CisgICAgICAgIGlmIChFSU5WQUwgPT0gZXJybm8pIHsKKyAgICAgICAgICAgIEFMT0dFKCAiJXM6IFRoaXMgaXMgbm90IFY0TDIgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFZJRElPQ19RVUVSWUNBUCBlcnJubzogJWQiLCBfX2Z1bmNfXywgZXJybm8pOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dEKCIlczogVklESU9DX1FVRVJZQ0FQIHN1Y2Nlc3MiLCBfX2Z1bmNfXyk7CisKKyAgICBpZiAoIShjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUaGlzIGlzIG5vdCB2aWRlbyBjYXB0dXJlIGRldmljZVxuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCEoY2FwLmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1NUUkVBTUlORykpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUaGlzIGRvZXMgbm90IHN1cHBvcnQgc3RyZWFtaW5nIGkvb1xuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogU2VsZWN0IHZpZGVvIGlucHV0LCB2aWRlbyBzdGFuZGFyZCBhbmQgdHVuZSBoZXJlLiAqLworICAgIG1lbXNldCgmY3JvcGNhcCwgMCwgc2l6ZW9mKGNyb3BjYXApKTsKKworICAgIGNyb3BjYXAudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKworICAgIGlmICgwID09IGlvY3RsTG9vcChjYW1IYWwtPmZkLCBWSURJT0NfQ1JPUENBUCwgJmNyb3BjYXApKSB7CisKKyAgICAgICAgLyogcmVzZXQgdG8gZGVmYXVsdCAqLworICAgICAgICBjcm9wLmMgPSBjcm9wY2FwLmRlZnJlY3Q7CisgICAgICAgIGNyb3AudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKworICAgICAgICBBTE9HRCgiJXM6IFZJRElPQ19DUk9QQ0FQIHN1Y2Nlc3MiLCBfX2Z1bmNfXyk7CisgICAgICAgIGlmICgtMSA9PSBpb2N0bExvb3AoY2FtSGFsLT5mZCwgVklESU9DX1NfQ1JPUCwgJmNyb3ApKSB7CisgICAgICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgICAgICAgIGNhc2UgRUlOVkFMOgorICAgICAgICAgICAgLyogQ3JvcHBpbmcgbm90IHN1cHBvcnRlZC4gKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvKiBFcnJvcnMgaWdub3JlZC4gKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dEKCIlczogVklESU9DX1NfQ1JPUCBzdWNjZXNzIiwgX19mdW5jX18pOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRXJyb3JzIGlnbm9yZWQuICovCisgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFZJRElPQ19TX0NST1AgZmFpbGVkIiwgX19mdW5jX18pOworICAgIH0KKworCisgICAgbWVtc2V0KCZ2NGwyZm9ybWF0LCAwLCBzaXplb2YodjRsMmZvcm1hdCkpOworCisgICAgdjRsMmZvcm1hdC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworICAgIHsKKyAgICAgICAgdjRsMmZvcm1hdC5mbXQucGl4LmZpZWxkICAgICAgID0gVjRMMl9GSUVMRF9OT05FOworICAgICAgICB2NGwyZm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQgPSBwaXhlbEZvcm1hdDsKKyAgICAgICAgdjRsMmZvcm1hdC5mbXQucGl4LndpZHRoICAgICAgID0gd2lkdGg7CisgICAgICAgIHY0bDJmb3JtYXQuZm10LnBpeC5oZWlnaHQgICAgICA9IGhlaWdodDsKKworICAgICAgICBpZiAoLTEgPT0gaW9jdGxMb29wKGNhbUhhbC0+ZmQsIFZJRElPQ19TX0ZNVCwgJnY0bDJmb3JtYXQpKQorICAgICAgICB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFZJRElPQ19TX0ZNVCBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIiVzOiBWSURJT0NfU19GTVQgc3VjY2VzcyIsIF9fZnVuY19fKTsKKworICAgICAgICAvKiBOb3RlIFZJRElPQ19TX0ZNVCBtYXkgY2hhbmdlIHdpZHRoIGFuZCBoZWlnaHQuICovCisgICAgfQorCisgICAgLyogVEJSOiBJbiBjYXNlIG9mIHVzZXIgcG9pbnRlciBidWZmZXJzLCB2NGwyZm9ybWF0LmZtdC5waXguc2l6ZWltYWdlICovCisgICAgLyogbWlnaHQgaGF2ZSB0byBiZSBjYWxjdWxhdGVkIGFzIHBlciBWNEwyIHNhbXBsZSBhcHBsaWNhdGlvbiBkdWUgdG8gKi8KKyAgICAvKiBvcGVuIHNvdXJjZSBkcml2ZXIgYnVnICovCisKKyAgICByYyA9IGluaXRWNEwybW1hcChjYW1IYWwpOworICAgIEFMT0dJKCIlczogWCIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiBzdGFydFVzYkNhbUNhcHR1cmUKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHF1ZXVlcyBidWZmZXIgb2JqZWN0cyB0byB0aGUgZHJpdmVyIGFuZCBzZW5kcworICogICAgICAgICAgICAgIFNUUkVBTSBPTiBjb21tYW5kIHRvIHRoZSBVU0IgY2FtZXJhIGRyaXZlcgorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIGNhbUhhbCAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIDAgICAgICBObyBlcnJvcgorICogICAtMSAgICAgRXJyb3IKKyAqCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzdGFydFVzYkNhbUNhcHR1cmUoY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbCkKK3sKKyAgICBpbnQgICAgICAgICByYyA9IC0xOworICAgIHVuc2lnbmVkICAgIGludCBpOworICAgIGVudW0gICAgICAgIHY0bDJfYnVmX3R5cGUgICB2NGwyQnVmVHlwZTsKKyAgICBBTE9HRCgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2FtSGFsLT5uX2J1ZmZlcnM7ICsraSkgeworICAgICAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgdGVtcEJ1ZjsKKworICAgICAgICBtZW1zZXQoJnRlbXBCdWYsIDAsIHNpemVvZih0ZW1wQnVmKSk7CisgICAgICAgIHRlbXBCdWYudHlwZSAgICA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKyAgICAgICAgdGVtcEJ1Zi5tZW1vcnkgID0gVjRMMl9NRU1PUllfTU1BUDsKKyAgICAgICAgdGVtcEJ1Zi5pbmRleCAgID0gaTsKKworICAgICAgICBpZiAoLTEgPT0gaW9jdGxMb29wKGNhbUhhbC0+ZmQsIFZJRElPQ19RQlVGLCAmdGVtcEJ1ZikpCisgICAgICAgICAgICBBTE9HRSgiJXM6IFZJRElPQ19RQlVGIGZvciAlZCBidWZmZXIgZmFpbGVkIiwgX19mdW5jX18sIGkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBBTE9HRCgiJXM6IFZJRElPQ19RQlVGIGZvciAlZCBidWZmZXIgc3VjY2VzcyIsIF9fZnVuY19fLCBpKTsKKyAgICB9CisKKyAgICB2NGwyQnVmVHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKyAgICBpZiAoLTEgPT0gaW9jdGxMb29wKGNhbUhhbC0+ZmQsIFZJRElPQ19TVFJFQU1PTiwgJnY0bDJCdWZUeXBlKSkKKyAgICAgICAgQUxPR0UoIiVzOiBWSURJT0NfU1RSRUFNT04gZmFpbGVkIiwgX19mdW5jX18pOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIEFMT0dEKCIlczogVklESU9DX1NUUkVBTU9OIHN1Y2Nlc3MiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJjID0gMDsKKyAgICB9CisKKyAgICBBTE9HRCgiJXM6IFgiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogc3RvcFVzYkNhbUNhcHR1cmUKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHNlbmRzIFNUUkVBTSBPRkYgY29tbWFuZCB0byB0aGUgVVNCIGNhbWVyYSBkcml2ZXIKKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogICBjYW1IYWwgICAgICAgICAgICAgIC0gY2FtZXJhIEhBTCBoYW5kbGUKKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogICAwICAgICAgTm8gZXJyb3IKKyAqICAgLTEgICAgIEVycm9yCisgKgorICogTm90ZXM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgc3RvcFVzYkNhbUNhcHR1cmUoY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbCkKK3sKKyAgICBpbnQgICAgICAgICByYyA9IC0xOworICAgIHVuc2lnbmVkICAgIGludCBpOworICAgIGVudW0gICAgICAgIHY0bDJfYnVmX3R5cGUgICB2NGwyQnVmVHlwZTsKKyAgICBBTE9HRCgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICBpZighY2FtSGFsLT5mZCl7CisgICAgICAgIEFMT0dFKCIlczogY2FtSGFsLT5mZCA9IE5VTEwgIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHY0bDJCdWZUeXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworICAgIGlmICgtMSA9PSBpb2N0bExvb3AoY2FtSGFsLT5mZCwgVklESU9DX1NUUkVBTU9GRiwgJnY0bDJCdWZUeXBlKSl7CisgICAgICAgIEFMT0dFKCIlczogVklESU9DX1NUUkVBTU9GRiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJjID0gLTE7CisgICAgfWVsc2V7CisgICAgICAgIEFMT0dEKCIlczogVklESU9DX1NUUkVBTU9GRiBzdWNjZXNzIiwgX19mdW5jX18pOworICAgICAgICByYyA9IDA7CisgICAgfQorCisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHN0b3BQcmV2aWV3SW50ZXJuYWwKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHNlbmRzIEVYSVQgY29tbWFuZCB0byBwcnZpZXcgbG9vcCB0aHJlYWQsCisgKiAgICAgICAgICAgICAgc3RvcHMgdXNiIGNhbWVyYSBjYXB0dXJlIGFuZCB1bmluaXRpYWxpemVzIE1NQVAuIFRoaXMgZnVuY3Rpb24KKyAqICAgICAgICAgICAgICBhc3N1bWVzIHRoYXQgY2FsbGluZyBmdW5jdGlvbiBoYXMgbG9ja2VkIGNhbUhhbC0+bG9jaworICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgIGNhbUhhbCAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIDAgICAgICBObyBlcnJvcgorICogICAtMSAgICAgRXJyb3IKKyAqCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBzdG9wUHJldmlld0ludGVybmFsKGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWwpCit7CisgICAgaW50IHJjID0gMDsKKyAgICBBTE9HRCgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICBpZihjYW1IYWwtPnByZXZpZXdFbmFibGVkRmxhZykKKyAgICB7CisgICAgICAgIGNhbUhhbC0+cHJ2d0NtZFBlbmRpbmcrKzsKKyAgICAgICAgY2FtSGFsLT5wcnZ3Q21kICAgICAgICAgPSBVU0JfQ0FNX1BSRVZJRVdfRVhJVDsKKworICAgICAgICAvKiB5aWVsZCBsb2NrIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBwcmV2aWV3IHRocmVhZCB0byBleGl0ICovCisgICAgICAgIGNhbUhhbC0+bG9jay51bmxvY2soKTsKKyAgICAgICAgaWYocHRocmVhZF9qb2luKGNhbUhhbC0+cHJldmlld1RocmVhZCwgTlVMTCkpeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBpbiBwdGhyZWFkX2pvaW4gcHJldmlldyB0aHJlYWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICAgICAgY2FtSGFsLT5sb2NrLmxvY2soKTsKKworICAgICAgICBpZihzdG9wVXNiQ2FtQ2FwdHVyZShjYW1IYWwpKXsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW4gc3RvcFVzYkNhbUNhcHR1cmUiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByYyA9IC0xOworICAgICAgICB9CisgICAgICAgIGlmKHVuSW5pdFY0TDJtbWFwKGNhbUhhbCkpeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBpbiBzdG9wVXNiQ2FtQ2FwdHVyZSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgY2FtSGFsLT5wcmV2aWV3RW5hYmxlZEZsYWcgPSAwOworICAgIH0KKworICAgIEFMT0dEKCIlczogWCwgcmM6ICVkIiwgX19mdW5jX18sIHJjKTsKKyAgICByZXR1cm4gcmM7Cit9CisjaWYgMQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHBydndUaHJlYWRUYWtlUGljdHVyZUludGVybmFsCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBwcm9jZXNzZXMgb25lIGNhbWVyYSBmcmFtZSB0byBnZXQgSlBFRyBlbmNvZGVkCisgKiAgICAgICAgICAgICAgcGljdHVyZS4KKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogICBjYW1IYWwgICAgICAgICAgICAgIC0gY2FtZXJhIEhBTCBoYW5kbGUKKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogICAwICAgICAgTm8gZXJyb3IKKyAqICAgLTEgICAgIEVycm9yCisgKgorICogTm90ZXM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHJ2d1RocmVhZFRha2VQaWN0dXJlSW50ZXJuYWwoY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbCkKK3sKKyAgICBpbnQgICAgIHJjID0gMDsKKyAgICBRQ2FtZXJhSGFsTWVtSW5mb190ICAgICAqbWVtX2luZm87CisgICAgQUxPR0QoIiVzOiBFIiwgX19mdW5jX18pOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIElmIHJlcXVlc3RlZCBmb3Igc2h1dHRlciBub3RmaWNhdGlvbiwgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0gRGVxdWV1ZSBjYXB0dXJlIGJ1ZmZlciBmcm9tIFVTQiBjYW1lcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBTZW5kIGNhcHR1cmUgYnVmZmVyIHRvIEpQRUcgZW5jb2RlciBmb3IgSlBFRyBjb21wcmVzc2lvbiAgICAgICAgICAgKi8KKyAgICAvKiAtIElmIGpwZWcgZnJhbWVzIGNhbGxiYWNrIGlzIHJlcXVlc3RlZCwgY2FsbGJhY2sgd2l0aCBqcGVnIGJ1ZmZlcnMgICAqLworICAgIC8qIC0gRW5xdWV1ZSBjYXB0dXJlIGJ1ZmZlciBiYWNrIHRvIFVTQiBjYW1lcmEgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogLSBJZiByZXF1ZXN0ZWQgZm9yIHNodXR0ZXIgbm90ZmljYXRpb24sIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChjYW1IYWwtPm1zZ0VuYWJsZWRGbGFnICYgQ0FNRVJBX01TR19TSFVUVEVSKXsKKyAgICAgICAgY2FtSGFsLT5sb2NrLnVubG9jaygpOworICAgICAgICBjYW1IYWwtPm5vdGlmeV9jYihDQU1FUkFfTVNHX1NIVVRURVIsIDAsIDAsIGNhbUhhbC0+Y2JfY3R4dCk7CisgICAgICAgIGNhbUhhbC0+bG9jay5sb2NrKCk7CisgICAgfQorCisjaWYgQ0FQVFVSRQorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogLSBEZXF1ZXVlIGNhcHR1cmUgYnVmZmVyIGZyb20gVVNCIGNhbWVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgwID09IGdldF9idWZfZnJvbV9jYW0oY2FtSGFsKSkKKyAgICAgICAgQUxPR0QoIiVzOiBnZXRfYnVmX2Zyb21fY2FtIHN1Y2Nlc3MiLCBfX2Z1bmNfXyk7CisgICAgZWxzZQorICAgICAgICBBTE9HRSgiJXM6IGdldF9idWZfZnJvbV9jYW0gZXJyb3IiLCBfX2Z1bmNfXyk7CisjZW5kaWYKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogLSBTZW5kIGNhcHR1cmUgYnVmZmVyIHRvIEpQRUcgZW5jb2RlciBmb3IgSlBFRyBjb21wcmVzc2lvbiAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIE9wdGltaXphdGlvbjogSWYgY2FtZXJhIGNhcHR1cmUgaXMgSlBFRyBmb3JtYXQsIG5lZWQgbm90IGNvbXByZXNzISAqLworICAgIC8qIGluc3RlYWQsIGp1c3QgZGF0YSBjb3B5IGZyb20gY2FwdHVyZSBidWZmZXIgdG8gcGljdHVyZSBidWZmZXIgKi8KKyAgICBpZihWNEwyX1BJWF9GTVRfTUpQRUcgPT0gY2FtSGFsLT5jYXB0dXJlRm9ybWF0KXsKKyAgICAgICAgLyogYWxsb2NhdGUgaGVhcCBtZW1vcnkgZm9yIEpQRUcgb3V0cHV0ICovCisgICAgICAgIG1lbV9pbmZvID0gJmNhbUhhbC0+cGljdE1lbS5tZW1faW5mb1swXTsKKyAgICAgICAgbWVtX2luZm8tPnNpemUgPSBjYW1IYWwtPmN1ckNhcHR1cmVCdWYuYnl0ZXN1c2VkOworICAgICAgICAvKiBUQkQ6IGFsbG9jYXRlX2lvbl9tZW1vcnkKKyAgICAgICAgcmMgPSBRQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U6OmFsbG9jYXRlX2lvbl9tZW1vcnkobWVtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgweDEgPDwgQ0FNRVJBX1pTTF9JT05fSEVBUF9JRCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDEgPDwgQ0FNRVJBX1pTTF9JT05fRkFMTEJBQ0tfSEVBUF9JRCkpKTsKKyAgICAgICAgKi8KKyAgICAgICAgaWYocmMpCisgICAgICAgICAgICBBTE9HRSgiJXM6IElPTiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisKKyAgICAgICAgY2FtSGFsLT5waWN0TWVtLmNhbWVyYV9tZW1vcnlbMF0gPSBjYW1IYWwtPmdldF9tZW1vcnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtX2luZm8tPmZkLCBtZW1faW5mby0+c2l6ZSwgMSwgY2FtSGFsLT5jYl9jdHh0KTsKKyAgICAgICAgaWYoIWNhbUhhbC0+cGljdE1lbS5jYW1lcmFfbWVtb3J5WzBdKQorICAgICAgICAgICAgQUxPR0UoIiVzOiBnZXRfbWVtIGZhaWxlZCIsIF9fZnVuY19fKTsKKworICAgICAgICBtZW1jcHkoIGNhbUhhbC0+cGljdE1lbS5jYW1lcmFfbWVtb3J5WzBdLT5kYXRhLAorICAgICAgICAgICAgICAgIChjaGFyICopY2FtSGFsLT5idWZmZXJzW2NhbUhhbC0+Y3VyQ2FwdHVyZUJ1Zi5pbmRleF0uZGF0YSwKKyAgICAgICAgICAgICAgICBjYW1IYWwtPmN1ckNhcHR1cmVCdWYuYnl0ZXN1c2VkKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gSWYganBlZyBmcmFtZXMgY2FsbGJhY2sgaXMgcmVxdWVzdGVkLCBjYWxsYmFjayB3aXRoIGpwZWcgYnVmZmVycyAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoKGNhbUhhbC0+bXNnRW5hYmxlZEZsYWcgJiBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UpICYmCisgICAgICAgICAgICAoY2FtSGFsLT5kYXRhX2NiKSl7CisgICAgICAgIGNhbUhhbC0+bG9jay51bmxvY2soKTsKKyAgICAgICAgY2FtSGFsLT5kYXRhX2NiKENBTUVSQV9NU0dfQ09NUFJFU1NFRF9JTUFHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbUhhbC0+cGljdE1lbS5jYW1lcmFfbWVtb3J5WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgY2FtSGFsLT5jYl9jdHh0KTsKKyAgICAgICAgY2FtSGFsLT5sb2NrLmxvY2soKTsKKyAgICB9CisgICAgLyogcmVsZWFzZSBoZWFwIG1lbW9yeSBhZnRlciB0aGUgY2FsbCBiYWNrICovCisgICAgaWYoY2FtSGFsLT5waWN0TWVtLmNhbWVyYV9tZW1vcnlbMF0pCisgICAgICAgIGNhbUhhbC0+cGljdE1lbS5jYW1lcmFfbWVtb3J5WzBdLT5yZWxlYXNlKAorICAgICAgICAgICAgY2FtSGFsLT5waWN0TWVtLmNhbWVyYV9tZW1vcnlbMF0pOworCisgICAgLyogVEJEOiBkZWFsbG9jYXRlX2lvbl9tZW1vcnkgKi8KKyAgICAvL3JjID0gUUNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlOjpkZWFsbG9jYXRlX2lvbl9tZW1vcnkobWVtX2luZm8pOworICAgIGlmKHJjKQorICAgICAgICBBTE9HRSgiJXM6IElPTiBtZW1vcnkgZGUtYWxsb2NhdGlvbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisKKyNpZiBDQVBUVVJFCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIEVucXVldWUgY2FwdHVyZSBidWZmZXIgYmFjayB0byBVU0IgY2FtZXJhICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgaWYoMCA9PSBwdXRfYnVmX3RvX2NhbShjYW1IYWwpKSB7CisgICAgICAgICAgICBBTE9HRCgiJXM6IHB1dF9idWZfdG9fY2FtIHN1Y2Nlc3MiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQUxPR0UoIiVzOiBwdXRfYnVmX3RvX2NhbSBlcnJvciIsIF9fZnVuY19fKTsKKyNlbmRpZgorCisgICAgQUxPR0QoIiVzOiBYLCByYzogJWQiLCBfX2Z1bmNfXywgcmMpOworICAgIHJldHVybiByYzsKK30KKyNlbmRpZiAvLyNpZiAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogY2FjaGVfb3BzCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBjYWxscyBJT04gaW9jdGwgZm9yIGNhY2hlIHJlbGF0ZWQgb3BlcmF0aW9ucworICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgbWVtX2luZm8gICAgICAgICAgICAgICAgLSBRQ2FtZXJhSGFsTWVtSW5mb190IHN0cnVjdHVyZSB3aXRoIElPTiBpbmZvCisgKiAgYnVmX3B0ciAgICAgICAgICAgICAgICAgLSBCdWZmZXIgcG9pbnRlciB0aGF0IG5lZWRzIHRvIGJlIGNhY2hlIG9wZXJhdGVkCisgKiAgY21kICAgICAgICAgICAgICAgICAgICAgLSBDYWNoZSBjb21tYW5kIC0gY2xlYW4vaW52YWxpZGF0ZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIE1NX0NBTUVSQV9PSyAgICAgICBObyBlcnJvcgorICogICAtMSAgICAgICAgICAgICAgICAgRXJyb3IKKyAqCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGNhY2hlX29wcyhRQ2FtZXJhSGFsTWVtSW5mb190ICptZW1faW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1Zl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kKQoreworICAgIHN0cnVjdCBpb25fZmx1c2hfZGF0YSBjYWNoZV9pbnZfZGF0YTsKKyAgICBzdHJ1Y3QgaW9uX2N1c3RvbV9kYXRhIGN1c3RvbV9kYXRhOworICAgIGludCByZXQgPSBNTV9DQU1FUkFfT0s7CisKKyNpZmRlZiBVU0VfSU9OCisgICAgaWYgKE5VTEwgPT0gbWVtX2luZm8pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBtZW1faW5mbyBpcyBOVUxMLCByZXR1cm4gaGVyZSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1lbXNldCgmY2FjaGVfaW52X2RhdGEsIDAsIHNpemVvZihjYWNoZV9pbnZfZGF0YSkpOworICAgIG1lbXNldCgmY3VzdG9tX2RhdGEsIDAsIHNpemVvZihjdXN0b21fZGF0YSkpOworICAgIGNhY2hlX2ludl9kYXRhLnZhZGRyID0gYnVmX3B0cjsKKyAgICBjYWNoZV9pbnZfZGF0YS5mZCA9IG1lbV9pbmZvLT5mZDsKKyAgICBjYWNoZV9pbnZfZGF0YS5oYW5kbGUgPSBtZW1faW5mby0+aGFuZGxlOworICAgIGNhY2hlX2ludl9kYXRhLmxlbmd0aCA9IG1lbV9pbmZvLT5zaXplOworICAgIGN1c3RvbV9kYXRhLmNtZCA9IGNtZDsKKyAgICBjdXN0b21fZGF0YS5hcmcgPSAodW5zaWduZWQgbG9uZykmY2FjaGVfaW52X2RhdGE7CisKKyAgICBBTE9HRCgiJXM6IGFkZHIgPSAlcCwgZmQgPSAlZCwgaGFuZGxlID0gJXAgbGVuZ3RoID0gJWQsIElPTiBGZCA9ICVkIiwKKyAgICAgICAgIF9fZnVuY19fLCBjYWNoZV9pbnZfZGF0YS52YWRkciwgY2FjaGVfaW52X2RhdGEuZmQsCisgICAgICAgICBjYWNoZV9pbnZfZGF0YS5oYW5kbGUsIGNhY2hlX2ludl9kYXRhLmxlbmd0aCwKKyAgICAgICAgIG1lbV9pbmZvLT5tYWluX2lvbl9mZCk7CisgICAgaWYobWVtX2luZm8tPm1haW5faW9uX2ZkID4gMCkgeworICAgICAgICBpZihpb2N0bChtZW1faW5mby0+bWFpbl9pb25fZmQsIElPTl9JT0NfQ1VTVE9NLCAmY3VzdG9tX2RhdGEpIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYWNoZSBJbnZhbGlkYXRlIGZhaWxlZFxuIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiBnZXRfYnVmX2Zyb21fY2FtCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW50aW9ucyBnZXRzL2FjcXVpcmVzIDEgY2FwdHVyZSBidWZmZXIgZnJvbSB0aGUgY2FtZXJhCisgKiAgICAgICAgICAgICAgZHJpdmVyLiBUaGUgZmV0Y2hlZCBidWZmZXIgaXMgc3RvcmVkIGluIGN1ckNhcHR1cmVCdWYKKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogICBjYW1IYWwgICAgICAgICAgICAgIC0gY2FtZXJhIEhBTCBoYW5kbGUKKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogICAwICAgICAgTm8gZXJyb3IKKyAqICAgLTEgICAgIEVycm9yCisgKgorICogTm90ZXM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZ2V0X2J1Zl9mcm9tX2NhbShjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKQoreworICAgIGludCByYyA9IC0xOworCisgICAgQUxPR0QoIiVzOiBFIiwgX19mdW5jX18pOworICAgIHsKKyAgICAgICAgbWVtc2V0KCZjYW1IYWwtPmN1ckNhcHR1cmVCdWYsIDAsIHNpemVvZihjYW1IYWwtPmN1ckNhcHR1cmVCdWYpKTsKKworICAgICAgICBjYW1IYWwtPmN1ckNhcHR1cmVCdWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKyAgICAgICAgY2FtSGFsLT5jdXJDYXB0dXJlQnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisKKyAgICAgICAgaWYgKC0xID09IGlvY3RsTG9vcChjYW1IYWwtPmZkLCBWSURJT0NfRFFCVUYsICZjYW1IYWwtPmN1ckNhcHR1cmVCdWYpKXsKKyAgICAgICAgICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgICAgICAgIGNhc2UgRUFHQUlOOgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRUFHQUlOIGVycm9yIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgICAgICBjYXNlIEVJTzoKKyAgICAgICAgICAgIC8qIENvdWxkIGlnbm9yZSBFSU8sIHNlZSBzcGVjLiAqLworCisgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVklESU9DX0RRQlVGIGVycm9yIiwgX19mdW5jX18pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgQUxPR0QoIiVzOiBWSURJT0NfRFFCVUY6ICVkIHN1Y2Nlc3NmdWwsICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbUhhbC0+Y3VyQ2FwdHVyZUJ1Zi5pbmRleCwKKyAgICAgICAgICAgICAgICAgY2FtSGFsLT5jdXJDYXB0dXJlQnVmLmJ5dGVzdXNlZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHB1dF9idWZfdG9fY2FtCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW50aW9uIHB1dHMvcmVsZWFzZXMgMSBjYXB0dXJlIGJ1ZmZlciBiYWNrIHRvIHRoZSBjYW1lcmEKKyAqICAgICAgICAgICAgICBkcml2ZXIKKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogICBjYW1IYWwgICAgICAgICAgICAgIC0gY2FtZXJhIEhBTCBoYW5kbGUKKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogICAwICAgICAgTm8gZXJyb3IKKyAqICAgLTEgICAgIEVycm9yCisgKgorICogTm90ZXM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgcHV0X2J1Zl90b19jYW0oY2FtZXJhX2hhcmR3YXJlX3QgKmNhbUhhbCkKK3sKKyAgICBBTE9HRCgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICBjYW1IYWwtPmN1ckNhcHR1cmVCdWYudHlwZSAgICAgICAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgICAgY2FtSGFsLT5jdXJDYXB0dXJlQnVmLm1lbW9yeSAgICAgID0gVjRMMl9NRU1PUllfTU1BUDsKKworCisgICAgaWYgKC0xID09IGlvY3RsTG9vcChjYW1IYWwtPmZkLCBWSURJT0NfUUJVRiwgJmNhbUhhbC0+Y3VyQ2FwdHVyZUJ1ZikpCisgICAgeworICAgICAgICBBTE9HRSgiJXM6IFZJRElPQ19RQlVGIGZhaWxlZCAiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBBTE9HRCgiJXM6IFgiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiBwdXRfYnVmX3RvX2NhbQorICogRGVzY3JpcHRpb246IFRoaXMgZnVudGlvbiBnZXRzL2FjcXVpcmVzIDEgZGlzcGxheSBidWZmZXIgZnJvbSB0aGUgZGlzcGxheQorICogICAgICAgICAgICAgIHdpbmRvdworICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgY2FtSGFsICAgICAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICogIGJ1ZmZlcl9pZCAgICAgICAgICAgICAgIC0gQnVmZmVyIGlkIHBvaW50ZXIuIFRoZSBpZCBvZiBidWZmZXIgb2J0YWluZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyBmdW5jdGlvbiBpcyByZXR1cm5lZCBpbiB0aGlzIGFyZworICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIDAgICAgICBObyBlcnJvcgorICogICAtMSAgICAgRXJyb3IKKyAqCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBnZXRfYnVmX2Zyb21fZGlzcGxheShjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsLCBpbnQgKmJ1ZmZlcl9pZCkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBlcnIgPSAwOworICAgIHByZXZpZXdfc3RyZWFtX29wcyAgICAgICptUHJldmlld1dpbmRvdyA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgc3RyaWRlID0gMCwgY250ID0gMDsKKyAgICBidWZmZXJfaGFuZGxlX3QgICAgICAgICAqYnVmZmVyX2hhbmRsZSA9IE5VTEw7CisgICAgc3RydWN0IHByaXZhdGVfaGFuZGxlX3QgKnByaXZhdGVfYnVmZmVyX2hhbmRsZSA9IE5VTEw7CisKKyAgICBBTE9HRCgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICBpZiAoY2FtSGFsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1IYWwgPSBOVUxMIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbVByZXZpZXdXaW5kb3cgPSBjYW1IYWwtPndpbmRvdzsKKyAgICBpZiggbVByZXZpZXdXaW5kb3cgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IG1QcmV2aWV3V2luZG93ID0gTlVMTCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlcnIgPSBtUHJldmlld1dpbmRvdy0+ZGVxdWV1ZV9idWZmZXIobVByZXZpZXdXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpZGUpOworICAgIGlmKCFlcnIpIHsKKyAgICAgICAgQUxPR0QoIiVzOiBkZXF1ZXVlIGJ1ZiBidWZmZXJfaGFuZGxlOiAlcFxuIiwgX19mdW5jX18sIGJ1ZmZlcl9oYW5kbGUpOworCisgICAgICAgIEFMT0dEKCIlczogbVByZXZpZXdXaW5kb3ctPmxvY2tfYnVmZmVyOiAlcCIsCisgICAgICAgICAgICAgX19mdW5jX18sIG1QcmV2aWV3V2luZG93LT5sb2NrX2J1ZmZlcik7CisgICAgICAgIGlmKG1QcmV2aWV3V2luZG93LT5sb2NrX2J1ZmZlcikgeworICAgICAgICAgICAgZXJyID0gbVByZXZpZXdXaW5kb3ctPmxvY2tfYnVmZmVyKG1QcmV2aWV3V2luZG93LCBidWZmZXJfaGFuZGxlKTsKKyAgICAgICAgICAgIEFMT0dEKCIlczogbVByZXZpZXdXaW5kb3ctPmxvY2tfYnVmZmVyIHN1Y2Nlc3MiLCBfX2Z1bmNfXyk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIiVzOiBjYW1lcmEgY2FsbCBnZW5sb2NrX2xvY2ssIGhkbD0lcCIsCisgICAgICAgICAgICAgX19mdW5jX18sICgqYnVmZmVyX2hhbmRsZSkpOworCisgICAgICAgIGlmIChHRU5MT0NLX05PX0VSUk9SICE9CisgICAgICAgICAgICBnZW5sb2NrX2xvY2tfYnVmZmVyKChuYXRpdmVfaGFuZGxlX3QgKikoKmJ1ZmZlcl9oYW5kbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5MT0NLX1dSSVRFX0xPQ0ssIEdFTkxPQ0tfTUFYX1RJTUVPVVQpKSB7CisgICAgICAgICAgIEFMT0dFKCIlczogZ2VubG9ja19sb2NrX2J1ZmZlcihXUklURSkgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICBBTE9HRCgiJXM6IGdlbmxvY2tfbG9ja19idWZmZXIgaGRsID0lcCIsIF9fZnVuY19fLCAqYnVmZmVyX2hhbmRsZSk7CisgICAgICAgfQorCisgICAgICAgIHByaXZhdGVfYnVmZmVyX2hhbmRsZSA9IChzdHJ1Y3QgcHJpdmF0ZV9oYW5kbGVfdCAqKSgqYnVmZmVyX2hhbmRsZSk7CisKKyAgICAgICAgQUxPR0QoIiVzOiBmZCA9ICVkLCBzaXplID0gJWQsIG9mZnNldCA9ICVkLCBzdHJpZGUgPSAlZCIsCisgICAgICAgICAgICAgX19mdW5jX18sIHByaXZhdGVfYnVmZmVyX2hhbmRsZS0+ZmQsCisgICAgICAgIHByaXZhdGVfYnVmZmVyX2hhbmRsZS0+c2l6ZSwgcHJpdmF0ZV9idWZmZXJfaGFuZGxlLT5vZmZzZXQsIHN0cmlkZSk7CisKKyAgICAgICAgZm9yKGNudCA9IDA7IGNudCA8IGNhbUhhbC0+cHJldmlld01lbS5idWZmZXJfY291bnQgKyAyOyBjbnQrKykgeworICAgICAgICAgICAgaWYocHJpdmF0ZV9idWZmZXJfaGFuZGxlLT5mZCA9PQorICAgICAgICAgICAgICAgY2FtSGFsLT5wcmV2aWV3TWVtLnByaXZhdGVfYnVmZmVyX2hhbmRsZVtjbnRdLT5mZCkgeworICAgICAgICAgICAgICAgICpidWZmZXJfaWQgPSBjbnQ7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiBkZVF1ZXVlZCBmZCA9ICVkLCBpbmRleDogJWQiLAorICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHByaXZhdGVfYnVmZmVyX2hhbmRsZS0+ZmQsIGNudCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBBTE9HRSgiJXM6IGRlcXVldWUgYnVmIGZhaWxlZCBcbiIsIF9fZnVuY19fKTsKKworICAgIEFMT0dEKCIlczogWCIsIF9fZnVuY19fKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiBwdXRfYnVmX3RvX2Rpc3BsYXkKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bnRpb24gcHV0cy9lbnF1ZXVlcyAxIGJ1ZmZlciBiYWNrIHRvIHRoZSBkaXNwbGF5IHdpbmRvdworICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgY2FtSGFsICAgICAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICogIGJ1ZmZlcl9pZCAgICAgICAgICAgICAgIC0gaWQgb2YgdGhlIGJ1ZmZlciB0aGF0IG5lZWRzIHRvIGJlIGVucXVldWVkCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgMCAgICAgIE5vIGVycm9yCisgKiAgIC0xICAgICBFcnJvcgorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IHB1dF9idWZfdG9fZGlzcGxheShjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsLCBpbnQgYnVmZmVyX2lkKQoreworICAgIGludCBlcnIgPSAwOworICAgIHByZXZpZXdfc3RyZWFtX29wcyAgICAqbVByZXZpZXdXaW5kb3c7CisKKyAgICBBTE9HRCgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICBpZiAoY2FtSGFsID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1IYWwgPSBOVUxMIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbVByZXZpZXdXaW5kb3cgPSBjYW1IYWwtPndpbmRvdzsKKyAgICBpZiggbVByZXZpZXdXaW5kb3cgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IG1QcmV2aWV3V2luZG93ID0gTlVMTCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChHRU5MT0NLX0ZBSUxVUkUgPT0KKyAgICAgICAgZ2VubG9ja191bmxvY2tfYnVmZmVyKAorICAgICAgICAgICAgKG5hdGl2ZV9oYW5kbGVfdCAqKQorICAgICAgICAgICAgKCooY2FtSGFsLT5wcmV2aWV3TWVtLmJ1ZmZlcl9oYW5kbGVbYnVmZmVyX2lkXSkpKSkgeworICAgICAgIEFMT0dFKCIlczogZ2VubG9ja191bmxvY2tfYnVmZmVyIGZhaWxlZDogaGRsID0lcCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgKCooY2FtSGFsLT5wcmV2aWV3TWVtLmJ1ZmZlcl9oYW5kbGVbYnVmZmVyX2lkXSkpICk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFMT0dEKCIlczogZ2VubG9ja191bmxvY2tfYnVmZmVyIHN1Y2Nlc3M6IGhkbCA9JXAiLAorICAgICAgICAgICBfX2Z1bmNfXywgKCooY2FtSGFsLT5wcmV2aWV3TWVtLmJ1ZmZlcl9oYW5kbGVbYnVmZmVyX2lkXSkpICk7CisgICAgfQorCisgICAgLyogQ2FjaGUgY2xlYW4gdGhlIG91dHB1dCBidWZmZXIgc28gdGhhdCBjYWNoZSBpcyB3cml0dGVuIGJhY2sgKi8KKyAgICBjYWNoZV9vcHMoJmNhbUhhbC0+cHJldmlld01lbS5tZW1faW5mb1tidWZmZXJfaWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2FtSGFsLT5wcmV2aWV3TWVtLmNhbWVyYV9tZW1vcnlbYnVmZmVyX2lkXS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJT05fSU9DX0NMRUFOX0NBQ0hFUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICBjYWNoZV9vcHMoJmNhbUhhbC0+cHJldmlld01lbS5tZW1faW5mb1tidWZmZXJfaWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2FtSGFsLT5wcmV2aWV3TWVtLmNhbWVyYV9tZW1vcnlbYnVmZmVyX2lkXS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJT05fSU9DX0NMRUFOX0lOVl9DQUNIRVMpOworKi8KKyAgICBlcnIgPSBtUHJldmlld1dpbmRvdy0+ZW5xdWV1ZV9idWZmZXIobVByZXZpZXdXaW5kb3csCisgICAgICAoYnVmZmVyX2hhbmRsZV90ICopY2FtSGFsLT5wcmV2aWV3TWVtLmJ1ZmZlcl9oYW5kbGVbYnVmZmVyX2lkXSk7CisgICAgaWYoIWVycikgeworICAgICAgICBBTE9HRCgiJXM6IGVucXVldWUgYnVmIHN1Y2Nlc3NmdWw6ICVwXG4iLAorICAgICAgICAgICAgIF9fZnVuY19fLCBjYW1IYWwtPnByZXZpZXdNZW0uYnVmZmVyX2hhbmRsZVtidWZmZXJfaWRdKTsKKyAgICB9ZWxzZQorICAgICAgICBBTE9HRSgiJXM6IGVucXVldWUgYnVmIGZhaWxlZDogJXBcbiIsCisgICAgICAgICAgICAgX19mdW5jX18sIGNhbUhhbC0+cHJldmlld01lbS5idWZmZXJfaGFuZGxlW2J1ZmZlcl9pZF0pOworCisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworCisgICAgcmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IHB1dF9idWZfdG9fZGlzcGxheQorICogRGVzY3JpcHRpb246IFRoaXMgZnVudGlvbiB0cmFuc2ZlcnMgdGhlIGNvbnRlbnQgZnJvbSBjYXB0dXJlIGJ1ZmZlciB0bworICogICAgICAgICAgICAgIHByZWlldyBkaXNwbGF5IGJ1ZmZlciBhZnRlciBhcHByb3ByaWF0ZSBjb252ZXJzaW9uCisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICBjYW1IYWwgICAgICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKiAgYnVmZmVyX2lkICAgICAgICAgICAgICAgLSBpZCBvZiB0aGUgYnVmZmVyIHRoYXQgbmVlZHMgdG8gYmUgZW5xdWV1ZWQKKyAqCisgKiBSZXR1cm4gdmFsdWVzOgorICogICAwICAgICAgTm8gZXJyb3IKKyAqICAgLTEgICAgIEVycm9yCisgKgorICogTm90ZXM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgY29udmVydF9kYXRhX2ZybV9jYW1fdG9fZGlzcChjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsLCBpbnQgYnVmZmVyX2lkKQoreworICAgIGludCByYyA9IC0xOworCisgICAgaWYoIWNhbUhhbCkgeworICAgICAgICBBTE9HRSgiJXM6IGNhbUhhbCBpcyBOVUxMIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8qIElmIGlucHV0IGFuZCBvdXRwdXQgYXJlIHJhdyBmb3JtYXRzLCBidXQgZGlmZmVyZW50IGNvbG9yIGZvcm1hdCwgKi8KKyAgICAvKiBjYWxsIGNvbG9yIGNvbnZlcnNpb24gcm91dGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYoIChWNEwyX1BJWF9GTVRfWVVZViA9PSBjYW1IYWwtPmNhcHR1cmVGb3JtYXQpICYmCisgICAgICAgIChIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUCA9PSBjYW1IYWwtPmRpc3BGb3JtYXQpKQorICAgIHsKKyAgICAgICAgY29udmVydF9ZVVlWX3RvXzQyMF9OVjEyKAorICAgICAgICAgICAgKGNoYXIgKiljYW1IYWwtPmJ1ZmZlcnNbY2FtSGFsLT5jdXJDYXB0dXJlQnVmLmluZGV4XS5kYXRhLAorICAgICAgICAgICAgKGNoYXIgKiljYW1IYWwtPnByZXZpZXdNZW0uY2FtZXJhX21lbW9yeVtidWZmZXJfaWRdLT5kYXRhLAorICAgICAgICAgICAgY2FtSGFsLT5wcmV2V2lkdGgsCisgICAgICAgICAgICBjYW1IYWwtPnByZXZIZWlnaHQpOworICAgICAgICBBTE9HRCgiJXM6IENvcGllZCAlZCBieXRlcyBmcm9tIGNhbWVyYSBidWZmZXIgJWQgdG8gZGlzcGxheSBidWZmZXI6ICVkIiwKKyAgICAgICAgICAgICBfX2Z1bmNfXywgY2FtSGFsLT5jdXJDYXB0dXJlQnVmLmJ5dGVzdXNlZCwKKyAgICAgICAgICAgICBjYW1IYWwtPmN1ckNhcHR1cmVCdWYuaW5kZXgsIGJ1ZmZlcl9pZCk7CisgICAgICAgIHJjID0gMDsKKyAgICB9CisKKyAgICAvKiBJZiBjYW1lcmEgYnVmZmVyIGlzIE1KUEVHIGVuY29kZWQsIGNhbGwgbWpwZWcgZGVjb2RlIGNhbGwgKi8KKyAgICBpZihWNEwyX1BJWF9GTVRfTUpQRUcgPT0gY2FtSGFsLT5jYXB0dXJlRm9ybWF0KQorICAgIHsKKyAgICAgICAgaWYoTlVMTCA9PSBjYW1IYWwtPm1qcGVnZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmMgPSBtanBlZ0RlY29kZXJJbml0KCZjYW1IYWwtPm1qcGVnZCk7CisgICAgICAgICAgICBpZihyYyA8IDApCisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBtanBlZ0RlY29kZXJJbml0IEVycm9yOiAlZCIsIF9fZnVuY19fLCByYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYoY2FtSGFsLT5tanBlZ2QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gbWpwZWdEZWNvZGUoCisgICAgICAgICAgICAgICAgKHZvaWQqKWNhbUhhbC0+bWpwZWdkLAorICAgICAgICAgICAgICAgIChjaGFyICopY2FtSGFsLT5idWZmZXJzW2NhbUhhbC0+Y3VyQ2FwdHVyZUJ1Zi5pbmRleF0uZGF0YSwKKyAgICAgICAgICAgICAgICBjYW1IYWwtPmN1ckNhcHR1cmVCdWYuYnl0ZXN1c2VkLAorICAgICAgICAgICAgICAgIChjaGFyICopY2FtSGFsLT5wcmV2aWV3TWVtLmNhbWVyYV9tZW1vcnlbYnVmZmVyX2lkXS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAoY2hhciAqKWNhbUhhbC0+cHJldmlld01lbS5jYW1lcmFfbWVtb3J5W2J1ZmZlcl9pZF0tPmRhdGEgKworICAgICAgICAgICAgICAgICAgICBjYW1IYWwtPnByZXZXaWR0aCAqIGNhbUhhbC0+cHJldkhlaWdodCwKKyAgICAgICAgICAgICAgICBnZXRNanBlZ2RPdXRwdXRGb3JtYXQoY2FtSGFsLT5kaXNwRm9ybWF0KSk7CisgICAgICAgICAgICBpZihyYyA8IDApCisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBtanBlZ0RlY29kZSBFcnJvcjogJWQiLCBfX2Z1bmNfXywgcmMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IGxhdW5jaF9wcmV2aWV3X3RocmVhZAorICogRGVzY3JpcHRpb246IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHN0YXJ0IHByZXZpZXcgdGhyZWFkCisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICBjYW1IYWwgICAgICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgMCAgICAgIE5vIGVycm9yCisgKiAgIC0xICAgICBFcnJvcgorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGxhdW5jaF9wcmV2aWV3X3RocmVhZChjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsKQoreworICAgIEFMT0dEKCIlczogRSIsIF9fZnVuY19fKTsKKyAgICBpbnQgcmMgPSAwOworCisgICAgaWYoIWNhbUhhbCkgeworICAgICAgICBBTE9HRSgiJXM6IGNhbUhhbCBpcyBOVUxMIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CisgICAgcHRocmVhZF9jcmVhdGUoJmNhbUhhbC0+cHJldmlld1RocmVhZCwgJmF0dHIsIHByZXZpZXdsb29wLCBjYW1IYWwpOworCisgICAgQUxPR0QoIiVzOiBYIiwgX19mdW5jX18pOworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IGxhdW5jaF9wcmV2aWV3X3RocmVhZAorICogRGVzY3JpcHRpb246IFRoaXMgaXMgdGhyZWFkIGZ1bnRpb24gZm9yIHByZWl2ZXcgbG9vcAorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgaGNhbUhhbCAgICAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIDAgICAgICBObyBlcnJvcgorICogICAtMSAgICAgRXJyb3IKKyAqCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgKiBwcmV2aWV3bG9vcCh2b2lkICpoY2FtSGFsKQoreworICAgIGludCAgICAgICAgICAgICAgICAgcmM7CisgICAgaW50ICAgICAgICAgICAgICAgICBidWZmZXJfaWQgICA9IDA7CisgICAgcGlkX3QgICAgICAgICAgICAgICB0aWQgICAgICAgICA9IDA7CisgICAgY2FtZXJhX2hhcmR3YXJlX3QgICAqY2FtSGFsICAgICA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgICAgICBtc2dUeXBlICAgICA9IDA7CisgICAgY2FtZXJhX21lbW9yeV90ICAgICAqZGF0YSAgICAgICA9IE5VTEw7CisgICAgY2FtZXJhX2ZyYW1lX21ldGFkYXRhX3QgKm1ldGFkYXRhPSBOVUxMOworICAgIGNhbWVyYV9tZW1vcnlfdCAgICAgKnByZXZpZXdNZW0gPSBOVUxMOworCisgICAgY2FtSGFsID0gKGNhbWVyYV9oYXJkd2FyZV90ICopaGNhbUhhbDsKKyAgICBBTE9HRCgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICBpZighY2FtSGFsKSB7CisgICAgICAgIEFMT0dFKCIlczogY2FtSGFsIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBOVUxMIDsKKyAgICB9CisKKyAgICB0aWQgID0gZ2V0dGlkKCk7CisgICAgLyogVEJSOiBTZXQgYXBwcm9wcmlhdGUgdGhyZWFkIHByaW9yaXR5ICovCisgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KHRpZCwgQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpOworICAgIHByY3RsKFBSX1NFVF9OQU1FLCAodW5zaWduZWQgbG9uZykiQ2FtZXJhIEhBTCBwcmV2aWV3IHRocmVhZCIsIDAsIDAsIDApOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIFRpbWUgd2FpdCAoc2VsZWN0KSBvbiBjYW1lcmEgZmQgZm9yIGlucHV0IHJlYWQgYnVmZmVyICAgICAgICAgICAgICAqLworICAgIC8qIC0gQ2hlY2sgaWYgYW55IHByZXZpZXcgdGhyZWFkIGNvbW1hbmRzIGFyZSBzZXQuIElmIHNldCwgcHJvY2VzcyAgICAgICovCisgICAgLyogLSBEZXF1ZXVlIGRpc3BsYXkgYnVmZmVyIGZyb20gc3VyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtIERlcXVldWUgY2FwdHVyZSBidWZmZXIgZnJvbSBVU0IgY2FtZXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0gQ29udmVydCBjYXB0dXJlIGZvcm1hdCB0byBkaXNwbGF5IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBJZiBwcmV2aWV3IGZyYW1lcyBjYWxsYmFjayBpcyByZXF1ZXN0ZWQsIGNhbGxiYWNrIHdpdGggcHJ2dyBidWZmZXJzKi8KKyAgICAvKiAtIEVucXVldWUgZGlzcGxheSBidWZmZXIgYmFjayB0byBzdXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIC0gRW5xdWV1ZSBjYXB0dXJlIGJ1ZmZlciBiYWNrIHRvIFVTQiBjYW1lcmEgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB3aGlsZSgxKSB7CisgICAgICAgIGZkX3NldCBmZHM7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICBpbnQgciA9IDA7CisKKyAgICAgICAgRkRfWkVSTygmZmRzKTsKKyNpZiBDQVBUVVJFCisgICAgICAgIEZEX1NFVChjYW1IYWwtPmZkLCAmZmRzKTsKKyNlbmRpZiAvKiBDQVBUVVJFICovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gVGltZSB3YWl0IChzZWxlY3QpIG9uIGNhbWVyYSBmZCBmb3IgaW5wdXQgcmVhZCBidWZmZXIgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgdHYudHZfc2VjID0gMDsKKyAgICAgICAgdHYudHZfdXNlYyA9IDUwMDAwMDsKKworICAgICAgICBBTE9HRCgiJXM6IGI0IHNlbGVjdCBvbiBjYW1IYWwtPmZkICsgMSxmZDogJWQiLCBfX2Z1bmNfXywgY2FtSGFsLT5mZCk7CisjaWYgQ0FQVFVSRQorICAgICAgICByID0gc2VsZWN0KGNhbUhhbC0+ZmQgKyAxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdHYpOworI2Vsc2UKKyAgICAgICAgciA9IHNlbGVjdCgxLCBOVUxMLCBOVUxMLCBOVUxMLCAmdHYpOworI2VuZGlmIC8qIENBUFRVUkUgKi8KKyAgICAgICAgQUxPR0QoIiVzOiBhZnRlciBzZWxlY3QgOiAlZCIsIF9fZnVuY19fLCBjYW1IYWwtPmZkKTsKKworICAgICAgICBpZiAoLTEgPT0gcikgeworICAgICAgICAgICAgaWYgKEVJTlRSID09IGVycm5vKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgQUxPR0UoIiVzOiBGRFNlbGVjdCBlcnJvcjogJWQiLCBfX2Z1bmNfXywgZXJybm8pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKDAgPT0gcikgeworICAgICAgICAgICAgQUxPR0QoIiVzOiBzZWxlY3QgdGltZW91dFxuIiwgX19mdW5jX18pOworICAgICAgICB9CisKKyAgICAgICAgLyogUHJvdGVjdCB0aGUgY29udGV4dCBmb3Igb25lIGl0ZXJhdGlvbiBvZiBwcmV2aWV3IGxvb3AgKi8KKyAgICAgICAgLyogdGhpcyBnZXRzIHVubG9ja2VkIGF0IHRoZSBlbmQgb2YgdGhlIHdoaWxlICovCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhjYW1IYWwtPmxvY2spOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIENoZWNrIGlmIGFueSBwcmV2aWV3IHRocmVhZCBjb21tYW5kcyBhcmUgc2V0LiBJZiBzZXQsIHByb2Nlc3MgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIGlmKGNhbUhhbC0+cHJ2d0NtZFBlbmRpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNvbW1hbmQgaXMgc2VydmljZWQuIEhlbmNlIGNvbW1hbmQgcGVuZGluZyA9IDAgICovCisgICAgICAgICAgICBjYW1IYWwtPnBydndDbWRQZW5kaW5nLS07CisgICAgICAgICAgICAvL3NlbXBvc3QoYWNrKQorICAgICAgICAgICAgaWYoVVNCX0NBTV9QUkVWSUVXX0VYSVQgPT0gY2FtSGFsLT5wcnZ3Q21kKXsKKyAgICAgICAgICAgICAgICAvKiB1bmxvY2sgYmVmb3JlIGV4aXRpbmcgdGhlIHRocmVhZCAqLworICAgICAgICAgICAgICAgIGNhbUhhbC0+bG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgiJXM6IEV4aXRpbmcgY296IFVTQl9DQU1fUFJFVklFV19FWElUIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKTA7CisgICAgICAgICAgICB9ZWxzZSBpZihVU0JfQ0FNX1BSRVZJRVdfVEFLRVBJQyA9PSBjYW1IYWwtPnBydndDbWQpeworICAgICAgICAgICAgICAgIHJjID0gcHJ2d1RocmVhZFRha2VQaWN0dXJlSW50ZXJuYWwoY2FtSGFsKTsKKyAgICAgICAgICAgICAgICBpZihyYykKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBwcnZ3VGhyZWFkVGFrZVBpY3R1cmVJbnRlcm5hbCByZXR1cm5lZCBlcnJvciIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIE51bGwgY2hlY2sgb24gcHJldmlldyB3aW5kb3cuIElmIG51bGwsIHNsZWVwICovCisgICAgICAgIGlmKCFjYW1IYWwtPndpbmRvdykgeworICAgICAgICAgICAgQUxPR0QoIiVzOiBzbGVlcGluZyBjb3ogY2FtSGFsLT53aW5kb3cgPSBOVUxMIixfX2Z1bmNfXyk7CisgICAgICAgICAgICBjYW1IYWwtPmxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBzbGVlcCgyKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjaWYgRElTUExBWQorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogLSBEZXF1ZXVlIGRpc3BsYXkgYnVmZmVyIGZyb20gc3VyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBpZigwID09IGdldF9idWZfZnJvbV9kaXNwbGF5KGNhbUhhbCwgJmJ1ZmZlcl9pZCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCIlczogZ2V0X2J1Zl9mcm9tX2Rpc3BsYXkgc3VjY2VzczogJWQiLAorICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYnVmZmVyX2lkKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGdldF9idWZfZnJvbV9kaXNwbGF5IGZhaWxlZC4gU2tpcHBpbmcgdGhlIGxvb3AiLAorICAgICAgICAgICAgICAgICBfX2Z1bmNfXyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmCisKKyNpZiBDQVBUVVJFCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIERlcXVldWUgY2FwdHVyZSBidWZmZXIgZnJvbSBVU0IgY2FtZXJhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIGlmICgwID09IGdldF9idWZfZnJvbV9jYW0oY2FtSGFsKSkKKyAgICAgICAgICAgIEFMT0dEKCIlczogZ2V0X2J1Zl9mcm9tX2NhbSBzdWNjZXNzIiwgX19mdW5jX18pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBBTE9HRSgiJXM6IGdldF9idWZfZnJvbV9jYW0gZXJyb3IiLCBfX2Z1bmNfXyk7CisjZW5kaWYKKworI2lmIEZJTEVfRFVNUF9DQU1FUkEKKyAgICAgICAgLyogRGVidWcgY29kZSB0byBkdW1wIGZyYW1lcyBmcm9tIGNhbWVyYSAqLworICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgaW50IGZyYW1lX2NudCA9IDA7CisgICAgICAgICAgICAvKiBjdXJyZW50bHkgaGFyZGNvZGVkIGZvciBCeXRlcy1QZXItUGl4ZWwgPSAxLjUgKi8KKyAgICAgICAgICAgIGZpbGVEdW1wKCIvZGF0YS9VU0JjYW0ueXV2IiwKKyAgICAgICAgICAgIChjaGFyKiljYW1IYWwtPmJ1ZmZlcnNbY2FtSGFsLT5jdXJDYXB0dXJlQnVmLmluZGV4XS5kYXRhLAorICAgICAgICAgICAgY2FtSGFsLT5wcmV2V2lkdGggKiBjYW1IYWwtPnByZXZIZWlnaHQgKiAxLjUsCisgICAgICAgICAgICAmZnJhbWVfY250KTsKKyAgICAgICAgfQorI2VuZGlmCisKKyNpZiBNRU1TRVQKKyAgICAgICAgc3RhdGljIGludCBjb2xvciA9IDMwOworICAgICAgICBjb2xvciArPSA1MDsKKyAgICAgICAgaWYoY29sb3IgPiAyMDApIHsKKyAgICAgICAgICAgIGNvbG9yID0gMzA7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0UoIiVzOiBTZXR0aW5nIHRvIHRoZSBjb2xvcjogJWRcbiIsIF9fZnVuY19fLCBjb2xvcik7CisgICAgICAgIC8qIGN1cnJlbnRseSBoYXJkY29kZWQgZm9yIGZvcm1hdCBvZiB0eXBlIEJ5dGVzLVBlci1QaXhlbCA9IDEuNSAqLworICAgICAgICBtZW1zZXQoY2FtSGFsLT5wcmV2aWV3TWVtLmNhbWVyYV9tZW1vcnlbYnVmZmVyX2lkXS0+ZGF0YSwKKyAgICAgICAgICAgICAgIGNvbG9yLCBjYW1IYWwtPmRpc3BXaWR0aCAqIGNhbUhhbC0+ZGlzcEhlaWdodCAqIDEuNSArIDIgKiAxMDI0KTsKKyNlbHNlCisgICAgICAgIGNvbnZlcnRfZGF0YV9mcm1fY2FtX3RvX2Rpc3AoY2FtSGFsLCBidWZmZXJfaWQpOworICAgICAgICBBTE9HRCgiJXM6IENvcGllZCBkYXRhIHRvIGJ1ZmZlcl9pZDogJWQiLCBfX2Z1bmNfXywgYnVmZmVyX2lkKTsKKyNlbmRpZgorCisjaWYgRklMRV9EVU1QX0I0X0RJU1AKKyAgICAgICAgLyogRGVidWcgY29kZSB0byBkdW1wIGRpc3BsYXkgYnVmZmVycyAqLworICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgaW50IGZyYW1lX2NudCA9IDA7CisgICAgICAgICAgICAvKiBjdXJyZW50bHkgaGFyZGNvZGVkIGZvciBCeXRlcy1QZXItUGl4ZWwgPSAxLjUgKi8KKyAgICAgICAgICAgIGZpbGVEdW1wKCIvZGF0YS9kaXNwbGF5Lnl1diIsCisgICAgICAgICAgICAgICAgKGNoYXIqKSBjYW1IYWwtPnByZXZpZXdNZW0uY2FtZXJhX21lbW9yeVtidWZmZXJfaWRdLT5kYXRhLAorICAgICAgICAgICAgICAgIGNhbUhhbC0+ZGlzcFdpZHRoICogY2FtSGFsLT5kaXNwSGVpZ2h0ICogMS41LAorICAgICAgICAgICAgICAgICZmcmFtZV9jbnQpOworICAgICAgICAgICAgQUxPR0QoIiVzOiBXcml0dGVuIGJ1Zl9pbmRleDogJWQgIiwgX19mdW5jX18sIGJ1ZmZlcl9pZCk7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWYgRElTUExBWQorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogLSBFbnF1ZXVlIGRpc3BsYXkgYnVmZmVyIGJhY2sgdG8gc3VyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgIGlmKDAgPT0gcHV0X2J1Zl90b19kaXNwbGF5KGNhbUhhbCwgYnVmZmVyX2lkKSkgeworICAgICAgICAgICAgQUxPR0QoIiVzOiBwdXRfYnVmX3RvX2Rpc3BsYXkgc3VjY2VzczogJWQiLCBfX2Z1bmNfXywgYnVmZmVyX2lkKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBBTE9HRSgiJXM6IHB1dF9idWZfdG9fZGlzcGxheSBlcnJvciIsIF9fZnVuY19fKTsKKyNlbmRpZgorCisjaWYgQ0FQVFVSRQorICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gRW5xdWV1ZSBjYXB0dXJlIGJ1ZmZlciBiYWNrIHRvIFVTQiBjYW1lcmEgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICBpZigwID09IHB1dF9idWZfdG9fY2FtKGNhbUhhbCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCIlczogcHV0X2J1Zl90b19jYW0gc3VjY2VzcyIsIF9fZnVuY19fKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBBTE9HRSgiJXM6IHB1dF9idWZfdG9fY2FtIGVycm9yIiwgX19mdW5jX18pOworI2VuZGlmCisKKyNpZiBDQUxMX0JBQ0sKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gSWYgcHJldmlldyBmcmFtZXMgY2FsbGJhY2sgaXMgcmVxdWVzdGVkLCBjYWxsYmFjayB3aXRoIHBydncgYnVmZmVycyovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogVEJEOiBjaGFuZ2UgdGhlIDEuNSBoYXJkY29kaW5nIHRvIEJ5dGVzIFBlciBQaXhlbCAqLworICAgICAgICBpbnQgcHJldmlld0J1ZlNpemUgPSBjYW1IYWwtPnByZXZXaWR0aCAqIGNhbUhhbC0+cHJldkhlaWdodCAqIDEuNTsKKworICAgICAgICBtc2dUeXBlIHw9ICBDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUU7CisKKyAgICAgICAgaWYocHJldmlld0J1ZlNpemUgIT0KKyAgICAgICAgICAgIGNhbUhhbC0+cHJldmlld01lbS5wcml2YXRlX2J1ZmZlcl9oYW5kbGVbYnVmZmVyX2lkXS0+c2l6ZSkgeworCisgICAgICAgICAgICBwcmV2aWV3TWVtID0gY2FtSGFsLT5nZXRfbWVtb3J5KAorICAgICAgICAgICAgICAgIGNhbUhhbC0+cHJldmlld01lbS5wcml2YXRlX2J1ZmZlcl9oYW5kbGVbYnVmZmVyX2lkXS0+ZmQsCisgICAgICAgICAgICAgICAgcHJldmlld0J1ZlNpemUsCisgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICBjYW1IYWwtPmNiX2N0eHQpOworCisgICAgICAgICAgICAgIGlmICghcHJldmlld01lbSB8fCAhcHJldmlld01lbS0+ZGF0YSkgeworICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBnZXRfbWVtb3J5IGZhaWxlZC5cbiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIGRhdGEgPSBwcmV2aWV3TWVtOworICAgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiBHZXRNZW1vcnkgc3VjY2Vzc2Z1bC4gZGF0YSA9ICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGF0YSk7CisgICAgICAgICAgICAgICAgICBBTE9HRCgiJXM6IHByZXZpZXdCdWZTaXplID0gJWQsIHByaXZfYnVmX3NpemU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHByZXZpZXdCdWZTaXplLAorICAgICAgICAgICAgICAgICAgICBjYW1IYWwtPnByZXZpZXdNZW0ucHJpdmF0ZV9idWZmZXJfaGFuZGxlW2J1ZmZlcl9pZF0tPnNpemUpOworICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZXsKKyAgICAgICAgICAgIGRhdGEgPSAgIGNhbUhhbC0+cHJldmlld01lbS5jYW1lcmFfbWVtb3J5W2J1ZmZlcl9pZF07CisgICAgICAgICAgICBBTE9HRCgiJXM6IE5vIEdldE1lbW9yeSwgbm8gaW52YWxpZCBmbXQuIGRhdGEgPSAlcCwgaWR4PSVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGF0YSwgYnVmZmVyX2lkKTsKKyAgICAgICAgfQorICAgICAgICAvKiBVbmxvY2sgYW5kIGxvY2sgYXJvdW5kIHRoZSBjYWxsYmFjay4gKi8KKyAgICAgICAgLyogU29tZXRpbWVzICdkaXNhYmxlX21zZycgaXMgaXNzdWVkIGluIHRoZSBjYWxsYmFjayBjb250ZXh0LCAqLworICAgICAgICAvKiBsZWFkaW5nIHRvIGRlYWRsb2NrICovCisgICAgICAgIGNhbUhhbC0+bG9jay51bmxvY2soKTsKKyAgICAgICAgaWYoKGNhbUhhbC0+bXNnRW5hYmxlZEZsYWcgJiBDQU1FUkFfTVNHX1BSRVZJRVdfRlJBTUUpICYmCisgICAgICAgICAgICBjYW1IYWwtPmRhdGFfY2IpeworICAgICAgICAgICAgQUxPR0QoIiVzOiBiZWZvcmUgZGF0YSBjYWxsYmFjayIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGNhbUhhbC0+ZGF0YV9jYihtc2dUeXBlLCBkYXRhLCAwLG1ldGFkYXRhLCBjYW1IYWwtPmNiX2N0eHQpOworICAgICAgICAgICAgQUxPR0QoIiVzOiBhZnRlciBkYXRhIGNhbGxiYWNrOiAlcCIsIF9fZnVuY19fLCBjYW1IYWwtPmRhdGFfY2IpOworICAgICAgICB9CisgICAgICAgIGNhbUhhbC0+bG9jay5sb2NrKCk7CisgICAgICAgIGlmIChwcmV2aWV3TWVtKQorICAgICAgICAgICAgcHJldmlld01lbS0+cmVsZWFzZShwcmV2aWV3TWVtKTsKKyNlbmRpZgorCisgICAgfS8vd2hpbGUoMSkKKyAgICBBTE9HRCgiJXM6IFgiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuICh2b2lkICopMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IGdldF91dmNfZGV2aWNlCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBsb29wcyB0aHJvdWdoIC9kZXYvdmlkZW8gZW50cmllcyBhbmQgcHJvYmVzIHdpdGgKKyAqICAgICAgICAgICAgICBVVkNJT0MgcXVlcnkuIElmIHRoZSBkZXZpY2UgcmVzcG9uZHMgdG8gdGhlIHF1ZXJ5LCB0aGVuIGl0IGlzCisgKiAgICAgICAgICAgICAgZGV0ZWN0ZWQgYXMgVVZDIHdlYmNhbQorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICAgZGV2bmFtZSAgICAgICAgICAgICAtIFN0cmluZyBwb2ludGVyLiBUaGUgZnVuY3Rpb24gcmV0dXJuIGRldiBlbnRyeQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgaW4gdGhpcyBzdHJpbmcKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgICAgIDAgICBTdWNjZXNzCisgKiAgICAgIC0xICBFcnJvcgorICogTm90ZXM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZ2V0X3V2Y19kZXZpY2UoY2hhciAqZGV2bmFtZSkKK3sKKyAgICBjaGFyICAgIHRlbXBfZGV2bmFtZVtGSUxFTkFNRV9MRU5HVEhdOworICAgIEZJTEUgICAgKmZwID0gTlVMTDsKKyAgICBpbnQgICAgIGkgPSAwLCByZXQgPSAwLCBmZDsKKworICAgIEFMT0dEKCIlczogRSIsIF9fZnVuY19fKTsKKyNpZiAxCisgICAgc3RybmNweShkZXZuYW1lLCAiL2Rldi92aWRlbzEiLCBGSUxFTkFNRV9MRU5HVEgpOworCisvKgorICAgIHN0cnVjdCAgICAgICAgICBzdGF0IHN0OworCisgICAgc3RybmNweShkZXZfbmFtZSwgIi9kZXYvdmlkZW8xIiwgRklMRU5BTUVfTEVOR1RIKTsKKyAgICBpZiAoLTEgPT0gc3RhdChkZXZfbmFtZSwgJnN0KSkgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBpZGVudGlmeSAnJXMnOiAlZCwgJXNcbiIsCisgICAgICAgICAgICAgX19mdW5jX18sIGRldl9uYW1lLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9CisKKyAgICBpZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyBpcyBubyBkZXZpY2VcbiIsIF9fZnVuY19fLCBkZXZfbmFtZSk7CisgICAgICAgIHJjID0gLTE7CisgICAgfQorKi8KKworI2Vsc2UKKworICAgICpkZXZuYW1lID0gJ1wwJzsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gTGlzdCBhbGwgL2Rldi92aWRlbyogZW50cmllcyB0byBhIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBPcGVuIHRoZSB2aWRlbyBsaXN0IGZpbGUgYW5kIGxvb3AgdGhyb3VnaCB0aGUgbGlzdCAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtIFNlbmQgVVZDIHNwZWNpZmljIGNvbnRyb2wgcXVlcnkgYW5kIGNoZWNrIHRoZSByZXNwb25zZSAgICAgICAgICAgICAqLworICAgIC8qIC0gSWYgZGV2aWNlIHJlc3BvbmRzIHRvIHRoZSBxdWVyeSBhcyBzdWNjZXNzLCBkZXZpY2UgaXMgVVZDIHdlYmNhbSAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogLSBMaXN0IGFsbCAvZGV2L3ZpZGVvKiBlbnRyaWVzIHRvIGEgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIFRlbXBvcmFyaWx5IGNvbW1lbnRlZCBvdXQuIFRoaXMgbG9naWMgZG9lc250IHNlZW0gdG8gYmUgd29ya2luZyAqLworICAgIC8vc3lzdGVtKCJscyA+IC9kYXRhL3ZpZGVvX2Rldl9saXN0Iik7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gT3BlbiB0aGUgdmlkZW8gbGlzdCBmaWxlIGFuZCBsb29wIHRocm91Z2ggdGhlIGxpc3QgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIC8qIFRlbXBvcmFyaWx5IGNvbW1lbnRlZCBvdXQuIFRoaXMgbG9naWMgZG9lc250IHNlZW0gdG8gYmUgd29ya2luZyAqLworICAgIC8qCisgICAgZnAgPSBmb3BlbigiL2RhdGEvdmlkZW9fZGV2X2xpc3QiLCAicmIiKTsKKyAgICBpZighZnApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBpbiBvcGVuaW5nIC9kYXRhL3ZpZGVvX2Rldl9saXN0ICIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAqLworCisgICAgLyogVGVtcG9yYXJpbHkgY29tbWVudGVkIG91dC4gTG9vcGluZyBsb2dpYyBjaGFuZ2VkIGR1ZSB0byBpc3N1ZSBpbiAqLworICAgIC8qIGV4ZWN1dGluZyBzeXN0ZW0oImxzID4gL2RhdGEvdmlkZW9fZGV2X2xpc3QiKSAqLworICAgIC8vd2hpbGUoRU9GICE9IGZzY2FuZihmcCwgIiVzIiwgZGV2bmFtZSkpeworICAgIHdoaWxlKDEpeworICAgICAgICB1dmNfeHVfY29udHJvbF9xdWVyeSAgICB4cXJ5OworCisgICAgICAgIHNwcmludGYodGVtcF9kZXZuYW1lLCAiL2Rldi92aWRlbyVkIiwgaSk7CisgICAgICAgIEFMT0dEKCIlczogUHJvYmluZyAlcyBcbiIsIF9fZnVuY19fLCB0ZW1wX2Rldm5hbWUpOworCisgICAgICAgIGZkID0gb3Blbih0ZW1wX2Rldm5hbWUsIE9fUkRXUiAvKiByZXF1aXJlZCAqLyB8IE9fTk9OQkxPQ0ssIDApOworICAgICAgICBpZigtMSAhPSBmZCl7CisgICAgICAgICAgICBtZW1zZXQoJnhxcnksIDAsIHNpemVvZih1dmNfeHVfY29udHJvbF9xdWVyeSkpOworICAgICAgICAgICAgcmV0ID0gaW9jdGwoZmQsIFVWQ0lPQ19DVFJMX1FVRVJZLCAmeHFyeSk7CisgICAgICAgICAgICBBTE9HRCgiJXM6IFVWQ0lPQyByZXQ6ICVkLCBlcnJubzogJWQiLCBfX2Z1bmNfXywgcmV0LCBlcnJubyk7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIGlmIFVWQ0lPQyBpcyBleGVjdXRlZCBzdWNjZXNzZnVsbHksIHJldCA9IDAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogaWYgVVZDSU9DIGlzIGV4ZWN1dGVkIGJ1dCBDb250cm9sIFVuaXQgPSAwIGRvZXMgbm90IGV4aXN0LCAgICovCisgICAgICAgICAgICAvKiAgICAgIHJldCA9IC0xIGFuZCBlcnJubyA9IEVOT0VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIC8qIGlmIFVWQ0lPQyBkb2Vzbm90IGV4ZWN1dGUsIHJldCA9IC0xIGFuZCBlcnJubyA9IEVJTlZBTCAgICAgICAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBpZigoMCA9PSByZXQpIHx8IChyZXQgJiYgKEVOT0VOVCA9PSBlcnJubykpKXsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXM6IEZvdW5kIFVWQyBub2RlOiAlc1xuIiwgX19mdW5jX18sIHRlbXBfZGV2bmFtZSk7CisgICAgICAgICAgICAgICAgc3RybmNweShkZXZuYW1lLCB0ZW1wX2Rldm5hbWUsIEZJTEVOQU1FX0xFTkdUSCk7CisgICAgICAgICAgICAgICAgLyogRXhpdCB0aGUgbG9vcCBhdCB0aGUgZmlyc3QgVVZDIG5vZGUgZGV0ZWN0aW9uICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIH0KKyAgICAgICAgLyogVGVtcG9yYXJpbHkgbG9naWMgdG8gcHJvYmUgdmlkZW8wIHRvIHZpZGVvMTAgbm9kZXMgKi8KKyAgICAgICAgaWYoaSsrID4gMTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGZwKQorICAgICAgICAgICAgICAgIGZjbG9zZShmcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiAjaWYgMCAqLworICAgIEFMT0dEKCIlczogWCIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gMDsKK30gLyogZ2V0X3V2Y19kZXZpY2UgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IGZpbGVEdW1wCisgKiBEZXNjcmlwdGlvbjogVGhpcyBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gdG8gZHVtcCBidWZmZXJzIGludG8gYSBmaWxlCisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICBmbiAgICAgICAgICAgICAgLSBGaWxlIG5hbWUgc3RyaW5nCisgKiAgZGF0YSAgICAgICAgICAgIC0gcG9pbnRlciB0byBjaGFyYWN0ZXIgYnVmZmVyIHRoYXQgbmVlZHMgdG8gYmUgZHVtcGVkCisgKiAgbGVuZ3RoICAgICAgICAgIC0gTGVuZ3RoIG9mIHRoZSBidWZmZXIgdG8gYmUgZHVtcGVkCisgKiAgZnJtX2NudCAgICAgICAgIC0gUG9pbnRlciB0byBmcmFtZSBjb3VudC4gVGhpcyBjb3VudCBpcyBpbmNyZW1lbnRlZCBieSB0aGlzCisgKiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBvbiBzdWNjZXNzZnVsIGZpbGUgd3JpdGUKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgICAgIDAgICBTdWNjZXNzCisgKiAgICAgIC0xICBFcnJvcgorICogTm90ZXM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZmlsZUR1bXAoY29uc3QgY2hhciogZm4sIGNoYXIqIGRhdGEsIGludCBsZW5ndGgsIGludCogZnJtX2NudCkKK3sKKworICAgIEZJTEUgKmZwID0gTlVMTDsKKyAgICBpZiAoMCA9PSAqZnJtX2NudCkgeworICAgICAgICBmcCA9IGZvcGVuKGZuLCAid2IiKTsKKyAgICAgICAgaWYgKE5VTEwgPT0gZnApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW4gb3BlbmluZyAlcyIsIF9fZnVuY19fLCBmbik7CisgICAgICAgIH0KKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICB9CisgICAgZnAgPSBmb3BlbihmbiwgImFiIik7CisgICAgaWYgKE5VTEwgPT0gZnApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBpbiBvcGVuaW5nICVzIiwgX19mdW5jX18sIGZuKTsKKyAgICB9CisgICAgZndyaXRlKGRhdGEsIDEsIGxlbmd0aCwgZnApOworICAgIGZjbG9zZShmcCk7CisgICAgKCpmcm1fY250KSsrOworICAgIEFMT0dEKCIlczogV3JpdHRlbiAlZCBieXRlcyBmb3IgZnJhbWU6JWQsIGluICVzIiwKKyAgICAgICAgX19mdW5jX18sIGxlbmd0aCwgKmZybV9jbnQsIGZuKTsKKworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogbGF1bmNoVGFrZVBpY3R1cmVUaHJlYWQKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0byBzdGFydCB0YWtlIHBpY3R1cmUgdGhyZWFkCisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICBjYW1IYWwgICAgICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgMCAgICAgIE5vIGVycm9yCisgKiAgIC0xICAgICBFcnJvcgorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGxhdW5jaFRha2VQaWN0dXJlVGhyZWFkKGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWwpCit7CisgICAgQUxPR0QoIiVzOiBFIiwgX19mdW5jX18pOworICAgIGludCByYyA9IDA7CisKKyAgICBpZighY2FtSGFsKSB7CisgICAgICAgIEFMT0dFKCIlczogY2FtSGFsIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICAvKiBjcmVhdGUgdGhlIHRocmVhZCBpbiBkZXRhdGNoZWQgc3RhdGUsIHdoZW4gdGhlIHRocmVhZCBleGl0cyBhbGwgKi8KKyAgICAvKiBtZW1vcnkgcmVzb3VyY2VzIGFyZSBmcmVlZCB1cCAqLworICAgIHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmYXR0ciwgUFRIUkVBRF9DUkVBVEVfREVUQUNIRUQpOworICAgIHB0aHJlYWRfY3JlYXRlKCZjYW1IYWwtPnRha2VQaWN0dXJlVGhyZWFkLCAmYXR0ciwgdGFrZVBpY3R1cmVUaHJlYWQsIGNhbUhhbCk7CisKKyAgICBBTE9HRCgiJXM6IFgiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogdGFrZVBpY3R1cmVUaHJlYWQKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0YWtlIHBpY3R1cmUgdGhyZWFkCisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICBjYW1IYWwgICAgICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgMCAgICAgIE5vIGVycm9yCisgKiAgIC0xICAgICBFcnJvcgorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCAqIHRha2VQaWN0dXJlVGhyZWFkKHZvaWQgKmhjYW1IYWwpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICBidWZmZXJfaWQgICA9IDA7CisgICAgcGlkX3QgICAgICAgICAgICAgICB0aWQgICAgICAgICA9IDA7CisgICAgY2FtZXJhX2hhcmR3YXJlX3QgICAqY2FtSGFsICAgICA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgICAgICBtc2dUeXBlICAgICA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICBqcGVnTGVuZ3RoICA9IDA7CisgICAgUUNhbWVyYUhhbE1lbUluZm9fdCAqbWVtX2luZm8gICA9IE5VTEw7CisKKyAgICBjYW1IYWwgPSAoY2FtZXJhX2hhcmR3YXJlX3QgKiloY2FtSGFsOworICAgIEFMT0dJKCIlczogRSIsIF9fZnVuY19fKTsKKworICAgIGlmKCFjYW1IYWwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1IYWwgaXMgTlVMTCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5VTEwgOworICAgIH0KKworICAgIHRpZCAgPSBnZXR0aWQoKTsKKyAgICAvKiBUQlI6IFNldCBhcHByb3ByaWF0ZSB0aHJlYWQgcHJpb3JpdHkgKi8KKyAgICBhbmRyb2lkU2V0VGhyZWFkUHJpb3JpdHkodGlkLCBBTkRST0lEX1BSSU9SSVRZX05PUk1BTCk7CisgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJDYW1lcmEgSEFMIHByZXZpZXcgdGhyZWFkIiwgMCwgMCwgMCk7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gSWYgcmVxdWVzdGVkIGZvciBzaHV0dGVyIG5vdGZpY2F0aW9uLCBub3RpZnkgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBJbml0aWFsaXplIFVTQiBjYW1lcmEgd2l0aCBzbmFwc2hvdCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtIFRpbWUgd2FpdCAoc2VsZWN0KSBvbiBjYW1lcmEgZmQgZm9yIGNhbWVyYSBmcmFtZSBhdmFpbGFiaWxpdHkgICAgICAqLworICAgIC8qIC0gRGVxdWV1ZSBjYXB0dXJlIGJ1ZmZlciBmcm9tIFVTQiBjYW1lcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBTZW5kIGNhcHR1cmUgYnVmZmVyIHRvIEpQRUcgZW5jb2RlciBmb3IgSlBFRyBjb21wcmVzc2lvbiAgICAgICAgICAgKi8KKyAgICAvKiAtIElmIGpwZWcgZnJhbWVzIGNhbGxiYWNrIGlzIHJlcXVlc3RlZCwgY2FsbGJhY2sgd2l0aCBqcGVnIGJ1ZmZlcnMgICAqLworICAgIC8qIC0gRW5xdWV1ZSBjYXB0dXJlIGJ1ZmZlciBiYWNrIHRvIFVTQiBjYW1lcmEgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogLSBGcmVlIFVTQiBjYW1lcmEgcmVzb3VyY2VzIGFuZCBjbG9zZSBjYW1lcmEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAtIElmIHByZXZpZXcgd2FzIHN0b3BwZWQgZm9yIHRha2luZyBwaWN0dXJlLCByZXN0YXJ0IHRoZSBwcmV2aWV3ICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soY2FtSGFsLT5sb2NrKTsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gSWYgcmVxdWVzdGVkIGZvciBzaHV0dGVyIG5vdGZpY2F0aW9uLCBub3RpZnkgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAwIC8qIFRCRDogVGVtcG9yYXJpbHkgY29tbWVudGVkIG91dCBkdWUgdG8gYW4gaXNzdWUuIFNvbWV0aW1lcyBpdCB0YWtlcyAqLworICAgIC8qIGxvbmcgdGltZSB0byBnZXQgYmFjayB0aGUgbG9jayBvbmNlIHVubG9ja2VkIGFuZCBub3RpZnkgY2FsbGJhY2sgKi8KKyAgICBpZiAoY2FtSGFsLT5tc2dFbmFibGVkRmxhZyAmIENBTUVSQV9NU0dfU0hVVFRFUil7CisgICAgICAgIGNhbUhhbC0+bG9jay51bmxvY2soKTsKKyAgICAgICAgY2FtSGFsLT5ub3RpZnlfY2IoQ0FNRVJBX01TR19TSFVUVEVSLCAwLCAwLCBjYW1IYWwtPmNiX2N0eHQpOworICAgICAgICBjYW1IYWwtPmxvY2subG9jaygpOworICAgIH0KKyNlbmRpZgorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogLSBJbml0aWFsaXplIFVTQiBjYW1lcmEgd2l0aCBzbmFwc2hvdCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIFVTQl9DQU1fT1BFTihjYW1IYWwpOworCisjaWYgSlBFR19PTl9VU0JfQ0FNRVJBCisgICAgcmMgPSBpbml0VXNiQ2FtZXJhKGNhbUhhbCwgY2FtSGFsLT5waWN0V2lkdGgsIGNhbUhhbC0+cGljdEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfUElYX0ZNVF9NSlBFRyk7CisjZWxzZQorICAgIHJjID0gaW5pdFVzYkNhbWVyYShjYW1IYWwsIGNhbUhhbC0+cGljdFdpZHRoLCBjYW1IYWwtPnBpY3RIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1BJWF9GTVRfWVVZVik7CisjZW5kaWYKKyAgICBFUlJPUl9DSEVDS19FWElUX1RIUkVBRChyYywgImluaXRVc2JDYW1lcmEiKTsKKworICAgIHJjID0gc3RhcnRVc2JDYW1DYXB0dXJlKGNhbUhhbCk7CisgICAgRVJST1JfQ0hFQ0tfRVhJVF9USFJFQUQocmMsICJzdGFydFVzYkNhbUNhcHR1cmUiKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogLSBUaW1lIHdhaXQgKHNlbGVjdCkgb24gY2FtZXJhIGZkIGZvciBjYW1lcmEgZnJhbWUgYXZhaWxhYmlsaXR5ICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHsKKyAgICAgICAgZmRfc2V0IGZkczsKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgICAgIGludCByID0gMDsKKworICAgICAgICBGRF9aRVJPKCZmZHMpOworICAgICAgICBGRF9TRVQoY2FtSGFsLT5mZCwgJmZkcyk7CisKKyAgICAgICAgdHYudHZfc2VjID0gMTsKKyAgICAgICAgdHYudHZfdXNlYyA9IDA7CisKKyAgICAgICAgZG97CisgICAgICAgICAgICBBTE9HRCgiJXM6IGI0IHNlbGVjdCBvbiBjYW1IYWwtPmZkIDogJWQiLCBfX2Z1bmNfXywgY2FtSGFsLT5mZCk7CisgICAgICAgICAgICByID0gc2VsZWN0KGNhbUhhbC0+ZmQgKyAxLCAmZmRzLCBOVUxMLCBOVUxMLCAmdHYpOworICAgICAgICAgICAgQUxPR0QoIiVzOiBhZnRlciBzZWxlY3QiLCBfX2Z1bmNfXyk7CisgICAgICAgIH13aGlsZSgoMCA9PSByKSB8fCAoKC0xID09IHIpICYmIChFSU5UUiA9PSBlcnJubykpKTsKKworICAgICAgICBpZiAoKC0xID09IHIpICYmIChFSU5UUiAhPSBlcnJubykpeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGRFNlbGVjdCByZXQgPSAlZCBlcnJvcjogJWQiLCBfX2Z1bmNfXywgciwgZXJybm8pOworICAgICAgICAgICAgcmV0dXJuICh2b2lkICopLTE7CisgICAgICAgIH0KKworICAgIH0KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gRGVxdWV1ZSBjYXB0dXJlIGJ1ZmZlciBmcm9tIFVTQiBjYW1lcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoMCA9PSBnZXRfYnVmX2Zyb21fY2FtKGNhbUhhbCkpCisgICAgICAgIEFMT0dEKCIlczogZ2V0X2J1Zl9mcm9tX2NhbSBzdWNjZXNzIiwgX19mdW5jX18pOworICAgIGVsc2UKKyAgICAgICAgQUxPR0UoIiVzOiBnZXRfYnVmX2Zyb21fY2FtIGVycm9yIiwgX19mdW5jX18pOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIFNlbmQgY2FwdHVyZSBidWZmZXIgdG8gSlBFRyBlbmNvZGVyIGZvciBKUEVHIGNvbXByZXNzaW9uICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgbWVtX2luZm8gPSAmY2FtSGFsLT5waWN0TWVtLm1lbV9pbmZvWzBdOworICAgIG1lbV9pbmZvLT5zaXplID0gTUFYX0pQRUdfQlVGRkVSX1NJWkU7CisKKyAgICByYyA9IGFsbG9jYXRlX2lvbl9tZW1vcnkobWVtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAoKDB4MSA8PCBDQU1FUkFfWlNMX0lPTl9IRUFQX0lEKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoMHgxIDw8IENBTUVSQV9aU0xfSU9OX0ZBTExCQUNLX0hFQVBfSUQpKSk7CisgICAgaWYocmMpCisgICAgICAgIEFMT0dFKCIlczogSU9OIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIsIF9fZnVuY19fKTsKKworICAgIGNhbUhhbC0+cGljdE1lbS5jYW1lcmFfbWVtb3J5WzBdID0gY2FtSGFsLT5nZXRfbWVtb3J5KAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtX2luZm8tPmZkLCBtZW1faW5mby0+c2l6ZSwgMSwgY2FtSGFsLT5jYl9jdHh0KTsKKyAgICBpZighY2FtSGFsLT5waWN0TWVtLmNhbWVyYV9tZW1vcnlbMF0pCisgICAgICAgIEFMT0dFKCIlczogZ2V0X21lbSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisKKyNpZiBGUkVBRF9KUEVHX1BJQ1RVUkUKKyAgICBqcGVnTGVuZ3RoID0gcmVhZEZyb21GaWxlKCIvZGF0YS90ZW1wVkdBLmpwZWciLAorICAgICAgICAgICAgICAgICAgICAoY2hhciopY2FtSGFsLT5waWN0TWVtLmNhbWVyYV9tZW1vcnlbMF0tPmRhdGEsCisgICAgICAgICAgICAgICAgICAgIGNhbUhhbC0+cGljdE1lbS5jYW1lcmFfbWVtb3J5WzBdLT5zaXplKTsKKyAgICBjYW1IYWwtPnBpY3RNZW0uY2FtZXJhX21lbW9yeVswXS0+c2l6ZSA9IGpwZWdMZW5ndGg7CisKKyNlbGlmIEpQRUdfT05fVVNCX0NBTUVSQQorICAgIG1lbWNweSgoY2hhciopY2FtSGFsLT5waWN0TWVtLmNhbWVyYV9tZW1vcnlbMF0tPmRhdGEsCisgICAgICAgICAgICAoY2hhciAqKWNhbUhhbC0+YnVmZmVyc1tjYW1IYWwtPmN1ckNhcHR1cmVCdWYuaW5kZXhdLmRhdGEsCisgICAgICAgICAgICBjYW1IYWwtPmN1ckNhcHR1cmVCdWYuYnl0ZXN1c2VkKTsKKyAgICBjYW1IYWwtPnBpY3RNZW0uY2FtZXJhX21lbW9yeVswXS0+c2l6ZSA9IGNhbUhhbC0+Y3VyQ2FwdHVyZUJ1Zi5ieXRlc3VzZWQ7CisgICAganBlZ0xlbmd0aCA9IGNhbUhhbC0+Y3VyQ2FwdHVyZUJ1Zi5ieXRlc3VzZWQ7CisKKyNlbHNlCisgICAgcmMgPSBlbmNvZGVKcGVnKGNhbUhhbCk7CisgICAgRVJST1JfQ0hFQ0tfRVhJVF9USFJFQUQocmMsICJqcGVnX2VuY29kZSIpOworI2VuZGlmCisgICAgaWYoanBlZ0xlbmd0aCA8PSAwKQorICAgICAgICBBTE9HSSgiJXM6IGpwZWdMZW5ndGggOiAlZCIsIF9fZnVuY19fLCBqcGVnTGVuZ3RoKTsKKworICAgICBBTE9HRCgiJXM6IGpwZWdMZW5ndGggOiAlZCIsIF9fZnVuY19fLCBqcGVnTGVuZ3RoKTsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gSWYganBlZyBmcmFtZXMgY2FsbGJhY2sgaXMgcmVxdWVzdGVkLCBjYWxsYmFjayB3aXRoIGpwZWcgYnVmZmVycyAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBUQkQ6IENBTUVSQV9NU0dfUkFXX0lNQUdFIGRhdGEgY2FsbCBiYWNrICovCisKKyAgICBpZiAoKGNhbUhhbC0+bXNnRW5hYmxlZEZsYWcgJiBDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UpICYmCisgICAgICAgICAgICAoY2FtSGFsLT5kYXRhX2NiKSl7CisgICAgICAgIC8qIFVubG9jayB0ZW1wb3JhcmlseSwgY2FsbGJhY2sgbWlnaHQgY2FsbCBIQUwgYXBpIGluIHR1cm4gKi8KKyAgICAgICAgY2FtSGFsLT5sb2NrLnVubG9jaygpOworCisgICAgICAgIGNhbUhhbC0+ZGF0YV9jYihDQU1FUkFfTVNHX0NPTVBSRVNTRURfSU1BR0UsCisgICAgICAgICAgICAgICAgICAgICAgICBjYW1IYWwtPnBpY3RNZW0uY2FtZXJhX21lbW9yeVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIGNhbUhhbC0+Y2JfY3R4dCk7CisgICAgICAgIGNhbUhhbC0+bG9jay5sb2NrKCk7CisgICAgfQorCisgICAgLyogcmVsZWFzZSBoZWFwIG1lbW9yeSBhZnRlciB0aGUgY2FsbCBiYWNrICovCisgICAgaWYoY2FtSGFsLT5waWN0TWVtLmNhbWVyYV9tZW1vcnlbMF0pCisgICAgICAgIGNhbUhhbC0+cGljdE1lbS5jYW1lcmFfbWVtb3J5WzBdLT5yZWxlYXNlKAorICAgICAgICAgICAgY2FtSGFsLT5waWN0TWVtLmNhbWVyYV9tZW1vcnlbMF0pOworCisgICAgcmMgPSBkZWFsbG9jYXRlX2lvbl9tZW1vcnkobWVtX2luZm8pOworICAgIGlmKHJjKQorICAgICAgICBBTE9HRSgiJXM6IElPTiBtZW1vcnkgZGUtYWxsb2NhdGlvbiBmYWlsZWQiLCBfX2Z1bmNfXyk7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gRW5xdWV1ZSBjYXB0dXJlIGJ1ZmZlciBiYWNrIHRvIFVTQiBjYW1lcmEgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZigwID09IHB1dF9idWZfdG9fY2FtKGNhbUhhbCkpIHsKKyAgICAgICAgQUxPR0QoIiVzOiBwdXRfYnVmX3RvX2NhbSBzdWNjZXNzIiwgX19mdW5jX18pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIEFMT0dFKCIlczogcHV0X2J1Zl90b19jYW0gZXJyb3IiLCBfX2Z1bmNfXyk7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gRnJlZSBVU0IgY2FtZXJhIHJlc291cmNlcyBhbmQgY2xvc2UgY2FtZXJhICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICByYyA9IHN0b3BVc2JDYW1DYXB0dXJlKGNhbUhhbCk7CisgICAgRVJST1JfQ0hFQ0tfRVhJVF9USFJFQUQocmMsICJzdG9wVXNiQ2FtQ2FwdHVyZSIpOworCisgICAgcmMgPSB1bkluaXRWNEwybW1hcChjYW1IYWwpOworICAgIEVSUk9SX0NIRUNLX0VYSVRfVEhSRUFEKHJjLCAidW5Jbml0VjRMMm1tYXAiKTsKKworICAgIFVTQl9DQU1fQ0xPU0UoY2FtSGFsKTsKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gSWYgcHJldmlldyB3YXMgc3RvcHBlZCBmb3IgdGFraW5nIHBpY3R1cmUsIHJlc3RhcnQgdGhlIHByZXZpZXcgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZihjYW1IYWwtPnBydndTdG9wcGVkRm9yUGljdHVyZSkKKyAgICB7CisgICAgICAgIHN0cnVjdCBjYW1lcmFfZGV2aWNlICAgIGRldmljZTsKKyAgICAgICAgZGV2aWNlLnByaXYgPSAodm9pZCAqKWNhbUhhbDsKKworICAgICAgICBVU0JfQ0FNX09QRU4oY2FtSGFsKTsKKyAgICAgICAgLyogVW5sb2NrIHRlbXBvcmFyaWx5IGNveiB1c2JjYW1fc3RhcnRfcHJldmlldyBoYXMgYSBsb2NrICovCisgICAgICAgIGNhbUhhbC0+bG9jay51bmxvY2soKTsKKyAgICAgICAgcmMgPSB1c2JjYW1fc3RhcnRfcHJldmlldygmZGV2aWNlKTsKKyAgICAgICAgaWYocmMpCisgICAgICAgICAgICBBTE9HRSgiJXM6IHN0YXJ0X3ByZXZpZXcgZXJyb3IgYWZ0ZXIgdGFrZSBwaWN0dXJlIiwgX19mdW5jX18pOworICAgICAgICBjYW1IYWwtPmxvY2subG9jaygpOworICAgICAgICBjYW1IYWwtPnBydndTdG9wcGVkRm9yUGljdHVyZSA9IDA7CisgICAgfQorCisgICAgLyogdGFrZSBwaWN0dXJlIGFjdGl2aXR5IGlzIGRvbmUgKi8KKyAgICBjYW1IYWwtPnRha2VQaWN0SW5Qcm9ncmVzcyA9IDA7CisKKyAgICBBTE9HSSgiJXM6IFgiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuICh2b2lkICopMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IGFsbG9jYXRlX2lvbl9tZW1vcnkKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIGFsbG9jYXRlcyBJT04gbWVtb3J5CisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICBjYW1IYWwgICAgICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgMCAgICAgIE5vIGVycm9yCisgKiAgIC0xICAgICBFcnJvcgorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGFsbG9jYXRlX2lvbl9tZW1vcnkoUUNhbWVyYUhhbE1lbUluZm9fdCAqbWVtX2luZm8sIGludCBpb25fdHlwZSkKK3sKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAwOworICAgIHN0cnVjdCBpb25faGFuZGxlX2RhdGEgICAgICBoYW5kbGVfZGF0YTsKKyAgICBzdHJ1Y3QgaW9uX2FsbG9jYXRpb25fZGF0YSAgYWxsb2M7CisgICAgc3RydWN0IGlvbl9mZF9kYXRhICAgICAgICAgIGlvbl9pbmZvX2ZkOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtYWluX2lvbl9mZCA9IDA7CisKKyAgICBtYWluX2lvbl9mZCA9IG9wZW4oIi9kZXYvaW9uIiwgT19SRE9OTFkpOworICAgIGlmIChtYWluX2lvbl9mZCA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJJb24gZGV2IG9wZW4gZmFpbGVkICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBnb3RvIElPTl9PUEVOX0ZBSUxFRDsKKyAgICB9CisKKyAgICBtZW1zZXQoJmFsbG9jLCAwLCBzaXplb2YoYWxsb2MpKTsKKyAgICBhbGxvYy5sZW4gPSBtZW1faW5mby0+c2l6ZTsKKyAgICAvKiB0byBtYWtlIGl0IHBhZ2Ugc2l6ZSBhbGlnbmVkICovCisgICAgYWxsb2MubGVuID0gKGFsbG9jLmxlbiArIDQwOTUpICYgKH40MDk1KTsKKyAgICBhbGxvYy5hbGlnbiA9IDQwOTY7CisgICAgYWxsb2MuZmxhZ3MgPSBJT05fRkxBR19DQUNIRUQ7CisgICAgYWxsb2MuaGVhcF9pZF9tYXNrID0gaW9uX3R5cGU7CisgICAgcmMgPSBpb2N0bChtYWluX2lvbl9mZCwgSU9OX0lPQ19BTExPQywgJmFsbG9jKTsKKyAgICBpZiAocmMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJJT04gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIElPTl9BTExPQ19GQUlMRUQ7CisgICAgfQorCisgICAgbWVtc2V0KCZpb25faW5mb19mZCwgMCwgc2l6ZW9mKGlvbl9pbmZvX2ZkKSk7CisgICAgaW9uX2luZm9fZmQuaGFuZGxlID0gYWxsb2MuaGFuZGxlOworICAgIHJjID0gaW9jdGwobWFpbl9pb25fZmQsIElPTl9JT0NfU0hBUkUsICZpb25faW5mb19mZCk7CisgICAgaWYgKHJjIDwgMCkgeworICAgICAgICBBTE9HRSgiSU9OIG1hcCBmYWlsZWQgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGdvdG8gSU9OX01BUF9GQUlMRUQ7CisgICAgfQorCisgICAgbWVtX2luZm8tPm1haW5faW9uX2ZkID0gbWFpbl9pb25fZmQ7CisgICAgbWVtX2luZm8tPmZkID0gaW9uX2luZm9fZmQuZmQ7CisgICAgbWVtX2luZm8tPmhhbmRsZSA9IGlvbl9pbmZvX2ZkLmhhbmRsZTsKKyAgICBtZW1faW5mby0+c2l6ZSA9IGFsbG9jLmxlbjsKKyAgICByZXR1cm4gMDsKKworSU9OX01BUF9GQUlMRUQ6CisgICAgbWVtc2V0KCZoYW5kbGVfZGF0YSwgMCwgc2l6ZW9mKGhhbmRsZV9kYXRhKSk7CisgICAgaGFuZGxlX2RhdGEuaGFuZGxlID0gaW9uX2luZm9fZmQuaGFuZGxlOworICAgIGlvY3RsKG1haW5faW9uX2ZkLCBJT05fSU9DX0ZSRUUsICZoYW5kbGVfZGF0YSk7CitJT05fQUxMT0NfRkFJTEVEOgorICAgIGNsb3NlKG1haW5faW9uX2ZkKTsKK0lPTl9PUEVOX0ZBSUxFRDoKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiBkZWFsbG9jYXRlX2lvbl9tZW1vcnkKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGRlIGFsbG9jYXRlcyBJT04gbWVtb3J5CisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICBjYW1IYWwgICAgICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgMCAgICAgIE5vIGVycm9yCisgKiAgIC0xICAgICBFcnJvcgorICoKKyAqIE5vdGVzOiBub25lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGRlYWxsb2NhdGVfaW9uX21lbW9yeShRQ2FtZXJhSGFsTWVtSW5mb190ICptZW1faW5mbykKK3sKKyAgc3RydWN0IGlvbl9oYW5kbGVfZGF0YSBoYW5kbGVfZGF0YTsKKyAgaW50IHJjID0gMDsKKworICBpZiAobWVtX2luZm8tPmZkID4gMCkgeworICAgICAgY2xvc2UobWVtX2luZm8tPmZkKTsKKyAgICAgIG1lbV9pbmZvLT5mZCA9IDA7CisgIH0KKworICBpZiAobWVtX2luZm8tPm1haW5faW9uX2ZkID4gMCkgeworICAgICAgbWVtc2V0KCZoYW5kbGVfZGF0YSwgMCwgc2l6ZW9mKGhhbmRsZV9kYXRhKSk7CisgICAgICBoYW5kbGVfZGF0YS5oYW5kbGUgPSBtZW1faW5mby0+aGFuZGxlOworICAgICAgaW9jdGwobWVtX2luZm8tPm1haW5faW9uX2ZkLCBJT05fSU9DX0ZSRUUsICZoYW5kbGVfZGF0YSk7CisgICAgICBjbG9zZShtZW1faW5mby0+bWFpbl9pb25fZmQpOworICAgICAgbWVtX2luZm8tPm1haW5faW9uX2ZkID0gMDsKKyAgfQorICByZXR1cm4gcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZ1bmN0aW9uOiByZWFkRnJvbUZpbGUKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gZmlsZSBpbnRvIGdpdmVuIGJ1ZmZlcgorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgY2FtSGFsICAgICAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIGludCAgICBieXRlc1JlYWQKKyAqCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCByZWFkRnJvbUZpbGUoY2hhciogZmlsZU5hbWUsIGNoYXIqIGJ1ZmZlciwgaW50IGJ1ZmZlclNpemUpCit7CisgICAgaW50IGJ5dGVzUmVhZCA9IDAsIGZpbGVTaXplID0gMDsKKyAgICBGSUxFICpmcDsKKworICAgIGZwID0gZm9wZW4oZmlsZU5hbWUsICJyYiIpOworICAgIGlmKCFmcCl7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW4gb3BlbmluZyAlcyAiLCBfX2Z1bmNfXywgZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gYnl0ZXNSZWFkOworICAgIH0KKworICAgIC8qIElmIGZpbGUgaXMgYmlnZ2VyIGZvciBnaXZlbiBidWZmZXIsIGV4aXQgKi8KKyAgICBpZiAoZmlsZVNpemUgPiBidWZmZXJTaXplKXsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciAlZCA+ICVkIiwgX19mdW5jX18sIGZpbGVTaXplLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIGJ5dGVzUmVhZDsKKyAgICB9CisKKyAgICBieXRlc1JlYWQgPSBmcmVhZChidWZmZXIsIDEsIGJ1ZmZlclNpemUsIGZwKTsKKyAgICBBTE9HRCgiICVzOiBieXRlc1JlYWQ6ICVkIiwgX19mdW5jX18sIGJ5dGVzUmVhZCk7CisKKyAgICByZXR1cm4gYnl0ZXNSZWFkOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogZW5jb2RlSnBlZworICogRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgSnBlZyBlbmNvZGVyIGFuZCBjYWxscyBqcGVnIGVuY29kZXIKKyAqICAgICAgICAgICAgICBjYWxsIGFuZCB3YWl0cyBmb3IgdGhlIGVuY29kZSB0byBjb21wbGV0ZQorICoKKyAqIElucHV0IHBhcmFtZXRlcnM6CisgKiAgY2FtSGFsICAgICAgICAgICAgICAgICAgLSBjYW1lcmEgSEFMIGhhbmRsZQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgIDAgIE5vIEVycm9yCisgKiAgLTEgIEVycm9yCisgKgorICogTm90ZXM6IG5vbmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBlbmNvZGVKcGVnKGNhbWVyYV9oYXJkd2FyZV90ICpjYW1IYWwpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgbW1fanBlZ19vcHNfdCAgICAgICBtbUpwZWdPcHM7CisgICAgaW50ICAgICAgICAgICAgICAgICBqcGVnRW5jSGRsICA9IDA7CisgICAgbW1fanBlZ19qb2IgICAgICAgICBtbUpwZWdKb2I7CisgICAgc3JjX2ltYWdlX2J1ZmZlcl9pbmZvICAgKnNyY0J1ZiA9IE5VTEw7CisgICAgUUNhbWVyYUhhbE1lbUluZm9fdCBqcGVnSW5NZW1JbmZvOworICAgIGNhbWVyYV9tZW1vcnlfdCogICAganBlZ0luTWVtOworICAgIHVpbnQzMl90ICAgICAgICAgICAgam9iSWQ7CisKKyAgICBBTE9HSSgiJXM6IEUiLCBfX2Z1bmNfXyk7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gQWxsb2NhdGUgSnBlZyBpbnB1dCBidWZmZXIgZnJvbSBJT04gbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBqcGVnSW5NZW1JbmZvLnNpemUgPSBjYW1IYWwtPnBpY3RXaWR0aCAqIGNhbUhhbC0+cGljdEhlaWdodCAqIDI7CisgICAgcmMgPSBhbGxvY2F0ZV9pb25fbWVtb3J5KCZqcGVnSW5NZW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgKCgweDEgPDwgQ0FNRVJBX1pTTF9JT05fSEVBUF9JRCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgKDB4MSA8PCBDQU1FUkFfWlNMX0lPTl9GQUxMQkFDS19IRUFQX0lEKSkpOworICAgIEVSUk9SX0NIRUNLX0VYSVQocmMsICJhbGxvY2F0ZV9pb25fbWVtb3J5Iik7CisKKyAgICBqcGVnSW5NZW0gPSBjYW1IYWwtPmdldF9tZW1vcnkoCisgICAgICAgICAgICAgICAgICAgICAgICBqcGVnSW5NZW1JbmZvLmZkLCBqcGVnSW5NZW1JbmZvLnNpemUsIDEsIGNhbUhhbC0+Y2JfY3R4dCk7CisgICAgaWYoIWpwZWdJbk1lbSl7CisgICAgICAgIEFMT0dFKCIlczogZ2V0X21lbSBmYWlsZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByYyA9IGNvbnZlcnRfWVVZVl90b180MjBfTlYxMigKKyAgICAgICAgKGNoYXIgKiljYW1IYWwtPmJ1ZmZlcnNbY2FtSGFsLT5jdXJDYXB0dXJlQnVmLmluZGV4XS5kYXRhLAorICAgICAgICAoY2hhciAqKWpwZWdJbk1lbS0+ZGF0YSwgY2FtSGFsLT5waWN0V2lkdGgsIGNhbUhhbC0+cGljdEhlaWdodCk7CisgICAgRVJST1JfQ0hFQ0tfRVhJVChyYywgImNvbnZlcnRfWVVZVl90b180MjBfTlYxMiIpOworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogLSBQb3B1bGF0ZSBKUEVHIGVuY29kaW5nIHBhcmFtZXRlcnMgZnJvbSB0aGUgY2FtSGFsIGNvbnRleHQgICAgICAgICAgKi8KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIG1lbXNldCgmbW1KcGVnSm9iLCAwLCBzaXplb2YobW1KcGVnSm9iKSk7CisKKyAgICBtbUpwZWdKb2Iuam9iX3R5cGUgICAgICAgICAgICAgID0gSlBFR19KT0JfVFlQRV9FTkNPREU7CisgICAgbW1KcGVnSm9iLmVuY29kZV9qb2IuanBlZ19jYiAgICA9IGpwZWdFbmNvZGVDYjsKKyAgICBtbUpwZWdKb2IuZW5jb2RlX2pvYi51c2VyZGF0YSAgID0gKHZvaWQgKiljYW1IYWw7CisgICAgLyogVEJEOiBSb3RhdGlvbiB0byBiZSBzZXQgZnJvbSBzZXR0aW5ncyBzZW50IGZyb20gYXBwICovCisgICAgbW1KcGVnSm9iLmVuY29kZV9qb2IuZW5jb2RlX3Bhcm0ucm90YXRpb24gICAgICAgICAgID0gMDsKKyAgICBtbUpwZWdKb2IuZW5jb2RlX2pvYi5lbmNvZGVfcGFybS5leGlmX251bUVudHJpZXMgICAgPSAwOworICAgIG1tSnBlZ0pvYi5lbmNvZGVfam9iLmVuY29kZV9wYXJtLmV4aWZfZGF0YSAgICAgICAgICA9IE5VTEw7CisKKyAgICAvKiBUQkQ6IEFkZCB0aHVtYm5haWwgc3VwcG9ydCAqLworICAgIG1tSnBlZ0pvYi5lbmNvZGVfam9iLmVuY29kZV9wYXJtLmJ1Zl9pbmZvLnNyY19pbWdzLnNyY19pbWdfbnVtID0gMTsKKyAgICBtbUpwZWdKb2IuZW5jb2RlX2pvYi5lbmNvZGVfcGFybS5idWZfaW5mby5zcmNfaW1ncy5pc192aWRlb19mcmFtZSA9IDA7CisKKyAgICAvKiBGaWxsIG1haW4gaW1hZ2UgaW5mb3JtYXRpb24gKi8KKyAgICBzcmNCdWYgPSAmbW1KcGVnSm9iLmVuY29kZV9qb2IuZW5jb2RlX3Bhcm0uYnVmX2luZm8uc3JjX2ltZ3Muc3JjX2ltZ1swXTsKKyAgICBzcmNCdWYtPnR5cGUgICAgICAgICAgICAgICAgPSBKUEVHX1NSQ19JTUFHRV9UWVBFX01BSU47CisgICAgc3JjQnVmLT5pbWdfZm10ICAgICAgICAgICAgID0gSlBFR19TUkNfSU1BR0VfRk1UX1lVVjsKKyAgICAvKiBUQkQ6IGNvbnZlcnQgZnJvbSBZVVlWIHRvIENSQ0JIMlYyICovCisgICAgc3JjQnVmLT5jb2xvcl9mb3JtYXQgICAgICAgID0gTU1fSlBFR19DT0xPUl9GT1JNQVRfWUNSQ0JMUF9IMlYyOworICAgIHNyY0J1Zi0+bnVtX2J1ZnMgICAgICAgICAgICA9IDE7CisgICAgc3JjQnVmLT5zcmNfaW1hZ2VbMF0uZmQgICAgICAgID0ganBlZ0luTWVtSW5mby5mZDsKKyAgICBzcmNCdWYtPnNyY19pbWFnZVswXS5idWZfdmFkZHIgPSAodWludDhfdCopanBlZ0luTWVtLT5kYXRhOworICAgIC8vc3JjQnVmLT5zcmNfaW1hZ2VbMF0ub2Zmc2V0ICAgID0gMDsKKyAgICBzcmNCdWYtPnNyY19kaW0ud2lkdGggICAgICAgPSBjYW1IYWwtPnBpY3RXaWR0aDsKKyAgICBzcmNCdWYtPnNyY19kaW0uaGVpZ2h0ICAgICAgPSBjYW1IYWwtPnBpY3RIZWlnaHQ7CisgICAgc3JjQnVmLT5vdXRfZGltLndpZHRoICAgICAgID0gY2FtSGFsLT5waWN0V2lkdGg7CisgICAgc3JjQnVmLT5vdXRfZGltLmhlaWdodCAgICAgID0gY2FtSGFsLT5waWN0SGVpZ2h0OworICAgIHNyY0J1Zi0+Y3JvcC5vZmZzZXRfeCAgICAgICA9IDA7CisgICAgc3JjQnVmLT5jcm9wLm9mZnNldF95ICAgICAgID0gMDsKKyAgICBzcmNCdWYtPmNyb3Aud2lkdGggICAgICAgICAgPSBzcmNCdWYtPnNyY19kaW0ud2lkdGg7CisgICAgc3JjQnVmLT5jcm9wLmhlaWdodCAgICAgICAgID0gc3JjQnVmLT5zcmNfZGltLmhlaWdodDsKKyAgICBzcmNCdWYtPnF1YWxpdHkgICAgICAgICAgICAgPSBjYW1IYWwtPnBpY3RKcGVnUWx0eTsKKworICAgIC8qIFRCRDpGaWxsIHRodW1ibmFpbCBpbWFnZSBpbmZvcm1hdGlvbiAqLworCisgICAgLyogRmlsbCBvdXQgYnVmIGluZm9ybWF0aW9uICovCisgICAgbW1KcGVnSm9iLmVuY29kZV9qb2IuZW5jb2RlX3Bhcm0uYnVmX2luZm8uc2lua19pbWcuYnVmX3ZhZGRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopY2FtSGFsLT5waWN0TWVtLmNhbWVyYV9tZW1vcnlbMF0tPmRhdGE7CisgICAgbW1KcGVnSm9iLmVuY29kZV9qb2IuZW5jb2RlX3Bhcm0uYnVmX2luZm8uc2lua19pbWcuZmQgPSAwOworICAgIC8qIFRCRDogaGFyZCBjb2RlZCBmb3IgMS41IGJ5dGVzIHBlciBwaXhlbCAqLworICAgIG1tSnBlZ0pvYi5lbmNvZGVfam9iLmVuY29kZV9wYXJtLmJ1Zl9pbmZvLnNpbmtfaW1nLmJ1Zl9sZW4gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbUhhbC0+cGljdFdpZHRoICogY2FtSGFsLT5waWN0SGVpZ2h0ICogMS41OworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIEluaXRpYWxpemUganBlZyBlbmNvZGVyIGFuZCBjYWxsIEpwZWcgZW5jb2RlciBzdGFydCAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgbWVtc2V0KCZtbUpwZWdPcHMsIDAsIHNpemVvZihtbV9qcGVnX29wc190KSk7CisgICAganBlZ0VuY0hkbCA9IGpwZWdfb3BlbigmbW1KcGVnT3BzKTsKKyAgICBpZighanBlZ0VuY0hkbCl7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIG9wZW4gSnBlZyBFbmNvZGVyIGluc3RhbmNlIiwgX19mdW5jX18pOworICAgIH1lbHNlCisgICAgICAgIEFMT0dEKCIlczoganBlZ0VuY0hkbCA9ICVkIiwgX19mdW5jX18sIGpwZWdFbmNIZGwpOworCisgICAgY2FtSGFsLT5qcGVnRW5jSW5Qcm9ncmVzcyA9IDE7CisgICAgcmMgPSBtbUpwZWdPcHMuc3RhcnRfam9iKGpwZWdFbmNIZGwsICZtbUpwZWdKb2IsICZqb2JJZCk7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIC0gV2FpdCBmb3IgSlBFRyBlbmNvZGVyIHRvIGNvbXBsZXRlIGVuY29kaW5nICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBwdGhyZWFkX211dGV4X2luaXQoJmNhbUhhbC0+anBlZ0VuY011dGV4LCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmY2FtSGFsLT5qcGVnRW5jQ29uZCwgTlVMTCk7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmNhbUhhbC0+anBlZ0VuY011dGV4KTsKKyAgICB3aGlsZShjYW1IYWwtPmpwZWdFbmNJblByb2dyZXNzKQorICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmY2FtSGFsLT5qcGVnRW5jQ29uZCwgJmNhbUhhbC0+anBlZ0VuY011dGV4KTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY2FtSGFsLT5qcGVnRW5jTXV0ZXgpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAtIERlLWFsbG9jYXRlIEpwZWcgaW5wdXQgYnVmZmVyIGZyb20gSU9OIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYoanBlZ0luTWVtKQorICAgICAgICBqcGVnSW5NZW0tPnJlbGVhc2UoanBlZ0luTWVtKTsKKworICAgIHJjID0gZGVhbGxvY2F0ZV9pb25fbWVtb3J5KCZqcGVnSW5NZW1JbmZvKTsKKyAgICBpZihyYykKKyAgICAgICAgQUxPR0UoIiVzOiBJT04gbWVtb3J5IGRlLWFsbG9jYXRpb24gZmFpbGVkIiwgX19mdW5jX18pOworCisgICAgQUxPR0koIiVzOiBYIHJjID0gJWQiLCBfX2Z1bmNfXywgcmMpOworICAgIHJldHVybiByYzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246IGpwZWdFbmNvZGVDYgorICogRGVzY3JpcHRpb246IFRoaXMgaXMgYSBjYWxsIGJhY2sgZnVuY3Rpb24gcmVnaXN0ZXJlZCB3aXRoIEpQRUcgZW5jb2Rlci4KKyAqICAgICAgICAgICAgICBKcGVnIGVuY29kZXIgY2FsbHMgdGhpcyBmdW5jdGlvbiBvbiBjb21wbGV0aW9uIG9mIGVuY29kaW5nCisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqICBjYW1IYWwgICAgICAgICAgICAgICAgICAtIGNhbWVyYSBIQUwgaGFuZGxlCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqICAgMCAgTm8gRXJyb3IKKyAqICAtMSAgRXJyb3IKKyAqCisgKiBOb3Rlczogbm9uZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBqcGVnRW5jb2RlQ2IgICAoanBlZ19qb2Jfc3RhdHVzX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHRodW1ibmFpbERyb3BwZWRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjbGllbnRfaGRsLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBqb2JJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEpCit7CisgICAgaW50IHJjID0gMDsKKyAgICBjYW1lcmFfaGFyZHdhcmVfdCAqY2FtSGFsID0gTlVMTDsKKworICAgIEFMT0dJKCIlczogRSBzdGF0dXMgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworCisgICAgY2FtSGFsID0gKGNhbWVyYV9oYXJkd2FyZV90KikgdXNlckRhdGE7CisKKyAgICBpZihKUEVHX0pPQl9TVEFUVVNfRE9ORSA9PSBzdGF0dXMpeworICAgICAgICBBTE9HRCgiJXM6IEpQRUcgZW5jb2RlIHN1Y2Nlc3NmdWwuIG91dF9kYXRhOiVwLCBzaXplOiAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgb3V0X2RhdGEsIGRhdGFfc2l6ZSk7CisgICAgICAgIGNhbUhhbC0+anBlZ0VuY0luUHJvZ3Jlc3MgPSAwOworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY2FtSGFsLT5qcGVnRW5jTXV0ZXgpOworICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmNhbUhhbC0+anBlZ0VuY0NvbmQpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjYW1IYWwtPmpwZWdFbmNNdXRleCk7CisKKyAgICBBTE9HSSgiJXM6IFgiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQK